From cc9ce62161862b64b3e698cae683d30be05187a3 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 28 Apr 2024 03:12:16 +0100 Subject: [PATCH 01/38] Start on font selection Loads fonts from registry --- trview.app/Application.cpp | 10 +++ trview.app/Application.h | 1 + trview.app/Settings/FontSetting.h | 13 ++++ trview.app/Settings/UserSettings.h | 2 + trview.app/UI/DX11ImGuiBackend.cpp | 7 +++ trview.app/UI/DX11ImGuiBackend.h | 1 + trview.app/UI/IImGuiBackend.h | 1 + trview.app/UI/ISettingsWindow.h | 2 + trview.app/UI/IViewerUI.h | 2 + trview.app/UI/SettingsWindow.cpp | 89 +++++++++++++++++++++++++++ trview.app/UI/SettingsWindow.h | 1 + trview.app/UI/ViewerUI.cpp | 6 ++ trview.app/Windows/IViewer.h | 2 + trview.app/Windows/Viewer.cpp | 1 + trview.app/trview.app.vcxproj | 1 + trview.app/trview.app.vcxproj.filters | 3 + 16 files changed, 142 insertions(+) create mode 100644 trview.app/Settings/FontSetting.h diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index ef92f5990..b2e14e3ac 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -278,6 +278,8 @@ namespace trview _level->set_map_colours(settings.map_colours); } }; + _token_store += _viewer->on_font += [this](auto&& font) { _new_font = font; }; + _viewer->set_settings(_settings); auto filename = startup_options.filename(); @@ -691,6 +693,14 @@ namespace trview _viewer->render(); + if (_new_font.has_value()) + { + ImGuiIO& io = ImGui::GetIO(); + _font = io.Fonts->AddFontFromFileTTF((std::format("{}\\{}", _files->fonts_directory(), _new_font.value().filename)).c_str(), _new_font.value().size); + _new_font.reset(); + _imgui_backend->rebuild_fonts(); + } + _imgui_backend->new_frame(); ImGui::NewFrame(); diff --git a/trview.app/Application.h b/trview.app/Application.h index 9a59a94b0..4febb7179 100644 --- a/trview.app/Application.h +++ b/trview.app/Application.h @@ -167,6 +167,7 @@ namespace trview std::unique_ptr _lights_windows; Timer _timer; ImFont* _font; + std::optional _new_font; std::unique_ptr _imgui_backend; std::string _imgui_ini_filename; diff --git a/trview.app/Settings/FontSetting.h b/trview.app/Settings/FontSetting.h new file mode 100644 index 000000000..dbf630bc4 --- /dev/null +++ b/trview.app/Settings/FontSetting.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace trview +{ + struct FontSetting final + { + std::string name; + std::string filename; + float size; + }; +} \ No newline at end of file diff --git a/trview.app/Settings/UserSettings.h b/trview.app/Settings/UserSettings.h index 77adb5cee..90c466825 100644 --- a/trview.app/Settings/UserSettings.h +++ b/trview.app/Settings/UserSettings.h @@ -4,6 +4,7 @@ #include #include "RandomizerSettings.h" #include "../UI/MapColours.h" +#include "FontSetting.h" namespace trview { @@ -57,6 +58,7 @@ namespace trview float fov{ 45 }; std::vector plugin_directories; std::unordered_map toggles; + FontSetting font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; bool operator==(const UserSettings& other) const; }; diff --git a/trview.app/UI/DX11ImGuiBackend.cpp b/trview.app/UI/DX11ImGuiBackend.cpp index 818d13c74..6a0cbdae1 100644 --- a/trview.app/UI/DX11ImGuiBackend.cpp +++ b/trview.app/UI/DX11ImGuiBackend.cpp @@ -34,6 +34,13 @@ namespace trview ImGui_ImplWin32_NewFrame(); } + void DX11ImGuiBackend::rebuild_fonts() + { + auto& io = ImGui::GetIO(); + io.Fonts->Build(); + ImGui_ImplDX11_InvalidateDeviceObjects(); + } + void DX11ImGuiBackend::render() { ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); diff --git a/trview.app/UI/DX11ImGuiBackend.h b/trview.app/UI/DX11ImGuiBackend.h index 56ef4cc35..511cc2e9f 100644 --- a/trview.app/UI/DX11ImGuiBackend.h +++ b/trview.app/UI/DX11ImGuiBackend.h @@ -14,6 +14,7 @@ namespace trview void initialise() override; bool is_setup() const override; void new_frame() override; + void rebuild_fonts() override; void render() override; void reset_layout() override; void shutdown() override; diff --git a/trview.app/UI/IImGuiBackend.h b/trview.app/UI/IImGuiBackend.h index 01253c50a..ffbb44fc8 100644 --- a/trview.app/UI/IImGuiBackend.h +++ b/trview.app/UI/IImGuiBackend.h @@ -8,6 +8,7 @@ namespace trview virtual void initialise() = 0; virtual bool is_setup() const = 0; virtual void new_frame() = 0; + virtual void rebuild_fonts() = 0; virtual void render() = 0; virtual void reset_layout() = 0; virtual void shutdown() = 0; diff --git a/trview.app/UI/ISettingsWindow.h b/trview.app/UI/ISettingsWindow.h index 42a0bb57c..9a2952b41 100644 --- a/trview.app/UI/ISettingsWindow.h +++ b/trview.app/UI/ISettingsWindow.h @@ -2,6 +2,7 @@ #include #include "../UI/MapColours.h" +#include "../Settings/FontSetting.h" namespace trview { @@ -79,6 +80,7 @@ namespace trview Event on_camera_fov; Event on_camera_sink_startup; Event> on_plugin_directories; + Event on_font; virtual void render() = 0; /// diff --git a/trview.app/UI/IViewerUI.h b/trview.app/UI/IViewerUI.h index 521ad15d9..ef3a60a63 100644 --- a/trview.app/UI/IViewerUI.h +++ b/trview.app/UI/IViewerUI.h @@ -106,6 +106,8 @@ namespace trview Event> on_select_trigger; + Event on_font; + /// Render the UI. virtual void render() = 0; diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index f3dbe0587..54f66a176 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -1,7 +1,75 @@ #include "SettingsWindow.h" +#include namespace trview { + namespace + { + std::vector get_ye_fonts() + { + std::vector available_fonts; + + HKEY key = nullptr; + if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_READ, &key)) + { + wchar_t class_name[255]; + DWORD class_name_length = 255; + DWORD number_of_subkeys = 0; + DWORD max_subkey_length = 0; + DWORD max_class_length = 0; + DWORD value_count = 0; + DWORD max_value_length = 0; + DWORD max_data_length = 0; + DWORD security_descriptor = 0; + FILETIME last_write_time; + + std::vector value(16383, 0); + DWORD value_length = 16383; + + LRESULT result = RegQueryInfoKey(key, + class_name, + &class_name_length, + nullptr, + &number_of_subkeys, + &max_subkey_length, + &max_class_length, + &value_count, + &max_value_length, + &max_data_length, + &security_descriptor, + &last_write_time); + + for (uint32_t i = 0; i < value_count; ++i) + { + value_length = 16383; + value[0] = '\0'; + + DWORD data_length = 0; + result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, NULL, &data_length); + + value_length = 16383; + + std::vector data_value(data_length, 0); + result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, &data_value[0], &data_length); + + wchar_t* value_string = reinterpret_cast(&data_value[0]); + if (value_string && std::wstring(value_string).ends_with(L".ttf")) + { + available_fonts.push_back( + { + .name = to_utf8(&value[0]), + .filename = to_utf8(value_string) + }); + } + } + } + + RegCloseKey(key); + + return available_fonts; + } + } + ISettingsWindow::~ISettingsWindow() { } @@ -51,6 +119,27 @@ namespace trview { on_background_colour(Colour(1.0f, _colour[0], _colour[1], _colour[2])); } + + if (ImGui::BeginCombo("Font", _selected_font.name.c_str())) + { + for (const auto& f : get_ye_fonts()) + { + bool is_selected = _selected_font.name == f.name; + if (ImGui::Selectable(f.name.c_str(), is_selected)) + { + _selected_font.name = f.name; + _selected_font.filename = f.filename; + on_font(_selected_font); + } + } + ImGui::EndCombo(); + } + + if (ImGui::InputFloat("Font Size", &_selected_font.size, 1.0f, 0.0f, "%.3f", ImGuiInputTextFlags_EnterReturnsTrue)) + { + on_font(_selected_font); + } + ImGui::EndTabItem(); } diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index 0eba7a94b..971c276bd 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -94,5 +94,6 @@ namespace trview float _fov{ 45 }; bool _camera_sink_startup{ false }; std::vector _plugin_directories; + FontSetting _selected_font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; }; } diff --git a/trview.app/UI/ViewerUI.cpp b/trview.app/UI/ViewerUI.cpp index 95f7d7812..61b2ca416 100644 --- a/trview.app/UI/ViewerUI.cpp +++ b/trview.app/UI/ViewerUI.cpp @@ -152,6 +152,12 @@ namespace trview forward_setting(_settings_window->on_camera_fov, _settings.fov); forward_setting(_settings_window->on_camera_sink_startup, _settings.camera_sink_startup); forward_setting(_settings_window->on_plugin_directories, _settings.plugin_directories); + _token_store += _settings_window->on_font += [this](auto&& font) + { + _settings.font = font; + on_settings(_settings); + on_font(font); + }; _camera_position = std::make_unique(); _camera_position->on_position_changed += on_camera_position; diff --git a/trview.app/Windows/IViewer.h b/trview.app/Windows/IViewer.h index 386ba8647..4b18b1be5 100644 --- a/trview.app/Windows/IViewer.h +++ b/trview.app/Windows/IViewer.h @@ -80,6 +80,8 @@ namespace trview Event> on_camera_sink_selected; + Event on_font; + virtual CameraMode camera_mode() const = 0; /// Render the viewer. diff --git a/trview.app/Windows/Viewer.cpp b/trview.app/Windows/Viewer.cpp index c1f8c9edc..4301c623a 100644 --- a/trview.app/Windows/Viewer.cpp +++ b/trview.app/Windows/Viewer.cpp @@ -253,6 +253,7 @@ namespace trview } }; _ui->on_select_trigger += on_trigger_selected; + _ui->on_font += on_font; _ui->set_settings(_settings); _ui->set_camera_mode(CameraMode::Orbit); diff --git a/trview.app/trview.app.vcxproj b/trview.app/trview.app.vcxproj index 70af0d1aa..393499c09 100644 --- a/trview.app/trview.app.vcxproj +++ b/trview.app/trview.app.vcxproj @@ -85,6 +85,7 @@ copy ""$(OutDir)*.cso"" ""$(ProjectDir)Resources\Generated"" + diff --git a/trview.app/trview.app.vcxproj.filters b/trview.app/trview.app.vcxproj.filters index 3486d651b..97e641394 100644 --- a/trview.app/trview.app.vcxproj.filters +++ b/trview.app/trview.app.vcxproj.filters @@ -1042,6 +1042,9 @@ Windows + + Settings + From a99de6eb2c75bf63ddeb2a23f169b50907fc08ef Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 28 Apr 2024 12:16:45 +0100 Subject: [PATCH 02/38] Save and load settings --- trview.app/Application.cpp | 2 +- trview.app/Mocks/UI/ISettingsWindow.h | 1 + trview.app/Settings/SettingsLoader.cpp | 16 ++++++++++++++++ trview.app/UI/ISettingsWindow.h | 1 + trview.app/UI/SettingsWindow.cpp | 5 +++++ trview.app/UI/SettingsWindow.h | 1 + trview.app/UI/ViewerUI.cpp | 1 + 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index b2e14e3ac..80358fd70 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -674,7 +674,7 @@ namespace trview // Setup Dear ImGui style ImGui::StyleColorsDark(); - _font = io.Fonts->AddFontFromFileTTF((_files->fonts_directory() + "\\Arial.ttf").c_str(), 12.0f); + _font = io.Fonts->AddFontFromFileTTF(std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename).c_str(), _settings.font.size); _console_manager->initialise_ui(); diff --git a/trview.app/Mocks/UI/ISettingsWindow.h b/trview.app/Mocks/UI/ISettingsWindow.h index ed56f8358..9f1d2e0b0 100644 --- a/trview.app/Mocks/UI/ISettingsWindow.h +++ b/trview.app/Mocks/UI/ISettingsWindow.h @@ -35,6 +35,7 @@ namespace trview MOCK_METHOD(void, set_fov, (float), (override)); MOCK_METHOD(void, set_camera_sink_startup, (bool), (override)); MOCK_METHOD(void, set_plugin_directories, (const std::vector&), (override)); + MOCK_METHOD(void, set_font, (const FontSetting&), (override)); }; } } diff --git a/trview.app/Settings/SettingsLoader.cpp b/trview.app/Settings/SettingsLoader.cpp index 8a480b488..b3d670292 100644 --- a/trview.app/Settings/SettingsLoader.cpp +++ b/trview.app/Settings/SettingsLoader.cpp @@ -27,6 +27,13 @@ namespace trview json["normal_bottom"] = placement.normal_bottom; } + void to_json(nlohmann::json& json, const FontSetting& setting) + { + json["name"] = setting.name; + json["filename"] = setting.filename; + json["size"] = setting.size; + } + void from_json(const nlohmann::json& json, UserSettings::RecentRoute& item) { item.route_path = read_attribute(json, "route_path"); @@ -45,6 +52,13 @@ namespace trview placement.normal_bottom = read_attribute(json, "normal_bottom"); } + void from_json(const nlohmann::json& json, FontSetting& setting) + { + setting.name = read_attribute(json, "name"); + setting.filename = read_attribute(json, "filename"); + setting.size = read_attribute(json, "size"); + } + SettingsLoader::SettingsLoader(const std::shared_ptr& files) : _files(files) { @@ -90,6 +104,7 @@ namespace trview read_attribute(json, settings.window_placement, "window_placement"); read_attribute(json, settings.plugin_directories, "plugin_directories"); read_attribute(json, settings.toggles, "toggles"); + read_attribute(json, settings.font, "font"); settings.recent_files.resize(std::min(settings.recent_files.size(), settings.max_recent_files)); } @@ -156,6 +171,7 @@ namespace trview } json["plugin_directories"] = settings.plugin_directories; json["toggles"] = settings.toggles; + json["font"] = settings.font; _files->save_file(file_path, json.dump()); } catch (...) diff --git a/trview.app/UI/ISettingsWindow.h b/trview.app/UI/ISettingsWindow.h index 9a2952b41..f47291eaf 100644 --- a/trview.app/UI/ISettingsWindow.h +++ b/trview.app/UI/ISettingsWindow.h @@ -179,6 +179,7 @@ namespace trview virtual void set_fov(float value) = 0; virtual void set_camera_sink_startup(bool value) = 0; virtual void set_plugin_directories(const std::vector& directories) = 0; + virtual void set_font(const FontSetting& font) = 0; /// /// Toggle the visibility of the settings window. /// diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index 54f66a176..1bb6c19d6 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -413,4 +413,9 @@ namespace trview { _plugin_directories = directories; } + + void SettingsWindow::set_font(const FontSetting& font) + { + _selected_font = font; + } } diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index 971c276bd..da228230e 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -67,6 +67,7 @@ namespace trview virtual void set_fov(float value) override; virtual void set_camera_sink_startup(bool value) override; void set_plugin_directories(const std::vector& directories) override; + void set_font(const FontSetting& font) override; private: std::shared_ptr _dialogs; std::shared_ptr _shell; diff --git a/trview.app/UI/ViewerUI.cpp b/trview.app/UI/ViewerUI.cpp index 61b2ca416..08f2c2c35 100644 --- a/trview.app/UI/ViewerUI.cpp +++ b/trview.app/UI/ViewerUI.cpp @@ -395,6 +395,7 @@ namespace trview _settings_window->set_fov(settings.fov); _settings_window->set_camera_sink_startup(settings.camera_sink_startup); _settings_window->set_plugin_directories(settings.plugin_directories); + _settings_window->set_font(settings.font); _camera_position->set_display_degrees(settings.camera_display_degrees); _map_renderer->set_colours(settings.map_colours); for (const auto& toggle : settings.toggles) From 35f98bbb0d16b46db3a21bb6c912a3a9c3a1f3c7 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 28 Apr 2024 17:43:22 +0100 Subject: [PATCH 03/38] Slight tidying, sorting --- trview.app/UI/SettingsWindow.cpp | 42 ++++++++++---------------------- trview.app/UI/SettingsWindow.h | 1 + 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index 1bb6c19d6..4db3a35b6 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -1,5 +1,4 @@ #include "SettingsWindow.h" -#include namespace trview { @@ -12,36 +11,14 @@ namespace trview HKEY key = nullptr; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_READ, &key)) { - wchar_t class_name[255]; - DWORD class_name_length = 255; - DWORD number_of_subkeys = 0; - DWORD max_subkey_length = 0; - DWORD max_class_length = 0; DWORD value_count = 0; DWORD max_value_length = 0; - DWORD max_data_length = 0; - DWORD security_descriptor = 0; - FILETIME last_write_time; - std::vector value(16383, 0); - DWORD value_length = 16383; - - LRESULT result = RegQueryInfoKey(key, - class_name, - &class_name_length, - nullptr, - &number_of_subkeys, - &max_subkey_length, - &max_class_length, - &value_count, - &max_value_length, - &max_data_length, - &security_descriptor, - &last_write_time); + LRESULT result = RegQueryInfoKey(key, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, &value_count, &max_value_length, nullptr, nullptr, nullptr); for (uint32_t i = 0; i < value_count; ++i) { - value_length = 16383; + DWORD value_length = 16383; value[0] = '\0'; DWORD data_length = 0; @@ -53,11 +30,14 @@ namespace trview result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, &data_value[0], &data_length); wchar_t* value_string = reinterpret_cast(&data_value[0]); - if (value_string && std::wstring(value_string).ends_with(L".ttf")) + if (value_string && + std::wstring(value_string).ends_with(L".ttf") && + std::wstring(&value[0]).ends_with(L" (TrueType)")) { + const auto name = to_utf8(&value[0]); available_fonts.push_back( { - .name = to_utf8(&value[0]), + .name = name.substr(0, name.length() - 11), .filename = to_utf8(value_string) }); } @@ -65,7 +45,7 @@ namespace trview } RegCloseKey(key); - + std::ranges::sort(available_fonts, [](auto&& l, auto&& r) { return l.name < r.name; }); return available_fonts; } } @@ -122,7 +102,7 @@ namespace trview if (ImGui::BeginCombo("Font", _selected_font.name.c_str())) { - for (const auto& f : get_ye_fonts()) + for (const auto& f : _fonts) { bool is_selected = _selected_font.name == f.name; if (ImGui::Selectable(f.name.c_str(), is_selected)) @@ -340,6 +320,10 @@ namespace trview void SettingsWindow::toggle_visibility() { _visible = !_visible; + if (_visible) + { + _fonts = get_ye_fonts(); + } } void SettingsWindow::set_sensitivity(float value) diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index da228230e..0fd27f2f8 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -96,5 +96,6 @@ namespace trview bool _camera_sink_startup{ false }; std::vector _plugin_directories; FontSetting _selected_font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; + std::vector _fonts; }; } From 9cfcba527ac15557135a2f99a552cac97b7382ad Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 28 Apr 2024 17:55:29 +0100 Subject: [PATCH 04/38] Update nulls/mocks --- trview.app.tests/NullImGuiBackend.cpp | 4 ++++ trview.app.tests/NullImGuiBackend.h | 1 + trview.app/Mocks/UI/IImGuiBackend.h | 1 + 3 files changed, 6 insertions(+) diff --git a/trview.app.tests/NullImGuiBackend.cpp b/trview.app.tests/NullImGuiBackend.cpp index 2382c5b2f..5ce031c3d 100644 --- a/trview.app.tests/NullImGuiBackend.cpp +++ b/trview.app.tests/NullImGuiBackend.cpp @@ -27,6 +27,10 @@ namespace trview context->IO.Fonts->GetTexDataAsRGBA32(&data, &width, &height, &bpp); } + void NullImGuiBackend::rebuild_fonts() + { + } + void NullImGuiBackend::render() { } diff --git a/trview.app.tests/NullImGuiBackend.h b/trview.app.tests/NullImGuiBackend.h index 5c678950a..695c9aee3 100644 --- a/trview.app.tests/NullImGuiBackend.h +++ b/trview.app.tests/NullImGuiBackend.h @@ -13,6 +13,7 @@ namespace trview void initialise() override; bool is_setup() const override; void new_frame() override; + void rebuild_fonts() override; void render() override; void reset_layout() override; void shutdown() override; diff --git a/trview.app/Mocks/UI/IImGuiBackend.h b/trview.app/Mocks/UI/IImGuiBackend.h index 704f925f2..cb5e09fc2 100644 --- a/trview.app/Mocks/UI/IImGuiBackend.h +++ b/trview.app/Mocks/UI/IImGuiBackend.h @@ -13,6 +13,7 @@ namespace trview MOCK_METHOD(void, initialise, (), (override)); MOCK_METHOD(bool, is_setup, (), (const, override)); MOCK_METHOD(void, new_frame, (), (override)); + MOCK_METHOD(void, rebuild_fonts, (), (override)); MOCK_METHOD(void, render, (), (override)); MOCK_METHOD(void, reset_layout, (), (override)); MOCK_METHOD(void, shutdown, (), (override)); From d55caa67cbcb6b01fd786ca1763bdc783afac972 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 28 Apr 2024 19:26:12 +0100 Subject: [PATCH 05/38] Try to adjust triggers window columns Will need to recalculate all the time - but can improve it. --- trview.app/Windows/TriggersWindow.cpp | 25 ++++++++++++++++++++----- trview.app/Windows/TriggersWindow.h | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/trview.app/Windows/TriggersWindow.cpp b/trview.app/Windows/TriggersWindow.cpp index b32b4b7ad..aee3fbf1b 100644 --- a/trview.app/Windows/TriggersWindow.cpp +++ b/trview.app/Windows/TriggersWindow.cpp @@ -3,6 +3,7 @@ #include "../trview_imgui.h" #include #include "RowCounter.h" +#include "../Elements/IRoom.h" namespace trview { @@ -125,7 +126,9 @@ namespace trview void TriggersWindow::render_triggers_list() { - if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(220, 0), true, ImGuiWindowFlags_NoScrollbar)) + calculate_column_widths(); + const float required_width = _required_number_width + _required_type_width + _required_room_width + _required_hide_width; + if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(required_width, 0), true, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); ImGui::SameLine(); @@ -174,9 +177,9 @@ namespace trview if (ImGui::BeginTable(Names::triggers_list.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) { ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _required_number_width); - ImGui::TableSetupColumn("Room"); + ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _required_room_width); ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, _required_type_width); - ImGui::TableSetupColumn("Hide"); + ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _required_hide_width); ImGui::TableSetupScrollFreeze(1, 1); ImGui::TableHeadersRow(); @@ -511,8 +514,10 @@ namespace trview return; } - _required_type_width = 0.0f; - _required_number_width = 0.0f; + _required_type_width = ImGui::CalcTextSize("Type").x; + _required_number_width = ImGui::CalcTextSize("#").x; + _required_room_width = ImGui::CalcTextSize("Room").x; + _required_hide_width = ImGui::CalcTextSize("Hide").x; for (const auto& trigger : _all_triggers) { const auto trigger_ptr = trigger.lock(); @@ -520,10 +525,20 @@ namespace trview { _required_number_width = std::max(_required_number_width, ImGui::CalcTextSize(std::to_string(trigger_ptr->number()).c_str()).x); + if (auto room = trigger_ptr->room().lock()) + { + _required_room_width = std::max(_required_room_width, + ImGui::CalcTextSize(std::to_string(room->number()).c_str()).x); + } _required_type_width = std::max(_required_type_width, ImGui::CalcTextSize(trigger_type_name(trigger_ptr->type()).c_str()).x); } } + + _required_type_width *= 1.5f; + _required_number_width *= 1.5f; + _required_room_width *= 1.5f; + _required_hide_width *= 4.0f; } std::optional TriggersWindow::index_of_selected() const diff --git a/trview.app/Windows/TriggersWindow.h b/trview.app/Windows/TriggersWindow.h index 2083cb478..f341900ef 100644 --- a/trview.app/Windows/TriggersWindow.h +++ b/trview.app/Windows/TriggersWindow.h @@ -83,6 +83,8 @@ namespace trview bool _need_filtering{ true }; float _required_number_width{ 0.0f }; float _required_type_width{ 0.0f }; + float _required_room_width{ 0.0f }; + float _required_hide_width{ 0.0f }; bool _force_sort{ false }; Track _track; }; From b77e86f0133a1543e814aebc8aaea7d5d8d0baaf Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:26:16 +0100 Subject: [PATCH 06/38] Fix sizing for the triggers window #970 --- trview.app/Windows/ColumnSizer.cpp | 39 +++++++++++++++++++++++++++ trview.app/Windows/ColumnSizer.h | 35 ++++++++++++++++++++++++ trview.app/Windows/TriggersWindow.cpp | 35 ++++++++++-------------- trview.app/Windows/TriggersWindow.h | 6 ++--- trview.app/trview.app.vcxproj | 2 ++ trview.app/trview.app.vcxproj.filters | 6 +++++ 6 files changed, 98 insertions(+), 25 deletions(-) create mode 100644 trview.app/Windows/ColumnSizer.cpp create mode 100644 trview.app/Windows/ColumnSizer.h diff --git a/trview.app/Windows/ColumnSizer.cpp b/trview.app/Windows/ColumnSizer.cpp new file mode 100644 index 000000000..722e7d76d --- /dev/null +++ b/trview.app/Windows/ColumnSizer.cpp @@ -0,0 +1,39 @@ +#include "ColumnSizer.h" + +namespace trview +{ + void ColumnSizer::measure(const std::string& value, uint32_t index) + { + if (index >= _sizes.size()) + { + _sizes.resize(index + 1, 0.0f); + } + _sizes[index] = std::max(_sizes[index], ImGui::CalcTextSize(value.c_str()).x); + } + + void ColumnSizer::reset() + { + _sizes.clear(); + } + + void ColumnSizer::scale(std::vector values) + { + _scales = values; + } + + float ColumnSizer::size() const + { + float total = 0.0f; + for (std::size_t i = 0; i < _sizes.size(); ++i) + { + total += size(static_cast(i)); + } + return total; + } + + float ColumnSizer::size(uint32_t index) const + { + const float scale = index < _scales.size() ? _scales[index] : 1.0f; + return index < _sizes.size() ? (_sizes[index] * scale) : 0.0f; + } +} diff --git a/trview.app/Windows/ColumnSizer.h b/trview.app/Windows/ColumnSizer.h new file mode 100644 index 000000000..bb485ce13 --- /dev/null +++ b/trview.app/Windows/ColumnSizer.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include + +namespace trview +{ + class ColumnSizer final + { + public: + /// + /// Add a string to the rolling measure for a column. + /// + /// String to measure. + /// Column index. + void measure(const std::string& value, uint32_t column); + void reset(); + void scale(std::vector values); + /// + /// Get the calculated size for all column data. + /// + /// The final size. + float size() const; + /// + /// Get the calculated size for a single column. + /// + /// The column index. + /// Calculated size. + float size(uint32_t index) const; + private: + std::vector _sizes; + std::vector _scales; + }; +} + diff --git a/trview.app/Windows/TriggersWindow.cpp b/trview.app/Windows/TriggersWindow.cpp index aee3fbf1b..5202b4ff0 100644 --- a/trview.app/Windows/TriggersWindow.cpp +++ b/trview.app/Windows/TriggersWindow.cpp @@ -127,8 +127,7 @@ namespace trview void TriggersWindow::render_triggers_list() { calculate_column_widths(); - const float required_width = _required_number_width + _required_type_width + _required_room_width + _required_hide_width; - if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(required_width, 0), true, ImGuiWindowFlags_NoScrollbar)) + if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(_column_sizer.size(), 0), true, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); ImGui::SameLine(); @@ -176,10 +175,10 @@ namespace trview RowCounter counter{ "triggers", _all_triggers.size() }; if (ImGui::BeginTable(Names::triggers_list.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) { - ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _required_number_width); - ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _required_room_width); - ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, _required_type_width); - ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _required_hide_width); + ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); + ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(2)); + ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(3)); ImGui::TableSetupScrollFreeze(1, 1); ImGui::TableHeadersRow(); @@ -514,31 +513,25 @@ namespace trview return; } - _required_type_width = ImGui::CalcTextSize("Type").x; - _required_number_width = ImGui::CalcTextSize("#").x; - _required_room_width = ImGui::CalcTextSize("Room").x; - _required_hide_width = ImGui::CalcTextSize("Hide").x; + _column_sizer.reset(); + _column_sizer.measure("#", 0); + _column_sizer.measure("Room", 1); + _column_sizer.measure("Type", 2); + _column_sizer.measure("Hide", 3); for (const auto& trigger : _all_triggers) { const auto trigger_ptr = trigger.lock(); if (trigger_ptr) { - _required_number_width = std::max(_required_number_width, - ImGui::CalcTextSize(std::to_string(trigger_ptr->number()).c_str()).x); + _column_sizer.measure(std::to_string(trigger_ptr->number()), 0); if (auto room = trigger_ptr->room().lock()) { - _required_room_width = std::max(_required_room_width, - ImGui::CalcTextSize(std::to_string(room->number()).c_str()).x); + _column_sizer.measure(std::to_string(room->number()), 1); } - _required_type_width = std::max(_required_type_width, - ImGui::CalcTextSize(trigger_type_name(trigger_ptr->type()).c_str()).x); + _column_sizer.measure(trigger_type_name(trigger_ptr->type()), 2); } } - - _required_type_width *= 1.5f; - _required_number_width *= 1.5f; - _required_room_width *= 1.5f; - _required_hide_width *= 4.0f; + _column_sizer.scale({ 1.5f, 1.5f, 1.5f, 4.0f }); } std::optional TriggersWindow::index_of_selected() const diff --git a/trview.app/Windows/TriggersWindow.h b/trview.app/Windows/TriggersWindow.h index f341900ef..0d7ba9977 100644 --- a/trview.app/Windows/TriggersWindow.h +++ b/trview.app/Windows/TriggersWindow.h @@ -11,6 +11,7 @@ #include "ITriggersWindow.h" #include "../Elements/IItem.h" #include "../Elements/ITrigger.h" +#include "ColumnSizer.h" namespace trview { @@ -81,10 +82,7 @@ namespace trview std::vector _local_selected_trigger_commands; Filters _filters; bool _need_filtering{ true }; - float _required_number_width{ 0.0f }; - float _required_type_width{ 0.0f }; - float _required_room_width{ 0.0f }; - float _required_hide_width{ 0.0f }; + ColumnSizer _column_sizer; bool _force_sort{ false }; Track _track; }; diff --git a/trview.app/trview.app.vcxproj b/trview.app/trview.app.vcxproj index 393499c09..65249cdaf 100644 --- a/trview.app/trview.app.vcxproj +++ b/trview.app/trview.app.vcxproj @@ -128,6 +128,7 @@ copy ""$(OutDir)*.cso"" ""$(ProjectDir)Resources\Generated"" + @@ -185,6 +186,7 @@ copy ""$(OutDir)*.cso"" ""$(ProjectDir)Resources\Generated"" + diff --git a/trview.app/trview.app.vcxproj.filters b/trview.app/trview.app.vcxproj.filters index 97e641394..0fe9341c3 100644 --- a/trview.app/trview.app.vcxproj.filters +++ b/trview.app/trview.app.vcxproj.filters @@ -323,6 +323,9 @@ Windows + + Windows + @@ -1045,6 +1048,9 @@ Settings + + Windows + From bd8b32d8267b3a702b7a875336a3aa7770baba76 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:41:49 +0100 Subject: [PATCH 07/38] Add item window column scaling #970 --- trview.app/Windows/ItemsWindow.cpp | 36 +++++++++++++++++++++++++----- trview.app/Windows/ItemsWindow.h | 4 ++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/trview.app/Windows/ItemsWindow.cpp b/trview.app/Windows/ItemsWindow.cpp index 4a8f91ebc..c3ba1aede 100644 --- a/trview.app/Windows/ItemsWindow.cpp +++ b/trview.app/Windows/ItemsWindow.cpp @@ -45,6 +45,7 @@ namespace trview _triggered_by.clear(); setup_filters(); _force_sort = true; + calculate_column_widths(); } void ItemsWindow::set_triggers(const std::vector>& triggers) @@ -93,7 +94,7 @@ namespace trview void ItemsWindow::render_items_list() { - if (ImGui::BeginChild(Names::item_list_panel.c_str(), ImVec2(290, 0), true, ImGuiWindowFlags_NoScrollbar)) + if (ImGui::BeginChild(Names::item_list_panel.c_str(), ImVec2(_column_sizer.size(), 0), true, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); @@ -110,11 +111,11 @@ namespace trview RowCounter counter{ "items", _all_items.size() }; if (ImGui::BeginTable(Names::items_list.c_str(), 5, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) { - ImGui::TableSetupColumn("#"); - ImGui::TableSetupColumn("Room"); - ImGui::TableSetupColumn("ID"); - ImGui::TableSetupColumn("Type"); - ImGui::TableSetupColumn("Hide"); + ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); + ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(2)); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(3)); + ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(4)); ImGui::TableSetupScrollFreeze(1, 1); ImGui::TableHeadersRow(); @@ -426,4 +427,27 @@ namespace trview { _model_checker = checker; } + + void ItemsWindow::calculate_column_widths() + { + _column_sizer.reset(); + _column_sizer.measure("#", 0); + _column_sizer.measure("Room", 1); + _column_sizer.measure("ID", 2); + _column_sizer.measure("Type", 3); + _column_sizer.measure("Hide", 4); + + for (const auto& item : _all_items) + { + if (auto item_ptr = item.lock()) + { + const bool item_is_virtual = is_virtual(*item_ptr); + _column_sizer.measure(std::format("{0}{1}##{0}", item_ptr->number(), item_is_virtual ? "*" : ""), 0); + _column_sizer.measure(std::to_string(item_room(item_ptr)), 1); + _column_sizer.measure(std::to_string(item_ptr->type_id()), 2); + _column_sizer.measure(item_ptr->type(), 3); + } + } + _column_sizer.scale({ 1.5f, 1.5f, 1.5f, 1.5f, 5.0f }); + } } diff --git a/trview.app/Windows/ItemsWindow.h b/trview.app/Windows/ItemsWindow.h index 14a723caf..9f9f30c75 100644 --- a/trview.app/Windows/ItemsWindow.h +++ b/trview.app/Windows/ItemsWindow.h @@ -9,6 +9,7 @@ #include "IItemsWindow.h" #include "../Elements/IItem.h" #include "../Track/Track.h" +#include "ColumnSizer.h" namespace trview { @@ -47,6 +48,7 @@ namespace trview bool render_items_window(); void set_local_selected_item(std::weak_ptr item); void setup_filters(); + void calculate_column_widths(); std::string _id{ "Items 0" }; std::vector> _all_items; @@ -67,5 +69,7 @@ namespace trview std::function _model_checker; bool _force_sort{ false }; Track _track; + + ColumnSizer _column_sizer; }; } From dad845d6e50d0f2b6b12f5b57fbca933da7e29c1 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:05:26 +0100 Subject: [PATCH 08/38] Fix item and triggers columns --- trview.app/Windows/ColumnSizer.cpp | 3 ++- trview.app/Windows/ItemsWindow.cpp | 17 +++++++++-------- trview.app/Windows/TriggersWindow.cpp | 14 +++++++------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/trview.app/Windows/ColumnSizer.cpp b/trview.app/Windows/ColumnSizer.cpp index 722e7d76d..5e20db603 100644 --- a/trview.app/Windows/ColumnSizer.cpp +++ b/trview.app/Windows/ColumnSizer.cpp @@ -34,6 +34,7 @@ namespace trview float ColumnSizer::size(uint32_t index) const { const float scale = index < _scales.size() ? _scales[index] : 1.0f; - return index < _sizes.size() ? (_sizes[index] * scale) : 0.0f; + const float base_size = index < _sizes.size() ? _sizes[index] : 0.0f; + return base_size * scale; } } diff --git a/trview.app/Windows/ItemsWindow.cpp b/trview.app/Windows/ItemsWindow.cpp index c3ba1aede..58e407bbe 100644 --- a/trview.app/Windows/ItemsWindow.cpp +++ b/trview.app/Windows/ItemsWindow.cpp @@ -94,7 +94,8 @@ namespace trview void ItemsWindow::render_items_list() { - if (ImGui::BeginChild(Names::item_list_panel.c_str(), ImVec2(_column_sizer.size(), 0), true, ImGuiWindowFlags_NoScrollbar)) + calculate_column_widths(); + if (ImGui::BeginChild(Names::item_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); @@ -109,7 +110,7 @@ namespace trview } RowCounter counter{ "items", _all_items.size() }; - if (ImGui::BeginTable(Names::items_list.c_str(), 5, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) + if (ImGui::BeginTable(Names::items_list.c_str(), 5, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY, ImVec2(0, -counter.height()))) { ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); @@ -431,11 +432,11 @@ namespace trview void ItemsWindow::calculate_column_widths() { _column_sizer.reset(); - _column_sizer.measure("#", 0); - _column_sizer.measure("Room", 1); - _column_sizer.measure("ID", 2); - _column_sizer.measure("Type", 3); - _column_sizer.measure("Hide", 4); + _column_sizer.measure("#__", 0); + _column_sizer.measure("Room__", 1); + _column_sizer.measure("ID__", 2); + _column_sizer.measure("Type__", 3); + _column_sizer.measure("Hide____", 4); for (const auto& item : _all_items) { @@ -448,6 +449,6 @@ namespace trview _column_sizer.measure(item_ptr->type(), 3); } } - _column_sizer.scale({ 1.5f, 1.5f, 1.5f, 1.5f, 5.0f }); + _column_sizer.scale({ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }); } } diff --git a/trview.app/Windows/TriggersWindow.cpp b/trview.app/Windows/TriggersWindow.cpp index 5202b4ff0..0dc3c115c 100644 --- a/trview.app/Windows/TriggersWindow.cpp +++ b/trview.app/Windows/TriggersWindow.cpp @@ -127,7 +127,7 @@ namespace trview void TriggersWindow::render_triggers_list() { calculate_column_widths(); - if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(_column_sizer.size(), 0), true, ImGuiWindowFlags_NoScrollbar)) + if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); ImGui::SameLine(); @@ -173,7 +173,7 @@ namespace trview } RowCounter counter{ "triggers", _all_triggers.size() }; - if (ImGui::BeginTable(Names::triggers_list.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) + if (ImGui::BeginTable(Names::triggers_list.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY, ImVec2(0, -counter.height()))) { ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); @@ -514,10 +514,10 @@ namespace trview } _column_sizer.reset(); - _column_sizer.measure("#", 0); - _column_sizer.measure("Room", 1); - _column_sizer.measure("Type", 2); - _column_sizer.measure("Hide", 3); + _column_sizer.measure("#__", 0); + _column_sizer.measure("Room__", 1); + _column_sizer.measure("Type__", 2); + _column_sizer.measure("Hide____", 3); for (const auto& trigger : _all_triggers) { const auto trigger_ptr = trigger.lock(); @@ -531,7 +531,7 @@ namespace trview _column_sizer.measure(trigger_type_name(trigger_ptr->type()), 2); } } - _column_sizer.scale({ 1.5f, 1.5f, 1.5f, 4.0f }); + _column_sizer.scale({ 1.0f, 1.0f, 1.0f, 1.0f }); } std::optional TriggersWindow::index_of_selected() const From dc09211012c9541eb80b3a1e15d172c4d8176576 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:23:39 +0100 Subject: [PATCH 09/38] Rooms window resizing --- trview.app/Windows/ColumnSizer.cpp | 9 +--- trview.app/Windows/ColumnSizer.h | 2 - trview.app/Windows/ItemsWindow.cpp | 1 - trview.app/Windows/RoomsWindow.cpp | 65 ++++++++++++++++++--------- trview.app/Windows/RoomsWindow.h | 4 ++ trview.app/Windows/TriggersWindow.cpp | 1 - 6 files changed, 49 insertions(+), 33 deletions(-) diff --git a/trview.app/Windows/ColumnSizer.cpp b/trview.app/Windows/ColumnSizer.cpp index 5e20db603..5ec25445f 100644 --- a/trview.app/Windows/ColumnSizer.cpp +++ b/trview.app/Windows/ColumnSizer.cpp @@ -16,11 +16,6 @@ namespace trview _sizes.clear(); } - void ColumnSizer::scale(std::vector values) - { - _scales = values; - } - float ColumnSizer::size() const { float total = 0.0f; @@ -33,8 +28,6 @@ namespace trview float ColumnSizer::size(uint32_t index) const { - const float scale = index < _scales.size() ? _scales[index] : 1.0f; - const float base_size = index < _sizes.size() ? _sizes[index] : 0.0f; - return base_size * scale; + return index < _sizes.size() ? _sizes[index] : 0.0f; } } diff --git a/trview.app/Windows/ColumnSizer.h b/trview.app/Windows/ColumnSizer.h index bb485ce13..8a7a5b0d6 100644 --- a/trview.app/Windows/ColumnSizer.h +++ b/trview.app/Windows/ColumnSizer.h @@ -15,7 +15,6 @@ namespace trview /// Column index. void measure(const std::string& value, uint32_t column); void reset(); - void scale(std::vector values); /// /// Get the calculated size for all column data. /// @@ -29,7 +28,6 @@ namespace trview float size(uint32_t index) const; private: std::vector _sizes; - std::vector _scales; }; } diff --git a/trview.app/Windows/ItemsWindow.cpp b/trview.app/Windows/ItemsWindow.cpp index 58e407bbe..8e944efc9 100644 --- a/trview.app/Windows/ItemsWindow.cpp +++ b/trview.app/Windows/ItemsWindow.cpp @@ -449,6 +449,5 @@ namespace trview _column_sizer.measure(item_ptr->type(), 3); } } - _column_sizer.scale({ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }); } } diff --git a/trview.app/Windows/RoomsWindow.cpp b/trview.app/Windows/RoomsWindow.cpp index 05d5b91e8..eda1deb52 100644 --- a/trview.app/Windows/RoomsWindow.cpp +++ b/trview.app/Windows/RoomsWindow.cpp @@ -76,6 +76,18 @@ namespace trview { return 1.0f - static_cast(ambient) / static_cast(0x1fff); } + + std::size_t item_count(std::vector>& items, const IRoom& room) + { + return std::ranges::count_if(items, [&room](const auto& item) + { + if (auto i = item.lock()) + { + return item_room(i) == room.number(); + } + return false; + }); + } } IRoomsWindow::~IRoomsWindow() @@ -173,6 +185,7 @@ namespace trview generate_filters(); _force_sort = true; set_selected_sector(nullptr); + calculate_column_widths(); } void RoomsWindow::set_selected_item(const std::weak_ptr& item) @@ -274,7 +287,8 @@ namespace trview void RoomsWindow::render_rooms_list() { - if (ImGui::BeginChild(Names::rooms_panel.c_str(), ImVec2(270, 0), true, ImGuiWindowFlags_NoScrollbar)) + calculate_column_widths(); + if (ImGui::BeginChild(Names::rooms_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); @@ -289,28 +303,16 @@ namespace trview } RowCounter counter{ "rooms", _all_rooms.size() }; - if (ImGui::BeginTable(Names::rooms_list.c_str(), 5, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) + if (ImGui::BeginTable(Names::rooms_list.c_str(), 5, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY, ImVec2(0, -counter.height()))) { - ImGui::TableSetupColumn("#"); - ImGui::TableSetupColumn("Items"); - ImGui::TableSetupColumn("Triggers"); - ImGui::TableSetupColumn("Statics"); - ImGui::TableSetupColumn("Hide"); + ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); + ImGui::TableSetupColumn("Items", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); + ImGui::TableSetupColumn("Triggers", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(2)); + ImGui::TableSetupColumn("Statics", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(3)); + ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(4)); ImGui::TableSetupScrollFreeze(1, 1); ImGui::TableHeadersRow(); - auto item_count = [&](const IRoom& room) - { - return std::count_if(_all_items.begin(), _all_items.end(), [&room](const auto& item) - { - if (auto i = item.lock()) - { - return item_room(i) == room.number(); - } - return false; - }); - }; - auto trigger_count = [&](const IRoom& room) { return room.triggers().size(); @@ -321,7 +323,7 @@ namespace trview imgui_sort_weak(_all_rooms, { [](auto&& l, auto&& r) { return l.number() < r.number(); }, - [&](auto&& l, auto&& r) { return item_count(l) < item_count(r); }, + [&](auto&& l, auto&& r) { return item_count(_all_items, l) < item_count(_all_items, r); }, [&](auto&& l, auto&& r) { return trigger_count(l) < trigger_count(r); }, [&](auto&& l, auto&& r) { return static_mesh_count(l) < static_mesh_count(r); }, [&](auto&& l, auto&& r) { return l.visible() < r.visible(); } @@ -362,7 +364,7 @@ namespace trview _scroll_to_room = false; } ImGui::TableNextColumn(); - ImGui::Text(std::to_string(item_count(*room_ptr)).c_str()); + ImGui::Text(std::to_string(item_count(_all_items, *room_ptr)).c_str()); ImGui::TableNextColumn(); ImGui::Text(std::to_string(trigger_count(*room_ptr)).c_str()); ImGui::TableNextColumn(); @@ -1233,4 +1235,25 @@ namespace trview _static_meshes = static_meshes; _force_sort = true; } + + void RoomsWindow::calculate_column_widths() + { + _column_sizer.reset(); + _column_sizer.measure("#__", 0); + _column_sizer.measure("Items__", 1); + _column_sizer.measure("Triggers__", 2); + _column_sizer.measure("Statics__", 3); + _column_sizer.measure("Hide____", 4); + + for (const auto& room : _all_rooms) + { + if (auto room_ptr = room.lock()) + { + _column_sizer.measure(std::format("{0}", room_ptr->number()), 0); + _column_sizer.measure(std::to_string(item_count(_all_items, *room_ptr)), 1); + _column_sizer.measure(std::to_string(room_ptr->triggers().size()), 2); + _column_sizer.measure(std::to_string(room_ptr->static_meshes().size()), 3); + } + } + } } \ No newline at end of file diff --git a/trview.app/Windows/RoomsWindow.h b/trview.app/Windows/RoomsWindow.h index 6a76db16d..7bf9d27f9 100644 --- a/trview.app/Windows/RoomsWindow.h +++ b/trview.app/Windows/RoomsWindow.h @@ -10,6 +10,7 @@ #include "../UI/IMapRenderer.h" #include "../Filters/Filters.h" #include "../Track/Track.h" +#include "ColumnSizer.h" namespace trview { @@ -68,6 +69,7 @@ namespace trview void select_room(std::weak_ptr room); void render_statics_tab(); void set_static_meshes(const std::vector>& static_meshes); + void calculate_column_widths(); std::vector> _all_rooms; std::vector> _all_items; @@ -120,5 +122,7 @@ namespace trview std::weak_ptr _selected_sector; uint32_t _selected_floordata{ 0 }; Track _track; + + ColumnSizer _column_sizer; }; } diff --git a/trview.app/Windows/TriggersWindow.cpp b/trview.app/Windows/TriggersWindow.cpp index 0dc3c115c..92602468e 100644 --- a/trview.app/Windows/TriggersWindow.cpp +++ b/trview.app/Windows/TriggersWindow.cpp @@ -531,7 +531,6 @@ namespace trview _column_sizer.measure(trigger_type_name(trigger_ptr->type()), 2); } } - _column_sizer.scale({ 1.0f, 1.0f, 1.0f, 1.0f }); } std::optional TriggersWindow::index_of_selected() const From 168503f5ff9dcb859820d260458cea65c24dbd06 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:38:38 +0100 Subject: [PATCH 10/38] More resize tweaking --- .../Windows/CameraSink/CameraSinkWindow.cpp | 40 ++++++++++++++++--- .../Windows/CameraSink/CameraSinkWindow.h | 3 ++ trview.app/Windows/ItemsWindow.cpp | 2 +- trview.app/Windows/RoomsWindow.cpp | 2 +- trview.app/Windows/RowCounter.cpp | 2 +- trview.app/Windows/TriggersWindow.cpp | 2 +- 6 files changed, 41 insertions(+), 10 deletions(-) diff --git a/trview.app/Windows/CameraSink/CameraSinkWindow.cpp b/trview.app/Windows/CameraSink/CameraSinkWindow.cpp index 341702e1c..75848c9c1 100644 --- a/trview.app/Windows/CameraSink/CameraSinkWindow.cpp +++ b/trview.app/Windows/CameraSink/CameraSinkWindow.cpp @@ -95,6 +95,7 @@ namespace trview { _all_camera_sinks = camera_sinks; _force_sort = true; + calculate_column_widths(); } bool CameraSinkWindow::render_camera_sink_window() @@ -137,7 +138,8 @@ namespace trview void CameraSinkWindow::render_list() { - if (ImGui::BeginChild(Names::list_panel.c_str(), ImVec2(230, 0), true, ImGuiWindowFlags_NoScrollbar)) + calculate_column_widths(); + if (ImGui::BeginChild(Names::list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); ImGui::SameLine(); @@ -151,12 +153,12 @@ namespace trview } RowCounter counter{ "camera/sinks", _all_camera_sinks.size() }; - if (ImGui::BeginTable(Names::camera_sink_list.c_str(), 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY, ImVec2(-1, -counter.height()))) + if (ImGui::BeginTable(Names::camera_sink_list.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY, ImVec2(0, -counter.height()))) { - ImGui::TableSetupColumn("#"); - ImGui::TableSetupColumn("Room"); - ImGui::TableSetupColumn("Type"); - ImGui::TableSetupColumn("Hide"); + ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); + ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(2)); + ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(3)); ImGui::TableSetupScrollFreeze(1, 1); ImGui::TableHeadersRow(); @@ -408,4 +410,30 @@ namespace trview _filters.add_getter("Strength", [](auto&& camera_sink) { return static_cast(camera_sink.strength()); }, is_sink); _filters.add_getter("Box Index", [](auto&& camera_sink) { return static_cast(camera_sink.flag()); }, is_sink); } + + void CameraSinkWindow::calculate_column_widths() + { + _column_sizer.reset(); + _column_sizer.measure("#__", 0); + _column_sizer.measure("Room__", 1); + _column_sizer.measure("Type__", 2); + _column_sizer.measure("Hide____", 3); + + for (const auto& camera_sink : _all_camera_sinks) + { + if (const auto camera_sink_ptr = camera_sink.lock()) + { + _column_sizer.measure(std::to_string(camera_sink_ptr->number()), 0); + if (camera_sink_ptr->type() == ICameraSink::Type::Camera) + { + _column_sizer.measure(std::to_string(primary_room(*camera_sink_ptr)), 1); + } + else + { + _column_sizer.measure(inferred_rooms_text(camera_sink_ptr->inferred_rooms()), 1); + } + _column_sizer.measure(to_string(camera_sink_ptr->type()), 2); + } + } + } } diff --git a/trview.app/Windows/CameraSink/CameraSinkWindow.h b/trview.app/Windows/CameraSink/CameraSinkWindow.h index 4884637af..f062f3c64 100644 --- a/trview.app/Windows/CameraSink/CameraSinkWindow.h +++ b/trview.app/Windows/CameraSink/CameraSinkWindow.h @@ -4,6 +4,7 @@ #include "../../Filters/Filters.h" #include "../../Track/Track.h" #include "ICameraSinkWindow.h" +#include "../ColumnSizer.h" namespace trview { @@ -35,6 +36,7 @@ namespace trview void render_list(); void render_details(); void setup_filters(); + void calculate_column_widths(); std::string _id{ "Camera/Sink 0" }; std::vector> _all_camera_sinks; @@ -50,5 +52,6 @@ namespace trview bool _force_sort{ false }; std::vector> _triggered_by; Track _track; + ColumnSizer _column_sizer; }; } diff --git a/trview.app/Windows/ItemsWindow.cpp b/trview.app/Windows/ItemsWindow.cpp index 8e944efc9..6bd86a54a 100644 --- a/trview.app/Windows/ItemsWindow.cpp +++ b/trview.app/Windows/ItemsWindow.cpp @@ -95,7 +95,7 @@ namespace trview void ItemsWindow::render_items_list() { calculate_column_widths(); - if (ImGui::BeginChild(Names::item_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) + if (ImGui::BeginChild(Names::item_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); diff --git a/trview.app/Windows/RoomsWindow.cpp b/trview.app/Windows/RoomsWindow.cpp index eda1deb52..e47444b13 100644 --- a/trview.app/Windows/RoomsWindow.cpp +++ b/trview.app/Windows/RoomsWindow.cpp @@ -288,7 +288,7 @@ namespace trview void RoomsWindow::render_rooms_list() { calculate_column_widths(); - if (ImGui::BeginChild(Names::rooms_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) + if (ImGui::BeginChild(Names::rooms_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); diff --git a/trview.app/Windows/RowCounter.cpp b/trview.app/Windows/RowCounter.cpp index 85ab19119..ef0554fea 100644 --- a/trview.app/Windows/RowCounter.cpp +++ b/trview.app/Windows/RowCounter.cpp @@ -10,7 +10,7 @@ namespace trview float RowCounter::height() const { - return ImGui::CalcTextSize(_entry_name.c_str()).y; + return ImGui::CalcTextSize(_entry_name.c_str()).y * 1.5f; } void RowCounter::count() diff --git a/trview.app/Windows/TriggersWindow.cpp b/trview.app/Windows/TriggersWindow.cpp index 92602468e..f412349d1 100644 --- a/trview.app/Windows/TriggersWindow.cpp +++ b/trview.app/Windows/TriggersWindow.cpp @@ -127,7 +127,7 @@ namespace trview void TriggersWindow::render_triggers_list() { calculate_column_widths(); - if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) + if (ImGui::BeginChild(Names::trigger_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); ImGui::SameLine(); From 5ffa52f9b122b70ebd30c9fa8b13d257f04ae001 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:44:32 +0100 Subject: [PATCH 11/38] Update lights window --- trview.app/Windows/LightsWindow.cpp | 33 +++++++++++++++++++++++------ trview.app/Windows/LightsWindow.h | 3 +++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/trview.app/Windows/LightsWindow.cpp b/trview.app/Windows/LightsWindow.cpp index f01f2bc81..9d6e9b8d1 100644 --- a/trview.app/Windows/LightsWindow.cpp +++ b/trview.app/Windows/LightsWindow.cpp @@ -47,6 +47,7 @@ namespace trview _all_lights = lights; setup_filters(); _force_sort = true; + calculate_column_widths(); } void LightsWindow::set_selected_light(const std::weak_ptr& light) @@ -79,7 +80,8 @@ namespace trview void LightsWindow::render_lights_list() { - if (ImGui::BeginChild(Names::light_list_panel.c_str(), ImVec2(230, 0), true, ImGuiWindowFlags_NoScrollbar)) + calculate_column_widths(); + if (ImGui::BeginChild(Names::light_list_panel.c_str(), ImVec2(0, 0), ImGuiChildFlags_AutoResizeX, ImGuiWindowFlags_NoScrollbar)) { _filters.render(); ImGui::SameLine(); @@ -93,12 +95,12 @@ namespace trview } RowCounter counter{ "lights", _all_lights.size() }; - if (ImGui::BeginTable(Names::lights_listbox.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(-1, -counter.height()))) + if (ImGui::BeginTable(Names::lights_listbox.c_str(), 4, ImGuiTableFlags_Sortable | ImGuiTableFlags_ScrollY, ImVec2(0, -counter.height()))) { - ImGui::TableSetupColumn("#"); - ImGui::TableSetupColumn("Room"); - ImGui::TableSetupColumn("Type"); - ImGui::TableSetupColumn("Hide"); + ImGui::TableSetupColumn("#", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(0)); + ImGui::TableSetupColumn("Room", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(1)); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(2)); + ImGui::TableSetupColumn("Hide", ImGuiTableColumnFlags_WidthFixed, _column_sizer.size(3)); ImGui::TableSetupScrollFreeze(1, 1); ImGui::TableHeadersRow(); @@ -342,6 +344,25 @@ namespace trview _filters.add_getter("Range", [](auto&& light) { return range(light); }, has_range); } } + + void LightsWindow::calculate_column_widths() + { + _column_sizer.reset(); + _column_sizer.measure("#__", 0); + _column_sizer.measure("Room__", 1); + _column_sizer.measure("Type__", 2); + _column_sizer.measure("Hide____", 3); + + for (const auto& light : _all_lights) + { + if (auto light_ptr = light.lock()) + { + _column_sizer.measure(std::format("{0}", light_ptr->number()), 0); + _column_sizer.measure(std::to_string(light_room(*light_ptr)), 1); + _column_sizer.measure(light_type_name(light_ptr->type()), 2); + } + } + } } diff --git a/trview.app/Windows/LightsWindow.h b/trview.app/Windows/LightsWindow.h index 2bb94a4fb..c7c3db18b 100644 --- a/trview.app/Windows/LightsWindow.h +++ b/trview.app/Windows/LightsWindow.h @@ -5,6 +5,7 @@ #include "ILightsWindow.h" #include "../Filters/Filters.h" #include "../Track/Track.h" +#include "ColumnSizer.h" namespace trview { @@ -38,6 +39,7 @@ namespace trview void render_light_details(); bool render_lights_window(); void setup_filters(); + void calculate_column_widths(); std::vector> _all_lights; std::shared_ptr _clipboard; @@ -53,5 +55,6 @@ namespace trview Filters _filters; bool _force_sort{ false }; Track _track; + ColumnSizer _column_sizer; }; } From 5f82ccdb2e3d1a8809d70e68a583d46bbf18f342 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 1 May 2024 18:32:54 +0100 Subject: [PATCH 12/38] Remove the X button on save in route window Just have a context menu instead because the sizing is tricky. --- trview.app.ui.tests/RouteWindowTests.cpp | 3 ++- trview.app/Windows/RouteWindow.cpp | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/trview.app.ui.tests/RouteWindowTests.cpp b/trview.app.ui.tests/RouteWindowTests.cpp index 39f74132f..07d7fbef4 100644 --- a/trview.app.ui.tests/RouteWindowTests.cpp +++ b/trview.app.ui.tests/RouteWindowTests.cpp @@ -240,7 +240,8 @@ void register_route_window_tests(ImGuiTestEngine* engine) context.ptr = register_test_module().build(); context.ptr->set_route(route); - ctx->ItemClick("/**/X"); + ctx->ItemClick("/**/SAVEGAME.0", ImGuiMouseButton_Right); + ctx->ItemClick("/**/Remove"); IM_CHECK_EQ(Mock::VerifyAndClearExpectations(route.get()), true); IM_CHECK_EQ(Mock::VerifyAndClearExpectations(waypoint.get()), true); diff --git a/trview.app/Windows/RouteWindow.cpp b/trview.app/Windows/RouteWindow.cpp index 41ec4a23e..22246c3e8 100644 --- a/trview.app/Windows/RouteWindow.cpp +++ b/trview.app/Windows/RouteWindow.cpp @@ -263,7 +263,8 @@ namespace trview if (!is_rando) { const std::string save_text = waypoint->has_save() ? "SAVEGAME.0" : Names::attach_save.c_str(); - if (ImGui::Button(save_text.c_str(), ImVec2(-24, 18))) + + if (ImGui::Button(save_text.c_str(), ImVec2(-1, 0))) { if (!waypoint->has_save()) { @@ -302,14 +303,15 @@ namespace trview } } } - ImGui::SameLine(); - if (ImGui::Button(Names::clear_save.c_str(), ImVec2(-1, 0))) + + if (ImGui::BeginPopupContextItem()) { - if (waypoint->has_save()) + if (ImGui::MenuItem("Remove", nullptr, nullptr, waypoint->has_save())) { waypoint->set_save_file({}); route->set_unsaved(true); } + ImGui::EndPopup(); } } From 388cf1aca2de74b70b63964bf9238b2ba66635a1 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 19:30:04 +0100 Subject: [PATCH 13/38] Freetype using vcpkg --- external/imgui/imconfig.h | 2 +- trview.app/Application.cpp | 28 +++++++++++++++++++++++++-- trview.app/ApplicationCreate.cpp | 2 +- trview.app/UI/SettingsWindow.cpp | 33 ++++++++++++++++++++++---------- trview.app/UI/SettingsWindow.h | 4 +++- trview.app/UI/ViewerUI.cpp | 7 +------ trview/stdafx.h | 4 ++++ trview/trview.vcxproj | 32 ++++++++++++++++++++----------- trview/trview.vcxproj.filters | 32 +++++++++++++++++++++++++++++++ trview/vcpkg-configuration.json | 14 ++++++++++++++ trview/vcpkg.json | 3 +++ 11 files changed, 129 insertions(+), 32 deletions(-) create mode 100644 trview/vcpkg-configuration.json create mode 100644 trview/vcpkg.json diff --git a/external/imgui/imconfig.h b/external/imgui/imconfig.h index d556cbaf1..9bd5d1c21 100644 --- a/external/imgui/imconfig.h +++ b/external/imgui/imconfig.h @@ -76,7 +76,7 @@ //---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui) // Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). // On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. -//#define IMGUI_ENABLE_FREETYPE +#define IMGUI_ENABLE_FREETYPE //---- Use FreeType+lunasvg library to render OpenType SVG fonts (SVGinOT) // Requires lunasvg headers to be available in the include path + program to be linked with the lunasvg library (not provided). diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index 80358fd70..2aee3de8c 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -696,9 +696,33 @@ namespace trview if (_new_font.has_value()) { ImGuiIO& io = ImGui::GetIO(); - _font = io.Fonts->AddFontFromFileTTF((std::format("{}\\{}", _files->fonts_directory(), _new_font.value().filename)).c_str(), _new_font.value().size); - _new_font.reset(); + auto new_font = io.Fonts->AddFontFromFileTTF((std::format("{}\\{}", _files->fonts_directory(), _new_font.value().filename)).c_str(), _new_font.value().size); _imgui_backend->rebuild_fonts(); + + bool revert = true; + if (new_font && new_font->Glyphs.Size > 0) + { + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + if (width > 0 && height > 0) + { + _font = new_font; + revert = false; + } + } + + if (revert) + { + io.Fonts->Clear(); + _font = io.Fonts->AddFontFromFileTTF((std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename)).c_str(), _settings.font.size); + } + else + { + _settings.font = _new_font.value(); + _viewer->set_settings(_settings); + } + _new_font.reset(); } _imgui_backend->new_frame(); diff --git a/trview.app/ApplicationCreate.cpp b/trview.app/ApplicationCreate.cpp index b31d5e95d..961eb9e56 100644 --- a/trview.app/ApplicationCreate.cpp +++ b/trview.app/ApplicationCreate.cpp @@ -282,7 +282,7 @@ namespace trview texture_storage, shortcuts, map_renderer_source, - std::make_unique(dialogs, shell), + std::make_unique(dialogs, shell, files), std::make_unique(), std::make_unique(), std::make_unique(), diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index 4db3a35b6..9ff53e162 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -1,10 +1,13 @@ #include "SettingsWindow.h" +// #include +#include +#include namespace trview { namespace { - std::vector get_ye_fonts() + std::vector get_ye_fonts(IFiles&) { std::vector available_fonts; @@ -34,12 +37,22 @@ namespace trview std::wstring(value_string).ends_with(L".ttf") && std::wstring(&value[0]).ends_with(L" (TrueType)")) { - const auto name = to_utf8(&value[0]); - available_fonts.push_back( - { - .name = name.substr(0, name.length() - 11), - .filename = to_utf8(value_string) - }); + //if (auto file = files.load_file(std::format(L"{}\\{}", to_utf16(files.fonts_directory()), value_string))) + //{ + // stbtt_fontinfo info{}; + // if (stbtt_InitFont(&info, &file.value()[0], 0)) + // { + // if (info.numGlyphs > 0) + // { + const auto name = to_utf8(&value[0]); + available_fonts.push_back( + { + .name = name.substr(0, name.length() - 11), + .filename = to_utf8(value_string) + }); + // } + // } + // } } } } @@ -54,8 +67,8 @@ namespace trview { } - SettingsWindow::SettingsWindow(const std::shared_ptr& dialogs, const std::shared_ptr& shell) - : _dialogs(dialogs), _shell(shell) + SettingsWindow::SettingsWindow(const std::shared_ptr& dialogs, const std::shared_ptr& shell, const std::shared_ptr& files) + : _dialogs(dialogs), _shell(shell), _files(files) { } @@ -322,7 +335,7 @@ namespace trview _visible = !_visible; if (_visible) { - _fonts = get_ye_fonts(); + _fonts = get_ye_fonts(*_files); } } diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index 0fd27f2f8..dc3132a96 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -7,6 +7,7 @@ #include #include +#include namespace trview { @@ -40,7 +41,7 @@ namespace trview static inline const std::string reset_fov = "Reset##Fov"; }; - explicit SettingsWindow(const std::shared_ptr& dialogs, const std::shared_ptr& shell); + explicit SettingsWindow(const std::shared_ptr& dialogs, const std::shared_ptr& shell, const std::shared_ptr& files); virtual ~SettingsWindow() = default; virtual void render() override; virtual void set_vsync(bool value) override; @@ -97,5 +98,6 @@ namespace trview std::vector _plugin_directories; FontSetting _selected_font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; std::vector _fonts; + std::shared_ptr _files; }; } diff --git a/trview.app/UI/ViewerUI.cpp b/trview.app/UI/ViewerUI.cpp index 08f2c2c35..964c4d6fa 100644 --- a/trview.app/UI/ViewerUI.cpp +++ b/trview.app/UI/ViewerUI.cpp @@ -152,12 +152,7 @@ namespace trview forward_setting(_settings_window->on_camera_fov, _settings.fov); forward_setting(_settings_window->on_camera_sink_startup, _settings.camera_sink_startup); forward_setting(_settings_window->on_plugin_directories, _settings.plugin_directories); - _token_store += _settings_window->on_font += [this](auto&& font) - { - _settings.font = font; - on_settings(_settings); - on_font(font); - }; + _settings_window->on_font += on_font; _camera_position = std::make_unique(); _camera_position->on_position_changed += on_camera_position; diff --git a/trview/stdafx.h b/trview/stdafx.h index db0430a6e..f350575fc 100644 --- a/trview/stdafx.h +++ b/trview/stdafx.h @@ -10,3 +10,7 @@ #define NOMINMAX #define WIN32_LEAN_AND_MEAN #include + +#define IMGUI_DEFINE_MATH_OPERATORS +#include +#include \ No newline at end of file diff --git a/trview/trview.vcxproj b/trview/trview.vcxproj index 9e29fb53c..2e14624ff 100644 --- a/trview/trview.vcxproj +++ b/trview/trview.vcxproj @@ -89,7 +89,7 @@ Disabled WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc + $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include stdcpplatest stdafx.h MultiThreadedDebug @@ -99,7 +99,8 @@ Windows true - d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;%(AdditionalDependencies) + d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies) + $(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories) $(SolutionDir); @@ -112,7 +113,7 @@ Disabled _DEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc + $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include stdcpplatest stdafx.h MultiThreadedDebug @@ -122,7 +123,8 @@ Windows true - d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;%(AdditionalDependencies) + d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies) + $(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories) $(SolutionDir); @@ -137,7 +139,7 @@ true WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc + $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include stdcpplatest stdafx.h MultiThreaded @@ -149,7 +151,8 @@ true true true - d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;%(AdditionalDependencies) + d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies) + $(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories) $(SolutionDir); @@ -164,7 +167,7 @@ true NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true - $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc + $(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include stdcpplatest stdafx.h MultiThreaded @@ -176,16 +179,26 @@ true true true - d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;%(AdditionalDependencies) + d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies) + $(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories) $(SolutionDir); + + + + + + + + + Create Create @@ -198,9 +211,6 @@ {a11566d3-4081-42c9-94c5-f4057edd9d50} - - {6aabd08e-3361-4d84-88f0-851ee588162a} - {8ffb19fa-1c9d-4d9c-ab96-844bf695e79c} diff --git a/trview/trview.vcxproj.filters b/trview/trview.vcxproj.filters index 4734a2b42..9db409acc 100644 --- a/trview/trview.vcxproj.filters +++ b/trview/trview.vcxproj.filters @@ -2,9 +2,41 @@ + + ImGui + + + ImGui + + + ImGui + + + ImGui + + + ImGui + + + ImGui + + + ImGui + + + ImGui + + + ImGui + + + + + {7d46556b-4039-4beb-b6c9-ab325e789f78} + \ No newline at end of file diff --git a/trview/vcpkg-configuration.json b/trview/vcpkg-configuration.json new file mode 100644 index 000000000..c540ec736 --- /dev/null +++ b/trview/vcpkg-configuration.json @@ -0,0 +1,14 @@ +{ + "default-registry": { + "kind": "git", + "baseline": "000d1bda1ffa95a73e0b40334fa4103d6f4d3d48", + "repository": "https://github.com/microsoft/vcpkg" + }, + "registries": [ + { + "kind": "artifact", + "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", + "name": "microsoft" + } + ] +} diff --git a/trview/vcpkg.json b/trview/vcpkg.json new file mode 100644 index 000000000..de021811d --- /dev/null +++ b/trview/vcpkg.json @@ -0,0 +1,3 @@ +{ + "dependencies": [ "freetype"] +} From a08379017bb8e4811594e0357919b9de4d9aa8a8 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 19:54:25 +0100 Subject: [PATCH 14/38] Add freetype --- external/freetype/builds/windows/ftdebug.c | 698 ++ external/freetype/builds/windows/ftsystem.c | 499 + .../builds/windows/vc2010/freetype.vcxproj | 245 + .../windows/vc2010/freetype.vcxproj.filters | 149 + .../include/freetype/config/ftconfig.h | 51 + .../include/freetype/config/ftheader.h | 836 ++ .../include/freetype/config/ftmodule.h | 33 + .../include/freetype/config/ftoption.h | 1014 ++ .../include/freetype/config/ftstdlib.h | 185 + .../include/freetype/config/integer-types.h | 250 + .../include/freetype/config/mac-support.h | 49 + .../include/freetype/config/public-macros.h | 138 + external/freetype/include/freetype/freetype.h | 5337 ++++++++++ external/freetype/include/freetype/ftadvanc.h | 188 + external/freetype/include/freetype/ftbbox.h | 101 + external/freetype/include/freetype/ftbdf.h | 212 + external/freetype/include/freetype/ftbitmap.h | 329 + external/freetype/include/freetype/ftbzip2.h | 102 + external/freetype/include/freetype/ftcache.h | 1087 ++ .../freetype/include/freetype/ftchapters.h | 168 + external/freetype/include/freetype/ftcid.h | 167 + external/freetype/include/freetype/ftcolor.h | 1667 +++ external/freetype/include/freetype/ftdriver.h | 1246 +++ external/freetype/include/freetype/fterrdef.h | 283 + external/freetype/include/freetype/fterrors.h | 296 + external/freetype/include/freetype/ftfntfmt.h | 93 + external/freetype/include/freetype/ftgasp.h | 143 + external/freetype/include/freetype/ftglyph.h | 750 ++ external/freetype/include/freetype/ftgxval.h | 354 + external/freetype/include/freetype/ftgzip.h | 151 + external/freetype/include/freetype/ftimage.h | 1284 +++ external/freetype/include/freetype/ftincrem.h | 348 + external/freetype/include/freetype/ftlcdfil.h | 323 + external/freetype/include/freetype/ftlist.h | 296 + .../freetype/include/freetype/ftlogging.h | 184 + external/freetype/include/freetype/ftlzw.h | 100 + external/freetype/include/freetype/ftmac.h | 289 + external/freetype/include/freetype/ftmm.h | 805 ++ external/freetype/include/freetype/ftmodapi.h | 807 ++ external/freetype/include/freetype/ftmoderr.h | 204 + external/freetype/include/freetype/ftotval.h | 206 + external/freetype/include/freetype/ftoutln.h | 588 + external/freetype/include/freetype/ftparams.h | 218 + external/freetype/include/freetype/ftpfr.h | 179 + external/freetype/include/freetype/ftrender.h | 244 + external/freetype/include/freetype/ftsizes.h | 159 + external/freetype/include/freetype/ftsnames.h | 272 + external/freetype/include/freetype/ftstroke.h | 773 ++ external/freetype/include/freetype/ftsynth.h | 104 + external/freetype/include/freetype/ftsystem.h | 350 + external/freetype/include/freetype/fttrigon.h | 350 + external/freetype/include/freetype/fttypes.h | 617 ++ external/freetype/include/freetype/ftwinfnt.h | 276 + .../include/freetype/internal/autohint.h | 234 + .../include/freetype/internal/cffotypes.h | 107 + .../include/freetype/internal/cfftypes.h | 416 + .../freetype/internal/compiler-macros.h | 343 + .../include/freetype/internal/ftcalc.h | 581 + .../include/freetype/internal/ftdebug.h | 442 + .../include/freetype/internal/ftdrv.h | 289 + .../include/freetype/internal/ftgloadr.h | 147 + .../include/freetype/internal/fthash.h | 135 + .../include/freetype/internal/ftmemory.h | 398 + .../include/freetype/internal/ftmmtypes.h | 91 + .../include/freetype/internal/ftobjs.h | 1238 +++ .../include/freetype/internal/ftpsprop.h | 47 + .../include/freetype/internal/ftrfork.h | 245 + .../include/freetype/internal/ftserv.h | 495 + .../include/freetype/internal/ftstream.h | 570 + .../include/freetype/internal/fttrace.h | 172 + .../include/freetype/internal/ftvalid.h | 160 + .../include/freetype/internal/psaux.h | 1434 +++ .../include/freetype/internal/pshints.h | 699 ++ .../freetype/internal/services/svbdf.h | 66 + .../freetype/internal/services/svcfftl.h | 90 + .../freetype/internal/services/svcid.h | 69 + .../freetype/internal/services/svfntfmt.h | 55 + .../freetype/internal/services/svgldict.h | 72 + .../freetype/internal/services/svgxval.h | 72 + .../freetype/internal/services/svkern.h | 51 + .../freetype/internal/services/svmetric.h | 131 + .../include/freetype/internal/services/svmm.h | 214 + .../freetype/internal/services/svotval.h | 55 + .../freetype/internal/services/svpfr.h | 65 + .../freetype/internal/services/svpostnm.h | 65 + .../freetype/internal/services/svprop.h | 66 + .../freetype/internal/services/svpscmap.h | 145 + .../freetype/internal/services/svpsinfo.h | 86 + .../freetype/internal/services/svsfnt.h | 88 + .../freetype/internal/services/svttcmap.h | 90 + .../freetype/internal/services/svtteng.h | 53 + .../freetype/internal/services/svttglyf.h | 56 + .../freetype/internal/services/svwinfnt.h | 50 + .../freetype/include/freetype/internal/sfnt.h | 1092 ++ .../include/freetype/internal/svginterface.h | 46 + .../include/freetype/internal/t1types.h | 259 + .../include/freetype/internal/tttypes.h | 1741 +++ .../include/freetype/internal/wofftypes.h | 312 + external/freetype/include/freetype/otsvg.h | 336 + external/freetype/include/freetype/t1tables.h | 793 ++ external/freetype/include/freetype/ttnameid.h | 1235 +++ external/freetype/include/freetype/tttables.h | 855 ++ external/freetype/include/freetype/tttags.h | 124 + external/freetype/include/ft2build.h | 42 + external/freetype/objs/freetype.dll | Bin 0 -> 1891328 bytes external/freetype/objs/freetype.dll.recipe | 11 + external/freetype/objs/freetype.exp | Bin 0 -> 29563 bytes external/freetype/objs/freetype.lib | Bin 0 -> 4194882 bytes external/freetype/objs/freetype.lib.recipe | 7 + .../freetype.vcxproj.FileListAbsolute.txt | 1 + external/freetype/src/autofit/afblue.c | 779 ++ external/freetype/src/autofit/afblue.cin | 39 + external/freetype/src/autofit/afblue.dat | 1121 ++ external/freetype/src/autofit/afblue.h | 429 + external/freetype/src/autofit/afblue.hin | 146 + external/freetype/src/autofit/afcjk.c | 2383 +++++ external/freetype/src/autofit/afcjk.h | 141 + external/freetype/src/autofit/afcover.h | 105 + external/freetype/src/autofit/afdummy.c | 77 + external/freetype/src/autofit/afdummy.h | 40 + external/freetype/src/autofit/aferrors.h | 42 + external/freetype/src/autofit/afglobal.c | 513 + external/freetype/src/autofit/afglobal.h | 173 + external/freetype/src/autofit/afhints.c | 1796 ++++ external/freetype/src/autofit/afhints.h | 467 + external/freetype/src/autofit/afindic.c | 157 + external/freetype/src/autofit/afindic.h | 41 + external/freetype/src/autofit/aflatin.c | 3644 +++++++ external/freetype/src/autofit/aflatin.h | 194 + external/freetype/src/autofit/afloader.c | 706 ++ external/freetype/src/autofit/afloader.h | 91 + external/freetype/src/autofit/afmodule.c | 527 + external/freetype/src/autofit/afmodule.h | 55 + external/freetype/src/autofit/afranges.c | 1072 ++ external/freetype/src/autofit/afranges.h | 47 + external/freetype/src/autofit/afscript.h | 408 + external/freetype/src/autofit/afshaper.c | 690 ++ external/freetype/src/autofit/afshaper.h | 71 + external/freetype/src/autofit/afstyles.h | 487 + external/freetype/src/autofit/aftypes.h | 511 + external/freetype/src/autofit/afws-decl.h | 33 + external/freetype/src/autofit/afws-iter.h | 31 + external/freetype/src/autofit/autofit.c | 35 + external/freetype/src/autofit/ft-hb.c | 115 + external/freetype/src/autofit/ft-hb.h | 48 + external/freetype/src/autofit/module.mk | 23 + external/freetype/src/autofit/rules.mk | 88 + external/freetype/src/base/ftadvanc.c | 174 + external/freetype/src/base/ftbase.c | 41 + external/freetype/src/base/ftbase.h | 82 + external/freetype/src/base/ftbbox.c | 542 + external/freetype/src/base/ftbdf.c | 90 + external/freetype/src/base/ftbitmap.c | 1144 ++ external/freetype/src/base/ftcalc.c | 1127 ++ external/freetype/src/base/ftcid.c | 117 + external/freetype/src/base/ftcolor.c | 156 + external/freetype/src/base/ftdbgmem.c | 971 ++ external/freetype/src/base/ftdebug.c | 644 ++ external/freetype/src/base/fterrors.c | 45 + external/freetype/src/base/ftfntfmt.c | 54 + external/freetype/src/base/ftfstype.c | 61 + external/freetype/src/base/ftgasp.c | 60 + external/freetype/src/base/ftgloadr.c | 392 + external/freetype/src/base/ftglyph.c | 911 ++ external/freetype/src/base/ftgxval.c | 141 + external/freetype/src/base/fthash.c | 338 + external/freetype/src/base/ftinit.c | 263 + external/freetype/src/base/ftlcdfil.c | 437 + external/freetype/src/base/ftmac.c | 1090 ++ external/freetype/src/base/ftmm.c | 704 ++ external/freetype/src/base/ftobjs.c | 5914 +++++++++++ external/freetype/src/base/ftotval.c | 90 + external/freetype/src/base/ftoutln.c | 1118 ++ external/freetype/src/base/ftpatent.c | 50 + external/freetype/src/base/ftpfr.c | 152 + external/freetype/src/base/ftpsprop.c | 284 + external/freetype/src/base/ftrfork.c | 934 ++ external/freetype/src/base/ftsnames.c | 185 + external/freetype/src/base/ftstream.c | 872 ++ external/freetype/src/base/ftstroke.c | 2403 +++++ external/freetype/src/base/ftsynth.c | 180 + external/freetype/src/base/ftsystem.c | 338 + external/freetype/src/base/fttrigon.c | 517 + external/freetype/src/base/fttype1.c | 126 + external/freetype/src/base/ftutil.c | 442 + external/freetype/src/base/ftver.rc | 61 + external/freetype/src/base/ftwinfnt.c | 52 + external/freetype/src/base/md5.c | 291 + external/freetype/src/base/md5.h | 45 + external/freetype/src/base/rules.mk | 108 + external/freetype/src/bdf/README | 152 + external/freetype/src/bdf/bdf.c | 34 + external/freetype/src/bdf/bdf.h | 253 + external/freetype/src/bdf/bdfdrivr.c | 1013 ++ external/freetype/src/bdf/bdfdrivr.h | 72 + external/freetype/src/bdf/bdferror.h | 45 + external/freetype/src/bdf/bdflib.c | 2387 +++++ external/freetype/src/bdf/module.mk | 34 + external/freetype/src/bdf/rules.mk | 84 + external/freetype/src/bzip2/ftbzip2.c | 535 + external/freetype/src/bzip2/rules.mk | 64 + external/freetype/src/cache/ftcache.c | 31 + external/freetype/src/cache/ftcbasic.c | 638 ++ external/freetype/src/cache/ftccache.c | 599 ++ external/freetype/src/cache/ftccache.h | 355 + external/freetype/src/cache/ftccback.h | 93 + external/freetype/src/cache/ftccmap.c | 323 + external/freetype/src/cache/ftcerror.h | 42 + external/freetype/src/cache/ftcglyph.c | 204 + external/freetype/src/cache/ftcglyph.h | 315 + external/freetype/src/cache/ftcimage.c | 164 + external/freetype/src/cache/ftcimage.h | 106 + external/freetype/src/cache/ftcmanag.c | 696 ++ external/freetype/src/cache/ftcmanag.h | 175 + external/freetype/src/cache/ftcmru.c | 352 + external/freetype/src/cache/ftcmru.h | 248 + external/freetype/src/cache/ftcsbits.c | 414 + external/freetype/src/cache/ftcsbits.h | 91 + external/freetype/src/cache/rules.mk | 85 + external/freetype/src/cff/cff.c | 28 + external/freetype/src/cff/cffcmap.c | 230 + external/freetype/src/cff/cffcmap.h | 67 + external/freetype/src/cff/cffdrivr.c | 1263 +++ external/freetype/src/cff/cffdrivr.h | 35 + external/freetype/src/cff/cfferrs.h | 42 + external/freetype/src/cff/cffgload.c | 762 ++ external/freetype/src/cff/cffgload.h | 62 + external/freetype/src/cff/cffload.c | 2579 +++++ external/freetype/src/cff/cffload.h | 124 + external/freetype/src/cff/cffobjs.c | 1204 +++ external/freetype/src/cff/cffobjs.h | 84 + external/freetype/src/cff/cffparse.c | 1513 +++ external/freetype/src/cff/cffparse.h | 143 + external/freetype/src/cff/cfftoken.h | 150 + external/freetype/src/cff/module.mk | 23 + external/freetype/src/cff/rules.mk | 75 + external/freetype/src/cid/ciderrs.h | 41 + external/freetype/src/cid/cidgload.c | 618 ++ external/freetype/src/cid/cidgload.h | 58 + external/freetype/src/cid/cidload.c | 950 ++ external/freetype/src/cid/cidload.h | 52 + external/freetype/src/cid/cidobjs.c | 543 + external/freetype/src/cid/cidobjs.h | 154 + external/freetype/src/cid/cidparse.c | 286 + external/freetype/src/cid/cidparse.h | 130 + external/freetype/src/cid/cidriver.c | 274 + external/freetype/src/cid/cidriver.h | 36 + external/freetype/src/cid/cidtoken.h | 115 + external/freetype/src/cid/module.mk | 23 + external/freetype/src/cid/rules.mk | 73 + external/freetype/src/cid/type1cid.c | 28 + external/freetype/src/dlg/dlgwrap.c | 32 + external/freetype/src/dlg/rules.mk | 70 + external/freetype/src/gxvalid/README | 532 + external/freetype/src/gxvalid/gxvalid.c | 46 + external/freetype/src/gxvalid/gxvalid.h | 107 + external/freetype/src/gxvalid/gxvbsln.c | 334 + external/freetype/src/gxvalid/gxvcommn.c | 1747 +++ external/freetype/src/gxvalid/gxvcommn.h | 584 + external/freetype/src/gxvalid/gxverror.h | 51 + external/freetype/src/gxvalid/gxvfeat.c | 339 + external/freetype/src/gxvalid/gxvfeat.h | 173 + external/freetype/src/gxvalid/gxvfgen.c | 484 + external/freetype/src/gxvalid/gxvjust.c | 721 ++ external/freetype/src/gxvalid/gxvkern.c | 920 ++ external/freetype/src/gxvalid/gxvlcar.c | 224 + external/freetype/src/gxvalid/gxvmod.c | 288 + external/freetype/src/gxvalid/gxvmod.h | 46 + external/freetype/src/gxvalid/gxvmort.c | 301 + external/freetype/src/gxvalid/gxvmort.h | 99 + external/freetype/src/gxvalid/gxvmort0.c | 152 + external/freetype/src/gxvalid/gxvmort1.c | 260 + external/freetype/src/gxvalid/gxvmort2.c | 312 + external/freetype/src/gxvalid/gxvmort4.c | 126 + external/freetype/src/gxvalid/gxvmort5.c | 234 + external/freetype/src/gxvalid/gxvmorx.c | 199 + external/freetype/src/gxvalid/gxvmorx.h | 73 + external/freetype/src/gxvalid/gxvmorx0.c | 112 + external/freetype/src/gxvalid/gxvmorx1.c | 278 + external/freetype/src/gxvalid/gxvmorx2.c | 331 + external/freetype/src/gxvalid/gxvmorx4.c | 56 + external/freetype/src/gxvalid/gxvmorx5.c | 226 + external/freetype/src/gxvalid/gxvopbd.c | 218 + external/freetype/src/gxvalid/gxvprop.c | 330 + external/freetype/src/gxvalid/gxvtrak.c | 288 + external/freetype/src/gxvalid/module.mk | 23 + external/freetype/src/gxvalid/rules.mk | 98 + external/freetype/src/gzip/README.freetype | 23 + external/freetype/src/gzip/adler32.c | 192 + external/freetype/src/gzip/crc32.c | 1135 ++ external/freetype/src/gzip/crc32.h | 9446 +++++++++++++++++ external/freetype/src/gzip/ftgzip.c | 805 ++ external/freetype/src/gzip/ftzconf.h | 547 + external/freetype/src/gzip/gzguts.h | 219 + external/freetype/src/gzip/inffast.c | 323 + external/freetype/src/gzip/inffast.h | 11 + external/freetype/src/gzip/inffixed.h | 94 + external/freetype/src/gzip/inflate.c | 1605 +++ external/freetype/src/gzip/inflate.h | 131 + external/freetype/src/gzip/inftrees.c | 304 + external/freetype/src/gzip/inftrees.h | 67 + .../src/gzip/patches/freetype-zlib.diff | 469 + external/freetype/src/gzip/rules.mk | 81 + external/freetype/src/gzip/zlib.h | 1971 ++++ external/freetype/src/gzip/zutil.c | 334 + external/freetype/src/gzip/zutil.h | 281 + external/freetype/src/lzw/ftlzw.c | 415 + external/freetype/src/lzw/ftzopen.c | 429 + external/freetype/src/lzw/ftzopen.h | 174 + external/freetype/src/lzw/rules.mk | 72 + external/freetype/src/otvalid/module.mk | 23 + external/freetype/src/otvalid/otvalid.c | 31 + external/freetype/src/otvalid/otvalid.h | 77 + external/freetype/src/otvalid/otvbase.c | 345 + external/freetype/src/otvalid/otvcommn.c | 1099 ++ external/freetype/src/otvalid/otvcommn.h | 468 + external/freetype/src/otvalid/otverror.h | 42 + external/freetype/src/otvalid/otvgdef.c | 303 + external/freetype/src/otvalid/otvgpos.c | 1051 ++ external/freetype/src/otvalid/otvgpos.h | 36 + external/freetype/src/otvalid/otvgsub.c | 627 ++ external/freetype/src/otvalid/otvjstf.c | 259 + external/freetype/src/otvalid/otvmath.c | 453 + external/freetype/src/otvalid/otvmod.c | 281 + external/freetype/src/otvalid/otvmod.h | 38 + external/freetype/src/otvalid/rules.mk | 81 + external/freetype/src/pcf/README | 96 + external/freetype/src/pcf/module.mk | 34 + external/freetype/src/pcf/pcf.c | 35 + external/freetype/src/pcf/pcf.h | 251 + external/freetype/src/pcf/pcfdrivr.c | 836 ++ external/freetype/src/pcf/pcfdrivr.h | 44 + external/freetype/src/pcf/pcferror.h | 41 + external/freetype/src/pcf/pcfread.c | 1731 +++ external/freetype/src/pcf/pcfread.h | 44 + external/freetype/src/pcf/pcfutil.c | 119 + external/freetype/src/pcf/pcfutil.h | 55 + external/freetype/src/pcf/rules.mk | 82 + external/freetype/src/pfr/module.mk | 23 + external/freetype/src/pfr/pfr.c | 29 + external/freetype/src/pfr/pfrcmap.c | 188 + external/freetype/src/pfr/pfrcmap.h | 45 + external/freetype/src/pfr/pfrdrivr.c | 212 + external/freetype/src/pfr/pfrdrivr.h | 36 + external/freetype/src/pfr/pfrerror.h | 41 + external/freetype/src/pfr/pfrgload.c | 849 ++ external/freetype/src/pfr/pfrgload.h | 49 + external/freetype/src/pfr/pfrload.c | 1062 ++ external/freetype/src/pfr/pfrload.h | 123 + external/freetype/src/pfr/pfrobjs.c | 603 ++ external/freetype/src/pfr/pfrobjs.h | 96 + external/freetype/src/pfr/pfrsbit.c | 813 ++ external/freetype/src/pfr/pfrsbit.h | 37 + external/freetype/src/pfr/pfrtypes.h | 331 + external/freetype/src/pfr/rules.mk | 76 + external/freetype/src/psaux/afmparse.c | 1094 ++ external/freetype/src/psaux/afmparse.h | 88 + external/freetype/src/psaux/cffdecode.c | 2423 +++++ external/freetype/src/psaux/cffdecode.h | 63 + external/freetype/src/psaux/module.mk | 23 + external/freetype/src/psaux/psarrst.c | 240 + external/freetype/src/psaux/psarrst.h | 99 + external/freetype/src/psaux/psaux.c | 40 + external/freetype/src/psaux/psauxerr.h | 42 + external/freetype/src/psaux/psauxmod.c | 190 + external/freetype/src/psaux/psauxmod.h | 60 + external/freetype/src/psaux/psblues.c | 583 + external/freetype/src/psaux/psblues.h | 185 + external/freetype/src/psaux/psconv.c | 610 ++ external/freetype/src/psaux/psconv.h | 70 + external/freetype/src/psaux/pserror.c | 52 + external/freetype/src/psaux/pserror.h | 120 + external/freetype/src/psaux/psfixed.h | 94 + external/freetype/src/psaux/psfont.c | 566 + external/freetype/src/psaux/psfont.h | 134 + external/freetype/src/psaux/psft.c | 895 ++ external/freetype/src/psaux/psft.h | 167 + external/freetype/src/psaux/psglue.h | 144 + external/freetype/src/psaux/pshints.c | 1952 ++++ external/freetype/src/psaux/pshints.h | 288 + external/freetype/src/psaux/psintrp.c | 3059 ++++++ external/freetype/src/psaux/psintrp.h | 83 + external/freetype/src/psaux/psobjs.c | 2562 +++++ external/freetype/src/psaux/psobjs.h | 312 + external/freetype/src/psaux/psread.c | 112 + external/freetype/src/psaux/psread.h | 68 + external/freetype/src/psaux/psstack.c | 329 + external/freetype/src/psaux/psstack.h | 122 + external/freetype/src/psaux/pstypes.h | 77 + external/freetype/src/psaux/rules.mk | 89 + external/freetype/src/psaux/t1cmap.c | 393 + external/freetype/src/psaux/t1cmap.h | 104 + external/freetype/src/psaux/t1decode.c | 2159 ++++ external/freetype/src/psaux/t1decode.h | 73 + external/freetype/src/pshinter/module.mk | 23 + external/freetype/src/pshinter/pshalgo.c | 2191 ++++ external/freetype/src/pshinter/pshalgo.h | 233 + external/freetype/src/pshinter/pshglob.c | 795 ++ external/freetype/src/pshinter/pshglob.h | 196 + external/freetype/src/pshinter/pshinter.c | 27 + external/freetype/src/pshinter/pshmod.c | 125 + external/freetype/src/pshinter/pshmod.h | 38 + external/freetype/src/pshinter/pshnterr.h | 41 + external/freetype/src/pshinter/pshrec.c | 1224 +++ external/freetype/src/pshinter/pshrec.h | 171 + external/freetype/src/pshinter/rules.mk | 75 + external/freetype/src/psnames/module.mk | 23 + external/freetype/src/psnames/psmodule.c | 621 ++ external/freetype/src/psnames/psmodule.h | 37 + external/freetype/src/psnames/psnamerr.h | 42 + external/freetype/src/psnames/psnames.c | 24 + external/freetype/src/psnames/pstables.h | 4238 ++++++++ external/freetype/src/psnames/rules.mk | 73 + external/freetype/src/raster/ftmisc.h | 139 + external/freetype/src/raster/ftraster.c | 3294 ++++++ external/freetype/src/raster/ftraster.h | 47 + external/freetype/src/raster/ftrend1.c | 209 + external/freetype/src/raster/ftrend1.h | 37 + external/freetype/src/raster/module.mk | 23 + external/freetype/src/raster/raster.c | 25 + external/freetype/src/raster/rasterrs.h | 42 + external/freetype/src/raster/rules.mk | 72 + external/freetype/src/sdf/ftbsdf.c | 1350 +++ external/freetype/src/sdf/ftsdf.c | 3932 +++++++ external/freetype/src/sdf/ftsdf.h | 97 + external/freetype/src/sdf/ftsdfcommon.c | 147 + external/freetype/src/sdf/ftsdfcommon.h | 141 + external/freetype/src/sdf/ftsdferrs.h | 37 + external/freetype/src/sdf/ftsdfrend.c | 603 ++ external/freetype/src/sdf/ftsdfrend.h | 118 + external/freetype/src/sdf/module.mk | 29 + external/freetype/src/sdf/rules.mk | 78 + external/freetype/src/sdf/sdf.c | 29 + external/freetype/src/sfnt/module.mk | 23 + external/freetype/src/sfnt/pngshim.c | 462 + external/freetype/src/sfnt/pngshim.h | 50 + external/freetype/src/sfnt/rules.mk | 86 + external/freetype/src/sfnt/sfdriver.c | 1369 +++ external/freetype/src/sfnt/sfdriver.h | 35 + external/freetype/src/sfnt/sferrors.h | 41 + external/freetype/src/sfnt/sfnt.c | 40 + external/freetype/src/sfnt/sfobjs.c | 1535 +++ external/freetype/src/sfnt/sfobjs.h | 58 + external/freetype/src/sfnt/sfwoff.c | 434 + external/freetype/src/sfnt/sfwoff.h | 43 + external/freetype/src/sfnt/sfwoff2.c | 2392 +++++ external/freetype/src/sfnt/sfwoff2.h | 78 + external/freetype/src/sfnt/ttbdf.c | 257 + external/freetype/src/sfnt/ttbdf.h | 49 + external/freetype/src/sfnt/ttcmap.c | 3902 +++++++ external/freetype/src/sfnt/ttcmap.h | 126 + external/freetype/src/sfnt/ttcmapc.h | 56 + external/freetype/src/sfnt/ttcolr.c | 1921 ++++ external/freetype/src/sfnt/ttcolr.h | 83 + external/freetype/src/sfnt/ttcpal.c | 310 + external/freetype/src/sfnt/ttcpal.h | 48 + external/freetype/src/sfnt/ttkern.c | 317 + external/freetype/src/sfnt/ttkern.h | 51 + external/freetype/src/sfnt/ttload.c | 1496 +++ external/freetype/src/sfnt/ttload.h | 111 + external/freetype/src/sfnt/ttmtx.c | 338 + external/freetype/src/sfnt/ttmtx.h | 54 + external/freetype/src/sfnt/ttpost.c | 484 + external/freetype/src/sfnt/ttpost.h | 46 + external/freetype/src/sfnt/ttsbit.c | 1685 +++ external/freetype/src/sfnt/ttsbit.h | 62 + external/freetype/src/sfnt/ttsvg.c | 413 + external/freetype/src/sfnt/ttsvg.h | 43 + external/freetype/src/sfnt/woff2tags.c | 119 + external/freetype/src/sfnt/woff2tags.h | 41 + external/freetype/src/smooth/ftgrays.c | 2244 ++++ external/freetype/src/smooth/ftgrays.h | 57 + external/freetype/src/smooth/ftsmerrs.h | 42 + external/freetype/src/smooth/ftsmooth.c | 605 ++ external/freetype/src/smooth/ftsmooth.h | 37 + external/freetype/src/smooth/module.mk | 23 + external/freetype/src/smooth/rules.mk | 73 + external/freetype/src/smooth/smooth.c | 25 + external/freetype/src/svg/ftsvg.c | 355 + external/freetype/src/svg/ftsvg.h | 35 + external/freetype/src/svg/module.mk | 23 + external/freetype/src/svg/rules.mk | 70 + external/freetype/src/svg/svg.c | 24 + external/freetype/src/svg/svgtypes.h | 42 + external/freetype/src/tools/afblue.pl | 551 + external/freetype/src/tools/apinames.c | 556 + external/freetype/src/tools/chktrcmp.py | 119 + external/freetype/src/tools/cordic.py | 32 + external/freetype/src/tools/ftrandom/Makefile | 45 + external/freetype/src/tools/ftrandom/README | 69 + .../freetype/src/tools/ftrandom/ftrandom.c | 720 ++ external/freetype/src/tools/glnames.py | 5533 ++++++++++ .../src/tools/make_distribution_archives.py | 208 + external/freetype/src/tools/no-copyright | 66 + external/freetype/src/tools/test_afm.c | 156 + external/freetype/src/tools/test_bbox.c | 187 + external/freetype/src/tools/test_trig.c | 257 + external/freetype/src/tools/update-copyright | 14 + .../freetype/src/tools/update-copyright-year | 157 + .../freetype/src/tools/vms_shorten_symbol.c | 250 + external/freetype/src/truetype/module.mk | 23 + external/freetype/src/truetype/rules.mk | 75 + external/freetype/src/truetype/truetype.c | 29 + external/freetype/src/truetype/ttdriver.c | 691 ++ external/freetype/src/truetype/ttdriver.h | 35 + external/freetype/src/truetype/tterrors.h | 42 + external/freetype/src/truetype/ttgload.c | 2743 +++++ external/freetype/src/truetype/ttgload.h | 61 + external/freetype/src/truetype/ttgxvar.c | 4661 ++++++++ external/freetype/src/truetype/ttgxvar.h | 453 + external/freetype/src/truetype/ttinterp.c | 7753 ++++++++++++++ external/freetype/src/truetype/ttinterp.h | 465 + external/freetype/src/truetype/ttobjs.c | 1539 +++ external/freetype/src/truetype/ttobjs.h | 426 + external/freetype/src/truetype/ttpload.c | 665 ++ external/freetype/src/truetype/ttpload.h | 74 + external/freetype/src/type1/module.mk | 23 + external/freetype/src/type1/rules.mk | 76 + external/freetype/src/type1/t1afm.c | 413 + external/freetype/src/type1/t1afm.h | 53 + external/freetype/src/type1/t1driver.c | 813 ++ external/freetype/src/type1/t1driver.h | 35 + external/freetype/src/type1/t1errors.h | 41 + external/freetype/src/type1/t1gload.c | 606 ++ external/freetype/src/type1/t1gload.h | 52 + external/freetype/src/type1/t1load.c | 2761 +++++ external/freetype/src/type1/t1load.h | 126 + external/freetype/src/type1/t1objs.c | 655 ++ external/freetype/src/type1/t1objs.h | 160 + external/freetype/src/type1/t1parse.c | 487 + external/freetype/src/type1/t1parse.h | 137 + external/freetype/src/type1/t1tokens.h | 143 + external/freetype/src/type1/type1.c | 29 + external/freetype/src/type42/module.mk | 23 + external/freetype/src/type42/rules.mk | 73 + external/freetype/src/type42/t42drivr.c | 248 + external/freetype/src/type42/t42drivr.h | 36 + external/freetype/src/type42/t42error.h | 41 + external/freetype/src/type42/t42objs.c | 698 ++ external/freetype/src/type42/t42objs.h | 123 + external/freetype/src/type42/t42parse.c | 1355 +++ external/freetype/src/type42/t42parse.h | 91 + external/freetype/src/type42/t42types.h | 56 + external/freetype/src/type42/type42.c | 26 + external/freetype/src/winfonts/fnterrs.h | 42 + external/freetype/src/winfonts/module.mk | 23 + external/freetype/src/winfonts/rules.mk | 68 + external/freetype/src/winfonts/winfnt.c | 1219 +++ external/freetype/src/winfonts/winfnt.h | 164 + 549 files changed, 249984 insertions(+) create mode 100644 external/freetype/builds/windows/ftdebug.c create mode 100644 external/freetype/builds/windows/ftsystem.c create mode 100644 external/freetype/builds/windows/vc2010/freetype.vcxproj create mode 100644 external/freetype/builds/windows/vc2010/freetype.vcxproj.filters create mode 100644 external/freetype/include/freetype/config/ftconfig.h create mode 100644 external/freetype/include/freetype/config/ftheader.h create mode 100644 external/freetype/include/freetype/config/ftmodule.h create mode 100644 external/freetype/include/freetype/config/ftoption.h create mode 100644 external/freetype/include/freetype/config/ftstdlib.h create mode 100644 external/freetype/include/freetype/config/integer-types.h create mode 100644 external/freetype/include/freetype/config/mac-support.h create mode 100644 external/freetype/include/freetype/config/public-macros.h create mode 100644 external/freetype/include/freetype/freetype.h create mode 100644 external/freetype/include/freetype/ftadvanc.h create mode 100644 external/freetype/include/freetype/ftbbox.h create mode 100644 external/freetype/include/freetype/ftbdf.h create mode 100644 external/freetype/include/freetype/ftbitmap.h create mode 100644 external/freetype/include/freetype/ftbzip2.h create mode 100644 external/freetype/include/freetype/ftcache.h create mode 100644 external/freetype/include/freetype/ftchapters.h create mode 100644 external/freetype/include/freetype/ftcid.h create mode 100644 external/freetype/include/freetype/ftcolor.h create mode 100644 external/freetype/include/freetype/ftdriver.h create mode 100644 external/freetype/include/freetype/fterrdef.h create mode 100644 external/freetype/include/freetype/fterrors.h create mode 100644 external/freetype/include/freetype/ftfntfmt.h create mode 100644 external/freetype/include/freetype/ftgasp.h create mode 100644 external/freetype/include/freetype/ftglyph.h create mode 100644 external/freetype/include/freetype/ftgxval.h create mode 100644 external/freetype/include/freetype/ftgzip.h create mode 100644 external/freetype/include/freetype/ftimage.h create mode 100644 external/freetype/include/freetype/ftincrem.h create mode 100644 external/freetype/include/freetype/ftlcdfil.h create mode 100644 external/freetype/include/freetype/ftlist.h create mode 100644 external/freetype/include/freetype/ftlogging.h create mode 100644 external/freetype/include/freetype/ftlzw.h create mode 100644 external/freetype/include/freetype/ftmac.h create mode 100644 external/freetype/include/freetype/ftmm.h create mode 100644 external/freetype/include/freetype/ftmodapi.h create mode 100644 external/freetype/include/freetype/ftmoderr.h create mode 100644 external/freetype/include/freetype/ftotval.h create mode 100644 external/freetype/include/freetype/ftoutln.h create mode 100644 external/freetype/include/freetype/ftparams.h create mode 100644 external/freetype/include/freetype/ftpfr.h create mode 100644 external/freetype/include/freetype/ftrender.h create mode 100644 external/freetype/include/freetype/ftsizes.h create mode 100644 external/freetype/include/freetype/ftsnames.h create mode 100644 external/freetype/include/freetype/ftstroke.h create mode 100644 external/freetype/include/freetype/ftsynth.h create mode 100644 external/freetype/include/freetype/ftsystem.h create mode 100644 external/freetype/include/freetype/fttrigon.h create mode 100644 external/freetype/include/freetype/fttypes.h create mode 100644 external/freetype/include/freetype/ftwinfnt.h create mode 100644 external/freetype/include/freetype/internal/autohint.h create mode 100644 external/freetype/include/freetype/internal/cffotypes.h create mode 100644 external/freetype/include/freetype/internal/cfftypes.h create mode 100644 external/freetype/include/freetype/internal/compiler-macros.h create mode 100644 external/freetype/include/freetype/internal/ftcalc.h create mode 100644 external/freetype/include/freetype/internal/ftdebug.h create mode 100644 external/freetype/include/freetype/internal/ftdrv.h create mode 100644 external/freetype/include/freetype/internal/ftgloadr.h create mode 100644 external/freetype/include/freetype/internal/fthash.h create mode 100644 external/freetype/include/freetype/internal/ftmemory.h create mode 100644 external/freetype/include/freetype/internal/ftmmtypes.h create mode 100644 external/freetype/include/freetype/internal/ftobjs.h create mode 100644 external/freetype/include/freetype/internal/ftpsprop.h create mode 100644 external/freetype/include/freetype/internal/ftrfork.h create mode 100644 external/freetype/include/freetype/internal/ftserv.h create mode 100644 external/freetype/include/freetype/internal/ftstream.h create mode 100644 external/freetype/include/freetype/internal/fttrace.h create mode 100644 external/freetype/include/freetype/internal/ftvalid.h create mode 100644 external/freetype/include/freetype/internal/psaux.h create mode 100644 external/freetype/include/freetype/internal/pshints.h create mode 100644 external/freetype/include/freetype/internal/services/svbdf.h create mode 100644 external/freetype/include/freetype/internal/services/svcfftl.h create mode 100644 external/freetype/include/freetype/internal/services/svcid.h create mode 100644 external/freetype/include/freetype/internal/services/svfntfmt.h create mode 100644 external/freetype/include/freetype/internal/services/svgldict.h create mode 100644 external/freetype/include/freetype/internal/services/svgxval.h create mode 100644 external/freetype/include/freetype/internal/services/svkern.h create mode 100644 external/freetype/include/freetype/internal/services/svmetric.h create mode 100644 external/freetype/include/freetype/internal/services/svmm.h create mode 100644 external/freetype/include/freetype/internal/services/svotval.h create mode 100644 external/freetype/include/freetype/internal/services/svpfr.h create mode 100644 external/freetype/include/freetype/internal/services/svpostnm.h create mode 100644 external/freetype/include/freetype/internal/services/svprop.h create mode 100644 external/freetype/include/freetype/internal/services/svpscmap.h create mode 100644 external/freetype/include/freetype/internal/services/svpsinfo.h create mode 100644 external/freetype/include/freetype/internal/services/svsfnt.h create mode 100644 external/freetype/include/freetype/internal/services/svttcmap.h create mode 100644 external/freetype/include/freetype/internal/services/svtteng.h create mode 100644 external/freetype/include/freetype/internal/services/svttglyf.h create mode 100644 external/freetype/include/freetype/internal/services/svwinfnt.h create mode 100644 external/freetype/include/freetype/internal/sfnt.h create mode 100644 external/freetype/include/freetype/internal/svginterface.h create mode 100644 external/freetype/include/freetype/internal/t1types.h create mode 100644 external/freetype/include/freetype/internal/tttypes.h create mode 100644 external/freetype/include/freetype/internal/wofftypes.h create mode 100644 external/freetype/include/freetype/otsvg.h create mode 100644 external/freetype/include/freetype/t1tables.h create mode 100644 external/freetype/include/freetype/ttnameid.h create mode 100644 external/freetype/include/freetype/tttables.h create mode 100644 external/freetype/include/freetype/tttags.h create mode 100644 external/freetype/include/ft2build.h create mode 100644 external/freetype/objs/freetype.dll create mode 100644 external/freetype/objs/freetype.dll.recipe create mode 100644 external/freetype/objs/freetype.exp create mode 100644 external/freetype/objs/freetype.lib create mode 100644 external/freetype/objs/freetype.lib.recipe create mode 100644 external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt create mode 100644 external/freetype/src/autofit/afblue.c create mode 100644 external/freetype/src/autofit/afblue.cin create mode 100644 external/freetype/src/autofit/afblue.dat create mode 100644 external/freetype/src/autofit/afblue.h create mode 100644 external/freetype/src/autofit/afblue.hin create mode 100644 external/freetype/src/autofit/afcjk.c create mode 100644 external/freetype/src/autofit/afcjk.h create mode 100644 external/freetype/src/autofit/afcover.h create mode 100644 external/freetype/src/autofit/afdummy.c create mode 100644 external/freetype/src/autofit/afdummy.h create mode 100644 external/freetype/src/autofit/aferrors.h create mode 100644 external/freetype/src/autofit/afglobal.c create mode 100644 external/freetype/src/autofit/afglobal.h create mode 100644 external/freetype/src/autofit/afhints.c create mode 100644 external/freetype/src/autofit/afhints.h create mode 100644 external/freetype/src/autofit/afindic.c create mode 100644 external/freetype/src/autofit/afindic.h create mode 100644 external/freetype/src/autofit/aflatin.c create mode 100644 external/freetype/src/autofit/aflatin.h create mode 100644 external/freetype/src/autofit/afloader.c create mode 100644 external/freetype/src/autofit/afloader.h create mode 100644 external/freetype/src/autofit/afmodule.c create mode 100644 external/freetype/src/autofit/afmodule.h create mode 100644 external/freetype/src/autofit/afranges.c create mode 100644 external/freetype/src/autofit/afranges.h create mode 100644 external/freetype/src/autofit/afscript.h create mode 100644 external/freetype/src/autofit/afshaper.c create mode 100644 external/freetype/src/autofit/afshaper.h create mode 100644 external/freetype/src/autofit/afstyles.h create mode 100644 external/freetype/src/autofit/aftypes.h create mode 100644 external/freetype/src/autofit/afws-decl.h create mode 100644 external/freetype/src/autofit/afws-iter.h create mode 100644 external/freetype/src/autofit/autofit.c create mode 100644 external/freetype/src/autofit/ft-hb.c create mode 100644 external/freetype/src/autofit/ft-hb.h create mode 100644 external/freetype/src/autofit/module.mk create mode 100644 external/freetype/src/autofit/rules.mk create mode 100644 external/freetype/src/base/ftadvanc.c create mode 100644 external/freetype/src/base/ftbase.c create mode 100644 external/freetype/src/base/ftbase.h create mode 100644 external/freetype/src/base/ftbbox.c create mode 100644 external/freetype/src/base/ftbdf.c create mode 100644 external/freetype/src/base/ftbitmap.c create mode 100644 external/freetype/src/base/ftcalc.c create mode 100644 external/freetype/src/base/ftcid.c create mode 100644 external/freetype/src/base/ftcolor.c create mode 100644 external/freetype/src/base/ftdbgmem.c create mode 100644 external/freetype/src/base/ftdebug.c create mode 100644 external/freetype/src/base/fterrors.c create mode 100644 external/freetype/src/base/ftfntfmt.c create mode 100644 external/freetype/src/base/ftfstype.c create mode 100644 external/freetype/src/base/ftgasp.c create mode 100644 external/freetype/src/base/ftgloadr.c create mode 100644 external/freetype/src/base/ftglyph.c create mode 100644 external/freetype/src/base/ftgxval.c create mode 100644 external/freetype/src/base/fthash.c create mode 100644 external/freetype/src/base/ftinit.c create mode 100644 external/freetype/src/base/ftlcdfil.c create mode 100644 external/freetype/src/base/ftmac.c create mode 100644 external/freetype/src/base/ftmm.c create mode 100644 external/freetype/src/base/ftobjs.c create mode 100644 external/freetype/src/base/ftotval.c create mode 100644 external/freetype/src/base/ftoutln.c create mode 100644 external/freetype/src/base/ftpatent.c create mode 100644 external/freetype/src/base/ftpfr.c create mode 100644 external/freetype/src/base/ftpsprop.c create mode 100644 external/freetype/src/base/ftrfork.c create mode 100644 external/freetype/src/base/ftsnames.c create mode 100644 external/freetype/src/base/ftstream.c create mode 100644 external/freetype/src/base/ftstroke.c create mode 100644 external/freetype/src/base/ftsynth.c create mode 100644 external/freetype/src/base/ftsystem.c create mode 100644 external/freetype/src/base/fttrigon.c create mode 100644 external/freetype/src/base/fttype1.c create mode 100644 external/freetype/src/base/ftutil.c create mode 100644 external/freetype/src/base/ftver.rc create mode 100644 external/freetype/src/base/ftwinfnt.c create mode 100644 external/freetype/src/base/md5.c create mode 100644 external/freetype/src/base/md5.h create mode 100644 external/freetype/src/base/rules.mk create mode 100644 external/freetype/src/bdf/README create mode 100644 external/freetype/src/bdf/bdf.c create mode 100644 external/freetype/src/bdf/bdf.h create mode 100644 external/freetype/src/bdf/bdfdrivr.c create mode 100644 external/freetype/src/bdf/bdfdrivr.h create mode 100644 external/freetype/src/bdf/bdferror.h create mode 100644 external/freetype/src/bdf/bdflib.c create mode 100644 external/freetype/src/bdf/module.mk create mode 100644 external/freetype/src/bdf/rules.mk create mode 100644 external/freetype/src/bzip2/ftbzip2.c create mode 100644 external/freetype/src/bzip2/rules.mk create mode 100644 external/freetype/src/cache/ftcache.c create mode 100644 external/freetype/src/cache/ftcbasic.c create mode 100644 external/freetype/src/cache/ftccache.c create mode 100644 external/freetype/src/cache/ftccache.h create mode 100644 external/freetype/src/cache/ftccback.h create mode 100644 external/freetype/src/cache/ftccmap.c create mode 100644 external/freetype/src/cache/ftcerror.h create mode 100644 external/freetype/src/cache/ftcglyph.c create mode 100644 external/freetype/src/cache/ftcglyph.h create mode 100644 external/freetype/src/cache/ftcimage.c create mode 100644 external/freetype/src/cache/ftcimage.h create mode 100644 external/freetype/src/cache/ftcmanag.c create mode 100644 external/freetype/src/cache/ftcmanag.h create mode 100644 external/freetype/src/cache/ftcmru.c create mode 100644 external/freetype/src/cache/ftcmru.h create mode 100644 external/freetype/src/cache/ftcsbits.c create mode 100644 external/freetype/src/cache/ftcsbits.h create mode 100644 external/freetype/src/cache/rules.mk create mode 100644 external/freetype/src/cff/cff.c create mode 100644 external/freetype/src/cff/cffcmap.c create mode 100644 external/freetype/src/cff/cffcmap.h create mode 100644 external/freetype/src/cff/cffdrivr.c create mode 100644 external/freetype/src/cff/cffdrivr.h create mode 100644 external/freetype/src/cff/cfferrs.h create mode 100644 external/freetype/src/cff/cffgload.c create mode 100644 external/freetype/src/cff/cffgload.h create mode 100644 external/freetype/src/cff/cffload.c create mode 100644 external/freetype/src/cff/cffload.h create mode 100644 external/freetype/src/cff/cffobjs.c create mode 100644 external/freetype/src/cff/cffobjs.h create mode 100644 external/freetype/src/cff/cffparse.c create mode 100644 external/freetype/src/cff/cffparse.h create mode 100644 external/freetype/src/cff/cfftoken.h create mode 100644 external/freetype/src/cff/module.mk create mode 100644 external/freetype/src/cff/rules.mk create mode 100644 external/freetype/src/cid/ciderrs.h create mode 100644 external/freetype/src/cid/cidgload.c create mode 100644 external/freetype/src/cid/cidgload.h create mode 100644 external/freetype/src/cid/cidload.c create mode 100644 external/freetype/src/cid/cidload.h create mode 100644 external/freetype/src/cid/cidobjs.c create mode 100644 external/freetype/src/cid/cidobjs.h create mode 100644 external/freetype/src/cid/cidparse.c create mode 100644 external/freetype/src/cid/cidparse.h create mode 100644 external/freetype/src/cid/cidriver.c create mode 100644 external/freetype/src/cid/cidriver.h create mode 100644 external/freetype/src/cid/cidtoken.h create mode 100644 external/freetype/src/cid/module.mk create mode 100644 external/freetype/src/cid/rules.mk create mode 100644 external/freetype/src/cid/type1cid.c create mode 100644 external/freetype/src/dlg/dlgwrap.c create mode 100644 external/freetype/src/dlg/rules.mk create mode 100644 external/freetype/src/gxvalid/README create mode 100644 external/freetype/src/gxvalid/gxvalid.c create mode 100644 external/freetype/src/gxvalid/gxvalid.h create mode 100644 external/freetype/src/gxvalid/gxvbsln.c create mode 100644 external/freetype/src/gxvalid/gxvcommn.c create mode 100644 external/freetype/src/gxvalid/gxvcommn.h create mode 100644 external/freetype/src/gxvalid/gxverror.h create mode 100644 external/freetype/src/gxvalid/gxvfeat.c create mode 100644 external/freetype/src/gxvalid/gxvfeat.h create mode 100644 external/freetype/src/gxvalid/gxvfgen.c create mode 100644 external/freetype/src/gxvalid/gxvjust.c create mode 100644 external/freetype/src/gxvalid/gxvkern.c create mode 100644 external/freetype/src/gxvalid/gxvlcar.c create mode 100644 external/freetype/src/gxvalid/gxvmod.c create mode 100644 external/freetype/src/gxvalid/gxvmod.h create mode 100644 external/freetype/src/gxvalid/gxvmort.c create mode 100644 external/freetype/src/gxvalid/gxvmort.h create mode 100644 external/freetype/src/gxvalid/gxvmort0.c create mode 100644 external/freetype/src/gxvalid/gxvmort1.c create mode 100644 external/freetype/src/gxvalid/gxvmort2.c create mode 100644 external/freetype/src/gxvalid/gxvmort4.c create mode 100644 external/freetype/src/gxvalid/gxvmort5.c create mode 100644 external/freetype/src/gxvalid/gxvmorx.c create mode 100644 external/freetype/src/gxvalid/gxvmorx.h create mode 100644 external/freetype/src/gxvalid/gxvmorx0.c create mode 100644 external/freetype/src/gxvalid/gxvmorx1.c create mode 100644 external/freetype/src/gxvalid/gxvmorx2.c create mode 100644 external/freetype/src/gxvalid/gxvmorx4.c create mode 100644 external/freetype/src/gxvalid/gxvmorx5.c create mode 100644 external/freetype/src/gxvalid/gxvopbd.c create mode 100644 external/freetype/src/gxvalid/gxvprop.c create mode 100644 external/freetype/src/gxvalid/gxvtrak.c create mode 100644 external/freetype/src/gxvalid/module.mk create mode 100644 external/freetype/src/gxvalid/rules.mk create mode 100644 external/freetype/src/gzip/README.freetype create mode 100644 external/freetype/src/gzip/adler32.c create mode 100644 external/freetype/src/gzip/crc32.c create mode 100644 external/freetype/src/gzip/crc32.h create mode 100644 external/freetype/src/gzip/ftgzip.c create mode 100644 external/freetype/src/gzip/ftzconf.h create mode 100644 external/freetype/src/gzip/gzguts.h create mode 100644 external/freetype/src/gzip/inffast.c create mode 100644 external/freetype/src/gzip/inffast.h create mode 100644 external/freetype/src/gzip/inffixed.h create mode 100644 external/freetype/src/gzip/inflate.c create mode 100644 external/freetype/src/gzip/inflate.h create mode 100644 external/freetype/src/gzip/inftrees.c create mode 100644 external/freetype/src/gzip/inftrees.h create mode 100644 external/freetype/src/gzip/patches/freetype-zlib.diff create mode 100644 external/freetype/src/gzip/rules.mk create mode 100644 external/freetype/src/gzip/zlib.h create mode 100644 external/freetype/src/gzip/zutil.c create mode 100644 external/freetype/src/gzip/zutil.h create mode 100644 external/freetype/src/lzw/ftlzw.c create mode 100644 external/freetype/src/lzw/ftzopen.c create mode 100644 external/freetype/src/lzw/ftzopen.h create mode 100644 external/freetype/src/lzw/rules.mk create mode 100644 external/freetype/src/otvalid/module.mk create mode 100644 external/freetype/src/otvalid/otvalid.c create mode 100644 external/freetype/src/otvalid/otvalid.h create mode 100644 external/freetype/src/otvalid/otvbase.c create mode 100644 external/freetype/src/otvalid/otvcommn.c create mode 100644 external/freetype/src/otvalid/otvcommn.h create mode 100644 external/freetype/src/otvalid/otverror.h create mode 100644 external/freetype/src/otvalid/otvgdef.c create mode 100644 external/freetype/src/otvalid/otvgpos.c create mode 100644 external/freetype/src/otvalid/otvgpos.h create mode 100644 external/freetype/src/otvalid/otvgsub.c create mode 100644 external/freetype/src/otvalid/otvjstf.c create mode 100644 external/freetype/src/otvalid/otvmath.c create mode 100644 external/freetype/src/otvalid/otvmod.c create mode 100644 external/freetype/src/otvalid/otvmod.h create mode 100644 external/freetype/src/otvalid/rules.mk create mode 100644 external/freetype/src/pcf/README create mode 100644 external/freetype/src/pcf/module.mk create mode 100644 external/freetype/src/pcf/pcf.c create mode 100644 external/freetype/src/pcf/pcf.h create mode 100644 external/freetype/src/pcf/pcfdrivr.c create mode 100644 external/freetype/src/pcf/pcfdrivr.h create mode 100644 external/freetype/src/pcf/pcferror.h create mode 100644 external/freetype/src/pcf/pcfread.c create mode 100644 external/freetype/src/pcf/pcfread.h create mode 100644 external/freetype/src/pcf/pcfutil.c create mode 100644 external/freetype/src/pcf/pcfutil.h create mode 100644 external/freetype/src/pcf/rules.mk create mode 100644 external/freetype/src/pfr/module.mk create mode 100644 external/freetype/src/pfr/pfr.c create mode 100644 external/freetype/src/pfr/pfrcmap.c create mode 100644 external/freetype/src/pfr/pfrcmap.h create mode 100644 external/freetype/src/pfr/pfrdrivr.c create mode 100644 external/freetype/src/pfr/pfrdrivr.h create mode 100644 external/freetype/src/pfr/pfrerror.h create mode 100644 external/freetype/src/pfr/pfrgload.c create mode 100644 external/freetype/src/pfr/pfrgload.h create mode 100644 external/freetype/src/pfr/pfrload.c create mode 100644 external/freetype/src/pfr/pfrload.h create mode 100644 external/freetype/src/pfr/pfrobjs.c create mode 100644 external/freetype/src/pfr/pfrobjs.h create mode 100644 external/freetype/src/pfr/pfrsbit.c create mode 100644 external/freetype/src/pfr/pfrsbit.h create mode 100644 external/freetype/src/pfr/pfrtypes.h create mode 100644 external/freetype/src/pfr/rules.mk create mode 100644 external/freetype/src/psaux/afmparse.c create mode 100644 external/freetype/src/psaux/afmparse.h create mode 100644 external/freetype/src/psaux/cffdecode.c create mode 100644 external/freetype/src/psaux/cffdecode.h create mode 100644 external/freetype/src/psaux/module.mk create mode 100644 external/freetype/src/psaux/psarrst.c create mode 100644 external/freetype/src/psaux/psarrst.h create mode 100644 external/freetype/src/psaux/psaux.c create mode 100644 external/freetype/src/psaux/psauxerr.h create mode 100644 external/freetype/src/psaux/psauxmod.c create mode 100644 external/freetype/src/psaux/psauxmod.h create mode 100644 external/freetype/src/psaux/psblues.c create mode 100644 external/freetype/src/psaux/psblues.h create mode 100644 external/freetype/src/psaux/psconv.c create mode 100644 external/freetype/src/psaux/psconv.h create mode 100644 external/freetype/src/psaux/pserror.c create mode 100644 external/freetype/src/psaux/pserror.h create mode 100644 external/freetype/src/psaux/psfixed.h create mode 100644 external/freetype/src/psaux/psfont.c create mode 100644 external/freetype/src/psaux/psfont.h create mode 100644 external/freetype/src/psaux/psft.c create mode 100644 external/freetype/src/psaux/psft.h create mode 100644 external/freetype/src/psaux/psglue.h create mode 100644 external/freetype/src/psaux/pshints.c create mode 100644 external/freetype/src/psaux/pshints.h create mode 100644 external/freetype/src/psaux/psintrp.c create mode 100644 external/freetype/src/psaux/psintrp.h create mode 100644 external/freetype/src/psaux/psobjs.c create mode 100644 external/freetype/src/psaux/psobjs.h create mode 100644 external/freetype/src/psaux/psread.c create mode 100644 external/freetype/src/psaux/psread.h create mode 100644 external/freetype/src/psaux/psstack.c create mode 100644 external/freetype/src/psaux/psstack.h create mode 100644 external/freetype/src/psaux/pstypes.h create mode 100644 external/freetype/src/psaux/rules.mk create mode 100644 external/freetype/src/psaux/t1cmap.c create mode 100644 external/freetype/src/psaux/t1cmap.h create mode 100644 external/freetype/src/psaux/t1decode.c create mode 100644 external/freetype/src/psaux/t1decode.h create mode 100644 external/freetype/src/pshinter/module.mk create mode 100644 external/freetype/src/pshinter/pshalgo.c create mode 100644 external/freetype/src/pshinter/pshalgo.h create mode 100644 external/freetype/src/pshinter/pshglob.c create mode 100644 external/freetype/src/pshinter/pshglob.h create mode 100644 external/freetype/src/pshinter/pshinter.c create mode 100644 external/freetype/src/pshinter/pshmod.c create mode 100644 external/freetype/src/pshinter/pshmod.h create mode 100644 external/freetype/src/pshinter/pshnterr.h create mode 100644 external/freetype/src/pshinter/pshrec.c create mode 100644 external/freetype/src/pshinter/pshrec.h create mode 100644 external/freetype/src/pshinter/rules.mk create mode 100644 external/freetype/src/psnames/module.mk create mode 100644 external/freetype/src/psnames/psmodule.c create mode 100644 external/freetype/src/psnames/psmodule.h create mode 100644 external/freetype/src/psnames/psnamerr.h create mode 100644 external/freetype/src/psnames/psnames.c create mode 100644 external/freetype/src/psnames/pstables.h create mode 100644 external/freetype/src/psnames/rules.mk create mode 100644 external/freetype/src/raster/ftmisc.h create mode 100644 external/freetype/src/raster/ftraster.c create mode 100644 external/freetype/src/raster/ftraster.h create mode 100644 external/freetype/src/raster/ftrend1.c create mode 100644 external/freetype/src/raster/ftrend1.h create mode 100644 external/freetype/src/raster/module.mk create mode 100644 external/freetype/src/raster/raster.c create mode 100644 external/freetype/src/raster/rasterrs.h create mode 100644 external/freetype/src/raster/rules.mk create mode 100644 external/freetype/src/sdf/ftbsdf.c create mode 100644 external/freetype/src/sdf/ftsdf.c create mode 100644 external/freetype/src/sdf/ftsdf.h create mode 100644 external/freetype/src/sdf/ftsdfcommon.c create mode 100644 external/freetype/src/sdf/ftsdfcommon.h create mode 100644 external/freetype/src/sdf/ftsdferrs.h create mode 100644 external/freetype/src/sdf/ftsdfrend.c create mode 100644 external/freetype/src/sdf/ftsdfrend.h create mode 100644 external/freetype/src/sdf/module.mk create mode 100644 external/freetype/src/sdf/rules.mk create mode 100644 external/freetype/src/sdf/sdf.c create mode 100644 external/freetype/src/sfnt/module.mk create mode 100644 external/freetype/src/sfnt/pngshim.c create mode 100644 external/freetype/src/sfnt/pngshim.h create mode 100644 external/freetype/src/sfnt/rules.mk create mode 100644 external/freetype/src/sfnt/sfdriver.c create mode 100644 external/freetype/src/sfnt/sfdriver.h create mode 100644 external/freetype/src/sfnt/sferrors.h create mode 100644 external/freetype/src/sfnt/sfnt.c create mode 100644 external/freetype/src/sfnt/sfobjs.c create mode 100644 external/freetype/src/sfnt/sfobjs.h create mode 100644 external/freetype/src/sfnt/sfwoff.c create mode 100644 external/freetype/src/sfnt/sfwoff.h create mode 100644 external/freetype/src/sfnt/sfwoff2.c create mode 100644 external/freetype/src/sfnt/sfwoff2.h create mode 100644 external/freetype/src/sfnt/ttbdf.c create mode 100644 external/freetype/src/sfnt/ttbdf.h create mode 100644 external/freetype/src/sfnt/ttcmap.c create mode 100644 external/freetype/src/sfnt/ttcmap.h create mode 100644 external/freetype/src/sfnt/ttcmapc.h create mode 100644 external/freetype/src/sfnt/ttcolr.c create mode 100644 external/freetype/src/sfnt/ttcolr.h create mode 100644 external/freetype/src/sfnt/ttcpal.c create mode 100644 external/freetype/src/sfnt/ttcpal.h create mode 100644 external/freetype/src/sfnt/ttkern.c create mode 100644 external/freetype/src/sfnt/ttkern.h create mode 100644 external/freetype/src/sfnt/ttload.c create mode 100644 external/freetype/src/sfnt/ttload.h create mode 100644 external/freetype/src/sfnt/ttmtx.c create mode 100644 external/freetype/src/sfnt/ttmtx.h create mode 100644 external/freetype/src/sfnt/ttpost.c create mode 100644 external/freetype/src/sfnt/ttpost.h create mode 100644 external/freetype/src/sfnt/ttsbit.c create mode 100644 external/freetype/src/sfnt/ttsbit.h create mode 100644 external/freetype/src/sfnt/ttsvg.c create mode 100644 external/freetype/src/sfnt/ttsvg.h create mode 100644 external/freetype/src/sfnt/woff2tags.c create mode 100644 external/freetype/src/sfnt/woff2tags.h create mode 100644 external/freetype/src/smooth/ftgrays.c create mode 100644 external/freetype/src/smooth/ftgrays.h create mode 100644 external/freetype/src/smooth/ftsmerrs.h create mode 100644 external/freetype/src/smooth/ftsmooth.c create mode 100644 external/freetype/src/smooth/ftsmooth.h create mode 100644 external/freetype/src/smooth/module.mk create mode 100644 external/freetype/src/smooth/rules.mk create mode 100644 external/freetype/src/smooth/smooth.c create mode 100644 external/freetype/src/svg/ftsvg.c create mode 100644 external/freetype/src/svg/ftsvg.h create mode 100644 external/freetype/src/svg/module.mk create mode 100644 external/freetype/src/svg/rules.mk create mode 100644 external/freetype/src/svg/svg.c create mode 100644 external/freetype/src/svg/svgtypes.h create mode 100644 external/freetype/src/tools/afblue.pl create mode 100644 external/freetype/src/tools/apinames.c create mode 100644 external/freetype/src/tools/chktrcmp.py create mode 100644 external/freetype/src/tools/cordic.py create mode 100644 external/freetype/src/tools/ftrandom/Makefile create mode 100644 external/freetype/src/tools/ftrandom/README create mode 100644 external/freetype/src/tools/ftrandom/ftrandom.c create mode 100644 external/freetype/src/tools/glnames.py create mode 100644 external/freetype/src/tools/make_distribution_archives.py create mode 100644 external/freetype/src/tools/no-copyright create mode 100644 external/freetype/src/tools/test_afm.c create mode 100644 external/freetype/src/tools/test_bbox.c create mode 100644 external/freetype/src/tools/test_trig.c create mode 100644 external/freetype/src/tools/update-copyright create mode 100644 external/freetype/src/tools/update-copyright-year create mode 100644 external/freetype/src/tools/vms_shorten_symbol.c create mode 100644 external/freetype/src/truetype/module.mk create mode 100644 external/freetype/src/truetype/rules.mk create mode 100644 external/freetype/src/truetype/truetype.c create mode 100644 external/freetype/src/truetype/ttdriver.c create mode 100644 external/freetype/src/truetype/ttdriver.h create mode 100644 external/freetype/src/truetype/tterrors.h create mode 100644 external/freetype/src/truetype/ttgload.c create mode 100644 external/freetype/src/truetype/ttgload.h create mode 100644 external/freetype/src/truetype/ttgxvar.c create mode 100644 external/freetype/src/truetype/ttgxvar.h create mode 100644 external/freetype/src/truetype/ttinterp.c create mode 100644 external/freetype/src/truetype/ttinterp.h create mode 100644 external/freetype/src/truetype/ttobjs.c create mode 100644 external/freetype/src/truetype/ttobjs.h create mode 100644 external/freetype/src/truetype/ttpload.c create mode 100644 external/freetype/src/truetype/ttpload.h create mode 100644 external/freetype/src/type1/module.mk create mode 100644 external/freetype/src/type1/rules.mk create mode 100644 external/freetype/src/type1/t1afm.c create mode 100644 external/freetype/src/type1/t1afm.h create mode 100644 external/freetype/src/type1/t1driver.c create mode 100644 external/freetype/src/type1/t1driver.h create mode 100644 external/freetype/src/type1/t1errors.h create mode 100644 external/freetype/src/type1/t1gload.c create mode 100644 external/freetype/src/type1/t1gload.h create mode 100644 external/freetype/src/type1/t1load.c create mode 100644 external/freetype/src/type1/t1load.h create mode 100644 external/freetype/src/type1/t1objs.c create mode 100644 external/freetype/src/type1/t1objs.h create mode 100644 external/freetype/src/type1/t1parse.c create mode 100644 external/freetype/src/type1/t1parse.h create mode 100644 external/freetype/src/type1/t1tokens.h create mode 100644 external/freetype/src/type1/type1.c create mode 100644 external/freetype/src/type42/module.mk create mode 100644 external/freetype/src/type42/rules.mk create mode 100644 external/freetype/src/type42/t42drivr.c create mode 100644 external/freetype/src/type42/t42drivr.h create mode 100644 external/freetype/src/type42/t42error.h create mode 100644 external/freetype/src/type42/t42objs.c create mode 100644 external/freetype/src/type42/t42objs.h create mode 100644 external/freetype/src/type42/t42parse.c create mode 100644 external/freetype/src/type42/t42parse.h create mode 100644 external/freetype/src/type42/t42types.h create mode 100644 external/freetype/src/type42/type42.c create mode 100644 external/freetype/src/winfonts/fnterrs.h create mode 100644 external/freetype/src/winfonts/module.mk create mode 100644 external/freetype/src/winfonts/rules.mk create mode 100644 external/freetype/src/winfonts/winfnt.c create mode 100644 external/freetype/src/winfonts/winfnt.h diff --git a/external/freetype/builds/windows/ftdebug.c b/external/freetype/builds/windows/ftdebug.c new file mode 100644 index 000000000..360f8c7e3 --- /dev/null +++ b/external/freetype/builds/windows/ftdebug.c @@ -0,0 +1,698 @@ +/**************************************************************************** + * + * ftdebug.c + * + * Debugging and logging component for Win32 (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component contains various macros and functions used to ease the + * debugging of the FreeType engine. Its main purpose is in assertion + * checking, tracing, and error detection. + * + * There are now three debugging modes: + * + * - trace mode + * + * Error and trace messages are sent to the log file (which can be the + * standard error output). + * + * - error mode + * + * Only error messages are generated. + * + * - release mode: + * + * No error message is sent or generated. The code is free from any + * debugging parts. + * + */ + + +#include +#include +#include +#include + + +#ifdef FT_DEBUG_LOGGING + + /************************************************************************** + * + * Variables used to control logging. + * + * 1. `ft_default_trace_level` stores the value of trace levels, which are + * provided to FreeType using the `FT2_DEBUG` environment variable. + * + * 2. `ft_fileptr` stores the `FILE*` handle. + * + * 3. `ft_component` is a string that holds the name of `FT_COMPONENT`. + * + * 4. The flag `ft_component_flag` prints the name of `FT_COMPONENT` along + * with the actual log message if set to true. + * + * 5. The flag `ft_timestamp_flag` prints time along with the actual log + * message if set to ture. + * + * 6. `ft_have_newline_char` is used to differentiate between a log + * message with and without a trailing newline character. + * + * 7. `ft_custom_trace_level` stores the custom trace level value, which + * is provided by the user at run-time. + * + * We use `static` to avoid 'unused variable' warnings. + * + */ + static const char* ft_default_trace_level = NULL; + static FILE* ft_fileptr = NULL; + static const char* ft_component = NULL; + static FT_Bool ft_component_flag = FALSE; + static FT_Bool ft_timestamp_flag = FALSE; + static FT_Bool ft_have_newline_char = TRUE; + static const char* ft_custom_trace_level = NULL; + + /* declared in ftdebug.h */ + + dlg_handler ft_default_log_handler = NULL; + FT_Custom_Log_Handler custom_output_handler = NULL; + +#endif /* FT_DEBUG_LOGGING */ + + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define WIN32_LEAN_AND_MEAN +#include + + +#ifdef _WIN32_WCE + + FT_LOACAL_DEF( void ) + OutputDebugStringA( LPCSTR lpOutputString ) + { + int len; + LPWSTR lpOutputStringW; + + + /* allocate memory space for converted string */ + len = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, + lpOutputString, -1, NULL, 0 ); + + lpOutputStringW = (LPWSTR)_alloca( len * sizeof ( WCHAR ) ); + + if ( !len || !lpOutputStringW ) + return; + + /* now it is safe to do the translation */ + MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, + lpOutputString, -1, lpOutputStringW, len ); + + OutputDebugStringW( lpOutputStringW ); + } + +#endif /* _WIN32_WCE */ + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); +#if ( defined( _WIN32_WINNT ) && _WIN32_WINNT >= 0x0400 ) || \ + ( defined( _WIN32_WCE ) && _WIN32_WCE >= 0x0600 ) + if ( IsDebuggerPresent() ) + { + static char buf[1024]; + + + vsnprintf( buf, sizeof buf, fmt, ap ); + OutputDebugStringA( buf ); + } +#endif + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); +#if ( defined( _WIN32_WINNT ) && _WIN32_WINNT >= 0x0400 ) || \ + ( defined( _WIN32_WCE ) && _WIN32_WCE >= 0x0600 ) + if ( IsDebuggerPresent() ) + { + static char buf[1024]; + + + vsnprintf( buf, sizeof buf, fmt, ap ); + OutputDebugStringA( buf ); + } +#endif + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( int ) + FT_Throw( FT_Error error, + int line, + const char* file ) + { +#if 0 + /* activating the code in this block makes FreeType very chatty */ + fprintf( stderr, + "%s:%d: error 0x%02x: %s\n", + file, + line, + error, + FT_Error_String( error ) ); +#else + FT_UNUSED( error ); + FT_UNUSED( line ); + FT_UNUSED( file ); +#endif + + return 0; + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0; */ + /* this gets adjusted at run-time */ + static int ft_trace_levels_enabled[trace_count]; + + /* array of trace levels, always initialized to 0 */ + static int ft_trace_levels_disabled[trace_count]; + + /* a pointer to either `ft_trace_levels_enabled' */ + /* or `ft_trace_levels_disabled' */ + int* ft_trace_levels; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Trace_Disable( void ) + { + ft_trace_levels = ft_trace_levels_disabled; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Trace_Enable( void ) + { + ft_trace_levels = ft_trace_levels_enabled; + } + + + /************************************************************************** + * + * Initialize the tracing sub-system. This is done by retrieving the + * value of the `FT2_DEBUG' environment variable. It must be a list of + * toggles, separated by spaces, `;', or `,'. Example: + * + * export FT2_DEBUG="any:3 memory:7 stream:5" + * + * This requests that all levels be set to 3, except the trace level for + * the memory and stream components which are set to 7 and 5, + * respectively. + * + * See the file `include/freetype/internal/fttrace.h' for details of + * the available toggle names. + * + * The level must be between 0 and 7; 0 means quiet (except for serious + * runtime errors), and 7 means _very_ verbose. + */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = NULL; + + +#ifdef FT_DEBUG_LOGGING + if ( ft_custom_trace_level != NULL ) + ft2_debug = ft_custom_trace_level; + else + ft2_debug = ft_default_trace_level; +#else + ft2_debug = ft_getenv( "FT2_DEBUG" ); +#endif + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + +#ifdef FT_DEBUG_LOGGING + + /* check extra arguments for logging */ + if ( *p == '-' ) + { + const char* r = ++p; + + + if ( *r == 'v' ) + { + const char* s = ++r; + + + ft_component_flag = TRUE; + + if ( *s == 't' ) + { + ft_timestamp_flag = TRUE; + p++; + } + + p++; + } + + else if ( *r == 't' ) + { + const char* s = ++r; + + + ft_timestamp_flag = TRUE; + + if ( *s == 'v' ) + { + ft_component_flag = TRUE; + p++; + } + + p++; + } + } + +#endif /* FT_DEBUG_LOGGING */ + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( !*p ) + break; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels_enabled[n] = level; + } + else + ft_trace_levels_enabled[found] = level; + } + } + } + } + + ft_trace_levels = ft_trace_levels_enabled; + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + + FT_BASE_DEF( void ) + FT_Trace_Disable( void ) + { + /* nothing */ + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Trace_Enable( void ) + { + /* nothing */ + } + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LOGGING + + /************************************************************************** + * + * Initialize and de-initialize 'dlg' library. + * + */ + + FT_BASE_DEF( void ) + ft_logging_init( void ) + { + ft_default_log_handler = ft_log_handler; + ft_default_trace_level = ft_getenv( "FT2_DEBUG" ); + + if ( ft_getenv( "FT_LOGGING_FILE" ) ) + ft_fileptr = ft_fopen( ft_getenv( "FT_LOGGING_FILE" ), "w" ); + else + ft_fileptr = stderr; + + ft_debug_init(); + + /* Set the default output handler for 'dlg'. */ + dlg_set_handler( ft_default_log_handler, NULL ); + } + + + FT_BASE_DEF( void ) + ft_logging_deinit( void ) + { + if ( ft_fileptr != stderr ) + ft_fclose( ft_fileptr ); + } + + + /************************************************************************** + * + * An output log handler for FreeType. + * + */ + FT_BASE_DEF( void ) + ft_log_handler( const struct dlg_origin* origin, + const char* string, + void* data ) + { + char features_buf[128]; + char* bufp = features_buf; + + FT_UNUSED( data ); + + + if ( ft_have_newline_char ) + { + const char* features = NULL; + size_t features_length = 0; + + +#define FEATURES_TIMESTAMP "[%h:%m] " +#define FEATURES_COMPONENT "[%t] " +#define FEATURES_TIMESTAMP_COMPONENT "[%h:%m %t] " + + if ( ft_timestamp_flag && ft_component_flag ) + { + features = FEATURES_TIMESTAMP_COMPONENT; + features_length = sizeof ( FEATURES_TIMESTAMP_COMPONENT ); + } + else if ( ft_timestamp_flag ) + { + features = FEATURES_TIMESTAMP; + features_length = sizeof ( FEATURES_TIMESTAMP ); + } + else if ( ft_component_flag ) + { + features = FEATURES_COMPONENT; + features_length = sizeof ( FEATURES_COMPONENT ); + } + + if ( ft_component_flag || ft_timestamp_flag ) + { + ft_strncpy( features_buf, features, features_length ); + bufp += features_length - 1; + } + + if ( ft_component_flag ) + { + size_t tag_length = ft_strlen( *origin->tags ); + size_t i; + + + /* To vertically align tracing messages we compensate the */ + /* different FT_COMPONENT string lengths by inserting an */ + /* appropriate amount of space characters. */ + for ( i = 0; + i < FT_MAX_TRACE_LEVEL_LENGTH - tag_length; + i++ ) + *bufp++ = ' '; + } + } + + /* Finally add the format string for the tracing message. */ + *bufp++ = '%'; + *bufp++ = 'c'; + *bufp = '\0'; + + dlg_generic_outputf_stream( ft_fileptr, + (const char*)features_buf, + origin, + string, + dlg_default_output_styles, + true ); + + if ( ft_strrchr( string, '\n' ) ) + ft_have_newline_char = TRUE; + else + ft_have_newline_char = FALSE; + } + + + /* documentation is in ftdebug.h */ + FT_BASE_DEF( void ) + ft_add_tag( const char* tag ) + { + ft_component = tag; + + dlg_add_tag( tag, NULL ); + } + + + /* documentation is in ftdebug.h */ + FT_BASE_DEF( void ) + ft_remove_tag( const char* tag ) + { + dlg_remove_tag( tag, NULL ); + } + + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Level( const char* level ) + { + ft_component_flag = FALSE; + ft_timestamp_flag = FALSE; + ft_custom_trace_level = level; + + ft_debug_init(); + } + + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Default_Level( void ) + { + ft_component_flag = FALSE; + ft_timestamp_flag = FALSE; + ft_custom_trace_level = NULL; + + ft_debug_init(); + } + + + /************************************************************************** + * + * Functions to handle a custom log handler. + * + */ + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Log_Handler( FT_Custom_Log_Handler handler ) + { + custom_output_handler = handler; + } + + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Default_Log_Handler( void ) + { + custom_output_handler = NULL; + } + + + /* documentation is in ftdebug.h */ + FT_BASE_DEF( void ) + FT_Logging_Callback( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + custom_output_handler( ft_component, fmt, ap ); + va_end( ap ); + } + +#else /* !FT_DEBUG_LOGGING */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Level( const char* level ) + { + FT_UNUSED( level ); + } + + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Default_Level( void ) + { + /* nothing */ + } + + + FT_EXPORT_DEF( void ) + FT_Set_Log_Handler( FT_Custom_Log_Handler handler ) + { + FT_UNUSED( handler ); + } + + + FT_EXPORT_DEF( void ) + FT_Set_Default_Log_Handler( void ) + { + /* nothing */ + } + +#endif /* !FT_DEBUG_LOGGING */ + + +/* END */ diff --git a/external/freetype/builds/windows/ftsystem.c b/external/freetype/builds/windows/ftsystem.c new file mode 100644 index 000000000..418d7995e --- /dev/null +++ b/external/freetype/builds/windows/ftsystem.c @@ -0,0 +1,499 @@ +/**************************************************************************** + * + * ftsystem.c + * + * Windows-specific FreeType low-level system interface (body). + * + * Copyright (C) 2021-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include + /* we use our special ftconfig.h file, not the standard one */ +#include FT_CONFIG_CONFIG_H +#include +#include +#include +#include +#include + + /* memory mapping and allocation includes and definitions */ +#define WIN32_LEAN_AND_MEAN +#include + + + /************************************************************************** + * + * MEMORY MANAGEMENT INTERFACE + * + */ + + + /************************************************************************** + * + * It is not necessary to do any error checking for the + * allocation-related functions. This will be done by the higher level + * routines like ft_mem_alloc() or ft_mem_realloc(). + * + */ + + + /************************************************************************** + * + * @Function: + * ft_alloc + * + * @Description: + * The memory allocation function. + * + * @Input: + * memory :: + * A pointer to the memory object. + * + * size :: + * The requested size in bytes. + * + * @Return: + * The address of newly allocated block. + */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + return HeapAlloc( memory->user, 0, size ); + } + + + /************************************************************************** + * + * @Function: + * ft_realloc + * + * @Description: + * The memory reallocation function. + * + * @Input: + * memory :: + * A pointer to the memory object. + * + * cur_size :: + * The current size of the allocated memory block. + * + * new_size :: + * The newly requested size in bytes. + * + * block :: + * The current address of the block in memory. + * + * @Return: + * The address of the reallocated memory block. + */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( cur_size ); + + return HeapReAlloc( memory->user, 0, block, new_size ); + } + + + /************************************************************************** + * + * @Function: + * ft_free + * + * @Description: + * The memory release function. + * + * @Input: + * memory :: + * A pointer to the memory object. + * + * block :: + * The address of block in memory to be freed. + */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + HeapFree( memory->user, 0, block ); + } + + + /************************************************************************** + * + * RESOURCE MANAGEMENT INTERFACE + * + */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) + + + /************************************************************************** + * + * @Function: + * ft_close_stream_by_munmap + * + * @Description: + * The function to close a stream which is opened by mmap. + * + * @Input: + * stream :: A pointer to the stream object. + */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_munmap( FT_Stream stream ) + { + UnmapViewOfFile( (LPCVOID)stream->descriptor.pointer ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = NULL; + } + + + /************************************************************************** + * + * @Function: + * ft_close_stream_by_free + * + * @Description: + * The function to close a stream which is created by ft_alloc. + * + * @Input: + * stream :: A pointer to the stream object. + */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_free( FT_Stream stream ) + { + ft_free( stream->memory, stream->descriptor.pointer ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = NULL; + } + + + /* non-desktop Universal Windows Platform */ +#if defined( WINAPI_FAMILY ) && WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP + +#define PACK_DWORD64( hi, lo ) ( ( (DWORD64)(hi) << 32 ) | (DWORD)(lo) ) + +#define CreateFileMapping( a, b, c, d, e, f ) \ + CreateFileMappingFromApp( a, b, c, PACK_DWORD64( d, e ), f ) +#define MapViewOfFile( a, b, c, d, e ) \ + MapViewOfFileFromApp( a, b, PACK_DWORD64( c, d ), e ) + + FT_LOCAL_DEF( HANDLE ) + CreateFileA( LPCSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile ) + { + int len; + LPWSTR lpFileNameW; + + CREATEFILE2_EXTENDED_PARAMETERS createExParams = { + sizeof ( CREATEFILE2_EXTENDED_PARAMETERS ), + dwFlagsAndAttributes & 0x0000FFFF, + dwFlagsAndAttributes & 0xFFF00000, + dwFlagsAndAttributes & 0x000F0000, + lpSecurityAttributes, + hTemplateFile }; + + + /* allocate memory space for converted path name */ + len = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, + lpFileName, -1, NULL, 0 ); + + lpFileNameW = (LPWSTR)_alloca( len * sizeof ( WCHAR ) ); + + if ( !len || !lpFileNameW ) + { + FT_ERROR(( "FT_Stream_Open: cannot convert file name to LPWSTR\n" )); + return INVALID_HANDLE_VALUE; + } + + /* now it is safe to do the translation */ + MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, + lpFileName, -1, lpFileNameW, len ); + + /* open the file */ + return CreateFile2( lpFileNameW, dwDesiredAccess, dwShareMode, + dwCreationDisposition, &createExParams ); + } + +#endif + + +#if defined( _WIN32_WCE ) + + /* malloc.h provides implementation of alloca()/_alloca() */ + #include + + FT_LOCAL_DEF( HANDLE ) + CreateFileA( LPCSTR lpFileName, + DWORD dwDesiredAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile ) + { + int len; + LPWSTR lpFileNameW; + + + /* allocate memory space for converted path name */ + len = MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, + lpFileName, -1, NULL, 0 ); + + lpFileNameW = (LPWSTR)_alloca( len * sizeof ( WCHAR ) ); + + if ( !len || !lpFileNameW ) + { + FT_ERROR(( "FT_Stream_Open: cannot convert file name to LPWSTR\n" )); + return INVALID_HANDLE_VALUE; + } + + /* now it is safe to do the translation */ + MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, + lpFileName, -1, lpFileNameW, len ); + + /* open the file */ + return CreateFileW( lpFileNameW, dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, + dwFlagsAndAttributes, hTemplateFile ); + } + +#endif + + +#if defined( _WIN32_WCE ) || defined ( _WIN32_WINDOWS ) || \ + !defined( _WIN32_WINNT ) || _WIN32_WINNT <= 0x0400 + + FT_LOCAL_DEF( BOOL ) + GetFileSizeEx( HANDLE hFile, + PLARGE_INTEGER lpFileSize ) + { + lpFileSize->u.LowPart = GetFileSize( hFile, + (DWORD *)&lpFileSize->u.HighPart ); + + if ( lpFileSize->u.LowPart == INVALID_FILE_SIZE && + GetLastError() != NO_ERROR ) + return FALSE; + else + return TRUE; + } + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + HANDLE file; + HANDLE fm; + LARGE_INTEGER size; + + + if ( !stream ) + return FT_THROW( Invalid_Stream_Handle ); + + /* open the file */ + file = CreateFileA( (LPCSTR)filepathname, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); + if ( file == INVALID_HANDLE_VALUE ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_THROW( Cannot_Open_Resource ); + } + + if ( GetFileSizeEx( file, &size ) == FALSE ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not retrieve size of file `%s'\n", filepathname )); + goto Fail_Open; + } + + /* `stream->size' is typedef'd to unsigned long (in `ftsystem.h'); */ + /* So avoid overflow caused by fonts in huge files larger than */ + /* 2GB, do a test. */ + if ( size.QuadPart > LONG_MAX ) + { + FT_ERROR(( "FT_Stream_Open: file is too big\n" )); + goto Fail_Open; + } + else if ( size.QuadPart == 0 ) + { + FT_ERROR(( "FT_Stream_Open: zero-length file\n" )); + goto Fail_Open; + } + + fm = CreateFileMapping( file, NULL, PAGE_READONLY, 0, 0, NULL ); + if ( fm == NULL ) + { + FT_ERROR(( "FT_Stream_Open: can not map file\n" )); + goto Fail_Open; + } + + /* Store only the low part of this 64 bits integer because long is */ + /* a 32 bits type. Anyway, a check has been done above to forbid */ + /* a size greater than LONG_MAX */ + stream->size = size.LowPart; + stream->pos = 0; + stream->base = (unsigned char *) + MapViewOfFile( fm, FILE_MAP_READ, 0, 0, 0 ); + + CloseHandle( fm ); + + if ( stream->base != NULL ) + stream->close = ft_close_stream_by_munmap; + else + { + DWORD total_read_count; + + + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); + + stream->base = (unsigned char*)ft_alloc( stream->memory, stream->size ); + + if ( !stream->base ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `alloc' memory\n" )); + goto Fail_Open; + } + + total_read_count = 0; + do + { + DWORD read_count; + + + if ( ReadFile( file, + stream->base + total_read_count, + stream->size - total_read_count, + &read_count, NULL ) == FALSE ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " error while `read'ing file `%s'\n", filepathname )); + goto Fail_Read; + } + + total_read_count += read_count; + + } while ( total_read_count != stream->size ); + + stream->close = ft_close_stream_by_free; + } + + CloseHandle( file ); + + stream->descriptor.pointer = stream->base; + stream->pathname.pointer = (char*)filepathname; + + stream->read = NULL; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + + Fail_Read: + ft_free( stream->memory, stream->base ); + + Fail_Open: + CloseHandle( file ); + + stream->base = NULL; + stream->size = 0; + stream->pos = 0; + + return FT_THROW( Cannot_Open_Stream ); + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + HANDLE heap; + FT_Memory memory; + + + heap = GetProcessHeap(); + memory = heap ? (FT_Memory)HeapAlloc( heap, 0, sizeof ( *memory ) ) + : NULL; + + if ( memory ) + { + memory->user = heap; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + memory->free( memory, memory ); + } + + +/* END */ diff --git a/external/freetype/builds/windows/vc2010/freetype.vcxproj b/external/freetype/builds/windows/vc2010/freetype.vcxproj new file mode 100644 index 000000000..cdbae5929 --- /dev/null +++ b/external/freetype/builds/windows/vc2010/freetype.vcxproj @@ -0,0 +1,245 @@ + + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} + FreeType + + + + $(DefaultPlatformToolset) + + + StaticLibrary + NotSet + + + StaticLibrary + NotSet + + + StaticLibrary + NotSet + + + StaticLibrary + NotSet + + + + + + ..\..\..\objs\$(Platform)\$(Configuration)\ + ..\..\..\objs\$(Platform)\$(Configuration)\ + AllRules.ruleset + + + freetype + + + + + Disabled + $(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + false + Level4 + ProgramDatabase + Default + 4001 + true + $(OutDir)$(TargetName).pdb + Disabled + + + _DEBUG;$(UserDefines);%(PreprocessorDefinitions) + 0x0409 + + + MachineX86 + $(UserLibraryDirectories);%(AdditionalLibraryDirectories) + $(UserDependencies);%(AdditionalDependencies) + + + + + Disabled + $(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + false + Level4 + ProgramDatabase + Default + 4001;4267 + true + $(OutDir)$(TargetName).pdb + Disabled + + + _DEBUG;$(UserDefines);%(PreprocessorDefinitions) + 0x0409 + + + MachineX64 + $(UserLibraryDirectories);%(AdditionalLibraryDirectories) + $(UserDependencies);%(AdditionalDependencies) + + + + + MaxSpeed + AnySuitable + $(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions) + MultiThreaded + true + true + Level4 + Default + 4001 + true + StreamingSIMDExtensions2 + true + + + NDEBUG;$(UserDefines);%(PreprocessorDefinitions) + 0x0409 + + + MachineX86 + $(UserLibraryDirectories);%(AdditionalLibraryDirectories) + $(UserDependencies);%(AdditionalDependencies) + + + + + MaxSpeed + AnySuitable + $(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions) + MultiThreaded + true + true + Level4 + Default + 4001;4267 + true + true + + + NDEBUG;$(UserDefines);%(PreprocessorDefinitions) + 0x0409 + + + MachineX64 + $(UserLibraryDirectories);%(AdditionalLibraryDirectories) + $(UserDependencies);%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + + + + + + + ..\..\..\include\dlg\output.h + + + ..\..\..\include\dlg\dlg.h + + + ..\..\..\src\dlg\dlg.c + + + + + + + + + + + + + diff --git a/external/freetype/builds/windows/vc2010/freetype.vcxproj.filters b/external/freetype/builds/windows/vc2010/freetype.vcxproj.filters new file mode 100644 index 000000000..08e4cdeb8 --- /dev/null +++ b/external/freetype/builds/windows/vc2010/freetype.vcxproj.filters @@ -0,0 +1,149 @@ + + + + + {b4c15893-ec11-491d-9507-0ac184f9cc78} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {4d3e4eff-3fbc-4b20-b413-2743b23b7109} + + + {e6cf6a0f-0404-4024-8bf8-ff5b29f35657} + h;hpp;hxx;hm;inl + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files\FT_MODULES + + + Source Files + + + Source Files + + + + + Source Files + + + diff --git a/external/freetype/include/freetype/config/ftconfig.h b/external/freetype/include/freetype/config/ftconfig.h new file mode 100644 index 000000000..a85151699 --- /dev/null +++ b/external/freetype/include/freetype/config/ftconfig.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * ftconfig.h + * + * ANSI-specific configuration file (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This header file contains a number of macro definitions that are used by + * the rest of the engine. Most of the macros here are automatically + * determined at compile time, and you should not need to change it to port + * FreeType, except to compile the library with a non-ANSI compiler. + * + * Note however that if some specific modifications are needed, we advise + * you to place a modified copy in your build directory. + * + * The build directory is usually `builds/`, and contains + * system-specific files that are always included first when building the + * library. + * + * This ANSI version should stay in `include/config/`. + * + */ + +#ifndef FTCONFIG_H_ +#define FTCONFIG_H_ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + +#include +#include +#include + +#endif /* FTCONFIG_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/config/ftheader.h b/external/freetype/include/freetype/config/ftheader.h new file mode 100644 index 000000000..e607bce15 --- /dev/null +++ b/external/freetype/include/freetype/config/ftheader.h @@ -0,0 +1,836 @@ +/**************************************************************************** + * + * ftheader.h + * + * Build macros of the FreeType 2 library. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTHEADER_H_ +#define FTHEADER_H_ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifndef FT_BEGIN_HEADER +# ifdef __cplusplus +# define FT_BEGIN_HEADER extern "C" { +# else +# define FT_BEGIN_HEADER /* nothing */ +# endif +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }` block when included from a */ + /* C++ compiler. */ + /* */ +#ifndef FT_END_HEADER +# ifdef __cplusplus +# define FT_END_HEADER } +# else +# define FT_END_HEADER /* nothing */ +# endif +#endif + + + /************************************************************************** + * + * Aliases for the FreeType 2 public and configuration files. + * + */ + + /************************************************************************** + * + * @section: + * header_file_macros + * + * @title: + * Header File Macros + * + * @abstract: + * Macro definitions used to `#include` specific header files. + * + * @description: + * In addition to the normal scheme of including header files like + * + * ``` + * #include + * #include + * #include + * ``` + * + * it is possible to used named macros instead. They can be used + * directly in `#include` statements as in + * + * ``` + * #include FT_FREETYPE_H + * #include FT_MULTIPLE_MASTERS_H + * #include FT_GLYPH_H + * ``` + * + * These macros were introduced to overcome the infamous 8.3~naming rule + * required by DOS (and `FT_MULTIPLE_MASTERS_H` is a lot more meaningful + * than `ftmm.h`). + * + */ + + + /* configuration files */ + + /************************************************************************** + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H +#endif + + + /************************************************************************** + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H +#endif + + /* */ + + /* public headers */ + + /************************************************************************** + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H + + + /************************************************************************** + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H + + + /************************************************************************** + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in `#include` statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H + + + /************************************************************************** + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H + + + /************************************************************************** + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H + + + /************************************************************************** + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H + + + /************************************************************************** + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H + + + /************************************************************************** + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H + + + /************************************************************************** + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H + + + /************************************************************************** + * + * @macro: + * FT_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the driver modules. + * + */ +#define FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_AUTOHINTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the auto-hinting module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_AUTOHINTER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_CFF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the CFF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_CFF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the TrueType driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_TRUETYPE_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_PCF_DRIVER_H + * + * @description: + * A macro used in `#include` statements to name the file containing + * structures and macros related to the PCF driver module. + * + * Deprecated since version~2.9; use @FT_DRIVER_H instead. + * + */ +#define FT_PCF_DRIVER_H FT_DRIVER_H + + + /************************************************************************** + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H + + + /************************************************************************** + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of TrueType four-byte 'tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H + + + /************************************************************************** + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a face. + * + */ +#define FT_BDF_H + + + /************************************************************************** + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which access CID font information from a face. + * + */ +#define FT_CID_H + + + /************************************************************************** + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H + + + /************************************************************************** + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H + + + /************************************************************************** + * + * @macro: + * FT_BZIP2_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports bzip2-compressed files. + * + */ +#define FT_BZIP2_H + + + /************************************************************************** + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H + + + /************************************************************************** + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H + + + /************************************************************************** + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H + + + /************************************************************************** + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H + + + /************************************************************************** + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H + + + /************************************************************************** + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access fonts + * embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H + + + /************************************************************************** + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H + + + /************************************************************************** + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which accesses embedded 'name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H + + + /************************************************************************** + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables ('BASE', + * 'GDEF', 'GPOS', 'GSUB', 'JSTF'). + * + */ +#define FT_OPENTYPE_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables ('feat', + * 'mort', 'morx', 'bsln', 'just', 'kern', 'opbd', 'trak', 'prop'). + * + */ +#define FT_GX_VALIDATE_H + + + /************************************************************************** + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H + + + /************************************************************************** + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H + + + /************************************************************************** + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H + + + /************************************************************************** + * + * @macro: + * FT_FONT_FORMATS_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which provides functions specific to font formats. + */ +#define FT_FONT_FORMATS_H + + /* deprecated */ +#define FT_XFREE86_H FT_FONT_FORMATS_H + + + /************************************************************************** + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H + + + /************************************************************************** + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H + + + /************************************************************************** + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which performs incremental glyph loading. + */ +#define FT_INCREMENTAL_H + + + /************************************************************************** + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H + + + /************************************************************************** + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H + + + /************************************************************************** + * + * @macro: + * FT_COLOR_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which handles the OpenType 'CPAL' table. + */ +#define FT_COLOR_H + + + /************************************************************************** + * + * @macro: + * FT_OTSVG_H + * + * @description: + * A macro used in `#include` statements to name the file containing the + * FreeType~2 API which handles the OpenType 'SVG~' glyphs. + */ +#define FT_OTSVG_H + + + /* */ + + /* These header files don't need to be included by the user. */ +#define FT_ERROR_DEFINITIONS_H +#define FT_PARAMETER_TAGS_H + + /* Deprecated macros. */ +#define FT_UNPATENTED_HINTING_H +#define FT_TRUETYPE_UNPATENTED_H + + /* `FT_CACHE_H` is the only header file needed for the cache subsystem. */ +#define FT_CACHE_IMAGE_H FT_CACHE_H +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to `FT_CACHE_H` at the moment just in case, but we know */ + /* of no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MRU_H FT_CACHE_H +#define FT_CACHE_INTERNAL_MANAGER_H FT_CACHE_H +#define FT_CACHE_INTERNAL_CACHE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_GLYPH_H FT_CACHE_H +#define FT_CACHE_INTERNAL_IMAGE_H FT_CACHE_H +#define FT_CACHE_INTERNAL_SBITS_H FT_CACHE_H + +/* TODO(david): Move this section below to a different header */ +#ifdef FT2_BUILD_LIBRARY +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ + /* In particular, the warning complains about stuff like `while(0)' */ + /* which is very useful in macro definitions. There is no benefit */ + /* in having it enabled. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ +#endif /* FT2_BUILD_LIBRARY */ + +#endif /* FTHEADER_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/config/ftmodule.h b/external/freetype/include/freetype/config/ftmodule.h new file mode 100644 index 000000000..b315baba8 --- /dev/null +++ b/external/freetype/include/freetype/config/ftmodule.h @@ -0,0 +1,33 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `/objs/`) based on information + * from `/modules.cfg`. + * + * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_sdf_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_bitmap_sdf_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_svg_renderer_class ) + +/* EOF */ diff --git a/external/freetype/include/freetype/config/ftoption.h b/external/freetype/include/freetype/config/ftoption.h new file mode 100644 index 000000000..1976b33af --- /dev/null +++ b/external/freetype/include/freetype/config/ftoption.h @@ -0,0 +1,1014 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOPTION_H_ +#define FTOPTION_H_ + + +#include + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * USER-SELECTABLE CONFIGURATION MACROS + * + * This file contains the default configuration macro definitions for a + * standard build of the FreeType library. There are three ways to use + * this file to build project-specific versions of the library: + * + * - You can modify this file by hand, but this is not recommended in + * cases where you would like to build several versions of the library + * from a single source directory. + * + * - You can put a copy of this file in your build directory, more + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is + * the name of a directory that is included _before_ the FreeType include + * path during compilation. + * + * The default FreeType Makefiles use the build directory + * `builds/` by default, but you can easily change that for your + * own projects. + * + * - Copy the file to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate + * this file during the build. For example, + * + * ``` + * #define FT_CONFIG_OPTIONS_H + * #include + * ``` + * + * will use `$BUILD/myftoptions.h` instead of this file for macro + * definitions. + * + * Note also that you can similarly pre-define the macro + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules + * that are statically linked to the library at compile time. By + * default, this file is ``. + * + * We highly recommend using the third method whenever possible. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*#************************************************************************ + * + * If you enable this configuration option, FreeType recognizes an + * environment variable called `FREETYPE_PROPERTIES`, which can be used to + * control the various font drivers and modules. The controllable + * properties are listed in the section @properties. + * + * You have to undefine this configuration option on platforms that lack + * the concept of environment variables (and thus don't have the `getenv` + * function), for example Windows CE. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 + * ``` + * + */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + + /************************************************************************** + * + * Uncomment the line below if you want to activate LCD rendering + * technology similar to ClearType in this build of the library. This + * technology triples the resolution in the direction color subpixels. To + * mitigate color fringes inherent to this technology, you also need to + * explicitly set up LCD filtering. + * + * When this macro is not defined, FreeType offers alternative LCD + * rendering technology that produces excellent output. + */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /************************************************************************** + * + * Many compilers provide a non-ANSI 64-bit data type that can be used by + * FreeType to speed up some computations. However, this will create some + * problems when compiling the library in strict ANSI mode. + * + * For this reason, the use of 64-bit integers is normally disabled when + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. + * + * For most compilers, this will only create compilation warnings when + * building the library. + * + * ObNote: The compiler-specific 64-bit integers are detected in the + * file `ftconfig.h` either statically or through the `configure` + * script on supported platforms. + */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /************************************************************************** + * + * If this macro is defined, do not try to use an assembler version of + * performance-critical functions (e.g., @FT_MulFix). You should only do + * that to verify that the assembler function works properly, or to execute + * benchmark tests of the various implementations. + */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /************************************************************************** + * + * If this macro is defined, try to use an inlined assembler version of the + * @FT_MulFix function, which is a 'hotspot' when loading and hinting + * glyphs, and which should be executed as fast as possible. + * + * Note that if your compiler or CPU is not supported, this will default to + * the standard and portable implementation found in `ftcalc.c`. + */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /************************************************************************** + * + * LZW-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `compress` program. This is mostly used to parse many of the PCF + * files that come with various X11 distributions. The implementation + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. + */ +#define FT_CONFIG_OPTION_USE_LZW + + + /************************************************************************** + * + * Gzip-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `gzip` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses 'zlib' to partially + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. See also the + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. + */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /************************************************************************** + * + * ZLib library selection + * + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. + * + * If you let it undefined, the component will use its own copy of the + * zlib sources instead. These have been modified to be included + * directly within the component and **not** export external function + * names. This allows you to link any program with FreeType _and_ ZLib + * without linking conflicts. + * + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + * + * If you use the GNU make build system directly (that is, without the + * `configure` script) and you define this macro, you also have to pass + * `SYSTEM_ZLIB=yes` as an argument to make. + */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /************************************************************************** + * + * Bzip2-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system + * available bzip2 implementation. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BZIP2 */ + + + /************************************************************************** + * + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded + * systems that have multiple system libraries, some with or without file + * stream support, in the cases where file stream support is not necessary + * such as memory loading of font files. + */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + + + /************************************************************************** + * + * PNG bitmap support. + * + * FreeType now handles loading color bitmap glyphs in the PNG format. + * This requires help from the external libpng library. Uncompressed + * color bitmaps do not need any external libraries and will be supported + * regardless of this configuration. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_PNG */ + + + /************************************************************************** + * + * HarfBuzz support. + * + * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType + * fonts. If available, many glyphs not directly addressable by a font's + * character map will be hinted also. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + /************************************************************************** + * + * Brotli support. + * + * FreeType uses the Brotli library to provide support for decompressing + * WOFF2 streams. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BROTLI */ + + + /************************************************************************** + * + * Glyph Postscript Names handling + * + * By default, FreeType 2 is compiled with the 'psnames' module. This + * module is in charge of converting a glyph name string into a Unicode + * value, or return a Macintosh standard glyph name for the use with the + * TrueType 'post' table. + * + * Undefine this macro if you do not want 'psnames' compiled in your + * build of FreeType. This has the following effects: + * + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType 'post' table, + * but will not synthesize a missing Unicode charmap. + * + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. + * + * You would normally undefine this configuration macro when building a + * version of FreeType that doesn't contain a Type~1 or CFF driver. + */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Postscript Names to Unicode Values support + * + * By default, FreeType~2 is built with the 'psnames' module compiled in. + * Among other things, the module is used to convert a glyph name into a + * Unicode value. This is especially useful in order to synthesize on + * the fly a Unicode charmap from the CFF/Type~1 driver through a big + * table named the 'Adobe Glyph List' (AGL). + * + * Undefine this macro if you do not want the Adobe Glyph List compiled + * in your 'psnames' module. The Type~1 driver will not be able to + * synthesize a Unicode charmap out of the glyphs found in the fonts. + */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /************************************************************************** + * + * Support for Mac fonts + * + * Define this macro if you want support for outline fonts in Mac format + * (mac dfont, mac resource, macbinary containing a mac resource) on + * non-Mac platforms. + * + * Note that the 'FOND' resource isn't checked. + */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /************************************************************************** + * + * Guessing methods to access embedded resource forks + * + * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). + * + * Resource forks which include fonts data are stored sometimes in + * locations which users or developers don't expected. In some cases, + * resource forks start with some offset from the head of a file. In + * other cases, the actual resource fork is stored in file different from + * what the user specifies. If this option is activated, FreeType tries + * to guess whether such offsets or different file names must be used. + * + * Note that normal, direct access of resource forks is controlled via + * the `FT_CONFIG_OPTION_MAC_FONTS` option. + */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /************************************************************************** + * + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data + * incrementally as the document is parsed, such as the Ghostscript + * interpreter for the PostScript language. + */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /************************************************************************** + * + * The size in bytes of the render pool used by the scan-line converter to + * do all of its work. + */ +#define FT_RENDER_POOL_SIZE 16384L + + + /************************************************************************** + * + * FT_MAX_MODULES + * + * The maximum number of modules that can be registered in a single + * FreeType library object. 32~is the default. + */ +#define FT_MAX_MODULES 32 + + + /************************************************************************** + * + * Debug level + * + * FreeType can be compiled in debug or trace mode. In debug mode, + * errors are reported through the 'ftdebug' component. In trace mode, + * additional messages are sent to the standard output during execution. + * + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. + * + * Don't define any of these macros to compile in 'release' mode! + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Logging + * + * Compiling FreeType in debug or trace mode makes FreeType write error + * and trace log messages to `stderr`. Enabling this macro + * automatically forces the `FT_DEBUG_LEVEL_ERROR` and + * `FT_DEBUG_LEVEL_TRACE` macros and allows FreeType to write error and + * trace log messages to a file instead of `stderr`. For writing logs + * to a file, FreeType uses an the external `dlg` library (the source + * code is in `src/dlg`). + * + * This option needs a C99 compiler. + */ +/* #define FT_DEBUG_LOGGING */ + + + /************************************************************************** + * + * Autofitter debugging + * + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to + * control the autofitter behaviour for debugging purposes with global + * boolean variables (consequently, you should **never** enable this + * while compiling in 'release' mode): + * + * ``` + * af_debug_disable_horz_hints_ + * af_debug_disable_vert_hints_ + * af_debug_disable_blue_hints_ + * ``` + * + * Additionally, the following functions provide dumps of various + * internal autofit structures to stdout (using `printf`): + * + * ``` + * af_glyph_hints_dump_points + * af_glyph_hints_dump_segments + * af_glyph_hints_dump_edges + * af_glyph_hints_get_num_segments + * af_glyph_hints_get_segment_offset + * ``` + * + * As an argument, they use another global variable: + * + * ``` + * af_debug_hints_ + * ``` + * + * Please have a look at the `ftgrid` demo program to see how those + * variables and macros should be used. + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_AUTOFIT */ + + + /************************************************************************** + * + * Memory Debugging + * + * FreeType now comes with an integrated memory debugger that is capable + * of detecting simple errors like memory leaks or double deletes. To + * compile it within your build of the library, you should define + * `FT_DEBUG_MEMORY` here. + * + * Note that the memory debugger is only activated at runtime when when + * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! + * + * Do not `#undef` this macro here since the build system might define it + * for certain configurations only. + */ +/* #define FT_DEBUG_MEMORY */ + + + /************************************************************************** + * + * Module errors + * + * If this macro is set (which is _not_ the default), the higher byte of + * an error code gives the module in which the error has occurred, while + * the lower byte is the real error code. + * + * Setting this macro makes sense for debugging purposes only, since it + * would break source compatibility of certain programs that use + * FreeType~2. + * + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. + */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /************************************************************************** + * + * OpenType SVG Glyph Support + * + * Setting this macro enables support for OpenType SVG glyphs. By + * default, FreeType can only fetch SVG documents. However, it can also + * render them if external rendering hook functions are plugged in at + * runtime. + * + * More details on the hooks can be found in file `otsvg.h`. + */ +#define FT_CONFIG_OPTION_SVG + + + /************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +/* #define FT_CONFIG_OPTION_ERROR_STRINGS */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support colored + * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_COLOR_LAYERS + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate Postscript names of glyphs in a TrueType or OpenType + * file. + * + * Note that if you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES` macro, the 'sfnt' module will + * contain additional code to read the PostScript name table from a font. + * + * (By default, the module uses 'psnames' to extract glyph names.) + */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access + * the internal name table in a SFNT-based format like TrueType or + * OpenType. The name table contains various strings used to describe the + * font, like family name, copyright, version, etc. It does not contain + * any glyph name though. + * + * Accessing SFNT names is done through the functions declared in + * `ftsnames.h`. + */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /************************************************************************** + * + * TrueType CMap support + * + * Here you can fine-tune which TrueType CMap table format shall be + * supported. + */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a + * bytecode interpreter in the TrueType driver. + * + * By undefining this, you will only compile the code necessary to load + * TrueType glyphs without hinting. + * + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. + */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. + * + * In particular, it modifies the bytecode interpreter to interpret (or + * not) instructions in a certain way so that all TrueType fonts look like + * they do in a Windows ClearType (DirectWrite) environment. See [1] for a + * technical overview on what this means. See `ttinterp.h` for more + * details on this option. + * + * The new default mode focuses on applying a minimal set of rules to all + * fonts indiscriminately so that modern and web fonts render well while + * legacy fonts render okay. The corresponding interpreter version is v40. + * The so-called Infinality mode (v38) is no longer available in FreeType. + * + * By undefining these, you get rendering behavior like on Windows without + * ClearType, i.e., Windows XP without ClearType enabled and Win9x + * (interpreter version v35). Or not, depending on how much hinting blood + * and testing tears the font designer put into a given font. If you + * define one or both subpixel hinting options, you can switch between + * between v35 and the ones you define (using `FT_Property_Set`). + * + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be + * defined. + * + * [1] + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. + * + * Apple and MS disagree on the default behavior of component offsets in + * composites. Apple says that they should be scaled by the scaling + * factors in the transformation matrix (roughly, it's more complex) while + * MS says they should not. OpenType defines two bits in the composite + * flags array which can be used to disambiguate, but old fonts will not + * have them. + * + * https://www.microsoft.com/typography/otspec/glyf.htm + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html + */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and + * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. + */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_NO_BORING_EXPANSION` if you want to exclude + * support for 'boring' OpenType specification expansions. + * + * https://github.com/harfbuzz/boring-expansion-spec + * + * Right now, the following features are covered: + * + * - 'avar' version 2.0 + * + * Most likely, this is a temporary configuration option to be removed in + * the near future, since it is assumed that eventually those features are + * added to the OpenType standard. + */ +/* #define TT_CONFIG_OPTION_NO_BORING_EXPANSION */ + + + /************************************************************************** + * + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded 'BDF~' table within SFNT-based bitmap formats. + */ +#define TT_CONFIG_OPTION_BDF + + + /************************************************************************** + * + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). + * + * It is not expected that this value is ever modified by a configuring + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command + * line. + */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES +#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. + */ +#define T1_MAX_DICT_DEPTH 5 + + + /************************************************************************** + * + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 16 + + + /************************************************************************** + * + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. + * + * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character + * set) needs 256. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. + */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the Multiple Masters font support in the Type~1 driver. + */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /************************************************************************** + * + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. + */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** C F F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is + * possible to set up the default values of the four control points that + * define the stem darkening behaviour of the (new) CFF engine. For more + * details please read the documentation of the `darkening-parameters` + * property (file `ftdriver.h`), which allows the control at run-time. + * + * Do **not** undefine these macros! + */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + + + /************************************************************************** + * + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine + * gets compiled into FreeType. If defined, it is possible to switch + * between the two engines using the `hinting-engine` property of the 'cff' + * driver module. + */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** P C F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When selecting + * 'Fixed' in KDE or Gnome one gets results that appear rather random, the + * style changes often if one changes the size and one cannot select some + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. + * + * We also check whether we have 'wide' characters; all put together, we + * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. + * + * If this option is activated, it can be controlled with the + * `no-long-family-names` property of the 'pcf' driver module. + */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script + * support. + */ +#define AF_CONFIG_OPTION_CJK + + + /************************************************************************** + * + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. Currently, this needs option `AF_CONFIG_OPTION_CJK`. + */ +#ifdef AF_CONFIG_OPTION_CJK +#define AF_CONFIG_OPTION_INDIC +#endif + + + /************************************************************************** + * + * Use TrueType-like size metrics for 'light' auto-hinting. + * + * It is strongly recommended to avoid this option, which exists only to + * help some legacy applications retain its appearance and behaviour with + * respect to auto-hinted TrueType fonts. + * + * The very reason this option exists at all are GNU/Linux distributions + * like Fedora that did not un-patch the following change (which was + * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). + * + * ``` + * 2011-07-16 Steven Chu + * + * [truetype] Fix metrics on size request for scalable fonts. + * ``` + * + * This problematic commit is now reverted (more or less). + */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + + /* */ + + + /* + * This macro is obsolete. Support has been removed in FreeType version + * 2.5. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * The next two macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING +#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#endif +#endif + + + /* + * The TT_SUPPORT_COLRV1 macro is defined to indicate to clients that this + * version of FreeType has support for 'COLR' v1 API. This definition is + * useful to FreeType clients that want to build in support for 'COLR' v1 + * depending on a tip-of-tree checkout before it is officially released in + * FreeType, and while the feature cannot yet be tested against using + * version macros. Don't change this macro. This may be removed once the + * feature is in a FreeType release version and version macros can be used + * to test for availability. + */ +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS +#define TT_SUPPORT_COLRV1 +#endif + + + /* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set` in file `cffdrivr.c`. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 +#error "Invalid CFF darkening parameters!" +#endif + + +FT_END_HEADER + +#endif /* FTOPTION_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/config/ftstdlib.h b/external/freetype/include/freetype/config/ftstdlib.h new file mode 100644 index 000000000..f65148a90 --- /dev/null +++ b/external/freetype/include/freetype/config/ftstdlib.h @@ -0,0 +1,185 @@ +/**************************************************************************** + * + * ftstdlib.h + * + * ANSI-specific library and header configuration file (specification + * only). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to group all `#includes` to the ANSI~C library that + * FreeType normally requires. It also defines macros to rename the + * standard functions within the FreeType source code. + * + * Load a file which defines `FTSTDLIB_H_` before this one to override it. + * + */ + + +#ifndef FTSTDLIB_H_ +#define FTSTDLIB_H_ + + +#include + +#define ft_ptrdiff_t ptrdiff_t + + + /************************************************************************** + * + * integer limits + * + * `UINT_MAX` and `ULONG_MAX` are used to automatically compute the size of + * `int` and `long` in bytes at compile-time. So far, this works for all + * platforms the library has been tested on. We also check `ULLONG_MAX` + * to see whether we can use 64-bit `long long` later on. + * + * Note that on the extremely rare platforms that do not provide integer + * types that are _exactly_ 16 and 32~bits wide (e.g., some old Crays where + * `int` is 36~bits), we do not make any guarantee about the correct + * behaviour of FreeType~2 with all fonts. + * + * In these cases, `ftconfig.h` will refuse to compile anyway with a + * message like 'couldn't find 32-bit type' or something similar. + * + */ + + +#include + +#define FT_CHAR_BIT CHAR_BIT +#define FT_USHORT_MAX USHRT_MAX +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_LONG_MIN LONG_MIN +#define FT_LONG_MAX LONG_MAX +#define FT_ULONG_MAX ULONG_MAX +#ifdef LLONG_MAX +#define FT_LLONG_MAX LLONG_MAX +#endif +#ifdef LLONG_MIN +#define FT_LLONG_MIN LLONG_MIN +#endif +#ifdef ULLONG_MAX +#define FT_ULLONG_MAX ULLONG_MAX +#endif + + + /************************************************************************** + * + * character and string processing + * + */ + + +#include + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /************************************************************************** + * + * file handling + * + */ + + +#include + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_snprintf snprintf + + + /************************************************************************** + * + * sorting + * + */ + + +#include + +#define ft_qsort qsort + + + /************************************************************************** + * + * memory allocation + * + */ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /************************************************************************** + * + * miscellaneous + * + */ + + +#define ft_strtol strtol +#define ft_getenv getenv + + + /************************************************************************** + * + * execution control + * + */ + + +#include + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* `jmp_buf` is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */ + + + /* The following is only used for debugging purposes, i.e., if */ + /* `FT_DEBUG_LEVEL_ERROR` or `FT_DEBUG_LEVEL_TRACE` are defined. */ + +#include + + +#endif /* FTSTDLIB_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/config/integer-types.h b/external/freetype/include/freetype/config/integer-types.h new file mode 100644 index 000000000..7258b5085 --- /dev/null +++ b/external/freetype/include/freetype/config/integer-types.h @@ -0,0 +1,250 @@ +/**************************************************************************** + * + * config/integer-types.h + * + * FreeType integer types definitions. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ +#ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_ +#define FREETYPE_CONFIG_INTEGER_TYPES_H_ + + /* There are systems (like the Texas Instruments 'C54x) where a `char` */ + /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ + /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ + /* `char` type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + +#ifndef FT_SIZEOF_INT + + /* The size of an `int` type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `int' type!" +#endif + +#endif /* !defined(FT_SIZEOF_INT) */ + +#ifndef FT_SIZEOF_LONG + + /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !defined(FT_SIZEOF_LONG) */ + +#ifndef FT_SIZEOF_LONG_LONG + + /* The size of a `long long` type if available */ +#if defined( FT_ULLONG_MAX ) && FT_ULLONG_MAX >= 0xFFFFFFFFFFFFFFFFULL +#define FT_SIZEOF_LONG_LONG ( 64 / FT_CHAR_BIT ) +#else +#define FT_SIZEOF_LONG_LONG 0 +#endif + +#endif /* !defined(FT_SIZEOF_LONG_LONG) */ + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Int16 + * + * @description: + * A typedef for a 16bit signed integer type. + */ + typedef signed short FT_Int16; + + + /************************************************************************** + * + * @type: + * FT_UInt16 + * + * @description: + * A typedef for a 16bit unsigned integer type. + */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /************************************************************************** + * + * @type: + * FT_Int32 + * + * @description: + * A typedef for a 32bit signed integer type. The size depends on the + * configuration. + */ + typedef signed XXX FT_Int32; + + + /************************************************************************** + * + * @type: + * FT_UInt32 + * + * A typedef for a 32bit unsigned integer type. The size depends on the + * configuration. + */ + typedef unsigned XXX FT_UInt32; + + + /************************************************************************** + * + * @type: + * FT_Int64 + * + * A typedef for a 64bit signed integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef signed XXX FT_Int64; + + + /************************************************************************** + * + * @type: + * FT_UInt64 + * + * A typedef for a 64bit unsigned integer type. The size depends on the + * configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ + typedef unsigned XXX FT_UInt64; + + /* */ + +#endif + +#if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT ) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32~bits */ +#if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit integer type */ +#if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) + +#define FT_INT64 long +#define FT_UINT64 unsigned long + +#elif FT_SIZEOF_LONG_LONG >= ( 64 / FT_CHAR_BIT ) + +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + + /************************************************************************** + * + * A 64-bit data type may create compilation problems if you compile in + * strict ANSI mode. To avoid them, we disable other 64-bit data types if + * `__STDC__` is defined. You can however ignore this rule by defining the + * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. + */ +#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#if defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the `__int64` type */ +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of `__BORLANDC__` in order */ + /* to test the compiler version. */ + + /* this compiler provides the `__int64` type */ +#define FT_INT64 __int64 +#define FT_UINT64 unsigned __int64 + +#elif defined( __WATCOMC__ ) && __WATCOMC__ >= 1100 /* Watcom C++ */ + +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long` type */ +#define FT_INT64 long long int +#define FT_UINT64 unsigned long long int + +#endif /* !__STDC__ */ + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + +#ifdef FT_INT64 + typedef FT_INT64 FT_Int64; + typedef FT_UINT64 FT_UInt64; +#endif + + +#endif /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */ diff --git a/external/freetype/include/freetype/config/mac-support.h b/external/freetype/include/freetype/config/mac-support.h new file mode 100644 index 000000000..b77b96d5d --- /dev/null +++ b/external/freetype/include/freetype/config/mac-support.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * + * config/mac-support.h + * + * Mac/OS X support configuration header. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ +#ifndef FREETYPE_CONFIG_MAC_SUPPORT_H_ +#define FREETYPE_CONFIG_MAC_SUPPORT_H_ + + /************************************************************************** + * + * Mac support + * + * This is the only necessary change, so it is defined here instead + * providing a new configuration file. + */ +#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* No Carbon frameworks for 64bit 10.4.x. */ + /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ + /* so guess the system version by maximum errno before inclusion. */ +#include +#ifdef ECANCELED /* defined since 10.2 */ +#include "AvailabilityMacros.h" +#endif +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#undef FT_MACINTOSH +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif /* Mac support */ + +#endif /* FREETYPE_CONFIG_MAC_SUPPORT_H_ */ diff --git a/external/freetype/include/freetype/config/public-macros.h b/external/freetype/include/freetype/config/public-macros.h new file mode 100644 index 000000000..23d0fa6a3 --- /dev/null +++ b/external/freetype/include/freetype/config/public-macros.h @@ -0,0 +1,138 @@ +/**************************************************************************** + * + * config/public-macros.h + * + * Define a set of compiler macros used in public FreeType headers. + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /* + * The definitions in this file are used by the public FreeType headers + * and thus should be considered part of the public API. + * + * Other compiler-specific macro definitions that are not exposed by the + * FreeType API should go into + * `include/freetype/internal/compiler-macros.h` instead. + */ +#ifndef FREETYPE_CONFIG_PUBLIC_MACROS_H_ +#define FREETYPE_CONFIG_PUBLIC_MACROS_H_ + + /* + * `FT_BEGIN_HEADER` and `FT_END_HEADER` might have already been defined + * by `freetype/config/ftheader.h`, but we don't want to include this + * header here, so redefine the macros here only when needed. Their + * definition is very stable, so keeping them in sync with the ones in the + * header should not be a maintenance issue. + */ +#ifndef FT_BEGIN_HEADER +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* empty */ +#endif +#endif /* FT_BEGIN_HEADER */ + +#ifndef FT_END_HEADER +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* empty */ +#endif +#endif /* FT_END_HEADER */ + + +FT_BEGIN_HEADER + + /* + * Mark a function declaration as public. This ensures it will be + * properly exported to client code. Place this before a function + * declaration. + * + * NOTE: This macro should be considered an internal implementation + * detail, and not part of the FreeType API. It is only defined here + * because it is needed by `FT_EXPORT`. + */ + + /* Visual C, mingw */ +#if defined( _WIN32 ) + +#if defined( FT2_BUILD_LIBRARY ) && defined( DLL_EXPORT ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllexport ) +#elif defined( DLL_IMPORT ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __declspec( dllimport ) +#endif + + /* gcc, clang */ +#elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ ) +#define FT_PUBLIC_FUNCTION_ATTRIBUTE \ + __attribute__(( visibility( "default" ) )) + + /* Sun */ +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_PUBLIC_FUNCTION_ATTRIBUTE __global +#endif + + +#ifndef FT_PUBLIC_FUNCTION_ATTRIBUTE +#define FT_PUBLIC_FUNCTION_ATTRIBUTE /* empty */ +#endif + + + /* + * Define a public FreeType API function. This ensures it is properly + * exported or imported at build time. The macro parameter is the + * function's return type as in: + * + * FT_EXPORT( FT_Bool ) + * FT_Object_Method( FT_Object obj, + * ... ); + * + * NOTE: This requires that all `FT_EXPORT` uses are inside + * `FT_BEGIN_HEADER ... FT_END_HEADER` blocks. This guarantees that the + * functions are exported with C linkage, even when the header is included + * by a C++ source file. + */ +#define FT_EXPORT( x ) FT_PUBLIC_FUNCTION_ATTRIBUTE extern x + + + /* + * `FT_UNUSED` indicates that a given parameter is not used -- this is + * only used to get rid of unpleasant compiler warnings. + * + * Technically, this was not meant to be part of the public API, but some + * third-party code depends on it. + */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /* + * Support for casts in both C and C++. + */ +#ifdef __cplusplus +#define FT_STATIC_CAST( type, var ) static_cast(var) +#define FT_REINTERPRET_CAST( type, var ) reinterpret_cast(var) + +#define FT_STATIC_BYTE_CAST( type, var ) \ + static_cast( static_cast( var ) ) +#else +#define FT_STATIC_CAST( type, var ) (type)(var) +#define FT_REINTERPRET_CAST( type, var ) (type)(var) + +#define FT_STATIC_BYTE_CAST( type, var ) (type)(unsigned char)(var) +#endif + + +FT_END_HEADER + +#endif /* FREETYPE_CONFIG_PUBLIC_MACROS_H_ */ diff --git a/external/freetype/include/freetype/freetype.h b/external/freetype/include/freetype/freetype.h new file mode 100644 index 000000000..92acf3794 --- /dev/null +++ b/external/freetype/include/freetype/freetype.h @@ -0,0 +1,5337 @@ +/**************************************************************************** + * + * freetype.h + * + * FreeType high-level API and common types (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FREETYPE_H_ +#define FREETYPE_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include +#include + + +FT_BEGIN_HEADER + + + + /************************************************************************** + * + * @section: + * preamble + * + * @title: + * Preamble + * + * @abstract: + * What FreeType is and isn't + * + * @description: + * FreeType is a library that provides access to glyphs in font files. It + * scales the glyph images and their metrics to a requested size, and it + * rasterizes the glyph images to produce pixel or subpixel alpha coverage + * bitmaps. + * + * Note that FreeType is _not_ a text layout engine. You have to use + * higher-level libraries like HarfBuzz, Pango, or ICU for that. + * + * Note also that FreeType does _not_ perform alpha blending or + * compositing the resulting bitmaps or pixmaps by itself. Use your + * favourite graphics library (for example, Cairo or Skia) to further + * process FreeType's output. + * + */ + + + /************************************************************************** + * + * @section: + * header_inclusion + * + * @title: + * FreeType's header inclusion scheme + * + * @abstract: + * How client applications should include FreeType header files. + * + * @description: + * To be as flexible as possible (and for historical reasons), you must + * load file `ft2build.h` first before other header files, for example + * + * ``` + * #include + * + * #include + * #include + * ``` + */ + + + /************************************************************************** + * + * @section: + * user_allocation + * + * @title: + * User allocation + * + * @abstract: + * How client applications should allocate FreeType data structures. + * + * @description: + * FreeType assumes that structures allocated by the user and passed as + * arguments are zeroed out except for the actual data. In other words, + * it is recommended to use `calloc` (or variants of it) instead of + * `malloc` for allocation. + * + */ + + + /************************************************************************** + * + * @section: + * font_testing_macros + * + * @title: + * Font Testing Macros + * + * @abstract: + * Macros to test various properties of fonts. + * + * @description: + * Macros to test the most important font properties. + * + * It is recommended to use these high-level macros instead of directly + * testing the corresponding flags, which are scattered over various + * structures. + * + * @order: + * FT_HAS_HORIZONTAL + * FT_HAS_VERTICAL + * FT_HAS_KERNING + * FT_HAS_FIXED_SIZES + * FT_HAS_GLYPH_NAMES + * FT_HAS_COLOR + * FT_HAS_MULTIPLE_MASTERS + * FT_HAS_SVG + * FT_HAS_SBIX + * FT_HAS_SBIX_OVERLAY + * + * FT_IS_SFNT + * FT_IS_SCALABLE + * FT_IS_FIXED_WIDTH + * FT_IS_CID_KEYED + * FT_IS_TRICKY + * FT_IS_NAMED_INSTANCE + * FT_IS_VARIATION + * + */ + + + /************************************************************************** + * + * @section: + * library_setup + * + * @title: + * Library Setup + * + * @abstract: + * Functions to start and end the usage of the FreeType library. + * + * @description: + * Functions to start and end the usage of the FreeType library. + * + * Note that @FT_Library_Version and @FREETYPE_XXX are of limited use + * because even a new release of FreeType with only documentation + * changes increases the version number. + * + * @order: + * FT_Library + * FT_Init_FreeType + * FT_Done_FreeType + * + * FT_Library_Version + * FREETYPE_XXX + * + */ + + + /************************************************************************** + * + * @section: + * face_creation + * + * @title: + * Face Creation + * + * @abstract: + * Functions to manage fonts. + * + * @description: + * The functions and structures collected in this section operate on + * fonts globally. + * + * @order: + * FT_Face + * FT_FaceRec + * FT_FACE_FLAG_XXX + * FT_STYLE_FLAG_XXX + * + * FT_New_Face + * FT_Done_Face + * FT_Reference_Face + * FT_New_Memory_Face + * FT_Face_Properties + * FT_Open_Face + * FT_Open_Args + * FT_OPEN_XXX + * FT_Parameter + * FT_Attach_File + * FT_Attach_Stream + * + */ + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + * @title: + * Sizing and Scaling + * + * @abstract: + * Functions to manage font sizes. + * + * @description: + * The functions and structures collected in this section are related to + * selecting and manipulating the size of a font globally. + * + * @order: + * FT_Size + * FT_SizeRec + * FT_Size_Metrics + * + * FT_Bitmap_Size + * + * FT_Set_Char_Size + * FT_Set_Pixel_Sizes + * FT_Request_Size + * FT_Select_Size + * FT_Size_Request_Type + * FT_Size_RequestRec + * FT_Size_Request + * + * FT_Set_Transform + * FT_Get_Transform + * + */ + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + * @title: + * Glyph Retrieval + * + * @abstract: + * Functions to manage glyphs. + * + * @description: + * The functions and structures collected in this section operate on + * single glyphs, of which @FT_Load_Glyph is most important. + * + * @order: + * FT_GlyphSlot + * FT_GlyphSlotRec + * FT_Glyph_Metrics + * + * FT_Load_Glyph + * FT_LOAD_XXX + * FT_LOAD_TARGET_MODE + * FT_LOAD_TARGET_XXX + * + * FT_Render_Glyph + * FT_Render_Mode + * FT_Get_Kerning + * FT_Kerning_Mode + * FT_Get_Track_Kerning + * + */ + + + /************************************************************************** + * + * @section: + * character_mapping + * + * @title: + * Character Mapping + * + * @abstract: + * Functions to manage character-to-glyph maps. + * + * @description: + * This section holds functions and structures that are related to + * mapping character input codes to glyph indices. + * + * Note that for many scripts the simplistic approach used by FreeType + * of mapping a single character to a single glyph is not valid or + * possible! In general, a higher-level library like HarfBuzz or ICU + * should be used for handling text strings. + * + * @order: + * FT_CharMap + * FT_CharMapRec + * FT_Encoding + * FT_ENC_TAG + * + * FT_Select_Charmap + * FT_Set_Charmap + * FT_Get_Charmap_Index + * + * FT_Get_Char_Index + * FT_Get_First_Char + * FT_Get_Next_Char + * FT_Load_Char + * + */ + + + /************************************************************************** + * + * @section: + * information_retrieval + * + * @title: + * Information Retrieval + * + * @abstract: + * Functions to retrieve font and glyph information. + * + * @description: + * Functions to retrieve font and glyph information. Only some very + * basic data is covered; see also the chapter on the format-specific + * API for more. + * + * + * @order: + * FT_Get_Name_Index + * FT_Get_Glyph_Name + * FT_Get_Postscript_Name + * FT_Get_FSType_Flags + * FT_FSTYPE_XXX + * FT_Get_SubGlyph_Info + * FT_SUBGLYPH_FLAG_XXX + * + */ + + + /************************************************************************** + * + * @section: + * other_api_data + * + * @title: + * Other API Data + * + * @abstract: + * Other structures, enumerations, and macros. + * + * @description: + * Other structures, enumerations, and macros. Deprecated functions are + * also listed here. + * + * @order: + * FT_Face_Internal + * FT_Size_Internal + * FT_Slot_Internal + * + * FT_SubGlyph + * + * FT_HAS_FAST_GLYPHS + * FT_Face_CheckTrueTypePatents + * FT_Face_SetUnpatentedHinting + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + + /************************************************************************** + * + * @struct: + * FT_Glyph_Metrics + * + * @description: + * A structure to model the metrics of a single glyph. The values are + * expressed in 26.6 fractional pixel format; if the flag + * @FT_LOAD_NO_SCALE has been used while loading the glyph, values are + * expressed in font units instead. + * + * @fields: + * width :: + * The glyph's width. + * + * height :: + * The glyph's height. + * + * horiBearingX :: + * Left side bearing for horizontal layout. + * + * horiBearingY :: + * Top side bearing for horizontal layout. + * + * horiAdvance :: + * Advance width for horizontal layout. + * + * vertBearingX :: + * Left side bearing for vertical layout. + * + * vertBearingY :: + * Top side bearing for vertical layout. Larger positive values mean + * further below the vertical glyph origin. + * + * vertAdvance :: + * Advance height for vertical layout. Positive values mean the glyph + * has a positive advance downward. + * + * @note: + * If not disabled with @FT_LOAD_NO_HINTING, the values represent + * dimensions of the hinted glyph (in case hinting is applicable). + * + * Stroking a glyph with an outside border does not increase + * `horiAdvance` or `vertAdvance`; you have to manually adjust these + * values to account for the added width and height. + * + * FreeType doesn't use the 'VORG' table data for CFF fonts because it + * doesn't have an interface to quickly retrieve the glyph height. The + * y~coordinate of the vertical origin can be simply computed as + * `vertBearingY + height` after loading a glyph. + */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + + /************************************************************************** + * + * @struct: + * FT_Bitmap_Size + * + * @description: + * This structure models the metrics of a bitmap strike (i.e., a set of + * glyphs for a given point size and resolution) in a bitmap font. It is + * used for the `available_sizes` field of @FT_Face. + * + * @fields: + * height :: + * The vertical distance, in pixels, between two consecutive baselines. + * It is always positive. + * + * width :: + * The average width, in pixels, of all glyphs in the strike. + * + * size :: + * The nominal size of the strike in 26.6 fractional points. This + * field is not very useful. + * + * x_ppem :: + * The horizontal ppem (nominal width) in 26.6 fractional pixels. + * + * y_ppem :: + * The vertical ppem (nominal height) in 26.6 fractional pixels. + * + * @note: + * Windows FNT: + * The nominal size given in a FNT font is not reliable. If the driver + * finds it incorrect, it sets `size` to some calculated values, and + * `x_ppem` and `y_ppem` to the pixel width and height given in the + * font, respectively. + * + * TrueType embedded bitmaps: + * `size`, `width`, and `height` values are not contained in the bitmap + * strike itself. They are computed from the global font parameters. + */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @section: + * library_setup + * + */ + + /************************************************************************** + * + * @type: + * FT_Library + * + * @description: + * A handle to a FreeType library instance. Each 'library' is completely + * independent from the others; it is the 'root' of a set of objects like + * fonts, faces, sizes, etc. + * + * It also embeds a memory manager (see @FT_Memory), as well as a + * scan-line converter object (see @FT_Raster). + * + * [Since 2.5.6] In multi-threaded applications it is easiest to use one + * `FT_Library` object per thread. In case this is too cumbersome, a + * single `FT_Library` object across threads is possible also, as long as + * a mutex lock is used around @FT_New_Face and @FT_Done_Face. + * + * @note: + * Library objects are normally created by @FT_Init_FreeType, and + * destroyed with @FT_Done_FreeType. If you need reference-counting + * (cf. @FT_Reference_Library), use @FT_New_Library and @FT_Done_Library. + */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + /************************************************************************** + * + * @type: + * FT_Module + * + * @description: + * A handle to a given FreeType module object. A module can be a font + * driver, a renderer, or anything else that provides services to the + * former. + */ + typedef struct FT_ModuleRec_* FT_Module; + + + /************************************************************************** + * + * @type: + * FT_Driver + * + * @description: + * A handle to a given FreeType font driver object. A font driver is a + * module capable of creating faces from font files. + */ + typedef struct FT_DriverRec_* FT_Driver; + + + /************************************************************************** + * + * @type: + * FT_Renderer + * + * @description: + * A handle to a given FreeType renderer. A renderer is a module in + * charge of converting a glyph's outline image to a bitmap. It supports + * a single glyph image format, and one or more target surface depths. + */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /************************************************************************** + * + * @section: + * face_creation + * + */ + + /************************************************************************** + * + * @type: + * FT_Face + * + * @description: + * A handle to a typographic face object. A face object models a given + * typeface, in a given style. + * + * @note: + * A face object also owns a single @FT_GlyphSlot object, as well as one + * or more @FT_Size objects. + * + * Use @FT_New_Face or @FT_Open_Face to create a new face object from a + * given filepath or a custom input stream. + * + * Use @FT_Done_Face to destroy it (along with its slot and sizes). + * + * An `FT_Face` object can only be safely used from one thread at a time. + * Similarly, creation and destruction of `FT_Face` with the same + * @FT_Library object can only be done from one thread at a time. On the + * other hand, functions like @FT_Load_Glyph and its siblings are + * thread-safe and do not need the lock to be held as long as the same + * `FT_Face` object is not used from multiple threads at the same time. + * + * @also: + * See @FT_FaceRec for the publicly accessible fields of a given face + * object. + */ + typedef struct FT_FaceRec_* FT_Face; + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + + /************************************************************************** + * + * @type: + * FT_Size + * + * @description: + * A handle to an object that models a face scaled to a given character + * size. + * + * @note: + * An @FT_Face has one _active_ `FT_Size` object that is used by + * functions like @FT_Load_Glyph to determine the scaling transformation + * that in turn is used to load and hint glyphs and metrics. + * + * A newly created `FT_Size` object contains only meaningless zero values. + * You must use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, @FT_Request_Size + * or even @FT_Select_Size to change the content (i.e., the scaling + * values) of the active `FT_Size`. Otherwise, the scaling and hinting + * will not be performed. + * + * You can use @FT_New_Size to create additional size objects for a given + * @FT_Face, but they won't be used by other functions until you activate + * it through @FT_Activate_Size. Only one size can be activated at any + * given time per face. + * + * @also: + * See @FT_SizeRec for the publicly accessible fields of a given size + * object. + */ + typedef struct FT_SizeRec_* FT_Size; + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + + /************************************************************************** + * + * @type: + * FT_GlyphSlot + * + * @description: + * A handle to a given 'glyph slot'. A slot is a container that can hold + * any of the glyphs contained in its parent face. + * + * In other words, each time you call @FT_Load_Glyph or @FT_Load_Char, + * the slot's content is erased by the new glyph data, i.e., the glyph's + * metrics, its image (bitmap or outline), and other control information. + * + * @also: + * See @FT_GlyphSlotRec for the publicly accessible glyph fields. + */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /************************************************************************** + * + * @section: + * character_mapping + * + */ + + /************************************************************************** + * + * @type: + * FT_CharMap + * + * @description: + * A handle to a character map (usually abbreviated to 'charmap'). A + * charmap is used to translate character codes in a given encoding into + * glyph indexes for its parent's face. Some font formats may provide + * several charmaps per font. + * + * Each face object owns zero or more charmaps, but only one of them can + * be 'active', providing the data used by @FT_Get_Char_Index or + * @FT_Load_Char. + * + * The list of available charmaps in a face is available through the + * `face->num_charmaps` and `face->charmaps` fields of @FT_FaceRec. + * + * The currently active charmap is available as `face->charmap`. You + * should call @FT_Set_Charmap to change it. + * + * @note: + * When a new face is created (either through @FT_New_Face or + * @FT_Open_Face), the library looks for a Unicode charmap within the + * list and automatically activates it. If there is no Unicode charmap, + * FreeType doesn't set an 'active' charmap. + * + * @also: + * See @FT_CharMapRec for the publicly accessible fields of a given + * character map. + */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /************************************************************************** + * + * @macro: + * FT_ENC_TAG + * + * @description: + * This macro converts four-letter tags into an unsigned long. It is + * used to define 'encoding' identifiers (see @FT_Encoding). + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_ENC_TAG( value, a, b, c, d ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ + +#ifndef FT_ENC_TAG + +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( FT_STATIC_BYTE_CAST( FT_UInt32, a ) << 24 ) | \ + ( FT_STATIC_BYTE_CAST( FT_UInt32, b ) << 16 ) | \ + ( FT_STATIC_BYTE_CAST( FT_UInt32, c ) << 8 ) | \ + FT_STATIC_BYTE_CAST( FT_UInt32, d ) ) + +#endif /* FT_ENC_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Encoding + * + * @description: + * An enumeration to specify character sets supported by charmaps. Used + * in the @FT_Select_Charmap API function. + * + * @note: + * Despite the name, this enumeration lists specific character + * repertoires (i.e., charsets), and not text encoding methods (e.g., + * UTF-8, UTF-16, etc.). + * + * Other encodings might be defined in the future. + * + * @values: + * FT_ENCODING_NONE :: + * The encoding value~0 is reserved for all formats except BDF, PCF, + * and Windows FNT; see below for more information. + * + * FT_ENCODING_UNICODE :: + * The Unicode character set. This value covers all versions of the + * Unicode repertoire, including ASCII and Latin-1. Most fonts include + * a Unicode charmap, but not all of them. + * + * For example, if you want to access Unicode value U+1F028 (and the + * font contains it), use value 0x1F028 as the input value for + * @FT_Get_Char_Index. + * + * FT_ENCODING_MS_SYMBOL :: + * Microsoft Symbol encoding, used to encode mathematical symbols and + * wingdings. For more information, see + * 'https://www.microsoft.com/typography/otspec/recom.htm#non-standard-symbol-fonts', + * 'http://www.kostis.net/charsets/symbol.htm', and + * 'http://www.kostis.net/charsets/wingding.htm'. + * + * This encoding uses character codes from the PUA (Private Unicode + * Area) in the range U+F020-U+F0FF. + * + * FT_ENCODING_SJIS :: + * Shift JIS encoding for Japanese. More info at + * 'https://en.wikipedia.org/wiki/Shift_JIS'. See note on multi-byte + * encodings below. + * + * FT_ENCODING_PRC :: + * Corresponds to encoding systems mainly for Simplified Chinese as + * used in People's Republic of China (PRC). The encoding layout is + * based on GB~2312 and its supersets GBK and GB~18030. + * + * FT_ENCODING_BIG5 :: + * Corresponds to an encoding system for Traditional Chinese as used in + * Taiwan and Hong Kong. + * + * FT_ENCODING_WANSUNG :: + * Corresponds to the Korean encoding system known as Extended Wansung + * (MS Windows code page 949). For more information see + * 'https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. + * + * FT_ENCODING_JOHAB :: + * The Korean standard character set (KS~C 5601-1992), which + * corresponds to MS Windows code page 1361. This character set + * includes all possible Hangul character combinations. + * + * FT_ENCODING_ADOBE_LATIN_1 :: + * Corresponds to a Latin-1 encoding as defined in a Type~1 PostScript + * font. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_STANDARD :: + * Adobe Standard encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_EXPERT :: + * Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF + * fonts. It is limited to 256 character codes. + * + * FT_ENCODING_ADOBE_CUSTOM :: + * Corresponds to a custom encoding, as found in Type~1, CFF, and + * OpenType/CFF fonts. It is limited to 256 character codes. + * + * FT_ENCODING_APPLE_ROMAN :: + * Apple roman encoding. Many TrueType and OpenType fonts contain a + * charmap for this 8-bit encoding, since older versions of Mac OS are + * able to use it. + * + * FT_ENCODING_OLD_LATIN_2 :: + * This value is deprecated and was neither used nor reported by + * FreeType. Don't use or test for it. + * + * FT_ENCODING_MS_SJIS :: + * Same as FT_ENCODING_SJIS. Deprecated. + * + * FT_ENCODING_MS_GB2312 :: + * Same as FT_ENCODING_PRC. Deprecated. + * + * FT_ENCODING_MS_BIG5 :: + * Same as FT_ENCODING_BIG5. Deprecated. + * + * FT_ENCODING_MS_WANSUNG :: + * Same as FT_ENCODING_WANSUNG. Deprecated. + * + * FT_ENCODING_MS_JOHAB :: + * Same as FT_ENCODING_JOHAB. Deprecated. + * + * @note: + * When loading a font, FreeType makes a Unicode charmap active if + * possible (either if the font provides such a charmap, or if FreeType + * can synthesize one from PostScript glyph name dictionaries; in either + * case, the charmap is tagged with `FT_ENCODING_UNICODE`). If such a + * charmap is synthesized, it is placed at the first position of the + * charmap array. + * + * All other encodings are considered legacy and tagged only if + * explicitly defined in the font file. Otherwise, `FT_ENCODING_NONE` is + * used. + * + * `FT_ENCODING_NONE` is set by the BDF and PCF drivers if the charmap is + * neither Unicode nor ISO-8859-1 (otherwise it is set to + * `FT_ENCODING_UNICODE`). Use @FT_Get_BDF_Charset_ID to find out which + * encoding is really present. If, for example, the `cs_registry` field + * is 'KOI8' and the `cs_encoding` field is 'R', the font is encoded in + * KOI8-R. + * + * `FT_ENCODING_NONE` is always set (with a single exception) by the + * winfonts driver. Use @FT_Get_WinFNT_Header and examine the `charset` + * field of the @FT_WinFNT_HeaderRec structure to find out which encoding + * is really present. For example, @FT_WinFNT_ID_CP1251 (204) means + * Windows code page 1251 (for Russian). + * + * `FT_ENCODING_NONE` is set if `platform_id` is @TT_PLATFORM_MACINTOSH + * and `encoding_id` is not `TT_MAC_ID_ROMAN` (otherwise it is set to + * `FT_ENCODING_APPLE_ROMAN`). + * + * If `platform_id` is @TT_PLATFORM_MACINTOSH, use the function + * @FT_Get_CMap_Language_ID to query the Mac language ID that may be + * needed to be able to distinguish Apple encoding variants. See + * + * https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt + * + * to get an idea how to do that. Basically, if the language ID is~0, + * don't use it, otherwise subtract 1 from the language ID. Then examine + * `encoding_id`. If, for example, `encoding_id` is `TT_MAC_ID_ROMAN` + * and the language ID (minus~1) is `TT_MAC_LANGID_GREEK`, it is the + * Greek encoding, not Roman. `TT_MAC_ID_ARABIC` with + * `TT_MAC_LANGID_FARSI` means the Farsi variant of the Arabic encoding. + */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_PRC, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backward compatibility */ + FT_ENCODING_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /* these constants are deprecated; use the corresponding `FT_Encoding` */ + /* values instead */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_PRC +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /************************************************************************** + * + * @struct: + * FT_CharMapRec + * + * @description: + * The base charmap structure. + * + * @fields: + * face :: + * A handle to the parent face object. + * + * encoding :: + * An @FT_Encoding tag identifying the charmap. Use this with + * @FT_Select_Charmap. + * + * platform_id :: + * An ID number describing the platform for the following encoding ID. + * This comes directly from the TrueType specification and gets + * emulated for other formats. + * + * encoding_id :: + * A platform-specific encoding number. This also comes from the + * TrueType specification and gets emulated similarly. + */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * other_api_data + * + */ + + /************************************************************************** + * + * @type: + * FT_Face_Internal + * + * @description: + * An opaque handle to an `FT_Face_InternalRec` structure that models the + * private data of a given @FT_Face object. + * + * This structure might change between releases of FreeType~2 and is not + * generally available to client applications. + */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /************************************************************************** + * + * @section: + * face_creation + * + */ + + /************************************************************************** + * + * @struct: + * FT_FaceRec + * + * @description: + * FreeType root face class structure. A face object models a typeface + * in a font file. + * + * @fields: + * num_faces :: + * The number of faces in the font file. Some font formats can have + * multiple faces in a single font file. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). They are set + * to~0 if there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, holding the named instance index for the current face + * index (starting with value~1; value~0 indicates font access without + * a named instance). For non-variation fonts, bits 16-30 are ignored. + * If we have the third named instance of face~4, say, `face_index` is + * set to 0x00030004. + * + * Bit 31 is always zero (that is, `face_index` is always a positive + * value). + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the named instance index value (only + * @FT_Set_Named_Instance does that). + * + * face_flags :: + * A set of bit flags that give important information about the face; + * see @FT_FACE_FLAG_XXX for the details. + * + * style_flags :: + * The lower 16~bits contain a set of bit flags indicating the style of + * the face; see @FT_STYLE_FLAG_XXX for the details. + * + * [Since 2.6.1] Bits 16-30 hold the number of named instances + * available for the current face if we have a GX or OpenType variation + * (sub)font. Bit 31 is always zero (that is, `style_flags` is always + * a positive value). Note that a variation font has always at least + * one named instance, namely the default instance. + * + * num_glyphs :: + * The number of glyphs in the face. If the face is scalable and has + * sbits (see `num_fixed_sizes`), it is set to the number of outline + * glyphs. + * + * For CID-keyed fonts (not in an SFNT wrapper) this value gives the + * highest CID used in the font. + * + * family_name :: + * The face's family name. This is an ASCII string, usually in + * English, that describes the typeface's family (like 'Times New + * Roman', 'Bodoni', 'Garamond', etc). This is a least common + * denominator used to list fonts. Some formats (TrueType & OpenType) + * provide localized and Unicode versions of this string. Applications + * should use the format-specific interface to access them. Can be + * `NULL` (e.g., in fonts embedded in a PDF file). + * + * In case the font doesn't provide a specific family name entry, + * FreeType tries to synthesize one, deriving it from other name + * entries. + * + * style_name :: + * The face's style name. This is an ASCII string, usually in English, + * that describes the typeface's style (like 'Italic', 'Bold', + * 'Condensed', etc). Not all font formats provide a style name, so + * this field is optional, and can be set to `NULL`. As for + * `family_name`, some formats provide localized and Unicode versions + * of this string. Applications should use the format-specific + * interface to access them. + * + * num_fixed_sizes :: + * The number of bitmap strikes in the face. Even if the face is + * scalable, there might still be bitmap strikes, which are called + * 'sbits' in that case. + * + * available_sizes :: + * An array of @FT_Bitmap_Size for all bitmap strikes in the face. It + * is set to `NULL` if there is no bitmap strike. + * + * Note that FreeType tries to sanitize the strike data since they are + * sometimes sloppy or incorrect, but this can easily fail. + * + * num_charmaps :: + * The number of charmaps in the face. + * + * charmaps :: + * An array of the charmaps of the face. + * + * generic :: + * A field reserved for client uses. See the @FT_Generic type + * description. + * + * bbox :: + * The font bounding box. Coordinates are expressed in font units (see + * `units_per_EM`). The box is large enough to contain any glyph from + * the font. Thus, `bbox.yMax` can be seen as the 'maximum ascender', + * and `bbox.yMin` as the 'minimum descender'. Only relevant for + * scalable formats. + * + * Note that the bounding box might be off by (at least) one pixel for + * hinted fonts. See @FT_Size_Metrics for further discussion. + * + * Note that the bounding box does not vary in OpenType variation fonts + * and should only be used in relation to the default instance. + * + * units_per_EM :: + * The number of font units per EM square for this face. This is + * typically 2048 for TrueType fonts, and 1000 for Type~1 fonts. Only + * relevant for scalable formats. + * + * ascender :: + * The typographic ascender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMax`. + * Only relevant for scalable formats. + * + * descender :: + * The typographic descender of the face, expressed in font units. For + * font formats not having this information, it is set to `bbox.yMin`. + * Note that this field is negative for values below the baseline. + * Only relevant for scalable formats. + * + * height :: + * This value is the vertical distance between two consecutive + * baselines, expressed in font units. It is always positive. Only + * relevant for scalable formats. + * + * If you want the global glyph height, use `ascender - descender`. + * + * max_advance_width :: + * The maximum advance width, in font units, for all glyphs in this + * face. This can be used to make word wrapping computations faster. + * Only relevant for scalable formats. + * + * max_advance_height :: + * The maximum advance height, in font units, for all glyphs in this + * face. This is only relevant for vertical layouts, and is set to + * `height` for fonts that do not provide vertical metrics. Only + * relevant for scalable formats. + * + * underline_position :: + * The position, in font units, of the underline line for this face. + * It is the center of the underlining stem. Only relevant for + * scalable formats. + * + * underline_thickness :: + * The thickness, in font units, of the underline for this face. Only + * relevant for scalable formats. + * + * glyph :: + * The face's associated glyph slot(s). + * + * size :: + * The current active size for this face. + * + * charmap :: + * The current active charmap for this face. + * + * @note: + * Fields may be changed after a call to @FT_Attach_File or + * @FT_Attach_Stream. + * + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `ascender`, `descender`, `height`, + * `underline_position`, and `underline_thickness`. + * + * Especially for TrueType fonts see also the documentation for + * @FT_Size_Metrics. + */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /* The following member variables (down to `underline_thickness`) */ + /* are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /* for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /* private fields, internal to FreeType */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; /* face-specific auto-hinter data */ + void* extensions; /* unused */ + + FT_Face_Internal internal; + + } FT_FaceRec; + + + /************************************************************************** + * + * @enum: + * FT_FACE_FLAG_XXX + * + * @description: + * A list of bit flags used in the `face_flags` field of the @FT_FaceRec + * structure. They inform client applications of properties of the + * corresponding face. + * + * @values: + * FT_FACE_FLAG_SCALABLE :: + * The face contains outline glyphs. Note that a face can contain + * bitmap strikes also, i.e., a face can have both this flag and + * @FT_FACE_FLAG_FIXED_SIZES set. + * + * FT_FACE_FLAG_FIXED_SIZES :: + * The face contains bitmap strikes. See also the `num_fixed_sizes` + * and `available_sizes` fields of @FT_FaceRec. + * + * FT_FACE_FLAG_FIXED_WIDTH :: + * The face contains fixed-width characters (like Courier, Lucida, + * MonoType, etc.). + * + * FT_FACE_FLAG_SFNT :: + * The face uses the SFNT storage scheme. For now, this means TrueType + * and OpenType. + * + * FT_FACE_FLAG_HORIZONTAL :: + * The face contains horizontal glyph metrics. This should be set for + * all common formats. + * + * FT_FACE_FLAG_VERTICAL :: + * The face contains vertical glyph metrics. This is only available in + * some formats, not all of them. + * + * FT_FACE_FLAG_KERNING :: + * The face contains kerning information. If set, the kerning distance + * can be retrieved using the function @FT_Get_Kerning. Otherwise the + * function always returns the vector (0,0). Note that FreeType + * doesn't handle kerning data from the SFNT 'GPOS' table (as present + * in many OpenType fonts). + * + * FT_FACE_FLAG_FAST_GLYPHS :: + * THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. + * + * FT_FACE_FLAG_MULTIPLE_MASTERS :: + * The face contains multiple masters and is capable of interpolating + * between them. Supported formats are Adobe MM, TrueType GX, and + * OpenType variation fonts. + * + * See section @multiple_masters for API details. + * + * FT_FACE_FLAG_GLYPH_NAMES :: + * The face contains glyph names, which can be retrieved using + * @FT_Get_Glyph_Name. Note that some TrueType fonts contain broken + * glyph name tables. Use the function @FT_Has_PS_Glyph_Names when + * needed. + * + * FT_FACE_FLAG_EXTERNAL_STREAM :: + * Used internally by FreeType to indicate that a face's stream was + * provided by the client application and should not be destroyed when + * @FT_Done_Face is called. Don't read or test this flag. + * + * FT_FACE_FLAG_HINTER :: + * The font driver has a hinting machine of its own. For example, with + * TrueType fonts, it makes sense to use data from the SFNT 'gasp' + * table only if the native TrueType hinting engine (with the bytecode + * interpreter) is available and active. + * + * FT_FACE_FLAG_CID_KEYED :: + * The face is CID-keyed. In that case, the face is not accessed by + * glyph indices but by CID values. For subsetted CID-keyed fonts this + * has the consequence that not all index values are a valid argument + * to @FT_Load_Glyph. Only the CID values for which corresponding + * glyphs in the subsetted font exist make `FT_Load_Glyph` return + * successfully; in all other cases you get an + * `FT_Err_Invalid_Argument` error. + * + * Note that CID-keyed fonts that are in an SFNT wrapper (that is, all + * OpenType/CFF fonts) don't have this flag set since the glyphs are + * accessed in the normal way (using contiguous indices); the + * 'CID-ness' isn't visible to the application. + * + * FT_FACE_FLAG_TRICKY :: + * The face is 'tricky', that is, it always needs the font format's + * native hinting engine to get a reasonable result. A typical example + * is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that + * uses TrueType bytecode instructions to move and scale all of its + * subglyphs. + * + * It is not possible to auto-hint such fonts using + * @FT_LOAD_FORCE_AUTOHINT; it will also ignore @FT_LOAD_NO_HINTING. + * You have to set both @FT_LOAD_NO_HINTING and @FT_LOAD_NO_AUTOHINT to + * really disable hinting; however, you probably never want this except + * for demonstration purposes. + * + * Currently, there are about a dozen TrueType fonts in the list of + * tricky fonts; they are hard-coded in file `ttobjs.c`. + * + * FT_FACE_FLAG_COLOR :: + * [Since 2.5.1] The face has color glyph tables. See @FT_LOAD_COLOR + * for more information. + * + * FT_FACE_FLAG_VARIATION :: + * [Since 2.9] Set if the current face (or named instance) has been + * altered with @FT_Set_MM_Design_Coordinates, + * @FT_Set_Var_Design_Coordinates, @FT_Set_Var_Blend_Coordinates, or + * @FT_Set_MM_WeightVector to select a non-default instance. + * + * FT_FACE_FLAG_SVG :: + * [Since 2.12] The face has an 'SVG~' OpenType table. + * + * FT_FACE_FLAG_SBIX :: + * [Since 2.12] The face has an 'sbix' OpenType table *and* outlines. + * For such fonts, @FT_FACE_FLAG_SCALABLE is not set by default to + * retain backward compatibility. + * + * FT_FACE_FLAG_SBIX_OVERLAY :: + * [Since 2.12] The face has an 'sbix' OpenType table where outlines + * should be drawn on top of bitmap strikes. + * + */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) +#define FT_FACE_FLAG_COLOR ( 1L << 14 ) +#define FT_FACE_FLAG_VARIATION ( 1L << 15 ) +#define FT_FACE_FLAG_SVG ( 1L << 16 ) +#define FT_FACE_FLAG_SBIX ( 1L << 17 ) +#define FT_FACE_FLAG_SBIX_OVERLAY ( 1L << 18 ) + + + /************************************************************************** + * + * @section: + * font_testing_macros + * + */ + + /************************************************************************** + * + * @macro: + * FT_HAS_HORIZONTAL + * + * @description: + * A macro that returns true whenever a face object contains horizontal + * metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_VERTICAL + * + * @description: + * A macro that returns true whenever a face object contains real + * vertical metrics (and not only synthesized ones). + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_VERTICAL ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_KERNING + * + * @description: + * A macro that returns true whenever a face object contains kerning data + * that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_KERNING ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SCALABLE + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, and + * PFR font formats). + * + */ +#define FT_IS_SCALABLE( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SCALABLE ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_SFNT + * + * @description: + * A macro that returns true whenever a face object contains a font whose + * format is based on the SFNT storage scheme. This usually means: + * TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap + * fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SFNT ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_FIXED_WIDTH + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or 'monospace', 'fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_FIXED_SIZES + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes` field of the @FT_FaceRec + * structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) ) + + + /************************************************************************** + * + * @section: + * other_api_data + * + */ + + /************************************************************************** + * + * @macro: + * FT_HAS_FAST_GLYPHS + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************** + * + * @section: + * font_testing_macros + * + */ + + /************************************************************************** + * + * @macro: + * FT_HAS_GLYPH_NAMES + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_NAMED_INSTANCE + * + * @description: + * A macro that returns true whenever a face object is a named instance + * of a GX or OpenType variation font. + * + * [Since 2.9] Changing the design coordinates with + * @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does + * not influence the return value of this macro (only + * @FT_Set_Named_Instance does that). + * + * @since: + * 2.7 + * + */ +#define FT_IS_NAMED_INSTANCE( face ) \ + ( !!( (face)->face_index & 0x7FFF0000L ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_VARIATION + * + * @description: + * A macro that returns true whenever a face object has been altered by + * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, + * @FT_Set_Var_Blend_Coordinates, or @FT_Set_MM_WeightVector. + * + * @since: + * 2.9 + * + */ +#define FT_IS_VARIATION( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_VARIATION ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_CID_KEYED + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_CID_KEYED ) ) + + + /************************************************************************** + * + * @macro: + * FT_IS_TRICKY + * + * @description: + * A macro that returns true whenever a face represents a 'tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_TRICKY ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_COLOR + * + * @description: + * A macro that returns true whenever a face object contains tables for + * color glyphs. + * + * @since: + * 2.5.1 + * + */ +#define FT_HAS_COLOR( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_COLOR ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_SVG + * + * @description: + * A macro that returns true whenever a face object contains an 'SVG~' + * OpenType table. + * + * @since: + * 2.12 + */ +#define FT_HAS_SVG( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SVG ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_SBIX + * + * @description: + * A macro that returns true whenever a face object contains an 'sbix' + * OpenType table *and* outline glyphs. + * + * Currently, FreeType only supports bitmap glyphs in PNG format for this + * table (i.e., JPEG and TIFF formats are unsupported, as are + * Apple-specific formats not part of the OpenType specification). + * + * @note: + * For backward compatibility, a font with an 'sbix' table is treated as + * a bitmap-only face. Using @FT_Open_Face with + * @FT_PARAM_TAG_IGNORE_SBIX, an application can switch off 'sbix' + * handling so that the face is treated as an ordinary outline font with + * scalable outlines. + * + * Here is some pseudo code that roughly illustrates how to implement + * 'sbix' handling according to the OpenType specification. + * + * ``` + * if ( FT_HAS_SBIX( face ) ) + * { + * // open font as a scalable one without sbix handling + * FT_Face face2; + * FT_Parameter param = { FT_PARAM_TAG_IGNORE_SBIX, NULL }; + * FT_Open_Args args = { FT_OPEN_PARAMS | ..., + * ..., + * 1, ¶m }; + * + * + * FT_Open_Face( library, &args, 0, &face2 ); + * + * available_size` as necessary into + * `preferred_sizes`[*]> + * + * for ( i = 0; i < face->num_fixed_sizes; i++ ) + * { + * size = preferred_sizes[i].size; + * + * error = FT_Set_Pixel_Sizes( face, size, size ); + * + * + * // check whether we have a glyph in a bitmap strike + * error = FT_Load_Glyph( face, + * glyph_index, + * FT_LOAD_SBITS_ONLY | + * FT_LOAD_BITMAP_METRICS_ONLY ); + * if ( error == FT_Err_Invalid_Argument ) + * continue; + * else if ( error ) + * + * else + * break; + * } + * + * if ( i != face->num_fixed_sizes ) + * + * + * if ( i == face->num_fixed_sizes || + * FT_HAS_SBIX_OVERLAY( face ) ) + * + * } + * ``` + * + * [*] Assuming a target value of 400dpi and available strike sizes 100, + * 200, 300, and 400dpi, a possible order might be [400, 200, 300, 100]: + * scaling 200dpi to 400dpi usually gives better results than scaling + * 300dpi to 400dpi; it is also much faster. However, scaling 100dpi to + * 400dpi can yield a too pixelated result, thus the preference might be + * 300dpi over 100dpi. + * + * @since: + * 2.12 + */ +#define FT_HAS_SBIX( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SBIX ) ) + + + /************************************************************************** + * + * @macro: + * FT_HAS_SBIX_OVERLAY + * + * @description: + * A macro that returns true whenever a face object contains an 'sbix' + * OpenType table with bit~1 in its `flags` field set, instructing the + * application to overlay the bitmap strike with the corresponding + * outline glyph. See @FT_HAS_SBIX for pseudo code how to use it. + * + * @since: + * 2.12 + */ +#define FT_HAS_SBIX_OVERLAY( face ) \ + ( !!( (face)->face_flags & FT_FACE_FLAG_SBIX_OVERLAY ) ) + + + /************************************************************************** + * + * @section: + * face_creation + * + */ + + /************************************************************************** + * + * @enum: + * FT_STYLE_FLAG_XXX + * + * @description: + * A list of bit flags to indicate the style of a given face. These are + * used in the `style_flags` field of @FT_FaceRec. + * + * @values: + * FT_STYLE_FLAG_ITALIC :: + * The face style is italic or oblique. + * + * FT_STYLE_FLAG_BOLD :: + * The face is bold. + * + * @note: + * The style information as provided by FreeType is very basic. More + * details are beyond the scope and should be done on a higher level (for + * example, by analyzing various fields of the 'OS/2' table in SFNT based + * fonts). + */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /************************************************************************** + * + * @section: + * other_api_data + * + */ + + /************************************************************************** + * + * @type: + * FT_Size_Internal + * + * @description: + * An opaque handle to an `FT_Size_InternalRec` structure, used to model + * private data of a given @FT_Size object. + */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + + /************************************************************************** + * + * @struct: + * FT_Size_Metrics + * + * @description: + * The size metrics structure gives the metrics of a size object. + * + * @fields: + * x_ppem :: + * The width of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal width'. + * + * y_ppem :: + * The height of the scaled EM square in pixels, hence the term 'ppem' + * (pixels per EM). It is also referred to as 'nominal height'. + * + * x_scale :: + * A 16.16 fractional scaling value to convert horizontal metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * y_scale :: + * A 16.16 fractional scaling value to convert vertical metrics from + * font units to 26.6 fractional pixels. Only relevant for scalable + * font formats. + * + * ascender :: + * The ascender in 26.6 fractional pixels, rounded up to an integer + * value. See @FT_FaceRec for the details. + * + * descender :: + * The descender in 26.6 fractional pixels, rounded down to an integer + * value. See @FT_FaceRec for the details. + * + * height :: + * The height in 26.6 fractional pixels, rounded to an integer value. + * See @FT_FaceRec for the details. + * + * max_advance :: + * The maximum advance width in 26.6 fractional pixels, rounded to an + * integer value. See @FT_FaceRec for the details. + * + * @note: + * The scaling values, if relevant, are determined first during a size + * changing operation. The remaining fields are then set by the driver. + * For scalable formats, they are usually set to scaled values of the + * corresponding fields in @FT_FaceRec. Some values like ascender or + * descender are rounded for historical reasons; more precise values (for + * outline fonts) can be derived by scaling the corresponding @FT_FaceRec + * values manually, with code similar to the following. + * + * ``` + * scaled_ascender = FT_MulFix( face->ascender, + * size_metrics->y_scale ); + * ``` + * + * Note that due to glyph hinting and the selected rendering mode these + * values are usually not exact; consequently, they must be treated as + * unreliable with an error margin of at least one pixel! + * + * Indeed, the only way to get the exact metrics is to render _all_ + * glyphs. As this would be a definite performance hit, it is up to + * client applications to perform such computations. + * + * The `FT_Size_Metrics` structure is valid for bitmap fonts also. + * + * + * **TrueType fonts with native bytecode hinting** + * + * All applications that handle TrueType fonts with native hinting must + * be aware that TTFs expect different rounding of vertical font + * dimensions. The application has to cater for this, especially if it + * wants to rely on a TTF's vertical data (for example, to properly align + * box characters vertically). + * + * Only the application knows _in advance_ that it is going to use native + * hinting for TTFs! FreeType, on the other hand, selects the hinting + * mode not at the time of creating an @FT_Size object but much later, + * namely while calling @FT_Load_Glyph. + * + * Here is some pseudo code that illustrates a possible solution. + * + * ``` + * font_format = FT_Get_Font_Format( face ); + * + * if ( !strcmp( font_format, "TrueType" ) && + * do_native_bytecode_hinting ) + * { + * ascender = ROUND( FT_MulFix( face->ascender, + * size_metrics->y_scale ) ); + * descender = ROUND( FT_MulFix( face->descender, + * size_metrics->y_scale ) ); + * } + * else + * { + * ascender = size_metrics->ascender; + * descender = size_metrics->descender; + * } + * + * height = size_metrics->height; + * max_advance = size_metrics->max_advance; + * ``` + */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /************************************************************************** + * + * @struct: + * FT_SizeRec + * + * @description: + * FreeType root size class structure. A size object models a face + * object at a given size. + * + * @fields: + * face :: + * Handle to the parent face object. + * + * generic :: + * A typeless pointer, unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each size object. + * + * metrics :: + * Metrics for this size object. This field is read-only. + */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /************************************************************************** + * + * @section: + * other_api_data + * + */ + + /************************************************************************** + * + * @struct: + * FT_SubGlyph + * + * @description: + * The subglyph structure is an internal object used to describe + * subglyphs (for example, in the case of composites). + * + * @note: + * The subglyph implementation is not part of the high-level API, hence + * the forward structure declaration. + * + * You can however retrieve subglyph information with + * @FT_Get_SubGlyph_Info. + */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /************************************************************************** + * + * @type: + * FT_Slot_Internal + * + * @description: + * An opaque handle to an `FT_Slot_InternalRec` structure, used to model + * private data of a given @FT_GlyphSlot object. + */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + + /************************************************************************** + * + * @struct: + * FT_GlyphSlotRec + * + * @description: + * FreeType root glyph slot class structure. A glyph slot is a container + * where individual glyphs can be loaded, be they in outline or bitmap + * format. + * + * @fields: + * library :: + * A handle to the FreeType library instance this slot belongs to. + * + * face :: + * A handle to the parent face object. + * + * next :: + * In some cases (like some font tools), several glyph slots per face + * object can be a good thing. As this is rare, the glyph slots are + * listed through a direct, single-linked list using its `next` field. + * + * glyph_index :: + * [Since 2.10] The glyph index passed as an argument to @FT_Load_Glyph + * while initializing the glyph slot. + * + * generic :: + * A typeless pointer unused by the FreeType library or any of its + * drivers. It can be used by client applications to link their own + * data to each glyph slot object. + * + * metrics :: + * The metrics of the last loaded glyph in the slot. The returned + * values depend on the last load flags (see the @FT_Load_Glyph API + * function) and can be expressed either in 26.6 fractional pixels or + * font units. + * + * Note that even when the glyph image is transformed, the metrics are + * not. + * + * linearHoriAdvance :: + * The advance width of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for scalable glyphs. + * + * linearVertAdvance :: + * The advance height of the unhinted glyph. Its value is expressed in + * 16.16 fractional pixels, unless @FT_LOAD_LINEAR_DESIGN is set when + * loading the glyph. This field can be important to perform correct + * WYSIWYG layout. Only relevant for scalable glyphs. + * + * advance :: + * This shorthand is, depending on @FT_LOAD_IGNORE_TRANSFORM, the + * transformed (hinted) advance width for the glyph, in 26.6 fractional + * pixel format. As specified with @FT_LOAD_VERTICAL_LAYOUT, it uses + * either the `horiAdvance` or the `vertAdvance` value of `metrics` + * field. + * + * format :: + * This field indicates the format of the image contained in the glyph + * slot. Typically @FT_GLYPH_FORMAT_BITMAP, @FT_GLYPH_FORMAT_OUTLINE, + * or @FT_GLYPH_FORMAT_COMPOSITE, but other values are possible. + * + * bitmap :: + * This field is used as a bitmap descriptor. Note that the address + * and content of the bitmap buffer can change between calls of + * @FT_Load_Glyph and a few other functions. + * + * bitmap_left :: + * The bitmap's left bearing expressed in integer pixels. + * + * bitmap_top :: + * The bitmap's top bearing expressed in integer pixels. This is the + * distance from the baseline to the top-most glyph scanline, upwards + * y~coordinates being **positive**. + * + * outline :: + * The outline descriptor for the current glyph image if its format is + * @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is loaded, `outline` can be + * transformed, distorted, emboldened, etc. However, it must not be + * freed. + * + * [Since 2.10.1] If @FT_LOAD_NO_SCALE is set, outline coordinates of + * OpenType variation fonts for a selected instance are internally + * handled as 26.6 fractional font units but returned as (rounded) + * integers, as expected. To get unrounded font units, don't use + * @FT_LOAD_NO_SCALE but load the glyph with @FT_LOAD_NO_HINTING and + * scale it, using the font's `units_per_EM` value as the ppem. + * + * num_subglyphs :: + * The number of subglyphs in a composite glyph. This field is only + * valid for the composite glyph format that should normally only be + * loaded with the @FT_LOAD_NO_RECURSE flag. + * + * subglyphs :: + * An array of subglyph descriptors for composite glyphs. There are + * `num_subglyphs` elements in there. Currently internal to FreeType. + * + * control_data :: + * Certain font drivers can also return the control data for a given + * glyph image (e.g. TrueType bytecode, Type~1 charstrings, etc.). + * This field is a pointer to such data; it is currently internal to + * FreeType. + * + * control_len :: + * This is the length in bytes of the control data. Currently internal + * to FreeType. + * + * other :: + * Reserved. + * + * lsb_delta :: + * The difference between hinted and unhinted left side bearing while + * auto-hinting is active. Zero otherwise. + * + * rsb_delta :: + * The difference between hinted and unhinted right side bearing while + * auto-hinting is active. Zero otherwise. + * + * @note: + * If @FT_Load_Glyph is called with default flags (see @FT_LOAD_DEFAULT) + * the glyph image is loaded in the glyph slot in its native format + * (e.g., an outline glyph for TrueType and Type~1 formats). [Since 2.9] + * The prospective bitmap metrics are calculated according to + * @FT_LOAD_TARGET_XXX and other flags even for the outline glyph, even + * if @FT_LOAD_RENDER is not set. + * + * This image can later be converted into a bitmap by calling + * @FT_Render_Glyph. This function searches the current renderer for the + * native image's format, then invokes it. + * + * The renderer is in charge of transforming the native image through the + * slot's face transformation fields, then converting it into a bitmap + * that is returned in `slot->bitmap`. + * + * Note that `slot->bitmap_left` and `slot->bitmap_top` are also used to + * specify the position of the bitmap relative to the current pen + * position (e.g., coordinates (0,0) on the baseline). Of course, + * `slot->format` is also changed to @FT_GLYPH_FORMAT_BITMAP. + * + * Here is a small pseudo code fragment that shows how to use `lsb_delta` + * and `rsb_delta` to do fractional positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * + * + * for all glyphs do + * + * + * FT_Outline_Translate( slot->outline, origin_x & 63, 0 ); + * + * + * + * + * + * origin_x += slot->advance.x; + * origin_x += slot->lsb_delta - slot->rsb_delta; + * endfor + * ``` + * + * Here is another small pseudo code fragment that shows how to use + * `lsb_delta` and `rsb_delta` to improve integer positioning of glyphs: + * + * ``` + * FT_GlyphSlot slot = face->glyph; + * FT_Pos origin_x = 0; + * FT_Pos prev_rsb_delta = 0; + * + * + * for all glyphs do + * + * + * + * + * if ( prev_rsb_delta - slot->lsb_delta > 32 ) + * origin_x -= 64; + * else if ( prev_rsb_delta - slot->lsb_delta < -31 ) + * origin_x += 64; + * + * prev_rsb_delta = slot->rsb_delta; + * + * + * + * origin_x += slot->advance.x; + * endfor + * ``` + * + * If you use strong auto-hinting, you **must** apply these delta values! + * Otherwise you will experience far too large inter-glyph spacing at + * small rendering sizes in most cases. Note that it doesn't harm to use + * the above code for other hinting modes also, since the delta values + * are zero then. + */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt glyph_index; /* new in 2.10; was reserved previously */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * library_setup + * + */ + + /************************************************************************** + * + * @function: + * FT_Init_FreeType + * + * @description: + * Initialize a new FreeType library object. The set of modules that are + * registered by this function is determined at build time. + * + * @output: + * alibrary :: + * A handle to a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case you want to provide your own memory allocating routines, use + * @FT_New_Library instead, followed by a call to @FT_Add_Default_Modules + * (or a series of calls to @FT_Add_Module) and + * @FT_Set_Default_Properties. + * + * See the documentation of @FT_Library and @FT_Face for multi-threading + * issues. + * + * If you need reference-counting (cf. @FT_Reference_Library), use + * @FT_New_Library and @FT_Done_Library. + * + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_FreeType + * + * @description: + * Destroy a given FreeType library object and all of its children, + * including resources, drivers, faces, sizes, etc. + * + * @input: + * library :: + * A handle to the target library object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /************************************************************************** + * + * @section: + * face_creation + * + */ + + /************************************************************************** + * + * @enum: + * FT_OPEN_XXX + * + * @description: + * A list of bit field constants used within the `flags` field of the + * @FT_Open_Args structure. + * + * @values: + * FT_OPEN_MEMORY :: + * This is a memory-based stream. + * + * FT_OPEN_STREAM :: + * Copy the stream from the `stream` field. + * + * FT_OPEN_PATHNAME :: + * Create a new input stream from a C~path name. + * + * FT_OPEN_DRIVER :: + * Use the `driver` field. + * + * FT_OPEN_PARAMS :: + * Use the `num_params` and `params` fields. + * + * @note: + * The `FT_OPEN_MEMORY`, `FT_OPEN_STREAM`, and `FT_OPEN_PATHNAME` flags + * are mutually exclusive. + */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + + + /* these constants are deprecated; use the corresponding `FT_OPEN_XXX` */ + /* values instead */ +#define ft_open_memory FT_OPEN_MEMORY +#define ft_open_stream FT_OPEN_STREAM +#define ft_open_pathname FT_OPEN_PATHNAME +#define ft_open_driver FT_OPEN_DRIVER +#define ft_open_params FT_OPEN_PARAMS + + + /************************************************************************** + * + * @struct: + * FT_Parameter + * + * @description: + * A simple structure to pass more or less generic parameters to + * @FT_Open_Face and @FT_Face_Properties. + * + * @fields: + * tag :: + * A four-byte identification tag. + * + * data :: + * A pointer to the parameter data. + * + * @note: + * The ID and function of parameters are driver-specific. See section + * @parameter_tags for more information. + */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /************************************************************************** + * + * @struct: + * FT_Open_Args + * + * @description: + * A structure to indicate how to open a new font file or stream. A + * pointer to such a structure can be used as a parameter for the + * functions @FT_Open_Face and @FT_Attach_Stream. + * + * @fields: + * flags :: + * A set of bit flags indicating how to use the structure. + * + * memory_base :: + * The first byte of the file in memory. + * + * memory_size :: + * The size in bytes of the file in memory. + * + * pathname :: + * A pointer to an 8-bit file pathname, which must be a C~string (i.e., + * no null bytes except at the very end). The pointer is not owned by + * FreeType. + * + * stream :: + * A handle to a source stream object. + * + * driver :: + * This field is exclusively used by @FT_Open_Face; it simply specifies + * the font driver to use for opening the face. If set to `NULL`, + * FreeType tries to load the face with each one of the drivers in its + * list. + * + * num_params :: + * The number of extra parameters. + * + * params :: + * Extra parameters passed to the font driver when opening a new face. + * + * @note: + * The stream type is determined by the contents of `flags`: + * + * If the @FT_OPEN_MEMORY bit is set, assume that this is a memory file + * of `memory_size` bytes, located at `memory_address`. The data are not + * copied, and the client is responsible for releasing and destroying + * them _after_ the corresponding call to @FT_Done_Face. + * + * Otherwise, if the @FT_OPEN_STREAM bit is set, assume that a custom + * input stream `stream` is used. + * + * Otherwise, if the @FT_OPEN_PATHNAME bit is set, assume that this is a + * normal file and use `pathname` to open it. + * + * If none of the above bits are set or if multiple are set at the same + * time, the flags are invalid and @FT_Open_Face fails. + * + * If the @FT_OPEN_DRIVER bit is set, @FT_Open_Face only tries to open + * the file with the driver whose handler is in `driver`. + * + * If the @FT_OPEN_PARAMS bit is set, the parameters given by + * `num_params` and `params` is used. They are ignored otherwise. + * + * Ideally, both the `pathname` and `params` fields should be tagged as + * 'const'; this is missing for API backward compatibility. In other + * words, applications should treat them as read-only. + */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /************************************************************************** + * + * @function: + * FT_New_Face + * + * @description: + * Call @FT_Open_Face to open a font by its pathname. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * pathname :: + * A path to the font file. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `pathname` string should be recognizable as such by a standard + * `fopen` call on your system; in particular, this means that `pathname` + * must not contain null bytes. If that is not sufficient to address all + * file name possibilities (for example, to handle wide character file + * names on Windows in UTF-16 encoding) you might use @FT_Open_Face to + * pass a memory array or a stream object instead. + * + * Use @FT_Done_Face to destroy the created @FT_Face object (along with + * its slot and sizes). + */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_New_Memory_Face + * + * @description: + * Call @FT_Open_Face to open a font that has been loaded into memory. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * file_base :: + * A pointer to the beginning of the font data. + * + * file_size :: + * The size of the memory chunk used by the font data. + * + * face_index :: + * See @FT_Open_Face for a detailed description of this parameter. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You must not deallocate the memory before calling @FT_Done_Face. + */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Open_Face + * + * @description: + * Create a face object from a given resource described by @FT_Open_Args. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * args :: + * A pointer to an `FT_Open_Args` structure that must be filled by the + * caller. + * + * face_index :: + * This field holds two different values. Bits 0-15 are the index of + * the face in the font file (starting with value~0). Set it to~0 if + * there is only one face in the font file. + * + * [Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation + * fonts only, specifying the named instance index for the current face + * index (starting with value~1; value~0 makes FreeType ignore named + * instances). For non-variation fonts, bits 16-30 are ignored. + * Assuming that you want to access the third named instance in face~4, + * `face_index` should be set to 0x00030004. If you want to access + * face~4 without variation handling, simply set `face_index` to + * value~4. + * + * `FT_Open_Face` and its siblings can be used to quickly check whether + * the font format of a given font resource is supported by FreeType. + * In general, if the `face_index` argument is negative, the function's + * return value is~0 if the font format is recognized, or non-zero + * otherwise. The function allocates a more or less empty face handle + * in `*aface` (if `aface` isn't `NULL`); the only two useful fields in + * this special case are `face->num_faces` and `face->style_flags`. + * For any negative value of `face_index`, `face->num_faces` gives the + * number of faces within the font file. For the negative value + * '-(N+1)' (with 'N' a non-negative 16-bit value), bits 16-30 in + * `face->style_flags` give the number of named instances in face 'N' + * if we have a variation font (or zero otherwise). After examination, + * the returned @FT_Face structure should be deallocated with a call to + * @FT_Done_Face. + * + * @output: + * aface :: + * A handle to a new face object. If `face_index` is greater than or + * equal to zero, it must be non-`NULL`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Unlike FreeType 1.x, this function automatically creates a glyph slot + * for the face object that can be accessed directly through + * `face->glyph`. + * + * Each new face object created with this function also owns a default + * @FT_Size object, accessible as `face->size`. + * + * One @FT_Library instance can have multiple face objects, that is, + * @FT_Open_Face and its siblings can be called multiple times using the + * same `library` argument. + * + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + * + * If `FT_OPEN_STREAM` is set in `args->flags`, the stream in + * `args->stream` is automatically closed before this function returns + * any error (including `FT_Err_Invalid_Argument`). + * + * @example: + * To loop over all faces, use code similar to the following snippet + * (omitting the error handling). + * + * ``` + * ... + * FT_Face face; + * FT_Long i, num_faces; + * + * + * error = FT_Open_Face( library, args, -1, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * FT_Done_Face( face ); + * + * for ( i = 0; i < num_faces; i++ ) + * { + * ... + * error = FT_Open_Face( library, args, i, &face ); + * ... + * FT_Done_Face( face ); + * ... + * } + * ``` + * + * To loop over all valid values for `face_index`, use something similar + * to the following snippet, again without error handling. The code + * accesses all faces immediately (thus only a single call of + * `FT_Open_Face` within the do-loop), with and without named instances. + * + * ``` + * ... + * FT_Face face; + * + * FT_Long num_faces = 0; + * FT_Long num_instances = 0; + * + * FT_Long face_idx = 0; + * FT_Long instance_idx = 0; + * + * + * do + * { + * FT_Long id = ( instance_idx << 16 ) + face_idx; + * + * + * error = FT_Open_Face( library, args, id, &face ); + * if ( error ) { ... } + * + * num_faces = face->num_faces; + * num_instances = face->style_flags >> 16; + * + * ... + * + * FT_Done_Face( face ); + * + * if ( instance_idx < num_instances ) + * instance_idx++; + * else + * { + * face_idx++; + * instance_idx = 0; + * } + * + * } while ( face_idx < num_faces ) + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /************************************************************************** + * + * @function: + * FT_Attach_File + * + * @description: + * Call @FT_Attach_Stream to attach a file. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * filepathname :: + * The pathname. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /************************************************************************** + * + * @function: + * FT_Attach_Stream + * + * @description: + * 'Attach' data to a face object. Normally, this is used to read + * additional information for the face object. For example, you can + * attach an AFM file that comes with a Type~1 font to get the kerning + * values and other metrics. + * + * @inout: + * face :: + * The target face object. + * + * @input: + * parameters :: + * A pointer to @FT_Open_Args that must be filled by the caller. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The meaning of the 'attach' (i.e., what really happens when the new + * file is read) is not fixed by FreeType itself. It really depends on + * the font format (and thus the font driver). + * + * Client applications are expected to know what they are doing when + * invoking this function. Most drivers simply do not implement file or + * stream attachments. + */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + const FT_Open_Args* parameters ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Face + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Face structure is + * created. This function increments the counter. @FT_Done_Face then + * only destroys a face if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Face objects. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + * + */ + FT_EXPORT( FT_Error ) + FT_Reference_Face( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Done_Face + * + * @description: + * Discard a given face object, as well as all of its child slots and + * sizes. + * + * @input: + * face :: + * A handle to a target face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Face. + */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + + /************************************************************************** + * + * @function: + * FT_Select_Size + * + * @description: + * Select a bitmap strike. To be more precise, this function sets the + * scaling factors of the active @FT_Size object in a face so that + * bitmaps from this particular strike are taken by @FT_Load_Glyph and + * friends. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * strike_index :: + * The index of the bitmap strike in the `available_sizes` field of + * @FT_FaceRec structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For bitmaps embedded in outline fonts it is common that only a subset + * of the available glyphs at a given ppem value is available. FreeType + * silently uses outlines if there is no bitmap for a given glyph index. + * + * For GX and OpenType variation fonts, a bitmap strike makes sense only + * if the default instance is active (that is, no glyph variation takes + * place); otherwise, FreeType simply ignores bitmap strikes. The same + * is true for all named instances that are different from the default + * instance. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /************************************************************************** + * + * @enum: + * FT_Size_Request_Type + * + * @description: + * An enumeration type that lists the supported size request types, i.e., + * what input size (in font units) maps to the requested output size (in + * pixels, as computed from the arguments of @FT_Size_Request). + * + * @values: + * FT_SIZE_REQUEST_TYPE_NOMINAL :: + * The nominal size. The `units_per_EM` field of @FT_FaceRec is used + * to determine both scaling values. + * + * This is the standard scaling found in most applications. In + * particular, use this size request type for TrueType fonts if they + * provide optical scaling or something similar. Note, however, that + * `units_per_EM` is a rather abstract value which bears no relation to + * the actual size of the glyphs in a font. + * + * FT_SIZE_REQUEST_TYPE_REAL_DIM :: + * The real dimension. The sum of the `ascender` and (minus of) the + * `descender` fields of @FT_FaceRec is used to determine both scaling + * values. + * + * FT_SIZE_REQUEST_TYPE_BBOX :: + * The font bounding box. The width and height of the `bbox` field of + * @FT_FaceRec are used to determine the horizontal and vertical + * scaling value, respectively. + * + * FT_SIZE_REQUEST_TYPE_CELL :: + * The `max_advance_width` field of @FT_FaceRec is used to determine + * the horizontal scaling value; the vertical scaling value is + * determined the same way as @FT_SIZE_REQUEST_TYPE_REAL_DIM does. + * Finally, both scaling values are set to the smaller one. This type + * is useful if you want to specify the font size for, say, a window of + * a given dimension and 80x24 cells. + * + * FT_SIZE_REQUEST_TYPE_SCALES :: + * Specify the scaling values directly. + * + * @note: + * The above descriptions only apply to scalable formats. For bitmap + * formats, the behaviour is up to the driver. + * + * See the note section of @FT_Size_Metrics if you wonder how size + * requesting relates to scaling values. + */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /************************************************************************** + * + * @struct: + * FT_Size_RequestRec + * + * @description: + * A structure to model a size request. + * + * @fields: + * type :: + * See @FT_Size_Request_Type. + * + * width :: + * The desired width, given as a 26.6 fractional point value (with 72pt + * = 1in). + * + * height :: + * The desired height, given as a 26.6 fractional point value (with + * 72pt = 1in). + * + * horiResolution :: + * The horizontal resolution (dpi, i.e., pixels per inch). If set to + * zero, `width` is treated as a 26.6 fractional **pixel** value, which + * gets internally rounded to an integer. + * + * vertResolution :: + * The vertical resolution (dpi, i.e., pixels per inch). If set to + * zero, `height` is treated as a 26.6 fractional **pixel** value, + * which gets internally rounded to an integer. + * + * @note: + * If `width` is zero, the horizontal scaling value is set equal to the + * vertical scaling value, and vice versa. + * + * If `type` is `FT_SIZE_REQUEST_TYPE_SCALES`, `width` and `height` are + * interpreted directly as 16.16 fractional scaling values, without any + * further modification, and both `horiResolution` and `vertResolution` + * are ignored. + */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /************************************************************************** + * + * @struct: + * FT_Size_Request + * + * @description: + * A handle to a size request structure. + */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /************************************************************************** + * + * @function: + * FT_Request_Size + * + * @description: + * Resize the scale of the active @FT_Size object in a face. + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * req :: + * A pointer to a @FT_Size_RequestRec. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Although drivers may select the bitmap strike matching the request, + * you should not rely on this if you intend to select a particular + * bitmap strike. Use @FT_Select_Size instead in that case. + * + * The relation between the requested size and the resulting glyph size + * is dependent entirely on how the size is defined in the source face. + * The font designer chooses the final size of each glyph relative to + * this size. For more information refer to + * 'https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'. + * + * Contrary to @FT_Set_Char_Size, this function doesn't have special code + * to normalize zero-valued widths, heights, or resolutions, which are + * treated as @FT_LOAD_NO_SCALE. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /************************************************************************** + * + * @function: + * FT_Set_Char_Size + * + * @description: + * Call @FT_Request_Size to request the nominal size (in points). + * + * @inout: + * face :: + * A handle to a target face object. + * + * @input: + * char_width :: + * The nominal width, in 26.6 fractional points. + * + * char_height :: + * The nominal height, in 26.6 fractional points. + * + * horz_resolution :: + * The horizontal resolution in dpi. + * + * vert_resolution :: + * The vertical resolution in dpi. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While this function allows fractional points as input values, the + * resulting ppem value for the given resolution is always rounded to the + * nearest integer. + * + * If either the character width or height is zero, it is set equal to + * the other value. + * + * If either the horizontal or vertical resolution is zero, it is set + * equal to the other value. + * + * A character width or height smaller than 1pt is set to 1pt; if both + * resolution values are zero, they are set to 72dpi. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /************************************************************************** + * + * @function: + * FT_Set_Pixel_Sizes + * + * @description: + * Call @FT_Request_Size to request the nominal size (in pixels). + * + * @inout: + * face :: + * A handle to the target face object. + * + * @input: + * pixel_width :: + * The nominal width, in pixels. + * + * pixel_height :: + * The nominal height, in pixels. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should not rely on the resulting glyphs matching or being + * constrained to this pixel size. Refer to @FT_Request_Size to + * understand how requested sizes relate to actual sizes. + * + * Don't use this function if you are using the FreeType cache API. + */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + + /************************************************************************** + * + * @function: + * FT_Load_Glyph + * + * @description: + * Load a glyph into the glyph slot of a face object. + * + * @inout: + * face :: + * A handle to the target face object where the glyph is loaded. + * + * @input: + * glyph_index :: + * The index of the glyph in the font file. For CID-keyed fonts + * (either in PS or in CFF format) this argument specifies the CID + * value. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * flags can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For proper scaling and hinting, the active @FT_Size object owned by + * the face has to be meaningfully initialized by calling + * @FT_Set_Char_Size before this function, for example. The loaded + * glyph may be transformed. See @FT_Set_Transform for the details. + * + * For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument` is returned + * for invalid CID values (that is, for CID values that don't have a + * corresponding glyph in the font). See the discussion of the + * @FT_FACE_FLAG_CID_KEYED flag for more details. + * + * If you receive `FT_Err_Glyph_Too_Big`, try getting the glyph outline + * at EM size, then scale it manually and fill it as a graphics + * operation. + */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @section: + * character_mapping + * + */ + + /************************************************************************** + * + * @function: + * FT_Load_Char + * + * @description: + * Load a glyph into the glyph slot of a face object, accessed by its + * character code. + * + * @inout: + * face :: + * A handle to a target face object where the glyph is loaded. + * + * @input: + * char_code :: + * The glyph's character code, according to the current charmap used in + * the face. + * + * load_flags :: + * A flag indicating what to load for this glyph. The @FT_LOAD_XXX + * constants can be used to control the glyph loading process (e.g., + * whether the outline should be scaled, whether to load bitmaps or + * not, whether to hint the outline, etc). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. + * + * Many fonts contain glyphs that can't be loaded by this function since + * its glyph indices are not listed in any of the font's charmaps. + * + * If no active cmap is set up (i.e., `face->charmap` is zero), the call + * to @FT_Get_Char_Index is omitted, and the function behaves identically + * to @FT_Load_Glyph. + */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + + /************************************************************************** + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit field constants for @FT_Load_Glyph to indicate what kind + * of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. The + * bitmap data can be accessed from the glyph slot (see note below). + * + * 2. If no embedded bitmap is searched for or found, FreeType looks + * for a scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then 'hinted' to the pixel grid in + * order to optimize it. The outline data can be accessed from the + * glyph slot (see note below). + * + * Note that by default the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the loaded outline glyph but keep it in font units. + * This flag is also assumed if @FT_Size owned by the face was not + * properly initialized. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * If the font is 'tricky' (see @FT_FACE_FLAG_TRICKY for more), using + * `FT_LOAD_NO_SCALE` usually yields meaningless outlines because the + * subglyphs must be scaled and positioned with hinting instructions. + * This can be solved by loading the font without `FT_LOAD_NO_SCALE` + * and setting the character size to `font->units_per_EM`. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates 'blurrier' bitmap glyphs + * when the glyphs are rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_SBITS_ONLY :: + * [Since 2.12] This is the opposite of @FT_LOAD_NO_BITMAP, more or + * less: @FT_Load_Glyph returns `FT_Err_Invalid_Argument` if the face + * contains a bitmap strike for the given size (or the strike selected + * by @FT_Select_Size) but there is no glyph in the strike. + * + * Note that this load flag was part of FreeType since version 2.0.6 + * but previously tagged as internal. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. In particular, the + * `advance` value in the @FT_GlyphSlotRec structure is set to the + * `vertAdvance` value of the `metrics` field. + * + * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use this + * flag currently. Reason is that in this case vertical metrics get + * synthesized, and those values are not always consistent across + * various font formats. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Prefer the auto-hinter over the font's native hinter. See also the + * note below. + * + * FT_LOAD_PEDANTIC :: + * Make the font driver perform pedantic verifications during glyph + * loading and hinting. This is mostly used to detect broken glyphs in + * fonts. By default, FreeType tries to handle broken fonts also. + * + * In particular, errors from the TrueType bytecode engine are not + * passed to the application if this flag is not set; this might result + * in partially hinted or distorted glyphs in case a glyph's bytecode + * is buggy. + * + * FT_LOAD_NO_RECURSE :: + * Don't load composite glyphs recursively. Instead, the font driver + * fills the `num_subglyph` and `subglyphs` values of the glyph slot; + * it also sets `glyph->format` to @FT_GLYPH_FORMAT_COMPOSITE. The + * description of subglyphs can then be accessed with + * @FT_Get_SubGlyph_Info. + * + * Don't use this flag for retrieving metrics information since some + * font drivers only return rudimentary data. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Ignore the transform matrix set by @FT_Set_Transform. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Keep `linearHoriAdvance` and `linearVertAdvance` fields of + * @FT_GlyphSlotRec in font units. See @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable the auto-hinter. See also the note below. + * + * FT_LOAD_COLOR :: + * Load colored glyphs. FreeType searches in the following order; + * there are slight differences depending on the font format. + * + * [Since 2.5] Load embedded color bitmap images (provided + * @FT_LOAD_NO_BITMAP is not set). The resulting color bitmaps, if + * available, have the @FT_PIXEL_MODE_BGRA format, with pre-multiplied + * color channels. If the flag is not set and color bitmaps are found, + * they are converted to 256-level gray bitmaps, using the + * @FT_PIXEL_MODE_GRAY format. + * + * [Since 2.12] If the glyph index maps to an entry in the face's + * 'SVG~' table, load the associated SVG document from this table and + * set the `format` field of @FT_GlyphSlotRec to @FT_GLYPH_FORMAT_SVG + * ([since 2.13.1] provided @FT_LOAD_NO_SVG is not set). Note that + * FreeType itself can't render SVG documents; however, the library + * provides hooks to seamlessly integrate an external renderer. See + * sections @ot_svg_driver and @svg_fonts for more. + * + * [Since 2.10, experimental] If the glyph index maps to an entry in + * the face's 'COLR' table with a 'CPAL' palette table (as defined in + * the OpenType specification), make @FT_Render_Glyph provide a default + * blending of the color glyph layers associated with the glyph index, + * using the same bitmap format as embedded color bitmap images. This + * is mainly for convenience and works only for glyphs in 'COLR' v0 + * tables (or glyphs in 'COLR' v1 tables that exclusively use v0 + * features). For full control of color layers use + * @FT_Get_Color_Glyph_Layer and FreeType's color functions like + * @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering + * so that the client application can handle blending by itself. + * + * FT_LOAD_NO_SVG :: + * [Since 2.13.1] Ignore SVG glyph data when loading. + * + * FT_LOAD_COMPUTE_METRICS :: + * [Since 2.6.1] Compute glyph metrics from the glyph data, without the + * use of bundled metrics tables (for example, the 'hdmx' table in + * TrueType fonts). This flag is mainly used by font validating or + * font editing applications, which need to ignore, verify, or edit + * those tables. + * + * Currently, this flag is only implemented for TrueType fonts. + * + * FT_LOAD_BITMAP_METRICS_ONLY :: + * [Since 2.7.1] Request loading of the metrics and bitmap image + * information of a (possibly embedded) bitmap glyph without allocating + * or copying the bitmap image data itself. No effect if the target + * glyph is not a bitmap image. + * + * This flag unsets @FT_LOAD_RENDER. + * + * FT_LOAD_CROP_BITMAP :: + * Ignored. Deprecated. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Ignored. Deprecated. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be used + * at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + * Note that the auto-hinter needs a valid Unicode cmap (either a native + * one or synthesized by FreeType) for producing correct results. If a + * font provides an incorrect mapping (for example, assigning the + * character code U+005A, LATIN CAPITAL LETTER~Z, to a glyph depicting a + * mathematical integral sign), the auto-hinter might produce useless + * results. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE ( 1L << 0 ) +#define FT_LOAD_NO_HINTING ( 1L << 1 ) +#define FT_LOAD_RENDER ( 1L << 2 ) +#define FT_LOAD_NO_BITMAP ( 1L << 3 ) +#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 ) +#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 ) +#define FT_LOAD_CROP_BITMAP ( 1L << 6 ) +#define FT_LOAD_PEDANTIC ( 1L << 7 ) +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 ) +#define FT_LOAD_NO_RECURSE ( 1L << 10 ) +#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 ) +#define FT_LOAD_MONOCHROME ( 1L << 12 ) +#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) +#define FT_LOAD_SBITS_ONLY ( 1L << 14 ) +#define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) + /* Bits 16-19 are used by `FT_LOAD_TARGET_` */ +#define FT_LOAD_COLOR ( 1L << 20 ) +#define FT_LOAD_COMPUTE_METRICS ( 1L << 21 ) +#define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) +#define FT_LOAD_NO_SVG ( 1L << 24 ) + + /* */ + + /* used internally only by certain font drivers */ +#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) +#define FT_LOAD_SVG_ONLY ( 1L << 23 ) + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values to select a specific hinting algorithm for the + * hinter. You should OR one of these values to your `load_flags` when + * calling @FT_Load_Glyph. + * + * Note that a font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * The default hinting algorithm, optimized for standard gray-level + * rendering. For monochrome output, use @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for gray-level modes. Many generated + * glyphs are fuzzier but better resemble their original shape. This + * is achieved by snapping glyphs to the pixel grid only vertically + * (Y-axis), as is done by FreeType's new CFF engine or Microsoft's + * ClearType font renderer. This preserves inter-glyph spacing in + * horizontal text. The snapping is done either by the native font + * driver, if the driver itself and the font support it, or by the + * auto-hinter. + * + * Advance widths are rounded to integer values; however, using the + * `lsb_delta` and `rsb_delta` fields of @FT_GlyphSlotRec, it is + * possible to get fractional advance widths for subpixel positioning + * (which is recommended to use). + * + * If configuration option `AF_CONFIG_OPTION_TT_SIZE_METRICS` is + * active, TrueType-like metrics are used to make this mode behave + * similarly as in unpatched FreeType versions between 2.4.6 and 2.7.1 + * (inclusive). + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * Note that for outline fonts only the TrueType font driver has proper + * monochrome hinting support, provided the TTFs contain hints for B/W + * rendering (which most fonts no longer provide). If these conditions + * are not met it is very likely that you get ugly results at smaller + * sizes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_LIGHT optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the `FT_LOAD_TARGET_XXX` values in your + * `load_flags`. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode that matches the used algorithm + * best). An exception is `FT_LOAD_TARGET_MONO` since it implies + * @FT_LOAD_MONOCHROME. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the 'light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * ``` + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * ``` + * + * In general, you should stick with one rendering mode. For example, + * switching between @FT_LOAD_TARGET_NORMAL and @FT_LOAD_TARGET_MONO + * enforces a lot of recomputation for TrueType fonts, which is slow. + * Another reason is caching: Selecting a different mode usually causes + * changes in both the outlines and the rasterized bitmaps; it is thus + * necessary to empty the cache after a mode switch to avoid false hits. + * + */ +#define FT_LOAD_TARGET_( x ) ( FT_STATIC_CAST( FT_Int32, (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) \ + FT_STATIC_CAST( FT_Render_Mode, ( (x) >> 16 ) & 15 ) + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + + /************************************************************************** + * + * @function: + * FT_Set_Transform + * + * @description: + * Set the transformation that is applied to glyph images when they are + * loaded into a glyph slot through @FT_Load_Glyph. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * matrix :: + * A pointer to the transformation's 2x2 matrix. Use `NULL` for the + * identity matrix. + * delta :: + * A pointer to the translation vector. Use `NULL` for the null + * vector. + * + * @note: + * This function is provided as a convenience, but keep in mind that + * @FT_Matrix coefficients are only 16.16 fixed-point values, which can + * limit the accuracy of the results. Using floating-point computations + * to perform the transform directly in client code instead will always + * yield better numbers. + * + * The transformation is only applied to scalable image formats after the + * glyph has been loaded. It means that hinting is unaltered by the + * transformation and is performed on the character size given in the + * last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. + * + * Note that this also transforms the `face.glyph.advance` field, but + * **not** the values in `face.glyph.metrics`. + */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @function: + * FT_Get_Transform + * + * @description: + * Return the transformation that is applied to glyph images when they + * are loaded into a glyph slot through @FT_Load_Glyph. See + * @FT_Set_Transform for more details. + * + * @input: + * face :: + * A handle to the source face object. + * + * @output: + * matrix :: + * A pointer to a transformation's 2x2 matrix. Set this to NULL if you + * are not interested in the value. + * + * delta :: + * A pointer to a translation vector. Set this to NULL if you are not + * interested in the value. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Get_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + + /************************************************************************** + * + * @enum: + * FT_Render_Mode + * + * @description: + * Render modes supported by FreeType~2. Each mode corresponds to a + * specific type of scanline conversion performed on the outline. + * + * For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode` field + * in the @FT_GlyphSlotRec structure gives the format of the returned + * bitmap. + * + * All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity, + * indicating pixel coverage. Use linear alpha blending and gamma + * correction to correctly render non-monochrome glyph bitmaps onto a + * surface; see @FT_Render_Glyph. + * + * The @FT_RENDER_MODE_SDF is a special render mode that uses up to 256 + * distance values, indicating the signed distance from the grid position + * to the nearest outline. + * + * @values: + * FT_RENDER_MODE_NORMAL :: + * Default render mode; it corresponds to 8-bit anti-aliased bitmaps. + * + * FT_RENDER_MODE_LIGHT :: + * This is equivalent to @FT_RENDER_MODE_NORMAL. It is only defined as + * a separate value because render modes are also used indirectly to + * define hinting algorithm selectors. See @FT_LOAD_TARGET_XXX for + * details. + * + * FT_RENDER_MODE_MONO :: + * This mode corresponds to 1-bit bitmaps (with 2~levels of opacity). + * + * FT_RENDER_MODE_LCD :: + * This mode corresponds to horizontal RGB and BGR subpixel displays + * like LCD screens. It produces 8-bit bitmaps that are 3~times the + * width of the original glyph outline in pixels, and which use the + * @FT_PIXEL_MODE_LCD mode. + * + * FT_RENDER_MODE_LCD_V :: + * This mode corresponds to vertical RGB and BGR subpixel displays + * (like PDA screens, rotated LCD displays, etc.). It produces 8-bit + * bitmaps that are 3~times the height of the original glyph outline in + * pixels and use the @FT_PIXEL_MODE_LCD_V mode. + * + * FT_RENDER_MODE_SDF :: + * This mode corresponds to 8-bit, single-channel signed distance field + * (SDF) bitmaps. Each pixel in the SDF grid is the value from the + * pixel's position to the nearest glyph's outline. The distances are + * calculated from the center of the pixel and are positive if they are + * filled by the outline (i.e., inside the outline) and negative + * otherwise. Check the note below on how to convert the output values + * to usable data. + * + * @note: + * The selected render mode only affects vector glyphs of a font. + * Embedded bitmaps often have a different pixel mode like + * @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform them + * into 8-bit pixmaps. + * + * For @FT_RENDER_MODE_SDF the output bitmap buffer contains normalized + * distances that are packed into unsigned 8-bit values. To get pixel + * values in floating point representation use the following pseudo-C + * code for the conversion. + * + * ``` + * // Load glyph and render using FT_RENDER_MODE_SDF, + * // then use the output buffer as follows. + * + * ... + * FT_Byte buffer = glyph->bitmap->buffer; + * + * + * for pixel in buffer + * { + * // `sd` is the signed distance and `spread` is the current spread; + * // the default spread is 2 and can be changed. + * + * float sd = (float)pixel - 128.0f; + * + * + * // Convert to pixel values. + * sd = ( sd / 128.0f ) * spread; + * + * // Store `sd` in a buffer or use as required. + * } + * + * ``` + * + * FreeType has two rasterizers for generating SDF, namely: + * + * 1. `sdf` for generating SDF directly from glyph's outline, and + * + * 2. `bsdf` for generating SDF from rasterized bitmaps. + * + * Depending on the glyph type (i.e., outline or bitmap), one of the two + * rasterizers is chosen at runtime and used for generating SDFs. To + * force the use of `bsdf` you should render the glyph with any of the + * FreeType's other rendering modes (e.g., `FT_RENDER_MODE_NORMAL`) and + * then re-render with `FT_RENDER_MODE_SDF`. + * + * There are some issues with stability and possible failures of the SDF + * renderers (specifically `sdf`). + * + * 1. The `sdf` rasterizer is sensitive to really small features (e.g., + * sharp turns that are less than 1~pixel) and imperfections in the + * glyph's outline, causing artifacts in the final output. + * + * 2. The `sdf` rasterizer has limited support for handling intersecting + * contours and *cannot* handle self-intersecting contours whatsoever. + * Self-intersection happens when a single connected contour + * intersects itself at some point; having these in your font + * definitely poses a problem to the rasterizer and cause artifacts, + * too. + * + * 3. Generating SDF for really small glyphs may result in undesirable + * output; the pixel grid (which stores distance information) becomes + * too coarse. + * + * 4. Since the output buffer is normalized, precision at smaller spreads + * is greater than precision at larger spread values because the + * output range of [0..255] gets mapped to a smaller SDF range. A + * spread of~2 should be sufficient in most cases. + * + * Points (1) and (2) can be avoided by using the `bsdf` rasterizer, + * which is more stable than the `sdf` rasterizer in general. + * + */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + FT_RENDER_MODE_SDF, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Render_Mode` values instead */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /************************************************************************** + * + * @function: + * FT_Render_Glyph + * + * @description: + * Convert a given glyph image to a bitmap. It does so by inspecting the + * glyph image format, finding the relevant renderer, and invoking it. + * + * @inout: + * slot :: + * A handle to the glyph slot containing the image to convert. + * + * @input: + * render_mode :: + * The render mode used to render the glyph image into a bitmap. See + * @FT_Render_Mode for a list of possible values. + * + * If @FT_RENDER_MODE_NORMAL is used, a previous call of @FT_Load_Glyph + * with flag @FT_LOAD_COLOR makes `FT_Render_Glyph` provide a default + * blending of colored glyph layers associated with the current glyph + * slot (provided the font contains such layers) instead of rendering + * the glyph slot's outline. This is an experimental feature; see + * @FT_LOAD_COLOR for more information. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When FreeType outputs a bitmap of a glyph, it really outputs an alpha + * coverage map. If a pixel is completely covered by a filled-in + * outline, the bitmap contains 0xFF at that pixel, meaning that + * 0xFF/0xFF fraction of that pixel is covered, meaning the pixel is 100% + * black (or 0% bright). If a pixel is only 50% covered (value 0x80), + * the pixel is made 50% black (50% bright or a middle shade of grey). + * 0% covered means 0% black (100% bright or white). + * + * On high-DPI screens like on smartphones and tablets, the pixels are so + * small that their chance of being completely covered and therefore + * completely black are fairly good. On the low-DPI screens, however, + * the situation is different. The pixels are too large for most of the + * details of a glyph and shades of gray are the norm rather than the + * exception. + * + * This is relevant because all our screens have a second problem: they + * are not linear. 1~+~1 is not~2. Twice the value does not result in + * twice the brightness. When a pixel is only 50% covered, the coverage + * map says 50% black, and this translates to a pixel value of 128 when + * you use 8~bits per channel (0-255). However, this does not translate + * to 50% brightness for that pixel on our sRGB and gamma~2.2 screens. + * Due to their non-linearity, they dwell longer in the darks and only a + * pixel value of about 186 results in 50% brightness -- 128 ends up too + * dark on both bright and dark backgrounds. The net result is that dark + * text looks burnt-out, pixely and blotchy on bright background, bright + * text too frail on dark backgrounds, and colored text on colored + * background (for example, red on green) seems to have dark halos or + * 'dirt' around it. The situation is especially ugly for diagonal stems + * like in 'w' glyph shapes where the quality of FreeType's anti-aliasing + * depends on the correct display of grays. On high-DPI screens where + * smaller, fully black pixels reign supreme, this doesn't matter, but on + * our low-DPI screens with all the gray shades, it does. 0% and 100% + * brightness are the same things in linear and non-linear space, just + * all the shades in-between aren't. + * + * The blending function for placing text over a background is + * + * ``` + * dst = alpha * src + (1 - alpha) * dst , + * ``` + * + * which is known as the OVER operator. + * + * To correctly composite an anti-aliased pixel of a glyph onto a + * surface, + * + * 1. take the foreground and background colors (e.g., in sRGB space) + * and apply gamma to get them in a linear space, + * + * 2. use OVER to blend the two linear colors using the glyph pixel + * as the alpha value (remember, the glyph bitmap is an alpha coverage + * bitmap), and + * + * 3. apply inverse gamma to the blended pixel and write it back to + * the image. + * + * Internal testing at Adobe found that a target inverse gamma of~1.8 for + * step~3 gives good results across a wide range of displays with an sRGB + * gamma curve or a similar one. + * + * This process can cost performance. There is an approximation that + * does not need to know about the background color; see + * https://bel.fi/alankila/lcd/ and + * https://bel.fi/alankila/lcd/alpcor.html for details. + * + * **ATTENTION**: Linear blending is even more important when dealing + * with subpixel-rendered glyphs to prevent color-fringing! A + * subpixel-rendered glyph must first be filtered with a filter that + * gives equal weight to the three color primaries and does not exceed a + * sum of 0x100, see section @lcd_rendering. Then the only difference to + * gray linear blending is that subpixel-rendered linear blending is done + * 3~times per pixel: red foreground subpixel to red background subpixel + * and so on for green and blue. + */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /************************************************************************** + * + * @enum: + * FT_Kerning_Mode + * + * @description: + * An enumeration to specify the format of kerning values returned by + * @FT_Get_Kerning. + * + * @values: + * FT_KERNING_DEFAULT :: + * Return grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNFITTED :: + * Return un-grid-fitted kerning distances in 26.6 fractional pixels. + * + * FT_KERNING_UNSCALED :: + * Return the kerning vector in original font units. + * + * @note: + * `FT_KERNING_DEFAULT` returns full pixel values; it also makes FreeType + * heuristically scale down kerning distances at small ppem values so + * that they don't become too big. + * + * Both `FT_KERNING_DEFAULT` and `FT_KERNING_UNFITTED` use the current + * horizontal scaling factor (as set e.g. with @FT_Set_Char_Size) to + * convert font units to pixels. + */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Kerning_Mode` values instead */ +#define ft_kerning_default FT_KERNING_DEFAULT +#define ft_kerning_unfitted FT_KERNING_UNFITTED +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /************************************************************************** + * + * @function: + * FT_Get_Kerning + * + * @description: + * Return the kerning vector between two glyphs of the same face. + * + * @input: + * face :: + * A handle to a source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * kern_mode :: + * See @FT_Kerning_Mode for more information. Determines the scale and + * dimension of the returned kerning vector. + * + * @output: + * akerning :: + * The kerning vector. This is either in font units, fractional pixels + * (26.6 format), or pixels for scalable formats, and in pixels for + * fixed-sizes formats. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Only horizontal layouts (left-to-right & right-to-left) are supported + * by this method. Other layouts, or more sophisticated kernings, are + * out of the scope of this API function -- they can be implemented + * through format-specific interfaces. + * + * Kerning for OpenType fonts implemented in a 'GPOS' table is not + * supported; use @FT_HAS_KERNING to find out whether a font has data + * that can be extracted with `FT_Get_Kerning`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /************************************************************************** + * + * @function: + * FT_Get_Track_Kerning + * + * @description: + * Return the track kerning for a given face object at a given size. + * + * @input: + * face :: + * A handle to a source face object. + * + * point_size :: + * The point size in 16.16 fractional points. + * + * degree :: + * The degree of tightness. Increasingly negative values represent + * tighter track kerning, while increasingly positive values represent + * looser track kerning. Value zero means no track kerning. + * + * @output: + * akerning :: + * The kerning in 16.16 fractional points, to be uniformly applied + * between all glyphs. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Currently, only the Type~1 font driver supports track kerning, using + * data from AFM files (if attached with @FT_Attach_File or + * @FT_Attach_Stream). + * + * Only very few AFM files come with track kerning data; please refer to + * Adobe's AFM specification for more details. + */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /************************************************************************** + * + * @section: + * character_mapping + * + */ + + /************************************************************************** + * + * @function: + * FT_Select_Charmap + * + * @description: + * Select a given charmap by its encoding tag (as listed in + * `freetype.h`). + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * encoding :: + * A handle to the selected encoding. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if no charmap in the face corresponds + * to the encoding queried here. + * + * Because many fonts contain more than a single cmap for Unicode + * encoding, this function has some special code to select the one that + * covers Unicode best ('best' in the sense that a UCS-4 cmap is + * preferred to a UCS-2 cmap). It is thus preferable to @FT_Set_Charmap + * in this case. + */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /************************************************************************** + * + * @function: + * FT_Set_Charmap + * + * @description: + * Select a given charmap for character code to glyph index mapping. + * + * @inout: + * face :: + * A handle to the source face object. + * + * @input: + * charmap :: + * A handle to the selected charmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function returns an error if the charmap is not part of the face + * (i.e., if it is not listed in the `face->charmaps` table). + * + * It also fails if an OpenType type~14 charmap is selected (which + * doesn't map character codes to glyph indices at all). + */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap` belongs. If an error occurs, -1 is returned. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_Char_Index + * + * @description: + * Return the glyph index of a given character code. This function uses + * the currently selected charmap to do the mapping. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. If + * the first glyph is not named '.notdef', then for Type~1 and Type~42 + * fonts, '.notdef' will be moved into the glyph ID~0 position, and + * whatever was there will be moved to the position '.notdef' had. For + * Type~1 fonts, if there is no '.notdef' glyph at all, then one will be + * created at index~0 and whatever was there will be moved to the last + * index -- Type~42 fonts are considered invalid under this condition. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Get_First_Char + * + * @description: + * Return the first character code in the current charmap of a given + * face, together with its corresponding glyph index. + * + * @input: + * face :: + * A handle to the source face object. + * + * @output: + * agindex :: + * Glyph index of first character code. 0~if charmap is empty. + * + * @return: + * The charmap's first character code. + * + * @note: + * You should use this function together with @FT_Get_Next_Char to parse + * all character codes available in a given charmap. The code should + * look like this: + * + * ``` + * FT_ULong charcode; + * FT_UInt gindex; + * + * + * charcode = FT_Get_First_Char( face, &gindex ); + * while ( gindex != 0 ) + * { + * ... do something with (charcode,gindex) pair ... + * + * charcode = FT_Get_Next_Char( face, charcode, &gindex ); + * } + * ``` + * + * Be aware that character codes can have values up to 0xFFFFFFFF; this + * might happen for non-Unicode or malformed cmaps. However, even with + * regular Unicode encoding, so-called 'last resort fonts' (using SFNT + * cmap format 13, see function @FT_Get_CMap_Format) normally have + * entries for all Unicode characters up to 0x1FFFFF, which can cause *a + * lot* of iterations. + * + * Note that `*agindex` is set to~0 if the charmap is empty. The result + * itself can be~0 in two cases: if the charmap is empty or if the + * value~0 is the first valid character code. + */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @function: + * FT_Get_Next_Char + * + * @description: + * Return the next character code in the current charmap of a given face + * following the value `char_code`, as well as the corresponding glyph + * index. + * + * @input: + * face :: + * A handle to the source face object. + * + * char_code :: + * The starting character code. + * + * @output: + * agindex :: + * Glyph index of next character code. 0~if charmap is empty. + * + * @return: + * The charmap's next character code. + * + * @note: + * You should use this function with @FT_Get_First_Char to walk over all + * character codes available in a given charmap. See the note for that + * function for a simple code example. + * + * Note that `*agindex` is set to~0 when there are no more codes in the + * charmap. + */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /************************************************************************** + * + * @section: + * face_creation + * + */ + + /************************************************************************** + * + * @function: + * FT_Face_Properties + * + * @description: + * Set or override certain (library or module-wide) properties on a + * face-by-face basis. Useful for finer-grained control and avoiding + * locks on shared structures (threads can modify their own faces as they + * see fit). + * + * Contrary to @FT_Property_Set, this function uses @FT_Parameter so that + * you can pass multiple properties to the target face in one call. Note + * that only a subset of the available properties can be controlled. + * + * * @FT_PARAM_TAG_STEM_DARKENING (stem darkening, corresponding to the + * property `no-stem-darkening` provided by the 'autofit', 'cff', + * 'type1', and 't1cid' modules; see @no-stem-darkening). + * + * * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding + * to function @FT_Library_SetLcdFilterWeights). + * + * * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID + * 'random' operator, corresponding to the `random-seed` property + * provided by the 'cff', 'type1', and 't1cid' modules; see + * @random-seed). + * + * Pass `NULL` as `data` in @FT_Parameter for a given tag to reset the + * option and use the library or module default again. + * + * @input: + * face :: + * A handle to the source face object. + * + * num_properties :: + * The number of properties that follow. + * + * properties :: + * A handle to an @FT_Parameter array with `num_properties` elements. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * Here is an example that sets three properties. You must define + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` to make the LCD filter examples + * work. + * + * ``` + * FT_Parameter property1; + * FT_Bool darken_stems = 1; + * + * FT_Parameter property2; + * FT_LcdFiveTapFilter custom_weight = + * { 0x11, 0x44, 0x56, 0x44, 0x11 }; + * + * FT_Parameter property3; + * FT_Int32 random_seed = 314159265; + * + * FT_Parameter properties[3] = { property1, + * property2, + * property3 }; + * + * + * property1.tag = FT_PARAM_TAG_STEM_DARKENING; + * property1.data = &darken_stems; + * + * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property2.data = custom_weight; + * + * property3.tag = FT_PARAM_TAG_RANDOM_SEED; + * property3.data = &random_seed; + * + * FT_Face_Properties( face, 3, properties ); + * ``` + * + * The next example resets a single property to its default value. + * + * ``` + * FT_Parameter property; + * + * + * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property.data = NULL; + * + * FT_Face_Properties( face, 1, &property ); + * ``` + * + * @since: + * 2.8 + * + */ + FT_EXPORT( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ); + + + /************************************************************************** + * + * @section: + * information_retrieval + * + */ + + /************************************************************************** + * + * @function: + * FT_Get_Name_Index + * + * @description: + * Return the glyph index of a given glyph name. This only works + * for those faces where @FT_HAS_GLYPH_NAMES returns true. + * + * @input: + * face :: + * A handle to the source face object. + * + * glyph_name :: + * The glyph name. + * + * @return: + * The glyph index. 0~means 'undefined character code'. + * + * @note: + * Acceptable glyph names might come from the [Adobe Glyph + * List](https://github.com/adobe-type-tools/agl-aglfn). See + * @FT_Get_Glyph_Name for the inverse functionality. + * + * This function has limited capabilities if the config macro + * `FT_CONFIG_OPTION_POSTSCRIPT_NAMES` is not defined in `ftoption.h`: + * It then works only for fonts that actually embed glyph names (which + * many recent OpenType fonts do not). + */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + const FT_String* glyph_name ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph_Name + * + * @description: + * Retrieve the ASCII name of a given glyph in a face. This only works + * for those faces where @FT_HAS_GLYPH_NAMES returns true. + * + * @input: + * face :: + * A handle to a source face object. + * + * glyph_index :: + * The glyph index. + * + * buffer_max :: + * The maximum number of bytes available in the buffer. + * + * @output: + * buffer :: + * A pointer to a target buffer where the name is copied to. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error is returned if the face doesn't provide glyph names or if the + * glyph index is invalid. In all cases of failure, the first byte of + * `buffer` is set to~0 to indicate an empty name. + * + * The glyph name is truncated to fit within the buffer if it is too + * long. The returned string is always zero-terminated. + * + * Be aware that FreeType reorders glyph indices internally so that glyph + * index~0 always corresponds to the 'missing glyph' (called '.notdef'). + * + * This function has limited capabilities if the config macro + * `FT_CONFIG_OPTION_POSTSCRIPT_NAMES` is not defined in `ftoption.h`: + * It then works only for fonts that actually embed glyph names (which + * many recent OpenType fonts do not). + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /************************************************************************** + * + * @function: + * FT_Get_Postscript_Name + * + * @description: + * Retrieve the ASCII PostScript name of a given face, if available. + * This only works with PostScript, TrueType, and OpenType fonts. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to the face's PostScript name. `NULL` if unavailable. + * + * @note: + * The returned pointer is owned by the face and is destroyed with it. + * + * For variation fonts, this string changes if you select a different + * instance, and you have to call `FT_Get_PostScript_Name` again to + * retrieve it. FreeType follows Adobe TechNote #5902, 'Generating + * PostScript Names for Fonts Using OpenType Font Variations'. + * + * https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html + * + * [Since 2.9] Special PostScript names for named instances are only + * returned if the named instance is set with @FT_Set_Named_Instance (and + * the font has corresponding entries in its 'fvar' table or is the + * default named instance). If @FT_IS_VARIATION returns true, the + * algorithmically derived PostScript name is provided, not looking up + * special entries for named instances. + */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /************************************************************************** + * + * @enum: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants describing subglyphs. Please refer to the 'glyf' + * table description in the OpenType specification for the meaning of the + * various flags (which get synthesized for non-OpenType subglyphs). + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************** + * + * @function: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format` is @FT_GLYPH_FORMAT_COMPOSITE; an error is returned + * otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs`. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1`, `*p_arg2`, and `*p_transform` must be + * interpreted depending on the flags returned in `*p_flags`. See the + * OpenType specification for details. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/glyf#composite-glyph-description + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /************************************************************************** + * + * @enum: + * FT_FSTYPE_XXX + * + * @description: + * A list of bit flags used in the `fsType` field of the OS/2 table in a + * TrueType or OpenType font and the `FSType` entry in a PostScript font. + * These bit flags are returned by @FT_Get_FSType_Flags; they inform + * client applications of embedding and subsetting restrictions + * associated with a font. + * + * See + * https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf + * for more details. + * + * @values: + * FT_FSTYPE_INSTALLABLE_EMBEDDING :: + * Fonts with no fsType bit set may be embedded and permanently + * installed on the remote system by an application. + * + * FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: + * Fonts that have only this bit set must not be modified, embedded or + * exchanged in any manner without first obtaining permission of the + * font software copyright owner. + * + * FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: + * The font may be embedded and temporarily loaded on the remote + * system. Documents containing Preview & Print fonts must be opened + * 'read-only'; no edits can be applied to the document. + * + * FT_FSTYPE_EDITABLE_EMBEDDING :: + * The font may be embedded but must only be installed temporarily on + * other systems. In contrast to Preview & Print fonts, documents + * containing editable fonts may be opened for reading, editing is + * permitted, and changes may be saved. + * + * FT_FSTYPE_NO_SUBSETTING :: + * The font may not be subsetted prior to embedding. + * + * FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: + * Only bitmaps contained in the font may be embedded; no outline data + * may be embedded. If there are no bitmaps available in the font, + * then the font is unembeddable. + * + * @note: + * The flags are ORed together, thus more than a single value can be + * returned. + * + * While the `fsType` flags can indicate that a font may be embedded, a + * license with the font vendor may be separately required to use the + * font in this way. + */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /************************************************************************** + * + * @function: + * FT_Get_FSType_Flags + * + * @description: + * Return the `fsType` flags for a font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * The `fsType` flags, see @FT_FSTYPE_XXX. + * + * @note: + * Use this function rather than directly reading the `fs_type` field in + * the @PS_FontInfoRec structure, which is only guaranteed to return the + * correct results for Type~1 fonts. + * + * @since: + * 2.3.8 + * + */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /************************************************************************** + * + * @section: + * glyph_variants + * + * @title: + * Unicode Variation Sequences + * + * @abstract: + * The FreeType~2 interface to Unicode Variation Sequences (UVS), using + * the SFNT cmap format~14. + * + * @description: + * Many characters, especially for CJK scripts, have variant forms. They + * are a sort of grey area somewhere between being totally irrelevant and + * semantically distinct; for this reason, the Unicode consortium decided + * to introduce Variation Sequences (VS), consisting of a Unicode base + * character and a variation selector instead of further extending the + * already huge number of characters. + * + * Unicode maintains two different sets, namely 'Standardized Variation + * Sequences' and registered 'Ideographic Variation Sequences' (IVS), + * collected in the 'Ideographic Variation Database' (IVD). + * + * https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt + * https://unicode.org/reports/tr37/ https://unicode.org/ivd/ + * + * To date (January 2017), the character with the most ideographic + * variations is U+9089, having 32 such IVS. + * + * Three Mongolian Variation Selectors have the values U+180B-U+180D; 256 + * generic Variation Selectors are encoded in the ranges U+FE00-U+FE0F + * and U+E0100-U+E01EF. IVS currently use Variation Selectors from the + * range U+E0100-U+E01EF only. + * + * A VS consists of the base character value followed by a single + * Variation Selector. For example, to get the first variation of + * U+9089, you have to write the character sequence `U+9089 U+E0100`. + * + * Adobe and MS decided to support both standardized and ideographic VS + * with a new cmap subtable (format~14). It is an odd subtable because + * it is not a mapping of input code points to glyphs, but contains lists + * of all variations supported by the font. + * + * A variation may be either 'default' or 'non-default' for a given font. + * A default variation is the one you will get for that code point if you + * look it up in the standard Unicode cmap. A non-default variation is a + * different glyph. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIndex + * + * @description: + * Return the glyph index of a given character code as modified by the + * variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character code point in Unicode. + * + * variantSelector :: + * The Unicode code point of the variation selector. + * + * @return: + * The glyph index. 0~means either 'undefined character code', or + * 'undefined selector code', or 'no variation selector cmap subtable', + * or 'current CharMap is not Unicode'. + * + * @note: + * If you use FreeType to manipulate the contents of font files directly, + * be aware that the glyph index returned by this function doesn't always + * correspond to the internal indices used within the file. This is done + * to ensure that value~0 always corresponds to the 'missing glyph'. + * + * This function is only meaningful if + * a) the font has a variation selector cmap sub table, and + * b) the current charmap has a Unicode encoding. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharVariantIsDefault + * + * @description: + * Check whether this variation of this Unicode character is the one to + * be found in the charmap. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * variantSelector :: + * The Unicode codepoint of the variation selector. + * + * @return: + * 1~if found in the standard (Unicode) cmap, 0~if found in the variation + * selector cmap, or -1 if it is not a variation. + * + * @note: + * This function is only meaningful if the font has a variation selector + * cmap subtable. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantSelectors + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found in + * the font. + * + * @input: + * face :: + * A handle to the source face object. + * + * @return: + * A pointer to an array of selector code points, or `NULL` if there is + * no valid variation selector cmap subtable. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetVariantsOfChar + * + * @description: + * Return a zero-terminated list of Unicode variation selectors found for + * the specified character code. + * + * @input: + * face :: + * A handle to the source face object. + * + * charcode :: + * The character codepoint in Unicode. + * + * @return: + * A pointer to an array of variation selector code points that are + * active for the given character, or `NULL` if the corresponding list is + * empty. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /************************************************************************** + * + * @function: + * FT_Face_GetCharsOfVariant + * + * @description: + * Return a zero-terminated list of Unicode character codes found for the + * specified variation selector. + * + * @input: + * face :: + * A handle to the source face object. + * + * variantSelector :: + * The variation selector code point in Unicode. + * + * @return: + * A list of all the code points that are specified by this selector + * (both default and non-default codes are returned) or `NULL` if there + * is no valid cmap or the variation selector is invalid. + * + * @note: + * The last item in the array is~0; the array is owned by the @FT_Face + * object but can be overwritten or released on the next call to a + * FreeType function. + * + * @since: + * 2.3.6 + * + */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /************************************************************************** + * + * @section: + * computations + * + * @title: + * Computations + * + * @abstract: + * Crunching fixed numbers and vectors. + * + * @description: + * This section contains various functions used to perform computations + * on 16.16 fixed-point numbers or 2D vectors. FreeType does not use + * floating-point data types. + * + * **Attention**: Most arithmetic functions take `FT_Long` as arguments. + * For historical reasons, FreeType was designed under the assumption + * that `FT_Long` is a 32-bit integer; results can thus be undefined if + * the arguments don't fit into 32 bits. + * + * @order: + * FT_MulDiv + * FT_MulFix + * FT_DivFix + * FT_RoundFix + * FT_CeilFix + * FT_FloorFix + * FT_Vector_Transform + * FT_Matrix_Multiply + * FT_Matrix_Invert + * + */ + + + /************************************************************************** + * + * @function: + * FT_MulDiv + * + * @description: + * Compute `(a*b)/c` with maximum accuracy, using a 64-bit intermediate + * integer whenever necessary. + * + * This function isn't necessarily as fast as some processor-specific + * operations, but is at least completely portable. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. + * + * c :: + * The divisor. + * + * @return: + * The result of `(a*b)/c`. This function never traps when trying to + * divide by zero; it simply returns 'MaxInt' or 'MinInt' depending on + * the signs of `a` and `b`. + */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /************************************************************************** + * + * @function: + * FT_MulFix + * + * @description: + * Compute `(a*b)/0x10000` with maximum accuracy. Its main use is to + * multiply a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The first multiplier. + * + * b :: + * The second multiplier. Use a 16.16 factor here whenever possible + * (see note below). + * + * @return: + * The result of `(a*b)/0x10000`. + * + * @note: + * This function has been optimized for the case where the absolute value + * of `a` is less than 2048, and `b` is a 16.16 scaling factor. As this + * happens mainly when scaling from notional units to fractional pixels + * in FreeType, it resulted in noticeable speed improvements between + * versions 2.x and 1.x. + * + * As a conclusion, always try to place a 16.16 factor as the _second_ + * argument of this function; this can make a great difference. + */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_DivFix + * + * @description: + * Compute `(a*0x10000)/b` with maximum accuracy. Its main use is to + * divide a given value by a 16.16 fixed-point factor. + * + * @input: + * a :: + * The numerator. + * + * b :: + * The denominator. Use a 16.16 factor here. + * + * @return: + * The result of `(a*0x10000)/b`. + */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /************************************************************************** + * + * @function: + * FT_RoundFix + * + * @description: + * Round a 16.16 fixed number. + * + * @input: + * a :: + * The number to be rounded. + * + * @return: + * `a` rounded to the nearest 16.16 fixed integer, halfway cases away + * from zero. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_CeilFix + * + * @description: + * Compute the smallest following integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the ceiling function is to be computed. + * + * @return: + * `a` rounded towards plus infinity. + * + * @note: + * The function uses wrap-around arithmetic. + */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_FloorFix + * + * @description: + * Compute the largest previous integer of a 16.16 fixed number. + * + * @input: + * a :: + * The number for which the floor function is to be computed. + * + * @return: + * `a` rounded towards minus infinity. + */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Transform + * + * @description: + * Transform a single vector through a 2x2 matrix. + * + * @inout: + * vector :: + * The target vector to transform. + * + * @input: + * matrix :: + * A pointer to the source 2x2 matrix. + * + * @note: + * The result is undefined if either `vector` or `matrix` is invalid. + */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @section: + * library_setup + * + */ + + /************************************************************************** + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. Use + * @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: + * The major version number. + * FREETYPE_MINOR :: + * The minor version number. + * FREETYPE_PATCH :: + * The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library with + * the 'libtool' package is _not_ controlled by these three macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 13 +#define FREETYPE_PATCH 2 + + + /************************************************************************** + * + * @function: + * FT_Library_Version + * + * @description: + * Return the version of the FreeType library being used. This is useful + * when dynamically linking to the library, since one cannot use the + * macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and @FREETYPE_PATCH. + * + * @input: + * library :: + * A source library handle. + * + * @output: + * amajor :: + * The major version number. + * + * aminor :: + * The minor version number. + * + * apatch :: + * The patch version number. + * + * @note: + * The reason why this function takes a `library` argument is because + * certain programs implement library initialization in a custom way that + * doesn't use @FT_Init_FreeType. + * + * In such cases, the library version might not be available before the + * library object has been created. + */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /************************************************************************** + * + * @section: + * other_api_data + * + */ + + /************************************************************************** + * + * @function: + * FT_Face_CheckTrueTypePatents + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + * + */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Face_SetUnpatentedHinting + * + * @description: + * Deprecated, does nothing. + * + * @input: + * face :: + * A face handle. + * + * value :: + * New boolean setting. + * + * @return: + * Always returns false. + * + * @note: + * Since May 2010, TrueType hinting is no longer patented. + * + * @since: + * 2.3.5 + * + */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* FREETYPE_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftadvanc.h b/external/freetype/include/freetype/ftadvanc.h new file mode 100644 index 000000000..4560ded6d --- /dev/null +++ b/external/freetype/include/freetype/ftadvanc.h @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * ftadvanc.h + * + * Quick computation of advance widths (specification only). + * + * Copyright (C) 2008-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTADVANC_H_ +#define FTADVANC_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + * + * @order: + * FT_Get_Advance + * FT_Get_Advances + * + */ + + + /************************************************************************** + * + * @enum: + * FT_ADVANCE_FLAG_FAST_ONLY + * + * @description: + * A bit-flag to be OR-ed with the `flags` parameter of the + * @FT_Get_Advance and @FT_Get_Advances functions. + * + * If set, it indicates that you want these functions to fail if the + * corresponding hinting mode or font driver doesn't allow for very quick + * advance computation. + * + * Typically, glyphs that are either unscaled, unhinted, bitmapped, or + * light-hinted can have their advance width computed very quickly. + * + * Normal and bytecode hinted modes that require loading, scaling, and + * hinting of the glyph outline, are extremely slow by comparison. + */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000L + + + /************************************************************************** + * + * @function: + * FT_Get_Advance + * + * @description: + * Retrieve the advance value of a given glyph outline in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * gindex :: + * The glyph index. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph, used to determine what kind of advances you need. + * + * @output: + * padvance :: + * The advance value. If scaling is performed (based on the value of + * `load_flags`), the advance value is in 16.16 format. Otherwise, it + * is in font units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, this is the vertical advance + * corresponding to a vertical layout. Otherwise, it is the horizontal + * advance in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * A scaled advance is returned in 16.16 format but isn't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /************************************************************************** + * + * @function: + * FT_Get_Advances + * + * @description: + * Retrieve the advance values of several glyph outlines in an @FT_Face. + * + * @input: + * face :: + * The source @FT_Face handle. + * + * start :: + * The first glyph index. + * + * count :: + * The number of advance values you want to retrieve. + * + * load_flags :: + * A set of bit flags similar to those used when calling + * @FT_Load_Glyph. + * + * @output: + * padvance :: + * The advance values. This array, to be provided by the caller, must + * contain at least `count` elements. + * + * If scaling is performed (based on the value of `load_flags`), the + * advance values are in 16.16 format. Otherwise, they are in font + * units. + * + * If @FT_LOAD_VERTICAL_LAYOUT is set, these are the vertical advances + * corresponding to a vertical layout. Otherwise, they are the + * horizontal advances in a horizontal layout. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and if + * the corresponding font backend doesn't have a quick way to retrieve + * the advances. + * + * Scaled advances are returned in 16.16 format but aren't transformed by + * the affine transformation specified by @FT_Set_Transform. + */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + + /* */ + + +FT_END_HEADER + +#endif /* FTADVANC_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftbbox.h b/external/freetype/include/freetype/ftbbox.h new file mode 100644 index 000000000..fc21740fc --- /dev/null +++ b/external/freetype/include/freetype/ftbbox.h @@ -0,0 +1,101 @@ +/**************************************************************************** + * + * ftbbox.h + * + * FreeType exact bbox computation (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component has a _single_ role: to compute exact outline bounding + * boxes. + * + * It is separated from the rest of the engine for various technical + * reasons. It may well be integrated in 'ftoutln' later. + * + */ + + +#ifndef FTBBOX_H_ +#define FTBBOX_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_BBox + * + * @description: + * Compute the exact bounding box of an outline. This is slower than + * computing the control box. However, it uses an advanced algorithm + * that returns _very_ quickly when the two boxes coincide. Otherwise, + * the outline Bezier arcs are traversed to extract their extrema. + * + * @input: + * outline :: + * A pointer to the source outline. + * + * @output: + * abbox :: + * The outline's exact bounding box. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get + * reasonable values for the BBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the BBox, which can be + * eventually converted back to font units. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBBOX_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/include/freetype/ftbdf.h b/external/freetype/include/freetype/ftbdf.h new file mode 100644 index 000000000..e8ce64312 --- /dev/null +++ b/external/freetype/include/freetype/ftbdf.h @@ -0,0 +1,212 @@ +/**************************************************************************** + * + * ftbdf.h + * + * FreeType API for accessing BDF-specific strings (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBDF_H_ +#define FTBDF_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bdf_fonts + * + * @title: + * BDF and PCF Files + * + * @abstract: + * BDF and PCF specific API. + * + * @description: + * This section contains the declaration of functions specific to BDF and + * PCF fonts. + * + */ + + + /************************************************************************** + * + * @enum: + * BDF_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /************************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given BDF/PCF + * property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /************************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. May be + * `NULL`, indicating an empty string. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to the BDF + * specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /************************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: + * A handle to the input face. + * + * name :: + * The property name. + * + * @output: + * aproperty :: + * The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A 'property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props` array within a `FontRec` structure of a PCF font. + * + * Integer properties are always stored as 'signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type` is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* FTBDF_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftbitmap.h b/external/freetype/include/freetype/ftbitmap.h new file mode 100644 index 000000000..eb6b4b1ee --- /dev/null +++ b/external/freetype/include/freetype/ftbitmap.h @@ -0,0 +1,329 @@ +/**************************************************************************** + * + * ftbitmap.h + * + * FreeType utility functions for bitmaps (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBITMAP_H_ +#define FTBITMAP_H_ + + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * bitmap_handling + * + * @title: + * Bitmap Handling + * + * @abstract: + * Handling FT_Bitmap objects. + * + * @description: + * This section contains functions for handling @FT_Bitmap objects, + * automatically adjusting the target's bitmap buffer size as needed. + * + * Note that none of the functions changes the bitmap's 'flow' (as + * indicated by the sign of the `pitch` field in @FT_Bitmap). + * + * To set the flow, assign an appropriate positive or negative value to + * the `pitch` field of the target @FT_Bitmap object after calling + * @FT_Bitmap_Init but before calling any of the other functions + * described here. + */ + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Init + * + * @description: + * Initialize a pointer to an @FT_Bitmap structure. + * + * @inout: + * abitmap :: + * A pointer to the bitmap structure. + * + * @note: + * A deprecated name for the same function is `FT_Bitmap_New`. + */ + FT_EXPORT( void ) + FT_Bitmap_Init( FT_Bitmap *abitmap ); + + + /* deprecated */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Copy + * + * @description: + * Copy a bitmap into another one. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * A handle to the source bitmap. + * + * @output: + * target :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Embolden + * + * @description: + * Embolden a bitmap. The new bitmap will be about `xStrength` pixels + * wider and `yStrength` pixels higher. The left and bottom borders are + * kept unchanged. + * + * @input: + * library :: + * A handle to a library object. + * + * xStrength :: + * How strong the glyph is emboldened horizontally. Expressed in 26.6 + * pixel format. + * + * yStrength :: + * How strong the glyph is emboldened vertically. Expressed in 26.6 + * pixel format. + * + * @inout: + * bitmap :: + * A handle to the target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The current implementation restricts `xStrength` to be less than or + * equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. + * + * If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, you + * should call @FT_GlyphSlot_Own_Bitmap on the slot first. + * + * Bitmaps in @FT_PIXEL_MODE_GRAY2 and @FT_PIXEL_MODE_GRAY@ format are + * converted to @FT_PIXEL_MODE_GRAY format (i.e., 8bpp). + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Convert + * + * @description: + * Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp to + * a bitmap object with depth 8bpp, making the number of used bytes per + * line (a.k.a. the 'pitch') a multiple of `alignment`. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap. + * + * alignment :: + * The pitch of the bitmap is a multiple of this argument. Common + * values are 1, 2, or 4. + * + * @output: + * target :: + * The target bitmap. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * It is possible to call @FT_Bitmap_Convert multiple times without + * calling @FT_Bitmap_Done (the memory is simply reallocated). + * + * Use @FT_Bitmap_Done to finally remove the bitmap object. + * + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Blend + * + * @description: + * Blend a bitmap onto another bitmap, using a given color. + * + * @input: + * library :: + * A handle to a library object. + * + * source :: + * The source bitmap, which can have any @FT_Pixel_Mode format. + * + * source_offset :: + * The offset vector to the upper left corner of the source bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * color :: + * The color used to draw `source` onto `target`. + * + * @inout: + * target :: + * A handle to an `FT_Bitmap` object. It should be either initialized + * as empty with a call to @FT_Bitmap_Init, or it should be of type + * @FT_PIXEL_MODE_BGRA. + * + * atarget_offset :: + * The offset vector to the upper left corner of the target bitmap in + * 26.6 pixel format. It should represent an integer offset; the + * function will set the lowest six bits to zero to enforce that. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function doesn't perform clipping. + * + * The bitmap in `target` gets allocated or reallocated as needed; the + * vector `atarget_offset` is updated accordingly. + * + * In case of allocation or reallocation, the bitmap's pitch is set to + * `4 * width`. Both `source` and `target` must have the same bitmap + * flow (as indicated by the sign of the `pitch` field). + * + * `source->buffer` and `target->buffer` must neither be equal nor + * overlap. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Blend( FT_Library library, + const FT_Bitmap* source, + const FT_Vector source_offset, + FT_Bitmap* target, + FT_Vector *atarget_offset, + FT_Color color ); + + + /************************************************************************** + * + * @function: + * FT_GlyphSlot_Own_Bitmap + * + * @description: + * Make sure that a glyph slot owns `slot->bitmap`. + * + * @input: + * slot :: + * The glyph slot. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is to be used in combination with @FT_Bitmap_Embolden. + */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /************************************************************************** + * + * @function: + * FT_Bitmap_Done + * + * @description: + * Destroy a bitmap object initialized with @FT_Bitmap_Init. + * + * @input: + * library :: + * A handle to a library object. + * + * bitmap :: + * The bitmap object to be freed. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `library` argument is taken to have access to FreeType's memory + * handling functions. + */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTBITMAP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftbzip2.h b/external/freetype/include/freetype/ftbzip2.h new file mode 100644 index 000000000..7d29f4682 --- /dev/null +++ b/external/freetype/include/freetype/ftbzip2.h @@ -0,0 +1,102 @@ +/**************************************************************************** + * + * ftbzip2.h + * + * Bzip2-compressed stream support. + * + * Copyright (C) 2010-2023 by + * Joel Klinghed. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBZIP2_H_ +#define FTBZIP2_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * bzip2 + * + * @title: + * BZIP2 Streams + * + * @abstract: + * Using bzip2-compressed font files. + * + * @description: + * In certain builds of the library, bzip2 compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a bzip2 compressed + * stream from it and re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * + * This section contains the declaration of Bzip2-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenBzip2 + * + * @description: + * Open a new stream to parse bzip2-compressed font files. This is + * mainly used to support the compressed `*.pcf.bz2` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with bzip2 support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTBZIP2_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftcache.h b/external/freetype/include/freetype/ftcache.h new file mode 100644 index 000000000..a2072e26b --- /dev/null +++ b/external/freetype/include/freetype/ftcache.h @@ -0,0 +1,1087 @@ +/**************************************************************************** + * + * ftcache.h + * + * FreeType Cache subsystem (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCACHE_H_ +#define FTCACHE_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @abstract: + * How to cache face, size, and glyph data with FreeType~2. + * + * @description: + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_` prefix rather + * than the usual `FT_` prefix in the rest of FreeType. + * + * The cache is highly portable and, thus, doesn't know anything about + * the fonts installed on your system, or how to access them. Therefore, + * it requires the following. + * + * * @FTC_FaceID, an arbitrary non-zero value that uniquely identifies + * available or installed font faces, has to be provided to the + * cache by the client. Note that the cache only stores and compares + * these values and doesn't try to interpret them in any way, but they + * have to be persistent on the client side. + * + * * @FTC_Face_Requester, a method to convert an @FTC_FaceID into a new + * @FT_Face object when necessary, has to be provided to the cache by + * the client. The @FT_Face object is completely managed by the cache, + * including its termination through @FT_Done_Face. To monitor + * termination of face objects, the finalizer callback in the `generic` + * field of the @FT_Face object can be used, which might also be used + * to store the @FTC_FaceID of the face. + * + * Clients are free to map face IDs to anything useful. The most simple + * usage is, for example, to associate them to a `{pathname,face_index}` + * pair that is then used by @FTC_Face_Requester to call @FT_New_Face. + * However, more complex schemes are also possible. + * + * Note that for the cache to work correctly, the face ID values must be + * **persistent**, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible to let + * the cache get rid of any references to the old @FTC_FaceID it may keep + * internally. Failure to do so will lead to incorrect behaviour or even + * crashes in @FTC_Face_Requester. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively, and + * use them in any FreeType work stream. You can also cache other + * FreeType objects as follows. + * + * * If you want to use the charmap caching, call @FTC_CMapCache_New, + * then later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * * If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New, + * then later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * * If you need lots of small bitmaps, it is much more memory-efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). + * + * @order: + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined structure + * containing a font file path, and face index. + * + * @note: + * Never use `NULL` as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager that calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even memory + * leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************** + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * @input: + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * @output: + * aface :: + * A new @FT_Face handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The third parameter `req_data` is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer req_data, + FT_Face* aface ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @type: + * FTC_Manager + * + * @description: + * This object corresponds to one instance of the cache-subsystem. It is + * used to cache one or more @FT_Face objects, along with corresponding + * @FT_Size objects. + * + * The manager intentionally limits the total number of opened @FT_Face + * and @FT_Size objects to control memory usage. See the `max_faces` and + * `max_sizes` parameters of @FTC_Manager_New. + * + * The manager is also used to cache 'nodes' of various types while + * limiting their total memory usage. + * + * All limitations are enforced by keeping lists of managed objects in + * most-recently-used order, and flushing old nodes to make room for new + * ones. + */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /************************************************************************** + * + * @type: + * FTC_Node + * + * @description: + * An opaque handle to a cache node object. Each cache node is + * reference-counted. A node with a count of~0 might be flushed out of a + * full cache whenever a lookup request is performed. + * + * If you look up nodes, you have the ability to 'acquire' them, i.e., to + * increment their reference count. This will prevent the node from + * being flushed out of the cache until you explicitly 'release' it (see + * @FTC_Node_Unref). + * + * See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. + */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /************************************************************************** + * + * @function: + * FTC_Manager_New + * + * @description: + * Create a new cache manager. + * + * @input: + * library :: + * The parent FreeType library handle to use. + * + * max_faces :: + * Maximum number of opened @FT_Face objects managed by this cache + * instance. Use~0 for defaults. + * + * max_sizes :: + * Maximum number of opened @FT_Size objects managed by this cache + * instance. Use~0 for defaults. + * + * max_bytes :: + * Maximum number of bytes to use for cached data nodes. Use~0 for + * defaults. Note that this value does not account for managed + * @FT_Face and @FT_Size objects. + * + * requester :: + * An application-provided callback used to translate face IDs into + * real @FT_Face objects. + * + * req_data :: + * A generic pointer that is passed to the requester each time it is + * called (see @FTC_Face_Requester). + * + * @output: + * amanager :: + * A handle to a new manager object. 0~in case of failure. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Reset + * + * @description: + * Empty a given cache manager. This simply gets rid of all the + * currently cached @FT_Face and @FT_Size objects within the manager. + * + * @inout: + * manager :: + * A handle to the manager. + */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_Done + * + * @description: + * Destroy a given manager after emptying it. + * + * @input: + * manager :: + * A handle to the target cache manager object. + */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupFace + * + * @description: + * Retrieve the @FT_Face object that corresponds to a given face ID + * through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * face_id :: + * The ID of the face object. + * + * @output: + * aface :: + * A handle to the face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Face object is always owned by the manager. You + * should never try to discard it yourself. + * + * The @FT_Face object doesn't necessarily have a current size object + * (i.e., face->size can be~0). If you need a specific 'font size', use + * @FTC_Manager_LookupSize instead. + * + * Never change the face's transformation matrix (i.e., never call the + * @FT_Set_Transform function) on a returned face! If you need to + * transform glyphs, do it yourself after glyph loading. + * + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory was available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /************************************************************************** + * + * @struct: + * FTC_ScalerRec + * + * @description: + * A structure used to describe a given character size in either pixels + * or points to the cache manager. See @FTC_Manager_LookupSize. + * + * @fields: + * face_id :: + * The source face ID. + * + * width :: + * The character width. + * + * height :: + * The character height. + * + * pixel :: + * A Boolean. If 1, the `width` and `height` fields are interpreted as + * integer pixel character sizes. Otherwise, they are expressed as + * 1/64 of points. + * + * x_res :: + * Only used when `pixel` is value~0 to indicate the horizontal + * resolution in dpi. + * + * y_res :: + * Only used when `pixel` is value~0 to indicate the vertical + * resolution in dpi. + * + * @note: + * This type is mainly used to retrieve @FT_Size objects through the + * cache manager. + */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /************************************************************************** + * + * @struct: + * FTC_Scaler + * + * @description: + * A handle to an @FTC_ScalerRec structure. + */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /************************************************************************** + * + * @function: + * FTC_Manager_LookupSize + * + * @description: + * Retrieve the @FT_Size object that corresponds to a given + * @FTC_ScalerRec pointer through a cache manager. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * scaler :: + * A scaler handle. + * + * @output: + * asize :: + * A handle to the size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned @FT_Size object is always owned by the manager. You + * should never try to discard it by yourself. + * + * You can access the parent @FT_Face object simply as `size->face` if + * you need it. Note that this object is also owned by the manager. + * + * @note: + * When you perform a lookup, out-of-memory errors are detected _within_ + * the lookup and force incremental flushes of the cache until enough + * memory is released for the lookup to succeed. + * + * If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already + * been completely flushed, and still no memory is available for the + * operation. + */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /************************************************************************** + * + * @function: + * FTC_Node_Unref + * + * @description: + * Decrement a cache node's internal reference count. When the count + * reaches 0, it is not destroyed but becomes eligible for subsequent + * cache flushes. + * + * @input: + * node :: + * The cache node handle. + * + * manager :: + * The cache manager handle. + */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************** + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that a given + * @FTC_FaceID is no longer valid, either because its content changed, or + * because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id`, with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear in + * later lookups with the same `face_id` value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /************************************************************************** + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to hold + * character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means 'no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************** + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + + + /************************************************************************** + * + * @type: + * FTC_ImageCache + * + * @description: + * A handle to a glyph image cache object. They are designed to hold + * many distinct glyph images while not exceeding a certain memory + * threshold. + */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_New + * + * @description: + * Create a new glyph image cache. + * + * @input: + * manager :: + * The parent manager for the image cache. + * + * @output: + * acache :: + * A handle to the new glyph image cache object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_Lookup + * + * @description: + * Retrieve a given glyph image from a glyph image cache. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * type :: + * A pointer to a glyph image type descriptor. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_ImageCache_LookupScaler + * + * @description: + * A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source glyph image cache. + * + * scaler :: + * A pointer to a scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index to retrieve. + * + * @output: + * aglyph :: + * The corresponding @FT_Glyph object. 0~in case of failure. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The returned glyph is owned and managed by the glyph image cache. + * Never try to transform or discard it manually! You can however create + * a copy with @FT_Glyph_Copy and modify the new one. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the glyph image, after increasing its reference count. + * This ensures that the node (as well as the @FT_Glyph) will always be + * kept in the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the @FT_Glyph could be flushed out of the cache on the next call + * to one of the caching sub-system APIs. Don't assume that it is + * persistent! + * + * Calls to @FT_Set_Char_Size and friends have no effect on cached + * glyphs; you should always use the FreeType cache API instead. + */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /************************************************************************** + * + * @type: + * FTC_SBit + * + * @description: + * A handle to a small bitmap descriptor. See the @FTC_SBitRec structure + * for details. + */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /************************************************************************** + * + * @struct: + * FTC_SBitRec + * + * @description: + * A very compact structure used to describe a small glyph bitmap. + * + * @fields: + * width :: + * The bitmap width in pixels. + * + * height :: + * The bitmap height in pixels. + * + * left :: + * The horizontal distance from the pen position to the left bitmap + * border (a.k.a. 'left side bearing', or 'lsb'). + * + * top :: + * The vertical distance from the pen position (on the baseline) to the + * upper bitmap border (a.k.a. 'top side bearing'). The distance is + * positive for upwards y~coordinates. + * + * format :: + * The format of the glyph bitmap (monochrome or gray). + * + * max_grays :: + * Maximum gray level value (in the range 1 to~255). + * + * pitch :: + * The number of bytes per bitmap line. May be positive or negative. + * + * xadvance :: + * The horizontal advance width in pixels. + * + * yadvance :: + * The vertical advance height in pixels. + * + * buffer :: + * A pointer to the bitmap pixels. + */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /************************************************************************** + * + * @type: + * FTC_SBitCache + * + * @description: + * A handle to a small bitmap cache. These are special cache objects + * used to store small glyph bitmaps (and anti-aliased pixmaps) in a much + * more efficient way than the traditional glyph image cache implemented + * by @FTC_ImageCache. + */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_New + * + * @description: + * Create a new cache to store small glyph bitmaps. + * + * @input: + * manager :: + * A handle to the source cache manager. + * + * @output: + * acache :: + * A handle to the new sbit cache. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_Lookup + * + * @description: + * Look up a given small glyph bitmap in a given sbit cache and 'lock' it + * to prevent its flushing from the cache until needed. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * type :: + * A pointer to the glyph image type descriptor. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /************************************************************************** + * + * @function: + * FTC_SBitCache_LookupScaler + * + * @description: + * A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec to + * specify the face ID and its size. + * + * @input: + * cache :: + * A handle to the source sbit cache. + * + * scaler :: + * A pointer to the scaler descriptor. + * + * load_flags :: + * The corresponding load flags. + * + * gindex :: + * The glyph index. + * + * @output: + * sbit :: + * A handle to a small bitmap descriptor. + * + * anode :: + * Used to return the address of the corresponding cache node after + * incrementing its reference count (see note below). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The small bitmap descriptor and its bit buffer are owned by the cache + * and should never be freed by the application. They might as well + * disappear from memory on the next cache lookup, so don't treat them as + * persistent data. + * + * The descriptor's `buffer` field is set to~0 to indicate a missing + * glyph bitmap. + * + * If `anode` is _not_ `NULL`, it receives the address of the cache node + * containing the bitmap, after increasing its reference count. This + * ensures that the node (as well as the image) will always be kept in + * the cache until you call @FTC_Node_Unref to 'release' it. + * + * If `anode` is `NULL`, the cache node is left unchanged, which means + * that the bitmap could be flushed out of the cache on the next call to + * one of the caching sub-system APIs. Don't assume that it is + * persistent! + */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCACHE_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftchapters.h b/external/freetype/include/freetype/ftchapters.h new file mode 100644 index 000000000..7566fbd10 --- /dev/null +++ b/external/freetype/include/freetype/ftchapters.h @@ -0,0 +1,168 @@ +/**************************************************************************** + * + * This file defines the structure of the FreeType reference. + * It is used by the python script that generates the HTML files. + * + */ + + + /************************************************************************** + * + * @chapter: + * general_remarks + * + * @title: + * General Remarks + * + * @sections: + * preamble + * header_inclusion + * user_allocation + * + */ + + + /************************************************************************** + * + * @chapter: + * core_api + * + * @title: + * Core API + * + * @sections: + * basic_types + * library_setup + * face_creation + * font_testing_macros + * sizing_and_scaling + * glyph_retrieval + * character_mapping + * information_retrieval + * other_api_data + * + */ + + + /************************************************************************** + * + * @chapter: + * extended_api + * + * @title: + * Extended API + * + * @sections: + * glyph_variants + * color_management + * layer_management + * glyph_management + * mac_specific + * sizes_management + * header_file_macros + * + */ + + + /************************************************************************** + * + * @chapter: + * format_specific + * + * @title: + * Format-Specific API + * + * @sections: + * multiple_masters + * truetype_tables + * type1_tables + * sfnt_names + * bdf_fonts + * cid_fonts + * pfr_fonts + * winfnt_fonts + * svg_fonts + * font_formats + * gasp_table + * + */ + + + /************************************************************************** + * + * @chapter: + * module_specific + * + * @title: + * Controlling FreeType Modules + * + * @sections: + * auto_hinter + * cff_driver + * t1_cid_driver + * tt_driver + * pcf_driver + * ot_svg_driver + * properties + * parameter_tags + * lcd_rendering + * + */ + + + /************************************************************************** + * + * @chapter: + * cache_subsystem + * + * @title: + * Cache Sub-System + * + * @sections: + * cache_subsystem + * + */ + + + /************************************************************************** + * + * @chapter: + * support_api + * + * @title: + * Support API + * + * @sections: + * computations + * list_processing + * outline_processing + * quick_advance + * bitmap_handling + * raster + * glyph_stroker + * system_interface + * module_management + * gzip + * lzw + * bzip2 + * debugging_apis + * + */ + + + /************************************************************************** + * + * @chapter: + * error_codes + * + * @title: + * Error Codes + * + * @sections: + * error_enumerations + * error_code_values + * + */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftcid.h b/external/freetype/include/freetype/ftcid.h new file mode 100644 index 000000000..ef2293902 --- /dev/null +++ b/external/freetype/include/freetype/ftcid.h @@ -0,0 +1,167 @@ +/**************************************************************************** + * + * ftcid.h + * + * FreeType API for accessing CID font information (specification). + * + * Copyright (C) 2007-2023 by + * Dereg Clegg and Michael Toftdal. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCID_H_ +#define FTCID_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * cid_fonts + * + * @title: + * CID Fonts + * + * @abstract: + * CID-keyed font-specific API. + * + * @description: + * This section contains the declaration of CID-keyed font-specific + * functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In contrast + * to the @FT_IS_CID_KEYED macro this function returns successfully also + * for CID-keyed fonts in an SFNT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /************************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, returning + * an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCID_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftcolor.h b/external/freetype/include/freetype/ftcolor.h new file mode 100644 index 000000000..eae200fdf --- /dev/null +++ b/external/freetype/include/freetype/ftcolor.h @@ -0,0 +1,1667 @@ +/**************************************************************************** + * + * ftcolor.h + * + * FreeType's glyph color management (specification). + * + * Copyright (C) 2018-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCOLOR_H_ +#define FTCOLOR_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * color_management + * + * @title: + * Glyph Color Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'CPAL' table data. + * + * @description: + * The functions described here allow access and manipulation of color + * palette entries in OpenType's 'CPAL' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_Color + * + * @description: + * This structure models a BGRA color value of a 'CPAL' palette entry. + * + * The used color space is sRGB; the colors are not pre-multiplied, and + * alpha values must be explicitly set. + * + * @fields: + * blue :: + * Blue value. + * + * green :: + * Green value. + * + * red :: + * Red value. + * + * alpha :: + * Alpha value, giving the red, green, and blue color's opacity. + * + * @since: + * 2.10 + */ + typedef struct FT_Color_ + { + FT_Byte blue; + FT_Byte green; + FT_Byte red; + FT_Byte alpha; + + } FT_Color; + + + /************************************************************************** + * + * @enum: + * FT_PALETTE_XXX + * + * @description: + * A list of bit field constants used in the `palette_flags` array of the + * @FT_Palette_Data structure to indicate for which background a palette + * with a given index is usable. + * + * @values: + * FT_PALETTE_FOR_LIGHT_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a + * light background such as white. + * + * FT_PALETTE_FOR_DARK_BACKGROUND :: + * The palette is appropriate to use when displaying the font on a dark + * background such as black. + * + * @since: + * 2.10 + */ +#define FT_PALETTE_FOR_LIGHT_BACKGROUND 0x01 +#define FT_PALETTE_FOR_DARK_BACKGROUND 0x02 + + + /************************************************************************** + * + * @struct: + * FT_Palette_Data + * + * @description: + * This structure holds the data of the 'CPAL' table. + * + * @fields: + * num_palettes :: + * The number of palettes. + * + * palette_name_ids :: + * An optional read-only array of palette name IDs with `num_palettes` + * elements, corresponding to entries like 'dark' or 'light' in the + * font's 'name' table. + * + * An empty name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * palette_flags :: + * An optional read-only array of palette flags with `num_palettes` + * elements. Possible values are an ORed combination of + * @FT_PALETTE_FOR_LIGHT_BACKGROUND and + * @FT_PALETTE_FOR_DARK_BACKGROUND. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * num_palette_entries :: + * The number of entries in a single palette. All palettes have the + * same size. + * + * palette_entry_name_ids :: + * An optional read-only array of palette entry name IDs with + * `num_palette_entries`. In each palette, entries with the same index + * have the same function. For example, index~0 might correspond to + * string 'outline' in the font's 'name' table to indicate that this + * palette entry is used for outlines, index~1 might correspond to + * 'fill' to indicate the filling color palette entry, etc. + * + * An empty entry name ID in the 'CPAL' table gets represented as value + * 0xFFFF. + * + * `NULL` if the font's 'CPAL' table doesn't contain appropriate data. + * + * @note: + * Use function @FT_Get_Sfnt_Name to map name IDs and entry name IDs to + * name strings. + * + * Use function @FT_Palette_Select to get the colors associated with a + * palette entry. + * + * @since: + * 2.10 + */ + typedef struct FT_Palette_Data_ { + FT_UShort num_palettes; + const FT_UShort* palette_name_ids; + const FT_UShort* palette_flags; + + FT_UShort num_palette_entries; + const FT_UShort* palette_entry_name_ids; + + } FT_Palette_Data; + + + /************************************************************************** + * + * @function: + * FT_Palette_Data_Get + * + * @description: + * Retrieve the face's color palette data. + * + * @input: + * face :: + * The source face handle. + * + * @output: + * apalette :: + * A pointer to an @FT_Palette_Data structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * All arrays in the returned @FT_Palette_Data structure are read-only. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Data_Get( FT_Face face, + FT_Palette_Data *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Select + * + * @description: + * This function has two purposes. + * + * (1) It activates a palette for rendering color glyphs, and + * + * (2) it retrieves all (unmodified) color entries of this palette. This + * function returns a read-write array, which means that a calling + * application can modify the palette entries on demand. + * + * A corollary of (2) is that calling the function, then modifying some + * values, then calling the function again with the same arguments resets + * all color entries to the original 'CPAL' values; all user modifications + * are lost. + * + * @input: + * face :: + * The source face handle. + * + * palette_index :: + * The palette index. + * + * @output: + * apalette :: + * An array of color entries for a palette with index `palette_index`, + * having `num_palette_entries` elements (as found in the + * `FT_Palette_Data` structure). If `apalette` is set to `NULL`, no + * array gets returned (and no color entries can be modified). + * + * In case the font doesn't support color palettes, `NULL` is returned. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The array pointed to by `apalette_entries` is owned and managed by + * FreeType. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Select( FT_Face face, + FT_UShort palette_index, + FT_Color* *apalette ); + + + /************************************************************************** + * + * @function: + * FT_Palette_Set_Foreground_Color + * + * @description: + * 'COLR' uses palette index 0xFFFF to indicate a 'text foreground + * color'. This function sets this value. + * + * @input: + * face :: + * The source face handle. + * + * foreground_color :: + * An `FT_Color` structure to define the text foreground color. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function isn't called, the text foreground color is set to + * white opaque (BGRA value 0xFFFFFFFF) if + * @FT_PALETTE_FOR_DARK_BACKGROUND is present for the current palette, + * and black opaque (BGRA value 0x000000FF) otherwise, including the case + * that no palette types are available in the 'CPAL' table. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_COLOR_LAYERS` is not defined in `ftoption.h`. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Palette_Set_Foreground_Color( FT_Face face, + FT_Color foreground_color ); + + + /************************************************************************** + * + * @section: + * layer_management + * + * @title: + * Glyph Layer Management + * + * @abstract: + * Retrieving and manipulating OpenType's 'COLR' table data. + * + * @description: + * The functions described here allow access of colored glyph layer data + * in OpenType's 'COLR' tables. + */ + + + /************************************************************************** + * + * @struct: + * FT_LayerIterator + * + * @description: + * This iterator object is needed for @FT_Get_Color_Glyph_Layer. + * + * @fields: + * num_layers :: + * The number of glyph layers for the requested glyph index. Will be + * set by @FT_Get_Color_Glyph_Layer. + * + * layer :: + * The current layer. Will be set by @FT_Get_Color_Glyph_Layer. + * + * p :: + * An opaque pointer into 'COLR' table data. The caller must set this + * to `NULL` before the first call of @FT_Get_Color_Glyph_Layer. + */ + typedef struct FT_LayerIterator_ + { + FT_UInt num_layers; + FT_UInt layer; + FT_Byte* p; + + } FT_LayerIterator; + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_Layer + * + * @description: + * This is an interface to the 'COLR' table in OpenType fonts to + * iteratively retrieve the colored glyph layers associated with the + * current glyph slot. + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/colr + * + * The glyph layer data for a given glyph index, if present, provides an + * alternative, multi-color glyph representation: Instead of rendering + * the outline or bitmap with the given glyph index, glyphs with the + * indices and colors returned by this function are rendered layer by + * layer. + * + * The returned elements are ordered in the z~direction from bottom to + * top; the 'n'th element should be rendered with the associated palette + * color and blended on top of the already rendered layers (elements 0, + * 1, ..., n-1). + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index the colored glyph layers are associated with. + * + * @inout: + * iterator :: + * An @FT_LayerIterator object. For the first call you should set + * `iterator->p` to `NULL`. For all following calls, simply use the + * same object again. + * + * @output: + * aglyph_index :: + * The glyph index of the current layer. + * + * acolor_index :: + * The color index into the font face's color palette of the current + * layer. The value 0xFFFF is special; it doesn't reference a palette + * entry but indicates that the text foreground color should be used + * instead (to be set up by the application outside of FreeType). + * + * The color palette can be retrieved with @FT_Palette_Select. + * + * @return: + * Value~1 if everything is OK. If there are no more layers (or if there + * are no layers at all), value~0 gets returned. In case of an error, + * value~0 is returned also. + * + * @note: + * This function is necessary if you want to handle glyph layers by + * yourself. In particular, functions that operate with @FT_GlyphRec + * objects (like @FT_Get_Glyph or @FT_Glyph_To_Bitmap) don't have access + * to this information. + * + * Note that @FT_Render_Glyph is able to handle colored glyph layers + * automatically if the @FT_LOAD_COLOR flag is passed to a previous call + * to @FT_Load_Glyph. [This is an experimental feature.] + * + * @example: + * ``` + * FT_Color* palette; + * FT_LayerIterator iterator; + * + * FT_Bool have_layers; + * FT_UInt layer_glyph_index; + * FT_UInt layer_color_index; + * + * + * error = FT_Palette_Select( face, palette_index, &palette ); + * if ( error ) + * palette = NULL; + * + * iterator.p = NULL; + * have_layers = FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ); + * + * if ( palette && have_layers ) + * { + * do + * { + * FT_Color layer_color; + * + * + * if ( layer_color_index == 0xFFFF ) + * layer_color = text_foreground_color; + * else + * layer_color = palette[layer_color_index]; + * + * // Load and render glyph `layer_glyph_index', then + * // blend resulting pixmap (using color `layer_color') + * // with previously created pixmaps. + * + * } while ( FT_Get_Color_Glyph_Layer( face, + * glyph_index, + * &layer_glyph_index, + * &layer_color_index, + * &iterator ) ); + * } + * ``` + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_Layer( FT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + + /************************************************************************** + * + * @enum: + * FT_PaintFormat + * + * @description: + * Enumeration describing the different paint format types of the v1 + * extensions to the 'COLR' table, see + * 'https://github.com/googlefonts/colr-gradients-spec'. + * + * The enumeration values loosely correspond with the format numbers of + * the specification: FreeType always returns a fully specified 'Paint' + * structure for the 'Transform', 'Translate', 'Scale', 'Rotate', and + * 'Skew' table types even though the specification has different formats + * depending on whether or not a center is specified, whether the scale + * is uniform in x and y~direction or not, etc. Also, only non-variable + * format identifiers are listed in this enumeration; as soon as support + * for variable 'COLR' v1 fonts is implemented, interpolation is + * performed dependent on axis coordinates, which are configured on the + * @FT_Face through @FT_Set_Var_Design_Coordinates. This implies that + * always static, readily interpolated values are returned in the 'Paint' + * structures. + * + * @since: + * 2.13 + */ + typedef enum FT_PaintFormat_ + { + FT_COLR_PAINTFORMAT_COLR_LAYERS = 1, + FT_COLR_PAINTFORMAT_SOLID = 2, + FT_COLR_PAINTFORMAT_LINEAR_GRADIENT = 4, + FT_COLR_PAINTFORMAT_RADIAL_GRADIENT = 6, + FT_COLR_PAINTFORMAT_SWEEP_GRADIENT = 8, + FT_COLR_PAINTFORMAT_GLYPH = 10, + FT_COLR_PAINTFORMAT_COLR_GLYPH = 11, + FT_COLR_PAINTFORMAT_TRANSFORM = 12, + FT_COLR_PAINTFORMAT_TRANSLATE = 14, + FT_COLR_PAINTFORMAT_SCALE = 16, + FT_COLR_PAINTFORMAT_ROTATE = 24, + FT_COLR_PAINTFORMAT_SKEW = 28, + FT_COLR_PAINTFORMAT_COMPOSITE = 32, + FT_COLR_PAINT_FORMAT_MAX = 33, + FT_COLR_PAINTFORMAT_UNSUPPORTED = 255 + + } FT_PaintFormat; + + + /************************************************************************** + * + * @struct: + * FT_ColorStopIterator + * + * @description: + * This iterator object is needed for @FT_Get_Colorline_Stops. It keeps + * state while iterating over the stops of an @FT_ColorLine, representing + * the `ColorLine` struct of the v1 extensions to 'COLR', see + * 'https://github.com/googlefonts/colr-gradients-spec'. Do not manually + * modify fields of this iterator. + * + * @fields: + * num_color_stops :: + * The number of color stops for the requested glyph index. Set by + * @FT_Get_Paint. + * + * current_color_stop :: + * The current color stop. Set by @FT_Get_Colorline_Stops. + * + * p :: + * An opaque pointer into 'COLR' table data. Set by @FT_Get_Paint. + * Updated by @FT_Get_Colorline_Stops. + * + * read_variable :: + * A boolean keeping track of whether variable color lines are to be + * read. Set by @FT_Get_Paint. + * + * @since: + * 2.13 + */ + typedef struct FT_ColorStopIterator_ + { + FT_UInt num_color_stops; + FT_UInt current_color_stop; + + FT_Byte* p; + + FT_Bool read_variable; + + } FT_ColorStopIterator; + + + /************************************************************************** + * + * @struct: + * FT_ColorIndex + * + * @description: + * A structure representing a `ColorIndex` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * + * @fields: + * palette_index :: + * The palette index into a 'CPAL' palette. + * + * alpha :: + * Alpha transparency value multiplied with the value from 'CPAL'. + * + * @since: + * 2.13 + */ + typedef struct FT_ColorIndex_ + { + FT_UInt16 palette_index; + FT_F2Dot14 alpha; + + } FT_ColorIndex; + + + /************************************************************************** + * + * @struct: + * FT_ColorStop + * + * @description: + * A structure representing a `ColorStop` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * + * @fields: + * stop_offset :: + * The stop offset along the gradient, expressed as a 16.16 fixed-point + * coordinate. + * + * color :: + * The color information for this stop, see @FT_ColorIndex. + * + * @since: + * 2.13 + */ + typedef struct FT_ColorStop_ + { + FT_Fixed stop_offset; + FT_ColorIndex color; + + } FT_ColorStop; + + + /************************************************************************** + * + * @enum: + * FT_PaintExtend + * + * @description: + * An enumeration representing the 'Extend' mode of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * It describes how the gradient fill continues at the other boundaries. + * + * @since: + * 2.13 + */ + typedef enum FT_PaintExtend_ + { + FT_COLR_PAINT_EXTEND_PAD = 0, + FT_COLR_PAINT_EXTEND_REPEAT = 1, + FT_COLR_PAINT_EXTEND_REFLECT = 2 + + } FT_PaintExtend; + + + /************************************************************************** + * + * @struct: + * FT_ColorLine + * + * @description: + * A structure representing a `ColorLine` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * It describes a list of color stops along the defined gradient. + * + * @fields: + * extend :: + * The extend mode at the outer boundaries, see @FT_PaintExtend. + * + * color_stop_iterator :: + * The @FT_ColorStopIterator used to enumerate and retrieve the + * actual @FT_ColorStop's. + * + * @since: + * 2.13 + */ + typedef struct FT_ColorLine_ + { + FT_PaintExtend extend; + FT_ColorStopIterator color_stop_iterator; + + } FT_ColorLine; + + + /************************************************************************** + * + * @struct: + * FT_Affine23 + * + * @description: + * A structure used to store a 2x3 matrix. Coefficients are in + * 16.16 fixed-point format. The computation performed is + * + * ``` + * x' = x*xx + y*xy + dx + * y' = x*yx + y*yy + dy + * ``` + * + * @fields: + * xx :: + * Matrix coefficient. + * + * xy :: + * Matrix coefficient. + * + * dx :: + * x translation. + * + * yx :: + * Matrix coefficient. + * + * yy :: + * Matrix coefficient. + * + * dy :: + * y translation. + * + * @since: + * 2.13 + */ + typedef struct FT_Affine_23_ + { + FT_Fixed xx, xy, dx; + FT_Fixed yx, yy, dy; + + } FT_Affine23; + + + /************************************************************************** + * + * @enum: + * FT_Composite_Mode + * + * @description: + * An enumeration listing the 'COLR' v1 composite modes used in + * @FT_PaintComposite. For more details on each paint mode, see + * 'https://www.w3.org/TR/compositing-1/#porterduffcompositingoperators'. + * + * @since: + * 2.13 + */ + typedef enum FT_Composite_Mode_ + { + FT_COLR_COMPOSITE_CLEAR = 0, + FT_COLR_COMPOSITE_SRC = 1, + FT_COLR_COMPOSITE_DEST = 2, + FT_COLR_COMPOSITE_SRC_OVER = 3, + FT_COLR_COMPOSITE_DEST_OVER = 4, + FT_COLR_COMPOSITE_SRC_IN = 5, + FT_COLR_COMPOSITE_DEST_IN = 6, + FT_COLR_COMPOSITE_SRC_OUT = 7, + FT_COLR_COMPOSITE_DEST_OUT = 8, + FT_COLR_COMPOSITE_SRC_ATOP = 9, + FT_COLR_COMPOSITE_DEST_ATOP = 10, + FT_COLR_COMPOSITE_XOR = 11, + FT_COLR_COMPOSITE_PLUS = 12, + FT_COLR_COMPOSITE_SCREEN = 13, + FT_COLR_COMPOSITE_OVERLAY = 14, + FT_COLR_COMPOSITE_DARKEN = 15, + FT_COLR_COMPOSITE_LIGHTEN = 16, + FT_COLR_COMPOSITE_COLOR_DODGE = 17, + FT_COLR_COMPOSITE_COLOR_BURN = 18, + FT_COLR_COMPOSITE_HARD_LIGHT = 19, + FT_COLR_COMPOSITE_SOFT_LIGHT = 20, + FT_COLR_COMPOSITE_DIFFERENCE = 21, + FT_COLR_COMPOSITE_EXCLUSION = 22, + FT_COLR_COMPOSITE_MULTIPLY = 23, + FT_COLR_COMPOSITE_HSL_HUE = 24, + FT_COLR_COMPOSITE_HSL_SATURATION = 25, + FT_COLR_COMPOSITE_HSL_COLOR = 26, + FT_COLR_COMPOSITE_HSL_LUMINOSITY = 27, + FT_COLR_COMPOSITE_MAX = 28 + + } FT_Composite_Mode; + + + /************************************************************************** + * + * @struct: + * FT_OpaquePaint + * + * @description: + * A structure representing an offset to a `Paint` value stored in any + * of the paint tables of a 'COLR' v1 font. Compare Offset<24> there. + * When 'COLR' v1 paint tables represented by FreeType objects such as + * @FT_PaintColrLayers, @FT_PaintComposite, or @FT_PaintTransform + * reference downstream nested paint tables, we do not immediately + * retrieve them but encapsulate their location in this type. Use + * @FT_Get_Paint to retrieve the actual @FT_COLR_Paint object that + * describes the details of the respective paint table. + * + * @fields: + * p :: + * An internal offset to a Paint table, needs to be set to NULL before + * passing this struct as an argument to @FT_Get_Paint. + * + * insert_root_transform :: + * An internal boolean to track whether an initial root transform is + * to be provided. Do not set this value. + * + * @since: + * 2.13 + */ + typedef struct FT_Opaque_Paint_ + { + FT_Byte* p; + FT_Bool insert_root_transform; + } FT_OpaquePaint; + + + /************************************************************************** + * + * @struct: + * FT_PaintColrLayers + * + * @description: + * A structure representing a `PaintColrLayers` table of a 'COLR' v1 + * font. This table describes a set of layers that are to be composited + * with composite mode `FT_COLR_COMPOSITE_SRC_OVER`. The return value + * of this function is an @FT_LayerIterator initialized so that it can + * be used with @FT_Get_Paint_Layers to retrieve the @FT_OpaquePaint + * objects as references to each layer. + * + * @fields: + * layer_iterator :: + * The layer iterator that describes the layers of this paint. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintColrLayers_ + { + FT_LayerIterator layer_iterator; + + } FT_PaintColrLayers; + + + /************************************************************************** + * + * @struct: + * FT_PaintSolid + * + * @description: + * A structure representing a `PaintSolid` value of the 'COLR' v1 + * extensions, see 'https://github.com/googlefonts/colr-gradients-spec'. + * Using a `PaintSolid` value means that the glyph layer filled with + * this paint is solid-colored and does not contain a gradient. + * + * @fields: + * color :: + * The color information for this solid paint, see @FT_ColorIndex. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintSolid_ + { + FT_ColorIndex color; + + } FT_PaintSolid; + + + /************************************************************************** + * + * @struct: + * FT_PaintLinearGradient + * + * @description: + * A structure representing a `PaintLinearGradient` value of the 'COLR' + * v1 extensions, see + * 'https://github.com/googlefonts/colr-gradients-spec'. The glyph + * layer filled with this paint is drawn filled with a linear gradient. + * + * @fields: + * colorline :: + * The @FT_ColorLine information for this paint, i.e., the list of + * color stops along the gradient. + * + * p0 :: + * The starting point of the gradient definition in font units + * represented as a 16.16 fixed-point `FT_Vector`. + * + * p1 :: + * The end point of the gradient definition in font units + * represented as a 16.16 fixed-point `FT_Vector`. + * + * p2 :: + * Optional point~p2 to rotate the gradient in font units + * represented as a 16.16 fixed-point `FT_Vector`. + * Otherwise equal to~p0. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintLinearGradient_ + { + FT_ColorLine colorline; + + /* TODO: Potentially expose those as x0, y0 etc. */ + FT_Vector p0; + FT_Vector p1; + FT_Vector p2; + + } FT_PaintLinearGradient; + + + /************************************************************************** + * + * @struct: + * FT_PaintRadialGradient + * + * @description: + * A structure representing a `PaintRadialGradient` value of the 'COLR' + * v1 extensions, see + * 'https://github.com/googlefonts/colr-gradients-spec'. The glyph + * layer filled with this paint is drawn filled with a radial gradient. + * + * @fields: + * colorline :: + * The @FT_ColorLine information for this paint, i.e., the list of + * color stops along the gradient. + * + * c0 :: + * The center of the starting point of the radial gradient in font + * units represented as a 16.16 fixed-point `FT_Vector`. + * + * r0 :: + * The radius of the starting circle of the radial gradient in font + * units represented as a 16.16 fixed-point value. + * + * c1 :: + * The center of the end point of the radial gradient in font units + * represented as a 16.16 fixed-point `FT_Vector`. + * + * r1 :: + * The radius of the end circle of the radial gradient in font + * units represented as a 16.16 fixed-point value. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintRadialGradient_ + { + FT_ColorLine colorline; + + FT_Vector c0; + FT_Pos r0; + FT_Vector c1; + FT_Pos r1; + + } FT_PaintRadialGradient; + + + /************************************************************************** + * + * @struct: + * FT_PaintSweepGradient + * + * @description: + * A structure representing a `PaintSweepGradient` value of the 'COLR' + * v1 extensions, see + * 'https://github.com/googlefonts/colr-gradients-spec'. The glyph + * layer filled with this paint is drawn filled with a sweep gradient + * from `start_angle` to `end_angle`. + * + * @fields: + * colorline :: + * The @FT_ColorLine information for this paint, i.e., the list of + * color stops along the gradient. + * + * center :: + * The center of the sweep gradient in font units represented as a + * vector of 16.16 fixed-point values. + * + * start_angle :: + * The start angle of the sweep gradient in 16.16 fixed-point + * format specifying degrees divided by 180.0 (as in the + * spec). Multiply by 180.0f to receive degrees value. Values are + * given counter-clockwise, starting from the (positive) y~axis. + * + * end_angle :: + * The end angle of the sweep gradient in 16.16 fixed-point + * format specifying degrees divided by 180.0 (as in the + * spec). Multiply by 180.0f to receive degrees value. Values are + * given counter-clockwise, starting from the (positive) y~axis. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintSweepGradient_ + { + FT_ColorLine colorline; + + FT_Vector center; + FT_Fixed start_angle; + FT_Fixed end_angle; + + } FT_PaintSweepGradient; + + + /************************************************************************** + * + * @struct: + * FT_PaintGlyph + * + * @description: + * A structure representing a 'COLR' v1 `PaintGlyph` paint table. + * + * @fields: + * paint :: + * An opaque paint object pointing to a `Paint` table that serves as + * the fill for the glyph ID. + * + * glyphID :: + * The glyph ID from the 'glyf' table, which serves as the contour + * information that is filled with paint. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintGlyph_ + { + FT_OpaquePaint paint; + FT_UInt glyphID; + + } FT_PaintGlyph; + + + /************************************************************************** + * + * @struct: + * FT_PaintColrGlyph + * + * @description: + * A structure representing a 'COLR' v1 `PaintColorGlyph` paint table. + * + * @fields: + * glyphID :: + * The glyph ID from the `BaseGlyphV1List` table that is drawn for + * this paint. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintColrGlyph_ + { + FT_UInt glyphID; + + } FT_PaintColrGlyph; + + + /************************************************************************** + * + * @struct: + * FT_PaintTransform + * + * @description: + * A structure representing a 'COLR' v1 `PaintTransform` paint table. + * + * @fields: + * paint :: + * An opaque paint that is subject to being transformed. + * + * affine :: + * A 2x3 transformation matrix in @FT_Affine23 format containing + * 16.16 fixed-point values. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintTransform_ + { + FT_OpaquePaint paint; + FT_Affine23 affine; + + } FT_PaintTransform; + + + /************************************************************************** + * + * @struct: + * FT_PaintTranslate + * + * @description: + * A structure representing a 'COLR' v1 `PaintTranslate` paint table. + * Used for translating downstream paints by a given x and y~delta. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * rotated. + * + * dx :: + * Translation in x~direction in font units represented as a + * 16.16 fixed-point value. + * + * dy :: + * Translation in y~direction in font units represented as a + * 16.16 fixed-point value. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintTranslate_ + { + FT_OpaquePaint paint; + + FT_Fixed dx; + FT_Fixed dy; + + } FT_PaintTranslate; + + + /************************************************************************** + * + * @struct: + * FT_PaintScale + * + * @description: + * A structure representing all of the 'COLR' v1 'PaintScale*' paint + * tables. Used for scaling downstream paints by a given x and y~scale, + * with a given center. This structure is used for all 'PaintScale*' + * types that are part of specification; fields of this structure are + * filled accordingly. If there is a center, the center values are set, + * otherwise they are set to the zero coordinate. If the source font + * file has 'PaintScaleUniform*' set, the scale values are set + * accordingly to the same value. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * scaled. + * + * scale_x :: + * Scale factor in x~direction represented as a + * 16.16 fixed-point value. + * + * scale_y :: + * Scale factor in y~direction represented as a + * 16.16 fixed-point value. + * + * center_x :: + * x~coordinate of center point to scale from represented as a + * 16.16 fixed-point value. + * + * center_y :: + * y~coordinate of center point to scale from represented as a + * 16.16 fixed-point value. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintScale_ + { + FT_OpaquePaint paint; + + FT_Fixed scale_x; + FT_Fixed scale_y; + + FT_Fixed center_x; + FT_Fixed center_y; + + } FT_PaintScale; + + + /************************************************************************** + * + * @struct: + * FT_PaintRotate + * + * @description: + * A structure representing a 'COLR' v1 `PaintRotate` paint table. Used + * for rotating downstream paints with a given center and angle. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * rotated. + * + * angle :: + * The rotation angle that is to be applied in degrees divided by + * 180.0 (as in the spec) represented as a 16.16 fixed-point + * value. Multiply by 180.0f to receive degrees value. + * + * center_x :: + * The x~coordinate of the pivot point of the rotation in font + * units represented as a 16.16 fixed-point value. + * + * center_y :: + * The y~coordinate of the pivot point of the rotation in font + * units represented as a 16.16 fixed-point value. + * + * @since: + * 2.13 + */ + + typedef struct FT_PaintRotate_ + { + FT_OpaquePaint paint; + + FT_Fixed angle; + + FT_Fixed center_x; + FT_Fixed center_y; + + } FT_PaintRotate; + + + /************************************************************************** + * + * @struct: + * FT_PaintSkew + * + * @description: + * A structure representing a 'COLR' v1 `PaintSkew` paint table. Used + * for skewing or shearing downstream paints by a given center and + * angle. + * + * @fields: + * paint :: + * An @FT_OpaquePaint object referencing the paint that is to be + * skewed. + * + * x_skew_angle :: + * The skewing angle in x~direction in degrees divided by 180.0 + * (as in the spec) represented as a 16.16 fixed-point + * value. Multiply by 180.0f to receive degrees. + * + * y_skew_angle :: + * The skewing angle in y~direction in degrees divided by 180.0 + * (as in the spec) represented as a 16.16 fixed-point + * value. Multiply by 180.0f to receive degrees. + * + * center_x :: + * The x~coordinate of the pivot point of the skew in font units + * represented as a 16.16 fixed-point value. + * + * center_y :: + * The y~coordinate of the pivot point of the skew in font units + * represented as a 16.16 fixed-point value. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintSkew_ + { + FT_OpaquePaint paint; + + FT_Fixed x_skew_angle; + FT_Fixed y_skew_angle; + + FT_Fixed center_x; + FT_Fixed center_y; + + } FT_PaintSkew; + + + /************************************************************************** + * + * @struct: + * FT_PaintComposite + * + * @description: + * A structure representing a 'COLR' v1 `PaintComposite` paint table. + * Used for compositing two paints in a 'COLR' v1 directed acyclic graph. + * + * @fields: + * source_paint :: + * An @FT_OpaquePaint object referencing the source that is to be + * composited. + * + * composite_mode :: + * An @FT_Composite_Mode enum value determining the composition + * operation. + * + * backdrop_paint :: + * An @FT_OpaquePaint object referencing the backdrop paint that + * `source_paint` is composited onto. + * + * @since: + * 2.13 + */ + typedef struct FT_PaintComposite_ + { + FT_OpaquePaint source_paint; + FT_Composite_Mode composite_mode; + FT_OpaquePaint backdrop_paint; + + } FT_PaintComposite; + + + /************************************************************************** + * + * @union: + * FT_COLR_Paint + * + * @description: + * A union object representing format and details of a paint table of a + * 'COLR' v1 font, see + * 'https://github.com/googlefonts/colr-gradients-spec'. Use + * @FT_Get_Paint to retrieve a @FT_COLR_Paint for an @FT_OpaquePaint + * object. + * + * @fields: + * format :: + * The gradient format for this Paint structure. + * + * u :: + * Union of all paint table types: + * + * * @FT_PaintColrLayers + * * @FT_PaintGlyph + * * @FT_PaintSolid + * * @FT_PaintLinearGradient + * * @FT_PaintRadialGradient + * * @FT_PaintSweepGradient + * * @FT_PaintTransform + * * @FT_PaintTranslate + * * @FT_PaintRotate + * * @FT_PaintSkew + * * @FT_PaintComposite + * * @FT_PaintColrGlyph + * + * @since: + * 2.13 + */ + typedef struct FT_COLR_Paint_ + { + FT_PaintFormat format; + + union + { + FT_PaintColrLayers colr_layers; + FT_PaintGlyph glyph; + FT_PaintSolid solid; + FT_PaintLinearGradient linear_gradient; + FT_PaintRadialGradient radial_gradient; + FT_PaintSweepGradient sweep_gradient; + FT_PaintTransform transform; + FT_PaintTranslate translate; + FT_PaintScale scale; + FT_PaintRotate rotate; + FT_PaintSkew skew; + FT_PaintComposite composite; + FT_PaintColrGlyph colr_glyph; + + } u; + + } FT_COLR_Paint; + + + /************************************************************************** + * + * @enum: + * FT_Color_Root_Transform + * + * @description: + * An enumeration to specify whether @FT_Get_Color_Glyph_Paint is to + * return a root transform to configure the client's graphics context + * matrix. + * + * @values: + * FT_COLOR_INCLUDE_ROOT_TRANSFORM :: + * Do include the root transform as the initial @FT_COLR_Paint object. + * + * FT_COLOR_NO_ROOT_TRANSFORM :: + * Do not output an initial root transform. + * + * @since: + * 2.13 + */ + typedef enum FT_Color_Root_Transform_ + { + FT_COLOR_INCLUDE_ROOT_TRANSFORM, + FT_COLOR_NO_ROOT_TRANSFORM, + + FT_COLOR_ROOT_TRANSFORM_MAX + + } FT_Color_Root_Transform; + + + /************************************************************************** + * + * @struct: + * FT_ClipBox + * + * @description: + * A structure representing a 'COLR' v1 'ClipBox' table. 'COLR' v1 + * glyphs may optionally define a clip box for aiding allocation or + * defining a maximum drawable region. Use @FT_Get_Color_Glyph_ClipBox + * to retrieve it. + * + * @fields: + * bottom_left :: + * The bottom left corner of the clip box as an @FT_Vector with + * fixed-point coordinates in 26.6 format. + * + * top_left :: + * The top left corner of the clip box as an @FT_Vector with + * fixed-point coordinates in 26.6 format. + * + * top_right :: + * The top right corner of the clip box as an @FT_Vector with + * fixed-point coordinates in 26.6 format. + * + * bottom_right :: + * The bottom right corner of the clip box as an @FT_Vector with + * fixed-point coordinates in 26.6 format. + * + * @since: + * 2.13 + */ + typedef struct FT_ClipBox_ + { + FT_Vector bottom_left; + FT_Vector top_left; + FT_Vector top_right; + FT_Vector bottom_right; + + } FT_ClipBox; + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_Paint + * + * @description: + * This is the starting point and interface to color gradient + * information in a 'COLR' v1 table in OpenType fonts to recursively + * retrieve the paint tables for the directed acyclic graph of a colored + * glyph, given a glyph ID. + * + * https://github.com/googlefonts/colr-gradients-spec + * + * In a 'COLR' v1 font, each color glyph defines a directed acyclic + * graph of nested paint tables, such as `PaintGlyph`, `PaintSolid`, + * `PaintLinearGradient`, `PaintRadialGradient`, and so on. Using this + * function and specifying a glyph ID, one retrieves the root paint + * table for this glyph ID. + * + * This function allows control whether an initial root transform is + * returned to configure scaling, transform, and translation correctly + * on the client's graphics context. The initial root transform is + * computed and returned according to the values configured for @FT_Size + * and @FT_Set_Transform on the @FT_Face object, see below for details + * of the `root_transform` parameter. This has implications for a + * client 'COLR' v1 implementation: When this function returns an + * initially computed root transform, at the time of executing the + * @FT_PaintGlyph operation, the contours should be retrieved using + * @FT_Load_Glyph at unscaled, untransformed size. This is because the + * root transform applied to the graphics context will take care of + * correct scaling. + * + * Alternatively, to allow hinting of contours, at the time of executing + * @FT_Load_Glyph, the current graphics context transformation matrix + * can be decomposed into a scaling matrix and a remainder, and + * @FT_Load_Glyph can be used to retrieve the contours at scaled size. + * Care must then be taken to blit or clip to the graphics context with + * taking this remainder transformation into account. + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index for which to retrieve the root paint table. + * + * root_transform :: + * Specifies whether an initially computed root is returned by the + * @FT_PaintTransform operation to account for the activated size + * (see @FT_Activate_Size) and the configured transform and translate + * (see @FT_Set_Transform). + * + * This root transform is returned before nodes of the glyph graph of + * the font are returned. Subsequent @FT_COLR_Paint structures + * contain unscaled and untransformed values. The inserted root + * transform enables the client application to apply an initial + * transform to its graphics context. When executing subsequent + * FT_COLR_Paint operations, values from @FT_COLR_Paint operations + * will ultimately be correctly scaled because of the root transform + * applied to the graphics context. Use + * @FT_COLOR_INCLUDE_ROOT_TRANSFORM to include the root transform, use + * @FT_COLOR_NO_ROOT_TRANSFORM to not include it. The latter may be + * useful when traversing the 'COLR' v1 glyph graph and reaching a + * @FT_PaintColrGlyph. When recursing into @FT_PaintColrGlyph and + * painting that inline, no additional root transform is needed as it + * has already been applied to the graphics context at the beginning + * of drawing this glyph. + * + * @output: + * paint :: + * The @FT_OpaquePaint object that references the actual paint table. + * + * The respective actual @FT_COLR_Paint object is retrieved via + * @FT_Get_Paint. + * + * @return: + * Value~1 if everything is OK. If no color glyph is found, or the root + * paint could not be retrieved, value~0 gets returned. In case of an + * error, value~0 is returned also. + * + * @since: + * 2.13 + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_Paint( FT_Face face, + FT_UInt base_glyph, + FT_Color_Root_Transform root_transform, + FT_OpaquePaint* paint ); + + + /************************************************************************** + * + * @function: + * FT_Get_Color_Glyph_ClipBox + * + * @description: + * Search for a 'COLR' v1 clip box for the specified `base_glyph` and + * fill the `clip_box` parameter with the 'COLR' v1 'ClipBox' information + * if one is found. + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index for which to retrieve the clip box. + * + * @output: + * clip_box :: + * The clip box for the requested `base_glyph` if one is found. The + * clip box is computed taking scale and transformations configured on + * the @FT_Face into account. @FT_ClipBox contains @FT_Vector values + * in 26.6 format. + * + * @return: + * Value~1 if a clip box is found. If no clip box is found or an error + * occured, value~0 is returned. + * + * @note: + * To retrieve the clip box in font units, reset scale to units-per-em + * and remove transforms configured using @FT_Set_Transform. + * + * @since: + * 2.13 + */ + FT_EXPORT( FT_Bool ) + FT_Get_Color_Glyph_ClipBox( FT_Face face, + FT_UInt base_glyph, + FT_ClipBox* clip_box ); + + + /************************************************************************** + * + * @function: + * FT_Get_Paint_Layers + * + * @description: + * Access the layers of a `PaintColrLayers` table. + * + * If the root paint of a color glyph, or a nested paint of a 'COLR' + * glyph is a `PaintColrLayers` table, this function retrieves the + * layers of the `PaintColrLayers` table. + * + * The @FT_PaintColrLayers object contains an @FT_LayerIterator, which + * is used here to iterate over the layers. Each layer is returned as + * an @FT_OpaquePaint object, which then can be used with @FT_Get_Paint + * to retrieve the actual paint object. + * + * @input: + * face :: + * A handle to the parent face object. + * + * @inout: + * iterator :: + * The @FT_LayerIterator from an @FT_PaintColrLayers object, for which + * the layers are to be retrieved. The internal state of the iterator + * is incremented after one call to this function for retrieving one + * layer. + * + * @output: + * paint :: + * The @FT_OpaquePaint object that references the actual paint table. + * The respective actual @FT_COLR_Paint object is retrieved via + * @FT_Get_Paint. + * + * @return: + * Value~1 if everything is OK. Value~0 gets returned when the paint + * object can not be retrieved or any other error occurs. + * + * @since: + * 2.13 + */ + FT_EXPORT( FT_Bool ) + FT_Get_Paint_Layers( FT_Face face, + FT_LayerIterator* iterator, + FT_OpaquePaint* paint ); + + + /************************************************************************** + * + * @function: + * FT_Get_Colorline_Stops + * + * @description: + * This is an interface to color gradient information in a 'COLR' v1 + * table in OpenType fonts to iteratively retrieve the gradient and + * solid fill information for colored glyph layers for a specified glyph + * ID. + * + * https://github.com/googlefonts/colr-gradients-spec + * + * @input: + * face :: + * A handle to the parent face object. + * + * @inout: + * iterator :: + * The retrieved @FT_ColorStopIterator, configured on an @FT_ColorLine, + * which in turn got retrieved via paint information in + * @FT_PaintLinearGradient or @FT_PaintRadialGradient. + * + * @output: + * color_stop :: + * Color index and alpha value for the retrieved color stop. + * + * @return: + * Value~1 if everything is OK. If there are no more color stops, + * value~0 gets returned. In case of an error, value~0 is returned + * also. + * + * @since: + * 2.13 + */ + FT_EXPORT( FT_Bool ) + FT_Get_Colorline_Stops( FT_Face face, + FT_ColorStop* color_stop, + FT_ColorStopIterator* iterator ); + + + /************************************************************************** + * + * @function: + * FT_Get_Paint + * + * @description: + * Access the details of a paint using an @FT_OpaquePaint opaque paint + * object, which internally stores the offset to the respective `Paint` + * object in the 'COLR' table. + * + * @input: + * face :: + * A handle to the parent face object. + * + * opaque_paint :: + * The opaque paint object for which the underlying @FT_COLR_Paint + * data is to be retrieved. + * + * @output: + * paint :: + * The specific @FT_COLR_Paint object containing information coming + * from one of the font's `Paint*` tables. + * + * @return: + * Value~1 if everything is OK. Value~0 if no details can be found for + * this paint or any other error occured. + * + * @since: + * 2.13 + */ + FT_EXPORT( FT_Bool ) + FT_Get_Paint( FT_Face face, + FT_OpaquePaint opaque_paint, + FT_COLR_Paint* paint ); + + /* */ + + +FT_END_HEADER + +#endif /* FTCOLOR_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftdriver.h b/external/freetype/include/freetype/ftdriver.h new file mode 100644 index 000000000..7af7465bc --- /dev/null +++ b/external/freetype/include/freetype/ftdriver.h @@ -0,0 +1,1246 @@ +/**************************************************************************** + * + * ftdriver.h + * + * FreeType API for controlling driver modules (specification only). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTDRIVER_H_ +#define FTDRIVER_H_ + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * auto_hinter + * + * @title: + * The auto-hinter + * + * @abstract: + * Controlling the auto-hinting module. + * + * @description: + * While FreeType's auto-hinter doesn't expose API functions by itself, + * it is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. The following lists the available properties + * together with the necessary macros and structures. + * + * Note that the auto-hinter's module name is 'autofitter' for historical + * reasons. + * + * Available properties are @increase-x-height, @no-stem-darkening + * (experimental), @darkening-parameters (experimental), + * @glyph-to-script-map (experimental), @fallback-script (experimental), + * and @default-script (experimental), as documented in the @properties + * section. + * + */ + + + /************************************************************************** + * + * @section: + * cff_driver + * + * @title: + * The CFF driver + * + * @abstract: + * Controlling the CFF driver module. + * + * @description: + * While FreeType's CFF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. + * + * The CFF driver's module name is 'cff'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * + * **Hinting and anti-aliasing principles of the new engine** + * + * The rasterizer is positioning horizontal features (e.g., ascender + * height & x-height, or crossbars) on the pixel grid and minimizing the + * amount of anti-aliasing applied to them, while placing vertical + * features (vertical stems) on the pixel grid without hinting, thus + * representing the stem position and weight accurately. Sometimes the + * vertical stems may be only partially black. In this context, + * 'anti-aliasing' means that stems are not positioned exactly on pixel + * borders, causing a fuzzy appearance. + * + * There are two principles behind this approach. + * + * 1) No hinting in the horizontal direction: Unlike 'superhinted' + * TrueType, which changes glyph widths to accommodate regular + * inter-glyph spacing, Adobe's approach is 'faithful to the design' in + * representing both the glyph width and the inter-glyph spacing designed + * for the font. This makes the screen display as close as it can be to + * the result one would get with infinite resolution, while preserving + * what is considered the key characteristics of each glyph. Note that + * the distances between unhinted and grid-fitted positions at small + * sizes are comparable to kerning values and thus would be noticeable + * (and distracting) while reading if hinting were applied. + * + * One of the reasons to not hint horizontally is anti-aliasing for LCD + * screens: The pixel geometry of modern displays supplies three vertical + * subpixels as the eye moves horizontally across each visible pixel. On + * devices where we can be certain this characteristic is present a + * rasterizer can take advantage of the subpixels to add increments of + * weight. In Western writing systems this turns out to be the more + * critical direction anyway; the weights and spacing of vertical stems + * (see above) are central to Armenian, Cyrillic, Greek, and Latin type + * designs. Even when the rasterizer uses greyscale anti-aliasing instead + * of color (a necessary compromise when one doesn't know the screen + * characteristics), the unhinted vertical features preserve the design's + * weight and spacing much better than aliased type would. + * + * 2) Alignment in the vertical direction: Weights and spacing along the + * y~axis are less critical; what is much more important is the visual + * alignment of related features (like cap-height and x-height). The + * sense of alignment for these is enhanced by the sharpness of grid-fit + * edges, while the cruder vertical resolution (full pixels instead of + * 1/3 pixels) is less of a problem. + * + * On the technical side, horizontal alignment zones for ascender, + * x-height, and other important height values (traditionally called + * 'blue zones') as defined in the font are positioned independently, + * each being rounded to the nearest pixel edge, taking care of overshoot + * suppression at small sizes, stem darkening, and scaling. + * + * Hstems (that is, hint values defined in the font to help align + * horizontal features) that fall within a blue zone are said to be + * 'captured' and are aligned to that zone. Uncaptured stems are moved + * in one of four ways, top edge up or down, bottom edge up or down. + * Unless there are conflicting hstems, the smallest movement is taken to + * minimize distortion. + * + */ + + + /************************************************************************** + * + * @section: + * pcf_driver + * + * @title: + * The PCF driver + * + * @abstract: + * Controlling the PCF driver module. + * + * @description: + * While FreeType's PCF driver doesn't expose API functions by itself, it + * is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. Right now, there is a single property + * @no-long-family-names available if FreeType is compiled with + * PCF_CONFIG_OPTION_LONG_FAMILY_NAMES. + * + * The PCF driver's module name is 'pcf'. + * + */ + + + /************************************************************************** + * + * @section: + * t1_cid_driver + * + * @title: + * The Type 1 and CID drivers + * + * @abstract: + * Controlling the Type~1 and CID driver modules. + * + * @description: + * It is possible to control the behaviour of FreeType's Type~1 and + * Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get. + * + * Behind the scenes, both drivers use the Adobe CFF engine for hinting; + * however, the used properties must be specified separately. + * + * The Type~1 driver's module name is 'type1'; the CID driver's module + * name is 't1cid'. + * + * Available properties are @hinting-engine, @no-stem-darkening, + * @darkening-parameters, and @random-seed, as documented in the + * @properties section. + * + * Please see the @cff_driver section for more details on the new hinting + * engine. + * + */ + + + /************************************************************************** + * + * @section: + * tt_driver + * + * @title: + * The TrueType driver + * + * @abstract: + * Controlling the TrueType driver module. + * + * @description: + * While FreeType's TrueType driver doesn't expose API functions by + * itself, it is possible to control its behaviour with @FT_Property_Set + * and @FT_Property_Get. + * + * The TrueType driver's module name is 'truetype'; a single property + * @interpreter-version is available, as documented in the @properties + * section. + * + * To help understand the differences between interpreter versions, we + * introduce a list of definitions, kindly provided by Greg Hitchcock. + * + * _Bi-Level Rendering_ + * + * Monochromatic rendering, exclusively used in the early days of + * TrueType by both Apple and Microsoft. Microsoft's GDI interface + * supported hinting of the right-side bearing point, such that the + * advance width could be non-linear. Most often this was done to + * achieve some level of glyph symmetry. To enable reasonable + * performance (e.g., not having to run hinting on all glyphs just to get + * the widths) there was a bit in the head table indicating if the side + * bearing was hinted, and additional tables, 'hdmx' and 'LTSH', to cache + * hinting widths across multiple sizes and device aspect ratios. + * + * _Font Smoothing_ + * + * Microsoft's GDI implementation of anti-aliasing. Not traditional + * anti-aliasing as the outlines were hinted before the sampling. The + * widths matched the bi-level rendering. + * + * _ClearType Rendering_ + * + * Technique that uses physical subpixels to improve rendering on LCD + * (and other) displays. Because of the higher resolution, many methods + * of improving symmetry in glyphs through hinting the right-side bearing + * were no longer necessary. This lead to what GDI calls 'natural + * widths' ClearType, see + * http://rastertragedy.com/RTRCh4.htm#Sec21. Since hinting + * has extra resolution, most non-linearity went away, but it is still + * possible for hints to change the advance widths in this mode. + * + * _ClearType Compatible Widths_ + * + * One of the earliest challenges with ClearType was allowing the + * implementation in GDI to be selected without requiring all UI and + * documents to reflow. To address this, a compatible method of + * rendering ClearType was added where the font hints are executed once + * to determine the width in bi-level rendering, and then re-run in + * ClearType, with the difference in widths being absorbed in the font + * hints for ClearType (mostly in the white space of hints); see + * http://rastertragedy.com/RTRCh4.htm#Sec20. Somewhat by + * definition, compatible width ClearType allows for non-linear widths, + * but only when the bi-level version has non-linear widths. + * + * _ClearType Subpixel Positioning_ + * + * One of the nice benefits of ClearType is the ability to more crisply + * display fractional widths; unfortunately, the GDI model of integer + * bitmaps did not support this. However, the WPF and Direct Write + * frameworks do support fractional widths. DWrite calls this 'natural + * mode', not to be confused with GDI's 'natural widths'. Subpixel + * positioning, in the current implementation of Direct Write, + * unfortunately does not support hinted advance widths, see + * http://rastertragedy.com/RTRCh4.htm#Sec22. Note that the + * TrueType interpreter fully allows the advance width to be adjusted in + * this mode, just the DWrite client will ignore those changes. + * + * _ClearType Backward Compatibility_ + * + * This is a set of exceptions made in the TrueType interpreter to + * minimize hinting techniques that were problematic with the extra + * resolution of ClearType; see + * http://rastertragedy.com/RTRCh4.htm#Sec1 and + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx. + * This technique is not to be confused with ClearType compatible widths. + * ClearType backward compatibility has no direct impact on changing + * advance widths, but there might be an indirect impact on disabling + * some deltas. This could be worked around in backward compatibility + * mode. + * + * _Native ClearType Mode_ + * + * (Not to be confused with 'natural widths'.) This mode removes all the + * exceptions in the TrueType interpreter when running with ClearType. + * Any issues on widths would still apply, though. + * + */ + + + /************************************************************************** + * + * @section: + * ot_svg_driver + * + * @title: + * The SVG driver + * + * @abstract: + * Controlling the external rendering of OT-SVG glyphs. + * + * @description: + * By default, FreeType can only load the 'SVG~' table of OpenType fonts + * if configuration macro `FT_CONFIG_OPTION_SVG` is defined. To make it + * render SVG glyphs, an external SVG rendering library is needed. All + * details on the interface between FreeType and the external library + * via function hooks can be found in section @svg_fonts. + * + * The OT-SVG driver's module name is 'ot-svg'; it supports a single + * property called @svg-hooks, documented below in the @properties + * section. + * + */ + + + /************************************************************************** + * + * @section: + * properties + * + * @title: + * Driver properties + * + * @abstract: + * Controlling driver modules. + * + * @description: + * Driver modules can be controlled by setting and unsetting properties, + * using the functions @FT_Property_Set and @FT_Property_Get. This + * section documents the available properties, together with auxiliary + * macros and structures. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_HINTING_XXX + * + * @description: + * A list of constants used for the @hinting-engine property to select + * the hinting engine for CFF, Type~1, and CID fonts. + * + * @values: + * FT_HINTING_FREETYPE :: + * Use the old FreeType hinting engine. + * + * FT_HINTING_ADOBE :: + * Use the hinting engine contributed by Adobe. + * + * @since: + * 2.9 + * + */ +#define FT_HINTING_FREETYPE 0 +#define FT_HINTING_ADOBE 1 + + /* these constants (introduced in 2.4.12) are deprecated */ +#define FT_CFF_HINTING_FREETYPE FT_HINTING_FREETYPE +#define FT_CFF_HINTING_ADOBE FT_HINTING_ADOBE + + + /************************************************************************** + * + * @property: + * hinting-engine + * + * @description: + * Thanks to Adobe, which contributed a new hinting (and parsing) engine, + * an application can select between 'freetype' and 'adobe' if compiled + * with `CFF_CONFIG_OPTION_OLD_ENGINE`. If this configuration macro + * isn't defined, 'hinting-engine' does nothing. + * + * The same holds for the Type~1 and CID modules if compiled with + * `T1_CONFIG_OPTION_OLD_ENGINE`. + * + * For the 'cff' module, the default engine is 'adobe'. For both the + * 'type1' and 't1cid' modules, the default engine is 'adobe', too. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 'adobe' or 'freetype'). + * + * @example: + * The following example code demonstrates how to select Adobe's hinting + * engine for the 'cff' module (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_UInt hinting_engine = FT_HINTING_ADOBE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "hinting-engine", &hinting_engine ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-stem-darkening + * + * @description: + * All glyphs that pass through the auto-hinter will be emboldened unless + * this property is set to TRUE. The same is true for the CFF, Type~1, + * and CID font modules if the 'Adobe' engine is selected (which is the + * default). + * + * Stem darkening emboldens glyphs at smaller sizes to make them more + * readable on common low-DPI screens when using linear alpha blending + * and gamma correction, see @FT_Render_Glyph. When not using linear + * alpha blending and gamma correction, glyphs will appear heavy and + * fuzzy! + * + * Gamma correction essentially lightens fonts since shades of grey are + * shifted to higher pixel values (=~higher brightness) to match the + * original intention to the reality of our screens. The side-effect is + * that glyphs 'thin out'. Mac OS~X and Adobe's proprietary font + * rendering library implement a counter-measure: stem darkening at + * smaller sizes where shades of gray dominate. By emboldening a glyph + * slightly in relation to its pixel size, individual pixels get higher + * coverage of filled-in outlines and are therefore 'blacker'. This + * counteracts the 'thinning out' of glyphs, making text remain readable + * at smaller sizes. + * + * For the auto-hinter, stem-darkening is experimental currently and thus + * switched off by default (that is, `no-stem-darkening` is set to TRUE + * by default). Total consistency with the CFF driver is not achieved + * right now because the emboldening method differs and glyphs must be + * scaled down on the Y-axis to keep outline points inside their + * precomputed blue zones. The smaller the size (especially 9ppem and + * down), the higher the loss of emboldening versus the CFF driver. + * + * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). It + * can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_STEM_DARKENING. + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_stem_darkening = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "cff", + * "no-stem-darkening", &no_stem_darkening ); + * ``` + * + * @since: + * 2.4.12 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * darkening-parameters + * + * @description: + * By default, the Adobe hinting engine, as used by the CFF, Type~1, and + * CID font drivers, darkens stems as follows (if the `no-stem-darkening` + * property isn't set): + * + * ``` + * stem width <= 0.5px: darkening amount = 0.4px + * stem width = 1px: darkening amount = 0.275px + * stem width = 1.667px: darkening amount = 0.275px + * stem width >= 2.333px: darkening amount = 0px + * ``` + * + * and piecewise linear in-between. At configuration time, these four + * control points can be set with the macro + * `CFF_CONFIG_OPTION_DARKENING_PARAMETERS`; the CFF, Type~1, and CID + * drivers share these values. At runtime, the control points can be + * changed using the `darkening-parameters` property (see the example + * below that demonstrates this for the Type~1 driver). + * + * The x~values give the stem width, and the y~values the darkening + * amount. The unit is 1000th of pixels. All coordinate values must be + * positive; the x~values must be monotonically increasing; the y~values + * must be monotonically decreasing and smaller than or equal to 500 + * (corresponding to half a pixel); the slope of each linear piece must + * be shallower than -1 (e.g., -.4). + * + * The auto-hinter provides this property, too, as an experimental + * feature. See @no-stem-darkening for more. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable, using eight comma-separated integers without spaces. Here + * the above example, using `\` to break the line for readability. + * + * ``` + * FREETYPE_PROPERTIES=\ + * type1:darkening-parameters=500,300,1000,200,1500,100,2000,0 + * ``` + * + * @example: + * ``` + * FT_Library library; + * FT_Int darken_params[8] = { 500, 300, // x1, y1 + * 1000, 200, // x2, y2 + * 1500, 100, // x3, y3 + * 2000, 0 }; // x4, y4 + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "type1", + * "darkening-parameters", darken_params ); + * ``` + * + * @since: + * 2.5.1 (for 'cff' module) + * + * 2.6.2 (for 'autofitter' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * random-seed + * + * @description: + * By default, the seed value for the CFF 'random' operator and the + * similar '0 28 callothersubr pop' command for the Type~1 and CID + * drivers is set to a random value. However, mainly for debugging + * purposes, it is often necessary to use a known value as a seed so that + * the pseudo-random number sequences generated by 'random' are + * repeatable. + * + * The `random-seed` property does that. Its argument is a signed 32bit + * integer; if the value is zero or negative, the seed given by the + * `intitialRandomSeed` private DICT operator in a CFF file gets used (or + * a default value if there is no such operator). If the value is + * positive, use it instead of `initialRandomSeed`, which is consequently + * ignored. + * + * @note: + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable. It can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_RANDOM_SEED. + * + * @since: + * 2.8 (for 'cff' module) + * + * 2.9 (for 'type1' and 't1cid' modules) + * + */ + + + /************************************************************************** + * + * @property: + * no-long-family-names + * + * @description: + * If `PCF_CONFIG_OPTION_LONG_FAMILY_NAMES` is active while compiling + * FreeType, the PCF driver constructs long family names. + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When + * selecting 'Fixed' in KDE or Gnome one gets results that appear rather + * random, the style changes often if one changes the size and one cannot + * select some fonts at all. The improve this situation, the PCF module + * prepends the foundry name (plus a space) to the family name. It also + * checks whether there are 'wide' characters; all put together, family + * names like 'Sony Fixed' or 'Misc Fixed Wide' are constructed. + * + * If `no-long-family-names` is set, this feature gets switched off. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values 1 and 0 for 'on' and 'off', respectively). + * + * @example: + * ``` + * FT_Library library; + * FT_Bool no_long_family_names = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "pcf", + * "no-long-family-names", + * &no_long_family_names ); + * ``` + * + * @since: + * 2.8 + */ + + + /************************************************************************** + * + * @enum: + * TT_INTERPRETER_VERSION_XXX + * + * @description: + * A list of constants used for the @interpreter-version property to + * select the hinting engine for Truetype fonts. + * + * The numeric value in the constant names represents the version number + * as returned by the 'GETINFO' bytecode instruction. + * + * @values: + * TT_INTERPRETER_VERSION_35 :: + * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in + * Windows~98; only grayscale and B/W rasterizing is supported. + * + * TT_INTERPRETER_VERSION_38 :: + * Version~38 is the same Version~40. The original 'Infinality' code is + * no longer available. + * + * TT_INTERPRETER_VERSION_40 :: + * Version~40 corresponds to MS rasterizer v.2.1; it is roughly + * equivalent to the hinting provided by DirectWrite ClearType (as can + * be found, for example, in Microsoft's Edge Browser on Windows~10). + * It is used in FreeType to select the 'minimal' subpixel hinting + * code, a stripped-down and higher performance version of the + * 'Infinality' code. + * + * @note: + * This property controls the behaviour of the bytecode interpreter and + * thus how outlines get hinted. It does **not** control how glyph get + * rasterized! In particular, it does not control subpixel color + * filtering. + * + * If FreeType has not been compiled with the configuration option + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING`, selecting version~38 or~40 causes + * an `FT_Err_Unimplemented_Feature` error. + * + * Depending on the graphics framework, Microsoft uses different bytecode + * and rendering engines. As a consequence, the version numbers returned + * by a call to the 'GETINFO' bytecode instruction are more convoluted + * than desired. + * + * Here are two tables that try to shed some light on the possible values + * for the MS rasterizer engine, together with the additional features + * introduced by it. + * + * ``` + * GETINFO framework version feature + * ------------------------------------------------------------------- + * 3 GDI (Win 3.1), v1.0 16-bit, first version + * TrueImage + * 33 GDI (Win NT 3.1), v1.5 32-bit + * HP Laserjet + * 34 GDI (Win 95) v1.6 font smoothing, + * new SCANTYPE opcode + * 35 GDI (Win 98/2000) v1.7 (UN)SCALED_COMPONENT_OFFSET + * bits in composite glyphs + * 36 MGDI (Win CE 2) v1.6+ classic ClearType + * 37 GDI (XP and later), v1.8 ClearType + * GDI+ old (before Vista) + * 38 GDI+ old (Vista, Win 7), v1.9 subpixel ClearType, + * WPF Y-direction ClearType, + * additional error checking + * 39 DWrite (before Win 8) v2.0 subpixel ClearType flags + * in GETINFO opcode, + * bug fixes + * 40 GDI+ (after Win 7), v2.1 Y-direction ClearType flag + * DWrite (Win 8) in GETINFO opcode, + * Gray ClearType + * ``` + * + * The 'version' field gives a rough orientation only, since some + * applications provided certain features much earlier (as an example, + * Microsoft Reader used subpixel and Y-direction ClearType already in + * Windows 2000). Similarly, updates to a given framework might include + * improved hinting support. + * + * ``` + * version sampling rendering comment + * x y x y + * -------------------------------------------------------------- + * v1.0 normal normal B/W B/W bi-level + * v1.6 high high gray gray grayscale + * v1.8 high normal color-filter B/W (GDI) ClearType + * v1.9 high high color-filter gray Color ClearType + * v2.1 high normal gray B/W Gray ClearType + * v2.1 high high gray gray Gray ClearType + * ``` + * + * Color and Gray ClearType are the two available variants of + * 'Y-direction ClearType', meaning grayscale rasterization along the + * Y-direction; the name used in the TrueType specification for this + * feature is 'symmetric smoothing'. 'Classic ClearType' is the original + * algorithm used before introducing a modified version in Win~XP. + * Another name for v1.6's grayscale rendering is 'font smoothing', and + * 'Color ClearType' is sometimes also called 'DWrite ClearType'. To + * differentiate between today's Color ClearType and the earlier + * ClearType variant with B/W rendering along the vertical axis, the + * latter is sometimes called 'GDI ClearType'. + * + * 'Normal' and 'high' sampling describe the (virtual) resolution to + * access the rasterized outline after the hinting process. 'Normal' + * means 1 sample per grid line (i.e., B/W). In the current Microsoft + * implementation, 'high' means an extra virtual resolution of 16x16 (or + * 16x1) grid lines per pixel for bytecode instructions like 'MIRP'. + * After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid + * lines for color filtering if Color ClearType is activated. + * + * Note that 'Gray ClearType' is essentially the same as v1.6's grayscale + * rendering. However, the GETINFO instruction handles it differently: + * v1.6 returns bit~12 (hinting for grayscale), while v2.1 returns + * bits~13 (hinting for ClearType), 18 (symmetrical smoothing), and~19 + * (Gray ClearType). Also, this mode respects bits 2 and~3 for the + * version~1 gasp table exclusively (like Color ClearType), while v1.6 + * only respects the values of version~0 (bits 0 and~1). + * + * Keep in mind that the features of the above interpreter versions might + * not map exactly to FreeType features or behavior because it is a + * fundamentally different library with different internals. + * + */ +#define TT_INTERPRETER_VERSION_35 35 +#define TT_INTERPRETER_VERSION_38 38 +#define TT_INTERPRETER_VERSION_40 40 + + + /************************************************************************** + * + * @property: + * interpreter-version + * + * @description: + * Currently, three versions are available, two representing the bytecode + * interpreter with subpixel hinting support (old 'Infinality' code and + * new stripped-down and higher performance 'minimal' code) and one + * without, respectively. The default is subpixel support if + * `TT_CONFIG_OPTION_SUBPIXEL_HINTING` is defined, and no subpixel + * support otherwise (since it isn't available then). + * + * If subpixel hinting is on, many TrueType bytecode instructions behave + * differently compared to B/W or grayscale rendering (except if 'native + * ClearType' is selected by the font). Microsoft's main idea is to + * render at a much increased horizontal resolution, then sampling down + * the created output to subpixel precision. However, many older fonts + * are not suited to this and must be specially taken care of by applying + * (hardcoded) tweaks in Microsoft's interpreter. + * + * Details on subpixel hinting and some of the necessary tweaks can be + * found in Greg Hitchcock's whitepaper at + * 'https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. + * Note that FreeType currently doesn't really 'subpixel hint' (6x1, 6x2, + * or 6x5 supersampling) like discussed in the paper. Depending on the + * chosen interpreter, it simply ignores instructions on vertical stems + * to arrive at very similar results. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES` environment + * variable (using values '35', '38', or '40'). + * + * @example: + * The following example code demonstrates how to deactivate subpixel + * hinting (omitting the error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_35; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "truetype", + * "interpreter-version", + * &interpreter_version ); + * ``` + * + * @since: + * 2.5 + */ + + /************************************************************************** + * + * @property: + * svg-hooks + * + * @description: + * Set up the interface between FreeType and an extern SVG rendering + * library like 'librsvg'. All details on the function hooks can be + * found in section @svg_fonts. + * + * @example: + * The following example code expects that the four hook functions + * `svg_*` are defined elsewhere. Error handling is omitted, too. + * + * ``` + * FT_Library library; + * SVG_RendererHooks hooks = { + * (SVG_Lib_Init_Func)svg_init, + * (SVG_Lib_Free_Func)svg_free, + * (SVG_Lib_Render_Func)svg_render, + * (SVG_Lib_Preset_Slot_Func)svg_preset_slot }; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "ot-svg", + * "svg-hooks", &hooks ); + * ``` + * + * @since: + * 2.12 + */ + + + /************************************************************************** + * + * @property: + * glyph-to-script-map + * + * @description: + * **Experimental only** + * + * The auto-hinter provides various script modules to hint glyphs. + * Examples of supported scripts are Latin or CJK. Before a glyph is + * auto-hinted, the Unicode character map of the font gets examined, and + * the script is then determined based on Unicode character ranges, see + * below. + * + * OpenType fonts, however, often provide much more glyphs than character + * codes (small caps, superscripts, ligatures, swashes, etc.), to be + * controlled by so-called 'features'. Handling OpenType features can be + * quite complicated and thus needs a separate library on top of + * FreeType. + * + * The mapping between glyph indices and scripts (in the auto-hinter + * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an array + * with `num_glyphs` elements, as found in the font's @FT_Face structure. + * The `glyph-to-script-map` property returns a pointer to this array, + * which can be modified as needed. Note that the modification should + * happen before the first glyph gets processed by the auto-hinter so + * that the global analysis of the font shapes actually uses the modified + * mapping. + * + * @example: + * The following example code demonstrates how to access it (omitting the + * error handling). + * + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_GlyphToScriptMap prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * + * prop.face = face; + * + * FT_Property_Get( library, "autofitter", + * "glyph-to-script-map", &prop ); + * + * // adjust `prop.map' as needed right here + * + * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @enum: + * FT_AUTOHINTER_SCRIPT_XXX + * + * @description: + * **Experimental only** + * + * A list of constants used for the @glyph-to-script-map property to + * specify the script submodule the auto-hinter should use for hinting a + * particular glyph. + * + * @values: + * FT_AUTOHINTER_SCRIPT_NONE :: + * Don't auto-hint this glyph. + * + * FT_AUTOHINTER_SCRIPT_LATIN :: + * Apply the latin auto-hinter. For the auto-hinter, 'latin' is a very + * broad term, including Cyrillic and Greek also since characters from + * those scripts share the same design constraints. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0020 - U+007F // Basic Latin (no control characters) + * U+00A0 - U+00FF // Latin-1 Supplement (no control characters) + * U+0100 - U+017F // Latin Extended-A + * U+0180 - U+024F // Latin Extended-B + * U+0250 - U+02AF // IPA Extensions + * U+02B0 - U+02FF // Spacing Modifier Letters + * U+0300 - U+036F // Combining Diacritical Marks + * U+0370 - U+03FF // Greek and Coptic + * U+0400 - U+04FF // Cyrillic + * U+0500 - U+052F // Cyrillic Supplement + * U+1D00 - U+1D7F // Phonetic Extensions + * U+1D80 - U+1DBF // Phonetic Extensions Supplement + * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement + * U+1E00 - U+1EFF // Latin Extended Additional + * U+1F00 - U+1FFF // Greek Extended + * U+2000 - U+206F // General Punctuation + * U+2070 - U+209F // Superscripts and Subscripts + * U+20A0 - U+20CF // Currency Symbols + * U+2150 - U+218F // Number Forms + * U+2460 - U+24FF // Enclosed Alphanumerics + * U+2C60 - U+2C7F // Latin Extended-C + * U+2DE0 - U+2DFF // Cyrillic Extended-A + * U+2E00 - U+2E7F // Supplemental Punctuation + * U+A640 - U+A69F // Cyrillic Extended-B + * U+A720 - U+A7FF // Latin Extended-D + * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) + * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols + * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_CJK :: + * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old + * Vietnamese, and some other scripts. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+1100 - U+11FF // Hangul Jamo + * U+2E80 - U+2EFF // CJK Radicals Supplement + * U+2F00 - U+2FDF // Kangxi Radicals + * U+2FF0 - U+2FFF // Ideographic Description Characters + * U+3000 - U+303F // CJK Symbols and Punctuation + * U+3040 - U+309F // Hiragana + * U+30A0 - U+30FF // Katakana + * U+3100 - U+312F // Bopomofo + * U+3130 - U+318F // Hangul Compatibility Jamo + * U+3190 - U+319F // Kanbun + * U+31A0 - U+31BF // Bopomofo Extended + * U+31C0 - U+31EF // CJK Strokes + * U+31F0 - U+31FF // Katakana Phonetic Extensions + * U+3200 - U+32FF // Enclosed CJK Letters and Months + * U+3300 - U+33FF // CJK Compatibility + * U+3400 - U+4DBF // CJK Unified Ideographs Extension A + * U+4DC0 - U+4DFF // Yijing Hexagram Symbols + * U+4E00 - U+9FFF // CJK Unified Ideographs + * U+A960 - U+A97F // Hangul Jamo Extended-A + * U+AC00 - U+D7AF // Hangul Syllables + * U+D7B0 - U+D7FF // Hangul Jamo Extended-B + * U+F900 - U+FAFF // CJK Compatibility Ideographs + * U+FE10 - U+FE1F // Vertical forms + * U+FE30 - U+FE4F // CJK Compatibility Forms + * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms + * U+1B000 - U+1B0FF // Kana Supplement + * U+1D300 - U+1D35F // Tai Xuan Hing Symbols + * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement + * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B + * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C + * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D + * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement + * ``` + * + * FT_AUTOHINTER_SCRIPT_INDIC :: + * Apply the indic auto-hinter, covering all major scripts from the + * Indian sub-continent and some other related scripts like Thai, Lao, + * or Tibetan. + * + * By default, characters from the following Unicode ranges are + * assigned to this submodule. + * + * ``` + * U+0900 - U+0DFF // Indic Range + * U+0F00 - U+0FFF // Tibetan + * U+1900 - U+194F // Limbu + * U+1B80 - U+1BBF // Sundanese + * U+A800 - U+A82F // Syloti Nagri + * U+ABC0 - U+ABFF // Meetei Mayek + * U+11800 - U+118DF // Sharada + * ``` + * + * Note that currently Indic support is rudimentary only, missing blue + * zone support. + * + * @since: + * 2.4.11 + * + */ +#define FT_AUTOHINTER_SCRIPT_NONE 0 +#define FT_AUTOHINTER_SCRIPT_LATIN 1 +#define FT_AUTOHINTER_SCRIPT_CJK 2 +#define FT_AUTOHINTER_SCRIPT_INDIC 3 + + + /************************************************************************** + * + * @struct: + * FT_Prop_GlyphToScriptMap + * + * @description: + * **Experimental only** + * + * The data exchange structure for the @glyph-to-script-map property. + * + * @since: + * 2.4.11 + * + */ + typedef struct FT_Prop_GlyphToScriptMap_ + { + FT_Face face; + FT_UShort* map; + + } FT_Prop_GlyphToScriptMap; + + + /************************************************************************** + * + * @property: + * fallback-script + * + * @description: + * **Experimental only** + * + * If no auto-hinter script module can be assigned to a glyph, a fallback + * script gets assigned to it (see also the @glyph-to-script-map + * property). By default, this is @FT_AUTOHINTER_SCRIPT_CJK. Using the + * `fallback-script` property, this fallback value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the fallback + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the fallback script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "fallback-script", &fallback_script ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @property: + * default-script + * + * @description: + * **Experimental only** + * + * If FreeType gets compiled with `FT_CONFIG_OPTION_USE_HARFBUZZ` to make + * the HarfBuzz library access OpenType features for getting better glyph + * coverages, this property sets the (auto-fitter) script to be used for + * the default (OpenType) script data of a font's GSUB table. Features + * for the default script are intended for all scripts not explicitly + * handled in GSUB; an example is a 'dlig' feature, containing the + * combination of the characters 'T', 'E', and 'L' to form a 'TEL' + * ligature. + * + * By default, this is @FT_AUTOHINTER_SCRIPT_LATIN. Using the + * `default-script` property, this default value can be changed. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * It's important to use the right timing for changing this value: The + * creation of the glyph-to-script map that eventually uses the default + * script value gets triggered either by setting or reading a + * face-specific property like @glyph-to-script-map, or by auto-hinting + * any glyph from that face. In particular, if you have already created + * an @FT_Face structure but not loaded any glyph (using the + * auto-hinter), a change of the default script will affect this face. + * + * @example: + * ``` + * FT_Library library; + * FT_UInt default_script = FT_AUTOHINTER_SCRIPT_NONE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "default-script", &default_script ); + * ``` + * + * @since: + * 2.5.3 + * + */ + + + /************************************************************************** + * + * @property: + * increase-x-height + * + * @description: + * For ppem values in the range 6~<= ppem <= `increase-x-height`, round + * up the font's x~height much more often than normally. If the value is + * set to~0, which is the default, this feature is switched off. Use + * this property to improve the legibility of small font sizes if + * necessary. + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * Set this value right after calling @FT_Set_Char_Size, but before + * loading any glyph (using the auto-hinter). + * + * @example: + * ``` + * FT_Library library; + * FT_Face face; + * FT_Prop_IncreaseXHeight prop; + * + * + * FT_Init_FreeType( &library ); + * FT_New_Face( library, "foo.ttf", 0, &face ); + * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 ); + * + * prop.face = face; + * prop.limit = 14; + * + * FT_Property_Set( library, "autofitter", + * "increase-x-height", &prop ); + * ``` + * + * @since: + * 2.4.11 + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Prop_IncreaseXHeight + * + * @description: + * The data exchange structure for the @increase-x-height property. + * + */ + typedef struct FT_Prop_IncreaseXHeight_ + { + FT_Face face; + FT_UInt limit; + + } FT_Prop_IncreaseXHeight; + + + /************************************************************************** + * + * @property: + * warping + * + * @description: + * **Obsolete** + * + * This property was always experimental and probably never worked + * correctly. It was entirely removed from the FreeType~2 sources. This + * entry is only here for historical reference. + * + * Warping only worked in 'normal' auto-hinting mode replacing it. The + * idea of the code was to slightly scale and shift a glyph along the + * non-hinted dimension (which is usually the horizontal axis) so that as + * much of its segments were aligned (more or less) to the grid. To find + * out a glyph's optimal scaling and shifting value, various parameter + * combinations were tried and scored. + * + * @since: + * 2.6 + * + */ + + + /* */ + + +FT_END_HEADER + + +#endif /* FTDRIVER_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/fterrdef.h b/external/freetype/include/freetype/fterrdef.h new file mode 100644 index 000000000..d59b3cc2d --- /dev/null +++ b/external/freetype/include/freetype/fterrdef.h @@ -0,0 +1,283 @@ +/**************************************************************************** + * + * fterrdef.h + * + * FreeType error codes (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_code_values + * + * @title: + * Error Code Values + * + * @abstract: + * All possible error codes returned by FreeType functions. + * + * @description: + * The list below is taken verbatim from the file `fterrdef.h` (loaded + * automatically by including `FT_FREETYPE_H`). The first argument of the + * `FT_ERROR_DEF_` macro is the error label; by default, the prefix + * `FT_Err_` gets added so that you get error names like + * `FT_Err_Cannot_Open_Resource`. The second argument is the error code, + * and the last argument an error string, which is not used by FreeType. + * + * Within your application you should **only** use error names and + * **never** its numeric values! The latter might (and actually do) + * change in forthcoming FreeType versions. + * + * Macro `FT_NOERRORDEF_` defines `FT_Err_Ok`, which is always zero. See + * the 'Error Enumerations' subsection how to automatically generate a + * list of error strings. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_Err_XXX + * + */ + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, + "array allocation size too large" ) + FT_ERRORDEF_( Missing_Module, 0x0B, + "missing module" ) + FT_ERRORDEF_( Missing_Property, 0x0C, + "missing property" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, + "invalid pixel size" ) + FT_ERRORDEF_( Invalid_SVG_Document, 0x18, + "invalid SVG document" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, + "invalid PostScript (post) table" ) + FT_ERRORDEF_( DEF_In_Glyf_Bytecode, 0x9C, + "found FDEF or IDEF opcode in glyf bytecode" ) + FT_ERRORDEF_( Missing_Bitmap, 0x9D, + "missing bitmap in strike" ) + FT_ERRORDEF_( Missing_SVG_Hooks, 0x9E, + "SVG hooks have not been set" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, + "ignore" ) + FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, + "no Unicode glyph name found" ) + FT_ERRORDEF_( Glyph_Too_Big, 0xA4, + "glyph too big for hinting" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, + "`FONTBOUNDINGBOX' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB4, + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB8, + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, + "Font glyphs corrupted or missing fields" ) + + /* */ + + +/* END */ diff --git a/external/freetype/include/freetype/fterrors.h b/external/freetype/include/freetype/fterrors.h new file mode 100644 index 000000000..15ef3f76b --- /dev/null +++ b/external/freetype/include/freetype/fterrors.h @@ -0,0 +1,296 @@ +/**************************************************************************** + * + * fterrors.h + * + * FreeType error code handling (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * @section: + * error_enumerations + * + * @title: + * Error Enumerations + * + * @abstract: + * How to handle errors and error strings. + * + * @description: + * The header file `fterrors.h` (which is automatically included by + * `freetype.h`) defines the handling of FreeType's enumeration + * constants. It can also be used to generate error message strings + * with a small macro trick explained below. + * + * **Error Formats** + * + * The configuration macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` can be + * defined in `ftoption.h` in order to make the higher byte indicate the + * module where the error has happened (this is not compatible with + * standard builds of FreeType~2, however). See the file `ftmoderr.h` + * for more details. + * + * **Error Message Strings** + * + * Error definitions are set up with special macros that allow client + * applications to build a table of error message strings. The strings + * are not included in a normal build of FreeType~2 to save space (most + * client applications do not use them). + * + * To do so, you have to define the following macros before including + * this file. + * + * ``` + * FT_ERROR_START_LIST + * ``` + * + * This macro is called before anything else to define the start of the + * error list. It is followed by several `FT_ERROR_DEF` calls. + * + * ``` + * FT_ERROR_DEF( e, v, s ) + * ``` + * + * This macro is called to define one single error. 'e' is the error + * code identifier (e.g., `Invalid_Argument`), 'v' is the error's + * numerical value, and 's' is the corresponding error string. + * + * ``` + * FT_ERROR_END_LIST + * ``` + * + * This macro ends the list. + * + * Additionally, you have to undefine `FTERRORS_H_` before #including + * this file. + * + * Here is a simple example. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERRORDEF( e, v, s ) { e, s }, + * #define FT_ERROR_START_LIST { + * #define FT_ERROR_END_LIST { 0, NULL } }; + * + * const struct + * { + * int err_code; + * const char* err_msg; + * } ft_errors[] = + * + * #include + * ``` + * + * An alternative to using an array is a switch statement. + * + * ``` + * #undef FTERRORS_H_ + * #define FT_ERROR_START_LIST switch ( error_code ) { + * #define FT_ERRORDEF( e, v, s ) case v: return s; + * #define FT_ERROR_END_LIST } + * ``` + * + * If you use `FT_CONFIG_OPTION_USE_MODULE_ERRORS`, `error_code` should + * be replaced with `FT_ERROR_BASE(error_code)` in the last example. + */ + + /* */ + + /* In previous FreeType versions we used `__FTERRORS_H__`. However, */ + /* using two successive underscores in a non-system symbol name */ + /* violates the C (and C++) standard, so it was changed to the */ + /* current form. In spite of this, we have to make */ + /* */ + /* ``` */ + /* #undefine __FTERRORS_H__ */ + /* ``` */ + /* */ + /* work for backward compatibility. */ + /* */ +#if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) +#define FTERRORS_H_ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_`. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_INCLUDE_ERR_PROTOS + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for _Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_BASE + + /* FT_ERR_PREFIX is needed internally */ +#ifndef FT2_BUILD_LIBRARY +#undef FT_ERR_PREFIX +#endif + + /* FT_INCLUDE_ERR_PROTOS: Control whether function prototypes should be */ + /* included with */ + /* */ + /* #include */ + /* */ + /* This is only true where `FT_ERRORDEF` is */ + /* undefined. */ + /* */ + /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of */ + /* `fterrors.h`. */ +#ifdef FT_INCLUDE_ERR_PROTOS +#undef FT_INCLUDE_ERR_PROTOS + +#ifndef FT_ERR_PROTOS_DEFINED +#define FT_ERR_PROTOS_DEFINED + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @function: + * FT_Error_String + * + * @description: + * Retrieve the description of a valid FreeType error code. + * + * @input: + * error_code :: + * A valid FreeType error code. + * + * @return: + * A C~string or `NULL`, if any error occurred. + * + * @note: + * FreeType has to be compiled with `FT_CONFIG_OPTION_ERROR_STRINGS` or + * `FT_DEBUG_LEVEL_ERROR` to get meaningful descriptions. + * 'error_string' will be `NULL` otherwise. + * + * Module identification will be ignored: + * + * ```c + * strcmp( FT_Error_String( FT_Err_Unknown_File_Format ), + * FT_Error_String( BDF_Err_Unknown_File_Format ) ) == 0; + * ``` + */ + FT_EXPORT( const char* ) + FT_Error_String( FT_Error error_code ); + + /* */ + +FT_END_HEADER + + +#endif /* FT_ERR_PROTOS_DEFINED */ + +#endif /* FT_INCLUDE_ERR_PROTOS */ + +#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftfntfmt.h b/external/freetype/include/freetype/ftfntfmt.h new file mode 100644 index 000000000..c0018fc83 --- /dev/null +++ b/external/freetype/include/freetype/ftfntfmt.h @@ -0,0 +1,93 @@ +/**************************************************************************** + * + * ftfntfmt.h + * + * Support functions for font formats. + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTFNTFMT_H_ +#define FTFNTFMT_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * font_formats + * + * @title: + * Font Formats + * + * @abstract: + * Getting the font format. + * + * @description: + * The single function in this section can be used to get the font format. + * Note that this information is not needed normally; however, there are + * special cases (like in PDF devices) where it is important to + * differentiate, in spite of FreeType's uniform API. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_Font_Format + * + * @description: + * Return a string describing the format of a given face. Possible values + * are 'TrueType', 'Type~1', 'BDF', 'PCF', 'Type~42', 'CID~Type~1', 'CFF', + * 'PFR', and 'Windows~FNT'. + * + * The return value is suitable to be used as an X11 FONT_PROPERTY. + * + * @input: + * face :: + * Input face handle. + * + * @return: + * Font format string. `NULL` in case of error. + * + * @note: + * A deprecated name for the same function is `FT_Get_X11_Font_Format`. + */ + FT_EXPORT( const char* ) + FT_Get_Font_Format( FT_Face face ); + + + /* deprecated */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTFNTFMT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftgasp.h b/external/freetype/include/freetype/ftgasp.h new file mode 100644 index 000000000..d5f19add8 --- /dev/null +++ b/external/freetype/include/freetype/ftgasp.h @@ -0,0 +1,143 @@ +/**************************************************************************** + * + * ftgasp.h + * + * Access of TrueType's 'gasp' table (specification). + * + * Copyright (C) 2007-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGASP_H_ +#define FTGASP_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType 'gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its 'gasp' table, if any. This is mainly + * useful when implementing native TrueType hinting with the bytecode + * interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************** + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This **really** means TrueType bytecode interpretation. If this bit + * is not set, no hinting gets applied. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * If not set, do monochrome rendering. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * If set, smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * The bit-flags `FT_GASP_DO_GRIDFIT` and `FT_GASP_DO_GRAY` are to be + * used for standard font rasterization only. Independently of that, + * `FT_GASP_SYMMETRIC_SMOOTHING` and `FT_GASP_SYMMETRIC_GRIDFIT` are to + * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT` and + * `FT_GASP_DO_GRAY` are consequently ignored). + * + * 'ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x04 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 + + + /************************************************************************** + * + * @function: + * FT_Get_Gasp + * + * @description: + * For a TrueType or OpenType font file, return the rasterizer behaviour + * flags from the font's 'gasp' table corresponding to a given character + * pixel size. + * + * @input: + * face :: + * The source face handle. + * + * ppem :: + * The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * 'gasp' table in the face. + * + * @note: + * If you want to use the MM functionality of OpenType variation fonts + * (i.e., using @FT_Set_Var_Design_Coordinates and friends), call this + * function **after** setting an instance since the return values can + * change. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGASP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftglyph.h b/external/freetype/include/freetype/ftglyph.h new file mode 100644 index 000000000..4658895f7 --- /dev/null +++ b/external/freetype/include/freetype/ftglyph.h @@ -0,0 +1,750 @@ +/**************************************************************************** + * + * ftglyph.h + * + * FreeType convenience functions to handle glyphs (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file contains the definition of several convenience functions that + * can be used by client applications to easily retrieve glyph bitmaps and + * outlines from a given face. + * + * These functions should be optional if you are writing a font server or + * text layout engine on top of FreeType. However, they are pretty handy + * for many other simple uses of the library. + * + */ + + +#ifndef FTGLYPH_H_ +#define FTGLYPH_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_management + * + * @title: + * Glyph Management + * + * @abstract: + * Generic interface to manage individual glyph data. + * + * @description: + * This section contains definitions used to manage glyph data through + * generic @FT_Glyph objects. Each of them can contain a bitmap, + * a vector outline, or even images in other formats. These objects are + * detached from @FT_Face, contrary to @FT_GlyphSlot. + * + */ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /************************************************************************** + * + * @type: + * FT_Glyph + * + * @description: + * Handle to an object used to model generic glyph images. It is a + * pointer to the @FT_GlyphRec structure and can contain a glyph bitmap + * or pointer. + * + * @note: + * Glyph objects are not owned by the library. You must thus release + * them manually (through @FT_Done_Glyph) _before_ calling + * @FT_Done_FreeType. + */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /************************************************************************** + * + * @struct: + * FT_GlyphRec + * + * @description: + * The root glyph structure contains a given glyph image plus its advance + * width in 16.16 fixed-point format. + * + * @fields: + * library :: + * A handle to the FreeType library object. + * + * clazz :: + * A pointer to the glyph's class. Private. + * + * format :: + * The format of the glyph's image. + * + * advance :: + * A 16.16 vector that gives the glyph's advance width. + */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /************************************************************************** + * + * @type: + * FT_BitmapGlyph + * + * @description: + * A handle to an object used to model a bitmap glyph image. This is a + * 'sub-class' of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. + */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /************************************************************************** + * + * @struct: + * FT_BitmapGlyphRec + * + * @description: + * A structure used for bitmap glyph images. This really is a + * 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root fields of @FT_Glyph. + * + * left :: + * The left-side bearing, i.e., the horizontal distance from the + * current pen position to the left border of the glyph bitmap. + * + * top :: + * The top-side bearing, i.e., the vertical distance from the current + * pen position to the top border of the glyph bitmap. This distance + * is positive for upwards~y! + * + * bitmap :: + * A descriptor for the bitmap. + * + * @note: + * You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_BITMAP`. This lets you access the + * bitmap's contents easily. + * + * The corresponding pixel buffer is always owned by @FT_BitmapGlyph and + * is thus created and destroyed with it. + */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /************************************************************************** + * + * @type: + * FT_OutlineGlyph + * + * @description: + * A handle to an object used to model an outline glyph image. This is a + * 'sub-class' of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. + */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /************************************************************************** + * + * @struct: + * FT_OutlineGlyphRec + * + * @description: + * A structure used for outline (vectorial) glyph images. This really is + * a 'sub-class' of @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_Glyph fields. + * + * outline :: + * A descriptor for the outline. + * + * @note: + * You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have + * `glyph->format == FT_GLYPH_FORMAT_OUTLINE`. This lets you access the + * outline's content easily. + * + * As the outline is extracted from a glyph slot, its coordinates are + * expressed normally in 26.6 pixels, unless the flag @FT_LOAD_NO_SCALE + * was used in @FT_Load_Glyph or @FT_Load_Char. + * + * The outline's tables are always owned by the object and are destroyed + * with it. + */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /************************************************************************** + * + * @type: + * FT_SvgGlyph + * + * @description: + * A handle to an object used to model an SVG glyph. This is a + * 'sub-class' of @FT_Glyph, and a pointer to @FT_SvgGlyphRec. + * + * @since: + * 2.12 + */ + typedef struct FT_SvgGlyphRec_* FT_SvgGlyph; + + + /************************************************************************** + * + * @struct: + * FT_SvgGlyphRec + * + * @description: + * A structure used for OT-SVG glyphs. This is a 'sub-class' of + * @FT_GlyphRec. + * + * @fields: + * root :: + * The root @FT_GlyphRec fields. + * + * svg_document :: + * A pointer to the SVG document. + * + * svg_document_length :: + * The length of `svg_document`. + * + * glyph_index :: + * The index of the glyph to be rendered. + * + * metrics :: + * A metrics object storing the size information. + * + * units_per_EM :: + * The size of the EM square. + * + * start_glyph_id :: + * The first glyph ID in the glyph range covered by this document. + * + * end_glyph_id :: + * The last glyph ID in the glyph range covered by this document. + * + * transform :: + * A 2x2 transformation matrix to apply to the glyph while rendering + * it. + * + * delta :: + * Translation to apply to the glyph while rendering. + * + * @note: + * The Glyph Management API requires @FT_Glyph or its 'sub-class' to have + * all the information needed to completely define the glyph's rendering. + * Outline-based glyphs can directly apply transformations to the outline + * but this is not possible for an SVG document that hasn't been parsed. + * Therefore, the transformation is stored along with the document. In + * the absence of a 'ViewBox' or 'Width'/'Height' attribute, the size of + * the ViewPort should be assumed to be 'units_per_EM'. + */ + typedef struct FT_SvgGlyphRec_ + { + FT_GlyphRec root; + + FT_Byte* svg_document; + FT_ULong svg_document_length; + + FT_UInt glyph_index; + + FT_Size_Metrics metrics; + FT_UShort units_per_EM; + + FT_UShort start_glyph_id; + FT_UShort end_glyph_id; + + FT_Matrix transform; + FT_Vector delta; + + } FT_SvgGlyphRec; + + + /************************************************************************** + * + * @function: + * FT_New_Glyph + * + * @description: + * A function used to create a new empty glyph image. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * library :: + * A handle to the FreeType library object. + * + * format :: + * The format of the glyph's image. + * + * @output: + * aglyph :: + * A handle to the glyph object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_New_Glyph( FT_Library library, + FT_Glyph_Format format, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Get_Glyph + * + * @description: + * A function used to extract a glyph image from a slot. Note that the + * created @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * slot :: + * A handle to the source glyph slot. + * + * @output: + * aglyph :: + * A handle to the glyph object. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Because `*aglyph->advance.x` and `*aglyph->advance.y` are 16.16 + * fixed-point numbers, `slot->advance.x` and `slot->advance.y` (which + * are in 26.6 fixed-point format) must be in the range ]-32768;32768[. + */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Copy + * + * @description: + * A function used to copy a glyph image. Note that the created + * @FT_Glyph object must be released with @FT_Done_Glyph. + * + * @input: + * source :: + * A handle to the source glyph object. + * + * @output: + * target :: + * A handle to the target glyph object. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Transform + * + * @description: + * Transform a glyph image if its format is scalable. + * + * @inout: + * glyph :: + * A handle to the target glyph object. + * + * @input: + * matrix :: + * A pointer to a 2x2 matrix to apply. + * + * delta :: + * A pointer to a 2d vector to apply. Coordinates are expressed in + * 1/64 of a pixel. + * + * @return: + * FreeType error code (if not 0, the glyph format is not scalable). + * + * @note: + * The 2x2 transformation matrix is also applied to the glyph's advance + * vector. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + /************************************************************************** + * + * @enum: + * FT_Glyph_BBox_Mode + * + * @description: + * The mode how the values of @FT_Glyph_Get_CBox are returned. + * + * @values: + * FT_GLYPH_BBOX_UNSCALED :: + * Return unscaled font units. + * + * FT_GLYPH_BBOX_SUBPIXELS :: + * Return unfitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_GRIDFIT :: + * Return grid-fitted 26.6 coordinates. + * + * FT_GLYPH_BBOX_TRUNCATE :: + * Return coordinates in integer pixels. + * + * FT_GLYPH_BBOX_PIXELS :: + * Return grid-fitted pixel coordinates. + */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_BBox_Mode` values instead */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /************************************************************************** + * + * @function: + * FT_Glyph_Get_CBox + * + * @description: + * Return a glyph's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * glyph :: + * A handle to the source glyph object. + * + * mode :: + * The mode that indicates how to interpret the returned bounding box + * values. + * + * @output: + * acbox :: + * The glyph coordinate bounding box. Coordinates are expressed in + * 1/64 of pixels if it is grid-fitted. + * + * @note: + * Coordinates are relative to the glyph origin, using the y~upwards + * convention. + * + * If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode` must + * be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font units in 26.6 + * pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS is another name for + * this constant. + * + * If the font is tricky and the glyph has been loaded with + * @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get + * reasonable values for the CBox it is necessary to load the glyph at a + * large ppem value (so that the hinting instructions can properly shift + * and scale the subglyphs), then extracting the CBox, which can be + * eventually converted back to font units. + * + * Note that the maximum coordinates are exclusive, which means that one + * can compute the width and height of the glyph image (be it in integer + * or 26.6 pixels) as: + * + * ``` + * width = bbox.xMax - bbox.xMin; + * height = bbox.yMax - bbox.yMin; + * ``` + * + * Note also that for 26.6 coordinates, if `bbox_mode` is set to + * @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, + * which corresponds to: + * + * ``` + * bbox.xMin = FLOOR(bbox.xMin); + * bbox.yMin = FLOOR(bbox.yMin); + * bbox.xMax = CEILING(bbox.xMax); + * bbox.yMax = CEILING(bbox.yMax); + * ``` + * + * To get the bbox in pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_TRUNCATE. + * + * To get the bbox in grid-fitted pixel coordinates, set `bbox_mode` to + * @FT_GLYPH_BBOX_PIXELS. + */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_To_Bitmap + * + * @description: + * Convert a given glyph object to a bitmap glyph object. + * + * @inout: + * the_glyph :: + * A pointer to a handle to the target glyph. + * + * @input: + * render_mode :: + * An enumeration that describes how the data is rendered. + * + * origin :: + * A pointer to a vector used to translate the glyph image before + * rendering. Can be~0 (if no translation). The origin is expressed + * in 26.6 pixels. + * + * destroy :: + * A boolean that indicates that the original glyph image should be + * destroyed by this function. It is never destroyed in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does nothing if the glyph format isn't scalable. + * + * The glyph image is translated with the `origin` vector before + * rendering. + * + * The first parameter is a pointer to an @FT_Glyph handle that will be + * _replaced_ by this function (with newly allocated data). Typically, + * you would do something like the following (omitting error handling). + * + * ``` + * FT_Glyph glyph; + * FT_BitmapGlyph glyph_bitmap; + * + * + * // load glyph + * error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); + * + * // extract glyph image + * error = FT_Get_Glyph( face->glyph, &glyph ); + * + * // convert to a bitmap (default render mode + destroying old) + * if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) + * { + * error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, + * 0, 1 ); + * if ( error ) // `glyph' unchanged + * ... + * } + * + * // access bitmap content by typecasting + * glyph_bitmap = (FT_BitmapGlyph)glyph; + * + * // do funny stuff with it, like blitting/drawing + * ... + * + * // discard glyph image (bitmap or not) + * FT_Done_Glyph( glyph ); + * ``` + * + * Here is another example, again without error handling. + * + * ``` + * FT_Glyph glyphs[MAX_GLYPHS] + * + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || + * FT_Get_Glyph ( face->glyph, &glyphs[idx] ); + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * { + * FT_Glyph bitmap = glyphs[idx]; + * + * + * ... + * + * // after this call, `bitmap' no longer points into + * // the `glyphs' array (and the old value isn't destroyed) + * FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); + * + * ... + * + * FT_Done_Glyph( bitmap ); + * } + * + * ... + * + * for ( idx = 0; i < MAX_GLYPHS; i++ ) + * FT_Done_Glyph( glyphs[idx] ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + const FT_Vector* origin, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Done_Glyph + * + * @description: + * Destroy a given glyph. + * + * @input: + * glyph :: + * A handle to the target glyph object. Can be `NULL`. + */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @function: + * FT_Matrix_Multiply + * + * @description: + * Perform the matrix operation `b = a*b`. + * + * @input: + * a :: + * A pointer to matrix `a`. + * + * @inout: + * b :: + * A pointer to matrix `b`. + * + * @note: + * The result is undefined if either `a` or `b` is zero. + * + * Since the function uses wrap-around arithmetic, results become + * meaningless if the arguments are very large. + */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /************************************************************************** + * + * @function: + * FT_Matrix_Invert + * + * @description: + * Invert a 2x2 matrix. Return an error if it can't be inverted. + * + * @inout: + * matrix :: + * A pointer to the target matrix. Remains untouched in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGLYPH_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/include/freetype/ftgxval.h b/external/freetype/include/freetype/ftgxval.h new file mode 100644 index 000000000..e8de9a6ed --- /dev/null +++ b/external/freetype/include/freetype/ftgxval.h @@ -0,0 +1,354 @@ +/**************************************************************************** + * + * ftgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2023 by + * Masatake YAMATO, Redhat K.K, + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef FTGXVAL_H_ +#define FTGXVAL_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * gx_validation + * + * @title: + * TrueTypeGX/AAT Validation + * + * @abstract: + * An API to validate TrueTypeGX/AAT tables. + * + * @description: + * This section contains the declaration of functions to validate some + * TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, trak, + * prop, lcar). + * + * @order: + * FT_TrueTypeGX_Validate + * FT_TrueTypeGX_Free + * + * FT_ClassicKern_Validate + * FT_ClassicKern_Free + * + * FT_VALIDATE_GX_LENGTH + * FT_VALIDATE_GXXXX + * FT_VALIDATE_CKERNXXX + * + */ + + /************************************************************************** + * + * + * Warning: Use `FT_VALIDATE_XXX` to validate a table. + * Following definitions are for gxvalid developers. + * + * + */ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************** + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length` argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH ( FT_VALIDATE_GX_LAST_INDEX + 1 ) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate 'feat' table. + * + * FT_VALIDATE_mort :: + * Validate 'mort' table. + * + * FT_VALIDATE_morx :: + * Validate 'morx' table. + * + * FT_VALIDATE_bsln :: + * Validate 'bsln' table. + * + * FT_VALIDATE_just :: + * Validate 'just' table. + * + * FT_VALIDATE_kern :: + * Validate 'kern' table. + * + * FT_VALIDATE_opbd :: + * Validate 'opbd' table. + * + * FT_VALIDATE_trak :: + * Validate 'trak' table. + * + * FT_VALIDATE_prop :: + * Validate 'prop' table. + * + * FT_VALIDATE_lcar :: + * Validate 'lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables` array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. The array + * itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables` element, by calling @FT_TrueTypeGX_Free. A `NULL` value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /************************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate to + * indicate the classic kern dialect or dialects. If the selected type + * doesn't fit, @FT_ClassicKern_Validate regards the table as invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the 'kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the 'kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the 'kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the + * offsets and indices are valid. The idea is that a higher-level + * library that actually does the text layout can access those tables + * without error checking (which can be quite time consuming). + * + * The 'kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table`, by calling @FT_ClassicKern_Free. A `NULL` value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /************************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGXVAL_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftgzip.h b/external/freetype/include/freetype/ftgzip.h new file mode 100644 index 000000000..443ec29db --- /dev/null +++ b/external/freetype/include/freetype/ftgzip.h @@ -0,0 +1,151 @@ +/**************************************************************************** + * + * ftgzip.h + * + * Gzip-compressed stream support. + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGZIP_H_ +#define FTGZIP_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * gzip + * + * @title: + * GZIP Streams + * + * @abstract: + * Using gzip-compressed font files. + * + * @description: + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from it + * and re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * + * This section contains the declaration of Gzip-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is mainly + * used to support the compressed `*.pcf.gz` fonts that come with + * XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + + /************************************************************************** + * + * @function: + * FT_Gzip_Uncompress + * + * @description: + * Decompress a zipped input buffer into an output buffer. This function + * is modeled after zlib's `uncompress` function. + * + * @input: + * memory :: + * A FreeType memory handle. + * + * input :: + * The input buffer. + * + * input_len :: + * The length of the input buffer. + * + * @output: + * output :: + * The output buffer. + * + * @inout: + * output_len :: + * Before calling the function, this is the total size of the output + * buffer, which must be large enough to hold the entire uncompressed + * data (so the size of the uncompressed data must be known in + * advance). After calling the function, `output_len` is the size of + * the used data in `output`. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with zlib support. + * + * @since: + * 2.5.1 + */ + FT_EXPORT( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ); + + /* */ + + +FT_END_HEADER + +#endif /* FTGZIP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftimage.h b/external/freetype/include/freetype/ftimage.h new file mode 100644 index 000000000..6baa81256 --- /dev/null +++ b/external/freetype/include/freetype/ftimage.h @@ -0,0 +1,1284 @@ +/**************************************************************************** + * + * ftimage.h + * + * FreeType glyph image formats and default raster interface + * (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Note: A 'raster' is simply a scan-line converter, used to render + * `FT_Outline`s into `FT_Bitmap`s. + * + */ + + +#ifndef FTIMAGE_H_ +#define FTIMAGE_H_ + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @type: + * FT_Pos + * + * @description: + * The type FT_Pos is used to store vectorial coordinates. Depending on + * the context, these can represent distances in integer font units, or + * 16.16, or 26.6 fixed-point pixel coordinates. + */ + typedef signed long FT_Pos; + + + /************************************************************************** + * + * @struct: + * FT_Vector + * + * @description: + * A simple structure used to store a 2D vector; coordinates are of the + * FT_Pos type. + * + * @fields: + * x :: + * The horizontal coordinate. + * y :: + * The vertical coordinate. + */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /************************************************************************** + * + * @struct: + * FT_BBox + * + * @description: + * A structure used to hold an outline's bounding box, i.e., the + * coordinates of its extrema in the horizontal and vertical directions. + * + * @fields: + * xMin :: + * The horizontal minimum (left-most). + * + * yMin :: + * The vertical minimum (bottom-most). + * + * xMax :: + * The horizontal maximum (right-most). + * + * yMax :: + * The vertical maximum (top-most). + * + * @note: + * The bounding box is specified with the coordinates of the lower left + * and the upper right corner. In PostScript, those values are often + * called (llx,lly) and (urx,ury), respectively. + * + * If `yMin` is negative, this value gives the glyph's descender. + * Otherwise, the glyph doesn't descend below the baseline. Similarly, + * if `ymax` is positive, this value gives the glyph's ascender. + * + * `xMin` gives the horizontal distance from the glyph's origin to the + * left edge of the glyph's bounding box. If `xMin` is negative, the + * glyph extends to the left of the origin. + */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /************************************************************************** + * + * @enum: + * FT_Pixel_Mode + * + * @description: + * An enumeration type used to describe the format of pixels in a given + * bitmap. Note that additional formats may be added in the future. + * + * @values: + * FT_PIXEL_MODE_NONE :: + * Value~0 is reserved. + * + * FT_PIXEL_MODE_MONO :: + * A monochrome bitmap, using 1~bit per pixel. Note that pixels are + * stored in most-significant order (MSB), which means that the + * left-most pixel in a byte has value 128. + * + * FT_PIXEL_MODE_GRAY :: + * An 8-bit bitmap, generally used to represent anti-aliased glyph + * images. Each pixel is stored in one byte. Note that the number of + * 'gray' levels is stored in the `num_grays` field of the @FT_Bitmap + * structure (it generally is 256). + * + * FT_PIXEL_MODE_GRAY2 :: + * A 2-bit per pixel bitmap, used to represent embedded anti-aliased + * bitmaps in font files according to the OpenType specification. We + * haven't found a single font using this format, however. + * + * FT_PIXEL_MODE_GRAY4 :: + * A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps + * in font files according to the OpenType specification. We haven't + * found a single font using this format, however. + * + * FT_PIXEL_MODE_LCD :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on LCD displays; the bitmap is three times wider than + * the original glyph image. See also @FT_RENDER_MODE_LCD. + * + * FT_PIXEL_MODE_LCD_V :: + * An 8-bit bitmap, representing RGB or BGR decimated glyph images used + * for display on rotated LCD displays; the bitmap is three times + * taller than the original glyph image. See also + * @FT_RENDER_MODE_LCD_V. + * + * FT_PIXEL_MODE_BGRA :: + * [Since 2.5] An image with four 8-bit channels per pixel, + * representing a color image (such as emoticons) with alpha channel. + * For each pixel, the format is BGRA, which means, the blue channel + * comes first in memory. The color channels are pre-multiplied and in + * the sRGB colorspace. For example, full red at half-translucent + * opacity will be represented as '00,00,80,80', not '00,00,FF,80'. + * See also @FT_LOAD_COLOR. + */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + FT_PIXEL_MODE_BGRA, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /* these constants are deprecated; use the corresponding `FT_Pixel_Mode` */ + /* values instead. */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + + /* For debugging, the @FT_Pixel_Mode enumeration must stay in sync */ + /* with the `pixel_modes` array in file `ftobjs.c`. */ + + + /************************************************************************** + * + * @struct: + * FT_Bitmap + * + * @description: + * A structure used to describe a bitmap or pixmap to the raster. Note + * that we now manage pixmaps of various depths through the `pixel_mode` + * field. + * + * @fields: + * rows :: + * The number of bitmap rows. + * + * width :: + * The number of pixels in bitmap row. + * + * pitch :: + * The pitch's absolute value is the number of bytes taken by one + * bitmap row, including padding. However, the pitch is positive when + * the bitmap has a 'down' flow, and negative when it has an 'up' flow. + * In all cases, the pitch is an offset to add to a bitmap pointer in + * order to go down one row. + * + * Note that 'padding' means the alignment of a bitmap to a byte + * border, and FreeType functions normally align to the smallest + * possible integer value. + * + * For the B/W rasterizer, `pitch` is always an even number. + * + * To change the pitch of a bitmap (say, to make it a multiple of 4), + * use @FT_Bitmap_Convert. Alternatively, you might use callback + * functions to directly render to the application's surface; see the + * file `example2.cpp` in the tutorial for a demonstration. + * + * buffer :: + * A typeless pointer to the bitmap buffer. This value should be + * aligned on 32-bit boundaries in most cases. + * + * num_grays :: + * This field is only used with @FT_PIXEL_MODE_GRAY; it gives the + * number of gray levels used in the bitmap. + * + * pixel_mode :: + * The pixel mode, i.e., how pixel bits are stored. See @FT_Pixel_Mode + * for possible values. + * + * palette_mode :: + * This field is intended for paletted pixel modes; it indicates how + * the palette is stored. Not used currently. + * + * palette :: + * A typeless pointer to the bitmap palette; this field is intended for + * paletted pixel modes. Not used currently. + * + * @note: + * `width` and `rows` refer to the *physical* size of the bitmap, not the + * *logical* one. For example, if @FT_Pixel_Mode is set to + * `FT_PIXEL_MODE_LCD`, the logical width is a just a third of the + * physical one. + */ + typedef struct FT_Bitmap_ + { + unsigned int rows; + unsigned int width; + int pitch; + unsigned char* buffer; + unsigned short num_grays; + unsigned char pixel_mode; + unsigned char palette_mode; + void* palette; + + } FT_Bitmap; + + + /************************************************************************** + * + * @section: + * outline_processing + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Outline + * + * @description: + * This structure is used to describe an outline to the scan-line + * converter. + * + * @fields: + * n_contours :: + * The number of contours in the outline. + * + * n_points :: + * The number of points in the outline. + * + * points :: + * A pointer to an array of `n_points` @FT_Vector elements, giving the + * outline's point coordinates. + * + * tags :: + * A pointer to an array of `n_points` chars, giving each outline + * point's type. + * + * If bit~0 is unset, the point is 'off' the curve, i.e., a Bezier + * control point, while it is 'on' if set. + * + * Bit~1 is meaningful for 'off' points only. If set, it indicates a + * third-order Bezier arc control point; and a second-order control + * point if unset. + * + * If bit~2 is set, bits 5-7 contain the drop-out mode (as defined in + * the OpenType specification; the value is the same as the argument to + * the 'SCANMODE' instruction). + * + * Bits 3 and~4 are reserved for internal purposes. + * + * contours :: + * An array of `n_contours` shorts, giving the end point of each + * contour within the outline. For example, the first contour is + * defined by the points '0' to `contours[0]`, the second one is + * defined by the points `contours[0]+1` to `contours[1]`, etc. + * + * flags :: + * A set of bit flags used to characterize the outline and give hints + * to the scan-converter and hinter on how to convert/grid-fit it. See + * @FT_OUTLINE_XXX. + * + * @note: + * The B/W rasterizer only checks bit~2 in the `tags` array for the first + * point of each contour. The drop-out mode as given with + * @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS in `flags` is then overridden. + */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* */ + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /************************************************************************** + * + * @enum: + * FT_OUTLINE_XXX + * + * @description: + * A list of bit-field constants used for the flags in an outline's + * `flags` field. + * + * @values: + * FT_OUTLINE_NONE :: + * Value~0 is reserved. + * + * FT_OUTLINE_OWNER :: + * If set, this flag indicates that the outline's field arrays (i.e., + * `points`, `flags`, and `contours`) are 'owned' by the outline + * object, and should thus be freed when it is destroyed. + * + * FT_OUTLINE_EVEN_ODD_FILL :: + * By default, outlines are filled using the non-zero winding rule. If + * set to 1, the outline will be filled using the even-odd fill rule + * (only works with the smooth rasterizer). + * + * FT_OUTLINE_REVERSE_FILL :: + * By default, outside contours of an outline are oriented in + * clock-wise direction, as defined in the TrueType specification. + * This flag is set if the outline uses the opposite direction + * (typically for Type~1 fonts). This flag is ignored by the scan + * converter. + * + * FT_OUTLINE_IGNORE_DROPOUTS :: + * By default, the scan converter will try to detect drop-outs in an + * outline and correct the glyph bitmap to ensure consistent shape + * continuity. If set, this flag hints the scan-line converter to + * ignore such cases. See below for more information. + * + * FT_OUTLINE_SMART_DROPOUTS :: + * Select smart dropout control. If unset, use simple dropout control. + * Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_INCLUDE_STUBS :: + * If set, turn pixels on for 'stubs', otherwise exclude them. Ignored + * if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for more + * information. + * + * FT_OUTLINE_OVERLAP :: + * [Since 2.10.3] This flag indicates that this outline contains + * overlapping contours and the anti-aliased renderer should perform + * oversampling to mitigate possible artifacts. This flag should _not_ + * be set for well designed glyphs without overlaps because it quadruples + * the rendering time. + * + * FT_OUTLINE_HIGH_PRECISION :: + * This flag indicates that the scan-line converter should try to + * convert this outline to bitmaps with the highest possible quality. + * It is typically set for small character sizes. Note that this is + * only a hint that might be completely ignored by a given + * scan-converter. + * + * FT_OUTLINE_SINGLE_PASS :: + * This flag is set to force a given scan-converter to only use a + * single pass over the outline to render a bitmap glyph image. + * Normally, it is set for very large character sizes. It is only a + * hint that might be completely ignored by a given scan-converter. + * + * @note: + * The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and + * @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth rasterizer. + * + * There exists a second mechanism to pass the drop-out mode to the B/W + * rasterizer; see the `tags` field in @FT_Outline. + * + * Please refer to the description of the 'SCANTYPE' instruction in the + * OpenType specification (in file `ttinst1.doc`) how simple drop-outs, + * smart drop-outs, and stubs are defined. + */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 +#define FT_OUTLINE_OVERLAP 0x40 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /* these constants are deprecated; use the corresponding */ + /* `FT_OUTLINE_XXX` values instead */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 0x03 ) + + /* see the `tags` field in `FT_Outline` for a description of the values */ +#define FT_CURVE_TAG_ON 0x01 +#define FT_CURVE_TAG_CONIC 0x00 +#define FT_CURVE_TAG_CUBIC 0x02 + +#define FT_CURVE_TAG_HAS_SCANMODE 0x04 + +#define FT_CURVE_TAG_TOUCH_X 0x08 /* reserved for TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 0x10 /* reserved for TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + /* values 0x20, 0x40, and 0x80 are reserved */ + + + /* these constants are deprecated; use the corresponding */ + /* `FT_CURVE_TAG_XXX` values instead */ +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /************************************************************************** + * + * @functype: + * FT_Outline_MoveToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'move to' + * function during outline walking/decomposition. + * + * A 'move to' is emitted to start a new contour in an outline. + * + * @input: + * to :: + * A pointer to the target point of the 'move to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_LineToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'line to' + * function during outline walking/decomposition. + * + * A 'line to' is emitted to indicate a segment in the outline. + * + * @input: + * to :: + * A pointer to the target point of the 'line to'. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_ConicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'conic to' + * function during outline walking or decomposition. + * + * A 'conic to' is emitted to indicate a second-order Bezier arc in the + * outline. + * + * @input: + * control :: + * An intermediate control point between the last position and the new + * target in `to`. + * + * to :: + * A pointer to the target end point of the conic arc. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /************************************************************************** + * + * @functype: + * FT_Outline_CubicToFunc + * + * @description: + * A function pointer type used to describe the signature of a 'cubic to' + * function during outline walking or decomposition. + * + * A 'cubic to' is emitted to indicate a third-order Bezier arc. + * + * @input: + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to the second Bezier control point. + * + * to :: + * A pointer to the target end point. + * + * user :: + * A typeless pointer, which is passed from the caller of the + * decomposition function. + * + * @return: + * Error code. 0~means success. + */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /************************************************************************** + * + * @struct: + * FT_Outline_Funcs + * + * @description: + * A structure to hold various function pointers used during outline + * decomposition in order to emit segments, conic, and cubic Beziers. + * + * @fields: + * move_to :: + * The 'move to' emitter. + * + * line_to :: + * The segment emitter. + * + * conic_to :: + * The second-order Bezier arc emitter. + * + * cubic_to :: + * The third-order Bezier arc emitter. + * + * shift :: + * The shift that is applied to coordinates before they are sent to the + * emitter. + * + * delta :: + * The delta that is applied to coordinates before they are sent to the + * emitter, but after the shift. + * + * @note: + * The point coordinates sent to the emitters are the transformed version + * of the original coordinates (this is important for high accuracy + * during scan-conversion). The transformation is simple: + * + * ``` + * x' = (x << shift) - delta + * y' = (y << shift) - delta + * ``` + * + * Set the values of `shift` and `delta` to~0 to get the original point + * coordinates. + */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /************************************************************************** + * + * @section: + * basic_types + * + */ + + + /************************************************************************** + * + * @macro: + * FT_IMAGE_TAG + * + * @description: + * This macro converts four-letter tags to an unsigned long type. + * + * @note: + * Since many 16-bit compilers don't like 32-bit enumerations, you should + * redefine this macro in case of problems to something like this: + * + * ``` + * #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value + * ``` + * + * to get a simple enumeration without assigning special numbers. + */ +#ifndef FT_IMAGE_TAG + +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( FT_STATIC_BYTE_CAST( unsigned long, _x1 ) << 24 ) | \ + ( FT_STATIC_BYTE_CAST( unsigned long, _x2 ) << 16 ) | \ + ( FT_STATIC_BYTE_CAST( unsigned long, _x3 ) << 8 ) | \ + FT_STATIC_BYTE_CAST( unsigned long, _x4 ) ) + +#endif /* FT_IMAGE_TAG */ + + + /************************************************************************** + * + * @enum: + * FT_Glyph_Format + * + * @description: + * An enumeration type used to describe the format of a given glyph + * image. Note that this version of FreeType only supports two image + * formats, even though future font drivers will be able to register + * their own format. + * + * @values: + * FT_GLYPH_FORMAT_NONE :: + * The value~0 is reserved. + * + * FT_GLYPH_FORMAT_COMPOSITE :: + * The glyph image is a composite of several other images. This format + * is _only_ used with @FT_LOAD_NO_RECURSE, and is used to report + * compound glyphs (like accented characters). + * + * FT_GLYPH_FORMAT_BITMAP :: + * The glyph image is a bitmap, and can be described as an @FT_Bitmap. + * You generally need to access the `bitmap` field of the + * @FT_GlyphSlotRec structure to read it. + * + * FT_GLYPH_FORMAT_OUTLINE :: + * The glyph image is a vectorial outline made of line segments and + * Bezier arcs; it can be described as an @FT_Outline; you generally + * want to access the `outline` field of the @FT_GlyphSlotRec structure + * to read it. + * + * FT_GLYPH_FORMAT_PLOTTER :: + * The glyph image is a vectorial path with no inside and outside + * contours. Some Type~1 fonts, like those in the Hershey family, + * contain glyphs in this format. These are described as @FT_Outline, + * but FreeType isn't currently capable of rendering them correctly. + * + * FT_GLYPH_FORMAT_SVG :: + * [Since 2.12] The glyph is represented by an SVG document in the + * 'SVG~' table. + */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_SVG, 'S', 'V', 'G', ' ' ) + + } FT_Glyph_Format; + + + /* these constants are deprecated; use the corresponding */ + /* `FT_Glyph_Format` values instead. */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + + /************************************************************************** + * + * @section: + * raster + * + * @title: + * Scanline Converter + * + * @abstract: + * How vectorial outlines are converted into bitmaps and pixmaps. + * + * @description: + * A raster or a rasterizer is a scan converter in charge of producing a + * pixel coverage bitmap that can be used as an alpha channel when + * compositing a glyph with a background. FreeType comes with two + * rasterizers: bilevel `raster1` and anti-aliased `smooth` are two + * separate modules. They are usually called from the high-level + * @FT_Load_Glyph or @FT_Render_Glyph functions and produce the entire + * coverage bitmap at once, while staying largely invisible to users. + * + * Instead of working with complete coverage bitmaps, it is also possible + * to intercept consecutive pixel runs on the same scanline with the same + * coverage, called _spans_, and process them individually. Only the + * `smooth` rasterizer permits this when calling @FT_Outline_Render with + * @FT_Raster_Params as described below. + * + * Working with either complete bitmaps or spans it is important to think + * of them as colorless coverage objects suitable as alpha channels to + * blend arbitrary colors with a background. For best results, it is + * recommended to use gamma correction, too. + * + * This section also describes the public API needed to set up alternative + * @FT_Renderer modules. + * + * @order: + * FT_Span + * FT_SpanFunc + * FT_Raster_Params + * FT_RASTER_FLAG_XXX + * + * FT_Raster + * FT_Raster_NewFunc + * FT_Raster_DoneFunc + * FT_Raster_ResetFunc + * FT_Raster_SetModeFunc + * FT_Raster_RenderFunc + * FT_Raster_Funcs + * + */ + + + /************************************************************************** + * + * @struct: + * FT_Span + * + * @description: + * A structure to model a single span of consecutive pixels when + * rendering an anti-aliased bitmap. + * + * @fields: + * x :: + * The span's horizontal start position. + * + * len :: + * The span's length in pixels. + * + * coverage :: + * The span color/coverage, ranging from 0 (background) to 255 + * (foreground). + * + * @note: + * This structure is used by the span drawing callback type named + * @FT_SpanFunc that takes the y~coordinate of the span as a parameter. + * + * The anti-aliased rasterizer produces coverage values from 0 to 255, + * that is, from completely transparent to completely opaque. + */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /************************************************************************** + * + * @functype: + * FT_SpanFunc + * + * @description: + * A function used as a call-back by the anti-aliased renderer in order + * to let client applications draw themselves the pixel spans on each + * scan line. + * + * @input: + * y :: + * The scanline's upward y~coordinate. + * + * count :: + * The number of spans to draw on this scanline. + * + * spans :: + * A table of `count` spans to draw on the scanline. + * + * user :: + * User-supplied data that is passed to the callback. + * + * @note: + * This callback allows client applications to directly render the spans + * of the anti-aliased bitmap to any kind of surfaces. + * + * This can be used to write anti-aliased outlines directly to a given + * background bitmap using alpha compositing. It can also be used for + * oversampling and averaging. + */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitTest_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_Raster_BitSet_Func + * + * @description: + * Deprecated, unimplemented. + */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /************************************************************************** + * + * @enum: + * FT_RASTER_FLAG_XXX + * + * @description: + * A list of bit flag constants as used in the `flags` field of a + * @FT_Raster_Params structure. + * + * @values: + * FT_RASTER_FLAG_DEFAULT :: + * This value is 0. + * + * FT_RASTER_FLAG_AA :: + * This flag is set to indicate that an anti-aliased glyph image should + * be generated. Otherwise, it will be monochrome (1-bit). + * + * FT_RASTER_FLAG_DIRECT :: + * This flag is set to indicate direct rendering. In this mode, client + * applications must provide their own span callback. This lets them + * directly draw or compose over an existing bitmap. If this bit is + * _not_ set, the target pixmap's buffer _must_ be zeroed before + * rendering and the output will be clipped to its size. + * + * Direct rendering is only possible with anti-aliased glyphs. + * + * FT_RASTER_FLAG_CLIP :: + * This flag is only used in direct rendering mode. If set, the output + * will be clipped to a box specified in the `clip_box` field of the + * @FT_Raster_Params structure. Otherwise, the `clip_box` is + * effectively set to the bounding box and all spans are generated. + * + * FT_RASTER_FLAG_SDF :: + * This flag is set to indicate that a signed distance field glyph + * image should be generated. This is only used while rendering with + * the @FT_RENDER_MODE_SDF render mode. + */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 +#define FT_RASTER_FLAG_SDF 0x8 + + /* these constants are deprecated; use the corresponding */ + /* `FT_RASTER_FLAG_XXX` values instead */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /************************************************************************** + * + * @struct: + * FT_Raster_Params + * + * @description: + * A structure to hold the parameters used by a raster's render function, + * passed as an argument to @FT_Outline_Render. + * + * @fields: + * target :: + * The target bitmap. + * + * source :: + * A pointer to the source glyph image (e.g., an @FT_Outline). + * + * flags :: + * The rendering flags. + * + * gray_spans :: + * The gray span drawing callback. + * + * black_spans :: + * Unused. + * + * bit_test :: + * Unused. + * + * bit_set :: + * Unused. + * + * user :: + * User-supplied data that is passed to each drawing callback. + * + * clip_box :: + * An optional span clipping box expressed in _integer_ pixels + * (not in 26.6 fixed-point units). + * + * @note: + * The @FT_RASTER_FLAG_AA bit flag must be set in the `flags` to + * generate an anti-aliased glyph bitmap, otherwise a monochrome bitmap + * is generated. The `target` should have appropriate pixel mode and its + * dimensions define the clipping region. + * + * If both @FT_RASTER_FLAG_AA and @FT_RASTER_FLAG_DIRECT bit flags + * are set in `flags`, the raster calls an @FT_SpanFunc callback + * `gray_spans` with `user` data as an argument ignoring `target`. This + * allows direct composition over a pre-existing user surface to perform + * the span drawing and composition. To optionally clip the spans, set + * the @FT_RASTER_FLAG_CLIP flag and `clip_box`. The monochrome raster + * does not support the direct mode. + * + * The gray-level rasterizer always uses 256 gray levels. If you want + * fewer gray levels, you have to use @FT_RASTER_FLAG_DIRECT and reduce + * the levels in the callback function. + */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* unused */ + FT_Raster_BitTest_Func bit_test; /* unused */ + FT_Raster_BitSet_Func bit_set; /* unused */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /************************************************************************** + * + * @type: + * FT_Raster + * + * @description: + * An opaque handle (pointer) to a raster object. Each object can be + * used independently to convert an outline into a bitmap or pixmap. + * + * @note: + * In FreeType 2, all rasters are now encapsulated within specific + * @FT_Renderer modules and only used in their context. + * + */ + typedef struct FT_RasterRec_* FT_Raster; + + + /************************************************************************** + * + * @functype: + * FT_Raster_NewFunc + * + * @description: + * A function used to create a new raster object. + * + * @input: + * memory :: + * A handle to the memory allocator. + * + * @output: + * raster :: + * A handle to the new raster object. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The `memory` parameter is a typeless pointer in order to avoid + * un-wanted dependencies on the rest of the FreeType code. In practice, + * it is an @FT_Memory object, i.e., a handle to the standard FreeType + * memory allocator. However, this field can be completely ignored by a + * given raster implementation. + */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_DoneFunc + * + * @description: + * A function used to destroy a given raster object. + * + * @input: + * raster :: + * A handle to the raster object. + */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_ResetFunc + * + * @description: + * FreeType used to provide an area of memory called the 'render pool' + * available to all registered rasterizers. This was not thread safe, + * however, and now FreeType never allocates this pool. + * + * This function is called after a new raster object is created. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * pool_base :: + * Previously, the address in memory of the render pool. Set this to + * `NULL`. + * + * pool_size :: + * Previously, the size in bytes of the render pool. Set this to 0. + * + * @note: + * Rasterizers should rely on dynamic or stack allocation if they want to + * (a handle to the memory allocator is passed to the rasterizer + * constructor). + */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_SetModeFunc + * + * @description: + * This function is a generic facility to change modes or attributes in a + * given raster. This can be used for debugging purposes, or simply to + * allow implementation-specific 'features' in a given raster module. + * + * @input: + * raster :: + * A handle to the new raster object. + * + * mode :: + * A 4-byte tag used to name the mode or property. + * + * args :: + * A pointer to the new mode/property to use. + */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /************************************************************************** + * + * @functype: + * FT_Raster_RenderFunc + * + * @description: + * Invoke a given raster to scan-convert a given glyph image into a + * target bitmap. + * + * @input: + * raster :: + * A handle to the raster object. + * + * params :: + * A pointer to an @FT_Raster_Params structure used to store the + * rendering parameters. + * + * @return: + * Error code. 0~means success. + * + * @note: + * The exact format of the source image depends on the raster's glyph + * format defined in its @FT_Raster_Funcs structure. It can be an + * @FT_Outline or anything else in order to support a large array of + * glyph formats. + * + * Note also that the render function can fail and return a + * `FT_Err_Unimplemented_Feature` error code if the raster used does not + * support direct composition. + */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /************************************************************************** + * + * @struct: + * FT_Raster_Funcs + * + * @description: + * A structure used to describe a given raster class to the library. + * + * @fields: + * glyph_format :: + * The supported glyph format for this raster. + * + * raster_new :: + * The raster constructor. + * + * raster_reset :: + * Used to reset the render pool within the raster. + * + * raster_render :: + * A function to render a glyph into a given bitmap. + * + * raster_done :: + * The raster destructor. + */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + /* */ + + +FT_END_HEADER + +#endif /* FTIMAGE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/include/freetype/ftincrem.h b/external/freetype/include/freetype/ftincrem.h new file mode 100644 index 000000000..2d4f5def2 --- /dev/null +++ b/external/freetype/include/freetype/ftincrem.h @@ -0,0 +1,348 @@ +/**************************************************************************** + * + * ftincrem.h + * + * FreeType incremental loading (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTINCREM_H_ +#define FTINCREM_H_ + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * 'incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application. + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * 'incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript + * interpreters), where the glyph data isn't in the font file, or must be + * overridden by different values. + * + * @note: + * It is up to client applications to create and implement + * @FT_Incremental objects, as long as they provide implementations for + * the methods @FT_Incremental_GetGlyphDataFunc, + * @FT_Incremental_FreeGlyphDataFunc and + * @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned by + * the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical` argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the 'glyf' table. For PostScript formats, it must correspond to the + * **unencrypted** charstring bytes, without any `lenIV` header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release the + * data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This allows for handling font types such + * as PCL~XL Format~1, Class~2 downloaded TrueType fonts, where the glyph + * metrics (`hmtx` and `vmtx` tables) are permitted to be omitted from + * the font, and the relevant metrics included in the header of the glyph + * outline data. Importantly, this is not intended to allow custom glyph + * metrics (for example, Postscript Metrics dictionaries), because that + * conflicts with the requirements of outline hinting. Such custom + * metrics must be handled separately, by the calling application. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. The original + * glyph metrics, if any, in font units. If metrics are not available + * all the values must be set to zero. + * + * @output: + * ametrics :: + * The glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data incrementally. + * Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does not + * require it. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * ``` + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * ``` + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /* */ + + +FT_END_HEADER + +#endif /* FTINCREM_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftlcdfil.h b/external/freetype/include/freetype/ftlcdfil.h new file mode 100644 index 000000000..d3723e16f --- /dev/null +++ b/external/freetype/include/freetype/ftlcdfil.h @@ -0,0 +1,323 @@ +/**************************************************************************** + * + * ftlcdfil.h + * + * FreeType API for color filtering of subpixel bitmap glyphs + * (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLCDFIL_H_ +#define FTLCDFIL_H_ + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lcd_rendering + * + * @title: + * Subpixel Rendering + * + * @abstract: + * API to control subpixel rendering. + * + * @description: + * FreeType provides two alternative subpixel rendering technologies. + * Should you define `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` in your + * `ftoption.h` file, this enables ClearType-style rendering. + * Otherwise, Harmony LCD rendering is enabled. These technologies are + * controlled differently and API described below, although always + * available, performs its function when appropriate method is enabled + * and does nothing otherwise. + * + * ClearType-style LCD rendering exploits the color-striped structure of + * LCD pixels, increasing the available resolution in the direction of + * the stripe (usually horizontal RGB) by a factor of~3. Using the + * subpixel coverages unfiltered can create severe color fringes + * especially when rendering thin features. Indeed, to produce + * black-on-white text, the nearby color subpixels must be dimmed + * evenly. Therefore, an equalizing 5-tap FIR filter should be applied + * to subpixel coverages regardless of pixel boundaries and should have + * these properties: + * + * 1. It should be symmetrical, like {~a, b, c, b, a~}, to avoid + * any shifts in appearance. + * + * 2. It should be color-balanced, meaning a~+ b~=~c, to reduce color + * fringes by distributing the computed coverage for one subpixel to + * all subpixels equally. + * + * 3. It should be normalized, meaning 2a~+ 2b~+ c~=~1.0 to maintain + * overall brightness. + * + * Boxy 3-tap filter {0, 1/3, 1/3, 1/3, 0} is sharper but is less + * forgiving of non-ideal gamma curves of a screen (and viewing angles), + * beveled filters are fuzzier but more tolerant. + * + * Use the @FT_Library_SetLcdFilter or @FT_Library_SetLcdFilterWeights + * API to specify a low-pass filter, which is then applied to + * subpixel-rendered bitmaps generated through @FT_Render_Glyph. + * + * Harmony LCD rendering is suitable to panels with any regular subpixel + * structure, not just monitors with 3 color striped subpixels, as long + * as the color subpixels have fixed positions relative to the pixel + * center. In this case, each color channel can be rendered separately + * after shifting the outline opposite to the subpixel shift so that the + * coverage maps are aligned. This method is immune to color fringes + * because the shifts do not change integral coverage. + * + * The subpixel geometry must be specified by xy-coordinates for each + * subpixel. By convention they may come in the RGB order: {{-1/3, 0}, + * {0, 0}, {1/3, 0}} for standard RGB striped panel or {{-1/6, 1/4}, + * {-1/6, -1/4}, {1/3, 0}} for a certain PenTile panel. + * + * Use the @FT_Library_SetLcdGeometry API to specify subpixel positions. + * If one follows the RGB order convention, the same order applies to the + * resulting @FT_PIXEL_MODE_LCD and @FT_PIXEL_MODE_LCD_V bitmaps. Note, + * however, that the coordinate frame for the latter must be rotated + * clockwise. Harmony with default LCD geometry is equivalent to + * ClearType with light filter. + * + * As a result of ClearType filtering or Harmony shifts, the resulting + * dimensions of LCD bitmaps can be slightly wider or taller than the + * dimensions the original outline with regard to the pixel grid. + * For example, for @FT_RENDER_MODE_LCD, the filter adds 2~subpixels to + * the left, and 2~subpixels to the right. The bitmap offset values are + * adjusted accordingly, so clients shouldn't need to modify their layout + * and glyph positioning code when enabling the filter. + * + * The ClearType and Harmony rendering is applicable to glyph bitmaps + * rendered through @FT_Render_Glyph, @FT_Load_Glyph, @FT_Load_Char, and + * @FT_Glyph_To_Bitmap, when @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V + * is specified. This API does not control @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * The described algorithms can completely remove color artefacts when + * combined with gamma-corrected alpha blending in linear space. Each of + * the 3~alpha values (subpixels) must by independently used to blend one + * color channel. That is, red alpha blends the red channel of the text + * color with the red channel of the background pixel. + */ + + + /************************************************************************** + * + * @enum: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * This is a beveled, normalized, and color-balanced five-tap filter + * with weights of [0x08 0x4D 0x56 0x4D 0x08] in 1/256 units. + * + * FT_LCD_FILTER_LIGHT :: + * this is a boxy, normalized, and color-balanced three-tap filter with + * weights of [0x00 0x55 0x56 0x55 0x00] in 1/256 units. + * + * FT_LCD_FILTER_LEGACY :: + * FT_LCD_FILTER_LEGACY1 :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. The second value is + * provided for compatibility with FontConfig, which historically used + * different enumeration, sometimes incorrectly forwarded to FreeType. + * + * @since: + * 2.3.0 (`FT_LCD_FILTER_LEGACY1` since 2.6.2) + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY1 = 3, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to change filter applied to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work well + * on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Since 2.10.3 the LCD filtering is enabled with @FT_LCD_FILTER_DEFAULT. + * It is no longer necessary to call this function explicitly except + * to choose a different filter or disable filtering altogether with + * @FT_LCD_FILTER_NONE. + * + * This function does nothing but returns `FT_Err_Unimplemented_Feature` + * if the configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is + * not defined in your build of the library. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdFilterWeights + * + * @description: + * This function can be used to enable LCD filter with custom weights, + * instead of using presets in @FT_Library_SetLcdFilter. + * + * @input: + * library :: + * A handle to the target library instance. + * + * weights :: + * A pointer to an array; the function copies the first five bytes and + * uses them to specify the filter weights in 1/256 units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does nothing but returns `FT_Err_Unimplemented_Feature` + * if the configuration macro `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is + * not defined in your build of the library. + * + * LCD filter weights can also be set per face using @FT_Face_Properties + * with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS. + * + * @since: + * 2.4.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ); + + + /************************************************************************** + * + * @type: + * FT_LcdFiveTapFilter + * + * @description: + * A typedef for passing the five LCD filter weights to + * @FT_Face_Properties within an @FT_Parameter structure. + * + * @since: + * 2.8 + * + */ +#define FT_LCD_FILTER_FIVE_TAPS 5 + + typedef FT_Byte FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS]; + + + /************************************************************************** + * + * @function: + * FT_Library_SetLcdGeometry + * + * @description: + * This function can be used to modify default positions of color + * subpixels, which controls Harmony LCD rendering. + * + * @input: + * library :: + * A handle to the target library instance. + * + * sub :: + * A pointer to an array of 3 vectors in 26.6 fractional pixel format; + * the function modifies the default values, see the note below. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Subpixel geometry examples: + * + * - {{-21, 0}, {0, 0}, {21, 0}} is the default, corresponding to 3 color + * stripes shifted by a third of a pixel. This could be an RGB panel. + * + * - {{21, 0}, {0, 0}, {-21, 0}} looks the same as the default but can + * specify a BGR panel instead, while keeping the bitmap in the same + * RGB888 format. + * + * - {{0, 21}, {0, 0}, {0, -21}} is the vertical RGB, but the bitmap + * stays RGB888 as a result. + * + * - {{-11, 16}, {-11, -16}, {22, 0}} is a certain PenTile arrangement. + * + * This function does nothing and returns `FT_Err_Unimplemented_Feature` + * in the context of ClearType-style subpixel rendering when + * `FT_CONFIG_OPTION_SUBPIXEL_RENDERING` is defined in your build of the + * library. + * + * @since: + * 2.10.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdGeometry( FT_Library library, + FT_Vector sub[3] ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLCDFIL_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftlist.h b/external/freetype/include/freetype/ftlist.h new file mode 100644 index 000000000..b55313133 --- /dev/null +++ b/external/freetype/include/freetype/ftlist.h @@ -0,0 +1,296 @@ +/**************************************************************************** + * + * ftlist.h + * + * Generic list support for FreeType (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file implements functions relative to list processing. Its data + * structures are defined in `freetype.h`. + * + */ + + +#ifndef FTLIST_H_ +#define FTLIST_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * list_processing + * + * @title: + * List Processing + * + * @abstract: + * Simple management of lists. + * + * @description: + * This section contains various definitions related to list processing + * using doubly-linked nodes. + * + * @order: + * FT_List + * FT_ListNode + * FT_ListRec + * FT_ListNodeRec + * + * FT_List_Add + * FT_List_Insert + * FT_List_Find + * FT_List_Remove + * FT_List_Up + * FT_List_Iterate + * FT_List_Iterator + * FT_List_Finalize + * FT_List_Destructor + * + */ + + + /************************************************************************** + * + * @function: + * FT_List_Find + * + * @description: + * Find the list node for a given listed object. + * + * @input: + * list :: + * A pointer to the parent list. + * data :: + * The address of the listed object. + * + * @return: + * List node. `NULL` if it wasn't found. + */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /************************************************************************** + * + * @function: + * FT_List_Add + * + * @description: + * Append an element to the end of a list. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to append. + */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Insert + * + * @description: + * Insert an element at the head of a list. + * + * @inout: + * list :: + * A pointer to parent list. + * node :: + * The node to insert. + */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Remove + * + * @description: + * Remove a node from a list. This function doesn't check whether the + * node is in the list! + * + * @input: + * node :: + * The node to remove. + * + * @inout: + * list :: + * A pointer to the parent list. + */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @function: + * FT_List_Up + * + * @description: + * Move a node to the head/top of a list. Used to maintain LRU lists. + * + * @inout: + * list :: + * A pointer to the parent list. + * node :: + * The node to move. + */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /************************************************************************** + * + * @functype: + * FT_List_Iterator + * + * @description: + * An FT_List iterator function that is called during a list parse by + * @FT_List_Iterate. + * + * @input: + * node :: + * The current iteration list node. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. Can be used to point + * to the iteration's state. + */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Iterate + * + * @description: + * Parse a list and calls a given iterator function on each element. + * Note that parsing is stopped as soon as one of the iterator calls + * returns a non-zero value. + * + * @input: + * list :: + * A handle to the list. + * iterator :: + * An iterator function, called on each node of the list. + * user :: + * A user-supplied field that is passed as the second argument to the + * iterator. + * + * @return: + * The result (a FreeType error code) of the last iterator call. + */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /************************************************************************** + * + * @functype: + * FT_List_Destructor + * + * @description: + * An @FT_List iterator function that is called during a list + * finalization by @FT_List_Finalize to destroy all elements in a given + * list. + * + * @input: + * system :: + * The current system object. + * + * data :: + * The current object to destroy. + * + * user :: + * A typeless pointer passed to @FT_List_Iterate. It can be used to + * point to the iteration's state. + */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_List_Finalize + * + * @description: + * Destroy all elements in the list as well as the list itself. + * + * @input: + * list :: + * A handle to the list. + * + * destroy :: + * A list destructor that will be applied to each element of the list. + * Set this to `NULL` if not needed. + * + * memory :: + * The current memory object that handles deallocation. + * + * user :: + * A user-supplied field that is passed as the last argument to the + * destructor. + * + * @note: + * This function expects that all nodes added by @FT_List_Add or + * @FT_List_Insert have been dynamically allocated. + */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLIST_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftlogging.h b/external/freetype/include/freetype/ftlogging.h new file mode 100644 index 000000000..53b8b8964 --- /dev/null +++ b/external/freetype/include/freetype/ftlogging.h @@ -0,0 +1,184 @@ +/**************************************************************************** + * + * ftlogging.h + * + * Additional debugging APIs. + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLOGGING_H_ +#define FTLOGGING_H_ + + +#include +#include FT_CONFIG_CONFIG_H + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * debugging_apis + * + * @title: + * External Debugging APIs + * + * @abstract: + * Public APIs to control the `FT_DEBUG_LOGGING` macro. + * + * @description: + * This section contains the declarations of public functions that + * enables fine control of what the `FT_DEBUG_LOGGING` macro outputs. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Trace_Set_Level + * + * @description: + * Change the levels of tracing components of FreeType at run time. + * + * @input: + * tracing_level :: + * New tracing value. + * + * @example: + * The following call makes FreeType trace everything but the 'memory' + * component. + * + * ``` + * FT_Trace_Set_Level( "any:7 memory:0" ); + * ``` + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Trace_Set_Level( const char* tracing_level ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Set_Default_Level + * + * @description: + * Reset tracing value of FreeType's components to the default value + * (i.e., to the value of the `FT2_DEBUG` environment value or to NULL + * if `FT2_DEBUG` is not set). + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Trace_Set_Default_Level( void ); + + + /************************************************************************** + * + * @functype: + * FT_Custom_Log_Handler + * + * @description: + * A function typedef that is used to handle the logging of tracing and + * debug messages on a file system. + * + * @input: + * ft_component :: + * The name of `FT_COMPONENT` from which the current debug or error + * message is produced. + * + * fmt :: + * Actual debug or tracing message. + * + * args:: + * Arguments of debug or tracing messages. + * + * @since: + * 2.11 + * + */ + typedef void + (*FT_Custom_Log_Handler)( const char* ft_component, + const char* fmt, + va_list args ); + + + /************************************************************************** + * + * @function: + * FT_Set_Log_Handler + * + * @description: + * A function to set a custom log handler. + * + * @input: + * handler :: + * New logging function. + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Set_Log_Handler( FT_Custom_Log_Handler handler ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Log_Handler + * + * @description: + * A function to undo the effect of @FT_Set_Log_Handler, resetting the + * log handler to FreeType's built-in version. + * + * @note: + * This function does nothing if compilation option `FT_DEBUG_LOGGING` + * isn't set. + * + * @since: + * 2.11 + * + */ + FT_EXPORT( void ) + FT_Set_Default_Log_Handler( void ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLOGGING_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftlzw.h b/external/freetype/include/freetype/ftlzw.h new file mode 100644 index 000000000..adfd17247 --- /dev/null +++ b/external/freetype/include/freetype/ftlzw.h @@ -0,0 +1,100 @@ +/**************************************************************************** + * + * ftlzw.h + * + * LZW-compressed stream support. + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTLZW_H_ +#define FTLZW_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * lzw + * + * @title: + * LZW Streams + * + * @abstract: + * Using LZW-compressed font files. + * + * @description: + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it and + * re-open the face with it. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream, + * which significantly undermines the performance. + * + * This section contains the declaration of LZW-specific functions. + * + */ + + /************************************************************************** + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is mainly + * used to support the compressed `*.pcf.Z` fonts that come with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close` on the new stream will + * **not** call `FT_Stream_Close` on the source stream. None of the + * stream objects will be released to the heap. + * + * This function may return `FT_Err_Unimplemented_Feature` if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* FTLZW_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftmac.h b/external/freetype/include/freetype/ftmac.h new file mode 100644 index 000000000..a91e38f9e --- /dev/null +++ b/external/freetype/include/freetype/ftmac.h @@ -0,0 +1,289 @@ +/**************************************************************************** + * + * ftmac.h + * + * Additional Mac-specific API. + * + * Copyright (C) 1996-2023 by + * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * NOTE: Include this file after `FT_FREETYPE_H` and after any + * Mac-specific headers (because this header uses Mac types such as + * 'Handle', 'FSSpec', 'FSRef', etc.) + * + */ + + +#ifndef FTMAC_H_ +#define FTMAC_H_ + + + + +FT_BEGIN_HEADER + + + /* gcc-3.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined( __GNUC__ ) && \ + ( ( __GNUC__ >= 4 ) || \ + ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 1 ) ) ) +#define FT_DEPRECATED_ATTRIBUTE __attribute__(( deprecated )) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /************************************************************************** + * + * @section: + * mac_specific + * + * @title: + * Mac Specific Interface + * + * @abstract: + * Only available on the Macintosh. + * + * @description: + * The following definitions are only available if FreeType is compiled + * on a Macintosh. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FOND + * + * @description: + * Create a new face object from a FOND resource. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * fond :: + * A FOND resource. + * + * face_index :: + * Only supported for the -1 'sanity check' special case. + * + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @example: + * This function can be used to create @FT_Face objects from fonts that + * are installed in the system as follows. + * + * ``` + * fond = GetResource( 'FOND', fontName ); + * error = FT_New_Face_From_FOND( library, fond, 0, &face ); + * ``` + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font (e.g., Times New Roman Bold). + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFile_From_Mac_ATS_Name + * + * @description: + * Return an FSSpec for the disk file containing the named font. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * pathSpec :: + * FSSpec to the file. For passing to @FT_New_Face_From_FSSpec. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face_From_FSSpec. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_GetFilePath_From_Mac_ATS_Name + * + * @description: + * Return a pathname of the disk file and face index for given font name + * that is handled by ATS framework. + * + * @input: + * fontName :: + * Mac OS name of the font in ATS framework. + * + * @output: + * path :: + * Buffer to store pathname of the file. For passing to @FT_New_Face. + * The client must allocate this buffer before calling this function. + * + * maxPathSize :: + * Lengths of the buffer `path` that client allocated. + * + * face_index :: + * Index of the face. For passing to @FT_New_Face. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSSpec + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSSpec to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSSpec to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSSpec is identical to @FT_New_Face except it + * accepts an FSSpec instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /************************************************************************** + * + * @function: + * FT_New_Face_From_FSRef + * + * @description: + * Create a new face object from a given resource and typeface index + * using an FSRef to the font file. + * + * @inout: + * library :: + * A handle to the library resource. + * + * @input: + * spec :: + * FSRef to the font file. + * + * face_index :: + * The index of the face within the resource. The first face has + * index~0. + * @output: + * aface :: + * A handle to a new face object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * @FT_New_Face_From_FSRef is identical to @FT_New_Face except it accepts + * an FSRef instead of a path. + */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* FTMAC_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftmm.h b/external/freetype/include/freetype/ftmm.h new file mode 100644 index 000000000..d145128a9 --- /dev/null +++ b/external/freetype/include/freetype/ftmm.h @@ -0,0 +1,805 @@ +/**************************************************************************** + * + * ftmm.h + * + * FreeType Multiple Master font interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMM_H_ +#define FTMM_H_ + + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * multiple_masters + * + * @title: + * Multiple Masters + * + * @abstract: + * How to manage Multiple Masters fonts. + * + * @description: + * The following types and functions are used to manage Multiple Master + * fonts, i.e., the selection of specific design instances by setting + * design axis coordinates. + * + * Besides Adobe MM fonts, the interface supports Apple's TrueType GX and + * OpenType variation fonts. Some of the routines only work with Adobe + * MM fonts, others will work with all three types. They are similar + * enough that a consistent interface makes sense. + * + * For Adobe MM fonts, macro @FT_IS_SFNT returns false. For GX and + * OpenType variation fonts, it returns true. + * + */ + + + /************************************************************************** + * + * @struct: + * FT_MM_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple Masters + * fonts. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * name :: + * The axis's name. + * + * minimum :: + * The axis's minimum design coordinate. + * + * maximum :: + * The axis's maximum design coordinate. + */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Multi_Master + * + * @description: + * A structure to model the axes and space of a Multiple Masters font. + * + * This structure can't be used for TrueType GX or OpenType variation + * fonts. + * + * @fields: + * num_axis :: + * Number of axes. Cannot exceed~4. + * + * num_designs :: + * Number of designs; should be normally 2^num_axis even though the + * Type~1 specification strangely allows for intermediate designs to be + * present. This number cannot exceed~16. + * + * axis :: + * A table of axis descriptors. + */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /************************************************************************** + * + * @struct: + * FT_Var_Axis + * + * @description: + * A structure to model a given axis in design space for Multiple + * Masters, TrueType GX, and OpenType variation fonts. + * + * @fields: + * name :: + * The axis's name. Not always meaningful for TrueType GX or OpenType + * variation fonts. + * + * minimum :: + * The axis's minimum design coordinate. + * + * def :: + * The axis's default design coordinate. FreeType computes meaningful + * default values for Adobe MM fonts. + * + * maximum :: + * The axis's maximum design coordinate. + * + * tag :: + * The axis's tag (the equivalent to 'name' for TrueType GX and + * OpenType variation fonts). FreeType provides default values for + * Adobe MM fonts if possible. + * + * strid :: + * The axis name entry in the font's 'name' table. This is another + * (and often better) version of the 'name' field for TrueType GX or + * OpenType variation fonts. Not meaningful for Adobe MM fonts. + * + * @note: + * The fields `minimum`, `def`, and `maximum` are 16.16 fractional values + * for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the + * values are whole numbers (i.e., the fractional part is zero). + */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /************************************************************************** + * + * @struct: + * FT_Var_Named_Style + * + * @description: + * A structure to model a named instance in a TrueType GX or OpenType + * variation font. + * + * This structure can't be used for Adobe MM fonts. + * + * @fields: + * coords :: + * The design coordinates for this instance. This is an array with one + * entry for each axis. + * + * strid :: + * The entry in 'name' table identifying this instance. + * + * psid :: + * The entry in 'name' table identifying a PostScript name for this + * instance. Value 0xFFFF indicates a missing entry. + */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + FT_UInt psid; /* since 2.7.1 */ + + } FT_Var_Named_Style; + + + /************************************************************************** + * + * @struct: + * FT_MM_Var + * + * @description: + * A structure to model the axes and space of an Adobe MM, TrueType GX, + * or OpenType variation font. + * + * Some fields are specific to one format and not to the others. + * + * @fields: + * num_axis :: + * The number of axes. The maximum value is~4 for Adobe MM fonts; no + * limit in TrueType GX or OpenType variation fonts. + * + * num_designs :: + * The number of designs; should be normally 2^num_axis for Adobe MM + * fonts. Not meaningful for TrueType GX or OpenType variation fonts + * (where every glyph could have a different number of designs). + * + * num_namedstyles :: + * The number of named styles; a 'named style' is a tuple of design + * coordinates that has a string ID (in the 'name' table) associated + * with it. The font can tell the user that, for example, + * [Weight=1.5,Width=1.1] is 'Bold'. Another name for 'named style' is + * 'named instance'. + * + * For Adobe Multiple Masters fonts, this value is always zero because + * the format does not support named styles. + * + * axis :: + * An axis descriptor table. TrueType GX and OpenType variation fonts + * contain slightly more data than Adobe MM fonts. Memory management + * of this pointer is done internally by FreeType. + * + * namedstyle :: + * A named style (instance) table. Only meaningful for TrueType GX and + * OpenType variation fonts. Memory management of this pointer is done + * internally by FreeType. + */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /************************************************************************** + * + * @function: + * FT_Get_Multi_Master + * + * @description: + * Retrieve a variation descriptor of a given Adobe MM font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The Multiple Masters descriptor. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Var + * + * @description: + * Retrieve a variation descriptor for a given font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * amaster :: + * The variation descriptor. Allocates a data structure, which the + * user must deallocate with a call to @FT_Done_MM_Var after use. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Done_MM_Var + * + * @description: + * Free the memory allocated by @FT_Get_MM_Var. + * + * @input: + * library :: + * A handle of the face's parent library object that was used in the + * call to @FT_Get_MM_Var to create `amaster`. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_MM_Var( FT_Library library, + FT_MM_Var *amaster ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Design_Coordinates + * + * @description: + * For Adobe MM fonts, choose an interpolated font design through design + * coordinates. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Design_Coordinates + * + * @description: + * Choose an interpolated font design through design coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * An array of design coordinates. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The design coordinates are 16.16 fractional values for TrueType GX and + * OpenType variation fonts. For Adobe MM fonts, the values are supposed + * to be whole numbers (i.e., the fractional part is zero). + * + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Design_Coordinates + * + * @description: + * Get the design coordinates of the currently selected interpolated + * font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of design coordinates to retrieve. If it is larger than + * the number of axes, set the excess values to~0. + * + * @output: + * coords :: + * The design coordinates array. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The design coordinates are 16.16 fractional values for TrueType GX and + * OpenType variation fonts. For Adobe MM fonts, the values are whole + * numbers (i.e., the fractional part is zero). + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_Blend_Coordinates + * + * @description: + * Choose an interpolated font design through normalized blend + * coordinates. + * + * This function works with all supported variation formats. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * num_coords :: + * The number of available design coordinates. If it is larger than + * the number of axes, ignore the excess values. If it is smaller than + * the number of axes, use default values for the remaining axes. + * + * coords :: + * The design coordinates array. Each element is a 16.16 fractional + * value and must be between 0 and 1.0 for Adobe MM fonts, and between + * -1.0 and 1.0 for TrueType GX and OpenType variation fonts. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * [Since 2.8.1] To reset all axes to the default values, call the + * function with `num_coords` set to zero and `coords` set to `NULL`. + * [Since 2.9] 'Default values' means the currently selected named + * instance (or the base font if no named instance is selected). + * + * [Since 2.9] If `num_coords` is larger than zero, this function sets + * the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field + * (i.e., @FT_IS_VARIATION will return true). If `num_coords` is zero, + * this bit flag gets unset. + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_Blend_Coordinates + * + * @description: + * Get the normalized blend coordinates of the currently selected + * interpolated font. + * + * This function works with all supported variation formats. + * + * @input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of normalized blend coordinates to retrieve. If it is + * larger than the number of axes, set the excess values to~0.5 for + * Adobe MM fonts, and to~0 for TrueType GX and OpenType variation + * fonts. + * + * @output: + * coords :: + * The normalized blend coordinates array (as 16.16 fractional values). + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Set_MM_Blend_Coordinates. + */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Blend_Coordinates + * + * @description: + * This is another name of @FT_Get_MM_Blend_Coordinates. + * + * @since: + * 2.7.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @function: + * FT_Set_MM_WeightVector + * + * @description: + * For Adobe MM fonts, choose an interpolated font design by directly + * setting the weight vector. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * @input: + * len :: + * The length of the weight vector array. If it is larger than the + * number of designs, the extra values are ignored. If it is less than + * the number of designs, the remaining values are set to zero. + * + * weightvector :: + * An array representing the weight vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the weight vector to 16~elements. + * + * If `len` is larger than zero, this function sets the + * @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field (i.e., + * @FT_IS_VARIATION will return true). If `len` is zero, this bit flag + * is unset and the weight vector array is reset to the default values. + * + * The Adobe documentation also states that the values in the + * WeightVector array must total 1.0 +/-~0.001. In practice this does + * not seem to be enforced, so is not enforced here, either. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Set_MM_WeightVector( FT_Face face, + FT_UInt len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @function: + * FT_Get_MM_WeightVector + * + * @description: + * For Adobe MM fonts, retrieve the current weight vector of the font. + * + * This function can't be used with TrueType GX or OpenType variation + * fonts. + * + * @inout: + * face :: + * A handle to the source face. + * + * len :: + * A pointer to the size of the array to be filled. If the size of the + * array is less than the number of designs, `FT_Err_Invalid_Argument` + * is returned, and `len` is set to the required size (the number of + * designs). If the size of the array is greater than the number of + * designs, the remaining entries are set to~0. On successful + * completion, `len` is set to the number of designs (i.e., the number + * of values written to the array). + * + * @output: + * weightvector :: + * An array to be filled. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Adobe Multiple Master fonts limit the number of designs, and thus the + * length of the WeightVector to~16. + * + * @since: + * 2.10 + */ + FT_EXPORT( FT_Error ) + FT_Get_MM_WeightVector( FT_Face face, + FT_UInt* len, + FT_Fixed* weightvector ); + + + /************************************************************************** + * + * @enum: + * FT_VAR_AXIS_FLAG_XXX + * + * @description: + * A list of bit flags used in the return value of + * @FT_Get_Var_Axis_Flags. + * + * @values: + * FT_VAR_AXIS_FLAG_HIDDEN :: + * The variation axis should not be exposed to user interfaces. + * + * @since: + * 2.8.1 + */ +#define FT_VAR_AXIS_FLAG_HIDDEN 1 + + + /************************************************************************** + * + * @function: + * FT_Get_Var_Axis_Flags + * + * @description: + * Get the 'flags' field of an OpenType Variation Axis Record. + * + * Not meaningful for Adobe MM fonts (`*flags` is always zero). + * + * @input: + * master :: + * The variation descriptor. + * + * axis_index :: + * The index of the requested variation axis. + * + * @output: + * flags :: + * The 'flags' field. See @FT_VAR_AXIS_FLAG_XXX for possible values. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.8.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Axis_Flags( FT_MM_Var* master, + FT_UInt axis_index, + FT_UInt* flags ); + + + /************************************************************************** + * + * @function: + * FT_Set_Named_Instance + * + * @description: + * Set or change the current named instance. + * + * @input: + * face :: + * A handle to the source face. + * + * instance_index :: + * The index of the requested instance, starting with value 1. If set + * to value 0, FreeType switches to font access without a named + * instance. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The function uses the value of `instance_index` to set bits 16-30 of + * the face's `face_index` field. It also resets any variation applied + * to the font, and the @FT_FACE_FLAG_VARIATION bit of the face's + * `face_flags` field gets reset to zero (i.e., @FT_IS_VARIATION will + * return false). + * + * For Adobe MM fonts (which don't have named instances) this function + * simply resets the current face to the default instance. + * + * @since: + * 2.9 + */ + FT_EXPORT( FT_Error ) + FT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ); + + + /************************************************************************** + * + * @function: + * FT_Get_Default_Named_Instance + * + * @description: + * Retrieve the index of the default named instance, to be used with + * @FT_Set_Named_Instance. + * + * The default instance of a variation font is that instance for which + * the nth axis coordinate is equal to `axis[n].def` (as specified in the + * @FT_MM_Var structure), with~n covering all axes. + * + * FreeType synthesizes a named instance for the default instance if the + * font does not contain such an entry. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * instance_index :: + * The index of the default named instance. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For Adobe MM fonts (which don't have named instances) this function + * always returns zero for `instance_index`. + * + * @since: + * 2.13.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMM_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftmodapi.h b/external/freetype/include/freetype/ftmodapi.h new file mode 100644 index 000000000..c8f0c2c2a --- /dev/null +++ b/external/freetype/include/freetype/ftmodapi.h @@ -0,0 +1,807 @@ +/**************************************************************************** + * + * ftmodapi.h + * + * FreeType modules public interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMODAPI_H_ +#define FTMODAPI_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + * @title: + * Module Management + * + * @abstract: + * How to add, upgrade, remove, and control modules from FreeType. + * + * @description: + * The definitions below are used to manage modules within FreeType. + * Internal and external modules can be added, upgraded, and removed at + * runtime. For example, an alternative renderer or proprietary font + * driver can be registered and prioritized. Additionally, some module + * properties can also be controlled. + * + * Here is a list of existing values of the `module_name` field in the + * @FT_Module_Class structure. + * + * ``` + * autofitter + * bdf + * cff + * gxvalid + * otvalid + * pcf + * pfr + * psaux + * pshinter + * psnames + * raster1 + * sfnt + * smooth + * truetype + * type1 + * type42 + * t1cid + * winfonts + * ``` + * + * Note that the FreeType Cache sub-system is not a FreeType module. + * + * @order: + * FT_Module + * FT_Module_Constructor + * FT_Module_Destructor + * FT_Module_Requester + * FT_Module_Class + * + * FT_Add_Module + * FT_Get_Module + * FT_Remove_Module + * FT_Add_Default_Modules + * + * FT_FACE_DRIVER_NAME + * FT_Property_Set + * FT_Property_Get + * FT_Set_Default_Properties + * + * FT_New_Library + * FT_Done_Library + * FT_Reference_Library + * + * FT_Renderer + * FT_Renderer_Class + * + * FT_Get_Renderer + * FT_Set_Renderer + * + * FT_Set_Debug_Hook + * + */ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ +#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800 /* the driver's hinter */ + /* produces LIGHT hints */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER +#define ft_module_driver_hints_lightly FT_MODULE_DRIVER_HINTS_LIGHTLY + + + typedef FT_Pointer FT_Module_Interface; + + + /************************************************************************** + * + * @functype: + * FT_Module_Constructor + * + * @description: + * A function used to initialize (not create) a new module object. + * + * @input: + * module :: + * The module to initialize. + */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Destructor + * + * @description: + * A function used to finalize (not destroy) a given module object. + * + * @input: + * module :: + * The module to finalize. + */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /************************************************************************** + * + * @functype: + * FT_Module_Requester + * + * @description: + * A function used to query a given module for a specific interface. + * + * @input: + * module :: + * The module to be searched. + * + * name :: + * The name of the interface in the module. + */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /************************************************************************** + * + * @struct: + * FT_Module_Class + * + * @description: + * The module class descriptor. While being a public structure necessary + * for FreeType's module bookkeeping, most of the fields are essentially + * internal, not to be used directly by an application. + * + * @fields: + * module_flags :: + * Bit flags describing the module. + * + * module_size :: + * The size of one module object/instance in bytes. + * + * module_name :: + * The name of the module. + * + * module_version :: + * The version, as a 16.16 fixed number (major.minor). + * + * module_requires :: + * The version of FreeType this module requires, as a 16.16 fixed + * number (major.minor). Starts at version 2.0, i.e., 0x20000. + * + * module_interface :: + * A typeless pointer to a structure (which varies between different + * modules) that holds the module's interface functions. This is + * essentially what `get_interface` returns. + * + * module_init :: + * The initializing function. + * + * module_done :: + * The finalizing function. + * + * get_interface :: + * The interface requesting function. + */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /************************************************************************** + * + * @function: + * FT_Add_Module + * + * @description: + * Add a new module to a given library instance. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * clazz :: + * A pointer to class descriptor for the module. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /************************************************************************** + * + * @function: + * FT_Get_Module + * + * @description: + * Find a module by its name. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module handle. 0~if none was found. + * + * @note: + * FreeType's internal modules aren't documented very well, and you + * should look up the source code for details. + */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /************************************************************************** + * + * @function: + * FT_Remove_Module + * + * @description: + * Remove a given module from a library instance. + * + * @inout: + * library :: + * A handle to a library object. + * + * @input: + * module :: + * A handle to a module object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The module object is destroyed by the function in case of success. + */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /************************************************************************** + * + * @macro: + * FT_FACE_DRIVER_NAME + * + * @description: + * A macro that retrieves the name of a font driver from a face object. + * + * @note: + * The font driver name is a valid `module_name` for @FT_Property_Set + * and @FT_Property_Get. This is not the same as @FT_Get_Font_Format. + * + * @since: + * 2.11 + * + */ +#define FT_FACE_DRIVER_NAME( face ) \ + ( ( *FT_REINTERPRET_CAST( FT_Module_Class**, \ + ( face )->driver ) )->module_name ) + + + /************************************************************************** + * + * @function: + * FT_Property_Set + * + * @description: + * Set a property for a given module. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * Note that only a few modules have properties. + * + * value :: + * A generic pointer to a variable or structure that gives the new + * value of the property. The exact definition of `value` is + * dependent on the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example sets property 'bar' (a simple integer) in + * module 'foo' to value~1. + * + * ``` + * FT_UInt bar; + * + * + * bar = 1; + * FT_Property_Set( library, "foo", "bar", &bar ); + * ``` + * + * Note that the FreeType Cache sub-system doesn't recognize module + * property changes. To avoid glyph lookup confusion within the cache + * you should call @FTC_Manager_Reset to completely flush the cache if a + * module property gets changed after @FTC_Manager_New has been called. + * + * It is not possible to set properties of the FreeType Cache sub-system + * itself with FT_Property_Set; use @FTC_Property_Set instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ); + + + /************************************************************************** + * + * @function: + * FT_Property_Get + * + * @description: + * Get a module's property value. + * + * @input: + * library :: + * A handle to the library the module is part of. + * + * module_name :: + * The module name. + * + * property_name :: + * The property name. Properties are described in section + * @properties. + * + * @inout: + * value :: + * A generic pointer to a variable or structure that gives the value + * of the property. The exact definition of `value` is dependent on + * the property; see section @properties. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `module_name` isn't a valid module name, or `property_name` + * doesn't specify a valid property, or if `value` doesn't represent a + * valid value for the given property, an error is returned. + * + * The following example gets property 'baz' (a range) in module 'foo'. + * + * ``` + * typedef range_ + * { + * FT_Int32 min; + * FT_Int32 max; + * + * } range; + * + * range baz; + * + * + * FT_Property_Get( library, "foo", "baz", &baz ); + * ``` + * + * It is not possible to retrieve properties of the FreeType Cache + * sub-system with FT_Property_Get; use @FTC_Property_Get instead. + * + * @since: + * 2.4.11 + * + */ + FT_EXPORT( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ); + + + /************************************************************************** + * + * @function: + * FT_Set_Default_Properties + * + * @description: + * If compilation option `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES` is + * set, this function reads the `FREETYPE_PROPERTIES` environment + * variable to control driver properties. See section @properties for + * more. + * + * If the compilation option is not set, this function does nothing. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=0 + * ``` + * + * @inout: + * library :: + * A handle to a new library object. + * + * @since: + * 2.8 + */ + FT_EXPORT( void ) + FT_Set_Default_Properties( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_Reference_Library + * + * @description: + * A counter gets initialized to~1 at the time an @FT_Library structure + * is created. This function increments the counter. @FT_Done_Library + * then only destroys a library if the counter is~1, otherwise it simply + * decrements the counter. + * + * This function helps in managing life-cycles of structures that + * reference @FT_Library objects. + * + * @input: + * library :: + * A handle to a target library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @since: + * 2.4.2 + */ + FT_EXPORT( FT_Error ) + FT_Reference_Library( FT_Library library ); + + + /************************************************************************** + * + * @function: + * FT_New_Library + * + * @description: + * This function is used to create a new FreeType library instance from a + * given memory object. It is thus possible to use libraries with + * distinct memory allocators within the same program. Note, however, + * that the used @FT_Memory structure is expected to remain valid for the + * life of the @FT_Library object. + * + * Normally, you would call this function (followed by a call to + * @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, and a + * call to @FT_Set_Default_Properties) instead of @FT_Init_FreeType to + * initialize the FreeType library. + * + * Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a library + * instance. + * + * @input: + * memory :: + * A handle to the original memory object. + * + * @output: + * alibrary :: + * A pointer to handle of a new library object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /************************************************************************** + * + * @function: + * FT_Done_Library + * + * @description: + * Discard a given library object. This closes all drivers and discards + * all resource objects. + * + * @input: + * library :: + * A handle to the target library. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * See the discussion of reference counters in the description of + * @FT_Reference_Library. + */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + + + /************************************************************************** + * + * @functype: + * FT_DebugHook_Func + * + * @description: + * A drop-in replacement (or rather a wrapper) for the bytecode or + * charstring interpreter's main loop function. + * + * Its job is essentially + * + * - to activate debug mode to enforce single-stepping, + * + * - to call the main loop function to interpret the next opcode, and + * + * - to show the changed context to the user. + * + * An example for such a main loop function is `TT_RunIns` (declared in + * FreeType's internal header file `src/truetype/ttinterp.h`). + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of a drop-in replacement. + * + * @inout: + * arg :: + * A typeless pointer, to be cast to the main loop function's data + * structure (which depends on the font module). For TrueType fonts + * it is bytecode interpreter's execution context, `TT_ExecContext`, + * which is declared in FreeType's internal header file `tttypes.h`. + */ + typedef FT_Error + (*FT_DebugHook_Func)( void* arg ); + + + /************************************************************************** + * + * @enum: + * FT_DEBUG_HOOK_XXX + * + * @description: + * A list of named debug hook indices. + * + * @values: + * FT_DEBUG_HOOK_TRUETYPE:: + * This hook index identifies the TrueType bytecode debugger. + */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /************************************************************************** + * + * @function: + * FT_Set_Debug_Hook + * + * @description: + * Set a debug hook function for debugging the interpreter of a font + * format. + * + * While this is a public API function, an application needs access to + * FreeType's internal header files to do something useful. + * + * Have a look at the source code of the `ttdebug` FreeType demo program + * for an example of its usage. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * hook_index :: + * The index of the debug hook. You should use defined enumeration + * macros like @FT_DEBUG_HOOK_TRUETYPE. + * + * debug_hook :: + * The function used to debug the interpreter. + * + * @note: + * Currently, four debug hook slots are available, but only one (for the + * TrueType interpreter) is defined. + */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /************************************************************************** + * + * @function: + * FT_Add_Default_Modules + * + * @description: + * Add the set of default drivers to a given library object. This is + * only useful when you create a library object with @FT_New_Library + * (usually to plug a custom memory manager). + * + * @inout: + * library :: + * A handle to a new library object. + */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode engine is + * implemented in a given FT_Library instance. It is used by the + * @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * Deprecated and removed. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers the full + * instruction set of the TrueType virtual machine (this was governed + * by patents until May 2010, hence the name). + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @function: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of the + * TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + /* */ + + +FT_END_HEADER + +#endif /* FTMODAPI_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftmoderr.h b/external/freetype/include/freetype/ftmoderr.h new file mode 100644 index 000000000..c8c892dcc --- /dev/null +++ b/external/freetype/include/freetype/ftmoderr.h @@ -0,0 +1,204 @@ +/**************************************************************************** + * + * ftmoderr.h + * + * FreeType module error offsets (specification). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the FreeType module error codes. + * + * If the macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` in `ftoption.h` is + * set, the lower byte of an error value identifies the error code as + * usual. In addition, the higher byte identifies the module. For + * example, the error `FT_Err_Invalid_File_Format` has value 0x0003, the + * error `TT_Err_Invalid_File_Format` has value 0x1303, the error + * `T1_Err_Invalid_File_Format` has value 0x1403, etc. + * + * Note that `FT_Err_Ok`, `TT_Err_Ok`, etc. are always equal to zero, + * including the high byte. + * + * If `FT_CONFIG_OPTION_USE_MODULE_ERRORS` isn't set, the higher byte of an + * error value is set to zero. + * + * To hide the various `XXX_Err_` prefixes in the source code, FreeType + * provides some macros in `fttypes.h`. + * + * FT_ERR( err ) + * + * Add current error module prefix (as defined with the `FT_ERR_PREFIX` + * macro) to `err`. For example, in the BDF module the line + * + * ``` + * error = FT_ERR( Invalid_Outline ); + * ``` + * + * expands to + * + * ``` + * error = BDF_Err_Invalid_Outline; + * ``` + * + * For simplicity, you can always use `FT_Err_Ok` directly instead of + * `FT_ERR( Ok )`. + * + * FT_ERR_EQ( errcode, err ) + * FT_ERR_NEQ( errcode, err ) + * + * Compare error code `errcode` with the error `err` for equality and + * inequality, respectively. Example: + * + * ``` + * if ( FT_ERR_EQ( error, Invalid_Outline ) ) + * ... + * ``` + * + * Using this macro you don't have to think about error prefixes. Of + * course, if module errors are not active, the above example is the + * same as + * + * ``` + * if ( error == FT_Err_Invalid_Outline ) + * ... + * ``` + * + * FT_ERROR_BASE( errcode ) + * FT_ERROR_MODULE( errcode ) + * + * Get base error and module error code, respectively. + * + * It can also be used to create a module error message table easily with + * something like + * + * ``` + * #undef FTMODERR_H_ + * #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, + * #define FT_MODERR_START_LIST { + * #define FT_MODERR_END_LIST { 0, 0 } }; + * + * const struct + * { + * int mod_err_offset; + * const char* mod_err_msg + * } ft_mod_errors[] = + * + * #include + * ``` + * + */ + + +#ifndef FTMODERR_H_ +#define FTMODERR_H_ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" ) + FT_MODERRDEF( Cache, 0x400, "cache module" ) + FT_MODERRDEF( CFF, 0x500, "CFF module" ) + FT_MODERRDEF( CID, 0x600, "CID module" ) + FT_MODERRDEF( Gzip, 0x700, "Gzip module" ) + FT_MODERRDEF( LZW, 0x800, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0xA00, "PCF module" ) + FT_MODERRDEF( PFR, 0xB00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xE00, "PS names module" ) + FT_MODERRDEF( Raster, 0xF00, "raster module" ) + FT_MODERRDEF( SFNT, 0x1000, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1200, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1300, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1400, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" ) + FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" ) + FT_MODERRDEF( Sdf, 0x1700, "Signed distance field raster module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* FTMODERR_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftotval.h b/external/freetype/include/freetype/ftotval.h new file mode 100644 index 000000000..011bdfc83 --- /dev/null +++ b/external/freetype/include/freetype/ftotval.h @@ -0,0 +1,206 @@ +/**************************************************************************** + * + * ftotval.h + * + * FreeType API for validating OpenType tables (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/**************************************************************************** + * + * + * Warning: This module might be moved to a different library in the + * future to avoid a tight dependency between FreeType and the + * OpenType specification. + * + * + */ + + +#ifndef FTOTVAL_H_ +#define FTOTVAL_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * ot_validation + * + * @title: + * OpenType Validation + * + * @abstract: + * An API to validate OpenType tables. + * + * @description: + * This section contains the declaration of functions to validate some + * OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + * @order: + * FT_OpenType_Validate + * FT_OpenType_Free + * + * FT_VALIDATE_OTXXX + * + */ + + + /************************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT ( FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH ) + + + /************************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library that + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field that specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A `NULL` value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + + /************************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOTVAL_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftoutln.h b/external/freetype/include/freetype/ftoutln.h new file mode 100644 index 000000000..f9329ca40 --- /dev/null +++ b/external/freetype/include/freetype/ftoutln.h @@ -0,0 +1,588 @@ +/**************************************************************************** + * + * ftoutln.h + * + * Support for the FT_Outline type used to store glyph shapes of + * most scalable font formats (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTOUTLN_H_ +#define FTOUTLN_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * outline_processing + * + * @title: + * Outline Processing + * + * @abstract: + * Functions to create, transform, and render vectorial glyph images. + * + * @description: + * This section contains routines used to create and destroy scalable + * glyph images known as 'outlines'. These can also be measured, + * transformed, and converted into bitmaps and pixmaps. + * + * @order: + * FT_Outline + * FT_Outline_New + * FT_Outline_Done + * FT_Outline_Copy + * FT_Outline_Translate + * FT_Outline_Transform + * FT_Outline_Embolden + * FT_Outline_EmboldenXY + * FT_Outline_Reverse + * FT_Outline_Check + * + * FT_Outline_Get_CBox + * FT_Outline_Get_BBox + * + * FT_Outline_Get_Bitmap + * FT_Outline_Render + * FT_Outline_Decompose + * FT_Outline_Funcs + * FT_Outline_MoveToFunc + * FT_Outline_LineToFunc + * FT_Outline_ConicToFunc + * FT_Outline_CubicToFunc + * + * FT_Orientation + * FT_Outline_Get_Orientation + * + * FT_OUTLINE_XXX + * + */ + + + /************************************************************************** + * + * @function: + * FT_Outline_Decompose + * + * @description: + * Walk over an outline's structure to decompose it into individual + * segments and Bezier arcs. This function also emits 'move to' + * operations to indicate the start of new contours in the outline. + * + * @input: + * outline :: + * A pointer to the source target. + * + * func_interface :: + * A table of 'emitters', i.e., function pointers called during + * decomposition to indicate path operations. + * + * @inout: + * user :: + * A typeless pointer that is passed to each emitter during the + * decomposition. It can be used to store the state during the + * decomposition. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Degenerate contours, segments, and Bezier arcs may be reported. In + * most cases, it is best to filter these out before using the outline + * for stroking or other path modification purposes (which may cause + * degenerate segments to become non-degenrate and visible, like when + * stroke caps are used or the path is otherwise outset). Some glyph + * outlines may contain deliberate degenerate single points for mark + * attachement. + * + * Similarly, the function returns success for an empty outline also + * (doing nothing, that is, not calling any emitter); if necessary, you + * should filter this out, too. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /************************************************************************** + * + * @function: + * FT_Outline_New + * + * @description: + * Create a new outline of a given size. + * + * @input: + * library :: + * A handle to the library object from where the outline is allocated. + * Note however that the new outline will **not** necessarily be + * **freed**, when destroying the library, by @FT_Done_FreeType. + * + * numPoints :: + * The maximum number of points within the outline. Must be smaller + * than or equal to 0xFFFF (65535). + * + * numContours :: + * The maximum number of contours within the outline. This value must + * be in the range 0 to `numPoints`. + * + * @output: + * anoutline :: + * A handle to the new outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The reason why this function takes a `library` parameter is simply to + * use the library's memory allocator. + */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Done + * + * @description: + * Destroy an outline created with @FT_Outline_New. + * + * @input: + * library :: + * A handle of the library object used to allocate the outline. + * + * outline :: + * A pointer to the outline object to be discarded. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the outline's 'owner' field is not set, only the outline descriptor + * will be released. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Check + * + * @description: + * Check the contents of an outline descriptor. + * + * @input: + * outline :: + * A handle to a source outline. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * An empty outline, or an outline with a single point only is also + * valid. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_CBox + * + * @description: + * Return an outline's 'control box'. The control box encloses all the + * outline's points, including Bezier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline that + * contains Bezier outside arcs). + * + * Computing the control box is very fast, while getting the bounding box + * can take much more time as it needs to walk over all segments and arcs + * in the outline. To get the latter, you can use the 'ftbbox' + * component, which is dedicated to this single task. + * + * @input: + * outline :: + * A pointer to the source outline descriptor. + * + * @output: + * acbox :: + * The outline's control box. + * + * @note: + * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. + */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Translate + * + * @description: + * Apply a simple translation to the points of an outline. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * xOffset :: + * The horizontal offset. + * + * yOffset :: + * The vertical offset. + */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Copy + * + * @description: + * Copy an outline into another one. Both objects must have the same + * sizes (number of points & number of contours) when this function is + * called. + * + * @input: + * source :: + * A handle to the source outline. + * + * @output: + * target :: + * A handle to the target outline. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Transform + * + * @description: + * Apply a simple 2x2 matrix to all of an outline's points. Useful for + * applying rotations, slanting, flipping, etc. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @input: + * matrix :: + * A pointer to the transformation matrix. + * + * @note: + * You can use @FT_Outline_Translate if you need to translate the + * outline's points. + */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Embolden + * + * @description: + * Embolden an outline. The new outline will be at most 4~times + * `strength` pixels wider and higher. You may think of the left and + * bottom borders as unchanged. + * + * Negative `strength` values to reduce the outline thickness are + * possible also. + * + * @inout: + * outline :: + * A handle to the target outline. + * + * @input: + * strength :: + * How strong the glyph is emboldened. Expressed in 26.6 pixel format. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The used algorithm to increase or decrease the thickness of the glyph + * doesn't change the number of points; this means that certain + * situations like acute angles or intersections are sometimes handled + * incorrectly. + * + * If you need 'better' metrics values you should call + * @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. + * + * To get meaningful results, font scaling values must be set with + * functions like @FT_Set_Char_Size before calling FT_Render_Glyph. + * + * @example: + * ``` + * FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); + * + * if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + * FT_Outline_Embolden( &face->glyph->outline, strength ); + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_EmboldenXY + * + * @description: + * Embolden an outline. The new outline will be `xstrength` pixels wider + * and `ystrength` pixels higher. Otherwise, it is similar to + * @FT_Outline_Embolden, which uses the same strength in both directions. + * + * @since: + * 2.4.10 + */ + FT_EXPORT( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Reverse + * + * @description: + * Reverse the drawing direction of an outline. This is used to ensure + * consistent fill conventions for mirrored glyphs. + * + * @inout: + * outline :: + * A pointer to the target outline descriptor. + * + * @note: + * This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in the + * outline's `flags` field. + * + * It shouldn't be used by a normal client application, unless it knows + * what it is doing. + */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Bitmap + * + * @description: + * Render an outline within a bitmap. The outline's image is simply + * OR-ed to the target bitmap. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * abitmap :: + * A pointer to the target bitmap descriptor. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function does **not create** the bitmap, it only renders an + * outline image within the one you pass to it! Consequently, the + * various fields in `abitmap` should be set accordingly. + * + * It will use the raster corresponding to the default glyph format. + * + * The value of the `num_grays` field in `abitmap` is ignored. If you + * select the gray-level rasterizer, and you want less than 256 gray + * levels, you have to use @FT_Outline_Render directly. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /************************************************************************** + * + * @function: + * FT_Outline_Render + * + * @description: + * Render an outline within a bitmap using the current scan-convert. + * + * @input: + * library :: + * A handle to a FreeType library object. + * + * outline :: + * A pointer to the source outline descriptor. + * + * @inout: + * params :: + * A pointer to an @FT_Raster_Params structure used to describe the + * rendering operation. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This advanced function uses @FT_Raster_Params as an argument. + * The field `params.source` will be set to `outline` before the scan + * converter is called, which means that the value you give to it is + * actually ignored. Either `params.target` must point to preallocated + * bitmap, or @FT_RASTER_FLAG_DIRECT must be set in `params.flags` + * allowing FreeType rasterizer to be used for direct composition, + * translucency, etc. See @FT_Raster_Params for more details. + */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must be + * filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise + * contours must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of the + * drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its fill + * orientation (see @FT_Orientation). This is done by integrating the + * total area covered by the outline. The positive integral corresponds + * to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT is + * returned. The negative integral corresponds to the counter-clockwise + * orientation and @FT_ORIENTATION_TRUETYPE is returned. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTOUTLN_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/include/freetype/ftparams.h b/external/freetype/include/freetype/ftparams.h new file mode 100644 index 000000000..6a9f243bc --- /dev/null +++ b/external/freetype/include/freetype/ftparams.h @@ -0,0 +1,218 @@ +/**************************************************************************** + * + * ftparams.h + * + * FreeType API for possible FT_Parameter tags (specification only). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPARAMS_H_ +#define FTPARAMS_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * parameter_tags + * + * @title: + * Parameter Tags + * + * @abstract: + * Macros for driver property and font loading parameter tags. + * + * @description: + * This section contains macros for the @FT_Parameter structure that are + * used with various functions to activate some special functionality or + * different behaviour of various components of FreeType. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * family names in the 'name' table (introduced in OpenType version 1.4). + * Use this for backward compatibility with legacy systems that have a + * four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * subfamily names in the 'name' table (introduced in OpenType version + * 1.4). Use this for backward compatibility with legacy systems that + * have a four-faces-per-family restriction. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * An @FT_Parameter tag to be used with @FT_Open_Face to indicate + * incremental glyph loading. + * + */ +#define FT_PARAM_TAG_INCREMENTAL \ + FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_IGNORE_SBIX + * + * @description: + * A tag for @FT_Parameter to make @FT_Open_Face ignore an 'sbix' table + * while loading a font. Use this if @FT_FACE_FLAG_SBIX is set and you + * want to access the outline glyphs in the font. + * + */ +#define FT_PARAM_TAG_IGNORE_SBIX \ + FT_MAKE_TAG( 'i', 's', 'b', 'x' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_LCD_FILTER_WEIGHTS + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding argument specifies the five LCD filter weights for a + * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding the + * global default values or the values set up with + * @FT_Library_SetLcdFilterWeights. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \ + FT_MAKE_TAG( 'l', 'c', 'd', 'f' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_RANDOM_SEED + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding 32bit signed integer argument overrides the font + * driver's random seed value with a face-specific one; see @random-seed. + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_RANDOM_SEED \ + FT_MAKE_TAG( 's', 'e', 'e', 'd' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_STEM_DARKENING + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding Boolean argument specifies whether to apply stem + * darkening, overriding the global default values or the values set up + * with @FT_Property_Set (see @no-stem-darkening). + * + * This is a passive setting that only takes effect if the font driver or + * autohinter honors it, which the CFF, Type~1, and CID drivers always + * do, but the autohinter only in 'light' hinting mode (as of version + * 2.9). + * + * @since: + * 2.8 + * + */ +#define FT_PARAM_TAG_STEM_DARKENING \ + FT_MAKE_TAG( 'd', 'a', 'r', 'k' ) + + + /************************************************************************** + * + * @enum: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * Deprecated, no effect. + * + * Previously: A constant used as the tag of an @FT_Parameter structure + * to indicate that unpatented methods only should be used by the + * TrueType bytecode interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING \ + FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + + /* */ + + +FT_END_HEADER + + +#endif /* FTPARAMS_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftpfr.h b/external/freetype/include/freetype/ftpfr.h new file mode 100644 index 000000000..7111d40a0 --- /dev/null +++ b/external/freetype/include/freetype/ftpfr.h @@ -0,0 +1,179 @@ +/**************************************************************************** + * + * ftpfr.h + * + * FreeType API for accessing PFR-specific data (specification only). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPFR_H_ +#define FTPFR_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * pfr_fonts + * + * @title: + * PFR Fonts + * + * @abstract: + * PFR/TrueDoc-specific API. + * + * @description: + * This section contains the declaration of PFR-specific functions. + * + */ + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: + * Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution` for + * non-PFR fonts. Optional (parameter can be `NULL`). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed in + * metrics units to device subpixels. This is equivalent to + * `face->size->x_scale`, but for metrics only. Optional (parameter + * can be `NULL`). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale` but for the vertical direction. + * optional (parameter can be `NULL`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: + * A handle to the input face. + * + * left :: + * Index of the left glyph. + * + * right :: + * Index of the right glyph. + * + * @output: + * avector :: + * A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics units. + * This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED mode, + * which always returns distances converted to outline units. + * + * You can use the value of the `x_scale` and `y_scale` parameters + * returned by @FT_Get_PFR_Metrics to scale these to device subpixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /************************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: + * A handle to the input face. + * + * gindex :: + * The glyph index. + * + * @output: + * aadvance :: + * The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale` or `y_scale` results of @FT_Get_PFR_Metrics + * to convert the advance to device subpixels (i.e., 1/64 of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* FTPFR_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftrender.h b/external/freetype/include/freetype/ftrender.h new file mode 100644 index 000000000..0b6fad32e --- /dev/null +++ b/external/freetype/include/freetype/ftrender.h @@ -0,0 +1,244 @@ +/**************************************************************************** + * + * ftrender.h + * + * FreeType renderer modules public interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTRENDER_H_ +#define FTRENDER_H_ + + +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * module_management + * + */ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /************************************************************************** + * + * @struct: + * FT_Renderer_Class + * + * @description: + * The renderer module class descriptor. + * + * @fields: + * root :: + * The root @FT_Module_Class fields. + * + * glyph_format :: + * The glyph image format this renderer handles. + * + * render_glyph :: + * A method used to render the image that is in a given glyph slot into + * a bitmap. + * + * transform_glyph :: + * A method used to transform the image that is in a given glyph slot. + * + * get_glyph_cbox :: + * A method used to access the glyph's cbox. + * + * set_mode :: + * A method used to pass additional parameters. + * + * raster_class :: + * For @FT_GLYPH_FORMAT_OUTLINE renderers only. This is a pointer to + * its raster's class. + */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + const FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /************************************************************************** + * + * @function: + * FT_Get_Renderer + * + * @description: + * Retrieve the current renderer for a given glyph format. + * + * @input: + * library :: + * A handle to the library object. + * + * format :: + * The glyph format. + * + * @return: + * A renderer handle. 0~if none found. + * + * @note: + * An error will be returned if a module already exists by that name, or + * if the module requires a version of FreeType that is too great. + * + * To add a new renderer, simply use @FT_Add_Module. To retrieve a + * renderer by its name, use @FT_Get_Module. + */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /************************************************************************** + * + * @function: + * FT_Set_Renderer + * + * @description: + * Set the current renderer to use, and set additional mode. + * + * @inout: + * library :: + * A handle to the library object. + * + * @input: + * renderer :: + * A handle to the renderer object. + * + * num_params :: + * The number of additional parameters. + * + * parameters :: + * Additional parameters. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * In case of success, the renderer will be used to convert glyph images + * in the renderer's known format into bitmaps. + * + * This doesn't change the current renderer for other formats. + * + * Currently, no FreeType renderer module uses `parameters`; you should + * thus always pass `NULL` as the value. + */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + /* */ + + +FT_END_HEADER + +#endif /* FTRENDER_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftsizes.h b/external/freetype/include/freetype/ftsizes.h new file mode 100644 index 000000000..7bfb1aed4 --- /dev/null +++ b/external/freetype/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/**************************************************************************** + * + * ftsizes.h + * + * FreeType size objects management (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * Typical application would normally not need to use these functions. + * However, they have been placed in a public API for the rare cases where + * they are needed. + * + */ + + +#ifndef FTSIZES_H_ +#define FTSIZES_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sizes_management + * + * @title: + * Size Management + * + * @abstract: + * Managing multiple sizes per face. + * + * @description: + * When creating a new face object (e.g., with @FT_New_Face), an @FT_Size + * object is automatically created and used to store all pixel-size + * dependent information, available in the `face->size` field. + * + * It is however possible to create more sizes for a given face, mostly + * in order to manage several character pixel sizes of the same font + * family and style. See @FT_New_Size and @FT_Done_Size. + * + * Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only modify the + * contents of the current 'active' size; you thus need to use + * @FT_Activate_Size to change it. + * + * 99% of applications won't need the functions provided here, especially + * if they use the caching sub-system, so be cautious when using these. + * + */ + + + /************************************************************************** + * + * @function: + * FT_New_Size + * + * @description: + * Create a new size object from a given face object. + * + * @input: + * face :: + * A handle to a parent face object. + * + * @output: + * asize :: + * A handle to a new size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You need to call @FT_Activate_Size in order to select the new size for + * upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, + * @FT_Load_Glyph, @FT_Load_Char, etc. + */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /************************************************************************** + * + * @function: + * FT_Done_Size + * + * @description: + * Discard a given size object. Note that @FT_Done_Face automatically + * discards all size objects allocated with @FT_New_Size. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /************************************************************************** + * + * @function: + * FT_Activate_Size + * + * @description: + * Even though it is possible to create several size objects for a given + * face (see @FT_New_Size for details), functions like @FT_Load_Glyph or + * @FT_Load_Char only use the one that has been activated last to + * determine the 'current character pixel size'. + * + * This function can be used to 'activate' a previously created size + * object. + * + * @input: + * size :: + * A handle to a target size object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `face` is the size's parent face object, this function changes the + * value of `face->size` to the input size handle. + */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSIZES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftsnames.h b/external/freetype/include/freetype/ftsnames.h new file mode 100644 index 000000000..9d5d22bb2 --- /dev/null +++ b/external/freetype/include/freetype/ftsnames.h @@ -0,0 +1,272 @@ +/**************************************************************************** + * + * ftsnames.h + * + * Simple interface to access SFNT 'name' tables (which are used + * to hold font names, copyright info, notices, etc.) (specification). + * + * This is _not_ used to retrieve glyph names! + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSNAMES_H_ +#define FTSNAMES_H_ + + +#include +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * sfnt_names + * + * @title: + * SFNT Names + * + * @abstract: + * Access the names embedded in TrueType and OpenType files. + * + * @description: + * The TrueType and OpenType specifications allow the inclusion of a + * special names table ('name') in font files. This table contains + * textual (and internationalized) information regarding the font, like + * family name, copyright, version, etc. + * + * The definitions below are used to access them if available. + * + * Note that this has nothing to do with glyph names! + * + */ + + + /************************************************************************** + * + * @struct: + * FT_SfntName + * + * @description: + * A structure used to model an SFNT 'name' table entry. + * + * @fields: + * platform_id :: + * The platform ID for `string`. See @TT_PLATFORM_XXX for possible + * values. + * + * encoding_id :: + * The encoding ID for `string`. See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, + * @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX for possible + * values. + * + * language_id :: + * The language ID for `string`. See @TT_MAC_LANGID_XXX and + * @TT_MS_LANGID_XXX for possible values. + * + * Registered OpenType values for `language_id` are always smaller than + * 0x8000; values equal or larger than 0x8000 usually indicate a + * language tag string (introduced in OpenType version 1.6). Use + * function @FT_Get_Sfnt_LangTag with `language_id` as its argument to + * retrieve the associated language tag. + * + * name_id :: + * An identifier for `string`. See @TT_NAME_ID_XXX for possible + * values. + * + * string :: + * The 'name' string. Note that its format differs depending on the + * (platform,encoding) pair, being either a string of bytes (without a + * terminating `NULL` byte) or containing UTF-16BE entities. + * + * string_len :: + * The length of `string` in bytes. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name_Count + * + * @description: + * Retrieve the number of name strings in the SFNT 'name' table. + * + * @input: + * face :: + * A handle to the source face. + * + * @return: + * The number of strings in the 'name' table. + * + * @note: + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Name + * + * @description: + * Retrieve a string of the SFNT 'name' table for a given index. + * + * @input: + * face :: + * A handle to the source face. + * + * idx :: + * The index of the 'name' string. + * + * @output: + * aname :: + * The indexed @FT_SfntName structure. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `aname` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Use @FT_Get_Sfnt_Name_Count to get the total number of available + * 'name' table entries, then do a loop until you get the right platform, + * encoding, and name ID. + * + * 'name' table format~1 entries can use language tags also, see + * @FT_Get_Sfnt_LangTag. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /************************************************************************** + * + * @struct: + * FT_SfntLangTag + * + * @description: + * A structure to model a language tag entry from an SFNT 'name' table. + * + * @fields: + * string :: + * The language tag string, encoded in UTF-16BE (without trailing + * `NULL` bytes). + * + * string_len :: + * The length of `string` in **bytes**. + * + * @note: + * Please refer to the TrueType or OpenType specification for more + * details. + * + * @since: + * 2.8 + */ + typedef struct FT_SfntLangTag_ + { + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntLangTag; + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_LangTag + * + * @description: + * Retrieve the language tag associated with a language ID of an SFNT + * 'name' table entry. + * + * @input: + * face :: + * A handle to the source face. + * + * langID :: + * The language ID, as returned by @FT_Get_Sfnt_Name. This is always a + * value larger than 0x8000. + * + * @output: + * alangTag :: + * The language tag associated with the 'name' table entry's language + * ID. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The `string` array returned in the `alangTag` structure is not + * null-terminated. Note that you don't have to deallocate `string` by + * yourself; FreeType takes care of it if you call @FT_Done_Face. + * + * Only 'name' table format~1 supports language tags. For format~0 + * tables, this function always returns FT_Err_Invalid_Table. For + * invalid format~1 language ID values, FT_Err_Invalid_Argument is + * returned. + * + * This function always returns an error if the config macro + * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. + * + * @since: + * 2.8 + */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ); + + + /* */ + + +FT_END_HEADER + +#endif /* FTSNAMES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftstroke.h b/external/freetype/include/freetype/ftstroke.h new file mode 100644 index 000000000..b3d90802a --- /dev/null +++ b/external/freetype/include/freetype/ftstroke.h @@ -0,0 +1,773 @@ +/**************************************************************************** + * + * ftstroke.h + * + * FreeType path stroker (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSTROKE_H_ +#define FTSTROKE_H_ + +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial glyph. + * It also allows you to retrieve the 'outside' and/or the 'inside' + * borders of the stroke. + * + * This can be useful to generate 'bordered' glyph, i.e., glyphs + * displayed with a colored (and anti-aliased) border around their + * shape. + * + * @order: + * FT_Stroker + * + * FT_Stroker_LineJoin + * FT_Stroker_LineCap + * FT_StrokerBorder + * + * FT_Outline_GetInsideBorder + * FT_Outline_GetOutsideBorder + * + * FT_Glyph_Stroke + * FT_Glyph_StrokeBorder + * + * FT_Stroker_New + * FT_Stroker_Set + * FT_Stroker_Rewind + * FT_Stroker_ParseOutline + * FT_Stroker_Done + * + * FT_Stroker_BeginSubPath + * FT_Stroker_EndSubPath + * + * FT_Stroker_LineTo + * FT_Stroker_ConicTo + * FT_Stroker_CubicTo + * + * FT_Stroker_GetBorderCounts + * FT_Stroker_ExportBorder + * FT_Stroker_GetCounts + * FT_Stroker_Export + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handle to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered in a + * stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used to join + * two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins. The outer corner of the joined + * lines is filled by enclosing the triangular region of the corner + * with a straight line between the outer corners of each stroke. + * + * FT_STROKER_LINEJOIN_MITER_FIXED :: + * Used to render mitered line joins, with fixed bevels if the miter + * limit is exceeded. The outer edges of the strokes for the two + * segments are extended until they meet at an angle. A bevel join + * (see above) is used if the segments meet at too sharp an angle and + * the outer edges meet beyond a distance corresponding to the meter + * limit. This prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_FIXED` generates a miter line join as + * used in PostScript and PDF. + * + * FT_STROKER_LINEJOIN_MITER_VARIABLE :: + * FT_STROKER_LINEJOIN_MITER :: + * Used to render mitered line joins, with variable bevels if the miter + * limit is exceeded. The intersection of the strokes is clipped + * perpendicularly to the bisector, at a distance corresponding to + * the miter limit. This prevents long spikes being created. + * `FT_STROKER_LINEJOIN_MITER_VARIABLE` generates a mitered line join + * as used in XPS. `FT_STROKER_LINEJOIN_MITER` is an alias for + * `FT_STROKER_LINEJOIN_MITER_VARIABLE`, retained for backward + * compatibility. + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL = 1, + FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, + FT_STROKER_LINEJOIN_MITER_FIXED = 3 + + } FT_Stroker_LineJoin; + + + /************************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are rendered in + * a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last point + * itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border in + * @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the 'inside' and 'outside' + * borders. However, there is no direct mapping between these and the + * 'left' and 'right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'inside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the 'outside' + * borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. `NULL` in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The maximum reciprocal sine of half-angle at the miter join, + * expressed as 16.16 fixed-point value. + * + * @note: + * The `radius` is expressed in the same units as the outline + * coordinates. + * + * The `miter_limit` multiplied by the `radius` gives the maximum size + * of a miter spike, at which it is clipped for + * @FT_STROKER_LINEJOIN_MITER_VARIABLE or replaced with a bevel join for + * @FT_STROKER_LINEJOIN_MITER_FIXED. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. You should + * call this function before beginning a new series of calls to + * @FT_Stroker_BeginSubPath or @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with the stroker. + * The resulting outline(s) can be retrieved later by functions like + * @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead of + * a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened` is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct 'border' outlines. + * + * If `opened` is~1, the outline is processed as an open path, and the + * stroker generates a single 'stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is not + * stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. If the + * subpath was not 'opened', this function 'draws' a single line segment + * to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * 'Draw' a single line segment in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * 'Draw' a single quadratic Bezier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * 'Draw' a single cubic Bezier in the stroker's current sub-path, from + * the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bezier control point. + * + * control2 :: + * A pointer to second Bezier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export one of the 'border' or 'stroke' outlines generated by the + * stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to retrieve + * the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export the + * corresponding border to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to get + * sure that there is enough room in your @FT_Outline object to receive + * all new data. + * + * When an outline, or a sub-path, is 'closed', the stroker generates two + * independent 'border' outlines, named 'left' and 'right'. + * + * When the outline, or a sub-path, is 'opened', the stroker merges the + * 'border' outlines with caps. The 'left' border receives all points, + * while the 'right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to retrieve + * all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths with the + * stroker. It returns the number of points and contours necessary to + * export all points/borders from the stroked outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to export all + * borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and contours to your + * outline, but does not try to resize its arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be `NULL`. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but only + * return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise the outside + * border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + * + * Adding stroke may yield a significantly wider and taller glyph + * depending on how large of a radius was used to stroke the glyph. You + * may need to manually adjust horizontal and vertical advance amounts to + * account for this added size. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* FTSTROKE_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/include/freetype/ftsynth.h b/external/freetype/include/freetype/ftsynth.h new file mode 100644 index 000000000..af90967dd --- /dev/null +++ b/external/freetype/include/freetype/ftsynth.h @@ -0,0 +1,104 @@ +/**************************************************************************** + * + * ftsynth.h + * + * FreeType synthesizing code for emboldening and slanting + * (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* 'standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource that should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef FTSYNTH_H_ +#define FTSYNTH_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a 'reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the height, width, and advance metrics are */ + /* increased by the strength of the emboldening -- this even affects */ + /* mono-width fonts! */ + /* */ + /* You can also call @FT_Outline_Get_CBox to get precise values. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Precisely adjust the glyph weight either horizontally or vertically. */ + /* The `xdelta` and `ydelta` values are fractions of the face Em size */ + /* (in fixed-point format). Considering that a regular face would have */ + /* stem widths on the order of 0.1 Em, a delta of 0.05 (0x0CCC) should */ + /* be very noticeable. To increase or decrease the weight, use positive */ + /* or negative values, respectively. */ + FT_EXPORT( void ) + FT_GlyphSlot_AdjustWeight( FT_GlyphSlot slot, + FT_Fixed xdelta, + FT_Fixed ydelta ); + + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* Slant an outline glyph by a given sine of an angle. You can apply */ + /* slant along either x- or y-axis by choosing a corresponding non-zero */ + /* argument. If both slants are non-zero, some affine transformation */ + /* will result. */ + FT_EXPORT( void ) + FT_GlyphSlot_Slant( FT_GlyphSlot slot, + FT_Fixed xslant, + FT_Fixed yslant ); + + /* */ + + +FT_END_HEADER + +#endif /* FTSYNTH_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftsystem.h b/external/freetype/include/freetype/ftsystem.h new file mode 100644 index 000000000..3a08f4912 --- /dev/null +++ b/external/freetype/include/freetype/ftsystem.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * + * ftsystem.h + * + * FreeType low-level system interface definition (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSYSTEM_H_ +#define FTSYSTEM_H_ + + + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * system_interface + * + * @title: + * System Interface + * + * @abstract: + * How FreeType manages memory and i/o. + * + * @description: + * This section contains various definitions related to memory management + * and i/o access. You need to understand this information if you want to + * use a custom memory manager or you own i/o streams. + * + */ + + + /************************************************************************** + * + * M E M O R Y M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************** + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size` bytes from `memory`. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************** + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************** + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************** + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /************************************************************************** + * + * I / O M A N A G E M E N T + * + */ + + + /************************************************************************** + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + * @also: + * See @FT_StreamRec for the publicly accessible fields of a given stream + * object. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************** + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*` in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************** + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset from the start of the stream to seek to. + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * If count >~0, return the number of bytes effectively read by the + * stream (after seeking to `offset`). If count ==~0, return the status + * of the seek operation (non-zero indicates an error). + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************** + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************** + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to `NULL` for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * In case of compressed streams where the size is unknown before + * actually doing the decompression, the value is set to 0x7FFFFFFF. + * (Note that this size value can occur for normal streams also; it is + * thus just a hint.) + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*` + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream's close function. + * + * memory :: + * The memory manager to use to preload frames. This is set internally + * by FreeType and shouldn't be touched by stream implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. In particular, the `FT_GET_XXX` macros use this instead of + * the `pos` field. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + /* */ + + +FT_END_HEADER + +#endif /* FTSYSTEM_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/fttrigon.h b/external/freetype/include/freetype/fttrigon.h new file mode 100644 index 000000000..294981a6f --- /dev/null +++ b/external/freetype/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/**************************************************************************** + * + * fttrigon.h + * + * FreeType trigonometric functions (specification). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTRIGON_H_ +#define FTTRIGON_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * computations + * + */ + + + /************************************************************************** + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed-point value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************** + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************** + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed-point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in the 2d + * plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************** + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `angle2-angle1`. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x` will be `cos(angle)`, and the value of + * `vec.y` will be `sin(angle)`. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The input angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************** + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************** + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* FTTRIGON_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/fttypes.h b/external/freetype/include/freetype/fttypes.h new file mode 100644 index 000000000..5b109f0c7 --- /dev/null +++ b/external/freetype/include/freetype/fttypes.h @@ -0,0 +1,617 @@ +/**************************************************************************** + * + * fttypes.h + * + * FreeType simple types definitions (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTTYPES_H_ +#define FTTYPES_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include +#include + +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * basic_types + * + * @title: + * Basic Data Types + * + * @abstract: + * The basic data types defined by the library. + * + * @description: + * This section contains the basic data types defined by FreeType~2, + * ranging from simple scalar types to bitmap descriptors. More + * font-specific structures are defined in a different section. Note + * that FreeType does not use floating-point data types. Fractional + * values are represented by fixed-point integers, with lower bits + * storing the fractional part. + * + * @order: + * FT_Byte + * FT_Bytes + * FT_Char + * FT_Int + * FT_UInt + * FT_Int16 + * FT_UInt16 + * FT_Int32 + * FT_UInt32 + * FT_Int64 + * FT_UInt64 + * FT_Short + * FT_UShort + * FT_Long + * FT_ULong + * FT_Bool + * FT_Offset + * FT_PtrDist + * FT_String + * FT_Tag + * FT_Error + * FT_Fixed + * FT_Pointer + * FT_Pos + * FT_Vector + * FT_BBox + * FT_Matrix + * FT_FWord + * FT_UFWord + * FT_F2Dot14 + * FT_UnitVector + * FT_F26Dot6 + * FT_Data + * + * FT_MAKE_TAG + * + * FT_Generic + * FT_Generic_Finalizer + * + * FT_Bitmap + * FT_Pixel_Mode + * FT_Palette_Mode + * FT_Glyph_Format + * FT_IMAGE_TAG + * + */ + + + /************************************************************************** + * + * @type: + * FT_Bool + * + * @description: + * A typedef of unsigned char, used for simple booleans. As usual, + * values 1 and~0 represent true and false, respectively. + */ + typedef unsigned char FT_Bool; + + + /************************************************************************** + * + * @type: + * FT_FWord + * + * @description: + * A signed 16-bit integer used to store a distance in original font + * units. + */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /************************************************************************** + * + * @type: + * FT_UFWord + * + * @description: + * An unsigned 16-bit integer used to store a distance in original font + * units. + */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /************************************************************************** + * + * @type: + * FT_Char + * + * @description: + * A simple typedef for the _signed_ char type. + */ + typedef signed char FT_Char; + + + /************************************************************************** + * + * @type: + * FT_Byte + * + * @description: + * A simple typedef for the _unsigned_ char type. + */ + typedef unsigned char FT_Byte; + + + /************************************************************************** + * + * @type: + * FT_Bytes + * + * @description: + * A typedef for constant memory areas. + */ + typedef const FT_Byte* FT_Bytes; + + + /************************************************************************** + * + * @type: + * FT_Tag + * + * @description: + * A typedef for 32-bit tags (as used in the SFNT format). + */ + typedef FT_UInt32 FT_Tag; + + + /************************************************************************** + * + * @type: + * FT_String + * + * @description: + * A simple typedef for the char type, usually used for strings. + */ + typedef char FT_String; + + + /************************************************************************** + * + * @type: + * FT_Short + * + * @description: + * A typedef for signed short. + */ + typedef signed short FT_Short; + + + /************************************************************************** + * + * @type: + * FT_UShort + * + * @description: + * A typedef for unsigned short. + */ + typedef unsigned short FT_UShort; + + + /************************************************************************** + * + * @type: + * FT_Int + * + * @description: + * A typedef for the int type. + */ + typedef signed int FT_Int; + + + /************************************************************************** + * + * @type: + * FT_UInt + * + * @description: + * A typedef for the unsigned int type. + */ + typedef unsigned int FT_UInt; + + + /************************************************************************** + * + * @type: + * FT_Long + * + * @description: + * A typedef for signed long. + */ + typedef signed long FT_Long; + + + /************************************************************************** + * + * @type: + * FT_ULong + * + * @description: + * A typedef for unsigned long. + */ + typedef unsigned long FT_ULong; + + + /************************************************************************** + * + * @type: + * FT_F2Dot14 + * + * @description: + * A signed 2.14 fixed-point type used for unit vectors. + */ + typedef signed short FT_F2Dot14; + + + /************************************************************************** + * + * @type: + * FT_F26Dot6 + * + * @description: + * A signed 26.6 fixed-point type used for vectorial pixel coordinates. + */ + typedef signed long FT_F26Dot6; + + + /************************************************************************** + * + * @type: + * FT_Fixed + * + * @description: + * This type is used to store 16.16 fixed-point values, like scaling + * values or matrix coefficients. + */ + typedef signed long FT_Fixed; + + + /************************************************************************** + * + * @type: + * FT_Error + * + * @description: + * The FreeType error code type. A value of~0 is always interpreted as a + * successful operation. + */ + typedef int FT_Error; + + + /************************************************************************** + * + * @type: + * FT_Pointer + * + * @description: + * A simple typedef for a typeless pointer. + */ + typedef void* FT_Pointer; + + + /************************************************************************** + * + * @type: + * FT_Offset + * + * @description: + * This is equivalent to the ANSI~C `size_t` type, i.e., the largest + * _unsigned_ integer type used to express a file size or position, or a + * memory block size. + */ + typedef size_t FT_Offset; + + + /************************************************************************** + * + * @type: + * FT_PtrDist + * + * @description: + * This is equivalent to the ANSI~C `ptrdiff_t` type, i.e., the largest + * _signed_ integer type used to express the distance between two + * pointers. + */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /************************************************************************** + * + * @struct: + * FT_UnitVector + * + * @description: + * A simple structure used to store a 2D vector unit vector. Uses + * FT_F2Dot14 types. + * + * @fields: + * x :: + * Horizontal coordinate. + * + * y :: + * Vertical coordinate. + */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /************************************************************************** + * + * @struct: + * FT_Matrix + * + * @description: + * A simple structure used to store a 2x2 matrix. Coefficients are in + * 16.16 fixed-point format. The computation performed is: + * + * ``` + * x' = x*xx + y*xy + * y' = x*yx + y*yy + * ``` + * + * @fields: + * xx :: + * Matrix coefficient. + * + * xy :: + * Matrix coefficient. + * + * yx :: + * Matrix coefficient. + * + * yy :: + * Matrix coefficient. + */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /************************************************************************** + * + * @struct: + * FT_Data + * + * @description: + * Read-only binary data represented as a pointer and a length. + * + * @fields: + * pointer :: + * The data. + * + * length :: + * The length of the data in bytes. + */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_UInt length; + + } FT_Data; + + + /************************************************************************** + * + * @functype: + * FT_Generic_Finalizer + * + * @description: + * Describe a function used to destroy the 'client' data of any FreeType + * object. See the description of the @FT_Generic type for details of + * usage. + * + * @input: + * The address of the FreeType object that is under finalization. Its + * client data is accessed through its `generic` field. + */ + typedef void (*FT_Generic_Finalizer)( void* object ); + + + /************************************************************************** + * + * @struct: + * FT_Generic + * + * @description: + * Client applications often need to associate their own data to a + * variety of FreeType core objects. For example, a text layout API + * might want to associate a glyph cache to a given size object. + * + * Some FreeType object contains a `generic` field, of type `FT_Generic`, + * which usage is left to client applications and font servers. + * + * It can be used to store a pointer to client-specific data, as well as + * the address of a 'finalizer' function, which will be called by + * FreeType when the object is destroyed (for example, the previous + * client example would put the address of the glyph cache destructor in + * the `finalizer` field). + * + * @fields: + * data :: + * A typeless pointer to any client-specified data. This field is + * completely ignored by the FreeType library. + * + * finalizer :: + * A pointer to a 'generic finalizer' function, which will be called + * when the object is destroyed. If this field is set to `NULL`, no + * code will be called. + */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /************************************************************************** + * + * @macro: + * FT_MAKE_TAG + * + * @description: + * This macro converts four-letter tags that are used to label TrueType + * tables into an `FT_Tag` type, to be used within FreeType. + * + * @note: + * The produced values **must** be 32-bit integers. Don't redefine this + * macro. + */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( FT_STATIC_BYTE_CAST( FT_Tag, _x1 ) << 24 ) | \ + ( FT_STATIC_BYTE_CAST( FT_Tag, _x2 ) << 16 ) | \ + ( FT_STATIC_BYTE_CAST( FT_Tag, _x3 ) << 8 ) | \ + FT_STATIC_BYTE_CAST( FT_Tag, _x4 ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * list_processing + * + */ + + + /************************************************************************** + * + * @type: + * FT_ListNode + * + * @description: + * Many elements and objects in FreeType are listed through an @FT_List + * record (see @FT_ListRec). As its name suggests, an FT_ListNode is a + * handle to a single list element. + */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /************************************************************************** + * + * @type: + * FT_List + * + * @description: + * A handle to a list record (see @FT_ListRec). + */ + typedef struct FT_ListRec_* FT_List; + + + /************************************************************************** + * + * @struct: + * FT_ListNodeRec + * + * @description: + * A structure used to hold a single list element. + * + * @fields: + * prev :: + * The previous element in the list. `NULL` if first. + * + * next :: + * The next element in the list. `NULL` if last. + * + * data :: + * A typeless pointer to the listed object. + */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /************************************************************************** + * + * @struct: + * FT_ListRec + * + * @description: + * A structure used to hold a simple doubly-linked list. These are used + * in many parts of FreeType. + * + * @fields: + * head :: + * The head (first element) of doubly-linked list. + * + * tail :: + * The tail (last element) of doubly-linked list. + */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + /* */ + + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) +#define FT_BOOL( x ) FT_STATIC_CAST( FT_Bool, (x) != 0 ) + + /* concatenate C tokens */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + /* see `ftmoderr.h` for descriptions of the following macros */ + +#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) + +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_ERR_EQ( x, e ) \ + ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) ) +#define FT_ERR_NEQ( x, e ) \ + ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) ) + + +FT_END_HEADER + +#endif /* FTTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ftwinfnt.h b/external/freetype/include/freetype/ftwinfnt.h new file mode 100644 index 000000000..7b701ea59 --- /dev/null +++ b/external/freetype/include/freetype/ftwinfnt.h @@ -0,0 +1,276 @@ +/**************************************************************************** + * + * ftwinfnt.h + * + * FreeType API for accessing Windows fnt-specific data. + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTWINFNT_H_ +#define FTWINFNT_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * winfnt_fonts + * + * @title: + * Window FNT Files + * + * @abstract: + * Windows FNT-specific API. + * + * @description: + * This section contains the declaration of Windows FNT-specific + * functions. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset` byte in @FT_WinFNT_HeaderRec. + * Exact mapping tables for the various 'cpXXXX' encodings (except for + * 'cp1361') can be found at 'ftp://ftp.unicode.org/Public/' in the + * `MAPPINGS/VENDORS/MICSFT/WINDOWS` subdirectory. 'cp1361' is roughly a + * superset of `MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT`. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a 'don't + * care' value. Valid font files don't contain this value. When + * querying for information about the character set of the font that is + * currently selected into a specified device context, this return + * value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Poettgen : + * + * The 'Windows Font Mapping' article says that `FT_WinFNT_ID_OEM` is + * used for the charset of vector fonts, like `modern.fon`, + * `roman.fon`, and `script.fon` on Windows. + * + * The 'CreateFont' documentation says: The `FT_WinFNT_ID_OEM` value + * specifies a character set that is operating-system dependent. + * + * The 'IFIMETRICS' documentation from the 'Windows Driver Development + * Kit' says: This font supports an OEM-specific character set. The + * OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., 'cp1252'), denotes the + * second default codepage that most international versions of Windows + * have. It is one of the OEM codepages from + * + * https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers + * , + * + * and is used for the 'DOS boxes', to support legacy applications. A + * German Windows version for example usually uses ANSI codepage 1252 + * and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different ordering + * and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_HeaderRec + * + * @description: + * Windows FNT Header info. + */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /************************************************************************** + * + * @struct: + * FT_WinFNT_Header + * + * @description: + * A handle to an @FT_WinFNT_HeaderRec structure. + */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /************************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * aheader :: + * The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + /* */ + + +FT_END_HEADER + +#endif /* FTWINFNT_H_ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/include/freetype/internal/autohint.h b/external/freetype/include/freetype/internal/autohint.h new file mode 100644 index 000000000..bf9c8b7cf --- /dev/null +++ b/external/freetype/include/freetype/internal/autohint.h @@ -0,0 +1,234 @@ +/**************************************************************************** + * + * autohint.h + * + * High-level 'autohint' module-specific interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * The auto-hinter is used to load and automatically hint glyphs if a + * format-specific hinter isn't available. + * + */ + + +#ifndef AUTOHINT_H_ +#define AUTOHINT_H_ + + + /************************************************************************** + * + * A small technical note regarding automatic hinting in order to clarify + * this module interface. + * + * An automatic hinter might compute two kinds of data for a given face: + * + * - global hints: Usually some metrics that describe global properties + * of the face. It is computed by scanning more or less + * aggressively the glyphs in the face, and thus can be + * very slow to compute (even if the size of global hints + * is really small). + * + * - glyph hints: These describe some important features of the glyph + * outline, as well as how to align them. They are + * generally much faster to compute than global hints. + * + * The current FreeType auto-hinter does a pretty good job while performing + * fast computations for both global and glyph hints. However, we might be + * interested in introducing more complex and powerful algorithms in the + * future, like the one described in the John D. Hobby paper, which + * unfortunately requires a lot more horsepower. + * + * Because a sufficiently sophisticated font management system would + * typically implement an LRU cache of opened face objects to reduce memory + * usage, it is a good idea to be able to avoid recomputing global hints + * every time the same face is re-opened. + * + * We thus provide the ability to cache global hints outside of the face + * object, in order to speed up font re-opening time. Of course, this + * feature is purely optional, so most client programs won't even notice + * it. + * + * I initially thought that it would be a good idea to cache the glyph + * hints too. However, my general idea now is that if you really need to + * cache these too, you are simply in need of a new font format, where all + * this information could be stored within the font file and decoded on the + * fly. + * + */ + + +#include + + +FT_BEGIN_HEADER + + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlobalGetFunc + * + * @description: + * Retrieve the global hints computed for a given face object. The + * resulting data is dissociated from the face and will survive a call to + * FT_Done_Face(). It must be discarded through the API + * FT_AutoHinter_GlobalDoneFunc(). + * + * @input: + * hinter :: + * A handle to the source auto-hinter. + * + * face :: + * A handle to the source face object. + * + * @output: + * global_hints :: + * A typeless pointer to the global hints. + * + * global_len :: + * The size in bytes of the global hints. + */ + typedef void + (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlobalDoneFunc + * + * @description: + * Discard the global hints retrieved through + * FT_AutoHinter_GlobalGetFunc(). This is the only way these hints are + * freed from memory. + * + * @input: + * hinter :: + * A handle to the auto-hinter module. + * + * global :: + * A pointer to retrieved global hints to discard. + */ + typedef void + (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, + void* global ); + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlobalResetFunc + * + * @description: + * This function is used to recompute the global metrics in a given font. + * This is useful when global font data changes (e.g. Multiple Masters + * fonts where blend coordinates change). + * + * @input: + * hinter :: + * A handle to the source auto-hinter. + * + * face :: + * A handle to the face. + */ + typedef void + (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, + FT_Face face ); + + + /************************************************************************** + * + * @functype: + * FT_AutoHinter_GlyphLoadFunc + * + * @description: + * This function is used to load, scale, and automatically hint a glyph + * from a given face. + * + * @input: + * face :: + * A handle to the face. + * + * glyph_index :: + * The glyph index. + * + * load_flags :: + * The load flags. + * + * @note: + * This function is capable of loading composite glyphs by hinting each + * sub-glyph independently (which improves quality). + * + * It will call the font driver with @FT_Load_Glyph, with + * @FT_LOAD_NO_SCALE set. + */ + typedef FT_Error + (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /************************************************************************** + * + * @struct: + * FT_AutoHinter_InterfaceRec + * + * @description: + * The auto-hinter module's interface. + */ + typedef struct FT_AutoHinter_InterfaceRec_ + { + FT_AutoHinter_GlobalResetFunc reset_face; + FT_AutoHinter_GlobalGetFunc get_global_hints; + FT_AutoHinter_GlobalDoneFunc done_global_hints; + FT_AutoHinter_GlyphLoadFunc load_glyph; + + } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface; + + +#define FT_DECLARE_AUTOHINTER_INTERFACE( class_ ) \ + FT_CALLBACK_TABLE const FT_AutoHinter_InterfaceRec class_; + +#define FT_DEFINE_AUTOHINTER_INTERFACE( \ + class_, \ + reset_face_, \ + get_global_hints_, \ + done_global_hints_, \ + load_glyph_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_AutoHinter_InterfaceRec class_ = \ + { \ + reset_face_, \ + get_global_hints_, \ + done_global_hints_, \ + load_glyph_ \ + }; + + +FT_END_HEADER + +#endif /* AUTOHINT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/cffotypes.h b/external/freetype/include/freetype/internal/cffotypes.h new file mode 100644 index 000000000..50d535384 --- /dev/null +++ b/external/freetype/include/freetype/internal/cffotypes.h @@ -0,0 +1,107 @@ +/**************************************************************************** + * + * cffotypes.h + * + * Basic OpenType/CFF object type definitions (specification). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFOTYPES_H_ +#define CFFOTYPES_H_ + +#include +#include +#include +#include +#include + + +FT_BEGIN_HEADER + + + typedef TT_Face CFF_Face; + + + /************************************************************************** + * + * @type: + * CFF_Size + * + * @description: + * A handle to an OpenType size object. + */ + typedef struct CFF_SizeRec_ + { + FT_SizeRec root; + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + + } CFF_SizeRec, *CFF_Size; + + + /************************************************************************** + * + * @type: + * CFF_GlyphSlot + * + * @description: + * A handle to an OpenType glyph slot object. + */ + typedef struct CFF_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CFF_GlyphSlotRec, *CFF_GlyphSlot; + + + /************************************************************************** + * + * @type: + * CFF_Internal + * + * @description: + * The interface to the 'internal' field of `FT_Size`. + */ + typedef struct CFF_InternalRec_ + { + PSH_Globals topfont; + PSH_Globals subfonts[CFF_MAX_CID_FONTS]; + + } CFF_InternalRec, *CFF_Internal; + + + /************************************************************************** + * + * Subglyph transformation record. + */ + typedef struct CFF_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } CFF_Transform; + + +FT_END_HEADER + + +#endif /* CFFOTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/cfftypes.h b/external/freetype/include/freetype/internal/cfftypes.h new file mode 100644 index 000000000..c2521764c --- /dev/null +++ b/external/freetype/include/freetype/internal/cfftypes.h @@ -0,0 +1,416 @@ +/**************************************************************************** + * + * cfftypes.h + * + * Basic OpenType/CFF type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFTYPES_H_ +#define CFFTYPES_H_ + + +#include +#include +#include +#include +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * CFF_IndexRec + * + * @description: + * A structure used to model a CFF Index table. + * + * @fields: + * stream :: + * The source input stream. + * + * start :: + * The position of the first index byte in the input stream. + * + * count :: + * The number of elements in the index. + * + * off_size :: + * The size in bytes of object offsets in index. + * + * data_offset :: + * The position of first data byte in the index's bytes. + * + * data_size :: + * The size of the data table in this index. + * + * offsets :: + * A table of element offsets in the index. Must be loaded explicitly. + * + * bytes :: + * If the index is loaded in memory, its bytes. + */ + typedef struct CFF_IndexRec_ + { + FT_Stream stream; + FT_ULong start; + FT_UInt hdr_size; + FT_UInt count; + FT_Byte off_size; + FT_ULong data_offset; + FT_ULong data_size; + + FT_ULong* offsets; + FT_Byte* bytes; + + } CFF_IndexRec, *CFF_Index; + + + typedef struct CFF_EncodingRec_ + { + FT_UInt format; + FT_ULong offset; + + FT_UInt count; + FT_UShort sids [256]; /* avoid dynamic allocations */ + FT_UShort codes[256]; + + } CFF_EncodingRec, *CFF_Encoding; + + + typedef struct CFF_CharsetRec_ + { + + FT_UInt format; + FT_ULong offset; + + FT_UShort* sids; + FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ + /* for CID-keyed fonts */ + FT_UInt max_cid; + FT_UInt num_glyphs; + + } CFF_CharsetRec, *CFF_Charset; + + + /* cf. similar fields in file `ttgxvar.h' from the `truetype' module */ + + typedef struct CFF_VarData_ + { +#if 0 + FT_UInt itemCount; /* not used; always zero */ + FT_UInt shortDeltaCount; /* not used; always zero */ +#endif + + FT_UInt regionIdxCount; /* number of region indexes */ + FT_UInt* regionIndices; /* array of `regionIdxCount' indices; */ + /* these index `varRegionList' */ + } CFF_VarData; + + + /* contribution of one axis to a region */ + typedef struct CFF_AxisCoords_ + { + FT_Fixed startCoord; + FT_Fixed peakCoord; /* zero peak means no effect (factor = 1) */ + FT_Fixed endCoord; + + } CFF_AxisCoords; + + + typedef struct CFF_VarRegion_ + { + CFF_AxisCoords* axisList; /* array of axisCount records */ + + } CFF_VarRegion; + + + typedef struct CFF_VStoreRec_ + { + FT_UInt dataCount; + CFF_VarData* varData; /* array of dataCount records */ + /* vsindex indexes this array */ + FT_UShort axisCount; + FT_UInt regionCount; /* total number of regions defined */ + CFF_VarRegion* varRegionList; + + } CFF_VStoreRec, *CFF_VStore; + + + /* forward reference */ + typedef struct CFF_FontRec_* CFF_Font; + + + /* This object manages one cached blend vector. */ + /* */ + /* There is a BlendRec for Private DICT parsing in each subfont */ + /* and a BlendRec for charstrings in CF2_Font instance data. */ + /* A cached BV may be used across DICTs or Charstrings if inputs */ + /* have not changed. */ + /* */ + /* `usedBV' is reset at the start of each parse or charstring. */ + /* vsindex cannot be changed after a BV is used. */ + /* */ + /* Note: NDV is long (32/64 bit), while BV is 16.16 (FT_Int32). */ + typedef struct CFF_BlendRec_ + { + FT_Bool builtBV; /* blendV has been built */ + FT_Bool usedBV; /* blendV has been used */ + CFF_Font font; /* top level font struct */ + FT_UInt lastVsindex; /* last vsindex used */ + FT_UInt lenNDV; /* normDV length (aka numAxes) */ + FT_Fixed* lastNDV; /* last NDV used */ + FT_UInt lenBV; /* BlendV length (aka numMasters) */ + FT_Int32* BV; /* current blendV (per DICT/glyph) */ + + } CFF_BlendRec, *CFF_Blend; + + + typedef struct CFF_FontRecDictRec_ + { + FT_UInt version; + FT_UInt notice; + FT_UInt copyright; + FT_UInt full_name; + FT_UInt family_name; + FT_UInt weight; + FT_Bool is_fixed_pitch; + FT_Fixed italic_angle; + FT_Fixed underline_position; + FT_Fixed underline_thickness; + FT_Int paint_type; + FT_Int charstring_type; + FT_Matrix font_matrix; + FT_Bool has_font_matrix; + FT_ULong units_per_em; /* temporarily used as scaling value also */ + FT_Vector font_offset; + FT_ULong unique_id; + FT_BBox font_bbox; + FT_Pos stroke_width; + FT_ULong charset_offset; + FT_ULong encoding_offset; + FT_ULong charstrings_offset; + FT_ULong private_offset; + FT_ULong private_size; + FT_Long synthetic_base; + FT_UInt embedded_postscript; + + /* these should only be used for the top-level font dictionary */ + FT_UInt cid_registry; + FT_UInt cid_ordering; + FT_Long cid_supplement; + + FT_Long cid_font_version; + FT_Long cid_font_revision; + FT_Long cid_font_type; + FT_ULong cid_count; + FT_ULong cid_uid_base; + FT_ULong cid_fd_array_offset; + FT_ULong cid_fd_select_offset; + FT_UInt cid_font_name; + + /* the next fields come from the data of the deprecated */ + /* `MultipleMaster' operator; they are needed to parse the (also */ + /* deprecated) `blend' operator in Type 2 charstrings */ + FT_UShort num_designs; + FT_UShort num_axes; + + /* fields for CFF2 */ + FT_ULong vstore_offset; + FT_UInt maxstack; + + } CFF_FontRecDictRec, *CFF_FontRecDict; + + + /* forward reference */ + typedef struct CFF_SubFontRec_* CFF_SubFont; + + + typedef struct CFF_PrivateRec_ + { + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Pos blue_values[14]; + FT_Pos other_blues[10]; + FT_Pos family_blues[14]; + FT_Pos family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Pos blue_shift; + FT_Pos blue_fuzz; + FT_Pos standard_width; + FT_Pos standard_height; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Pos snap_widths[13]; + FT_Pos snap_heights[13]; + FT_Bool force_bold; + FT_Fixed force_bold_threshold; + FT_Int lenIV; + FT_Int language_group; + FT_Fixed expansion_factor; + FT_Long initial_random_seed; + FT_ULong local_subrs_offset; + FT_Pos default_width; + FT_Pos nominal_width; + + /* fields for CFF2 */ + FT_UInt vsindex; + CFF_SubFont subfont; + + } CFF_PrivateRec, *CFF_Private; + + + typedef struct CFF_FDSelectRec_ + { + FT_Byte format; + FT_UInt range_count; + + /* that's the table, taken from the file `as is' */ + FT_Byte* data; + FT_UInt data_size; + + /* small cache for format 3 only */ + FT_UInt cache_first; + FT_UInt cache_count; + FT_Byte cache_fd; + + } CFF_FDSelectRec, *CFF_FDSelect; + + + /* A SubFont packs a font dict and a private dict together. They are */ + /* needed to support CID-keyed CFF fonts. */ + typedef struct CFF_SubFontRec_ + { + CFF_FontRecDictRec font_dict; + CFF_PrivateRec private_dict; + + /* fields for CFF2 */ + CFF_BlendRec blend; /* current blend vector */ + FT_UInt lenNDV; /* current length NDV or zero */ + FT_Fixed* NDV; /* ptr to current NDV or NULL */ + + /* `blend_stack' is a writable buffer to hold blend results. */ + /* This buffer is to the side of the normal cff parser stack; */ + /* `cff_parse_blend' and `cff_blend_doBlend' push blend results here. */ + /* The normal stack then points to these values instead of the DICT */ + /* because all other operators in Private DICT clear the stack. */ + /* `blend_stack' could be cleared at each operator other than blend. */ + /* Blended values are stored as 5-byte fixed-point values. */ + + FT_Byte* blend_stack; /* base of stack allocation */ + FT_Byte* blend_top; /* first empty slot */ + FT_UInt blend_used; /* number of bytes in use */ + FT_UInt blend_alloc; /* number of bytes allocated */ + + CFF_IndexRec local_subrs_index; + FT_Byte** local_subrs; /* array of pointers */ + /* into Local Subrs INDEX data */ + + FT_UInt32 random; + + } CFF_SubFontRec; + + +#define CFF_MAX_CID_FONTS 256 + + + typedef struct CFF_FontRec_ + { + FT_Library library; + FT_Stream stream; + FT_Memory memory; /* TODO: take this from stream->memory? */ + FT_ULong base_offset; /* offset to start of CFF */ + FT_UInt num_faces; + FT_UInt num_glyphs; + + FT_Byte version_major; + FT_Byte version_minor; + FT_Byte header_size; + + FT_UInt top_dict_length; /* cff2 only */ + + FT_Bool cff2; + + CFF_IndexRec name_index; + CFF_IndexRec top_dict_index; + CFF_IndexRec global_subrs_index; + + CFF_EncodingRec encoding; + CFF_CharsetRec charset; + + CFF_IndexRec charstrings_index; + CFF_IndexRec font_dict_index; + CFF_IndexRec private_index; + CFF_IndexRec local_subrs_index; + + FT_String* font_name; + + /* array of pointers into Global Subrs INDEX data */ + FT_Byte** global_subrs; + + /* array of pointers into String INDEX data stored at string_pool */ + FT_UInt num_strings; + FT_Byte** strings; + FT_Byte* string_pool; + FT_ULong string_pool_size; + + CFF_SubFontRec top_font; + FT_UInt num_subfonts; + CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; + + CFF_FDSelectRec fd_select; + + /* interface to PostScript hinter */ + PSHinter_Service pshinter; + + /* interface to Postscript Names service */ + FT_Service_PsCMaps psnames; + + /* interface to CFFLoad service */ + const void* cffload; + + /* since version 2.3.0 */ + PS_FontInfoRec* font_info; /* font info dictionary */ + + /* since version 2.3.6 */ + FT_String* registry; + FT_String* ordering; + + /* since version 2.4.12 */ + FT_Generic cf2_instance; + + /* since version 2.7.1 */ + CFF_VStoreRec vstore; /* parsed vstore structure */ + + /* since version 2.9 */ + PS_FontExtraRec* font_extra; + + } CFF_FontRec; + + +FT_END_HEADER + +#endif /* CFFTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/compiler-macros.h b/external/freetype/include/freetype/internal/compiler-macros.h new file mode 100644 index 000000000..6f6765097 --- /dev/null +++ b/external/freetype/include/freetype/internal/compiler-macros.h @@ -0,0 +1,343 @@ +/**************************************************************************** + * + * internal/compiler-macros.h + * + * Compiler-specific macro definitions used internally by FreeType. + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef INTERNAL_COMPILER_MACROS_H_ +#define INTERNAL_COMPILER_MACROS_H_ + +#include + +FT_BEGIN_HEADER + + /* Fix compiler warning with sgi compiler. */ +#if defined( __sgi ) && !defined( __GNUC__ ) +# if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +# pragma set woff 3505 +# endif +#endif + + /* Fix compiler warning with sgi compiler. */ +#if defined( __sgi ) && !defined( __GNUC__ ) +# if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +# pragma set woff 3505 +# endif +#endif + + /* Newer compilers warn for fall-through case statements. */ +#ifndef FALL_THROUGH +# if ( defined( __STDC_VERSION__ ) && __STDC_VERSION__ > 201710L ) || \ + ( defined( __cplusplus ) && __cplusplus > 201402L ) +# define FALL_THROUGH [[__fallthrough__]] +# elif ( defined( __GNUC__ ) && __GNUC__ >= 7 ) || \ + ( defined( __clang__ ) && \ + ( defined( __apple_build_version__ ) \ + ? __apple_build_version__ >= 12000000 \ + : __clang_major__ >= 10 ) ) +# define FALL_THROUGH __attribute__(( __fallthrough__ )) +# else +# define FALL_THROUGH ( (void)0 ) +# endif +#endif + + /* + * When defining a macro that expands to a non-trivial C statement, use + * FT_BEGIN_STMNT and FT_END_STMNT to enclose the macro's body. This + * ensures there are no surprises when the macro is invoked in conditional + * branches. + * + * Example: + * + * #define LOG( ... ) \ + * FT_BEGIN_STMNT \ + * if ( logging_enabled ) \ + * log( __VA_ARGS__ ); \ + * FT_END_STMNT + */ +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) + + /* + * FT_DUMMY_STMNT expands to an empty C statement. Useful for + * conditionally defined statement macros. + * + * Example: + * + * #ifdef BUILD_CONFIG_LOGGING + * #define LOG( ... ) \ + * FT_BEGIN_STMNT \ + * if ( logging_enabled ) \ + * log( __VA_ARGS__ ); \ + * FT_END_STMNT + * #else + * # define LOG( ... ) FT_DUMMY_STMNT + * #endif + */ +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + +#ifdef __UINTPTR_TYPE__ + /* + * GCC and Clang both provide a `__UINTPTR_TYPE__` that can be used to + * avoid a dependency on `stdint.h`. + */ +# define FT_UINT_TO_POINTER( x ) (void *)(__UINTPTR_TYPE__)(x) +#elif defined( _WIN64 ) + /* only 64bit Windows uses the LLP64 data model, i.e., */ + /* 32-bit integers, 64-bit pointers. */ +# define FT_UINT_TO_POINTER( x ) (void *)(unsigned __int64)(x) +#else +# define FT_UINT_TO_POINTER( x ) (void *)(unsigned long)(x) +#endif + + /* + * Use `FT_TYPEOF( type )` to cast a value to `type`. This is useful to + * suppress signedness compilation warnings in macros. + * + * Example: + * + * #define PAD_( x, n ) ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) ) + * + * (The `typeof` condition is taken from gnulib's `intprops.h` header + * file.) + */ +#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ + ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ + defined( __IBM__TYPEOF__ ) ) || \ + ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) +#define FT_TYPEOF( type ) ( __typeof__ ( type ) ) +#else +#define FT_TYPEOF( type ) /* empty */ +#endif + + /* + * Mark a function declaration as internal to the library. This ensures + * that it will not be exposed by default to client code, and helps + * generate smaller and faster code on ELF-based platforms. Place this + * before a function declaration. + */ + + /* Visual C, mingw */ +#if defined( _WIN32 ) +#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */ + + /* gcc, clang */ +#elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ ) +#define FT_INTERNAL_FUNCTION_ATTRIBUTE \ + __attribute__(( visibility( "hidden" ) )) + + /* Sun */ +#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 +#define FT_INTERNAL_FUNCTION_ATTRIBUTE __hidden + +#else +#define FT_INTERNAL_FUNCTION_ATTRIBUTE /* empty */ +#endif + + /* + * FreeType supports compilation of its C sources with a C++ compiler (in + * C++ mode); this introduces a number of subtle issues. + * + * The main one is that a C++ function declaration and its definition must + * have the same 'linkage'. Because all FreeType headers declare their + * functions with C linkage (i.e., within an `extern "C" { ... }` block + * due to the magic of FT_BEGIN_HEADER and FT_END_HEADER), their + * definition in FreeType sources should also be prefixed with `extern + * "C"` when compiled in C++ mode. + * + * The `FT_FUNCTION_DECLARATION` and `FT_FUNCTION_DEFINITION` macros are + * provided to deal with this case, as well as `FT_CALLBACK_DEF` and its + * siblings below. + */ + + /* + * `FT_FUNCTION_DECLARATION( type )` can be used to write a C function + * declaration to ensure it will have C linkage when the library is built + * with a C++ compiler. The parameter is the function's return type, so a + * declaration would look like + * + * FT_FUNCTION_DECLARATION( int ) + * foo( int x ); + * + * NOTE: This requires that all uses are inside of `FT_BEGIN_HEADER ... + * FT_END_HEADER` blocks, which guarantees that the declarations have C + * linkage when the headers are included by C++ sources. + * + * NOTE: Do not use directly. Use `FT_LOCAL`, `FT_BASE`, and `FT_EXPORT` + * instead. + */ +#define FT_FUNCTION_DECLARATION( x ) extern x + + /* + * Same as `FT_FUNCTION_DECLARATION`, but for function definitions instead. + * + * NOTE: Do not use directly. Use `FT_LOCAL_DEF`, `FT_BASE_DEF`, and + * `FT_EXPORT_DEF` instead. + */ +#ifdef __cplusplus +#define FT_FUNCTION_DEFINITION( x ) extern "C" x +#else +#define FT_FUNCTION_DEFINITION( x ) x +#endif + + /* + * Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, respectively, + * an internal FreeType function that is only used by the sources of a + * single `src/module/` directory. This ensures that the functions are + * turned into static ones at build time, resulting in smaller and faster + * code. + */ +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#define FT_LOCAL( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \ + FT_FUNCTION_DECLARATION( x ) +#define FT_LOCAL_DEF( x ) FT_FUNCTION_DEFINITION( x ) + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + /* + * Use `FT_LOCAL_ARRAY` and `FT_LOCAL_ARRAY_DEF` to declare and define, + * respectively, a constant array that must be accessed from several + * sources in the same `src/module/` sub-directory, and which are internal + * to the library. + */ +#define FT_LOCAL_ARRAY( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \ + extern const x +#define FT_LOCAL_ARRAY_DEF( x ) FT_FUNCTION_DEFINITION( const x ) + + /* + * `Use FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, an + * internal library function that is used by more than a single module. + */ +#define FT_BASE( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE \ + FT_FUNCTION_DECLARATION( x ) +#define FT_BASE_DEF( x ) FT_FUNCTION_DEFINITION( x ) + + + /* + * NOTE: Conditionally define `FT_EXPORT_VAR` due to its definition in + * `src/smooth/ftgrays.h` to make the header more portable. + */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) FT_FUNCTION_DECLARATION( x ) +#endif + + /* + * When compiling FreeType as a DLL or DSO with hidden visibility, + * some systems/compilers need a special attribute in front OR after + * the return type of function declarations. + * + * Two macros are used within the FreeType source code to define + * exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. + * + * - `FT_EXPORT( return_type )` + * + * is used in a function declaration, as in + * + * ``` + * FT_EXPORT( FT_Error ) + * FT_Init_FreeType( FT_Library* alibrary ); + * ``` + * + * - `FT_EXPORT_DEF( return_type )` + * + * is used in a function definition, as in + * + * ``` + * FT_EXPORT_DEF( FT_Error ) + * FT_Init_FreeType( FT_Library* alibrary ) + * { + * ... some code ... + * return FT_Err_Ok; + * } + * ``` + * + * You can provide your own implementation of `FT_EXPORT` and + * `FT_EXPORT_DEF` here if you want. + * + * To export a variable, use `FT_EXPORT_VAR`. + */ + + /* See `freetype/config/public-macros.h` for the `FT_EXPORT` definition */ +#define FT_EXPORT_DEF( x ) FT_FUNCTION_DEFINITION( x ) + + /* + * The following macros are needed to compile the library with a + * C++ compiler and with 16bit compilers. + */ + + /* + * This is special. Within C++, you must specify `extern "C"` for + * functions which are used via function pointers, and you also + * must do that for structures which contain function pointers to + * assure C linkage -- it's not possible to have (local) anonymous + * functions which are accessed by (global) function pointers. + * + * + * FT_CALLBACK_DEF is used to _define_ a callback function, + * located in the same source code file as the structure that uses + * it. FT_COMPARE_DEF, in addition, ensures the `cdecl` calling + * convention on x86, required by the C library function `qsort`. + * + * FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare + * and define a callback function, respectively, in a similar way + * as FT_BASE and FT_BASE_DEF work. + * + * FT_CALLBACK_TABLE is used to _declare_ a constant variable that + * contains pointers to callback functions. + * + * FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable + * that contains pointers to callback functions. + * + * + * Some 16bit compilers have to redefine these macros to insert + * the infamous `_cdecl` or `__fastcall` declarations. + */ +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif + +#if defined( __GNUC__ ) && defined( __i386__ ) +#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) __attribute__(( cdecl )) +#elif defined( _MSC_VER ) && defined( _M_IX86 ) +#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) __cdecl +#elif defined( __WATCOMC__ ) && __WATCOMC__ >= 1240 +#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) __watcall +#else +#define FT_COMPARE_DEF( x ) FT_CALLBACK_DEF( x ) +#endif + +#define FT_BASE_CALLBACK( x ) FT_FUNCTION_DECLARATION( x ) +#define FT_BASE_CALLBACK_DEF( x ) FT_FUNCTION_DEFINITION( x ) + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + +FT_END_HEADER + +#endif /* INTERNAL_COMPILER_MACROS_H_ */ diff --git a/external/freetype/include/freetype/internal/ftcalc.h b/external/freetype/include/freetype/internal/ftcalc.h new file mode 100644 index 000000000..d9aea2360 --- /dev/null +++ b/external/freetype/include/freetype/internal/ftcalc.h @@ -0,0 +1,581 @@ +/**************************************************************************** + * + * ftcalc.h + * + * Arithmetic computations (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCALC_H_ +#define FTCALC_H_ + + +#include + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * FT_MulDiv() and FT_MulFix() are declared in freetype.h. + * + */ + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ + +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 t, t2; + + + __asm + { + smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ + mov a, t, asr #31 /* a = (hi >> 31) */ + add a, a, #0x8000 /* a += 0x8000 */ + adds t2, t2, a /* t2 += a */ + adc t, t, #0 /* t += carry */ + mov a, t2, lsr #16 /* a = t2 >> 16 */ + orr a, a, t, lsl #16 /* a |= t << 16 */ + } + return a; + } + +#endif /* __CC_ARM || __ARMCC__ */ + + +#ifdef __GNUC__ + +#if defined( __arm__ ) && \ + ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \ + !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) + +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 t, t2; + + + __asm__ __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ +#if defined( __clang__ ) && defined( __thumb2__ ) + "add.w %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ +#else + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ +#endif + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) + : "cc" ); + return a; + } + +#endif /* __arm__ && */ + /* ( __thumb2__ || !__thumb__ ) && */ + /* !( __CC_ARM || __ARMCC__ ) */ + + +#if defined( __i386__ ) + +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "=d"(b) + : "a"(a), "d"(b) + : "%ecx", "cc" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + + +#ifdef _MSC_VER /* Visual C++ */ + +#ifdef _M_IX86 + +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + FT_Int32 result; + + __asm + { + mov eax, a + mov edx, b + imul edx + mov ecx, edx + sar ecx, 31 + add ecx, 8000h + add eax, ecx + adc edx, 0 + shr eax, 16 + shl edx, 16 + add eax, edx + mov result, eax + } + return result; + } + +#endif /* _M_IX86 */ + +#endif /* _MSC_VER */ + + +#if defined( __GNUC__ ) && defined( __x86_64__ ) + +#define FT_MULFIX_ASSEMBLER FT_MulFix_x86_64 + + static __inline__ FT_Int32 + FT_MulFix_x86_64( FT_Int32 a, + FT_Int32 b ) + { + /* Temporarily disable the warning that C90 doesn't support */ + /* `long long'. */ +#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wlong-long" +#endif + +#if 1 + /* Technically not an assembly fragment, but GCC does a really good */ + /* job at inlining it and generating good machine code for it. */ + long long ret, tmp; + + + ret = (long long)a * b; + tmp = ret >> 63; + ret += 0x8000 + tmp; + + return (FT_Int32)( ret >> 16 ); +#else + + /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine */ + /* code from the lines below. The main issue is that `wide_a' is not */ + /* properly initialized by sign-extending `a'. Instead, the generated */ + /* machine code assumes that the register that contains `a' on input */ + /* can be used directly as a 64-bit value, which is wrong most of the */ + /* time. */ + long long wide_a = (long long)a; + long long wide_b = (long long)b; + long long result; + + + __asm__ __volatile__ ( + "imul %2, %1\n" + "mov %1, %0\n" + "sar $63, %0\n" + "lea 0x8000(%1, %0), %0\n" + "sar $16, %0\n" + : "=&r"(result), "=&r"(wide_a) + : "r"(wide_b) + : "cc" ); + + return (FT_Int32)result; +#endif + +#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) +#pragma GCC diagnostic pop +#endif + } + +#endif /* __GNUC__ && __x86_64__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MulFix( a, b ) FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) ) +#endif +#endif + + + /************************************************************************** + * + * @function: + * FT_MulDiv_No_Round + * + * @description: + * A very simple function used to perform the computation '(a*b)/c' + * (without rounding) with maximum accuracy (it uses a 64-bit + * intermediate integer whenever necessary). + * + * This function isn't necessarily as fast as some processor-specific + * operations, but is at least completely portable. + * + * @input: + * a :: + * The first multiplier. + * b :: + * The second multiplier. + * c :: + * The divisor. + * + * @return: + * The result of '(a*b)/c'. This function never traps when trying to + * divide by zero; it simply returns 'MaxInt' or 'MinInt' depending on + * the signs of 'a' and 'b'. + */ + FT_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + + + /************************************************************************** + * + * @function: + * FT_MulAddFix + * + * @description: + * Compute `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`, where `s[n]` is + * usually a 16.16 scalar. + * + * @input: + * s :: + * The array of scalars. + * f :: + * The array of factors. + * count :: + * The number of entries in the array. + * + * @return: + * The result of `(s[0] * f[0] + s[1] * f[1] + ...) / 0x10000`. + * + * @note: + * This function is currently used for the scaled delta computation of + * variation stores. It internally uses 64-bit data types when + * available, otherwise it emulates 64-bit math by using 32-bit + * operations, which produce a correct result but most likely at a slower + * performance in comparison to the implementation base on `int64_t`. + * + */ + FT_BASE( FT_Int32 ) + FT_MulAddFix( FT_Fixed* s, + FT_Int32* f, + FT_UInt count ); + + + /* + * A variant of FT_Matrix_Multiply which scales its result afterwards. The + * idea is that both `a' and `b' are scaled by factors of 10 so that the + * values are as precise as possible to get a correct result during the + * 64bit multiplication. Let `sa' and `sb' be the scaling factors of `a' + * and `b', respectively, then the scaling factor of the result is `sa*sb'. + */ + FT_BASE( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ); + + + /* + * Check a matrix. If the transformation would lead to extreme shear or + * extreme scaling, for example, return 0. If everything is OK, return 1. + * + * Based on geometric considerations we use the following inequality to + * identify a degenerate matrix. + * + * 32 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2 + * + * Value 32 is heuristic. + */ + FT_BASE( FT_Bool ) + FT_Matrix_Check( const FT_Matrix* matrix ); + + + /* + * A variant of FT_Vector_Transform. See comments for + * FT_Matrix_Multiply_Scaled. + */ + FT_BASE( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ); + + + /* + * This function normalizes a vector and returns its original length. The + * normalized vector is a 16.16 fixed-point unit vector with length close + * to 0x10000. The accuracy of the returned length is limited to 16 bits + * also. The function utilizes quick inverse square root approximation + * without divisions and square roots relying on Newton's iterations + * instead. + */ + FT_BASE( FT_UInt32 ) + FT_Vector_NormLen( FT_Vector* vector ); + + + /* + * Return -1, 0, or +1, depending on the orientation of a given corner. We + * use the Cartesian coordinate system, with positive vertical values going + * upwards. The function returns +1 if the corner turns to the left, -1 to + * the right, and 0 for undecidable cases. + */ + FT_BASE( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + + /* + * Return TRUE if a corner is flat or nearly flat. This is equivalent to + * saying that the corner point is close to its neighbors, or inside an + * ellipse defined by the neighbor focal points to be more precise. + */ + FT_BASE( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + + /* + * Return the most significant bit index. + */ + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + +#if defined( __clang__ ) || ( defined( __GNUC__ ) && \ + ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) ) ) + +#if FT_SIZEOF_INT == 4 + +#define FT_MSB( x ) ( 31 - __builtin_clz( x ) ) + +#elif FT_SIZEOF_LONG == 4 + +#define FT_MSB( x ) ( 31 - __builtin_clzl( x ) ) + +#endif + +#elif defined( _MSC_VER ) && _MSC_VER >= 1400 + +#if defined( _WIN32_WCE ) + +#include +#pragma intrinsic( _CountLeadingZeros ) + +#define FT_MSB( x ) ( 31 - _CountLeadingZeros( x ) ) + +#elif defined( _M_ARM64 ) || defined( _M_ARM ) + +#include +#pragma intrinsic( _CountLeadingZeros ) + +#define FT_MSB( x ) ( 31 - _CountLeadingZeros( x ) ) + +#elif defined( _M_IX86 ) || defined( _M_AMD64 ) || defined( _M_IA64 ) + +#include +#pragma intrinsic( _BitScanReverse ) + + static __inline FT_Int32 + FT_MSB_i386( FT_UInt32 x ) + { + unsigned long where; + + + _BitScanReverse( &where, x ); + + return (FT_Int32)where; + } + +#define FT_MSB( x ) FT_MSB_i386( x ) + +#endif + +#elif defined( __WATCOMC__ ) && defined( __386__ ) + + extern __inline FT_Int32 + FT_MSB_i386( FT_UInt32 x ); + +#pragma aux FT_MSB_i386 = \ + "bsr eax, eax" \ + __parm [__eax] __nomemory \ + __value [__eax] \ + __modify __exact [__eax] __nomemory; + +#define FT_MSB( x ) FT_MSB_i386( x ) + +#elif defined( __DECC ) || defined( __DECCXX ) + +#include + +#define FT_MSB( x ) (FT_Int)( 63 - _leadz( x ) ) + +#elif defined( _CRAYC ) + +#include + +#define FT_MSB( x ) (FT_Int)( 31 - _leadz32( x ) ) + +#endif /* FT_MSB macro definitions */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifndef FT_MSB + + FT_BASE( FT_Int ) + FT_MSB( FT_UInt32 z ); + +#endif + + + /* + * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses + * two fixed-point arguments instead. + */ + FT_BASE( FT_Fixed ) + FT_Hypot( FT_Fixed x, + FT_Fixed y ); + + +#if 0 + + /************************************************************************** + * + * @function: + * FT_SqrtFixed + * + * @description: + * Computes the square root of a 16.16 fixed-point value. + * + * @input: + * x :: + * The value to compute the root for. + * + * @return: + * The result of 'sqrt(x)'. + * + * @note: + * This function is not very fast. + */ + FT_BASE( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); + +#endif /* 0 */ + + +#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) * 64 ) /* << 6 */ +#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) * 16384 ) /* << 14 */ +#define INT_TO_FIXED( x ) ( (FT_Long)(x) * 65536 ) /* << 16 */ +#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) * 4 ) /* << 2 */ +#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) + +#define ROUND_F26DOT6( x ) ( ( (x) + 32 - ( x < 0 ) ) & -64 ) + + /* + * The following macros have two purposes. + * + * - Tag places where overflow is expected and harmless. + * + * - Avoid run-time sanitizer errors. + * + * Use with care! + */ +#define ADD_INT( a, b ) \ + (FT_Int)( (FT_UInt)(a) + (FT_UInt)(b) ) +#define SUB_INT( a, b ) \ + (FT_Int)( (FT_UInt)(a) - (FT_UInt)(b) ) +#define MUL_INT( a, b ) \ + (FT_Int)( (FT_UInt)(a) * (FT_UInt)(b) ) +#define NEG_INT( a ) \ + (FT_Int)( (FT_UInt)0 - (FT_UInt)(a) ) + +#define ADD_LONG( a, b ) \ + (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) ) +#define SUB_LONG( a, b ) \ + (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) ) +#define MUL_LONG( a, b ) \ + (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) ) +#define NEG_LONG( a ) \ + (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) ) + +#define ADD_INT32( a, b ) \ + (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) ) +#define SUB_INT32( a, b ) \ + (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) ) +#define MUL_INT32( a, b ) \ + (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) ) +#define NEG_INT32( a ) \ + (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) ) + +#ifdef FT_INT64 + +#define ADD_INT64( a, b ) \ + (FT_Int64)( (FT_UInt64)(a) + (FT_UInt64)(b) ) +#define SUB_INT64( a, b ) \ + (FT_Int64)( (FT_UInt64)(a) - (FT_UInt64)(b) ) +#define MUL_INT64( a, b ) \ + (FT_Int64)( (FT_UInt64)(a) * (FT_UInt64)(b) ) +#define NEG_INT64( a ) \ + (FT_Int64)( (FT_UInt64)0 - (FT_UInt64)(a) ) + +#endif /* FT_INT64 */ + + +FT_END_HEADER + +#endif /* FTCALC_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftdebug.h b/external/freetype/include/freetype/internal/ftdebug.h new file mode 100644 index 000000000..4e013ba1e --- /dev/null +++ b/external/freetype/include/freetype/internal/ftdebug.h @@ -0,0 +1,442 @@ +/**************************************************************************** + * + * ftdebug.h + * + * Debugging and logging component (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + * + * IMPORTANT: A description of FreeType's debugging support can be + * found in 'docs/DEBUG.TXT'. Read it if you need to use or + * understand this code. + * + */ + + +#ifndef FTDEBUG_H_ +#define FTDEBUG_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include + +#include "compiler-macros.h" + +#ifdef FT_DEBUG_LOGGING +#define DLG_STATIC +#include +#include + +#include +#endif /* FT_DEBUG_LOGGING */ + + +FT_BEGIN_HEADER + + /* force the definition of FT_DEBUG_LEVEL_TRACE if FT_DEBUG_LOGGING is */ + /* already defined. */ + /* */ +#ifdef FT_DEBUG_LOGGING +#undef FT_DEBUG_LEVEL_TRACE +#define FT_DEBUG_LEVEL_TRACE +#endif + + /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ + /* is already defined; this simplifies the following #ifdefs */ + /* */ +#ifdef FT_DEBUG_LEVEL_TRACE +#undef FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_ERROR +#endif + + + /************************************************************************** + * + * Define the trace enums as well as the trace levels array when they are + * needed. + * + */ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE_DEF( x ) trace_ ## x , + + /* defining the enumeration */ + typedef enum FT_Trace_ + { +#include + trace_count + + } FT_Trace; + + + /* a pointer to the array of trace levels, */ + /* provided by `src/base/ftdebug.c' */ + extern int* ft_trace_levels; + +#undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Define the FT_TRACE macro + * + * IMPORTANT! + * + * Each component must define the macro FT_COMPONENT to a valid FT_Trace + * value before using any TRACE macro. + * + * To get consistent logging output, there should be no newline character + * (i.e., '\n') or a single trailing one in the message string of + * `FT_TRACEx` and `FT_ERROR`. + */ + + + /************************************************************************* + * + * If FT_DEBUG_LOGGING is enabled, tracing messages are sent to dlg's API. + * If FT_DEBUG_LOGGING is disabled, tracing messages are sent to + * `FT_Message` (defined in ftdebug.c). + */ +#ifdef FT_DEBUG_LOGGING + + /* we need two macros to convert the names of `FT_COMPONENT` to a string */ +#define FT_LOGGING_TAG( x ) FT_LOGGING_TAG_( x ) +#define FT_LOGGING_TAG_( x ) #x + + /* we need two macros to convert the component and the trace level */ + /* to a string that combines them */ +#define FT_LOGGING_TAGX( x, y ) FT_LOGGING_TAGX_( x, y ) +#define FT_LOGGING_TAGX_( x, y ) #x ":" #y + + +#define FT_LOG( level, varformat ) \ + do \ + { \ + const char* dlg_tag = FT_LOGGING_TAGX( FT_COMPONENT, level ); \ + \ + \ + ft_add_tag( dlg_tag ); \ + if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \ + { \ + if ( custom_output_handler != NULL ) \ + FT_Logging_Callback varformat; \ + else \ + dlg_trace varformat; \ + } \ + ft_remove_tag( dlg_tag ); \ + } while( 0 ) + +#else /* !FT_DEBUG_LOGGING */ + +#define FT_LOG( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + +#endif /* !FT_DEBUG_LOGGING */ + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* we need two macros here to make cpp expand `FT_COMPONENT' */ +#define FT_TRACE_COMP( x ) FT_TRACE_COMP_( x ) +#define FT_TRACE_COMP_( x ) trace_ ## x + +#define FT_TRACE( level, varformat ) FT_LOG( level, varformat ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * @function: + * FT_Trace_Get_Count + * + * @description: + * Return the number of available trace components. + * + * @return: + * The number of trace components. 0 if FreeType 2 is not built with + * FT_DEBUG_LEVEL_TRACE definition. + * + * @note: + * This function may be useful if you want to access elements of the + * internal trace levels array by an index. + */ + FT_BASE( FT_Int ) + FT_Trace_Get_Count( void ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Get_Name + * + * @description: + * Return the name of a trace component. + * + * @input: + * The index of the trace component. + * + * @return: + * The name of the trace component. This is a statically allocated + * C~string, so do not free it after use. `NULL` if FreeType is not + * built with FT_DEBUG_LEVEL_TRACE definition. + * + * @note: + * Use @FT_Trace_Get_Count to get the number of available trace + * components. + */ + FT_BASE( const char* ) + FT_Trace_Get_Name( FT_Int idx ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Disable + * + * @description: + * Switch off tracing temporarily. It can be activated again with + * @FT_Trace_Enable. + */ + FT_BASE( void ) + FT_Trace_Disable( void ); + + + /************************************************************************** + * + * @function: + * FT_Trace_Enable + * + * @description: + * Activate tracing. Use it after tracing has been switched off with + * @FT_Trace_Disable. + */ + FT_BASE( void ) + FT_Trace_Enable( void ); + + + /************************************************************************** + * + * You need two opening and closing parentheses! + * + * Example: FT_TRACE0(( "Value is %i", foo )) + * + * Output of the FT_TRACEX macros is sent to stderr. + * + */ + +#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) +#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) +#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) +#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) +#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) +#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) +#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) +#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + + /************************************************************************** + * + * Define the FT_ERROR macro. + * + * Output of this macro is sent to stderr. + * + */ + +#ifdef FT_DEBUG_LEVEL_ERROR + + /************************************************************************** + * + * If FT_DEBUG_LOGGING is enabled, error messages are sent to dlg's API. + * If FT_DEBUG_LOGGING is disabled, error messages are sent to `FT_Message` + * (defined in ftdebug.c). + * + */ +#ifdef FT_DEBUG_LOGGING + +#define FT_ERROR( varformat ) \ + do \ + { \ + const char* dlg_tag = FT_LOGGING_TAG( FT_COMPONENT ); \ + \ + \ + ft_add_tag( dlg_tag ); \ + dlg_trace varformat; \ + ft_remove_tag( dlg_tag ); \ + } while ( 0 ) + +#else /* !FT_DEBUG_LOGGING */ + +#define FT_ERROR( varformat ) FT_Message varformat + +#endif /* !FT_DEBUG_LOGGING */ + + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /************************************************************************** + * + * Define the FT_ASSERT and FT_THROW macros. The call to `FT_Throw` makes + * it possible to easily set a breakpoint at this function. + * + */ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#define FT_THROW( e ) \ + ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ), \ + __LINE__, \ + __FILE__ ) | \ + FT_ERR_CAT( FT_ERR_PREFIX, e ) ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ASSERT( condition ) do { } while ( 0 ) + +#define FT_THROW( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /************************************************************************** + * + * Define `FT_Message` and `FT_Panic` when needed. + * + */ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vfprintf() */ + + /* print a message */ + FT_BASE( void ) + FT_Message( const char* fmt, + ... ); + + /* print a message and exit */ + FT_BASE( void ) + FT_Panic( const char* fmt, + ... ); + + /* report file name and line number of an error */ + FT_BASE( int ) + FT_Throw( FT_Error error, + int line, + const char* file ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + FT_BASE( void ) + ft_debug_init( void ); + + +#ifdef FT_DEBUG_LOGGING + + /************************************************************************** + * + * 'dlg' uses output handlers to control how and where log messages are + * printed. Therefore we need to define a default output handler for + * FreeType. + */ + FT_BASE( void ) + ft_log_handler( const struct dlg_origin* origin, + const char* string, + void* data ); + + + /************************************************************************** + * + * 1. `ft_default_log_handler` stores the function pointer that is used + * internally by FreeType to print logs to a file. + * + * 2. `custom_output_handler` stores the function pointer to the callback + * function provided by the user. + * + * It is defined in `ftdebug.c`. + */ + extern dlg_handler ft_default_log_handler; + extern FT_Custom_Log_Handler custom_output_handler; + + + /************************************************************************** + * + * If FT_DEBUG_LOGGING macro is enabled, FreeType needs to initialize and + * un-initialize `FILE*`. + * + * These functions are defined in `ftdebug.c`. + */ + FT_BASE( void ) + ft_logging_init( void ); + + FT_BASE( void ) + ft_logging_deinit( void ); + + + /************************************************************************** + * + * For printing the name of `FT_COMPONENT` along with the actual log we + * need to add a tag with the name of `FT_COMPONENT`. + * + * These functions are defined in `ftdebug.c`. + */ + FT_BASE( void ) + ft_add_tag( const char* tag ); + + FT_BASE( void ) + ft_remove_tag( const char* tag ); + + + /************************************************************************** + * + * A function to print log data using a custom callback logging function + * (which is set using `FT_Set_Log_Handler`). + * + * This function is defined in `ftdebug.c`. + */ + FT_BASE( void ) + FT_Logging_Callback( const char* fmt, + ... ); + +#endif /* FT_DEBUG_LOGGING */ + + +FT_END_HEADER + +#endif /* FTDEBUG_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftdrv.h b/external/freetype/include/freetype/internal/ftdrv.h new file mode 100644 index 000000000..9001c07ad --- /dev/null +++ b/external/freetype/include/freetype/internal/ftdrv.h @@ -0,0 +1,289 @@ +/**************************************************************************** + * + * ftdrv.h + * + * FreeType internal font driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTDRV_H_ +#define FTDRV_H_ + + +#include + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + + typedef FT_Error + (*FT_Face_InitFunc)( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void + (*FT_Face_DoneFunc)( FT_Face face ); + + + typedef FT_Error + (*FT_Size_InitFunc)( FT_Size size ); + + typedef void + (*FT_Size_DoneFunc)( FT_Size size ); + + + typedef FT_Error + (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); + + typedef void + (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); + + + typedef FT_Error + (*FT_Size_RequestFunc)( FT_Size size, + FT_Size_Request req ); + + typedef FT_Error + (*FT_Size_SelectFunc)( FT_Size size, + FT_ULong size_index ); + + typedef FT_Error + (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + typedef FT_Error + (*FT_Face_GetKerningFunc)( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error + (*FT_Face_AttachFunc)( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error + (*FT_Face_GetAdvancesFunc)( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ); + + + /************************************************************************** + * + * @struct: + * FT_Driver_ClassRec + * + * @description: + * The font driver class. This structure mostly contains pointers to + * driver methods. + * + * @fields: + * root :: + * The parent module. + * + * face_object_size :: + * The size of a face object in bytes. + * + * size_object_size :: + * The size of a size object in bytes. + * + * slot_object_size :: + * The size of a glyph object in bytes. + * + * init_face :: + * The format-specific face constructor. + * + * done_face :: + * The format-specific face destructor. + * + * init_size :: + * The format-specific size constructor. + * + * done_size :: + * The format-specific size destructor. + * + * init_slot :: + * The format-specific slot constructor. + * + * done_slot :: + * The format-specific slot destructor. + * + * + * load_glyph :: + * A function handle to load a glyph to a slot. This field is + * mandatory! + * + * get_kerning :: + * A function handle to return the unscaled kerning for a given pair of + * glyphs. Can be set to 0 if the format doesn't support kerning. + * + * attach_file :: + * This function handle is used to read additional data for a face from + * another file/stream. For example, this can be used to add data from + * AFM or PFM files on a Type 1 face, or a CIDMap on a CID-keyed face. + * + * get_advances :: + * A function handle used to return advance widths of 'count' glyphs + * (in font units), starting at 'first'. The 'vertical' flag must be + * set to get vertical advance heights. The 'advances' buffer is + * caller-allocated. The idea of this function is to be able to + * perform device-independent text layout without loading a single + * glyph image. + * + * request_size :: + * A handle to a function used to request the new character size. Can + * be set to 0 if the scaling done in the base layer suffices. + * + * select_size :: + * A handle to a function used to select a new fixed size. It is used + * only if @FT_FACE_FLAG_FIXED_SIZES is set. Can be set to 0 if the + * scaling done in the base layer suffices. + * + * @note: + * Most function pointers, with the exception of `load_glyph`, can be set + * to 0 to indicate a default behaviour. + */ + typedef struct FT_Driver_ClassRec_ + { + FT_Module_Class root; + + FT_Long face_object_size; + FT_Long size_object_size; + FT_Long slot_object_size; + + FT_Face_InitFunc init_face; + FT_Face_DoneFunc done_face; + + FT_Size_InitFunc init_size; + FT_Size_DoneFunc done_size; + + FT_Slot_InitFunc init_slot; + FT_Slot_DoneFunc done_slot; + + FT_Slot_LoadFunc load_glyph; + + FT_Face_GetKerningFunc get_kerning; + FT_Face_AttachFunc attach_file; + FT_Face_GetAdvancesFunc get_advances; + + /* since version 2.2 */ + FT_Size_RequestFunc request_size; + FT_Size_SelectFunc select_size; + + } FT_Driver_ClassRec, *FT_Driver_Class; + + + /************************************************************************** + * + * @macro: + * FT_DECLARE_DRIVER + * + * @description: + * Used to create a forward declaration of an FT_Driver_ClassRec struct + * instance. + * + * @macro: + * FT_DEFINE_DRIVER + * + * @description: + * Used to initialize an instance of FT_Driver_ClassRec struct. + * + * `ftinit.c` (ft_create_default_module_classes) already contains a + * mechanism to call these functions for the default modules described in + * `ftmodule.h`. + * + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DECLARE_DRIVER( class_ ) \ + FT_CALLBACK_TABLE \ + const FT_Driver_ClassRec class_; + +#define FT_DEFINE_DRIVER( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_, \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + init_face_, \ + done_face_, \ + init_size_, \ + done_size_, \ + init_slot_, \ + done_slot_, \ + load_glyph_, \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + request_size_, \ + select_size_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Driver_ClassRec class_ = \ + { \ + FT_DEFINE_ROOT_MODULE( flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + \ + init_face_, \ + done_face_, \ + \ + init_size_, \ + done_size_, \ + \ + init_slot_, \ + done_slot_, \ + \ + load_glyph_, \ + \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + \ + request_size_, \ + select_size_ \ + }; + + +FT_END_HEADER + +#endif /* FTDRV_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftgloadr.h b/external/freetype/include/freetype/internal/ftgloadr.h new file mode 100644 index 000000000..36e5509f9 --- /dev/null +++ b/external/freetype/include/freetype/internal/ftgloadr.h @@ -0,0 +1,147 @@ +/**************************************************************************** + * + * ftgloadr.h + * + * The FreeType glyph loader (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGLOADR_H_ +#define FTGLOADR_H_ + + +#include + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * FT_GlyphLoader + * + * @description: + * The glyph loader is an internal object used to load several glyphs + * together (for example, in the case of composites). + */ + typedef struct FT_SubGlyphRec_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + + } FT_SubGlyphRec; + + + typedef struct FT_GlyphLoadRec_ + { + FT_Outline outline; /* outline */ + FT_Vector* extra_points; /* extra points table */ + FT_Vector* extra_points2; /* second extra points table */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph subglyphs; /* subglyphs */ + + } FT_GlyphLoadRec, *FT_GlyphLoad; + + + typedef struct FT_GlyphLoaderRec_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoadRec base; + FT_GlyphLoadRec current; + + void* other; /* for possible future extension? */ + + } FT_GlyphLoaderRec, *FT_GlyphLoader; + + + /* create new empty glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ); + + /* add an extra points table to a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); + + /* destroy a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ); + + /* reset a glyph loader (frees everything int it) */ + FT_BASE( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ); + + /* rewind a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); + + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ); + + +#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ + ( (_count) == 0 || \ + ( (FT_UInt)(_loader)->base.outline.n_points + \ + (FT_UInt)(_loader)->current.outline.n_points + \ + (FT_UInt)(_count) ) <= (_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || \ + ( (FT_UInt)(_loader)->base.outline.n_contours + \ + (FT_UInt)(_loader)->current.outline.n_contours + \ + (FT_UInt)(_count) ) <= (_loader)->max_contours ) + +#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \ + ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ + FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ + ? 0 \ + : FT_GlyphLoader_CheckPoints( (_loader), \ + (FT_UInt)(_points), \ + (FT_UInt)(_contours) ) ) + + + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ); + + /* prepare a glyph loader, i.e. empty the current glyph */ + FT_BASE( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); + + /* add the current glyph to the base glyph */ + FT_BASE( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ); + + +FT_END_HEADER + +#endif /* FTGLOADR_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/fthash.h b/external/freetype/include/freetype/internal/fthash.h new file mode 100644 index 000000000..622ec76bb --- /dev/null +++ b/external/freetype/include/freetype/internal/fthash.h @@ -0,0 +1,135 @@ +/**************************************************************************** + * + * fthash.h + * + * Hashing functions (specification). + * + */ + +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001-2015 + * Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /************************************************************************** + * + * This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50 + * + * taken from Mark Leisher's xmbdfed package + * + */ + + +#ifndef FTHASH_H_ +#define FTHASH_H_ + + +#include + + +FT_BEGIN_HEADER + + + typedef union FT_Hashkey_ + { + FT_Int num; + const char* str; + + } FT_Hashkey; + + + typedef struct FT_HashnodeRec_ + { + FT_Hashkey key; + size_t data; + + } FT_HashnodeRec; + + typedef struct FT_HashnodeRec_ *FT_Hashnode; + + + typedef FT_ULong + (*FT_Hash_LookupFunc)( FT_Hashkey* key ); + + typedef FT_Bool + (*FT_Hash_CompareFunc)( FT_Hashkey* a, + FT_Hashkey* b ); + + + typedef struct FT_HashRec_ + { + FT_UInt limit; + FT_UInt size; + FT_UInt used; + + FT_Hash_LookupFunc lookup; + FT_Hash_CompareFunc compare; + + FT_Hashnode* table; + + } FT_HashRec; + + typedef struct FT_HashRec_ *FT_Hash; + + + FT_Error + ft_hash_str_init( FT_Hash hash, + FT_Memory memory ); + + FT_Error + ft_hash_num_init( FT_Hash hash, + FT_Memory memory ); + + void + ft_hash_str_free( FT_Hash hash, + FT_Memory memory ); + +#define ft_hash_num_free ft_hash_str_free + + FT_Error + ft_hash_str_insert( const char* key, + size_t data, + FT_Hash hash, + FT_Memory memory ); + + FT_Error + ft_hash_num_insert( FT_Int num, + size_t data, + FT_Hash hash, + FT_Memory memory ); + + size_t* + ft_hash_str_lookup( const char* key, + FT_Hash hash ); + + size_t* + ft_hash_num_lookup( FT_Int num, + FT_Hash hash ); + + +FT_END_HEADER + + +#endif /* FTHASH_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftmemory.h b/external/freetype/include/freetype/internal/ftmemory.h new file mode 100644 index 000000000..5eb1d21ff --- /dev/null +++ b/external/freetype/include/freetype/internal/ftmemory.h @@ -0,0 +1,398 @@ +/**************************************************************************** + * + * ftmemory.h + * + * The FreeType memory management macros (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMEMORY_H_ +#define FTMEMORY_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @macro: + * FT_SET_ERROR + * + * @description: + * This macro is used to set an implicit 'error' variable to a given + * expression's value (usually a function call), and convert it to a + * boolean which is set whenever the value is != 0. + */ +#undef FT_SET_ERROR +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* The calculation `NULL + n' is undefined in C. Even if the resulting */ + /* pointer doesn't get dereferenced, this causes warnings with */ + /* sanitizers. */ + /* */ + /* We thus provide a macro that should be used if `base' can be NULL. */ +#define FT_OFFSET( base, count ) ( (base) ? (base) + (count) : NULL ) + + + /* + * C++ refuses to handle statements like p = (void*)anything, with `p' a + * typed pointer. Since we don't have a `typeof' operator in standard C++, + * we have to use a template to emulate it. + */ + +#ifdef __cplusplus + +extern "C++" +{ + template inline T* + cplusplus_typeof( T*, + void *v ) + { + return static_cast ( v ); + } +} + +#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) ) + +#else + +#define FT_ASSIGNP( p, val ) (p) = (val) + +#endif + + + +#ifdef FT_DEBUG_MEMORY + + FT_BASE( const char* ) ft_debug_file_; + FT_BASE( long ) ft_debug_lineno_; + +#define FT_DEBUG_INNER( exp ) ( ft_debug_file_ = __FILE__, \ + ft_debug_lineno_ = __LINE__, \ + (exp) ) + +#define FT_ASSIGNP_INNER( p, exp ) ( ft_debug_file_ = __FILE__, \ + ft_debug_lineno_ = __LINE__, \ + FT_ASSIGNP( p, exp ) ) + +#else /* !FT_DEBUG_MEMORY */ + +#define FT_DEBUG_INNER( exp ) (exp) +#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) + +#endif /* !FT_DEBUG_MEMORY */ + + + /* + * The allocation functions return a pointer, and the error code is written + * to through the `p_error' parameter. + */ + + /* The `q' variants of the functions below (`q' for `quick') don't fill */ + /* the allocated or reallocated memory with zero bytes. */ + + FT_BASE( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( void ) + ft_mem_free( FT_Memory memory, + const void* P ); + + + /* The `Q' variants of the macros below (`Q' for `quick') don't fill */ + /* the allocated or reallocated memory with zero bytes. */ + +#define FT_MEM_ALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ + (FT_Long)(size), \ + &error ) ) + +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + FT_DEBUG_INNER( ft_mem_free( memory, (ptr) ) ); \ + (ptr) = NULL; \ + FT_END_STMNT + +#define FT_MEM_NEW( ptr ) \ + FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + 1, \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_MEM_QALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \ + (FT_Long)(size), \ + &error ) ) + +#define FT_MEM_QNEW( ptr ) \ + FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + 1, \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + (FT_Long)(item_size), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + (FT_Long)(itmsz), \ + (FT_Long)(oldcnt), \ + (FT_Long)(newcnt), \ + (ptr), \ + &error ) ) + +#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + (FT_Long)(item_size), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + (FT_Long)(itmsz), \ + (FT_Long)(oldcnt), \ + (FT_Long)(newcnt), \ + (ptr), \ + &error ) ) + + +#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) + + +#define FT_MEM_SET( dest, byte, count ) \ + ft_memset( dest, byte, (FT_Offset)(count) ) + +#define FT_MEM_COPY( dest, source, count ) \ + ft_memcpy( dest, source, (FT_Offset)(count) ) + +#define FT_MEM_MOVE( dest, source, count ) \ + ft_memmove( dest, source, (FT_Offset)(count) ) + + +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) + +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) + + +#define FT_ARRAY_ZERO( dest, count ) \ + FT_MEM_ZERO( dest, \ + (FT_Offset)(count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, \ + source, \ + (FT_Offset)(count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, \ + source, \ + (FT_Offset)(count) * sizeof ( *(dest) ) ) + + + /* + * Return the maximum number of addressable elements in an array. We limit + * ourselves to INT_MAX, rather than UINT_MAX, to avoid any problems. + */ +#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) + +#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) + + + /************************************************************************** + * + * The following functions macros expect that their pointer argument is + * _typed_ in order to automatically compute array element sizes. + */ + +#define FT_MEM_NEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + sizeof ( *(ptr) ), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \ + sizeof ( *(ptr) ), \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_MEM_QNEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + sizeof ( *(ptr) ), \ + 0, \ + (FT_Long)(count), \ + NULL, \ + &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \ + sizeof ( *(ptr) ), \ + (FT_Long)(cursz), \ + (FT_Long)(newsz), \ + (ptr), \ + &error ) ) + +#define FT_ALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) + +#define FT_REALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) + +#define FT_ALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) + +#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_QALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) + +#define FT_QREALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) + +#define FT_QALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) + +#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) + +#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) + +#define FT_NEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + +#define FT_QNEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) + +#define FT_QNEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_QNEW_ARRAY( ptr, count ) ) + +#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_QRENEW_ARRAY( ptr, curcnt, newcnt ) ) + + + FT_BASE( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ); + + +#define FT_MEM_STRDUP( dst, str ) \ + (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) + +#define FT_STRDUP( dst, str ) \ + FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) + +#define FT_MEM_DUP( dst, address, size ) \ + (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) + +#define FT_DUP( dst, address, size ) \ + FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) + + + /* Return >= 1 if a truncation occurs. */ + /* Return 0 if the source string fits the buffer. */ + /* This is *not* the same as strlcpy(). */ + FT_BASE( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ); + +#define FT_STRCPYN( dst, src, size ) \ + ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) + + +FT_END_HEADER + +#endif /* FTMEMORY_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftmmtypes.h b/external/freetype/include/freetype/internal/ftmmtypes.h new file mode 100644 index 000000000..c4b21d614 --- /dev/null +++ b/external/freetype/include/freetype/internal/ftmmtypes.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * ftmmtypes.h + * + * OpenType Variations type definitions for internal use + * with the multi-masters service (specification). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, George Williams, and + * Dominik Röttsches. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTMMTYPES_H_ +#define FTMMTYPES_H_ + +FT_BEGIN_HEADER + + + typedef FT_Int32 FT_ItemVarDelta; + + typedef struct GX_ItemVarDataRec_ + { + FT_UInt itemCount; /* Number of delta sets per item. */ + FT_UInt regionIdxCount; /* Number of region indices. */ + FT_UInt* regionIndices; /* Array of `regionCount` indices; */ + /* these index `varRegionList`. */ + FT_Byte* deltaSet; /* Array of `itemCount` deltas; */ + /* use `innerIndex` for this array. */ + FT_UShort wordDeltaCount; /* Number of the first 32-bit ints */ + /* or 16-bit ints of `deltaSet` */ + /* depending on `longWords`. */ + FT_Bool longWords; /* If true, `deltaSet` is a 32-bit */ + /* array followed by a 16-bit */ + /* array, otherwise a 16-bit array */ + /* followed by an 8-bit array. */ + } GX_ItemVarDataRec, *GX_ItemVarData; + + + /* contribution of one axis to a region */ + typedef struct GX_AxisCoordsRec_ + { + FT_Fixed startCoord; + FT_Fixed peakCoord; /* zero means no effect (factor = 1) */ + FT_Fixed endCoord; + + } GX_AxisCoordsRec, *GX_AxisCoords; + + + typedef struct GX_VarRegionRec_ + { + GX_AxisCoords axisList; /* array of axisCount records */ + + } GX_VarRegionRec, *GX_VarRegion; + + + /* item variation store */ + typedef struct GX_ItemVarStoreRec_ + { + FT_UInt dataCount; + GX_ItemVarData varData; /* array of dataCount records; */ + /* use `outerIndex' for this array */ + FT_UShort axisCount; + FT_UInt regionCount; /* total number of regions defined */ + GX_VarRegion varRegionList; + + } GX_ItemVarStoreRec, *GX_ItemVarStore; + + + typedef struct GX_DeltaSetIdxMapRec_ + { + FT_ULong mapCount; + FT_UInt* outerIndex; /* indices to item var data */ + FT_UInt* innerIndex; /* indices to delta set */ + + } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap; + + +FT_END_HEADER + +#endif /* FTMMTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftobjs.h b/external/freetype/include/freetype/internal/ftobjs.h new file mode 100644 index 000000000..28bc9b65f --- /dev/null +++ b/external/freetype/include/freetype/internal/ftobjs.h @@ -0,0 +1,1238 @@ +/**************************************************************************** + * + * ftobjs.h + * + * The FreeType private base classes (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file contains the definition of all internal FreeType classes. + * + */ + + +#ifndef FTOBJS_H_ +#define FTOBJS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#include +#endif + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * Some generic definitions. + */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + + + /************************************************************************** + * + * The min and max functions missing in C. As usual, be careful not to + * write things like FT_MIN( a++, b++ ) to avoid side effects. + */ +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + /* + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' algorithm. + * We use alpha = 1, beta = 3/8, giving us results with a largest error + * less than 7% compared to the exact value. + */ +#define FT_HYPOT( x, y ) \ + ( x = FT_ABS( x ), \ + y = FT_ABS( y ), \ + x > y ? x + ( 3 * y >> 3 ) \ + : y + ( 3 * x >> 3 ) ) + + /* we use FT_TYPEOF to suppress signedness compilation warnings */ +#define FT_PAD_FLOOR( x, n ) ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + (n) / 2, n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + (n) - 1, n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) + + /* specialized versions (for signed values) */ + /* that don't produce run-time errors due to integer overflow */ +#define FT_PAD_ROUND_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) / 2 ), \ + n ) +#define FT_PAD_CEIL_LONG( x, n ) FT_PAD_FLOOR( ADD_LONG( (x), (n) - 1 ), \ + n ) +#define FT_PIX_ROUND_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 32 ) ) +#define FT_PIX_CEIL_LONG( x ) FT_PIX_FLOOR( ADD_LONG( (x), 63 ) ) + +#define FT_PAD_ROUND_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) / 2 ), \ + n ) +#define FT_PAD_CEIL_INT32( x, n ) FT_PAD_FLOOR( ADD_INT32( (x), (n) - 1 ), \ + n ) +#define FT_PIX_ROUND_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 32 ) ) +#define FT_PIX_CEIL_INT32( x ) FT_PIX_FLOOR( ADD_INT32( (x), 63 ) ) + + + /* + * character classification functions -- since these are used to parse font + * files, we must not use those in which are locale-dependent + */ +#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) + +#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ + ( (unsigned)(x) - 'a' ) < 6U || \ + ( (unsigned)(x) - 'A' ) < 6U ) + + /* the next two macros assume ASCII representation */ +#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) +#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) + +#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) +#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + /* internal charmap object structure */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + + } FT_CMapRec; + + /* typecast any pointer to a charmap handle */ +#define FT_CMAP( x ) ( (FT_CMap)( x ) ) + + /* obvious macros */ +#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id +#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id +#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding +#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face + + + /* class method definitions */ + typedef FT_Error + (*FT_CMap_InitFunc)( FT_CMap cmap, + FT_Pointer init_data ); + + typedef void + (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + typedef FT_UInt + (*FT_CMap_CharIndexFunc)( FT_CMap cmap, + FT_UInt32 char_code ); + + typedef FT_UInt + (*FT_CMap_CharNextFunc)( FT_CMap cmap, + FT_UInt32 *achar_code ); + + typedef FT_UInt + (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, + FT_CMap unicode_cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_Int + (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_UInt32 * + (*FT_CMap_VariantListFunc)( FT_CMap cmap, + FT_Memory mem ); + + typedef FT_UInt32 * + (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 char_code ); + + typedef FT_UInt32 * + (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 variant_selector ); + + + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; + + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + /* Subsequent entries are special ones for format 14 -- the variant */ + /* selector subtable which behaves like no other */ + + FT_CMap_CharVarIndexFunc char_var_index; + FT_CMap_CharVarIsDefaultFunc char_var_default; + FT_CMap_VariantListFunc variant_list; + FT_CMap_CharVariantListFunc charvariant_list; + FT_CMap_VariantCharListFunc variantchar_list; + + } FT_CMap_ClassRec; + + +#define FT_DECLARE_CMAP_CLASS( class_ ) \ + FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; + +#define FT_DEFINE_CMAP_CLASS( \ + class_, \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_CMap_ClassRec class_ = \ + { \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ \ + }; + + + /* create a new charmap and add it to charmap->face */ + FT_BASE( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ); + + /* destroy a charmap and remove it from face's list */ + FT_BASE( void ) + FT_CMap_Done( FT_CMap cmap ); + + + /* add LCD padding to CBox */ + FT_BASE( void ) + ft_lcd_padding( FT_BBox* cbox, + FT_GlyphSlot slot, + FT_Render_Mode mode ); + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, + FT_Byte* weights ); + + + /* This is the default LCD filter, an in-place, 5-tap FIR filter. */ + FT_BASE( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_LcdFiveTapFilter weights ); + +#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /************************************************************************** + * + * @struct: + * FT_Face_InternalRec + * + * @description: + * This structure contains the internal fields of each FT_Face object. + * These fields may change between different releases of FreeType. + * + * @fields: + * max_points :: + * The maximum number of points used to store the vectorial outline of + * any glyph in this face. If this value cannot be known in advance, + * or if the face isn't scalable, this should be set to 0. Only + * relevant for scalable formats. + * + * max_contours :: + * The maximum number of contours used to store the vectorial outline + * of any glyph in this face. If this value cannot be known in + * advance, or if the face isn't scalable, this should be set to 0. + * Only relevant for scalable formats. + * + * transform_matrix :: + * A 2x2 matrix of 16.16 coefficients used to transform glyph outlines + * after they are loaded from the font. Only used by the convenience + * functions. + * + * transform_delta :: + * A translation vector used to transform glyph outlines after they are + * loaded from the font. Only used by the convenience functions. + * + * transform_flags :: + * Some flags used to classify the transform. Only used by the + * convenience functions. + * + * services :: + * A cache for frequently used services. It should be only accessed + * with the macro `FT_FACE_LOOKUP_SERVICE`. + * + * incremental_interface :: + * If non-null, the interface through which glyph data and metrics are + * loaded incrementally for faces that do not provide all of this data + * when first opened. This field exists only if + * @FT_CONFIG_OPTION_INCREMENTAL is defined. + * + * no_stem_darkening :: + * Overrides the module-level default, see @stem-darkening[cff], for + * example. FALSE and TRUE toggle stem darkening on and off, + * respectively, value~-1 means to use the module/driver default. + * + * random_seed :: + * If positive, override the seed value for the CFF 'random' operator. + * Value~0 means to use the font's value. Value~-1 means to use the + * CFF driver's default. + * + * lcd_weights :: + * lcd_filter_func :: + * These fields specify the LCD filtering weights and callback function + * for ClearType-style subpixel rendering. + * + * refcount :: + * A counter initialized to~1 at the time an @FT_Face structure is + * created. @FT_Reference_Face increments this counter, and + * @FT_Done_Face only destroys a face if the counter is~1, otherwise it + * simply decrements it. + */ + typedef struct FT_Face_InternalRec_ + { + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + FT_ServiceCacheRec services; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec* incremental_interface; +#endif + + FT_Char no_stem_darkening; + FT_Int32 random_seed; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#endif + + FT_Int refcount; + + } FT_Face_InternalRec; + + + /************************************************************************** + * + * @struct: + * FT_Slot_InternalRec + * + * @description: + * This structure contains the internal fields of each FT_GlyphSlot + * object. These fields may change between different releases of + * FreeType. + * + * @fields: + * loader :: + * The glyph loader object used to load outlines into the glyph slot. + * + * flags :: + * Possible values are zero or FT_GLYPH_OWN_BITMAP. The latter + * indicates that the FT_GlyphSlot structure owns the bitmap buffer. + * + * glyph_transformed :: + * Boolean. Set to TRUE when the loaded glyph must be transformed + * through a specific font transformation. This is _not_ the same as + * the face transform set through FT_Set_Transform(). + * + * glyph_matrix :: + * The 2x2 matrix corresponding to the glyph transformation, if + * necessary. + * + * glyph_delta :: + * The 2d translation vector corresponding to the glyph transformation, + * if necessary. + * + * glyph_hints :: + * Format-specific glyph hints management. + * + * load_flags :: + * The load flags passed as an argument to @FT_Load_Glyph while + * initializing the glyph slot. + */ + +#define FT_GLYPH_OWN_BITMAP 0x1U +#define FT_GLYPH_OWN_GZIP_SVG 0x2U + + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader loader; + FT_UInt flags; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + void* glyph_hints; + + FT_Int32 load_flags; + + } FT_GlyphSlot_InternalRec; + + + /************************************************************************** + * + * @struct: + * FT_Size_InternalRec + * + * @description: + * This structure contains the internal fields of each FT_Size object. + * + * @fields: + * module_data :: + * Data specific to a driver module. + * + * autohint_mode :: + * The used auto-hinting mode. + * + * autohint_metrics :: + * Metrics used by the auto-hinter. + * + */ + + typedef struct FT_Size_InternalRec_ + { + void* module_data; + + FT_Render_Mode autohint_mode; + FT_Size_Metrics autohint_metrics; + + } FT_Size_InternalRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FT_ModuleRec + * + * @description: + * A module object instance. + * + * @fields: + * clazz :: + * A pointer to the module's class. + * + * library :: + * A handle to the parent library object. + * + * memory :: + * A handle to the memory manager. + */ + typedef struct FT_ModuleRec_ + { + FT_Module_Class* clazz; + FT_Library library; + FT_Memory memory; + + } FT_ModuleRec; + + + /* typecast an object to an FT_Module */ +#define FT_MODULE( x ) ( (FT_Module)(x) ) + +#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz +#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library +#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory + + +#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_FONT_DRIVER ) + +#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_RENDERER ) + +#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_HINTER ) + +#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_STYLER ) + +#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_SCALABLE ) + +#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_NO_OUTLINES ) + +#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HAS_HINTER ) + +#define FT_DRIVER_HINTS_LIGHTLY( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HINTS_LIGHTLY ) + + + /************************************************************************** + * + * @function: + * FT_Get_Module_Interface + * + * @description: + * Finds a module and returns its specific interface as a typeless + * pointer. + * + * @input: + * library :: + * A handle to the library object. + * + * module_name :: + * The module's name (as an ASCII string). + * + * @return: + * A module-specific interface if available, 0 otherwise. + * + * @note: + * You should better be familiar with FreeType internals to know which + * module to look for, and what its interface is :-) + */ + FT_BASE( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ); + + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id, + FT_Bool global ); + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_BASE( FT_Error ) + ft_property_string_set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + FT_String* value ); +#endif + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* a few macros used to perform easy typecasts with minimal brain damage */ + +#define FT_FACE( x ) ( (FT_Face)(x) ) +#define FT_SIZE( x ) ( (FT_Size)(x) ) +#define FT_SLOT( x ) ( (FT_GlyphSlot)(x) ) + +#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver +#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library +#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory +#define FT_FACE_STREAM( x ) FT_FACE( x )->stream + +#define FT_SIZE_FACE( x ) FT_SIZE( x )->face +#define FT_SLOT_FACE( x ) FT_SLOT( x )->face + +#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph +#define FT_FACE_SIZE( x ) FT_FACE( x )->size + + + /************************************************************************** + * + * @function: + * FT_New_GlyphSlot + * + * @description: + * It is sometimes useful to have more than one glyph slot for a given + * face object. This function is used to create additional slots. All + * of them are automatically discarded when the face is destroyed. + * + * @input: + * face :: + * A handle to a parent face object. + * + * @output: + * aslot :: + * A handle to a new glyph slot object. + * + * @return: + * FreeType error code. 0 means success. + */ + FT_BASE( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /************************************************************************** + * + * @function: + * FT_Done_GlyphSlot + * + * @description: + * Destroys a given glyph slot. Remember however that all slots are + * automatically destroyed with its parent. Using this function is not + * always mandatory. + * + * @input: + * slot :: + * A handle to a target glyph slot. + */ + FT_BASE( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + /* */ + +#define FT_REQUEST_WIDTH( req ) \ + ( (req)->horiResolution \ + ? ( (req)->width * (FT_Pos)(req)->horiResolution + 36 ) / 72 \ + : (req)->width ) + +#define FT_REQUEST_HEIGHT( req ) \ + ( (req)->vertResolution \ + ? ( (req)->height * (FT_Pos)(req)->vertResolution + 36 ) / 72 \ + : (req)->height ) + + + /* Set the metrics according to a bitmap strike. */ + FT_BASE( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ); + + + /* Set the metrics according to a size request. */ + FT_BASE( FT_Error ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ); + + + /* Match a size request against `available_sizes'. */ + FT_BASE( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ); + + + /* Use the horizontal metrics to synthesize the vertical metrics. */ + /* If `advance' is zero, it is also synthesized. */ + FT_BASE( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ); + + + /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ + /* was allocated with ft_glyphslot_alloc_bitmap). */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + + /* Preset bitmap metrics of an outline glyphslot prior to rendering */ + /* and check whether the truncated bbox is too large for rendering. */ + FT_BASE( FT_Bool ) + ft_glyphslot_preset_bitmap( FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ); + + /* Allocate a new bitmap buffer in a glyph slot. */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + + /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ + /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_RENDERER( x ) ( (FT_Renderer)(x) ) +#define FT_GLYPH( x ) ( (FT_Glyph)(x) ) +#define FT_BITMAP_GLYPH( x ) ( (FT_BitmapGlyph)(x) ) +#define FT_OUTLINE_GLYPH( x ) ( (FT_OutlineGlyph)(x) ) + + + typedef struct FT_RendererRec_ + { + FT_ModuleRec root; + FT_Renderer_Class* clazz; + FT_Glyph_Format glyph_format; + FT_Glyph_Class glyph_class; + + FT_Raster raster; + FT_Raster_Render_Func raster_render; + FT_Renderer_RenderFunc render; + + } FT_RendererRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F O N T D R I V E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* typecast a module into a driver easily */ +#define FT_DRIVER( x ) ( (FT_Driver)(x) ) + + /* typecast a module as a driver, and get its driver class */ +#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz + + + /************************************************************************** + * + * @struct: + * FT_DriverRec + * + * @description: + * The root font driver class. A font driver is responsible for managing + * and loading font files of a given format. + * + * @fields: + * root :: + * Contains the fields of the root module class. + * + * clazz :: + * A pointer to the font driver's class. Note that this is NOT + * root.clazz. 'class' wasn't used as it is a reserved word in C++. + * + * faces_list :: + * The list of faces currently opened by this driver. + * + * glyph_loader :: + * Unused. Used to be glyph loader for all faces managed by this + * driver. + */ + typedef struct FT_DriverRec_ + { + FT_ModuleRec root; + FT_Driver_Class clazz; + FT_ListRec faces_list; + FT_GlyphLoader glyph_loader; + + } FT_DriverRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R I E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * FT_LibraryRec + * + * @description: + * The FreeType library class. This is the root of all FreeType data. + * Use FT_New_Library() to create a library object, and FT_Done_Library() + * to discard it and all child objects. + * + * @fields: + * memory :: + * The library's memory object. Manages memory allocation. + * + * version_major :: + * The major version number of the library. + * + * version_minor :: + * The minor version number of the library. + * + * version_patch :: + * The current patch level of the library. + * + * num_modules :: + * The number of modules currently registered within this library. + * This is set to 0 for new libraries. New modules are added through + * the FT_Add_Module() API function. + * + * modules :: + * A table used to store handles to the currently registered + * modules. Note that each font driver contains a list of its opened + * faces. + * + * renderers :: + * The list of renderers currently registered within the library. + * + * cur_renderer :: + * The current outline renderer. This is a shortcut used to avoid + * parsing the list on each call to FT_Outline_Render(). It is a + * handle to the current renderer for the FT_GLYPH_FORMAT_OUTLINE + * format. + * + * auto_hinter :: + * The auto-hinter module interface. + * + * debug_hooks :: + * An array of four function pointers that allow debuggers to hook into + * a font format's interpreter. Currently, only the TrueType bytecode + * debugger uses this. + * + * lcd_weights :: + * The LCD filter weights for ClearType-style subpixel rendering. + * + * lcd_filter_func :: + * The LCD filtering callback function for for ClearType-style subpixel + * rendering. + * + * lcd_geometry :: + * This array specifies LCD subpixel geometry and controls Harmony LCD + * rendering technique, alternative to ClearType. + * + * pic_container :: + * Contains global structs and tables, instead of defining them + * globally. + * + * refcount :: + * A counter initialized to~1 at the time an @FT_Library structure is + * created. @FT_Reference_Library increments this counter, and + * @FT_Done_Library only destroys a library if the counter is~1, + * otherwise it simply decrements it. + */ + typedef struct FT_LibraryRec_ + { + FT_Memory memory; /* library's memory manager */ + + FT_Int version_major; + FT_Int version_minor; + FT_Int version_patch; + + FT_UInt num_modules; + FT_Module modules[FT_MAX_MODULES]; /* module objects */ + + FT_ListRec renderers; /* list of renderers */ + FT_Renderer cur_renderer; /* current outline renderer */ + FT_Module auto_hinter; + + FT_DebugHook_Func debug_hooks[4]; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#else + FT_Vector lcd_geometry[3]; /* RGB subpixel positions */ +#endif + + FT_Int refcount; + + } FT_LibraryRec; + + + FT_BASE( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ); + + FT_BASE( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + typedef const char* + (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); + + typedef FT_Error + (*FT_Face_GetGlyphNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + const FT_String* glyph_name ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /************************************************************************** + * + * @function: + * FT_New_Memory + * + * @description: + * Creates a new memory object. + * + * @return: + * A pointer to the new memory object. 0 in case of error. + */ + FT_BASE( FT_Memory ) + FT_New_Memory( void ); + + + /************************************************************************** + * + * @function: + * FT_Done_Memory + * + * @description: + * Discards memory manager. + * + * @input: + * memory :: + * A handle to the memory manager. + */ + FT_BASE( void ) + FT_Done_Memory( FT_Memory memory ); + +#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* Define default raster's interface. The default raster is located in */ + /* `src/base/ftraster.c'. */ + /* */ + /* Client applications can register new rasters through the */ + /* FT_Set_Raster() API. */ + +#ifndef FT_NO_DEFAULT_RASTER + FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; +#endif + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_OUTLINE_FUNCS + * + * @description: + * Used to initialize an instance of FT_Outline_Funcs struct. The struct + * will be allocated in the global scope (or the scope where the macro is + * used). + */ +#define FT_DEFINE_OUTLINE_FUNCS( \ + class_, \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ ) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_RASTER_FUNCS + * + * @description: + * Used to initialize an instance of FT_Raster_Funcs struct. The struct + * will be allocated in the global scope (or the scope where the macro is + * used). + */ +#define FT_DEFINE_RASTER_FUNCS( \ + class_, \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_GLYPH + * + * @description: + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DECLARE_GLYPH( class_ ) \ + FT_CALLBACK_TABLE const FT_Glyph_Class class_; + +#define FT_DEFINE_GLYPH( \ + class_, \ + size_, \ + format_, \ + init_, \ + done_, \ + copy_, \ + transform_, \ + bbox_, \ + prepare_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Glyph_Class class_ = \ + { \ + size_, \ + format_, \ + init_, \ + done_, \ + copy_, \ + transform_, \ + bbox_, \ + prepare_ \ + }; + + + /************************************************************************** + * + * @macro: + * FT_DECLARE_RENDERER + * + * @description: + * Used to create a forward declaration of a FT_Renderer_Class struct + * instance. + * + * @macro: + * FT_DEFINE_RENDERER + * + * @description: + * Used to initialize an instance of FT_Renderer_Class struct. + * + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DECLARE_RENDERER( class_ ) \ + FT_EXPORT_VAR( const FT_Renderer_Class ) class_; + +#define FT_DEFINE_RENDERER( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_, \ + glyph_format_, \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + raster_class_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Renderer_Class class_ = \ + { \ + FT_DEFINE_ROOT_MODULE( flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + glyph_format_, \ + \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + \ + raster_class_ \ + }; + + + /************************************************************************** + * + * @macro: + * FT_DECLARE_MODULE + * + * @description: + * Used to create a forward declaration of a FT_Module_Class struct + * instance. + * + * @macro: + * FT_DEFINE_MODULE + * + * @description: + * Used to initialize an instance of an FT_Module_Class struct. + * + * The struct will be allocated in the global scope (or the scope where + * the macro is used). + * + * @macro: + * FT_DEFINE_ROOT_MODULE + * + * @description: + * Used to initialize an instance of an FT_Module_Class struct inside + * another struct that contains it or in a function that initializes that + * containing struct. + */ +#define FT_DECLARE_MODULE( class_ ) \ + FT_CALLBACK_TABLE \ + const FT_Module_Class class_; + +#define FT_DEFINE_ROOT_MODULE( \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }, + +#define FT_DEFINE_MODULE( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Module_Class class_ = \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }; + + +FT_END_HEADER + +#endif /* FTOBJS_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftpsprop.h b/external/freetype/include/freetype/internal/ftpsprop.h new file mode 100644 index 000000000..1d5b287ad --- /dev/null +++ b/external/freetype/include/freetype/internal/ftpsprop.h @@ -0,0 +1,47 @@ +/**************************************************************************** + * + * ftpsprop.h + * + * Get and set properties of PostScript drivers (specification). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTPSPROP_H_ +#define FTPSPROP_H_ + + +#include + + +FT_BEGIN_HEADER + + + FT_BASE_CALLBACK( FT_Error ) + ps_property_set( FT_Module module, /* PS_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ); + + FT_BASE_CALLBACK( FT_Error ) + ps_property_get( FT_Module module, /* PS_Driver */ + const char* property_name, + void* value ); + + +FT_END_HEADER + + +#endif /* FTPSPROP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftrfork.h b/external/freetype/include/freetype/internal/ftrfork.h new file mode 100644 index 000000000..e96459921 --- /dev/null +++ b/external/freetype/include/freetype/internal/ftrfork.h @@ -0,0 +1,245 @@ +/**************************************************************************** + * + * ftrfork.h + * + * Embedded resource forks accessor (specification). + * + * Copyright (C) 2004-2023 by + * Masatake YAMATO and Redhat K.K. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * Development of the code in this file is support of + * Information-technology Promotion Agency, Japan. + */ + + +#ifndef FTRFORK_H_ +#define FTRFORK_H_ + + +#include + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 9 + + + /* A structure to describe a reference in a resource by its resource ID */ + /* and internal offset. The `POST' resource expects to be concatenated */ + /* by the order of resource IDs instead of its appearance in the file. */ + + typedef struct FT_RFork_Ref_ + { + FT_Short res_id; + FT_Long offset; + + } FT_RFork_Ref; + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + typedef FT_Error + (*ft_raccess_guess_func)( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + typedef enum FT_RFork_Rule_ { + FT_RFork_Rule_invalid = -2, + FT_RFork_Rule_uknown, /* -1 */ + FT_RFork_Rule_apple_double, + FT_RFork_Rule_apple_single, + FT_RFork_Rule_darwin_ufs_export, + FT_RFork_Rule_darwin_newvfs, + FT_RFork_Rule_darwin_hfsplus, + FT_RFork_Rule_vfat, + FT_RFork_Rule_linux_cap, + FT_RFork_Rule_linux_double, + FT_RFork_Rule_linux_netatalk + } FT_RFork_Rule; + + /* For fast translation between rule index and rule type, + * the macros FT_RFORK_xxx should be kept consistent with the + * raccess_guess_funcs table + */ + typedef struct ft_raccess_guess_rec_ { + ft_raccess_guess_func func; + FT_RFork_Rule type; + } ft_raccess_guess_rec; + + +#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \ + static const type name[] = { +#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \ + { raccess_guess_ ## func_suffix, \ + FT_RFork_Rule_ ## type_suffix }, + /* this array is a storage, thus a final `;' is needed */ +#define CONST_FT_RFORK_RULE_ARRAY_END }; + +#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /************************************************************************** + * + * @function: + * FT_Raccess_Guess + * + * @description: + * Guess a file name and offset where the actual resource fork is stored. + * The macro FT_RACCESS_N_RULES holds the number of guessing rules; the + * guessed result for the Nth rule is represented as a triplet: a new + * file name (new_names[N]), a file offset (offsets[N]), and an error + * code (errors[N]). + * + * @input: + * library :: + * A FreeType library instance. + * + * stream :: + * A file stream containing the resource fork. + * + * base_name :: + * The (base) file name of the resource fork used for some guessing + * rules. + * + * @output: + * new_names :: + * An array of guessed file names in which the resource forks may + * exist. If 'new_names[N]' is `NULL`, the guessed file name is equal + * to `base_name`. + * + * offsets :: + * An array of guessed file offsets. 'offsets[N]' holds the file + * offset of the possible start of the resource fork in file + * 'new_names[N]'. + * + * errors :: + * An array of FreeType error codes. 'errors[N]' is the error code of + * Nth guessing rule function. If 'errors[N]' is not FT_Err_Ok, + * 'new_names[N]' and 'offsets[N]' are meaningless. + */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /************************************************************************** + * + * @function: + * FT_Raccess_Get_HeaderInfo + * + * @description: + * Get the information from the header of resource fork. The information + * includes the file offset where the resource map starts, and the file + * offset where the resource data starts. `FT_Raccess_Get_DataOffsets` + * requires these two data. + * + * @input: + * library :: + * A FreeType library instance. + * + * stream :: + * A file stream containing the resource fork. + * + * rfork_offset :: + * The file offset where the resource fork starts. + * + * @output: + * map_offset :: + * The file offset where the resource map starts. + * + * rdata_pos :: + * The file offset where the resource data starts. + * + * @return: + * FreeType error code. FT_Err_Ok means success. + */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /************************************************************************** + * + * @function: + * FT_Raccess_Get_DataOffsets + * + * @description: + * Get the data offsets for a tag in a resource fork. Offsets are stored + * in an array because, in some cases, resources in a resource fork have + * the same tag. + * + * @input: + * library :: + * A FreeType library instance. + * + * stream :: + * A file stream containing the resource fork. + * + * map_offset :: + * The file offset where the resource map starts. + * + * rdata_pos :: + * The file offset where the resource data starts. + * + * tag :: + * The resource tag. + * + * sort_by_res_id :: + * A Boolean to sort the fragmented resource by their ids. The + * fragmented resources for 'POST' resource should be sorted to restore + * Type1 font properly. For 'sfnt' resources, sorting may induce a + * different order of the faces in comparison to that by QuickDraw API. + * + * @output: + * offsets :: + * The stream offsets for the resource data specified by 'tag'. This + * array is allocated by the function, so you have to call @ft_mem_free + * after use. + * + * count :: + * The length of offsets array. + * + * @return: + * FreeType error code. FT_Err_Ok means success. + * + * @note: + * Normally you should use `FT_Raccess_Get_HeaderInfo` to get the value + * for `map_offset` and `rdata_pos`. + */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Bool sort_by_res_id, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* FTRFORK_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftserv.h b/external/freetype/include/freetype/internal/ftserv.h new file mode 100644 index 000000000..1e85d6d38 --- /dev/null +++ b/external/freetype/include/freetype/internal/ftserv.h @@ -0,0 +1,495 @@ +/**************************************************************************** + * + * ftserv.h + * + * The FreeType services (specification only). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Each module can export one or more 'services'. Each service is + * identified by a constant string and modeled by a pointer; the latter + * generally corresponds to a structure containing function pointers. + * + * Note that a service's data cannot be a mere function pointer because in + * C it is possible that function pointers might be implemented differently + * than data pointers (e.g. 48 bits instead of 32). + * + */ + + +#ifndef FTSERV_H_ +#define FTSERV_H_ + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's header + * files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * 'multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_`. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be `NULL` if not + * found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /************************************************************************** + * + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's header + * files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * 'multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_`. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be `NULL` if not + * found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service to the + * library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + + /************************************************************************** + * + * @macro: + * FT_DEFINE_SERVICEDESCREC1 + * FT_DEFINE_SERVICEDESCREC2 + * FT_DEFINE_SERVICEDESCREC3 + * FT_DEFINE_SERVICEDESCREC4 + * FT_DEFINE_SERVICEDESCREC5 + * FT_DEFINE_SERVICEDESCREC6 + * FT_DEFINE_SERVICEDESCREC7 + * FT_DEFINE_SERVICEDESCREC8 + * FT_DEFINE_SERVICEDESCREC9 + * FT_DEFINE_SERVICEDESCREC10 + * + * @description: + * Used to initialize an array of FT_ServiceDescRec structures. + * + * The array will be allocated in the global scope (or the scope where + * the macro is used). + */ +#define FT_DEFINE_SERVICEDESCREC1( class_, \ + serv_id_1, serv_data_1 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC2( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC3( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC4( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC5( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC6( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC7( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC8( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC9( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { serv_id_9, serv_data_9 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC10( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9, \ + serv_id_10, serv_data_10 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { serv_id_9, serv_data_9 }, \ + { serv_id_10, serv_data_10 }, \ + { NULL, NULL } \ + }; + + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for a specific + * service by ID. Note that the last element in the array must be { NULL, + * NULL }, and that the function should return NULL if the service isn't + * available. + * + * This function can be used by modules to implement their `get_service' + * method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You should + * only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to the + * correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_METRICS_VARIATIONS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ + + /* ensure that value `1' has the same width as a pointer */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1) + + + /************************************************************************** + * + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module + * using its cache. + * + * @input: + * face :: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. `NULL` if not available. + */ +#ifdef __cplusplus + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + +FT_END_HEADER + +#endif /* FTSERV_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftstream.h b/external/freetype/include/freetype/internal/ftstream.h new file mode 100644 index 000000000..88e19287c --- /dev/null +++ b/external/freetype/include/freetype/internal/ftstream.h @@ -0,0 +1,570 @@ +/**************************************************************************** + * + * ftstream.h + * + * Stream handling (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSTREAM_H_ +#define FTSTREAM_H_ + + +#include +#include +#include + + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value: */ + /* */ + /* bit 76543210 */ + /* xxxxxxes */ + /* */ + /* s is set to 1 if the value is signed. */ + /* e is set to 1 if the value is little-endian. */ + /* xxx is a command. */ + +#define FT_FRAME_OP_SHIFT 2 +#define FT_FRAME_OP_SIGNED 1 +#define FT_FRAME_OP_LITTLE 2 +#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) + +#define FT_MAKE_FRAME_OP( command, little, sign ) \ + ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) + +#define FT_FRAME_OP_END 0 +#define FT_FRAME_OP_START 1 /* start a new frame */ +#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ +#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ +#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ +#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ + + + typedef enum FT_Frame_Op_ + { + ft_frame_end = 0, + ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), + + ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), + ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), + + ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), + ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), + ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), + ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), + + ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), + ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), + ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), + + ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), + ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), + ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) + + } FT_Frame_Op; + + + typedef struct FT_Frame_Field_ + { + FT_Byte value; + FT_Byte size; + FT_UShort offset; + + } FT_Frame_Field; + + + /* Construct an FT_Frame_Field out of a structure type and a field name. */ + /* The structure type must be set in the FT_STRUCTURE macro before */ + /* calling the FT_FRAME_START() macro. */ + /* */ +#define FT_FIELD_SIZE( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) + +#define FT_FIELD_SIZE_DELTA( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) + +#define FT_FIELD_OFFSET( f ) \ + (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) + +#define FT_FRAME_FIELD( frame_op, field ) \ + { \ + frame_op, \ + FT_FIELD_SIZE( field ), \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } + +#define FT_FRAME_START( size ) { ft_frame_start, 0, size } +#define FT_FRAME_END { ft_frame_end, 0, 0 } + +#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) +#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) +#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) +#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) +#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) +#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) +#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) +#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) + +#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) +#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) +#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) +#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) +#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) +#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) + +#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } +#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } +#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } + +#define FT_FRAME_BYTES( field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } + + + /************************************************************************** + * + * Integer extraction macros -- the 'buffer' parameter must ALWAYS be of + * type 'char*' or equivalent (1-byte elements). + */ + +#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) + +#define FT_INT16( x ) ( (FT_Int16)(x) ) +#define FT_UINT16( x ) ( (FT_UInt16)(x) ) +#define FT_INT32( x ) ( (FT_Int32)(x) ) +#define FT_UINT32( x ) ( (FT_UInt32)(x) ) + + +#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) + + + /* + * function acts on increases does range for emits + * pointer checking frames error + * ------------------------------------------------------------------- + * FT_PEEK_XXX buffer pointer no no no no + * FT_NEXT_XXX buffer pointer yes no no no + * FT_GET_XXX stream->cursor yes yes yes no + * FT_READ_XXX stream->pos yes yes no yes + */ + + + /* + * `FT_PEEK_XXX' are generic macros to get data from a buffer position. No + * safety checks are performed. + */ +#define FT_PEEK_SHORT( p ) FT_INT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_LONG( p ) FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_OFF3( p ) ( FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) ) >> 8 ) + +#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_OFF3_LE( p ) ( FT_INT32( FT_BYTE_U32( p, 2, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 0, 8 ) ) >> 8 ) + +#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + + /* + * `FT_NEXT_XXX' are generic macros to get data from a buffer position + * which is then increased appropriately. No safety checks are performed. + */ +#define FT_NEXT_CHAR( buffer ) \ + ( (signed char)*buffer++ ) + +#define FT_NEXT_BYTE( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define FT_NEXT_SHORT( buffer ) \ + ( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) + +#define FT_NEXT_USHORT( buffer ) \ + ( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) + +#define FT_NEXT_OFF3( buffer ) \ + ( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) + +#define FT_NEXT_UOFF3( buffer ) \ + ( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) + +#define FT_NEXT_LONG( buffer ) \ + ( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) + +#define FT_NEXT_ULONG( buffer ) \ + ( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) + + +#define FT_NEXT_SHORT_LE( buffer ) \ + ( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) + +#define FT_NEXT_USHORT_LE( buffer ) \ + ( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) + +#define FT_NEXT_OFF3_LE( buffer ) \ + ( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) + +#define FT_NEXT_UOFF3_LE( buffer ) \ + ( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) + +#define FT_NEXT_LONG_LE( buffer ) \ + ( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) + +#define FT_NEXT_ULONG_LE( buffer ) \ + ( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) + + + /************************************************************************** + * + * The `FT_GET_XXX` macros use an implicit 'stream' variable. + * + * Note that a call to `FT_STREAM_SEEK` or `FT_STREAM_POS` has **no** + * effect on `FT_GET_XXX`! They operate on `stream->pos`, while + * `FT_GET_XXX` use `stream->cursor`. + */ +#if 0 +#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) + +#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) +#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) +#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) +#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) +#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) +#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) +#define FT_GET_LONG() FT_GET_MACRO( LONG ) +#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) +#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) +#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) + +#else +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetByte, FT_Char ) +#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetByte, FT_Byte ) +#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Int16 ) +#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UInt16 ) +#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_UInt32 ) +#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Int32 ) +#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 ) +#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Int16 ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UInt16 ) +#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Int32 ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_UInt32 ) +#endif + + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + + /* + * The `FT_READ_XXX' macros use implicit `stream' and `error' variables. + * + * `FT_READ_XXX' can be controlled with `FT_STREAM_SEEK' and + * `FT_STREAM_POS'. They use the full machinery to check whether a read is + * valid. + */ +#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadByte, FT_Byte, var ) +#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadByte, FT_Char, var ) +#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Int16, var ) +#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UInt16, var ) +#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_UInt32, var ) +#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Int32, var ) +#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_UInt32, var ) + +#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Int16, var ) +#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UInt16, var ) +#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Int32, var ) +#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_UInt32, var ) + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /* initialize a stream for reading a regular system stream */ + FT_BASE( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ); + +#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + + /* initialize a stream for reading in-memory data */ + FT_BASE( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ); + + /* close a stream (does not destroy the stream structure) */ + FT_BASE( void ) + FT_Stream_Close( FT_Stream stream ); + + + /* seek within a stream. position is relative to start of stream */ + FT_BASE( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ); + + /* skip bytes in a stream */ + FT_BASE( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ); + + /* return current stream position */ + FT_BASE( FT_ULong ) + FT_Stream_Pos( FT_Stream stream ); + + /* read bytes from a stream into a user-allocated buffer, returns an */ + /* error if not all bytes could be read. */ + FT_BASE( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* read bytes from a stream at a given position */ + FT_BASE( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + /* try to read bytes at the end of a stream; return number of bytes */ + /* really available */ + FT_BASE( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ + /* error if the frame could not be read/accessed. The caller can use */ + /* the `FT_Stream_GetXXX' functions to retrieve frame data without */ + /* error checks. */ + /* */ + /* You must _always_ call `FT_Stream_ExitFrame' once you have entered */ + /* a stream frame! */ + /* */ + /* Nested frames are not permitted. */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ); + + /* exit a stream frame */ + FT_BASE( void ) + FT_Stream_ExitFrame( FT_Stream stream ); + + + /* Extract a stream frame. If the stream is disk-based, a heap block */ + /* is allocated and the frame bytes are read into it. If the stream */ + /* is memory-based, this function simply sets a pointer to the data. */ + /* */ + /* Useful to optimize access to memory-based streams transparently. */ + /* */ + /* `FT_Stream_GetXXX' functions can't be used. */ + /* */ + /* An extracted frame must be `freed' with a call to the function */ + /* `FT_Stream_ReleaseFrame'. */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + /* release an extract frame (see `FT_Stream_ExtractFrame') */ + FT_BASE( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ); + + + /* read a byte from an entered frame */ + FT_BASE( FT_Byte ) + FT_Stream_GetByte( FT_Stream stream ); + + /* read a 16-bit big-endian unsigned integer from an entered frame */ + FT_BASE( FT_UInt16 ) + FT_Stream_GetUShort( FT_Stream stream ); + + /* read a 24-bit big-endian unsigned integer from an entered frame */ + FT_BASE( FT_UInt32 ) + FT_Stream_GetUOffset( FT_Stream stream ); + + /* read a 32-bit big-endian unsigned integer from an entered frame */ + FT_BASE( FT_UInt32 ) + FT_Stream_GetULong( FT_Stream stream ); + + /* read a 16-bit little-endian unsigned integer from an entered frame */ + FT_BASE( FT_UInt16 ) + FT_Stream_GetUShortLE( FT_Stream stream ); + + /* read a 32-bit little-endian unsigned integer from an entered frame */ + FT_BASE( FT_UInt32 ) + FT_Stream_GetULongLE( FT_Stream stream ); + + + /* read a byte from a stream */ + FT_BASE( FT_Byte ) + FT_Stream_ReadByte( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit big-endian unsigned integer from a stream */ + FT_BASE( FT_UInt16 ) + FT_Stream_ReadUShort( FT_Stream stream, + FT_Error* error ); + + /* read a 24-bit big-endian unsigned integer from a stream */ + FT_BASE( FT_ULong ) + FT_Stream_ReadUOffset( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit big-endian integer from a stream */ + FT_BASE( FT_UInt32 ) + FT_Stream_ReadULong( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit little-endian unsigned integer from a stream */ + FT_BASE( FT_UInt16 ) + FT_Stream_ReadUShortLE( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit little-endian unsigned integer from a stream */ + FT_BASE( FT_UInt32 ) + FT_Stream_ReadULongLE( FT_Stream stream, + FT_Error* error ); + + /* Read a structure from a stream. The structure must be described */ + /* by an array of FT_Frame_Field records. */ + FT_BASE( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define FT_STREAM_POS() \ + FT_Stream_Pos( stream ) + +#define FT_STREAM_SEEK( position ) \ + FT_SET_ERROR( FT_Stream_Seek( stream, \ + (FT_ULong)(position) ) ) + +#define FT_STREAM_SKIP( distance ) \ + FT_SET_ERROR( FT_Stream_Skip( stream, \ + (FT_Long)(distance) ) ) + +#define FT_STREAM_READ( buffer, count ) \ + FT_SET_ERROR( FT_Stream_Read( stream, \ + (FT_Byte*)(buffer), \ + (FT_ULong)(count) ) ) + +#define FT_STREAM_READ_AT( position, buffer, count ) \ + FT_SET_ERROR( FT_Stream_ReadAt( stream, \ + (FT_ULong)(position), \ + (FT_Byte*)(buffer), \ + (FT_ULong)(count) ) ) + +#define FT_STREAM_READ_FIELDS( fields, object ) \ + FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) + + +#define FT_FRAME_ENTER( size ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \ + (FT_ULong)(size) ) ) ) + +#define FT_FRAME_EXIT() \ + FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) + +#define FT_FRAME_EXTRACT( size, bytes ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, \ + (FT_ULong)(size), \ + (FT_Byte**)&(bytes) ) ) ) + +#define FT_FRAME_RELEASE( bytes ) \ + FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ + (FT_Byte**)&(bytes) ) ) + + +FT_END_HEADER + +#endif /* FTSTREAM_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/fttrace.h b/external/freetype/include/freetype/internal/fttrace.h new file mode 100644 index 000000000..319fe56fd --- /dev/null +++ b/external/freetype/include/freetype/internal/fttrace.h @@ -0,0 +1,172 @@ +/**************************************************************************** + * + * fttrace.h + * + * Tracing handling (specification only). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* definitions of trace levels for FreeType 2 */ + + /* the maximum string length (if the argument to `FT_TRACE_DEF` */ + /* gets used as a string) plus one charachter for ':' plus */ + /* another one for the trace level */ +#define FT_MAX_TRACE_LEVEL_LENGTH (9 + 1 + 1) + + /* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + + /* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ + +FT_TRACE_DEF( bitmap ) /* bitmap manipulation (ftbitmap.c) */ +FT_TRACE_DEF( checksum ) /* bitmap checksum (ftobjs.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( psprops ) /* PS driver properties (ftpsprop.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ +FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ + + /* rasterizers */ +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ + + /* ot-svg module */ +FT_TRACE_DEF( otsvg ) /* OT-SVG renderer (ftsvg.c) */ + + /* cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( sfwoff ) /* WOFF format handler (sfwoff.c) */ +FT_TRACE_DEF( sfwoff2 ) /* WOFF2 format handler (sfwoff2.c) */ +FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttcolr ) /* glyph layer table (ttcolr.c) */ +FT_TRACE_DEF( ttcpal ) /* color palette table (ttcpal.c) */ +FT_TRACE_DEF( ttsvg ) /* OpenType SVG table (ttsvg.c) */ +FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ + + /* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ + + /* Type 1 driver components */ +FT_TRACE_DEF( t1afm ) +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + + /* PostScript helper module `psaux' */ +FT_TRACE_DEF( afmparse ) +FT_TRACE_DEF( cffdecode ) +FT_TRACE_DEF( psconv ) +FT_TRACE_DEF( psobjs ) +FT_TRACE_DEF( t1decode ) + + /* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshalgo ) +FT_TRACE_DEF( pshrec ) + + /* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + +FT_TRACE_DEF( cf2blues ) +FT_TRACE_DEF( cf2hints ) +FT_TRACE_DEF( cf2interp ) + + /* Type 42 driver component */ +FT_TRACE_DEF( t42 ) + + /* CID driver components */ +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + + /* Windows font component */ +FT_TRACE_DEF( winfnt ) + + /* PCF font components */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) + + /* BDF font components */ +FT_TRACE_DEF( bdfdriver ) +FT_TRACE_DEF( bdflib ) + + /* PFR font component */ +FT_TRACE_DEF( pfr ) + + /* OpenType validation components */ +FT_TRACE_DEF( otvcommon ) +FT_TRACE_DEF( otvbase ) +FT_TRACE_DEF( otvgdef ) +FT_TRACE_DEF( otvgpos ) +FT_TRACE_DEF( otvgsub ) +FT_TRACE_DEF( otvjstf ) +FT_TRACE_DEF( otvmath ) +FT_TRACE_DEF( otvmodule ) + + /* TrueTypeGX/AAT validation components */ +FT_TRACE_DEF( gxvbsln ) +FT_TRACE_DEF( gxvcommon ) +FT_TRACE_DEF( gxvfeat ) +FT_TRACE_DEF( gxvjust ) +FT_TRACE_DEF( gxvkern ) +FT_TRACE_DEF( gxvmodule ) +FT_TRACE_DEF( gxvmort ) +FT_TRACE_DEF( gxvmorx ) +FT_TRACE_DEF( gxvlcar ) +FT_TRACE_DEF( gxvopbd ) +FT_TRACE_DEF( gxvprop ) +FT_TRACE_DEF( gxvtrak ) + + /* autofit components */ +FT_TRACE_DEF( afcjk ) +FT_TRACE_DEF( afglobal ) +FT_TRACE_DEF( afhints ) +FT_TRACE_DEF( afmodule ) +FT_TRACE_DEF( aflatin ) +FT_TRACE_DEF( afshaper ) + + /* SDF components */ +FT_TRACE_DEF( sdf ) /* signed distance raster for outlines (ftsdf.c) */ +FT_TRACE_DEF( bsdf ) /* signed distance raster for bitmaps (ftbsdf.c) */ + +/* END */ diff --git a/external/freetype/include/freetype/internal/ftvalid.h b/external/freetype/include/freetype/internal/ftvalid.h new file mode 100644 index 000000000..e98ee4e47 --- /dev/null +++ b/external/freetype/include/freetype/internal/ftvalid.h @@ -0,0 +1,160 @@ +/**************************************************************************** + * + * ftvalid.h + * + * FreeType validation support (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTVALID_H_ +#define FTVALID_H_ + +#include +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_jmpbuf */ + +#include "compiler-macros.h" + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T I O N ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to a validation object */ + typedef struct FT_ValidatorRec_ volatile* FT_Validator; + + + /************************************************************************** + * + * There are three distinct validation levels defined here: + * + * FT_VALIDATE_DEFAULT :: + * A table that passes this validation level can be used reliably by + * FreeType. It generally means that all offsets have been checked to + * prevent out-of-bound reads, that array counts are correct, etc. + * + * FT_VALIDATE_TIGHT :: + * A table that passes this validation level can be used reliably and + * doesn't contain invalid data. For example, a charmap table that + * returns invalid glyph indices will not pass, even though it can be + * used with FreeType in default mode (the library will simply return an + * error later when trying to load the glyph). + * + * It also checks that fields which must be a multiple of 2, 4, or 8, + * don't have incorrect values, etc. + * + * FT_VALIDATE_PARANOID :: + * Only for font debugging. Checks that a table follows the + * specification by 100%. Very few fonts will be able to pass this level + * anyway but it can be useful for certain tools like font + * editors/converters. + */ + typedef enum FT_ValidationLevel_ + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `structure was padded due to */ + /* __declspec(align())' in order to compile cleanly with */ + /* the maximum level of warnings. */ +#pragma warning( push ) +#pragma warning( disable : 4324 ) +#endif /* _MSC_VER */ + + /* validator structure */ + typedef struct FT_ValidatorRec_ + { + ft_jmp_buf jump_buffer; /* used for exception handling */ + + const FT_Byte* base; /* address of table in memory */ + const FT_Byte* limit; /* `base' + sizeof(table) in memory */ + FT_ValidationLevel level; /* validation level */ + FT_Error error; /* error returned. 0 means success */ + + } FT_ValidatorRec; + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + +#define FT_VALIDATOR( x ) ( (FT_Validator)( x ) ) + + + FT_BASE( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ); + + /* Do not use this. It's broken and will cause your validator to crash */ + /* if you run it on an invalid font. */ + FT_BASE( FT_Int ) + ft_validator_run( FT_Validator valid ); + + /* Sets the error field in a validator, then calls `longjmp' to return */ + /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ + /* error checks within the validation routines. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + + /* Calls ft_validate_error. Assumes that the `valid' local variable */ + /* holds a pointer to the current validator object. */ + /* */ +#define FT_INVALID( _error ) FT_INVALID_( _error ) +#define FT_INVALID_( _error ) \ + ft_validator_error( valid, FT_THROW( _error ) ) + + /* called when a broken table is detected */ +#define FT_INVALID_TOO_SHORT \ + FT_INVALID( Invalid_Table ) + + /* called when an invalid offset is detected */ +#define FT_INVALID_OFFSET \ + FT_INVALID( Invalid_Offset ) + + /* called when an invalid format/value is detected */ +#define FT_INVALID_FORMAT \ + FT_INVALID( Invalid_Table ) + + /* called when an invalid glyph index is detected */ +#define FT_INVALID_GLYPH_ID \ + FT_INVALID( Invalid_Glyph_Index ) + + /* called when an invalid field value is detected */ +#define FT_INVALID_DATA \ + FT_INVALID( Invalid_Table ) + + +FT_END_HEADER + +#endif /* FTVALID_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/psaux.h b/external/freetype/include/freetype/internal/psaux.h new file mode 100644 index 000000000..dfb1987f8 --- /dev/null +++ b/external/freetype/include/freetype/internal/psaux.h @@ -0,0 +1,1434 @@ +/**************************************************************************** + * + * psaux.h + * + * Auxiliary functions and data structures related to PostScript fonts + * (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSAUX_H_ +#define PSAUX_H_ + + +#include +#include +#include +#include +#include +#include +#include + + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * PostScript modules driver class. + */ + typedef struct PS_DriverRec_ + { + FT_DriverRec root; + + FT_UInt hinting_engine; + FT_Bool no_stem_darkening; + FT_Int darken_params[8]; + FT_Int32 random_seed; + + } PS_DriverRec, *PS_Driver; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_TableRec_* PS_Table; + typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; + + + /************************************************************************** + * + * @struct: + * PS_Table_FuncsRec + * + * @description: + * A set of function pointers to manage PS_Table objects. + * + * @fields: + * table_init :: + * Used to initialize a table. + * + * table_done :: + * Finalizes resp. destroy a given table. + * + * table_add :: + * Adds a new object to a table. + * + * table_release :: + * Releases table data, then finalizes it. + */ + typedef struct PS_Table_FuncsRec_ + { + FT_Error + (*init)( PS_Table table, + FT_Int count, + FT_Memory memory ); + + void + (*done)( PS_Table table ); + + FT_Error + (*add)( PS_Table table, + FT_Int idx, + const void* object, + FT_UInt length ); + + void + (*release)( PS_Table table ); + + } PS_Table_FuncsRec; + + + /************************************************************************** + * + * @struct: + * PS_TableRec + * + * @description: + * A PS_Table is a simple object used to store an array of objects in a + * single memory block. + * + * @fields: + * block :: + * The address in memory of the growheap's block. This can change + * between two object adds, due to reallocation. + * + * cursor :: + * The current top of the grow heap within its block. + * + * capacity :: + * The current size of the heap block. Increments by 1kByte chunks. + * + * init :: + * Set to 0xDEADBEEF if 'elements' and 'lengths' have been allocated. + * + * max_elems :: + * The maximum number of elements in table. + * + * elements :: + * A table of element addresses within the block. + * + * lengths :: + * A table of element sizes within the block. + * + * memory :: + * The object used for memory operations (alloc/realloc). + * + * funcs :: + * A table of method pointers for this object. + */ + typedef struct PS_TableRec_ + { + FT_Byte* block; /* current memory block */ + FT_Offset cursor; /* current cursor in memory block */ + FT_Offset capacity; /* current size of memory block */ + FT_ULong init; + + FT_Int max_elems; + FT_Byte** elements; /* addresses of table elements */ + FT_UInt* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_FuncsRec funcs; + + } PS_TableRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PS_ParserRec_* PS_Parser; + + typedef struct T1_TokenRec_* T1_Token; + + typedef struct T1_FieldRec_* T1_Field; + + + /* simple enumeration type used to identify token types */ + typedef enum T1_TokenType_ + { + T1_TOKEN_TYPE_NONE = 0, + T1_TOKEN_TYPE_ANY, + T1_TOKEN_TYPE_STRING, + T1_TOKEN_TYPE_ARRAY, + T1_TOKEN_TYPE_KEY, /* aka `name' */ + + /* do not remove */ + T1_TOKEN_TYPE_MAX + + } T1_TokenType; + + + /* a simple structure used to identify tokens */ + typedef struct T1_TokenRec_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_TokenType type; /* type of token */ + + } T1_TokenRec; + + + /* enumeration type used to identify object fields */ + typedef enum T1_FieldType_ + { + T1_FIELD_TYPE_NONE = 0, + T1_FIELD_TYPE_BOOL, + T1_FIELD_TYPE_INTEGER, + T1_FIELD_TYPE_FIXED, + T1_FIELD_TYPE_FIXED_1000, + T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_KEY, + T1_FIELD_TYPE_BBOX, + T1_FIELD_TYPE_MM_BBOX, + T1_FIELD_TYPE_INTEGER_ARRAY, + T1_FIELD_TYPE_FIXED_ARRAY, + T1_FIELD_TYPE_CALLBACK, + + /* do not remove */ + T1_FIELD_TYPE_MAX + + } T1_FieldType; + + + typedef enum T1_FieldLocation_ + { + T1_FIELD_LOCATION_CID_INFO, + T1_FIELD_LOCATION_FONT_DICT, + T1_FIELD_LOCATION_FONT_EXTRA, + T1_FIELD_LOCATION_FONT_INFO, + T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, + T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, + T1_FIELD_LOCATION_BLEND, + + /* do not remove */ + T1_FIELD_LOCATION_MAX + + } T1_FieldLocation; + + + typedef void + (*T1_Field_ParseFunc)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_FieldRec_ + { + const char* ident; /* field identifier */ + T1_FieldLocation location; + T1_FieldType type; /* type of field */ + T1_Field_ParseFunc reader; + FT_UInt offset; /* offset of field in object */ + FT_Byte size; /* size of field in bytes */ + FT_UInt array_max; /* maximum number of elements for */ + /* array */ + FT_UInt count_offset; /* offset of element count for */ + /* arrays; must not be zero if in */ + /* use -- in other words, a */ + /* `num_FOO' element must not */ + /* start the used structure if we */ + /* parse a `FOO' array */ + FT_UInt dict; /* where we expect it */ + } T1_FieldRec; + +#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ +#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) + + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ + { \ + _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ + (T1_Field_ParseFunc)_reader, \ + 0, 0, \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ), \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0, \ + _dict \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) + +#define T1_FIELD_NUM( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) + +#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) + +#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ + _dict ) + +#define T1_FIELD_STRING( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) + +#define T1_FIELD_KEY( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) + +#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) + + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; + + typedef struct PS_Parser_FuncsRec_ + { + void + (*init)( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void + (*done)( PS_Parser parser ); + + void + (*skip_spaces)( PS_Parser parser ); + void + (*skip_PS_token)( PS_Parser parser ); + + FT_Long + (*to_int)( PS_Parser parser ); + FT_Fixed + (*to_fixed)( PS_Parser parser, + FT_Int power_ten ); + + FT_Error + (*to_bytes)( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_ULong* pnum_bytes, + FT_Bool delimiters ); + + FT_Int + (*to_coord_array)( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int + (*to_fixed_array)( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void + (*to_token)( PS_Parser parser, + T1_Token token ); + void + (*to_token_array)( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error + (*load_field)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error + (*load_field_table)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } PS_Parser_FuncsRec; + + + /************************************************************************** + * + * @struct: + * PS_ParserRec + * + * @description: + * A PS_Parser is an object used to parse a Type 1 font very quickly. + * + * @fields: + * cursor :: + * The current position in the text. + * + * base :: + * Start of the processed text. + * + * limit :: + * End of the processed text. + * + * error :: + * The last error returned. + * + * memory :: + * The object used for memory operations (alloc/realloc). + * + * funcs :: + * A table of functions for the parser. + */ + typedef struct PS_ParserRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + PS_Parser_FuncsRec funcs; + + } PS_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_Builder_ PS_Builder; + typedef const struct PS_Builder_FuncsRec_* PS_Builder_Funcs; + + typedef struct PS_Builder_FuncsRec_ + { + void + (*init)( PS_Builder* ps_builder, + void* builder, + FT_Bool is_t1 ); + + void + (*done)( PS_Builder* builder ); + + } PS_Builder_FuncsRec; + + + /************************************************************************** + * + * @struct: + * PS_Builder + * + * @description: + * A structure used during glyph loading to store its outline. + * + * @fields: + * memory :: + * The current memory object. + * + * face :: + * The current face object. + * + * glyph :: + * The current glyph slot. + * + * loader :: + * XXX + * + * base :: + * The base glyph outline. + * + * current :: + * The current glyph outline. + * + * pos_x :: + * The horizontal translation (if composite glyph). + * + * pos_y :: + * The vertical translation (if composite glyph). + * + * left_bearing :: + * The left side bearing point. + * + * advance :: + * The horizontal advance vector. + * + * bbox :: + * Unused. + * + * path_begun :: + * A flag which indicates that a new path has begun. + * + * load_points :: + * If this flag is not set, no points are loaded. + * + * no_recurse :: + * Set but not used. + * + * metrics_only :: + * A boolean indicating that we only want to compute the metrics of a + * given glyph, not load all of its points. + * + * is_t1 :: + * Set if current font type is Type 1. + * + * funcs :: + * An array of function pointers for the builder. + */ + struct PS_Builder_ + { + FT_Memory memory; + FT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos* pos_x; + FT_Pos* pos_y; + + FT_Vector* left_bearing; + FT_Vector* advance; + + FT_BBox* bbox; /* bounding box */ + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + FT_Bool is_t1; + + PS_Builder_FuncsRec funcs; + + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define PS_MAX_OPERANDS 48 +#define PS_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ + /* only 10 are allowed but there exist */ + /* fonts like `HiraKakuProN-W3.ttf' */ + /* (Hiragino Kaku Gothic ProN W3; */ + /* 8.2d6e1; 2014-12-19) that exceed */ + /* this limit */ + + /* execution context charstring zone */ + + typedef struct PS_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } PS_Decoder_Zone; + + + typedef FT_Error + (*CFF_Decoder_Get_Glyph_Callback)( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ); + + typedef void + (*CFF_Decoder_Free_Glyph_Callback)( TT_Face face, + FT_Byte** pointer, + FT_ULong length ); + + + typedef struct PS_Decoder_ + { + PS_Builder builder; + + FT_Fixed stack[PS_MAX_OPERANDS + 1]; + FT_Fixed* top; + + PS_Decoder_Zone zones[PS_MAX_SUBRS_CALLS + 1]; + PS_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + CFF_Font cff; + CFF_SubFont current_subfont; /* for current glyph_index */ + FT_Generic* cf2_instance; + + FT_Pos* glyph_width; + FT_Bool width_only; + FT_Int num_hints; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + FT_Bool seac; + + CFF_Decoder_Get_Glyph_Callback get_glyph_callback; + CFF_Decoder_Free_Glyph_Callback free_glyph_callback; + + /* Type 1 stuff */ + FT_Service_PsCMaps psnames; /* for seac */ + + FT_Int lenIV; /* internal for sub routine calls */ + FT_UInt* locals_len; /* array of subrs length (optional) */ + FT_Hash locals_hash; /* used if `num_subrs' was massaged */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + PS_Blend blend; /* for multiple master support */ + + FT_Long* buildchar; + FT_UInt len_buildchar; + + } PS_Decoder; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_BuilderRec_* T1_Builder; + + + typedef FT_Error + (*T1_Builder_Check_Points_Func)( T1_Builder builder, + FT_Int count ); + + typedef void + (*T1_Builder_Add_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + typedef FT_Error + (*T1_Builder_Add_Point1_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef FT_Error + (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); + + typedef FT_Error + (*T1_Builder_Start_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef void + (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); + + + typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; + + typedef struct T1_Builder_FuncsRec_ + { + void + (*init)( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Bool hinting ); + + void + (*done)( T1_Builder builder ); + + T1_Builder_Check_Points_Func check_points; + T1_Builder_Add_Point_Func add_point; + T1_Builder_Add_Point1_Func add_point1; + T1_Builder_Add_Contour_Func add_contour; + T1_Builder_Start_Point_Func start_point; + T1_Builder_Close_Contour_Func close_contour; + + } T1_Builder_FuncsRec; + + + /* an enumeration type to handle charstring parsing states */ + typedef enum T1_ParseState_ + { + T1_Parse_Start, + T1_Parse_Have_Width, + T1_Parse_Have_Moveto, + T1_Parse_Have_Path + + } T1_ParseState; + + + /************************************************************************** + * + * @struct: + * T1_BuilderRec + * + * @description: + * A structure used during glyph loading to store its outline. + * + * @fields: + * memory :: + * The current memory object. + * + * face :: + * The current face object. + * + * glyph :: + * The current glyph slot. + * + * loader :: + * XXX + * + * base :: + * The base glyph outline. + * + * current :: + * The current glyph outline. + * + * max_points :: + * maximum points in builder outline + * + * max_contours :: + * Maximum number of contours in builder outline. + * + * pos_x :: + * The horizontal translation (if composite glyph). + * + * pos_y :: + * The vertical translation (if composite glyph). + * + * left_bearing :: + * The left side bearing point. + * + * advance :: + * The horizontal advance vector. + * + * bbox :: + * Unused. + * + * parse_state :: + * An enumeration which controls the charstring parsing state. + * + * load_points :: + * If this flag is not set, no points are loaded. + * + * no_recurse :: + * Set but not used. + * + * metrics_only :: + * A boolean indicating that we only want to compute the metrics of a + * given glyph, not load all of its points. + * + * funcs :: + * An array of function pointers for the builder. + */ + typedef struct T1_BuilderRec_ + { + FT_Memory memory; + FT_Face face; + FT_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + T1_ParseState parse_state; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + T1_Builder_FuncsRec funcs; + + } T1_BuilderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 0 + + /************************************************************************** + * + * T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 8 + + + /************************************************************************** + * + * T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A + * minimum of 16 is required. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 32 + +#endif /* 0 */ + + + typedef struct T1_Decoder_ZoneRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_ZoneRec, *T1_Decoder_Zone; + + + typedef struct T1_DecoderRec_* T1_Decoder; + typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; + + + typedef FT_Error + (*T1_Decoder_Callback)( T1_Decoder decoder, + FT_UInt glyph_index ); + + + typedef struct T1_Decoder_FuncsRec_ + { + FT_Error + (*init)( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback callback ); + + void + (*done)( T1_Decoder decoder ); + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + FT_Error + (*parse_charstrings_old)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); +#else + FT_Error + (*parse_metrics)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); +#endif + + FT_Error + (*parse_charstrings)( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + + } T1_Decoder_FuncsRec; + + + typedef struct T1_DecoderRec_ + { + T1_BuilderRec builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone zone; + + FT_Service_PsCMaps psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_Int lenIV; /* internal for sub routine calls */ + FT_Int num_subrs; + FT_Byte** subrs; + FT_UInt* subrs_len; /* array of subrs length (optional) */ + FT_Hash subrs_hash; /* used if `num_subrs' was massaged */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + PS_Blend blend; /* for multiple master support */ + + FT_Render_Mode hint_mode; + + T1_Decoder_Callback parse_callback; + T1_Decoder_FuncsRec funcs; + + FT_Long* buildchar; + FT_UInt len_buildchar; + + FT_Bool seac; + + FT_Generic cf2_instance; + + } T1_DecoderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct CFF_Builder_ CFF_Builder; + + + typedef FT_Error + (*CFF_Builder_Check_Points_Func)( CFF_Builder* builder, + FT_Int count ); + + typedef void + (*CFF_Builder_Add_Point_Func)( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + typedef FT_Error + (*CFF_Builder_Add_Point1_Func)( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + typedef FT_Error + (*CFF_Builder_Start_Point_Func)( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + typedef void + (*CFF_Builder_Close_Contour_Func)( CFF_Builder* builder ); + + typedef FT_Error + (*CFF_Builder_Add_Contour_Func)( CFF_Builder* builder ); + + typedef const struct CFF_Builder_FuncsRec_* CFF_Builder_Funcs; + + typedef struct CFF_Builder_FuncsRec_ + { + void + (*init)( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ); + + void + (*done)( CFF_Builder* builder ); + + CFF_Builder_Check_Points_Func check_points; + CFF_Builder_Add_Point_Func add_point; + CFF_Builder_Add_Point1_Func add_point1; + CFF_Builder_Add_Contour_Func add_contour; + CFF_Builder_Start_Point_Func start_point; + CFF_Builder_Close_Contour_Func close_contour; + + } CFF_Builder_FuncsRec; + + + /************************************************************************** + * + * @struct: + * CFF_Builder + * + * @description: + * A structure used during glyph loading to store its outline. + * + * @fields: + * memory :: + * The current memory object. + * + * face :: + * The current face object. + * + * glyph :: + * The current glyph slot. + * + * loader :: + * The current glyph loader. + * + * base :: + * The base glyph outline. + * + * current :: + * The current glyph outline. + * + * pos_x :: + * The horizontal translation (if composite glyph). + * + * pos_y :: + * The vertical translation (if composite glyph). + * + * left_bearing :: + * The left side bearing point. + * + * advance :: + * The horizontal advance vector. + * + * bbox :: + * Unused. + * + * path_begun :: + * A flag which indicates that a new path has begun. + * + * load_points :: + * If this flag is not set, no points are loaded. + * + * no_recurse :: + * Set but not used. + * + * metrics_only :: + * A boolean indicating that we only want to compute the metrics of a + * given glyph, not load all of its points. + * + * hints_funcs :: + * Auxiliary pointer for hinting. + * + * hints_globals :: + * Auxiliary pointer for hinting. + * + * funcs :: + * A table of method pointers for this object. + */ + struct CFF_Builder_ + { + FT_Memory memory; + TT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + CFF_Builder_FuncsRec funcs; + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + +#define CFF_MAX_OPERANDS 48 +#define CFF_MAX_SUBRS_CALLS 16 /* maximum subroutine nesting; */ + /* only 10 are allowed but there exist */ + /* fonts like `HiraKakuProN-W3.ttf' */ + /* (Hiragino Kaku Gothic ProN W3; */ + /* 8.2d6e1; 2014-12-19) that exceed */ + /* this limit */ +#define CFF_MAX_TRANS_ELEMENTS 32 + + /* execution context charstring zone */ + + typedef struct CFF_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } CFF_Decoder_Zone; + + + typedef struct CFF_Decoder_ + { + CFF_Builder builder; + CFF_Font cff; + + FT_Fixed stack[CFF_MAX_OPERANDS + 1]; + FT_Fixed* top; + + CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; + CFF_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + FT_Pos glyph_width; + FT_Pos nominal_width; + + FT_Bool read_width; + FT_Bool width_only; + FT_Int num_hints; + FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + FT_Bool seac; + + CFF_SubFont current_subfont; /* for current glyph_index */ + + CFF_Decoder_Get_Glyph_Callback get_glyph_callback; + CFF_Decoder_Free_Glyph_Callback free_glyph_callback; + + } CFF_Decoder; + + + typedef const struct CFF_Decoder_FuncsRec_* CFF_Decoder_Funcs; + + typedef struct CFF_Decoder_FuncsRec_ + { + void + (*init)( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode, + CFF_Decoder_Get_Glyph_Callback get_callback, + CFF_Decoder_Free_Glyph_Callback free_callback ); + + FT_Error + (*prepare)( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_Error + (*parse_charstrings_old)( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len, + FT_Bool in_dict ); +#endif + + FT_Error + (*parse_charstrings)( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + } CFF_Decoder_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** AFM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_ParserRec_* AFM_Parser; + + typedef struct AFM_Parser_FuncsRec_ + { + FT_Error + (*init)( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + void + (*done)( AFM_Parser parser ); + + FT_Error + (*parse)( AFM_Parser parser ); + + } AFM_Parser_FuncsRec; + + + typedef struct AFM_StreamRec_* AFM_Stream; + + + /************************************************************************** + * + * @struct: + * AFM_ParserRec + * + * @description: + * An AFM_Parser is a parser for the AFM files. + * + * @fields: + * memory :: + * The object used for memory operations (alloc and realloc). + * + * stream :: + * This is an opaque object. + * + * FontInfo :: + * The result will be stored here. + * + * get_index :: + * A user provided function to get a glyph index by its name. + */ + typedef struct AFM_ParserRec_ + { + FT_Memory memory; + AFM_Stream stream; + + AFM_FontInfo FontInfo; + + FT_Int + (*get_index)( const char* name, + FT_Offset len, + void* user_data ); + + void* user_data; + + } AFM_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CHARMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; + + typedef struct T1_CMap_ClassesRec_ + { + FT_CMap_Class standard; + FT_CMap_Class expert; + FT_CMap_Class custom; + FT_CMap_Class unicode; + + } T1_CMap_ClassesRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_ServiceRec_ + { + /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ + const PS_Table_FuncsRec* ps_table_funcs; + const PS_Parser_FuncsRec* ps_parser_funcs; + const T1_Builder_FuncsRec* t1_builder_funcs; + const T1_Decoder_FuncsRec* t1_decoder_funcs; + + void + (*t1_decrypt)( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + FT_UInt32 + (*cff_random)( FT_UInt32 r ); + + void + (*ps_decoder_init)( PS_Decoder* ps_decoder, + void* decoder, + FT_Bool is_t1 ); + + void + (*t1_make_subfont)( FT_Face face, + PS_Private priv, + CFF_SubFont subfont ); + + T1_CMap_Classes t1_cmap_classes; + + /* fields after this comment line were added after version 2.1.10 */ + const AFM_Parser_FuncsRec* afm_parser_funcs; + + const CFF_Decoder_FuncsRec* cff_decoder_funcs; + + } PSAux_ServiceRec, *PSAux_Service; + + /* backward compatible type definition */ + typedef PSAux_ServiceRec PSAux_Interface; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Some convenience functions *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define IS_PS_NEWLINE( ch ) \ + ( (ch) == '\r' || \ + (ch) == '\n' ) + +#define IS_PS_SPACE( ch ) \ + ( (ch) == ' ' || \ + IS_PS_NEWLINE( ch ) || \ + (ch) == '\t' || \ + (ch) == '\f' || \ + (ch) == '\0' ) + +#define IS_PS_SPECIAL( ch ) \ + ( (ch) == '/' || \ + (ch) == '(' || (ch) == ')' || \ + (ch) == '<' || (ch) == '>' || \ + (ch) == '[' || (ch) == ']' || \ + (ch) == '{' || (ch) == '}' || \ + (ch) == '%' ) + +#define IS_PS_DELIM( ch ) \ + ( IS_PS_SPACE( ch ) || \ + IS_PS_SPECIAL( ch ) ) + +#define IS_PS_DIGIT( ch ) \ + ( (ch) >= '0' && (ch) <= '9' ) + +#define IS_PS_XDIGIT( ch ) \ + ( IS_PS_DIGIT( ch ) || \ + ( (ch) >= 'A' && (ch) <= 'F' ) || \ + ( (ch) >= 'a' && (ch) <= 'f' ) ) + +#define IS_PS_BASE85( ch ) \ + ( (ch) >= '!' && (ch) <= 'u' ) + +#define IS_PS_TOKEN( cur, limit, token ) \ + ( (char)(cur)[0] == (token)[0] && \ + ( (cur) + sizeof ( (token) ) == (limit) || \ + ( (cur) + sizeof( (token) ) < (limit) && \ + IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ + ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) + + +FT_END_HEADER + +#endif /* PSAUX_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/pshints.h b/external/freetype/include/freetype/internal/pshints.h new file mode 100644 index 000000000..ededc4c72 --- /dev/null +++ b/external/freetype/include/freetype/internal/pshints.h @@ -0,0 +1,699 @@ +/**************************************************************************** + * + * pshints.h + * + * Interface to Postscript-specific (Type 1 and Type 2) hints + * recorders (specification only). These are used to support native + * T1/T2 hints in the 'type1', 'cid', and 'cff' font drivers. + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSHINTS_H_ +#define PSHINTS_H_ + + +#include +#include + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INTERNAL REPRESENTATION OF GLOBALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSH_GlobalsRec_* PSH_Globals; + + typedef FT_Error + (*PSH_Globals_NewFunc)( FT_Memory memory, + T1_Private* private_dict, + PSH_Globals* aglobals ); + + typedef void + (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + typedef void + (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); + + + typedef struct PSH_Globals_FuncsRec_ + { + PSH_Globals_NewFunc create; + PSH_Globals_SetScaleFunc set_scale; + PSH_Globals_DestroyFunc destroy; + + } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 1 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * T1_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 1 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T1_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the 'open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method ('stem', 'stem3', or 'reset'). Note that these functions do + * not return an error code. + * + * - Close the recording session by calling the 'close' method. It + * returns an error code if the hints were invalid or something strange + * happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * PostScript hinter. + * + */ + typedef struct T1_HintsRec_* T1_Hints; + + + /************************************************************************** + * + * @type: + * T1_Hints_Funcs + * + * @description: + * A pointer to the @T1_Hints_FuncsRec structure that defines the API of + * a given @T1_Hints object. + * + */ + typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; + + + /************************************************************************** + * + * @functype: + * T1_Hints_OpenFunc + * + * @description: + * A method of the @T1_Hints class used to prepare it for a new Type 1 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * @note: + * You should always call the @T1_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T1_Hints_OpenFunc)( T1_Hints hints ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_SetStemFunc + * + * @description: + * A method of the @T1_Hints class used to record a new horizontal or + * vertical stem. This corresponds to the Type 1 'hstem' and 'vstem' + * operators. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * coords :: + * Array of 2 coordinates in 16.16 format, used as (position,length) + * stem descriptor. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * 'coords[0]' is the absolute stem position (lowest coordinate); + * 'coords[1]' is the length. + * + * The length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a 'ghost' stem, according to the Type 1 + * specification. + * + * If the length is -21 (corresponding to a bottom ghost stem), then the + * real stem position is 'coords[0]+coords[1]'. + * + */ + typedef void + (*T1_Hints_SetStemFunc)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_SetStem3Func + * + * @description: + * A method of the @T1_Hints class used to record three + * counter-controlled horizontal or vertical stems at once. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems, 1 for vertical ones. + * + * coords :: + * An array of 6 values in 16.16 format, holding 3 (position,length) + * pairs for the counter-controlled stems. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * The lengths cannot be negative (ghost stems are never + * counter-controlled). + * + */ + typedef void + (*T1_Hints_SetStem3Func)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_ResetFunc + * + * @description: + * A method of the @T1_Hints class used to reset the stems hints in a + * recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph in which the + * previously defined hints apply. + * + */ + typedef void + (*T1_Hints_ResetFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_CloseFunc + * + * @description: + * A method of the @T1_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T1_Hints_CloseFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************** + * + * @functype: + * T1_Hints_ApplyFunc + * + * @description: + * A method of the @T1_Hints class used to apply hints to the + * corresponding glyph outline. Must be called once all hints have been + * recorded. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64 of pixels. + * + * The scaling transformation is taken from the 'globals' object which + * must correspond to the same font as the glyph. + * + */ + typedef FT_Error + (*T1_Hints_ApplyFunc)( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************** + * + * @struct: + * T1_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T1_Hints objects. + * + * @fields: + * hints :: + * A handle to the T1 Hints recorder. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stem :: + * The function to set a simple stem. + * + * stem3 :: + * The function to set counter-controlled stems. + * + * reset :: + * The function to reset stem hints. + * + * apply :: + * The function to apply the hints to the corresponding glyph outline. + * + */ + typedef struct T1_Hints_FuncsRec_ + { + T1_Hints hints; + T1_Hints_OpenFunc open; + T1_Hints_CloseFunc close; + T1_Hints_SetStemFunc stem; + T1_Hints_SetStem3Func stem3; + T1_Hints_ResetFunc reset; + T1_Hints_ApplyFunc apply; + + } T1_Hints_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 2 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @type: + * T2_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 2 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T2_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the 'open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method ('stems', 'hintmask', 'counters'). Note that these functions + * do not return an error code. + * + * - Close the recording session by calling the 'close' method. It + * returns an error code if the hints were invalid or something strange + * happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * Postscript hinter. + * + */ + typedef struct T2_HintsRec_* T2_Hints; + + + /************************************************************************** + * + * @type: + * T2_Hints_Funcs + * + * @description: + * A pointer to the @T2_Hints_FuncsRec structure that defines the API of + * a given @T2_Hints object. + * + */ + typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; + + + /************************************************************************** + * + * @functype: + * T2_Hints_OpenFunc + * + * @description: + * A method of the @T2_Hints class used to prepare it for a new Type 2 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * @note: + * You should always call the @T2_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T2_Hints_OpenFunc)( T2_Hints hints ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_StemsFunc + * + * @description: + * A method of the @T2_Hints class used to set the table of stems in + * either the vertical or horizontal dimension. Equivalent to the + * 'hstem', 'vstem', 'hstemhm', and 'vstemhm' Type 2 operators. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * count :: + * The number of stems. + * + * coords :: + * An array of 'count' (position,length) pairs in 16.16 format. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * There are '2*count' elements in the 'coords' array. Each even element + * is an absolute position in font units, each odd element is a length in + * font units. + * + * A length can be negative, in which case it must be either -20 or -21. + * It is interpreted as a 'ghost' stem, according to the Type 1 + * specification. + * + */ + typedef void + (*T2_Hints_StemsFunc)( T2_Hints hints, + FT_UInt dimension, + FT_Int count, + FT_Fixed* coordinates ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_MaskFunc + * + * @description: + * A method of the @T2_Hints class used to set a given hintmask (this + * corresponds to the 'hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The glyph index of the last point to which the previously defined or + * activated hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point` should be 0. + * + * `bit_count` is the number of meaningful bits in the 'bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The 'bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_MaskFunc)( T2_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_CounterFunc + * + * @description: + * A method of the @T2_Hints class used to set a given counter mask (this + * corresponds to the 'hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * A glyph index of the last point to which the previously defined or + * active hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point` should be 0. + * + * `bit_count` is the number of meaningful bits in the 'bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The 'bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_CounterFunc)( T2_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_CloseFunc + * + * @description: + * A method of the @T2_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T2_Hints_CloseFunc)( T2_Hints hints, + FT_UInt end_point ); + + + /************************************************************************** + * + * @functype: + * T2_Hints_ApplyFunc + * + * @description: + * A method of the @T2_Hints class used to apply hints to the + * corresponding glyph outline. Must be called after the 'close' method. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64 of pixels. + * + * The scaling transformation is taken from the 'globals' object which + * must correspond to the same font than the glyph. + * + */ + typedef FT_Error + (*T2_Hints_ApplyFunc)( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************** + * + * @struct: + * T2_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T2_Hints objects. + * + * @fields: + * hints :: + * A handle to the T2 hints recorder object. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stems :: + * The function to set the dimension's stems table. + * + * hintmask :: + * The function to set hint masks. + * + * counter :: + * The function to set counter masks. + * + * apply :: + * The function to apply the hints on the corresponding glyph outline. + * + */ + typedef struct T2_Hints_FuncsRec_ + { + T2_Hints hints; + T2_Hints_OpenFunc open; + T2_Hints_CloseFunc close; + T2_Hints_StemsFunc stems; + T2_Hints_MaskFunc hintmask; + T2_Hints_CounterFunc counter; + T2_Hints_ApplyFunc apply; + + } T2_Hints_FuncsRec; + + + /* */ + + + typedef struct PSHinter_Interface_ + { + PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); + T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); + T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); + + } PSHinter_Interface; + + typedef PSHinter_Interface* PSHinter_Service; + + +#define FT_DEFINE_PSHINTER_INTERFACE( \ + class_, \ + get_globals_funcs_, \ + get_t1_funcs_, \ + get_t2_funcs_ ) \ + static const PSHinter_Interface class_ = \ + { \ + get_globals_funcs_, \ + get_t1_funcs_, \ + get_t2_funcs_ \ + }; + + +FT_END_HEADER + +#endif /* PSHINTS_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svbdf.h b/external/freetype/include/freetype/internal/services/svbdf.h new file mode 100644 index 000000000..bf0c1dcc7 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svbdf.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svbdf.h + * + * The FreeType BDF services (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVBDF_H_ +#define SVBDF_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + + +#define FT_DEFINE_SERVICE_BDFRec( class_, \ + get_charset_id_, \ + get_property_ ) \ + static const FT_Service_BDFRec class_ = \ + { \ + get_charset_id_, get_property_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVBDF_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svcfftl.h b/external/freetype/include/freetype/internal/services/svcfftl.h new file mode 100644 index 000000000..4a20498ee --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svcfftl.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * svcfftl.h + * + * The FreeType CFF tables loader service (specification). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVCFFTL_H_ +#define SVCFFTL_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CFF_LOAD "cff-load" + + + typedef FT_UShort + (*FT_Get_Standard_Encoding_Func)( FT_UInt charcode ); + + typedef FT_Error + (*FT_Load_Private_Dict_Func)( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + typedef FT_Byte + (*FT_FD_Select_Get_Func)( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + typedef FT_Bool + (*FT_Blend_Check_Vector_Func)( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + typedef FT_Error + (*FT_Blend_Build_Vector_Func)( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + + FT_DEFINE_SERVICE( CFFLoad ) + { + FT_Get_Standard_Encoding_Func get_standard_encoding; + FT_Load_Private_Dict_Func load_private_dict; + FT_FD_Select_Get_Func fd_select_get; + FT_Blend_Check_Vector_Func blend_check_vector; + FT_Blend_Build_Vector_Func blend_build_vector; + }; + + +#define FT_DEFINE_SERVICE_CFFLOADREC( class_, \ + get_standard_encoding_, \ + load_private_dict_, \ + fd_select_get_, \ + blend_check_vector_, \ + blend_build_vector_ ) \ + static const FT_Service_CFFLoadRec class_ = \ + { \ + get_standard_encoding_, \ + load_private_dict_, \ + fd_select_get_, \ + blend_check_vector_, \ + blend_build_vector_ \ + }; + + +FT_END_HEADER + + +#endif + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svcid.h b/external/freetype/include/freetype/internal/services/svcid.h new file mode 100644 index 000000000..06d0cb8fd --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svcid.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * + * svcid.h + * + * The FreeType CID font services (specification). + * + * Copyright (C) 2007-2023 by + * Derek Clegg and Michael Toftdal. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVCID_H_ +#define SVCID_H_ + +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CID "CID" + + typedef FT_Error + (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + typedef FT_Error + (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, + FT_Bool *is_cid ); + typedef FT_Error + (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + FT_DEFINE_SERVICE( CID ) + { + FT_CID_GetRegistryOrderingSupplementFunc get_ros; + FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; + FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; + }; + + +#define FT_DEFINE_SERVICE_CIDREC( class_, \ + get_ros_, \ + get_is_cid_, \ + get_cid_from_glyph_index_ ) \ + static const FT_Service_CIDRec class_ = \ + { \ + get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVCID_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svfntfmt.h b/external/freetype/include/freetype/internal/services/svfntfmt.h new file mode 100644 index 000000000..bc45e8056 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svfntfmt.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * svfntfmt.h + * + * The FreeType font format service (specification only). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVFNTFMT_H_ +#define SVFNTFMT_H_ + +#include + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data is a + * simple constant string pointer. + */ + +#define FT_SERVICE_ID_FONT_FORMAT "font-format" + +#define FT_FONT_FORMAT_TRUETYPE "TrueType" +#define FT_FONT_FORMAT_TYPE_1 "Type 1" +#define FT_FONT_FORMAT_BDF "BDF" +#define FT_FONT_FORMAT_PCF "PCF" +#define FT_FONT_FORMAT_TYPE_42 "Type 42" +#define FT_FONT_FORMAT_CID "CID Type 1" +#define FT_FONT_FORMAT_CFF "CFF" +#define FT_FONT_FORMAT_PFR "PFR" +#define FT_FONT_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* SVFNTFMT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svgldict.h b/external/freetype/include/freetype/internal/services/svgldict.h new file mode 100644 index 000000000..6437abfbf --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svgldict.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * svgldict.h + * + * The FreeType glyph dictionary services (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVGLDICT_H_ +#define SVGLDICT_H_ + +#include + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the index of + * a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + const FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + + +#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \ + get_name_, \ + name_index_ ) \ + static const FT_Service_GlyphDictRec class_ = \ + { \ + get_name_, name_index_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVGLDICT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svgxval.h b/external/freetype/include/freetype/internal/services/svgxval.h new file mode 100644 index 000000000..31016afe0 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * svgxval.h + * + * FreeType API for validating TrueTypeGX/AAT tables (specification). + * + * Copyright (C) 2004-2023 by + * Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef SVGXVAL_H_ +#define SVGXVAL_H_ + +#include +#include + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" +#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" + + typedef FT_Error + (*gxv_validate_func)( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + typedef FT_Error + (*ckern_validate_func)( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes *ckern_table ); + + + FT_DEFINE_SERVICE( GXvalidate ) + { + gxv_validate_func validate; + }; + + FT_DEFINE_SERVICE( CKERNvalidate ) + { + ckern_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVGXVAL_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svkern.h b/external/freetype/include/freetype/internal/services/svkern.h new file mode 100644 index 000000000..bcabbc3e6 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * svkern.h + * + * The FreeType Kerning service (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVKERN_H_ +#define SVKERN_H_ + +#include +#include + + +FT_BEGIN_HEADER + +#define FT_SERVICE_ID_KERNING "kerning" + + + typedef FT_Error + (*FT_Kerning_TrackGetFunc)( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + FT_DEFINE_SERVICE( Kerning ) + { + FT_Kerning_TrackGetFunc get_track; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVKERN_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svmetric.h b/external/freetype/include/freetype/internal/services/svmetric.h new file mode 100644 index 000000000..167617ebb --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svmetric.h @@ -0,0 +1,131 @@ +/**************************************************************************** + * + * svmetric.h + * + * The FreeType services for metrics variations (specification). + * + * Copyright (C) 2016-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVMETRIC_H_ +#define SVMETRIC_H_ + +#include + + +FT_BEGIN_HEADER + + + /* + * A service to manage the `HVAR, `MVAR', and `VVAR' OpenType tables. + * + */ + +#define FT_SERVICE_ID_METRICS_VARIATIONS "metrics-variations" + + + /* HVAR */ + + typedef FT_Error + (*FT_HAdvance_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_LSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_RSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + /* VVAR */ + + typedef FT_Error + (*FT_VAdvance_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_TSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_BSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_VOrg_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + /* MVAR */ + + typedef void + (*FT_Metrics_Adjust_Func)( FT_Face face ); + + typedef FT_Error + (*FT_Size_Reset_Func)( FT_Size size ); + + + FT_DEFINE_SERVICE( MetricsVariations ) + { + FT_HAdvance_Adjust_Func hadvance_adjust; + FT_LSB_Adjust_Func lsb_adjust; + FT_RSB_Adjust_Func rsb_adjust; + + FT_VAdvance_Adjust_Func vadvance_adjust; + FT_TSB_Adjust_Func tsb_adjust; + FT_BSB_Adjust_Func bsb_adjust; + FT_VOrg_Adjust_Func vorg_adjust; + + FT_Metrics_Adjust_Func metrics_adjust; + FT_Size_Reset_Func size_reset; + }; + + +#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_, \ + size_reset_ ) \ + static const FT_Service_MetricsVariationsRec class_ = \ + { \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_, \ + size_reset_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVMETRIC_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svmm.h b/external/freetype/include/freetype/internal/services/svmm.h new file mode 100644 index 000000000..7e76ab832 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svmm.h @@ -0,0 +1,214 @@ +/**************************************************************************** + * + * svmm.h + * + * The FreeType Multiple Masters and GX var services (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVMM_H_ +#define SVMM_H_ + +#include +#include +#include + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Get_MM_Var_Func)( FT_Face face, + FT_MM_Var* *master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + /* use return value -1 to indicate that the new coordinates */ + /* are equal to the current ones; no changes are thus needed */ + typedef FT_Error + (*FT_Set_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + /* use return value -1 to indicate that the new coordinates */ + /* are equal to the current ones; no changes are thus needed */ + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Get_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Set_Named_Instance_Func)( FT_Face face, + FT_UInt instance_index ); + + typedef FT_Error + (*FT_Get_Default_Named_Instance_Func)( FT_Face face, + FT_UInt *instance_index ); + + typedef FT_Error + (*FT_Get_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Get_Var_Blend_Func)( FT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + typedef void + (*FT_Done_Blend_Func)( FT_Face face ); + + typedef FT_Error + (*FT_Set_MM_WeightVector_Func)( FT_Face face, + FT_UInt len, + FT_Fixed* weight_vector ); + + typedef FT_Error + (*FT_Get_MM_WeightVector_Func)( FT_Face face, + FT_UInt* len, + FT_Fixed* weight_vector ); + + typedef void + (*FT_Construct_PS_Name_Func)( FT_Face face ); + + typedef FT_Error + (*FT_Var_Load_Delta_Set_Idx_Map_Func)( FT_Face face, + FT_ULong offset, + GX_DeltaSetIdxMap map, + GX_ItemVarStore itemStore, + FT_ULong table_len ); + + typedef FT_Error + (*FT_Var_Load_Item_Var_Store_Func)( FT_Face face, + FT_ULong offset, + GX_ItemVarStore itemStore ); + + typedef FT_ItemVarDelta + (*FT_Var_Get_Item_Delta_Func)( FT_Face face, + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ); + + typedef void + (*FT_Var_Done_Item_Var_Store_Func)( FT_Face face, + GX_ItemVarStore itemStore ); + + typedef void + (*FT_Var_Done_Delta_Set_Idx_Map_Func)( FT_Face face, + GX_DeltaSetIdxMap deltaSetIdxMap ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Blend_Func get_mm_blend; + FT_Get_MM_Var_Func get_mm_var; + FT_Set_Var_Design_Func set_var_design; + FT_Get_Var_Design_Func get_var_design; + FT_Set_Named_Instance_Func set_named_instance; + FT_Get_Default_Named_Instance_Func get_default_named_instance; + FT_Set_MM_WeightVector_Func set_mm_weightvector; + FT_Get_MM_WeightVector_Func get_mm_weightvector; + + /* for internal use; only needed for code sharing between modules */ + FT_Construct_PS_Name_Func construct_ps_name; + FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map; + FT_Var_Load_Item_Var_Store_Func load_item_var_store; + FT_Var_Get_Item_Delta_Func get_item_delta; + FT_Var_Done_Item_Var_Store_Func done_item_var_store; + FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_idx_map; + FT_Get_Var_Blend_Func get_var_blend; + FT_Done_Blend_Func done_blend; + }; + + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_named_instance_, \ + get_default_named_instance_, \ + set_mm_weightvector_, \ + get_mm_weightvector_, \ + \ + construct_ps_name_, \ + load_delta_set_idx_map_, \ + load_item_var_store_, \ + get_item_delta_, \ + done_item_var_store_, \ + done_delta_set_idx_map_, \ + get_var_blend_, \ + done_blend_ ) \ + static const FT_Service_MultiMastersRec class_ = \ + { \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_named_instance_, \ + get_default_named_instance_, \ + set_mm_weightvector_, \ + get_mm_weightvector_, \ + \ + construct_ps_name_, \ + load_delta_set_idx_map_, \ + load_item_var_store_, \ + get_item_delta_, \ + done_item_var_store_, \ + done_delta_set_idx_map_, \ + get_var_blend_, \ + done_blend_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVMM_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svotval.h b/external/freetype/include/freetype/internal/services/svotval.h new file mode 100644 index 000000000..a4683cd5f --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * svotval.h + * + * The FreeType OpenType validation service (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVOTVAL_H_ +#define SVOTVAL_H_ + +#include +#include + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" + + + typedef FT_Error + (*otv_validate_func)( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *base, + FT_Bytes *gdef, + FT_Bytes *gpos, + FT_Bytes *gsub, + FT_Bytes *jstf ); + + + FT_DEFINE_SERVICE( OTvalidate ) + { + otv_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVOTVAL_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svpfr.h b/external/freetype/include/freetype/internal/services/svpfr.h new file mode 100644 index 000000000..fd189c7de --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svpfr.h @@ -0,0 +1,65 @@ +/**************************************************************************** + * + * svpfr.h + * + * Internal PFR service functions (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVPFR_H_ +#define SVPFR_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" + + + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) + { + FT_PFR_GetMetricsFunc get_metrics; + FT_PFR_GetKerningFunc get_kerning; + FT_PFR_GetAdvanceFunc get_advance; + + }; + + +FT_END_HEADER + +#endif /* SVPFR_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svpostnm.h b/external/freetype/include/freetype/internal/services/svpostnm.h new file mode 100644 index 000000000..2b8f6dfec --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,65 @@ +/**************************************************************************** + * + * svpostnm.h + * + * The FreeType PostScript name services (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVPOSTNM_H_ +#define SVPOSTNM_H_ + +#include + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given font + * when available. The `get_name' field should never be `NULL`. + * + * The corresponding function can return `NULL` to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \ + static const FT_Service_PsFontNameRec class_ = \ + { \ + get_ps_font_name_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPOSTNM_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svprop.h b/external/freetype/include/freetype/internal/services/svprop.h new file mode 100644 index 000000000..932ce32e0 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svprop.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * svprop.h + * + * The FreeType property service (specification). + * + * Copyright (C) 2012-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVPROP_H_ +#define SVPROP_H_ + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PROPERTIES "properties" + + + typedef FT_Error + (*FT_Properties_SetFunc)( FT_Module module, + const char* property_name, + const void* value, + FT_Bool value_is_string ); + + typedef FT_Error + (*FT_Properties_GetFunc)( FT_Module module, + const char* property_name, + void* value ); + + + FT_DEFINE_SERVICE( Properties ) + { + FT_Properties_SetFunc set_property; + FT_Properties_GetFunc get_property; + }; + + +#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \ + set_property_, \ + get_property_ ) \ + static const FT_Service_PropertiesRec class_ = \ + { \ + set_property_, \ + get_property_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPROP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svpscmap.h b/external/freetype/include/freetype/internal/services/svpscmap.h new file mode 100644 index 000000000..6e599f3aa --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,145 @@ +/**************************************************************************** + * + * svpscmap.h + * + * The FreeType PostScript charmap service (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVPSCMAP_H_ +#define SVPSCMAP_H_ + +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value. + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Macintosh name id to glyph name. `NULL` if invalid index. + */ + typedef const char* + (*PS_Macintosh_NameFunc)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. `NULL` if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); + + + /* + * Simple unicode -> glyph index charmap built from font glyph names table. + */ + typedef struct PS_UniMap_ + { + FT_UInt32 unicode; /* bit 31 set: is glyph variant */ + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_UnicodesRec_* PS_Unicodes; + + typedef struct PS_UnicodesRec_ + { + FT_CMapRec cmap; + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_UnicodesRec; + + + /* + * A function which returns a glyph name for a given index. Returns + * `NULL` if invalid index. + */ + typedef const char* + (*PS_GetGlyphNameFunc)( FT_Pointer data, + FT_UInt string_index ); + + /* + * A function used to release the glyph name returned by + * PS_GetGlyphNameFunc, when needed + */ + typedef void + (*PS_FreeGlyphNameFunc)( FT_Pointer data, + const char* name ); + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + PS_Unicodes unicodes, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, + FT_UInt32 unicode ); + + typedef FT_UInt + (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, + FT_UInt32 *unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_NameFunc macintosh_name; + PS_Adobe_Std_StringsFunc adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + +#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \ + unicode_value_, \ + unicodes_init_, \ + unicodes_char_index_, \ + unicodes_char_next_, \ + macintosh_name_, \ + adobe_std_strings_, \ + adobe_std_encoding_, \ + adobe_expert_encoding_ ) \ + static const FT_Service_PsCMapsRec class_ = \ + { \ + unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPSCMAP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svpsinfo.h b/external/freetype/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 000000000..09c4cdccc --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,86 @@ +/**************************************************************************** + * + * svpsinfo.h + * + * The FreeType PostScript info service (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVPSINFO_H_ +#define SVPSINFO_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Error + (*PS_GetFontExtraFunc)( FT_Face face, + PS_FontExtraRec* afont_extra ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + typedef FT_Error + (*PS_GetFontPrivateFunc)( FT_Face face, + PS_PrivateRec* afont_private ); + + typedef FT_Long + (*PS_GetFontValueFunc)( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_GetFontExtraFunc ps_get_font_extra; + PS_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + PS_GetFontValueFunc ps_get_font_value; + }; + + +#define FT_DEFINE_SERVICE_PSINFOREC( class_, \ + get_font_info_, \ + ps_get_font_extra_, \ + has_glyph_names_, \ + get_font_private_, \ + get_font_value_ ) \ + static const FT_Service_PsInfoRec class_ = \ + { \ + get_font_info_, ps_get_font_extra_, has_glyph_names_, \ + get_font_private_, get_font_value_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVPSINFO_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svsfnt.h b/external/freetype/include/freetype/internal/services/svsfnt.h new file mode 100644 index 000000000..f98df2ef5 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * + * svsfnt.h + * + * The FreeType SFNT table loading service (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVSFNT_H_ +#define SVSFNT_H_ + +#include +#include + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /* + * Used to implement FT_Sfnt_Table_Info(). + */ + typedef FT_Error + (*FT_SFNT_TableInfoFunc)( FT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \ + static const FT_Service_SFNT_TableRec class_ = \ + { \ + load_, get_, info_ \ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVSFNT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svttcmap.h b/external/freetype/include/freetype/internal/services/svttcmap.h new file mode 100644 index 000000000..5f9eb02d6 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * svttcmap.h + * + * The FreeType TrueType/sfnt cmap extra information service. + * + * Copyright (C) 2003-2023 by + * Masatake YAMATO, Redhat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef SVTTCMAP_H_ +#define SVTTCMAP_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /************************************************************************** + * + * @struct: + * TT_CMapInfo + * + * @description: + * A structure used to store TrueType/sfnt specific cmap information + * which is not covered by the generic @FT_CharMap structure. This + * structure can be accessed with the @FT_Get_TT_CMap_Info function. + * + * @fields: + * language :: + * The language ID used in Mac fonts. Definitions of values are in + * `ttnameid.h`. + * + * format :: + * The cmap format. OpenType 1.6 defines the formats 0 (byte encoding + * table), 2~(high-byte mapping through table), 4~(segment mapping to + * delta values), 6~(trimmed table mapping), 8~(mixed 16-bit and 32-bit + * coverage), 10~(trimmed array), 12~(segmented coverage), 13~(last + * resort font), and 14 (Unicode Variation Sequences). + */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + FT_Long format; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + + +#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \ + static const FT_Service_TTCMapsRec class_ = \ + { \ + get_cmap_info_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVTTCMAP_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svtteng.h b/external/freetype/include/freetype/internal/services/svtteng.h new file mode 100644 index 000000000..ad577cb29 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * + * svtteng.h + * + * The FreeType TrueType engine query service (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVTTENG_H_ +#define SVTTENG_H_ + +#include +#include + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" + + /* + * Used to implement FT_Get_TrueType_Engine_Type + */ + + FT_DEFINE_SERVICE( TrueTypeEngine ) + { + FT_TrueTypeEngineType engine_type; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVTTENG_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svttglyf.h b/external/freetype/include/freetype/internal/services/svttglyf.h new file mode 100644 index 000000000..ca6fff744 --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * svttglyf.h + * + * The FreeType TrueType glyph service. + * + * Copyright (C) 2007-2023 by + * David Turner. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef SVTTGLYF_H_ +#define SVTTGLYF_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_GLYF "tt-glyf" + + + typedef FT_ULong + (*TT_Glyf_GetLocationFunc)( FT_Face face, + FT_UInt gindex, + FT_ULong *psize ); + + FT_DEFINE_SERVICE( TTGlyf ) + { + TT_Glyf_GetLocationFunc get_location; + }; + + +#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \ + static const FT_Service_TTGlyfRec class_ = \ + { \ + get_location_ \ + }; + + /* */ + + +FT_END_HEADER + +#endif /* SVTTGLYF_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/services/svwinfnt.h b/external/freetype/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 000000000..002923f8c --- /dev/null +++ b/external/freetype/include/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * svwinfnt.h + * + * The FreeType Windows FNT/FONT service (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVWINFNT_H_ +#define SVWINFNT_H_ + +#include +#include + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_WINFNT "winfonts" + + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* SVWINFNT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/sfnt.h b/external/freetype/include/freetype/internal/sfnt.h new file mode 100644 index 000000000..a2d4e15ba --- /dev/null +++ b/external/freetype/include/freetype/internal/sfnt.h @@ -0,0 +1,1092 @@ +/**************************************************************************** + * + * sfnt.h + * + * High-level 'sfnt' driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFNT_H_ +#define SFNT_H_ + + +#include +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @functype: + * TT_Init_Face_Func + * + * @description: + * First part of the SFNT face object initialization. This finds the + * face in a SFNT file or collection, and load its format tag in + * face->format_tag. + * + * @input: + * stream :: + * The input stream. + * + * face :: + * A handle to the target face object. + * + * face_index :: + * The index of the TrueType font, if we are opening a collection, in + * bits 0-15. The numbered instance index~+~1 of a GX (sub)font, if + * applicable, in bits 16-30. + * + * num_params :: + * The number of additional parameters. + * + * params :: + * Optional additional parameters. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The stream cursor must be at the font file's origin. + * + * This function recognizes fonts embedded in a 'TrueType collection'. + * + * Once the format tag has been validated by the font driver, it should + * then call the TT_Load_Face_Func() callback to read the rest of the + * SFNT tables in the object. + */ + typedef FT_Error + (*TT_Init_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Face_Func + * + * @description: + * Second part of the SFNT face object initialization. This loads the + * common SFNT tables (head, OS/2, maxp, metrics, etc.) in the face + * object. + * + * @input: + * stream :: + * The input stream. + * + * face :: + * A handle to the target face object. + * + * face_index :: + * The index of the TrueType font, if we are opening a collection, in + * bits 0-15. The numbered instance index~+~1 of a GX (sub)font, if + * applicable, in bits 16-30. + * + * num_params :: + * The number of additional parameters. + * + * params :: + * Optional additional parameters. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function must be called after TT_Init_Face_Func(). + */ + typedef FT_Error + (*TT_Load_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /************************************************************************** + * + * @functype: + * TT_Done_Face_Func + * + * @description: + * A callback used to delete the common SFNT data from a face. + * + * @input: + * face :: + * A handle to the target face object. + * + * @note: + * This function does NOT destroy the face object. + */ + typedef void + (*TT_Done_Face_Func)( TT_Face face ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Any_Func + * + * @description: + * Load any font table into client memory. + * + * @input: + * face :: + * The face object to look for. + * + * tag :: + * The tag of table to load. Use the value 0 if you want to access the + * whole font file, else set this parameter to a valid TrueType table + * tag that you can forge with the MAKE_TT_TAG macro. + * + * offset :: + * The starting offset in the table (or the file if tag == 0). + * + * length :: + * The address of the decision variable: + * + * If `length == NULL`: Loads the whole table. Returns an error if + * 'offset' == 0! + * + * If `*length == 0`: Exits immediately; returning the length of the + * given table or of the font file, depending on the value of 'tag'. + * + * If `*length != 0`: Loads the next 'length' bytes of table or font, + * starting at offset 'offset' (in table or font too). + * + * @output: + * buffer :: + * The address of target buffer. + * + * @return: + * TrueType error code. 0 means success. + */ + typedef FT_Error + (*TT_Load_Any_Func)( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte *buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @functype: + * TT_Find_SBit_Image_Func + * + * @description: + * Check whether an embedded bitmap (an 'sbit') exists for a given glyph, + * at a given strike. + * + * @input: + * face :: + * The target face object. + * + * glyph_index :: + * The glyph index. + * + * strike_index :: + * The current strike index. + * + * @output: + * arange :: + * The SBit range containing the glyph index. + * + * astrike :: + * The SBit strike containing the glyph index. + * + * aglyph_offset :: + * The offset of the glyph data in 'EBDT' table. + * + * @return: + * FreeType error code. 0 means success. Returns + * SFNT_Err_Invalid_Argument if no sbit exists for the requested glyph. + */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /************************************************************************** + * + * @functype: + * TT_Load_SBit_Metrics_Func + * + * @description: + * Get the big metrics for a given embedded bitmap. + * + * @input: + * stream :: + * The input stream. + * + * range :: + * The SBit range containing the glyph. + * + * @output: + * big_metrics :: + * A big SBit metrics structure for the glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The stream cursor must be positioned at the glyph's offset within the + * 'EBDT' table before the call. + * + * If the image format uses variable metrics, the stream cursor is + * positioned just after the metrics header in the 'EBDT' table on + * function exit. + */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + + /************************************************************************** + * + * @functype: + * TT_Load_SBit_Image_Func + * + * @description: + * Load a given glyph sbit image from the font resource. This also + * returns its metrics. + * + * @input: + * face :: + * The target face object. + * + * strike_index :: + * The strike index. + * + * glyph_index :: + * The current glyph index. + * + * load_flags :: + * The current load flags. + * + * stream :: + * The input stream. + * + * @output: + * amap :: + * The target pixmap. + * + * ametrics :: + * A big sbit metrics structure for the glyph image. + * + * @return: + * FreeType error code. 0 means success. Returns an error if no glyph + * sbit exists for the index. + * + * @note: + * The `map.buffer` field is always freed before the glyph is loaded. + */ + typedef FT_Error + (*TT_Load_SBit_Image_Func)( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *amap, + TT_SBit_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Svg_Doc_Func + * + * @description: + * Scan the SVG document list to find the document containing the glyph + * that has the ID 'glyph*XXX*', where *XXX* is the value of + * `glyph_index` as a decimal integer. + * + * @inout: + * glyph :: + * The glyph slot from which pointers to the SVG document list is to be + * grabbed. The results are stored back in the slot. + * + * @input: + * glyph_index :: + * The index of the glyph that is to be looked up. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Load_Svg_Doc_Func)( FT_GlyphSlot glyph, + FT_UInt glyph_index ); + + + /************************************************************************** + * + * @functype: + * TT_Set_SBit_Strike_Func + * + * @description: + * Select an sbit strike for a given size request. + * + * @input: + * face :: + * The target face object. + * + * req :: + * The size request. + * + * @output: + * astrike_index :: + * The index of the sbit strike. + * + * @return: + * FreeType error code. 0 means success. Returns an error if no sbit + * strike exists for the selected ppem values. + */ + typedef FT_Error + (*TT_Set_SBit_Strike_Func)( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Strike_Metrics_Func + * + * @description: + * Load the metrics of a given strike. + * + * @input: + * face :: + * The target face object. + * + * strike_index :: + * The strike index. + * + * @output: + * metrics :: + * the metrics of the strike. + * + * @return: + * FreeType error code. 0 means success. Returns an error if no such + * sbit strike exists. + */ + typedef FT_Error + (*TT_Load_Strike_Metrics_Func)( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + + /************************************************************************** + * + * @functype: + * TT_Get_PS_Name_Func + * + * @description: + * Get the PostScript glyph name of a glyph. + * + * @input: + * idx :: + * The glyph index. + * + * PSname :: + * The address of a string pointer. Will be `NULL` in case of error, + * otherwise it is a pointer to the glyph name. + * + * You must not modify the returned string! + * + * @output: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Metrics_Func + * + * @description: + * Load a metrics table, which is a table with a horizontal and a + * vertical version. + * + * @input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * vertical :: + * A boolean flag. If set, load the vertical one. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Metrics_Func + * + * @description: + * Load the horizontal or vertical header in a face object. + * + * @input: + * face :: + * A handle to the target face object. + * + * vertical :: + * A boolean flag. If set, load vertical metrics. + * + * gindex :: + * The glyph index. + * + * @output: + * abearing :: + * The horizontal (or vertical) bearing. Set to zero in case of error. + * + * aadvance :: + * The horizontal (or vertical) advance. Set to zero in case of error. + */ + typedef void + (*TT_Get_Metrics_Func)( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + + + /************************************************************************** + * + * @functype: + * TT_Set_Palette_Func + * + * @description: + * Load the colors into `face->palette` for a given palette index. + * + * @input: + * face :: + * The target face object. + * + * idx :: + * The palette index. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Set_Palette_Func)( TT_Face face, + FT_UInt idx ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Colr_Layer_Func + * + * @description: + * Iteratively get the color layer data of a given glyph index. + * + * @input: + * face :: + * The target face object. + * + * base_glyph :: + * The glyph index the colored glyph layers are associated with. + * + * @inout: + * iterator :: + * An @FT_LayerIterator object. For the first call you should set + * `iterator->p` to `NULL`. For all following calls, simply use the + * same object again. + * + * @output: + * aglyph_index :: + * The glyph index of the current layer. + * + * acolor_index :: + * The color index into the font face's color palette of the current + * layer. The value 0xFFFF is special; it doesn't reference a palette + * entry but indicates that the text foreground color should be used + * instead (to be set up by the application outside of FreeType). + * + * @return: + * Value~1 if everything is OK. If there are no more layers (or if there + * are no layers at all), value~0 gets returned. In case of an error, + * value~0 is returned also. + */ + typedef FT_Bool + (*TT_Get_Colr_Layer_Func)( TT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Color_Glyph_Paint_Func + * + * @description: + * Find the root @FT_OpaquePaint object for a given glyph ID. + * + * @input: + * face :: + * The target face object. + * + * base_glyph :: + * The glyph index the colored glyph layers are associated with. + * + * @output: + * paint :: + * The root @FT_OpaquePaint object. + * + * @return: + * Value~1 if everything is OK. If no color glyph is found, or the root + * paint could not be retrieved, value~0 gets returned. In case of an + * error, value~0 is returned also. + */ + typedef FT_Bool + ( *TT_Get_Color_Glyph_Paint_Func )( TT_Face face, + FT_UInt base_glyph, + FT_Color_Root_Transform root_transform, + FT_OpaquePaint *paint ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Color_Glyph_ClipBox_Func + * + * @description: + * Search for a 'COLR' v1 clip box for the specified `base_glyph` and + * fill the `clip_box` parameter with the 'COLR' v1 'ClipBox' information + * if one is found. + * + * @input: + * face :: + * A handle to the parent face object. + * + * base_glyph :: + * The glyph index for which to retrieve the clip box. + * + * @output: + * clip_box :: + * The clip box for the requested `base_glyph` if one is found. The + * clip box is computed taking scale and transformations configured on + * the @FT_Face into account. @FT_ClipBox contains @FT_Vector values + * in 26.6 format. + * + * @note: + * To retrieve the clip box in font units, reset scale to units-per-em + * and remove transforms configured using @FT_Set_Transform. + * + * @return: + * Value~1 if a ClipBox is found. If no clip box is found or an + * error occured, value~0 is returned. + */ + typedef FT_Bool + ( *TT_Get_Color_Glyph_ClipBox_Func )( TT_Face face, + FT_UInt base_glyph, + FT_ClipBox* clip_box ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Paint_Layers_Func + * + * @description: + * Access the layers of a `PaintColrLayers` table. + * + * @input: + * face :: + * The target face object. + * + * @inout: + * iterator :: + * The @FT_LayerIterator from an @FT_PaintColrLayers object, for which + * the layers are to be retrieved. The internal state of the iterator + * is incremented after one call to this function for retrieving one + * layer. + * + * @output: + * paint :: + * The root @FT_OpaquePaint object referencing the actual paint table. + * + * @return: + * Value~1 if everything is OK. Value~0 gets returned when the paint + * object can not be retrieved or any other error occurs. + */ + typedef FT_Bool + ( *TT_Get_Paint_Layers_Func )( TT_Face face, + FT_LayerIterator* iterator, + FT_OpaquePaint *paint ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Colorline_Stops_Func + * + * @description: + * Get the gradient and solid fill information for a given glyph. + * + * @input: + * face :: + * The target face object. + * + * @inout: + * iterator :: + * An @FT_ColorStopIterator object. For the first call you should set + * `iterator->p` to `NULL`. For all following calls, simply use the + * same object again. + * + * @output: + * color_stop :: + * Color index and alpha value for the retrieved color stop. + * + * @return: + * Value~1 if everything is OK. If there are no more color stops, + * value~0 gets returned. In case of an error, value~0 is returned + * also. + */ + typedef FT_Bool + ( *TT_Get_Colorline_Stops_Func )( TT_Face face, + FT_ColorStop *color_stop, + FT_ColorStopIterator* iterator ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Paint_Func + * + * @description: + * Get the paint details for a given @FT_OpaquePaint object. + * + * @input: + * face :: + * The target face object. + * + * opaque_paint :: + * The @FT_OpaquePaint object. + * + * @output: + * paint :: + * An @FT_COLR_Paint object holding the details on `opaque_paint`. + * + * @return: + * Value~1 if everything is OK. Value~0 if no details can be found for + * this paint or any other error occured. + */ + typedef FT_Bool + ( *TT_Get_Paint_Func )( TT_Face face, + FT_OpaquePaint opaque_paint, + FT_COLR_Paint *paint ); + + + /************************************************************************** + * + * @functype: + * TT_Blend_Colr_Func + * + * @description: + * Blend the bitmap in `new_glyph` into `base_glyph` using the color + * specified by `color_index`. If `color_index` is 0xFFFF, use + * `face->foreground_color` if `face->have_foreground_color` is set. + * Otherwise check `face->palette_data.palette_flags`: If present and + * @FT_PALETTE_FOR_DARK_BACKGROUND is set, use BGRA value 0xFFFFFFFF + * (white opaque). Otherwise use BGRA value 0x000000FF (black opaque). + * + * @input: + * face :: + * The target face object. + * + * color_index :: + * Color index from the COLR table. + * + * base_glyph :: + * Slot for bitmap to be merged into. The underlying bitmap may get + * reallocated. + * + * new_glyph :: + * Slot to be incooperated into `base_glyph`. + * + * @return: + * FreeType error code. 0 means success. Returns an error if + * color_index is invalid or reallocation fails. + */ + typedef FT_Error + (*TT_Blend_Colr_Func)( TT_Face face, + FT_UInt color_index, + FT_GlyphSlot base_glyph, + FT_GlyphSlot new_glyph ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Name_Func + * + * @description: + * From the 'name' table, return a given ENGLISH name record in ASCII. + * + * @input: + * face :: + * A handle to the source face object. + * + * nameid :: + * The name id of the name record to return. + * + * @inout: + * name :: + * The address of an allocated string pointer. `NULL` if no name is + * present. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Get_Name_Func)( TT_Face face, + FT_UShort nameid, + FT_String** name ); + + + /************************************************************************** + * + * @functype: + * TT_Get_Name_ID_Func + * + * @description: + * Search whether an ENGLISH version for a given name ID is in the 'name' + * table. + * + * @input: + * face :: + * A handle to the source face object. + * + * nameid :: + * The name id of the name record to return. + * + * @output: + * win :: + * If non-negative, an index into the 'name' table with the + * corresponding (3,1) or (3,0) Windows entry. + * + * apple :: + * If non-negative, an index into the 'name' table with the + * corresponding (1,0) Apple entry. + * + * @return: + * 1 if there is either a win or apple entry (or both), 0 otheriwse. + */ + typedef FT_Bool + (*TT_Get_Name_ID_Func)( TT_Face face, + FT_UShort nameid, + FT_Int *win, + FT_Int *apple ); + + + /************************************************************************** + * + * @functype: + * TT_Load_Table_Func + * + * @description: + * Load a given TrueType table. + * + * @input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The function uses `face->goto_table` to seek the stream to the start + * of the table, except while loading the font directory. + */ + typedef FT_Error + (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /************************************************************************** + * + * @functype: + * TT_Free_Table_Func + * + * @description: + * Free a given TrueType table. + * + * @input: + * face :: + * A handle to the target face object. + */ + typedef void + (*TT_Free_Table_Func)( TT_Face face ); + + + /* + * @functype: + * TT_Face_GetKerningFunc + * + * @description: + * Return the horizontal kerning value between two glyphs. + * + * @input: + * face :: + * A handle to the source face object. + * + * left_glyph :: + * The left glyph index. + * + * right_glyph :: + * The right glyph index. + * + * @return: + * The kerning value in font units. + */ + typedef FT_Int + (*TT_Face_GetKerningFunc)( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + + + /************************************************************************** + * + * @struct: + * SFNT_Interface + * + * @description: + * This structure holds pointers to the functions used to load and free + * the basic tables that are required in a 'sfnt' font file. + * + * @fields: + * Check the various xxx_Func() descriptions for details. + */ + typedef struct SFNT_Interface_ + { + TT_Loader_GotoTableFunc goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + FT_Module_Requester get_interface; + + TT_Load_Any_Func load_any; + + /* these functions are called by `load_face' but they can also */ + /* be called from external modules, if there is a need to do so */ + TT_Load_Table_Func load_head; + TT_Load_Metrics_Func load_hhea; + TT_Load_Table_Func load_cmap; + TT_Load_Table_Func load_maxp; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_post; + + TT_Load_Table_Func load_name; + TT_Free_Table_Func free_name; + + /* this field was called `load_kerning' up to version 2.1.10 */ + TT_Load_Table_Func load_kern; + + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h'; this field was called `load_bitmap_header' up to */ + /* version 2.1.10 */ + TT_Load_Table_Func load_bhed; + + TT_Load_SBit_Image_Func load_sbit_image; + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + + /* starting here, the structure differs from version 2.1.7 */ + + /* this field was introduced in version 2.1.8, named `get_psname' */ + TT_Face_GetKerningFunc get_kerning; + + /* new elements introduced after version 2.1.10 */ + + /* load the font directory, i.e., the offset table and */ + /* the table directory */ + TT_Load_Table_Func load_font_dir; + TT_Load_Metrics_Func load_hmtx; + + TT_Load_Table_Func load_eblc; + TT_Free_Table_Func free_eblc; + + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Strike_Metrics_Func load_strike_metrics; + + TT_Load_Table_Func load_cpal; + TT_Load_Table_Func load_colr; + TT_Free_Table_Func free_cpal; + TT_Free_Table_Func free_colr; + TT_Set_Palette_Func set_palette; + TT_Get_Colr_Layer_Func get_colr_layer; + TT_Get_Color_Glyph_Paint_Func get_colr_glyph_paint; + TT_Get_Color_Glyph_ClipBox_Func get_color_glyph_clipbox; + TT_Get_Paint_Layers_Func get_paint_layers; + TT_Get_Colorline_Stops_Func get_colorline_stops; + TT_Get_Paint_Func get_paint; + TT_Blend_Colr_Func colr_blend; + + TT_Get_Metrics_Func get_metrics; + + TT_Get_Name_Func get_name; + TT_Get_Name_ID_Func get_name_id; + + /* OpenType SVG Support */ + TT_Load_Table_Func load_svg; + TT_Free_Table_Func free_svg; + TT_Load_Svg_Doc_Func load_svg_doc; + + } SFNT_Interface; + + + /* transitional */ + typedef SFNT_Interface* SFNT_Service; + + +#define FT_DEFINE_SFNT_INTERFACE( \ + class_, \ + goto_table_, \ + init_face_, \ + load_face_, \ + done_face_, \ + get_interface_, \ + load_any_, \ + load_head_, \ + load_hhea_, \ + load_cmap_, \ + load_maxp_, \ + load_os2_, \ + load_post_, \ + load_name_, \ + free_name_, \ + load_kern_, \ + load_gasp_, \ + load_pclt_, \ + load_bhed_, \ + load_sbit_image_, \ + get_psname_, \ + free_psnames_, \ + get_kerning_, \ + load_font_dir_, \ + load_hmtx_, \ + load_eblc_, \ + free_eblc_, \ + set_sbit_strike_, \ + load_strike_metrics_, \ + load_cpal_, \ + load_colr_, \ + free_cpal_, \ + free_colr_, \ + set_palette_, \ + get_colr_layer_, \ + get_colr_glyph_paint_, \ + get_color_glyph_clipbox, \ + get_paint_layers_, \ + get_colorline_stops_, \ + get_paint_, \ + colr_blend_, \ + get_metrics_, \ + get_name_, \ + get_name_id_, \ + load_svg_, \ + free_svg_, \ + load_svg_doc_ ) \ + static const SFNT_Interface class_ = \ + { \ + goto_table_, \ + init_face_, \ + load_face_, \ + done_face_, \ + get_interface_, \ + load_any_, \ + load_head_, \ + load_hhea_, \ + load_cmap_, \ + load_maxp_, \ + load_os2_, \ + load_post_, \ + load_name_, \ + free_name_, \ + load_kern_, \ + load_gasp_, \ + load_pclt_, \ + load_bhed_, \ + load_sbit_image_, \ + get_psname_, \ + free_psnames_, \ + get_kerning_, \ + load_font_dir_, \ + load_hmtx_, \ + load_eblc_, \ + free_eblc_, \ + set_sbit_strike_, \ + load_strike_metrics_, \ + load_cpal_, \ + load_colr_, \ + free_cpal_, \ + free_colr_, \ + set_palette_, \ + get_colr_layer_, \ + get_colr_glyph_paint_, \ + get_color_glyph_clipbox, \ + get_paint_layers_, \ + get_colorline_stops_, \ + get_paint_, \ + colr_blend_, \ + get_metrics_, \ + get_name_, \ + get_name_id_, \ + load_svg_, \ + free_svg_, \ + load_svg_doc_ \ + }; + + +FT_END_HEADER + +#endif /* SFNT_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/svginterface.h b/external/freetype/include/freetype/internal/svginterface.h new file mode 100644 index 000000000..f464b2c05 --- /dev/null +++ b/external/freetype/include/freetype/internal/svginterface.h @@ -0,0 +1,46 @@ +/**************************************************************************** + * + * svginterface.h + * + * Interface of ot-svg module (specification only). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SVGINTERFACE_H_ +#define SVGINTERFACE_H_ + +#include +#include + + +FT_BEGIN_HEADER + + typedef FT_Error + (*Preset_Bitmap_Func)( FT_Module module, + FT_GlyphSlot slot, + FT_Bool cache ); + + typedef struct SVG_Interface_ + { + Preset_Bitmap_Func preset_slot; + + } SVG_Interface; + + typedef SVG_Interface* SVG_Service; + +FT_END_HEADER + +#endif /* SVGINTERFACE_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/t1types.h b/external/freetype/include/freetype/internal/t1types.h new file mode 100644 index 000000000..b9c94398f --- /dev/null +++ b/external/freetype/include/freetype/internal/t1types.h @@ -0,0 +1,259 @@ +/**************************************************************************** + * + * t1types.h + * + * Basic Type1/Type2 type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1TYPES_H_ +#define T1TYPES_H_ + + +#include +#include +#include +#include +#include + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * T1_EncodingRec + * + * @description: + * A structure modeling a custom encoding. + * + * @fields: + * num_chars :: + * The number of character codes in the encoding. Usually 256. + * + * code_first :: + * The lowest valid character code in the encoding. + * + * code_last :: + * The highest valid character code in the encoding + 1. When equal to + * code_first there are no valid character codes. + * + * char_index :: + * An array of corresponding glyph indices. + * + * char_name :: + * An array of corresponding glyph names. + */ + typedef struct T1_EncodingRecRec_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + const FT_String** char_name; + + } T1_EncodingRec, *T1_Encoding; + + + /* used to hold extra data of PS_FontInfoRec that + * cannot be stored in the publicly defined structure. + * + * Note these can't be blended with multiple-masters. + */ + typedef struct PS_FontExtraRec_ + { + FT_UShort fs_type; + + } PS_FontExtraRec; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + PS_FontExtraRec font_extra; /* font info extra fields */ + PS_PrivateRec private_dict; /* private dictionary */ + FT_String* font_name; /* top-level dictionary */ + + T1_EncodingType encoding_type; + T1_EncodingRec encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_UInt* subrs_len; + FT_Hash subrs_hash; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_UInt* charstrings_len; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_BBox font_bbox; + FT_Long font_id; + + FT_Fixed stroke_width; + + } T1_FontRec, *T1_Font; + + + typedef struct CID_SubrsRec_ + { + FT_Int num_subrs; + FT_Byte** code; + + } CID_SubrsRec, *CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** AFM FONT INFORMATION STRUCTURES ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_TrackKernRec_ + { + FT_Int degree; + FT_Fixed min_ptsize; + FT_Fixed min_kern; + FT_Fixed max_ptsize; + FT_Fixed max_kern; + + } AFM_TrackKernRec, *AFM_TrackKern; + + typedef struct AFM_KernPairRec_ + { + FT_UInt index1; + FT_UInt index2; + FT_Int x; + FT_Int y; + + } AFM_KernPairRec, *AFM_KernPair; + + typedef struct AFM_FontInfoRec_ + { + FT_Bool IsCIDFont; + FT_BBox FontBBox; + FT_Fixed Ascender; /* optional, mind the zero */ + FT_Fixed Descender; /* optional, mind the zero */ + AFM_TrackKern TrackKerns; /* free if non-NULL */ + FT_UInt NumTrackKern; + AFM_KernPair KernPairs; /* free if non-NULL */ + FT_UInt NumKernPair; + + } AFM_FontInfoRec, *AFM_FontInfo; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + + /* support for Multiple Masters fonts */ + PS_Blend blend; + + /* undocumented, optional: indices of subroutines that express */ + /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ + /* respectively, as Type 2 charstrings; -1 if keywords not present */ + FT_Int ndv_idx; + FT_Int cdv_idx; + + /* undocumented, optional: has the same meaning as len_buildchar */ + /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ + FT_UInt len_buildchar; + FT_Long* buildchar; + + /* since version 2.1 - interface to PostScript hinter */ + const void* pshinter; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_FaceInfoRec cid; + PS_FontExtraRec font_extra; +#if 0 + void* afm_data; +#endif + CID_Subrs subrs; + + /* since version 2.1 - interface to PostScript hinter */ + void* pshinter; + + /* since version 2.1.8, but was originally positioned after `afm_data' */ + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* T1TYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/tttypes.h b/external/freetype/include/freetype/internal/tttypes.h new file mode 100644 index 000000000..b9788c783 --- /dev/null +++ b/external/freetype/include/freetype/internal/tttypes.h @@ -0,0 +1,1741 @@ +/**************************************************************************** + * + * tttypes.h + * + * Basic SFNT/TrueType type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTTYPES_H_ +#define TTTYPES_H_ + + +#include +#include +#include + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TTC_HeaderRec + * + * @description: + * TrueType collection header. This table contains the offsets of the + * font headers of each distinct TrueType face in the file. + * + * @fields: + * tag :: + * Must be 'ttc~' to indicate a TrueType collection. + * + * version :: + * The version number. + * + * count :: + * The number of faces in the collection. The specification says this + * should be an unsigned long, but we use a signed long since we need + * the value -1 for specific purposes. + * + * offsets :: + * The offsets of the font headers, one per face. + */ + typedef struct TTC_HeaderRec_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_HeaderRec; + + + /************************************************************************** + * + * @struct: + * SFNT_HeaderRec + * + * @description: + * SFNT file format header. + * + * @fields: + * format_tag :: + * The font format tag. + * + * num_tables :: + * The number of tables in file. + * + * search_range :: + * Must be '16 * (max power of 2 <= num_tables)'. + * + * entry_selector :: + * Must be log2 of 'search_range / 16'. + * + * range_shift :: + * Must be 'num_tables * 16 - search_range'. + */ + typedef struct SFNT_HeaderRec_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + FT_ULong offset; /* not in file */ + + } SFNT_HeaderRec, *SFNT_Header; + + + /************************************************************************** + * + * @struct: + * TT_TableRec + * + * @description: + * This structure describes a given table of a TrueType font. + * + * @fields: + * Tag :: + * A four-bytes tag describing the table. + * + * CheckSum :: + * The table checksum. This value can be ignored. + * + * Offset :: + * The offset of the table from the start of the TrueType font in its + * resource. + * + * Length :: + * The table length (in bytes). + */ + typedef struct TT_TableRec_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_TableRec, *TT_Table; + + + /************************************************************************** + * + * @struct: + * TT_LongMetricsRec + * + * @description: + * A structure modeling the long metrics of the 'hmtx' and 'vmtx' + * TrueType tables. The values are expressed in font units. + * + * @fields: + * advance :: + * The advance width or height for the glyph. + * + * bearing :: + * The left-side or top-side bearing for the glyph. + */ + typedef struct TT_LongMetricsRec_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetricsRec, *TT_LongMetrics; + + + /************************************************************************** + * + * @type: + * TT_ShortMetrics + * + * @description: + * A simple type to model the short metrics of the 'hmtx' and 'vmtx' + * tables. + */ + typedef FT_Short TT_ShortMetrics; + + + /************************************************************************** + * + * @struct: + * TT_NameRec + * + * @description: + * A structure modeling TrueType name records. Name records are used to + * store important strings like family name, style name, copyright, + * etc. in _localized_ versions (i.e., language, encoding, etc). + * + * @fields: + * platformID :: + * The ID of the name's encoding platform. + * + * encodingID :: + * The platform-specific ID for the name's encoding. + * + * languageID :: + * The platform-specific ID for the name's language. + * + * nameID :: + * The ID specifying what kind of name this is. + * + * stringLength :: + * The length of the string in bytes. + * + * stringOffset :: + * The offset to the string in the 'name' table. + * + * string :: + * A pointer to the string's bytes. Note that these are usually UTF-16 + * encoded characters. + */ + typedef struct TT_NameRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameRec, *TT_Name; + + + /************************************************************************** + * + * @struct: + * TT_LangTagRec + * + * @description: + * A structure modeling language tag records in SFNT 'name' tables, + * introduced in OpenType version 1.6. + * + * @fields: + * stringLength :: + * The length of the string in bytes. + * + * stringOffset :: + * The offset to the string in the 'name' table. + * + * string :: + * A pointer to the string's bytes. Note that these are UTF-16BE + * encoded characters. + */ + typedef struct TT_LangTagRec_ + { + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_LangTagRec, *TT_LangTag; + + + /************************************************************************** + * + * @struct: + * TT_NameTableRec + * + * @description: + * A structure modeling the TrueType name table. + * + * @fields: + * format :: + * The format of the name table. + * + * numNameRecords :: + * The number of names in table. + * + * storageOffset :: + * The offset of the name table in the 'name' TrueType table. + * + * names :: + * An array of name records. + * + * numLangTagRecords :: + * The number of language tags in table. + * + * langTags :: + * An array of language tag records. + * + * stream :: + * The file's input stream. + */ + typedef struct TT_NameTableRec_ + { + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameRec* names; + FT_UInt numLangTagRecords; + TT_LangTagRec* langTags; + FT_Stream stream; + + } TT_NameTableRec, *TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TT_GaspRangeRec + * + * @description: + * A tiny structure used to model a gasp range according to the TrueType + * specification. + * + * @fields: + * maxPPEM :: + * The maximum ppem value to which `gaspFlag` applies. + * + * gaspFlag :: + * A flag describing the grid-fitting and anti-aliasing modes to be + * used. + */ + typedef struct TT_GaspRangeRec_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRangeRec, *TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /************************************************************************** + * + * @struct: + * TT_GaspRec + * + * @description: + * A structure modeling the TrueType 'gasp' table used to specify + * grid-fitting and anti-aliasing behaviour. + * + * @fields: + * version :: + * The version number. + * + * numRanges :: + * The number of gasp ranges in table. + * + * gaspRanges :: + * An array of gasp ranges. + */ + typedef struct TT_Gasp_ + { + FT_UShort version; + FT_UShort numRanges; + TT_GaspRange gaspRanges; + + } TT_GaspRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TT_SBit_MetricsRec + * + * @description: + * A structure used to hold the big metrics of a given glyph bitmap in a + * TrueType or OpenType font. These are usually found in the 'EBDT' + * (Microsoft) or 'bloc' (Apple) table. + * + * @fields: + * height :: + * The glyph height in pixels. + * + * width :: + * The glyph width in pixels. + * + * horiBearingX :: + * The horizontal left bearing. + * + * horiBearingY :: + * The horizontal top bearing. + * + * horiAdvance :: + * The horizontal advance. + * + * vertBearingX :: + * The vertical left bearing. + * + * vertBearingY :: + * The vertical top bearing. + * + * vertAdvance :: + * The vertical advance. + */ + typedef struct TT_SBit_MetricsRec_ + { + FT_UShort height; + FT_UShort width; + + FT_Short horiBearingX; + FT_Short horiBearingY; + FT_UShort horiAdvance; + + FT_Short vertBearingX; + FT_Short vertBearingY; + FT_UShort vertAdvance; + + } TT_SBit_MetricsRec, *TT_SBit_Metrics; + + + /************************************************************************** + * + * @struct: + * TT_SBit_SmallMetricsRec + * + * @description: + * A structure used to hold the small metrics of a given glyph bitmap in + * a TrueType or OpenType font. These are usually found in the 'EBDT' + * (Microsoft) or the 'bdat' (Apple) table. + * + * @fields: + * height :: + * The glyph height in pixels. + * + * width :: + * The glyph width in pixels. + * + * bearingX :: + * The left-side bearing. + * + * bearingY :: + * The top-side bearing. + * + * advance :: + * The advance width or height. + */ + typedef struct TT_SBit_Small_Metrics_ + { + FT_Byte height; + FT_Byte width; + + FT_Char bearingX; + FT_Char bearingY; + FT_Byte advance; + + } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; + + + /************************************************************************** + * + * @struct: + * TT_SBit_LineMetricsRec + * + * @description: + * A structure used to describe the text line metrics of a given bitmap + * strike, for either a horizontal or vertical layout. + * + * @fields: + * ascender :: + * The ascender in pixels. + * + * descender :: + * The descender in pixels. + * + * max_width :: + * The maximum glyph width in pixels. + * + * caret_slope_enumerator :: + * Rise of the caret slope, typically set to 1 for non-italic fonts. + * + * caret_slope_denominator :: + * Rise of the caret slope, typically set to 0 for non-italic fonts. + * + * caret_offset :: + * Offset in pixels to move the caret for proper positioning. + * + * min_origin_SB :: + * Minimum of horiBearingX (resp. vertBearingY). + * min_advance_SB :: + * Minimum of + * + * horizontal advance - ( horiBearingX + width ) + * + * resp. + * + * vertical advance - ( vertBearingY + height ) + * + * max_before_BL :: + * Maximum of horiBearingY (resp. vertBearingY). + * + * min_after_BL :: + * Minimum of + * + * horiBearingY - height + * + * resp. + * + * vertBearingX - width + * + * pads :: + * Unused (to make the size of the record a multiple of 32 bits. + */ + typedef struct TT_SBit_LineMetricsRec_ + { + FT_Char ascender; + FT_Char descender; + FT_Byte max_width; + FT_Char caret_slope_numerator; + FT_Char caret_slope_denominator; + FT_Char caret_offset; + FT_Char min_origin_SB; + FT_Char min_advance_SB; + FT_Char max_before_BL; + FT_Char min_after_BL; + FT_Char pads[2]; + + } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; + + + /************************************************************************** + * + * @struct: + * TT_SBit_RangeRec + * + * @description: + * A TrueType/OpenType subIndexTable as defined in the 'EBLC' (Microsoft) + * or 'bloc' (Apple) tables. + * + * @fields: + * first_glyph :: + * The first glyph index in the range. + * + * last_glyph :: + * The last glyph index in the range. + * + * index_format :: + * The format of index table. Valid values are 1 to 5. + * + * image_format :: + * The format of 'EBDT' image data. + * + * image_offset :: + * The offset to image data in 'EBDT'. + * + * image_size :: + * For index formats 2 and 5. This is the size in bytes of each glyph + * bitmap. + * + * big_metrics :: + * For index formats 2 and 5. This is the big metrics for each glyph + * bitmap. + * + * num_glyphs :: + * For index formats 4 and 5. This is the number of glyphs in the code + * array. + * + * glyph_offsets :: + * For index formats 1 and 3. + * + * glyph_codes :: + * For index formats 4 and 5. + * + * table_offset :: + * The offset of the index table in the 'EBLC' table. Only used during + * strike loading. + */ + typedef struct TT_SBit_RangeRec_ + { + FT_UShort first_glyph; + FT_UShort last_glyph; + + FT_UShort index_format; + FT_UShort image_format; + FT_ULong image_offset; + + FT_ULong image_size; + TT_SBit_MetricsRec metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_RangeRec, *TT_SBit_Range; + + + /************************************************************************** + * + * @struct: + * TT_SBit_StrikeRec + * + * @description: + * A structure used describe a given bitmap strike in the 'EBLC' + * (Microsoft) or 'bloc' (Apple) tables. + * + * @fields: + * num_index_ranges :: + * The number of index ranges. + * + * index_ranges :: + * An array of glyph index ranges. + * + * color_ref :: + * Unused. `color_ref` is put in for future enhancements, but these + * fields are already in use by other platforms (e.g. Newton). For + * details, please see + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html + * + * hori :: + * The line metrics for horizontal layouts. + * + * vert :: + * The line metrics for vertical layouts. + * + * start_glyph :: + * The lowest glyph index for this strike. + * + * end_glyph :: + * The highest glyph index for this strike. + * + * x_ppem :: + * The number of horizontal pixels per EM. + * + * y_ppem :: + * The number of vertical pixels per EM. + * + * bit_depth :: + * The bit depth. Valid values are 1, 2, 4, and 8. + * + * flags :: + * Is this a vertical or horizontal strike? For details, please see + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html + */ + typedef struct TT_SBit_StrikeRec_ + { + FT_Int num_ranges; + TT_SBit_Range sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_UShort start_glyph; + FT_UShort end_glyph; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte bit_depth; + FT_Char flags; + + } TT_SBit_StrikeRec, *TT_SBit_Strike; + + + /************************************************************************** + * + * @struct: + * TT_SBit_ComponentRec + * + * @description: + * A simple structure to describe a compound sbit element. + * + * @fields: + * glyph_code :: + * The element's glyph index. + * + * x_offset :: + * The element's left bearing. + * + * y_offset :: + * The element's top bearing. + */ + typedef struct TT_SBit_ComponentRec_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_ComponentRec, *TT_SBit_Component; + + + /************************************************************************** + * + * @struct: + * TT_SBit_ScaleRec + * + * @description: + * A structure used describe a given bitmap scaling table, as defined in + * the 'EBSC' table. + * + * @fields: + * hori :: + * The horizontal line metrics. + * + * vert :: + * The vertical line metrics. + * + * x_ppem :: + * The number of horizontal pixels per EM. + * + * y_ppem :: + * The number of vertical pixels per EM. + * + * x_ppem_substitute :: + * Substitution x_ppem value. + * + * y_ppem_substitute :: + * Substitution y_ppem value. + */ + typedef struct TT_SBit_ScaleRec_ + { + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_ScaleRec, *TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @struct: + * TT_Post_NamesRec + * + * @description: + * Postscript names table, either format 2.0 or 2.5. + * + * @fields: + * loaded :: + * A flag to indicate whether the PS names are loaded. + * + * num_glyphs :: + * The number of named glyphs in the table. + * + * num_names :: + * The number of PS names stored in the table. + * + * glyph_indices :: + * The indices of the glyphs in the names arrays. + * + * glyph_names :: + * The PS names not in Mac Encoding. + */ + typedef struct TT_Post_NamesRec_ + { + FT_Bool loaded; + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Byte** glyph_names; + + } TT_Post_NamesRec, *TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** GX VARIATION TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + typedef struct GX_BlendRec_ *GX_Blend; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based bitmap + * fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. USHORT + * strikeCount Number of strikes (bitmap sizes) in this table. ULONG + * stringTable Offset (from start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. USHORT numItems + * Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each `value + * set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ + +#ifdef TT_CONFIG_OPTION_BDF + + typedef struct TT_BDFRec_ + { + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_ULong strings_size; + FT_UInt num_strikes; + FT_Bool loaded; + + } TT_BDFRec, *TT_BDF; + +#endif /* TT_CONFIG_OPTION_BDF */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * This structure/class is defined here because it is common to the + * following formats: TTF, OpenType-TT, and OpenType-CFF. + * + * Note, however, that the classes TT_Size and TT_GlyphSlot are not shared + * between font drivers, and are thus defined in `ttobjs.h`. + * + */ + + + /************************************************************************** + * + * @type: + * TT_Face + * + * @description: + * A handle to a TrueType face/font object. A TT_Face encapsulates the + * resolution and scaling independent parts of a TrueType font resource. + * + * @note: + * The TT_Face structure is also used as a 'parent class' for the + * OpenType-CFF class (T2_Face). + */ + typedef struct TT_FaceRec_* TT_Face; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error + (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_LoaderRec_* TT_Loader; + + + /************************************************************************** + * + * @functype: + * TT_Loader_GotoTableFunc + * + * @description: + * Seeks a stream to the start of a given TrueType table. + * + * @input: + * face :: + * A handle to the target face object. + * + * tag :: + * A 4-byte tag used to name the table. + * + * stream :: + * The input stream. + * + * @output: + * length :: + * The length of the table in bytes. Set to 0 if not needed. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The stream cursor must be at the font file's origin. + */ + typedef FT_Error + (*TT_Loader_GotoTableFunc)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /************************************************************************** + * + * @functype: + * TT_Loader_StartGlyphFunc + * + * @description: + * Seeks a stream to the start of a given glyph element, and opens a + * frame for it. + * + * @input: + * loader :: + * The current TrueType glyph loader object. + * + * glyph index :: The index of the glyph to access. + * + * offset :: + * The offset of the glyph according to the 'locations' table. + * + * byte_count :: + * The size of the frame in bytes. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function is normally equivalent to FT_STREAM_SEEK(offset) + * followed by FT_FRAME_ENTER(byte_count) with the loader's stream, but + * alternative formats (e.g. compressed ones) might use something + * different. + */ + typedef FT_Error + (*TT_Loader_StartGlyphFunc)( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /************************************************************************** + * + * @functype: + * TT_Loader_ReadGlyphFunc + * + * @description: + * Reads one glyph element (its header, a simple glyph, or a composite) + * from the loader's current stream frame. + * + * @input: + * loader :: + * The current TrueType glyph loader object. + * + * @return: + * FreeType error code. 0 means success. + */ + typedef FT_Error + (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); + + + /************************************************************************** + * + * @functype: + * TT_Loader_EndGlyphFunc + * + * @description: + * Closes the current loader stream frame for the glyph. + * + * @input: + * loader :: + * The current TrueType glyph loader object. + */ + typedef void + (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); + + + typedef enum TT_SbitTableType_ + { + TT_SBIT_TABLE_TYPE_NONE = 0, + TT_SBIT_TABLE_TYPE_EBLC, /* `EBLC' (Microsoft), */ + /* `bloc' (Apple) */ + TT_SBIT_TABLE_TYPE_CBLC, /* `CBLC' (Google) */ + TT_SBIT_TABLE_TYPE_SBIX, /* `sbix' (Apple) */ + + /* do not remove */ + TT_SBIT_TABLE_TYPE_MAX + + } TT_SbitTableType; + + + /* OpenType 1.8 brings new tables for variation font support; */ + /* to make the old MM and GX fonts still work we need to check */ + /* the presence (and validity) of the functionality provided */ + /* by those tables. The following flag macros are for the */ + /* field `variation_support'. */ + /* */ + /* Note that `fvar' gets checked immediately at font loading, */ + /* while the other features are only loaded if MM support is */ + /* actually requested. */ + + /* FVAR */ +#define TT_FACE_FLAG_VAR_FVAR ( 1 << 0 ) + + /* HVAR */ +#define TT_FACE_FLAG_VAR_HADVANCE ( 1 << 1 ) +#define TT_FACE_FLAG_VAR_LSB ( 1 << 2 ) +#define TT_FACE_FLAG_VAR_RSB ( 1 << 3 ) + + /* VVAR */ +#define TT_FACE_FLAG_VAR_VADVANCE ( 1 << 4 ) +#define TT_FACE_FLAG_VAR_TSB ( 1 << 5 ) +#define TT_FACE_FLAG_VAR_BSB ( 1 << 6 ) +#define TT_FACE_FLAG_VAR_VORG ( 1 << 7 ) + + /* MVAR */ +#define TT_FACE_FLAG_VAR_MVAR ( 1 << 8 ) + + + /************************************************************************** + * + * TrueType Face Type + * + * @struct: + * TT_Face + * + * @description: + * The TrueType face class. These objects model the resolution and + * point-size independent data found in a TrueType font file. + * + * @fields: + * root :: + * The base FT_Face structure, managed by the base layer. + * + * ttc_header :: + * The TrueType collection header, used when the file is a 'ttc' rather + * than a 'ttf'. For ordinary font files, the field `ttc_header.count` + * is set to 0. + * + * format_tag :: + * The font format tag. + * + * num_tables :: + * The number of TrueType tables in this font file. + * + * dir_tables :: + * The directory of TrueType tables for this font file. + * + * header :: + * The font's font header ('head' table). Read on font opening. + * + * horizontal :: + * The font's horizontal header ('hhea' table). This field also + * contains the associated horizontal metrics table ('hmtx'). + * + * max_profile :: + * The font's maximum profile table. Read on font opening. Note that + * some maximum values cannot be taken directly from this table. We + * thus define additional fields below to hold the computed maxima. + * + * vertical_info :: + * A boolean which is set when the font file contains vertical metrics. + * If not, the value of the 'vertical' field is undefined. + * + * vertical :: + * The font's vertical header ('vhea' table). This field also contains + * the associated vertical metrics table ('vmtx'), if found. + * IMPORTANT: The contents of this field is undefined if the + * `vertical_info` field is unset. + * + * num_names :: + * The number of name records within this TrueType font. + * + * name_table :: + * The table of name records ('name'). + * + * os2 :: + * The font's OS/2 table ('OS/2'). + * + * postscript :: + * The font's PostScript table ('post' table). The PostScript glyph + * names are not loaded by the driver on face opening. See the + * 'ttpost' module for more details. + * + * cmap_table :: + * Address of the face's 'cmap' SFNT table in memory (it's an extracted + * frame). + * + * cmap_size :: + * The size in bytes of the `cmap_table` described above. + * + * goto_table :: + * A function called by each TrueType table loader to position a + * stream's cursor to the start of a given table according to its tag. + * It defaults to TT_Goto_Face but can be different for strange formats + * (e.g. Type 42). + * + * access_glyph_frame :: + * A function used to access the frame of a given glyph within the + * face's font file. + * + * forget_glyph_frame :: + * A function used to forget the frame of a given glyph when all data + * has been loaded. + * + * read_glyph_header :: + * A function used to read a glyph header. It must be called between + * an 'access' and 'forget'. + * + * read_simple_glyph :: + * A function used to read a simple glyph. It must be called after the + * header was read, and before the 'forget'. + * + * read_composite_glyph :: + * A function used to read a composite glyph. It must be called after + * the header was read, and before the 'forget'. + * + * sfnt :: + * A pointer to the SFNT service. + * + * psnames :: + * A pointer to the PostScript names service. + * + * mm :: + * A pointer to the Multiple Masters service. + * + * tt_var :: + * A pointer to the Metrics Variations service for the "truetype" + * driver. + * + * face_var :: + * A pointer to the Metrics Variations service for this `TT_Face`'s + * driver. + * + * psaux :: + * A pointer to the PostScript Auxiliary service. + * + * gasp :: + * The grid-fitting and scaling properties table ('gasp'). This table + * is optional in TrueType/OpenType fonts. + * + * pclt :: + * The 'pclt' SFNT table. + * + * num_sbit_scales :: + * The number of sbit scales for this font. + * + * sbit_scales :: + * Array of sbit scales embedded in this font. This table is optional + * in a TrueType/OpenType font. + * + * postscript_names :: + * A table used to store the Postscript names of the glyphs for this + * font. See the file `ttconfig.h` for comments on the + * TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. + * + * palette_data :: + * Some fields from the 'CPAL' table that are directly indexed. + * + * palette_index :: + * The current palette index, as set by @FT_Palette_Select. + * + * palette :: + * An array containing the current palette's colors. + * + * have_foreground_color :: + * There was a call to @FT_Palette_Set_Foreground_Color. + * + * foreground_color :: + * The current foreground color corresponding to 'CPAL' color index + * 0xFFFF. Only valid if `have_foreground_color` is set. + * + * font_program_size :: + * Size in bytecodes of the face's font program. 0 if none defined. + * Ignored for Type 2 fonts. + * + * font_program :: + * The face's font program (bytecode stream) executed at load time, + * also used during glyph rendering. Comes from the 'fpgm' table. + * Ignored for Type 2 font fonts. + * + * cvt_program_size :: + * The size in bytecodes of the face's cvt program. Ignored for Type 2 + * fonts. + * + * cvt_program :: + * The face's cvt program (bytecode stream) executed each time an + * instance/size is changed/reset. Comes from the 'prep' table. + * Ignored for Type 2 fonts. + * + * cvt_size :: + * Size of the control value table (in entries). Ignored for Type 2 + * fonts. + * + * cvt :: + * The face's original control value table. Coordinates are expressed + * in unscaled font units (in 26.6 format). Comes from the 'cvt~' + * table. Ignored for Type 2 fonts. + * + * If varied by the `CVAR' table, non-integer values are possible. + * + * interpreter :: + * A pointer to the TrueType bytecode interpreters field is also used + * to hook the debugger in 'ttdebug'. + * + * extra :: + * Reserved for third-party font drivers. + * + * postscript_name :: + * The PS name of the font. Used by the postscript name service. + * + * glyf_len :: + * The length of the 'glyf' table. Needed for malformed 'loca' tables. + * + * glyf_offset :: + * The file offset of the 'glyf' table. + * + * is_cff2 :: + * Set if the font format is CFF2. + * + * doblend :: + * A boolean which is set if the font should be blended (this is for GX + * var). + * + * blend :: + * Contains the data needed to control GX variation tables (rather like + * Multiple Master data). + * + * variation_support :: + * Flags that indicate which OpenType functionality related to font + * variation support is present, valid, and usable. For example, + * TT_FACE_FLAG_VAR_FVAR is only set if we have at least one design + * axis. + * + * var_postscript_prefix :: + * The PostScript name prefix needed for constructing a variation font + * instance's PS name . + * + * var_postscript_prefix_len :: + * The length of the `var_postscript_prefix` string. + * + * var_default_named_instance :: + * The index of the default named instance. + * + * non_var_style_name :: + * The non-variation style name, used as a backup. + * + * horz_metrics_size :: + * The size of the 'hmtx' table. + * + * vert_metrics_size :: + * The size of the 'vmtx' table. + * + * num_locations :: + * The number of glyph locations in this TrueType file. This should be + * one more than the number of glyphs. Ignored for Type 2 fonts. + * + * glyph_locations :: + * An array of longs. These are offsets to glyph data within the + * 'glyf' table. Ignored for Type 2 font faces. + * + * hdmx_table :: + * A pointer to the 'hdmx' table. + * + * hdmx_table_size :: + * The size of the 'hdmx' table. + * + * hdmx_record_count :: + * The number of hdmx records. + * + * hdmx_record_size :: + * The size of a single hdmx record. + * + * hdmx_records :: + * A array of pointers to the 'hdmx' table records sorted by ppem. + * + * sbit_table :: + * A pointer to the font's embedded bitmap location table. + * + * sbit_table_size :: + * The size of `sbit_table`. + * + * sbit_table_type :: + * The sbit table type (CBLC, sbix, etc.). + * + * sbit_num_strikes :: + * The number of sbit strikes exposed by FreeType's API, omitting + * invalid strikes. + * + * sbit_strike_map :: + * A mapping between the strike indices exposed by the API and the + * indices used in the font's sbit table. + * + * kern_table :: + * A pointer to the 'kern' table. + * + * kern_table_size :: + * The size of the 'kern' table. + * + * num_kern_tables :: + * The number of supported kern subtables (up to 32; FreeType + * recognizes only horizontal ones with format 0). + * + * kern_avail_bits :: + * The availability status of kern subtables; if bit n is set, table n + * is available. + * + * kern_order_bits :: + * The sortedness status of kern subtables; if bit n is set, table n is + * sorted. + * + * bdf :: + * Data related to an SFNT font's 'bdf' table; see `tttypes.h`. + * + * horz_metrics_offset :: + * The file offset of the 'hmtx' table. + * + * vert_metrics_offset :: + * The file offset of the 'vmtx' table. + * + * ebdt_start :: + * The file offset of the sbit data table (CBDT, bdat, etc.). + * + * ebdt_size :: + * The size of the sbit data table. + * + * cpal :: + * A pointer to data related to the 'CPAL' table. `NULL` if the table + * is not available. + * + * colr :: + * A pointer to data related to the 'COLR' table. `NULL` if the table + * is not available. + * + * svg :: + * A pointer to data related to the 'SVG' table. `NULL` if the table + * is not available. + */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_HeaderRec ttc_header; + + FT_ULong format_tag; + FT_UShort num_tables; + TT_Table dir_tables; + + TT_Header header; /* TrueType header table */ + TT_HoriHeader horizontal; /* TrueType horizontal header */ + + TT_MaxProfile max_profile; + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTableRec name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Byte* cmap_table; /* extracted `cmap' table */ + FT_ULong cmap_size; + + TT_Loader_GotoTableFunc goto_table; + + TT_Loader_StartGlyphFunc access_glyph_frame; + TT_Loader_EndGlyphFunc forget_glyph_frame; + TT_Loader_ReadGlyphFunc read_glyph_header; + TT_Loader_ReadGlyphFunc read_simple_glyph; + TT_Loader_ReadGlyphFunc read_composite_glyph; + + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ + void* sfnt; + + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* a typeless pointer to the FT_Service_MultiMasters table used to */ + /* handle variation fonts */ + void* mm; + + /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ + /* used to handle the HVAR, VVAR, and MVAR OpenType tables by the */ + /* "truetype" driver */ + void* tt_var; + + /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ + /* used to handle the HVAR, VVAR, and MVAR OpenType tables by this */ + /* TT_Face's driver */ + void* face_var; /* since 2.13.1 */ +#endif + + /* a typeless pointer to the PostScript Aux service */ + void* psaux; + + + /************************************************************************ + * + * Optional TrueType/OpenType tables + * + */ + + /* grid-fitting and scaling table */ + TT_GaspRec gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ + FT_ULong num_sbit_scales; + TT_SBit_Scale sbit_scales; + + /* postscript names table */ + TT_Post_NamesRec postscript_names; + + /* glyph colors */ + FT_Palette_Data palette_data; /* since 2.10 */ + FT_UShort palette_index; + FT_Color* palette; + FT_Bool have_foreground_color; + FT_Color foreground_color; + + + /************************************************************************ + * + * TrueType-specific fields (ignored by the CFF driver) + * + */ + + /* the font program, if any */ + FT_ULong font_program_size; + FT_Byte* font_program; + + /* the cvt program, if any */ + FT_ULong cvt_program_size; + FT_Byte* cvt_program; + + /* the original, unscaled, control value table */ + FT_ULong cvt_size; + FT_Int32* cvt; + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + + + /************************************************************************ + * + * Other tables or fields. This is used by derivative formats like + * OpenType. + * + */ + + FT_Generic extra; + + const char* postscript_name; + + FT_ULong glyf_len; + FT_ULong glyf_offset; /* since 2.7.1 */ + + FT_Bool is_cff2; /* since 2.7.1 */ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Bool doblend; + GX_Blend blend; + + FT_UInt32 variation_support; /* since 2.7.1 */ + + const char* var_postscript_prefix; /* since 2.7.2 */ + FT_UInt var_postscript_prefix_len; /* since 2.7.2 */ + + FT_UInt var_default_named_instance; /* since 2.13.1 */ + + const char* non_var_style_name; /* since 2.13.1 */ +#endif + + /* since version 2.2 */ + + FT_ULong horz_metrics_size; + FT_ULong vert_metrics_size; + + FT_ULong num_locations; /* up to 0xFFFF + 1 */ + FT_Byte* glyph_locations; + + FT_Byte* hdmx_table; + FT_ULong hdmx_table_size; + FT_UInt hdmx_record_count; + FT_ULong hdmx_record_size; + FT_Byte** hdmx_records; + + FT_Byte* sbit_table; + FT_ULong sbit_table_size; + TT_SbitTableType sbit_table_type; + FT_UInt sbit_num_strikes; + FT_UInt* sbit_strike_map; + + FT_Byte* kern_table; + FT_ULong kern_table_size; + FT_UInt num_kern_tables; + FT_UInt32 kern_avail_bits; + FT_UInt32 kern_order_bits; + +#ifdef TT_CONFIG_OPTION_BDF + TT_BDFRec bdf; +#endif /* TT_CONFIG_OPTION_BDF */ + + /* since 2.3.0 */ + FT_ULong horz_metrics_offset; + FT_ULong vert_metrics_offset; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* since 2.7 */ + FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */ + FT_ULong ebdt_size; +#endif + + /* since 2.10 */ + void* cpal; + void* colr; + + /* since 2.12 */ + void* svg; + + } TT_FaceRec; + + + /************************************************************************** + * + * @struct: + * TT_GlyphZoneRec + * + * @description: + * A glyph zone is used to load, scale and hint glyph outline + * coordinates. + * + * @fields: + * memory :: + * A handle to the memory manager. + * + * max_points :: + * The maximum size in points of the zone. + * + * max_contours :: + * Max size in links contours of the zone. + * + * n_points :: + * The current number of points in the zone. + * + * n_contours :: + * The current number of contours in the zone. + * + * org :: + * The original glyph coordinates (font units/scaled). + * + * cur :: + * The current glyph coordinates (scaled/hinted). + * + * tags :: + * The point control tags. + * + * contours :: + * The contours end points. + * + * first_point :: + * Offset of the current subglyph's first point. + */ + typedef struct TT_GlyphZoneRec_ + { + FT_Memory memory; + FT_UShort max_points; + FT_Short max_contours; + FT_UShort n_points; /* number of points in zone */ + FT_Short n_contours; /* number of contours */ + + FT_Vector* org; /* original point coordinates */ + FT_Vector* cur; /* current point coordinates */ + FT_Vector* orus; /* original (unscaled) point coordinates */ + + FT_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + FT_UShort first_point; /* offset of first (#0) point */ + + } TT_GlyphZoneRec, *TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + + /************************************************************************** + * + * @type: + * TT_Size + * + * @description: + * A handle to a TrueType size object. + */ + typedef struct TT_SizeRec_* TT_Size; + + + /* glyph loader structure */ + typedef struct TT_LoaderRec_ + { + TT_Face face; + TT_Size size; + FT_GlyphSlot glyph; + FT_GlyphLoader gloader; + + FT_ULong load_flags; + FT_UInt glyph_index; + + FT_Stream stream; + FT_UInt byte_len; + + FT_Short n_contours; + FT_BBox bbox; + FT_Int left_bearing; + FT_Int advance; + FT_Int linear; + FT_Bool linear_def; + FT_Vector pp1; + FT_Vector pp2; + + /* the zone where we load our glyphs */ + TT_GlyphZoneRec base; + TT_GlyphZoneRec zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + /* since version 2.1.8 */ + FT_Int top_bearing; + FT_Int vadvance; + FT_Vector pp3; + FT_Vector pp4; + + /* since version 2.2.1 */ + FT_Byte* cursor; + FT_Byte* limit; + + /* since version 2.6.2 */ + FT_ListRec composites; + + /* since version 2.11.2 */ + FT_Byte* widthp; + + } TT_LoaderRec; + + +FT_END_HEADER + +#endif /* TTTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/internal/wofftypes.h b/external/freetype/include/freetype/internal/wofftypes.h new file mode 100644 index 000000000..0c1d8eeaf --- /dev/null +++ b/external/freetype/include/freetype/internal/wofftypes.h @@ -0,0 +1,312 @@ +/**************************************************************************** + * + * wofftypes.h + * + * Basic WOFF/WOFF2 type definitions and interface (specification + * only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef WOFFTYPES_H_ +#define WOFFTYPES_H_ + + +#include +#include + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * WOFF_HeaderRec + * + * @description: + * WOFF file format header. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF/#WOFFHeader + */ + typedef struct WOFF_HeaderRec_ + { + FT_ULong signature; + FT_ULong flavor; + FT_ULong length; + FT_UShort num_tables; + FT_UShort reserved; + FT_ULong totalSfntSize; + FT_UShort majorVersion; + FT_UShort minorVersion; + FT_ULong metaOffset; + FT_ULong metaLength; + FT_ULong metaOrigLength; + FT_ULong privOffset; + FT_ULong privLength; + + } WOFF_HeaderRec, *WOFF_Header; + + + /************************************************************************** + * + * @struct: + * WOFF_TableRec + * + * @description: + * This structure describes a given table of a WOFF font. + * + * @fields: + * Tag :: + * A four-bytes tag describing the table. + * + * Offset :: + * The offset of the table from the start of the WOFF font in its + * resource. + * + * CompLength :: + * Compressed table length (in bytes). + * + * OrigLength :: + * Uncompressed table length (in bytes). + * + * CheckSum :: + * The table checksum. This value can be ignored. + * + * OrigOffset :: + * The uncompressed table file offset. This value gets computed while + * constructing the (uncompressed) SFNT header. It is not contained in + * the WOFF file. + */ + typedef struct WOFF_TableRec_ + { + FT_Tag Tag; /* table ID */ + FT_ULong Offset; /* table file offset */ + FT_ULong CompLength; /* compressed table length */ + FT_ULong OrigLength; /* uncompressed table length */ + FT_ULong CheckSum; /* uncompressed checksum */ + + FT_ULong OrigOffset; /* uncompressed table file offset */ + /* (not in the WOFF file) */ + } WOFF_TableRec, *WOFF_Table; + + + /************************************************************************** + * + * @struct: + * WOFF2_TtcFontRec + * + * @description: + * Metadata for a TTC font entry in WOFF2. + * + * @fields: + * flavor :: + * TTC font flavor. + * + * num_tables :: + * Number of tables in TTC, indicating number of elements in + * `table_indices`. + * + * table_indices :: + * Array of table indices for each TTC font. + */ + typedef struct WOFF2_TtcFontRec_ + { + FT_ULong flavor; + FT_UShort num_tables; + FT_UShort* table_indices; + + } WOFF2_TtcFontRec, *WOFF2_TtcFont; + + + /************************************************************************** + * + * @struct: + * WOFF2_HeaderRec + * + * @description: + * WOFF2 file format header. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF2/#woff20Header + * + * @note: + * We don't care about the fields `reserved`, `majorVersion` and + * `minorVersion`, so they are not included. The `totalSfntSize` field + * does not necessarily represent the actual size of the uncompressed + * SFNT font stream, so that is used as a reference value instead. + */ + typedef struct WOFF2_HeaderRec_ + { + FT_ULong signature; + FT_ULong flavor; + FT_ULong length; + FT_UShort num_tables; + FT_ULong totalSfntSize; + FT_ULong totalCompressedSize; + FT_ULong metaOffset; + FT_ULong metaLength; + FT_ULong metaOrigLength; + FT_ULong privOffset; + FT_ULong privLength; + + FT_ULong uncompressed_size; /* uncompressed brotli stream size */ + FT_ULong compressed_offset; /* compressed stream offset */ + FT_ULong header_version; /* version of original TTC Header */ + FT_UShort num_fonts; /* number of fonts in TTC */ + FT_ULong actual_sfnt_size; /* actual size of sfnt stream */ + + WOFF2_TtcFont ttc_fonts; /* metadata for fonts in a TTC */ + + } WOFF2_HeaderRec, *WOFF2_Header; + + + /************************************************************************** + * + * @struct: + * WOFF2_TableRec + * + * @description: + * This structure describes a given table of a WOFF2 font. + * + * @fields: + * See + * + * https://www.w3.org/TR/WOFF2/#table_dir_format + */ + typedef struct WOFF2_TableRec_ + { + FT_Byte FlagByte; /* table type and flags */ + FT_Tag Tag; /* table file offset */ + FT_ULong dst_length; /* uncompressed table length */ + FT_ULong TransformLength; /* transformed length */ + + FT_ULong flags; /* calculated flags */ + FT_ULong src_offset; /* compressed table offset */ + FT_ULong src_length; /* compressed table length */ + FT_ULong dst_offset; /* uncompressed table offset */ + + } WOFF2_TableRec, *WOFF2_Table; + + + /************************************************************************** + * + * @struct: + * WOFF2_InfoRec + * + * @description: + * Metadata for WOFF2 font that may be required for reconstruction of + * sfnt tables. + * + * @fields: + * header_checksum :: + * Checksum of SFNT offset table. + * + * num_glyphs :: + * Number of glyphs in the font. + * + * num_hmetrics :: + * `numberOfHMetrics` field in the 'hhea' table. + * + * x_mins :: + * `xMin` values of glyph bounding box. + * + * glyf_table :: + * A pointer to the `glyf' table record. + * + * loca_table :: + * A pointer to the `loca' table record. + * + * head_table :: + * A pointer to the `head' table record. + */ + typedef struct WOFF2_InfoRec_ + { + FT_ULong header_checksum; + FT_UShort num_glyphs; + FT_UShort num_hmetrics; + FT_Short* x_mins; + + WOFF2_Table glyf_table; + WOFF2_Table loca_table; + WOFF2_Table head_table; + + } WOFF2_InfoRec, *WOFF2_Info; + + + /************************************************************************** + * + * @struct: + * WOFF2_SubstreamRec + * + * @description: + * This structure stores information about a substream in the transformed + * 'glyf' table in a WOFF2 stream. + * + * @fields: + * start :: + * Beginning of the substream relative to uncompressed table stream. + * + * offset :: + * Offset of the substream relative to uncompressed table stream. + * + * size :: + * Size of the substream. + */ + typedef struct WOFF2_SubstreamRec_ + { + FT_ULong start; + FT_ULong offset; + FT_ULong size; + + } WOFF2_SubstreamRec, *WOFF2_Substream; + + + /************************************************************************** + * + * @struct: + * WOFF2_PointRec + * + * @description: + * This structure stores information about a point in the transformed + * 'glyf' table in a WOFF2 stream. + * + * @fields: + * x :: + * x-coordinate of point. + * + * y :: + * y-coordinate of point. + * + * on_curve :: + * Set if point is on-curve. + */ + typedef struct WOFF2_PointRec_ + { + FT_Int x; + FT_Int y; + FT_Bool on_curve; + + } WOFF2_PointRec, *WOFF2_Point; + + +FT_END_HEADER + +#endif /* WOFFTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/otsvg.h b/external/freetype/include/freetype/otsvg.h new file mode 100644 index 000000000..bfe9a6ab7 --- /dev/null +++ b/external/freetype/include/freetype/otsvg.h @@ -0,0 +1,336 @@ +/**************************************************************************** + * + * otsvg.h + * + * Interface for OT-SVG support related things (specification). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef OTSVG_H_ +#define OTSVG_H_ + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * svg_fonts + * + * @title: + * OpenType SVG Fonts + * + * @abstract: + * OT-SVG API between FreeType and an external SVG rendering library. + * + * @description: + * This section describes the four hooks necessary to render SVG + * 'documents' that are contained in an OpenType font's 'SVG~' table. + * + * For more information on the implementation, see our standard hooks + * based on 'librsvg' in the [FreeType Demo + * Programs](https://gitlab.freedesktop.org/freetype/freetype-demos) + * repository. + * + */ + + + /************************************************************************** + * + * @functype: + * SVG_Lib_Init_Func + * + * @description: + * A callback that is called when the first OT-SVG glyph is rendered in + * the lifetime of an @FT_Library object. In a typical implementation, + * one would want to allocate a structure and point the `data_pointer` + * to it and perform any library initializations that might be needed. + * + * @inout: + * data_pointer :: + * The SVG rendering module stores a pointer variable that can be used + * by clients to store any data that needs to be shared across + * different hooks. `data_pointer` is essentially a pointer to that + * pointer such that it can be written to as well as read from. + * + * @return: + * FreeType error code. 0 means success. + * + * @since: + * 2.12 + */ + typedef FT_Error + (*SVG_Lib_Init_Func)( FT_Pointer *data_pointer ); + + + /************************************************************************** + * + * @functype: + * SVG_Lib_Free_Func + * + * @description: + * A callback that is called when the `ot-svg` module is being freed. + * It is only called if the init hook was called earlier. This means + * that neither the init nor the free hook is called if no OT-SVG glyph + * is rendered. + * + * In a typical implementation, one would want to free any state + * structure that was allocated in the init hook and perform any + * library-related closure that might be needed. + * + * @inout: + * data_pointer :: + * The SVG rendering module stores a pointer variable that can be used + * by clients to store any data that needs to be shared across + * different hooks. `data_pointer` is essentially a pointer to that + * pointer such that it can be written to as well as read from. + * + * @since: + * 2.12 + */ + typedef void + (*SVG_Lib_Free_Func)( FT_Pointer *data_pointer ); + + + /************************************************************************** + * + * @functype: + * SVG_Lib_Render_Func + * + * @description: + * A callback that is called to render an OT-SVG glyph. This callback + * hook is called right after the preset hook @SVG_Lib_Preset_Slot_Func + * has been called with `cache` set to `TRUE`. The data necessary to + * render is available through the handle @FT_SVG_Document, which is set + * in the `other` field of @FT_GlyphSlotRec. + * + * The render hook is expected to render the SVG glyph to the bitmap + * buffer that is allocated already at `slot->bitmap.buffer`. It also + * sets the `num_grays` value as well as `slot->format`. + * + * @input: + * slot :: + * The slot to render. + * + * @inout: + * data_pointer :: + * The SVG rendering module stores a pointer variable that can be used + * by clients to store any data that needs to be shared across + * different hooks. `data_pointer` is essentially a pointer to that + * pointer such that it can be written to as well as read from. + * + * @return: + * FreeType error code. 0 means success. + * + * @since: + * 2.12 + */ + typedef FT_Error + (*SVG_Lib_Render_Func)( FT_GlyphSlot slot, + FT_Pointer *data_pointer ); + + + /************************************************************************** + * + * @functype: + * SVG_Lib_Preset_Slot_Func + * + * @description: + * A callback that is called to preset the glyph slot. It is called from + * two places. + * + * 1. When `FT_Load_Glyph` needs to preset the glyph slot. + * + * 2. Right before the `svg` module calls the render callback hook. + * + * When it is the former, the argument `cache` is set to `FALSE`. When + * it is the latter, the argument `cache` is set to `TRUE`. This + * distinction has been made because many calculations that are necessary + * for presetting a glyph slot are the same needed later for the render + * callback hook. Thus, if `cache` is `TRUE`, the hook can _cache_ those + * calculations in a memory block referenced by the state pointer. + * + * This hook is expected to preset the slot by setting parameters such as + * `bitmap_left`, `bitmap_top`, `width`, `rows`, `pitch`, and + * `pixel_mode`. It is also expected to set all the metrics for the slot + * including the vertical advance if it is not already set. Typically, + * fonts have horizontal advances but not vertical ones. If those are + * available, they had already been set, otherwise they have to be + * estimated and set manually. The hook must take into account the + * transformations that have been set, and translate the transformation + * matrices into the SVG coordinate system, as the original matrix is + * intended for the TTF/CFF coordinate system. + * + * @input: + * slot :: + * The glyph slot that has the SVG document loaded. + * + * cache :: + * See description. + * + * @inout: + * data_pointer :: + * The SVG rendering module stores a pointer variable that can be used + * by clients to store any data that needs to be shared across + * different hooks. `data_pointer` is essentially a pointer to that + * pointer such that it can be written to as well as read from. + * + * @return: + * FreeType error code. 0 means success. + * + * @since: + * 2.12 + */ + typedef FT_Error + (*SVG_Lib_Preset_Slot_Func)( FT_GlyphSlot slot, + FT_Bool cache, + FT_Pointer *state ); + + + /************************************************************************** + * + * @struct: + * SVG_RendererHooks + * + * @description: + * A structure that stores the four hooks needed to render OT-SVG glyphs + * properly. The structure is publicly used to set the hooks via the + * @svg-hooks driver property. + * + * The behavior of each hook is described in its documentation. One + * thing to note is that the preset hook and the render hook often need + * to do the same operations; therefore, it's better to cache the + * intermediate data in a state structure to avoid calculating it twice. + * For example, in the preset hook one can draw the glyph on a recorder + * surface and later create a bitmap surface from it in the render hook. + * + * All four hooks must be non-NULL. + * + * @fields: + * init_svg :: + * The initialization hook. + * + * free_svg :: + * The cleanup hook. + * + * render_hook :: + * The render hook. + * + * preset_slot :: + * The preset hook. + * + * @since: + * 2.12 + */ + typedef struct SVG_RendererHooks_ + { + SVG_Lib_Init_Func init_svg; + SVG_Lib_Free_Func free_svg; + SVG_Lib_Render_Func render_svg; + + SVG_Lib_Preset_Slot_Func preset_slot; + + } SVG_RendererHooks; + + + /************************************************************************** + * + * @struct: + * FT_SVG_DocumentRec + * + * @description: + * A structure that models one SVG document. + * + * @fields: + * svg_document :: + * A pointer to the SVG document. + * + * svg_document_length :: + * The length of `svg_document`. + * + * metrics :: + * A metrics object storing the size information. + * + * units_per_EM :: + * The size of the EM square. + * + * start_glyph_id :: + * The first glyph ID in the glyph range covered by this document. + * + * end_glyph_id :: + * The last glyph ID in the glyph range covered by this document. + * + * transform :: + * A 2x2 transformation matrix to apply to the glyph while rendering + * it. + * + * delta :: + * The translation to apply to the glyph while rendering. + * + * @note: + * When an @FT_GlyphSlot object `slot` is passed down to a renderer, the + * renderer can only access the `metrics` and `units_per_EM` fields via + * `slot->face`. However, when @FT_Glyph_To_Bitmap sets up a dummy + * object, it has no way to set a `face` object. Thus, metrics + * information and `units_per_EM` (which is necessary for OT-SVG) has to + * be stored separately. + * + * @since: + * 2.12 + */ + typedef struct FT_SVG_DocumentRec_ + { + FT_Byte* svg_document; + FT_ULong svg_document_length; + + FT_Size_Metrics metrics; + FT_UShort units_per_EM; + + FT_UShort start_glyph_id; + FT_UShort end_glyph_id; + + FT_Matrix transform; + FT_Vector delta; + + } FT_SVG_DocumentRec; + + + /************************************************************************** + * + * @type: + * FT_SVG_Document + * + * @description: + * A handle to an @FT_SVG_DocumentRec object. + * + * @since: + * 2.12 + */ + typedef struct FT_SVG_DocumentRec_* FT_SVG_Document; + + +FT_END_HEADER + +#endif /* OTSVG_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/t1tables.h b/external/freetype/include/freetype/t1tables.h new file mode 100644 index 000000000..1aecfbbd9 --- /dev/null +++ b/external/freetype/include/freetype/t1tables.h @@ -0,0 +1,793 @@ +/**************************************************************************** + * + * t1tables.h + * + * Basic Type 1/Type 2 tables definitions and interface (specification + * only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1TABLES_H_ +#define T1TABLES_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * type1_tables + * + * @title: + * Type 1 Tables + * + * @abstract: + * Type~1-specific font tables. + * + * @description: + * This section contains the definition of Type~1-specific tables, + * including structures related to other PostScript font formats. + * + * @order: + * PS_FontInfoRec + * PS_FontInfo + * PS_PrivateRec + * PS_Private + * + * CID_FaceDictRec + * CID_FaceDict + * CID_FaceInfoRec + * CID_FaceInfo + * + * FT_Has_PS_Glyph_Names + * FT_Get_PS_Font_Info + * FT_Get_PS_Font_Private + * FT_Get_PS_Font_Value + * + * T1_Blend_Flags + * T1_EncodingType + * PS_Dict_Keys + * + */ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /************************************************************************** + * + * @struct: + * PS_FontInfoRec + * + * @description: + * A structure used to model a Type~1 or Type~2 FontInfo dictionary. + * Note that for Multiple Master fonts, each instance has its own + * FontInfo dictionary. + */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /************************************************************************** + * + * @struct: + * PS_FontInfo + * + * @description: + * A handle to a @PS_FontInfoRec structure. + */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /************************************************************************** + * + * @struct: + * T1_FontInfo + * + * @description: + * This type is equivalent to @PS_FontInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_FontInfoRec T1_FontInfo; + + + /************************************************************************** + * + * @struct: + * PS_PrivateRec + * + * @description: + * A structure used to model a Type~1 or Type~2 private dictionary. Note + * that for Multiple Master fonts, each instance has its own Private + * dictionary. + */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /************************************************************************** + * + * @struct: + * PS_Private + * + * @description: + * A handle to a @PS_PrivateRec structure. + */ + typedef struct PS_PrivateRec_* PS_Private; + + + /************************************************************************** + * + * @struct: + * T1_Private + * + * @description: + * This type is equivalent to @PS_PrivateRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef PS_PrivateRec T1_Private; + + + /************************************************************************** + * + * @enum: + * T1_Blend_Flags + * + * @description: + * A set of flags used to indicate which fields are present in a given + * blend dictionary (font info or private). Used to support Multiple + * Masters fonts. + * + * @values: + * T1_BLEND_UNDERLINE_POSITION :: + * T1_BLEND_UNDERLINE_THICKNESS :: + * T1_BLEND_ITALIC_ANGLE :: + * T1_BLEND_BLUE_VALUES :: + * T1_BLEND_OTHER_BLUES :: + * T1_BLEND_STANDARD_WIDTH :: + * T1_BLEND_STANDARD_HEIGHT :: + * T1_BLEND_STEM_SNAP_WIDTHS :: + * T1_BLEND_STEM_SNAP_HEIGHTS :: + * T1_BLEND_BLUE_SCALE :: + * T1_BLEND_BLUE_SHIFT :: + * T1_BLEND_FAMILY_BLUES :: + * T1_BLEND_FAMILY_OTHER_BLUES :: + * T1_BLEND_FORCE_BOLD :: + */ + typedef enum T1_Blend_Flags_ + { + /* required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /* required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + T1_BLEND_MAX /* do not remove */ + + } T1_Blend_Flags; + + + /* these constants are deprecated; use the corresponding */ + /* `T1_Blend_Flags` values instead */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + /* */ + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backward compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backward compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /************************************************************************** + * + * @struct: + * CID_FaceDictRec + * + * @description: + * A structure used to represent data in a CID top-level dictionary. In + * most cases, they are part of the font's '/FDArray' array. Within a + * CID font file, such (internal) subfont dictionaries are enclosed by + * '%ADOBeginFontDict' and '%ADOEndFontDict' comments. + * + * Note that `CID_FaceDictRec` misses a field for the '/FontName' + * keyword, specifying the subfont's name (the top-level font name is + * given by the '/CIDFontName' keyword). This is an oversight, but it + * doesn't limit the 'cid' font module's functionality because FreeType + * neither needs this entry nor gives access to CID subfonts. + */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; /* this is a duplicate of */ + /* `private_dict->expansion_factor' */ + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_UInt sd_bytes; + + } CID_FaceDictRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceDict + * + * @description: + * A handle to a @CID_FaceDictRec structure. + */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + + /************************************************************************** + * + * @struct: + * CID_FontDict + * + * @description: + * This type is equivalent to @CID_FaceDictRec. It is deprecated but + * kept to maintain source compatibility between various versions of + * FreeType. + */ + typedef CID_FaceDictRec CID_FontDict; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfoRec + * + * @description: + * A structure used to represent CID Face information. + */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_UInt fd_bytes; + FT_UInt gd_bytes; + FT_ULong cid_count; + + FT_UInt num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /************************************************************************** + * + * @struct: + * CID_FaceInfo + * + * @description: + * A handle to a @CID_FaceInfoRec structure. + */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /************************************************************************** + * + * @struct: + * CID_Info + * + * @description: + * This type is equivalent to @CID_FaceInfoRec. It is deprecated but kept + * to maintain source compatibility between various versions of FreeType. + */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************** + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph names. + * This is similar to using the @FT_HAS_GLYPH_NAMES macro, except that + * certain fonts (mostly TrueType) contain incorrect glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * A pointer to a @PS_FontInfoRec object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * String pointers within the @PS_FontInfoRec structure are owned by the + * face and don't need to be freed by the caller. Missing entries in the + * font's FontInfo dictionary are represented by `NULL` pointers. + * + * The following font formats support this feature: 'Type~1', 'Type~42', + * 'CFF', 'CID~Type~1'. For other font formats this function returns the + * `FT_Err_Invalid_Argument` error code. + * + * @example: + * ``` + * PS_FontInfoRec font_info; + * + * + * error = FT_Get_PS_Font_Info( face, &font_info ); + * ... + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * A pointer to a @PS_PrivateRec object. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * Only the 'Type~1' font format supports this feature. For other font + * formats this function returns the `FT_Err_Invalid_Argument` error + * code. + * + * @example: + * ``` + * PS_PrivateRec font_private; + * + * + * error = FT_Get_PS_Font_Private( face, &font_private ); + * ... + * ``` + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + + /************************************************************************** + * + * @enum: + * T1_EncodingType + * + * @description: + * An enumeration describing the 'Encoding' entry in a Type 1 dictionary. + * + * @values: + * T1_ENCODING_TYPE_NONE :: + * T1_ENCODING_TYPE_ARRAY :: + * T1_ENCODING_TYPE_STANDARD :: + * T1_ENCODING_TYPE_ISOLATIN1 :: + * T1_ENCODING_TYPE_EXPERT :: + * + * @since: + * 2.4.8 + */ + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /************************************************************************** + * + * @enum: + * PS_Dict_Keys + * + * @description: + * An enumeration used in calls to @FT_Get_PS_Font_Value to identify the + * Type~1 dictionary entry to retrieve. + * + * @values: + * PS_DICT_FONT_TYPE :: + * PS_DICT_FONT_MATRIX :: + * PS_DICT_FONT_BBOX :: + * PS_DICT_PAINT_TYPE :: + * PS_DICT_FONT_NAME :: + * PS_DICT_UNIQUE_ID :: + * PS_DICT_NUM_CHAR_STRINGS :: + * PS_DICT_CHAR_STRING_KEY :: + * PS_DICT_CHAR_STRING :: + * PS_DICT_ENCODING_TYPE :: + * PS_DICT_ENCODING_ENTRY :: + * PS_DICT_NUM_SUBRS :: + * PS_DICT_SUBR :: + * PS_DICT_STD_HW :: + * PS_DICT_STD_VW :: + * PS_DICT_NUM_BLUE_VALUES :: + * PS_DICT_BLUE_VALUE :: + * PS_DICT_BLUE_FUZZ :: + * PS_DICT_NUM_OTHER_BLUES :: + * PS_DICT_OTHER_BLUE :: + * PS_DICT_NUM_FAMILY_BLUES :: + * PS_DICT_FAMILY_BLUE :: + * PS_DICT_NUM_FAMILY_OTHER_BLUES :: + * PS_DICT_FAMILY_OTHER_BLUE :: + * PS_DICT_BLUE_SCALE :: + * PS_DICT_BLUE_SHIFT :: + * PS_DICT_NUM_STEM_SNAP_H :: + * PS_DICT_STEM_SNAP_H :: + * PS_DICT_NUM_STEM_SNAP_V :: + * PS_DICT_STEM_SNAP_V :: + * PS_DICT_FORCE_BOLD :: + * PS_DICT_RND_STEM_UP :: + * PS_DICT_MIN_FEATURE :: + * PS_DICT_LEN_IV :: + * PS_DICT_PASSWORD :: + * PS_DICT_LANGUAGE_GROUP :: + * PS_DICT_VERSION :: + * PS_DICT_NOTICE :: + * PS_DICT_FULL_NAME :: + * PS_DICT_FAMILY_NAME :: + * PS_DICT_WEIGHT :: + * PS_DICT_IS_FIXED_PITCH :: + * PS_DICT_UNDERLINE_POSITION :: + * PS_DICT_UNDERLINE_THICKNESS :: + * PS_DICT_FS_TYPE :: + * PS_DICT_ITALIC_ANGLE :: + * + * @since: + * 2.4.8 + */ + typedef enum PS_Dict_Keys_ + { + /* conventionally in the font dictionary */ + PS_DICT_FONT_TYPE, /* FT_Byte */ + PS_DICT_FONT_MATRIX, /* FT_Fixed */ + PS_DICT_FONT_BBOX, /* FT_Fixed */ + PS_DICT_PAINT_TYPE, /* FT_Byte */ + PS_DICT_FONT_NAME, /* FT_String* */ + PS_DICT_UNIQUE_ID, /* FT_Int */ + PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */ + PS_DICT_CHAR_STRING_KEY, /* FT_String* */ + PS_DICT_CHAR_STRING, /* FT_String* */ + PS_DICT_ENCODING_TYPE, /* T1_EncodingType */ + PS_DICT_ENCODING_ENTRY, /* FT_String* */ + + /* conventionally in the font Private dictionary */ + PS_DICT_NUM_SUBRS, /* FT_Int */ + PS_DICT_SUBR, /* FT_String* */ + PS_DICT_STD_HW, /* FT_UShort */ + PS_DICT_STD_VW, /* FT_UShort */ + PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */ + PS_DICT_BLUE_VALUE, /* FT_Short */ + PS_DICT_BLUE_FUZZ, /* FT_Int */ + PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */ + PS_DICT_OTHER_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_BLUE, /* FT_Short */ + PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */ + PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */ + PS_DICT_BLUE_SCALE, /* FT_Fixed */ + PS_DICT_BLUE_SHIFT, /* FT_Int */ + PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */ + PS_DICT_STEM_SNAP_H, /* FT_Short */ + PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */ + PS_DICT_STEM_SNAP_V, /* FT_Short */ + PS_DICT_FORCE_BOLD, /* FT_Bool */ + PS_DICT_RND_STEM_UP, /* FT_Bool */ + PS_DICT_MIN_FEATURE, /* FT_Short */ + PS_DICT_LEN_IV, /* FT_Int */ + PS_DICT_PASSWORD, /* FT_Long */ + PS_DICT_LANGUAGE_GROUP, /* FT_Long */ + + /* conventionally in the font FontInfo dictionary */ + PS_DICT_VERSION, /* FT_String* */ + PS_DICT_NOTICE, /* FT_String* */ + PS_DICT_FULL_NAME, /* FT_String* */ + PS_DICT_FAMILY_NAME, /* FT_String* */ + PS_DICT_WEIGHT, /* FT_String* */ + PS_DICT_IS_FIXED_PITCH, /* FT_Bool */ + PS_DICT_UNDERLINE_POSITION, /* FT_Short */ + PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */ + PS_DICT_FS_TYPE, /* FT_UShort */ + PS_DICT_ITALIC_ANGLE, /* FT_Long */ + + PS_DICT_MAX = PS_DICT_ITALIC_ANGLE + + } PS_Dict_Keys; + + + /************************************************************************** + * + * @function: + * FT_Get_PS_Font_Value + * + * @description: + * Retrieve the value for the supplied key from a PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * key :: + * An enumeration value representing the dictionary key to retrieve. + * + * idx :: + * For array values, this specifies the index to be returned. + * + * value :: + * A pointer to memory into which to write the value. + * + * valen_len :: + * The size, in bytes, of the memory supplied for the value. + * + * @output: + * value :: + * The value matching the above key, if it exists. + * + * @return: + * The amount of memory (in bytes) required to hold the requested value + * (if it exists, -1 otherwise). + * + * @note: + * The values returned are not pointers into the internal structures of + * the face, but are 'fresh' copies, so that the memory containing them + * belongs to the calling application. This also enforces the + * 'read-only' nature of these values, i.e., this function cannot be + * used to manipulate the face. + * + * `value` is a void pointer because the values returned can be of + * various types. + * + * If either `value` is `NULL` or `value_len` is too small, just the + * required memory size for the requested entry is returned. + * + * The `idx` parameter is used, not only to retrieve elements of, for + * example, the FontMatrix or FontBBox, but also to retrieve name keys + * from the CharStrings dictionary, and the charstrings themselves. It + * is ignored for atomic values. + * + * `PS_DICT_BLUE_SCALE` returns a value that is scaled up by 1000. To + * get the value as in the font stream, you need to divide by 65536000.0 + * (to remove the FT_Fixed scale, and the x1000 scale). + * + * IMPORTANT: Only key/value pairs read by the FreeType interpreter can + * be retrieved. So, for example, PostScript procedures such as NP, ND, + * and RD are not available. Arbitrary keys are, obviously, not be + * available either. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument` error code. + * + * @since: + * 2.4.8 + * + */ + FT_EXPORT( FT_Long ) + FT_Get_PS_Font_Value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ); + + /* */ + +FT_END_HEADER + +#endif /* T1TABLES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/ttnameid.h b/external/freetype/include/freetype/ttnameid.h new file mode 100644 index 000000000..e31c68b9b --- /dev/null +++ b/external/freetype/include/freetype/ttnameid.h @@ -0,0 +1,1235 @@ +/**************************************************************************** + * + * ttnameid.h + * + * TrueType name ID definitions (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTNAMEID_H_ +#define TTNAMEID_H_ + + + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * truetype_tables + */ + + + /************************************************************************** + * + * Possible values for the 'platform' identifier code in the name records + * of an SFNT 'name' table. + * + */ + + + /************************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id` identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id` values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name + * entry. See @TT_MAC_ID_XXX for corresponding `encoding_id` values. + * Note that most TrueType fonts contain an Apple roman charmap to be + * usable on MacOS systems (even if they contain a Microsoft charmap as + * well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify ISO/IEC 10646 charmaps. It is + * however now deprecated. See @TT_ISO_ID_XXX for a list of + * corresponding `encoding_id` values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id` values. + * Note that most fonts contain a Unicode charmap using + * (`TT_PLATFORM_MICROSOFT`, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /************************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations on + * a real cmap. + * + * TT_APPLE_ID_FULL_UNICODE :: + * Used for fallback fonts that provide complete Unicode coverage with + * a type~13 cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ +#define TT_APPLE_ID_FULL_UNICODE 6 /* used with type 13 cmaps */ + + + /************************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /************************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ISO + * charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /************************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Microsoft symbol encoding. See @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Microsoft WGL4 charmap, matching Unicode. See @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Shift JIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_PRC :: + * Chinese encodings as used in the People's Republic of China (PRC). + * This means the encodings GB~2312 and its supersets GBK and GB~18030. + * See @FT_ENCODING_PRC. + * + * TT_MS_ID_BIG_5 :: + * Traditional Chinese as used in Taiwan and Hong Kong. See + * @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Korean Extended Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Korean Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * UCS-4 or UTF-32 charmaps. This has been added to the OpenType + * specification version 1.4 (mid-2001). + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_PRC 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + /* this value is deprecated */ +#define TT_MS_ID_GB2312 TT_MS_ID_PRC + + + /************************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id` for @TT_PLATFORM_ADOBE + * charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /************************************************************************** + * + * @enum: + * TT_MAC_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MACINTOSH. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Apple's IDs is + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + */ + +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /************************************************************************** + * + * @enum: + * TT_MS_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT 'name' table if the 'platform' identifier code is + * @TT_PLATFORM_MICROSOFT. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Microsoft's IDs is + * + * https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings , + * + * however, we only provide macros for language identifiers present in + * the OpenType specification: Microsoft has abandoned the concept of + * LCIDs (language code identifiers), and format~1 of the 'name' table + * provides a better mechanism for languages not covered here. + * + * More legacy values not listed in the reference can be found in the + * @FT_TRUETYPE_IDS_H header file. + */ + +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0C01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1C01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2C01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3C01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_CATALAN 0x0403 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0C04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 +#define TT_MS_LANGID_CHINESE_MACAO 0x1404 +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0C07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEIN 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0C09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1C09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2C09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040A +#define TT_MS_LANGID_SPANISH_MEXICO 0x080A +#define TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT 0x0C0A +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100A +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140A +#define TT_MS_LANGID_SPANISH_PANAMA 0x180A +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1C0A +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200A +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240A +#define TT_MS_LANGID_SPANISH_PERU 0x280A +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2C0A +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300A +#define TT_MS_LANGID_SPANISH_CHILE 0x340A +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380A +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3C0A +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400A +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440A +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480A +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4C0A +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500A +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540A +#define TT_MS_LANGID_FINNISH_FINLAND 0x040B +#define TT_MS_LANGID_FRENCH_FRANCE 0x040C +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080C +#define TT_MS_LANGID_FRENCH_CANADA 0x0C0C +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100C +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140C +#define TT_MS_LANGID_FRENCH_MONACO 0x180C +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040D +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040E +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040F +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_KOREA 0x0412 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_ROMANSH_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041A +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081A +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0C1A +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181A +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x1C1A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC 0x201A +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041B +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041C +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041D +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081D +#define TT_MS_LANGID_THAI_THAILAND 0x041E +#define TT_MS_LANGID_TURKISH_TURKEY 0x041F +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENIAN_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042A +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042B +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042C +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082C +#define TT_MS_LANGID_BASQUE_BASQUE 0x042D +#define TT_MS_LANGID_UPPER_SORBIAN_GERMANY 0x042E +#define TT_MS_LANGID_LOWER_SORBIAN_GERMANY 0x082E +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042F +#define TT_MS_LANGID_SETSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ISIZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043A +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043B +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083B +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3B +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103B +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143B +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183B +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3B +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203B +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243B +#define TT_MS_LANGID_IRISH_IRELAND 0x083C +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043E +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083E +#define TT_MS_LANGID_KAZAKH_KAZAKHSTAN 0x043F +#define TT_MS_LANGID_KYRGYZ_KYRGYZSTAN /* Cyrillic */ 0x0440 +#define TT_MS_LANGID_KISWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_RUSSIA 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ODIA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044A +#define TT_MS_LANGID_KANNADA_INDIA 0x044B +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044C +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044D +#define TT_MS_LANGID_MARATHI_INDIA 0x044E +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044F +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_PRC 0x0850 +#define TT_MS_LANGID_TIBETAN_PRC 0x0451 +#define TT_MS_LANGID_WELSH_UNITED_KINGDOM 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_GALICIAN_GALICIAN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045A +#define TT_MS_LANGID_SINHALA_SRI_LANKA 0x045B +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045D +#define TT_MS_LANGID_INUKTITUT_CANADA_LATIN 0x085D +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045E +#define TT_MS_LANGID_TAMAZIGHT_ALGERIA 0x085F +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046A +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046B +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086B +#define TT_MS_LANGID_QUECHUA_PERU 0x0C6B +#define TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA 0x046C +#define TT_MS_LANGID_BASHKIR_RUSSIA 0x046D +#define TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG 0x046E +#define TT_MS_LANGID_GREENLANDIC_GREENLAND 0x046F +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_YI_PRC 0x0478 +#define TT_MS_LANGID_MAPUDUNGUN_CHILE 0x047A +#define TT_MS_LANGID_MOHAWK_MOHAWK 0x047C +#define TT_MS_LANGID_BRETON_FRANCE 0x047E +#define TT_MS_LANGID_UIGHUR_PRC 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 +#define TT_MS_LANGID_OCCITAN_FRANCE 0x0482 +#define TT_MS_LANGID_CORSICAN_FRANCE 0x0483 +#define TT_MS_LANGID_ALSATIAN_FRANCE 0x0484 +#define TT_MS_LANGID_YAKUT_RUSSIA 0x0485 +#define TT_MS_LANGID_KICHE_GUATEMALA 0x0486 +#define TT_MS_LANGID_KINYARWANDA_RWANDA 0x0487 +#define TT_MS_LANGID_WOLOF_SENEGAL 0x0488 +#define TT_MS_LANGID_DARI_AFGHANISTAN 0x048C + + /* */ + + + /* legacy macro definitions not present in OpenType 1.8.1 */ +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_CATALAN_SPAIN \ + TT_MS_LANGID_CATALAN_CATALAN +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_MACAU \ + TT_MS_LANGID_CHINESE_MACAO +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI \ + TT_MS_LANGID_GERMAN_LIECHTENSTEIN +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT \ + TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C +#define TT_MS_LANGID_FRENCH_REUNION 0x200C +#define TT_MS_LANGID_FRENCH_CONGO 0x240C + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE \ + TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C +#define TT_MS_LANGID_FRENCH_MALI 0x340C +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C +#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA \ + TT_MS_LANGID_KOREAN_KOREA +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND \ + TT_MS_LANGID_ROMANSH_SWITZERLAND +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_SLOVENE_SLOVENIA \ + TT_MS_LANGID_SLOVENIAN_SLOVENIA +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_BASQUE_SPAIN \ + TT_MS_LANGID_BASQUE_BASQUE +#define TT_MS_LANGID_SORBIAN_GERMANY \ + TT_MS_LANGID_UPPER_SORBIAN_GERMANY +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA \ + TT_MS_LANGID_SETSWANA_SOUTH_AFRICA +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA \ + TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA \ + TT_MS_LANGID_ISIZULU_SOUTH_AFRICA +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B + /* the next two values are incorrectly inverted */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D +#define TT_MS_LANGID_KAZAK_KAZAKSTAN \ + TT_MS_LANGID_KAZAKH_KAZAKHSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_SWAHILI_KENYA \ + TT_MS_LANGID_KISWAHILI_KENYA +#define TT_MS_LANGID_TATAR_TATARSTAN \ + TT_MS_LANGID_TATAR_RUSSIA +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_ORIYA_INDIA \ + TT_MS_LANGID_ODIA_INDIA +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN \ + TT_MS_LANGID_MONGOLIAN_PRC +#define TT_MS_LANGID_TIBETAN_CHINA \ + TT_MS_LANGID_TIBETAN_PRC +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 +#define TT_MS_LANGID_TIBETAN_BHUTAN \ + TT_MS_LANGID_DZONGHKA_BHUTAN +#define TT_MS_LANGID_WELSH_WALES \ + TT_MS_LANGID_WELSH_UNITED_KINGDOM +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN \ + TT_MS_LANGID_GALICIAN_GALICIAN +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 +#define TT_MS_LANGID_SINHALESE_SRI_LANKA \ + TT_MS_LANGID_SINHALA_SRI_LANKA +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN \ + TT_MS_LANGID_TAMAZIGHT_ALGERIA +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 +#define TT_MS_LANGID_KASHMIRI_INDIA \ + TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_DIVEHI_MALDIVES \ + TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 +#define TT_MS_LANGID_TIGRIGNA_ERYTREA \ + TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 +#define TT_MS_LANGID_YI_CHINA \ + TT_MS_LANGID_YI_PRC +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 +#define TT_MS_LANGID_UIGHUR_CHINA \ + TT_MS_LANGID_UIGHUR_PRC + + + /************************************************************************** + * + * @enum: + * TT_NAME_ID_XXX + * + * @description: + * Possible values of the 'name' identifier field in the name records of + * an SFNT 'name' table. These values are platform independent. + */ + +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_TYPOGRAPHIC_FAMILY 16 +#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + /* This is new in OpenType 1.7 */ +#define TT_NAME_ID_LIGHT_BACKGROUND 23 +#define TT_NAME_ID_DARK_BACKGROUND 24 + + /* This is new in OpenType 1.8 */ +#define TT_NAME_ID_VARIATIONS_PREFIX 25 + + /* these two values are deprecated */ +#define TT_NAME_ID_PREFERRED_FAMILY TT_NAME_ID_TYPOGRAPHIC_FAMILY +#define TT_NAME_ID_PREFERRED_SUBFAMILY TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY + + + /************************************************************************** + * + * @enum: + * TT_UCR_XXX + * + * @description: + * Possible bit mask values for the `ulUnicodeRangeX` fields in an SFNT + * 'OS/2' table. + */ + + /* ulUnicodeRange1 */ + /* --------------- */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + + /* ulUnicodeRange2 */ + /* --------------- */ + + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000. */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1L << 31) /* U+FB50-U+FDFF */ + + /* ulUnicodeRange3 */ + /* --------------- */ + + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + + /* ulUnicodeRange4 */ + /* --------------- */ + + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + /* */ + + /* for backward compatibility with older FreeType versions */ +#define TT_UCR_ARABIC_PRESENTATION_A \ + TT_UCR_ARABIC_PRESENTATION_FORMS_A +#define TT_UCR_ARABIC_PRESENTATION_B \ + TT_UCR_ARABIC_PRESENTATION_FORMS_B + +#define TT_UCR_COMBINING_DIACRITICS \ + TT_UCR_COMBINING_DIACRITICAL_MARKS +#define TT_UCR_COMBINING_DIACRITICS_SYMB \ + TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB + + +FT_END_HEADER + +#endif /* TTNAMEID_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/tttables.h b/external/freetype/include/freetype/tttables.h new file mode 100644 index 000000000..a9f60e762 --- /dev/null +++ b/external/freetype/include/freetype/tttables.h @@ -0,0 +1,855 @@ +/**************************************************************************** + * + * tttables.h + * + * Basic SFNT/TrueType tables definitions and interface + * (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTTABLES_H_ +#define TTTABLES_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @section: + * truetype_tables + * + * @title: + * TrueType Tables + * + * @abstract: + * TrueType-specific table types and functions. + * + * @description: + * This section contains definitions of some basic tables specific to + * TrueType and OpenType as well as some routines used to access and + * process them. + * + * @order: + * TT_Header + * TT_HoriHeader + * TT_VertHeader + * TT_OS2 + * TT_Postscript + * TT_PCLT + * TT_MaxProfile + * + * FT_Sfnt_Tag + * FT_Get_Sfnt_Table + * FT_Load_Sfnt_Table + * FT_Sfnt_Table_Info + * + * FT_Get_CMap_Language_ID + * FT_Get_CMap_Format + * + * FT_PARAM_TAG_UNPATENTED_HINTING + * + */ + + + /************************************************************************** + * + * @struct: + * TT_Header + * + * @description: + * A structure to model a TrueType font header table. All fields follow + * the OpenType specification. The 64-bit timestamps are stored in + * two-element arrays `Created` and `Modified`, first the upper then + * the lower 32~bits. + */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_ULong Created [2]; + FT_ULong Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /************************************************************************** + * + * @struct: + * TT_HoriHeader + * + * @description: + * A structure to model a TrueType horizontal header, the 'hhea' table, + * as well as the corresponding horizontal metrics table, 'hmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Width_Max :: + * This field is the maximum of all advance widths found in the font. + * It can be used to compute the maximum width of an arbitrary string + * of text. + * + * min_Left_Side_Bearing :: + * The minimum left side bearing of all glyphs within the font. + * + * min_Right_Side_Bearing :: + * The minimum right side bearing of all glyphs within the font. + * + * xMax_Extent :: + * The maximum horizontal extent (i.e., the 'width' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_HMetrics :: + * Number of HMetrics entries in the 'hmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'hmtx' table. + * + * short_metrics :: + * A pointer into the 'hmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `caret_Slope_Rise`, + * `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'hmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /************************************************************************** + * + * @struct: + * TT_VertHeader + * + * @description: + * A structure used to model a TrueType vertical header, the 'vhea' + * table, as well as the corresponding vertical metrics table, 'vmtx'. + * + * @fields: + * Version :: + * The table version. + * + * Ascender :: + * The font's ascender, i.e., the distance from the baseline to the + * top-most of all glyph points found in the font. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoAscender` field of the 'OS/2' table instead + * if you want the correct one. + * + * Descender :: + * The font's descender, i.e., the distance from the baseline to the + * bottom-most of all glyph points found in the font. It is negative. + * + * This value is invalid in many fonts, as it is usually set by the + * font designer, and often reflects only a portion of the glyphs found + * in the font (maybe ASCII). + * + * You should use the `sTypoDescender` field of the 'OS/2' table + * instead if you want the correct one. + * + * Line_Gap :: + * The font's line gap, i.e., the distance to add to the ascender and + * descender to get the BTB, i.e., the baseline-to-baseline distance + * for the font. + * + * advance_Height_Max :: + * This field is the maximum of all advance heights found in the font. + * It can be used to compute the maximum height of an arbitrary string + * of text. + * + * min_Top_Side_Bearing :: + * The minimum top side bearing of all glyphs within the font. + * + * min_Bottom_Side_Bearing :: + * The minimum bottom side bearing of all glyphs within the font. + * + * yMax_Extent :: + * The maximum vertical extent (i.e., the 'height' of a glyph's + * bounding box) for all glyphs in the font. + * + * caret_Slope_Rise :: + * The rise coefficient of the cursor's slope of the cursor + * (slope=rise/run). + * + * caret_Slope_Run :: + * The run coefficient of the cursor's slope. + * + * caret_Offset :: + * The cursor's offset for slanted fonts. + * + * Reserved :: + * 8~reserved bytes. + * + * metric_Data_Format :: + * Always~0. + * + * number_Of_VMetrics :: + * Number of VMetrics entries in the 'vmtx' table -- this value can be + * smaller than the total number of glyphs in the font. + * + * long_metrics :: + * A pointer into the 'vmtx' table. + * + * short_metrics :: + * A pointer into the 'vmtx' table. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `Ascender`, `Descender`, + * `Line_Gap`, `caret_Slope_Rise`, `caret_Slope_Run`, and `caret_Offset`. + */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum bottom-sb */ + FT_Short yMax_Extent; /* ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* 'vmtx' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /************************************************************************** + * + * @struct: + * TT_OS2 + * + * @description: + * A structure to model a TrueType 'OS/2' table. All fields comply to + * the OpenType specification. + * + * Note that we now support old Mac fonts that do not include an 'OS/2' + * table. In this case, the `version` field is always set to 0xFFFF. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `sCapHeight`, `sTypoAscender`, + * `sTypoDescender`, `sTypoLineGap`, `sxHeight`, `usWinAscent`, + * `usWinDescent`, `yStrikeoutPosition`, `yStrikeoutSize`, + * `ySubscriptXOffset`, `ySubScriptXSize`, `ySubscriptYOffset`, + * `ySubscriptYSize`, `ySuperscriptXOffset`, `ySuperscriptXSize`, + * `ySuperscriptYOffset`, and `ySuperscriptYSize`. + * + * Possible values for bits in the `ulUnicodeRangeX` fields are given by + * the @TT_UCR_XXX macros. + */ + + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_UShort fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 and higher: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 and higher: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + /* only version 5 and higher: */ + + FT_UShort usLowerOpticalPointSize; /* in twips (1/20 points) */ + FT_UShort usUpperOpticalPointSize; /* in twips (1/20 points) */ + + } TT_OS2; + + + /************************************************************************** + * + * @struct: + * TT_Postscript + * + * @description: + * A structure to model a TrueType 'post' table. All fields comply to + * the OpenType specification. This structure does not reference a + * font's PostScript glyph names; use @FT_Get_Glyph_Name to retrieve + * them. + * + * @note: + * For an OpenType variation font, the values of the following fields can + * change after a call to @FT_Set_Var_Design_Coordinates (and friends) if + * the font contains an 'MVAR' table: `underlinePosition` and + * `underlineThickness`. + */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the 'post' table, but we don't */ + /* load them by default. */ + + } TT_Postscript; + + + /************************************************************************** + * + * @struct: + * TT_PCLT + * + * @description: + * A structure to model a TrueType 'PCLT' table. All fields comply to + * the OpenType specification. + */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /************************************************************************** + * + * @struct: + * TT_MaxProfile + * + * @description: + * The maximum profile ('maxp') table contains many max values, which can + * be used to pre-allocate arrays for speeding up glyph loading and + * hinting. + * + * @fields: + * version :: + * The version number. + * + * numGlyphs :: + * The number of glyphs in this TrueType font. + * + * maxPoints :: + * The maximum number of points in a non-composite TrueType glyph. See + * also `maxCompositePoints`. + * + * maxContours :: + * The maximum number of contours in a non-composite TrueType glyph. + * See also `maxCompositeContours`. + * + * maxCompositePoints :: + * The maximum number of points in a composite TrueType glyph. See + * also `maxPoints`. + * + * maxCompositeContours :: + * The maximum number of contours in a composite TrueType glyph. See + * also `maxContours`. + * + * maxZones :: + * The maximum number of zones used for glyph hinting. + * + * maxTwilightPoints :: + * The maximum number of points in the twilight zone used for glyph + * hinting. + * + * maxStorage :: + * The maximum number of elements in the storage area used for glyph + * hinting. + * + * maxFunctionDefs :: + * The maximum number of function definitions in the TrueType bytecode + * for this font. + * + * maxInstructionDefs :: + * The maximum number of instruction definitions in the TrueType + * bytecode for this font. + * + * maxStackElements :: + * The maximum number of stack elements used during bytecode + * interpretation. + * + * maxSizeOfInstructions :: + * The maximum number of TrueType opcodes used for glyph hinting. + * + * maxComponentElements :: + * The maximum number of simple (i.e., non-composite) glyphs in a + * composite glyph. + * + * maxComponentDepth :: + * The maximum nesting depth of composite glyphs. + * + * @note: + * This structure is only used during font loading. + */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /************************************************************************** + * + * @enum: + * FT_Sfnt_Tag + * + * @description: + * An enumeration to specify indices of SFNT tables loaded and parsed by + * FreeType during initialization of an SFNT font. Used in the + * @FT_Get_Sfnt_Table API function. + * + * @values: + * FT_SFNT_HEAD :: + * To access the font's @TT_Header structure. + * + * FT_SFNT_MAXP :: + * To access the font's @TT_MaxProfile structure. + * + * FT_SFNT_OS2 :: + * To access the font's @TT_OS2 structure. + * + * FT_SFNT_HHEA :: + * To access the font's @TT_HoriHeader structure. + * + * FT_SFNT_VHEA :: + * To access the font's @TT_VertHeader structure. + * + * FT_SFNT_POST :: + * To access the font's @TT_Postscript structure. + * + * FT_SFNT_PCLT :: + * To access the font's @TT_PCLT structure. + */ + typedef enum FT_Sfnt_Tag_ + { + FT_SFNT_HEAD, + FT_SFNT_MAXP, + FT_SFNT_OS2, + FT_SFNT_HHEA, + FT_SFNT_VHEA, + FT_SFNT_POST, + FT_SFNT_PCLT, + + FT_SFNT_MAX + + } FT_Sfnt_Tag; + + /* these constants are deprecated; use the corresponding `FT_Sfnt_Tag` */ + /* values instead */ +#define ft_sfnt_head FT_SFNT_HEAD +#define ft_sfnt_maxp FT_SFNT_MAXP +#define ft_sfnt_os2 FT_SFNT_OS2 +#define ft_sfnt_hhea FT_SFNT_HHEA +#define ft_sfnt_vhea FT_SFNT_VHEA +#define ft_sfnt_post FT_SFNT_POST +#define ft_sfnt_pclt FT_SFNT_PCLT + + + /************************************************************************** + * + * @function: + * FT_Get_Sfnt_Table + * + * @description: + * Return a pointer to a given SFNT table stored within a face. + * + * @input: + * face :: + * A handle to the source. + * + * tag :: + * The index of the SFNT table. + * + * @return: + * A type-less pointer to the table. This will be `NULL` in case of + * error, or if the corresponding table was not found **OR** loaded from + * the file. + * + * Use a typecast according to `tag` to access the structure elements. + * + * @note: + * The table is owned by the face object and disappears with it. + * + * This function is only useful to access SFNT tables that are loaded by + * the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for a + * list. + * + * @example: + * Here is an example demonstrating access to the 'vhea' table. + * + * ``` + * TT_VertHeader* vert_header; + * + * + * vert_header = + * (TT_VertHeader*)FT_Get_Sfnt_Table( face, FT_SFNT_VHEA ); + * ``` + */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any SFNT font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use value~0 if you want to + * access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag~==~0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length` parameter is `NULL`, try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length` is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length` set to~0, as in the following example: + * + * ``` + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * ``` + * + * Note that structures like @TT_Header or @TT_OS2 can't be used with + * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that + * those structures depend on the processor architecture, with varying + * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). + * + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @inout: + * tag :: + * The name tag of the SFNT table. If the value is `NULL`, + * `table_index` is ignored, and `length` returns the number of SFNT + * tables in the font. + * + * @output: + * length :: + * The length of the SFNT table (or the number of SFNT tables, + * depending on `tag`). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While parsing fonts, FreeType handles SFNT tables with length zero as + * missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Language_ID + * + * @description: + * Return cmap language ID as specified in the OpenType standard. + * Definitions of language ID values are in file @FT_TRUETYPE_IDS_H. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The language ID of `charmap`. If `charmap` doesn't belong to an SFNT + * face, just return~0 as the default value. + * + * For a format~14 cmap (to access Unicode IVS), the return value is + * 0xFFFFFFFF. + */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /************************************************************************** + * + * @function: + * FT_Get_CMap_Format + * + * @description: + * Return the format of an SFNT 'cmap' table. + * + * @input: + * charmap :: + * The target charmap. + * + * @return: + * The format of `charmap`. If `charmap` doesn't belong to an SFNT face, + * return -1. + */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* TTTABLES_H_ */ + + +/* END */ diff --git a/external/freetype/include/freetype/tttags.h b/external/freetype/include/freetype/tttags.h new file mode 100644 index 000000000..9bf4fca23 --- /dev/null +++ b/external/freetype/include/freetype/tttags.h @@ -0,0 +1,124 @@ +/**************************************************************************** + * + * tttags.h + * + * Tags for TrueType and OpenType tables (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTAGS_H_ +#define TTAGS_H_ + + +#include + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' ) +#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CFF2 FT_MAKE_TAG( 'C', 'F', 'F', '2' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_COLR FT_MAKE_TAG( 'C', 'O', 'L', 'R' ) +#define TTAG_CPAL FT_MAKE_TAG( 'C', 'P', 'A', 'L' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_HVAR FT_MAKE_TAG( 'H', 'V', 'A', 'R' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_MVAR FT_MAKE_TAG( 'M', 'V', 'A', 'R' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sbix FT_MAKE_TAG( 's', 'b', 'i', 'x' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_SVG FT_MAKE_TAG( 'S', 'V', 'G', ' ' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) +#define TTAG_VVAR FT_MAKE_TAG( 'V', 'V', 'A', 'R' ) +#define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) +#define TTAG_wOF2 FT_MAKE_TAG( 'w', 'O', 'F', '2' ) + +/* used by "Keyboard.dfont" on legacy Mac OS X */ +#define TTAG_0xA5kbd FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' ) + +/* used by "LastResort.dfont" on legacy Mac OS X */ +#define TTAG_0xA5lst FT_MAKE_TAG( 0xA5, 'l', 's', 't' ) + + +FT_END_HEADER + +#endif /* TTAGS_H_ */ + + +/* END */ diff --git a/external/freetype/include/ft2build.h b/external/freetype/include/ft2build.h new file mode 100644 index 000000000..58491ceea --- /dev/null +++ b/external/freetype/include/ft2build.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * ft2build.h + * + * FreeType 2 build and setup macros. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This is the 'entry point' for FreeType header file inclusions, to be + * loaded before all other header files. + * + * A typical example is + * + * ``` + * #include + * #include + * ``` + * + */ + + +#ifndef FT2BUILD_H_ +#define FT2BUILD_H_ + +#include + +#endif /* FT2BUILD_H_ */ + + +/* END */ diff --git a/external/freetype/objs/freetype.dll b/external/freetype/objs/freetype.dll new file mode 100644 index 0000000000000000000000000000000000000000..93509d657298afe7951d2720c5c45d83e0c3e0f4 GIT binary patch literal 1891328 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≦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

Kq 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 z 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

PxK!8^xx_$lW-( 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

(2b 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%0AZ2rmD6 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 C+udUT literal 0 HcmV?d00001 diff --git a/external/freetype/objs/freetype.dll.recipe b/external/freetype/objs/freetype.dll.recipe new file mode 100644 index 000000000..f6892eb08 --- /dev/null +++ b/external/freetype/objs/freetype.dll.recipe @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project> + <ProjectOutputs> + <ProjectOutput> + <FullPath>C:\Projects\Applications\trview\external\freetype\objs\x64\Debug\freetype.dll</FullPath> + </ProjectOutput> + </ProjectOutputs> + <ContentFiles /> + <SatelliteDlls /> + <NonRecipeFileRefs /> +</Project> \ No newline at end of file diff --git a/external/freetype/objs/freetype.exp b/external/freetype/objs/freetype.exp new file mode 100644 index 0000000000000000000000000000000000000000..d12b63561184d5e0bc77255ad9ed070ec7a7db4e GIT binary patch literal 29563 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 literal 0 HcmV?d00001 diff --git a/external/freetype/objs/freetype.lib b/external/freetype/objs/freetype.lib new file mode 100644 index 0000000000000000000000000000000000000000..146ed3267bbbb25e1979337f9f2762161a820e86 GIT binary patch literal 4194882 zcmeFa2VfM%7eBs9fP_#3(%S(+nuL&qj*w0QY2*@`!Q*ndOO9L#cbAYLNbjOlL7Jc- zAkq;Fpdbn;MF9&<QBb6J6qNG+yxHBmy}L~UB;W7v`}_Ym*u2>{Z{ECl^QP?V&b-Fm z)D}%vci*-O=U=;y?Ls<*bn4I{#2Ftb+_vk`v12<H9_-6;p6_wo1VG{P@YHc7z7}oe zJk$GfUZ0G%U*(ou=UlH!rmI|~6Gxn`Dm&_PbXEOm)ni{ZHzaU$)jFG0=v60SI7e5# z+9#g+Qml;Q=xUOc#x>oW<97K+uH)!xHo897-21luYBjPy_q5jwp%*#v3aGJw3rLN2 zzLvM*0;JcqeOy2(T!Fo|a`x-ZV_YCzN4K-9UCnjeQ(s$ma_uBnP~`=j(>0(27xWlc zaG3*KaP&SdcuGUZ^+OjfxQHuc=64*sjyL4mzYzEAdZvSCHt+;C(ADxI_w0J6gJ(AI z%m)4oHV~bniZq+Fs(7u@Y$@Pyo1h&gxl`IKTD4J?n4>jOWW3gDRcC4`n4~u8H55>4 zZK_DEPMvG8sp8C;su;B?!=SZ@Q7)*IEQ@&<#idx(8m%f)Z&jxo7(*TrWpcjn3GNZ* zT$9a_hENG=qa=}&2--ZY!9h$>aSWwW8O$2BL1ndN=*_Aei{50@smwVxz1d{tRCzi9 zW8ic)RfaY_H&dlI>1}jpW1<>}i<J`zxjd_hPr?n;n{*~5vgq@)7L~@Jwpuw`NRTr^ zrGh36p&@~tbRmI`A7{tw97u#XTRZ3UDSXvLm`yfqzKz3ea;_<sL>C#icVR%q;HxFm zqRz?EYpf`{+NR}fF0!JC*1SxxF=c2i_7VV_uD2Q0IVx+0PGwPBZKzZiq+1GSQg-J? z18EAZ5{6cz*=);l&E85XHJUSW4O&s9HkAhA1oF3_*HB3a)lLo<BtsW0g9~xT$t0Db z>foNRlRHY4i*{np5DLMhh7x&owsS2s)r1Z0M{UWFC`g@QPS>h34Fx$_Dudq2Y|^OK zs7z=CR;m)KK0|UNGT;;NL^)OlT@>0*rOnULT5Kw<2_ouEnPhc#0qn>et11hv#i~;0 z<QNLL94p<yPMm5-FvDP-iyf<VMpcg5Vg<b}*QBv>8l6s+o~t*&)+Cq=Eh$OFAV+5s zAe@-s-bNjTz#+$~&dqn02PJW40R-6!UqjHF{XW-fGaIE9ClCs{VeOf>HX*{UA@?Zv z%0@OWWz(ULunWQ%=K$r@d*o<z&Isyf9bIwUz<yNihT+3lgH~mr3wJ_@J(rzAZ+42e zXsue-qxKxG&rzkK_Ki8fSy`v;$cJK~Ck@QYNj$1TRs_*RB-*pbxvPSrocKhiM5rR- z)j1JrO_mmehdDbp2O>z37>*bw)`)S(jm{0LL=Vr#o(PpBPGl0VHi3(U4S9^Kh~Tr1 z#)u??R_cd4qg~l0WAMz=QtH@9r}W8!nj=&R)B~iNELt5SP=@PmZiR70O3LDhqP%-x zJZ8g|(q^`xK%qU__2^O5@D>`{IkYpEj&9sZ{q_M2)<uJAKfNhBAw?CVRih<BPKHcU zs-iLGsA5ezvnwtMBOVPXE~I_chFpe>QCn3=-;?!RG-NXaW4B6!*`^B17=p&vPpi+& z;;oSgSxl5M-HaZBO*$O(iRlLYP@c5|sWhnh*#Vyonu$4^7l~!d--nwmLYWeCZ3aDN zJSZ?mPkn|~HVRbEaXcG~DqNeXHz{+|lhn2>Dz}KoxUAQtFb&yJx#_Mbnrlf@MVT^W zctz#sm@P~pA}b!_kW|E@5ImAik;LYU@>{5U?#MWl+*wH8mhHtzqMlk%kyOxREhae` zQVb?mbW3)V6rGH!%u}0K^Rc6PYb_=kQzTUJTAKy)5JFLNQAK2FHQ6baTy080jutA_ zVwAB*B8OB{4nt})Vld<g%xE%7^r~o!mTA+DfZ^#g1cT(KwehOHYP%_mvsALg3>Y-^ z;|`JI<5l4XOja=6gt6#N;KQ3MN{BcKAKdXa+gGbW3ls|&j~TFD70*wUghC^gDlA`b zRYe=rnRa%BEi^BRjMQ57nI>0BXf9irltNsQ30;MzH14_}Y@q^*k@ES3Wn|bN1>)J% zjTM<y1yvT+8fhyQ6Khs`B7)e8wUcBq)0{-lYd?Z!(|QfrlD)pAIBAuOhSamaom7I7 zQZk8He<4<$<A(Jb5#}8BG{pBQWaJUy=6puX;#15jbm17qB`Ay9WYw81Mna)k@!cK` zyTUX&lci*H2Ev+!j>rW~GjS<OFr=PpE1wrciB|IFFEy!%*hmx_^B7*@SWM-4aY=N< z#af|tOxjFpgQ0+7dTR@`tVOfZfg~ASo7HA1P$g1diN>Z<=3>I9HKJ8gnfL<phAX*8 z&xgkzDTSy!A%WQG3AfU&T|kjNNH_|85-SNC4HAc$r0PbI!Xu;6c~EDCk%<Of*6R>f zFdtTXlD=LQF4SL`#>NIMl`yQM=gLs=#!76$OqrNfM(TAmP^-ewLj>^w8|EmgXg&X| z8fIg+=!WrhOz|{}5vLXWjZlaPt=<r=XH^kl=39e4PeAbPf}eEokKy(r6HgW$r%$)2 z`6qLBFG?L{v6wB?Z3~?u>rSc9hf>gb^%xWFHXs*g6`C7mB#pNw>V)Ld7y+f!8d#6V z$|0r_;*gN?wx@D##?c0JszR~J-du(Y;nv<kGId6yEvfB;3`51KO_{lv@kr{NGKFbN z%^et;Upphs2Iz}#91#Y6j@X*1c}Sw-)CG>Ik2E4ljRA-X$65=eV6zC!z;f(TN9!$C zuoJXEgly*ITn=6Y>UKqLF5{%b7KsCY$G2UbU@C+s2F@i+z_Nf-=1wBB8x<>_UEU<K z)n?UL^f^2`QJ!SsiCw%`(vvu8K1FRG%o$Ev2s^^DT0>$obc(p7!!Wt&yb7cfN?QBL zR=FqwNJocCNyW}w6=lLCOsf({4~pyGuAQ5<slSag(`1$!IV+9?#pWJKW>hP$5Z5S7 z%$T6=v1s%*ZB#y%g<N@xT^&m(WG(H@1XPkmi>F!M03_Lpj|;q+3bc-yS4=^UnVF!_ zC(z1UoF)T(60OX@H0AL8n9s`K9NklEHexo$`bjaSuhwG4av0AGrYvYJ4#NVvJ`5fF zlMpiE5lpA-29qga4B&4ekuVQq_xux*oo^}|%BX;LgJm~NZH$VdoNb4HM8hD(FH#Xz zd}MoGEb&GhM<^mSN1O@9t8M7I#f}qq7JWYQ#mtkX<L_hbgP1_TW^=UMK^gHhB1*-c z%vj-pf|7)e4L6bcJeGik@YJVD#@eMwDUi|JfI3eiq%bQrjdLPGs1EU#Uz>GGA{K^b zzV--lw6hn@ju0j@;(a96T8uenE0e&E6dp~)d+9Lkit9gsWD~K}{P=;~6)Vn}q?Cyk zJ?0Z?dVZCX3#~+?<f~aqkc{P54EIu$QwJfYWJrTxd`Vahu-P!4t8HrPxhb`X;|DWm z4E5L+ZKj1PjUN|SJU=5XuyYXa(EuqvS*_7v@q`TxlvAQkhj|HWbJ8gOxmxV@>@m5* zx=XTFht*d+kk~8Kfst4Q-;^XX7G71n6)|a83lWAoan8p_;Mo}sSMm^+tmRRnJuzz) z%#_y;YoNkBSHMWp3m7pu^ug%ujZH+@8PGJJmeymi)<ZH8L6SaSYhX#3$_OQG<#g{< z(~f=t10cUBq0}>D;^$+k2!mkT!hIA?e4{PGkSikd^)`1L`gDyOT71qFQo@eH3;0zJ z2PQSn%s=Y7pyHxfG5Iw$q)g?F!v(3#ay;<U`xYW(IH%-78xeA#w(odtBOo!POIRmk zCCBA9j9IKeP4O;8Ayl+pYshfr<61x>WH=`g8P=_c4C`7(2hxRuL94cEU8_c^)$#_z zYf_nwl}WN6{x-!@K<o&UqGqPRKbrH8L`h}?KQR@MaavO*zj`Ae5-`&Ql9CG;mP8os z1XQw_y*zQyI2oltWXDOy2q7v}c$=g#TTGadU`;@WZi=1+1&mqJGXk4QGXpCvli`ug ztP!3fiQW;T!$Y-f1g++x-K6u+s7`5|@mXqXmdccCw7=|<AlQ(Ow00CG@w7rKqO3No z*V7t|6d^7>vqVIp=cfiz8V4VPCIbum8SLEyD2!SoUs_^GHyM0(6clr!@KB}_k!Yv| zZ`Pn9@!sVYLTGXdOkyl<MXvnYrA#OaMa|P=NJh3fV($(@dI*NT2rW>s7ch8}C@R8Q zV6tUlwPv_hMNh$cdc#QbDq7`2syu#03XdLIdSG)#iK=oCS#nKyz2Xo7qB-4@ENY!f zone4#ba>%vwH4UkkBJc`vnd@dh+aHl2Azp@6fs7a?DI<yBGQ@6qE46ROcC;&DaMU6 zAze5dO@(kqL?N6J<IWjKXU@4cvrdm;o@@<&*<%uwE)Rp9td=N3K1Ygi%aM>yIi{<P zxw4#Dge+$k<I0&KojIdxlIKhj@|-EgjWZ#gIb%&8=0YaT3?f}}Pm>iWEIl_1FM4Fm zibcq0PD$J{C!|y68g;h3!LkTh&Md~2Gef#?Hd$q5*5Kh$USTZ8oioT?I9v3Ea7IKS zG9$*FGmy@lvtX)nde%^cJZFk=<4j0r&O@?Q!z_AQDOXtw@Wx(vuSvD5!M6_bxl)9D zt`y^zD<Pe8&A}^V+44|?JZFk=<4j0r&IJ~ON)x2PHwexhoraIFYGfm1WuX-EvQP|` z{L$CQWRjzyFCb(h+@vQqR=r6lPi-uu5Z2su`Yyw%8)v1n=3*p}i?Hc!^c9PH3MbWN zX!F#vmBJ!q6~SU$i^Y)6oUMgacLqhsbEX(K&V+R4oNF`|6l%a)Tb6u-WD&CYvKZHV z8PX}=OszRvR#z-SmNScS<;;+-oaLK3NDFD|EJlX2OH<Fp>c70q6d^A&#kg@Mq_fQQ zHI7^p%A^Q+&J^RunUKz$E!u3^=A6k#xHo4OAu9`|ke7vG<eD?%CD)u;gq!rlMy@&Y z)H2PPkC183LWFyBW)X7DnMF9OE_X;FhC~tail7*`ViD4XvqgR~lbMT%LO3JFoimV5 zoU`zWpsXRW2wBc7#+5TeI&;>h%WETxBIG$!j2mY{I&s#UGW424yP#}L=VeR8B4qPr zF|PSCq*K1xSw{I1u?Tt2l*ElQAzeAk&yc{mkQow-k>TtzL(0a7YVz8k2zi+)#*H%} zon$ts&9aOMFUyxAT-g%Ng{w{e;Res)g*@D_7<a}Xcjc@%6>2qLVv_Clgb4R;k44CJ zdn}?54ImS_ZjU9A>-JcLOxZ9Gl9|Qu)H2;3A0gB22@&qy9*dCc_E?0gVsi?y1Y1sF zrhpikV&%A0nci54F;IlOiYdm8Ga;R2)?4K}R0Bm6!Wl8{oPl)WjL%l^375<R8jFzS z%wk+QGo&+TLxKDQnvo*pIa7=qXF@u2#=5Ay%oHKdnPS{H6VjP;K_OkHks{<dQ;ZvD zLOO9aWt-*u9~L3YnZ>wrW=Lnw^s&8M4T7mwUS<~K#+k^SIGYW4gDS_FMaas`Vq7^h zq%&trw)}k1OcC;&DaMU6Aze5Z$PXaci%`e_!eZPxgWQ?36(0%6YJ(!=Wu_Q6&V+Q~ zY%D}(D<TTvj2L&$Kss@@n6u<t3X72C%wk+QGo%w|d>t)6xnL2poLP)3XNGj<%zr+> zRuuV#Mr)QDpKoC;2`dg*h{byntUXAO8F&R{F&9X%wEn6w;6qTn#dgp#EIzBH4_sZ) z_zJ}+poYm-GO`;cUllCItyo0vTr9mw-sCYd7Gm-&#*H(PJ9BnCw+s4W2oqjTu{Ag= zy?K-~Toxf;Rg}anXF@vXTwsvz)T|UC&zWM}I1|!|vrTO@$jZzjWI3}KSI!LS!Z}ZV zWyz*SL?N6J<IWjKXU<xK{2*<k2zkyF<Hnhg&YX3H40tw*kmpP>Zk!3}%sERf|MX#_ z2zkyF<Hnhg&Ybn>h3J_g<T+D}8)rf~an4ig<z;3OvYc6rD`$pu;w-n$No|OK8{oVd z<jK!(Xy3lGcz#1`j^lhMaGcK5gWI~ugX^2_$&LQRi@Uz09Cy`Ji92$l5?6mm6>il> zRk?%>HMyj-wYcF4b+{9?>v3@_6<k_Y6E0_OQ*K?PKUeLQW?cQz&A8j%&AI*~TX7dd zU*Hzh2;ibq1GrYp1Gs(H0=TWc0=Z*v26Eev26F3aw&QkgZO1LB9K>}P5X2oQ6U^<4 z4(1w83Ff-|5X^lyGlXk+JcNsTp*{Dbr7M^4Zx8N0PmZg_)hzN~OHRSHwEugalm6rJ zjk(4`yn<`OLX9{N1{>JZ5v6$7oNLZCWB(j{`A{RypQUJO=hKL5#4!Bd`W*eM!~VIZ z74IoUBd)en&SG3$j{ZH5s|o(q!#{%6z|XmqB7ITNQ<4K;YQD@3xrUM$;z0SdaKVY3 zrCdau9P~sjc(Rg-8fnSy<Y+~l2TJBwNWLNs$yV6EmdH{1&r#1}>XuwN{PW~0<8N8~ z^W<7R`}a%(PppB;NKp$`R0IF$Z$-39AN(UbbF`51Zno?P`=);t-C|mTLrboLz@;Kr z9yAqz^OkU|%2mO?%3LK}lv8CEuE_Z^S?EsuR~D%&a?f#P5a<4nZv&p3*VAsda^A<r zf4+z>OrC9SW8Y2`y15PC*T{aNFK!Q!>?^^Smy++`p7P6mVG9D=jzb>+3HSf8T@8=5 zQ{V|Uy*$RQ0{VVU{8pN6BCvmF>$nrYKV=xn=Z5UwvHgj^wI3G1ZpE+vWVa-+k5R=B zw_SI5_59!6uRy!gl!a_Sd&12OkGEF^x={TWHu11*XtRp*u7v*!c2|fU0PQ+(-@PZd zC+hL`V@Nhu+1mwaiQU)_njnnJ{)ED|;t{E%#Rzw<d+!*UeSb!sj^oaKrw9A$++|zg z<Lv%;noXG`M@csPvh>oOGXH<yc7n}MrMJJ6v?sd<`~QK>Ev&V%&3>h_DcohpAbm>9 zn7eEi7k4W1ZJqQlZdu?l%3?N?^Hjxc29-HvAx3s*ynTlcZDe74SjAym+@XUZ>DiVa z+KEKHCT;WiKd|M;aRySU?f#+CJpNW7kvg8u!|dBdh=Dj4vu}x~xgXKn5z=kY|0~;v zp5!0~ai0%0R&h_S6VARZTZ$E%wG{V%<4z>;&@FM7^Rq2Uv?E!%rKwc5B#CoPm&41@ z`xbIc0maA=7dAyCa>U7>q98=N&KL>pKKCW;6K|kG8k)Gs9zj72DY6jRXfH6^&-?%U z-Ye==F+UKG$75$DIiu*9CT9%aV@r_F_G|G|tY-)7*pJ{r10(|x_Obn+J1>!B5KiVP z{y-IBj~hFI<bP<pT@i;S7IhdT4rRkpjc!NT6?W319sig|J4z3m#0L-0c5^vxRC~6Y z%k8y#`m^0!&vtV?+s!2&1WTLQp6%wsX`N8Sv)x>@E6nM`Ahruj?h`r|A^XV@i*fzr zh#_4$%YR1+(n7vCW-&6HUA{PewwvqOZZ2xhna_4}NqYHbySbk2=3=Mmqh&nX&Bexh zwnggMZZ2%`avGTp&vtW34trsnw&Z3&&vtW3Ps@3>n@g&VXS=zawDD{=mt@z~v)x=w z8P9fe6|xtIHh{T4<UZTYg>#bZN3F5VUrtjNwrNXlkbbtCOE|TP?TB>o9wfWH%gwWi zypN%$by?%&n#j$G4Nm!!bI`;ez36n5KPUyPvzsg_QaIjNFdU?K+~XphU6y73R}PPK z_2gwgC{jGxP=fgHA0}ycew0B+8$*?LgeaZ^A?F?mDV)4)(ZQ2W=S+&nNd6ZOr!>nu zjVR>I$|AgsIk|L`_tRF`iI+~!#$<iBL34H=S<Dh;ypuT`%DH;HpwzPN=!!XOlg{qd zssuNEVB$Dd^YPE#boIMMp1F#3)+OVt%-LU>o9{AvePzlV@QDLcit%kG?}1I$$D7s7 zjh@}>)Bmi8G;*2d<V*1}{nW{LDsywgD0mE%a~LRxlko)D?tjCHAUSb-Jok=|>9Nwc zt&5ZUVtw4V4{Xo7yC3Wu5Rk_IH>VG=rsa1CNn_`Hr|E3`F_ZzobA=PJ!K+9b-p6K< zBsO>#3JEHfq+QVz_~eBc6-k8dsp$9&UD5HZ*DRU@?Y2k)zW*$eBnO@~$$w@sM7%f0 zVu;{hv1kgNrRaD~(JIl|Fc=rfL1)W^JHjGKG7Oo+;OewU8me6KXjmi>CV551>uefw zSy&_uCZ$Ej>uir<(>fcIw-`ojU@VS?ZDlBi2*X`*6gbhP7|Ybz%r=a@#V|4&iy@#% zS}`P<`NikM<{!oJ!5*+;NOU-GwU}N3Mp2Ae>1_N|znHv=x198JbJ5KaIpGNKBJ&ZR zq>7}`*>C_)0M3%<eA@={eZBbCJ~{-87#_9@4D8UMgF+D;6c`-DP=kFlCRX6)jq9L0 zWZ^g!PSc=YKn5K6f<1r7ae)XN@DT3==vx(Z<S@ctDaM?Cnd9z*?)SkwCIKLns~RrQ zrHFI}1g>kuJ03DRa-ZyPG>I{<mE*Xy430ZLgvWFTP;g0u1M=ZNMlDitTqJ@iM#nvc zLb<@u0P-^<p&JbRe9+w$Xlsjf7H7H*z@LW{^UVn0=Y=bjO9~BeCgT?2G>@$U4I|{~ zb_Q5%8voe%fg;Wafn?}+ATIhrMO<jr&`?H~;!KwT8iOmHCM(<8A%vx+KmBp#2{d-3 zFLa|&w2h344oi(oiHi;I(gc4Z;!`4<IAaszA``;mqm)e)Wsvv=u35NJI1fMK711RP z8yJS5{;g?Ya50Bd^O-->G#gIg*A7cV4KYu3X>{g4wY#*UrWIYdZhqWgj{A<Qjx$JZ zjpghxUazs3t!AA~(IUB}A`wngjr!p@8(R?p|2J^uM#Ur9*5eB1dNSD%WWP7@7pB3@ zz~xb$q3933ilu!v!iU`TxoTBI?Qt9qCb0iP{i@;+13v{2Uf`4Hk)?&V!0JG?0BTlM zLg9&$yslT~I{Q&p^qY!Ux__R(<@T}rmxcRs+)O0&<P!b3n;^&%hzO9pzakP<#HA4e zzi&Ob(Zu+BKq}l1fYE@*0IA)a0DKAXBw#k+DZp0%e+HZecouL5;O~H>r;)fqT=dig zILfm=E)-AvK~K`X;-n~r7zgO%2t!e%l|W$Jv{FYP%YpQ))Ep}}(TYFHpUO?`$6r8R zg1jWtH9(T<x*-2?GzwSwQ(>TV!cQFF&T0Y!R?m`;`%$`TRY?=#&sqNGxU!^P`uRtz z^#=H_fin^}EN!=97O)hAb0Bk~hm~z0z)>}Reyf12&yYHpCj6de(V<{C%finu22s2b z>5OzVh95P~-&!yR<fMd9p$-~yQdooY5=G+bqS&73M(}F@$_zl#TA~LAYPhSw$Icm8 zX3B+sJ87zXkc{9{)j}$pJ(Yys6HSCJve<DTpx=*>i|&8nZ@Hg^doA@y`28;2?-cI; z6z+c%?ps1`O8+6BH+NZxZ%j3epBR5haxbxs^8y<prMe~C=z=h8oBhIJ3sm1RfE@s1 z0cp^P1AHAY0g&2K65u<4eE_!tCIfyCm<o6vupi)U!2W<f;5`7a5}*pOHlP~NA21!T zC7=edHDCr{FrW^w2Vf>(B;XLh9KdYAd_W`Mct8{26hIr`e8615m4JDGhXD%!scf$R zUIZKgNR>SnurlB{z$Snb0Am3s0rmp~&(Rvdseop{X@EAs*8!>8=K+2W_!i)Pzy*M( z0T%-P4!8vHHsDgg@~Db;0P6#;0BjBj8Ao>qTm_g6_&#7d;0J(H0oMZV0o(xi4d7<L zbAVd`ZvcJ_h@)A!PXMa`ehSzSa64c}z#V`$p#KH9aDJBE*m29ffU7bt>O_C7i$DAi zYeM|`-Ba{N)WkZ04fPOcw$$p#NEJM1dpFJBmt(yVZ<N$e2MSaKNH*903VrfulD8)y z$s7YnW!sM{(4}k<z}3d}BCg+@%0`<O$P3O>l&*$T=`=Vkl9iCqp~#0Xv<c%LL*oD{ zNtcw4JhPcHI)apb`&o;9*^j@MD1&rCN)&%o7SaW(lj()<StvV|PY<X7%m$>gVm`-o zG8N%AE;?xiToqjYxXw7~ggFg*3WZP+Nm9Pobri87aP&KbBFfh<$>LhSV<0=pHx`g& z94C}zGQvGv$`T12ja@VkJ?m5!4Y@VL!Yb<7s7fzT8FNkKSMBji=QP}q<%&b~VWA{c zH!--xAIU-GC<oY0K(2z^B-?608k*MtlD&Qa7zDT$kmOzmNcNkD>qVFH#Q{e=VDsGX zMV9Xg>dvWjj(U-nhw^nT&u5U6WceJhG2kx10KhK*y8!M6BssqXr1I3LKyAU>uMsr} znhN5`8&zU9?2gBIh`0!~$ppt;Y=1SpdYW@B@GaF$plTsf!RI8ohZ1)Y#;8ph7`btr z70aNHNG4^*&q*+hd;6WGhBMl#A7Ujz5+V{KV-tF+l)Yk=FbOeQp-9h^MkgglND{Zt z)Tc{h!()54=M?tDR+D;|G`e3{f-*IsCyv4s*{ie6L!=bF5@W)`F`e@Ey9=}O;Cdy7 zs}jR|MMYrN90f;-VJT6nh{S}H<it3L92O4GZ$SdFXOYD5Vf|I%VF{7_Vk1*x(Ej-h z$`qL<QW=q?N(t+UE|e$tE|R=&SR9;SN5_TrRN~+=Z@=rVC5TOwEkJvL)~Nulw8|6+ z9~PIG5T)vy7?&C!#dQ{vIhDaRS#)A@M3gEuAr^;XMMOj?m8!6~I4(>`>LV>r@ktXC zRLVruRzz45W{lo`*I>ovIR34P-VCFu<Y%MS&VCpxo!+O^L4w=Rh!>Y+9;UUV;^k1h zI$v+hH8Okp3sIh2L}Ie4Z&b1}7ForI^`g5VJXm@A-DJ^`vC5>lumLcD=vY{4L|8&x zEEJNM92u2Nwi}y}5|tbm77-Q6TGS|30VzokI4&+cETXq6DLFPVIW}d0Dj_jBJ}i#4 zD5CP>WT|2kSe>F|K7K@|lB2@F;ln1k&<wm~1_xm%^YLp6CBPRhyt>(NlAMp<G9*t* z?Wash#-Wcs%({!RZQhEAGj+45_MWOFB&{lNPPJod0%OJ81(_%F!?!9r*Q8-WIr3CR zV959JGm{WhhPbG(gw!Ne&*a3^BphMq<ClYaONxjIOU6Tok6$v+knby!wHg)X^*(-U zq*(0k7SQw<p^6Jj?it1O-!m#1k0?HV7l4jSN<?kOg(W4SMo25vM-J1F!)+VO$jGw{ zWBv)5+&G($QT0QmvLvfX<_KPMBwH?@gnxc!vNZ>m+L}b4Znn%CWkV2>393?+QORfz zDY1RY7Lt;ql<5AVm?El?B1pR|b5aYuAmQA78=V^Hr-1z715%<`mHMIoOp0JtDlq|e zh#4cMKAv$R^Et}Yp^S=1W%d`Al9C)7o|+P+L}%#ZH-@B=8dp?8-`Hd{g1*5_^(PPy z%a`g{G%{uiSau=ZxYZDolT1+=J1|O>!ZigEwX|eyjsfpFtr2EROok;P*QkZRL7Z6t zr`T4eh9*c8$?AZNm!2x)k|M}>sVr8KMk;M=0(DQ&AQ96_M3OQlF*yaDgpVI_0<F-h zamK2TUy{_2cxS7u?&~3rnwgZf*kXCpha7O7sDV>n7!Z*k1G!30tJG3xH302GSZW~* z^;p2b$tGU(vKnpzY2%XkqKYbIcTg#rF)bV*1)YMzH!LbZo}d6_Y<yB21|*?-VKU~T zyhxDh=n53TgeN9an`1I(yQ)v9Y$gx2**Kx2poU5F$E3cAv5|~9O;f;J7{p0ldaB0T zX_FZWA^M@X@5dT4-6<$FGuUdlyGqJ(X^~{4F=zl-jbr7dNda<*GHJ}@Q&YvNRP2MG z6S8z_k}wCpO;R>g$IK3y-IGXEUYtbh<5!RJRB7O-OQ<(momA!Iren>H6_{EPn6YN` zJQ7e(UrayG7nF*|Qc=SUB(Y;L8z2iD%IehKFv<Q?F*L9ql;k%e3$ouN5|R>-lH+(S zx58}}$sCcYOi7GaDF-N1qT*FieWSntZMG-+H=2Q90K&M%w_K^cN*XS;Na`G&+pU;i z490WFOM^kjM!Y;u-7>5SEh^4oT$GTCA`B|hv4Qn6B)N`C_85{=rNOW{zL}C8RphII zSsL9}C-o9v)H%BcwWvdqgcPpQoAF&ItMeR0GpnQip$)}J>paKI{AyZpf~t>Syi@Cs zHM6FV<g^xYz81gktnhlR{o*!{ro^Y1yB|98aE|8m^0B=i?b)}t;lVeqUJrP69R?Db zk1M=-dHK{y&#zMN(up!{KiRVG+5la{2j+HHw_krRug#h^HarN<WOU1XZu_2@*x>UH zUHz@KRxYfqsC{wB%R^SwJ9sbgK~$g4e{<Y9M)&>Ed$VtyjBC>5?ZNlG>W;aiY4!7h z;AY7wl|wF1xY&QuRF3QFLHQ0?SSfE&nf1H3ubck;cf+bZSiM3&eQ4`(<NAgSUD&p_ zZ70@!8C}xBj4O#pM}3vzfA`FzEnj@}S;KYR-&*}y&&<f*>&Bezf%^J`(e-Hb>eYXa z<jk5ByKg}&#he4XZ%uBw@z}0;e;u-oyLhAp3ftC`@@+ds|8AGn?KW55aDV)?u6-Zv zGcS2%QC^qGU!yj7Wp00M8pjQ1bTvm_2x|5Hseih>+3ve$JHEW{wSQmxWhdL@e0?C$ zRQ`Ooc6gRybO)Da4EUx~R&DOk%ky)(>6CG{RbKCFTYta3b%^)RQCFflF4T+iZMgcK zv#rcG=dUd&qprBOYKw1HZ?tq?&~MRd-)fcW)xC^vWDTPW3I4O8|LilhcUQ9xZrr11 zpAPNTM(+LMewF&ICx<6wk2#KaFO2S&GozYU`{d6TR!$9#39%}@4riZiyzl)kKYy_D z<Tp)pQ7ti?m!W(W6=J`*b|ic6>VU=nbR9opPqj@QPv6<wvccOk8g$;W;txD*tz~re zw|qCe@#|l9D`>x^-9~lv{VFfE{J!hqSvOh^DBB?Y%jx|%?q5b%?|iPcb=$gqTYuPQ z*{K&c_WHHOg7x(#Og*{u^-im<hUY`J<g%3S-U{UsYkS0~YYa->_HdT<%8^sgFRgL< zr?k0qy6i8Ax(Rz(%;*w+ues?+Le#fk9ZmaVb4>8o-XRYbbe=mx_fu;5zm9%<&w}*? zMmOi$OSNl#|IJ@X+qRE7HguA8?hiM!s~?ztD|zmD?|%osh5Buc7N_v?Pks6H)|)wV znqOc3!Hg@*e~CFV=Xl?)<#unq-}=$Ooo9cAJu|u*c@MT!-qh^$oscOf+x`#`ws)KV zjdP8EU!C^Cs9u(ua~5Gup3ybya^kNl*L;T7i1i56#a^7<>$lGu9z6K|ymOyCYV`a4 zZWTGMsW;_&;A#WSZ~2=~J*wGk%!pRrP5#~VroQjd{eLJMUEM$A!N7%B?_+cx6SDvL zw`L!s=b`kbzt*k#y!YwalNHC_8awx6MZ;Skl)sOB8J+&}jWWR#n|yTR_uiG>ie7MX z?w7{ne@u8|(7xu2y5IU_4%%;+59Ql-So>-xc753=t@{3%)_3+LAKN#6!=Y3CpZoUK z+-zH`szb33$mp{AR_Y#L+4@D+t)}ZA4H&aW`)~bK<qCFsS9w=gu1i*rgXljP-5>KC z{?Kg3wu2+qjvW8znyx)RuHCV^y3>UCU$2g~2HhKk1&4v<S-u}tZ#46dv)sz#H*dsj zeOR!1*r0N|Z+!OrjMuAA-E;5XuQ+ZeqvIx@DLC_b&!HnbmLHP*Zi_wTUcX&8_~W~y z6Qa8}Y&qWJRjd(W0YKr^sA*nM{VK|xhHt9Bo3f(LnMoB!Y&`et&8A<3cdjt=xu0V= z?lnet<kW>ajdmPqzdCW(`s~9Rzs1{6Up)O`m0_>6$=&$EGMdKTV06ig4-NhD&7WSW z+IzwzgZ9{u=Nb&Z(q>8Tj9nhj&3w?;j2<=xYY7Uk@X2TTPRy$ka;N#iQDr}^x2s<M zsZX;De%~H!+!6gCyTWj+t1`Nq<8wdxVf>MOt(Ug1`}@N7zv&vRvz}MKGNH@<RTGwu z9;oKH%ZzUR)>dEr8$R>R`gJbf*|q6h*p`m>$|zE9tT63(Q0dap%geCd1e;NK-D{<L z<-qZ26aF%-e<vvNW`2)#)89DiZSDSW+tOx7jxD)|@-n(NPFY4PK2Xk&xO(u5h_DX1 zue5sE_l1|%Z>n8E->Yg%dh2nM(M7j-Nt=_~f53{Gecq28HsqH-WAbLK%^J7(RqciG z{pRdmg3+fE<vXj@H_HZId@tn8p2%w#dyKE>tz8rLZh4*h!j-?m-tpei743u3jXfQj z_S4EQXKnJC?;mTKaqykrs<k}w`-saEa=*N?XU`+78~wuQR#d8d=i3WLO|P)43+CAt zJvUT)S8F(ZWze0jU&Kv4Sq*w_jfGW(SG5<)9=W+R`!m0bV_%p&;oiI6!Q~>FH~8b7 zGao)`TrO&SEY{{2-464$S?x#m3e3|f2W?o~Sy$)!zHxI7>Azmn_J;oFan?Z?;}~7e zTD+0#nquqr@!`dR=caExb-(xN&zpKZ*S^C>-MLR2&E~icSnyMLCB$!S=NYl^{?5aX zT5Fq5p84rVz8jVQ<iA<&^xlhqdd?clapM`?fW`R%i~Vy{mUW{RUa$GeJddrZ<2H1g zGG$Cid`R7{1rIsyIHNOGTHfeVx!H&6Z`{>>mNj<b#V+&Le>3&1Jso;BJACi2&+|F1 zBg(AsTJ!eB_s4e|x$5x9eU)DxF>cf=zqO3qd!v83s##ax>FV?7F2{{wbQ6wzAGb^K z`rUJxce`$T>Fv)RZm2SAlV#4--;T|mQ-12YYaDl&(cNzqQ$69wvR`jak8Qd+fA}YF zdUtQCIGTO5!$0L;o3-&^I>$AFEhxMWS2j0Tb-n4geZM;P_cwo6JwKvnv&fBoW0p01 z;l=uW4%gg(^;|~h|4P*J5qWP9^ULt+sXjSk<dsH^%tQY8ux9$9q%)s&yVjQDwlKOQ zzj@YL+a$I5HEowepH6O5wR`ovdddBcFWr<fcSg6CH9y3v1I8|e*YT6zNAw=_*ZFQo z^F2SDR_pSbH80-z^~Dx554`=-o=@vFJAwB!jP8@IE3Pyh^XI_mt<_hzd1F}ew;#q< zY9G7e#QKGO#=n$Ne>=x5XLQ;F-{~KQw6C-Ba=G~j)(<p$O}??dc7?eM#}1v*dVaSJ zZ*kleMmP1_U-!P-C4S(UW<7>x-fLaiGX3JjyFpV9UHD<#moL?N$%OjA>|5bAuR$H} z=+65)RPVjTJ8ys6F(Z`wzZ+zmmK^;?zdAwN4#55<FuENpybmV^gnGUh68A~O{^L_` z8qY5u)wPQ11AV-r+0eQ-IPND#_lE6E%9O!#-kqGF&wb#(Ikr=DpHS`Xk<aT+D-T|b z`uHN&$e*Kpr(Pd3sZ}Mf0WVw|d2imH&FilG`KRZNO_NXT?*GTN75lDj!uujdSEugB z-Gh8zo>%Q*Oi;gv-~1N0VORg<eO^hg(&Oii@0)I-UH-!8l;;yaUbyL+vcKuMuXg>m zvr)>S=tU3f%)B;G`B!#!W8))^YgL2teRycdl+6P|dKhl~71(|5trxyOv7&iM^r2cc zx3AH+FZ%$C$72}Xz!S?qeRbQKTQ&YVIL^BKgYoYvK3meNyvLib&&~e($CeTAa@^O9 zPP3=!s^&L5KkwtQVA)?EMXvpR+(F$H|9sC2T?cI+GW;~^qJB-vx1vvUkL?4Su9_Io zPrsyX;Lpz;d~wV2@?O8+U){M?zd3Ez;k^Q*o71Mk=u0DOn=Z7!f4*GY!GjmO#BN@A z!0S%3&qupoZ85I^YuJn~Fs1V5LGKsrU9o?D**SryV=7PlF!rPQo;_PkU-i!Dx<5DI zxW5=((8E(hwzdu3kvy%(B30PZw}w6Harx$y-I)h=jTrw=E6rIvQeke4dC9*MSO1`& zxOw0<zm>n<d9~x>x5p0Me)pxYSueF7@pqH44e{QM(G606x7C_(ecTIy<zl$=-_`3; z?Z{&PeH(XpZ@zr?qgJy6Iqn}ucj!{htfv0+cWixrd80AwzMWWa#_fr#y@MBizjAcj zLsL(GjBy5YXoXjqvh6o682o&K>fF3WBQ|#X-2by$Yp%XO^<d-Q69<iaIK2tp<1xAd z<97pReYmEeQT*szTMplxK5S~;G(SUP>bv)X*M8D62K~@gMz{J~pU=j7FMG3UnEwxJ z&jh}%Na%UAS?hzXj#R4Bxa0U2(I32sI#zg%dau>$Re#;ycy78m_ov$%;#=3N*L&+% zQ$7CZy7%VLEYGQU-^l1<H@29+rS-SUKkojUd+uc2K|TH*{&wetq|?EDejOX%Yg#zw z_l#~yW~OQ9-?Jx%dcJ&W#?J%7yPKEnZ~JjnowWn}d+b`-V=U&o7#kE`HRD%j%<}BB zyGNM?6X&kz^7&W4OxU}!)BEwWn=R3+o}aEjzKrht*^KPdo0@KYb4;(H_a^7p?L2nw z9DVf6jSIV{w_UjK9_Aaz8QqXi^Db_?oc`*GlPlJ=42)mW_V%U4%d`*1tS+B6p;72S zJOc#QqkOMCx~q#{ylHImE%WepBL}2@^MU8?-JQ?mMSZY)PTvB}4vw45==M~u{_3c^ z6UP1>ko3?tBe9<~sZEo&^P48D>ay+m$$y=PoqosY7X5wUx351;8_~Yuq(=kipH1KT z=wzSz!R6O1x}BZA;lv^6rEz`AmmBbbrG{_PmTcvro7>;$Jt*nw)ZpCaS(RE>woZQa z{7=yHFh=)i;nmmw_~`vH7yn++a82deI|B1O&X4RmdSws)`3Z~W*2g?zC!>4o!I*o| zVM%xNn%&#hzd!e0*Ks47)DQ1??(AEuUgj>o-5KvfVEYQMyP+@dD>v!*xvw6a46HVJ zch19{wlx;a-&!MJanR<!UTcHr4-KPxwaQ0jr~4<>pVzJS3|n5A8W)d;#YDAze}Btk zej_IpC@0|kFQZHUdVSW>8Sj04c+2gdKlt;V{--XjUt!)oFzmK>hiw1D{h=2uxFO%> zGZJQ$?_^t4ZTaCp!`A<hQD<tucY6Bo`uV8gXkZin)6e7ilF=Pc?V9)5i_NCLGWvGs z%g_Dt$KTs}{`_LWko5=7=GXOZw-ocb1&prsyq{*+4pypFzE0CRJ-=73Z`<?Jn`PrQ z9;1D}x$*Y94cc(r14dVn-Q@Yv^JaKY8UIP0ls02t`!j6D5x)w4Z_oZ><?hL?2mOI} zxL6HPc-aOd4=n#)%ih!c-##7kRlmU_D^IKZ;vLPh<0(6)UTk)9CdVyebhW=pE>pAL z%yHX0Eb@Ilb-;5c({hJ-zchP5tsZ-}M-50FjP}OpwoNqudvf0HGXWn)pRBbfy7TSe zj`io>U)6bXVEqOw^MmGKz5$z7c-{PU=J@*EAGWPM>QAqwchV1>OZjH(xz|EE%->+z zGiu>d)Z0`>H*Wdh>1n5ScMRL`^WK&ZmR|Zcx@E7;zkJ%D<?^$Sn%#TQ5#tP_%Q`ZC zI=3#kMcYl<$yLVaZhm-b@WJ8FpVay%t=JMDc@<-Hv&NL~o`mW5%w<RYvb~ILM_$_1 zF29XD+pBe>uMf`~U~PQ!@b7rBZDMp^d$-zPzBT9hQTNl*Rc&5;r)Ha7)y|!Ib?N;> zu@(DH-ggP__Zi)dIOC$p=WO@m)K$9$eU+2)QMFAUteknZRr>jt!&IGDqAn^op?o*3 zAC{fi{D$G&{JMVa4clvLrcIpj>WKFbG_1Jkka>0DQhbNO=xTf()ZqKE%dM6MBa&6s z>S$Y>JXN9Z=Xci5{BigTc}Hn}^$DYE{?7hg?{(VP^!1^-ikIgnY|H%q=jxl^=>P7d z2T9{TzcUlh6lI!HzEiJeG@c#Ny?*D1Guyvkrt9%G3qH72ZRe@ASO4-&e^u8S<7E<~ z`z5=e?Tl3o@1C35r&DOd{)b-C?|yOB>*ISHJf3^?@cw>@_>O|nZAdQj*O>SQuZ&pP za!Z4-S>OFWtjUe^og0rfxi{zYH<Q+DIIe;}<y)rzTlK5~GZuLbd|0LCvWsng+dX^B z%s#*9ec}Rh>cqzU#&It*x-;2FYgoO$zVO}AcOs@g*XV8KN1knl@AUJW{bIM9jk5p! z1n+Pe-GH;>$3@LLabeY^Ba;>{JGyzys+McZ`CN~lJ2$rJ^Y7IEmE-<qbPE$N2bZyB zH(eLk=32YT+bZ}}TD>nG&vr34tYz|h%*MPVtQpA{Rkr%2+MlgG@=^VdR(BopW?19q zW2^jlBs#hM9?wVF^*_9d`8}g+`tprWH!1gWLx1Z$#oDAzVAD@xF8|d0QbLu(O$Jo@ zw~HS04MtaP|C%mI)yq9NUTX-qs{2cy1T6n)Vz&o6O{%SZ^Kaj}vWMfEqpd5vzSkYw z-1tFN<NAL-Gv5!K(;}&TW&M}^=8evucqaG=mza)qH%50pa<9b@ZZ-ZL8MRr{=ak2p zg$J&V>~~S|#<0KYF8^X9+U1vwZdrxTqcb<Zf1;Cb_UO|Sdc3{kRJT1dzv<U$Vb{z7 zH|qR>IZ4gtl<({7{@zw+!kzKw15-4y5h3?e-~Yil|Bofs=;qxne{i?%K=gl%Zsl)W zdW2%tuhlxu_==mhzsZ<g&AY8U^wP#7^X^T0@L2)ubQ`0)lpQ+#oB8pVE96Y<k!8MA zx8u*%7wj4M`SjZjPYkJdD&{u6bHFpE!b=si_Kd#jt!9B|v?;me_s_YpX<Usvw}N+F ziW=QoF<u3Geu>eI`|zmc-tS@g>K;-4pKeX~u*=);O|Pdfd-eEwb^Cx1k}l(W9Y*(W zmvz^IdJp0b`40K5mglM6yMEFB<6HHc_qPOR&pW#IHlAm$F}iB|Kj^SFKGLZ9bU=f1 z^-m96yJBqQ*@K_#|F{?T@uHyX+wpxzOOkJde&G3p*N*=7TgQ{9jGMmNIahbDZu7NY zT$$C^Fy^!5S?KFuV|4vz4XE_lYU7Mr**|X2oD(<q-m9-?zE|t)lH>p8A9&FIcRb_$ z%;-)XURCwOuS2`N|MRZrR%frOmtVbgjhan5mRs1po9X<Gm*2;8d@IWLkGq~XTP**5 z{fSLJbK);_>)qv#?~*SyTG{4}!6&?%es$#--s&;Bt$lQ}eyqLn-`)Gx&wjuA=^wqr zUmxOC-7h{opiRNyzy3}`f57N|%Ko#W=dnYv&sQElv2FJyojtEKUO2ht=5Jq1==aHk z#^Zj*^G9pScWaYPaXVIpFSF_=-Fj{DrKG$+>Rzv{@d;nn{IeZ1%XphG4`X!q)Gdu? zUmjHHg|Dk$T)g6)&fAoycXT-M-UmZIT99{P$em!0TgK=f23S5?Qr~0EsIU%|j!jYy z-yb{sL4KK6RJ}KL`(@(HGibkmGrFF)=C!KkcXq`GK^xy#S9fguhDoPJewBVW`NDxU z3tNs_cb(&+ULg5qU!Pa2&ywf98r8AE?a@icK5c)jb&Yyop84%OW-v{>Pu1bL*^KUs z&JhidkB@w~<M~5r$69>qUoUCN7kxJtOr3V;i@8^#>#xUrm(i)de7nM{u@!fEtgZ6# z`F{he9Z*hE_epKvt<jp}hw?t0q(nc2F;n67(wNh>=6x=I7k1*$V?h`H`J!{$o%OS` z=FZS*1{`aAu16=1dymomy>!&HlvOh~*3fM$XPiE_L-1W)IqwnUGKbCjZ2sWwuiWLh zTZ}Hpw_xKK-Gt8DzIeF!oe?iK=y3LzTOkc!KWrN8cVSU-`~$3S1W>;7&vsPYyZpv4 z$9&ezx#9P5@SqCsJZKWVV(pqPYhL&@)$2IEgJX1~jSri3nKr_(<Nn;qN3y1j+8KGx zxS{s7DQzY+@cX;WOI{cU8J%KD!Gmp^%MZ0x9<b>|8^gpiBPuWcuJzSL+Z$WWJN%zt zi*Jwc%&PDjw08Ece=GmcuV(qrFONL5_|nbSDxNe99ld?t7areEOW20~z{u!KinOx@ zt#>cKZhH4jt=|?8J$K#z<I&famj5*BW`5@{KOKbc-56b`SyOg?KJvthGOHIf^;p&G z^NxSjUAg7Tu_luz9sYFF$(J{CTtz$!;CajH`Qxb9bX!x;uRK4!dKcY4Rfjj6vhQx6 z%^^0^p(D*cz`7ZuYms{Fn`;~X?NAV|-yM2;*7lGS|L*@PD`VTau)8Uj?!u8Jw~Eni z{r2pJ<_D)4%lc(`y#4Fv(_cGt?ojy^>+gKpXJN;9Q{V4U9~^7}w8F>S*a~b^MB~d- ztD;4Irw%RC;K(GyJj|--t;a{+?E=$cP4MxXp+zttFrZ!Mz>szUfoX8ZYtd$;+48Wj zH6ZILz6;k2Ty?gf^jy6mqhw6Pugx`PlTM$B&1?8(I|CaaN+g*ZQ=WS%Gd1JmcC)FJ znObcb27S7n>C@G5F5VudffIHsmIf#6hu4Cm468K9=l*^5)?Bqgp|s^@=*?+Cfk8oO z_~aiS%;{|fX?-KoQp{$9H7#C=V7rij;LZWT!R_01P7|#uPh-K?(0ZfxKbngbd!$6m za;UcSN&!2=mz)-@NmC%7)swW;Tw|J53wBT-?JQE~=w)Po5{5$4$5!SXwI;ir47bwL zL>^kP&MK3|(+eD8=k_GqSVRM}?`vT%R^iSDeGR`E#Lm`X5l<o{s!69$*IKM4uOP58 zYVu1i4|X}`;%hM(Mx|H5dZQ7VwCEij;8Utk=&MSh*E6P};MP3Nf3)1gO0(QT&x%7Y z=zFgJsNAL^<Ssp{uojWa6E-UJrB<_ny1k(PsA6nIh+KM#$@#D3qW!PrlK)@H<-d}N zRcjk!%#pFLCp1>tH<pp3&nbmb8iN4ae_IN}33aVv7c;DMW|rt<&BHo`KscyQMsKCp zV$^O1P&&gtZNjGW7i5Hg!b-<zV=|O<jziUr4gNIsEqRTLGdyz+&G76cEFHz+U=g+v z#?IC;;Fn&l4|l6|M=noNJ%T16G4^|8mUxnasW{DbGF|Mxv=mEwt?g<p9i|##zjYfN zsD&NbcJ5E7PFShl>{9rr=0uxq!AoZ`V>6Yb^DR-ibudknbm8EsrNiktdXtU{TXLNV zCABjuVG(h*j8v==ag#g-v0W#28J}8lc<ME%^Gcx?gR!A&rKPNr3Pl58p>yk}=uU)3 zXSoUKQ*c8esTrt^dP6}8ODc4C;7A?6IuplKl^$1XMs`L<HXTdypIkf9=4*0FVNlMs z=?&1Tbaql&?IhD+R%gg5;YsSAH*SkIQ%0Fj#K&cFN25~-Sqes!nX502l|zgeIB>|_ zVxFjw#x!ibwMtf5pSpK)JWkqWDlNO9Qyc9}9Ril#qzF@YwZ&1pC6b$83dg#uO`EB; zw4tM3O4`jjI-gQla5kpVvy>IxSSgGof@D~!q5-AEtKkAWYmQdKPX|j$a}tKM*<7!2 z^n;~Q*Zkh0Qkw{3rH(p6EslLFg(*@N+k#zkR_=8JcNNkqFAYs%F5SkOo0DUfeH-$G zJsV6?eoTE5K0>ki!#kNB*?XcA6<9Jo<WGt$aYv4_TC5hiMb4)vuQel2IIy%7%PhVk zuxrrKmp_S!^sI#5)k24KXiIOx&Yw$I(jJF|Gs52!9wj9Geu+%Qe&DFPiIm<D2yZiZ zt6kEX;omhlO_fSibV)1Gs0}5xZT8w$T(2vwcT?zPGBZltPfI78kW7<Ppek`?7_l}f zF7XGKux5pBFxzG<jR_5_2)0MKbi_g(fSb9*j}FpWzzboECaZ+<p*P?U3$~ea%m#C2 zLCMEqu(V}i(w>on7ybrqrdmTxrH^Az-K+9VLMq~uG+y?xid9@$a2%7YDaki5;+G~m z^!KP>xi(RHeW3jt2{uVA@#7w93WuWOOam)lVWsl|8`U#3S8FM7tdTrPCAqz=$4h#Q zRF)Dq9Wrzi&e151DJ#TbvsQjRxa3Wc*8YdXVL~Yg#}9D$0;l9s3AUj%$vxXX$$Uuc zn{mFV*5Eu{d&;gr+7Hrutr8bk5RpE!u~{8ow3UK*OgbF(NME;=TAh??Z;g6(U8a7@ za<gSylh!uO@#g92I0@A;%w#I@l#0p34rUf-rzPr+Bon?2*+rkHXc%brFgp!wq@*nk zJvtqETMGRMK15<`CQh1ry2^x5nE#ageJgA9>_l*}CZAFsr`|*3#IZ!Sfz$HI1yIRb zx%kx|UXH;iY-*Z4mXNE^qJ;Mso$TC7SYQm-7OmVOZ|O~X(BkAjGAr#Y0t56WxvxW? zq(#HlhnUl)?XQFirlV`*CY4Vjlu-A4H)F5)r))f|F~cfL&Iiv32H~rRQh7Q+Cqu2J z6xOrtwODF%SiKRi<VvnG$AgtiWtPy&44Mo~0qpXXkQ=7QrMB*>v*oC<&4HQ#&iTOQ zgR2}D=Qjj<X7?eC?Grdo>3|UO<(hklI6C>6Vtu)eb{w5V#N&F}alP%h!FF7R9d{j} z$}ErDLdchU(Nn~Q2_avuza5um$8A8U3QN012>Ej75yCb*$b4A{`Em~t!WKB-JhA(Q zLcZK2g!r`6gpe<{!;af!$6c`FuGn$+?6?PZT=_C0ze+;Lm#bsPHL&Aa+Hq~{xXyOm zi*{VB9T#uM4Y1<|*>N^IF5iwDUyj4EZdBgMLdci<#g02;$6dAKZrX7^-eTH{LdcgJ zj1bHL{4#`)FL%j~yJpAzYsWpZ<DP>-@o8%dAz#jh5Vp&KU%n9X<qp|#N9?%scHCt< zF0?$`E{(L2Ldch!Z^tdN<2KlFTkJT6FV6H}`T7eXUv^k7j~j2tZG;JjGrA9jkS_=2 zayqU?jj`p-H6Q#~FKSNx>vjC6_83U`lKXxTmO0>fBb~c>BeY-4xXYoBup<*E;Z2G3 zSHz4P;jiFqb;CYZ02O>BW?G!T!Vw>MseH`dNPpV7#KlZQfD*N!L@hYmi-c*xQp8O0 z;cuo>8wKka*ZbNo@m2ZzabJe2b|0|+Vy49T`;d%^m}x1<4btEb@_m$4HD=tG3Mnlm zikXt)UsXsn=JE{6din_e&`)su2KO-$+*%Ve?KS_U6ftf)gIsRIxannq;69B-zwk*5 zgwE6LxP2`yoJFg%7Z?R^F&YtoI5Pm71B1T~!$Ipvh-)<QU4?){S)rtt&_}u5V|Xnv zt})Z*Ffu7l%pa%Z(~0f&{5>vcDF5jx{{5-sLOo5`ncGa7T8`s|<LHQD#*Faq|LD=9 zQLk2)(qGttxJz|Nxc*$OpHtL3l#I#=Ay_#HvT`CqFb9db#1NAhS0;mq$+YqQOOXU( z_h*&Q-|h{q2qeowK>@Ii3f}oCnKqR$Mo^wuMN>SSusn~Lah*6D%tyGhTUd(=<f=hh z968O1>82&YA_W%HVgiM_5ln;fb!3*?z=^4(GA~$=Bh-~aWf7C092wI>eOm9L0Ew`a zBE5V`uL=aYxao2Jw#aEaW2PN`(rP`2<S>65vG&?GZ5LV}vfxEUo}F=9Wr7uTE+PfV z(EwS)6zfhbov7$(<w1caC@O?EW#Alo-W$q<|CrTP_RexK(^%6U*UiIYL`A8Bf_K6~ zkIB+0#2g|atX%D|v|k4Aykrz9W2Q;Ove%QnG1$rWl4k97us77l`IecT*v{Yuf%~Kn z2w1I;+t(*%+TECG2V$nPeo!!ly)k3Hqz=TXi;;9M)F){o{X4}?+ezId^@Y=X1pAfg znW*zQa3Bu-nIaOkR@<2ql6L~O6LAcUo3<|wh?vJ<EA8(f5GCtWR5EFQ$|R1dDmFQ~ z-5Xk!R~v5ZDr6CaMwjW@<GS%fx6G@;UR96Hmud{h@?iXHfxpyam*F({OY@5|oE3j* zbT32a|Fbc@3|AiY7{ze45uz$CLmozOS}cY12t~6HyntX7C)`Mcda@8ad<eKH2*ofQ zc?jXTY(U75;kF?Z%R)O5;<<c_P%nmqZy*7838CH$NApact{ghTIEJf$5RdDK5DvwG zEWHtmXQ3o}>@0+EL=a+EAyl1(zCs8`b^!MSLJ2H%0wJE?1%whA?y4Q<i&2BuS}TN- zSZrH__!J!wBI7T^b+zMYj*4TTfSZL-G7HVK$G(S<lHur_OP<T`2+?e&40j75UefO9 z8^Rf`H$o{al!OqULT8VigitDrea#-b2_c%PmEm?E#Php>P+x}QFhKJ)Qx&213|9jo z1q;!smAt*IMu-}58SYnvaJUpgWijK#7JY;UA;jn5fvPEI@yzk?_2hhm%H?>p_Ts8} zRO2e-;0#tceyJSfo8wX2ldB!{T#iQ-Pp(Q(1qZE=1}vH1D1!8B!UOh~eCLS27sLQy zge2Tb5{{IF$zsG`Qv|#qIZmo%A!;L(&WmZopM}WU`4H&<8}1QHHq@MjsLk*p1wtJd zj;P5#yjV-)LnI{*6aX#|e<_t0ygi8_is`~|-SC%m=*5NFLy-s(-ix&(vQ;l;_k4)# zuRFt$MUc&SG5=_MC=K_a49C2qAVhB*1&>O&bNp-wmT}xN9;A=|*3Z)=BkHAsad|Mk z1+ma7{3We<JjG1C@VA;^=s5YB`NinMDd2O;kfDI1422n<u@r-wS)1dr!v1^mCxxfZ z-=f93o;FXbpc+(|bqab3Aqr$av748hkJDQfHnUlguFtfK>`FIWYcaPmXib^6ES5$j zbfwd%O-u>ce^3;iR9}OQAa3p?Ws&+F%(iqkSMV>b1wmZo;1ukwv0_*jD?8b6bG%e^ z$waOmsrIxPOkIi=%}}N31vag<rNWx4p%=QkT!Wzid6ss4iiXk{0Ss7@AN6A%+}DBi zyh8Gt8GKrQ)AOZEFa7-d7pL`UW2$@^(V$D}@k#mu-|}%EjTzc_)N4_-2UPr_TGch# z>#w|SUa{`Iz%plM1T+a=pPF-L*_aB$MJQ$vO1oJC^clCtmhpJ>i1i~nt=bk47&ybj zW3+(DGaCYo8634Z9wYU4Nz!_GP%q{D6MR_GK*dsed62hD8ZR9`frdIF^g_hP;D{7L z0TLgV)Zch{ke5s9!SbrCHaW;0eUSqB!5&hwEaqW+JYncZ>pt`=gOQ5IP~W-K2}3>a zcTSkDxD$VTDw-#VKOUnNZvlBsjvHpI8)lXpX1N<?vm0ig8|IW7=B5)ybQTtfQJBh3 zy2d;JRhMJOfQC6K+G)oSO-;~Tcfte$6N(ye@PYR^;U{V}%?$&Oa1t8-xC9#d*pKS1 z90v?_-rQ1LJcjP_k!k^M9hiy0Y_(&MDu`wue0>ogsi#wj4Qq)cM)*yOn9++5(cd|O zJdB2u`aMO_kZLgg(x^RP(6<)>gdhCAu^*#hq0fP#QIF?Cs2_o;2*}d}NIa!_1MB6n zf&St;R^gjA0K)IGz?so7Tv?bAadu!D0;6!kbOL6n6D9?is=zqp$p(f>;*fa^F!h~i zXrAluL_;eNgmLg87lwgOG<$)e*5aV~2^gArIPy9N42{4J8Xpus#)+mSFqFzc6AKJ= z3JyM5q%z^>$w~dnl8(GQ$g?c{Y6Nz*@gaX@&-NWVbR?0P9=$jL6O`nN2_Ec<2^sB* z>F}K^rsJ<Jm`;J@JCVsF<kcyNT8k4Vq`xbs<7ih*rx`Ao&Vd_TG3|D`VuF8l#e`gU z#dN?V+DV?yom#kJI@9wHFSFDyFBVgwXTpQ2@Dr5I(OLEMV>F!9OD_%2g{693NX2Nl z0Ey3DdP4E?=ua%2e#?;pJ$pO`V!ZaDpu~SI?xbE?ajRszYS~N&P9XHg990Bn0yb?l zCIw*vrl;0Mw@S>FqVfe?GNucJ6cdrJI>DhC&n5=n0x(BG0tMYCYh5wqsKt>BoCMPZ zf=C5qygH{ZJOn4|BzdKh8$36xLu{nU!9*sELwAj`FdvBs7UE7%CWiI#s^pXiRYaCn zldZI2S6g4T#mX^UEDjY4$G1BCoiZ!ehRuQ|i6dD5pbo+v`GfNh>d5)$vMnI~&XwWM zJW0DE9i-Bla?nb#&h_UH577zOzJj&xLL%D9M4({g97-l88t=Zek>u=JBEQsL96~u^ zg%UuqyzT`u$Gw9<tR4r69pfNk)#0GvZynKv)T<*wVFZP<aLLh?0gFa)oE)Y(*@nGS zU|7*c?2W!{a7Vb+cKnL<t=>5#gm=46zSZk9-|E(}@R1?3eCb@1P=UDU-Ivo(#<zM5 zW}C}FcR8J>q?u=7zSZw)owx~fPOi|oCK!k_bR0L)$kQSSx}=@b`6<Oz!!R~>C}tRW zJe>kSK|a_e^H_?ZKJI(WPfrVTRO(d~RYB+CBYq$77eKQy9|8PmObo3GAMq~yqJX~w znxF!r;%A|9{B9#I8Z=#oGcq=}lH=D7(dnR>EzlJvAI&`%gQnn>qWO_JmVu_$2%gRp zKu*5rkWp*U^cd;F&&7v5jYOFO4NpmWara?Qb1^gMUJ+<%&|!2k{N8#@e#=0&_A&VF ze@uQyL3jEw_&s<`eq~?9dMPgY6;|HCh-)j*5FPzOId}cd0R9coH5$c8*sPGzNoKYb zvlG{((OAzNg8+WiMA1G%1JbQlh7kUABExt2jiz>l9^OATexMjd^=k&NVFEvx1?nv{ z)ZWnughV$6G*evZB=ZR({T0`2frjqc4^t2HRBa=pqQl^IEG{;@OB4Kwh);=Z;*3p< zi%bZMk5V>KP`Pg4nu$xvdH4~ZCtnSqb1BmDJA|Y~YSVM+bVhzJ7|>YQ>*mJ|riYs9 zSSq|VmX=?6=r|LwMRH3;B2Gy(>W9;^2F?S_!F<I+vXE>!xH`G`wyy>p^&M4l`PIW8 z{)f?&cR{Dr+Ej5^HZtJZfP9TOexzaH2mkiuO_-v2_wELkg1pqy6K9}E2T1uT@Q3Wr zU%)T%<VKSWZvzsKrGO-F2Ch&Sc}dTn!d0yhc_XnKKiBYha*Hyy08jBpd60~hPkjNo z0y5G4N<lUY!bRz_x|3{7i{?xfKV7sGqs!+6U6yT0j=1>^n-)lu2&=k@e2dfP2au8U zxfYQ0xlWL|IDJ0nCbM0Wk1hM->T@$>B7Nfdk=1n?!mj$H=LVvoXWc4JvhlWwNxCY+ zjAJZ|(WfYrRBy!F)ef(6yiC^sDbMSGWQWwnb#$@APQVe5AY4@ok&R}iOf+f6&dsJO zsyY-b=;<`kL!Xh4hUn*~uw#tse7@qT-eYiyKgyrvr+V%tApeHEB-33$MA2MnG}-Tc zKoa30AjyjbJytI2R6Dqoi_($KtKwQ;3xD{Zy+4T5Th-}!1}eHYczjze=fUgT8<6tE zvoe!y0K)BykZqHUY*D7i7VWXxQ58Y9s)B5Of^1(xwm=uzRsh!)*W0+RQ9<}0^d>%* zlEy+sJfOQFBmv9!pE{!rtCD_x)GLvP*F+CI9@gNz&;js2ics;vs$4}suBCwI$lW2{ zn&BI|&VKavj(!h7P50t3_Xzi5o9NGzu)kCWvMC?HH~~KawnF8a0@xXFDj@Nl4oCvb z0;H+nY`{r?ZvxH$oCip4=L=i`F1lI|9PwO@YpT6S^f;EJHo@uU|DLA!es?hB6@OF) z(iOEgT9cw5>YnN9T|m;+azN76N<h-p2Y{rjwSc6n4S=MpO@IpkHv^K+Uc=?8vloD? zjH?x{^;PkQ|53YS3))4uM{#uKyBYQp1aHp${Az;>k2Bz-cZN~`B^V*Cb%=Hn!{^8T zk}R%$&vwX8^6dev3Ah)qA>ckhm>ahrkYqmqNM%g)p!ae;9kmaf1sxCdX9mCn(5>*p zV<(#isq|QeV8$_6i~=NM6@Hk8)D(J8p#-)dKB-gN2?Bd60)CZ29tg;j4`ufxEr0La z<OV@v^rZBoWYhuksxz_sZuWaUN9vBW-}93p!o}EeIt*JGtgjEX<M1BMNlu#8_durj zRY&3^Kwd7JIWv=0O*z)oskyTb_a-Q49Z~#|KB=ClL~#PX1^O`3aZA7|fI)x?!1jQo z6nwiox&t7-+-0`g9T07r1Q|Ua&<OYrAimZZy$#R|_zmDtz#jqet<~t0fHpwVRvsYw zPi`2X0&qAW6>0=v3g9R}`aWw6;4DCV@iCfK;l}~K2{-|86W}DkPXQ+b(w9L~0e1mT z2RsD$I^YSw8Gsi6X9E5W2%e)K0nP=i1bxf{d=78{Ao(j@2p9>t2rwFO3E%+0Wq>aO zE(augTmeXSt3iYJM~_>+C2rWyWmQC_Wus6AzB(?7DuW+KGw_<eqMwgDGro?ki1zj) zkH=+3TlGV%XzuU>o)}54<dwZ*m1qrOv_g@dDUD7_j*uj7pQ%rm#)ilCY|km|iLEB} zFlltZumoi)Jd8KAQ>e4dL!=bF5@W)`xz>ok3-j`jx;9UUf~WVe6nLFZOh`#ijDyHw z;cz4zBoKQRNgN;6Ulk6|!~J3-Q)0L_LYgu~rioNWB&kxudSX=O<?$|(yl+@sY@~{J zVBZQU$fu=K30$4C3k7H|&^i^sm6rUBM~1;Kag?fWVq9u`6xUfu=2QmPWYLMq5mBnt zgxD0geUFGzDphdV&4md`eWc|nJ}KO?D-%&$5n)N_i@cdraWqNhQ(SE-z-Kr-PAA~- zl>(bYSMsw_-@tw@W{r<?yqRlyFD}VEOlwKSAx!b=e7!N($jpp<wtI3BiOHfLbya*= zFS-jtH}B1SW_uRrHCqMu%~8p5VG&W0Xk*^Y)4GSOuXR;IVsd;~9NHL9<t0xQo4~3X zt%P^m?&QGU?zf%%R8vn5g~gg|!9nQGc|X<``cwj5%gLMcGL%nndQJ|p$>@6}hN}|8 zdqqXyeS@pX^Ts9hfX#e+lZW@F$cnilw|o0`@K#0OrJRqSnKC1v-Q<xyHA&SoIWaW} zuMgqu9rcsM+*p&4jlpUdHd$LBB>5Pp`+kYZk*oyd16_21P70u>NwSGttIcdw#Yvv% znj@ClfTTcfHWnAwQ;F`thuMHCRS6&CVG${@ePdGwsFL8F9o<qCldu{|$lQICgd}gC zT4m5%c?lJeka>G2ozjAV;8$Hz2T`=KpB0Cu0E`pmI|c$e)t|(VIWcq8puPT>mf;<o zqDkw@*nv^16nv!R<45M2tj#gt)GKR**%FgsNys&7aS{}scrg>QvZ6FWnn<Qk;y`0B z+`ubSl9@eONxf3P>ahvb^q~b-G|~d^yW9_Hi4$o1MkOm_6BF=R7jKW!<aTppHiEoF zcl0()6MR?`M(yzrzV;F_=}^MDpvV&hQpUz7#i8>>{}CP*(VL~tMgB;g>acGGFyZhn z4+CT3WV;qeP%q1h3^Y!#ezHRHM$bE=r#dFhV@hc<!wM;ODDL|)8>Kr1(XuKhTB_0* zm<yKGFsbojLmLE(!d9{jELo|T@~VSKaO_TYL52*)r}iV&6HC%2t6OFzls%OMAFcWL z)dQ`QV|SeOt5)#`a<QV2&4C%?^*j>XM1sgzWl~(&01Q{ru^3n3);=y4-8ULiR5C_d zzED&QmWmo$Ah<-wVoamD9*U?qK90m??OSw2PY5HjAWKOiAzJ~FMM6fTDpL~URmuU% zl&E-BRNtrs)NXQY&z@*myd>yXd9#<AiHp@!O~hcpfhg21b!^0E<<xP&6kwKd4vP@m zgV4Q^NIH`7F+?Ku)0~|*ZK~1gq!^*L*gay!(o;sHDwW<$&!wcf97HqQpf0Hm#i_7A zShV#VGu!ZOg|BSToyRjirf%^4Q@n4s-i)qz-)svRUGct{&NI5=eYj!X4Ec)p&4&3c z=!*Bvc7)Lt?{lpY=A@6~o6^YWiubv;i_sPDbFGpW<=e~4r%rl)m3o&>lxh3PmUY(# z=o&sSx4XLi`g?h8*0izVu`-#_E%UkUduC#T&pUMWx7J#@u(qQ1#UU>bSyAucy~GDm zeLDY*XJbZJybre<jPCoR_h#QZ8P}xA+k@|W)g5z3)9U91!OfCWDu-O2aIya)EKWq1 zA^D2;^)`di74PfqIHMb|uu|TlGV6D5UpM{x?}k--uzH1l`q0+n#`O&uy0C3;+fF>M zm!*7*_w_c4(G~B@>L8;_I+$@K@#v_pQvC0pd9>w=k3MU-uKQc7KkJzp`Fq`%vpvvg zo1pnAyo&c7m(A#k_Z{~UqbuGwR#|V#w@0H_ul{o+XV#?HeG6JC<{a34YjVqt$9B#8 z>yT~S#Um}^@SM-++D_5G+hujT&6PLYA3v>Y-$(n*OI}%&*Cq1Ts1073+h3c8=P^cC zywAGd7+uYg7lK-Sf9jtuZ?^lc*^V#od+p!Xe%Z-3IbR<LG?hQ!tsUMs`H+0Y`?j0G z=ngK;81PM}tlHe6m*?kn(<$R@tGwRVw*G#5>k#jsqpn0_Ett_2?*lI!&xZ=HhO6H> z+sb@%{@Q{v>WX`-w)kfCMoZ@f{T8kEtyZaC-OCsS*D^Xqh1f5y9m(FiI$-fXUB{2u zQ*Ben(|7i^Z1DDs2A#L8_#*)8u)f5vcwc!sMpwMAye*8bc%OCm8C{LM2U{v{YIgcg z$dr@+AA9cs7S-{EjbA_k*9P|Pim2G>f(=kWP?~@pT`9Y;Qe_te>#EpGu*KdrVv99) zjXhSZNvyFe_HHz`?>%$x-Yt?}{>moL_kW)6>hhj@?wNMxOt~|2XPW=o%;%S#_RsIu zxxF%~$*_*;m8Q=_dBeP&)WU33;$QD8bxt<VkEwgTnoWJHYgNWdFU%e>W1F<r%QYo1 z5HO3${qxy&x0&2OpKaHq6ovcGXWI>Ca{qj`-BBj@&u80}D^214^O<#VOs;xChN^M% zYF!)u)O7KcCL20lcbK!T`l#`j7ftrad(w{9N9|;C;q&wRAN>CJK{lO6jY*PU`0Z}Z zfsdOm=oGiltiqI!T~pCa*23VL)WW_?pKDuQq)l(|Y}uOJ$IJc*I6M7f*H)GXwtQ&( zx#!+n*EueS$(?voGxkQ-rYoN-)f+yzk(J&1jo&M~o;!XgqV|*H{XX_YBlv*HDIYyA z<}%uD>+{>4O3(J6b9u(W<coJkeb@U)gL!RVZl7KUO*;mOq!!HwxRtxK?_lSs^2evB zmK+Jca3p7a{*~?(PQ9FwsBUC~9^V!wH_>f=)6e6ABU9VvpZzpF_S&)$ojxBv@=L9g z-#vNOZ0L{h&kSk78J4qZ{aP<~=gGlqhveK_-KxX3DlN)KdyERc{zRj4e%E_7=J1)^ ztSyZWy>B<=`x;drz23L+uFvKc?}|wypD$0@{jv1J{*M;pt4=1@d~5mIQ|{d2R$P4X zJYdVG?3Dw0TON46r+)6_^5YM`dw&RFqSqp|;Kts}zB#!={~;|(^b23=aM*J4t7<OW z-fBYp+tzBBV}|+c(M+y(-Av~iWh3?`9V@>ya(UI8V@eL*aQFI)y8GLCmYh=IY5>-c zFuAi=?pLk7`>fl_(0%I?&&1l!-*xT5wV%ok7}PXlLzBhyPSqJ@U1~A^-o8q6xe+B) zUi+3EGm|U(oNZ9X`uZyWnB2#)5u;q1W6qPwxw_n|Wk2m^l>_Beed~C2=<M#a*7ukF zAIjEfJhoj(;_!<c_ngW7adTLMa@+4USux%_z*QAtaVGI{og=GSUR|@|@-aJwAKvu5 z(215>)YyD_V4cYaTW7m%cG?i_|DkM~hUZ(Infkn8kK#3B4o>QZ@iQj(OG(SnDrN!E z6?=#8{4`bd`0SPXiz;6GJ!;1EmdCUGUZ9=6z~n-1SK4?s#P8Ihb5VCT1-NYK<oa=r z=ZwLM-@BA}b8g$abbNJEfx?~sv{#kN=a0P!+qrAlh5lnyGk$%MSpLMMm*F!CtlsyX zjdnr7<i5L-u92>ZnAQHt$^Gqp+%pC>>LY2=Yu&~wC6yg*8Wx9+PcS)uhhFlujP5;_ zSL(dVcR;^C?geD#u1y#@f2jO^PPgd?7U0X9iWF|WmY3d?eQMpmVxXC$BJjbqjyLwy zI(c%{%)8q^*S`IsHOhD*lS}AYx^1)cE&CH*)?N3x$MD1Q_cih?v-et+U8=Bbnc#I2 z-yt)(-KkHfx((^*n5l^9y?(x@qUy6FBd6ypkFIY1TzPe*syE6d2D_yeJ?3XMn{S^c zOaF1$+-H>r%{1H6W#szS<Hikl4R)>8iq2kEF}Z&}!~7_d`_L$$e8_Lbk8X(xth*^| z;P&sW+SZkxOFZZPSBZ&JH=K;YdKvVMr54Ghm(_k~IW51&hJ9{RRe_@)w4Al>*!bCp z-8<Af^X|>hSsa(a<j&qOue{c-OM|EKmiarzHnnM6KC^mww~LE5M$X7>-LTS69Cv`p z#U8Gk*WkJN&z;TYEPk`qckTI+Cl!zFv&`?e>b<Mqz-zF*O6c23EiPU@-@a4tHwCTF zWtsmpq4J~EtJ}Q3-o|0diG{rm@2Fny62|bET)VM1yN=E*>-xIE++oFcRNq%U>&lMA z?AyCsl6U)mOe~4XkR43!MNY={UvthLX}rj-+U>b+HxxC0R24)I8rAZ6-l#>Ip3xZp ztV-dIKXv_=r7eSd-mK@<KmJ|gGU<~ZjDG7pF8}_oBM<hf+$#lN5-_>m(WkelLY|Fm z;%FJb6`Zc_RqpJ3`y(56TWxxDYipxvj#xLv<nkX@N~mi;YxkD=%W4n*@zm(*xvxgA zv~rnyeubua{`hO#upX-#h5N3NV$g|;6GpvBS+~U5_eGZ1kCVPTXQgWUY3HJPXD=*x zhjDi%_bI>MxJ^A=y^>zOacn!|Ws~!lmN#(q&#zo**J`C(@s9{|9g~~d=-A?(4}NgH zdD!>q1FxJ?R`S(8OG_xC?>~Oyv&3q5E1Z4H<VIZcj{1GY!KoXqXW0j)=bl`0qg=zY zw+BBOm2vR#;lrOH<6E8Lx4d+j*Qf3$$9D92GH0fGUWNYhxALTGk9)svwLfV5Wm>l} zg~_F@wXM&!id47Wc4ofg-AP-neCTxT=eiaZ+}t-P?(V2P4eO1VTuAU1C-e4mKkPm8 zxv{+N*eN@<N;X9NmG!;lwO=0GGoLzw<C@l>a2LeKr|kW6+Gua{K38(D_Gs5Ob;0rG z+x)7o?P2e=Z-p1+#xS|n3m>e?X+0$G%#b5x`V1a9Y|xE{zP~*0ZfTS7WJxRQ&u=;I z43ism_I%Jj>EyR}<KMR0*=ymRPwUH0-IzXo{EZ9Krk5E1<5P~SQ<K8|<^AZDzbZ#> z>bcW)#r4-iTg+cLqW`Y9y?mzjYCQN)yAhap%4BknKfhH3&)+yA{AKDury)JM99v_4 z;DG1NOusb;rgzPb-OX|NOzupX)S7wE>YnO)=)#}J{<J9=+@YTDhOPmNYc*+8qw|?c z>+v-x{6zaZ$gh6;%!LDN<19KvUmiT<aqZfv{qFo!DJDPc=APD1QIE$mxtOEt63*rR zaP-XPS6A2EThjf?!*$D35A^hTW#yh|f2RA7nEPXL7rV5|+|#Dsq(Pcjo{uX0ap%vS z9j>;??zis5t*mNRPK(gad}4Cjw=92Lclf=Y{#(kgZ2H}R@KZkpmUatVeres@&N;o} zYV5+;9p3z<7V;CPm7iSQs;+osIqSr_o~agNpRcP@a>m>d{c{`7YQ26o=4qMS%$ilL z{5_Amm+!RMD)V^r;e#WNpYE-m5bpn7x2n!NPXuz@4JNmHxz(A_X5Qv)T!Xf^KYnri zi{yf3!&;S<tx*O`>-Dep9CLV53b*mh-*eR`OII#YwQki8=OflN@37-V@!(i9jrFnT z3zybxig{rs_nrD?<hZ`mmyQilW_+~Y6zJjK*<1c<NPWe%h?5Wewmm?*%H*;W?dof0 z=30%**<LlW>F|m7d~(m)mb6_sZU2e`V;lFrgLMn&OQ1e@HhfH@(iT0MJRS0G=HX30 zKE8L){Q1VQmkxBl^K|)<ryDVU#N?_R3ollw+mw;J+~-Lqcj-~#a#Y3ut6tN3RQ5W& z%dbb5zBmJ!$yKekt*x`9&&+b40-U>jI(8#y{l4zYIuD8|>veU*s+1Qfm!5VM?u+YF za%!~w)V#{Ddlrjc$DFtud2GbpiLUOm)~6gEHg}OH+EpfZIAqeh)Z)Yb*i}ruJ2UD@ z%Ns*(b!=Sw=$V;4RCQjQx!nQZg)q5@g3xVqH$IK%o>Jk^z8iaMN9Oy_`&4zx)1DD; z5)<nrf5v-WT?)77rDZ#Y?p*z{;+vBrRm;}o{2<-4piv34?<dbl{PVYl?U!;~KPFeo z+TUwe&$@Y|n{`tzXzqBm!pSz9mzA)%{b8kNqi)li!v3~0x#>+yY90=$l5*eeLxE+` z$&(LS25y>r!s2zf_0|JJ9cE@@#*@iC4@#al_OALvP_#{J=R;|cTgz=+vtr7VMll6_ zd}N+0V51@S6hFtvGMjp@%Kl~f@ma;EJ6;PYGy12%t+UKKI84f0qN#QjW$k+==ltnP zzb(zZcZW~#nkVyFG<(2juSYM&9f&`%Z*b0Ejbd+c+)XC;M`CvK+`L+E?~d>6;a#hH z{vhRnHhGhCIwhG^7<%S-w@|FZs7K*8IWTT<^>J}m<}P0G;aR5VkD;e$zKLwnWy+re z{!ICP*IvB44PtWY9^pMp{Lrw|1p9^8Tn}~YJEY8nGHqVRF1{GKd;EiXm#1KP9h2*E zD`%wN)JymC9-bXDfAP6Z!}A)hwX}ZbKVwE<-TF&vTt~ZKpTb=qUhK{A;F^O5uV}cr zrq9&Vw+GlgkJ-E7oZY+WKYt&#E*9SxF*(cQt6PSZxBPgqaz8GwZLjUkmi<1u^+!c) z7qwf1Q?nl*#+qLyx47ib{_&euUGk75YOam)TDbd4>%&uyb@Q0pD!#|_s&~*Qso#LY zU2%hpX)n#YUd|);5I5nt-SB-4TCd3Owc+f{cVj;8$zH^9Lz!H$;%*z}^sOHvyF0V? z;0>*Rw%=2E^^;ZOPu95|+Iz?+ve9EqE<5>j&#6DH&aNG-dAa$_i%A2<SBtVu3hlD= zoy*$o4Ff*mTOssir4}nsS?|fQTKv6@kNvM}Z#qtvhIBYrukp!7XG@o@(;}x$4EpU% zZrBfvR_48Vwc+lh)QsO>tq*Qoy?UoDhsK-TY4yvC{t4#e(Z6DHfg2oVZEk!j;?CRm z8Fw#N>+SV^;6l%kuxl=zua5}sIH4Whf6<qfT2u;N88_9u^8v47b4Jft-ty-|e~kKN zg~zJkY4sK;W%Vba&gjGB3U0+EUfWoA%lE@O_J21vtD5JC8Pk>iQ#Q<P8`FI5+;@1d zSjpu2?Z|wv^HI#uOP80gZs-`ip!utZ^B2oM;-vVfQMJ8$nsIEQh1BA3nes!2y&W~; z&t_qt)VZPERAEi+7G~8A$!oc@{@6DKC`SQ}D1P()yno~9Pf>&2YK{5abJnexEuSxU zuHjN*^}JV!G3zhoBOSAu+~>JZCg0h*YWRac=hRwVX4-DYOtXR^tu!mV>}Q3{n^7Yg zcF*Kye;oeK-zV&~GWNjEb*pB)Yc+DPU5$1v?%tZ6*N1zs5cNxo#uV<*vRjK!vJa~< zvvrkRb!M@O4=(xy_%&a3yx|4gA!D*5Mxp&>at(4ra!Yuq=apM_=AO^GU*oEd@3y3a z{l2T`lFm8W*<XY0onvx4N2k8OJoCWKW<U8~u6)?v^OZ}B8Z$oRd5(3gQFBF>^K^WX z-h{#(xvcM`s4E9r_^iMBOT&+g9-i`V*m2VzJ8CvucI$J!cOP4DTmq9zIGZzx`_aXr z`9}HJvcnZGe!9~4<iPru<@RCAHwXJZLH~XWlN+q;Sr9Vu+>IM8E?-IBcxdko#k*<^ z*6x2iwQJJwJ>gSPZ%ELFNG<;PO!;n1?x<Cx^{FqX*B|yFDn{0{&5}w@_m#VQW$2<0 z`GKXnjy>`a^Z88fU3A0bTYY+$ZgRBzgZaysc<zk2w%h&E4{Q2uos)UL-)k4F`(bh$ z*9}MvZSXwl?yPFIZb`eU#7-EUJ9O}>6SYch%uihzit^^yjN<ptXU|V#aut7eu6cgM zGF5ub!QrxURpkzsuaxZi^Xs)!ejC^%^Blb|JY;eWmK@*rgU5!tllv=5J(?A=GyeS5 z@|(WvzI4pTu#rE%o>BtsAo?6qi)qhhR_?r@!l7X;YQEBhUD)Avp>f6P2XEdefJNI` zU8#z30VcQKvwf|LIliBE*Uyi-;IPBKdf0;fT{mQppYVGBjK}^p)^XfDCReQc?CPp! zx$`V~ekxmO@q?x}4ourTrSl(3>mbLps(}GF@SOnq&{B(=iRUV+ERNnkeQrtnNfl}@ zjM!@4bl_fF^J#5bzo?z~emmM<CMP?%u;kFdQhUwTmfcqH-m%<?h%wQfySTNkz4~H) z=1*fHIPN8i++)ZJi>AMMx5R&a*Xbf|)<<(LMcrT$`z4xi3u|##^8X8Wp8lJCqKlRX z+RfF9xUH?Iw|{$g=x<7`+L`SXVVXTAvCk*A)5hlr*zMRPXFk#f#RmIUe^VN@hXIJu z;|Vd%-&TqI-@6&Mn9fvu<5A=-VGXvajfLO3-LQ+48w#~4w>K5jY^vjwVZ#5~hTTQf zo4EBV|KZTLnJ+s_1<KOj61E6F3CH6Uu}uAsJ;_bCt+aStM^PjDzji)1U368^x*dRv zo<Xt!hC8e4d^BB*Q5It}(sAx@Y<A(1H(gMfXlE2A=qLS$Tf6Ht{xzG0i+f+2!e~uX zN9ym_Z_2}bjrP#~W_|G+j~7*6?4;BG|7?i<&D#2R_AqD5v{Isz&?o%cgVRh`8(_cs ze%O!d%MQEgg236iNYlT4^1*=rB$Sl@Box*E2<2;PK%pP1&P>hF9mA?KchhCD+C&jH zI5v=uL&5>A|Eg`K{f~&7PCfGfB$TZGB$O`#DPqqYNA<;Hd2%7S{56)2wqDyGp>uxp zk1f&J``36V6dmD|8K)vf&(Js5BKn5JDwHwubkm%2mmHf_^!T9Tkb%!u3h~Hvr6}68 zrYE+u(HZL01l$!8`LD4U{zXicX@YaU@HU`IO(HAS9owQaW7BDL;J>6%g_?HT5cOH4 z8bZt_?T#JVu1b-7RbZns9I34{*dqBR#*y~+q-{Zr4=68^@9f;jqSt7~ZR@{sbTIo6 zPRw|n&3<J;O2PIHacRml6IA3Vmh2N}6Dja--`Y%9D$(tUPS-VvMY0`XjE@X79%gBx zBc%qU4sdscLiG>3DpEAX0z?PTrAEi;%H=nk5RHQ;>FS_w_6J`%$%V7MifGr`PC#l} z8nys5jb|zpxFlt~3C=KsPw0l3GE)WH<G&Cyt`WaEKa{CPar|bV6sW1;mm)nCJ3#7Q zflXz|=nk1^*k4d&a&&A{RYqD`YPt!!DmW`!nW7+F7SRw{XOt;Y^r%Q0RHzLrsUmvD zp9wBT?VF7SBeO}-nWkxvP&Hwb&!W~%+Ui7=K-EcM9mTI{bOqlKH7XL($;zbcLX>8@ zMlK0Esi{q*0z{frfDLN@HsW8S3SpYZpnvpjb|WZN6_*$nmzb&7+x#}~40>??!PuZY zD>kjjRgJ-rw>&vEEn8O9Y-f64pG6m9qF<HM$x#_<Ws<2H6xd<9T-R~?woDdmCO$)H zih0K5D2%=qRZIF=h_RLQSQ8u!jGcK^MV@Cz+oO9`7E@Wo7K3f!q%+a4@$HKfMEE@> zW4~d$N}K?jlo2P7qTPY1L5$MtBF9E2=>{3TCVpRd%3dvzU{QBEn>AfkFHRoI_&#PK zfqhk>C3D0(k}}m49to51G8$|)t&hw@oa005dx{uSUE^$mr3cAT^meU6i)n)1j1V*a zg!Q6FPTOFn$zyq2(Un7;WqysZeCZ)G!q_4=YspcVnxI!zdAdpZ(EL`UMfa+Z1Y<ii zxuS>`$PaE7y$d5mFD_jPzf_dXMUNPKN>`=pYQ&;hN?fMQq_Jc5c2a6=qCBqXxr=O2 zCd*~9$*FOsSn7%nOMILOUI2BCuuBoMQ?QRjb+QTH0`;2CI8(ioD=;Qh^n=ia<RTwf zuR~N`5gYaRr0g^k^wIct=fc+D7BPNEtVyaQ-2#jxd3<ziwy8Su{JWKYaV=tk(eX-` z7uF9qT`vnpUicD=uW2q(zohY}rtqpY%?u+H**`;`o?X}&g{c+b*i4y1i~n%p6H3k+ zKT9siR*7$5kAR+pUrE|2l~EE-itmwlp1nXx*cn)pnH+Y~<cN}R2L-AmcSPjTUYFl7 zIXdHqC<&J)^3)>l2&h~pcS4{fTm=g)uZloPxHwSwOb+p*vzLgHaCstcjmYDQvAuyI zS4^NJT!P3;5_uOu;j?4NT@fe=SEIO=Clx515f2KVA3-ilpd{Qjk+)0a*;rz)PbODE zpd_41<P8vcBS1Z7a-#)G!c7<DW{GmkL|&fA+a>b$ioDiV{5hi~Id6fIaPvjpVv)B7 z)Dsr&dV!K~dqlbYqFlbnJ1g=EMBXEjmj>gR$^26bl!Uu2@(M&=B)%1z#pJpRl!RL+ z@-~UQyCUy_$m=H2y6q)U5^kc%%N2RAN@DM87RFnFl5o{Zv3=B$Z?yzU!ufzAyD!Q4 z36z98UIu%}GTteHl8^~;3a(<s5tgZyKK@qSZ+eYqRqe-n^(21L&sNZW29g#R!@YP; z+hWoyE4*eGo8iIH39OX@hp%lpj_pB=du1y2IG|k(anU?7AzfI+#I{n#n}Iw!8E2&^ z)fl+Pcj0ubk_ww;;!4KfG!^QwG!=(EIqCc-4&N=Q6YwlOTBW8F8&t`usl-TCt1{!k zkBx>8K$U{;_<;n?hpbWzNL46^Lp-9LIkh^5j->&{vhabaN$?k#7M(=M`>R$b%F|Qm zp57A(lhs+wU0N!o4su8Wp)OnsN6pWH5oTpZrvq6B1}UXyI*q8+Y0P7_Q?!B-uXZx> z$BAhgd?9=%-mTgRtKo6t6kPEHd5kMop@@@Xvp~{CnhJfoOhUczoW#dW9&2Nwlj2h$ zlaMY)?vi`fuV+u$Js$zxJ&OqBn5RIa@SS6lGO$6UDDO<mGW737MW|h!xmb*l8HA^d zGYn4|$A_nk<HJ+NiQ%EgrNF+d>`IF@j5qFKU~wFBS@a(?-uIvnMLO&z6Z8DZsmNM( z;hxqU5kDT?8ivSWhN_Gh!hR|><0nVM@Nkd*dj__d<}c)Oj4COG0~+{?dpa4E`2Dc6 zC?PW_pt1X8%n8wRU>0FgEbIoDnidmBNCkorvxSMs_t<`k2s&B;b;Xdy@>jHiS2yfJ zKYEZ$iiQaSk>P3lnI|fgfEfDo|E~Y1f&Zt0Z_<E&q_fP|uU(f8+;#Nr(5!Q2TmdLF z+@PL;D$S_3pwMuGN6mIwMp=WhVU!IhTSip@RgO_oP~{or0IC9`96@1|1Nh<r3R@w8 z@&<*?i9iK_s=}x+Q23}ByzZc|4GyTjps;xjDC%dTD-9|Q6h0mYl?4jhRDjZe!saHR z#)6VEDi>58M$H0c$EZc1>M|-1ls%)?gQ~}<ZJ_EiYA>h;j5-3!fl;SHHDuHUP>mRM z9aLjR6@Y5OsAr&>GU_d;W{jc(Pn$E!8k8fWY(P0NstPD)Mp56`g;5TmTp8sE%8gMT zpxhbd4GJIRBfSBjJQx)Q3Y!Rk*Bw+#M)d`S4NkyI0M(jNX`tFLDhpIwMrlBKF={L* zZ${;U@?q30Q0*AC2vmDU<$>~L)Ot{UjM@gupHX{3bzsyHPyviO4JwdP7eIAn)OApu z7*zl&h*8f#1vBa`s1QcsRf-E`lr^X@M$ubAXGT>470xKym^gw_4xl0#<p`<^qdY)$ zWt2ClZj1^5)tymcpn5Q>JE)$F>I<qDqY^+xF)9sIZ$@Q->cc1vC>f*1g6hktTu{-B zngt3?IC5bTs8~kjfr?|)dQfskZ3CrX)Lu~3Lp0-#fTBL68Fw0#l2I2x^<&g^P}HKL z{DPte73CKc^~%h+x1gx6V8)JHLgyBgwH5jjj0zYRWN+OqV1lo`O~5$(ksUZ;aCvt# z<b18XceiZ{1SERG2RHJOV*$7vLX;wCsi&{K_mBz!v4DU{RPAs96N>G7SnQ#>%ie&I z2OUM{C%n4_OoBl`U>pP86F%Di^qj>%U|giVO%MXF5`_3jy9JDVgm4GjOSfCY=WXQE z%hdrBg6zWrCi&WTC&f5yH^(Cu=^(_|Az(rzo=!NzIG?Fz<3{aOI|RWI{`lI5?ch-E zg~Tu+f#zicet{q4C}6^gfJw|bFEsL?w?UHrZ;S7Cm=Ujre~LMuA56=nZkF+6W@Kf+ zDx`k0J1MDG>ay1$*}P-?MShNa)R)vHW$NOsgVz<g3mA!P<I3jH(J!KJ4i8Hc?GW&J zFUvc2Q+5w>sBBINLC^vBBi~BZuG)tq-<D7}(A_jqSJU0JQu7`%H*GS^A1-3g$a6=n z6tcgDmLB=GrMfIHB1GZg1?{s@dozmP#~~;zx_m5JmK}xDR~W-F0A<0U>}WcZhFrjV zSX4mcBLNfkAvA9&!uK;SV1R&B@pBI)5cc@I7cw4DiHD->q!D0Kk@C<hQWWDbxTQvb zchj1=X${xj2)XqTdvem68GqS5#moX?gXk{O-m&bSQj%8t)aDP(A0E+4XVfs1M%q|B z5K6$q;`fz^p@9~3I#Acs(jyBTA?}Mv`*MS=2&{%$Ym<rF0B&#u|1gN%WjNzu;b|UH zQ9r$iwC}hI!yjIHSf1Dcf*J(&{YxJaIfJ?cHBDdHfq~G>6#R;@QK{#Q`U!uZF=`k7 z_Gi?u`1_PmS43WO<k~34^8q!MQ5`_dW>hq&$Ba^d8qX-ocb=yLHHY!&%=<qWH38II zMqLBN`}`af?=zi(!~1Ltqkh8VDuLpCt|{{Bg5rI42Q`7od4syeC_hkq7#l&oV7#rM zCNk=t1wW!wjQbt+8K2%KB4t)w%d-Z>>qV@AWe33H9x!j<f(;Di0NWWI4pkC7gvSot zs$c_xUEVT&>v&9<VrE>HhS6oULdNfpph73`?~bgL;;g6|IC-b8)*}w*fzzf6st9#z zI-Me}J^0E|l;FF+Ht4e=wX8!(kI?vQC|+pr+2MO=?%6>~l!lV5`$m+6!#D*?Wl4@q zhtexy19H6FJlykgtgT`7A!~nxmQ>pmQi(%LgXW0ZkT7aP0;t@12TZWmHVtS8s|nr} zV?DajxGRQ#ymEg8IvFX~54@`QQNPYXR4ymWR0ta7kN?!yg*8O^i*!jxR(j*M861b2 z$s+jCFX9G(+k@x&r>0|U0bPCmFslYUHz*b3ZgO<{ZEdM@m4=Q8eDFz+52E2UcCghK zr}a^M_u@4|KO=H*k|d>J6p+#}8c4nDG5GNrK@>*GMcxsCl5mCSn<?1a4?PR0*Ms!V zcScbBrLqGJ1gAQ+&H%^w&^9OV=*6Zner2lT4}WR3%Is6B<pRIdDQWymol?DKs8iCO zH@Jmr?+f)&yo}X173!k6P6JYWrwi&E3z}CSQ4%`Dj#Vrr>G(QEk^0CWQ9oBPv{~;0 zh@gSu0!AJ&Clw};={kt*G}&-pvf=Iq9VK|=h)Ud%8zMm^?n({VLu*J;3*ZWLMINC4 zqcieO2xT08y4?5$cg>BAoJt@WNE$tZ?Fm<=Dup+4mL1+&Ht@^r2m`k-oWelcWhfLF zW~wTfExqW9T>el}vh%)h@MTUVfNPXfB<u)w8{VIAxe6!P^43q4Eo;eubWu7e_ozUV zfz!31IB)z5f%H<d6qp8F1|%7(?D<?IO2ScN#PhBTl!P-gH{;C75iY82wbud=7A!QL zBDJh%JhQ6iT-ET3%ncPu?X?gD?}Deu#TLdh!+cZ)XB*~%tWbL`0>QiBDRQxk@mLt? zd>E8+?X?&L?}Deu#eT*!!<nL%2tk{kFYbkOnxT_dBD{E-D5vG)T)3(T(M*eF%(yb- zpCwM(+sJDO>K8A{2krHD{1RFLpnhKJ%j?t2_2k#-(c1hb79H=Wy_SIBwZT)QjU$X# z3V)X}%0{H9oS$I4D)_sMQ8h$L3M!xR?D3akV!?(rc#2|hn(-X*_XkF~iWH^oEaSDt z-xZAV7Aap)=NT^mfAbg>BvN6Zeq+2y{9VbY?jjWh>H_2S#otwoiW8{>P}dkQ34d2J zDov!+pl&l>7XGeb)L@a)fV#_gIrzJlQDa4FBB%n!qiG!d%K<mm`i!rn(JwQ&{%!xO zAhav^VbBMEuQH1Caf4CY@b@O8@JGDnfijHee8xHISlz-kvtH7xrm4RT>-$&n`undb zqlT9~=(YW0{T(gJm5r=YD|PA9!F$zioj&g^8?v^=xg}<!8+55I+1k|Y(YgioPEEKF zwf)4!(Vs%cKk>OeyuyU!brvVe9sO|QV5u32Q?8W_>UM5;mDT%~luxifp>Cc$hqFu0 zA9t|y<BAvB-wp~cGoaS;9+qX|M$~LIrg56H$8Mjcxfhq@+({q&=%=RsZ`!=@v{0AG zX}f)0v!S!x-3tbEeLMQm@-6j-)Lgoz`#9UbBz2~16S%HR+Uv!`OAgecmhVj;Nj6i) zy&O@@?DJ<T0p2vt(ag~?*UU^Ka57VqnkC1flE#tBOr}{J=9tu(a`J_=W?@EU#PDjy zmfPA>CCyw~m<3>5D8xWWkfCCLkjWpiYQw7;oopqriUBRm?5y}9p;q7DYRf;ckLcjm z!p)Ucv`mH*IL>ruz;UrL=D3o*7|6IujXCaA1`K3cP>KyW9<Ih5&(=m9H^%^Dj#HR1 z$C<2F-)A?MzQ!C^(vyLVTbeP)oowDfriI3s<1yBl<C$y3ad(_$%yC*|%yG^$=D2J& z=D6-M=C~a(=D43W=CrtA%<;Hx%<(KR;<RvlX3TMVYs_&b)795c3l|*9ZOCz@BV7$- z+^QIJ+@;2x7LLXo4-aFGr?(Nu!;y}z)ep<Vi4M6n;5hd+=C~vnb6m5GIc^$bjysN* zHT1bft}(}BmNCaO&xqscxY?NFM2FVu$Jx{Qh%v|If-%SSx-rMCz?kFy)|k`68dZ`( zSROXU98X#fq$lI<=;&a~aq=+cI0qPWTq2D*uHB6}ZVAR5_bg*h3ym?yW2`a96YnGj zadvWCWXy3|Z_IJtX3TLpXv}e?MNj(LaB@3s%yGYN%xO_z%<*_;%<+6{#Bp|{DqTM; zXD4f8j<bz1$3<$)adj}}xOo_J+`WxCEdq==9%05D&%Q<+7smu+j#HX3$C-{Z(odI* zi^iDaI@XxumTSy$pJmKxk!Q^DSZ~bn+-t;fbv$CsaXN3zalRmOPz|!!TN8oHoNK0* zXQ}OzQ|PWZeimls08&tU>&U3%i%VYy0~e5?HzyQG?nA(cV7`UdZ}HJYLx$>ilBUa& z`K|8{#lXVM4}W1g+`aZ2c7N#)y-!$}y~1D8I9=9X_#*+=!i*Y!iqCE7>+@gwL$S3m zqh6ubAITT~lwvaU?nUvboBZe0Fa0UaWGV<X5pFO+Ogf{h0uM;3l=;9<W%5id$48JM z{Zc6W^ctZx<A_5h;9x<dAR{LMc4;|7g!@uVMxI4Wm$Vnj#LLy#=2)LY^caCrT=aPk zI8yv{92(qpG~iG!h8b{f;jXU%=MC=C3^>+i{M)n6=c?eGHju&L>}(*Jm%;g{VbLkd z*hS!qoXCXq)B$~=DxE*Bc)rMh(+(W%#cP#qZ7;BR4h<;tmsW>3YTbx~!_)OR_CX;o z+IzBMOHQ9d)@#TiJ7gR;tt+x9Lm9Fa9Y=~gLk_QbeHmW!`kcP{u2@*S=JjRP>&viI zoYv>K;zrQC;EHj0&FlNaYhKH7gezY2#A%kL>zbFr6ALra30+5Hrlj!Yo$i(jT4gd^ zvoxKnvUqA?#>yS2t~L7g*14iy16@qUAS@ejbzvoz-rbe26G-}z;EKr@gk{TIX~P<K zVo0>k6~~(hTe@Lk5EhM9=)x*LVbL?b-k`9`3$B=qL0IJt!nzd^AE<L>FSued24PYC zp$lt5r)Md;y2Vv+#bgY^s%Q{a<yl_+bgujbS4_qrtV+yPU;L%(z158-JVk%I39guo zL0Ggr#lkEXf9>&`=k~fGK)AG{G)#u^Cc+=G2;LuJtpkU0Kqqqs9Lg)5%p-8B7|2+n z?IMm&rXe^K1D!vez>ylrD8O+vkfB!E!9ZpXIP{LD^JkObN*C4%Z~_cuZiC}t;Lite zB1M^I={gIicw3n5#b0W7%8$QK!wSMxUTBJ#4C6U~L)y@B+JX~i!08H(H#oW&D#7Us zjxH601dh(1$>5|xM#otK&Uyn5E%l+4>U=&5PLhGobWAM8M<??DoGb&Gzrg8kAY+3{ zF2_Ko9ynwhbfE_lgO$O;MI+Z1W*+(jv)V^o6jheEm<*#bh=cHSoQcGN*E$ZyhPg%P zNa#4b!MTn+gG0`OA1iS8aIS(*3(skmu8y@24DLxm(C9l~Dut>A_b^d*<x^O=m<-2U zMe?p_66Eh(-4<Li8LnAuLZS*so6}W;xw=lI!SxqhDAY2xpOY*}o+(dK;XG-4#}=Jb z_=KQL7L5;c={RbcA|oXh!rBjDX{oF@-DNQGWh{e*+ce3@>E;c@bJ-*0YFQ9PgAQAd z#L{lLj99+d@&Tjyx<^bdHC`4Fof3zQxJcSS&hQcMQ3rU$&nt+26DtIt$?8J$RjQ(6 zFqtNb_@!v?gR#n-<~5-&HUcGME7@f-WpbJ<P~|I+$%x11OJV79l^ko1d46byIxR!Z zo?%80-{JXivhc|Evi7u?JwlD`EV^QmHqQ%8QL5X~3S%Y_k&vOr_8}>peMSnFF~`~e z&up=0ZQno0Xg$()1!YN`)}1~}5Yw`>GP--MfH>_V_@c{CZJb3d>he{PE$oTlufZe3 zoG;9=k%Z0@V;j*q{^E(DBhg1aD>8IksD#cFV|&v%{^Chtj+jLj=7xV@>_ls_#x6v@ zu>--Rjpe_vbbC}*6r{Z)6$iomi3ywam8)Wnxc=#o^`$XYz3kT(8eL#o4!mTYa>GzW zmR=Yluh0<KQ>~F|J=Ko_>*(tV2={_k3`?^RO+%)a(aHvIFDEar|5Y5ly*<4>Ij@)u zg}0ZpmzPd?Up`>5=h;T}uuRTso;c(BSr*4vQF;&5*jzOUUsSM)LtBlAO^rcyA~q$G z<}F;L`j=A+Csz+w4|jJ%w$#bd(cRr$Ds^*ob8%u0`by$Pm*!@UbXPpXTu;8xpy&_X z6U!058rt?ukl`dYoc_x^v8`oTiwe2OXkJJS@aAmV=?~%46Y4HpkrSo6n4Dgxh@PaO zu?<jQd0{dyX9w`+!o2kd2<VBlKDvylm;j!^%RL|-7uHvQT7aH(N53+R=56&Z__tU8 zC50Yo@XN!jngh+9;i5*}n{)Kme=Q;YJp7y?lP}0M(8^&lL>)t^<S!dQB=l==NgNHj zH1tf@dC*B}IGep<{tImC6ve^6B*9M>KO1jv(IWKZG9fe6SWd4yL81xxjTK}Br!=y_ z!9<$-`uY2G35pB~Y}e8bf7%B}`q~+CLxX%ne1iQV?4;B&dX8T%e&L)My-gMU+cf^e zpJw<V2y3%j+fpy~G}g*D;9icPHS;_MD`V4BRjCTK)FHf~lvXb#D+i*DmbMr6_hj)} zf%v#^{w!V;H@eQ?M=#~a@$;hIAAjLnBbg!<f8tV8<o{za1c&uLwpgw}{oVdB!%#B? zdOC=gt*rxC(~<R|X2SPx#FT<Ll`(~n=*Y1nm@3{ef<(_T)Rrw%p)RxbqIgn7VZyBZ z&@INoG!*weK<X&|3~U123v2^C0Q3VM1a<@-2KE5{0_+bw0;G41W5At2=s-hyI01YP zyn~;yzIK`OuiIOI-i7FkeZWO)&BEYVdy&Bk7xYz@qr<G(W$#C$Qlx{vxYyGG>59zK zK!GGjo!|`opjDh6hW8m>eNx6skq<zwv4vIT@PL?92ZfrkkM+e|DUZH*s2P8L6R&N4 z6`y_qq;!(LYXV;3N7q^Cg@zi=1BrhL*b{ga2xFubh?<4KYrti|TfqImyTAv)dq67` z)&gKD;6q?X;3FWdYJ3751bhah0TJYZW-sss@DT6~@I3G>@D}hLkk&T-1^f(r4=jy% ze*{*i_?uz*5)f-SG!Z}xU>dL(kY2?x{HECmEDfam#M%y)?^p5K)5@rvgd*Ye8te}A zG0J!9+hZ_M7MGO73JohS6p;4P%YQ#x8wuCawlAKBnwdepI$Q8h#l|Nx+8IQKt-)yl zA_jK!9!D#a@aC&yknK1bh=|stf%kgFQ3_+A85G_asDz@&uTn>+Fd|N#g?Ck3+c-ow zhZV!*fil55$iB!Gjo<KP8!pKK8E62Q1_nw-=L#ktj?U<)EEtsfikyYE2yl-}GtEPU z#UckdhQ%U9u8oDhcx*9zT#d}eMUk5Ytb-q49%QNnr9#afOb64BJ-};>4Bx@3<op9_ zwRjh-f{TUL)p+N(wOu5-U=IW*`eAz@+<DL=E=p=1koSrAgw}15-Sa%!4@9P<B>|S~ zr|(fbEW*~3{9$n|fWMPin&Xt|=q;(!vt8H&YXtT^{{X#F{t2wh)|N)dgw)~NV05I? zwMnE!Xa(?h8grH=cX1Z2i4wUDk8*X7glsN@CywxvkGT?GZy_Va`+h7)2QkPL^p5p| zqy>jnkc9Ef-*h2DY!zpK$ksYy>7s#4qXav%2YFvUaAKi15kpUkPKnnKo#N^t#x;=z zn<WOTl@_ysUqs5<7y2?wdr|qO`feuRpuoozhK9;~B_Nq_Wndhz25<nd7H|Ww4)8t@ zJ2J5PqaF}-73To_1jG=&26YREwcZ+cpc60?=mMnr&J8#ch-aGbfu6uMz}CPmz&5~r zKyToEAcpca&5&Y0pbHS|#Wl1hI}8{O3<nMbMgV65BY|YL_(DMQBd`x}2T%t585j+u zLB?2MJnFu9U?xxr91ZLTq)E0U;6`97kfzVlfER)3z*|5y@Es6o)6{_u2LNes4!NOe z4;%vQ4jcy505!n*z~Mj|YRds`24Xe4W)BdP51IqOalkV`tZmoOO7e-om%#6UH8Jdi zX?cwua4IksI31V(gf2C?z?neW6=F8<EO0LH3UEH~9dH5g6L2ArO66*xCvYt=8@LWQ z6u1F+3Wz+>*jl0g0qg`s8>LYJkw=<b;C|o?AlfX=Qs6JZOTeSRPr&0q3)BE7fg!-N zz&^n9z`np=fpXyQz)8Rhz*WGDz;(bYz-z!ifVDAbcO7UCya{v$-UhY>-T`(N?p45h zxZekS06YwQ1pE#71o#s86!;eS0w_UQcm=Erd<#qi{sqhcegF;!egsYz?zaHZ25X9y zM0<<n!X<#kfK`E5E2(h@S^--DCBR@{DWC#q1Kb2G2iyj%06Yk+2>e~Re+R6L`wr*; zRs#kBYXGBwwSd{c+Q6YeJK#hhDoM>nU<2SEz=puqXl<N;VL+4}%|IY(I?XU3zID*7 z1bPAw0b2oY0$T&`1KR>?Vur>WXb1EG+5_7IBY+)%N?;%`1=ta&0(Jss0YiYJfMLM3 zz|O#9K$Ka{31AoC6(A-TH1B}jf$xF6f##^6`T)xUqk$EHalqO@Ij{~;0YsmPEtWOz zxAq4gBJ8Wbc82{I+7yBx0i=Gb6hhhyHm1FVe!e5_%`vbYYR0ybpcc;qEDMy1P_wjD zw%q|+)KBha)h8}qC73MrUdcnfehIN`z|!mZYCpB;3%2&6xKrH>(_~W!ben;+QhG9h zRe%G4^?+GGcOdFNjW=)zkm~NCKqYWEFcCNcNV?jDpQlk@F9JNMoqbK(z7So-CPb$T z-5}B!r9gXqsWB-Y>1m8QS`J|GeR$>*+rfe~NuC($jCxt*B`=L*XQ=BXz8`fb2f{^h zCLNJ<kibKiPebV#2c(IQ@xa=^NkC`dWS|#t3NR2j6&MVh1|;2F$Irt^H_O2zy;DEm z_wRI*g2fW76D)<4_WDvaM#e<lIWndU-k5Z{A)S$u|G(=Dg<X(F=Z_Z8|E(hNZoxji z0kDhGM|!02CNd7%4d{c?JO@a&HWw%bqD|FMUd{))0T%(=0ha(tk4u4FfXjg0fGdFg zfO$abKdb_d2CfF?0x|WcnG0MGB>ipxQa;SUudworXtMI`r^^TbkVu(7_3wSP@9m^y z?PZt+WOCkkG!kiL#gx6eQ<;>4t5-}(d6Z6rF1%hpsxO{tul__JV)|wE5Yj<$Jq)Y> zJO-=*JPxb{JPB+LJO%Uwo&m~$XMt2!&jCpfJ<&%o*28aTPf7PDf&PW)fyNM-DV~Oq z_A=DN7cW`*4E9Pz3b+o(1}{6Lz5*}})km*d&%othfeL%oA~Sz0N~B~Y%dp8ybh3)s zD2MLdCzc-qlcf8K(t>|f3s62e;(=a1(L0H+D64z@qI$w0@AO|qcHyB7Ld8X1CIAhp zV@q_XbuVlE(M>`#sg+Ix!Ka^k{p>AD1C||r^tMQwvdh>w1$mtXuAbNW-cs+@7ClE? zl!&pwQA`Ul%r)`oeXb6Ep=Q}K6lx}yEAp}!k6yL(y&Z(-XVFo_MY)v+yu-Yux`nnv z(!QJV#!PjABOeQL!jWx}Eyn`v1^yM-BH7zjAeHrNK&pFh0;7SqfK&$V0%rpYfaib@ zfn+V1y4Sn|J_gde!BZfq{}r$W@HG(qe(p~ojg7nm_5%I|Q~=)t2LnF>(ck4h1JSSL z%q;jZ6LTQFL=^*~-^vvSo&c5ro&!pN=udK`f$0BnWr65#aW+6FAaX%N8C)5Nehya! z*cn&@*c(_2m<Fr^91XMsqJAX(Xnp|J18xU403HQ80HHIkF%a{}ToWMT#5Ds_jynP2 z2j>QC0dxm;1$qFJfh~bUfvte!fvtfvfo*}b6wnK}8R!k%2W$s?1Z)qqM%D)d>i|Q6 zfxyndzQAzc1Yj5779hgZkg4<rUIog4_kewY&w<gvPrz7UDHH-Zurd%!C^YuKen1~! z3NQee3JeCSf%Hy-_bJT;-~eDAFblXAI2d>WI1Km)a5&Hs4d4i1UEoNd18@}32M8T# zux^N(0HnR_CIOcNrvPa$y6M0guv_RzQwKO3=nlj(4vjx>9<U2=0Wc1@5SR&E3>*zy z0vrom3Y-aC23!IB0k{&l61WA3-TgE>fNOzNH?PCb&8V+13q0z7OvSH*Vci^o!As0@ zCt;k6)y|F((O%YC0=deME_;JBnH5}C9ncU*09bbTvC(B^A`NJ1Yegy8dbOgq_4;zu zlgfJne%g!TOXZ!~swjbp#V)K51sh{y%s&AsvRi>3z#YI2z+J#zz}>*Xz@LG+K-i>) z(!U=_db*9DyOEw6QaJ>_E-;`FJ%!7$8zsJf{oljNRK@m%FM5iy0gDn?!<H14F7MB3 zO^UvL?Me=%;Qf=%s1~Lq^G%zsd1(z^Is9lySs9<e58#t-*W;(XD2=4p@_=Om6N_?L zzv?Kk26)GSPQc^9c0epEV&nFwffI0l21s@4IpAjCZ@?qK-+`xrSiq|}3%m@x0lWgd z55#z`<{|Jp&>Hc$4J-@11FQ_h7wa0*eF2d22=BGnL&tEQg!WURdjDr&pkW>bVY570 z2in1w<<MS8X)kLn!A$v!eg$csB0kZE8FCVuP-0yGOD`8`*zP)58Tf^ou}ugCYp2dZ z0l0jQ(A0wrTc5?N*iafVrOb)mv;cYU2&P_M)A(6;l10k!4#&D7WHj55r=e!To`qD1 z(!k`4oG>(6Sbu{8AS2Oh=*bHEg2l%_NuFZRMxTMQX`=vK6i61(pszxK<bugZZ$P?I zEoWA&0gv}FO{tDeV2;O%a@gQ71FN--I|JpAMqK3QEK!!7?7|s#1=#o?#wEmy@}KON z-j|9A{AaKivWe$FKj2Fs_50rd`vBhq6~K?ck-$$tilSLD-i|GR8*y(5JO#7@o(D>R z7EntmAm%2x(!kolvcTp*TOh{JxN<;@RdE%87~A101Eq*tRbT+H8W3XxTy<bSU@hP< zpcHrjSQmH#Xb(jD%GC!B0%D1sW*o2)a09S0Fdx_ih_c5u2i^iY0;#Qa1|n^o3lMSP zT!Hq$7QmK34`3+J6DS9Qr%?l20ds+EfNO!?z}-L};C`SlkW3>0_!NltTT={eWC*Z4 z5PoXBf#E<J?~4GA0!9MI1A73E0($~!8Cn$Z8n6$LECKxhO%q@&kjDAqfRliTqh=~F z9+(GA1g-&Mr&?A&%tRiwFsdKgfQM4d_Sx#Fs~`B;TQ)l+47F1wUIl{MiyR4;-WZGU zQh_%))^nv2#kXJ4f;Uvo$eCU_6UPO->49)jyvS~mY_=~L-KHZQ6s!s;1!e+WfmuKr zJIMx8Jvbge<M)3@@Tje7gkPsZ(@DpODG~4gJ(xsgo&4H^h=iI6`!{Mw0BSI%;1NHE zf+=BECP@?8i`-M%U>aN#fjI?nr}#|;QuL++DXuewG))7uB4=fr&hh{YRTQ+=2Qw>i zs5E(YF<Pg>voS}8eJU#n53F?$VzN;URTubWbo>le0(Q2<`a`UD<b5lr_b@3HQx|xq z4XKLm8F{D@L#nEKph{GxaZ;|dtv$<cN~T~`{9d0j9P@>hq4o%FVSNlWaWn+rm!2-` zl9HH$Rd+IfoEj$+w%gE3S%^}BDVaErFU~-!j^LN&7gE@XBO{sC1lAWstVEG6DOf$2 zB&Vlxc!v*UGt%W;T|ut0D5niDOqnH5l2JcUjC<WLg#2kJgI^g59h9=&O~VE3f)2!4 zN|{0_Pl{79i7crgKw1)K5VaC^@MDm^1e+h@i<DNTE@TFNAtTJlYK6!nBO!j~mS*CF z=r}-Tu%Smf88*qMm23z}gNS41kj(?rB58isPb*pnqKlBv{3Td|VFGGHWP2s82(9E` zBfQK`@R}S8yDeoKBl=+|fb9@V+19S6bu9#-EsErtw#qqIy>I~)D-(~=b1<VNbzy<s z{eon{p}v0j6B5d-p*zgDm`0^m#z3G$P>-+xnSW?_uur6{U0`IePZ%0!E8E)e0pmHm zA%`YnS+bSwEmR6TFQk2_Z(v9VSx9JzA7;?`NAOeGPeo3&k0Uw;Mj*D@$5Lrby#C{` z@b-F+-Qrn<M91v{JGjB1w2oCN(F61yck>B}=n~Qa+em69q7zd4=}UAB4e)8lOq(KJ zOp}tF9<Be}CoC+;PZk~;>=VM(gD+QD@rFc1U{CP<I(PAlz{24kVSY$waA1f}5G!;f z#&r9oSh$~0kjytQnALAjp+R3x&DI_BnFv*swpF7U<1eE%dU$GW`w*TZ2H|YqX<0j^ znwFRP)8go|c>0uo8j%*AB4grYCKO@5!k2YZrue6*!{xCu=+)ZxzOiSKc!%MAtAxjw z_{X%dPYAYfX3olie^(a@3%QJ8$f#GXZTA>>9gbznY9>qmp5>ph{y6o_;W6^j+IE59 zhMl4;Pp2i>DcCeSJ(;<z2#KkBE@kamty%@_#|D9gv9UTCQ^-&~2N?UZw$0IFun}11 zH-&zTe-g-!RY2LtqV!-nmQly5D1Ox;5p57mIEyB8UJDNw3lFuC?;uyVZ<m_Io>Rap zjh^$duZ$;!#hztPf{_!w5Xltw8AJzm5R6P>;gPS_{8RQ8Pb1CZ0~#rWNw9ibe9#as z+Vc<e6@WyrToM!^CT6EW&>`{x><Q`U7)la+M^vyGHI~w2VOd5j_UJ-`YHeFuh!ftT zbh;;tI>A5CS{f5J<9RHeG(;>0F`R$EA|}HMcnrhpQg@htD3lL!qvA`#5rc@e$JSxm zm{IO66P#&tPhXq#ye40c`0^uzS^}_}w>+K2iBeXGNz0hMHRL^Ji}C|fQxo~pMVk7% zqRA3($vb1YCnlaWmCrvQO|kN516~K77aR?1%|b<NZEL6JoFBqrF|Cb9e*7c-TxMEg zzSW07t1kt#W<cw$nMbyeGmHuPz}B|K(WD{s+XrK|QfJ?^<^+mEEg6o5Q@+Y{Do<2r z9N|N1hhoC&jM{p!76w#UXr!%|eD(>}fIat9qLWyZsoJCWXoMS>qIPj+#eN;{6UA4? zf~pINbQ+nGsqunrZM#)3rda%~j80Lv$AB}bl?6#kq~08S^=13P^XZ|OQ+ChgA2Ab* zfHkw2P?G4S0B$InOpumIA?+c4GTvaAAgL;w_kq<__{cR~hF247+g?1Ew_c``!Xv>a zO3Ej@9d&fe!}URZ6Q`(By)#BHs`w%$Et{o}OsRnom|*iPzRo;PusdGO81S&RZ7z5t z$EiZfSoDIeZB<(L(MkA*hc|3v-I7uT{Tk@@px~Bo#>8rfG!rgFf$d4h^i>Dk|5-cp ztr@Mt(z7$<y&o;pB1KT!v0C3>`l5huA@qz;#*$S?4Z=*Q4zxXh&3MwDc-FSbynjBr z#FJ9C3ZZ1gFyj#OdpDmqyfHB@*%9@$U@m-B#=ii_SX1+p;0@K3Fl(K;Q^*<o!(chK z=BMQGwnOoQUtJ>T^@iEQCOzMo7+H0s;4|MNXiw)<;2CRgChEx>HNIrqY3P__M$3|D zpFfH`EkuOAgL~@RHdU6Jzbss0=95P>*N&J{HNkS`FJ3o#RT3-2LaD}!5}FSx<}@Ov zojql?O{?Tsj$;L#SiYG4a`lsf>Wk_aX8067^;{8t5MK3I&g#_`*dATKI$_ak%KH_h zj7g6c^i96d$QJ1v*@Hf&wQV(CjMY#G(I+mG7H_IpsMOi2VEDWf@)XOz*<;GoFU*rw z<c0Pccsnh`c9@og)cND(EsmK14P7FlVr9k3^K70;v8C*%E?XEML3}!fqfk)arK<R5 zm1+@#Hdkzr$l$;1lF68LNOYO3YwIZ&?F79s^^-*o=EG(2qwb)b8VDIv{Z758^N(1H zj4Mx8ch-e0|1lv|^3-Mw5E4YyzCj_Ps+LADp%uOmF<-N^=7kmREC$rcq9u@em5MUm zpiYV9L*P4R)ajA4Dx{x2TSyLtNj-jq$$yu{w1k!U#Gy6>_81+<%%LtsH|VKPs6^?r zKlWuJ6Czd8N)##(tRzt_O^bZsU6`=Shgj}>2wgFalPa__+L{77adKw`X?+Dg8hoWd zl_MDiIUmETiK0Nom719}-ba6&$ir9qWITmeD}2qQS5nYEQ`JH5zKEx;qd>t?B^}87 zjrSVN{qjQ(WMqXjqs*V#dg{~WFpFb`HZOVm=HrpZTOJG?1&^h>uz2vYw2pu>hTj>L z$~#p@m{Cbdg>_M!zKkkw_%sLzmoOU28opX$ku7NuS)oHqKGQ@3g+&7`R3It~3Z{`2 zA2q()Okg=qj|#2v_;640z6d>U*8P&<+Y@Wsw!C+G)vJv1j+Hlq9-ToyQpPH^|Iu4y zh0egbFfL$i>nfxYiD89^jH7ZPD$yF)Z@j#a<E-2c=Tp*w?`vS(3w=F!m(H49S{*>9 z!y6>|LZKRVPh`vn=%pT#ekoYJg$$Q5d*078h02@-w_4vA;cW<(Mlpp`k)^>;c*1Ly z`Cz3Jr_jk1w(~;zJw;Zdp44|N6S}lW2U+@lEcb%P>?=bg5u;<wA`9y*^S!+^-g+tF zEO~SE3csl7X<%ww#0dTi1@^2YLUg3q1P1xBfdLw%K=7=iCqzsZNz36`<Y;&ZPx%2r zs@7yo%cprq_|BLP&5~iT$lCS;pGJM_VkJ?bEqPQ?(GWOmx#{B}%CDJ1@Ip6<^~wLi zC)T*Z8H+aS<B;kLv3eGOQRcI3s_|u-8UKPFUwG4Hd2ycS^Sv|SfsAGBA9^kX?J+e| z(hOTxUZ1PKs9#y>`uiTMj8z1M=O*9U@rnrLKboM{?(cGxsl(7{dEX1I^ko=bw6^_G zXXC7-p$i{KllQDxPz7Fy%4DqXB=kPQa8?x+AA{1(YQe&k%3RVbn(&53A<X3Migl;N zs-1HD%Yq|g6@&5HkKsE~YHAV-ez{)C#C{B^?{DfTzAB-q2(hq+rtu>Rd3s(^snltR zQl87lpRW^`(Fl#RP(h1@gjFhrC5!2UiYsk>kbyJx;NKVZ9{<wwxBU}7j!nrE8EvA# zwpozNgayDf|7>j=ESNFh;|ok>*-JVuq-)QAV|KkHjcsCn(qch}`*tO{9mS8&{%~*V zo+Du;z1$vGh|MXs@8s#Y^4aa0Va|xjz4h*M#B$8VyN5nrb}TpcK-#CY<`w76+ETIE zeCJJXCN}lQ+Ds<b(ZafFOjg<I4=)vKzJ2qLPkSh8eN1(Fvg_FonN3$WRU-p#GPxOp zwuirW`FTR+>}luDx4%=qR7~!Qqkg^as%tG?pWW2sGyC=e@mp;DN^)~_&7a*{*{dqA zm|I0!<w3tb{gzih`7ZRMUuVxh**6D}JAdxow3nBI?Cciy{a{gT`0Ln4SLe9Y3y&=0 z`e@XH?(;CgMr*L77Cq*c&YV|l-GN;{PC9>jK)H`Amn$drZ#;5jSJ(b?n|D(0WoykL z7j`o4ap<{Wha&CY-u%3I|JFUVer!8?<(>}lzPGCd-12h3HxHQ4m0Eb!9{S|3vuRVu z1Rj~wNILz*ftO<&Zn&^-=9_%=$OmT~ut4}alWRUsxwPd<r%h$nf5@58s_W+?sS5_p z%WUa;-EX}`{H}>ubb)nS@UPO4`_7HdU-_%$_fDtl?LPRy;`kA_#h06=9X;WgQlg-> z6I*`-xs!|HdK~jesKVv<nU&UB5fP-$vsfi>e12DBSF5XjkC7jkD~DXodZ(NQs+Q~- zm#td5zunrLqstr`UD)3(yyD58$IT<JpikEslX_B%S}T{_YLxn7*4pf1(WQQ|aX7Ye zL%QdjZu3@3%9XBO?GfsOT})0|GI0OXvx&c~Y&QR|Ryl(Ym)qFl+Us8$)?Aod({uCk zJFu79m;jYp3|96m2$^{9#*G%2uOx3gw0DN$U9|>l_dlN6HEH;s@ToOXNieyJnIAWo z*;wz|Yu9m?oB!I(=a-%K&+pc`y)vrFu#V}Krq9DVA0}ruD)F!Pl{zPz=f~8&Ud^Vy z)wL>Pr59$8n6XV->*bmfA23&HN#VYWZkT+lPw&!Aj+TEgfB6#6oe|e|yI=ZYO~0*k zGVk|$?Si>!CO7Tb%*ve?R5&!OMa@^5unRlfE;O!K{ou_T1;baCu(P^?xyw~dZog;y zS{HMCKkcrcA9cZDhkf<11^c^h$R0o8_5K-;{cEhlngOiMl3K_PE-X1Tu+(0&wPm*z zymu^jB4SK*=PquoYp=eTpZU`mEL_ZBa^dsy`yc%N_dzzDMvY05U-<2A&4G`bF6b1u z&#c0fk6lwy&Mz>zKNk&~5Sce+Lq)|-%j8Kj++E%(EUgBQj2|#{&#b<?2EE1lKWhrN z!P5n=qSrUfbcp+YQHh;netRlwchq+4c;8PG4-7l_L+6cHC&%PwZE1AqeY+{&*QomF z^}daFeKxmvS4<lDe0j?5kEI{>f3z6ur<mL)mHBVOCMvdcDOgc3seDVtUp514jXUzT z^CnkyO8(h;YoKQ=IF?#$IdyA&gOd}Ii`yocExi8oq=`50=9gH$?)8q&b6W(bbUlsr zeN3);L58Yv^J-li|I~Exl_ncHUU!(YuKK9)mlsX;$a~TbYxB6xOfL3t-Mj|R&42D} zHfQmht-fo|k36Y(Y@cO*zg6#D{RUox{aIoDS!!Y5rO&l3FVdzrc(!a!?&D>D1e~3I zv1=>K16w{c{@io#t?M{hiOHRKQZx2O)}||;E7co5xRI6J`;Ff#yPi9KC!+R~<NZGN zoQt(hOiuaec`=vKc3Yp{?o@iV|D4M+4kll`GwQqEM;gp)`*QnqykmKyu9R9dAK+H* z(!PV8qskwjqFQn!{KAo(_4!x2S2*=@MxwfrO@FNKV{&(9)%vww?#`2g*AB_Kx4Kn_ zZB<&7kM<Z9eEo?=<@~PqYOD_^#r)e^zV?(mx40D-Upx=k@+o`efZmn|p6{ujJGuP$ z!|&c7!deI>*E{<37FEczkxd*e1Gs|I)xFA{oo|0+!)~ihk8W*kG|drv0x&sl?9J?( zlRNYu(xODa@TCriEhoRK=CbXrCd9vOt%f;fL$M|S-_=Mh@*h@8sB1rK_m=w0Y7hVM z)adHDuST!5a+!O6g{FD__-os+9*W7;uAAvxqin?9q+{imMlP><b4<y>8}43zQFnhk z&yrIrTn#`w!sO0gxnH&R?z3(yL-(yqJQHg>f7i7K*M2HHU{KSH4NVq5bHLgVEKEc@ z6Ca<l_s?mgz0Lbv$-Ua6UE9<J$D42StGc#_z1O}KUL){*2$OsK`K=;&{>BmEFH;9P z4e8P4*c$T#2Rv_P`mH%Iy=!*tZfuf|MF&!gn4{|w&gK4a^vvd0SJ&KI(*4TAb<0x^ z^z?aU<(_DNru&chriaO0?9wW8Pn&v^25DY-KC1A?oj-SWxY{PW-?|gGvZ`4*EkZhe zU~=DGN!Li%M9gac<mCSLKJFQV8ugJh>9uZSm6FPiHVx@h;8G}?QVV~FUh=ez?md=Q z>b%N#K)*lk1!U%~O&B?UsQi9Tx9JBKV2ultYdrJ!T=mJ)l}l8uTeZXah;_|7?08W; zIMz&KeeC(dr8S#kjXsmhPPD79nVD-fE@yky$fm<5-t);lYg^KG;k5lL4vcNw`wrH+ zAZ)2cm1E(>Ds`JOa+mu&$>c6QDqN1r7+}?FT93+Jhj;n)=+YPGmod2)*QeyvX#1&o zm0|ZR7QK!+aX0eVh`SSA-Dj;&IXrCcB2Ro%$K=X2DSr0FqQpJ64@NW@JL=t1D;LZ5 z4Qk$5a`UIpbu9gI0#UD_%t<YFr#_wPHl(9trXr&E`uU!Us?Uy$oSv^dy1Myu<<*g@ z-l)f!9M@w_dPPat=ER8n7rVae)I03Sc$bU@38fpCQH>p1@H^VyqfG8_$fS3v#fSZ| ztC)IsX4I3GH-_Bm*tqu5Gc$Xr>by8}8w)(kVc{a$>G@gB=G&*q(tjK__gSSuGtIVi z8M(goxN*Z>gI%k&%Kn5kLrgBY^s?FyEvMzz*s#xSsw!~wgO;<_9UDLUuzQDkXWqT} zISbzgGPw_p0?LQ{R{ZFen83Q5vIcJd-l}a~>AA#n?thh-ICaCx7_9n1=U!@Y_J(=o zwRT+^Je9Z1-!ZnSP22LB)x*18T(mKAMsDkdm43qdWF~j<^7;0idcP@XeJ;!VrwNrG ztzO;c_4PImQ%)@Gb$CbhdY7<nmB~%|T<_F8^Cbs%x7|=CKEF>yr&;YCi#K#Q-}~~9 zn;o5&qHj>VB85Bt)b(GMwhZohvz}M~_;-!Vq)&P<`mOW0{QJL-JlLypuN3sdnB4QA z<auN7sy_rp+q8B*loq+Q+{QI4raWmBQ_#mp=D7l^HWo9v+mAmvXWV_dDsM&qaV2jk ze(-wzj8pEpyjNjcT2t|m<#CR?&*YxY?G$@__R|IP-z}UvXP~7=_K1EBd^;{Q+nn~} z<avwpdtu!;`o~g>KN7Q>=jPRVdv|<i5ARyt^9Lypw8@*C(<#ZU!q79vyM<z1HIwUc zD`%wN)JymC9-bXDfAP6Z!}A)hwX}ZbKVwE<-TF&vpng8d<kp85dow(^=AgkV8g8!X zGxhZC0d~)0_HH<5_ip;n--oS>#o9HzSxYTG<@X!6sfVjq(#toFZD+h}a{kit2Cn}3 zl`HL9t#m8?5$*I8CTDqkb<42wmLD%x?#Jb|?X|txvfoFy{-}uUqIPR=YWCy9*h7KI zEiU=9fBdFZmpmkinroxH7Vf^%`tX!v-8|;Ditq8f>K*8$3Hqo~ixoGxnD)}V>*YLh z4{;NY+YR5>p!JIUUK`HNd^hIfp6o^VhL*|w@_zKnUzMXb_1tN@;`-~ME#@yA(SO(5 zUOrQMH6Hw@-3a8zMJAUbjk=ZH_`tGfDNAowzA?Z5-DmdOG*1_m*x~mg%k$t4l%x7c zi`2rQ%Y|c4*S~kqZl^rp{c7qi*Gun@A4-VZdDrJ{<iod@Q0J<doVrJN&k{d0>@>lC z;WgJo-TDqGGoehI*RhK)M(!T}px)&vSR=`y%t7`WHbzmV#3p6L$)j-Cv7A1xk5Z@y zuv3wnC78rF?IGYr@=fg=lc7wCGfk9~!sJYpu>M9BrOGsAl5u3VLKzP|Ca?)-(?nYI zlqXE=DSw=oi9N-}e>f~#^fVqz0;RNUP9=57@^Eh$g+VWDV5gFHQmR!^PL5F+k7AbS z<k-xynUklZt5Y+_s0_RaN5Q8!xxy4a#ipjq;bS3QMd^0?>8ey^L?=lj)EPMOEXvu@ z**OY3{v>B$MMHK}*Y;777@1H-1xJ8%a&6|~+04bo&B-%LTaq$k)3N!5GFkqwhN6m2 z68-OoVMA4vPg+`%G8SiaW1&Qp8p}oH1EMf4$|fRp#akOovAh>n9I$##k^Jv!33eQt zk)AG3iOtqeiq1+*m?4;;Qm9O<ErmKRJyY~k7wvB`ZW9#~!MJ6~Y<6FaTam0op^m3- zFihnctS?=jEc&KXo9S{J_KeA*{~!p*X37*@8T>brf)#lEa7a#(noeD_P9wG7Rtm5N zD2iH0Oa-W-P&Z&sP3Ms=;a_d~T7w;6)KnDFVv}Oy6iQvr6wx>SlVQ_jf>_ro)cj6u zqPM2eBF&N(;-v`-S90=yP`(EIC!wVLC!whRlTg(ENhoRmNhqicqSOCfGnRjmkRnwQ zLg$=HH+Fb#O0Q9c)sLnthFM?4Usr#aE|f0<F@=)SGGfq6ZJLa2!c%ohGKJ6ZvZ*Q~ zEe&hw#5%A@{wmalIax%{RM{%^zufnUHf@%P%~f=UIyC`zqF(<Eb7NnO>P$ix#8>w# zuui=2hVZL>()LhH-&(`R*fi|pA*!@U)+OeYLXE^@F`($JPK~Ck7zX}JW`=hv+9kh` zxPNuVv1MPPN2by(_6s(3hS4#Y7!*l2X^p6W4Pfy{x@i=E&T490behsMzUi4N`;f{s zzN*!<6{b=*M5wd-ueKed_va$`q^&+w^62!~Z+nS0c=sy8FlAx>#F}J;mtF@`^<D^z zRM?oU!9&q1blNvv{Uwgj;cyazmZC^e*E8(+BrFUrEDc|6i|7n1QwveXS9_#2MS9mZ zt&hw@nJLGm^)yLi^kVXhlsyUz$>MkxQ+Wm()gO~CQq=U)i-UDy5k*|j@w3Lyk_)np z$3`v(LDN1NCE2m#L`i55T7lPHpd_@vDCf=Ou)`>$BwS<6Jz}~QZkr2~ggXd|mpdX* z5{~wr@L_V;g@aKN+HZm#&Qy|imSB{GqobfOZ4Cdg3k0Jiw66o#iSe+r1EVCg=K<G| z@rDQ#w&}(iA3lt>0wv*;A}?9w-4S{BMP4(k)8XAZ3zUT0j5RboZ<|0#xHVWOfvHEt zZ@oZCINF<(=S2#Xgu4I=Q-zSbB2W@ejkO6pk9HR&3OWUasXfTO6(|X}3u_5@-d=%{ zaDy?=PakoYWLrTHCE;j|EYHKTK}Jcq98kzo$c+^!2}d7j1~J~x0wv+-Bg<gMqt%8) zNx1EpTj$;G7AOgKPvkumd2KNl&daqEC<!-1<jod&M?~HUktap6v1|+Rvll1{w@u{j z5_tho0H!@57bH*;t^(#Ed0rKPf?a{C&E%d5l!UX#3iA-ga}X#A=Ltpea%}`k!YvVb zKZv~ZBJYC8D}_L%%s(4}l5i76UarV{1qw@55a+i7CE*efD9=k0C<zw>&#=q~KZQU^ zI7J<-4Pm@~0wv+bf`aitZlXX*xK*HFDB%4lP!cX56buEtvjQdIUV?&ofcK|BNw~^( zv}Yjkstc5a^8tm71<y~QBwP|GWEgm90wv+T0|f<xH%*`<+<H(@FnF5<O2VB4g#f`j zBTy3V2`Kyr?}b1~xE1!;)Qa&|3zUTI3xf5n6-QX6R{Ho`b-(E~o>jFU??n~CH*_bc zM;(>r?i$5Dw-u+Ua41R)_u{#kIqj9Af0^M1%zwD9<GD9}Z}Iytu3`wS45C%FCGyE! z7r$b#D#o{iJ%C@voU}xHtGuOshS+@>b4#u&jH-;eHCGi*%a}{Js{e<*HxG}Z*y6uC zBtQg&1VO=dz@Q*ofB*qe6G&j9fkYA!T$luskVr^k78cjR0D=KUMMV?^S8xLr0T(nN zSHJ~v#~pVN+&A=k<^7yf-80>jpx68Q`#tX;Z$Hn>xBAq6>eQ)IRo&HPat=`|esNYu z9Suw^B)tv{3LS~tHYPS4Mudnf25FLX+s4FbdXiS_Caw61G>X5(G5+R09NtM!1KNKv z)*|AX@EwN4;!fi?oS&cH>HISJjpCQhcOORc%i)*H{TOg8cn-hwaE}M`_)WlFz^{;B z5kFq%Yf?;^O8Hgr<6VQ8>Ci6$gZRzjH;3O`_<EJqA#T3Ac$Uv|_kaIJEnl(?9hzbn zA#_BFeeXIDMJb*S2tWy)?(f96zXf35TA}myZ9?dS27L@6bl*4PzMp*`I`PC#z=l}b z))pP5?52AmUZHDi#J!w>>Gq$_y*s`?;=V(~{ccj`QK`_iKH`2B_YCZzs{j|`8oH7q z?n55`zvKVs!2iGj8Oz<5)1N2uZU}EPS}X8$%Xb?0Zh3Ua{XgNRdwMRXd=BydZF%UP zo=f_6H-1t2b+)eR^7AitWR#W7Kjs#$>HLeG7Nw_rV@Bax#=qE%_>!zxAyHNbD&SLB zS6pI!M_KY!5e!INDY!bQOU}OSqApIF=R_Xy4dOacU2}1DQdcpvk_jdpu6*N*D^FdE zaRt;RXV{Kc*Lqw$a7TKai>c?2M#+hm*11aKY)b1Kb?wJBPF-@o?O1hnz;(8|icv}v z)ioDamAV$=s#I4j^NwnDb;Wgwx{7gKsxJS$%!Jsp{k8j2{B>yw+5WoVV(9*PX$d}u zu*@cObqG6cLZZL+l7vL7rs<xULLoks^%C5w?qF`4%ALP%hrcc}q3dqkcCfmItJR&E z;B!&81cfSBzxvtrHLv^Ya!Hb?cAzcf5c2)l6lY6NiX)f5c5_PL*%!T+e_n1vT&R-N zFD)U@Ut1p|HPi~_)x}8;#aaxhHg)n@HJvgE+10;*$1tVL4FXi3zFxYTe{y}AzfKHn zt9D3KlS^9p7wC<qrj^*4xuB_dKk)&7a!RtLezjYhNM?J)evv|TZL`igMQq3Fap7B9 z{qN`VMWgxL6J_$rYqKsT<`j#RYg)k0WXRUuSaIR7sC%+i-Tb+<gdtITn+jNM*783W z#)~6yc73%(OIhSZOPPv`@~2RnBrQ3-N*d&ksruUt`i_(uGUzL)VUEC{nh|=tB^bm< zu733@T}AU|&hp&N@!ZYz-0>8+lWIy@?XD>5HRA6!s2tbXpuBriq;v-nss#1(H(f^V znROJKcCX8h@roBjAEKPyK$KOmUE(}*pC~5(0{Y<N3rTUk1o+{8f8G29(N2CjdK&1r z**|YqLY`7)**?K#;zN`9{dFOl)A8vfHZ9z@YM)9FJ!f6o7C&+QvXeypIQF)-DfT^g zLhf?l03V@9OQ`Pms#MRfLN79ch$Tt)T9B4d;Obrx0jdv0%J@bL4~KVTa^T#wSx2l> z<WtgZX3ICk{@W&#ctu7FMPyWykhx%1f(Xu^6sGB(MPwE(go$tpC(%)kV)THf-)7zX z1d+Mujj%#GNWc0bT({!dGAm&jAlH9e<hn(gMq|wD)@B`zKw3_Y-8VK`x9X;Q-ou6n zCn3d=R+jjJwfo~P``g`=FHBjFqdy!y7A>v1N4~}5&FC&WBSDmT(>+HL(Hmq1UXAi& zs+3S7p3*!>kB|2o9V&vHEi!jn$UipHf2{boaYYb<NVKAzfJB$fg>CaSNtI7g*llKC zaNxiJZ~8-=@J@S%tD!C#r|3zeQ~Y%q$^P!oFG!1xA*W^Ju=hkK?&SJbGVUxkF``qG zjbmPF@}6h^IB+1Gq(l&*5nW5alT@slzuipJ8f~T*dDYBGe{%g)&Gh8d*r|Uz`Cy~T z%NuV_@{S&w7Zp+-P4{HF0t`YsT+-PY9_u7Qj21_%nyFYFO?XiiNl&cDONyJVE#)Nc zpEq+S9;#Fj_pf+^Z!*cYqE(kckKS6>c-N>o@(Ho7!%PpUCQ`YcRKh-O*40Ztlm7DB zu28;p^CaJSQU7JQnIdhX?-7%fWDJm4jp(QK!ztKe<S691l7rS(S#eRU;q5G_r(~<@ znFOiP{?mvV@>eQwy%aEP?nJ0bxN_~mGV3obUQcvk)6<HJ5}pDnwlA%2TUy;Fl$l8% zHEP#MjiXhKmi`1ua1#O3XvVFIvl2Fgbk|7p>gkzJY0|=wnw}C-ay}&!X{tHaDcC8y zpw+Z-l0Bs*zJK4ak`I<NRD2g<N;?DQ7P4{Fexm51!z4>_6&=vAK%5TA;nv9;+bpOf znv6rc!9Q(;R^-+w&w8Wb_7mIie15`@xYMA0t0^wBQ;uN&V|IW+hP^dS_Gaxl9qrd> z4vol^(|30^%9%WRbE7G>^Dj6^fp#D$Qj2h(2=z-dP|K3dpE77~Q^dq(#jJz`_-#hv z|Ef6>NWIOvMF}T>(a%f6G$lEw!4O7CZ$a9|xJHLtQ$ksU`qL6-m=ZofxGq#R$k-TC zf_#;)5fPJbj!-9w(dLP7k7HyJr%j<$!ZFcwcyy(J4L$y(xUwepr^Q_o<FHW7F(c99 zvL#xa!XSh56J*a%SU3hWEadALp%4^SO86Hn-1=8#YDSr;<%@)Cz`|yv->{dyP9f|V zHVY-PP4Tj@2MILv_!Ab&g2JD&@N6<SQkYEIhK1s?Stw3np~3kHvq(=^$R{yv7V_b{ zPzVYuCHxB(?*6MXJxdy17FLI(kZ&tC!oq8zGLnmY$F`aMK0y3^0;XRae5_RyJC^8w z%B4O8XjEMcB_E0HYNqZ+u|bK$gCz{cnfVE=aHrMPqeF}YMQFP_95r2MiRsa1woKsu zhH=3sN2SV*7o`!yV3sr4+DZSki#KoX3RQ1vFFFCd1HG|jPHvPH9nvr%k`7kE7x%nP z;(L2H8uhS)#d;;omIL)pHReU_8S|e52lll7oxkUP6Z6!Rwl<jwc%vEo$@p+44bz}c z?j7c&Y1-qG<DB7yZ(%kx1^2cyj5*XPqKuWY@{qK*Rd~4A`?bGrzrXH9ThcU)zix}f z(HU^R7Y%9V<_a=tWQy%wFY<}Wmgt`sqcitJf1OU6vE9-V_|ugqnMJdL!~%-Au;#dJ zvo@vJU)L&OUTO#DzC`Z3r*;q)i^tKdTGVd#H7J2=eqXy!)Ajkup1EhN)Yo4ZlTeq^ z0Xw*BchUH=Mx~^q5$Uc~Ey%s=fqKZXxMIm6E+U76)z8TQ6vLQ|s7#%uX;BQ#l`P_> zwYP7`qm@LWQ&@Wkh07IZm&=YM<%+B7X!}QVBN0hF&J@$+lbO(Jo>O8kPeMy~i4ro! zPi$64bcwFX-jPD1jY4adFe9{BsKM*9iRWH=O!03?39li(qls=w>8e$(-JBS~truTR zQ{_Ug9o(Foxo?N?NS9tDu50OKmw3=wM9!qNT5kSAWgLsAT51L)EbG67HTd85EmX1C zc4kFJT)HA7R<f?h2!#~YYBu1k$mF32#8>!|D5VseF%6ccVIqf8ZMtVY<{Lar>%u|~ zD+Nv3%ofX9^krITGB#G@Yf9mn7)Q`I-E$GK9X4!{`f;bs2z45INLoU%F`3mVopcug z>oQ^;HMvL$l74YSN&C4<+M2v5f1Y*OF^&pp%8(m5n>2N#Y_Bx+mWCzKJgl(4JqM1H zO!zrdR#^#2+asq5nYwaY5n1c$La3lZdGq`%{E0gywsvb<sbj^w)L0=+r$7Zlz>!gO z^2VCO!U1)$FdT4g${3aj9RF6eTXjN;KRVGQbj~S0ig<}DNE17+R;DfEv~4mI!fjc> zv@}r#0%qNXt)<!1OPpq;Rw-yjvj`=vJl9S`3S3Y$&rcR6_dKT>xzQV?eI;O#%$kk& z=^J-7bI9{jl^;_1QL@gmkf34~3DP=;uJ>zPLvRwvl#sI4CLskqA>AIS8ehyfQ`|a# zjEYn^dst?BrLa=ttKC)a@v|%BD)FGyR+nAy-}YCh#Cfg+XeOuJ*ey>;1w&=<w~8oU zjKhq-t_f1))Fd{tCb6tVt|lY7j8VEK<XVeM%83A&^)XZEwJGP-?jKpx!Hy|kwOB8r zAiS5z>HW6J<aLFl!)kBX><TFs<mf!cTPHaNLlN$^8O0}Wy!3B(yJ?MfJ3dg}Nc!D3 z*48`n9;exB)~J|4{_4uVoi$%*Y^2A}bh5V7uBJ<Om)Telj?fYU2kN!AnQ270t4&93 zN^3a1Z2(ExF`UF?RcN|D`l@9FLrVO07;MO*zizHXR3UN4@Yl@~`g1W+h8^y3{sZ;& z!64oTHu@LjCZx%j#+WG?)Lkdhgn%u*HLY&r6Vk*|h=Z4Qu7*%8M|;{i`{(&PNC_+K zwHoeydS6Gk+SLSg)h~Q28!zZSZ|J?+QttSBkMl-p7(mTJVTNG{inxIth#5F@^A3Wz z2YHXZl_<HS*jAnvnm;pOIa`JVkWt+)g05j>HAA^!3oj*eay{`g*$zuhaA@ZV0nd!g z?i+vE84dvBO{587TB4eTE;Gb!b=2<5mMD3DTEI{URnZK&7-`9}qb(lAwbSFQ>dxwv zQWYbqZC0hm)z&B6{J5V$zx+z&QpBPrFrIRUGX)$14ndo2+%HSBLrjRU?NEJ)$Z%A( zZ|^|yN|e^tz!-o-YC=1Vdk2WGu<E=BkI>k?OF9|rT+XoCoa~ZGoSn&7;wJBHy|<Ow zRmwBGcW;&*%wDS(4ye7BfXijCi9m?Dlu4S+SYcTjw@O$4+WKN?^<sO&J2X?~D}UDG z#}iTuQoHqd0;TQosqN#nc3AV(8pPYoiDS)e7ZEE%Y008S1CwRX>sS+w3^7rc$b3!` zXs{ys3YL+0SW{)MPFx4JqKm{~I#x2%lM8H$lqQ+Ru(yN{wKuAy>+fyp+O;ChWzekZ z7SEZDnW(+7wu>ENLt>M-S~iKR>C=+X3c|w)laSm{K~Zkvgim?yun$0!(ONT=8+%(h zugxk`bo7>xb(sro;f^bMOOn>Oa>GcY(w;1))$S(U&47ovRs4O8f26cZGzr=*Y;3$! zp~ATe=|jo>=$XqTN9r_I_&Jv4{U&;+qa=?As8KeSGDrQfaaZi)s#qs)ql~!;P%~Tn z(Q+fZ4B8>Ff}FaQJBjJT3S*tbq9vRr_WQ<N9h}4%<m|+L-}q5n%Z(15ti$x!Fg=|4 z?=58-Sz$J=|JSlh3Mxym{C{IKADnE2(QnvRgUD!}VUQY+#m}W2iDOoRbk8lph5XCq zh%<U}zIx4@DN+>*n35+SA(K!jw;0<JlO!;B4b}1x^@)ZCK~uu%C7WDLIqHIvnI{29 zO}dEw+Kq{IJ5-z~zhD>3O2Kf&NctSnIEY-CEd21-HJ4<}HC3stZ@zJNv~6-2q8aGt z`D5w3L2|LGk9T{tSryCP7?Td^QYy#)(>@^I-)yAWj-?*{1?WQQ23`H=Q=gPT^G~ab zP46d*bU~$HI4Cc)ahZ6;Ii}D%P6X;4=S(*C9uLnXqUtnpNL$PmWMzf=i_@uan>i+c zu!wN<8h`XwKeZ*?Vs}*TMS}MBkOGd?l<dA-?4KwMpRfMm*b-VY)>M%9u~qHl){wP# z9x^v}@56ht*h~=*5iy$WTVP9yE}4+gK`fMd0);J<@c2JQp3+jw3Q@IZ(XuWjKZX|n zf{K{OW!w0NyVQp05Evi%ER;MS5>8K&^GSu7$>~^?D~W`Sce6Y-g%pSIi?M3?mj`%b z^tnUhYC$^>R9Yuo^1OeH)g9NV>Kcw~wz}k*fjR0Li>s%)3UOVju4-Jp)b$W96XQu- z(v~q+JuVaDC0z5A_8u-1V-gC&#Hhw~mHN)WWn#$J>Sb>&#<~HQiE#wl+{8%0HD7(Z z;W9A>;98)xbX+C|--Wkp$(PuzlhyZqTra4rgdSjc5X99=X;<MgJa`_L$xXg$d$sz$ zhs)&l11=Ny(5B`+jTlRIdraI*ahbUCW!q~s?lrhf+<S1DxG&=xq`vYl(kbeaHIdos zItrHvW{iGL*~IM$?OLS`!DVVW8kdP%6LQIyaZM^Kab2e|w&A*7UGLz!QC){%u9=jF z;1Z=6V_k!5u(}?@Wm4IM>n5db!DV8+j!XJcjP(gFQ<iqIPK-{tZdTtDaG4nWa4k{V zP+TU)EL^uJ?fMYyQCz*1_9ZUEs~Gn74X=*HW$HUT<eH1ilzBO>6pi~5E>rq<a7hn~ zu|C9Q%JMTVlX4u7DzsMLBXOA)9E{7vt-!TZeQR);xOE}lM{wPyzUxB1&3V1Y#BGP` zcJ=Lu%fvka*D|H`$7OhM11@=oCq_>IHYIolnn~pwT+7w>M_eYAPKc}V?S<<O_3ekt z_@>~xQ)yYaOdfI;u!#}Gb(i|i#${sMipy|gEv`8At;c1`a_XUu?^s;&7Ez2f0hjTe zhwE;oEyiVXlV`k4dd*?2NiQCki7^wG@x29?N$>8E?~AzZ(e&QM)k|H8u*bwW9hXTj z7nezIbIA7tTqeEUA>TFxzgJT^7MDqH3@(#i1+KR0dl4>^-V$7fSMTFmp}rsE>ZvX{ zO}DqYuELd~uDfxW7*FF`skCQtnHal5zCYr+Pknz4`KFS+i8~6{{py>8%f!vY^?=gK zahcLzgX=-1-4>!fiR(0_y@1Q~g?DfjC{0ek9;&YIaSd138||DJyK(hZ+EN~yHD$RE z*F#EMh0Byh9<@$YS_&@1gZpr$DD72TtJL)oE>qGDM>y$q!L?d_Pr_x=8;I*+r47er zVzlbOx5}0FA6z}uHL|0V$~m|mQCa|(N##~tCft^gEB8qAc3O-z4p)-KxCWQ0+pV}B zRoZe~CY6V9tx?(rT&657cr4w-I0DyW>U%UU6QdihwMt9IWnxUjWlFyh*GcNT2UmA> zbvc@|aMd*)*E)60$F*Kvx8ZtRUC-cpLS3)oB0Bx;V_Y@r`U00}%VEb@R)3{keXM0Y zsjj8COj(}6MF8RsI*zmV)#b-!d}rg@ptMCH+G<>;zMFA9t-jlEnfm_jb9@i!WLeLs zZ);q}_b6QTN;?Uc$)m8d6QdH>M)jSB%fy(4Ym?ICtwIxH#_{H>>@n8S2~ON@xSrK; zy>OYhC*#_zw9|3fHNs`MJFAOjU8cVCa1B*g{0Zhg#2D*vT>X?LC(rei&&uXkbFbga z(W688K#krzhtuf|f06e-Us-vzFW+~zedH+dd>j#1$WWlyu)*hLSC;>sceoorPT{Ze zv9tRh-jn?QMt<i`%r85!+E<)kR!~~#o2nlu^C>gsXu$IwcK&1a8+nees$^1`e)Zf} zR9;h7V6qsM-Z;I)e0SZ)$EPNh$w$+DRmCMm)xL>DttNp=Uu9ucc}?ZSLZ5sD{2wpx zXub}WH7YkPW3-)RmtrwSESv5nLa#0^sZv4o6_giN32Qk<p*p{$%$Hv_LmBIow<=Ut zk)eM|ULAgw)l8XCSm`S-^2s-#ym|eT`AJ%G{Zr-7K8PG}&_l^YUzfzB(&;^XoD0U; zRfXL4<<3+!P+k<UKR#dO>r&GLapH@E5Y0)*d`Q|H-mH;YSejnHzIGD&5&5YlmDQXQ z9LO&ypp8hxWTt+Sm?7A$7H;R_{3_bk=P;fMn2bEl`;YNQ&cyL`>6Kj7!#6eGDPp*E zJ!tVF4jB!VHC)cd<gsyC{3qK}yLhONR{88E(ki$)^iRo;3gbU0kN<Rfh95He`Ht^W zikQ0F%LuL0suL@Ggs_<uis6%kXngwGpf7QHm+1}st7<0F;j4;jN=s*G;6hQce=Y}( zHv2y>5C1ej-Q$0Oek9s3<e!o!r(0L>CD&4VcFCmTYRTcBO24M6(5Gpmo+ND_+Js}~ zv2Hk)l_SfY9G!B6^}3$o98&E6RC%0yit?wFAU~>ZjELHTW;ftJmEY*XNj0T>OmS#= zX@M`JnqhvTx+NR?R&)HP^0SNokG0=Fot}K4QNBTIz7#yzr>)H3!gv3CUFgV8`-q9= zZkK<GKmWJVpP(O?^-U`&s4o5|`%_elCRU5eW))FwnpkbFYgy58NVF9nHOgvHVOlD$ z32zRIU*DD$QM^dnx@`*+R_-P4XyW#dwvLWE(rQl}4KvyfLwd%qgYn~Grnt_nDq7}+ z(`15ZrSpr{>|W7-^Y;`vJ69GfB+hlA;{bD9?z>%XcbGR>@pCR&19Yx#QI5;9wl)j9 zPYFA9e(c<yh9jC8s#%GMwpi}7&QuzUPgaV$;zF)=xXw}<O9Q$R0gpm1AFe`v(H0Xy zeJecL>Kby%3c&^HEAw-f8wi&aawX#`RoW2#CG}{{-MG@YFH@SIf0>U*>zPW%mCZek z1Wjg*Ql4mi)7!Yt<9@2r^7xnec(ks`7*{d()0HN<GhxS9(lV}UTo)-#!Y~oX_mYq+ zi0g8t&EnsuuDK!Cd|We?wvd0}L$q$x8rNd(Yn8@E$AMH_!ixbeiQv{6#?RHD+zBV5 ztZj)$MJG+|Qd)KOtur?J*F1m1rVmTbo7rabvSUUD-<qHFV!LZEpL*G<FOT`{tuJnR zpmhJ&-?abqnx{XA-g*A0zK5K@>XZ*&Tk_Gg5iNSjVuxO<&Z_un`OKCVIq1++<P^(Z zB?UiR5fde^rP3xvh56OJ5)&6jMFnlj)bi3^Qwl5*Y(wdV<vg)^s)&M?J~}GVNic-H z^hD4E6?KUj9TgkEJ_-4Y!ww^jO3o5S+Q@tLs+0+zp~V2vQ5E!z&bVq?+{HSBbBUi^ zf|8$+u@#`kQc4g0>phed?sj@8W4Mc>Ny4$FKuPpaq+PQ;l-r@?c_>do35F=Ws`;Qt z!W0p4t0}+eC?94264w{A-drzKbBQL2J50j(lp~h)A(Vw4$`4S!^-!9TkB>@+%iIyl z^ib}SwmhM@terb$d7#SI-c3n^A{{84yS%fq%tMjAsU38la2VO6TGqu)nFFPRr#v@9 zk;lqS344W`R3C$gjvCua%E*}xO$H1$u7sQs{gRUU50pDmbLbpHNsf!84Dy92IINZA z^=+s;Cf2}Ykx-M4Ilxy!%H=~^I83s%P}|0#2tGwR=8`aSJ?EkDk=oqi%JOO6Ft2#R zh~EbdDDrBExtx^c5j`(O-lgzTj%z@X(*eC<PH8}qhYP)7CO4qSuAn!})eR_jG@$4U z{u<4x#f}DHK5szzw@nGl&mnaEU8EDH$Ufw1eql;a?#$)nmD+%k)qrw-14@~Pl8`>V zq&lHrzw4k%uN3)UH<r5q@))Mv2IYQM^}`f7r{ozA<q;_V3Q-b<=a-Zw^zXBcA<D!u zdG+u6W&|ZEd3qNoOt0zTjv>Q;bX1Uk5siJ{{`L%DUmM6vE)8RG<XT8W#zKvbx|RPE z`L&vR%~gPXy=KSKFiMkCROHU2Bcwl|NLLJpIgBp5j5Z7FmVP)_cqsCu!+H;;3d&Xw z<$5SPJ(NeG?DkMzgR<X4`2k8SWddw{co^*L;Gy(`($z!Bfs*W@R73H5C^taK^HA0b z1rZ46^)?jIHevq!0;NNUKfM?kt0$ClZ&_@1!g&cT*Z1FdoMc=9!Z3L1rD4?7j(ieu zg;PGsri3|v8k8QMFy}%MJr)i#6^hsu;dHKrGQ<<+ewz{wvk{8l6Xs1Q75u_=|C+n$ z9!fJ32zn^TNs|1+u?BOO<|$7$6dB;dWiEu0?Fn-!lsr$EMNr0i!aN8?I2}&sUr^%s zg>(OaJD-QLpSwH{MfT4nFNhY+&($5ubTFK9Do)8O9Ohgovpiv{?O5S3*Fah539}N4 zb2ZWNtKXnLNhy$EBe~1i1f_poBqe!8BxTT!2uk0+9Z(GJbo%y7iKGmi8%arC?V%(k z4oKP`K^d4RZw`i2PD&iuziT9AKwczekmv+=tmMS{5T)0Iswyg=m&^mBqsTPk(vdnb zxsQ-Fj2ZD0lLv_2@T5FY-Y;=e1|^P-r1S|!Qj&IfDSZ+XJ0Lu+bowMFB}P&P1S2SY z66+%=eZGyPBqgIM+$r}NSR6@7UKT;=o47lYG9Zpb-0Ae|n-@t*UL8S6>bF0VGAI#2 zb*Iz6kMv9rC8;8k(tmX%WuSBuSFFARll>8t<o<b)ltC*ZD1#E~BPoMoQID>a`_UGW zl>XU~l;p*cltJ|ols<i95hr)beFn-CDIQ9)9H-%?^i52Npd<}Q^iq=g_6<f-`tOLO z4D7%&C9af{`t?nYr1Z;<q$DqnqzqaeK}ky5A4%yS*UHJOS7r6YgbX<kNKS^89tXqK zmJo_%TeR$l3z<v9SQ;zW#3HGK#(LR~rC~JwXEsG{npnLi7Ei7kAS07`b}KrnSl#Zw zUx*?5y=Bz_v!olCSelQTfEGHIGf-4gSX!X8(9xVOn(KJZNUFU9;UNcflSj_n3@2Mr z7^brCSUICHztAb1E>9`9*#dHiLYc_vgMku0IBA9M<V-?HEbT?m%9s<nNK*L#6YB_) zC2NJl+1(4Im6sKU?=mD4@yn4Nu$;nDrsU!K(S;Y*6jm8Rc%jkZ_oPCn><-2Lq^jm` zH;VI>RVRo<vS}7`pOH1CX(dzD#XbZFv|B~h0p?Z#{fMD+bD{T+FPxN?mQzI&RK8^? zZYTHBlB()JX?gkNnhHsH*hrW;s&JaPO$7rZ3px0IVwFakQN|Lw?*C0KtgPk>nx*7# zyd{EuPK9`dlQq7%%`UHU-KEPX@rLt#Q}`N+A(MiJH2LI31M+CNo?lfM8G1xv^;tQ^ ze9kB{-IeZWzA8K1h_lFsZ1n^Rq)9_}vgc#&q`8IP1*N4L&<c#s9Tpf?TsU!ZPIdmo z$z$>>s|-!VU?^oUcR9s1)jVKPW(5Kxa{Rj6U#YPm&?9Op`4Vbiq9nt)|K*cQ3ay0U zvO913fZb;j`XnVmml;f-r2dwfx%5dIU|fA54zv<#$`F%+gizVFCJ8zfi6lk_)oMlt zJ$T&{&}5@%A`Upz+#-1s^6&E({(b+#zu#Z@C;f$g|G)4b@E86A|H41{FZ>7ng@2#F zWZ<805Q$4GtTM_;o;C1@r!;|ff;5?ldSoLqsO4_>hMq2239C|96c;fvs7udAMsRyI z8ckJkqp^&S9m%VT?eJb==uSFjNHi0@dOJk#(~#~kx<Nt>8SDw-FgAkdD!F^0aFyLd zjtuUMBaz`9y5trfUqbaV_4RtVE9UiSyk_Ar?y9+|c46)D$~CCjrESEcVH9UbYZ%Az zVSv&P9tBDZrxun*=-rT=r5f7Nzacxyt#*yVZPB|=VzSS5^%>YFDLE;5z<_=(B2K0! z0|pH6`H}|?9F(YDc`XX&w6boh9Z>W>3(_O)DU^FPUhFGbA^0(JdetJ%S#8g8Y_N9s zvIfD-DtV=$WD+OEiW}-)l@}kG2`8>KVVr*r=UUSi`ZXhX2Apu+|1hDFNzZ3x=ebw# z#U};({9Im-xaBZYNWajm>=gH^u!OsjHSWoWn=o=O7vbvNt7JlxmF=jLqO5N6dIgvK zr&x(8?sYMt%Q|&G!ra@#ggf5}=UT;)aB=)HWWnEkwMaC!v29U{ml(X`2$ye%)qLYp zQbKKS$Cq%E2~!mr&SfJ@&^&&Z+F|5gFJ==oeebmN;i+e3=4NIL9o(6}VIy<XI(w;E znQ5a^N2cd=_AwRJZ_vnE#AqujUefvd`^FL9caRS%CiU$Fl_#Hv#7kj!@K(!-)(=<6 z+bsseUt;e%x|=Vnf)DqUT*L?ce0+snzm=xtx~Pdf9XedgC1sQAC+3+0z`fuNM=DAF za+CTR(^rk%qph}a(%8-=4P{>`@o{aercRP-u~4e`_!NRKB3xFK`MRFf4x%4otrDw~ z`pQ_wW@UVQHq>g8%Zk$B%^2+BF*fAEQyBsCRbfp$505`I9h(?0Ig*4)T)qvU`6WX7 znVrn6sER6i(xQsT;VA{w*`0(cyzRq7_3`mOXz!fpltD?^kZ#jV<U7t9vnwQ1Qgf`h zq?QaVilt@ABfn<4)!vGBxS<P#tMTU&p2)h|)0!e*hpQ<q)HL%TMl(yziV9RusR&q2 zn6kRlco+ZMX*ez^XfY`3g)oZ;kTltfFi9UOX^=!c0rY)Qlf*)9pJMwdD~gZCRy7Fy z2FyLcY6zFqFOJ)$hf8QCi5Fd@eBF)TXIc>%-{si%j)aUQ<gv;LwH0(u3CpEIO{^@K z@;%XHCCIr%_GEQLHgY!G^m{EUDDt=h90ooBjszbBMQ=O=P6AhhHQ>YGZ155A2JkWP zZV+`CB#b<N9{dtyLpJzt@JaA^3c3MI0-pwlfc2n==SHv)+yq_#{tLVg+zKuOw}JP9 z&w~$uFM(^p?V!9L_6qm{_!{^Y_&O+K!W-bP;QOGQ3HAZl0c4jkC}Y7#;2`iba5(rm zI1bzcP659KF9+da@EY(3P{iUV@Imlr@JaAja0^IXgKvTV0r!FjKw06pI3~U+yp95! zgE3$yuql`bvZEP19c&Jc0~s!Yg<wmt3Ty?|fNj8wz<BTyusv7@GHe8wfgG$Gd;mNO z6xr(xN*lxbpzMBh0e=Ti09&ItQ7=JR6J$6Eb^{qMg7O_LhK%3{us0~*#_9(KLE0`j z8)PpvxD*@=ZU9dP-vmzqzX4ALW1I2}2G|Kq1?78MLqXZCVCOYh2&RM6Kx80T3ub^< zgQtVb!Ax)+$k-oz9?SxFfhe!w4<K(72Bp`G0cGXz9Pk+Md{A~6#)AXF05}xP2MfT7 z;5-nS3tkNtfj5FB;GG~c7+eLGf<J@hU=)3(0&EFh2p$Vog2#h3U@vegcrrK*%mSx_ zXMz`l=Yf}iCE%r?>;hZ{UJlL#uL7?CZvtz<`@yTgwO}16Z^vB&?gSTt-yv2{@rxW= z+R(lXqn7M5-q^_4qRT2WwxkfqxndoMWihtMsF4lDJ8Fnt>I(J0(Bg>%b7^r=!=kaT zi<2fa->6mXB)VxoKj)INi*7=nS^I3_4b)ZYb0gReycHDxrC=xUcCZhKo(P@{E(bHg zyTEh7yFsz(R)7mZ_RE9lDeFG)J@9_82|D5dkp5t;0&~IDU=Vy5#Ls#Z+zGA$W9ZXs z!9;K!D7((<!MWfQ;2Q8*a2L24{04ju{2kl^O51D&r43)@7ukk4LG$sumfy|ZHq_}$ z$Uev;fOC1<P=>7vyslQB%d(LUB0fmJpD4|MF%Y6ALNx=iV<JeC`9smGt2L;kDH34h zLQM$~id;zU0XjVH6yxJuQYUF!Y0L9$;xF*PhkHMG5{Rx24g`M#Q^5nEv?0P0oB;5h zt)NsY8oUT>3SI^_1D*abAi~y~i$6TDX7XFo2rr$fopcGQv2#fr`?9-49=C>_4)5Zq zz0~pOc;RSe;e{cy#_-s~HJ7C$Toay0a!vX}9zW-jvJ20cLg=od&>6>qQno`usSc0( z1!+*eJ7op?gYCd9ust{iJRH0fWZVl14?2RvtIhoSNAPM6G<js}a(=fo!Yg~(^?zZN z*eb%R&ivFoEty<sFB6Mc`5^x@Jd-*^@{DImf>JLZ*b(dmo&a_MlfV-}v3J<_3yL&% z11|=7;v^`%=m|RV71>uW!Cz#0DnEG-(7tl9<#S}I`fuo4uW&WO7E#P1H{QP5NVgP{ zXk7U)V^&mIc|l=F-{#o`6p*q<@~SU&mHPAp+ku?tt9rIS*qwXqrC<&?7?i#_1S|o0 z7AGh?I1LnDiT+NGkT21z$3q_lF7@(iMCpu*;+)d*>Oe@jRS?p-VjYL&3{XKR^XUji zlMyl0_vGP3L`+DHGt5zLcJyiu+6Wh=o92;?yPG;wiblt>WdwFEsjKjo7SQJ;g`Ng) zr2grkv?DgB>bVi%8Qf=pq8m>K3&4?}a3LF<4|05J@M<s@Tmha1t^&t^_24<+yWqJX zwxPwi6dVYS2eHwt04QzK7k6aa6f-tSljMWT4%RlZ9L4C|Hf}5-or^|rE;OYuP0DPT zt514s%S?yn8jLy+EC{KFUsjX`v(<r2Lgzv?TrZW!#*0exnKL<!*>L<4QTO%<37Z1- zaSDfoREMWg2nQYAEjLnPA4GREx3&hwe=Q-o<o)dMn6}dp^<Q`<ZQOyo7j61{cr5JW znX+I4$h;xg3tR}E403w1>X=1fE%!Hp4}rIU&w#gr%rC6vphY{~3HrdhL21i-K<Pg# zK<rm*C5U}!-49~RSPy{M78di9;Ah|}unFZ{4Wjp~N5B;DQSf|lEhufi4iwp#%`Z|m zhC&maFofT22a}DEqDv%{bHzH2P`^!q@|XSAuv_P@65hF_9Kvr*ex2qEy?}B{*$P3? zS0$k6sS7|UFVFvJy_VpP9PdP5NnDZFo4oZ()7Ngo%IM&g5{-~T0-i;N_7FwV46$0i zOfPE>64nQKKO=Tll-UP%$yOd-&Lw4w)Xnc<4@r672c@nbfg)QUg9E@%LE#bYuJiWY zU>Wycf>Ou5ptP~jB6-mkS~Gre{1!LLi%<g-B6N8hSn4MUcz6-+JBgua=8OcXUo<r7 zCvtsD`J@crfs)Mkc6piaH;_pguchCO;I|-LUQ9FHt1%iy)}K^gxpVdwS@eDiY1ERT zSqvjtWBfMMO;W#X0-Lp?2{lDUg_XLTHWs1@Zis;?`O{Tl`S9?nrh~|~+8+dV%XSLu z2U5pWurrtjrh|S^>YV{fd$PXKfIpj|iOs`Wi*<EF{s?Dmh5P4|LE(>7*~K4SCWLgf zvdqP4(Yii7ycKQ@Rr-R_uO*&^wi(b*<;Ue1#b%+6x2b8m@G_R_f;<gq{-l1As@pcs zf*(?6%Byx>E-0yw0i}h;f!BlQfa}2V;8S28D16EXg`ZdQ8ysP~h>S|#JC>iE{9s>> zyj4`0E$)!S!JE+4P~v>}xi~6}lh9tqsier9AX)tEOUfbjj^WqCrd3gHDH|LP9tKVW zrJU12sn1pXBJ0x)S}T5H2QT#2hq}n_l5W}SGOS1l!9thoh7n&RM5NSJACV9rB(n&R zA5JN(3*2>*vP9O2GRwg-a%xjh>bwAyvR-Z1X+G|gBicx8tCsva@w@imb>cyk%6wG| zgbQ5_8%e6^s+6b&spp;0S;o~$nWUsvk?ka9iLBEi$}Z)*0Xz<5POP@|V!KYXBV(+0 zuiyx1q7&QmyRJc<cuzYJ?toQ)zfz6LnB*B*_NA0j%5fVgj9CUsnU>pSm-ZMKQT9Y= z(jQOacYV0*GB+B5fMv+@D7uUw0_G!-b9viBw5}xO8C8yiC^BS}kaWY6P;!m6ha?bL zr)Md<ly5UA^TOvqDeD%yPCw#~94B9EVos`g30xkolN5k`5jIgN2ahWKxl(O(_a>X% zK08rl%On)qzVK}62s82s>6w6t?ktAr-V>2-nFLJ+cBVtJ0wlqtFQF$One7y@bY;#V z*RjVKOIKuBY)<ErI#1_D`c*rdPJ0J?b1(gJAb2e}9z?$e%R!O#%RrHJ`mCG}7F+_} z1HJ&R0C#}*f!}}+fJcz_gJ2T48e|<=_ZZFtALTwDd<>idJ_*hMH-M}W>Yl<~AU1T6 zwL5DQxDAvx-VRC|?*O-gM^m5YLHWMPiy-rR>t%2#NST7nr*u!D3VfaWtH3uvY-Q^$ z@Ck4yD7uyUHjojq-CFRg;CDx(GEyK<LWztd62!S;9fumr($FbT8i<4sqNnwx38z4m z>*1sA$%?dLwvx=Blu6pKIlnYR(tQyr=LgiK1Nbr675oIu1wRAxz|TRc%NL;3`5Ee; z6w%i^#|R(HH{Vw_Qs+QH$wbpFmJ!Oiyj5<{EkuS_6V{B2sw#vn>mhxhJw>L6m|zmF z9-<Eol@&EX9uN}}ZS59+iRy#o;i&Wpsk4b%${udDT6BrfOg||LOfH-;t-O*4Gu?ZH z@=DHH0&&SYU@~aZ;JGtTz<8vNogKNPP$^(2U|&zjL3q7tLQ1j5a=VK5WCB}0nK!nK zHRRo?oI`LCTP`Vul(>dpR+PNr<t}a;0zPg6ia|D=K&E<LgKRhScTF%cN`l-zsztDQ zpjDU))l|V{rOAe)`H4I(BZyogk8<y*4d*_=R5Rp%ZN&Y<5%(WP-2Z6b-)E=Kw9k{@ zTeOZ`PJTbS?n7hVE;|tkDDo>zkv4eUrr#f9)>Iz=heCe{JRN)lJO|{Rp5P2{4LBQI z3yMDAoaW%2;1i&T$TQ%x;3iNcVH+sAjx!;HCxS14qU*MUr-M7dE5KL5S>Ws7BJd56 z{SJ%0wxH-bPLd3+0e6BM!M8#78LW3fk)w}5=7!eC;4k23;2+@UU`rUb8<hRfJ>W6m zK2U_|J1`66eI(u6_z^7S{wHu6_%nD3xF2L)!}<*r*=o|1^(Qa}{1t2pwu15O1qS6U zw?n{=U@P!SFb<Uc%EQ2QU^{Rl*dBZq<OIy%R<I-ZJa{zt4tNas8F(!C1;`#_@E5Q% zDEpgTz!=)|1W@$VOn#B$_$AQV@DsgwpI2WQr4k;;eFSl?SjQ34(V{3CC?nAZE~TXs zXZGUr!U^d5tH_*t4%34&OSyW2Vw3a+yMu|~V6YFE0VaWC!T#VRZ~!QE83;<9pB29d z9sM3O(f4oiyT8#o|BZ3UQ|CritMvN;WF^;?m=<zhU~WVA*G1gdyY55%RO;zmQU~Fg zG(@IN973I?UZ;TVz*KN3I25b^hk@9wRvO57Z;b$j2Yyg^^)h`Ta$O(U)VWb}a8a07 zV!LKl6qf0OIy!<cL(rYeD;<pwX9RaihUob`NV7Ysp4Vq%gqb2$pSp)QA&w<rgTbo; zqS55Wpp$^IFzGQ7B%A3F-3Fq2bcn<63VvL&bQQ#D(v)XSCd&SSj4rc6<dOn;=q5g% z)lNGg3m!ab&7mhko*O2YlsV+^BRaF;_cnrX9ZqObA;yfC1OhsyxC@7QVoj!7bIHVV zaVU6r=3_ZyPiVzJ>>sG1OWIS`n@)k^3?A@Y=adQH5a?aN9Iz{R0Z6|Kik|2R&I5ac zw}Lc|uG#hlKjI!C5AFrAgY{@<#t_x(toH`{P*>6p4ggODMZc$jlfa?imEbUNKIjLR zgN!k{mWzA`*Kt1*d<)D5MW3Gu%5yEFL1{V49App6IvYF{q`w5&8_@L*S=&8_`zhf0 zptN!^xBx5xg`1N>)|utm$Dp(e>x041z)G+QjIRO{KrD-3KX5824MIN*UJYIh-Va_1 zZU-*|zXPuT4?z#l0y~1U!4ttbpgd=CB`D9Cz}sL3SO<;*=Yu(*%=P7~+Sh=Wf(yax zz(wG#;0@qC;7uT7o}3;W{0dwGGG@s+z}mknXq!P1y6_ihqBErb-yZJYGLKWSl1(9A z(J4ft|9o~THXQ<CFKX*vk~9CLJfTbS6Zwk+sh?hSUDaEapy;g{5LvUPg2;l!SR2d- zXMj=%o+Z@%$csUlQ!xgsUb_^0i2KXH4dCVAOCa4i_%=wJ2R{RAL8&kOSTPG3id;kK zOS?%Qk#YJiFJE+8YL<mK;j*%1y3v0GcCJ{*!5&vUZ=DT}UkD{DDoV}9)wpY^zrD;V z_T_p=W--+sbT!~us7sGlg;+SH;vnm&qUX92u)#Q#2+^Y@C1f(hIq;b0PfXE;m;zB2 z-m;?1sY9w>MDMlbht*Byfhu0KF$?$8A&RH$^jFoCR_l0%i0QS2;)cd6AAEH#;itsx z#IK!A|Cy!{9wQTKPwofL=KfbOAN&ox5d1ed6NG=kJHTjgCD;^v9&84_3?2d=PTDQO zW57efZeVLr^bNLuP}-VDkb~!g><#L(EyM}l$vw8H+KnB+J=}K$ThafI1pOdssvUSN zcp>-4fpb9W8D!r|pEG0M$x7gUJ=g_&8$1CNd+;Rid$2p$0)F%WMGilP7P;4S1$_j) zYs~=fZcP3P%NUP%%=XWO&t8@MuLMp8HtB4kIho3v2$6R+){&wH@|HqSkG#oXn;lBg zOevlD+`$Im^$bs65{FBsXJ}$u*2;9%rZ{x3XM|Gs`1nQ8eEg8!veFrWk||RP3rg~< zdHPdE$qIaC9wWXws8;7su%CUMg@+O2u)QDx>aiE3vUw1{^GOQI@<Pva@-f6@2`ZLL z2K>dKNmO!EgTXz5zle7hHRKX@%NQD-rMic1F%cO}^m3+d0kV>78C^{LSK0TDKTjy= z<(QaX+4spOnD8T!IJvHZ8xnt#eecAtH`NHGFX!{i<@irE1rOc7Y2Q2Pjc3up9sV-c zy)pd1$J=M;Dj`M2h2{DD+SzpW<kilXXDySVCxPi;e=rLi2%ZlP0vVsJAt2+dK6A;q zsn1;A1g1d06HEm+gG0e>;0RCzECWQpSZ9DO;AAF9zn5n+bf0-N*pvHQki4z4z*E36 zU^aL*NEmAzSOlU^f)yaG6ubn?1DAsN;2mHA_y|}CZUl*=x~2qtmHWvc&wuH&ma-nl z+Fp=nN%R@Zv%xCvWs`6kD9;B@2Zd+k6%^fiDL5Lu9y|wJ1YQ8%2wn;<2Co8d0at;y zf&0PbppTZOjKN+YdN9}zya!AHSAb%BtORSo`@oC9hd>ehM?tYY)_|-7=yQPbjfeHz zzXLuAGOxBafGv=ir@=PhCXjioJ{KrmVjK78fiHk1;EUi4@Fj3A$l7Ia0r)bw7-S7I zxD<qU!8PFP;78z_;6Csz@H=oP7>^{r1Im{l-Ua2^*!RG0;OF4!;1^&PxCcBF+y~}^ zUxB6I*WiWVci>F$dvFf;BX|S&6L<&sGk7ofJNPQdIz#YtkWn!hkGwYlJA*OcNU#|= z9y|oR0AxKv#{_v^InpM12}4bW<jvr{jg1MSba>@~QNe71EF-XUxoi@K1^1jx-ue9R z4HHqSDI{u?s!UP>MyZNM6a5?>K)efVWd|`}<dL|b#N#IqX;l{#7GYiSeyXngcZJ+w ztdU`<!B``z-eewLz7!Q=tAA#1c1b12OYkt7+Ro9u`r(XEkt0Jk!962`u)!ZnylNWn zEQiOIJUk9I!hM3DbZ{=oY!+yb7;@@0V&Yxcyq=)aFSw-GVlw;qWknU|Pc00Tmauh{ zU#g?YT*%(hM6~>BsB$@4yd645E@u=OV2Tp*mo<O6obY15xbI~>%Y83$Dwi|L{19<} zG=1OgKg_;&(*HW*ewy?ZE@xEv!M=CGx1o>7<=pqM@16SGVc$FPZ;v(Mo%^pM?)x3$ z^`8-O|6IiVVe~z@ob<*=+~4E6cjiC4>^e$3>BBPS-OP{mOubHvwt~{HQ$X1dWl25Q z0~`u6r?!TH!@)Fg444iUfx|(OoeXd`m<e7FjsnFX&jRlR85e?&g1O)(a16K|JR95# za*B%1*Utr;BOjcg73>U-2W1T8dq2UxU>=wPP5>D%t%)GxmsJ3kfyE%>jm5YV`~>9O ztzc8+<wB6-H?2xgM1LyS4V(cE0(qAsm<C=9W`MlYq3@qCZUu|DzZ{$a&IIRySAb$~ z*MdCnWz7aRfOEj-LDp1*FM{*H_dv$I;1?k8hy?e6^TFT21z;5N%G^B|4PFb%*m@n< z1H2yW1KtSIHr8Sg9$PnqCEyZ}I$Fy>>SEmiQWonj5Vv(VcrUmDd>&+NAovRS0Qe^O z5cn(jFlZqQkAO`<)_{YZ!S!G_@NrPa<|n}c;1+N=xDAx`0n!czz!$&*kUWAi2EPWr z489J^H<sQ2KLXzZS=+XDf)=`kwd5dc(bl_QH}E~M7x)1<2>cK{75oSkUGypV0Qd#? zCAbIt8T=AFjQ+Y8>;QfZb^*Tu<-1DXf`0Hja4d+f2#S^XBRCuU3A_s256T$&Z&1#t zIskqE!Xq6^qd|Ee1zrW4(BGSZZNXUZIIsoS8*B-l3LXlc4z>m-fo;H2uq{{%wgXp! z?ZMUH;h=n@iFbm6uYyN{?}0~wUxDbf;5Xp0;E$jWj7G1}X2CXK0(cbI1xyA{08ar= z0w;mkSHXKg+A{bc$Qn@a5pXd0BX|n<Z;-Dl24zt^6&wtvfvI3RDBo!EgF)~N@JcWf zoDYry<tt5Rg0F+4!MDL&P`<@<HrNRq3!VU;1IouW&Ie1u@n9L42R;Z+1lNEC;93xS zFt{F^42msM3d%h8QDixCtv$V!na2(R?`h0tsp5DCW37Bk63#{Koh!mxk%Kzeu?WBR z88TliR8GXYN-QMrx{55c%9!Zm$I~lvE(vqR0v$nRkoQ_IK`5OyWSK6}E(+btnI-{! znm{ap70^vgV}1pA{Ous~XUF&ug)fif7IFHDymL+&8l758fn~r5hYwGE=Z1>I3EKfX zYb}(stkb|q8XGEU*hrEw#MmJ6uB)0cRr>VbtWf&yw8d;G2t^6cp4UKY)>Ud%Rn0d* zs<b|Sh#teqJs&;?q3n$!=91;Z^`POl*1;W;>7aCXxx~(V3bYx*!dRrubQpm@7JWe% zC2&0$=AOgtKt*NY)CN&sr8FnUN=#jU*bExZlxR{fa(}R-q+DC^H#LadcOF8S_JtGP zK|mugrufd}UraVx%96`5ahM8v?spoFh5TQl+sW15p4g)X^m0t1`|W!ty*Vw7zubq` z>Q>l+#7p|Dh}?DjWPMq#Bbk@Tdel*1GI%tY4zgdW^K!;@otOK-$<RB4RUqr}x>nm2 zypnsKF;QEj7r2T0Q^8lk6i{r8q2Q_DFz{RuyC9ecjsRtT%{pB0Vh}qaI0rl(luh$9 zz?;ELkU6csGq435#XWOLeRqJln!Y<g*{vMtB6?%NA)vf7AhySOAV2GTa56X^WPMuS z8DL#n-V4w*zlq>d?&W#wmEa`sIj|Uf0VJ-j`IUm7bI-nmz6&dB-G|a(tRL!LFwfQm zkLSJ`6dOa<zSBWj^Tuwmri0gjvgUmgcnOGoVO<K!`^=YtjMKW-y$=j>&-kiq-O^#M z<USt6ZVDa))`5&O)_m|Z@EULoxDZ6&Ti1c;bBlRLa2_bn=U)xp04@Y?0&fFv1|I^K zfRBUNW5K6EcoKXCyd9K1h~?m~;2q%M*a+;e1djsm0@=UT=lJE+Ja`yne^Q^{m-T=L zxGx1C1TO?10hfS}g7<-sfimx32iAkEw+7z_9|u1Mp8{pRzX|LQZU&1$+9-HCh@BX` z2YeCS3BClr4{irVcf10A1-=e;WsH9V><7LHo(9qhgOfqlb%WEv_rY1<2jFt>L+~E( zWAIz>Q&8SH{}Ma^?gRUv5558ifM0{6czytfgFl01;4k2f;C}FF@HbHO$nRhr>hl12 z5olo}Jq|VjKLVSAUxCfR7L3ucU>mR%*cC(ugFV64;6N}A916AtF8~h%Zv<Im3O)@U z4#uK5I)I0Q$AU+IKJa+36PN;a28V(PU^RFGI0Nho&I7xFSA#vk`@!DeI<POe2}}aN z205lb_#bc}cnJC^8SDuT0>#!S;@3A~FH6=1g%z@gaHrSSD5(lmRmh<avWXRkzjMJ# z=fcpC6$>Bt@?*u=3a?uxLUAt1NAx4z%u29{`{;U-_gA3g|1Bux9DvS=d>2!mU6K7Q z(N`<H<<$3loM()rtQCZFE^k@gHjo-cGK2;R>)KWqGhi+x&jN~!-wPp{2b%OyJhfHE zLd$O_73aVY&XqGZKps@HtRP$4j*p}vEHQ(lu>r)g@k28PS3%8`DKqTwy54*)UUCgR z%&b3)mY3^#dp(;K&Cq?A@9Paw|AlYDcgiTwN$ORF?J2yR2KEOp28V&{lj?Jrmw{8b zzZ|RtXM>Bux#0aEIxhGiI3KJB7l4~UbY1Wb@LKRKa1r<=coX;|crzGBd2Rt^ZwZ~K z&nn#k%D8kVDDB_BugFOA_%>Z-u$9Lq(km+iXO&GZ<G{ASaK3667;e6l=Y-;W2X?3o z^L;c=s7`iT%^HMCt(;UNA5r6R4U=8-P>{3AN~Tnl7K(3SL0~v%{nu0$^5Fv$u4O3P z$dalm77qg>&1*VG*a7Yc1<06GR!&SOhdV<aqspmMiEMb7kDCNW$$JZJN#L8dvf*!z zQesz`4tQvMHHy_-k*6#jZ?%el=WxeYcA@R_nC!>9_36nj1p1`WK%UnRd<1(euCcTT zrVsRYBt#qyV=h;2G9hUm{~(e{YxD`^W}T5fDv&!aJ3Wv(dUWbIzE#mY{z`nAQ}qc9 z&q&WqGrps;Mx}>5qar+qW@Tk!MVgq%f+uFisND1s>7zAYNm=uCr93=iY<e2U^qbgC zBVy;|j?Nf0f)^K!H^Sjb{EYN)k&z0I-_W61V^u;W*Fz#a?NZsb?rbODA|jNQ%?=|% zB`G0Po@|DtW@Zje9d?FwJOO5VS(lkLEHyVHYgAxZMp__a)bK1Vj|6hDFce5W*%wI5 z7?#U(DkdoxFTJ7C$L5Ys4JGDcsW+HrDFv4-U91g-QXUEK$Hq&Wb86&>%yHR%z8*Mw zWNL0eTU})RIAmSDrH^M#wtUb&K>}lf6HCf!h?YKTSXLS>6*y~D2Cj5%P!po6<bo=9 zh@8_ia#R|Ox6e0WlG{6b^e|WC{*y{3xP6CajOfpLaVzs^fE3CS=?*=>8!i}U6HRl+ zJUew%&RK|($f?OWzqtGYcZk!o{Ha4Z`^oVinw6I7_D@aA8k!!+$xR)VmO4638_6V; zKD4ob>0`6gN1L`Z!G<*&Y}i>jxmhDs^O#_L_?}e5Y%>w0QGq^e#x{?axhTU;I<2JT zA(xIeIm#jDrVh<aN18^5VledN`qM`T)F%fX9~z&at?n?<b8M|h&D>75poUu4r75J( zNC1^lZ-5Ysq)SK`6;N-OjGQd3QXiEi2^1q8%NxjMp$O<|q^+lwoueHjkdd33nK3Mo zI%-5_I<gcS|0M!WbU*KiRB=dZbq>#V^c!ANHj(*vZ2UeV<D1PppR9?Xy<_8Jk7X)0 ze0V^P@sm>?J4!HjBBNQnsMZw3YXno!+`dlwBwnRnZSeZY6$@s^#>d!6r%o@a8dk2) zl}nCa6D~W)&oELxA)j;ij)m5QWL>lXXHr&Ime0_%55qsAlmUje*!Tn9gtWR7d5A@0 zbs)fwhydbIr8WG{Rn|aiMMbH}>L?;L#z9T-NIZX!NRd-))lVXhbhBod?DcR6t#DrW z_JupcVWs7qE-PL~;I-YPsc-dAhsvoXSg}(4)7=S<%&(fPQG~Pq#>Z|nKEYN}UKY?y zvfUBFwUYdQaOW@SRE;j27|>?Q$4e5+shKdG!)u|l5*8c(lAXu!G;<n;&_%-b(pTt~ zqw}k%UtnlSHBuG`mF#6Z)-c(qEDR;qP!vpwN4rZLE|!$|12<d3Z&0<vt3maZU7xzE zD37jcp`^$$<l>gDa7L0^u9SgJAqD0XUiyWw_zibz8i6&**!WXj1;$K8njvUY<Wyrg z36rFweG4^p_(=P-Vok6?z<`#z1)W4f=5i46<TDB@%d}mD0cozR0%4I6$w+m3g{ms8 z_K;nibo=2UDUb+RGdml}Av?dMQge|CePfz4ry?IAl8V106?b~LskkKEuwet5a3f+8 zz)U$<`vuUqvGIE%Whj^aZiGm@*D=cGa&R-k70BdMvG(cEQWq)8<<wCWV4+x}m4S2Q z6(cG6BN}a3z|V=yh2a`r2zkWVz)%+K3RKygZ<5c{S84(y%B#zB<)I-J7fI)K+dsc- zQf~ev<&?1S216FRSHr7^h`@g+kEaQ>G;>Vw^y!5YhtaL%P;g15+K_Yjgr267%ahQo zD8|Nbkv8oU7+O<ODz!oqE2{(9<){V27*Uf4XG{RID>nXfyY-z!QVR+Kk~yDPHi^U$ zXf-9E0}m@NEw2oyw66DLjX4z?|Fnl>#Lt_Q2+tZ*nGyL_oGmD|i?YQ`6iEgL8!C@l z<FQLdp4>oIPG2Ksbtb02yt2eJSAg*^Hh!}=TPeSb1)}t2T0rS-JsHTZlB}dnL^@=s zxW(pyt;+&dCx{Wu4W)|(D{5F;@n%z^k@?g4^tgPCTsiuwotneZ2F)S@xzc8X9PJ{~ zC`FMZ<>NwBn#0Mft0q>KR2T_pq>BcW=O0Amr6+uw`d689%JBJlxWj7MrOpS4DH7=P zZf%R@;oNnyCK_LL*izeLSY~cO%Q=SVVbPOd(qt~ppq9ck6Kyz)ECdNCZJyDRdj7e@ zlaBwir*ntR2hqe2AqI3^UW%3GvF(sh6Ex_+nqC2=BaYJo5?ZSwdEMhlFJ0bu*3?8e z&!lXknI$JxwKGixRITKQp`g|1LeR79ppHtBmv%=;YX*j~fiwZlto`Iplfcll;Tlso zzt(OuC#IJ8QBSGH<d@bM<szkW_dZSZA(N=P7u;rZ5QSA(i7sGlD68UY=~J|BA_OOT zdBT<nymcp}DyV_{1ys{)^E7v$fszo>?QSx_4&%%1a$dhCc%3Pj&6-mAtb;J&8k2Ka zE6N!4l}8L1UGt|@8KHUI=9%51Dy)rkp@1s;bM3&ktSIA!kC(ZMqT*U>3Xvo4|4RO| zTmkfODrKH1se1{D3du$Ss;fD;N<IUj+UI!_C8KO&r7oqg0q7cfBx)l=Pk`ls*!X-; zZAWX%X@=4=9=TDD%`k-(#W|W`rclM^QoE|Q=1Su|Qmw9N{^fT1jz}P(!-kem4++Fg zCP7;f8q;EBM4VyTU{czHbSYDnl}38~`BmD^lB6;6MJ^VYe8%u)1|zX*iBB+8dqh<o zsc}OrZ%i0eq8c`@HeO@8%V_eCyuzc>>lz}YcDo~jNGVifh;30E!4y|hiGtebX-7<3 zR?1B06-EEUQK~4N&aRe6H|WDmEVtm$K*|DJfRq!$zy`*JDuJ&(39E=i+p{MTXcYr7 zO&Vxw)6!qGHxgYXjiuUEMm165E?ut*d$I{h;})}45YU`z(0-y|#Xt(>)L=L?IX&s& zk2C#|u5n3(NNY;svCeJ|57)#<_R6ddP0Q`D+KWZCd=EiJHt7>$P^kG>=n=Q{vVyR% ziE^w7*HKS|la_15cvD+&k|!zomPa@(Q8T&5UsaoS^qGbM8j6W@A@7QWEyo7E!!Wp~ zBak+SRSQR27LhiIlsZxi!&8=9V&mU+610s)ogH}1GvWMmp2pH{U<|(AHdl4dQ>ivU z1A|Q2bC;chqjuaKLgeumPeR({GIi+&8H2*z;!<>x|G934YXqt2#oi`Ux^%~bb!EfX zh=If?@jo*VP3^sdr>dcD)Dufhr<pu9z|2+)JJ}RAY%!<^ykKe<X^<ETxS8RY2(TWi zr5#_ST^`iPWr@z_xd`fZ6E>62<7kbAwv@!_jLul9Bl`#wZlrmk=LABHjWAe-^TnM= zi$xluv#T^_8n5LMLpt4fxpkIGh?Ye1IJsc}N2$q>sR@Z~z0+9a+9PDlQe!hiK8&P6 zq!<<9=H;^z@*N=c5_yob!WoS9RZ})NFcHMAt8zt<Q|6scChA>Q{5>-Od!nI=)XP$} zAY@GqVRUB1I^mL><@w$0oYb1>&SXNHys4>;ext|?m?EDI*GK}YUbh+^4P_|Sav$g7 zw|(HM)>H(*HCckkTC_$i5v|2lrpUG-prmt*lD4~)%Ha=&5n_-V$t}w-4fULZamgOz zkutH3ogONM49yQ@%MS+A8T$3rS{-9#(nzk(L?o<P!CCIHb)_k^!lFA@8D<#!N(Q6j zNw~5~dPcQQt~Po*Qp5R<7*7GW!cfh*&ecRLTbAUPRm*adbR*4MvYHYWAg#h6vXXHm zq7K%fgbmM4mD6%&ope-lGM+B1$@(xHvCqm=v5+Q|jLtO0lSa_k-T_v}TyN7EHF1kc zQ9DfzZ(u4vCB52kqiWWT8--e@gXke0(<9V~8N8dYUM@BB<|=(*hA9r*!GMr;J=Hts z8md|9)828vEjQY|wan668)uK{AwDBaLuatACIk9rQ$Mo-DNK~^)d)A#47}3CC5E>O zvr4NIAiHSxz@)62Z^Tqpr%OsD*GMg+bB?|y4O>-HYx<A2VQ)Lz!m>iXN~R^Oa`Mv$ z3e9X>R&Cs}C_-q<V@MW-J&lisru%HR(>1H9a`K>xu(Zi&yLkGAGv&2t5!vXMHZ-=j zE^hqkw8e~+vTMMoqU!mK!WnYF3(FJk4CE_N0ky$gI?YVM8ZjfZbs975jQalFW6p*r z(W1UbpvYXdfunhhw4nE_Y4VZ_8bYk~i)m7it{1&*l#j4zim5@WJmhKGM5Jk*U9Xx6 zD(K2O37udIZ%F*LcSg+MRm^vL#%hsL(PzI>E5}aOY0nHJaH$356ZlkLb%8AR%Bwlr zgi;dOpmG{ZR`leVNf{4+q*u6xBr*sUa)ap~M%5@)EIHYhgb!MB`*8xJ$RD%oDlc)X z_2P^HQsEloIkIp{dF2dEOBAZ`n6%8N>{N%fGzwLOR{Q9quG~TelS3Muy6EbvvOu=- zT@9oK3{706=S8d#8L7{;OKmnghUN3=I`Yxx@D6=uxp=;-JQ0f_qB7+m#i{wcDns$5 z+L7kA=>oE64bOF{N^Jm{R<CI|l!UsjB;6$JuU+Oh(>gArNhQM`G1(L@uhgM=p}WLb zO=2K~#wJD#;aO%m@AgV2u5nVwqwx5vtsy5PQSe+j8Y$EoksaD7_*Ib-uHmJx_cR5{ zESXT5Z_9#YU1Q4vqN9Q-kM1~3GGnEdT3B_YNkOd*YLr?qHNR}4Yh^$Vlkf~K+JW17 zW61&~Jwy|grfQ&qv;k$Cl8zQ$^3k$2x}0HFl!{G9v>#A0i&Bw8m8$VZ`jIxE-6X?H zrt4GMvGH<puhZdVeAaQ{W<#`BK$Vna>L+7}NU*5;Y@1}hOc~y|5ry!M@e>&v#lnI% zk1SSsW|eX<cu0jbTyir@aR)pqRud9M(IPCc;YBY|UY+fhR;d#mbcrd7_E<BRXd*J} zT4{?>q;+U=e$vGndlZt69%(`-UuT+zG1F&JKF1T8Pl3wnD=J>bgK1$7dNr5?mj}yf z2BX1r&~C(<H=~q%90<`38}7UxE|Nddq;J-F<iRInhrDO2GrKWO8W*_3+FM9c40*(f zV#pp{p|RiOtZXPE8afnfdr5W5OpRqirmU3}8TFL?nTK7iV_ORuRcVDq`JA$#fkYNg zpdy}miMET3{qo!$nd)*EGgK+rqLAb>FseijFeMwq^L?_vBP?hzoS9MjI^srfOtTXE zssn{^Z3^pnzq*~Nv(egOFc4hxywWt2R7r{<lK!eGMo7FQsEA30q3eWIt1QAP4=Orp zNBdCY1B5-pZaAnKbJeBHn7GIs_YK4E(5NI!W1$8S&SaR<u+cb$HE!v}Dr7esvbL@> zs;Xv^2gWF<>S7s0OvV+aZ<*0wYrinmEV4&w3>IN)gf3UMHfpx&Soob!b8}{{+N17u zl|Z9E?v^Q8;ng-2<r+ESnZn8;n<BZYo^<??@usk{vaFmQDNWaqDTeVaJzTMMl#C*B z+`S|z>=V^;gx$u{TT-j}ux+unwCJaoO;BV0v#lr}N7fdfY&hnuFoas^L?WGP(sPZv zfl&VnEk%fM{b6@%TOFI_9?$AYK$o@tWbH#c%uke(0mxZ&6xo%+zY!+uR+DmCdZDM! zY14Vf1yhhWO*L#`)7}ti?WsnbX?QfkOh2$#u<2lJrSj<@=Cewtd^L@Bu)Cp@TJ(uL z^X7D}OnDhfpBE8nlv9gc)zr){^hz!&*=}f2K=+#n?&pWRb0uSH$@5#3!;xE4`%Q*u zTOcYY^7TBC8>3Lz%T?=Mi*dhOs!=PW*gsbxl5RaMqKs1EPylHUIY5_$jg+Z|Y93Bc z_#$F1pG+W-ds44lya|4Z^`VE{Y7>i0H@*g<Z9P4_)}X;fRATMELc4{>VJX@|cj_vP ze_}#wkC)Fth+!4dPIA5&1y@TfG-DLY<0W^s1NQn8awBc+HQ&u_tHS6lVV_E4q;}&O z&)E1xNi>7U%OsT@ChM%4>QbJ|Fb^I4ZgO?^PSu%3bbsZCM7+u7hdn3Lb)3J5sEyP} zms6&YoQjToj#~pZqFA)V5wfUZ<ugVichWe{XOToAcDm^HzK!;v*9~2V5obrxXsr)i zG3=B=RrXqoW+cA9!4Rs_{=BE*7+I?;Yh?IVt#hcIhnO0n<`z?<$kPpYg3sA!7CDo( zHtLvFRK#Ogn#p?&%No#$kZ8_Gp;z9?S9M6ku~xM-QHG|%7t#&V!rmTc=6Q`;3})hb zkOeujhF|TeS(R$E@QSjifQQ2US$$b|2?vn2Y^cJG%+C%lt!jN5Y4d>2!t5!5d|6&B zg@z-#+Fu@>t_e0KESjLSNR^13c?{$x)8;lK?bRpA={LK-yOsdNMv|94L=8v;)l-ox zY2Nj=^72xBT+d#k7@5xl%GKpn#kxALnp7<PtscSSQ6Z1y-R)v>sI8@l4c9NU>W$cZ z0WHJ|S3;s~!c8TqHJI)hLuH{Un_+|YL)oQ49@7dZ)J*cTjbN61MDy8}v29j_)Q_ru zug=n@5S<n%DVKM6MOimCLTaNo7*Nen<}tcW4SPz8fr&h_WlwG@<jJkVN;#v7M?>wd zXQqT1W{Dhe_>mv#jHlq`J*#Wps|@-c$XPt>>z6hSOC3;i@k!%b^f-6bBOO|noF3Or z-iMx~;Z|n&H!msvz2>dWFBTnAn>^x{4eh&6Ed1@G727*x+;_|FAsnWx;nw^z;FI=O z%)I)YyT+$pd*GB!Etg!eqp;H}l}mG<J~^%SNnX79MZ?`#7rpHF9<@DxyziUX+}F<S z*eCbZh1;%Qn)d$kPj?PDqUm7$z9r@JA2@1dNw-;F7JfQm%?*Plber9J!nJQLyrx;~ z{&CO!@JX*j^(-R7T~cz+?osn!`{<*A@4h$Xk$=_SQ1t7OCqB68tLw&;&U|{b%sRfL z!oKLXJ(|Ay{j$kV$A5W6kGZpdy|a10X2VWA=CeCKe(XS}X6dssSh455N?-J=A2m7R z!Omx$_)X#9?N7|@8F%VoQ;!;b_S?%I$-QCWkZy-RrtdfsZhy-7t<A1{`}2SO=iS7% zbDypFqoQ~FC5zX#@3pk=qd(8@Ib7f2Bix4aZ?5Zq>FJ46i*n9iy>w7f$8WdRF4|tQ z?f%~1mAqeDbv`qnXvz2V=-7@Ernfn2?>jNQA7As(H{*(q{ZDzHub=w%o~b?W?^)e} zcZ@XL^4K3+d_3ovX9k>{P<6z;w{-Az`0|4B7u<c+OTT9QC;iMpF!_BA_xfwUUjM_p znVmb|p7(q7ku!gqc+&ez`gIwd+d66A>@UaOdKK@x@gAiwdfY9CPQ5i|)w54MwBYp} z)7t)L<=rI<F6>@gJ0|JETY8^SUC%q88ZP^#g0He(yZm3d3Hv`jux8V`r;mN;)SFj6 zJz`SYr$_ofIgM$OoC)EJKJB>6zW(jiitDb-*t+B--=Y_v{b6pmhj(tg>F4d$wO_v4 zHIsMvc%RZ2ebvjmw%j>*<T)RAIqkwpzjkk3x!}t=`}@w@zUPhF&F3C*E{AbdXt>_< zO70xIvd^QfSN}e%?&L8CwwB*^@vTz_r|n8#9X;u(`E{IQq2Ug{bWh)tUVrbm!8i8V z(PhKt-=kmH+JE`GJu9}om{@km?je16r;rJ)FZ!ir1>>GiF79A$AHTR_NKsB^^@`~G z3cJ7lRQIIj@27u7yUo;a$F98NlatE7U;N;VnEX~-;<`S+^5M!sOU}M^WsA0l9(CkC z6!tz1=WCg<>6=$4Z&}%E>2D{`y5zaGj|}|qr!C!%xqaa=gVx;rSub9IYcBZ??|N=w zMa|f8cOQP{eQDD!_}~lw)P)Zg*Dk%RaL=r>7d?9$@2+aN6Xv(MzSXz0U+bMR^0B-= ztKa`=@iW7&O>UR_$93u7|Mt^e*YQ$(tfbd|>VMX>ex%EXKPAn3xAz;pQnx&r@ZIN~ zK3#cUkIPT5Jbclun3WoC+|ud2mL^mLDj&N1mTwQg_@=0}XVtDAGH>3@q>)KSo;>3Z z&K1#cQL`ui_V2^boYG|bgyVM|8FxbS4?E2D?Y#Ml8`k@d{o#Q_ey9IxxZh9mA2#aE zrrXv|$T<Gd=@&hIWAjsw_q{gxwE@2!GXJ`VUz))C-n_Wzi~cpg+muhnpMPkNZHIli z^zJ(bJ(=_2h5_%~^S}k`mQ3Aq!B72oH(0~{vh4D@+!fb8+`j0^W>Xg2FreT5qGru6 zshu?Kx~CWCJ$3PZ-hI_@qnB>KaPy6CT^x7D>?=zPcfR@gF&BN+^R_bzHb%9(_CI6F z(TMWCsW1Av`wk!1J#XU4vp@LtraxZp@$vWmYc@T;_qWdjr|w9fJfWtP^I0_9;<YFJ z>)%7Kz47Rd`+nN^$mgkR2L2l3%l+=|vJL+^bnk`xmUBLdhWn$c$(xtYFIs!n?t6DH zIBamyZ*dnLJ8$d$GapT=F5CWU7hW9f&3mQ3=(R6@viiiA>ZUY}FOIr>*E0*|fBgCO zL+)Pn(-UXjGH_(sm>s-BsNojAHGj_9lnp<g`0yF44;lC2p&gpcO=$MS+zZ~XpRoV8 zxb2_vZn1{@bm^@>UVqPXOS%On7Bq{WGj7d++t-|R_?$D(ZhhyY2L^ZHz@N6QB;V?B zqt7|yo^EH<CEWgD(!b8myR>y(>r;N3xcu$h4Oe~H<=t!1;~MVL(uIq@s~G&$QAzR3 z7U!1Kuc*A%zr5e-;OM6+#_#T%i|$*c;f~r}Q`Noqkz=|))^quLJsv)NSJx%0j+%Yd zyUVUlUh(zN>FAbb=w4s+#OID*apHGPo;fpW$?~7qr9Jq1?Mp>pB}{L!=j8LBy5OP@ z=^x`X+=2sLUcR--9nWq!_2Jf&wvW#_WAU)Wrro-}e*U`;tx4>|``gyN8t(l39c!yb zeOucjv6<i6z2m6U+P=CpVe7*inm@YllXWLupU62ZttH>>dk-%@K4I~OwI|$l+{}kw zo^#Z~ALp!W-tU&z?+y0ee$|JJGX)y%`fqPK;>_FH{p<39$NU(~-uXoTo!#3XwfW<Z zcF$aSNayD7b>tmz4Yz5~uw&nzmG;Mm6SkkXv+ENHM`ho(Y0SejuB!WK(+yt@Kbpa< zJ!2+(ez{|lTd#bvc+Z|?H$C*ts=-Ixdf_2CzyEr4LEYQWt$N^uF}&-q;g0F@a-WN; z?s$6MjH){~4SjIdw!6BXv~$zhqual9&I?U)-(%V6DGe9ce0$5wGFsI~J=kXb?tdq? zeKF_C{4>w$KjgUk-`+m;u`6?U&l8#UMc+1QQd#{k*Uw35GXA}V?~faLYWZz1^j@Fd z@xgHkr)|9Vv@3XLU&9q<j~&rHr|8tFS+_J@&||~PzPI}S`?zP`IXPH9WZj3Qoi5^C zbq#mIo$LJb2Jfyr_ucyI_p}|kpu^$m!LQzpd1305d*1l<*j}^H&y4-PXlvX9mF-(( zubG^){rjh`Iph57udnJ?b7JwK-CI}9y=?bej32V5>x=&C!2Y6<OCPyn^bh41^|^H1 zS<gSv<k@EjeLOY&foB(unK5w#@4Rcck8Zec@dbm&zCHi*#q|qzj{Rc%+PCl6c<n1s zoYK9f<wr-pw}f}Pkr`ifQty2qpC0qCl$r6>`%inj^rllEn0;f(uI4*Re%W^0vd)hu z@FKK^o3L$F@oNk3+4jnsAK!oAi#x`?w|CXu<<Fjz`s4pY-J8HiRh|F;HzZ&P*aSq4 ziaKJ@D2Pc2At-7<z(GM$L5&)lge)Wyl9)^&DAvKCB?elwSh3ZL)`hCAxKwcuZlF@P z+7_28txKh`7SSrL3%~dCoO{pQI~i=%*#Gx`UzvQK`#I0qp0l5O=FV;fbF*G3`8D6c zSG||tf8ydh2A%R~<KFjOcj|dBo;P87!M`I_|JZX<^rE4coih9qemj%L5TWFkUw!HL zlg|G5-SNL`>+_q=z2Cd_)?@y;<(TZtHeGwxllSj8{1x6WW%N!xdj7-53}1eJ^rLa_ z4SD_TPaZhoPsc1g=k`r+w(YxH?&>h_Q&PQ;78l(3NqxhpaKELuymZdx*PQg>zYpBB zF!R{y-`o2ioj?B*<+~@#vrzJePcQl9@9QqP>&yoR-Mr<W-yeI;wHKZH;EuB<Tz=Mw zMV}12h;w=8sNRSx|F|OZ+uir>zt6$@obb}j+mAfq{_TCIS0+VMpZ?(5U+jMb`BlAz zbB7%gy>i8F9ZT-pXVwvmm;H6ZiWdhB7<BEAAHDgpr6bOMoA=VPgAhv2eEO7>y-vTZ z{lS8((|&mB8ADzzZC$Y2SwB8w@8h0)aPk?amh&EK)!V-1vL!>0{o=^X3;&wD`k%8m zy)*0Si{4q5U$AOz!;=^OZ1p(a#i)8up1k~DjeReC{lS#TL-R}DKkCmHym{h?1D|@~ z$}?IH+Wx{@C(v&&FApW3_iFX5t@EDQ(f9tp%|2tsajzB?ElWRX($3$!Hvgx;y=n2t zyBuel>fM;N`R+cY3$8w9-HXw8ZvIEVj3E=pE;!`9^AFm5$=g4=X7*gZv#oj`Oq+N0 z(sv@CO{>TlpZ7%5ta}IFdE3pGy?^-ZcfU8GY~0P*?+ev?eeS{|SFAZ;$2*sPx3K7d zl4sAad+eAsKU{KBebSKczwpfIGl+L@N#7Z7E@_{9`72x3bieq6Yp(m<U5nQo_N#uW z+ooJ`#ngijxqj#t-cg}?Up#wG$6aUSA6Nh3$2rGd@!`mqUb*qm{3*}wz1M@c){W`= zIsMBAs<-x(l#drr-~aqYHy?KQ{u3^L{;dVWKA7Eg$M1&yYvm(9DZagucY-jt3ne$F z)b~4N_>`Y-n>uOJU$>T>IC%Ow`=0amnOkN(@x3Siw(?r))WfPbX7E)z=AE|B?vpki z_WHejPJ1l>=xc7+Yun_Z=iK^I$=toCKg_!ph&z<r@0nYVD&C{t=P&Plj<e?2v+f&p z!yhjh|9MU2sgW^<K6lmMpQOK1z3T=%GG)$Px4crAHaGgl#m8Oy&}-wLyzJ@I3x9U> zoHIVy=WWXN*Q$5(pPkvqht_NvT)5&1r}LR%i`O4I{^n=Ty5q$w|Mi2<A6~ec^4(YB z{c!5yD=!+~eAoPAK6-ZM;kTdqz}2+_pPKU5!~Rrs_AQUDI#AZys`uXbS1%9MK9s!T z_R}|&v|RneA?vSief3{mH(#{)`z;TY4mg+hqp9A!-ETOsyWfwW9eT(5F_*VYz2t94 zt-Af`ORsve;Dq5X{OjXK+IY8x>b+arwtw5KpT7U-pU&(zqx_u}2S?5r{ZZB1CmnV9 zsaO5r_wrSdX>0(7lCw_z-W&I9Z(4ciwi|9+@%I~E55Ktb<<pMt_t-t3jo5i+*PE2@ zovOF#{rxNd+;-P%JNFvCc+ugz4g2)YpVXc9yJy~>dEoocob&maKjYmMLnXX%dtdSR zA3r*M$cW1Ot8U$U{yVRJctpRq&wpt|`|$f#m1q8X1n;d=y}I{4NEv;}uzNpv>!jVU zn)1_EuXudk%Wq%&qq8?2diAj%-nWvCf|pe9$OU5tzq0=E@0RZI%w;XtZ#-r5#wBZ? zeXV53b01zYH*$Ceb~y?ghLYc2b-?e3uXy0Mi+**%lE2=1^a<-S$L>*4c=7Zt??+qm z{&n`Pj<Z_zj=Xn|1222~P3Pv9w|@}6=Zl5ETyS>3$3A%YkQG1N<I*Sp_30Co8@8dp zU;3AYfBE4F=Uy<j|2e1pBKygHKm2Il(d%|ZPo8q@0f#L~`abXFQoREYo}V`~eP&nv z(|i14){Xo8<p%>6-SN(r?FT<Paom8*hWv^C??u&n@wKh{9Qe?SV}3bf{q1vKs2p_7 zgKzxpjo+j%IRA*&J4Rl&Et_|7@N&XXazm)}&4nW#yJ1_yFaEOkpRYOhoo!j`qW@Uk z|NhC_+r~Y9|Jl4(UG<*0ZrGncnZ01xOUwJ6zt_vteskF$D=xkNsT;Q6HQ~J0SqC&T zFL^=rvQORo^gq^qTCi|p-D5=`UH)MHE1y2|L~Ydr?@ZV+t9!>Q%r!oAc-MA_f5#tH z%C~Rka0)3TZ%$|_onBYj+}P4s6A7JG*V0;1ADS6yt*UD*&CAKlE9GS1yjJ$77nYuO zeCaH9JkXzsn43Rp^te%@M~}%JS6bIlS>IY!U0N}39t(1gXN;<KW6?KYl*-p6>&&Kj zOKF5JUsf+DWv^Ke1C`eB6feSKp3;`)%2E;X^GYN6c~yLWws}-#FNO2X)6*nd)n6+; zo^@<Sb<=|94W*SeHIm_$uVt=X2U`=VYM$TgVX|vgT`{kBf~}F?u&rpS>!r}#8e~KJ zHtP0y->7ce!iwb0mh<E`sb8gm*g(7%Q`y*1Q#YryCQ_^4#_Z)lP3XNGXk(K+8tdgi zTOw8Ub+c`tvEmP9w-pu~R(g6}LsjE~me5Ick(ScjoYJXof0dgvDrZ#gxSaglQ8}fp zY%G=%5-(2fjgaQ)A;#VasgmzJlePpw^<K|Czp|O{($~$a{#IjYsi^-}!>7jbdwI>( z4V4SO?WpGS_2-)2?zk&jBaO9;4%SHDsCTf#jQjGRmeQ8_O)Zri!m#0gvzFp-bG?(& znh3APidpp=B+qR${B*XQTeTVfM#-#U1e9-!_Eu<f<lC>k6_`BrN@Tg->mzu^dCt68 z-T8*5l#`@3@4Zma3*rWWZ<@TyD!!j?6Zj27WAey1bH7$-!C7&jd3>WpMR@fOFJ$<7 ziRv*Ev3*TVgky(aue}9x`t3}N=jkzRTM)fd@8mqX4f2~6N~D3KjCHZ;VJv~Y*p4Gr z70tbrV0Q*8#XqOI`G{UDw3-N&jIW4W!+sm4Al<#QTGe*>br!3;Zb`mTo0ogn%uCc; z_FknhmdF`Z*U(Fyo?A1TT4%HLKVn{mY%$of{3?wk*e#f4_}5v^|5uitQ(wimE5BAc zcO5?KaXC%VJE6LE#h^#Dv^F(yG^=;QwLN%KOGRs2FNeuSM`N${4ZRqc&3Gj8ZG>7A z;e9EUv31o~sro&tR86F1A+H3Bb&B68G&20{OaY|pvNh=2=(qK)`?2mM7RA?C@CQck zZxE7QarF8WgGoze)55Y|$*-P4w`KEHs*k@P)?M0O-VF7PcTK#^sUcR$d!bNT`03Tk zUR!Hn#Kz`WaeNgkCTP-Zg%aS`Dw7_e+0LvcGN+z*uf>9m8L{^!4R+Va{nd<K&V#>3 z@J8jD#$FDeeN$f1Vgrp?=xg*MJTK{ufV@sbR<peuq6S!IW)C){-?Zk&+UQpa$={RY z=V@c=ofO&HU&-q%c(m30P3E1uZd)v!15a&Y6{q)_7C*pBZv2arZzGlkJ!1JP<+y7L zHMPh#W~_(&HqzeEBkkWtEG_?&SR((ESepJPu~h$0Vrl!I#L^>@Z`3^4(wJ8<r`MJO zmGW}Y-sw1NcoyGm9(*|;a72J3ul$1Mv_UnT&3GJ{qnUg*x>B0_mbf!t?{>OUnzJWo z8japQu9W7SVY#y{ceUkKTTXs&(D>z-V^m6$-#T$Qe&xjFLYx)mxF&a5u9W6HZn=$? zdy5Qk<N>{RT`A33&3RhG-QY@TP7Y^XISz?lzAL3UFIjH0<w{8$#~0BnccnBZm4p~> zpev<0E08#Dh~7$9N^|mw)NqBal;%8$#PLA%x?BmrB*btlT`A2eAp(x`p(m#-MM`td zBrwB$&y~`gh~?U19D#9s3cqcxl;*r;xpyr$jleiUhhDKOr8&=A?j_5W5E#dzBrUF# z=B%~c-IhxwFpi#~H_(;RoG!~fZn<m%<ER*VBV8%YdDL=GT5g-=KC)aJ5pY}yzl&Tc z&3V^y?^!NP1RMuKPfodsgzYWYWx1i8G2{3SdLdV$JS?};a@&wNZiC)Ou9W6X<D8h` zid`wqxee(s)m!UIX-<gqT87JVr8Is>klz7Sy(O-c=G=$0K)HupDb1NgW{qChmC~G2 z%avR12HGn}>qy@kS4wksBin`>;7X*$a`L_waZPhpAyuj0t6hnDfYhd(yarCBH0J^g zW%L%iQkrv<<!-Uu^Ok$ba>*FV_}$Hw(wvc&%dy-{%bjkyD=qgk%iV0bTP=65<sPuy z2FpETxj$O&Rm=U=a^05u#B!fnZnuz^j{&Zf=Im{`{VaE=<wjVp$a0e`7aqp9!yT=s zu9W87ZMk)p8-K9*&87iPkt?M+*IMoumb=|@cUkTc%ROef=PdU-%e`y4_bgYN#c#4{ z`s!VYc##$=_X}4_b50!Y>7DFKY0f&!J!rYVTCUr2p+h{sS+11kgtIx1YwY4m^y8Mh z!E)s^tP!eL<w|MJg@=1wyDL%0EqAr$w%~E3`hCll(wt`?4ELNXr8(yx;c*wbQkwHi z%l*o7FIw&omivq4-m%<v%YAIQKBK%i`ngh?GuU!_S#Fr+4zXOG<q9k}(Q;EPcZ%gs zv)pXU)mX0Ca`P>Bk>xJ2+~t=0iREsy+*-?hlxu#kYk;%EmC_tuA>o{-wjb+CY0j@k zdwO@cQkwIc<+fNZGvCu2>PpNREH~0}g_av{xv=G?S+2x#rIxF;T)pMmEVsyVOD(s| za;q$NwdK}W?l#M<v)qH0+i1B>mfLK(*DUw0<=(U04$FOJxzsV9tp>VMnv-d{p_a?G z+(^q6T5i1M!j_w6xf08jTCUb|^_FY1+#<^@wcIkxt+w0^mRoa_<4~a(-)?iIH0RGq zi<EoYmC~H;Nari}u`4mIj`#dN<VtDIo0j{l<uZ=(^oF=nnsbunW?1e9%dN58GnRYK za<5wM4a;>~?jM%>)N(s5H{e(=E$Ob5=Im#=11&egaz|QjlI6md8*;qkG^$-PT`A3} zvRtj@9z<$Vy)IWub3R78K)HXrQkrx9Bv0=qS4wm4wA?+Gd(?7ITJAN=ZL!=PQyk|_ zjpH}2l;%8#w6Ai%bEP!rBc!3q?QkXRasub7l{?Ut(wt+EIATtHnczz3oyd3BjGil{ zIprsDELyoLS4!h2f@G}SbI*(VHSYEKANHHPa_F{wvMxQ2pLzC<P=A%hpgbThZ7awx z)h|}tL(ij{s%AUeKbX`pEh{vsV^UUTxMNmUMwr{w(@qaBelI(TA8TE{C@XZ|M50}{ ziR;5#!=1~rio~IFNmf`8kD+j<{6i`-Qs2#Zko&OQheawzzXbgb1LD10y}QW028+81 zUP9au<wrsF(r`C8_#kGDF}lKyqh!L`r10`RMJ?PpEvw{Rm58!jG|MIOoY7quceOt0 z`ka=P6Yf~LijV_Ac|n9zO$dZVo)*hO(bH3z@Cw82i?Rxx)=}Z*yGv~9VcPP(BHzEB zfA<aW*!GPB@Q}UroPL;4iZ493>)3FodTSq_)MwE^e;At1&616fhACc&D%*+l-I`4Z z?GI)Ziw!R5yLBIKF`C>C-?@{YMeO>1!sNUp$wAj7vVCJeP0p*NRdQ7%afLfOY6+$z zoT1c)qC(V-^M)cxvynTCQg<Ju)|i%6)G;Adl#A2vDH?fkS7Z<MiAMXz6baIEFM>+H z|J?xrPHu|Bol~iB;Y^bXV@K{o=Dxix(@9_QCpT)8i>R2BvTBWMXAxc}Wi?4L)S`En zt5=);Fm^~^@(bU+MAnr4aQ~y%w+<EGP2rtg#xpmy?oDlXgSd(R_8p<f?y;LATGRE$ zDo)lw{ECE*FIUk9-)&;k6t#XwJgKc~C6C>Gw@%-=b7wb}m*&yFPAhg~Ppd_{=@8Bu zXhTspc{1e?-cXbyHyf5@NgL?z@>tHaiTH|4lUnD~StCUVx60!>qidmHR>M%kq?tOA zBdJ^xeEY@>oJ4|fTW}Y5{uaDZ@1<Gxl?E#&Cp8`7X<FyT$)mf%%U5a;6uN0${)#;# z*<?&IV7xDl;!_)dSR}?%ufoe0mV}o#mB`C|oDXm4;huhPQEg4f1g$6mk2suz!#Rn3 z)Z<W}$e{rTtr_t_HQ~^d$VW2{&Eim`wLJaasiSH-!jS-z12bQl4MhXVh9h!udmGK% zYexgyHzr8{w4;II>c!t#G_ZY3A76t*u}@;f)b=eQpCT=jK-`u|yUC&5{9dXUp%>D= zilk1Yx`f_H0j#5JoEls{k{hWQa`Q1r?b`;(&mvA9{nWJOOR_|N^ovq2Ofcb0Ey7q) zA52u)!|AJ>W2A*f_OSQuJ9eXon?m>-P{GYvw;TVwh{HsdA(3-QdZ{Q91u4k{sIme{ z=}Ruc-M#A*+256t)0aq9ckfand0T(Ot($!L>BG@oUY=rU*A^mCZe1EvmY+Wi*dV4~ zlq%*E58Y?FLCdco>hRSwbm`1o?UAmw{1~D&w%FGfHl3Z(4wDJBL*#%sn=ez|+FK0U zxg*@U$sHKgp>soc@#EPfvFv+~$zbkYI^drkZhx;xtD*FbA?a8{PHW$-?`m__mc3aL zC50(!*&^kL6rwP+D}kUMspoZ?@5mt6eW~1P5`@54hE&8tAG3k5sXQ`Dzvk)`r}j`P zO0`<Acv?M!Dw3YTgk`lDW#S?%%Iv8{R^qinK`rvWB8mlrirGw5gtfXaN$NzmEupTk zJ$0KB>I&Oaw=kiuuswB)66y-uQ#X`QSJ<AqQj>bxLD-(UPC{K_gSwQ!3LT#U1tAkb zVSDQGo9A(95M5#8bT>p(T~dk$B~$+1O-R(k?T;6g`CEo*Ahvy!o5`?LFFP4#ZXsbb znO37xXOC90e3qFAQ}bg@f#x!cRyNBqlLK<jM2zviNCneiQAyN_+aE9Yr86*VZ+|Z= z=_$AADG&S7LnPrMx7p1ylPPLxAWb<sG_)Qnq2T5Y$kC|ShZJIig_(@MnfJ*O=))V( z%E4}7Uzg%vMEtkO>HOAGvuTqpKP<~IYb{gkw@j=*qmWFd`>t{GjMcu2-;Ks_+Rb64 zLMO7H1c<A(si|2-_}f)wqDtBHG@1G|1Z`WNmSsi7Gh?VCkrBRo!&F)lPpSC(UnwN7 z|1DwkEXO|qh)R1~o6~xL$Tm|HApsV(v9Q^JUUy!2SCzAzJeE7HULUTNbE)`oGaWT@ zR3-u8PH)Ym>2;k}7$>_VGsZHG8`K|OO-Jo5&0L?J6*@G8j->+lE>GMTntY7``|e^r z+x}jOq+DC7nh+bfLs*+z6Lk1$!aS+ibcN=ts8F<u60F>k7VXiwGAk-tzD1x8VK3Mc zV>n?RTuk3JVO<)kGCdl&UMmtqx_Tx}Bu6c)Jbss=*}gG#Qs>4=HY81Iagixlqb_pM z&f+$yBotQ2Nx%4P?PoPa*ObyhEnk>Jlg+s=M7U<kES1KTAMTw+#T^r94RPK&i)M99 zn3aGo@0d{DgAOmhZxz9Zm#-DLFFSEmB&C+5)b7gNn7w1MF@Ai4qALltW3l}25r1d2 zOC9BZ4@YvlQTUF<3h_C``FZ245bxX>-HdC;V)>67lcUE=eEpqm&onZb_DgYy#6M%> zSY3DNSYZ=XPO$d+`Uih_-kMG#==63dh>1on+XM91zDnrrM7&LH2<$|3>+*txO_Ms; zpV6j}wOL#m-29LOW~uy(PoK80X}DzCo?d2;zSQD1EO8J~N0_=l34+EqWWA8Z?_x$; zeSEa;Y*g~^?Lx&(O1-5)cN*bk@9fg-BZfMoMZ_`=@`CS&E49|dA`f?_te1S`tdrRW zyDyHUq9py{l%)F%^Ayaiteo_R2d1$}Fjj9=M^nm_G%FBj!q(iq+txX(=rvn$lL%Ws zGEDJzq_BRGPjs`i*7nEaEF8-}yKrPLGu%nzreR6_yRVRcAKoy!D^>wx`l_Ches5IP z2$F-$nvNt?gL9hr@>RR|bo}A9zegEL*CPfL!xZ}K8EFssJh~+~P4*MDegs1*GQ(Xe z8L-10)qzsYf+D>#IFsmF*(8ue7Ea@?oZSQIH8+ZT;ZC)os+F*Z=XDds8=|Wv3@#JQ z1|1UZ{gcrfM3!*8(TEIX(R8w$)_w2iID(qXY#mw`R;0hckQ3Iad#nXgmBVK7!t#1@ zf}tVdrk>X*e??^X$z)b*7pr%PFP1Koro9s;l>`melBGE@NZ~PGvRlGH&tgqWAD;aJ zG8s<R{R5^ui&ts(ur7Rl$I{i_t+7fHrAjb8>_TKWqS<}+wB;nwQ!3X~i@F!GN$?@k z#x*q*&I%J_&mjABpQ_~(mk<+NXNP+02&bAd)HpoS<tnwDjlRv`gbYnXWW4%Izefw3 zW;@ai$0o;1yi~MU4bdU{C6b?&czO}noMZF190|XO=|V`FM@aADV#n3S9&$}5e&S;{ zA+@*VaGJ&qRVzHhyG*YGV??a~^|!CZ?`gT}c72F)vrTMS)>>|561h%LQo4c0EVE9D ziDWO!>Qa}~aOIM$jmo=JGKtVmn;cHigoOeNCwEsi+YLyQ9NJmToJRweQD$6fdixYz zr75KeQ1`<0d)PIdl78`2w@S0A-nCEoXu9w8_A%P-c9*nx?ao`7v%h=sUal7s@5NcP zi!^A2>R2Rs*QiMqQp+OoVv;ep^$5Ko34JvQE&ESc*EezWt$n&D#zkf#mpyA*O$m)V z&fPPJ$^F(gMhekz(=jei+sz6S^O9KpnyBNo$*sCG9dhTZt|ASEyrph^+B2kD_Q>>$ zul5MC)yK8$Qp=fba4%^xQ|(Aim=ZT%(U{RinPugO^;k4Q!Xi%kB}d>a;$G?P!~B}2 z3Zz3(?b<M@qvLm*j^AxqA&0_fOJDwXu{MKu8$&eHRVjNXY$~9gDlf^33M(sGGfS2Y zv87NBg>p+^fTvso1N=(WOTS0Q_zQ_PB4L;TWSP3T&2yO{kKWjNhG<Rd><Tl_mq?`B z@%sJN@zd<oe5Jd+Zd#ff3}ax&giN)k+AmE-9$a)E&+h-HU$FbX|E{gwr(2%|gkt4i zxb^1GOsxsY(~llqRakfTR+G&55!v5MxZ}AlY6>T;%cQEBktWAYHpRhK356w>q>tM* z=FYp_7`&BgA(yM{?f)d68^{#F&WGIo)ApVAImkW|R#CXG>A19o7wudjyG7bpGm49I z`#LS~h^JkPyK67B#Vx2^E(x{TW{Tv6Ep9>W3>l)Wc2^*5ar3k(XJfkdU@vW_vtEAb zprvEb4th0V`#WfHpgOG;bf29r$tw4=-Wq>NR&9{hK&i=XO0P6wEawrYNfl!^leZ;V zrc-jGi0!6%v2M^uK%|Q2HOn+Csoue;R!FL4w2-hgbi!>yrVR>6-*>(C^d`DVo$ge_ z+)i_|K(|K0(^hsJN~s%)Sbzbw1LL>vI6OkHYpmjOozMFxqu%^#A}I;ZuS_bp_Va~G z{Dp+tu~aGz>0b*tOc)X@qNYoDcr{sW-<a&?ntglqg^QOi$<``D3U@4((EYSjN9eXV zTI*HE(r6rAWV99BJWJT+hHerddU2LZWN}j2Rc~J>jW{X&;tXtv`%*wI#APut>WbYN zc#|7CWg~F^8S3NAUHbA%B~GRXq9jRi<X%@+bfUuf+@#o8`Grs!{bEhWkO>JKrJL}E z_6`<?lz{}pGpYS>A(czyj!Tm!H<~mNJhOI2rSM3hkm<|cL|Gy-Di}*uJJeWiLRTrZ zGRq(xJ@;CXWlr&P*T0uTUoO(`U8%u-SzZ_;G+4=uC;Ms>D}`gRsT6~2Q(hWu%!$Q? z=1xk+bzKxF5piJD*v_c2^%VYD6EJe&)UkAkn3E7B(UgwpcPz~elAFn3$I=WTmwWw# zZMr9j@3nZd8}Q4t`I}zEbBlEx+WkG_d5U!(Xf{b2b|iZCv>KQA(aAR+gk*sA4MfaZ zawe<`k!)Q6x=E1^t*@*UCalX&;MCq#o6uo{Zs_5G9O|ehyGU}mw_SSU-ZDSm7<d1? z|9*q+2nnOUQP;$I_Zy1Jt=op8VxK%q<@Ug`**`x2$60(|4Pf-+vB?X?2IsCoVw3!A zNm*=Hn<w*CQo7z0nEQx(U!-}^=ZUN(@0X(@?l79Ov$z%yZA|Oh`dx5{*TeRu3I%#Z zEjMO6TaPA4Z#|scz9^-{xggWtcTP$v`DC-yc4Fur65w5y+9Qs3R@ut-v`z%oyk7j@ z*=76>;IdezqjXQ{OS%cli^X998|j>uVwU*#$)T3;+^2|XV2P(93*nwBNq&_+2~}9Z z$3jU-sFLDW>6=icuV2MA-tN*}lT>=Yo!tZMO_I%4vNU#_JII-r4@!@Ds#v=t$>Ve{ zz;F{%JyOpNxMYe)CdYis$pdf3n|_Zxn>{j7aSY#8adaQ)1)3tMS-*o7q?|vnsp=b` zC#1yn88XhSAami-o3#9SdcB(4_#Py2`^nJ<RQ^epgd`oAAT^9hNUXK6oRPI5w6+HR zne#@)rhRutrRx&s5+QJQCyr*R%e^{=#j#ixm*M7wHFrWHQ*p#2bL(|9JMkTswcEQn z?K{$%^~sCg?>H;{;)iJYCNX{AB@{_Zx!f1J(`4?O<es#c{fM?Fmt<)lXM^2wR_k!q zV6`%KyN=Wg_2S6!CMle7M^g6?m-O-|an;hS)Z_OPW~_Xd8QbWln{;{Msj<12J*07| z&3(7t;OdmKk(J>@=1TnK;m%^MFKwpmmD*60LFt*fw?5k!txO3isFfMi;+$Apu_LFt zyvMaWi;Hyx`?E#`U2E39g(@yxBXwjsa|uCm&jWsTFC@@OqQI8q{nQ7?AF(_dWsigb zRXjPZb^pPCYC`{+*8gFWGHM$Wa(ZBTj9N|oPC1MvF?fm*Q(80?VL4B?^|TaSYS(jX zmfH2Y)UGF-TB>IK1)&M|N$hTSO3?Lw!-Tsxky-UENuZn(ms@&!f1Oaf^#?13Mc-7| zs`QIxh*pAOJXtm$iqqRAi82$GZFudH&`wEe-%;H<&!e?da_O4Z(>z+cCFp@kS{;~9 z9qn~4zSETb5}&4&q)8$qjaz3*OSTC;yY;BA7LM6932z<f55_dujP!d<lanKe_ma)n zePnlHtf%P2D&3`VhLyqGGgkt8JKCeP+VS@xX>3ye)D*GvUzuCaauY=$T5nB>c)LFo zz~9C8HuG!|y#~R(R*dxJ&w9@8X-D->VEXVkH7?cgTK2XX|A}-d=WZDN*1I<Wm<^*P zSyxMx26lGwj8iJOPMJ0GSPLa`J*`IjCLTA;g%T#Sd}A(Eo*H7lErEua=0BN|A^CBu ze0QF&2(10y*`@tt?a>`dm`^wUf4LSS^BYx<-OjCVxjQrLm24pd{)`<w!)<-cWuzJo z(zeiY<b-w7mw9U-F|k{-TeU^IVM#G>m1ZN6iT8BledL67-`RzC9XDL>bOlbgmZJC_ zZ2bnFX!xS``=xa|-An;6KAXPRYZ?OQ$^QHC*f;EA-Po|3EuqIIsoCMavZRxCs$&HA zx?JHNdy8h@F4tZ2#1L-AIvu77*$&g?qAt!E5?B)*+9J{~qh3_db=4ANlB<!SE!Bwu zDd92d(=kV2(o47{TQ_p})(wo-?vC8)?a7i#lL9Xe63ljZ$Kq7a$*oZGi#(#5ZC32g z1qoxXOc?u#p5Jh#?%7EcWTU@4sA~$3cp=>Rba?&0*!f-m{l)~noU<s`OS{SY2ok$K zynaWYX|m}_nmSi#a(#1f9X0RTg*RUow;t-{ldeejqsOOT{5GbSrM(mZmm7*_p(4F^ z&2l~?RGhn4N?Jc^T}M-7>FrBn;hE@;Y#mHRlc>zb0YbOUt|sW%)`KLFY;WjXYKunl zQOj<4_n5dO1d_O!6RL6Ug<GrTSa-rAygXqM{vZ~}m({+j5_&$-_005!Cl3i@y&<8; zL9WMgcYZ<pp>lR!W-P#*pJ@iwn{{7_?CSl+ot*AUy(p-DSG@ZD(hW%z;h^HBDAF|B zaP479*Rrv~rfD)xF<V?gmc+GIOR>83dwN6nrn8KumXp0XgU&F}k{L!r>sXK08HP(& zwT3)eXBg128Aji&!vj$r%X!#6T!v;AthbWAUH2ZZCM<?a-Fa`0Tj?)x?@i8*H0Ni{ zO?LXlKXwOqmuQv6p)8MRXpSxp<wh>1hAKwVyjgyCs<#;M#>1s%VJWw=eq=r+!O5sf zN=<NbBg2n>xUF@c$S|F2O59KWEn!YqQv*yfnfX(!`6B6qB(w7OrAIcvq*d?S7~CAN zbB0=axi&F-k%Y{XQt9e#ogF1H>f<D%p|b?jOPE<gtO|`{n<1bXmZK`ZPLGvu22sdC zt3~b*Lfz5<#;XK8ZnBolh;!5QQDI_r*;jkQuJV`Fp6`&Co@39nSXGqn%5O%`bl&vJ zno9f7!Z=eUOF*6h(CA?*$-Ay0Ft>D=I@rilyG4E2m7M6#ezGxiTZi_dVvHzdhv5?T zO2ZRo=zMD1I{JNkNC(4B4N(|;y(_j0B$MkIqDdG5&FuS)-xqbsR5YEr!KBWCNz*%1 zGR!kBHFY>H^Znw35(5N-D)a|+zce@P%fuG(p-E>VrsUDG*2}5c;mTQAi)4!HC1^1T zdfqM{6Q-%zABv{OhT^5ggd%NqmuVSEC;=l8S6t4*{+!XAykz%mPHzyC7noVO`2$PR zIeenPNIjFeIGbPY3(Tzd{DCq1z_9+nOz}}0;?vcq`$R8MW`XDrCwUj)BuG-9?mlLw zn?tdc$d}R*Z#C&dz2JV+HYoxg>gC**Be@a{^Cd~?mu0T2NY6o=cfT0JjY)%aSSDBA zL{_T<l$p26abET^35ULUjR;(HKx+lX8iZ+&%bVqcVdM7cUs5)<Nw0?VEnwVxvd;9k z<-6{!%%kXfH@k6>D*rAKgN(SGrQ?RIBFU~9H{?bxG*nDHF*%-g7vHB<Z9R!Yvhk@S z?{}LJ{gX#n>CNTxrVujAAIQBNSgP`Bvu75W8FwsRL#)hds$^Cpzj5i+9^W29!oyqt ztzN*A>Fs6i1YK=MVHb-#Uzy}_=Go?WQk+%AUFsnHs633>dIAA#eGDn)k$Lo7salv< zt3>1|>20M-?5ek&lhD*#=q=skZdBZ9P8WMC?M*RvS>fyO65hEnd{ubFqv02JP&1Yg zC#ewF#aChF5kt>Hu91+XjHLc&OS6!S$PFE~*~gM|&r2a=z3saai)@sLu2+OZQ*C?D z0U2xR!L(GoOR}^Vev)vLrY&ElyP@uJ4hh7~bcw4Qn`OwZshhp6Cul2n3r)9q(%VPF z#cZCqdUqzwdA&RDCY_$mB})%VmL61aF7VF2XokH<9y0gqX~_Kvu3H`>N&s$(zpO|b zW6^6<#)~zC6tHxDVO<0sZS1!oVPdXNn3xqz=DYWEjk&W+R**6Tnp1j3>?_+En|Mxe zTf$I}B2+ib_AN<FQ%86)Y?K(5X$EA9uX8ka!6!4u|6DoOC5-SX=HLli`~I@^+a|{x z+t_c?+U1*-=(>1=Yka>YNy<7(hwds0$Ymb3Bk003ir{8R9{qBc-o6KEfRkPi?^^(B zhkz3~$d&lAV;$Adz3Y>{q$P!(;`jWMhjjxl7?1xb9>SF*TJ{4NDlV7aPtJ8np-;eQ z&e9Y)O6|_=bnUuz4?=}oM8sXFd8;Fy&FJ1jhlC;ap4*k-9iQ&&4_{7LCF{8`x8Ei_ zXD;JdMtj#ln)srG#?2sw5&tYt?J0*c7hx4KVB&p|*AtduU(Dd|V056=Z;-j2%(SdU z(!)pw<9is*W^kamhiR6k1XF!2!w!_^_AioD*RY$2H=!94ybGYW^(d9ciC!+Ph;pM9 zQ3TQ#!QLXKFPDc^QlY6iYP-41)FC5W`4q-Y&6J+&c{IH$g7PvYq<XC1lIc|sdghfb zKQL|mpECxm_gt9!`CU?DF3jd)E(6vR(?*FYg?~Ic2#nST%a|dqQlf(RlnnH!P3v)& znnVUgZ9%4|zf9>78#~vtrdgEuEeg9)2YPnEa=_9Jh3$v-EuT?)79|sqRP?Psr`V;$ zb?LOoZ4T6e#QFGd%U+twq8^!hDWPo=g!$jJ3#p&~MZ1s_Gm<}D36Ah5$s4u~N@TU} zI!qSD?^o%Yp8B^r{8$tlISaS`@Z+63y{P0pjXerT`(w(a%6rd*ZnPZj*6Ob_b@q+> z`p{yH<bxR8X(oj%j9l7-y%zsSd-3Dja0@)bUdsDc<eM%$K4PXKub*H>r&9k&jw|gR zImDIHB12tiU}UgL42u0Xq-05)-Mb-3hufKw#R1H?FP6AR5)*tiqsgpbGVtkJ!9=-b zPF)U=N3+?~-ZpRm#{g(!OO;)g74^C9lt;E^=Efma8bQuh-N1J}o9`@C$?UC9WVk?b zq`yGl$jI*F#HR)pdwWdxF)`A65)kgzDWlO`M01ipJuKgB>ft@S92ape5yurIl;ro1 z@G=g2m)3fe+-YXWYX}`W5+3Ht;t_A&Yb%(p8LgcwL|3xb%_8or`HZ?grBh9GLaP1o zrn1L2p!7FBDb5T0FI6dxGL_RTDUJ-!XQ^}?(t9dRLMm73BqVvnm*Sj>RH4#*q&HP+ zM|xkSrAXx}twO3*=~<+IsPsGQ`U;ZN*A!<fQiV!Cz~mnoJ(}Ehm0m-dq0+f@(Y)CR zA6FrrqEabyxHDDS#01nxTaXqj_cqeGD%GYs4sSrh?|De4sdTNCp0HB4l?JgqGI~c@ zsm4n3XvMfbY^A?hX)l(V#&x2V8m#nFD?MqY7GCP}T}{<bkY=iM6Vfu3ZbdTr_`tgE zHqddVt7{a=__zXTnsSG;sWnHX$w<al89dcHTe%aEN>r*sGAX?a=}P6~>7R)$C*3RG zNk|{7>r|w2m0FOds?>>8r;@yq^?NGajP#*Ozd@Rz(o;wusq`#Txk|rB`lm|r5?50X z&K>MHrz^ML9*#3br3pwTw%j4+<yR?A0aCHLZbv#trGa}o&ODV4L;6Ieu}G6tItl4b zl}eCysB|_`xk~3C$y3-AXCabF%cV#S%3XtG;z-+zd8cwmBF$3iY@~XX<Tb6QsWf<R zetue|y^+pU=^P~EdR?aDOiYs4Zbb^KYiJ){!lm5dNQS$Tw}c(3uKjr->Io_xiDYtA zjMSvuLrC|j^eB>vZMUJ0Gg-Nb`<oY{rZ}6Cs+B7^z`TAn#aV<@rQE|vZ>jVcQn^Y` zBfYKC%Sgs9-{Ga9?<ltilF{22>95KihGg^>h0I}s6lW)rDa+D>SWu{51(M-*Ak`>$ zz%b83rAUt&JtUK(6-Z^u{SwLK?Qtvp$x6RInBF2utUEHxasI77jz+3bX*JTPD&2@w zuF`EtpQ-eK)%yq1$;u5L?nz^;RAQy`t#r^Kj&p|kI1=e|mGY6wRXQ5!3zbepGHF?X z^ptW}Aemg=h}5dwnTIloR;diBT%{T$*%V9R%eh`CqqCuuD?~DS$07Am?qnnr+jU5$ z{%x>Q(P55rs)ii3(x*tt>UZto=H+@R&f`dLs@@AoDeC$MBoo`f5uWQlNOF=h#W?`U zxZZ};Pq_z>Dm0Y$Mmo-J%6*DtxabkQrdzp7k;1C?2vUFLp0eDhNHTV%IDJQXdO1ih zsE;v7#*%x|bmaR(DbBt~CM^dcjZ!WLsX~4H80kpmR$0Akk#dy#wbk2>WNg4|j+|U| zJq*c&d|IyK<SBO+lHq0}$-YjCb1qVai47@Vxm8y0S|s^$T8i^)tG5ZMK)DyJ-e#n+ z%Kg>q4Ib^4(M+U5buB?MDJVl4r(6S4g{I(`e13Xfxrs<dZz|H!#xIi5+h>g9j92ae zq$%q6GNfaa`w5cqdkxaD%H4)!{LU_L9GOd`ICGGUUIS8*au*;Oy_=9^Nk~tKWa4;g zoL5h)kK#p#>Us{63FTa*fyzaZOekBBW@-9TkM_!FPo&*dZ(k(iH^;gjgCr+@Q=Ey` z^?4-uMp=sUd&|9sBy+?RryHq4<2Z3VuQgY029gQ+G$i>JZHiNkWb|%EI#qp4I))dQ ztLs!G<D(c!4%nwSWk|-ykCFCNZk5%$7D>LDNZqh{p<{W`xN^ghOn4)aGL<_TsY2tO zkF<|+=UcstkoHyXGOPDjBsry&;=E_|K13R-T%Y5-@D4zFQ$rq)w7<GeKr$&fzsPf4 zhID|51If7FigciIYb|##Qb@Tckt!TXLH`M!)h<FZvHb|?pd@i!iBzt7w^-MEk>tyP zDb9n|^+oIY2GYUm`j&OQXQCJKD@d}oNpaplG9eE+o|hjgw-1uxLP&=wcO+7Urr`TX zZ>rRZBu7(HoE1pM$4y9Ys_VT-+3G4UAvLZqBE6}uZy+6}u5Te3*MlZ`HaHRKaCM!5 zWL!@}8lhY@QiX=H9!Va}r8v)9E@iUUj!v*rCDP04qZa90mA-$1<7`o>9m#Oq{-3;( zNmbvtl%>Yq`)}j*Mfa=dXM9C{rgL8@{Lp`)-v=G<%0@`>ZW5s6mug@y2G_v7b#MjI z_lM8m8MyyX`V4<xsxM*t!<X>l?}hU&Nqax<MiAo5%1iY9;mI0QxLsZG`W^p;zSzjS zWLxsf>@Rh5H&5Bc|D-=4PXEhpCH((O`d^k-zgrRsFY*&wO8$}yINF;`j31V}FDq25 z{mlh_Mz}>nsjRJN=4a&{ewngK?%(AjeSvqaKq&HV{s$OusYpbA9X%GY*yzjJNlY`b z6mMR_uWyXRbbC8|{fV?#@J<%;m$eh0YC^F``Wxp~H~2J5kfm?_x>tPo@=Ju(&9Ts= zAIyv|q?q%6l;Xqh?examdkHD(O?!LcH&<8Gmj$b)=6z*cd{uGxs`M@Xi!Yk0)_L<5 zmhlSn>PoHUy<NX0D|_)t(pJgF50dmB`>7-~aetLU{69dYZ2ljpQW5{NRFYKft5Pxl zhpQwtW2j2y{AaU(kZbuLQmKjmhpN=Ze+e_mS;7AtmAd%P!Vzv8|MOG|QT13F!WARs zs}x0IDF?R}iG>-`7NoH%Wnj!gm5Pv9tl=tO&t(yYv>J(}64LWXEP;?5dT|ynNI6I> zERf2PSUMmzA+a%lB!_T|R9cN><}O`G6O?-%iKRb!+mI%zB$Zg^EJ;oY5*rc{9?}q% z+K~2CDT>6l2Cl1+WCSIpNCQ<`gS5L!YmqWkl1E>IRO&+7L#2&KgH?JL={qWILrPaE zlQHf>m9mk(uhJ@{s7mtUmrGUJfz+u|CR3d&R4PIGiArrqYgJl@bcaftk?vI~lgY(8 zl?su%RBA(7uhLSa4JyeGhiz2pU8Lt!%1(8h=T#~}`lCv+JN^fiHY06TX$R8lDi!v3 zoHtaOQ@^mO_6YeUac;Tf_iS4#o9mh)N7OVnM2={vm{%Rg%g>uS>R8jrSZX}Z;%6p9 z`FW1~+$7-4uWoLsYiw{%Zj97b62g?$`udaIuq3=G74z!q7aHdD>bg0#Zv0buv2k7H zgoZiw8m&{;GNrDqx~jM?QdukhPHmujuCHsTE^ch8i%1OSviz*ty2`l?)h&$nQ)Wu4 zjQbQa<Bz|%f?s`%IXmL+yLDzpni*+Mud9k^wCX-_Vxu%Zy+nU{1;2XfGLsuB8>{LX z=6LSMGtVFlm=>p{h98)89cJa{mCb0XZYZ0=FKr(cs;p>eXpDqvD;lcmt3zHQLc^=l zT>ayZDlKkq{3<`+5d6tf`7sB6{n&|%x1lj4Gocof!cawXbH&0?T|=mbRC!Tr3VJL4 zQDl=}?Q=Zz)w4?GV`?7#Id`9(#6)FN8|os~P8F4vlx(P6H4hE(bHuIn-%fg^E>NFC zRn2u&<utXQFFkb)^Qos*YA@_oRo&)Vt+(uTO7)!9`if>J(%f1dv9*{ZJ#qI^u9Gy4 zi7n;nCo~qe?ydAnI!=(jWG2(gvT4ksjtXhtVyt6p^zeg<XC5(&Oo)M{zPsfe3Q0St z2nmhZYj9DEe$(_dQOT>N0k~Ihg%=^e8g`i^wTy0%uHYy#>(&d%kRb!j=^NYI%g_Iv z_^aKX@2F5?Yb4ZI6Pn%F+ECTfOYNa&eq-@@#`YMu8<Sb8HF|HAx7TmkxT+hpkB-0Z zt@wJozRrv=#8fm_O^zF<Cbu<JH%DUZ)R{A;RYd9<a$}SxC05^bG}9jW&`79;zArSp zdJaPeC9h7Q`AoeV=`!`|Eqizc8lR3`@iMZKK6hZ9Cv%9<?7D`E=7k{)5vr|j3%P@z z7eeo*H$I)VXQ--(RB+?kN(Wwl3VO?4J>vhrY7bKiA+OPXYx$2fHiqW4R@Qp8K*|Bb ze{1o1ozwqU<?Y39>}#u7Z{;@>DxT@KAT7Jl@G<qRq1g)~)h#3G3Tj%aBcYtO;W>r% zZK3Sp^{t1wDF}sTPC0p2sH(16dx?diN=8cN;w{V&LXnEu_0?wN=uv;Y{QQsX=@~3! z5*6aAuWpzVskQky;!CfX|IqOKx=;^W{NKr6MSXo^rF8joLc{CnB&7(``0-qG^+@L~ z+L5c?YwfAG!;9s^x9&+WW$CT<5sS~8A;cz!4XyKLS2xRmsWW76s-#)&t@u6r#nKVT zcSY4Xtu0#S@rem#*EBcI)7ID+8h)PFaCZ@o*D52jEh}}Vx6;3h_<Bq+zwP)M>KBF@ z8>&OT^}IXHly<YA+Ah>xgMZuUiJxNs|1~~uKK<X8vsa(L<@~ZQa-^Fy(>T3;u(#v) z@-Iu^N#0;cBy$@Y7c@9Y1u2}u81C%Vv}buzS|2B^xnEOK2)q-_NOm$V8rU?ToW0KU zWGDTi0ZnNldwK_>_ab`xCOi9HFCn;Yr@)DhAjh`)HNo>}BlDCYO-bo}ob=`a#(gmE zyst=NNaB#r0MYaGMK2G%Bl|e}H18P;Z%i_0N`^Rlims>Q#dSzB=XGY8_=L;r*R;<u z$(*VgqG6M1-N{ZG5#y2u`())0FzM*u$LT+~Z&T6{eVidLW;DHrU)e!m+nDR0?1*|7 zhOyU`R&t!BKKT-#yvQfdVq@F8YT4`dF4>v(uKAt-%FeNOP4@)wai5&!lV!i!yAJjQ zaBrWS<CA~qOM^e&VeC+Qmp}clc_f(8H+J($Omy;m_PNMsx8M3I{AAfgcdxTO0ld~{ zAK7tFb|fK2N<~_toOqTGwbe>Pkfa2X^_iXQ%u{dpZ=?{?a^=KYvJ0QAPdbb=lKUSi zC$^ED`DA^nVWdLtFH>$j|0Tv`r^rf^kbbOOnE$f-pRA{<ja1D2D&=PJUrIAs&r%zy zl>475SI+-ERI0L4Ez;G>)$?ESm#k-ZjTGVj=gP@8u{^Oz)*pa2Qk47E%8AAHQc0|1 zq-99gE4PCGQa6&Fl~$7U-k_YsE>EA5H7p~E%T3Cy;lDhQN_K9u(pn_plbyTye}GEs ztn?t#Ey{KAU!GhgYfU!NM(!n~WM>oqr6woqvj-!+#Qm?8+syyjD!pc<El77M_ZI&v zReIM-?;-t0xo!NfQt2Zr?LfL;xzG47oBC8>>Y<V3+^VEIS<ji)s3d0zjU?y%9#&4y z<<+VrC+dtOXW<@GE`(I4lAIhflAP~)LOD5wHA1BvE6I7!r<IfQnIlz_la)p)LV8iT zNk~Vi6t>bdB(YbrKA#(<lJq=ADnWWhxl*J?mCCJDg(P-Oc50EDRI0a96VjiR<Ml#2 zCCy{_?Bi?k+&ayCQ1o5037_OVm9t-R{`}$fk8Q}geC7U^6&>>E8+E0N(;t87^PPJv z8hvlxVH+oXT+#o$vyWJF)Pd&@O>cSUri)Ym^3u{j<!t)-rQfUU9yq*p_+39Mzv+?N zPi^|=b&Cg_=b;x-QDx)2rcrfOA6}G_B)>#VJFTg%h>Xg~S&@_!b(#5%^`quhInwbN zW>l3d80SlIYpRoza=ZX7j;gAj-8v_0rV!#YIcdnve0w60Nmpl<=!ij*lj=nbT%#h@ zZIP^b4ML{yNlyCF3FZXu^G~H*98(oHxl){vhUJa~seUGedx)+vrX%Is6=05oDIVz8 znE|sUz)1hwL^l}=M@s$q@A#Q^m?FBgn9fgNRs<O76*B19VmkN0<OG<f#Fu48HOrD4 zimNZ5<fNkh=Il<#4VTHIVfT{yD3|J}^dbMt_wdJ+N?BwCbma8sihz!sjqVCCQi9t8 zOeIWaAe;p-MV1*AOR}CiOHTR;{^i>K_xpcsq^y}Ij2=C1tX89bP|1$V<Vp$yOkQ?8 zGrBOI$q!ow!C69jGKP40Hz5~}Ee`1X1fA%?o{sps4W{c5Kl2DoF;ym3UcZOQ;o*FY zc^hU0zK!K2u7ceB!V(*o%Zw|JW5(o24;ag7LGGB`ws<CQNjx)J;tKf6UmeekSsTw3 zY>a2dN{tDGQ}}K?Gj2y5Q;;Kd$nUElSNie*lb0ROjF$d6ppzetXU0gM8_+4JvJA;^ zwsTiZqZd2(apqOet2AfG#4ThPw!P#|E@9Ywi_?K&AIWG~orai_>nqY|yCq@dN;ZJx zF>+qRTpqK34`yT!W_%B3N)KjM4`yx;W<d`|-lZQ*&lNqGU-V$^>cKqHgL$?G^OqjX z_8!a^J(#`h80c9{z6cylGfR^=W=0RDHo#1oRW_@(xp6@-oECJ7Z4V%B?Jzk^<YF!N z$1rOHjQk|V7AA2qojYNghWeRDVa(;_;yIXdrg<@6e}ah)^D`gx@P&F@IO#o@19~u{ zdoU-!L?`>>ngz2hz*P6}wXg^CgC5KkJ(!yUOxEPKx=2?3n3q_=h(kZeFnPI;F^LW^ z`M0T6eLADJA7pi=RMgdH738LBziN5`=8OdJ>LgD`OeN=p{%RQ$SMKO$W(PQE-@%Lz zaR(pM8;h^Mi6gf$rVpa5%wo)bh$}2Jsx3Bvku}C#>CyOeGIyMDKHy#j5&)O#IHQ_k zzEWY6lOlMLnZsVEoLVD#=9=dEQXQo#V3=;W;Rv<BWnwzZU{>?t&z<eai@4VY7<ujZ zwg9u4I~sv6<o97RVPYXC)9F&deL6#7vI08!Fxdf}X)rkfol2PefX+gg@d2G5!bm}p z2sanEa+eWcp5m@Jz-;AC!ZCJ6a8eM%U@R90z)TA0jDwjK(3uHS9MEZiDG%t#SuYv8 z0XK!K5oI`t#dWXiE2i@tqKw@!op)er1K}j$xFn#nA52p~rvPR}K&Kc+LXO2X59aEC zP6tdhpmP(<nt;xuFiQhETVU=E=zI<%vB%;X%3QN6pd;ViUKP-p1+yujGY_UbP=Y^z zX$mmc!>kQ3kHD-Bg#1UC&4G~LhglQQ>Bo-ATLGQ@VY&h#7r;CpV2WWf$Y!h_*2Am~ zgxn6ZEfDfmFb@WF?tu9$ptBL?@qo@27@0L;T(?Gj0uu_vp3aISC%|OGGzFOBVZ_dm zZa8Pa$eKD9as!N5ET(fQOemmpBTOn8kLCRdm}nrbcVM~#On*A4ErE~^g&Ao>9>tn5 zGP@oPzFEpAIVnSB?sBe?3d2=~4$DftR7a&rg!6nLt_q1Oz+4CuBAc-^UkmdQ{!w$S zaX*aAGh^0x3C4km>1>CY6wpa$RhJV8`7oHm0CPNyw8L2J--CHRz?=^=Fc8;|#aAG% zTVQ0i981q5FtWoyP;M@M2eTy*^7}B`0!$j~&KwLFOHVe8lyWTO2{5&Rkk5eeu0Fcj z8dFd(Ms_P`8pJN^6qth5@l4^n@yxgob34DUvAMES8(_xB*<~LyHg8;895Xs+Sv-@s zDxMiF=bioGj2<K3UI{Scvg4TioZ@&UZ&e&KreJlDDa;?cHl7*R6~~Opk;#TH_Hp_7 z;Q&*RJ8rC;m5%Aaj9VIH@^W%k$1$VF$eCxKue{M?3n}6NQ`i*8<mbu>XunQ=p3DJ! z%;=n)LT&?0Zh1UYxF((%w<V6r9g|H3^M{i=PI@grlb2T%&x|XMV@4OOj$`t3<UF-M zocz(!C<07DMv%!bD3r6;KArr6apiH$*t|9IO#a$9rZ8t?Jd>M2`|^iem|qglj9C%S zjN2T?jLQkp*Zad6H(Jgx1ep94@l4_7cxIez@cVp?$;l1JGkMW?X3WNTreIq<Q&>o! z=npw}bW=PtW>q{>@O&JTmzPOD<qsz>KNQat6vi`!<#EjD+_rcoZ*4r2zayS0kOvn2 z*hd#;#xb00jb}y|$20k><Cwy+@5VEQ89emx$2D$rNj#IkBAyw$CCC)yjLBw*^o3K9 zQ&1ew6t0SA#&yLpxw)zAG5W*F%`1*$@^V(iGr3*yOhGEUj{b1+#>&p5pP_W(nfz!x zGiGf(Gj2y5lb@5rj-Wr}{JgdxGd3qb8qXBSUZwFhsyR}bHFf%#GNRE~m~YU8Ww3WI z1`WOHC_TAU$5CIij4v9(E`43-`cfVBe}&7)O&@1eW$oOS0$J_2PuY^nRrde886UGa zr)<xy$L=O^ra|v!a#&VRj>qm!sXn*0x+M}LW>(kBx2Ys3RkxmF2fpQ$zAD5hIRhR? zS&zOG>#E}3tGk>Cm{T1o)3Y&U`u!7+lAAI;ZSM%xQr$eCFPFHQ`W+Tev#G_L%eLM< z-5w4Q5}Tgl)^D~*5Pp(p0nHT}A8c&}>T=9o6V?()2F^ABH@X&M0K%Wz5UFmKZ&#R* z<W#!<<hYOZ&I|b{-_ac(Yra+@$(>uha6w~pl}V2I#zI+TeML))!`77jwu#(`g|$A& zjVV_xQ@M4^-QG{Co6mP|#N`AsFkQcE;nYN|+3V|CB4zcBjdNR@MCs(}1u?G@jnox! zm{1w1n_m%e2?Ai}wCr3xb|%5;oqWBJV`$!eO>=d%C(9mc)4~Q#hge?fRduuGL^$&$ zoU-F<t1IWq{qfT)nj|f%Z`19wzeK5d(Q<bSO0*>dw)zU8#)>g`)S{O!(3VLG%VyU_ z<h#U@3ci+7F~?W9&C~^&gjOag?B=p6X>#_y%vM+PjnkOAd#~z*JWZ@Tg-WkgDOQ*g zQY<-@_0@b?1ofE_OgWFDtyXJzw{z<>neOc=)ilkR@?@!-Q<~-5Sw51THN#0vbuDEr zO<wJl6nb^eDLZA>@y7ZbF|V9^8ksembO{qHTB^<6%-YsSl^ks;D?4FkSikPnY|5;R z3RT(KTo+kbRw;#8R!Nnrt9G(<PcAnn-`&&8%^9O6u)SFp9k6_*i<kDyB8ffu+@3ti zn^fIW+0#L@I!PXMWwkaez}#7ZFr6&jTZ<>-Ri(!CP*qYwvwdw`$^*PVg#m}eDYPp7 zXnmwFh01!JyDvXMKHh`d`N!*fbi8`J1vGGL0o#~#$cZyUPe;Ekdb%byNKnsjm3S9l z(qm52yCn8xToQVU&vYy}<Kpw=ANhPX4bVN+<0J5omtK99W*Rqcx)CIDapUlud?Ra| zC%;RaCk8wnHg%AV^A>dTdBh<&-ugWDblZhTGbZoCr|TH>8b5Fc{q}HmJxi;V!7ny? zyZ(AQh$Z#QN~Y)c)$If>Ud2w})U#H{DS5TC2kp<WZ^-fI)JI$IIua#Hu65{<TI=#9 zi8TXUeB>_cOR78E>1gTG4$wW-t9%`;<iu51dKUL~ob+X^2k+&pheOY71ysBeh$DTe zoFfwzohO)q*_W|+r-)Z?{L?{Ss(0z`rGA$RJ#&#z)yqv{#~AC)OB1He@7Ob8e%CKc zm8aJ;Nii3nmCg4r{gY##oqIaQvZ6ERg!u@%<of1o)}?3mtkaj}O_h3P%%y#~vQsTz zW-KRpkh<<ozv40x@8nNwyj$YL`nCM24e-o_Srf7Hs;{13T^~2!v+H7=8G7?RyYBT* z_sm4^$lUzV^8Fg`${ow;mHfhjf&d!|<>utDISdw#8=F5?w9C_~E=hN;Y%i#pbScYi zHcI949~G1P96t5lYFr4p(lXGC9TyX7CGWkv8oeCZ$L1PFctuXeME{X7;p_P<k#`{a zF4glL8xyBrKhL%~dOvs1X>g|52|2~({sUE_7aGRvd^u3v{9TjC7vPGV;v)YcCef=2 z@!0JQqa*inq1WYqSS;MTsPs9nkMlQq-8C1xKIr8X`5zAppF?`07xZz~MvdMkPtW%t zMfA4uS+msW$h}@^InJorEHHgn&?3em>ST1;3gPO?Hp!}vKF(@Ba*4m9jG`i2MU*v< zByK_H&K`QP$K0YS;XUZ;xL)1xdg?u%NYA&GBL3U>Y>Ly9-5V<0k&`A*nQ-c~S<|LY zJZc#Kj-Nhj(y$;qW7?#XCrqC_b6AMIbba;pkHGIbNo;m~ov+8p3mi(@3i3-QNo_5a zcLC&%g5<3%;|DqAJO$!R@}bU$7s=UVgVXCOn;TmiYa*fSQw|HwXo}R$t2<A=-*r4E zFYD^%^+q3%mWTM{Ia4%Uh<a7=UpA_~$7k3+O3A-jxn}XA^U$Hr;0$R~-X->TucAR2 zdpLsz6><B+3|<kP6v=IoU4TK5A;{AX5mKo=on#yH(KsE<hifpJ+2Hd-MYE>0p|Zv4 z!;af`oN<FrQVl9MCtdnDGsOFLJ|!+KAnBK5l9HxrLU2u`noFKe1c!jrL5b}YFb|vw z$~nea;K|@=pyZ!$qhhDm_>76OQwN;1t9CwFJ?-SJvcy!ysCZY<ROwD%&jfmugaRBi zs2tsZ?J^*1A%~(nBdNLiT(xE)jL({4wjwCM*@TmFitw3{WM1SXW?aO*Tstwbm{Dvf z5qOv6O>8JOD|N~F*h2EV5R~km2WEp8fX9O02PcCUf+v8B!5JX6G72XT{-a_m!d9F9 z8#%u2t%D2kxs%VqJ#DI6jAGDo+`TK+6X-%r-D`pg*e^ld^DGl@Ey<DJTK+nE3U1US zxg<oXbgzfBj>@*k5U4QJ``C0w(wzFn*%ge7Ud6>qdVS_v+|*l1sdq`<#pbfzD|J|| zv$0hOq%KAe2g|@bupFEKR)UhE8jw0G2iDcbbHPiwXPk=u3~U6i1&Pnto^ChZ_AMAv z4vC)wW(RC<w^cZzGdN=lI^Kn<cVYX4m3bQqD>K9-?BcO6r8Rs9WV@1)T-_1f8{^3+ zU`#KRyU8mKa&W;o@J&ToVO7j)(O@!g_(FqmNhyOI!v2_pUNe%KT4Y(;q8&;R?8OHO ztKFyVj(i0uWhw>ua}81ValNj{Un7JoL@i0n*}SmEUrX|FyMhmwH0EOPVGYr2IcjR8 z>d29&8A)Z4c}-<nOZ;IR%D{2785$*3<)|BTH8=9+KELJ{ICaM~Yq^y(F4Aw-*J}cr zVwApcDd7DNILa^7a_vb(ZD5EGR;sNoYmx0hslf8_M|vD8f9LrwS0=uefP?wWNSasC zR#s6pzoLQmkjUc)6xeK%$0hk%1@0nWo6$VqXo|s~N3-u<5(S&u=bfjGZ4KPpYFU~8 z%P#CbXl{f(K#N9RDrEM+sRLeW%%HIyrBrO}T~ha@?a_xhpBZz=tFWWe9(etAbRswr zJOw-+ECnZn=YUf{`a*{ve$zI`>*=FX{v274J_k+*w}3N1smb33<;BgXfCqtm;Ug-q zGCviRSKFTkqU)Ri%8_=CW<=%dR%PI?z;f_zumZdf<RE<XeUO6|(H&qN_&Hb)?oQ2U z0QUhK!2*!O7E!5N3&F|YBCrI!0IUKp1Q&u!z)Qf3!K=U@fNQ{|;Dg}hpd8BmG59KY z1t>M~O7LIcDsVS!`7=<e*fpRWnph3WQHkrp@!$>MRPaXdH1H;{1pFn~4Bi4R25$v_ z2HpnV0^SbZ4&DJi0Nx2c1>OZd1KtBZ53U1W2C-FiEBFA|4L$<?8|(t*(CcI1e&7?J zw7)08qrs=Zlfd7Cr-RRev%%-UR`7XnG58{Q7x)tRBuEX8%0bYV!8gEH!GD6Ufdgnf zuY-qxZ-5iPzknx$Z-S-Z+h7Cu4j2XB1+M|Of)9g#178LI4oYME5R^XUV=xW;1k3{e z1&#zi1CIs20E@w$ptMB}l}8&ve%CfCEv`Sf45aQvuLfDVM1Khm0`CC_gX_T|;G5uH zU@8YE_#SC=caXXk-4h%N4g)!m9vuZ92)2U5z$kbycqy0#UIPvXuLrZiUx9~#_k)Ln z&w?XBIifWRd=+H56qN%TIpAktF8BqQ5B8@$j{)}rsq@jp!DGNN;IZIL@Obcaa1tnU zyx;SQ9}|lxFPQ@!1s>XSOtf?1VsyNVAic|-kCbyC811~t$A1`*WcbL&@8#Ob@sO;s zd10U*eiFxYnmU(sr!p$}1~1d)**S8dQB-Zom-Kg8+>LbkXPFyFUg@)Rj{FixKPq;K z9t8do%mX)r6T#QOTfx`C`@t>XJK$fye}Zp=J3+XpB(fXa2Yer-Z<U`8iqdz<+A`V! zQU+1lw9MzD@&%WV!6f>TPe8uwD?jTJJp*Lk7`+($6ublc9NYjh5=K7+9qRRgwCg1B zB(M*-089aY0rmyuuzWx8Q!ouo!ybIkIT`}@1djms0;Syd2Bm)NMw-UPtpOIpi_OmG zb4Z|m#P<K~q_qeo?+R8DDLkn{%e0{N?YuG?OW8lGLs?TxE$=F1)h3!DXy3HOKQM=J z%H_i)l_v)b%su?NhvF#X8J9Pu`MpLKTX9JZlI23FQFH!?yAGg~QDD6wc8FguTtj(? zZLSA1!C!!ffj5GZ##_J>LF$l>t82k3?(YB>g1-U9uJ?dq{{}ws_8$R97o=Z89li_u z+eV6>y?WXo)BEion<q%C@-B%_@=3MOFL(;SlJrR$egf_ZUI|J*SAml5EBNHc)tif` zOCfm1Ugxkty8TaqzI^HEtrP<VETjaym6Xg#s?xUtYNe4`X)7P5;nmghtxDT3bisO; zq)YNA`MBF9nHxky$h1AP1_2AWuK;BtSP7mAGIxm11*^fuU=4^Z9DYnV`YW&&d<?7u zUk1+s=>wd3V1J1h91b>vxnK)89*ls+U@LeQI3Jt?wt;ovLQw2Hk59av2g6C(Na4y) zFS!?c8UDv-VrS1uFjzUnq~dJs?3&bPzZ{=eiBIfDx8h{EJlm35KRQ7PhvTN2-Y990 z-%~i7iZv3Qncy~QH0C0`^1PlS2E1ahvPG9+YdlBLm-<A@Fj*CKq2`T2WxC{&d~Jjc zEY3uA1?0sCNmYsD>JtgJIn4gU_WgyesnZ&@6g6KrB*95j`9yVe>%Cb!mI$PLy!{7J z%;r8Ys!0zNg51@j>JPXv0gy{nX<JT+f|W&OMRP=F_tH@@htuod!{y}x;|9t2A=hW_ zJ#!VkzTjSpQ2H_Ev-T4EOWH>9k+vz<UunluCR@Q{z;18~_#SvN_;>Jopp0vhPwHay z67WOt*Wf?F4WNu;uYfXs?N8XBfx|!<w<ds$mC@5BPR5&gpp09K!DR3<P{ysNKpC%? zbIL*QsQldC?jUnS`N^9ob3pk?n`kQe90W2K)A3A9C*#<0;85^Q@BlE0ih2+@5Ih*< zJsa}#DA5VvA>ip?HYoG(!@%X>5#Y684k+_(+G_NVU_SU4umF^Cbu1|JYUUl$Opvx5 z9S$A`%J^CYjt3`#Md0zEwBrl;#J3CSN7DIR#^=32yO7>J&@Mu#cvq??5S!T=%7F<~ zJgM4JZEe-omM!(7IObV@LQm?&ZhR)WJbk?GhaC=%fn#ilP5_Sp=YZ6qXbVV`QAu|$ zDET{(GK%k~m~-eCqGX=*K_Gwf==r4T<_3AMu=G<QLh!C&_9Q2gJ)0A+MYcl9h7`{u zb9Gu!1mPp|?A8@~Flf$oqmx}nG@YH=qUY5$(9f_L<729nk@ODZGb5?4s!f@Um`+7o zV8+TIsozEeWGcga!u2|@uBuL(v9<pi+`LQdBleg6^=g-#MtzZ}PX-SKWj&n_&IF}h zo(i4~o(Xn>j2+SIz_Y<y!7@<ht>xg;;B0UcSPe>dQv<#Y)`GNUU03e_=W<V*)b+KL z7j0F`m3GXAd~h$Fx~}Cq4&2_OTxanBZEm1+iwMKJf~D(C5ltU%JMa>;#VBlcnO}{N zLNA9fJ#JO?963fOy?U)^YM1GiuT+>2tgSHLfe<U3x=|M>xQARG@G9EpS}!7VW5uR> z@vBhrF3G=yC>3IvOSWP!F~xjP=1J#)x#0QW4DbR_Qg9(C<#rJ$VYY)m1uq8IfR}*x zfwC_l{VV-=bTilq<`M4-kUmKFDa8Ii=KcfR-{BL#&U+PZ2%q2c`MV^}T#SEmP{kZK zmDX3}xqzuLna;&4pP^)RMv@+fk=9az(!qRYB*|C4_kt<s&TRd)>XAS>Z{``^6k3B0 zaUt~FQCOb$1PWszZm06$lF={+G@E{NG~(F8Z@ajNntMq;r91}ksdBk-^h=WWqrd|| z=5$&vMWBQ{5tPX2_o9tp7~BXlcaJ^`o&^35oDPcpXnSgBaVv~#59h&2KQ0-4KW1ln z9Y{rUHBYpg8`$5i<NV;4_jO`0N!!2-F|9FRp}n82y&O(nx75JPxlPw68Fl+AA@kIJ zQj(^Vlei5B<>PXx<1%56x2NPM-kxWWf63#Spk(nZP@<$S(s?s;h3GWyE5Osh*<cx1 z3D$v>OSBoR0mV*?C2G$IbvQT9o=#sKUz|@;SWn07>CG35r%YEvt{@oilFYi-uI7rX zaql@-Tmu`JD@s4G7BbL(EQOF%(+0HLi6Z|%OUc`$l^y*y%Qn_mc@9#j<v5s$U6b}R zwcMMcncJjgRcsZ^%uniniRJ2f%o*W@MS})4!I^X{kQexu>3c;vtRV02)PVA>f_W?^ z9cLIWFgx((i0mQ8E^MC7odm#Mq+YZOZ7akYErdB2oC+=isR#OuY%aK%duhBEfgRuy z@FwtL@K*2#ptMokq91{mf@6q-zB76h_#-e3t^n@<F9#n2SAvg%46jl4A$9Hf5AZ7P zKLQyuqcR7)1{??e96SqL4YH1Mt^+v+plfs1De~f|=nC+c;7i~w;LG5zz`udN2Gf}1 z-3=Z9-UG@j64rr@;Qe3}d=R`6Wb}w$1wI1)415xlx#LFgP4FpjAa(c|un1%vj!pyV zL!xJb&w*v&3t$WQ68Lj)Gk7ET3itwu?V?-2*TJ{IH$dt0hhu~BacxKTo{z!pU~p$9 zg1Klr@{GKd!|Ky{nlZtBnj!tsmfbw1K<__!P)3?_)S%6{&S29?MuKg~uZQGbM{0RU zvIEMDzy60L;&L}G5khw7Xzp+$W42V{o%@MPRW-jY!Tyg__jTy|M+V`F(KKP0+ALfb zdj9p4EQpx==v6<|ERgz>dAa6uZ@M_`<F*-A|BIcr^fNCQd&}jSAL&|1>^>7t?0ya? zcK-*s1^gU*6Raf4_rx8PwNeX+PL%Op_x>2yb<b}V$UIB;06zks<o=)FpFmkVNj=^H zvOleBsJ+3@xR*7JteMy^(6!PMFopZ;z`o#}U@CYwC~K!3psbl>&BOdH`W;Z#Oj1uu zh$DXOA$x{XaJv-b36pnGPh@WH)(<maNwIrZsweQI$W#!iK2kxXr;*u%*TrfTkpfGF zY{i=_vH4vNE$j@-Rq{^#2rq#fG$<3!6t*78s;RHw7e-{mFoc7tW9~z^7VU%oyK3ak zV0`sfdiaf`+9ayMOibh_+5elW_7iL=msB;cAH~l061z&hIuM5P(u@6JU0d%9O1+Y` zY7MwQcpf+mydKN~?*?U!`e!g3q>jkXX+}pA7JJ&-Z;k?4cj_ATT97_8`b+R=@HgNw z;6tE1<9h;>HR&th1n>iJA}DL=<3XNZ=rh03;1upBgY?Bw_M_w{siQvwPXccQWo@z% zl(ot0U@_Q0erJL5Qkc`gR`7IC>Yccaj_aRt2AJ1N>;)zT>fJOs{ihquI=ZL!Cj|G( z@B~}y<QIRW*7bNeFC9z>uV&LZlB)|ut(@7gf%6m6OUZY=O+8RW-{X1tC7~YG(d(4b z4w2|%VXvq5gh(ViH<cCj>_kd3x-2Q%+_Kb7-23f|uDs{P1i()ZRq~LUV8n++D362u zJ)<<167qlhAe)FXJrE{!UAj?UT@OJ;&^2Mt<JHJz{IWq^OKq9g_e$*2i>GRqT(->Y zmWzd?`JSLL`F;<C<sTaixD>=(%)8Mw#U+>`zA;HJ;_tT)AcR(%GGl$og*owD6<8T` z5Z-xAP`LDYKHjd<i1qP7Lq$DJG59QhD8pnb&5%p1vJ@X1)ko!Qe(FfdVGY!lJ;j3a z-2F%YV+5L*b1E8KGJ#u*XfkBB3)XSpf3SGw3qBg$Mi>Z~HZ8nr-7@HcHQNvTc7*C} zvU&?$J+rPck0fOFAeT3g4K|t9flLOv2hxoD2zQ|S%)O5dblXu_>V_h^(%z&$YCvA( z@@2HoF!$x)sUTyS&e3bYbGc_9I{E{!7GzGPdjxla4cs#a(r4|Dg0kji4AeDle+;&W z`|p6V#-$H(7K1W>V=UD9+Y<0i?k@q~2bY2=^dlYMzTl-G&sUx0pv>!j2p$Dq2A%|7 z4wix|!3RM4Vjb@oWA)kCRbU=@{3$4VeOH6)!5hJi;7#Cf!8PFT!CSz7R21gB`i%Tn zU>^6s2B(6zgXJJ|(&z&4PH-7W9~->`Wd0nLA6>f-d<c91d;)wJ+zdVf%Cqq<urDR~ z7`P`$pB&vEd>WJ=UfTqo0R9%N0bc;6y8jNm4EzIlE4Uea0(=#G6MPN)1pE^yi|^M# zsq}vV<wZm9fCb>YpgbG@8(0ax2c8QumyTWoGA2at0=I*|0sjd;2Yv#|3xYlccYvRR zLukfdfcaoDd;YV*zF-vG4U}iy@~r)FP@c7K26=CC^mA|za9`^G5O6G*2}&cAXX@3U zJX2o?9sqWN@@)MY@L*6{To(8#cnG*3-SeT~F<>@$97vssR)D-3F4_*tGxY1gJn$iq zF)sQFD9_N}1LYa|7hoYckd|~bm<3J*j|Pti<#jeEg7d*?;KSf4;0xeP@J;Y^@E>3a zxDz}ROs3tj7SVA~<^l2JptSTcw4FP_BLd@~d|R_vzt5uMU=$_qBJbXnXq78duoWnb zJVg2-_hE&Qs~`i5Tp?FO29|{~)~tc__tLW4GYRe>K0G<8n4{fk6?emw(G#!YF^gM& zmoL3lC7fIb>>rye(dO+XHfZB+6d(Eyy*iouid`-PtHB?Gi@=rO55X(I>p)o(-UYIU z9(@udi@HxEYs0s=|0&44Ti1qz2wT>Mnc!;h5RfpUBfwvPQ^6ZR<}<oRYy)rR{sK_e zcvpfCgY+j(7kDqY9;BT+kAk#o=W*~kaO3}@?#<(Ltm6Owo3W;3WXn>MEkf2ri)NT% zM$C+vAyVB2gJH~!nX#qik|pg(rBH;TRFtBkC|W3?jiQvIRkrr+`+S{qUH5(6_l!Qj z&-eHH=XX7tp00DweXg^-&-=X3a-9o)3*Uy)aoZs6#*6{~h3|4-9o_XlMBdFl1msPh zG<34y$8Z?b802QCF^FvceQ+i`0A+i92@k-7@HjjK&!9XH!}H-cun+tmj({4gEPzL# z);Tm*IY#+t+}t(FM$_?3t?;`ZwvCWYjSbRSe$`9QiTbpn29W+?)&C%&HGCU`d+KXi z5eA&zi?!nj3MxW~C1F)?^oyqY_2HzlF@M-y+Knx-ZpUqetn0UlIQpei0lVN9A^-mV ze=iR!AOM%9H}zZhIa-+u@{vE&zfZ^gJpOFch&Dn#tHk^v<;$gZq*fS*lQkNYti>T0 zJH?}9sRc@z(|`+#gLxy2)v#It`QtepU=SQu6k#6G76OH~<n<gx(M_yoXZ_~I1}a|H z8rOW#!j}JjWQEB458Ub;-Q13=uR>YsI+Ne~#?>|4Xyhf?QJW6(SHX3!M1LW9stm7y z)TEORu^F6!P~%n=_F3>oSQp*{HC}oGHh^njL-+zb2X2Mu!Z+c05V<#NeE}*?<EV<T z8RVH}jZbZ#_U_<k*7_3Qh1~aq?IE^BfH9V7>leY5+;@RnU{|Q|)1{EU)vWn_1+U<q zzRHZN=%dVdiatZfU^&S!399}zP8tsT!C6q_q(|XZa623X)uyk8YRlKaDwJIiYMx>k zTn2OCN;nF>3Ui_CnbA;tf5yPCVIKSqj)i~20$7!*EriYCIM@oJ=Nuhqc|9Brr@$K_ zy4aZmZ-rYRI@{PMcfsY@8?wV*g7?CA;C)cXA)+UppW%G?2V4N#Aj*qiJX{RN!X>Z> zJ_@J9rEn&E4BiJHhq6ajz^#zFaP&c0*=ygy7og;Q1Dpmo!jB=grt<^b3M(P1Z$J$r z--fNA?5nFGdfFKScfpBJcGf)j0eledfzLyffU^ry_s);-Q&<)G-VbFb$lmG(KZnEM zK{yg38%DRPT}H1J$c-T8Fu)5VbSp<8Fy`aX5?|*pW#(OE%)8uW-+1mL)TH!B9F7rc zO+E2lIO<Zvw+&b01hql$Qo7V`EAyA=I-aDDP+EV6_2BPNet*F%$XuA?z<=RvNZT{{ z#x5(h7IhgBH77_%7#ET6&>O9$GZ})sdRJtQOAYna0TdG4H{6v{J<8K(oM&{USz=P5 z#1mz69?yamvkc5Q%JCZlMiifZEuAH8@9pc*Lo~PcWDU6$()XDWuD1O8J0pMJAyw9$ zX2YeiV;n)p^KTZCjWYHJRlV%9L6stHAdaZJ=pLm8DY;x#WCy}}(ak1Ss|}h<H62Z- zkh7MqHDZ<)u>mzrtH8#&OV~L#-*XPXy)*+IH{Cu>onSnn?Lwd;um{-qGs84#pt-Fx zO;IF=g4@BpZxPS#y*Gj=Ih;*M?~<HoETKZ2?z-=*ir(V>b9fm%042Kz;YfH0PKMt? z?8m@&a1s0-J_BjH4)$AsBQ726ufR`mA3O@NhXThSvK%-8Pb1GKAv!$p8%%}2!%X-m zL`Mexf{X<Nj2#?wP~cy<8J0WE&g+(khq;e|jI{z4A!D8Z2WpyeY!%p_dvuAzSRugJ z!zqC^;aXT5Zi02;yRZRlN?Du>wTB$t<BWrRdd^t|TfrCMh43rb7V1#s4zLN*MVoWl zK@RJ5B$$kCoa-TF?JS1qFy|?F1$+j^Lyd2Hz&BwMl$7>@Ctz>b6aC%?X28C1I824P zupb-)GvSSJ5S$AK!^QAg_&mH0s{aT=jc12I^&8nR7Ck>4Y8;ybTR@I?bFP88a0DC! z)sJw%s52K9K#gY$;aWHjZijrb)A<rIhI4+06JZTxj87Xo4dG<i0^R`Cx@N*;cq`Pw zwzt9S;O$WD;ZC?1a=4tc5zc|1!+YToI1j2J+z(SAhnqSh-~y-vWf#I#a53BhAB8ft zmclRLGI$&=hvn&a9)}g+N>~*>0jtARunBw$YP#}i*cUzr^WgLF5x5>c4PS=u!i_LM zJKF@$gj?X*a4U?1Z$OO=Y9hPQV}lO3orzy-$#;Yv*Vv%%_`H%_R+x&lt5;(Ke-}fJ zyvyBMFogT4tskRs`i{;<Z{3(!yhU-VLi3I0jw6uO`tFNX(%da@{M{@o@vTKh7IN!^ zn_rvz)zx(T7(MEelJ5d*HP?f)C*@k}J|3q!#!0W?SVP)dFJFwGcd1OIvtn_W=Q^&% zN#*oBR54+<nti4(!(QBPgqiSFI23Mz<KSyhsoDachFjrVkUvKX_HFnl+y)!)-0d(9 zYFya@?u4qFT~Ku>J2ram;TziU<@mh^E0wOpzCqruH?`M}AA467?;oK#cs;JnId~Ok zJf2Zin~c*5f7NOlRswP!X`sH{3iphdhzeH!Q;**_A-Jufpc(N=Iw-182dhf|jeEZ! zs57b(`t8`U6X?7`^A_z0tUXM6J|0GDsJjTMF<mom5nZ!l#o!5?heB~vWS6Yuv4_xW z<2(<}ebO0b4e_WEN{6H@XntW6;~P&o1oAG`m1L_84kfO8Q|v6&Uo+SnHiy^2^WjKH z{hK}JouK4V<C%wHXSftH_A&ipcc{XnuX8?tjD?)qJR=3xhg$dH8D`ywF_L-b>vEWZ z`#?ya=rEQrd(vh@jcc&=wchA#hZ@hEfP<mNNgCIrz-wU+ybex<L*PP~4VOTTcix7> zq1NSdU`_h75wIg12?xVbP;=V3a2eD%NS_eUIOsc=2P;v28V6N_8V7ZR#ZY@<DNnP` zJ`q08y~aTsAbq@PJIo=KS~qQt+gbdf76Mfw+D@kQU*BMNqkN?M;t1khzSiUFJ_(+$ zfk<k);N+?~-UxN2M#2}5hg|`69m6)fqVX=JO|nAP15I7WSILXgy9p}I*eND&RjHTg zHDShgflCQPIRvUk<jv@If8Gk+=mlTi+%@4*xO$rg9R3}Z&sjK?na|mHMC7wfU7$9f z6^bI4?#OPIaibh&+Hea3L@NQ6Z>d)4Yj^YU_b!!%%CZIyce;*mQFbbyw_!5e1_!~N zFdJ$-c{6+;s=a*-S3->^wQlkWl)bwT{sT2`Y{+vCK-y^F3n+V&IR>-8;46sin|J1< z%XwEV&^c<ZZVr{5fZrr|dPJSM^2n)hxg+z9IzK=-@2cYcBc#ryvs7uN=jf!*kK!9u zjlbbkW;F&#b3`?&##H!j=u`LM?Fi(rHNE<pj@x;NuJ#WwLJpeV-M;>;N-p8g8?5=e z_go5#&QX^-g-y@~%^o4+L>-FiyC#3ks_|a1wHhRG8$w}+=CB-_V}^0-Lym<e{j2q3 zqx;<i>6i25$e*^hm}1v_++rNUW`tRLR50^f8%+Bg!o#kK_`XOHa%t?g1==_ZS+q5= zdUJX{*^Re9Fu#&aNOqfXM;~A=y<eEXzw~}#D%5+0L8vtl^%)n#8Ibv4M{@zJyE)5Y zH>hINn#ebh`7MX>zj?n<of-QD%zQd}-Rx1&S_%DzSu2?ZQ@K}W(jo04z#O+(0~`SV z=3Z+j<*6#Inbd@=?>TYsTG$v4fvn@0_i|XbG4JDOZw&p16NDq7s(KW>2abWw$bTW! zICvcF3X5SDWSnLC4!w7i&HY3;3{HY-V;Vn}^*&a0+*O`uM6|Jt9KMV6|3d3Gpnk&* zgO7!m=p}P^7lNr>=?jJMu2%d*bxSuDdRNOK?MfegsZ$3|gGwvw1}0C{DCg)rF~??f z{XBSPM4qJUF#v-;#ZgFP-c?$0jKb^xSK3}>s<!W4DvM}czm&3*u3rX|;c_Tl|0K+Y ztDtoK(@?tpStwoq9F(qq9_l&kp>#d#)kfEEfN4B$BgB3QyaI28o8ZlGGn5?e;4iw) zHsdB)c$&ZJ5p^bAA5~{V2;^O*>r6`3t25PZlxm-ZQ<<vW!K0LFPYi|5HLDdZxVQam zUMYJ;5B4tQN9E3c0mY$fHu+Z`?}Jys`(ZCQALhUZ;Y_#yJ_xZJO?hby7Cp|<UQULy zfeNrjM0uI_Yr>YAKT*E2I`t?uj#xkAfAk#oqz`p5?QryWUg{836cNJ)zoLH)ebt=+ zT<Rg?q1Qv2{Walx%)xL^!E|1Pj~TD}<4wl<ZsO)r*R5OI{|pb0V>Jcmjb+tedzZ>g zb<zljldj_%l(EY3O;`)Q1*KoG(aqlPccAjI1NMdQLA8|+;JxrexCVX%w?g*Zn)R7a zU=q*%6wZMA;ZpcHTn`UG=IjGsKy0GGmk^sM@HMPK{tm%7_${QL3NTi1(EEWOq4NI| zTme~AF=slQfTSUC67GS&K*`2$P;Ks8{-XEO-oW!@KTm+CMaYnAUtN`xJ91RX0L~FF zu!H7!LVH(fVUno%8k_8cfjHTE*Ls~yo*}r{RyNVZ&gLP-E+Od@3Ve#G5CxJX+8A?< z@gphpOQz3mSb>*!DX*&gnm8<U9e=<ERsMg3k_pzdoeSY{*cmduGiw1q!(rV23a7*0 z;8XB-_$>SjN-xsqoA+7%h2?o(Im$i`mWSP81;}{O>?vV<7O29#%DyU89qr{Wx{hk% zFS$G&R*R@3cii&-Q5_kJ?SH7FQ;t~v7j-h5ym*)LraIAFlFC&VvTxcU;{o$-3wD#! z7WX>vVptdUhi60S%m%O+HiUP>bKx_Pw&U!A=fUq_V<_9MDbzf8bEq<9J;#*2?7-+g zN$tHJf6~#K+;K1W9V6e&zedC=1Me!`G~)5{H4Ul2WSp!Z+nDS-ODf}ZeC#s$(D5Ti zV9;v-9d1e1G0191*@KOcZKa2Lm-3>`#ucI3nXY(>U)f54jUoM%IS;HSRG#@WW%DWj zjxL)ixT)ThgOjDoM(ZK}tCz5RW#eVmF30#v`IO?<f;5!yr&TC_U(pe_Zv1h1eOQ?< zUCEXiqEPOoys50J!YtQ~@-uUusZh-@11fI(%{u>8a18fUlbP!r1SOY)p~~nQs5b8K z7yT}2Q{2=Cox|VHrOJ}?mCf>!gscW3yo&^Sm)n`gaqlZgm6t+9bmkHc<+qD`+)K|_ zek(xDv*;R2QkABBC>=QtDt$#z`M8b0==t-OxSh^lbN+sb$VaI&qLmp!g)ZNXn;HGy zml;V#98UJMl<e@AAAI`WpC_dyI#0_<yVCa<RGwErrFEs7CykGy-v@1iTQ&a9<L}o~ z=E<I39i6GtHKc6%G9@*jIG5tiJgdo+jVjcJ{drPaqVt5VbCkZ-@Lc#TR9c^N^F)0y z7K(hwwJvUz_^Zv|Z_#;*K2`gFohe%((K4oIMyGu}X;eC1gesYrq0+R$P5V9kJGwvg z%h>PHX&=c@!4#s_vf0OFW`>9)bm=MXRkoOE$9Nne?2@>x5ihbb>!d6>dyVu<&R&O- zGwebmXK%RqI!Qx|ma`2gQ)Nf|<COWDkexT)=Bkje-W4flX9P|+&EEC(PkHr8ZQr45 z#3YzpI+t?kSjwecv`hPoOSyC^<<g;)OR0F;b%_qsu2g#3m5RAtshHcfqdN+p%-JWk z>&4Ly7ezaCjCP2Qqf3{l5M83<=n@@Am*_Yyj*jEv=r}Hpj)TveN9Lt-bR3;KM~CPX z?a(30;i9h54$%d4QFOvCicVOk=*M=7er%`qQBUa@{n(DtadeD+O2_CpklD!cKxCsF zqSJwRMuuqLjv<C$KDwCkqeCn4DP#><X5q9NMWJIACL^47-?92|dt8D{iTT`F3(dAj z^-ha%t7$?RH@&$U3>j!LuXGM<34X@01r8A%vuB~qKzlRvHrsnNkt+pae;tZ8!pM0P z|4;ejQd+yfP$~k^du$Z=-f{|S0$&DC9r#y#3uG_K(z8SOIR2ehu3$_=3iQZnHk?wB z%xx3YdRjT<)jyr9K4CHTzIRF2sZWqSG0$~>4;?A>w-d&}T~M~@`%t#n2XHw27|w;C zz=t43VC?>V5Pcii54XVsP{nf)@@MuEe-96HUxAYN7Pf&uz{}u|up9gd_Jv2G=Cnw= z!<wFX-*E{1nS0jU%=?X+<NA~PTi`!XCCp-jvjFl8Gw!blH*jAWehnFenD--@zjS`# z{tQ^LJd-7`GGzYQVa#LBgsBJ5;-0aJIpgdicsBRUW1D@W-C-l{nQu1xN5{f*xi5l^ z;Z)cZGQVWjRhic_>#EFYnD_ABhpq5uuEMOZ9)*;NQ$EJ-BdrWsBX!P%%te{~Ivt_r zo|%Jpy1|QK2J8y;p4=r+?_W};&hzkcsIwm9;SSgXYKty&B+frj>$7LkFDAq8us0k4 zsRL&)Oozi@KR5|yz`I~3oC~!+tM^p~!B64UP#?y;2A+#>YCX0i%!c|r=5QDfb6|g{ z_1Do*>#q{}F|Y*YLkTx)!DfHYc({Ult*gEOC&8B?>x#}sh%7j};7#x&I29g;(_nR4 z#dN6FF%xFMTcP&*+yTeHyJ0cB2hM`Cq0Vxg1D}S>X`3@0?}OU^b3gn6J^+uwhoJTW zA$v}B+SEdL9$W;Q!^N-*d=$n*=A@kda2Xs2AA=L%N_Z1|0^SRsge%}GsIwlQfzQL$ za2s3$wNL0-_!WE}{s3Qq<!IyUpw4z=?#s~!tY3yrAZ^0Y%XS;#mGBjq4mZQ0@O7y3 zjkmy?;a0c+z6lq@ZBVbfZHF7-J8&m_7k&tL!ozSk{0Y7fwcqFisCOwpg3aJw*am(A zyTeamf4C27U#-?NweRQ)SOUL<x50yO1*A<oPr+}X_Sb$3x54iqd-?+3!>^&{nErrA zA$#e}`$_DDvvW@HB<}2CGjmPsQ8RN*1L5zu=fgi>G5j0Of|_e$ua>sHI_#-3b587e zGVd?F4J+ZU_j%AM&LOBdr@x@)oXRn9I2~4nXTWn{b=V1>3A;kgzx0H)VJg%-%rK~V zm|LLcVQz(*f4K+p-iNacvM0iM0ct+xWvKa=*I^U52WlSXN7xJ=hb`bAuq8Yb<M{&E z6zaXFmheK@9=3%&VLLboYOU`&*a?n+=tgG>><sUL7sGi_YkmvirEm?r3~q&&!)-7g z?uH5QFhr+1e?qMZ2F^e~!D=uWo(of8C#W^Sbg1{I`olDs4g0|fFazEJGvNx@A3g;K z!WW^|26w>0@F2VfVyOhKgB4*mjD^Esb2uDc3UlB<I0{}1wKk}aR-*fzn_xb?7Z$+P zP-}(HLah<L1jobo-~{*uydM4or$F_`xAGUg=Fko|y6nIO{Qap;+FqK741a4$<Hb17 z3)1Giiy@chBos}=5r~==mJwlRe3)J{ufCd>?8_W;DT3&+<T}!=w5^AlpLq!?oiDrj zd4qpPpT$yuo3fG1-(QjW@gLx&$9Y%j+{EK$ElA(N=*c)*i!m?9`vM`4vQvB3qexTh z_G5r%VQC;gv9Hs5r#)$XBMw(<CWebcwut7LLYMNP@=)UXxUS!lZ)HjA292TC4cfpX zuq&jGH*0^#;7IO&fhvbzq3S;g8z4Dq-e58PbT9m7!oS1i#kmS*Tfcq5J(!TstL}(I z4{fC8+lAgaXtU@IysL)ykI)W{LVUGor!54s5sx&`z4s!wicY<cEjs^vseD%B(<N5n z&E{=Rt=BU(l-C>MarB1luZVc{+}NpD2ggVVR(*bWU(Jm3<Z{Xr=M`x@i7)Goa?gS< z!Qb1pA-68vmuo0Dd-S}l`XRVo?YeoH^iN&BjXzzkE|tg-(wc387mpvR84lEa<V)e( z3Av0qbAO;MzS~TZcyEB~2YOwiwv9E=g6MSrh<l&x-fwd6>$vxHaOP^@-lO=<HQc?I zv8l_uZ;o*28jZi53NrHA&W%Q1lA{CEN)!Iw)OEiQySW$lZJ}hFM(2!z?O`G82&ckM z@E%B^I*-EysKV+Fzk;+pbDl{GY((7s;1w_f4uSpQ7&rt@f!R<6JqBWHn0e1bkTzxP z@^O&9Oz)34^g-raAo>WMdFY_?15+V7)tvXE@}I-~D{wA+8{P{K!g=s-$o><j4f%f% z_JE9CoI!8_)Hythq0XCF0*{fOGf7MIeDR04OSiql-#_*EpS>d6p_%(~JU=My;9e+V zN!4s_OSiN6xR!2b8sWCUr_{j=Y7tp@#PJv1%q0E8ard_fzm#8#-$4Gjr0i7R5z5X= z?6W2Srhq3=$8i|qItnTe$x~IRr07C6jQ(E<k*UBF5LpPUfqLX~Fc-c6Z-DFI^Y9hO ze5BdCtn$Br@{eBo7(@NE#4iVyS7&1{Ixh1)T)jYQH(aSN9O8My$SUwpP?*<4{SHZd z$<-8!gx^;v(sz?^vNfcyYxoz>od_SZc<yN>{~D>>5((<B7xm0ta69FS{s~IrC;_-M z9iW1C6XCsx>8-hUA*6SytQ?e4Qyf~m?s+(={PN)?P;IR{EP|P^7!HO+Z}$35fDZTM z+qC`3@Dc8>htI$%Q2qOjka+>qCclK!xL1mAhwN)KZFC2`oBN;OJ&^TAb2b-tq-nF* zX{N2-2=BvxB~+W$82JIX2deF=O{?vG4b^s!!-bIbchiRdfsb-upZqU{4dHUA^I9d7 z?cpkz3ZH`M@M$QSBVDCzuM*N*9e2i~feK-n8#^{=Hd~L+*Y*d=TRefhD^lLn<kRu8 z`z7=<{YG7(8bnS0I0A0i1Ri7U4l5m_trm}Nb4riuwJJaJ+T1>zl*R*4_4@_v1rNfp z@M|~=9)gVP&72G4c=O)2^7Rw$%0J~+YA<MJ1-lO37gmhOzuiVq91Ish9KZLj(nZh? zFaHLFVzay|(YLND7<X%rlwLd@R?ba9+cTZQYaA=^_AaGSWul@)7R>c0PPO>gU$86G z{7^jn7mk9MJm&r27^r+#fFHt&@Do@WQf}sb;!7x_)3|4DAW#i{1zE#3@8s8jx0L7E zumQ4E3$BHApvvrQsIqOvZ=&}`ufXjr{FoC6R1TLd`b;|j5wWl~ll*vBWYJ2255dc) zt5kf-qb)w^D&M~ELOg7NyN(jO7U9s8q7_5G;*#m4`itW)t=y>W2|0Y5bi@cFvaLhE z9UCz{c@%eAye{duPSDDFQBE<h^cY7|`*_fSWt;6NcG?n!Cb_Rdxp<e#N_DKYQ0mlN zw@|h!ziF^3)ZC8b|2Ehj-VW2?olsrgT`(8UhDzC7h>kIHIUC@E+)JNn4reFS9L{dI z7=8(tK;*>C;l#pa+}DGeyNQF3!^V)bns>rAmvbTaPeA7F%p6W4e2V)NsJWb>P;)qw z;j@tWtH4@Fp3K~hWJ7Z|k|F#{t;_w1tX+<u=JaC2GGq?wu<~OSl`L!btWaX{E}tm5 z+w7GejR(r?6J<>LX6>ce)aTe4dHWV@(8$Cx9$?kjDRvY|A|!N8n(J}y3$*HE<8f?d z98I$?DHxNJZ#QOtgO6V(wU2o%ZtioCa{a=H?*}30@QIZY$5ZyP|Bwr6Uzf!HH~4r% zrOZ6v*aHE)<0{F`><W<jmVDYarVTuvq5q(Xh8;4EJVRWvJkZ8&{8VR>Wfedl*PVXL zynpjA?5$8S%qt6UD69x4LyjSI7Q$-qG06EGW*=O2h)or!0k=WkZE^O)TJUdJ8<yu; zXG7WN^pDQ@5S?Y-?P>(GxaWHyW)Ep&s1j)kC3hFV_aObK^9{t7Hs=do2+u<Q@!GJ{ z5z@apT_F3U%{+K#cn|j%!-pVq*Uo;(+ry6b$z1_ukH^C#*c}dqxH;2dBGkE<_&Ez< zFSrHvhVR2Gq1p!f1sRJ(uD9!bf3=N=V9m1IhBe}J_C{_=ZUK^}u6#A|dROTdvI5^z zwvbJDMzxT)aEfdpGTqa8K)dFO$xVVQ>E1+*Rp;*1h8o6K6na?HJ>%2#lw>{MNNYGZ zA?+H`z!dp!#1rv`y4umnh{!|js1`BXXNKDma(?P|RJ|g-9C2}}TanS`rrC7%Z*gzi z5Qo_YIp(aG9f&e&_k{!6qZ1F{;BV~efObaw+MaIWAJvSapqc*GrB1PsTl?@(eiXvr zu2miqGB=G@fvB))ePw7N|HITToJ0T4rC8=i#@xYZ1KXL|!IZ{~x}+5}{BK5P{P#K| zL)S7YQdW+1Mw}Z)?viEcj0FCzYSGmX*_V8?{$q4TCX~+L+h9g#Tm=ib=lyQ8znSr_ zIbZ);_!#a(;CqnvX1+5r9Dc=p4*V95gwh?k5IZN32h|0Pg{tLoFc}uXYv4pU9ZrU- zh^bI^|1D7BI}QE?DRPH-XU%6h%opoyIfwaNog3<03-5v&2iy&1Tg`#9;as>H-Updy z4BQW2g%85IRKP<}_C9*Td?#%Y<k^9Tp{kiPikx|H30w>xg`40~xD`GQe}pTb>h=k! z?;1S?)8W%_6nq9QfanRc*0l!eOtxpC&R}~EHioRfIlbXJcr{!P^$z>X@MgFH&W9VJ zzE8&aE9R`V&9Dvi{TfVwufrbjO?U%*3*G@)*E72BUdkYPzs{A!C)wx#&-zc@=M7+x zhR{`7>mfs@)_Q7cQCe>jPLWzq3gIiB;3<SMHJ$XCy46xzLZM|XmeOYfag5Ms>cEHK z=vN<V(++N>Eek0Y$#(dGR<V>dR5zNESlk?V7Kf51v+0!91%0rmm{bT&xwTQ)QD7Xu z4Zq8!5}@<+J*2RJdHG_qi94R4?VGD6jAPL4H1wMmcv;;RHk=~tarOSR5M3&cWd3Qx z`=Sb|EvcxbCTv(`U5=RP@>JL{8(Cm6Dof$((*$&RD$LmMJ9(;iNhYPkF2-St>&_WN zMu+W$vU_$x>9E}}2<hXE&At~p-0y>r!O!4ocmS@4U%-v<AlwDNhLX0!5OX&04Xgye zhm6evKS0?(N1)~@e}X;XQFtXJb4I6~fYNEdK<TvKAZwQa*3O;dFi^qnA1DXwQ$Xcm zJgf*=BMMZ8H^8cJ7Ca3uhrB!NJOQi27hw&!6~@9ZVNG}#)`8eqfx56GtOwESfwLic zInV&AR^#9cunBwzHich7&So<2DW4BJQ9&)?Lf9HEffvHJVOzKZwuisKj<6E-#c!Ot z@M72mc7d|DwvqSfeW-c-PCCcT8AR(GJ6#ZTUptVQRY>-{tF*!yg6}EKEC<ghg`>ia zR5<@-W~m*@O#M$~bZWCp+Myjk_Zt(QDHhfwu7Pt()fGn!rBs(XM!)Kkf=b3M9Bo)Z zRlwcmAZ(x2!!1G+scCL<%h_wX-H;4jp{8ousv~)JFV&^ms@ASbT=#C&z3TT0sJ0pp z)mD4Jp)e6@jFJRr!k&=1x&ZSa&g(D@z6<-oJun0AhnyE?WQu(!W_&#eHszU|XYaIx zyjO3&`^35SrcDlkBXG}#W8hGDGaLq|!r^cp903<Y`fO(v91Y)rW8f~B4-diusIf~S zlu#7Gp|Aw9UK<z>Z-W!z8aNrMjZT4o!W&>LC5jE_w1hW9Y?;6<5Iq%`2GL7_8Bk{i z+zMr1%z_=@9WW7c4y-AM!<0$%T+#Qqoyp(V{MC+bTSLd^+K)s04>OT6i#70wYC7sd zBb$yyHV)T_QHUHhWR2*8{WkF<c=qIvOYN&2w8LY2NR<S!i}9r+a?M;LcSBr9LHU&2 zRfSn{;F?FdDDU?{W&M8G1U?A$JoK284<Cj1!lh7s!E&hbdICykY5W>puE~_U5-QdS zmn(B{nv~!>E0ZU3(1s~jhhX02(^o9&L~Z@`&z<y1Ew!z(WArxD()%o<cTskT-Xhu| zdgEn>$bF}wWsKRR*w&(1$W|TB$0?!?rOg)OIL!<qN95+@4G%4iXV;P%E*LtR*TssB z;V^`dwpw-Wm*=B6M&aXET}Dgd=2ubLbC8UimAB#J$Bv!s#$jxT^?2#(&b*$H7n+T( zdtDoYp+@LFv`3)|ZP2?^kCLBmIB2Y)>lNx>b^JO^gm1tB@J%QiV;j^w`8#kiq#tx% zhVMbmrR;<nCw&M{C(b?aT(}oXKYaq*L(a2uy28((=J!5_np61#4uW67Joq)701rXU z_Z^0s@B0qk55I@fTR*@R@CaNDkHSsx7~Bp|K-pLH*G7;13V-DOH~2IB1F~N!@E2sC zQQ&W=?%`k92$rwNS{;mmonQsX{+vKX*bP>JSHh~0{WF2npvGs_U=W@Oi(w6@@megL z0c*lrVI8PBAM6K5Yqa&?D%b#i4jC&s?28DnPtbfL<vf^31viB^z~=BK*b=URts!<` zpbf;{3$%mSRRQ)FI%mL6Q0@Fa{-XELjK)nmWH^6y!|mM8lX`C&$SRSbcvoaAm-dXu zD@uEYrP-SS^|WV1BlE4v>lfaobV*(-!OL97OUQ@PdMQ*=FM~~BH>fc2Q29uJ%5OXB zIQk5aUbyME39w!`zeV~u=1|VOD4J}~_y6yuE9E4eSR$+xm4mvB#-!OjBv(#Da4M=P zr=i)!IYw2C!YPhFv(=+0XKYS>30spjbt+eD(de*yDT)>$m(nvkOYl=%Twce*gY@u# zH|yHT_%fI7Dhg>RUEbj2HhUX7t@611TsJ}GrFw|v-}78|#w(`$`@-{a8vr$S83+?0 zV|ufe#5c&zT6PfLiTg09zAy*A4oAXI;V5_ra-N;}j_X)hljpMU)j0<iLXAa=q3Vr& zu%>>sW*7b5%2ecCw%90mcDR1&x2#B;*Kx*Xvn6Me>AW@(*1M{B{|M~@T8)d0ZPnvW z{v9RadvJ<05EO6{u8SycX32BL+5=4Dak9OQJ98-kO2#pwDU>Nya+FlfG#!qcaybsc z(QeRkzXl;gTUBI5K+kr+dZ5tr@hIU>oBqu*lX{VdanKdAI?TRu({8K>b5)e1>R;_l zwx=%688r6pO;GkOb2i4_bznC4Q{gyx3!DmXgDc=2@L6~ld>`HoRfL?oZ`KSSgt9jm zKn<!F!4&u~91S0V>>ms)g${fSE`scTc3y`o;kWP!cqV%ANq7-l1qZ{Y-~;d(_#|8n zHP5vMeh8n1-@&y|YZ2_Hb}Ezqb+83o4=;clU;^9-vB?9kK<OLytd-guqdl{&@Vf-o z56hz!#+-c45%u<?N!Gl}CyDNRVVm%ZlD@Zaij+RHjSSbY22s_w!=;q)b-}Te@Wta8 zq0*#)(s8sAh6h*@$Z|%+?G`e>wfhm$@*VzMQc8u;3Z9+89u>L|e~u_G<d$7jl+DLF zbilZda9f5)9Di6^`FWFrxnsxX49{ghi(Mn1gwNDQ@-_SH%m><x&QvR~&kT?M9NZ$t ze_k6p7N;0YRpdlW484lD>yr*#n&FZJ+eq~^a{z2aw(<VnhE_GK;?`P&-Wr&H)_V%R zx;(8slt=0EwDNlQ-t+H)Wa+w<+^XSLL^^eKX>RYCnKsw$uK&&Mz4v>a<f+SxUpxAB zdHyx2GynY!?!6aZ1y>-w@J)U9;k^f%+w?BUz4V5vmicjWZK0j0Eo_C7zc*kKd=sX@ zx8b#LJJh&k2fPWs2k(G8;RA3tTngWZTi^%qZMYXo@|ZJr{($=-`x646!3OXEYy!W6 zvJDQwF7Pmnhu=Wn-w1pQ`@`>HF8mRWgGZqD=pBVi;c@sR<Q#72W%vu!{LimYV=B&9 zbv}iEK}|{g4cowfp!VvOuf%vAR)F;=BfckMz9&!>w&wl}*c<YmhBF#Ag);P;LCxQv z51I21w1mvr2U<hs!UJvLyo$_mLv&T3Bisf%LCP|4G292cLY^JC1nLafOJN;&1(e_? z!tO8$rom*WcSBO(1lR}8fT{2?NEqiym<iXz{!mTgYN&6TAcamvWa3&_8(s&S!XRu3 zhd_PnBpY^x!(ckhfmg$k@K%@$=fctO0XPP(gZWTjhbn-tLtd_T-h<b}qi_oR8Qutg zg$}HYBu|Ak;VrN(Bu~!ya3*XGZ-ZIzPIv>n8!m%$;B#;;+yw81Tj7K7C|n5tg`AV? zoX^1hVb~fjhC1GVDI5Wp!MovdcrSb$z5<_sIzyH+b$*7c;ID8sjG=w4ft*Ji;QU?F z|7fi@dQbUu%3W=ayayUY_djgjEwW3yI|<@lq}aRYeEfrUvnx<0&H(~M^+w;|6xka| z!N%bl(f6oFQQNnAJFK!t;b!%v?H2Uo7Pyt_quSwEs*lRT(Xa3|IXFDzrky@EtBN%q z_lS-_Nh-wgR2|xP6zfO)aVhW9VPpP$CjJU;Z5L@weCdDnP1X>z=YofioRbxmTLEty z-Fj$$Ypg|oFCm?$%hS5A*xS(kj;MRh+w1bQe6CG&D7@zCbb0Y<%}|%ui?G+hT%La$ z_uh+7x<;4h|9sT_A5r(G*<6OgpNY=VrB7O@7aQu{d%X<ynYncDt@X}!(<l$gvicPD z71Le!m(&Khe;G=yHozpf5h~m(FbH3Tn#<S%)u+4(wbyAITm#>Qo8b<)3%&<W!d<X7 z<+>ZzhaW=iUHS-K1o>8iGXU;|gW-NSAN~YChbQ2l@Mm}$Y5o;zZzuZDtnvN<)4Bf> zUIqVxymJ#MSD85xSRPJ<F;MFz72ut)3e+6JY48PD4Q_;|!`I+hP(sU@+fFs=<s4W8 z#=$t)7-~5U{p(DF&EPE93eJbE;ZoQJu7DT9^{^e(T5w1BH$-2XIR^B#(~$bU6kY}| zgNZO6GM^ntfLB3Y1aKt%y&?0*0rb0b8_a-@LCyeoo`hFH=9dBkA@fUtLGUD`A8?pQ z2@Hm9;WaQ94uOm-0@?5$I1FOP2ZqC!VGi5`M?mb4z$l3Q5XgmJ!aR5y@>KxU_wnwb zL;n;gfkWU#m<K08+4@(Imgs%h*HpJ-&mOR0w62xWXx{|+zuj&Y(!R1?qO`Bfm`Lqw zmR(4wRkY>+9II`mog6%@($O@7%=Fo~SPgoLooU|a(hY=4HLtzc_1A@pk3Tkn6_gCm z8NsO+`ry$2PKnP_Bos0G-pogs^~7*jA%oj~gPHjo|9IAYqCKuix_mhC_&WooA|1B~ zrLV}7akRx#JTbe_ja)HEd7r8`xSSL&pkZ;TH&_N6^XKag-s0Bg!}JFJL4xddNgbD} z;R6^RB=`eLm5)Kyap@_0pp7!3lTc^j|J81OwX2%>mCEQV{&hujU#*xL3r!74jCFbH zy|&F&s5{WqrY^60xGCy>g?sOH2a{~ZLh2q>Yc5Z{$5yfTp86l@-h2MfN8R6rsiVvD z|1|3Ud`us|zg|Q2-@hJpf0iwoP<+=#-LH(g*Xy1B_->B6e=_QRPt<*jGa`RK$#)-` zqj%6F-X;B^{_QRtN?iA;=$p&AzXkS&)1cNCr^9SG1CE0;;Z%ryZ1ytEf{$>22V4#B zf}7yoQ2pC%xDU>Ok`vB5FlXK02ifZ#cmOtr^Pz-sAxwo2!-wD!s4>rDP;>2%!w=zV zco;ql8z3NSVPnX<+2*`}b#O5EFG8&)z63|YSE2g!P4Eu58LIE!0@d8G<DDnrF8DIs z4c~?D!`+Zs2j^wVY%i>eARdBe!NZXG^}zRV1pE<>fk)vKcnqrFI02bA3Y>(`z+d1? z@K^XM{2i+0{sS2w(g8DkK)`vI+^Gf`Av@>5im(f0T;bdbt3bvLfivJkusVDM)_~g~ zjl#jU2r&L|K8Cd+HbS5tqz?`>gqOfZuse){QVdNXeUd%`<50(e7H|b@37>*(AY~M| z5Pl5XLh=-72W!#L+C%;V9bi7}4Cg|=73s`_UEv0J349%13iaL9%i$h)1>6r4;9=MU z>OJ;EsPAU<g8FV`Z>aay89$ltK3xSDa6b?(hJ)dk@H)shWdcFSw_^glYwz%ll|T-> z2=Yx2M{{VoP~XbSgHz#HI1?7YZLkRH{qkb?5gZTe)37JO^B~{6beh8{FbCcQ^C0i? zJLBL~xEfA}>);Hy0p1EX!&y)&b~gMS-V3|X@b8CLzz1L=d=Sor3*lXG5u6JjfzQIl z@I|-;z5<uR&*5@-2tEeChbv%P6vvaWGvr$)&ZY2acr#oBXToQp-s?t*I!ob;a66<9 zoqymfQ15GRhArS0*a>ch>Ik%7uwB$X;a|z$Mfe?ojiT+D;r|z(Bve-xKsneEVQAr1 z8`~nrc?wqpM_(^0r+PRwCOvLnt1hk`w>A{VIrFhVyM$v5k2t(a4HR31!dn|damdC{ zVD|+Mz3e@bLk|5NYb+(8l}|49+wssoRpygF;ADKZ(#*JIRb@dp#pYgyg_|kU4f}t3 zGk!>!F8y>K^#61{_ow>lC{-SfhD*uY0?Rfl4pM@vZ9u)G@D>4|Gt;=<dcHqFn!<Y3 z23G0sB(P0@+34>Nsfrm&W8+dtSu0x@{IZ8zLgEc+{nYSpx%okOIEhJaF3+CuzJTc6 zKTaj+^6uaE-G}<qLW;t>B){rUuf$=v>;4<^E}8xvc87mJ`Tq%JB>n@3z<;5}iEOxV zZU=lD$e9n(an1@@2}&ZWK@}t42y%Avj5FaUuqOPH{^%^odUc>KJc(XE8&)Mv^<fLx z5HeN@G=d2*4)%kMA!D3C6DWP(6i$Gg4dP6J&7tzfypn?r5MW-(k>GWN()*oY1ElF9 z*cEn$-QdL#T^;BOC2jFg`aS_3gq$_vl%vvnK=K$!gyb>M3rfWLKz#=|750W{Q0I}P z!yMQTj)s|VDn$1?lDL6T!ZZZ#hS_jG916dL{ML~OO@oUdXPG$b;2rQg$o!c3?(baK zkb1ojCcycy4}1s?f%Gj-K3oJR!Nu@;xD?(Em%)4C<8VIYtQ6-V_#}J+u7b})&Q3A< z|7j@wzXrYopM}!@&%?d&1t|UL@E84FbbH*iUfqhnbHe(QwMae-Ut&MLZqG4}BZPNR z3Esu@n+7jZa;5ZR7aV<h)SEAnvv=wFk`cr&bdKf*(yKIWgh~>1;wXKa+<YA7-_iNF zn&wRv1hi-4+=zS(FUZgF=R+y=uG0C4$15Tq%3K_d5o+2SG)4^9q%RT)smoggDYCbr z`^8cBJEHFY^4*8@#U$5JP(D>&bh~EVLT+0r7v=p8SPQ-h8^i5T`r;iZJ;6M!vkLBj zdQb8_sD2GuH*47M!`|F~1XYe7L&?on{;r7Xckjkc&z!~IdExTTY9GwhH!F3RMX$Vq zq1k!G!JgyuhuQgrcmjJ@WYJ3{E2#sThq_L!XSKj-hf)58#iPs#Cq{Y4;p~$uPyQkf zNKtK!Bb=_?L}5zPt{o>^SMz`6qY&EzwHLU|b?-_MD{q&;y6{q{lw1M(zyvr8QrV__ zw)5`}QRTB4w+r}_{%sX5AG3#}aKums@*@NP&-QObe7soYG>|CIBfXq{s#r7`Fa)Q@ z*2%0(s)y~QVEnPfPbmFR?M`yx+9vv8Q*KL)lU;=j$=oO$y-RtK46017aUCf`b5=kq z)RUOUH0Sg8gI9B(2_^jf;hm5@TV`Es5M0JR@t8h}wKP+PCvl7ZHmc?@+u*M4@vXyU zIBZnTurWb%+z4|xMQk@PC0R&F@2cYcgU%yzdBAM0lfXCxi6~laIaaOO6Lm(h*(QhY zf`!jTnT=l){xHF;AB(0VOGX)MCbFzmuvvt(Wo`D!nOcg&t;EC-F6`snD`xLfo>kV; zf74yZ;gpfeVKnRo$3V&9SU3{qL;lQ}0L74Jm~SCqUpWi7p9o)qli_P{3X~4L0aoC7 z=msYi-U2m`JPoSd|I`g#8mJsQ>paGg0h)GFYLB$Ul+<3qtU>8X!Gw&Agh6D|1}I-T zKxS4#YGOi0BE@FI#FP$`l9|>gAuA=deIU*aRH1aBq=D&48Cjf8Q#p2Z4H6be&kQD} z^vDYKOiRr&i9rIaU%5!Xz6n_wDFZ{lEFbCHy?ffgKm+%eF(JS7gcL7Y?~xTkp5~FM z34N17kyZ@(^-oRd*FPzkl1Rg|$*C0bOYPq`*dsY1BbZ5wQhQ~Z{3<t<LqUAr!7Gyn zh4NITtPs3SZ68rJ<Qq{vrsfp?X{G&>QnNA!h0<Rw6hLXr?B6{jlktL${Pd8Y+<6hu zI-e1C&Pog>UlsDG9^o<Is!%S^40-4w-TP2X0}}XuW~lsYghGUULurhS^z7OH>Z?Oh z*9`e7>a?unqzv<baMWjoLWF%oRa7hFsh{^u=$q1Kko$X2sA`9T_`Cz>yM<9F<m-zd z{Gd$JL{t-XLjm1r!hu4iP%jk5ltN~Ygg!|j&$FXElT&(Tg^Hnm$WzJ4%u3>asR`-9 z<d7US2!-(bs@*Ad4MV<>zaJ3#eWOr_@b3qN5_e9>w`W>LkECGtv_6TUpPn1?%t%eN ziR+&p@{J4m_Dx9*_Do91>YtGmlBx4TzI~EXgDC@;Tem509P&s{$jrPd4NW6;rOY%5 zdG$$1?bSb_S5mN7MjDT-=LTpR3NRokBQqr}HT1Y<A)nN=tdt(%cHTVX(X)S_K0%`c zJPA2J>}LhY_<GHyMacK6q?BICS)pXM40)tv279IqOiB!<r)2d=HX2j;xF8gue`;b< zMxT__q+ohlW=fV)+|<oWt1<#*C8zYbGBqhPGnC`jp-??Dt<G%Z{=QAfCnYPPPfCv< zMTXSX!uzM1OxFcUin52Xu+cty#8^I*W?fr_Tt{l}tkD<>-8$qR;oK(V%&zm|P%IaQ zoXu`CB;t(N64_$r;utvl=)9Z>IeEoK)NXAkFFK>1DM@`2ZBLY%mTDV`JWWsK^X#6M z*2gGId756z=ZT_E>XnpXBvJmRhw}NGIx(t3zNTx6_6@dg*RCDk$Eh5vAQhvMX0^T1 zWAd&P<t;U@4oH5Lqx?+oq&k*o)hJIl;l55-p-zhmWkt$%)M^?EQ!OeC8m3S8gdSHK znVUfXU+MNq>p|z7mKyAlk{C=$?U`m|PJw)-913K*M)k{qW;{!we8n9ZDrsO=MnWhu zU#Uk1Gmn&op~!rt9}1P8kuo45E6Fq{h4B@CD2ypbb;t_ftAJ2|K4}TGtxz1kdI$yS znSdgYrc@kN!X+3A&>h`m4V|&g-Fzn%6$Sg}kI65Xm>=w!o0k*pX^mA`LkeWAAp)i3 zbLw;M@Q6TqmI9gdDkd*bLea?a+Kg?=SRqVu?Xz;n7Ur3q+Brm)lU*{tD91>?f|+Vp zu)ev)#q8${_AMAbJ}<|#MEO6eOqmCb%-1&#RfTe2>ba*Dkeghy#Mvuva^a|8DjzH{ za<5>^ykOQZtDqp*J$Iz3;eoN#os(BGzMyATuvec!>B-n_8CYh)wEkJrXr|RSC6v8N z+6Ra8Eds3XVR_lbIu)dH?73(bUQo(1DNGw<s^TE}v4S%!H-Eg`J<}8$3?ntkB+P~= z&K+Is50TkBCDSx`>m3(2bfn)qJ)?*3#}|#v9qRY(p3>_g-_wipvnTq!uS!VG?4R1p zl)8;RdsM+_e~8{`$qC&t2~Lmwq>jxm2D?rTDw>dsk~Pbp9MHp@<hg`7SXLPC>n6<z zP%AVp@<lS%e0JM@Ke^c0DK;(L(-IT>X-P;->z+h!?3(GSavLzIdszWpGdvuuN14HT z^v}#n>l<huimg3w4wQbZG5dq<O;HUql~0%qS`p@3UurOzDk14(is5;x+Frg~QVhBI zBMMA_N6IQE?@&+`_D{9SilL~WFsG;_m%Y062vdL@M?a<5RQ7qE_@!l}U_4u$n3d5# zNdqBc-zh{n38+5=J#|)QkBpS`EE9jeKYn*MTN5KyV!tQ<%Dwr-ISr>o9~0BO3ARp^ z*i7oU*T7&3>*{>eFOgAyM$WJxQC5lVZ@m&YJ*S8Hs<iQ`iBFYtm>})hQ=b9UFBni( ziT%kwCbKY`WA^LfkY;~Qn2el}oS|ZV-3X6wqZ5>sQ|zWl-s{M1R#q^Rlm`3c=I8Xy zVVpdyn4g;jt1XkAMB9pcs1?hrHou%{f0;BXXIKx;<mAgO#<_x<+HgkbbgRVbtHVU3 zPZ^pMb14D7Lz!2SZ40L{LEdB|R#y99cfCf5%E&ZJEa`gf-iA5nKa(4z*Q*kHh&WVM zUL*;_hX<9qg7HN*l2`(*k9d%&HXTeu@{}|s(R@JA{-7y8cqQTo!5(=9#W|7Do=Yfc z0piGX+rLqti8Oyx6)FR@a9@DFYTJE{pqN5Eiy%>T9YkiU#BPavyz=BL7S-a>dJ)M_ zG#`_-=~v36dwdU0FYZZ^Na?FCm9nU!4?O|fOrqP8Ao`Rjaj106Hx_N>NxD;pPYU*B zM~exnO86?O5=zyiFUg9)#OX_N9pYGNrOOoJ)y(^PQukvxr+kt-l)9L3>iX!7(Nm;O zEz~V5J(w8$MWw3#EGq3i%oLR=Zae=;H%nF9X3;0NxFnUGLZ*h*R1bxlrAb<K+<Z+H z;}KzsXprVRvnFgU{Q8m&^n<VMD8)~sGnpqrI8|@y_Uk_8H_h?Yx1s$NBjsX>G?On2 zVydVD75B5IM0*62&77CYQ>l3@BJQL~Sn1{$Qb|*Nx*>B|cAm|rghAgP;+bkLi8&*( z5oBXS49B){KXe;PUZrsIOwE*)JQe9~TP&u+6;KIOV_j+!(LJ%JDP@WChgO_J4NU2f zG@EBiHT~&UB7$YLp*}@YCH4i^IWb4JPf^emz;h7=FhHLeGVw^uuIAZfvqwQ5CnPB` zPus-UA`BXR*UMI!Po<kSs~x!JrxZxh_+ceMDo|;(^&wTZ$mYU5Yde_5$ZU+NSoNh= z|FA13Ir*fO)Dj@SShJ)iM2+aw7<KJFHT)4&`#6=!lQ!w;1;r)B!-{eXOM>)vRbqAW zw_B662LI<2?N1fvZOYB3m`mwYm2HYGhER!{vb{2*Y>YgbN>qC0`sy2vD)UhB++&lO zmCdP(CaeVUN4F?!r<$H!ls&dMh&5Ry_JhdgYP!NQR7cQsnm73#$*Omi*lG4*TIVo* zu#OX^`5EPben7FI*No3}-%pMHGnJr@_i^H&0Mlt6B^-UL9y-WCuu5!pM4~fHHHNA# zLaI&1C)>32$}TR<$j%>`W8(1Xb!x}gD@lNsxDW6I1mWq?y<n1ghRWsv8>6e|t(CDd z>NmFFmE4uK9VBNLn|7sN6`QD}JMOYk4Zy^*vTwBDyKdq4Ow7#5<IQxh$yT<K-GjoD zlbY;M8-W_O*R`9+go?4ODmLxwJ@+9!w4*i0JVPR}#6~D_HtkA1XwdX!Uqp&TFw~h@ zfmU9>i3*}rm@Zfy)2OH-^3|O56z$As!Wo%17R2U=>PC7Pm03+9DdBgL60@SF)@kxB z-7a%i9<I^gY6BIUs`x)l3M1-nd+(`9olvx@ut(hTMv}6!M=Clst{B%gQ!-3>sSzx4 zOR`5F*|t?;57)K=U2N2qr;*fTAG9I+W=~2lDj1=0u=&Bu5jjuInP@VnvMOy0T4VJF z8&OEsO<Gh;>)eX*G_-ntqj)1_*|g>*ZdlWLRdG3Po~?`}<qr=_m=bfJ^;WJt?PB`H zQk{iqdE00X)QcTj%Std>oNhqLJj1QcyaM_^uQpX*BO{WKK~Eb_gPP<!_J^L`U?MAL z-Ao;(uu^YIPrXl;jm#w0q-m-RX`&3K7v(U~7Vh&(HPN8ST^6N;?nY-8=U|7G<QT0V zZJ~wQh->hvytKYW33wfwY;~p*s>FU8)p*LVhE+yy*u=U6A=AQakMrMFuub(HHtWd+ zMY*oNQGs+*UOEJm%|TphJa0u*5_W#5medB0xCtHLbv&j?EpyZ5Y0c=CT815BJNi=5 zSv4PNPWn`|64=8ki^vYeNV^g^%P%d)RlRLwgr$3AjU)AaQR;@qDH~Syb4a0_O1A}# zmim#wGe4yLy2E8-Rm$X$eu(N#gT|&v^p(0D`j}_QMES3AMbNa{dHfj5hv_Db5R5`^ zNd++COkv1aRLD2s*!-r#7-I{=3`C8wX>?11|KVwcIr-+<(&5|X6CN!Z0SoDoO16@X zx(&4{HNYL#Lk-XbmfIqm#*k8wY1PYy>uX=#mzh0~=|YVxJ=N5+D2L4vX8NoL2j36H zdNak<*!O7LEt({&6HKyRDfz>^Qy5IO*{(~^xU_Tts@Ob4c7=&Z!!>=1m0Cn}%QU+c zWKXn>EWMY4DQWEk2~nX{^z`_nf_(}K#*8mC4^Z2Gnj%qVliXLvDJ#?CYj%eR+b&Vc zkuE@^h+<z<JqpH#6q71SGd?D<c3LdGIEASmMJR(hvOdf+v_?(EdXLWH$YdiRdPO2V zGhzHBud_7Tvl3leLeIWIb)4zhx!C)d0g|VRVI#yfFXj4g0~5JhiC(s{-MY;jKU5>E zP#nKf42s-nPepC4#<y%CbjQ{*nLpRw8)3`H88@E3!W5+Px7JFv>FL}uEW=<lMRB{$ zx0?XdR6ZeHp2D-DVnXWEDOxwT!x+;woUn!Lb|SQ?{OmlF4OR3Hil)8Qo75dvlu4fy z)Tt^bXsV*L?PYb|N>@BWZNamjq@}%nBfq3$2c}>D!^E+&)5tbITgJWyq2g=KJR2!@ z%|_F{mXOo%U|6zbGNUIyV=Ka%;4*Er$)l)PyO>Ihu#{o2+BAG-N>m*S)~V4<+AeIT zls1z-pQ0%}As~Gb^s92y#jf+o9|}4*JHJFGtTc~Fu+ld++-!^_b&Zg>P+9N=t}3wy z$Tw;;Ewh6uhF(gQ+ZQrbmNV8G>x#9XO^al~h|8GpQ}j(w1<{r(@??TY1x8AgHPRN? z(lpv96HCX4la#~Fw!*y1H#V9gofeislf)YdCne%av^y1M1iRE+gsp~C=yYT5jU!i# z%}fVtI;$wPZCm|hn`ndyb*IW?Q%{xH!PeE<B1Str>88zSM3XZK&=<ajVk)HU=}(=m zUL}?ylwRvT8JkL-=N6lNYcWb!sI1B;MANU`>MLC47YZjEnNU@n@21tYPfSVPX-nMn zP$8)Z8gu4azu*OX6_ga1P$oKMUAwJFrL_`FBj{is;P#DHRTw#G>!v9uKZhw`Q%|La z5mql0ducRZd@(69QI}z2Tbs|{7}N^f1`%ou>O)$RNo3M5R;FU4w*SUYir7q&NY$HS z+2SU{P78z#as42}&14DN^v0TK)G6wlP!xv00}ju3+c_dF)l0WBZ%dytx!4rLlm6Hk z3(&==a<yAhWoy=G>_n~+RbK~T1D0V68!0GjxMLe%iLKVmp}8fdK20yEQu-^R0}F;s z4~foIR$HoOO_t?$#A-Hg3#aKUdRZ~|N?NjFZ4ikyy-;AHULQqgN_$VC=*grvKus^! zu-*n&L65aXlaQBJFw6>qN@kr~VB?1x^%1JarbH%{5K<~;5+`b2&NNy7)SH#`^87YE zGug|D9g`K<hNG0UwYd-V)ppKDC*e__R&B@#n{1+CR-j;L4vKTQ`;j)QKGj>Ew7Su= zKS+Bh`5SE$x2qw>RU;j(ic&%*PwvXF?IxdhOF_d#)2Vo!vXVRAdiKp3TTnFF#HHq{ z(kHI|nWGAdN{lf1EC?&1&-oq~O2g@8RH@NQw^@&#I!@4pRu;3|gxN`l9@*@}#Lv`4 zq!ki0B5<egiBZ##k{AxY2u#Qh=Fzhm-P*>jWK-tmnNpA1u%IqS2{F>F@$%Zzon%NS zDC+WIf1_Z^xz?V#6xWQjgNi?F&G=fj(b3^f(*`RwuCzkpnk=lDGr*US{7Yi}vWBH? z#w13qDmM$<Jci6gS-P|R<%Hob3(@>SS)oCzX8RQ6k2Fd187roL51UP<-k!0=m8CCl zm@-uVMEr^aS!&<eD3F~|=`>B*w4ZP3^rgql!ky8U$83yd^c+kmEX)fxooJ<J=XIWO z^B8KZCLK~j{jB2CxKqOlwV}zH4U$}!nj|tBw2dvAKDk4SIP}g$q!RnipC%PDhD@l$ z#=C8S?3xVdG)hl`tVwQyN{;H==#BYH!6yu#kexrwoxfBQEkjdV(XJKwLwEYk#H-Ad zQv4>1KiEFPU5FtwCV6E}t=cjvHTQ0Wxr{+p&`6(FxT)rl$_)+H^(ZOzQC5e!n>dP% z{J5pXY@d;zXamP|SY>D`qhnmz?3p_$N3YRWiM`V{r%=rsiPesN%3s}!u@@e+fmG;9 znC$gVwm97$$e2*+u9NABee(yVGm8>mZ|=}6KH1+{tr{A`t8*#6a$p;Gsj;2yN>2;x zknm)kgs(597&4)IaD)K1kg0h!HSPG8A~x++Me;A9{R2%?=QsEgX$L7rv^BCi)fma9 z^<`fH+aDT{C~H>R)R1qI*7gF?hOP-U)yjpj7)*Sp+bRpyqe-3mnI=4+S824UM?Wu7 zAE43*&8MhBRYnuT6&l%vsYp(XirvWOL~FUYQeo|Hy<9_K+P=<&it3h3V#^r#Tl480 zt0iQ3*r7bTJTxC&dN#sH`DmMFJ4umaX9U#i9ri05GizyTTg9R6jwDd#C2Gvr%{Fh= znlQ<$;TDB@b5)u7vC1glmbxZ{OhHQ}8c&J%aO>&qN07T&Y0x_P8lPmkR&h$PyPj$y zP&;UD+K6x3!_=Wfv>!g+_{y|C9mzp1%wjdOYMQL=?}qVgJ<S-}CKa+AmD`AEIuloC zo7({_>lC;vrE{%>_^Tl#PoCXkyC&(VdhV0mITh1gt&UJ^GNdJEQXIEh2~jCf%SHzk z+7y_1Hd7i><a&jOjycy1)LjK>L|-qKdYyyOJ7wEAwsL(v3v(1I<=)DhH=M?lA7h>< zsY&<ygu6}2Uy4m3TW7{1nMN-vjSu<+h4L_SF-GXmkCX+YLCWq*jR+Q66_jaTT#@FR zZ6omXzA1e*#Ds8vtgQofX*9}$Fxf0~AZgNeEY6glXZ4ygecYC*u|dqwU-S#CyBEmz zaM9MCb!}zSYxh{F^_qO?T^+=fd@(jN4^IjWQf=~OFUcOtDJse@KtCz(r3>4t_i7QP z?Jl1vg1g<vsJl`{)^+7cO+2Bb1fw@3RqxrL?qZKw6SWf(V{8VzN!U=!KA-ry+4y`W zXE3A!LbJ7!?TEQ#TQ>)7X@``g(s#m^wzbccG&{(WdGj9=$3_wUO!_hQd{(h3vcaTY z3L<Q%*dqHd9NcX92({vfMsI2+vO~9X`XAYhyJBzJYV^R!E?3!7?Pcc^u>2YRP#Hz0 zdG@lo_4JaLU(*$RZGY%01E~l#QSI0DT6iCNE`2G?mgd9Z{Af@R(9*<z4)sm)#zi(J zx;IyNRA*1xDBY4X`oD~6FWZ-wo;@~Y5;1qFOh_w6&av38TpKlM4_?!=h5VXzbPZ-x zWM$8%**2vYT`3&bl#n?6!oXLp%w1S^$L%KPPx_lN8aI`_d!{X@H#<d#Wi8W*QDvqo z3jJCgiC)~~skS8<*(@!DMmArx0sR{bP2GR*AGa96lyUL^b&r7i#`el$BbyrQ8k!d~ z<vfXKNQc%oLef3kABjoCiO9(mGn1)K`(1x7m@zkV`UtMJKJ_Tw>^=41&Lx?mlo09b z(o~8o<3=q1%e1%CiiK9|t7J|2m9opM&^%>ZgVD`qI9-hgwo|%Oc;Q2$7CG%}e>L6~ zL3m`YfIDrD(#DtMu>sUhdjDlhz^~j)S2n^L`?lRZV1GytZ%hiipXk4TXo|fI{bP)P z$Zo)NK|H}ov6&80H&BMEHVd0SSkuC{u*q=J)P%Aa)x=CH8oH@RC3#hB-1qq0-5NFh zM+VXsG7&s|WgBb6B&$0&Xf4XLqFf!fZgrKk*atRtYlFGbyK4}>=ei<iL|2kt_WFdW z=EzZ))ksg4va^gvI!+EWgz@?b^ZW7PmXgnUo>34ZBAPkt%ig9q85?y_HJVv48#ZOE zwa0N5Z&x#qU6j+Kh#isnnK>L)l9QRk$;G2GnaT34392ZJ8KA`(nrPaH5iCfV$L=d# z0zo6&dTg``Fnz*TwiVbuGqgOc;a3Hdh45@)xWXh4kvo*^I(M1Ish!9>#k!2$om&!7 zSj9oL-0(uHW|N+d(znc;gab&ZOZVTlxkk^VnPK=0Y;E;}Oo5qxsSJ6wA{cFbsSnah zk~`XG>y)X7i0<6PSeA^MU#iNA)n4qAAFyp*R!nGcXc}@`SJ2$ilWgS={WWDO!!+Bn zCV)DcW-GNHy`&Pk@KR8aXX0>Ybo*xW0!c{$i`gMFP1g8wU*U(kc%`V+;;wDWN8Pl$ z=BYxSj58(fb<iqDHOjIVEKHJC_#PT54~nnU{E_X$XWQa*r|hIGv{iy8l9)4e{K#Zh z=<Ni%dMJ0O=US{G)oc{ll*krsl!&^cNIh>Ff7HOiRGw0Ye0ipi(s7zQ?HXEsF>y+k z)Z+wm3x<v#VSXDq!ZE^Bmf2=Hwo+D}-J#M(F$RZmx{^CRQK&ZnayU6ywb|EI5q35y z#jgEIJw(s`bG917dVt8v!MK<f{r7D9Y4x9-CwI?%J^tj}4V^yubNkj&!(Tp>@LSgR zzkR~F5uAHKxZP>3$A2@oQ^kP?X3yEPWkq0D(z-i3v@JjD<9$~ypD}gSI?muS;XePR z_ItUDw`Z=rXx*%;pVt_$=&rl2+>(CU=d*7(`>Tf8Gx~Doh6#7<&8`_A@8~qP_kB}7 z>e?!??OT8C?Qmhj#ka3tw|?VIe@=d$vv^2gT+Dmde180w@`oxt|Id^i`w#v8aE~t@ z%vy8iO*dbdkpAQSw`6c=fKF|Xi`lxQ@fW`io!Iz;yDCkov$xOlb3V?#{iU~;9e*z2 z`te!k=)CS{Ot{`LRn8td>C6V-e^R0Ci))|$Y0!vs{w`>LWW&+NCbW67O$i%FPMUB_ zs+>IS%bAT{?R;s|;<}G7s25l7yV2K;Uf$r{-_!n1>euyG&fhMt=T6<(dcuwg`DeCh z-@e7A&Fk)ZVDOH2Hs&5#H@W6b?-$;A|LL54V8RVrH0i=cO$&oXPv5-YXq_n!lzXB7 zwAGj0cH7iWeLK~^bn-uZcgKYL>w@I7Qa`Hr_6tK(nmjk@`WNr7+^tF6`(xhk{72P0 z=dO8oC}#_im$;a&b?@8q@yV-dwHo%)@F(j|IP~d>HkH1f@<FR<&0d^8q~6mUCUct! zxBH9ob)Rb7|NNhFF4^(YtTr{eoi(9B##MV4Kbv*m?8{o#p`1T9;eLz1?yX9<?me{i z?@!y+ob`I)KZR{;KQ#Y^+7~YB@Z2wVw&}^4M-}wk<bNBi%xyXSyPU6vuD!48(3Uf* z51sSz?0YIz`EAe}Ck|eSyxd^IeenM8_n!E)Pvgdq4EZaj{?wm`U9kV5j?FT%s(1Qf z#&-i3-p(0<CfuL}XG~aF;hEPrJbl*(J15rsd*$-nyT-MeHf=zsaSPgBS+dD|XNTve zzdQWLwD)h`n$`5TFaKTp+PYWHdAi$!D_`j~GV!bW$p^1!!I=-72N)M~#kn^f`D1tC z+*?!Ldgy|<dGEY_VphvFdp1At%Z`$1-|cR}p%OZGHZG>^ZMjP?S=s)%>Z|{ne#fN) z{(Y<9;VBCzT#|SoX?4uV4R_wb8D7j9#l_UQ@!Jj;e6a72OYU#Kv)RTif5mKn>!Kx} zwkdr3op$+EzqzbEOFSlAgKx$cw`yB|K&$85EZNt3P45FO9(tz1jN3n5e0P@>N4ig< zj5*tw_}*PSe9*Qoqv{2ATsOb)vJshmN>;=?k<;pf4Xrv=-k<a%<=lp|Z{lLcp0VuQ z?<?KAqv4v(7tJkBnfcu%^Pkyv`-5+E?$vD9@4vh{$($)kxN}xMdhmjR<MW@ITp|1P zH*2)mwsK8T*N3iJxbn1`XEdn)1AUs#8;pyItCsTGPrJvwx$?qAe_T5KhBs<Hd-3N# zzuB_UBeNTIUAz423pv}DBSqq3n)bi$^B0a6&O86;vQ@KxT=rS=?s<C$Tw3Y%7yfGX z@70?Q9^kAZ6YiZOjfQ<O>A8LX)@e5Nh6^e;{`1-Ua|gV?{p-wgk8B_P_tgu`8Ck@a z`@^vc9cMOPckHVx&v>xsL!aKaW$fOsXWVn`TjwwAcH+f(=b5vm2-kMvMKwR!yrthY zXKkNT{ODU5d)}J9ddI$jwca~%-<XmMYK#j6j&VL!T+G+=&-t*~?3drY;i(&^AAa)E zUhC^!d{%as8GR2Naf&<qe(jT-S<E3WaWS<g{JpmNv&}yLxzlZ*w*BzJgg0MqdhF17 zU#+~R_07GD>dafnnSUl++jVE1JLl_zfyehAKbHK$Ka*EZytdNo$6jeZ`|h)Df8+N* zIT)yNHN{tM#+X0;tkZ97`5i->9H?KTdF9XR&5GOe;4Sy9k2~kYs;YlcekR;oM-OaV z-sr$D7u7htZON|K&C54uHg5aqd5IUroZa*Ap@+ZV<Tn#8Fzd_7U*6qo+>IAk9i6eX z#T%9GK3Tux`rn+?p54xAIlbIXe4h&45f^iAlL;Lfo|(BRZ`)Z*vzDLz<*n6jSaayW z@g}cz?^<n6t^LWgHxq96zHiSycjNAhR;F!!X3VZ(v5Pi*{@v%#pE+?#oAGN}FF8v4 z_`-y1e&?C@o_=)3`)%X<K0l=W>is{@f3?S)F151$nVWR{kDr&##S*3s$HinU+A(g+ z{U1-MapjC#^K$llbg0qwKel=J%Hf;K)tdA7fCBoDWhUGg2|xU{?x~|=K7MXp(U>Rd z-+I$8aan28r=MurzgF#K2cOx+c|<1MJ^PBBxK)|+dmMT9wH^tb$4|N7y3<+@e&*SF z)pC2+Xjzf&YhZOfw`YsNIfdf~4q9HP-xG-wM}KxWdBW_cMon9EQ_i>3ubTJz!{~7n zZvG1wZ2hzQockM|{lm|jpFNbY_Tt|w#AO{@p1<+$Grk}9!xG+5=75>Fm|fFaPrf?v z-I4Mae7pbULEle)>z?{MRz0xgk;{u~om0Ex$9HfRwh7no>8zhVEI4cbOV_nN*{<ct zOD|iwHgjvycTSZL6Bc}PS>yhkb!Ni-ykzgZ?&&Q)D3_D;`^KHkFZj6b#|`GkG_HNx zXYVZhDQ5l~$f*gpvEZk<7v0#q-GmXD*REdFb;Q|6-<mdWNABBCwmp`+e_HXi$SGwQ z7gK5PABzX9-P8G{GY<vs`enze(;j%O!t|-{6~%p>Fy+scWB%ssN)vAG#=?Hn??1HR zvXxhU*nj)5&(@5JpSx??O|j>!s-N~!cIyY}w@kR^OV=gecF8w)4E}V}z2DaCdsn?W zNzRX-R@gpa>|-DPe$Iu{v0*6dxR~4DJMiYxOZr~@WwR^Bjr_e;^`g7JoB3OZ+je~W z;j}G->kj6y9ld807xVF+du}*;UA=i1boyh^wVSHnaN8R%Hyd^P<qNi^&wKTr$2K>n z-!kEjq<{Qa{{27qfA-Q_^17@#x!6hQJmEn6(d~75Ratq#Z5K4-*aUP@T+BZ^M&I__ zpiWoho%p3)xBE`C{@|14=XdJ4qi&rIPv%}!@oy$P_3}wv%=L8|UUK=Ni@FWoy{CJ} z3lsb7|LMZj^P6RT_vr8IwjEEZh77!I!Zm94Ui<5dAARMv$;C@w>;BaAx0kiJV9#q; zWz>H6>h0yT_KoLo2bM?UVwN}Ev$p&-6Bk~-ez$Yz@t-QysMY=AiOqkQa^9YqU*EH6 z=otD-6K>cWO;((Lto*C}%00B?mvxCxeK76a5kEGaRQ}sbuiY^E`p<dhJ`?WEKWDD| zFn8v2SHB$l_<^5qx_Hqew~X8H+u($`gInG3YvWrm4BIo<jEgC%kXNaBvz`whO-X#` z@VCL<HT#aPKl<yd4`gk<?v3x}JwjY_Ot^1GO=>hL>!BmB?Z3KG+K@xDo0JUdcyjpH zS6(u=|AV)FsP+BBCfv2zJ6|YHJvyy*yGqG{Z+14gqUP>JP2XCxvGQ|299(z7z3n*b zwYHx7)uM$b?|tlzhgt@Q4X+eCbI{s<A6eVK&dh#SRbTqtzn3&aUgn!{JHD?os!7xN z8((O??A)nOzc;hN?2|KBR_?gqgU6k=J8u7cJ?+<o+xx@qT}Ef0{@#^s_rKcYxsUqg z)*f6d^V6^X?SJji_~WsgX>S)}+sDOBd|}jIUAiv3KWleZvp1jl^Nae|7hXHO!|Gnk zk4=34=JeIG`R<1a_wdM(`I~;dcV>L~>-NpwKd5`Rf`_-aU7vLJQ-hjbvH9^UZow`w z;eP!0w-J38J$p;WiGu6f-#DoMwpHa{f4%FM6OvZFK5xL}VH-J9mmzjs%+R-=8TJ0` z$KKwx_T>ImhaVld@B3$#7rcIT!pX{=$28qF@M-j<3AeZZr4wGcyxCn-oReLDsP);` zzrNgS|K*cMKl9GPN%bqYUyMH8X2O*W%DB4fV=b?|qv<1`ciMW@kQ=MtQT_6thb`Hg zwej}vnteKlbEB{o<6>Gp@bT=Dch9I>_3S2R_xd37nYO)NI$p8wuyRh7ZO0y2+Ncd@ zPML6D-1o%%(U%O|d*`9~o9@~(@bGmn?0t0eoLw(n-fDccFY51mh%@O-xK3?<__B9} zt?^T1OMbgzZ{7plR?WCS_dw;Hxxc>s@Z!cVHsvf~+DKf?<S~t#I}gmReB1OF&(3Ny z_0Gcyvv<c<i+$wY*B*a;R;z2j=8P>9Ztsz;GuFgryjD>6#U=f(-+g^T-_C!O4F9Qi zqH{~bIT_7na{8PJS8rQJg*sQwnYN+x!qe{VKd9EH*NmT7dGNi1>R$22hNMCLhw#k$ zdhW@ootOWbmw#b$rCCpWFnaEyD^L7!?mLs~b?bXw-JkAwcz-5mb(wI-56qd~u-iXv z>)m`fX7SHM-#L`E?UqA#cIrHTb^aSSFIe1_@5h^PZ=~M!dqKsUKig2DWaETuj$HD^ zjR$+TI`{2e4-6_k@A$5-dU31+vxRXnAKr1%N1JQ*+rQxZ7D=6dX!Yf?rRnt+o;J1f z(b4q}bj@m>&N#({8@zqN!{aYLJ@EOgK|j}8*|FiyjeSn5*|T1}bJL04TaQiN!kLmL z+_64m7tT6V@>iei8kcq0T9~!2=Ci9FpL67bq2FAW5bXLm?M=((aWS8bncQ~vigSKD zbbG%p@#hTOF(vo)%U9ez{mQ&@wQkzA{i-y+AIu0oE@sfd>C=+te)8>#?|0w2XvzD} zO<mFQsY+Fj_Pp=DlqSs|ZHV2pz=Yd8{`k~I4`uhv@AJ$1*G}u`-1*KQEiaAlGH3iN z3y+-HapGRaW+vR~j0(R@?b~R|4Ue~6+bCh~&aWmmJ~s6KQ1>qIaaGm+_)a@1=`=6_ z3j`@JK#*Vy1X?hq1t$>TRDuR5P^CzqrKHf(*i0Zu3kj1##z~}Hs}xbG2-hNbDOVmT z@<^bNf)xu?Esv{3Q8P@vRs{`Lu)ptj?Z=#%IaB)5&;Oqfbk_Oqwbx#I?Y-B2pVR-) ztB1Y6?CEbbJ~#{MVnQAr*}L_KpM7h@-OoOG%0qiy@zNL1J8SuAHKj*YZ@Bo4|9ZIQ zxbI<3!6P~7XMS@3NsS*H_2Fy#U#V7}a?$Ez?)l}-Q$L(D>-_i$NB-=NKce4yTll^^ z=IJx8_|XquuMJ<-@#`g@zU#?1r#^q%ix<}3IpvDa|M`I5!55qe+eAn1GokdAzpS|G zslDI1X+rms_rJHt#8IamdC>3f{>>v>4;^)S*EGEAT=*8v{ld^^dtQC(txvu2=KTMD zuK(+E-v9WKKYZqo|8c>*&Zo}h*6CZq_x-ojWv4|~ZrZ1I>2oUelfya(j-2}amo9qf zmD}IH<-@10TY-0_9>R3h=O0+OZ@BT{tIm7rFHhWh*2Rtg`<01pM>g*{ey`T<8-{*~ zdBv^5_u3m9PCM)3zYR@&wSB}Rsr@(KfB(tvZ92L7wsm)1^!(!o9`QQ*E#W(1pF4)< zUvR*l^=ps%)ng+rcy`j1Z{M@umea>wdH;qPSM7iHQ+P*Wl<8)=*4=l<BL^J)^H(<Q z|LX&e*)Zw7cYb(Z&5?&cc=Og(;|{)V2>w*~-oNyy`M>?*#d}V8;bZT7``)`J|M<LL zKY8No|M|d`kA3r+^p)>TM7qNF*J+)%-!ygMkFGiS-Ivb$<b&t`_*>28FP!m*qy8s$ z@eiI^ehBPxEXKyskzd<#`~K&AXY6w~e(IoiI~q4We!|A_`yROFH*XDf-Z%QNJ>Epy zT`YXhOg`=4*ShNe`Q#^Fnz^z1@u~wGzw^um4_)__)O*i-{f}pidl2<X_%2y<*O(io zmG_tYFw!^lkD7hfop;Nn=bV4S)I;un?WJoTxdrXlL!TZU`S%q!rlzmF?V)|={CL#- z-mjlHad^(CJr*Udxb{DuTHf@;^}`qs3Eyikys>c9f@jXZVAAB*zxBZjAAI=L&!2Y5 zEpsP6TJgCT{&CoQXdiD1-#=SN{Nl!*Igg${^!=gUkDWB<|0=$GaB}VNIX{{dzxt(D zj(7ksf;yb(KKirYt~&CksrjXQH<#SC>FM5{-~9fi(f2<1-s9)o`Khz7zF<B4n($p6 zo%!4A#y@+{maD(_oBiMV_LqLYrK+#vPb)@0e)?b9C$D+@V!TUUVXg;Wb=pZYvHUHc z2%gD}>bbLI-MMvU95*j6zjh{ed1Nno<{X?<h~rwt%(++3n%6e_@+>e191HP9jboa3 zLR#y>Su-j2xS8^PsbgmC1{u4mM+@)0?Xo6((bZ0wB*4J4c$s|HgvF1)jPJ<UH6gYR z%vx~uoVi!boD*-B_X6ycP=Cpz0xej$o2(@Zf7msKcDu6(7RuTBoyuuJfjSlSYi)N^ z#^=Q6FPMF4%iP_gqiyfIN1Ds=tT}Vo+;>x!T|Lyq?$Ol=UC_dPr`;^HH9mXZ+{>KM zD{$u|%GZOnMyuOvPdsYog>$c-z2Mr`=vi~)tuv3SnTg$0akt0S98+`5ag%E%9d}I4 z%r-1_&x9nu*WCq4v#<vTi2+K@JbUh}g$r62%!x-YnA_TR>AdK9@wVA>7tB1q=J?}h zVux;i8%{u6H}itiX5yV+^IB(~eICf;CLJ?z@-Y)9o^ae`*IisQYatFx&Ygd`OJ$cj z9ao`H>*X}O6PvZe?o+<?(s@q)?ooRdE<B>t7al$TQX1Gv|5s>_3XPprIIvmQ`7`pb zNa`BAs$tH*HaGafE((9)+-$@AS7hYce@iM?|65XN{kNnN-$p7s<J*G0<nC+JExS`+ z<3TT(FPGa~Yu-J+VotoJwFT$-o!Eaxg};0o=Gc8kZ~wQXQjo~*DTh{lEUtBC>oqN{ zvv7R(Us@nI;Bw{sY!bVag*oxra;N8Cs_>=%BC}uG7GKZ|mmi?~4*M0`POr@yhV6)T z{Sy~?`SDIo6$>T>n6BV3UA9--5tRyrx#5wo&d#47V8Pwjw7<Md#qT%jJY1C6JvMb_ zz$kJ4Zk%^Gxjyq=F^{ip4KVQzSJGYRMEqtnO@3EbRPsE>?x~h@;?i<<ZcW3VN!<W< zX2oZ_+RU7*<8$U`3w8Ho-dAZ_@G7#agWBZ|R~nyZ!`S!=R}XiO%5&mWdN&L8+X3&S zp0i*#%a0$I+vNWh!zT12moD5*)`q@(gJE|1v`b}YmNDq6@U6h3b4{@$lKst1T=UMf zHop+PzPd9~3fip6WJ}v+Sh>!hOYcY~i%G`x{OH!UmKK~x-aWN*PJHJ}qCiPB%j;Tk z{dxDO=6ba`aoq8o<%Iq#+KqhMayQj<r*}*1rETp_?OiH<Cld>n3vx>=YmOau(s<R} z?)S~{yc)F&`q@q-Z%J*JED7~;z1r^4Z&u57mt^bDF36Pof;&}dd_IjkSi5=1>hB$c zC;vNK{cQ2J${mZH%5#7V+MSy>vWEeIJEfbiJdTsCA3OBT){fmb-Er&L<|A=CrE!5Z z<MFF;5qxfTn=Y&R4wp8DCUdhxs$CFds|_d3K8d^J6`X%X7bfTOcaQyiVrTottGgld zlJ`sWcw_hL%F7zNU22?fCfMy#n{hpIHw*Q-x~p*7VE0Jp6cgX6*<HeXt0%iu@#n<R z=<zB~r&qRa?mp*)X7I1xAkj(G95eUo-Ly3ZM}S*m*)DxYtnByvalZX%=fo7a<2mtp zvu5L^)vmC1M5zF2nEBu>^t(&i-1(PY!S;>6KjZ&0{69)H?A?qrayZI|Pd@SgwT22S zep^&y#~UiF&T-iJ4x8t&7Kd#Hg(LEazr|2tbp+1OY3WB9Dy)`+(tO`CR9LNY*uxHs zja0ZCNO|>!3aeKf_6vuFLzZtZLxok9!>S$j1SlMPhP-}5h1Fj`y&%}%3>8+xxZk4r zJ}^{RO&w*in4!XIj>E2W*u4(B&tY#k?AHz(i#sJcjY>m>)hP};)nO|fc8|l>qkwQk z9{Jc{sIZy^gKF#wLxt5+hb?p178tZb;=XIBu!=(wjkOyptX4Se9)}G&>?aP}<gm9L z)&fOvq#gRj4HZ^v9k$M4)kqY_!NE7dP+_&wVGlTLDTIAY_?8(etcD!6*<mpV!x3-D zt2b0w@#6<C3bxo#VRbfyX})s|6;>?{i#x2tVO<Ve>ab-FTj{U|95w^zJijgJ&NNh5 z^*d~h!)kFx`#Zun)lgxzFV0VE>;OZBRm@@a4y(X<X9z-m#~LcEUUJwg4jXnDzsbQE zVbzCok3W#OPZ%n!F2Z?Yja_1>u<CYLkHexk*L%Ojtuj<tZFJb14r_src|iE$h6<~D zLH$Iq`wSIU>u^?6^Q|{jSUrHVr9TwDRfY<y+oBfxx}n1AyAHe8VNW=$-(edLRk&J9 zTWvH{SbcDq#qfnE2@R{Uh8m+P9oA5#@R|(9Z8TI^-3n@*U|%y-Shan^@?B@Bu=>8k z?swQ99F}p|7ml=Xzi6niy3%1+JM7C2yTM^!aoATKc8|kWI&AuQrT$BFo?)o4N`d;R zV7D47tg0tiz6pjx{c~8o!?qlayF?QAT|<S{(Z?vYUa;c~1-}OBCBaTL6uvhM>SuyY zH&j^t0hE@PF;rMhIM!k{h6<}?4qNW9)ed{oVJ|rBrw)6~VgKW>w8Q@Bu=gGIp~J@3 zSY0X&6;=%saUV_c(P*f!`frCl>acYVTko*?NlHB=aXmwY)t5oNEZ7Z(3ai6UuzW`v zDy%;1uyY-DgTroe*k*@qaoB+;T6u>U3f}~E*bIl2pQP~i1lIcsLxt6g4tvRAWm7C) zxuL>pJt#DA#NA-1u=?0krCt$ie?x`U?2|2Dv!TMO{L{F*tkX3V`Z9+tbJ!3l9DPR` zn++9KZ^kUP$xvbStvY_AoO~+`6;{6i^{QaMH&j^NcdF(4p`p;Po@TKt42AKF!@lJ( zbvn*oi@cDb(62hI-C-L*9V&bq4TZk(42!KZ6#VX)`rGhhRF9$120e?_8w!3L)ZrrU z2}7Yy;_iUP8Vwaz_c&~&!!|f<qr*P<jKT*wX)AS>rcjoKLRmU&MFZ}q3g113LRp?| zv1UVs)ws_pRV{o`LqVRyHaM*IbNq-f)17K4@HuRQ!#;4BYSb~psteS3iQ8?cu-fdf zEe>lq2X}vjuhCHGlO49kVbODOcR={63<aO#u;mVW7gUY#4I7HzQMcH1Lt$(S>Nw$h z*ii7X(=9f^P$+Xy#|vMNq0rtyZ4m4wLxt7PL5(P(tzI(}d?%<9!7_#ltM@@E!9Fxp zSdBR!_i{vD#86>%5U76&cBrAk>R3=83O3PDVO0m}1Hn!=R9Kw{>K}q#XsEEd9Mt~_ zHrG&LbuFm(1-sr*VU+|mELg9h!s<>?e;4d7Lxt53LH$jzhYS@~PlI|-uxAa0`U2`* z!8RBwtlk3kSHXT~D2(|*{Y9|987izsUZCekW7Hmo!dL**7U8Qj6y`Ia{v_B@h6<|_ zLH(~_CmAZN&II*G!Ok*NSj_;nS+JRg3ah!GGJ?%F6#4*A?+A8-q0mo*N(*+Yq2Sj* z4GFfwP_PxKKM3}ap~C7ZP`?-K8AFBD&p`c7uvZNgR+~V*E!f+J3adYZ`mJE^87izs zT&UD<1RG^2_;yfl3AVqXFb4y*Nw8`|h1Ch5el6H!Lxt5DpnfITXABiq7lQg9!7egX zST%!sQ?Pl4!uTH48-gu1R9Jll)a!zM)ljHcpk5Q~E<<6A32LKYs|*!ZPlEcTU;~E2 zm>SeC1bf9$VfAZJKNsw`h6<}kX4v+-+ED0c9QJ#MMLuu&K4z$}`jo?_IBd4VnjJRb zQrs_>bZZQSdf>1X4*LKUIx+h3%QS`j8fuJM<**5}lzK$VGZgCDY>VA$sIYp%Vf_w! z%VEEB*q<Htp2JEmxAIC26;^vYY+r{R>aZgmcAUdba9EwgPIuT$hc!9u;W<h@DtYTO zR9JoK3X8QFDy+Wdu-hH>fWuZfY*MpQkBPimLxt4>P@xjqxz$i%)d6axU|og^tApp- zxQ7`ktUQM`IBeyWO7%$^4;U(}qE}h0%21dmgIcZm3>8+B=2@)PP+=9CuhiqhS7xZN z`h~+@cUa}smT#P)px*+e>LqT2q0kS4DwVt~H&j^N)MEK=HWd0ThrQ&mw;eX*u-OY0 zhfc6xv!TN3QBb2KjmHfId99Z3B}2i-#w~W1p~C86hxIvZlf&M2*cOMq>oC=3<%J9t zR+SDL=dh-0@$w|mdA6a@wm|J6I<GPm{As)8d)rW0GrG=VR~icS&tbPa?0XLTzQcax zu*V$stiuK!_NK!&Ic&rA_{fRqywOnT_ZMM3P;@@jP+|4O#g^|fLxt7V4qNE3Zin?a ztma1CeUvmN846=thplti9~_o(nCh@`Lx#e52-J@i>qd{E!s<CtqebTz426ClRE1z0 z426ClR79}f84CSAsJ#UHo1xI}cVg{OussZgejil1V3meKzYl7RU`H7W{XVF$U?&+0 zbrRIxf}Lfku-fA$n~yPu3akAccA&$Kbl7-@#T-`eu$C^oJ4w+laYKdG7Kgp-u%;zS zJt2Iv4HZ_0-fS`6TxTfe6%MO+Sfj(HJFLlJvmMs%utg4w-GX;0NV@fg3ag8|Eq1A) z!m8b2iyXE-DH9LmZG)lU558it#|;%$H>NC>Fcii<4tvO9zi`;=4*R{s-f`I99QJ<> z8`Wde2pcM__H)?B9rg)_ebQkkI_xBeo#C+0IP3z4eZgUK9CoF{u5s9x9d@(BzT&WN zIP9AaTjj8a9oD#1sRk*d>4plcC7||^x|=jqSlx1)<x3d~{fEO|ci0CGQ~#l3U><KM ztRFaRoWr6Ho8Yh-hfQ@@%wY`<YjoI5hc!8Dp2J!kw#Z=}4(oB)QipxZVJjT=fWuZf z><NeUJ8Yf9);sJ?hi!7$W`}KYSm<lk&Si$enCt6!M}d@4zoFo-zJaxHDWg3M6;@xr z-SXXGDD0Cs>=zFEhr_ly?6~DN?g@s%I<UhoaoAN3Ti~$k9d@I`QVzS-VRt(0E{EOk zum>IXV~0KMu%9^WXAXPAVZU}*#$kVQ*gqV$)nQ}qu=$M`Dy$B4*dY!Z@33PXHpO9| zcGy`C`<%lra@ZvfyUJk;9Cp3KZgg16VYfQ$PKVv)u=^eMpu>Lbu%{jN6NmlGVQ)KZ z$YDL-QR+#lYfBA<wGmKbrLL_p6y{cUS-!6tDy)9wu*V$szYhD0!;V^E;~s6OusYXa z7dY%jhb0_#pTmCWus0m`YlmeV_9ut^!(m$;Hs-rlmx!TI4;*%g!zMYb)?w?ur_@u5 z{qK51VeEa6#cB<Ou`;Nqg>Si`u>Nwd#Uh46x(++UVdEWktiz@_?9&cA%VD2$*ldS2 zJ1q2{O7)8_Wrhl?I~?|Hhdu1DK8IC(U#S6!TWu)p_c-iLhc&OnJ86V(o}sYr2x{LF z+G?et!m9p0%jX#i>qx7VsvSYT3k?-k(;ilM7ca514HZ^X9>IGq1pBn1!s-%G69k)O zD9ph?9W7Xwp)mHwWN@NjR~ica8>mTwr3{6+6{r&gd%#fGqXKoJVCxNqy@|(^`mA6z zhQfRc&vVqi``$Ea!G0h9;=t3FjoWfS)mJ|K1>!sY8Vw#$o7sNiq?z)fR`)iIV_Ifk zrtr4CWJ6Wig<fKFjhCvgih0TUs;H(?v05)ttKw6<R6|vC2x%*ZR(pv>Rn;m!Hp`VN zBVE0<u_B8Nl3#g=H8qz!yUzFLC8t+axI`Nnp^0K^nM$ooCFZ53S2Z&f0c8S%sRl{c zsQ8EsG+R^^Q*lwc$%Cqc(3>fqKJf*SRG+FtJ|Hr6&NxUA#kMw<L0}D(YII6DRhqos zMO9J0_+9l;-@o3^=q-%cB33~P)l7kK)*O%~I-N^Kq$oC;!G{@MDIK4%d#TY4z4cX| zms;<olITbPLzAr)G^p6KZEu|tt&RjdFIfhT>eR58TIcod%Y?-WsX?gU<kVkRkMfJw zLrkULvYneZF%8L44JenRo~kVjNOe^W^B3`;Gyf^wXr5zyjxmH>oZ2Pz4<9*0^6)Ib zcot!J)<Pj?kZZ+~Imqo;YGgLnttv5@VCEWKF&jf6v6_kfOZwZM*UEsW#!GhdjE4cV zC~XHX<>?xsO`Ggo;o}n;@}!2;s<vai-aVm(HeN$-De1>~1ZDLYize2NL4@jbXpikn zPK|^?*%rO4`j7TfB0e#-WW=I!e_E2CjiREhzPhC2rRi^uDk9;4dKi@^Wc800i2F(6 z2?<q;OVbxXhG9Np>sF<f^xqJe*9FWgc(nx*Yez|5D}iX!;<1So{%NR+rIO9yPkI#s z4aS&FVQfmp%J$ql%!h`mrevM8C@=D8Y{HWM_{W4B9Er6de|XeO^ld`n7;ixtk;jJ+ zH7i1rMZ1`W`s-C{MFwM0m#mj)uT+sPZ4+rhF}RO<?Hdp|hInkDXhhB6`voFCUtiT; zLP^b$r(l*y*Gho)nQ6B~o*F%6pbdV3F}L<>35;MKnlr7IKQSDQ@0oo#x-B9Pj`1@h z1PM7tNXLU=bmB9IQY}$~45;gSF{Wg{8Cj2JO4Hufty?3Hf(<6s1z>7`grhyOVJ7;d ziN*JI(PMBaVjpL~M0-@V)sVr1{i4?V%sWjT6?p|Ih`_;ExwSo_!q3~XEl;e4QKjI@ zeUeXi?OF=Qi%Mlj1`a3^(B>03!Y{CCFjj4oZt@0WHTEHv>bM7$a$p!5OZwt9fUe9z zXHqMm4*)G?i^xWRl_h9ZVbE;Jb>y*FGmE5e2yI(ZnUkz*mLPeGJT`6ioTPVU4l)zS zJQw|{{_;CkqkX8qzi$OxtplHqfq>$Xr>8-{bQ0&z8~@^zfyD<|2H=`u-uQvs*gD{` zX-!D1#p_*G)rBMoYD2Rz>;B{8sU8Uv``fG|7cH5xY|mvXTodwhH3Tkn`SE}p10<e< z)Bw4L2x?4Mm2_Lu+eNxI!jcTAMGK5EaIL6inDD$3&wVhanu7<7yi^}z$ODExYOt$n z6@Kta{5Evh4ZWIw;w$W9v?Q-mGUD<VKOCu5AAw?3Cu6{jdg-1M!+XG|o&otbqkZt? zE@2Oet;aL}s4}XE>DAcf!K3o0B+_+L_Gv`?AcK#LbTQlJDHK0Gjgg>L|J2Xb*G=qa z2AQX<?urIslIiX&^XaG7*X7tC%O5MV5i(yemN|{w^qhs#>HoC&%ml-Y>wNQ^v2%5y zf7IL_G9h+|ADn0N9>JZxY1p7~N9USNP$)a}kWrl*KQ-!_g93xs$4E-Gm8K6s_o1s# zszYiIi&Fz`ydiEXn&{iY+_r^LgfZ3>skJc>MnIx(*fG>QhI%qU-}=dj7O%AZ`<smB z>-VKEzFjA51aVkPRZ~kTmkp{~44~1$4oMASB<co12RlSZ%4TcLVV7P`LO8%gHqkKT zAMsgP(Y2l)7>n394NqfPZu($~l|h(J{B_G!C@NM_$b~-CpBKuiEaXDQ^SPqATqu{N z9WZn*V~sc1LDcbzX~^3i$V;@4w<VC5Xd!Q7ATQBE-Wh?sME$(ebsdD#-AxE`<;YwR zD9kZYzXX<XYH3X%FVRBY+CW~Sg}kvqUZRD((Li3Jg}l{)yhICmRUj|XTwadwR<dEn z_megPv+yz3gi%`uHH#hI`KMuShUolBjLePbUf>+1p~^oU9DEb7(@@Vh%mBBU7=Xb} z%#NfkC@w_7{LeK_@OEs0-VCk9c&K_}KPFbOJnyz{ozVx;E09&jFr%poE5Hm}3S#Ok zx%@Qh*%(JxZZ-xlLdBZ0IUI~hoe)DkADdcY=NY1Bbg;f8#t&myR0d>%F7=@@suGl= z8OuA8ITe&kzZR9@x}XW)oTN06ca%d98l9D}heK%_ueZKxlGn?OP1GY9Z(<#1xs#C3 zNdrS+C^2c`+SCAl2hw9F4lqozOC;%uL86KFCbf91hGR{C-zaG$>zXqA3&!9!8HGj% zV@>=1^rAf`_6PM?0X58Do=CbPzu2;~=nF3NIybMBJaJ**Fn_`IRP{5!jaFjf^Q%4d zUd;$l_>HqwkfWc!=!3h>v;3Owud8aQAGK|1x-FigveV0w;OV86ThQ!Gz+i_oPo%;H zi1_0%NzeIyn4lTGbzHR_ZgZ1jchn=pupuxju*8K0gRGHkeJDu`jeE4}z3m~d_aTnY zW$EOv_v8eplB*Ds^rR?Vq*Rh4cbTnN^*ijmJt_r^sfUNzoHm&>{FrBzYDi6sW$8L} zv|3p&bxw_knpZ2UDq7{XX<8lR0ggf@|7>e${KoQln4wclAq9!u$m$x;2g{J_xC}oN z!y_U~IM1{O<MI;=SVlOeN+jCLMn!I31+G41l`92kt3ARJc{Eg#7!E~xv2Wu-(K>Bt zeaVP{O_i&4v=`8rmzih{;SmFGRg4+1L6DdeRF(~bZoZ%~Xo=cJQ|ijv4sOr|xXg^S zbzROa>c|rAT{|nGX*PSkeJo|K_e&vvNvC2VnQUk&$vUxSGrV>VDswZS<=KgujnE_| zl!{dp2FctEwFaqUePFUT_68I-Dqku#wp4YP37(dNiH=Op5LOuwCeyU$L_3x<Ph_t8 zVS4D8SR12d_#`VDwl*@m$!_V$Y>T!Q6g%nFhB%f2WRcRgCRULkH`KXiB~rNLi#ZFS zrpL?r8!o~|nLlK*5gitKEuEM^W<D(AMm-`#R{^OgBpm}$^J7FAo)e>*2(?BUjvHAN zNy7OX^ny{JQ*3bSi#ZFoQKmYusbUPq-DobA)B-xw4~DAbfsNv-e)N*%RbFp>$riRd zJn^5&p{mF&cZw!tZU8iXt(O|`28Ki49p3n7yqAYv+>sK3$YqRNmQqNSamvQjg@BF& zSc%d9xVA$X?nzK;T3J%q?PGb;3uR8TtgW(!Q|2Y0UNTgbk(C%c4&f2{r7yrbj0iJ} z*pzFR!g8&%Ze0=k#2CL3Lj<WrkZLDI2irNy^=M2v>vHLLU=fsslu;&(_|;qc5wn`2 zqN!Lla#<ZoJOeI<!9eh;=+eEBby4bFL%tdyO_R&8ME<mXjD-+w#$s7rZYF<?7$<X` z2`*>w4LQLT$+FBBB-rqW&~Wv-1k#ue3Fnrjrd5o8(L99ek?@TA@z2zy)}xZt)~EVY zF9WJgtu+-GsgC4|A=*{4Bz+jnTV%9Fd*&@=CpL>M%^0b3QPm8t?OcN%KYi~u4c5^N z3)5zcZ}4V`8ELFkvV~qO6&lbsll6@Fh1N?W1j<I93YAzd3uJm#W8|swFqRCDm0+E# zDaf>TrZa>k8-$glQ7od&9_cH#l~=lefcEd&5PB7<_Ms|M>&vTjrLSP=6f}jg0LLQ3 z71xZG>}2-O>}#Rc(S6WlYbKN#A*OdtyujX_n`KCXt%I7?l`yaytoBr`(Dvq57p$V! zY;>EKhUWm$yV1uHV@6;lHi<<4EIu{ysR>UbJR0(v!)&|Y`qt_Z_(!aqSUUpDlhS|X zNEQWWdQwz!cB2EE%5sVcV0n1VK;$vDn-(O{lIY*ZTh5Yc@|+`aN$(>`Uwhn+2u=*| zgT?pRW*o!}>?PT;GGv%-l=FAuT=s)<`5m}}b31PXj~PhyQ~Aa`<r_T|a}yR=-h`ow z8Ir@1LPP!lF|4i_KzyVj+3#@}ljK0lmY6O-y@m%rKd@<p*3%j}w?tP2Dsrf(u4S-e zMsD^Z)XVt*5|F`k6j6~u%~hZBYEPfo|9FL9SjsluMJwnf>$p8QNnx1!oHTJA%T`c0 zzv2obJyg#wso`+i-An;kJJ#1o^Dk3@a6Z5(+i`-901Hgk$l?ZXmJQR*1*`2bPn=Cx zRR<z75&mMqxg6`3Z3kpi?U4YCJD5mjL}sb(msrI@QpITh8B+3*#694##R#FM7`eNs z(;Y&%;BdH>FI(J!e08CGMj43~v@i@q#|%iDYBt+I&Av^8W~eLOXmk1$IGk+u8mih& z-iWbE!EOzDk*=<fWlF7VnR$BbqYD&Ebr#nHBU|zY9n^aTGJe@$dCl+$Hk%YYCR>Um zeFL3<@fdbdxg`i!*tq&_R4Jb;+`@pAo={9&!_ognL9i9dUpKwuN;Ean{AQMe@uv^A zOP_mkof<g3TxN`U0G*9**Fed+!OzJD{vjcfsErhqT@U>g!t&QcBTKF~<ueT4L5WXI zwQ5*4)<whla?Fkpv4vFwb+CzyDCkPL>PZF+QF^L$R(1EvK_eEK(ONkX5$;~>yUEO~ z5rx{Q;-gVAjp;j)+vmHgUPAIE_+3Xes0D?kIy{8Jv~SC1r3TSD8-dc|L%Hw_18>QN zn+!Z`V6D2W?^4K8$%!r?tOy}P0GAsuYZ*HsAD^9&j|!TQqhuaNWd4c6;Da~}64{K& z&_uH?u7ianlopb9i-md-!o4?a)FWn!Wy&_gk(z;wUoOim4^$3iq8a}Z`K0<w<cm^Q zBh_o?c##`k%&!b>PmnuX^en5!GM3(O-uVMBHORu=$m~p9r`-%T2Jl$eme{1S=M#MM zhtAEqO0Z!Kp?rJ|OO?@1{)R=_)J{U+lrga2KY2||@SOG)V3pFKB7^8kB%0V%!M);c z7#W4Q7K!pt3Xu;|h$O&X0d|xJpIWEmnFNgz1wI(+WW2z{qlOo(Wndl2Ww7-HMX@H+ zgR$*o(>-R(M9vumHAjvQwzDl_B<r!7p&_ENL2Xnu{-}64bR(7SM|u1^Tcj>H*@SV; z5m-)J+<^j#BtArTf(>okS6<%R4o88oaSh>r?i%A!7wIx7(q!l>nf-R4m|OCA6H_}& zaJ;8iS862A#*>NU0a=x$mMzm&<mJ?h4Nym#8~g-oSbZvVQ|jgXY7<$~0(YMN^*?29 zRjk=cTgo<Dw!*w-n{BVznTf1~mSN3TcZJ8GYWiAilmR&{b{JZ+#Y%{7vF1Tm^R**K z9oxW~N5(!7*#<qtCyS<Bo7RrocBSZ`V98;yLQotD^0$q@HY%2s&`4{b-9ijqUGK4; zEQ$6;)#j!g1ygYj2h*qe7P)<Hzhu$JP!JTGUj%J0+hqJ*`bOx4CZ)S{KJd>nVoO0b z8r#^Vzv<`X1OK2nN#ulavt4>8WacZNyL7~;g?2~q7$MGK>}{SCYe&Lh4B<v_HGWn6 z80|_?!T6k-HZIxy0q{IDn(Sr{G6xGj*g+QN$vjH#@DF<n_&^AnlkEH^IC22aMyw{A zN-#q{&^?X76Z5~xpMO5^54s8&52JkFCP${sP%84MhPrjv<pfeZ1rGTI^1%ocQUq>x z0!fKL5)e2bl@N|7@+cMv@zC8p3=YXNA%=H%zb}xk+}Mej7jIi&w168)Y(g8)dTmsy zT52r9WVy!GNj;8|H411gDR;;+1>!{6{%O?)NM<py?&vm$h5BCjGy-f0GP;_9(bWvj zfw-SznnsDy$yN!P@{ca(q$KAgkn^9KJW-E=A(&Ave+Xva{2`cun^;%bT60HcxjtVT zBggGG^!A94;Q5dlP|meG=g84cZGOK7_lkVc1z@5h1=qn6GnK=G40gI6WGb;RMmB$T zE7|DO39^L<li#e3tZ?FDB(2DjY9wV#A=S}`L=u~jrY@#rCxN_R9*gq_=N3q$>#M#f zc3%;?v@_E^a+YQY9Qs6)kyBTT5Pz@bQmBhDb;f08b*9@Za&s%85Fok5=`$PS`B-^L zdK^55%>brzSdYTej#ec<LBh#8_L%u0tfI*}j7)58mF-r@&$<B&xZ?F>5dRMu{7of0 z(7#{~j(^7wm|X;&%($#D7=;SKV|mjvlMt0hjD~zRGBE-|v|`h(EYobWPVqQ~u%Tg& z{_(_c<zg`oW9hQiCm8*u+4+Q6nLe@YP&|x<YVt4^-m9DsZDCLxHmdk#Hes)HIi9^< z-P3z!u@rT@418pg9C{T);KH-cF>Sp}63B9l%i|b_v{<e>)v2W7m*l3(W2Ov%EU5u* zrPibxs~BloLN;BOU~C)$89S@gILKqyf_A{Oi*$4B+&Q4;%itJwDRY5})F%<`uRi+J zFPMz_*tvjfZ5Cnw0%RQ!>pqc2#2sgfEV+fEkpx9Yo{o(G_bQN?DqtkGt~CgmB&|fh z9JwM5W06PQP!D71WHpmLO8^UyFIj?cDq)4BywDKhi4}yQE|mGIPe$?Lvr;riLGdvG zaqzB!bW5^&H64L`gjP%OGahpYR}A#?JvwYzepnqmkZZ*hko2%1?-24QJx&62F|uh^ zy6{G{JYD~WbdGJC?h(I?b)EHM2n~a^iQ>990%VcVC$lOf43lo|9TJBlvG{zZ<VRC6 zI1aa@poLEZG}=pI@d4u4Y-aEmXTcen7>{>=6w?igbicBL9aM*ZREh4KHP!3Q_4MdC zW)uvb^^|v*$z{jRWvK1}TY9n|6tJk?frRx5kV;U#;j^?0sI7msv&X6->L*sr*!Qmh zKNeDWIC3pJw)U;?<yn4lBFS#Qn86Ol;h$q1l=F9fXs~0Iu;ehU%!8iqpkH-jp687i z|0B;Ds=B_t2-?H>dLMg;AsD_?q0g*R@ynrjmEAta=!C1kb$vW8yX|;K+le%Wsxp)+ zcF;ckGq?%bC@}fb^eP1N1jKBwcX|~%og!>Wutgrjfx?qZI^Z^IwjuG0V5NOo0GQVx zud^|!GbN)9he3fk79c0G=h{c?r&$fWkuq|S;!Ac)VHy!w)SaE|UO^K%p)`L9_M>Lo z=y_%?O|Jz<W*&1|W%(#V_!!BTkd#c@1n%BJo~=<!wGM&y8Ii$8x@IiY&Pg{HT#SR! z71JbagQTG{1k*eG>!SLNQCFd>j%SmMJSx=>gZmRKgyUvbUCJ@JG+D{kd083$39DdG z+wNS`fw+0|V6z;Yvp<JrD=@MZ*Q~Aq<!i<4q^Oksbr)Z1vREw2MSR{<sz+4Ej7+hK z(LMf3WY}$aFyj!4mY8j;rV3||f$Md0FxSIc^&I&BP=+pDav1#N5gn+-BQh~7DJ89b zq?9-Y!bmaMxeDp)y5dXQiTfhNWx8$rL?5|}T&p=6;#Om4OqT;EoKP#x!(tGR%oK=k zo5=j2HR^1pmQpzR%tbKNS21X^b0q?725tArpzXIzTO{(B-zZ^Q5*exd6sC>C$|$Lh zlvGXgSRbH1j2$b>7G*KprZ45n%&*MkM?~A>(Ah&nI{g)rf8F-%o}b;7vX#qdm(!GT zV;k*l%aBJ59Ict<l3H%c*d)WIO*SRb18WWx5lOs<f9>87ibt!bk1<^ySz>#2NiNYp z+MA-~w9dD2#KVawIr?;Y+j%wwr<?rJ+S?}E5Z{3)9+$ej?GPIh%8fG%8;3WE*{p%k zOKNg!qpSD4MTB;MUL=4^mWRYjDH)<t)%1H<N%JqT*!^kF%L^-ct*>;mKJ6n5B1qNk zC>}92EVqLBmZLKbss6{MH#PRuo)9I<hQpyUe^vZc=07+#dsk~&9UJA(Sl7yS6Qko# zHl{X!fE74&CaGj8Wg|gZn;|8GEE1T0>qc!Vm#I{(ms(9CkIL1lsX5Q1;}bYaV@w&P z8LfqPPu`6(Rg-bUZMX_$a>ct`n#}YPTmb=|NpfM}^|;#ui*v4-0qaVk?=Be2nxjg1 zVqhxCBsdC(uXB#X^;GdQ*tu@)7dOZK&5v+xf0lCvx{B%^mL|x0sOLL4;*w#7RxQsN zbW3p~<D#1kAguL;KiehJI)rk^ic&Qa{UdD~jwC`DsM(h1>W8%bp&HnJ;VDG|FHH=O zT6k!Yz&Zp*689l_%aH3L@<ita=8Db>)S^G@6P@d0@<ita=8Db>)S~~20<c==I;lL- zd4aj2^8&SKvA!u6+Z1sR*cMe@_k^it8M5i&G?tfKR<#LwVShG?QEpGw8a&__mW|0% z`9SzcwyoSnH+4kwCc9ZpfH5MI*0n3iSkH$_RED>&W{X69uGGfI9SZUc;eQb?^-jhZ zbL#rO^qSt%*TP)gq}E#-qgI3-QiNIqo9C<GE%df8A~jnEh3b|?ZJ5-JoUCNSq;QLb zN$KQ;S#|TQgR29sfC_?KNM6zDVXh>=1sx25g2$y>kk7nvDW`@0`}!$8u7ovl64RA) zLsiri2~nH@XZhgI9+3d*d{o;68&}uA{J2E<=ZkA*qA^yaMD7iLqhIIdCb}{iDsxlc zH&kvhK2Cn!E-rW8X=3?J^iQQ9mjz;AI)>W_suTgsG~A2h39j~$aj;_uqA=o;vnLwa zT!3V6a_M9SV=Y*(5)GK@U@VS`=X(sHL&!eLkbP#vhs5To6-Oe!G&eM-3Y@!ZRdo&; z%%IO@Xz2=(*(2PN2gD2^3+Pw*!@>L$Ww4#3eN{io$xeYoK^xgL9}})mxmlyuL-${p z_r_R5X_6wTeHN+lz=l?Pn~EL2bBfvC$SAgw7T6BO9zo$Sdn_B=IWJ3W`X{r($8H`h zHFd<^Hb2uLsSep&G1)fT<f&<)$636u{wDPz&dTDZve;FOl4Bt!#t6<X)SD_v;r2oy zF3P&98l33lZYmr<d)tilI8vXwjhwl9<p|GSP;|m<=H-C9Uq2jrml2X5YY(Y5Tx<8$ zh5|XCaELKtqK}^YBjX*N7jHFc3XW~QfMMvOvg(hFz5p9{QPzI^$>|F|$mt6bd9q<D zjP4lF`l<XNtk5&URWDRxC|SmuhLr;>(D?F<Q+D5R(Oend16GTgo!rRHy*>~-G~z1J zT&tNxuWq)S-{+oMq{Y!1>1=p#QTq^VwgS$nY+kaH<?Y)2;Xx&zy?&bhPe{t_V|C01 z5Mg4-;|vs4vb!1oLTWcKWv|mXmS&*IZVxOro)`xx7IbU!;H4UtjX#qLxtD90sriMh z)o>GF6sIIl`+;T%|E%(`<$6BKIxsgT8(|zhk02%U2ofl}6Oohkkf_jO`C6=<n9ald zCwHiziv@{FER!hhL(MrxKt5~pG~cM<_B?o#hCA|LW)MPRd9bi0yITk&d2;cOG=qdT zM%0a}B(kIedLg`)nZ_T;sadkdkkTOdAPs^9#EgSTv;sawdcVRnaR`-9%x09&<^XDp zm@iD5B1x8sugpn~tqTaOW_+`>n;bj9sU*dqHXVo%XgP^b_!HImAgYnD6(Xfi;%nAO z?{C4(gft75^QAz1$MU<XJc+%`{PswS(qOPmw&Xh|zRjU87m>%7iP&xB1>Kv7XJ#zz zt4)}0o&uY)7>rF9?}cY3hUQKfPb?V|x`@Yu87kRk0AA$r7pxtm&*cIF0;wMgf>D#* z`i(#iB!9BIQp(7I!^mK=yTX8U44v&QL*Tp-7gcm0m}qZNi%$(07>rni8<LtQ)!5>1 zCNg~csSO;=9q)9u$MX}2Z$|?0Z6%;bP`!412CX=#2_EP+AtZ008*m;svAK~$)h0UH zC@K7-`*(U?>j(I@*PM$r2%N+lTh*wvKWF7Z%w|r-t1%GJ_k_&jXj~J*vS1CEl-$6n zL8;=IF{;_ufQ}@R2nA51uPDjYxcU;z!LYh(VC<Yhy4TxP!fuBlF$n>RwI+T4{29c^ zz1|y>Z65^Jrb1=OQ!%WOVLG-iz2y|>5ARH#TAscLgIuUPiRywEne@HbD!_i7n`@*s z^Ezui;`j#TF{y2(l;r92%+l~tXcB@Pz}Du$_I{?f6KhddaG26S1*9Mh>`-86z7Q_W z7cGd3-S8p&;rMnR^kj64WnhT{f*71otXF$@iA}>CNwXOUcvXLt&$g}T=7Hl42sbOG z*p+4|Pm55zUT&$@9W6`Im+YOWZ&aDrr5be=AUPf7FYqAOb;+VNqxEaD>#@q}^ztUG zyXh?=Vmc|rvC0uN(L{nQ!m{QJ#wsZv8DGO+{E7SIgZL2=%r%@0$w(qbCt{}OxK#(E z635^MM#qgTECN(O@z4w}84COO=GKRr(4Er%6!0hO!)3Xwv$w%YH>X9Q93(Ti0*3qO zm7Hl62^(81%)>4oFMNzH64!P(sqzxBDLVf{i=`27zT(<6yTBlZ9TC(VpM7omRT@4Z zr#m9(%dIU7(qGwrK?esV2-A*@Up=oi!=oAnh7VAOM=%QbC}rNI@ww@{KGdBN+a)I$ z+&|w4nl)V7YDzjBvG(@XO1vXWCz-8XaD2;5+wTdlqzRUFF&UAYWy@AtRKoJiofPD; zt>{+5YAG#vIPdVe-iQ~^l--D@Ps{clvi0seYK}X#yzd;NTNUx53Or>r8^`YT@wYHO zdQm#evB-wcVRqorf9h4b6b$bOYj5dyh;)_G1L4A8uXx$VUxwN_-BkMbA`+~+fJ9+N zOm)-AX%k{F4K5@wgMLc-Bn@3tA2=Eq$Lhl<n!OPPpPlQ<kYKG9M4{+Srh{2`e$%D% zn~rp5pyQj~dH|^DC?Oo3S|<C*srs&39*%xh`bx{L(~}syeh6;8`OA~>9T2^t=(PfN zrM6rXYgz&eD8GC@@=b^SKF!wnEi_0_DVdjsWJ~E&@VmLC^eZ4VS&g21vhiGlS)~Th zK@or%Yw@GaSSw~k<uh>*7D-%9e+~*`h)P}S-C!Ya7tS1+UI}q*CM)Du@7ApXjmG)} ze&}gI_8St6)B}Z3+gd5<pb*#_r9z$1aT&rgCtGpYRpAh0bqJ`;(^0%kt^rc`TbC*? z!<qB(19yyn=H+1%9f|cJjDON~@j<#S5<bc3!H6tg#38>9(`Q_?CiGZHhCkq>UTuf? zIhjSxxg1pbaAqNgeK9*G%7tG2_{n@M`%J^6n_wCA{G`?5sBI)rQ6E`Mg-Q@pgg*}s zaP|wQtbVKjX{?jwrvZik8wjPY{qox*Nw8_;*{)k`=grdZ8SrK;6Gj@Bnd2%Uf9q0X zZ-b$`ajV+Lq0K*bDO)j(V=h@QlNWaBd)E5pUgiLwQH>=IxzsY*(AAi}2Hu}rP#BG| z62c3h8Apc@OjlAZo++-cEc1GB!5H0M`T@Udpn-1#TemLP^->X}z-yZvCfNf3#oh0} z&;LF!BEMzJXbl?wf7Sm^gl^jZVogg=BYI6QJH1PvnDBdNdgj&J?U_-uJLQ@4{c&P* zlkP7oAkp=ga>y?0iBS_#=h{Qp@YRG^iWHAok00$Z>&0X8;6*z;SbgiEpz7HGJHU}D z@05zmdpZqO^~w64>da4AxvSB|x3iAvOLRqQF)vGH`<SMJKE~~@NLy)gy+o5+^g~K) zMo~B0L6c(VUW4i7GpJO$jj>@lpAUK}52wPt_9L8=iPZEGh`}sTGLsjGVOur0^_I)? zuu%+tPunIYwuwQ3TG%Gm%1i$-Epo7aKw@P!T5;I_lC+kUtbl;R<V^TrmxQ|%`wQdi zX;;3w+4v0KR{R<<O!4>(&&Fqt`6RVBKgV^x9Cr;cWBkhjtu{HJO(KIAJG01AOJ(lp z%0Q!o@^VN@%<gybrFWdt@vn$#Q>8GD&nB3fK2Vl5cos(?u_9>c>obpUQ{HDJUf~cy zUbi6s@W`vRDl_0=YMGTUFN*QduVwCLU=(@QI}`pWQRI%O(`ti%9igy&qqeapL7j%Y z+;&hf$o(s<mOFep3<w&_4AqAB-7KnVQf;4u32K;l;ff0fFg2}5Ar%xCbjJP-%Yidq z4(hAV*01u!0HH1!TAJxkKLasFtQ%;5SfGQfATmC#)nahl%6F~IV0+DsVU7Uv0TlbL zNkQr%Y?A197$~kBut8J5|6rY>ZcTNmPzPP`i^a0V;k3&ZqnWFtnf2&`69KQHlWB^S zNA_wSUmCO{1+qU1I=4XZ)_KKT&kzfzMo%tl#aqX+&&e`7V;PqpH*-UfZHx)C=CMV` zJldjbvSl`yZ=M-aC^fD7So1VlyZka&tzaw3{l&sc3q#XSveJU^s1j;#(nFTy?KNJC z%faXzhFB9tbl!{W%_Om?>0t`(eGA^))4|0Xn4@~}2{|vKVd9>95e+Rv4Q7Z2Sn<%~ zu~24Ja7LXz<~%?Ja~SoKp(@D4{~a4)Zq%c^H{50Q$E{Apz(4}CTd#N3M&x^SE&loI zJrn!02ivp!!d?-1Ok5!~t(=oA0c-ACtxW$3$?_J6iau!Jo1Xj5)8?hmmGRY_2jr$- z<o!x5Fn1Kp9I&t8@8U3!MpBtE7%Z;<fx>Qt9*y{gJ-VtofUyRknev}f=9tel2<rw7 zaynen^rIuUT!9nqEUW2ex}56j1OwLc2DWZu%Fq?IeL_aqD$XhuMFCeW#7i*s<bd|6 zi9DL*dGhYE^!|{Ckfjn0?|w_%4GMy2Z~jI(266)RO$jITIujH6ncHsr(}R}859QB@ z_;~(|jGvG>l^Lr^b@U)nFxO^ql}Ui57C@aBV3`HX%(Y{=0j&N|zcyKxz66T}L3&T! zLA_@}#hEHjy=Q8@XKKA?`t|1f<)HUer}s(=SiSjfZ{e_duQGs7@2SxH`*_Xf4wX|k z<e;1uAfA}Wy=EPo^{^P$U=%o{Y2wxIP$B9{EB;Av=;D`(Ag81x&QiwVxOF+qC2`Yx z8O3tSJI<GwX$i8aOLnP1scFp2>-bVZK^=)7;^JhFKeE!9H~5#OzlUh1xSOE|rq`@~ zt=HP}Br{xKi|ANB5S+JZE|pJ{LSCc}YiIQzj4Rn4i+6$fvPsshYkB@mgFHf({#dX+ z@jQJxAQPQKzLC#%itsgVB0W!;_8n2?W^5Mkh)vmdp(s9wXkt^hZF{Sfl{Bgf@K`Hf zpO>p@gn6lAR{rSBG5&U2`aYbv-;vCDI&%vV4JQa=I)`WhO~6(BB+~-q-N?q~y0V}d zcpPnc<|_d>xr_w}RuGCQ$>8NiVi?M|hAEXGe&ryRy%NUOlIUxc<nrso44^wzA1H3S zO?FM0HW|9)tRIe#ca`qYJ_(WOo37Iw@YUc-!H9<u1wCPU;?9fUp<asMD-H_X)<I4S zc^{1P4v|Nv)x&4~Sk6Ylgg6*gZ_PZJVsbO{2`7eI1-cpMWTpO8k4ju+l*n~a#of(H zD37KwX$PaN($PK~wPSVl0Uhmm6OC0S>xs8vsncPp+Ym{rBrJ9Mu2~9SgD6SY?WhuG zK#6jn5@+n1675vt2`sDZP@OpwO5B1-))Hr0C8ieE8BV=)$8<<=o#{H2%aYV%QlK8& z7#j5<B2@VR^~|UuSLt_68!q!w8=jCVw8}QLS*^9X+NTYnUDM_lMw`kV)rMynV4F?Y zrrx1kJg(!d<UtEJ+#J!mb0zzM(f$iY3uMCA){2i=V(<o^2#izQi3~$FqWuXjiy6*M zs(7?_bu>EXLOX548%%(46DCrwmps_j__20OsmJp2eU!5F**h8w-%!E$e@A20GS*x0 zZqhX5J8Y+G(q2o?A0YYNJ1m$Tg<@jp8=9p#IWR)o%T)YKBh`LVD_`u9&K_dUtXTb) zaCSyA7)Vd@$*u6oHSaIjez|%2zR6k#B``wZ9WJM@{yt2>V7$1#nCbfM(B+dG^~u%S zB0C^Anj<%JY+?N^-c+iSWf(t2^><IWQ?)fyMuTHy)r8+B%-^vM3Qhli`Dd0Wa(?{l z3Fdv*c)tjX7vrf~|L!#M9<WDWWIX`U?fMR>8G~XlO~&X=qz*+f%3R6z9zUc3)1Mh! z`e{VESPz2HG09_~ROg~AK-v5KZl_CLkJZglm>d*%9Sy;4eBh2A19D!E#hV87EjlFU z`xb6Zq8hcRCabo63l=8zR2Bd5{a4JfR$QN<<y#Xl0QZpJtb8t;_Vz91sH68GHh%Zc z8(9hI_?EO=qi3>n1sSojK_T*jC@W94gI7Uy?r=&DdQ3{w%H+*MHF&``HjE`muhnu! z#tl)%@?@cFL>>nxdzJ%(d>nd1bHGN*lF<^NZG_R<7jY~TMT{*|h{ExRGD~|YaTnT@ zum`?D$;y;|0owDUgGgP%die%mT2Aghv9RUij65sWB<5OAFCR55sD}oJIlIx7+2rz* zwqlWPCDTO;HToM>_dtQRGqS}Ht9V{sM<k;7s*C6KHNKz><x4d-*#eQSXd+#2@ewA` z#f^~m3hY4r#GuSI-j^$t8Czwn7C^9T-+&+fS=CZr%*WJ-&}>M(FJ!t2G0E|k86{$8 zH>g7BVwkH_<*_n4N$Q062m@s@xo8Y1lgLHcKx+!Nqf>*F)&g#~mDjnZ8;{v#OXqW3 zE9KWbIv`#*(n?UiM#|X`CZ^MIco64X^lqZP=%$xE#1bgt*(i+Js_kMLiLuZU<>+TK zs}BD0oo1h$1Ia5*c)}%>Trcs=`%Jhs+ADhpyhv6rFW$t@?4VqCuIWJ3oE2AWfL2xd zGHLc-YgS{SDVsyte}!z{CZ_LA1Uf)=hFFO?rLR$Ki)e=W$CXrncW;#p2$wev+z)R_ zm23RBQ79n0i6+6m?K8Wxh<IFnvKyU}aSbKAsR)v2SCO0du_@p~w2>w6(J4?Vy1wj9 zi+YG^=lzOWWSK&At+)41-~_m|p6m)&BEIMzSt2jo+J>k#A0cXm71eg;wlu2v2r=A~ zwAQ?sxnl*;E7MkeU_SK?gDjSpQ8@3_SOzL(7#2Zrp#&y}j%7N2^lqCyv!!?1r$=sC zf)MC1U9aBB3Srj(?S}V&)xxwm&84+@kzfI*Xi!Sy<?s?N;H5HrS#%C3!SpPQgP0F) zthM7~1ZJ@p5AtP$lhHkOAPIF1t{SmA;sk;IOl1w+0z)QyAzb#yx+rC62q$~-RG&G- z?q+czA@{lngWm`~Hjwata@YA55;;vT<~v>_Z)KfUfur2m8JKb7!39BObFnI_urPWg ze(dZ;cEh4(undLq`ay;G(Ma#_pf9&1qO9SKI4Ta&ofI9p^*IEA7mK1eC@xLIu)s61 z2xsA2vfPtwJR7fhU~7riZGGYFSuZr8EP<U{ab~LgD>#6(v~K*%4NQWABLqw<s|N>| zUp#x(D-Efc#4aj3Gd1>WXCm#>$3H{ogU>w#3uN3Gr;mU6^wf*>sb}y|TbFu4+^DWY zh*phsN8;}M+<qD&b7*?2+?mkXw#VL?SJ<jkdWJ;)zNq-Wyg?;eR4jCj`x+qUvHpRj zZ0x^5rjoX5TP!8M<8M%v=BmLKuEKfh^zYyT$v&d(D$737vTN^>3gJ328pg;_*ak?m z#PP^*K@`mz5JhA$O1jmgI5M(?mBfnJ!wSa-x{z9c2;5xGRYU8yExnx3QQIxFAhS;M z0!@nw)miW<7Rpy$QW0~^hF7qXBi06c7E>3S__;P1oe%7h4-_b~6Lxfp;g(Kt;S?wq z&ex+rF>OAdl?oL5=(6}|#k47Xso?cgxhDK*#R^PVygUnvvZ%#ATCtC|X+h~@n3bD3 zu_-HBz?8G_C;|KtXXf^<3*03}j(9CTJOn24?$`-0;^m&SI1dQp;#)qvNz{A|tgN5l zMw`(CRKro}ez{tDfNCAi4geqi;ahmXG>Lu?zY`qu1Ywq2{6_SINTL_Pklu{A6Bd?( znuMdf_&4(sXz*f0$O#wxH=pGzD(EYwMjl;@=c%u5qIW(Vt{Ddr_UvPl<H1UHWV2S? zSgtjJx<_Ur_$UvCUL|T#X?i}oZdjK?g-LeEJSlx4QJHS)V;5zx1h^(m9@{B<pU7x# zKyqv+jfx!+bO_ums=)-1JNz-pHIEI(Ad^C4D741xkl5c9bZ(B)<T5K~MBjkFM#`d; z(mZ|NNd`F>)Jq65ihj1Ms+MecsK&%;1DWwhTt|1efVT(?HqMG3#zUR1;uzP*%)1is z@yT|KTNtPoR~T`3;~~8leZ9RA#rK4gCv-zCrd6c;J(nH3j75~(v5QtO&GUymE6j-c zz^z`+!t`$gAPDCVFJAHDu5E{?4to;Dt(+n+77%l|%Uvv3<bYFL{>k}oKA;|I)M$Xk zbHb6{kw}aurTHW$-h1mqF)mdM1L%W|&A~|A=qH^TtzRy6to}TT#uS$1IPH_CBsv^> zam7WFso3}dh-LjkUiqWij<8naEzLlyaaAPH7I@>ePNgBmWe>{p7l#Zao_868a<mK@ zEsp*{3$zG$g(u`!#jgxVK`lBmn*s(~_O{tF9XJ1~#*<vm5UEItbxv9sug?+WpJ?=& zk;B&x>2l{)IDZVBMVF$0IMFy+|6-Y|8zV9|ZZk_px~v4-GN_<@Dj^!Vd}vH||6juq z^Z*MKt#8#3$hs<DiCkyyJL&u)L>j9-#@o3jij=c1AZL7@>kn3;3eX?atlk9KK7Y{9 zfSgr2?xC=7Bm^#?h7W5A(hI`o?;4xaN!Lnc2H;}YOOhxXRDQ6J#Sj0oGvL9lP|Sc* z3lN?D<8A!v58`lL0KLsx8>(Fh!?g>c$h+~7{sJ5s%1=V#bRncF#D$RZ*IC;b<{>Bf zje+vgdqI{>(7cLlE$}R)@1Cp&w!P(v+;0Rs|HN1DL3{-XSd}`$SMVv)JD(<oui%sQ z6|$_^YzkzUIYJ%K&v+v&`g7F79CR8QpodDSaay$tv8`7|BNAD8hGmLaW#GG`U_wSv zH_(`*v_B>lWXxXRfyNv_0F+=nI0V)hHgf)==}FO`<1?>t)KvuONlk%^W-M@%E%Km_ z<sl~w=Dg0o0J4_LA0a3#?GOyoQnCvG$*yu%HJ|V!Aspqx4~Rj&E*CyXxsWg^qg?p3 zc(SXvFg-I6d9X)9yjd^6&Qg=T-cUF1xiA76#5yLK`F^I(WErBErTB3{CcGOVfhN2G zLUy2{wLlL4q@wXbGDHGeFnMUfr%3NF!NrQkCtcCHLQ*eKQp<@Uf~{5hIlr!HG`Fs? z*Y(w_M%qKFGH&%qN~s>POEPp@V6G;+x{ruDLf0A^5})x2b${e{eC|)<GpgI|XwwTm z*nVd1=TQ3M4)mpIY((@_(G}?CCSKAF6E?Br%4p@Q`lVtLz%Uti8{(%G2Iw0R=rX`1 z)whtvE*DBS_v8+^mBmy1W|i_l0~CEy+Pv`UFIGFIK@Cbpy4R=2GF{J+=>RQ#{#+Cs z6pMkEEjG9xlTIevkF7$r%j?H-`>!U}OX<JXK{sFjrE7|RJUhcwVF|JQS35!Jzp&WF z+?mb`%Sf#5T8bOiN-vAvZ3Z3ayWq|`&<=@<ijGj-Eiqgz-V-D9`ny4;zW{dxe<QH; zNu)wIoB+F%3i1JefOfe)0K(FHLy)9ndLtQyF<p%JD%kH<z#EBMg;@VBGvw2~#de)o z!(Tr!hYM_g<$lei95<q(y$#v?6Su+#aVsR~-0%ap!ly{@0Za*Qg-_yE;NhD*-|bEg zR&p46yFwjgMpmjBrt{Wg9<<Yu>{`fr98)rUkxE_PSc>RfCRc^boP#B^y?I1YQI78M zNR7QA@P&NgP*54oXUm2qByafkHFpkuqgOlVU{MwpFxPw$mx;c-$?L_Xu5EU2td(vc zC<)>-gqW4emW1@Fus(&+H%U0(rrsOsbkF8pxD4Z`T*%v9hC;3a!9OWvK1d;xFzTU@ z`4s8h!;~SPY~K+hhBEYsA%gzZ(-!PC<82>V6njQk-bBp+%op=Y@!HnpvCk06Xe&Ac z=a%6riLjae1rfG3O6QWtSOLbsGM7(NYG!Aa3U(@;wo_rH%ws5vRIi^iEpo&9)Ywjc zfl9krp8h#z=Yfd@G@|sgJJ{EteVf;N=)Ojt+171eGXwUk5B96#{IY(PZZprX+DSsL ze{Eqs7XP{w^}y#}JEVg9{cDq{@)BbGYd1mhuXx)HX#TO(b@Z%bmAGcw5H$~&V7RWc zS}?RH{1%@RFf@Noz*O%>s_FBQXEbUy2)v-zP}`mpe7>N0>RhBpvr0n*)lzXR%E42C z#HL(ZOm6@ejAf|@Vu%qimL0?+>u-K0GmTal3Y$W(!*jB~ruk{>My@QT=cSU0Rt`r! z^!)#PXiLfTEj^;pw%rS4IQJsuknE%&UuOOfkK)1k3%zw|C8c9Be#S(U>WcJr8H;;} z867pGdoT~!_O>JVsamk}Py7@g#7~hhS%shCQ>3@VXv!z;r|Ls8nWE37<+T<)Rr=Wu zaC1@H-Dqw%z$FuW5Io)t3WM{IRC4VB55`ce=LIm(I$4H51JnjYqn&dcSJAIpK9GK6 z2RxMD9x-N#ekW@p7LuJ+GVjPJYj>~%Y9e#i0nx7nJ0QRRDY(jq-T{k>Y&X^VYpTxs zV>z)|7EP0#TOd2ob^%Tpqq7>RIlQFid%0Cqe|HOu#Wk&;++JasA8#)wmS|(a*)ROw zd-jw@P5wJq=#yC@`qwy1p1MHq-)y#ko9UEB<6r?0!@dH)iT3g_ZI=b=D=$nV56=?$ z1})OZ{gg{?%O%iWebJZ8aL|aVFbHR{=>O9vnU0^ba4G~?3#{Cd7~&_)TcBghsK_l} zlNO0*la&8vnai6y2IhIa^*Eh|_<S`>69jVt#mpYaTG8y4${3yD@+>!3o6>rx!5FGk z_nDMaAS`_p)v+d(BT-B&fHN=I6^xgktUjt~lU>9nuwBB$`Q!`J7i-LIx?nMxtDWja z7|wPKwr>s0T;>SJw=L7}RP|xe@bpTTt-UKyh^UUE<Jk4mbqP=5He9nYnMFxQ!Gk#s zW)9qlM%m&R8xXU!z)H7uX*d2wwreuAI~udY#+((9qZ0iF!4=>MY!HD_w&7|5_yZSx z>5#T{<|%RrG%EfVG@eUr#&E;5pD3vq>tl=*9Nse2&%{~`%CYs7?Bvt-stR}JE(h0l zBYN>m*)l~nJ{&_G8R9o?ZA6jbkb_KUp$i|X`C<2HB=HEcC<^jh2l7VwNaDK&^9f)^ zBy&DYGA2T~Q^HwivINeeMlG7fgCk&<Ly)o`TJ4R;*GgaXrVK1T1F54cz|j$eH_G>j z_{-@EsvfW!J^pUw`Rg`r!c9WsR~c@?O=5w7ZBhoGwuC>zZsE~>A8JQzEf_iHO#CFR zWL;&!-DZD(*txkM;yE6Vt&W27jmOtBAZNXPl_2_UIHs7fh)hs?1C$g$3j44Ml+HHZ z32jTB<L0@E&y97WEDyl7KaK;jNXnL6GsZh?e;5w(XVl_P*gW<Y%VW9|9YavviuC*u zB5X)0#x(Vzb~_uhzcx68;06hny*dQTuMHlF;OP>)FJ$tA-|}mNM<95n1RrFA<<|z6 zAb7R}A7O&!*9LRAHBW+%Ho@k1Z&aPXME1sFH2%d=A<h+Fi&SrrIb)>yr-2_Ek1Y9< zZ&Wriu_)B87FXJ|M&dPw?SJ10Gp|HinXx&zLE$MGh^J-vK~eBWwH+T+^}bWISl&T3 z#@8Apt}20t-X8!wErHcTD6=6-<p7_xZBDYT+3I4sQYa8%vS(7@kjveY3qKf0Sp{4r zey$P4xG-wS$_f?Z3i-K8i*c3uxs1j6Sr;CHLtnC0KI@_%N?e5;iJTKlB9|`bY`8O6 zMA?^@iVM|PU72OXu@uW#7qTD@S~w7gA3%%sB9HdNaU2^|dXE(=z09#zD9-hT+T}Z; zaBo?yN^@X-{%~FXE~2=M>>#}#c`X>F=K3RvA?pKCF#G%w<FXr;U+tT*TSyQO;_b0T zX!@R*UbvJFK-_Z2id<);oej>EOGL0|eOM#A32$LwO@B4WRxvo)^kul&OTXs1PG#ZV z?s@p4$dWgBmKqE-Ug;1T0ab0{bFEiubJWgf=)&(!bX9dAYj|1rJ^0B=9=@pU2y_a~ zXiPRxIuXRO%V06|D;eCZ5>et)kxeGo45%5u^Kh6%1l&+#3)pu&VMNe(50K<MCYdMI z8jqdX<g$gO>6vAkr%8^=$G=4WCNIT-d{0#eG9r~xql2*u0D3=N-aA6Z%0R}-T*h|& zDswE7;Jhk@wPTVjbBVV^G~ju<L**fvdCBfR#P@o&E2Aa+`+8vD&K{}<a+jl|bno~? zp7nhTK0*ZY9xS5LiGZDDtSL7=I>3)3I`bqOxZjcMYU8>Hp%NV&roic~=q6DREqK&N zm|CzXfoF)Ehbr5$I9ey$k*2qV=oY_)yv#Zqn_9$7hwEztx)>vg+p+j#ShCGRD)#W~ z$dYkvNf3a0>HLZj+E^q}2CNVDgDW87tH3Sa6pJkRBVZdO9?JyHi7a`=7bJem1VtlV zi;4v88R@#TNKiP^bw-h((UGq4MS{vBU7WmG4YO+S>ipl3qr#BH@UfAuH;M#RN4olp z1RWLWy0=Ks)JPZKW*d~&De=}I_@emCAo$|==|S-I@neGE#qs@v;3L|m1UQCKL5?9? z5l|Do^u@Mr&<hS<+;-BA$>F!fC}uyu82!yB`QR~qA<Ja|CB~1J>F4;KsEsXV+>)7@ zSGnm*S0Y{>Y+V<=U4|6f+z|7#Xk@FAy!KRywNhop!*|HqgESmpt3V?dVH&~TO)9#j z92;5kdjL?42LxLpy&G*XPgyaWMxzFfn#=OkL+g~3oM#<jQ<p26c>ldI5f~`|-d~Po zaWH|H+8<nu-jcx9{`%Bf&T=`))wakwPQ=A~&(VcRibgu8YFrldF;9ykGNpOAX7+rj zg2@;MlsVp47|xPkE^5gWAw3ff%&|#-Y&Lgmg%2Hd`htIK|5ivqy$hTYZ!aH}z#W`T zsCf7fHZY~bqD#*KM1&r3Z>bEe7uw@RGDVOw8bUnO-Zp%O&&fhI-B{4q2M4N}-f9wN zG7*<d&WC|f6@rq1Ki~djIOnpt*+(Zcy{>O>qW1g4zGUPEmaz<~=yoTQnItwGj8)#f z1F`Z)n4N1lT+AC$=8h-Vi{gB}^aLivMU21R&z^o01JFX`7ws|12U?Gfvzppflfs;y zRH<D-6UPCNgEXlG64Q+@(d9}UskSv{d<k}562XNM43k=~Gc0`XZ2|+jxp`4ydCxXQ zpNNVa5f{e~wKL?G+2~jfQVsBZSV@@!)N?U(%@fQF=*xE5DfY&q0`|@d5KTsVlf8<_ zP4CcRSo@f5@`!WaUJCD6LSFHr-GTQpL>P#Cbq%-z+L~H4-sogRaxrK8fHyEa60iNo z2nOGh-V;%Ec4UaRx>y8ehGEs%mg;81YCD&!3)3I322JH+ViQs**iN!w>1H}l>V6Up zgeTU;@+kUl1`0QX$_vZL#SfI_Sx_S2b`);Sm!`MC?s?%-bk&KzYSBk3RSSGIeQ`{3 z2W4vIYOhP>JCGtHd}u9Km6~Og*K8zXak?K9Et+deT}A7`b$u*t*D|H<m5J&&&Rv>* z1PSNqq;)o<Kh#jxf_B#s{I@Ilt)PBL*WU^vrRuqxPm1SWSK^oFA-ecWl}x($?7-W_ z(lxePQy6Zmd0q}r*;WqQq92htT>!R5#H(TW<_4$=BcK{Iq@)_8*5g61GB8}*0~N`X z8_d{-)fA=_P4rdL|3`X0L7$K5J*O7@lh9NLL$NhTi?kkQ8|Ar}`sFlA)~fU)V3i7r ze$`sgR8b6BDA!ic6gc6V$RtOCZ6}T|ECCXun_zqq@|_BO6q!L(szts73Dvc7aD0?A z9`_EAicXgvY?i1_zbFw$!ha3a8)n@UQAbc&DY8~q8eCLdrnzZQQNwQ$X{~Q&j>t;U zH3s#*P?XK;3h0*JL%yVtEdYK}3{OY}Uu$Pm3h*R>U1lI(g*3c;x3VFSH(=2{Q%+@g zZxWv}sVwY}*x%%KNV)w{lobc-8`0G<aQgbA8V2O7x3V&^VM++<Oq36`1o0rwB&UaJ zHz86+=&>XvaK^-XUg>%h?nwr057x*hNOnCK3P-#MQqhYLmc4>NH<U)TUydLC!9#qD zzlI03260(EawoHkU0b+4pe@W!m%zz$yveDqorSY@F*UP{u6vRj<_DCMT7)jg>e^!> zu>#wEL@yE+bR`cLkCmr?9Cx6QG2^^0Dc2c>gJ2QiK=Xb07aCCgL_aQ+$?zIm{rYr1 z-F>6}Ru0NWUnLNyuRCA(ml8+}j?bNVUwo9MzQK?if55!>4`rvh%}Hep)N&b@gAv8I z6pHdMuh^vKz?QzE*CoymJa>Q}OFUyRKyY@G6#&f=N!-YmNqb-s0OJn5mZH}IFr$A6 zAw@zlspp<;kx<O*+lq%`YJXwz(DF#v<YJ+mNb;jLMUurF|DVW9kx)$YHx&=XO#hkU zp_uI7Q#|yPNY~B9LobTYE27cG@pFrWTpzD360$gcaFLKBB1<^3wxO<3>f)T;cA5>r zYLCC5FK;`_hG6FG51G>z!7`XsJXHASFlw=kdBQKxexW{3_|@4j)aMDGjUmTEh|H_c zG4pJE0+uM9ANp&cAG)s0$S^IvO`dh#m(e<A^`(-IaW^vi*9{;mTOn3{e?L2YkWZE@ z0a%YE-d3B+&Eq$~_-tjmQ}Dg<f@87@)LK0zBc;b=q&Oy9%ZM10v4+tP`Nm}Wy)n|Q zRx%!n;R8&mkqT2Yiv(IJxL%eN1&9sJ3bON8=WsC_{@TYR>jPSCy*^-_gxKwvHaQ-i z!|(Bh(7t{cbL0J>40+&w*~6IL1=Rpuly$Z}F(?l{?QBconHVF|E9WfW+cx5fe-g=! z$Y_siUFlZ`meBQZZ5)x!M)s}!8izy{6rx-VQ)bg{=YSI`kjae5#O|o@<dP^R*f%0$ z5S7Aeb=0REB2kVRk?C}EM`RMwjmXHs5m~l~#BG~F8Kyw?vr||*(#rdcVg_aS{)SGq z0cuk9V$y7en@T0aw6vUrBawdUefjPSY1QUzds<mg?LPzpnCWUH%n16Ej9fS3_<_Fo z8|*$1m)!?grRGh8p~jZvR+329Jl_z|aaKRB<G!M2S9lLYv>qQfJ3AGs&?nYq*yHJ; ztE<S}AtZ|bU81n%v|LfOeo^vKV=5OY?IcKIvsg}nCI`6jppQ4P7mpcPoltAN*>fl& z>woEHe6mC_zbvblmIZD}GEgtx{K?5Bxbkx8`E!Zd;L8Hk&a>LNK6!e%-!HF(IV~nH zr>@%C#l=mlpWY+z%NtQ3PZwy6^(kMq$9#1|FXsD2VO1edH7zPoD^|1gZ{TcvwN&;j z;FjKoxl{Q49e)3g-{0f+E&TogzkA|$2)}#TEM@D$PSsJKtj!U%OLg=cke0Jgv<+ik zDZFU8(zP(p+c4M3`D%W2C8HxK+Q<A6fi~OQS;?%tz~cP2Bt{P;Q(b+4r#jimzR;%g zQERY)d^p`msY@xy@2bSt{xmSkHs_VI1Ll?Rnj${CmCo5+?mW|;&&qzEA$R7vg$9tB z=OmgoyArCXI64A3T`luWEI`$OhcE1^MUYGodt}^!^=@#AF3^dij_lVru_CH(T12s| z%jhO1Phi7B=4q|`nw8NgiysHG$|8yV%p3-gOmJg;5bpePEb>&SMBbqw?_<&{(UGUh z!&qHhqL0RNrpwtEwj?n;zh5$ygC(8-W~Jg~8t7u&^u)j6=nu-<aP$Y|Z8-XaFe~wI zIQoMyC85;{)yUs)^he6uaP$Y|Z8-XaFb%mECM--UF`T#I=#S;waP-5z4M#uh+i>*5 zz70n|?Avhk!$-6oQP)Q|<JK|lf)d7r;q(XS+0(zlKQ<?*SS-8ktP$aW8ey=U8i7-L z#cG5<D6dBNgYs&GKPaz8_=EClL^deDMr1<@wxIn%c{RcxlvgACL3uU8ALOeMe%Mzd z{IIV^_+ej-@WZ|u;fJM0;7Co88u1Rs-|6-EXZvf!k?76odFUhd3aAkVOKkNuPB~!` z>?8a^c{RcxlvgACL3uU8ACy-kvO)PZA{$arBm6;mHNqd1S0nsEc{Rcx<f{>W*jFR` zu&+k=VPB2#!@e5fhmUA$uIt;gNR2q#c3<Yq@um{&ejJhqaxY(BchhH)O@GAw21y9r zS4sMM4&hl%IBk`q2d#Ril3f^<#-uB>U06(>&04_)h{^u4B>gGBjNx-5OMXbTP2Ds7 zQ{oPb;oYkxiQ)Rll3RfAh;J=)zrm!$eI9*BMt9PAD*?O?pjQG&>6HLdoW-_#z0>(J zK^&guXp~#e?#)RjplRi-P^4F22rj*S`Z`detW4aGjx4dCuk!V-iSI$6VWRenB1>)q zVziHRb(!EOliy|z{s){o2c&ckNHz58JrJ&CaHb!ek5dcsu@TK&=i?#U;O)W<Uvpqf zLC$R8jZarPOdraKIlITqp$udpu(+=<F%gbl!!6vbfv#BR;tyV~$=gfjX}?I~Z)Qj$ zQS_kaw}g1C89!KKSj%5CB{$2k>j^;yfB8Xg|2isoO^=lw8DZ{5*2trJXfziIKp^#D z0-N}YRzMc16?_nI%G$`1saa;TtRbm05mSXCODZK3da&qkZ9MBrCgd33hcXY~W$MJu z3X08LD#n!nu528RttiyZ+JJ$wxhSy~T!9xQ()UP6t}-Lgd@9{Q!k1MfGSjYiaFs-c zyHJ8HOR^_*%$$UYN~^|v01Y0ukMtXd??!TMxKjemjBqn}zntdCT*{BJm?BK{qta_S zJpp@%QX?~mnaUMVpGIUpE<AZ0wdr5JYjz&_I_iSU8~kc)=b9~0%QqG9kNVB~zvX0X zZC&4Tl#ZUl>2*O|vxxd)>KO#@ZkF+@cjE5Q4v;~kmp=4R%_n$+K3RT@Bino|?U%xk z%*D1YWthx>@U{-ky_U7Xakt~i9YI{muw3qz9B$5bvfK>I<>qa{tnBqU+ziX*?#SVm zlO6Uz@KT0ZZh2=gmG_+p(78!1<q-i^82xoojShAY<)28{AQehitwi=di?c7}$_Zt( z%&dt!)JO=n^QA_5fmFv*h;&ujen&t$BrKuSsQ4#%cMR|Rz}vJq(Mr_HRXw_1K5v!z zS8Yb_?A1~|!nMV&3^qV;Wo{*k>3L%rqPlq_mKSlg1QwWquYpit(;!7d&*@cF#P#aq z97vl4?W$DUXCjY*KDnd=MOCip5un?S$cus)d<Pz4$hKP(WZ_F`OkzglF}(E-A8r6$ zRnQvH7!m=uAOrGK{Dbps9X(ahO1lK85``*JF8V$PkR2<&Scezu6=mb6FMSyuS5)GN z%r)>rQnZ0dwq1y6cofpGqG^}f&6X&hJAixk_2Y1P2iemGix7}=f{}U1(H6#w1{)7w zLO2T1`|*EB@p_=9{u9*gg4LpBY3%!;*eXMcUyOTJLb+o03;Z8a*Wh1%ygQ^G1ocb7 z`ta}91>@-ucGMx2#=mz7#yhsJ3APpgepj%A(G*@6jPFv?aZdwPD_A3_H-zFvd@bd2 zP!CDmC64bdP<&rfNZsT3)`R*V!G7+rH$m~!^C6W1r8W3&sZzfdY~(1VHVIV^>Mfzp z1$C38b}^{m2zHgj_|+(m{6gv#P(0roQg@;WaX1rFW5Sj?1Qd^xgj5x%XC-t!s0||T zO;A4<>Mc+!B(xk$C9F3gH3ih+LS5mo9!LGRqc%F~pN={bo6cIwd5*f#QTIFQmyQ~V z@%J|+wF5xuxTibnOOE=sqh4^-dyYC3M;3M5nV`5V7gB3Ly(+nU8B|KJmn)PyPVDjv zP}(kc;~b(c{Rcr!l^73$(xv|@C@t^*K=p`}gZEMDKZW`us2>P5daP0p2z4CJXMSHO z50s8O0~B|SL+WBsI^FMp(mJnq)IS{+-(RVdMVAC9U2`tM3fL_o`Gf;72o$OjRF_aa zA4eJz<4#aI#?KE_>LkJ52Bontj#FxiVDmv~>`72;n<2IFAf;{=N*!#ePEhv?_DxVr zgnA5=)_yZ6uY_^`3`*ziltYyIK+@O*>J*_igZi{ke+IQeq>PIy#m}gP)Wkz=Da1g< zgzt1vcS-0{P?~SO<9i3xKZNgnP<2B66O@i|<Y7vkT|&tdKxwT$4Qf#2-406Y_j^#f z^#2O#)Des^3`$Fxb+`@f0(F{%CPC@Y`$1`~wp3Ya&m(NR{0t~9c^;@UB<^BRXA1RW zP@YizptQVSfjVDw{w=6yMbp25(mGH3gw=T~sA&>+uOn><eiD>U?G#X-k<imXX~{nV zb(UaHgK7|J4X728#-(u3Iv=Y)snjEa-8bIm<5@>dnqaZdI_js6`h%l-j#lbnk@7uI z-9kO*sL{tL^&`O!I@X4s;;73U)#a!kg8FZXQB$MTa-j}9PN^obRTPxA)$yPPCA8sq zrPw2c)aOAxBUl%x-wAe`!yW*ot+pD}?<MppP}*u6LESBJw}KiF>XQ>K)(`4?f(?P{ z73z>lO5H2eOQ3Z7_&ca((ewjQTGOwepcE$>A@vL>EqU(~t-L9q{vf)<Kxtjh1T`es z1)#nwaa%xX{g#8$8oUWg%RBZ{R+s2xENw~LBS2|+6F|Kq*c4D&-bPT1Me=?pS?W)q zGQ#&RC>{47pf(E@o?_#+g3=nCd5TgUBIT=~{wRE31Eu4B6V(3-b{{C6?ya9zisSE) zS_Vp6=yg!qe*48N^&F_DL~^oDss9q{K~TB`p8z!|k_SNP)cy|YN#Q%}RHYsi$^)fi zoDXWP#P|Xz9b+jd9b=EvlzKrz%R%YT13(=vQtkrvqJ-Y#LQCsy=*f;+<f!)@b=~Po zeO08~0qQ3r<vXBs8mrGxYMo$DfzsG>pnfXY22kIXxJP<Qy(HKVK;0zR9@CWinPBCh zG`1F$&hI8r>m~GeptR(pK4U}wAA4^CUqyBI|4$4m;uaJY_ltsJRlGOrjkPr>B36(H zsHkWXk{c2UNl0#3EVb7i*CKAzt+-XJ8}77jaV@qk)JH3At;MC4s;#(HthW8Xzuz;< zIWwW^Q~JF6{D059a`XAj=X}qZ?>Tek%$YN1W=6t(p`oK;CNu|oL{pvvlk2N~-gjV+ ztM)AH2#xUy%y_lM*r1hag>lj$#_KRsH^z<Q;a$}h9pQOLYTRpKr>XWDY=UZUhuYW1 zd)`FV%3#K>8#YO`d7<`W*iouI7HV78(rwk0r@@vfy8(8p=Hq6V$;SgQ({6kK`-$2e zcw~@|JnR@v`E;1c<&R({<zK=~>3#^CtafW*ru<Hsz$k@o?R1#g+Ql%lwbx<hEVRQ! z&yxq8`gwc7%r<^@RB*Qc9A>=Q>1fW=n%)qYNv|Ac(whm}S-pP*W>WqLcA}<Sd`yt? z*I>r`qhZGTZdje#&4C&3e+Dz9Hh40<b=~gHFtgo#VP?B+FtfFLVdts`FTr+I_B!lp zjr$hN#Qg+j;+}SFaCE;PvdnRTHZx=!9Uo{@L-x~<{WWCAPVu~BH6JZ7Q<A@h9jDs6 zq4xF(o_D-zpTdmY9w&O<6xAwVMjKe?c^7FuE{2_^Y_|r_`&jMvg1v}V?2Tv)dSoZT zzN>ZvngZ=en9*JhS!XT?eE?=ctC~IUDvkSRn9=T;5!k&8Guo!@fi?<ew8l`oD%2hb zwU0t=>y9AqSeS`>1MDTu#}e2tmE8(^S=mz9N@e%Jex+;~?AOX3g#AWYFYFa%Pr!bw zY&q;zWzWEVr)&jmm9iIMuPIvzdtKQpus4*gg1xEiP1x_1t%kj&>|NL&m92rjt?VP% zJIdC=-c|NF>`%(PPR>2b`oaF7tUqkEvdv)cDJy}kQ8oznzOuov50vc$`$$;|_MtL) zg7#x&!(o3>wh!zRWog)2W#zEHDa*qCuIvEVKa|zLydtShqhLkK#=t(+(6O+;DyxNk zrfd@Ib7hlZ8)%G+V3lb7yvtw<m2ExK^R7|W0yD?zs_x)e-7p`pT|;&Y>=DxI=PiYq zqxLbFIcoRn3HpiG!k$vQAHs~?-m`)$rC-7>)a?$L9k7;=eKdzYx*kWxbA#h;d)Uu4 zy<K1?z0Q+^mhe^Bc#ZKktXA23u*JHKNmS;eRcnM@tJ;)8(8v5c%;fxrQ|UXZ-OaEc zsNGVSyoj!!_XzA-)n13)udM%RK|8q(Y^vJr05fs_0Bcn3W0;9M==2~)8LUY|voI55 zRv3B>ET^H@hoKL{7U*`@z%Ec$dq!}q&ViXW`%GA~#yuBiQob3svPklAJM3|d`!LMx zw=K>L%HS>7G>!W%%*6c=)}q=5X9f8f12bDY3f8Kj$H7dD^0PhfB-N^6Myr8MS8Y7Z zl!n}hG9|eZ_C57#HWvnMYBvvN;+_thq1r;2iF+r^c<?Z+T|*y-nHXoE6NKIcGuMNU z!aCIMDVVW)EwuYHtW!fj3`4izq-D0TBW$LIreG%S<uJ29zHwf_X2Rr73*%BSQ_g3> zeyVwU4rc1wx6fyayQWuw`98zCRl5vka``gMuWRgZ<I6U%yxQ#mGjZPyLqCP}Xz1U= z&|Nv$WSop~ADD@;H*B_Q`@_uEroiT?))3mYz~-tpJG8qWX7<)9z<9MWMPbT$U)aeS zqZDSgHV$U&j)Q$$L+irOlf%%nVe>Tf{4n%sm^|Cx&wCDL%Jfy3Dbo?0hE17%2K$c2 zmFCTCcVpNos%;B1xjYhP%Jg#BcQy1Xn2B*ctf1PGP`d+ms%j6zOe))69F)POFq60I zV5h0wO)!(*WtRk@y)aWk&%@-4#r?b&VaD#g(C%~C85&x2X%PA?*vDE1<6))@>R_e} zUVs@7eg`{K<Gu+qDern&5V{ZSEDg=TOz2@@=+UsVHT3u}^wThO;N`TK8oDja#GMB- zJ)YBHo8Vuum;HXQwOZIY8sjLKi80`cAapm_xf;4B%!Ga;4E+}DJPjQmhRz5>PllbZ zq2CQdFNOV0OXv!iDWO|oo2pk!VFQ%i1KUj5GT7$I9)xY7tQWSWvL|3A$_8H<_&f}D zfo}I}Fyr%4bj&VP?Kqgx8erd3trK>wX>DPqo*r^Ft%Zh8f|<}f%<RESVWyT`4O^>r z_k`Mmq4r;)_M1@qAk_XEY6CgJoAkDane@`3mJPLL*hRXv=`fRz6|jY>y%cJ%z%Ewp z9hmWcXUu6dsm}+6tR-X@hU}h@{W@fY#iXZkFN9s9DPIi3fb_0_U8>s6FtfGyU>m9S z5zOrAegv6g;U}=mH1rXeN#!Zn<*K~|<BybYx-Ka3dti$+^v5t0WAp2S7QHfLcfm}n z_i@O&Z}7bDYuw%+2I)NuyF#@WU?#o(HwB^Fz^>HL9bhJO3G6D>?uQxwK3Kx_k!nRZ z2ijzqsU<nsH5z&n%%oBXLoX0bLl=gjOTy55VT(2NCt>K{Vb`kG|3|^d@!l}AwJhv9 z4gChpY%K@7UbPMwT?xu`A<V@10qh11y#Z!oJOjH?wO_(aj89=E#zwa=daj|H!c2_) zU?%hc*i9NbG7LQuwwY>2!yZ=;rrqj!OH`W$GbOnMcC%{thuWaqf|P4uKhn@cU}n4L z!Y<JCmceMe$XoO6jCQMCH_Ukd4(ve<9difc{2F=`%!Dq1(M%BcbJ%Sfy6Muut9@Z+ z8}+d7s@+?#1<FpmGw^RZ>~@XY2{Znk6^338yF){-3PbM-Lmz=H)zBxx(AQyGtM(Sm zl-h{9g0`vu-Q3mE(CuKR{EmZ}y>K4vE)87(GrlaipK)8&egHEu-i6(x+GnBm-DN>p z?fPS`5;Sxu>@>~qg|PcnyBcOvc?4!k=mVH3p?N<EO6YCa{Tky_n29m!0Y)ZNI}B!0 zzVcynlal*`j|BO65cU(bdldEq_2A_&^gY-E8v0QfI-oa*yB+L74c!T5;_eUIQMChM zrcB4fe(K5IKl)L|4mETHK@Tg-!b~k`fjy#H&6C{mRQ4^H2|XG1sA>~P>@j6iU?%kR z<w2QV2zy*ZuZEe@IQ;1#^k~=<8k&Qd(A|H=D4qKEec0*Bo`RjCtnBAOeh-H|sc~yz zCcm>`PpKxKs6I_&+z6x4$?t?`Ja4Fm9s?tLXqUrIRra%IgFAbxV5YWv&rwe`^jokO zH10&$d8+*tMq@}S`##T+tgIfkpW5YMW*f_3*J<eQU=%tr2CN9Qy<s%RXmv1?%adSl zXex7Ird%$7(FkLAHLOBIuY;Lw6m7`05TVgh1jXnJmj1<_SA&i8DE@Ex|9=UvyFIFk zv-G#t;?*E-FScLBzT_*~5B`ewsV`w~9|gm)@5e7#`pU1Z?SrAcZgWXP%EwNBL~Q+w z?9*RhFKOH9v+AtJ)0e!(?d|-EzxEQhmv!5|ue5B9ljm2mH@%X`13N8I<J)ihis^TL zMf?1hu-^omVA%{JK5xNKj)T7Zx9z3AiOm3hqJNS70ltl-FLA!eezI>Pwwrzl`#HW% zP;b5{{gc0<eXnmHq#GczF0y~^@+q(`Hd3zhd=7+5-2Mte0{idyJT!)gy<Nxe@wLFF zFMoov5F0uF+Us$93EM~vg9YKAwTEJFr!gNvv|zEhXmNYF8)w_tJg~R(y9@&<gJ6l< zOWVJ35a{DSvlm<2|JAJ6_I8*g7q@@+3+$!r?D}AO$@E9i*Ah4Gzt~GXU)S>QwvXrc zi~RYj_Wy4G|I^Zsm(RNPYh0h!)-koAt=sGN1IB=|FaEnryj*59%&BW=n$^(WnA0R1 zTN=7%G<14X{S7PurH%&684&xp2=sp!#>=fcmus@ORsJvf6EBa>hOX{h7x#X;x;g+a ze%{QY4YwWmH}iP@1HXdJuJ8Oe<r+JhqyYRy`WZFxhBOHL5*RPv|EctwJGvTkb={2( zZLRIo@Uyw2JzqDYA>Y+1Jp+Heqq(^|CwrKCZf$crTk4t`@(tWGoZ4ZG(C2fo+4X;N zY(2|5f8o+U7XBh-XP3dhTAtyC{vRPuAA~#y^*`S*&FgMG*)&>KSxDnxw@;&3w~wKr zv2ZKue+0GrIO0%{-ypA&@3vff=<5?OJHKbJZs)ft7CtJr&g%c_#m>8Aq^+Yto3EhU z`ca^^O$|1S>;jTV|HdW0sTngGy7RQJfqxBiTDu!NI=Y(t6Z}eivD=$_ShxMJWqr)Q z(cgbH>3IE(=TFX`cK*KV_UyJ);x@OoH?-AF<&ZEXDCJWl0sqY<p8mhv|2BK)<MVKS z>$7}1yWKNxch6Kg6?!vroC+Jey)m4h?CsT4*;ZJUwjO_0#dj*&f65Yf%|4HdkMVxM zBs6;;|EuNwRm;IDT8$dC13@~YAolSd=wBA?yh$9XzjgVJ>A7~(z_j<ws1r@X;@cMO zMSk}7<Lyrk;r0CfQ<r#sXv%fBPHT@!K=N<2ZYTe~U1x{i4%_9{9+nvQeb|6qJ~9YX zZxu!jJGfx24`SW6m-pA$>(X8o;ycZX|9{jifpzr<?foS&?0PQiogJ-Q07M6ZgsbN7 zZ?Ta@K3{F`pBnbfDr^6IgpD0uV7;DSu#AG(;er1D3dZlbeA(kKD4%}+%a0eTkFzxO z%$PB^u4C#+xyHN%NZ+l$WAW8itg5IH^SK$Fb_#OgI@lJzB9EsZKSx|bdjCrOURV0T z_080VZs(eA3EQ*F>x|g;C&kuT{f}DW^&u$Fcz)YE@=dwsI_<vL8F-Tw`<PnJx?LVO zux{^<rr0{G|Em`}Z;}yduBTc#S_ZevBVIq{c(B9&)9Z_swJ$~E<rCDeAo5U1+$IS7 zG8jKzW&A<gG(U2@Jj>B(!vDvX__kzUAIz`FOYwgzWyATuwX!t-M=Be`f4TQq<Vg=~ zOJ$S!zqzt{{>$B$BAsheqD-3Efy$&#?Vzl{|AUmx=l>vO3;4givPJxt`+Y?^dq%t{ z(pffpDO<+>y_NOye@A7@`M;~O75v{>*-HNJqHGoacT%>R|GOz$!~Y@5*7854tbY;n zf0W5=mto3kVY@4v3>%@W9=4w{c@8$MtP_?|CQlWXDl5RYQ6_iw_E5F}wx_biuxe#X zVEZUr3fo_q+^74RvR>HNl`V(K{of*Q1?(HjR>I1Zt%7}1*=ksYvNf;+m92$I9Rt|) zHOl(K_EnaGjaOC+t5sHj9jQ!a;!RMt3N}$$2@SN=;UcdFc9gPC*wM-s!;Vq50ybHh z98Sk7OT&&+Ru4N~*#g)UWxcQyl&yiCs4PWOUZ<=UR<Eo8Yf!cnHdWawSfjEMI=oHF zYG65Kov>zQi(xXlO-aI9l*z5hR%L0}Ny_SB)0HiNwJGa`%}}-mCL@X*GyQo&Ls>1X zQ&|BvQ`u6O+!-kHR>7ntF7npEzNM^$+naf1DcIr4YG6IeYGGrQb;4#TE5ODnTMV16 zY$@z8Wh-EFl&yjtqD-a=%vDwb8?7u2J6Tx`Y?QKk*teB+!VXoo048_di@e3KG0OUL zknciOD)Pp_c2zb9HdNVs*zU^K!iFgu%mKZhvdOTtvN^CSW%FT`%GScN$_CS<j8--o zcBryBu)~$fd+x?6TM3g-%@=utX_zJ%JJ^ZJ=EF`<wg@&w*%H|C%9g>7Q??v-tg^K< zYIVwnmr!4nWnnpGV_;3nR>P(#8%*=ou537LhO#WIP1zXObYn-e+F?RrvrH&VzTLnF zZ(*~Qt%iM9*;?2s%KFm~e@EF8SV7rx*x4qOCREy(B5yeC0%a|*3zf}>U8-z3Ox|u> z<gJEXscbk+)K$vltsW04Yk@teY!2)JWrMe64ydv*uqTvFhCQxqIqXSgt6@(o8@?US zlq+k2{ZiQ+*h|Xh!(KFYgLyL3Xt39mErP95wgmP&Wy@f%Dq9Zwt+JJ{SCsYV)FQ8< z=G+5&N7)?M+sfv{{-|sbOj=0JF0i)@<23TFvemE;m92$+psYV9kN1ro>?38%VV{{$ zPB)(`8xE7}Fg$>5sBAuLfU@PVO_i;M4OG^j6I6+^!LTirErV@k>|om)J5FwcjU8+| zWy4|H8avnyCN#zQ&4j{+D9gg6edkz(?P~0XaD<vr*uKi<z(y!r1S?av1XikS@NS$x zlrhwk?{4gB?ac2hBcl7ZH_VXc)!Yf(x2e@!ugM4^fea&Z^U#|#w=*a2wUEV%-`d{X z;dOR(bmqG9tvP8JS*GW@+U4HkjGnf9>%L~#UxM<aAxX^2b#=FPw0lQ%<Xaor^5~wn zwj+EWB>w1z8Le$|jdDz`by`baR9eS8_cR+vwohwQcfHo`(XDfGO|`B0#uf=bs+}7k z-1W@Wc67JqWea8r^+_$Qjnmt6-8eIPqU0zDZ=KnbJ4_l-xx;kW(MI;hHndOcX_%Hf zw5y}16RoqMyL&b_Ec{^apthdeMDDZt$(Z$))@I*bT_4?Z^2xUS(G5iM%V~VRCD$d1 z`0FO$kzm$ctBLuhF~^V~D38kPGOo3Kbgm)a)8#udkxS!=?G2sM(#sO82l+Z=PG>{A z?19k@jd||%kCr>e2X(Xs85_-hxA#YF10zULabfSQl71J%tjDxA<#jh`_(2DmJIP0k zI@&v!pDd$vMDl3H19XCc+Kr2DOnZm4a|hnswDu<UOzrZE#XFdp8Ek_Pqtte_&T7c# zC|~Y<m_&m;t_GGqjtL#cZX`p$k_RkIor?T8sHe59Nj5UFtE+*N?7{m_sqN~Jaf|LL zBRe~(a}83Px~Js3X0_&KPsz>UJ{C7$rZjiua#E?MbaypQ5t5mb&ong8;L-cQcggqq zNbdwm$Y0h+dXm(nOx=WBLsQ*2b4O(V)M)ZUDW^KSa<f`Hdb-=@rW*43hQ^j$Q_8<> zl9Gu6BL-;yZhiW5e2^IUujP+<Lk&&x@&k{<Rhp%a_Ed92Ya4lhN%N2z25n9?qosy* z50G*=xMN0VPd-;Sj!8iy&7`3H=_{FK9pNcv5T*PXMEj?PHQV-w=JG*0-C;thRBO{5 zHokulE7hW{TPmHBrZ&~n-kQf9FKIVhj;++Nwx-BX9QT*?RbJ$CEM-@BsLTl2Kcyow zsa6_QaXQ@E|NQ>>*YX!uhoHFr#rpN{OYh6p*WjEOw7BCtIgd89O_WI?6WbcN#~GX} zO_u*t%a8gd$H};Hb=qR@&+$o%)6*?YP;+ZnciulxIb8K#F*m&PIja4CYJP$W_J96; zmGfnEJo)wE=!UL3b5{S-HNup<&R{e%BJ{pxot%=p_ooSK?C9#^be`hg*VJ5>H2w{9 zB*Zjp>uZ0d{FB&vOK-nnBfdsQVqN*_pd&rIi=HmWi`)fFNk=|aKdgJt)a+Ky7xfZ- zPtMhT+ij=g-<_f>uRY~;l#;Ou3(BwH>n(qNd3}*zv*`9Wtz+MbOY6&@FY+U(MfnD1 z-K@9sVO0O6{?L#3XZwo@%Kx+VS$yiFTw;E>CGv0FAG+P99@8h!rQGfM)pNboht%=X z;~Lg1eQ!C2OgYTfK3m-^y^QI5XT%Ph^;I50{`&M|KkKR|xEe||v^S;pvoCj2Ee*56 zs+;O-X=-h5&UNMJjz*1Tt}QnMCFpUkulxjcUF&_?lyQn4x#TlI;rUFR93*wqb93eL zn=+r)-XWKRDPQs1Jg)9rQql}|<Wr{2XvnAXEhswQAv|Ie*&faa##9dKxv8ceDpf~n zMr*hBLj3f*_tLoXPkvo;(KMCbNY`AQH!YRGY)|fO(sjwT+1=&!Rv)D-WLa<JfBdj! z_JRGUrwYp3R57_K@u!YQdDKf4GoRcq(e>reSKY2DjrCU^Cet~86oSr2PhPqTQ#*Q? zV(I5~eU^V>d-3jXX+>o!a3|FugA=SW5F(vmmJ#OGxfhx+93lbn_4T!XWSg?Auk_@& zA2DJ?c)pvMr@d<EYC6Ok2a@fj;sO4?U>u9<`^Y-w3gI3*Y~uK_^hnz?k*Or>r4j)q z$^kv?)7v{{w|~=5VSVLSH_E^Dm7b|T%xmqUht|+^Qct&b1*3Lbf~dp{d32|SH+OZ+ zkP9lBw_zvuNQ=gK)MM0Rz4?<mz~qpP1ZNCS%5Z(<Hz+@oZ+Tv;+l&hKoqHX>=quyv z+n@E7UT{3Guk?cQT3_h}{sp+M{hiCr$;tRzfQ@Y(-8mU;^Bsz>kLENps#Pw~I=bW@ zXMBBq`M<u)BS_EGN4amZKjU+pEKGl7DyNUIr_!2F(W7Y0r66=jTHEQE<WjS{I_Skn zOhzf`PM8KKKHkkC+i4j^<B6SSAUqz%b@ceoTzehE`?>x7Zrr{d&HMV@($tV|q)JmK zo@j;0)v({#ktsX=@V)j=?KjFAxMwJ)J<kn+?$ofJ;B1td-6CVDayui(d5Tfh9=*V3 zoLCk+z5P>-4eioFYiMihU|c<ya!21KhHKy6k*eR%Dv~|@Ga*ITOa_UtzUoI%uLD%) z6aMhroHnyP?QN~obMzVYHjv!*kxnQ5N7KeKr>%keU#a0$rt=si_T|!(+eUpSmx+?= z>~7)4O!UZNd_CCYzg9lX;Oy4n^e;W0&Y(hYf3cAZHto-Mb~p6Q@f~9SO4Y18jPdTM zJ~TFRV=h&%hI^)FbTst@7uoB}|9JVx?Vwa9)x=Sh>!KdHehuqP4G#vtO_{slL7!hL zp&2DNwf$eMk5PF~$W7~MYv}R<3~tdK)Yi~AJ=nS6zg9lldg%@xHl%jqz9XADrskvt zX5PmTK`AA(v6Nm}HKhD<YbH>$Ou5K7u76vuZj?5JLGdKps8lyCJ?&jkT<gvMKK*Fy z=;0z>S{xpjqGi^T(w@PUqx!JE%CFDu2OAU*%#CuI3=Y~EI-0Hh^?&R3zrub9s?_@N zr-(@t114<LS;VA>Ef;RuS;Q2E0e7)pQS9whw3D|DcV^XQA)45Bfg2Th8;LHqq6h2y z^z*hZ+Q!?gbJKcFuaxwdPBFN2kijmH2Tlfcm6+{Gc)Hlzu4pSy-krVuH;TQjiaz%? zh0C&%d0*R)F7|dT`nxA@)RtwHXk+?$I~NTp+O~6>dePSQ#}{72wbKXNbQbL`Y3!nD zgn8SenD=<L8K3=pnr-b7ZfkfEY4F;+txLD;-2Us}3tQ?I<zD&rBa6LlDGQ^RcbXS% zv4OWm>42ndmbiBr%Ua@wWhZHOZ5icX%4GuOA^vnx4pO#TQI@>0P|J_kl1e#*WgF-c z?*%_zP`;$I{h|HXU+=TO2Gz4!uaj~r`q~EGzz+s=7VTwxQlGn6mwiymJ`kT4l3y+N zp<!7JrYwv$E7X=02U=UGO%AmqLakort^|2XZ{ThBfxoXOkVhujY~QtwzrDd>oTXAu zy5F`{&F~$R_vM?Zo4c60Dch2A2<mZAN6EX^GbY^(dZDCq5!-l*U$K5|$*|r~>qm}_ zwo}Mt?wrxagluxiWJZ+<m3c*m$vf=~qZ0URY{&{ByESAuptC0hWjV)y{$FPCZfbb2 z)btCOd1GF%ws%0l)9@}>nA#RDCs=VW4^?K*TJ{H8{5O_OI6+3V4Wobqs0G1ty~Wea zNeq?;EdBKGjAFja7T6qM>7|wrt1X}R35-FReHSbjS?Sy5aFb>8XkZKuu<YkqHd|SI zoMr!Qix0K<UKZco;@er=wt0{_kHL}-2q<$}gGJ`_2FptU0jFDf-tu#zRX$5B{WHt{ z?v0{^4!8DQn-%w+$i$<84VRNbW@d*5tEXBv2V48@3~O8RRkdLG#HtVe6g3T!d7;5_ zVL-q~Ek44skz|TJ*|=eHXh@4ytaI6!)(R`(zhQ%5a!eQNQ%6i;g)ya2=g}8?DcBGV z9SRd?i}eX-!=$$DsiCs3WY-nz+-}3Ntna0vGN2+`EcR+bHVU@4hK_+THI>k@A*+S$ ztD%!%a)cJ^>}|uQur5bHu~!e<T0@&cCTFB_4Q+!-{)%-bv|)MH_t#MA$6u|X^FmgD z9iX9Sz^>s}tl!x(?0nY0si6yCOh_g4l8{LYTBD&?!G5Hni$it;>>v$Y0=tEuX=x2x z%K9h`y$5!yhD!Tp*n_acG_)6X8^2=jiI6Ra9igGmz_!=W6(M^OcC?1BgfY>SxUYn4 z6|6x+--O-HuUNm@Vc5H@w`%Ab*c}@BQOMT9W@_l?Fv$T26zhh`8KYZ6`}6-!4VAZs z8&(3FtD%GVzoUjq9W_kq<F_?5#s8f&bZE$=CnD{4v9}NZnZgQ_bCF@P=g-v8EdQCf zN~r8n!({)QtD#cbOjjjT&R&L%g)Pv~TK=arbW+IV+;%a)Vx7G`L__OYH>?S^h+naO zlWaE)ZDZZAPS`aXn&<!S8agLr^I+F%Xo3GjHS~;-&4*pDq382|n1+g%hFt=?QA1_x z!!`7(kS&Hu8(-|*z<+6Ji@hZwyA^h`hA!p*-WqyO$d<uw(a;C^KSD!$L-qvhHVs|Q z|NS)dnUJl3-Jzi`@;|MiD?|1Q>`o0`#eZq*ioG{Owi<S~hQ7=HQVm@bvX5Z*YUo=2 zkJQl5L*~(QxL-qM{_{Z^Do>XfMi<fhv4%>Y<X#Px=erG~<LF8LX#ZgMX=o~B(s%i( zh7O0_uc7;djE<Zqxu^Yu$&t%@{6lsC>^Tjsf&ExRM}=$*Ov;P)5B3uctqs{E*b5pu z88%8or-ZB?_A3o-f*qovEg@@zNx9Pg!A5InK4f!Xf7Z}>FnPwJSijp~*coVl(a`y@ zF&cV)$QHmp)zC{|4`}G3kX;4)yM``?9j2i-glq}S<460)e`(u_^&Q)W-GjD)hA!j( zw>0#@koCeg*3c*Tf4GJ&57{%Y%{6od|Ho?Riy>PH8>FGH@Lzf_#rl<4!`?*ONkdoj z{~-;1H)LyI!!-0G{y(gtYeV)qY)=g(N&T)H=iiXYn~S-?AZRmKuf~<9mJAyN+gn2i z!yeVpokEs^r8RUY>@f`;9<qI4l^XgF7Rg5izk@kB%es`Ethe+t>#|>EUHU^3F7-jy zOX=^(y3`(7zhWb^E_F@TUuP>4elPq$erNgXyTQx&$+<$phk%v*q(zc-X;Z8D&GGG} z1(xuW{cvg5CH?1pf8^X$!*AP7O?)|%eUsn0etbFaiT&=Z+shNIkfgOd87Vd2t1$s< zYMxH-SX@49Slj8ltjgYZ$Oo_O@!0QLr<}Uw6KfVOtoYH*57({g`NJk{x1ImP<KLRO zL-$o9k1u(zr2F>+AK(7f8K0hb)>XG;M!)d8B@<5j(+k0d?l`LR<7-dd^yC1yzG&mW zHLmFQ$IJG<a?H4gw~)%IOHCuQa!0f_eRx{GqJR8D>OoC2^V~<I(+i4<3cfO{qiw{D zCOIr9JFywjBzF>K<s=EoU2&1LqV6)HDL1ue+R%xjO3dP-OLi{uc5}+dx0xh15>U)_ zeta2`XD;~A8SSF8GqAaR1-&lJ=WV{}oXA?jWa;OnG%eF_>vWVMVt~Vujhs28U5%8l zqsX&fks|HO0_ts~9EXykBN-{;cfF&08)Z$2ZF4S437yF())go<Ty7X;M3;F(9HL&L z6&Izb#=l^#zN1wdb$^k*jw~D+TC(P-uE#b?`FX-h_OO-TqAcdHi)`LUSw&5V6n3t+ zqSjXAYbhm1+RCmdODEV$8m0DVTamux0!NvIQZw1MX+|kI)>iT;sVTN{9?H@aY~?x> zv!wjI-<41vLs@a69qUDube*mI0c8mZNg0|dDd*{4$3~t*lCx!GvkOYEqg0`+abg{g zlB&12RgY5ZD6>#H9pwU)#g1|v%4B?swk}^)C^(9oU8DyV*}N+0gvyAhLU}Zt96QY^ zfMr<Gh`$&%bmF09m1Sk+vZgkkuT%_<E0xlNb8M<4nxkZE;z~6Y%CRX=*T<DiOQ=Bf z8?~Jrx>3!P^V!l+F&<Wy%HeOeF0tgSwxVFi+7V^d8Mcx|S$v+Yj7O1=Jx1GVL@8Wq zE8Qq7I9MZ_Q&ARNWh<AVq^`A<8&NuMv6VYf<fFz>I*&^%@@Dp+<SU!5C?^wEiJ?@? zk1Lf6;!4%xxRSj!u2f5Xj`mkJU721US28Q(O6i)oQr3?;=A=_z5?3mAiYt}F<4RRF zu4Ko=m1;Q(>}^%0TjEM)PFyLK<HCtmwkWQYFNrG^55|?sC*n$#^oO04v#a7t^_rNH zO-plS$I50(;!3I11jnXK`d5xpUK3X;YU4^}eO#$(i!0gAxKceQrc|fr$Cb>YxKb*8 zXWPT-vZZmQyf>~?NXzBKs$3OUs@BAntTfe5tZM128f8XqMq^7C6;&5GJBSj!za~&R z=f-SiFvr`C6}+|;Rbnv%CYBD0^_ooIradweWoCCrS3cO3rXwrQOADZj*vRr)LU|{l ze4J4Jkx(`bIzZvJwofQ~B$V=ma&SV4#wY`y>k>BY3FXX$a%n=jHlh4Dp-2zhEWy@a zPbfvweCiU|Y?V-UPbifM<uH`OHg@}bEJ|uyTWN7(jh<9j+tA+H7;PP8QcG9I>_`#T z?Zgu0w1jd|Lis^Lxjmsgo={#+DDNhe4LE2PaDtD{L|dX1xU7kk-Q>X9!B$3~l<aCN zhoIDEY-J)!ic6s=ooOgb544q&C032CoQ-0ZU=LoIP?jc?CsEQf?Q~Y7tm3eXw*Co9 zZ;!2Pva#pY&<aF0+oANHY%9Z2Qs1?eEK1=rTamY0)?8^T$D(xh+Dels&)7;g%2G!; z4W;Bc+vX~<ag>`;3UultpC3eVOKe3#c{QQDn^6AdC_@jK)0!Vzq2EN7!)znZSE{zw zYobWWWGnPYiImdPYq*SdVrA;nu2Ncl6<tPSBi?V*pOKR4Kp8rkhe(H(SDdc3B}%!x zGOkoq*XgxPWK){Cv^GdbQr?x6UpgvKhK@ZVQ&!1W>pF~5?4e}EuC&3n!CmhpN2x;D zZK`EcN(Q`NI|>PVThRvic^`X3DOvKmZKaHZ#JkB+%1~Z)6iKJO$x5e8()r9*$|arB zoMlrk{;YHqNoUJu%cerMwdpil;SlwXa1_buMUEm{f67)WOHsCMvC^rOt&ejQ+4>od zA_e_`tyD=luW=Odu%^{Yxk^0jaTH1CNn4>?#rLrtMba5}l9f(Y(mB&nB%R;bO0}f3 z^>iy%wWQPPD3Z>#jv^)YD_hB=NoY?71Hzh+NmFFUy9!0N&{Zh1r(FdX|L!OmQZAoi zr<@_>lU#+A7rP2Be(Wfvq%*GFPN$Tt-smd$^EX$aDopT?ouEy~RK7DOOh=F0Ox635 zqAf{T*(GO$Hl}SU-TgdQDXY4Ffvc2eOD_$Tu}754zPMGdzvOD2BezuQ;rW+aHhNV4 z%28y06)&=FWPjB<iq!C{ZKaIj@g8;*IpTg7DVmG&@^gHDC=JbfMP|jF;kHz%DjVJ# zDkkrhBcE}Vtas6hKp8P7x?JCwZ59{FXz!M=?PfR10JOjC)!z`c@kVq;u_S=8xMIfp zVN1^Z@lX9Iz&HI^YNPT5sH~ZEL^_Gp&A`a!ROp%k!S$)wERw)YZAISPRO2W=Ln*;5 zO8IvvgHa?h?y-Cbt#x7z*u?Yd9c2hgr=wJ(tZ|fyD3WrttrnD_DABg&`ATGS5sK{T z$mT|reVlY2K{>#&S&1U;U6jrTC}SL(O(`uYMCo#woDM}PaTJ-cU+XBxp~$wPlxLz$ za#B7UWt3xc4NARZbB`!a%Fm&+ILd02PDd%GMAtY<3T3Rbtt?8Lv#s$clO3CBD03W} zQ&8$1n@dq>60DNH1*OHYS&p*6v3V1v)3Ny!g#j2Voz2OCY&|N&;V4TSn}bkf`araI z<V{;8j?#fr>nQT(t%8&CRVep3Dc^xo@5EYx(&;E4pe%KiZCN|tNx1^0H%xg1WAFK? zZLFIwJQWwMQO=B#HF~3-wK{AVp7&M-Hfk|Z(s8ymgS8coGM}}QE$q^`5oIy)qcVI5 z<rx%nqy*bqfkM^yObve#o0OBzyC}mQr5|fqN7;$BF^*Es+GIx=%UYA8$XchPe229) zG?URjmA9D5-idN?JIcyLE_zX-Ts)4AG+R+Rzd`BmC?BG1<|v!8<&>igMOo!22cj$| z@yMT}P~Jo_r3&#*LXrCg(bngqtaX$hqR4cV$mR)@eva}wiri(0Y>G&uWGh?Q4P^yM zMgDvfWerN?&#@@4I5v5d&mEf!QBqFIH=+!8lm}7Lj`AYPQb+kSij+p=Pcb>@Uu65U z9m*QVrVM3}V{-&buaj~!%5q0J1!aY!T!ymBQSLxlytQ3oKSNpTY<(3<D%^T-Tr9;V zs!<<fvl%u~zBXq&`-HJD_J*P?b++|QlwL<U7DXltMf-FXisU^?`9c&KO?8jc#YBw! zxe=QZCmkuRl%u?YQtv2#MH%XBYiqn4mDtt-XIpz?BmP7l9)eOE#=_V;5v9}F*2yRZ zN4XrO*HP|6sc}+XfifjbIoKBk$Dco9v%*PdL)KO~%5JQswz123B#QVP<>Gi08Gm-m zxzpKJ9-De6*10Hhe=9n^e&DAQrTj2T!LfM-rPE30GnDfko9*#eM!%zU%1~siJKEM* z6iGR<X-2uhvH32FjG0F^m!T|mY;Hwa;MgojkumdVTW_Gq)}wU1Z8-)Vo1IV=J2v~H z$X&W9onugzI5x9TRyj78pooXjw(dlE*RgpPWtn612FhB;W-UsuW3$<Iw5#;KBY$>9 zNt3te7#xdI<0x}c#yH9kQEDCKMU)b@7p2p0uqmG?7yF@<gj)~lbG=i?j>SesCZlw^ zP|}Wa9!ia)+=$ZaD37AN;^bZ47Adn$qP+hZWrY)K!1nA5N7)l4McyKRMx(sxq+E|O z+(~&ZitMi_@83fycWiDz`N*+(2&Klcc?son$L3EcV;!4*jAf=B4~L=1{ddb}6xpwl zG7Y8PQO-e0Q6iDeZ75P(qFg+KGCACOum@|MJ@_^@X(ye5JK~R{WKqUCN*&5%M>z|n z#ZhiU$veu6C<RCP97RTVqg?E<lX-t;l#9brni9FFadOdtO^K7v0!hbF?nD{xC@-L7 z9pyumF^)2bNt5-CQi-w{zayWIL)phE`MD@^Z_Cu)pybnz&zEDf)Jf-FlwL>qFO+8- z<$aV@j#9#S=VJVh{K=q5&5X)$9Ll_eKPktb7HlRtu?i@1_boaGFGpGGZ0k;xUPpNb zMW&iY{`?VTij#5?<M)?1DGx@Gy&U;G0%fsdb1;hBLyT;upxo-%<WWkTtzV3ia+JGK z>K)}Jl)RJj2Pn(Jl!HB3;*{7H6kw;5&Yma*M;VFI>nJCnNU27-$fG<FZp&ji7iEPL zYca}7N4XDWm7_d^vc^%~Kv_!ZNBiP)6e;;=>m@_jmb3NUQF@(N2cj%@l;b6qqs&HG z=_nVYtZ|g3qENDtKhLAcUXJ|vBg!kGKS9ZREKwhFgWWiLGJ+7LvmHtcSL2bg4~j=_ zBV{B?KSwzlrNmL%M8Sh7))^@GY+!qMIf{&mMaRX>D7}tNFUm)b%`Z`wJ2rnp@wj-6 z(kb5E?2D*0hM~x;$jD|iO3Lx@1eCO+^q_P)%J)!KI$OU1MP^h+DKA4QII&(rIm1yt zKw01@B||AOauStT8fBHUt;11derB|-97?ckptF4{D$A=<*l??iLXlZ06_pjGopGhS zH>Olq^zY}ysw%6hb(G5T>e9t=rA(d*infJKWeHiZl!|mZ9aGB6>f=h~oKP7tRo*yk z7AhyBphdxIh&pSiLT{kxJBCb7D=W%No1A>1lr0WZHnFNJR>YO6!8mODTwPt`DwXN< z{FqXamAjZ$tjelVIRI^?y0SK|R4sCqs_IN{Tq$23SE}TWpp|kqoqi>*l)f2LN;7L> zN=11MmB&t}qDsD8Yb#aR-k6dtEuqn{ZK|v5U8OpmkvH;NHq{Kjv-@nNs-iZoWEVL~ zRXSU>GOlDxXpy3Hs?yb&$#JDzMw=a*$|Z57da0{$KS#!&tyr0=3VDOSqg2)~(&s2y z8AG&{Y}taiQZ6Hgj!kwj<7kdjEhCe*Qk_{8SIVx6D;4)RHM}ZQUA5S?DXl155?9Js z#g!@<)3df-T2Z}EOsOnQ$Ca}BxKgnsu2imyE7ijp$+EXql^Nx<8&#!MW#z6-S*AQ2 zS1LMVN@=Dyu9V6spS7*B(z2SkQgw;D^|I3H`7xWa%=s~;qH;l8$zBpuD$|Q%N_Ev$ zu2P;!-w;=-md2H885^{6QC^ynFD%$fS?K{WrM#*pu4Fr7N>zDpT&e8OsF0m<RaQm< z9i_T9resSO#g#G{i?d=?R8|dUq{dOQH8G{Ca(+z7mdbY?>{!{Xj0)LGb!Jsu$*ysg z%5-H7BP>>|%5=4S8NyaFne*dH*@C!IxhSq=m&TORjC^UrPPw#fWn8IT6IZhR8Befd zm8E6O%2u*fGE(6v)iSTiR;o*7?8Z{6(wY8T(K|}TW-%p`k+BQgCQ~Wjw{VnfeM~7$ zx5bofx-+hn$+(1_PIcDfy4zB+>C)P`Qne_iWHO86O2wMElFf20Y^Pk7mg{ausT>nm zvb8a#JUzuxvYGO#`j}FYk!$lP<!q*+yfdz3<=Wh~sm#diEJvwW98;>wmd2GTdBoC= zm94CeE7gl#r8HZ)G^SLim&cW|RdJ;v#kIM$t+I4wXH3bY7sr*%invlXm}_b~olI3K zrj(YY<4RQ_rj%uu$CPaON>?ebs#p_ODzjWcTU)1pSRYqP^KqrT5LYVX+T2N}a&276 z_U8)GwyDSrjw|KaxKbh4%XX})%#yfLxiqF^Gt1&isay+N=~R|i$aSu*RF%mWRve{r zcwDK@x=K}LrZ%pWE{G{r8M!{SQm(2hm6?Q&QaL%UR4s@p+3d==Qk_Z#>5S;gHx4~) z+;P(7r%T3FfL!%NR{~rZ>C!XQpxSsEYm$jY2W*|O&hulbjV5rdugJ;<q!Z1=pyTAH zBVjL&IpHT_VV2wcSYqSGq6=ij+IMmN)F{@Iek`#uDgD;jdR=o{zNb6aWVWFxH?~ag z*7;ff^Y2A-g1`{pBMsiEBk#4Z8`aUC3s)xO_+CplAEogF<wa7?+nd6bAew&CU}9TG zUSB#T!I2W!jMDc&g$Dj=5NdxZL*w(tqe)%7h^g*y|8qC_Or3d^R9#~muksI!{Le|~ z`q=RE3PI>N`9=<(o#>YLc!^u)h4{P!UDhUAugAAS^;N%CxOqRD2orM54-em{A4G}X zs2)Ue70IJ{2Y(RGJNfO`1_uen<<9Op|KmS%>ttfOy*`a~iUcs<_N<e)lLw0MI(@sA zD14@47GDDL?eqggeoPV!q6J2MNcy26UQ{cE*ewZSBiofXRIwF4Q54g7YOkxo7h4)I zmM>oDmJ-qZ_gBSJ&{w^QXt@<^DUgEiAlX*Yr;;MI+mpS1n7qnOUM8k%L8UV97UX^7 z?M>D@?fZHqclavzz5;m-TVJoQ4ou|(IPyMCf8EYAFWJnQf;8{^^-Y3z%=)YP5>lUA zFXog23f`gYG5K8bDX;P)vwT%V6zcz|)>%H|b56n#d^SPers#8tJ5JvU=QZ<I;v8Rd zmsbb|D>I!nUeW9X#@6M-JwZfyf}(S7yQ~H~uC28@&nu@prt^YS@ln4~gyXr!>9T(C zxQ5QUBXYBaM_ySwQ2bL*wHErRinZTx1z+6JZO(1yy@~STXkIDK*J>IY+Q=O5HEryc zU}`57lTUWHN*fml_*@s{!LndWk&Q(1^Drr+?Ps`I*2V9jj!71I_a0xm5+5h#DXbYZ zJvq&6usXd}%fesf4da%rw2jv4AySh^cgf)%r6+R?<C?@fYGR8#ixL^CIF|Qfjy*)G z&omr04TU@n%*!RIP+jf3pqdYaNV6p7b+x0%3Gd@8J|eTLco2em9Ja9btLnsJG%sUo zlU)#*g>TRl*T(nc<-<Xy{>qoFERB;udv}|Bk18(8r_&^LP1Kxl>PB)LOWEsDKw<J0 z^O%WbI(Rvz`Iv<_gSyW59qM}8<v3=|yn{Xvh#;*#y0#ONfc?Jo#QVzq<1}bzrDkaa z%7>^;ax#$krnvO%D;^)(#yis6y6Z;wv{N;^q}V%~r`E}5arr<L=Rx_}Muw(BzZX|G zVba0oh~eeUjng^bbbG4Fx%wda)U~cnZ0X52@v3F7uI|u@V|e{@TdvC-XLaPMv4^i) z%&jxY^9h*gtvM#NN}Dj0iRC_H&hXHl_Sw{tp_A;+!cd)i8q;EiK}RBH8^}R=;`30t zZ%0t2ho)tJX{iJ<nd1!Hn9#MlkK%h-2?r&n7u%?6BptpQ)7@fH&d3HG*>c3u`*b9< zupF_psH9ZXZcya0rA3BOmnxROctBrKVjGB}XaG62x@T_5!~(2Bh=uf743>>m5RMwT z>&r1;Z52ngMe@I?=6c#^i0;OCh?R+WP@lQ5jjU|AvXu`x#(ftpbIDgEN9Oj)BB}$9 z>KeNpV>e1H%#WD2TY5i&tNDg~oCSRIK0<=M!TF(&J>jeIvi9Y5m$RI0qC9CCi^RtI zI03oaU5A0?!a6Ma^rjD6%dx&f@lkeLa82Sm7Z0(#iU;-Sj%{T5;m9};T?DzC??cyP zqYu4Q3cC-zY#n;}I`oR9Ze`ltK%ZHTOsouBB5p>#4>!Ag=$hR=bj_}-TW-1meYzQ$ zSZ-RPUoGrzk?XAN!#+dR<#mRt<LeC7z13H!mASrx`^;k8(8_2sC~B?ZJ-_I<j)zc2 zVV}?~oTRL!;>cE(9KFxHgcepNEG_b0a^{R6MD8bo{C&(NJifRYP+M0I_iM~P+@q0h zWz9{f&%8w@R_1Im%AGU%5#`L0qg?5rNT2x%Lz13`LI2EGHA;GGWE}7vGNUlA2Z<od zg+y4NJ~&pE6EQt1wb&3)RBo{VzvOVp|Jt7Gx$F`*%yK;$*r)HVndN*ez%N60b5>{j zpSdFC;707z71zviB_0qJr1pm5``#8KQ-5bTLuOII_Zb>Rmcob+tVNOg4D}=D6T@qM zygmZlDAxF!8^sQAqXgq_u6?LR#)-kVC`K}<?`URxuJ3q$m=iHRhUdgg1UgZtQTjSg z7z}zjag(8aM>fNOeMj}f{D`tYqoF=OMohF!gE1P*FpxNEzF=g*J)*y?u{Ql*)>zL6 zU&7dGJidf=pNH@l#Iug+FS2w?Zk?qR2E<E50{YI7gnW_neLI>Q_6awi?mH~-fP>u~ zFY4QggjwK69|3*^bjO|iDi{+ZQ+H4*vX1F~1h(4Ep%4yQ`Sx+SQ^%jD#>T&`qWJ=Y zj6c}5&J;@ji9t}p>)u9kU-xYrl=V77ZMjK5wo?}l=dUBL>ojw7yiPMW-|I9hbBbr3 zX60Ybtl|sJ`YQ6iw))QtJ|3g5;!oK0u@e|>{pZDR8}wQ5wn3joZX5Jj*tS8R#q1mW zlali-zEqiE`%g+sLQOfDquT!rYNC+(4h>4E@6e!l5}|I+62a@rmSgDVDHh~6Nqz+g zZ-)6zQe38qYO_8^YURC;kihpof|7p6i~^q%vg2>8-(tKCMc=ebhU=|QmIg^Dbhc$u z&_0p5<>%(G&tNN?eTMg$*Mw!@RbNi{)h@X2X!&H4u>%5ck|9YyT${jym}*w_CTC*9 zt{PNvR}HFmsJb48^19qp1J^er8ON+Ut_k=03JaX<D=cueudtwfiiNqEi3P4JOO~0N zF+0FyPi|Bt^5uv@h8!`-i6aJC2t?QSKwX#967G6yl&DYBYTZnWx-^a&88=zC+9G2| z^^GU_x18ic!MzdZ$6L379^(F;I;#}pa!?R)Jy{gCMNk-ymb@KkZTFu9X8O31C@}-q z`i`1(FliUK*+&Ss)R_yy<de4CtXx~{CS^Eh%eh$@&dI8)J8TAb&CTu1I?AA}raYZ( zF6RM}VByB5uQvyhB6@Ux)7;q{uwSOCDrGI1DrStAXDchqED_3!oGL3TQ>pUu%JOun zgw+pdI%`Ys^3yAuyWZT;+d(FlvDk0Imi070c}~t*29#hIy$xH!-W;`ocNKPpLyhrj zp1G*;N)EE$h%I(){1#m1Ca8ASTr;t&ui*Jt?4~?pY*#Spt%i5(*>BGlyA5~Rz?;WQ zf=~TxKUwt_l8+Q`C$`@dEc)eBc%OMKkGxn5>Gj(0D3YK8&u=_)>xSOg`;0A*VX)nF zjr~?4vAc&!b4#&l@?TfDFV7>Wo%Mbbv0Kb<k2l=ydIQp){d|wu$t<||Qt(Q8!`kEr z%5Hj!^q%w6l(~R4B{el+{j%&<VzVk?7tQGtQ%Ub_-^P#Xr<b(*pf5XXPM*Y<8F_z= z*~t?yRJi>{9Wr|4QDY~KJ?x<UcjMo|<0g&T%~i*b9d*RWafeLYEhT&NeSQo1P4bGE zt^eQoW}$o+amt*^@+qUFwob`+_2gv6!3cD3e~%{z>Ul=a+uGaH`|vdRwvEAYt&LqB z-5q?KbNGb4QsX=GtutCrmQTma-7!8|+J!IT+v)tOywU0#R2O-hxYU{L!DE>j>@RtL zLfgsGdP`&N?c{A$A_rHn_{X2D)(qr*Cj$r8Kp)$~^TroREW8^yFom>`rzFM~F_%d` ze7k`+exUaOsy!1@d}!e(^E%~tljTsVw)iy$Wb(Lt&7rV6I1W4vJOb<h$Ag!GwcrEb zk>G3KMDP=E61X{O9|cMtj{&7Dmh-EOmBq7!OBUrz9>=YtEZUh8B}KvZ!o@8L$#*?r zPQJHAY(X5tkHTn}Q`^C3O}o9p=$&Y?PgFmc>3khMOeB#Kl|r&gbStECq`VsEy1F{L zv_PdiCGlX9d`Njp`O%E%LQ)0E+dS|f@H-%7=TVIc^RYb>TnL^8UILy2%Ddjr1?3G7 z7l8MG7lKlLm%~eA<@Y@f0w$?@=YUh4@@tlpk8}{U?CP-z7PsuS@ivr_kY(sW^yWvK zi8fnWvdpp4x+TRXPx6c}>eks@DoTl+u3|nf8|49pfddPOrp$alWL};G%nt)(A{iaA zh8f+O%mM=buF3e~Agr^9kEz(!I<<>08S6f(LET^*b)%UNipp*qgLLFpBB=|q+tNt( zZrjF_7wnj2B;da)ct=cYS?%FBzK9PH^R;*_Iq`S{CTnluRS(>WqL*buwkqp<hcH|Z zk1wplMfQu-hi{<BdmLoBd;@*ital|S$JI3;$Cx~iT&M?m`+Z>+cs+Oucq2$%@O}v1 z1l|PR3f=-f4)P>=VL5mQxCUGb?#{OE2FpR-onQDmcpq2;J`7$8J_<erJ_gEn1D*nZ z3H}UR1^yg-3w#dTfjm7A4gq;;yRZlNUtksZA}DYEe;GUx<aysh4*V5(68IbNLhyIs zwczWZJlXsQ@CEQKkht<}bAi*d_ebyz@K4}hz(0eV7kl1&pnUt{eQ+4~0Vv<_`w$!n zehf|miBpho&V2&PbG)B{XM_I$?*ljBb2_hr{lJabKO2Km3AO<D1P6i#f`h;#!EM0F z;I`m#AYXwgG=aN<CxLv|qi{CJ_fHCP{0#-=IQ<R3_;EUx@|3n=G}xFtPQ&KD2Ag1U zk5g&mq@Fs5npAx`Mq)=p3duSeB&r+@i9>fdqSIzd-IilUmQzbiT|eKfdh!TXSl6ZA z1&icO>N<}y>DPlq=VPpTE~x|uvCjUI$45Lq+*ud`9tf6#HQ>P@`>`+y90fLlhkz%8 zhk~bpW5Dl$hlAe-$AQ;_wczvMk>IN!^`P(<@F;K#d^#HB6D-~_;6C7SU?q4wDEs0B zQ1;nEe(`;F9GdJi@vGI@XF9DmY+EU(a7pg76k+ntu<=Ftyu{PyO6*V9=1L`Lt|X=u z{rIBjEJIyKspl6g;**p$T~PH)^vyOjWxYAbqkY~MAdmcbybrvv7q~T81#Sx-1a1e` zg4=_Vw;ez!18H;OWspXbGWZ(5lagf+)?2X)mSh>!5R@o`6rxoITD3I4VjV1!uH;vG z$K}4bH~xxG`+$Q$o|>0ehj?Y6_*o80eq_JL`x|3uSEL_(5ZIK=PghTSU32HO8DG%f zki)K?R4n(mL25xt@f%;%nQLljXVSIq?BPgf>CVp0$r(wktON9mPFJ0n|CArg_H0Lv z_!e@`X;>x~2h+Oc^jbqu)1Icbg#p1?>;(!$mc0i0N3yA3wZ1GtQa)1NB%yCR6YV=3 zBT{CkfKsnc2loNb1V@2<e@f3|w6$8F&H?2Z<~vc^Upya_x^)3apT@foyb4?ZE&(qB z?*}giC6||hFN2qZZ-G~UvOli`KL@V@`{U!);2`h^p!8=KgYpH-Yr!h;M({-N7H|f5 zD>x6l9lQ`+3N8lk0+)k#gYs6Wd%-ur`#?U{>-`uU2tEMvL16D8a5(q~xF6UHeiM8Q zlzR0zDE`W^8?S%Y6`SXh$cvZjyZ&`{<vO+gjUj%plmvt(({%moQT|)?Zwso497=wN zN2_Rx^;mtBN=BuXO2)GTIe4;5C8vvTkz-k+N+tO&P=3K8d6qi0FGAkee?u8<$@(jx zoEKgP_XghrxsLEwgY&?*!COGS4^bFG+&_VPfPV&$0M~$Z;0NGr@I&wv@FVbS@GszH z;3uH;tv>~C2R{QJ2LA^B9^9axSCD>MKX4;*ME{^L801|ag&J@Za1zKDCkn@dn}KJ8 zTY~3+1Hp^Ht-;0MVDL_m{zc&ta0gJ{db1-aeVv^^`ZeCp;NQSq!A&Wr6u3P&1l$wc z9hC3)3<VDZhk=~KJo+nzR`6@!e2@>B7dT$L5untq{XnUMzvg#9?3zKow<%?RI@r=j z9b`;@Zr#+m`CMa1leq|$x)3aGO-x)SNYhx0ZLDfeMoRIsnntNmBIQ*!Cq285zA^4i zBaB6=>`-tBKl<pNG-%QJV!4?3i{wq}n%x(9j<S&aJ`ZjOz5osb{|nq7d<m56+m}Ic zeI<Al_#03hcnw?#z5)ISd=q>e{5>dry+42-fp3AIf^UQJ?#Oq*Z-RdUj|bla+rc$p zC-?#QUGQU2_QhX7*=P6i+dsC?q|R@OF74d(zV?~i^lr(uPHQpOd+TmH<g%)sl+5{< zVal*ml0vn1o9xNqNLITbC!aJ@A15EPJG9MPfJLx~-?BfX{Lk>kZ*hK>yzpITc|hMA z3+@Jv110tG-~r$S@JMhHC}R{yfzla09{d4#BKRcO0KNk@fdkoAD=6pw>7bNX8z|*^ zE5EW>xyp5r^d;^WyLFVSHpVp=1xx>cctK+<)#krlbbTENQk>F`u8KD0iLX+Ya=rhe zub)ER#Qy>)b^BCM>h>968F(frb^I*wU~oQoG<ZHZ7rYR>8ss}HTBk1uSF-+na5Z=Z zD0TWua6`6z6*vsM2HX?87L;@Cb)b9^`Fc>kP<$iU11<sO&6qy|e+b?N%GY9-f>P#p zg0gR<Zj{INO$JT!wl}{S&c10fkJNsN9=LSNQpA6_L|Tq~-o(@a2UPDm9Xs>Ipv>)K zM|_YnmuI%6PRjBmK8s&ZgVNvrIVk<lXF=(2{}L3R`6i9#tpgs<+g50jCT@A{edR6e zSz{0`ZpD+lN&Hye^hlJtlMdsVGr8o0Q-i)IUV>KRpZM@cP||tZ_qP=uzYdVrSMn_R z>~Q?;mZzV?J&__jSX^(VIT4TKZ87vIh~+oo+Gg0k%C_RZ{vF?B`~LvN2MSNi_7-S- zeD!Z=vR^*ocZVD-W|_oOl^yvG9;Rr@O=xJJ_GQOct**NqsZu-4DT@d6NMuX2S~S_C z<BJZf<<w)U+;Mw~Am>nH819!A<B$FqUl*}cByUrE{o5SQ;{SKS1Hn_l6Ts8Kv%qt} zyTJ3nr$E}o!mmIXFI)}Ec%kI|d!QU!H}i}4L*;lI%uo8|@+J&_p^Ri!sar&;AQbF- zpT>$vx(jv@$*!+KE2g%MFPbV(>B*3Ul%y#&reRIXx7hVT%!5UIl`^ug0dFI3;{Wa7 zC~zq_6}%IaJW)QHcgoDm#@dy+XmUN%&F@Yp?+3T#n6|v0b06;a8nzcK;zK-7%kf$K zdK#2A`{&>>;4`53`Yb5>^C$euy+a2A;UaBwinV|6yU)p!JdPnF+{|y)6IneL!Q$>s zyDujn^U$5tiLKL0%FdjO7~AKv6U;t0J-J}a$r)bKqR`{LfO)Wp?@|_<BS;dm@DANV z3S15D1-=7jK;D~Ms09BE$|m0jo4^miX7FQB()bG~`<{0m>oq0c#xDGxb>5d-cpLm1 zC}nvnzlvD>xEg=tc)T3E%PGrIa%;veOuN}~3p1$mRxwGDq)4}qBGEFT4u^~QAY~%$ zzzx3o4*OsHdKZ+szXsd`Bp-!x@FVaz@MBQQVlB83{1m(v{2ZhXd9*p&Z}lhx>0}py z+kzW_a&BjT6pjQp0_(y4pj<z10?q|D1*L2@1EmaK<rgo*-hSo__3~}IyPY!Br<m+A zoI~_rDG5l}vs!>+m7x^tA|$I*D$-&ktN$g}3uz>&339z4CRzADhRQm(f;#nbc2sB* z)!E5tee9qQkfkhwMe-;6N9yJzUmrnvj9|SKly<uUoB%T3Sjd6&leEuO4bEqsvH8Lc z-~nJS_zmzCkZXp*TJS(n_Dc;|4vqw6tmYuF3p^N<{cs3)H#i!69vlO{4bmUe@d?If z_1g6au#;=e@t};$vyThhL+~bmjQvYK^qO=sDA%ILf?orV1IL1O;0@qZ@HVg!d;)9+ zxz6^cf%0xl`hPmEeiF#_sn-UM1*t=YnIP9dg^NM1feP1w<fU)}*bPd3;=GlpPd`SJ z%0avC-Q(1!i4C*dV{$Mi!IG>`QY~WjNoq!{@<{xk@`UZTRE=N}e`Np5K|j_P&&Pk+ z;KiUEmzRLjXS@uQdceLaw1D3SIk$UPfRdjpLCH7g{X{>JeXG}favgcElkW)(RoaKq zaAF5bGTSu-S=p9>n=DDn5)Ryaz{(Pp%s<(-<Z&xjuk!Uf@O4x8QgCPRF0dM;{^>RI zJ)jiaec+kk{orNbGVmtwC*U&h0q`mCAyDc(V=)EUelJLS<UI<OfKP%uflq-lwznLV zvUnPlGMl*>V;!+`p}a3m&Lx7AqrNJA8_Mjk_HI25F2*2OWGDIygKL|6n+*(B!4m66 zsC<O0I-yi1l!}B>o>0mXN@+sLB$RYq$t3*AWD_=32_@lkCgF1?;d3V8b0*<)CgF1? z;d46Sb2{O3I^lCV;d46Sb2{O3I^lCV;d46Sb2{#GraJC(hFA5ub%Pg-CX~3(nd-RD znd-RD8NS08PdV;$raJC(hVS{sVr3IPXA?eW6Fz4XKJzufc*+T%vk9NG37@kGpZS(y zEaj?%&s7PZs}ep}C4A;fit&^aK364t=EcPESP7r`j$_QGGU0P&!sp6_&y@+ED-%BR zCbRgq5<c^N%D7F!=gNf76$zg!5<XWXe6C3NT#@j(BH=S%;*5D%k?^@9;d4d8=kkQl z<q4n56F!$Gd@fJ;%xhm_9`gOgxRUUh*J{UY5<c@a)0j<J!soJt&wREu9xLH<S;FVC zgwJIOpZO+hJmrMXiE~`0G~sh;!spV2&!q{U`C?^k>wJhat|WXeP54}z@HufF%p}f( znM}gxOv2~Hc`%bW4`veQ!A#;jm`R)mGl}zHCUG9jB+i4G#Cb52I1gqL=fO<kJeWzG z2jwHJv64@m2j$bQ_Nc(vBRCDlglt@>iVKx-p&~An$Az-EP#PC9aUt$0CqLIy&V4Z< z?kQ)!m_^*vY}`{$d$A~SPdVw?Q|!hb(NTAZOe3sgI$SjKZtTRK)_iVk!_-_`EI^I@ zfL-hu8X#j;<9Webb6dykI=#+aN}tsXwCQYv5-xpHNI~bn(MzH1gR&dH@kKHVFF(7r zP3|1=aG=hR3@)FCs70&Jn3T&46N4#ob&b3%OWrJL->+Lmw_K)Iu}A`PRV7yrY=U}b zZaJIvM&|6v9Xvbo37gQ<HvRBm<YcRjByvO7G&4VN3~8k_y^c;9R81r?o9$n1dhW8l zT5NCQGHiTNQ?6Mr_vQM{C~eHv%{$wFj<Av9o_up|;J|wD0gcSP@3t;xZJ1k*!EHw~ zh9wt5{vy{Ja;+reBza%odPnB35k3f%%aCnBDZ-sWxhJqIDA!0sK)L4K4ZIv23O)i3 z1OEyR2N`qmD!?7UN^mc*8f47C+aG)kJP>>pJQ(~0JOtc=>-s~%k>Iz$W5C0~bHVZ8 z_rY3_xq{wAa5*>$WbU4K6v!Mr?`W`yyd47;gU5s0f>Xe~z!N~`cX=m*<G}_n2R4Eo zU=zq(5w8Vgu7}qOGIzsk2W9+VCMXrB8{C+2fVm*|uf3DOso=N4CEz@;bVCNOK$)h0 zDtH-q8u&2CH=zpef%Cyls66L@TY%?*M}ilEdGLGSTyP<H6L=YTAGip73cLdRBX}kF zXYdE$o*Og21pFp=E%+_)M(_lXFHaRZz}vxv;2q#4;9cOu;QgR{mEy<Xhu}}ZwctZw zKkEF$pw#_G!M(x9z^{W(g5BV=;CI01z|+7Nz>C2D0xtt!25$s;^K;=x;BUYmgRg)O zgTDix1y_MDfNy}Wfp3C;0N(;X23LcB1>XVtaXh{YZUVjs4hDITbYW-kLvSDPBQOJg z0@i?Q!9&2$z)2uq+bSFj{sWZn6LZ~Nm;n}p@^#{V;Hluo-~zBecqzCkcmuc@cr&;q zxC|@-9|E@qe+mu)p8>Z6e+do-e*^9az76gKz6b6KehQ|*zk|Djn=_C)6x<5j6C45# z2loK?1}ngQ!2QAfz{9{acm!AmP6o@t6Tm8PD#%;43)8@_gYqTg1Hf6}fuIcB)_`Y% z2ZNV@qrmTjhk{GMG2m?=Umz<y2#y6G1;>Lcz*_Jna3c6Sa1!_?cntU<I2n|$6dez4 zOdB)>+zhM(cLeLf6xayv2R4D_;56`?U<-IK*al7jXMo3mGr<P13v32wft}!Num}7$ zcm_BRJO?a*i@;OCtHCqCTfsBIJHh$j1K>GeFL(j?Ja{4aB6tz_D!34Q1H2Uc6L=Z; z0eA&i#JJCu;6~sz;5Oh7z#YKrz`elh!4cpO!Eb;!f$}ZnAAv`Lw}3~3w}UzG4)7%K zE^sb*H+TwoKX?JS3|t640A33|2>uZ41@8qP1%CoQ0X_{r2|fod2Y(Ab4ZaRO1HKDB z3%(Do06znN0m{JDi{Jq8C2&h{CAdBKD{vR^6>vECTX0`+6<7tn1|9&u362JT4;~J# z29E;&2p$K%3pRm&0$af~;2iLM@H^l~;Q8Rk;6>nCa54BPDBnu{9Q+aZH}DS7+nM$T zECL?}`+>{B4Z&wY-T+^C8QcVX1>6jL2izQ71D1gQ00)BoxB<pD@CsXl+kk^X-WOlk z4cs2w6Wj^RfIEYgU<y1090Gm|912bXhk?g}!@)*yFR%sN2kZj(1!se4@Ki7Zo&}bJ z3&0BSQt<2G4d4Ob&EP@cGVoyVA#gPK40tH`3-EAo6*w0BJ$NMe5jX+-6g&#-za{5Y zaC7ija3_%O`W1$NCxB`2M6d#E07rpS!Nb5DI1y|HCxflvRPZEl8aM--3ATf?z?onH z>;lgOd%$zSS>X3Tz8+Y(1Uwo1KKLE*dhir*33w`aKX@AWAb2MDbMP#11$Zv_Yw$eq zci@HKpTX~eAA%Qy8!#k&3Ai!Hmk0~nf{VZ%!7IV9fmeb1fj<DN!Ns6_qxpJp40r=L z4!j9G2IPwXg(=`I;B@d-uoJuk{4U7%0Sae;_kc3n>0a<+@Ig?%+58ZAANUB^3-*Ff zf=_`jgFgk|0G|f`1pW+s4}1>%416Axp<=!$P#6sU0+hk@7r+XTuPGMf$*&i|3E)d$ zBlt2n1N;p*5Bx1C9oN^v+rc-$55YfxThk|94NBkiPoR7i`8{wRxCT5G{1Chj{206k z{0sOr_zCzDxE6c^{2bhn8;XAe2Y~+ow*-rJVID2m53B??1iub$0oH)qg0&#uNhs8V z+k>ZqJA;>kyMoKW6!;K06nqKX1AGJIYYK&p266m>n}S~hHwX6tw**IkyMug3vTzDm z0iFi(&4t2^;Mc)k@BnZP_)Tyvcp&&b%}*D<ugC7;PD7*X=H>X!bMBiQCQnl9Yhd+F zkMg2qdAJO_aG?(rEdFF$3AS!IM)$F614B@@IfwdA*UlT|>+-CN_#w}_h#RZHeL#8E zMeY&44Nd^x0mavMLCMpd{Nndi??4;O?`D48PM+lP?J>c7SHIj-gH~?jYH18<_VD9w zY116NUXz>+#P#t-ZQWD3$TfHUhp5spn@havfsz4P4rdmhDH6Rds!`GW6Q89_=$3PD z%Ph@w5hNd!SK$z_6`T#81WMkfgHi@h@QathE?kdDT$!7jPn5yYb{W)Q7A(m<D%p#b zfm|O(WgwTK^(Y)Tl)>C_4W?LHST)6x_lu<y#V?i?Etc^JvINEQ0erqH=AYz2%7jya zH_zASl4r@+$>4BM<^UZBeg~Wha=)-}4p`vtBk(lvQ}8TM<~*Ja&I8W}xeuvxfw&jv zEnxi*;6<R6*+NjtmgjF0b0J@*Z#9Onhrn~3vbEkkDz%FTy~3p=WZoeIO9puR50p#D z@!Z3+$3<k~gd^x9g;K<8u(oc#$_%TuNM@GUH2Ho4`+ML(nYd>5jcWd@+vSOe{)FUl zf_f@%PibyzV8B39P9s`-SY}_;BF$%q8e7IMWOG?WlYp58U=K?i(T_uya26RBxPg*1 z^<hq(nH4YUl2GMq6^s|;oRJ0D3*0f6MIJRAMCOLT8QEx>rB53AvvzkN@FVQpz}c-$ zOpKCwx0234jo6lB*6vhhDoNWVh4W$<l<(*aL*hd$w-T9Y?XpOup*Ui)J+(E@`*(Oz zL33Uo(UfN!oDfnC$3N`S>1DgWmm^y|qri!0J&0yorm-AH)4?L!9))F;mxKJQNLgkH zaZ6bCaZ_lID}lL8e>{VLAtV}>=49PZ2ZX6adxX6gH$FDZmEI3G{&|yV&1C&We_ak^ zS>H(7b(Y|;*0xUOI|PdyKXP2l{Ik!gm9m_?34Isv+u*Sv?+(zpA7_D5vCaYII6fDY zF`f&+a_~Zsc^uwCP-@R5AoD0Zu8#||z{|k`xCoRv?~B1j;I-hjAlJ`2CUg_{4(qpq z%zg5112?A}?f`i$g2%Tg3wwiifn&kDL3zI69&jFbA9x;kKPYoWxDGEo3;qOr1$+SH z+~sjyuFo+%3~ou@dqEi^dJNnVd>q^jd<x8hT)*qHo6Et`tp6OG13nM(Jdd{mybt^Z z*bBY@z5xCg_$K&kP%86l;2`k#;BMd_z%=+4SPC)@P^bal0p(!+Ggtr_7bx5XegyJ- zfcG)TynOEya5Jj(T5tsTIanc8d;sSva075ESPV`BHvySb?QIG&=h@o~WUjNfH7JM1 zw&17W_Mn_3b_5RscLL>r*afTucLisHdxGBw_X3xIdxO6Q)8J-Qz)EmeunH^%tHFsN z;}nHFcmVhv@IdfJ@L=#>@DT6?a5VTbcsRI0f38u$O~7&B7T}R!6*vi;3?2oZ05aZD zXakQ0PXUhu7l4d^6m9`e1n&du!JmSRhZKGbHi9y?)C7J4GCoq+b`!=Lz)G+kl(C}@ za4MJw^C06U1?s*x8@wHy3qA?X1N$+?@m+9tka3m5Fz|Gcvhx^UDUe6+Y;X*C4#+mW zbHP^d0&qUK07UZ^f;WSggAaq(fUkjz!6J_5>%eK?kHDGW?cf~n4)6x>Zcx6TdJib) z)gN<=#pfeGOugEhuzNxITAaV|z6X6aUQb(mai&50p@kqAq`ZQKeyDvu4Nsq(-{U8_ zMM%z*zH*Wqg=pIJ?v_^Cd6}eKj<y>==EXPg9z#w5?Rr8?g|^8P;_c*5#*A6yq%;OJ zN$`>eUSHPOpsC2&pot*Uk~i_$8%<bFzmxRzn`_VWEWbD=oi3x9L3z<y&{F((m|s51 zq21AX)=hG}!O%Iu%6WbWO#+K-w+#%o+uZE5@X`RwasuJfqF0icVBPA!%K1E4WZz9D zzoiIQ`T9tzo$OCCug^J-1-n^40z4C>|EJ^lWLKY6J`!AvJ^{Q5<oS!jL*OysFF^Wv zg?GUdz(H)|M6d>|0}lloK<3zaQ^DzA4wSZj8YsPjR`3<@B=9fb3{aj|>;Ox_ncy6d z{*#XP)7LI6WnKE3Pk_?b<oZPWn$q{;{8f<tmh?F{1WyO0fXQ2-44e;+0?!3yUf_8k z&tGewb0YXX)~A3A!I|Kt;I~2UZ4@p8si1{xz$?HPLFSefehK~nl(zgj@KBHrOCb;5 z2F?QS0Ivb>0<Qz_2IZLhj9>hDsd~b>^z`Jp{h7&QZW<R%Qd{$_9qoG9)nFSe{R84T zkN1>lg_IXuNLNzoEd@#)on}5GBo((FVK-W9x+CFJRl`M7Ln>}Y<EB_OJyZXU8Nm&= zl*aAUK1>!Pf4$Be8dAIWK@C$YrFQ%8cA3n64;IP$|Hs^!!1+}D|NoK@6^c@+KK6+g zYoTN;*|LnHRBC3-3^SO;EDUW|h<1u1stJ{}P*EzCEoo7RRux}F+N6|9^?$z3x%bY! zpBevezu)8We?0!@;d;(J_kQkj&ilO2`<(MW=SpUE=RRKiE2Ndu<5eiXy;blWxCVBC zZ$ixrdJE>k^>8|T2mTG;g_XJ126z&DA5MfHz^QOEl-=<mTm`qn3OvI{@EG_B)ZE!m z;Z^W+m<I9vbF<+NcoW<S7sIdNf8aNe^&p&m@E7<!JO)|W4<(Zapk(bJ)cnUo@NtMu z<t~JW;TP~9Sd(<Ah~MC8@F>WfOQ!}r3*u|&UJOrwS3t_4S@WR|l#ESei`VNtiL1ue zg)P6VjA;gs5i%oSEjY;!RsBB#0ZSw%uB{RyDx$`Nyw=Hn&@(8nkA~9c3XBm_En;iH z)8HAfHDoTF$?F)@J2fVs;^&2o=33HinXsVjJDIvFZH%2s;BuZHqObJ7uBucm4dj{) z*y5`ty<VY-x7CtLp<X}YtsQQ34CA0|V}iOkGNFe5n3GdvTYeIB8)FNYT1=`JZq-i+ zswYDA!gdpB|5G|C-A`e6ix=O4bXD5npKAPmyTEkzyTNG?e_B&7pwrFxuKcq%5#Jl` zf|o+o1AU?LCkY<Q^UFW`3V1oZ1`dLgA#uj`m!I~->|YIEf!D&1;B|06Ooe|z+7WJJ zo;d@ygVZVR04P80L9h_&z8l%%Wu0en8WYd6I)z7&i+{0jLb-yG!gb?>UwIV~{{M-+ zqAXP2EBIN6o={&%5cEFEzZ%3$@?!7e{q>GBU|%SIZHWkVt?8e75KduV{@U_s#vX7V zhNQjmWqt&%XMZ027|w^%o%9;G4)=Q;wuXz~1(3S?U!`}^5z;$YC?JWO_@S!*htVzn zU#Is5-e2jx1uDIfS(Dx$Lu?f1Q>gU*3@W`phf41+;5zsvRC@1#O7H(brT0##^xh4X z-rqo__s>xBox<Po@_kGttM?o@_6X^nnVwy2ba_~ij-1|R3RSroP{KpR3H(B$A_A{& z5@|wfW5`PfFO=N;bi00;^k4(F{uOMjoy09OqL^6Uj4)j%!I{>`57wJ;gA=Xt^XD;o zH?&QGHk_n;`HRw&t8-P}uHz(yaCuW1^Mle?<*g|Z=tC3e3N!lhBzO@q^oyGL5of|N z?8hMepH2g~2sVV+fDSs$T?1K*%KZ$|e_`f5o(&VY_Bn7SYy&BiPFwgiyZ|C=P6vo= zIP?-3JGmp|8MG#h%Ws`-Fc0>CMUWLPjDO6f@D=v^!cSm-_!CTmtVQLZOHJR$Ww0SO z$K|jw#OKD?$=E&ab?jda^C0~!?k(_I$l4=L3S_Mj2fN7q7^cH-AZu#5tbgGQgOcA_ zZ1M72K%DCQY_{UE@~e+}CI|A{f|L9Zm0y{di5!ZP&KOY<>69EK5E-d^RaHvQ_GI&e zo=f>oz3V8C6-M$Nde%`;_DME83zFt$4heOutM|x<df$C)iE-mQdx$%cZ3o-9vhOSV zK0U*H{MTO{M;+HO&h|su7gw@`UR-I>jwo9o^71mWjq#osM0tk4YzyMN^Rlz7yPGa= zf0><STd<S>KZdacrC?2BY+23EDBy$5jx{#o>ngo#d|h=jX`}adp<aIiR2oi%t>CS& z6PyZ@ApTxPr``c4uzx392=9U~z-e$RoDQW+?}OOp&P=E@z8@+t9%PFjlR1w#J&W%D zunZy_yt%}Dg2sOA=HF$&L=weY#82w0Gy|jp`BtYipwcdpn^+G)FS0c4l#hPUvu&@A zy$>6Ck!z~kv|9`H%x^-y+ab32ccacX?}km_JQ8`g9*9`v-4gk^AIb`sG9m8W1{39J z+vvNca3Jz-zCWcsJIf?MjFYUidW}daa1}A{l4+)UMQJhm1SP5YQiX|2ATF%b{c`&W z@qW;IE8Xf6@tzmC$4j@pP;JP4Q1$nZP!+{b@KT76j#&rlAk1L@H#i#p3Gar7;REm= zNSmKdQ}i>a2)Dzd;kU3V{1aA#r|>-0VLNy%>;P*(wR>wqY*^<+=)&6YUU(8zzMTw} zzswabqc<O;R7ytX!jee-Y92f*M0+2xGWGrvPV_@Ghs&+zS8{G#maiwO+$`V7fk>81 z_@@SuIa-ucUlLBIfnrzJv}fm-{mkI9S!TaD_+grn6-hxvR{Wl~uxQA{p2mqWw*D0| zHLWr|iykzc+l{!e$oQQd2apdY)Mk%K%{Mp7<Ge_n5N?mX#=)bg3kb4qX2E78IS#^n z|293jpl}>RXBs1$!4Xf?%Pz+mzTy;4eA8Z0$x^~@g1KTUsx;!OyOO;3gYsOm-Ij=@ zUVH~+L~?K;R3W+u>ZKFmVAu_&!|ret>;<ofm%^E_50q}~51)cb@MU-zd>amg4)?ke z9uKdEr@|rdN_Z_C0#l%5ITenFL*Z*M9d3lfAoi{^9AeixSy1CUBcalk`H*IuHy^fV zzYxmjw+P+~$HK=T{%!7ya6Eh+-T+s^8=+EkBHRHd!FnjqTVV@06?TEQ!QSu=s6N1H zFda^ZIq*KX2+n|u;r)<x(VPe11~?lYgb%{g$&WcuYi~XTli@r#5zdEG-~y;JeD=|0 z$E{DVW7k=&1m{M|u&1Lb#@24<h5QgIzuvetRVA_*9k&kp*-MlrHFbhnUsg5HLZW`Q z@}F8@o#AWMQhU9KdsxT%)Zz@yHf3m(=!Q00vTj7(+U%!uR7%Y|$|?<BEoTqcWio2p zrv5_@qnsrV%gPu<C8**mYuEnJe8=0^_9_S}TJ|ZdKA0Qqk1+Z{YRJ<z<~lvOPK-F7 zI)jpER&((y*@)h#$K#CGnI`CQ%#A~jw45V(SbMq@@1mk@29;H&8?cdpdI?t9&9|cv zdx`AC8+r#aS$)hrQ>EaUiV8B43i|0n8Y8btd}#{%>-82G50#Bv%Tp-@Mw29RawuiZ zSLjSC>Fs)QcEqYxlBN@BpR;sOMA~X0@t(>p%_H+>b%T2tJ!tby3UU%ZiC3B>#KkMk zB;q1UQ(3r@NMDz!E~v>}JTDV{vfa8l$n;#oiQa=1q#0q01rKC1M;;OOslvMRFyi}_ z%yJwpxr{2(E+!kyk2K{$<MD+=+jq#y;e&ISvhi*OUAVvmne#G~Xn*npn|`^&hOsDF zne*{@GArYAzAS8)^FvMpy5}sStO&8nv=Ja(czF<;S70Lb@@s>;X;diw(W-K*3KUxJ z(JHZP-zB{$J9}I!Q?tn*!-^9(<Ms4R>!Z)4yYC_@^xKx^w^GP9(vDNb-+w*VZh-Mc zP?pvWZk1ymRqf^?E}`HLNi{sq?)R%>hp29k+wW{&#~I)qzb$V6i_pGr*R4lq`a!x< zb>E9btnlLhsfvHJPGGFNH>d#Bp05b=A#(vtJN#%kmHjGk20R{af;Hf$unYVF_JECe zuU@bXycDW#>kIFMNl^9f0I2cOf$$wT82$p8GvNLXQ(!gHjB#PN8BBv(Z*v%=-Qr}y zWpE@^9hD1v!93Ux=EG}Y0nCStE4zho47?3ahBM)<Q0rMth3lbwF?PZ`q5M1Ufvn%? zOoz?jeJ~F`2<O8&Q1esf!j<q*xCzdO+u;-N0DKD8B+cc6p?NHeA#2<j--{f$lzrA& zGd>rZ&my0TPoaD+K8NzTVErp+1w5OQD_@KL@C}#-<#Uk%*TR{Q@pAV;_!fK?%GW|A zegoVG<y%p^iuJ8H1<JRgIotv}!mY4B{0OGPkD+`FK83TPd@$BP=3Kbn!)>s3Rr=@P z+3+ja3GRToa2K2mcf&bwFMJ$+50^msW_$vFhA$k$YVeR}cm9Fg!}wrqhw{OwipHr7 zhd};zQ(-kIO(Y)-#`T>Va4xI`HMY-O4|ff$1DjC><ddO!52wN_pnNmt!ZY9xFb02y z4Ipg~2Y&-I&j5b|H-Y^o5c|vcY}^c+v5!4ud^R3~=diyNwuI|pYq$lrf!m>cH{}0+ zA*@I_?+DL=iLejs3<tw*P=5OOHMrAYFZcrN4c~zB-H?BMe|SX=$`Kq7<*V^9l#j-0 zcpdx#rocUrG;_a$X;5l11J;3=Fb3t5F#s08YoL5HGNF7jX2a{@d?=rcXQ6yDRzUK= z_)E(dLw?fo#b{UyTM^1HT0R(q;5~3SlrP2@C|``*;eAm4&@<oxI1?U&8hsGTANmm} zwYmTff{($g;p1=$TnHb7^4WL`J`MN4#qcOPDxQOFpnNy3g!0|Uhs$6gd<jm4%i+`T z75D{Q0r$f<V1?S0H&_?0f@i_iup>mq+<tH^917or1#lgl0^fqO;Ci?Sz5`!}@50US zJ@_$vAMS&j;ZN{Gkz()%TYUeY+Uq=;#x9&k%h<pez~OdmA}9KR^5zH6*Exy(kf|%< zLoFa%NyhcUq;SA9ByHD>>bZ8o+5azkD$JO##*>4fcaQI@SWA0B>G391U&T7u7`_YJ zzzy(H$ow4BSFs6Zu>T<(4L^qJtM~+}ui|s4zKU(|Y4|1F4tKzB;V!7Yim##iD)zv3 za4+ltzlDP#^L|YG?nfxoXFpV5#Q~_i`xz>a@8j=ypLY7Yon{<69nOp7vHB`xAgA*Q zVEg?F)7~lJWIsgnx!nGWC7c_|c(uf3&D)Ik4Q<c!RyI+LgOS#O%=47s7ZMf!R|Upi z>dCQikAsY4Wkw;JKf<6mNnpH@ED?+t$zfY|B?mXN5oEt*!jMfV^F5EKvYicnCyQ@w z(g9&xEVATep4B586l9K>4#orQ95PY%Kjn#JuO7SKdGW^|NBzRz%-wP?fVH7yjX7M# zr~5RhSFQ)g!876QFa~GA25=E<3}1px;Tw=SU+!Ai9O`YE`{nM0ts(7Jr!8y(+re{S zd)NvxC(Nva-Vx@rp9m#$U7=*I2V4nz!XIESxF7b0m3hB@P<B{<DB0Y^)-|p_US)@> zL_SN-{D^F-4c;wdSStP7<;iFZe&C0HA)|?$8z-ZZsv^vpG9Pa#S4JgY3H%}~bGGYP zz9dcxn;-N}%3GNp1HH&h(m?M?eeCKrN5J|p8|qbZVGo!Gd%*&D4IBfNHe;dEa1L9% z&(f8|Rbv~#wxBc(@e@qTrC8?|r7=UlzzXQUo8%Ensd5uTkxGn6!3yL&kt2T4vnef( zhHbpan|T*KuM2C#39vDo1oaM+q26^jwsgFoN#|O2ytN&CJo2u_Cz39Laml`)NglH3 zhp32z*RSYq`fAEmY*MsVQ3ahhQ;CYS{pHQLm%G?Dc0p!penz^t9D-DeRFX~2{9IP9 zRl-RP*t5O!q-Uh28nF4!E4H6QdPe;gUR60pgHxjlQwvQ0fh5uD*utW`Q5jvew1R0b zy1@b4i!&+MA7Pv?r?PLaXnyFAj_7f3;E;Wc%#8dD)1Q(aM3r`I=%tH;c-vqfnA<J2 zFx7OmNEz81WMwC3<fQv|P#G%WSXh_qQd@|#Z&F~Ag!A<->HwP-zLZH6|6)qD{T#JP zDW|+qUV4^SJt*OwASJz2RAf&s5fNiucWLlI;pYk09GdTb2g-w>OsdVLLwV6FM<0Pw zwWjWu&;cdU<@%V5p0Tc;hYR5KmzOtcT*NtbE62W2A<-$dOnsvK*1Et-n((8@RiP(E zjG#Nlf~)3^BISLVF+B(I9Sv2`&M(oDAm}b?d>`p9qc}zdq+m*aaB7})W7MtB{x7%o zYsc-Jr{E9z^QUxZF>PHxsGLi0+)2bJFP=7w8TVfU)z|(el&;(e2f<A+6>f&va0`^| z)5bCDWPA#xKR<&{z%Sqn@JpzAatGW4cS1eSZg?t>`ZdHS%h>~a!@ZETFdgP1yQ%Pd zcpLlyJ_mn<>YreaviVlT&u}06zd(&8{R-vNcnH>qzeCvrhatWM&fl;%{0HJI;8Z-` z`Z^v3C$N7sd=gfH&%vrtee%`em+*L~Z#mS2CGZ5e6f!s3^i!M!wQj~KP;(*b!G`d3 zm;ht29c1pb+Y2^=!(kJ+9wxwVU~^an#eNRVge_oA%0yduIb@EtI~cZuDl47fE3h-% z1iQe!up2xCyTgPk*cGrZ><KS}z2HcADZCH%gG*q4s5uHr@D+GDd>ameKf%FJa}$`$ z?VbpS!0RA$y4`%30q4PCP;(E4L(Mf{uD4r{%6lXn1V_VUSODo8ath&C$Q*F9?!-9w zEBn{O%9Pm~VN>YB3m|jEUE1u<BzOs&44EI{+zM$!JGVjFl+NAoZFmo)4d+aU(g8Ez zUN{TZq)g0#D)1#R6+Q~p|F8gReT2v1NJ{n7@Oroyy6|~;JA45?50^oe{#W2?_&VGN zS3(u_br9Roc?+svVLimAbKZg2GtRqk0el~>g&U#f#eW2+z)#_wa2vcIegV0Mvje^j z{{z2=J7F!1Bj&ujjo==r`R03}=9}+>&%^KF*O1@1?P^lK;3e>9m;{+C?-s&?a2EU( zs$bzZxE&sXmC!4PVSR|<={APd;ZN*7jts~9i*&)pXu+}ea8aqffsX=h<8jHIrMSIW z!QE`tEDLKTrQ8n)lpkm)M=TH4%8ssLCfBd%>RO7i&fn@ZPNupD<{+xe`x7G7#nHb) zZc*W=EGA28EJFHKz9s!D6y@Y=CIrL3s@76?5L+3ACqt?iKRq~-<1gl<=sSsSz{Xlg ze#NEwy3~S+*gI<Y#kjSt`fbf=Yue;ubALCuoV~v_a#Wqj$cflQs#GU&dZ_L!HE?DG z2dsf3d&8b+4V)78%Q0~DMyikPq2S46_w?i!Axlq*DElUcR??7mfwj9#Ri8(^O<Zek zB$M){^*D_KHnEKDq}NI!s*JTbH8`(~;k1N9M>3q2b1dF)+C`jw@iK<f!tkZa7*0-* z-eJQ@iJr;tqOX@f+!zOKIAD!~Qa9?s#6^rJC9yGUOu~6dJkDhPTF$l48n&q<GYLVS zL}Vsv5S@TxI-x4pum)EfeiM?7QiH2S^gzVmYNs1<f$|J4Ris_H2SKLLMVxvhQ%H3; z<H`zWaB8>Usxr7juaG>>7-T(z<Kbi0JnU2Mv2o_QiNUe>>)P*&#v5~8D`85YP6>L0 zBz}IRH`vBG)6t{^jfM^6)cX8wC-KK$S0>7?n&xD^u0~{RBE~<KechDcc-hxYFZY;z z-NC`J`0JLwt{%-cx)1O?;qfWyY1xb6@u{EC>n%8swM5)R_zN5W4??x6e}y^lH#h<Q z4sVBl!295za4xJ|)B3!z28p|r{i<*!<WuGD7I+-|3f6$%LX^Duj>d_Q`65nj$b1op zK60126%K2dm~Y^m0%cd83YBX0;O+1X_yRl=;;Zb?r*6Kl+5k2pGnznrN1X&HAC0r& z@9<psH*5hlSGG008McL!-~~`~WG{k45Ej-*aZ_O;EP|ckZLk}B4)%bb!rqW?OgWdr zKVd&uo4S%Z*G+(z!LD#1)Hu`?a1Fc)ehC=^aL-2}TnG2SG<X&ESq8ig4u?}=7L;8# z0)7Tro5kG*v!RMUb-UXcj)8;VSeOOJ!Ex|<_$0gmz6)=J8{tjx8|cDX*lD!K-E-k2 z*cwiTZQ&H?!n@!Mcn@Su%$Ww6AM8wr%*&O=bKAk0a5S6)8Pjkcf{Z;l55w8;QOFp9 zGaqU_t;b+J_yp_*7r}w>DX4KI#zM?GS&O080(>5>f-l13(KoNc^B^{j+XlW4rLtDR ze(+5=2Cj$FPw&9j;Jff6xB>nN--q-WI-6iOxEacx+Y0HEaahB~eFjCc18SWj3ctG= z?t$;Yy-@2C?SoP{tZm~~LYo|f=fdCM#qbck4*m{P;Ga-h=P&p)q}Fs_ffb<E2RaIF zfUIumQWl)bki2)Qz<gL8-VOPJxmkbb1SrK+8*)vj4m=67=VW*>WNjTc6P^a|g!SMO zcqUvAu>swKsIulz>)V_QwZ2VDsC8{x!HeMeum`*Vj)e3*x%a^K@CA4wd=GYnjcQY_ zpvH9);Q)9EOoKh(^{^+r5B7pj!QOBU>;t#Le(-z96g^iTj!uI0-~iYf4uq-j3OEm5 z33tP*V5^hx5rY%pHSkuL0_Vb^a1~60U&D0R{A9`>><qJD790Vm!IAJ&m<RuYqhbBJ zltXwnEP_dpF*vsnj)k*eF<b%1!*%dRxC`C{E25`whA}t+HiEanpAd)HZ1LaRIgdD! z);WvqUe5IbeVdv7IvA<xBZ`<P{6BURmVwre>lLvDvoRH!NQ9l<m5S?1kyZ>PD{LP{ z3+M+uo9Y}?YTzUMOC>vgbP(#9{crRAw|BcQ@@`}PzkIj9ym$NCd$)g}@~wnAD*pR; znvaVr(RVMM2O{rg`nr;h=cj2Zagra<(SGp86gRSOyHA52*d(H?sqXnNtD7*7NM#W| zrScNPVo&o-c9}w%9BI~6M@#354<;^bPU|X#aaTzXuA-yGaYsiD&kNlng`@T!R%XII zbbCplO&lj^oYRGNDIohfnW^mS)>?6v-d)5ky2dT@`t%KU1zBs;;K?Lu{|daSBR{}d z#MrlIhGIT*<eB)(9Ma*b{_-n!enpJy_(Az2*{x56IxiIt9<45UWEN^}z#-Ti{s~*b z!>~R43noGy(~N;ufLF20>cQ?vSP4F-!%(kX74Cz_!iL<7cQ^CYPlUaAuQTCr$P8$= z5H^I&M{pWJ<`+1P;UlmK)LJ4<;mhzWsB}38Zic;KMG9j-SRdl!;wHi*I2O_;W%|Je z!S~p|3Vsc*hLY3k;7>fK=H7IV8>i|@J+AWJ0p1mnXUUtH-pV@6*~#o>nc3lZD(2FI zE)kay`yndg<&HXR=iE4%-%C^jHk$d?IZh4K{Y228Po(aAxw)NsVI}SM<ot}`%u`SH zek0M73|oC?Th8k5xBDYZw{8peBZW&%!coCV>ILvR=hY7&p|!vE?qoZseZ?AS`KlaB z(8Fa;C#Dl8A;gVSzUp?thk-=c5@Fk#{z!nGBd@3EZ_=T2etzmW^Wcg6;@+CNOm;?g zE^9>S!Sjf;*EYV1_UUxM<v@&0eJMG^lgFCbA>k5xIbwPUF(BxC6|lZ0sdb^Q)@31l z{;QmD2O>mJcftZgT|X})b);#Il>||?*Fz<FVGze4i7EE+MPJ>pt1+PoN`tk~CU{;( zJ`?*)_8Pxbbp|crXb<z0NTC|O=Gm7AzcB)86G2*I1qW>E=>4rK^D<Y5R|dcH?!y9a z-r>?_nCZ8df43i0PNY}Th-l=+|IGYJm7QPUMera@g1<uf3*vun{RQDo>@zCiE`!Yf zcVB_kq2ByB_%o~l)sIsX)`6N2sD?Ci@yz$fXrCLOiPNA<d_DLO#Q(v3%USaRnG<T} z1#X9p+5a0hg$>ao36RY>3(9{`^8?l1ItLDd_!1gF!j@3J@vY$#ur2%mYQErausy6z z8ff02zRj$8gZeI3C)fsdhFXK5D;x*A!JA+Y_$urPS3-28`vKHELJ1|$V%8=a053s6 zG+!_k@@%ezQ1b(KL(LD|2a{n{geV0zg{iPR918iCu9-Keb+I$qzYAu;d*KLJ0yW=G zLYM>9o*M&e(2g4mYs2v{AKn1R!kge?sJUiq;Vp10oCIsoo|^*ChErinsJUgAK+P!| z2hsWN{ct**182g|;r(zsd;lJRvtZ?_W?dQg6gY?dF7P3k10RM3ums)*=fU^k0{AUt zK7+d-l6PjUp(kN=+IfrM$?z%I6g~q-!)GBrpw41A55553flJ{YxD0*+m%~3Gb(D(_ zqO$@vq+C!}nQ?(Ppz4_`k&#|;^~?|CR~wEg|L!ioo-sy3GA`2Ar6!p**cgMet5LfA z)DOIwAO3Hv0L4``Qgsd3f~rP}s)UHY>l*EfO`*zXAu;ilkK(0+?9WR_i&ZHNA>L}P ztel*T{4QCAwmVn-e<{&prZ2B=YQacjETsn*v^7>{aPkP#tvHDN7#n^-S{taltwdC_ zv>-N81u0TBi#<J5-E<=|T;2E;SfoPH+YRPK`xfSAW+XRU4Lpw)IhhhlP_?0JhF;os zQc6>o)~IA&psDkM)9F&q$hW75FW-_AI@-&tmMLa8#%6oxgZd-z!;o(CgXBtjxjhkE zy!iFVVH@_}hCSgs@Cx_|d>noTpMu-qQurnO7=8t}!R>Gd+yTFZJ7IOMy$eb|?}jJ9 zy|6R<23`mE!8G_i91VYjC2&8~oTZ=OYIqQS2!Dk;AUf5oNAU-&L)keDJHo%=)$kvf z46y-S%DQtDlwM{nBA0tQl_B?XSozUaE>(kPLe`ygm8|G$_exj?N-uMcnUho(YTh;L z(HT4P40t#D{MLO8Vr!Z?OVoEpZ#RMO5}yDM!{+c5(*JCD20Rb8g)O1<H)|uA?-jI# z`o1B3ckU9{9zG8*f^S2f(X2U#P3vxEzcZ8`k<A?M^Y<hAu?NRKg44?Ak>OGvGFNSb zLq=*I3G9cE=J4h?Wpeb0bDUfbhO~$Z%2Zv=m?EXNsY=8&;%$itiMX+_f&)fBSlO4! zlNcO`H+fV_+XP3m?OZCErTe*e{U&-~t*V)tUvPP0YT8JnElRuf^D_#I@^h{*?RynT z>6NJQWL#2%>mR{BmTsG-`!zM?Q0+IID(wwr@~ZPcM%~9e+Hr+U>e8(~;e0#F<2|3T zVA~NJQCAvEkxH;#5hka&v@s?JDw@rAepFH<vL8`cVa@R%B62?>L(sWNJQW>ZK?)h8 zRUPo9My^S&fx+ur8_;HpZ~h(N3W;3U50W|Qm`jLg<Hdi0j7kpiH!y9*ub`58I~)Ud zK-qk|;1swA-UnH?z^vJ^AFgEoC-@d*?w`>)zrwxj{|Wzulry&?Py07K13L6goC_<! zw(uw@Q92r`JzW`I3#-7Puo|2TX$PA1sE&o|dp{2DgtV94KVcnMm3KP{YF<uV*a0%n z!^J*x>cN{Ja}(X;DEpLmGyjn_queR%$Kai?A(V~R2%bR3G=|a%O<+1~29;rF!$;vc z@Ktyo{0z2+jj+WofS1Ge@M?GwoCsNy%Gh$9q59;zK&>;`4Za7_J1*awcX~qF+s>u% zT-XP;hJ9f>m;|-X<N&xFUI9-apRa)@!)sv+$lOb}EzE;g!UC8D3*lX`2+oCLpnNs( z^>J6haZox;c7A-D`+m~92JuoFPnXeQW|=Ib#L8=Px8Qev2&pr#TPcx4aT=?q&W_Vq z(f|oWdv&-eIx+Sm#jJEZ%H@zB^z14N>Q7NgRaizpr{3p97=y1sJ?9EI2)+(y!Z+Yn zxDtK_S3`&Ey$Nf=w_qzsAGYxce+Md!-h)cZXW1@^vn%t7)4gSRJX3yJmSb0%?u-9X zQp%oFQd(=#S6aQ&i~C|YO7+Azc!cyz<d7fqyh=YrH1HeU%=_sbK7=v&5$p~>hI+40 zpx%EMTfE=s55(!U_p&_|d4JV~>cg??9H=U+$vJ+g>i>bNtHr>BeSwhdsPZy0LgBEJ zcSDO!DCrK@(g82h%-RhiOK0bYev`;yZ+fulPBN)RT(n<CQYZbpTt~d1cT}3yhEIEO zGf5M@?)|U<oDKC<bD(ORxv&pp-i*=D55tk{KLQJ23A`OX3h#yU;FEAZd<s4eUw}`* z*Wp6A4n7Gt!$nXs{1p5e@|^;sw--a@)jqcPzT>CSi!_&<$KkV)yfS6JG@}wZ$q!{S zDv3j(jPivq(!HfBTFDXLE2SKbNNKn-P3O6~*!!xER+om=5SqDQrfwV4A&Aa${2J4a zAtX>%{h)VMo+)qYdGWhR8@>P6P<gorHimoQ`S4q)`~L(7K)(54)@b<!KE(b(xCZ_T zzk!F~@9+<JEcZYn-DdDFm=FJk55o#4pyOdBxEWS~hhQ~WsUrQi@Kjg>s(!BpWp~$x z!{AAfJ^<$wNL$@G4bt{?&VaNvoEZEMYzS-e-i_e-uql+iodBo8v!L?6Ih2fy;~C=D zSJ7M<iN=X=WJE^t@^i5i3t7M$V@btXa^Q!klt?5}IK)6IMKn7%y@-V*{4P|DK+=Eb zU(HM%mbm2cgJaDx+tKe24aA67mplVT$xO7?tY8}Dx`l*kUK1Tn&(GqUd&Y#*>0uKt zEMT{BtQ#94#_wA|D`0$OFC(Aj+xS133l(S;((n&soY|L+;ESMrjk0r`>u^r4Ig@(9 zT94jjh%uhH`mPqHk1woel=gb3u%7A6@Vc_03#<>j!sf6y)T<;xJ=taON;n8+L)x3> zn|4>jaqM3UC&3grAEv>@FdaSzv*2rR1eDKi4txuah8rMBYQBAkZRtuj#zM)^N&Foz zL#ikB4hz{vl`lh74n~F&ImHiUWr&w6D?@{cJdzBhaE#FsUta#bl>E=c;WTd3gN>kG z9O-+T$4F_MPRcW9+5eO-%3suy(%l4Xbfb%IhV_VX`G-h5x4>3#GSsc6zya`fs6L-N z;ZS%FWHaBBP<r3XzVhWewl;CL%6Q`HvZ;7vNAg8=^~j9;9KX9uCBqNVY*9^}$e~aL zpqjcTQMM?Vk0F$PCqh|h59FIKTG}IOttlUC)ly#hch<F)J{2iLv@wU_k6&)(qKRM` zoTs4id%w<3F){W(y{oQu4BJ2(W!A#g`)?tQ8o;fvHT(o#3_pdGE3+0Z<;kptn-9Mv zUTKCel1bata%5ifwAyfv*0IYeleXTlv;ETjN>1}b*~Hz*p-|#VGxB_18rmTa#cdDb z?7)NK_7bP(WXQ*SbVHTse)esfICuu7X*;4L6}EJha^2=tPE`GM=D>Sw1j&0hNXBs= z|C1|{=K3ZkHPaM;u<}H8g_nJu#IF6d{~enJrN15<Dn3R(F65XWl*Y=_6WHc@k-W3% zYug9)m_NeH;m`0cco52-It29!|G?iNcE5WZ*Q)^KLq;3dto2<5_GAATm<6fVjqe!! zZSFGm(S7cFur_=jo(wm_x=`irbpDPnchaNBv#nywjmU<En5a)jWu*PLDph48h2P6h zhq9rmF6xrWBub)86!qdrYDhCf#;+aihg=E^&H3e)CCQEQ-O5eb_2pF#MzRs~2$Gvn z@zf(E5|vrof2w4Ec|VzEDyTA?6dHI1l|K)#%~G5fls?K=Ud_x)Q8e=<U8UK%Q0n$P zC|j)sJO{RhG7#y5aQne_Fc~tp*QG9VE`)mSi{TBh6GV49UEmY&5-5G#9je~z1(iR{ zLoxX{g?x;!*B&KK&oBq(mCeWejL}6Ip2JKEr}?3(|A(WdPPs$Vd7Ki;SrxKkqUss- z$aMof7|BrOozm?{c{iM6z1Rrl<ekJpIUi92%1{;Wa%4&w8ZOq&IBf|VLC-r71`kq3 z2i(Zfqe(V`s*AzUY8n<=%pFx^mVNgn=6Z7)-N3%YNM1I2k%IC;?|m}cT15~pBj1!a zm&5ZQJ#1#K?^RG~a1F#Ja`3Wsl`bi8GNg~nr7m^oH#atZ2Gm=zuD@w-<v`g#d2lPF zU){93ir{|s$HKqi^-wQ(BkTqz!9nm=sQxfIZrxiT{Ru8{&U7e!f&MAePJ4|wiPuYT zbVSaqd%wIQ{)+|fs|)+trh-vSkyKPBR}IOT<}TzBWwXLw+$s=dk|faPsBy!vb&9V< z?1j-Rx^%hfM)zyMCE_ZxcEMGxva#JfMkj3NkROx=%45C$7B7<YFt#vlDYqeUFGJ~q zSKx*4b=VcY0aM{BC|$4`PJwHoY^68hGjKh8A8vrMmp*{M!7Z>V_umR->wXMl@Dtb^ zeh$$$X5Hhi@GJJ!qq`j@!(CAQRNufC;15uF`6E=G>t6BwD0-e6Y|>5n(L6T;lC(^W zr<NLCiJaqys{S8FxhNx&h_MYXuT`WntpaC_W<2~%YsXwoc36x<t7}SskIEXF&*Yo( zl!aeS*bB=vOAm708r<HBsZ#kRTu}kPSQLTnPnl(-%>Q~<<t>K;eScj=+Xs~aRgP)* zn!Ftj+pw>(bLsmLFcFS~()$`iSGmrHv~|pywRvzf`x4*+cpGFa$9zAb2tLMsF;rTQ zgUS=-V|=}>w!5_4OjuMVPyC8bIkJ(n{7^PWwsR;l!${?BFOg--ox1s!a-=?6@C~ix z&=<*OlsRa>NamL|tIbX3D&GfkI+chrH~f(@$w?y7k#P|{Rbg;`_{(L={rGY#oiF8U zYYMyCm-p?9<wW~IX{c{-)h6O;FA`ZW>oLrR9f-r0GwU%t46kDU5tt2Wr<yU0$06r9 zPr`R0^|qN$x)|<f|2c>~XTC$C^7;b%P2f_ffvJ~af4Bmwe7+9R@6H?WCb$N=kk>J? za0h?K&sSSVTzl@d1dcg{KWv~hsqN&+0wpUgKO>tlY}$d63)epnhUCH<{F8i^JNT#U zna05~LPN?OL1@}=q`tYH@8TK~nigdamI_UbV{t;GvRRJMNIuRE4u$0-Y!+ZZn?;E^ zQ3BW#(vQx2DsB9PGCeiv94ch<2iyGmU#eGOL_MoMOx>{F#+m<>7m}%y*dtF(c#phO z{%nA%?>~U*520k5b!4c!&3d5QAadk<0g)Tiwp$6mVqf>z0c&vmT~K`+yWweY4{Qwg z!t>x^*a`jxC0p14X1wbkh;3ln6_epn=zQvWrxJV=R`coru3KhoS-D%6?OwLAr835x z$j)hL83hI2e8}$kT6$69rF`{6RsWBmB1j~rj0E*0vaH(i>kV6&J-^1Np{8M0&rMBd zCvcsJ_K=Q<5gE<Vz`r|%Lw?YED*ujw1HDN4XkESg8BqNnF?cR)1XCbs?+$}ap$x<X zI1SR@>MFgcmrdEdjlbi^?DeeG*z|VAk#xnYMa8#=K5Lo$zfM=BM~rJn(j#QowBwi` z^elS!N>GJKL2Vj6UrVSoXan`EZM}DTfWPC{CK+1MzS9smF7i%&^wmxKMm<@(lWx)f zg{Y{PGsbQ05W97!)}z~f|LZKCzE^(wLC>Z4t4YM2UZmP&dcO;y+H&Y*^UYn#kEzoW zq3Uk6&E~>x@Jo0JL=H?F4LjZG!TtiMwi-5>X{*)be)uRFf9HNs{pLwf=`sNR#C5jw zcYOMNfbdDq*1_>*)9>=EY?l78$!OAVKj-?Ps{e;6YNu*mjSY=@*)=(n`+Jjy!;L-j z`3Y6i4v$`1E@@L)za?96f@#7keM`8kb!cb789AS4XIVSGm;*K|WR+97S__YfOlZ^L zGS|s=<>6GF$i_gK*)QSm6U=_G(ZMP%F|%*Gk@S4a+1DFkGvNDSE}p_}bUL&y-ji5g zK=in7u&<}`9#<zW;DEiW{l;8UaH4%B{Wz02KMC}<xkdSQk*Yin)MsN5kovX2G&ZNP zZ~G3%WTY8;b)jM^n-}HB=H1#5Wv^&k8uFi!s0Kguo-kZ{$$Xf66elSOtgr5^JULZV zF*i~{U(cb)2v&T%_!utnJWoQ<yKjLpHag|ZQ*GpLn-<nbDE{XtLg%8YoMeAaeHHon zC+x@n+_$l(*$3B8_1#WW4s-c?k{5pk<v}t(7|QNa+gLXA)i4=e17&v&foia4!ksV+ z?t>%Xk1!k3ALgiSd@>vj(Z^0c><kMbWznG?G~Y%Y3u&Wiyvf}J$HR}{4UjgHX*1JC za&Bh-Fq{ArD6^B`Oh`TI&V{s_-ACbV5MMb5JIy_wce@)lhH6{)h11~(crVO_4?tz= zY&aJ_2$#Tz;3|lX>f-m}JOZntnCC<MQJlvh{ut&vLFsTI`;*}!I16G6y3at`c*cih zDg2QA7vb+v?Noicly`SegRjCEq;2aChOfhsa3vfMSHYX%8YthAwQxCn6TSxDg4^JF z_y>FkYW-2QUmGHE??cT8-3)uc4`B-20(0P2I1ZvaT}kMt@HO}ud=GvBKZjpItw*{Y z{s{jAt5>n#@i`UlV!s*O4drkAHM|h+g_lC|)J=ll!s(E_br-=O;j3^zTnT@Ho8UpX z5B>@d!QbFf6oKENio&0;2Shg9E8ssc16H8zRtPIX%~NG8)tw2Ch6^BTrMXLC75E~= zzsP+PR)bq%b@&-P4xUDNp)PUTz*?|7tPNQM*TE;!y%wGfS=(0MI(Lg9W4119(i;DF zeH%5#K5NK2_2F}{0aX3N^_`A!V==7tYJ6B&1J=2|Z2i+UH=8CEUO1sD$mLRg;HmvU zpJKgos-WNsbSsorP^J=+8j}Vst%Rs8REM-9GFpd7Gba*jRgT8tO)pV_8O=@NfVCxc zprB}|cT8$8fn$E%;CCL_{nDvoG0q7qXw`&0iF<(BhYoG;dXY}Yb%=Wkrx0}2bZDQz zR$m&$7-){^3dO}{2zE#iF>aiR7#u_t+lZ7PVw{~5AFdMcHh1Pw3J7|!OlWUu-4DX2 zsuOA;8A?zZ=fOCeFf#TlyTlKY2iZ+m5wXRKZ;JdJ$NpKcK5Pct!sf6$)cgs(OG}sn zJHRpULMZ)x5xfO<g7?BiC|j}%Tmrkn^{_jvhTiP~`$GKf+^b<9m<;>F;V=oJ%guL{ zZh@DvkB&9-B+#ACK=v2IL2w1U0-}@5_m<E#&Q<KA1I+i9DEnp}g?#?-EjHi2PKERX znfVhXFpd3rP<=sfK=lP}gX#;~0oC_&5NiGeKD|yZyb<QXo1yxCr0>=D^D<Ol&)aZ3 z{1n~*^*ty23e7swH^WxwZ5QJI=S+b3?>Q6Uop2J|04KxE@K(4NPK9S7n76?Z@OJnV zyaRp*?}p6zbMAqakfdo)>p4w__27MwIe2D1MhB>Q7`@;uD9L*iJ`Lx?_u*qu^FAJj z70{Opp?n1w!9@5JydExwOQGgdtc6Qq^{UiQ@HF@ml-_&=-UC;_y^yqaJ0p*4VSo50 zlvuw9GvJ5t9{4F_O>N`H{v`a0ec997q4XMgWc1%MWGsFx<zwRNux(|#u~h%jpQ5km zvDjbocs|!@OmEHz0#D}$&uy$G`>UI%xSJoyYO70B3K!Qbv{bu7PmHJ{HjR_<p#!^` zh*4q*aYsDc(+RcTGC9Q$dTy0dwP&PQ6n^17^)ASw+Y-v3z8Cx*rolg;%Hy9<<?k?j z2L1)#f`3D$!#_~<MP159yzkbN$SJpV=1E>l(~G`=o^<DiY6&R>KPYXyKx+9aDWdk( zM^nr>F*f>W3TWbcHIFfX+YucyfR(yBGt^<Es1`(p@<5t7ktnayFjl*6uB4u4vdZh3 z4(rYp96X1@OwjMU!EoImGugLu)%WfPrHk^T5fNv5@z{i}(h6TFw;rqo&w-kU&=G3> zf$Uz*Ke!ggU^=W1?|_XUeT-(F!Ap?2Wo9f$^9__w=fK18Tu8r<nQw3k_in|08+ZZC zg_>u8t>|0`_dv}vz$S3IK)q@Y*cbMK%qeqv!y?!RqH`Q<S@%KM4^sA>0q`4$PnTPX z_r4BRhpCXc56)1i?>(o%@h}~hz+q5wGaO33ut&?-Bg{=U?cwj?%@O%Z%Fi{OPi30K zC0xo6(Q+BKILs=b%Kasr8xcKK_mWnd%|XLghDcAMqlSoLlZcJBLe->G>9kF{(nYx> zL2ZId+vcC1A%(a|<1H+K6G);HNM3^O=0YpM#mSmaVAqyZS+RGsc8t2g^MW|FM)liC z!EbSwGr!f#P9-+RhQC^F5Y6HoUYG)R+xyGVn8vR6UP!*A-!~o(=m+*h{iS*3rVL27 zRj(?HA+ITF&RD2^v|`u^j)Q$6@?rX1s4v~o?B4{(!-;SfoCIHiw42=R@K#uvYvV`g z)`IxjoBq$cA?-Zp9ylJ}3ui*U<6!*$?}v}FKL^rIavp-R1s;J)>;*6eAA=XbCm{BT zvk<CmEP~h*&SFUY?>q;om!0P!^Aeq<P-SB|q@Hu|{dbj!ufYRwC2T;(u7;PuHBfEC zwQv-C6Xw9T;qCBU$TK<bL4NCOfc)0k0>6VF!{aM476@Cw&!B7uGY<o59tOVnT4UFI zgJLh-$o@C*5ZnjV2Gl%^o{($0z2SbC3pF3(KB)N^npZ%()U*NrfSOnE7yJxrK8DIN zwu{p(u5H0PQr}X}p&2mcZvu6NUzUT$L9+QPhY<@?)vh!r+W(?OTBT<r2g;P-Pl${& z*fmhFo#-OAXoV}E&b`4AwHk(|7G(G<<EiAtI2tYazR~TKMPr1I;w-ywC#0vduU~qf zNwY;xmupAlMoO6Z#<W&&h_oht;OI^^f?5tLpSHy1wKBI+VYe?a%ADYqp3u_xF{tF* z6Z9@-U9JN2OX)OwV5BLyVLhXV$Ani<^J)gP?~<LGmORcryADVJlpZLy2jaVnwsO)l z_F{Tp6<sf(JPo7Rxj}5HIx5vW!#G+GQ6Z=@FM*-@T^YZSs7S?KRv)>PX+KE*R41#> zE%f4RFdwBY`!!*AcoI~fljix1g{Q$qFa{aFbLzwQU?Zq3()^wMuqkAW#Yuq2bM2O} zKBNqqy0<mFlzry>82>HJ<563s9h?I@z-914sJ<x8>rr1+CrE#WlL)0lyTFR1Ygc#- zWW82bnWlL-(o6Y}_J)~vqq=%5``GQyjZpb<GkgoW5IfkJ2-Q}Z1dkzoZiPzpsZez{ z>w~%7A?*xzFq{pkx19%JA)E_uf%BmH`R2p<@G*$)bRLJ&2ZQtuar&SQdgnZjHHQ<* zt=miWff+b3y1?ZZekiL8B%Bdlph7R{vr->#WtYSq@vUqX?jgakEK_;*WItNXt2!S{ zY<)Jr8(4Cg#D1iKU0%H(E_z>*Iy2Y^67>`qvTk+BOrjzdLTR;Y#vyCkUvn1YG^D5G z{7n9?<i)>4J}9kUhTY&Ra1dMxcfmFATeuef0@uNl`R!ZqVz?gC-|8?g)qD%!eMrBf z^8ut^(V^Yxu7&h7nr{MZf%JztpFqvoWe%H5d*0awWlMeuRY!aUC&Qgka=IIChO}SZ z{qS3O6>{`F914Gg`bN_)@JUF2rn?pX0ju!dhaqLy(b`3lyGPjKeOlyGp>|S7cuT3= z(Z;hQ6lSh{UY?P*nw;l{veFjgP(<3onR+`1r7{T0L9rZV<&9NM)nPB_`ILXhvwwpZ zcg4|mtm;bGh&cLb&Agtgpahe-fM!0=5SYgPwQvHw4w^Cn^)P909n6HsaUc45&G_*s zsPxE#N;hf$_HpG^1wzjxzm|!m={8IwKn2#}ASX9HBRSPp+DA@0zqwYOk#f2BFq$KK zHG%8eV#?AZCWZ*ja<kPW6_)kc$yBr#^h`>taJzRb@1W<r9&!ig26!sG392j1g<aqT zsI+7Lq<a~h1P8)fq26%{R9f7LT@#-cf1gPI6vuYMNu_Ba0ZQfz3>k&v@>q~b<F`hP zB+7oM>i@w=Vy&9hoDQ}2a#Ri%;l+a0K50qqUfM?*v{)SEJtB3|aaD=5iD&Lg<2G25 zJ~+b1`WU_Phs*V=x*Ut~JQyfuOg1?;hlS}?H+LhpY>h2#7d3-q5$q*)vB@TTZ!Oqk z6qyuZsLs~8E>V}6b8)=TteK3|>_ENR8~Vn8N=+Y5Z@?BTPf?yKRcAp8C&lcEc^Nr; z;bxd|N6-qU(t-9+>Eqd=o*pr~q#t|RjFLFk=4bZSqcZG=_`;?8LXM6?(Gc{UYWuH6 z;WC3LmyQoR@w=EvYvnQfJy@-Id2niJ!!X`_T34OnAG*c}%8Wz&#6Aimjo5PqCUq$g zUg=P=GmpVgN3@zyCNr*agz8Tgg%uiGG5Xb?5?MW<w(RNZts*J)Dlg7g>J(H{*5p*O zl$W<PWdi$U-+QpmGC5!R-nvok;Mcb4swOEz8S&P8d=kw=bSF{ry=O?_7xq<h%ojb2 zOZR<qUOo4Agn*t`|K!LBfe}!S*~(k%(s}|a37Z=HNC%AHi3CG!hxFi3eA_`+%!?fL z<U?<n$$_{wN?63M;c(1qQQd@YPp?lxqGVRROCOV(lcwHC#((3F`fCcB76M(izIgg; z#Mzd+{36vCu8>eq+1b8U0x7F7l;WuUOTGQ!-oEN#g$!?BYxyhq=c~_G!9V|UZ{I(^ zi<O+<_;_#MKRzCvs^IUx>+Lt^`TROyrFT!ACta*MU@Lzw_2OrtyQQCJ!+vlsybeAD zbKxVf5H5f>z$f9Ya1mSvpM~$hCGdCnJXC%8Iy@7uge@WKB)RS38rT`Gg{r^bf*Pw> z4@bi-a4Mv&>~4Xd!p|XXX0z5W<EO3)?-x+zm35bloxdHPOy=!?ZQyR$6MhY)tA2p$ zf7lNhM{s_I^zS>r!KdM0a0~n!{sbA9by;7<saTo*0rK%^NPnPNyYFIn4Euv%b(jf{ zgSqf{D0`ndJ1%`G4(mX<kHR`oW7a3ZH{i+eeRw+j8lC~ahg$RR0IUz`BQR_K9fcNY z#C~I_HU8Q|t?}0#vNnM$^?CtZ3mJcKcfbqb-|!-M2K91Bcrok*)o+mq^{vd#a475o z_07z#a6Ie|HHOVNhC2^x4Z$bi0Qefznt|knGZ6j>uY@sVYB0P6Y7M~=P-_U@1FwY- zK&>S>7Y>C>U^>(ob~dbt{O7@A;AnU}EPyA%v9KXz{M+pS$HUI>de|M_1hsbZ%}{G6 zPk_1b7B~h@gc?(s3@5`|;qCA)s0xH<bf1T_p}xU6AMS+<pw`fO3^s=gVPE(ZEP~I# zd*QS20m%AZ?riuR)EGA7^zO^>Mfeqb3GRZd8DYMu@iMGKxn2PqL(;;mxlFlr`>?+X zUJh47jb*<Hv*CKEHJRUrli>!an&v~ucR!siP-|^{43Ed?`vNwiviu631$V$+a3{PL z?uH8>egp0r_$}NCzk`S1_pr{flp}a5+z++3@=x#<cmTc(e}-Sc-{8^5(cXa7;9+<M z{2OLKrwU{6kUV#1!K2{I@M!ottO|ESWWhZaBefcA4e?`euZG9LREUhY!(bhF17z(D zm+yc$bs^vHa883?!FsR~y6<#&7CZy?gN@)&*aVJ(P2tV(ET~$u6`Tg!Kz;j@wLIJ< z@O=0NYzIGt?cr{C5&RK$f~u47r!e2(=nJ)Gb3b@H><?Mz+QHAlWj$)=GPn&=2e?1M zL9hZw0BeT0ti$YF16g<383HeW$#6Iv3SF2ES*yUwfUKY441=G+;gI?54r`9M%u{zp z!1^#7wuF=sw=>Lx-Qjqc3vYsB;LY%Q=t39X0%yR9@Nsx6d=*lb+`r)6@O0`K{6^eH z@Lt#iJ^%;6*)Sc>gV}ICbm0^5PPh=h51)mb;bQm`;(~8W8Nbjf=r{G5OK(mtZChvr zjCI0nt0M4NmJ{WAPWA(7><6!Pv4nlKE@Y-|=kGF2hrL8v(<$6^kZIO}BX&lOIby8N z1mf&;FEe{jZMmLAu{a5L89Fq#*qjw3DrEV~h)pMol;kYmzz-Wc{iu{wK@xQGC}>ai z{KidtFf)k7%{yX|-og?54HWdAdC>mcb2pE-9v5+f`sE46wu9xkgX`srIV8!op5k29 z`VGo>2z!X@1~QhKl4%Nom$)~t(7u{Er2Lh=Vp7+OUxqv=&tHUn;Y(2V%5s<sUxVt8 zd>!5f-+;3rYwDQ!BCFvl_SeE~a6SAHz61Y+@4_nF>piG3!3{7GegIS8W>^S6gvy35 z;S#t5%3j$855V0}zHocs*`(h-sC36a%Je_}31x~OhA#XEJ`5{Xwc{YiLYb;H;ZAr0 z`~jW_8JBiy!%8IKNw6h66*5lg;1}TbfTzRD;2H2**aT+5v*7iRy3DM%#CN4##&n!k z@O9V*z60CBk6=5<Sc%gfsvOFOi}wZ4d-dR$8Y8!smP6CVFBqD|gr)4%;no+Rgwy;` z)&C=C-%le(B~aqDgug?@N8+@csBkG$n{6d=Wy_>m6YDu*h0i>Qo&M&R!q6O8MI~}> zs1&MXBoP(qo0RygT+OJfhcxfyPa)F7sl^|bb;<Z!#3`Iq#~S4Pd4O#@n;(>Rl5r*5 z7B8|ZX|43^26fp>U>58SHO6--+ypO!lHq~ydpHPcJo`$hF}}gD5xg2+0Iz|);ShK& z<eOh^9!!Q4VG6t-4u$wmI_Xeje#788I2>y1FB8fp9|`ddbVk7nyhk298jgmNm8$$5 zKPQWNm8H3{bK#UySt;#P%*w$>TFQDBXZfL~{|APvb%c<3L=?2LaXFE3GP9DXu*@7$ zGSoKQ$jLD_`CyM5mTXt*G(A1Kx{kyNNdi$3A(7;?BXV97T_v=vNed#w;-O}38{%SY zS`9fpHK#BuEuyOBg7gB12@N>A7mTqP&$_&<;*3$rne?Er<U{hPjMN-cXc9Rd>JX3d zv))9-*mx(_gf@dv$!Yw6m0<GhSFw7QJ;N+zdT9`!pCR{Y>QpDbdT7NtGV=+ljgnxr z+e<(2+oC1NgC8UZlKTNf%<$rGKyD-(H^Ot_O|TQZ1*%e<1l0z;4Nix5LnY93sI15S zHgmxrgkP~g7aoKU!Nc%jcytBYv`{*}1lEO*!gJs}s6PDpZ~%N9X22(4He3krf{Wk= z_$=H8m%w_w!wawgV(+`F;A^lNy7P5-EL;U^!PW32xCS<WZ^4dmJ?sYGhWL&+8z8<S z&L%h-eh6p7kD&VWKZei3ZBS!&UqZ&EogMH`_#fy{hw_aV;}88U?8yEPkag^wAK_*2 zXDC1EgK#wb6&Aza-~@OGGJfU!4(G!^;M4GL_y+t3YK*+%G1OJ?DCi)(wc*+DBuKxx zQx_IPe0AMtAm0*nSHaVv+LEj(>^4W3nnT*1&e`x%$Tw+R+Kmpry{1ihKBRr;w1;=V z4p42%j*xbk(+R!~6X9lvFP!@|q(8-_UE*|u)sVkSAngIC2b4bQ38lBP+2Zw9TjFR& znQ^$O<>@Ug!DaMTjI;bu)&GNsv3g5-AfmTaIEYidpksc}{Zu~4MyHV%*;mia-~Hfu z@G|dt+aZJT{>c^jq0W)5aC_<VG6tbF-RMkC&tvV+;FG*kxGtyrq3nZC<4{D^NhL~0 zH(*02X+;aU^OUe_7t^tyxk~d^fziv=C-H-hUv-E|RTi-^C}=uJ6N7!bsByPoe}pk8 zrK;+)F&QH(pV1Iiyy@(RHLG8FM@9h^c~Nk&{GuE^mamso2l_$jrgg`f6Or!4&!qXI zw7ehciRVCRW5&$P9K}cBNcQK!d^jK81RsNUz$YNT)p|-U=Q>Zq*WlCe9r!F%{x62V z!)35F_kIy}fao^2C&Zt}?GImtSHcxg`ssBz4!!|zhpV7`cveHz-)rCpa2@;}u7}l; zi??A@$TJw*^j+AR{r6y7xB+&68{uHM393i<LwGOT3YWl-Aikx}$M7Tg3H$_p3O|FN zLwrlkoXuVEOZHXHl6aPQxt0D?TFaKb<NqSJX7Y_)kH_V7KSbp=JSr6Nod4H?%yp^8 zwR&x`Bu3VQWYEg2S-Cd3s30T#zY4F$NlN7}Tqfu!^lxG3OZ{tkE-gH9@;sPy^@Gw= z@|-{f^XyEZ?lbaS73w0#LdkPYcnidKG;OC7;dJ(E!`bj8i0qlQaz22xkIY&cr@>w9 zpAMC;F<6g#)rZne4WPzM8$vxp6F3Amg&HeA3r>fc11kITT(}CJ2lv4i@JHANYOK61 zJQg{^rZs)Nv`O6d>|X@aA@_3e)pio$Y}f^=KJEtB!0u3OE6S9+6=D;+`0_gVow)e$ zI{jc}(hVEHZ3HiaP2lBF@3)3$h#xE8O#Rh_V{gMd%gC*1fuy2&O$|}Pd44#uz?xx9 zDcL2Q8?rmq4w*$%12%bQ@ii6yOD594HxPY-Ib=V{p|4`gG%F6`{RQ%*fCm$6m8Vs> zLxO#)aP!!&+Eh0(#<00kCULb)TtUWgO_n!32`UzmVkO<2LgZ+kh7J#gfYMC`F^M?) z?4>K=>z!uA#e1`ub(uCC3afanvM@I|UGK>%s(vDrtN+y+L%o_1d|g{Q_Y?Bc56VN8 z6_ttiym<7ht9%^}JHSk+R~-qJSolo3dZQcQUGPTuGQ0_{gf83*CqT8)CPTH+rovOX z$8AvKBzM4b;GIxIrqiHw{R}u3qR(CK;mm>y;Dc}(oD08z4@0%R9)Z>1Ja{gg52e%j zjoTSM4#&eM;LY$!I1?^{Z^EbHPw-iI6f(aUUIV$8TMY4Gapjk|9DWI3hCAU3cuXbg zBA5VI!k&<_;x2{jAU-u_?%NLdHv3;g(%Ib)v8UaG@B>(xeAoz2hMEgkAJVsC#w*A# z7heuD_w5?Ejr|PxC1ecB%vpN{e#gGbD(~-H5a*w9nCETAv7g~R<(JjWF@9m4#)*EY z>i=QPxp3_g6xI?>2^Cf~^A-{nV`C9a*5Ay+o!E4xr4v=(L}#at$j!gPTei~gWouv# zMT)nIf@H5+s6eXOdM9!Abh9i(Tv=$r(J}=yk;wRhsS;){6D^pN;^IREb0CMp1=DZ- zMr<#Yy%n6Opt7g^x@3#LZ!BPy#f4s^4k(XQ7F+Q*GHychQFh&t6nHT)@|*7i(_ji@ z{LQR)Ok2rS4P5{qf<<s090S)w`A~0y^n)3D>qbZ&g}^g50B?b6|4oEfz*`~Z-?<Iy zS?++3!n@#8@E-UX#IMi&4NixL;S6{_W$Av%oGxb;>;WHyBjFsVG4HuhK3??0nZCdh zxPX1e4bAuL=fRiQ$4}6e{Y2Z({T42Q`{C2@4@g_k)!5`xcnMqv)fc!NYHadlh(Ecr z0^S7a?=wErE8%_YuY=FSw;<PW=m&IPgB#&CxCL&9_>q~ibuI50@9(4e4RuLd^;u3Y zEnD>OWcmZ`$)OJus($gqzbIWU=Y~p`#BC~3)*KsNx^|ulZDC~<IVxR!sZix`7LhTw zP&t%6*M=y2fzTHgbU@XBJrMdPgUVnc2f}4gaTgJ1OM;yit~iyvaOntl<M-!SF6l>* zZKz`HJp?XYey0hMDi<+(9)Ho6CtX!8>hm{tnF+Hh*>xvo!x%9o@Dlha><#C`tKnmC zG+YSpg-=1+BF;0AwuAF5TnnFr+u-wX2V4dZ!Q~K}&%vw3#U^uJgV<8e>k!+?Sq0PJ zTTt)zHl%)Z-h<S4&ITy^j=lmjuVxdZzA!$KE8$1%uZJJQ521V^e}(dWtiXHkfbz-R z3)P<Z4oc3xhtl<3Irri?UEipR6pk6^b7qvvqt_1B;vsfrV$)d7u=ZI^&i6x9D35cF zt>qtq;ToV%zt&MVv_Ab>wTnBWRonQ8R&fz6+s8+oA0N>=KB5ILSnB=Or{4wT4J@eu zB=E=$*u0NH7N!n2?H0XIEmK(J^5Xef=8=|uP#Q|+niG-k#Zx!CO4rk1AM)UIcqhcy zz}*1P)Nyo04EBfA;l}T|0o=rXLwEx9eIs}|Yz$|>CU7fEfZssoWxDvNI?Z4$>h<Q3 za~=AX-1hJs*cYA)Q{j2A2)2N?!ItnL*a|)eTf;YD8;Ea-(-wXY&xaLAgbN_P8csWi zkA=fM+>WpV8~`tb8So-F26lu~AifpuEZ7M?2@~NfurquYc7fYqSIAhp(*qua%pGxm zhnGUhu*yMv+v0VeuL;MN!I@=b*t9MF2cHcM=}*}jQc(5T5Q=y+L<-X$ikKl$>l<H5 zeI?MhzSRVgGSh$tBZ0vO7^M#f6Wz?%F4lof>RUSUUs)%UIME7k)H<0F7ay`t(m52? zzvWsddaxu;v=8Rj7NxT*p63|O+X`whmB7-%Vuvyx*Fl2cu#nD{9`l3pPvz%)B35|u z$>g{4GzF?%f$W-gMH*DQg1JPlUU@WJ0`uWZun?+m8yPokZu(PAANTdJ8P~oMo(FG+ zw2O`JZYI2i{cJcHs;w>GUFqW6;eLqku6q#P4J%WAr@@Qh4A>RUgz~3)08WFmq1p{| z;Kz_MX6AN30yR!q0^3l|ABElFd^ij~24#ah4sVC}6q)fy`IE`kcm~Qp3R~Vi2$w?X z31r``4PSz%z?We|_$uU^FwP2i9we>ZE8$9*1y{kvQ2u7h#&r;1d9~Bcx7*)=$C5uA z-~{*~ByF6nkY_Z0XeyWL_qZsoZc&|IgH8E*f23ThH<V6R^DR17eoUp2Zd(45c0WXG z7B%z}IaKONYP7hD(ov{~{uStE$~UHhw0P-fZvBC&(5j%auUm4GLMw_}pwmscwDG)) zl}WB`{#G=7@UGtH3#f6JFCo9TK6P*>`+C=1P-$`{`5dpS&Z%bG&$Z#KNSdhM+32d_ ze$#3{*YHCqHGF4p4#lsoXFBo1-rtId)}cX5%t4w%x=xBo3ay<{Kzat2WlXiR%S#(j zR(ljMqLyPi`zG;=2IfJ`FYNl=(gW#4dIp=(3z@;bKEHQtt+q-y6U+~XWo3*?FEAY? zl7WAv@ua%!y`vg$Y7lRqc3`ggQl1pqKo0#^jTbgU2a-stb_p_hmqUBY?9^gkrR%~= zg9BD|$BzT5nWSozpzExJ<z8n+aG>-$lGkO#EBGqZ*uCmQ_Jia~I#hLt`kED7e979u z2~h1o`TEJuod|Q_!|;As0@p$L@cjTEhd)E=X}1y&z6d73r=a>^<kQyy%9n2_#81(^ z89oOm!KF~`K>75oh4SU2zrm3&pXQoT@4LrC#-Q9pxC&;%HE=Rq3vY*S!*`&3_oPEV zfa-tT2<xHyHo^K(zI?slM{qEdPoKsEKZTmZ^CfHr<=b}w{13bV?t~MdeEXEid*C9t z7h=;JAHUC`eEW_f^L~V9LizS#=NMnU;qX`Xr5okThn_dSeCp@?hkbN{Qvu(Vy|5yb z5F8Dqv?{~n;W4lctPZb(^4%K`<-2!3tOfCJbZSG{Nb=n~1X-)dmF+2?y^A4ZbZ%GJ z0OBWSeD|(}^4-Iq%}Ic(A!{0$^@z@eKeFEvc0j?jhMk~%__Y4e1@JB?AHEkLex=4Y zQ$BoJKZARkb%Z*>9QG4o0qg=N!fsGLm)+qq*c-kI`@%P&eEWWa1K?j!K7RV{DbH^7 zXGLVDU0j`_zA&lHeQ<Ue{b|1uUs%N2cK@Y5QK3!bI^j+pmCT;R)n}taS6As}X1~Y| zOd`^bMVJGuBVj)Nto|jHIeRFJWrEE58{ScU6DB2mlulm%m(r3kj`><rPt-`~ve7Qj z%VPqKshUh#SNZdU(m-Xs0TK1Q_!~$wCC5!r&p!cnhw?+50q=nG;a%`uC_luFP=1Iz z;eD_=*O~zt*KlS+bwbU8j3YP?Li%o<hu|%+1k(5FEP$HlF8@T0fjtRR;3Aj-pMg(7 z`6+5F;d!VrFZrd_rHsA;>2EUrXcOQY?9-p*AgAsg_$I8(`>ummz;__+b?1FZJKfm` zzlQQVlT3UFRrk8wBYsW9L}a)P$1Z>mmXV#p+~m^lY8mNS$+>>uCw}l2W>M;e>Q4#J zCq&uo)bx$ex4E`+z)FZ0sk8S6k)ivl@!$prG(jYEP$DBa^hHMd1B3k$7+c<A4NZ** zjj<D0f~)0Zj16B+0w>W87Xig7i3-_#uSCVAuz#Sg;<8OsN==2H#Km=FS`V-U(iRDh zIO{YfKWZT_1YK{cp-wXif}lqi-=9KO(!J-OK8-)Z!z|${I-jeyM;j89s&k>2KKfv= zEx<ZZ5*&!@u3EqW`@XhoN~t=FI9m|ML|#L#59&B0s9S0w^llb(OO>u<ae$*S-rEn7 zKb70gMAY`;zd&A<;PR7{&G{8n7RxX4D)=qbO}~TJ!yn)sa6eoPe}<C8KOp1Aj{GK- z&VRwCO7E)l`N9hDUdXz0rtj!zcs9>a9co^!{3)M=HQ*~yew7W$fZFhUSO;p%`D93c zvU3W&0iFu!&voiSW!M=|eWdl_XRr~}x)M#`VVD5b4rvAlLHSo+56^{bVGF3blrrj0 zgz~GL3aOvWcPTqU+D;Djl<A)!P0hE(<qP;b@$v<%O$POVl8RoiKkN;!hVl(m|3rVN zj2r-&6JdM=?}LNbe*#_!u|tfH;0`F?K<Z!P1E@6t)7T#h<pYS0G(Lb&!Qt#Lfmv`9 zln>zdP(FaFYja>V<RA}{7ES?_zPg0GiEk^YFPSo@H8`9(<>{;RjDoD;nmKkt%@oe_ z1DExKr>pYVkJDAfL|M^|(^W19BD%`&MYfUNJyl5B1(&dcqmo~HNvnzygZ-Q|Q|e<x z#A}-b;=-Cm7j8jZc}iq8iBye^AXV2B)@o{WjsNYjz*nfIJ<Xh}bX2)JlReq93i6>- z+D?XN!6{IU!l_VWC%40Vi2Y;Mwwea#urFUa8R_@I&2R?X1Mi1=v{{hxerFC;f9u1r z0G7bna2`}2)&e+|a`v?L;WKbGTnyERy9COPe*vn#TnhKX7oqCS<**r)FWpG^DrB6- zSpgZhaNdB7LpUp;<YyI>oOR+F@&3uDAeYiXHQ__0a>kg18tB<9VqylTC1xd@=7*@5 zh5LGgHs%t}jg!0OM3pOdD>)F6J59M=Ph^aZfqWjt%AQ}b)^@7Y>PGhCkd`*4knV)S z)T|scgq}&9j;PNr2iNMZV>HHZ&#qw4=A(UC!^WAW>0r*bPn6~8o<rD=u~CJM8Wnd> z)m;+1s1(~PSF~4F8{SB}lGN5Kc7Z1SHi@{fw5x2T5ErRO!?m0Go?asV2r3yaw25RL z!c?&BvyU*xi-Y57CM8C(A7k?tj^Uk$Md~x<hFl&AvOK0jFDY^`WSJA{&HuI|F4k4m z*rO%Lksl;KDqjPL@O@Q3uV(ADZBTk)2kZ=Y!a?u{m=5>DG4KGK27iV#;ji#X_#0He z-tX`&_$QQqz~As#(xyUn?gJ~rA+Qph04u|HU=?@>9s@h`%++BQJQm&xkAru>8c_Xq zwcv7iB2>9M1!^quRLHt^&S|g$`B4uZ1J8tYV120h1P$PourVA06QJflHiL{$I?W;D zlFm6$^<*ok{A~+YzzgA8*b(lAonRF*s57hqyFm5xb%ko%UIOdF9<VWF&YJOIy%b)? zem|HA`$NXToXerwv;*M}a1cBQuYkY7tKf0eqgO-v@SSU5cQ^$0g{hD=B%Cyu0W+Z1 zb;^XQr$<2gJe^T+KFo&nX*#)3^CQPX`YN4bxDt+o^p`m|!u{|jsPTk}un(LJhr%h4 zehcSLxD4J6x59fM?R{qkl<(@p@K5*%l)jtA7QbG;<k9b!d@Q2xtR6{CAE&R}mv&3m z<OhDJ>i^-$W!3LqjO&(6;3T#1y>3aJrJsd-@71!CeJEw(2R)a{5kCz29PdBQ_BlQP z>k&U2Hi2`Y6wJd=eU6Vnz3&dTc;DPY<o|5qbKnz^_qCpT1({jH{@eH2RNtm>4Xe=d zG?ZtJeJ`Swv4^FOY(##>Fr$E^knCjrtY8H^S>tXHk2M}%St`Z>@0v!7wqyT%QqOZU zbZnE@=pbn;Kj<Bmb{ccL!HYbl1~x8#p8=ELnNYf>KAZ#_z}sLW_ylYM--S(~(lP<6 zAFLTvoA_*~w(vPnWBcdAWOyFb`3v|vzRf8gqmy+lxUihGH{UAC%N><kXnQR5oPLOk z+JDahiCH8ETADs`WkHZBtxT@CM3t8-N>Ljh$`xH!xo`p-%V!i7szcfKp4g~#oB1t* zbFy;m`eKcUv3Jfg;-Sp2Kgr5zY3i$3a7JFxc^}-zJbjzsH{98Zoyv)K=a!M$>>CcK zW6~TCFFjJawwPb;9DABMS9v7aQJ?-VCI-Dro+{rif%Rc`sB+f}UIP2T>tJ6v7WRh^ z!U1p|ybLaam&51b6>uHA5`G2;L-n;@1uOC_SHlzFHLw9phI*A$I1XmOIdC{!471?N za0Gl8j)Yqwb9BvGoH<Z_Zh7zwI2tyD1yHhB2qm+9_)WZiTtl2h^)>ipL}o+MieZG; zuk|oKve3%2GKEV;*SnGe$RxImsA&*F5*#m^ikBG2P>nKW3hdo!9a+(|LS}s4y(7AD zH(iNMoebuK3r6-OJ@$MSvGLB9X_gqo8(#-=u7uB?tByMxuX{?=!}qjDeA(L1Q9mdx zC0nNvvCE5`K-w!=?}Clt-LM&C9<^zMOo#2+p9z(;_rt+(Hq>1ogf5&5?}p5~HvRaI zz=zp?6fT7Gp=9p~xE4MM55mRpFZevH!t=cV{||HL0Ut%R{_jLuL_ngb*q5SWyHXXD zs|o26l8}UETb5)~AY?<bq1bK|MeNwS*Df|}*cH2i*Dm&6uDxA*_y2s)nc1D0-3a>E zdw=J{@MO=l_kGWM-gD;6nVEIr%}{af7Pu?C2WtNO!%$-gE1`VwNw^d~4do*|-)(&9 zHI6wfFkbsHdA(WQWw|BkOT4RbLVHtT<NRSG&E;!|)o${KJ@<Ohnmb~mhN6-EJ;Q{e ze*A7{!8IC9M&Cq6Q_N)On05<h7i#3DS0ZC}W334^WH<*k7u5=JT@xEc^x0QkTz)~8 zZ0jcJcP9O`4dA&><`-S<d(G)jnKt`-IEZz6x7g0`M>rDd9b<b!-a}#DE%Gbem*1J( zKWu>OKncyg2UFf%;Szp#gBQT=P%)+lTn^WTE8%)j_U68=DVGtHQLtPTD-_?JfVcX} zB|jEVmP-zsxJfp25<MT;N6u->A!1)eFE4d6l5d{388hq_(#y$MU<yJ<wHXbK!%WT= z<k+%mirJ<{#p!Ni9H3uv6Z2aIWjC<jPwAgrAG2*n$dhAs;kUEP?1V$O=NN7aTV;Kn zwsVqfrn26U-<LRfx!72CEP@(GD28%R&0E<UYTn91SO!mn<xu-hgg3)V_!*o8e}(j| z&HRLEQ1O2sxHsGv9t!t^i{Jt96sUO;cf$x&S<Zl_FT$~c@7R8Yyq+x2vD}s{^St&} zy*V^o8R0XfrZx^`12_3gT~#NCRqjKS{wFf`V@=HNsA?PHPt^;)RA5X#IPqI|Hj>Xh zwvg{8$tW8WGBawO%yx8=+;gFvLvuRRl~@3a;6ZQ-JQ(Wqj2oKgGLD2d^7|;Lex2rW zNcUr*Y$RVC9*9@+EE*Xj_wA`Rs%VMMHYQ?|L`pSLU)Ci}<hBc5v+6w3lYbeqi<0J) z=-ekk+3jRU&Q|^o&aF@!kxjN^xg))t;VNE=7O!cD)*6XJZ0V*{i6xs~VjJtcGV7c{ znKj=<a-0bz%UO=h>SzBgU|Ws9X<PNP?o7&D$uxs--sI}vZC5#?YWhGH=2DpvcsE9S z<<@zFax-_u$jvpWnai=%k-LL!gZCWAk*Dj5u`G9`${nz?_spqw&fyqIJ4=INa{L-7 z?s$))^9SW$hP;yLS}3_RA4ooZ9ZPT=S@AzazV6+xNXkFK41vk=;k<@u%`9X8>1^kw zROwq-m6YB)PW3ozD(sHxOy%>Zji$+$lS?JvI9F#eK=MjoZwz3}pd-WqZiYI~ZBYI1 zyWrJO^O|mjcf-3OV+$Sk!u#O!@P62x<30elf)7F2>sXdu0)DEPq8Ojca(B{RQ(E=C z8rM-ntaMYVp`>flP%36M3dv%2JDfH=+F5m`gQ2pQN4QC{$QFtVDrcp~kX`aU4po<) zfJ5Mua0mD_l<b<TB^}l71m~eoB~QnwWVt7ejsd3*v6-9xL~U)1@#-tNg8IIM9+LHC zD19{#OZsXamh^ocN{=_7^gV_p7<)ADMaQUSxi_irgxK7_yhu%-(W|3m3F`PBvP-`A zp>+HJO2-eObo>}fcIJ;59Z%)&V4V5~c{;`dmitn53>2wc)J<9L9~m0dN^Rs*<CHs? z9dzKJ|4OEyu3w>p<op^+*KeS7{T52s@1b<~5vn}vS%Ur7I`UK})JM2KscTU*Ueyq5 zjhFBtJ>9QhZ6c*Asny9^ny7!Os&3MGB!5?^K8Mo!-EBL~Jl77jEeyz;v25-;8hJHt z9W0wIi8<1F6Zk+<UgQiH#h7}K$Gb5rBhB?|nzxc#Htwx>8*U@^Alj@#qOouvqojhr zY=>+gTIur4R&y$QNn^+J+0adrRXS&rAwN^v8QmoRFgO5?fC};>;dr<kY=qo%?T{pT zzup;eEYy9oJSe*qz(-*rd=i$xci`UeTgdwiOq^!yw__vZD1)*Y_i&AEZ(^IEFX-9U z&B)htd=DmVo8QRX>v&jI{C78P8uOaZA@AE()-qq-kpVl%lJ?F+`V2mKr!v&?0%G$X zO@HTC_a+nfB^R@|n<TgFtakihC-Z3ZlrG0Z)rAw`D0muF++aSKxz;-muHv`m@D0E| z7sClqbNBX#dJmuGHEYh^HBfW(dT>6*&du|Vw?Ngc+gXDBg-^+o4DYi%l-8c%^47+B zV^lern^G&-bXFxRn2g#$PQa)wWDQ{P8dbKpzPkpaD&DBgaFb-0O(jdIlc{(9NgwVL z7@KNd;4pr_1UsPS1ulWy=Qlp9`GL~?T__t}&Jw(qdWgJ@Ssq|{IK7Rg{_Y4Q1NG;C z0Rx4|3L0n#c>x0@;+MBfB&Y1r1FF6%eUDy}o%<x_J=Q<L8m(Z?hzzg!iW*1i0;OM9 z*qI$vA9bu7SyraE!?gdE9g303O_Eb~=nma}R4??B?7d+Ka{s#{3N_F2c(^f?UYkJa zuYP7QuIn5+Mj^|p^!lr=g#Q=Lpt>=d#Z8h`Hs}i7wrqQJll(itkn*8)+4(ng-kbH> zN5^~QH+24A6ns!;$r{vI^IIjq-ccEXn%^p2#yC2!;P0V<Yl6Atsr^&1`d3ot%2+!C z!)5NfZThm-O<C?Ai9S_`oMbd~pEwKDVl^{E+0ZuUHL)fhjZkZ@LbIE4wZQPahREF< zz0on++@|pxy<ptE23B2mljN5jdch_qQ}b@6ljhyhE6A7({|2YRzr$%zF=HQC3iXc7 zGI#*oABJHqoDOwN=0kPJJ~dGF<zALx+&q#zom2h7M}u~(j)jX_8ID!Y?f;G`P5;Pi zOX(1_rRLvCuS1}0c^H%}HUBmT9s!Hsk+2*tf)nA<P`1<j+%|X|JP4i$Wuqlfwp1Js z#-7FG>70kNJeJ0m#gV4E|BD7y9rfB%dIasMdBoC9^N3~7Wl;9K4(374BUatM5mv(G zuo`M!vBm&3uUI~R2Rsz6fU=Y37k6e)t=Bo#7kfNt&-~cD=J5Yb2MyX&dIatH0(wig z7oqH_d8e|c=9}igH=z9UO(_3-3(7zL4b`uI7piV+UaHFOLnu3GeyZ&G086kR>8<Ne z1noJg<^QBLgSJdp*Sj*8PPXg@Wy^J;Y^k}lIZ$(HWy{`Bw(J9C%WSB+z9DRbnp>;7 zt~s@;>;0i@xsoL~kHBloCxf=cE%RgT%+mY6SKHUdp2N^v_8bmn&t0MHIU43b%>kA@ zH3wMs+yly<dqUY$bAV;fTqt{LF0kxb0A<g+S%TM$T{CT6|Alo=1?^eY-V$BYqwZ>x zL+t!tYS3jz#Ys0we%0|lWVqLkwdgB5MxpGeImoi3<{+z`*4$&+Ck7QGGza-4I0v2r z<52fW=E1k%eE0!e0Dpi7L)lAnXJyy>Sb}qnHg@c)`L|D}wQG3fsQ+UPe9*SiA!ysP z(OI_Dyk6P%pHQ~F5YC2|z$4(LP-DuM!L#Az@LYH$d=+Y*?^kdc{1IxtujVn{0A(}H z_myoo<nLhLDT_RnxA;ubw)(i4-sf%lqH8eiZ@!>mSnvf6!-B6)7{mF!uTmHt_`O@; z_pX88qXNH2nyzgKos!i^lS77(qg)26Ob46Ux_Y-N9b1*vQWiJK7AmU^$dH|t9>j*S z(?f7KxC*MT@Ca1=cnr>fk3-dqr{FyJG+Y3mg~!3?;0f?Wcp-cVUJPG_H^bN9t?*5# zdh-^14E`Iw0pEuz%d=R5W%(d-_ak5TZdWJEvWoFb1)sGk%hU+unl76ImuIRgT@h_< zjMbWPs-a}cN}5XD#K0KW6`paa7g*ya$tIijC*x5k^A~iHyuZR6sCSu8f_j(f6xbcs z!yZumg`QBcW<7WaTp#M1dP6AN>7Az!!cE}Aa5MNW)VojLhg-oe$gwr-1_#1z;I?om z)Vol1UwnIL<~PFQ`Moo|4C<Yzvh6NVWuW$R=fE{xK6$Fsd$K&6ECW6wIurYtniOJ{ zo3h+LXmRWyxlEdLT+N6WO^!7(cOwI{<lM*kj1Oy9H%SiJn}3OW!Ft!KWGjJ^k8fQV zJ&xh;;5}=v9?vE9$ZwA{>5Hg;sWPgMYtkj^=u+qC(&*@N6#EA6y=_O{`YhY9JfGCX zQ6oIxlnUz-DYaDkvd&*Ba%5krgpwIfsYs6;7B@)_l}R@^(#bp=xh2~|DAA691K=Vk zd5?nfwKeJWLaJU1{+D`PfZWpSLMYKLg3{{}D7`L)(o6L^7{~O!)1Krv!xxi!xouJ* zZ<4ilVpJ+_N-eVxtCD5riA##_Zqm6_CR>s5laqNPvg!QG;g*o+jLm%Ln_&sRZ-F!5 zZEz{P3*G@&z$f9|@NIYx{0`m+^&IR2Q1^)+gt{O75G;fb!+qf@sQJ|Yf``FJ;i>R( zcqx1m-U^?FnxFX$d=0LKZ@_2am+*P0_ldj!H-)dm3it*L!?&Sq`wmnYoW>HYGv|;e zf7QB|l4Vd9Yn>fw(tC$Bo|3~#H~H=F&g8N+WO8yQmy=<il9|rVGdW9nW+jcdZKCbG z?8)ACq`^H0lw2w=mCt@oepjB`kgQp76zm1Z!1ZA+<U59@+%|w!{N_CwW-i=D@KAnl z0y|)TD0?hs3EE><^5oBoOD`wwp?hr;Dk=&l{O-t}m;v2g`bS#%`kP+L;2wJAwzP+I zP836QPB%%8U|b)8+>&i1)V8A>Jr?nIuzgZ})3!A%uec|pNicd;{aIS57pvrIk$O*F za!3!fPmG=CI(m$QgUK(11+WMf!7?bhE1=4$mL;g)j^yc>+q1mt*Drrk#Tp`_%A_wl z+NYsRnWQTNog-KV`y!LhyC2lK_jhER$lpO3yOKxsGs|m!87s=yB%>#e4dEDW(lI5I zj=P1E*?<iCJ=2jT%HKi1R{u+Kt6skDmnE;XAh&W27E^yw7E2pvy?(3n1Z~!iTsrq$ zsPoTr<ZS2f;9QG+$y1%5#PWt;&Z;T7)@TyMP5yACf(^0CQ?QCR+Smr9QVf^4pPHk5 zC+WPByBkcj*~lqb7D2TeM?uAz#ZdAc4dtKnS%UW7mb~>?<lk@l^~f)%s4o89_IB^@ zc~nd1vpR3k{-+_QWH}v5o--V|RmXM;^lPV)C!G~P-}1{{YG>K~F6$d>2V<Mg5tQ*F zWYT#rhC25pj*Rl<ppSTEd^;#(!9-))-!EnAoW*o<UhBwtog?S<j+|?<<vV^ki~dSm z-s#AAmm}i}N5(bT^4~!j|6*INa^!r(k@H`UoNKb>yM8(Uu#{`#m(MveKJUo*f+J%s zei@AS@)x)6yyus(?2ih$HZtnDSe^GBN5+3UGA>FZ<1F&jFOV<1@0YPWKi^cHp{#O~ zKfJ0H$YE8o6;M<vCdU(%)VpyHv4U`918z_c$q|eJ|3PlarssJjpPuJcd_9UK7z1XK zr)^aZANchsm|Rfymnjm|LvjT5_|?&a2EdFF={aNRk<Mq-w^i9qX8F*sM{b!dkKY~2 zf->qHK^gT7v(Bq$n04+xj*RK*o>#_?{4$o?j>GR3F=ZShos4>ZS~BYSY00SPr#rKw zoKV}2WBJ%GV_Eqh47Nc#>Ks8kZtKXn9n`t?%ywro?!o%*EMr(c@ynR&)IHWDlE3b) zWuH~&2+BADnRMQfQ0Lb3;+@H;@gi+ImgQ5wj8&7yt)bVlmNM!bK^b!#8TG8X&aG$F zCF5L{V4T(Xs_OnCme2e$=9f%1GKN^?CchmO!xWzUG0cp;p|^8|mW)|B?opu5E4jNt zw~wf2<Ry!qkskyrp!}o~N<KX^-<hq;STCQ|_MiLpm@uhy4SLAd(!&#Z)Aa{+j-ag% zKqj3x?8rL(H)NDg%O7%B{^OT1cbvVBWKAOZZT%bmAcMO}=a7tD;Z9EGEM(Go^)3L- zztg(_a$xgs$f~PR?W1FS;g_|npy<!>U7aInPrZjg=RFYW+y^-_*70}nx?pGWwC#>8 zU;1S%EG>7!DeDqxtt^__chz}<axQY@)cX*0{>6@*4g4Lv$0^s6oYMCzznpmmC8Z^0 zf08|Qo}iqkICAQ}3_Aa5j+{sGckp`UCh}DOu4Vb!FK4B7Po2R{eq*j>cg9{)4&)f+ znI+!q$La22q2!Pr>%wX$|3c)JY!|`7@KU%dyc`z7rLYZN2^Yhw;4$zTD1DYe#g0`h zLA{@0{BIlbAA{fc^`2t&p3Yh~rRv?nDt`#nRjenN=(<^^bM^K<u=5i6x-m}Dl(T#o zXK`Qprdj2x-)SG%Az$t41uSloF0x%V8K*j#x1+oCy94eHSHMzu4^&^_UMO4L2Tz0# zLW#5z>OR_|Z~(`B0`3f-gd^coQ15Pj2I@N$tD(kVpM`qI(hG0}d<n|-XR-wA@cHDa zT($1ofbDt2#|~2b$!@1!^~s!1>G5rCuUdATYI5v<l1p|}Y0Fkh@1lofeGke9KZK*; z$FKl?0_6*z!dCb>lwSXV(qDcV)c<Pobj-_GzDw1=&_volS%0@}^Xe-(g8Kf9+>-4V zD19?~S$(@e>Dv`b-)>O)_JGnO3rgQJSc2CY%gNI*m$7{B*SFGrr0Y*sSH&$+l>X%u zx2ZSNO_u#nas^{fKlG5Sd{5r!-yf>H`L4Xte{(3kw}iT`+6o>GLs0q+fU-jcOEBhi zC2t*P`N408+}t%ZuWtDbVShL2c#>bo+``G+iSz6C-yAuj{2lba5#*`=qBibFza04m z<0jdbDa1-QrG`HhS2FzB?q13@iOwVW_?IDHQrZK#bndZG=l{DSXS#YajrA&vDwd!8 za#og4DzjI2Ay&F+O>(L~HJXimVS0@DK8g<EUTrHbc>Pgw1obFEZppSclzihIJr<aK z3$sBYX}z|c!1A+SkFq~akxt4$=MKs~#gTm~luXkc*=zYbc&#8m?#@!i@{3>g3At;U zSihG2SDiyL%Aa>)QL05Ioi_^A*Q$e(p?)o8{WTzKi5=452#MtPmj4e~TOC>399iRz ztnH4hXK~8loOV4|C7&?wWmN~=CUbwOq%6O{n%3)uesR~j@1=^j0ZV!2cysSCl=$r% z%WojtO_ELJp?a#mg3@8=B6*L5I^<Ds3_Kc^z++$&JQmJ@C%}{768JSd6-w9Bq2i-r zX3!?Lkf(E8&ywl4N#37olMpAcHu2eDI@xZLEV9A6u-eJI2-zjyWl%O)3T1;Up=@v! zlnt(ihrw&$LU=8dPS-){ei}=#jXaJ#*?SSoI)2?N%S-LWY+u&7$?pwv-Vm#Nfi0Uk zudbeXrtGz|)jQYxR)w>_$9enZ-adllk{xuYQWm8<&_lA`4Yz{#z!C6XSPbundPd;^ zI0rrmrPo7H`p;(xwn?XuC)*y+(#5ZT71wotN}teeLvuKXn{;03*A0$zGG9ba$?_5$ z1Yd^I>vbsk-h|TQP?lghmgD2HO$qFp)T3%vV~ZX$HLZMz^=^_~oy5eZ{+=0r`g}yV zoX_&rHO1zcxq6BQ!AAEB@)o;CfI7eQ>BHX#JNfS-uVi`;Dwci#b)Wbn*bF~`OW>za zec;dGt?)nacK8MS8Ga2z9RC|Q82$i@;Ez!H{sd*0vsr?DAI<BKO*NmaThcCycO|yN zo5NZ+`K_W@SHY^J?(%nesmI^7kt$_~r988|J#Jnsq+fB9(_B*5<~X@*b|#CPB%5s3 zmkjy4QWo#@lf1p5e4q~;0{cRhLpD^ua3d&NZVXjF`a_MmZ4Nu&7VvPmHB?Lq!Q0>< zct0Erzk}OB*=7io4d<~0eXEf?m17M{cfSn_N~;R~&}Bo2V+9Q)`!uk)N#~V)bZ)mj z7=fJny&F^r*#pY_W8t=NPgn?Zp~`L?tb_$n$0&x<qXbIdi7dgshr*NFU+xjm*Kr!Q zNF=}0c=|&sH#g~+(#6|nu0{s^p6tky&i0ybB!6gtS$<jeo={;&@#Pn8@(Z(8t+kO@ zw(oEc0(D-=+nc{tPD(S7Q?k^+zriS!{pz5``5U3;;Ln6lz-Fl9#^6`56=rbUIP3@K z!U8xCO1}lLGanqy{yO(?mURPmsB~@=gjnaMR6EE@{+g^~dTMgQ4$60v{+1n7emgmt zM<S<WSp)~cqoCwkyq5C!Op)J4q7cV$(_bn7sgC@oIr8g$qmp0m8<qX9VF|_neeX&- z>%H;o`Q<OnFR=2fzPTw?{^_jp+rNPvkNw>z=m(Nrp4m(f!H#5IL%lA~wBN>&Ll0rS z&Er{rC$yStK(!HWlDsOn0c6P6l&*C2z8-4c;EgZ`E{7UpxE;!m?|>)6JK^PU1-u{L z1D}HT!e`)p@LBi(d=owlzlW=!zR~dr)L7P|P-9n5!94g3tb?oJEciS;1ik=|fiJ>; z!k6Gu_zKi}A76#5;9Kw|_zuiO&-dYA_yOD&ehl@Vflr{mvHBTQxqS{ht6yItx8mw2 zEWP~YTTqt&$A*SN9P18KcrBG~Nqs@yViq^)yecPezu`yZlq|o({xGwTeP(?fn8WXG za4PHp7r=Glv2Z<j2J8(lg6qTEVPB|n%Z4hqeo%UD31tuc9rSn2%ap%w2z&eOk(cZA zi*s1-CcnRXUySa2pKC3<5{gpRxoe|!rn4L(XCO;?W}&GPa(~CFd8z>30p3}xJBfv) z+N0p*tv&9`m&jH*c<0$lUzLOU)jzQ)ZI69qgJEzm91eGbBj8v#3XX@nLe>3Ts5W~X zloZAAB3J_Nh2!DNuoQj-%iy=L9O|4^Q17IyhJD}^xGkIp)z8}pmcjjD42Ge`fTzRL zVFX?TXTa-VEnErf;9IZ(ehO#8&*5yS@@<Cl11-UM_Rp|hHqiGw`}qApmj?-7=sfnN z^@Zsi@;8H_0^R?gFQ}GX%0gNTUvNJ@t<9ygd?Cc&dQM5{Kx`yC90uhJheP?oLMUH2 z0je&Z2zA!e;LY%KC|^4h>R4w%#l~~s5O^-sIR6Du?>@W`?gcM_Q{ZLrKzKR)2fPxV z0k4LdYrPEWo$uGe*Wq<g?|#1?YL4}dQ18OM366%hz<hWcoDFY>N5VVcQn&(M3Gam} z^ZTIu;yjjMj9AEe+2jz>?;9m<o0!9TH~C|PN?2awcLT*WPn)QXLS!XFg33}Mz+bNu zb0hUUnVTe^%5iHl^z5M0<LD!qS3|Xd&%qq{JX9O_3RD~TDpVWzI$Q?dfUDq}@G<x{ zd=b72WuNz<+Sw1_rtl*;41Nanj{g5ZmERZe2>3NTAASRGgx|sk;dk(H_yhbH{s{H` zI1Jsf8C(bE!tSsZ_JDP8UAO@Dga^T1Q03AaO1`sLg5y4)nZqJ8?CUSTvWiJn#dg|+ zYN4A_OE8C3{t_%E$5Vpp)u_S@VDXNH+25Ux14%ZO-MX-vMJa?XDm%Tqd<4|H%gdnN zSw07D58I&LS$;OuJIhx?y{lY04uzfBLiswj;&OHxTTJ;wS9yQj7A?r(CdnpStOskI z%(3Vqd2^s_F%HTW`B1jdJG^C!VyJ8Dz2S9mJbVP|9p2BuGANz(E^l)l{tk{2JxZR= z^$^Pje%t(4-9&Lz@xe`!OLmc0mO7bwm$+oryTrGF5tsvOU=6H=QCJUUmj)=k^ltIa z^jCe?F&}2xFjfEmnrle^1{OC-F6pnn;(ktMJ9<dg1yK4Q1asgaQ2HMVrT<~@5V#Ot z2#<hwz(r7c9tCBO?!=&=KWOYpX2^y8{Pw7tKe^ftnpUuZn^Ztfa-Jfb&d+4nP)wI% z16cItw%Yl_Oq;Drkj%4h+@DXLeI{ozoj*mFA>?de_Ozp|p~UZ8ip}-{?aS3$?5mZB zvVoH^jE5oZ+)(YsoBmsBG+O8eEqhpZkXH7;mBmf6gY4grjH{hYy|-K@IS1|l^`3IY zuM45-?nUq@criQyUIv%K%i(=c?<-fmyb^v4uZKTCy{~*7&bJ))fO=o~hVVA1Z!g^r z2f;g_`V%Xl`Vsd)mD9aY<*9Z&*bY2Eo_uHp%SOTSTu_~7?~%%CZb~iC99AU@RAyJu z&t@sl95>EbS>+Tm8IF~;l``yB+=}&#9W5r`O_EP`?gI~YGFPLIWPTn><d>lA{W2U4 zUxnk~>#z#G0cHQUU^{#pE`smEli~aDV)y}E4nKyn$0tyBliLOBf%<!@Yl^cQ2kchi z)`Ji$-IQuJ88vA(4X;XgPxC30$nSDk+@$l$9^K$bC-Zyclq^3(>H8~e)VjX59asl; zrbi8%Y2W=>HVNoa_$TWj_1vWMN{_B^CnvKHa!M9nV`=p02PN0Wj{J4}9rRxrQNEz^ z@1H7v#qXb5X&q5^_sXmD1mzuoTsrqa7=nYK<QVM8yOh6!ezSx;>39swrU7{?CKvu` z)4x;$H()8xoN6Lkh`()Js|p0pX{PE)-{~xFlAO}l+XowpUXp!RxGmfb?gB@{LO2GN z!#&_k_;=U=_k_}SFDO4uXO{!X*RkU)n+5Dr_&>JGRAh3K<dj`holBj}@#rPlCqmh! z63Q-BP<E+?vdd&ByG()7b1IZQ=CTCG;fu&qpRa&rbH6=`9H(YYBBe%`zO3^{m;U4g zqKh31@%p*W8}##9<diH?I0V)~$yL9W@^2B4ztC1nj*v)ysr+q@{BcMAc1QlXj{Nfw zBY1tgBYDz!dzLNz@>f+>3^i8-tV*Oms(|X9VvCz}UfG|28LGodhdc5wgp%iowUm3S z6uF1}SLI&f$bFI{H*+hEzpu&OTc^l9{J$#q`HtNGbmYFkkvm;IRe8uywqpqe<ep$> zOR*-A{-~RnF-xzX=)6Hcx!RHY8Yp>|IdZGd5NtQSat{c|&HTW;l0VJjHpZ+;_S+rV z?{H+l(~*5XvIpBxuj~T@vR6&{^F$BU&2%<j>Bzmxk^2!x?sUGAi!N#>^t{WU6uFJT zL#%RBs;|h1{+O=Noi?U>?XB|$edRgilq}Cf$@8KkcO8EReWf3H-C5M180?q3u(YJ2 zd`;85G?3SqeUqXm`&eE%b)KM{?;w}X{couAzw5|Z&)>oM|6Vz_Nh4>Wy_LhBiIi&N zG=c{GAf255ape5Mk@HJOPW8uw{;NLkI?l4KU(TxBvLZXCkPwkS{8Ad@Nv0v5ZFEf8 zPRHHC$^Qiz^qY=fr~M3XJGWgxmi#q6JC$0nx{B$vpW!X*bnRR(<Wwx}4OQ3r{D$03 zte5}FUxx(cw!P>OtK8(bpyZY?Nr&v@>dVHi9QP<t=arqk*I%0<r)1e24uV_2Vz?EQ zd|N~H^J-aw{fr&RlYgr$xA*H&SzWxQ2Ub!Gz`bVl_UUvE$t)jnueEkSCY^UjxRLUq zWZ2n}wMKsjp0oGLx<gRbKPIYa*VZKKXh+sDj;y;ovhLx?x+c5s7?d^tj|r<fw<cK& z99fx-Z0uU($XdLXvhEa+byD?TCu^l6Yn3BwwIl1KwUl+|fUNm{p{&y#StE|DGaOlK z)>78L1!OJ%gN?!3_&~EGYs`_g#gTQ6BWt?;*c5zAF=QgkE`C|7{)+kPIh@B$I(IOp z9fGWq=TNu{?0|d1!=Pk594e+A#1g!3?A2vxK$nrD{#<QT9yu&-N~g;S$SPe<gwo|C zC|yp5(&ZE=U2b9t&Y>KhY0G6NILxn0QJ(3t<*=8VQk$6yR{5KmspNRNZ2p-)rGepR zy?bg*_Jhvx@7-1dp<}XpBaD)M+pd&}qw{U9`CoFYOndQ5ZI;qS=qWo~4hO?4;I8m0 zSO~9%jqn;c2QGu^$6gPQhBv^c;Bu(>>bF4I<yI*B-NF)V-*jJF=hSm-!~OQF%KP(% zyF#2|0~Yr#qtqK<e#@d`vajcFCD(#q*`FB?x)zilwK$oA<d*%^A5r_Fv=Tj~%VUuJ zGM<3yJ3j@-!>3_0d<JS<_&In7d;$IdUx7V2?yFGtcn!*Kr}B5u@9H_X+T#cu;kTP} zS?QHF)$cmk*Y9_W$w}jP1ITu*rW0B#<|q8nt}pdXwUMKpg3u&&oYa-d&emb(Mr($d zEH#sfEPY<GyYB!yuybG2H8or3c(=9(DE4Lz_w787RrlMS)&Eg_vM*-i?B+~5n+p8^ zD`KM1HD650b%JvPzlUOLcfH$>df#T5|5YaP2^GgHPX3paq0IIj90$LLx*zu=RGs++ zo(q44_d)Dy?!jilC-~VFegM0{*~r@y%Cx=UHLy3-9FM+mJ><=XvRps71KbD}!TvA` zH;0$OE#SRyODJOvf*-@da1(Uc7VZvrf|YP*C|}%%a|N&eMzEj!erGt+?~7IWiJKkM z*}_d(?jHo_?7k``d8^+a<wOC0lp(GErN5geM;pMxmvijhJoRRs40|_kBpD&IMJIRj zyfens4qwYc^4}|*YrmnI!wScVQ(ag)H)1T3b}oj_wsz-=WQN_@25Q9_&HZtcY%8A{ zNQUMHDUG2lWbeO2&0ooZiqpAp0?dP|1cmS@SOl+x#ZdZ`!c}krd>dB4Z{b9!reiA9 zeZzgA?i=n4B~utGE=Ay2I0NRx8mPHvbx<ld!i8`qJP*!>*TZJ`Fl>SPc5Ewr6}Cam zL7N9P2W<iT1|A51fd|1X>~JU?1pfi$YaLKNDP4o@%D>3#%klursDMxI<BZQL2)Rky zI?3@!6_DQ}6-hiEX$maZF6g|$cHubW)bWppqu>%a5uOBf{eLQq!PDRzcqTjyo&_&~ zXT!_jc~JVC57$QTT~qY7<GcSYy{|-0>3tQH-pio$z7|UF8=&;Q5lZiyq4d55O7B~t z^u7a1?>k{<dOyW_o$C>n-BR?n<HLW2-a2ovyjLQpWLX8J_oJ{HJ_aYlCt*8$3d(m^ zL)Ft~q3Y>#@M`!Xls+%P&h*xOe4T4F9G#-K9q9P8^j^Yw+@$kLZ^fY_oXmHTQ?k4V zrT2$$BK!!dyg!91@6X^I_ytsXe+gCIU%@Njx9~pr9efS`0Dpo%!p%7EPf+^)3}qMD zDtL|YHR~nYXK;+)E+u7E)p^yGb}C8^+qfyURjOdsZ^i(B?|i%o^=hRCve0X?vy=xX zGVGK##f%qN+$33L%l>3M>SV6Fp^fpqq4w_s$G{C>5$p%2z>VO6aAT<FOE!b&z%AfK zaBC?041jmSf$()W2)+Y{K*_TM?1vmXLdE!<pyuW80u|dw!5X+Lyd92)cfv97QMfyl zt@nT`lVe$eWpX*|RVEi|dw-c!<>i(o%0xcorqnVCvC3a2GPox$t4y?eoTWU|nK>dI zS1Q*@l0`P(nBTICQW3ICzEY@Tmce1L0{$INgyUc(%!gHQZ#W66UQdSm!f9|3+y|Zv z_k%je{!lW6q2!qke}OaL_Q+EMN5Loz!#b#EAR6Fluo233GofsJ5KGX;l5ahh9F{#& zZCpLA!akG6>O{&){N?t>R04h*%QrnXPPBdA*rIdGrd{DqEJ|~cRr1V(>Z{C$IdFla zgZw1epFA5Kdy=o~p0R!%bU&fOzWQt^Te!)uLE2g6Ic%F$NwdmA<P2bOzq6Ro=^irO zBw3`>Mr15^GLJ=e$#)7Yho?cs_cLK5JR7R}cMd!ko(nI8|AaTf3!yIAFNSZxOX1h> za@dXYT>;hKx)SP2=xV6z=w)y!ybiX&>tQ=w4v&C0LD}qPDF3*MCFmcyte21P0so$A z+sY#6ZcXRbRc}3qBP5NfYrJA|JpSQMk{dv_d-WLNZ~ME%Ts;m+{B~ygs!q&jag$_~ z?R$~Y<YeB5Zj%2ID4RbDr@<#+3w#o)EqxkZ51)ni!snpk-ShBW_!3lK_hl$syaHu2 z#meA2-Mu#3Gp)^>!NUK6(bmRh@1vV+_BoWzzJRjX*HAY52FhmNLD}p_D4YERWwW25 zY{q0pW3x;so2>(7v!7XV0`~&?tV3Htepk3x(q`^^@GD}C&GB%4V_Qp8q$WB$+8j4y zWsBLvO?}-z64!_qkdyQ}x!6*2tk=yqE_Gev_X0C;a4Ww(9}ktI-b2=a?()jkXkClh zOFp*&OL=Ck`5o6L=64Hq#g1QG!3KQzRy&Nz)&pru8Yr-rZ5b*Do!w2+U%tB`8J9Sj z>tQe1Bpa5(4Pia(2NlaVf``EV@JzTVls|3(Z--k!&FkG7ehEV`15pM*&HEe-w}RWi zzrpR`QE+>xHhTy73ET;)t=<``{Fbu>zgsk$^@@3Fe{z!LXTA@<Ps{MIDL_+ZY?Me@ ziNDgfBnrFz*=7KX8+P59o=yqa*X=7dI2jB0!<IqF>=lo-*EATj%jPOOH%aDTyx0vL zrN?NvJ=_CoF8rSGK$rs;!d!SQ%!l{GBACVTO5v`s464st4rP;xP_}!VC3qi9&rjhQ z8SlZ|r0w)veO0l2Yr^NOc9Y*|X&Wz<a?<l<F_l@uV)E-#$r!-m__elKo!rJ6QI*+l z)1vxkoI8iSgmYVGmR;{*ag+23wt@ShzjUmHxv&ma!+I#YHbC`9XTh6b6TBTZ!zW-1 zd=Jin>v8-xsOQ<*q57Tkp!z`bVFVrs)&D#g9uE(NSHXY4>)_$=KDZFR0FQtwpRM^j zSU&Tpn>$JtI4)Q|cF<l1cay(-%q>;cCW}MX?@x}W`CFS3>c?&>kZhLn%$is;j@@b| zL%*NMouRKi>EjC7*<X=4z--!RD#XW$-+W}dHE#0cRdyTuL~x1|C?kiB`~|M^zLmvI zvX9EU9~p{2N~dB^+3Y-649|xrzzg6-@FJ*kz8Jm?FM)5s%b~s>wiIei=}NdAyb6wh z*Fe?V>tP4H0iFey!zbY_P|rBs1~nFTJKP`M0rfqQJE6*1=L(kdN9-?|HMW!&Ea!bp z@anuCs+|4RPUWnS@H@*{g{Kl7z*3%R3ols_e@{WFoGxH-lk`(L$%9UHGFM^`>HHKN z2cLnH;A*Hg=2_SQUw}8m7vUZ7b*NbO22{O#6ZYZwZ^0b+4%{2Q2i5$20569h!l&Rz z@EQ0qRC&C}5}em^4dtbN$mK9USRNH6_Vr2?Y~Ut;%}W~@r?aiUDmIW4D59atVxfVz z&CAGShK-D)$rxa^u#vGpg*KMoA(PkG9FEUxY-+4;h<n?6m8zSho616Jz2ankhb^S< zPjEKuvXT8JUN@-n>JD##J)o`+dqR1}daxI^><!hPuMda9Y&afn2&co1U<=#?>YhM< zcqZHoYTR{8sCxt3z+I4UdpI8M04Knm;Vifd)bo%-;bJ%fo&iTfmDMPyGJS?6Sf+Y* zUOMgu3;bm|p{k_vPkBdBx{Eb^EqXBLb&9o-AlO`^hjYeccR^((-MiE8OPt^CZJl>K z>l4>}OYJ`9f9a&M)UkE_rj&~fq~|!eF)V~T!(zBE91mx~QmD8%0iFUY;pMOzJ_{$o zbrE1PRQ#I;m%)AEhj2Pvhx13^hOh>13u~cl9EB>24_Ja@-m0gPad%i4D2x1DTNF90 zcay(*Dd4H{`D@cuay+%kZ}yt@)^IJRH;qq-EeEi;{kl%R=dBV^z)^BbM8QHyFZ<K_ z4NyQSarf2Evsz+v&HvI>Wh8x%aPsG18~vUqo52N875gAq3=f7XqeEZ|q+@9MeuqO{ zk1vFZeMdmqcM+7W7eh7h$3TtK91CUR<DB)a{2eTdT*^wa=p7S9fwCxBV_BpPb!$~P zA<j9Fg&xJ+ctLZ#bphS@?ChP$vQ;J4TAwU4)t~`pYa8}DDKqa)vFU8S7==k84m=dv z1FHwq8fyykIrjEwxTZbcXkSy}iM7$Dc!U6I@4jAQj$vN~szRS-51Md_*PP$3Q>Zp5 zC7t36e!ZbAC&}jWiB0*v+Q~bUGEzDG6H40);2!WIcmTW<Hp9!{N$_%bI$Qyl!F%8e zcprQhJ^<H8vWKAR?<%M<n14Z;<uRyd@SlQeAD@P*-_O8X;j>Wv)aRgL^9%5O_%hUc zCSHTOZ~How@4Nx!gVH|eW23s+IRLxB;((9kJE2#8?k0bIPwQhHZ0ipIi^=IU0Qj6K z#FhhC)(`-^&U84Nzt2Ka?@G?(+$3Ggi2@p`j<Glg$Pu$8LSm+YDt;m>b)vvd*p;N< zr%;zVQNSy19$PHO!AM)OLoKwvKfAHHad!J`Q?X1t<T|;UX(cz(b+e~S{5~u2yTKkk z5eYlG`uAVq{7zH?)q(lWNwleaLUlkDzRAh|7#|wK?@!<^@ISBwehE9^H&AWWx9~Rj z9hA>AIBvc@x(?L1WEZIT*B#D;J)n%=6CMZGgSr;$10RRkaD5cq0LrH~gtGUha1z`c zcEGLR#c(_L1Kbg2N(Z<R{2SaJj(~f?QLq*63gd7zJRgpQDxN*zLogRU2J_(aFdx1S z3*eiu7=8jv;J2_G9)p1=!UteAd<#y3-@qxb7xtYBLvR{Y-Bi0BteY3HUUBDKSQ4n4 zZnx;Ks+$8jZy^3BgK(nCD%N|Vx3?)*qiG$x)`aZNI$+6GMZEyy`2H4zHpn(M-da?^ z(bvVCq!2Qwn{7{)t_2Cs49a8c`|ZxEf;owuJFSA>vWb#jIjwf43ni`OR>{)?zvtPb zC#vA?l%P_g%Gt3#%G^yVYt^|CWVoHpD88Zcp93}S)Cwj0Jh%iN2rq^Q!By~JsOztP zK=l*pWSaYQhr>+HwFv6^`6xILE{3`%a12ym=r~vekB9rh6QSznsc;cI9li(8hI>=T z&W8uW3t?|$zX)CcFM~J2rSN`u1ymhc2H%4>LKWUkaC7(o+z~zqhr@^9Shx}v!d0*g zJ_-+mkHLlT33v^B2C6)th0nql;4APY_%3`IehOcKpTpPTPw)-c9lO5+bKr;Y0QfPC z!%yI1_!(3k{2Z#T-p>+zF60C3qWd{-!@d1=HMg{+sLW|fRaxAW<^I74Vs_uOO=%9B zB%9LCs?cDza;lnJh2*5_QYyJldZF_>;e?9&x0+4tf6_rd*pHv?n9YyqEWI)|vHjpK zP|aaisD5xas2G$54~ISBsjwHk7WRP;z`juZsSTiN(}wUTxDk|Z_J;?<&7t}{Tfw{G z*6;y15Nd2-5R{DvLzTr6{tjMGHd0m^znBik`^%!Fsvyta`cnmRlfNX?j$gp4q~X=C zSW1qk52H~q73Khz^2`~-=rCqykJL6MgIHG6+DJT!I76f=BfD*6C_&x!rk$N_Mlyym zz~Ej;IY*nZz~spAPEN$;lqPd#%%_Z;=liV;v3N^sthT+z4$=-uN|2m-<{Zr)tU7Tp z`rn)=_4cO3%1>-n8?kpx8pyGoo=P*c@ddv#C>J-WJmgnflJS+3Ih68K8RftNI1Ywk z9$WzPq52aA@EW)`)Hv(}sCma_a4IZ^`@?Fe{=+1A7n}mWfK%c2#HfAXzHnc7BHSOY zf?@b8oCzl&V-q|c#^A-U1>OeR;72eHx9-XqGaL*Lg8zhvDjz);!in$*DF1wiC3yd| z4!IQ9)v+t}`=^N&71e*rBl_~P!JK9Q3;k(3n=zEk7-p{O<Q9$>c!S5UWGlJBV;5vq zQt(i4*~jx+10X7M#Q`@-N0s?{WYjvDOR$ObJ`L*H`gEu{5obbea}JEdbKx2AJgBjg z3!ugkFM^uea50qaE`hSK=B5VcHecVv-alCiC-`k#Vn;DL4*+RH@dcbH84)&iY-=s2 zF^twobA8lUR6QT5QJ$F?@N@e~_98-?&xo`|=^NWBW{(nUs&$T{e3gscJl5LYX1DkD zfUaVF2m_N;D~qB3!o$1q*H~y?SF^E1(N&6bPWMV)+5083eS<Oz3+*i4YqIHyO`D_h zQoCoTu{yIm|5@SYL%(qDwT*5QD7kKyZ8b{#zBllDv{fRpzL~1#-T#Zg@8hfxiS0iL z{I0`2l>BWXzU3zQk^Fch8CN^`H{f^j-`ij=yaUQecfteVT~PO}9)vH$RqzM+FW8%7 zJPLK){}>z%pM-nCr(hI51CNH!!fW8m@Kg92)STAWq2{!{0lQ$pw_#8C4qOEP4KIQ3 zLb=Gtum*kxm%=aMzu-4;90vU!&VxU~TV>$>^w;1z@D11%s-M&it_OR-zOX0U1g-}U zfxX~4us2lcZwSZ0jbR(y44w|Rgx|ug;V*Ci?1r5O!Y$z_xDDJ5ZU@J}UEm(D3GM~w zz;SRP%!6mae5iPE9!u~(&P(Je_N-<p^T&fp)qlzevpNZbIeLhtJacxWZC2VQ)N`-D zgDu@8`Q&H4Vcf~AKp)9G32qCgKn0g+Q1yKuI1BCzb#LGR*b1k^!(jw!9JvOb4{PC- zunx)&^-%V@pJlhe+zVY#^mo>kC+*eP-V&Y{Yn>Hs4YxHk*2Tl-4p?6{bW@i5hw0Vo z?N=dkPTEdJv3pVuHoQ4O#r8&qvXzrDoEFA*WSk7MhaA%eE&4~=fZxs@ji%dSuBjB- z+$0@jQ;DRGlG1_bEWQ2#_k{c~{g1<;`X3A7LU<(nCtL(&pT$tNDx+TgJz%Rh$kQ=j zf)#0P#f|c4YfG#t5|3JoO=ojArCO|oRVfymPo~de9m$O0X6S2iB7<ou!%Wr^Z`N>g zXV}xv)P?ylW6MxtJ9~3+2*2GHqP@)?K6$0i^}jv53eDZD-flHIkwqh7&zO_QGD88w zO}$W6ad&NRvxgg*$YWo1Pr8^wCf9s-^Jx8{y}X^!`0SQ&%;Xib&KgL0t@wohfuMTU zJHuRZpJdm0e#)j_vFW=+Sd#AIRl^WVd1hNpq$#T5>Bd@f&I)p^7G{l4<hxkcAD1BM zd{d#_)Sge`CFe>w!{KIY`IG$iZ~W3Vk<v-{pM30exD7l5?f}n%(&QXC5uOJd;Q3H( z&;?L-y9}NLFNbHrrSL*{CA=D51#gE}!w2EDP;J+BP=0?s%tDqMp!(rALiGukL$zHu z!zu7~C?nqqkA-(b%{#pZ>bmYesOLEDhxfyW;J@HX_&Qt#--M4qmB3?AZQtYYOZYUD zQCGtq;q!15d;zK-_!685UxqdCb=U;ogmd6q@KpFNycd25pM@Vm)!$E`^zF~Nf^Eng z%0zKk1FRF1_1t{xVv=n`I#}(dEccHLcOsK&W3msa$r}fglg*NxyrE{KmYk5uHO+`z zFwRfw-0GW|`Abpjf}XfwCgiB|*p%2h+FTp9_hsCedWs3flex=mpO~^ot!r#;izkk& zGs=s+>+Dh7zP{IAWtX78euo`ptDc)$zw8a?@w*R{(tY8{FdJSBH-tC9{!sq6DSQNO z4&Q)V!hgf9;P-HAsJ>JP4uAvTAUGHff!n|wxGkItw}ZORy**qAcZA2lo#4rED7*&_ zgDc?(_$nL;bsf1Y)O(J1gBph(1NFY+Jzx$T3ya~NuoC9L{opuwD9nd?X08M-gQf6R zI04=c%i#mC0=@>TU^nbK4fcZjKs`Gcfq#cH;51kR<*!>JV{i`i7aT|Z2R)Nl>G#+C zg3{{0=nkU%Y$wh-kfl5`&oo1!#P8<z*>=L@5V8iCP3$*|)Rfp=DonUk`(S_1GQX2; z!#IAA!EbC@iI?ej8%ip<7pU%omx-Rez5hEJJGn{rk>Bc68V6O1VNcm?E*u2sK{aUy z!hPVuFbWTasvZA;XTlD62|Ns50gr%p!bR{Ucoh5+o(R|FTqi-j$N3bfxoW3F&4)b; z7Q(Y(F+2}e!3&}8Ze9!*z)Rs#@G^J;yd0hhm%>NkGWb2b9?Bn=L%qNGCaCu}-wH2+ zx5G=|op3q43qB85z*peCQ2uitl%J{21^sL|>t!?Dm#IqQXKQ+fJ?-_jTGnK&R8*Ww zj%Nh!clg;r_S91x+U5V(&$3Zc$^F<Ue}2Id!Y*!-J>*vd$mr+fKaTxmqt#G;^(>TM zJrCtqFGBg%%TRvx3Y1^H3guU?LHX62P=56`d;z`#RW9$sbvW1ia0B=u)L04Mr8n~o z_^!HXr}>_CM>+X?2ilD7^KIacIsE2(rDpu~dw3|ne}cLOrI|3#i>w2$;&)eg8|(%Z zFZo`Pxd+_?>Y9{q$8>Ch{(R%2V++W8+s*wt-v4dnRG&IHcCPp-+w2aj{r*!_P+d}1 zSiXj<3=M#UIDp?@6k!7XLXOi18*lo;YN9V9fH0}6wUJM9Wta|`%JY3~>Lkgh@|0+= zIC+E6M>1~%Ri3;b$n?i}XN{RN$NON+bF{pVz?3J?*PH$r&n%g_JUmxp=E*as(DbvI z%Vyd)#;Q!a#x<&W|G^}fk6jOd`@t~O*jgRb*mpfV8@9mZa1LAn4}$N*gQ425qoB%T zG1Oe3<Dl$)Je2=vI?b+u>l*cfrQ@e8$l)gScPN+1xs@fk)g{ie9y#t>D62YYZJ&eH z@KcC=Y=?tJA{?0?Z8K$*EXJBxtks#xs#<Kf^<4XPkm)ALt}^ppPyZ8LrOyRWG5<n1 z7G4Ic;ZmqR$`w#!&{xC5;4&z`y%wtOT?ch<`$i~#SPo^Qo1tvkz!LOvjeU1#*_>r^ ziY@bVtJn0QSVh3T?CkMqw=X7RxJl=c-uyG|n(`k&E}i>9sPjMM$f+_9$|)bx{hnoT zieJu2W#h}rr`Q*<<*<pH)>PbX?fmU;EO;;W-r~@g+QUn2>1V&l!qrz3b=0|VQa!!S zZf5?M?9zQheko=uJ%+B*=W$2(C*Tx*KMhsZtD#QyBGd)j%kT~O3j8;G9d5;O--JWq zTd)AW4JX2PU>Lp&)h@pekAxpUwa*_x-Iw?T%BG(}`N&Z$!RK9;lV@xX_f6V99uK$i znZa;NZCxGnqclcb8=D=DN9s*j^p?KAC}g`Fj<rQ!MY!h3Z2RKz5Lqd8XF8c~k{k`l zx-L|`P&%6~j$~sTsbd(VKA86FLRiJ`i=h1eVmJq4Q)Ac5;4*$+4yE_KEJ3|zlBZ+W zvh3&6yQU#pGb<c#ZLFEKpgG#s7OsoTZfsic`}OXh(JTAX?Kr+k=73=tq>TV)BTt+) z7^&IJ${E6sq}9Un8siPIb}o-FxxHjJZGMG4n)zQk$YwoYzLS3~I!mvQpt`Fc!;$b4 zxE~~Dbj*OCL+OrvjEx@T@3Dbcd^dT0SZ-t4-)Ez?1<mn>a9bUoVa(OmK6?%JabHP) zs_~1qcxyB=+l1O;4nB~DuYpCI>*Eck!z5d{?xHX~IPp7iI*rJL$hJ0&wzkHcmelr* zT3F>K=^;CL?+g8c-qI~2)6R?S3U}dWH>hWwdceJ57L>huLe-!3pl*ZEC+)Zit`B9O zzEHk)63gxZJ1S3Yz_Bc}scxc<)kmpkDOL=*TfnU3-?VFPWa5n%7_5#*(2Tj%sT;te zY5KY@QRPtDpUpb)9my2*9mXF_TSe?K-(qFVr9(x-wXS(z`8F`Z@9m&;*&a$~^%cei zbY4PClvwj1{RcOpb4vX(256*_-GVoy<Clr#(Y+wMZ_kX~&GQK5nVIJLj*`=xKU_P= zO&(&`5KDPxL!>R-(i*jweJjZtV6tVN?CeMR+q%t6<{k9PzBW-w9Z`_PMzO0{Lj|R4 zFgp@Q@Y=BCbUO~#Z4(};LqC}~^enTPs#S=^N>tZUKbtdVXFuS}X10+jCbcaZH*k|| zs4`M*D0T9Arpv@Y#;J^dz7H!|{{h?wGN;S<>&Nf{elw0`zQyo4{D$9*XLVq}jIW@s z3BQK;bjEj3&%1E_X4;+~V2Iy8!yO_0Y;*tUSExQdbG=O;pNWCy{!w>$HTk^n#C-dQ zXJ5=UA@BAv_m6r(z2ArD3p=)k%&#+jLh{U*8kaa7L&;~psJUmp5nRIWjp3D${(Z;m zka4(<?;&$eJN|}!HiN}*b2tUk-|W~IZV9JD&ebskhM;^^abZlrSC^Bgn5i~n`fvKG zanTT)xyj?Ap6a=<Z^A9z{*un?CY?{^>WxR+AfIHQpWJ~{XKV)*zZv)G*d6lT7<1o+ z=ON6yC>Ve2=pcVLxD<|oSHrPTdhjfO(RVE83C8tl<f(4vz(^W>+Zvne8F6lo#r3^9 z)ygGo?Iw@PPOa=<m1?D8{001N)sM$beA2L9F_{C+M)ge#S{lNQ&9zZ`KP5l0#@+)c z<+ly|H9SIQzq>nxJWoY;Z|{W2)<c7B?M-$f|41_ISt4zX2kO3fawuO_<8c;}x`qvq zx6`oyjP^RN&g>HeadOKu-KNBL_*5tFVR4ger?T6K43(o&0k)Ps3*p}(V{)c$^2~~< zo25_!l*4~O#)>;mgN%`wxdzpcK1;?VcnzEkX~#3Bz+2!ns5WLlcn>@PJ`BT9O4Y+p zVI$Od<V-jO@|>XgZb}Tw_jSxY0=|C_+sW^4hg{#eN&P=;7_N;qN5eA~#G~dDGIE6+ zcN6Gw1-xGcQ$g+t*8Ah85Y%FY$XsZwoyba4rbF3^H>pzsv!k<PtqW|+CHp_g;wH%} z`)@*qqNviyuD0%sg8lftD;xlKgTvt%m<#uSm5_OUCPwZBPvCbBJP+o<RWKhu4~yW3 zummbL?hVJmQmB6T1UMZsPtc5Ol*2>$JrN!cE8)4Y8fqM45|o`MLzRc_vjofInXYyo z*(%6&wwv7YV7_+TUmlCyO(52D6XoF@;wqTm7*EtsUjeBxTgqM`7G_&SYneUPSc84D zv!|0az+`)#BU6DElNl(`3bH(vR9iKW_3L0$ppp44rk1ISdTW_nW-58Ua`)ET`K+V~ zP?AI~u-3H67-V)-eQJG(+kek(8XIkg`ABMOb%^`0j6OFzqcvh2D_OTMpbXq3+sn6x zk#VY%e*k5*BfqCZ)$s_F`ZJ(T6orkj5voqlg!jT(kUn=t6Wo+zHAB_O7#sszpxX3S zsCln#a3*Yrx`tzJM8`RBKD-tl2v@*^;A8L*_zFA}egr#UCWbl;%3w#r!EiC8?Z`M9 z?g~$a#G{N;;0$;woDWZfC%|*y6||S<!Da9QcqhCVu7a1sPvB+nD|k8l9$o=^V!x}P zjDIcEeA*izHq2NKXTzHyvS!=^PlxxybKwJ!b7VXSuY(Um_Q_ZYRafS+1n0DEL!R2u zL0X@zD>bp%Es@q}xTPg(uS!^*NLh)$bc0M?HdUHl#y=vaci2Didxi}`=DKTWa=#3n zcPh3*?To=r{`Z;oeKG1cNuD2}<nF`8#6}rCvRif73??tswQ>m<<`x+aZL_;3v+X0% zn>#CdC0De!HN;w}`B4T0?Owf;D^u3>O|ENiiZ$13zfGO}vXkrFRa>&^IxMhrMnzRP zza+0ZTvE-Xz`QUoZ7(gz2(dc8fz++84p)sUsSa1?jw>w)>zzFMt><5RXAjPnf=X0P zJF*$BX^OP98HpdK(q?Ln+7UBtEv#_`BbC;z<6oy9v8<p~UHq#|4}x2wy|Z7~)}GIv zF<KX)BM`1{jkGin6~dS@9%V{ykL*Wu{0?r_P7PP*g{vo3lonL+LWA7Of^bE7Nm+Hc zY|?~r1(j8NQ`2tz>-wHe!+GVC*k(d*)p!cNNA{DRqm_gU*fT%BAm1LAZObe3iJ5k@ zj2s=OB+NMqDkl`=Gjxg7bbj2%*(78)si-WOthK2E>3mk866Yi(W%&hDtw4h~%%c)W zMN`n)8lKcVt2s8WIb7IC2d*&I%4LfwKW)_A-KeD5OeP5Dw$`_sSC~jIZPCNsViJ!9 zwKSRcn{drj7>&f+TceCp*v+!s&D;Z3M`kod`OL6gy`H;zLSvh{lHmzV2xh(fNN4F4 zTwl=|Yl*hT7nlOj7X92U+!K_y$D10PqsFq@V58s$dOu67t&tLUrP$crq&gN0Plz-x z2p2OWrj1}>r5NO{ch6DC)pWR+aV|u4HyRw=s7jrpz((7oY}6EsyBoRUbObjlw_oLx zuSlcA-1QQ-kok>n;j|?*I^5l)Djs2ks+@ZVbxpB(iDFskuFs>6C0B3ZoZ$#}^|(lF z;^>KkAL*{mZ=Bo6?&B7O_ldT~5*A<Nu6NB<8Lf-9M)mBndxE3fP4c5N+UvvREs`T) z%Ej(leR@1x(i|?BAFT;j*?}O{by?wPccZdsTO7~hi@Q|`5sq<Jx+3WKm1YX;KxhAB z-A#0Gp5%-*hh@)FVjv;Ip5r)on}lN&wl~+9ZS$jbZ5i7;+Z~^>9XBE3txRp#Va=v) zg*YLxsVYL)@%x0}OWf6^v6_hXZcA+9+U^W@6IZv23K}n0<g?thd9ijT?3UqPg<M00 z^9Z5Q`Ee6XWWICV?Xa6nT-3Cnj*@hG@2)GJ=WgZJ&vA|M*^w5moqA<|rv9@@>TyO} z=QdI)n9;BL*~rM{5Vq;3>(byh_4C8CiNB2ulu&Z5ZG5<{S2hzUQnz%vZA@rtZM4?l zBSXEii`1hx$#Z7R9gQz&QF~dh`o9euu13+$H>7!}WBydH>}S(#)@EYR0NOGx)~dth zl_dpb)#iRuxVmyufqBWCTuEDG2Dhjvud1%ft1RI)ZgSU8+--OPL_ukILV11x|CN=S zLYqos*tMf&cC3ce6qQb^C=M5vS5C;SriGZmfl8_iOvSL<wZ$7}1h=D^oxo%XwG(!u zrg(cSxKa6}>e7-j+d|u|LPe9Sf?HKhE~4|@BYSICZ#5L<vrODj-U-rFc_xe}TvN{d zHobzb9c_&>+q6kpUU_~=Sy8xZ?-D&M;I0mZX4HFES5)SiW80la)f?p!JC7?V8fA*X zId*eoo_FUdxn)(8%8E=}vRgzNVl%y4>|I`*JI)w}_l{?DmGD(1`xJyL3noq~sG@UX zx+Q$Xy}$}t!&d8Pt4bnIL8YgpRE%2NCAhXUFW+dOmF5KAU0E5PY&vhe50p}jx2oZY z$DO;m8*@;t7@Sy9-xQ0~GVk8zZ<EZQPZdZUXxl`-ow#XwjXKbFi50OKGusl!8Is6u zF~?UQEZ$w7twcxD%GDH|8*Q>dZ7*t=F@)>ulxPv|V=Y!e_k(^)KF-}M`?*Brsfe|N zE9iX^Ycw9Cn)Q5QrF|E*xv4=fuUGa9!8Oj1{uUWo*&ks`6@m#5VM0z7W8aFr42@@H ze`eQKwM3f3m_94}gW%@Xv<P<lL9AA^P{BJ9s+u@aO`Iq&VWKixLln=-UZ3#8Mw270 z;e3r_<ZJFJ`^3Y1jh8+_i#?uB_c`5jbG*3SJlfV+PcKU1ZNlmS_DB;<gqvVhpn$Tn znYyR_ia6$k33hv(xl8iQr4)W=XO>-5DjdPDfpnoagk6ZoMlKtPot_erSUPHVkKhQ9 z?~!{0*1nrGtI?&84w=lO(6X{u_$*x+ZHvauw%f9<S5gmS!IF4%wlPpuJjNB4*-rX? zpELsvqv?p3ahX#~BV?biwVUdY-IIqjrb&0m5Zh_&4$W!eY@-|I+C;~+N75GOJA!j9 zMNfqA#dSqn9erLS)~3m07}3Y!i*#jGq61m=Q&M8=HYKWe<nZxj)Uw;idIe6YPYCDE zZ)^*j0_WQrrohcOW}dme>CdL0_>5Q);UbS6<k^RMcA)xXWgp?mFn(!d+MG2J-$5#k zUWt`XK|7x2(Pk_5ywKUxH3eJcjf>4UJL{Z$5kpejLt-i`xI8<Z;6~ANt$`{cgrkD_ zagJ>2WkcXd9x3IH_xe<zs?qn48ZlI2zvazgW1KsD`<F%MnSHa_*IyXM_jzZNv`SVA z)$N4A4zq`%55$Ob1^0p&6EG{K_Cvn&D4XJvU#N5Asc@#o+X}BL7bZGpnI4E|o9b%y zv)l@)?n%0pVVbn8>`R>Ux&`I6kPhvy&Yn`1JI6gmk{4@gwW=Ah{rjc5vz#F9?p%Rq zWq;$V42qY=P!hPsbI!_0ZDXXVs1@+yOFdM8|D==wzL(hhLoU&|GL?N4Bi;V5Suc?a z7)IB6!l!XGdtOB)=HSYVlgoKnEVp)MyBqvfc-^fL&9ztw1ES_|s<4mS6{S2>m?$h> zV5C!+SW`8(o*GwU&(fD2itG*(B8()?H>McqId)aFiHKm1u2{?`uq0ARb4{zcGLAHv z16jXNXydzG!41&Nlu~{q9x(@!ZrfOqD0{SSipF_B!>k*?x^Jz$wJu!*Rgvt(?#O`$ z5UeU=Tnr>4AH9Pt)1_g(t(m&`=J^lRAis4??APFe1|ZtG*e}sdnZl+>JvBjAF0~C) zc}rvt@5QmjV~(SzL`o)Agr}Hiau_qq%H|6)5@{SU#~hb0!|Asvp~@)xw^=hvjOFxc zROXSk7S$O^d^uTc?ixeJG8K)F4JzMUnV0BsmgY#4DcFAOv_E2SoWw<7*c^&y73`r1 zTa_`50fiY($ja6X^rX-_v5Is|(Emy!3%Gc(#i8gOr!R#BoP5M^bDYuEVnwPX#Zj7e zW2<t!6+4ny8Lj66&j_jgueFAdMs`aLT1k6nn2Jkz#w=t)4H~xU{zy2^IDS?(AFXix zmN|mzqwskF<y6sk3YT&<G{KI4OPAiPegk8%y1Z(*ab#ZbrJpv0C|X#hRNXaHhf?`w z`k`$LbP!3QA$<0d#kpOOm93e~{5G#oH9jiOILGd99J`9K4x_F1UYIN|(}vt&j+SQ( z6~#2fPZ?zn*;vbnW{kSP9?&$KQHnWiG&q%_<lIJIkFGM#zIF%OnKTVYH><9x=Eh$V zwJp82)+=hP57B2qI41gqjS)h&&~@Q#jPQU}%MN47QVLy1d5nM)wk$9wR216I5zdM6 zChlt{2D(T*)GLa`W9DMZ>?4JEBtS(%R|Fq2ft82Dm1Al-y{#7dNv#oePt5T)_NZ$N zR5CkK?}QN*(Qqq+6C!QRF_m{0N9<^Gl$$4}l>X_+#z;zaq~4U0DrK9i2J_$Cn5jea zwGXMH=wx&-J4kQMwPOXw%x!Ir=>1(;+1a+b<f2towB8IhDqE9g*;J!6?ihv~^8x3S zwu7y1n=z2;Z>6J<880%YRJ44==6XYN(o<~I<4m$+;qYDaWAR;$P<$6mS$6D+E;DW^ zh0}EMjk|h+o82%?=fPB2&FYl_?6h9lO2g*lRLy9N8(W!vy#!y^Y2Jt;YWz$m*j}C( zjaBvfSkswWViZ;;k60zVLNUPj>i|@oSJS|;;-)&yw)*8J%T4O>RWqY?`wUZY%^~H; zJe8<?6X25#iEMtRXH8X1kDsae={yXDjTNp#XV-D<wcOdB<4EX8tJ{Y#;`X$P7Ei`W zjFn8KYY6zi+4L@36Rm}f2HPQ#hM82J&c&eP0UXU4Uoso2v$BERP!?yc6B~`eRahE9 z;V{NJ&e*x_@7?5BPQ$t>%}}sJZ2jz9WgB?f?I9<aJKaV;MFABg5=^Sn%^u@>p2pI~ zCf-%0P1MCPX1dWMv^maTj<cq#V=F@wcGubHLD?%G6W2Dkb~g=SGUlju@)=ES@0d9+ z!o(-eXlhi7r`Uo&&Ldp1lVS|6O7Po#ZR6T4-MO_F2{%byIq|)=iqYktN!QFaX{r~y zSRb0Kcla4ID9Rk>@jF|prm^11ZacwsH?zGO*v|X9rakg@JI!UXJ-zxg<2Yp9TwE$* zE)-RHc&Jy_GS#YzImDWel9l~~bzo1xGKY40yOmYre4SmjsmW&Dwu(zU$2HZ}KH#f^ zA8VscajdmbT@$sVo<0mCd`yw_40gEHz&mIl8}o|KjH<#i)9c|DgGRSZZ)}OTG}&3b zJyVuCcWS@Ol%ErQ%>cZ7D9g56g{{%3Gu&v7AVoc0B~#Z=wu<J~)e$nn!$*WoFDKa{ zGrA#?tW2#OwyW7o_c3)Bvk~tYA6-CSRz2>C$#83X)m8BY4AdKkKfz<r<ZUDsA>Xl5 z^qvrzkH6J%N6nZak7Ln$G0~cCIzvf}B)Jt~XKSNUJJY~;mX5TSb-6-C9ouVE<h|B9 zbD{@pgP&~C?gRq#GH$Q;UL%Qd;(cfqbvngjzR)c7O^1gP$*rBMmzlL0o2sPy`PYx9 z2h9yRvsz-MG=wIktmBryQ`3!yrX4}B9_cu5X~22S39Q@|v9`G0P1IszR?r%zR`T*- zsc1TIx!kQYLaOX|L#@%BpzTC<yH0&x$4+!xjG59zaN{M87Zx_o=lNBIi{orHH1<>v zmO=Zh>|K*5ve#BNX5=+Bw&3aZq*6*R_C(T3z2iI?0?x9BR8gpORFUc^bv87eFh_LL z2ODWiMfuuPN>(^orh7w|Jl1BrKB`)&_0b&tCA*7Sf->C*Q}0?{<s0`%TpmlF)Uhku zSUCk)?6{9F1WCBLz8cch>Rcq5Si(D*-O@1^8D?Fw@Y46;!;Fq+We@Z1O3&8X+cOZL z=rz!(3MPc8o9T-S!$%nJJlNX89KiOm6XtL(3}gsfPmE*9P-!EnaSvX^kc{24qVr7X zzQf})_8i7<FHE|)=@XlgSqaWp?_`;Zywd8hIco4K$Mlv4anvyVYdzv`>$=|e$9{^= zd6TKz8nM*S(7dGA_<JGJ<v1&GB7T|6eq)-n;mwX^UXOq3W}7CUH}W1Jd{G9TX9agW z*>>tQL5o0R`zxm45A@n-UNqX`_UY_(t{#y^i##42uV5Zdvi9)svBIZDRP*e!RjQD| z3o&DH-G1Suo`DQw@pL^DQzK@2w|A~L)veN96plk{sisU_JtopCM^)cMoJ2%Sxnea{ zD&0kU*u;#r=z7{pX>DpQ)l6@|_@}xKUAh}lD)byZ7y8Q5Ym1Q18ICs1+QDx5GUj6j zYK-%^{YBgS$q%lx!*NdJ*0l{MG6y}%mS7&23A9(nA*WLTIZvY27$ZJyPoBus{wkps zn{QffV=hU0u~lnaexcDv(JE!2#kRodJCD}6+LNsvqbxc|i9MOUF>L~<iR0c&3nQ!^ zh*gC3))mRc7aNuD_JVZCBI|d$(xMeMLrn674Q<P;3)JM*tX7<5MKCUcea+aDDT-il zusZn8XewU%K8Go{7OOB9ptQ!uy1B^?ioMsM2(p8f&2(ywS@<BO)Jis|_Ifn69$T68 ztc|?feb@%OS|gyW9j7vF&v>6@%$*%mn(D7PO~bfA+pa!}dScPm*5(*-OAd0P6)tH- zbx@rBC#P##)Fh=Av<*!uy=Pl**Yg#MGx958G^JIl(xe*WZ{m2XYJ6^-`7#a0XH~FI z*iG$djvf69bCWeIdr!NMr*9sXx0{-f7{8Tw`9_VcU}-vNVG~TJ+de=ZgDA$R+Mo9a zN?503VVo-EQpI%deq+Shn0&D{d7{NL&gF|9Mh1U>!(K;f`mSn@3?`YLv&uU)&cv)= zh&d@8U2|T2nu?u`Wz-!tnZavw(`X%Lja_7in>1^M*Vr6LoYTFQfwlu+x_qh&vzR(# z$24toq0&k-G;GIp{Dw7!o^~W7%w&T#3=|n{(+$;FUrdR;ws!eqpRu#QT%AVW+S!bD zo2g1_Vf}+})`QY?7VRCDP8(Wdb<L5$mkOF|VzruUXEOERD&-@mV}QA4mMLM)fo4nR z(!>aSh80eiM8-MQyX9lQ+IKP&er)(OPPM{YY0No-19E0OeTLoHIwXOI5BwM>Npxa5 z8`U(?{5E?M@3^$_lbk?DQBwgqc&x=4s8{p}-VHEinyznVuUXP}X^j-PlHA^DC`>ps z-u0w4s%Om7*i0wa<v+Wa%R7Z{)5pkiVioS5yv-|@E=#H-%O`!^x#exH<`RRSYSo>q zW^*6gtTpyjeCCxc9$^)wj8N*eKjtkmI#K2>3^h;dHcg7)yREK!`FW{fkiMuXMyGa~ zv&&afMvjeF-QYCJC~kyN>wBLKd4*>3b75n&$zF$L1zKMdGqOEl!50q{=v!>lscww1 zGVd$2Ud;_cceu)oJb1d_OcKw^9x8K`F!fdgftoqwG#9RA!Wx^k6<$-jSX;s6Vv}?K zOttn&yOT2)HO$l>rV&^pd)o}tS*Wv@f%bSQ;|R8CIKvUb8IU!uzJ}wOp10#Bu4#gI zM-R4jFcEP~8K^tK>5S55a8Xv+IBEU7SSwFbwZymws41Oln$xtCrg#Gp$HW$YAThgd zk!oU-|AHsqQNbL-cL&57khkSf-m2TpW~!jQ!d-0-VO%oNVwj+$>w33gGS~HT_SZaT zbgF@|iOSS})ozQ6Pkb3W+2LgMp^e$2zSvgKT$_w+GFO`0BF38^u^!@dH#nM^Ldr;- zLP2jwG+l=zYP@9DoOL3KxiM>IUO6{r)u*cW2~x>OUs94`tY1u(;J#67G_RGBf#xb^ z!nQ`M7<I2{sA61M*NDzk2+c(`;axW$@%Zw(y0)mjhY%cow?lxP)f?j&k6LBi0STjE zrp+@!D=`)!XRNkL*dZ^)l1psV@C@xMzNNjMvBi|qP}%G%8xYJWf-?bLA#{=rl*!9Z z;{qy!G!AKp8j;Y1fmoZdk*|kjluPG_#>d@3O6OX`e2YNZ@PP>(Q5MovE!Pt?lBE)8 zQ&SN)hd#r4jbk_G>O+OUwGEEC;;|Q#w%?R!5c+t6r!lT=UgV*vG1yioJ!GNYf;*d< zfm!+yDwC7}Wm6Hhu%|Gx(J}-F6@zz6{r6O3u_ja9@e7%va5#76hK)2qd8MzWBqn}2 zgVvqSle41M+G5WuFRip=?j|1SsT-ZeG&|)jwx^Zm3fH<$$}wz5Z;6%5xvi(b+1U`V z?S1vKbvJQ;!I(1GRkx<!-c}DYVZJyPn`H}20l*m+aKc8SO)<9fH$<lH1+E|Mptmh2 z4J4U<MoGRsyxOfzs16vW(_3c7dcnC4W&mF8Xt*(^=Vm<@h}D4$M78<<wsvzy987)F z9_cSPjR)+kV~1;a(8(DQGw=V?Y;qk>#==jHEqJzHqb17r%~LVe-qfH8*0lEGH(U}k zHAI&Jn|Idg83`3DwzgX&Z%CRost~hm)JhKH7#s9Y9?`kUZFZ1wDfigI`2ANb{ZTa& zhPq5#R{hztu?=6n{eYdm8oGV`9%HXqUiDz>haFkZ=AQHZ*nyLHzSL}YN#ku-zOZ`R z>Tk#1opIv)r|#<6{KKK^%|2(JP4m7kczL5Szw#a$v)yasOMl2Y{n;-ktoMEH9uE~h zzNqJBO-ruWqpim}AC5TVKe1DIpN!cqW7^fN8}+PMKC9~SFYY{X{Qec69y6kSyN2F7 z_Gw#u==;wf!!zOt80xZjm#j@^%wK==k6!A!%Wcb-eKxIbtDj@TKE3nv%jWKU)y|q! zc8J;T!mO`)zO`t}yLa7VaN8!ApVL3o|HGLF%)E5-$G$KBxnSa$Z+ZWX*>3eS-=Fg3 z%cTPc{&V_IT{b)H>zW;2J$uA9mDPPlethJIQ_tnRJp0ahr=8P#?zvsBz5mW-$FF{J z-UdHkacSf6b9P*~aPr7G=j<{*eh<&jn(ZnctNo<>nSVT3J@~t~eqDawEi1NKw&z(_ ztSG9_e`mAexAz*tJFd-k$NY5rsDsOQI6nKH<NEbnvQ6Z{y&t^%(pOI3{>h3x>z;a~ za2W3t=%VxPwe_K&{_u3m$w!r}JbQ=GsgK_O<>KwHf8pLUzIi;p@WZEv@PxYFYaQyc z%h8P&?|#Lw8~a@M(-Ft+G5Ob(vGWf)ckb@_ZxmeDrT)(2ctM7qpA2=`_>d2V@38un zA9g=|*pu7b^}tVE{<U({g)i^ivg*;H&Fj8Dmh<-GImb|!$1bRy_Q>dl{uz%SaAwQc zx~kIn(k@p<cU*nvjw5@#TJT9BW3^_xt**G}?HyuYoO#WHu9033_Z{-c71y_pIeW^v zSM=PV_vV{@jEBB%w!7q$vHd=q@#Qm*UR(Iy8IxKT?z8R_Q-59b^PB~He|P<fgF*-M zUWslxZ)m-e`#yVm*27o)?YtlMIO5=kHn?H8|Ht0Dz(rNH?f+{86}Jb_JWy$lii*cj zNih$NN;Vc2DJB{w3L+>f$)IScgP?(Ep;?iqsI;gwF-_5|Fj1(?$f(GysLU{|@K9lC z{;qZJdoPA@>dB<%ec%7T`6%<<*S^<buk%`a?LA-oRM@4>lbLP$@7VNBPrSE;?5;0Q zi0^jeb@z08rN>jpx^KI^%y-S!>z6G1H2a}|oF9fJ;#$8VJD)N4eX;XQ-0IGi8#iZu zzwvYHk=38vGoar7ofo=Y8lV4l8J>@?C&NATLz{>%6Sp6`)Uso8QrG(Je|!0{n0r2W z=bO=Oe|Trw#qn#Aeq`5T&cz)~UheqCPyXqj-uPk9A%(B{oIcU+`14`i7u`O)<?3~K zcLmwSoI35^XKDLgr;p#!_=(|bK7F)c#wXt_d3Zum=XHb6?q1yv&&}7D;hL6A|Mj<) zch9JEcyfob>%2PE|H3=XT>8Y~NAt`#oZZ~u0^aXLcFPXjw0-sX<pUq`s^_uIG;;c} zch-$9^B(ke?$O`Ax;WteG$DQ^yBp`;)a>ZKg1f`6d1qz((?z37i&AqB9}8{%-q}Z| z+q!z)FGM&VIyJimAAP4qRN2=PzV9MTFO45K?#;($kKXiRr>vP>xA{HgUUC}OOLpI6 z-SA<@%vaw{+Oi<^+ZPAimgn8?nn?jmMwb0xkMDhc!iy*`cu5k<->z%guKea}@!Th8 zPFr{WKJWRt6YA|h{d%X&hpt(6@ceHF@XRpTiL|fgef7|7_b=$zVA`l>d=J)p=-hRE z@~Z524j+6&msHb2ywjcR+IE=JyS3-&{Mfgzc_w7jwO>8hFlpO~vNIjt9NNF(%I2S0 z(P7|40cN)&$4*|`_O&B7J%87}t<&F+Xu5vy7vFvHis#%1dL(S?{#2zeo&hGiQR@%i zU+~z+4|v_N<iXe}r5~MWGynS@8}5kQXKKFk;yts_{x!kFyJoklXI9_y@Z5`*&cA#$ z%I(!b<4vzU+r0Pm8Lcb#-FWc$(|4m?8%uUsJG&nEZRpC!T3>tWr+qJ<7_y_^d3STj z=}j|VyV$tm{!>rky~1SIrsI3P=Epz%diuQhXWksTCH1Y1zFkY-96PGTyW`)f6LKs8 z?>lHD!~N;0PgV~N_AN0@x%K>O#hto--0I`&v)tOZ&^|x3?nk$*gSewlcB@{CyF2x< z6MF|ff5(So-ii2pTeM}>`zZ^X-mv+)yY@`#{si7zNp=q(n{7959-TGphj-r`Hl%OD z16}Xay5GC?W$%VDw|jM|+Z2z4;Kguex8c6`PKiqh9k;3F-7f^ro%Z>+);XD5qEpr{ zoN_XC?CSk^+0_GNx3tt};(?Rf8XdVUZ~YrxPaVH$;Kh(eOD@{aWWVYj)?psf`BSp% zFnEjQr*rMTyZOeUUw@v^p?&F+?eTkVTD!CR^fvKN&#QME-YeTghTE)r-6LnRr@!9x zyT#qpmYjd4exG{7I=A`e>91b7)UMvGsUz^4Ol0@ktRGk1wBUBXIZ>l0<gV`@b!}x) z%Id>0Z@qZq>6p(_;wRwUQDir6ePYk`K6vT%ON-W4wtV1m)6Ov|xdYSFll@2fUpHVL zUa)j4UV3D9o6&e<+lqRR9B#dB-%YFHM=bsB=B%x6FMHx(-`hIAfBxq;67g&~*<I*r zz2?r3>b|ve@`w)G6X)-Ktp4B*<`1TS(D&B{%U5lCcd`(t$?nLPby{s{Kc@4KQ*J)I zC#{Fq;A`ewKWgkJ*)NAYnmMpb%UAHOev~b<+b5rv47+2(&*cL@NUZZpMypdVzBuTo zvO&Hp4?TJB!9CY^Jc?)D$?k^@^Iz$`VR_E>xh>vrdah*8_Bs#5-uc@TBfp(FW{OXF z*zI_~8rdy-udMKyn@5iSs^cy9Pd(qQ$?O&1Ev@REe)!~vDFyeox_2g?Pe&dj+#e1s z+17N_o3mQ&ernA8BlCxh?E9-N^2Zi|_QkDNj_SA+&*YQcx#Yf^eu<sg(^@a>g_3Ej z*57gV*S3e|c@G|WU#lN8HhhM6ILR4@*=^MeEyr~Wj~KAz^Yf4Y{$BU5&R8FQb9cqB zCngRqzIFQKgjl@v1Z}?A?f1je(zlQEza{qU&whg+J=?wH=%&v8!w<J=x%b7Go9bS~ zfNvhzMI7vq)A@9rH|{pAdFtm~fm=#a-i`X+C$Y}S0TcF4oBsuD4w2o>-Vgrp_@GS> z`yFZE-MYoX_uDR+)9L7KJL1ECoZ921-_s-U6z(-L+``|MKL26N((U74ZTei<PYe64 ze{%8td#mmpvg+P$Nx!sTd;{KzKz0)*74M9{vofW-Up=cRFTVbkW=Gch6m5I0{`ON} z@9O%9AKsfsc84okMtAVZdTnQ?jct=(dT;6Vndg>1U%$`VlIQF<9$xlE9>xclpqt&! zj!1rd@xa;J=L|Y`cy!mTV_sbs-RQ01-*)-TGU0_cv)Z=7dnw88`1*C{9(nfQnl2L~ zBI`9>I&R0MCwGi#x%BR_O`h3)>E@28zi*J;hN)9$=Ku1@QcIotj%9u}Zs_1y8{WAw z@78O#jPto=-*dMt#`pjOYO|Zqbsi^sZofY2qui4Ve+(UTb5N&FCsyt~HLYUqhBe>4 zjNhb^zkLh4?=MwFja>io;!$U3&F{5f+?cmF*V(_n|5tNv-MoMGJ@X=7!}|rvuF7&> zQN0I0IdS0Pr+&@S_Q(AmcVmk+Svy<wT;F^9&&zuZ$2;*bZ8W=0ers#=2bs^l_5O}? zpKbp3>Cj^pTQ|+xKYqx$`hBPSydU}!-YY_OpNttW=k-AyS3F=p*Z)-W&%gQQ)!RNB zG;iA0LtiIeSHD*_+VPEK*X{9-Gi~oSZq?x04%gmRGJ5Ncx9vGocVvXg?(z2NC!cB4 z1CN8_TFh>?aihjJc(%(O89q;b;eTLk_<|-GO$PlG@zf_FuPyto<EJa}UK+BSH@$r) z`{SAQ(^Gd}8`2|r`L{zdk2G!A^vOrwd~SbQw+Y|ioe^ZWH}Q1c&OL0ozqs$Z<aO(M zuU1VbWbMtkuwu{V0oegLsTK5_9|+g`?NRP6$F5A-+jpJz(3o+}KMhNmTmRli#<jZT z;NDxujR~jUrhwg<vX!Z=2mgMf_o8pzvVWR<=tRidi%%@~@0*o7^WdVj+5PD~^RPR3 z=Zf>Q>Mr_xue<HFIblEC{N;kLZ|~Ojt@j@v7vJv8`^V8vp2Juc?PSw7K9lNfDlA#r z<j9$wKYl%P<*Q#bx#`7Dt1eAjF(P~VAxuJ0m&|UbgJ!HtJ7K#JG|6jV?*nlmyPCbc z`MH%pbe&v&-;jy@pF_FFdy--I<9O@HI&rV|xOdmE>r3zK^zuC4mxuVz>ppA5-K)p- zSd;W7ej|nKsw~-U>aV^pyWxu5UguAgpUrt`-nnny+LO0u<>Kqc)|KhpAMdy@yREp? z@x66*p5Fi3;B8H&9=>n%9a+Qt>UQxhnegdLJN$Y*gRw5&y9&DlPqqK@m&tS6m#nDw zK+8{pURn9^q-A^F+IVLBkogHAH^|?i#Cs@V_xbdBH)iJCP<3M2-2s*xLJvO>vwu*| zL#cPfnwl?s|DCaSp?$#%JTV^sIyL3iRYy<eR2+G5{Zk)oPtNJGrJhIS@JAmV(V^4R ztud~PBfH#D?ms7wZ1X_Ub6s|{8M3PQ_}uoVC+Bbbp#AyPZ#)*fH3IJ!CcAszS-T;j zUnB8F+PI&ZKi{Wy@oPa^v*F$r`@*wF4xFA>fOq4xmf_ZW=f#_Yuc>$OlUCD2&ft4@ z_uTmL(t#JFBF5Nm>ipgl-=m*SCA+5@zA=32_7{!@Xw&UqEV<>$*NzQ5xbp3>0c!_L z9e4WLZ&24hBD?3l6qARUbIO_pWF8P1@3c?e*LmP`hwt5X<ni+lUVMFCHhu#EZHL({ zDQ0~6oy$M?^2>go9-Hy<f&53K&R^Gg%bVY?x+gaI^--%}vzYA8PwFz`>-#1&?*7&_ z->u*DbpKaJfAL!1qt9-hwrkCtlhc0cgWn7!yDx{Fs@k=sa{9;Hcg>#u!gUWW{Mj6G zS8D26pE1o_Z2Wrb`*>#=%8c3Vk;=zg-Myjtfkpk=oU;d)?zyS7TZ`)pzWTB}`S}Lz z>*F2GVmjHq*?-s#pQHx<{#vKQVWqx%e6A1P@a8?+<}J(k>CH#KAKrQ^UU)@z6APYf zxNt<HeA5=syz<}tnjISb;H109+%&N5i=P~x^U8yx@xG+CGTdLX7iEOxtlZWj>eYHP zRy^9bPgPXC`bjBM=dOA^D}3(*Re0qO+4=VR;jtm_zB{3Hw=s`|Zm^BZTzy^dHx3Ow zeaBbFJl{XN|7o=2WH-|s_Vv7O`!`n3eCDfGU#`FZM5Rxj{m1MEdu~0G*uP-U1iZV= zEW>?a&(Hh!k39FRNAmFzKV7#fWqm@>!{t9*I9B=Lxy)f3N9{v<N_M};*ZFAC@~E9- z%AYG=am~$9zk1ETA-$;T?(P1znTL;b+>G~*lb!FF(zk!i{jKl3p)va{=T`0YKl<A{ z2cjciJu##zq@wC5#!Q#UuHyBvediY@tvkOcWBil*gGz$8^uBgy*9+~7X1>_y!RBAR zf_Vz&3}&}CKYDz@j-rd7)j3qBUry6omlglAAoIaT%GWnKv|w!e`%j}y%Oty<?|q%y z`Q3~eb(=<;o-BJ~#qzIC9B!~_>rZ>`UfXZv%zKLQK5eq=a^h#N_wL^K$Txcqto*ds zgZ(;O^T^iggZFqe?v(fR_#d}L;T?Sf?|o~JKf`Vg<DIVYVMF5LVq+ro2j;_UcpP-f z+%P=*Px}(WqHv$uhWi&`F*74#6C$Tn3sLyl1{+2h(SO6U_}LK%Nq+)A%y_`LXT;U} z6eIUj#Qm)}U3P)w7w#&DMd59Ac<;p3`D*JuIUy!C^6ES>G9zNv%&3^Dh*&i3#;s*f zb>C~*(^+xyo<J>o8gGlltGE7^r%pvsJ^`-^;8d*Yn&pdb;?2H^0e!oKjm0}LX3dQ^ z-w|Vr59{R@hP!f98G8Bk^y}HHzn_1vo_=8oSY8Z6j3TE*sTf^_Pk3r*3Vd|oRoKXw zh}pB^XGPh}_r$~}Oo}y+wk1Ty%nIx6*SmKZ?!wGSz@Ef;VfPFR!<$HA<HJUd2KMsr z*{6TcK7DTL)n8TSIT5q*?0w9PDgS6F@snczQU6h1aU*Ir?k~=B3`*|f|EsN=Q)!?V zAGjzEwV3kQMIRNflI2R``ezN5{(?j0ZFTXhy_m<$zz@O7{bm1XD0BZLl)qCc9h-@N zB2{MAW_-Eo<Bd1+K`WKcS5iov3N-hNMi2W>q(J;-DR3q6y{u42*-*x&I`kO-M4WAx z#rdBICGNix%9Q^~D2e}-Q2r}{U_-*R8GmoA=v2G(?!p)dR~MlxZm5ikKldsIHkZ{T zHI9wf_npLt#m~XU{HPh#V~eY*sjmE=G2?HwT7Mk(C{$HB52@}ltCP9*`nE}z6};L> znMnz@S<y(RT22&)44pySTWi_>xwE38Y9@N^BuA7DJ5=y94Jx|-L|)GShw>8hUO87V zYJ2UZNCdV{VZJfD$BapGXkR<NM<J2r8;okpw;8h{C&k6oj&G{bko`QiG}f}O^2sCR zWp(Mg;s*IDMqq#3mf38zSgGKdd^KdP6&d+Jv`V?!Dcn&udQn|<IlPJtap)oCBQAd{ zrcS;0RQa~Nzva;%XE9nhbhgUV>I<&Dz6wKxNwfc60$dhvUQd#haw;03S}dNj-&V<R zRmI8Ht2PTdUvXT*WUPH&O{?ovnDE@vtl70x899#V5_-fZ#KmEUZSAC_v8G!~zSU-H zhI%s(Z+WdQGXF%)iH(_ob-dcSdWU`tPuf<`)vM!u#eELOMt`?uyR2fX=s64(@m4U0 zhVv>SYP7|Fxaf4nm+s(WMBKcI)p>Lkv7{#nYdN!Pq~=t-gHHK>6%jQqKAtwzD<7|< z(R6Bz^q$RF^!fW9@tqpAAbKS}T~;J*wwZV~DW;b0ghbgQ<lE~0R%%@qwJ6*?s=ekL zT^}~S&#sPJb=j!BQGi;($IlY{v&}{v-qo#=x%yJBxQ=7o5;LndJTmHwTr8<wAIU@f zpoF~1reb<kg<iG8xR>ZKF1#u~<**uWAg!GU%6Q4&46ZHTP`B_dOXXX2d8xgkk2L+K z??UK7`1OpLS$zlVD)US}ic{UMU5RH-je9NUmwd~g%C4)37ESg3mPam{<JgEuyd9~w zd_!C8cyIQqFY@X;)>>Rjin8I^JG>jZb`ndjDomArVQ(z{d*FXP5!7@F_Bj=S7n$Vm zBVofDktY0ctZVYg4oR9Q!CyQ6Hx#8znn=YSGF?k!(nNFY7sIw+*m*N);&zby?Wl(0 zP9{xE0?j3D3X>-AJ8SF~zpzH6$=}Cf4Zn!R8h+b~wM9x>t+Xtq?X9Q(o@zsp&!ma5 z*o%+t!HCPfOq!UgwCPH-D=k%NaY#69@r7F(lO|3ntx{<=?2~Uwc8N@yIHokYi(a19 zL?HIRCsUeQnKbc((#|NY7xt^`b~iC;B1mb$N-JoDy=LTJ5tAmCVjq*PEo0I|w$e5# z&5A@xA-6$Hnn(l9qdZ#9q=~PU-M7k4{wkL4){99K@&RRR4@O$ai<P8_bxaLKw$kMD zov9RVD3d12l_sB3k!Lkgi9Nsg2mj77X(9~!adj=6NfU=a_y@aUCQbNYPoJ*&GHD_S zgnzKJGijn&X(dYY#U9ut6u<6Fn%Jwfe5J{!%a)Q|Fq0<Aly+QcR_q;>zuVSO1Tkr1 zhtl$t)*Acw(#X!tq|tuT`IH}_&?IRhU)dEXyJ+m!OeeRoOsKy~D^=QN?5|u#cDYQN zu%S)RwL~W5CH5s|kR9GOLIgXeh9XgE=RnKJu8IkD8hiY7Z5Wd#LX{S#G+(n2^0yEh zitbFBm<W>3ZZ)KxeUdaW4VoufjD}(+6Y>(&gfu&oCLRJcCT$fH$~~wNX&ad|@iM3( zX*-!TQ2^3ND`L{bN1z6z9c4l}1$mHmib)f{g6fm@JCi0FwL^PLnirEMZUEIKtv!<_ z{6Oxc`7>!^D9DYp;Y=t8pgN?5GHD_TWFl=ElO_^D_|X!iRT7gXmVqu&nm)vYdI|cS zv}`6#yac*P+RIERYoH6H6)<Vy2<SJ`K4Q|uanP@%l{0DLXV7`ler3{xM|(VzMOq^! zO<V{1g|r)(G|?UOGiiQInivfFiL{|ing|A+BQ1nU6O%z_NsD4a*#(^;Es+WBB<M70 z%a}Bg1*#-%9g`+r0R2eXOH61FKtGU{&!maNpzldL!i4q!bc(d&Oqw_YsvzxWCQZ0^ z!0$7Y=E0<imY|cQUB{#eUr;$|-I?&)*Pw4n8_a~h0(643U?xr62l|Gz$xNDv105&L z#-xeGpsz_=%A|?apsz^FV$#I3pf5>#fk_j2pfb|-GHK#%&=;f~W<uWx`kb^fCiH`# z&qzDNgznHsh-0L=Gijn3=u^^KGNHW(9VN||NfUiRpOAJllP0X7QqqE$G%+6ZF=_WP zX(AT%5ovKunpg<>khH~2n#cr|khYph6HkLaAnjQuwD+JRq~$Sb;vh&qf7(#I&7_G^ zP%&x8m^ASn=snVYU_$#0I!qdV_=-pqO+fFG){IFLX3!zhe3&%R8}troeVH&W0liI{ zl}Qu#fZif)Jd-A(K}Dp+GHGHysF1XUOqy5@I!Ib3lO{HR4v_XVlO}RO1*Gj@(!`sf z{iGdaLSF`YleAJMO`HJjBkemTO;myMNxQ(L39S>J;~}jHlO|e&UMJ1Wq=}xO*GTKl zqzMaXFKK~HnivIom9%@9G!Y5fLs~SGCgy;4lQy3T<10`eY0H^3u?Dn@v<*y}*bLf9 zS}v0&<jX~0Ax*wyOA^K}pdF-@Flpi|(00;JFlpi(=w;HXm^4wZGxo)kCSS8HNfYvU z^<2_gGigG;Yi=uPJ()By5cCph7A8&H3ED#1C?-wFS8;77P5w5oBu&f)y-3;|Cd?~9 zFOZhTq>0Bs&y%)>NfSAs9MU#3X<`rPInrKd!k7^BENSw0EF@{-bI>NzzGA`{6SR@E zb4;43<BR7GNvp?%IS%M)(!7~8(FybvX<eB#5dg|2Z6FioLZBx}yORmySkMO2!kIKN z6SSVR*-RRK7#Kg@M_MYACRTyglJ*#rCN_fBke0)wiJhP)NZZ4ti6T%IX@{6JaTN48 zX`eG;jstp(H2Ku7Bu)GddX%&}U3Aif7icwU&6zaO9`p!lotQAc1g#=1fJqa>K`TkS zoeASaP$p?%Oc?)x9wu!jlO`SjJw)0fCbT)A6{KY{X<|KSIcZNZVVncXAnj!)O}qhG zM%sQR)GbgtX(ddW_!1;%z754UOz6)+50dsXlP27{Vs1cMeI}G4&=S(TnKaQ6B<Iu( zMHeRYTc8xuZf4TNZJ@=Z-NA&k0wt3c#-xcDke##{OlY4$i%46@q=^jBLed^)!k7@W zfV6BTO>6-*b(8Vi#)Ppl$cwZhCQW<>x`wnbnK1qXH6!g;CQUrj%^34P&V+PUT8YxG z>2BDyV!~KYX(38WRa%<Tx(A?am}H#&n9%MjZMo7!f0Qe-b7#^-veK3)ZJpBO6NAzP z#%njDoRV7)CX5}GwoYleO535d@Bt|I<TjE?6VHHJP+C35gfRoCC24s~ShpBxxSh^~ z@u|{YQd*xuhFw1<O)ODby3)2PZM)L$8f>^7&4hWG(jt^LOKI^+OH<l%rR5Dp-KXo_ z%cP03pjLEkzc69$GR&|`V$wvzKtuCn(nK$%-K4Z3O2f|-QfO#nl@_kF?!)D;#Z%c} zLK}9Qp*3g1xXy|;jN-hS31cp$i4po)^!uRIWEahZaSlkXgf$dTGhuvsyJ6?cq=|7# zo1iqC(h`-HbO%~n3d7E%iCrN1PLhV=RVIvSf($z|6WU#+1t{$l=rQuIl1UStN8*_~ z@~;~c+Eb8jm&t^FMrk=p3%e8j2l*Gyq>0Btt;xT&Oz68o*ORuH31Qr2xXolj7)r}g zTI;*fZ&4U#CbU;d%T`*WQRwr?&Wj0iFr^(=TGnXf5tV~=Oh~^FLo+jB-Uzyu>=KzU z7awD2p-j;3!L^ZHD3c~02DPE<eS`^hdaPlW$AocMsG(_0SQk*5ztX(NBTXrc)=ZkX z7jy%KF_8&<H|SQft7Jldc`x44LE0iFtTRk7{2R`MwF0F*q%`?FrXKF=O6z!^p><)> z#3rRZue1WC6)CMmX{Aa#uC#Kcol{zs(%dH+;d(HkUsam7(z+|nPid{EAU`M#%uE_y z<Y8#;OwgtxP07xk32R!Qwv^7pm@wapHtd=)X(B>tQ<avaG`rH)#lSxbBby29tRORm z@hubj_-Te+7!%4f$V_gJGoc-tZfMa=7z2aWP+cfyLRpIyq8){yF=5OPYEN2gCd`v( z8g7G_P=A%SS!o|A?PH}inPs?b#-xe<N*koKWTh=p+B&6WD{Y_+<6XKA3lql0pbix0 zR3?mzK|Z8C#)P&6)RD9tCQa;~YxwsXlP0cBG_*EMm=i0_s<cm)_Jz{w%`@C;Oq%GU zw0=rEq_kqC?OlZYpuEgy!kp7?Xn{-^TY%aN+1{^XLVJ~LXl5p~SD+4Lm&l}vgvEw7 zj|uIN((;scL1`jIcY!oWr6m}IYh}VZE2tBt=_)4lA4?6pZcMoEqO^OJwpD4{l@{`# z;Wm^B^WS9%gRUc&NfYNmohjUlOjy%eZrDv`(!^^@+o!ZsN~=`bxrgL0D9bdhVnRKC z81KHKForQ{;+IUr?l&fkMOPYH2ou)69)Vl(Z!Z(ZAgc{6oC#ycM+JU^ScdDtguYB^ z*-CSN49|M&c1##6E3HInxsMCcjqG+XA>XnL&B}y1w$jp+R`P@p-N|h!6WZ}LhW0!Y z=FUp{N@)$&8g`ADF#lEBK&5%F6QT!&(V9sU-z)93(!AFzJ0`3Tfo{~VjR|XW8w@Ru z3D>5yG^I6qQV2hC>&1k5iqgJR+V$CnU0Wu!yGjdFn(tFW^b#`Px-((DPHD%K*5YZy z?ph}F=SuTeS|zAA`FD;<6J4G`*`V^*g9&S|Al)vD33E=R{j9XM8x6Y-Oqe$+?GB}d zD=kuKp_}k7D2huM6UxxDhGu2Ly7F^E3?;i@Came_7+NDHtUD^rM`>lCXG}8vjx*st z$qR<&#f0$-Xd~HGGGV>xMbrg1>DI!ei3XbuyT(koUZvfkv~Z<GDlK>m)`BRE5GKU= zB}4OJLZ1hEmh3h&q21kTXl5qdj{-eMc6KJr7nCM)^|QEd0Lme|d?wsK0(GZr`<)4E z|JzW1NxP0o6NN7uZr@?T+U9mcYr>?75lS1Wv{a>~DQ(~`tglgAEKHhM0P0EMCNpVb zEvN@+PcmU1nrFD3&V+R&rG2iny1Na#227ZfC@nx~1NUP6Pmc=|?hz=hOlh&NVeOFY z;+Qls<aI;4l?iQx(&ChM=nbqulG|b?O*GC&TSC{?lt~l&LAqTblO~4kGql^7aPLHE zHl=0l#~P?fmeX}ins}wa&~`IvqT2yOyO9a=U!^4}?Nz0{p)_&OaO=*5a$1P>SPFMD z6YkFx8QKd>xPPg%Q%W<xjrCn}>%)Zkg3=Z#Ek|jal@|IA){Dt)7!%g&l~$^>$U|6R zCc9`RtSy23DDAf~VI2<Ci?sbrxEFZXaO=l}xwFzHC~cS0URByX?-_2#GohR+?Q^B= zEjH}(nb01*Z)iSDXvdZ2uQZF&0+kl5v=F6*D=kuKaZ0l(&91amrDZB@wbHVcwoz%h zO535de5DmAtyF2pl$KwLdjyn61x%WF{u4vn!h|xUv{Op+K5E#tX41qArQNTzG^H(9 zn)Mj&S5UY?Oq#g+GeaB0ggULXIHlP>$Ndj-o5+MU#xD%*aVAalD>JkKOqeq%Em~>a zzs8*v^3RV6V+*CFDeV|&C)t%Tp}jwDXyO~4(08A}y&ba4V$#Hipx$n>jrfEKbG2^` zyJ9BvwI^|}h};G<;hr_954l~&q=_%SGwi-*!hJBMU8vSh;eHhPcYz7>l<$S`C;$2} zVNKx&!)_uI_GBq-meNv{mZr3jO56vdFhZF$u@ZC>h4Cm8+RoF4os9`&V5Ma%?f4no zYa{>4nQ%YqEZ$2+{`F+i#7&@ENbApp`wO7Kq}|ShISFVGY4<YWo+fA@X|YV2m<Jj_ z+5#r5jeu?@?I9-gjiCOdJ;{W*3n+lJTqev(K>bMD$AopqbH=qbXF@yv6Ye+C^=@Xu z-1HYiYr}+bw$cVFEm&zGO0%5DJx%g2kVzBoDD6F^9ambp(n5a4JyJa{nQ*TXG?cDm z1Cu6R1Pvi=D-*64WYMpe33I03ga{O}+=nn>ZUxfA_>Bp3unUGZj0ydb(iSOgwbHVx zwM)3yOL5L(!dihav6jk&d6dZ{^2x4*3G;3@Lkncm#4M%7D{YO^HYlyWyWzGW6Y@xD z1C?g4XA=7;+*Bs4%hxxwbSBJul(s`@<sK&SCb>Puq=|M7Okx<Nb4MnOBQ(P<iAfV5 zEA3OIc{McbnloWO)7T{TQy9mXFc)fKXkkpaj|eItyF*N9>pTrDiwScGFOxVxc2*|L zFPj?L^GwJOrIjeHs+ma~B)1osFcxTTXnsrxqlHNn>R~WpUeVIfyqGYa1Qn58857#c zR)%(g332f@iMPnEgbDZQt~InSOqkm%EnI2mKyQ=VDkjA5IzzKEp{)bGLw4Crh>OxL zC@uJUlQ=|nAxtP6O533{kJcvfF4;9=LK~|zo6?Fvhso{`lP1h<49$lL_wAJyskAE4 zd*t>46Z+&E3@wfc=?p3+yD}!ERa-*~XF{I`dY|lynNSDKh8D<#>jfPlyB$m@2ki{a zj|piC`he`RnJ|}BTBXv0+M8%^b3^PN(@E~rGPL7L%jsYeACiBYndJT<LknU;zJWd> zy9-Q+OGiV?X2QI&lSzC`c4j8I&%@AimFCmgL_4k<3STCy*C{PeX+FLt@d^3o%Y-#3 zrR`OkcNdd5N_MT85U$d4mDZ@MNqkCnUQ7sAX?aQu>1Gng$S#yg!vxmQ+?lZV67(6_ zZDc|p(8JI|n6L)}^f}p`V}jeBhPIIjW#dMZ_=4;LnUKFqt5n)@Ka(gUyG$mmAM`Rb z3lqvI=u5IIW5QUkx1psmVZPeOB)%fM049_dr5#sVroTyiO?Io9(AR<jseOKr3HwSx zL8KjJ(!{r*J4mZwLb(FnPTB<~thL-^5+g`!#Dw*Gkd?I7OxPy~x{b8%Oz4k5!$}*+ zgz^l!m9!ux+>-<8*OAGD`rFqej?=Y;Ga(I>cD!2aXA<9#-Ek)5d4QpXFkzenIze`u znNUCa8=9F3>)D`h$u5xzdrg&AuC$<=O`@Faf|;<^qO^Ra`3x|LlVs=1g#J=#NlMEZ zXcFJ)@nb@o4l=avOsH?53bNbFgmK+qLu<|iw@T}-G&|@NxlLt4*-+Y1rBy2JoYKN? zF^TWVZ6p)ww9;~w=58^GAIQ#w3H3;6flA8+{YZAJnUKFqJFc{VAtq5tb_1DkZ$fG7 zlqQCn#A&i~XF{K%v`D4pfzFWKUM8%M4>L3mCX_$WS+Waf!u2XGS848nCUK7JJeW}a zloq129MDf>x0wm`O=%aD7JREo{7iNsOlaGcmaVjNpkK(YiV5jF+|UA<kXE27vRlW5 zeXmM8qco4(47)~5NI%edavRBneE>>(RcXaaD^Z%S)g*o;x80dgx0IHsv_qiZ$gY?P z?aK&5Yt4kQ1?U3V*_cq@l$Niw=C_-~MY8i|!gVMuQfYah-^p$-6UxCIhUUS9asawS zcHvA2S84f5^9h1c9XZ$VWkQ^lW>Z=b$V7IBm~cONq@j5;A+11l$S#oyd*hW>pfvA0 zO~Q@rS~FpOskB(7<%8VGu7C;c#$ATioC$70b;&N431f7n9aCC(uu0S-yGSNYysxwm zmDc=j!_J!t{UE45xh-SDn01t)S(%XbN()!oF_4GumI><?qYW*X31dA_1F|b-!rDWK zq4i^eTcrgntpucz+fpWs@5dOL7Zc(KYDjkBOlTvNma8=PdrYDc*?BO*t<u7kW>Z?C z(hh+d>({}AHNmll=Ff!vW}qfyx10&<qDm`Ont!NCc#>TJ6XvT*OI2DK$cyZbGhzK| zoS{WCVV^IkDcMyqp$v^Tv{)vLxj@ax?i>^9$GwJTV}c#%8r_Zw?P-{yg)pHX1T`nS zy-e7*4jM^giyxRYVV+>v`7mL=1!_TVOPH{q<~~CUWs>_mOrj;(c{8D2DlJiI?%^iU zitId?&=xB#P-&SUZ?ap>gzHt>Ii+PyGKp)+ZXFZ)3Z-38TIghxxQ^_?n2;_?+p9G1 z2$Q&;>{>Hnj-#|4N~?-AiPmIyfeCZ*DTWrtgfU^1NwgumMof4n1SFrlY$ygZ;khSe zw^P}bDebt@yrNCw2J){t6V}o|caeX$GhsivvU^k6ol;t*(z;JGiMHgQ9~0&kO3PE) zsp%$RCc8=|l*w2_voRs<LG8%y0u%1P%`h}O6Uxg>lW0$N-b`4dP+FGKn$I$c4!Ru^ z?39+JG@m$=@F6>2CWLXnp?Nc*4uU$8T@@4JH`~zcOqj#Qn?xtF^JBu;TWOg}I|u5l z`^SX(VKcN)CZs9Im+bPG(1#`%ng<iw4Nw=di)KQcl~$#+q&X(hmF(<HXm{rtnimt| z4C+R9nM|0MDXmgzL5U{Oo$P{{&^{|IS80vrnM4n=^J2m}gVN%ZRsiZrc129sXF1={ ze3_8;pc~1~&V)WsX=O_Df50UC$S!~h<v?j!N;?JWMRt`;XcLnRErbbk98hnv+suTz zy1>vHF=0Fe>O*#sOc+}ztw3qs3r)hG>{>ISZC6^X((*w!kzD~3#ukeVtvM6ig8GtO zEED!iDJ@57=Rp0)u8Ile&u(a;Ovp=60NLd-p}Zs;nimt=Y*2r)OJu_JDy=|i=EWv) zGuintp&TeJPHBfg1IVtJ31ik2Lu<{1c^+sW*(EVyFT2u;l;)Fa5`)OjmkI5V(rijA z1`Q^=5+=-Hml&Fv3FQxT3)$J3Ft<|Laiv+8nuLYyf|!t|O3PJR^9N002-$fvX(C-| zE0p$x($*_&htl$t7LsNXL&?8TCaha1?LDP^s<bbZc1~$kN?V?eHEHrMlSvb8mKj<* zChXl(+GM4zRoatE%U4=~(u$Q<qO>xl9ambV(#|Q(Bg2SGBPNuW<yfboIJaiPI)l>6 zmDX;BVb_rfV@IWhD{b>bSXUwca+y#U9yT;DCe%03aI(u`LYtjwXdX<MbAoOoyKE-h zZ&aFmoIsvMdj+zRT^1ACcBNG*ZSyLuBavM$6UIo77+N3`wAEOHBD+8)^fOA!Q`*Ky zv3^B%IZSBl9y7E?OlWgJL1Y)pglhu@)7T=L3GK78D^qp_k7GPZZi|>O9?CMbFeZ!- zKzEYe1t#=SPZ(Mz6Z+pZ7}JoQ9~1T%D(#}uny)qNyqVCyfr80xB@@Q{>kMr<6V`p! zo5bB@*PRJ_7bMa3PGCZNpzMw-yP^#yF^b$CV!~MYNkc1P!q_p}Bu10n4kom9PZ?Sg z6Y}zDlL#TZKqgJZgGNzY<}#uDJ!9B;Fkzgt(Im!@TW==p@mJbfr9G##7nQb4X|F1+ zSZO6n%id%X_fQxcnXqs8SwkDdg#ArQ8>zH$N}HfGo6-`M*8Mq?7)xRJF`*p-jixl1 z%!G2F>@F(1!8wN8p-gz@QE8);cAwHFD{ZFIW-BdCY0H(C`MgPlQv6mk;dxk42*vLp z6UO5&7<RWaY2rbpWhkvcX+=u=NonVm*5O6Nzs^jUpDV4O(uOJRHl>YL+E}GUC~d0J z;*~a6Y0H(CskH7}Ok$j#M@+~g&=@_Bm^3lqCByC(CX{=nB`NJ$rM;lEol4uIw1Y}} zTWKFD?WodDDD69?$qiI`oZXqQPLpdA<LNq%F=4;iHk4<&j;2i5ZvoQnCNg2ah0<mz zEmdi0N{f8iB<`g!qM6WkZa1_tCe-OyOd^czJeaT+skC)U%Td~9rR6DYuhNQ@R-&}% zohC7X!iZ%;7@)Cqz3Z4XF=&@zH-rh#cq(nC(vB+abEREUnp>XkizYmo8j5R_)>dg9 zly;-i`Y7!dr43WsT}m6Rw24ZKP}(e|#Vc)*(o&R`rL=WQOWb1;_fc9UG2tHCtA^&z zggFFgBH3+b!q|JSp@lMGZ3z@kcBM?{-(EK~KPK#FP+Gjw)+lX*(!NmI*Gg;jhT)$V z6V_hyO=1#-o6iJopVF8xZr^VblgTcQ3HSIwp;R_DGNHXMFzf~~p}kkyNTrQa+61N9 zl$NNpk^?3Yp{ENI#w7<)S1H^^OqzHKq}y#`(!@5Uy`r>3N-I`c^CFXoq%gdhFs4yj zw$e7gWfD`!E|&@O#<vYEgbCvpP!!o+V8VU6cML6v3F!x#N_HEWuvh4ip|xScTCUQp zN^AYDNko%dGZV&0O3PGQ^TQ?)Lw4RwC_|v@Xdh2J6XtKqu0YuZyk`>A$n8KT>>X6v zDW%zqO=3FPr840;Yo&dov<pg;+Xkcy%q2mw<TjBBW0fOVYoYjgGa;=&y4^-5O_)ne zVg|YOVM70*v?Qf@eP|Lh$*wsQ_AM#xH>LT1WY`5TVLte=Nz5X*W+sfEm6oTp&7~$0 zM|QbPny3Jcr*irulP0!)V%TkG!gFIv`&MaQM-98?Oz4k3HHrHvjAKl=Cw$D%1~OrM z`We>IDg7oeVLk|IN!oi%nrQnq)>=sGz=VC$Ab-+sW5PaA&`qS>&!mYbKz&JD&xCOf zs2^zunKW?{6hPYdOn8Rl1X})ja&7ZVCcKN`Tg-sSt}7Gb0<w~J8<Qp`fJV^$qe)EY z8(|YATC`YPZ&u5TA6<Xz>eiLl`YgL;ywtD!XBOpeON1r%^$!b_KRKv=ZLw!u<YaN? zw5cwh&xgO&A4EppsQM3|Dnup+rd9vJuC`7)#mEAGjsHT%SRTl4`9Bc<jZXvl@+tn{ zE*hOTj^%em+^jgqW66QTZ;P27+hc6s9%Dz`*<<K%)@IqF@nZK|hbnW}&6_nkdRC7h zn}cSZ5~GfE2pn!5eVgujtSoo(BejuuKP6m`?W0RIG+FNCCvf;3lVW5TqaDK~EkU=? z|B{`f5xGSOQys0~U(m3c0*<T+lR{!9&4i~RF}Ltp)<(~oIaP_$H{YmPv&|z$-_^^n zuYcbzLP#wrW=st~r8aU(WK6=0YB|`2p)UCwmrur_m3!+RuY>ns4d~!o@F3nn^;F<9 zUm{bT^$ONsuGrs9&ebD-u<v{h_7RUhayYa;-huSpH%+B}@}6;rm+ZxR3(n16d@Dj2 zUNM&J!{2}6=ZW_V5&cv9BYR<YXT@aQp9#~-E%Wfq(=Wk^mrysfiXNmd>)mqD+9lY7 zyZ@Hw-$DF3RZJv(@mrfWeYp_NrLTM<vn}d`5$=Gu{l-URq9%3PcnwY~-L(AMXS334 z>fs3g<;5?rpP7$$9({ab^kUe1R}3Tn{g!KcwxD=5@Gm|40PKeUbgaI7-&<zV@0P9) zVQ;uCIeb3s1Dd5*NWJ9P@guX4=Z~D(^iUp-FI@WVk_XP`SvRbE`gOej!c<4TLQ?4| z?&G!oNx09(I!@7NOvkq@-+;ajUHeQ@Qx@?xs%1eRsdqi_QKxC1)q0yL+h(jsKDpg7 zGj^3vwQl%R{OjGHJNgqj=lBxoPcPqt&%V&Q+Wune^d8cmKEuPa%iC1zL33ZQU{E0* zdm(J?nzq&YJ0}M<9s)gTZnF}5`)WO_Q_Ss^(1#Ce?Ekidz57A`ccY~4bv8EF!M?@l z=j7stm^j{MDRa=R7sgb+3H^i5MSt%b<g4sjiEson({IP8FN7i;tiwK%bvm>nhVpCv zqaTLdISu==dx!pFNBTFcxRLZVE4>yykCtZFw;w0TdC$L}|CtnU$6Gj?qMkOY<BtFJ zgqOPqz8m3x6R?+xlsn$CYS=Y~Ds3Cpk+xVjg}w2S{&~T_rta?e?}7i)FE9LWW|-jH zOdssm2=?NSe2c5ZW?rJbsi~J)c$x9yQu*#uoRJ^6k?!!nskv#>rsj6-Oelt4?da3A zsh4Qit|`pqAx^6ge4&qYDSaX@yv*jNUVYlNLonj99#Gm<e@u1U-0Rk>?_qqicYpY0 z{tusOpZ}$QQ{dke_%{XqO@V(?;NKMZ|4Ry(uJUu~_p9{a3Z3)tr-57D`VAU3_H25E z&Mz~kpZ{^lY`GSN;o{%^U<_E}<LrMR&i-HWKXw*=wtlt{u~VXK6DQ+$s(8i1HY?8Y zP)v%PGiheTl!<d=B5l#QM&meoO3c(~%#Wq}q1Da>+&dl`_L#BhA9g>^I5xgFVs7R* zJxg^umh0+{=L4ON<(^Z=^XHIZj>lNUt#Q1=={Oh>u{vk65xIZA|JSEL1E(0$FHBC1 zoida4f2#gFhhsz|1mM^nTy6M<zkl`HvFuAX&hfn3_&8UUf7*Yez172!KfP2lB_eV7 zzbU<q_!_Ycbc&y$|JCn5OK-=pqVNm26Qie0lIbBolM-X%C(fP{p&to>-<Fd<+9%@T z=?i;+XUv$_3+uS@ySHJ5v_t`NOwZ$pfa7r<j^%o$@yT*J4#jbE<0QVz@xOYN2k$z@ zv7>*HPRBU>_wzrP0*-krqhXY>c-y?#DHHXw;~2d(95}kU+V;iK@4v#%?VS-{=XNP> z7Jdm1KM0sG(?;ILI}03G3BDc6=MJZ1=kogBzFv;zKlbH#?J^J}J)M*5kJ9fr+&KDC z;B@@IJ-u)Xp~lC!enSiaI9{Kj|J83ak2OBd{s-dhKjDAmlvvxO(Nk=rZIdFVBaC?b z*72m-@y4NwQzgivj&R@0>G*1|-@)sD1fBEG7C%``ipG3Je$U1G0uicXn~~~t9O-l% z=yZ(3|I;6Lr`XHioSi;pV$96QDT(rwyk2J;CntY;=v=<9cAmKdp*iN)YNunH)3Gd{ zj`leGKmBpe3;C<86K708u0_Pl3$x<C<M`@IFV;D~oZBORc<3C5D+%Mj?SDkV?AcSe zkC*Wbz<=K>iLjIHe>?t0`Xis^??F$Q#CtmEhk_?YPO?psYcDee^~Wdyvl48vF*B!# zgqgE3wuzh)$?-SzxVV}Zl!eM+c97)rf{y7U$M=rs6LIW#KEUaGa~wOCk8=3!SRU;- zw&K6>x!Uq%`19}g|4a%vueVH|Jd64b=XS}6T^hi#Jjk-(cx>4HQ{T>gLHy(xn`8SK zeU<S+@vreQ>aQWn`si3c4E?Wu|4;evJbyCco9c8u|LywhoS#N||51ExPVo(KIySEB zpZdPi_&TTW)s~+ty{^9+->FXPO-49bfab;lzW=Aw-ytf037zK;M)@)v`vd;T`dr)o z)4b1!Jig_4$iw0IO7TCnM}hFLHq+-GrwIDu`2SM;=TtAj(v^hPa{T8zjqm*6zlB2j zdw-nsSNcDDN)&|>iJm?ZdvzT@B{*=*?;TFZt8whurdV(+|NnpG<9O}zn*L3%KhN2J z)9cUE$N8*tdi~Sw$tb4?$nkM)wzo3=j@N)DrH21jr(>t+)cT=g+ax`A?r&s&X_hDc z=Eu1`otZFW;*3eQi0CPi6JsLdsVz+Un|@1Y&i+s0Tcnc{qR3b0{JYxm#g#_YIeq`> z@sup9!zf+M_<IeJFa9<slD*?lB3aIw5C!9}e6Rw~qT;U?Q8@m}hcNJrB>uJ_k|k9> zI%5)c{JoJV6Mv<jCXt1|@;0hTWaBSxtb!8j>c5W!7oZ;cS&%nT4(M8<T#$Su!zA)R z*AwM~<l`84J2eOoLV$`v^3e*s=@eupsswc+ssi~C2|OFunaBequO9D-1L5%@kT<9+ zkr~vD$Pd(x$O>vt6b<S?6bEWXln81?WCsl(N&^if$^;D}$^yxfhSUHJCdvWHCpSzY z7bKs1!u5jWQ-FAPI><s)1d>l<;d((sh)O~7Nkcq;>>=cjZ-Syhw-d<+Z0;aR1O*Y< zK_iLMKz9;lg6<;90?B+w{6KdT<$z@Chxma;6Xk(Ii1I=5sVn3MNVXD)A80I5DM*$c zyki(7H#s4XK;wxjLH80>fx?Ic7E&e<d4TRC@&ZjH@&<(ynL(3?d_j|m{6G;z0iZ}C z3up?F6%<7j48o&Hh)XCankXC;Llh0dgEKfA2a@-MP+~!`M0Su|dNheNklamU5}BY` zL|LFXqHNIpL^+_@M7ba=O~OSU$VQY8N+2o%%^@lV;g$^SN<p%IA^kvdh>7$A$tSJw zzFE)%L{%W!TAJjezhVKA2WTOY7ibZYH^@$81|<{uf)*3`fl`P9K&eC)&=MjmXem)J z=s}`TP#RG<D4i%8w2UYYltGjTT25pKtsqJRJw%iVdYC8+B-;*@KhR2|9MCGFT+ky# zd7#xq`JhLMia?JM6@wlpDh0_F2<ZoUf~Xv{hNu#>mZ%D}jz~V>yPn7cw1LPA^dylt zD4WO(dWy&w^fZwl=oz8_&_*H)XcLhY^ej;@=sBWLP!3Tz=y{@O&<jLypcjb}L7R!} zpe;mcpqGd;L0gHkK)FQOplw7spqGhqLEDM)Ks$)?L9Y-Mfp!uVgLV;>g7S#UK)Z>` zL3@ZQL9Y^3f%X!KM)+L~A`j5(L|&jbh`d4hL}t)FB45y(M1G+CL;;`zA`9pMkri~1 zC>T^o6bdRL3J1MK6b*WtC=T=vQ6lINksb6dQ5xtlQ6}g;qAXA`Q8ws(q8!i>qFm4i zM0ubRqI}SYL`9&Fh>AfU6P1EWiON8q5S4?D5><jeC8`1)BNB~;_>9N{^f{3i=nEom zP#KXK^d*rm=qn;W(APu(pyNaq&^JU@&<Ubo(6>aPpmL&c&`F|b(04>}pbDZy&?zE2 z=zF3x&<{kJpdX2{K$S$<pwmP-pfg0dptD4IpmRj|pr43}KtB@|gMJ|@1yvE1fzA_^ zgMKBd1pP)-1-d{a2QL?iJV3t_d4Vnwd4pslX%c3TiO3gJhsY1)Mic;YC$fO*5?Mj@ zh=M`&i9$ghMB$(YMA0CPC=S$+C=t|%$PQ{ulm==-lnL@A$^v;2WrLa$<$#(I<$|su z$^*$eOc)=4S`Zb1S`rn5S`n3kyot&{*AkV3t|O`hT~Aa6YE2}Ed~Jw4KsOM1f!Y#z zgUm!`P&*=DP<tXjPzRy_kPnds)RD*v>O>R_>P!?0@+Arfbs>rdbtQ@ebt6gybtkfe zdJv_7dJ<)VZY0VA`4MG<dJ*M-dK2Y>`Vi%T{E6~GHxU(q`Vtj``Vp0a<efeAAE5q3 z<)E91DnSE?sz3vY<Un~4kq2lnk$jr+79wwug~$vVLgWh?O5_I`Mic-FB(i{RC9;Bs z69t2ABMJq{UD_C-G{tzxO;R3cGEpfgmB_mpdU2uvPzF&VXt{p&8uV5~zMyAxJJ8ca zR?t&Kp`dJ{XwZ{HiJ%QcX`uB)S)g@9p)Jt+>2{#aM0ubsMCG8JL{*?yh@xAf?;%P9 zy-HLBlF!Ct>;uXt@@<9wgD4bqkSH2-fT$EyNK^&-fGEHlZ8lL3=nJAe(C0)&pwEa( zLC1*7L7x&;fsPV+T#I&`$Qx8jlye<gWuj70IZ-+2TcXhG(X#4xpmRidptD3ppfg0J zpwqftYqW_(<)Gh)szARId9*=GsM~=q5EX&yxyuytxB+bwkuRtrQ8cI#Q4XjXQ65M> zSB!BxNIp4?nL}H&FGOjeE<{-%U!ojPXQDh%C*97Bx~iWA`4N?adJzS*L#-gPf(8(U zf^H^?2KCqN+M~|sXF)@VvOq(L@<1brsz7%Vd3V6Pf+!R;jwlf{fhZ4jA5kf2GLg3r z<_1J*pm?Gz&}^a{(EUVtpg5u;&@7@-&`hFo&<vs~P%M#0N6Zq4iaKFbub&0Y*Uxsw zxSc2w^Z-#7$WBxWN+zlTEh7r>MGYki1wBlZ1<E8U0zFDp3R+EM?ShdnQ6gw9Q5t9s zQ59$%k#ASjMxp@FMxq?hvqa^fmx!uBTZlZmq1Nhlpshqjpq={J?x?FozM$8LqCu|{ zrGW~Fia-a5%0ZtJ`Sw69BeH^8)|KTi4b+M#2Xr@4IcOA-M^B8`h^(OZh@wF!iE=>S z5tV|@5|x9_5LJOr6M5W-5sGdHI;U%XsAWXnpkIl6LFb7AKynQMb*mTZo34S}>PgKC z!Xx>hP>_iz8YGAUdSe`+p9OglWr3O!<$<mxssdd{<lP7TDv>Y9Oq2y`Pm~AhPE-Zz zLFDa^9)c(oG@K|AbSF_7Xe3b;=q@7fn=n%+3I&ZNvZe?5c#O5Cobt0~1o~L48N!+# z=wr5~B>9+yXX?+mB0doeiy$9!ITV%(El47Ct@%sx6OI~IzL#5}z&cxbUv7n_*4fJI zax1UPt<0BOnX9e(<jd2RsPrL?s?nnwn^dEwUqhjEEUYO7eiQc}a{dG%z06U8NF(p4 z^bj8}m43n26-hpRyFK7EPdYmLq6{~DNS*~spCj@hQKelXowKHUc<u`HiMFl?^6{4* z`C1E+_OKU$8AZ4D$=@S=BU5$>Kdk9PypTEm!gEO#&i*YAyxD_Yf7b&ud5|#wKZI^_ z8GT>f@gUDP0)68C_}c5ZbnHitZH=nav!b=kwnWceK|aw@=~fSQ6o(@Xr~EUjtQm)_ zD=^m3XFVdL5V;%dB6klR3Y7Uv*=wzlz2W4otQ*!mG+)9xJ-@Rxqp|cdWuU1}QX}gM zI-rcA8d0jd$gpQh^9+lJbR59ZkkJp&GZm^uRyT`C=;`Q5&<Zp;m~uahgxK8>MCK_) z4dKA=q<puIUaI0qmm)mz6Slf1<rwU*M>5riA_x!6ff>tv(hyQ$Myih;-`0!}AFGUN zoV*sxrC<*kjAW?xY-s@@&Is2B;nK<Eyh@ytjic@U8bTdmqlC2T7E=;t+iZ6^SVT^q zzR5P&L9oTgZnE|Gs~2-J2Wcf;CnC8$_mnrJQj$KzBW16TT}Eg@{XY38pC+R#xoj`T z)Rk{IuP%L_JJI^tnmYvA*a%dn9uh9d$9h=~{fe4lI7ulpq5W)O9CnoVhnM7gre+v6 zNa|w5-I|gZEE0yg@KrjsrsUCmXIl##_;tJl2ZJ8MpM<(6SHL49i;~IHKZuu;Q<S7p zS7t6JfiB{w2Y$Kl=j2t%+;Y4^&n2r2IVI5-T~G=iT5*Y1S@mo-=j4xYQ9$ats*-=z z&d7|Evfqu|<SMbRTo#64!=NL|IC9I@9@iKw=3I{~$2p^^uP!!qD$uzYB|+v;MO&kO zw@0nnjWT7_?>f>|#iwYY!d<jbs=u+wC<M#;$DK8DT28oiIm4bMlMQFlA5(l)b*1`i zmPsxPGAsh51w6^CL`;OOm429!CMPt+monuU*+vBj8x?Ojhr3I`-twZ1Awe}s?=mvw zBuSq4rQ)yqT4<N5{7@TNLTaJCm_^;Fu58?_8O74EpM&GNMK1M1d#<DNLc5$P%8zs( z?BKr8F6TRRCZ)jQB5~1etMv8K<C5;~gFe}V9A$v**+}C{_*m&^qr=fbds?-bOnzyG zbn-w}dKsZ9|0x?Rdj27vmg;yK{-n4XfTYzNbHMv>HD=Qf>{+rD$ea(-g%Ft=Mm9j_ zexd=+`knlNi;Qof-7X6uKJvnS3oV#<8f-7eDNFU?sT!8{O2@;4_H*)3_rz|ISpk=H z=(!VJbXuDHxoJAK*2Rn8s*9knwXP9$i#{j|h)Opp8d66(3MjNt9x_wLRFB}O^S2br z#S=XYa3dP7!zsGAG+9!lQ*%&;U6!&vhyVm5b@u2{SBEn8)o00JN*<Lq&!s6iC&y?t zeQ?pjxVvhJ$XD|4Ql?x(sLq$}F1_$V%i`xaJkaY;g$GKfA7VmR6^;w>OHY$Ul-k?` zPuUuWS6>0H+^^=)N0q00<Rk#yx^scbu-Nuh)kE|GT*RxMt4l+SFy+7!G7Y{i<-@H% z`I}*vYi0d$=$Y~Y3=kGhpxLlyq|0UjaSh05luR`NGR{%tS6SdH-F=zM@W&gT;40Il z;Tg}a?#X97@2e}LV4O5Uz{y7PBn{O(eM_T8crN_J)AxP(U5wEDFH7NNC;OomyA1jd zhJ1*~l~qCc$_AM}e^vz@Yn4+qlEqrKcvP5BtYstlm&!3Ulhx(8X3=+X#sBqkEF0H6 zz4btij7m>F2tlvx@~Fu9G+qwva2l_6uIU=@VRkrOT;nLe#?hNKjtX#;hyO@nJsKCB zh2Nb84B?C{Ex|e6G1V;iU|o?XXKvON+hnM_1HorEx~{0!iT628L2K660As!=Ge0;b zFI$GRpoQno5T8&PTfO%~1vFQnDS!z^?J$u78VIwTEXXByb}iFec&?DQGy3F5!N{kg zv7F)gL|xJk>45z8+?5^)vjO`SOsy7C1EV1py6=NOG&A)fV?z(zM@@GP2XTMkfOK|n zaxSXiUx<-h5l4)!s}Vpj1&}ObR8c?|%5~hxhK$pk1%H-mGHGP0Aq_E7DhN>dLjAd8 z+bOMNF!-bQ!uml<zE$?g`rymx;dL|2+N>+$ym!kER~7_VdF~P^Ri>mSd|;`AqXlMT z#5e|R+wR9<O)X_(Nhcq{A8GCDxy$Z_$flHeU|2d^m)@{UlNsTcakocC5jjf9H>Z^4 zlZb^8!z%XAtY|>w>-mOd=AT(LmwuV`3zU6#N<qystj0eUX&CI7NWs?XL~<;;dP$YT z74u0OE=`ZE<7LiZ$r4Rb^W4>7-<S0=is?%E8r_{uM%1~?hDHza3gh?+-Cd;?#=LqC zaabej4A_@MlUQ7hOym*n=~kOG(vJ}vEJPq_Arx97jnRnAW95TGT!YhxL|5Ed?L1?I zhm&_B>KOjP4+};`2o!<T^dpkPi*^hT!xep0Z4Akg%+~beOfEZme68tLJ#Px_vee5# zEaju?0kg_aFBzcOn(ppHBV&tPmd6ER$ZWwhj#^%aVX#_OWA|{2r8N98#>s|(^4~1| z_e0-WN&b51nVV8zuIYl7ZfdOD$l<QllvH1Sxh?cID$ye8jq{pK3Bs^mDzau_c?TDS zVYzihs!2X0C?iKvK=lt03Cf!kSKfR~X@NBejCF#mgG_g2TOw_d;4}<sU`<c+;=V)I zWcH`YAH5_qSOur2c{?1!frmUyaWz>$BGP(R5F+ngBT;1YAD|~nfJ36Z<T8ecV1Q$y zAQwUq<@D8*GMAmjNqH_?kCs#Z{FPX|^%rANsAmnV<v_1y6md>QKz@)m)sax;DO_K# z#q7Xwy*5s+z=rCsl6>Oi^2t`|1^kc08XlEVzn~R?K7o7msRZhtUJ{YSp-9v~VXITI zNZL~e?1$Qff`p?&dn)2%mYzxHvOHBU_mTz1aneN2DZD96<u|fD6!kO>XZ0X%kU5|S zpoeb6nq~!Gaqv}6%bwN@x$YTWqr#~4K&DbT)UVO3=2Xd<2(|iX6^__4*q2JJ9szP( zXz@kFVXbZm6k5zuVHcSea_zWKV6hh3r7AzwO9GZcdjN}u(=wM%rCRN@I+~?qO&63Y zlkKvY+NE0Ul0wn5NQ!)DXB#69!7hE0s{GW5zO{zaLW_sA(EZ{23si?>wO2W4kv5!z ze^j5TDpxN})5s%HFUrl}THShBuCMB1)k<&O^=w6vF@)tla)|=BAf!ZCSB|-4xeRc$ z$|fr;t78pSGFIdYC>g3fl5$46{F|N@>hj!1Iw#*d?(B6&dM=%dc6n|Gos+*);_MD% z${d_T^B3;=Y@U8L&c)e`^mXKKqP$**1j&|8R^-tl#ESbPcgw;o2V|*q;i&!=D;CHp zJy-0erHhP8HEMHCj(j*yPfK(ed;y(H!a3AiKOE?DWj~rL)AEelf?KT-vcHr4Py`wR z>-4wKj;!X~)U(2xo`lK$ioIGEg@U_H))hNUMeuI77yg{xSn-03%afB1%sr~4Ss<A? z8)c-+d3t(UcNdZ8SvJz$&&63x3*;a?Dm|^p#aXzOqj9(`c6D||UVt98P<-vS)Qnn6 zen9oDG<^)~7;QaM5>XTG4{&y>@+^<agrfz@I)+f*7!Aw&P-v9p^vtl&7~v}g%&&`# zpaL^2<~{C+nQTu&^@?klrw@@gw$T2|k!s+{U&zWK0JcjXVm5rk8mVkM9R1=_RA`qc z<cFGr!-k7OyV0)5rcN)5m<hWh!D<L{znbC3u(Pg^$)o4H1wQK~n-b2rgcY1Ze{PhB zn^>+ac#T3v#C6Y;sAf&Z=uWP;8Vj1#lzGc0673I4d`7x#OR$=SxH_t`rASZ9by8(T zOHa#pQe_oOPm|TH(A@`rMTJL(yAP_FyHCnMAGZa4tPvQmQXOlAZ&}5#1|`=`F(uop z$*MGB#SS6smr<qOKo{y=eIe9;Qq+BA$BnfYMAmUR*FuL#{L4~}hkX`T8B=}EMV90t zclA(^_cazHaGN{1#$tpN1Y(~jEY(h`*Gc4QxlTeIQ-)ohpy;M2%f*t*Rk;8|YN7oY z5dVxr$7K#Ix~j!v^yE&xs2+m8>WQ@Utxii>DtJ7Sd@7s#PW7RTMyF&(Qz;u{3eb#M zt}OI2vSznr*-*V-mQr;?yap?|?MYO$k@0kC2hXB$E*jt64WmGKHUP(-OP9iNa*|K? zOSpwLN3O0C8Ovdvs_*&!=?$hDc5NL)2}ID{F$;5^dK_S*AfN7NK4pAJzzqjkrtsmz z9LGaW26?-1iDAOp^n5L)s`mn!AhFnGA}X#iVj&X_XL0$l@(wamDZ?&PaJL4tUrxgn zC1V`9@^)ncr*Uu>ht!XCE6UhM*^r*R5mD3c#+#>;k1gxU&6^HqDKyOar(3)*K}Fv6 zCr5LPdrs9Sbl+SiyKbD3DTBK#8Q<j~;CDv4v`9~r+YkTLBWdsl9_e#nq>G;XNL#(% zhxh2~7Rpky&qlL#^dPjVjNUC#`X|%1TC!g*rCly%LaGRIa(Y$1Ii`jO@;E)s9e*k5 zx%ZNlWM`(V%}(k;yWB^hU&ukb+~LU=6=C-_{6LTHMT~n)o;%%5X^YJ`bdlKgJeQYI z5C|?Mv9-rSSuSlJ@Ux;3#WBOu8l}pHRI}mR-<21x?lriutDj^P5Q?UAJ$u)MlX^*A zDH5JL?K1vGwq>~Q!;%yhST3)vdtCTZKMAXBl$_4Kc)pJ1ydeqlniJu_sQ9Dcq+z+= zZaFFKhI)mRNaXbj^h@ZyYi=>|TrvlXGw@W7oAe=M01Y7n5DkB<Jp?Qo?lPVj;~<`> ze*sALZu_v@A?u<Q1D=fL$<Co9?5%j#g)c5|{kXV(&)3~exQ-+v$fWc%AEW_>N=ahD zWL>2Kbt#`>F(6s4b|lq3X=}m-F2gu&M3c&#EN<i=BVGFExfSU}x6x(7(TVhAdBPzC zQr%d^1?xdAtb4M75me0rAcNRf<*tV^qII>$Luj&$g6xOo^3_Ot<GSUoO)R_m8jDP8 zu(x-2G7PA)HI}4DZHV{DUC2y*QQJ>nX7}S|b}Z(}@rTS3&z<Rdfuy}lo;w?9`_8*# ziMv&`iOjV^cj>dJ*iG@^ZFxqVqz8jm;&ehklH`(WN*>(_w{=iT2HhLyOZ9W}Fw$^{ zzstfZlP0CilkDAOav-wlLvY6q<%&Hq_qX~lR4K7rro>{zLQe@v?8y7%7L<2#dC=~Q z$Rb<eOQFRZHo9(&u;@X^i?yzBPnNS(3z>0_rD5I9b0_|!r~268ELq?1Be#-xKKMA= z8Eb@of=hQsDy5j!ZQrFbiU&pOWQDY>IWa%^u?ua#3vH_lZLJIKK^Iy)X-LCzL|B}R zbYT+gLL2Bp^L3#$ccBRv+Nt`NUw)|zt-ytrOPacbr)nOqa^YfOO_NzJOzw4|-R45; z<3ejonlThV>4n2`O5J*Vf)o1}?1Pm>z@ncmr$f2EDa*93mAKIIU1*zKX!6lt2d~my zm?XH+Cb`f?y3qQQrefOFg-OerCiQC`$}P^$MgF)8O+IYxY`2#*75EkxCQsBfSyuD# z0T(W&y3j_u&~9;|b#tM~o#oCEcXOfrh<UxUo!qnTtQES@w!6@tbfL-p{SJj8spg@4 z!ocCIe3U^Ra>2Z-=AqmM<8W3!dEs!_zUHBPy2IhDI~~?6<CW;ToG(>A4&$uJ?FD+R zc%9Cw_-(CuD5otBL9V33nn5mbp~bk+<nP=&cs0D{VLulxI@C02Uh}YS&BLG3=Qw!( zZOy|{I;<J-0vB4Y3vHbXEzN~ybD@R1(1KiO0WLIs+@tDc3o=oM^=cmeV$v_4+q!Zb z>iPS*B00I2Da0lR=&)vzY;&Qluj%X|7bf#vXi+XSV<W1?AsU0(dy5`j`6Qr2HkxZ5 z%4aH_i}FQu2hQ3_($u9Mr9&FjRF9gPIyut!c5>q6xN?Cxj!{n>jVl(?m}O8I+$3G* z>m>bTzRQz=`boK>dAZBZ`boKTa`{QEItgh6m6GT!*YqiU<gCErjWJXzoMH?mzwG#r zeIgqS1Kfg*lO+g4Fx;`1+g@$B<tts<<<cBh)366X-dJ|SvgtlKAWMS}nC2Dggaf3y z&eD_6iYC&zy!+o=_Y_B=R(b2xGethCOJ_ZITD;^kM+Lb?XvR=o2IaYPM56)wJeM3c zPSPc2q^BZ2{nPCDo1_M!KjM+O-AiFerKYhYvQEd4T+J7(5wvQBYr%pf3WL>+ZobLr zh0EyR57dlwno@i4)ywIoK8XoWAA(r}%y8ca7eH4)PH?wfza1Eim1Hsr&hR3?C^pzk zj*T9;=eQQGPQC<}C%^pt(j{Xy;f{r^-FB$D@t*SfD(2IqgDIR?W<7Qz{L`)UY=lfJ zIk3jeq@6=t$;x3ml%6cF0MYiPNu)1U!F(-4J;fZAc5P(@GK>f`mZV}J<3yh8fv3w^ zTz|S%opdwlDS0v@#KNw|<@ie9Qj~9!ly7TrP*JA>B}va}xu;ZS|NI}TH{&_1vAHMR zf|BTKN@!|bfvz1Mq1ef#ZESn0DFpHT9t`p^lc+hLPT15ZzhaINy?{TCo_;;3H#SSn z2qyTsm?@i*^vlS=c4_Aji^)CeoHe;18}XgE-xCj6{`>hi1!^e;s_(Su#Ov#*R$g2f zv0#~l+9eC3gOqo<lz+KYbh#wQK@K|%=y|!z_n%-oPcwM^Ap|t0*x!H_HAuGRa)sQg zKig!vlxabuW>hNlGgM>o#8us-mePw*?4ok9Ja_nyT?Bi+;nIaQ#pMnfihm&5{hIq{ zsNSRBv1cNBXjgm7$ONNnET$BZPfQut6D_YN^kuAS;M(--IVs<pKrXPLEc=i_@@|7? zY8o<Km*2483Ar2hG<dF!7DW(u(#b2&H`0Tp&Aui13)(xns(JR8QbgXb0y{=zhw93` zJTK42$w%n?qS8H1>P@k3KM+xM6%VN!A<2<g&3IgXmg3=G9goW`5D!{FqImct9(t6G zG*0k!nW-*zVY{@W;sUQ-X8s?$i2mc^VsR+us+zfaeh{|@lTVe(f<cdn%B}AX`!p)$ zi448h>Qf*)F1=Qz`c%;w{lP)iu{hKLQ_?lq5g_Dj#<^d4UyiV(&nbCX2=0<+Y8K{v z&^%yGdqX{!EQKP?j9@S#=?K$B=x3KqyX+hucehg?yhJ{VZ+I`4?Nfa=Qd!Ug#2s=d zIZ))&gfck!G$BP2k=4UmPEn&#3^HA=RtM-$tgS~}J(qmI-c?7;gC3IeT(Sda<eF)! zPc_NOiLRYfWNfMTOUVmBY(;{+Cm(RKKJIV@tyu0O4TDzbo){^J+Q~b)aDv<;YS?nS z+(!l=cTRFrD?|N`yNo36qRIhF4M8Tmk-BO{R!{6g3q2p<`Ty8^8}LYv>dsdhwd}Sn zXki8zjKK|PKw(S}@g$MsA+$h-9vCOWQ5+?i5E(1B5)Yt^T4ROCc8k^oi5`K%&OU3h zBvBII#G6fmlV$Dkz+!1)Ji;-_7)aufJa;E7do!K(-RpcZn-Avx{->(mkM39VW!UH0 z`&>Qt^!rwwI(6#QsZ*y;ovQcIhypRt$C_%pUO1PA*ai>qyFf-j^@33jA(`-{7=GB` z!7ti@S9i4GFAJesx)}gFQGtN*>B>*ytaq=ES3d}TG?LG?6RxT;PLWewe;l{`SRT{# zDyqRk<NO%%>x$_}EdROVkFJ025a|B{t(h>`vZ;~?t2-(A5G5X`vpR#s$;flUbJ!%U zyo~BKaU1&G&O}#6$uU5vgI-vL{-rWX-611oFBL77N2QmLEO~Fb3I{&}n7VR-Uxv;{ zev4m<xPiu+rSb~i7KLk}PYVp*6yU;JKX1*ed6%rjxrf}Fazj@ivXa&U4&ww7>GF}g zUSRAk^yMML-d@7(R)iAn&9$#K%L!yAg7C(=?p412kXSD}E(QXYh9a4(&F)E+9(AQ9 zcyZ}bqbDxC2l1H39Z8*H*Y=K*O{T93CioV{>m%g51y60mjv+NJk4re=`A*d!WygFh zMiYG)p}0aQ`eGD)QaFv{sN1MgL|H2DuOKx}>$T;E(?psdIUPxNGe@ski)_mDCny*C z2B<q@3hBz)v4o{g8M;0Y=_-C^Wl}-`aW+f}2M0Xo)GnuG2YCuDby{}U1=JgQ;dp7h z`1V_Vpp2H&@>ok+({jVS1WoOXFOvmFn~X4(xIbB9B2mJbH!UTkU#t#>j#FtPN-`u- z(rAE!F=}C(nkt1d0I0!j01DR`Z0w+W&btqSymeG%yhXxtW2U_Q0-`DP5>05EtCy(% zaG2aiu}Gfa9~HgXzt>Kp7iQk5kV@H)9hKLR5u`#X+FrYJjlmTdS87}ix<nuDtIWJV zdabU3M1OIL97FoM@w(4vDZGf#!a>=eq1^oJ_|$vfe_N~uWZ_NLcN28J2C@KVsqDpJ zv@dRu-n=uNLky*$mw$R&B8E~Dz@bYr3P+#4ENa@kQeeab{77eDJMi%JrvpHFeqG4a zh!dv-6Y+41My>AfiYq^4Tj7c`RHKM91im%5zEmc2Y4K^Fr_FN|$3O4`!iCQzlIzve zq@tO%^nphGbX1D|sk8Fk{wY^^gMaF-ysh~Yp+?u*+D0+7Wyu=bysdd_D+nVe=w$Ju zS!xC7Z2=&r$WKeg(%J^ratgz_0D>M`4pXB<BH}F?aVAo$ihR{cliKNRchi<+y<D=; zQgOx@?3{Z?D8&LqmQtXVHH<n}fvqMUA5-Ir2rLqFIjk*c!nEomBW>pGFO(y)omCMX znoXI<Iy6hzU5l4Thdi*YPG>~N!@><o&UH_ksNs}(n%886S{$z^qrNKQG3twtY~v|m z)XVpzHrsD^2fArbeM5Rf%{_Yi&+NNHEJ#9~Sy`njX=BJMCN6Nm&E@bMuL_U;;uP)V z=&$($@S)gIxwP>=(G$%Z1B6zjWZT^lx}_puipsrAbciU|U{4ewr63Mn*&i>vGcP*X zv&>=LsByR6_WpgFH_nmS7iRcdsreDH!K#0rp2UL2bza*k0h!S~e&|mH&`fCz+Og*; z66LO(qJ-Ai!;dH;k!5$K@X!YDl`oydiM;c`Th6x~NgT5d$LyC*f_<lQT*A&ToeGUx znlHhmz*7!~$ocC!^?J)HENJH?vvvZ2TvybqLc-}9UvjuU)SKbZI2yrcR8#vMIFSNC zYY!Xc<&caZoQ7TA!S3qD`SABjQ~WC>B9Fb??~oHo1soWM^AiLc-OEHc*%5o}?Lf?k z#;NnzPdi5l*v7H#cPN5sA6>q$<DQoQGeLjsyZd=O?IUACxH_Ak(q_dZ`i3h|-1tbA zp76!Wcl~H+N{Z92697`nqOh@)#9kE@T(J&o)dx>BxunK%q;^CQ9Tl7f>FxpfoC)0= z*)gy8^v&VW&+K7>&^(Hf;8rskw}5V<6kTSyTUVOwsjs1_aDJqju0vXk=`GF3^O0&- zhUWu56x$RVr+(%it3q~`zoOkWS5j}XQ2{DC{aVUtkX_3=wF|#VEIm0^sO><$EioFS zg$0dO;KtTZZmF+HuC#liRthEaT!bPM0L3h*+FH)Qk7$e|pwz<p97*Z?m-Um|9&xFk zX9>!!2%Lw%{9o4pviFMhkiI3Eo{!VJ;`A#dn*G$(&+oNyr33*F-eu=W|5p)lZR5W? z7LPr3^6U)D%8&T9WfOjVWBp`4@FnKgH?CMOJiM00f-PlZfk}Z_aFKYg6>Fc8@)VP= zwI^dU^3#DZAV2*F4rGj+&bb$v!!&b)=8rN9gm_QkZJX^aAb9+^#8}=4x4CRG=*b}F zTi54G1iWn5PHi#qKKLQZWY&0%T8BhltC&DX?uoXVKbKw9Rm4FP$A}&48S4IXo*I!T z`E1^miR-11F?MEc*wn|hZ3O&5W}yq<R`Uk66JA`qU$-|!E!JQhU+QdbYio<o5ikz* z3=gT_f2ciUngA)QuEJ!=Zc)feP9gfse~R8HA)Ql#@IrrSM}4+EHt@(+AT#VS&1smk z1FA5($n9KORrbwjWZx7k2W|_qbx`Ax@wO9{y|bh8BN?2}G@Sy1<P}JMW{9s!LJjX! z%Nyg!>2+U(O`{g+`t`pFbS%xEkioPJpjwtZSn9BGwp0+TqN3wV<&?!&UYgexEROu{ zhP(ICPhfUE6UygA>jdRn+uhLc3QeI)g-LWwhBT~DB_TFkcId)4r<@Tn8B{&6m~z_o zpPXjKPRxY&*-DtANZgaDoD1bL%e>2wA}q<5YRTb*!C7p^3`mx#mw92}CR1oq{%X&# zQqf|7c-C0>7%JyWr#GZw!O{2LF?G8QCb4Bak}q!(yvtHKI(r1R>d)Tei?EQGqLR<I zVlCjQhW^>f(JJdIZ9UmVT#<1?4+JhnmdSOQHJFMSudf)UR&(nM)RbwY)UvK*{8sUI z>L>P3od<t6()?ZXug{6ULgM<*E;M@%{54G9JpRr<qve*{q}nFw(XN*6F?GIh4dw>~ z5cH?SbwYYksYhquJHZ%^L03tP<ko458C}9Kk)PHrjPElp_@lMmBMeK&hza2k!XRsr zlF21Y)T=5YB{PdWQAk&#c5V2GqblXa;@M!p%%<N`W+h9#;m$TQiPSxpM`n`w{DsZT z(%JU%ZDy&J&oE0vdaGIL(#<Tb5P4I9d1v-(sZ`mn&0!i^$sB7Ls{o3RQl#T9v3s;* z=8c&J<s2Dpvl+hJ_%$<zT*t7~s;za`PW}sOnQIp_@w`@Yu}XCjFnv*xVU%Im{FlbC z(6>)i!xS3T^pv-*3s)sZ0<|<hNq>jwNv&fHj_~8oy^L7M(g^Gth18Mho5Z-JP~5Q4 zR|WXMmgaYmH4@?F$|A`Tyx?Ztt?RADBwx*6R*5}soDCfjftm`v=++m7z=SoV(G(n} zdkwE=4FiR<@#&NbXV*!|WUAS~mCPRcBdFQgWS#8^u(4wXQ)1kN+~ZYMs=p><<8+40 zYyL3}`e<o*4*RSa27kW>REZPJj(wQ3o&`!hURA385_ck$V?tRII_O$k%*8MqPls9* z{n1@jI8d*Ot-$1TQAe+;AUSt^uCGwj=CNMtJ$+qB-&3am%af3o91P$T7E$iHzB|82 zm*>`Tv-fJXb3ixM<%P9*%Xt-;zCvJjj=0&^T0)qqu~c3j&fDs#x7ppe1?P!c(2Mz6 zjJW;elkMy8B72nD(kRjUtnQ+1>2$deaL`_!PLY7qn)H#`aOh{I=(cy<RvutFw%+fK zt@k%<rw0Udv^x<50KBs``E0&p<~42y)uC{`*oxv`T|bPGzROD1wb~my@a7=t+mrsp zZMJ-JaP5u~>^=3mdfad+l+l}TZ$<zHB>;BMV0`dx7nKc8YlY^x$3BJmfyLADdTxGb zDYw%6LUZ7(#jgy-$HUpGue4M%X4PcC5d~0-S3a%%GylwkknHBzB2S4qc1;<KYWo%2 zp>UYAI5ED}m3wO9Xxhh}oerFJlRMirbB+4wkYTgI2F77}nhOfL8=vzg2t6D1@|cSA z53z`Vj_Yllo+BIu5)Ry$*?BM1j-m1$bbJ4O-lJg;C4i0Lj7E^&!tltt24{S@o=+}Q zri^%v19qFZ$=SD{%eO!T+s)duV%-UmLS0pU;oc-a9Zk6+CT)J06ik&gH<9~ivg4WE zw};N1oc?wZ58gvorheJ=d952#NlSUp{LbdbL*FIhXcmsCGH|Z(OS*0kUg$fl7xxo< zudsVJ(V@eg&x(94Ogtf~-K|qDb1NrD^o2Fbcf!Rqsv#dppyf{P$)F>~%UwggqH~qJ zR!Woxdy668F)SEPNlHwu7<*NwzPkthvhwr%^=SzP|2ySLdU|ot79Mg!kKg$6Bk0yM zjhA}EVp!svTmd7;*)l~77O6RilnqR(2!n!<^8ulcb#TTQIO{C{2}PF)w};LZ1=g@V ziibJuhe^=-Y~RYj4nX5BT72LXg`^XQwTyL{gdAFGQZd-<`xi6`xYL<)zuKIbjgt3q zXn$*E3&gRcEj=QcP3S7^Ri%U07A*yt&@ZHwB=!!hx=LZCl@n<u)TE7|$QH=gACIa> ze`?06Jz26fjaL`w^-T2iKcc5+qo==(p8lRE#%B)6fLcdRz0~7IVP5hAZ%Wa`_&n<D zhkSuIukbHCvpwuG78kfl&b{ha+r=f|GsGg(+2hws@ZsqGTMyXs9xg$FUnV(5u#;^3 zh_Ag*h*4)&NJ-<3FH}>4&FnSIp5=u;u`Th%0q61|Ulm04bT|IyN*YCEhB$}97iXro zhb_AIT*ek%o*e4~Hky6;#;1KLak=pDp+5D+a?i5jb#7Rn5i@nGM8r(J=#P5sv2r<G zqwtc>rj)3jjL~|4(dxAGWo!mq_uM<xBGIHH70Gh}iZV%^3s6D;)@ajv#@glM;;1-x zbcKJ!Z)Za3sf7PbN2(J{{lp7mtgx(y_Be5KQ!YbaNlW>rUHy+B*i4M6<6+_7HUNs$ z1x;3bdAQ@!a_!`4>DD57Azga8wiadeyDW91%`b^8MHNv>S%ptJtn4`~=MG+~CVA9@ z<lgBryUC@plHeHxWqu{~4Yt%ZphSdbC=u#c-(3t9d!tMJuke*g7Z%4Xu8n|M%;&`< zO9FrEBP2)MrTSHfOK|ory~3lB>#Y|k5D15Bw%IV}Ibv@}I9|$Wnh3AtiwX9<5XWe> z!>~kNgkAuWt+aQS8({euOTdUB(yLZl>*M^0BD1W>H?GjA2cVKZmLAk!vlo8q1xqEe z07N1KQpwXLpYKctPphm3rU2n$`PvDHlQXvzq+>ZM@2YC9CJ5aoLQ~xX)De)Jiy&bS z1YI8!RE(I1u`PmxO9ZJ-d&Z3*O7z_P4GlKwaJVFWuhp7X)CmRFqM$~e?|NbtXyY@e z)_A@Eayd(e$w+|;P0*jDZA?AvJ`8iV>YwuBzD6-<R;i`3MN{|`7Z}Py(_4Cn`o;~W zCy_E?DZOgDPHTx{D$TjG2&lAm{ZzEM3B+N8DA%uC%)KB5)NAn}iEX`2A@eCnHbysr zOo6danglxnxzZ%LKy$f%+2gr91TOSxOi1}p@@pace*NNGC#$ZUzc*@Pz<`)sU+%f* zyF;tu^d3JX#hX-WukSk%gEF{}pN{xUKw^%}G_|s(h{7R#00~?s5|!i}p=mueM<^j~ zZ$udv$`AF1+vWqgB<}7Bx6CIJ-<2oPZt_r~VI*2*5F=>dZwoIN?(64YTqA}4uh_lx zfj4{ViUU@ATfKFKgZKtbrL8Hq=B#de_FY37E(q66jX(dF`0(7h_(ge*bxjgdLgnQ{ zHucFp6x-HBX(g9x$>}iC@cjwJy+nMa<X?6Mn=rQ|mAJRI-;x@Kv#MIttJxlKAtY>O z$-I^tvbx$?1FE;x8c;A`s;89@h?F&;_bh8b-Lncp)9bMKggqx`r4siCx(m#bda93d z>dZ*b3y~GB5r^Xu1p>UTE!5=g)(kAO2-eBE8i6nwTV|^21rSZ{dPKg|eapGUvn$rG z=N*F`KM4ttWQrJ;+Hp@r6zWQIx00v+PXMMrJYep{TBKCLZ|Jusf4O@m$xj}Fm?pv| zsC!i@XtwtrN;HwBV1P)`)kANAOhoc=5BbJ}7@eTus;(-j5zG12pPo&J={Z6Q;9~;x zxaMc`!d1CN^MXo-jKaes#)^^>g!;@%S=rJ-{OUwQm_b;olVY;U!qHAV8;I5GNS>cH zl3g`NgvZxUHOv;WB-^SHSh^aeq^dCxpco>qQGs=|Qgdn6m?#|jQPod7Tm?z}HwG(H zqe2NW=#?T;rNr*>R#+v(ut~I&t)NPXIhh2VY6Vq73~ChI=P8(Ng;hcfn?ze}1yzDt zV+}+V59-BQAib;?qmh?>y%-g|a8&V-UFIbfAsm~k=y^_XYd$q%>0qxV6Y}Yn>4Gtq zreKt!KL?{qALLDxXaKmWLF39q$3%iGm*7FY4d{vmv1r`&&u7jgl#FzIVIgn4a4IYe zrVVnSRp*3cKkGnLj%SUMuaR~8(HFS7MUr68tc(cPL$YE|@Pv5jhYv@2EG&yUnr~~z zv*kSTXkjjD_%A|USh$Hg+HqcTemDyY&!>3S7|B|0o4TPR#4|3*m16dDTFNx<!mtw$ zATx9qg+#fxaFl}vlL{BWs{OKtpwOC6bA>aNu41*NNmEMK%C(pQQmtoE#O&33Wes&I zkIBZO^jBhm(m;AZ+%7C^@DsGHR&eLLVq0k`=M|l;0`Yql%k_6*BDyt=39*RU27g0h zytONXQ@KT-YwzFeMcFnrmp@yS>BYFLhtN|v>zJFBVhc0NvN+lcUzmL&;7qP;5@}~! ztf}5?LSd1gZv|7R{S#n9x@NzJ{0c2vvdqtJtxVo=*NlmS!MOcSE(mXYEKwA=$;!lC zGtuhD+oZrX37d5I0s6r7)cZ4m$_b##`}R#|0&y>0glXTcm7kn3b)P0nAX-i$+tJc8 z6eFz|#!=&|rhr)m!-q(omhu$W%-H4_C0rIsToiD83_t>$@{|7m`)?Pp|CZNQ<{msY z|LgbPqU)vQ&R&(cScF!Qr-VD(O^%7nh9yWYG5V0=m=s?zau)mTH36B%!X}6!RhCUR z2|C_hL+)|>y2XO_XMF|U9WB=IKPp8cec*X)UhUMx(0B`|WTElgQTVxI{OibwKi@bR z#z7RuA8#cQQ709>=!<du-Py7bradt;WRrw{*#JY+of|G(bM8}*mx=&I8~Xv)Z)7Z$ z4fPa;iK?*MZJZqvF{!yfw7u*deP^p-&oZ3wO<oyb%F)yj3U~_#HzIpDgk5fFzL@o> z+xJX$45Vxl)VE4ok^?&(Z-)IRYe@DUJ<_j+J6ik&nlmp|Wnp~^nBPm^(nMidce9?a zFUdwg;mCxnwM0C$##^W=S82T2+wbbEubj3`&t$Ackys0*>d(hoq-#jFXa1Qf2_^$z z;E@puBnE&jnGmE!lUyGktA4T!h#E=mE9rT~>I5CnTF&Y(DiFlpSv5dNu=FQrlLY_# ztfjj24(isQU}RhAFT*Cw+**;1vZ?|zKX$%F&KFKYQJ5S5=$(+plG+gkxqd6F`w-Rn z9V6E-+BCAr<Iq|9ZHcg}eCGu>>l*4oKNCX77zSfBP~Dh%Ufh1~1$8pwfbj&P(gw?R z(gzKhK=CGab~-MCo)1#Z`8J|#+Ck$^;Xp-olVos}-<B<3=irb{ut=sgZRVbfDK5Ep z#ov4}#WhqMW4jyo5ht8tnLCm}+**Q-E=@s>1OgW5Dgqr@(h;^aao`>2%croHcQt*T z-pfO{8@<p0{xPAJFCKon`Z}s^yXP9jLVVq{=jXC>OUMO52eZ>Us4yFvRqpCkKMa6W z7kmY@d|kz-#%YKAZb^Ai)0mV<o206cL^fH-(V37;>JHT;<<`?TXY|nqpXcZs%%o4L zNo4lERE|E5n)Is{4w-=&dal*;SW*Sa`^l6L^>Zt9xfNOo5wsiwD$Y?5`4N=Y?kpaY zvv^taY1@dYTG`Fc2*Bbz06}g~vLlR+MmX%x7D;-sMUoyOvao0LUZ|bPXAbI1>;@Zw zv{F0sROk-VM;Zmri=C0Y724=u{rF32Dn9~!V!r;2KD`)ydQb<h@@wHuN|>hG5@YT@ z9ZmBNZ@4Lq!S`pIM;cmDg_<-NRZ56%7@FMw{TDhIzb|tz*5Fj*esBgN33%Z<WEVWt z$1<^R2YWz_iRRiV#?AkwYtLb8PvMi7*9qNnFXj5pQ|0BJ4-=nVuDfo5JnNRgi;j|0 z6u(KvH<R;Hw#NByCQ_+jLn=n-#q2wcAXO)So;tkn@L`jv(8bnXWKdoSj1B$p89;#L zfJkc2#{XcOMW`3a2x66*Coe`@j)1IPTPihKmA#{lsNIc*qU{!3C++zu2+q`=vcZJJ zere%p-nsN0mMcYn%2oTNYn98ZbTMy23ODrA;d}?uB<{Em*<+&m`G5<+zbj-=>6x^2 zs6il9Egh9B^r$3#hwoV#zr2g6Glhd+AsG^{RxW=TgYVKT=iNC4DW)IgCEZY{4N?b0 zJI&$ze#DW|oMN28SdmDmzeRBL8S6s^WINokLXk2>0^4y?rEqe~%qC4L96Cf!qM*nn zv{}X|G_9Y!JfXK#O;_&2Y)7tzEy}Z%BqTtU1HKV9FWWwmeb{lK<;+Rp;0RL-xYZk` zW%bbbMI0}5m~~O+PHkonH7>>1LO1n+LVw?so`p7vVAQ2Q4e|spByNR=b3^oLKRJ?j zG1kd3g_O8|OY=YID*_H6DF)ZZ$Tk-P0Z9zXw;l2*4m%HW?!y^asZ#|C3%|b!2MUKi zN=~w5n<TW>)FKLJEsHFu{&UEJv7${DZgR4q{xez7L*q^-3)ZRUFALFl*R^5X<)tR0 zYrQd_&`|LfN(Z&2VU(gj2SeAkYV4#2U9{pd9nWeUjsw=Nj+L53X78xu#-IP=`R}~b zs;bE4uidh0lguh$(>F_Ad64$08Vyb%9JW-=Xn9hH>RVUlk7?gz{hu!H+B#o9CU7eT zpcVU=^oZuh4~2=#rag6o9?rOKu&E%`4F&~3+zpF{H`!H6(O(R+!dtqll%l^F=04ui zFiO#145P-SVU&`Dk^iFm0a9=eMZ2{dMm4tTCa$3=kR)A0=JK_8{<KqNP1T!IWr7+K zPL&fzm)i#OAG!`+!0IZXvO91D+CR?a!V21f*Gqk5j_dVlu<%XlEw!~ANfTP=PEr^* z3EsW%FzX(iSsR|!;PCulc&0jt@KOKH-H60}EoAd7WvD+{03B2wo;7U3v*x<+TueOo zhi6q2pVhF5{D=z7ydtbcuj*wjDj%nH1DCrs9(#!?{=<Uf&!k^3rbYAs(g`%99;a`C zHF}VsibVv_=kLs|mw0u_hx<;Fyp($)3y?3%w?Pg+k!voC<07<Pnq}oWK7Ac^(hYvU zq`p*D-Y6$>kJZ1ZfhE|R>QyCcd|khFekM8-n^+5OnbR4R@wQdYmpKXfg%?Bpa@(>@ zC*md)UXus6#M^s45rRqQfY^6orKVh|?>bv4bzi!!*|6%{AaY5}IJ2g8KpR6cn1MmE z;}}z_nJgJ><XclT%k78LDt|`wY81UnWaM#j<t<R*hYUp%X0_LV?R*S9+Tsuj+;l_6 zv1T)ekUDwO;u>YH_+}2FvliFD3@l#raomn2Zq4hg&cG&@wn!OdPh4U+=<P18L<DL+ zB9?WWcU1O;yNKSQVJVS2#s3`&_oinWuYodZsFFn2t44DaxynP;9b_vySexma^wA0> zTeEDUb(nC(xCiTe?<krCU6c4nrzg!zq$Ho<LJtZ3H5bv>48I@3E21+Nqp*5ut>3(t zp<1gXk}OY}s5a6Z`O0=aB25u3q$w#P&0aS34lRQ=@J_4mR+rDLuqPcvN;q4AYHI-{ zBnxPfD<s}cr0iCeR5<wk*>0jpALTq(;}KK@j~fElpG~>67u0kSg#Tv|JZ7Bxz^*^j z{(3R(uLrOF^*B9BtMri6{v5kpKiNwQUB)OEMws$%gG2eZ0!sIPl-f0Q=r3dLNsKQ) z2Nh~B>B(H5IJcHfLoL>^+*;|eJfJ>kN!v*p4b)F?X#LPxSrc@eIkb#HuZnScZ<b?& zbLq&$`*h<$8XBqz-mD{}$(yw&W7(Ct^Ae`>8r|2fH+~&2RP&uNdEVosmc<??)fsu5 z^wREeS|!yKQlK|@obD&%o5q?4KxVA@rePF|4Wn3~m&n(ox-@65@+)7HSQ4gHYbg`w zAZeK1`oVAlSi;h-e;XtJDvwiIb$P9}LebW&b1B?KYH87GN{Y0ay*MwE6Val1nZ8F} zrpK(l%@uHmA##SL6mnj5aXGy+J3|VuUjq^O!UqfV(=ns#5GF`mQ6agNl<eQ-R#JK- zYZ=<Vm;5$lhg*>8UC8u%He}nB4>q+xH^%X(B=5CSRq|TpIam{*@LE0Od>gxz%U{MI z%k+tyRUQ+1u~2&j6+pZj?9Tb*d{rf?Ol0)y)tp$vaR!!`WKCiy`hyb-4wo~5)ZPTp z9tUKwZac#Jy&N@%&Ar5EfD8jY)Tg>zU_=-&a8r0XW}eTJpz(#giJvTv6%JiSPNH#7 z^Q!egy+zX>HqT3oA0(?>dM0s%yJC@REUTES4&RB|h417<i1*I|wmN`S#{l~@urHTP za0uWN7A%@|Cg5)iy>u=m3jHT^NZ<rrX54L=XShTkhYQt8(rgCRLt`C90Y6Rr&fg2u zcx%p-><B3IcfQg%{T)%e*;#x%*BSQ_cL|ksO+q|bPnDUio4<Q@+-}4({i@A{+F$Z- zRE6`%$&07&1B^ne!ZP)%y;8h)zZ>2)HHw_hD1id20D5x#FpzfEFc_-$ESg4ExhdNf zA+;;_l+L{ff0?D-6x1itJ&=h`1Ew9FV7rE&%BAsPk~IFAPTV7E_b|xe81)2;$0*7g z4V!qq#WDSz)vhYkUbC707*m5{#iC*A^vB*fBiWrsF>T$b=Z+B_uwW;mJc10kJsY|D z@UfghPB@I?`f;bNT69E_9H&PN)LqQq0wV&Q9uXd=M+E)9l^zjq&sUGAgWB}SgO=ES zw#f8|GS63!XzZIF(L>`Ar$_XheFiIY7SlY~Aw15Fs7DPczm8z!D@A{?Yp=HrMk#3+ z4XQLArNl4@-2e%Q(jtix6Qog(o7hD%nKD;<N5Ilz7bz*Si|j@2-nG9we|N7+<B!{h zimjdGO7qIN=JVRAob$32slZ=Bl1i6&r_#GNf%oYN_*9MhK*hTqX1lJ{nG7k+K0Sd! z@MktMD-6jAXgc;R%PLSs%c<=&irx}5y=Chsbg@`a@A>fjy1B0ZC-*Tp*Irl8G0u&~ za3_I_-F=A+(UOT^&#_!P2K26{A*fn2B@P=sniE8i_oY|yrT=wr;n6R4adnj3>4D~_ zfngPskLlS2nP_W6HoBh6#-=&pD04!p3+*0!?FOX;#8I$2uW43wpAbb$Lt_reOT{KY zUIYPRcuv$BITs8d28#jujWm00tynv`_VL<R-`sV~f15;AEe)AxJCbbVtZ-0sP)gRa z>z~&cPs-RPVA~R4j?gVxgho@#W~9#dfJjoMo=s~KrRXo#Nb0aOj8YOXD7n+TdL^gF zG`Ldq7o%L|Ee)d-{lzd3@Ro*AivD64TVJLWs#5e9V1nyGmIUTRtb6^Qg28>&+ZoB+ zsR)bZ5>J)PosDzpHo|pJXI?h42BTUxR9f#xsy$P*J5LC^g~mbEGjK}iiJUFA7G_5# zqx=QkpXK9k=bu?q9SHXc{o?a9@#UZRek9#J!j_Bsskk2)0jN{o+dF6<=l;4Izo$?I zGRD|O9Or+|fy(`jr)#{U!mfbN;bUZ+7_w7;T&c5Bc3(?fg#h=pR6XfWWUcBKER*iq zRFF~7u!3z;*QSmaYX3I`2)n-~#-B7}wyUbNGWd+cCE_U$yE)E1DiUu7*|B{1;(|N= zX)F)ZBoZwISWX|J0^Szg+t2WpVS#oR4*hokJY4$j4GC?^rKto**`s_5s^z8*iEj#8 z2@$kw$7k8AWoM;+<@#Ue3!i0AhF0EK?-=5emm3S8U6b|9`(;DxjcvStet604T<l@E ztL{A<5GW1vqBafl!a0S*=BZK6037b;$a8VHu5F|vz_cF)E*$*2SIOh-)8z|~dPBq1 zZj~bb>wV+%gSSoJIyqC&IziQ$I5oe^8l=35mb^;Su0x{S)E)aKXP%cVH{1A!*y&S! z7OP#plNGQAA%>Rsnc^p{@aXQJ+To@F_qMNVU8|(~((pf3c$5`RR|I(b($G&O(Ct%p zC6&D|kqxL59%|dSV_kd@{w|(a!K8{o7{i83<7XipIzD4`pq=<2$Op6nS^xNsV^5t1 zpK^4UWWWtc#K(qXbt>_&mAHMWd_eZ4IM7i+1$k!Zt5zCvzC^e6dB_ascHK@ex8$!; zIIUz_^~?M-CxCI=z5P5TwtG)11Jw45;0#1B@g>(NG&^GIwtGu@11#E&l~ick)mp(b zqIk-%a!r69IzT&$8sSpUmz9@we<$MYawJR>mc=gFjYMb`9#+EX&dR$o#^{#07g~P1 zG|xO0Jh}xsqSd22+W70dnxCqgnzbVdQ7>=Faly;_0tDX!>u&rGWqICr5#fyboNzla zKW4<h6RE;D23%Ve`;s>kl#F>{gamS~p){N5HhbCaezUA_T<r5c3tQ$&^;APai^4x_ z-J`XoZ`PmU<7=+bm6HgpYO<y1iMVe->Us?x{H7d&X|$#X4A~|Otc050OJVifl!n8i zNyhGNH*{9^XLfPM)v)Ia7i8f2Ot$}DY}-q?pM?T_G<1s5*K3#7R*93k;84}KW>zw< zN|rPGwvyZy_k9aPL=GnIw!p17C&;AhD%{zU)!m^b_0m@LdZ9MPyym#P%%!xMS6;C1 z0|&yvpCA`TK>cRU{pOwsL>%olTNb(T1lpB7*yLXQLeU(^+%1-KCV&<n>Udk~g`~Mc zZB6yHN{zD$oZ#%r$i1IJF837~xetU~gz`lYsc#srlBSqozH3sx^Yd6H&bzpjyIi@# zmz6twc~03vn4O((6xma3ENPm|?ok`9MG(YHjTq)`eKZB~URKFbcQMA7@>w0qNVM@= zsJ#hz-exhgiV?mpuC{>r4^o@u(J?D}&du|5uHoC1X_xK@w<j;#z%l!KTk<v0Y8rF7 z#g<%GdM)JB8H-e*sa|Em_MZ;VZ}5&}y8Ax#qCZ`jp=WMPtLinBJ9Dq>3x^~m5)-fn z%z?d`THqA{Oq(Bq%a|J;4|?H4nM3vuNsYRP(d6s9C9^)e_;nTuQ(djQ&@)elnsoBE zUGeMNgPEe_&ah|be)?8D?(YyaX}ZRfYm(q^V=7}6JK2yoR$YK@+ZLrg<Ra!4%U5kS zZVg!}=Z5WnvZl4pA&hTlV#-6H{*R}ULv%1gX=hQ4Ty`-8{Va&;H*Y1pXn*zrH{Exe zDpe=Cre#xL=5v9m`UGP;Qwvny_;yBWkOX!o)~FaUdW;{5T9scsM!Ks^NqpADJ@|KB z7o>quUfxV`N`TX2+?vTfYBoF&|0N(=&{?=bIBCk~l+aJk=z)~CX9`!w)EC<RsjRj) z?Tb&=cW!;avG@PT6&d3FN}A+^dFGbYaDKFH#mg!3`NvLBGHp(>US&1WZd6uPhs6+X z<tbrQy2^uPUtJX(<^)Eg{p0M&L8z3eEylRjG9d1<-<h4#H^XtxqO(PYJ7%tG&-p<* z!7d1XHHuT;<r-x@`}!6*Bv!gqq%3uY0)LCrYJ89+E2V|pYg>x7m-#GZnwwdtsyssj zMb>E}qZ@}CcS?6s^ar=EK?~w>vFNp;Y8@fNjh=wMc5-0-bk1h$F{`h3vS4p}>6g8B zF&iB{=e`*?_ob6(Ht3OYsgYIasuS*j4*-2EiOY=9%Dm_^i10TuiF-e((ur*s;JQj% z0@&OD3Y~&l)Bv=;f9-R_lMi_QD`OokIYAShbu(ccnuxi8lAI{i9(Hj11PA<N1n)0x zhNHS{dvf}^7KuWX6`g2A?*|Eh`}o=wA8zQIy}~{{*L;NheP?DA#Yw$RXywku!L8e# zT9SKxazi0d<n49+x9>}*=sj$1XXDs)=2QEBAXD+!#r;!wBqrLl?;nNk+kq6d%a%l; zg`PZkrk04*mP-e7=hfP~;5Z@gQ^BNpfMVvL&UM11%Knkf$<p@(&O+8;7Fm3sI?X!8 zu~wj|u>)(4yy0xsSB0z=)o1b3!{$w)5g5s%+=kC<URN_r(SK(-nT~x*{&kPZaGMk; zeNojfn9zm(Wz%&wVl`?Qc$jhz1Xk;TKNPxci1X;Qsz2Ocd0}dKu6w6v^yQL&Vp%co zzT7Jrn%T<Beb8br0{An(?pP$zBC=L^*sq*N$$?nChyD`~_i5W5=D1|Fh_o9vLy<#< zjO5yEu6O!X<z+t?m_+jOtjLBdYE5HaFUvGme2Le?hIY7K&Sls|!owgjgXkgHe4)i% z%>hG27}N+HjaW@=^LGv9psu7=TKYq!tGofBG&3Od09W)Q146vi-jZSj{6*tsk`l!W z3qvH(Z#((XpKWUE1r6g;BO)+Dl~JhKc^RrPTm;jLX?i{)9P|bi9I^!TdFxjO5BrRa z4-KZW(jRq6WL=?+D$!xSbqv17J5e#4kj+K$p6clzl5Bg5?IOobDQ@|IO<XtMu<>=@ z7b<TqHY6?=#K3PADIYpF6W#z19PfMwIiK&;QqKn?_VDdh-=EC~&)u$=!-d)}Gu=^Q zL}JikAu6se3sE74$bzIs$%P92NK6*(S9kBag}gil;27jbe|96HUQ8VIAUXx)-1h#N zG$CTB^wQq~E7blj2~15YRNtMu-ru2WIHKhI_2t|>mo`7vIFcw;8|=9IHK9IzYT+JR zzNjQBq@!|q<Hr%b#=&F}(q}Gjyj|(<we;96No9kU#LZ-wnL<;)Id}cmMGCxF1*AJQ z+EByh$IL2lCGhvW_FPam=K-60QPdeIw6DR<##i{~oMlDQ-9H@KtxhshFQcpF`NlBj zn56D3qY<t_yL+{nDJb>}>ODU{v}1#XM*S&@N*GS5Cy^;VH-DrJ@$Q^`;PxDtg|<GD z-|<xaiOp~~PT<IgkRah2nb4?eHO=nwZvM$(T4DoOZ4*!+&^jQ@1PGGyDt+oKJ&8c? zB7?C?(VyQCq|^#;+CG}95QS;+MKQdeEZwdkB)YCXow2zGNs|zqxG`&r*9-$7IqTP+ zp-<T8LvZdB6--4%C6w(8A%%q#Br;+5^WzN2elsBZ4aTgn{zB~_nUv{w^C<_;WDL=g zPX1x3WlU<%KR(=<7g}rDT6;d_5%;r}?~Thh#u*5XaymOM=aP<>;;Oz9+P96}v?>@j zZ=ZQ1`=<wuI7m^$7|B~rm=o=avX1B0Ba)tIJ{ahsOlU`-XIljKmDUT1&aZ#!ZV~RN z2v}o=_*R~i7qynlkZeCUtdG-_&>NDDr5u9I|G`B2S#7HF@uIDk>NiqoZ$J0wcPek7 zqr#PTD&;m=$V2G#$r#HXY|kDf8@tr9**j`2jkM|uIi1ZLeAQQovi{>@DeB#7#BnNp z7^i{9(n>zfz7f=$F+8612662f>S2p48WSUlLDH`*MvC7yQdL%OVPOIj-qj6}@mG^* zu@lRF8xEejR<RURuY@HH)zYnkf`C@2{)9+b<Le_PcxhZo!854Z>>vXHD>@>3uv}A; z?i^%n3<_<_mzUfJo)```=adGaWe{&Qq=RHMpKm3O`-zeu$A|Orcs$y?Kf+UXA6H3I ztgDS&FPftGatvErqn;D0%I~rVYM9|+PkYV?a@EQ-Yn@@X5koi5mbrmA)It;6@s!Yx za%Q*Zi~!$SLs|Sw*D#i-VJr(ziEr#|QUma<HH@{_Fy2wI4c-BUiUJj~IW?XoNGfo= z6blo#t649P0Nq;icx%n|k*Rj5sWzyUDoJgCRi)}L^fbHw2_R%~Aj<tJTC<cjdY^o9 zcrjaljewvi1ZvQ@hIM~*5E)DJl(G~eCGV#kO0z7IIK#sXEZD)JBV26Gw|_;E^W2a+ z;65E<5GBEuY{(CYWn@b!lwVzuU#I+<%1iXqU+HaLEy(`krP)`5QGQSNCZ5|D?u+a( zYDO(K-xgd6T*vu55<6<UI=9Sm5>LTHt-j?i1@FcI0PPF7)~4D<56l{gm}Rcdv}!LU zSz{WH0R&MT!Bry@Y#Q@yV)GjS<07L9_P~{arTn>w9^0JgpU)sVvxm)pI}Bavj}#&* zGGs_E>WP1<C*(#W!5TB>=K}J^j+d}P$)iJ<xd<&m&%;t1y;i#a%*q1-pjBf_oi<kt z1O~?bla%{pP4MPF?&B%pKR#iI;;<%N4I?hrPAVdAK^B8dTY+I;ZfD7IFD_rE(~y=A zTTs@-!4RoR>G&x3KT!G+iH+~_OB>s<{=$$k^*vyw+W=@!0*AdhF#T2<KHzQHE`@k3 z6KtsYuc&M9hVfN6CFkT_z}jn`kYW2QI9UBPf4y;(r<mBYHsJM6RN_$EnU@8b)%lTB z1Dbc7i+Xiil6qY}eLuwL5Yz&{?X<i6B>DdbecR?fE7!Gkum+0I=jJ%`|0H@{pPPn= zaeuWy(Y;9G0_{raM~Wtw7ViUJfX4i(o$N%xyxc~z!;!bXi#1;JW`Tn=5@Z`{(&v~z z2)iP!6r(q(GFJKEnU$xhhRgwE8_SD}`bCXd_gKhs7c$2sv_blNW3^|-CBwx>dchLO zu${T^day{#`pLAWOwn*_ilV0PP*qA1Z6>Px6O+DYS$=V-ofWl~54Dnd@ym@wJ7Qdn zscpUxcnU#)@uu-7R<Yr*x*W?u;DbAKJZ)6?8V|IR2)CV0W6UyiQN=TNdrp^1iU@Sv z+|BduEjO&+^L%B_a!oAodx;BlZ@qfsaWB72%5sDc<|_K$?^wr-HpR!vo`fRqg?$p% zv7;SVB9<Fgxz(~X{|SJ|LPed<Sk%=X8*dZASpTGz_=t!wjclSY8EHOV-3J=YNF7gH z0P&~>9U3QSjqQzFNRe8cOh6qIl$4s$UEAnu40x!41k~pQr3uYLy}EI^prC00YhKIS z{cp542?bzSS|f?#Ur=!zt)ciOjX&Up(z7lmf2YTUGA!D*lD_{+-oL_rU6nW+l%z}F z*b=38<_!L|2ETEc(pzxNw3cyI_6lq=8f`A@llx=W$~O9xOSiFB=jb~DjBI(Rlcyx( zusqmG)Tad`Ms;e`#Tq5uizO9LO_Q!4-2l1NDs4`yi{M`Fy0xYaJNn*raZx!%mvd8M z-Yz<sgBZV3shBPvFpFKQDWh->YhMdF3rfYVR&9f4MvBcXHU(x*$4@5o;rWK<MLNQV z>iPKGl8fjaO~m)QqX<fH*GCz@tt})xhJ;AzE9775Wt4eIc>;2qu;pc6jP}`_R?$p# z5*U0riaAY#lOUXlN@za}g)5hd6^#{g3y)HhJU~LTG*s4By(oy2_6UTUJji?=*%s8N zl2AV6-Be{_K)fLk$k%wZ^?OZtf4nqmr{&UBjch)DX^^!k55z9jUsaK08h;y4k;ZrN zILXgT+NcSe;HKh>uABPZ&$aGn!2Rr$<P?)5y|5sIB$Zq*Az;!2y{tAbwOm(0oe_oc zj1JucQ4|WvGF@fHkGkYU6^6?u!6j2J_1)mUOr{LiZ{xX<DHC?+%XyJ8b!J2=TmhRC zij4d@a4O`itXRN)J&ovTKz+$DcO0?qwk`|r*4NiY`M$4*6@u?Ud`G)B_+DiN;ND%Y zrZ7VIlYZp7K`YIYaO+heG}*85e30nb*s)jYHw8kAjj4=nDo7}&qEi?z4THYljV^d= z8I?=alTBJE>skeIf(@3J7K^?+qeMDwv7f}WwJiI>HW*teDhiobOSPmIstvwsRnZp| zF(Rs}##-g%skU}`nG>e{2cnyew2}45Rv2ZCscmd+Y|&akO+kO#C&7zHfbqLd5TY%o zmJJ-#I2+lQvwLF-fw*Tc))#@{K0~oIG<eZ81Pr^LGX{F>BKZ(#7!J$QzIa*MJ%^u; z?jh)XCzf~X;`9rdMP6=2(8Wemsg8@Lwczoy7sNW05j;Zlr7e)H!_9$k+;U9HytuYX zrkjJkyv;xJtmMH~a05IgbRm0E$c{T4iB1dRSWct`iDYaAI5(?~i3+)M#wD=hAzNJH zee$|B#fR@=s7-cM7+S!RwM|s>uzQ?QIoWlheyqy^@JYO3sOK()BA$dq{WUF!Z_@cC z-0GZ}@gzAAq91D63HqJVale>n-<+y+)yUnt5qk2elV$7Fa+xn*Z_y|kIndqsS>Qwq z<f;`e=%Rd^tRb}817IyL=Z2K=AkX&kXHC#YcyU+q8HoSzojpU0K+9~7=zV%t=;cSV zu~<%xMQ$z27>lI(vFIqUBOMM~;ZY`K7c_Rm`n}za&#({{qg503d?2my9u`0flNFt| z7~YpDTZ*sP*CtM1hTwf{TC>t&Z_oA9RiU5W)3r{I?OPts=Pc=lq5NH2UEiv+zD9-m zYrfngiB{H8j|l{l^^@$erjI?iC{|fidu9{u=)qLRFy%zOnXuaI=-Mdb5-^d70?HEu z{;cs)KQ9H$t!hC5zgUfGyxdyj1_<9AGBdky@P+B&b&66Ftu_6^68G!A%CwP4s~st$ z)4AV123i?0Eq}=3afK&FaJ;HK{h4z3gHY&r)v%CmE!QHk7GBC&4&2nOIS-?wNHS)l zeQ(jG4u*p0@%6aq)$-E3>Tv^3Hsj95P2C>1#Za1;DKu(PuvXr)-G{)=i>9`ofQ6_W zH!6FjO=dMD_etPp<HKuJNYWx;mb;OIbLAm%xK%&m@LuRMXclM0-2a^lg1%g4C*LcA z{W+gjcu4WhiymaQKoqWC7V|1Gs}e>}C@xYJtSXq=$-KDgf<MyeUzkQO&uc_MK;aVO zCK9q&1r9Cs$6bu57pNM+d}9Lwo$uED9$dSJ{ZutAo7m>(8vjH96|CCVQ5i^SpmA)R z-oj^dowbuC#=Au!jj<C^+bG%a_VYMkT6H-~&i944oR{O{1)@QauFKE{t5B=I<}1|$ zD?FhGV?1ew`V(U4O#v2ay4ejJCxn1M-#~TFmw6R4^y?O|?~0h|yYtr&D@&t0AzMfy zkic(OT+T&>7z^a<PkY$rPsI2IVA~{4Gx-YM5-PYD&3>P+##hVmTBUZ)d}Qb`u*>HV zApGfY?C;`w;(n0o@1lC*m98h`Z_{6*C;oz0aZ10nlbSKwdg7%NPV|J3wDp85Ui3X7 z5bFs&xSogs+I!+igz+NgSoMUep(pIe`AvOKh-rzQ(Cbn;7q_?56w+d6<AKmQavJX= zh<}TkIIg!z|Dj@MS!uFy3kvdgHm?b4tB5qEtaxN}XY<dqU1jr+Jqsntg^_o$MD|@Z zL3qN9>ko|~EtqiwahfyZ2IB-go?19+&twFQ@==X&Bj*V<+d0a~^^2$O#w#y#JuAOa zPHJ@k&2=S-Di$Ip2FqRZtD;VW(B$BFN#~oKOdNOH#7Y+yvzYo*`l>(EVj?wKy|Ahs z!Zf)^3>I%rFR>*L3N^HJeSWUH@s7OhG3Y3Wm*$5{Ip^4xOKk#TY0-og!U;+iQ$fY< z5c65h?@44z*ZRzy$~A3yfP;l?kt$V??a}6ytr|p2e{89Ux&PU$KTSYZqwZ!{__H<w z3kzECUo=OY(QKdSy-1!03_Xqo{e{m$jd)BTs`ZnbQ;|+8h%?Ro-0vscehVT@aIjO2 z{qS>XSk%>ljEfMs7)R8&htAfxC^OwS2H0MU2Xs#MQQpUCnnunz{Xdpyx5VoE9NR8} zUR}=!!ch=w^I&h|KS$cxL<qU$;Qe#qYN+A4lDM~VRgyG6DhdlZpL$XH;hRO=_;YQY z_2_eH!d?>zM$sszVZ-wnhfc%uxSb?(Ds1mkS&{YVZu*>cd!#X#aSI1u^G`0GOdH!H zZu2g4CG}m{k0YH2o?l+Z%y$}mmOY}xn|A4D&F$7|f&Y#w9c0>B^(D2;m=qe@u$?r@ zCPgC_`edQ@bLd%D-L)CCTxu6ww}%CMITO}wTE*M667^Jq6WZ3hA+xyC%s6gr$Xaky zE287g>o2-!f(8xk=!6+_PY8p!bk3IHWiH$*^@fjY6#6%AFBk54qODb*ZG2a9;5fVf z-I?^g$toAxs{`7QQdUJqK)AFkySCqGY^X<rNJYc+_eecQo!c(D&T}AcZ_L*7Y>c%7 z!=q^CN#i{h4(k^#e&=RNQ<vMLb>{}coV+9H+MYjcTnR-rb4O-hF*f`DtIR$w84tdL z7coAIn0@n)RY`2K@M8aWawiSmZ^Ho4o&7R6i!K7W7c<BtcANQ(pde0vK1GUZ$2L}f zga+x-rad|zGt`^R$tQERC3A?AiOUq@9G#%>nEFX&Mt5~=1AZvv42a9UMk<!_V4{_a z;gHTPKUA(gV>%Lco2>}BMssxq#;AA9T9|SlTF|>;1-g351E6hCIdyY-kY7TblsbG| zIPB`-cHl1i%9NE=0HHmUdxgLx8f+|jX#%d=N7gi`mLF8VJ~GTde|LX~oO-)ebi7&x zLX)_ET}ZqVOtN`}MXS(V&El(+lbC7=l3AJ;TA^&s$}i2U3L{(Sxy8*nI0qEF%UJ=$ zn9H(+i0XIu)Ec?+ZG30TLd|a8#;pN~qFv`G+O>JnEy<!>O4?TKmQ-186^rUUvvKya zXFlIr)H<>7k<Y+rZ9~H*`gl*>JYGj}lE99zG_fo@p0~KTi!6IDFCTFuv%+UdOTho# z{c#DT#GPZUywn%2zKMcpWx2P88zFL3J+aM>T@ncj-VzDi<x~IIY5HURtKGFHa(Gno zR~!>+@^)`KDp@Gs`9*+tPc7!SRSp5J&Cd4gGgh>Kk5~MASCbBI{X1(1(%9auWt{;r ztlX}qq8=vMe@U3}1WdA{5-@fFS_GErk|fkNnqa#MV?X}x-)~)Su8LyYPq><=#D2nq zyfV}8<cGG0Q`K&vSyrWGwC#8q&X4GgD|t$?Pib0!rC1cOPq?PH8sdBcNN;1aKs^A8 zn{h5lutVvRjxvs&;X_C!`56$^UK%E#+IkSwEGRYKL4~0ZK|%Kzy0?YwM1UK89OzLD z(e{q23DtYb%Wy_*PdZ(p1ebaA9gcCQjR2ZN_HAq9dvnA9Q0b&^bIT`>1K3Ld3l#?s z^vsXPJjb=9-YL(oKfn+7piwOmx?cM^f(s8<KP8x;Dnm0?)|48xYH@>CU(kBeMQBXP zQAp2Ncm?Mq%u|Skh*Pgh0sZl~;GQ}jcRthzt<lUXZ-#BaP_NW+sU)@NP_*ad$q`16 zty9jLMc%cp(Uk*n3A!S;-G?9&;u)$)^iW|zPF8VjvJ6_yJWU@aYhFy#$$pBrgfQL9 zPpmMY>36UbUo{*qtL~z>P?2_fA=+W76A%$B3RD9JCykRyn4w&Au{r9Za;6wC2)WfA z)uS`{RYO9$uf)_u0=;rPZkGjC%<{P1ajaq`8h?@Cye+E16{wfpevWp@Bu2XIG0+eo zyzE90<4p?<izX^YP<&;i$)dY5a;$dB>$5C~@eG<Ry!41Mz*in^x%?`rt&}Zl%zJtD z<hyGi<E{`n^~J62a7t>!C+*OJ&lE;0zN_2el+@g9I^>ks&>5``w^WV={hS4(Dg$$( zj(cIo7s{nL&>mb?=ZFqk)%J_N3N4#_q-qtWB+RuZv+YrTy`hEL^iv`+9h~4*6uMtG z4HS778KS3%L==ObC~4#snGvqimZv~=aF5(@AAU6FtYv!4ZQmfB8TxVty!x!OnfFiT zmsS!d_a|hlO#sHk?#eQXdUYOQIW`w!q<*(9Y!ev`Zp3*naVgJhCE#-LlCxkwNp&=% zV*X>Dop((mDgM^6OF}(VrZ1;~Q`(Z+ABA&#Ct5qTB53SljQ||ArTF6%AQ`i58H-RM z+N$>Jwy)}!)nOl0)9)=gI$Wr`u-Ra1{FWD?rzy%*72w^gqC$1O8WEGv=ZBlsWUYLH zBA&g4g?Xzo=H&K{ymimMh*u+cC_ERvsqIy3lq^#`KwPbE*9OjE5#+8%fe(`|nbweI zS-9Opn$;x<3o}UJ;2-lQq+ae4v&em!IhsX2;c65>YmJuGTBCR*iFDf_x5w47Tv_N_ zC09xA*RNuHw1Foq8nUkw-~$xELVWd%7HgBt2H5iI4&K<C_iw&86pG8v-V3E(_u1Hv z#9DLu>9#PdO@h9MsUUgOVE&n^$Tq`nD^H1$yrK-qbia&bAE{kVB(mo9c3oL^9X1jp zu#^B`X<8z%z;7gCCld!ke1Qa-61%s!AcHttu?8=2u?Cl;v!<Y-qv?Djz5*X@5a=pz z3qmmkYo;K_2Z*@+>Q~vaAOK@Ys$#2I8j_~O=A>`uctl%dQ)YmfO&LMPhGiD0Q`)}4 zwe?_KW`U|LVktz}KW?9O(%x!5MBrMV=i>vyP;sd(kpW+})Hp04^h|x_wDoQ{ZWgi4 z-2=H(EgLb$N*#|mgVS;J1j-=8JJaoMfE?Q_3}Xy4Pr5|06bc5QCtR=JFf?%Bhcgg% z&Rvs&8?FxxWFU|3pgJYBnhertye6uOv2wQ1hnR)Tm&u@qnQt=^EY`vLBjUMZPQ*4_ zKJIMDlJ-P{X~`lV0?W0cv>_A*gR{zqd0nNLZb@^R%Gu`#|6Y=v^K`E{PjLu4LH0H~ zRu(hMUOtP#zk!{cN<Trd!b95c|0}wYoN(vV$CSg`wE0`V*BRiglQ&Z!Rp67>KqCH; zsnxtS%vkl^v~AG&o{E0aT0CAd@(rr)#$B;%XpaO77?W>cCa9ppV2;~}ie3q5Hqb7M zL3O3(Wte$jjj0IOvg=E_cDr5`P@rXArk5v_U$2vMI9_vowl;sS%d8zSHdNm2VXJy& z#r|=(VmJ3s(L0_<{w0?@V9@o_9=lxD(<r+$E8Ubp?XlKFx~VAF-bB1ROCsYh>LAyr za~h&ri!Od^yZSmRFJ(~ncg$R(96nye64Ne)>TmK5$Z~r{em!sJ3EL-uXR$!sB=8_D zPfP+Gra!xl)z>|yY3>xD2<J}6eZrp%!n76^Yj}5t-`L}f8ZFecrK201djamKydh(_ zqd$;S<+r)J&51vP(0>Fh#EuB)z*{qLbe<arUm~LP?MsWo706`>=1E;D!(!KfU{_SG zq^ZMl`SDxUZ}Zy&jCF@!tJ-OxsO@>OO3t=I$=d`O2gMf_j=_UevXA$Med%~_?qz`4 zIsqnmggv6NTvy09))QH0w09o`L@vC*7RBOqC*(%q=ISAu_$)Y<$^%13Xorq|E+6Wv z@+8!zeUvX<p@dXs)L>tN6C(Z1H;631QgUR483U3S=AMs-42Eh$N^N$aqwsSLs|(K5 zj^xnW9Wy_cVu+ol$qLgu>nG#Bfta@5gSE5qzFyDmdR0|*8FhSB9i|M|cMs?qjlfu! zYLswf68<K+`x?WO0y*MAq)Xi}phag^9wgb#n0#fP;M8Q(E4|?jb7p67eW>v9(jbh8 zfRC3->DOK9SA;Sl60Uyh$|TMEsa@`oZQ#c+>u%iIN{*T8s@{=PICvMtw=l%ehBo>a z8k%sfyvTSKJH84FHz0&~eva^?KOR35Kd!}(kHwE0@#B;6qs$GD;miIpaF9_pX8mnG z+NFh_K>!k&;~}#Xz15OwvrWh+2&FAw`a0xyg?ya{S?K!!S?+086*3O2Vsff_r>%?p z>d)@p_RktGM-2Y3eKRw~&}66m7xv^rD}o*>9Q-2auvnQD{m4pqXVic4tE961!rzM~ zQ*J6d?H@4&&H>>=I+fDm9C1K4<dYRGic={OS(;apGp{|di<*dAfRq#_lEwxRLgyiN z9$jgmb_x$W8mGRbK}}s8jCsN3?xO=Ocs3c&w@{;|CoCa{)s29A?g$;@%dPoA9!B&l zDAxj_0dF&1NVk?I`?PU|3gP&*oW@t|HCb(8`Eg5glZ6?AnrmT^1*8YW?%0MaSneJW zoBgC24q{SD-?gzu>6iCBzb=wpPtJ;PsrDs7(mE<vs(@u5FZJqdZS#+mfE0wP@giG& z-hGTZiN5K{v>7(C&l*Sl+eA#KJRf3F;|p9x(44c6IT<N0N>(g_*|Ti!)seWJN4IHE zA<|-u6DQx^&^uL-Wt0zn?0BYG&M|4j%OvX&y8kMWJqu>_yxzC*{`dBt((fA(mF(Oe z>I@astEVB6a;MwNCB)=h>hseGwNo+uROX&uCtjdj2Kd#Vo(B`pCI3uvIgvaTo~=<2 z+fIwL*jCbYen7vh+sn(Ft&#GotCi;>!gyXd_yzI<qRp|uj&>{}-(yik(z&q!-;PBM zH!L$Z1`HS8Ah9V3(ZA(cM;yf(u}YlRyMFbqJ~0_#Nw6x4NZUr5>!)6xny(eSo^C&5 zbA}!zBLZU;SPVr(u=3>pRCPD3-+ci0gi93H2dv;>D~PjViTj#1&+b{`Q%|XUaaf-w zOeKn8`bMnLx3qQ0?k5crtXUOk3}s)lQNWhlCN0vmK$-CiFXMbD7hF|UvrA@edtk8o zvAoQeIgR>F>>{nxzjYmGx5lZXov%=FM;xqe>C?ia+U7lE{i-O*_Ix(lV}PE<K9sT) zmlKGj3QXt(bMOC|z|`?79&5^kx`@Ff3T<FPlf+=g)mCgu)Sm+jgXbHlt{_YQUpHS8 z?cCl$yXk3m55qJcav2@H$4lc=?|uJmjguNJ^u(m+9TKY<2L&=^J;B7|Hp5A&L@A{a zUT5vq&;1svgu$6etCt3VTC|iv0yT}3pg+48Q!n_ETq<>|3RcugF4XidX;#mjy0Hl? z?ADCAh-7+S0NC2aG7emDs11oWrfu>2(wS*nJe}EYi?`%!z^82SWIl^$Xn8DAUA-z# z5Q!U>7|-nr?WTe90GwH4JKX$wt{u9oYZGPhdRJ;z$S#B}Vvp@#b?~4l%wM4wj@WE^ z=b9LobItI!1qOV`lu6o}IUX`OchH(?mV3zW%E&j3Nz2WuKV-~WD&ua5QpBmHMX@c| zKC*=*lE8><2#MbK7}-Na%*kn~R5>l3!F1S5!zMh`dcQH}W9{6GamWcTzJvrFiy%!n z3#dkR)Y77istC+){LcKaY({apL*de{A05Lf!%)25Q|D<v@NFVj_8jWbQJqQcmge^w z6Xb-bTz90Xs;$HPaKORaNmzj!?pdd)v{g1v{p9(+#q{!i0j<X6pdtG$s)bH)uA$9+ zKqqOTW;B_q!TF=KGb4ErWbWfq?<tkK?n!6ga-4+Mv?td&1S9_=@p$vkY^Vy`)qNdL z2{+(Ls~i7{keVCtK}&J_p>Y6Tcz4ku*0U!K&~0Q4u-==H7fs!zj4(mWF#HrG6Zy?1 z^gb{@Yg)6y4iazWZd(^E+Y;4T?oB>hg=0>PcJ-VtFaPwQUHGH0FBS4x+@WA1PZD|! z7uKL<^GtX(&Q?!(?MR8<>8QMx1jq1zc}W>^tKYd+l4=}S8Y(r5QNgGhj@FIuU}|>| zkf6sA_sua&(|v0CjNE7<jSUxVgg;bWG1(|A{9A}{X%ANwT894k$h@U_#!)`_x>@~B z_~qYytV<@_Xj;-z`+5s?xL3Ps`#{vugf*eNTpQ~Kmw}Zd5a8X{_#nlS#J5yD6$s8F zY;V%_<rVm&c0F4CK8YiZ=6Pv^XSW&Mv@?y$-vxys|9g3M`4pa_&^~d>ob0Z7<`|EM z4T-bvkZ2svGaD}BsC<Aqa8V8B4}6p8wL|W4ACD_Miblcf_7y=6J*bEs*ZVrENeGLs z*Ki*!Lgm~K3>R?1Jv}va*Bj45D)M*~QZY=3C2jkb%A<kVk;K2sxEHpbtfcxez2~g* zrBbxNFu-jU38@(l6-+Lb83R#edp6q=Mo4Yk#(H4`QsZbp?i<v7X|_L*j6a@#W)(PT zhSDQif+sYC(*sG(;8^MorZb=|lBp!>_$RtS%g9xNA*S^sV$c!QQd=YJAHL|Q+kiGh z`&D>EPen~UA~}3hNQFc}eZ^D*+_Rd>XI4Z7CA4)p)=@aP9hnkW+`;<Wm*#(g{8WMv zXz%W)Y<&B#whR$`NuQ>YcIpz9eW|2DCA}||v`Yo2Qb{F2?N22QE2)x7;-uGb-+@$; zxzoj)<E8QG%1^$BMvDn{=U%1Xu!fc`&8y*tHBLHAQu8%RL?nI7BDnX(NrHpbV{PFC z_2UAvj*UfU73j7p#pI{uQbwCvT>pf#;!Y}x>RA4XgrMKIY<m^lOp%x3RU7MUcIyY- z%fCeWpeqw-!loV}w(M-Em$}r^iMd9wMyBJHj?NwYG=i!r_=Mpv9Q=>GgS_0yKkw`a zB3L`J3Zf2OP3dH^cI18~+|41xQPuBwX!wyae><JF#|Ii$;p1w)BQ9u|Dmcg;CfW+7 z#@|zKlbIofUIs&eQhkj-1S%xKrTa+JC@4wUl{#j)0}6nSj-wCcv5!B_lTq|MJvBZ? z7TDDG_0zq4PNsHxOGV0muUcX^bJ_+isP=XkqsJYi$BohBFxtlGp!P`%2L~vXiEbi7 z$HZ<f6fPiAzfC%HlZI{*bi37oyXn=}c|_aUjiHxku8QAtdbcSmLTi&1R1*Cnv{Mf4 zl%bsh?K=Y67Btq_N`$83sjE0NvkuKH{Dq-DhWr;;7zkTg#+yfL)XYU_<~*7?F1}}9 zv&yTBN7EC9U6PpBd@<DSmUO+tRq}XM`0b0=8q115DQe0qWy;YPffa3@|C(uxA}djN zXh~bsH>_9Ql(7w(o6GoIRn*Sii;F4?UGF4x7U}{<?P^~X#&;|(s%(T2xuI3ic;Cfh zEH5sqY=rThbjZ8TJ@$SH!$Llw^I-3^*(28VRV@kJIo}s}Nvv_>o*O%!Z5~Fh96Kyl z@|)BgHdv!{x&Al)#7NX-Gq-vHa*?)c*5jqT?U5Cw+-6E?+&PkTy~+ZRCT>^w7v4=0 z;OHUCU0l>j0(W;~>2W(&5XR>AD!>pa*<9q&$)=uS6na}+)UgNYmIp0M^XAf`1Tmdf zH)D;gXA@aw!oUh`+D5Us4CbO*MJ$LHT4&QkwLkbU!_GPCzIJ2|-lM%j;h;|0{k9oq zX|Y86o2Cqny5m(P=r2~?GvA@&YowtV9dV``F(bl0bc~-A4E}8)0rkB>!KHG71gxI& zQa(ULBrUnUb|ZsgR-c{5j2TA=oLj<rTBRxV7vVZy9rQ`q8}pB8B8)9Af1aPul#4l- z<dl=y<2GCD)8*!|zwV3b9E_uuua?_X8!h6rhN}u}(|A56fB{1U_f`an*GO}UnP00U z99J&MZo0Qh3lGWscUK3_^puaUX@973JH4o`-d+VBky8}XVD03+0@Wj5&eCHmCR#Um zg>JzRm<xHjp2q`GOvv_gY$g#y)`Xv`f<xuY{*K?|`3k$#MlzO=1*+3Dt+@#VzX<~M z&niG7Xelq(JxUw)lt?q|kX0(wwAtI*1|WA)|E}#-Ky~auU9SY!d{&c5?mfJwgK#*} z>K5B<qux5X@GvXc+ws3sv}6%pCF&mrmy7xuwlqb2>Wcc|Y4qyF;swW`+OvO4b4&C7 z#wt~$kv;S+BJx7;wh%e%Z`@!|oX!kyt<s8C1GGJ~Nl+Iv9+q)cXk;WM%Z2Lc@J>!x zV^xzDuU|y?f+X=<2387sl^-Wmuh7_uguh&<J&%Oe4gsePq}s_hdx7Jk1fER6deN)w zIh(}X^=*k-r*%HOWP-<M>5QaE?3%ydxVh6weNC4H6&8L?B&)7HeY=*2%Q~^80VCx_ z6Uql(AMB2E4cEpLh|fyocO{AZwiFjQ%-;(IP|cA>zH+4&xPj7q$b>j1G2eOdBx(oq ztRzZPt-7X{rgx-BEPQrtb0R+leKvOQdfoZ*tNGT(Q}{`f6`p_DOKlR7SIUlnMl&Ie zGp%nsHDBG#JCJoGIl6B~&3D7-YM$C00AW6?8l1X9r0`E-dXbi7w$?|JG_b}qSdtmv zB~0Uwmj*iJppki`qjBY<`)@sPtGdFWbp)JQS!E=F+y}*FiD_mXjW38QWUXvd9@d{N zhQsNeC_Td5-T3$E66Qlnz|C<t;jB!#%6Ge`EghBfCub+fFNi;InlH34Hs>loc)kVC z7q0Q^7>h0dqhx&;2^I_+Cq6^AfgN1D+pJ2u3v#$umE~G_Su1v)l6sU+nM#TFwjrD1 zR-S<Cjo><BAl~~vRqi5^i<KqfJVsHji$oB{Od*U(NG9<e^%?{(bMRuUu>4BoA)}q$ zcE7|}Tde7qV;RsBS39v817>bs<X#o7Ym@xlH5}5)%V&?8NHPkC)==IWS6EmCi_yM8 zd-mD|8G9{!cP{{YJLcY^bCrA9cIXuqQ@Z^(e1ghFp10?xKS9;}ZIMVpL*UC;iZk#` z6Z}Qv3r;zkC%{voDTbJF*JgOQx3KI+SdeYqu%ZLG0NEL{oAY)a_bk~Q2+!<-5!VXw zSx#1NsbJ4Lx-!BzkjU#<Kffy;4mWmUpJrB=u`X^rg0>9<^zQD)r|Fqk2G9eaXid-@ zh!<Et9TmIr$qsCyiIjxrSem1YFSK#>K%Lm-gfj}(dd0M*`GepP?vBbkU02oC@~*RM z>-}I+p4^<mHr#b=sD46k5<l5E#Xa?nJ$1GjTCm5Yx0+1zkF8R+)m~Z*_c3VcumXV7 z@!NPx=y;V3_Hx2qHz30K$LV-XeK$)cbUdp+cg~3gf(cdW@zO|VM&D#AWnFe%k+L5+ zdh^gNTnp#yuTW2<>__!IJxqhgOQnm%%|x{sZU*G&g=lUm9QDFLm`K!RWj3wY0tl&E zYv``-QNEge6!>HTu5EHvb~pZn(J626gs#=y?90>2&o~zoeb{;hHENsZMo(=cPu-)9 zp9OUbQOLT~k|XQo?U~x(2$X5NCegLmYjPMpI_O(6XjQ4XC3K!#@NlrZ;ci7YBa{#$ z$S60z`)mc}=Cp!;Xn0-0vK3T!tII?%V?``Zjkr}3j0iP0pizh!gHG+}sN7^IY`Bzb z>qU?#JsM(uz~P*48EvaTwP4=T95`QzX670NfoJl&6D;IJph@t%m~Z^T)ScGeK!ZEk zT$<mOW76yQkV9>dga#xbLAc3><TcP+HG$g?j=wjRa4OWEnF<!9h^tZ>ug+x<!?3o< zQ6+_s=n*4e0d$OfDMYO%#Q9LtYX|O*AHiMpN_P@T<-O1l7r=}ExaQIjqsG-3mwOlG z>^Q#zbYBTA>9Vtd#>;H<rAnZmOxj9~4;tcBCS<VQnR%t#H4wsVGMMpO%ME3cA#oXK z9M<qkmw*hD-I8@59}3`uHtzytkvcUNEE(6DmRI|qAKuI;&<pvt5Zc|ZFUY#3VU#xD z(snjqNIz*5YIW%mvt5B;=_-|-awVXpPe@Fv09jMPr5n3<brcr<Ptr0Zxw~-aSILpE zx(=-*F9;h+T@W@RRGl+PfUy(+pSRCMGoFGP7ttdc>L%^he?_$c-->fw4a-wDilNzZ zQ&-{O_gJ8ugR1Mi2W6b!gsT!XU)3I)iiAHU<+>WFpE~o{1NryQzGu4dp?{>|(c8ig zb-TBLsp&iJdZp6!R9Mh`{CcZQPTf{mxSN5|SYaPXNw-bkI(gTd!c$?PLMGMZU;jo* zsxBCo&lf&44!qKRd+H1G)XbN>*Uy|(;rH#o&7;wit3&Cx?$g_KAl2K1y<P9$Zhyb> z-YjaicxtAt@Tdp4ZF&NLAMtNfckJVBT;N~w?R@{l`(_FsS`9qV+rrCy-t_F$^j+^% zt$Hdf{IW+gExs)b`M3A~jNaZJ^6c%VkZ0w7fVakbLWMsgRFe_7-rg6$_g8om|EyAb z`+y2>4;1ac?SQ9<r^3SL1E|q`mw%%}$WuX~fk(Wl$Mgnod8_i)I1zzQkn~ai29J3A zn18F>F*!@9hQNP?e<ZU-j;U>7#yzvajm@tNgNZCTnCnXxP~Wvt#&TQY*j~PTJlCgw zZv13hdFK2W0jmBS2>LS+Y>5#tHJk&%U-_k5+=ANat{4GfW#>SkMPix-wbQv6LGGLg zej)=wcZ{I>oCx|d5L^-?;Hcy|n(*Hk$E{7cG)91X<s1lpH3LCDMvy-zf?G2XToxl> z8F&r~iUC2n`#pL@%o;s$n#JKLO>uSB)N=P|fcsjUc1uV*5vP5h9#!@;aoV1c_CTEW zj*#YNK?X&+TQNUYwi?6T9Mbm1X)g|GV{zJ*A#FHL+ZNKa-QwG^HKbh~r^(Z5_2%QW zt3uk}GxB^{W1HG`GETcXz&#nK^@X$}aoVdw+Wm2wMT-ibt*Pq9gAaJP=DohsPlzUf zn#5oj#P5UzI}Qokek&vp0%8!hbD<(P_=H~y5N1G9WHlt%4QC{bhiW5jQ?BPYM69#O zqVAl3{^+p%ME<}vin+C-6j)-dctROW((bpqs#oT@jJ2YN2>!rQ(3T08@+Ql|*bQha zLu~m&zCKrPv@-M`L^^-J+c8t4VV&mPfLaSpXymyyomOuZrtOK$)m!upCQUe6y;Zb& z+nL!o`*KAkYxUO9B(BBL#L)p`Xncu{TUCu40j#RTzGyqbFFM`o68cIlq^l7nd@bYn zwOk8c(E_3KEwb_g`rkF38k!#YL)>C)9EV%J@bKoI4|Q>{G9$*k+pB2^DUItBh0B|5 z;`L-S9pYJ3_6Pc205TSD!AsN10J}OQRKy);GJd1R1UA9NCp1VHVg?Fb?CQz@r51vK z5lEjSYVTa@5ss1gD-{nwCgv;q^?K5u27sQ0#axpPFWgc}+1>L6dQe$C;2+a{Vk3px zf3o6%Myp9a$W(&6|GYJc`ArzOpvHnPXIPoJ_e<RSmgZ7OvB|i6L+5l~NU_P0!n<=8 z;g4y}>f+}74Y|wrM_1T?3PY>al`zrlZoI)P?m$lHnY&O#nNpwOg%cGQ#rg-~mSer1 z^e5Kq*;s!zMn7!8aLC2}N202u4Xet-SD@dHihb00L`p{Qg@-TWQqz2MCZlnka~%E= z)7|~&BlXMH8~MU#Kd+_ANd3z7zve?6UzA5{<i>i((E6!uH?n^;Oof_GkObB^oJu%G z6O@pl80w83et9E$-PdyqM^9l`I1T801ns`RHK3zKPeP$5qdXHIH8U@IQBAQmYro{r zUi;6Cl-NJ2CBJc&Ko`D`cFyllAxUufI(MUl9%(XrCH$Uk#_$jqF=IrIM0Snt5VIUA zS7|g|cvsN{Oc!~P93-E9T%avF=`9tS_+n+GmLg}=A|>a&7a3YA(QOBb+3&1}X&+=s z*E$$S8*c=y4(bJcSVGxzb?{{bcJ0rU*Nnk<zHlM@P+vN2r{p&-b(H)PoX`{@iVC09 z*H0w5*L@M$syu?$?fClNc-g&S<G=-T;rBD^-r?*1b<n%WE=5*-nKvfOj;123^rG6u zto!*rvsU<|ONBzY0!82T?(xFOI+01%VNx@gn`z{jMntkION)!5#?2>iN)o1663A3W z20r{X^W>;yVm{`_%nPDB+}*Wn%|c7UX22&wkOEdh0Nw*RPxEf)s1EljtKA**qv$K| zT}_OXgj@C=bV1w;G6qIvWhVCvEuu$VCk!d?@_dz4W*qYqe~-r$b$emqhtVnO$u#3W zMImHBI#z!;%_j6~J75#GpEwaHVp5(ceCT<mn!-2-nOLu0fF3NvQB7VStCHq|6wFv8 zX-P@==8z-Rb(cagTJz{f<u%`y(UV(jmvW+&sWbX~TN=+{L$b7WzAeXUSA(aYYYjp| z4UIn~Fvq^F+|Jm~00Lvz_|f0F8S5@=4UFZWiRUesiJv!X*QjYT)++BgvsOqpWv!b0 zoLMU*V(lNp+8}w7_0rPNY&>ehxRXo0jPgP$tWq!`+b!m;n{8&U4FwZ=_^Febuon=b z;C83nR3pTu=s&rBfdhDGDvaJa#@J>8BiuF;?UP{{Bc(el<{5006ij`9LafkK1U5cG z@o#vF`Kz7nz#_)<MB$U{;&!n+T{i=c0e$ln13a_(p@3LoTlgfZ0nhWK`+figcTcgq zotqDv+navc;ny1PLSJUqkTFv?{>00R_~Yee@_Y-&?PeU0HizSPZ;h{1J=UOcWutQm zKB@Y%5CY;QNIhPfRZ8=r>`*-f^c302<A}UwnWInc(fOl2Si;+GPr2rGa<EU)H2fAR z?E185y1MA*N_A<mP<s#aL<S2knNxr&pl$)ow=YuNapLyfg?moW>BTl>`+K3>NNv}A z$4r)ScuAJ@HEiZf)@kLxGn2TC&UG!uH>@4pK!Zd{pY&w^pGCw_ee25gTjyuqnThjt zq0mT6V>kJ%$kE1sFmb}@-`-KOox6i?bMvS1&Dwv@<<Qk{J)rFpm*KXb`onu5vLD*! z-W*b`_}wagZD#Rn17IkAEyeHofp1RJB4)l7z4^^SDRPk}IAGKN&AonIm#fydewYlC zc`fSt8lO*aF|^KlaLo7MJ=e50-m=Gi_T2k2Nxm@@8c%g_NF5`!M=Ixe;`iA<^76|O zgI)!#-}2f5i793TalU&**@3kqVk>;=S*+(ixI+e4%yDgK!YB@Aza0^*_k4J0$A&I+ zdn(2L=1oa_<9_5M@P+YIx`~?_gwFU*l}kIGXh+wm{d1;<zGUuIFr4l_r;<MgJ#xSf zw5z~a|0UF4eBJiIBPhXEZ!2B5Q$3vUy56T(M6axfcGJy?%&>em#}xm#yBf!(MaKyt zbSs1dH)aUImbsTHLgHzwOwjFLTw<m)G?=v!7*)8iJct<)r53oC_*Rty_llx-(ql)J z;|kM#J76=<%Snn!&1}Bvnfo@_@3P|_i1hkMn_mC4D4m2fS}b$^Uc1GPguG8EEbEYH z1{*r(wr5neiB^3y6TzFTa<IgodkQIK0^!bQ$o__>zsHk%4~IKb4Vu%U_qS+*=FR4H zmaF-1vc9{AX1hb`_Hx)5umfwye;oogt6*ThW^dMTN|Kej%x_EOcmJeM2+X@zl|Kj| zOY1Y~%JbZ&evZmju%&V(QF-%)$#fsd-uP{T_%isMX%*TkFCl!Ad4z2GMHz^jX5a9| z^Vvb-BR+&_p=N5#5Z&rR49>S&4Zs!JP_7Bpub^e46!-lj#n_Ah&^9_0UTEWIN|k$Z z3$=HHf+C~*IBRIstRVts2>irRO`}E&wd=@M!{~Q%MimlzbAAuBSfBPhF?4-TwXm$+ zvCM|NUS;Jk6FA~}9wzL=6rn2jU7S2sj-Gj<ZcfiB^lP3e?F65=*>NmIku>?}(3y=J z>uXZLK<>`Jy-ql2ea{m)v^r=;vS9WgmLd)PzYgY)4edCwbhu9|Rj0TY?AhOrpc>D7 z-Wl`8hb|&hNu+@e3&uU}?BCV;_GkDf>Y&<eFMYO%Iw~)>g)>{H4A=9?V<9ezTpDeb z<;_k-zr91H;rj__3lWm07Z>`fmei8vZDvlJMRK8!3A77tp(amzvY(uu)EuBx<WvhD zhT|$f`b)HHu%q%`5A;AHhYb+4ic<D(4bY?!jpY4MetQGKFq!5eRafaMMQEhM6=e>( zOpy_=Y3E3%`IV+QMFo9mk~pM3)fGPX^Fyw+#eKMUIk!l<5)$rHQ*}pFMyl@lz65Ye z<4r%UrOuo&9rYO%l8#E0QW~Z7<4ZaAavKDaqPnF9--n2tqi?2Pp@K;fll3t>RL@l< zYxd#xlt8$^ERGcRYOvbc-^&s;%~G*jc764HJ^Y#WMD3YzQxZW85!0f`;<u!XqG`n0 z18>ey30vm2X&geC;M(W^Cp`k;g5*JwY#Nu-dZg(@Qwhy9IQ>eV^gYT!4ZcO7q?D@s zM$Bm`HfzPCr77Y(a9;g4|I{k=TKbO}4eni9+O+MlRFYG-<&4H<&KFTDblSkTLiqJv zD^tsQu{ITIayJ6MiyznOUDj$M(13S3c~_zK?PLoVttZFtw5j=GgDE^y%3B;5AjH<Q z?vpOv6?AFY>C({?IcZ7LrZFz{(5_gU0xNBrTd$+<O_vU4K}eU10@J%enVQ~}MJ+kr zuwf~(gBrC>!mivC$&TF2MWVSR>bmosOHjuTNgdCdI!5G}dbdfhvL$8zILlJ*0VirL zokX;svn&Sy_nmZ1TuzXpW%=Dh!Z#pRbIFRcP}C+l$$Y=`EL!Ugq-&_BrNzykYDIZZ z3Z=8SE)3;Mk|-r81NEDGq<OY!53u&wc>DSxGk!O|zGdK%t7&{9TH`@p;hn7?IBvg} zkrN%|lAaT*$3xoVRmJ?qAhjb}N_5Oz({kqqWp;*X?>+2!gz^b}gWPBY`OahlmUwCH zaRh{CTYD(qLAUE3TYG@U>;3Z`;O7empT?-&4Qzkx2yTfYRMS|YCTDggGD-fJl-3%s z=PCKgBJ)TnQ`Fo`+Y&oF3LlXZGo#whxr?bb6H$hDDs2AsaBZ<R0NspT+qguX-`Iy- zm~%1%U8a%^B0^kwp0b2i+a+x1*dtYtcg(y&?31+GAXFs;Z0`IB36-88YyXI&EC{oc zui9+BW9IGUWx$=%AiGEzCqgYo+jum-+4S~DwJ_XP!K$G_5QZszY{8lDzbKTwfzX>A zp_9l<N8?%k1^+&gJ}KJHA!pOqIVo_Hf}DY4nmg7g>D@(@f>2>^8s1Khd_SbiDE6^$ zaIl}+0<+^A+zSgwflj2apVEa_izKEhD=+8f&8nqBW%8{uRN6@4lbz1f&4{+I&CZj` z;kw*n87x(gg-)AlUJJe{n-r&1o$^r8xd0~~bD5VCypbWbK#^&?18!DQpfdH#uFqF= zFVMcu=5IG|*@Q?&omHwyA*yt<3b^fuEbN7V_X*Fm86xSNQgjNi)2`%h9D<W(q9jfr zI%3DB<<4Wk`!3Q1W7pAGpU@poI8hSo>X&it1d%3dG^(T0M@6RL*om+&*B-VE5AMIF zr3m^BpgDYTlStglL$86D>N`Z18M8tJ`}J<Qd+f^*$nYN49nAGEBQdI4ni*ahgHI!{ ztblYY9W9##>k5yMt)I@yxPRJG+0v{;#p)|6CN6}L<)@b8Rl`S7+e7%nM2S@r+eW&( zW>15^TwlqAfT*3>dk-zg-qP_d#<e1|5O!RyPfY4}YNDR&J6_ctOiZ+AEZ(K{!!17O z#q8^0gv>sw#pXp`-!;bBG}l*rqz8)qTq`E%v?CwPw1x5EzABl1G0?M7&mFTH?*=!8 z*|UM6cg%gnP3JWRJ7%Q!cIisaKLHiAk3&Y$B+~DTkfv|X74P07w6xQYot*ZjsLEWa zjuIW=Ou=AO0<<d)#B#a0Dy%kuTkD!sUH5)d>uO!*)E*m2+dT1ob@G=+{D($SGk#BZ zLuWHkhkfwK4c9&+z7OX0brwGQ-=q&|Ilb@KUZ&!_W(pb7b*M9RpVNC$H=&S1SGpp2 zjW@3EId+e!9CZk!Xkj(QZ;{_wS2XSl(ymontlDzxqzy!Hri3kRX9O3g4TAStq-!U3 zy~^og65Tmy_XP4@(mSlU*1j^QOF(uO4(dAAkY3sDF$@TUFfpSHCVhcu47)F^EEWQ+ zA)@s|mb{q^6h3PFqEShiqg21Df`tBiujFYLmGxUF3n@+Q6N%9NIpvj7d9PMEr5K5P zeIj0o><kFR8>`NEGs;1pt?P|(hHoRUwL_caxB(omkJFmLEYfkltBxho-S{^MiMt_Y z7*Q&T4_w%7AN|p|w$Iw-hG^hUk<PDH8#`%C>E2g}u9B4CtS%1)U5{W)220JS16<*w z3Ni7e)u+OuzVwg*?%p42#m6<bg4&>lU3{^Q&YM(I`t>xWr=reHm2AQ1y}Rw`o4-t& zgk#sttEC1(0XNMP=L&M|9avl#Tk|J?U}3990jN+No~R3bqPpDTlInN*ZZdUs&l^<5 z|4ZGOfJaqi@&0zwK!9i>f<#1ZHEI;p2vLKeHba0$gJu9VDrf{j6qE=Fpaw`x(8LA> zMa5A^+;PW^#f=0}5I0oZx40AA1$SI||MNe$s_*S|A~-YeeUER({JKunsZ&*_>Q>dQ zd#_FyT1mCuW+P{(3;6nc{EgRk#!4J!%a~J<yivWQKu9tab-kr);EP`scnii1*+k3z z`Aumg+Qoo;21vc<;%#|*%ezYv0V8g9uKAIMA88r)LnS1c_z^Teq(ReV!c>smnb?@w z#tBgaMKB@L^-@Wfj%v>2he12j3nWcu!^Z6qt#iYNojOV{POru%zAD7jbo|QVpq@?} zvk;aAZw~p#L30K(`FI#cq9PVVY?gj2nHHg_`a75%4QA_WOgg)kN<N)oY1WhuGJ3)} z^`(IvM<w>=Od9;l?r7-j)b-I-ZbGT2Vw=}^H?Lwhukm$B@{(gwl2>=;B{NjbD+k~t z=9S~gORBd!%*b-{mKM)~q7W7Jw2FFC5h@dL(<E*x#uHd3&5_x#d3T_+wd@6lTvbv* zA*kw1Rq~XH+LY_6k})<Yaq-vNx}Bj*%m^75@GHu*in!!PMCn&v1(^+voe+e<Yx|B3 zXy~x7q21>%%u(HHeKBRm?E7JsbX>e+wDNi6q0gq`w{*>Lv~D57>S|?1(^TV$x=y2J zF{v9>o=VZEv5`il#FMQMD2&#Mu8mR+QdAQ|GPN;8g^7_Z{sALG3}7C0Rbq&0<17os zOmZ(&eA+E9GS0-4b&HV9R~<&q_otchN%F|eSXL*o&DYMWTj(${UT7Z30@Z-Fz_Gnt z%o(s{?azu`EFK@zyj+%s<w8QNee@ilq~^e@^%26YYb|?{Qrh+`(T8a~Q$|r<DwR}< zkEB6mYR2p@-KIk@Wp!c6s!y%tm{DUMlZVvZ6^qQ3YZRIZBQ*42|Ah%myOkD1YkP_Y z5f(%%^T7#^l4wSCRZJ(*kZ}RtrH7%jz`<;v4=SlS(K^vpS1VemQ5E9L^176v0rOZn zYD}#tb-jW@PnqgirsmVX#4Rs7^|loWkBmD4#_#IsSz@TWmj;n(Uo;l>(h`Q!t=7kD zo?Z{5a?J`GH^>(^Kqgm6NwF2`&tR+d?~giyDv!OvDvVk(FKR7^=K5iZu})eg?AFI| z;0Uksl)IH8waAjW#gUQ~xlP15g$$5*4_AV>YcZ2`VYgY3StcG<K#f$_^HJ1HJgDIM zi4mA@qi4dFOvq%qgqH}4d705ViM{37$QYi)LzF8tN_vOX25&b_QhvB<Bv2tAP>!U| z+~4e5^~Rpn3K<Gny6tpOL`Bv0&sq{_dL9C)AbyM8eG5-GGPfqMP>eSHCnR?l%J(%Y z`-;j-tx6%*Emh(RS5O#|(*?Nl&a{aJN}_6;NXV0DFq=#Q;MVQ&9!@EBJPbS4b+vp< z5xT`Sit1`jwaQN<NJD~NEkCfq`NBBXntuXZBDs{}YVsmRQ7JI$FXUv@WVs`EDPL8| zFRJoOs%L9_`?AlI<ve7iltzaieUUo0?&;B(nifPa3S)Z!oh5|DP%UD*e&$BVNe#X% zhcT%Gv8Ln3brzPXF@CevpZ#9t#op}LZxDY7vkP-3++ubdv(c$=6C+u6RxhekRN@uT z__FR=KK14`EeGG#HB~0h%zCQqIh2i}geuGRS6Nxe{JtLbV)k@Ou_Jl|f0z5JG$Kx6 z%UJYRWkdwHgWT_KUPuPIjpZ*TuDSjOU@5CTHy&E_A7qG`W}^R;9VfGTEERZ3()T{` z`ir{2%N)FogwiE*2wo%fy;GTd@08}^t8%<6*yKW27>{;iE_8(!bD=apwcusckuMum z5JvHYod=z9w@`kRJu{)TVTnv)YzN5^8`0#Ly^5#e?i_}91hT7-kU({JKIrRLwpaN+ zTbI}uEAF|TETlpG<0pj8#{-rJjRrfKmke#^Et&eUl+^3T^4s;}#FFb)Q)1ESm7W@M z&4)|2V!nRApcVUlHIkXE(#5OdHPTx9N_`~gOI8%D3)cmW#^%?jOj*#Q3Q;P&^y3~G zI=EELaVkPlESBPXBtZ<pL1#u9)?+~oDNbxRSMF~8sC=fCqgBLjGfm#&vD=itY`f${ z)3fImq=l**>rvijCdf2JqKFB&(~4NVpWOy?w#}Y>JoSN`kY9pHA*mIgNsN`$q(*EF zHLsy<te<%Mv`|0$dh2IfE9XCGucKP9$5%P^5-Vxth<i1!od3X{%<9I*gvOFQ{EbyF zvHpkljFo|kLvAQq_a!Dqcy&1b+oK^h-j3Q4>oy|%=ePEfy_g_VMJt)WUG&F`lHrj` zXza{ZGU?%7_K>~FAYNRLB6RwozZdc5R7j2BJ`ndS5_|VH_HXyK6C8S4s*h_~AwRDW zdx;tMR|#)>#gzU<#k7>uf3=2c?Rp>UcU+UuAaxjS`(?MwxTGEq85tAIc25d>U%{lN z>#L?Psg7Vm#_#?l33n&@t`ax0@d}@Y*sx^Dc``VZkQ{3=@mzm$ydl3?pnAkOxh>b~ zKe-mjKaO|)M{Q(NEO+mEB-fg8%DSO`!eu?G`ej!lv@8!$FK|?BsO-z;*zXgC>gXG> zLm5nWaYM2h@^Yg$EHg2dWL({tYdcq2SGnS4mhB;bLS=pBPj1;iW0P3$HSCeF!-<{B zfM}&S=C#!yrKYZG*sO0ns;iQ28`Da4BlKAH@@Cf#3Na#}9w#t$YO>^NR|fXfcoQ1k zP%_f3Y!q3>5DsK8KBIag#tU4_-EIPP?Zg^=eUirY7~8O!>sz<pT!9!B7sxMHAQ{C4 z@~hbZ(ER$v(&f6_f?^uDPWJO~6Quy#mstNG(0#<KI&qt<6@6==!{~eF@9IO<VrGv2 zNE6_12!FFY6PCpMz45aUU$&{eTjB101Nt`W%w2yR;e>I71h?@K89`Ed*8yY+8k=kc zvWiHEEBl(>xPwews|3|4Yh*mz&UpB#X|S-(Sb2r0%(#DDYD2?jywnelfxR^3>D8h+ z^63Ll7cUaa^esPb<FyhmaVU_)CJSks<VlNtSx9@f5-%|eNz5$bqtf{1L8T_BYPl4f z?SK;k+741}nq%Vl)`F&3AColRQhdXUr`}pf%7pm3pBOQNZ$?2kmS4D<;&n=B8*x5{ z;5SA%c~!s+y}IKAB(Cj@r6&WRr+N3o^Na9F?@g$%9tB84?D$atc}rrEQ{EAOik<Rc zulg9yTw?P^=F)m*rDtR=CjMLiBP7Q+D#^=x5ZE&@uzw0RdXj!Cp*rC%f{y+2U;n00 zNIaCwx!f)DrlZU&WTAl<!l0#bQ@9RW9M%32qFH*bWf0x$4DBU16#qhLth+fThJ<E+ zGkV2zxJO;*fG<n!-!{6j4`;J*VJ}3jWcH5+apCeUYU9OyK768QaAEm*WJ40J3G<dr zQaQ#Gn<sm5G#IE0W}C2pv4i!5`=;<E*A5#+lXcG468RQo9{W7?X;QLIupNK`Mu&Ar za<7H)@y<p!wy;i&E$L}}(o<%%$Lj`BsZOk&``$sDs3q&RN&l?>vHqF=WBnEXWBuj- zWBp}+N56MMY~N$-^j|I`o_IwhiY|!1VHx|vTjt5!7vH(5-W=wq(L(em*>eaXfjx)n zCdD;S{XN;e0daeezsn6Z>yLk#KPF=xB-3roK8Zim^{a7Yzid~NJqsLS*tS=xr#IXC zm(9ix(OsS-Ke~uiB)g~-&e+5n4MqQA0BNm!f5ZLU`>WOl-`IlfGfcAKKdHeEMgS`j z(DL}J_O+nT9lz7lptwiFR;l#+Psk`{1Lm`m_cpg@isYp7Y}6>Ps@n-k)8jk7S+OH+ zLSL>p$r4O?G|ZTCmLxrmY5j4MTovOkVA~^ZnoZq*xoVbk{hd*hxO67XA-9zr66#Y5 zlqtoYv5zSc3z^ybl^&e~(N#9@mYOM<zO7BG{aLQ3{=9Lm#6HtsX3a`VmcOLuR@GLh z@cTo2Jduit$VD4N1_v^nCRmFFlpGeBJVHa3Rvv+|4L4p6FfOxLT;^glzq*W&D3Y6m zu>zi5eJ$3-S6IBzS30c|lT&rbiQ{J7dgP=x)+fBeL!U6Es()QD6LTB?$mqAfB>ABL zUyjqYRGhVy#!Hnud4QCv6x;4@sSY%yYDiwHQk1Ica9GcRz0!0LkSgr)gUu|z=T?0q z%7x<xQoM|sx8qVhevq#QXhlm^z`VLQCCOYI;ggbL+RrCaub?6X;QW{@O6?&8^X3t` z9aC4uSW+nHiXTE~)1+P5*o91_WyjUkGA~xbvP!c5D1w+x6C=@DQO!nn19<<ZPR(NZ zOq~aiH|ko=77a3J$pd|ubYA+`=N0_z+lqfiD|<pY-IJRa;dn##Fb(-t@`j{)9_YHK z9S1lhMlhfSV7&26UeRme_01g79m4*r_6BjfrKRrF&$ZXSC{-sN(fNz%hSGb}18gBQ z0L+gcwQ2eA0m|@q>~C>6*rgTw|8h7;sPsxyx^Fy-=qT?W4q95T;JlM@f_`F@d|*Mx zDE-ueUe<goCv8xFeV`t3(Sc`$;A_>5sn#IA(M_&+ow+|{mV`3*vvH&ink@<crheMq zx@Kd)_xj>rcbWAc*E%!zvOU(P*F<Vzk?6nvw4#5;-_@UdzU{p}VOJpJ%;b(l7~j^B zF<>UgQqLH$mudb>TlUGOMec|!8+<r<l8cuvEOakPLvrMiY#i)_1B7_W1!E&+GCJUK z?jGxKm{?ESgmEi6Co(r3!y9^Cfux8I%f*xSkuiL%UtXJ%Gh}Y(dD8efd~5}uJ;JU< z#6ABjKcpng2ev>V^2f12J%8nOdB6W8A0Ly|&(X{yK1SO5xx3~1F%IIe^38?&K(#hW zjcv^pT>VGxEg0>(4=opI&whdA7}5*3{WKQMa0Am4Qjf?^!#c_Y>heUF0w&B&Jt8~U z>IOrr^~;H)oiD#5H7DnybYKypgUIB^z8psDuBu-^j!g62P$8kjS&<esWUIEWc7qJ- ziL)QidWms!^~{)Lo10q2cdrY^&yHbW!tZFEoPp}YqfZ%g-*delPf+m08Kbyo%EW^) z-US1-7s-$(_L$+%-Nwv#GRW#hCYm2&R4*5FW}L?OYLgy+&+S_!Sy!aQ&i2dL&tRQB z$>tg=iuiUozWP+|@loK(EP0VNpINe1XdCEPX`pJ`Ktifaj<6*e`(*_6w}05@J;l=g zc;Hbg&@8R-gk3hZ>M1~c3Rqqz+NNm*GsB*xd-1>*&vPm(vU7GR+g<(?m!->}lgc9e z=nksceIzM1ReEoLYxkaT0X<aR6CiK#?5Q7T&()8!=i&$;Y9Fez`E&@zDVe^r`%^)} zVQL8QrVaT>e7-8ci&mf@Ula&r%X<@ZaoZnt<3Clc*A}fG?gwHkVhyqq1EosC>;i7# zQ}k|<494O^q8(+;E-q^?e@-gfKDLvmydB6M!|(Tbee?auR;~|R&+<J!IK`Rkl;@a> zz}W3t?5a(jPzYZ$<21OQ5yXoJQqxn^1H<t?6|P<`a`^}$Y{#!k`8D$-{)$%0FZWnv z7V8F1UW+h@1DOnvGmbpnIn%o8xh)$g4-6ukXDV|f8=s{S4oEs3i&iei<U^l3Q%f*{ z*40X&YuG(NxmHfKWB)YCH43ddf(g+;j9|V-h&O*i|A;TzB^~z@%5X~n^B(!Fr+@t& z&ELP0q%Yr=^hHv%5_kO-Z|;YrT-V!j35h)=vVhwx<Eo^>7JP{`i`-O@_t@t+WqVK% ztt^)C3H6;NQBEXvZ3I4mX!)`B5qNz*)KLXqafI&YYmxEpK(6;opchJ*0dmZZp!Rd7 z@ZL%eG>7^`(#z$0(;FmPm6jK~w!zwH-ALHcr&g?)Y+d<TDcc-dHX&QK?xt*71Ra7) z>Z(Koo(AWYXR6ioYAc#vaf^s43N1;4hPpI+m@B8QKi=_=O7xEP2*j;j6!DpGCN2?_ zPL~ph&&3ad!5#^vVl!-DvvLem#K(*<28(ddvP}7NK-q!vrw+%|4>w(UqgY>O>p{rW zL#!*!a81t=)A2g`l-L}&Vv+ae0LObXo=F<hnP=Hb3T%&TYHc<`qF0uXP51H#QrS*V zNtKKM)P@Tzc|yHA5~NmfB!EYRBm(A~Y343@e=H>8-JDW+IDh8B40dy<*Su{G(1NW5 z$rX>P>j)LoTkr)4&@5EWnoiQG{rxfQbLL{ttfVMfDXq4pURrZ<o2G|dSHm|NmP<F1 z$87mLi4@K4I`{%amFZ%+VvJQHCKvUkU*c0}kmMpj`a{_S#`E+|ldxDS)m5D9>5~#a zUwT&Vl-+!qP;Ti}ZV$|jy&jJVTYqrd4zrtZCfu)0(?@Pd5si!1)gZ$@wbFhS)*DU| zZ@35%S)JPnF}8Ta(>A@o)uk3ptD`%~Xd|V^x2~WX&$c53^&(!X{nd7(HQ_W=GBR+J z<my|G7+uWL=tXtb8*)vf=O%vDw#dDD#O%<2j+CVN&RvlX{qd{6-#?0se{c$D20O73 zBZ1F9&V_*tH~vw!3u0N<DDk*PSclax%E}~R4y!(;Qe!2qzi|9C{-R$B){NrgIa*yF zWlTDrdweIN8AnXUeB1+9uD|6_Gu#dlcc=+wG^X{*9qRVv4#g|gu}E*~n{GB<F83Li z?O^r#9Zl-AxufAS5_hy_<F!ve91{n}v7?Wddq^$NQLWb@ZQScHh|3R&mFRUPI@CZ? zl5EZbdlqp{f~@T93hFcviQL+{Rc0%-5*nYcJSMf(e7+*J75D6h<en{&l8*o0`D9oM zRMc!f@w%vNKA(`z(v<I31BQ*tQeh76oP(?Xp>vOyaChtq#mBB(^*=r_$(oe3Iqp#l zGjN5pC1lv0vb(RjAi=9m&|H1`>pWsjJgUwk%uqHF`S+<6E8_ErjZ&t$aD5%hgg7oq zna*%M%r)H(G@`+00#`&8UHxIQ*oC&4cGUc~m8^b2On-7&eTpR^caGs391*COHQMTR z?U2km{F<bGilSFkNa;HVrrNuSEGWLSsrg_4l^9gWy1+8V%tt({w|vY%@^wCvuk(?7 z-+ZKP2I{l<d_;Ui=Obt?4*N3F$LAyQkya<!{_!?fS`^a@_v)}vRD?Z?X8F=q$j-{b z(IFvy!adyM=<a<RCfnsjju>~5ZEPW`662;WM{DD50G4U7?L=3$`%HN@fADdFz74Yu z=P#zx_0imdK)`O7=`wy9wyd_`JsGc<x{cHY=g01j8<^TZ&&@Y4$y`L&m)`#P-ztAW zE9IZ=spD#W_%5tdDSe|sYqc^1lP$aY#d8<gXd$c`vEweUE{sp-w!Q|EwZA(lKHz@0 zowlaM$Fx%7)Bk3Rr^;@O-v?W0@fI4F^X=yCYsx1doZ4ECp3zGAMtfRR$FBc+gSJ>e zzAr<cukoK6##oGtn`eC^J~3Y0rvx|TR-@>B8>V!Tz)}+^JBsMVhntk{eM&oryIJa> z`5aEJba+HlzLOSLhe1QmJmVcLT*~IgbBAQTN0KkOq2FOSA8jAS*?(To;$cIASXnSM zn-{tA&iIq<ly8TXamWetm0Dr$D~0vTLfw!y8%lEUS5B~I_pa}OU!s<`2GL>SkH7Ot zOz#@a?icG&5U)Qx?gTB!qM>nnbsC(s4rM&LnZLN7m4olA&M1)bggJ`gj;9_<bpx^y zphr<XG2}F;O(HSm*r%IU3a$%#T44x6IiYC-B(|KpjE@P;-NfI&Ly|T((nid(cVWyn zdY~}6R^<5w8Ows4kmYAA>zpatb!SB{RH`Ft5A9-OR?A?b!HD<?;N<yBG5&7;9pVQ0 zax&L5cYU42Os%}6W@_T*<Au4vbA}K>y#(TIFFt1EY=h?VY_^rwH}1p0^>R>~`XK^} z;?;;D!&GBfXSCG`M-gbFzdr3|(0^#3)J${x%$3ILRi6BPWyiAvJj5>7qpZ606eFZz zA~a{PMd;ZRX-%KDR}1>o@m07r`e+y$FlAg_RXvL9Nn;z|-~OfuY+G~#<mIN9*Vq0h z=~w^V^s-i}defV_#rmVYjQ`0t#^2aNeB49}`RXJ$ei#5pvGgziJ0~9UfQ}@+)80?Q zFq8RAWg}wwPR}NhCscGR`}02AeC@T#TOx03C*FVYmrwSW+fKEU+U`4G&}x4FEmtPB zyZJK5wF6tyuCsjCQdPM9nd6nz$C}D_5mo-l&|u!C>OQb!+|9i{#p6qoZHbT7z&6DX zZex5bptnhXo4<<hoxdftj~t#E_ox&0ToF()xmuBJUB$Wa=ON^{M1og(`cE_emeYpN z-~WK5`teCa7Ia(mhkb71+wa6lF`1NcyAuV%wgBcHi8HW!#08trz+};f=}<P(J54va zcA2%L&Wc21NXk)!`PW)RfroNFR5UbNDZk}Gi5#3IXyAG`2OkA+W5bdy^W@<YnM=h6 zdG*LV&Z|d$iymyzxO#Aq(x*qBgAqLm^?)gv-X#wkKR3P9-#+$whnmL;By&C1m7@e< z;^oe5Cv##cHw6<b@s;G27)B*FHJ}7CRmFu{SH4oD3|V!^+z|&WDoq)i*A-h02eREV zT3^*`v(yvZsmChST-6|N1C`TtZgx1K!5opxmU-jFQ6)oog@Yc8dEoxd%!=S?d6{Rz zRy}+r%@~n)FnDGT{`xD`hhI7)qUW8{mGYDQd_p~p)t7&my0yiCL4Jv;^*Pz10ADID zz={HwNIIGctgC?xiwZoZRip82gY08&t!zowAgVweI|n+PrU|GBkCqUA(zi2eBoDWG zG#Spb6iKVW!!=hl+&o0;AGPmicWX{x7KsBjMQjKpPz^(M{StpkJ3n7x-%07JwT+$A z^a2KAYu&QS-|-VCSMiXRTkK_(e=?|iMxvz=-y$g#&!esuCL5u5o#d{G#AEbQ6YUgj z?|vF7o?J7weK)6Re;AOMxx5sZD>S&8r{OS2Ec9d^F~u<2vAYaqxLtw&mh)-Puvmk7 z*X5e)%-EaQD$|Vm=sZyfMf#+b3`wzR><Frz3q)(fd`4co5r)d3QtXLn&Cu42&KGmt z(@%&xQVvaxM7Kd2<1vZVWqJf!Rs9~(b7Yi?KJR`=m>Hw9m3js(e}5|xlS<=@NdIBV z>86kM^yG!tte9Xfn$f^|P**#WF4=pUz||-^dKaBT@<|-)26sw&!6=onZYHWk8eMZh zi~HP7B$|zT!LW`ZWkQA+t^5miH*9Mb?0H<_=KbY@oz)j<BMT#4p2Sz~KFg(V8~boo z@K`RxwUHEwI=HfIi~6=2+_3+F<+9LDw47~ce5b_YJ95p7`_BpT;^KUtXP60t?)JBr zKY_AP4Bwf+MVjS`%$=SenfpLKvRx5I(Z9bnHoTcsj*T1XA(STZoNJSN4)>S+vt8tj zjs&NbrIn0(=o0y-o%)oyg!}&f=jEH;YWYOERpndu_sS=O_<y&2d&PLJ$F$#anHMA! z@dR%Znh0A}%Gds0DP_))yp;cW`z89PuW<BUZ^<~aC7TL=-*U;CE|)6w_6c~!dHJr( zdj)P?TA8o6HS_D1rQ#JWOIxl@Z-1BW9yUriXEfd21fooMi@zR{;AUuGvb;qvlsdJ= zTI#Z6((zw<aZ@RbMkV1C-wKd}7s2(+Sh^M=Jzs5<D=+t1%l?6Y9IQ&R%UaB2&sH+& zDE&p6LT_@Wln>_K=FjUnTxBe+`vDR5a*tgW)mF(*o(=TMJNo5KOHKQlJE!HWhVpaW zwndKSap#=!6QvwMo=?n`a`M&Lxd1ufh@19uJ~2<vC%Ts<%(gqM!8Ojt&X?HKov{@A z)U~zOVScXP&`ai;hqqiG=v4kCPP{)!`)B%^ItNX?x7^yS3(5oVLgo6@|1*_8!ni=w zY4~rftGt^SUzA5Jhg9G+4T7M#E(f8Ql<vx?SXwN?@4mt8Sv*_iruE;`qzSqLDeJDu zmR3HYYW^x!keS(3Pi|eRw4^4^^k$Z<WSRcVl9-q*Rmh(ziHR}{W_qsCp7!$9Z<d^u zsMy0F#`Z(Ai7#i?Rc%HMcvSJam~g)#;T?6nI?EbX91bnFw={wLcHiX2cT~vl8&uw= zX%FPVNRlT`mTtiBK9TM-*m)&p;tcURan>rh7H1^e2{EaR5F7XdIaV(hJva-p%7p0C z1CmEw|6I**Oc=m5EMCgEELfFrYYi*&Ae3OXdYCDNYm41syEA#mk(GJu>=?e9&J_x? zs0%@t-1e>B6yVJkvj~=O_tlTMku7HHi8t)8%a5j>a^6^KaSeqC^48ao+`5SGR<WnO z(Lddi;)7+L0cP79=_6!nJVkd0%#`21F=973P@iT`!d9cM1aesAHgK{vCb6AgZ>4UJ z7xg)8FTEuna&O6pSmj(Q<Cgq^$s1s8(guhvL(j=gba&7ER>r&kkL&aI|5<%D{+Z07 zTd2=u-%G&Cq3TOr%wcx0qMLY|3^w22Elb%&^!OV7#du)1QOXXE%;jRxMA__{G`R_u zRm#l|ah0;zK}ix!x3espV6{mg?o%dZ>xV&LsI2+LmiU-tH-vV_2350dPBjZd0Y3kN zV$>rk-n)Vu&oXeimOQQ>>xpjiSRoN5)3R}TpqLhv$#8*XUj@d<!k2>jB^Sn$Z6iqW za^gs|4ARc8N7G;O?5!-4++5S`_Rn+^;=bR=)N?_UFBjqqsm<F{=kQ~kb?EnQ`Bzrz zy(}$Y@+3=;Yh9qF*U40^mex+X<l_4>3(#Cy-s1rn|8P%^uM(DLFl0wr#>C8o%MX4_ zM05Em=Lno7BMv0Ii?1*2#4y3Prpi`*^a@#WV;53pak;o=`4crl$YERF*y~9o;qI_4 zmPw6>Ws4D<%(7g+Wq<jKQx08z%RR3Kg}`IFyy)~VY{%*H=C(H*>!i=Q*Y~O~H%UqG z6{6e~xgbw}lu4QRg8rSuzwzrfzPhHOB;Dl9<lRIR$<_N{Q9QRMdx7K(55N<uxO5gG zgxB@C`dMCaRY@Ve2rW~O7HiYAo5v=5?f+2pxYoFre@)66fLj1g0yJ12D%5#EP4*|E z950}jzb41{Ry`i5PAsH7%r~voLdK@W_Q(7^6p&BXO0neAwGT711-{H!Jd;g)Uf>o$ zrv@E3HBd{uvjewiZbji)OqnAj>;hJ;mIiL_0^a#U)t78zIzb*{dz>H>6>eq(te`9e z=%m0@T1~b@ir)~B?|I8g8G%l0Cn*}`D=VKtK%L5@$|cS?{FWNXSm`#!$~pXvahMLq zly+`t$KhL&*S*9R2b+bzTjyYs!slQG2r$NAxs@(Q-)geIl%gDN!u9FYIV={28`{4t z*k4XqX&@X(D!oU8Noy-%nYn9%SIpUZlf6=jDQRMd;d?=*W}9WvEQ2jHPZCOvikYJ5 z2T`=6ga~oUq-cWVZQYWnZ^I1ia;PDgIj%>LJV8)g-dSQUz)y)OO8PdGwd~Il!I;L{ zj8!*xL-7ZX8~XiEjA?NY^7)@U3V<a|iu#8rO)>y&=$!OAEwRNvhU4$n`G=(N`G>f_ z)EG1Nx279pT2n@p7#`;F#g%6w2ih?060_@P_DTpc9wsV%9wx0z#U0c!g_XogZF3>F z%>|_;_3s=eHEpiCTWWJjVcHyHSMxDUBA5YF*h$vr(yX2~m+OxC=WT!a4jwM(B^X28 z+f)0S-?D*)k)O}<h}>QB%Qi@uxylQr!iXfBCSlz)DbP)m0(b_#YJ$fuxetwF`&@L@ z%QT^+Pk(pmSrT_2d!Ddumn80kMB+Q<oLq@JO|hrN^cybY&5L<(UE^Fp;;n~$t;EBa zjl$c@+1YG#gxIAlGFDv?cPU#Ezl32sNT#p(ES2xdrKc?2<(9o{b#0|=@>$xZ7g3iq z$Uo=Gn0<{A*m+k*O*O)#miu9>9I0()_W&}@?;E%W;6BlZ#Qk(nz?GXhReAS#IpFh+ z)GRLq!c$3Q-Q8;`J~}tBcfCx7wZQ6myTzq){|vXMd~(_mzqCq2>UFio{Z@2|_o9kw zV_mwJ)9PkV%BctY{Wn*SNQXQ_mFE~hD84>L3)P@xxFOA#jE3RT^=xm<fb>pv%jW|M zlQ&&h-11h}X+)v+nT*-`NF=(4Hxqac77%)aK4kVLYGG0YQ)6R3*Z$#1b;EQnM+&0p zDS8(=67?Mike7DG%Z65?qD1ZUT<yM?48-gf#$6#b;2vWL7bV;Zw>C-wMjGfAM?N}- zgAYTBn%xWMMhwbrmqB*-LN_&#ZMNsg1Bz+RJ0Le-0quDQaS51OC#K?btNBhmg7AO_ z0%R>Ieinv*$5*c0`?PV`(A7!y9>k;k{uDMX0j1blH@h$)TZK49AjcZiS(5GbRwQ>8 zZm_SD27$4XE^h3&xN<lNGKe3<2^VeM=^1?)pH#1yUBo=}MSwl9O@tvahnw6v$X^Y> z!#z06gxl)Iz1DjZn%ajgTFcs1#Beu&?NFVtb<GaiLVeN!lHb2Dm28fWpaAaK5jG<p zzp*b`!r-H|m$;dAdn>hG4HrSxguErJL<f>;QGMp}S6;5abs@|}x}H0bV)IlDs&-gJ zPSns29YR}<=YAo>G)jB`u)2ywnY6!+!}jOlA{@lh_D4&(r>F3`A74YcCyQ`fKGCU4 z7!<Ai1cjGNA|lxDbK<vt{e1>zGd=J_0uVu7WRo{DO`=NOSf@fQ`JGCnUWF>JZh)cw z<4eX9eGVn3)O`*m0WCU|-=A7OuhjfP;6I#Xy0D(^h+htNmnmQ+`h^{=O$_#Pu7)UX zz8d;DnbT=%xiqv5N@ugm-5C}h4Yxt&f+4Sjat8r(_{4YiBG;2fYtBT2OS#8&*fkJQ z9-FX-UAE;oP<B%ud?nG0g)q%z5pLOxViO0~I4z#cQKjCZ|J8#*=q9S(9t_g6^YF;* z|5pcttWDL+<)pMT6QhW0WF?P1yETzoC1Uik>=`(MkyuM2!`CD5-yRJTXXZh2o6@Q1 zY@(`=1x*O!=O(Nb_SzD}{0+PRnvo4nm2+#nP#7Q52zt4Yo*ly?;4cz!`X_Ol#Y{t{ zc(0+Rk5;~k@*v(BZdovBoPomS%#cCm3}&_yhaiT|)ZvKXiGHZlmIZVvJ9E)oWSDF| zdC{oYebo7jMvYHlwD3u1F^TnJj;O+9e(Xoz3FO9VHit<}twWz?Z~8>yd`6|_+Nx6; zH_S{FWHN4>-Ne+fptaLyiSwIM&-^A~d^8eVsompk!GL~<+t(KHk<<E?UZDAAhU_W- z!FYP%PDz%3TAwnWPR4jjKjO`J&SheIN~7S@%D5^fR($*tuT`o2N9H`zfbhM1D9gv^ zhUtL$5)k)Wx2NXMkY0!nJ=v<ay)Y-15XN2@?-23jfbP<mHr8baa>GbzOvWgV!xp$$ zy8gZL3VG5+Ol3!twE%=z*zgm0n39>8aPL}-IGm6)%b++h1I!6*2C_8vWdI>2y!!pQ zBss)C_GOGtTyyw3T*RH$z|w^Ht_5cCp;n^{M_TE^Qbu!dH%S+cG+T(6JXO0r@tWuJ zWGtKh-;XM|V!I8uluy5)o6GZxIcSW$-tg1e^{#{F$Y|+_tm_Ai@fkJxdLi5XJaOk% zJ9?{3GWs^??pGx$(#{Fx<K^;g<CgmaBJ{&>ozFR;%o3X$;9gE3NUZaSPO*Eod^xd+ z=;ct4d91ArEno7>Nf@0n51kVBg<)S$UQWWIAf}fShPsy%h9joDv7_hzZ0z2OaoRMH zXW{BUD(tSGeD4F2UKu~NQL*it7s0Mc236>k5p@JyBO;Y(_rU&PLhK$GBEm-z$LxWH zy?bD0R;`P4-C>!W_&Qv>2iB<-TRw+tHr<Z@xP25FZ3q3owOhd}0as$&gE6Za3}VSQ zC%k)G<~Yec?%vi`9w+hbKU96m0SWhmLMytXDm?dt7RgUs0Od6vXfwTMY*x;8`-|7^ z#fW7jb^|6QF^zpvH8oLU51$7UCArcz=%jjM+FhiNl0dkKFAxV+aAA%In$0(AV853F z#pe=PZmSz5=9wKXzZkXo^6S`S-lPh|xqoo?$gF8*bET(TN<^nl96PVazFCh|7(EJo zC21kLeO?3!uvX`osF}L%D*HEBznd)F$4uh6aL2_~L92<pd9g-q-5cXt%c!4Nw-qV8 zxrEsTiuA?z+}J2EgL9c1I0AWMD#BnuS*p&a@_b^OYPt<B@}`>Zrjj{Wo--pI156$# zP!%y*8pyS#LZ@dL_?Zupj-IiO^3(k>0g-m>>kg}zy@3{OW_>@kz9w6SCTj|JFtq@4 zC~>VBA-mXlm~F|{*a%bb@g`KpVjDV9YS((W+l+epVLa#OGT9O@^BjOkmO@V*K$|=1 z@+QHgtLZnWNS2kj8D8b<b2DV$KQ*{sbfMi%_U@BRx$-2FXqQD#G=1HG)bxhb2K$Mk zqz2f%sb(JDENhgbe`>+{;MQbbxGp##wXh-hSJ`_fomwyP+Y@UsWcaJB5oP0v5&wdy zYPAfi_HLMeKdFW12fYKT=Y9frC~-CLUhSrIa$ARi@x5W$kWSpCygu28g>*7pt%i|t zO{RZ`-0k@m9#-RHe(@*OpsJ<E)F9$jT({==JwWs^3`25dudc^NeBx%Xi7yLS_A5jd zElIZdyipSm`PuU>tzOz>;<pGjV6GSm=Uqe;uTOg%;qhek8NUL2*H#p&V(jj@8*sfn zLGE47kSEB&lMa}K%V7!`Gvr^aqx&O(AJ8Y^s5~wg7lEN$?@MUb?j3^GE?v*JZg?LU z&e5+7-%hjkd-H&Q*qy(e7>1#iV%d#3v|dYbip=I67b7i}XbRpuVpZrSg(<Lmd7s>6 z4UXQRM&#|p+48sPC{(8wrJ{w@7&>baQx>^7(P2T^>h6JOVy$Y;$qZ&(?@Fi085ngi ziuLcY);@^2h-%bCyXFfu4Mek<yp7(dcUQ6%%eeiym6l1|ZL{odkHK&vZ=Ir6;(2%C z48_`>@R(!76s|QDi4_}7cmT3cE^>t^DYR+T8?Eu0G$GCN(RH+ZCMPi;Oz{#LP~u88 z<^ELzntiv}ZYJaSd|OS_+sQ_17csxW=S(2iF_<r?i>Ys*fbz30f)|h*i7E3CJm4U& z-5+5TNMR8f%ghn-!4|gz*s<My>LZwyWS!-jiQ)Y+*wmDV^JLl?#-Rd`g~_#UEj_{8 z17xldzlL8S5w^v-iko)+E4NRy;myCYK_YCM4ObyWLP_JfwC>f@TTGYeVu`L?A+B5j zSDqfP;DkY;I6?V(x9D;IO{ji}uq{qI63txfl<kK<A*U=$EDFIQ**`Ac2wighDB)DM zSP27WiG(BKNJJ_z8x@NX7V*Cu0B(WhsBs-rGPz7Qz52U6%b-EtvlSX*618+-QF^AG zCvh{P+5PdB=1Vej!BrIV1NZ8O&0)+e;@50@#^>Z@{RHVS2a27E^Ca0QfTT2sk;~HM zoJ)3f<InOQcO#SSOI)Rm>>Iv8-r9hxV@bwRRJR-~-fNXRQPjy&iA)iz<A(v_=b`a! zj7)d7f(Nf)1TOHLVGc<{)8$L^hlWP+%7FM<E{OIGI%P8<%Bc%xqd|k&*fS4iBOt#| zFndZi0^(YN4XOA5c{CkCydOO*4cnx#=Oi*y`O@bi{j{x0kK)9iNNS-xCGd($v@gc7 z=~LS@E#VM}N719<tUfvhPT}2lH$YqgFIlcbG$fSKQc6*Zip4kOWb-^5!4fGUI0t3n z!+|qpcQG3g#r0+HQmUi?e{)=YK=D-3;SSG;5CKYvKhO4>Wlw*WZfLGQF4~Ir<@qC< z;Cy5v_rderdjMjkYz*eRzr*;Qk2=aL+aAP{WXzVQNAYVqOb*5La{=|j$f6P=L=R0n z3lZ1>P)Dw1;xIiSES%K|)DO87y6eosnAC>cZZE7586G+C$kGrZ3t&2&sb6uy!n)24 zu}Z!<dJQ%okhOyjGvcpo%eZ6}VnS(xeKH7&eZ|(kV%NUn*aeV@eZ|(kxa?HvkRx#L zEJt#e58c|^Vp6lxS9-i0T^C(%2D&0o-tZq824%+uP~^UWLDHGLy^*EV#VB>tUiwjp zl4iqG{5*Xn3aLj~aR}ABb*64=+!Y=he-yOLxF7~9_ldgGJwfh6by=PuJyR#&;9w6@ ztw<d|&Vz2Gq0jK4yg)1?9w4c)N9U$mS=pAu7~cJTc}v;`ppMT-Gf7~3nq1c59bA2A z(JJLMwS<K|@pxbsVUgHSQIY8pQAKrqFsT|hyqPLDoRdw-7W1MYvPBL>di0_KJ~<r% z2M4Kf{gsQ2npc;Dc-WBaZ-Ou<%ta92;W!b^EgfsTvCq{D-<vqOOF|$&FCr->LOgxi zfs)oJ#e_K|`C!DCXL8Tj3%5?n(<KIPVor~(HR&=g*$gX1f_zKezh&{5Cf>ADC9F05 zWpb=$I&ME=8*EDhe092hArC)wQ8E`J3wwdYLvEg2Vha&gigJ{dcaz08QlMPWF+O5b z#fBlQY)gH{vU<cQ#XZ81C+hlmL|leSovAXYl+qe+RJq&l(J5Ez3ioNg3SUd%oqXbt zeH$|7^x-CU;yy|xs;yZE^zWy@ZQ@6T<onbpw13V}tdFaQ;4Rt6&EbG57fl&PFh-$9 zvNJBZi2VV+h0my@=qogn9k!dbGbY_t(85Z#&#KB{y9ksOtqJEs=rr{<>aZNB-iW<$ z80p^ED3TRIy}nhp2-i3F2^9?f)L`y<P^3!(-bI8II&`v=QGFdsg8cIK-h|v5HU?1` zY{0<)cVxiygs*QtudJiI#d&hs4zX^rEJWy8U7snDxvz;Ip?Jz=m77E>w({JOv8TjG z_2g#E-p|dix-p}AV;a)vd9Dh%IOVY}^ECTqmER%i3hXC1a)mR`_4m`~`un}w2>p5d z+>t2J68j!z&6s^P(weg97@1LXktfU@Br(8fd3A&=FEPKpr;dy4lU(IHiz8|+>U7N< zIo?;Ta1SWvneFoRUeA)rZfvU~V#h~KOWcopLfq$KlttY~$aRgZrg4AhW5H;6G_*aG z98T;2{~Q0;y&hQIy8pksmHs~kPQXgo3jbFpZ`u1*k2#Z>qj&o}ozvd!`=XWF{SH;# zBuhbY*uUyEW!h`X|Fd3GE*B2GVd%fwV`R{l8IN&fwAhw;^JFQuk9!|*+x&;UC=`DJ zKrYc~$vy?2gJHC~F@QBtM`@6>Xn1;E{PT5mV~v7W2J2HCA&f=tTM#-#gV`C6V&F)c zLe7opH(Ze7Nq7!^yD8cyPa${dyNemLyn1<N5G`xcbV!~i<jrLvYAl{hI#O6|@!49& z?4Q^{kqr#HmPs;dK0=u1#wd2NSu^3dy6ut~u(zWHvjzQ^&xDNRX;7}X-W`(1Nn;$V zSM4;F(J6VFOn;hx`)t{<d74(fG2U!Ef=jADNvlNVf{a%31@ap{2-iLz4Ts$CE%fN$ z9haL>{4M^A@#J`txA@EDHdgL_!s-ZI*m=?Ag&mhxD3)oGT-bA`><Y@25f!ae)v!4Q zgr73W#~bTkipe+KT23rWB_=Lj6RbkBJF&O1^i3F%bp`M9h)jGr5^of2K6jBl4!hzH zyS1{dAJItqQLa`#qLESE#T|{|#^H2cUhvu*SwLXwHT!!QO6S+_0;z+$rpbjU>1To7 zX}MvVo^=%#C43CZ`&l5=Dm)_U`M!$xt3G-K^nAqyG2IVBNc*{8#K>I}|6CATDP%qu zgh{LKTTuF?LS|_`3$$<33m7lW`yaoO;#9(JUY9XawWA3#t81aX_0<vBMq-Lc_2#t6 zU6-Sp<+wy!NgS5XMpkd`Q3h35D8;72(?XEz{1YB8{X%x@+D_RG5zs|UnvMOdH+P%t zCOazjvT?0_Bhl?d0UnBMSHbC~+(<(_%*!dDDg0>i^URad>iEu+?yy<^W1YG7OJ{7! zz|J!cjEoTr<$Ergllw&%IR%NHrB#4&D!3#N3&tAwN_+d_4c{)8^tWs&1iD~^MP_1C z7kI3%cYRYe<eZ;IsyVZjjvh&!iXxl(24tt|F@WsY>(H5l0nCZX`K$=nY*PLllDtGJ zf~874F&;4&s~bK{<!m&rs39H)$+Nwic3O4(ulFqmcptUogs(3xUxe=Dlm~m)$Ig<8 zW<F{wQ}m&h>ty*iu=lev?%<~QMT_t=Dz9;*6v?;DlhjgyNY2-+HcK8I5kSx7a8xVl zUAObR=iZp;wr~7-|Ims&B=8*Vkt<Oo+6IA6r1xss0uychmsjAwy<d?<o_fVIHQB2r z68=8z{(VON>T{@TLHZo3koz2}pge~ve`O&nSz+}pCsHxi%$<jyXsr-_#-p*KG^$%y zvSO>rZbYQ2$N48zHg!x{clXCRXO@mD%XWX1j-6au)-!e#ZkVnYt@!7f9f%#|21>Vd z%Mgfla|5Nh5GV!0Q>4680?G6EDgR=b*fWtI=%)(RkMsBL8FM9xEn{=zBV!gYW@N%E zS?>5!n7V36bbTT2{fLeKh>lnl?1T0!zd-uGBP){yz8c$zSbE(=60ri#l;!VwW9Cp7 zJSx<u^V;%ma$`wiMhj}fxSB#Nzv>F+;251-fQp)MYI!@nuB0C-q^UbLxSEc{7`T<C zZX+$ZR6PP49RrNoW~Qx3qruPOE^J!RY0WZGCyupM>H=G(PTFRx)TR8TI#a-E)|(7% z?V8?0eYNxo6nML|Tcr2%Y`#d#?_;pvhd}e=o2~77)i=p~D|aNBp5>Gs?RND@7Io=M zF%C&`AxN#jmK8^ZBI6)T!K=Vau=yyCG9E4Vu$|{}l3J18>=N=O5~pw^5BXQ1c6^y9 zHn((i&_BLZA}TfoLnxzrXUM(aL?Dn6q0s$XAb&ZLE8rEfKuVVrtqfx-iTPZ?6nqU+ z7eJ8c9VwO#HJRs3l@IO}GF>483IkJ9R24Fd#O`KL`FQ+^pwh*hK<woHbXQS2UN1== zrAStU*hNlxZ*ysPGM+35j<4Q)V0ozj@-*1$zKB-_&GEDZ-q(h@Wz#wo-JI}#gy<Tv zyHZld9Yt!=R<gZ5ho$UzUJq)Nuume@#wx+a>_Sn309;`tO7-%EGSKNK*pQ-De$phB zuc@S55;1;sUKkPL?qOm{sQjY~ZD8n{N*OZbpGjJjG^vEjKTRrcNx}vqUdb9^Y%#J; zF>$TOuIRkQNYdO636*~yJ0j6}%MsE%u7t`zPuw+?ix}kEyr%M2|Ia1<pAY+g*86|* zGKe6zHWr}}7(RL9Fa*u!XS2DYT$5|fT|VDSv2s`7*%R+Yc@fpedk1Dm?hkGDBFP*7 zvCUqr0c}d9M&SnI<u_8<>eTzb8oH*kd38!$Q=R^}&8t)58h7!>ZSF1-*Z7A&uHQe@ zGUK+q8Hl8Qw~aLSm<U?dRJfGbQ~z2+wbGqj2g6yqNL`gUzT}2;lHtzcJqQzbFkyIi z4a39<XqDf2kcHP<@UtEf<)0hb>mDcqS550NBdx2Ie#1x-itLAU!lS3AJ47%+KSP?X zRHBqV6W*I~0sHuO7)sX^1UgH8<_f^MW3y0hGdByxacgYl8x0W|K6Mx|6EWIX5UrIO z!8;com7FAvX*;b$@gEF^ctPpxS0zHrdZZRx)+4^<>fzV7Th=3WCwhXCT{C;c@2IDI zFbja&IILF;#3&!;_wwQD5Ry7LRo}82aY?Gd9k#ETk-AByykM?GX7VMt5yc<cjvT@8 zohqo56R{<6%aA~K#i8mJS5-ug0+gW5&#;c*uAt^F-^@7Qt|-9Y?{5|D(!Irbu|JX~ zZ8TjkF%#-pen@%5q$VX_l+{%=!o@UM^>ShN-K;oW$K@ct+ajSEOBe8cZ(?YK-9ijS zZh5gRE%|o7OQ}dA&8}M!T)2|I<juSPgS460`^i{JgRx+1pRu%kkA~Bp>ILiMRk1;* z*wRc(;(02S7Zxa;i`a!su^9gyMQXCNKc?>*cBZ9UEj<a6S3?DzFF|8a2|?#u&}95S z=p2RLquL4;g5GZ@^iR-<Ofd!Y0mEj1CNOM1sF7h;+jw%<;X{Vq13HQER)Z#yJ^^VS z--143yq`dt#{+O_l|Bjjn9`>}D(%<Can7No<3QI?-{YVwNPmJBkPbi@t|E;DT}^rn zBp)IUI<J5<j}JhfFpp0_n#ZqJ+76OWDNV<JReBO=CiRtqE+fqVeTM%BojLfgmUm#9 z<6KGUaUdCGgU(oxw&2a6sSJD6(np{kXyc%BX?xTaE&UR7DdTnM=r|XXb_QKS%CS@k zn$570AT8TjpwDU5xgfRvMk`$c+DPdmR{8}fN-c+_8!ZK(CdL~AQY{NW$1~nC8}DsU zCzK%Q{A{Tc`q~#v+ZCi~dx6xxqd+lA3#@b!NXz>nNXxqkq~-0ry(wijNVOac`jT1> z1!*2<TIqDqSCr1M(kt<yL@i|_NWRh=bbiWo9GP?kot>~bc@fKYKj>?weG;Ut`aMWX zzBAr%u5^^8>p=J)w7iEuCs0dZM?-snG)0{ad%@CX(6vk<7n##ZKY%9C0;h}POeD1d z$wV>e^aY*6u)&~nN%D3am7WQj#IPwK@ztO+-Adb|u;($X3urQ_8%Wb$4w}NS>p*3s zMOIpX^U|l#f<>THNvlBW*&l;0MsE%}8$mj%49GH4Ea2RD4_W%k(qXtsrCMq%EyJ@{ zI@TSrtI4enr13`W<~Vbi+h~yHcGB*~OM35Nyd(@-&2kI`sh6B$r5A#prnJ&Z@7mL( zT?KlE(lsDW`@NNR+zX2|N;5$!9SV9bAazgzdVw?rw4QV^=oQj+Ao&JG(76xvJgEWn z5@`eIWzugT8Q+7>4%rwJNhKid0k>FM0$NL39s#K>&spimpl2!FXr+HzY1h4R!KCl* z2U^E?2ZB^f0Z4NjW#e6J=~mElOmRQxdD6omP5UKC({|YhwLxh&kV<=jRC*NXMM?{- zbQEX^%bT^Y;|!*KCxKpKyzwCImy1DzDeawOXbfmQ<4p#+{TGyxCN=phNWS!(>a^d_ zarOoUon1lukPZgzOBx8;k8~19uB}1m98eEZ6-Zu)6LjW*a!9v=P9ZG^9YA^>bRek_ zbP(wW&_Gh!{*E(<)EzXKlnaWG3P3xOhJy|#jRy50O$FtWW`lMjT?>+X0zv0q(7~hz zP%qMJAUT5(bUp!n#oGNE^fl=Z&^M&?9*(n#6asxq$^-4dv=LAyX(VVQX#z;*96@Im z=v2~`pxsD!fOaK42HJ(R4%D6WKIjC}SD@2Lzk~is%IxVl!${en;iP=f2-0BCDAFmQ z<4I?OP9~iX>PwmnI+1h}NN(~3oku`>ke&s#CA|k~L;4ofj@0G=$7xU68PuP20O%j2 z{-6P*<3Taj)mb2Ug$Tx7P#&e1fDR#D4eCg`4I~Fcg3iOB?@3RAejvR9`jPY@=qJ)9 z(9fjcfsV78lm+^Q)DzT&nhynaB@G1qO6dsDZ=^Ax-$~OzqZuy>I*fE9D4%p6=nuww z0whoA1f7>bTS$!{hw;7v1xSB_Qb^k!gdRrf4hoWTLFuFd&~~I^P#S3>NNuSEjbYdV zkUYB*bQXicq{l%!lh%W}kv;$&N%|V3p7;l-AH&jf9p?zrPM||cAy5a>L7+m?0MJm< ziJ)Ui<3OtK0?^S6y9`u7x*2o^X(?!T($k<$qz$0$NgsnUNI!#)A$2?$BOIw4Nb?AT z#xktXhMfZ%$FTEl*wvtu81@jTn6w_W7wId|o}^zus`<-axTbJS{0*dIVqI^?*}%5E z1M~`|OF=5l$#a}n8Fm;*!={2ZFl@FBTM5!}{8i9vlzswwowNn?1}S)m8Tq?_-eg!d zNHvcHsh0CVZ&5lGq}PfCpcyDps<RL@lXN|37HJWvl5{JminJJX5$PUKHE9W`hV(FK zHfcHNV$$QFOGx#gTGDEeoW4$V)`Bi2Jr9bK)`RAdHh|`m-UMAndKYv#sSz}f^a*G_ zX(Q+g(wCqsNt-|mNI!tCB5ej;P5K>l4aqqa>k3j3bS)_j^e<96=sHp+=z3CT&<&(4 z(7#FDK{t{@phcu?&`qQq(9NWtpj$|}pj%0Kpxa3Kpxa6PKzESBpv9yD(4C|R=q^$r z=x$OG=pNDt(7mK$(0!zlp!-QBpe3X;Ko5|{gB~PJ1U*D51wBkE13f~T4q8g804*a` zf|iqNKr2YKphrn_K#!5;fgUF<06jrk2zruqJ!mCq5vZPYE2x3A7_^FX59le<63}YW z!=R^0%R$eO9tW)<)q~cOR)d};tp%+kJr8=0v>x<4X#?m5(wm?cN$-MQA~k~6lRg2x zOxg%~h4dxpRnjKV2GS3p*GQW|uakZUy+LvgL;ocOL2r@LKyQ=MLGO?<LGO|}gWe-$ zf!-%|2Yo;aff`BKpbtqoppQsBK_8QHL7$NFK%bKGL7$QOfj%dNK^sX0pe9lT^aZI9 z6eAUZz9fwReMKq;eN7q(`i4{j+C(}7^et&T=sVIx(D$TL&<~_C(2u0)pr1$;pr1*V zpv|Nj&@ZG~(66L9px;RIK);g~fc_vY1pP_69<+tD2!tUD|GO0wAT0)^knRDcl9qsi zq=!LmNXtQONsoitk?KKdq}8DIq_v<9q~}2$N$WxBqz$0$NN<9+C%p^GApHrtjn|nS z@-aq`@XjYk_OOD^VW2xnM}uxBJpj_H!CKISwi53JkX{Www$fig6Di$drOOXDX`cq2 zL+Lt@rfsy+pF!tR`n#2O>TA;O2bx6bfgnv=2il2ih(~O^XF=C6-itO~ML&#4EXVdo z;2NN%1kEGO1?g_U6PCWRwEdAr8UsDd6e&kx)FY*X9wFTeQY{}?Iyh{?CRthtT1flu z0O_^%9niH5`@)7D-`|vcH0WQHo(a;DzhI?rgRZ0W11nwd50mdBmfiws3w{Q=o+)A= z)t5E^*CU2?1*ug>gS5QggS5Q&6(C+fTEFcejQ6BbAl1AW^lxgp7o?h>0BH?v0BO8W zK{vJ)Enk2%USKeMEtQ%<lT(Ct22CY(h+vn5x#fUV%ORj|I4?OIq*^WjZDLp*NXxMa zq$&OYeM@P|5R>9ukV>xweMjlPtu%DB$@guL#`_WUJ>&ff(tL}KG1Bp%A1FNsq|&QE z<+T1m8*e4(N5)%i<Gl^Kk9F_?NbBIzV~yrTpr4rHHjrw5%t~Jc{Y>ebR(im3Chbtr zW=e;FH0^jRtp)u;>0B#)*h*gn{YvSpR@!8xfg+5Kl(q$_<{Lq}r<(RpV?h_t?~K<C zr18dBX({LrO3SVEcaZLB9XbrVV649zLDNYqKxL$7LE18}gZ`wJcR-p)`{C$4jJGRj zIcs-Mkk;;bAWb_Hw1sJ_L7MgpEBzVdq=`@dZlwo}Fs)h$QY~kI0*rSSNVUuYJ;8iy zK$`E%AWiW;D1|9L25E|;k2lg2L8+9E1gZ3Lkb2WSHr{Gbknx_i@jd{pV!oe%G~eq^ zFlm>cX!3X()P`x-fi#bAtu&<=*CR^XfmGTDq}HDfYDeifE4>b+?bh=o^d9!#2<V?| zh08#i_Eu0D)7}YE&98#gbAAA=rS-pn)cRviHoJ}IgEZc4r=XP7{5wcq4~2UtBTd+J zkmfcYl+X6P8l<^>Hp-+p<Wv*ypP)XBcLGS`-6B%v@pFlx{Z5BBF{}?r^B4p=oN12% zY1-4R^juJ1N~c)qb)foy*t`s+<#++4d#am2udxn(1Zf={Ioe$FipH3HM}fAd=FuR{ zcd?Z|0?MHDQ7e53q~qzQpn<HlZ$L8wV#}^)U`L55dV+Kmy%VIRTngHO(#JrW+sjrO z19hVGchHWcUB^03XVRV^O>q=R_pWakXK3Ddb7!i}S=fi8RT&_)>iM&c1#f}6P~ZC? z)%SyyW=ud0Q5phuB}G78=xd`aO}4ZIl*M?DfK=b_AT4kEiP+zubbF9Wj|HhmTm#aY zTnti=SOJ>En*2cG@k;j#s2jC(I0t)fq#mH|q+F0{ZUX68*Zy2H*6m?w7U+CxzR8CD z1X2qIPr|+)^^E`>%Xs&Jc4OFMHtb!H+V?$3?aL^|ehK4+Kp|2gXb;jj(4M4epuI@* zLD{66L3@*41nooG2-=tQ3n+&){5<U7l8QlE-ZGGS`$9`Eg0xqB57JS->l9;YHfVop z*$<>zb}z%qkmWrNq<(cJ=xBy@pNd^#rYHdQB%K91fOHw?K+;2?gGlYCVcnA|ePMf$ z_Ph{CXCoD$?)1);AnmoAL0XeLOvgSKwd@2^`v#tGQe<CX%6m3w7iziKhAjh?(B}88 z^gGZOwB=`z+7h|Y=vxNT`n$WrSRiL)kDvulfYgHbtuzKYlG069+IEIXyCdi*O0z(k zcBqw}3<^_vnw6GY=|!OalwM+`?^)>=pnp*Mjg{^=(|G#{Aoc8XKw6U*fCezdERfoA zvz6WtDxmaXEB!*GtiSzc85(b?4y3b(8!W98DSPM}pn=r)E=Y500u5r=W{{4APgG(D zgL#aoGHIuP1~Xm_C_=gkG=%gZ=xEY=pkqiMfi#cMMaI%;LbN3cDrCHQAdPnmNUeX= z(hk)o>_m{JJp(k9Y0m;_+Nq#p88#cF<#+_7DOQ1wqjU{OQ)~bgG3;ZIrZ~LD^r$FE zZE3W$|7`5P1f<XW2GSb3<YMgcFl+-zbNdkVPip=Qq`94PiCMAS0n&IekdE2iY7OOs zhB56CAh&EFO;HURPHC-`-e;wcfkseTZ>6K_OukD%s^uq;=DW|Oh6+H(Gwl$N=6exH zQ(O)@fzkz5x(uZK@*PW4qb5Z)=tQ+th&8mw95dD(3DUHqEnRHsE=w<3`VsULwfq6P ziL~8ZtQS(HJvxDO+$g^cyVK0K2BfW8a=EeUJkUv$P6eq|_llJIKDM;;JQG#}(ksa# zkY2Zbv(m%on|SA2x(1}4bGN0hMA}v?{S|aFE!YB53(~K^h|aKGKx*^nAoZ}xSDLg7 zKqDFNHVGp=4LX(dI_NY~Z~?|xQhSi*aRf+9In~m!R~gNtL8mjtnIKIu4W#9WTKd4! z-dCHny+EUx_Arp9EdY&S*l>`R=pK+>t$qcm=E7?XT@BK{HGZKf`KO>|Y?)ry8oCsu zHF*u_4CZk?Nb?Q-%Xs@hOOJyz#h)Pc`$MiXG}_W-mezsBQu9k7)tq*{(b5Gpj?!)* zmFC=F@||YsQP4BAejP|Hcms4M)4mJRw80yVbP!1Gn_=lLORrn%w8(MBQ%hHnYAFI~ z9-}~KQ99a6XM?oA-D&9sOJi>`X(xluX4+{W)!g+qleVv=vn^d_=|M}cTlx;9vzx%} zM$7J&j<7Te^ap$LXpr{g+dz-9{yw$z{vFsUXIR!^%)T7yQH3Ba`I(@1+e+AU(0in- zK<|@o2gw<%pmXS**!?B-1!*a_+=VqPHMhIlj4yYCwC_I+x{%UMAk8g!5B4&sr9DWs z>;$@>VS9tr@57)9rac*?T53S5Wj<&LQ(O&FEw_LkVAz8o)v^(!YtH@dHTq5mseP3o z)qI_$S3#ObBj`cu`xK;k{AQ(T_hIjl((OPh?FM?7Vf%s9f)bGGI|uX#rISILVissA z!!849iq#+;bNb(JXemf7-C*fEOII&3@j?%nvK<A|6sK95VJYySu_^>wMho@^sa3r| z%Nf=mq*k2=(sEo1l2;@Ioy$R*;(E}d47(eoDLw&dInH^=*s>C&T0Q{Dc|V+S0I8O5 zL60-cdDv*V0Hj(T1x=<$yeMIe_YUX@QX@#Ud<A-vVZVdamIEF!{pdIlp6o%sBS6|` zUInQ~d<D8d{duXOgFsr7<3Q?@mx0uRn?Wm?+Z`aa;9*cb!=3`E1z&+QMPM23JyF^g zq$zd;tzy`oAWbnJq$&OldWzCpK$>C+Xf?xDf;7c%Ag!wb%MC3DX^94}F#1M;o@Uz7 zAk{Ys^bEshf>hu8AhqBJ&>BjA0cnc1k76f=VO>C);%Lxztli^4TDyxux*PxdW2QIu zecaG44VZng#-~|&95kL`pM!J+?z+m*;h@gU<0z2kF$|<@un%p#J)SZtPO`MZQj?{l zR-1TZEp2+*gzfZ<p?;P|TYAe<=QSo?0Vs!K?5UvrNatDU?N(ZErLS6P+FFx#PmrcP z1f+Fvu9eQVVfR~l&C;Ki_IlQ&oe4U%t@wQ{NcR990S#k4@3+phbYIYEj28xJOAiH= zFl;19TlzN8=?uFcr25_mslRLjji&TRkZMVJ4znAE?Eq3O;pZ_MVc2mXS2IZOzyw~v zjDpfkkV;PnT~3?pKt1ROmx0s|I=+beOq6y3)sXgm2`8-B3P*y@Vc1lVO1}rG|7EPl z`77${3{rhlLE~t_Y>--TJ?Kn^-EG5GfyOiJWg8ZF88ZsC9;9jC0nMicU0=bzBdzKV z8pp6vptG6cOwh>;>;0<P#VH19$u9wE4J`!e$TegGR`0a_SddzO14w&b*VnOPrnEaq zrTc-j&rAoYmiZu^t^WzqImmHu;B+djIu)elsDIP6^qZjbD18s4E&aWf?(i0JqjV>b zN_&FTOO6Ijq4YQ_9r`xBge9+i$Hco9RK|G!2C0@UAdNTST@!B>sGRX?KpO7>D}53) zmC~oIbUkPq!#)6M*-m=T^qB^b&K?5qn_2j&py^C;Ht2lPBv3JJ?(#84TZUzWRNvvC z<5>4cfwb;l1j$1cINjD{tbZ1CA=ADAno0T+G>h~tNK4fJ3zK3PsFKnXK`K4RN~=Is zlwNG5_gLvV&_$HKWTl^5X`2|%;!xTFq?&U<+HMh$&bUtm)iB;j8}AYu??xN%0ZUJV zW;4Y)kZS%7q?&j9(rDh>QXkO8OmQSgQ;Yy<iitMfOiNdQE@6smK$_w?knV=2e}z*+ zl<or3HoD_$)4o~X7&>bc@?{%c2bx1V<a^^0qd?a&>^9I{r1wF(Rtx@URyH}7&azZv z=_O0wTDt5flXj`4_bs*k*+?rvcQfBBL3)LF5OgwqZ5c>?ZQ*9zePz7ee!(dzmiz#a zmb}xi7;`Aivvdqd?^&N_=?P0OTblHnx$8R<bQ<%m25G)!zndO9^$%m;Lm(Y#UI6K= z>N}9OW!pb-c8m6P1Zles0I75gC`##gD=i1jVOR}FOSA%{z4i-`&KL)7F>Ul9NNa5+ z=nUGt8l*PA5eT>=X0Mcho9`gdT;_2MNUfS`rI&&(qx5nseJC~Ho`_!$I+wM(1=N+} zeR0re9t*mhY0n0!=4qgL47(VlC7RhL;M_tjuYqnQeFVCn)Vp24^~7^P+HP|!-Dl}l zOPek2nr2cIf>iTKAl2NieZaYgdF%liOR4}ZA$<b6k@O45ZNUx!XFjd(2+|T|fv#ZK zz922pM9@g4eE_tG)YviLw%b1Gh9+8iz|z&*oAOS|2)KTKwWTL4ePXF+rYYqymd>$s zg{5Vd-nEprgDH8`(o>xR?zx9{odeFjwEhv$eWVMz1n?>i8QW)p)UW1)^jiBqNUzBg zb_zJxGsT5n1MagZFI)P-Qr^zS`hk|_gDRNE)gaB|PLSrY8Kil<uuH(Xi1A(lX}nKB z8gFiQ<ELMNs%cB<t^wytw$?1rNenw=_kjD%&kT^Z^rfH$jCVOmTlys{eHU~Ur5{@9 z9wC$VK+x5c_6BL%vp^Ryw*{a}Nion)>@%0_8E{53?3BF%&dsFtplPIT*@gyz)V|@M zMa-iZq<LHk(vjhPkfz;!?|{3jHqO#RAeDC9$IvLy9M<G$kk;gPAk|l}uZi~~NG(Xo z2{<>=f_5Oa;AoKU;VlGdyxTxGGu~Y`-d7;CVDJ4*yk4MN81FEU>O0*^&jsB|=@cuS z4?2xCbU$c5t$!G#*5~hUG!F#b#<WL+RP*&#dMD_1O7FAMr$Bl&eFvm7#veiFGq=<p zhI)Xsl=+}LsO1Qd=22{=V?m24J=;p>Tj{?+cT#$bm9DVTXFzvR`ka-10Xl`Y9M;pc z(M=$=<w4NhOtB24wyXhZ%j|f7NpS{9>u;f@4?r64PfOVc8qI@1Ix{-mQaR`z=5_%{ zbGr(pw%iQ5m(n||^f{2$<hz!-9Tae~*%zjR_90yi(mDD(&^2t|t3cYm2j`kRjs!i+ zJO+T&g1J`uFVH$lZ?w`+t@Jz4bCmvUrRfKo*54C!A?x`FP$}t5ke2O2(DO`N33BrV zy}+>RK{~!H1645X221UFnHCINngh~0_zbiU>maqa$t@G~A~kmbX>JQaH?UrA0BODS z%L_OwnA=m9?mHyl?u)(vQtQ6}y+nPRLF-8!4-GgklXeElQ>sDdV9=|iqd*%-WuVtc z=Y!Oig2MvtlTF8f4o#JFpi7PjIERrQ2IZ5MgZhvj2OUnT2lXYb2FW`@anc=h1nGIu zk)-t?c|thVi5zLlaXjdC+Hx{TZMnrtmw?`&^bspv2Re^6)Ckh{{SBn;yZ2E>b05%~ zOnW3qHID*m&#MAyit9kC<q1pgfHaTJVbiL`pi#{CBG4q#V$c*)VSm#rMuD^smRfof z^cHRT9Hf4=1*H9Bmwy<Wb3ku1-T@%Bc_rvE=CRqv8#W-|yu)}Wf;8S7&>i%q`5^VC z{R+&r_5zT4&LyA^nRX6H)4pP*AAmlh^b;%n1*El+F)-j1(6e_2&7f6-K&p8-=wqfW z2C3$;pidZ92GWu*25E{%K%Y|jC`ePRx6=1OpHcdem3{;IoMC^0RA1pBqwgfpMoLcw zslExICWc)A(i9(q)PhZ*FDU&Hq$yGc2b>tgb^vLL13;SMaL|{O9tF}AGpzJF&{ve+ z1Nxe@7W572Ezl-XY9!!%OG*Q&mc2mgO=Cf)vUWcNolhD(#8^-a`i^Nwfi&%%R{ALD zdrDVY>ETBkpS&5Q<#-761LG|Rsg~d|M%o4RBc<IyDm@9L9(xH$d%!~=wfRMmYJLaw z6Vo<=H0?fxrbOp~G~P_m&x}_M(s(OC+Iu$HczX>s*R5Wl%}j9^NK*_0slL-dzfgLH zm0oV8*Mokg^d>8P0Hh^qu=ED#G}d_9u~<#8M{Nhv9u)%V{PYTt=KCN>ud7dkeq$c% zKx*GNHs0@`-zg0oXQT&#R7*e5AC&gD(rPQc5u|zC2l|uo9<uRHEizgz0BO8B&=$tK z45YR^VB@`D<Gl-V+R3%zLmO|qe+Jxr$1^}`UnNL2Uv23wP=IOg2WcL!fHcL|HePU; zNt*>qVTxTrnqm%U1Z(^qOFw{AOWJUgwks%=X}g0o?HeGC_dO^`>1HdP0<|i=6r|SQ z0BXZ{H-l8m`!?Q>HeT@ffYX-o+JiLS?jY577)bREu`~+QjwwciG{sY(6Iiw|{wQ67 zKdNN`D2*wu1!;;ut+XQo+EbbdQt2A}(X^j|)Pf&D9T@Ld5dMd@ytdfXX?qM{I+hH< zrtQ8Qy^qI5P<{Mdki7aP=u82rkG~DlJiZ5Yq~^^a)x2z^k*)@%Q~E4OrH!~mq6(pJ zM`Ws6dV$o^{-EucVh~7EybnSpA;rNkNhwegaL=j@2dS1xpj@Uc18LfYR(c!gU`p?@ z(t0a>0o04qSFCiq(~ahyAhoYAs5j$<L7GR6jdzQU_aG>b@s`<mFW7i*gASqe11tR! zbST4q1L-xT`)FgqexSoBJrJb%jsZQ%dU;afk#-nksAO!w-OXD8YM?Z0oN3jepal$@ z1o{`L2DFkbT?f*ZK7M?_d4^#pgEZ`=vy7jfeYR<jn<fODr>Uh8w3@WTL=!gHQq!b> zvxd@+rG~nLpa|_-33`@vB}iNP2OE}ko(X#%1gAiXUXx8JM}Xd=r6+;Z(mK$KjQ5tM zO(4zVHxRlKwDg%`;$3TL9Z2K72GV%9mSJy%t?&>?+vsP|RED)JH(@<N(-_v*h8;20 z`29VW=1ntU$KsMUg0?(tX-%b>alZ&E;Jo+)&^wIxGw5AXdR4&rfV2nbebS+z_ejTp z8c8Lf4@u>qk4UwkA=EqvG>9}0bTnxJC_-8Y8cez#G?26ibPVZMP$B8j>VUJBnmg1O z8Za9(GKNh6Z6sBKJ|*35r7v3P$Dq$B{R#9Msr|)R2av*`H%P-lZ;>tpy-B(Z^fu|Z zO9BpD742IG%4#EY8AyHO>dP>XU>n^A(zg5%bS6^_xZJeIv-2>&V!Ss&8t=yW0p|jS z-3QXJe_mmH@(B<oOvo*GWxyHEeA|OG-|?UenRXgT(`GHe3X);_f;8+j(DBsrCTIqw zpIhlUR|TAz466WXiu|jMZ%n)<;LM`*LXb*#Scul5zB!;uO0NT{^qFe|P8Gvm18LY3 z7#4;w#hKS(cZ<@gAeFuY>YO5_eDiuk=iPvPIL504X}nJV4mdRo+XJLwwV>GyyT*on z4a%av18+1`0=k&-CV@0<zeNG(5{4ZE(y)s`wG6w;hGpDjtSSK2Q92x?DeeYc%CJXm z*!eeO{mb&MxFz63DP0TF6zAS*q}8A~lwJW+X@}df%g(T!K^pc6NcH94fn9b=2ZK~P z3UoQcCfcwipm_{iX~Sw3WABS$SAsO{H=rvR_NNWI@lI3T4WKJ2{TQSv&btfaJ;N$N zZrI(}<<u~chP@7Ym31)Y9_(^bIvJ$W0rz5`hGD}%8g>UrQw+W@;4Gx{1dvL1xgV=1 z>iYuJM2alIikU4v38Z0bZP;5jY^Mi|^lFf5S!%-$eb9u3L8@iq!=}#+dL-anOIwZy zsVz@{bWHpTq+{o<OU>vw6r`i*4AA?u^j?sTwlUBr3~Rg0jH1VYG;AD5$J1v)|6;yx zf;8XlS767VVY`Af?8Zm2d(N=?KpM8<abx`_mNK3&Va1^J97{%lbS(K5bOW`tf6{1q z4WxB-`AS3Ag0zP6>I2TdnPLD)^X=S#J0T3)3#4Jcf)=UfRVHi$=q84JY{Pzi3cJ4= zZ?%bc8t4{=oomA;J&pZchRp<N9^Kbs-<DxLKpM6fbUVYA*|6X`>{~EwN07!F@f>zs z88!x_VN0IJJ}bjkf;4Q-3uYW&Y3WT+j5YZlNNe(qm#_=Vw4Z@A?f&Zn&T;h9$3b^f z`W#55?OzT!MU<Wj`jPs^fK*@pE7&z<ioqaF5e2Efx6olU?WdqWnDz^hrY**xaWB)J z3DUH8gEZ|6ubH%Of!c8W_C83{Uh_Kc<1p>*AWi!&XbpWg_=ce=p!*r`B9O)#j0>n* zb*7~Q-@*!)@s0p#yi?F69$?tnAPsvN-RVJwHG(wk;P*^!Cs`VVF7^=P9S_oYuQVDT z|HD$whbC+gI+pgq*FO$8omk#?Kw93b(E%T(zS}^m@BU9szL}pHx@x1*5<^FLgeiUn zX^Ls+FiRPBF-XIn{xaY!W7r0ehV}Z|c+(I|<1Njyw8>J3Z%m3Fmik-zd{e;Lg(dnD zq$Qg6E!JCV3rO=_^Bwkl8TL9z!z#ZIIFB;ya*&2S_oJz`%%2Pm{~5c3j5ivj@ow5| zr0-a&{>50D@oT`@i&k|8sZ|$(9;cQ|L8@iqpJrY>A9OrDY;qvQDPgZz3_6YUvJLy) z(m^RH&VkG$52Sgl1wFw$-T-MH?b@U`Pcm#LkcO=Vt<-onY;4;Ur=DSDAdPoehZLuQ zVS_*#w!UMEvx;FKfHZ7&dWw6Uz7g~krT2kU+6X$1WgEI(io4Pr2YQ?FCV)<)bP;Gg z%ex-bjjQO7K|?7GZJ*-qf)#<zXV_fOG|~g0GSZ0|DbCr{axF;jf-VIWQo1EG#o3#h z^L9vaCNSPHAPxJ>(jlEpSdFE3K!aK1jiAX)`#nhas*c(*#W{;%CxCQ4JrVQ{OL-nh zOF0`fk@2p#@$Lk@tF>n1{Q^?!Psb!tPYx^v4QDw%1ii-;F;Ef1+H?WYz78O@uRBQX zn+d98yjwx1kv_1r(@rVwJ4bthR9bB5!mcLl4ok0E+G6PtOg}Y`2xu1bm<FmPJ+?FI zg_PRO&@q;-u=FXYlJPq2f;wPpm4oIo>@rXl=^oG|*5nhQVwQXrNJ~C$(z#^^jGHw1 zoYTvo0cZRsmyaEBe(6~Lz<<supICO*0q2}PrEKivDe`-4+2pgvOgUic>66boz3i+> z=Sm>{l_6aj(j74N+%wNQcdS!ZcEFhv&mZTMPM(CXH<X<<HX)v-!r8vi@DoN1=zq%j zqcp_)p6>qc6B=IRjbMMf5%7CZf?R*c<w#$6N=1b#gns_+5!a9SJ~@9I`5_X2&~OKT z2g%>wp}|Ebz*PJlB!3TO{tRLP4hanzK5)PYCoeR7SWzzCmL`93tdf6w@$boQ_{nbg z$wel7INqri8eVwZaYfKSY{Xz_%){RZpm%8a&;tG*SU7y3gdaV$Xc+S!fbtJv=J*fN z4?ht<5r6oJ_}x2HaC{N}7D21X2NVwMKTPa7u|EP12^9=18WBM`1`Ij2U|=z#@ZX`K zp}ybwq5g$K1|M5A0yfIO!$L!j9e!GNuY7Rt(D5TgxBSZwiTMNi7Z!?*=I@|_frI4t zz+(&WSN=hNLI0vt+*ZId<NAB@xo2q5p`jti7g?{6`10F$1^p&cbjsw?UakhTD}NvC z`8^;(F2B9<lN03f+sILmk)k2RPOs1q7VZDA_df7(Rb~GFEh!M7Kqv(Z6d0j}0;Syf zKU0b%Bu!FC(;-R!V2eqbnKT2FWSC6a6uUZN*X?R$16H?6bt7A~YSoBUt5ytb#UfRM zR4HrK=vJv(C1O{rR{4IO=iYnnc}_rGt^57{UcU}B^SSTmIp;j*+;h)8_wU35i<%cU z`2knC%Z0qnCB~ihX(DG@XEn6)@S%1z>PgF5JsVR?n(J?Iyvd)JY1N_ZW!&1KK$F|* zw7!;MeW$1ld{aBrRj=siFBDY0vD{n8uEsLfaW%Rue-db4>4#<4j~t?bMXA(+MOc@M zQj{bXsBKu7THMHq@h9#q*Sf2Z`^_y&>JTHny@ASVXjyPO#a!nu*SX6?sgE?W2nQC| zxczwP0_2YN<t)R21uVjWsz$Ph0*leRIo)E)FphrO&{9R44DxEOp$4OGiWO-%Pb@ES zc+Em*8(p*n-H`0JIDU-_+|`2kYtd1gkZ<*Zg$)ZEJ)Q_OEnd=Cv!YJ5r?Y&EvAoP( zj=TQuBKmQo$UrT-8K`A9gM{brX5g&fT2)^R4gB%yAC}A2)E@M4?bU{Vwdap<isN#; zdHab(U4pTsi5i)|c{^=d?5${bJC9SlqR%a%K?&bAJUD@2JE>}{TZZ*jRYiF_{U*hI zfR+>7Z<^}7o|N>K-2&YF6JDI&a)c7&gYCMys<FDIiB=>&RaocxfR6FsS#}5Pc%W`U z%fiOm#qf;;7P{k3(_$Kr(6_5-fW!AfuVXv;x7?A!m`a}njcYA_d0sqTzjv3Dw&QM9 zQ+Z3Pnif{IETlSe`88E7+!*lj{Ehl0z503fsGFa+95a^V#xjk&^zr<Y&Z1g2%cu26 zAJ4zqSyaok&C$oRyUn4Njrv!4^>_WN{C>#$g(|-vI?G1=tBm?r8TGF+>R)Blzsjh8 zl~I4EGy3(ZGU{Jt)W6E8f0a@HDzE;D01wwIoKc_pi?i(QH@szkzvS4%YW#4PBgS&n zSdJOXak0G2D1X@sS^lyWvixN$WckZh$nux1kmWC1A<JL3!Yd#9!5Zuaz2Oo4gO|PG z(OdS0N8109zZ*TZ7cUpQ47_D818>>Oz|G&=y?N=ojr83{`fekAw-*4-GZ0U=7l2w; z<FjjbGjQYS_5yI1^G5l3qx`&4e%>fQZ<L=e$nx_AS$^It-;Fo#HGo<+(t8cy#p^Wy z<}FnJyw?E!vXg<o>;$0lcLTusplOg-eOlkN>{Z`e_Nq_oU!OM7`lDs9`fAzBz_WW9 zxcPh4_x!!;t7Rj-SA8!Yulh94r1HJ$`^#<y%I>$n<FB?qPOq<jvg_-gmyP)K_0M*% z0o?NR_3zka`TF{2yVn3-dT#?z%SL*y0kD3Z^lkwDveN+mvXg<z4{M+g<7u`B2ZH%R z27j+#gF`|b0a|B*7mKa#q29XIzD#jmpgY^wm+e^{@MxfIR^QcUTGjJbrV71xWjcy| zE35MPT(-kGid<PNtjT89uFMP|=brZ5%FaTD4=7jm6*^#ajxJXgi|IlZ<<9Lune=(N zc!=xqto~n&=S0`<WPX2J|2UED*Voxoq`pO;K%hOnroE>l6Ih!~7rO$p=|oDPzb9Ml zyJlWsR+_d6`UC>GOlL9BmrZ8^t1>ugf=%M(d;@_M=+;GS4!MAPj>X%A<^(!=yYu}; zO1h>!*PrRT^GvP$u1t1ySMg;t<?@TY`9EJg$4Y<x=Jr~h>upb~%@c868R+dq4SI^b z{e?c&G=adtqHGTqBe^u`_5nxx?Y2&{uX`Cg=bP`v0O03J?Y*$455q+VpPNF(@690N zelJ_ArKPn20k$@0yYsnBYh7+#zH43}GtiO2aJ42A$oi=fbbn7#rF5F;M7Ph0&ab_% zkGfHBPoT3so6DpFP&u5CLzkrW&<Pfp)#q30M3*0+f~ddt_GEgBen|m*`ubPloM65S zF7vzyhz9}=&i14;)D39kVT_17d1o?k)2#HIz&iYu>2TJvql@=4Za-Mn-j`ut6@r__ z$*&Ka7u-=sr<;+%QBWrr^h$Qufxb8gC%yVRfEXzQ`eOTuZr>A~-^*+-ftv!ey1Xq0 z+Y9#Bv~{#r(^~Dz7S&c$?ClM7xA&~mH=4e{Y$U!WfK$ruT3wsP@R-ACVSH&DqC4W8 z`1<r@`go|!W!7YJZg0ZV?zGW+(}-5?Z<wRB4{)WZtJY-l2oSw3Q0#TOAV=8K8)$=f z=hcB?`zmZZtNM$9p5C78@68lo$@O-$UmZZ|!aBD<o#^^_<JE-5&-Qd?vA4+t3K^XK zqj^{$jagYoF{8E-s=$ek=S1g+c^a*nOre!(GmplIe0Cs{3t+S6)!5P1-m^M02i3ej zGk~fxY{LvR@2(QJ;obgZ=C``gzK*u~%wL)FE9dt=3(#ASb<Pe)8}PKw_WyzP)lyhT z<1MxkT5Y&^Q|D~v-dbqx@1Vh=vp<(x$1d0f=}xuIUg;InpXmPO?{)fUT<fRFlrt6K zVGes0XA0phb>`Yvlczl}Yi@Xe=2`B3batjtz?jz2i-{bJ1J^h;?ku*hX)m-EGVSSn zd&k|Gv^OK^>F-{ZDbPOGEr3SLTzg@4h7(Rmm(Jvh?U>2<>H4~Q3q@?y#L?h-YP<=< zEO%o1RqHT1yh8H7B>l@KedTg{ix>!d`&W0lWu9qO;k;<T-7d3z-gMS!w^iso&WP$B zMY<h`2Lp^?ZaF+`x1)vihG`$j^kJV9Xd}bbf%cwspskZ6@=$wXC7e>)3uudMXJ@8> z(VG3*2N08*iI97Ddp=K{d)C}&C+`LD?S@6ileC^W9*nx(wB%d>ZS5=e7BI=A8nL8( zA0{TwcKx^a=K+-D&!_)<9NvL9lGU^q+r0|7>*0St9=}6->y6qEM>1~vIgRFpsaD%7 z3V(IG9mrg@ZcUx9|NZ)^S&?7ELS{AXpSdS$b8m|9M90UykOvMvdO;@)VAOI0@Q~No ze~0q3Js4m6vbbFUhr>>>)pQs|fnbw$JLQU5X&l4;z3T7QmJcVKt&ofQyOhU+WHV-s zv<Gna6?6UK{x0hm<CGX<wBr6Q<?;OX6-qqO{Z}8~xNYfdBIbrTGHi9n=XvNzI1iFd zYx_!ey`E<8&RTa}jg1Wrb)w_#?Z^4bg%sY3S-JF`ftxVNz$S;I1nl_>G<DTBw!cI9 z*`A*NYvnI>_wV)pll{E0L7wRK;msc?Hrg&IHu|P>*Yr^**__j67KX~~y_gZ=v>Ttu zbG-0A_CDua8?DXu^j-ZJ(9(fb>u8Zq^1(cNRv+eoi`=^Z+4+rI@4r`l_4!gaM%j6R zg{yl|H%w>xd+zS(T}!*4)i?>?;rvH)C2AAZE_7ls;8{^Qub$VuQuV3k&Lp_bZ3Ak% zKidv+b2#DKquvgyxg93XKibIP&Ko;OBBqJcjhCM{p6K;AG2V%T8&0XNLjUaO?JcCU zJ?+JeHmv>Mi3ca~+!#)D`QG+R{W6O`nA}mfvYd5U?85vV=Pzk9?CXM!&NX_iGOG_~ z6(_c*bEu8g>`d1KX-taU6N{8h4~|>9d-1ooC)@E?q&J58|M$yx+pXA-^WXBI4A&q6 z)Yg3bgKwImd7CS3AMO#8*5rJs#OHFI?T0hf?HCT|Oxc`3mPRA&3mres$zO8;<%R>O zJQw*2`Eh8SxX2Q~U8S8k+m&-qy!|PE<W48}GwBQt_uUfylt1OK*E@ho1@`jYnKZgk zCg4<(_w9i@DWDta&kCx<gkmhGoWCf&UM#1>;V4d`bhdZk0F!d3V!XKAepc*lMZ0!m zHgs<$Jr5`Qk)WTiyLM&^eLU;NJOtg`Z)~S(6c-MDRh}=OUpmu=6{jUu{!YEjzX(#_ z9s(;=^W1r3pd;7bO~=<<1+N}{^f+x`6xN3;W;mA41h^q+SLPn^(<ba*K|n3IRs8s! zZ2l*0L4E#Z3UBYkO2@puyLXLVHjZs@UIxc=ZohZRuYHAiz~5_pq_L6ism7}Hhqm?s zb-@LFHa&pVLpy!`bmRPLcYinQbf&W%_jNlQ+oHqy)R(tj0<+!y&>WmL>7!HM>1(K+ z(B5HOu%nClkU<-bKk*yq$Lz>*j)n50v7AQQc5Fe|l=_Nv-PDbAE=FF2V|m|KQz7`^ zynCvdlQ_%n!n{D6^Jez`9?s69zXStD_SEMwL!<xZV245f@ni+(Ve4=}v1n22Qko=H zrLjj{jjrc3h!-54{gL6)R<n$+wBnnt_&Q-(i}QTVwi(->)tqbR3&aaCo6Nd5D4;wX z9a4F>;2OwZzKNRY)Ox`V%iG>xW{YvR3THl}j~8Zse=-}jmA}lqXu>9beelMhdoYhS zIg$OH>g=ztzpDMPl3QzdT=^dk2yT06>76xze)bo&zZ<uf{x2V#tKG4LO2qLnb^sYV z-MFr`V-2p5V9UVPh;yEO`AkQ)GwWRM@%qQh`nMrrKwd7vYIIK&Iw}9$`Phm1dh=A= zhOQ4m1zd0mbm3%3ra(EL$o@d%h&LysdHcM8J|E=WGS30whVj7JO?xMJUpaoqk53yQ z;1d}y#WAs5tUu@Mg;TJ$V-Dbab~Z<2t+zH$d^|Mf(;9P5?yKPf?L{A+5p)Kwe~r38 z?r>c3bYr6Bzc&4e?hn+y*v_zxt!t%w$<{fyb6|saFQrgRi)p`qRoc6g;7_IZdboK6 z(Qfo{io^Sy$o`}E_ld_pf4aZ_CH0a$->JcgjGuC({=yf)j2=ha>2I^?hKX67*HEwX zw0E2!``zD~&k5;&JeAL@3o`%f_uHH-AG7k4?eE?H`ZsT{Mt?e)-~aG_)06G@x82Wu zvi(lBAFdex#rOZ8>@O$#%gO%o%FoA~+&)fjA1AkuliP>$@LUnMON-;Blk@wN^ZP&f zeC5gha&rH1a{qC1|8a8v!6(E|?k`X7FHi0-y$2`p{)LnCga2R64{#l^slNx$)Xxhv zWpIBzKYr=oQd?Y`&GG98oQK@J>vnu`ud~qGO}F9TUK(7d$4!>FlM7Et^!4`eleGLQ zg8*)t=ZoE1IStwFEEiMkrQ5Ro!g9U6d4BNAd&M9>q~&Drm!w~X2lUpq7t(>d`n!=4 z;&Mt41aN<n9m9(V@QsVES7PL!b#0$TX4(n(SL08>_4t$9&;PUA4_$A^HEHw%?JW?v z+1PpR*tyT<M9&8Tffj5VPN(3v>R=No_7{3^r=0V^DLre74oG*S;R%Ie7u{cpdr#B7 z-PwD2*G#wg;XY3Hj@3>)Y=tKl`U33%dQt1$xPO#hOoAsD=%(4u_U<h15Or>v<0OCD zANLL2(3xM|eFHsj?L5C0=;+FH+}+pT?Q9j^eS0k}wE^eVJZD<^ds4jnU!14AJKB5b ze(QFAMmW$$j#pz~NcXE-UjF9x?Ok<OAFj^RHccP8Uke2WC_ZWlZ(EjeEvEZsX^?7j z>vOgH@`5gE$sW3?m0qGTSB!5M<oqF#o-yZPjqakPp{2G8?`cH><8z|wx4?fEo>q{1 zbC+M9d(SexsmbXj?qkgSHU{HSW(v}|i;G?^<J=R3?I29I2Y1pv8Mt%OtB6*v_6+{t zQ10LQJ}7s6H{eYS&MRMJga6I#ou?-f)a@RY^HhlWG&Y`3;1`=X4_M;HI({+9tMT$5 zgoRej;l^{kY$DH+o6>ovi0(bb{tb^6d(nG4C28l}wLO;eJ_{O=ync*#T&Y}eU!3=} zxc8vLY`P^kksF{FbI<_c-w5SAFNfEwIBOW4`ei=OeeD!2Z6tK_A?_*{@5N9Bcpb%E z4Sy~^dO;7m7{*+BT)pqFj1TkE9%?}ZhzGA<DMqJlor1hD|6F{|8)yQmdjA{kN86&; zi_QBqz2{?UX;jY_dhvdXZgPHkKipUq40&zKRZh`B{#T@{Pj?ScIXr&!_h|FDS^d~$ zb>JbKK77-Q-FQdIeh%lCFi}V3=jXg=bZ6u{tAAituHSuQ#F^G4yh#7drqlA1Y`o(B z!3*<~@KW@P9=RaTyZ}!2sqQ!V;l=jnJa}e)(z#{Ux%ZuwKeNrUSg&&RS!LE)_nn?U zjX0&%^EeGZua|du2zlX^^5-|5o1cVNvQH09bMg)$?*P(0qLn$f%(~!*=jAIX&x$gu z;)*Hxvq)1}x431UU1ps<X_}M2R}SUdgna3{FfD&k{bcLXNh_=i^A{ksW$ir$d0cmj zHT6aObQ#4`KrCK+czo6=*0~SD?tNcZW=)+m)jG?o2ek>M4I!=mO?ll=W?eYxLhD@k zUW8x9ojR$B(^1(Qscf&zYs;+j5c`>wCw>~>+$NN#;-GYMo$~B5>s6ByRt5R#Wl`B& z|LIQsx!jAn+)0sBtV>=*-SJyrGmy^(NK2otNm^N6nY8YwYU`esAH*_V=|8Pd;j|;Q zXQa%!WYTnN8pYxD2Wp>35Vx0x@+@GP>vl2M?V{u<)_E^dEiG#R|9HJneqLR@@2hBC zUgp#VKe%xAi)iBu@PmC+9`(D2-M+?t?mCZB{iZuUH{dn>FS_e;D$-JnQ_sv_R7-Kc zj^m~n4r3i$bkk(C??q@|>dBThjDJpBO;c?(2sY_b>O1Fi-{E*e$k!{!`_|*(dQWxM zDfPc^y8Rn*OkzKGT~Rw>eP4v%TK4KpaU7;HsV$q({(5^;UXOU|V4AZID37UV>pA#g zh6m5jPr?r%@VB=vs0~ABIJ^M6*UsK{Ld#U2Gx4L6)W+0aP1<&7_BDOE3GM9VL!6fJ zg9#Tug0Y0YX-v5gKS@mazS1|Pn~HRQ?YFyrxt~r&Kh@(4A>VWHvwKv&_f7SsesMLn z{lYo0qy0i?KkwVC&nfufQcCA7d+E-?Ph=AJmjBXkcU_BZoZ>Lkd*ylGUR>ly>&fG< z^zD`7ZIj-z`R&!u%hxN%`!@48(|d7yT+fHLeOhipyk0q;pO?S>{h;PgoYK=baecYT zU4FT5ufKWa>iLJ<{Hgtj>*>Aq`PY7X<(Tc|)!WPWmHf<f=CYSg|1N0lFdOyxrn~$I zzG)x1%H2o)C7SZ}@|%kEUc7ocHfiO>Xe>O>84JB}na4DD%;tS$z}ZGvU*>2k=RqwW zy<93^ug5pB?3J(Yb14nQ!sShM_7NVVv2iNKMsJL~%H4OE<<Rm}Hx4S-Yi}yA;BJr9 zZ@u!p@sQGmUSX^zU-T_!9CzZPalAz1xR>vBw68gj_cdM{AA`Lg`=K)axgbX!#lG2P zusG_NQd7!27Eo%lQk7?T)|E=32<vj>>3#4UY3lPYla=J3B=VMC>j`|@nyyD2-sfSI z>V4j-<$0B+@q2da<Gs3`z*I#oYo@0Epy>^oUZ?3(wLIUe=@G3ipVRyoXg;Y|`G(cL zv_7Hf%d|Q^dzNo_RLj3j)AhcKb&r;oeg?_===uyTEu9MUKF@ms-#2LbJz72=(9&Ld zf$yaIpxdjD^H9IDxJ*&}yu*3^!Yvp1S}#}E)3kD{y<<8g`-R3|INi_ZU0TcqA6viB z^bW26T%`GbT=ThC)A$WG_4$fYmi2y(>;3Ixn$P<*pC>fEMe~`h=~Y@Aegj*Q_jy{= z&w3EwAJ*#f>r;Khe`q|SwN<qi!%E-X`s4Zj!s(iSP>bgpt)0D}bD&hGXl2ol3wxh$ zYVjP`_)oMvXKHyqs`=0NGQs!t+Ik<?Vyi6ooyN5MFVgbV^PwL`^FDL682&@!M?437 ze@o*BH9k$#*K7K6P2ZyFu$E7q#+PeaANSs<@lH)&s^x=28uiip_7jR))~7YCj}^CS ze2u36QPUeWeV?XvA6-w@V#9P>eabccWlh&856jZ^)f(4zQLFDmnveH0B80LUzfRLy zm$CG9w?gx|O4E0oAbq!%&t00<w>w?y>*z+!|23N4r0GUY>-}x6#`XTG?@#r<@r<@! z-lwJAq3NBP*4s0zalPG|HJ*9}{VJ{8&uTt;9p9mG`td~XgQ=qW=<8jNtw-}oC~y2k ziKeTye)TJj;}BMTp3(H1HT{C}u&iHddY`7hrs+B@o;@00r|Aw&>+5S!<NCfyA5V0x z_y1SY*JydZlCIKx^leAidYkKI<+QZdo*=EyC3GFq+IF6%S8Mx)u(s}=(&Ewe(;B~7 z%jdr}jbGGOpIel&EPXCirTOR@Q+oC3)_m}*t?IK@^ZA*^Kc?}UG+n9rRB1e_?N1-p zG=8mCeX<(w)HwYtulM;+PvHAWO^<11-J`Yhiy9AUx>D0ewR|qs^iC}Xeaz9v&o62I z4`_N&i$PCIKfmgIMl}75)^TTf4)~@Y>@2g$=qQ?I+=;x)tSL|>wpJ)bTSA(x)1l76 zKb#R%Dgf2V)|pV};$N9HTd6rvU2LUoo$@TRB1+LXbr)ObL(#;!%&JtX1}eu^+Hbsx zqiRqp1=YjW7O4B!x?CyR>*U$m2K8pPrj_b~DzKHdU^-$dv+_z6p^9uBfZD)m*DF<m zTEo^2Q0L=cnYB@=O;7`D9fYEmE3-B$wFT;4wr+)@gN!n3NU3d5>)E;;>L0n>9ZC&D zy@9Peq29vQT}thSDzSA0>Yv!UN2$F~_px;!)a%hp%dAnQ_LCo54?xk+x|Uf7l^P?( z)<aNqG+M^zP#tvy?0&Y6L%ofyN0mATMSZr+Iu5motrq?|ie^*~vX$mg(^ySWssf6R zzRRp>Q1|0snKfOh8Bp(HYXItB*g8|G*-%^9ItOZyt+rATsQ0in0rdb|=POkS^&z&_ zKt0ITdZikmKEc)$)T>adGOI<Y<xrnw>q@A1;9r^5rc@g0Q*7;m+RWCRQhBJ)v9$>G zPPPsxwI1qGww9pi7_f|crlU4unU06bxMly9tyF7AQAtm-bqf^zE3>vLH3an(Tem^I zo2}cG+5z=7whlv0=lbqcY8TWu*t#2v4tC3|5vBG(J<Zm=P?xZEpHibx-)8H6s2OZM zpwvOAAF_1}ipI|}>yT21p?<{HBT$#IbzG^VP(NeqF(^7_LH|?ALht`MTPH&W*jla> ze!<#$fvx!cXx`tU|0#vjU)FEfIs@t<<XL9nlA5b#Lj94gINfHwnsdg516ScPphZJ2 z#y_Yl*qTskKGZ2}rG3biY^_m>&J9gwYXj6wwx*P7fub`XW!7>in&+2UE0t=4I)|-k zC_3UO;~(F4R1WL{w&tN`vz3lS95nznovrJkXa-egm6X~5bun8vLecyO{ZFYus2ObC z3`Mi1GHZ)cTcIvv>k!l&wr*2uJ5+$JJD_NWUuF#}wG-+Jw(f$Wb17xkZly+`X0mk; zl+D(?O6`N1!`4x#AY1n<bpUEETMt5o*gB@vA*e8050hf+5v9hVqHH}1bqiaMDRmqw z&Q=6#{X6%Z$x4+&-ON@x2T9u@&NC}TBV!F)r$c>!tuvGgK-IBzCe#PnI$NnZPz%{= zL(#kr{ZA=e8nbR=>wGBM>aqV-iq3ST*jf+uVYW6Xm4a$wYYWsz*t%S)l~65gZG-wK zTWJpAD4G#0Wh?F9X^g@CSE(Y@3bqbFeT=QNUvyLns*SB1pgzvljY@5T%CL11>Jx0; ztkf2$)ok4gMI##aze;U`%CdDk)F;`xL#bh?HEi7p^$1&cDYYBwAJ{qq^(nUQQED&L zo7uV#ipEduf0fz~^%k}sfci9B4=ObVwUModpgzOa!%7{2dOKUkp+3vjqe>lvdXTNh zp=h+m7nU7GBgz)GmgDc|*g8e23aIz7mCjIpo~<+%IEuFHA-2+X`USSqR_CbMP!F?} zwl&%}lv%b?bhd6gTNC(8=M~GW`AStneT1#l=O1Njy;2QOpJXfb%rCK(`kAAaL+xbi zO8lig5%#}IrJ+8@)-L>gjIBAP@=#x3YY~4RXX}7c>!C*2TEbsCpN9RfQX8QjXX_^X zrTt!+HK^2PsIRbf3;xnMBJ6*a8iIO~t=sUI&Y+fY>o{r$*i&pB#^0~7m1^jyT~J?R z>u&s|y)5>>O6`IA23z;y?~`oZr_?Ca(`?<3zh7nR0i_N?(a}ShHHN=WvGtHrhoQd3 z)+6{!`}8tvT&bf_&$9Ix{?auO?0=QAa6I-LTPH((ovr0cO@aCzTPvWx!PaR?O^2d* zaQp#9GYIT|m6{3lL$=O_dYY|sl(M0y1{nXKzRA{vQuCpH%+^XMI$u;~)hJaDMRhK- z8lY&tQf8%;YJvJGTbD!8IaTa`m1={cRw}d7P~T>2mr^+>I@6Ew59(RA7L^)+qINB_ z)<e<k2>V~9HbA||){Rilv2~MDgHW_4aQp%FpKRTt)K;ipvvmmSJ8a#i)OILZcV*TN zD4L65|EttasNb=57u0vzx?8CcC|cWP)*h(uv30Lf`=I{F)={YMvvt2x2cRtc!|@0H z(##M2PpLytr?B-f{{DciN0b_en#|Ut`1?b)9#iT#)M;$BPP454V(Vn3%Av~HIt7a6 znb`j-H4W-awoZro5nE>{6@Z$;)|pU0X6tOF=0KgpRvYShwnmgnKvl4HJ`~MrvHw-7 z25Kr>>!IkJ2Kt{;DX3{|ZGrkJTbC=f66zwhwn6=jt!bsYpe|u+4vOZ`=zmHTp)O_X z0MyUfx?ZUg)a7j50QC#DZd7U$)T`M#2=xM6H!HOT>Poh5g`ycd_P<JPgPO(G?NGmD z>kg%cp{{1@PN)~zx=X3uP}i_^1nO68-J{fAsO#9e4~mWtu>VzRKh*VXJpe`L!O;Jd z8iTrlt%sm~&DO(89f1n6bsXw9Y(1*fF{m(Gk3-SX2=>1?@8qb-P;>^X%qoZaEnBB3 zRRI-e>olm}v30sqGoX@e4M6>#t#qZyQL~|LWa}I#I`+Z-SE&fpO>9j-{ei9Xm8yig znXNTYe`IUDQVmd5Y)wJE#MTz2mP1vubtROAIWP9VN~NI|u(b<n5?gah<)P}>T7)`< ztpiG}hg!(i5>y#mHz>6c>Nd7+f||_ML8UfBEn@2ys8iXxRjDDU#cbUMbsAf@E42fv zg{{L-r?YjZQoEp*vUN99Ia^1R+5@$mt$U%)VCz1mMxkEI*8NbpkpXRWK&gXJE7>{* zbrxF>DRmg?b!<HXHHEF?N*#r2W9u;}+@gk@k1J)BTh=PJPKKhhwdj9JO@T_YwE_ya zWxzU3sp(LiY@GpB!PbCMGoiZJIveUdw$4$?hPsQb5vZwbO(-=VD#up3=84<PP;QM< z^-w)*ZGf7_)|65$P<gg4hq{2RE0t=4DzG&Tbs<~3l*&OB*_wyK?R_Y>sMG+|8n&*7 zn$FgeQX8NK*t!vluBYJmSE)g$d)c}f3O7)}x<#q2Q0v(`1a%2pw<)z9>J4n&0X2iI z!%FRhDzSAJ)TM0Qt<(tAeQezWMR#13S$mb*2epB%qfnQ#b-z*vpx(mPgHQpsjwy8r zY9m_@L%o`<N0b_edMjIxLS4buV@e%|+Qe4t4D18gI$5c5sQcME1!^W+E0mfBHOSWK zP`LFDHJYJR0O~=u&V-^nG;sb|sX0)a*=j@KwnSJXN+qD)#n$;yv)M}b`8cWuY71NI zp{`+TgHkD|_pr4E>RPrgSBmZt+RD~8DBSXla??t6LA{TyIjA{o%_~)e8e;1J)b(s# zuT%+&u65w}1B$Nl<NUKyo1nI_br9+Xwr*Bx3)BbMx)sW1>yT30ptiGhI~3g)f%%_O z!%!b#>rN=T>QQFxQffEU4z`X!(RC=y|CHJb^>McDgNm?qRH^+?!)!eO6=mx|rN*Eh zVe28N7+Vi3bp&cBTgRc|Y(1*fF{sb5^*B_5t@Ip_qb5V`Vrw}R-EV;FA4*j~eV(n; zpysi4x>7TscC$4Abt7A6Dm5F5?)50M=$VxHY_*k&K#j090Y%rjaQv%OCDh|=t$}(C zTkDl-fZD^>6x7XZZBc4D)Dvu73029~Hl^^ajkTApT~Kr#t<1_PML$~cRkqR-X1B1F z9@}%&dZ>MDEkRYYb%RnHp`K>zCa4;=4l1=7>KV3ffm*=Utx63+eT%KzplaE=U8x;V z&$4wGs*bHYmD&aM99wro)w6X(sXb8NVe4L~g>2oY)F{+<*}5O<R<<5c>LAqj**XSw z8(R-4br|XgY&`<iz}9i4jzawxTaQ64V(W3Gtg~<o!Pd!8jchGfY6{fzY^{J=%+_g2 zO@}(d))`PKwg!}%3H1xM&W5_3t#g#Jp?=NQ2vieW6H3j8`XgH_p_<uRqf|ZAX_&#{ z_yekittq8ipvu|09BK($S1Q#8btYTWP)pg`rBn`T3S09~%h*~}Y5?jSwyuX-&eoDr z8=%f->qe+M*t$unL8uGZx*6)VY~7;NR;X98bqHz&Tem5-9cl(!cR;OV>#$Ngp)O<V zE~q=%x?8CcsF`ft1NAz#?p10Z)KzR9g=%H%ex(jT&1UOCs5Z8aDRl_yTDBgBYG>;a zrN*IdVCzw+Rct+`)N!aFTj>&S2U{mARSp$q>lCOoTPu{B1{G!Nbf^qlXDAhbinDbl zR3}?!D>Vly$yOU`HCrP}C7^C(>wKs#wpJ=t19cNy>!Gr2ZBQx&bu(LApzdPpa-~*6 zRk5`V>Tb5CmFj}3W@`>A$JV@3MW}kV4nTFYb-hw0sN2}O0jh_s8<pAwbvs)Jp?cZ6 zS*a~hEo|Kim1paaQrn>JVC#0Md)T@|sbQ!UY<&qIDwnQpRN@GXmZ=W3ycP$Tv`pts zX?YsP9a^R{(l=w7=CHI(=dbAwN4gS5%XGGz?!x*JE@;y-U4w{Vna+{Z^3~9k{@XZ? zpk=yVN9iZyA~r2Q0KZBse-Zsm|Ma0en6yt(BdJQqFkbnjeMwnl&8*zocV8PFnDU3> zRgZr^yYfxv?wPmg_`ORXKls`^9=-SX7r)>B^0af_73)6my7nLK9$B~boX?;AwSyOY z^SY%^-EeOC-cL@R{7l9x=o3rw|NZ_qoprDG{jnc^^!EF^u7C5pu6w9{(WB?w=J{22 z;3whdX4AjAZ}Oy<UZN4MvNO|OoNL>IlO~m1vZgmTw>xbiaMYE2=BDvnU~vtXMzt%O zL~SiUbJLks{i|m-6Qz`8lMZ3WNJnn|$MtC;f)xRuoNsj1+yebpkh6djXYgr5!_&FX zEk9aZa-Hx+Hu})_Dc0O#W}rB;yN3vdb)-5KhY=5A7JhicukRx2e5T>60!5!{1vmod zY9$@(`h@PbtHAupCv@*#UXXf_O5DKV``k$c+53d*Rubg(AVY#|1R2IZrxp;_!}O;? z&xh`$E3MGUS3pJtd6rV4jkv`~Tjf}4Lr{J^7lTx+(#dR)%C$O~2QoIGlN6;w;C?<m zASFTGOyq;Q4_&7p5rnR%Ss&7U=;}@2qdK88zJusIel6$>ME=vd4;@?NKd%#-+2tSC z3GEFk_UPn3kU>G-LFCK2&-+1APwM28Ao;KA<S`IB2KFO-7Q}u^_xUl%upqxCf*S|@ zHar!5u=I7ETmWK^>f}lgIu7*9x|w`1Ci;Z#V%m;|^~nIpfbe+$q@>7PfAg{cv8DX$ zN_^pS-}|>_9W}GLE*y=9_*Pu@v0M_bfP)~3fJu@xHt0TKo3<7~g3C=3YEuNldM{$O zzUj4wQ+hO>7d{_{51obd>;5f}>DZQi@>`HfL0%1Gn;<rkaxWFiirC?xT~cMaBsgf2 z(2z;O!zPK0m?S!ClGvC@;^QVs(AKTmkRnW07$jr|OcJCmTu&7W*(M1mOcJRyNt8wb zkxy*7N#boLNpzVcnKww-9xzF;WRlQElY|FN64_#s=#WWb+f5Q5Hc4WaNs=Q5iP)ni z2_7&>Xv`$x!zPK0n<RS7BrywPhu-p$c)3XuG|Le_NjjsWlc-JS00arrajPI9I>Hhp zOveI(L}<1wNR;Mcg2V<)65nW&#1@kzw;Lp8?=nenuSr4&OcFk9lE^WWM9VQQ=rPA) z(@hc&m?SaVB*}z9;&#1Bf-NQqwV5QGH%X*qlIWmGVsuxBUW<5~?&%ODF>I3LE`ucO z5t9T*O%kFzH1wPkVY(|rkjOEUM9VR@3ZGboN#fH@l9+9hWWpdxyV4}VdXt1wCJ8S$ zNu<pr(Jqt3@+OH7m?Tj$Nphnk5zMho65L{v(2z;O+f5RoJ0i4Jjo4ATA3~5A-3=i~ zobH7XBtdsV2$H1xAaoM6=^g?>f^>CXkkB!cgfZ2TK9LHOL<1&?*(Qlsnk11jNwUo# zAv<r9V96w*L6d~(+_zq@P=wA73lgRCr-H=j45J|N113ovHc9fBLBjTAWTNL24$^rd zK|<3^5)POoGRGv*h)H6VCW+JWKmNDMXr>pjBjH5KB*`{|MC`mtf+drL22BzkGD&3E zB+(I*#70dLr)$>uU&S0r&=qSzl61XVCsCWORtpleFdGykRAG{Ez$6jdBvG1YihN=z zlf-G}DSQ%nlO#(9iP?iD2@aVgG;EUah)E)&CW(%jBsOl6xP`f~9&;>FVUlFPAaUC^ zNwCr+p_EC&G!NIyibwJ$iIz+f8#GCL$RvqjlO#tBlCVcj5*#y0Xxt=W3ugxOm=h5? zdmu<OV3L?^l6a*_5-F1;+YFMl>AZwqRx(&JNodd{;USYmhD{P3F-dIHB=IqmB*smW zv~W&Ni!f^26($J=OcJt960S5!BxRCln@M7Mlf+9VNer4KIb@KaJ#3QTh)F`DCJB$3 zBr<N2sCAZXpJ1%QB=LYr61GW_l?DmfDU$@-OcKhQBwR8{WY8qhA(O<0O%fk5Nn+F_ z$uWb3?QxR?Eu0C~`%gGjVUlpbBoW&r(MprVQYMMFnIw@nNwQ>+h&^bM;E+i|!zKxj zm?Sc4lIWO8V&f)>TW8Dmi6kmak_;FG8=*;pl_m+LOcHK0NhEKQXvrk8L6gLXOp+Kj zNpi#>F?-Y`!7-DB#!V8YNBH#q6N^-sBpOfz6AHdNyRE`IBh;Pg?#Qc0dILBh2f<Iw zXUG*Fm*7>)&ay-LiUs^{kdE%WLGZiK2I=vgDCc|n@Z0sC3zvm#i@iAykq>=t#T?xE zcx2@S(m8?9k&R4suOPK8t*Q2&Y=`dy($ZDv#aUzecxC;gNJW-+Odxb*<9xhSAD=+J zIDydp-ZB;4O)bgu6UZr;UrV3q6A0a@D1C09K<M5u>GS#tgzn^#J`V|k7OP*E?{!zA zSND$zA4>n_354zha6VqDpH3hzO(1jyS*E&l0=aGinKywfo<KS#kb5VP2PTkzpFlo4 zfqZoW`R)Yr;skOU=Bl!$mrNi*m-y%2t3hm>XY)x52+e<dlA%->X??PWeDJuhPu>oa zpQ@9GKt`wO<YORXxMt|5dX!RKsFSBb#$DoU%QP#ehY$T!G%Fv*1BX7bFb^%^Q9z$m zfK*<tlgmK{0}gR=z6NAGuKU~!(w5N4Vvs;mC#@i<8+FnRV%O>9jUf4yP96Xm5#(Wz zN?alIW2SrihFWy;1c<d%Cv=xy1zxA(r}`<#pdhDW?Tv|RQWt{QZ`V@=L7b1bH7%Gx zUOR#GP9W<i5V{{t=1g~<N%CQk5p_j_Y;-qSe!m{!Ga!}U*2zym#sql@q~clKhpu^- zp3@25{%p1VmrklcDu1q%+d%@q&`B%E=r47$mdI~(@-C2}-|OU)AY-^n?5~~2LF`GB zH1cgqCCE=fhA+^4EX?~xF49Q_2wugh<#RcReWgz3g5(9M1u0#n`@9Zh^ctP?f(+lF zlQ)5kgmv;x@`>r>;~--<>Euh~Q>~M4gIF~>c^;&)Q76A6(yWtnG13gK&`AKK)T$F3 zWT;aowIJhyECI>mqKm&S?gAOUOD83eQcfpy4@aq6Cv@LNTdz(&2$IU{<WnGdMVd10 z=~lc2c~}wZ;a`Q%m>}N;vG39I`32=u(8)275k(eZqD46e`gETunB|oOxg4aTsQX+; zK7zakWVm1VxfNu5txi@D8PG`<WMrLA)`FDo)yZ2yMg@5<NZ|Fl&vuX@K|TXwuh)H^ z1Q`+JAV}&Tbf2Gtj0tiIX0Q1-=sxFwl-{V5OF@Q8I=K#H_)Q*hf8)U_;bOkuf0FPS z6{Hp<utE1pfusa^El5d_E)aT6gP(H&WLOdWTuJMqRI@cMNX?Rz)rO0IPAc+AElycO ziclY0Px&Z9KF!OjQlpBH&s*SA`OkVj4cO=84YJ_&Q9<h9W4~2TRoAlM_CY}w+>YKN zNFz|{ZF;K3H8s|-APbf*XtX!!K2?o1){r2Jo6w)%uKP4DZm~*&R3Yb4L7JD`Vg>Hk zQ`Ib7YUKr4w4}kR_!r%$>Xv3JFG%BpI%`A`YQsTVgM(fwBJZJARfJl;3H$bvAj?21 zakG@a-am*`fp_R+7-Uot&IjB3;AYQ<NL3a3*gHK!rGFl&+637HG9<{?LFnZXe*ali zwcKixWMQK<q6p>u98v}T)k{U>5J=?~k8p&G8ye{45q`a1pwbm-zB`+*?oDSZ-{bjE zs)e=ic}OP<@RJiGTLpoW{a&5ix+v9DDM{1fmXY@fpQgpN*1zebwq`+Xr63C$YibAI zulrP2H8c!9>=CNzZ&8ckZ64v6k<Z|VJVHLFVHO<th)&KU@==}4AhJUzSAozY?S6~d zAY+2e1F=7$`z)YT!#Y_EQWE42ka0oMln-w4^ULZ18C8VpRhL?7rEpuI-#6-Nms&%D zG&iN}agzk?PwA=P6Us}n2-~|N)M5iDeN2!ygH-Gk`7|%HDixtrZ->vIAX`9&1=$8N zstDDqx#kvY%plEH;M00pO)d3xLk6j{Mh#L^M~~n8?bEcRrOuY5rlqb;lEt;PgNjfs zK8^@S1o<3D05^a6IoDNVoeI)iUE4geOZP#e^27N4I(-89<iDu<G`}`w4}ZxZ!NC!O zgz}FWq&bBL;QgGRM$SY3p_A_s`La%a29o-UPL7d}AZ0j*RQaUtQvovgRh?W0GWL{C zk|6Y;xZgg_^(m|L4N0o4($kXQfM~x*sO9S^pKt4=31sAeN2s?fs;Np<d`FOlRjIav zg48snhQBAs!lu;te|dz;T8W&8exj2ukinnnq(Jff(jz>!q_75G)X9>Tlx6?UBb4(S zk*ebNI(YzOOcBlp^Muhq>OLQaPwJFY+%}|qb`m*NCtm^?#0`f2dVh*?#)FGKIY{J8 zog4<KI7=r-K}M(O<lOU+Gaf|r^SKs;9zOI5y*GDMkfk7bJc8)^^np~IuakeGRD!$@ z#KuE_eyW`y^k|<?z6vsihwgmxEcx)qI~M-g1oGPn<aC_vkg28%GIPN|wm35qF5+wj zotAP=*x2y7R}sf27`XwtJ3cdO+q1cuLHk>;Qly~~=N~Yt^H~wfXJ$iVC~o7~HrxwL zsc@aTp)nC8b&ZxP5t=~46G&tNL8eANu?YkxO{}S+ESxkk2nBtW?!)&&N<uNu6FwAk zqaYOXDnTgbHG)vgZxw`MezzbL^T!0Cm>&~_V*Zv+f;QUuCz2rOKS+Y0&%0J@`Jj!U zXGwyflae6lMUo)sm69OnyCp%;Z<GW<-!DiIF+VH`V*ZRIi219MAm;B$f|!3U31a?@ zB#8O6>-4$@5%UF-Am(c%LCiM^5<<+kOM;j)k|5@yB#3#VB#3#dB#3!f62!bm62$zB zB#7A{i1~Tp6GqGiLCn9FK8V>Mi22kxdW(e-vq2E^MbZZ`8w4?5FMSYml_ZEcB}fD@ z8w4?@r4M56lLRr}CkbLU2x5Mh^g+xYkpwY6DhXo#rX+~@$AUx=^Y0`<%;#LMw_y}9 z8w4?5A$<^YOcKOw5X5||^g+z8lLRprBtgt?5+sJ02PHww|0W4y{<tKF`HPYu=6#YN z=I=;?n13n>V*afpi23ZfdW*#n^Q#4+eM(dk#C)?Ph`CV`#C)eDh&d+-VlGL7m^Vv; zn72!Um_I8CVtzu91Y-VANf7f-Btgu_Btgul-=Mcf0x@4G31Xfl31T(~Vm1h3HV9%) zihO8CXb{9~5X5W{#Jou6gP7YTLCgk0%>B{_F&hLi8w4@`vz{tM`@#20f|x%k31a@T zB#8MrNf7g4Nf7gIBtgulp*(j+gxQXbm@kk7F<&kTV!lQY+7D9y@bd{G<_1X+bDJcH z*&v9ySNb64H%o$;4T6~eRr(<2k4l1=za$9l2fr=}V*aiqi1~;lh?!n!=+`uan5RjC zm<@uMuarKBXNe-n)4F*odL8m|awc*+$fpEp2bqf8eV=<lqKfc*6}b)uJfE30y*-(k zvFK-U4#<s}XUnnJV+M&NzkZwa35CvUmL!<yYca_)OC$*gKXr#9JjV`)KIao>t{(hS zyXQkS-Go~FZjDFWxq9r!_ev7A?&fQ4-VFa;NHu+v=R^6tA7qvw9|bw%1G>*=KyDZ0 zF_2#?;*_39T>fb<m3w><ea+`3iAKNjm?XjQDWj6atn<FD2)9NoIfbv0d9~Pw(x)oo z9F@dlWk2^)QN6~f7K%9WgyI{2qx<|CKCe5Mjz%eG$0r$`e1RfddL;CgYZP&MLcDZ? zB$43NVM#*Ke~T&7&=^M-vxaYS2p<z+3&i~^NzI3b1nVCJp-tyeL9kg^FA0Lp!m6C7 z<r4~lyh#vrck6LMu(?}hH)^TE6k&}bSm2jPe|nMUL*UHw@h(C^E&%zmB2F8|lWX~E z7q@CdV~}dGk*{C4$Aj2H@%Dt0mov6O3eb8%Csa{uvYU#JE4jrk(g{_<nyV9P469lv z+^Wk3p_+CpLMbjsEz%FEc%0+hP>Ij4axEMZe=VP1)kyFHK5L{Co6q+6Boy4pXL5WJ zwAb-j8lQwhMLtWTk(kYAX?zk4rui(5Pr|_;{8q*sip=3NC%#WGk>fKbOt|-kf?N3v z1ChA{{zHa1@W(TTr8BUWp?>fWyS`2><9uwi4}I9jnw$4i(M<qllXgzQe7_81c-fD> z&yM`(RyP&<FzEnkJI}jci_jZD@`AhvWLS`0Ae4twI;DCV1Vu7MvH1K1qypc*5B;vr zbP&JvsnZ<d`&<n&Q~2Bn5)k>MKxoVK^GSou7C!4h<_n*<yQ%!LJ_u4Td>#d%F6{d} z3(_KdUI3vJs=m)T7oZJ=&m54H@L33w6FwObdVJK+=k*{1!e<a9Eqp!%vO)NK5rlH~ z^VttFD13ejQWQQffov5%=U<2`g2Lx|knO^!7KBRo%W4JLDSXy~Y!W^Xf{X~C9YjQr z`ZCC<Am0b6!2Vz|QaU~A_aK`^&Qo87;~kOnY!IrKA7LfP0pYU@Bp`CW2ZYYG`DJYa zp*xg(@?nr|BIn0I4vCx(fD8+tagcH0b2>JG-NNTGkmJH90<u^5)Pj^x();`}kp04^ zA7q;Fc@X5F@c9TxK=?ccLbdQ)>^YD*!e<<$BwC~VBJ4o~34m-7BmuHrkQB%+LApTp z3Q__&AjlSw!-CNLT*n023sQmc#a~}P07;>j`{X#t5mD2r7h`)@HJyvMHxyUVwuG4q z{*_G{B8kt|?|<&Qj%tMuUhu%%7yB^28u_$|vZ_Jyg0z7Q3-U$~3#I!l|89^P6%S?o z2nelr-{%`3DdF=okP6{*>LnOkgwJIlBck*q$X-EOK<JJ;zs2$(ZP@C3azDs)QPzh* zx<pxD0-^i#{8ZloDG726WJHix&2W0AU(+B+QRI9p$f!uw2{I<gn<*b`b$;m&gUl8& z?*=J}oWBKPi&Vb^NeFT_eq4ZlyU@@1T98pe7J}HKtPT*|o}lfm)`QF!KJNnAB78mp zLOsE6jc<Zr`lID@6r@4;Ou=1^xSXr`TnW-5d~O8UEqt0l#zZZ8KxpLhYx*`28>4_v zJ_160%#Uyn$X=22cR?yes{aOQ5aev!cez}USs-14+ypWp$P$o}Al)Dv1^GviK|$UN zG9<`nh+zBi>-97U^=H3c&x7Fdpxdh62vEY->5l-%;j><(x-fuNRjJ@?-2gHy%32Jv zOORfWQ9%YlQrKGj2tNg~L6r40$PrQ2FF*!`&$L%NZ<8&zy!~ksgnFG{)1@Gjal5PU zQvhibrN14dOOWj#1A_bq$VNfF2Qnnc?}%U<^XoPJ3Xn;9JVB5O5zj)9VUel_WS1cC z0NE?ZE|4)nz6Uad?Z+?uv@4z87w}u-8W6k+M{AASKz4};J3(d(pAyK3@OcP?-el;v z>Zd_yOYzHk3Zzo_jDZY`2+x{{oCS%4(2tt<wa9=_U-fgoAEZI#{27o6k?IggK#=oi zVZ94d148}T&p8jWT;%)^NM5A+0?2?M-vQYu$nQah1etLaO2-y8S@qSMK@N-3?*ySY zDmbm`ZIyYX@VCl);d5N1`gf4LN(E=@DG=)Oe!YGLvR?RHe6{oLT;C@QvQhZl1~N_L z(+;v(_^bh;9(B5^*Zm+v!si1ZGlkC=L3RkA{UCFM&(A>UoezE=n=~6W6>WG4NKud| z$bcY=LDmbB1t|%#fk;4KJMRaf9)7y2*XKa?h<HXpsE7ML&x4E#pFe=mc;~P8S6zel z5hMgMCdgutdXe*Lkb@%UH-Mys&t{Or!so*v)Svwb9|t)qeEt(;T$KJR5bM=?%u{g9 zvqBKMx*HJWH6XSi%ZXf}=Tih}6Y;za#46L*^7}z5MXD!2Qi2=-85Cq1t~%yK&T)__ zDrawNYC~~nI7Q;`9q^&;!f&6oAk$SUxLBJ(HVB_bKxPV`Z-8tPK1V=o;Zr^b>-`G7 zHLeC37NibjT#zgXZE=2tZvmMva()<ONccPsLhl|aS2g_s$adlLTM&91iSJW^D`vyO z=PHmk;d3Jh{X~=BpYH^z5Tpc>666CQyG71l2FZz>4}r9aRCK*AFGw6@Sdb2oy&~tg zf((e9he1X}s&9de3i5l93hXoddR>WYGW$i&wICZr&Rrn1Rr+h^O(289=iMNOgwLlz z=xr^2%a4KtMCrc(nJvf^8?$#ot_7(Pq#mSRkWP@4AR9oI3-T~Xmmnh`c|pDhQWE43 zAS1M=QGM*PAm(hMrt?6ytD1V-U<xVxZIG_FjEa2vK@JG=PLOdyJ_C}!S}*-M5E@DR zb@3aJofAs06s1oKp<W`NxgdjrECd-9q!VPCDC-R%BNNI(6KOSlCwyj$R69WESCRal z@Hj|B_&f)4K=`}>GA80VFO2pPBm!d3*4yU}5E?g5cbW-**MZRQD*2^v0jU(JJ`a)- z<hvk)f}9dTKNLA%0WvOft^yensaAq)7i2BSh#>C(sl?vM?_-|?X%J<7738=m>xUpI zk?M~i%LTbOivA-=9AsROr69{iS$U9h1XHfs@Sj1_!si1Z(}d3m2#s}q%l`l*Abcjp zkR|qNeobe9lnW9E2?){*G9<`7AVpEuTS4ZCvK|I037^M662j;EAj2Z(-+}BB<bpWH zUP0(O^_U<HAVb&}`t`aCWTPnk%^)?ZbZ?Xhph3=1?fejYXw3B6@G~GOl?sm5C<xu@ z<d^jV$cP~4Cg6xYpYIa{*(P#s1fl1p{k41-$guEvGYGvK%J+E)q(bEUX^?;*qaba9 z{2XML$obSH)}Y9F2FM=aGY_OBe3pUaMb3Hh5#+5PBZ7PogvKAgRlf+bN#y(t$bR87 z4nps$^6Nfj9`=L6=UR|$!lw@8knmXnGAw+0K#mBX`#|V@R(@IU1UV{vJ_@o|_>6$i znBdpzTOjm?D?gu~fJ_GQeadgN_!qW(pQ}Ko2%k8}5s^<F2yO3vKC3|JEm(d&>p@0E z%l|9Lm>{1531AL{gtQyO=V_1`BIloiOg>f5`IPyXiwd7<AQi%A76^?1euPyZGlb7d zkcjZ<2AM5<{sCmZ@YzDCgwG=&v@QE(JpocFe4Ybo5I#qV2%mFq!t7M|TmiCN_(VZy zJN3(I1fi$&{g&?}B7D|^&^y6=p9es4!skOE^a~}v&u);S@Oc(wqwx79r4l|<UW3`Y z@VN?PgYZd$3<;mxKsE`Vc90#yXAQ_^;qw5<F5&Z0kgdY!36MR)XAESU@cAvssPH-O zW|S^`=7Jm)KDUDG6h5y5p?976ZFmpJZsD^L<f!m@AIKizvlGNRP0!~^kbT1E`ylj& zG{3B)Ap3>S<Vqab37_*p4ho;yAoTuvKcD#^hlEcfh%J0tL5>KYdqCz3pZh?L3ZE?? z^rkhxtdD`%Vgz^$q*9P?gV6C6vT{d>pMxA1Illx#Z(8?ruBdXx4S!3y0;Em&gh8fY zUHCrLAUWaF1TszdtOB7o4Etr>143hqpU;~>HVB_VkeR~gVGw#doS)C9K;{UaJs?|! z&wdaZfBdq346<GL{03yc@Hy=k^i|<A4Wvf+%mNt^K2Z=Fqx`b)aFw-B_%wmE2%ip+ z1Hz{dWTo)A4}{)U=huA@gvK$ytRawb;qwWQobdS)$Z_HGb&#U)`94TFvh~Y)0c5@K zc?o2i@HwX%Yf$)H3K9@L*MV#jJ~x8Q5k9wqY!*JR1xW~>EXY>jvks(2_-q8(CVaMl zq=e6hKz0b9&w{KJK2Lz`6h7Yu=@LFa0@*Em{u_jzYVq4}a*Z>t0=iq}g&-y2b2Z35 zk<X1Fn}kmz$bR8-C&(7zb2kXxSv^^mwH{<hko!T#1bG<bpvd`?AlpRFUjjKKe4Yjw z7Ct`&IU;<Hg6tMPr!H_tbwIB*K=ulst3Zy6e4-%xg-<oeWb|i0pCuq;!lx62Mt<LC z0EB)S&R;wK3^GmlYz3j;hx2_t4l+adJPI-y4!+OVKxpsam-Sr`dee&Ua|C3L@OcSj zhVVJB7NeH%nF%sm_{2bH58{_q2NDrJ%Rp*`PZp$7_}mN9Abj3NMEE=e(jt650<v8A z>;hRSe4YeJ3!mqR2%n#T<b}^Mkeu*2qYmSb@VN-2D15F3*(iMGQ7Ykc8^~tivjSv; z@X3J;37_>Kn}pBXLFkv~@W0!8-wU!?_<S5>m+*NMWUKIb284cv&d=w0kZr=}7|5vb zDX&NA!sil@gTm)}ke$M(5`=!24*$C`H-YRHK53An!lxf(kMQ{?5IX3Fo14!TkbT1E zBOp_R&lf=U3!krpOcy?5AP0rdiy$+FPuW6eKX|$-{Q?kM_*?~YMC6kMnJ;{9134;u z?gXh9K0P4Eg-;2jMff}bG8w`6@w^|TP52ChOc6dKAUWal4G`L&`uU833<#fbkQu^f z(yi#d!sk4YnZoA^kU`-S0+}OxZUNaUd~OGc2%j{_cHy%IWWMm(2(nZ7yc>k}%lO~z zEguFM5k9*>8idbNAp3;RcR^Z&&o4m^2%pKfIs0zEtP4TtSMkbK=~siKMLuy5dIzcR zQwx$4K1)H43!e-~QTVI@DL+%s=Pe-Xh0nV{=<Q2>Sswt|AbdUp5)eL5fNT;z&w|Vm zKF@<}7Cy&762hmv0c%<KTm(`he69i6CVb|Dq=Zi+$PVGt0kTr~tOeOAeBJ`mC44r6 z>=r&B04WNePlJq$S;`Y27OuohR_pWtNTnc0K=z27e-Ba;IiIlzeN6bw0NEsb=7Q`O zJ~xAG5k8AS#)MBB$Ts1V2RR~q-UKo%d>#Oy`3C-Xx0HuL=y&`4-tq_t%{P3XuYl06 z_xV2G0huCv#zFQApUI8rhr;I~kTKzNJqXQ7{IV)RjtHM7keR|~H3<ExAD~-{*MrOv zJ`aFQK1=ucAV_MizD}P4X%pm^AVY#&wAh*L_z}(rp|^nfrN0iOQk32gGDG;h4TP@$ z`912rAUg&51jued9s?N><Qb4rL4Hi+20iEBgVc+7&cdax*&?2cLB>R?IUt7wc@4-B zK~f;&f~*3eTgLr*^%KDrFQ2>>q(#K@9*~HL=ffZsBGnf_=s77rpRa+;5ajzH0YQEV zVhb|)b`V^t^7FX}q)o(g4M?SkCjpWZKDUB22%i-oMd8y8vRwGQ0fc6ie*gIwkhJjm zH;@g&XBZ?ed`3VjMJ=8INeS{i$e<v90NEsRKBo!sh@3A2*(`i+0NE&fZU)&Ze3~hh z@aY5@3hC{9FUYVU{{k{D$Ol2TiJW(V42hhd1Q`}S-vikpd|m{xa7EBx%Vo`25@Z@k zg&<df3<@$2gl5$K`dUatltu54+9P~c6A?aZK=uirL6A}5^I?$v!skhlgTm)9$WU0X z*Y7}v1v$F~tt!YBAT(F^YY_sWU#tXl$IL2_L&B#8<f!oJ1UVvn)`8IDD1JU~qg2A@ z-$14apGQEB3!kSzrVF3{0-22Yk00}IKxPV`GnXJ|;d2=Xy@k+^CkQf4__Tn`7d~r1 zW(c2mgVYP3FM!MxKK}_qzjNuAbqr*V@VQ_q#unid1fidC^n2!VkP1OcASppU0um89 ze*+|^a`vuHRv>e@x$E>-@S)=izYWh_h8ey}1xM>zkTy})Z6IBO<UsO*+z&D?$Ri*r zQP$HS8&p|dgjA*<;S2Cdi&SSX$2O=^afBfB!<K%F-3n46$lV|*LGA~k;~l^5J3#0+ zKK=FeBnTbv_&(nQp<nv+eO?6dKBqXpF&B=<>~r|!KiV0;MG}sN6Onq8MDvnF?BIw= z!Us$evCb7aM<T(LNg_iANyf)blB`5mz=5O}Vbl%|nj}1CkVt&ac_LLTnoJlZ7Nn=x zw47s!#72W8?Oi4bjY$$ugz1?hEuVNI+GdjYfJu^DBuNJCT_y>Snj|)Ek~lrrr<I-z zg-a%hj2a{ovZm>&VnI7PN3FrRtNQx9o`UHpo@#-~_)u>_su*GR;r;^>r)TZ_cw)hz z-DQ$c$t1BYCQ0lvNGNpJBr)p(Sym_+Fi1F9X_8QzB%xT8p0d$m4&$DM3ndAK0wxKU zB#FdrdeTJ8ClU`IHb^2wPnzgHi7-7OqLHW_9WqIbp0?0@VzHP#U6Od1o^H^6;;~Va zB<Yze%_km-(eqR~iG>GE5*;&1!oFChiU(6B3Fl1`9W+QXG-i@$;1ZE@B4SrclC)#= z?0^<?(oXI&NH9dt3+X<=s69g`aXT1XX_82nNfHAF3E6`t32!k;bkrotV+IL_%P*Dj zgrhZT8>H<k9*o9kOP^pg(PofXnC|)aYZ?#6BI5>$hbk|VKJmz)NupyWN!XVgsgiVG zw_aA#9yLkO3K%|-lu4o`N$~!UQIiD6O%khowa6Lo?PxPd+#WVbaMUD`z!fr|c$Dsl z*6J0CC+PlXL6UUmuuc-O$}0^Lr~7GjpQKH9#tIS~mn0mu=g$;A;b@5NJJnL*7h>ry zQ=P=@Hj@PD4pQAG9vYP-8jKt;Np#F4c<X^as>h?j_+is0F>aEiHA|Ep4cXHLN!Y=7 zr9nb=y-A|W4HAygb0dDe5_UK_VvtC9uOz`>@Dx#tL@*dSZu*4FOrMB#l_)D1jFw9h zN<?c+l1LdO8EP|0xMY$T-IseBB5-D3iBK|8ezif8wj^OYMEBEbsls-6#3Zqb*@jP? z?mHE!l604;PJ+S7vNgiN&=%7tywxNTy6;rv6Q%o3brK4Xnj}_njr0lIbWf?CDjXg( zNn+F>ksv)gp{I(3r<o)=!z6LK&r?s8jL((?zaUv}l5pN6u`LD(hUkt>E$2uua?B)& zz;)6mWVe|lvPF_;FuKbm@nZ%F1?edWt@LOpoG?jpz#!oe-N&e>3diU^Mx7)=drcB8 zzuxdk(7iNTD(si*4H68cOcHG~NqpEO$z28s*}F{=95F~Zc)%p#>2qa-;mE17&nGb) zn?7+mo2u6<5~8Iu{Vg{c38zh;NS8sPcF82+jV6f>nk06*QC2j*#q>$go6YnHqsek3 zRm`Tdvbs+!c!uc{+GYBL={&7S6`^|Tb&o~&8b0yxxJeRoZjkvT@LE!XL@G@ZZ!k%+ zMUbQ&54M>kyu~EZVUxrU7$gy-_lEg3P1=cYz&1!EWs=xdNrI8^kU^5k1CoS-!RbMf zb0`?5v%6a9p-6POB>0W^%_d21HApx(WRl2Ulf*_%l00URNVq&C;)zD00fR*C*(M3L znS@S<YrQ2IjYjFI46UZoXpGLL3KHLGlEf~9#DWJ*5<hH`1f3Vvb4G75Nr=uv>OP4u zoplr>Rvs}(GGGuKz?&pmZ;}L^q0(}W*}<G7$w-9GP-#BNNMghw(FC1G(tV;yI%}kp zSZIoD`D84-)%1xBnIyW+B(d!ViQ9Wk5<6g$ctuRclSs4~BpDhoNpy=z65Dlxy|Nt| zF-dgHB#9%EgzVtBNkWxzEy9Q$vLktuL`O^#A2&&&G9mN9Zz7u{IAV}+aNH!J%B09A zmWa|b25Ox~>{uc`Vv=OVJl!W4jK$g{!BNt%K|%@ZMv)4m4gKbnUsf;_vxf{4kBu87 z5w4ssQenn8Xpm57%plmq-Xv2+A|-<)VxuNW23{jmB|~{hBB9WTNn#baQ(3E5B$Q|~ zNH{cXlB88BQ^mq5lSGCLl1PplBpIr#lKCXVbZ@Q}Pc#@FGfCXOMf!y7l1U<?1_>tv z)iPByoHs};K4OqWu%bq!!YRBqN#dc%utDNMYk^1=Pb5;3B*ONPLE_1AgCt{>wIUzP z7zYi4{$r4EoPG^WYeVc*N+wB;8YC7A)a$8m$|0OLNqod0VY_0XOcf2c86=*dyOjKR zLP5M`^HzgIQwE77hYW)4OOlWsuDng;gKc@xAmPNAL839cL8eM1N|J;liBU-+;b>ry zNEJy0>D~*iUXes}M3N}Zem4pqobYWkNHRQZl9;tvq>9^#ltDs?AxY3T#tjmRRHj5e z$*4VOlE|1rl5zWXJr$;2v64yRqXtRF15GkjGMSPDGk}dIiS0EAj<TCYKEYtP+$7No zlf>yNufHzB!C+##K|=NnlZ0lPBw-sQ94<+Mvk;?_gl#*}B1#WqUulxWh(Ut(*_Jl< zi-ZyMlqE8sV5q_*VcR6Jl0o8$?UF>2u~CyG>6Z<)7K?_0l?I6?>kX2yTTBvaGf8;R zB(VbqN!nwQ#O&BHlO*hAB0_9Cd4ojlT_y=1Fi0X+zFg*$NK7|K(w=RSsBMx&N|J<~ zEJ>2I?Y$-mjhQ5B-y!0`p;Wy=g3$q!#J3nEWbZOaA~s@@1pQj2ww9C0aGOb@!zPJa zD~wdhlpqm165MQ($dE}A!v=}RcNruR+-s7^0ZDLXa@-^_dex&}uShVMtT0F-Iolw~ zux*mqa!Ih;+o;IgLa}4!!bNBui+&OkSNiCz0iFGIKBsu!Xm$FqkHx84oK$p-@k*(t zyQ$cR)6aDYEu4aU{CAMjNa5r|wmmae?;{WAGtW&$J~GugAbzUrhuT*8shZqW<m2RY zmnglpGgs{I%cPw$IOmS8yZd4|)WYXn{41L@z*_&a9(fdtt?5E`O{UP=k!#1LQY?42 zcVt?#J=vmKNaGFEw9uEm*SGM3uoN=*DeKm*Om=k_r*$*-vT_$yl3Z_56_d_%w)f|X zt*Z;|`L1k7Uu$2ny~t&9G^>$suD7GTnC<PcT3TA0vAk$e>n->Z>@+Rc>B~143)zml zTYK8OGkuje2XDR^k#}@ufY`9EC)3x5N_J;+>nbagI8bpjT-sh}t;zIdS91|=mVjOX z(oP{XqKI@Wen_a;-qVrs{A%2~7*>j+7p{f=j$&)RkK?08?P^c2q2#UY>AU*-xZ&1J zMD6)}Ze45l8ia#1_(FT&mou})OgAlMxoOa9y@iZ*b6;l<nl}B4m3QrZPWAQt(wSVb zy_HsDwkMq#XzfP1*`C#2nY13bNcQt6t<jf{#Lb!=UM6eGfU>0Otm1VEz|LwZU+B$e z3dMC46S=Epq@(4&OkqtHjpy=ghPyCjdUvMK<AzR)Zj-W^yKY}5m+5fwpl)5r+|!?N zntyd}UA~LkS1(~TS_54)i#F*iW(rP5Zt2|_>RNsNnh;j3@=S4EKGT}%S)FyaBsZZl zq0COLG*ydi56Yr#z`A)gHB)CclS@0@x>M^1WOLT$&7Fpuzj-VbKJ5cpYzBUIFXNZ$ z&9|od`?^}Id;5EeR&Txozf9<KTvubItuA(1_@(kXv~e9b9QAu5i~4gl*)^`J%?^+P zaMdDgh3%`^k&-UzP50+A7V6ZE9^Ib9*6uCbBbEvov3QTM+*!z|T(GUB`|}(e1=fHK z2IE{cQWP@_28xAt)6|q%i*9eyY8pFIy;u`{FKcS<U&R%lV6950sSaKj&1L&&6zjd) ziOFf6*2dn}CbTY>3WPLn11&}G>@C1v=x)gLaLKBjFy?sO0*%_tJ-Ky}(+SD5$?42G zYA&MQ-K~rBnVv<N?%u*W@^fKxCUdvGh~J>p7E`@kGuO8XKiI1o7f>Lz1$ULZKJ;Gi zi3|<iF#$Ir_V&Jv>5VRN%R1};{1`!&G<WqDiUw=w#qi|2QFum5LKBiQe3`Vhyg_h= zXzhtZIFAkY(tzjf$9&S0S<9O+4=4RSt)2PR-2&tbnY<4W*1FbJs3mPx8m5tsHpbp! zFE+e%rm4LL+ljlA5}+DwhYqd#G-lQUV5JOjCN&hPwoKcAzTDhSKa%YGHz91fh`k$? zy%6&Ocl)M1Xkc{*jC!x%xywtnWiF044yqsT%5xL}?aLM60bdaI=~%;qv!BRoPM>(~ z>65N>_khZn#)4KsR%4x}GrYrahiv7HQFC1@m5FL#pj_8l#d};19@7Hs7I`aJ++WOL z4Cmpl`j%cE)I8QwXz%IE(YyuyQNT`Y!~`2?2&i?(7+#<;!ZR$yrsSsf9NTl~OcWzU zu7#{EVo%*s$aH6VitRZHzN({xCOA&u&UOV_+gqSC2KCoZYdyMShUYpAo3q{d9I8nJ zC*{hpy0<&u+lL8&%XxpC$+s6Wt+YvyUp<CNKNWr(nu9TO^SGZOs~%K>GMQ+0;y`)S zH86<N3?-kZ(UnJ4s#*{2o7#&Od0?jJ?s8Xi1v(ITKf>lE)sF1hw+bCQ+fBP7KYMS= z>Xycvy1TnApq=vV9d~Ead1sd}f%8PCk7A=eF&EMfB|z62A}FxSoa?#Cs77nrbN!gv zP%&6DdVV|)1mKB`GwsG&LFeg}el#uc5;`-;Vn0@^hcLkOpl5O?<6RX6448Ii!3dAq zxx3q+oM8jOOo;|ARUW+Dsa;pLlQ&ssk)zJ{^7a59ZPD@PVFi0U?CydQTI)5vMMqcn z7YgVJtxYtkwY;TNKGQ80c<)uj%sy?=XimTNt|3e)vYqP~@($cuR-ldxCtnG7=hxyj zRF^684u?iS`ms=BK(5Iau!qLPWlhG?bnD_mcC`S@#nK&OiJV)d1EV`Eo)lp3kIl-F zExoOEg)HhyvxQbH)wkz5byU;4wuiXpwIpu<m}`3bF}v2in)@-ucJpQ38i`u8LDDAU zOir577UbnD)%3ULXd}IgCeZG8>wr@0RN~tHo{m0?rZCPxM$Nb=m0GZf8??G%K~)p0 zngywrdRDa!ix)erdcnemg^hJgmtnP~l&W>p+_J>6HZ5L)mmyHzjlNv8u(4*ra;DY3 zY)1A@MkMHGteteJCC&A>_;MLbAChud^T5&;Cr$Ifx)!|kgo<rWDOjtk)Kbq}+w7>? zrJh2Ksuw!2d6}zf8y2P(H!@^d>(sQls<F;3-LGGBB&sdcs0bD|Hn&u_G`TTWS2c=- zmOF51gF>eKQ!Pq1)oJBo0VR7KfM>p#xcB9AI1Hivj75FE^|kp>E8Cn()Tb6Yt-Yuj zKl010s$pSWqpKG-FQ|5kW14DdwzB>C*0sF_9H+JR(a_PV6MeYg%xV@iv{X6yvaDuW zx1eQVW9?#3FRf}?Sk<!7tqY9*hr9QHud3L>zIO-$Vu6SvO+8{1RKU=STn!K)C{3E6 zXb33~S|SM;tOvn@h!+tRJ6;=Hd&iE7ii(IGJ9g|~#s2=EncdF`mdm~G`+fVDlV|TW zYi7@^S+l0@nY>;jY!;0ieE8rYM-G<Bt)zKdP*Gf3O0%bcD!aIRYC%<@>EqTgOkjM? znpQQj!1SCASLF=Twv(MsA*KZ5b+{E!+%ce4(yF3lPAjisIK;eDElJZnN@*slh6);w zs^3%#SI9;d3>(p>ppQB&!>g#MMitUmH8i#1dehjpPs1n9s4B)}I0Xg$hvy@PDJ9d5 zF9?+-MKds$G>FW&NfDivvJxk|H&&L0#MDC0>g~iqy2EE+QU?}}FPT!1-Jxp-9j#kl z(0BTDx-C3+<k>u^fjWdCrqU_p$IC%pjf3yCvwPZA`;Oh6?0)80p!QvJJR&o6=1{GU z+3mY_wYMF(?PhP=bBnJ5)2J@XioJGMw!C{Zsj_LeWXr#TZ=c<rSlAb}@8XBq-VHvR z83{`)@FJd#(~N2AA7+z@rXdk@1G3EtL}?r%tn?4E8KhLFB0ER<8-(IIkyngB6{U4E zO}V_ns>1Z~Q0F6EGz>k6xM?bz=1ssHqQw|Z!zadQX#ry}C>St?XfeiEh=wt3h||3e zR4mkh9t&9xrbCd%gQdqkn0Aa`vf|!it|^|?G;+r}Q@n=V(s>N!RM3PA=WBTAGzdLH z4Z;l%tfnxh2-hEW4OlA!nj0$3u~>7*<xb-ec%hX*@6qeA20mi+z(c$P8+eJk@ZP~e z*EUp)QXRZPl<JaNgrYoNw#2DHg!97v=^(ZdGQJ0@590Qtqj8P9gd!VvN*miSQz*Jo zauDB0|2~LslpL^!yZ-@qgc@O{B@v1Qe1;IPsK&9qK_e248U(?na}2!F`Y!N?76MOE za+KX4d5E(6WG`d-t529FTcY&#ez!MD?@$B1V-0lEw=ww>4X1Mr{9S6GcddcmEtMWu zD*webtCV30Wlj)bRYt)8i^gd}qD$-My*{mDY7|n~ylA9xa5LO<QR_=FGV?-iuBUg4 zd6ZSOqfjwlfrA&$6qRNAy)~se?9@IgEY~TmJY2Uw5C>dor6GDGf*KsFDTba~+IV=5 ze-IHf_!g6uk&JPOL`9WtO;PdO(niH|{DY|2%G_^p1-fY*B2m%cUrkYoxWzKgb4wdd z&+!kUDYmqEXB}b+8H`oNgdB2+d6DwR1~X%R({Z?gU<*|%`;(}y&lGaNF3X#SJwkT9 zBQ|#?H6;ABZk~YCI;ILZh0POissj`^YP=&FjWl#)?9<SVu}?!c#y$<*82dDIW9-w= zjj>NdH^x3n4~Z)3kXB3qOGrdvVl-oe9E-7s99$Vk=R~5Cl}gp%ZX}%EJ(RNa3~5uC z${LD#I>%^=YnY`E%7KJc6O$Vhwx%d$N<S!rscxQen(0n9grrxaQ(&4>e0A{afE1^W zX`MVtr+ZndkmFpQd{gLX1|g@LG6^N{PcRuB`J<3bk=zQCm&UEXFEzC_^Ly#u8b_cJ z@%0>mKBTw=p5n6rfu|Igz*A^VNWdQ=l20?e83+byQWlDYGUv~*dV>8kys6^-BVV47 z|Bx@t;7&YHQX|V%YDm~txYMO=E9_fOUJV}8rLZPeH<1&RGUc4%OHEb{?#5&&>uYc~ zb|bxeOc1F7)R^=rYb>#G$3Te{4b$jOr=hV>w!)Vtz%;T=7hYPnAUMTbakMLvf^rt4 z2Odl$<J@6lz*-Sr+!O>IC8uHM-Jz8D?1mh$D~8@8s37n#6)n@Fw=^oMUuj*8W~Fs8 zI+fPNR7G)@ke<bz(rQ?kDU|joIY_%1RdZK(1!)gcNxM7rX4ZX0(;jyT#WwDgHnw4= zP;8^*Ahr`UAYo>TL(E}fh*cKBU;Gm!O@avMZpOL`2BK*bXWYTh*0_V8t8oWEQ$r3R zDaBrrR!AY9aI%BwsR<KeB7OcshZ>U<XG$NZIM*M=FU+4lu2Bv*zi2R|S&iXlS`ChY z*ECBu0<Y;D1Fym8jkm5N@R{mHObju+N+TrTnw&k+*5sZl)O4JlIMchulH^b1xJyi8 zsY-Eny`x7O8}QeuxZYC8!P`R1Sb}$ih{Tq8@07JIQK{9$5fWTYENNwzjyWX0w9cW3 z2GTKiT5OX(zBMqWiFOT~TaA4hKWP$?jw@|i{IN}UT5ao0TTO!>)SryM;ooZ9U5-Ev zHDnenUkdavMt40hC!Vsr$@P=YNrA*xK7}%PYp(6nt(x-vcG#+G$E~_{+Nx{kt-5yE zs%zJ+x^}C{)zg3)#F3iyX&AjcPv=yWZmF3s${c6w?(J)K_aa_n0I5+=%j!iwy`xD| zuqG}P@iZ=8l+rk*MkdDOMI(irQdnZM)$%|QveXo2HMG5;vF|Rkp;BaK(vXiY;0q;j zD;!=@x5AQ|<Qka0_|@c`LN{HM%B@8-;HWX80n49=sAaA(qOP+WQImyQ;+Pu4RHydd z;=_njEY=aX8l&rT#o`&z!x1z~E^CNk)GZoC-z{AneaEdw(y*nArRxx=amsqoppHm& z3aSZ&Z<@-{C8I%Ik={Kl9xW-YK{^qqsBk=|bh7c>wk{fRrIU=M2Pt&>PL=BCcuQS_ z^rdqRr%nrDYe-$hDVn;7Q-_G+dQRyQ?zwF};o?e{a7zyo4qHKZ?QW3hxQm<Ms_?4b z)I_H^$C8lZUSl#MoUx?D+@i_B(OqI3O-w+?bStO5rN^OEq;c^Qkj5!B?lC4W+9_l= z#?YB-jjwrjqn+Lns<DrDRbw>jF^5phV=ieU9^whbJ3<YjZONf^lqp^!Zh^-T*(Sta z<3Y;OIl5kHdHc(`T>(W%0h_<lJ75b)E}OUPdze`S?lQ)RF;=reJjQ8hX&6Hbz0-IJ zySkpeHRhfegXb7S*sq<X_E<wM@#X0uHA&~>DM~uGR8@&{c~MTKyHO9;#=Eiz5#lVN zM8uiHPOdkzR9K7dUEbh1#t`;vrRK4QU0hH7Lre4BfFmTAO$(jVFJnvR;(7|L<@X{T zA*Hg}CI4<bLcA_Ljfc@`Lgq67Z-Hqzj4|n0A*Kn{{g|MJh}00i`?*0)o`N^o?+(ld z2`+P(;zq}kMz|j#MEHDSoHh84A<iFiiFk^9=@9W0b%}TieG3us5~fEy5aIB*5)n^v zw}?mkJw=4yC8e_IQ;SqiLv@+^L_WlDd1FMEm09o5R~jyBjOem5SY*E5aGCr^*E#Zq zhszVCMZ@9ik7!6D#8_s<Ss=J9UUKaBB5p`gqW=*|$WlgVo{5YQQ*EQ~?8PQTaAPCm zV82pvV-g}nScZFHSOy+L&Uqt;hMmo0$ayH=p@f1rk0EFKZA^&4C4^XpAIbL+ArAW- zVz6J;gg9J6h-IK}n3V)QMI8Gc5q`nI5qb_W^pE(~Q^YaqyMNqw)HxRP;Hay43<W+U zFE1Q3^B8jOJF4&Cu)BQ@G4$etp^#wAW5}6LkV39{3ONoQ5=pjs3_16TM$J5ioQIF> z9S++(hMe;Tj0!uO$B^@&kpsid<}u{lt9L{t&11-UaNqu6-{vvoY`?t<CEO*1SiFz2 zLQFm>#5ODv4W6W3M-C4a-GJbg+klc<Xsuf~?ws!v&J+8ASSVI5ArvQ3`bC1Ugb>TH zP(wwpw9g@iUcJHr=qcow*H<5;h2r26LM--+tq_Y#2(h@Iu!VR$N{DGtFTVw$c$&ws z^MHu<^C?^;qVA`0p;vg6P#Eq<b0H>=5@H%Qgb(OKEcQ9XV86EuakvDRWjLQ=>4O0; zjNmyG#(+q!=_%ycci`~8o^Of5K8G2i-uuS<A2x`6&qDFD&msSZ4T~0c`y6G6L=c8( z6#M1%jWF2fPzZeo=S3LobBMuwrx=Q)eGW1BA2WuS0$PZ1KrAlyIm9s7e)Jd$$D_oV zjtq;<FhL11r3B;>Vl0th?01&oQ0(`Xq3F1TP$=$)m=PZHX=WrG^MPcT#}dNfm~S`3 zES3;s;iJwNk0@cLq58-(%wq{*7V{lwn8gx8Ed8VJF^^&AevxSO*JH?e_%Jqi4u@}^ zqYQjiXFFOdH+bMV%FrRkz;l>kP^1bSuE(%5wv^9W!>@2DVJ7qGYnaCpqAZa>hDWu` z{bV*2ghvU5;eAXS=i)2ZNR-WYwjn0_;cbK^FIs!+G4!J0dC`p5W5{{fi2O(eVV@%m zF?Sv#&UrC+J%<@aj)*dt=P*NFjKMsI8T9FINCX(On2=KHu;HndnE!EdD5QWEdR_lM z;g{(t<T$)ftQ_gt)OUHYmc$@K2)86GC4EaGs<?5zwVzUlBkoedF*_<&yv%cyAzHkS ziWje=hDM8*d5(q<)up3`MwQ9`&^r{>fEEtP`v^S5INYbj7|jRbF-A)ZF}fd*huAzy zjLCdf9%Hk#RK}>@DZoGa4n3p<USBcwV|6ikim`RBRAs4|-_zQyakxp0eJt-vBStkQ zIDcp;MR7`dqxr)_JRMRf9m5na(V>7+Q|LN+$?+a7_DP9OK=GmzP`u~_6fZi45{-@_ z)fAnGO&FeUzw{rTe^g3z0*V)%fZ|0bpm@<SlxTDesix>06_pN;A>}1Q*!Li$;w~Y? zVmCwxvABdVOJ1}qKgc|X83x1{^sHPOls7D{H6AIPM30s}jdBgA!9GV`A7juK4`DHQ zTRntQ>5&vmv-?9V`+QnBo<1>sMC~pTp_jOXP*nZxB|=<2&BP@xuK@wUs*xo`qGecW zh*Ly#1EO*n$+jh-h?qw=vZ>o&xQuBWQoV%dVZ1klJVu;Nsz(N?%rTlXz)~W~w4@r+ z86D5Udqe}={W(I3^(djtad+;BGexU?Z%>a9mrn|X1ufX_Bgz}1M?IMBK%%^s6k_vs z3JJ0KB$thOu$ndzaeZx#BM2nE6^Oelsh6JwQX@wYNM)LhNkXwm=Nfp{^4jS3C4tve zw{#Kmwl)cs?muGlRPK-XQuT0aKDH(`FOt5-rU_^({<RR<=0s$RmUKx@&tTS9*APOA zG*W`tiX0-mDJh7#2H9?wOW1D`y!{7*d{5&@`VCc!uKZnRqRCJ19!gw#hO}u*Wep`Q zouiwwqVP62Zh|5-R!C?UN<RHAnOQO=wk?jofpmd3(DAm%@i&MrC>Wq!;_L=GS`aWL zw^L4M&Tt7XcFu9>r2&z<$c{R8FP(!rwC|J%UG2NJ@6@eRw=P{ehKSs@&&lC@)I_2~ zS587OPUGqqpRuEJ(VQ-&7Zh+Nw7a2myJGD|##UtR#UV}3x54JumRi4|)2_H={EP|O zN#9;M{Ww9JEv4Ch%UnJ9pX)U2?eeh;zP+XZOE}RXd>OvbzSnZwKv=ao!{GzYR?yX$ zU#>GWx1DyR%$_>U5c&5Yn{%(^B!!dN|6NxXehFvjxOTxd+J=5RhZ<fS+Ur_G!duy{ zI?Bj4;LhR4IL`I_bSde%PEKw+GsIy?=HEE}-v&?Cv6j{ZFnlx1r&NtsD(%$}$Uwf4 ztA38%FWlW_TyEN9JPW?2F0XlS!`xh7ZQKCFw+}oA#`!|~bc=Nyzs@d?p3PMs*(4GN zF?QE$<iHUF2lVdIl7D>$jmT>mr4AXGH@MfJzQbE4YU6P;zXkk;I2l<Ar%#Wu?mS=R z*k0^zS!Op*s2p3x9?B)hk0poLGr4feSbcM@4U5N?kDpXIwz^BFv3b&(v6V9?w1edI zaC&Abrt6$WPAlh|(;OcMl@(1duPiUEO0*ufe_}{QRoT?C6WI16p^j476t<b;QoPRR z*WT%8;w74{&iqKKa}d8e${2f5XnC<+@Y%xIrJ=IMyChck%FSxn$jQn|@c0lcLo%k? zErmrC%bIKv*;r89T<!u<eyjKm$tcm5RZcBuNS5<8grWSrOL4lDqvdpN9S6sltBvC% z70<R{Barwen}Z#|eZY?3fgpa9N(;K3RGR<EFP>(O8!&0+U=62kN}A2ORi!xxXYWc) zb1qIPX-+_lq<LqjdsZKax?VsSetPpQ&HPt<lwR%D-_xZZO#GEzo^{x@b10|?^#VC8 z#v#z8;*WexIzQ&VTP$yN3~M{+2Z8lc(#h8uTJEKNh#V!i8cy#bFTKmn;)Og%lAA?t zE`fLsyhAcfD9YfakP`fcWE2%r`I=1c#`8Ny6DDGaE1jnBiN{JxdS*2Q9g(~~!%5ex zc+qoXqOa?%u>8WYRXQcV9bxjU3Fc6TB{~B^Wa(fUlN_HRJxdmW$Sye_#3(11fw(2_ z0!M>yfgEX&{0hXzCAWZ>hh#I}GY*tq9m##in7qqsS({n_Zr=nZd%0!FEd>&_Ug%wj z&$|%yZir?j&#fpvUco^u6837yAz_QO4pNcfq}-KY5VEq?Ln<+(a<;iFo965ZQ8h|S ze&myOw=+Ah7L1=!TI!a{iMWL`XjlBShW03t8<H`lZ2WY-G~ZgbDd*9|NYPeoa-c0T zfw054_P<tsj&<|X%is6h=hwseyAhw>CAlhpn?ZQfB@*SN>aQ|T1#B{?WRm~MLhv~7 zB(MrR8=L`N0v-=u16G5pz!SjdL3ootf+vGbiBOWi{lL?}!QdRQ7(5-E3Z4a?4ia{9 zDTvKaJ^`K!t^pT<pMvLso54lkUZi6&*blrAJPf=@?!5Ovc)G{*N$*pdj{)na=u<`b zLsn^3KCIq_%)JY(YT#^_<vyDI_l%~DgAysx&B!ps>a;K!<_AAb`;04tD{$M<xS18t z7>%qf#ONgW4au;ppxNHOl5P3fb4otsLI&V!t-Z9nHP2xai3;xKWO~tazQdVAzH}*s z9PnlIVn~KH9kno$z74(Au-Si-m2^aPgYs9`wa8ZTyAEs#UJteb{|)LLw}3;y+d$ck z+ri^N>_GBF@LmvJ=K=5q@FDOg@DXr#-uEadU3naA4?Y3*0G|YVf=_{Cz%`)q@L6y( z{(s>Y&ujDvIXKR2emm5h*YppKv939<RqVzQ$Y0LdOsXF@8~<+RNyt6<acwR0zQ$dO z=3Pp=@~%EO)+N4#tR#<@!9BoNz*gXEpkDC?*bjUgRI~COa2)t9NEvqC2PMl7K*^lE zrwJ8p`^bL-e!2X1Op&>|;$}!kn;jXUOBubZo_B+H+X%{q5)t|y<b?9cmM6bOMSIVL zsEkVBY~@a6%t04{ZV$!9yA)5!r!JW15`Q3Fiu=!CQ}9>tAn-S^EBHHj2$+%KBy+)9 zpyV(CJ?s*b!ydI9M-j~gcS?~1owsR~rP@qgMy3h=y{n;jLy^sDSl{W9<={GmSE``r zaNjCR&wlN$I;$JxP&KBiCKu8?!^t@xSdVIBpYoyFn#`_<b{e_@TZ>){$tdQqik+d5 z!6=(3)z0obD<S<&U{zBqyzs=h(Py0HYo}VN1f`wk%{yDebH=Wsxe<}a)qaTM=~`Kv z*TsK>^(?+6K3`#wj~gI*m*lK`RDPk~=BiJ=D9Ss4()}I5GH@qwCP?Eac?O8wlhiE^ zZIC2&htnLq0&D?Z2krsh4DJQ409%49!E8_o*cV&}wgO)V4*<UdsdtjR(`f_l4boOj zP69iCcY(C6lB>Y3;EN#Hm;4gM&Lua22ZNgl=OPU6u1?*ougHr=j_vT5SJAdZYj(=2 zssoF;;-djAab1oueb;bv&^;finX_Zo8!`swvi%aT6zzxGSLB$z+(PD^{^8bPI-sTn zd>d=vt8@~?d^EABolNu}HJq~n`VSm4G{2zVkYR&*v1!++{%B0yti7aXIyr!ibPI+| zHoiow<I%jmZ+lIjFvD!xtZ>D#qsK9*tWpC+`jFWiu|vEp$6Sv?`~CX<_jX;c@LWCr zM5!R(G^Y1}<$X$G?PO)yq)J6@aGxQ0Y~o!o{ICJTP59P1kr+QA>^yW>A1CnKc|zIv zuxsxD{X3fkx?xW%JU;AvWUs-)N3v1)p8nelCzekNa~w7#zgKVLt`@2h+b|Z{^c_|( zXh>e)g258)K;BR<>uKEaIUv|+z&k@_SV@tyKOB8hIr^7WnGbyj*#lU#h}CHh>zkH! zxZ1hii7X@NRy%v)*f%vCv-*|y6gd0AaBwPv_af~AY~IoUzFRDxXa&yR5Vo3z0!n<n ztPyU^>?uTj)H_o8<n$WKJ=Au`dY4sk{!@W@({4EZMAk-ygVl>f0ApLv6c6dd0B@U$ z0!m{VG8s}YtC@{SKMl%}yk7P!tV;9FJ#gPO>VCLA)X6wE#`$&Ytm85UYvWl7uMzZF zmOivlC(}?qX}i|TddL!one&^-5xSfvpxtq6Xx)ZuC)|O2Vd}r(1?ylkSPqht0!uH# z0_=XhtQ|suX_r$In1s8#bug*zRmJYy6OB_VoDQ*0Va@BuFpPPxpWl+$RuqR8M7^w2 zLJ@YFK$sgMu%dlhiJ!K6ZHDIA1K|3Y1K?WV<1_2S6%=Z~8gi=!a(yJ?iW8re*f5p$ zde+q_z5g;fs9lZrn6&#2DswWKI1G1>#B$9MhSKDwG_1mw**+8bVs0Ove@RiqK-r9^ zmVeA-M00;6DQqxoM59E0ZX*>$M%yJC*IjUxAtK6srxkI^1RV^iVvA71-O_Fp<?U3u ziK8sU(>5Fg$l+JoGSQq4$5@mEwv+2oD(MSMZ(m~_Jf%0x8sYP#>#LkzG21#AJ;KzR zT`){K^oon@`%Rvh;>zfs3GNB&%hdq!R~BHu>t(Hu#F#CP{U}Q}uW`MZK{h_pjw?r+ z!c;(8s$SMY8?4nt^P(?OG63^nA}$;Aq2-rG3@WTJ@>F^T+4sB0Pz@;e6I#c0kSX@X zBU!Gs4w9t_MFmE~4>DlG++^6wP0>_i4k-_^Ekl*)mZ5;{Ib7zQQV7*GFxyacz*$KF zgD3G<nlk&98%jmtv;t#OS6f1FoiHS8vsdUfu5y|8D2KmElZhrRvIbSQ=#aS`JD8C7 zfiT?+y;M=<*30_Djioh;l=Ts4p)Kr^=%v=#sE>@J30P%vPViP^^(VRExH5y!SpB#m zw%L7j_@yR+*_IMEMgFT2HVx)jFB$h$_SLr3=tau3GeZ$&>+OnJMn1~oR?(Ol{qA6C z#!C5$ugp2f4W?vT2`BoQkTq5+br@JSzCb3~3P(9y>4j{Lq_cD>#VVI>W$Kq*)q=y^ z7n{@AObVsWH-xD=0ieLBMMw(@jEzZCEKR2Fjf9RbqA(Ox8L3aT;q}rndO>vWao^&e zS7+X?I6Y|PX=QJy%6YXxQD18~?5Ph0rde~B8;tCdCp$l^8P?GrF=wbMH;Nx&xu>ux z5AO(tZrG%Y=Y)s_<}@w!^-M;ZYJise%tEsziV=^i+q8hOm?{Yi!~QWBDn7n%HJFKm zIrD8Nn1hmG6i_36UM{;u)_7I+w6)=)02+KW(N%nAxT!)2M(QcKXc|=NQTS#6n`o-p z0@DWETFqzjJ53&#l)Gu+xFilgk~r0i^)gGv)c98C6rxg<S6*a$0Wu~-ZH!zi*=I^Q z=kKY_s$vwWE__QVWnUB)uA2xIuaDf&uw5n;S)G=yWQ?#?B2Ef<Rx65=gw#}%aPJRA z-8z{XVIRn5hi)pyDwDg%yDzdf+)h>bc@eUp#=Ay(NxOU0q27~fj*XB~?UprB>O2wv zT1d;(*o^05)q;7qY=%ZnU^QzGX=;k3J~<@!3`Zl`TWy8rHgi<S3BWL)Y2)fvW+p!? ztpC8=s1$|t4P&k}4X|u(LtWO)#PniUQsEM6x;Ix?2d`p_l`&;h+Pcq5q{3z@YNIBP zBDB~>+$xfZP^yv``=qkQu<NvPvQk?1g&PlRAWbWs_Jy=8HAS{UJlB1dm&E7nv)giV z)lrg<RM9r#k<6g?TraDWD<DGibMX~Rb7g5XZnk|%e_I*o;68JVl{Genku+G5ngXB~ zM5__oCy6y0ZDT;w8YqfuT1=PdDmP%S5rrYsNrQe7O>0n0erU*#z^qV=CZrRz$pKAx zc;-&U+}08@!V_b!52Z}T<Js^#yl$=A!CIGUaEy3&z+aC14H($h7(Pv(d2e?+o2KXG z%Ws{Hgm;Ld$+U|s%{y+@7(z%&u{{`6`jbX4j9#sGJ<E8w{d6OTmn_}Za;`&xdELb} zp=ukOM5w&okWz+?iBDU!t<gyH-U3I}k88qpxT=a$MEgwErHh&IsTQ2ufK%-qZw=Y< zlCXm5U0y!Lq;r3pPBV|M_N>isWvFYt+>&G}^iqv7t1v~g!Mt7hSWs5ZjGbwwx7A}o z(R6zb1Gc)t9#>dt%$O!ul+T{QVNDA0+OUINpOMJSZQnLO<Ad|E%kvMOv+=q1^*hYp z;hLsPu6p<BCoeg1w-a}H#>|yEiOjMGPr3fFb3YxEvqSwkd$#^(b^CAL&EI2M-krPO z^jwP_yUtu@=Ct5DEVEwI@zo8QfA)IqgYLca=C8(-?)htZ`!65ZbluFhH?*x{Jo#1L zpUAwb-naGNJ7bTByBwTdx%>5(Hc2%3bkebtu5JG8k3)X#dqj5zv>AhhZ_MS@?Jm!* zD42fpsh4hQeBwnJcaNNNYtMP}W_KFYsoBA^7~r05_%3|sse2n=f7sZGyXEHod~N@- z<Ox$R`gLs6_Y#$#o^Z?_JMQT?j~TvS4#;mb_?7LRx_kV9eeS3};ob}D9<op3#mO&r z`Dy!e7Txyjc-E3IE}O`F;oVxh-_&wstFKCWtiA87wha$yG_(1zBVSv3`-lq`_T0bm zUC7+<ZOJ`$b)7R``{?ms-^khJtj8*Tt2k)4OP1WdTf56U-0}T6ZTmUSO@{BK7k@ne zn>PlwY<cClUoxA`{;ueNw=U_p@30X&cl!MFPe)(I#9^&Wlio{rnt566TONDh<^?aU zJARj6mtR}9;J5?l%o)|`xJwT@ylN$L&4zF2v&CNwdGXZ8M`Uk#@Ao?&z2~7lZ$9MW z<q!3rkoQ5e{Pz!S?Kn3YzC-sq<;$O5s91F7fYp~AkXXFtv2V`W|F-pyT=f0gsyUy& z(0ZWbd~f&;npbvpkLB&}*!k99=FUHO)bFdyuQ>6tnLYA0^u0B6!UN|pIo_+b;@9}( zPdXg%(wjf^xUl`YeIH!)OXf4HJ74ui+lr^w<V@RsW6$=?tr))M8)sA=cu=!Z2j128 zsyEx*cG!m2m)z3)^t0bsdTzI6U-qu%oxd5rXO|X_dAi%gCeGSpmsIpD9X_yXS?0e> z4t(i>13T4ytM3=c@7V41-l;oXv)5;J&R^T&wnsWIsvK~}r#+V3^7PpkKhdTCzR&;o z{lnGF%Nf2sm;dYi1IoW%a?`BZg*!gku=Uf+Z=2rzk|Qr$UVoRJnm7BLGT(}}LLxJ< z!+=M>dSUXD%iCT4)4_93dSaK`yT0??ll$*+<-$F>-+AqaEEYK1@MVuY_MN-Gu2|e^ z(=|6P{NkFo^Iur}+Ngu;Ja+dl2mXH4%J(-o&L+dR=F2^b-mSjl&EFgEJNu*q>bCs( z_6y5Kz4*+B!}t2~nMuDMbt!8Kn6RN7eZIMN$1_^qv-yL=ce=RWC2w4?YU*nrp8n5c zR=2wBkZ<l?yf^7Ed<Pxhd6(B8S#`wNM$epA`LET()~}v>>)JO*@A}*~7fh}?py6?h z>DN<uA1>MR<$V|4|LjROojmvB8xHQjqDj|Ah22gcwBgHSWrrV+xq-Q9!?)YaU+>)c z_I=;^uG73X4tlv=uP5)%-u%(tA1oi+=G4QcH(q=h3sMZ<LH9J;>%0%&cdmc!>&^Lh z|2Av+@yFD8Z1Y3=Ej+i;*-!lVGn1R$n6pS^W}H6xr=J@iF}2p(@%wCO)^NYN?=(3p zvHs%IE?AM+^P3yD{{{IOKIg3WX1#ZA|Km>Xy8WbKSGRtm&bi+<>$qY|a&W&x_S}DN z#wp0p@a?tF%nmIY3|~3r=|)$NxVGtgXYO#)Z69s;dY?yoci-W>UEj(_eoP2bF5mp5 z>0S@M(0TcgM{b$?d{Nfr54`i~J9jlW{=~L3ZfkSZrq+&gzu_Bp`P$=FUHIyW4G%y4 z%qb=7U-@W{6TWDB#o@(|WbAt0ucOMbnR{Xb6Pf>fb9ypy<M1VYzI^u4KE1lkIPrjE z>$f@jmfM@`P<B|u{kOwr&ozAgS|43fF=O<YYa1W&@4VwDz5Q|i%!M~ioOAgpC7;Ya za`9tKzPw@hmfU^7<3IO4@4^;MKmYEL+dt}cXV)KVCq`_(cG`o#?)2GlpI^lqoE`Pv z2g|=&)cNGYa%PqeKjzlUyO%cIw0h3swPjD;aM0$mx8_tH!`cADclL7|p1iupprhW~ z_t4`e{CMEb(-(Yt#+DBA)_(HxoK;8fe)KfvJPqG(YbVXSV@#(*r+o8$&LJ0k)8?hu zuWi+--`d?9KX5}?=k0!FlBx4fdT-Ga`z&j<xz@u+WL$F9_xI%8^wOMXOTWmjuJy^m z$2>6Ugm)+(XBoaHe?DXR%VlTWan$`;*Khdll&+UwdD?LgY&p8uqN5Ky>4%o5VNc&O zd^_!ZX0yeYE^7LE!&b-CeLer7fA{)*`pXRut-j#yHt#q1_bH^K_0D?lF@@{yt{l8+ zPMe%M`Oe05%@5t>h0C*7-}YeLJ3fE^o&(O$ah&;vZ|!G|C+?HI<iWf5yJoN1H$Qhq z^M&7@vAk}_OJBM^dC=Ok-(fQAL&JB)gbCAD{&4;oxwVdcbKzTKdLL4L#WM%3=-c$B zG1-Sca{ZyFu||ps(M0AKzi%lWbouS44g042g!U(o8Ts^$wH|w{`+GC{-uT$!QL~C3 zWUk8ajeqKvi7zg^?y2YR{PwLIKmOO~H$S`O+VaPa>h*2iE|asLAAK`($A<5<kq6Iw z=pXwoI5GKc_s@5I`@<jZ@Bh|6W=*<f&HL5O>b75so_0XD5}8$Fh8?y2b^9MaKl{pe zIz4{mxRZCDzw<x7E4u2n5f7gI>Ar8A=Q!$fBr*@Y=+%W)&+fGQ_D%O`+W)2Dw;a^} zzOT0%RFsjd_w?o~uim4r<9urPW=(FnU-F`bb?42!x9Nzsv(Nds*TNSV<-YR#N3VbE ztOJkv&~enFPGmNDdRXnoN1iw5fi9QTKX>GqUEdfx<M_HqpFd{zL!Wq{@0gL}n9($R zUvD^XZi_>HJE+O2A7?K8Zv2{$Mm&AmN9T0vvgFojPn>$`((aC<f&E106N4B0Siaq< zZ$D7G>cN>~zwGhu$?qR_;9gHXf6<uAy}y3`gZ`|kL}wD2jSgw{>6ORL?lpRLt;KKM z|J3AX*H1d?<u9*my2qyO*W5lj|9zGw8NST}r(Sl}M^(QJENs}b!{Zer?%Cz`8?Qg_ z%LB%5JhoRs_v_KCyA0pklV=^YaM_+)K05n|Zn=AoUVCEMWB*uo?%cztWbAs%^UoYP zg!yUa7-=88KX*>wMX!Id?6Viny!@&c@0h)8|C{R6+tlxZ3kK}7-@jU5pN}wnw+^fQ z{p>+|oOsgp``@`ouSM%VIKJiP@hfk8vE`48AHHztEk(@M8@@Wv+|XlaqdLF7w)-S! z*&#>Y+wPiI&*=GUY0=24&aIxi_=_i)cc%qP`(=lR`%Spx->-M8KRNl%>4#qV;F~?4 zIPd8ryIp$lgfW|&en>NXjNv<}?5K@{&w26Pce}pv=G5CCUwJ|4kIh=$^yn9hMopRh z(6B{&&^|DH*T3tG?~_=zVV7<TA9v<I({lDBt$JR+_UPMQxah|-e|>1yQpeejFcX=Z zcRu}->lU>6z2)|=^n1D0Q4N0Sx8R+5lOKI(%j~<C?R>|6ZJ6#hd`CZX=@m1&?&!R8 z)|l^hUEZ<9x(5f=-=$xZ+~g_WyzuzuS*utNWB8mgH%{NJ{?I!o4`2KB1OGhyn4w>u z-El^%i8~#*bLCm5Y<!h=$<K!GwKrbsbNDgeZ|wPEb*;PR@BaA>H~izf4gY9;-kK|q ze&W97`!b1qL}SJ8$HM)mzJKg7JGFVL(WjSR`>*cz4}a&uF0WsA<D`2onfb}2?>aip z6^8HpO&9Hc#1*?ferne}zD*8Ye_!YI2kzE<)qC%5oV|SemUZ96UVU!(9_`*|&)4SW z{r2E~Ysao{eP4F-p;tUQ>b6;D&;Rbx3%=;r;udD-ch`FhR$aNnDFb#~nQ>Et6&ruf z*=5b}GYgLx*}3OlH@voX=3QqFcbt0+-w#Vqoj+pPdAIFWdVig%3ohu=aZ72Px+l$< zaQvc&mW+Gg#4Svn(nd{W*1K`=A*}{KU9aBv4JMs`(;df-pLRfD(~P$dd1d90`u$J8 zlJZty_<pOb^~$N|l-@mZ<MkUCH0n|MQ^OPXoVR+*5qET|nzr_ZeQzXx4d30*y?<+~ zXXj7dE^A`Ol^Y&jaL#)lt=<0GTfV#Rh)cT;nl@@3ayER^5@X+=b>L&yY?^lUd%M4T z`Eeg@%3hKDYU%d(_5HfK`>Ok}r}@Yxk=c6W`lr9T_2(|LdY3(x`|Y9!I=%k$GmlR! zzW<|MTSk1g<#lZHHxBE{;Qbqmj@jmY%8cTYU=?y{)%fw{)$Jz!jj$@G7irb9ep=96 z`L_b`BUII4{EV_G#s66#-r8zT2P!R_Ft)U6A}5WOOy4$vmTAt_Ea9%w+U>s;s3)^h zEt&XRA@~CG(pt)Jx7J;6tI(#F7Z+BPZKKfKNN$_Z{9Ls++c?m27Sxwd+s1)bRu!|X z)(><7Q|5_&tkthfw65;fW&g29a<)$S@s)|g%c?5Jw$B;M6tyXz?Q`1Yv}@lzr&IfO zIb&xq1TdD6IJtUTgj7^My@U|c1T{AJ#9&leB?r+bhF8rfE-N3~A*Vx!v3zDQbq2#( zv&N3<Gj;@nAC+SV4d=Ffr*<8?x9ixkbNlXNJ?)%X#F4>#pitt!MLVMX*-s<9Q2cKt zLPgImF!qBDB)aV)Us*WC4}aT4TOUg43yro@3-t|$ANqeI_7n~d7{?|Q%?c;vzws*0 z&nhYX@1~|~>QpkHQStw(%#Qz`yk*+|<Smu|lebiD<t=~5wxzd{+pbJkY|Hq%7L-+| zngsr@YG%n+;=S#pQ~f`A%m3shl_gb^rdIq{^Q15(A={>wD4bDMJ`rn|Ch~u|NO>xH ze2p!TZKpjaq{t(vZ2oe@V`XaFNVc?U!W3r4gEsPi5W$dSHCgLt*0zeN7Bz31K+U>r zKd2zd+b-u(uEOctNCa-{UQN9Tw3N0%m(uGYxgl4~7|&<9@g~@Rlx=RvwCdVc&Zwv; z54EcQqi{>Bwqf$=YtE|Vpi5s9{-dacn&L%;Q~tY^-xR)Zu1eRw{L5CQ(k!g-B@mQ_ zzZ{ZR{A=uo{3jt6Rm>{bCh0W`Lj2_Zl??YrC^SA%<c<n$194TB6izRi__tz|(i<#g z9EN3SfuR0M`qG5Phz9}saSKwr?F^;gA9g>RO!Kn8tT!0nvhr;akf+jWD}+M)kE9wh z6UCwWERgMAPOcYA6G@#7&Iq5M`o9uaPs8mPoTuY|C4>|m@>A=6kyOc`s6I;iTk)$o z^wKJ`!^k!d)qKXaZ9-K`ivw4;Rba?sdZ^|K)MwijP4e!)J-lFFk<+eh+BO<kLUmbe zwT%p5pu98LNC4ZaB}&^W1E&-fmzHg_RCCN|;nZ!E>{5m&*>h-HC6pS(j?X&IW~OFX za>4h41G9=+I1W>CtkmS&PiM7zSKrBH&61_%xp(!Q72Giu4c`OqU43VF))-k@bN8;k zljGAm`Lw0nF`bOxYuvl~PJh<oSlZ$4U4660$kLAXX%#+Sl}~HP8Xl&J32#^TuD;WX zbvTxGpnF%}>FU!C_Gv?X+6bREj<qyQ!xCPxdspANoVx=I?JD=KzLU=y8Ot}&y{qq3 z`Lt@EHV^?by-IjP-MjkEcC0tCwC&wHWaZO3`LvbXX}^FSoK@~!eP<|ZODt`Kdsp9C z&0TZDx5mAz?=)dehNZP|@9H~yGAGBhHQ}{%@9H}}xntP~zg+jOzB7(Hrof>UyLa`S zlel9V7FyE1tM6RH9aE&xmbrKJ9Wucwb#~kBv^wRDe|@ES-^DF9HO)Tz(4$2EkM|z( z#@X4>X}t6GW)#R-#xJ-~M?Q7_qf6h^{t?f%aJO4T1R-_fHW57j<vXP=e3{lI1n)f) zxle=`^0=4W|5sOB@}UpjO%(KOKTmg@LMY>75nIi(%Di_i;U@fC%`=6_zw)^YyZa9R zAH9j^mC}k?b~0GKYfEH?$zR#y45u~!WpOi{9RABDWH`C}m*vYa`zNUUXPBKWB&7_e zg8#Bv8QN{eSRg)@=T1}f8QMX{l<*8^1$P|{Z43W9nLEDsXO9r^wdSsyxm&_r4|BJk zyZ+{GBX|AG-4^cpn!9=^hIBE*S<jtvjrh$Qm|gG4{5hXD%%7i^oyeb8JNwDJY^B)A zpI<xsiQH-zXF0gn%b&BVVZmc-g3I@xBmcSi^Aw0eYH)XM^_(pkGg^61v-H%|Jmqh< z)P%p<JpH~<NjA6Ub#qqb1h2?DD=)iA{=5;{4b7WIDXP`^3r@;T+$)o}LNWQ~hWz>G zWG^&<%(ZBuu^=zITmJlkiqMw)1-B((xHrMSZ?5s<bo$B}eOD;I^Cz!tls_Ny$(BAn zGcr!vF@J%1*eFWJmGG?}xPaQpaqg4Nx|d~sj&a*bcb`r7Lac_fPnr-j(}id}`NH^p zgrbY+kU~btY2f^o4enl?y_EMTol8JihbmF?*W@oyZD6C4KmSScr@G+SPzDVoe-n9# zBPzt%pD$BzMvg7H3(0Y%9Olo>HfXcceVCtHPx;$gapNDllb4;7kCZ2-mokB@Bd~cE z6y|z`&9iXM1IE><N_c{;hI;Q@{#n85?vpdnULy<iX%@20Pb1r{=GMsyG@4tVXj2|9 zP-R&EG=cuP44a4u@=Q?5v|hK8Z;P{6^GfB^O3)-lN%x4t`MDJhZs{ezBL*VAy!j)t zM@WP@F84W>dtR^VIVWZ3IaPHKc;08HnD^vwx0Dd_=daTn6d1ZttyoyrcEP)bR)@oM zWAG#en#*YPOP^6Vy_h98K_-XitR@X^1m@2ZabB-_dVhL-o4sloEP=}9orS&)BtB7n zoAY@-W+efu5&Sr-M^<+g%ZVoCr>|^qI_v$N26yLW8{^T^Q;pl8-b<s;%5%=@I=mtA zi9AUt6;>0u%gLY9&8f;3k=yEePE`}{zM)gKqj%rLnNgl5&z*FI^w08nQGFy`R6onr zt6S$USdlbwuFB52H^H4XMXjI6ot5#~9$pAf;czdlMK7^CDzSJ^P`dL2Q5z%t_eDL! zNGT8<CHf>4=UbC{eS&}AToc6UT@n98oB~rVOC3}Sq<=(qe%Pog&qxuLoCdq3llZJw z$CV^8Wc}ByG4?Apk+VNnMQH8UAw(@?zqG$l{(NJq^E<ARwV|4WGB>-M!KBd|^Kxjp zqVYiL=VohbAy<{=W}9&EZIEcTc4i!a4(F@Z1PAg~;ZPSxnA&s!3^q7?<Tx{$!C?v< zc#=5t;i$InSTNVv^1yZ;m!nM}q!T!;7PCxzRd#Eiyx96!V9Tcx0*{nqXs*$(`SlEq zSZ^^-l*Rc+P;v)mx1K+swsE6u%Pn*D{6~y=$jpHIgOq^s{g8f14QWR&B)J74^{P!! za<Xwc#{@es-$X6Jd*w7QpXey#Ny8GcE~rLHHoGb8xH6?uqfW!C$-<6n%zN`^uTthy z5E=mLNY&PMM~-r$wxi98_Az(uxI4n!{e!z~b63cn^)ZdRVTM-8o%Nv)gE|}9YVP(m zcW2U6QjK5RxsW>>%7fh5P@d+FoX7P!?rbP;ayQb@KI6{%*oBU=^|2Rsql{}dch*NC zcgp$N&Of<Jn7jA6+uPiAtj%^x=B^ueHdd!{cch`s<Bqk%`281mqs`rI++~})I+O$Z z-bUPwF|;P!+4r{dUDX*s%DCqGu7kKc+R(;wXT$p^cVi9h3ZM2VcdSMw2H$dL<FXI7 z`dCBjz@7Db9CvE7)pllb*V5d*#$AcIdyuaBUgqw3?)EfyU-);;>v^=U{@oJp1{l7} zx!c#=-NN1e=1#+@CDW_4$CFcD)t2cA$XsRviA3S_k_3kZCYb$imq_#}oYtx;VV6ZF zhKy*-XL1QMELllE-o5^Mr#U`uYy)z)q6+P@+9Od~HodYcVM$fY5hs`_o6^So*Hamb z=o0E&2C?}&o%r<e`F}(nR`{MM>=S9PSqNlkTd%_{$!_!fu^Vye=<^;4DTE&<lNFVT zY2{T?pTzi*qQV)KC0^bn(p`mBi76#~V4YycpF}C&_iO2B!u>omQC684JaXVbF9fS6 z+bTUav~4G!xZJm0_!;$UIrVp`Q(<rz*e=uA?Y*puhU2JOyVPbYyWO0|6}yegXqM?T zJ56`ccZ26Nm#0B3r@^otDw^htcOS!RVuvl4jc&~kqsk>4?_IK(-o>VN{-w=jy{kAx zKg%P6{X+NJ#Lv4lFp!CzvqQF-X0W8Kp{WJcz}(5++q+%4Yj0>x_%C{<8E&w537)$c znyjb>6*5gq>|Gn4dm35}{~MXRPX1jt?$kQUG(37wrjyHmdzZ(Zo-&<${%hbOQ`;iD zcSE`BZD=F-uOW;~Q@hwZ)d7bY+V5PV<?5*x|3cS(+=oQRQ!7JxDyMm7r<wasS$g`s zD=I&DrvHAAzEd`Kc7s(thhILp(Y0SLS$^cAJ9E1K_(g~PPrqyO_ovqTvBL+~-~9di zzy7po@HJ&Sw{E-qjMWYH{eHrSw~Va#?yA{4oZzAN>Rhd#ZC6(O&1tnWerLx^Qe9e7 zSk*2kXJJN0(xtG;e7mW|W|-1a!rS&M)|nZSY4i$j*{{UHgA!=)CAh-d^-JF}Go}QN z?p?dkR{heG%!~~Lr`oaNsJXoYcDd;i)^gf~HtwgY#h143H`>wo<hR6UFXg4K?VJQ@ z*QK1u<rh#o@U%2S>C4jw5+3lV-7}G&i6Q8i;liOj20SyMt|T%6Wge6Yeu1y6c}n_} z@Ua4Qpk`+1U;$lajmo81T-n3>ckI|HN2<)U2t2xR?%+3+$KYM7p)B<&)>o%)DrMFe z>o|(0Dl+CunA|p-#l|S_yU%KUStb5Hg_4PE?B(&O{TZd~7oo5l!ib5}%a4!pX!IdU z>6=0so<dQ}HR@}6gkm;u&TijjxycKqKYT0$4JqU-;mXs$KHBu74NL#ecEd3|PWX@p zlnY<u_%F+J#T}==47k@7t}nx5XtzPplMP3t$Dt@M0-p6ymO=@1<2xv~MktNQfK3rf zM<@-U1R)QGqBsR1PlTex1tBM))QeD-D4Yo8HYf`tlr>OVMBeotl<dg6et^<C!qW%^ z&57_(d6^;GAkK$D=^5cEfsz{u=QJq!5uPicERDqQUMROlC@(?L6kw3{ub`}qQ0n8j zE<)K)6jBoS%HvjV58`|b6xn|(=XRlkIktzInW0?K)j4ncD0^1`4`$U|hR58^&`aE_ zmMz^K+qYK^+Hz`2ZpZc=hQ=wKm&7QYI&O$ly0j);;cz;29T%f?&RG_tbnUz$PU*TS zM(NhR8}bQ<+^u7EoYHA!oYJ`=(hvLU-feW8(p{6Nmd8KqhIFY7n3*AI6BYL&cypcZ z%FyuG!%s#GQm2iHznXnr>iRM~CLHw+y^A^}bm)o7sx9xHyT!-w;r3f>E10dbip&m` zE>%4gkE572u6G~m<#;3;fI~Afw2QXiDGD0h9>3d<n^iD@EzVs&chyWmsE-$Qsq{GU zl=>Q$uedu`YlEH{Q`ox8Y}I3S5)`4TtYXS61;L`d0<&h{d(h0M3ESNua|(MEvNKls z<QWwvh?2@m)(AM})S^BUONu5BXJgUHoV*k}-^g-!=NhqVOaI~dh0}`p<j44m98#oU zSie+0xs0>9-P4ua<QloVhbu)$Q8tq$QMMX#DRhpM8(t_2<>(zEmEJY=1gTU$@A#-R zE-uNcNNQAK^!8pR2lQC%0*4wSW?5o!@`zC>`kF|uFXkcYRD(Aua5NKqZ^kL=EvmUu ze^EDAYQ9#d3NF>jmtCq;2T!c2P94)a#e^R5R-@c~u9!#yI?3XJ4d4FO`CyeLeALFb zhhD)ss6(eN;hy;)o$=Ma1I^FQ@)4ZzRd{)Zvz=>=!<_{gNmc%T=8Uhov|)9|*Rs2; zX*~rypIgHjUyD~+9`C>53w0bs-=In3$HBKP*V#a>lX}M2fu}I{`vF5?<88&F!&MS# z&iMKleTP0XERPM*gqL#0R|RSK@ShpZ$VHY{l~TGhzE;3@FFeOxVEJzL_(Dwyy=N)E ze_R%QuT#SrUvI(pq01{Dxiy^e^%Xon#Q8$i9bTPr{4&Vb$VFnv`2Ppa_$n^lR%d)& zPXgoTU8$p{CfXc+>(~>)y(*8J!SHCo^m6wAD6fqtXSGb+i{mZ4lNYKWnIl42qL!7V zRzyof(Ya0bz%Tn;WuDdiu+PVtXN75>$2<NRE(;-gm*UxkwvvWR=DNhzj+0c}+khGh zVR$8}qR<Z98>BoY;W6icbp`23CUZeL%SjE0Lo?@t&~;Bv<oRH5I!FUOspK$hk~|g6 z1tp(e;AZd!e(`fMRzTBYf!p~#AIMSrwU=sF(1NP+g34m;(YCe2!*mEnE+JT97Spg` zJiwk?VM$X9s|)N2J32%q+h^sAYk0l9NI)NwQ9dJdW=I7j?^0YPOEm|JT_W8=Ehclu zgL_(flJuH0lLmsvL03By`6S_SDnWkc45br6e#x6aOiWTTKyF4>l51S&c7sL_)eKd= z5Xh=*+Dr!PIoNW-G$STB{HvaSrz2G)CTV1XA4ha3=~9}nc_h#MOYc!SX=R(vn;gz1 zUV8UG!A9UhH=Z|Sq~@t6cBD_Mz$b!ul8s)glP@o*(3Ph{;q$I&WdCm*u%z>2S`(cf zXoz>l3d;!7ow}rL;O+G)Fv#9Ykt9j0bSND1t;33>fLW70hafX9F?RyD&U{zE+-<AO z`M9=0;#>+@z2yWyYg-~`JSA+9I698<O4r`}c6I40zskQuLD6%;1Hs;)BHR~Lg8PG` z!Nb5wAo`wM1P%tD28V$kgTukkL3+97+_xh^&QQ^mT5^BzXizdiHpv0tIItWn1TO`P zz@=abC~-^xSAx7V`4Ko7+=X;Z1+|8^9F!zf_S6YQz{$Sg46q739-IlP>|G6>46X!c zgVNd4K-sI42s>`C`as(iH%*H^S%Yq?MY?s}-X;f1{Vioxz8=hv%Tv}F6!kz$!pcf} z#+hb#4YSd|tup^BV9w=MN7U3D@{0kpbT`WE*`;-s$^4h>bxG{2%$+?ePWdsPJZk}- z1MUaPPAQ$|f#|C_BW?tE0ng~2IU`O<yO`%{@G|f$@N#egcqORRTm{|;UIRV=UJE`1 z(k4hM0n5R+KzNd0fH#3(fwzGzi0>U>ckpgdI&%*w-NK%x=$0%;1AYhaTOH_@`Y4#r z=_SX_U`u<psFiLd;PI|{-VH_7o|~nRQqIj%_Sti@_y|kqH25DNV5Np+Ip)kzF?p9l z(N&vY8*_)fApVNuGoW<oSy1s^3o2cz@8k6r_QVX%DD0<F(q;PLN>W3dy(=|I37jHH z(!o?>x3=0!$efAlw}VE@*}W78T?%-hxwGe*)#v^_;@$}S5Zn{|2$T+CyUcl)8$sGW z&ZnT#@ENGIPU06&>n_mHddds3N=d63IZ#@0^{>>l$~ltOAb)avZ+11U9>ewYCgP^| z6ThT_p>8*EeHh(~pRJj-on7&|g$#ZsC9ZBq-sB9Py(<)3_kc2u6YGGov=z4MnpWhK ze~hi#AR2QFomVDO4x}QF&mOy}B}XNO<Q}`}Sxp<B8$S^j61hXO^%DEh3KlvmYYIf= z#*hqJ8xzY)wYR-JjL}l7L)3iuwufvQe^bgBgj29Xp{_90@#X{}(-NrggRL&8C@eO# zPSC3Od1o@J#h_>J_2N^2QpiQ*3c|2QcS?u1Kn!%)7ERjr-LtfIMOPs*@O3&-%M$fp z`KPNFzg=DW&*XQ1o__&{fWLy{!Qa42@OSVe(8=JeO`sMid&dM#65Hr(2Vw)AI^eb7 z_TXJ0=b0rR1$BnnI<O)5A-D@j7)~RwF31^<$t;jF9Ftl^q_fpJf_s7kLG&T1$(Oys zi$R^8b`MB9Ao&ugGt^!K@oUaRI|%%S=MG>k(nwfI?JcY`)b;~)hT1<sot>sLKy`N7 zD6l733?2$z1LlIu!QP+-?)efZxd~+YD5(WT{lWdgd@vWJ9g-XY9u5|OgTNW!VDKDp z7<dUd9J~n}1>Of92|fvq244WjfFFQIfj@vpgPKkl3+@3HfIYw>khyn<>GEU|I02jl za&BC57C0F^5u5@p23dlYybq+ElzbONrpXV%N^mpzqCASXU8u86yZkC}O-gwWMvqkF zbKvo=P?4v8Nn6Zw;f)kam1&i#P%-z4)I3|v?b$ObDk>JXpxZAi(lxkM0KSH=f}eLO zJ-T+_S8VP~o6XcqCnJZwp(VkN;A!Aca1J;OJOfm}>`ZVvI1fAlWJ1sA{{m2QIv12Y z7xU{JJL8e|tZ54>+-Fndse#5K_WS#j)pd&WRMUi{CxPZdT41DS0`_DgvUe#?x?~z; zmULZ68g>OQ0#&b3?o2&)38=W!#x`kO#(g}EYD1}R?96X%N*d|K73hoZzmrCtXQ?!{ z<Y#IJ&c`U6z$y)!PHpE-AC=SKj4|v0m#&ZZvBprkkYgzJpWCL5)P+}*F2(&?Q1NFP z%cS#s>`A9sUhYoWk-q*)8GSC2&heq9g-V91CGTqJ-T0?<s%opTG8~Gd&1culE3sIL zcs`GV6srs;LQ1I&Rd6DDqat=I#7Jc*;zWqrntw<}6`P3AKk*7<O8q89--RD%e{QvY zTjKN0GJFb90!*pjnh^7}_1hbmUtN*<Z3Eoir99EqouBFkU0_nLc^Q=Mz5=Q}zaCV3 zjJm_rb8mvD@cb62F)+eS($;rA0Ivq=Hzp;ikHLq)Pr(<#&%sUL7vOi`W{^75`36*b z{#%f`%lQFp1O5m~BYp-)g1>;+dMT;t!)Ab0JTvy4#HKiPLCT-QdadN$;11yZ;LhOV zAaz^vRgnH{@)K}3@HenAs5-tW*aB<@W`lgGnrsiUgeqAI?g?r-e{XOG*b+Pq+y`6$ z;wO0}xG#7+NFADd9Bd7~2hwj&egPf?)}buqfNj7IpuTZsIYDv~$k(t*Ex7FhUIcap z9|GxbCs%^q!PQ_7@FTD%_$f$TZOS0+MaCEVp_0M%0PanAyc>KmD1)W|atL-wF|&gz zfr-FNY)~~^H|1$AwE<e01ADJ*V@;--K~q_sDt<cNR)eg${<98K4-Xq2Z=R)RmVdfw zL-Ob(_zlVMVkKKv4~l&aLzWywSu~l|V0OICdY(38YQeOUvI!H%v!8}-(b+!NN_={k zWU#KT{fg~Qmv}HbCAstjTY&T<lly{<nIzkSy}%xz+BS^Yn6}MWupiIkK(%d3K(%G) zubDPXN92D5&(s0V2oOCrZI`K_+A6Ps$AD@JVUCj5gX6)QLA6!1?5Gq}Ua76JnQ)IL ztb=2DI)sX-A8uX1mx4UiBC{D)B_>Y`G!R)ht;lBXN|?P%B6Tmfuc0C<^Qxx&I_|B& z?H-JFgnT{JaOQ6CpKa!D^q+0!Zt|a}8*PzsvHmB_@+%`tU|*jKza2lmv0_p<rD9@X zrO}esc+?3!Lo#e7*2xdZ475rY0>yJ<%mg|9&3k+L?1k+OA<rjFsJ7aoIxiO)dzWM@ zUD+2xCzr0eUh;krR9oOlP-6|N!6o1`;8Wlla0~b>NZZ?43(}@_o&!$=*MZl7&x0?5 zFMz*;+$Y<i8?wKLg71URfU=)DQ$zMrOY*mX<)G}N+RL(wi@{&P%Rs_1_Ca>?Tb^m# zCw~KLgLSa`vX?u9b->2p_Fx-O_LB9i&W>Obl)d~XD0{gal)d~3lwI5b`Cu!PEkN1D zy}`Xe>FV43;<_sPtMPz`!IuMFHTI{lf(hqpb}?|3))*og2JZ^#YE6ygaq#xfmWCW( zK7BF+IWjhZnv|L6Ku0E-zGa{nY+qYaZB!$dfUM@1*bZn81goR=d+K1kU<EGTrSwT( zc7?!rmAMW^9!j(9v#R~xp!6vZ><#t>`-A!52=Fja?c{;rQjo=D$$P+|pz2HdUP<hb za}-D)#W@<R06FI+c{(@_yc8@1Zv%@!)q}<0{on*p@}~|n`Sc6A)iY*O8qhRUyKX!1 zl~_J$G|4w8Y#Lc%GHMyz-qp~%p)l3Zn^_6V22+$P%V$i-FsX5~8e$~(qT~0K1vdZk zVRNei<E=H%Hfv@PuhLSJ$+-{{#C}MIPE88W8B`Ta3dUODf&)sr9+CWMRL%y@QXTU; z)XSw*+t-E1b7{m#@VaC`NBg{$1;>{aS4}ijDYX}-r7HExdymShOdX4qm8D9?5-XYV zgcyDqJy&OgeVL+P0dImIV>Ha`O);-34*9p*t!Rz&sak&|omWydoMYcb+u0cA<Dew? z4apcktE$8>P4t<H%VuI)>X=_RRwomyG1vz#z3U|3Ls$fQkC)g$1l1v`FM^~`Od|pr znm2-%ofYB@k~`O@ddc<T?e*^{TmB{8R~c5Bq>P&Dbjpg#!x><6@Sk9N@H}uZxCk5$ zUJRZFUIsG0?OYCC16~E*2{IRwTnSzaYE1h&@ICO~;1A%9;9kh@W{@_8b1SHM8rqRb z`j*a}pvvz3;2Yor;P>D|U?y>W7;FeW0w%ymLA71ifKtnKU<LR*cq;e;crN%NNSvKl zK*G`&_(^Hj>)>XP`{b_F9q)nJ;QL@Fa3eSh`~=hvEPPUyoD6;r&Ii8)uL3uL8oME^ z<SXDe;70IUupZg>J$M+%($(Y;a0@sB{0WpU{RU11e+Q2TolGZr2ABa}1a1f33)Tgt z4%>rYfjfb_Q71J3_XSz{nCuMlT}JXKurXKwHUZ1Qrr;v5Id~noC%6XWv$*8*U;=yv zYzeLh_XR%yTZ0+sO<PblljXI>wthoY<6}g!;qCZo4&&9pwyM3Rg$-W&^$)5)uNX(0 zXKEz}CA7MrytGu)z#_{!*b+C(Bg<$6Ma~vOZ_L29v(&CCm}w55w9~dW1k>CSXM#Xo zQ|z_KO~t5oltT6{rCDWaM^I))*Dz!xIk5QD^e;=nGM*=bGeP=5$+_SZa0xgSyb+uR z-UqToHTfhs9ee?-1UG;)L74^hDRW}=8e@2-{lOTYvp$f$`NEApc4g%sNL?m*9N|W4 zDYY@$K(w;4ZH}N$vTfjm?{4d`Z2x(ZX>a84Yz0|7HDco%6VoGb<WhEZ1MPbP^Og%O zss@p{=oL77m(m|^pPY@n)IM1VN+joj`+$qUgTRYH#ej00oB>`9o&jD1%Er-eN!|-C z2iJi&fS-bl*(TKor9YFb1Ja){bJBN$oq4_s91N}iOF$NmC+X)n*oma_=YCN6=x`sO z0}AKkYe7D;tgd`o@&6AqQswE7^6@$3rF?uDlt{3%CLdn~m5*<O%16cuOg>_NO+J1C zDjz=wm5*P7%EwKh^6_g>`S=Z}d}NH><l~Q^^6@87`N+7Q$w&GaCLezXm5)wsn~$oS z4~Uh=@z4}!HFI7M^0B12s+%c^Di+>V&%1GIY*psM5-FPLT6JEXKQ0K*Q9M*Gwg*SJ zboxX_o{W*1c6&2$U))-Ny+P&{l6m0XpxOZ0;ApTFsPwc3rN8GRgZMZMeL9N089Q^{ z2-02Z9vkbg#~KHZcm0X<SHK%dzwA{tMBCJM2PS2&0{b-Gv@?|uYgZ~+Qe9YV+R%ZK zvPLX0a@L3`cdVyLri$stvu$%%6>#cjDgCc>86aA&@3pd`pz^qg$$J<#CckuP^mZU< z-(spA`Of!A)(UEpZz!|`zabe$il&ER{7dI07~1(-zZJ2KTcCTF@<ck&0>bAmF^@b{ zKJ^8aO@qN!ARn2TygvdQz%y-?<VbKNI1U^IP6J1SXM;zB*Mnoh8^Hqb0k8yI1Jbrh zehD%kl~mHFgL{LOV0VxYRFa2*Gr?itDd1V)Z14i`G;k?+I>@+$b0)|*gL4-663A!x zX3p;%@GYJffYQy^`NiiWG=?iZKcC;5fo|GCdV37>w36fhprZ7eCw7j(&c*5wZ`(Xs zk)`Zl_d_kVC@|dwDdbob&L<nSR7M|dsFv60QzwX4A#7J%N}hlg85a-w=i_klE~PDA z&M!e0O7Eqh?Br!&ckoJ3<@{fu?8DVyIe0C263F?X$t1W8lq{F>>l(9fYTq>E*M{F) z>18>+#9OEbkAKzk@4N*k3g&1dH&+x|e%S<~EpZi`U{f%@u(HG~%S=FT$&ap}=-OTr z#kcc&xzN2!@sm8Z10_~nw~`*cj1O^=&A{71S%N!2rQ=Re>6I*d#L_GIsk~^+^zHQN zjZA34=3jpz$ub8@vQ3(q785A}$toH%FOhLy>5q3QZb~c7bMv8_=ns$<#rHw5Dfke$ zH~27kAovKVv^)wb&00g(EtclDYn%1B&MNSo^l1()^w3<5cS*|b^=B4(<lr@;0aAR; zj2vs!!d;jlVv<k?kZ1ldn24hxM(Tkk5XV8Z1uRs)P0<_bv%4cSGQ9Dk=dG?7XI^HO zpPD^Q{lZ&AnUt;aF3C^%(jLNMm;My;K7{9|!G7Q~;1KXxQ0Z6;7J}<Q+1VFC%|*Qe z%HF;PE(PfeCLaXf1Rn)Afa}2bz%Rh}LA9+u0yBB{$6zDyQ*a;fb1)bD0_+QJ0%d<U zgPMc-24vpb`4;>)_&vyYu=4}R_^<Ob_&N9+sJSHyTCyit3oHk>11|#Wg7n>;?ZJ;h z##NK_S)H9h%?&jG+k^CFlk{(#-N6&VrXcNirx~~eY!1@ScJ=^Y2loUu-?|s5wGaug zH`o$91#AUsi<Z{lP2d5bKEPu~RHN^6iE_OEs(E0w**f#vkY3;YMOZoTcvouq&c!K3 zp%V~Ov_^T<jh}ZZ4$>K->aUw?Pn;F64xpk%Ki|wrGcRJ&a+lm<W%o&F`|(@J@7*9R zQe@4A(HXZDUD%F<N^MP}o8t&Bk_K6+i4ZHYRVd9gn?~G}q{)U<QDxgoJVfd?TaB4@ zgB3V=m*QQI^oQ4FFqdi89%!CGcKtK3EBGbYAKU~MgPK1m1-}K)02x0@UIuEubvgJm zcoV4k1lhb(`Nh|@Y2HJ2b11*}(#XwMfCLQQm8t+zj}$pcC?Po+2`K+_`FWS#uk?rO zEyll$Ew2q8fV<{5R9|U6Sn;d}Dn0k}i??|sPfritkEVwnWfeoz+e{VIGLkCHH2Lm^ zZiZHs@X9~d2Fc=&bb&EIqYGJ}bU|}B(gn@kNEcYcZFHdtC|%H8j&wnD+|mWj<wzG= zg3^V3K*{b#esOys`?@c`d-#2jUUt4ZC?C8lRUO9R6j6utvQl9RN{*Q_^tu_gFsXdm zW<Xq4ifg>w97x&}{~RzEY!CJZH4m>bUCqBA4Qk%K1k}8HC8&9w(?INbaxQoXxC}fL zl&mC=c)58An)K{heji3<RXMS+V%r%U2}D|Us?jGCwy$F+{W%@0#=CbZ-jdsn;1rkG zpL8lMnzxdU4FJ1>nzxdUY2K<B90E$mhJn(t5ukKzBq$xzeAeBd=Cd@er}-?&?*@MH zHAIqIf}hIkN9pAECp1l>8HfL{Xgrm&#m}ge`YNqqvn02i+DVxN<cOa7HtH-~yi0MF z%ytIVU(hw4v?V~zy>$f3K%>fFKF?FYG2k??5TuQeECQ#4lff!*2FSXT<Q(vLa1mGy zE(T8oSAZvhlA-1p;$vr@L6g3J$nWE*45yaQWQkb$AN1|QOF;To^J%@7fQ%zFyLt-$ zUUg?1<!nD?S9K_*5pnv%16C!inks+t;H={3E%#OXRq{!dx?SH9mb=mym;2esLusB5 zsvmF;sMs*~VamMba|ZFe2s{Q{44wd904nd6fLDN*fH#Aef-6DhOp<HCE5R4QrJ&@# ziC<jqqi6>z4nx6>QMqe9v?up*uy|KJ?}pkh%|xo?u9_es_i6|+xl3|?PVTbLak-C% z7LmJGSOR0~_bpe#>s?B(@?kd!ce=#o$VW2Je3$a!22lBMBiIYP8Ps^nEuiZ7+d<im zJ3;CDU7+%M1$ZHNAGiX10F>=u?kf2vxDwn5Y94G0_$atN@mU2n2OkHuCgTZE<10^r z{{Wu`m4D)mw-q&)u6D%@;3v`i!#b1|{f!J%7e2^9*_i3{*6reyYF-t|*d&DiD;djs zzvj1&pLa<X%3FzHl}mgH*-1VxgIz(*CFX*!g343YJDKt4*TG|XehZuhz5^;RH-MLd z?}MrrJ^{Y~Su1DO2Yw0G=DnIj+z-?oVh8YBQ0pPS1BZi}ODqPrfHT1#!MWg1p!%1; zf=fWnDJriu&KA$>BsA&g3E-!(yq+<Bo94B2AjoS^2Ray|nj{Jl9gyz--_(JXyx+Sd zqj>qQpJ~hW4q#6hcLe)_nui?>Y93bQTJx}~*VvfItR2;S>~%bAK34U<=3(yzH4pnX zxCi(tsQK8RK+VVQ!22~H+XCDh)bPkYpmZS{l%3W5Y!RsWS<Nl+{ej7I+3@(<q)E`! zr%{{bvuK|4y|OXU#mp~Ftte-Z?Jq9iS3@?JaHC(qsHT%`j@Nz(XkjaCJAo>LqxpH4 z;w$;r0|&aqLrI^~kP9jaeZW>=Ur=>wKd>J-02~Jn29@3+pvuBhe(}E1Znf?B*3X%Y zhXisli|<{F<*mVAf_Lv~=-u%4tcLZS9$8Xett?div4Z>ZY*WE&&8bMOA+635$t=BB zm9Ho#_?cy(8YYz_BnORpd6(iRIS`uD#-)!XJ%{jo3@BT3EGT^|1Q&wEpys?vK<R?! zp4B&)0ImVcz~@2DIZOY_!G?rA9h81)j=2h)1zrc91TF(l1@8fq;1l3%kac_x8)qdy z0Ox}A)17%B{ceXf66PD5b3xj{X3q62@B*Hx+Z@JplGJU^r66^a!@9oYdhl{k<3v}0 z*gG>fi;kN)*`vT^(9Z!i7yBfrxmM==wC>mB^W~)JAF;6zEnTV)opssH7peKIJ}_U2 zl}xKD)b^mJ1cdT9woF(GpCGVkvqRY|b+yXPYKKCT^HAJjkcpalvg&T?ob_^YFU3#! z+=OT4k*<eHkK()%+y#6DYz96KwgaC4HBPk}><vBxs-5>NI1^k4%HF&H-U@2&^g~c{ zrfMg=1}4Ba!I9wG;Cyfc_z3tO_!#&hsByoI;EUiV;Ck>2@EuTdsvAMgsY<?^L6tWZ ziFiBlTHKYUE9Ec9hsug6th+NUjX#jRq?{lCeZ0xaEzJpN%8z2=3VytK=F!Utzg#Ik z-lcd*-aA9^`Y)RERooa;G~?pGfx~$I9jul|#yJ-O8Q?u&EpVO4;CJA5pzL)WFb}K? z7U(_T>EQOD(p?{ve3tNw%jbIZU2(Vy{3=C0s-6Fyd;-NR`qT0X>!;!s*Uw!@hvM28 zYzt~GS@LQEN?uLDD?rUHuK=5atHBoFM<8RirtPyQxD#^O3p@Z!fJ4BRpzP2-;H6+T zD1F=)Wc<(B53EDHT7iwh)?jCFe~^B;a{zb@cpymM(P8~>QgUqzO8%V)BVHf8hkJkA zXfr#T;_}zXX`rJkVe>AD*S%sZ&9j{C&{T6}_o}EUnO00a9FR;GQ?-E<Dbf*X4pBK^ z72Rt(nSF~ZX_{tbZNO38Wj=mlcM?;A>}t@B5bYSFwjxo1=?3Lost{@)DtOZ|T>{DW zai;T0L6zTG4Oh+bTJ7^qDd8Jfua4RT*}Eh&=|*!1AGpLG$XIeb7#srTf+b*Y@HDUw zcqZ5%{5O~nJ_`;2753qv+CrL(u1!820jl4kx#-cL=Ay3$$AUM4h2Trzc<^_y7~G9` zm4I!)Qm`915j+Ac11E!%z!ShJApK`&D)=vO8c6@lIS#xVoDNE71`>8$XFl7`>dXt^ z=CnHFm)i{l;a#aZBOS19h(JNMrZW;$iq33-SfkE3L_e+0)WacFXMP|{U7b-&ULD<k zG!&_7A~U-a%ct1o<IAA`8C^Qd=Zol46W;AzlBIMh0bxg%ek!t;E+s+f(j4$8@C>j5 zJPTX^&I4ti7l3zx=Ys3Oe}X@Q3qigkb}km3_QGW#b)0iK_%XN?r0z0v;A#(E$FoDl zvK$-&{u{gkybZh>yc=Y$&bbHt5xf`Nh4|kGwgK-4wYmR;pib9&2%H9L{`F+=5%4_l zQE(af7<fPU1o$xcBq*J0hW^EMt{C@jxE&6DolfWMaFbf{xgqhU>YO?jX+Jnr`(3?^ zaQnR}G`-a}e3(CyIn)G#mTuc+=#e&&H8lx*gw2Y~U2A9&)eSGQrVu)}!N8?h<bqbc z?AW(dakNiUEG%8T)zEDeG|pKRS$ade$ax8OE?KrEpbgdxiHZ~`sF}qI$4M1R(n?bA zS%K#RG3=C%s_9cIO@~%t+jJIJ8w;($8e7`*?UrkyHLkTj;GBg?jc)O?7{`~0Dwp20 z5nQ!b@TOpOw^pZn`);T`=3UYam7#7B*0}WN&?P-<PB|BR3Dmg7tKfL>HBfV5uY+^J zx4;X)x4~<{cR^*z`{2Xi2jFV(Q&8#FT=Ki%S70;VsX1fyB{XMz49Ff4=6epxiTOV0 zCs5+7&HUwMpyrD21vxY$`3hJMybzIV&Uh5Us1MSQF>}XNAmuDcf5hQvjU@dIGk1Im z*qG;kgPKFW5!4*=bD-vqCDeUD+Nn-9xD#r|y6NNr;C>)=k(n!|jxck@lfbsn&jfQo z?1`g!*z>`T;8kEJ5Ido>HIu8s?%*q65AXw!@}K+?><Rt=9tviVKe-_D-cE0jd2FW- zNZg#hAYnTBU^j38C>wAJzxaHC`Z>Gt)A-UifepYimrr4+n?snVF*Yp|&;$<e!hU-f z!>(TI;Jj>U7!92ErflTG;*&ar^eo5o3+nySGsNlO-CT9+QtxsH-Hdx}4=Vnblc(`9 z3H99+-b3KGLHyPCo?137_zK5ts9`?bBoOba=iMO7G^58#mrR>2;3fnWrf!hz;&0QC zGP6dqkBdz5)m&2FZUtexTm_Xg#upTtFEQ8q)M*@$&Q>}FHVie?R^euge&ulmW;A6= z$+QW45u=x?KW80_rkAq{Tm6-4Kd=h(JlcOAPdm!)>S3ecy^MwGRpsf|94f$WegK7L zeToXFeJMu-%cE@f5}(P$v9e^sRJy!w_L@Fven`a1ALZ|U`0DA>4<tX8XC<IsITIWV za@wnz!<hwE@O%;|ojnEAxaX<hQt&kJR&WmZ2sjs93!VYK3!Vvn3(f=U^3JnC*^_g? z5^y1SE4UbZ8oUV9_s&be_rQz6&%sMT=KP(@K<0y;E5NScRp21-Utke<4R|tmEqD=l zJ@^WE1IRd^b0f(25YFvjckmAIFmMH^?-lO_8E<j!2d@WLf{aTzkATv9#{5&hKig2p z>iw(WcU#f>psT@*w}1VC;!EKYuv^8qL5S8GT3qv)6b@;=`V{K6TCGtDbTvmcR!F^i znaZx32-)z8`k3Mo=$5Ckws^?5T6pfuJD4Id0>a*efXS&Usi-u|`d0WM7MD#&*)<L$ z&s%(YMSJ5}IvOrdT5O_rxgT*;qC!R81T)$XW_)iGOag-SVpm#v6|)=B98-m>1!N;y z#%fM8I28R%Z4jCL3`|@m0B&sn#WtlMK(KF7E2F)!FJpb0m2d}BV#oPZ*LG+L+mawW z_iGiEWwoG2`|P1?S`n~YS!rA*czp-Pm#{rP6Q2=NQP_O)mkt{{5Y{;9tL(s`q_MWE ziQm_=cA#{7YX{0e*?|gBbG*~RVz3%K0XzY`2s{zI3_Jx?zmJVX&37)dLD|W<;5*>y z;5XnIpzOez;O^krU>9&cs4=Sr;8gHjP-83$!G+*?pvDXqgUX%@L5)pb12!cM*MY2o zaF&A=;0@qS;4Prms@)1c58eSXH{;w1${ySe?gg#@4+8H4{{h|)9u7VL9t}PYo&Y`p zUJO13UI#u6-T|%w)gFBoRNrGA*r7IS{lJ&OS3ufG&U!G5cED?(juCqu)FEPTfUJXa z-Uijjcn2H<z6Y)VH-b-rpMbxCpMkrPkDr74gPXv9;AXH0{1&VLzXMMOe*jm4zksX2 zUqRWkTEsQ}J?)j4B-IHQg5Ph=p84HiN!+{sggr~b?%FdGgzT9HlHHP8&PH^mCSM3G zsL53v1EW-&XUg+jbilV0f6c%J_9@lCbtBk_fm;G$Z;}``aO?jMd+!2QWtIJnKU~z~ z5d+ke)bymM#Jq$_hDCK$)MKHNVqsB$ih`mL925(0p@ktc);ML8O*Pe|)5UIMSk~Yr zwKCJP8A>a=j)axn>0<uB-?jJioaY=4mTA4e_y7LRM_KDxd+oi~UVH7eug`w)tbId( zgNyS=9w4r?5`<tO`5pnwz03+zg9$o68ob4?oSi?(foi<rC;W16*k}n{q`ct@q;i^+ zsu^!M0495ds$8l+&Z;Es4c#F4-I4N!cOy|nvwOqU7FByg4$SVeh>CTf__I1tO}(l& z`b;0mnT0)RDSD%yUHM3Mjeen&kF2qnn)i_&RZ!>y>)9}4`pDtH6E(e;Q~Aid0Fyxf z8z6n;8bJEUe*jJad<d`*@NvK;fKLMc4e+0U4*=Ex{uA(Nz*hmE0sIf(bATTM{tNIY zz*@j|kb5KG8GxGr=_{WHoCdfRa3$b&z^4IU0Ne-o65!W>I{;6D>^lLw0=@!xCg5&B zR_bejWq|Jkt_J)Na1-E1fcpUJ0WXAqI0$$*;OBrmulohy7Qn9o-v#^z5Nqp3BVaoi z%=ds;>otA^OaMF#cp>0VfT@5-0I|+zINBgxKqnyQRwn^s-e^PvV*X~t0%Bfev;*Y( zuO|cE4;TmNg%9fjI1}(xz{P;w0B->74p;@~0$dK*6L1gU>40&l)82q{0M7!f1WW+r zClk*G+ygie@BrYsfGuDLNq{{7&j&mUFc~lz@It@^fWrVQ08;?zQ#a!OMM3*jZ-UkV z|M%ekw|<{$o!t$dB*`?7PT2e*ee>7c{Kx}_8E*P0S?!>A@q!fWRntK8dsT9|Kv50G zeqDr&8<r!;{ILvd6Wp_1tcg=lW|k`#uq$95U|+!LfLxE50mwE|2zU)(G2jxw62Kb) zX9IFRF$a+I&ual61H2CK3BdV)y8y2Tr0yyJspCVi&tM(zg^pO@jew1TI-Zt`sWb2D zm{eFgYYIMw2t?h)M!#hKVob!^1*Rtsxti7$YO6)y1EO!aIdxV}0bb@T&Y7uJ$+jc( zRtZ&0cd{t}S}8I?FQQ&tBa!ZIe=LdmT1gVK!R3O@f~ek2<D8I%Q}v`?X-l=9)hlfo zcn(^x<GeY=Vv}nMSmTf@pvFn_STz3~2Xu1*%X(x?vl!LuaHQptQA*4A-b!S4S_GO} zURGDP>oVI{;pRok5lb*iXIKX4x8T5mc^X(}q1N$Zp(+7w8}L-meIP0IsC%4NThDU? z)(tuC!yYw%OsUagllwS0ZK?rDHJfS0`FKTFMkM5|Lx5UGv0m@{3M5sh>h(VRdY-+g ze?&DmqDJwf!VJq4R5VWKe?%CShDFHIV!Vc<FL5_V@?RjRQE31e#*7Zt9y5U-)bxj= z)Y;5O09j9K0ogZg0GtH)93b1_MnJZ|&4AR~7C@e3+6MS6;0u6k?=J#!{QffFXMj5a zzXjX{*a1b@4R{LR9zecp@^8S)0qX$s0N((d1NbH&$MbsuZv}h{kiGfafKLJL2mBY{ zdw?$kegMcm>?6Q4P_}x&VSpb4dI3KLOb0v!I0^78Kw8HSfH;q590uG4_!A(`U>QdM z+p*5uVx9mP0XPk?1t4vq6(H9c9e~(}H(CSk26O^qKiy~x_$A;;fL{Yf14h9jV*q0T z+X1=&+XJ2j*a^@B7zcPMU}wNZfZYJO?${mhF2J6E4*|LXu@7PN0(=TE9`HrLGXb%N zYxDuc+N;qI5bw_z34mC$GzI`(4VVbXyB-DsegJqb;1pO}65v9>!GM1UJRk5uz+}Kj z0WSo64)7wt&45DycLNRu{5RlmKw7OA(17nx1w09GG~h76v4B`RGA;$gT9GjU@D{+! z0I}v`WB_ghyb^FfU?$+VfLVZ-!+s|NUJsZHcq8Ccz-55>fd2rT4)_S*3_$w*_woP2 zpuY7c&^qIP1^$26jNiwyAFhDOFEI~;c)@G_Vobycx%5a^pADAgU40%x?b|AJ;B3cD zTs{3;fUBn`aDk}YmaX??Ter)|GP3VQRaox>-U6Ml+-m@P06qlBIsL<c3jiMjq)r|O zr0#H!i{S~<9oEzEjs$!+;P=hwZce^0FAImQiwknFw8Mp4x=i!;3$z!5hTOdN;t(3F zJr`(Av=<LzfcEJ0?}i+zqf~3XX?PCk1I5Q@TU0r;V=k~NwX4oF87%5~x-9BY`}W%~ z)uPsFP+j<s7q<)Y@iI7H(x&Tv6tqX&q}z@il}O$x2vP}4_e<^!kd%;IL^3zsq+dW9 z0oFhZ@mMs~Gc$=qi^jbuYuk>dw-P}Coi@8Pn%;a7P_k5G5_|u2KeWr03jC;^4S-7O z$ui5Tv7Ym%h@iC~xbR;t^v{|sYgiitXgPt~b=we#SNQm2SGoz%h5y)m<~@4;Zj)PJ zGWO)0#Qf1tY5(IuSf%OvVb`?XcL6U1{2Fj1;5UHd0lx)g-}oKiLcs3<{|fjM;A4PC z0NK}tout;R!vWvLa|Gb0fRTWQ0b2mJ2}9chY!BEPkms%10G<vQ1vn6}E#NtTF@W47 zYX>+9@MOShz)pa-0G<MPFJM=|=K;F|z6*F7An*3<0mwD2o`8b@-GCDSPX{akj0b!Q z@Jv9Sx9bPUHSR>fZvY1Ywn86uE?_Uf!GKAC=L3!e90E82a46s;z!88rGiZzg#2GVV zEa2OK>42XBP5}H7a3Wx9Sjd%tIP+s<0-g<c72t5ds{tnh<^WCuoCH_^m<z~(ULN4h zfF*!W0G0yM;^qL>16~XGIpB4G*jF?b0McNt2TTK80yq`$2EYdaD*-<RTnhLlU^U=S zILJQ&jsaW_crD<~fC~U`0pvXKR=__3-Uhf1@GpRy09OIN0C*?h0l>QfTf*k<0UQo^ zFW^+b)qw2l{sA}-@IgTO*EjG#cu((k&`!tyKjHrmf&NurC}6&|NylaW93~<?5?4yH zK~ZO^f8q56&$!vN^sNQbIO))y7V59No<Q0p<uHFN8{1@Sz;sP~3c6r<YXHvzTn{)H z@L9m2fVF^=05<}1jbt-mIpFhv3jwzRQkQq(fAG6|{Xt`I!};ZpA$9q?UQZzU@IV&x zNBO7^n4)z*!OJKQW!?$MzWNnF)Pb=JkmcA7$nw%>4-V>^slRCa=UKeNA<O&wTu%@@ z7NK0hW05+PgR;H>cnaW~fTscO1?&U(79h*<HXzG89DXkN{t28V!`M#F{TV-nEU)cq zf;upoKPp)N^l80XJcgXNvwu8<z$R~UH-Z>&H32)`3=r)@6Sl+z&;n1!vwMvPRW&Xy z>DU^W3jwMhRiisHCxMnNEs@N&s}MX02<W*v_ACQ2^ytZU_P7%IG=J11>xcGOuIV2@ z@6_#wfFl4u0%RZgUqJSe2LST{KL#uYYyi9t@DN}X;1_@#`+N!bFyJ?U&j5Z0xEb&V z!2N(f0)7Yx!<9A6Fu(}N5DCaWvn5~>U@Jhr!_)?l^Tm?@7XadO0t+7pY!CP*;K_jD z=+im@a_zD+Al~IPx&WpEb_1LU*c~tj@HD`sfIR^p13Uw8CtxqY*8uwfz6;nF@KeBk zfIk5C2W*KxE&;F);Mss_fQf)Omv5W{xE63QAkGgP7XY@Ry#mGp4gowFa3~<{y8{1% z&v=~=np5Z)dxW%a>xEDnnfVLs3~0a}1T`^W7l;A2Bi6yTOLH@Sl!3MZQN@pvJ`yrh zE-xU(x&-hXz*Jq9Eojg#qgCu_?Lg$GdB=_$HGE9^kn~Yw$7H3Cn=m|mV%l({hvo<i z=13bmK7IVKaih}GEuJQ+j2M-gnl*0JNN+m!BUDaJ(h;82;Ukz#+t@X+6ox<Rdr17+ zkM%X>-oZR-aZP_ZDS)*zShqGwPOkfbG(lnZWK5P;u`jwgH5-rCJiNF#Yt$@!>J95g zLyD)B%7KhCP$sgpvREd}%AZ+Okjqef)Nn*@j<2*hSISPlD2s1&en|<JE7OYA=bSN^ zP)W73Sj^l;7R)Wm%NkKwj7y1een+vjx7dc|%$il`%NmCh%TSUqORX}$4i=Z0*jV)v zk<neJ<7&d8zOihHoMSPJQx_!-D=aQ9Ekfz6TqXsxjK!RCYC+)~qo)xS`&kE7ofscN zjUhfueF~Tkgkmaz{86#PP!9FGHn+GCM+kB5rd8}rp^i@(ku^MJ<nXKsV^W5X7&T^i z3Qj1fz%auKOho`T6%{?)PaigR%&1{jK!hz|!cYX9iWoOp+1T60n6XHZQZQI$WDg#8 zIVRI8P~{d7h|o9`i_4I<V(C*u9T8G!6?j%@L4ll^#8fmYwlt8gr-qO}DwY#K^^+)S z5=iB7O;i2k>^VNL=>oNjG<eckCD!|7SyM}AO)imwePX(Vv{4zuQ?o{oO&OkLm70Ol zifw_T$Br3m#SEvbumz4BH)JAgp;c@K3LUwy#Fsw_3?ow~rg^hQj2$<6NP5=LQR$<H zq=|VerUGASVKCF!3F%Uo?T}P=Q$jY(u`{H$-p7Ce$>&cmLCoP}hK)@bHD+Yi_=`u4 zmkLqAF4v@K_TaQ}s;X7!InzWoEAr4$BhL{-*J;nnnPZQ9`H(T=CyW_sbb~~SBPXwL zx}D?VvECs=C7fUS5C=JKIIMM?sZ<m{RW!%&7Sx<Q97c>;d8^pZP~0ho`q(on4Fi8g z%hfbqoP<KQjpgU{)Gzqs&@RIf`y%o{4x?sGE*2k!t&P#SzT*7JCF61@8@<6XtSQIH zT%WiV%{c;A0)ZW|`xNVV-0KDRBVVn{N}pSl3+Lj99o{q@Mr1x&IH~4{J-;b~nNdoP zFGq5T2H#r6M_LxV($AD33r)olo315OU!WhBgU>Xud?zF5d)P>z2Cys=kP9ly5!+d% zFoGY~hFC+U%;uL1N<^wt5#Av%{F2<_S#akP+!4WVs^C=YnT)}AbEMGiL7%JWY1~fA z<v0F1fr!JM6lr_`+<0nX&J-(^S5<&0p8+gGXG92HyevtqjV-ZJxFlT?qfR=h04dQB zpAR~bpk4^NPzBkoVnlInuH<Xg1+{XNO2xp?5j)=|Fua^2cCn3+m4YvISY=zU>LH~# zADu<kumWCtOJz7z3^6Jz0s|scfXHtJ(5BhJP<^Vh%^o#BSD9K*aQxV$&d~y(eH>0u zRnz0=nb5c#u?JOFy3<A$$W>{$9YW~<Ajt4plMA^OiLS^I+tpSa-A067XQS(OB~|;j zjjs8{c-Y=vROydaUv*5u$=2dhIWkK1wAB%5M3#Ce)eaS4nxZH<OwmM_mXR=vMJhmQ z9-7R>97a_cvj`!xvbo!oU^+P{7F(vGuk8U64=bD%AaV%v&cZ@~BX+rprffs(sJD_U zC3jNkG;d+yj4ZJuR>>z#sszndLfP6sR4EP1%PAh6QzV*XNk*&W#{2N{=gh28g~HE( zmO6kg%~A}txKjmCi;@b(9I0rd)fdj##(LPIkIyZ@;Ydl@i69PRhNomn<<rx{Q1p-u z^_iO`rDVShx*nrR8B4OTs2ZHTw6)K4UPU>xvc!dP*A%gb4#f^Qy+n7LFxr$v8rJid zA!<y@#a8T7-4vS0z_TUgo*)$S`o=7NP|6`A5st1<p>it~I$uX@y)Kj*B@WH^rSs^u z<k%X)s{GP5aMWavKGy$2Z<Z8I3ou|%%78&)uXm`l#VqM2MO3=&3V%7oyHD3b$Y40P z7<?E*Hg&to%sACzHK^e}RpwR{yHm2Vaw)A0<u?eZge@v-)f$-*{oRc=L7|?axl(=_ zP_IDAq*!Mwn)o_#NNhK(?z40<Jl%jdN$E&R%=kG41%;E9UTJb$G+n9PYWXbnIGwy$ zxs-!V;z2tVP6XXCE8S*2%1AkLvb3XYQQCC-KqF1Xtug7U0kJ|(gO=t@MstIyP==W* zl_7qiS(vA^45gE#N<}v6^gL}Ds%4;iWD?IRMXO2?R<=}*5+R=QRBCdRC8Lsm>a^(y zO{GdKrd6r}N6Tk9h02CZp^?^v@p*;C%EF(pr7mo=@MSh)R(f&Htdgmilt~S<=scD= zI|pwSl<+bls~KT@ij%->bj$7W;icG8t=JsSLWa~rbR4vo4O$iH+B}&6NAqkr<FPx1 z*<}iH;;1A`B8)=dP=;QvK04FZF9Osct)rh3AT@tdaZd4EDHnV7qqIk9{@k#mdYBAF z<3z;Pex;I{Se1;!IGIOGvpQ8buc|3oCt`)^ZcRMI(YkbL4Iye@bgs2H0-qk4BCV8P zR)hqW=Mc}Bro__je^>$T(vW&!3l8W3tuBB@dyBpLWWb^n|B+4&j#yG*-S^Nclj>wM zEw@GHP)>Xk?;>`@K4TM61xY8^6XYy3^&EV`*(dfhM`xruC)LeLCDQtA-GM~sk`W57 zEL}?doQkfe@#A>ougFUon)XOit5=&grL9nThNezd`BTnOkR@6MZIXVB^HMQbxmHd{ zT=67HhQNHs#&SKw*l{ry_d}3Q8c*lI2av?sGDw%nyEUq_d{lM(de}!t23-jAjjHIn z(-$)+Qt>&eRj!lG-e%Y6=;(if+K}p3b#HX`pp-#UU!zo7=;83$A+*J7bH$n8uE;Wq zH~kJ~j*i&BssPK-13d=?DN@z~d*rZ@9Z@qaU21lPDxR`lk*KL<ie4#rZgKIfLf8*Y z`x7mQ>MB$Ps2Xirq%7&vI|llC^!NFbZO;A=S`t$Quc&9;l64bd^#zQSl+|<55jAS- z`=xLJ6)oN-QR@|%h_N%he=C}<0;xJ3QN|3k6KOGvlt3d@Kbkc{-)zqpGaRult@V@< zdTos^HYY$ws?Ma9(D4O!%UP02(4b%0{U(*KcC<2~yhkUjM<$$9(%>z>6Vg?RO8A9v zXi8~SOf6JJO5fZNAU)KB>4~y;_Fs8HBG^jDk@UuZ$cTv?m0zTX;DQ_5?Qq^m%UQl^ z^8qbfO!sBGxaPV5nlZBo8as@};S-xV6{!kgyTzTdj@SgIG%9tt*f<xR=oI)-De6M^ zdb^a+=8#$J{30!?_H^3QumW#W+~f7QL%5#_DE64#IhGSg0JBu10`>qQ>|1Q$N@OTq zZ<_9`$=uYymEYQ<@>2sBJ@r!^$?ZyWoJNVI%V@2Mmy;ZW9kUv11y_;u!6E&mYTl;= zHE+JOq3eU%(oKqvPg)d*U7@BZID6-aMN(2fxVC~WEue*p(S|Cw#N_NkPcE24h;gSH zp>kc+v_L6u@CaPFYnKvaD6X8BhIgN?U$f!a4V$G5?2uGVaK}$NDP5m*$+}n4&P_Z# z*AJw}3A92{fL&U(C>7EyvqS~7^sM|s90``%4I2ApN!#g1o~+5mK66kYr&n`}ON_5j zVw~H=nk@EnBJLWU+L(FLp3QGvR+yJQJM;Rxha_CzW<$lZj&b=rpBuGmuet-n6=6(# zsQ6@O+LJTJ@BCuJA1}Eo?bDkEmiEeP+vlW`%J~QWgM(>2x9y6!IKpwtq_XHP4R1!C zwf@ORKASkT+u_0ipKdtx_u2g(?B|Qa*-qiR$MKc(y&F#b*P!#=C7m9)BhD4~@${>w z-{0ls@5UY;e(B(Eu`dh(T@ia;`|eL)?oI8{<F4!<BRVhodh(fX{bk_k<I+z`Jh<fJ zj8({&ug<t4Cf?C@_NvIWn>RdCy=T{)c8Ay8pI?1VpNfjh60f=AtV?{gI3FZ@X)jOt zWbA7To=<l-zIWuwO;0`7?U4&_U-R6^X(=Cc_P&1+HgI{?#ud@-k-;}!9)0<a2?xL0 zblc4PDq7y<{c_(0Jr7U5tFB9B;@;&r`!0MJb)Wy~_pcV+a^tA&e>u~&V#nq$D|<gy zxAC@bcKRwlel;Fvv$^l+ig^B>9`AlTX-<zl)h(~<_(tkKZ~jltO;5jY-xp5|xwbUD z8}8`hy>Z|>Yia(y=dBs=#7U3-xVY;4%Z_X>{OfhAW}la`fB2&j(>5%_ChSz<>o~9e z>@)Z5`~JLJ2kbii*)2atytMtCd-nD#dSOSxtkwsT2jIOA;d}Y+DHC5z%8N60UcIs? zdFuF7-|C2e<o4OKp-*C~w}yX$P2j$f%(vT`zrBBE;TJ0(o*S7HwJj$8#Wjx=5B|&L ztJXN%we8aRAlmC~!slu;YSU-0&e*o5|DE5TzqovByT{Lc=j&~~PrYmTse_-q|3hpx z^ZhngM3)1lC4J87d|97=_Pb|a-^VWAAODxNU6$Om_wGL=t^Raq8DzT@2P9k(?g>}F zv+j$c6}=AK_t5fB?t9z&>WVimJHO@TbwBnwaz*X?`*9D4@a_2Y)XDFbJ+bdd$I};; zpV_L%50BrPf7xp<eK@}Rr!P%Ee8nAj{{!PdS4957&m#xk(BrAkKe(jr?IZrO_s?5q zzVYFbKVG%H*QyJ@T)*Np?8yq>$+HhXdD7#jzw>qC(!FQB-harpXWXBEblL}NGW#yL zxVYnrRXFP`e7U#0a(Bwi>Hi-3c=4LA&bjBAPbc@gtzZ84XU!P!!KZog6SiQF8vCfI zw>jsudvoKKOEcTQbaTnywvVgZzWC9d`!YJb^5vgr_|A;E2KTNBU)Yiv-~Z6@(wX5q zC-vOlIp&O3@5EKQ>TbXO&o!=YUq00ON4&Qqd>^jt_WJ3|pLx0b;dzVy`{4N_YvRsr zpOds?^!`s5mYn_FRk#3b0Ct3t?^Er&-~8eG#shDB@ws>1PjlDIxvJ&n&!0PE`5)Tf zwDr3mo=3e2pHcbV-1q)4@|t<)ww^xj-uSI8|L|4kfi;Z_$BekJTkpkT^KrIB_`3I; zeRkLA@wEjnw!b(1{!`w&u}%47AMO95=cb{9+uYpYEicaM;-HT!;?;fir*wbz)pOR2 z-MDtf?#Z!tZg}V8cm5eY=emBSkM+IhP&|(13*WdqcV4sQ*8f}=bIFn$3v%oJ{n4q{ ze$wx+mrU6h*5T&EmleWG^}(jID`IU*S<6Eo@9p{W_p#UBdTp1>M}B_6y$dd!JZ#Li z(_(I_oIekD_z2(V`R%gqzJ2O9dEX3v=<l80AKrgj<oPADdQ4q-@bh_pyM8Zh1@BiO zy_M_EeEx@_H{aUzl!ISyeEg#!PoDc-q$~aN`)56SxNXBV2k*iDcN_BkabNL5*F)o1 z4*T@wO~Zx^D!uN^tDSwXT>E%joBWGodbdDtFiZGG#9x_PRGKmI{*IUaBW2F?xBu&% zz5L<4iaY1$)-S$%#bz8Rd|vpTE&S}3bLL%~Fnj9ws~){`@YGWdZLe6dGyjDL&-y(7 zt%{PXP+s_6_^Uh1`rqj;$|`<j!5xP>UUysAx(OAJCNEvOC~<UR=kw?OWZ+;q`F=dp z+kVWyTfDGt(x{$KlwG_2)>aqxbiFp?wL#yvUUti4FHe%Q_~4t__P*{7E&sH$>th?w zxus;(4IiJka_x&Z-M)3u$kTU!_szd>dZce#ruXW*;hi4tF`?IIx##VCy0Tx)h3#i| z8F%>`cR!x~=jF-0JN^^r?}Tqn!G!L&3~Rgor@i-n_}$>;$@5=dy>vkCg7jOi?K*MB zlF#ACHwoVxd-n{x<f?BDB)?V`{?DpT2OoU!g0J^q5P$QIyRO{&beGfd@<7~4%=e~O z_HVoQywO*@clt%wO#80SNyXJ4-_UsW(w+6MS8Tbm)0MO2oFMpq+Btpc6B83JD){o7 zgbV-tW#2t--rp;6#Li9~H$0esPK(1hgMhPS;2XKAtk157Pfx8J6Mg2P8_&C9<o%Pc zx*#?F*}pxwG3DTHzMODG_$F`dxw_Zq;s3fc>@W9x^Hj>idn#U@`iZ+Ny#D;FHcY?v z9r(3zIIsl&eAO4u7Eg8EzN9*>$3F_*9^*KC_D}s*KX7p4=buIPa`eZcm=(ge?S~uI zyq<r<6IVPF`@sIM=bwA$UDsc;q4CNgw_Mq${M#Pacf&gh!gp29u5~424psC`Xz4W$ z?CNq+yI1dYZ-4CBR!<y!|EV+olz?*;uzgp=&W4V8J>4sxU3bQP-4{Lb$_-tXe|5u} zRs-+Y^T5KhcHZ<(4c=)MzAIn4<FBRXMj7u^PW-yVnt@$+J)7!mHzLlnaQ>ICKL7b# z_@PMHsw?8d)rV`k{p;+}4P)<GHTLyMJzjaK?%uft3u``pvEyA^Kg7F!24`2Uh_p9f zI(h2;_pkb-w-NTp70DAf-C8{U{s+%kIqS^F67GrI^EvKw6u!Ssn>MTV+dtjl3BP*Z z^0y`qy|D1FFP&90{FH|$x-Z)Jz(v>NZW!VF<VfSx(RV(6{kSg+uN^RN;)E9;3g5hW z@O!g|KeTzpWpgJ#i+rJLS45-d>g_FWeB-0%5ARKASGl?9r=qh?{>#dBC-=Ye>?gii z)(`#BpM`JI3v2UUTmJVKc0c*mTMzyBZyEa<*4|&Z`HCT5wHh?Ty*uL(j3b2ajS1(^ ze(r+PtFK%5)!>62-v030XGXqt!QAO<cf4QLxz&KX;ja?fGhg4taaXkdd+$rC+;_c` z`26MB^G>Qd>4L8(-}6TLvp0Qw`reyyu2lH?-1eX4zL(o}YJE!2Q%3F?zxJ$=Pk+&3 z^yILGju$__>)uoQ;f$2<UHVA+XRjBwf9vV1`+k+sd)oQQYn~kceDTK%9j_0$<3Mtc z2{`wIvA8Q@?u;I1EWB-btEG$ApOW5h(X#&zS^jElo7lVlwCRD(m3^-I5a(NkFYd*0 zksU9;xnjehRn9+5nAl-&X6c+(SN>^Yr;E037(Q`AHqHnN-xvFDUflJ<pU#R~@ZX5L zzn-+?qx2WA|7cm_pp}o#+PdJ5yK%_!^plzI)-l!J6}DLL_J&B`v$HclJ@4Il?_b=f z`wP2on^<z%7rQ?g3BM+MpQp}TRr!(c$JCsd<g=eIN`I=|;}1P>^QUJ{I&k%nticb! zo@<4#^wU{6v%;Ua{;M^G^;tbu@9O9t9CpfCYtoAzf4%1ypDuV9gSw8)_w5;T&sx5^ zTjNJJU7F<Sma+4?{LL4v{=?!+3c@<f-~H0%V{w10@J)PwamDak-mG8U@am0s-t*cM zi&po3xTWLJh(G^%RL?X1))oE!D&c!{T;w;4MxT0J`2)S5Jaxz|yFQrH<MT<ikG<C8 zyA}VsHEr!=oWjFlC09htmmWMXt$oYGZ*-b&tiJHd_5JVr&kf0kr%s;WJEzwxw|}w~ z?OgcoY4fiU)1LUpn@P?Y3*T9C(Ou8(OWu0(i<c+easIT4pP%v}%6gyhJ@BqEX_#yE z{&q>rpEs&r>al2JujB`IUisLow|#fx;pgVwt<IjhBFgixI51|}Ywx~$?%sVfAAi2~ z&r`qa-0R^@pWJd;!J_BJ-Eu1Kx`VHDMSPdjd*=IBU)8qn3++F?^ZvgLerEhT&klO? z?+;CX>MyhFr++;V<7eUf)1lisUHaD!&o4Ol)UOt%)jfSqU7wS?Y<ch91B=$Q?$K%= z{9l9cZ5lkR+Z&5hetPzdotbs<PrJLM{dLo2kIlWQ>g!E^{$xbgwa_!qYei&jxvS0m zQBk#F4@cJ=_#vU)j`26<Tsq;L<n9l?v2*r6Zyb-i4}|aAyBAcYufF-Qlczq@a%T0P z2MuhT+Ok!7#k4uMJhw7?!*z`~cZ`Fpu83K#%=hQ^*?ixjS@*uz>D@c8`RI_lX5nXd zw|;u~7iELDJdOS>P56E)3IF$kWmDHpIPk!M>h|YN{XXW}ZcDc}Uiw6$Z`RINPk#t^ zw+P?5SKfcL*UMEiTg2vt-L?N;)yv-dXlLvD*M9x<rFWb=de&vT@J^fX#ZRbv@v}#N z7&Lci{$|ftw`@p!^M{w7&zthhM?)IZ8yeq4U-TtR@VqYgGwi%fY`IRy;$KN7?%6BI zpR6wU$n+J@&d;5bnOmk7Lo=sheb0xriOiDX$(cA2kvY|ezr~pP^`HDJQpuk+xuA4P zu0L5>ki;ep(w)Ms$o_f9ldA9RNu~J(Q;shYv&1+KG&O%31mlY^xy2_qQI+}$PPDLy zcgLLIL`!^A3i2nNm_(=gCdneNmD)5M+i;D@FUT!%#g`=w>YaHxUh>2T(OsA1!!!pZ zWa0>gSj>Qg{t5jD3{FTK&_5xw6qEK$$TcN*s+H2Q7;_Udoa&ogSWxJ%<KqwumyhK_ zJWDQrQkkRkd2>bKRG;gz{F2g~0@rw7>6HA!%(D~DK09+*;mnz(I9@V0^Ri)?=~!zi z$s9c%=zzrj0|)mXIPjbSgELLJXHPCJo#o4)nfsgOQj$~fo2HK@px)k{JomTGYBpN% z)Do*S$7L%vm!;k?v6B5Qsycrr?xW&1#&4R-oZlsvSx3p`*EIiM>z11KWoEDQThw65 zi7d7DE?G0>(86zO6TYL!ed1hM(eIK=?(dRI+3%9e?~)0&vZv21vh3?v9A-f4I{p;! zX^xq;F^#{49<#?V+s>Sz5sg2|6KB>rO={^_RA~0|*67>nb8<?3g?V_g^!i%}f9-E1 z{8V4zr0FN97oLhUSbRUjQpAbTFFyo>(P(kMnK>M*otV_8`eqhR$tlYJRjCCuC*2rM z^wi78116Sqev>-pCKl8!otQeA>YG-813tg5ssq%Avm5>@J&t19JP8k&SeiSQ@&*WY z!Y9*wE65VdU(yrj;NU~?Rc<SbV<~wP@1|$kbaK<s^tj&OucqTl+47tEEvb^slG#Og zLF`w_?XNMu8**Z*Y^o1q`)RiR?YN4o6<Jg|2`f4$)P?Dk;T8Lplol1?ROhc!VUwyi zd$<#nn(qYK4pzG6;*Q>#Cq^{O60y{fQ!v>|^tWi61^F|vdSYd9TqcD+8!tG9ntdK~ z=TIW2@hq|YB|qkrO#j>L{QG!PoLn?F%dfoSkWx+xp2*^s;P&;&c~*+YQm>}(I)RQ0 z#VfRRr^g~qQ#Zg75)!n^=2!cP>$0p>v#b+miRcFN3qwf#s|}EolM|bwB*=S@u$pa2 zdR(<-^JP<P!;IrflY>0Gm3?9aoa%#x;eAXiwco;=poQOhSx#k<&_92ce<k)fwajyY ze(!diiRI7CndYB29A{z$lc!A0KVjv>dv>^A)G~nMlnt&)?KKz%w*BR!h%JrO*zB(A zJGrAlYh!H3Ut&&!m;5VQhQ^#m6wbJf5xy9WIr&{_O}o#c@%|}n0VBO+jX8}<i^i`% zGSta$72>2M`99E?li!<@%i!7=-8AOpx0N*CHjO!rLlzBRtC3Kr!8_GedZ%g3X<Tg4 z##l6;MJuyt8*mN`M-3oLt;U>25zc5Snona+<4%i)uTe;-(|FOM?X+mT_fW<C!J@ew zCe5uerxAzqQ`qW7zFjru<URPBh8yq&LwSK=3m1I2?OiaZk%@C2ik7W0r?C$hwo<{j zUt><*d8}!P8bf^m<2Gs=W0}UB#!J9v3+)w+IeE9G=If#{q-W7^6QzVYjk0LmaVBxg zHRd!P2R27&>okVAIOn4H5;f*D_(mwU&>_nXjX8}JRHUMLHRd!P0*0ds;CobKPQwi) zD_Xq9oJO)m^H{VMz+4h{rN*2_9k4Q??bDdk_?G8Bg!Y5RoJI`KWC*Q;#!zoKw{WS@ zx@ycRXCCGXZ5(LCoJJ(h87Mx7#+>r4+Hu0iuM`r4UQm&WmZ&kOu@V)Dt$UPrmByUL ze}G*pw7nX08ri5w#WzJ`PQwEwrwd<-#+-6#^L0X73>q<~F%wEweAj5qX}oFC-nM8( zP_p9lY0PQ7WzpWXXzuPNU%bYg#;VhBubkw2x5i*EJxp4;#-P)lxJy*{x@yd6JZI51 zSv1@Tq4^>;244c~a*6wa#+=5Dr<=4YjltF|+764h`V95`;x@)Z8gm-|239WVy{R$C z*URMVsxkOKU=xM!K8+zRuz4!3#+=4u@h0CtHRd$B_BLrQjlp)$#C=8**P}5s<31)W zQe$Ypz)(=OUyZ>|`<k>48iSsJp`hR^*O=4z(W3FXF@`#g0$?a8_=+^<G@b-DUuZQN za~do9n|v!Z20xU5JC}qnTVv3(McZM~;s@XZ1H#u=V@~60V7$MyjWJ1Mh->lfu=uji z#x+R7hp!O`20n|n!=fb&#9f8Lm#8tPkq>O4&}M4PY3#B1>MXv3MBHyEd_@|A?$0r4 zks3q01a`IXt<sp&cm>!Zp}nRtr;#+s<V)5Vd=9WI;oGM%=>A-jR-`f5Mv}S<u8rZ+ znA5lv*!2>3g2tT22NvG}i*LnXbstz8W2MHN#tXnIB<{-^L%!#kd_@{VzkfdN$``&2 zjX8~*fGrl<A2jAPyvZhCs>a}RF2FfF;Y-n&)0hoxiO{aqnA1qT(Bw<gnA1qS2-l<u zUy{b0MhUPRgf>TGPGg6~x69&7_23>#;Y-sP>er&xS+vBVIDaa9Ng8t+8!TF_pEeBV zpM|ehV@{)Qib+e*82VaZQ-p87#?Tgqo3w0=fi?o~+zDT{#+=4Iz-|=U{Tf4i16C=t z8jYd-jx^(zYYgK9FWwIjz7-mC8m|LeDzrB=<}?lfyGdvVHRd$7j56bH*BJV!OYnVh z;d5xrX^a9^CA85RLmoP`jq!%YpqErLZi2?p-YnWoi}spD`;SF)j5gy&X$+SljK$rd zl5dp8Fb=b5K8v;;SibP>(3sO`m4^33gw{r5P9yD7lP_IkPNQ}l?wS_9EgC~RACEgl zg%+tXr?Chfp5j}gF{hC+!K7ts4E2GIXNJUGp)sei3)mlownt-5<Bt<fzCUTqX_Uhu zs<`|tDlxQaIIseVdq87Oqt{iq>r`lcG=_YEDZUjNL%W1ynkjs#8gm-A0b4G#J2d7r zKFc!szSJ1T-q|Lto5q~R6pNN;(cZLZZ(B4M8lcM8tugomG>%yYeS3<=oW}LQZWh`N z8pFH-jYILpXbgG*Rw#T6HHLZvc8k!qXv}F`3&T}>^EKu)_FA-eELs$dO7X>L4DA<{ zd$y#vUt{RcQ3Z;2pT?X<Jd})10_EtdF{kmUMSIes#X$k+IKbCcW9Ta^+A53YKw;5I zfG<j8PGc;vKM8HT#?XI2V8xfLF|_F-b%%Ew<Dkaiv#&8}85(mMy^EPX|M%0F(-;jb zN@$mA4E_aJTcMR}41GMXlZ3WXV@~7y61)Q=w4XHQG`joLcTU<EJvHVu&I8s%_%76# z)8I?h@j^RUV@{(Fu--yDOJh!B7_c*iHd1349{}qkv`HFs8gqd4720(ga~jpa1_<qD zjlmDi!Ck9i)WJ-R!PkLjs&Vqk*S9R}c=+F4hOg*)=oI%&7hOU6u^%brW^iWNpu|kM zgvL4(+P`SZB;yNyiojTi|Nb9@!R6OK_v1BZKgSa){MY8kyVpXc*BtFw<vZ5&o6GnA zH2uhtBMW|w46@9Oh-yK{p8|byhW}A~2kr3p`UP8}DW?zHqPb|j!SX%|!R+#~pJux@ ze~CbTPx;M!e<_RzVnpX)<P;R;<-nuy$FjKvQ-4@Chwb^dMuY2vpPk9VC6H#m7~mh5 zJoG;HpIP4~?Re|2x%B6#%V)$F(q_!x@#bfy^Gji{euK-;x<4NKZLa*Ld?z}6`Ids2 zIN)z>AOE+>j}0SUMP_N}gzE>_URa6$7W)6cJpIX&aCwjIM}Hb)dp=e)xP477!o?E! z735AuZ-wjV@~7nq!Uz0T;=kR0QyBX*?SV4=PyGe=S3g(Y)hLL)e3e1ZEHD56PyGd# z7hlVen~qt@^mXhAO`kW}S6o2430bBC`0pa3e>H${<^$kL{I~0;Ea*8S=oydyPyJd1 zl{N>@oETuDDZha4&Xb;nFKuPz7=fSE#ateTJb2HezQ0<>#`o-i+4Wx+^js74yfWyy zEa*8S=s79q8IS+_JAoQ#6_i%a5ZK31w83F2z^r%m2}P`fT3<?rtt8+-Cg??H<G)VF z{&ilG%<(S206Yb}T<N#}>d*n$?WZQ_nR9)6cv;YMQqXf;&~qa)v&XLsdaen2UK#XU z7WAAE^qds*jK}}|{jUaoHw|!|&;GNw-zh16zx}iAcc5y+$J&1RMR9xkY7A<BbwSTH zLC<AD&ly3_NkPwXLC=jSygmQApy!&P=aoUvWkJswLC;A+&v^Xb-~Vdh|2G<l4l0Sc zeqzq^Y~N3ozC4KCr~`rf59Y51h`l{l;@LhwJl^#NGoSw{FfvFGQ-7S(WU2471aOq$ z>HnlYer~<&c-QaXo&$cS3e3Z~=GW3pChEg(KN)zo+mFfjTfty`Fz@d8A7;4l_Y}e6 z@wc;J81TyMGtBS+>moES{&p2C4S!D+jHT!%ST_E$j}DVlX{QOc9Dh~HD}kw$?*<l! z|6#_X`0Em^27gt`wZK%$+kvT+cLC#$UYM~Te>toUli4yla$tw>mvtE?GqiIA!-IS) zILzP&eR~Rx{VCfd$_wmt!T6otGXzTj)=Mz<!?A*SfVC6M3#^l1X~5bGwjWqO!43fH zFW4bqX9?B_EJ3h%D1MD#Nx)VM#_z@cL$Eqv>jgUijCw#hfITJHN-QcoEm#e(O@eI) zwo$MoG|A0^WdPeD*h*k83swW{4Z#|Ly(w56Cduy$77y$_!BztMK(HEM4T3cSJ1AIO zOZA1@Fe3xlmqIH8_N|HmtWmH!U_YuDm}ngqED2Z`^Z<(h7B1LIU@Zl!1J+8gMqvDE zZJ3edKpPP(0~qTr%vcF5R<IgiCkxgHtfOE&f!bBD3}B}URtfA(!Bzt6E!b*ctnDzv z>%^X{U}eD07OWE30KrxQqb)!dY(Vo{xsV=Mvf=}FzTyLRo?xqi4Hm2h7_BGFs6j*L zHv_}?RdwTH!SJ1QW0YX{(z!v4f-JyB3Wl$b8zThE1IBMoB41!Bg5jH$#wCgm-Po0i z57-ro57<P(DuHDPwh|b>Rv2ci26mZXHNYkawjCJHNQW79z{U%90N6Oe8i8FZm?H*v zB?%S>Y^-2BftsmkXb7_eiw8DSuq0pwf_Z_>5G(`Obiwj~<qK8@EKjgXVABL!32drh ztAXVTRs(E`VB3LB7OV~!zg7${04ztaMqt@0v?I<+2o{GXTP9dMusMPy0h=wD7g(v{ zgFBk5XuuW;mH}*`VB3LRFW3QKHwYFFr*@;_1GZeSJYatmtPa@Cf-OyTJ1+ND9E_<- zal4kLxTChE@bI+Z0Ysz3p|*0j!!tV-!H%j_cVxu&s*Ot{-Bpq9!C)@#1_b1&J|u%6 zY*B9ELIQY<+P&Wl*nI$)qv2stBR3v!;DHR0-ij?TS(|sL-_mq<j44w>Rl3`Y)IA3% z2-rOk#$(K5E}n1eK!|T}5GMv059kJTZ)|K$RJi9y1GpE=cc4ISZZE4e+ARWgAs$r# zF%{4udL0<olb{RLx8WqAwIB`Y_T^LGO6ZG-3*skO;_s-WK1q*Re?%wY4@41Dz~D+n zDsf&G)oYeD4dS^F!SJF0*<LWjGnF!AQ|7HcS%sv!^F$R(YNMCz)4WAhlqmtiC%6{0 zAqbDIz8-<}u7-C;?G$enS}BSL2T>m7t(FH#W?=1-+S0m^d|gwZ_k<xeE<}79&faJe zZ+mJrTrfh%;m>;bR_XAJitQ~Sj;nqTtcyj7XF5y0Wg&8DRUU&1PH2+yp8DGuxoM$G zCox4;;6#)((eOE;HV?Rs2G*|!h{`p39n7ZETi$H8i6OFe{d~4b$Tmr3OTVYGO$o?0 zrP4dE*=&<SWV?n!hbZmEQrhTs25cZ%bjeaBS9<4%OujwsCAn%>lN@$8TpS{TQ6B4s z`tzEwzh+kKJjk`4<3TZ&itSOXSX2NlKFu`hUuMdoiq}nwM@vs2hCivWmQiI(9rgR0 z(MWeIN|M%xr<~D}mWI_o)J&YNRveERXP!8frC|-%g_6r3!D~jC&j?;b_;reW0;2t_ zBDMbu^a?IYkf3#x?hddX)Pl>b1sxf{awsv3>hdm)gbR&yZ}XHns34$QJ>?qC({R2q zuokKLov=SSGd-jQUxh!xIi|vaxl#}k;LjEv<jBZd4R5qQ3HjDA#V;T9RxNW&BdZeE z;T^ceyL7SJ0ai3#j*ubHVmAjt-WDtQgmh5}np9DnM?#tx%o)NAB%26eo`wY)7HKH^ zl}tkNMQ)7<;Ilv^mrXt4k4MUvVdaJz&#oHf8tl#X^)OpRJ4m*k<89p{+97^oeI|yx z6&u_fleO^ko<d%9`6h3B;Y|RqKZ}Kj5MJeRRO}C1QtKN{Nz%MkX{fqXcZTGlNZULZ z+hD9mfBj~t=s!`jqPME0OmpcFM=Hw5q29n(%`izYdL0t+OUa?<`bmhPOEgKOya^s( za;|`{YojpOPic$#A_-C2tMZhAyU0|gdh`i*m4OoYsv}W(sqVC;VT$O9#8Z()9TF+z zt)9-|f(UQbsK}*WM-BT<d7ip-NSwDCYG&2Pv+7+4QqrYVIflb>skN#!hh1sN)Vp*@ zjOrs=)IW_<hEUsf$Q7(MldWpu3S<+J;zofK&(cMtSm7v1)xzbV^x5d=;IqXcq2Jcc zsO9)1&rfDDCb>YQpJ8~QnF2j(D)7RZSapW4A7c>}h307nNlU1rQ7aybn`e}^0w^$i z?Ngwa0`c%j+iSBXGy)|j8y6nf(zY#j-woive`d+X!TMb6-fyEsuk(~wE_QP&W-@^^ z52OzRN%KMah@|QjR#w^GDlh({tsP0rqm>0n+l9h@TL($=zI`L5s<vu3t5ZoWwOESY zO8J3po@^d?Y?x{iyj8ztJAz<|RgK=N9lEa&MOJNNozro72kua+U9^QRFW5cq5dRpW zlT5H%vNRKq_BP#3Z^I#dlYv#kC0^(w&G5xhmtO5BQO$51+m$2;&oF#F1H$1?QmWYC zfK)-1iWMmY4PPN|kSnh^=o(TJgUX~MF~{Oe8(lDlc1q|{ktWG6jmOLa{YpSDCFuu@ zd|gZ|0S*{xc(OUs@Sr#<b#K)um`hx6BDVf1RR43?<=#aH**;VUG!(+yI-oQL1av@j zoT!dO@EP<lUO`}P8DwqJ?Vzo&3G)Y(t%pBaqa=++6DN6_qjiP|1**+pVev=xHmG-< ziPTF_Z*vf-H0^CZ0Tuos8^G4vd`aFWz0F2Y=}htf4PSrzP|q~79~cp<8)gU4icPb= zk`W<kT9XcdvuVH70S&J-WCl+37{OMYSl^4uR0nHFxg68YQfG=n9g8?{gUdwY=tLkW z93g!_yx=ma5=AZ8y4Za^VuT~G09-}Vn@mN$EMz*>C}3b`!nsZ!dJ>o&dNb4Qkf%(1 zk1xF8T1Lb0W3l^Dron9aP=g29KrMhn=&Gib)P`0S%b{IoWFU#Ivjs`;lV-Xw4&^5^ z{C+agh+guVPCrAE2vEH53?+~rIoN%DlaYf&r{cZUWl-Pe>*JB`m-m@fs=Ga9*7R}Y z_xF5!(z>>Heu_yt6)3FC@bxm&v-xJ#+e-e{Af@39dNV}8WFQ?AUBB|t49g&y8uPpd zeK+TX*?4VEI0=tgSDUK|m~UI-(?F-Q6|c6kt+U$L`03%KUK3DNQ5a{ns4tPR8hn$Y z%s+)%mWK;CJek)TX@u2}=ID=;!tyH-?8T}`(!5K7d5&yfQd>S!VdukM=A92b=148f zDrN>ak9b#Nb{->M)ElwgTeXoE=U^rdErZIT0WC;|ek)Zz6TzYK84JvF1OvMA;R=&{ z1_RgmcqfDPm*uj=%;hhLo+QFwt}rC(op%ZH_88?HRHUJdo_Xi_bD04K!(N)|l(0k1 z6sDV*&FzvnWmnnM{;F(b&>li(Pr(dCXDS<3MW$r9U9w37t}1AR!bEXFMGB~(qZEnD zo|4xJt4Jy@Ris~)S99fh2Zm?Mi{%QaB`FP+Iz(You5*BgHi(d=YDv3pD6^@rNi7|F zHcbnpvWZpMz`9}_zDVXAy)M$-e1{*hJuf;~%hrqOrc3;pt+(IBfPmhfjus7`evhy( zA^ONV!ukEtAs+y8Wc%R7LYmhVVf!Vl9l{QoVI-A1*;wQ2mtv(&$NRSK$ab?OEORq+ ztjdH%<=3(^Sg%&(UciD~RE8DdXW7F7*pJlyY=m$|kTDyY{t<fdW(0|_GeS+xGDg}N zW!BV8iY;ui{sK*4tuQLXJ6Y*m`Ke}Qz{teX+AmOoLqt{@uf;lZWCpxzlDQCOkbos* zH5D=|CgSPV*afIcjZ%|u=wmr*kjua(N6S7C!h8sizyp%tfW@S>Xp#g&IdL;N91;t5 z(^M9Yb4<3dCJ8arE=#ywmX=zURkkErHA#Y@p=9aHu~<9}pM6=p;o~H-uTgrcDP!b% zV<B=+jm(gB{=|BY18MwFD*J@Kfb7asjCs*`OcB-IjpQ2I@DWPl18kmvalq?Uyk6nG z4|L(>u!;}hC1AQpf&E>|yf{e<uA3B{vqw16A%!_`yS>k*-Ho6ogDYA3<BQ3U@D!F^ z1uu55W+s?uSn;ZMkwuiSd%rnDS|)sYCm^xm+8S=^^f43eTqA0MVIidy9S2z_HgE`F zW%+HLnJHH(*Gm#uwXE9xb9s}UGBZi!kO+QNOCZE+LSK;>gudd9yj6`slU1*ptv-sh zYy+iQJT{rF+SU)bA&~$cOd!g!%BGfqvb~rPlv?XyDd^0D$My;JK9~kY$@W&s3Z4fk zB{8K2C#Xp>0!k8wDo+&aC%SqFqJS&W;z|^*M9t*@S7LNE_fr)G%8Op>byRJ{0!<={ zp3H$xvN_Pn_C~-*$@*Oshkt^nRE=`bQdv_-S51J`YS?uFu|0Y)_KOnmPR5G7cg71C z#-+PGut{fRP-5s}BhBmrxtB&d8-@gOZ{q}Ec~}q;Dd0nJMiZ)o)cT!29XV2eFaDr# z3FtVjrFoep``43YR!pOZqFq!pXNI*zP`5z06ZO~a%^~X6RsTo}R>5LnW`9wOI9Re9 z>~)lPYC>;4*c&y^GL}^#6TC_%$b>NJ?TnFk$Z6#LA!BzBie1qd7QKW8G5uEVFWmh4 zpUT%nr=udVUfhQc0q!NJ9$KS4Nl-jY!EL%hHy+~6hj@P^|LQt*Z!SrA$Up)s1Jl!G zKo@Qh5aw&IvGC}{hheDob7Y33q<~luD$PtEqTn&zObv5%JYsIE5|=&8Oc<hg81V}U z(&7^!Y&u$dLUi@5$|uP9OgQ=qM_+Jo2GTdWntSMYN{C(y5<CGrp=`F2Y||5X%?+OF zWO#%x*2kbUU*3l}ZnW;crdP*vJf0KuGxzusjdCtYX3+7>iv<DmJ9@875R%GU)X&7b z%4Siasa&k7yAaIIB$LTt?4w&p^x7d*%#?<XR^cu0MLJ?7-d^!utB6e-8zT^XiuU(; z{(y@8t@><|MH($(0SlQ&x8}iUISl)QMc^)24}BO*)u1JM-FE1DIS8-qNBA||94zAg z;Wa%sLfE!?5sMSqhBmeptw8lfuUjFbo67XCsQS5dG~@VZH8L_wuj(DE<fa+0-Z7Kc z6)p9SO**UI7rPfC&t|H=OjSJ($$%qN)%#S{e}gnoWT|?eRQ+Q2V$e926sTv`$72B9 zkU_Z^KnG<2ZBdGa$VA(~l%_V&6H$^-@#IowK-(;bfQcB^RD#;jfh@sPip@~(<YiiX z)uVX5RhV|8j$2ixIHT&npz>eBpN8I{*7D-f9D~>LXq7JSqAjbDx_w>5TtW>wpQ<>R zrY2KSh-FQt*rC#hP@*z(4g#9)F3}O@Nk<qV>liL})UGO?KMUg^4vq)yvWmKkpEq3s z;c{dZFDW0!Og7kalD2-*iZm@*(~>zzO*#OPnj|PoGuenAztkZav27%ImwM6l1}xl% z=pXd~7<exKkR?G$D=tk-F8-`9tkTU^CJxCh4vGG?FN)=kuI{4j)@5<HgoAYuj~OKt z5?y^WV&mCOHO9j*Tu@FDTV0arv=aQQK^~53<A>D1(vCdMKhow!1-20T%Dj!tT`x3K zbIo2tu*w;fPW=QVO93kmVBY9<Ny%JCwiAchyNvQ-$0#oI2+X?Sq579$wM~={BeeFb zf0_OvN?#?YTUP-E<w+m65xwj;(?5$7q&KZ-hJ?_+L<m&E|5^R-`Z@jkH>99Uj~?%P zWV~<fNOi?HG<dx4YUtp%F+YZia-qHxf~Oe%@hDH7Wp4u;G>EZiIoi9=p_YUFqtLWa zIo2<SX4yi^)UX00A>x)-K<}gWS7eq^gdU2`v-Bjg;fZsOc>fmol_9g}r?V)^_hf4q zmLl=}&mIULYWxz9^f7*EK(W9PsuSbcIgDSnfCC~)C+3z;40A@h0&B^($XnIADiRAo z?o=o!RgFPBh@Cp$ftVf!G>IT9P8E#{<~fmlI=zM*j^b%bjOswbc;Heg3q~$eFc@eP z{TwLY){!nKd`4>YS`1?_sWE4@2uxF1(X~de!;WKRhp>7#lCM7u<AOM>@a&)p53KKI zx)lnO?WM;dCZ{}PtKSQWjnr!No=-b~(YjpX{K!jFNi<5^G79=h&hwP>hr`BF03Hw! za@U~3Hb-i5bOn)Qtult`;!q3z0HK!-*vB;c&r~wlwic}DjLk461Ih4bU~Q0Yn1)|J zGCzx>*~zh)^H5-`>s=<NO9Iz19biQT%beN2YY9pkwMI&YAQ-eHFja_<&2boaNVv$- zC|qhpBaD~>l2K0w$!41l?hVmO66-hU2>{coD8mY_HQRfS{5c>?eN}AFLH3FDyqlOZ zNZx3d6bg>tB#4k1tXOPti!aEqiEuEa2!ka_f7k70bgxlbe4?j-=8ow%6vO2&8BHUx z{&CDt&4N^vrMc#`vpt1JR}6<bPqaiK)9ZA!Lz^#$jB=Dip}+UM*i`aKEt>W;iS?tQ zM7F04jvP6{$AA!fxfmkR+*v0GmZJ`>xt+U99D#Ni%FxAU_*&FQ*izCXbCs}xr)5m1 z+B_xG=&gEE40e46=-4W)Ug2Iy4&;<3iPHegg#UpM+0v-<R;zhH6P6oImbaQ=32&Gt zN$lsMQbw~(LxpK?$SQTAO;sYF=(VaiP*#YOp<B4_vk+{C4}GY=Sb7H;(?SVExMZ~t zst@T<G2@{(vaK%CkA<3U_{Vz*)VD`35xUg!88oW>JF3%zY*oJRg&Ig`2OQu(D-L45 z$4wx-BH?$Qn4=&$H<P28Bng80%GN#xXQr$X&LPMhJi>7|3}YYUewv*<Ydu?=6w*R6 zZlkoPw;J}!Kr9q^s}8LvCpXpEnIQsZA`am0CQGwenXTC3wJXYB9*&RDqv8l94s#Kj zXYrC`P!`@G!yaUZo(hW>N+#rz<lRPDbd@3ffPTxLKKh&E*H@<y%W{^!;vmH@(-%2U zgua>^U#Qv^E#~Q=ZJyR5j*&?%K~mKpiOyYyuQvmv=Z21nRe9p2ANN-4<4MX68eY*U zNIhuVkTe78;b-Qd=6K=+*Uy-c^^>OTIi|V#NeH%Qa;o})E;#2`BdudKZW-@b^KEIV z!7B_jbTmvkbeb(y)S`Z&$f>({wWomEFrQVe#WSMIC=G9zKnz=0Qh!ooQhyi~s!2h- zRe#FYsQSy+?MTs7>c>}qY+lXTqnHP}4VUGR;FwZSOjx0qnv8^GC=<#{tq4)8DGlSS zf+_!v^tsKJV&MGJAaUSt`?V%c32UPC7pPI_a}-8nUf8hYuU1bSct{EDv;ub-OzX9e zXJvk;+%e6^8q4C~EHf!nZOL-TK)h4{U>czo#6KhqH9dSXgd)=FAM;07#^GgR_`@^1 ztp__wF=Mr!xp@%@vsqwiPi_7}duh-f2BP5&ll|ID+UAkv9i0Ni^lK93GM|Sy$RMgk zzM|TAD^o5^Nw^uoi+2mao)%iw0aGfOZ}^?WQI)K^?_Z&3ag;cfCHq1PSsVTt`8y$1 z{@u^19K+#2mHT>-0u7{M>ds1$_Nt#%rC>+NKPD-Y4z7MVGcp};)0*-H))ZtFLqZ*x zH6u1}Djqd4B!+U7`5As$)tM2Fq3WcOG<P02ySbL47ls3z1--`68;cyNgZZM-bo3AM zq&_R56I*?rjQLaWh$pSSMk~%`_KFx->0U2b=`HH3z$|*-OI5OkAkAafdmLv>3nivm zS-+$%0^%HNb=c<LY)Zk4U=H>rm`qyZ!{H&c<!b26Q_I#?11#Dj#>zTF0GCCqbufR^ zmHGZk7FRk#zDREQ$YuICXbTWAtd`egSZ}EJc#;5RT?sHjKg&A6R`w!PBkQlq!>Oq_ zv9RdHeC3t?EZjGmAOe%1b7ksmGIO;8KFa=>;D79jP#iEYL;0A<+;ChAfAK=%;un#n z#egZ<U~kMkIkc~2i9w8Xd0jJ}81#}3=+6*CSj3ng6eB}oB!DvmF?fW>FB5j~275c$ z^XP!^Oo_p*Kpw)&1oVrI*&<@t^I(i@iNRw8*@%%1n23FOtEd#*FQ$i&ei=MWz@LFU z2I*yMuwESV;BvGg4Md+}X@#4CQv$N1RvhyK`SUED<bgjgKpxRaq+KW6cP+4VQh*o* zp!h`=okZGo!Wc!CPPnsJ1WIDVc>z-URl+jZG{Wfq<YoUa(TXW{;jqi+0K3o9fDgI( zK=G$8cHywg#~5Xn4$2Ut3>3cvqJt=V9#IG{w{%dB80Db&g%lk`&Bw67wC^Y^11v<v z$&n=P-SGjT1c-{aM@7aBx}6@<JIhSqQLr?72#1Z>Hce*px6l4;`ynyjZ8)NgAKJKs zPz`W>QS`BJDSRKR)xg^N8cw{0B=eU@tcxaNFJy6*(D8P*c!4Oi`KT~oCxUR_#RL)2 zi`ODqy{LkCRZ(uNHuH3Wprepe2Y1B9k<n{6VuSi3Zcw*`Z*%DFI7fXaorM`Q#*7I? z9yO-7N@q7JrfGg1n$7P4YQc;ONq=2_ai)}b(UVd(o1c}{sJNz5c5P0|hRA`nIMyy= za>5wtuAh$OacJCO%x}%wG8$Snw5XAxNkx;FF1ebeUdXRutz(rde7!<mh~y%Pi(QRt zNL8eP<3lEkVX|Ow1D2{tyif-i5$QzsCR3Qnqyp_s`bB&>Bw}(!ND{~d`9;DsSnDu@ z2%3Q<l1hq9k?OpO8CwZr6VZwiP>K`--ohDaiWppulyJoz0iL6jB!KNGWkD*xpfKbL zT^fX-D~}0S#cx_)5vC4W{+9J+s?5@>s;|IWb)dM8fLd)4P^-4aES$mBtF(W#>b2=} zDSQp|7MzCPL?Dabj?{S<Q&pC+nZ*jN#NWnT%shit8Dv(?D$_KpU#QKa+Sf1Er^@u_ z6x!5cL%lD@*X3&IY-AuB56m_Y-Nk@V2k2c0K&P}p4wvh>;sMh9bH$<DDrpIl(9NqM z`oQ&>I!DsW<eWVmrsbeG=Z{J<S>Q^VvV;Y&z{Z-ggbNF|2$EFx>KuRgoEG)>LZpGO zqOaZ$WIa9cx1XD)2rZ;WC8Z)k#=@(pUcQT}PNhpaOW}Xv&9Oq*qCOk$TxLFxHJ4oY zu_VV!gj90%yn%>QF3dBV$@>F{C(PJsSRpUPHOq<<$BOlJQ>oB<N@S8uzOnXTQlUpb zRn5K1^m<1yi+T;u78kxk;+g@BuHP;8ub4<_WX`kHD?>cNwXU((jfD{*Q_)&DHal0S zg%QM(p_cyz+*-s6aL$-<H)rqrnS<CnCr~zfKg56lduI#4Aj}28m;Iguh{1oFKAE-Y za|6U?`jsI~zjuou({E%#M>qXomJp^N%%V)+tTH&)WqQZe-^L;W8W4^lL?-RtZ?=K3 z8E66#eKwlU5qP;EX-Vz8bIl}w3BMfcuSNM91|CZ^jI|jFwnIhZEgU}KXqDY*K-%O$ zX_JGbO%9g!=lDh1EyyZR+MkOCX&K2cEuW&RdDE0tXj6;fqE%|zrdhmfl7!b*A+F`{ ztWnU>B8a@(DR1I2Wdwm4%P%mWqN_LHZ^(3#BdF{^fs>CWaB~qv;2q5i+*~{e%vgSb z`7|#YZdLpBddlv9M61M6LL<P<lhCZ2XT$ZodA4YJAI|bDH(v}Eo0|`jTm%GAy~Zy{ zuBVk;J@-lJzAIS<G}DmTe~CcJ{&ljhJ{l`)Q?XjLY58Tz!|&|j7PP}w0m@+$4|4f_ z#?{Q)p8^KBIt3M=QXp<ElIzt=luWTG_bxbSvT5x1`s#6+Qikl9Hs|<vQ4qi5-;c*& z$FH{}^!R+yL62yfo5Nmk+Z=ux0|FdAPr;ZD-`b#|yC<vR!#T3W>Q(=Mmto!r>G2;0 z)#8^Kx?ZYK*~<2Y>|G^b&R#6c!k{)TJj^}=nWDGhsl4dLugaPoch1o;Dj5J_2szJR zEVtZ1P!|LZ^PQ@(aNk^wVb1?AIMVtwrecj6uqbnYdDu<95gclCF{CCzvhf?~N<2#h zvxjF_oniLf3`OVS&ZuuCvYKLAZVjP}qiQ5gGt3iXI!W|yO#&TeAo?{GXd1UQWQTu< zWRejo+>8)bwM=r_{cazedY^aEuZbs)i-&$2&i^&hQ7Md!S|Y&H9*7w-A^I`MPhgjy z&qtO2XX1(c@y*NsGtnV2BSU@yJk>!SJQ1LGW@+Y~q@Q)^Fi6@5GT8ZIEjb+XdxC`+ z77sKR2;{=`fC_2A#ba`IM?KO!m66!Zv;GN0F-;zOHm0J)rf8G?uppZX3XC&jicJLt zS_X$v(&8uvifHO&6$MlLcEK7>HIFX!!x*p0q{o~v+#@2&!50q}hk(@g_z@?g)kxo- zpo$URP%N!bc5X3xR{OG850)(})#@<N<`WXb(GSyIfRsQI;wXP2hZ?c5udi89Ex!Kx zAJls+${VTF9f;AK<E3k~IbJ%|K*t-jKPiVy;wVE>MOh^KZK6271*?p7H^??WAMwBt zk1$E`Jc<d+ISsPp$!C;DR&WMKy5|cK`*&DXXpr}?;SquJ2o9EleQt-`xTX#*@U^(O zz;#x0$2v$}PKD__)zrX)+OqW&EIbtK0#!!;eAc6XD#AAU=WVi0Y{1%YVZ4emSD62_ z<ouBQrvDVBt8))Yv~TsSdWZ}Xl8~TOwkQ`?A@2#P*%wI3FdKO*2`z0E<kVbcnv1PW zbCqineFD;53BVI%gw_%;5{X29=)Rd&^jZaFaZs-jFB1k?Cbovh%p_D&?DLTnGYp*+ z8FW(H!Bn+E4Y-%dFqZ9*K8YcV^ec?;JM;NQ6KQlpa6y93^AmB!t16U%4i_mh+<bXg zc{YTzbRom{fu0X5W?+P3hX{3wnyjg00#);tNkVFkLaVq@@t5lmGU|{YfkLQN1Zv`T z04P)A#lr|;bs&U%5(1ndIy%S4C^LaEkMDWKAPoQ1dtQ9tk#L#~jW&ASGGVC1iG*rf zZXAp<d})}eKVLVShJCV6M}}=4s3FW~xQfv!nTQmS7DSdZ*}_qn4v35p>H&GNv}R!# z!opZG3}LGe>5>+0ae>+9f<m<C7>sySdoD*Nw)X5ofZ3j*CkoFWP)fre&=jPv(Nv&N z-2x5;8CSRc1fu>$uWNCSbJMo(#xfXn&Uk41;r_P2FeLw1=tWF^o=wme<|pwmlX-4h zC9AgT7puFbkQJ}>CJ(&>9;s-&*X}n$*e<6Z@R~^oW(`U3J|NUSf_ZH<f|C(k2P)z+ z5eCYozP!VN+@LeIMbFgyh+3vufR+!e<sD3ENVB1R^iv9(dc-1{q>9GK=s%9b(9tB| z@(dW5wXlpdGLVK!jW0E*)QIWSh%z!EQ>#7#O~BL`4YCrLEsEDfBSe5Xp+p7;6<H#{ zohrlRL6sE}6!BujMsSq{L{2u-JQNT)(~Mk>$PChv%Yo*rH0T0!a-c9kQ#4PKra*RP zNj-yorAi>#A4ql`xC*E=NI+ArY~ZL4S}_K0e45u6&qR<M$#}|8Pqcd48uOzKv2Ey3 z7zr;*P>ZT~YlSyp)c7OoV5JQNXCin5gJEVe)~izwSXn{HJ{55#!0n6PJAzv0{*se9 zst^_=D1;=)LI(CIHRLe&ClT>02E(C9FnSg~+BPtk34`uYK473qB2-e1Dk&zx&Z%iq zWY9_dsCboBXk>i!XA8Lu8lhjVeSr)JAp;Ww%EWZK2grvJC&4l|1y%;7>{wTK2FP$q z1V(vV_-Vn=YUYPGw5WdzBh31n@CWIzVy)T(l2IKw1j5y@eyvbdc?iu^p&JmIuN;Z) zu4oU;8*v!u?>r+>i2P;lWJ;ns*HvWQUG*YZnTshs8MX9YFw@xRNKr;w;!+2SL%Qn1 z90=iqysFFxvkPMsc44HU3qvFp(D0oG9SDYKKH1kNr|zrjZv#u{@<0_V8Un2nsJ_W; zR|sUgvPu%r>!FA&Ey`epBf%)-j1Z=a5UR`60YjKDJ37j@^k^Mj3>a)3ogTo3=<kZa zsQSAV$jjE>EkuB=zoU%&p_8Lf`~h7|{VBB4k1hvlc704ncYVu=`n$d-aqhlp*T>H& zuzDE}U0;O1>w7vR|7sh*?)n;$jhTcx$LsIrm@H^<W>;t9bCAZSKw2gF@LYyxJTggK zIJ!)Ak1M1rq?yimAp(`fND;fLHc2D&caRc+mI0Qo0R9M>ff3kc#(^X~DzjoWqeo2w zZALBbUBY=L)xQeIkA4oOt~l6@GAd+bQcOVwuv29W1c(q;K)H^AQm$mUV#CuaJgE+I z1yWKSCNbS%5@m-;DBbTMG+mR>wEJBJHkH~+U@A3YIyIt<Oeo#&`*7=Q8hD1t1ZJ0X zH%V3qpUjZ^REPkxvq3@nq7o57;#nQ@G9hb!$#!HWi5}Z*YNC%7(#muPToaIk)q5uf z<e+=+Wp0vn4*W=pKZkNN2kIDPhUy$PAcuU_yXX#`d4j?KP0>7MngachM|+z(#a`|Y zB)bmW2bA82Os3XW14pg1wW5pX6Yl9#2$V-Mo>l?ii47f3R3)C+*4av!J6lN&B%Gl_ zBW(RWLXug0RgJsfl`D(_#zzd+<!?k<0cluD_B2UDD>~K9VG@IN8b7KuD054j9IEG{ zpmE?uCVmE$iR!$_(3N>%0E-lY1`;G8WM9(|l5`x73s?~Q5QFy~K?UUExZp=}`}=x? zkU?9ETV>BALM7!@Nim7gNs&P(m8y6tHhEccTec`_nqn~Jl9C6=MFu7Y5t*1yH=fZ} z$b10-6xgz9WTnk*6;O1q1Zs#On4yOl-(el8{_psMs-P(a*-Scfz||HA31u@3*7aSd z?9QKtWiuH~(g?5_2J1BTA&q?h&>9)jnpqB%l7ar=N+x1qxKhqiso}~7vZ~<<Wid5D zMy-iuU}jTc=ZCb}s${rAx*D!zBZLn!T;YQ`TwxRrS4dOC6{<uHR|G>eHC!QQ&~T-U ztQ68;9@IIDhQeAUP$LX2Dhne%0#Hg4Fm{19$bj^$k|Mz=$QdC_7a>%asRM>EVGdU) z-%*DvMPO(;TnTl*bjU;3X|`d-bbPg_>9FE@NG5BB>V%`*0TJfoo$u~&Uw48CU;l=o zJTI5#t-_aNyzmJgDNDnskko-8sn){o{7_<WVZwgCJJfjtIq6MjtVU&%Ah>N*R?C2Z z{U=%!#%XTw+1^+LC65$T_AXiiOa;S;A}&U3=d*fSgU-RGy3J8dRp+jMA0sS8V>02z zPK~){TQ6_F5Hi-odR)fbWL$=E5x1r6H^S`-8M8#kq;NDILM-P-uMNZTni;iG@;aJ& zT~|#jxtN*9D&!%Xa{}_UEqm%@!0Taqlt=0$#e7mjMV#s88oI9wcvxh*VL~;q0e_kt z4dx+d9+vm0+YeKW((BAuYp49eTf_qRPELVsq`>ez_PcsyHUAZJub`gl3c9x2U7y0W zB1n>f{l4qb;A!Pp=T#*yV@Mf7CNQMhTn%pIns=G`;wiQ$5~yno4`KkVre6u;@K$}t zS5#ww;wmh)16Oh2BCCJvqqGB0KyENB2dJp^Ghi4?^?`vQU|2?mkSQ<(44j9APJtmh z1*EqcPYp46CW5PT6rvO0fCl8~>QNj{D(S#+pBaaU#36!k3Wqp+imr}99J7%j5}g}$ zN57|QM~-ZNt~U)Z5Bds0`~huL7@G`JL-&UY@#wV6!yB$g07X*)DOyn65;hfne})pl zqjSY0S@|fwSIJUQ>(b#6oODGXmTHQreKNh68r8yH)x|exBe9WsyLK0CpDv{$DXcU$ z`Z;yR4R?De1cIkQK9+lai~6lNm@G}BeNZ1DdeI5tl8_c?JzeoA`d^E(!vv@a$V@dg zxOEsrOJN6bWIJy+3gQ9}nc3c1hCJLf66U~le|>@jxWT3>MqS#5HUdkn_o7h2tk4NL zae%7NChYI_I$F5wgDylO4cv<i5XGJh%0wox5a6j18K8m*T+x4A2tdmzLLi%$2+HGW zrs>$zMtC;)-~{s6?5Y#PwSlo#RT3){3s_xXJ%Hrd?JDtJfTrXVP085dI;5jE47F!L zO=|H6cL<w*MsQd&%G|*vp+9lw5f)Jf-y)llW%YN-exPzUvSXN0UknoZo>WREcP^#M zrB>`KQ+N|ibTy}qxO4wUFvz|_EuQ&)g6|y581W=~5gg=jFeD=*KHwilL~1qy8)X{E z%nP70^GarvlGomNqpN!$2A*&~4J`~LR1s4_!3mm}*D1jP&}h-p4q**6=)f4bso9}r z2o7T;>bFy<0HkIX6pbYkjio&s9?K#|R|&ZqqD>OyC80?|kzwqZBnWGPQWRbPJb>+& zm7+)ks)`CT%|+M|kX;$+lvZ7z&ikG~f!&$YXKoJXQL)ko@lO4a7ZPxA$K3tLYgXei z^zLcs^Ofpm0p#XlZX&A)3WueSRE0N;5Fy_8R?F_R^j_I!+knJn>^xCSv3|S))FggO ziC+sY4!`_YC^S3%V*6F&uR*|U<F6Q$4zjvMRv=!5s26!mVzwY~199Lse5Y{K6)&iq z1|n5nR_|u^?BBNy8hF*eqj!LqAI$`owi;>Ca!A_hi4<It(tSO~t>!wHwF*ztO2&gW z(Qx(Y4A~p^SdTIaLRk`(*zy{4XXwgytuE45@584xyv-0aoOo*-X4|P_J{)q$P^?D_ zX?%&^jr+qxGb^>3{9mA3@|QskV0f``66F$SqOSv{1Zdy53ituc8+gwYufvO{?Rd@m zc(;oY1ckx(u^y_%MJ`RpMZ19!&A@hSp`nAuIS|hgIxzaFadA@-9M??nx^bOxF=l5| z>m1pNEEr+p`&-qpDUNCFy2K@kDAx-p7w02*^+l#D9OUwwxh$=^QHB=<CwU?MqtMgR z$eWY^NQ%!D$&12E@xcsbHx(Fu%Vw<DvBv>r7!97_2x0aJ7#Ntbx9JGcHUbiWC^BnO z7LuW!ws~UwLGWS=$rq^Ai0xiX53ALQbs1<rDaLKJ?CmKK+XWfbK@`ntwr*=U!%t31 z1HVfPg0((%JAuv?n#v9!z)G{tGH~c4ca=efmde6PI|e9aTjU~SVl?y$po(rg1dzZ; zod#$mt$xU1wTG^ntCGe+0cZiLX<_vY@nG%A0Lt2vr8ncn<m@_=qpNp=yP5XD{toTo zAK(Cgvf1AyLGv|84;^kT(*@iJaKyHXFGJ`JB-VnNh%_&SMpy3ufftT4KpGh?9c7Bj zD63M!V{qXpJHkzNM!P15v&XJQDAzK`b^gZru_g^!?gt4S9+()Y34CM#60QYk7)Am` z_a`z>5+Mz7J|L4l5fT`O5Q&hjzCFegq}58;G9jM7QKdr~(xGvwbacWbu>7jb%iMS4 znHSxXjw|h$+-jic#``v9(|s;4YE|*E7|nR-cP~VjTi=QOE;<J`RQV2$`DGuw8$ex2 zI9SBW-=Kr_VorA-C_r(oo%P1~o%pbF@I`9whWX7HjX2SH7byd_9B5T~SWJ*33UIL7 zQo^KZi!hrT9@dr+AhPZlh2<TyrLpR$t4c3VXy6D}WAJ^eRoig+Y$I5j89;b#cjq1T zz7#Zf_VvgnkJ$gC_XE~JlWG*h&$-)1F^3osu!>X*3arEhfDrZR5=(OlCY4n~svI5k z2o;es1c4>u9v!&@!M?`x1uYVT88ulk-|Cto9T*d`PB|lff^9A82gd8*kH=T%UG;r+ zyoBg~dBT^}s&jpKK>J(JqW&Z^6fZo-8S3R{oaV!H!oTa-GCEYcd%{_4$RoG$p?_0o zcyz_r5aGC1c7E9vdjX3<N4a9}MDdv;&(2gwlj?asOsNAy52<etU5>|gP2!0b;|z-7 z^4GRYYWqSF!#1EVlZwH3n75MRo^aF>9wy*n9=zm2#OIHrg$xdlJap0=-CFNv9K^FY zC0stDnSy5vE$X+~m{bmz!M)?cB-KZIt1;sUSO5}1QmfFTgFU6ngV8b*$9Uy#Bo!n? zc*As&;L!%$_oOcXIEED26*NgPPNm3N%E0%gDWTqGL)n|SS$J9W&$UR%Hf^J?XySFP z_mvY^G>^6h*Z;@fd4NYzt#N-sLNSOY6s3r+5Co~|B!C)vhX?^dz)jnbKuDHk1Bs%p zf{Gmx6%jNj3MeYYf(1oI#fI3fs3_PFJ1SmLQNQ1N&dlu0W<l?jd%x%Vo;y!A|9Af9 zJ^ejpX3m_E>~X?IP%0&IshEX#^HOohT-m_nF3x-Ni!oMGi#PL&G1l=vQ*nEc7AsD^ zMYu#s2ly|OpBUp9TBCNAw?A)Du8Bz6^)w`ToD^foQ>oLGj{uVPaS75g<tpE$)jpOY z-Kw~|kaP;<J89a-L8RN1YZU#5_R$QfR&i~Sw2yow?L)rxwp_VZBWWL3Al<IGMM&Dm zQ%Ks!TS#{(*LRV$kMC{Qm>9!Yp<Itb(yqrL-Kn?^NII7#NOvi&5=qCg6iG@r#<<Jo zwj-@l+`BdxRo^gHE3Pq;_S+jtr*9;Z%pGHlF-STEUZi^zSB9ihuntK&<rw23r2a~( zru(Qz8O9i$xc9zB`RIwHedHkBtGEK2y9KGA^7|FiKqdWxbf3~Ys*&Y)J5rW%{hVcw zLzHwIt3b5$F_I3Y8_!zqQLf2IekBb+3MlDDr2AFKcOvOjZ9^KWTz^K=;U#nHFhg;Z zkp^p5B%L=em*~TFct~q?ct|?Dr;)_EV~p2q?pvhwirbH*%k)>I4T_6peA9ljkseUo zI3%q%8R<dAO}F(fLK>k`a2&m5mXh8=(q(XcoF%PCdQ7=KjHFBB1teV>pHY1}M=g&x z4B0n0#+YPFD{SdATWZphSKgG~t4O*{H*973ZE8zxkVY!K(Ka{Nmaeg-n{2%eHn+u= z-bLD?LfM6+Q~y1ZPJKpe!+1!Q%U~p3e!n1{seJTqV;EzURDzVPq~<3WhJ4>I#%PbE zefW?zDlTAiHzCO<F=C9RNPU#wJCI~^`WRz9lJ@&Cl5R8mkRDU6KO*%}J{q^RTw5YN zu3Xz9Y1b6nH4ABzavf;9PO@E#k)BYlGi=wnw(A0<Czb0Bw(Cc12-Qxd;A4*^J$ABT zY*u=kk#q{4M|w(e|3ErT`B;xfT~>RLwkhsQBwh9owl|D%ihJ3X_Sn*Iwv?A(>7{kB zq!G4MWJ~AU(ucOx=@i3wTBWKdl1|kyr12`=9Hg_9v;^rHrMKGF`weM};*RcU`R&lj zFh(gK>yb`Z(q5$Zl=L-{&fEQ`T5X|yXTy+5PmGa_q*E{!={d#a+uU79&nxaho7;n= zE#e2Ht;+QPk}mOMx>&AlkX}%(9whDB4e3S2^+D3{RwL=~E<t)pxn6;!ebm~n_aeQl zT-V#KTW#0fNUtc@Pi@y<ZP!L!scGff1WAY79!bZWi1ey*O|xBx+pZIkwky{uwri#B z8bp%&6fwpnw(CNq*A=%MN$2uoq`s;?vbq^Yj*<$H#wzJjqzOv82Wg^`wjt^CeT(#l z3U5D>PW|!St^O|)=~Lz7bR=EV*+{wvS!nCU_Arb$RVb~HbgI&k&QN}bB4HlnqYCM3 zC7p|;!+Q~_pW=EY8pc~Hl%YsElp-V@N(~aGKqz-2?N`#>NPZ=qo@5x4lr#oOhgXL5 zv*Id|wBEZ&|4?y!j-=ygkZi@#3W<s(jxk8TE9opG?e}-2DT-^FV#U!NN%pjkF;bAU z-dd!$755~Pj^k~l$;xl%R9?$du04>nk4KPpC~hl~_R%8EFwRy!Za`|HT$dneA6>bb z{*K~$BWWM^AW<cx<w+#%H@l}{G*x=zkhI@}Nbf4HF@v=Bn~J1;>_U<arecgwkhG7^ znY4JtWg=-GqmU><^d=w;QqpZmdPMZ1bfWT6h@?ZAjTBINofrhQ-UOtbN^dHX4tWn! zfzs<f&@g;TI^UM=M$##L%a-mV`mQRJ4M;k+XOVPlEt!Dm*v2Bguk`YfbZk!yGmJtN z$1AqfVmON`6<26Wi;#4@PukMT5r&bf!dru+<9z~2$9vRBE8c-fA1J*XBpq*~QC4`F zNK^?WxiZ_zZ`PSs3PvLBQhp~RX}{MYX>0lgX^Qge8AJc9^g1BvwDd&MX*qMOVeD3} zxkx&ci;zB4+ya|>GRK;i9L-SGONHFkmhQ5p&9>Bhyfx;HMWX7+N3JbZBI!`Bwxtb7 zBUHQ_k#tH&o@E#xDQ+^7PT%=RA1m%En>#SU3h&s7mUN0Ojj*KxTlxfvVkK3*sXm>S zvu)`CI*s1S^=BmQdOSs|rJ=S|VM~1|Zk@}awlo<@`<P`*OOd9i)GtTUxg2tiVSJ*v zvye_x@m3>!s<_K+Zg#E}-gUOL%9ftAr4MZ>HqY{LvMu$urRR}!8Fb0F^aj~dxh-8` zOB-zIO<OviW}?f=i=^{=t}WeROHbI+0b4qmW~_aDi8R2F`Z!=qjcIJ!wSz4UNAgFB zUbaZe$8AV*y&GfPhosBzJERij+Hk62OjA-@r0GgJ1?e;8BMnLWxEx9M2k#>7Rj!}g zu5rcO-d5a6NZQ9Rq%RaV(dHH+ovz|ImFV?onvV3P((8@XN4cJ9yG}*=O1YNWt~E$s zD{elLj%^Q8p7Q$*+3BRD`ecV;o}537RH~$70lE{o1v3nT<RCp+Zq3&|L+Yov1{B`8 zDvriTx+L2Ix@RaxBJ=oNg+xF|V`m!1H_Asol1^3I3M;?EZ0TO4;mSuzrRBO136mj| zONpRNNhz}pW3-a|NIF$Zk-k-N+=Ha!_}+GHUv24)N1ChjCL!t6zmBBKzEKS~!If(h zB<=btlCIzG=NiU7<$4;Dj-v?aJH=Jm+!ILOEAADWi$2e))i@-%w-RHtK+?6^#dhtF zv|qUnv0cxxU8f`cs9gQF>!r5q^+^9zu8VEg`)t?8kbY9Gn{C%ukPawrCz8%llQ~vO zTO<9fTu(yMDNVCo`yu_JTnF2(IY_@Mt^i4gSA)b*NPgEL(J3MQ11VQY>E{~;rUf@2 zN!RbaNM6NlLRzT8dm2gC$D2sn)|y^m)vCXu-0!Ohl=!fg%EBTeU;c4a`YU{S^cs^m zpW@-4*VL@>R{8?HJb_}LCs!+V^jJ=wg1j<Mao#MSC(ko0ue8b+Yj_TE%q|HOmy~%b z^2(<AJd-*UcJ*{9oZ{)Ed`Wn-N(z02y&zAGHHu10{9bHHj{dzSXIGR@^A!XtC-?RH zOG^s!0wv{Tm6HP%vr2rkC;O@czKXKE(#b^?K3|~5@0(m%Q81bGPc91Zzrt5m*j?r{ zhssx#zc4T0D-31H&SapR)WoVp@K2?wvSg~1yBvQ#JlkhSk0Z!`(SME0Gx3+t@>P`P z`Kd*H{PplGpY9M3<$p#=Wo1d(R7d%AsO)H$%8{!d%l_=rB3n*7uu^@P{7w}+{cok$ zO2?71&;Nz@_uBW7F2ACHSGq>8bRfQpUeeQb40r<cUzMeF7^*+aFA2=Z^E(;?i8xaB z5IO#-zA|5hL_c=GAWu<6`3z50S^4ZT`mf6Js)_=ir%sZNRC<m?`AUJR&e#g<Z<g18 zBRpjU1?7H*K~=)uK)E-NSE2fvp=AtTC5#;<)xJ{CjPgRCr@Y8r6MxGdBIWOJ>B*5X zS`<2ZwAuP9)CgTrUdCt<AcbY+1;tnm<Fs`gVz^ecHl|7$w#44@t7rg3QQ@nsDh*V6 z@+y3uvhsk3`9u-pvkvpH;rR;ksw!36!D~q+zCE+^Y9#zTKXZWUk{M##c?E&0yizlX zhYPQ~Do|Qd=Bv~#A(T6_6;yWjc=|I{U}jNaXZUd8RjHAVDNSBkprjjBn^#H8(xu=j zDXR=HL+Wmaq)YH{^-)z;S?>3jSE%{Lp>4z!;@@enk?iGv;r;db;{QwKr|hmG51Xv8 z$EY#tRJBRw?4ByWIcqDe>1x|pB>S%_%gZmNS(bZ>O3Dg7Gki13D{7e6mlc-!!tMP? z*;AzStNzQn#waTBl@>~WnoHl~)migq=T+p*aLqp><%gc7M0d@-RfnZ7G6;%G5IPGL z@QkX;fG0oH5k?Bfyk@bkR#Z_$((7AVS>DxCQ(om!q5AVGD-W6KNdC>PMKUY>YoV_w zj}F$8J1D1az9adcU0g!-737uD8%{MdSyfgb*GY6`%ndLG30UR4Qkz1gaPkTY$}0*9 zqqN4Z_Wx*omk06~H?_GjFcf-D^K>W;U2{nf`*-4xFx~iHc>mh<bNF=af93bT@;lu9 zmjBty-@9M+zw-NE`TZ;RH*I^7dllB*fnJ{ed1Z2Crmq4$jOYGhkIZKHR~RVnQS2+3 zS{(44cA6*Ani#t01D%v!SC6S^-Ji8@+@5M(KK^e!`2T!75W5Py%=pXGbh*SgC*t-6 zh}+K8nM_R&GeuX1%cBF=G~Bko2;u$3>9}=8&$QcW1cVwPyu;7QJ+9fe9a6+_<m%(l z6Lb4&&7OQ8!TE25dURhdhFvX2NdI5DO#J)v^{Auj8Amm(?~iIy&uB8{D1TJ_D5E|P zw4z$oGg>Wd;g4!w&uG3d&L4GbJ>%Hq#{Q_-dPZ#12L7l9QHDHmZ8bRBI3cQ?(Lx@A zambn<<#&wfHyOXp>KV<FkM*}25@WQD>S!G2Z;>myokW*yhFT^!_qQ4pZM2DMX*4&( zS&O@hYawwpi!qu-wJ?tMH_nafj{d^tIvwIB>9KGO=aSC#q_YFK5R8j5;s`V9*eK&z zu+`}jR(lneq(P-u!VtfwL>qAzODv*q=GVztVLCaF8NcNwDDiiu+}4x#9+cyH%0j{$ z)7Y=$Z)V3o-^yoGGcOL*W!us&TPYLGonUj@h0BO$<y0qCADkMAQm%Y>wMDyle_Sqd zVl-==5_CBzxt~KGrDdt-F>z)crP+0~K*DMrZM42v*IE>Nx3!HrNx2`sjN90G+)SEO zJyFIi8#3fETC~B#ZBtrgO9yR9HXPD=t87VD$7*i7EuB!$;&N??K#a@fpLuMw1h9oe zei0wm(Vq~lBheB-dH!x4O)UY8uOB*D84}eBRO__2C4k4rgiaoh4#}e(;mCSY>o~T7 zCGliEBpMYC9jBb{(2><d)^W2XfZZK(4~P7LBW=z!Kkv|C36p&|`As&<+DM1|ibMX= zA&+;YP1e6#N6;Zpvq-RoBW<!e!8-1A$ns9Nb$sNIzjTysp+jC~DTB{D>SDK}%x`NH zQhGNe8t*yyD;)gNhM|+cQs(^}`Er)ItaOQH)q!5~5^YFyH!ALE{*O{poGmp+TB5j? z{Fk*S^v1U2L0YP~1pdb>sgo^rMY>gSV(((x(MGB*Wgyimt`Gku^k^f?mIff*uDBum zZ>1z@*;>j*TA{cc{<l`r1Y4SnbeH0C`QJuKg|<|Tv_^5I{Fl5$tMwIH3UIzoan<~9 ztE4%$6hzvfxOx0PQAzV{=_;fL6}N!@9wjZZrNu~(D{d+O&s0*aElF;kRNN~5k5Q7O zQcG)*o>klf{2!~NjkYAAZdKf7{!58OtM?VOBrY#1?q&Y7+z{98w)7^_tBTvfe`$l! z#!g$>jr5x0KH>jaO4@5nUm?ArxPAPeprrk_bO7ls#U14TL?s!tDJ{hyy{$MIAKNSG zXj@`PRjG(Jnj<AB*Os<)0@4SH^B{FlQi3hXn7><bvXb=_CCPZDC0S*<M{yZQ9hKC_ zma>pOSKI)kvz0W&mSnBvH;T(fnxv#0Tbh6*<q&O5Mw+aoTw5wcl3q62C`Ov1q*7b* zBmJVd0Ma>1s<x#$NPj3Uh$QQSqK$dBG#@F3U$k)*|GO#I1-7&Z=_uv8nE%p0N2@p0 zv{VasjB;JUf9bKK)mvIxS_9Wixvu4ZqH=w}mNp`_RIZQnKUcYKwxumdt(EIm{^u#z zmu+b~(n<WH)oS;A<+_7&E$u{Vr(AdQzd*TuVoQ6G5|ry#{4Z3l`)p}H(kaUI0RMf; z^`I>o^(Z0b8iQ1%TpQWa(MV~^H4bU2a%IwDO0rw!8Ol{=1jWjgshKIsrjz}Yt87Ne z!b9@b)t2N<!I8=}6-h>)Xd}ax`XHU7T(gi^mWb;BTN;8iQ@P5!g{8_h+m>>WDwV73 zA1SL2u|Hdq8OwRfRkl7XQ?A9fREl(ga`hvXE7yQ6RU^$)u5*x*m21$J<{@3KT<0UD zDA%iOX#tXazd71igp{gW7u(WOq^p%{EmE3tU13YBkgiv*Ymm~F>sniS0O>~MD!VX= zU(x6kqjzPJ{Aclds*ygIIuyGdUSFR}ji15qb@N>8L(X3yR0%H+S;G63F<Z{1&ye#i zX86(@pDvu~--DdR?>AFl#u^Fl0Q$~jCMP7?aa1Vgg~T?|sk1tiRum?EG2r>%H=OeH zu9C?Y9lK?C>`%X*@$Sh3uNg6T^c}&+-fr9N$2U4Bj{C#^t@rt_uXu7vS&JE6dM?lX z>EQHvTfX|eWaj<j{68+gsPVZLS`lRxl+W;YFDd-t;+UvE{*d~}D)Qw8x+f+sh>8lD z%&hX#?lTGvihw+ePWQqJp8wC1!cnP?j*>ETAKeRm`BhUBWGGTTqod|+(AE^vGj(Jb zB2<1+V!iI8dj;$Dq}Vy6(4wPuGsMfh=j!HXNGEC@R)GpiO7*Dk2SZFx&SVq|F#|bk zM8RvOdw|u22{WV_7*rr}b-6&VmfzJ#-Vw46>G%Eks&9Byx^<h(B9IU>2b~NvWXT&g z%WsIybPr|AXn;#})a^1&;kf&o^{cd$Fm`ZCO3zGb9$H7ywftW|@<MURd}O<ekvXx4 zU_&}Dz+|}?8C`Q5J9T8_jyu}P$QbRn8I_)l%v1<RdZhd|yLB?t(&B8LbA1)%USFXa z*QA_vX~>%|xt*MGb%c@EmqKaIgvoL-qhNwACJ)BXU={Ku*CfRR6^cvxuxfrGW<F=D zT+9ueZMK;idDUL-pqTHBS!u4tJ)5p96qk&E+0;*n*$A_iZYRV%3**Q1Ld@$hyZMFE zBWvx0)lMB*%j~IfG7T{6To=<Crq;!Dh1qw$<%=h+1%BN1;h|l?@Nn44R0b*vW=Jzp zhv>*5BaS{SW>6hQ#+Z-}&#rS=YBW2<h&0KiBaDnL`mjQtRfoBx4s$~tW_cZEV;v@R zb#2A<X&s$k>M*h+hdYJs>oDBz2-6u`hmm*h^<l;CH<^$n%z;^eQi!=4CY!nsF*nx< z=WdwYG_a7)!!T=`JDFEt;^<LAI<iUqZU&$b^9zi;f*WEQi%GV3GV)G;Fu`Jcg@Fu} zCkDQduXgD8T}%&{&8}A22WA1&#*nXJF#BB0+2SkFsWV-CB{`WI7(bJZP&o1-V%Z!Z z#M~-6F6KT7=QO9zbHXqbhkU&blhxPB$X$tj{hiD=FuMmincsyO;be}XC(dRf5DK}i z3?__(AtnW8`*<fa3}!Ra{*X={jK9dqoClN5lqIBd156gJH^kfrv)#qK0HY7f4&SfC zgzi&VIzQLZiEZEvCt+Z9NgyFLEs^|-Y6C+v$*Fh5x|ww2H#N#QbdqjA*47zNUgk?k zO<$<2H>8u4@{+RE5R;bv;mNiy6?>X7L0Mf$Cn;m78dE|{&*a~^<Z-4j-6&C37t%>L zZdO+3WCkf43o)6-iK?FuF-eJ+tA5_WBo9#ie2B?3-k`lWV^1@3m1T;K9PNOm1Km2w zDYp-@7}4p5&fMV^qsuuZ`4(k$p}10#nk%adF-gfQm5n)=%mvEEoXi<T?vRs`vXqU5 zbkZ|+mWS&+scbByla`r7-|x(6dg3}Y5{XXt>d<tjAvubUk}C=f#YpVX_D#v7J~GIu z97@ONF7ImOX{Hen9VLDIeMp68J}6T_^B7_JQaXzB!pNBpM=06xL*^|Zodqy)E}a!H zEnPYfn@lL2?Jx;0oxLy~S2$6qV^EH`TETR3=_JGSap?>*eF5ei=^Vr%E}fY$(gBBb zE<wz3=`4n6L^;tg&2ZMj#JQNQFdi54Axy1{IS7;GimNGwmkXoIushcUf&5a=xr4wj zI;vJgj?PP(ysRZJI$S!aF;3|yx+4Kdnu)+nVHS*pq(c^^35YVi59#<}s$Dvl!4SAZ zNA8)<bLl(;BUgtpurl0nHw#AWD8%fA+3aGXNbGhO(*|Y%0fc<@gpo9dQaDO<U<i)5 zth@&~!@-Qb5K)+ruNs)8FxnS_aWzb>E3SKCR=Ai~VAi^rZ(yW14y7=j1~%UnR}Yv~ zc3f5pY08cijzCA!6H4JUm<McM2*zbFD_lBv!EA;J<zfp=mMcBGV6t7zuP_T-Oe@BU zwXTq5e;hHVP{_kzHoA1C!0d48l*4Rx>CA=s#HAy<>}+-E+yS%CrE@>bc9+f;n1e2z z9Wb@7Tzn6+*2OeAnvh*gXBbIysGR%3$kkLRrxRgzyL2jHn!9wag4yfRSq<ZH={yS~ zoihnA?eHU*MlR+Lm^c^Hwh6W4VormR@(HDR0!&vsF3X~F(ZL+exGK<zK_}$vN*K91 z4(0R?m|9m{kHV~VF|Whyb1`4R9PJ7@>KNX7c7@ymrlm`#3yjRML$PPUFibhh=WLib z7gHs^T+BikDd$kW?uMD{3i&CRT$it%Fn$+v0A{U=k=>G{R6`;6fGKu`JQ!xP%a<2s zyNjuYi6f9uy<ZQL>I!)^Ou!ZL6EGf^ueV_mUCehdeizduj`r>fIRPf<3b~gsE??O& z3tY@pnC&hm2s6YL@*<e4Tp_Q7+3oVR31***c@rj)N)MIB*DzuUsF}7J6|dj%4cSI> zm@JpCE-=|Hra#OA7c&KBf-B?-m=&%xUkX#}^0f?Rt&4dOW}l0B6(-je@+acU74iWX zv6fK2j%%v-b|NS<rztSfNJFJD5+=^Y6vJe@m`h;%u8^0(Y_(&zdVp*lxEa?2=*Yd| zP<q~kdDHfVvhf3q)M-ekVKYPBCkdswHOwNHPIs8ET;cSE$#tc95=^m+se<vlm}_Bz zF6M5SEXJo$`8*G^)D`<Km;-j~R^GE*dH*Lm*{*QnnqwO-rZY^gix~hTuNsD8_rfGH zu7sF5FjDWK5?cfl!@Nb8n3bMHS9<P2C(9MivoIrE%r2N57xOdBWEaz{1+y;~(+$S& zVurx1Wn2lR*$1=5mFDwdWOnLKv&WU@Md<8s`ML+@1lt$N##1nIA2JlzhcH`QOw@7M zs*5=pM!xA2^3@k+w~NVx+3R91f;r$~mczs`8im4n8fH5^dx-fI<`Y*gqL1ggz?BOR z%x;&jzA&G-n0%PME@m#wJ{Kdq;u-YOq1c~=IoieSfr)c54O=q1a50@=TDq8_Fdi2( z4JOgWTm{p|#oPyz<zlwOWV@K}VHVH}gwlLmEAr(ku{4-eSBZ^<sdf1Zz^rgFH^8iN zF%QA4aWQYhtaUL5U^cs$R@_m0*~RpN+3sQ{!AS2G%EcU*9WG`W%uW~cB+PCX^C8SW z7Zc4Lk%KO#gFH~8e+k7k7$(le$i9NxvAmGZ)e?@YRM)^{xk~j#7`ciJ^(|k)jBx2R zIe|30LQaC&>te>i>~k?SFb7@CGMG4QF_glmg~1v^%;&<m(j)s8PO#Hs^>qyBj+tjy zbP`;?M#2=@zECz~ze0~Iu7xmS_o3JyhRJd<@55|%G4)TR6}aN+1mkzbH4H}VJ`{2R z%x)KRK8y#;3+dbpBX{IOb+Hy^jw|HnU<SB!cEQYd>HGvEH5dw~*-4D2E}iZ$iLTg( z!DP6YBA9F!GZ$vNi@6;p#}(J(Ftv7ER((kgFzlN1gtyQscKP}mMxOJA<^VAs@uQD= zhJHqtoJJ8EOnnK*WHLQrOiEI2IFr0KoJl<p&h*Tnr8q-Q$&|UMlSxfp5#}p3b$+-` zPnjdRd}Ydr=48^6T9Q*2lbjvK^h{eE&SXfbI(=m%Nr}0bRJr5fV$!#UGd-me96A}P zDcRvnT5UL!u`i5C&&<Mf9pPjqXUH|alSxV39nK_o;>ymYlad?G^jsCrWXSbk$X9Ao zN^%yb4kkG<eL*;rxjT$WN=l?rIDI80`@@;E&EZVXILy-JD>FBYNludayi+GRMGW4_ zq@>9l+r^~UhB28b``k=Qa;nTu9llbMdoFM@smU3;!<dvrnL|2!rKY3=!<qE0;Y^0y zJazfX%nD;tQ|5;=X)?2N`bzEDk~xx#$;=94(vpJVOv>hPCan>(9cMUc>4{-XdP=pM zNlQ&z8^)w($Q;QLPFiM~%t;(fdU8f>7?YZ@FO2D#n8m>3^p%;mz|HhbN|I-G4xOGE zsfk>tIhc&3p209CJ!yM5li^_w;P921k>U?$(q!He(n(89&X8GwlSxU;4P$y{tPNu_ z5@qXbr?1SO*={B&F}XI3>DhB%7?Y8h#a!GGPEtnlf^a5tM;Mct)RK9E(^qD4wwp;w zOsNfHl2c^9;qaB3n3%=v!o?&n2xofk4rAyO7*w3Tl2U@<Oqz`5E}fn-cDtC&;xHyT zacwx0B6CfrujI5&%>P_WdaliMuLu+*3>|qk!;V1%=ia-Fj|?Z~LD#O1<{pho$56g< zv@aU?A$@f=eJLFkK$gkKNj;-`LGkp;^i<_S11FqZB|HC(@vwd_Ad4u>?F!hpprDjD z<%QK-Y#hQd^yW&qs@m>Ab}@79Rputxs6`Q#KK2VM@L8I&|Cx9+X_X3{wwYBv*;K(w zY)M&3z>*7jG-=8D)jI1;?F&>?UNOTWh}K(>UtVpUv&zCN8^p-D-ugi8E2Oqxv)->N z^UZdhv(E~NcW#tmhvFp7lsGAsP_@ox77Me=D~z(L(o)vkO!aAr4PgT8W}{Cki}U<G zRTwkaWQ+Z6lq?&oSTgD*1@=i*e(0poCkw{PD}7#huSplF`L>wkCRBA)x@5*d*m-eq zW>y@G$_Z;pMpl&$DycS*29(S)rIEhM$~>|}k+P1(%k~H51=h(-*BM*exg5jJW$QRq zQKpTQmQ)73rRC+*tNaq<cvXhpQB>~;UzsSX7b+`D%LAB`<jXW*Q68=Lr11{0O2$bJ zMzw!Gtiqv~V{Iu_hgA0D&=lXJD@uH20kx%x==W1QP<e-nk%mr3Nzu=&Vt*cQMR|F^ zV3R6u5&O>+Qip086EEelACOmVXNNa4gJf=MpjaDRNu@Rysotu9Pn~!RDVMym0-siK zY}uoAl?6(Bu@$|<Y)BB2lrnkgG#_IuDyg7+WtR-2l2R%w)G~XIu;tFVK9xc-0kKzn zX){tM${NJUG+^7+I=2;+QQOY?%yu;Q4f5L7YpCW*qo^n^^-8O?&S@mxaz~L@vH>9t zTiOFVCMsE)gDIOSbDxK~>(++Vl$X-j*l&Xky;O8FO3FgzCate7tK*flxs(fZ6jq6a zyQ@ZLy&6pJs>)=G50y<xu<cS=m0wsgtE7@$L)>2E#bK|#|DJbDPJeIzVqd}Zv4OmT z>ErV%Dh<Vn5%y!pBz-ovxGGS{)?|j)J9z96wUtbT@&!SyS5=e*YP<y!424iWy~JlE zu)QOlVnTAVEv6(H2~}mY*_0;1Y0n929e|rM)#{kKsauyfJvf_!sq3Pw=qV}Qf|ji_ z)rOdcm4-TeBo9<cL=TELJ<zR4byWDQ0mzJ@F7NiB1}L|#rrc`E_}yxXvV)gx?h=?r zjLMtgOGs4Rp-PU6PpZpf00VrLs^it^w>%7Ds~+C~S+HT%p(`${K*C6Oszc+dJLwMI z?LmxRjk|9B5bajC2O+n*O_Ml1uBy@6T|AK-RQW`5NS1;Nb8wVgm`lW>bLcqA&c&LU zQ=HX<n>llF5qot<?hfysq`LGvqk{OivUJD*>gFt>s+GY*I6CuLXBcv3xUQqqYu&NR z>9?+{q{catg_T&ild~|w-6EHRQ_EQdZr(EC&@gIQuY)m_oCB<><)TbAwT{zt*Rman zV^FrEad6uH^gd*a)s7;G;9`|X1gE+M5~gI8M;+Qssgu`}O*6R>93ptJn|uUcwwpUB ztD`e}%)>Y)xn}Wtmg{UTk-Z+iNX)r%gydQ-5pwAq1)P!EQzL86<)}yL)t$6eiQ#<R z<T^F1>T`2u5^d6%J~t_6)-2C$XAxYSNeuH8Ih772XF{E{Ga5-|SP5CGmQ$o8SZ;?; zLwFfDLsk<rdu|(+1Q+j&-{lZFa$Cij{SYac*JoB9Orx*sP&Z=B%i&@U&vYm<m1XnF zG%Ujo))}jVjvS?Rooluo$%93SY+m|?Mdo0gkvZtdk(mn4a<wRljM`O~(_yhWX=ij! zK5~4PhBHE&Q!$zs@Zm8!XjhC5{tz*m8m<^^&e6o{UUxZapsu5uw1qCp9O;eVVkJ3( zQ{7aDDOm}xLz`*0`0%SiGxdjbwzBTHXtXlyq}*y!a8`m2bBXCF4XtGxlkJieepza} zBu8?wN-#ojbxSZz$(>+3Db8plUv>f#59#7cw9Ahx(UwbuL|aaWO|&RQNVK9uc~iYm z#6-JYoQZb3I1}x5NpTc`+a)!UOWlmxo(`8$rBpYgCT&_?*xd-zM#EUKa@TDK>BSsn zb9ncpx_2{N{*(X2J>^f_Q~$(0?N8j(5AAN1{2?<~xBMfjTD1__u@0;H?8B9>TOmRL zyA>jouv;NQ5xW&4l(AbOLLs{qB9yXQp=aG{a4Tf|nL_5DDI_KSsm7m{Wzyja^N{vp z=j1OKjM6=%#c0>MCS!Gd=H%>86e4BQ6+)z3x)dUrj7uSs$+#3EnT$&zlF7IfBAJX! zA(F|s6e5|7OCh4kxHbN?EF+qXJB&Xq&7{K>=b_Ecisi4Eo#-Cg?6j*jUt#vDt_#D> z%<?bOfXE8sV&8Xm-jR0ncYm(KsQahkF#i6j4kPj5bgY6stWw>wJ*2v`cp?^peZSNd zg!A^iHH&m6+v)D|=(>G>r~;0x6js7@lp+>Q9j!kp8<&2>!f|Uz=0eXH!!qP{aHh}g z5;;vF9cMb6ti$$A+I6qVkv5aB>%qR8<fuh6EZfNyPS|~>L%ZqfveRYxi%<%oTTq8B z2<uLg`Mf1m@Rmc}+=XAro2gMWx4^k^&qMf9-z;Bg*kdDm34?l=WIaBzmnb-&8tLan zu|1M|W;nO0OzN4Gnvt53o}S`lJ)We*#PsxZk0(7fv1g`o%8f0&w25)k-1MTK-s8i8 z<~jxEHYP$P@{=Xyt|K;%?M^~lnTXp2zg|YUqC#uF3uGB_{Y<?a&FYr}JDq2pX;gZS zZAOG`GKfW(=q-Or>ns91Ms}`q>l1O2Wo#wS^WnKyv|d*r%gD}hZY3fvJ6Kw`?p3X0 z{YP)J^Cev2N3dSx@;BLp>n*Lt`ZB^x%yPbVD=yjS_4tQjT==%ulME_7#|xn1vV!09 zQW(x7Hqq#w&y!!rL2z}Bpb@v(wg}Tzmb6T#zAE|2A^x)Bva)O&QLJ7XdOkXrgzGt$ zsfcPZziUk$)2muNgNgJQFmO=caU*g@4DHve9sl}|%o)(m&5j;1U{v3c1IM=WP`t)> z{1)&VW5^3b|ITL%%JZjHPOeT*ojgFSYjWibp4=CAhvfsEed3K=7Syt`yQA^L#j?U% z<H(YNit@_xqJXE<m{UEY{ehAhCFjaFAo}y9f^R}psC4~IdQyx*DqWH`Iqs+MSleZ+ z2CrwKlX*<7$WxCuy#>C~QuexQ8kc1`fl>kHkrf{oXVkZXOc*3jl?gCDJ{yIv+OzXt z)a>$#>7?LT$O(`Eexsv&)r!as5jAXp86WR)5MG}5qSwNRw!$}L=NDR;98J;g1b(X` z@vDT!!zIFfqc}y?W35y@W3+_uJ-;3NtV8l%%LyyB)QhCTXVo);QXa#>&fq9;EI1mJ zh{u3efaAf<APdcdG(F>NkR~HrXazq6r+^=WUT`0n3;qb^gVDrW0M-YKz+`YLI1pr! zbMP#18ki4G2g|@xP(C4A2FeCm<=|ql0+hN7fZq}RJ;>={b(~LqvGUEB2rde%W8HzP zTb-(!gXmd@yPA)2RP#Wyk{6)rs${8v#gHsAq>@=>QqAU$@$t1zs)o1g<KqWFnWj*a ztZcz!D-~8Nl|BxYB*kQem}<?W+Ds9_NWfV(<Ez#IC&1_g73#R9gVb>s)#zZvkW9u5 zSj@;`l3h0VBJKRudN|9*mD;AoVn#<5)_5xvHH1@5u~eW?QQ0<CSdEr#m12`Y9T*b! zL7~@zBl%IM>X;U71f~A`U>9&Em<a~J%fVUTHDEP(2Ur8H1J47uf@~%e+y!0$9t1B0 zTVW>`fwHOH#h}>WTu>U=CE#fAQZNU+44eqg2MfU~z;ci+X@axCYe0E@=~_@;xmy6r zM^&!_k0uWb!IQun!H(cfpuAkL7+eankxlR}a0&Q0cnc_7^ehFXpl<_z09j%lOpaze z1Stb!HHfaU2D}5j7km=D4}1r_9~@0(tp(2l*MVMeJy-&60L#D!z>OfA<pgE3myO_F z@DWg6&3+UtVmbL^U>V3JxxrcBCNKy-0bT+Uckos4Y4CIK8Sp!B3mC%~{VaGc_#AjK z$Of;$E5NPbBJc(9X7Cm8L2w(m349fN8{7_#WU2XU;5hJga0>VaI2HT{cs{rTycv8C zTn+979|1oAdthH5f&;*hK<N|M07&&6^hJCI-90|sM!fy7nM=VNBKIBoCWMR;yQy^R zAYAJh7#|mF^ork(>*%N`H9E+<Tdt0yIW6e`q>qkzbQD3#5-im%&{j;A6^Sy4%pqLe zob&Y{GS4RHI7DL=gl>N`YZMW*HS%lJz;P9XZrzo|B}D<HR1BA{qGul=31%&X*^G6# zLqZx!N~6}+m|3mD-3(F1PqI)|ro*k~T&Firr)IuQ&>u-e8zIbyG$Bbdz37;wPt_U~ zTB8$$nb<@XhIGZIhI`1A&tWg53^|S=uH9hs1W93)I?u(qfjX~H=YIQqrV2M0I!{&# z3v9x#&a>_Fe0A>O{1_GBEOnk`yXS?vJvA1~Yg^VKc2>*D8T{l$RXJM67{PwvDPRuR z5iA1Pv@tjvJQbAwuQRv=>;kR<6Tx(1O#|hX9QFkdo(=W{y<jg;`mf&L#UNWy1!Zf< z)4+SdGr*l7ud4(bla{_<8?YaEDmVa40SAFY!NDN&1Y;yP5zGb|zl}4&bHTCTJa8T; zHE}a|8@L3N7jkX^9|4zwvY{l~R0ZDyZv(#umxFET&u#|?gLi<l!8<|vR%0c&3|s}S z0#}3dZN}XoeUq^Ur0+1;>?+tahW-%j2Cf5#fEz&BV(US07WfcY4bmqD&j%j|NsF-w zd<uLLY(~Gf87u~$25Z1)z$?IK!R_Gl;5Xn_@M!Ay1+X*702&+uz6@4?+rZi2tDwwb zmhlUp!_1}}WU=~8@W!xyNI$31s~@EsibKyj8d(C>86PL(wFf3%HS>H~q$q7dlyq|| zQ0L^)Jl7`8snr}Y;fQldNnb5$E&097PmVtIji97C3+x8=1;>E>K<O0vgSUbMzz4yB z;IrT$@O^MF_yafuq~A1#f-OO|1Pk^AM}V@a#7J;1I0}^c9~-v^-vF~gY5iw{@`>>= zU~|$r7VHA%fSKSp@Jw(#DCK(=DE06Yzwq&(m~mt<{Alo|uzE1(lA(%_Ufwz!6=9AC zdvTTVz<K>JR-T8_k5NG+#5F?5)j=aj*9eiME*hjGanZW}mY3!<&B!5BLwVCqSAAYZ z0aIdqvCtwx(vj~w*UPHrg6X=3zbD<ht+a!Z?^=+zF^o6)$#D+lBxR8cO8-;<O6Sjp z?m_9Wec&S?bBEwga4Ps4NSg^tFIfW0*1yw0ALs|yk!I!=!8gF!;6K4?@K^9+P&S^L z2R;H`3ho2vgMWaRgR;fcm0%0-DzG(pE!YuU0QLs21GB(|pw#nve#v3uehnP&GO3Rm zEDoz@YmJ1owM2BR!%@YwH5u5laI$MahWH^6(InNnD)g$l_Q1O8S{h|1NZlx_Ril(i zyFRZm8==%uE<fv#G}rQz`xR0jax5l~l8>7~sk__2j$kdA4&Dxq1y_Li;GN)1@Gh_t zTnS1UE#wzoMg!p_Y#Fm|4l5&TX~%!AjC4mNWst?sIwVcC{Oa>d<tN9z<U!KO7J#Y@ z)`6#Sz8;jcZvZ8atNDfBALs?woS%fXBrK0=;wP_z96pm$?^$?vwNMI9TZ79yvQhgB z=HcjrC1C52wAS)-=KWFfCh30+<Sl382{0La5|lh`1|{!L@e9xU064Lk)A`*Jo_Bc! z^5=P%PAd!VuDt6`OPYd<)}59VfvZd=K>Yh<B6+Cg=PZ-0<XQ6d0@xmW8I)`7S3t?@ zHc-msQTm+3uzsNv0m+yqxHPOxDrftAeq{`PG_1qjD>N~Vj<;OEu+w85_ZUWuN|O?) zZ>c9h$gJB%$lTXSq-KT_8R10Fa3VdNNDCuU!o8$~dr7I|B{e*ZlyD+EbG+l=&Pz(7 z>Kua<ldE&ICNTjVMn@HuaDz_Fj8V+Iq$!YhG~|USs~gpta)T{&Crx%xEyoLo+)0!A z*J{eQ@|t0D`Yw+2^^QAhl8!7WkLu5*!*fM&I@Z&aQH?`1#oToSEMm@cY08|YT5C#* zr3L6PXVTHj-Ma=Zb=jr=Zl<#wqAu+tTs_n`ZdZExpV(|IqL}R#O&M=s>tfGuf|=mE zpcKna@HUVwQG@Hi55Pyj-QZsEV^DIp7wisx0ZJa&Fg3V@oHOqYt_Qybp98rM5c~xE z0qjoV_k;bxpTKPJ05}f(1<VBxf|AMKz;~&tKfqleWue-pY@r`MH~SQKsWax)#<ECl zllO{bgLc(KccW+>jwWhdtK(!}t0VuJ0ZK)zKu_0j8TIv-4AL^8wh0nlr9V%6hHSJU z8Ii*05F32}47bs>Hm7ZL73U5cb%s_$@yoQCL*m^CIt<dXv}26S_&#XLv4_4#&aa{( zoabC{+2@Y2NUnsfL+YZI6ParaF!}n_ozzbQ&<}D=6g&^)gG$QA;=xZiZwmelHUneu zdmJbUZv)DFzbz>Dd`|+O0I~ky+u+Hd%=6oWEy%(tU_Y=UI1=mva{t)q3SJ3z2OkC# z!5Ffb47LJOz%(!w91f;~J}?uM>&;%ETyLHZa&OHz1AGwd3v$oP=nuw`|AAl!a1eMp zI2bGfhk|mQ$@Z+lAUGPl7t99bKHM0PYfWP;_#NeN2fx$9#-Yo|C-3YV7lF5i**fzQ z^;)BPJClb9@@Ab(QL@mtj*!XMW3C$UfrVTjNatdiTv?!`tjbrYOfeDu?iOOSzKRN7 zWmHxmbFm;l>yR|oa>5=3DiGn>mNh8pz8pLSyb_da!>d4<ms|~w1Fr!mgV%z2;B}yU z_~b_LWRUxN!PCK8!1KY|Kq-q_P|EB=<czQ~OQ!#m@x2vz+u_Pgm6oS3s^$?YEyL^} z;&8P(h(u&p2O-6oh1Y}xQOd6>DxwCYi^zg)kHhGwGSvogH%^O_^O}))dYV536<y*r z>I!Y2eJ(czbqz@K^*Fqi=+O3xsv3;)dCyP{o*7U&Lj46(Re8CPBigB?p;zhZa^!yW zaDE(;-~*`Y)XY|1_lM5q1FDKUXmge=m`|L<9yU`C)*<Cz%Sjr)2TcA>sYlN50<*!D zU_N*^SPk9-&I8wi*Mbj#cYzOrkAV+?uYnJPpMe{}-@(T~8J{+R3E*aMIQSG;0d4`W z0iOf!0G|gR1=#>N_!Iad*pPB~36y(YFN0Dp+rjg}x4^r>e}Ml0-vJMRJHZz80q=t; z;0K_LYr8<XXSExY?(`#YCHOJO{dnV3ko)S!XCU{zjlJOe;1}Q*;FsX<;8$RDjA48Y z)(5`<j|IO4+koGL+y^v%1iAlb`~*$`4}j-^zk=6-Y+|hXn%}_BIR72|4g3SFM?JA` zLNErb2TFVT2fy(4Gz@*IyF{=ytUb9FU#RwUfKs&%Ox`-o_Ou&Ut3Ao>j7jlwu0v6l zEH^XGQ6#UP<;|#6WEP=xP7qD=A*)<#c_1sB3u!K;XTqZ|r*|v=fxHT}Qj1rzL-VBh zj?_uMY6+w}zd0t~h;op;9tDmDV?i&-y|dsnkS(Bt^T8J267V=sM%b3%X0R3b0eAxV z6WA6MJ3R?JjyODED%cL30w#d+0isjD#b77!KCm;m3G4!H0lR@8g5AO2!9=hXMU@1m zg2^DyZjBUB?#ZTtJUcZqK)Gj^3Cc$#`ha53r-5=0<_vHXm<7tc*nZ$1us>K2I~)im zf<wR|;4p9sI2^11M}j;*Ge&_t*D^+fV&~Z)&v}d-unFZn4vYuS0>ysW-dfq)yOd2@ zSpR)9TnB#F^IIO--sCNL8S11fu?|P)%}^&6l8ckRq-4K@@`@U-ny(eZZd4Y6fyvev zUatJL;dDz7b24dVc|%a{s#w!TWrCIpse4P^6UsQ?fm?{ZkB-uDIczQ$C+m>B)$()R zyO~2-NPf=;dw>^!ncziWKX4wH4_*SwoSkjIgLA;k!60}A_#HTpU-<px-f%MSm%jM+ z$YrUPDjojThBeUDX{{cDt&?jR4`lvl9g>Dxelh&y?v@<al4eQQ0#K55Jt%2hWagz7 zIegwP?UWK$VcZcpFM1K0WClI^a9f6CMx0%lkx5WXNamPSp}$=AMUdO(!h7J`@iX~K z_H0nKEBVagXC0EhT7LEUiHXRujQmJsw}P!fHfRrGPO|N-`l8ZuQ0h+XqE}cu5L-Bw zpUj)oc9tNATC-wWuDyWn-^jAeE+or3YihF=Yr>%$4gF`OX~ya~mb3-ykhInEqqx*I z{(!NHyhwUigRQ{3!IQyzKzW{jA1HabACx@b!!LZS5nE}-Pi*1NP#w!l^J;+*dnuS3 z%SetrXjw<yN>0S7W4zRxxqMHq*2FMFIrawfrm7iQ7PQW_`s9LK4JAX#@mYJ>^M|J) zQr{A$bx2yJana2gQm1l|-=L%)Kgym@0VS_*@XHLV-<5DuPRse-6)CTwxBd^`Je~Jb z<ijBLnCZ&BRIXIvRoEjJq3q_O^s=EYSEV!~FHpgrGt$FNfb=P{&{rDBQ=A9R+3VS5 z;>W={Bu`Q%je$awq+KX`z-E*^P_V%i+-M_eE=XOg=S5Ua@N9VczF-AN`3BDgxn~oU zXJy>O4N6&Mfl{V7@e8+~@o>%gNv>8#DpQ#fs0|bT4f~N26#H?Mpio&*SF6HO0o&yw zymd&rq+FbR1C^of*$xG<6Jt0i!H)nX{Ubri=L&wQVYc%sob;bB@LLrrpK4Ex!<&uO zt3MGZ20;f<Rq9hF;UQ3$>BvK+PLTSc5-YE{XvmD;0wc$#W&@G-QLPyLPtqufJQ^s~ zlzbF4DCy>!Pv!j_P(scJ<z9UOI2Ocqg2kW@yZ|f$uLq}sa{s;rd>)(*N*NHoDyyH7 z!`s=%a8g9?^IILMtV#<Cy>e5gQq3t6QL~OlmVnj8$Eiy@7~Kl=3X383xn2n&tw$>F zV`UIJRGD5(fYTj}IWJWu4QV7MNbze{U5vGalzx-hu6mqD^_b&QVP!x~VI*04q=M0l z+Vm7x^-&VNbx7W&4jKXjOtOlyl46(zdO+$-%`?siDNlp)4n7B72uhg+`4c;w6jgVO zx-wd?n~}NT-I2=H9H=N_Rk-^I$2uH^Yh4}SBv%I!J2ZpnT~;Z@+6eNfrsB)G2vEa2 z>_)}vo!0D*?rT*mjw_3e#F*@?fJmmUpPv#Q(despx-R-eIoDR;LDp8GXN1x`E+P?f z<PoQw53A=sZ$^>HA?|jckzslg2Ps>rJCdh9h9KN!)I~pVJ~#}#9Lxh3f@L6WBuKp) zi@=M)8$jHouT*{LVsI7bH-nFYOTd@FrQkc@GVoiFd&0rCq~&(72e<+(23LY|4MiBi zWgu-axB<Kyl<Vqyz$d|b!Pmk2z$7xh4m=ZF56b$h4d5K`0dOw(AUGd<7`z3fUV^`X zkAbZzhsVJl;3jY&xEY)TJ`H-oXTa}Bx7cX!u)dP@Zbm=cZUyf-yp7IMMoQrJQP)V< z;&w<Q-Hu}&Bi#X6*GPB6{<)DJ8GDpoNz6#wsJ|poP^@gSImIQ1Wuu>moy)C!%iXro zPNtGLNZE>wwgXNu`4_1RDR1mb+33sQM9yCU{oorQeT}RyP-~3e0>wt(1+gdNJy7}| z`kvsg;BK%DVSflFfggcGz>h&$zxfF$>o@m+@*&{Q!0q4{pe)V!5^O+5z5?5VUxQiT zH{f6pdk>BPv7aF8kEIU{z6AaVehK~)j3S>ufi1xU;OQV~3+8~ofztnRogcgmq@xN- z+odB@HhDB@I4#U3Wj(5xVn=XIB%3t%AN#*BE{Ux)CuvpuWPKm^m=8Tx#i4YvQq*gi zTiPBgt7fRtOB#?pR;iAT^0gMXBXNC08Hf!v1`37XVEvjJqjEtH=LO(Ua0V#-8|&KC zeL_F@Fz4Ls3w{Lhsb|%11;BQMTLnrP&jO`?=z|=7kNsxqxF2po@ZLyuVUA&DmHdTq zY%if%ce(x}!&WCE(33HLc}ZD7-zB5ZtUH!v*qUsO8F3yjcg+%QEghbh{l8QPAuEyO zum&lqJIRrCNZCo<wFUN@<oT4flqa8^Rqda9^ubA-2SLUe`7E}24s-=5bHuB`ognvV zgS2JiT5un@0F<~Ef{j5wdadrEEdsl6&L?YwXMi_>BSG$;1+f!j33wgI_@wUn)`Bl^ zemnRs$bI18*We29TW}?KEcv(_Oas?|(jVLl`atf-1*d{*!Rg>SP;BWk{D$9ek>@#s zaa#f27txl~&T4<bhISLmA%__$mX7hFU|!nFbx0$~uuGFTr~;*@uJ2`T)DlWx+Og5& zR30hFG^&uunyLtS9Y(Db7B<&r`5Lgz4uP#Znq|YfMl<O~QXvEUtj9+Z{{+rmw~U<6 zE+uSvOw1v=LC`g2lc$$5m%2{t*k-Bby*tR6bx1vkU5fd?Z1T)c)H=4uz|ruJgZbbl zuoC1Mqk0Cx{3Uo5=bOPrAopL@dfVr~7dU?&+y=e^GB(IZl7r2N<26u9_bo69<XNS9 z$AxqSX$!`C;BxSNkhqKwz-Pb@K}q{ZAa2H|po~*{z;@tXP}bjm0p^0NbyW9sc?TgV zp9;p7gLi<~vU<+>9r!foKY%;H{ouFY0q{5QXE2Te{1r?9e+T6m#vh;*e*Jp-9xr2N za2n?g!7A`5karo3#-QBmJqBC>(sqJRf!xmzz68dDd%#5SYmha>!Gj?8snxR$+F0;- z>Zd1o8khkVg1x~CkjK)&t3g&)1g`_n0HwXX*qr<BM#K1TvDBu9ezQ{F6{0yciI+!W z`UrpT(u1dy#k|#)vtx!19F@~IXXxlr-kdSx2Ifr69?0}XYea=>WRD)3Gq(Sjq1idy z3TznPGeJTbt8YaOtf=sgo^B+Vd;=#xv}_ieyB2!;R!ps$!49@OAlJT|Iko!dm6frn z?ikf4cn6o(_=~x7q!pVx6|LY#>)m#3rF^H-7=1T;Gy`@~DPN*)!y2SED%+B1*|3<0 z#N6*L;+0fxus4ZcP0yf@(ET;tpV*sKpFnE9CX5DBFxf*V3>@JdIeNfA?}+{byyI0e zCJ;zWurg4RkH+8;6SIeS2aO&xvM-zU4$T?aH(QmDRw@ltm4_>h9>+_EqXw!Pe9oC3 zxy@N=zW7XaH;g~YszI~d+roX!{Da6#rd1N|z)}524;VUXuy^dRp<@Zqa`t%gr#hXp z$Mk2svRu=qs+8NF`wbnOW{Aa@VVC92c6vUm@2IikMh!Mjv^DaI%cnUthK(N5x1VyC zo>$r2n1Q1P3>>3NZj=<x2$cYFR~F}VA2D?BkR0l+VZ1m;OS!w8`wy`F#zb(WRy;<d z_!seu&!J@n6+W@Qyi)H-AGh}kD#tJlI2Dclbu|Y20?GzW%|TcU3279+Q>%`Z&5Fn9 z{aU>_HGZFQ5{?7wh9e#&9<Ol<3cc$pSP{u?sVbIZ(Ys&k3FoDgZxrv*h1ahp;A4*Y zCwcO6E45L4j+s)uv337EHr$o`w!rBZOvPOyDiTMm)LEnW);fei^4d1Z>{~cXc7U!_ zsceh8d<~CaEcfBQiZWh6RnEuZ{H}H$!Oqd6*#2A<LNoXp&1cIqO`mMHemo@W^d+pZ zva$Av^1MPjl-IR`stj?EJha9`<m`D>V2vGt4P|R$6_}LC@!CP9xNm@^-^I$QBTlDl zC#RJRVsCI2uU$7%Du=0LZq_u4zrc}T-VJCJKhHsU2e5showrAHJq)NQp`Y^hS6kvs zVKmY{l#$sU#35QcsPx+oVjq5OAN`B-D(HzC#UHFw!`Q#s->Hgd_vcFVG>uftr(On@ z6_m@?(e(U{;!kiS&ujyV-{IiRcB8850|#&Ft29V^dQm5Iq`KqE&gqqbiYm2jy=1qE z=~0Zr&aR~DW$j>@ma6n9&8f1nD_x?vNIR&S^k!H1WFJ>m1rkMsG;15WNhiz<j-q4Z zQ##T{@mpOf?q6Q!N^%5q^>XdkD1L$Vrt4Z2i`)XGXw9tK)uUSIr&?R;b7Y=hm6oJ- zq*)*V)>F>#4lTE{(ZF<&ZpqHPl+-ruASI<jk)#aP+(`Y5L)t|<hxf6*QWgx_HYz<Y zsWiuB66^CStCrCe-W-L!qF?Fd`B8Y3s!e=rhR=;<uQHYOEtonC%o#Q^+dF8)=)O5g z$r-8(+Nu@%$wv9o%1?46%rqU9GO5=eBGiz|qqIVqYLh%lHAUWGYZTueqC%cmdIJm^ zjp9Ey^Q9*WY^I-s?Wt@q-EI{BJ^JeDV$NCmUG^rBKSJj8=k<7PBDd%ulwnE7r6QNO z=7v(H0+XlaDzI!lFX1|)Za1jSM4rS-ajRshB1q7Tvy)H}9ZeXL%bdQlxK`4<MMtX* z3LRBXmpKyY?O*P%QROG5As0<{&6?eCvgTCJqbyRaUMjVR8H|sWbtUp5O{4fq%fI@- zf-X8SrY$C~OV)0;lIJmI@XCHwF2t(E7`)-uAmh|MPIcL7+^ej~VI<m`WU^!znl?q% zRGYbNbOh^_b99>#6Um@fa<WURWq){OA}3RtvkPc)n24lyh7Pu`d_O{GPqO{6nW(CK zRq=MEHy}8#cLtVRqI}CYXGxT<H#@H~`-9b;(I7r6kr(i)iG_UJ6$do{S|zW1NlL1; z<4Co1L$T71CB1kVH@3LELLOi?ir?S}-S*twvc4R1R;=v*Du=2!M?OR$-<(j!p#~H> zr&)PCPvJ3(qdhU-Wa*={z6DPI%nqc<+P-CaO3Fr*Gh#@?3AIMmyLHokN0j7O<W<zD zgi4%pmre3R_EibiseU!Dk(oMLx<j&tO>G$R^dg7PWN<034I@HntK69B<6|N$?v#R) zdj$k)H)UlH$}WfXQ&&aO8D;C3$Lij<e<|NSQ8|`D-ZjYBJ+RozLT5p#G2W|2);(ru z^oc4IDdl!%38;dTwlv4#S!O@J3RPOtI39B(Sv#q5rad$tFe%6@m7Y#&YPK1X9vk#X zW|z66XI9?jb_4~XEsfidjpC)Oa<a?izFMPrS@WrTGP7Hha(O~WU|QE0`6`Oak)*Qj z@S*ySX{Hx-wP$8ZOj@pIi5`1o&Z(-ZnJyA+g0Bo&wv^Mqyu3noSzt<}N6~D#_eUot zl)NNOAm*n{6m^--mN}lP+I1L<%9>yMl1ZO#?2;abNivQ|hK6c2^Xn_pQL5R;&6;*K zUv>3yt9G!>)!o!24!_PJW+f9WVdRt6WI!95inXp0sXR!#;wf8MIaMuI__Z0C?t0Y> zn?YHEl;MvcrEO7;VwZI@;^pzQV~|tbgnTO+f7US1bf=`i>_er=USp=zDu!3}xjCmX ztzGKGHRsUX?Q**PX*2v@77MH99zNvigu5zJHJntlsEJdVu>}7Q&6%~L%>E*sl)-w$ z@(waTF(a#zU46e&mV3Hn(>7t*KTFxL43zG%Pu^dwGcVRNpQm+{X1}Jcp_ZEgn}#me zQSucayWfb|o2eR;r3fTR7p1BhdC4JLrXR}UBGt7T^}clFg(4ZtIu8}0%zKK%5~K}N zIm_(!DVJw_%8XCBN=tvmnI`M{msTe}!v@=tJR&d+MS77$@i}zFKxNHx7lo`b_WHOM zS5rzU=j}Rf%hpt7-=w**=4h*|{4rM=NBL%}^hy7Tg9NMxL^1LR_Na_sZh@ib_@t7a z)xN2N*2A-T4Wqm3n|0RZdO%s7qfw16Dx%9%&81aXbCFjD%~Ft=PNYe*>eTS2N`!7! z0(P0Rs_jS#Q$D3(o6}l}A;MHh)^ygL9J=o-u*grD>k6}IEpv4mfOIgYYIn6y)e!b# z({?2-&|P^dX;SCjl5%O^Vj$h*)LX#Er_A9=Jzw!v$o=O1{5JB?D+=^PPh3{reOZFv zTXElox9mIayqlsP8aH=spUW@5D0O6N>)tgyTpX|T4t5^WY}7yMzwl80(Doau&wb>^ zhNrjpyfOWa^k0s;YT>$9^7VQlPjshoJ6`;D?XT%I{Ysw6+Q0De)OUY<>Dl7K$M*C+ zkn`n%cbn*aqCC;Be^~GMd)tlc_^q$kwnyi8i#xs9tTtoLdZ%`M&J7FtoO;}YhLJ@A zJ<&URMGadse9dV8sP-=o{A1>s-b-tTO?d6Z_uB88THB!UHOut#5Kr`htaG+Dxa^%h z&;IsaV$=E0_<#5JXt8ARLoK>5OWyF$tGW$R_s0n@|AqUD-&k<h3$Hz}|NS+e-9BOG zm-pXU{><5Z_cu(Rp77cP77ob0Z%_2F=tiybtB-B-<-0LG9(mxtZzmR=_*;3>H;?bT zYgV^=x&>M?HY>e%#`T`{#AzL_J}<aG^Q-0`eEQR4gWo@`X4?HPe_Y+VVNxwm79Lc3 z%Ny;F{pixRPp0=ys62k<EiFAQznFH;v^(3p^7H852A-Mu6ORp|CEhpR`1$%D-W$=b z-EFxCqg!9}V?pQlm!xzUlXFb!SC@P-Vd)jrtJ0fzOOshkWA1<E@%yfRbNlS3zpcKr z<m#DS=FT0TI`ftu!vmXH<Dm4iUn%^0^cxpGo0D+hqdy*a`r#)|yzlgzS3fa$>VQvL z5Bc~Ep6DGFBk`Vb(golA^16TFWka_v>Finb@-sioKXu)Xr*8V^w!qvkUhg!5Ye=Qn z<MNU_daX{{aLn3+^RDbY{*SHYx1P6jR<8lO2d<5t`uJ5>s{J(x@3`|nPwxEY&R=@n zn6$marY#4fU)q|s{Jn1e7hX;*J8EyAByOOxD9sc7N^Rl97c+`m8r#lU?C(=Fc0^!R z^xeKLZ$927wc+~%zoy;_mEMV~Z~wS+`S*+Ot%=Dy`uVs{FRor!k-6lorK@9`HfhuP zD;o8yO3%}H=+oc6KK=RC-Ix8+d)}Pqny&A;>&NF$ZF}2-wwVvy`Du6c9v1Po*;`fF zrAO=WT^{VVd}r5n!*+LCa(|mku6VEZnv7N7^sA=qE@!smiJsA9#YtZ_xPIFS>z+zm zSUL34FM2J$|HUhAelC4*hu41o=abbu_g8u?X8rcSG3z_*`Z4wL_j<h5z3=mnC49H% z<WE*l?t0;{isKgX05Ykegco(m^k05G?#vnWw&l0q-8$}+hPztM_w2a&;u|)4PW)lb zQ3u&4O6etxJ7?EJ-}@JJ+_z%Qg0EM6Fy!?`?~L!=;F*UGcKPG%%^&YJjL((c%ipvu z_^^7z&OeUpaM7I34cq;?{>GB=Z@l#B*pt3_Y1(gR-@;R{MiOtySKq~?T-xs8?>-sc z<mN$3-n(JTjCVf0<k~4)J1#x_hesB1ee<Bw>oGg6>AO#DIdgKem#(Y4ee0MVTj#Ca zwsS)BSAV!+dZ2UMOx}|_O2Yee@riGBSn${@bM8HV-e>pp9=x$-&t`cUmyF!~O|UZg z=PCEFj$G;Wc(~a~*M0i2vGSeozZ>$<?=`DuPigSXcTb$M;F@MvJoodj&r*I$&zS#F z%}3V^o_T)Hqo$3yqtkN@uG!x@W#fV1s6nTnc<Q_;7Ke@Gxtb^Xr1rCtPdIk$=F%6N z-H~%=tB)>gJZIgW-QTx=x?g7F>zcn$d)uJ&Uf=n7tCKdpp0;}QQ}<7Qtss8c<Ga4t z_299y&+AsTuIuuB*nLa-Ku`3TW!q+Mx$*7u;)Y*xS*dTwKlZde_v>!A4ljHvs`+)l zjW4GkJx}Q^eyH=azxKQC#uHk7_2X0P_w;?B=g%>oobT=|+w@zLFK2$WocFqw-nBa` zf}S;F7x(|>m8bjnO|Lqy^Et6yC*8lkW#f`zai`X&PftBs;vLj!lFwf?Vd9;~oq6|w z+0#DwY{;wy_ZH7xc7gBnd1ozp=2q5WDZNeQ-!4o$e^}zIqOnufF3T)xwQuX(McYbV zxTnW=CGXFzoMIT?DZMLR-TnL>y+)q>QHL{TPW`#dF%?&Tap{5N%eQ_0*4!<Vj-OP< zb1wQ`PxSBGrd_^aV(J;CKm0TC^c#NY`sTZLc1#_#?fBy!zo#Uv{%@^#N~-h<o@>9V z<9GF*JTq#^@_#-&;NCaqzEbpcLUp~*drx_M+PS-EZ=Wi?DS6u;svNa%Zr8*HLyW!K z+nmw#^<@cL*KKOJ;j51y?tFbB?{FL=@oxL_xZ?H+i#I)V%8HXNy6@FX+br0B>FS0l zx4gMB*kjujyEgKiT<Jak>!qvTD!FvS*^kAq-2LMPJ(t~f@yy2$OzOLEQkOYDwY&I4 z*25^hGw;j!_O0?}?>~A@*Zqm7PVL=i^#fy{t@t9?=&ioD?CsNT9P18`m3WPbYbsjA zW<M}}?6&V8zjpYP>~F3}sp?qVq{}gt^Do%@HvQ=mrT5NzZ}uNP<)3@|yir~6!7Gpd z>YjT}`*HVaovwTNwn@)D+NJ}GgyiGHp6FYrPA%K~)Ag5T)jMbBg7+u(JH7nYmwId* z*y`Si31>XD@{EglR|T8#M1TFqfufPi)?Ym4hw^ii&Yw8$#WnSwc_#CtSp(NRvuJ!x z!6x#n^cw8gdi0AodOcsgz446f_xpc&ZP`)tE=(<HeQ@=V+4=80TS7ZmdS#x;AJ=qw zX2rg;J3c!8!(}t~>`T}f{I>R}M+bgiow?;v>_BGkp6D(&y}cmtN|WP{YSq5g;5WzK z-(&Ej-`5{m5EX3n;&->*(Y70F@RVN7^meBNZ(7js@_CQ6%IS8|RiE`;@OpgX_}i|3 zdgU|oyG;31FD3Ovw|sF-%yDO3H}~=MrLotHo7nul$yKu(PP%^L@n<~u_`r$da#=Hv zEqJ28-+kS@6HfoVN6QO8i?01K|K&Y7FJ8Ros?_wwYs;Ry@Rr(4`ctJBm^kL_qwYF& z_>~E_?Mi+2tlaaDx$>CPek@r2PR^z)zUc7Ybv&O|de4oz`secc7k=<~OkmTj$=~$) z@cfU5bvfyU*KV3vdGhzKeZpdgj$E#KqQ4t4W9j@ofrBIR;`$^%>(6<(>H0M*uluHR z{@!!?dNWsIFEvW<vcb*Xs(E8&x2qqkI47lE+Vux}y?^;5$4}cIm+?f-_#P`MzbBR6 z+A%Tzyl7<G^X9BP^?|m17jFM#cDwKLH?Mo6-Or1jyfOR!0@g$}mv|ezbWgABW(|IO z=lE&Hs?#Su(tX9-m-hLss9;<mt>ddVfBhV5fRx?`(`$MxSasroJy)EWk#*vPZReFd zbK0tF<_#~6YJS0MFP+7LfM=B6^2SdNn!4fccQazA2X|d^#%-H+_Id8Q7thMLrT5f{ z-?jRb>$evCn6G_2Z|=Z_?|#1O%hxYkw)~9^7p*$=-Uf~K4Z7imq3ut({RGB^0;RX| zLnFVxXVvbe84I2@u6(K8MNf6?vvS*{b+6y_^JTw1QB%trN2Pb`x$853`sKx?-D_(n zZTsY<#oZ6Is*P)U-d7Lyx$wfDwl3Suv%upd-n^L|_MdZ+cjm4|7fk<R|Fh#KUBCaA z!dI_5KI4j(BPR5C`83v%E4?`-XYU<#)f*pv*z>)eGuA)5`G%sOTX($o>8}@#FTLoA zF$>$W##8D2oOkMskI$LXr0WaKzF2nW?U|2_-L)zG-MiLIdw9vL&!_#E!n!%7cm2Mb zjz9C(=FeW(v+e$1_Kru>c64dcX3Iw(?!9RBQSBP;q`&ILdKXXh)0zEGd}rQ(-#4AI zZSsyzk0!LqzV+$x>uRpJ^2eud_<GO@_v?4|J<;ARw>7?C=+T>_?mc$n-d_`&zC8A_ zyfeq8^*QODcec%X@UpS2Ltt*_iT<hf!YgxDUAL}9(PIr}Tzx}&%7LN=4d=|AI(y+0 zi*p}8?*Q*nE4^lK4Y}^z9^YK_&Z%#&i#}<|I~PtKb^Pytl)U`V@&V1)K2WxY{zd8i zURm!S7hYBL(73%T_g>wsSJ5wV=bm`^)&pm5NDY*2d%eRN)>|mOhhF`7ZO2!xoKZi% zIO?|DPhNf1M|-v%b?5y*K6>UYJx7*}-_H69gSJk-jsCqRXIGR@;|W6LWIpOyT2i1s zSX((cz&DtEvnTti^$n=W^5NY84^AhSloga#75bcnr4o>hal02Ei9n0EX(t!;M=CV# zx)l0~j#Owf$_w-SCI41vl@$f%hQX7I0&1Z^_ktr*U}pXNTZyVur$qs&>%Uo-f#m$E zlG4H>m7>ZT-gumGWJ2Rb^`erg)IhOMZqgp%Ky~OxIM8yoj4m%b!hu!>3QJ4!?Le`| z8J<DxMqTOYRGpE2>g2Q7-?@BtrDu2v{X<gXWFEJx#-EhfJ+XUIW@2hm_r%Fn+#{Gw zNX`cKH$vh=%RWMkkf_O_O|-|CR95Acdd3E-3QNi-CnqK+Pi7<S8C9$vsF^&z|KuF* zkW@|{ITkS~wR=it_mq^hq)fZ>npIH2-k&8ieE-o{D)UPJqv2y`e4Uw&vY_Ta9n~zF zNzvcz4?-h|Jz(e;j_pD^GUJeZ`&D*S?=~Y(_FT6^{~I=W<l2d8-F$9c9#ck0+mSQ! zk{NsiOrBEwM`M}&Ux}sczY<I3e<hZ{e<c?Ge<c>*e<hac|4J<Xl}LE<z(ceME%IL; zajl+Y_8~i`BiEJW)hU}J(^cnH1<H%*q#~5ZkxTr!brSzKMuM<@`^XdnR|2K176{El z|3(5GW+4x#|Dz>~<+0O(9mU@&40B2@%L1k{b{~Q3j|lUPN><k%ndBA)%307J8e0EW z-X+trV37+F^}(VelSD_T>WzaV6RKHH{;GU#7KBf+{#GfNAv0_1R$1luvq<XSN^yiM z>?3qbqGSeJcG_tQwb3KjRh9BppuiEDu^yuJ|J&nC*jzo7{l61pfuFaw>>~YJ=HoDT zR#QcqTK~%lRcm$Z)E$8wSNho2yx0!$U&*h-tj!NjS@(@X={j<TXkQ?+<NA>@Bu0yp z@_#Gu5$;b>HRTl{%L$dizg)?V0rLo^k6VN!(a!A=NS`V``3OCCuIzCCO$#atgxS#F z4d;mTu#Og7c;v?Esq${xzg1un%npjTlI+kz)q3Qb9;NV~zGl}^Bz7+;3*DglS1cex z!N{7XP;>lO0&{e1VwSX;e=nQ}iDK&(Hs7{u>t9J#gwXWfD}=`La(*mz;N8Lz@%bm{ zy{da~-q_g6f01Hkj|F3Z;{GtDSYs;dk+j})Q;IcK*&J_gn|@cZ-X~G{m9Ni;6l;8h zG*EGSOexm*k~Jn;?^{!fm2c&kT$U-t8lSMfBuV+*Yf7=k5;CAUc6d`#tdYt(3e9Dh zQmj$RnuKKK*KbO(#(tYS5aL)vz#})x;D9N`s`Ubc6n6$s`bCO0-bB)RJ4`9o*va#F z0^+yZlwytQV=ZouDX}OcPVdRo*oZNuSYwXO1#RvVBmyVAy{1HX@fIhmw8b^n*o{Pl z=zU^JvBp(AJJ#F+QzE}esY>sFDa9IHo9Vr}8XJkGM1GNYtW0=km{P1U2x)@ihM7{V zaTd~9ikoCgu|_e{c*T{PQmlIJJWg@v!-*7YT!ECMxNA%)*0=>}tm1AnrC4JP(ip|9 zHKkZ%6VjQAd&-nzjcrJy75BO+#TvViMk(%NQ;IeAA&perep8AyqIm8+LUHv?Db{F; zG+c4VnNqCL9%-23I+_x;hBQ=h8Kx9#3`82DxS^&LYpg>`RosK7L>xSK*4%NXgx%X* zmd#DKxpJFZY;#L(ZUN7U(^MRbOexkF$1`EgO*ExgL-uaeob1phQmpZU&AnoC@7Ub? zHut&BeQk3wJg?Q^H8Lgandh?UDlM}0oJg@oqt+I8v?;|JYms^?y$4Jw*4Wy{;$AkT zSfeHVlh!-IlxRn+X~2-N(->2VH8$Ja7Mt^X^qz)|jesdpZzo$^hAG7wk0Vhzgtyt0 zVvSDiEUv35#TxUGS}47%OexlgYj1JQO^LROL`4wZ98-!l4%!^=Wh+<uCL{_DJ-;c% z8lTzRmo_JxvTD5;Q;IbvAju=}#>Qk*iZyOPny9#&O)1uBeu|~n(v)ahNEAAL*P0Uj zK}U;AG^JQ$5fT-F-eOatE<0J=(WVq@cx*1g<~Ac`D8E}wDb`qVs>Q7`rC8&H&T8L5 z;_#SKtWkt?w(>j8lwysJT`avW|A)Odfsd-X|Nd`Cz=&uPMa6x<pivM5L=1{LNYKGX ziHb@sHVH|9NFXtpU{ugcK_v#1Ds8n|i#u)=TdUw2EDBn+xTAH6OBIT(sI_2Sc;26L z?!9yGBv9Mh-|zXqp8tJi@;>K#_I<rGo~oyFcpy76kR2b$z8A<U0$Ft+YagiZR8!hk zda9nz4u|kPRz{ZNsd_rUM`i8(!Bh2g{us#K4rChw*~ft_Ymo0Y+f(&)#xZ~%X~G!q zsd_qzLSI(usp#8LjWG7!_f$Qdj|Tg)jh?EflQqPbWqT^hawy*kW!x5es-8|GstHCm z!&CKi%ISoxy(&-D)0q><E)8VY1+v9~>{^=k?~Q-I^i;HI8fu=A-RG%#I?tlo-N>Hz zR6U)us2DLLtMpW)1N|g!`246x{cc~sve)QEdvDw$|FUEBvvL2%1%tHTIQFl9@B`Bm zolie0X)Vd`(>g9cH_=*}pM6GR&PVY?TS<Odo2zefX)DdI7_ho+1(srSX6DD7nf*Ld zeW}ZEq_groL6#MapSh0_Byd`mXlpG%oM@e=uOwNo-#blI;m9{Elwd*DiUj@_c>XxZ zwyehM@fY?aBI7YC-rxsf4JE>;7>*y>K4)`A@@P562ZAceFO;T`@W&6&zOdT{6Jt-? z+<pB`WTLT<nA1+8akk+h6Lg}@{7_in1F^S)IqiLHgj;9F6k&XqnMoP(ENtA_i1f{K z7_MFiYzT@%Yqkk&72j>`i&tqj=SKoN#C!WhYa&+`QJ0bc>xxi}#^hdN&dPZC@19A2 z(#vo5N3QXEZvH~p=IXnqR&35Dog>=j<}XHObtMV3)=Dp|kd6^Edv}tR%pyX*Jyi(V zo3%$LS;?&K>u=ajY4R->2jLbYyE+Ir9<|b6Gint=N~{?B;(;l#JZzh9eDZ5#%1~}F zRPsE-d@?gmY>S(7P?ad&6#nEM+^C+(PbD<RN+fO@mrsP|n~X5!w*HUUSRc36VouJ* zn%x^0IhQZR_f;kNMXH2;(9{D}ZOUmNeiaRPzU}GEL{{4h-&0zE%v(ohZNmjF3!Z;B z=N_D9ci}XfK<SqWg+y#=S5YeRBXCyihhrk|Cp72c)3$8cvi?p#zHl3%|Ci#cTv2>i zf9v@2Q<Yx#P(^koa_(7?K#`xQB74w1ofu#`3N;f`vdMn7Ga-PA<s^6ud3TMPOhsbT z7iz{+Hf*0D@1`j4<Z6n9WqvMM=lPN~M4UHx&ReYW7T<Y`td6gx|1ve;Y6X=@3|O5Y z+>6_DE`M9WP*)O8&J{1BCTNB$8+0PEX|3#+B{scgQnq4U4Bv|IEx)sGm?XaI5-U`l zDJaQ&d}Q02ZC14c#Rt1Z#9|;UHbq#x{)=vW<84=ouceSo8mgX3WZJCQK(f2EtBkth z*{zz|ge&!ASI#|Tcfw{=A({DKX?Wi*TgZk&;#NQ`(putrzA#Hkjg(@hUnl1OeQQbW zoM~4)ZS8j9ld^@N3r#K)mxRfiGB0n6{uiqXQI1p<^-jg>pF^w$H{PrDim%C%aA9_l zGdACp+W(y-MT+^`bzr6^%DMQ1FX?`~aVF>DwbI#9&mYMO(Jv;+zW#ry(ENP$M$*=K z8dgI>MX`0BhSS9Cl`fj}DMu-#(<c#{FwXv{L$((%J6zs?gJqhbe0HY>rj5q$?g*X4 z(3OeSx%q3n&}7o)Dr~$fQ217&fRUJCf3xg3D>}OQ^}z_@SyoaiM-E+*Z)Hj#@U7HQ zAOo50_)$4>wq`mr2O%!)EZ!Y)T_^FZ(VaZeG-%ctojft(cqdPc_@E$#rTJ4*d2Z5N znqOx#e0?8s3ikyXR=iovOofiV)ad8tyJRIIjU-bf8c>oylk7<%D@9gkWY!wu76zlF zGfNYo<fgS`{}Q6UVFzhF4S6UTy1Dp_^%iTr#aP!arm^0F1!=G@pqr<NSPZw0d3D3; zea{{?e#S4_O9M|GlNCzH)(Jb);upo8Rde&_<C7j-D-J6*ck?_zATuUBRx!u-@MTmo z>6UXj-$H1n3`te44rH1UFiy|SR~XXFlxCyR*nE+GGx|w6_14LxoQvk>$MMKWWYtK@ zY<d;Y^Bv3k0%h)`oayb@o9{XJY&9B$_)vlUWyYF~ZeUX$P09(`Y(U^84xeNH)MwXt zKy0nzrMda?!2~J=c^CtF$mjx+mv5y7Dd|9@1JRl!%C>R65QP_!<+9s4KYuCAxqmfM zsb1{BT{|Wla*;^ET)-+Q1L>U^lZ>D8YEn)(YF0w58+@Y*qadrS1S4w)iK0|O5Q<~l zB9nkfW!d1a{|81Y&?J?}6v{gf_9cAHxDzjSs8koCHRZom8(M~#N@2^>dL-A(GpR!J z^OxE1jsNeCTo%KA$pABBy8r0}5tDi1#di~g$xMeZ7aJdK&FaEas^a|o_J883%p;yI zF`lYpT+tCzC`&!TKwq#7L0ZYJ#ur<1Qhke(%emw>d5brT4Jmxl8-u+-F*UIvOBH6y z)aWoZnU1OPBXDbUn3@d7)c6sYS|8_HA6IOSsi;lZE52Y^*53Afr0mxp$<#j4_Do`d z_8Xmb`X>u(NM>T_Ggd!)We3{y!HSV6*w)BhmMw=<+cTG2#Zx^JbV{*O8cl3uTb9$B z)zi1)_*OEEmA0&IhM8GCTeI?gOBuc;YZ$gvlAq<<>gL<Z?BrERel}reKfl?x(%o1g z9*DE(&a*S=aauiVbd0_|){;bA_OkL*u5Da>*S+$M<E(t_gq+&AT1(k&*3yd2L6+D^ zV(dphFo|SViIde@(lbb7dUlm`voXxX&NebEVr?5)mS(T(Oe3gomus@vMYj3wx1Dd+ z*48r)bM|R+L-nw<wUjzWA*M~5HmdfTNmG()8JaX{PLtqQ<yBejq-mY8%Jg4dff~2k ztbU@-Onv-Hfpn2ErSt*|W-8R#hN6id`t7@jA5@`;AI3t&kCYA14}CXx#1Cp%#1CU3 z;z!B`egqXwP1+`Ik)79FSxiz}duMFJhM6vo%LqI%{enDcE6K?6=5oqUZ{|1C_li{5 zz`C|K&bLQQw`FgjZ;xiP4SP8YmZ*rm?q}<9%qHSF3!V(w-FiH&-Jgf-ZauEDJFC$T zf9r8I_D=BanRwdDXv>ohu64G`Wa~C)sjahBDC<Wvxr^9ajkGN*g9(q<`vx^>YOkJ| z16KHAqGyAnv%R=|R_TB2iJ8f+CG-u6|JX0upM0AAuz^eN=Unju^{cbT)W5EhTG}(K z%e2xENbK0}!XJ~~H<aG*eHY%5WO+uC1)JozQ3Zbc1sAkxm8V~b)R``dwyjss1zGF_ z%{uWv_r)YvWB-OR|G8%*R$h@<!6x=oN_iVTt3-p;QvbV3E_Q5s%f1tjOp@PMl2fgt zb18iLh>>dfMyds+np2a?PEid87}j$d;O$t{*4wPF)lsa&C1aWfD%ON*@Xg&e9OGL| z%vr|}XyxnQVS~i)Gp#evI}T-1wjMIJI!*l6;d5x>r;#)@;D)y*=6qDBU8sciZDUf! z{mp^`tMhjXw9ToV0_I!=E569~=AaDRUfgglBY)*?wFB+4eP}x)eqj)Se-ge4QOoyu z+x9Eo>6R8!nqS&U=`?ll5>;jrrO9hTv%$Fhw9$=v()Ikq^JKi|3H#Fj+$Y5*G@ouz z!Mc=qn_EE%%<1TMaeJ~SyOb3U+6_9isKC@Eh7~sded`)$kQ8jtJh#9cXiy%$X)jEN zBhOjTz!;K}%asa2tMCMS@ALCryytwS5Q9XUJw&9ueSZ`SLMbL5Iy(;e)PRZhmJ1@@ zOp!NsGaqO14Lhld;9uMv5(XZJ5B_rIj-uMLYcj&gnLEow11ChXczAZs<#h<~V#JEg z+v8zAN>!r#{fWPF3Vr^jH8Ppafs~HHF5Fdi`lE8OpbRwPq3sv9H{Y*iE2lkF9DfaF zP9eSU+MEGeC{z=d>g{qaeOT$mL3Lumjwo3w&K6j+Zs}06%5v@}Ci7^y@?=Z9szKTR zH3l07n5<VmDqWNk%X8AMTAs<;@aa<4h~x6j7LTLc$+`HgZ`7ZV8MW~&bw#)x;Vqs< zSkK~W+#^(ZNUJ@iNzO1vepPB~Rh1c@J+mB-65mm&DNczhDjx-xb3c)u*PDrtN=+ME z+AIIb*ITxDRp|WxdW{($v=3#jn?-=8;!Gh1Q$iJI%2q1Q_)x_e?^PW9WT*fC27?Vl zx=P-+sXuF|KkKJ!xS6xEq5O9_`>DD7N003-gZ`3Ta=fz(zCu)?1>Z&)L>7E&jKpqR zhI`i?+3H)3ndxA6@HOgVt(^K4Lwd8U@F+9nxxLDPVW%F~nx=Z(US5xzaz(uj^|+Ep zdR%{Z$PdVLx_0Y`h}@@G@N6&_3znd=-D%WS(4$&$&fE*tsXlC7=gd{Vuaw9+o&Hjw z-t`k{Z4lo{Q~gb%%H|w9L_KU}F3l>52p_PaPiigAil@cM^ix&yP1Yx-KGkDVYe}zT ziJpqWY+y@4nuOeD`ZAkgrET+El2^JwQ<Fu;R2l9YZ&}!aX<CUYAN*c!zR4uh(b=pB zqD6OS4NZ?{x7r9_yLOCKYWKcXb$_P3z3wk({s-70g0lNRl(mY3(v|bT_BMAzWnp%v zCH*hvr|FDswOxO*`s1MX{l?~nYV!Y3UgV@#GgCOW>iIo(;#*cVC;4wzwe>G_J^5Zk zPJ|}k9cY8Oull^u$)JCgj5|?@wwKmn)6rP{C1ki6?<Bh$nTC(DMEAHFf>GLiUjHT) z{Z?Vv`ZD?`ZR2w3%FJ!%jL6t7XTEkqtVc8;rZTNDQ^oBiE#?r{Ebk*5+za8lSo2Pa z1>Mn_+hWBVdWCi0&JzMD*3L4!$E1z;m$bR+Mvb~{q3N^i)XOB%PEw9#AA7@uQXBMx z*KFrF%O?^EV`I+hiArc!iJQ6qw+x|q1u-dP1dE4C#O{ADi;eWxX9GIyC=}0)j6#K2 zh>k+JMlv^FCczLAQ@3FyN-uE^Cbr(hoF!gy9KYzc;_x(5h;k!JJ&6TuUB(sEeB(`` zb#?*%_`Z5$!77KWx+q=fU!k)R@U1f8lfPcH{J~_Ek{1#$(8RfQo?R>0m}!x!n9ev! zj!m42l;WINP?Ei6=nIKW_gO7TGU9)3O}<bFF<d09GM`YS%vq4kOvQ(QBy62$Y6`ub zbcswGjn0l|>G;h!n46zXahOBdeC$c%CmlbfZJlQ-BKce)Ke4n9`W4IUC`zC`3sa6) zDhk?W_1YCC^No{~4O7w~8_TWLr_2_fJS!!7;>fmM*=Ea!Q2&OWg5M1Em=i>4%y1|L zZe)l2k#5#NjkQt*Rl{G}*@!0Et~52JwfBk*_sOmtCl+Kqp&PYBU+~)ZCrYp>tf`iL zC`=94L3OhogI|X{apaz=pA#mplt;=5CC}`DD!Y6ep}2-@*p9$!Ci6`^Tj%BC3~$s9 z{K%MwPjtUR<~0#4X__F3(>%s6*~FY>ng}?_oQTs6J4Up!ZAx~|x-7rg*T0Xm4ZC?> zPE7W~jyzw#9=TTl&u{ih3tP%lr};QPec?WKCf%gzaDyJLd9B}<ZBFmY*0<tMDnji+ zgnXZ!ZPX!q6qjBd**vCwD1yGzpj>p~;n#PnlQJP^&Pj~p>o53f%NF)S+BSDOKU}4} z%N<E9Q%8vEBtu=NnZl>`b51`aG5e#<l!NU*XOP0sEM7+?(f+eTR>@<X)G+VOHhV28 zff;-X5@foZI?em~nYnW|N#p{mKQQ!If0fsBm@}Vv?wpPcb_4?ZyUG48Df_#uuabSn z%vi|RJ!GqQ%2x07M;Tw~ta2WUYwxC)h8Z*r(id$vw0-?PzIkF!OCQHGMx7n<HP*@3 z4^3)4U(Kde&STqec`Cu(K-TQBMB6ESavtk-!j=_Bu1E$+$nWIMV!T<lP&qiYoeY0C z%Qd-~<dRVViTLbhKO@<nF<VbLb5|hur6$VFO2ruwk0^6n9AnsJoS(G}Pg9|!3>n+! zXSH`_*fu7PQM_xT5{wdE8_C0xu8m4DD#d91nfz0+6@)T)xN;^^87`46N~&N^OO})5 zs87mb$0YV_-;DI<hJ4Y;8TCae@O;U3X6+ry1hf7a!=~5#tR-05FvwVAhRj3<vz&WI zX1BE)Wg>HA?s8j3Pidg(CHqmI+Qww#&(er|)m)SBlvc<xLgjZvh)mH;mnnxMG837$ zF<G6nnE1AB?`3Zgu^`HA^Lxqv;kINh?AN6Yg@z3k&_!88+c(hDFqK%R2yC@m>A-TR zTT!1;{zLETeyTswyB1}(FX@GEL0_W#%M@yb*I#(omJ4(NG@)R%S}b~y5+wrup0Dhx z>J&N63<{`?k@p%wfi!G_XJb&*sVi(-#f-5m==SV<k*KlbS;CyjzETlO+hbN_;);yf zoO~A_Qaj-O&WB|QF{7=eUNFH|v!j|T|1seoiWrOqkqCKV_P@JwF4x9yxi)z<w7m-t z(%sMbh_sZLjom)<$`x92#Oaw>DCu2`wlNi3%KDI=E+a#{wz{8Aj>MEB^4(;AylqTu zc%mY?pWm?;VH#<LO7n*Asoct(B(agh?)J*eI4xqlS4l8uv1C>OfjMuMl(gxk0u*h$ z9b>KHLoBT<x;Q_Gja;V5F%w)|`&GHb%K;ndW)qv@RBWgSer%#ylU`qxCZ&Xb40+wh zt0^EW2#%8!Xu+zij15fj(}WzFDhGWj^Dk?)3t^g74j-*mT@mu#dqU5uA1PDnqldQJ z<P%Mmcy9F2BvSvh%2P#CC1lBG-jOnmV|=1DD?ic36&tcK=N|L!#?=Wf)#!bm;3Og2 zo+OlUveiR5q4y8Oy+w1iUKL<(eo9y|EMxrTiV}O4c$%Hs>Nl;WEa!oEH@24Y`&d77 z@iS9?<>owqP$n^}+OpbMlP1Q{&OA=74lmjHAComNdqeyB$+}h5x!rcEFS9?|NS@k$ zN;Np>r{>#>>XDtx4lJY^0vB{u{LzY_Av)Wu72~m6!88N!gY`ID&)&^2rls@bpS@&; zO3FndkGwH+>Ub9RY@_icx}SPo$cm;cvv%_x5FPp-8-xZo-;u^QW`xAdAL6V|qnvL) zupQ6Fhjzm7>l*Q)0_r-+rnUZAEHd6);jnwtYr(BHrQ8l43rrLDvnWv^zm;8E%BH9s z(>%_~Kv<Y2Bs8Q&RG%1|DeLXbz{@-x>R4sq$d4E8ig>BxD;U{Un$5kb@UgXHhnA@? zWEdN|R*bdYd0N{Ic>3Q@h;7Zx;=>8?glP$R#49}QK$=5_XhNbF@3xwd3_l^=zT1S@ zZY3=tp3qAOC*+K@<20VIDEEsTVXUj+7dstFX=)*&7T3jCrf#W=_Sr7S<|<hMs!;n} zBZEl$T#6*zK0DCUJSh@7Ew1Mq2a$eTV%btRQzp$?Ph;9HNh1VnV`@B`n-DfFts}G5 zzgmMfXSv$=rcVOX;7(U?bI@xmTw37$C{@oA7TfkBr~-^O85>R8WTfu8$=I?;Z!=jL zT%QOvnm>~S9hH)PuNc(ceRb=|;M!<V>uglL=Hu;m_)V+p#xpK2%QUo5^ZAz(6=^9! zqJl<c6BSKJ8?$&j426>8cNV(VLWRtKzC&Zpwv!%QJSDhP&ykk&uAAF;k@QI03X&c) zL!0zYY3VZck%pNn1HYoiv#+sL^$R~ssK|abp6aBkcg8l_vf5avEw`f$wdK_OvFrH+ z9>=el^KNG5<J{WSWJ05nis;{*R^-gRSMkAHhW>cgoc3&d&ynvMJ9-ao*F+(A!;YFN z<WAaRwMJv73lEIxcI1j#Q>_P&aY9p?pPRWN6+=5w$+@518N9<U&F1^8SeMPX(Z@S( zk6EuC+dk(3=1`eWw{>z)wTf{vzJ3OilJ)sr&rIy3tc(6{qY`NPzkfPEQ9lyy|I9>0 z^AjS@UX0e>Nn-2GP_!{(#`T1GN8R>j92YPR>A)jBe&vt{^!DCl!rbyXYRg4zE(d!Y zm(kHg_WRdgr>@5j3-{m6Y)G$1rB8^g?0;%bq`Fd|3@NtL)MBQoCWnh<!sRebnhubf z`yE70SzO#o-y%V9L8`cQWY&iE#6OuPeXFpBcwwb#Z8XF*IpN+%T&M?|6X~xVm~BJV zqEHK0{R>*SY2Td|y{Sob;qpSPhX!doMYhvld*8bQ3sh27=2ZQ#>q0V>wWU`*=d@1= zMrCiJZC2K%9?3DDR7X6apO-~%VcO4Mm_Dhh8Qx?fn4<N47__xJiJ_B>d#a4&Fi(}4 z9O$XCl7UZa<WqPr()je8*%S0)-R3I4XmfM4jhQ@AWy8dxj6s*RtR3i$$UDL@I}EP} zi4HmcMxC^6!L9O>zFG$neU!pQCf>dU<7>|STop=1^-V=}BF>DVJ%1}&zrTqpF=9(C zxr2$D+41bYetVfLAY*J_k?KXTT+)`!iqhC_D`UV&B}9jjOd{x6iZn%ENuXUMWi^#Q zJt@AmHg_SB+_ZLTdz{RyNQt!)^2OCAY&!To=WOoLysyzsb>jYLMue&}?bWAhUB)2F zn1-d=hgQZp$wL%^$wS?us_>kdaE&ysH&X)NNLU4XkD%H~?xNwfn!X&{>^Rws^=nX1 zzXmm%Yga78Vskp;l*m4sN>KyGscPE_YFw)7Y(OMKdNh~FNt2Lf9vW|5s7NOkEXsF9 zqHbG4`g*EpL#bbHo3|NYf4@>U@3oD1neuFA-^EtyRq=|ZWbMQalY9ZkkpIP69?A5* zl;@k)s;q)_rl0v3b-Ce3Hg_ny(pMa(l9~N5$Z~d|@$;QLs8$Cm_M1J~@a=t7RZrW1 zvYci%F$;|g{dAjEU7zc#?nX7$nEo0SzYm4a`qAEFjp}N;43&A7Q@W?`Vh*YyMs_Qz zW}~_jm38|ND(iMXzLm+wv=vpMvG*J*z7+`n^p#mdjp`kKZ0bX!T8HX*RGH4hd_7iQ zBil3PoAyOjhAh+h3Y9hO1I8NJ-l$G8su-#hjVd2isZkZ6`kqk@M0J8u6`~qrRQkHD zgi#fv8gEo1P@Q2^aa5-pRS7B`n`b%+RO5`Q6xFFlRfg&mqZ)_mWTR?DW%F<U1Gr>? zEXyfCW%H^SmCdWOQH?UD7os}QsD6Sf&!~QZYJgGQjjF(?9zpecqxu4s-s{hDw!`5c zjA{a^HAYp5>L8;^qI%w_=Ab&*sD6&h`tm5M7mVz8sH}^RP>nRQ90IlJm`Oy28QBA< z4l}AJQE5=ja{3PR{TqbpMI#%E%K8^a^^%c|MP*~~7gSdm*{7&%zH~pt&zG^NY`6<h zy=?4VhswHr1l21>_Dmpq57n#Izd$y8kmG1gk>w;%S+_2#*Np6nK=yO0>+42#J1T3h z1Jxgm?BhUoI8~VMiNe1UR6jAQF{o_pC!n&W`Z%injp=4o*BaH=fxRI#qW(rUiH7io zQ8lBo;a-o5h!Mt9s7MN`Ze%hQ3e`YVWEZMY6o$>AR#e4CmLzi4#Zd^Xs>g6&H91h7 zi|StEVkRmZ`^!<;*uRI$`h43FzT25c`l@qB_$oQHVT?lcfblPZ%KCRE@ccX4_pkaG z$9dD(YeHqy`!iH{PKxrWa_vTS5Gw1-2vpXWd8llxwxD{;*xLys>&qBaZyVY8K(-K- z&F2qL(O3xMZ>TzqDwAes-F_cczL8BR@l*6uR3sD^+l}V9$*2aQB14ePKxKV?4VBG< z^{7@E)4!s!vDde95+E-A)u$T{S|W}z&`G-Or!LuCzik^)(|^@|1KoK8HMxO0+>BQ< zJnv#eFE`|M2kKZzKLvGmNS{d47o_P!R{x(+c27&?#G3Q@cJRuosh*r{cjl=I{F_g@ z)24>X>0z(pXez>je^H(8KR<Lnsix6!CRR?bZj#?|$8ke`qIEXX^8crv^p<mOedAQc z&wt`57N#e{H~bb%cWS;uJ><@gk|Dvrs7&|YeqS<+1AZf<Cdu*@|HAFB481=8Q%`#S z`tkF_|4-xd|F!h{<?rW%OGbpt<3Ftre!hNNrk9W0?Z79)^vb=ADwqE|8dV?u?_^X= zBb@z=O0nO|s2cdsBp$aKq4qE;m;WpPkj>-2+-Eoo`5!Z?#r)sJsFv`5SEE|W|J{sg z8UJ@Ss&@YOHmY^}uQjU8{GVb}+E|!uR9f~<GO7YpHC9Cu&o-(AD)l+U1r?10)e=;5 zjA|XKxki<p={O6FN*gQljcOjM%Z+LYs;i7@9jZk}mCZnYjZq~~{oJUgpt{GXv>N-B zQLRIz^pU%C?7uat1giUuY6_}Hjj9FJBSy6j)ni7L-NSL7FseSNRvOhjR8Ja}{b>Q4 zJ_M$Jjs2j1^`JrhtIs+j)<0PttE#E1>)#aPtMn^tr}HaChxU|3@A=n%lQ!}d@_Z-% zc};_=I)$68k4>zJO{{I=$8Kw?2~ZaGdkQmZ8k6PbR|1ZRHP$DSHPd58=f~;0iqChQ zzW?99Z~L3YUDuEQNAfTDrH}6@z5mbpm$6GXXP3sDhK$|1IlFzD)3C>}na=JRBb;0f zHayzK&gj|A>A7={hCPnYboS0T+S%1JTPL%eZcffAJ2V9B-OcHJN^V2O9^IThPT94= zxP1Y)#hK2I8GAcDe1GvfW2bJ;PK`Yq_BcAz*(D=C+c(o)<UNkgLUxSPt6_%<#iK)E z^(U+=2}|)grAI>s8}f>0Moxy4BPuOJNQ)n~;xdG|`1W`2=InmTE?ye<4bs?w|2Exy z0@+ez8C$WhG1BJ6zCm8d4~@-nKAC1$z^XI~TGhfpb#tI%pz=(62dctArCYMrEe@P} z(D~2AY+uFC#xq9w&$-=v6=U~yDfM|NrTMuHU#nHM|CIO&Siq?0KYwCO^`A>aaTpS^ zb3(|D#%cf2{(}Du@)eMco!|-Exh;^|9YA0E2VVi-3#r?fA^6V&A@w1lcwQ6AlSe}F zR2(wR4uMrEOUsQ+v$8^?$_-SS9WngkLUSw@;;2;KRuw~4XJq;OXNit!L7*Cl>Kr4J zuS1QhC{Pun(rP}_`(k&g;^;L?%rrl?qS9jrl>drZrrBY&sxtH!7}+@fYYv%dc2lit z0{U4-R>6PGD>I$yKs5!`MMkEWD?XV{L!e5cnr&n){6Ea7W(F!3)g?wYm;b|zYF?n4 zkE+$k7V=;Fc9~`#XH{3Dmps$Cj{ll}W;%-l)y=4WYGh0Jueoccb622Rib}3Bo%{IT z+o+ZWs)tcsZ)ENK*K9Y_%;T(THTuOy_6+}bGpaR#>LpY+8rfR@_c5wB0#yep#Vpf# zpZ|Lp)w)3S5vp5_Y$N|Q8_#t97N|C(Qd-zW=f7t1R8;DxRb`>N!^kwtE;cH?HDgtD za3=Mcj{1k;##D1~tJ)jYuZ=8*N^LpQ$q!VTp)WJCfvD8VG9C3TR#k-RAtNhBHNvPy z1gbcy6-K5$Xm6uR1S;JCS8itN-Lx$-J%-QCSzJHjkzb07OS_X^YJILJ+0rZS(l>f~ z)d1C?LeITwiS&EWzsSDoULl`nJae@lg*TS|P3CHW^6wJ*LFwi8WXXu-EI#3f4N+x% z=#ftu&QpbZWfsloUw76izrASMu?yP|c>L|!3A1xnKDXUf6M9@%bl~UrU-s*sOUFJt z^se2X*yF7^e_nh1AzwFKux9^x2jBYlgO~p9#8)cb?Y+l)AMfsae9vhOpWiThhx2{< z^0<D+dr)olXFtly*s?`A7@t&AnH*GDxG*Eb^&~Uu>jq7$cGPWI$)IX}JU%(2M!qQa znHkED=rhRt#%BJhlFDUf#`p%ix1O@+*%>DZnU9^il%b~@l&on<=1-e0Eg6oT9gnlC zuvd!SyVtYinXTDVc4Edadva1nrA|rq#opqGWFV4`Kr*PYx-wa5{iLu7YawMQJAW*j zHQUPdU!|+Z*fFXx{Er<H4r>Au?T@BHSK4yvic=Exg%uIW6-X9GBsU{b?kX(hqg^L< zMC`0Vs-MtE`TRbTj)-Ivl6X<rP7jK%Y@{z4lu9~3xTUnORd)0IXi(KZtSbN1<A)Xv zDO82Fc8qv;{J9#HjUhi^$*(UP1OCN`b6x%P$^06#Cz3?Zfw;1dFHsK=m5k~n8QV#s z_iCc9F6bm_i%5<eS3Yh^WBs{NS3ix|k=dP{B#(8Hywpju-jk%tViS^fJ}F5ySy0Hr zHznB<Nk?v2G5|@%E@8=0az*Esa+Q#szG2CkNXiZfOPY{$92k~df+R*Kmh$K4NOCFF zl;j>HOX(O>k|&TfaF~&jyeT_$U@6Jpk=VyC)1GS9=J6%kVTno(h)BxItENnCN_yMf zzN^EdcI@war};A$J6D^0R_)9mJ-s@AXp!^r_KKmcul(!~cFs4wgt1e4(qS6cbcQTD zj8>&54OMIVWFOy^B<j(7(s@{aB%%2^`$r@+HfKacLSu7Ii%2wbOpi#^lrD`(G}>Gh zmK-LDPNjnw7RjH3W1;vI$)8aXiCj&HNR-m%h(sgb<zdNTO8adQiPGL4ktprYq$HzT zYLofHoM%mMV{=}T!=2Mi{Ygm<bN<Ru?B$_xHMD5hXkRj@CDj3Gp^%xOQJunb?mGVN z6M*;V1xh`}j>9kI1U+^((#(u9T#Z9@-Pa$*fcKo|xiWT)>~bX1S$`zD4M{JUvhx^{ z)ksqP{2!4#6On8}vL+(gg(SWdksOL-ZA9`tBpnfnb`N8;pHx_vBB4tN#qb6seUR7~ z4q{wRPSmJk^C>gqW}_x0cOCs>t1QP3L$~Alc8vHz{K-d^O8bkRB$f6JND3qI*^a2i zBa(b1ZbUK)$-s!uXCYCovOfFqX+WZ~CG&V@$Y+>}k8Z|m-j<5bFOei7cJA{eDLbo? zltt{kg+#R>W#=;_<0E#qXSl0~*xA>Uq~bFeiE=vS&nP4dBWW*3vN$4{iKHVUxfaQk zNa(*s(h~UW=T8NaRQ^1NotY6=A0wID$<@M$s~n=gF%tSfB%33WF<uhM6t65MBXKE~ zl;lz*3d^&K>PD0b%jSk3XXSh<&JW8@#GluYERIMvA?b)ncE`)BBVi3ea$Tpe;*qdQ zv9mGa&m={S8k|bSY$WlBL_f%R7uJY`m-hRSEI|i6$+IZ$i`e<Vlcel?gYw~sojznk zJCc;0!AMp{?3{$;nTVaUJxMA)7b964vGYqL>RVEF9zybd#Lg>7-iX-w1j)vTogJ8c z$W_Xpen`HG*eOQxQN+$TBw7`w(p8V7ERw62BN-o&+>N9nB6$``M?~^5lD|d5>cw`0 z)|fUdzm64Rhs1cLQ-Ga~5q}a$ROqR4uSF7%NaiC^DpF~`14*n?Sg}Z0tFWW>ZOYY$ zNVJko<wlQQ<VGZ{gOH4mNJ^1ZL?jJJIwF#vBFT@0^#BsBi=(-b8;Rko*x4BI=Tjt` zBa$7p5kudB(96Svkhl@a@kkU_Dy0=jN;-v(7ooCfk<Z@K%^5VYsma$-w2aF*PkXeQ z7+QR|CL#Rzrs88I#f3^GQA$Y$E2R<1ka)VJXkJt@d}!g4bjjc~X_BI1m3zqN;fEDA zq)Udhr%Mjk_d-Nm4X;R(3@ciiE-6-)r(6{k4k<2+N(K)dwm3~P>~QsLAy<Qk4Oc%F zmK;80VIUdQn5@blbK;pK)b7}2C^u8NPo&H<&nqt~G0`%v##vWX8p^9{SJ!*4j2+|8 zeUWmPs68SXr0M*yB4bwunHf`zI{fbi49q#<wE7t}<;i-hsjHoy(r|)UTNM~pHBYp< zNzK!%%FQpDPpYh{vF;ixo02t+<&8Dd`EmG&XnM`L5q)+2^mI2`yPBwYzMwDHugp7> zlI8YH#`BmEs_H7K<tc+M>?Rv4r#DTiZ=4pg#x;%ds)_Y2ArZ&3$&l8IIzF3Y)^Zyc zSzvWtURhUHU*&5WYa&|xf~1Vh(P~p&eX_ivu}1NlSeu+y+2CmH+el88m((^@POPg* z2}V!%^(WReHC0YFMq`_krW8tQv`<vu6cHYex1)|F9eC<n#PjJ*b(P78MI$tsU~*Q` zsp4qb%V$$e<q9SuFa>TUO$~LmI8m8Lt)wJP=hoCTc($c1uddY=m6b$JpQ$a={b~_0 z2<1P&XkM;+QQ^Y%>H|h0iz(rZkd#W?SXbGwH7`74r~H(0qsm83si~TJs_u84UfI}W zWn-uf$5xWr#>S~rnv>P_=T3LZ%a1=b!7Zw~nnvRa0jKQEjkQS**yRn!?DbP?Yn=S! z>YG{o4jxK}s;tW&Qt0G2Pd~R7VYCGD&GIQ-7`AGwqAi}V?XcXo7h8^|*z)OvPO6+% z!>^)k-E8nS%!X{kZ0I)3in=x<YfEaH(khQS6h-v7Mq*l`Rb(WOyad{6*hR`cgK%Dj z>uK0USRTm_)!(h<m2cK%+<n7;5_i)+!ZGm^Wevh{_j}&3?LZc`==aKDi-9a`(PWT% z?6A$0Fk)5l>0~t!hOOF$9`<r8O+P(fjWw@ZkXa;O(+#(huVHJEWJL|a@g>2jn=fA9 z6OMgX=BAEB4AK+RwV~IdIvGZi+R1b)X^q&6BsOYdD|C3sO^>YCN!q&CDeF6#ZY4eu zdy)7=O~UbEyx&S>Jd;Syc>Z`s+m42265(P@xlQXuY{r<0Mi=(2JX~Lb#4t*B6@nSf zy9^_keRL5{%FGL^i%E;;tSggFj#AT_POd^moty<TpH8k)CY>CaxltzvR@%vOYUJ+Z zB4w0HqL<qkh3d&RjR%Lu`KW8ZE^W<u=L*%8O~1^$H0w$@<DbObm~Sg?#=^IY+>C9- z4#Q5x5uFKjDw3#ir__1I+e%=%l`e`WWM!+_5VG?va>BE{)y(kCLkTjIqplMYHHsu4 zFzO=Wf!Q`AY;1KAQ7b2cG*?ywbu}|;>e6PP!9p@J3k?>E<>h0hu}ZM>)X+rKPC<Jf zI&|>RSm+si_~4@AqT*r0BGOoFaAD!FVZ&mvp~D9cIlM>?DtcC5vZM2}Im0H68QtBf z*G>gb_{drMLOy%@Ygq~O^vuOx&BW%(_SjjXK3usf#a=bn$@DD6zqpfoZ20I|@;W{x zW1}7#d!Zv?*(*F4Kd{$vp0%6D$~x|p#ly$cvUeCe1eeY2<~+8Dl{wFqtk+{sSw;Am zRq~Z%xWfC2wIjVA{A&*%he)O?z=y}WJ7W*98KMPv+$oHQ4?tw^C3bCAVdvUG*52nP ze%K2g7RcU0qJPM-Ugk=mr)Obg<3^%r%p_sE$jNOFYKIk>jj2aUx;szs(W4EAcy2r% z)E6VQ8(4q9&a3J6LfZtgs!f7-JUgCKvr9w;IkaT-aU)MF9alQ$*dzM!Z`6t7O8P~m zV@pd;8hPUAQ~Sjf|4;Z_&Zo@D$dh0H`c>oliDx%WXc<;Cp+vQ7Ler$_$wA1t2rweg zsn7w?F1)h&*^hKV$nwP6s>b@J`bo)H!6^sD#x^8tr`4X%9qiaB7SgpW;fROg^#q?I zoa0QqP@1Qn%+uwlTDYu_C*=NmvRs=S<#jZ%=7#d5S+DQy?3`N`Sh4x*Y2$ghc}`wl z1=^E$=6Xto*&@kBq|EKdXKY5Yaxy1Md3kYkF(Wy@rm>#>VEW|b6z)Rh<*A{KGtO(K zCmYW*vf@BiN3xPmH)pI8@F}0geEdi0SWI=0*&<JPB-KZ0<C=@R3mgT{fhRz+Pp{~@ zH^LL)qwr+-dw42*1)c`Kfv3an`2T&_6Hb7=U^(0sR={K6L^v7NK;`Eo_zCXc=Tn@P z?~0?cTXn^JXEEgQ^L=uCvObjS${7FAW|{Yp>p4z$C0S3t&N;~do5N|vkibH!7<R#u zN^()I3Z^N^&dxNdQ(oS9S)=)n%?K4s452L+TMtxJ1;~<o#%9=;PE;%^lLkKiqco~a zwCz{z2`?p2l<xU(09*ivLN24Yl$VZrT*}9}5>AF!!CHu4?o{|wcp1C~D(`*{mB$Z~ z-$$n9@!#m5j>hbD_>cm%kDteN^_A7-lj^4@wNm4r*Uq`RHReC$jQ@<z%kAkLk*E7; zV>7sI+hvwx7|L?xrS6PHGFU~U41T!3$#ohwe&yvYM%0(j*o^7ZotV=ruO)`gJoS?% zX*zAPy?jz_O&zbbDfj1M8qR$McQvvrO?k3$S5NEN6XAUbt=}^$>uRgZ)vju5nz$dB z=~o*^cNuQv!?P1k{uVf?HDRqqe?_QK?uMPs$YOlPW>hz`>r<soxUiRR%1qs%<Lr)g zo%PttS6^4{H~4OBE8CA6wCYa0n;h6jWv99`8f}p$AD`j4D$gIlQ{V(hTXgCm^~qr~ z-Teh@gnx!f_%XZ)?wdhHfhWKp!Ex|n*bFa$*wL$w?rrcgco&=xe+93A55a|S6}%FD z46lOR0CyHahJIZLadnmE8mJ32*TSpdb?|C<J=FIiFNPn%8)0uU{w6pA-VCeZt#CRd zF0KlOIJo!2d*IV>DSQjw3qOUwg+0ja`(ZA801k%Bp-SNqcouvdUI16Zf#mITP($|` zI21k)i{VS~4fr;EA9ldq=@j0DN5l8waqv$t0Y8K%z;*C+_-A+_<X5@fIq)NRF(l92 zyWyws6ZkjycgUqBcSp+m3%Doz5*`4*h9|*q;B>eJHo$J($WNFF+hGs53T_A07wkvb z3`^?^)Q|V!qni7$6!wYq1(nm!Gu=SkH-+D#w=Kh3sOf9a8;__TA3Nx&bylFG5h1Z{ z+Vr+l5X8uUu^HZ*tFqaEFwzC9+bEXMIB%*wzs9u7LbTytS#H%UN4gw!7BPh3&cckK zYHv&V_>b~O?M>t4&7P1tZ2IaFxF53P;Sk7GF!u;}0%S~dz6XB@PlAn*DXV)SEQ2mQ z71ED8r@>p`8Bk$=AF6|z03U{D!Bwyvu7#CQy-^L^3@1UA?;Jjdr<L!)$a47P^Lexn z|LhYf-zhbf)uw=BzA=mzu<}|N8!AubtFk|muR$Klvi~R!%0rr@iHGF(5og8gw@`7r z-%G<X)ahwxLngZy^ZDIY(om(76^&KlfTL;XdVIpqv_vHkMH1CjW!cFYo;Mhadd{K( z`{Vq0D>DBTZ>3w&DD~v0X4!O~0X433Oz$2GzYj~`51{JG1UMU(L#4X{s*HD_4X5W1 z?cd}N{e;uLmHe4j+45h@pM4pd59?3l%%hOJF}a*;!;O_@s4Kv13k5wk1M{-R`bo^c zO>>Q55N?Hi@NA}p<_USmAUr%zckJ}|S#HM1KBU`!lo!hL7=m7&{B^Icy#du;zlL%6 z4LlxhfhwPjOvjxDyFryf7MumU!+Ed=RD0bHUJrR?)x8~V57l0|Xz4x%`EnrlY1j+C z40nVba3{C{=D@$hT*$o1*%|H(8S~tsa960qe|}-WJr3>*H7@ss)o_2v80_?i_rU_l z80HLwT5BE(RTm1O>Wr?Rrq>x=f*OFC*2F8eQfH=fC}Y}GI~M&%mDzi?HqBmxd0LxV zizw2j`cceJ26d*ca{A<Pm6JKvt*UQi@@Z#uny9tl(Cgrn^^I(Ha15s9j_TYa`+5;^ z6w~Nza6in?jYZ6(o@=^R7I<!FlANxZ*`exVG*G_%p)qOdtBcu6BCa7!hqvk+R5^Z3 zC%{aVh&1sYNnT!c;D_~_b%U{6ggji|cg5~PWLFvYUPd&TVK9L>GII@2C6A?m52Ijt z6ospy^&+)ITpY;!C1Q`rY?S$evwaqptQSjRGoP^;Rh(Vg)Gk49Q<m~pRo&V%b7wPI zRoh&QTu-EJ7TPEp1JyaT%~9y`J$ZsUs(N?=905;)N;i{lcN}biXG1QJnz8c&cnA8K z@Lo6z-VZN=8Y5@Jzrr8E&mb>@x#~0L!@VF^PTl@+Ash^U49nn^@HF@{s5R;}@Gf{Q zWIpNq0<MOOq0+?s(^dB03P(dOu9`XR9q=*qcfq&eJ&=CFSqcw>_rYV~GI$DH4$puO z!Kv_JcrN7Ht2-C2fO<*h37AD$t%54E-@`rNGjITW77l}J;OX!MI19cAFM_YYE8wf} z$MAKiE2vzib@hV$+wd>&eV9ubeE`1?{|tW!KZeucC-6e}DZCPX27d<s4qt;`z`wwM zz%SsJa0kl$8>s!W492mckhHjG!0zw@$UNP>2yO?}XQ_Ip&sAOWQ}clH;mWP_S@lgr z{#(-kbvdb#iGU)b++n6m+Pe8*hQVHWtNIgv^Q7E!!Pw4F-^f+tQwqA8aVYpykCt+7 z2iYNJcs#)KJZOTQ#z*C$+F%Tu{`hzvd9Hlr0<v2OUxK>2{xVdXd=+YZd<|-Rd>v|h zd;@Ae`zE{$z6E~*--e4}2fP!$1Jy>~g)88D@EQ0%d>wuOH7>4)iqoHA9{dPueflvx z26D~NErFlHli}x(HLde^crN@B-T}XYZ^Ex(F6sRSj)Gg@4A`x^<Ejp2Le;gG_@s}I zXW(9WqHvzrN?l{PNSewP$D;pa`wGYLHvh_yqz#AT5k-bW&94g(ex0u>U_9=s4rp?; zI;cXj=8u(KO^!arLzj>LC`~H+9T6lw;a=o{(zy@R+=v%=-8f|3Yvx8pPze|Y&w+=- z^Wl;3SMVtK9Aq2Y{Tg!l+#O3e$3f-Y@lbjECqC(Uth%JIC-Zr7Yk6E%XY*JU(|@9Q z{BO_e{Y=jwN6B=Bqzry4mBEPo4DPBpy2^CosC-um`;XG8d{?ynbwD}!qO_j}mG84) z9MZR%e7^{CEaA+CRq$e{e7XcGKldST)ALg=OZCL;7WjDQ{M5a)@?cJ<LiL|$ekxlk zFbdUKC0^AtJn_-`FNSQZGn7Rb9>a%6?p1*4Q;Fh0*7XcUUcASLM_$BX`Xnb2$WmUI zRj4h8Wf=R9@<-*+8^K+kun&EL@{F<6l*69zQ1tsiMSeecB8)-px9$%whWYSrcmRA6 z9t0Ir#$r=G1L2N@cPKmv7DBa$Ay9qQVQ>y)%yzGUhr?@NF;w{thbre>nWe4iZ=~;1 z9lZ{&>Rird|8{a^lU?ssV9|e~<=kbvX~1r%;8n;ih$5Yp4lBkZJa1>U8->K}$mx@r z_-db26{|0wu^DHZmEX8PKfQUHZ&9ULghA3+v|Hs0OQjj9P-<eQBGluLYHDBE<ct3( zKUA(-4t(Vaucw_TkC2;v^qZi@vfJQUa0#r2w?mcdop27k3(kYTf?DI<169uV!UrHP zytu33{qPm|0MtBl8QcsXf(H_}N8m;9F*p~lfSOPK4z7eNp~k2u;UUETX*dKv12tAX z3w37t9Ay8;Spz4-7vaV5CD;mIhN>rudwM-N7@7JQ#uVqVt<;l=Q)>Rl_kJE_y{&jL zPd0l$?NDjxo~5rGh@QjEpm83C*)(`kDh)dQ<0cnZQq6&yHhvs((|@8BT@_31C{l^l z%W2~vRM}&QVu);|l*a_Y%5S<+RM)iFos7VS>a+KiVhW-VgKu)pP*TZ##wKH16*}Ud zyy=bYVhkQPw(DvqHdb;jp%}%HcH32cD1}Te^76(ZqM;!=mo3sE<qB1CvnL)Z+i)Wa zFA+z|Ga|*K_)US2nh?26-Rv!08xUqP?;e{`o}AWD?&#zp?8k7-e_;L4s<tKYgB?WA zn{+4YHrcAzBPTAj!EVC|F<^zFN9$pA&VBi?o+h!CEu>XBp>}7tg@a;Y1=@_MGW2Fl z`x!@E_G_xGpKd~5io|+V*;3n7Zgz?H!gf1y>sNKnq{?Q-dC#lp>5#(r1G9Sr%K{I5 zx%E`>UWA#A!lW6MjXKaV8NVbDdwbl9z{3b_!3F+sH<-$yqMC<cq#Fzu$<yTRKHFhK zJNJ2cYoHCZvQgjjWw$ES6R*Rhna|jaTGKOkptfn&(2$q67QJ;DM8S(-Urb*LOd~l| z?pg7VsnkKUXf@AH)LiLnXvlihVM~A7_EG&sY5Lnk`q0?DwwraP|LO<k?PBLu&v^2U z8LX)>)47SpX!gF`)1b~vs^C9h6V!RhrBLT3S3oMc*>BH)>f3c*vK(f?SE0^Jv>xFV zaaZkU2RH`u%|x!+LLNK^a<=6zf_$@(s|vpld<@1QXFyJWxCtHr4<yb5p{}<Kg3XZr z-kk}DLiOpxpvLrK_!1le*)w#Gf&0NYJO~~OkAfxec*y>PI~nR6q8{q}L3;)|f4B|m z{NYKc^9S|`%=v>_+c@-pffFI?cBcxe57v1?95%pn7+2XpbZ5dOyc805_s5X6lzT1Y z3x?cVU<+itbmqclTJ$_P8(sz%L(ckKRoq{|5%6YsBD@8j1#g3G@OF4Fyc7N&-UZ)= zcf)t!J+MbMV=^p)zkw6s1F#J)gA3q;@HY4mybEgF`5kPBFTs`YL%165L=}7r9tNL- zzkzGuBapIipM$T!weVH=IeZOnfp5TFsh=J25cm!}2EGrEgMWg0ZSO-k9<GBL?+zwU z(#N~nf%ePS%i!2PSh9~9@9e=mUB6j$=2Bw*Ln8dgJCxU+Q<sPG>Rw_Pb{Y)XMNS_K z3lZ5qYHNcbU*P50NE-~}7(@m`^^a<#F+O86rc^eSPt+?k8uZ2^3JrR)c|yeIsAEe< znStS?h`4EDZHwsw6A^K}ePM=gJGYb37^ZZAlc(1=vPpbiLp|4%8>VpCy{UQPq{?Zv zb>|tszZdaj)UhSw_?GItys?3}3m-h^8Z*YE>@}5FHZ;`LloP+C@wzlHQ@TehHR`!f z4#b|<CP7_IjTJx%wrycFG?{JYayxAf4-Ip%)53>G13(4z#uz7klvWO3*_VH*$w6eq zNw<F(755EmUoliDc2+W}u5xmdDM!sE=Hx1~8|&+p^3+`leT&Gx`3lUW+=Vedwjwn1 z7KmQ&Qj}*RwNaiH@nAagg!Mp!{XDdnnxLwtR5t4DFFn4qvC)xoa5dULSqIqWD8M*K zcQk-nTiGA0cD;EYv;(N!5f7(G4Q#Hps<Bk-5%qaY+$ePh;l|pjHRXz!s`E-b%HuOO zqjJXNb8D-)*QKdZZ#gpJiJF*{*H+sprY5Ua?)f7FCA%HVeT@U&K{In1HRokWB4sD5 zYZ0y`Ob*;?h)h-VZp#otc>Vya*o0~#e6h(L6OkZqlt21t5YJ&m(&G>6T9t(L^wtsm z7ioHpRC;{(J7!tEKWSjaWFB8Xlb&9WuYbnt<b3_!RLHP--40RxAA4DS-mZ2M65lDR z|BUqN@y*ApI*0UcGTYGOhc^d*!us{QMfD^4MD;iB5!HXbXH=iqJF35WpQwKO1FgOv z;o3>jrwICZxgs--6`B)upzh_#_hO&@c=QKDbvx8(SN+UDcsd*e&xUmEZVMa^uYpIx z-$3r$xDP_+7w${&X!u8X4E!9@ue<+%BjH!@G&qpjb2`)+<(ZKCEKUtPiW)Epwn646 zF5{&$1s+IEsD;gtGY|KCI1SE$)8RbW2$#SlWM9|8uB)rE*md<Xx6Xf-(B5?Za}T@_ z-UoH=^CZMC_xJEp_&K}`?o1xdhr2_a`%I=rT?rpx4F4(IjvA!%pEIaAKZoV;m#_}% zyywXsxswE+hqu5%EMjkkM?>Q3o(1oQ3*o)+2KZ}uJG>wM3O)cIhY!M6pw4@~fsevW zYUE>Z2iOjGgujCW;c8e8b>7nena8>OhPm?+ya>Jw=fbt{Et>sna6Q!d&T-U{H{glz zO*lby1~$QWU<-T?uI_EmfBpbJME@StdC$JoK%MiPLyiACoC`O@S9iDPJqJ_Mzeax) z{01(hrf0B!_1<38TsV}PoeAf#LBssg{RO1;yLZE#pw4k~;Ab!oeg$`iL)aMI1&)Nh z;kj@(sExYa;r&qicTYg=-+c+Sf9J&P{@pORFZz?9_VMOI?c-eq`@*N-{%{M-hr9P> z&JIt6+Si)^4}=;fwV!t@)PCNpQ2Tir4z+)`9%}#YbI82eJ+dEjba*^0fhWTRJQI$A zQy^bH<2J!Ecp)4IuYsq-Ti}`SeyIB(E8q{|ORyZi4JX2lunK+&`RW=scYoRy+#A-x z0@wr#VG@?X^WhYD0c?gdVH@PE(ETaA2;K!<_yC*@m%~foAK<0%b=V3w!pq>7Z~@HA zXO0gw(Ek!10B?dCw{L+H;Sx9>-VJ{R?}7KjrSKv68>nG>Is6NJ5dH%`1h?x?dx1N{ z$KavxaX1dHgx`lxK#kz9!Wr;2sA2k#@LKo={58~>l{Wf2;LGrRxCwp$vksvC!#wyG zxDb8}^;1Bfz{OB!P#Qr02LA##!CeldUBErz7jSR*B^(UDf-~V3cqMeY(|<voLFq?- zdcfD=b}+MmwI|GmJHRn82c8P^;Ms5&I1BcM^Wi@54!AFT1onsTz=PptH~{7xL_LNF zz(e3sa1cBVo(AW@GvKw5KGyvW<P6w-2mSzl0DlO-fjYm~?O;b=qv4joDmV$&Ko?Gi zx58TZC_Ed!0;j^P0rdB<2W)`*Le`mXF>HjV!4^0To)4Epor8P<=fJ#y)IT^Jw!x#| zeE133x_?IJHPz%SdoEH5%e+w<t7c85xBpUmh;hXJlkF>L)b<vC8IsU;p_VS>Y<THn z7FUQOv$623u^7WMi6W2e7Q)Cv%%5!i&{&}w(DiEaH7iYjU7G%`H2v?>^epAgBmc}~ zLUW0$ZA6TL@<?+D#b~}K|0#Le6FqBuSCgabAYHzry>%u0mvA_|0gi?@!*TEySPiwu z-UPMBJ_l-V{Yt34^&6q~)_)DPr@jLI7CsNPhpst?_RjwVABTCwNqgrps6F#ixC$yW zwRb)hYOh>pDt~}i!WZBTP<!S};VZBmu7w{#?kl)`$e7n*K70$7!MEWL;k%H%5a&Ip zJ5(RQYv6~Fy=&*skhQ(D0p?|LUJdtwe}!Y<Cs1>oPvH&l?~rlZ*#x!UvKjU#-?=B@ zo(#W)s-s^))#dK^oqh-6dCXNttKs)jb=kkqIhkAW!4cn5?D<c$Hg|dS(~jLx^;Z2{ zji@gld$Fmu+AQ<dAQ+zO3!NDDG?Ppkdz19F2j2RZ7g*|Qo2Hl*Uqe?m%$jB%CcWu- zb?wN!r)}1O6-d31&6O+{eK-Vv&8Tbib1{qYVUgd&O@14w)>o;;q>UEezQ7?-UY<M( zduEsGjrG&`86N-LoF7x;S;(?b)N;2ZaFIHz8jq}@hqcwj4sy_<x7zyO!NnaEJdbjB zA?&jC|AfNTqihN7hjwIGvHq(bsJ*KFz2wO+W!Nr6Pma2Za4Rf@m%-EE<xpo|SHK!b z_~t&xk6|-<+NSHmMNp-34ZIg#3!i{=I_7<!+u)&uc{^0Q!;U%Aq%FHM(JzOskadLF zAAJa_9X<?oKjRU25Bwc`7UH+d9<B2<Je4|6=jBd-YhfjP9o9nn1Xmr|8?Xhw3+KZ3 zpw0mQ1l2A-fFHvR@EiCMbjbF<!5ql?#kAKiVITBg!^7Y=umo;_$3Z89{s6KE>^8tm zcoFOYSs&;O(p7Qxgxu3|c7kIm7y2r<8SV^SxC>;yq_5I)+aRlL_XfyUS-JPZec*2) zcU?@ouOQCpXL%=O+xwcM;hN6v-fRt;{U#lSsbcvL_WfsT_ca$|A+6yrK@_Q)+OH}> z*pH8Q_0c<NPzx+dH}Nmy$1t!ht@CEpR}}e<B$Y=S7G;n&hwuLRjlvv<#D=L2M!Owi zPrlUrRBQd~irPI&ppTg**?B|g0fJ+-p+_yc0`}#@D|u!EOHr5*$ih*mM%r~0reG3| zLi%>nlbA0eIy~x*lo8gWnu*oy5h;`W0sp7QR%&<T%{0BXg!K5kClk{2_uF6s^Yv-^ zy|+ubSC{fBTGf63QT<wjoeBiKJo!-C0aGsZG3NcEBcMv@NH`IWfJ)QRa4|dv(l<D9 zNSk*?!4Dzz#@xvq4fiD8$HBhvc&Pi%C%_{heU&>2vQ6wxgY5R2GjzgqFF}7YY=fsl zjqmhn?)8v;4f7t-8L%Dwnecf?ak{Etli?AN;&M4l(GL^3C&M~e1KC@2Ux4*8C+!re zY3D8QI`rp3jo&ljo$x})dR$+WZ^rXWAnR}EQph^m^uL>+`rYlRar2>S9%XFqYW@te zel-2-vGC{US^t@Swg&zJeIxuOWPRq`0Iz{J!t3D@$U4Zm6SBV1T^9E(cn@3$m%?t{ z*>iwB;RA3lxC|Z&AB4>7^;PfYZm0U=bJ0HvnVadSkKEtD74Ql8JIGv1Kd5Nlds6?* zoJU`s==P<a{Q>Gu=NdQ~z5w;U(<^Wad=;J#*FxR#d=08uyan6g+i(@^fS<v4;6LEI zQ13gv4-bJKzy$mdo(a{zPlbPhSHX|rL+}&$Ec_dM9&Unb;TQ1F@E<Un`mX+ePxuua z2)DpOsD2+my1Y{{33*RG6?~rW!$14@^DlG9D(Hs`ePbwpy~kTl#L=d8yD>zOZa0{# z(*}Y^aZp?3Pi@OQ-HEf}rLk!*xILu(nz89vxC46HkM4ZB6_C40CXLi7ejYP==VCCj z-h9;dU+A1hy?Ghh<Ti&<F|7Je=aecRLMhc0s~FMVdFp-}YtAt<yf_m3eiz@@Vs_8% zdAOYbslN(mr{btQpqV-OeDr91RlIkFiu-O}8lRyr7@3yF52;^FpPYB#i=ESG$5U?; z-`hXe$l8Dt|LL4g7o$)*_aL3~5cT6@-X_+OfK8M}n}vv{5Z|tM=r1N^G!Q*H{V9M7 z+`K<iKCy<ca;xD4jh~&!%VRn2o7GM)ubiZB-owaWjM@Rw=BXKP!V6OMf9xUY(EvIg z`U7Z}3seoAWmwvo4{55ZtgA5rsXXma=-m&{v>=YKud&Ei=G50UCv_`BK8!<{GzNBB zprv#I{bq`iGokv%TC>t%fbrZnG}KHpaSz5W;_W{wOVx!qf?l3nb1IcD<BYin#=d}A ztLDQqkaI`NJr@>0`gdmlRDleHzk<wfU1k4pm_hwH66!AU2*}4d8fpyYUb30<CZNV7 z?g_X{;P)W!ojNB$-3b^AUxj7x4R{LtD;x(&m~%QTfa4+O?9LD2C9nc&%~=UK2X`jI zU%?v4xwXT1>2e-z-tqkh<X(cS@w*8Y!DiS3TOfPg&Ux^+a290G*5PiN%igBL`07r8 z%-dbnhs)u)kUawTI>_BbcYFH$Yhest2akq~zb<<-=H1=P;Em|7fj2?c|GJCn{u<r} zABMNXXCUhU_f2>g+yd{0J5!FV3tWBCGwXG?4BiX%j_iH#X1EOg1}=w>!-wE%NFKXt z%PZg~l$+)W>HXU0<WCW1AHlb_*5-A3SF3MTv4`w<<3F9-dkoXG_D+53s=aF}TZoZu zBIcVRy`Dhrq&P6KNBm|&s^%BRATl1P>!hkV%V>Y<3L5Ox8ObiY8j06esgcErc({>; zn>|ZG|Daf1Q3cw+^p^+Kyn&^!>`b4^GREpXW<7GS89tsX2mb9fNmnC%#dPX?H<vm5 zlsCZ`wpOmaM`fWlt72dtVV;s6)LB%_A<SJ(-k~;URMZ1=7xQFz3+AUn#%$+I$av?R z1sUI*3OE}w=P>&~Q{iItjZkr)0k^>Op!x~E8r&TUXF<&mc{khTPK+}fPKG~%=Rw}p zb{9bEp?fRjM`hfX;bl-~T5V8uj<dB+>$Vv?*l~0k{KZ!4TvdIY{hoymJn^4sZQI>R zeVxUa>E^wwapv{2ypX|3^`qpII@67K6RMf2ODeKRUDC0&y1agTD96h47&dI@T|Q&5 zvk#_M2c}hZwGF&^$NL6e_pS;y9%DOL*jM57r40>%j2~Xn;50YzBOC&O+Am?Sfh!06 zuo=P_tMtVi8jz->{4)t_L9Y&7t3J{yZ{`IdOymnYy{}#MeIq6NVTUQWmrgAs!}hSC zCU|pT!M?6%7H8Tkasz{ut8gZ$!iHO!2J1zE8--@l-K0EKF(feC>IRX{*fkU7QLL9i zn?brx$Rz-^DL-%((8Cc6O}rsl;~T3m+A;pHk1}hT9X-QcfJ*NkO&N7b*tXq>U2Qun z0($&a=LOqa{ULkUZE2mH>M7XQ>IYc=oP$06yPm$#(`V5N^bA6un%B*v-T05%%Q|v^ zHJQ$M&2s}qJ^<BC@EAxRVBQhD6`qWK31rQupUiTrpw>O=Xdi%A!R7FAsCCa%Q0t!O z;G^(exB`9zv18itO2{12>`Q6Ax(Yq>1_!t1{iCNL<Gfk_Tn3*-&v@tHry2X#z(1pZ z9-i5a`6WCXz69&x%kanWRrpi*8tg$@Uxx|!1{@FB18~oRZ$a%lX`M6|z5{;(--Ew| z@57tn2e5Y*`3Db#>!HT>4R91Bjb`8JuaNUIeI32K5;C`TUxc5*ci`vn<nDIeR0%hu zp9HmTN<#Wxa}V%qI3K;%O*cV@u{VP;So>vtVHP|9(nq_8!R_EExIKIfYQJm+)PC8s zQ2S-CL+zJsf_>m*#t6#5Js0i;bt^=3yGtPRG501IgG-_2cn?F$%6$s<hx#tA17HW# zobNC2AovA580sFO=6<`tL!esUU^ogE!Qa4PQ1=E8hpVCHgvHc+_AJ~4)ZFkycoaMX z9t&&XDEK2-0xyNf!$+a!hEKp!_%zhq@Ev$E972mZ0}hAd;gL{t!P8+mJO@_5A3@Ct z7r`pH1ZqyG7JW8+60(Qlu7mY(JK9we=EHO0FxUde!SmsGcmdQnwuw*r{^KfSc%`=D zTu+zcJ&|>9FpkB2V@Q7a&(@F83b7LE)zweN5JiS72@4Qzwevg<!_j<r)S(r_P90jE zF=i?0bx89(eb6D%7R*}8ldJ8U{)p^xsy(4gJ}EDlYnZk6kKjP`bKz0&QmBY92Q_zY zG?#8fzYw;;Merv06R7<B8C1Sgzt~fYuElkCW)Nl<!^NHRUFSV!@HB&rnX;B)+kZM| zeg#IMiGhZ`DTvfv@@*@@_-Tgj1{u%}xwRIav1(LrNf{A*J%f|EyRN%#E=C9LDp$2E zL@ODS%)lK(94caYqM`G${<3Mkw=d{NuKnGLl}bK5D*qDLk5BMzF<YHqD&I7YD9fJV zqh}@gth{^zY8-hA9uJ>}CqecJTm|+5RN7yHKZk4K4e)h%2mB*s3~}CskHfd&bFc$` z2;YH!h3`T7Jo7z3XTtU9X|v}0f7;<k==UR@tOMOs;3x2O_!*oIKZiQ+_&Zen$i>aE zY4t<?Dox|yt=p&{HisMd5pw%F<#$s{^df_DYM?1^-TKs*S$f~L@7I$-#<0Gj@|@-x z-j`7f^nO7x?tW=XKUM9RBzfNfVJ3eGtoXYTn$^b8hw6~O7toH_f0Q38cfvG38Y6i> z&Qp~~`$Lucf$(%#0MCL4!`W~koCgO%%^TP&HRV4Tu0Vend;%U08JnHq@Ev$0Wb8EW z!ZMaQtc%V3ArAYYKNd3Pn0I4~;Ar%W73SU8V_*Wk%2#L1qtnV)<IYIT?tr&#wR~xS zwtzKH*UuW5Z^FTA|G~BYco)QDnCgPK@->b+ty9n<vl%CmPC?DP41=MjM9rGO29}qn zj@8=t#r{N8bz}mj{fuv#5c@WGaYs}9ionpmrg9(p7$3brsM+*t)T{HPH(yHUyEdJC z95b(m3^wP?=ODPtST-TmH}XRRHW<~naAhh)AF51R(5O*ZEB0Md9oneV@5_fyitmZD zFV{$(2<+Mj>9+#ZMX5Q&jD7vuLS@n{m!}{|dBPXJn&s8_z^d`WEU!Y2=3%^YKZVSf zqL^far|)z=&LSpjJlb5?4Bs@C>2;@-SJ%`fE1MkU{ri~Myf=#o_0whnWS02B+B`ws z^B>hYwIL0tyn|w%vDDF#sLq6vSHLr2C7cK+!dh4jRS#<5OgI@{26f*@ow@G&Fh4i< zeI9{L=rzVNuXH=0?*053o(I(?E`ZE`oQvR(;cR#{oC6<(7sJi)5;%;wUJBLs>weHZ zQ1^p=2QP;@<GBKA&HiKfDZC1P1sB0g=FmTbyTGgAp746u3>U*S@J6Wb+qfBC0(Hkl z#c&7Y&YQX8@_V=xJ$KH`d!z3{&Qsh|y4yQ0#MQhvx&SUm{v><|Y9CDRjTZN?cVEtd ztI^McPr+Zpr=iaJeh)QgeiptDpMzh*KS14cT>}q-x&!ll_!4Y{FT-n~?!f#S>h8<C z@Q-k3%A7qpcXy~eFhgMnEQ9aBY4BZm8GIjJ4nKfb!FBK_a6MGH?M|5-oz|BzuF)FU zX@X0-?#s;Z;H{W#Cx(6h!F&Jd`Upk+Qvxe#(+>?qYT8{4L^4uLY}aK&_jWk6p_Pk~ z*JpSmmpUwjzO<{UjruG_)pt0lwvl}kJ3$ND+eUffJ<1ogH=WzO@5wfjkIF0EA=(@2 z4pD#j8Pr(z1=Lvf4|p8ZouM<}*RULZ11G^O_NJO(FQ_ps2i^p8q2@AqQ1heS@I|;M z%pyK}L+z>YGkoSdHb{)i`oP&AE`a^vL-0WO7(56ve{u%E*We*=13VO}ybGb~1#29} zv*;Z62ehj~%ua!~cU>>cB-8xF1)CfVdL4A<To)())46Ia#3*e{yBg7vcIYy5R(WM! z&sdDXQN|#cvT9;nhS*jN^W{hOz+M%g7z3|#O$AWoRXX0LlzQDbqJDh1&7iHDRIjTV zr#fog*KyWmzI^n&az!Qe!i<ZRE9sYb)V)uEJICZ*xO)#~zh(_@eqK%v^e9i$>(t?t zfuc(P;+DV>kh6B@D0mu-!*k(Ccp+r1Zobb&`?A-e=esT4yWsKg0eB+(0BV1>fO6Ho z?4gjeUpEfNL)JoOpH_8a0{T4C^h4MmRzaolY}gK`!<DcB@{XKC|L5*ZI$GfVQ2Vw= zLcTA^y#J{ETh%Fj($}lyxF3alG`yqhI+dCXFTtY!<oXKS+V8hrh{T^MwWAKzDi!8x zM5VjSN@R+w`NSHGjy3hlhNYfCC3!qu2(y`FxtTHBL$ogDx8`Ud@O?U8rss7+cI(W1 z&&X!X{YPn5nXA9}$P>;XkCYE{q522L67&5nt#CGa?Op!_UITA}d`Fjg59B(y4E-;l z`h}Yy=j+bRa1*=*Zh^PLy(rryP;=Ycp{9s;LG~-0yWw>BD>w`Cu7>&Ux(DDb=$FGM z;Y094_y}a3<g`PL>+BD?+mWu7a0j>w7Q)p~<z7sENFQfjW-p}(vuEI)oy*>=m-*^8 z?kT2L%_=JYAq)M-8)rJuhl*V-avdVuIfNI$8Z<UyGCx-(T-}sBmEZpgPE4${sj<pP z)sq~J-54K^!OdJ)+Xq%Z+0M+-_cP{ZLt0LhG8=G<xvZE#Z#xq_Hl7p*HqJBp5wgLD zxx6`j%}1RydVBh+s;aRhW@MFh4O1$O&t;M^r!WbL^iIQ>(Hxh7vAs)G4Xuagu|wSw z+^-5`+`CjD;{$u_WP7p+VHs}2o#3t%^w|_Jk5ax6+W4Gf^z#CJgUKufXLE*M7H=|1 za04rRldOqDLtx3iho?FF6l9TYB}KL+u-H(WteWCYm!sc~@CWkXW@b-3I+;`FXwy8g za)?=<EKNx!8o|RUL8TE~9SAC|;JQFC$qJUF1dYbYvOqA=3T_SrlO`J*i&Fv{?0tb? z;^biBuf47gve<vrZq$E#9|7+?n`aH}tO(T~;qmZoSOq)aMetpy{^LD(Cww112>%4t zZ+rkhgzI28a_i4fbHfdg{afcFcp&^M90@;$s#$-B*FyGz-F=A*_kmpA3wOSPy3^@w z$DTS>BNOuOm(v|y4tv1s;dbzLxINT)_fGI}$Pe<m@55a97sy=M&7d~#0#Ady8|Lzk zjI#&45$*-GN6!5@bH|GJ*WLHf?+1C;!|4lqGH>q(_lEg!0PGKsfCs=aumH05ahQ|4 ztYsYTGr0@lp-_A0gW>&f2xPAB425sNBKR>p3^EsVis3-o<WX=iJQ@yz$G{_D9LC{D zcq|+Z8Lyq=U@1Hvo(#E1W$tKw4>C?We4n&C1CE71fo1SMcrttuo(3sf=X7`qHJ<xd z?gelHR15eaTn5Xb_S`GsMmQ1nqE1!80$2l&gp=VoI0c>qYoXQ?XTv+;H26B?`>ov_ zsh9OI4jW(-JO{SGCb$SD;ZoQPe+xM;Fz@xXK#db$Q<u``2zpn40A~5{u0AO2<L_yk zv-qlp$~rUKZ1;^J@$w%Ah;Mr~E1xvVufc6-Fi{7z7Exrg+wU!HcV~}R<yO7dZT;0H zn~14boPx+&YcMC7bJ6$X6Wr3(HB-$zS^@(zVm0|2Gzv>i-1c0l`|Sy2kzO&}HM5S? zJED3t3A!5EK<g?e*3|i4D}L$%bs97_;~X=UT@+a5UHss<QpcU@`K%{)z8&#Ov0M^( zW%p+!TO7zL_4OyFbJNkKIww6kx(v;i92;k2r1DQ-tUbWLsZZf4WhSpWaT3&+SO%35 zCqq8w?y2@Y=p)@$h}zs6`T<lwh+pn6;Sb@>umY}zm5_5nrwYCbYoO*)li*iy3e=up zEj$694LKJwcT_naaHgSWpV{0|?Mqy#2=3*u3ElxIJhR_113rxYT(|;K=&t(s^WdN0 z1u%m=m<e^}$UNVC*FM?h4n#j2s$8i><{cK!E8H6N^P&3N%i#jJ5bFNWkKr`>!7Cx} z)R}h&Ho%{v=iN8wXV9UpP(fVwUCmur_F2ul1dZ?)$aVLWJagHjaTY`NT$~%=3V0KI z5#9`0Q#!Z85_mg21v2Ki6Cp#dI~m>$FNeAddlkGFz6O5{--7o+y$}3b$e3Zyis_rp z-Pj}Ga^#C3`}^*l@KLxNw!^333iup+9DWX0!hgUgVLaQO73+@vQ|Kqar(qrZJ-h-^ z2izOrbMQ;J2JXDQJsXa}m(d>zsUz+v_&Qt&-+))bx8N=CZFn1e2mT-O-UGghqWj}s z5D`(4reeQDP*jxAH1;daC{>E0s7WA!L`q^31O;^|Dk3ThDk^Fe3s$gW$KHGI*buv7 zuh0Aao!Q;HcXI*%&-*XW`+4WX^3Bff-JLyi=FFMdnb{lQC-6!58GIYAg1^EqpguIN zv9X)N@8I|78*-~>577a8$A_+XH?`qE7eaezV_PG8m<|s^o+Auvf5#UyT{3$qewAhR z6xo5uEVC2!nG6qa0+m*kUEP{8YvCuJjYsr;hU!b9eA#=s-=G|8%9-CA{tYRw_TF00 zN-wy{ME=QMiM|Q-F*f6z+u_aiWr9sFtF2|JkFtN`wMy6=oXGWAe=@j~dy^J62V)YG zF)iTKN*-IrRQvhthsIylFdZFt7E&#hLgL!8S?@&jsxB0@`*qOg<qYL&PF}_q2FXCO zZcPN`%)$o9Omb-gw}*OXzZYx`4~LsWY?k@~{Y&7MkTPZO@ZW;lvM)W<JABD~d$<j3 z3p>Icpx!~WgJrNioDO${mqYp+{F@-}Rs37wu26ZzZ|%Ax_&YgwPIGm3<(?YLzodR% zx-q}UkFn~0F6V_ITfNs<-8at~iZ$f0gRHi%<0^^Telby5YTu4rnnh$DTli{oXeC$Z zRXJ+ncq+qwjJ&eeOF3t_9CJQ_bYOB6=Ny1u(UoFDnbbV-IdDUJ-J*u4l)AJdhMI$z zOtmi+%PN04Yg6e+8X1Q{vaO@=ae0lKu+W!sCVBUV2f#tF5FQHIyuna)?_ux^h~8LT zIvk$QzUtP6kh1Du0adqRcdc%H0+z7<1sn<0H&F^H>sGg_E*;IjbOfQ<_i4sL^+TbT zHa@2k{=t3~OgChlAe;zQr``Znmp%h0!RH{h!hav02)~A^LmTnjC&BF?Hp$O})1l^( zoC*(xr$N0#I2~%N6VK|;fwQ5?z;$d%U6p;4E#scv()zmU<{1RKn&zA^GztG8dveZN z4$FO(0!lk%N;29Jn&&J{i1|_EQ52L`<-P75+TwF~Hl?3(WVZNR*pdBtP_|h9fo$;t zC|i6H)U#qMOeRf{Z}OXLYBx!rCc@k6%OotnMWvOatPB^Bw_#`={$X;dH~&?ILEToa zhsNHenzK5bIA@;S`_;@a2b3l#iQLYHMkYEOlnV9W&F92CHhNJwF)*}pcV8v4ZFIoi zECz3JnP@Ag8r$kUzgbXT^;BjH%&JKIF{`4nfIntkPQ6<}l1nXN6oOdx>J8>(VloNK zc+|2VNuy9qT$U>6$!^cSfcsuuypeDL572;&B&e>#W(OjhI6>dCFABcyqe_Z;BS=he zESepcsgvqBCk)aB>0D<b<_GbrQ=}iNQ@TRcDSDU`90palU=ys4pv>AB|3$Df@wdRP zurb%tc&|<1o{%wVHr|Uk8|S5ZWq;x)!vo++um_ZnPQQh($L$9-@9c2c9il|$qaO`l zVE-7X{*_|5K6Zfm&BpAHfvn5pmBaq90_vT}ICui2AJsntYCIR~)Yw>l+1(S_XB`=D zDqIOkli#or_6V|G3W@UkT_E+Rub#UZun^9Khr?6hXm~o*ywzE7CY%lLgl9s{E1LtG zBlol5LGT=S3_K5xg!7>6*$K!Z=||m2Tq}-U17E0Lb~TQvswOjaJ<X|M$Tn%sVzq2< zUZl%W8pNrw(jaT50^$m;*3ObOD<;NGTOTyUrpT+WwgZtrZ>=I0EUIRwwj;JBn?@Yi zJA9dk6cO=a5m)rfI3~>@=+u1pOnd#_7HZ4t(>#h}h3?d_f4?nJ?$lrym3yz_mfgCR zg9`1olOwuU3mO0x!u{jjwd{DzK7SXSCP?<nc^;lq?F0*#l2<`~n0>yM{k=GH9qbFQ zhZT_e)7}@{45zcd1lGaZ;H~fu_z=7cJ_GNDuR(l9|8saR{080!C7}o5=I~*d2Oov` z@G(ev^B#wL!Ka|a^bDlD*f-gZg)gv={@OR$u7Yo|e+_&aO82Ng>V5C<4&qc7En$1U zzV2CF8YrK8v#9(FL$>xw+tM70X`3=!Y821#HP@c2IkSo_3`(2wW+PY{M2_WIlwOs4 z<=J>ByH*7YU^P4j)<ESED&XU**mzF)OO!ufY9o7~XO=yXY;>>W_`+$#>0VRVhOR+2 zBTGjYRaJ+tUH?nMQBh2B>AkEpaG|WSFq9)Zu@Q2*C5iW&<?dAbU+G?j+>~||DTSRe zb=uzrZUuLPx_l=nxpjd(A$5b*2i@UF_V<95a8D>XP!3F9nva$Ib|&jEQLED*3J=R6 zFC2uTP+sPQ_?#SuY+c$sX36?!*^D7J-;fUc%v_J?)1`B{#*F4>lC%J*s?!BTZDUc& zoU-cL6P*2&Le_C?SH#26O&v53KuVg)2WfIXF=yKqthSZUF`TF!*f5CUMZ;x`Q$#zx zudUU3pl0d{iJWNXyCo9UAW5_D8YxwluY;ofU=pHIs0>+?IbEtBP^bwywHUg46xlpL z>59rq5a(_zU5T4yP4Jd;Ptc=Ecij2vb<8@mA!i1|oaBj&i_Vns4jne7qbfRLYejpZ znU>jI&9Nul?f8p29{rGhqFb_k7S2Ymq&w%pc5p822G50(<9SfBk}s_CjV-fpyIu-s zv40ulx7JrSA706R9b5!&fmgw&;WhAOxEOv4uY+H}8{nUiHoT4TxCw4Z+Ll0xn``*R z@K#s{?||5Qn@53tw>~oLyY-E|2=C+gYw&)E{q>f^PvApPqJISLhHxK;67ZAoLiiN? z89oO!PJy)gXTmq&{ZM^g&%k$}-qpMdzk=_<Z{P>;JNOY~y*Zl)u?h12g#FDR&+Kmj zSHbr1bJz_c1AkxmCEOpbhW+3VQ0wpf3{|dwfwGrdkjA7RGl%0+-5PjF8~$)1>?0dF zv4StT>SKhiCP{ILFf<AO@EV3+&gE!0vOq7jW3`GL^n89W!3?L3WweXRX-N~GJ^4=B znIiVVmbzf3Yd|R-Z&#?YlGK5HS2CTuA1^Q;k${Qh8bLQ14ub_#gB4a)>{Mc1F$x+o z@hd#QuQgYdpah}b-ekM^sBtAHo@l0E7ID=sL77OONcWt9yQKm<nMjv(`?O>HKIn(n zgM26GK1*RAyQa;HvpA{Y^_xi;u45zq^X{B~ulu<k=~qr|xVg!#)^3$4)|tgmuW{#l zQ@D?LS?G@Z_b5m&UgX)SgKR9e4m{S()jN+vwTqvEhry@e1o$k}W4-|A!55**@jLKA z_#XThd>_)k<*k4R!w;cy>NAKR=B<L?!_VR0@C(?Ow0sFQrub{9eEAmM1iynT;P>!b z_!HcM2mA%@0)K^)?;lX@kiX#=*kDuIJ8(UCE^G{!!VRGW+7iAGw}2|2Tf)_F8@Ltn z*&c2K+rqYR2iOU=hiZrH3^fONS19}05vm+Y7RmmRV~N|8t(0wH8~$^Fa%fW`G*7N# z!stq?f>n;fkST=f9|=oS_EN&(@ZLX6E2I<dT2eNZpp#=tEmchs=QPOlM_zi5;C>CT z_mRE~3L*uiU;45E?4<}o7oJzo)D><CyFvLcd%~`;03HnYhI;OOpyZ=ItK_@Q!`63w zCH>(YS@N-^ysfWfY+3aL6Hpx&2}4pq8DC@o1CWN=q|=-pii%;(fT?ILBPy$(NfIn3 z(wUHw<4Y>WnX%E+1ZJh0*~ew2*126sZ0JWQrzF2%KlloyT2QJ%^VqW9cWMIAa3bAB z`F^<0l%E(xFbdtQq+3cT#Q|BiT-M@96!;1X6+wDY4l~zaSXZ_CR^w#i!?bCn79K|2 zVHj1(ib9%HF0o`h3|y-*wdLlZ_|b*Om(+~4^D@RZu#0gkMkB#HjkFPTt69)VL7x&= zy37vFjH2tWV2wNBb#BCe?h13Dd$LgztKAjimQY%Kw4Gf4ohtel2I<{`O?Wp<#E(vF z=7+2Of)3j^Z})^_*e`&xgYvg);69MPRsGgK4ITimhG}>`><RG^yx#C*co19#4}rf! zY^>jmd-jKFTMmS3TcS5UZ71t*o&<-mPv3|)3@U4nfR94-!+#a>m^OyB2!70d36y;u z2|M$wqu_C{3~C*+(eNaQZrHp|%C^rp4!p7OS~wow3ajAV@HqGYB!B(4;qmYThz{9z z9!`L}k+rl%{6pYWSPoByQy`h@E9+-N*5mcggpJ6^v!F8cJa`412erP~e0UqY06qjS zgfGAa@Kty*d>_i+{2pEo_3pL~dh0tsvn5=_emi&-+yh<<HO6HzlpUJEmb63CsHSX{ zY<ITdKNmuO$(G-Y>`;Dq7&giL9du-;iAflk6j50QCbG4|IT8k?K{}~RsvcIji8L!+ zH^Z&rEfD=Q-?s<6jr~L6?XVc$0qq%}p7kg4E9o2Vk1VJ%G*8I8tNyd9V$!2lOjy?| zrudsAYZ+oBbJ<~4K6TtMCKcH^@*^n8<H{Ihn(5768Xc&v7*ie|kx_0J9mzD~lpAsL zTaeig%&+d>A^K%xw^Br*+n7_9ebK^*al2KDVm--0g6wIwO?LJ)wDroj%xZA5a>`W~ zn`KakM$s{YnkLdEU-Qe%#ui3VW}?H|$feb_>EcP<pFF;wji4tjg?VfP8;mVGAwTP( zw#7Pp<IYr%M>%J?WNMV7VlpOQ<0IoYk>T2yLQK$!K8$W+wcuo8+;bdfXJAF5i<jbD zI43oJN!mAFbHq$gbu$x&LgTx>U9xU}F9-K==j!&e*v;HNym*EKTX2GW-|u+hFi7uJ zzV;zPj<>@7loOSO2jF(_F(`#nTM&D1ZNdIfZ9(j$jgP?Y*_`@m@Ok3ThcCkG;0sV{ z^D<<!x%BFre~taY@O4N(w5>6AF?^f-E8%<aPWS<&&(T`}pM@VmrS)U@Is6o=z4sYB z9Ik?8@C!H{B2&K(ehsA)*Z`YP^dnTx{|wcp{RL`#BH3zv`hP;b8~h7)hYcD~r@{5$ zt#Ey~0@63?e+rvG`OLJ-t!=vzY)t-a3^#(jm++Oht)TL4Gk61R1DC<A;7YhPRG&SX z>HiG3gR<!z;a{*5Y(l<KKl-xmU0@#U4mCb!56HYnuK>!P(I;zmuP3rf+W6CmYfYZ` z@TvNC&wS1D^0E^1HPf6Jh9==3)bTBv$Gyrv@(fkz260Nvyh)#B1hS02EJHDoDK@hg zwH2dE#-Ya>w|KfeaTbEFU=)!KJj}Iy)l>KAz;A-ZsO<c#GK1g2{5=cd7>xBA+pVoQ z%2Vp)4o3@ToD|!S>Zs*Gq#zk8UpM3L+k^O-h*WZ21a-fw;cjp-8~`a7){l8TJd*tz zVJW-`;*;1qfTzP-*gqTI3h@c7PUD)^uk$EeMm*)v*2h3!t$zpou>PHqP-VChJ_zYk zwy{sj>qppET__(bsS{rjzYE(+wkOx56XR>$Ox0pe3d29p30c5|PE01Mo=*5grr2US zAsg3@s630VEg54ysfCKM9ISFfCW6k5H8w9)bENoDtzE`-F{tlQ+M0EtVAOv7kE5^V z%mr*=ki3-t&EcFNvM=(L3<twK;83_f90ryDhrwgu;jkE@1AaLi0VNRXR_iyEAB&E7 z#SmREe-{77{8;i<ZD=3+>WzV~K(1l=sy@4<kMsO`Zf?b6@ag*bDjz5O-i+pGE#-1y z$j;g9g^PNX)RtIzU(VUFyj9VDlBg70EE`osUnFXxMUTn6m4A~6rnGS`!%$1A<!b2? zD~NVuP)kZmkJkqsttuT(^cGv%l}oD49VsLx)D5PH6!D2=YdZEz#9O{96$Ko~Qam{| zrUo1co1~iXD@#EJdTlL!thLUhiE$Ou1=GZ>(efO~L2^ey*DHo`%M*73sEG7|O$D8* zUj^?EY=1uc?$#r1Uw^y(lE{c{O&%+B+0MOs?3viFNbJvz?aRnX$Co#-OW1$X9qD*? z_HGa2KS$TPv9J17!dJa2pHTIw()=r&0{?)gLe;0VU#vcrU+_2kH$c^^(&dIwnxXpj zBdB^+=}^7uanGiZI@IdZ?IG<&pZEXXrf`4Q9IB2}{dyTx{kjP9&eGQQ*%GP`T=neZ zQ1$FHQ1$Hkh?{HLe5JN<2ln%zx^{Pf2f!WSaJUm319yhgpz7rrQ1$U#s4)p@L#jSj zHu7%Ne-^4feg~>P))=IH;ct+%+gO4Fp!|(ARA1hKun+73wYE@iI0W{Ae0#^%q?rVH z*XqxMec>Y55Aw|#RM^>qmyu!j#MsC~h-<^vi>*L^xRCi)o$H8}9Y}`<VUx_?u^~#a zms>K@!#OFBO+{#oxv|CUwX~SPI;*ruMFJ;(;^@(3)plkTk<JPS%>kX6Poy&}!P_gV zhRv5P;7}O!OtUs*-Yo1GM3NR?k9P!Anq*h?%tu4jf8;6i&9djT78BQuW8z-=u?w<~ zCZCLGl&~;li)IrXnD7XU`$zo-bk67cnMPs10edC(3ljT#CieG8>~~M>cQbpO=EjMv zDJ1HR=3&;TDpaza9deH)c@woJc`wtkAV@xvcWd@<4B|#1SIMpvZUHM`4>%4U3dck0 zKI=~@gU7LdEX02KmqKa<|4KL+z6ohp__PPCALVn1Gv;G&JfDB~>E1MmU9o<Z-AE61 z#^$lkf|NJwU)c}NVgGy1Q(c)X3)mYg3x9EJ?@WGY^7@~2N6X<&bAcQJcQu{HvZ!<n z;v}cxVd)qi#l%WSaTFOV2q_}#7X;ZzpDhe}9_7m>M5ta+IG<DWXcs`0gNtAncrjFp z7DA<iJn*Yv9h?rYfb=PuAA3K%iv4%t)eyUG{;cG79s82+3bv%*aT0O6vrS^#Cm~-I zDmT_G`t(Jb)54HlsKQ1?Ovduulx`>E_&`4?axq7oatFiJ<Q0}jr@P2#+G7U}Fn<}l zHO3O7;-UIYG7P(y!@9AMxG?DXByWDIb=56Aggo@jkHg;Z3D^%l35(&=kTPOzXUS~? z@+>Jg>N6XYOTFiXU#R0$(@V+C-f=tsNp@P<7=|X{AJ#gP+=_{b$t@Iw8-x(c0XZBJ zM4+^0lvC_yshxUxIz}haEmFh+D_QNVy*RpzjUX`=z@%t<5tl96*m|RN91MfxAo;c+ zVtx?$67p-$-!H>X@Kv}cd;`kfyb1BaZGAr38*GTl8{M^afz+p<^nC<n6F!Bn!<CTV zS|5V!%;)SYf4+b}z^~v>@arI6d0&vIKL!#<a=nAu_G`m`E?B<tl@t8Z+L}?-6;*E9 zLG$o9%+5AtMT%G_q)}8N&NREM8Kuu)MtwSkv8(9*Nqv-Wq%^gLTS56oxP~^yUviXh zr1Z)+((_JWOOD~~L!7RWX4}91bJ^r$-gcMq#Y*cg_~%cSsn7Gdb{KR&JqNCg*Di>Z z52iH82TQ{aL3)e%yJI3Bjv{V-wj<dN$fS4l_=?G0yI2Z25QX}(SNff-HG|ms#KWWW z-Pk3iPrp>zR_IE4bkA;3x0Da4w5v}>`YB(qCzLNJz1$lrefvPk{V*Oj*&d(84YuZ( zn9e-M_=(m0E8?@X<waeKI(I3sN1DrtVaR@@wYnr-IwyRTF8PUw&U+;z3X&0fCL{Jp zMs!a`bW28bO-5)kcHCF$oJ{Gz;Z3O?u0u*2lf~90Y&G*@VjgX&7^+<Jpq3KjG@z!8 z7n}OoGNN3S!ncZXeVn!2&n`4UpG6*9LxSDR9e1%&dPe8O2HNE2m#3rKjdBqgi(1|p zht5@OuJF4x)l>Z9rWQ(IsoLDSYB!>St4eat(gqRkzB02xLfjduqJjvwtnDBo9<%2T z(jRY&rW(=^<OG5)Ukcsj$GWSjkOdLSn0WO%)+L}gb4C}+QT9+TjXn63TM+bPA4Zo~ zwN*ugd*oVmE9#udnRDD7XJ#VY9j9g@+#NIaMeC`DLFGy1cN`Jpg7}`4LzT5&ume<^ zO9DFx9t73a8VniBVe?-Of#vM0&84*Vhf3f8=tH%^X2C<D{HVj=ayT5m29JQ>z$2l2 zfDteSkAd=Miy-Yl8*k1vZQW3g*}9?Cu$1G|VHunY$G}TrIlKi{zy~1XZ~f=tIQS79 z4_CtpkW8`hsT%iw9Q$n{*Y<aZHBj$TCc?q+csLSHf>rPYcoIAjo(reI%b>=u-V9HM z55rU7%g~1_;54Xwp9%kjr@=<#!Rb)1RAxbqYdHhv!8uTE-gDr2@H}`oJRiOXFMt}i zav{`svIQ^&FM?emGVzaub#NM71Q)|=;Ir^r_yJrD|Ag1UO)=!xL-noS40}Rk>X$<L zKz!COv$4~Q;4=1?!n@(4@E-UQycd25AA}7XyRp+dz{l9vT-Yb!Nca@2gipg6kbVh& zE_@c&!586e@Fn;-d>LwP>?@FU7`)dY>nnJ#Lw!&94am9&HpaRme4G7!;XAM&d=F}E zvG?I<_yJ@-zO94lLv+NS3qOW+@DsQcu7u0sXYfV13a)@(z+d5)usP-GE2uRCzJ_V| z4OIO$5}ix7x2KT*^5HZV=D<w-CKs2lzS)PPg4eFaoD~Kx8V0%|wvW{j**^?EwXWuX z3g~&wRVc@ojjyae!JJ!_)~sGY`KvyW=bA~h>Fn0OIE%R6?euGXw_IPNFZ1-3`MJcW z*!0S@s<N6-5V%F&i*#DaC>Bz6ix{Rk$N9i+y_mvi-wp8N(pmnnQd|(76TFTMTaeC3 zs-Ds-3%m{sN?yj+t#Fa{zho?1w<UY82Jwv=I^TH%s2frK&6YKTmFzc%x5Ae2F4!7A z1UG{(K;F687}PD{{-j_lI2vvXu^--c5dHSBC-$v4`qX^%)@ujRM{h@nUU`hw_P>KW z!(U)W$UQvlkM+ZKf?e3BFV4R0$lrc3`>g+OI;DFi$C&NLap}}fut&B|xi1E4IP*HS zs%=86;y?ZWgI+a3vI=X~E6F*jSG;?$HW_`UrdPe;D6Y~6s;`IjDt+E_d51vhS3h_k z><?)ddjlbT!yd!H{Z^!4FzgJ6LG|UZ&aO{=;~fF1SG*CBdc->lQcrltK<Wbz9kKVw zB@lb=mBJ_BXo#Kk=)*PrD~IU1$2#vmy6%mIvQ;0kCG~1Bzf&3N2YY7pD$yn{HCH^v zd11)5R`P7}IpiAEHXvV~jS68~Hdcyr&SsjOTCDoO2KxM^43mt8i!og^H<75oa7@T* zgFiw1FdcMbAe01W)2w&H4Gd5Nay18hwlL@!m8bFkBgUfIxW-9PhKjLMmd7VT-D4_L zoADHQKAZ+=i+j`Ihj1or$#qYK+rZOdTX+VPEN4T>{8zTliFTac*>@rSde|!?^U)QP z%SyY9<`uPTNEdTT7-HfM#%mAfkj86Eh^hyiUv1YgzkV`t&N|a8WG|k2MQ5?>F@x%= zYopgp!H==-E?&;MT7WLzErr`5x}clxpNjU~l#XufPi>_{)sEK}4_*7R7+Hit&#ipe znTVl5{7uM7vRDS?m)-+=!uy~ek>B_u;c{33@x5$4z(?RL_8*4};1lp__%vJsnJaB; zyFLfsVgGrk{txCn`t)^pFT>y9E3h4Dc@6FgUx&1Dy|>^2kTG$-()u3Mv#fylgx*K+ zYWNAfAL9GjxV@F|arRfi7vSd*AIJL};+uH?f<MBB>$x@L@DZ(U*Z@*LcpJh4;YLvJ zW;THpkZ=0>$HSKJEZ7>J4>yC-GmYO!_HT69SbaG(L}2eW{NX}WwzV2$e4-;hSrqCk zoN7KPTwbgW;VZe+I}=CAM_|%0?=s!ApZK~2qsq%hjV%f~ePt+CaG{u?kXxXf)EAeu zEJS5>sT;<+n8?*6TVD(*BCV$CpAhM^GGi}(B+mH{PE&u4_K!7tBCGF;g45JTqicj# zNV@B;>fWErcnu=%v*7mj-nBHktXt065~|{Nd-QAjw6A$#UUbjE(a~cTa$=Uh7H^o& zB{!#Y0zpnub1vW>N={L-nc0c#u4W@hq-{94;bsz*GS^Cbil~+x#`XqTV`oa&-DRt4 zFv@E07Z4SQCz$mbPZpJ*SJuexq-X6F{ay}-dzD-sUBIpKJUp{MapdTd@fG8O*<j(= zt@!o(@)XyQ^#p4l^V<$oNW3(kTv3x{{&APQ%W%mFvQLwB7yicHn0S&R`jF!-nntHD zX4ic{z>RU9#eSo9`nfus?A{tr;$&mJBk@$8!gVHW6kTj-bmsBVz2&#=>$1d~OIM`! z+c?2_1IQcgtA(bZ{fu9$@w8!3nU#%{UvX3r-<C37!2S+UR=GVahP%UYunUytu>Pd^ zA*90mTh@K>KO(+2{0cID*Velm1XWiJh6lr;a1i7>FZK=dBj6JDkAaWEB8X4ymBDt9 z`4>JujyE0-fmLt}JRWK+GJO(0^{2-?asM31IAQ-T$b1bS`{+%Bf5GXnCC_*&>;cb& zQtGpz=9cpg-^Qmgzr((9$~$5IRpOa%?*9reg4-d{OW@A%Qm8rQm%$OR4i-b!Sn;L8 zSHoHG26!{P3EmBtzz^Xqa6{U*x4~v`85{}kffbN>?bb$q0A9!bgYXIX5PSnZ3|GQO z;r6KXWAGsOIOO|a-V?A0J_-5Gm-jTh0zL~>1YUvnz}MjS@J;wDd>b}F@!y5*ApHaO z?a>dQ3dBly2mB1)1wV(c!7t#C@GH0>2K{T;2Yv&`!f&Au>1Xiohu_1G;A;2_`~h}D z7k`9Dz@Oka$T)BRI`|8G9+DUSEATh?J^Tx*<TY%BZv>mbLt#@m5i)krp9h=4YvHEw zF4zLT23x`(U@O>yLf0C0f~+6ls}NGE{8Ql8@EW)+d>f(*{+Doj_%)=z#9s|}fWO0b zP<7=?Y)L=(5%hdV;_2t``e5~g5Y?6OdeRS%Lc|n?U;x2f_G2%mWHd{Oa@C8gv{V=5 z6X$BdU<`naey`}nux3)ZcR$V4Et83J@414y#hDWGdlz#o40<Nn5>*2WgUDTxfu6G? z><T+U`CVOLUr67Qjd|Gv&SQUXcpYSXr>&)VAbgAc9&iQh2|t5<p!)p|f_rk`ey|Vh z59#CbhQK<=oJRAT4ui^z)ojW4gr5>8@x04+P>#G%KZHK~O7-*4*4~a~hd!gWfa~sv zP^e?VOO>$*NU7S-I$l@*cy-wrmOY|}B^>!(V873b?!eDnbaXXkzH-mypz|#<c3=4z z20gR#3iEIMw~DVqMv}u6*dI=XL*dErICu)wHKxJS;7rK-aPL%j4Ll7>AFz4;V~}}) zHn#FCDA`L>lkfU;zfIY8VJplbdzubq)z-k1=u?~(hU}6Ms`vxVCFk*#r4z@M*@q?y zINvF+i^OvbuNbx&bV?YM9?1ps9F2i_jPxswk3+RxpM*;9Q^9lL8`tZTQ&HQGbCf|t zGS4-M5eh|2Sf5a&?|GOyRiUL}h&@x#>?-D{yx{n>2u+O7eu-mK<s|~2)3Z9`<m1To zh&jOK6LZH@V_n)DI6I4|g7%71A{o%(R&&mr6$~G?BfoNT9-I4pI8j``c{4iVo^|wS ztq&)^&m$Sm-O)5H4c?I3`zPl+b!Dbnw()ZMtH&C|Nm-7puJ<C5oh`w<!><@sR%0n! zMQk7eT+{G#irX`ss5|GnU@6NU46VC7$<chfpbh28_6BKqduOu|^zMJ-=wbNg&zQ0y z<rSlA%}vbs(UUDbjiM847?e4xe6UWpk+)5vBi2Vcq-<Q-D19+1mt)B?@d}cUeD7E) z>z&T1IPX2DNIE^Wj?)*Q=}lz?+|@fIPLDgK>T_D4g5X5ZjZ>Wt@FuTnBA<B(8V=6w zcJ1-B3Q`cHgUfi3Q`y&?bcGVnt%)@f4q$&2)O+30kT@HctA3HO?4JnnKh5@3!*kg` z6Dr^4z+d3ma61xq4%`Wz2M>hQEw(26rEo*Cu@0(_^a@BnsEx-t0baxY$#5}Lb}xaK z!liIAyanD0Z-aU-b33GMZ*!!yuF;+B(?+*(<+P=3P0bzQy~N{x*|>822b&{O2^qI( z^U@xKt=4zrUCxC(lYaqx8a@D@f%5g9h0T!R^RO#?0T#fQpp@hlI0wE47s1yd>&x4? z4y|QO@$^}L+QxOPhp$Fog}sOP6n@M;b*rsi{5kxS{V(8_Xw#Q)JNOOk1iyuS;dgKl zTn&$gKf`J8FL(i@AJWz|rttgH%7*YaxFMXU`UhSPH-Y!TX7C}{0?Nm04S$B4!7ZD* zv8dZY+7o^UxC0ylcZ5X{{q?89o#8adJ3#+pm=E=xKzjQ9`yhQT{%4TJsQG?-!R8ye z@dTSe`s4lGA-dxafV4yXBVlhi3F2$`Q{f@-L8!5#kHY@&O?W6&u^Iw9!o%UakhZEn zmyW?BV6SHGy(M$by`$ORe^d9qvL`HIe*`Rr^WYe$vNsl95B1*h7kC`}8&<>hn!ERn zTfm9z?*Na7X*db?hI+p^7}D?SS3)121gFEfa0aY{GvSr+RCq0<4)Gs_XTW#iZ1^pl z1NUe_-46T1^WYeGK0FiBkL)jj3*epbV)!<^1bzk=!i}&Cm%|qDO1K?d1b2W}!S5;8 zswR@(Iw+!CcOV{FdIx9fSmsyS$gYx_Q56+MqpK^&7fq}k-FXjJ+j4#wP{T0bOUqdL z?4QeB8Lc)!-j`~HS;S@4J?acd6Y1)*3D%S^WZ%`4e7)B#%q1_^ouaQwo9UJ_<?6aj z)s|13>kSFssK_rbh<@vAs<Wka#D+o7KC6}bFfwDh_8~hZ5AN)DhWo=Fkj>T^>;)IF z-y7;(`a$r1crc{AdVOIduG<ebh65nw&*l=V&-qaHDNo*D*ah-9)@O;mwr|584%d`d zlt;@e%By$CTJx&1ww$rd^7g7oQyBigoL74GWL_PEtdv(pP<d4Xl~-jD`C7eq4lHMX z9y}J_0>{Cp;RN^+tc2Kn8wdO$tY-gnh??2>UNq3g_fCQvl8zG~HrCehR9<1P>-prz z6NicNB>#Syyt20GXf5&-wKtSY7=b8c=aSsP6vv#(SB)#F)m(lxqjW@19~6e5F{C3c zye2KSY>#gB4kN91Qg_&bXgX{sRuhvr$x4@Q?#^)wyljcjw++8>0jm%uyC&Wj79NLs zZsilzg2uU9XovlgEP6tTq8Ho=%KoQeA*8%mJ%I0G<5<We8^1yxd4o7EIjTO8yvHN^ z<okPlbD<N*YGMC`ytCU1#hev}Y+1+K2i0Yv?b4m=H3udW8EX!t$P1q+_g2hS$OwCI zX)E!?Jj!Cc$6U^Hmm+mZ>s<G#5iCLA3d*hD4#7`N5oMvac2r{Gp{(j~j^(k1Oa598 zVxU5msIJBn)`|JVWtrc&N4gwoZqSf3)ZOVOR6CV&J=n2+3hJLINZ!h4U7GsK!U*z5 zd2kfm4~~QVA^BzFlvK|uUscaefi-Y8<UOj{)T!`R_D_QNdRDJK1y!#q-)F+6+)MST z-pQU0@mZ{1l}%N>x(8H!dJsGd_JcRVt04WOHg|U^WUPp-LHHZIgMCSWek7mw{I=F0 z?{z)i5!pDS2ch2EJPa4XN8m&7Y4`zr2C8rLd3YfHDesVM-G!H6CHpVK$?#Q3f2WO; zxgWm4KK+aKeOUSvZCnifb~Y|%J><)~C!c;b8xNyC(hu1`0DcVBSGp1w!Ox)Nb1GYM z+~x@4R2GM^9hxW?RF-8W`kZDZ^V?;Hl$l}3E*jFJG>5VZf+AByW~o+8UkW)E2Bkyo z7XGPjwV*myX+u}cE~KH3^?>?qPpEYFf_lCe*pl-m#uK+G+ZeXNndj5;uqDyQ?1Qzm zI3*0(Pba<Cv%8^~B~}g!qWzKX<q-R^CZij*sLRA6yI32&HIaF2VX<_v%@eVmodI1< zbQN0|^gNOi?ypxGL>|KP>lx)+Yz?uMR`1ET=*s>;cmSl%v+>hIAb*>0AsdVg{W2)u zLUO`xm^|-9_mk^6mY{zfIA;VLmXT+;-iFP^4%a7iVvVOhTdb{OZykG-ln!0<+CM&b zjG0p@)-0m3v`s!;ipb0oggUJoF;3XQ+e*2hC`^_OjGMbQ6jXJF64U`Q2u@_ntP`PF zBotiLIh3wjL>AheE6c4TW3k=3p``4NWR|}uB+j|BZWY7gXy5%Z>pdA+<DEvz2=!M9 z(kJ^=-@26=GJTQiX9$DxP3r|p7V<L{&<WF%G~9>%-ca^fKC5y~KI@fG`t%^=nExn5 zCe~jpJzB{=&uw;AdNi7A%U68`9u3zc(Z#R{90eJlCB5}`hUlEXA4KQ;gJC&55>`OQ za=3m7C_jv`1j;g7-xwdle~*3nTe7e6x4wn+UHIR_li=^r*FT<n2IQT(Hxupzv4egu zcpB8)#nYke$F*!-65~4dBu-_kGuz==`aa67+f}iy84~LEOY!T5n@fxIE3+3Jh+2<= ztO<yk2^_gsPA9S_x*gEoP7K$NV?d1Tf;1=$O6Q9_Ggpl4XPW0y+7E<EdJmWfmCv1E zAE@V2e(U)^WlPo%v|a7_se`@Y^`1YUclhHf80hWlhcp)mLzD0iPirrz5U41{A5L*9 zNSAMB#Y-28B;yK8P-JC(Q_+vJzhg;WYwoUsPU{HWZ{4~m`O&_nwuPN$L`r@O*utRa zl>C|#F(-&DLoSlvv2bTN7GhIvexORU^l~Arf{(-F;FnN(sx(P2)gF*u?gXd8G?aeg ztJ-=?^c~o`{*&Q!;w9%9Q2B8STk<`M1lEjA_WOt&`C-F8Lzi-Go%vErNhhY3vMdEe zIRV<0qGq+SGoE>}tweeCHPgv9t%E^OnkC!yVYeXe44zTXF&l0H&xGyZ*-+1R4wMX( zPs#Tgmk_6XIiKywHOatM;92|oj2t3Rx3h`BN@i6?26{&%-N?vht)giiof;b|LR_}I zBt)g(T{Ku`AY;E5=m$a2Gbi<v=QsVl0O~Rq!uF8g**m6-U;+CV!!*1U4uF@zk+2Td zz$>8oeHTG=(7Os^E3KdQG`N`kbK!MRGQS=wZ*E{q+6&5p<qc)V8=*wGfPWy%mv5^l zMhhoOpkc_i7opJ%7EYAWly-LD?BuG6D)t%ebjDQ|t*@EVr9nCr1f^9n-2nCq;+FDk z(yd#dl7A~y*}nsJhj+qqxD4tU?}m~E<B03a0)=nMu`%$dda~$}Z99EV3`4doWGClx zC|>*&w}7~~?Uah<6E~5K*K<sGteH5{4eO4ZMJb)+=uQhvtb|)gq`OBjMU^pI%7=m| zo^`3*^-@t(m7S7~_U)E&e+s2i171NM+92re92(^K$#)_}ji4l`Bo2*EcHg+RBBukx zqXUX6a!!?GQp^F&FVAmZsJHqg<9r2Em*aQrPtsa7;ukJ?%33Fb3Z6cG;$s}S#GR-c zRYfPdju1WDWa6@)t-eoI=S0Do)Enr9^sh62&ky1|(N>ersIR;W+#4PV_l49y-hNQ! z?g01>OvCl~Z4an^MD?BP-HiH9)b^#F>r4Cx!&#8$we{==K-#0$ck&h-%s%Z#>r4L< z4rTv4co^J)G^$U1H%LFQe+WDh7DKh^XTf8ja;_A90n6Yn_*VFXwzl9HxS0K8A!Bo_ zkNtKyfqk`ctKbT#J^;p+Sl_zxh5FFn5vosJYqzQoU?w~TDm$jZ+o0O~kHFL6ddQV$ zweM!mhTF4$ChQ8;_8$SyhQ;t)SO(`ol~eM;%Jc3#d$R4*nK;#1yTYT}@P`Y5ZR=vT z4gGg7J=f7-j?WjgH_KA0G#8AQ@~~7orOH%BVdd-24QiOUvPvV`xzvTtB6lvyvu4f4 z9E@GH+zqm99^Ky+YdvH1yBhnUOjGQK<0@lL)oP9{V+(`iCH+=qcw-Q`5cx`mmqHw3 zo9m>MUdg`7!6LXXq(8<#1YQlL|JT71cr#QvxE;=b>YKR@(pL5FfOo;Wp!#NBfa;rR zPCC>#qjt|DQ03!sD4$GyG|JCspzQcK{!aQ_D~VH@SHNR(<a@&BD(2KMNL)b(h7!qe zBz&&PM8#xkRxb3#BJl@WB{k{5`7S=wO306{5py_FL}pckaUIbJ9<}xey67MnB!X`R zxcBU7;@pkg?4N$oIrcRn`<-lb+~P{#3ZwJFkE0BaVgef+y5dQlk*t$C^AdR@`KzBy z;-_tC<DFiGyR-i$JP=~Xto`~9Je>V^VJZ9wUIjmfpTJLG9{2eaV)v|nY$RO8ehvHr z&V^sX<?w6x1pEeaO>Z@nF8lzcGn`k?M{S5LlOORX`d_pror!!@DMc8vRc6arAISiH zp?%22k%ex_xOyf;m9@`h66!UJC^t&h{Mkso(!?j#OFl$_&S!IT$n5krX<fJI)U|1y z%vDA|qt&$5Yr(HA^g&3I+@HFWR4S>8QmMEqX4EyKic+$;DypZZICCvch{Ik<LCd4q zP(kZC2|7*6;}W8Ex<Zw;Hi_!eFetC3v(m+>LHuv%hVuV+xDEUR?gIaWs@MO5d&9q> z>|Dc!Zf-;)DEqcPlt}1z_NPJmPyB}<<0||H+@mSP2k<t6m2hLIdpC#bhi?VzpytD2 zLv0=${oEd7er>(Vt>C@vZw;42{8t}a=%pa#%;v+r4fEKS&bNbK!5yK-cI*VXhRuiD z8}7>fi4Y&bp9bkC_b-6?P-8o~z^ftSKy1z8J>ZS(^IQKmxDUJ^9tfX+J>V;_7yK0V zhVm;4;ji!zsIt`;stn2}T3cJBI7b=O9L)dZwut7INrwhQC4UH1TjVg<9kPz7wMBRr zVQrBkp=7a)t!ttmYc6rR)@-(tda~$-9D<Il6eols+Z5$!E~{i0aP~SoveZax&WT|W z4n3H@?PX_peWezjTE40eR64_;bgOJNg({;8FY%mu7RCg*`T*v!{|4*?--7$Ww_!DW z2dbawT{sKA4<!fs4ozMK=ykG>0X?%iA3gL&=8%`hs@kZub@+J_TAF*g2err4i`hb= zoMo|#1TO(){5TLu$yM&j=B=7PlBD~!I-2bY*^L$Tx=KR`l5}h6&d<>TI)a0E%?e7a zo;B9ht|X<1avA5^I`LMG@@o}a7$i64*H%Ql8$?omt^Q`7fW4ns1$W}umr$wv4)%rg z-TJ4%A0T}f`ewF$)B0!lDf_>`ElBBakam*yJ1l~lf2AkD4*U4;-g<B;Yz&`;O&~sk z&BIy&88c?@_cn!Uw>O8oK+VU}d@aqtDuA0q^-s5f(t|Cb%GZ@#BU!#Qe@i-gIvkZl zU!tnMn3KZLB>cluA8CAom8<H@#^~d$mMvAB8q=Zdw!R!ttEZKLDb7q}U<ab&85nm1 zHzmO%I8IPr_k!^{RMlXbIHx{ZXfiDG?t-?eb++<7$LZ>>B1n0q>S3{u-`FSqMK*#i zIS9I&MEzj(SDs$NN#l_|LBGj33W?uj`p_o3v+XC!Bk87kL*(Zx<dLV!H_gM@0=9!) z;m+_txGNk8J3@&mA6CH5P|58Ar@`*<9JnXc!|w(4&SXFM4BQ{;X?sAmM|wl)@<Fg8 zEQDR*AyD-?Q>gsDupb-*2f}hV2ucFO;B+_~%2z!as@~VUo@J2tJvPs06vUskc|Q0g zUOD^tBHmco5Lt|e&EN#M736)izYRPNc7v1P0Lc4ke-Jzo9s@Q1=U6xuR>G6v6nF|$ z8StUX%IEx@te1-scuS5Q4oh>Cm8^FP%Q-O&+2uv*Dv>(na@JCDZxR>p7n7!_1UT)A zb$ChT+>bLIUh)~!QM@ykQtx=5lfB(58<V>$EI;}&g~d&J%#;A@l*+skbOkLlPOTvN ztvR*X#Y*k9XOJdAA5trZ?up!(=b$#)nnM}4)kfIy@$g{Ovud95=y$H>sj*SjGU@Tc z`FA5!jP4ME%JAgqN1DCuS{Z>jOKLRe$IUuiz-d8IFLM2F66dT~taH|NiMm*9P%A0( z=EkCRS;dVbE_l>h&2U!SOyZJuswz4!v{O36{W7?PYR{=r<TxchOj4#f@*XE>t`tEJ zzZklUR9NFdT^YfC^iC;Q70$h{c+=&Qe(y=wWpjq}_p?F#X_O7={~V}#@*JqPz+5;I zo(F57=EmIyH8<`psJU@p!HZ#Qv|%AsJ$MD|2NyxrhgU(>hu1*WRo6lKPrU0PZE5dD z_z}Db=8>i)usggJrlID_mBTyX32+&l1Mh~nL&m1qcdM7fjcEHk1hH2(SME%xIdaU` zvpI5)!zbB)13m>;!51KNlf0Lp*1LHXj)kv5=DB#U!%HE*@$Z0d!sp;Sa0Pr1{tn-V zyP>3-Gbd&J1eU{<a3cH+PKVsnKL=_K-9q>kd;n_B+%xc7xCJkKzJsIS_i!oHoH?ym z!<ZYtF)s;zg1f^%U=R2g90vb}r@%&yX!F4J;Uc&Jycue4+!JsU_zq-^V*eY+*d2d& z^h|T%4uhM)5ikX(z#ZT+*dDHc%!jl&e7nQ;8&Vg+a>zGX{A$=0&V}9KwNUfDUVsJg zRk$~N9qt2Hzyo0`^s^`22ljzIq2_xHfQ3-wzWYMiYR&(WO@ANVNsbfFBR^VmY#UhC zhCf^g`bN9iIx{R{S;dz<CNM|Cyk^<oFz|R`z!i#*v^#K23F}J8vnl2b*PUg4w7SU3 ziAwfu=v0}46dRwt)yI-_YIB|HqBJ@K`>iik#9tXlZj?%WyXbVct{J;=w@Sb45S@}$ zBczFTR?sb~P!R3AUNk+bJMP?RnKOybB`(vQks>Z>;v`vjUTEUfx!_^~6Q}AfKZ?xJ z+d}hE-Kh$C&_d{v<EF)Ae5dc+Np`04S9WY4_UJ#eFa&*2!iT~X90p~_7<*=Y8uZuO zyWA33O8iL3yGpMV@-9+S(EY367<e;07A}X_0$Z13Jp7G)=5W|Ido_3N1nyl8XF$es z`g7n!cmbRQFM(5_9?*yP!D&!F&~!+Di#G$x&(|C}`8Knmd>PH9tA=O66XCgVCOi+G z0q4W{@B(-@ya+xIFNW%?SO{r*c-St#DZCtR59?q@cm?bR7eV|(?;1D&E{3J>CO8f* zfpg$3Z~^4~hW`M(13m|r!I$BE@FVyD#HM)<LTsA%5d0NB46#w(WAI<_3D}5y)SNnO zk@qxY-mUj6RJnZ)TKk4)NtW-EDF5=0YvJg%mG6-i6G|A>uQ%^=IX?_i`XB@y;dSgL zO7mi(a+T(##HZL|r8%SFVcBz~d8jU7r$(hYyGL4I%*oMAQh6Q}{WiR&6_8@01Fyzh zj}Fm(ru=q`ewr!2Y2uRQw_kMLct*P@WwH+0C3@c|CMeN5tydJO5B#W%507GUl<}*m z*3Kmx2`b~|(YX~_Zr(AJhQKS46{_Mi_oVibH#3hJ=c}r^?09qalFs4)uA+HVglzvx zwm0&xvb;zgkOd3765_t+a;~$K>WQF4`7qP+?H2qbToZ`8G78dB*{Es6P^VgW6`hve zz6N)Kufv}39jKm<cVP)!0gs0tLaE`$P_4~RAn*LWm2f#+1)qeU!x!N<@FVyw^pL}M zFdu#o4~DCuY}SuZHtQ#-_S(<zV)zS`t-_zNHD~^SdY|wo{1^NS(wFKrT%UF*Yy`)` z#;^u%0M+i=7%Id0){cFPvo&1A{$}td*aj-6w}Y=k-ig}xgi>%vY(pNTZR@pzd&Bnd z0N4T2M)h`v#c&shpX%)j@iRTX<zu!8Kg`GP@^*)tBl~=)yy*;gfn8uH*d1z&@}96i z+zZP0<2!HmK6f8@JNx^>PvCy=SGYgi5gj`K>YH$Bcr5G*t6?7~9qbElhyCCukndCa zf58E8H+;E4a8GzB+!qdkz2H#T58_Aq#qcnAHar|&35Ua%;gRrN$U9{J6L=K-93BmS zfW`1HI1;Xpk5>wtLe`q_+rY7K4>%5LO~dg}zT*VA1XjXFAY%jk@8NN9{U+3Tusf`U zd%{WZKsXs{{f8;=P<RqN9{TWXI1SE&GvFg|CVU#620wtO!>{2i_!FEBe}`wmO(}%< z&Hm1CKI{yUv41FB0FQ<j!x<32+I-JCcpm$UU>&>~sxV&*m&2Rj`|xJ?DO?JFhquB8 zl;7LnrjR_e^(O9uDfaJ%JHdNk0lXjfh7Z7@@F6$?J`Ahi<4|?g6Hs-U{Eg&$-BHBp zz2ebqW7brsWyaE}$_WD!3PVtxrP)uscq=3-Qx`ExrPO_&Gex|s`C=X4#I0tNRS$#G zCwr!wsp3$0j^|ODpNC5FOE3?<40nXD!tU@js6N#<pq}qdC^>w{mh9`kpSVrg?qVxn zlN_QB%rs|(p}rVYhsMMZ4c4JZ@X2?3Q@&<7WcSqMsMd<Ox@vfWss`mq?y8~Q_)a~e zWZ4|fVN-Y?ndrGcfLp?kp=5~Nu<u~4gsO}`gSzV%kU3@EH?R_Z2Ty?C!&BjEsB8ZK z)d%<^ycGTn)sFuSO2)rK<;A+*Sykl7i~sa@R$gN#(*{t<XFXYaXSF_*UN(m1un9aC zZU`lduh^3Pgr8CWDSw#P;vHL07JFompG$LM7_!w;nj*Dyo=v8oa5!=6>?hQZJ91)B zj-#Owspx{)<B`uM{!r3O$k`Bc4p05Lrg~QCXA6Ef-+oTrhHUiwg>YwhFdP8;!lNMd zm5o0h0Iz3%Ap8Oz3fpkK!I1G{-Y}>%v0jm13Xg(U!J{GLXS`#e-u1GMk^cc?tzTa< zr!U0vra6BnZRd`}$quF9*c^FdCH=qIb}BEFwaJWZM_e+0lq7eaYjmfgbDV=NpSnX7 z7mfmub#PaTjb|XPzPXmI_H`r(l85qd6ZYlwD^wsq$%r)r%m*C{mDX`kIyD}uy*vS) z2w7X%*5hHSvdurOfv*xzlgRr0j)&WDpA(?uej-%aQ6494`YpsscW!{=)|5a0%{Dz( z{;21rwVr{^4JdK-;6Eu>IwzAynS7Jkch~!`<(mqmMB#oLy)sf$!s?6fU>GDn<>%H! zd=f<Z$Xha<26dh3usxgscY`yb^7B;K1D+0LcxJ)5@C^7OJPW=J@h|-k;avD7JQw}| z=fU;3|9rSLya0BF3*d3^BB=LTmp~sbgnAcrIaGg09aI|wzt!3pi{L``uZGt`)+O_$ z7uQ1R&${ZN@j3M8KfNBhiDy$@-3*odB~Ui>R@fch2Fu|cQ1#HAP_lRixg_hMRkR;; zt&iY@da@|Uu7`>_F$^+RLBLCtI#;oqG+&d6i`PTyosinQ^D1ii4v5^SZbUiFRqw=@ z>dJ{#?)6fBbl@M%mr*~EY&$_+9=)R9TJh5CaP=1yMA4ZQecip?P-`WzUv!RMqnJOI z>AA=h)^v25+WYZ#{);4KBZ?RyT$|I~gVCsp7#jVOQCsmJHsMFl@MD4!J3Kls)1MGl zvsSKE7Q&#sRJra%#LOU`wdhS(Hi6p`-wN&pTSNJKo5N?|7Epc)?Kr;$zugLM54VPT z55rpaR?fDE>UT^*$+{i<9PR}5z^rv|-*w*&YHSnl6#T(FPd+>fc81enS9l)m2JeEj z8+|=@0pwkX$6ERRdW~os!wxVF>Eri!H{sJ~@AZM>U?HS$)H@i?gni+SkTv%Gm*4>S z8ypC?Lq3Dx4)9P&``;T5X}5c<#qZPp^+rJ2pWe}s_M}$?Z-m8=_J~&kUx8)t9Y{OZ zUjZwi%FwY;WlitBlYT`R@=%>w1S@ltwf_mfLZvIkJ?oXO?AHTP3CUH@NfDJ?S7<Yf z<-2QUibJM83p?<eM|b`wKF2c74ufPRT~_^iV-Q(|Y$d<rp!&V4VLQlo6U^tRg;q@A zb;O?lm%}M=H}YdDRKL_oa09MQ--O=+`mhz84!4Cfp~lFZ3ipMl!=Z2%)C-2$a0EOP zDlg|i<@w26JL#)1j>qilkFaV@dHxT4mE3QQ265Ma(jt`>WK3zy#!3qkmQ8kYZJtev zd&bSY?4>G$8D#dr2Da3m6eeTkox)^Hd`4jk_?c6p|C++A#o3YXT0lO8LGqU#Nl#QJ z70x5SROiiu%98o8Jv<-E*SQdOhYMg2co7^7FNPZT!WyQwF5%_yMfR_N??K*++FIRL z!$#ceS}31pG1Pm->tJ8faswO&Z-hrf`o?TM+FRjt_HTn4XTln({^f8PyawI_)!%t9 zTmtWhdROxRycg29=061=gD=6yq54Cgf{Y9Fo`x&nvrxAAdH5ZC0ZKplp2!+~Cbjt` zv-8=G%b~~rNj{U(sywHQ(d)&g@H)??^uGa>{5PR|rgxz7`dv5=z7O?`A3&Aqui27i z`XH{YYcZbJtF9-D&i`W*hx53neH&{`ZMpd*YG}F0%+&i7aiO7(I~HdXe~T*sYi+!9 zn#xceTNw1bl4lDd<_D2&nmBo~www7C+rm9L#u{(deow)t*l!EpfO)VNx8D)UzvtUD z_MN0%p^}vkABA0DBkt7|YJI(KaBoQeuzdr#07~wALFJEpmE=0|XA`G-LgUzLa^=te zL`9pc;#8ar&qOvFh*1ZN(iG;A&Phe*WNc%mGX1YL1l=oc=Nod_Fi0lKL+S0zAo2iY zC^@B}>QnmMtv>AmrCL3q+I+p>wXiqT*qnpmcJL6G2m8S;Z~)vF4uV4=efGZm(4kOy zF$^ltcINM-Z}cm1N*nV}yxKM9SyWM~G7Ez$pCIJ!uU73>$QiNMubGCrejTsQvWHV- zI(7eh^HS-}>Lyp2l&|AdrGEQ;g?<qP$x3;te%)7tIL6kPeLD(De5|Etby^WromLF@ zfhBM;90@n$I-{Zd{4r4dJQYx5HCb=l`q#$6-t13+!(b)U7|r9L-uczQM_?_~9E*wY zSvU#40w+V(`teSLYA-PM$L3<51etT>oeY)dr$Fh3e7&T-jn_RBbLqzaVdW!RIfyL` zx$2%%c{b_xX;8^O9jfk`4ORD?303!;1y%R(Zp&mLA2zwxm-;hwt*hCNuP=)(naK{# zIU@}9i%5z?G0#!z*MX?@>|KWSBd>kcj^Q{=S(6+1v1C!q76zqNdb%MT8brRqvnl;= zLM8t#m<Qj5o#6X$Kgjz#d(ZG8T*UszP|y4cl%8n3a8geg!)CH!%$qkUmu#{I-^Oz- zTRtl4#oQxq78F-bT)Z<wb|q5<$GqxLntHIP!j@B<imsa7vpxtZUCI*?LXX`2HfopY z*ZCZF(GzT#M>^V%dMUa^QJI>gAc{-&QXI{Z83>D@>&sVi_9x!i;QI4d*;(#C$yxcj z6}#^S@n4WH%Gd9pbo+Za0R8}vf<MBi;LlM0z%Nk#z#mZlz+X@jXt1H1)71z*!G2@d zjeBhXuYgTpGw$CMwt*YL{op20<BgiZ8rU4_(ON>rntGeVdtn>60&Wd8UUM7xHQXLb zZ&FbDmFC{bvRBOgn{w<(I60So{e$W$KC!WnzNneIVVCAMvEnJEND-CC#**0@DI9iZ zsnojY3D#_rzv1>Xb=Ml2Xw5k_?uO`*Vt241JljNZVH1rAFRS!R+f@weRb8?N9&!wW z<R`sRKh%#wWC!FeneraqZv}UODaiYHtGBwsVeEH@6W|{39k?ef<k|&r5!@Tz1owe@ z@3TKty>uW{+p7os81{miBXAIGNLmhtn)7!ERR2{!D8I8m+yV}U?corpc{IbI#uFa~ z)9`SpHXYxa@cY9NkU4GMF;IF^1f@?mbI$`3^VT#Tt~JL-!xM7pljWcWmc|C274w5I zWScGJautW1Utz;YWuYb$RnPO$xjqL{Y{AI0we}IDInU*9q<nIeWNut^M%n5QNt11n zn#OglAo^v-Q1y%A!U1HNt_f*h?y+L2=vO&js^7!G#bg6Pk30y*`YEKj!-;b0EQxha zey>*bOc<13(%)T(I4X!AP5vqm$3T@8#w^>s?Fx7X`^UnCuo5nURq%Sqm}Xn=u?8xU zli{=Q1h^7TfkU{*RJa_T4CP;)0_9KnQ2x|3_#K=HrH7}((Qp>5g0tZ)cqW_;&xQ-& zTqwaXp2fcd&Vvuai{N|kV)zMM2)~AxLguD<m%;UsLmg}duYg;_MUeSM-qo-pycTL4 z=wjF#UI#VS>IOIj-ULTN#?ScD|68ESiDZ^+&uQF(+9@fv6W3TyGB0FxUKr{Zk$eut zOsmv5ql_6fj<uuoi!dlH(gBieeM*YIi?l0!%U}xL9X!iz{GDv)EFw<z<fUv=*7z*{ zpdyhvr@2V%QP$Ybk)EeGH%re$C&iWDc#A`JdoEiTlx97%(jB%PALJRezZ|L^@+jN^ zJ_dJ!Pr}~tX*du*1CN5w!E(rVcx(<hWB6^H$xCn=@h`&}kTLx>Pm(eHHqPV?DE+vR zE$R2g+Xqu~$@D+GeefR7CRx4@mHZE&e5j9Lcla?>`+zZJ);?GXC5!9Wl0HhjeQ;8J zS#<s1Y9Ac+Z?+FQHFdJchf02Dn5XB2o!}l&?Snm`@_jET{bY`ZwGZ}%l1;901JAGL zbeK6i-pRRS^B>zj*qPFovwaXw?lb>gc1p6MLjU*M2hrO_*PdI!^}-<e$qvN(9eN;d z>24vE&K?Zq_xFV=@BQFYkU2Nz_YZ{f`<Z)Ve*ZA2Cp!XaEr+9^{QhI0{C>X4V17Sy z&CKr~3FY^Xg7W*zp#1*PP=0?ol;3|WoDauB=5~1#Aal9AO87XehSGx?D1F(MdnU_L zOYSe<bYpl*E`9m;%yhOhpOu61lJeM;gQ}SRSDg8*qPj+Bo>Zw`Sk4v($w&II84<S! zkyDVTWX3l%%%5l6x}RcyCR9JvX>b^v1?A750p-unhVtjng!1Rlg7W9jhVtj<!Uy4b zQ2H?+z6&papTP^E`jHmEzaZc2urcPBLiHzK4wa8}Q2Bi!=Oq1c=0%%7z5_Jl!+C^Y zo>%9tnTcNir~dfb9PdmMUUNbIspDP9Q#v<b&5n0Eb51ZxBNfH0!SU8RTtet&J3TWm zyK63QJhD8}vq9uf7?dy4Gx-&=9SYZykMg_uCX4yq*TLP{zaE|eZ-DZ<m%>Hx7AU{_ zHh3$%9m?;%8_Ms#2g>i}+b-sJ-w)+?KM3V_FNd$fhoIV%4@1qndJOg^ZBIbGCwUqU zgU>=e|MO7uu3mssA>Rx1FNUwfE8v^(diWN+6TS@}hVMc>^LtQpZa;t@zz^Z)@MHKh z`~)^cKA*xy@H5yPehxK1>nkXI{u)Z}C7ZSR*VA&@IrEDD@BHf@NW1*&A7Kjq6g<ni z{Ojp!e3pODaIe$9&eHJzcmDMsJfrH>KcVVd7DYGzx&c%<Xawb7H--b@22l0whEV=> zQ#c831W$mQz-h1<oB{b(k@?pxq1qy?p!8#1{`HJpGW`$tueapcB+IR!lD{>Sud*GK zf4x1Ff87?I5A&d8p}&(pf$A*PZ<6uM`m*R&R9ZP<T^|(4(R7otq_|{J+-(ju=)C6g z2*#I<uVnIJtX(>YAA~{alD*gfsuEB*hv!gQ=R(=ab73Bw4`nOQhdtm0P|tHA)N?=1 zmi*r6OT<ZL8Y^~cuIDbBP&2XGJ$W(bgrQ0Jho@y=^yF2<xW}|EDy`cvnJ8EPs1w}{ z6>{VMe2!#2z7}1`k51QAKFt|a@4TM6mW^*O*~dRJbA9z}VbF6(PLhkti^63*x1Q~C zD1E4dYGW*dec{zm=Uxlz;9__UydJ79xe00>-OW()yN)fXH>zu-gYuJ3%O$^Pkt#Af z3iYLz;#jQ7AF9Ydes7bdU@={a%SdTW%IJ2UP3gY_D*1Op>C)Y>6TBBnX7@q0%kGDg z(F0I2S`PK>4?)RDeND-BJntaMNqm2JdM+7dwa?~qW*D;NByFhUP^z)CAu}mrF>&$t zH=*$K9MNl<t@v?AB3z{OF<fG#{+cN9@f8fV^{&MsAgG?`7F|N`W)3T<=JSm88fo$0 zpT_TBa=%x)_KkjDS~hy%=+Wjy6-1GIUS1cJE0~TVCsgve9XmOGVa*0ti-@3>$MEQM zC9FqDO_?QYXcS#xR~;1XBZ9&D=46feY=y)-xpJ%QmsnqN=%GgZ=lWVzVw@01>L%*E zEsml_vGkMk_p;Y!xrD^tw?3!I6L*HeT|<c-Ho-0BS{q%)Em~5}zDv`D(kf2|r7Aju z)c5Bj#(XL_d&QaIi28R#PEg9GMn9OyO%&rtF=Hy?uft*=qFBu-D_oZGm%T%`a<dnI z%U4u*0)3ZGKL@+O=i!m?MK~6|1mA=&L%nBz9i9UD2B3{+{{Svw|05{%_yn>}q4z1A z2UkLMMt%-k!!O{z@GIB{@?B|v0{j+EhCe`Q!%vX4R=i)~mGBSvAp8@uwutvP97<+3 z*w~G)Z3vn3?=^zT<i>DwGHL_Z3G%H%zX#k1YVPVLuogCh%%Aj{Lye<t0dIkuL1pw7 zP~&O0gc?t~4g3{u3zetaL*^8Cc~I+?>;T_{?V<8-C&<`dkMGd?jO+7ug$p6yO!Oax zyF<pgd7a?Turt)8!>(`_*c}drd%(kC0b~q?w-1yZ+84@Roxzs$n^VN89@&m<RxW#$ z@S8a;3S2r2LA@xuAG7Q#+PbEz7jyPYr^7426q{@|qNDC{p$BPK`g+3Fuov709t4%< zLKr?<vY)yg$2VeA={sYM&ldU7oE3$2KAP;KJsSC!HE}XlAEl$qxqkNKvkf5aO5Z@Z z85|5#a0pbIheAEu>1@e*CZ9O{RzA?|T+f!}&vH@}az9#PA%9&lxsbm-ne0VjbS=ib z@wc7}F|Z!D3rCV}rELV%a~%!a!Xl_@sRSzBBcYzJGd7`T;=N)uam_e34xX9o`AnPi zUJ)A}f47+8M`5V{s7kIgvu4nxpan!F6;#GkKX&ozhENP9BaFdc({G6gVlp*Myxw}5 z<MPT0>c>#=aCdj(iS=B{=-_p@-DG3-!`r&og;Mt*fl-YU&52sf!7xZ>$_v@*g+XLF zGL{@GU^yHQtKbBvwpA5871ltdbRxVO9uFUYlVB^ZI~i*1@f5fRoC?$MBsdtJ43B|6 zEQ8bFv2X@d9?pcyYmK$*lgR7iiBlS@;GDJQwet@CPqJH8GHJ|Ycg`yLb<S8rhD(F$ zXRaRCWv(jisQaki_*KbBd8;(cXH%GsOeME7q4M?|sJxvEmAB_X<?Z=UiMkLfZx_J( z;6+elPZvVXW4jc#hnGRkm$@A71FwJ;@JcuVUImp`S3~7#8~#qN#XpcZrR`vNR<1m? zk7(ioR+OOB|Li+3v4X4IDB$u=birkMY65@#qAORFQ!_b-C!3=@$II;!P7ktCzgGHP zISqW)WMQtKw_#4oUe>XNL2^mv;|<7Bvbqr}AD2qL@D`|iybUTJ?}SR#GN^pK8!8{~ zfy&4Gq4MzosC;}7Dj%0a<>SM!2Ydt`1RsOSpU0u{QRO<huF!nq)OVw?w`b?dN3+9- zC0HU?IXQ^)!_XxBBWgPr6BF|h!a->+YNEBL<>N~Lfz=CFPt`X#Cr8mirqhIQpNv;V zNhMrH1&s(9>3yTfOyfcsm`{9Yjpe9!VBd{9sjYSC&?Qr`SW8?pZ?6`za0(A?&a<#8 zvU{&E%SGD%lAH2b`8qX-e;zqYmM_2^;EPc26JCaW;hS&>d<)9Ieg{4Q--WW9@54Uu zV<_9Y5*`OXgLB{)Q2F#FRDOE=-6LUZPbIDuhvc81v-bR~L53w0$GOs(*7br=KTnn8 zu{;giXgTt)m@~5qZC3s%OX}sHTtOF^oqx)&F#mGqlyXMp&u0sRo?rR02@$nH<Z9$4 znfw5^g+Ic5;P0>}`~&ufe?j#t{0(>FI$XrofNcm>2R4GT(;L7O;f7FhZVHtjzpy3! zxUD#@K8e<FZm#?Y)ZBfmQF0DL{ah&KP%IZDlX9Z6`koXi!DV`{I(I`!<11cQSXY#? zBFMjJ%)g3PT;ge+V-9d^YFvuQuozi^iTuX790`M-Tlt`8pBY3pM^4&r0aZ>~LY0$N zuoG+z4}@F7qu^F>6x;?L2e*ai!0q8zFa>{yZQ;LQ9^91swu6#)d#HRF!QcBO%8BO4 zsl71>o|`LQLc6E>%Vkb6r-z|_=2USgkvWrz%E}y-8=uHbxv?rOXP(J!=E|eAes6hF ze|5v0r6gYO)gg(qxBx-t_JetB`dU-efm29CRD#0}oI%l<nKBwyf#%CB=7cavw#xgs zpW0D*!U?-Uwd;0=($h{*1|T2yf!$yU><-J}o=_>?3w{LmhN@%tftur+hE2IwZ@4|| z19yXkunRmG>YZ0#sJ!k6r4tL;l6B#$#HlU%JllD>bV5y$pp~mnw5Tp@&beV|68>Rz zp$c7!n6N-)w=ile-Kv=SiIaAwg%R2{J%1RKHpw*JCwwT+qW!_}csK-}3=e~I;Neiu zc?6VQI}$z#N5H4y(NNEN43tbX*CJU??jlb4b_<-BOD1ZEhH`P`B+cnz$QDUBywRDD zptg10eW8@3mc{%!tK5WoUC*dl0SO9&<lB*728E0Kk#o=?ipj_~ULtPh_zE_HE>Hm7 z1+v}sdj7iPqWoyV59aIFgfiqPS&fF$@o`Wo8V@gmmGE|01@DE`a0RS|-MQW*sCUXI zLU|xlU?rRiPl6{y)&Hl!dC-T8;dH3{nE{oLU$dnX_O6uUN}Jkn^VgJ*LGw#0{=b@) zl6)pB`Lw&$SeeYMunyC#tc+S`&ONjI@p-;5=y{btn-EbOM9xM&lEIl!`ExEj6V8Lz z!1?edcmY)YTnOKS7eV>X7sFog5-7iVAv^+J1|`?aq2#Z1-jn4>>kn_iG3LQ~=jW1t z;0Ks}al-dGJq-2B(OeEC>YD{bWtAH_)OAEg=3JFomP6K!qj_vm4G=oclG(rpuAg0n z!kv^c{yI+?5-+zY_Om>LctP8YVtO5dA*eW~VODXLZ5U2uXbgic?#YU>5-zpSNkgNP zO4UQJl`6_JQEusqVj^71=xkR~tD-Z;npr4}_A_QdR~nazcgqeBiXuv75!5d27e(>g zm>y=WL9V(c49a`y;z3083gWLpSELWuLiJ-VhP~ku*dH#1deU3rL-01ZJL0<oYX0J# zuqRvw4}o_>`KI?m*^2w1#QiY56Fv{0gfGCi;Y(2U;>%EDL0*9x)A1VA{Os4^ckoTf zcR#$h;CAcLR)Ia>d+=cR0X!V8fH%Sq;bZV4sI_uGhIw?XeFF30r;zoqy_GNxzkr9q zuV5|w8nUjh_bp_dUhjK&6I=~%g+Ia#*5};-Ou?UFd-xkvAOG+05cn4y3jc=3z<<GF z*q|9>wO~W|2y6tOgpJ|ra3jcia^A-9U$7Y*gZ^y_rH9SoDX;}(y&<n9WL+Vz6}%9( zfp@?y;oER)xC(9y_d^f1gNMNsWGx7<EoAP#mj|_G`3{h|_}-52ZrB0JX6yoGTlC&G zxjxRZ#I<89WxJpa|GB`JFjdZO@ZN-y@$SX96gmvqRz)6XF^AlHS}l@LWOZVubZM5a zieQSf4#m3*mQql8mW^QDETRStv3tervI<)mlvb4mPL2ALhw*Gm|6y=<csSe>9tjVD zN5O&cXeb$c#g=@}aXWEpTc|$2FiQq<Gm0p?TJ|tAvUts6&;u58m6&l=?}4P?BvVyc zF`>4s+TK*=6I)K3a$tkt4(=<Bdg7nAR&-U3q)}sHlZ+B#OB0o4veo-=1Ca__P)X(T z1@)|wVN<AflENrtqvtP$YFm}T9pPvwS&o59RRtUj$H8OZcz6P=gp%DvC>bwhOUhVz zr+Z4z7OYvu(dd#i=Y^q3_=ow%lCg3iCS$dYQbZ-BsWUqeotP0Lxo62Ol#{L+2BlYW zqWDDPO-|(b^bAvAYd96Qg(tx-(1*j}G^ppC4keEd*pfb#>~u4>gV-)wvplTDkQtel z=Ik)6Qz~*{m7Kt-)hG09`OY;+ONuJd)Ym=9Fs6G_vtB_ewhGkDe5k@8Qqc1y%jzuT zp=Uk=>XB!|_V7%&2Rs`}9_PSNZpksMD$CN<gV`=#huosKcWF)z!#c&Lw|6Esvq-UJ zPyajQ)+b2DHfxfbo-Zl4^O1+1`2wi&c_CE!TmV%*FM*QBLMXYZKR4OuK7}}mYa+Zn zBRA`5*Xypp)K`~{s;n+uN1yw)fu=YwDfa7;WsH<%*}ZsM2tTJNbBY<hw9>&gut799 zT-AWoXBPS}utAUtx%R{b=jMLX7Izc(=GnUG2P#_GZ`5=t<-EIXI0{&DXv;=IqA?J3 z*sdmOF<TfUyH)(UB@t>9D_q{d>2Mv~p8YG}PVg$IG+YDKU(1jgTcZwt%GM>g5#B~T zW53NeyBR*q{t~G6!mV&6ybX5XzPCg5=i-Oi`;}#|hW&e>^73A&JlAi!C)#a45+{B6 zhV6<>o>%h;QY^u^N<OK{2R+u&6%p3iDydrIV_Y@YjQj7ID;2p9y~~K49iClTZTHZq zqXObnY|39!V2zfM<I3!E%A18GkxGv*hOoZ;<XX*$R5o%XYAHC!K>6b<ItY4B<<BOt zHi-Khx#-#d1@j<Z)w6!{^<fqJjo~D?0h|JvBkP|AnIr2z4jD`DzXCUbvfs_1e23;x z@?>2tll#y7oouglB42dxo#B-kxyzv%RbIi6KDYir=nJg9D=3HjWuZE7{h<A10<%}v z5|^Z3jiw?=r0t~c_H*4^S;-HAa^Ykje7QhbrfhL{$@;N*7WLn2=(&{-vhh=ORYD3m zNfzy4TgccR>$~d!OW0@5vGvt;gwL=~|C|33WK@^`8q9~QApLRv=3JjSGrszV_kikW z-xEsCtY>EVaU_2y#|vmIl+vJn_(j?I;XdkBG@7!2KDzf*X0EJMr1?=8B#Iye16l^L z8><$TQNxLf6%<**Vxpvg0~;i6pj<5HfHO%llff6pWDBLDwT<<wAW~Ud5S?9NMz#a{ z?$YBbE2}aOU@gs5baLfHJkH=1oZ6|<kk1eULvF|0sqLauD<({cPE|Fp)}lhku(~qa z_@;}r|0P@HIoI=K#}s;!7m_#aRm*ec57_wAKCm<Kg|G)a1RetW!$Tq8NU*iJ2f=CV z9|~u|q40W0->~&X4u>kE%s;m^c3G>=`gd7t%vX8j8+U$F(p3aEh9jZ+^hd#M;Aq$v zmP7TK9Sfx!W8wGwUf-3>PuS8YcXz(p5_pv!)&;X<R%}dRmWS~Wp@gA#i{?$ey<03} ze_(?K=Fh*#-wEZBSYyhg9A80HP|B_6V-@>7Hq%u~+)Y(T3!{^=3#s}WhUyp_dQ{24 zV`p}40H?H|o&nKM$~n*<wW0^7wk%Rgsq%1+IDJc~a=a3j$`r8?w&ORmpwsZt71eyP zZCuF-k%p-R%;b2AjTvE-06Xfw)*QbkAK1{qeg#$JbD-*C#=ef%muItwSU&ataQ7b2 zRTbU;_kmEtrG_FMLhq2!JETG&jU+&j;3YkQG?N=h1o6@lL8*##5Tthmq)U^o0@8aI z=}i!j|99`1Gq)t_BjWE}>%D8iXR^<nIaBxSDQ6BIzNtF-<#dh%votaLd#KjTtw*<T z!<qz&dm@t)@%d<EgfWpe5U6DfZU>I}_zwP$>Ib!h3V8ZUkbdc?Ph`*b1F0bTgT25E zFajI^(m3Noa4I+y+yM>)_kp9p{0MI}SQH!sl8y5zNNe<;f&Solkg|LVI1Ky}{1U`_ zIQ$*y>0srY*uw$3gEK)Na5fkQ&H+*PwXeWQ;6ji#sxAWIM_U4J1#u>yIWOjAR)V46 zDsU0F7TgG~2OUsU8^9spMsN+d8QcgW4E`?24iMi~(RP7!cIj@AK3e!aSU5M%^8-V{ z{ooStAc${FXvaZ(3xU5CjC23_Tfw!VB+rw7@G^*V(CNFC=7r!b@HO}=Nb@GQ!DZkb zFc-?`E{Jobw0q!c@FBPjd<;_AJ^^vw0Drp{@4oZ5Yw=#V_5yOeqfFn2Hy6Z!@D+&n zceOu2`i{kGa0rNft7g2nrQy9L^Lj83xD`Ymns<WvK&sYGU~8}h=mC}o$AEah$$SNL z23r<D+XKgfc;Csq3#<l~h0#+T#Cm{M6Wk5reKPY)5a$$_^Pw}Y4+en^z@I=@Fee5S zjp#bq1atwLg55!!YhWG(wgTsa*l%k-2(|?uftbTH=O_aG4myHfU_lV)ADBZyUvLB% z2#y7DKCbyV7y{OFf*uElfjz*JU{A0v8nh8?0fvJ^zz8r$G0Yi&4Z#??4#tDM!9L(f zFacZ!Vjr;iD3}Uf0!`peus`@5%mm$wV~qq11_yvfa3HuE90Yy~egtj>2ZLw9;ou!` z1o#{r1y+O>{urzd;=76FM&NjGAc%8+%``hP5gY~LJzaC5l9;;(CxM@XWzdIw0nP@o zPuaW*oB{q0&IB{jfzAdOgLCORI1fAy&IezBUxUtNFvbAAz=dERa1r<!NZ*K@0j>b& zfh)m9;A-%Da2<FO#QDVLt03MZHrK<<6WX$Q7`O>M18xOxgWrKo%3)p@Tnp|3uYr5$ zI*9j;&BZXGwGV6wVh-2b5&QuR0C8xvIRrcc_5+WDBf%5kMDR3t7CZyGz~Z<J#(~$t zRp1RUHwIfb!Mxxtusrw(><az{&IF%<Pr&D(uQTR#L4WWS*bDpvOaSxcLcV|n!8>3f zFrgCq81O@|7`PlP0e%CP1kZr@?wUDAWpou_QLqB&0Xl=7z{+3>SOxqXtO{-ctASU+ zn&1<#4p_YkY+kS)h;J;JgF(!7n=`>i;ApTZxCzAEw|NJMbE3^R!B$|Qs%W2J6R-^! z26}>hKyUDUumji+^aGcJUBGQ%5O@H@K6rESYB>7`i~~c#5nvej1K10!ULAH7_#tQn zKLR7bPr*oV1{eoY&zk`50h7VP7!;>~pMt62G!S$3=C8qYa1Ds_t<77(Oz<E$0DKL8 z2<EAY_6XJm2ZK$)p<pj?7&r_Z4Nd^Zf?tB4f-}KM;BjyYcmu@RfcX(P4QyQt15R)p zI0L*2&IWVVMmqyLgY&_;;Md@DZ~^!NTnrlOpkD+_gR8)1;5VQdTnD}eH-JUzq8)*5 z;1;kWxD8AKw}X?wo#1?M4|p8h3!Ve_gAVoZP8wJXJO~DYhrs^e5pXzo3>*Xg42}m+ zfMm^_1=oP*z-{0K&=GdZMX(-t32X*l23vtwK|k<1m<HYe`-8uLqrhLmN#I>@3itq= z3ZgG(ySZ(StnZx1LI#zlg@g0SA%6DrPW@bAo&JA2^)v%D{f(!dsv~)gMbgM_M`x!S z*KDym;_r0)!;mXpY}}@-sKgSRsVBB8XG5<4DF4W=L^rAS3cwsT)BP_%s5$=L9GZ*v z8h=wHa^M?9!Js1;4;sJ)U_o#-SP0w>!q(z3cM<R;{w@Yy1B-**@Z1t0ji*b3WM7sB zsT|9I58!VM{@Kqt70pTe*q~$KkNPzE!+cI^cqBe3*e@1ukVf)gDNer#QijQ&94rOm zPZ})IXm}LdVyu#8!XPG*^Ry;}E4j=l!0hJmDK4`OwsZJPG^`=w&K2Mg3IRL_B42n+ zxCY#hxPJrw0<Hrot;6xpKCNvaL-71v)zy}?(wHGUHQFYv@TGnzP5p<N1RBs#>Mcp3 zK^TQ5DvX>W#hY&#oJd@Fh<}tl`j6sapU%yQH^prWNP%qyD}mcU7jQe+0^9+%0(XLx z&eKS9eY>&mYX|XO$2D+`C7s-cRbk>j{YS}>KfN$<l?sz)j?Hk3!o<DliTKR9Z2D<X z6ew$4u7tbAfRH|d9*-q3x-t$|vgQd5BB$U=<ver`f;7tcE4nb-=7Rjh28BgiUn=n( z;=DJ`WnSH1sjgrGQp}38ygA||%1GQn38$vM0df&5vEgC6`kU?-OE<J~unTe%{?Qz2 zVhX(kj6F4oIz%E^@=k$L^iX;-P<b337e6hsI^&86M!W?~vbB(r980R$jv2+_QsWZg zLgR3_mbp`!v(bN4wp4ehHTg>UVbq0=`1=SL1O5yqfycp2@FX}4JOxe$&x3Qoiy-Qm zb_x6*yb7YwHRu#G^$j<`1>h}k7x*i92)qkk0`G$kXtSt?<~AVeIiD@@7#xVdpMn?z z(_UHgUho-+F{1VyJO;i1uYxZ@jFGfgU^P&~9B@4laWP{Iq&a|%!91WF=m^Gx`M?n% z=8nv;@wI{=Y;~;=2-{mL0<HzIpWY1HSHrt6=7S*SCC#vHwUQvUp&yYJdtEUz7wxx( z9sxI&f<ycw<Dw(`%K6}^c=2iNar#BjN>|9HGzwB`O4bK$dS%3m{VlU`aU<)*v>5Df zA>FwUqDg3x^d1rGPO330Ar#f0Upcm0m5B>aGp6B<QanSv=vxWi(H@i7Uu*m!Dm?j% z!<-U}J#EB^(WY>IJk_Jhe7kIx^!Ta}SXW|wbwE6aql7Qaik4qRE8vvjj2rkTX3mjQ zd_B_`6Ca%rW&7sq8q|QD!Z$rD6wc3zQvAh>($@1zR5>yENI&vQQ4%Rj43CYcKE?7f zEa}|6@UH);JZI;IZ4SX^DPN8HMrDll$m?<6fZ_O?`j9km5BM2~wqc$G?gJ^N)ZWk* zv>(Bq2<s@A03HKr4?nfDA>bL1_UfGlu^yzI12=%w{(b<dom~N`ojnApomE2esGU^@ z?|?PIdteig+8HIE+7IpH$%XnG22#7g92B<;%n5P3z?_hVxm5FYklF+0RJc80j)dC- z<}7HRI`8YjUQj->irNL{0JvSe3zov)QDAA1-q|e!_5;g;7>m;xRc4H(wTd9d%vvRI zGl=&a%%{LA;CZkHh%q0nub5wewLy&Sv^pT^v-)5Sl#dG-05%4bz~&&vAX*EM+G%d& zk(*s#cLnm|_=mjJwpiLJ_QUX|mV{(Xp~gmImOMU^>pu2!(E5!Fyz4)!HjDl}+jiO> zeywJI_0><Cc1ngpApBLvKdQX3Tt}Vpmx(1p|I@8C@%PiJ<cnG(VpIlgW;@h?_z9uj zRA^eiw!G2{?Lu@5Y*VD@cYu@+RKN3sQBwX<PO<M{HrN<4nl~idVJ_GnoCi{jzXsn2 z7l2gnX&&)wa50FwtStj6f0u()4tY?A?9Y=JhjOB}H4;2vDF@Dftkxukn~V)zIP1s3 zm;U?ntmm_cvy=t3`q{Yo05S^-j(6K+t2D`&SP74n@K0DKY%!4L5hj2rCCn9LiaT1I zOci4Bj}j3pK|<*&n=U>QW&l|cl=Z?WdY_Bg6Mx$mvkPQ4`&RS~9+pUn6wsnx96XC< zKa$}?-l<uR2%w=sLo@;WsIFyzA|%?Xm1Tw;9v=wLWVV>$S;SWlnNl$jQkfCR7zZc( z$-m+Fe-{cFKYG$AQ0Q68Dr+q(Y}?u5IqaY6!FE(rSNt_e%D;lXqPj5;>;NtV{lUdx zcW?>V8zdW_>fb7mY6<D*$sp<DC*TI~cW@&}^X!{J$`G=ZQ^4=QLEsLM%+g)pG;lXa zaU?yCb$o3<cojSZQXY~1E{Np*47LJKfbBuj<5<JePJ@F$(&w1-XZ=mta}j@^0nzsO z`!(0VoDRIU&-3oT;O~<7oAi29ko39_cpLNwNxx(6l<lZw@FD)jT%m@vnlWd`_7mpN z*iIt7`4aL1$X~LP%7cG^^+65#u^~uyQXokE0_o4ZAn8xCm#E#+K6Cqa`zvIPaP1m+ z@K4%p6K=Ou<@Mj2v|BT7wr{sovuu<owOcCsO8A$h-A;k9GGF-1b{k6f^H?EkyX}o@ z|G3>+Hw|9|fc}eq)HLEi(eCv|Xr-U`vN!P`<ukR5ckn0bE&s?qrM!0nJwfV+{Xptx z6G7@<M}rkWvO}m}MV-;Af~YGRCNaz?bFC&waiV^;6Ic%<yM+4HNRax~exNIu0X71M zgH1tNcWMSM2C1K24q{1=znRev{1Jb*2dVzRUe97D561N>kPiS4+0`E|C86S|&;8#j zkg|=<2-T|3CB;n|+O7gng^7Z=68_m#80r?9LugaINZ1}i6a;*Weu?#WRS2y0H}$%D zd{wVYc}{gu|54hhOp8E3b1U@oLS9jRc!PDo4q!X5BiIG>2R{G<z`<Z3I0EbrUIBZ6 z&?9u7w;6Vy)(b@W(-JN3FX|0;#otjN{!yDY$AK{*l@aPpmc5+!p`%LU8rIjeW0o?4 zjg%G<PjB?lHbdHRfKdq*RD1Z<e}CT6xuB?T354IDs!@_;NW5Sk3aM4`Q6JYEB2j$Q z3H7BNx-?5dVNg3NR)WI7NCdW;IBlyYq&DS8{l7DW)<tFAI=@BgQTypf{hJFYTDw?w zwrZPbd+JB|gKv##G&h$^%FiP|DbFr|mB5Q&L+}dd143VN-*p`f!{0Z+f#6MWFnA06 z6hyn{_p)w-tMT_8a65Pp#CSrx4;}$w|8u!N0-xdUCtyLu<ta!hdIh?JuR+uWvIDvN zG5+R0FE@xV$u{HjMrof^64K=e(pWqnNMmvIbG+xj2zVWT7YC_clmMyzP|n)#1uhC1 z^eNZ#pZ~o6sJ+1Os(!Zhhl-k7i*0qGVtEKD6_@^_XHuD<+ta9V(yt8SNbx8OQYhtQ zoDE2~{kze%k)}fMQx!b^=Wz~CNWcsfS^+kWzn!{I6`kt7GybXCY)no{$W;5nEAyqa z_z%Ph2bAm$NH2UN64_O8l2In4^Ns!EqfBu;Sf}<OWO32)v2k>SmHz%Z>3RJ}c|mzu z7Xlim(yub|j`F7pNPSW@kRDMBbOq~xWTVvugTV%16zBp{9ijbQX0Q?X35fA2zi-$a z{0V=z0B?XTLD(}I>?*e1+Je+)wF66o?LmwW>DzUDCW$B51b=&hKA<-U-Kcc{p&NM* zQUur;f2V@Jpc%xtn8)0K;3xQ-_9D#$gTSR=Fi3qH?MXTSb_WlE?}C@WULe{o??pn} z)q3M^v_&l(L|f#&NQID(QTQ8eMT-VYg0Y}8*axJ#))%C91e-5QoxF^2NT-|yPyBhE z<S~=32LJcLDvy|`fwjjYY#SKO3w4B4?lTmXED!>r924Rbq4~+2u~giM_*hn<&dOH` zD{888wu;(P=bqu3{-d-~oht_c>|Oq)A#W)CCa^k~4mJj9e~l-Y36gFd07in)Tl|je zhu~EF4I7-#HKcJZ)v>|g1#k#>6C4Io9EO9ik+qQ^)v-|^)v1p`^tak4;CmqSp}99W z4(tokz8tcXCV<qpPX<SWpMzh3Uw|~8m<sL$r-4+K(?Kfp@1d;h-y0}ZKrA#7&;CuB z$732xZ0}u((Da|9?m*y9MG9i7z#_1jRrK|5+|*vs#7@wtg}uQ3mPU>2eYil^<klZr z)j!!?Xv-2-LT{SK=2Q8gzbt;KO41>mR4cb5*0!~hCeHUlDm0j~)nO5kzWWhZL^q#d zgdxeYlS-D!G8&~{R3TtNGCdVL<HdIkNe@${aK=A7JxmX#peyqw&UFm9@eL!iPV3hP z#T98K(k1HPt#6W3q-1Jz#3kL-pyY;H{>H9tYF}ij_ErJV?zvQPj3K3#RIA7b5fPdy z$WWd|M6lq%jWkaAB?-kVK}p!6qV2JmaIqQEV+>2{;`F14m_h55aA#ychd_F;3w5~S zo>A%^ioBdpA=NTWUBCuaYjcbYS$sH~eq?!%0cBwe%TJ$5u)gOR9@^fK@1clJflEZx z>Y;RDoVp+jkh)Wf%_McfE;e0p;p=?(PsC<Am~CuWp^-h(oQx0oqxMVsj0&o*l+*e= z>930*Y12z!ICvRM0k48)@Fqy(xLe?A@HV&}d<Y%}AA^OE>?a_`2ik8S+4RrAJ|L|h zQ-4nD#~*?(!66{6ACt|O6YIPAbHY{vD}lMd>R=ua{jZi6>;%&KasZeg{0uAr{s7WC zGo8^$>&w_nr4<Fg0%?7D4M^+D8$g_|Xs(7jMC;2FKw4kMo(x`Jo&%P}-&DscgV<A{ z;k)K$?4{7~&ZfCeZp;INJ|MnxZuSRjgNY!nnayB5a5(4!E(Be{4PZlX3)mQZ1>*bY z<~FF8&A<*|bI=!T0aAT!4~BzoU<~L19tXX_JSfACV1BR@NY&F9#J9J#01)3`*1CX4 z!65Jw7!1<Zdc0$5E(Uf3D}mj?>R=DBDTwd2n_GclAXVWgFc6FeyMnRcZZICa0`>uE zuRsDAii(*Gn!pqg-(AvDL8`DO@E5Q@_#DgtUx1n5D{ufv`x*y=MZrN}HSi;_IXD<> z2@V6>fg?d5a1@B|U}&R3eBVO*1jKhKw6Wk^a6EVqoCe~&Zfz!562v^S*&F-{3<tjk zai+6|GBYm$7lG6t8d0}8*v;3Y?yyaOJq_B)Qt%{x_G3}Dfg&=ok2gFaJ~k;@yy9fm zy@SX%{g>UWJ?UUl5w=|pX=>6ax~3-8J6ruN^fbv9LPkAAKn_divr@?{ozDiygbuOo zeCRptmH#+iknX7b(x6)y@ucQkD}VIn4UI*_;FmOt7#7Ik328k~n?R)1ufI2`TXRX# ze>#dFbtMueB0!0CQL>bHQ=}MKG*>eD3~LpA85d#S(~s18C@3?ue=4?Kv)$MmLir%g zzF#37)&u$kKe|5-%yNGUg!=uIK5~nk?vM3G4pQmq9}%AZqxwa9x)}t!q@4CQlO6gk zSQXp`HUxKq9^?-U0C$7$f_uOi@OzM+yAPzUe?K@FJP1w(4}nxuphL~yfk(jCAl9~d zOhfyhJrRc!AdO{CgEVG23r+>kf$PEZ;AZeLi1`HV3ium%4a|*vz5!Bx{{nh|cR*@e z_rST}eQ*W%09*w=0+D9k7hM+l`~-hvPqOwDr1kaZAm#rHFcN$P_60H6Hje}`hizU3 zI)Jo?Bp3J)%nj1IT^=we^tvO6J(;{O+8r#2zx#oO!O<Y?ll}rM3eE+KfyY7GH+=>y z4PFMzfCiKs;%X+nP!1&hfiY&5^Cdr^>$vtlc&Zc};+MVtKs)>Yjr#CKLPZ1kd-b8e z+EfYmV2d0z7;0$QY7|?w^ma6gC!Q-BZxXAsH_|ewr8GN0KZ<;BFpHKT)uC$%VNB}t zAEm^dxQ_kfs4Jus+QVHy%CQc^I-wI-74j}1>4dJJ2iOfHozNX5oe&C=PC&b1ozN2; zg}=kVY2bU{S`h0wJU5Sa#qYgEgU!&EW5CuR_O0-FKWJ~}vG_XyTnr|HE5H<R3z!D( z05d_%9r7M{%mHd2;_qBY!yu5-Vg@OfhJa+_4Fxghp`jg{dxIZ?lR&J~n`eS!!SBFN zLFh5<Gw?7t4m=4?0B?a4!FSNsX)k;okoLmUo}4LQEAUIOGdLYw0?q`#1!sf%z<J;~ z@N1BC!~(DdxCrb3E(U$TWnc)n0*nBmcld0O)!=OW4g1r41jIfb^9^tv2s@egz{5`F zz3;V9zMCM2{l|OX+k)TWZ!d5MNH*q9kaWf_kaP>?qcr>X4tpcMG(SOmA5Q;`Zs8Y= zX!90L(DcSl`p;2!puT0Zo4|TWTg})|XP4Db$$(VWc<#^5>TipoLRC;S0E?kAPRT5W z$`r`5GgRm`vBv5e4Y4?3N!ZOJHu1UPqBH*Cb;#&clUr23@T5rb3NYC%6mjfgNKTD+ zkH+z@NwJ|k9&MA|r5-#wYmQ4IBG{fpV^>-n5y8*{R4}$GL+qWPaeG^Mcg8>QRO|S( zhcrt-J#5CKd*Ov91@Y6T#Kav~Kqr9@E=WNpD;-Y=L~PafDCNmN4{@cr2nsGuqq;*n zrYhWZrTj4J8r7#Cz)Ii|kaWyZ&;vXMhJZhV(cp2gA4u<4j08`EH1Bl=oCTsi@q8Ed z)bRY)MX(y4bqTBuUIhn&^u7fplis&D5B>_0J#iZ>f_i@+#C#{ee-Q;f!{0IBa}e{F z+6!<Zh`!$ZHTVYz+eyP-9rFQD!?+VRi<Sd~&7tK4VJm13V0kbX*aXZAlCCg-(4Sg< zklGg3u(=JQ&1?4ic}N#fg(RN&n>HxzVrqf2af|-5ZGm<ZW_EvCH%DLpMh#I7EYnvI zxY`R`>;w(%C)64?v-e>?!`9G#hOMFfV;kB(7F%a*Bj#%V6j%GFxY|$s;cQU5Fzn-j zj}6=Tu#bnUZ9KByq(eiml_(5bjYe&K1EjJ!C1j?=>GM?7uD9b-W&G36m=M!oG~}U1 zYjcGrdPqI|hzs_*@1&Ahbl*kD#8YhtX%wTIxaN$1b~A)zK*iA|%o<=>Gu#x;gPM*? zBqqZ{Eq}{NKC)DrLz-pP(gi{hS)t3U$5SuRHb2Kd{OJA+@LV-|FpYw-J<QtgQe3<v z{L<jjGNs0YWuC^PmGV*WCelpSB8w@@%t~xoL>i`KY7t3nqog%(m=FA;_^9#LZ1H@) zK<$+Do-6*+_xp54`=&PR2YP|<!~2oDgP-7UdS7WA*b}6A$zCAM;~T+Wz}}#SXGDVT zU_96x>;p!CDWDmA9~=Ujz|mlTa6Fg+Qhp8sX?}hPNNYPoLCU*HAlXop!7?DmDCVZ% z6tEjO4a6D)zh^WSoQ1!?1m}R5^XK=C7J&2d_abm1NaL+V;1+NRh_Rx!0>l_lTM3eF z^(~08n1*+2&A)?NLE0a*4J-}r0BeD}KzDEt=mUNalC8BLggwgd7xe%S;qUR_PvC6u z7zn$I-zy>;r!}5of7Znl)MzT3+u*rUaEPDHeo5>K$T0G(DqA<Rbx)w9#SQDGh?TO$ zk$w0Y7&RPf`*th;8z8ETf4r&LvhuGtd~2N`W`?O9?8OZ>?TA*WsL@*%OG(w7gv545 ziW>GsNS*P|u3_u%-;1WG>w~E16s)LHY$$82V`G_(Z*F&m=H4l^_K=IvU<JWS2#ASE zi#GM(&^#^oq=u)&#Ycu@rbP2yWIScPE0ncNAg<|lA3ecEg(A02SnbTFQK1MYt6HHc z0yGW!kxCc_R>D7=MG!8{I1)!e<Rruq!iGab7e)@*I499w^dHq7YU`902c>*1=K3hp zFi&fyL}8xROp)3K_5^o=1Hj$j$KW3Db8s)X3ET(PL|6ww8Xp}3-vxgFNuT@#t_FVw z^B_Sdz{21u&>1`px`JoHw%~cNBZ&9S&2iu*a0Yk<+yq_&F)yLr05R{N{Q}Z_{w=UA zcpD4=?}7`#2O!xgkH9_PV-WV6_5`Hy%~S9)_za}I%+EpCMVezC?Arkipfgw)Yy%bn z+kwTvFt8*D{ic-$sjw=7GeB%$GcO16nv5CxL8}U$2djbiz#1UUsn-E%yi*s%JhD~~ z90Aq`olst`Ae~j%7(5EL08fA|LDCW4Zd5z+I;EDvA6g8yO{dcSQ>xu1r8t*GtTzYY z-_de`dLMN|K8rk!4n)Hl4dR9ZmJ8`=7&VxT5!4*S#e$ZLS*{haTuV<#PKu@bO3VA4 zEZ6i)ddy2%E>Q$&_itXO6GbSc-XX?dZ~qWuM=v)|CC;J5er}<GShf_tb1HE_a6{$U zK}kCz5GBr~#NDjLxs^CDAUH(%&SMdK_=e!Ep1e-MC22z^;^z_I8)OW0^YIVy4hZsd zlLBA29$rDg(5AvC$1RJ`-~eAAPwe*)emF{5{P_C#d$|P}I|R9T`gr+=DBm2VEWXK? zo3F)p9T~P`wlNLv?&TF|@vKMIkgewqzC8jv;$ylZviY<1!|@Rwt4ogsvh^4e<mMkt z`K9Up3jMi1U$+o1m6JuX^%v~n=If<Zk<ToZt)HNP5DKW0^i(cePr;qNx~n)jXY0iy zzz>zf$112ww*HK=BA|9^)$lYrfy=G}7`;M6y!<_lL0;azULGMh(<QGHeTT;qDfJX1 z1w%EiZVA~Ukjnu<Mjw9<->#ls#-M<J5ThkO%fshNw4HidV6f5C$0Nk(6XNFU<6(63 z?|>|F#${7c3Md3k%iRaJy1Dy$8AEymdKvu#{4G9mWaq=n-Pc2fkuy6V9@ah_vh#tb zh9bcQoqpgZPH~~vs^}<~^aSh+z&HESINu&tqkQA`@0FTr?3&a!DY<`=(K{Z#yv5o% zWiNSiuz2%H5^p+Ld!w37-tuJi=9U`EZ%cB`CO>&Ce!3>bC#EDs)6106QAY3Ra1(8l zs3-$-w0P8?84^w>uTdUTNcpmQ5M~G0LGod+_;5>24bL=&Bqtkv!&74|f#kP%@rzHR z_s5KWoKY%^idcN;@#w(gHXq)%NsWS@RU)f55B(S(6;_q3p1kSQ*^c2!QAnAd^iM6` zILSsCHEucdu+J<WI>O-kz}S&rp;7*-%1Dj3`17X@%{DaM*F=l2j)|rWJ73f`=$W5e zeChe%fo=`QLF=`Jv?2MNn$>3@y<#GsE~}PaiZd*p^#X7gTWd%cQgB~ceE27$nu>F6 zMHx`4INKU?qjUH4HU<U-1bPL9^ss7kl&|C=hnCfYTS$N(Yd`XkGaC=+dAvG!1+n%c zKMvXW@o)?B^znD|g@VcJ^p&nix<N5`LMIwMy}aGJqGO{@p00Aormlwgbm$m@myE?V z)@15hpc^!K0D7^CXwdzU8RCb53LWz6B3d)OiJZNMhJWXw@!xr9`gb0hTX}HKE|RX+ zvCQ6wbu_d0(dciVVx5xe*~LShh|C(0^Q<bik==hs&s5fuY0;_u@P3n#|1hz>Az!Dn z_a(M#Ma4&&Fw!aD^hgyD-=30&&mhz3k_DU|t1EHQ8BrJ^VPcu=!8=?lVdez-gnIcJ z{Q}VA_yza}sEb@3tS-V(>A|&(?quW3?qWlAl?@)dtBqB_d8t#iy6TRQp*RaTUCBPF zNDRHi09A&qcQDRWMbvYQ4~j&3v7bFA8P&OflMA9Kel}Sf5fy`$P{65m`Rp!Jz7%lk z#%+kM^R0aRG`-5mtuPcLwOr;jQ+x!Hz~+!{5}?ENa|^`0SYD@!{BU@nzAd0H8_HL7 zqu0ydBLEGygXof}`=U#^%n^y1X>^Nz*)P}_+{4d3z?VB6;U_XaDc#ynSAQP_=EV(I z_(+TIV-renC!b(06>-_wIU?3NfWRORtDBp|a<Wtu+<iJUv3fcV*Y0n9b9WeeUHv<- zg(HFwk4x@j?W0pbM>luO$m?lLN=yy6zU~$n2m>W3z|YN}$1eAfaV0c5_<~wNRBAj{ zB-m1?3-724$q{|TNP@&AmAF5K<;r&%DK?o%Tk%MOe3w^Z9IT-{S5#7(@Kc_hl^9)< z@?1$t>Gc{VuB^oLP6zV5pc9=(DSjB%iBu&-_lr)TFHRJ2x~tlyRH;JGV35=R8Fn96 zxs7ER2vDaG1ch(xhQWgvXS9$v@EGT>Z?GS9=(lp4{OeooM<C7RQ}fx{$kIf%ji&8z zq>;R{;NRbAF@N=&3jdEc@z_GoN~gcSNena^%BU6n>l@g!(F4Oabk9xYJ;na|9xg8$ z&FJ?vllPVQU++VE=aE%QdE+~OeWQq^yh(p(TX}EEzrNQJS-bmP<o%`p{(d<u(+jT5 zU*92o>(SKnrtDweMA5XpvA&F7`M<xBM})4@e}%vHPk!~dHIcVe{Oemd3$1P|r#U+P ziv9x{FbE$n#|vMuHiL1-v3Gh>Bo=-go$iUN!71TMMyM)Br(f*7heX4eW&d=UIzxmO zEDeW{5D&lbl(eAeNF$W8qf;#?JX|KjvqQ9rEM`oM`b6>V6q!H09lF-h>9lyZZ+x1` zAFrozs6`>aZiys^R0uMwh@*dXblPeY@1STrm;F+>N5nNYqJ5!m5imL#N2i(c9?X12 zry_Ggusb`AHd6DQ^kgrr<sv<Penz*9_%tI_ucOlhtI&)dJisgk@g1881cqZy4L8sg zvJ9;944Fd_pxhs16%>1=BNyRSnERf|NzojWvhW&i6MPUynJ-ed&yg4PgizkQCui_= zioqhg>mt@AaV5K0b3LeUQ<8zH$thT>&*TuP9>m#&XcZwU=kIJ{iyDVvrbr7t6!m~J z1gm;Rl}Jhl8J<=-#o6Eqdz12uZlu@Mah*qz>PAZ7CY$H^NB8H5I^l|K3BufRblMN= z2cd|OuhA3rJ2gGhl$^?sC@ABWkZiKVjVcS7&Q@{bnFJo=scL#q+^Sb!4lajPjD7I3 zCC7^*F<4v>B^{U=O~+C3MM~!$aZ$Ee5~C_{W0sMiX-s}NRcF49uI{x-m`8GwN*QJD zJQ=87N$g7{n^t1vW<oZyRmua?ypxkmG#2HQQ}%nofW;ILs+}>Ak2>clQL`*78c?@@ z)L5fiRG)NRmryG6hzJE!HBfm|92XA25<zf0jHc(%n;?!(hlO{_UVbp;Vu*M!<$^I7 z=azZm%|3p15nSvbZtx4o+oc&Wi5;CPTRl;HCyPB-#3e6r$tNi?mFH-}6F4BD+N#4t ztE?W7UQtD{SgcZ9O+*Q~i@ZpPHeo+AU#o;Le#5LB=cLI<>54+KF};r6HNp#(5>3p( ziwB?mAC!z*sI(FWERIemMPaC>!2$8)3_pdk?_H67q?uhCa#m48u+2WMoW4St2c(3* zpB^ns4%0}EPRkGivJ+;hqf>72KnhK2J1Pt}%QN^11tDu8WYBM{%~vBO!CoPq`~r>M zz5#9_t__=GtqZkOWTZP36l?B^R)rE2jhLi~Rzi_p3oS$yD?BX)kKte!2*sr5ttTzi zQvs6sij3p>CuUucyXf+gP?9(zMJ39}Ngoa0?)at#=Oco~7d4Em93F`_#41L=pHoO3 z34MJ@e@0NUDI8_X&u$^g+*1F2=?LvKQL3cqX}u0NB0%gnp}HS{cF`f!*eyIY2p{A~ zPU1(9&lMs!C|RP(-?eY@J{WOwSyN_KLBOfB)^DV@`5c{$BEzUbU?5W&lJ!>QhsV(; z;;3JyX2hY8HeWC93WjxH^u>;JKk-5~WjPh>MdS%efmTAO6?GJ;b;rpdQB+Y=MLH>2 z^F{6LhAp_*L6MBa!7!kB(&8|Jpls#zPZP=H><@;nRUU_0@}GO#)qJCeobyxJ^ghJM zKaK;J?jjVZM+$bmQk~5dp>ro3O=b_rdlE_yao|*1rI50%r?^2VT<(c;i$t<!;mW|7 zMJlbTEFm5%iYB3A?<~sMotDOm!S60>jSOEL^hm3;BmYuFuS%_|hKz<((QH!DQ3Qy! zC{bgFWK%LLevS@By{<A*P`X+HNQO{WP_b~A(ML3LRw%)y<P;y|2NjJl*xs>9CTENf zy^v@r(1s#LQb&vCgtcQwrv@?+;+!Qes#!9oc*QLwJeKo>8cmv>DDmPoN1W=)WZ|6@ zp`{<Sud!5BWvx{;mI|Rb(uiE4n~{Y{w2zPjCIfAR2-qtlIue&mIM<Skf0vAhFoc!) zK=ma^rjk!z<A_rPNr4&dH5lpO{ldF-Uty_F!bn_V9U@E&Gy}?uO0ux<S?+kFAIF3Z zK`WgoJZ577uzETzDwM_gfX-1lY7z+##%uuRC~rNW2<MZ%Fg~9_Ito=F5q3`kR1Dus zHFc&?ZCp)A1#qjagzDTs5=8**LV98VCb6K#bn8Db&0_siHYSQhyYUP595O3rsleor z!4h?950okEWnQI6=-OD=%^z85TT3TM52CM=>3TRg8M=mB%Aad7`p})D(@JCy?&2hh z!Om2xa46B?sU1?oqvEkd!)iSf$;HB#TU2sHv@zHO6GI%)#7QH&=cuTK)Nnk-i5iq9 z%FZ~uR>x{-izqx#)*M{TYQSrGQ8;?0%9_NL-h`e(SRiEH6%`(-1aVd9K1)lbc|xR) zvrw*4h#u`5nZ0Du+Vp6YllH|fw8Ed~i;)wOE`s!nPE1bC<b+VW^QwydTU=SN<;567 zLrltcsziub*I-)x=h|-7s~b7D)>y@zgQI%$7lQ%OMw+8Md5J>~PAKoGRLY9H=RVk? z?WpGpky#<CqDMH6cBGpq@>!~ss3BvlVrH?#xB^hOMxR9N7mkg9JS_*S-l{^0lHhie zVkHhj1q)A5^^E%bm8eE!y+*-$WmT2!h*1>H+N|BVQj8QMI@F#jIm|T<%G${0QL(5o zRQ5xyVig<-Ta`27cTq{LlpBX54f&v8cN;sN9%(TTMC`{|h0E<Wfej_f<xhl$qGdd} zh{qK|nn#$t#wd*Hj8QZ!Henlc7Ty<u>XjcV74Ha&w2%&=DRkB>T*G5%I+vU9UyWT@ z`Owx2<d?PC$clEHb;0AQWUg|tQ!=vJfvhf(I10-byHz;P97X5qof@q#MyiTqW#(~< znjn(r7K0Oeqm2z48QJi%n2nrGh!Ta5Bx36?l_0In)5<)C$i~jmnHVHe-`K^X?Zqe~ z*p!J?Zf+Z&T9u7u#g@YQQWT9}cm@XhF<2JoZ16x>u(P<cz>vl#DgzZuZ!`5o9{I*c zq=rj9PzxaywmhGDS=rOjfC#sv*TWJj=?1Dg=~6c!N!F!Ieo4jIm+~SJM{Zf~B4~;T z4Vub`h_Ic8vXZX|r14{@C(owa70tW2?Twu=T)?6@-$!|pr59&yl~b>4Qe|^lXFJ6r zY~Oa4%52?~eC?VNKTsr)M!sp0sqrZ^*^fyYOWnszluA{8QN7qibxX<=7pMRnECs+9 zMOUAt0H{xq&5EueXzTo@n$%f5ff}9cmc&EIR;3SlqVCBR>NKvevN&P=aoftKOX7Mg z+lhC4MsyVC=oq1MxLj#8fTe#&r>2&Ni!NIzRF8!C6tqPV5wb+T6gN}h>pj3M<hUB$ zb#sN7zL-cAj%~V5?zBUNqe$Cn^ycryAG8yF%V9hm^5AYAXih<F>YyA66cq-B0M0mv z@t>R~W^JgLX!E-qUr1|!OE0Tx;+AML0i>osNS9@uU=*tVhKQ>&6v&7aHe?#N0;!@q z%Ia^Urz!6JtkQ}cO_hUGZg{nAGCLLfM(7(*s;U_*y^3X4jKa)*Ol8ChoTHPgO_&&Q zhyt{lA)?N&vQz=AHK}54L^iT27d-^e{n)5Syi7rz`9M(=9H<x_p`3-5lY=+PRWVt} z38BhjJ8!`Sk!^Ry)pEF1h6VSH?$5=!$*Qi3$MS%7j-}=DsD#WmuIw}91?=?`#*Y2q zlsmjC2-S#lsn83<)~4Fj9NEx4z}wq0@@0kGUsgadX(k3_D&4f}3$<1$cADd)U6YPZ z+3I~G=WTxxLD_zUsZ3{>A|PSlaRvFnIxqT1N2ll(jA$?3qV8J{{JDqn6a5Fxo_i#t z5z;EEqf?|vgqSoIk)#%1z@oRf<KS@$^#d5U;;?>I8?!U;xHb2&4mVoNK9D&<>##@; zj1jU6s7J`gb`%$i$owU1nTnSmN~$@_L<AQ{lF)+G#dAfZ4wrAKf?HNuwHi5)^-1%L zjtNK0Wlv<S4i?$ZgKxINxHPG*(&wlV>p=NEYD&l?rF6-@BTr35e7i-{47O1t_5WNH z6=`kxuxw`=DNzIU3WG0=iXC3o7P~MsD3U9Sb5x}2q46wLZ+iYnQBx>+6eTLgJeFeQ z?kBrqq%l&8h&r1`oE;S2S0X#aB8eDngp0Z*j6u#F(mdJQ^1=e8ZAZvCSsO8k@})&^ zZfNNiivv?}G|u>0loA&oTT;k4Rg6?uzO^n!TJNE>Q#JMx3Bc$t5k?Kok#LK*9%phM zEf;ChEnd2{gJ>6&HK^b`iAjqLa)Col-5b%v@*D@}4@KrntNO{dF6KA6rP(Vh(U5H( z&6*&4>yYy%MdXbb<#KmvH8SA_Hcr()IzLhjO{pl|EJZFB%1GzP#Bfs<lZBiLO8yd& zBNjVHSgzTZn`oHXXc!|;aK5xucbG8U`BXgF98@FAt_Vd2(c31dDxyPYt?wg>2E`(# zW?7gE!vys0R0nDPRYbS5O(C+9;_69>mz}Y@osma22wC;fsi{fH(DamfpNY({OoEX~ zt1p~n*O`-%khSiKiKi@sI?;v(S=x}C#iz=Y-=;Fj)hUYNr!rTlN>ge|%BD*C)6HbU zz*$vD+IWi$l&fjHvM6$=uc#|%O}3hm<~-Vp@T>-zMx{cjF>vUl4s6zNL`BGE5MbnH z79i(bgn`KQcMcRmAAHIqB0Yv1NtW?B8%}?*_QRb8ZAFxYujYH%bja?4s8%*=nY-D> zGOv-PTuDgv{KaCA7&;6URfAOvWyf(5h}1Y7hd)sLvy9NVZyGF0rh_~R-#Z?v0#8rn zoVX?~O1(`Qjiz2J3zLo2HmLy|*lJ_=Q>Dpf0Y+%uZ0GC565?OZm~v#_x792d<jU$u z-A{HCo1(gB>A*zx+w>xw{kD}uT4Ex1d3A}-W#fogO*BBASm`aYO>Jkr#RU7GT1MQs zX`33FhgT95ChfQ8nz};><-nO+*weB?56M|lIkn1B|3XBQ`T?#vwD7sax=%vi>yKG( zZZuS_`rG9t6|(X`-Tqh+VmHj1OCy`Q{jDNaq9t=Y^ID!lHH5;B5Vs1;7itqn=yCJr zhf~b{Y`uZ|k8GCRSpKbew3r!{3X1xPtiv;|rtL*FB@2g#hJ1<=EpEsqH>xw)8RVj# zW<L(%c%Ue#G0AS3H99x4#z?jGR3pu-3vJ|YiHfD8rsvDaAMX8lVuEvslxeWdLrC3m zu~Jts3!zyI7fgncrE|!-T#Ryw6wR2fm9{+I##A6X&?Bpo)s?Yq)Ep(!_v0;9jI~3S zr5v_*b_fOQ&994j(`Q|H=}lj6;vCFo1(4gpE}=sykGP}bw&o;a&+5iT&rs5S6nSAi z1m}FB_@)R;g(^1dd8<Jdm)8w(Z(tgi2~y1|rBz@T%1j@;yh7EBwiP4012GYiz{3zR zBKlEeTtK>sD;BolIy$`+g<#!dvH2AvrX7Sf$})#0!uvw1e!0LQtd_qHkF)0wG(WxH zVXH$=2(86P>q^fy>&+F^#Cuu#EZ0VyZ=|~iigH#Ok1x<D95JMv5OefoUu4s*vof;N zXRIb{6%<#4ax%&2Z}b|=a{87mJ%{8n>Kug4DyA639}`|#yXby}WpUmr5ZN3!A*7*g zXM=>gohVZ6D;6fX<d<X_(C{cXTKeSWb13a7i*BP#$!5ut4TxBq+k)_Vise4ii7_?` znZ_mQVw6bgAlpH^kymo{MQx+z3Xh}E{GjhrqdiiwKQ1Yl&OVI}#-deZTrieaXw)w^ z5z)Glm{t(QD&G{MdSSmXCDw?}X3bF}uO3p}2ob3h&6e`mwp$QNHQN!Q=#0axt0M0x zGTG!unvvSEWe*E=Gs`VK4_}2fZt*~Iurr#uP_uMvqE%*{;^(SJFObXWI=y<a?&vDi zvt`PH>lPJ%)+rg$2V_&J#r!=oj`a(lW$Wl<H;CX8va#sc+RU!rbA<KP06Au)^;<R_ zvR#D~5uoiMY1G!}ELumWFND(J?nn(DX|zF~N~XL(hbkr_gzcxgtZXM#g>s{JYpF%k zTX!_^OI5m%2#)nSR~s>RLwT6B4-tj58I{Cp)(?5kYO**AgF=^Pk)PF^r_x=WE%mE0 z_g-06nYeA26OrP?Ly_9g_1kaN5C*ujC_(q+<OJ4JXeSgO?}nbqCfCNCsoB{Eyz@dX zANz&lB??n=S{#q$IZLS_M#<3%zwt|(=2(-^p&PPN$~k1qEEJXCe5-b$Ol0cH8sSEs zF0>3I$)KQjyeYoiWe22)yw37yp(b5yg5V@9w0fLvBPF$FyLez_D$|qg>V;4R<3wc< zb{;?B&lZ@(uyvHRV&wuS)2f!xR-Vxj>9HM?llzL=MJ8;hr7F0J%}OSb0X*qUlis2` zVcSX0ugQ_C>dm>FZA}2KingiEI?q5_$!;Em^+~od5H`Qf%mqz!a_yjIlC?RAHGmYW z<k+qxi>|SYsN|^MV&2HdQ-nz-Oi8=8BsO{BvGL)&(SVn5$UZX0C)0qLia6bpq55>1 zrRS1!6d`tV98?{%3@=45k^PJb=eW((rWje(qqrC&ab|#=8BY;Yp<)u5Y5|%Gms<*s zB7sFr_0G={<HlTLC^|Mf9l0)W)Af_xo><NC5!>pharPDU&N3;>L3@gz)g(7`!DIY` z&cRELn&#~A&6eperqn2Qtw!1FPo59TQ`CFWf@|j=?r!GPEvB>k!JEU;7TI5qpy)4` zm+|^8u${}kxTVz>wc0*o_3klMSKR$<<DT8W4#R;zbY_mTL-jF*Cl<Ir{Ah#re&6(V zU3u=wlx-g4n->rHV}jSi-=EBzz~7gGKdr~o)DnikwS9vRKivFT=U#z#M>k5Z5m&HI zp|nwhZk`y8Gq(^yXNOJ>j-?|q3YY!$bgl;9u3dhwM@)rR$*y-d-~YN_y(RUiqK;sH za~vNVE{`a`t!b;OX(bm-E9G43R-gC!%rATBdB7{LE-ik;IbH1U*wN<`AD!{7TzOXS zmkwnHKZ&e;Zfc`yK_P`2-yVJ|bUL2vg7Y_=9SZcR)4hw~%JKm(Lx&Bx|2*~U=@$Z; zA6~n@VV|4vtDkPGj{{iPUyo@8`%TZaV&~@NV~_pVzv!z)^W(?9UuWphZjIlc)}XU# zJD<mj@B$A--3d7Q(e99{&n~}SyJP*<3d`GmxoB&LSkJ3vI$mj46K87RTn=Z4b`=NR z{ryPFgpodbr`C3!ba3aRQMFc`{O*gVhfPCo9jS>!OXAsIgOB6CYPraDO`(-9hkeqj z+v~l_GY3rX*V6N%*Gh-j&0|m)IExVBt@`wbkGuZbr2p|kyUY0BS<<FrqbW}-W?ZOK z^-A-Jd%i4vkk3_vzjr?TrD5%3XMb<`x$BSBw(NT8aA0qfIcMsn>^ta^l<#J1SN={r z{2iJd)nkA2xKi5T_ok$@jtTZPEp%8MUFX>5I*s$5^SXn|g7bplufn3aS869eoU$x4 zS9pQ%i`3k|XjN*9soke9G88RXw#;o*Ryq&S*}*x#&yIUX`hLHt{*2#S4I8+p=;~${ zo_t@c{H$^1TdbXb4f#BV{gu6$o>r$pnQnEysW<0r-Bq0~)||Sc?C{ZNW`Ejz;a&F( zq!nkUAiOytai@3f+H@#y{yO#A=Zb$(JMpDU^V#l^ZMIH7IqFDKZ9bC({;GC;@4~u= zDU)j4pSN_}oq6Xw9+`BiTdO=f*S)Os`rYkUF5(PItYtVm9K2gT@>0f{v#;N&Hh5s| zyp><9{ye_h(F50lE8acO=heH@aOMj8E79-O+Cr<VU3k*?<1-C@uJ88!rm7FFSGu|= ztnNphQs0?09cLWjOd4m0`JM^2TaLWbDCpoB<Cji7zG~C6Xve-!x^Jzw>x`lNr=Os4 zn%Q6c?FYFUji|i-!PU+Mzx1AZX7aAYQ`d%n)@yH#>1`i<JE;=B-^TuO4Db8<i+8#t z<~$rx<zks4)$?8`HOl$qmqR9RaIWxZX}*^@2M4DiIXg7y-=yg2?{;+wD|TRf+T6WC zC-)9pdH8H-@gE*d?rW-D<b51D$o@j^waM4Yt?av}o4ky2JpbA+JYe~pPu4$JvA5ps z#oZ@N!y%)W*x$7&6@IQZZquQG%RU@-V@azH8%i}R7T$cg-^IJ;w1&@nEy1J&&iux6 z*B7fe{@N97!KsH2I<EU8b5Z|Zd3HY7T7BH7#YXRW{$e-I)?|O$sLPp`Kke}Tht2Z! z3Hqw$o;;sEF4JhkGqb;U+X}UY<rsvsXmG~2vqQxy{Th}l9K1bYf3dGZ=9j)aGXKC; z*DpS-vctVa{_(}nb;Mbu?C;3gUrJZpa-_+kfbUlH{VCFE#^wvRE__qC|A2bwtLo0V zUlV8Wu)oS>YyH|ZcaI+5bt~U*+oCc*E!*Pw$Bu-)dFHm5f1^^KMh|heO@4ZArK@#L zOt1Dw$M0$+rafGCAg;({=T$Ar{V{rQsfZI5qAH;d#IV1h8HeBB_4$bbMLG{3nGk*Q z`1SH1+^ILSbJTY^ijRNQEg9XzKK3_dUG3d3+{b@juJr9E->tsxwzk>xT+Sg6<|l1= zRq)sMZ_mM57zH@JL8FF5)$U%qaGeDezisw%Z?`j^2@iAh8gVrC*@TmaZcNd%-t5nz z==KYp!Upfzvf^q=;j=R)tf;ZF)3w8ix9;AmwRLf~YZdXDKKtvCT;-7Kbf2Z|){j5c z-&`x<f|mAE`zKBMcs+0*ylcq1COA`w{e5;e)$F`9c#6l}Lpwa&nx+q^{hpz2&lRgn z<&W=Fq!yh%7*dep=UuaBbV_<?kNNL(S?t-r&-oi2`;A)`H+06J=wF6)pR{u(&KYBW zM@HtYdF^`NkwqStjjH64&vpF9BZUVqkEzspTHLU}V+%*&x$JN3>uNtt&pCJJmbR-3 z#U6eyxbqYbm)x~#9_w{x`C1p(ub^{V7oz8uKi6oOYuWn`>NR`xvhtXNlbe@qw|M;1 zvp43}oLTtD@uLUOj@aMWuJP~It`Hdf<o<}yzJGP8Ztj<Z<2_!vZh3F7U(V}Q%8b#p zJ?yXXoi4*ZTb3jF(9pA0Pkp<)(~E&E^Obydqu;J=6Hd=>asl~Qv@kvQ%I)7ae)4>B zo@I+WJ~`UwtZQuB7jw>58us<z>B|<bn^EB@&g5l(RoX6V|KxF{TP+*7Upb#%rSi$) zYtlA0nYONO-|}g5GxK!7cS_k`(Ym>hJe=KktJAF^bw>?<{#D*ac|2;Azc%;sH?J$@ z@fzlX^Q=*4oE^3#-<#0n!%i;!VuE|EoY5kt^!>d<CmoL8x1_;?_;W+kdf}Ts>~HX= z86gi$0VBTrIH&WZ1JlQx{<TP*c~iVb@5tL>S*@AjZE)Tj`|B|yqyCJl_+t3-kEY#! zXTTRZ)^#1avh~Lw4{q$&xJ;`|e6%qa%GlW<vEaOlzvh{ExZJAmnoLOZ8F8!Slok6& zf4Qe=hiX4Pf4VJ0(<0bk(d8{hb}!uhVAtD^cYKjJZ)l!b9Uq--Q{`3UtdnI&H9j*A z=gYCbm$f?<^FN+@-?|8&Dr+)6`1bR>ZL2sR?R&K8@A<||Sam1@=XkQeBbRcPTvoYj zjeF584{sb*uSnZs{mKS)KQ()G$mDUYYrXRgzK4K5#M$B0nPVQEdp*6``e;VZZ$2q` zd&!bEPcF8pIsV|Ro_jWyt%ig9=CZ#j1x~g9{`|b-p&!=zec83<=2zjfi<n-zG%GXU z{)8JP3_n7jvcFo_pBDL{%e;x#HtrsO#&u+~D#a$QC>yxZv0(KLbKkwUDhB6$7o+En z{^8>HU$yjm_j0v%@5er`Qz&)ptr5=}eth_spNH=1S+ZvmzH`9-B8P@=y4quV&vGZ{ zH|*W~JyW4WIdjf+ud(9F%GH-9`qae!)BWu4Z0?suUN4T=cs%yzI8*%gM~nQ+dW6;e z^_TwPo&RVMQ>r=6<buuS>~MGH2j4WDIcDLS{w02LdVFl-nw$d?{9k<OcO$85bk&<- zov@#k{Z;>JeaDYm-u$HJne7vQDe5=2)H`10J7;no=$H8Q&(AB=ABHo}*x#wUyN9oG z3fhre^4mFGKREJ%n_tu4O;Ptsc$$Zl8y{3{1kU_|eeUe=cyQDCza=Eq@0e%Q;$wX# z%;@~+_lgHIOSScTujIW?W}XYicO%%}ABX#VyrxIvb_tK3y0o4AsP3`T^J_HrK3wvh z%}e5&<bDNvek=Qn+*4&?jR!fmb;&Vx&eQdt%Z?2_6mzF)M$TVa_1fI$g9|7NCk*7A z9ZIBcIC<hw+N|GS*DjfJyz7Hsx1TuJZqVR~bskOs>O1ZFaOffSSFqB^GLxoFD1Ev} zjb3?Acig(z?RDzUMcQRdURU=@;l+c{K4!7M?_Z2q^mF`(HScb6T5$2npk^~>4S9d_ zvz~4fde#~ETje1YU>~!;Ug1BkOY^@!w605@j@r#1%eE_eWJcA!tG47_bNkBr+7n$c zbj4`c+2Qc7@5EK9I%Uhc>hmfNUjD;~vg00)Sd_QXv||g*4GxdKumNX9v%mROPp-`w z)_;1N4M)t^7u?HJq_}&t{?%^}sC06~wa;cm^hJ70QF!_0&-f_E#v-}WMi<K8J1yXs zUCpOm@4vWht|Zga;z#}aj@7gz_BY~WRpahoRuwqXVZ)4VwQpZ-()v|Mf#I*r4`*-6 z6;>q^{o7&oH`HU$ez%ulJ^LK4zw_2twHDtRI(0_5qW21fG=G2L$dbF!&S@Ug*}<=0 zztlf`j{cM{X3&f6n?EXh(7p4{Q5}YlO7An#vD%bx;V+H-&5Vsr+Wy<b5$$uncXr&l z9`0?EXC7#<!K?JL9#z|Yx1ik+oQ=o+w0#>t{Pe_&Z&G%8Pc4!7cvx7MPLt9nq_%!M zw%E;nb4Q{57A-^1z4Q86jNgpaLxLV9f8hFIkFNWd=G?in#pQlpOLtD{mKnJPi=piA zk<Z{ShO|yy)343r!@;#zblo&PuE0L;8@0~0@3nZxl#1nH@3OyV?cdv*XXL5tyI-Ag zDLQIr${#5WN=%)yu0;JA4c9y!Q_mY`$Y9yZ*<tWr=bate{ZggNwVo%B`9*d=didG) z^5+6-jXDuB<kKOEc&<15yE<d~<B4DInOe&j8I{LrM31$vXRYn}&WJAE3w^cbb<1jB z;_yfI7qM?e+|hAg@B3-(<8w=I%nd#J>x%iwJKuGCoVRJ;sy~G;huy^fPIYb7Z)=-s zV+WWYx42#W{I%aUbvV~1v(JiyS2D`vb)60Sr9nB0pWCksrYwHH?k<=2x?TSG<+x)f zzwMin=yj`cneQVnemf}L73IPH9v1H6wdMQwM}{uF^sw~&w3+@zIut5bdDE-)pZmm) zo8SEz&LC%hb-p+;&UC0?$$X`&l<sgWctwK_8z1KOi_Bqm-2Y(KSLN&B`v%BEXNL>J zT@&J3%`0+q*!a>LyN|u&9=h@O3oF-V{&fE5p$^MO?83RG?9bFA=-qr@*XsO9)maxB z@9y6F!$O}FYV#y=&Z&?sqi<C^GahFtvcJr}m8+Y-7?=0sVc(VxsW*7c4YzSeu!uiv z;*JG7N7d<d4QCFb%{e=i+8>nbo$lj@Zf-i=@M+f`#m|JL_s`pNVvmyT_H6d*(X}_u ztY?1@FODBpuI(QUN_}+0VfK@VgV#g$54k?3anmU)llFWxZFUPy`-c7P@gMs<Irm5B zH|H{K=@)jl<)sg=bgENv-%nrkNUQYlr>p3H|6qS1*JGDxyXLN3I(qK)U-kt)-52vq z;JK8Mr)t&lJ{Pfe$O9~*q3?Hgc;K5jebjZ+OW*J!tsCx630Yrs_0k37@79jE`JS7x z#R7yiiT#y*_R6#^^z%*YzjKIidp&pOhTj7`=7i+Fo-z1w`DfGJVf!6tf9LyVHW;_C z!n5n6yEJcKA@uNo_?>MQembmkLXP5temc+{hx%7_rswv!GHj^Vgwww){PoDl8FP-V z8N9I8vOJFWy(drhsZxDzIgC?M+26{bTu%r4l^-y0L9Mmr-6s5awSVOY5!+WCt^9n_ zw$B4sMB=PT_V;AYsY&jEHIL<p_IkeM$Lh6Dlsr*(ibLfRhVuuf-*cF<2WQS>Y~k!M zVM|JvVV_^$+<H;xpSvE2JijWg{e+)}4sxonv`oOp@Vcn?6WQPHIh8N{7SX@*v9Wmu zymQL;oAD>YM{nFW@8KG^57I*_q+(olk^SX4u%u;Ru{^I%mF%M}Y}@nO`tweVX#FZC zva6{{jUT?egXh+&OwXN@f17vgn#HG^8~U0r3~x7U%h}d@#_#Xmd|Ip69uG=iL*Frg z{gtjha{cDH)2bHpJ8-R4@u)!`T-njO(dPNyw?++4`f>I2_Bh*<{VlkpMR+(byjZmP zxZT<(2PzN#u14zxhkLF%^2PI!ueN5+#@Q%U=(z*q-@WNS=IEtM&CZ-nT)lhy<e2AW zYAoAvXF|7x!CQkSpf2}ie<zQ&`Y}Au-Tlp8JT+BoR$}wd>lYjRk^{CL7~)&Gt#94N zIQN$QO>PxgHQ~~owG*~H=so7**;!@FhdtRDI3;n(dkK{{xP_6vN8j)4@I1U$;+6M$ z6|B3j*sU4!=eF1sd|^w|(_b&`vwmv7U-~?0gmE|fn|S|=l3ivN-~Cau@{i4dCpR`Z zS*JwVU6(K29K0xB<-BL1bC<He9W6X6oEql&$Cm1c!%o)RShZ~6%pKiUWsd&j$&Sf) zyvwaXd#gszt$1$g?H;qXlq#N5d03y{Z=KH5q<v(;S^+<e-v1!&zQ@61=vUdFao4Q; zgM12X&#|oVhMO;3iXIFe8Q!I9lhzfNoI2d^n~~`EY2MG-p?={C^;0W8yzq3xqWOVe zyYwHr`rgBdO)Is{)&6?s4~5oL*YF`|^0&D7_2lN~`kb#{yJYAGIaZvS@ZpmQ0b6h9 z-;<K-e5_#?@~#8>`)&3|pM)$Nzp6ycraXybCpT^MEGAFhfkR{aPuM!8_vQi6Ym?aD z;c9aaT?kE#`?>l0(3<;RJ}S}Zoy6Zt`p#>&Zfvb1-@ms6XT!3;?xz~8pPD~ng=eRC zFBTs7q_0<wuQzH7TAKG=Js%%&;@n<**QEx<FUdLVN@ks%^X?~ob-CoF8Sh`eUv-1| z-t2rEy&h(?*tM~jrp2+pKhkm@|7c9ix~?}D+#Fl1Wz6qIKB(~V-e+CbG&Ut2K2mKd zz5&7hYIZ%j|K7?MO*7r&ceZ~#VRPftFAnUEi`sPE?ODjL&rV~^lM8*dvqP&1X~%{o z{oK0P^BZNaUF`qOZS%6=y(0!sIoDvoloOp&&f<Gu>~Gx<S60?I^hsiFr??!mE^Zq; z=JNH!`R1>9va!pwW`0TCV8?#W{$jc$6n=kQ_adj$JLQ}nG;~PuHQP1~-Lh}8`-{bg z7mWU3G3G5$B&Xq5^Jp1{_b2*bJ7!v#TS`hoe59CM4Kv}Wt?2$?*r&noB!|Ud%cu$4 z2*T1*Bg5$2C;Ug}2{o)A_iqA8Ns3L2i%+Z{`38Z+Cq*WtM@3trhE)j>*)*~Kk`|WM zFC~qRH+rK;{(1N@rYM@s|97F98b+kYCq(_bK=e|HOiqf4j}414#qnW-Z#hsA`WpqR zs*5;hD)Nm2$x;$3xydQC7Vwq>O*2I$#7C$=W3d|LOh;;_IoHf+-n3R&_xPl!<o;>S zopDlJn5#<|c3E&mbakokQs1?OOJmpiE@A0d2na(+QPDAPBP6^M5{(d5P;b;^Q3iPD zT!mptSeRdYWNLC+a*WBjTYOr2c!G1VDLpDaIjo^e!-ip4s!vSE2Di+xZXRJcrZXWe z%r6*D*T(f5wW!~yQ4`k|VR{kui%d;VGQ}rG|EEt$`;SwB`i0#JsnJQ1ng8{p`r+t< zm^77J|D;^?JXg9|DZm(0BERhVM#0)OS*4r*i|P`en21Q@yF4nU|HV`K|HV_@q)l6E zhksIFRym8)_5RZ&C%w%iOXY(TGwEIV|1{odS>pYM8H^JN|I?al$`aB4qUNUjpFAb{ z|Kuqd|0hq$@{l*IKYd|Js+#_WVbJ-PDvbZ4dZb00@V-DckNC%0O>g4;?Tnu{OnCyf zB&z23hGF0=T9vYY5=546F~(#a)PGS9;s2`EWr?ur$HUW2$#MAWjq<^&w;^TtCgZd$ zF*BKxuq8VF%|<OMLSpFn@9Kws{O#LGSBxq4gLq3r`X|**rOIUDTK`t^S=9g<W7D|% z?OTXxyp2d@-+$38KKNJ7!YX6w#NaooE?FwD%Gekaosz7Q|4&N%&jXFbre+KjQ|l#$ z(|GFbgbww^uWY`p&@imQX=`sQw8Z47@Razs6Pi`wnCRu_Hwx9N+C*Xp<=d$?CcH%$ zYbj4lWBJD&t(^`1uj*Zl2}h3Oz{!7?PfC-%<w-b9624Ky{=9iv&FjS`(8>O9Iee7z z+f%hvWg;+X^p@j@o{G8|OZ)v7b<xV`qfg_$QB19x8;xn-N*zizSr3o@RTHsNDO7t@ z5-qv*_U67|I^+8_>Jk4c-g1VMq92R?<So`ql_OTIi3Tc3iEk(7*@bUyfB&m&$u96j z-WmSiMV?kW-Y9g{G<czeJCL{1JY?NSNsqvK&A%}<R0Q>9n73lP%ILuas+X3Yl7e@= z-YEC7bOV^wd`neSpD=x+c&SV?nb<6SD|u#eeVd&{%-ih8U}R+CF#b2odaKOh36(dg z|5jnxtmXX|DxAMt|Mt7=essd{8`ZWftw3qO7!!_P%5F0DADg5Y30n95mVEukA?XH% z-Ri^J2{AGy(`YH0e-S31X7Wa*p{gRjyI?(f{1=hYvn-9@jQzK<LQnN3O)N_-i@{1d zPPepV_rL13p}BGXPHJ{G>)W%w)XJmLu0H>(sH^5?Wi7p}Zb*eqJ=<Hf@Sqv!JbqP| z{zdJCNgJR1HUiSCIn6Iyh4@d(Mm0VxW7EK1?|A=3^7L47q>RFFQQ`iRxMgWTR%IJy zHSBmhVOrHiv902b;;iyBE#~bu_E`D^=Nm;SOE$)sAi^guRA`pMetVh&Wo5kr{ZGos zDi6hOC|&#hcky(oAD?8|!|_IumHR;SxV}*smNAXq4*y9o*%UOr`2S}8jVc6_iC5hI zRk}>PSo9`AWRs?N`aFTEyZ<tS5+b8;(DB;}4Ncy9Ytlc7o62u#1-+%r!f_z@2-O>< z&niY#FA;{OVf(h`h<|xBU#BSSgU9xD?KuAB*Y--6K{MshWf{_C&|2rjK3VqHUb+lg z23!^4BfmCKy71i@2i;!*=`v`u;VQ!S&XX>K_A6Y@eD6K!GHAZJ=sS)SUZ8Xtv`uh{ zd$&oKK`WG7mlc&RgXXDZ9hGcpUhFC6@K#Eff!`6W#LvA28MzGFT4aduw?VoL+8Dfp ziC1nAmvPc%(4HyTOC<}$JCnuOUx;)Wv`^rw%+L5tx(wP$<?pQWcVEdKD_IKm!{aq1 zJl7;$25kvkRXDsA(q+(Y!sX5WZcCRzYl8O_Jy_O4x(r%pxI}mX(q+)1lq^ok=3(D0 zUh~0o7fP2wy8u^Je(n|NGHB)SZlE9gbCxcH76w;mmi3k{gEkN@UzX8ZhvYJ7Jy3zf zGkQsvL7T2*vz6?IlKrY=R0+hrxunaWg`$A)DiPuwCS3+?0$kNN&Yw${LHhx&p6u_a zbQv@{O*WKekEF|>6-GgJV_7ljGHCvA^<Y_$bQ!chaEa$8NtZzzrevd(Y!@;fuN)zM zd!@^u1)+k6v5bzCCYM2rgG=~JkS>E}R<dDARudV3ZS4rJu5=l+NVuwVdSj)_psj)H zJ@!Z64I-C8I|rAz_mXs>J}cQvCCfm<@Y)cbF;Kb;+6yIntz>NxVd2kRx)5h28>VEv z@ld?xgYcrH%b-nzs|Lq;mUJ1k_6SV)^OP=>uabo+*(i8|+Cq3^q|2Z^R<dVG<_k}F zMFIW-r3-Zu0wFU?mqFXEWV@8?k&^wUWYsI^_tus!e5xJqt-u4G(OtR>+9f5UH;n13 zL3^NNPn0Z&vwm-G=`v_eN>)P2Dk)htC2Or@?Jcq@8qS`fxU`oplm}cjIiH6~mqAOa zru$2kE`#=^lFd-EeM)vn$@1d80r8Cd(q+&(Dw(g6Wh&W+O150dRx8;lB|E2NU*H`9 z@r-HGWzhC0*?uKEu4Jc`?7EWOQnIH?_Pdhhsi{B1AYBIS9VIKHWYv|dwvshfvX)Bb ztz?~)tecX(t7I`s)<?<uDcJ`~HbTipE7|8tHdV>KR<gxPwob`5D%l<-+plEDmF%>V zU01SOO7>LAepj+QwN(B|7xGWZ$|zZNC9ADuO_i*rk_9SRh?0$Sfo;L{d6INNKfCI( zV$x;M8Yx*bCG$|S4oViRWZji4QpsYKEKSM!E7?#b8>wW|m29?>g*Adr!*T8{T?XxQ zxN315oGM)gtzZ+~pObVMG*=~SqGY~G7N}$)&0w|gGeV`ypnV2cZGOf?=`v_#o9q56 zN|!+!tz@4n*()W>(L&r|(5gyTeyygGHCD3bO6I9#9hEFZ$wHMZO3C7s%%o%)N;XW% zMk(2JC8IYPDdh(3Y-`w8oCg=B3wo%HF7uTx=ytfE_@EPaNf&I)wz@1(x(wPpxT><h zh0<lvTC~$;ZKMl!tdh-Bve5RrzcA@CXj9x_gK&7$rOTjw;i1c>NtZ#}t7He2tbnKP zuZVORv;toIsu<EyM7j)G2e|5RnRk{hgVr0ax-5&5E`wITgMM#A=`v_jm29SxZB(+Y zO159g4lCJdB|EQVx0LLzlKrk^e<+!uqaK$+(uKOFWHpuS7>vmpoPQ^!%b@jz2`OaB z(gizP$v#uEX-YOr$<`{_1|{=_5nGd=5hz^-t)0Iv^N=osmY`%Q7Fht=G~b&dU9hPG zby=Krp{{j7yA;omF4(}qx~!LU8MK8;wp7VVbwl~`z2&6Kpq1*bWYT5OTtZRi?60wO z8MNj-bXjZZLOPTzMahP}t7-N4-cizpI@D8_MM)Rzh%im7&;Eu<mq9z;OP8INE`!$Q zJzeG|T?XyEl3iA^*+$*pJn2FnMBtn$e#TPiGH6%es>k*DhIARUmvGf*nHDKr7+b+5 z?ma7A1}!~Gmt{(qK^v!Jlay>jtcG(rNk?p!E|goGE(??{gLV+EhV1W0=`v^=;&s_( z=|bD@qiK!U-*o9RXh+~`z;Qk<T^Rqu<-)Ri(q+(g_SNtGUb>*`l<cCCc_wOFV}3?Q z=|UbT*;yqEP0}=U97tQ3bfG_j%axxyRk{q?t7P3@juhcS9!MALXC*71s^O#c6kaLm zGH6}kYRKVrl`f32mA_lcpHrHCZwcu_eNi$uCG%6VE=tx*$-<Q^L&*jz**KG?p#wzx zCP|k;E1s^)N=cVNTME|+_P0{H3|jeqx~!6PArF)+P|421g)S4%xF}udYx|?zI1egH z7wi(a8ndjKbYXm+q2Jp=x(r&Tl6|OTUn$uFCA+O;_m%AI2Y6pq#6`Lc+TsDaY`Jt9 zwA)H{U&%rS>i$Bd%b-nEvM-cur;>fIWM`G^qLM`o(lk$wOPq8Wv`0$zo01jyNcUGn zx-fQz3mq2nbd+=%v~6%T;r!bvT?XxExSF!;lyn)i@67tWyQK>{cCaq%C0!VED%mV0 z+oxoQl<caK-Bhvy!*Es}$FGQVVeU)G1}fPzxH_=Em(qnYACCH$gVNSQy3lvS)tqIW zr3+)f5&FF)q|2afR<i9%c3sJCDOshF`n}bp3v+l%mZ4;`m294pom8^3N_PKayj#ub zcr0B8t<GpoYr%1DAYBISBe<YMkhY=HWzdenCGI^bU8o02_M4J9e4_iyD_xjdQZi>H z%QZ&ReE1oT(uIB+u9h4Z59u;!xyCAg(uMGp%vs6K!qthxyC_`-t@Nij<AK8~FI|}T z`Aqj0Bwc8$O7@|WZBVk!O14+Y4l3D6B|EERH<j$Rl4;}g=jM_w%=L}eG=GlsZRvu| zIzg8$lrH4KL`@42c_m$#SAnZFr_EEkFeeC?2g?Ga3v+mIxwEXdbirnT%Z+6z(uFw` zxZ1PKEM1r@g{vLQ#z`0E_26pDvf0uFy$e?xmaUX7=;uj#oJ&a;=5yc*<a9ifF5Ej= zm#vg8gBJ3+rUkLTQ0YRMf1%5qr3>+cE13O_lP=6>Ptj%Vr3-0OGP9C-eyM3^`QDDw zg}5l$N+l~dRnyL~KWFJe8&t9kB|8Y$dG`0CbRiF>>9SJNWzZ(Ub%Fg&kuHOF6fRHB zzZ230`wFgLmR*)E%x%II#Ii@yWze+gn%0G7xugp^2d+Stm5?rjRvE4UmQ|N7^ks1Q zv#gnPVZI$MKbCcrE`!z;E?<`QkS>E316OC3^^q=v)*r4;EE^zQ25l5vJ}es}U6_}G zt0T*1NEiAyxH_<GxpWz{jc|FhY^!t`wEb{-vFxyP8MNFp^*qfdU9j7gEKbReDcMOS zGtI@hEnFTM(uH~eR|r32rF0pzufNj$EtW2fLzQfolI@*`^N%>ZgVJTta?aPZt{h$- z=`v`4z$N_U{93p$4v?<=S~(?iUV!trIJ~OTh36{SE+xCIWcQV9(n3wU%=b=_F4Wyc zx-3JwV0$mdnWF4ZTOwQr%^R+69Oq8bh52!~y0a`vx(wRPrTV>drOTilP_iGCtjRLn zUkm9nXp@!fOC{T;WIL7Yu97`evR2FW@Y+e2L3>ZhB9tsi$x@YUkdh5ivMEY7UCC;$ z)-())&=1y?E`xSe$!;py+BG<{iT!PmE{sXm>at1Fg)!YXI9rGPHI^=nkCbewk~yx^ zw5#l|fONrTg{ueWeV}w9y>NxHEJC_4XS80^-sgKKN|!-91eXZ!C+UK%vO$-1mM(+V zPsu(|viVB3NXdRwvSUh?>sviMN9jU8vqjUc{Xh2J2foguy7PXnEIBudovS1!h!Dyp zC?FC;MPfi9|E`088)|||y`ZHA%ZU>d>?Epv6-4W#QY3?fENZ}|rkia|3Dhl6+>(tQ zzu81?Q><ju)}d)JEN|CP`qmevt@*PrW*hMP{hj%9pZiCSlQ`b?^X~mvetvW2%*>fH zGiUxj^O!7y9<?UD4+h#wkEr(#aVMeio$nEKGSZS6=i8b*4EjgooAszQ8QYg6w;Amt z9?^$_9N$ilT9ajenk0vfuiGQ!1HC7s@*VVubU{pvpe29iP-}8M$c4ShBl@05+Zt&r z{ya&(XJLCiVyqWwGm*CRtL|>-Gm<Wks8^A8IMO!lPm(7sz7daz546f;p7E$Pc^vf1 zM*AC&n7_@2u>ZlM*5n@}Z7$Nze<bkbJwh*!a@UrnJLnO5iL~UuIbZld8y%lVtx57& zpf!6$pB!n0NP7xYvarctIK&*=qcf7bBQ5z$?w>ZkW{;RVN7|uCyZf*B*thZR@QC(y zAkdb1M0*2$(D=USQET#<#{=zi9<?Ta8EIdOw8GZ{Uynzv$<2{=OQh|Jw0k3M_=zO> zCrfveN31h|-fQLdfJdyi|4raK&m(L}q-~3|!M{zCVT-TiQET$XuLs&y9?@nZZ8p;G zImq3?7Ivpct;r$K`%ISadc^)9XtmLfdDNQx`8Pt?M?7NA^vyuq<WXzV`K=`RRZC;3 zN7UU&n~Ah#46c67__{q}t`TVmBW>;9ac{2i4S0mE7)UwVc^<VU*F@S|B5gd<CL(Ry zp(Obii*LI}^jn~Q%kN)#)S4{+cHn!nN6e=q?YAOrZ=^jKY5yE)KZvyacS3v}9?_rw zJ$I;@EDw9sntTs~?P&k(QET$<e+aZ+_K30a{}X6^9x=v@wCxpIIZ2LK8rwZ$tq-&& zBU|@Pj~Elq1->_U#2g~h`XjAGW&Xa!H|$Ys@<J5qXfO7tHMuI%u8FkqNSlbXzmBx8 zN16n7@ilwIe!!2C<PJ-Bg-5N)fk=BI(t7`AlH6&0D?MsW{yEZq5NYTCzkx6B5%vZ2 z>lXHqN3F@=j{~jb5%V|Di19t?5pDHopl$PrdLL;skv9I5BpJ1^6CN>7`CoxH;t}iU z|C%Is8DFPIj0K(wv|f)G@BTDN#*A;kBhCRt+EbA>__HJ#H@=cb*vVsow#*~W=S12= zk@llVI~r*nNyf+5=@I(NWRlI6#vzYdlOs)m_9Krdw*{Hx!^Zc7N9>6-XOio!PPTc( zx_3+9yTT*-iiMfvBNp~<k6M$Zrv+M<M~nqP6UMjGqt@i@*+Bb6kI;RjjYL|{>6v8G z!WKPZ-rX8#JszQF&_|8$DUZm<qCji&i22~+jD0(Tbykn)k0R}hk(NI*lWej0Iy~Ym zQ>5*Qv@3F%WZL)&9$_~k?VlrUO<Ul*(Idt$k+wC`?mjD%{J`Sd;SshNwARYwphvCA zKY(s9TG=D|nX^OKS&vwsJSSs!@12nx@u)R<(+dLatsb#X7-<ucw&aDG<YOjFyGP6= zBW+8h9RmG^@qO1L%CbGsMm%Et_o9rJV6b)F9<fgsX^%x(;k-=papUXp2pvS)!AM*6 z;!N@h<LmdRHEBIR(9ZOTyhYkXq-}Xg#=cF$88nZu**_O(+dU#59Kyp;A@hhw*phsp z&3MGvEYfuFO(B@)U64sWX<>&w!d^w%laW?<c_!Ird_5k~ek1Krq;2cSB)@5V+dZO> zzcA32dc<BT=u^gbk4LRZ{uP1N;Suc@gmEQrcYB0we`TPp@QD2n&~F*vw>)Cp*%@eq z9-#x!cH`5wyijZMC6CTX{y5V9Dbl_lX>YkGgngSwt;v@o?JJS?!$|vaq^)AJ)}`C; z5jH2%c1GG4U!6%lZSw8%s5QyICeS)OqK<=p+xWJ4MBXAz+fDMt-h)^KLVp7uQBNc7 zV5IeQWfD3k_=+B}_7G`JuXVoc4|>FTu1M=*1Becbu**DR4Jy)p7-?6qN#ghl9<gT0 zCJ7xIVY42!Cig|!-bibHUF7qKJvq?b7WRNg?6t8$;AnsA5%wk0jzrqsZ^$J7*~0Gd zh&ITgyrWHcL|<`PCixxX>+%Sj{l-9R^9Z{J`d#Cj^{6%ZBNmk%?N2=7eC!p0w#Xyu zE{KjC9em3p#!^=XTE9o+14QQz-w}@(6SBzaXb*b?U!)z0w0l{gWe`BvJsx4(3xT%P zBkbSuOtQoHx;<)5UUf~Nz1kz@;%^GH^F3lr^X5##0D?5OdBnKnErHhQ5jG6;8ROgT z5%c}G2HHxGI2Rdd>m%(b==Ut_Qy!6SG0?Vogr2X>B%d|DMIN;#yCd!YinIff_C%x= z-j+%3v9LWJQJ*92hmn^3g}}GSBjz|D22AK+lSkx@MNvmv=@IMWk+vh!*1tWIFkm9= zphwJ!uM4z-N2~#W66;qFdqn+vN1)Amgl+H5Bn+&GZ`dQ&;eIjDe$ON3myz~Bh4#)& z(qv&D@QD4lUkbEuctqV;8ECKes5N<4q`fE7J{oBsi?o?YdpOdLyf>39uylXq5%aD0 z1=?SEMEzSGXy<#x+!VxMko<nvBj!E*f!5~{b_3L6d<Q&2&uap$;1Odf&_d(e;}PY1 zL!fQ)h;bbQpVN%*DUaCOzA=;V4_TIbgsyJN;1=!G9-%9c3;Q0AT9eU8+Z<`TBJJKt z+cA(yvX;g@9x>(u!9W^ik6M%W-keE(-qKy;5$7X7F6@Uqq8&xrwn*#zKqfie;#=ww zeE{hFMqBGqYw{}~5+vOrkJukv7s8Ht#F}}e?TWN=r2SK*wXY9h&-aM(y(N>hS{mQ= zh<b2qCP7%zJ>Mhr3_=L$*(3Uy+d|l^N6cp;ZCRw{2Pq>9+u;%W$shzHzV~{>`Hjf; zFOjeLS3=mVN3=^&&ce=m#5(_mOhTrJZ=px6$?t(2-{(D|o<`b%NNX--k~RyQ^@#F_ zw6&482XvP4J>U`jIS9p(ZqtxMln2Q1?ed6u;|DXz*~ZuF5$EbbD3h?C@~Ab*4+p*u zkC^v-D3hFHd_5j9Rso?T!fx@1wGq(mM*A&~7!QFE0=}IdwI=@sgxJvT_lWbrpp8a* z)T7qq>mZZ_-+%XraV!X>LwnMr*5oH3goXA~k9eQtS2GC}0NU9ewI&yW$SAZ|dBm9d z*FxTAJYv2YX+Mgz*KP`Yuk)xixiQjij<km&?aw0ZNTmHJ(t1ZS$r6)grAM4+03jIi z{jNv!d3OcAMIJF$j<gk#wms7Bj<l`gndAi)-!_k0lW&5^6lwgON1Px3aNyhE5p^ii zc17Bg6Pe^(3wy*P){G`I37I0kH+aN8BIpjI6+Pli$45ihKli9LX`2ePB_6TXvL%ze z(888HYEAA3eZ*-0)g$I_pgWEBm`CiTf<A7vuX{wl3fgM4!ydIJ{}c2ZM*E3Jt;xb^ z=A1@r^@ues5dX;Ai#=lA10oQ#r5<sv6hsD~UFlJ4@-`3|g?61st;sKgPzbcu9x<N* zp-gCl9<?TSfKWQLQIA@akAXHD?GqlgCcg`!5aIi*N3F>&(3sKg^$6XAs1)%1xkrqt zL8C_dTaP%K2cqJ^_m3X2Zx8x)qaF2#Jy#U<38S6v5$my_Pa5q!k9gMuCA+d*<q_lY zNSlbXe~GjoMp~9ab72>G#F`O>+iqz*;Su}Y2=XbTy}%>pZwTV}zTy%2h_s`T_6NV6 z;cMQ?@0UDkO@8%vGRb8|yVE1uCFqSt`(2N)8=%XLHscZR<AAO(+P6KzK7+0_TGQ`3 z)SA2$bd}Lw?h$LvpsS7cW{-Fe2vjiI`#ow+HiMQMZPKIG<o7|>80`xl@qQHO7mfDU z9#QW>D~<LOk2vSHBa{3GqrKE4&NqSHW3<aWqMrt>HrjVRYE2e=CX@6V?KF>ClZ!yt z8|^h7wI<hsZZO*0J;HW^)*J0+k0`g#W|9XMs64*n5&M^*&l%t29?|dPzA1UZ3+`HY z+qpme+ZVri+xbUc)bY`)-y`}n|ICA~w^%j&`em!^v&Hcn3$GbmdwueQ?>F<3S{o6! zHG`V7{HeycUwZ)dq!K1gRg^}KX5Q3X)YQ!1LjHu=H%tARIgJ_8JB#$rBE3aTZTy`L zeF=Z<{GHEVK3Uw<!QU(R>*Vhuc$V__8gLhXm+-eN6|;k#b(H6qaI({TIt}-p<m{+U z9q)It^SAJLiQ#v$)61UX^r~xned2|B(sQCzT5IEIPIh{W8z&Q~Cp*0}W6X`g$*wQQ z_%%wYnYYi+qOr)f>DSDgq-h(ss7ZG0O#YlLThz1!d@g_O{E7E`{(de-t@swv*cV}U z7hwm(&uC3e_@!)U$|i>}f&ZC2|8CQ<FO$8m^Y`u$u9;JsigR%)&BfU5#n|n|<Y_T^ zT1=i6W1kn3r^V!HF?m`{o)(j*#pEfQ$@BLz{x0B;FTQ6w_`8t5SMc{r{yO=46*he- ze_i}7<F6aq75rVv-&OowjT{C3uHmnTc;CWbk-xX$UcujWCbIgMw&q^`)YGdRBxfIg z?}29(fA8b3-~9An*K04iblK}(|Ay|%mS6Lxo;SaxnGlPbuIF#9@iZrSE7!9qhmdde zfo;69o$il9gz5e(^l!Cg-_A!q+p`@>`@*HHLtMh&rQ~lJf3FMC{GaFlPc+cXTY4Jr zET%m#W=y0yrZLfpwyniYdH64g+S2$yHtL3(ZygdbV2#f7yY-e0YZzkM@A_Llv{6`n zlK6$i7qH^mc=HF0M}GPI_3zhH7VdTLzxjIM7XG-J_=CdgyVnfd_5mL7XzbR^pR--f zywMfLbs9&8HlcPDY+-tA*VZh(oNVhY$*O<4@>3MM7m26c-?#ck-4k@9&UXoYNDTgW zkY`(P@Vu8l=_&li0n$(S^#RiSf&TCHna-Q?5cFo3TCQGy<E=FrTZ=m#MkDgHyN3Ow zJJV&O$b-Bgq30@3XjdV=5WiiTwEEVeTUOu1_2wIsn{HpTp@DjA|2eIXl|+<wchtB; zI{#LlYWL}1$iMFI<U3}GyRug;$^F!R&JPZr+xbhkkLOw*si>b9IA4B4Vm*L#`33rk zK5OffYgf84%f)cx^=nJ3D^5E{nojRj>#w$bt-bLET>zQfdgBNAh}59nz?8P){bZwf zqRKc4e6{k0`e}M4{#yOs11+sj*>Bf_Iblw<eqE|3{(o)#v>W<X(-LpnuvW21{->K` zA1}4q`g#4DjW@1#iQN9$R5~G!Za`XpfqtUT+VsfBtv7DKp5AtAY4r{3ZysEI{cXcU zb~E=DuU>oO`jTF!P5q97)AnVy#yx>M&)>h*Uu}8T=5qkSPo{ov<vXye2iI^>qSMGt zrPUj5yA6}W6~r<@N-wQXm2cYZLOp-~&)1$qiXDJ-`wjFHeb&~ur?VI1HR<)?PM62O zH+xZ)U*FLLTPYpZ*0-LT{6AOyD~;##SKFRKe%Ic1!)opm<TGn7b-5YMzQ3dl^OJjH zY0ZX`H+DC#t<d?(P7Rg!Hg44yg3>*;<JX>NvxD~kkN7`br=O^C--|oVzpcjIQ{%?@ ze}2c&KyBZ5!@!yi8mHL2k8tjm-AV*UDX(;U-i23J%1EfapGx~zk?h1!ZGEpD?<^yl zbp1N9SSws9RT%O4jz6^5HKcYuf3@wQ1TCGPjv6=4e^bBO@_D~L^OTaX6P&JpDX$ZP zwdGSAzxwZ!8Gk6BAl!4+f35t_cl@PW27~DKRQu2x*R%c2C%;w(Zn%v>Im6ZPyyceF ztP=2^-OaZqYX%2xyfwISwbh7?L)YK5=9Zh+f5<tLfi)WkB$Ligr0q{1?sR!}*SNn+ zm~{JixW>H`cRKt;jeBhk|8un;ME8Gw{~I-MdQIBtx+kyN^6r7wTodN`bf(8fN{0`% z-?o--n1nPp-1z>R`3gi_qOI+ZJ7G+>j}Y$pde+ISk86;a)&rI1Z9}EOp;Bcfa2f40 ztxvVLrDF8ITKxz5zm;cg|5a<BS0ZRSf6r8I)Km34)$#X``pJ|(J*QB{o~!+QI{ln% z`Fnq<dVq4W#}79Q+`NA6YB!2hPuys|qg{&gzar0UaGZi?ZTn_kSe2^m&C{K^s0vWy zs4Y)7=d7f1%gt+7%cVJ|p4)5E8>n%se4dLuHR7Fg=X~}ftU2_NV%mOp;C?Rc@tJ0z zw!CZY&&h6Irz(DZKBLkLRkTuTum5-JTQ(s5d#>%hwtXr7wQEXiLK<p6+2G*$T+>TM zbwaSVzOA{QuZ5+?J8Ragy?xECH^eF8II*U~tgUgMP@>O)DV?^W$@6y$e;K>IbiE<z zaGfD(_q~P=^1sGK8M|GkWatS0>(D~RZg|%^KCw_>w;L*gTnNo^hK<$_($J6hP(dFw zv;*|3hW3Dd&Co394nqe(cN)qf`X)ndpkFuC336$4gGP;30NrIs-v${mGy)nkv>oI^ z>;!E#+Ah$C4IKulgfiR#kk~u>yrG22b0OM6ddEJK<Ut=b)CZa{)DN06Gz{8eXab}+ z!#UFr(!1Z8WEP}1;WOMRkl1_P=oF+kxp_Ag^hrZ9o7)U^gFa!X0QyZseIUJS%!y`@ z-eTt6C(x%24T65#&@kw3LnEO7Y-j@XJBGG`e%H`;&<;a8LE8=O0{tgLv!KryIsp1T zLkB^hHFOAckD(c+-a6MsE<x`wbO6+A=pg8wh7N&#$<Xj=?k-MF@`KhGZ35J7Xe&s= zaOw+4=fip96ZC#VJ3%_*ok{d<71h;DvIiuam`P?pHyfG-U2o_BNXK0=$w5%Rp(CK2 zp`)Oe7?MfR**;1i^io4@AlE9|L1!5)4?5dWC#Yzs3v`a5ZqO1#1<(r(6+!KWdO_zJ z>I0o;s2}uZLj#}}8yW<?$j~rId-3QBbfKXM(CZCt1--%0cF<c5?EtkI+6lVW&@Rx+ z4DA73U}y&PaznGA4nqe(U4{;VUSa4E=(UCpgI;Oq2<Q?+M?sy25~iuIGL!{fWT*{v zv7vU*QbT#rs||I6USp^W^fp7?puC|1=-q~jpi2$)f|eQT1L-6lt*n(BLJe&Pz0uGP zkluXABs)P@7}^E8($F5zRfc9jR~woI6$~8!EjQGD2K7FpSUN$x0s!g;?J!gX@rnYp zb_Q=8{09|5Uoq4N`V&L5pnDA+2F)1i<OuFQLj#~k3=M;119{g5wBPZanIw-I>I2Cx z(&9mXWoQ`mmxkJ@%#R!D1|4+1pl=x33Hm!jdqDrUp-!sE|1eYpea}!IsBCB!G-v22 z==+AURR1G}+Cl$fXb<QIh7N*`I$s*cPYe}7KQ%M~`kA3wP;-;=aS*h?&|wfqSCw-b zQH!CSAf0K&PJ$L2YNuhHZKxA;mZ9ySa}4bPwHrDLdXeLM0WH~3H|XaK6+tgCbQqL3 z)J~(k$dJBu^D0B#AoVp!3cA=(9}W8Th6X^dGc*iZW@rL*siEzlOAPG<z1Gk{Ou!oq zWog=PHq;L4G1Liqlc8DATMQirz1{g@Dy}nB1oau30R2ZpJ3*@r?E$^d&@AY^h6XSx z{f6`nn-4f&&^kkhLAM#|#LNsDDuVQ7Ey@FQhoPOIQA3A8cNxlJI42AhL6eRT^eIDo zK)-2d7PQUKLC_}+9R_{E&{5FG4P`OETMe~?e#1~F=wpTsW0HT%@#X2&93SXzLldCi zF|-HtSwpj+-!s(xGI}dR1E4P&8U}sA&;;lY4Rv0SBwsRA1pSGj3D8#z?F8*MbQrY9 zP!<#VprIn@AwvV8{f2geW)01Px)w;M94by;Yp4_SE<*#LcN^LcT5o74Xq};U%>FHg zx<MsF!yp|7#lnH^G_(hFhoM=}CPM=l@n1JI0orV6J80Zc7IXe#L!F>$Lj$0X8JYln z!q6<}lZK9hwj0V~_J7OJFzC~Uwu3%r=pg9xhK_>%*iiOWNwUk(Fz8PV?F8*Mv<Gyb zq0WoYuA#}59c{(Q6&=}k7ssCL{c2A~A=%TM(Ce<7d1-M9GszI|icIsSYjO|vbPP<b z=or{n&gLF`WNIbodu_P~zt%H_$MSuL+uxjfaAvZnqm$V3JyVYsVd*bUTNH;C&!sb) zXNG>S2z!5VYUC)CBJ5p8$n75akqGN%+KMF7Ra`JzoZ2V<?zuC?(N!G7EAV$0FN3u4 zI`ffGmt}{pHpkfTqNMcm4YRPQPMCuhWNxjpotfL7yN~DQnbJik8hozvL^&^=DULnd zyZX-_tNpEzwpNg@_NtQTLU~1LqF}01#`DFoO&$59)U9V<Qp!pAKJnzIu3a>ll`}up z%X39XuZ1E|C%m0WscG(Ib1z*n-J)XH`zijr|6}}TOpArYN$^gD?5Y;B7{z+myNjbw zc4jD~=}jHI_rIQCdz70WexW$E1^wYMWeF57eYiL|-qB{1@ea*cic^Iy(Y6!l(wUn; z_bPaOMQhr$q&T(B#a3H&4k#VP7BaWCIK8c7oQP^Y`o<nGdNOp;ifJinntrI3ZQNJ_ zXQ`$9_`-QaIw!Zgr(@OBfx7zhc*7jDQFbI*Q}Le|rPSWBa^*Wp?^!YJ@~@nlcBWT! z^tnvc2=(fQ2{fq4<s}F|casSk)SKJwlA+bT{Y2vlb%eKLllw8NPS<0zO%$0lUH&3P zT$~!W63Xq~V&!<#<b*X|Pp1C$O->v!g$G90x~I3e;-b!X7WY$K;YoU?X5W12%w9%8 zR*tG7ri)msCP!r}QU%qC4Aj=OV>62=l&VTmt-qm8QwT=o_<R)p6V$~MRnp1ktF#D* zc97jUD&2U8&`rmz!3YLYZug3gRhRF}O|Qg;*DBy3jJ33HHJ}}8K>M!IT$`OLWG@@< z5ZCRk<=c3JqWqY(WbeDhykNR`A8ZPk`>?J%8GWEb5)7Aa87Q4qaonEU{68R5MZ`*N zdWwfCk{SR-cu1a#Z0yie_=>5KnsZyG@yR_nZix_1Y55*$n{)V1$#H~!sfReTq|`$Y zrQAamEXX0v$k8o_QkA1ijziwjDcjpK^+?aupCYazska2V&F?@#b1mh!{tP|cL&(O$ zkKps{gkR)^f2Q&(TqAi`A@5hmJJhngMOG7bwNA*_IziPs_jJwu@_lz)8fdP=4(5MS z(P7k7D3>kC47K_cGILFHpU>UrlB0ud)IT?EYGl@a{1j?k-$<E_*d^7yq}@O&brlk; zIDJK?IQ4`3Wo~|WPYB?1tFYy9lAPDVr8=Mx7W4YH6BRI+SIyKKnb*1A6OHLa`KYqv z<Z9|@aq2PO4VrbG+AkYnee|V|IeR<$a3^A|eqYrf#l|N+G=b{zNx_Xl)>u~;2OMsE zhF4cI)DiOfHoB4e;YPl!VTg^tX!gX=zhHK1AL;aa+9GiG+&OafGF;rDOcb&rYWy>p zlwKsS!LjaS$VNhg#L+#Oy>w=-$1|K^3{x81bf=?{l$||dUqK85WPvp4kz5a~K@@+C zgbLLoAvbcXjE6K}&M)7ycFm0g8tRe+hQn!c?BRR}Tg~4kISR!Vt(UHtnpOJ6y@P9R zxj}&o=6P)E4m=StPc|9uHO*b=18L&6Vrs@*Q(F~<LKUOfj^C6~*gqnF{d{I>hIMfm z+E~6pDuSu$&6hsng&baU%ltyNl>dMb;_QrLt$NW~%42Xb6qdGcnq0oH0x7pZZLPpX z6?kR^wpHNS6}Y4V&#l1r3Oug@&#%CrlR7&`yEV_tZP|swo<0}<6)p>w+g(^PcC>KE znR^OGa@k@8OO*JvUHPxa=sn-ppsgm2%-0F?DcYc}wg#aVY<gjkp}F4p5B<e)>O{Ie zj6OM|Y%$#Ly1xUI8txyk{JK8Y4eqJQ#r@+Q6L{z+ywyQO9q+IJEm}9zJYYl|P~Fq@ z;>F2g=ZfhS9cx$MAyd8g##`3hDk~Kd(=#@YWmNZN2_v^VS`?RyBeaEH#bJ?GM*fO2 z_{YEn3+#B;6`B`OGkd3dG7D*cCA73wZf}@|aSt=?EZyFf9^3~r_wfaoxsQi577G!{ zvhv?GSF)Phos1pL<Th(r3zJc*72An5^vdG&%8q4Kp1IvKa*rt1<?SKscctQ<DzqbP zX}V{$Nx~PWN!*%n9B2oH_e>SrD<kgEOjRr@FpGPrGcXhFzC%rJ_}ox~KO^5_R@gAb zD>7K$jyoy6G8IqgmE{xW_v0OVaLp}JbrI4}L4+0C4xV!~C^vO<YXBZYlW&pHr((>F z>3@~Gp3w?b*9(;D%G&igR<zQqf-G3x9N?s&i%2@Xtk}Ha{6L@#0~;YOr%v3ySmwk< za?>QE3opX{LY8Qg@>LAALb~E}nkwe2n@CDfDq8Q@%)$mrFHRq?RGU?*?aDn;yM94B zRFib2`idZiRdt&>9mKP)RcN7BtO}_Zc3PZ4bInk8L7~VrVA5}{4Q|nn&3aF2fZR+9 zmeb}{EEdUen`6`5{Yq7gSkEj2tERc%4<gr;n3xtUUnG4BP71o9uEZ8?cu62AuE0kS zE3%gIFQiJvwacM3sSwRqCL`=nvcePvYJRmyiit;Z`SSLS7uWgHJ=+qN<0(#Eo6qfT z&XALq@;8|p1peawLK|^tIwTbyn?Y+faP_HC(c6RK%b!ue=~(cvOb|wGn`wy~k}KX3 zh&@w<=6PyBV3GVTe6g*{VEZV1jFUxc4Y7JC_yHyBv!C02Z8P)!12X80_$|gttxI(T zw(9pS@ocr=v1X<^2**RUU)E@xI{NSoA;W+wj$9gz$GYNp<&vNOrFW<q6x0zGVz1!` zRW0Q=S{1j!SXK~ic0PU2uYDEkS@#!uktyJn!j&;aUj@FW0#{Yw`zo-%0<YhrOI1R@ zzSj5P)?;khLIO`O-i=loHuxY|)29FU^g%AE3evLa6;B@oAsbC^<DlcA!dn^*I*vC^ zd5B`FUtar*;|1AWSn<q*T=&d_6dDDgPHBeFU{IYNKaD*}wlsZd(XLN=Jl(gqwDGn< z6*Y4kIBM(X=}MrSG0RDD#@;Nh6UOO*<NP{BV)bRT8?%^{-WnXeO-bpE!I9v2b#!q1 zW<CsFu54lO^4mmmn7?GPP<f318Ww=f$vUUn(xV`2!Ht$f7i@aHrD*H&XBOQOv{cbW zr=N0Z3RN|(vKaq})=@nXtJZIrPqk?fq9z>M|H>6_Lbda?|E9U~=C9}T7cM5JvR9&P z^)oYdX02eG6M0AU<6M;-OsuL8w<WppZ79^aryRFQ--*el&uEvhjki7M2~d|p`fU%3 z6+&;D0_CmD<lPmz71P}}=N|N_)$+0S>bf7t=eWj(^EEQ&m2Sa&83nq2O$uEw>$hf# zZfm9xwq}gCsI8g8Mw1bO+mEQoSRm~ziojgbE2d=3SLa1C<|}+A#r^{0U9ZFa1r2m6 zMwek1n)Y#1XBzFbsK=<TKmBfU!>NJF<Yq<3pyC=%O>5XfP-4Dv4euS?xaR#5*BA$5 z<BhWlE${4=tYR9r@<El+Tc-jlJ{HkUlcTiT6!j(otV}bp*1;y3m}J?zT(>buxF$%U z9q(2<mU=DCvDvJWE#F3Zja#yo$5%EmaF3fuae9U35X@@h9KtWwhrESBCJJ&R%$Hg~ zKVxW=_rFItt#V`Z<`#>&*Vf*6nnNqwE48xy;VSKk+$$5&chh9^M=NSc(|bPJ)G(9F zEMkS}1C2IS!sK=@`e<(V%8p)g)x&OM?Uv21@-N#U5!GAp;^c&mtw|YHA5={!6eMOO zq++NDX0poZH57tat^W?;8jf_v9`3Il=2X{LtvB5`aQ$)Co3wnLxAnSo$k8WR-msZ` z{(gFhN@e#;fDG>1tx^VSmQ~yDMrs?{;H{-W2B~^zDA=VZZhKZjAMpJgCSemh$wM1c zJy*BYNoP}>??q{ihbpWg*8Lp(303%v^62R<O(&r&5aUi8hy|(5%%2WfOJ@=<of$GR zuzXi0CCNaPgmMkcYR!`q2Z_MS$YvrI&Dfqp5R;+HQZZEWGR&MS<>4B;2FVt7a#Ues zB4c|FTU1x4LWHQ?06ra?n?pERD-kM&RD?$?!mdbh{ZTra+1eNsB(#)sD|`G67vQxZ zvvS4sct_p}ew){<t2P!f>g}L7JCc%yA|2(wJ}o7mTenq3X(N2YM9=S`2&!VQZHBYV zCB=~3akgju@j+sI63X0}p5ooOM7~f1X#~?cgbR5VA{LW7TM@Cy994@|@T!caMh+2z zKC8ItlEA(x4vch&=zg|VLv37G{-HKnv$TvN)TDTWMdgcoYEmkhS~98%pd2^U&>s_n z=0jqLH3h+#rR*YjtwQfI_E1enwkuV#JE13Ys2QI63C}vHz0w8>JA!XoVREAcJ@y@K zBgzLrE2g(}XrQ7Qy9C_3Va@F~Rit!cxE^owOm6efU?nw$SdzO-QEBa}qdNcN9ruV$ zl_a<Mv4%XXZy~_W3ft#^dsVlqqY9NRw|Tr_JlgyIVu)qvhI(Pduq!fL)0pAj$ndhp z40{4Y=_=H&-025Y4)k*yxst>oCFzjjc1V%1LFz)Y`n>tSK+vv|$#--~ZnL~ZP&{bc zMv%dM<<G9h^EXC4iz3s0yjZ6fO*iwnd|&Cs;;!*hZN7Zp&@aeK!d!XmP7W|#A*T`! zk>tL-k4mikEMQ|sR2R=S3zYlvqYL(3K5hknJInOp%)#7CEA6TsA;xAIn7P(5IVwVp z_aW9sa^tU|phLbGJFJ+dm>HE2aDwy?^Ji6lhNrJZPf;~bAjE7XgbsOD)g_<1>7MKn z>cjy!sq%V^&14}w0g|vYdg4CBlL9tjfVSc#hppWR1aVl8lyl>|mfx>ZP(wPzlLqgi ztg#G1?}#IRDLa+ALNdH=4id~w2L9@DlH9CYYiaHv@M#5A!3RNygXE~5k&pzQ#T$VY zRh7<Un^N4x?Y1Aa&G^MQLjYx-+REA;gF#pO@KIDgZ-V9bGqNHfF&~>zP}$<i(WR(N zp;Gb<*+~cyQoFQ8q?>`HkP|#D(X=_VPW&5Un{C7<qJECe2KL_G-SnaLjO~L#ueNuk z_oX>6dCObgG%x3}G-v)eoI~t)h1QeGxoq*BuMLKL(@Vne=<76<st#%H#<>PD>^syJ zMDt6dHXiZ$nwmUB^g1%;`@k*MU$Ev!^IDmdIC1Aa==~?N>eq{PD|5xE{l(FT6N)W8 zW}R>RX)|=&N!mlwshy;}jhmUbP?+xEn8w(g$a{zW>(zh1XbrK`7)Qbovkwt<+>;uw z$9^W`iepY)d_Rqn|KaGyi@v@8jvLfd_lL#V0_4#vGB*vr|K_37lvZZ0(1>AUVCc<Y z*&4(!eEr6ohgu|KX70lc$2V+VZ0j)DYsWPQ8uB+d1)<UixtE&8hI^BtckT@}RbH<C z)9NnY8!B5BxnpmrtySd37zz#P^_x4xJLIO~8NH+<97~~O=CU3oI>;f?1VbNR%T<Vb z-?ZWyYY$FTCvq4m3@N29#S>DJLqEkPOl)sU$F{QPX=2km<1sclLTtjs_6zCQknPQC z5cA5`osLb85SuWutw_gq!)@!CgB>TfE7Gya5n>Z2wzsEa8@~DajmM3xkd94`5SuWu zT}S=97DZAEIb5UKc%8Y58lim&9!*sHieq~wEZ{hwxoA8VZ&3Fd)X@cv_O4aST~iKf zA<1J~l_E`XS%YYra$9ut6pOPgvFg!-Sp0JpQ4am6hz3h%#nr-bJ2N&{AXCdO)ME6N zif1Uz&`apKTq=YJYDV_NWE9OEj$bZTO4fwbALKS)N9WW);)WS_A-=>OO(iFN#LhpL z6FKxFCkCxatrCYdDIseF0u<)8D#vRn$HfBIX?P@`2I4fFur=UoD0buW>g_tw!s=HB zkld_>9Qu((gH?q!fah@wYfud7!V*D+WlsuAF-Tr})>zSJQ&_t~VR3rky%$RR*dA=> z=>ostn^4h2kiB5p?QA3%JKDC1>9VtHo_1wYpqsuRbj}}zyMFoYe|4O);?wHN3AMFh zGQ>Yud~)bV@foZtz7af+TYM8@NEe?7(vv+YKE<Hov*$@Fz6RC&`DhM>6V>Nd^2k4@ zPdW5Mp9ZV+xgF2r>T`z}()tuZ`m`tdR1DImJ^y{_v;Rc(xsyEd&*@VR{m`euDt+$4 z^SJulBZjm-MUX!2i9QvB^l8t3U;6AjQGL#kNB%i|%Ap_nG+3q2Sv-%c&jVse>r({j z)1K&4F-V{GJW2XgUr%0peCL?k{K4!zM)jPqwpx?&P~4qNt$8-=8nt+e`1PZi-tH4s z_d!&^Kc{Xv^h4bStJHl6&*Q55uo%+n7D4K^C+b!VlGmO!nSM6C<L5)~nA@xuSsPl~ z=TXU9H9tI2Js&|p{y9C%p&xoSSf%Hqcpg{JY>rp!Sp@0Xp6FRINYC~>33~o4dafD5 zt_uT+of=4dlDycUbg__BB5~XdW<(1<HW4hbzg|t9D)bho<k`j{Y1L&nB4?}cJ!FB2 z@-o6E<wyCiI{n<{`xL8>ZgkHPTsIDFC=I=#VI^oVTVU!@j48~;?EIOs^BctGvLke| zvtxsA#&grWZQD@V=U!!(vx)Q^?ShUPsg~NPSq}ZEuLi5?Yn!U$@uoQKVo2Ks5ma{e zq`oQ!$!pJ(P+wDaVIz4s)k=Owb|FvRqn_pPdNx?4=T1D2tLH8;r1dO<^lVS`tQe$c zd!7V6%PzR7BuDvO%l_)fR&tYZb^Ha@jg~t9>GpYwqd^O8P;3o5!Fg(W?}=LGZnP3h zKn`C52CGV-fah^bpeTlP35X!o*pm`a43gKLC!qu?^TQ?nNM5v{Sxd^Trpzcyxp93* zH_RYkDzJj7<hcTG2UKS9zXV?c?LQCGmaUTPL<_2y9L0i?LqANC!K#Al!}GWW)h~v0 zL5ZM(vL^+l7*tU9JP8G*RhO`~bx3mO#y?LIr%206@kF&efLKw>a_EPa4OVG+5YOXk zc~}f-EsG#6+Y>D-25H%zCrQhvNTnJdoTy4i$YxZj9QvVBgH<Y>!1K5&-71E(N=1-L z?TJbigH&qIlcds6ar=~s-1sRp4@&VwwY;62M=i^tA6hn8rR5!X9#_jd#gNvr2-31W z(XwKYmhE|xw0w#x?g&~rQI+l@n^C25=!Z%TR;hFkp2t<`j2O}?6+tSsCn{A8QmH-v zU8%Hp_(b(NOCF;><?#A6Sf$Sccpg`u2gQ)qrwG!gJ<+FPkUs5s67;E|#;K{Iy@MyJ z&qL%f>QfG{PlHwZJdEdY^?5`LX?=<yecBU!DhBD(o+nA4ir=r>m&iw$|4uGvOWe<t z{psP9JFiRzH>>+u1iMnl$a3SavPfc_MSL!lg0wZWn5Tw%?_j7`nTYfD4hJJ{;!cZ@ zxJ`Uj0AZf`4~zWa1MbQ3LX8c#Ck-Ou&NDxQuZv_yj6^c@*2s`I8P1wN_?j3zB}2Yi z1{X=w{E?g=BPo9(r6|3@Wa+<P{-EFHn5P}UsL{dI&q|}8oF}&WVmXdRuWJy=jMKrn z^JhfY*wtkOMOsFlaj`tg^>~e9OK0S1i)C|tBvbzEAm?Fq!YZ|z)SK5)Wq&L->}yYs zc5xUd)YsP$U#ulm<UtKz2HhL^9F=!fcx=xmf;5$0S4~(@;`m6Y<a-Xok_?@lq8t&W zw1^0Yb9)b;N$kU_0mZSSnV}1W*aa<}>AlaA_uLtBakxwl2ipaawkH`PH!ii&J%cn> z4jxrvKV59WA9>|p^076i{c`u&q??qzZ$9liwr7V4?fnXAzp0US{Kj;&EoLg~7^E^z z#ZMM>fOJ@*#f<)X5GrkaN;jvd&hQ{G@h(o~f9_>9OfKoPis~5hm3--S;o-S!QY<>$ zQ5A==)G;(w;;?dXHG=F-6&9VbPc>@L&K|kRvl%arkc=qT<bIQ$c3NkXoz~gpD^xef zbvE6xQHO0H**g~37K&5NTn6S3y;8UngypqP&MCR$U%ZXTRX~<RAWbf}<4xim9nR`w zzI0taC<J}=cSuKCMqtR4huHDgNffzs0w7#Yp&EW+Vmi-_kK$=kN|fz5bcI@?!&~>r zf!56Nd7hkh*}+4}>Zr%G<G=K4=@akh-FF8sr!@UhhR+hJbWU`S9X*W&o;{q|4C}U` z7^X%>sAZ(BlW~k5_26yWEFuLKUQUvfl6H@tzE$|WYso!RO>QNlB0nrLS;#6&{B$mD zh9?DnZYq}8M-H7AGq0f0p)kd1nHut%eu>1rwaP|Iy!J@~`tq}r_{+P@@^Gu$@x!A7 zGUg7ay70&^xr5=_)MBNv#Ak(EwRvbqIOVV-oB}9FYUE&~T)D9~IGVzS*PjN93zpke zX6+DFt_KOg07d~qKdm~#*%$d#%D8Fn<3#@?w0%bxic=Brx_Is(r*EC-R0z)9l7pj^ zgeWsmruKdM;y-=-C_zLGr*Y-;=^y{364P?tY;of3I}{V36^Qyxn5(FZ8d958xRPsZ zIGdE-P;qgm-mCC3MIeXt>+?LhWYl|@7R6EioR(##W3l6}0ICD_!m@aD=wGV#Z%H*O zzXvS2gtzbEb-NxeWnR<JUCZ8HWVxKo+Zr0Y4D1#Q$ZZml;}E85=z@w9%RFRnF{*jn z5oNPgK0GAZ?x7ci02k_VagFwL&@f1oduXIXxpHQ%FGYSug}f?7?yQjeQ{;;(<h7Py zs71NmlR9>C(`0cVvZuzSrC&=?t!o%TpR`c!lCkdDnO$PhwWh@Kfm(X6qpvr5?x6w< zs3G^zwd*g&di&rHO}<l=&Y5%WY`N9mCaaC=3MXh?5?49;(<M=WEtNzRNS0V5?Lb&B z!oQHsRMw*r%8ma`+UKDW<=Yjst3Q;OvW$w*|MRJ$Io>?4j(??7HTsF7ybIEg51PtR z>pU8wJf!p5=&o^UWenz{i({4cNZLK3i<L1YPm$0ZQy(OvkZ<)A=f=Xwo7%A<27G8_ z7!qs@n^1JD2fqrnVv6K>F=y3721>Ouik*0GKhfDO@-=)XPUc2}RBox#QQ~;yIKGct z&?{%0i)|^t%^Qc_*#BX8B%TNd5X<#Ouy-=M+hUcbM{nuw*#S;U=*qvB-O2G)C<-g@ z*?Mo0g15Fyd8axZTBNl5Xo|g`;;BhYBx8>~p}WY_3%^xl`RBdAvb2B19QfFr;R)m2 zZ!a}LgWdAI)umh;R8;+3Q0*0yb2f^91kHyW*&&SW?s9~dt<s?0&WP7tDT&I3Q(k~> z^~?(De6L75D`RUjd6di68K3p)tcj{$Dr@l0HslqxhS%+zg`8}4W20Ifh*}9((Sg0t zX_ch3*z}^DbRO%)8k<UcX=^ocg?Ey%I^PUj`FgH=OfGVv+}gOh>bSPLZm))MMAXRZ z%fHYmikD&QQ8l321V%*FuUffzYdy7Th+5C931WS`qSo^cH<Urtdft(SyrS0gZf(db zYCZ3chP<NI^6oc7A!^P219nyKP4QA(-HE$PT=r^19+Y~uVMZR9X!ne>?=FV&J$O}K zB!)1^1mqacl79~S=O%l)iHRUHmT?QqkpF<dP<uEu@@Yj`vxYYG^^^dI)oy6X1A60x zw;|?uJ&cEc0lQzdWx(A$128X{{~4lX6mfvSdNEsvk&To2*Fp_ZXYt2lv-<kr!QDN% zkG;A=P<OH&K5ZQENJ=mFC{wz~qoz{MqXngF%io8|Bp~1jxO|BJLhQ}7uQQylrmjp$ zOx}V<d8Y?@sr)5^(0(@^E7@&m<fzbm;V}w(?C9ya%{qh<1Cq+!;(ov$N$FgVGNnZx zwQ>>P>cAhPv2*J?2uW7mp$<9pBiIf-?X>qj0C(D3h&jKTF;2L$3=(fD-@?F|yp$-M zK_nkeHf3>YA$(BNu?Yp{r%Z8K-CYh2a+jQ9RJCAibDNtv+l>;g@QMpYW66gc=sw?_ z3eS;B9xlg1F2_QxrE});sU!3g(5lvQjc_Z%Ai-;t>Y%&FqCu+DEd-|Sxjf8WMzSNK zZ2I})4X%JsFsM5D0ebCoRkw&mGT_w3vz9e?)yC#;LrqnDP2iRIRwKL0k}XcJ=;&#9 zy8)3Ay3)O|G*)Ewn50=;db_1F)ysWT?kcataBH5|<NWP{71gzDkGrdp{z4aUG-57Y z;e_@#d30G+j#PC+hwGFE7z$?N<pZkrx-tbh2afp*n2^FIA~Fo}=quXGTRnB}ZcXXc zE!nL&j&iptRo{;>`lKlg)0V&ge3(<FZHJ}c7C9J#3^wCVk@k-a*HN@ISj{uyDSF9# znO-~GiGO^JXa^3Jp`P)IjXX+bVRcFH*gs+`j<C!P*F|G*{3v+fu8F3!v^q$5t>-vF z+`6S0T*|5{CQ|9m)p3QFdY(aC>V{lgE#<ec;saim-T0ccNe`y}U9jFSeycHKvkNHs zeEBQ_siH}Z=Al{{@;+snq7jTM8FxQ=rt}hzno8$*v>-RWkmgd}OY|Wu7Z_1gEay|> zmer=<iiB0FPteFi2rA#Q$q7}0Kw<2yNYwunRmF?$wN`*F7t#J<<-QCSL^DtAJJf!^ zwZe6eWK_+eu4sK~-?!V&*ca$b`YZHog}$IdKSTG)GPpc-iLE59-V3R($F9_xLFt|5 z);7|WvO%S5(*6sQ(j_T>^j(T?k_@YW2@widE3o;pMpj%Szf%3phRDn7+YKs1GrYvU zl7M~d`0E;*$#V7GvfGzHT{d<&d+FEi?;_-nzb}qZN-`Rg6Ka^{zoh{7X5pB(z&~SE zBvs!us$j{ZhSFa}frUYTibdVuDwg{1h#C5fGE|rOOG(YTN_b1H9xWJZMImde74n6K z3i%;1#!%<Q3>UKOIj|eCrDF%du&}6SEkX|P9GGt2EDhA^4fQy^VcSzVL8<Po^>hP_ z&0{0!r{at$j#jmj(9)uOTb*|*8H9_G>VrFxm7c(r-CTTKct4WXsnXfd*Y8m_Xm>1( z*$Z%d=VQU9iek2^7Nm`j%@ZCCsqG&*sPKxy8|nQc->RXw{h$RyuL>+wuO2R0QN%uw zGZYF~{_m-{Tu6HMuR@e%EyeyJycoJ8#oo}cR|Pq-zMvAMv}Wz~p@@R4HK`2I)u)Oj za8Hib<gYY2q5Oqd#`c(+hOTd*|KlD8OqEkZzL3Cv+ZjMR%<Se?yB=j_@MIaoI_nY_ zAN%gxs+`T}t8(LfkJpn^oAdL%7p{>*-QXg9e;OkfyIpK#2b}5^h)RTtH0e2LAuR`N zuJ<J*YBgsVOE6ulx|Pr7Yw4?yxU_o(m9AiKdCYrlcNh*mR{v?1K`CxTDf2?DDtyV5 zE6P-%lf8op(1xE2U9}d8t6tbIf0S;TD8!~ZGh)w4MK#qt8ivTWg(@$%&r=tz_UNjk zz0`VtCz|i<ncPwQ{h87W^=K+-2-{BwulE$o-)m9&J}a(sUgvhxx~3i}axI440hJHE z^HTNB`P_ZYbjWTj%jQM!q$SjOE^i9HZO-?>=FGa8LI};)VDM*OPN8f4+k(GaXi?I< zAKMwIFN$eGH4CFUr?(#Ne1$$%^s3D>cM#Hz`nhpWi>*#@#`5KVHLW{OyPj`zxr(wV z$!*rHiqEN$Qpa5iOa~aRxYTpIPj~l?v4diDpmxfBucYs^xva}ZsnaOc%Cjt1k=o{> z7L;C<AF~xF$$oe9UvLJYrmk&c*Ve83OO2DuZHVnOx&&SP!E@C`XGpS67c*0j*L5=w zq`9kd66LChzNAL<SaFyl`HB@rjdb)YRf`w3E{G#ZRtH3TP_(L~toDqMald04Qltde zJ;J@9hw-u|>@?OanMWYiv0vNNh@U&}%Xj+zTfrD1@6ZEVXcfoPWUi??sw(@w-IQvY zeKLK#*00-P0HIwFkFL6FG>nGYa2OrvwZmvfw_$WQX>}_pM3G>ZkE$2DJ({_@Wsfi` zVZgeetnW1jjZE2KVF6L37mks7B^GIAGIU<NEz!+^qmNxGwzB+gi!02?HOyq@oOTv8 zvMb1=Q1PhLp%ooh+~lr1QBmp2KHNo`WL1F~y;4#{)*CpAE!`3UlAFA+lhRDB>7A<F zuI4HM4GkW=7dG_96gqDdsmabm*Dh3}b1=JLU&BCDc?H^CXl>|SF>);4+r7=MsS_*C zEMZs9y(n}?52>7}bfKJ@=r9LU9d+gYmZ~*Q+umj&pm6^(!lo7i^2EooWdW*{w%l>5 zsbw*ym3p|TrjVOz3egj3HL!dJcm?&Um!~#{J9+9*U|!E@J`G|GO=U}MDI`N{;8Ag0 zm?Q-)dFgJEX59R9i*R!2r)4o=bsGqo7mec>bp6EMg-3Pl6<7H;;cSpfmN1Ijy}u>I zPpQa*RIJ@98>%U0@rvHTpks@DG)oy&(n#R)xyAAsvsf9sucJe+Dypb~+-B_>SLAC$ z3%Si&6RXgqncU_kB@a<z<nAk+$9a<6=6^zH5lz2Sg<-ud$hhOE$kT2?*Th+FR#S%@ zW-WxjE`yASHA-xSQaZ0Vy)E9g6#dJiJ}oD}mX7b>o+#QZLnPul0EKEArDRF@5G2|s z6+7HP6@)E@3l;-G(vKX0KkVc?b#n7M9+UELQ@TRqHLx~hNY(z@^)CtHmiCu|Qq^7& zOJetoOZ&yRJSQ*!lP&TO1~6<OgyUvOjUR`i5#5ce+KB!+$L@3`-#z$f1|-GqedmgI z*hM>OA>!O5o-lovo!Cp4RXi)C*v{P8Qoht;r|&?|qRF_&qNBFOxLPeP^)^u5>A}5Q zEkL~C6b~K0vrlsTce}9@PCBP13sTiN4XAVa*}g;B&@0;-57ZT{KRd&$;jn#2ff%`& zp9W5^?Xaf)E#=crLiEcq{!T#aJqPLqtXqUK0UInr1$u4o>FD&Hu9Knkq+>?%BRn>= zlnYsD+%l%o+Cr2sA72(1KR)&7<@;`LDZj|GNtvfY)^TJAx_P#Rx4gNMTg69i-+5Xk zx6Rx%M{ea)o7;;kZ0ytUt(4DW1?fYix(leXXL$cprHu*6=t^$vaC4Z3@g*a~f-Y}$ z-+h%^u?MTF(x9d-wab|h7q!-}W_ogMJu<RYBb`-PH{PL#YKzI{T5hZ@b1h!Y_>0f1 zD0NIia=|TM9XW;7UM8Ya5#*vGT#JMhs9db?yj`6@TECv_<#0il>(uFY8>x|~9<GKe z`Pv#f*<8`EIQ>DhsA0wc=zCqEeWCV$I1bB+LA0)OvDbFG5j?{<sBh~kUcPUmeSoTt z9h-50xaXWN>k5)5MrQ{Q<!?#JYMW!SSeSdgk@gol@%7&O3tiFCNG$fY3a7GGY)6_( zt&odaq19b#g<MJLC3p*^OWrg&xx9OBvCH)SLbrH*c8d{nZ+x#DZqJO4WO<+GS(WDL zkB<F?frtq_n05?1hwJB4=el#_IX`hb0tX|ILvm7RGv+*X9m^iltLRcLbor08sZ&{? z4^#;u7eZW*5EQ6fNs0UI{8(vhPaExrF%M^<skcsjPH)G0^YryCWj8FA%^I5#k45jU zon1husBNgn>%$JD$1DFp5?1O=n)--zEs{t%N$EXCR?Mz#j_n(ufy*x(N$pwir^}}f z$fZ7~hiDnQb1NzXlUjNED`_^(l?X9Hhz6B5i`RH#FPjjW?O<#*;lh)3l2YoNbhTh% zpebuIIdK>bvUZ>)nW)!F6`VD)Q{RAJ)(vWw-?6PDDGt<dAe}Me=w&Yz`^!+XL@CzY zXjYuo2aXZ(C@hD?rxg^-MA11J{0@t5TLyOB{e0`hhu}&Nz*Fb>Fr&SxHIckZPK50Q z@$)N3kUm7<8{zu&WNB02bghzA2NCoIai<UF#UgZ9G$B8yiRjl$eiW!>M9H~ji+s#% zmrA)aX0{6+pV_+eLaad5FCzD9R*}Dd5y9fDf{Ct@<iC-Sqr7s&e)nmY%#<(i7H5Po z9COIBDEE0mU+wl6(1M)QS1qyGcC>w)U9v+gP8G8zaPGbt78e!eUs1YRIO(Q|oMk|z zIzlv)nK?21k!N^4-46=xF&=W>Gu=EY4dgE$oq+px@!kb5>GT+#KCdmrMgNiwQU==8 z>3mdeBa1kdHiLlIwiPccW;a}D@=lE?Y9HIEgbIO+mo3k3P?9;4tVF?AzBJwNIjByx z5a$|9gL|@?d_=~nYqNWah^?@%WtfAU#T>*wx2H4V%uIrWCqMdOMXzHsXtJNoUzXi? zfe6E+-P$sCUpVb&HF1K@QB1>^Wi~WlGBan>XK93Q$GF>*<(ORFtQ%^M)_mzz_w<g< z`#qF-zVG_X>Zkh_J(YEj<Z#vXI{+(3_i;7%MasP1aV*&y8Qgqv#;T#Fy_WCdSa(uV z!F~>kDllJVR$t10eA&L;o>XJk3|%#rI)0T#az&!od&FnehL?!0xLtnlgJx@mc^igN ziD~DNt*UkrrfBNDNE|eO=C&N5A@adw$UY`J{MAA>Gk3aq1CtX_cWu)jebTKv>6@Ab zav58{TOBG+wLlCvA!~t#E0uo5R+bA^*`sOj#?BPDH0u-yZJ6)jN`qn6h@mQU%Q$vR z>aI$o;#)(mQQ_Aszuw~5;TC<or`wwIK|j&5z^1eA+<jW(>JxK!k$R_CX-$0lg=x7G zy(fn8Q`PROxsaIa&vrm<xF{XywbLO-w?*ky8brig-B0Rl%d=U(YQu}x@&9RV#N1oF zc(zFQ9kcdR=5F**{nB*RebI!0sXsUN4LDpj{Q^dVjMOb)m|z$WtwOJTPNA*F^PS_F z1*YSACH|EAy{i^aEbX7}`*uoMSVFcprQDyIvewIZuVn^nOL2F7pNb~RK%ji&e?UQ- z>s`fPU^*i!1!bj|uV&bXovdy=0H>%0S0gZBVskYD8YYcz6y2#B;m!oP%9X7|@M|Fg zv)C??aa$gx^BbX9Lgq+jrIKM~h|EPZy+R2t&)v7O?Pq5^ntSMxsowLgYhwgHOK2yL zFFNFZZc#gPL)4F*^r)lM2Tpp_QR*j%I+TgK(vRix??TiMs6m{5z^5D%v}JBb4Xf#{ z9<T~hDaWr^$E3pd4ZcuSS5+748@v@~gLSk(Pt{>N%;o5|03xxA(|)O%YLj>0SkPeI zyr?V~JZDO+LR7{&?(lzgO=wnh>mEs{K2uv3#nCJgs22Ip6}Sr3Fkoh?H(wJ_b;JjB z)umy;rur0B1AIVN85#y$P@kg8*9R2bljT31rt`U&+|oReB4-+twH&8pYq%FQCM#~` z4(=^AaZ7|6vf^$)R@|vbIM{wKVUxMDw4WmQvzZA80s%A7@hdum{vf`oRxQE#LY;eM z`IR*ux%>PlQm3~(CPgrmKg^?Hcn*-4`a^1=9<hyJ35-9i;EZcSjFaOQ;r#s4&4T4i zQv9Nn&*vC_EG4A1@=<DT<0upSH1@3VTb>P`Sob>5w%|##sq<{##gM+7`^m9mm&`OC zBqD+B2vy#+(oiKmIpb7JgYz_ecCfjFjM-L4Hh?w**lETN45VzpZzGf6w{c95`jt4C zVK5lyIUn)<gk#7(*-Tg>VWjJqz!r7*{#=#_8<3TM9)>R2rR+v^J8$xFI5O$y<Jubs zTg-sD8N_*2jF&ZcY_JiyA4R(1;nd`aGRNmto+`p&J)j%iBAeO0X1hz+T3vB!QAY!- zw*+E?QBEXR+dNOUZret^y<aV4)i>iHFYXoOo{qMV^MZ2Tw!sz)t3>xhJoD9P_%#Z_ zXm15!wI6P!gF<cp&1qTl3Chb&CdR4{Q#C68(I=gDG@xCAo>Bwatx_AN**#-nQ(s65 zKMlfq8EGYc-p;f}Gj2bND4n4L{yW5H_2wZz{}n~8MNg|$HWmC#%9oAKHd?YSK;S#t z&D0UH?2fZd@rCLT_~PZwxi90VQKE|u#oD1Ks-8a^hbrh$xPU<OQa<+_2b)q7KCWum zSP23nO&ewwt&W_T63NwNKML2#&URLw$*6KW)n9UI^~22@pH(y=3f4uNm7V7r32&M^ zRXL^S#{bER$3<-Ivq2{7w$|L3zJ5m}(5st=AJ#r)?W0hf))dhV2GBU`cxGGtNI-S( zFn>v9y7-}Rri&KUJP;Hzb-Jx-1O*2k-p@}l>AZ&e+7JjWMg^!wFj;at**i!vPR`{x z&g6Xb;Sm^W>})uISYvPBr5Db2!tU0OE&!z(+>AV`W{{x?I-l4Cy}d2HSXBTAGx0`q z_%EAvbYp7DS8sKV-|lG#NNazx$WnA1c8q|6XU1Bvb}yFVw6rokjIsIt{cR9_c#mq# zjD;H+;W1S>e{3etr3e(^02X0AG+Bm0J?nV$k++ocQ%Z3JaDI)4mMbada8k$ZtWa13 zwl@}?>nDpA(&EzEPmx|H`j%{)Ckh@D)R3X4Cc&FIW5>`^l|+1#%ky;%OR5=`YNN-c zwZD)jOw`~0!csZuyf4%V62&LZS)MC6w!wgx$hVk2t(wo<wQp6(O4qJBwEBI27OGi% z+Imp^qJ^bvOO_HRRpkyTS_C?x=h*NttCIR8OC%wi#?@1kN`G>~qzLTMZ=3n)|GIG3 zQY_3!!veUE?OMu?B6ZZSj@(7a(}HuVu-=<W$uzlqaF6CPQj*-f+&sb~FbDEfVIcSA z<+>uRpb2Lnn@S;8ec^Izmi)lT`(0Xp2%`C;Ddo$o=mRyK{mU%-cW~a&`MPg)`dy<r zuA6WZn<_H28RSI<)?L!Uf`|)rcR)H79h#BK7rbr#<@@erI5STu(tQ{<-tntSH$+Cf zo&#?&BEqT=Sx9{9+JUJNl^gw@7a}A-_0EB*N%P_u!yVR?r2hsXNoH1pn5dFGM3su& z^B{^?5v4yZimPEt?6L{{e`iX?aufP79%&V)$V4h%B3&CIbw$9isc&e0wd1{tufh_1 zo{YiJKg5tN6o3gxD!K6&G`T8xh;$hSZ`XtL2dGwkSf*9FSpoMT?ta{By}N{a&@IIe z>xIw}!s!ROq@j%76fNj(uMSs<v2j*|wKF*aAA{`poz_Qf2`0$SF)DZ_;HefjB+hd< z_ht2b+f_P>%%6Dh?TQ5ZTqD2uQ8u}YH#}10Mi1iL3M<yUn}=I$>$dBjx??(p0rb?p z@#YFa?RRR%UZ3<wq)9~axXc8F-%uEoEGD#Ht#VmF9mDcbkZ>-;2~yVU)T*H)^75ir z#i|TXS|y6|*eg*MS13vA9imkt2)#ozM^e>f5z&HfYmTQKv82P%w7|B%(7&;C^YwfW zRN~mhgPUiKbKH)@ab?0z7F+0Tu2YahctQFDNG!>+z#U0{=tx(lNMCTIt5T#dI?~m1 zHwL1H-4K(~)q%ps!*(cAlakY57iVsF^YSrWs8c$Zj{b^c{CB1PyGs9EeQa)ts9LqY zQvY40|DgUF0xDyv$n@Ghhhs)1|9rkZqdM|`<^0}FcwaTY_X4~vKhCVEmfMsk6iu+3 zYME(6rZSqkb}&`rU8!-X(A6|_;-cJUjeqJBsviyNKhul(D!;<h?WpqS#@>iQfN>c# z*GiUID_N$paE$9=T$USqg1(IUjR%u7oh_n?Z6}ac_^!@<**QLazxv=G{{+9gz26n` zlOyG~!~0#?!0#UKcU1$wo%roh3KzR5N#={VB$l;Y$=2&-+vPoYlMcxfzasBF@2z-} z{~FId6;EnPjpqZR_z%{SF(n@|wqU$thkSVhHJ-NVooH@_UFj)5HSEf(*!ga*$@qwd zRX&KMXb?my@Ig%SbP&nbAc&OjgIIoIkn&=?#@w%JnpLB0gW*coSMS$b@#`)B{!fn` z(^;3J4YvJ8A3i{$RWpn9t5Bm)&fx9Nw|0P1!#agi-E+^_K^^aWtB$FT6HLcc5Axi* zVtKC}Q%%QJe@yjK4s$ZkSI9-2@6*{%^<X-ZDw+(2Vw3Su7afnJ{%cmA8WutIM^Za2 z0Ln9NdFUDiJCgdCXMfg5QV0E!)IqnOd1p&`)pLu|4dxk-y4_t(V*Ro}gTttGn@x7O z)K1IBcm}Cf(#W%nhfa;@ENcud2AjJ#kfd(z9*)1(zMCEBwR3kzx4ApLw5wutHIjb1 zCt1WtrB&`6e0_?gA^hdS_6>8U=zD%!jxs1T$<)x*`g#%%Kz`MDVzgoFoFLaWF&=Iy ze=bBKGsVI|v5g!fN#zhHkfV}1v_J)N#hu&yHyST7=GuWc`qhixUJ-qHwGhhN<A<E> z8>lp1h76}l*X~f`sZ4LX>FCtuPv#XnqMn>%rT-B_9_o(EJJsh4&2_~_skram*H)un zujegJ(?>MCFhpH|b;#cCxLOiS&o2@cvPiOYEtA<&CE6i6UFa_Jj}_Oo<}Hpq-Mm~Z zJ3Wg%*|$}Yjdr5#S+;o>y;(LdfSDkN=eC79E+f1{X>&r2s*IXdx^-$65jFRi9jeNR zsaf8&YHqLReYR@;9;JXfUA?O`=6|1R*1cG$S(Um@%_5>^eVi>6kUt}2YPNBP>pY`T z{NsAwXRGEhqC(9|<r&mwXNLdH)#j~M{jl;bEB>&&t`JqPW2fa^J(fRx!o;C!vtZep z*DS!BHVedRL!rr0O?{koXqtPyI|wTuvmQ*Wn&z5$bAN3(gZW*&=0AgZFa*?~)$-v- zKTIbE@e9WiDKkr*s{th!KRO?#5sk-<Gx%4H8^Z$OvpJt>N~0b6BTFSxHOEZ*vp-iE z<Vn4yIQC?(BJO8FC8QYEx$OlaourdhWiT;Nc|Tvb(N@1m|6bK_ctVe@{WiACc%iTA za6_jiF|{u-L0r`8jsWq(rj6Y>+sE~3swpgpP>u3_Bog2Hda)$PqHrt!vDvKMgkhoM zbV@SV)>K!>qUw-@>NbKm0E(a0b`EFaQ;?5s4Kl&}F!9R`I~!NI`%a&*;Z2u6wPVp% z{EF;7tBBl@o?1^EBhKf^-g8|@+ax9J@&{OcVX`t-IgVI8AK5A?pZ30~%7R&U)oXUc zgtjr-hyXtwA?(q7L>=bd{9E7kOR*<|xC3IGkN6edmhvCcjnFoG+L?@uf;AZ#plPwl zpSm6c^~MmoE>&C|d-KF-MPMbV9(x1|v9apbQr6|OQjTp_4GRs25&v*i%^KDQa@~j@ zs((Mut-pm=<lGiCk=4ghH&(Ye8XUa|^xCnyqcc`_3v2X96J)4$gNDpKV~5XV3?c%9 z^>?Y!gcU@MtK&L}R8V^uSJm@mXn;E=%*d{rc}e;b8?J_Ms%P-d>F3%D7XDkqK=Dwm zCKnAt+08e~jQrQlETTFn?;Hzg;>cmo?M-w4Atb9hU^9zAz}@3_n|2UJRcS=e$%!M# zFRmRpIq$$-L~WstG6SI-_(13e?t-JrOsEd}y{%NutgLQg3S2!*trXjV{BMN>xw%d0 z>qmjIMt`*7B7$0F=nU%ZzYVyMC9fLYi}Bq7yP3;Cusp(1XaC9S0qLsK$w@2gk~8nc zCInH14s7h<LJ%Stf1c6)+s<e=wNUn>aQ{^VOs!|=Xw7~~N%1N7cGSksmuLk6!TB$) za`Xp65ZuP;F35;vQ_IdODVp{`>ITlAx8xTq5zB&U`<sf57<8D$MjHB0!|drT9Y3<j zbdmta6W-A&$GzT>*RqPH4m#u3r}(F+Te;o8h!LK(M2OT~J&1`}VYSI6hjKM$ac5r@ zXzJQ_zmH&_%%JTm-Ve4Du>dT?@`tX(Z;#h;>0-~?iq}*AHvNwe=@N=d@FRrAQYeyz zxexz<&?(F0D!#hTv7;}|ZPs#T@TJeG_+B|h@Z9EmQ~u<*;y-pY%U2rk)tp>!4C&XP zT{mxP@DWVpmUPEv-O-N`u<Oj*NkKkiWnHwvWW{;;mo=m3f?7}PX7p^X_B7+EL58}B z9-<VM#`;|?rz%N&bvf!JK1wIy#Z#Nop08xkOZYBexHcd}P$~YmNMOa4ian(q*Ytxm z8Gx_8P#0Mj6`Dt7<HA($8bEsE!V>en970P#TvDLgSk^>w^4n=6NAimD2PI-dbmx9m z#1?M)LzLTKyWKnKjto>d9SdeyH)3{%q;wbU6C};W0UY3WX^HkDM_U?b`}I1cJ^|!d z_7|4HkaBicJFlo_E>!!PL1|F!S~i`lFDyu&23^Tt&L2Y3o^Xf;Rl8x#FV+}nL@~S9 z=<0ez>Ut>j_>BcsPb}9wmxs#IHa<VVDYa;n-(4JgvLGwT#q4pss{?@dzns{u0gTPQ zynKt*6nYPau_Z7g^uEdn{SU?8R^e|eUm5r@+6Pr-X#|~0rZbg{4zJiN0X~`2$_t@f zN>*X!T|;XnMR$~{m;0}XhiE#uPOw8oKJ;=>pYG4txP;bfokTiVS>MWb%v|(%rXfan zxy`==U1{_dTl)MMonDQ;jKlK0cg5B;yCWu(8aP68_NHlWonv8Wq0DbwMF5g?r_Zw5 zbJJS|-I^41Un!yPc#+|$+1l*Pz05pbEhcT&x+v%jR%&LX&*(JS2)t2eN`D&rcayo0 z>J?F#rV}w!G&~fk!4Ol{*P4TyZnH`;Z`pIC{e>(Fah>=#-AlQhVVzl_o717K&#Dfs zg0BnRY;k{;9FEnTP^^`|Wv9ACX<9+@oMOt8;7U1^xgA9AYL9&F{Ue(z!hJwF2_qAE z`kYuiI7~2e>@T!S$U0dxOsP4)rQ=&8;-$T9)iX*~jFOr~Gf!_5;nAJp(J<{G;C}uT zjf%kX<Stos!TeVXLP4nJP|tX`s-^s2RV5XQV^`3NhV66lGd4ac;8%>(&O&9e+V(M7 z)+U?wlBJ!_)Ywm-TzJ35>dwx&vM267arVi(h_}6H!&@Xu6nc?w75x{VgF=`FHF$fV zZW>hZ(;!~aBdUJM{~W?|;zKQSci}vmUH?!kuC<bI?q%yht$w>QrG@hAnZlMoX#J$x zILw6xS<}}&!ng)~bKjumbR1!h?;$eU@o%;?+xvz@G(hSDV~04qnj3Fw5JCM#62#i* zA_-5foy{59HeS}(%eJugk_xz2v@WbalNsm@Vu#<NAGBJ<fjpGDJ~#GynIiJmi5}KN zy?7sbm6^+pY3-xdOI%V;Cs!o2*(nfv-CK3d>Xz;``g<HsTR9Y0qC%CD($DGPE;}qW zm4@Wvim8voTK<Z!YE*j(HMo(vnl*xUQbXKIYL|Y^RbXe9+{A3ZPLL@*II#(~9>hRp zhazQ`7TV_A4RdxlL-hT+@0YCknH`BR;E9ZH3?BOvn#R0r_KhOd?pCX3<=<ql7b&{A zynBRT4W>iEevdwxR~5CT6tSkJLS6ExIwaa=lyUb(dyYQIiB|JcQC_H9;<|7n&ce9K zOhFt4lTE0*h|+iq)A5e&*-k{w8)LtJ;LMsKXZcHJHWV-%h<4Fbx#Fu}v>^ZDE;HNs zDj2oYzp;y;U19jcWPUN(PPo&yc~cw3%M8m1R=744ej*6U#LpCfxvVtwPHWU%X0N)) zTNkzN!~bf0PTp*hS$}8lBmbD9xkKHShZB>!!K;GLF!W6!7b=B5Dp<d=9n|O!VAn^f zg&|etYBjorp(=Wl)C--)UPWJEbZhLc@#V(9VNKbUy;JGfVGU+VxsN=E7dk8{ij<Cr zCD?FEQ_Wd>FPn*Is(2Tj<?N#y!Pb6|V2ScSp)8N71M@i2y4gKx^@16fyXwqUV%G)x z8P;XR-rQz=Cygo7cL|}NKHZ0ibjZ5iVA^e8IP>5uxgW5S?g6FZS&CCn7#G96mr6cM zZhD*F;v;*<diw~XWbl2M2b^!vO#diY6U9E4B(f=Ni0o{*6-curadNVFuCqav=Zg?^ z)&1aHOZk95Xkwb+UF)F}4qX11r{+Iqf;47ADyNHOd>UD&>igBkp6pT$FazR^4fnLF zBBOErH#XeQmnozQ#wqlnMm^TsKlhTk7l(=L8*^9{eXh}zwAen}I93@HR<AGbfX^Al zJSb%pci{|;hv!<Hlmq*{nmO&kvG>*uH!?=|J6I4EBCa0$VSG#Z&lqje?<{NHSY>d6 zuvZi4{*UpW6IO`a=F3|&NcE8xTejj#UAC{}jbE%p&V1plbn%w2ONB;FT)e+MMPZby z2&Go(Z<#b%tQfjp5sSe9+jy|zsv0H~8!k&jwPk5H9$STctMa$2r(2arZk~NS+~}{* z&b0NBo?f%2_g{_u$JJ*hVA5ZYd*3XIP_6&#L$r|*K#*{uOl~iW&9C(RMp2nED^d|T zFq<tdKI059@<^-W8Hd+_qxENgkPE_S0z^f8wD*d-P1;_Keui&vRa!QL)PmgLzQb9v z<Hs`Gh~y#|96Pjt_v?q+f?(G145Nj!ea}<L`!kkyAVj**s)uu#z_x6-j#a~jI?Brl zZhN`Rn&GftQ~b1Tn-w``sG+MXD#G@k;SMkNqX|CM^5J!6u$)q@KWb1YbsH5{s~T)n z1bXe@)6s3M&5T=BA>tUIBX>uM?5m&S)T&5ftx|48{cNhToeEL6kRFPY#H_l?wXsQG z^G(-4{N;i4Vk=+G^dks7bWTO<YrWQOLgS9PmM5{<!KzR&eAwaclwD9!O-}5nrf~N8 z9w<nVuiFfm(nn)<AVk`-*Uq;qQ);v5tQVN^akJ^XnK9+B!1v-vM?deBXep=UN;xHz zIa8)x)9c52sC?=5Cil%6%ue3eQP2(mhnpovGIY9fR(=XB#h6#cJklHa;kpT@mdh;} zvqet5lS;P)WedYy!l((kmOo=WQzOa&d>wQ8!bXRU96Larj~{~CNo(k!irryJyNJx5 zb>}{EbELso2+5cM>#AzfEFm@67=)U#z-G@S=CcgH@;Rm-$Dm}rm;ChdBu@3-QI*!q zbjt`9oe}Kz<|odUI;lr!<>mVr7`2oy^Y&iZGV@owJ%07<A5;dlV|!l9aVmb6O5jD8 zP();bdSU;m-wbwfRh3<YBYGCocG1@HWY}FRrsb+JYa!+;nRmA{&1D{ExB&%;(SXxh zP{o%Pa^n|J+o*H{3XeRi;9bvC=fVeaV>*s47jg{f4aLU~<3G5LKYtBjswP_>q`hae zanJL<@rV;l7mo-IU0PM6*<h|eL;+EUD7KS>{&G9nCSxJ|#zi;=Z6Gl)mlc*C%0Fae zTb^@CtvUfqKLcwhW79%|hE~@pSwm~kDFu3Mr{w6dQ}Vfx86T=ku3ig-j#|*0OX&(- zzJP9E?m}pNV~2Pxv!sQqel(G%djnAm@~Q=*D5MRPy2@++)z%O4*l`W8(sta8sq86l zOthy5%`D(!bvpV<<XT0=vi5e0L=Cpf&yV`{uDNmGb~OPrKE3tBV%1%j1A=wVU6~HZ z7-ar{WnWID+U-;AbW^hF7vM#t^lR3uD68052FES7+7qTl<UgzgEO3`lb=u|a^~VDK z;`l)pHrSRqZjjxD3mOHH9{3h|<%Ui<x|A6_@+=}3(&f^iJo?=Xri~DB2E+Q2?x7fg zMnPSKo#+@Y-9nkrK#DC-sDnX4W_NL4;oZG+ot~3IFwO%toZW%bPlgz_G8<zeVXJ0p ziCcGI$STTjnmb=n^}?`BHw-ZN^_@Njax$YVHX2xrJ=~wpb*PP6Kc^~NCqJ=Lmlmw( z$fm!!nZLgytp@iZtSsmZ<kb2;op+=i*0>po`=qg1r!ihs@cyxO_bVU$Vk`vDsS#<? zDble|jYyYJR?NL2a8;^mDxefw9Z;%OKvG$On&=&^y;>70up)hd7Kc`9GiN2{|6_XZ z+8h|t0|=cPo8*52Yf>u0bn}D~5CzNbXG#S^h3T_94FZolxioZ*4v$z-`g0;gbcl#J zSY(5hp_esaIGAFfrHQ}%4gNFHl#S`0(WfeM=xB^)Y?{N)Cr6`X6mO7&-LXwBdY4fh zQgA6PZ>~)#ryVBu#t6aZu9+vzQVk!M*Vn1S=XCD8swkbqi{~~ta^s85y!i^`Z#d13 z|Cl_)I)R|HG5?m{ZWVk<P9>6iNTd60LX`^n4izLjD7r6?k2k>1-mQvRP0Ctp-!XS1 zo|v$D=dYOd=Q!&5@^io7qhk+<kyFFi+Cqxi<3~oL4%y(vNB>z3%Lkk7%7u|0D>?)1 z8vi^Wo1~dn+IP*SG1<4NF+(d^CKSeD2(qs09r`KOJ}JU|EhKF-t75URh2mth#^H)W zA3$nbnEObJ3XCt7w)v6c)c7cZC%m$H>`-y4xue*k6@P`umcL_47cKNa+45g{TIEC5 zEPIP3bdBxY5{PMSw^&J>E>&^a>J*GD8^-U}bG0Cxd2#Z2Rf|P_3XoUc^A>dOea>sp zdu8X|?g>HAIo<+o?x6NDShmX$C662m-|6J(R4R(JQ^c$zW&<(nb}+ZfJ>RclnH_3) zUqJQ39y;$!N<_}br&9a#zfBU=2XDUwMO+*fXt$iBCY^^+N%v1?$~qF1rfdGNA%5!a zGm5WzZOv|fEOHqZbz3XXQ<Fz63VpbRHz%7^D;oK-M3u?T@7<60BEOAZ^|3KjV&6}x zy+1*RAZ#l}s!sLUy=sb`p)$uq0qz~Qp(U#7G<EGwNdwlDAT4X$fmRJ0Vlh<@<$9eM zi>k%wms0yxBl6V5r3@`uHh`k<V%>2%Hw}Lg{yDQqq8;0Krg^hgOOT~=@k4?PQo~Ry z(T4<yq6enE7Gdoa?NO4l>S!A+oi?KHB*;=qwR7X;(oA>Ax?49OF@MmlY3?zpg-#uV zU}|BSxRAh|bIo&qEE9dS!9m8c%Bkb1p2ysPV(dv-hJ3O~Uz5y_kljr>f`2hl<|nZp z%^mv=FJRNsWkPcnu6Y{!_Gz|F@z>v(di3S{Xgh5UhA=UHMKyM~YwT$2hL<_KeC+6X z8(!e>8sXFZJz8_80ch3<>DEST@e!tN-{CfL-*%}RHMHFfY2Bl9n^BTx0C+F1^?uzS z{mGwJysJVhL<8YbQ$zdgKMYJiumdTr;(&L8KRx!H+=4&dcT^p7C$wGAfJ-Z|s{)r* zU^lhliWh(CKfRo1Ve+@m`~uIOe|XzhL@$1F>hC|Zj`-S&+g&@33kh0W==||PQs}d4 z<X4!@;^f9J#8$%4$8iQ1l2$(ouT9GR3&~X;H0+K(JP7B{&iD{(y@yO|RfqvRR_W@6 zD}21G_8rQh_*MJLY+D7I7z)9G?^0iCO9{Pn-=T9v+E-p|0YvK(!H)-*u7jtg<;8z- z{=0}lzWpIOiQCWO0o?uj%DjIGgVDsGF|#@F?egh$DeirT&Jt-~IcEVxTPA`}uWKDV zEiG^T{YTFr2KlZH(MbzyUGTLbxY5L*T3`<1TISPRrnsF#mIZ}~)-4{N-m-P@w6whL z{J;1VG02yjSX^{c?!dl7XTv?PuY9J7Ycw%P;pV`%+o#v9xc41W&F|h<KF0!xwp0Y4 zUiUh9T3TLs`4=xChVJrL*;9wqpmGgT_l7BOt-5Tor<-7TIIbr@DzR$**rD8{Tcd?A z0m0Un1z7aa<ILPg-a-BGz6}N*d(`CVj<Bvaozs#)8-rOTWEmVc7})p@LS)O%&$cMC z)$<^WB6s?B*psAnm$FlQm8VmG6-f#Xg%AWhBc{x5GqH_S@*x=5*aeCCP<G|#vnv?b zPEWBZyYg$m#^}_?R?kD;6iVXvP*%d8q)P3gboIK*GpHxUPa3g~2LVruDJ#1xIyQNI zYzhqA6qd?p1BR9qL$*;2&5<GPO9kH~8D(KM$>B`GreG3`<}&RW2pvsAkdF6uqI42} z*oz;R2RQ>A8Dw(m7&y@s8M2KS7`%Cgv@a5KwTx@f!*V!-F&qqr(L(;rLFkGFb*-;4 zDQ1#lRvU#Y7F&fBD=vvwSzg?-jL{O~mgP#jWm%%-#9!`c*}OYi9)&&p|FQQi@Nreu z`X|YRPM;GXK!5@Rq!MX?KqID7U;+WA8X-u;ARtjn3ASixCT+a7m@+Lirp2m7i_iK% zx%dE;3#A~WfNgmx1@YpO;PugQs)#SD7wG@{*4lfYb7oE+ZPUWN_un66zO$ceuf6u# zYrjE;_K1jRKbUKs{a}`Es9ujW_9#tu&I@(3LKeDVS551!EV1sWROenBaF-q7>&R0) z2_JBW7`gEEaCcLUi6dC@UH)e+Hh;VkwrmHP6ywmUo|$sc+Jj$Ati*4g`rwxBJNjv2 zR_nr4hcKUA7&l7dwAL6{y)Qx^+h~2wqDOTu3&G43%F))J$!bysK`=+cIhZtMhv}z? zx^WuBU-Af%g&@uODuij41*B#M_ZN6&aFn?I5fsF>TO^HH7e1Z~8~7aSDs53*`!?^; zOO!A#=ngQ7H%P(83K+Ac%kfRp%njc8D>)ItVIbmMXeA+J-M__V<Y#|XKgY~=HxE)| z;_|3!#4PA-xq~q($W@x5Mv7Z`Q4VFEG7IB?R0c{FjLTo;%zaZ+wpwK;*ROR_hJ3`% zVws;H-jw1v2kC0fV{@_$15FCnbyKQ>p>#{w;6sN&rYF@tF52Xq-L^CGIJ_v{I!dCb zQ&Pi=qDbLEg;J>Ep(FIf_4Y(5D%lGPnQRn*Y*8xhF;ic(&JBpxsga^}q=-BcHG+-T zlA~S-ekgY-C8%|DB*+Shk(p?L+7lAw>$5qbsjH;4$W6EjOb6p>g?5A(?~7Gq$Q+aT zUhH4);r6o`m{?l*I7R+)c+BPTYIHJq=V2?w2X%_3fj`hy`|zpTdR(QwY>l)Kb>;n@ zH{Reo-~qm}E?l3bzNLKSK_1^?3fT1DC7JUhcIwy|=A2|dODbExqe~IS$a={z!tgP_ zuH#)=h%NOjv7u!o0=D0qsA-9sJIGcp_NpzeWMuBpUpx-2Um9&bPK3f?<`e*9<z(R~ zR(c5;G~*~raiau-I)a;FIp>OOy2&jrC*kD}?BE05=+(-v(UDR;N!g<#p%&Xv$Av;o z@1KgvOQh9-G&(kHub9G{-SFMWZ~Ku>qbI`6A{d1ru}1IOH^aB_=6mqyCNA;ndobIN zys__C)pU&^p(YrJN#-BabU1;sU@GZA(9M#p62&xJlT6x@<R3w%X;14cnQIeOgA)4@ zH+oWWF2-Ec!?<jJIWlGc+5|FngIANx;xr+>rt-xXf`IhROMcA~b4s8haeu!lNm5JV z5)6eDu1w`j1vL!_E6tCW9O;t3+3;7&CAA=vV@b0oDZ9PAs|#~D>47uKJ>Im5f<TpI zx1VUrhkDGnFhCMFMt2?M0t}%0%*cLghUX>Gm@r&klCQC0bpw<pR%_mx35IkjZLjUp ze5Fq#BefEed7QhI&;IE7DdgDdZfMO8vLNPGz;wSUZ{2PO``x4>mT;s3%ULPu=?`;D z>}GMnq`myQW3Fi`J>xcDrj?s{oYF%$iEjO~>yl{SINQXn;Y}-7$YTplEA?K`IqMJh zX!J29F{5zPGBUjr5is)QkJmM|I8w!~MB=f%p>sMRvQLTF4hsYCHZ(Ah_%JBkk$GqO zaxIT4PQyplow&m=iE>Y5S+FtF=i4fee6wuoTTX3iOi5)UuP_&Oc3lSa8$Tz)J(SbV zu;A;sZjCG@jY2qTjtUjT^5^0OU62PspcmyNwBa|#O5BOtkZ~Bn?Z{f$A4^)2VBy>_ z&U;wNRMK!zo)T!CK``U>F0Y{@<nUH<6Z#>^jRp8#&TlN~&9>sgmWO=_;%?H$_1sfX z@gL#dnkFujIQRGzuZOm8Vp(0l9jnPtN-J4fT_s#l5^XY2a5CeQq#r~{er4rB59i|+ zd6@NBH&|NDxm~uidi?Sqm`$gBGKb*$Pa<ySSuovvke1Fjuv846xO=t6H|>B_lbju^ z()deplT<TU4AKZx0IXeGYf{VhBaPb&N*E%J5V?;-Y2;?IjDyq9olK1gOnO@JOM3Y2 zGrEu-hVr`J86g2BQQOo<8ZNg+ay6CELrK`tkG2W=`VBqI*%enDSzHeL>U6A@R$s#* z^ftIEkR!j3<D8onhjia66}><sv3`A$tz)K{mR4>u47s||gGpeVXh8eEB#+<iLazRz zM?pXIA;zFHyDnWbctgmkfy)KxtpcIm3#U%>g*N>ant)p1k@-u$N)lnNTdXY&Dt%W( ztkv!g0>e9qu~abXSPz)z-e%g&t#HCP7kf6AR(Bx%xtJfuDyb^gzFt<?2&<zMa>;^; z7zY?QAdGX>6UV2i?x0jKOM2PuhgvGo&80>D%hw}qe!zNBz|5AzLAS^m3^x`7Zb@4t zC>8EYW86gcO{Oc5h{%(H`({m;5r+Zu1zRs0y~`{V`^&Hxicm;2`S!)N9D%Y*YN^T% zTdS5Yt?owBiTm|8yFHnCr~6Q0ft6xBw~C~|^s?U~CQ~d8e42)d@iL%@+SU^HG24pQ zCfoR4&laa?EB9Kax$Cg{U|By{oAdRz$cSF(k=_20#Es9R>LAFA@N>Wu7h|p@Dkx2_ z<p{wGL>Q8)Z`5^}P?qgK+UYlR537+Gzi;KQ5wB1gVZ&Sb*IyZESUDUO-(WMZ1`S2c zT!@pGgp^QppbQgBWS3F_APPhDafi+w07!2;-1$!q67WOR1_9#oC*FAuqA@hqgxsQW z+O%;l9xuo2X;CpvoDExJCa?S#b8j^&Su|hY_J~DoROM#!*FSspBtHF7up2M*fHJQB z5B*9HY$$o2ryHSBdVXcsZHGoT&ud~J+QZM>EM{u_E1=4~4E6`;q@lHlFviE2-MU$$ zDszm?N*G1W`H9{oOi>dvsdFbUcO2plJPd5-tltOTcD|g$3(R1lx8_rq=&ku07`_^J zV1p|5^fVUEe9(GFukTy$ELEQ~-8s*h4w>$a82=-|Zm+8uKeJ7`vqvReVHwJT8HVMy z*q9EEs@ljyzC}}w<~{-0UQ&gk1V(}^85!7W_F}Q!(@l5}9_mq}u4@<umkyZ?wUJ@o z4o0+=biENjH6<K2`xkAZ0;Ts@i<DVQZTQZ+T{+7k8=+l3%oj|^6ct&Hm-HYJUwAR; zAD-n;s+5S7VtyG{-AS#gFlCEpf5P#XY-2CVM$mju8W{yx)g$5zI|KeYXl@girPb<# z$HkB-??9L>VW0;#6W|{$`6m?$9tdC|4BrUCCd_|i-Ev90XDvTrKQIe!%aiQa%Pyxt zxx}n`gmuSok|In*7kmX1DGa{F9|XBtb+J*9*_3N9!_zRcb1zrmA`?BBaQ4~fEzC?b zA9F6xWc*uOK8bun7Y5}XMm&~=3FCGv6okT+SoR72#pO4v@yo&0b%F1>{gv7NX}Bnv zK|AN#U>GN5`+4>A8alTa>B7l3=#aCaR@cJW>#79$s-TmAZWUBx-7@2>TZZAjDZX_; zcMxTc4f4pc`b+Q$m+8+qP0Hpld;J9XQJkBF<Ls#h;39nMI$DFIi-It$vbH>zo22Yv zG)Dh3er<X2Splv=EaLd#KM+b6FLM+MPlN*;3h>Q9(#sI!e{5YgBLrQ{w>?GK45x&g zq9l5H0L(?e7+p=Rz-6ksz+-}@KskbSNjW2>oS`$XB<K)<j&RXn6(b7<y)Z;-HUk== zOjeCh=3`7_LP~#P*(K-)E%6(+k33n5;GoHNeGBCwTW~&S#Dp^Z;3<9^DY8a(CPjuH zIz`sd&ZNljL!@XKnO=zwmi7S-AfSr`t6(E;K5KgadiEn>+20HomHpF)j~*|I{-lkL z<<KqTp?PUBpg+Y#sVHz<(@;9pWWZ>Jv$R7EsTmxh6w7lbfI>9Qmq8={iJ`|2X@Uec z8K^w@T=_e2oRcQ}QZoT&8L^uZsA7nq4(A6Qc>z^GwL51%&ll+~vg+ve!()LuGJHi8 zvlA=+o#a7WNdu-CY&v~oH{{}p`_bR57O%ejHv9p@$ETW1(6joy2B?X%FqzLiG%bkD zJL;IqS$M*p+h0=whY5734>-i>P#bWF(V+%?QnIn{k;c9Ukq;9sUNcTCn{KROW`;aH z{LF|iJSAN2Kv!th{2x%%keX)?n42Y2pUMES@0p&fM5IrlwQNZDR&L1sT?T6bCR;f$ z#$|)Nzp8@8$m|WAtZ2^%mOUGCWWNW;?Qq;Vk!y&gmiK!t)wxG7GO3JWjx*A+#4`58 ztaIbOO5EcMKj7T3i9yZ3sn}LZzB1&DhS)-!A8^suNVEwH-|XB{6A+ZnjD|+R(kw(* zVkyydI2n?TFE~D`C*}!?;wt*um=L{8wl^(f3MoM<p6xHo4!n%apM_T$x56raZPtCM z2`&g@n;?X_&)~=)dfm0aUS>XMWf~x!4qb=ho2CYm<~QRRqa~XDnn?P8hj~Olp#mDM zk&;+?Ju}k$m0D8@pQdjjgwS*cgRT(kW>}hLMAGyQrO6~zKofFYgB(m1c2(e8ghYwU zL{{Bdk=f*7%%)eOotb4sHJ@aTzR?Iv!@3E`OK*CKHnh-Ne1++Ni~$72)Y}AWN$p%? z`8@g?*R*9}yih;00+|ng`-U}yf+2^tg@PeRW@WJ1kqWa?TV#Z(MbvC`q0pPccJHAr zH%A78j*wyo-C2@nRSar)B$hRWXy#ld%lc>3Y^1g6)6DtDkq6yrnkz?4^MsMpjG!Z> z89{fN<_ROExjAe{xWQkS>|GP_;iZj%Ud;tT^Q$(K+6-p}Q}uY4yfCNYC#HwMS<ud_ zwXv3A74K2GzD<XS*gd1$8gt)bTefX2#qO^z*!ogP1FHlKq~?=p5Ph@aFcp%P)~3E$ z^&IAE+$Vi|HAugGgW1pt#m3;#ii{^Li~FF*P04%kD;>H|xzNd!%NlGSj#6z0;WBc~ zOfg@!I9xC_PHxUH|3vOIoXY0pEH$s=9?HzzT#f{`<XB3?bVRzAl!&|9JaDR^({fOR z@%R)EN)Iyy6QL?w;e`LZ{CM*L%*$ZuZlhohY%N?}j!cF*N)El^XM-a3#QHyD&yLP4 z%bvT{YVi7s964=fHu$G2LoC~q`0{HiICY|7bnyI6pABvRj^qZI7XI1fLM&Qs-WLo; zkg~W4ob1TscF%yQ=Nd&NZI7N<Z6gQ#iPa8#hUTWYCpA1j)uA)2705F<xr9#+v1;)v z?Cz0Yz3M7WrqY31NT)w_4;q~J(u<H`ZvDkundy~HxIcq7a^WZq<VXcA$FG!>y=yHv z*rKbLx4<2_rtqWNb5f8xd^25cuI%jMY?{Bhbe$wPw_hp<d-o!)8i8xzs*#z<YbN*S zOe09nAH$!I$mLHnPe-OmJ;ln#O$II1GnZGE<Q9V6&Xvu<%=$)EK=$E|B5sd1zjv3- zJS6tvA$cqZZ^1Th`ofw#`OWzh-P|P1<DBY9n3w<3u5gZ<3L!i=G><cG?()1Cw(jBo z@};OH5);oug~LG%EPBEzjqQY;*!YFxZ_v6}#!MPqgRulR?8U0H-LV~AIGBMTsW^__ z-HUyb+3+zqe}7}RrL<{Fp#|t#itNQ}<c2(*ZWRUBBP41Q5&dJnDfOhYds7dMSpGAg zztAuHIp98#zO<8GnG%;LJpxWGs0UoZ&N<P>+*ixwa_1IKh$fb0k%S#Z<2t&DOmVO& z3rtJ5Qs`Y)=FFm|s~b&to8X{9-iWNFB!TM-I&!C><zOpX3-x$n=_(MwFHX_w1S`MJ zYiT(z(@k_m*ZfT814Jiwd?=HdO*H#`b8pGKn<&#c@0Lt6k%#?DnX^Y)G&`QY1BycQ zlyEb<xir@$W`e5>lEvhOyk$Q?@Q5tRq9%N_;N`4QZnUy%5`(exmBEsh9eCY+s|Juz zaJ(s9#}krEb{#zf2a+FRvEpzt#fs;?02e;b1et_@-;;#jOE0qKx@RmIz{di2x9MYy z%l(=r?zr6h;F4a+<tT`oue&Ad#=hl@&Z#!^(Wq^^wk2t&dzUbkpg11D#3<}|+6Z2} zpIHo^Xd(MOf<P%<f*)1<mx$uOB#;91|0Ro)z7VD_$C*WLvWH-Pg1Ps`KAQi5@1Oe^ z+;*xGH}z;cR2`32I)D^V44GbU9Jbs%&D)qy+AM`fpskm*v5ECo#u*}d<t(sy(yV{F z6X`~^py<*$Rj`OjsWf%jg!Fw217S9$;&d^-sT%pn`WH;vgDK`WtmPyds4*y6)vEP^ zsa-{B#vmIY0pD0O1+E0FMBP*@7%RPT{-8V$2#Zta*mckWJD_Iu0{5b=&O$*rf3ZiB z_f&#tr)6RO;L}<i{<Y)DhIK3)<=wKR3ATsafVmtV>yu|Uo*~u~KDOe2*~ctW+BFqF zb@BPqaU=s*S2A8WXvRG&(geRyb3^$Xb0<TSpu}}TM7j)<qcr)&!fd4NFWnVvrpDbd zT$*<?ev6GCW8>bV_ZgzA0&kmj>9sXJ|0tBaHM^CTB2~vrFXDogmiZItx}zVs4wtQL zhX*N4f_E*w>B;mg<YxsP;a{gSePD8LLzPC7i{V9C2*0y>F+BZnxET+#GpWD@qHS{W z`Vu*=B-ej>3oa@)CGlKq`08^pB}?7a=W`pY+s$?BZFbfi2bjZ*&VNcMlwD<LC2e?f zDIqQ!Q%PPe)R;fp1b9-$CRX~QB)c4*-uh+uQzV4>I|oxM#TIF}y-8b!xN2jsp>#+~ zC(Gg(pH&qZNa6S?lHUw7EXEk9wB9&1|0x?5OtGEs+(L@ACuo&sW~0lscc?u!8FLe0 zGE^tYNb?@90rS2F(Q8PDeQ!EU(n8*qP{TJhIvsJ>3`bmRUrz;MWVe?rT5O4xyGP~b z3B=Y8YnpUe(~!Y5_8Fb$OHtH{uGM0x6)j~%qDh2;MAXiAq+Cl<I1m%YWH(m?`IP^x zR79$HfKhx12SaUEC;v}XNsWT6dLfJF^y;(y=7zmExAvgMEA&_j3j_axQz_y47V?WT zU<vE7CV|-K$Em&9pI7mhUbsr7UziqW`ogLT&{QEbRZE_fH$zSp^am~x;tg>XNU<_s zn%}G$G*wsjGKne}?a{qS;dm=3--aQSRU`{BhqP=;Q7L&LQ4=}}TR$9mxg9PIrhwJ- zmJ~INi2l@Ub-{R<_OG@QU3UmHlp5Pm-U5*bHEms(S%avit+;eXv$^Q{i9d72{Cx6E zqd_Ov=?G1YoKUHC*bop8GM$Y^CKd2I4f#Yio<#OmAz`<4K{M?I7R9#T(nZrjMRRsw z45pY|QO+HvD2#%eR6u$&U@cl~^8!j>GhAwODVR6RM{2ixAC4&yBI)mSxe&=mTl3Jl zu+^C6%GeL$q*DYd<##1%TLKKLM5!X_^a4lu#luh@#bHx~X^9)|HRGS%(6(Yz>_&Wa z7Q0x(a?j>2$M*02mZx5RWv-YH%Sr>(Q;Vpl#5(>=h0y~3xBC3QW*GiMiCuz$@7oa! z<%D%Yvk?2oUuDI&llnA;rG5UffUWlF)^@Fbsu)fwieSmSG`mz+_uLhG4_1S1S1~q1 zQv}OXl34KridZ0{q%UY4B&I_oH<A53!tEw&yHWIRFLORp<-MNWT=%ml2fM9MyB@H6 zzAM%W7OTQ9mh^zCFGT_7E<k(B9fw72DBmRy_aNjj{UNr7#;OsFa}Q~miO7~|g`}tO z%nGU^4l>hN&j7@f631Akuad3<*Fj6OhA+FN30~KQ3?$uZ5+H6XuEOVMMW{EaV6Rr# zo50cZCQwGD`T6-Pk=BIWO)ERFUGMs-@`*_*xl~J-_r%l}+gvZZLj0eN7!`)>i8hAs zpu|c#_@fp@jn(5i0Ee_n1u<YfccStYi;scPj4q0wny%Zj9GXq}EZtZt#I97Nod?%| zo!7LR@zFQzV*b=TErs+JS1-sl)r;`0$gBzN00%y?+z(;HcQbW)X9qZii{`F^14lOL zm9cbDFHpptVRF+Ws2L8zTbO3B@$qgXY>y5f)C}8q&;@4Z5|j>7=cxNSwkZZ(j^94+ zGeSL!l?i2;$bN!jVsqV@FBxcAc<2<8aklAvQj`}FhTWLcm&)9Y_-<${!Wc0$E_%=_ zZG@4+&>9j3_!L(U9DQNnO<wi39kiKBYGx%tBHHF3L>^KxEu080i_M<9h1)*ZnRHbO zhtaHX!}tmK$-P4Et2DKB?neZY+7NR#Jh%-EE)aq?BYC{->Jog<c7hfd6;mwhr||fG z8PY&H^>QuzY^htu#L^C3f!Gty?wrpUyTSN&6sq0JyaB0D`rAX23cp$%0@NeZy8M~B z4p0VHEEREJP%oo*5jkNO=MxNpc``yvQqHcMMCaPfu@#Y5Od`lIf^DH_fE;cQ(h2wq zlj^T<`~YFzQ{#v1Hfe%pyoGYG!Nk*jF(?r;K4&Gk;nhy{JX^M>`*7buLoL(Wl&S%L zVayVWWiI2Jh(T7Ue?VMnQt1^)6h1It2_h+a6;yJGEbj)zS6X|w3A}K(WResl)OIky zDsDS)42-%`y$v&&?#f2b%<9DbjxN3nsZp3KY_GdZX{}*JfG+lLyO)xhrJPU2v0QR) zzN~hpmUP$iLV~U<g}Y0-XUf+_hVdR5S;dbk|5Y$_|4VrAoqkEQnMyD7MuezTp#l3# z`7TXz0US_an^GyX5{}np+zuUsOKz~`fXhILd7vM&Y;zi$?2u^T<*bkZ8mzr(?b-1G zT!*Db76;3Rh?36z0ZmXQgu`Zso9}KTH63QcROCMC7YXL7D^iUF?1RKIVG%*Bc5sEb zwo^<vemNfqXPPwEn^?St5A-6dzEldB7h9wlH*v!);DfbZo&rluC|;peOBHG*rQVl1 zDR2#K=QQRqXEOm78A@WOyAu@v9^h&AGBc1$Bl4B5!5YuT4==})dJrZ1ClojLrl;lJ zjQrtOtBe8Cf?eN^rk&$Lfk{;^0JEv;I1cAtQHYlLb0G&U2pI~xtbZ}*WJyqpYI<4! zA}ZWQxyZ6MFSmb?9{Qb1GkY;-eO+*IT7-cVe5S&kb%RNr8LH0Z-qph5U>0~<el8Lz zD$5K}Q&N3(I6wU)MNe0iKxJwE2wQ2z;*i@WodBXbZ6{dNU7=azR!M^W!IEwL;0!n< zD^;|Ap2WAE*LjxMp8$2knpIdIjhNSAaJ8EKbVhexM~Kr#i#;R-<Y646n<VW7Ny#Ed z@n=Rru_mW86H}EDs8_U2P1R0X7%$XDO=nS-rGA!NzaEZBgJcOYs;Tg2r*0cTN~YR$ zB9{`Av@JFn>P9fX9I>ecu7S}=t1Yr+q|P+qor{v-Ow;#<A#3_mAfwgaO~YYBYgs=o zcjbs!_~+{9o?+4|qA0P#j>dMQpl!R!sM)(2za1QDM{Ae&x(c|vaTtyWciVjKwuwW# z@4&=c!R5Av?8@7=44{W>onL3Oq-LW_7ZuxVdvNIv)QlcnB6@m&@%_2QEyK{nS~7wt z_7I0>sBsPf&0c<V)fLir`93(D5a@k^?g3k#MKCFao-t}J5{yM%3<`tlRULT-9^ENw z3B~3a8iFy;P8E~E3Fvdf6dfvb5je&Z1U>x4KMDuzTOCsJ16Hq@S;YssaJ%1--8Vkg zA`X)2W?Wg&>y}=xo8>`0bSJVmVQQZRW=JuG_`v~ywspmU=8nCA@Qi5jdL3b?(a&RA zs{&~ehti@$WLoMGP#~~*OxeV0P#j8Y&0uM%horRzJXuPDY>7=`YvC43j1G~6sYigY z40zcAUe5Dp9{)Z}#Uk?_q|ZnTJE54ny#>N5s&1<vOBNk#mpon_Cb|3xAb}4?Em}BH zh|%O1@Z*x~W-eY`k{_=hrTjpa8O$&o2J07wY=%;qSenogNQS0DVBRxHR)q<>nt~^f z9VVsi&!cfc)6XArm;~T~zRv6qEuNvRgzOE~o#mF1ArMuu^}A(gKTj-sE>dEw3j_R$ z05K;b?BK*uVXz=k*2k1#C@Eq>V#P0&wt0}KTLI-b837uYx`3Dt>`bOxB6~ajlG0u7 zS(eJ_5PP~Lb17<tf{ZeK6F=0vYN~2DpWY;_T~NV5{v7hjEN%syw&H)!tfDG+#3fe? z`!Roo6^^cp{q%I5w{&rGn0j$q?#y9W%Q}NlE+V_YxgHRdyFg#Gx&-sr{rE1Pzm9l6 z32GZ1i`$fg&5Py%Xbh(PVG+j4$cHlCUdDzo4cf65SxDs|woF~<dR#yspg)Nkc*D_X z_AT3yRt;?|y}Y0sO%~+nBY_o$GD%xHF&Sn_ZXg8vHyh*9gQY-BHHi^b&6^<c&1BHF zs}tGrNR&xo@>mB>^@Suxm|>tXpsZvNoU-v#q4=o?eP`aXf7Nd2;82y@mZo)92_s>< zaiXb`oWx7SSE&xEVu-{I7wQ*^&;He}>J&{L7WbHDGLTb;6f;R6&~cAE1syGNR8}J@ zq<VhJj@-LW2C5Qe!hOz@J?!gmte#9-d2yqT{^JX{QqLyDUUV|62C*hftnyr|&N)to z^1KB;<O5<)qb9`f<dv}oH5Y=UTdv{CBu+_zQ5+IaLQ0{!00#zTix!GI!ZG>Bbun%T z3Jq3k(|z2#%du+h{5U8V3D4cEL^8Nsc5TPD*vO4GfvWs)Fy04jJd=Y&F=JdNQ56{D zCS{B}E&rBaSbvP`f)|W&lSXV37;;(~j*@b99ST0<$r327(mW?u%+`_I7Z4PJ_Dj5h zYGaHiE8AHpH(%LYs4<H4#gc8bFsRnn%CEJ3$j#ux@&0@YZ@9ff!s^X$qCQ%{q*gcv zQt~xOTc}FgqN)^*K@FmF7kd2(RxVMlW_f0`7TKhk4PC%APRDTK07kBP6B4UEwkWA8 z_%v;KzV8vpaa{DxPEmsNIptRiC8P4&=G)Rcn-GTvbr8drP8uV;<)krJ8kcf#Dyn5c zg3hAo(z)Ci@qqO5x)B|cBgV+{q{2v%^j%It+ZN|fn?+$XiNdIp22X{dvy5^uLKVhL z&B`i_8c`T2qcCO$C8IBu%nsmw-Ne$bl}kB=8%R^<Dyc>rg%M3eC`r5Y0({~a7_EY@ zE?<t6wKsudM?sypuWTCo>TcBfJY-BW61BoSIyf9?%l%o!j(zl~ip8#1(x_FlWxn)b z%IK!ta_C~M3$UUovFtJJ#TxO|4x3pjAk@?vUq4Olb-+_2yduOR&Q^?R%(TO|Ss0nU zpqP>EyTwS3X-7q8(Gp$6X3$wKXBzR@ZG?XjeyP%42Yhz28wWk@psOi&lS;197;vV{ zHg!?+YJg9vD7Vu&Qj}juy~gW+#rcF~GM19x4S9tUo(W@*cWi*Ce9@!D7<)6Fu@~&P ztjPe=O6)yZ0%?Q2$9oZW#yCLra=$pXLGbOe6f$o0M||+3x=yOW*D3~|*d+2Up$Xp- z3LhX$*3VqrE3G{fjAo2JW?LUH`ch)_wdA>DkbaVd8huIQB*E3_o4C#_Y;ZZLB|ixv zD4yxWb+s?imQ&-3-D5x4>v}dbB1CAl7Y+q7_mKlpmo$mF#Dgr@OaU`U4?@T=7JNTQ z**1v@-pVlCJ0H(q#_t~co#x05%ta+R*H*5rU^oy+&iSUM`4w`2P1y$Rn^hxrXsdf8 z#jTR~AZmRWX(l0Xu=7g1`8<M%n>eIeVK;D+{6HKmO0UH88#FnRQowv=e!pVZ@Y11V z8eE^@vxVdxyZ0nf>k=_*=JVFQkAf%RY^xgXz;O+8{7th(#2T{DB!Z?YGKf(K3Xda& zI9>=W6w<4<PZ*}d<BZrAkXQ|kx;QX814OJrNm7NTd_;LFgyM8>42$dhKVts@CLzKt z4if>zBP=)uR?<hff7$Uf+mGXugY560h5I>*rn(T;F^R_mMrUD*%wTFbnP4h-mnWSt z?viRisRlVMz;-+h^M2#d5^MYu1H6u8$m04Z1`;dyx~JH>)5O-Lbv?~nfWauqw_FLS z%Ou8rB}H3~;2N0fP^ok~C<A8*-b3Olkf|`g;0!?y)1lls8J4`r_8Jg3aGK+6CMwOx zZ8nh!7jB1<x~&S8f>S8PrGRUo6w*L<BR;2(lBhnrudW8))lyevFXpFoh!@xkSwv%T zGXaUFnV{UViKS5GMC+R&7}jd`$5n!hRYhDBF6@RZU=n(_WQj*su<rwUnL6@O&`0Kh zjg_5oBCvroV>MuOB`pGcbDgTzve!(9OM?_i_ZRH>Flue*+}$KFa2kYjaTWPPNU_YH zuqR=!St-_dWqt{>;$E@}>82oC5jr+pe<RSZXi|GlzqXO&4m2V;lOn=^=k6<#Y-_x8 z)!$Cw&IwgwE+Ikz`7cpXnl!mkn-tCRGM@Siy?7;><>d{}<1tR_j=O$a@CXUoD%|6~ zJ6=k&?($Hjs3DMO_5h$9tZ+FnQp*zfI<smxlF0$wlms~=KWgxrH93H9*F5${f$Erf zus}&1TAYCDf9XY(tj<5umK>@)Xy#3b!)eue{z|LxH&1fTs6LT>#>{x{t;)h|j_QfM z!N}C!%*<}!n(5cii9^*7`rvwR0T&jVP!%&5x`tIZR4fq<w}P2iVRkjnL@P}hz1V8P za8ey9w=Ohi`e6%cUp<wZd>j1}f2T3S;@(<YGU#)O>ntK&reGCr2Zs{Bq-0Sur^T{h z)-xp-?>I?gKJ9J<pd)T|LOW`f$kdwnXu$_hHE9P~Lvs<uXy)_KJ&5)6zxX^fF0yr; zX&Q<%NUWtOv6jITJ8!7Oa>sJ3+BcN;lqqe-5pvN`afe{Xf=dd^KLV2dY}<y+wiju0 z=+~6nA9MF&V72+C{m$E0<r9*s{Hj>1w2-9D7FjQiB}Lj?EUXA^ZruyDxw?xsPl}#O ziZpT4Xc98?SxEBUq(OEN@2vt$SF^V=<6wivX}YsCPma>UN-yLt&uTP1F=6k4<nN#= zf!DMJv~7+KdLx*9$F%~>M9n%QR#9l47ToV7ni%6@+NT^l>2(Cophq8NOi~8G;L`7M zofMib*+^kc$fkhqh>$|KitSKnQ&{&xDO7jgrf9{pdSZ_1Wp1?T^oWUUSWX)I2&C2+ zi*qxut{Nt;=MxjcVcTx@FvVgtU^uUhbPs1%zc)+9wIW(8IufV@kJ;aFvZ`|7hv)~9 zlrce2a%W-=uw7--`6Jv+&aNQ^wdT7HfP$&qfd$Z$k&ZRrzs$nLb*`^!{zNOAxq~%1 zwf@U<<M7FlgBbcFu<vF1ATF%jl#0dC*@T2TuJb2hI~k4>#ub~%#<@_U#d$m~q{S|w z!H<eZ%=eh~YNRPi8ad$s!5?Jy<#3Q6F&gk^U-p)PDQbeW%6<=_d~anvO~fHE5aHx$ z&BDVVWHpuZxyD|T-CF6cs>43cY5v%xW;h1Emh(AvB(B&()Y=`r`5YN~?OkhwRkpV} zUzsU_NTfU2tIk2rufe>LogokFCmBOyKP$UmzYAvnEQfK(B~G~gZ?7PhlaJ|2um3m{ zvN)JtpVM$jR9}V6NF~vWhzm4gg&BF(AVlPZpV$X_PKaT2da#X&Q}%Xo;<A#Rmxp89 zT!E?BAqyIuhB6nM<X0&1b{eWOY@&thKXU#l+&}S>w%1Mn6r>kCr@e@dl#*L;9#JGV zzQ^e1!9^HDvFeSu;7o>G75<RRHnoWU6&5hJQnHr<#qCk^YcEE32<=-@4<eV0uCpji zY;SdP(!Vlm;q2b;U%@Lk(bwkpuNAg`t#ET?;r{iNq1XvMmm*v7TgzW#&-X*DILj<E z$cgM5u(-cBSuH00-l|tI>GxJ<H0f!;2j()zV>e!e0jc5+1y`$cWhut;=gKAx6^nJ% z?&iuCU5ZbR1?r8qZZ!U8o~%*l$=VU3F)&Xy)1N1+VrIowkdnv}L0nR~2eE%rG(mWa zq&r_)%WO?oOJIh=R3cc#mANzNg!@t)>gdqYbR8OojH^jxd4;E{yj0a(*!L53Uz(V` zq8>3OSN%|Q96MsHjGI6r$I8~daAcwGGFBFYZEs~ZIi$)#1=r5PLnJsx4Uvp<L_xUH z23B)RMHP5kE&Y2HTxhUOrc2@muG-Td(os$M363?B7;C;u2Zzod;gV*osjICr)~x1O z^BkmOcAoQnQ#aO}HorVqA%jXt0<yvO2&r&xyXBqb;#z|P&H0JBtq?N0u-ggu>$cM= z+K-#v*0u?Sq<Ukf9cB?<)OgW!K`~crqPc3E3%M%JI+MbUCq0rW@8IEyfI4Z;vZ>@g zs8mpuhCkWMBm103FWPx)=!Kj&1?5~iqyM#&9-<)w+j_sJOqxj*7~0nR8F+-+1=v4& zHJCz$)I%WU#>=4GrxuK}5|ytC20~ytpN-l~2KONy1?jfpz{P|0pxelztg<!h2coqi zIW1>+J5nvmuG^8WGjUtd1h9KX=V9uk%_wd{OQCzS&g3Lz*H#j-xXCQ(bxo1E3};QX z;{Dnh>;amfY02#oN#5?QsU@We%Ca2SQD*5*c=VUyTWoCWd;Iaxd^?_3myJc}WZkx% zZ20QHusx3EE}aAzNF-wt4jLEm3u~f6>Ur|PB-4FkXQZcfokpx1h=SqdpguOBv2{s{ zNlQ2>gj~5;L$0`8LgJee#xMdhL<=jrp(#vng_6=s3!MMU{-E&qfeV-+A&o}~DIBAe zw{b31Gvd4}^IJiBSw0jru9W|;89&UzfNfBNiq+L-?E?|9y=D4|05a?UVdIB)4#iHW z!4%sNeuo%8>@Z6LdyCcor^XML4^=;djvwX>6^o4|Fn&1Me4Ft?U|=wpsSG<X$VCqf zOqVh0<AdA(|M;MKZ;cP+vIfows;!?nk)mRjkfwFw!KmRa`jd_2KbS@TKf|8?klOQ& zREA&yEe@KG+`Qh%;Se6@g*8L&bkInc3)AKQnmx~BXtXy{`A#4;awpJDhW?HDOG8Fd zO_Y%Y$0#GoI2Rg8;;bWFF~&KC(wMmJid{6ul}=V6jq$V$<AycHc@Gz(>^)=r|J&cX zJsoB(3|y=)PehXpiB>#HwBQ&eTE@9hw8VL&_BSkRKBiPKw1M%NlKTY3Fie_T|I+BO zYrM=!Bp&8cH_l<dL2+L*62Nqq8@MIYn^IzQ$rCj{ix{d%56iQlRUx5h8{#D;Jx{?y z!J^8THSTHSJaG4dE9J``MuBA4r&l5z+q9H{nyr>!c$gPc9-PmpHP5z$j=JDV54_L8 z{UUfhNuO=0(2NiZ16jmt9PB-Xz{W0TKj6VCXGBOs$#icFW3eH}H+miZ9+L~MkANxe zHb+9gzED?gxg<EAEI2wYr#|#ZcwnK#U4QXIygFSp(9z&VNX%hUd(eR_*;_WaO0^ql zg%~~RJE1XOsAsU;8i|%1Vr#Y`jI+xm<FHHuzUezC)BIb@o*jmnXc2q}a+r}$A2zF7 zE|*DDC@%Ob8wM)uR&P1}BwM{-32pWEw}8JQ9oXJoq_8E>MYiG+6m5I7o7D?9oLTom z^{MVsGFnO8j5o8B_5o4Kzf9&2!&C}l$aZeO8vi(a4BZOOxmcdKJRXJ{lEL<DeYn}b z93YJ<Z$*tug{DQ45$0BLaIdVm#`y9u8Iz})2oz*G#M5--CO)`EE=*YWLY}I-@U*$8 zIUq~OJx{91R{CcDLa9<rPYtC+zy!IDQdS0A#8i{*%c!W9ME1`C_K3Vkl&nbJh0+Ll zS9dAFCBiO!zNJlBXC6TW8{5#kTtcH7$3OQCTs<^?n4%zRE6BdYmzGJx$KZX<ZMf`$ z^Y^W}?XVpoI4KCuXH{@g#e&lgo^^vUA~@~C3C>}|(7@7bBA}o>BslGnf&<q`!Ljaz zf}`%jcJ$x{dK6hgaLTRVbohdE^e}XT2^lg$1ScbclR;5<MkSNTUTUU<STYfuh>{fv zj!+sQIO;AXSY+8HdrKk`EjrpKk<Becx?qFzO}HE{C|T2nDJ#m=jdCsWCF_LYV=NM$ zbX%7D>$Ru*PBP`9RQX!*O-#FR)+NyI=lUR}xl8|Po@rQxN(k)D2$+H(TUSj1xa^0= zrUC&Y>?;?6T&~*0>c!@daGan$QxHBCn}i4^E_YiO#$}cP`f&YrNZxCs40kw28Scip zP}s#8k^;jF6BVStFIJ7B$4FJJHCMRzA%+T#C$j&^AozkBh`WJ2hpiLb(`JD?8^!$O zlCa2h#QJlQOjoeAM#!|fi%jb}vns>Mq_YA;Q5qNAhQ)>3dg(hSuo!u{Y6`^49ZK|D zAjFES#q(o?pZPJlLxuaWLzCg!d)@K>=aKxM3;vhu@tHl&{Rk#=Xd{ddG57e8u%ZHs zkGI0n9B)M(928jxuQU0-b5Q<|f9?2xSS0_)NZSBoPm5%%(Pxc(621{_1&1wyBS#ob zTpEH$lBk`?3}SRuZy%h#gtp$SV=MSVU2uDjOa$qh@<A065{BByo*J%^J+*a@P+kZx zIw5>NA0iYld&6-T6eCPwl&ap#G=K>hc7R#wvW6;@9mau{9gD?gbPZpyXqF7WQzi(R zm)g->m9G{HJHvHsSl1Ehm}g1D+l3yNstMH$Of2rgw>5+6kyTdKN1LTdYYREzmc(&# z%YE)7V`9`;tzHwVlA6dWfoo)ySogvzQFp15T9Uc9GSjUj8E(`;zCLqXEkjUAM%f<+ zuGD#%BM}r+k<mf9#9l6JLzj>WbqPbZ5@|2eN^0;PfV2r@V{2#}YejDM+R@(x_jbK4 zUZ=1~AWpo02l_=BXC{wQ=$O-RRKu}g(zO#pNU<~>Y`7KFvqp<LShz-Zu<AaZ_bH}% zusVeYjBVnwfM1_m1U-W6;EjD9n_^2y6@#R}Bqy~IssvKWd44Off=0}w?g%Drb)syU zWHxGUCd*O3wKyzziwQKU+(G&%zOr1V10q;nG#wzUjW`8q-3uF$x=SN!+MAj2PQ)fJ zlSKKDuWcEtt9zuLt+MMn2Ep(o#F+@zJb19o(V?fOsSeY<m9j$z@}e6OQ@OKYnuo(} zilN?uZJ=OhP2tq0-TNF;W|&Zk*xP8QUv_$0MyzAb7KpfW%24dtWIo;(tHue{Sao)0 zwYMN_@E|ui#~j0rg&Zx5N$pQJ<{t+CV!@eD?T}@DI;><;6auU8?M*gF5z~Aagj;5| zhB(j~$pN@Vs&ngJD2eJWl30Vhuq%~%t4*7vZZI->>mQCerb*UHldO^RyLul{;(Bge zvos3_BWNyCSVBX@h(O)7_m@O5A`r9QutmoNts&{Eg%s993Q-7i0|H})#yP>8ak?JN z;l8G@fYt^CG$}Lu;T~eR`rErTRx@~w*`7uV0de9g$21DL)ST`>o(A@C5^|dMG!(W` zt2k&FR8<QWhqb3+;xbLqYI_=ZW1C!{r$J2>bjNBR1>4J#Z9O7p=01EB3?=kC;eBvP z`dSI#TduHD+<nsT$Ju&@-)ol3-ps5X<*f6%CgG=E4fPLWhF%?6)xLq-gqg23!loxh z$BUJpdpkns(i#N`Fp6(OMMpV=Q4YW#&f;+Hg?2zHlowrULP^o3ZErHBiG^&FLL%!H zX5D5LYg<UMwnZvdxJD{g>t3i>)m@YqWv|KWIwr(`XkPvheGo#oXz1Z8Yb`<}(H4}f zi8Hn~P1WAIvD0YpE(B$nQ+CO++j2l!djtoH)U=c+LQSi?loZwi*s2pZhQ+F++n{;c z+3hm`8=mAEF+M5ERmK|;xvIP5iXng|D!QcxS<Pcs_^ri{<&ZpV1x44Ixc*1#+d*GZ zg&oqZbRd})gy>kvIVC<2C2`W1Lq$=IbwiE8!`wHO-vrz)5!->%h}e$f0S6*$;esvX z9%pUt3tC8?L2m6lG<`YyI}qOul3RN#m-r+D%@cy>0r4)Hc?(MO?Us9cuu5{>umWwK zi5tX97?MmOE|Fb^l8rifgVd+ZM}^2|RqkpS2)QFrt#FfCPTa6Bz93$sAV8X6w%-(# zDrv7Z$Wb8Q$bar6@W>auK!4s{{A_Y)s-u}(Gm>)W)jFETfBlB&X>CDJ)Y$WZP7B=e zpy4pIZs8G13|vH!GZb{>_H^Il>6HgCka6A=9IpmVhwL_0QS5%uNTd&v{tC%RT0PPw z!WW8C9iGLq7lX^FP$tQw#iX%UCGK?{Y9E%l8Z-U(z_L&hvYW@`-=rxZY7GmKBz;XQ zxj9E<y1o&|6~sDXfh4>1j^=ofavd+Y@sNbEqXZe631KzN2Y(#tQm|yYuNnWlLkI}N z{WD2sZ}!j7X;Z3-E<vj+R6oPzX}LqY8+w>SN+esmqZw-gg@&9K=kaiTj5q_bDwIRj zAUQO-`OZ*DlICG<kjLYDG5p46#PAfz>1^7vZ8OI6UReD@jbqsuZ<TWW17YKH@&7)9 z&;E+ah*<k5T6(LX5rL(*IY_iBaX0?p=xVBy7k|c~m}Av)Nw)KlSBK&xHg^*%3Bl5d zyRp<Ur#H?I@L28XoynV(l%CVufE^dRnL_N263ji{3Dtg5KkA}rVa3#U<8nwv#Gnbn zPr2=l$=oXBCY4H~LgpVucf1_2T#76b)!RdiVfHHwv0%(e{khfRi~76EV-2PIkPK}N zjMNuZ$4jq`oz$Q2WJ<LtZ=C!>0AW|GI$-WiKmtV<hgQPT-Ww`SsJB7*jfOP=a~x@* zymnIx%aU3voWHKFU!JbQ^}bnur;{>3<T0}Rpp-^BN>c(E6k<&ingv$G=j%qeXimH= zgr#Sc2sbuZLU_oOT?iX~x>qJ+K(%ML-*_l(oHmvQ=o`Bp8GGruPnDnq`>L5$=v69S zu(ZHhOoDWgvn}K%@~H85j|hiMEuuo^A6`_AWlMUP8SIYud?u1$2q<1Th!c-uoiK2) z^$X6MCXpa};%fdPwKm8?4U=t#J{&Nbo5Nn|Lcs5~9bIp>pJMv?_awH1uzGpaT4?Gp zy;%Ndca+FAr9(waWWS~a@c3MtQ5!-C#=PC#Ugm5P)!LV0CN=YMg|>d_<Ox0yR_@!G z)zKGQf<h#NZr$ouov#25NmJAsgp!uSQFWRd5amE6YT!wx1qO&7rWuR!U^N5QYwis6 z)57S$ly|gz>dT|LagyA1y|Z~Ku&<nSq^Cd3r}5SiV)Qq_U(i*{4lj)lZzD`<R!}QH z@Y`;F=b2xzLEtVsC-B>C+~u*pG@j@hphM;`!e<5U$BYQm*>yd1kp{HoIHf>5M3X2r z^D)C<-&|9L;vOzzWa^Yx(|FTs03XtlmYam=0NujPE?WWFluY@kWekK9J+t*kE@CTg zGI7<dB(bbPnzaT-V#}Ah2lJS`=qu}Ky_CFD8ft`^e_^`DWh@h+8a|-GRtW78W7gHi zBVyPZ@(Pb!172wI`eY$baxMkI;01X|@g`r$YfI?)Ak+qPJfqfB4mn+E-)c?On#49d zU#iF1F?*`4##Y%1G`Ss9F|Dv)nU-HUTB^6o>ql8)S&9wZRIhd)%AFBZ`pcn8|0MDX zuo?aN5Ns~!)qRGcW4C2M|0-o40E@KO+5H4@A-WYel>JyETDu_d;j(}F*ihNA<}n1R z1uGwZ*^3rGLS93O7<5B=B@_eoMzTRVD(*IbskhoZF{m1cwGI*M$2FmBYXfhDPQs)H zI<I~&@jzp&-SR&1z^rjrL>UQn;aIoHqiqN2`Vyk&xYX}6b$nvkSB%3hFg2`2&Oq{` zB2ail$(9Qu1;V%1a1;R(u4$##lNmw;UL5q9bT0z?1&n2IY}krWdDld|g}N36rUj56 zZ$5yf9k0dja_Da8mFgCr;Jz8Wwy`16@kW|FElo6v<r#&@{7*6Y?*c#n7HXh>IcAjj zx#p^Vme}VhI$py^F%E~2{h``@QL@tQ41kHd)%uH)t=%)!Vv2W9FadVQo=A446Usk~ zmJ<BLl#qPA)=ChQ>E1|`;Ll;1IVE@%bYM`n%Xl8cST7AVHdsk<FvzM6Hq8brEe;0R zv%zX@u(IM{kR=<e&IXGW2ZL<bVD&awd2ujoq_M#OjWOX-??V^<;%F%GDY&c0`ef_( z3F^2pqT{}bz)r{Uga2r&5QlW!4y0?78nKRh7l>e_-PUoFOhN-7Yjm~7{{$Tet78QU z4l|!W-eUGnw*p|m@(~<nR9^(5o2?^=20!J(jy<7h{wJu#D879&f^T#S@Qt6n={=xH z(@D)|fcd=!BbEYla-^E{<4648)THDOH0dV}hbH}bnJ*&Q`gl;2julOM2Ld}y$`Agd zCM6DO(p7<^MyyFEf{0zzq}xN*;=_l9WN_Dqb4B*o>symzgTCKgj*_VuO0&*cUY{8) z%d2W~sIFdX%L^93h%B%79=gZ$MPFbn+c&FrWo${HQmv^}77kSx3MKv4R+MCu7sp?; z@9!QGY}(@z%YFd&U2JRNk#1`sWzIXMF+U!+9nHp6h2%28+;(St6&eO(mOc0U!BAK~ z!ylVfwthlzc4%T^*%O$dw7!v)jd&QHk$f<tY3D|Ek#k!^TIz5^y<yJYmV95Rs#u)Y zoC?fkzYeIF{JNkb*v-6la*=#p@Iq!%sLZnUXw<(Nt$t@M_6xj*<-=rWXxek6c51FN z(C^qL+&8PLtSQ#s=cb=~8>(zaQQ`-xE(}y{139yyZ`S0(K$C4CEGp_y91oKg26EF2 zZWh09R<bZq(xz1Ir!=iFkgM)Z-UL)SRQ*5phpK-8e^^~A2$O=UK9N|q(kukfH&WFz z>Mjh>!!zYq8ybwN97VG-sDVc@Sy5)nF)-=e(P}zZ?Dx8AI-JoT$z<8L_YE|i;+ZDY zft_jc8&7dC@YDu#?A_$?m@h>2ZO9_mh(ErlRwP#JD;tij>>iZ(m=|yuO>qrdX7^Ww zs%bamDl`TVSyiE`$V~MMx^D(6{<e_&1smx8iDh4uhPg{^FkGlyVviJRa{fR|yscj- z)!wwL;%xnX!NTqzEbM{7!XA`Z_Rn1}Y*^vE46!0v159vt%;%zUY;w;eTb*|@V78iB zu5L<IqY#01vG1VlJfMJ`>&#rjZtL%FO$@PfZyQ$9<+~QLZ(`X}GGwK{^f^*R_FHs} zwkyS^7k}jwA{!b9`g$xJYH}!4K*rHhpDG|~qyysSQ6|b3Fk&GB!fREqGbth#A~2w^ z!DMWqI_rR9zH>@zBpt}rxbeo4H8Q>zgc_9ZP#T4NhtQ9RsAq8_>1YyV(~4LpisE}j z^+fS~lZVcTJ>(lfZtf`jv5FyEUlr5@hXfVt!9h)MXkyu)jV2gvGcVl5TyGYX20-!d zY2Cs4%|i;xHEJEkWATuN+l?;2aG6|`#O`yXFxh0V!@x|SFBb*<N4CCD7#=~h#TwBn zM#4YJ({A?=ea0{wV1lpF;)UxW4(;Nm43>|&z;7=HJ9jEBESL!k64$R|DA%1dLiy2S zB#Lb{MxVCb7pSa)4#nhF)^)B8AE758D^~Hk!DED;2&xlXx=mgcXoj9B0ZF-k1!nNF z^^=2o;;^8eI6T;%jz}!K7oC<(aWw7guyytxL)`%RzFXE=v7Q*^Gy`3HA+JVF_nc># zzWbyXDGAo)=qI}q#_C}O0yb(J4-YXtnkn6DYmy#TY#NQ!Bz*@0T8%KY2C<=VLOW=< z4r&^qITxBnBQ;6C5B+Gf8x5jtTEplv8*GFo=_Zf;9#q~WkeeHWKUQ^R>ywFPdhA}u z)uXA)c7)a<J^>PJE8~fZrPX@A!n8Yo%QHFv`b?G${Fhluq3`M1o30wsnhH1n<Er#< zq0k+u1Mfx0$&ykWDv3PWh0LU@oBlZMKo1AZ`tjpm;j**mf2M-veLHdf2V2I`PI-0) z+f;Yy2+rWgfB3#n)bXF|SWskFbo@st32X<)Bajh$!Ex^s_G^wS+NJBehqvfj_wkrg z#+qJlgP!%-9Cg;mKhJd`Z+&jp6Mg%E;=q}K9w`8NOq7FX2IPc>?k=}|=W_T33Zi?> zS(c)Wmki0`n3GhpT0*zoPU%?6ph*dwRUAoE(MD)XQxS_-OM-^`VJ-)}<RG)meZO|u z*QQs>L6rNdd&tbbKg+SqzkZcWQJ3uzCoScyiEWG7hubfE&qL<mm-z{t!efI;-0k5E zOjYMtxqT@=Ie&<>qr}~*Qo1h~EBwyKcv+U;r~^s*?R$<(8j`nU8xNSP@Vx`{2Zc|R zsxN#?tDE66y`Sx{U4Pz>vnTTqi)U0i_`7jw^_}vqr&|oXkH7erxEr#8G;n@rX?1_V z0lU-RV2^|jz&&)+EV4_21<Bl4bo+CcRx`B;+(Esfx`!l|ZBF;0!9AH?8QAikUMUB7 z{^{2TV)hRaa{zu@@jrO6!rbr>h@4)zv^vSmG+ET>i>8{f-+q;NtdIbbM0Wd*%*l*W zYkbx)U8?1XSPWxgmH1rv17d_O?{r)!D~00Kvfu;`nUT2R0;FNwz!kc2E5AFF32syO zg9H2-jCX&ApW%Q!xmr;Cl$1q$q6@+R5+B(;jI_|{@u#HgT#&|$aaL0a#y4q%0Y6AJ zdN!%zYRq3@(%sQ@zD?JP6TbV0Ot->MH=>gB<Ba&0<jZq6Luqr97R5Qcy(DvvHBj(c z7-mG_IJ2aD(S)=fO_p-Y0pVw@9FIj_MKzdjq*_=5FDQU{JYR{^1p3vXU$^3mr&ZhK zv??}<neX@G8?7wKtl1g{?d6*hA#F9wl84#6i<ArWLebGmbE&)>ET4=_0-9hgKGUJ2 zYs=xHDxe-j&BPZ~K+60!@>hz6-@ep@Z2ts^uRHQ^D_m7j8moEkwA#y*=YEF9ttsOD zMt0_Pb9RWTsgn=3_O*zYxO-OYlnsfM>(B~#wjImCa)h1!#px!NUXM7o=8o`du5?k0 zB#WBu+BdyYl^mqA2f=Z|GVEYW0%aRx)zmfiZRVvR4BWS+NCH;*;SqLDZ#tG62Wsg` z3j0!VXzaEHCr6UCzmP>`CPF4`61m!v`#mHwzt|;%6O%}4>INh>d%;DxjJUNsb9H-W zoIwk^5=^SzaIrq`wv~t2FhqU}nV(dJON439e(x3SnMs1KXn$W~Ss4V3GJqdm!ZQ2h z&Zfwc4bfEMh<neCh%d#RNCbJQ&TWJ{WW5dY!{eDzHQaSrdSy$sOr8d-KV!uzizGm6 z=I=8Tmu1{~dx!-Qgh?gr=%3qPfo6&hrf<Vw`9pG($Rhs+GUS|dXI;=Wjtv1$UVcBi zHME@d_Aa*EM!MyWl7~rk?<Zxc9?e?n30>e@cb0EQAxSxQFMP{xE)}kE{tCsPsrMPB zyv+Xi!V?-3KtwhCy!<u!4~{gek%qHcj~ARqR3&P$x@cI^w~2MS925og6{(LhU>Z@j zf~#0-&zk;76H=yPX{N=UqD_?Av1%=v8-gcM?j&`~&CG&c>2mfgw4-YnvBoJ6)Uxo< zk5!tV6H)fEMF%mV8mNN(A{yxvLq&NYby8FmB$veT_u7I&%lYj&MWyz&bnQJ=C{~e{ zwtM~ciIrMasjWO&+=k#DK|29$u{-d)W#AO;ofjNs>yS5~-2-*3%`v;V3|wi<{S+=X zQhFuctKtnC{v93AiFm|wJva|myZbW`vrVM0tJ=ohGEm%>8dXBebM?r?YB-!tm4|OS zv<xk(i&~6A6a9@pE2I>sY*_pOR!oNuW&i@?4?H9jF(AU(?!aiMn~e~EaGd;<4cCs7 zFB-b7L@g{)TjFk9W;Ca_vLTn@y)8j?#6Yd5@;ZWRMWMDHM~wbt1=t~{1PS<$Tp)I7 zxAK_aKM*>=A04XmS`8#Y%SqBlhQ#TWjT=hX^)-@@K~A?@F8)Q5W9JBej4WdtI4bKw z<VJKtk_gOJeuqlIYPL!6bv%g5B7`yBav}dsO6YzTC9<DGFyWNpU}EJ*;erZT#2k9) zi(4N-1Y0`{IR2dOOWbeqSuAlf#SlnhBd)*<CJ9cIlrTfo4{x~XjXg?lWXR;rV+@OO zXQQ@Uv6UF66eM?Xw{5sb`Zhvr(ILWj$zdvcfWkic(P)tr8CpE0AWt2qgvrhKQ`pyn zS}Vvf7qG3&x*;Xn57t4%(C!pwEUjN$t$}-aQ_2KiB5X?+^WoR@Z41bYRS4<}zBNW$ zluI6t*2shCr|h;4z5Sp9<OP&dk5Fr-3G7vvR7S1vK<RbK2C8TcJ{Q7tQHN8ngB)J# zG}B@DDwdN|;c6r7jAm+8&2*HFt9psDvz0^zo5OwhW-ZXu>ZP_}^b+|7y>zY!np9ol z{;_4e8K<49s!c93Q2p5MEu!7lE*gZ!LObHBgfb$O5agSxC%>BQ$&pBsdL*PSTUqI$ zn?$6rKsJtI?Ta?3m7+Pu4_EuyhdT=TB|D|y?pKofPTo_AEDP!z<q&(rQi;n&){-!A zpx(Om^>k=wo#GrQPDaCTeWvq+9aeAHfUZ|}BZeO#E!1GkQS&ccpJck=RJ{}r8EB}k znZ`P_K2*E25eXNv9Lai_ZL>+--J5|JowDI0W5pfjSZTfkb&~RM_`T}{(AARN3O=d= zNiW&ZimnQsUZY6{7pS_t^KX`j&4_s1PDQkZ-Pps_c^zw{)f81L{``(Vv&f0X6lx(! zi<&YA5pY#dgYPyKlD^*MF=%VKLIq9;mtFS@xOiRVxsS@w1x|gdo`n-5=*8UNq%*Lt zFoDDhYfbAtOY%{p>PoUsb)$EN?DLux+*ZMiBn&inx=Ow_rjkNu^TyPX3WUJEUS{2! zhNWkswD$Fqz}|F??}WF{I!GZOoMRdKdb$n4t?9BQ;$^Z<%|+2`v;A+D)K6K$aDHdR zXNU`xOfpABWb#VY&xJWqs~2#@DbBU@sYU59{Rt4VJ!&H-mf;#Xv25MLQ=YgCR>JGV za&vD3<~)NLhQIcF_O84~xzbBbg37VW(`Y4rHIcV?dwro)6yy(;kB8N@Zl-dIDh@e& z=|%CF(NMeKFl&WYK&FbS0SVJs4&1|2ppOusf;3eWs;%Y0M;xS4AYWIb5=TnajK|}X zX#K9wnMyjau5PX2eJJ?3Cj#P7#aURmTJcQ5fxU+mnHOnQOCOF31FkWR1KAvf!+$e- zFj6bYypcbpnHK)UG9TejJhAjk$dxdeSo#29?stab+Ks70utS{*refLtF&nn()m6Cb zg7YFM70g0h;8B%(IuHY4Y>cuETT3MnW1xZpF_@<WL>@64V@Lm%tu8!!c9%mwV*?{W ziX^k{n-xR9vrfiZmX!S4Y``%#RawACa1s#?dxRB&3!{V}e?cHCFL8TA9L(kwzPJ{w zG=DPMTQ#ieOlcnbY()?~^nTC@>29l`jp8cJkChP6Hq^Bt$r|kbH4&0DFASp`FnS6G z0Y;{#zL7|Oc^VhgHRD>-cR)%)tuaY6m^`YP(_3PF#3AU@P-?xTmXdQ4_q$jPG3zIF z9`@VE`l05UszXV}NvaY@!Yz}!t#g^BnfIdFWTc+MS&XxON_B{|3D!@^4wSV)?(Smt za!+S6f8_Lj!-j@&KAhk~iI75vAc78tqde$XV9YeA#Ln$M%D2@^hMI}x6KtUt95LL+ zec8xBhTCp=gsUTWP}ngin!0B)`9f{O%Qjb3_tOLB7k}~csdFl8kU=X5RzJC62^@#& zvw`{Qa~rzl45D(7)y-cFiU#mAd%<xL#fwE1FISHZfpQyLn_P&-fp!}nc(@(OuvT%` zrrvXyw$&olnT{L_!`0s12kK_;X8d+!KO3tPn?cI_1U}l$$HLNll}%gv%5-ifhG)4x z**&N<t9voc1&fEcKWC6W)Vde;q3SMch8ULG+K8$;5(0s1O;6p7wIvR5(U>1WPlci& zD$i@`suOsHkV<!)EvOX%??*uEh|PrXEiO#K>Z~b@d0!5TYP%V~!^Yn$%mf4GVQjw^ zwGFoNM^^X<AlCfZFLA>&=tGUK8A$gnT>>vG;BDA3fFx$4RZ(C#?_rjPhGFzOW#gf8 ze{U32`Z_kNy^&crSi;u=GcdyEfp@u^%YCt$U}fzc@Y#EHt)tC`@8HgKYBbEeL;6)0 zZe>-X*DcRI06Gh*(~O!Dw{uDhMS>jkAUGOQhLh`X>dx^A=z?gND(oMuwZ$w4ngeXv z#n$HPbr<6Yt7-#^k^7TOV_Ly9YT@hf*_&0h931xZBM}Re`t7T>^oH%F=^dM)of#Us zs}w|H|LjtH@n60IRmBfkyCuLkgCYjM5?L-(+gx^ueL5eCWH)QFoE=Rp>)G98A!S38 zRs8B6`Umss9tASLe>i^bFIW!?mwtYE?kU(7IgS`@;0i03w8X9Bp4S&TT{cY1oU)fm z;#{7xARuvDwnKL418G|g#zERv<BR`9+V~;TMgV>@C}Qxd^IevqyC`X#ruHR`Ul=fy z=6l20pj!W119A#4al2-2^cJ0hdJ9_xen=;ytWhWq)$o}?sBW3VhnM+YWVBr-!p19G zRK?kOwgL=SFsoLu0Q@+2BW#5)Mve6dH~<KmY5|{BSOfT^!X$6D?dC4_j3gFR(m76M z+5y&Qp*=&pZRA}9V~lzkw<H;`wPTC+$Lay;ETVCXP4+8HmJ9PF*voD{Ait|A-O7|c zZ&R8`G}uHnZS~6@O5jeSQT%7;7i4@8v1y_Qd2x!3S%UxT@B>qbKQu8ZEf@jF^g=U* zw;3aL)S4KL&3!V*Y@9iWmBA&#X@nZ{{7!l9-LX(|cEX`9kcF9Zz%W;H<@^F<pw9NW zGf}6vf*Nm89muGIK=6z5h@K(6@CbO5f8L@4;9U=Iei`q^1yQv(<e2LxP&GxfH@Q!s zUqtdVIcKrGEO9$>O0S^>!A5ROYODdQ#n;Yf`OC;Gk6@N&y&d`S0$mn-!#~T)HZX6l zVLDr$Er`C^fib8=L56FIWl88NvIf<Z${zugl2KPGZJ*=_rh}na%1hk%d!)tc#Vjbg zUzQxdZTay)ZP~4?aT&D57ri4iLckMV9PcYzFr_wrgS&}bCi0iZ<Z4!7nr<={h*Vq6 zqC#u_b21vd_VOVU#+aAyowPNq^L9Yf-Sucg-;+=Oq3=<+bsxQ@@6nNEoO=O1WA3h9 z;E$bD75=o_A+h08hw!OG`P6~pbi@~ZnBvXCV!Jh}E;HU3l-Ai?4$Tmug13{Srs`3+ z3=3IMxOU+x7iY*){DO?kh5=SmCfA8UDk<=;onf<53Od%4b4>1NJ`p+E1c8PQLpIxD zc6<EVCJIy(k-JjhTnnlW1xtEeZgWgP)t5!hJ0SaH@%tpBs~@G1svnK2OtB&g^`p^s zoPaZPu%o6Dn}$}2>7Cb4S3naLt3(>y;OI<IhN>4wPbJQa%<^M!MV-&|GGp+ANz?M& zqTSPyW|s*Xa3fmYPOHgRja@2gppD#M`?DQZV(C>-E$iY)c&aL8jEZM29%sVM%U1;b z5OW@U<}n5Q)+21H3v%PshU~ns-vNDr5LEbx*O*_7n0#}faq&ADaxL6>@Plfl6Z1tb zE!pir9W+>?N*PJPh8bi0HRccJnqljl4O`<9kD1Zm7>lx^*h+_|w@-m`p`vSFPw@1w z`yPF13zT-pdf^5Zg{Q6-s-e1R=P|(18`!C}vD*M)f|tu2s#|b2xetVLpJ{S$7p>c_ zT9-RY+T)8b8#VGGOX>mYcaEC;b<7f7=WkhXQwxceH{omdYNC)VVXCjYBdCn5yD;za zXY72kg|(e~_T|w~!O{9RyNwggwcwuEAswPA?@GnE^2C0`I_v|7Q-cn1IN;uMKg2jV zoE~(T0Ebl2VG<k~=)h&((lqS29%PFF(dSI_R(CY8?oe0N9XTNl*T96d*sN|+u-i8k zC5xyj^GNG7w=YPE9DAJ%v8yZTn&h_r!c@;=XJ|Q!AWJ>XobqZ$BdaSK^?VyFu4lM{ zr%~#lLFyCPCzyg`%PtkaQR4G03^R1-HbzQ!z+;wXqSi~dX|X%{6Zbb&&%%I>Ly<Dr zbcy>hYsZo1ayT@WJqVKz&yCbj@nO{XNMqlFC?qn3mf4CBGR6dRYCSBdmFEtHAr#5L zh+VX#M+6LuL`~H*bthBM=~OuF<3gdrt51VV+_^}+)8PbjHyAGkrwPu9@fzSFD@M$( zLWswM^HmrG#q6U^g+ADV$3?%|yjyG>hpxD=gRag09IHibg{#Sr54K*k797(JPzCEn z98OV#>2FH54b-EH+YEOva|C>dVC(hchdl-De+K4TA#O4HT_h1xzII&A#pv2x1$u9r zc3-Nx%q(p@Nj|t;Df<3**OA;h*lq{##Q`vZyTP>AcACLVmy|KBz^X?poY%n_!z2n8 zzW5{4{sbr(fA(GYZsQX%<!^TH`qRjFAchmUd`;10R@k50q-qg^rVNA=b2c1+II7I- zk<2FXd<X%k;tv)h>NPCCA}9+q`|jK{1hvd{hNkMaurqnF6bXWc9{h0Lh@ZMX55ML3 zFn;QW3T6Nup}T2N&VRzzVCc?cDC97J{iP@k7SdDQAwAWdzcxsI9%9cVpcTwC^pBCS zb7KXEf;ZS1oO>u~SYNS{Hbx}v({QjM?q`U&A3_ZDJT#ISZQqqTlKUtUcdeFbD=W{g zhOJUL+fHoBntfnus|G1Oi}aB*G?O0g(uD_TC~!sF#|}O*3Q^!{M7uBXY}!#f&X+vA z7D-<A5dOUG{@J-E{`&j5LhI3MLG+;d1uY`YLa_>-<S(R-zhv+LewXVHeA#p@1F>() zZvRpbF2d`>B-EY3FW8Y*gY|Gj6@oD(_ZpFCwPs3Jvt1=?4)yieUDH@nw2%we$jwmJ zy>KB{-DM%S)=~tuk5<zUY8D)BCG-jO-XU$7TMQQ$qla6_&_~yH;>kEI7g}0vpSWYg zuj=BJ6IM<@s;6w|bm?wky3o0{ZItDvgwlN$>6TIcObU(5W4gC=vyB6RZG!ycedEK# zlqbWBJu_p$$)?<9Bv%*!<J@qJ`j7+SapY6im9)Hgjx>koQF9+;6`GI>rvlZnKj1(B z6Aklm!nBwvP$Km{BmS$15tD^h6R*cI0?eozlml-FW;|FZ!;0@qPZucp8gLSpY=KKE z<boia32!vLz!L2RuIT8RooO&1$tyeFpICY;s>eBepd+)$e9U{_mGcuzxue}U%$ajl zCbKw4ZHQV-#}-cyWr%y1kyk%_L(ZT9dKlECb7$iikgb{Rg-oPy<S(|~adh{Einu91 z(|RZ9jSkz&A~&Kn<=rm2{i9-ss1h+uEW3=I{z~n#*zZGdnyP2hPGmWzKgBq%1Eyq9 zGjsfF?7Fan%ui|v4qsE&prI3#3XDEKyjXMGgS`}<HXA6V9?1Yk-0jX5!Y<wY&>i3W z63(VN4F!8q<t=en&noz$8##XPl6)6BEKrgh4;i=w?(T_$4X5tlWa!d9A;%>BK+m~k zkcpajpck8ay{Q|P^)JRIv!TPh^elv74HC<vJ0Ciz2}ouz!W?{)DY@&zr0}d=fRxkl zSwu=?7$JqrULjH<gCc7NBq{v0r0hmL@x4~e>urxX4R1T;BaqX5XyP&NeL!2GOJd%Y zK;OmxG4I#T_XVJw`2NlL9tkdJ+~a}%AimRqH16A+Z!1t<d@psrUk3V#<nb&J6>-e_ z6VNsZ_X^OR;&vV?eIA-?%v%nmxqTk!UlQ)iK$_cs06i)(eh5U1E9Pwl;)+<z`#aDx zf(}JlHI);9{##P11JYF9>U=K-dRctiobN}0c<)Kf`-Th0OCMj6a8#6<%3qx?f_krt zZ#n*|?|wjhz$fM%iN9LPPXVnL`W^*RZu|v^1KF5Yh4L%S?DRb0#<BRT>7|_S+kr~N z_Z`l+-T8I_m5T4bIp4>Co{~J+St<IfLt~)H)a~m)O2G^msAUKd^G*X&3T6YTZw@FX zzJGGQ*Tt>x$AHSkcQug4{f_hH9<F`F_aWzdGB&AktvBYq14#3@3}}pmn+>F?Tmuvr zw;mwn>F0nn#=irN72j_IX^e-R?-rnO;`<Zl`vTBcrKbM|bg-a(u=npUL9>8Vb}t1Q zFLCDqX}%M1`{Lt5b2AVR+Qz(xfOvQ!=C#1GIaAPkfK(<A!MgL=;#Li$ZXG~M{bHa= zlE-yGO8pw=dkauPd~b8UKXkso1F8_;yz~9hB->Jc4fHn2_XQx$w?2U}q{KKCNONlh z+E3gr0Mb%k542h0eg%k|o?~8lg_YtHfu0bzp8>sH(C>jXk5#yMSZnobK$^<WfwTpb z?`Pv)1JopOuLaV$zr@|v8m_w1rgA>ey%Mg=p-%(-hw%P$Kw5*92YB9v67FyyP49a^ zt>X55=k`0Gi^T2E&h6j>J?~<1I~wR2L1zMK9bF8xzi_AxNV&Ga`Q8XrDZZa{zW?rg zHvk<Vz8jtIFP!h+fDRPje>&g9K{nrGfDRJhX+WCqtw5IuecuIAN=vFd(IPRg0_aZh zJr+o*KMm+$N##r+P30ozdkxSb;`<SxLj|n@nk?uhAdOLSu;;x;QXUVa`92J!HM7m3 z_Cu`ODu-qtYU})3pe>ThYKOi8r1J6z&|#AAvp`yozX54E;*&k^aPgf8q*SGVR9@PE zR3^U+q<O4&=%+xM%A~_Q?+8g{e;`fe0wAT}eL(jLeM^8I6bZW?NF}TvNL&2-@J7%x z=m%onJfMDw(F61oaa#tYDX#$fPjUM!kd|m0(6i$951<Va_jq*FKNYunp#KoJbAWh> zL(DrLNW*;yi0>oCysQg%6VNZj?aMCQFMxh2ZohGEWl76}3ZP$!?*Twc>8U_lJ*M0Z zq`bNb=s5}Z86XXJ$dR5mAZ~92(h^+;r0x8&qipY-1ya3n8_*+?@?*|zn?n<iw&9L< z=&RM3RF)V&ap)gFkBZxerdSPp>>Dh)0O;%DyBSDp@CApyag66ZFEp<QQkqY!@w~@M zSl*L?w0@TZsWsC2M$3b%fqpG<=L0DZmOI~@fc{H-KjVBi1N}s3dCsAKI24;^Q{ETo zHxl<iAWeCi^PK_oTk$>3`F1+rZvp*Ie18b^dqK|uZ56c7aj@nDjR(?{rvPcKo&@v< z@qM%Nz0>(_0LqK+M(6tr=bHoCCcb}izRBZl%I^mHqxgOph<i3;-U^@>1bq*PSLepO zbwEnhQ$R}9b3iYO?{A!M`UKDWi@3cDNb9W=NMrN>(H4t&%YZb!&pO{*f&M1G-*Uds zIp2e8J@4=0`xc;o2zndPOM>PDZ5Ol<NK^hekmmaZpnr<*SDf!d&i6^6e~Iri&NuIT zw*&pR_`c$NPdL%0d==2k;`>pcR|I_)=v6@v0__mA2}r4W9!RPB6A)N||NiQH_dm({ zCV@)CcM6ckJ;nK^fw*iQ^WN@!KjM7v0V)&Up8>@L<$-AP#=QNe!>$u_5YTsph!cU7 zs?&hRi0_%s_j2dk0TdVCF6Z0leAfVt72nT0-yb>Ov30QP#P?XB@q$hPnjq+XKobRB z38Yjl0aB`N1ezqipLD*Po$oV1`-<-`fN0OhyysoGmt45mn_v})?^qzs<1`@6qZ_DF zd~XIiK+tVK2MXE(bdaE*0BPJm18Lk>fU3l|^knOM9FY3H1?XV$Z2&q%(Ah5BB`(}m zK!=L&2b}NMobLb-=ayn#$(zyZ3fd3oa6vPGju3PjkkZ!*q!e5Mloa3hJKv83al{kz z)&kura&S_;jd42AQR3SOr0KN*9W8Dj1kxA-K$^!NfvUy#Z$MK7{S!#zCT7@hlY!nK zzDEM7?}g5H70@x_`yHSfK@S4GQBV%(SV4aR(zx-r*pv?dnkv4B0IBa;&i5Ta)5P~8 zpyLF+$A!zda7%!W7vJlh@BPkqJJ1Q@d+;fqS1agPpc4h14|I~C3xSk^4j|>wVxZ~b zd!6(BvGaW%s7`!;=X_swzGG*4-kZdC5|E~x0@9TK4d`U?{VdR%1$`5!UeMD(GXy;g zq;dZOq;Youy+wRur&`~C15)1`fKCzL70&m|&i8hpnc{n=^UXQmqff(3lK3_PohIm= zK&J~@1e6lA1W2j+ERg1VD^P>@e#`j|INv`4oguz|alY}>ZQKKZ&J^E6fHdXvoNq5s zqxjwibe5odfzB56YoK!k{T@i;mZWUTlYr9VyFZZnPIta3pjqO3mh-*X`L+YSReY~@ zzF&5}zW{oh_`U+vBxq6t#%hAz1az*Tw*YCrEkMev_X6=2<(N0e`QGe&zXsGSzTa@Z z8=UVCfzB7-r=4&744d*9K<^OW%YiNslmTiH^jV;H3R(-KRILY6sx|>#D87$7-)+wK zpFr;t-&dV)<(W3_kwC5D`vxFQ`C{jL6VOHCdlwLQ2FJWjKo<-86VN4s{tBdVCpOxY z4*|MVe2)N9-_xCM6VQ9a_k8DjrSr`IT_(OCa=zbizP|-(6W@K#^1Sy7Itb`}f=&av zT+o?7n(w7R%B%MS%@*GeI^T~u-_HSEA--R7zIQv{hk@pZ?<3Clzn$-!&i1@3#rHy> zc0pGHT_xy7p!W;<B#=_|Eg+?8J<we7eZcv)pM##nBgenx&^CuoOk3Z14y|`+heL0g zWy571+U(H8w}Jx6<NZw-Q3-ki==Xx=za4E~&_bXG1g$(5O8^=UXuY~MTXc1cEz!RL z&65&+1W3z!6VOv7EYW9xbX@UGAe~$K^gA&gl=Qv?^m9RX1Klg=FAkl4q31m*Zl3^B z-}@c<heKz)%lfuEbfZIeJM@A>hql@n=Qz~q&=(zg%%PVY+ISJhOl2(FQ$UXk`cI(m z38hC}f)R_L=?=96{Z8Dz;@l3u)N=Anpv~gj0rZ%l8-cXEe+2rOaPlue%E?<ULyuif z3T^{Zj(-Pes<`z7-6^U36i7#lr?lC*xlg<oJ+_4V5|D<wALux7d&0R*d!L<2m<6;& z(!1E9tAU;pw`+lZDClEA$4e?-0Me9y1ayM9{mQweFSk^^8%RrjJJ63Lm7f9CN{k$k zrZQ%>m9?XQP88o`fVAXiUt!a`0Z3cfYM_%O+|585?sn&UAJBC1-QavH=U7>r1vF4X z?w$*z9RH&89djjSM1;~yfa)Zbxj;(k_ki9cZVx)QX;)dQW&oWmzNY~xRV~hU8PJ=> z_oL3Y{{1%YSwQvT`&J;0+va?Gfo6#Bjn4Pfxwy$(D81UDGv~oBk#O$-QkuJgv=%-A z^n}E?14!%q0f(Li(waW#YMb&IK(|Yb_d4_`hyKH%JkTkU@4tXF->-cDv%13P*atC& z5VRi<Z&QtVy+BohJ_R&e;@$$JajQBo#u49BfF=sM7>L)l$Gq<XJuFnc2((Sy{sCm> zH?BcBVhs0bAWiT0K#xj{1Ls>wYy`Sn+zwd;H;M5^AdPVb(39eOK9IK6Yk>YLxh(+F z+)h|*!<`1C;a&iGRpS2iBN!)3j9&q1jJtX;(iFG!5{z{Py&Xt>KLMn(GmkE{yq~hn zq8^8S?xX85>XlR~Zm{8IIdq*v_d4|V<(~H)q3_jRjB88DtFn(;3JwHPJ^tGpZORKi z2Hs1!4+ANsKL%1tx2^KLyCl8GKaMfB(DGBDN{R6+AdT@NkfwaZCq3^WiSc%ze;4%p zO}0M1{VC78Ror5qwl)3aXE6$t^qv9I^#1*Gwl4n@NbB;vFIl~N*Ox6i?5h^dxyAN* zD}hduJiY+*q}2YmfVB2E(oKAy0n%EHe+^?lp<p7AQg8#1hWiwdhI<)ki=;RH>o&b> zfu0h#mCkKCiv1(W<6S^X{o}V;eegS=rzJ)n=(`fG<Qvv^GSH93_edc1y#?qQak~>p z%kcz|()S#Y(s#f&(L+c%4goUd05atO(s1c-p=XlxT7Z5o=prEP2k!^kM{4@;Z)0Xw ze2)Xte18h0n)-J@zZBm*kW#wnc02R=eW09_?Poxm?_Ys_B{53xu<12_$EJ5B&~xHD z4@lFy&iUR9G$6iTaK3js-wi;|i|<C~`wQp09q8BM`-<~D78%qFuTB6`UVQ-Qm~yt6 z#Xwr#F96ku+qazCGeB<?x8FFoZZL1WaP3`)sO7!Mp(Fpp*1`bLHsQ+!XjrHc<aYZy z&jZteDq*%k$bkL{q-}5x47f*x`Ys@)>gPaO3)_Gm72g+uKn~)5?>^6ia05;MKIZBL zT?BNv(DyZ<2gL1%K$^<WfgY1o27ok`@%LNbDxk;3_b?#!eKXKG!oQh7%D?k~R14e( z^n}EC3`l9d6q){)xV;ZZQ@IN0H{#X}q~UG_`jODL9_Y8?`v8!}IO<`H?j+x1fHdC^ z0;!DOw-NT5#Mlh<dqGbCsbt^#sONn^QvLzZGlG5#q&#>9C@HmC`k2kF3P^oxfsPd4 zH#y(8Ip52HjuPK?=R5mx+cSL_=-ond50KLQ$0uyxJ?4jY1);{FE+FmMKjz$ctXSRl z1ACqp>MudD-zzD<7f4g?2ijMBOSfReB2<k9;;xP|uktC(LI|n?Iz!N8pp>8_5O<H1 zdDTFt3#tKX5Ht<wOhH{h+))tomI7(L{Q&5Gar?1zTM05x7Fxau1kpl_`+(*N%^QG} z=H?$;KF<YuKvL-d`mV(II*_LF5YTPn_A8)kB$fXH(o||urSBBq5C7Db{5qgUq4}C$ zLi>pCwGQ<;w8o)%2*msI%e)RC-q=*;Wq{5X)D6TN)yup^K<5eS0XkREQlPgBS`O4C zXax{=o0NI0fZi%-HP9?UYk<;%J_mG;ptV3}3;HV1S%TuvS<PAtq;hZp5X1;PJ$}IQ z?<$~v;ok><lz*#$AUp{7T_Dv>e{<;I=W(N^aPn{<<>V)Upp+2fULeiwS3sIu@2_oc z-vHVmx!nPzxjhA>x%~}Db36IJEV>vdTgsH%fHb##ert8zwZHc~UNDIDK_Ej5kZP5m z0;x_sZ!6|YgubN?-Q&<Nfwa~B0q8-Y?*$;G?>KZzsBGkM0T9>#^l9hzeIOJRZUaD? z${&Fql2rZzq^V5!gVo+|1JZD<Ko3i}OMx_8r}Mo5=m+Av!ukFsZ&T^oW>dKiXrqL? z0Z3E%yz{*cXp{Kf?tGsI`lisl14!%b#6No8H^l9fKUv=22&BGG0;%ts7tl9KxL008 z|10Q<zd~OL`X104sgHF)S|5)AX?=X?Z_wxx?%P0GA9<i(h})#UTkf6-q;7M7l)E<q zeNj^WB#@@O6=<`R?e9SKlFEdCp!XBEgMrlTVxULG?fpP^O1LFJw@7-|18I62fG!u` zjX?J+RWDf?S_yQu^bj`#eL&C`fW9Z;z612Ap!<M6sC^0$cR9zrCtSE+16?EGUI2PV zQ1y1WNx11iO5Zl1`Qr8>kk;yUpiXfc^G_S@XrOhH%Gp473p(OuYvsPjq3eKD>OKaP zkyKU#Y09@b-@Adj#P>eu`;_y24rqb+{>J&nUa{@G3+O4KV1+|pb?82ae(cZ-KuXo; zU&Xb(lJb{<l&Z&pR5Lsc)GfZxI^XAjJ|u2`0#dHc_<!uZ3!L23{r~@&Y!GqVL=dDk z*bth;+%IXcat{$J34-YCWOp_@%<hbt+1Ny|2#pGsFBO;8wv9?j*^;&?!D`bsZKKvb zRNHl{RFy?ks#^co`+Yv2^Ev0t%u?d}|Nb5ilgysiJm2qgKcDlt%=vugBPYfTC~Pcf z`?H|#X0_PzSW7v^`A{N{OQ6nYb}f`hC4!TvWz4<`CHy8qUBK*QDB<^8s0*1rCjFj) zx`^4U($9|*p$=vdD3RXLP!}_s1trp335A0)l=+RFJoYTQ7Y?n(ESiN{!`8>3FtNbz z1E@<lm5-oA$~$9G-=)m<ff6Z?hY~H>1%(3~#QilCCKjmSSmg0bR;NIT8F-0QtEKt{ z)UVm^X~{l-5-IP#tH-*Vx2R!IVvDMQ65IYJC{eeohN4vLcO8`QI|_%w!uo3{T8=!} z+6*PE{ZLuXw;z`R#8y^?O94+Y3qy%9Gzsca-p;2(iPkt1Y7_fi2=xl9YFs=JF}?)# zdya7kl!$Q@)MLz!ffDUkfD$n}pnBPQ8I*|81(oBJ?}QTD^zWfWjK4rV&N2Q5W%m&- zhdjY-A1IN>B&a8uoh;cmphUa$K#6fsh07*SaBhb}iMEeHiQJ|_J;kXU4<&ND1WL>i zo1l8QbsvQit-JFur_cAt+UOr}$}y<DST#W5@Dcsd2DO~W)p96N<`+kxHQ4$tl!*HQ z)Mf0q>pqU(K~TTpd~2XYzH6Z_XTJxe-*2IC0EXOV?(4C>&er)*BDY0Q!uk}{3bwv1 zt?x+d)3}^;1zTT%5^?_lCE{L)?7zX*tDuDSHYhva1MrM^kuQ|6o((0eYoJ!Lbsf}I ztbPV1_5oD~daSFN4TlnOYoJ8jOGkOEYuI`nl(4Rb64sBPI@!7>HW*>`LJ8|LP}j2c zRcU=+T2~$9v9S9_tKECBqxL=0W4+1jhfvpX+zn77<=;bzloMa^SpUP;Rw!ZZfD+ax zpsr`@i_-e8w2m6<v2I}NSD-}PqoG9H`=Gwb)}Kr3Q_}ho)QxQ2bDR^`3nk(X8}G4J zvDFJDQVu`~>+MiCv2~ra{z_WAj`CPHv-KV*5%&=&5qF8-W8K2m6;Q%@GnBAyg1VKh z&r0iGrS&@jkM%9Kc0-A{KZg==zk<c$-)8FsC}EuiC9DU8Jl1V&JpxKtzX~O+mqT^2 z^#*CZLs|#nBuez<$xt`|Lr=d9)z9jmP&gC=I|C;!f?WnB{2qW3)|EIh_zvfB3zR6q zolv3#=TGxk-(~AJpoH}%C}ABr-D7=^t%pMiYXnMIKRn)Jt!C?PCpgvvpoH}vsN324 zkhDH3tryMmSl?&s)leekZ$XK;2hH|acd&Ill&~HRC9J1Ftzm1Uv=*fGS5QA->(kQu zinL}=@>qAW^+G6-@>NhG<qc4GvGsS-`n<Gmhg!?lUFw{;`$CDhS*Rb1l%@45X&rhR z_L6MfA4=pq21>*|VZO(@hplHo32PckShqrTv-N#x-T8FKy5MUb>ql%o2TH_U3MJy+ zmB8MBt@lF->u;d!e3O{NM7~gVzEHw?F)_AwO6zUX`X<zm+4^s3-F=}Gche$|^$w5D ziOn7hrvezKw?GN@qGY$8?XiBssoVu6N^n1vD8b*(@mN1)>jzN6x@*R<UfF{E8(VLN z64oC;iMWqI{fw=>()wp<-K7<KShns9CE|{T5^+x{c&u$)<_%Cd$w283EIKR+CD_Gn z&OUVFVrP$?g$nSVxCn(E4B}pP9{f1B>!Cz$--i;pJ<*Q6I9p$Y64rO2gmuwUkM$s1 z7efi_3MgT{3F;xXu94RJrFHoE9_wMY9t<Vo2BAdU-$M1U^*L$%o3!4r%ws*m*40oV z?oXgZ++RceoUPAD>sDz!;R28K3$~sCCE{kFMBJ(iJ=R9H4u=xf8Yp3X3+k6_{g1R( zU*uR1hWZs-eNZCqBx$_>>ep;tDXrg@)<KtftbcM}{s#)DVd$A@mwPOnUO`<4C9L23 zx?}x4l(0@&;jwUX2*30dj{4g-9KYdLI)25K9_s`4`w&XRxch2HZMeqCV{50!!l@L} zJMdbM^)FVBLW#JGu5;K8P{QwiD3RVbZ}iyLxz<3@FFs&h0hAbP2d~1BuV^7C(LyId z;gk!0k3fkd{gJnM?5iXzzUQ&OKl<Tn3|Ahp<8JrRLrxImsx^*v*qsi0_J<BT^B#xo za<9X--RGoo(Rzp7|A3<|?Qzt|M;!GpsXBk|u%~|IsC|FusJo<^@u-u>rBJQh1}mUM z8{7hg!z7e`)?-dBhd=JI7PH@eP{QwUDB<@TC~?gw^n}NHhTCs4lxV;6p$2n$KbC4c z)K1LCKk29mP|tGQnNT9`PoYHI_od&YryO>(RDXmL$MUa3ZQ)ejf)dB_A3{CHY`3SK zl+#chT%%SfQKO5YM2((=5;gKZ<D3hf1GO9XYCDuTW4RGZ<a;;N-#L$mq26Tm2Gm=u z-i8uo8UL&kV-i$9Tc<+_>$j!#UZ}U(`cr8gvc-wJ57awsJpf9?Jsj#?W)UdSerG_5 zGr9Aip5oGf2g)up)HaTBACyStc_<O1_BqGzM5y=JZw{33OF;dDSu2#t?Jg*h@_MNE z+4>-qi1DPf_CalD>#NfG4%9!Hd7gLDI{@nI+(!pN?a$-I4<-6&4b)LwqkEx5e>?^y zO7I%g?tEST4Jc89L4R<p2SDw?)`Osg^(Rn=GW#WzsFCLdXU}vPlsK3CE0j2cJm-(j zIpRG~zvHru`IE=0;Z&kfB9#ZAM5&&EqC5BoTYrEO`Cjm6XI8mIst2I1;hOhAiJI5- zd91@YZURcAd<&E~*L?^|lrQ<BQ@)#^#C-KLsOveshoD4y?Jwc{lFNJ@)RU~XLE)kU z$~W$1k2RE49n{Sn_Y^1*_m5Cwl>GP=k2R4?wGm2`YT{o!*3ryPfD&vY)G^GSl<c^z z9_v_Ubx^|Zn^3>tvMhStX|*C0-QzgeS^_0n?Q*E&nB4#+;!gXU6JsvaDQuk&C1M=( zrpNxK<}j!n>Q-gF{g%fX&b7SqT}K`Ho|DRCs8czW8BijXZ$j<IF}@3R8e4w^B}(ul zls*2S=Ckz;C=vIcP^U8+@((A*m!L!pKhzm)jX;SQlcCOJHU~=N(Fk=1_eUB^^v5!& zbGb$xP<dAL19t^hE1-(3RzkJ0>V#Ut>UybGNp-7KT~e)<YK>HDrRtVyomA_k+8|Yr zR2!ida|!<NzS9O<p(b&C{|+VE-~*`1%y!-Gw83mB(Q0QxO<`+2l!(y+HI>;iDA8&U z{mY5*JE&=F?S&FC-u%$9{tIe4TdjXP);*wRFdGFW(n~^#60}0iWNQIRq}Ks;JhN+{ zM2zD+gX|cyp-y1yTqqG^$sosiIn*q+UI`_v-<Q_=p-yD$CaBr0{s?svtCyfej9=m> ztM^9h4#u57PRiS$=*jK)<{L`*-931abuzODp+ref-f56U_YdRyBPhYX0VTHhyP(9? zt>IYwBEI|FAL>Hx%NUf{qUKArR{Grsg~LK@c@IO4;PNfp#Zft^eVAP+)eoWeW%dBn zTrSmbp+u?v2sMw{8<HJ>#|aGM7|Wo<m9~{o_whD!EtJ@1x}YwCUzN2Qs)N-UsOwp+ zm8x5+bx@bGbv@K_RvVx$X4M0QLt~`35lW=8Nvh3K^-A@WR9mEaL8?BeOE|q(pe|>% z6>0^mH=w@3svqhGR@<c74uwN#l;uMx9CSljyAHChWHlJ-Dpo_FaDWZ#?oc9?YN<v@ zHBzckQhBASk!lPS4%3m|SSTE(L;0YtWp&ZeLDmB9t*fC#4?YWZ7PG%dcEE1VSc^i5 zz1n=JCwRY*mTD=K*b`p~^)*iAW+;(zA5?<bTau01-AQ>8lt{S&>TyoFO{%X$iQKkJ zw$~m`Zlj^<Ipq+P$ZZN#lG$9z8lV<3%S(0%R0FeXCA%F;)Z;m*<GC!~!-6rPy!cVB zpYhlo4JF2Ip{cbvu9#eyNx>PfT((dwH00B{;<%<POs&Zlwk*ml$u*B_Og9v<D!j4D zDi+5zv?Ox{ibH8oNUzBg7S!dlXQvv9g$2jua+!2PvY5`c78Vrqi_@v|7NpvXseEfP zv!E%TN)?ynQVR<Ch6R)Y{xs&(i&OdW4I-%>n%>Mst=W9a%hm8wr3&7rY~Gu0U7XCM z8@<zKPVxHMNBd&!-f==?+J{mB7Nv@b^U|$}LNT9iT{OWvxjC6nHlPmVHDAV0w|eX5 za=KpO$&u~&Nwh<%ObYd*8xHr5p>&S;_=LDML|Z4QP>YlKM6Qsas-RTK*29b52DEcA z-_}r+Wy$4JP3d;7DfK3DDHM~f4XJ`tJnp;F^k!$hqFtOyRZIwJx3xA7t&q;#=4`&0 zYDLQ-y?mO7f>AiTB;K;GV%9sl(c9p(If_jqrL?>aM*XQ(8f9&r9KVXZ%4Xv&=9f?z zk)7Ly7%wf!Oi3bkc_+^}ZqD4P^AdBWPM<k<-kj6z?y(#`b@t?wrp%l@-QiC7e`@>4 zE<C$nZ*9p!A(f{s)!URzXV7?1nRIK4+CSUmZ36R-cG^FiOSL9wKur*abiteSo_5l- zX<zjgmb4a|Q-$<WYR|dTX3vxT+nO!Hi-%!bfm^#d#U9k=#U%2|(?D%W7VRk9WS^<M zl=|_wDO>J_Y$k*03RS0k&GB(wy4dU;ooVzI+7?pT-7QD-=#DDi4jCT<)K~UP$~$k~ zWU(Dlp4=|!)^st^lx)CEf-Q+VssWQk!COz}!@Vup#<om~yJbh!SJ}_V{Rou@^B3<H zNYksOEmKU7Ye^O`<<ick#Gb;$+)x-Nrx)HMAzlSeL((huGh83D{-bl=G3nOER67R# z5%Abi_2tUo&yGru%bm$48|{7@of~RVh3XeJry39UTI0qY!}TMVR3q9WU7(H5vbS!` zbY#K3t{Bi9uQ`?cH1T#+ed=41?YU1=ZW=wGCLZk~K21CtxSuB8=t47^7%_1VkkL0l zAKyQS-%@P<)bS|~dhMwGn%9g;pXU8mF^8X+Y~Z<lJdZk&*N)5&$Av{4OJ=-w()FLQ zJ<Fx{S=zTgTL@6+n0@=P+g)m521kMaeY}QTGV`h8Wi$Ct6R)s%(Wk0kt|9ZOwwFc8 z!l&A<&%x=%r>LJfpEhP&d58CzwwLp=O-=vh@zwvU`B7E*kT5|9Srg>>3>_7EY2T8{ z^USa#>PHEAy~X4rI#@%#g;bGLL$)P1E7b~=PcLH8(41;Gr_k1d2wv~FPyS;6(GB9C z*NfA_Oncd2sAblhPo=4Bm>O}uNykzJItRij62Ept{V5?cU*|+t<S!b9j#WSJ{OWO_ zm26BFv1hY;0%z5kRO_N*GuQZY&p(H22FW6J<z=(~{Od1{kVUhLv+uUNI8^>z`<n)P z9*5{SQxkcMHuqwGgEOcG(fBCAj%t6d%x6olSj2@R?c&b=we;v%(kS3(Xuo3di}XIr z`1@Sj?~`8d_@e(m@%7u!wZC@A{PV^3_<weL{GxyV>+egx*xo+t@xvGM!58zvC;xu( zi|y@;?d`w$KKqOD^2K=hV!Tvd@A1X<@x}J>#rE;V_TjAm`eHuVf%8F8Ea*rqY)fYv z6Lg|en80hPNa4zSS^L6#_8feHLf*9AMXU?-rg`a{{RKwZcx|nPwp@<C<`^*Y4y+%N z;@4-pK8No@cj)!r9i1M&<K3a<`~1?w_vr;Jp`tOy-}|(-wJgMfE-W2OwPJ-%ibvmP z`#!2z#COm}b9}b**UvG%xu;Hd7MtQLKzorSM(k%Aub*Ri|5vVuE9Iy5Y0NgXwP1MA zI+E#U%&g;YaK)EeJceik-%;&_b+36W9HmvviFBhJrdF!8QK9&f*PiE4)Pz&M2`G(s z^!Ovyd6So3(OQEEUi!=H8EF+Y)uoutdhsn>CWE!a+T{6J>q9x&8-OzpE9Gd&wqczj zedCNp*0e}jFPUi4&(xku{-1QbxaG{A)0Ru{ca>=U+*mJGKZ}2d<Ewcu^)<bCOA%jb z@=_vhKWg1nORl&?7^o(0Wt*^E&*h(~e$<#~Uwa85mxq@Sh+-!i(|KMX>CIz30~W|; zmUu@uw~4$*V>J}k&e9@ltRKW`Me=AOJFOx_d1)zvnvVF^mL^A$iv0z?=%pRtUoRH) z;oEq7NubD3j!iqG9noIgQ1+jadO8aeT9S*>4PJY<fTk*6KBxMn?bYfmN#}ad>U~~! zzN5--mfNY5w>5<oz}S<C@?zNX0?V=3&cJ9%<>6ugI0bSd+To5WpSvB=l1~gXF&b&v zC%>=>&6c}d(L~tH{J!Qk;Q;$IUR>>!dup$GqeF%Co!%3J2O9uZN@p=*>E4NXSgJb@ zcW`h972;RuHMfy=MEg(y%B%;nS43c8kh=`%6RiWXo0JQQJ;H$NfW{P(SUjCxnri$i zuRBWP-WGfPi&!^wgsAJsq=RyeX>1d>%cRCSdkst-PFeo{Y+tH@IRI#?q(x0m`9v*0 z<Nn&7e<`g~(5eM*4jbOo6EToO&N!Y)YqRHNXJs2Ec+sYzX5+ks_lLBWcmnT+TiP0$ zy~Xp=ne?LOqBoaKV+B7=)b?^?t`*%Dg7z<Y6|yb%4MPPitD*P{Q<(ZufIQz^(vZ#5 z=8#!J@iDPYr-KVR&ZV+y{UvVFakiy;vGkbpHk<FW9q%aZSHPB;J+9Ee#YIy&Eya9F zN*WyARyZx)%Ko^i123n=nG1h5IJ~JaH)Y>8!Tz|5DbS2trgp^kO#Lq=E1F&?d8BUN zkLC3)Nzwipur-S?U6__`Pc_!1vF3?9X+698+EL{}|ISIaF5>eT>R(!(%7D6if;UgL z6O-+AbyH9Djt)1sjTLA*+$N=(lZ(@sFi{I?B7P}dgHrQrbQoh<=^BlT9cSXCro@Tj z&IXLLFv{_n>PKtY?c+(O&306Jyd8?$c@hC1Zxr4-WH*=ZEwt~zqZN|4p`#Vw!8r>g zcU1m6x<3Ec)6?dg!b057L-!$`L*rFU-F)Cjx8v==?St~!k>lr!^gi46thC<%<3XHa zjc(&RRWU-e0Wm;49LuF}QKu36eJ?tmE)vqhU-j^pccspz!l5&Xl?idCpDGsV+)hkx zbiQN{TDlW+X)2%njPsk)9!{Y?)BI8<J-xknlS|n5o=x!D$A(lzXXl@^_q@1qrqSEz z?1$YhDAP_Z!accd_KnM;q4>_kF{2xExm3$oT)Uu9oNxZO<!Vmx5f0}-rExPYqv+`0 zE&wv8j76r1x1-zli}e1B^_OMF=Z<PWj3-Jx(U@w;;s7`yj<cOZ5&MgSGKaLEYyJzD z6jKS@zrUz8g-d$QCg#jdX<S>RYtq^T_rF*kyHP}OoGtu+F@NeJ=dg;-M@svTI`qG5 zz8$uGe|&k$HsAkZ{#x^uZ$G*TgDyi&@Rn=<&Nalc^>pJ=CbWCNUG@xHaY2wzVLm3F zb9>qjYmd)s|G1;Z`;IPO+4fE2A|=i@aaP~P-)3P4ox|<_srH6c%HEU)iYE@NXfyMU z5vM-1XXI;T;<+Qvjpfc{@Hy-+2P&U^FDiYtE6T$~<tH3`?&TY(TsW}gl8E-BgNusA z`C`2PH|tfYRlhht`?Sv^!uQSpZ?vBWPk7q%x}iDG$U)Y~IU{oWA2S$FY#VLup4+XS z=FMt6GmCBc5joFZgRH#*yNPg)5`Lu$Pg@&l?UsWt`8c+`;)CaE4ZUvXoM$xb_u4#w zFkEGg@_4O%5O@FSq!+TLyoca<Qyz+!M?7B@o_M&gRZV$te#1q6WS;{&eyDInpgQN- z8&8~jVy~PhRAn9LIm8+v{YSa}l-_vM_d3+c4);H<3Qu@D%-Re7^zu@@Da|=Z(>KW4 z@15%0{*wpe_b&IbhUKd3$)^)<k<S52K6X1e<#yWFEHjniEBFNu&*3Q7(0VR+9_4oG z<AnR!dB>{o8=6zBo$d1BAzW@-bJ`=^`cZrAOZ6Gf_2GKtQI8{0pL-E<+w3dKO#M!M zOXZy7jstEN;?!T)p`Y;lv|Weq<c4@~?oQOU2U0r^7ik@ZCxhL)PtN0n`{Q$9pWOZd zq<!yDF8O@4+5TLY39>GmsI3nhWbN?|%5Ar`GuHM$n#R_6t{b&^J^7A7nVvwIoDk0| z+hh2yZoW?2IpfvwqtC<bv6n|kbq=7;j-O*6j;9B{W80}s$PeXbKg!qfbK*H|NBQ21 zIt*8~2O2}yq0RTB@jG0MU&o)~Q#sW1oN`gV<?Qz=<tk@4<IgeDA8voX4x!UdR7M&X zYJ2R6cux99V4J)bW80}Gw~w>^;t8)bj&{Ryjn&X8iy6|Gx(;KEwsYEEC{3!1QwPd( zIQoD-)0lTcdpq*fpf9hp+tz7=Jp3u2ywc{hT?8=xDZk;!PYv@J(>zy=lyepRN(;}E zh(qJM`sdCJieHf<+fY%@{bvlulY_@u`{wqk2j*Xx+kcWfHi)gjo69{1<&RXse>nWX zf`hCBp4d0%ITUq#0%fK$p)8)AJ-jW+IuM@&u5Ra}23e!t0dqp~x!3U-A+}%k7kU)R zFbdmRm9<JLdQzrfF{#!`mBEZ8tQ}IVm5QE@Dy;O(LZOyP)hQJ+v$9Cjd0p=agxhv; zKj4R><m*VOEbB@|f25>y%g(NW%ICaJQ+!$+i103je^>EW^IEJNi>JrBkr&|!($4E~ zMb94MP^?vPrR7)jYf3raQ}SI*5B;`Z^h-|8>q^Dv45iG!Q1Ze<h2`r^>{FdrLW%qI zt`5a>Xq0+g<YMc7C7nB!bX1><(38$<t>XV<2O_*!(O*;Ahkl>Od7bSDg!J@d=hfy2 zg!Ck5=S5E@bzb;sJo%#Eh;m-XI|3o?N1RucqAzeDLOS+wUMD#M;WR}rQ1l9=&Cgfb zcATQ;C}}>Z@G-l)3H?IxdDX?1Pthk2cRwT)|05K=*mdDwPjfz==?H}Cm`^Hg6;*sX zlr(Ao?YwSr1VT(t@|9Ei#jnKui=qc9d8u(bWh(f!Or?FUQgppCJ`YjG%moT>P||r& z(Q00=Ddjm#(LYkO>c3T~S4t_*2Z~nPWV*uX`L@mrkAs#k)&DL@E$cm{ed?8TG73LT z@&BHpE2XJ!3pm7)uOt4;G+Sj%@eB0MM|uXl^ID{A3tk5ztWmU2(e$)%=S9!sc3vkb znx1CtyyzLn&g%e0pQ_aBDaQffPZgg=MgLmar>JwzIwh{kPgJ-%C!DXOxlQpoO5yVr zy=lDbv`FD<zZ~tlSRW~UM88$#yk2$$Li!al=Y<E(%h$z<?pNAJnL?~16^_U6%hyO{ zUfNF?|4S8Juas?`Qik`Gec3Zeu?o-fwk)A&c-(}1@XTkZz1UhU)d;9>v2`RAahw@S z<%PPPtu;`?@UF7PNHrGfPPWqcqB>StA*o_ev|p;SCPMAa)>^5iK;6yO8BkP;Dr=Th zbx_@God>lqTWLNNiuMFQVQW3qet1_|jZ!s3t!HZnifV;l9hRyHMSIsOs~u{8wl0&Z z18M_XmqQ(ZcNHHa3bhiSA7X1K)PZchUaD14v_Gk`ZiO1f)-I`5L;aGiYoNY_cNPD> ztWe$fyqT@*puWu3^-^tsdXlX@PzT|SXO2s?3F;ZPZie#WUByp97wRc|{sUXLKpo81 z7o_TgdXcTKKpld2m9<r>H=tf-Yd_SXY~3c+cBog``XN*eTP=JRYA_Vd`c>8t{2k5K z-KC=a{omP2N4hk-R^fc#QFP3@jjdk%J)EsIQjLN72V2MD?-;iFqzXa(i>)#IrDc5> ze^S*#S=j!n`1h-iWa|ttp=LqhvGTCiL4Ad-^Q59V1*bf)E`S=#)_SREro#ymtj$p4 z*qV_l2el7di%>KnVf;z84C+9(c0l>qx?HLiP=~N}B@`XO;#aSwx*iHAT41Z70&Kli zsxBy;?!&qoD#+F~QmuueBc>|e)<SGu2PV{dsH51r0V>Sa9;r4$#o4+ED#F&yQuRW8 zm90-f(GgCSwMD8IppIs1AJnsKeMPFRP{*?M4X7Af`=#0jbsSr_Lp{&d52d2MrDGY) zfA~9vtwW^3qus3&*h<%Qrm__$t+v8xs8z>SoVZzkV5?UuYU4R<#U&1FI$Os|g-a>c zJhq1LcLrNyQcZ-Sy=9eEi@!73Iz=if@0o0!g}=wMmC7L$rMi%<^YM2!TNg-G57o$4 z`b&FBj6bO|P)%&j;cp#Vi&C{ikuQFA9e?MrwL_}qP%Ug-fxmOvx>Bl6s61P*$6uOH zF#e>v6^inyvbym1k8E8n)f%Y9Y+Z}Le`0I5RO_IqWL4IB{QWaqH%Qe3wUn(J@wbny zo21$dbrD;8@%KfxJ|)!_D5_PJ^#cB$#@0TmUV*xtty}T;CAPjHRX-G+|5aJr@RyDR zs;uo&eF$|ETY;^!*g9A$y0%K~fc-C2lC9NJjez<-TSr2j!`4w!d7-Gis;n9)nxnD* zm1->1J#57#TkBP};=+QhaB0N)F<U1>{e`WyQcZ!npRF^XUSsPlsp_Dp)vK&|P_##= z;@?gaY5~|IY^{fSovn>hHADS^t#kzaH@4=aDnk8|t?f{>hr#%hssrk`Y+VkOXX^^7 zRzgu9WB!9Gu=RSWRzdxqt+zrI+1e%5YN*HAx(15QZL$BAsvGJ_wyuL(%+~c%ZGd{3 ztvyiZv2~+Vo1mU$>t?9Gv$a>Mr=Xr^>lUbXw!R=$9~6zoD(e-fC2ZX))f-TMVrxIt zQnqfBYC9B-U;O3=)cI_s!#<$~L%qb-Ay99!b$6+%p=iWcStFp{V(Un$MnV0BtzM{Q zY^{-M3>0l6_{|R}Ix@g-en=I9`WstgP;aw!qExj|e`o6ys0-MN%XGGy1@#tN>!2=V zD;?zuH6QA2wl098D<M@@y;O}*@3OTSs)MZ=sd7+sji-u#)%{|&wu1?^42rhqD*grX zOW3*`OsEx5blzFTziNCbTRXvox*m$Qf6RYS%h`IXR9#U2Ve4wB%h<X`s<lua^d0uU zP?xiHomA_gs@S>#>g#Onk!mB<PHf!-wSujirRs&+g{@CPUBT8ZQoR5*l&yVG-(c%2 zQf-CWovm*`UCGvdskTAw$=2;qE7|&?RMt*7hhXbqsH@mIL@N4yHe8TKeXF6~Ve1H~ zMndhw)=^OJvehe94HPcyBkmZetJykMDj(GTYz;wO!`7Ho^m}Fa@&s{fp*q=0S4oAU zUwZlyTj^Jru4QYTRP<{@2eFlY-RnBG(r?-bRS$JATN|P1*ckg?sWMPCY^Cco@3FNg zRXfySY^AHS|HIY}sg^^HVe1O0>)E<es!pgQ*?K+H4QyQ{)vZut+1ds5O}4I<Y7NwQ zwyuTx2V1+PS_c(m>w2gg*}6fh9w>Z`h+1xhTE*5)Qf-Ecvb7iLCbm8$)fT7;Y<&Uh zX14Z8^$OHPwr+*Gg{^N$)em(HTem^I&(`fyeF#;{Rtx9BbY6nvKdFX5;j%y2?oj_^ zYqeA(pr){OB-E{J9VL|)Y8qQ>puWY{F;b0%n!#2d)VJ9hk}3vuJX<G1-Nx2hsir{9 zV(Sd357;_Osye9IY@G-7FSgE?Y5`OoTkE0d><j0=QZ+-(VQU7ei>*1Sics^|+79(^ zwl0&Z1L}0PE{FOKTUSW65{j;BWB&{FUAA5?)hej7*m^6}_t@Gc)oQ2&Th~CXX6st1 zx}oTrXqB}N>OX8<FVzO92DbJ<eZ<y{Qf-1tv2`<)<)Ku1rFsf#5nH!FdD!}bRDDos zw!Q*2h^<?tdIKuU)_$lewr-PZJ5-*nA3_agtF?=x21A|4)*(<kv2}N;s-c#$bp#Z? zR6?0YN;L}VVzzprc42FcRAZo4uyrid5VrcH3PD}T))*B1wj<7erK*MMWa|_td{GAL z45?;8-N4p5D11!_>pZFEL*2sG1yFmjwO*=5sBf{g8LFDC8L4tmx3RSdMZeaD^Ixf! zL4Aj<9Z>XZa#hxHsa8OJkF6`A=r`^#{-nAdY7JXgL5*PRtx|PC(f21f|AnI8nya$b zNVOJfEnB;x_GRljsn$c?&DIT2`?0l0s*O-|tXO4jf*Q%z%~JJ3-OtvK@S+}^fT4LA z_LKCP`nwjNUxf#Krm+*m=l>w2&omB?#pio)p@2TW0!`=NvEkzL%g{c&_u5^2ehHec zINXUN4e}@bRlKL#pO1u&lYNM=e;Jz6ufs(Q@~?)bGx+CGYWht3wlCp56Xj^P%Siij zlhIKJT_qvE@7iVWu>EKoo@6sRQm44xc=zK?c`Qdr<?O}#JMg1pY~plueHh-q#G9^i z&^b5RR@!Yx`y8^L2-|(&3&3eVaRau&A$I-fh!su8zxVbc!cp*z;yn-VYw)Hkuyl6w zG~ynQI=_tfTEyK-Z+tsP<#-<Pe0ZOXHyySA2=Dvxei-jfct48w%Xrh=OylYVyidma z6ugsox8Y5{ka#KHboKQ<yy-g1BX~cH_s+<lt{08Ko60i@?=$eGv%MeU{d2sZ!}~S7 z>8SVLc+>G79RnSLH|_lcc+;Nk6ujxzny<y1wxb{5-HrDqydTB;Pk0}Ux)$(OUvxDe z|CQH)On&1#uqw28bmppqN58fCng4m|u%G`qz2M@#HZIwA=j!wyZ(sG!UGKhj#oe1` zjsEh~yC1%zaKtqeJcGXV^e&T+_}ZC0Kc0QZ)z3`2?yW=X-r2)R_?}a8?|tXu-Ih9` z!)s|V?f7)#yO#|1e1vHo$7fBcWO2OD*Xi+e*ko}wGrpzKLiN!v<TJjJ?&n;bqEx8# zRUYam{WZQZwXkhb&0L}sv&u6P4NXTm?#uR>M+6N7pNwm?)%ZN!J0m_&;~_6>Of-K@ zfBAzwU3aHp*@rQ0uOsm$GRPWV#KRtHT3X3Og{bm`s|Q)vVay)7vi1i=#cMi(4y3-5 z<>fMAOn`W)?<L6*8LE<tL43QZgpMZbHF7%$eF5O6^HYF2yxlVY4WFt}E7ymP4|+zZ zWKWc?Za<ZHLAp^@H&y_|x4%lJfb<`rl2bvtFe$jPnn8Lsavn(C7}e);kRJ4y8|wxT z-{~s(K1lV~R6<uWb4@DwEl8h6UIOthQhjJPu11f!dF_jSs6JOEV?a7F-MBszK<Y10 z$;lvAhe}$>=VFyy4dTOzn48WWL{_SVuBmk4)W-FpYZBF%tX=XZ2#pW7Pid~`$KkZ= z69VylUnO*e+oO>)Kswf_KIc%ZwJKRgu{1*SPu;z$&+Q=9>s0apNd1ph@;FGZU1k&? zFS-^|i`Ez04w3gkx-~KsM%pf1pD#gnYQ#rI#B_b8K;|?uAEZws8IU@>@gG|*y*eO! zG;%XOjlqUYK8TFh&mnUUsr7miq)#KSg2c2~d*f5jMm5&qAl1KBNgSl>cPgRZ67Jfp z68hcKcD#{+U7oA(sZ%3#7DqFn>+>c)b)f0pvGE^}UXARrGy38Q)#pnfJz6?pkh&*T zpP3+i8aWGu&H&xq+d$}C&m|XwSa`eS4t(l(SxuSF3g~RX^?4PadNeW|`}01Hi~^x! zcsJHe5DRaYoJ+CZRr9(8#Hab(iBHXl=*D^&gpOogvIU>I-&50h1EfRq`8Ph%F|3F+ z-rdPi^|5!@NM91*wWz&F2X1)P%$*(#N1{H`?BfuBwMhb)GIgI|$RwedBoNkaLolLn zDZm{GUk2%yB^0^GLQ}L@<KR<|<0ZH536O4$Tmcfp-pch^2Qot=eIT_sh;noPJ4lB{ zJ_4!UPxaXw`Q$Wm7>E~#;%+)IkS>iJ4^n@S>hm>_x`S16F8S1`<Wi76ja&<oJ5u%e z9!S?@mHZT>8oNHXJin!MH1YyS{Z!TGO^~|jDj9^<>X@ODeL!lDSIOZZJsOFFbl0gq zCxUqAs)W|}c(E&XOGv-})T@!p$mev`=Vp+eGgNXnkp(Jw1SEHsN_s(jUsK7;AYSbD z-Q2f>)M;dQ9K~2^)#o6PZjFow$(^nG90$@>P|2wvy&5?iq@$?%Tma(3fxBCtl^~sq zRdNeR9S%%fpSwYN@WbLR`2|S7MxF)ncBnqDQ>^7GsoEVQ0S7p4I$n_eud5^oQhkL= zP5|k^NsSw;0i@?fm9&%3DwSLX(yx&<AayuVant!ZNGJM3Y`HC|mWJj$%@y?WV$VpV zB_}?+B)7yMxO-eBxFOkyMMRGUf~Nu*v0B||l>52#dtHtTmxn$)fijC1`Oxcy67rW4 z@_|OC%}dnbX+aHcIw13!^I1AI#mh-~CwYG3kiARDVI?G3LXImTbtR;}gk(y{(h_n- z3F#^!YfH$+67qZr*;+yd;k-e-oYpv?gd9;qjwvCtOUPLzBvV3`mXIq-$jv3>o)Yql z67qZrdAo${w3k`;ktJkY2|2EWoN5zy8$1W3S37>bq$Jk$CFBl@^)q#E{s2hrMwL8D zv7S~*A4t6<O)cs6U;s0%Bvi-u;NyKpjkOC7Kf3><l6^sHUsTEAAbqc>BuKGdQ^^eS z(T+e)qjYvvXQUj(8mf{jC>AbMx-E7qNd4|AxeG+RoRRqu#lj^@H&!o59Zu_A(g)J3 zk@rEoUsiqg9EN#yv`P*J={;N}M}hQ(R5AmkI<Ar=h;N}vav)ueD)|OTU8_oN0?Fl6 zavw;yw*T4)Qs1HayadvBu}Z3j!v~kC+`1nClDkqRL6EwYDmek98cS{6SWV=k?{`4D zwSCGpAhoxsv2G)Bt4e+f(t#z3Zpu%C^nF_;eIVVBs^kL@?_(+%x;IjO+#&S*NqSUh zrzA8c4uDVB(~b|3BSGq(SIIO=2TSPO@|*(F_h*$f5_wT2MG*0FM%|?)<c1Qm8YK6! zn$FLN{6!_d2kF$v-#~h{sy;(TpnYCf$)O;<|4_+PkbW$cbL-UvlJg8w$a0Xr!7Awj zsl^>?ZmjhndQCT%kmpOt))MkhjU;f~aJD?Wpf;?T+MX`fM0pJ!P8+SAZ4!(3;fPr! zaccyQu2d4XUNlI+{~q>Xs!uR7870t&Kf+hK+`Pip-uvr5fxu~e%}Shc;o9InmX(~R z`-Fp!pJkB1iz$at+Z~8l51+4+u^=J7vgD*31-a#R)n^9CdX3Bl`R-k+Pb0{~l8818 zM!tNn<5M%WwXwz@v9{gk5GqeAVoksWLbWvlkst9s#VOB)@Ok_fhEHf;-pe>XE8+9t zZyX;=`I{gwNm4T{na<P%d@FzF_y`iQvYQ=3u~sA2p^rJFX4Y(f9CXAJf?##jtl1&* z8~(WB6DD$)O6W@tYl2FmMDi-36JzU6l~7jJ11j<RKsKu+5CqBaevq!fpgf%NmCq^V z;gs)H38(y=N;u`Y`0~MSdDPU8l$UBG0P-D;Q0|*FLd`Mh4{AEp91R+w=2)%~D)j9d zp+b9JP}8A8AEJ@~wZ>$PP?;Mg!3XOe^xz$RPC7(3f&BF)mAnjc>YFP02;@6&tE75g zTzelvvz9Z)4gh&uBcnlH=VJi!5o6x(|1G{8bYmR_pI%9XPt2OmR|cGvC&Fis8Yh<U z3HT>SLbW&vK7)^Re2CP8oF7ri*&r93qLL!Ws|^kjW8NRUg!lMvnIoY+c~9gLfA9$2 z6EWd!Cm780p2+nHhVFI=`}o6G^S;UT@kiDgByNRyzvKGEtW$X};}U<koA)wIM9Tg% zc`rkRUKgTX0W8~<qc=>WWf|{x?Cl~*qvfbK6`vrD-c#RFNdzR^uM$ef^R_}lVUYfJ zR6?;_f)CbJD9>&0IX*;g0(nppY^Pz`nqJ@L_}DXK^e)~rx^)l6$Mc@iC4u1Wyk~S< zBM`dFC9`G+smxtNXkTg9owx2o@YSDeAKtokLgmp3wU17C>(<ht)|jLbY7L#x)~%5s zZQWbd67sgZK}{z>+p<omgpX=IR6?Cl?&o7My{u_~a=$_&)IN8rgvZ8ujZp47q1+Y1 z<1pkq*RF-Ly@&iAF2O8HHC?EdnMd98GB22|?_+E<4|U2szTLeniwmK+DmxN`oGujv z->sfO{^He*SoC5aYkba)g-e!*^%M*kaMsY9lH=Hs|2%5PVjm`d1))zO9YTZm6ZyG5 zUk2%u*JQ}&7?7<R`5H*SMlJ-gaQq{#<WQ_{gH&teVIruU>+=#3_`2nxFEsI=ONsAc z@y%>;VTO{kZ~%sy(zh@4x?u13u`i-m0zUZi*6M<0AA;7GkVp+eH|2;;+?vh?8LRm; zgV5aJ`dkb`TY{U;Eg%y$pLI5IeSQxzL-TnJgs!!@b+6hV-|uMTAdp&(Oa$rC$eAEh zwDPop%+vC^8l+D1xdWtL^LZF#zUK2BNJjH{$ByOJYxe`hN(HxlMuRkK=^P8PTuWy@ zNUv6lB1oS`t_AVpXxVL_ZjhXo@^3*pwUl25Y1e%I4RWjIv+sfEQ!VAAKw=u10Ww1) zNf5ds=9cGt5HGIFxa3BV4lVb)LDp!wZv^pavHl1W)5t$SYBjRgDD<F4jsU5~l@T}h zsUR!0+!uhXles(F1+|#FUF6}@rNz1eqzA<9)7wD2T3+{q_%!kiNKPZ$K&bBSXxRg2 zEt|EJM}u@|v5o`j)W}&NT^d;m;;mNeeiI1Q)XnQYkS$tXn?ZUspTB^-qWOFTvPttf z=*yVdG@oNYdNrSgARlTzmx1`S65at4)5vc?YBll(NRLK_9VBYu*2@oq15c%Q>Ogw6 zSQ(0?krg0)8d(j}uaQSUx`(N)+6O}I<L3SW2o7MC-1qj1_Hlj2fp|5aX&^mX%8NjH zHF5<=^>8)!AA)SR)Z90NjMY+p9mK1}8g?*RRU>hb4vjQ`SV+e$^9qm{h&$%jf^=%J zo&i~<5$h0)aE%-Z(xZ`6KsxqT>vahT^`M*kogh<W?#_1FfkL|5>ErOBHDzwBcR=c7 zEI3=k4@H@^yka0-8cBfkX=DWmPA`;{*Mi`SHKjEk1L@ad{SAa}p>^k<U24#S8mR&4 z)W~EI>Or>_XMr@!yqvn{w7M^b4_yNq3|fUZj;KMpHS!=xzeZjLsnzltJR0}t$h;_> z8W0QTdv40LAVV~=0Hj(Y?I2!_+yK(2k#!)mwA_CW(xK)48pwRj$8#9waLwlckb2E0 z0)ns6l-@ZRq+iQD1F~HsUk4eCqdm8#-vyyFTbDcp(yNgdK&W@z{(28&wU+xHhl^Hq zeGUWZ)_jfu>C;j^3uLQCmVs>7$Soj4a75^q@O}`lMxFzSX=FPHtrl}*jU0n|ja115 zkY!rEP6OGXmAL@2Li4!>WRvD|CrGE}vkBxW&F57R>aSfe)Wql=d<0rU^Em{hOY^A( zc|-F#i(+ZDI3HxIMs5P>*T_#n=$3Q0HJ$<K(a8HCYqZ?=J`#N)b9c7Nbs)RST8xJe zwU}G4=^!{6RYqn4q*u%9e2_kktOD`kD9tV5PeC?nDL)Q^#fwVHuY>ezK7+r48B+84 z637<KCk`@3^O*<oissV_64HFW4&u{F_&tzXjr4$YXynfz)PrvO{F7p7DGwiu@uS7^ zfvnQVY>-<uk^$+`$dw@VIBIm;a4pC-E%!|zv$Wh_2C+cg68;NhzUDK099muTIRd0n z^EnoTddE%YG?1L;(@I1u;YyGWjoby&qmj)ZBej&bf-KWgt{RV#pv5{Eq)#KYAYL4g zy6uxBqNRKR$O<jxRUkB4+<M&ya=qsBD2Pw<c^#xn^V#_*%u$-pJ|Jr~pF=@vHJ_tF z)@weeg7~yrWGR+Lt^n!K$n7B1?`|zNfNa!KegdRZi}iPqE{*K!L#t}!aFBUg%C#W9 zTFUc57HB@_g1n&lTmjOrrF<I*E#G(h>n9+!8hH$a#-UrUmqE75l$}|t9!a^g)<57= zr=_zGF89pWNC>1+BXdDA8p(qcHF7OTyGFV}IyCYa$O?_T39?Efdj!z(8W{&d$Kq~l zoCH$T>Yf4FR#Nvmt?nz})32rTJ&L7~hd?Z^n%DCn9U9pVLR*U4^236Ng`L|F5#a9; zAe~yQ=^$MiNr7~0WI2fMU^VyKDIG1ZM?mOaQ8%v_Kvro!?}Loge1?TEezcU21eu|c z$slzaSpZV6k;Ne1L(~#p2hyeG{sR!Y2UC>L8Hcr&Iu0L(k55bIC6HQ;>>NhRYh*0Q zIxVjgL3}bVWMQ>{bZW6WLAo@u4x~>b&x35xQvMeR-5u$+^MMgDZ@B#)0inAQU7tFT zel6uRh;^viVwZx{YUDN$y35{8`6nQB&!C&~W{{^epTB_AYd#-=(A?stvtJZjuI4iy zq)yBIB#?TIoD0&WksCl>(NbOqLU$^;C42(p4bA5@kmZ`szd&d^bxXKU4E-g2oY7)= z)X_2?J|Akajt99_#-e^tfeZ$5Q|<tv`_$YL-V8$9j_b1ygzhPGeI5lFq4~T9(j$GG z5{}hMNH=?p(qbJ1vRTHW5*`gg+l8C^=^$G)A6k1nR`a<A<Q2{52OxAuft$`RK>9VG z7eHwAx<2oKe5m>CGC|yj>-ro5G6d7C+Zq!=W@+in0U4qBECQji>ZWrsh*$bJEtb<- z>}L4T=yhW~05Vp_q89rDNVDeiAxKQ~8TD1{3pAe?2;Fty)?zNmGR>zIgzh+SeO7?b zSar+uT@bq0&GmTzWTocwG)S}baccSo%I@xS--OTgTCAZHQDzy7YC0O^R?Vjtq(k#L z17x-4Qv{*A^xP6&1+rH2xdUXC^l?f!LhFkj_^i`ny#TUW#-b9w53)h?8GbbOUz*QY zkd2zpG>{FNPXc7K=Cc%po~R&d;goO-@^stqdiXr0#rhEu8H-BzD98(%&tF0MG@rr8 zh^@)(<%2-p(0t-Vv~=n~wrf63Alo#bi$MnOWY%J%R*PHU^Pv{&UXW@Ti)yin(m`Hs z310^prTOf3EaoxIXAB749pjFKDIm0+y6Mz|gfyS?K}Kml-vp`Ee7ZquG@oCC%+h@R z2tr$~o7Z-b`O?Sf({8ObhS#DzTC5{L8f7dvTgQS-)O?a4InC!15Zd0|+;0O}rujSo zGE4J$7G#Cy^A5;7&1a9}u;pq#hl9|Z;O2D<NSEd_52X80b&sC~>CwoQAoPVClCm%$ z@cIErqn7f|LDp(1KM#`8eBK6GulejUNz5&72@e6GXGiGU*DQ~^eNBW9%{FeV(?NP= zEGl6e$O_HpT96kspS2*Jn$NF6=$<2YWWESOGm@LvE|ak}X+C2?x-_3tK&+kBbS?l{ zqxswlvb*MUKM2iHZeD)?p>LJl^85>Az2@Vcg3i%=rhxQlJ_!(?=CcHZ<}o*~n?NRN zKI=hxHJ|4|W@tYD1lgkb>^~JFQ}c;|^l3h4g4An17l3Tle7*&e(R?<5RM)8Ea0`f6 zBkzIKYh=VU9B*hTj|XYjQl1V%bEexGjUdZ4pAHafC)MX$Af1}e&p?J~J}-dWs`>l} zgl17UFYk1W4bA5`kdc~CJ;*xE=Ry##=JQRE9?j>6AT-nNf}&U9jr|VDX3ggf5TE8V zd<Obd^NE7wv{s!3(xH(gNT){51F0UZ_SZEaF)gp}g3z-yhHwd;xz~qJ?*4Qgd}t1L zYw-*S-LEHNQN7*=@oISun~8d9WGqNdBQrtfX(=Z`=y@F?Wv4t|tvv1UY1U$Of($|N z-16K3(xK&bKS-xW9tByYkv@<vjcfy{KTK`Ip~s7TirX3of{c*4J7uoc%KR0IrKK|! zq+KHkkPeM31)&FQV$-n4&y66<cT)S}9uRLy?uelD;IH7bN{jV6$XFSRy!SW(qeaW> zFc7asYC-BXvH+w@OSu3N(^9?yB&WstE=Y$)Hh}bKWD5xG(U6o~_qRZ%;G^5iJI%rj zsl_@7WQ#`PApIJd2a+43w(7Yc>$JSC0IAdR>H?vAbOG)1JP5Kt^LY-0_MWcKKR}u_ zpW!EB2GD$>AVtmROpvEEpAL`?&1W?ctroul>D0(uAiWydZ?@PAyCs|evQkTV0SN7d zU7yQAR%t%>fb?rVTR`Y3E<<Gd&;u{GYd(j8bZb5*fb?l4JQw5@job**uaSp9a!05= z_!@|{vs&ie>d;?WUgJSJv{-c@of^r5bZO)U5bu#{UiX90kpmL9N5b<U^qd*D?*9aF zURWDXcL)390fLB#ST>1t=_C*gZPiII7WU%kONkW<#Orkuj>YLaM8zi@4_Si@5}jd^ zI9-`kVnuwhZiD!J{RRogW7w6cu_FFDlZ10RiTffwCW#KgwC1LR%mY4?M4L?#>oQ0@ zK*ud=I`J^=-!&4gHA%cvCw^aWi%tUm7>!;fodA|!;-g0VbX=#A03F+CBt%Ck8VPrq zB-(9~SdT%1J~}GEe|!8y0>J?7g*6hUVX2ak&ufryB&U;TD7fAv;mszA_ZlSZ-(r$r zpGiVnO%m=mNrW~WrOeTAY_LHh0eX6n>Jtf7n<O&QBvG$PVq;7aj~OKDpJ<Y3tx4i5 z3=;Eqnk2Z&B%v;ogx8oPvfd=I4F-w(dQ1}7WRg&?Ny1x966rHZwBIE0Z90kh{M$_u zq=OBmcVfQq5R*izO%fexlGqr7_<dtd67ZQMM9&dWbN5GTO%k19l31Nd;`Igz_!}h| zzpzlirpK?L_*><{v}3$zR*%F2_;v#8iSZWmJV>}%repg=izbOLGf2?4!X*AqlLWd< z5?XDN7<LX?d4lmZhEK@9&LqJNCJAjaNx0V}kv@~eUNK16*Kd*tJ%d8+!EltGeV~$v ze~n23>rE2cXp+cglSH?eBt~ntwY=iALR%$K|2C6^wwok8WH%#Ll<suX(ut2UNX$3J zBz}5Ylo~4*s5MDwib-NK3=;R%nItgZBtd!(m6}&P)NGP)yGf$UbQ1RkI!qE;VUkFv zNusMv66-QayxSmt|2mU|)|({KW0Ke=lf-)s67X#?iGQm}f^V24+;5WTc9X=d-L-a( z2Yo|K;-?k<N?*i-0k26yH71GDN_Z_++-H!GKW36Ztx1A2OcI)JlE?y+#Oe(a_BER% zkTXe;o_V2`IUMRRNx0J_(d$hTUuBSpzsn@SH6{sln<Tv6B#})fiETDW)Yog0z!sB) z`b-kuYLZC5Nut&sdizA<gEbQMg#tr#5{!rFE&#VxqrrH%*(A|Ulf<^@B;*TNdur)~ ze9;*uiRBF953MsvWW7mZTMZKM)3X?qGKT`eT9brmwY=sNU2l?DpFx6wG1YpkV6fgK z(KRNC(b{h{uaJMtFoOi@4HEXPF^RuVC*eTYH(X069Ej6eYbCEpFxqPn9KG+Y`-Fly zokSzy9+SkXM`*F4QD41Dg54$wZ8u4T*6u1LjK=&qlZ1Or5~sDYZmgI;=BK+ZH4>ux zvNRH<p9<1QoYtnQBp&E8NvPi>(b|z(tN@-@X_6qV4pmYP_`>u=M2*Bd4C0T|`b^a) z5cVEmka*4@!BCG*BECTNfm*DHFH9>Em6YjBTqn_3#2TgfL}T$fgT(!`4oyiX8V}NH zF^z<2ZJ0*lojQs6f_)|l`@XEjius})CW-fIB<}Ntya%bVK%zN=_<cP(3HYPcUM&{R zyX#F7=r&2nI@pL6qZLYSP2*vozsn?{ev?FKWsw#uMr(vr;`h^vAce%j0pFnp33r$z z)@zW6kG?%o(}@J>I=@E3Jtm3LRejATUT=_SpxY!NdN8jVD;lXYNvz8tF<-w*LcWmS zS9`dUPRJJy#ybrX^3yd~nHPLQaawDx613PDokRjTokSzC9)rZ=)kmnYu;Iq)4H6G^ zn<PR%A?4;C@W<mbbQ19S=bI#$Ge|7bW0H9FSG1G^@#uV$#Bw?bhJ&;QS}9L392zp# zATe6stolU!?IsCznIy8+Br$rBvzkuSH_{}5F**r_!#<Nlawdtb*GV`M>o-X}HeSm; z;`h~?B-Ck=SeHQpzV!wPhI(}p4To^4(ml@&1)|~bh@-UJqv43xAQ4})NusL^5)E!L zNr-NCRa!L~jn^3@7FlJIXpceSfgyf99UR4(BwVkPcp$vSB=JoK3HrC1Br*i6QI#^s zgYg*#3Hdrq65eQ%=q8iI`wbF~d4qahXlIjzSC}N)Wss<EjY<4{CJBxS>3K!NwFZd? z>ogMd`~9m-671GVAQawYlIW1InpZFoiqFtVFdCk3k_fFUbz44&E3R8i67DxibO_dH zYO&&8gM|G!E>L}90Y9xPRbs^g!Br*+cbg=#-Xzf;oy5bjK7&MjW1?DK@kl79k&r(S zYBx!w(<HGqIthd#Jq8Jfs$*(ip+Gn~-ypGAr%o`__L(H?i)-lw!_f|%goD0KCh^lx z1h}ml3I`)~CW&<!Boyp7NwgL#{M2;9!A_GzwiqN5uAZpJibU&m5($R8OcL!kNGMW! zw3ZIKtJ5Ii&=!+KMq*W&QsziFPOIEh5(#$cB<c_Jn<QL|m0n7$XfW1kkWjeKAW`3# zT0K_OU$2u`D73~T;eM0EV#jIe#6t0$LBi4XI*I%ITTK%1P14ed`@-!eiF6wz;NNbL zXnf3MJ)M}p%2M}Vp?EAX-}DLAn<TQzB+(v?gnfZP^%OO)urCy=H%QpmtrL8^wA~=s zc~8~S2}A-NCJFbNB;uWB#ELbWB;Ku)U?f04<LHhSY;fT^lf=6W5)Jg5Bw9N|PbV7h zG)OGiXOggQrWPyY_jgD#K3{C8nR((F=q_tFysJDz@Yh2h`8CK6cRg7M_OUqDJP~Vm z7%Ig&$d1K6oIuzn^g*P3oJPhsG@nz5U{{6L9(Y%InpvxV<|4+i#pJ?FD$$tECsM7& z{E|ddI+bZG)E?_U_SlBzRKqz5=}=o6uZ>%Urq*JjCEM7BSPhvZz5yu~6HUp6RAN!K zm=)d<WwOb}L{k<qkbzE<txI&!oJuz8q@g95(@9IRJ!c)8ZEC`^=Inwg<#h_8<tj?8 znOc)ADLvh6A)td?woo)kL&had`BW-Vn#`hP!6@*;=2W9-vUF=&w3GNK%7|tY9~-l+ zDQ-oX=_1syG>5{%v{4F;P_qz7;DNm9bBsy~mS{=A*5Gy<mxLpwTat^6I1Sm1+izTJ zjZh&8Br?e*Dc4crMVTeJ=0q-;Zgop-8?*U@ur_4UxrNzwt>PR*B<dDaM$DwqScPIX zr`z;wxL6q4c!;DZ+_5ykQh9ZNYolUOsx^g%NeH(x!=@pZ%*axTwonOls#rw9@c3jc z;lkoY5^yvXh}K`ch@NyQy{M+Sg5Lcc(}r%n`5~DL8=Dfje3pkEZ8JWxVJ7gaE0iRm zKq(59qDU!<l_Gzc^!;Tr@CVDpEt6}a4bN`QHrmq(m-<-R&@1*78D;<Qs6Y)9>DH#K zY(Z|;b5i+MOHC?)-*m|*d2Z8sNJ~)6W#|Elo^Eyfj?-+$@X&K<ZYk=6*V(|1rOo$a zW+`$JRT19kvTPnxraK911y$TL$<{^ll8dOhK3NQ&xVa8Iqg&K)%*01mik9Thg;aiV z8dJM#6w?*O6<aS)QEVp0HO6yWQ|-dfi7$K`(+x$zF^*|&KNj<D#k#^KTE<AdQH>^g z)L+`AGPaV3a1IRM+?;A}OfO0o3#EDBNEN$8tvB2}Xm?SuB4jjb;%wZ<=CD_(91%t( zqSKg8WR%50`bHodtf4uXr(HtY-Um7Em@u^dDY(6gnL3rHO+X;`<FWRzw&%x+g{BR} z9?>XZsuf!{HX?CA!3E<f%i+?~nRnH6**%*}welf^?Rp;e{$<L**ziUEH1}aVi=C#J z8y6=tX*}_bcXak_iDrTmjaoYjW;kN4m@iyJjqFS^Voo)a!X#Ldl+Dzn0tqvzkXFV} z!b}*mW=X;}QxguABpfM83Uho(QZ`eQij*W3D@h9bhLWUgrY03DNeX)qvxc-&DM`$M zYHDC+>tW}kb}>Gdq+YIPXrDz{YN?m@4R&K%>cP^~v7;+3yA8F}gQaB;Vb9+x2cusf z3HVr2m2zVNex+3@9Sx4#VspG}hC*YiDcL5Dc4?e*A@b>DE2c$z`%wH%j<gAJd8EJG z#j7nTq1pfvmbR#FQrlG=XQT=ie)r+Tw#>A2JE<w@#kM*XKR<`#&3XA`YoRHdZ(+Yw zp+JYbaGZ_}`$RsYVM7wf$L*9(F`dgSv6^tYlWIvMGZ`GA*&oi;KIK!|$8(L(bmZnl z#4&hdTTc0eAJS;0kIvMbNf(NVOg4KCyil~sCu07ZojOl1W@4tCrKv#TWQ?{7I~BVc z4b6$U>7|@E?|=)LY*ExBfpY}f0VB3+p*@Aok@MUls?m~|Mum4jo`l)>#8gW*zeItP zGueXbG&hwxM={SmC(U)SQ>@E!KiQw=&{?0GK7Bl{sDP<d(`k7+V{^Uex#Fb^hjtAm zcup#lN)}S4H@f_kxy|&0ByOt2W@T}}=OQXji66r<j??&{O*uHEPBc!4`6%8wUN2Dl z+uJvWCvO`XN#*ld_pEARTRPLodo=g>pU)flIG1;p=|X~zHVO^-bk0810!n6b&B@lb z7CODLTH5mXpJ+}NniIi<KM>;s!Sm9se9nm4(>O}zayY%mV5Q^VrgVF%G0=oVM>|RK zpee*T5YhL&)Bt=Om@G7;(}|{hwk6S4Z1P9S8M4J@oHv#p7YHQx=hP+Bm!@-xQ*b=d zlFMV;6&@%ejnW1lfn-YNQwec>z-=Tx=ye<2p2NgUUueTAI-M6fQ(K5m;1ZZA#Hlb% zfFW%cVNbQ-2|5u?DlvJ^BE!OTYZ9A?Gg}6<1f2a&8ONaRXzxPGIEHX!RcOnr`wf{n zrf;(VN|{@;IM6BMz=vh_<Sh%1ofCXH<%VpVIElA+2{Z^CqnzilUm$MhLGjo`OgUW; zC#~2jZ75D*Ec7IXcQ%7fff|+vVnZ{Hd2tCUm*t~T=8dULF<HQIVV*}KAG{?NB1w^o zxD;UKv)FH+Em?dX*ns)cKJj)&j{K}&`J(pV(?T9e`h^0E8SPb)#RTpK&_0I6M?O8E zZGvaMNj&#r4#!a`#<l%%a<+AGO3X(#nPMLo@U@vnoaWKh3ugzaL1zc5LEa}h6FMrO z8M&0siE3G+yckp(Z{ZSL=D<<(qE=koDjONQk%1kk!7-pJN5`1gTOGw{Pl!S#=FFR% zm`q(Xx0q}==TsVH%&18x(IDVYbDP_WjoI^Btwdt_+!@K%#!M>Du>cCGhPHgVxCCRH zu5mVChnr5>51x<U0opY)TX|xhM^{H{@Lcek+1bgs&{Y%inYJj~aP_AK59ik7Q9`q` zb5EUK69`x})2PDO?cu^)O&|;lMxjU_zeOOdH9?9Yc@VK?XQ$u?ZEFG%tA;isccM=4 z-l2x#l0lua6;ngD6?0@8#(Eke*@}~S8i+Mf6hPD+m&g_sn`@%TfPb&U??<kr{55_* z63^p$;Sz3wNy$c0Uh<$)Cg!#+oWZjvei6b!sYNZgl3atQhu0jp2v`0TMac<9DR6tt zp^3I8g4py}aLi~m5pFcG4b<S0zf%C<wpLWXvBupRl|5_?KgPR)&4{R6sWzf17B?5= z8g>mX^UtRC^Xa40xyCK+{*SQ-KE@ubY{z(?k}9}Y3+)+4Tx6#L@WBp^nlde>)WtID zuBB5xDqXZM7mK;k$ebMQTg%1}hH_D8|57%JFqDhJUkj8g7aO#W<iTH|6E&OBfsU<g z<2%NWX?SugTQgxOS2J8<DjS1&xd^nYDH}r=%0{7YHp;agU7RWz2Yduut|qQQYjFBb zL~a$vR^!;pHmYO%m`3IAT*{SR7|K<czmzE#rOdZAO3}p;w(~WPH29q>W%l<w(hw+P zaB5nbR%tbLAE$>5${)p+i;H$LZ=cA!)L@sk)L@rZGiasNEEP&CeYDal)b0*0HJ`ii zrAE6i4C)LcKBA;Kw{){rO-^CUMJp|?>E#r-ggbyMLB~R6icxAaW)CNxSw<~l<w8m~ zvy_U#80fq;QnqFk#b89C^B#)fe0gYWAth!bx+n`D-pKD5jU>vsl(ern$Q!7Y4UaNy z?Rr#fao6P&w7YONn^LyEZPuzn-#=EWgl02}ui1>F1jkmkQjYOsszYvND<TX=r}Ahi z7sWL=wWe*6JjK_oWvX84VAiA5qjF_*U$aJrwWN&VY?MzE2P&!IR<XQ>-zO-w5~E_- zRUe}UIPVo!``h!%m8j_Hjyt=tDtfx3Z~)H=ZBs7Mk8K_^QiT>Obu&gU6<1qIV9ZA) z_L5e1ml_Pz!n#+*meAckK`XcsDz<>)q85Ijk*(YGVIXbgDj|&n7oFY86<8RYV)9&} zEYK*^z~x-bf|c{BTt3s=EM|$_DJ{?Sv;w3|F-vW3qn6s-tx2<)_0o)$D<s{_nkWWi zs}NH+EnP7-2gP7SQP;K@kyMk`Sh$u}sjXC#(NwC*XerxNwxMj>$Fvi?%sO*3F*mBr zjZr3o<Yr}Q1<wE#*36}q*36|9*UZMX0Tfa*hxAJara4^ET&ZQ9)IYv;$+J=m3!Bl( zJOkS+os5B{nT%-M3HH|y1v5j#ST3sjWq^?>$5pImWL$nqIOdXkHKQ{;ly7ayjE-_v zcW{)mx?{tzn!RV3D|epaXjVxxxotsRLsw&PO%ZFZ+$Pky(*nGS(RWm3>aW?%8feDK z<(F<sN!+XT{N<Q=<<R}w%q=`eQ4DT%*+O-5R)iUmG?NjH3&)Gbj7Y9QYbRPwR;isF zTiJGUj33iZyjrbnQ7SBBD^nP%ul?PDw7P?~oYft)hSjW!VXj;m#nJ3`&183ndzpm4 zOLC%=VB4LNV4LP`QZ;RM)V2pVzQFvMk`M>(&Nai?;%agQtJ6Le%%$y9#!;)RUI1~G zh!_<I<-{5&*`@Y1q*7~1q4dZD6v}lhDU@nb8&>~H+a9@GOT%JB(!TUIqUkm}VpB`H zoxX4p-y=AmY-8!S=C)s{f!fRcmPTpKQiIcwrIyk*)P0;{8k9b&Uj!Msn<h1X(^kF& zs+U>@ovU3zMG}20zX*_H)Zxks1Es_UbqZ_X(sC*eP7zfkb6@N(VNh}%&}?5lr8<?1 zZC^vJWDdHUTe;Ywfz9E8&5?o4(Sgmeie{(TE452$`<L@{I-;yiLi>oWTyK~rr6&|q zNnsV+00p(ZN($+4SwLRVfX+`hmMdc!t5QteT2fNoJV0Sx$CC1@CUYBfSMsWpAq`d6 zqA%o8s#w9`w<;I{WeiS@OQV!lR`+r0X;2(D@dRS7Gg8Vukc(5EfqY6!R>|8bV?}!z z1229WxU|w`fYM5zPgGj5;>sQal?o-l_2ZGRt=M)dTE@aiuGvy5R%&pnQ)(%#gzlr| zFEi5%tgQ-Dhr4dDHxXy?kF#vdj$mT6m3vm<oC6k=T2^*&YFpW(wAST)o!VEj+Es$t zK0njG08*IlsI13!M+SMT1~UrHHsX*`DV2z%n#xAw)w^a^97|ZtNMfGSPBukOu0fBY ztO3`vQ4MAkO3YmlXvQ<FW@NR_axDrKQd@hjoQW#7GR>hbPA`e%*4oI)HR#2&mzC>P za-iwzE`T)s6^j|EOcg?6HKS2_Wl6i4yj<&E5``O=t~k*3ZY;SpW0u&>;z<X4X=cR) z9DCUW_ynnZ=C-M9w6bl(B`P=C#TrWE(h3b0)u892+~%QIOf{HMxB%s9q}?K7bcK4W zh?!Nz8YwrEm~ko%SmkaLJ&J13Yoy(dVn$LcTQ*vmK2q;xF`7ZSr^U>vQjOG`Ui3Jc zMK7Fl2TZwcGHm4|mZ_E#uiV&!%`Lw+w`dk4FZ=!*qgD<radtOzJ%`FuGnP!3tB6BO za^T*k>B8BX&5TMM$|q5_*$0}>oweQNOIvXRL9|NEu3C&j+BYT{&F;_==St14+|Xo< za@_h<t|AUC$)TiG^=2<!&R&`yCsDT9wVSLeL@Zz0%FV9ak5$r&Zig84wC~t5B9z?6 zB^K!G$A>hFV~xCPQjQEuY-NuLH7{dNBvY10!}f6?47_f<q{xDn)UVP=QFq-Xkt+9` zefNRgtK}n>>p44~FqK4e`$r#TmG_cp2022Ndmu_$rL0p){?bdoqoQ(ZhF?j7+8r1r z$>`RS$XuGm6%NRqiYxX35|H=*m6XBF#Pumj2$_g`0!yO1mXb(L$`xW7=91{njVM@v zM0cr_<ZRkY5}?84IH_MK+MAnUE*o9D>7}Ful!ES2l8D_r_MMX@Dd=Ww*_342?-I(| zPIXs}mqsi*)#z?YqnZZ2Ch|7TGE<IWs}PZIXVL2~BMMuEh&)Wn?L1_3)nlMU%1lRk z8rq~}-e_ds&}3JklGV=NyzR-3Rf27IYW#9{McL6Rnw994Z=O;TsqDlhlWT!yi|?<> zK)-S?7VQR|5vaSC4n5cIj5(Fq^)MUNy|=4EtGf=y&0oqMx{SpsbQx1=$qgr`_$An` zgL8$+UZLT*o0zMrFD@xTe%z&rr3tE6KtoPFRJYO!I98`9^0T;ANPNkOM>#2NR>|VG z%2=FIlrfbS#&B}VRD$i+#H{CDpEK^!v&Y0hF8qDGyp2z(V5z~WMX9B<61tC52ZL%K z!<F)8L)pC9@-cbielKyHq-SQ{plD|9-nu9){&I1&a_NyO6wGzfN~U7BXL((^b`PZ6 zrDbdtA{sjuEuy(&(Tv)?lofK;eJYfI8{fI_vO+?d4~DE(5;pQ}kg`AcrkVkqoUR!- zsnTAm?C*5gKpq1%fOZ4vK&_xV4w$5J$LWA6s(u3{NV72Cp*m1%(y44q;9d%x?|oc9 z8D6}QrnEO*uK~N$b^C<<DIyHmp|%UE=+3VwpnW&4UcCW5+%-ZxiuE*<YE??4Y?aD6 zE7d7$#zPk9VG*fBCbc+~F>W4~Pjb|5B9>2TOeAK~WAemp#>#!f;tt}Yf}x04dHJLM zP%IRSM1l&0^!t2~2t1>)a4^KC`k{@N?{3|AX{70_VIHg6esbjaMjT5P7pI)ZHsV>) z);9O4k^&E{w#GN67Pc*_nd|t)zJZ@0#&aPTtQ2Ht#HqEaC)s}U9KQ_2s&6`<M96+c z9JJK5v^thir{m`iZ^X|Y_6zb10<Tq9KR%B~DJ2~*{B+_@`04EJ_%X!)2zDrfTC1*h zyzXY*fv01h{gE4w6#RO|x9g58QSM<wJl3~%g}@8R!_QYcp7&*p_|F?KKL(!%b`yT* zJAR9^nc_mKrFhjLxWZ{%2M+a#2XWeu?<7nQ?|cq^FWSD8YHf9GtsDmAgcte!4L<Lh ze#+xF$*&&of7?FvnO{TEhF<ScQ>IQk?vz>cX3d;5;Sl_peB!(*hv@XASyN^ocjDB! zhj<4g;@fz4;yuUm45M@=Pgqcw&z_BOQdn>t9^8>`NEXw$?R!BH4{uAIw*Wnf#h1y< z0$SW!T#`#I$Syp)u%JB>S}=u1&4PTg0FUvYc%t#dVN}>&Yj5jt>)lH%8J?JK$Y%@L zrlNPuoFlv^<%;Q+^in(?#5)-iWg55EbGeqIJTYq;my60qulMoZ6K^W_>HFc2c+JI$ z%#8G+=0qKac)EZR<JT;PSJMc0Uevnwt9DrR-qx^TwfJ}~2GvQP^Rjs?$Fzn4&Hyap zeUgXLvj$lw4SNS4SK#fus0^F%rgAK^;SqzZ4*Fb+a36$|5PA_#MmQGX6ohzEv^5nW zp4n{S$1>^3w$@C9CnG!_;aLbzM0gj%lMrr3ScmXW2v0^xb)I8~*nBL%(KfAvsD<%^ zun5m^+XhekL9=9=(5|1RQK+S;QEuRtO5!OAc-+~(fHeGbc%S6S;$aho=4`ge&1F%0 zjS-s;lx0!5sJ#xsdz8&Hs0Wp`1>r#mvk3hNa|kCRJQpFR39E>(1>s_ZS0g+R;SC6v zBD@{p`3QfEa2dkiA-n+L3kWYn_;-XCA*@247bE;K!sQ6RitsXoQxIN`Fo_U9RoZbK z!YdHoh;SvsE`(Phd=TN)2;W3_4Z?ne*CG56;r}4~66$w7!h;dsh|q^{6+-m2bu+?w z2ya1n7Q$N*HX-~rLh7g65K_PX3U9MN_lKRv)ZPfsbo+BE&dokUe^S>`f0|vlC%6}U zINm4W0l)iLRl^|pbrfpaF64f28w2@2JRGu_MyDu)@GxcCS}gAWe&Nl3sUFn-2jcyT z&DWvcRJZjA0|@U&h-ac(8xYcV@gTw`gbyL4{(l4^mEczhA3*pUgw)@^MfeoL%?P(5 zd=%j>DD7hiYY;wxFo5t$gw)?pBRm7)vk1>dxCLPc!siiE|NjBu9SHw~@BxH<2wz6{ zBErF_$4dx@Abb_!Fodrmr2g58koxiWcn6K`lJcdx9)oa!+mAC_@r12n;`GG4HauGN zQ%qOXW7Lykx>|xfMAwMVt=0&qNAZ;FlRQfjMdVY^`t?Y}z5s8$_JT7_RCZzk^rhOL z-Rva(P<^OBY5QGm^AAyfs-vgM>KKJ^5JEiX-P#G^X$W^l*nn_Xgp}j%2(L!C7sA^R zRwKLv;V^{j5$=ufVTAi2d>Y}t2>*(3B*LM{e}9B~B0LbG7vU&`6A>PSklNXckox0U zyeAs{aW3rGU0UZLJj?BmX?V_329G#%Hm<}xdR_~6Of9^f*APcomc1XT1JU*)&ZcxQ z3@3S7WygqZCZ~0Qg+kPdB&*Q{AxO~$cqB1ec-SzXBnz{}Vz$NY7@B8$MO6Mv^`d^E zDs8m65A8s84I><hFoN(fg!qx=j#`ArB0L^pEy8mUPC`iA*%X8;5KcpQJ;Lb-*CL#O z@NR@BAf!2K7Q!bGo`{h4Q?n6Ll}<)D9^qVswEdleuomH|2x<E}4dDWWrz1=wJQE@H z#{z`ZZ<Mz=A6^AJ)#d95zvlMaTpXno6L{ni9!N%8Q8iqgm)=>lfA_-l1D?D12~X5j zgMq}Xw~)JvB8$&SG<NC!pUOe)Oyk|z|DTI;Q`y=OjzhQ@;T(kLA*A+fM|cgwB?zhg zmLjA+T85Cu^#us&knTc+^n0ooA*@5#fiQ>gVuV!h%Meogtis!DAM6{seX#Ge5+&`^ zw(!%o4>h7_j|Og^Ptsmn5XX5@xv0HH;!Vdi^jh`*G502LSykKr|3Og+H6XRrET0q; zXH+y$s|Q7WC{$83EejA(Q51p)g>t})m4tS+tSlS!Hrc36W@UzDNt0RDy;fFMRuWd) zXrsUP+Iye#3_N;oH}CiVKQHmK&pLZpd+oK>9?yBGhsf(zP~>$RDDt`;6nWhN-VUw- zrGH-wz6kyU`~bWY{0_Ve3_~t=gKfckz_Y-0py=0qU?q4z_yG6-xC?v`tOp+ge+3@~ zTf^sium`vSOadPP8GBief+E+)K#~8or0EspSKv+6kvdsfKKZA~7skgIDc#H>seJ|N zrkHvWj{+QtIAxKBmVQ}Z<)teeLb)a^aR_DoRE*^gp}e0O)UI*}v-0`sj@ZE(A1S-6 zTqTQjNGY0-;t-O{R1B9xNGVgfBtp>cszg2xDf|v`;-u<CaZa4PzLxknkHk=YlK41D z6YoTss;iXXBj_r*B@KUL!p7=ceSKA)^i}q_V=wJuU(z16+{n1%ZA0Hf`?ckMAJ_x@ z3`_>U0H=fd!9ws$a3T0L_z?IFDE4{~6dgVU?f}0BKLdXNWtw^zlz!<~unYJb*bDp} zlu?uwZdHr``E}=tOfVdr3N{7B&YOYdU?g}a*c^NaYzeLhqrlA|POIWA@Fehkunj1B zd<rPzlXhTRustZ_($m2H;OQW93X92~(&sb4GVWtR#>&>2;LTuH@DVT$d<yIaJ_Ggy z86#P}z@Ne1Abq~o7i<pp1L>Qs1keQz1e3r-FcnM!@%h#uFbf<47J+Aj72vtxHJ}?@ z3JwKt0f&KNS1F*_->>}j39`R?ph?@V;V(PL{!--IZPGiW^U%H`>;UEIDPb0r1{NrK z5nzF0r<!0au*@MC3#@Pm#sZf(1jhn>R?3&9%2i+QCYEGACXBCA%2#tw!Z?y0B6IE% zJtb9RZ2ziA-D~-4#-Et2T(gjs$m24w3s?e5A72VC0_T9M!7^|SSPqJ8uRxE2W!orR z%NBjMrubw#H1G0!J|y^Wz1xXalNfTAE0%GVs;pErK-S^{MUvW~<mOG2&&7(vsDP;Z z?CjzkMo%#@BF+t+MNlQu`?KPp+>xJ1Z9lh)n7XZ$lx=ULNqO-qf49VO9Fk0s5~1i4 z`OY1KbSYPoieHk7j0wY0+2d`KSCEG^su3%Bs}yL0WFd~rq>vxNO^R8B8ObH}QI70e zZZ^>d_9e2Hww1ykH1s=YD{0$xp!A>jfg`~C!3>E9&ITU>OThJD75E4!OLUKdYr)6C z2f>ZtQ{a=}%iz<Xj7y#YWjwbTWa-S>0<xrN)qpaeeje-zz5osYUjk)(R}0PtUjs#- zc7QUkegj+sz6IV7?gGWHy#tCL`xjUT?gk?f%)4L=xCcBP+zWOEKLOp~K5#VnIhX@} z0hWVx;1cjla4lF5-UEIO_CSXZg6DyUz)QjJK=DUEf-}IwU<vp$D1PTxa0B=|_y%|c zJODOoVpaSCHU`Bu!a=d2pZE(NpN*$p(q?18oCY@Jcqlhf>?^_!I37xjzJb+DgxJ7p zvLFUp&2%UstVRq`Yoz0w%6uf-H^oDem;t`2uR{#-O%*(_FR8caZ%h7!OS#TOP9lr$ z;5lFqFc<6zUIX?5SAf02C&74d8`uy09!vmb9ykDu1<wM{0~0}!ZxSf&a20>S<Fv)J zlgwQiYg@U#c2MKAjKcq>mk>`N!qrkNQ=Y*m)pBjt4c0}350Q)ix=03m3vU;KDd0um zSa32Zc6urJ7?=slxOfWq0+<7yLcQ}qvCC;-XK)56c3A-a3oHab1TO<+UBe6h0L}sL z#6HTw`@u?(H5KbBkh!?E1Uv<-0;PXn3W~j43+941fJNYq;5={@DDu4-ly+D}8NGx0 z>+#{tFL}loz{>NrgPO@@nugc_5B3#d2UtdpiH@`e#jN4!7>55*{@n|o{#5--4G#k> zMZ9k<MBPd`dK|gaN6;%MtOy0P<6h^!TrGQg;6ks3(lzky+9`RLtG>q#UFTem8L56n z239@`l;VAZ<Ffv$H%RoQ>aVhqMz^!c)+~zU8Io^wYzTUMpGAzPJBuvnr~;RGq7Zyv z_}~&PtstnaxX`j!c)sOX1<~wF+C}tI`W3ICZ>AlktzH1ff!n}h@I~-C@Fh^j$=gBc zKWf2!;LD)&AFqS$z#X8h2fP8E5AFnWz_-C!;6K4q@L%A3a5uORd>@qg?;h~);76d0 zk3Ru7fS-cfz<uD$;Af!B^Y(*ZfOVkk>wFEiLk8b~B9=oSYj@U9U>o%HXRtl^8#oyJ z9dv_XO|1&nK&-~#GO!7F9oQ6H2}XeLfsx=IusL`TJP~Y+JflIz>Q)TMnA>Uvb^%WY z8EadofMO><!(*_WyvcKs{U&g#pPk5z-nNq(%CfJ9cCvw|N41lkJPfcC8FKB0s8uY7 zX{S*3`X~%-gtFg9Vc07asj*4LXh-yo`H-P#uV_&R9Yb4_j8%fIDbP^L6I9kq$jE0) zGA>RdsmTh1(}Sx3bCP`APNcE~V(VQCJ5@Gp3oXToB&Mrv?AS&psl*ZZa_XzBS4``f z&PO%GhtM=G5zKPx6Kse)`j)?1bilr(?Zp=PWmHS%eR2&&S41CDL9xa2z+&)x@H#LJ z6k8kxiY<-?_km+TvBh-oRPX{&)=I{Mveq;Kl(o1E!M}kM!PVd-@G<ZbQ1(JH!56_S z@O3a7d;`n{rH{!2KLV$NGM1YG9s*~AqTdDJuV5kA7>N{t&A}3|BRB`_3C;!GU>PWT zDdiyhV%9uR#(ML?>0kwT16T=)gs%jpPpSr2fXl!e!M}q~g3H0p;7afX@J8?i<h%+z z5xg0U23La<z}vuy;O$@mxE5Rp-U(g{-UZ$U-UF@$?*s1y?+3-EI}sib)c2jo;#UIC zlEG;{n@-`&>>L&0YxcuRi`l7Hy8?*HzWhv^8Edp(x2JzMqm>^erO+&jHs~GO`^7Tf zCeIvG>Xp~wRL|+A!~l<=)E%OX-kAF27xP_USws@8(KLR%(W^EbCOV|4{1#tPUaq1p zA>qInNj!%yf-<90HoXaIsmjuuJx!Ioin|yUPko@jM3u4uB0551qLrw4VtaOes%V+C zP4^@6sd8^|VSzI5bxx)Q>@(|0^%{q!3JO?~@6NNnR70YW?PgHhdC6S9CM~_D|K8Z? zJeD0qE{R<O9wW9?S#*(0yudb4$JXw#*10baC`4E~q?1V@uQ|~imO`<`WKJ$gv9n<c z|4MA30!)SElIit+&=&8k{9HbEuekjlvOl+no%@E|-qVDKy6oSaXh-Gt8_c$jCgu{a zEi+A1koN1*K7t-MwRQ;QnjntNB+(8$+##5mcncq)UjyNu7NH6kQOPp0&dFidUsTc* zqkOSD{QKCAPH^&eHH>YK!nE&?(~YbWh>sA3n8IHNLw_5eB7Wmz@O<zSa2mJ|6yx~} zd<Fa*l;-&Y>`I{sw?cHf9u#do0A2}x1IoVVA@E`FTTp!Z51{z&AHfzh&S6m2#eW3{ zfWLu*z$2gsY}AakC9nx7!``OgQm`4w-nrEhybnAP+y<Tm%1FBvSPz~I{tli3vL|S@ z1G|8yg0g<t0c5YqIvtz|x<Ij`uHY6h4rC42>IRCTbO&Xe)e}qsdx5E7Z*Vl&51bG7 z2U#Pr27qEN1Ht#fBv1_ET(AkM>;~I{$slu0YZ#ahrhvDCBS2C4ksxDOD;3-eo)1Q& z*lA!Ja1_`cOb27Z3&3vRI4}jw0O?<?2_XHIH4&trvMvJe051mVSFB6G^<WnG5jX`z z2drFB3~45a%&b}98DJqu9jzh|-mGHq3a|ux81#aB!BVgl+C3K(n<xiG+b;*_gY&`b z!G++9U<G&>{2M5GUJ3RCuLKu>SAmt_)!-8F8t`qf8vG}?6x<E|9sB^i4wOx->%m6g zjbKyoX0SVWE7%jf4V1oB*4%^l+rLAPWN+>(aJsK=WnL*iijp}}en(dItZpLN7j>|& zqiyTTe)>crnO@LzZ{o&X4mDqS+c@W5bxzWK#yTY3efql;IfVB(&$%SGM9>}@w&gya zd%blmxrIJ&A&$kqr2e(soWY;?Nx2?FULuoCpsY7M1qw?~gEG(C3=RXgfMdWKFdN(o z&IO+b{|0UYuK`~Kh2>Yl7r@uRUEmH-_UGOJe+1tI+rYzHpt#C^g0eoi8(a>)58eZQ z1U?R;gB5$hPr%O9V;?vJ{0yuBKL;0sb>Q{jm*6_E9+a`)S0HCbtgpf6!Goaa!68ue zC6B-0b-C8iFd60a^L_dvKLC@-qR`B|T%|3<aIQdYkw%N=+1k!BNGV{5Alp%DEH7<m zUs8^=3+~Ah*~`@=LWZxD4@#%g3=}>e;jd@Vm~j!bDE_YCZ-zggCGw+gGE{W&#J&Pq zl#We!F)Z@KaB5s8s%B0lm=j_$jgu^NM9%jpm6Y0<-c_ZO%yl|``lgtlXz{Oe1rO~@ zc$PZ1<j-q}_?HT)M_aHh*bWqVv<Lfu9l*1|)4>$5BRB$dfimAY1Iz?Ff!SazSO|6j zMK))GBEz-(1<O$OKcsBYgPA@VrsNfjp{oDc@qr*2#*tO6YWbq0%1~U#F=bXnCiW#f zip-kxmuraqsFUzL5EPl61&Yj)z@Fe>P#W`W&;y<Wo(Cp_7lK2<9B>#Ybsq_ejBe$x zdyt-89H!3^j0X#RG8!kpaQCORtf4-MDvCa7{Za3}9bG)%67ev9_9eWDY&!6Fzz{R2 z3tfUW2^4lO0y~0}!M@-npzMWQ3RZxb;I&{DxE#y@Zw7P0yTPfT%%7)$kAnGN4LB2& zk@qZc4_FA+fkogCU@`bRSOOjay&#K|)?Bb9SO#_k%fVjY72rT{9yk<S2+EAA0u<RV z0;P>)za}ZDjiilZ_!GOB<!hq}bZ{KmEyx@<H!rV9|16j^8L^xz!U@^Cp7J<gz9)?) zS|%lo3A2|oT|NpclfFH7(L4JRzNCG^`4hdAYdQ6hoK}F+_pAhk?;A}07EssV`kjH3 zY)70^!P!Tx-?*ae|7urP9QJf_*Y(qf9g4U&E>2G%%6x==#MIl6rXS9ms;7}lh@(lx zoEG-tTJ&H*XT*7jQz66=Nqpa!uv~svoryLh5j8oL*kZ&ccHpc;P61rbAD3*5#)Gb= zdJ<gBi<zpZArN)WIlf~OE{JM>QnF8$WSZbxAu~z((uV$L{9L*;V&h|xyR_pO{MloO z+i5RpleM6<?VX^kOWg%Zd)^IB0PhE%1s?%rEbu7!9k>aUy~3x!1n?Qq18xQ<gIhqU z@k`($a64E9)`GHs@G^KW_$s&?d>z~e?f?&hJHeLp^>2c*ezXfb7knF(b)$cR6TsbI z1^5BD0{jq^F~nYw^P<+r;M?G*pp2zH2SpFR01r`*8I%>Qubf{{`g#^vcvO8&q5YK$ zO(z@sim(Hg*rWeqjr?$$YWyss1Q_W5Oo7GnMPIc_7L^q=RB2Hw(MD}NQ?;=KsIkNl z1<^5b`UcFlOOU8|Q7$o#1Tds=1nTB=WNu#~YthZ_{E6Pkb&$3Z-TVQp0Ao&IpBX#} z+z7S;w}5RxDg6}iBd|UAGuQ#_L|z@i?w||o19k>yfw5pQI2?Qq^nkM8kOsD)Mq|MC z;02(Zw;2n{d^rQm2gidlKb{B{ftP}EE-n+40{~gz?O--2`_#E0XPd35AZL-S>EM@O zKKLUz6YP&p&H@v~M}mXEB9JqkRtY!`ECnwE=YpKEv&uov#95bvPk{5lKfnr5baxRb zI$q3Qu#QWU;(?Uhi;k+}<GguV$BF4&fjTb!EShHlD(&k}M7ius%9OT-MQ6->6+8+b zSA(Jh%qtbos|XJc>L>d`6E&1^<z+seJ%z>jm*a*1&w9#lDc{YXeF<MuuO|G73CML5 z^$=cf2Bn|81?&Q@28I7y!9$?vV{kpMML?qevQ1KajCwjfW)YF?t6}R@@F<{l#NjM~ zDEx7jTzQ4%gtebACljRs3_<spYaj&mnCl$UQF_c{c8c|+?o9Q$>=}*j6nU?(L@^b| zBNu<F2Mk^mmE@&Z50@l&gF(q<EaT$ON$xk7tA%b~B5%1rnZM13csK1MZLkjP2HpoI zfe(V~!6(7p;8UQC8=nC!D)THTm3jf30&W8<!Iwbk-(Ch!gzMMA?%*5XVDL?l_kpZk zpw#MJkoPLA_rQ0+J>Wq2{0PhfKLtfU_JN{Day}<mk2pW1^yn_I<QRJ7^ki9NWM2_> z;OIS>s9giaDud{+SQXp{DAp1mK`WN1UXWsm^7#+N{)3+EC@K`71IJXyCy=tVD3|nQ zzTsHVK=0^%naEr8$iFZ9iuMsb`VPDb43ETTgH6EaLDs|68gB$BrALCI*)72)v}qLB z8$1b=`9&*mFnBU3d+Dcui@}bd?ALVy_kd@D{i#tmFcItl%J_-(wu)4+H@FP!1O6TC z2d)GY!PQ_AcsDo*l(m<^p!8wqfM0`duo3z<6qG(|7&rkO0WJbP;8kEMD0+H6D0}Ur z!L?vIxD^}=eg$TLosr*oFd4iMoC#hGivCUpMbBk;5v=E;Uebp|%kyLC`CsYHz9sK? z{_IQ2l(vR-r!UKfN8uv}6kc)-&o3gc_@KUQFzd5t5{I>GtJKGHN^$mFJ>OG9OYtc7 z6=;yH{kHu^^CG7#Zsl2R{ix$|vS(+CX){SF;XM-Hq0MnK`N8yz!c0l0hNQA16JW@) zZzMgLF=YAjko@eqOznN9IX64sD?bA-R#ir1W99uQi!%ohv<2r%m303g8+)4q9~8*! zOLC}iaxf>$r$f-?%gJ)-vqb*3Yms|5_qvR9_1xp!U!Zor5`FPAr{}3Tos3q}ooMNq zX?F4RAesu45QvG%auPFT&YYy`KG84bSe2i|%=N|0E+eMYM%2_~CnIM4I)LU~+)1G{ ziNss%#N*_<FjwGYX5J9;Ut1o{!&@*0E^$%&Kq;ufTvS|?oJM`fsL!g-vKXBdbE=F` zxK^9{EOURmxxZMnm&?9qBS~En->>gn(^!+`f6-&HgUk4nvomrPqW7ZP3&8#$3py2U za1l5Pyb`<=yb4?fUJXjWTLns9)!;wDWuVmYT2R(vmV?bjRY6&Yz7CYW_Igm(U~T{t z!5cw2Ke!6a0B;5-fwzLwz}vxU@D5P+%kBc@OvE~{2D~4Xa~ltWAA=8p-+&K;a`xd- zP|iF&1~$UBp8yAdPlBVsr@&0`S+D?n4wQYgt>9JQ^WYue3*i0Wiy-exTHC?bz*=xG z_zL(f_&UftdDadv3>m)#o(S#&WiI;;$U9ipKf&qXZt!w&4=BF)Lr}&zAAzgEkHN>l zPeIvl+Xuc3eh%&e_k-_)b>OGqmtZ~k71#{*`x=Y~4}s#NzXL@re*k6w?Jy|&Z@+=h zgTI5XgDiqpa0b{413w4D!Tn$acm}H20_+2}1kVOf1c!pH!1KY@U^>_qoC>xFOTZ4` zBJgyOGmKV8a5Z=axCZP3J_Mc#J^{voFM!=Z&aheCLD}Ey0e%Vg1P_3{LC%m_eZVkG zp)VK(_5)?#uRqumOaKRh1HeRZAb2*I1agkY8VqKGL%`YK*`S<(I2Ytxj5Q2g45ol9 zz!BhD&;vdQo(FCMM}t3s<3aXjtqEW&@ItUHI0-xrya+smxMkfk_?`P7(AyEvWsES# z*YAwY;}>3vGsof23wUWVyQD<*KYNL3UlDe|IkCADikw6fzjcssKo=r?#bJm=Dw2JE zMEs?6YT9j;XUcM<(BzPSLt{ZwTxKjOHEl{ZuSrWUAU%s4a#|-TS&=z`k~34~;d0_j zzPZ|CeG73vfA%Hy7a!A}zdeRni@Zc8uYlrWcYu??onSfmCU`Tr3w#882dn}A1%3#= z3myR91AhZQ1m%FjM_>o=V^G$}J_SdE`#@Ry{tUbX+z%FjbzlYfCAbVc0NxIM1+D?V z0XKjLLGe@Hf^v52dvH7W11RmjkiULG<Bd!4AF{4K5uDqg-F@4r@x-w&zZN&!sBRtw zw6e6F3!-kPyyD`*VxQdQ@P&Oz`6720e<B;XnzYbs{U?BDa^C`!KD#A242%ZHgE3$h z*b2-C+kmn+bTTMw|Ls9p7wQ1M44wu`+nx@719k)(QRW%oDPSj1)-GegL0}h9`h~9G zHDDaL0_+Cf0`>$S1$%?<f$`v1U|*2hTK&LQV1MvTZ~!P{?17-XpLG@}Yn6jQk^f*& z+UZ~X1-FyvSr`7U=daAyPJEbVN&$+_XLt4PU^>t3E3lo!@UnQs=~irHR^F__;_^&o zP}8AqiV<qI{<24=8r8%>-qYEStPI)%^?gOvag~WBK=f~Fv3wV_>!N*S`Px5=C-x=v zs^#wl{xS@43UZLT=76#$k_#q*)4-wN3~&lK6D$O0f%CvZumUUsMUFS|7kqADI5g4s zbNMR|AxHI9FWF6rCxU%N*a1scZ$*%9C>JY{*%Gs>93UGZiWo!7K{Bx~;Y;Mugg=p{ zT&2`Qc%1{b2IqojfR}^9{}rIr^EUnxg6z6CG=#7AXD$y>Pu?<Pf8jsdHuA5iIv(Ga zjP;sIQDI?0rh3U*#_%rao%kCQrs(Q*QNQt_n@9E~`~}zdO6ns#Uj>REz8Vx~zXX&u z!YWYedn12m1=UydB#OUY{9O^EzVbr^vkG(dX-ncbS76&pg9!@(RhA_Lsj{w`%0);n zNZOdPi#f9BTif*Tz`lepsV7FqHwyH%oO%eaE5LT(b)dBC^<WS122kp8BPjLV&tLG_ z(z_bzcL1*e=Y^;*`}K6(s)3gzliplXH*=ZSD~fn(ch+kN2h?1|u@2&;O4W;S53}^y zOgEYAQ(nM)R!3rHh0&KO;*`><Qz>06#YM~#w3jc)nA4~B*G2ZKOgSjZPFE)1JyQ~t ze)%AO_9gWc`N>-8K0~|}xug)j4U~T1b}$dT7c2tTf#Uz~2SryN03Qb*244r)gKvY6 zfYLud3P!^F<6wVqBX|M$6j%yA16~h43$6yYfKP#2!5!f9;5*<pQ04_Mg1>>=L3t0M z790q^0;Yklg0fHWIw)&;J3wh?@$JFwEZ-3lACSP`{D5}Wj;F8wQ1`JtmNbr=47Skx zxc<W2QVx3x(FL)qY6hb(G8+_?mFqK_QYp2xiCZY<5}ufg1o*0sYC5O-apkK>tG@Zt z1r*-t$5kC4BpkfwFc?}Z{s!>3AY>f_tk*>}`--pwaH!wzjfWCYB^ffx=%EvTs`7c6 zauV5I8`c)AJ|ZTS?`Jan!c<=BE?L@_@G5n042o}(3tv_t{1dN2>d@cRRdj4nke|92 zn%MkW{uYL;D<7JhT_WEVRmSUIc3@>gZX&wLHlX%WO%KGS(Ng=80>0lQ4WACFN;Ukf zY;SRXnd-$SLd;V{^)26^!Lx4=Co(DG&%UHiB9rD|t|8*<ly5s5JOi2=L@w4)PzoOg zjs-`67l9+eVlWlF96S${er*&evKkGFjjZA?Sbru!Yt5hJs}6^NT#Suu8xaqaGo`Rh ziPWW@>i+^oDw2ukK?4bj{`g7I)}3WaSSn*N6p@RYKl>8Cg6#yFvX2WvY{HrZO76%& z$>m~D>NyMl5!}bg`wYlQzKdZk3aLAOUjHBw?aQy0#_R9pQSi$`&Q7#N*$qS>GqE5M z$ns#05`pRyMS3!{*DA#3+cfhMcm;)hrQ(?$MEV6$l#>(}<(VbZ^I7e)2dJ7_=0_C; zJ^`|?53zN4lcJgrPRgW1e2rIStMyePie3kdz{Jq^G=j>N4P$;|6zRk4OXMx>*A0TK z7s&<N719RuH|h-KRB#IS)4&pNI=C3j2bY2~z?EPTD88>4d>JIJ`nJSea5wkpygEy{ z0F0un3jPfM7lD&O@>J{kSAn;3e>J!ktOljep{$C}LHa#)K4Li-OBGjuL&57oS%bO( z%mL{aD=r6b0hfTQL0R9w9h7qtcYw0<u?DOG?*u;u?*YFA*MYx+_kpdE(*xijkUCam zgX_UUa04jcdUzC+wWi0wL)5n#gKc9qi}{8IjIs2`HO+*ggVi#|+mtx!3jXxw$t3!+ zvpgEBzCxHeytp`X%uJlIrZ@Gc+b_N(7f&mlB_|lWnpmy;V-3rmJ-g7GY1TUQoVT-y z*xEm$ogFLZ>OGn`6Di9-l3{E7Z26phzWUl!u4QL8B}B|IoLHV(P&n7>ZnDb>5ovVZ zG(OTeCoj{Z7pz4L@=hJAKC@@e=EE16<J3p{+8TP8m0Xg;7?6b<^Q4`5(#T553wm@W z62A{S(3hXz)c%A8pd3ymm#A7yBwlz$i8p`Bh>XmUX_L}DnIp!G9hIDsIW#q6RC2m% z2py@wTUr<#Y0P-OTRD2T)sZ4!@-LG0n%TM8#kt03;~SdAbVNDmA~NhYJ`LKZ(W?CX z86`p=J#0)$>gbV~<IYPRhjX_dyIfPI`9Dq{JIwMW9xzQY?<5|YI&y&JauS!!&YtU^ z_`>AT<HnC3X`SxG$evy}!#~D(V?4=2Rq^5u8wtl_hmTGfJ~ngIn3UoCH+qc9{|vi6 zW5%WqADxk$kve8{X2#g@!!stO4`+bVEJk94NqYYn>0`!aj2kvKH9dn|B4S>l3}U3t z&MD3lrRIFYs60CHoRYD5IXJ6`m|+cLjLh>Y#WpcVl+Mm!OdS!kM@Jne-$WamcUfs( zi8nKYPkz!s5i!FX<|7HEoJ>Y^5ix@sMz9M?;WMwQlqlk@*YSjw$&N!rj7zuc&~k5{ zbq4pxtWzc<rihpf!)YELDb2|nmd$6~rM_)=^b0x>C=peNU#T=+L`-{~!wC71FKi~~ z&dHvglUJg+JdNkA1D~JIM^G^z_4s5Szo#FkajtqaGf5?cR?y2eJw2P*QJ#FI<P?a} znmCRDS7usacCM4lTl#@&40#}RXitLB)yq_wHTTO*POPiUL?)-`2dYNNURFG(t4CdV zbdG-HuO%b+)`}|EX&aHsF&dc}bwtbpKZe;zjEGt6N61VmoSo;??J3<3DaAOd;>=;n zXNWK&bPA<pP6Bz*SU*twI}b!ZinM+V;};|GIuS9yHE3b<A6ZYOEmcEw`uCA=DG|zj zpen;>=M;)>WH}=urh^}Q#s(C9w;$cujcTe7{pcpX;z8``70u`<HOI=t(|U_bbG)p6 zN_AVBgrXEqb%m?f^aES9ROB#CQ?hXyU5Z$wAE=g;Z{aei(oG;mgy320&`p{#lO3Yt zLx{Mnh?v>{jybj(z;Xz6&17LIB4)WxrrTQSMK{ft`b4mYuUls-y%61&ITk`ULU9^S z+3sgLA8F}P*+oi@QjbwOvvFR2%41e$YN5)jB@gbW)5}ON<Tr?wl$x4&;=ddziAZ<o z2O?6Hsqj2f(?;njj~GxVzvScc3iu?lqs-#UVcLue;5{#skxFpJ%0#{~xo}chySG|R z7&??GhX|mfUol2wR5{X|--T!x#c^{UN{5kFs5a9h)aJ2rb6$RSUaUm=|6*BX%k=W{ zMMTUQ+>akOUC!`}KdUn}(Bq_``Q8li?y6u(?USU|kkvZ6(kt;>iV2BW>En<=dP9e& z6+#w{L|&>iRqI$y@plI*PjQ;tbe>uzpehZz+K&U?Yc48Ryh>}zbi`>4<6`@1n(``2 zr$nQrh5DFm@@D7JD=JeivD51xT~PT-`)@OJEh5JzrIuq&_DTa4-;%d92#k#AH!!8p zJ5Xux1O5?ZY?Y~$!cPY>6%R7paRj8Ap+vQ!wAx%wQWVpQQt&JtFS($gFh{qRIH@O1 zDWy|X11W|i_On`$TF8nj<|6|z%F;e!1d9pT-b~fsKVh;F7i0^~$*WX99HsUK6jiK7 z_#-c)Skicp`Q@&nNhiDpZPa@a85gQgZD+C|pnH1N&5K4Z^-GwUVJ~zz8Y!EfbF%r# z))KE$pj*gN9?I9r&D##@Y@>8bGRcE0M*lchv7_bwdDFd%@i{r0W>cmlT$Pe~JoQ&* zW3rN4sYoxKQCj|#;_TvbRX?!;Ng`s9Xd?Iq&8|i%GK?mc_8N94sM|k8n<z!GRVu%X zm(WDKGR-Cr#}HL<4aBRw@CNaQ>f@*~@Mu9|%D1!&5XY0Q*)eWZeLq0SMEdc7e#G&e zqHEXbR9bsfH=e0F&(BS6_&Jq}h(Y!{bhD=$)0fuiWQ3&zE`~PGFH0Hr<P|%L^Ne40 z^&_P?MPxCQ?FCiO&cw;Y9<tem_NwNdYk1L)U-xHDTlqO;m0V{3NK`AfQmrjIxtXku zmE90kB~gHeo?qGT43k8ytQ-EtK4c0@=BP8{O4U}f6>4OnO+mRO(+jG;i^dXfBJbam zbOQZOVR5EvKlw&ox)Pg2xLPxAdPk)lMLLZP=6t?frh*x21}Nu;B4XtDQ@Z^YsW9oM zy>uQ@%T%2Y-2!Xx?C@VMpZ1JUlS-45?iOy=@zhAx_84j&a=U)usCuA1OQF()R1fWw zp_Wiq>iTGXRBSZVHRTk=CRxFmT}X3_vVLU>(~eq=wM(>FHLQp3gReD3NyWq^zM=2U zAjD|3$T(nBpc_Hdcf4u@VLG6dlp!P-nUJ^AImzaqnr7swnrf|IE66}ZDefZ8$4K2f zW!hh))=o@TqmY=Rma>VX^iuqSG-`%vRF$3djDek9rYcwF$mC)Va`m|7c}+BKO-+c_ zn$nC$%cN+S?KMT{A)T3ON7+fB1T9P@-cSvs#+UU0RYE-DSd3M5k{)4t5DQwH)MFW( zZVgCGN*RZ#r{djS_vgZ%zG7P9;p635YT9tsUORO*X5B_Rvzs(+oas=NmOT?t9B<sJ zqQoqCpj256uEa-%P$%UjWCo99#uVqv)LivkD(km(*4n3<*+eE=JGv*6PDNVtW?ds0 zr7OjfTHZvn3m<;Hpm=L#Js<MSbh<`oRP)^Frzx4Lk29T2dSQu*5TLB8{X+4lQj(Qr z#+V`q|EyKQ5W^bn1%ropfir*c?9yM!K61JmAjo9&F4F+EM*6q77+GLLDo=h}L-D8s zy)qycCCJP#WIIx+VlTPP%;Eb0rYlk3h2eKCI4eUfH?e^c2D%!*`~KU*&cEcx{X=$@ zHF~1@lmibuaP|*-&yHL1+8r0a^z^A+-s5bQiWfJ2_bcCQ_;q0U(EJzN-(R;m;k{p9 zeQ|p3GoL3P&Zs~9UQ6DWQ}Mi$#$I&7J>AZ)j=kffgcmQ&ntx*TiD&<iv-aJLXRrCP z%lj)V>lYR8?|X_XTn~<0HSFuxpC6Vyu=I-Vmqzxyc>SYoo9CYw-K`12k@aa;<HPPt zYnxvE?&mN5{(k&POI|4Yqo_}tTUKps)BCo5kNvo`*9i7HRlIwyJNK)7Swn|6e&)2W zKc4u)8r{!IDjw4Bin__O+dOo|1^f8+hl)4l<@M8dEx+gGHy{80g9pF($HYDL>+ddn z;iBa4n+=>9`{u-l*{@-(7rBfdJZH<<U6x%@@qN;P)*pWM(=#JKIJ<nt`qw@!Yu~Kz z8rJFMT{~CfR%O+fyz*JfmZeEU9_W6_=U2zyux(%e>)*~ueI#<lg1fTc<ZP6RH|e&r z-nYdTWfniYaP`5Hued2}<M_%AL#nD4C5%dFKe+r4_SPCpe&;ogXg8%S>eTx8!uve+ z_`}~!ntJ;0g?+!?eDIz*y&mZ0ZHtDgc)xY`v>N@-CNFQClG^#Pvdf>kvDrDDUAt!P z8u-fzORsz6^(pMxs(5Q7zK{Ims?(kuI5@WClzUgVb+!F+#-%gvKK1pV$NWD0f~21~ zLliFMzV&gVQy%IxzUw!6gLXW<q*wGgt>&CM_QH49JeqOC@*&+$euDh~74Pj`KVSdd z`)Qpz-I4WM<MxYw$m#yUE&aQU%{VdPz?EN4y!9IPl2yEC3%|K;!2I*#=S&@U$%fmK zrnWm+Te)&a{>u;aIh6lFWyvL+NopeHPFme^&aL6=U)cQcvbT56J?Z!R?#^F!S&z!f z2?>|2?sLAkhCL1yFa7o0ug2_J_+m!v;ZKe{{``|$PJj5EoA28)a$3s1_MT7AjZ@#| zBfoPyF8KPFw~DU2I<@we?yi-uz3|<VZjbEVdee_Pyp><R6_>{TD`x0w+@~u4&O!I} zeeA>yzb&pFJmE-f;q6!4I%iPI-r*Y>Puskd&4x==yp!kG_3Qrjo?iyt*mq}_XSe;< z_|@70Yv1ox^zv)*vrpJRq%V8nD&FgBawol#IK8d4<I+_{L#B>P^R8=re_oHbH}^<r z_QCM4(9_svQtmZx?A?Cnpivin(&gOCrv2RG#NuUNUUj%%)sDJ%Dz{yH%EhyJk442h z{l0&E+P(1GRS%ViXSdiM9rwz8j}#}}a^bD_MV{31)b<B(a__2muI8!FfAiMN?f3P* z?U%ue=e=~&qi22e!}e~c-Ld?%q{r|6tT$&dBBb0ucFd@HY*NCx1>gM`f6fix^?dui zySpZg*m26qn;*y@(ByYEYOh!E+RXX=@e?2I^3e|oRqywCr+4!9XJQY1e#XB0Cih%; zUh&B*Z&mM^l3&=BGk^K@<O^ms+A*c`-uBUFHv6dU64&mV|8~PB*XiFqc*1X%)#n5$ zcl)nb-S<xZRgYctOw7G|e^_wVZFl_bvdxDtPQLEq9`k<c^taR5?@{r_-nQeiZ8!ew zis<vNyt*K7_dh>B?eedB-F|-V*09zqexFc?JNrV#TeY$Ki@y$Cabt&e2Y%T4=;z6g zpY?ONE921Jv!DIFW&LFb)~fe4DEIn<H=T09?X6#2c-Cp(SETQLdcf`;ZBE_x$;bN_ z-FHH#W_zgb685`XjdNb=ysqn^M$cUkcFWoypG<k^?aJ4ueid8RsBZ8jn`d195psTC z#haIZ(f-j(cYXZvS?}+e_2`Q=H%$Gxeb<Mc|LVF41&g+fz3w#Xi%)emz9f6+#*)zo zD|^N_^;r9No_g*{Z`~GK`^dA+9y{>qlijb6XMaw`+fje=^v<!Xp51unT^$!a{Ki$M zF8}_j`<nG%{r0^TeRf>)(I$2Fk^Fwn?l$YwOD}2J^W|1w-gfstlAam&(X#{JyXV0f zPu?=8ZpIJ&*&}Wt<^Hs0VRgp36_2!;`b^VV%WfFh|M1kN&E{23n|s}sRau*_IIPYZ z5%2bC(`MKFbp2KCMwjkc{=uZ7=M>)lYM)KR+dVWX_S~)ap8Gf68&>&!b>#5WQMWz% zx3S+9Ufy^9r17sj*yx29l0KO;{J|GiPAJcLmUFfEd{^TO9?tmYox)ZhJbh`;@8i2o z8$9H`$H%=`{AESNJISl}59u_Xv+gS1^GU-_e|K@pAJ3k-WAg5}r(;h|zy0|MkCb0i z{loJ&d^Ms2n`rx0yxFeFpO*J{;jV+T@BHMHk8iu|^MkRQD!y5B!qdaQElb+=G=5{i ziBfLnwmX_HNNrIQ_E6NO{lCVa^xC+qvo9DwU`WRY-rX_hiL1wPW=6&9anrw+dtYyP z$_ec{w;TEPxb=NTKK*TzQ8{515w9G&<IdB1(HU_-$<?@gW~VbNZd%@~YVlL;GI}jq z`bF~cw_=*d+;RQ$_r9>C$0eV!Pp{(rQPSw23ztsaIDY@V`<JyEH1(J0%TKSWJ$%7q z3EtT|-s-}p;3^fb?JHx$Prh(P<>rC6MqWF9QtS68m(Fc=@%58VIrpW_!zYc;;*6_` zxABcnH*|fydRCK|>0x*5eQw#(Pd?vq!rkkCc>03XXN{UYVJC7%_g#&@-MeCOhjaeu z({|w(jo17z<+aZ<UisVSOA`jJ+A#a2g{#*j=`Cwl<CjJ+`?;{m!Vfoxd!L;%`RhR+ z&;Rti9vxqP^QK89XMFqSzLA{WRrwuCn|14w&%M8;Wk(O`_hM1TlP5j;;Jqup?mlJz zrOBB|_hOf_5anuoY1-SJ{!#yAaY9+fgk`JG+EsXE>n?xHuie-4=PBpk-TYDfnk?eD z8gCdI{^O!ir(H4c-foYdmVDjLeRDe<no{$~u1-I%eD22d^*NjkR`EWZS>9*)y3-GT ze$54m?$amkxFY|Bv)5g_`22#f)(hTz^};cnJ;mne7d~BFIsCf!>eki2b@gp)cRjXf zUAKptMjRY*!wspO&-_P+y)2)ocuik@U{HFiroX>?$_#7WITt_G`>uaoHRSiHIpe(p zy1sGqS1<AIfr_`b`Ew(tJ$C<liIFoaKDzSUJD%M$<fRp_T$s3e@U%&X+I`lBz1db$ z?!6ydQ--<L?L8@R`HNQdtDP2Y?K<S%9Tz|H)=fWO{ri^kHSBk*c&F|!E$Pvx{e&J* z^jf>8=OgFsjk{(2saIa}{+eqO*L^*-jJ~%<#fu$(=|>yCEn3<2;9U<c|LU#}J#Vdi zcf#PNFKqm+$B~O_KBXRKww7{V`}(w;kINq0bL8YMi{^E2*6G(rZ_J;t>($T3b^Q9( z8NXk|ru9-4FaN-y@cvhIdh*b|^IP6L;+FSs*f#6k&#wIYCAD2|J?FcpR-VC`Xce!| z+yN)Ow{_bElUu#IqU0a7V|Ujs-mqiO#MW<ocf(9?_vp(w2Th$_jXzs;`a4~gKlA#$ zhvqN-;(@^<H?=*hRd(W)qxODXQPS_{OCI1Tm5SHr$yOa#eD<kz@4Md~@@)L0{Jy!D zG=1UFmNS=M+v=K^e*X1E`nQuMKWoV+<)2(T^0N77oiJnUopCQUz4rU|{Wl%17(L>g z)4MGWTfjH7RJ@Lz=k)6kHLj-Ml~#9V+}-YztDDbz<nz7Xc7A?nQu7t9KVW=yP{n&| zPhGo?&%QO_zA;<Z&wMi{=C;irefiN7QFE{8Rr*NJwFl|<$8$c!)j0a03*YT~X5R2V zBX`uU{P3OPFVCId^5H8>&KxoK;T0Jl*FM3!FDl-u>a>nSA3V1_q5bNJ0~=2nbKU%( zAIY%(adOXrM`rFz95bA=cPd`(IeA~c9CKUDV+)45-YvSk|M&&JT>s7ekH5HS^hxFY z2KPb_dN3BFzLOp-ZWEdQ_{?!TzTN!y^DjyN`kMZwU8lF~abn4m1^fTScxaJ|HzMxh zyrR;HlkPtGg8NhE&iL>P&z$8CO|QIdL0;YB3s=5yJMXNhc(YpG)v><m^*cH|vUR|9 zC8<|^IcU}TSFXAFrGX>6y!rEw&z146iN(2U`mg`u#|`sm=M<FY=J|f@Fkg0-)bAg9 z)xm_`(~n24Q^~YAH*f0k$<2>P7R7R$OsBC4=^DY$0G3Sl{Q%>H{F2h_0@pZiX>NYu z<bLt}`c39X7-y9-i!7f!Vc6shCS$}ON3d@~@BT@>`}ZHvH)*mhnCw}+jv;F}PAPxp zw<GOb_;|ejF-be{U*%R(oMV1|a`IFfrv#z)&N)8KBfoT6@?SC4u!`Q2a#)-7U*#66 zipNC*{d7it(DT1y&Z(-m-;~n)g51BBiK7y1vdB``@yU(v!cNVfhJH-XlZEEvlj&6N ztis&vqWt5No5P|GIGO%0%=hx+YrYQah5V#z;c@Z_PNpT^+=BcmA>`qTD@z>MZSsZr zvvUjQmblL6TM(1`#!pT)&bx1X@A%$*lj0Nl_Ku%i$`a3Ha`N}KKFR*+oN@|_^T;s- zQ^(K8&dDh*oy||==KW7gDakGfk^i3-$Sk#s8X~9TCl3@te|0dYJT%kCuc$dViK&0l z8`_S{&&5tFV4KV5eEx#|9Y32en#|i4vbpRu;9u&_{i@7woz8JG^;P)zH5I#bGiDWq zDB@46uq}zXLBjn@qL|8e59CnZab{3<&zvm(5`%timHWSLDlexwj}zObcM$HU<rVij zt^>7c@}=P8Bi*T9*(W(pp2XC-sB{Xy&)#cRw)~j-@nO^COqRV$N{fm(Ep&YHo$8f0 zynF+K|AhlU1&-f5gzh$b+W)r0)%?cy&YvBs<2`<kQT^zFPd|L3|I?1KL~Yg|FO4Y3 z$>lfco!tHcU$(>6FD^Sd{v~%f)yvsQUTJi4J3jp76!A*S@yJshfH)o**}^Ny<F}*! zJ8$PVD-D`<`-FD<^w}8>^GhPfulrL=Fongww)u<N!;Fw7Ivx$gC?vn|cw}U^w2W(x zZ;mR%Ox<}noc<*N`i(|{tonbUQuz(0!T*a==Ki0QGW-9el#>6GQoR2sr4;?2l#=&< zQcBtXNhu8q`7^fe*ITem%i3Pw|7w-iFB{$I{FlDlFCUwo<GrGqn>VHOI8ApPznER> zEu7BXadx-z^JDA~6#HfsmUW1&6OKCYor<)W%nqF2Aj~!rN9k%!DAJ1OtdOS3SBoSR zY3(J{O~sS1m`W(p%HnK~rsbMYq_u&)zwRpD<0cd-zbkHN{Y;3o4oyzhNQy|SjI%C1 zRN8qa6e+*SXlRip1b+@K!J$QP9;ByA+roq*ttyAM%%RmfG=AkorHHg@BJ}q}np@jU zh%z{DA=~54tppQ7281|L0*$Y(su1<ye1xX)wMU!A8HYY9Uakp6TDv({plN$di2T^2 z=SYO)XF`$IHul9et=5Dhts(4L_f_%SCKPGOnUGP6R$@Yt*46AW>v+{B6ltw-XmaFE zp7Jp^_GbI3w2MuMda!S*X}KoEkwx}C`>S{@Oo%peX!9J}a`q|{RJ@fY6lv`sG+NQ# zGNDMTj=e=4?<*6Ew4&Mf)3nwm6lrZ@e{X<FyV-;ytse=EQM6x7DAFoE)s8pEgd(k5 z9oia)wv_WJ16A7PCKPGCNazAZd)b5{t$z_pSG4y{DAGDWXq=)QG@(fAcS2(oEsT=_ z5{k4s@L>#HhRcK^t@9k(Xoptj(B?U`^$zVZhxV~U`^=$5x$H7pnNXy4i9^eFXn%KT z*E_TpXV__@O^Dyzb!g`}wCN75z@e>jXtz4F{ju`h0@2+ACKPEc>tfSZm{6p()1kfX z(AsvD@6t)y4ki?7O?PMo4y}ezl8U#@gd(lUxFb!=GNDK-yqkP~L-LC-p-5}FLtE+4 z;&3yARlJ@i6lp!^&^9=<*Kk5ZRJ@%g6lta5Tr@4+gh)&1Y!z>V2}N4}z-egOJth=s zweD@x+L{pcz!{vQ(q@@Zq;)f)3`M)mgd(lW<L!70Ob8$A&>nYa?tc1PSIw;y6T%i8 z+8T%UJt4O$<FE-uT3(D?)A%7{6^gX>5K30@_L@+n^(2O>Y0sDtcInW5acBt`ua1{! zLXlQ1#xYdo7iU6|Rt}-@iZ;!JBCQc9m5z6w2}N4-99o4#Yk?9BQ)#132pw{01rDu- zP>PDT&4ePY?+IO~XopQG(uzcZCMw#ACIrufCMa5*3E{&~Af4Y=CKPG4K`}I~oe4!+ zT^w3Bhc>{WB{{U=4lUK8jdy6199oe>^E$LdH=klu{0%XoNXv!bH7(YJ=*tl32o*2E zgd(j~4((Qlwi|)cVez-egosDQH0@Rsq6`XXq2k4w5dDlpyUU?PP-sgPuZ0O=mkw>E zLpx09L>2Eh6QZ9PY18JJP^7h=P?U;yz=Y^4JT`5!3E^{6^>>DvTW_0Cq}BgCn|787 zVbcyR-Jv~BsI@9%lL;Ze^KDv!2}N2ShnD8h)(~o=(%xl4k=BQVCMnt{CWP&$+3~VW z2%RK!vWj=ugs@9GcugxaA?%XSDJtGx6N<Dtk5=E6p`E&#P^8svj2-VZ6N<DF99p77 zdnR3fhp@TzoC!r*y~gTKwluf;nh@<vhz^x9?lK|#F85QdHf{dawD9EL|9R^0l^qVY zi@oODi-bOG&}80V`7=`qIjS(ZY+%A<^<uGeN~d>G?iB0WLsc2E(VnWb*oX@~l?UQ0 z=f!#~Zx>H>O00Xk(nTF)d=$oaQx)0Wn$Fp(?`$G9<;ITW@`YPBA}l|~ZFy$a#CWP( z60$0Xgf*SlPZx5cXIT@Wd8$%kUG**e?>yBRu`bUtm1Muf>0fhYP3fbmlxj=99A?3B zT-3%|7>e7q*HfJq>#j-;*Ad*|Zyq+32%EC?a8pBS;i=pfpZUUT_LZ_ECAMv#5L6;h zWm%b3I!K2le@}I4yr;@j6hJA0Qf4Ubcu!?bf-1&Sl^h=sFV2(Xi7$>z(^Y<Y4#IhA z3e`}xtE`=3m`mIcR=3L*w5Qr#wB79@mX@!+?+|dWOVgZ1+k6yxw!0$&qiuJ`1rnr2 zQ5#d;Q>#2}5u$1Y+Qk*-Z6VOeyP)nZ|AM2QbhoXnMV?v`MN_Mi+eU3kiA}$<#(SDm zu#V*lh!s)?+L$EiMGczyjk;?n_-J`kNk0z$bl&xS{mZkP<9cZhaZaW=TB|~;l4*|m zk($%WO%*)1N^Qms6P~IiLRWEMjN2vl?Mv<%VT%5ed#2T|CP?jU^?Pkefc+V<xY06I zf}8rHc0Fo6)muGV4>uB9k@m6XCxoiVvr>^9I4~8-@l~Wwen3(sjk>lE!H}Zs>Xe^C z`L2{|H*JY4@KlFrsArwX61U3JLE6lNKBPMjls@c@fYvdPRvXxk^~Y8rC#|SyoVn92 z;BS(l4N#2e-xv*9I_>Gv`NR42sYhzm19W|QK%v^2M}-h!*gPCrkl)&EtJ%j#xBB|# zs(=ux62diAyN4X9^+_VfJ;bwhZzH=7E~70*RpP999X&ZpY_w8!_@X2lX?_cFoH~>G z_s|MrjcyQY!QcQA8TRxeWT5S>7m-g-9tig)Kb7137d6Z`a&yOdD)-}`Ma)&n!A+Rt ziJRNSmQvfsNA->M@hUs1ziyeT<RLcYr`?`ajtJ;Kgt<^w=k#?bHSSBbvxrLF;bO~_ zjzv8whITkC>e@JQ$Eq?>i{+cs_LBu?NQyX5j=O^tOO;ZiJ<Gxu>6@zLi29Z~f}byr z^V!3h>LK<;*{W7?%GSuJI<>>Hl!znH6Y9t6EF^!(#OSg0NR59AiKTN&i;b`Hs9KOy zha<IG8V%TrMl_U{7MreIMAR1PS=&*Qgd;W8JA)p0!*PH~h6i_qPcl=F)J~;nmlDR6 zHBnc7{>PCcy29ynK4o|y?eg4yJ*{?mj{Kwfr8`7Bv!)S0bti$B(GU9lG?;NESBG0w z;gNO}`87Nh1&>OU>Tt9jY#bh06&`Cx3bP~WhyIaLV#CRmae*DBu}V(~LauHR+qkxR zEAG{PtaFgZ;jz9%x^O?XocIBpr&!@tDUsneTfw}iG}5sf6XzJ*2Shs>|73B@3dr*i zHGoWa6y2b0q=g!`Ph(pu459va?PH6}k*RK?z*dZ)wh_JtX%f(ijA5l2(MuK0uQ|2A zkJ_AmBBVhOm|s$#CP=onqBtUP^vGu4c@iM3|BXu6Wd@5ZNOeLB%~qX%E48ER(0?E| zUCPk~*H9Bv7}>j0XvDxlc@~A0RWFTQf*<IiTiI2;IJSaYsLOrSSbTM?wLl)Of||5g zJ)9TK{Th8=0W4_NucodSJ&iA#kmrx_<teG9q!dbyt=@^tbnS;^5hycyrbhln)s{>| zbaA^5!+G3xe7Z!{{go4;0+Nm(F14uI9e$)1=7ro@S1I1drBq4xF;4n5kW~7f6u_cT zg90Rtju23QkWB#zNGIM}kV^SI83@Fco`4*>FfOTA-AECYi-)fs$E-Dp<5V{kSKm_= z6t%@Y(;nj$(T6e-(w#liBRvr+l93H%Cs?J;UZUF#t8XG;>Es*fj+S_4+Ih_&uXgH& zyo9AV)3cGw3`<If)>GO>agiv4l0@mcD4W5u>4b|sgOlTYQ!W=%(FRklA~nXZi=|(O zIhVCyh;D7%oGQQC6Rz5vMpXk1X|t&H^iMbcgqBr558X{$xJYl+kAO4RPrHr21f>6I zx8$IoD@LnR$%hIA<#U9KSg|U8iY)@hxQwu1Fwt62AVkTctSUkUnRAA#=g@};-PTR+ z-Q1^``xMfrSo2(xy^xI&3Ae7GWQl5Em{`BeFu=TqX>Pn4O=Sgl8b`6$bV-{Pwb4C; z`E@dCEr$EkZey!Iy<5F9wn8ZH2?IsRs>1Oysb{>)yn}ks*G!j+W~mk+7q`qWlF^N> zI`1uR6s5Gix>1VaM*1oRYCy}nqBhFZrE*)kKhJ66U(yh0kbe;+!k)D`R;O&G507=( z9u_^dAB4#RS^%z<rgP_}dSYW3RP4N##uISkTF|7f93P`1qd8PREjG5ZHuavqcs&<1 zH#cM^bjggMcmtEKYrZ%zLyxPwn+SHU<mp<L5_ZJatDoNOEPWs&KgY)qLrRq)TLRQL z$vf&fZjj$4DxR_6Q{)DbVZFq0t4CtFMmTDcq#Ld}{P`-zLn^jbKpmTE!cd%1I?V)` zi%F|hCF9IsVAo;Av1uz)ls0c<*K>Z8y0h_1!Y&yqYu7bAfrP6h==Lm2Swz<^b}yzr zQ01YYpsx0OV)ro&zaGQ&AlM3#CpAuVYJAj|7lx#vqpm$k5{J?nqKHYwiis)q1}8_) z>t(CZk(J680#f3$wtA{GA9b6A8I>;_dF;U#q>R|IG{bC~(Z}TK)^8?Pw}|NRiVV%f zmf})+JfB>>Gitp<!PbR>VWs16U@ZNopKWGj0Oe^M{-%;zg9cShY~9NsM{B=5vor#u zG;xUJ=(Klzp)H@%5w<MD{A3xRL5&&|7$Qe4iDNR6=%JUFCM-UY3{<}sb!|UpB!LPM z+J7CzAGiaUX7mw;`TE)dv1R!W@-YQGRbVVNT?mN9V6s6hHNaG{aL^MQEjZII7^ydi ztcIH^vQ#bIxYxcSHsxH(etH+3iBm3))YD}yl?AU8B`-bW!;!{|BkgND(sXT}+L7Y6 z>2YmG%AIngHcQw_1D2o}S%|x(=ie4M=W95W(_KS#h4cvGWvI8?@}4RX7Pa^rs1j@x zwfHU!tZph!Kq{M6?VgO?6)niI?=&;1;WAsc!{Yo@xJUA2g@cnL=E;a7MUOaAtQ280 z<!R}$RRq<$sA;gb8LO|a%2+7hE<y^Nf3dkk0ZcKI#hcn;+sd=-qK50DhU=n+KTVDy zi;`0wbyq77<f~rPvinqYMfp!l9HC1b!9X-47Q3U7eAOz=_>=sP)VYn+{Es{;|7)aq zw)?nM%@cL)6MhsUqyMalJi1(us)Z-G78luV@~84l)p@4sx}+Yp+23}Uw$(BXB}~(+ z;c1P$W9wu(U|7gSYvWBAW2A#ZO+YnnVa!6?v2u$3Nh78!+w*G=wWu<!{(O_camY*$ zfyCacJd`G-(kE7VCM%B@F#37zwUFbrMF%#BnJr^-@YEVAx=B_7zI#CYevLe+ZUWKr z^xr0()EX6)QshQ{e$jRhxU!{+;9+zp>8i(0tZMDJ{}7KSS7n4b3nlnVot)IQr1ned z|7fQ?@=FGHPO{yB$^0Mf4NB&4BTicy)UJiEEd3zCe&EYZKS*r&AUuqmWSpOf=ZIf; z5}|k~ZlQoF_0c9I6nP>&wwt&K^JFC|MM4YCv@4`+ScWGeWXAc?w!rJULXe!Klv1Wj zc9i|TDB*rl=C|C=;1Pm&z53?nhI^U*3LQ=`xW&5B815&jZH%bJ@<R&PfhVkVg7a8) z`0;wgsnvtYjQHIiFe9u>%Zo3Jd}(p4{PJ;FeS`_ItD{LM&MKaW5tu^F=r~?HE7}{c zy=q`)w>p_gNM$AglUdY8o#_(B0#NOoD>q3$V|mYr+Q`UNJ<z%OJfycto&5SKJ%dh4 zhlVsl#QKbkv^YlD*;l*8fa83(;t*VEdJjNGYtnYcg@(xSdUCAyiT<x-)~G&JxX`-d zQv}a4u~Y^~@*t}6_uph#<h1k<<uRPwMCCN<8*RV{4tuI!^DJv4!ZV7vU4*hmMA-i| zO<J@~{D%MZ>S+F@M&?1vzw9GJKmW2*O_2Qki=1>6u30=_+Q^M<XKEZO1o1DDF3`V( zcpTtgl*LPOQtt-*{EPpiz4FM<zbJoTlI;&n=KttmP%`B$OtQm)$^0M5UcY~7P9=if zl8?n8x8!3Ylv`39=m$e=Ir_?1{z`n&kN|%rUTKK<1m&+JBoy&i(z}S)Nl?Bm0g4PU z#kZw9zD+3dBpnowmZp50hfuoqZNigLDc!*MwzhU-+rCY4q<x#jXHM#iVtkusT726Y zVmQ7{ZqQ2cZ4!hNMnH?T!lcD!1o^fM<J*)z1^PBc3iNG4vVGfKQmFE65>oC+0x0b| zK>Ie6s~Vg)@NNE?J?La6A(fc~OlIPlBvX9ba=@-mfN#?ema2M&_H7aa--a|o#4^4O zaVXy=y!rVyeH-lCq+y=sPbri{2`Ja++x~K9#<vA4g7y;lHhB<Lxykr8RU9)-<J-(F zu8slGF@4(xvhnk6HQWaHHW?KiW&9*ZyT!k`pBjQZ{QR3+9-w|2D{4eq(qjqcEM_HC z9xv7RW))zadFJtdhSQQPs>8QNtsmM#lE`h3<Op$+$4bCbR>KraLluAYB4l_F%&Z+d zME=-(<>uIl@Mn25sJrk7o0|ddq-?`9cS7V&i0YKjPP~Q)s0IQ-S*a88$t}S&6=#o7 zRHY$J7tR7iWyH9KB>vA-3p8F-D`X1T0B#Z%*@9F}AcUwb;bE0~!<id*Zuo3tc-Yp% z>^W)CFG+ScjG~e^CU;rHK?VYiN}JTlnRs(+MO}HPl<Fr>ts7OsnP#9dThFDP#o4m* zYN|?=*Gam{{cObQaQ#4u0Y4&(#*Cb9?(zJahfM+z9*;z@{*P44lh+!*yi^#PNWjC^ zF*&FpB&Bn@0Ao&uqFT|zB*(CY6-qW(AqT>QsxqytQOv5aQ$USfz`v0n2}FKyqZa5l zE3l##%bXKo3Neha+c>dWyFk-8?8&T84ziMMBx?{)*7JiSN;^3ED~qs_5-wf?xRb}+ z36VP?awkNszbPgP_MuDE>aw2*v@YB2u>3LOow}{8Pz7|!YltC38ztfJuwbi2)sG&X zF1}&>0;d+SXv1{a+({7x3&d{VQ*H?s_^fK3@ZhxN7DVib>@T(D(K&Be(Z#Xf!^P24 zgsAJ{*ux}osw<5qc~Ilu0Pf^5cS7V&h};QLHySBL)xt^#*>Tl$eyK_zgP#IA&gr)4 z2ef6IaN6<*x*n4UUzV-=0F^W>$h6$w{v@p_gGUAaj}GWZ0yGM%2}@%o_OXk<(N~md zR8>_tuIq_{QPfhu{FeON{6>&pT|0l1l6D`gt$gljw#lkdr#K16VKt)OpE2(8(-$=x zT|*?HDUVWF)5tOY2zfBG<`0poj&xMjUmR<piMB>GOc7Ee!u^sk=lKr`k)LR^3u%}l zWFhjC>yFxGQB7eK)oKfHCp>T`MDB#hoe;I!L6b6}$<ZS2Bs=be$ej?m6QYhUa$F~3 zvn}-MAGotwM$G>~C8Nph=qW;0vNcJZN{Ves9x&ztxRb}+36VP?awkNmk}3u>2s^2) znVHHOMVA_j=M>rC0!3gUt?gdwTX*%({)#QRie97s|6Q()>ND!Q*YzV);Xup<4kX7A z95kwrV-R_!y}5KV{d&;JQSI*4#&YOM^rCI?)XpAQ2AuD6OPBAQpi(z#`%S2__pKkx zNwLcPY}m7=Z=a@1-|ij)$94>P;&)z|8-1kIrbhR#QOV_K<96gG8_%FivZ$A(D3{t= zcc}uSo~sb&$OO(6wd`lrGVrrqt&~av!*oT3+;EXxpAU$Y%^UJi+*C<t6ZKqpvb2-z z@J<xR7KdMD2xIR~_!i>dw98?Ki6M!^s7_T2?`&EY89^vwR+4A(yi5Hlxlk6SX^J_x z>pj~<P+XdGc!smoqNpcR+g5%YF?eg~$tIfb41<U`-lno9p;o!1m3$)Qlx|XTy!S#U zmhYV3Fhx_Fzy5Ww!}jJuy1jXjq!+A{SOiarO=7bqQJ+9gR}0FjzRqeo0#OTZDl@a; z;bb&OXEaD<G)OX%&4EM}cfYif7PXx4Q`;Ts9$QlCh%+^&Fi&+=1yR}kkE{FQcUd`t z7?iq)skMrps*c8%M50Sd9qS_`L{lm@hBVk6a?YEf3eg@J*!e6&W?S;y|A4eo$aqgx zI65PLu*SJ8;UKYE96+=jlZddq-GvlUEjk-Lzft|E>Xu~&Mx%jA>vyQcQZb%+$V#54 zAt=sQRBm(GW~!NKz)!TKb_Hi@m@p?N;US{*Bs*hDNTsBRWAXGHC5Jwp=g6z_fDwf) z0$uORgdd7PBc(>jgpL}DPa&mgq#v?W)3g=C7b|V6CE$066(*Ba^&<3nQpv9>xr1E* zkIA?GYPoONAc`C2J$F)2Knm4B(G23Nd{5G1qpMFyidd))2q5)_t)vB7+Ngd)eX=dc zXlWr`TQbm6mG%=Q@U><r=5!*rszG$!Op!pSmex%^HHCV%o$Av<b>>x{etpi!Ejnub zqE%9#RZ_C>;xSw0>b5G`Zx6<|e&ClUuim6f-(Eo`x~ZB`D#wKxrb|)N?T0dWl1Or| zdMNG%LmWkKHt+mzqq?Wap%zwv33|f6jk<Iz0d-JH)6#|Zikt<R9u>EHYHHMiccbFo z6x_*a;NX+&H><4lmVc3b<|NB_A=p$Z$wsX{=~C9287Wjbkr&s<I|w%9FjtxF^Rjx# z8$0Y(4o+^pu!B669>y!1CS`<Ty%B_5l7TK37g8$}b;8XQWoWUArjPzbEnRB5jx0nu zRPu~kRt^a^cyB@+k_(9`wX|cz&WloINCI{EDK?})+enWUOONGhAeuLXv#p04uY%u1 ziDkm-&{yT&W=|cVNcQE~WROav>^dwbnk1q;T&N#<^h3|C!$0lhak3bu^4M9P#>weo zaPg!_L}o)oh};jMQbVi-3+!Pz@<@|&I~?+k+8Exb`BwF^6lbfcF0>`;z_WgPz$8^i ze&RhGsF&<T3h^&lN9uRmIfhA&7+r%LaV$E=`i|<Lm5Qf#-zocq<}fI&8^0thq%1?c zCxI3E8H(|^N41xbx&Hq}<q@N3Zk#l*(!gs=%+#oYruLaQgE$OPTa-G4t|DKVOk^I& zDtaO<oM?I53xs)d1j4=T1e$oq*QKJ@QihaOm#lBfka|&LqaVt^W~PRp%i>VwC+9YP zo;Tq{f8@D-P0r7L<Ldr^JIB{Bn@~Q6*E33o*wo6h4%Win_MNUtG>aN1!$zQaGo;}V z*C11Gl@mEi{dpNKuGFo(jtsGdl$7i$4a(JZj9m9=drk-|mBFg2e*HOw{OgVx;9MHk z-5t8_^-b!o)w#x5^VJYogj%mUr7V5MmwSC`4Zo2(bnw=B5q9CAi>8Zn*h#6EXQBh* zGo%l3>81|!ViE^WAwIsRgmDHEmiI7S*1W+giS5Pa_w<O!da7#C$8h|IwUg&Cv8P3X zyMC#DrSn#`yz~;cROdM$pisCMMpWieOV`+s?E<2fErS%&uH?0mhEDJ8qp=^vsJv4E z33rjase&S+Hon4vG+{Vu%gf?MaD3vdh{I7oA!K=~$EM@0LNde4V!9VJb`+wg+8)xE zh)WS(c-Ixqqdhqls@FzMq|Z)2YM*Ufk%9)}0i6|cjh613kplnu#t03@k4N)oMN+9X z2uHejh1{<*_ktlsaS`3Q*-S7p@$cyM!FXF*Jh8ibJ!tq3di-nb#NwiKcJ|JH1w8q6 z{h|u2N-T#Ob!8U}$w?Wg@kaR?`^Tt|RLb*J)=T>5G=CU|jHryykU>@BT95Q9nj$J0 zwSI*(Vf8DXoR>X4I75l;*vX}1t>B?jKGo~evC^%^g_PuQyTgNVOiI}nJztzMDgSqs z(*xdBPFIFO3Oy}SD;{?^SxKK57ozW^4BdA+LQ-QUy$#e^yY5&d8jD1wexW5AIO+*0 z(b%XzDbd&v62(*N2Jw^VL_JiQs3e;BA4t?~OEj^8M6&`UnuTc86fA2$HP>rMff8j% zlp${~HyGczkLEE#4>pP#7$+8fH2cg7S;q^M{pr4q{x8t@Dqvr{gOF{@ql@|v%<g)X zOxv8~Vvn_p{0z>Hq7Kyy2Yz}JH1>GH^ufwF<wfqjGQFTnmo8iFdHan$D)rbycKzKL zD@QYB?BNdc<_qYthr5aQ;<{{1Sag(#adngAMr(;NPw8cOlp^L-)UX#;?<MFFh+nPZ z>SPsBtU`DdOIIFR#tTDjsv3bXa5BzD)kj7k9gGJgk%+^dW)$gh$lr|&w8uA|QSu!j zohp+gO_Fg)P~I{QId<Ot$s6Ge@gI%IQlhXCC=Jh1q=9F%$7BA|pcDTW@*wYqV-n{i zy&01f4PGQND~_<+1PmOLq&Z^}Iievut1hhqfgW1P!}wk`RrEPtZpGh)@Db{Lf-*k` z!RVxxQqr}9pazU*y6NH^cVE(02>4nUV9CXdUOuB1RQy9AfW5%ci#@n0s&=xAs=S{x zA?@@i<Co)8)eK$L4C4!FFtw+w>U1pUACglwxbZX8qYQ4cY~STSo}on>EE}2Uiw>wI zb#($OL8K&u8GXW2S==&hY5RG^IfkWbH_W-&4N>2q)Y?Gxd(v*PLLsmUg`%rRRZG>b z6*7^BlC0XDwd=5qi*iFpKS&%CU4k4t(b2PH*~e`~EnWdtRDt63stsnu9m7ADWLu!_ zWK|qj<2LV4%Y*6CzF9J;EEv3XL8Oez3WN>`W`sU{@YeZ?KHcy~wt5v(^)Vs|aTuoZ zDY6|;jJh0IGcr}LEE{5#_OLeuZjTJHAs}+mZ<@(L+7#g<H|j|>$~8hWc^z54S5?&v z>7*<z18+A~6;nZ%?c4b1iCP?S1mmuMLvqiO+Qj#-5umr!Z6u5?U>V%Bn0ttRW!~l> z)g>eJtfbb9N-;|(lB~V!DC%W<Ush4qerR?Hl}q*U>Ra1$*i!QW7*WmRycgqeUs)Dw zmC~m4>J20=txSg%ffH`+#MorFN&QI<%}+_4c2aA5|5ls%o<IXpJQ==7gr~X!rQq_- z1wTnhb0nzAR}b}GRiY4Zf@!e{gSSR4JChzki(ifFg<sK}bP=pDDmN3QY12{f)u@Mr zClda<gvD>F<!rA6C#ql>Az2plE|BlFcu7A`D4-Xd2bTF-O)tQC)rde(mHeL33T5^n zUR6!+A~5Y(3}=$L#Lz0HTYhkIc+}rln}<m{!>GmbnHFIIf+Y0Lr*0B35f*mzFH;ZM zrI$0&OGm3}nkgKG?;|Oji~^0keY6bHsAz<i0W9etJ6*8|iA5AfFMOgynyE;CrC_3n zHBKd!5Ig9klKHn+tS#PdKAW#2%f+sBbmLfPAZZwLH?eLKTj<iVMOW7FGGABKIJUuP zQ#i8xuwf?NFr&IcTNUQF7mb$o*FJ<BX@7N7SF5&E^eGo%*f#dFgbSbXs5=?;$S#7h z5nql()n2KdnUPPs{zP65LsF2PS6wtm8XTq09lTYR=l^Zh>tE-6;(L@-ebox3_1=YA z<GpjG&~)(tUiC_ZG%x8@vjn%NL}k}dX+(MoYcio*RXP!stKE*lty+%zuIsN}5IY>= zl=Gr((pTCYteW-v{`1WbmiRWN79H3tWzxI4o{A^r*Sl(FaQi&h?@#O`xSesckownf z(kp6lfl{o+u@V^}OYu?bJ>hz;E5xegENNWxTsF&tpR2xAo=YofOy$I^2d&rXw!0H~ z%C?_A_aYzr&=Hj`>fOMFcI3*k#3|lr`>xuZSobPv$w`XFf`!A<faeeRo|_uzA+6Y< ztYgO-YE{}|H_aHU_LpUjD?80P!}=V%K=tu0?-?ODY-vY<r+V2^h}G-$xX)ONoxU#c zD9l0C%<8gJ7Q0O$byc*x?0$!8d3fAOJ^apq?&UT>6U=yuZ>5QfxvMM0db&uFB2hXx zZRfscy6<YPV!z~eH_~tZn1q#kW#-~M46i@Ij;A!(iNzeGw3T|qJAZET^&2^X7%uDv zd|<6vs80~7q-N8Ck5oymf=I%45J_v1cp|+KM8d;PEU9YLlT|Ar@C`90XUbziWY2hw z#H#Xm6tQyCDsHU>ya21@wVWHhq3;gZHgmJbK?=#CN&<e7Q>tr+_pj;ymQTK-RW!NF z@}59MSKSsVQ76&uLH{e?rMV0G|7S9)t`O-QsnzU18WxKErow)GBNVbS;Inj&!wKB~ zPS-xBg;YzT$OxWAZmD{f>hdHsU3Y`qapuIc(v~q)c{+lS#C2)?M1bOe`5prnC0<`1 znH|+QxuGA3;6XwIJE;y_TMe=YhY6S2oF_9`Iwr?BT{3LBge|pH_DO?kr@$G0%ja8R zf~{Wpj}TAzkASRjG~Ap=BEhfrJIN)r%3D$^Hv88EShg0qujmOEZd#IT_uD=8YRO*| z?I(FoTM;4f?YJUEVd++(o~}@Rn_x-Fd<<)|N@|s!ZciN6(WXyjAr~d3%G#{DFT%)M zDY-A!0}`vXFIMZitrAPB6!o0D5x%5_xk3FGHtSzgx7L1+Pi<?N$AlyN%6_y#t~2da zlB?2<sOL^N^0KV5>gF8VHtM++=N;KPc&pc`!o~*K$Ux1mJ7*Fq_rjqJVze|AB@CXO z9G;OJTKTHis_qkRL<n(y>~4`*O?|PN)@_zp2qCVrEZp)&>R=+@8bJVS>}OOu+A2NO z7Wj+7xzv|$5;v}ngD=}0u3ep%9zBj6zPl^nq3R{7y|Hl(A1;l}l3c3N!Y6LB+$z5? z&$7kgLVZdXz;0|+N{cMdGGBLbl-@{blkaUS(Z|e7eIKtxWshNh?zRkovK-He7N%w$ zNtdHve!eEyUVH~jbaGiLa?|FCq6PGMl0{oG2x)xE{%|BJQ=cWNPm9`iFO8$z4KsCD zk|)dC(Qc8U$T^^0#m4C_Y5sJ}OJyWs6X{Jv3DZ5*wc4Zbe4^zw$K}m)b-YZUFPK=( z=SOu^a&Y-q-u4%Pth$mnVda*8e<NjU323HeiYyd|8@F9VuxQlx1sXWDMF$Q_HPmuU zJR!%K>%m{3OW8{Vq$kTZ)Z7efbje5vSsGGhjq>~mMvsALedRePk~m8egSmoE3Nt1% z4bjPNh+^UdH$*~R8~RlImP{EN`Aqh5i5p<DtBB_-p+YLke5!J<SUT?(sabG3-kc`V z?WaiF-6C_{E4&vfxjOYL!%qenk|&?ollLpzLgBcka3#Y<iJ)?g+E_z*PL-}A#Zy!G zPd(&|t4J=PZm6VMMo4>Qe-&kZ5rOF_eyh_X{MnV0Zk&xm?Gog$_wVEyg5g^Fd(DrJ zVLO^$v;1lI%o;a*WEr98*wz1!y*B}mqUhR&yJseoWU}vJA0Qw**;qvhB<wp02m*#l zW|9mfnPFzaCh7zb5K$3OQB+Vwzzt9YR8SC61Vse&K}01$fUpyGMg8tm)!QWDd0v(0 zz5eg|{=Skqr|&woojP@@y1KfX&8Z$2T5jW^RvIj*mVyUUD5=5%v^SO}*gU#~vZZ{h z1Y1$Qv2cMPR>2cRm%&za8)SyTU88u+i@mG{WJ)-hgA;l}7=(`APvEgxqKZ-VMiSB_ zdvF1%ktw1Cos8Sz7inYN9(&H2JQ?Wy_<z#~e5zT8YRR6q8+-kSjK{Y=&faXotBW8k z=iI2_f)DL<gsP}IS~9Tg?RNbB3;zb;A^g(B(twptLHL1jFXHzQ<6gmUQ^q;bPCqj4 z5pZ`gt_b~sr$V<@4l`^HI3D9mCG;0?Ke5o`O6X;9v=D9(ZYbEF;C^9PC>G#&9-F}( zVc0fsJmsC>${6-9Mb3ch1zwg`;EuA;Byc=NFI=Yb&@6DrSm;P_JTwp7afX$E<N3}r z3PL%<mVo2ful~6C!my|SnQI*)2=y4&7%wE}+%a$`7*+|6$88uU2=y6eQMl!B3~d>9 zI8qQ!GVTmG9^)*YP^PbM7z8nne>KG*6e`?7a4lG9t9Uu|WpEt3p<o5I<UHO7m&jt= zRU2<(M=KiGw=Y^V?AN+-Tr(=soM9ut@lY2yUX~RK_6fLTCTB*)rZBDvxL%Cw2(CZl zW`pCoO*ZrIofw4g8_K!e0>^VpZ6t>d1jlnLRj?)Ccy71Am9mt@#&T}a;COC!C@+PD zwnMTsvKWN*3TJ?NIJUeM{}PBnxT$bWP+1<g6FBlD2B9}N-X1n^v@&QA#)0FtoZE(f zBf}tEMMHAkr$EU_5_0>H7`M9m$h3lCjlprNYuru_?F8;L3%wT{4|U-C20ZRGaA#O( zDL5XwLkW%OAP8q!Xe>A$TCcMlw+*;+EHnii4}C)k-3jhI3;kLNegAGbZg>|#xWGc` zYXv;+pWt|@n%^S`<Vy@f2XL1d*B2a@8*;BK_aL}R7Wx>t%Zz&w9G5$+$W?&5!a~n0 zq3ycLsmum<m4(g&$K(FgT@F1D?ivfd433A+PM1ShfV<8@-vGx$!!r2yL<~Y*g=?;G zO?zM|h{fm&?gryVg5!3uxF`R1h(Y)e9GBapaHqjRh0x1&g&WsL#wID;W^hnC<O2H2 zoUxxEyveX2aNNT3!SUXs@6W%LVh~n<Ltzn@KIpTSaem-<jCgPmK<H3#%^0@}9B;RO zfxF2t`Yu3I#+?U;hD8i<Aph=&L5K#2h5$xi2!PVTy$cR%0Cyf7PwzKyzcP$Iw!_nl z1eeCJCg8d;j=mp&#zEYE;Ls4@CV=DVRf228ux5iXXJlM!aJ)u^;1U?tXow&{A&A=p z9M{VXaKABZ0XW`9tHIr3*d_)06Ws3%3mq!U^#u0^!-gr?9B_X!>^TK{2OM4D7=$ef zb_JZsFny++UMV;<JLH}O_Zj0Bg5&jg9UO0&Sy`BBvbfKH<7NIBTtgP40-Tv~jfM$A zUB>kX*MM=0!SR}h4aXC(ES37;cq(^;Gcc^Lf;|k5>+b-#CM=bs;QW}}B}K0Feb{Tk zLa&1}Gj7HRIqnH?9J>x~KMTDDj@K=0q+B;0LMG#1J&+B1Z-I)`#1(o<95vy$!~Uu~ zzHjQLw8r8;fC~9H52}s!kkgehCzt@eeD>FA)$}K37h2pNL6}Hi*z~v@g;J6e@c~qe z%LBZ~ZnYNL<eX^S!t_Kr=2ST^sB+%B%DEEp|565C(dU?CvE$?G`GVDDnUq~<%Y!P} z!OmUw`~n$}@PnXQ{cWmpzPQS{6z%^rq^jxVSc<J=D!Jo%5z|1toc&wBRqYesxplZS zDW!t1+6J27|HxKNf0DyB-i8cvO7ilEjwOLKH5tZMjid(OajvTCkn7Js7|nHy0ZTdl zsXmm1{)bG}@{ujq#=j_-@f*dsH2lUfj(UF#<EYHBj2nU9XvU4jZym;wR|{g?Wc-FO z&Wqnr#?8TR7~|&SH<)p&@H>fdr|?U$M1dAD9${Q>a9+mE0Y~vgVKKPbj9Ue67UO8g z>7!f@6?=?v^bWPvj5`R9@)3no;8t=ubbvP)w+h@lJQUm-#s$DMH!!X@xQ&b}0QV{5 zu*fQGW85il+Zh+&CkWp%E*{)o#?1k@k8%9tqe+6tRbm4m<XH;c#AMn$*}dUhvIo0t zxpueRQQWMFySeFaeC5dZ3#AweY%Y8;)od=dO)^{Dx%h%AyqnqSa^Q37HuF8^CQcLb z=iye{?F0teCZT97PG_^dc%r4yZdDSo+EHi^%6#X_+XGHW$*<U!Z}HeC+ROzu^1o(V zajv7J7!|Y8Coz4Fzy4LI+v%%{qMA5cnb`nJDl4?MlFP!*@U_f|HdkJuV-j>@)|9<! z@$OiA%9XxT_5FV>J+pbrJx#3U$@h$EVs4X^oOd@TV`M#;Ti?q93$1sfwa4K5oBa5n z#X}TX-s*BV9VH%Q#*#22RpdM6w)w)QONy<QVriB^<v>Xbt!A4wACAKOAHvmg{)c?z zbZ=8m3BF_YI^5>+*mEs~W~asNHaEk!lbL6NhvP?Yhs!<{^VQo+aJm2A-r)%y#qQA_ z*F?K*(rDXcxWQseq4G7m(KY+CJKdiDucU`jfIc{`9RJk*{x3;S4AlvtLrqRGN+(1O z4Rb2zGH%idCYRAE5{=Z*c%2acZnRS*x<I1xxeMo%-hwb^ExcW)jyPP1rg<WcWtfg} zY_fvUOX$Q@l55H^Rt6W!WE2G>;)!88AuKt_$!H`fl_eQvi4cVd3a_OTYAuLyDpZcA z4c{k)zY8jdH`NOvqM7Bv%T!k>6PwOaK0}dD6Xd@@%9qY@>n)s>OBBLDYh@UOT4GW_ zurp{Z)sb#tvoew_=^+_<r7{jh-uOynbaJ?}RxiC!7vFr2L3}!n;GZtw`{G|OcomM` zBg3)53O7^XAjXz3iPBLF?aBu-RE`Y9kdFx({s|2~NhAL%T0}lxml;qUCcpAAOcQse zMt+z^=35QlR~`Y70Nvz~54xa`k5ZWdm99z|GD?$IZ;ebtO}_VN@@l1#Nz(97YUJP0 z$VX~q?)Fztu4?jqKvU-DRS~vODWA5H8PK*G{xwZpTHKWnS`d~Gx=4`^th^})-RP2! zW?=N}BARmnIH#G6o?TisXIwabIY*kcFf1OwEf`0OhMY5l%Vk&sep@n*Qso?JkS<sB z?A8#S>Ddhu&UM6jKEr5vxHaR_6fOgtongK4OFGfB<xS2F#yPdEo_(O2w4`UBOXl2Y zoEI@{EPfLiXH~cYa1MqQ;+I-hFHi^K9L=OAFpMrLlNmQn;k@8zolh^!#BU1Y<|y1e za3u_zkKa_rEmF9};HEO{Mf|p7+%koG4cv5wt-^16#=WI*Yr#Fvu=V)uz_?8cw;9|M z4BLud(yN{=4|8rO&Yxn~SNNq{3VL>-$+-hKf0|(j@k@54XE$3pcLe7P8Fn1MWNCVK z>xy${asCX$F5<Tf<E|*&4RFsf>=u4;_XcrsEiG}hj7&X1&o0~PW&rFD80TnT!V-p& z@1h$7dVy}{bB<o{^%BF(;L;eEpm5E=EoE3MaNQV}sBo#^USU{AaNQY4Z`$Ep8o1>Q zBX5_^I9g2LTz_yY7)E|HgK=33Hv$~Bm|hqSt_S1BDx4MEI))X1qh)-(P^fTDaMZGT z!2>Rcag!Bp8n_P_<^>nbxS0w!2i!*tn+Gn0aq|^!5x6Z3TMRCgaW5*|GH{<T>@{#< zj9aB}Z-Lvvu(jZ5aYrw#SGY~!$hP#tW^mDr+p2J%f!oEfo#1E@NH2V)aC^a#HR^=} z;Amk;FC0|3!{GKX><G9x#vNC<Q{c#I^#b;z|4E@_70Y2<bWU|3OPs6Y=hO~lQ<Nr! zQ@^8g+TKd%snU5DoNJHXI6)N6(T5>lCf3oXPHa+m@Yu>*{>goRZTjgi_R*zbpFO(9 zul~w+cRpG0v3+0b%p1+tc0H7o@$B={Yc27v>$|(*`B4Eyb=!qK*y;L}#62xyYCG2q zb6$O=G-#?!<&4sD9YxMIcI)No2Jz27sg`MZHjAfCV&Z&J^h(G?M`4>HE4%H%kv3LZ zQ<-R^RH)Q?F;PxXp>3?ToRa*6Oah=B$aI`52$;rb4oN19ASe_vg_=;#w(;OHBB7|5 z&PZu`vF=Dg_#Rx-L&<{)<p+f=8$>c@mX;ty07-*{iZlQ+-v=T8zSjpy0}?(&j@8Cx zwRkLmaQNY0FU|*P3~u9NH#Kc27ldS}wt_GY|65UeHFxsHG=QkclK=+$Aj?T+m{w*Z zfUyeFMlFtDM2KEo89-44VaVHCX%!DgLT0a&)YMKX#4{OUgfH=5fPY@XB3qH$<{_L8 zvsC88{8WRSsD|9EhJ+|>DyP$^8q%Q}l2HxGtcGM)L#Fy5J+rd23S5p!yhw8Hk4iGC zp2-)Hp{mGhIP=2fRD^uaGAKty=)I~Jp+FV+4u})_R*^Cw;U*dBZ!flG4|59h;WSm5 zbC98Zb1HJ3QuaYaG8(uoF2mBvatLGLsyLGFD7NQjXE`p`Qjn4yh77JRBcz28q>~8q zRP(9_#Ea>UinJsoQAYX{yRm+Xx+_SAt#A;n5hW(cGMNtCo5QhILFlXl(lNuz)Rg-H zarz+HK$c;8p~|>{T*Pp%BC~-cVu)9fmna<{<UJtaaJ;GvZOPi2u0?2T))61%G?2u8 zTAAMo8K6Z>umXO__EWza(yAKL*$2ta&Mg@4_Rtg&hn!A7ADM)n_Tq%(WZ`f$<xV{_ zp{K=On2_8thP9xIq$FNyB+F2Gxkx9dnHF&ZNoH-zdpKr#K-wz^Pq}@{{VLL9vfY!A z((z@cd6t)iJeaOcnXWcO3_ZMrl>1U3i9X2NK<?`+%OtRL+6(8HA5&9KPEH>o%e0xS zx-Gg?(Tg;9AWt;<5ko2E!jDgoG964tXya64k(1MlXA$c`a0xSiAm=U}hoo3chGAEL z&>2sMAi7mTGZ|H;4iI!fjZ9l0@jf!$B}7eU1ds$DnIa%&pLFH{L1)tBMb~Z3d}KZb zLh}Z-JapYjvDCcEf%Nu~xdEi3j||<=f#Nmk!~se3k!cQOtdC4*Ae6G2SAQTh_NwI> z17xs|%mg5lePm_=K_hF@Sp;OJkIZr)i-CYh<MIZu%Y2YsK#uqzM}Uk4qL%OykoiD( z3EN;!;>qE&g+QQsk;+O(cF)LoiGvKLEle9shQT5{`bBU^PAX3{4U&>Qa#LysB+Uo8 z7YMmPwLF7>ya<GsCtJ!Z5r~>sHe?3-q%#G`2p?o2kOCj%Z6Hn`<O?8PALJ+@@MUT( z{sc0|r-X4R>?);%V1zb67Wv3z09o%NGZF~Z3q;aS5!kIhGF~9B`N%v4<SQSUmw>$G zBl8xJgFZ4J0-@YNq`bZWd)!B6KakBnG8ceQ3v$ha5lmn|^O0!^<d%<2Hy~6(HLo#1 z0-#k8DR(??!{+*`%pxGsJ~C^79QH})YanJHnbSb17HT>HFp5?_GEIP-^^r*j($Pm| zERZWcG7kgE@R3;pguV`?TEbc&i+zwCKvwx6hk$JLK`sLE!u-{A0x+*39jdjc1BC1u z)sr;V8pwQ~ShQxg%m*m|a>NIj1B5iMro0@;XeDL2H<^(SiY4W>1u}JgV(kM$eMc?N z2_P4J^7<VJ4QFb-VsOEm=7Y2alHika1`v-=$|HbK3#w%<21313&3y)tR3DiafY4Z{ z%B%&_#Ybir5SpQ?GRJ@n_9@}-KxphyYY`VL2xEPaWFSX;kU>DmTGTS<19?r!OV)F^ zkDecf4EZQE*0Vrpeyo=8Z6ITPWWEHl*+=F$5NaJY9Weyg@IEs2fRL|KWjX<&t8_K5 zEFc$s>g5DNW1*^zc|hn?MOFjx`XD=jO!mp^D3BvcUa~fjlE&(Oqm-pX$F8kXQahwj z>ELi-nRK-UB$agNgS4YzNQ-ppM5BWSX_uHXxhm3OaaE+#rYcBM;*lyyN>Ve_LYs0* zGPRBm(r#51BsJ+^RU}z}Pte9{*J-dX(mpkLSrw#H%0*wKQ*u%o`k<OlYGO*#oT^9% z+R~zxNln^R1?iZy)fY)hOg>T-Nu~a-NhhgYq5#|QK~l|Ck#>nykxpq<koJkx2es+6 zPaf-wBqt`*h8vAca&pR?sz|%VRgjJy*7_nTsVQX7nsic9JJJ>%Ez+r7T2-V2twv~M zQlX!!NNOSkd}KO!t0JBDRzZ?d%;=KZSScNxRgey;TdN}N!_hIcu{v}bs~~M$p4@~! z1MY|MvMmdGk$MqKP&!~l><9|wlpMESV6n1zEI2{T^lFaPP>RK5SOOg+gidrqb{;m_ zx@}e##E>?0(bhhd0dQ4Fc`W0#KYfr!o+mq}5L*tju}euku{w%v>Y2+%%PEQ^PO^&} zRv&?4D|Y-rLfU1O?ZWL=>=JTi=VDK+TN`38wzITkNo{H}hCK?!?mUO9NE<O9+2-ar zCTlUC4I$Vegv}c+t5gC3t0x0W3N!2zRW5s=BYP;eFIfp1RN^V51&v-vHN87h)nHka zeWAr;s|Lzt!U|KirLfSEOIg#2%jR>M=dv;N<QGnH7Pt!?o@^&mVs?(*Q)F?nGTGd2 z3pSQyR@;9jXtsO_nk`KNRx_}fBYR|aR*9=vz$G{Kf=#u_yS1{jEIHU*oarpIqe`@- zBJ;GEBCutb49BEmp}TFW9W8^U9EoFShK*KB9d288dWj3GpGW~at327gs0zp$i6V*d zurYZ@Np|KWo6VU`K~=F#r=_?mmVx~^Rk2Ku%_*omP_!vlLs^>DP?l;nl%<<N`-oW? zg`vzGvoo;)uMi3&lawG{z3ib`>DlQ8w%qZVwEuRv#pM<lMwRPs!A3!LmRV5Zv62e2 zvwLOshQSruTr3s<w=K8CW%o?MY6+6T7I4RSyG=;QaPYQBXrCw~q!&WJ3GI`Fgg$&D zpKOK+?UOOqj<-9p3YI;P)`U|bP7EpCmXL}lnYotYY^p9y*PW1x2qndn?8VlE8Z0P* ztuE9UB1O{Lm?Z53Nn%>_lf--=NzB(WCBZ77BzhaOmEznkREn%MZYhQj<SWMP-dBu6 zk{Ig}=mwIAa;gnxeM2k20ZBydN|J~M@D<UfqwRKbBeKk~Dyq#2r}ENh0*04?mLgk1 zq7MW^&A`r4AFQVfav8L+FQ+XhA}6k#r%TJM+SE0WlDY<~A$2KKNnJj#;!!l2+%6<Z zxLru{Z9`IO3Xw}*LvqzCP(?_tM>SY#P+!L=wO18T64iQ5NzeyU#MmmeBEiq3Kxx5R z3Y5>JK(=-*1#w;qsL4l5ay16k9F4i$nxpZcnxiqFTyr!YRC6@uv}=yWgQRHHygeI% zq=>f(yj@gn4XZ`<sbjTJZ7pvTc-vfQ*t=bUtBhURZlern3Wy$49YkmG0hQk1gVxXy zlyJFlYC7_GsTo3*LL}ZMP|mmd=u1(n=U-h;E=Nrvl5%~<aY?5>m@;q03|CX+s<2$x zs(AHcY9-_X`eIVi6p&4)rLt84tBUfuc2!vkttza{ovX?#0ZMKzHUp}u{#8PfXiCd3 z3Dl5k%29*<jefXLH5JLQS{r%ZZ>OoGS{Glqy0}uy>QU67>e1Azi|X+-VbvolS0L5n zDM3)4Tx?ZG(#U=LFsAhC@ic0$9$2H|eZ^|frKEfm1y#+p;W@jBw!$itUFBNVXVR-& zt7_-Ee3sibrDKv=b0l?0O6{21v3>g#4G1<VF|mF7_GWXZ<W5P6ENHCBIxARsZbtjO zhzCTr{f#bAwOcUgoR*fZsMpd2;VL^Ea_Tk=g4PbiQYWso4-BR=T-@S6O$hI<-HJhY zA^!Jf5vLwZPO~9`LY85Dx(l`^9Hx();Gp|*X~N(%?Y0fV6R}ffR$o!rK<^;OQ4jxS zVenY(h6cjz_&<2RZ$*&aR_!fBlB4VRZrEeFLfU6ZG17#@H0@18lADSDHIPZ6)nyzF z@z3NmH;@RY<-3Q*_~t8^68Z9jv}i$cwD|A@<ergaS-#<EX-d<R5Dt=C3YnEv<ur>9 zBsUiS>m(UEX9re3(DZFHdi3lztbbPjKHWPv!cY2utc*s!=%D@?1G^3Ak=cmWx7eEt z7Jz06BD+2M*Y|@va>ltwPi~(&I)kicw9}16jFLiI8{pWi*Cm3AyBAxt?h-Cfr!88X z4zTCC9BxOR$J}gabMqjl$6jQgN)K|S<8m1fa=E0ky$NOAEA-Udy2TURSiGZ6R1HAG zX~mQu=zQcaELKO3Et@S7WaB!{HW^QlM~0`#QlO+~=}3zRj}rXk)Y+wBA3T77rd7e7 zY;nU!%;Di+gb)!youV#GVUSpiD+D1D&<F)8M72EF(-y(9@Bkkq<}w*lzI0B{ej&$* z2r3xIitNQK7Ma-Fh&xDhG6`C9k|ZpXvH3$U7hQN4A<y6+M;MZ71}Y_=%u+G~;3-XD zDUsgfyl9`6(I>TW2wkbe4{gYch)4vLBS+!970!8NM_wKV1r}c?42odyx>%;^64X}9 zV4F#Zu}H#`!UZq2Uot3dtiw9Ew-IOuQ0)5<I)Y*+htL@myP<@;L8*^-0i}IA_kunG z+7)y*Xg5%*dOGMz&<xN|KzoDI&8WVhG03|gXnoKDptSfs5VQs8V9*rMA)sABGeLWS zW`Xtx9R@lCbTlY+y9YoQf{q2<2ATu<Ij9x%XHXmHP0)N$Ba~PGY6i7~VvoHr9<&8$ zF(_?_ae&g2xf66e=mgLypl;Avpe3Nx7?VH`fZ}a;-ZP+6LH(fLX`o@C4}nI2J^~sG z>IIDloe5eGbT%mUnK_`BpqD);WBV$7>jk7si>Ql0Bh<d-bZ3`f=?lw~*?3eEk9ty{ z8Vfo3@a<D^un{MMc)#F%k@XI(#eN5YQ9M3%8Z%hQVp)eEyCW;+X*gM@Nx*pt{s)P? z6x!snfj^Ib927Mbl#5yw6Q&|j|08R!YVqG9tREDDgG$p8v}$S6fN4w91?T^+G;?@z zRGR*ZC@)QKod3JhOs1^R1UM-A2s#btZh%TR80XrYd4<sZSpTEjZt_9xN!!n`!;0O+ zBOIGcz0}6tL8$>yIBzcK0MH4bNZm`C916MubU5fb(EC6)fsO?I3>2&K-rb-`!}}fR z7|<i2NXvT?)CyVwiur=~253I$ub^-)UJ+$11f`9DMWC^u#h{Hr9iWMzsG*md1j_Kz zM!zYbV?n2Zl5QUcC7&`Klzh$%(3PN%g1!ej3-m+K*`S|+J_h;?=seKxL7xDn+gVS6 z(mOflgI0hp0KEvh2=o@{GoXIZ<FlZVpwEF)<Gc(?^P;7oZ9rcI9S*u2bOh*1P%G$a zP<rg-P0*R3Z-LV7_cfr@&!Ai0AEBG7{qb#J<SUVuAa7CuON+`DmyJ4QHdemftUsC& zARoT{k!&atLBZi<Ll$OJ9hLJOxc-QUXq<DKl6rbFgAv0QPQrYR4`)weLN-W5_8g)t z6^QN%%J#Sl0rElhA$yDjeNh5oQ*1o=05l%hhoFr>KLVvvZwBoOx)rn!=%=6~K(~Wh zKw*nsC+H4P*og22=tH18K_3Byje61cw3Wk)wiUhxrM&lml6~(5CH?LLy#z`&-L;Be zd>$B;Z6W@nh~WqPB43!snzG9x%{rK;BL_)^mk-j8bYRj!oj47rl7m!c4!wc#Mqo}; zs0F#fgc(WInoQi7NpZixgK(q9V{@~HH7jWp^G2uyFc$yvL3N=v2n5ZNK=ebVdpt|# zC0`K@Iu;cD(u@9x2fw&3YlEV{2=zdp25kUJIx&Ni?q0=z_bR#@0u1-W*qe)@|AX!% z+hg_|jyUq+t3I+<GlCR*MJrfbOeM_-X4=xIgi_(Ml1iALB*n@Hm63Gf51Ju?O;IN* zH|7Z5CZO2L;q3_87PJ>=5-8at<__L|psApw1A4no)qZR;@HYir(qqrAj}D|7yD?eC zRFTX^fX|T+O}%?WVApWxh>Hjs1ouhp9}dX{P!oEgt;pe;!iKJRfCa2;df2Ti8jR6A zvI0tqxS6`~W($n42pG?VY3{5Usp}$;oNzG<q&sigP)f5SLiJ43JQ~}1Nd~(ZB|Mu@ z&0rG{G@_=U>_WSn-D)HYrk;@sDG#eAf4PWun5P$AkU`@huZF%aSB$x<gUUI%MrIY1 z;!Xu-Z(3k8;Jv^Uf8{g#J&zD+_c=vAf>Uirm8TD(LZ^tHPy!vKLpraI;?Y5BBM(SL zO_O8@Cp#cJBYT3qumf{WW>4KgF}4VpdwO37#pSV=;$!aVrH3Fe270MjcqGw_f7)>4 zodk+YU+-d2T&{ZG0>vf2_ao4;pkIOJfc^xU3wi<63aUpr^Fi_aD{Z)8^U`skG%qa# z9RgYmN}I9Wpi@CTpbJ4uK-qj0bT!VWg6;vG26_<m5m0~Fxfhh)WLXN@8gx2nGUzN& z+USfi-1|J}<DjpA&IjEIx(Jju=spKZpQ1tCSicHH*}GKnExmzJABFCO*qZwl8G+_X zFcH%7q3K;3r>yNf(P;nP5LY}6&4HQuP+ZA;aIr?0Z<M`^SQ&z@DI>UCqaF)DLa_K) zQt0uqI}Cj6xjzurX+e3uIk;EKyB~~-=B_lfvTi^|EFYu`vaL7()Gz3G8M-6=ECr1P zT?UG-DZB#O8T3_9nmNA?N`4;K+g{ACgttK-1$_r}F6cT?8aFVn@-7Em4~lt=umN-f z=tj`bK|cVcGHnJu3%Ui=fO35d+8p!~&^DmkK-+<S3QGM0^D{5C;SNypq3Pi7uF}@9 z7d97~4jT7w+PWCyBy*&<Z|X43^*wDyXKp7A`PSI>%*n|kQ!H8$omgraW?alB<ksaa zRzvHe8?&c?5Ldp~=dyIMPY79yjBxwWSQNH5+}0*2a<Cd1rlwd4`41W;<b!lbHqrn9 zwF@1)p>vvJ!dEaG`5Lq_&c6k13Azuo1L%IxA)p6A$z~3LQh5)9P6x%cuNQM_;TO;a zphrPp0X+`-CTKY**$U>`-mRdgKrts1PJ<o*JqJoQa~@Pc+2E_Z4M8u0HU+H&Z3TK6 zlx*l4XnW8bpc$aQg2ERHzk%97Z-K&R33yP(3!fzDK*@IC`<RVQMqX8ItUWM4{L>H= z?_*;$J{DPW?ZqC4yC7Sc<3Ub2$R$Vz+zB<8+N2ag@<PhEAPa+1zSJ&q-V_vsa?*J) zD76nB)bUc^#(M(1RK9Rf>ML&i-&3WpBm<+k)CFo)tB10!$L(=p(T!g|KvFq;YvOC1 zZab|PNozf6N)-Mma@9KE-Quhcv7l6kIM66iJhso~_O(H&4v*u%Q<XYU*(pv7{MXjj zfpqC+i+$L+Gtr*Qmm|y&lMmnWQ`e-#K1Oq3s>IeOS#RnHkdN$ALfP87QK)=SbgCQm z{8kc(N0(Tg`h(U2HV~A`I!LP1AJMdS91`&jvgL=<&5O>9AnoExfJi0zWOiT`Q)wM_ zI_AceKuE-8trTpLSs@R)strO5NkNqTA9z-XAD$#NZF=Vvy*Ue>po)lXvXgcwDFS8) zT+k-3U16oE8yd(z;u0j53xhLx1$($$v@dL!v}V+cb~|Mcr1jARAvofkHZ{#fjl9O> zhT4K7uG~(FWr2rdf+NoVJCSU@HtEKDr-LIN#C(h&PIoR{F{3YHp*IgVYj9s7IN}uA z$~RoH2%3@lM>L3}Kx}5CiVYf%DE<-0(5wcp+dj@s_`vi*8GQ!!%FgWDCliB@9Bek{ z<ZFWm4^7uZZkKP*(S~;K)2p3eRwBb%CTWB3>ozcR*uY+>kes}wz%foM(RWbqZrw4l z4~RG%!OELSTiJ%%CY0DP#m<`Iv<a~Y+{Xi1v-EdZtV3<N$TlEi7svY)=ele~HhOze z_5d4PM6R18>O$fSml(?4c9h-S?#YB(>{(Kri~bZ45unL51DhR{09vO;IeXH*F(sfm zVx(8kv6s!m3MS>u(x5`u)g&&}h*jpG2AAUCg?|ANKWlJF9<|731r3qHXb+)M9;yM| z1(6F%8z7V#)Q}5Lss>&1fB{k-9_(T)%I@P(k}_%vrsPoznK#k|WZDYxyfll`06{%? zkhWzgjM^m|uN@AExVyT5tVr6m#1aaF+yyBQY$eQQYHFa#R8o^7yoQHS0@*OzfQSkX zsLh{6cE#kQ5j=$l54O-|DReKMLxPlw3$MI$WvA2DRaWd!#4z)2)qM)Kg_8c0xhyl= zKGZ|88xv3N2Sf~&0+=>g^oBtHt-)qvavc!yrZysN>&j;7Z9(rvLuar;vGk|~vLs<X ztfX78xPvg3&aXUzrUh`}5fGtK5&C67L~Wh|vvf2-H|s=8ajwnHR74t#_6_fc8o~=J z8mv}Y)<%Q1b$|x3-;u?jZgGf*^@k%Kh-(v8l}O+xq&R43CQH?u#xbSe+gwbX)btUr zo+b#_E7e<+`Ibpi(&Ss@Mq&w(LNo@(%KkAImP}?SZF*+qq1FzU5~6NMeuxD`AON>2 zsCCkD={5i}U+T^^Hw|y&K0F<`Be-_#N1e)z>3L1^ayglwds!+I+r0ss%#wFTvjT)8 zw?(`Fnatc+`!C>en1Z+wV?i(=;+&KecZkgL-Pz19RWB6x3qd}ml3WaF?nx<6Dn7MV z92aD!)Xjq(v<0kqcOmFr9;7kG?4DSnVTDt=J1Mdk7aU-L7oVKXEcD;F5=^%OA|B>Z zSXvnT0wPj5Kx$>JOzD2lF-hZ06EijORHsT~QK@8GwqhH`l5BZ5s*4$ug-28DgLb&H zdQ#SHr8K3Oto*M?5#+{0FQcvIEDq)NW-PZI7!ETa+V9H(skv5HiOjqa^E@>*Bx}bH zc<H&PkXoL4azT}(hOz>&oM@!nCIxfDz%V%gy_1DfTRXYmBLinT-pi%s{qwj`42ZbJ zGuAdTvtpXGDBb)y9x<~dhc{TG{~VFE)<-_Y!zN``G-`hYP~XcepeOjL5on?VpoctT zBt0JB(Rpu>M%`>C{XCZ@t7V0xCdtF>YjCDA9UM-#5Lted{8v0F*@3YR>hX!-X6@LA zZsxOCG$6iHrIoR%M-^a3r!67gLQD5cSnLqQrs*82G}z(Bm3I|uX4X(s{aC<rYV{P~ z#{xd*`AK$6Il&K5Q=55S-5q#!IT^+jUbg|twIt1pS;;7LCr=;7f=v{($sLzyCAl8F zVwxQ03Qet*sRIo=uSvPfokDAGl<X=^L^3*6S5*J`JX3Ds%siU&^w^$`-q?=B$9VF? zwB!rbNd;645_g3HB7Ciwxy^E(wB*SZv)#kfr$%QOmBPnYvGjbU*tqSdtq6MxhIG7> zC)b@GIibeC%yVU~Q}+BUA2M(cZxG-qv^OFkf)+bmZW_%z0`;Gbnmk}vcD%im%1?!5 z?L;lHgy+aQKqkg7mO3RiL(Q7m)+jE>?ShS|pK%GULBwMUpRGv`&F-ASa-#lmmz03i zv`jI+ev!E;w=BjUnc?kKwK7x-sX|I+Xr%c}TSnD)ld?3L<-=MHcFvU85K5esiwvMd za*uSyMQ(&orLqUR)8UZ$#E<54MLf%H^tcZ%EKO!Ma#Z$aOsUk{r9RV*?d{3*ShF!O z)4~N)5;geyQbd|b_%t}>Rl)-YuzMsdO)@tsFbX(~J35-|yvOBOn=&z~$2<*KWuidM z?L>E&XkoW7*yyyry6q^cCV8D2&PH3w7;#;RE>1O>ugwo*8`(6gCdHQgR(}UB+{urr zrp!89YaX}1J;!BnO<`4_ShPq-HHBi>#G=MQkb7@h|5QD-n_1QfZHao~`7w)!6<sP! zPy1v%zC`+)#|>NQ6U?wnwXqeSMU7p3M#U#cCRIhgw%ACj2dh3cVPj;N4Fj^kRnitJ zq$%|+emjgNwz)iiK01@z;+MeVw6HV}CiT;e8z?}TO)1WqM&xyxl1Y83k2}MbXTeH7 zYa?=kl7k%Vu+#MmE7c-Jt2CP>q4qrc;kd?g;4+DZ)U{ZGP&*7=sh|OwUY%T+%EY@0 z)l}1{aASlxxq5ilU@bRa$(NR>dFP|7KG4>~=X#6`%I0zvJD^W;bF_AaLdnAs$?}Uj zy5R*q$=8^Qny4T?m1ADJ+9<$GeS&ZC*fVcTjbuz!W*yl~ZJ+YuNCu9ztAL0}RT80g zQKo!U8d~*Js=!k5SF2Adrcv!{t&qH6g4PQ{SR#e>>EDB?v<8K+QT?{=j&;m8tF<jt zz%HL$(d6=2pM-4ZV67J;fy<We!j)ZdCOrvf%e3KpD+TmW3T>2>rZn^hWj6Qntynhe z>@}KIHuD}d?n%QQxyh>I5*MP{XWJe4`~=gTk11!fs<$SI>|CrFN?p;(O`q1Kui(ER zh(EGx)(a!wa>bYiuOFYer*iXC{l*MFKR2c1u7Z%3q3$^kpZXVWG~EYzv%arBpjOW0 zusUZB8QOlZ{+$aW^XmWZNIJjy;_DMzzuDS@wP4!6Vb;GAaK&_VR=rQ!-<{x&Te&3O z9DjP;1LIcI`TFLd-+K({bX^cGF}VZ#Z!Wz2WB*2tmX5upuU&dIx5ZB{q%;|t6`FeX z(bFSdM7}*mN^j(nkclrE)@<MW&JzdrPKx|}^$PnF6I#xgF+6p`lD7RkTk*<ACO7zN z>$ySuAK8(WaO3Eo>p$K2as7AheSY=Fz49}T*Y16+YcqDw0_k;a@bLLx_c<5L?z8iS z7Uo4?ZNEIH`MQJKp1ZckGvoBWX8p0p5%){Y`nHeRmv>&B^j_%NTQeWOd-$I_9WOul z;>6AwM|!N)=Wm{e#qmd(T<k*?$t?~X{<ZV7Nqd`Y`RtZ{_s({&{Mg$0<yVQtfv378 z;Y(>u?(1dNk-It;#0z^KSnTYQm)YO5O8<tf<$=vDQ~iJHajqx!V(2N~`m0|(*1}P_ z`0XhMOYj%r&33I`=j!yreJ`#yMTXR=eHIRW1Cuic_4)L|zVTnIZu8Qwch8*mdE~nt ze!2QZ^Lk6?*Xy)?MR^;n=Nl-!I;Tq9E!)-}-tzs{uN-c*uJ4g%FRZEa=-eNdJ=t;9 z`R<dEmXpaP413_04VBJCcU^q#t@-C(`?>eNML!I`+qiwht(Je@zxCJ=ysVGOeRaNG zZrSAb4*wb3q;y&f|3<&P`>cKV{@vx74bJZ#_xt@za6cF~Im~+d*-M6$S&cScI^Hkj z`JONQ_{?WTKa@ZE)R>)jy?F2C4;Ephf0fC_O#FR)=(|mRxtjXek8Qte)9s6o5-y!+ zczpHfR*&>`#V&$Ton>-uC$)<_wC%GYqoZ~|?S6IV(1SZ?uHAEZMD#b8pBe9I5k3KX z<1p--_2Q%BfBh|XNRe(&PU9oB!<+j55<ka$@cHS_Y%<rs{8r#C?73rd<%{co*JS=j zUr&4cp_wP&yt~(?_zqE)j*kvFa^CAszBvXr$4uCG0z23k)!^y!W5UWGDlhfk@W+(Z zlg1dgU;4P|{3oO4etz?}9nc?>6XqP9a`eew6CUaiIBw|jW}h3Myiz-5(+%&yp7+*o zK2yZTxbK-<gT@n+>xN}+E!-8gJZnX*qqBpitvhj~vhk<gI|V%*{Znt~5BD_8`hABh zYBkuhuiffF+t!T#HaFs>&A*)f<^8Zp54J8@*Xosvu;*8p+|ZZyO!(~Ce?1u9@6p+X zwu9fFs5kXo>zDgkw~5hD|2`c1SOo(%6`A#mH?-LCTlc4*ty}Bt)ot&d=(fJYO@le> z(u(3OzlWTeaP}4Sb0)WAT#w;5F2=VVFnamo9dY%`E;`nqcw*-pNnyLsT6-teZYv1O znA}r`U0(BBnTylUfBk8CxAr9uws^qQYSfx{<Adyd!<+kIcr=<Q-=57z*_<UKMy`k* z@<zs_aX+8zJ#qfq1v6fH*j6#~zD3)yVQ&nR+v2#epxr}#6DQ_nj#>Lsr@UGhcg|R} z$NuG;Z7<n>n&BRUy=6>p<V%y=yp-U~cD?h+l8dnqJ|}J%He+p<#~v$99gtf4?kRuZ z9wB_2S%0fV@2G*_`+d0~r%&VeCQtp~S^s+*oA;03-~QLYc?;Hkor67)Os**8wFYO5 z3-{Drx2@d*cb{3OJ1<_dYwq)(x9`>D+nd)unT-43Om1J9F7E9{!|u9Z>%8Z~IjzI* zjha|z=zTvddpGNu`CXdFzK{KL!IbY0KORW$H|E-@F8e3z-hVvq?3-`ibM?qQ&7S^h z>8Q^?tkdKWd@qxm`^}LrmUkX-|IsF0C*<F38R~lC^sF1nkL{`WZpLS$;zkt<0(~jm ztp8)rxX0cbncB7R^0mZ!pSj%Xz@Zg)rS{wt7rXgQdpp11ag!@BgyeERZ@lWROS(^n zh%dZyZDYpU2WEVocP?SFuHx=7o5xN41%6{Rll$VgS*yRZ&wB6vk0Mqcx%zO2mzGYS zu=&QQZVN`WoOZp@bljL)$K=LX_HJ+wyf~v(qOrGdYHyvck^5ds*tu?t|9fYTZEUeH z5&O}wiNUPjb0)T+al+y)8=Ah>p!A(@X4RR0W!7r{lqCmNdfV=q`^zTmSz&Tb=Y=f{ zzWC_=wrK<2ADguHr>l!UNq@Rybk-jWdQ|>;^|b}q`^V&7&d)F2dVS%nG~EM-=l?Xa z`@N2rcemZtqt@Fa6S{6&*>yTz!G;@<X8pN8Z{!Vl>D}o=FFU3tJv4IIuD5jCw|6=^ zvBz867Y(11y9Ik)nB0xD2X-1~|8Qc*?>{C+&e`t#!`U|Gg~c0U+Pswf-nDtH;dl2i zxtuT86zre>`j_9Xzw*;tCtn?L_{^FWj_vn%yW-z|e8RUQ-oaOg(3jA@!|tB=@jXqR zc+h*L)7j{s%ddab>!*9Bj9c^7vB|alla`_XVoy2bJR^tRANYFnevc<C{UvqBePbUA zeLVD@tGTcIkhNv*=_Wru&2N30^(~+K*L=^{A#s7V8rSM|AahOIULRKa4agO}0lO|O zU0$y>?pLBOne|h~H)`sAZodCxGe4-6)w*=v$!_!aMFd4GUHIwB?Q>d=DaU>%CKtbJ zs3G>gr)O+#|Dx&1VI!k|99=TWf7HT}aa}*(++*ahvDp8?<SLImJ+tn;f3%H%<fMMt z)ts+RWbK-MVqR+d#cPW{e`LwBPS|S>n=$J@ANa&ghu<SVZ#H<gOdNf_bJ;`3`nGKF z<+sm`bT_R0_Bb}(-OuDM^)GsH&I!-0{+94A$vd1`8zbL+Yvt4DTjZR2pj&pQm9VR~ zm|Re}DQ}f`W!?8*{#V_-f4(rR@y1^}PfFf>HaK_0jAf>~n&7LNOz!9LQ`*j7RsY6` zxkEap)gQ6vLHqW5Ry{ehU!fTN@VC3~8-)ERxM_{~!LgY$dMr3pvFgme*)P4a|Gm;x z&EGZ#T<rPGGkqF2eYGyet*4pX+M$MPr330cIBjL~_4T?f*n50Zqf0qk*X?g~bI~Wy z4qlUsuP!n<<L);*4~{ba{zKe2Vb#5(K4|mWzh-s$Jui2dr`=uOJb&(U>;=Qb5%Zj& zPkQFR_r{@)rt#ii9__kx%i%7cKfUX|j!W*&A9<-(c?@>GGr5&zLQcAQ)se`K^LGf3 z?`~AO?XE5>_l#P%@41_^fB$&OGR%jV+%)_Brv}d3Usl%P$HPVM?%4WF-p$%~z5VIA z1;YzVKOVXOGwL2l)2zQ~X<l^ffiWSizKlBk(u!9*eU$mjmiC8Ue{0;v7baGWyPAUC zhfHqa#pmLNyd1sbkq-5)cn2T+u-(CyF?BvWT6U^*bzmd^!|)qNnB1qG((C^)Gvkjf zP4|pG*zCiEI)h*Sboja{b05F@=`-hg)?EWVV`^^JXMeUd=;1!WTgA7-Hl6w{G4iX- z*_I*0+I4C0<_~)&zCSw?`;?ems}EMRT-vMup2%8Xx18Ca$urM2T<u={;sc)gA6@>j zYwhu0V*bhGt}lD!@vK!(uZzk1$XN8mGwoAu<Qe^^&B&j$;N!((H$Qj-&yZlUZPrJB zxcJAdyMCKGBJP8`xAc1H%TebBg#>Th{>}L5hu2ihG(CrxHZ!?m^XOw!T5f;sV)62$ zab+(}IB_vyllQ{1zz=&=PVV&ChZsNp#pM2Q>%M<vUfzabr&gYNBC2!Vui;bcKeqG6 zkoQtO#e4QOc?<ghF_$&#H+*w!?Ok6#UgQ^1ATB-f$rJOAp4bz(V$IbLhb-wZpm_LR zOw*ZMvtb8!U0C~D`zhV++taQr*qnOkx7|AmtRJ1|b|dS|jYIIImj&#tg6!Y;(2cz~ zx3I)&Q@^~zu3y==SUl{Bz%~W{BvnsxPKmwH`p*)<6|e_4u}9}Riu3IGqw_okHVf_- z+~Gud>UTI%2cB_r6yM=Q-5zV9Jx572ANO6&J@NP)K1npWWBcZ#@52*tj!ABFKfA|0 zIw^59?j^7`PD*T(*e0n{Vro*G#L*?VbQ_J7thT&6ky0)$S&?E5NsU&Y`WtR{m*Cq- znVu4>-7y;P#7Z8G3)&)Vvhz$CJv@DM7FNsMqX%SyO-gN((y2{KO1q>^qh%YNnCrqr zbM_+Je>E4krSQL+KI{zF^mukScglY|tBL3)d2XdP<FM}J9^K7}w;JXCrw=g6I;TD0 ztn+F70^fG7B&*urooi})5%x#YYVUtFmr4ICxfK7KT>egvt-0^tIo-SOWO*gOfK8ON z=Ko)9P0zn6_np&@^M555+y6=~lmAz8`CrKd8%)OG0~PXQMfFL4xrfOXJE_Vr`&Yat zeZEfG_9;=9I$crAcIT|pQccN!rMS0u_LdTlqX3?`2F2dF!cYA#6+X{HuPIQ9{*N?* zZ#}YGv3DjlWiX{jI_bp+t+BBeuSU2tspol$99E0derHls%9`h4uQ^dtRqgmM_pvIY z!9QvlP5JT*v7M}@j`o)esBr>x%UP-Oohm8qGgcB+6?y0S6r7jEb%)9=U3Zb9^I@tq z9lS%9s<fTF?|QU*BHya5DCZw(Tq?P<BnMO8JKD#jl+kTlyGxu-+?u;HC6?#gcPKT_ z9c-*Tk9&&SV=KBdMN^tS&x1Sp|J|7(dm)QzvTA?(%YFg(YPIg*AEYFEnA=`V{pGT0 zQp|Nu$-X1?WxE2D2EPN<b+cR9N{WA_cl%DNFvQUdhw#46&ZF^-^}mu(wdqbCwrpT0 zj;gVLm>SB41eHpvYP)m(U0Dmk!##J(Br#^#9W|8tZ(AZwq3>*pEJ3^wm=*$+lK!LC z()b~(W=#G^Y36zI>Di|{Q@}hA>=jSuD5?E7%n4ffZ!fm+EE3z;i`DhDzoO+DyT5$B z_g50Cq5IQ*n7`NieM`mOz3}%Es-aZ&BD~aGY4(3u#ll=`p8fA>zJ{V<6OyIqj#U)S zk}pH!7RDv~W7`29c<&!!smnj**#hT5?4vxynFJH|<D@byRN_qZP7?OMqadNN#F^+_ z9qfa)K>|H>-j2n^^Udtp(jehGi9=lMpW%5lmN=6zTEWIDSOWH^;8q&S(oEt^!VCqQ ztzi2UjCQn843iLnJtjPEjKrCQu?l8Yu%!w{AH?Eu4=dOa1zV539xYi}Hc6aGD1_oT zMo+C0XA-(#FGVXRmnLy0fj;5Gu`3ET8G9daD;RZ~CUGXgfPD!Z3y?UIFby2tY6=p( z5@!-Vz&-+wZIL*WKp$-3SVM_32^k93Tfyj~EnIGdf)y$leZYl6O~L`(yQk-EgM@<; zXA+*leRYmKFL5Ser-FT@U|Vs&yf%wVyWNO034elX&oFvSkvNk;yQ#SxJ?zBg&MMeN z1xvtv+&V07Gl??^GZk!(f}I5i6GoXYN}NgPjV9$-e~B{*v|FzclUpxwCLsa$PC3?0 z;?Ta}pmh8@CC(%~1rACFwou|s!u#N$IA9-0oJrUV4vGVIK;lfo8E{Y%unQ7r5<+qB z6siFhDRCyDEjUyjSc=4%gonT(60lN<GYQMV;SbnKi8BeGgTrl6V7nv^_6H8Pn}N}t zTH;Iso}9;4YQmx=4)%xhJRv4#y3rB)`}cKvEUJ64R>It__Y?ltr+ro4S*cuUIjuQD z<s~G^ER85X;2!YE`~UQ4Q(RJ5C=@%2i!843xJGc<JoIIWVuuIM;o@;dJEkmjpG&}f zIyZ+PgZDSN_z66!$8IUK+Vk=RcS#YpThsndrwh~ET#w+iBLQ4~yO7eLB3r&ia9OOl zi&H3AoRFE!)4&_eJr*iM4pOE<xSjN<bD?9ZtvKICqWGvq9v*wk6?#DgU#7_Cq>t5s zC(Uy4@UM`WYqQ!53oU|MX3{OWC3sLXmy`5diwgzI<;03rD{KsJgKENq3p_vDWPGWl zNSIK9x?Az>z2cIh92*|B$S)SG4kYao@T@t@%u)o-jgLQYVV6C>0CmL%*WyB3p2TsG zJy2zLj~ASUC2o2XT9HL4z#Pj49pU*hhgHB=M%)F$RGZ5o&=*%clN^Gl0C%s1JVyz> zr-H{&vF&xT;6}BJ1slr=4`HHSjzZMOZ7af?4vC}o5qug5g~KLYY7SJj8{Tx4E@a?C z+C7C{_&8!8p)cNX)gSNC8z>AC1`9**2E9zYVQU!Ppm(1z0`JYcU%<xv-0?OKt5XhG zUQ`K{>z8Y{=h|JlB}D>0s{*ai<s4TFi)RsX@QytzK3t!Ncj^`3{kP-rsrf>@N3R&K zk8uhU1Q*^3;laB^CJK}A_Pi<hs5|9=CyJrT94MWgX>#-6#=K47jfMNgXj5u`T;aP4 zVLD_dxvbJtps&0_2j+*+5{Kj)n7n*$h{Let_GTI8<F<bx_T%$P(;1Ue!q^!vOr9Od z3s_yH_On{@vBo43G9KQ#R5bJyD;b9cy#Sw4$w7a^OGsI+EH!#xj#3Dp6P}M!Bz|fu zEVMh_b~okVDR7iXX2@Hb=>z$|Xe8@rO_NuMH_LLpu?5>=D3!XA+I_6}9E^=prHe9X zl=r2AlHz=etE8w9>*<0cANDyO{fYXKt%y~-TMxnEvgW}EnN9ZR7BWa8EU?Jp&MiU9 zphPS~vQxWI$VD6yL65fKQH^3~&Q09_Yg5!aT<`(;<Sx)pg`yGx3%OPsIVz!tr-0-N zEQNWjYoP$>Us-qz5N1_O-M|IK3s(C?JB%gA<rr@(CS$U~7ol%KaS&wvOcI3+PI4&O zx@`G)eu}jmPuYh2ityls-B~z=$5Ui;@%$5Snr>X@-FSasO7Es9wi|DjZcM@5cw?l? zitfQ<_Rz%ap~URLWA@=PeKazC6q!C;W*|>@5EmV!5gnw64&tJNxF|j;L+v??#~7xG zF-(aujK>(sWkxFa{XDLP<9I}n+yJXKoV;XDWc6f?tlAhHsPDpKbNjOKm^MvJgh(-I z)Idx-myw(dOWm%>*traLS5UeRF6z)Ehu4Nk$vL>FgNwR((Mx!Y5={*3@sMJa@EB9L z%oGKmDs=%iT)63;fY4jhQ8>a!3`e2W?U@26!%r2PQ3en$+>J&m&MKpbBFhkFU<w3N zMc1X#hBg$D!D~-xEKxE>n8G8P%F`I5oY7dLo?y&TPB8YUJdHuh85@g~GwT1!2^;6s z(o$A(H<KI(caMsQJW_ETSQI=*;mDIJCsu`1Jq7mY$UZ~iiWII`;WV9G!Q2X`=7IT4 z9=Uk<c%@A+8RBk9Z4(7bSFE2`f{*e_!oA3trPk)8J16O!WN^}hlb)RP;-ohxeK_gM zNk2~db25OFft(EDWH2W~I2p=GCMQ{(4C7=tC--qOf|HS)+|LP{WfZ}jJa}4<OfJvv z!8}QDl{oE|0wIffAeU5!W+^6`PB9HWMDPIadpOU13FkAU9>~wS(@@3Pbn;b_j6Cz> zr+7eF3Bnp19zJ5@6K@2ijRvtHjK>&C^Gw!x)44a|C$c5dNXijZm6>`0_xqg3_w3M1 zWS&jV<P%a+f!$@L0fjMcHoH?Sf%=+yf>e|f^fi^IzNVb9w3RdJYsv}rcBO*ITj7zt z%2O9q&Zq?H2}+=xpad#UB~Z>-36wJ`fpS7!Q#s*|PC4cMTsdWqK{?|?BG)n>J0)Iq z#}dGtw#3VRSURPFMPjASBaf;a<)f#>GgmJ0RWnfrTprFxREgKb(~Q4Tpl^XNGvPQN zi#gB7T#45trWv87Kut}RAzKQPs>f$n9OEOi#B0*kjN?+EZz1_m&V$&biL=Vk&QB8) zvEwo^QQ$O5qRA3X5xUb?BZcnh+xT&e$M*&4I%oj86Rrk^+VV^2nrWy5^E!Ouu*jZ6 zg1_U!)F}9gL1Ls>M{Fv#7Tbx}bbZAvF<UGUi$u3LRV)=}i}S?!;v(?{ajE#4xJrCS zTrYkgej<J;?hy}&hsAR7lz3V^E1nlGik0FO@tSx;{8hXq{vqPUc{+p6s0+}Ubiuk% zUAQh%7p;rc#p`P8>gt;5l675m{dD{FV|6(?t1eGhpc|(v)D`QTI+xC)o2Z+to2r|p zdsyeyP1nuT&C<=$&DG7*J*k_oTcBH{ds+9Y?rmMRpVRLlzgd2J{7(7RHl`cL8v7cD z8;gwjMvw6!;|s=_#`(rqj2|0U8P^+k7{4-B821~0F<vzOVXWit=O5wUOMk(zUAI$L zuA89G*UvG;`gQkv+wg<l-w-F<YsfN~h3$ssSQR{^d&7{1Yqa6Q1A;~9W_ZAWYbV3Q zhR^kzbW06R;b+}seE%a%|EhkSey(8mo9K7bZ<OItLz=#WL8o7&AFk^v{%lwxH1|(7 zeycmDtEX?N@2tN^KTtnHKUqIp|Dit9?+L&De$V?Y_j|){o!=I}FZ{mqJM6bysPywU zh8h!$#fD$>r}Y>0*Y&^a!woTpdWIH;B*Os1B!ghQZtP-A@h>-QG~DIa(%8uVYr{1| zL%)`O3k@c}RKJf5`wh1YtMT6O4Z;?@-TGVMkWeO^5-teWe3mADuVM>b#s6(v7_R## zwy;S@E%~kPknU%+=Q-UqolYO7mo=TH@5Qv8ub;p)zKFHehx*U;`}IHQRo(g<RPA;! z+-v9t9cLLvp~c4=ilOa?(W-L{3k^#RZy4T&#y>J_H+&5Z|7<8XT!7whLFci44gJs( z(0zBbX{KMcpB;8Oky+{!K5e{*wel&yO4y5Fq?WFYwr*)mMvJC1TOJErE@IY9w)_ID znQZxEX3b>F6|m;(uxGO7I{uCPoBOBuclPh;Kf*uXf1>}R{`37`^?%?0GynbmNBqzF z-|#mEL<N`wS_O0t=p8UDAU9xAz^s5p0WSxv3V1)@lYlP+_6PhFa5CUhz;6M5fnkBQ z0_z5v0}}$<2lfdZ8CVeL4xAcT8aOBLslaCgUkZFJ@Xf$?13w7d8u&%vp1|({4+kC# zJRNu`@J8UDfksn^DcV%W)X3D_)WOuv)Z3J4$~8Gn(@b+ri%hSY-ZpJAePP;f`q^~O zbkn2{3J+=&)GDY`P>-OYL8F3fL9U=jg60J+4thOkebBa`Jwb<pP6S;E5`#m7YX>(A zZXcW;JUBQzxHx!P@SNa9!7GB-1#b=B9lSrdEcjgT&0teVt&k=mNg>@shJ@T7k{99% zc{t>$kR>5+guEN_amcQa??X<8Tno{KhJ@A)O$cojni|?Aw0mf;(Eg!ALq~>MLi1^% z^B*2?fPx+?kZ4%EA3Ol>O*dg}G8pTsp;$A;%Q5lnbrja;W3b{Ghn2%xSTC-FmEC$+ z#cUv$@iN0kc%M%K-uc`VU%zQ4G{+r=mRNOfEwmBZ;ticiLNYv4D(*_O7di+X@gB_1 zcrR%eywmeuyoWyRZ>=+p5=P^D3=atOp4NYUjD@ef{hAZKw3x3t(Yr`}*PR66L1aHo zcnDu>ctr3DrNVUjP6K@GqxhYLZ!^rH?=t*{V=lrUS7hel%MDM`R~wXLzQjGv=mKFO zzTNPQ68cXWQ79KqAd!>swH3l?;f!!rI47K!+CLZm_ag39RpQy3E5cRy;_Jc<*8Vqz zUxnX<TZs9)@Q3gx9)cHXAsL5`QN3so{X`?<{lx&0-fwLZX%!FML&O{Tg-|g}3>PCX zu1AT{VvHCo#)<J_EwMJn`MP2~vA)<qG>Z+zMq*<zL2QDt|1Pna*j#KOwiH`o9?(W? z%TnjL{{7!XF-c5jDW!<1m|e6NJK(G%LprhF&f?vSb`kFp?`0f)A7cq#3EEXm6T6As z#dI-4?7>2Miq8tK;j0+E#NJ{bj7|N-{^9^}pg2ezEDjNeikX<X3=@Zo_lYCKk>dU0 zC~>qnMtlIXnX#fp%n@@%t7sGR#C*(d?BY0ayjX}?PO<0^o#F)1h53$0ED<M)lf=p5 z6wH0lwZ`dI>bn{a8y^aM$`lv$SnwC2*TU`#uZZ|DvLI?iY;l}9u2=kkIxp7i)8M*! zy!q#b9U8sR_)uq4+SJ~g2N#Vf7;{g~s&S*REA!mc^^g2H`?aTLKJ(qng|E0*t=YJ6 z#}~V5ef9d@Z@(S#uiD+7LT8<a0eTx6ZlPEq{-*QC1gVp5sBRRdKXY_1^q3)hjt_~v zEUYX$cJ+$QE8aR+cC7M3u~$5L`CQrALhtnxETB}_CVU_vWk)N^ui0jaI^jFvC)nU+ zyy4iNN3Z|Rv740@XU|sTdJTJzU$}C#{OpBE-ufF(R+e3}dF!t|b>YI9vZEJ>fA>no z+2f$=a}BT{Gc@y98O!+VippFa%%=5On>S&@)pIA#mQS9A7jt(<(+q>+?cxL}v)9xd z-jZ^7U6aEqsk}#}oZdhMORs$?mP+_~rKsUny|_eNA%1)GEKf%#RFqeiU#@V^z?;C| z7q^OEs`c6@Yv^Ywo#PigI`N=*M5^pEIs6Dqt5n!3UX~<}XiE30U8f7t)hbsLK5+h8 zdF7Sz<4nC?o$l<#Q<hTw)4HT97tUXBd-b!5beP%plG;ZAc==-4F`M_#h8Ip=IA1>A zD;g>*&gah%c3{fu)J>LJ^jE1|f>eldiCUOiN`>vZ1rl=X=FzgsbLHnN%8I>yN!=e4 zy6d*+KG*%C*XvFCSbZaX8-4p@6_v-RVK!2&b$fLGDm!+p{Jh6oUngZ_u<3Otb(Ok5 z)QUx%SCdV?V)5!1Ko2Nx>Dh|&<x(``Iki5GU|&)xuU(PKmUHF8#iL~|uQ)yZF(F+) zO#g^}n|`1Eh~Z7cX2VXy0gGNgMqi+Js5#xs4cZ8!D!sN#KZz%F?P{(b^WrD<Z*pr3 zE<X-?wM-Yj&@a(1mkcXF%Jd|eqW(SoCaUo!Zi-$p097v)P5LjTs*5I;Mwt|8Q-J{! z>T8Bq3@ggi()6(z4F*HJp|K&~;5N)DJ9_3++2x9|^Qx9MtL$A?ouRp5SovkB_ISBV zXJ~KeTSJVG)fgMNy<S$4E2q@V(~;Skvdg~t?IvrhI97J{@|DU9XEb)W$?ny!WDPVM zjm>I(LsH%~O)E9Npk^>cs(Wt6lR}2!mY>Nl!EdbJ6u;N~-u64`cf}|egN=2KiN;R% zmx`DCbjP^vKeOok!u{%~$)ujBM1kOZ9?LcOwef4`cdy?_E*i?4$y-01n#8ZCUq5P+ z4|w4u6N;?7Q0DQ9;bfV91%B`n+%ip4c(6_HSL!#<?^#tz(G|xoT)YBrr9Xf6ilwxX z(eLGxmF4J4`bFGC=h}6C@A(~)oWZr-exLg7^4qtKnbx(hzF=<c+SgL;SDh?7cdkrI z;P7dUN_84b57p=};ldSGO3BKvU3cq@jf~CDmR&ADMYsdD%9j85)EQzWX7BxsPDz0~ zY&zo*qpb$hIHK0k@06w>VLcWIJ&Y@i8;zg%kMw`ue}(@>|NQ~}0SN&Q1gs9&60kSm zMqsPJqChw638li9#x+vqD!5w`qjUX?yN&ydM~r9v2l2+K&F!BH)UT^Cymr)D#w*5~ z)LI|%4m4ZX<sa@J?{D^RiA##E{%~kC^3?xWYNmMAtA8$e^{pDe`KeT%(~?*JO!49d ztKQ$@Ki>Zl#fuvxFJ3C__Lutq^)nYd)5Tc-IsQ+}-8WXsc+&}0X$g|=-svyb|5Sm_ ze~bT4)mS^IW7&sxz5kE?C;YFTJcYh=4i?-n-`ANNFI=fOQBi(e&B0oz3kV5_SAjZk zdgrCs<BIgSl<FOj$(;RkF*2ZIK$@hdSV<|-YSg-_?`%?R2q*|}2h0w5K@G2WTyiCq zD)wrAsn|E*39WIwMru|izHsOQ)&y*n#+LYt<>;96FJ7)V3x}$ICSa#DEX{H00=^F@ zQ{$OYk;=>E)>84wfO9I`+HDBb1%?DR3~Zu;4QnXb8?gP=-1coAePC+fz`)U#>H6ma zy9D-BhNq5F?vE9e3VQ>yB%`=UbBfaXn*(i9o7TQs>A<U6el3_TZVa3jI8*94=V^qY zGJ3^LJ?98L1D6NB6}TzzK;VyoH%taom^{jT1Y4BdNPU|w@Z-Q;8tWdec#q@UTRd&o z1(pS#M-;^<UC4)9gjLh;n_jqDDZ#l?(erxE6MC6aO!t_^o7|?grfsILgYF7S4eAzj zf6(|(FJHP^R%!F5%(m!FJxu*g5Aeb5%DHoxA}lmzmC2rS(fN}VWwKK{E%n*@xdzii zrkSQEOv`zXJt4VMu@QAp(=(<QsDo~nN4UBd;K$_d(TELqX457aFl+otRDs^~o#|*$ z!?NRQ&**N`n@*el3<^J2as2q%a$l=jRCTynaP{JqtCgC8a6TJ*7FL{7Q%uo1Q+<&x zs8`S+J`bvIR&D<-a>u3D_5{f~9qZNwO$aI_TPnStA2gM<l5Po&cbMuP?>$fG9ke3o z<Dk!j_6A4b>VH6RNpNZKOStOavTjp5eb5@L5q$7oinqx(>+$o(`$^s=Z@&BP+Ko7Q zWv|>MyDj>lgF$D5g&N%Osv6Au-OA&aD^6<a+agC792Z=dCO1vVE+x}#k*f=C6Wl=_ z_?l5m1$Pb3pqAPqw^V{v7n~V9M)Gss`b{zR1zUrQWTR~)C6=HuzGe<x@a*6Ps&>;b z>Po}lDajfOuAV<xR(bW@*|Mvi(re!Yzt8b&H-43?J-^Qap-=FI;NOD(3<(OUhgFdW zLf*&v$B~fAkUv5bLx+dvhQ1#9QRvs()XvbhuUAa|PCaiUjWS<{#7Oy`lPtDXu0Eu7 zNNPwHx7Tl|@*!P9x>4mn=9MoM_Js78qMcXzo6)MrvWzoii82TTC{y`wLcAe!LKaGX zw2fMh<5DsgXlzIfc`f8^+13*!{q3^pLOu%FO{LRV|MzMVF()d^&Rn_b@-~c+hK{d7 zPD{z2r5+$%_UyFlLye&kp=LE|yzfw9x_s(F<rOu!R*^2WeP};s?xkXj&@?sZsA~Jo zF>6<x<J}H@==jiyp%1H~qU6TgT(Qj1KOg#7=)%yK6{qp+aoK?MZ%BT1u3H!SR_J@& z4cnz2^Bliq5SxYWko3~(*HaZ&E?ab=2SbmknR$+L?Q2vuvF|LQZ<sMGGOT%6yRh`I zL7KU7H@MqeU09tkGd1rgvTdhoq6eHR*ErsO8f$JLDS2GKc|yN1ci2N=v%@39yM^}; z9~b^q_>1AI!q<oIRs83pyJh?R+TtJfT-fTcPr~+x9Su7bhHIb8r_Nx)tC-R<lxa=a z`)qQOsGzlL=+ZCvy14BZFXAHSg{qG3<=aiTU(7Xx*9~tR-YPtmoBJu*J-3&xwzg^= za(i`xlx)+54-J1nqna$uwN}>xeYh+9;qb>a<581xrLUi0es;0ewFYbEsi_(zx4eKV z>B6^!?^M;}l_t7ByLI8;haas_LyEc8jPE}eJEg@4zlgwydJ)+Xk47wvSP`)<Vhg;$ z7yZ50KC$Q`!Xje%NY?4x(c@6sl3W8`Fx)1hL&Q+7ihE>L+)XwT(KUkkzirG$Zb(Mh zMXQ~=F<ea-yGGa}TyiJw%H&Gxw~v@6U7OeMSaDsWs4nA5#hnq)YwRshqlnHLMYMA3 zBDO~ypb2`Z*e&8KZhY5n@){QocuW`&aVg@r$oR;Hk)0!ZMP^2hinJ=$H>)fc_o^as zp@K`&y^$u#bk{HwyH}ocd`cHEk<BBMWhb5{)w6rKrpy_dQni*6Dx!guCN(dXc=az1 zd_ou)IV*B*<bucpk>?_BMCqeqq8diEj_MrMJt_;0u#0;_F+JB1`C{bq$hRWD;7ac$ zE4>FPJ#u~I2h=gQ`zXDyR_Q%hkq<|f%SFzRirkZW#@X@{xGsAM7yHtjrvUoi9Tlk2 zw@IV#-kO@Vxo}-|YdxiE7E3D^-$u#){}Sr^(x4}VK~WQ<W=1_5wL5xX^y27`ViIF| z#C#X?OUxg!?Ru1oL!+ii?e(iP@a&IzQcCl3jxOrOsL#qOE6c6AsMn*`spfo2@{XE| z>(dwqFoPJFYl!+T>TuMV=nSs7Z_CeL!L{OXer+NyCG|yJj=DkW`;7awS;B$nkm#6b zb9A%l)aWkKV5C_rJ1EWX_i09r15zokNEbcdEAFViRUbV(x+wa|qlLQYG0`@uNeA;p zbitBipDuhK{b2MgwNfXf6t5|ZbYJD`qF;`F11m{qBrW~M=2ODH==UVy$^t|5j_AG7 z2Vxqjtun00+pwua7kw!DxH8J^sVsg}To!#f`nMQkOlVAPsg{RS&vjI)<zY=Nf0k-@ zL^JvDii7Q?;;S+3eFw?VB16oenDH^2VqnDRPSeHyF{5H~rF@1;i4QJ6X_?uuY0Q+E znKAQXUQ}y8R`Ok|D=%C<uem6j>e0o#8ndqA%GnF5@HC9FSblq|f-)-AFOB(B8YAba z!*5%~w#PbjG37Bg*l=4ao{qufpD(DMWfxGh-1=B!Y{S@Q<U*zk2V)~*Ye{YPhot2j z+?hDovWy(&(Z${!+fyyn!*r!HL-;N>Gj>#Lo>cGt$~azspp@9v!E=PcvD0Jc#x9Iq z8oNLCSnRbpog|(mdz>Ab%bejheeBBEcVjh+OAR#ROW&I2^sg7_Vt<JJ3F}6$voYm0 zd#Qd|Y{m6T)k-ooojTF2iwlUW1))`Op=y<!yxz_sGlU^=E#gw*y2|DIToXA-s@Q~~ zbA_RC*>RKNUXS}B?nK<hxU2C|@eSfzT6A%?IH#I(e?Guu<r?Bj<L1OY9rrx%t0QD5 zH(VNIztDQL;Z|MTTX7qdS!6hTa@>}<&t(TULK;)<kJ~GcDWkPhl)=h;u<j{`SN}>y zu`cdbyx&P)`fImnE}$&+Mryp@1Dd)fGwIUnuK0Ep-2Sbly3+XWm#<zdudKM>^6EBZ zJ}zX&=hu#?-J$k|+CSC)wN6$Yd!3Rxv+F$7(->b8|84xGS_5iLs`XQ1VEkk8PscwW z|4RJo_;v9g#BYoLa^2dsYZJXqg5Tvd`aMp=*K->GKBrwaaN24kr>UDbt@{C|2}%0+ zAL7g6D{xBb2~xT`Dcq7A_<z_s&VZ(_Zn#Nswc5H-_6jl+_7d4sK$a*V5+IPUWhkJ+ z3rj>qwu+;+);em3t5$1UJJb%X*3nj5+ag4uvSc}Hzw^e;OZ5BE8s59-j&tul`<$o6 z*Lq!Rj+Ty=iI$a?gVtg#Kc;Om({?#ChZtrKDa;%qm^s8Ub6Ca9A%U4gyd6&~R%^9Z zx>hdJB9UpanrRWo%p%%;s@7JmHmyBc2edxWI;Hiw)&;FATDO>a$e4MgG4n`b=CO>K zM;0@WbY>JOGfFBmii8<ur2}89PwS!9lLZ<JrZ9c4VET?^`i^4y&Sd(|5Tgb27Fd$U zRIU-XKwsrDrVb4EF{JA66#fFA1<4CC7ql!mOrGEhjid!(3*uB-r!j}?UwpC?dmo7_ zG`1}$T0pSZ?6+6h*&UKkE!eeSAIYb_!}526%6&j!l`BLGzF2SxUw|a$0wgc^S!D`R z30ly#U`T~vgtAtxG%0_f=0d}T!i8=N1I1|JYYXSG*EE2gp;=e2ip08zm00hoK0gZv z0<5<7%h1BOg-JaFAVThc%t#p$m78QYbbm};>$YU*NWoZNkJ4y+CweO<dg0lHUoO0$ zJxN<%J4w4m`<V9U+TUwW=xFL#cY>JlF6D(tOW`fNy6~5Ue=U4UQ<GGT^JEg23wsv! zleqj|O=QYbL8wMDiBRns+Ve3&GZ>L6OTyDO*LKhj(vD<NV)%cwj-%LGC>tA95v5K_ zx!O|g9PL^K>1x@Li?j>1OGtOi(UBZE=TB{dS@;VubTgPrmLct(+VA$mAQTOrc%dpC zhpSMh92K0}L)TZe@333wGAQ9{cWM8lJ$%296pzl0_7xKvRb!8G35|mz3gBnp%X<tA zA13o*0as_b&H^2Q%FInwjgix6Zcw-m>DcRdD*Banw9Fx9*5a53PK=IBXT46P&P826 z-B{g=y1(e&)0?BGtJk2{ruRF==H#3^It9#<pEA~ktQ4-!7M*6DbM)TbAh%4XL+34W z%YLAbe+B1voufJ@nLSy{bnr|mcNwK}b$-%O=(>U2rE^Q?F2kqu7`baUBX`ws{?K`* z%hjExYp83kYsa+umFYG=1?j%2JD;A#ZDrrXbSE0WW6|LjGyHR<u+~jAk#lbAhBNP; zNRjR;-S=~mZi;TUQV_dO3SuAWZqTjL-KM);7dyCm;mR^|U<T9uM@10pX9Tf96+uj{ zk*E6^dmzEnsK&zPsu+%ovypDE-c&{~%g`Ou{f`A4WM!06R(^88F3fz|z+BBepeNFE z(2LV6(W?;=-0Nbb=cX3{G?FqWjy@T<Hw3;~%2jg%+dhxsuI1eK_0q}psI|MPe3Atn zGBR8P=`tlWatgS5d-RU#olv*EOs5ZF(b!05Ur%o#()&{H2X-kRzO3PYOyR9UL#o%K zH^c~8#SEScm)CNZ>rd04t*@u=uJ5BCt{<<Tf(4u(+5IS!Abk^kAv?-U6%8nizC6cO zZlR-!8!nJJ3u~GE+YnpBiPc}PU#Z`r|F!-P`oA!9s(^7*kbb>>6M5n<V}f6piuCvC zAHlXD-726^`p5LoVhUBmETxtauL+fDI59)7TT#PVp+Bhq$Y7>{o`I2p4PN3E==@)U zNy^UaS<8Bzs^GL3q{zK09Xm4}7q8sHS!obqP-w8l;B$j+gMNd54b2Sg4c!fW#mFGm zKuYmX&Rv5f2H;;68(K28V1tbY736|{!V6xTiVT_z4lr|)YZM#oVSxXGr5hYIIE9zq zz$|?Xys-w~8eCJcc36zR%1|FO7#bn>ORjOkV4N}kO~|;0e8V>kRh*uF>{d@wCA*O- zNN{1MRl;oS<M9Gy7-G2QUSB#gj517QyU6H!#nY74-#0eaFF}SI3^%b2(_U>TjjQFv z8GdMZ(Qwpgx>1DD2S#U%E{KugNy9H$BJW6x(<Ld$@Ur1ul61*6HX1S%YT`fgU>Pb5 z{~_^wmBF)aBk;NkjrE5A8fh{J)mYCUv{}M6nrmcWw3MCMyi{Z)Fmip>WwnFeC>1^Y zPm;y8_eyw12}bEg>x?ScdAh!2t5q>W&xHYMjdr~{K>I5L{Gr18T2(g0wE!9YXau1k zWQa^DV;(&v-pdgiFEH&8@C3esD#5pAJTqUjGP5rh`7gR{zS(@h;!V+ck;0Z^+i5q+ zKFR)&!+M7*N51pxE?gH|m+xJE71aqejBSncjXR9*m@F`fGwCq7W4gdJPFN=}Fb*~j zGmbP~ZX9QvXq;@EW}IQ1BP0ZgB0?axB?QTKgdoM95TrT~f;Suqfy9Xrq&X9UbQi)j zNmOIH(73|5#<<S7!MNGDT}YTpM1*OYEn%7h?WRDx$u5Lol5L%-uJLi>PmIqRe_{N! z@kQewjDIq|Zv2aoFisK?#xRaCjAIPr7{fTm5=X)~&51BhcP5ObE`+hnu1@fp@rdz+ z@l)d$Cdfq7WU9$@lbI%SVV-MYp6g(q#W2qjm}e=>b3M#+1B|~B#xH~M%kAp~ubbGK zIGVVcc$j#b_?rZqgqcK|EC+Z3;N<{c0q~UoUj^{h0AB;}n*hER;5R$e38tImo2)e{ zH7PTxFsU)AGifksHi7jD>HvNVz}Ex(R)B8+_-z2+2=Gk+-wg0Aj&*_=CdW-aF*$4U zg~`_@7fpUJ`N`zE39MhxDk2P;0e-(7VbE$%7_<TWPJrJ9@Vfzi55VtrsuR3vGGa1e z^3>#oDKgbGooYJWbfzh}{<mQKeE|P9jQ<Xd|1Q8E0QmO+{vf~~0{Fwub%L3uwx*7z zuBINQ-lqPh!KPuRk*4JO-v{^)0RAI@KMwFG0R9xfe+uwt0sb?9Kj%^>m}Q!8y4JMR zw9K@^w8pf~w86C5lwAMk0RIKRcL4kmfd2&G&j9=mfIkWFrvd(`ZJhv_9yk5lwA-}T zwBK~tbj<Xz>2m=`xJfYE^jp*KOfQ>WGrej0o9Q3W<A>1WG3b#CJuZVDBcaC}=rIqT z&w=N2;rTpxJ|CWI!Se+$(n1(X8%8pOlfn~d3-krX0yBZ7Kq#;mI1Ahbp3tumz#9X+ z3Ba2Iyug7l<pca8fHwzt3xKz@uQQ!4NDw3mQUy{$mLN}1C@2<e5D)-w1@P7YZv*f` zfEU5|wg7Jj@b&=j0Pv1*QZxm-1^Wc=3JwX53O*K`6nrW;CpZuAP5|!=@Gb!F3h-_K z?+);b0p0`PmjJvcoD?0wAA-LH-GW|0zhGD}CU`7(ZpHz4FM#(3cprfG1$aMz_Xqd@ zfDZ)tAb<~slcH;;ZKiK#Y-VO=X(lwYH*+>~HzU^{0$#?e03Qlo#(e-E4)76<gvoIy z!sMJYVR8}RmpgA3=$XZtC7LChrI}@z<(TE0tu-qJ$X@|+1&q8BAmacs7e-zKBj>}& z1pq09Goo+SZq{M8*X$j$_sou%eQ0*v>=U!IFtQA0o(1sP0G|QynE+o1@I?S05AX>9 zze+sG>?gC|%>FXFZ}#7!8H*O&Q-G(iUq(!+p%??Fvs*DCCZ=fi6d|(#vx$E?M>@x3 z#MGLRf$;~u@I!N;6Qrr0as0Q($T)V%a3_WyDf&T8%i%6EUu3_?P1*Msbf+FY<G8;s zl6i}kEh<@5v8bLT^nIOUeM32D(dtFud>DDavVqm4)<;9<;h9zs4G#?r-OnXN3rIU| zjRtqoTZ;}ZI=<-hMHd$R%*aR|u?&e+a2a-Wnqln6NLiBM=_eSbd@6;vsB6(b<}T*t zv_$_C$qW~bEP6yT!)r7%tmfP^pK3nST*utRT*M4@fbIVSrvHN~{U2ufe;*74)tr;& zLFUos67wwcB63cTx(1R7?z|La9%sIq{HZZS{hwZPG&C3(N+r-$5O)<+Q!k~OAx!0) zx0%0X{(<=k^IJ+omqvHz19o@TP@BnTB%}&XxA|A*ms!l*z#7V5ATOE!VcyN4>23VH z6Ks_C%^#WnX8{o+q?<$I-v>h@3W$&qEyHcP?)S+wEetFitR}3UTTc_^3Xz4t!usRm zA3GEJb3Q$DQbg##drZi+@UU8L1%@n(NQ*R!cP;K&>RTpS?zX&RHDAQFh_gtvNOmH4 zZ#WaYH(dzcOxvjz8!QNmDvMf+dW%MjR*M}LyDjz!3EnIb!JBPM@aEVNJPmt-H`jsS z&2uDp^8s25pcer2Lc6IJXDz<4_}b#4#Sa!gSzNdH#o~^|p8%~5&^iFE3($H1tq;%! z0Bs1+MgVOL&?fd%EgoAux8zvzEGJvOX8DHYY|HtU+5l||&;o!q1L#EnZ4S^D0Bs4- zRsd}c&^8WJEgdagEj=u~E&VNnEyFA$Etgxy0dylkBY*~q%i{qwAD}e>dJ;fS2IwgO zJ=JllWuaxU<pxW_vdXg7vfi@Mvej}2Ku-hc*8qCD9Wn8(Juz_spoIV}0%%)+wgYH; zr>U05EkCh5Yx#xc*OnJ8f3W<?^13DPKb`|XM*y@VjO_$tI|H-}K)V988$i1Q^kV0! zmcy1~mX9r;TXC#-R+Ft>vwFj7Hb8p-^b&yf1ZXdS_6BGlfc6DwKY;cJ=m3|gR@PRw zR*qJ#RvuQ~R{mDOR$*3=038U>K>!^L&>;Z56re)^It-x00lEpGBSk!`B&)qv`>j3~ zPPJNVRccjcRbf?QRcF;;)oj&n)dBrPK|j&ZPYm?49QuicepWy~E1{n_=qDcfNjL@# z6YY6cA6Ol;I%RbRn#_PE<k12W$}4o?TYYbJ#p-9PTUNJiiHVEQ)oSP}1=<xryCP>~ z)n)b24q5eC4Ty+|OVH-Klknp9@iQ)j{`3<<WX-jnBqa1_z^Q)yl+z?@ZR=#4{WinG z3nD|2%nn%_S__?#wVAc0h|tV%CNy7jnQZNC?Qb1y9cCSAz1%v^I?<NUOtK?1#rA|| zvIC)+;z($wIuV)@Xr1OlXr|jwvd*_|w!UUF-NxD`&1SEVZ(U|xVO?WgXWbwqG^Nn9 z4B!_6j2^T%5KXl{WPQ~7W9yUFpIV=@K5zZ4^>@~np`{_TG=kBLp|uH&W(uPTU^Fv; zTm++;1GI(hRO|cJ|5y)Nk62GwKec{ggKRWyrUEp%0xN*F251|A76P;gplt!#4xsG; z+QE)*v%p5z#?Z#p#vEWA0mcbnoB_rKU|j8|*m&Fc+XUN$*+kkbw~4b!v`L0`p3u$< z+Id4eA86+befvS*{?KnA^c&<b#irDz%%;Mo#-`4u!KT@!-3HEpW-!2o0Nhf53kA3^ zfC~q>WiY1*fQ>v2jRG9FHt*Z~X!AhGw>fR|na!6r-`HG&hVMedGH6%>4R^pGABp%j zzuNq6^OsGRO%HTj0v*>v$4$`jS$Kc_1pK(=I0^DA`NFBf8A1nPf$-P~M?(L|Ne6=e z#VKck|Ba)jP)BGWG!ZTmS_wt=1pgYm`q`1-Uw0z-H=xB$7lMDwX{s<p7%q$w#tP$w ztA#1TbYZ42S4i-G5fOY~`uyMQ2>xw=z5~#|1N0vNeHWnr1n9q<rwTU<w+fqtZNi<x zJ;Jwz2ZV=(9{}{<0Nn}D_W-&Jpt}KD0nqmWx(A?p0lLqHD?B6oT=*5V|Hqzq21M(b zg%eMBRd`qUP&gq(!dt@ILgHBnJl7L(g$iMxZ~*!khCUubA0x-@h-VHilSG=LsiNtk znWDL(1tOrI{F5-?DH!k*X#5#8{uCO69LoRLnJY3EEf>WLCy87|9wKj%zbIG~CIVW( zKMoTHsgn;;S^Td7{wshz1F+{#0O05LNF)}4YQz5$nw&p#+=W2r9J!)(qT`}7BA!St zY7%W19koTGO`>{`dJXuWx)27lPMoqO4CbD4;)?c(-W46PBlIop34JRELf`t6PvF;U zCyspryPkdW%n2s~eV&d)7e!a7&|l8qMM!i*^aqwos<BkVmm<*v(Rd$7I-P@JLg>wk z3;Si0Y~Qe51m75Ow~eut*q%y8wsURuuyE3-6i#$$9{z@kh4dCkRkl91OYwM(csz&| zR+Fj%bNIGvY)frxZFkrn1QF~W#5ilZ-0vIg>}URZ@k8HW-&h~}_m2Z$!e;-xtY+R* z5zTBb*j}~$MJbwnN6#{l70tfOM7BM)|8<T*%=w^LE_}y!w70YW{-eI`F)8ui8ixIc zXL0Rj*az4zlOVe}_TFi={A+fL>}>74?85C1*?nSfVsD4%E$Hs-QH=KXDnQa(M?4d% zEu%q->|*Tpbq+igBfCVqa!M#ec2c`F7~Dv$eHA65AiK?W5CKQy#YC+^Ej<kXT7M^C z1P>ZM0NsCX*V*0O$&B!W-3{D<p;`wO4@SpF#5}tpyT|sL_H%KgAhkxrFJXUF9s6U$ zfIj7ltsi#6{*L0g*bGYv1BZSE#Dr!MhD)h5kz@8N7>nl7Y@U6FeZKuh`?na+vj%Ht z^#aG?Xy;&R1;^BWi~V*Li-sm+Vlu_j_}4i+`{VYXJ2*Lb-BX@P!*rhgCHw34e>>Q) z4~-$cVDLfjIHVlNi0N_tl1f8;`v(sC4uX3lom~$Ug~<Mq!!$AqL@u1{z#$J7g!yL? zFP4muR#mxhio+cCp(hnCVzh{QM;MutMpg(huoxOs^eg(n-m|F)IRrRFb$5=9G0H~d z=tSp;nCr0GLFSOBJed{r$wchQtiV=gejeAM-r-$`uf@or*<o+z*brVdX9U8Wjdu@` zqYn2<ki#(t@Dkvpm^ez9K9`3azH_(&QvKuqMsktEO@}`^yLuG`gyFJc<Z#bng4!9m zVW30*&<J>`dL)ElB>W2tc*1O&Up~)qhNHQowPSpzLW~^eIT|RiVBCOzY)v7IX3CJG zy`wh-mXmjgGFIz$45n9b6pkT|5FSp+)Xx~PTVrHs-DJmH$F+`+oLrnTo!)Ue<IKA^ z1lP`>HI?gF=6JyICWIaE9P1pL9CtYG>mGUpq3T@}!VUhW5pHmAJdZHwyqCpyJnneL z@x0?D$E$P~H|gd#=;qg$=GV#QKSM{A1}%<%JN7sZ(eHOM?{_?c2tf&9&?iNX|2hd3 zovA#hDNeJTbeznfzd;J27XW08`t>ylMgRO}e3*LlE#UB}qL_HxLv~zg(CFmv6zi1I zeJ@LHaLp-<vcW_DSBBsSF=Jk2#sqx9`KmH#c3SVW$!VKY2gD`f_E&oqof9Qsv?1Z> zDSyj=^^SEWBc~%y$LPo1Os|UZyefkxr;ASaoW`7<ry{4zPQT^I4ceTp-y4Mq9D>zA z3?cc8gp(VzJ3Sb>Pvh(Y)5UgXgdXy^lWV$Pz<1VimN+*%E1ZW?kh7k1RG$nvn>sHh z?dIdza!#VNNadD#P`aR;Q|26?@-%UzZ@5s7BAgSL05B9uS|*Wmj&n(`k_UM`P?F@g zooiG`ayrB;^%WrJ-Oinvl^k>D_ng0WzAZ-1N1f01lX@ejVA%}4%+5y6-#P!(3Fpdi z9!p!8aJCoXY(n3AoQY7F=zB6SJO(ytNHkKOexJfBj;G5Em$@#6F6LAkAg4=ZIr=my zdXY&-v!P{0nl7F$D_xRYN?f+O>`6v0{x0E|U$!b~lRkalX9JIPNq5P^JhBz@$l3h> zGuBJm2b478*O&O_Qq~0F@`1}~7f4EB%o~^K-j}k}<njdM`gHa(G-z=Na=Gi$r;<S@ z?#rp*-*Xvp)##+qh{?A;^Mijcxsj9XYVCT;^}Or%uJ_!hxd*v7djxt!dz5=@@@Vp$ z;RyyY@g!Fd*Fe`K*K}9Hb%*PI<%EuQJs73p5IG61(JI(;rzdI&XmHJOU5C+d6r;gX zid<`48<oc*Z;YnfOYrd^gxB)roDHsrRXR;zsXZTibigc9h+Kbmy@Q=3T!swsC7Q0o zZhSXww<B(++`b~&=xE>LF$Dz2^$r3VFCa{_Qjps;x0#*ea9<1^lqLz0l<#KdCURTi zw#sb>K6YkmjI&XO-2B|4)n%6^EN7JrNRV5q+Zt6#rdcrnFePraYB0~=8Xf8fk_>qZ zloarM^5D?Wpz2W1vssMXR*Ae!F0A7J>~_Vi({0@C1*Bgbce|nHXS_y<D^mG0ky}6B za}nP2pGP|HEAZ2$Qsn-oyN{UbuH|mzZm!(g59lqlf-Q6xxx3;m`~YvE73o4pQ8K=J zjC+!MrhAF|Cia>au(Q6=4@>Lp@9OXCg7!PW^~zdy5Nmf6WpUj*Je)kd#mIf1hizA; zru#?kpSs^&oWJ<+;=9atn_Nvr?q9fH>g$AKkqTx=Aa}z<eS>3taH&Qhld%W*p~<-{ z<leP7Sc2U97QcRfjA@XL+#fGS)E|m`!sJ`F{ds`z8V8vaOA3n(7K3C%N(yf*HfMzb zH;RDDg>Noi!aj5db74MO9JM$ZAja5EyU4~Wf8T>f#fvKyU1Q8FkCN||b6ecHc&~D9 zXW4E(Dc~+Xw)pDeU$fET(~G|W`o#zdCP(_fE!1<LOujXBqcd|%_KiUThbe!2I1epW zcuXTF*1!0f`ot(sqB1cBjlXo{G0#Il61{$Q^pot*<Aa%mu@RdqJ81~E)1+4AdV1$_ zJrX=*9)<ThLC)x-FZ2TTOl)A!#2>?*l!&wEAr^VQ$>(|OTGF=UPftF?CwsiJ#96}i zIO6e<$0*66#>m~M=B)QP?{UH7caJWQ-g||_<I!y7@uSDJzElFDZIp?~@eJXPAIl>i zKV&z`iQ2tt&c-GDB~zE^FELwUMRxKc8!dTb$sDqif7wn}F`XokoltRdw6N&>00hY; zo=Y;w2~~08mxM2gUb1qDgzRaUoGI9Jl{0Z8fd{E!t2nEclrAY>QnjR!Z2F9B`c$Rq zVzTKIume}3-<G_+<mi&)BpIXas@9arR1*i^ahH6x<nog1?0XyP{hQrG<M;Y$^QyS7 zyGMeS^eh=+TbV0kC6pbzLdGpf3;6`+y#nMp$5V%KAreZy`43L}tSsVsI(zzfhOyhZ zmfg-@fX#cxcorxMEA$OL6FsHWSU^=xej5T743cd=VW>5#cmhv;O4-Iq@!aht^D6W@ z>2<?f=<}=ZB|i(lguv*)gut}G{J<9R6wi-6Kl8lcdD-)ZXTRr!m$?_HVOadlQBtT5 zTJW4i6RHJ3s66j@c40!*feF<Dd}Zuv2fIl+JJ?;s^P226(`&w$p0YDJg~d1MzBE_{ zD<2+(INVIa;GcZ1mz$TDSG-~<4U~3>eM6VLg1ur`6kAeVyasfr2jZ_m3Ie(I6w9;b zr|`VWysEu+czsBl=3l47wd5T5lr&?7pF&#ez4mz>Ag%S+afrZ_@sTV7#iSyyvtB=t zdEe8#zQR82Y4`>~9<JAIuRbc1T+aE_tBabAU=WV!J6;ps)4dmXo5+yYb8j993{dpI zfIE1f4&a>lOXVc~J=EVlI!5NoK6*zP;yLlRl<)2Cz23XV$HS*X%=7m5j_{86PG)zd zM2W~<Gzu5Oc6iIY^YM1<!rQTs#mH=lrgy9NA@B1(JfAmwO#V;q+UF_A`$O+f9)P@* zNeE^sd2~Q3^1kQ|)e)HFbnhG9J^u&%OV&$p`W3hOxJrOv!T(E6r>qa8%t(prDi)A4 z5H)<s$5%1lCFS`<_!Rn7`qYb&PpnTG#iy_mWxI|fbAyZ~Wjjy(r3`CW!D_9h<RYJa zKG(aXT%W@}U;2FCnS*>j_W2ZKMpCbxO8+yN<agAADMJeS$7^IjTdfTF-1YTQjHmE@ z9{5i8)$uj;wTGEK^yR1zzE*9_x#};acxHiWttOAF{izKn)i>DpaKEI=<VW9F-(=r( z-|~TR2-_O&FCh%K4;2!IJM)llwr@fIIH;v<pw4#oQyVFCeAG84MZUGZJ4oI{Y6189 zJ4t>*DRin2ex~n01-j__iSJkJU9+N2H_GDrUiH1@H%$Rl%t!zd2G6(Cx8HZ%_rFdE z)&toJ@)^JG2AK~ueU0;^s5L_V`U(dELTKPO<H>T<6u+6H<9&t5Z=s(NJr&awT1_%d z&*u8s`FZ(42=_gZA(<T5cUdy;Lp@_(?aQ6)m*ZFBcg?>&;6%Xnz{P?7>^+e~;&LU& z)vwxbuivo&@D}=Q^=ng%b&iw}`fuY}8Vd@L-@ATCzy}Ersql^$F*GLzDJ38Io%e$b z;QsrRX8JSr|7+RE?-&1V1L7KvrC*P~z~9#2!#}~lK+N?U@}J`WCRy$T`91b~L7{CH zC7Vz`=g{>DCceo>{`35GX<O85nAWc9Q_=`h;==QLjm$tKGnbKni2riZ6h-r$+0<M< zFF^ju{xW*r%apw29<3H4|1$s0EXYg><g?+<Q4q-8bCCaT{{uZE<771tL%%}g|Gxhj zNK*z0PXSa53{BP}Ls<<*T>szwJN<|K{|m4PSP_sGkQtB{P!zB}fCxAo@ZneAgb*A} zZ{*+O-+y5#!I>0Aa3=d8{|WzRUxg8z`H=+Ybzg44qyU2eQy*Tyn*nnIv;uTQ1m{g# zf-}>O;LNfoII~H}^2>e%=M6u8fKz~5fM<YTKyWC*(fTQZ;P9_T6CB<RAA++m8U-v1 zi1sEp^HvZXu0IM$3`q7TIIqE|+Lz#eI^RLlDVO2V)SteBna#Nl4|SvX0rdfm0UZHv z1-u(XaAt(dInx8$p(VNr-Duo`{ubPZ+0MNMt@VC^7t@A;`jM6@&f$PB3sAs?fFC;t z3y8-+*ZR_kiQD-o;I}|aNCCl8Y(P)o6jDs75WW^L67WJr*G^`oA}^}X3gPR4a{>)i znxwEzyoZN?h4&2&;<I0le_Vn_4|?!l7fJE}cB{Q3<4+ZRWXk(HKsXg+V3h*r@AmP0 z6j&0trN0CP5`i^f{v!;pl5)XMKq9+J2+q4t@_B)K1K$h$An?@JRBF@2&ljQW4l!|^ zbgoN?iJN2<9%ABFYBMJ_usb*>q$cF+rTL-0p%r0nVS!;0VVPl7VOztmh5r`b75-@1 zEb+9!=RuQ#-V9n9v?FML(1$^z!J=TN;28EcrYgDCd#U^&ogmX7%OKaFV65~xQjTX+ zRekKm7cbdNzf`xGo=@iniG%Wk2n8hP@y`Xxu+DX^N0Ber*AFTMn-QUJP=tbNg0^Ai z_#S4CrmTFG#L8Fav$#Q@1brE#G=kWGq{Y7x^j**&Sk1Ewx`7osJ3QnKwTT~rG<|N+ zzrmWpGx7SuLBv%42E9a#f)@raQZu(KWy~#02O%?ZO6o`tv{@1yh=({x(Qn3BeGqE9 z3=b;C!JL6Z=P4nCSDnlaUK>&nvN3B)a9wb72sdO}$ifiQ5a$s8kcdlk{gNBd@s8l1 zL4$+dXoGF=q2P1m0hSA=1|MV3<6`<62&V;KWFLCuqu^hI`@4Ey6>}}XAc=y<f=NB7 zkTAGOffEMTyE~~hNr14B8T-G4%%Lda43^kf0)9ZrlF0Svh1gOr?I=SXXhGCpONPO+ zs-P&?Sv(aKk{FUo3f1~^$*?_^(oI*|h^F8h^IZxrq%mZB$i9%zXo+wJ6Tq+gCMgGo z918h>lml;2JP;?E&Y~;KyqU@ixx7?osbFcGm>2R($loD7OF7Ep{5CCw8GsNLG8pm* zpR>2|IWx#YOEs6yz?)yIdQzTk?#A|{gkCXssc@<5QZHrC@6bIPLeEPBmqy^8-@!c_ zf<0!bcxeVBpXyE{c{Y^adR;PkY1Ps*OV2O8y|ioTVCcfoB`IiW-O`UhSL`2E0PP^v z1hjPb(gS!_nWUe9tOKQ)sTBO|A>LX-a6aypp{19WUc=|`18jRqS7sJNXbkQAA%vG; zwPT^v6k`&!^m!<kItNA;^f@pxg_=9ulc6(l+UnN9p#gAFjSY>!KjWiddK?@dpp+QU zrWiZi<EK&ry(>kb!J!+(+|bC-gwPb_%Y!tA1c0H?jL-s%p@SGh0?Kd_E7J^Z4E-wf z->}JHv%+-5D6~EFX#bP3KA1Le+5$PZI`lp2l#xlcsdCe_&{H6yj4@J4GH4i38myXg zDD-CNAE7;=1EJ%z4lzLm_S34PG1b9j>Vy*$zcJ34YL>_(vq<`SYz)!_LCh9%CuAth zILrpBm~bA2S%B<jG)j_x($Gg3&QZ<Pj(h-aHBcr@TCz}BY*;dDADDp;`SxrSwkE8E zaRa@{N)f(;_bAQEq$+o6*#5AO!p?+!8+J8(UbuF+AiN{|BqZQ~dxes6r*|tJ(7$H0 zbC<Dm|GppOqAHGY*q>p2VdLQ(R%}r<>GD|B#<&25Ylgp0%P2CXjM5EZ`1<d&Mk&)m z&2Wcs|L}zH^zcpL4fL6oqub%06k;b)@@NVQj|g8*20R&2VNXWvyny74!bo}W5d=a* zlp&w^BD|DVCa4&CR0X6GP<jC@fRqRhh`dZ{@lS@jN#7fo@ASgo$8=rq5n0qF6NP^n z{sSur>r&+B7Q=hrVpX;Wg($o)e5kVzRLA8^-Lm>36#nnB$t(^f>|8IDR%whb(_3b? z%xzf`Wh|BuXnzV?X1&aTrcM_rHS~Z4E%RCy^MAB0O!T4dUW{rM&1%VZj%3+e%Z@L* z8F4n^aimtHNu+z^nyAj`h0*fp@t6%UmtyWOH(tInc7E)h*kiGGS2&B&vIEPG(!qRv zBY-1QuVn7Bv&+6&b_L(TZAyBoO^F8@b5i)r{*G7_;S>=Y@iBC8Kf(y~eKB|0!)1>n zxb&rbomK3&Dy{4&;?0Qp^m{+{{RN0BCo~pP6q&9zNa*TFQN-eiKvsZ|JW<QxhgxMR zC}MR)DoM6)(yB`h=bwm@2zkWjh}MYR5r-H>|4W7}YO!H=m*{J%`;|)A-8W3w-3289 zj85f6d>ipo#Lb95mEm%HN=})<1jrE_s=U;^h@J>2%}13V)0oE$cSeFDUPMk|EwD3Q z@;wCHXH{n3bQEb3X-fwg^eUqsw@G=C{*e)p36W_mBGOr{UPo!w4`c%lK9lhx*GJYw zosR-X9*%s}197&2;~aS?@>t|&k+&oNj?#?Mi&`3$6IB{j9ra$+hf!xRFOVw9>mYqo z<i_cd7il|_0-VXCqm&pdXrlKqN1@0;k-d=*nQLXdCJ#kEihMy!sMVz1Bb6}T2_!n| z^{Ba+L=R#Tog+n2CQ(boD9R$ru?r$OX}w4~*z>e^sE81nksgG53UDf<5~i6l6crhj z+N~IZ4IJ+6>!R<XtpMvz`l?pa`79A~&O=dKq96i*l$zIru{LUF)LYcVw$W@4ClRhw z-fI0~nhdT`Pkfs6O1_086GinzvGEUwqEzD_3Ug63KYI2ctc*Phg>*<{bQU+-DB3zY zlRXG-5)^G8?FL#QXl0Wp6gk{zzv!@NW#&*u9*T~Rj;9w=#vr$u$&f4U?}K!z0=d3v z^ja(=5r%`={OGOGhoetMe;0j&Nz$4Xy)*i4=6=j$F2fvl7Vh0-!3+J_(Vr{3c_Cui zi62bjcJu&Q(GZNcs^PcsV^2mEFmry6W(+rGdW=?#UyLNCkUfV+>>!I%QH)-UEj7}t z7y&zy?W>s@`_n5lLSjN=R<J#psM5Uy<V9w?{*JDcsgH8GF;y}3F>OpW94%~aiGt+( z3KSpnR?MNU{von380x^9b_Gg^IUREzKTo9j$ErLOb0y{`jre^`RkTwve=>~zgNH>Z zW?;EiXI2Ggam>VWq@u&?6rkmkm&5gk<dGL?m;>r>=$q&S7bQ3q48{4}<(A8xmV2|y zGi6uf$(R7-XvOj{_Hk%|=JNFA`O9mT{~F7SRY|P(`aj8|?@Oyt<?`m`JC}dD{8AUi zU229#3eobnmqXDiGJ<<LCelp!v_FH7?*5^nJVN6LDP(|-3EM=WtD0O6TK@O)2P}&V zz${KKJh=R^ii(>tMukJ95(d_I`4jzx{8-~yk67>6sMt2B_jWqgGS*RPdX_SH{ZLA9 zm@03d$A&PZb>U!V@0geyyE?W!w)Xze_yZ}5mBr>`3AIU8Q)>GEPnp6gcZ*Q${@A1V zScs|WaTpOf+}N*Te~bnDKO>7?qA?Y~a;{6oD7I^bWmkV^b`{4Ub|m)S74ugZv$Q%P z6|LZ|m`v)S;Jt!;+_zV}LHj!%y{&RWG?-@weWPPwLF*&UFWjfnO4Pi<XT|ar;uN$Z zXvH#GGyoe7h#4))ozOTlMhYGpXVdCAX)CH${Ia5R#Xl=1R<2r^9bXh*5x;wt!Ky`K z-in45Z7cSzc%NQEB1?-Bd%-HutLOuLZORxZAuCR;_+rHmm=1@j=&fO(x8mm^>`9%B z3I8o%uviz-lW<qOSh;lNaw%`+<du3WtyV4ubK1%oE9cVm-3!~jYE<>17uR1>`ERJJ z{5O><hXRftc;h_NDxPsxN><8b#4~Od@r);{eWtNezVh(OlPiCS^Nov%TNRgaA6(Hn zXyulbt$3z6d1z(F%D3suT)|M$cEAa^he7bxpV{9J7Ppn3ul(lTP%&Y$Z$!~mNSGWQ z?9Ae?{B7lbac{&K#EBksrd9Coth~2!0$T=LR}Nqa(iI=OI|GVrIsb0lB>dp+;CPOl z|5x06{NS%)iJadRXNLdo8XN8GmdW{wI5+$V?i{ELpbCS|tpH~a`W}MANEgrdO7$Nk z!GZ}%1IHn5OI&N*-nesd-^5*syC1I+ZxnA6?;0N;pAw&gcTb``(ho3;PmMeLDvNKR zPfMnPbfESY5C*G&jmO=LyNlWQ1I)%Vd&MYjAnq~C!6lf3gDWI{QoPnHOxsw=w5wIF z!W@=qJLI8w&-eg(mx_UD$A`s7Q%t*_X4>Nn-z#L9b`j0AW3uGWQ2crbB?7^+IUB{- z#<#Hi%O5LDJ9ByQ@5P^s|1SROeKCsvApR7DERe>3J^CM=L8ukLJPIEn>9-+gJimcs zA3q%bB!Qb?kYJYJm5`87mQa_lC*e@S_X$5I{DG0oTD<<jNKQ$Z{wk8U(n!t#)F#*@ zIAhfQgHf9Ss7(k=h+<KjicxDULkY<Vg|DF2NQv4i71YjtRl9z~V%t6sC4880ipKUj zz;?p9gs&-VZ=tabF3SP3)M){W?ZQHoaBtOQ@_HrwlQ4>}S2lF@WEF?*O3qxbHYr*) zebp=yyU}WA`A0^fdV55SRtZ-*caf<*gud@!3ZcJ0y^)i?N}Ons=$%-e*tps&$u((P z(r)o|u|Vu2UYTr|?3}z;JY`kUs`6DetG2GXvg-b-hpV0^>M9TTcG`0}P9u3<8gJG1 zRr^+bxateMO&_Tepl2=W1n60-8UcFN2Aj0%<|^g+-;OtF9?J!nVlGGskAfkvf_oxS zGjSF;MEVA4GLKS}7({=o*6)0fj1onOZc3s3bs+MPLZg?$OI(^5m6(v2PqTm?#&)G) zL@GgvsfjXD3Hk;5Fm+VxP8dPdj$FeaaTC^03?!O~dlL^Qo=p5Q@%n0KR-Uk9mk`M= z;rP%1RB})Y=ZeVZCf->+ZS@>5ymAw}6Gs!DQ=N}ta<v=(7#$dY*xiYVB7YBDCJ4zZ zAUJ=4i2S548?Dw~ZKDpm7sEodCv78{CFQRUU41?2%_Q?Ap_sQicC~nQ@#-e!4(~`s ztJ7BlYA{R5r{tOWuvM$eSJ&eEv;%L|{JtFC>fNgktUj^&8+-^{RS&_7pVSY*i>qpf z;KelwclDjsLrI+fR~xDAWe;Y{%k@s1;65kKPtv1LWE{(h<0xxYlCtDxi;SD(ofMk1 zg58)fc4I!wMoEcDGIrT1imVF$^`!iy8qAMulQuHgd}fQ$dR^6~6xBZjXwE`O2a`U< z)?8}-aO%Do9UIE4Laj-clCCHHmh_l;50Y{_Wd}KrC6Ef#mei9pKt245J=x&eChM-s z(c5A!Zc3ncvXOYUSerIc=^C&!IUpB_t;EjkQlr_Wo`hnA;$ZPIN_%?;6Yrz>NW5Bn z9$rbr*^rY@YD|+Ly^oV5E)#DScZlB>9}$1Tns4T&An`VFD``FAP}U<3y#s&*I%)1F z6<X;@ktnjQrvhA=VDa)0UlVtUhmsdC(Y_M#ogoM$1!tP!?<#=0u#WNM88EkJ$&;Ze zE#$-03h1`$K!9d~g41bo@Iq36lFgEZ5XLlINFXs28louTC3`1_Cf6i4u}E3gmxYp} zle7E56kdpu6O$#Bg_ZL@ZDHknHVW=)XtFN3jC!H(Lch>=WwH73Nauhu2Xp=tjLz?+ zjT~w6Wl5Z5qvRdQ59x8~InoemtTaV-Q1+4Rtn8bNSsC-huP67W%t+BnaY|X1vNz>O z$~P(3Q-)HWr#hyB3ZFcfqVZ~>`@?Ep4sa|p()5{b2};pVv84kGR0?sPAk`5UxV|YK zDFOKUp264GMaoNwOG!ytld=upUMscR3tw7DS(j3y7X9~PKek%us^8^z`^J>GFvmEO z3$Lb}R#9K-`auX_?`bHRdysM`1&T}4!mNRckZds6Gv0q6zA*riZ=%$E_##>A%$EuP z2M-T{H#&7;su`)MKm;ijf_;wMDdk`1@wWUh)|tjl4N5&A;ZSzU8vgOrRjJ9Td8s9- zwW&LfK|aiJTa+qI&4LV><7x08zUjw7SRWaBr2La~r-M^o`8OnJ;K)S&aVq1WU=#mD z>bcafQZJ_dn0hm{D|Pf(GNj%dhdiAVklMsQfniUmcYWfeu1~0TePUG6GnBQ7e@rr0 zvQVNgF_BnH7E3~pK@!g~$ZY2yI{|4v$8gWb)O$YmQqRX!dp?%Tl_X2jC2Ppg1A&rj z&LF7`qbXXXAW5a99{YM0k^EB9D%nZ$%U?0SG)YC0Lz3gzrl%`_t0g%j`5NmoMoecW zl3M;v$)A${(q^SSPM@6aknWKl(m7HnH<d{4Q!x#aA;}{qra{7Z55$-l+ow%s7WvFx zs+nexwm8i%ZC%=dv|q$1O_1iGeoL5>6~OrWZc-;48ZJxA?Jq=Wv1uu6p!TzaV~?OJ z40RS?{Dc4Pg%lYkcO|VRtyT4kJUh^*9t`{JT^UMyKkW*AXJDAqX%|%I^Xw4Q>jQj^ zis@?vP4A@*t2I5$H0|#jRRBsm@j+gniPER1n<`_{e@kDWa>cfek3ofC<yCYX?4ivr z=_BLp1$8Nu^M6f`z-Q%GvWXm}rK`wO$7H<p;`A%&zokD^j7xdxRp|%QKS_tuv*~r| zJ1O~888Wn<lslCnLkrbkW@D2;m|CmXSyG(OQj6>9P|-%2@w8>6Z%qv!%5q63OXo`U zq}Ec8V{pz-+9K(6=}bsgJDCdq;YFNOKkz4CI`Ah|5By2e&B+`_V8Y5Ek-*$3(sj}b zX@~TLY?^F7e7U<_2Ffj#hw{LKC*3S<8m5&R3%rNx*%kaQJ*cvR1~6xA;-8UTl3ten zEd53Lmvm72;us{{ojFdX-<^PDyEAzHXVm9^=B4?cQJw#p!68T+V%$sCxk#ofOU>lT z%w+a5SJ^V!e@k)ZDU{D=$}ps-K_C;PgHVa)w4==c2NY3WTKbuxGGM|xAIS=3+hj;q zDyzih;`*Krfj_68auv@Rr21YsHVPi)!5#>Ok&;2_Mu^cu_OlYq$2hw}QpA&8k^Lr9 z$X>AfU)0yfrV-h(sJtZ`Q9)%rFgsjV9o@}%of>@FT0*1k$#AbCr;1~hA;_@J@W_Z^ z9cjSZm0SCI0m|^r2%&9<DN5tneX_`!{u{D3jx1wy#=eZNGalxw&l$~~pKF(UEBAKp ze|dBAWNW6cS-D2MCTGosH81iP<oiRkZ$@KA`#7ZMa0ZlKj__n|#-WU38J}Ukyh%w( z1wctb60}O;X8e%xa|W!0^wV4;iD<^{j6X>t`Wr(;Ic!Px<*B@kXPNw*WjSk<Zj&hz zlsPRYgfiPpCuQnqT4%atkLAqD(a*7jP>Zo%Ms>8^cE1mdEp&xW+bw-5(=+2TGcvDa zakKoglC$!&-p~3Yt2djQ?Vo)u8<5gZeo}|@XoFqfc1a2^voNzfb8BWRykQ=?f<2Ax z@c<ZmC4^8jmz%je^Zm>($?qu$H8S6&gr)yLuLjpR1b&erI1IcKR0!@G!!z11;bz{- z?93b?=ghRQA!`7`VWK?i<UAHX?ot5%A5=o^NkdsvvgRvB$4F_A0rQlhEZr=(L0ACT z`%sp7mK`3YooV7Yf|q6?MOh(P%R49V16vRlaC4AhfX<S0rWGbWV5>B%HESQ-sC<-F znN^Ql?qE802Dt-2I|#AQ48GsXMp?(QewLuD(^(h0`?`SI;8%y?{xHDSkT=2nG#>=N z4D%c82U&wzAl;HS10f;<$uRKVe3U&U+eO07eluG;+X9m37#N>naIFKPm_J=c!MLg1 zP7hKZ!d)CH;Acl>=VourZqGh0LD?&^C0%5|6EpLj{r8zZyob8_6k|`AzwGi*c4amc zM2Ai1z+#k(a41CCyR#1tbv<BOipIM!kXsST{xth5yhtI$Moh4~>%I<U|B`)=jBjK> zEr&=SGIa#4o+`kEES!{$vY+Nmf?&gbJi`XS8vb2Jq7DDiIy$a=(YOxf*yb!D`^K;9 zp>zCuD=8S`l4=#4p`65=G{%Wz!|L%0W%ZIDCET3KoR*xuWK@?*Q0=d5V~6p<bY9Mp zoGUqh<UnF#&c``lQllxkWD&VCC6}C|{xThN$pE!hlhRSnlUxq%&Fn8ixth5%upGY$ z%kh(>C|5VvOzFY&Wj&bR%O>ag<%Z|R<%)AlbL(<<<{nmR4YlmtooW4TGH439(%dz8 zgjzhp<d+<-p6Z^wX)k?v!G*Q^=bp*^CKo*ajHYs)9>|lm`=8GsH0&}_?q9i&lmgAW zxe(c`lmhaZyyuiGl*iAT3V|EwkMSp%YaY!;c?<Ir#oRojJg2;6RHbPRi#$tqaa}zM zhy@%T9vON}`A(F{bWv)F-%D6l5tPHvE6OX+tIcc8>xIh!>>t!lO%VM0#vn>qSLK5d znT05?BkxZM%G;NB1881WrJ+UM2YFxSeVdH(PUL+CRsqPtH8LoK|H%A_acKWT-c|4e z8R?V%feVPX(itx5!}1+}EjMpC@5vf;Zybmpn9F}-j;+b<(Sbf7uyp!NE_cn`H3n-I zu`7*WoO3qhrz*~@v0oFkCW5W(_`@16#ud~^(&Zci$(X-CqVJsXyP!BJ%M0Zf@YWQs zIk4u$n$IW))f)MldX{JVuxxt&nw=`UB?WsF8*}uOR>6@}$!`Y=(V8FEP_ap5-JvzV zuDQqdx(D}42>+!%NTji7%>*N+SrwstUj7W$TcWb?F!sRZo9El-v-OX@qz~K@_P~9~ ze0U>2B0qseUD2x_-dLAW$H~awlz%b*=K^lQtb(e7?+bn^xKnUX%*$`e-<|(n{s*jN zxJG%zche(k!(GZhng2PyOS|!1(q>oiMhZ9ocK+Y_kb_N%1H+^^kl&j>K#Bvmu}<YM zG6Zn~-IQwz?E%LSSU*M?(-K-O;T9|`FfB-DSF%Ep%_|TUxE2H!tiWourK-;IV(&{v zxwq66`F&DUkX^7A!|qUpeYOQ&))kx+a|@aab{DWYm3!z_>%giDjuf20tKNfGt)p70 za(!O`A>^sZW>hu-#1kA~MaJWq&791_Icsy)maIL!_Um=p>&%PWOX5n>OXMZTOWjK& zOIMe!E!|goMEqKzO<{PUq_DDZyl8rnWszUeM@65nbzU2jj0znJ{a^k#$=jF~wWXlK zn8J8ch|?7*g*aERr4(irmc3$2*+sI9Icb~tzZbR@?kzlCc)sxa!rO&#+G*2;4^~gz z3J){H>6x1<?q1x%H0$@5HsE*l4fsPf(=ik<TKK$(k1^VYF*-+zie?w-Dye>mn&19g ze3RtD_lsOq?&sP(R1{K_Gz{^BXNw}$(l3XfD2B#!xJ6k-rA503`XDA2GbIQ_DI$ut z^}@5^Ui`3%{0sk4JPPqFJ;SPxN=CqGq$Fyu7x0U|FB)IVTl?Btv)(=^1~ERCi;8|J z`U@k_6GU||q(FoUsZJ=LlCmjY3?UpRwIcYOR~5K8*3Me1jhih~@u-H9L`Q{5zXb&$ z08PLE`iDq2)QBo~$z!4=Udfl)!`{>BDZI6nYj>`FXYCOfb@SR5WpdVL>f*xZ>BvuE z5*kjl5M_Kv)o<X$MoZaAcxx}O?ODfJ_nH)~y}lNzfMV6MO1Y5{c(rojv9+LRDj8u3 zD2TXuE@|;p!OH}Mm?{Rry4DT#N;I6Mn(Lg`omuzoy1T{p#r0zTI^T6+>sGEyTF0h5 zseH`QkG{Nf;i#=kU#HCfZpTM$u9UZ~a$Wtpj&(;czOB_x_IocK=!5D9`Vd=)ya!D7 z>wa8!ogQ%|%WhV}(Rl#lJSd)CtW#_XtsWM?l>bw#CK}CG7oalmNeoeIH8q!4>`|Os zTvA*Hy%z@+M;6ByOK_qm0&SM^Qt}}pgZ{;RgkSOo#+hgFWSY`W_)Ha4>tIrtG?l)E zCK<1IU-A3J-xiOvj4YJh!w-r-RoTOJBe~q-E5&~l_ruavtjBW(6bgvmRhn()Vqsu5 zT*^#-39m#@;#jhzBvgz_rj}@_uRTX?$<x(eCSk;g)LL;MI(8JlQu|6=LKZ5?E-7XW zBo25kJF>YYn@hHryrY&?^d2iXg-|WotfF^v`6XYJ{8sX!bZY5*DJuE41S<P6g?*w1 zaJT0lz@q*t>0z>OHE{Wx6D6wpe<>)_7(#a#f&`T$Tb_?fbxUm(5KsqH0MgRCDYBMD z*p?3s_Ki}80v~XEl=_qgQI3!Ia6d;zRmu_P7NSx~X%2pOm8qeyw+NMPC{;-l4`=uG zqtaHDy)B-=u%AA{zrM(7=46%rvEk9i*&CN{+)y^VOsCAM%&#oA>`K{0`Ns0<^7qO= zDnDI5E}m4{Upi6x?|R;Po%L25*g^}(X}7B@ePe9lj;^1!el}(Y$MGGteL$VgC!Is| zIrht*y547l=7xD27H<gIkhmddL&b*n4IhZn`k?hM`W0!s^)c&H)_=MFn%YHvPTD%5 zP4@bB(ugEM>({NXR%`M2C4=XSN0fYq*6&;Yp<2VIFE@Ph@`GmsY*C=~f2|)-0|z}( zt;)a)xGq#JCSUm6m7M$8hUwV7wo8#(!T)1}{sw!@f!#M)U=Hk#dF~%-z5m$@EJ4k$ z@%-hgPJjKQP(U!fYNe;=-vf?chWin!9l<x&UYhQ|BT!Fa!^sU_sn%2YTak@6e7E8E zS33E(_N9R?kMv-*)?_G|yWzi$yp2;y<9vsrA3R%GO2g7?DZGuk8%;J^Zw#V^NDs`5 z+(~J2qvJ+5Qkwjok|uFB#$r|W<W7~C_S~4XQHCAc^k=i=x=tGlm{OCvU~<@4wed*V zjQfRX<CcxPfDrbp<cTbR=ovV&;Ju-4+x*djDvtZc(;KgByj?blar32a{Ay?f*c9mm zBn<DUh=1C-XyacSpXZ~EijAa8PwDB)S2ic3Fd1hb^RbQ>sboGw4kTexN&WR?+#)t; z78592hRW>9oJYh^0#mg(couv?>-(}074cwYR@KD$vXrv*Wi@5n#HdVGmPg+;J635p z!BRuFex`1T{lpNY+4iMy%l4EVEc;NY05Gq`N}U9ioh!SjeBDKNo|4TiyH$3tjP`uf z5z{D>C8bL-1-X{1S<WkequjOJuRNr@sH>N>s!>eKvWLv?=ay@i8<smzxoLty2vOi1 zEjL%XiH+VM)78w#stYub32CX-D5p|{P<c!_)DtO>FHZ;45ft-*v?1a}80o9Eh43vh z1@1-YQ;?S-KI#XOdw__3uz*{>wY;@_H<ehS;Z4h92D6k3-XN6QqOvQRn6g%;7*FLF z%CDBQ_0Q^QM7+l0sl2;<P>H8|^y}ou7!fzJ8#$m#S2R`}uK2d%Zq>{xv+C8=8>>I8 z(W<ej39O0Ol(nf={2H;C2p~2Q4a7m>*9yCer4<nst1B`q*y>gvrXV7ekb~q_#rcSc zC(?*4LZu?Ch&sVM?8?5Pa!x5qth<Dsm^DyhqK(*#De;Gx5?f0V@d0tAbGQ?tDT&j> zc}#*x+o&?K<6R{qER*qxF1eXJU0z)wfcz1NBX}g{5+m|A<?|s62@y}_d=iq{zsGHq zbCdqvN^fb%_%ImO*d{HCOs-rcUnY+w!R0P;U-n(S3iuWpJn$v(I*@Xp09_%H7syH9 zH#2Y*-C9)0m2Z_FmiKn{J?Je$^6m0>*fyK#HUYi4T={YN&+^}>37nNvWvZxmkGH8z zpn+~4^wI>jj>x$3hZS#B%%i}cRPfjlnpMD?Xz<{dz#E@H+Arf8@n?DUpB0`eym}i@ zMN{v=(I;$%Xu!kH`*^Fq7y);NcLAzcTTu(fBU+-uFF#^*kji9K(O$7nNsA}plX^1+ zReV%&no$P+P))&xip7Pf;&R0;>=K0}HCQE~>m!*|F;JORxvsLN@~z5mE3ZjV#c1W~ zY+l8`m70~aD<Kq?=6`-_j0_4xsB$Psm6o7Ni%Mrzw$n|P@u~Ez3|DLV{AYCr`#exp z{tRVhS$W@6RqtaNi_*@@78R5>XIJq5tUOrx8D_&CmDq#+%md@@PZb@e5EL;nxAOPO z?kYZhf8c@Q{&>F_RSs1?#?Rg(xBvhCaX^Zy=2z)b(LQUG5_z*sv&yk5zN))wsCsg> zS9dC^T3offUjcd;Gk2&xrPQh<kn_(utr*YdSIMgCt9DhrTlK3LRpnNdsmsy%YU1-u z^_QtwlJ?3&RY$6RfDS&c`eIO3#?DhQ{_<4y<Q&yjxh&qxSw#O;1%jD!#*KqTsCq`V zdqI`q%<6^Jrqwpp4lM80r)CDB@N{s|uftR!gIQqZ(6=3tq3Xcu<@Zz_#KHK~24$gY zNp&Hp$o+~Q?6AwjZ`-rE)z#H4)qB-s|NSh(3Z+`Ivj1DT{OYsSH>(G#AJuTAsQP^M z4@#0(p_Ki<Vi$R@T6J4k9s3tBK2!Y80AzqsdOmWygEcdhbqx-Ia9^We1K)rK26YI} z`27M@<51&)|2(1OP(yfexkXz!r)qL*3TigiwAH*-bE@Wi&Fz}unx~uQZ(6Y_8M5n7 zDV^>WT~bt2Rnwr9NHXatq>TG`fckV)bD-uZ{b`+Z_~}-5LkV`Rf7e`5+0dpeRP$F& zF9vC&t5I-%Rbpw^V5byqLYt=HTd-gCO6)H{n{+pYgCw#EzUZ*Yr?Ve2eI#<zj7_#= z-nMDxeUKQ);_!rNHff!O%og%@E*|f=Qg8W0skfY4i#FwNDj!hvC^2vbw?DlOZED!G zOZDBC_}%9@?VOxVH*4c+^J`DmUfDcp^P8KaH<xdDd&`L}m$y8q=hyo;*f+R0#5Anh zws>2>wg~a$P4_oFt<|WVTx(EkS?gCDk&HI=Z-Qb9baDJcU{^7mMC(AlH0Lz~&RaX9 zc0T63hcM>_yAsweGgw^zP^)VHss=3*>_bqYlF$gkvz8~L+N9bHB_*FmXT5OtrSNJu z)K=Ek*B+#$>p(1B`;*djZEGzR|8iGNx(-p5uKh`RUwf|h0;czV480GKaBFYX{$2Zo zowKrPnp}9L7IK1=7ryop$YKxa0{>6}S$X2Nq@&IAHV28hoAov?+6-UZW^lHX#*-G{ zX|vO2PmHIX7*ASo#~I-ad`Fw(Hm54_)&jH?ZO+;ZF?Nu5j`CF`>H-;W^X59+y2W+t z6yrIQHt*W}#pXXZ_irArn_FijMw{Q>{INPw%vGb9GrDAG^M%bnLjf90EFDImf+q8a zt(defDvgVdxQ#vB?aj~YrmE3WsR}LCP$i$~kczArAH%?DEOIk5QJqg+ywb<?V_mok zhM}lqFH};glhoz0vc^uD?1T<VwsKtR+Uwq`J6w0E?x(t*Eoh7J7U34REeTsvx8!2R zEK}ki9H+1{iQHIPck<OJ^=5i^a$$GsZq@yXcL!3p>F+$`f{Cndu<i*Pr7pu!>WgG( z%j7NaA?=s4_RN$~>YG)>RV_9o-6aog@!A48pd^Ld03qpH!nedwA?b~DNcs~dB)wQ^ zf!8l7L|cls>>@+bw`|-}!>|?OeCVovOAFmq4HJ^yK@sScpj%zua!^ILies<g=$7*; z2;Y;1wp`!xHxx)AebZo<g-?lrUjoPE1ZATw54SvLxl0(nsvS9~ep>xvF}HqJy-vNc z66gDAtQrAU>n-Z-F;@3utQrk6dfB2}&HCv2)%C^oZ*N`Gph7Zo*tz~xpQSR_%{kn9 zqQ0?yCpdpQAAlx>sRJlY)VgOemq}|VXHxy~`p@dWuYXYgY^(9s)%a}qs|juQdwRzQ zp>Re0&3do^(_-CO)fUg*dP%J7A&n6-w3WYgwz?2^{UsqT1mwT17F*Tizg`N|bL&g; z->sKG!(J)lxV3Q7R{7TYt%tW>-um0t{szr1GWw?v3b+`)2E#OO1<{}MjmizDY~2F| z#tf%`WDJ=d<VS)@EnjY!yY<u{L{4n|eCq{9dtXDd%@VNmlNAif=E>wExna)M&OvbX z(p}``p{*lZp96Nl1qy9|w|6PJ$x6Y*Xc4zzM#J0&y?a!GWEEr!E4tx@oUFV+rc72t zeGqIXr)oyQnLk{B8oV25`y{vzj$vUyznoURIS-4fxSu!38VVaOY@5%LjjT-6P}<O} zBpa6-RO`QPg50@=T@42sjw;XLIr<#B!#Qj?(Qpo*!*lo?x@V(?9~%bl!CZk0S8$9P zZa1igDRG%l=GAaX8^*THhB_0_4mJF@Z4zKrkx6h1K{Zv7h7|ITqFgAz4%Jfs-lo4z zY5(%vrnG-~Vu|5zC6hm;Wb&Uq5p%c2ZA;yjshs{^diuIB{cZW%*5m2##nac#ZQ<l@ z`*7R0jWZk1HSwBeHMuo?()44~!=~rWAGS_z4Q!RQZf~347SI+YM%zwq`;6k;oKb9k zuuA4_`)S+bMvca4)EC1mP|>zK+f*n9)Pe&`52VAg_FX9WN6P{&N(Q}<j;9Jw;WjR4 zOldqWMveN7tEkNRMvF$<#>Mn9-efH}O{|%rF{Ck)ejmiX|DN*XTqoIjV`gI>X*Bzj zcEMJ2#u_Udw=}jl?rl861c|78*yc8P{UNqX_XcTzqKu}5?ky$*{#T`q+9Q?Mc(L(r zV^`x-`0i!nl}1niNzbE31PzW}r&29uF`=_^&P1cihqQZ?fhboba*e2_shGjVrE{AW zHkmg;O0fb0IDc=Vi)Wb80V5;I^!FAiugR}zSyNooA@*)mE4hAfE^10@%23Y#D*5rt zx0_0u<W2QWtxfxwRsYU<vbva6-&I-lU(BjIRX%<R3xuzb?{7M%9x*Z_6E*$Z1m7M4 zLjzgq{z%hZ6@pvDM0~{dE5oYa&(>_7+HBfv)m+ou)C^zagzc)(2yLF*tjkO;ikVRa zy|v^Q%&WQIH!p7XYF^qL*PH?0!u*9jQ(`g%Vi0F0uY2ih=IaYlb6#_~`q#`i0yl!M zng7I|8TgnXOheB7vUwL1NpYFwSmA?`CXT52R`Z|Dy)Bw8dM#!xqL$#6td@qBj+PHv zK5e<(($(^y1$_TB0}w0kU=J1_lA0k2fmC`_iv`rBqL$ZMW>Uu`9Wwd{!4BIE7FB&? zDz^|SmdD?R&lZC1ZsHHP#VyV)UicRG;9HyydUs1yOJYk3D`bfK(+JMzSkf?%p_crX zs#hcpeWj!!SCKT{d^I0#j1@jad8p-!mJ77RPzZFb<#Nk)O8BUyg^!1%L4~vmbIvhh zNS;y*;hce@doBOAA~M}AqHhE;pQCcQt#7p2wtA<d*14@_)X~>?(5i<&i!`8&VVU(( z+)@bnC3zH`$8BBK8ruq$AW3oP2-Fj00&VV733Em!`KUFwwLTTK7PS)hDK7vRMma|Y zI!B@8E@>p?oE_^WOX8F4ORs?6y1(_C)|+h_ZPVc^sD-HYXzL036wbs{he-twrt3~W zZoSN0|Np4in%29my)4fOVg-@Itx)h$sRv|Ij%^HyS=hvIA!^fYQwfJDCu3(SIOA>h zZSKtN2*q(ggl_ma>)AF~i`rJU9f3V*OKN+ETw0~RM_YDVRoku<)K<_|u3{GsChfxf zRMb}2*31}(gYNY|B5T3FSW5pBGTJo+-g(YP%FmItooV}~jg9~Mkw!}hdxw6^YvSa! zJ=?K<N6n6HJ9c#}>xkPGxm&XP%iXv4B<xAui}t$jU9mS=JiT43-KE{9J-9uhUEW^b z-qC)b{bu{U?Snh!?8p_PcD;6sfnmlvK-dvvETqz1Xra7XM`#mn3_T6=bkrW(E|Z}4 zRqd&Cz4^b$qWpgrq4wPNVtj3m;A>;f?$MgQC!K?XLyXJP2JaXl{5cD?zu*2XP&SCR zrb0;>qC-~|s~YO+eW2pIJg=tLl;?BX|7rhkdlxKdxSjkKDtxel^9d~inSda^U2}UO zshQPs%(m-nx7;q;?zr7+d+7Gm?J~MlIzvtV^&l(u4v-ONu&GSRRQ;_gS9Wp%+8(t% zjy!(Ei<S5+>2D-!`aWP{BH)b!DWAh|i?-Kq-?e?;_5<5L-hOWTjqSgw54VII?lC#s zBX+n3mEoqqa9?l#o*phvIb0bz+ypzEBl%sG?!NmVOQHhq_K6)DJ6=~j#4^lz_`U%C zy_2LFAjv^Et+a-JdWT?#!w%OSK06|JB#Y1vs~sXp4>%3!0jH0P;eQzFw0eyFX`1jT zGkH#{#@L^R2viLBHhX0>u_E*ra6_!s$4WNyyLTMhac;-89e?Z?-no3Ic<0)VAeP@O z!A4Qv9haC+pZO}lN6IXNjufIADL-D~BjxXSzH`>jg*zAR41k>fo!p&MX<ku=#oJOQ ztEF2_dx({xoi;l?)HH=>E3j##R4q8;*-G~8-uZuNm<RLuJ1cfJ?EJJt)Zw90f<25Z z(o@MX*|}@yyE{L|Tr5Ln&-sifn*r1LqC;;ewT5H8^Xkq!I~6-0?tI=cnUzE~Lto&3 z0-nWD%@z|Y&(cJXO25+!P{;I+IrLeI#Aj)ucN9wWC<gmT$@l@~#PJ?hKs*dtB^`WV z2Y_OalV5Nl^o64e`24N@L8T$3PRi{_?r7bmBj$EwbQE^1R}u`S%7X=P(vFIbEtn*{ zk4b`steShV<DHK8I-c+1?SfB}ac@CXl$6(TqT`niMF%K(9cMbeqmGQy(ow2r7g?bG zG7F1#p=zyOV?s8ILFHt$O;@$xty{U=T_(HCclnaBDhGz8XqRZ0E6%vr1&NGSRkcSu z2ZnobkbpkS{`{__-S)ee><-?&0>0Csxhrp1%dQi<uI{?K`%N+0wRTsv`uqyirZo$U zI=eb{y{BT-S*vQ)fr>u6&g{C>2SF?k@WOCBueVxHd@$n_pk4QOBLL~&^;8X{kP!%d z)y+Fag=qJ@-B5lKOg>7>(K<B?PytJ_3)zEyQw?>$Jc1+ye4{GCTwcYo*j=!@Z1<+! zhgiG19&_&v+p^K_t-D*H&K{&+AIn9%J9h7dT;5-lnI_W;(C!a+pQ6uaGCrUBr2uzf z_cc~RT!t_IZ@K*4irvF|?Dlx<31la{k^V*il>Sx}^Y-xeys<}n&m!{EFHAz59%-s# zerr>96y^`z@nPnd4!h>N!`N@U5Z5%83uo?$p`wX}`s8MSF!X*tcTd)ynmunx(4PD~ zrHsy9I!dP0Qo@meZXcK!_B8BirP7qoC_T;k4!OKNhxdHE=j@(K-Q!T@!*B*9NJE|m zqy+KFz&k}ZDeDu$=Xq$)l|3WS$&EdC`uo8@Z8U%6f6ToHcox;xusxY1NK=A>V8e(( z@u(O&C~7ETP!vQ^R5XO-fke_wp{VE+KmlXJiVZ@C&_WMA2?0Xy)pA4yiB#!|!gsH| zr#%7BdH?snzU%tt%9DF$&7M8GuDy1dnNwNjH$Qz-rn~fm?VkLQ<9zT43%hRfZ~hij zi}(MGt~k1J;^5%Y(P5)+a@FfAyszm>FY$caPU8G5b99^0o>{H_Zp!R-y2kUIuJPhm zh8wSp_K%r8X6cw!V>XQ0Gv;D$h1ihM?~EQhdjFW*cysiJqd!wNc=w}Dn>3|&$mnUK z=Z!8Nz0KB#ZM=&4;;wSTI=cf@@x?uus~N*X3r3$GQ+3RZV{RQ2G3MSet;T%ZFnEkH zCS*)S9`7umH7khY*T@`m?U?K3+iyHgRv;gBD_~`OXo1~g6$G|)1+SQ6+Kd^BS&|Ym zrqh`2WBQEg|4&ZKHHrn^MzJ99(bvFpCyyPFCqJC@7~{5@)vekS@gp5ZKB<xG(dSPc z=k+hYj@duvjNM2+I>!0_$D?*Af3-^J^sJEFu-uz-vvN16r*LJi!+%HOPiIc^(Cw1k zhPlmhAIOc$?U36&H(@r<+b)^Ihw_%p#T-~-d$lAmZI+aa@Dgu?m&mh5$5Y-i9?l(} zJ0>?jw;;EKwmA2LTvkZQx8ZKJHOEV0L1r5(a;NBa@7xM&jOGnbTyM3`Jxr)Wa`%kA zb!_9YotdS1%cz@sDED~o*|Fx>TIyp+;dRsyeE7|tt4(=#t1mmU&RFMd*8a#_l!@jK zzeU_<hu0ok->s83rJG}0j%{ndYbyLEvF5VFZy4K=_2wP)Bkp6L9~-Ohcq8x5ymM?H z&ke6iA8DkI{bJlV<ED(;J-+gUn<g}#@X@4sllD$JF!`p*w@+R*dCTNeQ=W~jGIsXZ zrDIo*-8k-=adpNuAJ=Bw3**wqeeSB&*PRwMUyplqiw_yQd+hgP50BF?0*sWg!0fs= zjy)(=<N<kQtuxm*bL<6Yu5XrIqh}oSWrwa9SJTea6*SS~>Wyn)H_`ca6CLSl)Dd>2 z&yFk`=N<q5T#czQX)b-bBTiU<Pd3L5823ThFTXH*T>j(<dFqAkWc=x}RDa!OZdt!R zE@a%Caf`+kk6Wi_jh?e-jh?lZ1nl=t5j`7kj{APxug(*G)tNCGcWm4_+qQg8%@}3Z zd0~8zy&CI9Uxo3t$3HSYVf>i!1>^VjHpkZ)e>e6MPw=S+*TNq-a^O5Fb$rwDt+Yyg z+g7Q=ew8<4rJLhBkMAb-*31lZ{0rk_)mym_F`Ca?x%VXmk53yvZ2YH`^YQ)1zoE-{ zL%W>&160~fXAtRKH*t@QpYG|let9ZkaOk1&MdS7NeH{DNc_H(me!=7Sk3Tly8X4;N zMUNuYeXuOn9Dio~MLT~#KYE7#kn=IaP_j(cKQY(Ivo&D{%Q%B($u{4Z;Ff>$%>;8o z%L$!h%?S@r=-_1Q_qzM{V(O6Kq6yDW=s)2txp2^gSUoYEZN4@k$r*q!=LZ-IzcXkp zV_vHD`ysKygxrZ6CjL1obW)v3SV2jZCM=k+cfz3wXD3EXY&3EB#7`#{aPy@T)(2Wq zuLRgWS~)uQVO+pWSX5tg!e0|_7JI0#IkCdTYPKD9zjxv*(Xx<Q2CUnEAT4;}{S%*` zm>6qLjGFjlKwmS-Glv!&xU&CY45~D9V*13_?0dEH-m9<o;K59D;#U*%0&TE|0&K9C z2|7#q17eko9x^BHnE0J6BxJF|tsMO{kyX8(RfIR#A4jUY!mYyZxTWm3N!NNx*{BqA zQpBWDeTJC(CN-GUa?-=D=~hqm1}fvYw>c?#Qa@3YL(CPEx=rdisjsV}R7KMZ7;knu zB<6OdUI&}YCk>wTp6h2z*TpvJzw%(U8k07!<B2bK9rsg7=A^}wR=G1<F=~B9pKSB> zNn7l72(NlHZkN>HNk=E0pIqII@_TNSk4_HtMER?eEL&GIP`6u+<Bas+$#+lgG&wmo zcyi;(4^D39l=<&;nQ!Q>xbJZw!JPceWM__Qq_<vQ;7zk?bz{inL6e6~et+^8j!!>o zpL)7uI6vB>Tq(hmr%s+bd9mZRM7wS0x-D@k*4f`P&B?na^F~;;fb&DO-a6YHIQfv{ z#GIEEGWqW*6{p-brL&tJIc|C!o>J439(=iD%AHdlJK!^?G?>y#9`tYmBC{>-+CqjM z6Z~ht*J&4F$8<`cDX&Z!FlC5yQH~CM6*u%bZcL|qJms4y6CAfIwcEC?+m#s~8yQpf z<}JxvJ+0lezB3!nY?Z%$ZnwEZ=8m5C;=J7XMf2A$cx%C?g##82j;%E1=#+C)t4{4Y zHF@fQsUxS(p1RlZxj-7s?4TE>8lC|MUwr7)+EZ_vdgs)pQy;O7&8EsAZQ;$wi;K&d zoJ#^t&ZV@PQ(u@GZ?~EScB|=me^56!z2{GT%ah)(@dj)D=vVW40iMV_xBrwJlklp^ z`1{YJ2M(k9_fK6q)%mnr>#5H8M{8TP^9j<>sR#2S^IGJ+oR`l2$*F(lnR&P6-DMT; zM%MRYTJr!W@4CvXnpcZET7z%x&e+}Dwnuf2Hr9x=u8K+w&Wp<Ho)?#B=C#jzN_tJo z!TGnfJNayyC3#CrnplhI+hhgjy_z>YZ>}#mZ*bn1dAvqCZ+PCvuKVHIeREebOiP++ zw6OZ>EnVy2hPcqYZF#@uotSppwB}+TWCz9O$;^t~-uJPsg_uL<VuzT|<^477s%ba6 zeVx6R&yanqjq2xR_G;Q)(;CR^)lc>VgfDuG4U<<lXPVPGPU~jhjcEtgA7<Byn-=2< zL!z(Jv^S@HFm2AXQ`4WHo;Cgb>HnVo=YHPDgKcCl@@~bwKAkpA-t!*bc-lA2fVgi} zT&Mbq#^eJjA=8#kTRm;ZG#<;)c0}WV;yI^W@thl2Jm;ww-Yl4Y)%2RvZ=8Pn^hVR$ zOn;)GIsNMC)#>pp;3Yi^=Fl5jV3(u?ftLM(a+du9cl_`puaUnX!JOW6x~C}^<XAN? zxP^bo^ueCO{|58%(?6YF_%lzH@pYUBrjMUKeR_c%%bPqZ{U&Q1tn1n1Wpt=TFX>sY zucvSKcsS-*raArK^b^jQU|nYb`*vPm{JznA#?3S8&A4yI6EnKbcxgue86VA<H=}UI z`WZ)NoSt#XzHuK%ZyeQKuIz~3Gw#298tFr=uacb?Qoe*HnBkj|Vrzn<wkAksJ<5zX zW{hyBiu%~IM0X~dGe*tGyKI)|4rj=Dm?s@-xl=;T)65xLXYA2q4zFU4&iMC?18Pd> zeLW>~&YB47=d=ak{WHy(p)>E6^(Zs1o~b|oL^)@rz|5Ox-mbkGYOO~ZrCP;jSvIO( z4&pavBwRJK<E%!r9-Q@fevSOw@>j)HnECun-^|pRug<D8tFCJV^mo#4fm`LG<IS1= znLqv#8!|Iz<|i}f&MdN%`zc<^#|N%wj-JU1F;&3-igh1F{OhHIqQUGld>!Q!&n?be zKXZpI>g919!$+w;nt5dAshJmMg-~DkwA9B(q{HT~H&Uv_nPh*xkK`%TW@Oc@uvs_Q zS+&5<s%A%6D0T$3XAKK~?5drbtSomU)WH`rtJ|#4X64SBO%<Khb5`Q4{<DVJk!li9 zMHiH-q6-77Xo2%4*`I$ukdz&sH*1P@`|!N8v2Taw&nlj^b=JRU9h!A6|Eh-OtkPK< zXVW9kmtP}u*6vx~@)DeUhA#5$Q0E6$;{0-zINw`y^S!ZJl4$1Nncs+B(s2f>;{3r! zQ-*|=<+sZJAfHzo=C{co%17?#j9loD|78BN*6l8I$T0I?%zuUFdeDv87w*YVu+Q9M ziSEsR%@*BD%U~sLk-ftgfb&P^&#^uDSHAQ7FW)aze%_tG)b`+RHT*F+v10!Bvn$Q6 zG5g-xkI#O3cF#Fgem%-V`z!Oy@{i`9VHmks@*oKwIm3574g~Z;PP(?xv#xqtIQuq_ zHhKNXnODr&O=mkRua`+1We0f~?-7te@m7S-5f&fMs4zQq_D8el%-%HnyV-xmnzOTJ z4-M?NWCnCxYB2me`-|BVJ;T3mc!z&`_cdo1%w8QZmiwyJQ+ebVy$t(x7!6-bGiU!a zn|E)yZ^)>?dFT1!L4hN`uMc?7Xg24rIgRGDn)Cde*g3Dx`E<_0IV<OEnsa>4xw)oY zkb66o*?N0Oc7$)vqn9hg5418&qF&8OnB%<v;)q?Zl2Czjvgf?(s=(g13cMrHob%Nj zzB^lPNnSli1-|W3f!Dh#uvwZpXUCjxwcZ+t3Y_y3MTj@PM7*a};8{xrX1OY`U#2;? z;@nQ60_TR!y+6*Jd;MIV0B5bCKO*%E@7Fo@^B=6MvcCo6#Qu*ob8gh!NA<miSUU1^ zr6Zq7GUvW9H&xypZ`?OG&J)&ZEXvCcdUI}nk6rLpvN?Ce+>f1?P~7j1W<Q-;Vea&~ zKg=zgXU@BC-u=DJxpU?g@`<!F&h*_%Lce<MW=AE9N$#qoj&7lT(Jj===AQKw>Nk&+ z{c<M5oL6<;Ei$64zH7Aq57oPCq258_l{BXpW|@e0WdzS_Gq2;ku2_xQFspA_cvb8k z)W1%|2G8p~@6~x<{>&&?_`GBk%VDb=8R2|Y=8m58vem2U=DjoTBkR?4J*{E(cr|uD zQxui2%DkoX*38>E@7TOc^KY16e}0Gg@$<i)Kh3q99*8sNZJf6?&fmBs+28mZdt8a7 zB&S%N&6me`=V6k+-c&}Htk-R6!Gyl%{LuN8`uH1vkeuCk^!#c+?>|u{-w15HDao9F z>-^hO{EfFB=k&JZkok?~H=F;!{D(PupI4eU-pQT5RwHMO`7|EOu)1EpaHRZQC&|M! z>E`^D`EMzk7UPD+W@>UlhhnnYXLX0j#fcVAvF32)g^dJ$q9n`#KA3n&Y@Z|6hZ4u1 zv<L6L%`oS0UGQ3L$oy~TADDk+J`a&vYrGcfs@UA^M=d<or{aRj3u-U8V?mPzZ5KSX zAZ9@lZzgh=5qAg}S$Ip-%CGjoh5vAX@@W*HbbJBtD`@K-)@UE7Z(7*1IA>Yju^?x` zIQ6hxpKN3N0`KeNFy{~Z%mvdHEG=I=n_X5sn`T|L;D-el7uHyK>%!=TT^2qg19gMz z4qi~U;Iw?HgTlm&$2(|Cz4vyUxiDm5Rco>1YrI8#KXWWq+*<QoUvpu-g%2{sudT~P z3mbZ>&LEl*%L4Cmlz9euGj!eRJO<E8j|>j3J7i(p!W8$;InJGjIrAgm{c-%vx%~&+ zR}sFR`Js`yaA84V!OlhTi{4$bbVd8Zk%iwBPAytj^mB2`;-f1kuDldmdEv%|yB8i= zc&eak!Se-u3x*baRPdRT;}iHi(83=U@_5cUf;53LMZB!#yb);Rg?|<V+m_A*TO&s# zgcMv~aBIQ61&`a&Y93&<6epSmjSJcY%z<BAY0rVj1llkqWjqLW#uKkWt_E6BFu;?H z{?q3U9N??lx-S!z<qt0DH#qdSg3$#FW%42;`@&-dQ}_hZV+Awq7XLB3(fzHLS+Kfb zy*$R-$63i(Ij%y%&jr5~{9f?qqE?HZ)dR*p{auMEc26+w(1C=IMHLoRTXf5!d+nRQ z?Tzn+*8;7y3$F*n@B$s0ICD|EMIEH6_&MNtg;zZN!=Si$bJ5F-GOcBZ{yKaS)m-%2 zqM>$ov9Ibb`s*b7DlN)gG;Ps}#cLP;w50A5-;$S?jCPfIn=5=c0~37F=0$rJ9bA0P z;(Hc%TfESY$iKW1x%e4N@e|EO#}{1;$h*JBm0PY{HPKvLWAW_)jxK&~XK-)5V0v-0 z#n>6LsKmP2Ut`O8QzhA4{KDcv^6J>rvF765i=FlScLfCN6Q8+w$l?#Z&()2Rb=8YU zEuI{BhY98GaLr}ws+|wbXGgAHyvtL%h9sGb4=uiM;KZThe8BIv+ZLa)8k%bu-i|ew zge<v^X;hwzw~JKn@4Oj}Z+KWH>C}{vCHE|8x+HqZi}rk5A`7j{nI?ConM<Br(oI_f zgDh)cq-AXk<f{$l<jf(VdzNG_8NOtsJtfy-$(we8ZeibU4==BBR=CbTTb6DvnY3h< zefBG_!TD7}g(d5j_FDSgvYyL>SG0-^U9xM*k4t`CYAn6QQ3MmU>aRzgUvg}T^Zmbx zcAc-6WG=0+w3=OPA_MYgx~#?L@%+r-rS~j-d}$YXbaZKxr4OrCOe~%Aqjbxq_CMEF zK*w^Aj(+9~Ui$LVyro46Axkrt4qBSC^eg*rcL&_<%fQ-pk%ytYCF5&mx0lXdy7&NZ zOE}Ha^x%WCEUs>o)4apJVClN0n=tUV2AK3)6V0VREo;F-25x<P*|p1VTlTM5bLp97 zA%XVyzySNZ+<QR!+O1y409REQoyKBZ)@Iq`cBx28GnYNJjQ2yyoWI{H0-vN-SeCNv z&1FNEeYEWJWgB>(qO7{XQqYN2T~?ONIH8uGSfXp0|1vI~P6%F>yR2YYajdy)(lUBv zk`=7htYt9_Q%y^1JL^!cS4(lsWxJMndZmMT(G?-*TY~B4vJ=bxu+u(Cnke;6MJ6qL z9~zC9-?hBa@>a{AUmm->@A9F`$1E>ezH#}F%MY)px}xrif30Y0Ul`|<EndN>AIa&p z{0jEJ^(cCxGZ@l?GPpc_xwHPg%r1k8RKw*t%Rh5$!wPYBPvG`MbNR&O*e~U(TV1Co zFvMeBUw8SE*|TovfVV9!|9$y+oj?6B$d+GP5vn=|@92b3h7?PtGO~^3D{eS&RDEsb z><?BYPItNt#$289PdiV?ev)|Aif2~DuGmr7tguaCM&VG`f{5*FuIRJkO~-;LT9M&V zPT2>}WQMHBSuu0PvK6ai%@re8<OY__w183<7I?CkT{fEsxH4I(`j+|KieFY7FEk3P z7S?y|<j6R4#hDd<%Bs^~^)B1sUyjRn29>$rGu14-w(w>OhLjdMve=)DL9263Y+F<v zJ#>_hVCg<m-Otm^!sx=@2gt<2&V|p}n(8yJruyuJ=OuV)Jep*wIK6&zi1%F*bVr;g zmQp==+cov7!bOE8g_{cx74<AiDk^k`mlEC7PH=6E(!%dN2|Y9=xbQ?#m!fBVA%%Yy zJzUhjs3R}j4JoQnbbHagMa>SJKg}RgQCQK9hZr1E^N=zot9Hs9(Lq~uh(&$s+^+{^ zEl$v~Q)PTW{4IIyZO{~1&_2{Q%I}odqFWEnS37z7IB)8d;iMz>r)`Ud6pa<@Y;a_a zqW6nFvqm*vv{IYJqAm4QS!B(k8AbE0(=WNF?>}v?JFCe<eMMV~zNa^~|A-p94w|M^ z(X8~~qQk|Ni*H~_JL9B%vu~?gbS}dz`nxz-%~1b_s$z!vTRx<5oDVCX*W=#9%l7vP zDXv%iuj2cPoBWdEueX%7?Da}cGH|w-^}O}wWDGSY6+cp(RJ^PBXTAtDIP_p~r{Xxf zX=`8nyxp|5w~NF<pIMw<JjiX{+Mo2j9Xh}G{o=2S#}?-mFDhQ!&@BF>coc(I^BKIF zKc^S}?5pPoj$q9%H-a_aJA%bU?p<DR`WdG(LyFI>yldslE5C^iF21y~(#kMLnT^p6 z<*g{Gm9<ue+s5%2TS?uDwYaj$$_H0IzLM|TX;XEexBa@%C$RmxkPy&*T|mnPugq9E zXys7np1Jy-;d0NMm7m!6%(d?sZoMvPSXS`L87m7`ZgmTKyj##qR<80C^uel(m@B_s zdC+wo=el0Gk`A%6`aQM3SrS^3;xkLClss_ctS`8vW=WkA`&GXYebda6h?2Xt%6!vm z(mu8n;%moF4-77Oq~ytx=PX?ifoiif_tWjTG^T_PLrQBn%)0ce)c1`>CGVGfUNW|1 zMaijERaf1)s>7;os}fdatomft*Q@5)Dcj3QBkMiF*%7fN(=Q)n%855iR+X$*b94!q z)g{|XzIUJAsHY#}$PTYpa>%VRktBD?pR1hy&mlXx6HsBRu3J^dZHIc<?NHrBbJe}8 zcuPsScIY;z9UAP>Ro7nL4xMq^p+;%us)4KgI%TqGhgJ<+^`2^nM(B2k?;;$PPZ_<E zVXhjtDo-9zK*ubxi?K0>r#DtDSyd?ZK$o(UJg0YC*Q}97)~chc&aAGp`q|a{*Hl=O zy=LT^lG4hhFO<fYep`BKZOq!&SSha72^oL(3R!h&b;#<gSJ$HBWR9@M2}U?QC|T~o zJ(J^tSKqPv-qla&F4PX`@T_jS`hMx~{G#W=vW*L??dPxiJBDl9_|VmHt5a6LwK`|@ zZh8BPF6mG4oYv~B)q||ZEnd-&7nwCx{#CL%NN*W`tsb*_^6FWuSFhe=x!hxQkutdd z{MAc!aP~R3`(1k!^qu{<$}Z>Ot^<9{)xWMjrXSw=Bg<TUdiCFSMH^w~e5HioHP@`E zy{5M_Mb$plTvKOFedp<|U*+ko{58$jJiO+yHC@)cWIX~>#yFl8G%E~s4$Ddw>zTEq z*3(<ZJx_0C2febUpR1kp(@5@8hgyAu*L<;N_L`-R#V~2jL{E*)a4#Kbjr#UTHrK3M zb1Bwbvt`Zi`XR2qYrb9M`GD(j_equ40$$MD+8t}`mSUEMl|K3lW}!TAGSrAEy}k6V z(x#<R>O=LlJmvdgw=y->52<uYG)tc-?IPnJ|Kj8+8D=r$VIH2R49Z9gEln%!U;1Y0 z`=w0sh(gG>7AW{JHaw%{CF;wSLxNY8eqB1dbdeqE?BMmKQ>~}L@~uVN?^wqhnd9wi zmaZ$^=~_9rsJ3}Wx>>rv^e8i|b~a~}$s^IJ8NsC&)>dBIoWa1;Zfd?HYm3db*R8GN z>di-7y*Y91-JV=XBo$>A$z0oZt>>ecv()?3JZ;ZxRR9JDC9dteHp4121FZs+l@+>n z*xHe6N3ET`*8T3xJG!P+MoFz5vv!JIRNt}VP`TXWS8d$Y6Kl7w{dVn7j^-@ZKDBX2 z{fa$q|6X_1x@#P_McQp^*KJY19HZa5#_QIs+p_N4^`ET&YW?3EDs4#KkhS5R*pPJ( zu4}jM#dQh#s-}c>-Q(-J+F_k<hqbAleE!ID{f36_T$j1-gLSjkSue90e4**O>~(K1 zXzIVv)V39xCYb9!UH6UE_1;OZJURQq<Lf5b=N~`2|Ez5goZ#cw_P+CZUwI*omA-HK zDy%D8cY1x3^$)LqWWDFj+>H`K)?HkG)%u$2>)Gwign*X3Z@HE{DX=AX-YMaa{6iM3 z-x0-%YF1jB>pQRKJup0S_c}(bFJyh(`jqtp*AEtDpe^jH-7<QYZA)%Yg|+mYYtO!+ zEwG%#;PvCz&s@LLO~v!P-ZD0L{i5|N*SpVuZPdB&gqwF8Pw_cl-0fd~c)k1H=pou& zu<Op-cX}o@ctiCKH*eqpK6_E(0A|+X%?<T7bg*CHpJHxkyx}3YevEd5cF~=J|7ycC zo~q(;^QUxEsQt4u%?+<@7%WfJ`Rfd_j2u2mzTv|SU%8%t;(C6%{|83@4W%1rZ(Oo* z+r~dPJ-F$SE%moNwdKVvQ?}%9S-7Qm%lg=g8}@D3zv1wPvm0;T*lJ_+#w7h%+7NpQ zV8iEJuRrK(Zuo0s4M)Wu-&oNT;;${e+FhGc8}HcI(7p71H&n-1m1f)d&-ODnKDqH3 z{e{lRoBue&0|rWw$}(a7O#a0t{ew4VZXC2R$1Ziz-con*nCF`~8^7E*-gXrc;Ogz4 z>|1`1)fH!MEZMkLn&X4^(v+-tbK{<kKRKg~Z($Z~EZfKnx8&g>f1P1g^%&s`*%Y#= z+NPT}c|NT-lFQIx`}uCzZMFNFn{L~5x0Oi#$ltAGdFi;_?R-%;yLGaenDABH^!%o{ zO$#?y-|XA`(dN~gFFFr^#+jQEH!)Z$ukWb0eiK?)nh4&1xA!=!+fUkEp-t~^;@t-< zw~oAK)8}rgwN)LU?8s`Hrn|y+@#dywn+}%oRx*~#)LXNu)Ow8qZ<3JVy~C1qJoKi{ z`|FkRfX9jB>d}ur=BBfoE2z_aI8d*Ythd75U3SE0Zmzw#&B4>o1)J~O+`QZcE8Po< z<dq9N4&}sS^D~=Ylz8|fuUA3$N7hoKWUhbxHxDc4-y+w)g&Dz{zua7~xiHz>oV$5C z(XcYS-n25*%CGuO_4liJF@L?Wr_nceRLC?pZ`iz>WeRGP(|<=bnzqaOnwyVrKC1&( z+X~nXjMdr6vgPV6x0DOjd^c2c6U{9RwzPEX!H0d#Ee~($;FOLNR_TcG*a^?3hHUAx zC4EcImT%k(Ke8)OcI3$|Z+fa-@09HDsar;Ru0P1Uh&A3tKU%4dIV^hZ<F7Ny8H_O( z+ABWa`{Ni3@K+2NVGP*v>z0#S{@z+)>up;bY;Cmlp{?y*9sHoXenY=-jLP$Cyt%dN z*6W=*^PanMEa$)>S0g4T`h%By0@&RO)m%3?KM(xC7`QcK+hf~ew~g4*XGiJ||Bk{P z8+NYU`TNelcU9bV%WgBa%GR8%pKl$zb;{ORTNiEJw)OjM!P~;NJ+%K9N1Z(Bw9K=# z$^N%i-uF4$tP73q*21l8?M8Q&-RR!uCiT$1=GLFLUU1ahFI$g$()$xD$DTU6U)E0P zF|8-12qc-?ZroPS^=F8iWj}9g<nbcOV?W79;N#3~PjBlk>gbTIj{3)&+xl#K#ZFq| z66$E%fNj~fI{Ls;M`wIjZTn*T*zI}Smu~-VNBtcyBvjlsZQHzUySDwZ{od^lZXdAy z9a|wj_LIEk!e?$<v8~jWZSyM03jtqEy~rDn?T?LxY&*Bz*nZ9SI`(yUc(1$oPGG}- zF(;tmzxZys)2Dc9YkRxxd=J8z3%Ph&CNQ=?w>=?n0^|E~6Bykuo50}3lRRXJ`Ep7b z33dRt+RFABo`adVJ>OIM4y2mfi?^@09ds+d9{la};O)QcsJNrX{zDX}KaL;8{mJbY zY?~<$UEr)!$@9Fl`SCNCuZH~NluQBl3Et6k$3r`wv~QVxg7-sv-g!O5doY;i)a-kG zX|)v0*z#CF(7YW3tRB+2#Lyk@?)ZGixE<4W%ylbTmTQ+kYu~KbF&+=^<G<rR?{J~F z+x=YXRXe`hS$F5XJDcx(ac9oXPvVD!?%i>4$Dccc?O~~wJM5Jc7h2k3+xy4ycyni! zoi%I$U(R7oqjhxQR<|AuFSElkqOZC0!JXZlnssPr2T!&5%&J*0=*qOS&(3t$lVNUU z`gNyQ|D~L^o^3ic(A@duPQD7aGk0g6Q{jhm%lw@Mme<yj*t#?by5e4)X71d)bC=eV z^N#<@TcB7)ci>oJcJQk^54z9qK9ZgtG-)SKl%qwzaMe~prn&2yT{X2y_J?JXy`L4j z>#ki*c0IH!ewXK63U52f@NQpoSG!$3oMbq-tFtE=KDENyGb4Cc(yotoE%~XekGU&z z*PCwU_ANVpy6hnD`gcXiM|jf)jqt8-c1>}meJ*#Hs5I5Cl3knK#C^+6+ylG3<G;y& z;N$UK=j{y4ag3OE{)jbqSK57@qjCSORc*|x?;Ee~zJE`fJx}Zzu;=5w3-;CB*KuF> zeewJJ`-bluwQp=}<=vfkzp%U4?!?`hyNh@Kxcl&)YI|;S%W!X{xr1KS-o4;<LtjV; z+5N`uVY@%wO^MediGl0OS0|dgzuKJ_pg}IKv8Q352~<j@Whv(FwY#0CBO3*1w0t{3 z{E-WOKhWFUeQHn8uQW9Fvw)$W{!Z>4vy1*GCx3S)K1cmg#!HZP?Wwn?rCoiR?TNIj zMKk-7U2c0?D=v6Xw>>@fr0emSH>5$>6Tc@>8iX>dL8vqG%*iCbIg&MegM(h*Gk8yq z)e;2pIGcKF>&Lzdd&cgWzGwHIpY|NxJKHS-&Ew5IbM~xa>VZel`399U{PTrwT|BQh z`nOvodblaD^knM0M&#bgd#~Gj%if5+5AJ<zZ@0a%dz1F|+nc?2xSbb0osw`+XI*ca z+P!!0b>4q=&~9pbd)6~m=;=IIAMW=k=`eTTPd?S9NBB-S6)!wZSKrPIUo+>o_mjQf z?49}>HW_bjxp?W=@nhD0cvby^wD2lCWgpDi>b*<%u5nZTI$y}%t$V-Qdt|StANg{* z4{H^>Db_6B-23;wu*;M3^UIR*`^4aV|Jv7dUzD4q-Q6TD;Pqm5NtlUwYQJpmQ%@2+ zpK9)Vd0&=${Y&ok%Pk9PzWq`}Yx?0s`%Ux<vdn#x_pyr4F8<Ez@BERA4a4{(*f6H@ zt6A4DW^laLG>oMj-@tJ$$2W3(6F+-v=S#|rH995x`otQ&(_`Z@6H`-+gn?-Zz7!)l zHZGl`<SZl2m!6m!ALmQS^ridajf}L|IG@oqE;TthHa1SgMyB_`^1K49%C9EBoB7?& z?+$)V`8~idn&1EJ&6l2@n$Asp12WTNWBMc!vzVmBjLevf%-Bp{hF6{;VHw4*zU)|A zcj!HC!f}Xw^8Z1S)d5>YjwIcKjN1IaMeRlMpW=Wl>Xc#BP<zqriHjhkGkZ6vz3%MY zsP=lYcaz#nU{CTg$Vg+an%Wz{UYOeRvv-@?8_u4-+aC5FRkB0uwO4!R*?UCojXJH% zL68wWqH9E0^oWiT6`zeBawKX^NCXay==VYuMzrJPkk=zR8<|z3bJ|68k8as6qH}s^ z*-sQ^5p=G$+!zrOp?0G$6-IMG=Yk;dp>JVObWX>JuxblJf{=!Y6Z|SP#ZB0nb`g?B z2Eq`ItHP>yU9sAG3$?T=*H#QJ%_-V?p7XUiUwiA1(W8`?(ZQwBIYr`6xP31I(=j4k z?p5?-#YH**YY9MC5mv2SrHD)4yISt}A1@yA<D2+eKPM!Dz|_xDaSm4jK76Mo93)|_ zeW?(46%SXGefFxBJ#gvLrLqm&SmJ3VQ({2qR7%wI6NI-4vpU$P+(fcYWj3%+nNIq7 z;uI`#!YheW*-PB7>{;uk|0yd}@^}M~*-+<)&ayE3maaQeqGd=#W@y=Y0$g?{vHR~A zkPso4`((%K8ts8y0s_1{EEybfsZ@LjbVlI|G2TeM+*?nYsC>541Rw5+j+1}ovpX`t zk4PyiI+8k@BXu@kRhCX%4~LdDxp?VP<HG16B~dXeH@KTqReA<^msV{#-kr~?_Er_L z!#<@l*E*F_?X43erF}|eu5~K0+FLt0MV-)<kF-dmrUXlf>LU#o)pxiS;&7Ej;gUr4 zt?E{v6bd)qh*h#`3yk6IB8VIRh8&9I`X-!iQaQc8C2DPpDx_D&=O&^+4p+guCPNA< z+vmd4&BN7^MHKxQ63i*&5r?zYeX{P;_gOB5xRSUjd&4S!^-%>w&Ns-qTBOw$AG)<H z-jfunWVxxdRmZm#;Ecpqm&B+w?IK!83#OvmLPfWQIEb<x5R4X9bfa{1qa|+9I=US> z-O-9JB8jdN>F9QJqT5kNSDmw?+e$~bBiFQ2(QRSAd5^j`F|(rEs_X+R#8FmsD-*a@ z65YcC2zzHYLU_~t@YQmCcPs4O)q(OXvzon6l4Y8Q_sC(IXxHxjxMx?cL7}A`67TS+ zv&VIoD4@=AM>!$;6w;n{Aq~{$s-#e|wT5mX1*&3nPDn(KQEl-FxjsxhuIL=r;HU<H z2+L|F&Lj*Kb1Jp0*sqc*w}+z--y9&%s8m30xpX-4a7g3A!~Z&5-@e|ypw{7<w#arH za@bV$D%=jTTe;ZlNK+IpSx`HmVTvSe!zD2eOL~VZ^&2iFvT{aG5!kgoE+pID)r|y6 z85NyVsuGesY^WR)t?olwWgA)H&f%JnY)Y%NN2FOt(zR<u^oSbSht0zuki3yjSXKJk z&1IO?T+$ANL=dKsh#{>aDrejwNvG9MPDnP%8J<<$O3nJ*N9;iS-GIMgj=y#ysQ9;& z_<M6Q`v^@xt@7&;k&DC@DiG(VrbXwx8xf|epKh)jmqd>k8X;<i<PsZ7*u!E^i}4l{ zEGAh@vzTddfW_B^(K$mSYICPGQDUwb9EEd4C5nEpV?+~CiuI%IENYii`bgu##nQgp z0aVE^2jWNch}M#IO^j-99a3h5_BuKzil%mG#1^hwGc=+^?!$ICjGM^;>8p3Fo43?Q z)rMfz7&)IPH*$*>+~U$F5%txbhDQ9z+2|ol6^&{`i{ua=M67CJwV^ZF?MO7bcYJSX z#3&9to{2Lj@Xi4N*(2^Wq$<5tm>C`Y9@Ulr$SLa@9UDtFf~w~TBt|2mY3#HFbzjkr zyo5HA&>NYxq6x~6?0MoPXUfWGoc?1P;f36xaz=M<AbUezAKE=AOKvAeb{)ZcNp4E% z2-7}AXq9Z}P)Umst*;oy!|#h%DmNwDtZSn0R)$&8`CwA0RPMS|!N_{vb>3MymtyNA zlJaLwR5(`{jSH!!TUGhUy0xRWLl;ZkTr{4u>XNHvk1Eon>@&Gw8zGU>xJWA2x!)-l za_fv|EOB5VC8Rpk9Vl$5nsx}pdApqdQer9HQu8F!#eGLzzgrhn6xkLxdePyB#F;Iy zydM!Q7EY6#^U*mQqTiFQnT|@%8cDkoazWz_`oioIsq4042-JenwtbFgQM$q?jm}X{ zRBffMqu&crrm@!SA_{Y}C3-6XK&RV|xJ23jR8+-kLsqC@qj_)<-LhhqGT2Z<ArWO0 zoKtqgA(~UJ3(u+~ekf<QC_~-5wl33neYmpagnQv8T>QTq(>|wA0#p0)z|_uAmUl(D zLG6rsay515KgXo3q1dSCUn8@MYT}|o4%<zQtG+jQwd#-~k)HI7&Jh)Z0ZL9wrjms^ zS&>PTTaf@%m0)i@#GdM#a7H4edoDxPa1BR9zN2Ig1<c9{mCBN;A*8BKo1CbS5v1!+ zS4`Ism9E4>@<KUePYE+5AYm$)y7Lic1y0g5M5QUIB;6)Y(84mL&8&#0VHvl{9&S}c z8gH|z3<4)UWp|T~DjChg?MaFdZ&Kh##f(Vt<DVj_f~!Mr7ZqjEi~Eof(oP06ryEpL zn*Dl2m`R~eugDF<<c1PWTS--05z^Y;SB<(|H>44Ct{*1XixqOq|M*(DKCnE5OUPAE zAX1F57S?Tb#T-(C$s&F9>ij~Cqt4!UC>|{vLp%I0b#@&_Y%R67lfCQJ-XZoP)ZPnM z>G7Emqm;d#O4f%$cc<EmsAL%TsJ({l)lhrg*}GTm{lT6nkPu@~Wj#s~VvJ?)IVH<y z?+&$hLlxV<2iUt?$-1&vPwn+%uY=lqjlBkH?>+V!slCzH7>4wgLySE3WHc$n*vB4! z>>YGuw=on^N6GGB?=H2MmYR{75tp8rmU(Yna%@@#Lbau3q{JpO_S5$M9-Y%uU-rdi zX7p&CmX?$l7c0YG89g%7`z8AN_h8J(m!1-v)T4L0&zCtc&DSF%J+6m!HB3&8&r0$& zh%<t!nMSqrDrrHLO{4Oh3Tf)N5y!Pnqjr}XX+hVR#x>VgPP^gJVB_YXaHD3L4v1)5 zb*@WgeN7jx2@NtrIqy*X#xGI%4fzGDOY3Q<{V%1pv9=lZ4*bHi|CDFHvZ_d05KURN zx8a`sX0{MYM%Y`Vy#u9q1(ON(o~WvpN+#JPg(X-G3+X-i|Dcl9=KtMl?`CH&oV|yY zOp2uxxnMQyruXE3YbBHWOW_MPBt7(A3-;P7Su6gF@4-ftv)7Kj$CNCZ|59m!jgHP< zXZAWNSy%qcU{|ow-P!BGo}^r`su(f=7Hq`xU+*Qb_q38F@n7N+Y>;u*UM73plxzV1 z>#DuiojpH$&nlVpS|rR8``<me%As)|KToD`B=HY2)<)hG+@xQ<r1yOFZXGtY;kY}B z|DD()yIRS~I{QPPD9zpc!v5Q*CY-uqdQOEewp^IF|Ay?PJAZGvA?ehYFSWREEN1Dw z*Cn-F)pq2&7iM)!J2N)B%Bwc<Ty0Sd=B71Bj6XFvB<Rv5iC0u_Uu<TB$jA?ag8Y`G zUusf=<ak30pO!R;Pp2yN^NAM{>fj&=ZQ#}*-q$OuPlP0!x-vK@|4GB>9pK1vBN@V- z#UDxEz^y@gd@SSEYLgNe9F%)ntG?E&CT(}!$~oDDx|&D{hzgKMt;$D{xNaUoQW)ly zJdR|`bzVtNk)ZwDt1?7_rqz-LnW&G5<P?O4^od9f6q5{zhCdnon@IIG3`7#mP$OK$ zRu4gccvAbL3q(F{3Iimokkmfqb+aGIhp2GZA1*L*QKYV<64`R1s#kI=5<hWw-84l~ z7$A89i3}7=ymWYC<SIwfz|9JSc7>QG@?W+t58Okp$QJSRqm3Iki)<qM%8l$8Y4{^! z$olTuO~b}g8?>8@%=EbAG;t|gI63%AMrwMdKC~q5yT)`)NKfsrh2loGq2jaJY{@5= zNpdffEVLwUYHUHWh3s=B`;mM|@Lb6SB#{9rkJ>MH_j@jr+<%!Q`ZCFLmq}hh@)Y-z z5+!M57_T9zt;&xr8II%@M-uVKfW*v*hK=J@o{F0W1KbQF*yL9{|MAo~mAaxiu(nUF zyDK+FgEaRl(e%MVL-~IjzYDGRR<|wz3#_Y@8ztU_M2@sSB07$QVyL9LL|p}_a2_|| zNTejV{<N?pu0PKsi3o7>8j|n;e{zvT2Dm9flIxUSP8t73G9^IrCz8SdNll9XmH<gZ zBp*_~fmJU$v0I-bH-rgDq*c<fXn@Yl?4`9Cwi9V6ahC0;v9}G>doj2{t*TAAQG0&N zAJ^wGNTNCCrq41Y?U1-`zD3eCz|DCi9Ru84Pf_X_;HEJWxytqDX(SSA_g?8pq;+)N zypKd$I_*Z)<)%%Vh9l8+xj}knTttT_o=0F{84`DKDWy(tR<SXr;*V^~jiIjUs;@$o z{o_?DtgDn8b^T6DA_u0?ATFVAMzbdBjFi0Kpq^^q`|nq-u#CGHZQ8}eCB<fB7`@eO zVM=^#db~A*sO?AOOp(So2N{X+)<I@NnP1db_)_9h;}cW*7zlj>m`TlyaYXnK8=u<C z=b4x!2r*eHiCp80=@*-n<&)ccXD_XjDp+2*6O8i0nAG0AGklpD9-lK}5>pa00|api zvFS+TeFH8Rr{JYX`}kCh6H_u%GZIu(ZK)GmR5o#ydnuC}AF-i(%XG0V$?#!a$6<ck zX)V55LWyg#FFEFwbYE;zQfi!iEC#sB27Rrb!A(j{?VFV*V)4P7jyf7*#KfliBsIw= z%zt7Km*9)*8<3omY*#*GCA1OKrEA-mwsPUqnXz$wpNUP+(6SDsVVl?tpFVmzAuBUJ zwSS5c6Z7cP(PVy-FI`=QAj21zm7bV6(7JydAy4!f5$#j6QsN^TH8LWeB!xSWQW1?B zbC8;8ooQl3WTo^cIuZXE%Lt{H|HFC9gUgDQb>Zc5>w?RY&${4pxqF9yNM83=|K#95 zd12?nfAYn4<Hkl8@d&ieljLwjq~x*Xs@$oD|9q;^6;DwD+W9i#u6V9}I(KU)wyB+S z<?m~_@dyad6)*7A$}3#vJ?o~R<EuKY>h3>Xt53R@UZH}!mtN^);H8&ofxwF|KkZzu zl$WZ<wkB{cz5JA_kap#B+7%_WE1}bFc<Y|7b@w%C*dpAsHEiCnNsA^enl)?e5whDb zGO}5-X0T!NMlIC2o|WU@u4;Tfq*?Fk?*$p}TWy!O+at}17#pYEc1^c1mBS2g*GGgK zc455G>Ydo5om|U)lo8g(+x?L<((q0=s@>TCl{-%tNaVS+#bL+j%AC=zq;ni)bdK_N zMC8n<ehg2Yqk&D)fvf<+jm|y2X1uubVFI-u5Ev2sEA*O=;_e9Hp7vUh@wrUDvPrue zWkg1K4Mvgg!N0Y*89P|JJ8Qf17)9c)GrtGl4ZN>WIZ~SfmH{E|#C&)Ucb{5r<%+1V zs3<4v#Sxph8-tt4<=uHq0&&-q-)zf`9IFj0graa?yGPo$?$)tu#|~}ougkx-Pjqcp zH&EKCW4k9?Kk>-Zb;Gf+jNkcv#ILInq)g-g?;}mAy<X1fF`!wK9_^&V%wSW3YDpU) zH|{rDRhQsyF|K2r?$ltz;S-6h*vd%lof%%g%U$7}(lQg16JMo04sT0am`H<Ug)I}d zGTM90cEb?MUre>8{OZ)=pWe7L)=6rw*rbe@-dQPemg#V_ajk8;DtD5~))rMg>{_FG zbveC-QISqT>N3MLI#ri0X_VzmAotuuf=QXt#u)=g!G>SLQ4`X?Hm-;DU@a(NqqF0e z^!+!#2g=1EltLh#2F5ImTdo`jETNc;xY#5g<22WXNoBRSz$nxp3Q?RorlMe_0Ha#f zt4AZfmS3l!0hUi9m13)<13l92j&wjwyjp4}ZhJb?ftEB3X*kkxb;aNK#AKCRhNPFD zpS?-^B)zUiAbBX;In(e<oG(C$&R?(#yaZz*eG`8gFyZSk6n+9Lzy+`pTm>t`9k43= z8D0$~9jie}?>gMOWx4d;Wu>=tlWz=6?_QX$88M8sreO;El2vMl<Bh!qrnVFq3H%}z ze|0TG%hjv5Kqe9G6eOO+WTvJmaa5qVS865$+d5~KC?8^z68oei%fdwQ8P~=sCC`lQ zMb3*%?w`f4Q&1dMSSG{fy2$>a+`XEbqMb=+L1(MZKDmvgwhmNEYD`8#YAUw1lx{=i zS4Gmo-Xwh_zhq?kFH2b8%CAUxJF-TwF>DH3!Dg^MY!07>E#Uz80DKp=f@9!=a4dWn z%F55ya2sq3CI8w%`m08Jcm^`O;Qtdo4rL&yBfJhi0q=sH;FItv*b{bv8SrVC1-roy z;j?fGWN^YS>)W1(Yhe$#9=-&nJj6gLH-3JN%axlZ$Qbugqy4SC<t9edoJYlk<H+8w zTw;Dv`K2yH4eAo}QJCZ_9f{QRfsWphqGWG!{{)l_S)&G<MP8k9E@8SB-UhFO4WQ_w ze~O0`AnB;4@_XP4@rajV^q=*Nl*K46FCUL^WLJzwXHM9g++X4$-SBpnQ0lqrJVObR z)br+$Ar}9$Q0jXel=?2=t^y@~ukb5hzXyvuexf&`-T2Xy)%jGeK?uj0y<IuC8c^cB z4Fax3$Mv+Yf^tuZlMH@zwd4$=s5m9Uo00W}_rN45btV~hgekBGOod4>4NBNwf&Y^@ zKH-UDqyKFj8~^X(xRfwTS~HBJ;<y4z91Eeuu?R{Wi=o7EC6qXpK#AijC~;&CinjF8 z>g+mORT|hwIXXpwui?g#u8GdaSZ2Qls)FjL=GvPl3m>T-R@u0}x|oBVf`X{Kp|<~O zd{HT7Q4YEk+y1KNauni9sL)P9sacsxiBt$_0&|fDHm#yrMX$u+bEhB)myE(_Ei4Nq zW~+*>R&Xn2AAwA3VVX-{N`@?4mnI{M;1{@VnUhfZKHPDxmxR|eg6$|6GPXBg$68cK zG)}e7SB65ox;_%2(>litRFP=mIJ7MRsm=8RTn@k>AyAIX)TH<r+qK-RqjRQrVrC|b z>&1CHM<~v{21P69j91zjX*dz+6qHWKRE!%FTh48hBx~$V%7Se7@w11?ud8VIrF_(c zQs?Tx40tPi6*hvCU}KmMn?Omh`{8c*0Q>_!2(RH@55e1E6l@4v!-rv8_!w*lyTSJG zMc4sKcjR&S0qh9J!%lD&d<t%aPs8J|8@vRcf#H<*?vQrPcmdKL89iVkd<m|Bu~4Q= z<KaNq8%}_UumC2(RWKEr6oxE#J?sa=VSo4#900q(fv`7x6}}1w!S~^t@Jr~2)JJ15 zTnC54-7p9K0N;hblU{@QH7nOPc1I@dP#1oGUC%$gi5;#gMQT4^dQxnfs;#th&gQAD zmIWTpxs1AYZEC2Bas2>UBTpHLbbKN`t$mV24Y12$GomHoY7QlAEuqBWZM7fRmncCd zZkO}>`wDSTW>}2VI)>xS-Y$=Z1gyV`hPK}Rv6a_tNrLSYlyJx<dR26$Y*AJ`TEnIs zw}I@-6te$G_y`oe(jI;ZsTZp3N5k11cYqSF$DqW2G{1+-<zXLWa?e<P7ymi_K6&1z zAJ3uu4>Qx73btJ<CV<z5mGpBn-IKp|o^sxh@X02QrA?8oGx3oyKLu+*^4L$R%Otix z3O);;hWO);fzLsS-}6w?;RL_({jpbr^h%9Pc<CS00TrE^9<S0M3Qz1!0%vVjfhLFn zB|&;k5-ptuiSYxJ6(5eolLB5vKa^7=__0a)Ny+l2pU7GubFXfsY|8q`29Or?LYRI; zN88%<Bqs{_*_*^ywwnCrsXbK&WQNt~MLI=5A8ZK81OJOK0dh{pdHk=yWY`a;LJ2En z(f>Ilp#JfYc_O8Q(aZj=9Mksu55YI!1?cBb?E7pej{ppTS3~NlU;1#vpfo!8?U#Ic z2io};RjwS*#6PLWQ~0SxL_(P*v2>BH$2$KQW6$XOzsN*s_azgDs|42VzW5~7ToOLK zf-2xy>7>1rzfwW5@Wq{ES`!X+MkX=hk;znI_3Dz=+8NU*O5$d>6cu|s!jC(9llaQ! z?O%UL`bZj#gtx+vpp3132Bol!g3my7h04#bq2%8;kUTMR;rnnb<eWhsDt$5mO1e&j zlKvCPi}LojOnElt+<h>p7CU+?m;P!lM|v54+X1ZT?o)d%GuR~6h*>~&5*e{EMmjl> zL8fD?A$#4CseI00tqkUxb3*l@ed*RY$+~>b1@vFUcQ*%gr(0z0aH#X?a>Fc}bCXCH zHtC=DgdeMbFh8WtGATK_y7p&+McX~z8lS-VMkfEX4|1prnkqX|kG-x%FV5Dkr3j^Q zsEd^@Ft$l`SwCO$Nwzxt{!)8}F^hbayqgPYQ;Y>r^ygxD8*y3+?|{o;6SxA3eO(A; z31JcZ3>HI4gVj(LD6D~{a2-4cH^5NByb;!fn_xY-8QuwZKuLjJkg)+{FQkue?1Mh| z9ef*p55I)_p`^h<xECIRzrr#YN<4pqjKLYl;LY$jl=Ax>VQEuNe>CAbsXGmz`H$t- zZUtQpA_;GA7403GZauQ-N8)V?MS~1S_CL}fQskuC>U?#_e!`LIV)*|{t9VP(WW1cs zk4;K%6x2mklw3f$dy`Y-i)>PNqM;{zVx>vZ3oNSzIO<25vsL37X~wOx+E58PyMjha zN%lnG-oKFwQvx!#WmC@F8YRJOXx&?n-AdQS-Xw2jtIO|ZOMZs3Ao+b3imp5drOwkX z`5%JR4K=oP5lUS!f*4x@EV)&E*bw+B$Dt7YX;g%gf|ViV-Jl)wOFGex`S(NWk!t(s zYpAv_0!o`#4@!saPS_pZ3wyx^un)WsO4>Dp!{7sODtr(wf%H}U-@?}LC~OP=hV7vA zJK963YmY*yW6|&~*a1pee;i7k*vhYbn|cG+Ux!@A-hu<`gwv6Yc_k}0B{T6=UrZ9u zVT)=H;|hBVtPz(F9gCzsj<4m{DM);fKBeSCxRS&(YRR~4nk-82mRAYwo&4COmS~C> zdg#+OdXS6Vb4boxo5V@B8~LG6)b;{tAo1)0MNU7@FTVGLqVwb6V=x|efxV%Wy#$y7 z6QPuim*F6o42Qu~I1;A8uVFeI2N|pM&xMRt`WHd+*N@IL(5ZfOq%jam*?ApG*aty$ zneiq(51E$oGqhn0fz{w!Q1a+)_&ew4^J`m9ze#w+R><ZT5}23Dka32;V^|yFv&Q=W zXW6MUk0s2?bP3E((GlFy%3zf{4VB^u2^8AhJC$Fe5A03CE!$Q6Brjx}LOdld)C0e? zV|lP8oB_q2nF%Ey@}b0cHk5RkOL=cnE?pk2pvRjUz|bqCiyEF+<vJf9?5(1`Lnlm+ zH%&nz<4vMI3)y$oml}U5MRfTf(iWszlRNcEmFGRky@N<n#_vI<Q(BjCk-2HDhf*%D zVBShIB-AjZ7_!N@Rx7AIWH?9FUhy&-X<=Q7i;lU}#}>$}V0!AK+)Qd}VD>k0BvPBb zx0gkOU-M&=Qjq|4BFWO1a;;1rCl_hAH{o^whx#@wPKilP?-Qe6@SsN5UJp2_6Gtve zbL8B>dy$-!=vV>gr1)z2SibFAh{N65W)eGcsB>L<VxNS}m=qs@&(L!^!<}<UJ{G~m zCuXE6qx4-zuCGxiZoo6Yb3$EU`(-zwjutzKyD2&~*rU8sR%PqL&q`5)`3*HLwirs% z(l+?}!=><TxB^P%7eR?rF~sgN*1<~Xj*YN3+yrThj4dz<ZiSD)-EbV-2f3H=J;X2L z2Z$TvM=0&ket11$JqVfSF@A&H;bHh9WK7JT1W&+MAnOnOes~6c4$ne~)1Pn#q%HGH zNeD5qB_Z~s|2N3kv7dQEqY7mH)u;+(aWc;@_#cNni{Oug*TQso9n6L|z)_Gli}=UG zaF_@0g)1O!qJIs%4{m@m_a*rs1rI^u<i7~pz#1qq>{NdvD05e>;G?i3lsT+tU<WAU zZ;!!#Q0BCTK$**uakwYphp-DA4ZFfzD05fyA!+8{31zP87uX9Phw<<t#4h$<O~vj5 zYrq6p2fhsNfuyznS(pk_U>Y0*Nqhfbm<dP1Ech`T2tS2`-~{*voCV*6YhgD00S<xZ z;80kB@;Dsc3O|6NYxnajZ%;_2yMdpynH6gBPjBV=h)VD1(SD_OMaS4%MSBO&wS^sp z#A{)TW{XC4xw7qy)Y4+kD7<LA?#Rn4+xp0)MfVO@g>&rD>UzjpwO4XKdy_lJCRJ24 ztZZGFw~~1Gg?GXv*a)UTu`N@fq)8f-w3|acD&KxDkTTD?e0Wu0+UZxt$YQswOdrb_ zdnfU5gFGFil26p2y#*$px2OGd-^4T&qSi^?)VKy&IM?gc2-N5U2uow_x7~Eit*e@j z-YgJQO<`9~YdxEo!c>Ix(c=;6d`L}CMDdIERc2q$@+Z>Lef?Bh5yctpb1z@-)O0=5 z(gUIPn%NrsmKl`<$BW(!HDn|(045=mBBZZpVHd0NMJ8FSWxW&A(csdYNkgY)z7)69 z?%qU?+DSoj;v}Opc4zw}CvwR<dy_nqts%cpEO{<@EcwWozM4zt4M_e6IGzEYfis~h zkx<fnE|jsg1@LpY5RQiha0*-u>6aTz;10M9{sar*5x5G{$1zsJV8VcIQ#NBMtika* z_%FB~ioV|npM;wscCE1$X2R|84Y&hhXBs=<`|w*h3jPSCeb^7NyNsV8ZIAIYEP)3g zZHI9XqWcYWssAGU4Wg5cBQOFUgVJ9+3DKp-Dad@jaR$c1a}b?nu<YHBZZa-FbdT{D z{1E;PM?rM7KNlLzHBN&eQ0h)7lscBpue>d|37O<gDZh$Ws$<SHfD|Zut7z{8=p=6) z5_2aUR{?`e9{rKv`XFN>YLjqC374%ZVV2{oVQm-&rKnbiQdX{mZ$R23{{+Z<kbf4e z1((1Zpv37$sPqf_P0QKAOOc69y?|e(z_{C*B|b4-X_RoB*jr%arFSn$qiY8vmm-jm zT7rQ}K&xd5Vzod#(=K8MsQNCxZmBDp1mh|zDU&*8uUSbG$JQocmQ9w@i&l{>oH$B6 z>cX0^9&8TpfX~DFP~6@P--7o*>0{grN5V)r2R4S17EPd}*(!eJ=M1E;b`8JP{3-{g znf3av)Y$l#v{YFr@?TQU)>7VLBZEbfcv@Ko_7K95dmAXxUWnBHPC@;wnPf>vt<O{- ztYlPe)`#NS+9V#b$#}?6wMSfux5N#bMvad=2=C>XxkXj>T0<YlZQ(1h9h5To2$Xbv z6n+e&;W*d<PJq}(s_***EaJEul=Q<^Qt2!@tb973Kqg`NjbD{3rE^AXKc6?9BXMYN zfhAPZIf_%|(>WSh`E-`1PkgbPKIz)k<~WVEy;D$TEYA*zcjXgVvO=;)F4kFbrSW@- zlWbB}<;JqTNE%2yW8lrOCu{&?VHAvqu@HMw+4y~+^mApc$w(+`O>$up+zki81Mm$f zY4;}l9g2NjUiWP!QcXEm3aefzjh&(UEx59`z{K?$6!I*WN}eBa>rHJj&<-IBTxcPU zw<O6gs@4ar$~ccW(3+D}Z-P{3m>!F_2O|S?thf954vkGDKQ_tO?$FLyxwa?Ao~n|e zy2uF#=c^FKrSc>Rc8ZjNuI{Dsw26eKvm?^Rg!jgcxG5twvWe3)$EiE9FaVk7=G4>6 z2T{Kv(-!k%lkobX=aLK+sZj{+NXfm12Rc$V&WFg{qUjB2ZG69<t__=%;VID8+lfk& z?~$acP<)L<=R!)1vex86spi&&1N4Q{JraFkuIECvwBL@hU02TQ6vG)d2xU^XR{V}w z@?n%^DX;Ir$KVGr9exBa!B1caZa;%J!q1^(KWiTRE#OzM1N<634|zz<FS#@kegh{# z#*>UGuoO;(JK!|<Z#V<WoW?9zorKGWx57EF5u69<+ZpuX)ZE1an8EQvNFT~5fb^k^ zMQ{w1HC58zl{HoK;c_V1T?{wDmGB2x0#CwHD4E5Y4gU*pJsbo#!*}5pDE->4a3$Oh zv8jw5@b(bqSRguF)_nTY;9fWu@*tj{^<2gekZX;9!y|A%3<<@agDv3!*aiLyrGNPw z><bUWH{mfT58BaJ^?wCV!Eo~NJiHVB0q=nq;B1KB{`oKzijHE8^Rl%H^N6?DK{Mgi zSJF|or6SLj`I2K*n;XRi_Eyo}QKs5;hIeV0T#=Pb8|Vt<QKtZb(@T>2?p12#n+k8W zk{RrK^o^xXhO?_HZmjAhNoB6>$UOZU39NRgb&6aZ=E&>@J#eN)W)w#AV-x2s9Ov%6 zA|09MUiBTJ>#u8bdHXby2eLKfXZLBUkY|!FVNhavEqny>z@}RNR|~$x@eMEm-Uy|x zGEU)_`J`K64h)AM!n$xAjDU+_eOLnThT9<H8vY;Pz3^vvA3Osa!mEfqkA?bWoWB{o z3ATW@zy~1nDMoA92DX8nVLQm!zYz_k&(i_Qdg9070N4o*f;?R6m(=YJ=fdaUGWa}P z1AD+-uqXT(#zMxsj9&0GjE5CSzXVtVCc<#|GOP!aAZw|ORQLkq(N#a=Hbw@Nv9e6~ zDeMoY!q=hH1;%q!ow<$r{b)J69=)f=Tt>oc0_%(#_t)zp=q<;y_?>s?_VL<LX(Xz> z1=bxYU4Bk^hh9WB9GNb(x*&;6vQ)Q9y2TT_R$40EaAYQ6<0r6qPz~nhBG;CGa_q~g z=?tQ#t2P(0clJ-bkN|0KQ?in+@gi@%qbH!ANWz&ouL`x#DrCxM30)X+-CD`Ga#p~Q z^$gAx@ne&oObuw=F>oN{ZB9r*WV6Rhw3qQJ@KU`q>WVd}rc>>v&KubII1!b{CU=T} zSG?2voS2~9$(<rO^xmmH$N%L{_fufH@ME(dThMn(W`w49Qfwa;fF_*w1VGOgSngs6 zXm{T5OA5#^Et`ZZ8hXPO#c{cCd9RjO4W;n1$<^JV_v+3Z|A(vFbGjXw%_inqPgu^i zo#I-hss2x-4y;@xwt?E(@?XXvWE)1Ek}<pC@Gdw4iaLE4CczKjYw#oZ9%Ss){{dv| zRP`T6K`A=lKq(r$<;Z^;=0ed?<KgXaB5VaG!DrxP*auF5qKooi3Y-Q-CryV^P-a6Z z2y@|lI1g@t3!&IZi(n{mSq#N4Spp@_OJO6p9Ez^taddwxSPZ+sQrH8ogYj@Zl=1ov zFa>Ug{UEQJP~$J#p^V$}5W5<u-woGsya#>{zlDFm?;+1A7>phJBjCT`gYZZAF#HL& zgFnL#@E6z%9)waf4#7`h8O(=App4HSgN!K|$01`w#t9fke*O-xg{NRGcos4SV4R0i zSpJ0cJ&nI%e~88H9}a`yJ1`i&3oAm=ot2>2C6adK*N#ZMs&lR~tQM$a^*F#ksMlPs zu{Y6X)@F@t=X2<_F+_<KAk%8o9S#tA6mqM&q6=kNNQP2+QV+|kQ*qzJ@yAuaq6|f! zcvZU8Cn@!My^6Ekq#YuCJJ&REE3G>hDHV5IT~T}lH$bya=gi9#Q#QNKTHzO)%c~on z!-*7dHVI)o)GpobQv$NN>NZ~MCD1Z@7B_XtJ2vqq4VL$20J8GlctbLh^GuJ(CSLeq zc`t?|EANGCN7dKSzzuyk%8G0R+gX!Rn=&Tl=w^5yyal#~b)Y0A^DAn+4?Eib7RPmA z9=shcg4osm^{_tN2JeFVAa=GI1HKP7Ck&0C%;`0Tk_k=WG{{SYl`gp-uHyIs_yc?h z9)(fx8WNx_ydJiL%%d66P}24>C_3hG*cv_wW$v#tl!SX0z5~0%(eMSh3HE@;;fqk} zPz;p1CjGJUb4bi<(LkyBFC*+9>zX{4=QU)cT-)2_H7$x$i|R@-)sOQ@?n=$^);^iJ zaNB?7zgqys>r=`Dz3y9zwA|(oC3Bw8tBuH8I%IA=44E!P_B4(>;^!@P*An9=aK#pA zT*#D%`((%$oZqZmsnQw2uGNOBhdHGQEbm<AZ<RCeN&@c+8f#+XB#vZmz}_SeWUI%o zi6!qto=LvE3}p>X608qXp@cpQ_J#dnGJF-j4qt;ZZa4_O1N~6O4YQ%Fs~QZYj1Pqp zy|>}da0HZjjd$RA_%5tYSl)v&;_?9$8=n^-spmIFLe}dTAH!t$8GIdn4rM-L6#N=~ z2_;>=hTGv7co62oLvS1nCjR50*a{P26F3RVe8pt=Je&$+U>=lqbQ+X0-3~uGl(W$b zkjc28%==ZpQkiA|*_WP{n#B71D_H5G8tm=z!rhZo-hwRZKLJ_!W<(0Tbl%FVG|5C= zkhESGcT%0a1zARY!jWBB*Ec3wuX2{nZcj4mI@YkaP)eum6YWxN6UA=%GOSHGy~eLl zJ5~QB4P~pzZ=TvCJxOy(*SYXskwY0nS^yt~3t>077)k(_!r^cQlwg#=iEtHM4A(%> zuZ)qZby*wW-yCm(A>4m66q}CmD)lVUHkiioF8C$f2W3p@J1BYmJ(M!R8iC8oL?&Y) z5>|AiaqWLA6Dg_b$+1aZg(uxwd-IeDYq3%^XJxUHByvyoFDoC&%9jrrr#OU{o_yCf zMo)x)tNhd*$c&gsHFz40e3MtMZr1{7`Qjw?*W;}kYm_497AMh^zaY_tQ~G<>y`1Uc zfN@_@)+Yiz&EQo=@c|l8j2M~eWRrA|4AgPf1IpzU=2qP8)y~zB4ZAvai7C7YM5d?$ z73?@N^)=ndi}%v@>o~eYG2xEP8j4Z#X9%rm26i$p5`YS!5?s{|h~m`=nWgS+R}4;{ z<X4~D+nban+1l{C*^(ci>`D3h4aUO5Fby7o+3*+?eS89b3QxkR@D$t#&%;oH@F%PV zFTgwDU+^w?5lY3s1ZBK6_$sZBL!hL3W%wSf0zZP+KpA(f1|^wmK-LTyHKEuZwcx)9 z`wg%Yyb(SHZ-%eITOeyzj5_d3cq`0<;cynb9Ug}D;NS2LcnRJGd7j$18#agc!j|wp z_#$iwr61B5N_Mt_Q{aP;IdtP8DE*KqxC^#{Cty2xR|w-VumOAwJ_b9&O!x#G1)qeB zK^vXnbl3$lwrg~SLFD$cP;&i6$atC26Gp;bkZ~&`4#q$q%z(XN4ork0<a;W_jx=6@ z*o#I6l(mkTup=A*MF&Y+6<w}fDk2`$ImcQ9<GTN*gHkgSc&b7f;Ciz2L$0(pj|!r9 zQ_Bb(V~uHR&8|pA$>o~z`e+KW^7=^Tkwi(%uPeIDo}UpPq!sfv8>;#_GPidUj?7gt zvLH{CldEDZKQjWf#*L(fm|ASolJ<o93Ry(yT7*%^b#>P(PNd=M?8wxNhXhM>q;?kA zk@9LoZv#1uns6;S#U@HfDy)vFtYD1or4*SYloqOml1e6)mg_K%80r3tmZ>C>%f-(G z$EjRy`6(kF?)9<C;Q&Xb9O`G6;{%0(n&~7by?RN?muzkL*?Q?s%A=GyKWqlG;UjP` z><WiK9~=rLro*7*#|StHegKOhFBnzp@JGV!9DfY|fS<sMq~d2V41Nw}e&`Dr0l$QI zz|rttm<vVKj)mRec=#He03|mj!bxy4ls?pSDBaaLa3!1zH^X^w2V4Muh6~{VxCqJ^ z@nZNpTmfa>ej${;RuK$?#ZYp7JruihBaDQbU@N#8J_)zLo^UJd1$V#{xD&n#cfohz zZYX`QeNe`dzlHhmJ6HmLfZO1HDDzG~!DH|jcn1CouOa^q!7x|`rEVO7Pr;+`Y4|&2 zeVcI_ivBzcN5J#&3-}k5b(k07TxeF*&p8J}(MxSfi-*eTC22pzt`jq+W_i7&-~XeF zbpOQo%ml5Cdg9*R0=1DS5~)ambIek?rG)Fs%`miHQ>QH0`pB=kUDQrSW_*8D!J-gN zuB%17P*2H3JL$_^y&x6dQ|Xkc6OPQ)L!uT$4{6_23<4C8be?wcW0US+N2opQufiru zMjx}xSX(7(07B~C7Jl|7X~^84dQ`H+65dU<lXOLas=gaGvs$Ov06vKPKKM8!V#;oA z2&KX|fvJ%C>X)@N&7t(&TEc1YemEauZ}=tXt>JI54HT=U9TZ!Fdal-{VVkS@8xqT3 z5BX!TA>`hEDG$WiFM0nYlrj=Tc`UzXMEYbmaE^7o#`S?^M0N6c(P3tc^vuOvmFFBJ z&FwAB-l1I&d?HcJ0E(KFbk<`AtSIc`(<{KcBMj%)DJU@`Mm31~vBaLpbV-n>0j*|2 znuG*SRHqe|g-)@01|$v9sk$QK6+$t3Ji#uETFyI!JaU|SOPPA{khmvr1LX4NAt_rG zk%#l+-6m??qqlikPNH_>9GiGi6^f3P(DmkXiYal{J1&s9LmPS(Obuk-!Y*CH`pClh zsi>&ZDM#*=Dm;?b`X+kh!5f~ooO_Hgu}PX!F1=1816vnu_xiPSb&Zq(DdW=j%e3Sp zDKk<oK7v$XgRus+#^w{)nB&i&l=Uy5B*i%RJRA>`;6ykW($=W;^i!aWPhcCXaewyJ z`g+Q}8k3s|W!z#GEQ7P*IXDMO*`Eu83EM(=H7tM)ApK4M1CaH5{s-YQC`qvb$~-{{ zd=ajOGGDL;%KShn%!2D7&kLz%E_2`}j>X>I0zZJ;;5bOzsMhcAgx_&Y{Z!)|d!V#O zd*KE6EtL6$A0TV#<(+2!+HgOt3x9%A*M5dlCr7Yf{u$v%$%~sf#~L!D)_<&%sz!c@ zQ+tzAYi-m>DGa$B22?;P+~h_;DHK^gGF`{?=$;sQq_WqYU00=>S?D;|7OlQWDl18A z6~EqDufD2EB&lhOVv`ejF^yE4D1@G>;MB+#$gfm`+m&-~zauQtaqnsZZ|$IH$m52x zN${efr*3&&W^n2W?NU;tGl$+Pr@M}U-B<Bk=9AdO^X~9JcrGP^O+4=j|C{G?@i<3c zB6>pVmA*uxE|LUCBJWX?01QCl34q)w&2gkPhg=x%%G8_b?4{YNPh6_wgA=trQRxQS zEO|yoZIoNTl+UxU9y|{v)Bb?8J;tB#3HUb@ok0CnW0}-n_1-gv5d1@sUj-MyN>J*2 zRd^awzt!3#>`uRA+_kVatO+H1utWXN!keM!v0LE#unv^*qubzASQi$;+u<sBCzQOR z->t^$?}3sdw3+@}ApLNEdx#zD?+Tkju@UK)tMvsf;oBVF4<%b@WBp&ic5ni04_89k zT>n=1IQ$KEf@k4V@Qz^CN5EFFE9?l-Q~sAAaZ-Ke=iyq8Ux2LpHeQ0~VGImGC-j7s zU>ppGJ}7<X-moP^&#8CYBtp?Ke-Y>M?Y^vSx}I~abv9~WQOCsb(jndQ{}(MIWh@u3 zw3g9&KxCq1uH}dMCw{3?pYO=rvKWC(>j4I=l&ktkthU{GyI;8DN?VEEdfSn6-}7S= z#Uctp*AsWvuKci**hTVVlWL=iZ(RwinuRFuIu@7n$U!!VSrl|DnSM}Hl!Zr|X<>JS zIwE@LQ7OZoj<B~@hT>(QR?;si=^E%|qX7F>x~d;gDA?qB(F8iN+d1<X_E6VJ&Ux#! z<h``_-a7pXWkt#Z?Y~;b{3#SW;xjlLj)IcJ6X0<;8CD@xra&3j%7fG^^=zr6E917R zy`2xmrdR;`!2&n}E`rkDE`g&Vy2YOhF|E{^p<*cW3oHK*dv70CRk8h#Zv+*O7FbkR zRwu<GHAO|mhw7kc$3i7V!=eBI1)m@|D3%WxXb@UfR#sYe%d6g=v<FkO!Zf8auUWTi zWjA`f64te{vRmE0@AsP7bM`qvW!dNT`{TD?;#zynnl)?ItXcE0XYT{J8*m38$Jw2L zQD})>fP5~GdX-H8d>OC=5WLbi-vnHW`+orPED-j}%GiQ+fUg361h^mYV?geAeFFG7 z;6XqOW~~S0v&Tb#JTLS)V0S>QL1o?cHDCtrj{r^q{1%YSfjNMz)6nPST;WfEPl1lL zs`P2h!OPypeG9;Pz)-;N0mA^<r!jXZYYW&Kkk9AC0Z##J1IWJW0%V{55P!k*hFPFR z;qO}fbqMU!=z!UH-d&oJm&^AtrAJ4C&A!5IL}v0FA>5$&dnIQQv7pR^SRB^oSM1f% zU-q^3_`}u`wpLJrcq0hT&Jf_ZgOJvf3|v&H`L|zyR?qfaHCJUXvM<(=zDtGK?RlL9 zo3P$^)+*0~qXEa@p6@PZ0%FgkYziP^yv$8;&O^@Py8&s-2k{qdOUy&%3?=t+&j_@o z{q5WwywF-ypgyukGuT(4ExBy=ASrO!?2KNwBb8kb7tQPj4A`YN#$Z1##GidpN7|w- zV2&p8Jw_Ms>3|ek1lSo6XKKp^0Qvw&1I`4z25=T2m&&Dp3@Ld2EN2X{S1kM33jk@O zedv3^@502klr=8TC0ZSuw$Y5-S>kIo5Mf_|_F<LxA}OHC49WXJd^nPxRalfiQ?}yj zK>EHTNm<U%_j*7MG%q6}qo)slqeB{hg=RUdmWec6EGm!Czr18_+S3uv13dU;r0I5G zPazt(FHs7L-j`_d6E^=wIwljmD4+~5P(URpza$_Ynd3vjqz1gDfGYU2i>uL=eQO!$ zs&6^EzH%pf!bhJfRjL4!Go<2EjQ!Iz9q*0FH$Sje5g%Ftn2Ge;0a<yRYf@tb;GMX? z7w}2I6@c3Sv41A-+}#iO9qu0hYz5hW0gM8C5D;@U3v(#hTl^~^&GRr|D&Ql4d4PC6 zQC10v{Wp0Ay#erX+&=+G|3rK*Lp-;h20RM55wI0v`ZIutqda&g=SZIe<TH<LfV5&Q zU?L#K1$hU04<Ps2Fo!F{dwkZLfGy!MZv%3^^$uVj;QN4hXT+)l#5sEFLqME&w>|>g z3HUJ}&V^f_03HQA1Q?FKf^nv-9U%4zrEitPCc*ESa30NmJPdzlJNuTL;KUPz-|&u| z9eSRRWG~P^fMR0IS)Kh<%j|u5QJ#HKhrO^9dWJk>CH;KN<*8R!K*n6|eZ>HB?<*cK z4v;$c0%Y7^{0y!eX_WCG{@hK~&Adb70f&7Bh7Hy&1xbN*lLv#K;#3;rMqbmEwFk3+ zkmES>$nI-j)Ri`92RKa=`=f5uKLL<77zo%25F?xPlZya{<K6=}0dNQ)^9}`^3kdtj z`EBr&J%D@Iyo|OO0Z5z8#$WJxo|8diJFq*S<Fpx%%EBG6wHEkMcL}>-HdmniXal%K zfc=ygs4*AqXfBpb8-xO~t$AS#DWg7UgEH!Lxz^nWJb10))V)(Py5j@H>Z9`9V}uNI z{YJGJ$9_%cE40pOT4%J4*!$OX?%bTtz5jfjGqlc`TIVdS^Fq`&A!xsU3}_MfOU7S} zQ)l&=QFVmf#0@vN>?_d79RFy`TRX8AsjXG|3;aEBn0E9Tk1Yz2dgQ@5S^_dA@ahA- zsT=O)eWbpC9^Cf>q`v(D>HF{EZ(vZpHi33N{+_^Jm*(n)?**6Ojd!|FCiv{Dam@;m z<g6KMTMC+Uv}bM0KnsWv3^_E5V&rFhIo&0dl~h#Bcg!R>2~@h4JpnN>7XD{0){VBJ zp0oq6i(w1a*8|uWFcI)Vz~O+5$=vt91<(t4FW{ws_X8qLZ1^eg;Q8!o(4z21zH^(i zq56d;n$X#m0!`?A@yEQp=z&zHO=&-97id2kIt9c##jUdBj6Z1%Dav|kWzQK|ENHh2 zpJ8)@)X1E&UsZ_|`(iz5&l3STpXCLAlsG*W5VJ>a-OIie+Ckzq;{al~brm4Bz8Vny z&cgh-Y!V=Fc^_vYU^(t{0B;7I3`qOu0n)Ddfb`*c`0E|y!<=i=|JnBE1=ydbh5e(s z8|n5HZX<Ao_K`FTo263BB4><$p;LYZPS(Y~SU&B7e`YK%g}&4Y<Bj;)b$}k+Uk^xM zg#F|kEygUV*PEaPkL7QHMqk~Fzu3n0`c1u(H7i7ZN6r3EJ0)#}HZ&LOL|bu;PuEn$ zTj`UF024sF5pXzQCEzH)YCyK_62M7-=%4buV=3Tf+}{TH9N_JM^pW}a3;s^@Fwj^g z<_XsMjcw_}dNX4pUKjr5A(GaNgan5*xyXnHN%b=OQ>oH-JRsW_%V)h?0>*3NJ<yjr z!OzR6(h9&c0Ph2&p749APc87^_2J{7os7SA`0LuZK76uhS0@fE_7!d;;`WW=4eRFt zOHlp1Ao=UZo{<7dKmg}+;8+mds3T^FvQy#4eQ;EvKNRB6zE}_1r7a-(zFcciZ`N(C zw#OrYl>HbW?See=zU_KI_N6BP5oh?#IaxDp1YC`K_=c>rw*b;FAg9r|4qHp?SPs~& zu^ofP_2x~<PUV4&ITAtq<2p?jU??)WK~(k(jLHtPb3mi5GVy0$)Rnes1DL9b+fcU% z;4cEwceVpEX6yvS*d@>8t^#}+_X_}D0bC6DDj@5;8?d>#0eB_;>;UZEoNazn6k?^> z>Q3wYpN1jnk9p9*zF4>5ID{B1w)+QQU!)^e$=u+dfb75T0FDMc0Elr+z5)9H;J<MH zC}17n2EY#hY12>f7d%(^H)v6c$GV_7oBpA>g44#oI9Iq^Ts6zQQR9YMzv7i_GfpXj zd$n5Epud`n^`w1I0z_Pss~&b?-5UTq0v-bF0{9<5_N>Ez0|DXpGFLbPi1~r_4d5ie zZvokc-vgEd{uhvQg&zR#0sIM&{r-P|F9BNE7v2jH3iuvi7$DllY6-~p`2>H#^L)mL zuK4>a{(3amKGU*rtc4>*3b^bm+(w!Xtu$RGSc02}6>1b93PB8R9@;&)c@jW#1Pzwq z2B~rLi2s)&$-Y=mwog02X`0AqgRJ|BfV}}v2D}gu`$%O;fTsec1LB!PSvFuaU@l+> zz{!AT0Nwz|XN9)_o(*_Apc|0(E(_uODDbxr-UN+h?E&oBoW1pEb}SzgGt=iX2oJV- zC1{Vf=Rj4A4{G2<2^ShmK~(m|z==bo>SQ@%q@Sw7HG9=6&;y!{L+5X34(H}{4C+k# z;9_nspc+2S_qyp{sxfi6UVptk)6ixKjT4X@L*v)m=>}<_C}I9DecNNoQKZ=y?N2|@ z{ZYtW(Oztmo`BRK4)6*<KFekM^I7g}z<9tiKt9V|2-qKx^%(^C1mIx6eSkPSQdS3e z5#T|<A%Nj1Hwo}uz~O)%z)JvA07n2$0^~E^LcnCeS%9MeD**Y-cQN1?z&io?%y%W= zI6yorlV`qoMrNhq{u#h@Ks*bRZ|c$yy8{n?e-b*&d<u23;+peAnI+1e5PqUoMSwWS zv#)R)kqE$6@PHERd~9arQS!sP!B04asGd=}4X5~>`biQN;_vdkF?mt*Pd)Kcgh()H zg8zq1oWX<2fyW_9=@ArU)F*Mj0^?e8>x;Guj_rI-elpV0ZZcP!40sXlv9~Pi>U==X z(WU@0c1#7F0ayTd8z9<Q&dwGA?!|pE;6DLN06zxA^G%5%@B{gsw%LG)|JHSYi1+fH zVz%8}&4*`vjmF+Bp!Egsdca=Iwej>^9Ho=s&aQ7?G^oCUPUD$CvmWWeZM_M!Mr~aa zNK|cI3t~V#X)2Zn1P^2wi9cKn9{z^IFaH%<d=TN}-T~9BP~7&y*5MAyN8*s~^eo$f z6{9*+Kw4}7pYof*pg9BvK2FD6lVdoqCgL39R}zv`cE(*6k^)L_{Bl-k9MZo*rErlw z5Adc=3=KIY)2H)i?9|tb%)Sugi+#}#=)YY+Kn#;>5&Whvup0q6=HdCdoU>U9$XI$S z;3UA?0IvnS1CR#28<4GxvoZ1<=3c<}alZoaGr(1Vtou5^p8+2R#CT~v0_X;O6tD{* zp0&ugfu00JoV1<-MBL+R$MS6;#4&kia5LaTpl<=(0EoC&hUfb7jK2mD&-LYZ1^JBs zpSXVs@C(45fV9`kfNfC!-GE&I_X1uD_y%AmAjShZv;7v}-MD`Ta3$cofQ+4Q<L|<t zF?=0pT!TD_zuv#tuQD*RmA*w^v#)R)k+9ilO=`PgaNqJGTR@MYW4l3Aj^qfg{=T7u ztL??j%#+F>#J*TJ`pOA_WasrUY{B||3drhy21uVd1b8(d>|I9Q!+=WxakfIfoB0*s z-MBvjcrW0$fGYvN1H@WizBf!8{(yVhx)Oi=gKRw(G?vY--zUJ<=574nvf*VP<!R_7 zea3u@)(#E<hPCGn9+YWc)Pr_u2^g=5ZSl;Fy0rsj-#P(s5a5Y`)Hec<^(w|+aJ{;L z263|9jBlo1=Ft`S%oXT8tXCw`g6rjv112NZ`@n<ia0+y!9z5^R9`H24GXZ(-;e5aj zfUE;!TJW=&%RoC3f5Y(Cx0yQN4M1#S>!1FiruG$B4+cdyl1x41@Kr1*%DXAX|8*P6 zP;@mxbq30Fk#;s2RPbdn{vfa8BtC4(G2TlieX%aI4Q;{T&T9bb&iV}m>;QNnAVpsc zH~?@6AnTq4NE<zgzu;Ig9W>gJ>xF*J*a#ov!S<E0k_W8z)!0fYND8zP!*#Hg=+~K` z2lzDyBbqe89@-WOpxYO9rY*t%yKCY|)RFZV1K1yM9N-wh@w)Djh_%7b8Lve;?KTyE z{hO(~U32c<sr8Nr-1Ze%{YIgZUK3~!)|>VSSncrmLMDjHNNNcr3m%?5&I?WuMcA(j zO^V<9D8Cf+0J}20#(@|dUg=|0&%S66+O;(xX8^piU_aVu5+G$v2BdxS0O?~>0qHvh zfV5*FAbkzzHyimH;<J1stPU`t8GC2t<Yf4IncrMy9qsEk7`qI-e&?h4D?w59wttLb zsiE-K2xze7pad9<#8n{T0|l7DWXUKc(;ENC#jhf%nUNcePRlww`#{w67Np~%bJK|( z&P@`X!SV1XaPr07Yf`*mQqIArZ~<qeu;w=x?aTIagVIjZuS0wE!adJ8vAyO1CIXfL zGN#-BI3BPZFcWYgAlq>fU<Dx0!>|Uo0CH?x3iucx&%?X}i1UW>+ckFr{)Bs;kKw%P z9>6xxf#+hdezh=Xk@t0YKBgb;R{<sg@_Y=|i*i1OKJ!=HR{*X7#GH@6aUky~{0(po z?jHtx43Ot!)&o8Uh&h*>m%&_$zvm&pwaN1_^us97g5MRp60{yjO9dS83w|iUJ6C<+ z*x65hgCk}_yx$S+8L?_ZKIKz0e0sN^rhey$z1L6cBMw>yT7ZL6px+nOAVZoPj80$V zK8oMz?E2XAhZ=C(7i~h{IR%8LH1T=Zkal_jupeLz;1EEbC89lc0y1X247djHRY1<q zb^|^P_;<i30Of2E;6B{H3-|`$dw~B0{0?wGAlHmMb7Vn}cL7faJOGIE?bdsModJ0U z340fE)+iB>XN}m#cjGVk`O<};os2)ms)5b4G2i~@uAv(|_7&K+?0j)Z@;4;|FD<H? zC@}DPKo4jpndPXxSmv=W>J~hH@thR({SV+dfL{Sp_pfyw%Yg^~4*5jTIR2;O@4|pO z(#7z$Ss?=4FIUhW8a|eJr(~0v4b}bB&@z0p3;E-8P0UNE1M7l+W?phesG67H_toUP zFJ}Uti}bSr69L_T)EQ@urTs$CmceynOo#>#-+{QOiMp8)f{tikfsMzyWg;oKZh4@o z<}*`t3GRiUtIp%^P^F-qgu3yy&fMwh*Ng%k!Wr(Df_oGGaItV2(b*e0tav~R@)7%Z zqRjc0Bi+7e1KKtcgvFZJ6*h|o-UF~RU{AnUz}|p80ddB!>?**1fO7x`0p1RX@2bhV z*aP?y?uP<~LB1ETE#Req9IZwI4hI|s=mksxWE<f9U1=-Qg8LfA7Ap}lCjwsFL|dux zypOozdhpqoqq%~9G08cT8lIIuO`>28@_o>eZK2#-9JLn2rW$iE=+1^~sy&)=erI!H z?QP{k4n?8qQUIO)!Qen&x)$w#w>$M%?E%FfF4*K=P?~IV&c6=g&%S6!w)g2E9MHrG zusdygCEzH)s{lD(;~g5=>(2r#!u@1Gws$@tV=sSKgt2x8;5UHR0<yh*fc*hy0zL(J z9U#X~yoW8{Eu91SBJSq{hC-hOfG)rr0I`m=$^o%{v=#xL4tOJAf51vWtVgWHfP(<> zet>-YXer=W+}{ewSbZ3O!T$3v&=|+|<ImHi|HukN{Ko?x`wF)aWD9&H*Z2(EtdY;8 zffyXW*}$=&JNqkXZqS?o#OWXRB8`0x7uz`wu-SHAD{SgN)|c&k65t9=$L|lxS`P2O zOaHzH(2cZ}fGp#Fz`=lj0lWn8A;1E_zXHw#Tmx7NxDId?;KP6%lOF-(n9Sc2p<iqO ztOa}mkk4G72HXwE-wvVuHv_Vru7D2&pK-Vjv}mOH027;Pr`~3bm<cxf`VGxg2;Pg% z4C>mfPH;1E_$@PZJ{a=H>Ppbnx@zKVJQ-**1piu>?~AJSf*f3IQo4^)L5k@mvvCiI zztY2*H#IP?{WF+)3|)^@`=VXx4;=p=(!>|h4z%@lz)pa>0I3+>l`Fd#@D;#hK>kKc z7T|6``oUhnYQTMfF9ZG)a1Y?SfG44x_W-%y`7gjT0P6s+2K*2(2k;}nNr0aK;#q<G zCJWme@9&6T3;`bej26!fME88aAx-*)J@e#bBoo@$*B^I{Ko=;3;6LgDJy8q2tMKQ! zfQ<D{AD|6`ec&)`PM`P^5S>GQ?}nQ3_ihFP;yp=;1$d`Q=2QO#ycTr+&JE{_*dUSL z0m6CyvhBFVJ6G~e1-x@r#`R%4z!L#a1RMhx2{-`|-w7zY3h-n=`o^h%Y+HOYReXT! zzTmTQ_k+e5&bj!|CVU`!T0yaTjN<`^eFe6^J;*xaEjxS~*n<Os9h;r;+8LWkKSveQ zcoNTcjYVRU(OS*d^Hg5>pLJu~xB$~N{Vdpm_3Z@6@wzi0%j*Kz1Mplx#%p}<Nyh1} zfYWf_9q<moctF~!FCgRXRQv_cfzJkwWp=<{lHaB{K7P#ed&d~)pU1~Ru6?mA)-e>2 zD@$HOpc~5{3Me{gT`NEfZhyuo+M^@>hBcw9zy00du&>7LPo12~Hn-lg*RakyP>0|; zjDXJ63*Xr)qi&b!Iy?eA*xnC<#y!N9_#56t9n6};0|xtQT!j=Q1y{lE!u~Y}y)YBJ zYMPo|P*9Yk1}(bgyw3hbhh0|>==McjS=W|;@tSx!>PG$X4P!YMH6D=tCJpdrzzKl# zwe|Q5ZodT3*v7r_cS#d<#}Dq}QwG0nG3l(ly#o>W(=McXP*UKVY;0>UsM+o9nLq|! z<WURHuRwRUHT4Z{>nzldb(jdqdSvVR{#xG};izx#WA9sziOX;ATX>gB`qq4{bD7rl z*ZS6_P3U?oeaorrAMIO<pfmf{jezW1mAVdG&j<V0F3^U9hkJLIHBkq(yrzHc1($s} zI+tD{)*{LNOl2ML;QAZ{O^p@)j>fU#Fz9NmP!mRWzN4T8bUq%M-D((TAfUBx{}h?< zH#%gt%qZ!EPsvnOsZ8OUOdel>4+nl6`#!6XWM8xaeHQL*f6~-i3Y*a`w*jUC-T{~a zcqbsAbKDJhJs^LhW+5Pdqh=}KeSj|jt^)iR@BzS|0sjI>`>zJX`5^htnoPiTxL*MH zFyK9a_^x2t{eXCf?>EJS<R;qeSYm>+o&GOl!qcc9W5Py2#)M~deHUQRKGka7{y%8j zc*|Fmm5q->7w2V7n_PfBP(|<Sr{hy!2!1EDw?CVS2O{|3lH{6}J2Q7$v2`Xgt&ikO zf+=G&l12<o%@~oIm^@-=M&hVTl80HRA(<O$Ax!p;7?qllIw56PMlX}lA~1m`Hd?pe z%OMR3UPv61F>3UvVVGzuG6gB}xD>-nA&QtZ`ifBq=!!SgkjD=jlR9E(VzS8*W|ESJ z4Nn!5u+VTr9y8(+Zz?{~qa?L6bnoafBd#1h3U##3LE<eKuUbjsu%e=j5i@Y^Ek7qC zv1oG1bpDWYC)n=qu#UQ5X!Rzaeor$S2RMuIRJ2|De=&~8Wq5>h650pduXX#g*%z(h zsTnM0^i(nXM-UuVR-8YjnDkLYM<<OKbxFq9OGk`Fo3(DQlHKl!lby*aV}?31_nn+S z(V04A#3g+#x5<oOLZ9VKz9Mnd*m0vSvCc9aS$PFhoE(>q_9hOI0yvt5P~$PfMkNg! zlQD91(y)wVu`0D=a*N>Pk)ubA7Mn9QG&nVRXp)f})<j~)c;pRle*k$=?AZM4ax=!{ zUW>07_%c$tk$Wl<_o>87rp+$QOU6$Uj)8-_L4QTjN6g5^Zy%xM@Co6OxxS+O>|%0s z1V@A77=tsnco%a>zHclZ4i7JxkquW4Zy)X`Gzp(lGYO$8VK_UQNjM)lhBhwol3brC zrb`wXRJx->xUP{@X1{~3^I#J#y#2o%bj^=iWQd|C=(K70a+=YHH3(4&qUeYj`94#F zCQ4DFny{rx7^%y^??`1$&lpi)M744#X3FS*!aF$<#^&-zdnM1=NE)V+oGrsNwo8U} zE*J(iX0Q#Jl;z73K@s5lk1nGyYet5c>1;=#+DwM|ag{~^8F0Gr_VtS3Z~j#JmGDO) zdA3SU$tud4o=XRj5@NIzeB1z}q3rIaA$qGcanliezjp>kP>LF(6U2JLeh#R==%5*h zYvJu5c4kb<Erxw4?>U4C^oJx-LgdlnshT;rXl8zP?$E64yj-M-od2o}4vS+(5Z>Nl z5(I$o_NOZe;xI6HV$RGgd=;-)OhSuA1*Tty8s^WKY%JDDTd`P*vktHrR?m`y-QXRS zmW+=%j>7y{s&W$OpXxklSm9;$<|vx!=eb3~PBT5Ls^>_;;L^ASC6>(6q8Ur<MiN0Z zh{K^o_vaO}c9AhWJtF$Bcj47O2}<mCj60Ih9tk%pZHDG$6^+a)6gf>djcVf&N)E!$ z^sGXOanh^rc8It2l(=@E)(KDS@YTYijMSp68O8YB=;@+BBotVt6c{V+ChdQl$|D9+ zPK)i&@b;f;Q7Qn6rx#~P9BQnTiUVx}w9+Akmb+P(3A19b4sU;&ViZ?O^!eb7qTYE( zx=1BCoH1i~QEsj%XSz2Hd5K~inT4obnjs$g3!wvt*TUP+Q&~h7M%nQ8@ruAcDXmPo zZz-C#xLBgXk<TAQIrc2jzLh&87h^}p@O*S?2rCk2%2L^kf3QiUo-DejmZ@`!{txI3 zcH^O!4INTYDtXu<>w?lHz=%II)mG9}o0Wnp80f}jXUz)|HAc#mk~sKn)5)ssG4hQ> z2b5GcXQ7&!(1)$gxc^ZV;%qZ<%1IamO|QL6i5y!pQQ5!KuV)nFKO3ORsN7k`gq-kj zE;1v#AP12~xZhOV%9r&RnIS&MDHmpq`SNK6qn^0I-AWMMQPgG2zM^QTcL~0khUn@m zD#`X06iJ5NsuVjiNoy}~mYh<QTbNa(EXGb3;8fCLO(`k~clnhuAxIK-1{i`?KzC$g z)dr}F4~iRI8MYtN*=(nBHYQbDs&Xq25gVSbawO$WESc;rD4427Jx(-2v8sc`wNd;= zWSIR#$<cw$H2WSUjHVJA{rC>dytzC;TV$m2YjBc6Wdb@io<fATe^Pk887cfJX>n=J z6`_RkSn86Sfu&}6`@oW92&+}BL(qvN(!B#8NbM~J7fY>*rRlzI!sMb7W7Q$%>811d zgFH*TN!4Q{&Q*e4LJZg5P!6W)(_2))dci6x=6K?hVBfSGW=LH(=(?&7LQ9Ro3OrC@ z7DTl!ai)yrLwnONmix^swcvPkud;+l9*aRq64;l^{dJew!w#*(5Pl9!xHwn_Q^lHX zQ8%u`u8>bn3ol#jD&0O3JH#m5D6>r{MsX`E4Z-s(8H;x)C6r%5khtNE4wdnl{KDC$ zg6HWHv`b5u3~USK5rHvQoTu2%D(^Zf&!#zdIF<Itc-DQBvsG;6esq{A<4P<5r1~6W z96qN;%O?7*^yj8TNL9F7NV{G#O+M%?ww|TS^Y<As<T)_ptZc+#co*k>(^WMRr%fxs zXvD<|CsNNSsvUYoRdNT{OpT%~;8~91RqQKJ)~74oBC2H2>rL+!y`R=P+COQ)F#5DE zn)4uu7Z@N-`6ViGWbX8WqS->F|FBNzLgU8f6%_fzJ)Ts2;=CsF_rWb7)Aq#<)}YA` z8;5It)-5R?Gj<uu5Yc94WlZA-!`b0#G(+OF{K+%8FqHC`vf5+?xj4UIhNMua?(<lw zV|bulpA8m*HGg>fp97mU1A%yKHa?;$%|u%*b?T0>pJ7W9sVMgYV3lP2OsUv}PiDCT zV~)_D049I*k;?21Dv`p9C3<}6=#d$T-19bCgatLfWI|n~X59IaQnP&-m*vjJ0L0LL zfl@p<e_~OVZb;VWGiM>JEuxgE4>vE_%5Vzl4QEL(kuZyCtBM4Y@I_EXjRPD~x};#8 zgCB>YhU~~q&XH7j-K?8MLYq|QRwdifsn}i8ob522zc0j}LN-k>JijzIN7`Vq3R@<q zN`U_{$msTrg+3H8M=%Rwmf3g?u5@0bb(R<_gVji9;2&CmpG?!UN~#EMv8uQUJ5y(< zn1Nux55Fo8pQk1ID^1g}V>dM{%echnhiEI+Po?JE;xi*S_gd)ojm86s3ZMB|Wp9NJ z(|8D%I5kBXUXAQ}1;<Ko^AhD_ErU%JY2|-AUCX~}<e;qQC^BEbM4Y64O73`UGvIf1 zMZi&Q1^R-CVrn|&Zo(5W+ra9Yqd}pP#WjfvuvF0D%oz6B(w910iJ?*)pH}*dF4^C6 z>9#3Oet(B#vosZWq*)48V`C-9*)M|xPgv__k&3qt7@>uQAtJY^Xhs3tflcvsBSQ$A zBT$O(7i%_pjW`Q;Iq4H>ek>~yW!bNtO=Aa-3^7WRMwhAtw2%~doi31Lt9aKwO^}8) z%@MQ)P~-lKN;e&kB=_HRZs|voo9)Ig&6!F_y?JaM7G#Tw_bza#VfT}!#t89^;6fxG zyyh&!-k^kI(wTy!XGqO?EI>D6F}_a{-ad{JMqqQD>&Csx|3;VirsdB-Z(#6vO)IGf zUa20V0a#f*HIS0AiAIy&(Bw2z?Is2HbQPB1SCl+@(xhVi{sSHUV`sCE#)({Ucvdnf z0H{vZ+$fWQH{ML7O~Ff<yk%*63e8$HF(Qa7|HG+*c%D?Q$$+O!&8Ic?^jeluO$}Ln zOxF#brYZ}~@w<$QB;rVJWuYMj1=GYnO?C@WyU{qNoH($dr8|=o^JqQdNz*^3n_kZq zrRmumO-<5N|4ee!*|Fh9JJZoJ@(U)GOcL)b(X!d+MKBke7mz0-yU1scD)Ks5Zc(w+ zGSMmAcmYgt1b=1i_=Ld1x#;so)!(vu{fd;!QlFcB?i)k8B$iLT?xYbl^B25Q^1{Sv zHF(f>sqjr$S=wV|OkqaRWApDleCqXgg=`#GzJ733)q?nu@uv@(jl=Z!3*V1jy(f=) ztL4iZCywa+Wa)LA?`(ZhXZIUZ-{|+>Hj8iD@Y+OtpHukuebC~xM>~x>??1T%_iU-W zAo8M<XPz<Uinmuik$T6{!RMd)w0uJV`W^LLQ`_psw?BR9r+4E{s@z`qzrvoU+_QY+ zDLq#9e)8MJ7vMo=6)NHmy)-nu!^F~vGaB9r>$&-<$Nn>6(pf(h^!j4!;lIwj;Nc5= z(dzpW?$8IqkGMWubmj~F2E`Pgw&vbwcl2jdu9>p>jMu&&{nN0^2YiQfH7zLb%{RWk z{p)v=J9WB0^T*KB7krc5^}T!gbQzO+V*H_npQWw1Nxta|z6tl9FmpxN<J-4Bw&cyd zvrhVH-Rk@$*LEu}A0L11y*)4U)!;XhL|)2kIiHVyWByC2F-JfA`KcG5dH$@&F1mZ& z^OsCc`uKG3M;FK9Tu&&=z4+{TU;KAp;cYjLsJ*AFd)e;oUss;LVgI(fzTM+1|7>4u zGQQOzd_Al39~`)@*OMo%|FNQa(D<Kg3+}sq#ms?8b;H(&PTsm02lAc~zEkJc_wM@U zf&UJ?v)A4(&+Ygz^wrwF54?Lp;mf<@X0$mtxEH?L9L93bI9O8Lt>@|EyFGou0|&Zq zxU??zp2yEvc+<P9ZcbSH#gJ0S;_t<|Ltk5!GvSqlyl89BHOmVJPa2!-TO0bf+-`4f z?H1qqy<wlDJ>C?)=_fpNc0;S%_jKH_t?zBcBNlx&aQWk}+;sQOewTE4{rhiUD8;!C z93*jvp0(~TA9XGGYWbtH!?N1#ii~|_-G-t8_gt}Jo$I6%&N%%LrW^R}a`3s^j(G7u z`=;(%*JI^>2UX13dD0X8-~VRU`Dfn0^vnTIt^TA3oC@m)cj%`6J0}+3`}ki^|2pyK z<SQ#XFYCBriRY~SvtOOCY4q~AG&sLk_+rLg^Zv%K3YVRC_@PIZe*VzEy!)2DJ$_KD z?HhmW_VblBAJyU9fbczje*Z5YNZFoMGv&1l9-sME==9N*cfOUmW7Y>>?>yn<m)|^q zcX)+w_ZMeoe^C15fuB$9vS3cv)}4NM;?Df>Z@l`+*t5TQb;?gy;^1z2YwDMO=*zG^ zi#k2?<;RzuaQE<g-o0bT^tV4*c+1tb=dHNt>&?rs;(Af|dd}*5(mUIBT%LaNtG5>a zrFP8z+KTmi4x~l>{p&lX`npD5i|@hVsDeB6ljUdqqs!7~Uz_vj+=_ocJm`{5(fv=( zN?16u?u)YG-rrySuw~sWe5cI(>8TT+=<@zI@m25k{6~+(UC+jR`RO?yuS@Sf|I(sU zm#x5AXyNPm%*kip`pHMunzz6D(!240v)9eKy4ChCpFel$%_rZq^ZOrO!uf|bEH`A~ z)c^i)>gCg0?3viP?)1oWTfZM&>E3_$4R>sEpY`=4ZGOaiTf%2memMKXn=iR`ZvQq@ z#yl9iv(?Q<PVcknXxXUY7oBx}MaVqZPx#L6JhOMlh_N-(UOD-})YTn6ys_<^4WHJ1 z)%nFC1KQpi^_~~@!@)3j=)ME>9nOAkU*C13w>>`f_3ZX5x4!?``%g#Ay8eQa4c#9& z9E*2_gfH{*tG}Lm|I-B<f4t$e$7{cT?3>m%UAk^%)y<dp++DG6_a+=%aJ8kpF)R06 zyW`G(ULSec!W*aM?tkmkGq3yng8MGZ*%lIY>rdkg5Mrkb-z^7<%G{5PT|V@S*Ipc& z*stXJuGhG_U-kGC(QWfDjXb|4#`iabZ+PrgxrHTZ6IP#k`QMUeP5IZqy)&0SnpeJZ zUT%HG70b5Yhi?lZ_PRrtZ|wTg4?}Lfvtx%t-)wv0)5NFxe;?*f{c`n;=YBe&;o3tF z;5!z=_guk$ZtFYu(zuzE#$LUC<$y^Y4%e11+mrwD!#%&uf3LjwYMh@HzMKADx9h=y zBd`3h%f;7D{=VCZMN2+gbhLNXp89{3@3`u;t7hPszzHn3@ZE2JcsO#^rttb(dbw&h zFFU`}fv4~4x1#FiH7DkTKJ?>IY+?xC|MpC&dU8Vi#nZn2HtwQ3zV80!JFCx&AHL_b zQ@1{x-?!yYIN-2H__B9)UVGk`Enc`h<emq<eJ1JAH_Km}^m$Bai~2!VZ=G`8`{=*t z;J}VMbn)|VJoV_0@7{WL!<rlFw!F7`-}4{0O6u5k(%*aR?7e*KBOCA@f$;76VbQvO z<S%;i%4gfJsrzPL|CRUOaP8KkS0&zdRku0cb-Lj!d{bBWHaxT2=blr1`-e4CJ3hK` z=)3Rtd8+uzf0o34^FYtTqc2*03f?J=V7YTwPyOcIIhSv~$yZYU$>rw^xPHy^*Y<to zie>lxSY7e%v$40~n2qpR6CNo##g+2Z)UkWM+Iq`nSEqb&Q=gLa@=oY>VsYiXga1Ul zUoCuBXYJisJnC?H_qbMG>)_rqE<S1B%9z>>&$WK?&_~a7y*&;G8Q?SS&;h62vE!dd zu88WEy(Q=2(`J79?$;Nz`sDgIyOnp@ygW1dv2J*uLiqMHoSN4;X8Cg)&wc3Z1&{rG z(HTpRELzvP&%JN1DeJlCruT8qXOr-KymG~n+yA=rp7S%Zb6T}uG~ubA?|*9Csf#YZ z;=~7^{CQxPyAl52gYM9`-+goFWmkWDaPS+YEuOAE?a;#yU-(Vkg|WBpzW=J7Th8c$ zgS6?wci-g6GituOeUYcdH3ycyH(|&{1^2z$bJMU6k4}iWc-xwbZ@~E#;rsmOqmxFi zeBy>NUl&~0Ywm<`uRPLX`}P4J&K&m0_GRN|XFrECm}p~n=){*F&wFF(UtfOxsUz<_ z^6$T-9cXxbb;0&46OXj+H#O$<w8!usiSWHWZqUr<FYL19`m!Sf4n_Uzlkc9r<h=`L zPkDUzN2RB??zIa2e4X(5CXBhV&0o*ItUBiY_v2r>B6IGE)hAx~P4)wCr#^SnXI<XC z6=#lxuiIV!T<Ux6gwxt|=-lCwH^)BS^O7xJwH%opQWpNom-jz-<^_147zdi&p|huU zI=AeurLC(fHg`z9V8P;lCobLBzHR&aZ+~&k_R4Noe}Z#L!WaF@n6Oi?xV3z1zZI^V z$4!WOH@#$5>#J^`aN5N?w+@>yE)(Av6TYwNZmsBe(f@iz&;NJms&6Ll{xtQK8$Mke z-*5T)89V3SyJ`U5Uy5S6J4Y?~zM$p&e{Bu(JvTG`i-8}^{piweXTSXVT@#AW`RetL z@nXe2!Z+ZJ6TF+pp8o9Pcg|Ydv-S5^Uiw_l;Iwv+&%5dV@wfkX&X#?6Cq($ZOrE}? z@>AcB$yt$ud%ske`pijBJhJB2FS<@Vcuiu)fHmkJ{owoV(0@&x-E-;MvyOgx)8z@C zv(ollpTGUWwKrE>HZ3G--s`VkF&e*JDSQ(?swf|J+dK7Z8}{9}@_{#=T(I{1M_Yv- z9)8CiBRZe^myQ?*_X*$nF=5{>7<uOPbJm>y)R~F5?frOGr!ObgY<Q#7_sd?mGv)DY zyoYrv%Wd`Q!vj-JZuQgKr%kceUUb#w9uNI<(cqsZWsmdqJ@4;#f4&oE_Jr?&wl55y z{N&%>NpMXqdw=1@_dj=F@XlLbxgz1-L6awZ+2IqE`Ht|-$-na8sKsx5@In7~4@`gJ zrJ6e?eSi9SkG}Z%ZR4jccz(=nnB?*sZSK%DA6OHIy4Tj7l(6(AtNPVW3$~p%c+H-x zHtf6W`x}3He)cN7KO}r969*2Sng9BYMPH`X-Pir%Iipg`F5dahtmTVWZGUP-@}re_ zhgA5!&pLnlN7r0^Lid+X{%qyyzYKVG?EBC4d*`o@OnK&>ne|h?>4S5}m{Yn#Z$Et3 zX_wy@_0s(QXC5g_*}tXl{%)t7vE#!J4lY>Nrc>(!h?7%<@5KQ_&w9He>3`3iyC;2r z?3S1_Qto?k{D#>#Re$s19iI>H_&DZ?!k4k*{<iZ*w5thuG-A`iAL35hJ@&?|%g6N{ zeD=d{@0t1Zjbm|s8#3LY->sToox1kc4W~?cw$=0{cl7IXbW*F<bIK>ry6ySpnOm<v ziub34?|;QD-kQI7(#CNI*Bo4O^1w;|jlAxxs@kKMKN;_vv1ebGNAUiJ@NNA2N9)gf zt$KRP_IV-q*S)Z0@rR%8X|wwAZ?;^1Z~u`q#_z>9-Ee-*9Xi9E{?Y7i+aEeS<G~M4 z`(Wj@pB|3cRQ8`$ZMF>is&v4PEf|lc3SaEF{jdCI{SW<S56R!|Ida?9_;-GI^`*R= zXFp9mn%Z#m9gH1cTX^>eyw=cx=_y48Q?MmeoX-80{Ol|rHg${BeK;VIJ1af6R2|Vs zpM;$rz89KaT$G(|pVlJ6Gju(&e}|y_8QIfHa&rBWvA&YyAnB8Q1rw(f_sBaQLMPz? zKc6@sFKN>Ya<U5ZkCQZQ(?2H7*Lz|~{<NGwCd6)C{NnMX{K;s6Jp3Bv@v@o`s*vNX zX+a@9_Bad0&$>>_pJ;?m#`z}q@ce1H#qQYBgns9zUxBYg6wE4iUxx35r1y$T$3uT{ z=3a3<;(GKN5EtL8M_hUd_6O1-DJOT*@sN~VP?QUaO^8Y#nV(%$P+Ty{=N_M5T#_}- zJ=Rx}lV6bDJFa){^q~dQr<dSp+wAo5L(@~S6H}Z%axBnZ@jdzs=+UQ7-(CaK?anwe zy9it9c$#8LIhNR9OEJO1(WR%$<1HiBZ_(qYd~wz^BmelQon0`!5UpNx!SpN|*hv2~ zv`6Q_4^1IjWzTk2<j*K-Ci?aye{GJ%R>9#P@z6y7KSS00>C@pv*xEO?|D)R4!^)qb z?W{)H{u!mr_&+J7`2VC7-!GK%dtz<VQTzDCn8M?!ua4;W*cMMJ7!Ut5d?xo7^ge#p zDg8ewrBNY&BqZ?X*8bE8hDSqFrWgLHjhpp{EYkd_omJv1$V2#TLiuCvo3^jdYIbUM z{M_)mM)vS`sbf|=sB``iU*iJjIITn+Gb?y-R*qlnAE>IMjrcI#H2WW^Gv=(OdmW3M z=Dl)~uNcSokBf4$c(o@4$D&>EG>EnQJ#v1jmN`6mYNYy`_4xG@bj7S9e-X!GfaVof zn*+aZcG*a(UOLj-Cu17U9f;#3+1E>cCgeCtb96^}PtY{mAF`>gePPK&Y|I3&L5_!H zENd<(E-5U;5yRu7@g(1IY$9~@*?jHx_^9S+BAf&Bch^6oV@=DSj*S7Mx4(#E9({0# z-5H7hfFwJ(H@gr&X5AbTvkPZu9GCjap)6y#WAX9ekSy(OhMwbKxZ>QbqU^lirCX!8 zHi<KVf+D}kj-{qeNW(JRIkoWD_V^7JW@{+p`1vFTp!@=3QNPx|+Z8#xbV&R|R&@l7 z9LId)IA|$K;#*eSYc;h$7F~mVT^2FNW&SbAH<>R9|1PbX@Jo>JX0egxx83pcOEi;n zd+5(ABCbdNjN`Pyh>;EN!W_5WKP@|FQvPvM4X<ovO+RkB<xkI=e4KWZC1|S6bUeEH z5`W?NYh@+3zosL8>l%0${I%t;stM+@VsJi9(PA~`vK9k7SNN7{%w?tGoS34eY0PE) z2<$xJ<7bkHxvVgpuTr#djk&D&mN*Y2d<hzJSt|@}m7)CzjNj|QQ5Bq8BIdGkG}czW z6ryMcK<g@ebsBS739W6~V2!z~8elle0C_t!=CV4%Ad2SJn9F(ySa;!Dt1*{#5ZElC z9nzS~dIo2K6yLKNb6LxAo=4GEXv}4$w3FY)M!BgPb6Hyrt;W!z@SL%Slo72lmsMeC zm4+6DGbKG0pT=N6LtABN9dQOEPWap!b6Kkl?IA-uVrWMV?Eubk^pd=F8gp4s;f#f% zZPJ*_O2@f|-olruF_(2Wu-QUesWI39=MWTMs>WQ_ZH9KIq171L4nsR+Xon50Bc8eU zQFYUp%Q_Ly;1%s8jlmBLZLpzDGqgfOt24BZ4J{7OxZ|aac#XNN=MC*eLpx+>hYjsV zJg4p}d2yIqFtm}z+FGj&E$R$@?~^_mtudGNwV{1yXhrC+if^XIT-JSt_7_8o#Tf&| z*Ii>SYrUcI!#qrN$;UJMOSu(p^%ZEBm3)rE+FB_ZgP#IR5WX6XxvbDm_%5o@T5HT@ zB>_`>UX8h|w9YmyU1KiG-G#q%#QMf)4DrR#mKs{ebLF?x!ROYP%i3gUTMaGcJpQf) z<)vy2-7eOqg=q|VfejYEtr~M#K7<cNE7cg{0RqW|!spf)VjZySg_fo<m-VIL`^NB1 zK_F3iXK2i2Z7{T_4ejLaHs5I)L%%e%hYYQz2hJ}_xjQrl+xNsb>V?)?V=gNi*j%A? z)R@aUAJ{yhU7#_SH3gWGH$!7C>n%fj$I!YXXehoojk&BN==c|lyrUX(Ss$W9E83?T zb6H)`0Tu0hjk&CmhIYB3-C}6B8`?95_N<|OZ)iUm+Guo2RmND2xvV9IcB`SiYG{8q zG<HRmH%w#jQ*;E6)Gb|OE^9uVS<%Wh=Calq+M|Yc*wBs`S|2#L%G+OK@HIm#HMAWA z)pw!WTD2N;S$~5wCyFkQY0PE4ZfO57G&-*03)7g(iZir$Lt74q93t{oXv}3zMdK=3 zfyP|c9fo$dq3tlVT0?sT#v3Z~)@#gVwSXdu)=Fb8tCykmHMA^4%Qdto3~i&K)fw8y zh8CBkesiO(6|XUuH3!&y(WOjdi1)*6zQG!ESsM*)i=mYcxB2F1%w^Sj)o<ZoKBO_1 zwRwb1dro8M3x;;o&<<US7h6P^!y0p0-7dqs3qtFuF_(2pvdz~)V=im8p{+Bt{f2hH z(D;GtOGI9U#$49+(Kc<D#$49thW4eQxl?Su7>&8COAT$5q0Ke41%`IS(2g3~$79s* z@3gfJY7F%lYtz<g%w_F2v;&6LD%Iw5X$*4)LtANRwT8Ca&^C?7?=6ZAwrb2}jk&_6 zjn^3FO@>x!XklsU{Sdqxr7@S4ZD^AXZK<IxGql(V_%5H6+g)Rbord;~p+#M3^F?dS zWsNhm35Is3q1|I>9~;_1L#s$v-wkbRRcg#-9X7NhhL(A?`kk$|R*uHtr-pXa(3V}J zzL($DTCOpdb=1&)G_;fq^&LKps~U4zj~Lo|Lkr7PpZ|kRHRiH14K2seHUWbpW1QZq zF_#saWz)KA%w;VFHd6SOX$<4<M4OhTF_-lwFmwXQ+pjT~)jk{FV;9;f8pB*3nBrTj zG04loIcnic(-`JChE`)}-E;9mo$$qJ4C??xJ7j33lW=}k_~vNLWz`wl$A;#ejNe}p zzGRKLtOdYs5ZXeGp*;-WkA`n)9)34e_?Br5Yqflv7OOF|5ioQX*k!%OTvp)}o95G) zOFpPOPWZy6;)|%jT-Jra%7vDwF_*Phr?$1;G<>V3;di5i?;(x3tOLL*gjT09lsnz# z^J&awMb5yt(}gceV^|viTPU<tjX}Qxn=edbF00hg<`~-YLVUkf@~+SrY;dhjTdy&U z6-D^ItMKvX0Ei*B16w4t=QIWz6x)1>8pC*LXn3zs=RIg>hYW47&(7=7n9G`GXoZIM zW(j_;K+4^(F^mf{@tshib<h~rlE4(-3XQoe&n%ox7rrEoVSaCDPZ?TtDbCIdUq_8$ z4q|AfhIRlLf&=`ePGc@BceYK-*BJVxp)E5sE&>oRkT*<YSmPMlDnt7b7y<_PIE^NT zdH|~wT9U>PuXJi#>!{(IHpj9ug|AR!F6&WXRYKdKF^mCoZNBju!+O=wHW}KHc{pP) zd5>z$W%ZknALA6-K#d{B0#kfPG={OP4ByTbz5^P=`WFF5(K0oLSON^e2KBAc7-Ahd zxuSK~7}^&Yf(`gqXv}3Lq5~@0FpXg>Gqg%WOG0Nu0771`#$47-z^a9Iv&PWh(6JO> zl*Zr(hE{5573c^ERFGGxF|2igEf(5~8p9kDPOA9gH3l0PTBf0ON8?VGym1<XUjbVp zw0w<WJ%ff+e62NxK4WNwhL(f|%9FfajbRN7>}H`=Xv}4`f&mntOJj&bhUPOgFDjNV zd6PBfvUVHVUPEgKg%w|<#^B??rbymZ8iT(W+7UzZLb<7`42{7j4Q-R5wYx?Arg>W{ zQe#*T8rnmK7QPhkcZs}q8Uvr9J!EJ{fz1%UA2o)x{jD}FMPnEnffWefT8+V9ZnJ4o z8gp5BzzT(Ln#M4O-fq*<G={bFGW?E;@VPaH`Wo6ML+gBp{5~>#?L3XStc*M9d;H7R zn9C{$cCyfJ)EM>?aX-mA<&+y*6`cChTW1Vg*70zMn42!XlJsLgn$J`7>81VR)8(60 z=3sq~!kmfLS6@OTe>2{3@ur32{@74?PJnX{b}kQ)TKndAzyQ^dUmlP-<Rk&7U4HKs zEFYh!n@qp5FE5aG_Ra5r!SaLkkB7|TsXv~=;VU@B8F7#sTo%<2gF?>oGC?cD-~ZJW z>{-D&ra}>?e#ffUuh~24|Cb+N(&_w|hvP~B9`3k5Ry5fDf3|$})8c+DIW9)~Z;u)K zHT`2D@z1ai4^&dwv>^F^v^^;ESgzpyY5!`EE#r^s6Kr4pWSaA0`yJ1C%acM_yqN2F zw_mV)#@#Yg+OZ?S_MxwxioX!?YR(iwEI0m-5RA1sQ82bkq+lNW-(D~;{y#~uJpBKF zU~BRJUj(bg|4#}QjzXUjjL$=#7mUCA^nzfO!1fAO3+#2ljsmL_EF2E=zF?)mJ`ij< zup@%)2lkC%M}f6Ot`I9B6puOuO9RH=9tyFR1B(!B6EOZZRS19C$U0rHXbcE$!SE|4 z);WTe0_!5!CSd0ZwjWq`!J=E@X{2C$`Z_?cQeXoGTMjHyu(iNEf<?E&ez9N)z=jJ} z3hWZWmIJ$7u>HXJJ4w(FShiq%4x1xb8n79HEeFQma|*G%Rmm~oS9q(FVj{guPJl5$ z2@kyW2H!_!Y~O8PNyzU`s!EE9u1bXnC9V8W+@{?WHMPd_Rwu`Jyi1Zo!oA>fQ?$Ff zYzI;YB*l13+G_&a8-z4pS4BvU@m5um%f3yksw7XJeIoE6P|GeO<QL0G2`(ekH^LU0 z5?Ds2Dq{;Qqx6<y$n5d9Tm@<p(9G)8m=teytx7B35$CYR?%l~v+e7N@-9@dXMsX1v z%lNpPhNJvAZ&g@~w>m7Qnj{z;cjYx<G+AUrG#J8vu2l(asPY=Oq?FHz3AZ8^-Jpd= zR(smP+6moitG9u<od~Wj;{*2Z_QSaC=C){<Kq44XL~=}A=mI7pDPjH~2#dCqt>UW7 zq7}W}{BxMWTWyusikZDt03a}XWc7&1DsNar%lfN+{`qGq&D$~zUCCSJtPI%0;R!H7 zyBIpc$IaF1U^BIX13}?#&DQBE79A-Ss;**%V25toP%F=zW@<IpU#k|(*SJ>UcCE^H zxSb8`4RCXJ;wBCd$|>Uxn%1Sv1a_pL+`D)CdkB^Gz_7H2dlMsbKzD&#q_VpxKeN-N z4Wv5-ri-v$9@Jg=m&f+CVE;7bLv=>w#;V&<Ky~{#6BWF$FdfyTYsWSBP&ObvHt0UC zu{9j_`2UDL63>#+B+<^6UT~-kz2CcJPE6cpt^qbN{C)kfw|a3559D~O5vc+C?C@4q z#FPpv8y7cRy?U!FVwM9&yx?iEu*MhRzqc0Fl(g<sQ=fyeAsNCLW0JwGgf5d@EQC_T zyCBgGynL$w%h$606lA49RgfokvkJT~L))Zq#N3J)4x3GJgcy!E%|T8Tn~^O+6Paj; zgL$LUz~WJNB;qa!U{^(q7l0SgWR32uh)E$zEm+0!P5j^T^{rkO!^}3ly7D31*%hTA zWFSDmE3d0T8I*|1i{OZgdmscHyc?hxBe;uZ>GDF7baoU&9vG6P+46N=C?C1WF!vl} zV7>3&+#6!P`yM%XD*;ud>_TTnk~OT)%akrMmKj^AM)1Z;5w^{Dmen8wdai1uon_m2 zi(0IO=oY@yG#2VR0Vc}?jaNfkeZzZj2;JvG&15WZ2-lct*@%scC8@IVMU^8^dYDMh zb4urpmM(OWK8-|?PAot=36+)G{nA53W+8KcC>ryI7c>@BWb)TJl}us*GD)bEaURu; z(U}_}VJhDI%qAxSaRe<QmT)eG=Hy*K#|XU1R@o3xF;J=Q<Hg7m$3Dh3V$(TAc&jf* zv{IqADe1cWkdm`(SM|1BB`Pe_9k2PkP09PMw1|zW=OAiy+ZE_}Ny-o&(ZcTj+VkqS z{*U9aBW|F+Zs9!Yt={cjathl>JLxVmmNK!=Zbe$KqYSssQO}<3F<v{Tc`_upF@|Bh zbB88|5ylP*nIpq%tfI$ix*PO1yTWL8tD!Xz>QIe|LirBIgfdXRTMZ%ADQF#xs9Ix= zGP^vn%-^R55%eA5+U0SRqH^r=a6r{J)hRML2+Ypqh%>vlIwibuA>lz>yF3WDTCQU@ z2X&%_ULH7GaEx!Zsj5(8jFYGt=3p3S!W&M75iq+`bW9m)VufBlIL4YOh77OvM3&e6 zK<&b-5=BrrYKuA7&kfrH&9^(Cc|0g64V^%&m*Ndg^v}Uls%5%e)Qbxg&OGA1)iV7r zM@X9!iMdCb9_hvCV&^yO`TM-0y=W8$w`^JeKWz^;X|>`4ZmnesDv5D4DFzB8#iUew z!hpxA>T8S1<Tg$ww~`Qx`iqvan2*L;GY4;C6F@(d3*YiqhlNmJ0%u3~4{j&=K@+hH z%qlZ4Z*)V8hSgFkDJj)$26)4Yd)R6S&09SJQy5ONs-m{pDL>apT2*3LLu`|#Y1has z`_Tj*ySD`TugC7Rfa32gCe3bou}YfE_~XGK9^2poM;rnl{s$J1S!`VK7}&yXm8f17 zv5`vzaiUl+)WuCKa=Xi5C**LWx-p%x0)R<QMD1Wz)L)Fm)Yp%K-`#MJQ)hqg*6Ww1 z=09u&ng2uqbIyO5fbg=G5aC)N?w8|Us>W)>h1PhNB*!Fi_8IG?wn#-3t{v8=W=l9w z#-R0pq9<>bk_b0K&6BK%g&frp!6|{><d=X&3}wXrf{bvHQ8Ju*EJ?yZ+^i;y3C(Fj ze@x<p>nrI4n4^Iirj6rrS>1WdOCv4c87#+C0ZSzBlCW)5yR@MV73YFMEGAWigi>#n z7mlc8m;htnx&zovT+=1$AOe?C7Pnn1v*BE-;qO;zc3c4~*08v1N1ZZJEA%qydPqse z>b8wq|LeOEVOZg5uVw0p@G5U)!-HOoh^wfXFONkNwTm_c)%teDXc1wn@+Jg#`aGy3 zaUxHt6UA-`Im!*hCmLRJ3KHA1OZz7O=1!^&th7Qq6hdc9x?7=iw?Y~W-L0_rWRzYQ zSo+&YOsYN_G<a6;@?xxn7`yiekB^16qXO#wUlCJ@47RaiSt}Au6yTyvoUjZ~s*b#I zBsLWqBFeu)3as`!!b3#G8sufI)ex~brVRJ?DB)qFW8ICB2XVe+KD6*6nPqvc5|~G) zs)+BAh+h#?1`Zin5{kQkBY{>V4Y4+ojp|{nWrCPI;kU<F<k7LK{#%*c=&}&)#X;3A z%!)mzq?kNt%L%=*S+W$C%wo~L$r0rXk%GHqIy~G=b<Z?Xq{F0$rBf76DsrV1j{=qw zkRwxdB?w8w_!5rYm9FIZxu&{C^QEGvsS4XUIj(}za9@2k_e{!n6#9LKaX6_mDQGK= zAu!f6{{&Pi)&s@sxyiYSyU_Ni=&r`@8nlR&bxK$aXAX12tHWZx+g~Mjv2(jL&Hytp zrp3n14X0?j*aF<v0M5-uJz~r2E=G2RaXgBJT-V(8kjt_{)h1JHLtl{Hb59Vy8W;H* zI)T*BCiN3iL~ynfRR&qtAy33c_@NA0EJ!W)fRQO+hQs-dy~!AfRJY>o2CPby<@gti zr7s1OioaNB5C)a3xox2ZjKW!0YoJ76f-rnLwHhpv(yk$#IFd+fho%poPu_-B4Pi_O z(8jsn=N$PL99qxz!FcK3%zp0}FKOSv{ercmV8ybRFuz9D@8~wQylraV6sjR?pla1+ z<iTxsMv)re(p|$B)<i5UZ;889GU}A@gGjeR!Hf)X0ZHC4Ndr9|VV!DNB_}iEeqh+B ztN}pNoT(E-N=7>pw@G5jU{er>MD88wa+71?tGw8X^eb44#Kod6f=2y2VY0kyTq>8b z2s~X)sZN!+3PmDU%$#WOlJzHV*zZvsQB)}bmWl^-DmWM#+3}2#0-O>Lz?Nc)8)S4w zdntWoC8Jwr!M0T>D0vAs54~8<)j&j2b&Kk~VoH?BxzGv_A&(%$cdEu(_+m8{>g(Nb z6<7zuWs})=?Q*IT!|QKsK|e7@Oo2`7iyPCBJ*9E>cJ*EdE25$rUA=JjJS(E&Z%~LH zlxO=(Nhhw1+1y+iizA{=^ezcxQYW1u>~)NS2%DiHu$Bx1kkZa3CWeFRGkSZ3TN{rV zN>OSdvX`>DbV9x8M$#N4%|Vinkp(dR_3vfNH_k|F<XLP-rc!bE=?(z+e#Mz+7}PZ0 z6LHH=AQ5%X=>+lduOEfrI2OR|B=iHce!K@f_4_oV6>;-spkR*EQAiIo>@-kHM;0`0 zg=T}{%79Aj)nhq?+T|dXj5>8OP&9refHjx99K;ZI6oM2os1#z7LIj)y*rsBJ`6uAM z3<zt`&=xl=LT(sUZN-^*3MR)eGZuIDN(pT7q)<U=S6fqu^EoWe&I<!3z-vx}Sxt(E z4ef6lPdmyLqtA8OMs1)r@g|tZ<Bq*z6_iC)2~@8j*233c(?We0HC)7uP%OAtnBrAb zsb{@|Xbr^;*9MV9i#iWN*y%(AoB-O1;ZE_VAm-{(NmgKrJ*ayIm0)hU1a^kEpa~;w zyp}rqw_4WY)-eU}KR<GgCwQR7?&m>I_AlW*GG~mH$#kqtR$^sXuxI*iG)Js8^NeH| zGL28JQaA%cw6a~HVJ8N&z{gkq=M!e?Dw83%OrhMYXBia6N*)8FJED9p!VH=_4>a}} zH>M<!tYjJPIp-^%6A~U)+@fJ?Q;A-^m>0EW(*yHGP8yYK5!3Y*daM^^CX}?S50%&^ z$#CN85pmU?I0+S~pr0CF?THs^D(sMAm9z#(wR~&HgU4-RP5x&W2IFGIsmW572W8zQ zPA{&`$58&V(v%z+6I4@HItocsWu;rb`;w5HPSdBs@~OB{3vrZ^3C2uxs#5dh48&M+ z0;T|_1E#9_07I+sKVV`C+$u*9x+v={;WSP*auqL1O9<8%>_Tlu-+P+ZHwXIWKwls9 zg({hllhX%rbYab07!LNq7^8Q8;;Is(g=8x!zMH_-iz|7f8D@W@t6D;24r-eT7+?{o z!4d2utO4qCerh~}HqW=DP^hMcKKCXsJ#uPI2rc08ax<8{!ENvQ+UZs^=~Nri)E=Q* z0;eMF@`OXOV<(YZk^W9*b43Pm`F9UJX3ftccA1^Tpq{CAX`J(4HyT_Dhf(6x95&7| zhmC{%WDZ+}MF2y%%yJWiBT{C$3E<!)IubB!D*oCH3X7TBS;Wm@7>}a(20B($7%;F# zfi=9L+tjd_c7u>%?l~e^n7Og8n4{4_$sA2)Kx}FT?~B@dP67LsXbtIU9w7AZFxllo zLn&tumt={0kqum!L`u|yv89L_>C0e3w(=Uu4&@^8BZ0!O%hM5BS&CV2AB*xOXDb>W zPh<1Li{dDbcijAlZ#XlM;7A8|d_8-_Z>*nWg?~7z!#iDD)Q2V66j{hd>wR)G7dDA& zs+2_#`3Ho>M3m!fHfJ|jkDtOy!?PhF6(%2(z%^!6BVy_{*~<y9_H-<-i^PD~Uu9=o zyWNl`ZSD2|L*9tzF;Y-qbj0&vE!u8_N#w3F%%x0Hu1#K_p={8E$I5ut#D1d8F=an7 z7KJ(1M|HSO+*FJI`Dl7^4DS!(&*Ip_8xoHSY-4YnDYEM62yqoL%)qCu-X)kQG`Z>M z5eb;QYuTzG>^O2k7;lvf_lv<QtT`#{)HHh|DO|M2bGPtOti$}GppmW;k5SlqN|ov$ z3cJo|h!kLwha}rsGRdw9W{V>Y3~GxbO~z-8Ns390&uJ0m{n01kQ%G1WM&X`!#0z1G z!k&s0E*?^4cFKu4=Ll2Ls32x~Lu<WUl5mSe9s0-vUWj!F>Q;zjCp9R%sT@^mnxE>I zglJnsL8V$ysg{bJL~eH%N;fW~*pQi*)3r*`fjyf&D8M@vPqN{H$eQE|-=s(?ibIOf zqhLy%g##qW@}KC967IuoQ?-IbJP$!4cOR8Wagz!ODfNHTTTFG-K)S1%_t3s&r0E&E z-G(;LQlvSTq%q)M4jRm@5N4>P0O>j!w;PS~dvZsVpD8mOJK3I2S>A5jyxWepf-Ej6 zjV!cnncO3;7>-p!Q6lu1qLp#@LL@qNNO@fdmeL(;aWas@q>DvSjOBK=?8Um+WwQ4z z=M+##Vs*RP>aZ6v)vAbj2=~9ro?MHKlo!J!!&+uoCUasG$n2&+(o9u}Ztje%BG+QE z4cFSVa#N*00{XAAJ4;_rxy$6i1H?0XQ0a(w%7Qcs&Ez}7NvW0YtQ3uIm}Do}wyPcy zGr;RE8D-PUOJl5(^O8^$3+76jMK)1=loQw-&T{J4a@vE;b;xYmvdZgr(j-7ud1D*J zP)9(u&lHJ}!xV;ony@*JnDn}3F^Zb(iru29`^4^~j#!c!8J#Gzrjb)?<nT%z$fG&2 zN`@zF!VMQ5UNrzz*CsQTD7ro8LRXU|Bje;k@Y@QB^Qod83W3^$LLqd7#tMO~YHAd! zX+|N^oeCia#5cXszZaa2m71EtnE9rs$&s4RJY}fn`OIpJ(Xu|mIzVlRtB08!+XE7~ zYO+dNG(64lgo%uv8K@ZnY0-ME0!RkTtfR43>7ds|pvvLAxB=cc-(JnH<{UD^5IGY1 z1cT#n<)&vPawj6)5Q(>gU>!;Ji~PG5X()3~4d%gKcvQp1!PI#dkP^w+N3BPctV--C zB)fFc&&>)&s-*(dkyV-0)Gel{AA;FN{hbKW&6r$Gjv|f4r6}|GJC+5;Qc|435(JZ3 z5w{7lc#BjiS#!zirDgro+904}pBXE^0p56JW5`f8R>JJXYK6`Ksy~BR&?#cBXyxRY zCpL|RP7zxUwwBB=R)Yw4=A3sfm38Kvi^peNOG-{OGm1sd`u!Z!%KcBOmH+zB?*{HS z6tc6HiSB%)!r7&|R}b;SG5=PNATf5^&m#4B<rvzqrLz<=Fj?q=^#esPSYo-ZT-v_X zlhGCpI8mpCp!*8zh#1U|+ivTu1_5M~6-{}aiyM7UKp591EJ9`yQ8KTILiNMZUQrR{ z)hrGer}JL@peLH<iLU0u+ekh0aids{yvXF9I}XY2@AeN;q`5K^RBFR*BkkZWo@*+A zHfqyE3XLC)S!yg!lU_})?GP&Zv@5S`$qH;inW#VvfT{rJ__)^<z!d*>q~H$9`zxS4 z*k1u@;%<pybZLJ@;-n&25FTqqFuAwKesoT|J>W&UBI8(*6vqt3?l%z?13}f>c<o9~ zLd_D&pg-VX?#eerl0u9Wrr6?PrUXdoyv@<7@km!ji5H`A`;e^~Z(0?*ntr38lVk1V zHwuhF>AF?DVhnH7#`uNC^RUiFOU5my1K6#)C$K7mO;s2zP}g6mif-S4s-&<gIG|%Y zDBCwhwQrigN@-H1v}UW+Tr;NpT9w$oc9n6YA=WCH^h<RprnUk4XOfaBkAWlSh_m8` zmB_>c6trOEe0h|^J|$G~s}>Cp)vx<OLX`87sAGR%!J$>mk*y~Y`fT5N(qub_?$46( zp9k^K5sZZ*`vxA=Bndg_rJSNz@(77B3LR5DLgGz3{K3*h=|{ANlvC}A^<o;#oZkGG zcN3^nwp?OJqsc=E<l%;2+GaO64&skexHXvGZXP#N(kUOeo{)$|{m>n3`Q_MVU(`hi z64KQ~k!P18XNt+F1nN-{vkXW>1dBw!iPQvWNjl0(k`yd55PZNQTf`n&WqATqv=SST zO(p2bsgzkPFK6fi*pV7QP?iuSNWwh<O38#WNod{7nG=Yyxpj2S;k{Z7sv6m64Dz^w zlc7sLih!*l$!)eFbI1TL^Q;2mS-tx1@KMpd1n;gGmE?hxX)2jGm9kpeBh=<yGes4u z)ubuPA=VxUosv~plu@t@^_NkQ2(yV}2abYF!eKUlD!P@gn|&(*6x%V*MObjCxf4fC zRzXP63^Z`mMnxI+*c_39+T9>pT)?qk7OhsG7zkm;NVwf;_T&-cZFyZgC?l;OUG0fc zw=Ei;qeu|UaQ%oTa5#4pN4N|_`FIdd6)@`Ju3Wvw5-u7<i4!7$)7EnJ8VmOmqM*Tj zsGTIJ*I3-zdmxX2-TxX(3?`Q)nlYTd;W4kVxaZ5OOdkDqja>=k*6*{#%<spXm;&G| zCH6va7)kC~DTa0o*Lq4S^{hp$6si7ViHfXZ<5yfb;fR8RgBt@9g3-rx<ECnSP^Per zYmALH1T1-65gT0JSk!lx)K@AS_=<~r&ac!sc5Xn8J04q&>vyU>cC)kRh{xrJQm9oX zd<;>M+buyM5$1qj=ywP7p#_WtFbxhYsEpD_<HR+(i)%;<-V{+gi*ay`?r@C+9TVZ- zC<_7-yh!0gNxqFoVR-(~u?xQpfa&`wLZGqm03;k0uCLRsrMNH^1($5=BDjeQC4?s8 zNixDrRboOtr<D#7ZS2QO9+c^^=AVt26boLDM0P2LCu?<X)l`tnk<K$m)<DiupnQ_# z!R|5ydAhw`{R#z&Fvv&>#Zwg{Ox}h|NP;vflu(_*7rdG-*tSBsa$3}+WBqD1=TGqm z4M+PeIFv%;$tJ89Rd#H`W{Oo?f@r_g;uT7TyoaC~e6c)i3T|_>5F5iD2GP4r9vO@9 zfCCYVg0WBbF(EDo6C6Tqi`q2I9ArmwvD&{>o08x;tn<-s%ySg50f9wf%7HWvns8%# zja<cuC<-&7jE~}}jO^19Y1oJff~bc@a1;!oZzE^n{4ZS>&FF1N@-C@}38Q6j>pYdZ zSn~Q0x0*I%Hi%*#?s{wqYh;IGuTMnzTaXr9Cu|?QsB1-U@_OYIYK6S6pzOrwHQw@r zVsXLIa$YZt#G9F8?St2t3#u0hynI{>oHoRRMQkq2Z_&`*ux$>f7JB1|BDga{IHEcX z1`2aE++_1YSzF{XwU=KN6%yP8^_HH8{vM0;$8;{(B0gBePs4s5U&fkZQ_4%-mJj2C z?K5^gxrK+Em3E5w3^oZ$PV-YBi)SQTs^=hDglrl9WE%|osBri=n1h$R;ldknI3l|C zus-jKxw<BznvM(C0K?B~f#dC4;Yj4MO41yLWmC&@^$PRi7aNTEV_A-Vf{l=qpwHge zNui18t*Y9Lf^U&qY4LNdI?+hUILcfh?~-VZaYrTmHLBGVTf3RDO-c!<4@S5a4bN+d z+6E<8HknVCZX2H(yPK~UlY;8S_Z75czjYy%*0H5>hoT}TUQ<NACk}d%QX*TxwoO&p zID?u{zgo<!1VMn!9^g}|3CP|sn}w-D1FK-S2lqQg{1^;l3Ef`t-^X$9n7Sl&doi(k zZ`Cq+6ECT{ruuaxc#z;|T8aoXfxniR^tk<P-m(7vAF%*i!uW>4%j?72PWr%z9&+s1 zEw6)o*u>!$FA8%UZb`wdf9&CoQ^5GMR9kG7K()47OZ+!XB!W&qY7w%bi7`k&GmsZf z)bb}mrWf$=BrFH?10PN=xa2xpq6HJwmY+urVwf7}hhZN5Fbv^41vbcpj+Pn7$n4<= zkk)V_aUQi-_q<D?DbtE&=QB-$hZ|w1Bj+!8Zi_`aGjLb{k|`S<nGKtfnAxIu9zjUS zIh-Ca*<0;Zix=@*`UIv5$SQNDU)2Ds4T<k4&v&LRGR+prgP|0ghOXc6Y&}1mp!gwQ z%z?hIR@5n^dswR!M7;Oe;2>b58_NPz4dV`GQmi*C)v!b1&b)>dVYNlW`(%J{Y;ov8 z<szY|O~M?F^Q6Kw5e3E^dqS3HQ>J0XFO%oO2CT6}8?H$tH;Oa4SxjJVQvA6QqRZH} zRtT5pdDgrr7%C4eg&c&q@Gb)ooosWY@eU2k@_ayZ!0powQwkxa*8DSQZIDYv2n*yK z5Bzf)GLRz=rYxN^02oh3sx*DP5R+=;Ee)I_suP7qL`Q@PYSm-`O1b2iIeOX;ZB;9Z z+R8U077oyB8`WmaBkk*rSl9v+$ol6Q6&CDZZw>6sf&IDs5VrtI%@Jl;4Y4Fdruc3O zb<-uplVfESAag|=?^X*$>6!^-5r6Zq8`xFi&`aNDB_$qlCalggv-uM6*qq`y=f;u} zCp$GYT&R#Que$IcaGV4IwcgNpAdeI^vnaS2D3we`4~jsEax4+F6tJgQbNLKAMUK^^ zEC7LxF<1Hk+3l<e%!gMMz?&SXWqkq7U%n%=k#S*P|9QYl`^C%gS9r@0iM8-qy{fPn zDpo264cm!TC+29n_od)$D1u7)!4^;=6S`(%ziB%<EZAakU>3~iuWg8=AtsI7gig=d zHYC9Da7=(FcH7xhxV@%!0~INeQn1~8(I|?QjiL@#!=;V0IfeO)a0)B*3zNh7loc!W zk+p+6cniS|esL-{Di@^>`nYA|k>9!)Lk0D1$xwA84bmO#k=9(Q+#Q`SQni*F^^@;e zoNCkONh=z9X+xQQ%23OSsxo_m8M_*oAYuIv3D^gC8QzYgWyvhvyJWCy1U`+v*$vx% z{ZIpZlR72Cg5sXGa5h3L8o^bq&-qA6VKN|yck`4&7<)%v{dru~K};cb8<dn%2n+*S zz9S*y8vn;x;6MKF88jMsF+tl4r7R!1q#7^1E%_56ECgNCCbes&NC^$7mL>*rs84>N z15&9t|G~Bd2TGyR_2Y=aHvWg;9P!n2>Q%rbMpBT3f}kulVBp+m6W|kY4E0Kx$r2~M zz$3W@O+p)a5IUX(zbI!LkvATMbC%t379<iuaIoKB<dCF&i|aL}S~E*E7BX|_CN~J| zD$=g@Ar&v1+=~Md;niU+WIU3=k{u@nFRLkck~{rUotHP>YMdhzPeX7<TZ0lR{euTo z>N61>Pz$^SX=;JZ59JDJC@$$2Yr(mQ^pLb)s)h1S)B?p~+nTjVbJil0=1PNNnW%;8 zEOO_3H4v{r$!i}n7)mYDR4p*0XeYG@Xn;~kv>O03svJZm^{^*LLbN_^y7+p~ZOtPV zjn<QmQZ#%mGRSvcXs}Y0LGh&+-QZq%!3`>_lYl1n3;hU!Omm7byiUdVHVp#vAbgr0 z&3Qbk@a}FezJ3%>)L8u7OAQ5Vd7-sc>L5;#G&MX|rG~V#6X1)`S&!RD2yYkyjip8+ zr+Qm}Tb1(Ylb=EKu^FVr$e`+PH+QMi8udRTVEFSxQMJPatA&%#_!Aq&_NV$nMwv#V zei97h{M6HeLo$g+6UM?K)&kX6wv1@kVotgpE~?8S!!2uDUFhAL@fBcvRs&0;wX`3P z9m;1W<k;af3V^FmvwW=)_zOcCS`xrmD(XaR#Ehb{(hXS+<ECm6b_}Slk}^IB9kflv z^1~A9G^0<8^(nEXN^EI>*it3dE~&bV2VYTBE)e3ZdFP<1s4!YhO~A{Ky63fnvF!Q8 zev^}1h?UXEjjF}4WQpVYu`Z;=ghiB(gl@<jg97G&G{^Eq5`_4;7eA+k@7#s~wmb=& z4HueQz4r`jHy||XXl$Z(Y=b-{T7_c0E$z4sK89ZBEK5zl)NtyS{^qv*K!QaA^l&5K z+z&yz>XKgVRkN;8`$>pQzBmD;bu>%6gTSpomgoSMri4TWaOgME*iA6Ilg9;^-9;jn z`Db^L^%o&D*53y=ZO+y$BFZP(wpLSjbo(-@howg+V?VS*nz=E?#4FT(qCLbp_-y-T zvfhldGCF(YP6nS8nXaUWePtZ**uB#O`=-FYJD>^qGws}7xs%+fk~>v$r;_X#koY1) z#G(Z{H;R-&q}q}pClA8&)TA^|CZ&1WwBX8<wkbdAnLC6cb<PoZD1ayZ{(C$YiFV#& zRwR=>n?I_`8--`z>9l_b{<pBnSb^!s?nx3b<SA8^d}*%yP~@&K)ic^u<6wGCiz@Zr zCXPuJUkHl*`fM!EsmcR>tezrXXm@G1ZIjSaVG%FLf9Pm~w#{=zJcB#Z;~F*)=SQX@ z9TRD<T`Ce}E>OWI?z(a^)p6UOkpmU`w7alk0S9)&$!EVXU{fXIuCi5(E=;G<c9lKE zhsXX~ez(tY`$%j1mhV5K47aob_YXWw(VHpd!LQ=be3<_u-Z~%hEjUzzJlwVS$Qa<* zwdZWkNKIaX!>n6s+fd2HGSO3|LLS`@4zzGNCwr>d6$idp7Fcbsy?!espP8PQIwtq( zwLzFZq?C0lRY!$O;nA|{0#Uu6=WSU=^-z4CO^Vp)nS=Wr36aimf2Qn~U<Cs8niNSP z@Enn*Hg)$yIOVDDcNA8I*cA~G9$gW8{jQ<(S@pcO$r@cp(^W#UI;~Ai)yqB<^Z%H8 z7x+HM`~Uw=Q&g2E6h-l&VR5P?J*px!2&#=9=qO2=q)jwUB1tQZ`A~;aht6v2#;gp( zu<~_2OzSXZY;~BK!<3mX%2sDH=Kp-XulxM@q}Xr&|NnPCa_9NJ-`C;3uJ?7gulu^M z`~C!3(}$?iSvx&{*6eAV%i8+mPUP{Pn9WXC9^FX8rAv7yU3Bz*VcdBbi;<StYmwCp z9vYyDc=<UP1NGDOeJKZ8oLPC8{}w9)mu2Xvk!1ik7x>^sle??9Z?H#hJe7ZZ!XiCW zQ1C^om7--x!Q#mvg`|XDGEB)Pv6PI9r=)){(nzOdIgu(QYGYrMlI!u}QldaXO72$3 zS>#izA!5m5h!iHPU)8|70uQULW#kEvu;@1lz~obShW_6qK*CbJ1{nCDOX{N4_q;_{ zW633Zi(}d2ygJ;cx>d{nTzN05Y{l2zsCg69U(FJ%z@--;h}_O!xZFAkG(qYY9oBLF z!rODT-RCd7A8oQ}J$811x=L+14y&C$bg<i+$~+-LhaiOVu!hjqC(|#{{Y=fjEO!OI zq7FaS-&@Z{Bh0Ap%2Yp=Rc+B09IvsX;8=@gf@$;oeX;uEFn)~XPqX;(Gd{7=nu}er zaqhC{h&wCl(<&=Gr`^C6U_zxdCVkOPxo2MJ9F&m_l<vHK<S={%SHQ~9AbxsDYf-hG zFLY6E!u&XQonw9Oia*Can3mG4l$nA&f1^)n5t*}n*<+PliI5lMz9nYYzu43TlZ@_( zwU$tY*FH@(l7$X8-&TgmEfMRu*%z$XXu+D#bX0wj9=#(`47!;4GoiNHXhapNvU?S& z8bKEN1*NFnTR~OcJiE!#EG@4^YbG!6Ct(sZc{$f_Ugf28%Wwj_R+pMURFyXBD?##a z7L-U$ATmK!GM@<(Mu1cy{sj+{$%*E@cx>6nzV@Rv<RlPh7MJ%Uw*?=CxvfO)&lT0k z3q5*2V$5LjaA}8MAO4Hw$r&iyBFkc)vegN{b@{G*tB{Oa5mU78NMFyY(phvu>@{M3 zJ<_);dR;TtSM&oFBlobfUI#PI9DaT2C!Ti^qR8eZ2Y2=zzG7`D$Ad{fGlxW3q%s?L zXWs(k!3$p7=-w>pdG_-~PYhj|XmPprimDS4Qj5rcb!Ry;9|u#dsnG>8U!Bo1J$*n- zj^`KXAWRL<yO<hKQ?Y9)6${%?Yy1RO#}l~8%6rUq{)<|ryd6kfxi!nG7yW0vew784 zTy@#xpjEop+G97Tx`VYYwbbhTd{(FV&n8Q)rLHBH<Ui<ps{Q6G)nk?YFlPJ}-DqMm zeEBxr5L|M<ef<n7C(NyuCy>N%S1kvV@by*8Z`&jF(jVCkneH7@{ZU3mX_L^dcwB#! ziTWedvAU)Aj7!uXHCq*!qf2V6KYA<dk4mEwC=GfDf|M@k>FagdsY*GO)khv{Yj)VW zZGZm3N}7l>ZuYyz>Za?_SYDIp(emWC#(kG3bpfd(^BGkWMPBDRW6RCFp}LhCqw3bI z6V+MGQiTmV-|g4xn{VoVExUC=_iNcDpj~X3$?*H!e8ZRpkHpq!`Bl%*`}-O8aiKvZ zIJ^qF>z1F|B_+!&GqH<VlxDuzO`FwdT%H*1Ye=umxo>2~JyzgRSs24*QNFltxS^!q zS-6{+==rz?ZW`AtShLYRS^3vPqdQj-L-Vt`3{zNUP5&_@R<Dyco1s<wOnA6E45n&y z%tXhp`Jd>Aru+R+-KS3v)pOLwgln~2hjJz!rxbCrI`Y-HiF@Lj^hrEZOBxprQs-A= zUq*CK^yb+L!fOBPifR`2P)~80uR2P;j+d^LmFd2(=|N839?pyi4w?Mr+>z+cc|Mbz zPi1&O*y^Az`5m#%kmw~=zdiZAbHD0EeHjoqQx+*TXxtGV{Z+Ub(?_EVt`C_m>!LaJ zp7tF8%|z}==sjVnJv1z3U6>BYXlcLBBNO&5l6@0>{@{Uk4(P9!H@Y`6pKDLhIg5PD zSi%PT2ZPsMr8vELx&)5?X7N&frT2bCCD8RyMV@No@%9ouFAXm=JTE=-U8~^MWOh(( zQV{q3?&Ta(bQz#!K`Q{$(|3dUT7)G5Lr9d9e?LX;N)V+<h8eiv6>BfSl60byr-2K8 zi`tLQ6=QNGe5oHzKDRO%(@oi0XX2i6jl+!NXdJ&&8fZ}z>$v&lYSOEunW_(7VYgIg zwZYq(7<Um)C>iJaPfp+}O|>}$M>Rw{E*xW3*(^<!%}467T9uXv5|`%4tm~-BsTMTE z0sT|MgBt(i0X2SosL?6ImbUf^9mXCZhQmklrIK1i|FDN&6kOU#N2ND^8e?7c&7V~- z>gEIOgYoy_HN;aHG#KXoRt}z^f!5P9ikrhvdbmiv`$glp5B<Q8Kpk0dN?m~^pI<<o z)x8QakBomXcRM|mT!909sj5uQM`9o6ba{J(Gap%s|M018YJ5b^j9-z>`WY*U*wDxg z`Z8TJbq@1V;y-m*WmOj~wWFk~vI-9+R1La>;G#{N{f@n-E4K`8$r}vo0CYj$kfk~| ztvwG<48&qr*kpQ%nBrrkhG1`YMEADR(i7xp6Pg7%H-NGG*J#L46dN)iXE0#;zBK3) z!d^hPr<`Az<b@gck;M7CE~5YRdsULm_kg);vdcCdDZQy$kmkOVbIL*7V(xgHxki2V zuODd&yBRHR(w85Juf|%WVy}@!bhR#(S?Z!Ydg^h`H@X+Z?&;&_?`?cgsiA)l@peQf zr82k&T9l{z6tXK5rdVZWyAf_yJs>TXT331shLQrzlZHI~tt`#T9~mLf@Pry|<ppif z$z^`A%I|cmoC{WI%}I%`TsyCX6PGMlr3EbNg5{H@xDeR-CpQnvsx6BGtr~3>+U1V! z%pC<iny%4RxO(<%rOL*&RVoTSzOm_QJyF-vwyLgOOz)p;pMLrvBK|nmsdx;|I=4P+ z?+Ltj9vz%Z1xi5&L#oh({%CQ7w}a;oic1-BeQ*$S@JOASQsRF`F^i|5s*LG9=00m} zdR4s%rAM}MM{|AFZWDdDm$i!i@Q;@c+-$%%7_mh4Ezz>R(U`h2qhgdDsbH0*)f~CC znfm;>@1keXcAKYXkbD4rEP0`85Awo#C3Rp{sohu=&E{x&;(n;#eb)ZcBAB;_J0D$= zO2+JG2K8s+IBz(PuhZ32j>&Vzz3dnB5=%tf%eFBuu~f+mInR3ySP+f=bNdr@$|O6u zY$-eHOEYStm0_o`AgAYay+opv2t#21cGzSYmJTlX@`7jQsiqSg9K;+r*$i!2!if$c zlN`;)*Q+JYTw|rMpr@bSdf0_w1BKIEF#pKB7gK$Go{RCOl!Tjwb6=lV5U;yGZCI;} z-NXHA`5{xPOU<yE-n>kiV3tssK<!rhbyyXn$mkWZUO%~Lc_tsSx%e{Tu=EAXe}hyN z+~cnGkK0sTM(47J6*7HK6>EGfx<!MySOmpGw5qvdyzc$-#F7&(mPt#2D-ZqnP&IcE z7&v`fn64kumuAcEQ3AtDj{E3lo-fT($5-IdOoJ`QAY1OsR5}CCc@EnuDOl0`sKZ!= zmxB4VL530|pDpO><epPrPx}Eq`;`#&npSH1U6Y`<CMgmbNh=19EF!-I{kn!hD=j^I zT)kl6IsJ)*RM+5N3%8K07pH#t-z~MWbu#5pQ#kM<eFLDn0iRTfvzzt$g8ImyXsOpr z?D6QL0sY@ntSdj$`?SkqUa&`w7mWxNja@ix0EI$<s`z;6YSo8Ii!G`Teb#>e?FkfW zV8uRR3iK8bBT9W-g_^7q)}^?wF2w_y7fl^x{a<c$d#~LiZuAKkZ9p{Mz31_S=pNSW zxu&yV)rLv}{UKwUs70AY{mPaz+W5L}RK~|2iB@g}Rim1fp^QqE9GxiRYS!h!p<lD8 zVdhp;Ft0J_W$@2H#M-Wmq3;w=4|*b^4Tqysg8<eoeS-i)*X|e?=+-<2D#buHm8SKW z4Eg%y9qib6PXi^A5?=(RhZ3Zg2L;w{_~&vwlFDk94lZhy?#ORhK^`pAmAte=@R~qr z8S|A>iQK*(sX-67lvym<JwB*NiRP%!+=gEDMu=N|7B742O&@yuIwA>9=2GBK;$VSl zRqIlOo?u*9qv09rP?p%3B~~PUZ`Wt-kwIiG<?D-VDsRTEFDkz*^ub-OPAZGK;5w7; z|9Uh1-v6(do@+*TWnR1Qn6|ryB(Vl(Mt}4h7@dZbp=9VsxL5G)l;t>|$tSJf<ngGc zs{H6B{pt{ne!}uwkI`cdK2LjR@_>r#Mp5&+Rl_-tT{}wMfj^=v3sP&ft;|&rwer$b zEBB+?E%0v@YJL8RL(dy3gGv%huYdo@qsj1B9o_9e{&NN|giGWvJ@m>GB)2|R=D+_7 zYK>*SZqa~(;9?V82AF0V5dP$hWjUWO`iKFg`s#S;fj0Z%Oc&i&CT|>bZ4#{qPu;nz zzS;WaN{w#f1I|RQWA^N0wK5p^{MYQ6r++>3-PJmm-BRv}6dUBMu|(LFuX^|+y11`G z!(d<?;OK6^h~svkjWLNd4Ei*$jW-?PO}=pxioUNQib)(H-Ve0d6txZ*aX77iny1&$ zC(D6Vb$p#fl7<JL!9{(~MAF&)`&Eg)Ca3`VqKLwrUv**G+AHEGEan7q(IUBC&bYVl zh39xngNPPQxR4w6v-u`6XHxjDR#rDWZqeVOs$;JYDueU}N`w--23msrJfV_lZ0WPJ z(%UPv$S*xJ;TB@YUin*1s8~DvPwSh0H~0wlzTWoy-_@kO_<y)bO4`9D?MN{?X<zmD zraO`g{9u!QfpnZn4~LRoad58srtOL5T7opkq!CE1CRHIdnKTt?mPw6Bb4^-`<YKu7 zsm*k^Bek3K2vUbh&mqk==?$c2lRiQ^$)sv3?jq9N*ZURHex_T(*lk<q4`~~dj@c-% z!6W@VZ(q|rjkLc>o3SQmv`IT7Rho1-(t#$OfOL>aok-(NIv1(Rq@N;<GwEq0XXn2n z?PI!6k$z#)7f78Z4eZa<xJkDlWlVZ6l(yI;&~3^Cw)vK~9gt2oX(-ZA3-K_L%CoOm z%Ba-&8;R6o{>CCXe{Ug`nZLzUi5*RPE|j+Aho+tGnj+6DH`k|-TzoGgonrC5isa(k zxj2Y#1kxQAVjm=zx1S^JZMq9L4`TTV(y129l}Ij@o-KoNTZ`mMYa@OL+ewqR_Pp;{ zEW1)gMwzq#$+^Bqk&ZCkzmZ0o)U=)FtuX0CB$t*`k(`}BLvpd4L}S>={O!bJ3@7!) z0K-gI5=x_yGNwB|l&;%3sIh&>1Zr$w9ZHu{^kYp|MADt~10(|B?;WIlP5KmRj7faK z#;Y)C<J|&jd!%Pfw=<H<M?<;ikpW^kAMe9Wx)JFBlRgS{TjJz&`%#&ltu6?qJCR&l z*q+n7Hgh7C)aBzV66ZqviOTGx7imr|#BMZ`jGgTuq}NS46v?IU7$j%sTRFW8+qW{1 zb~`XgeH)T<y(N_X5K8ya#GLES;{)l^L-?(3JKLk7R6(ca{FP4#q^Y4aKa_qFO6!gc z{LP;f<l|i=^^1MILniYp;3lmOr46U>(FN0u4yEQ$`bj9=f#gc&_NkutiG|S5+d8`x zPxCwqk#lq+QP@c5Anjt(Ql#BYx*ur|lTJ7~NZ)qH1SNAQ(nbXeI|0eXd>0a#LN{!B z5MrzEdfpDEI~b|RLL83dLaarqG1o_r<s+jey@-@C>E`2tuzyC{&cgl$$%Q?1hUbwf z&UPyj%@AqC@t#Mrk-mqtvxUeaxe#w5kriBvPYBN2P)nOOf6YkF-)r@O>nAfkZ)*#& ze?!o39E+sam->3ONJGta9?~$=or>gQ`2q<u;BRoF=aEsQdL#-5>Euv4ABjqVu8YeO zNkqCB$>rm6BwYdfddrafd?1klbUV)SJdBPsbGGMAH0gdMm&;d?CYx@{X08wx%eF`^ zmR}(qWv&l|(jP+U3nZ6<9b1A}4hp5FP&x%k({_Em?<2XGZ$@(Yco>P|#C7`<J&$5S z8WT#3kX(;`1=492%T-9urW3eu*I9@&kxn<)bCI0u>qxG*7}FZWG6CuP=I<yZ=WnyQ zo;So|DG#L?NG|4IA=R7fN~AL^>~E1=*r$-Prh6Hw#Qgmo=}gmo82a0|jZ!t;W=PHk zJ0Q)s5WhrnrS(E6{T=Bn3-KkAi}|tkARq4_Eil)AAi1=R?O^z2@tqS&2b>gys6{&4 zLNp?|5H};a5TA$AMI??YO({GON*^ONn69+T^C&P}zlY?kc2y`nfkais^*N*_JKLX; z{QP!%-k#=qFp`U}2g$|v7?LZk)8+*+Z;E+bd?S%MEWWWwF22K&_~UFB0~d2gS942S zcauEW#&NAQwcYhITbpV-n;P0X8^>l^+UD1{wlrqs#6e?IPiB|K{)Fhoe|LL(W^R4k zDVeVJ&h91`u4|`E=AdbZ?xbMpa4l^u-D5LzTe`Yh+Gg+F(#Baib+<d;-1@FLT^1@G zuD+qWWqy5kQ?0y=&4gz)eUpXu19o(oA3s}jn>uGVk*nEl?VX%3%pN&wX=v)ol<v~F z=Pr%AaZbW1&t0`$-A!{NJ2bY;ZEEXkX>XI)-7@pKn#>wG{u|oowKitj+PgFLjg1+_ zL4Z~wZzWWByGvolZ0#}_p0B%HzK4I^DRccd)VH=`@snG+o5Orrv2~x)(d1jvirW5- zA3LL_v;9PD-8JLDj*ixrhWc)@)itBLbAC(H$upXIs2pwetutnIHZ>`R8C{(XGlE(p zfpQww5ZNhAcQWf7shXJyx|DN2&;PCS2RVxDQQ_)DK6A`$>9+Jxhcl%uZ5X<~G1ESa zLlt>qi^b<>VQl7GM_I68fwv)DOu^tj-r&iDI*b)?U>|Q_#U>pE{rh<RCvWIj5pkPC z3%wx)W!{#A)usWzh1r}i@vxf{X0txtW}W?=z7zM6eY_zbZ0U}l;dqNa-WHn=>?qi@ zkGJXO8+W+4w+iFFp7;y+D)u&$38VBp<EKOEQkaU3-8m{aht4$_j#T=#wKyzHCw>*j zGsIC`=oJ?X^7<>^O6z3Opm3M=@7QLX+;%rN<x3Yk=YMnOU;b_*em()b&CD%32G!xd zT_MAj&Ama2Z>vIYE98Na2lep=ZC(`Fu&mJAx?r$ZB)7O-mA0T9(hO|58#cNP8!67o z#F^IfM8)zWTTaGbkgs&O-3fmw;VXPw1pY_%#a>%ruR(lX!na9qjv!6S`{v|badvVJ z*|QUSmQ#10q0S70mqNu^fxG-y;9qqM{Wb^6Hd~o(WLqm&`RVli+~$W>J_Eh%RDpeh zxZ>xo@asd&eVap67Ta1`=p3uqEuHwSLgsqp6?)4;X$a-(bUl3n>E%$uo86L&+BU#< zust7>M+8c!*n;h>K!9<1zy^_n293e?NFYE)bK#~N*I>IP5a5`?=wJk?4mN#GG1$%v z1bFC%(E-=!aJw@W_V=OI^X`wyPsZeRG5P6OoVUl~`ElRK(-yIGo*46EbDzGq?pQo4 zWBw<`@)FPEp|SXf#^jTu(|W&-$)z!y9}&~v5R<p~2J+;XpSxr7wJ})(z+ihm5a7Wv zIi9vFWBMmz^8d!<n_{w_?gpD~7lQ5Hm~G?vni6<`d&K0p9T?w+8zabYdovdQu`zkS z(1#mj28S9N2ix~z>G?~bgz@^^9`pb6n4cYE^3E~&7cqHEOzzG9W3l+-{&yj4Ap=f# zD_rRHL;8W~2JnAZlZrxV5YlC)8_fUjn4}@IlQKv@HeCt-OHI;$CuunQ6VsLPe>aoV zV>n4^y4-Z*_`kbJm7!FH^fS{{^Iv6GXt$3}s^M5RE3{kV9+Rf?-$^r&t}$I5|MxPf zF_fB-R7VPJqI8%^9sGBadWT<`PI2vR(rKZTMY`E^XY*gVD)bhH(uGK>-G$y_{+FAy zB$SpS-D<ik_+MetvQScb?=;=@{2y+TYQB?}Bi(Jf+xagW7TU3s?&tVk)2-nDNRu83 zrBz7sQRqF%|4}Bb4yEUiR+{bw{*N~4<xpCKq?ii5H~2rsq_;xpU8LWdZXN&kG3ldF z`V2|uF7&?O|5%ee>ZFtO2~o9p>L1d+CJhKBO`s^Xh29{faV8B8C0)DJTNip6B(=vv zuOyU8k)Ac(o=E$fq?d7>Gy>_5rW=EFfJx&*sS@c=rmI4#G)W^NCrv>5v*~J(4m4?M zC{0It$#gT24l=1Olp2v<F<mp#c#~Q~Nw<Z6HC;DSl}SCJbQ;o|rpqF!FD<m&U?(j^ zr!pz@E<`%Sq{X4M1nC{qEk!!iq$@&c8Inq|(7Ohy+NA44=_aJVn{GMMVJ6)kN_Qiv z+zY+?kq$R$MJPRj^nvMCA*sKm{)N(Nq)$!v9MWbcy%0(-BmL8KYmf$-^hPMXh4e4e zy^B<2(z;Ok2<c1HeTGzQ(ifqmFD!p$I(-pibCdL~Kqn1AD!^}{SA;adTp4!y5`#If z&|HTg9ciwaP%1&{XRf746U}wcP%1;x(w{<4SMo{bIwq9HAq_CsN~9WdtqP@Tq+)ZO zfOM3(>gOw*G!<zJbDfSf*<5FYQXSHk=Gus)t6`zn97?T7`c>RQuLEhSxps$=#)U)7 z^)#eu=9&$qvypZ%*M&$&o9l(4v>0iqxh_FE#$1<%(iKRh=DG}Ny18BxO4lRpZmu^W zeb-!<htlmxS{y<Dhonh2>R%|WKq@!aN05#)*HxkPB+_tmU5zxuT%QZ27m&2#rO<mB z>3DNp6H0F&>DTBAy|<7~FxPiOX&urybNvXZ)?7aer7w{7H&=ptb>`YPl=>l6nd<<g zdUGubr9nuCnd@MrndUkqlrl(1m}?1AgSnQ5(w<2ASWltH4VX<rQU5|oV`zPms?g)s z&mI*PdX=G6g*4S%tC40|%o9SX2I&}cor*NuT&IW945aUxYaLRvxi*GUGtzP9+KSX- zt{tJ&jdZ-Z_8^^TuBU}k7OB=;&qkVKt_wryLZo_gU5wOfu1i8`Dbg%+y#h(2KJJG? z=^CVFbG;s^&0KE^rR7K`n(OUI?dE!SDBX|LYOX7gI?VNvP+Em_lDR%9$y`^5(sM}N z=E~Z-uM}3-saw$KxCvR;)tS^F9gj!WHUGE`-LbCbx`qw&kN5PCKkSPT+q#g6GPZS_ z=JB%a3P;S}rFH6*Rhj1BpLgx9553wl<II7Ne0h7zJ2$;_!2Orb|L#K<o%7Cbk34t& z&r5F3R{iMniw4b`=pA)><E}6M{GcCPc+#;~Zg}03FO~m#TF1v%ow>=W0fQ4&Hnh*} z7}nDG;aPnPzM|u$hRtfK?;ciGwz!}m>uct>w+@@z=#fS8C_lp*HPJX<nYUCIGT)Nk zhBY?LoHx5fU7Cd~EO_#H`f)`PZoVINY{bf5pgNJ<hIKa9ch@_ej8<5%Y$G>j{Oe(Z z9*_J61{M2w!@8M-E19cm;%&fQSg>@y=P_O2m9<~1L4dz)3s-ag4ZMt{z>R&&=u9Jx zMpbJP8p{-2YUD?)B$Lpbfkq)M%~&kVghy2%Jx$6m+pXX0xYJ1`Qw|+IV$7%t9ho0* zZqwYk?as{TGUN+QSCguSZPIAF)c)&Vpt&MPb6t*Rd5-4(9F0bRZVO`8_$sM+J5YpY z|2RjpNkO0r;@Li-Ib>?>)aK6ilan#)8l)|<^8sio6PjsgYS<$`EgY3$-AHpXnvR6# z95m|^nxCM_Qdm)_o6!_ed8Bc6z8_6l|G1y0&@4`9UPDv2N!-uB(5y~qiixgf)3~2K z(G)Sviq2jsKMao|&GBd!ZxPq@pjkdBuK5v~$}QuXYZYp{xMl^Kq9Jk3U(l@HA+C83 z&GH@NnlI60GjWaPPU?1wYj%@n=eTAJn#$ecn#pMN93{$^t|-gsKqAc#(5x69*Qlp2 z8x_~6hh8^2uK5T}2c2^i&(@S@<w0>x8JcC|<C;UztT{NYITlUX;c-m|nmUGzQOsv6 zR6?T#JIfe2Mt-hGQ<>-!?vtN{W;L2RhF?)AE#oO-$Q5bcN0UuxaP;aJctw7S(JW7B zc0$v^@GJ5&0!@Y?SEM-%&ANo<cr<Gmctw6X&@5xH6=}{xldX+wu0gZ9F0Q#7&Ekf* zW;L41#<=EnG|Lj2kI<}1X!_F;RyM^$?TltcLbIRz%!>P&hNg^RO_b&~G>hq^Bh49T z)+96+p{Y4B?&oqe%NfK(p>9G`$yFuNJb<Q*0Y{{HN}(7iM4C17(;3(N1I?O*=1Vk1 zU2#7HxXx83G~1$Cm(c8nri|-Bbgt28>Jpkm&@4`9rpeFzc&J7+ZVURlo*d1&IhrLo znrjo9l7o9%x=SiXzqql^rK?)Wgozb2W4~WDjq_7cYJHt)rp#&SC>cKTKI@TUeufuY zPa=)B2RK*z?qSRmb;Tc1es`p?ct%vby+`0jp`IYrQ0o(-b5#t#_Ta#eOY=zY@75}# zvyb$qS!;?kqr4T?QsSDK)>0x(dHFHcQev9XE!Hk#n)1D^&PSRN-gjmt(^EcTW2?`R zpYq{zt@fJckouO^lJYTY88rKLHq97sfYr>HpYo+vGvk^~tsY7<tS1_#s2~dqbO)sv z4_|Wc3gB-q`K4@rykQ+tsDAh;EO>#Q_!FdC-rZ}zAdKgI?uRlzrq*{%b>!laY7~b9 zVB}{CVo}0RJDR}>KNt9#D4u0#N)mqVK$A(t^E)(Lc4FsRgQhg$=L<CB5`MO(E-O@Y zuHk5^6MiP5sX^119aFH)MpFkP&6#MHB{V-nqY+~ivp$hF6%C0Xo?(o`yJxx)G7i{T z=g@Xr!;RDzZMFDesP0uFn;$8?ClDvVDCWPSsYBypM)3ZHM(2wBY~A18qeXry&`{-L zex{=7K@<6zhlT{i{QMBj*$F?((I_9$xt>L{IN|4GG|SOM7Sqzt6$woR8jsOc<Yx*R zy1H1*?P#t*6Q%G1G^Zu}{2I;m2|v%GQJSL^euC!qgrC7w)C&`S_D8cK;imyjQ6hz> zp~)mPKSEQN(A<V*Nh0RQ(L5Q(9F%eyny8dt#gB3krMVAd%ooB?2wn*qSvB%=IGQ&S ze%jI8o$zxmnso_3SD;yu@N+wwFA{!!hh|m6&)aA;2N#vahKzYvC;XJ48I<sIAexSZ zeU3$wO=!B&tVn3IoL6~|a{5a&nMBMFpi$l<Kd++MGvP<mo9`z4?2cwk!p{^mA0_<s zpwXOBl+!EFcxa+?J%~nkE|H(t(8xZKpG}KsaS1<T(5yxi)%jUyUQTG1pjnsDJdCD; zzB~%`5t<_WMCZzI1=b9UOHWY8G9){yV@KepBoS&p8qJSHxmbp#Ea7J*nry<)YiMM{ z=<HvixiH~p$mY(5k)JVWmL~j6K~s~6=Oi@OB>Y^AMmCJ%xe?9sgr7&zG$#DKhDP^$ zQNF%FlTFxgt1alY5}I-}n!AkbJQ0oNo}#nQLbECn^XX`M5`LDTc`o7SMl`Zv6wgXD zYZ89`gl1vF&*x~~P52oyh%_hsj79TV!p|{iWasEy^U(AqUy(H~MYAm7=VmlT2|tga zS(C8Fn`qW0G#hfas=M{bVx?%VPsDsMnjwjp>(QtLqZFQwrZnMaDVn<zer`rHBH?Ex zn##o4Uqn-r(0qhuaY9qHmFsPyvwsIoWg_PN(5RFnKS!gPknq!nW_7~PxoD;*{QL~f z3kg4WqiIa|c?Qk0L<-+Wvpk_G-Wtm%G{e!T{zNIPLDP|lxfRV@2|o+boR;wO3p6Ue zs03G_DN1Pmf~F>+`8S$%iI}$;Ozlm?JRD73BGgngx*O-uBQtFC(JW7Beu_r*Im(y5 zxU(b?^PkXoXd*vfpjnpili7w+PQ<)Fn$-!-@n|$h6s70;X!<2${wbQ95;5O_W>CV< zAJN>M@beKG)%hren=x6brzTMw{0^Fugr5V^sQ-!l9E(P?OHn*MXkJeExeQGvk&C;~ zlqEDTqS0JHl+&-!s5M0~@5nrpp1wq9-yhAmgr9meA0_-OK$A_xd@Y)V3C&|@7AG|C zpefogo}Ph2xLzdAwKp17lPEnC(PR>#PC`?b&|HS5BcZtujaqJ$)0fc<NW}aFnyCpt zTW-&NO2W@xXl5k*j7L+F@G~8aT6c7=HZ)}kKMT-g6DhnB&EkaSUNox{nitTtCSrac z&A2e;;EK<{Aa=#yn7i<7BGk@ks>4ut_Qs-7%Z<`J8O_v$pB6NW6MoJ{Q<v~_C7PuP zKX;&MP5Aj88nx5tT(6<&N%;8$&GiXCn=+TFCsI*O7>Z_1!an<=S(ngEMN`I!qB`G> zW_cp!bI|DO5XJmcG-}IH3U5WDXIhb;$Iz@u_<045o@_;aK0vc7;b-Fv_aF&BJEEyf zq;L$HnuKODn#BoC8yfWzQ3}sNvm%T+s0kihH1@k3KW`*L-G)Zb%%U`}LKAF#JU!7E z&JzvQC=5$e^fhBDlbU@hDtc0yk^3x9XhxQev=8z`@r*3rXLyEwKA{;|lhjmH@FXkY zr=nuyinL~wN4{e5R8)+vPH9F|WK)_^!)3#Gs4*imSi@<Cb#^zD9CqZfWWwWCmb-OX zi4*%9L2Y{><7j?73pLe+;)b)=P=EJBnIDUw?@lfr{pa~tL-U-jQ6o&nZ6Wd0nH>MO z6(NE}>9up)8|U%vLPKkPS68qwy{WUdvAwM+cBoelqA;_Yx@%{*w$H3@?W&zMudP7= zwQ8Pla_TP6tF1_DEyS$)h9-}vKu6ANt!kO?ONX@dNJ8ODlUWhpD0x<QEsw%#Ph#DE zdqZ&4*_1duDRr#X`0~no5^W@rw-}n*x^3ltOxr?MTI;(l0Zm<9^|O`z=43W&12cqb zp2^jAHPp8{&of)+HSzL8TYZPU0TI}*D+uSm9bvY`NbX$;GobU)U6HE`*VNbZ!oew) zCWWiz@nC0beMh8l@1XeQmUu6vvB_TX;MI?`Z}-MZeyzO%l6DFWU}<ot3?h#LgfD#5 zo;0t%t-IyarrOq~wkWR9LbY8jjZL+UO|3lWm9;Ha-kq5p^X#8QN@pGOIlJ|gj%G@9 zZpS>{XlZGi)yjiuy^9fZ4Q&y4Yi#L^Ik&dgH`aEv>xGq=wyS=AQ?545ck;Z<Ja;zD zjiucsb{4P3Py;&K+h*rR_4SUbM!DgvwRE&oN1J+$JMM?Kb>`N$u0Njk?q(W9!UnEY zTb-^wxuvnY*%`;L+En*b=^46e%gkgcZCs~D;ryDG!v-oyPi=Ek%j{<BOTtFf*d$xI zx*c>YZA~W=&Q*v+&5o;ht7u+l*iHGbE4i+KuzIB>?8odN@^6RToVS+OTXZ5*s5Qrr zlP7jz>`kw9M5auh*oCE6jiPrd|0FW2JF8P$VyyhSsL3fudj%_>u9lNZAGNrk<Bl|b z-HrKaqIxPf$&j5*N?NWy(8@HH>L_a7)1tT6yI0Amr1#$dN;+_6DO}Ij-eH}Be-y;x z-26AABG29BmcE$6-dTzt$Ij>?X=rWlYVyLK*3K6mr5x?_p`+_;!~WQX40>ljWN@gE zU0&$d1+AStb$spk=B9=@Q@ZOL<{Vw$+2xt;Fs`Hr)srkcn$kS4yRrS`Hm|n!&?(jR zZH=u>ofZlO^<Z9SOZO?Y4T=VPw$Ev4@_0<8K4;$Ck`ZNIiJpDcj&E=4ZlBj#GJGGe zWM13JbUr1$T)Il^iA}Grc>=5O-32aB*qCE1X!<G`3z*{+2J<U{)zvUSLYekz6+P|M zDSfYDX~r(Get^7AL9n1;^90M|6jo;|_!35c6YJ+T@q0(P4%C9Grmooge_@bAItf#y zr9x2&`nh-YDV<SY8ydyGb_Sz@(0f{+4iM|&(qZCGy#$K}7QF<HdB`7yKLW`gJaAlJ zP}gCtFMQCYCB{UmXo<4Q>lzhUUgvzJmgCXOpEg(1^XDu%qRJmW<tG+V)IBFgU$JO< z^AU^0Mq+u#X|Z^E_mmvW<ukO6^5l?X<IrV2=5=GlbW(h6IvcJco1<$}y%b5pM=X-$ zm@huoj3r<_o^ql}c3ry3&|o&vcgcY9VQcJ633X1~@lkCokUK@fF(+tz=$jKX?&z*A zN^_oO<jxd0#7j5nlD~8#Kk-6}Yjctv*drK>=OjJHLo5ob!mfhk8JNeS`Wlb1C|zRL zA6xH!@<*f#XE08WB`Ow8!beUd@f(BWjY&>yy?c!pJNNqjy-4CdBh}J_a{D^p<y<U- zW)MGrPTcvb(|RIbe;w;3V7`jitJn2fI&pioUPC8+CL+yqLzajtpL;9<f5;WPaf^k{ z<Jf!9xLr~KW22VlTHh^p1DJcpxMS>$>AS>Oz#OMou;8XKxRHznOFOxG=4{42W=?%g zxFl;^!l}2K6?%$WD@cTHYE$F8V5%)lvR$D<ZJ5bG?S>7(Fg~dbJ*%%Giri_s@GQOi z$QKEtWjD>2FMQ;fH)t^Hmp5qW7zVW*`FHZk%Vds=Kfd-oyIb-^dB#IT&QYP}ch6U{ zxjv)f&F7XkJ8pg;v_m|c?-T{IxrS8!BON)ngD6wcEl0{BmfMs|-h9UV#B!L>rV<%W zqC^=p?~y(gKsSw=WJ&oC)hX}syO6NjyEE9Viy0{}i1Xa5S<=pF<D}htH&NVYIwwiD zyxB=tg;;)^Q!+!EMM~D}Sb)GWe`W&Lugi)}RHcf<WyD;P>G8{|tJgHeJ>*YU+{f3Y zE%2M)(2;9iQ>W(D@@6sRCz)BBd+Rl)p=<tZhR$D?M>oTlH+8;K-rSj+O#=2F)Hz4N zqr1OU2a|Tl7bJE4iGnzXd_lt5#wdwVu+R~sN7`sAGHLkUe8i03o0q%=kk50hmgRTO zmq%4XYm+udnlGbCABo&Xv#7o0HjfVtnPV19`p9dKq?fO;N8~xLJz~x|$?&IP*O!-= zmtK<^^YabT8qEFXGrbZUy5}oB%}VDBX!<CC22EYHHWwWEjw{n%ZB9AuHSauk(pWA| ze+pbqF(c);<uy*iS1fNSeLBIxBzro|p*|;on}pBt@2hjYhvg7n%l#x(gf8hoZn`~v z3SaAc4(D^@rIS*oy(Z!f{rZ#p!P8llR;+MBZ-G82nH-1QVo7)j$|R*sr!g`48~RO7 z{)SH;5_u11s+}^3H_#^Yp45i%DUb1Me6B;7`yhreNS^E`{Dk>WY10W!8X)lOv^>)9 z?qvA@50~dRwWgl0gv&4z&soA{7V*a`?!ij`y+@23nTc)XqsvE(;l12Z!(&Rs^0Kl~ zqef*i!$*xMW8nu|UH`^&i@YB%7&YsW2m5+I)H)Eh_{-8dE@NL3tp1QfTmK^bMK4TC zRrzUwE%)pDxmz@HIPq0_MF+)SnwGy-_P53)BQ$@p7pLWK-JUGT+NY0KHOu+c=b0+K zn#%aA((+fqCr&Tz?BhN157x4<ZNj>hj8{_^e}!54S<~=asijfTMtm#cFA>S5gjGgM zFYD{we}(hQI{=)wtTO)Eko>i>(rEvm_4RJN&iOlzWSYO&YcKM*ntjY~lIQjMmwCfx zvT`N1Y2i|O%X&pC!W!W_YFSP{%BzT7o2*?~R9P9;5!1RwPTS&V=Ny00>re8k`1bVu z_(A>na{Z0?hW^Io^A}s<qw{3ht5W{7@`#GLch$j%95`*l)Cq?jG<IkHjX!c~)y_%n zqzP3M4?ObVDLZFmh4<MnVLysb3<B@le{r&X=80W1dPa?yQKeeVH!thw^$bJF*M-Iv zdvz+tE%-*&hiCD16rV@7G<3Fiwa@C#luq6)GpVDyWp2x<`qJolmUp!9MAW706w*`f z9b)NH+O!?Q&YC~!i|1XX)n;zfdZH-@)wZw(jnBw#UQ`)4KoyhQGL^-=dR<&x!{I#k zNd-N8Z>G4o1bJsWKAGhaO<o^wl1};o`xy3M)44xmjg{<16SHl3ftOW!Zil<UJK<jN zE-2eR%RVxdhrglQoBdVxEm*$oZ}qe0)^_mNn28)4TPq(*X|P54@W{s&q`MBMy;<2g zslbK9z{SPQC@;k_lL}Zj)!umuU*0J$?m(HLTbWcaQ;(vRX)VKZs#eV3ZDBL$)>(wi z88_9>HIG_b*3CYtpsBO7z0+Aow#l*woARU>)#l|{+m3y_tn!(GvLg$a^>(wj3p@dS z2da!q;dyWm_(QlCTn2~1Tj1XCK3E1<LB1QAeF6@Lvhf1;w2jB3(?Yxb*azjcvE2*F z#$|X3wp<%m;*?|K49bL!t;VG5i_##Q#On*)cUI}5d(LV#JxivuO5=WhUN-5Y4}&G^ z{3k>p`-$7-&5ISkRs14%3Bh-~;(G@d7xnkX7Wcz-Qb7TwG$7upQilV*4FXr*;vHVj zi&1e!#Xf1psI+24T2YZ!l%*8qW73L|35DKrbybusB+8?Rx-9ExA@`($IZdbVt^VTT zMl`O{&TZ=MY-wPXUK5L12I5qT(+5_`XSG-bR|SYyaJ8Zgx<m=<G}S1FvQH||>b5Pt z!oW<nT6QaE`oVZyjHhce^4Qf}-`Uhy%lDzX5&@>-<J?02>6=@{#cx2Dgf`mOhW<`3 zq&ihZod`D70oADk*!%kWCkkEr`W;jfS*V-+E_@2s!_}|_J_}ER&q4M1&%^8CpP>4w zKg0LoOHi3v1N8x*zrrr~2JC@v!gJwU@E7nMsMmPjh5D2R!-?!lxDLJs--mC)58=Nd zpKr((lJ-yG*6=e(+xPwn4}hP;Dezyg3w{B6;J@Kw_!ZQmZyHv11uTFsz&`L5xB+}0 zZV36#uD227o4DS_a2V_lhr>-F-w^gTgR|j4*b0lGmXL1_RYqGueW+p^cq7~v-UNq0 zZ13#=pN2ca7vWCuWmp2=gS$ZT?ClCafqOvm=#@e8;thxR@kYRMI0_yEN5clV51a${ zh3#-0R5|?-TaHcj6?*+d^;y)*Oa2zSw$QKp^--N)Ht+%aMKTwd^>zy7qZ6%j!o>1) zA5flbzxYUZ3gziep}gE$xEfEQh3f*g6y@0&wJ2*!YBS4F1#KqT32^bUR#g@HXvu$h zi#OqqvF6DHU{h>0Fg&4YdT;#=3PW%<U0EBUOPIT0sy~^IF43O^t$Z_YpJG*ZZ6DJs z#l{}$t%FVFsdlfi#uvUa%NRpteI`5*(k8P<!1Lf_cs^8)c-hjftCzr^am+G#yRKde zAK-Wid=y>=bzS{2d>!(koUF2SCCtF9p+11dOPAStcr8@FK-;%|;a6}O$MgYN-1ORB z_6c|!`~$oLG6t}*(XQ}bj`<F^cOR^S4?w-PvI3q2AA<AX!%+48H|+bQ>iZbt-2%OS zgsV7jeQ(o>Ib9Zd9~TDWDV2Fn%~Q!`*y;3JSR${wQODs>yWHqHAWbQn=mHd6KoUbK zSFq~O*Rcni(ywym9VdH1S$b@iRi1tacY;sC-61y24u?;}vG6%~Fr**IPJ(}e$H5oi ziI7)?vkT#0;016Eyb#hSXD^1Y!^QA#@W=2icr|<*YTUIJ-V1rHH2XMQ2mcp-0N;im z!L^W<lYI|<20w=XgnN;%FQCfhOQ`bGXOu^z%I|+D-$A(D42MMJS2IP69Ou_g>F(@q zZ~dC0+blLbIjFwTn!1Xzb90p%YbyDf1#6gAl&;)t$g7T}4v+Z5qm7KWMWyk3##GH( z8?GgGvs(FLRZ!5*d)vIZ*2&1H8%KALlj7nL9CujghFUkW-U@9QnlPNN*Xea1kul$0 zS_B{Oke)(48I!T8yBi7pc%$KgjSp&^C-W(LuIleT3S8yuk7lSY8y^FAf{YF9UWGSS zvcov0&RD&whZ<MRgz7r!$E+Wj1yAL8Hartjx3ZVRR`@(@gMWqX@E?#=W<P>ma5K`- z4Y!2!McJW{`kvLtABi)o44wh?nY}E3^cmh+kUH<34XLx<Igq;QagUJIn1?!@)i{|t zo#h^bpJ;de%0-ax!0UcCI~M)`9t1Ci`sDXzP~(Xo!PDVVxB!xu?62SzQ1y^L((3CS z<Y9QKzN+5u!mj*opIcw2wjb8kZPm2~55d+i5WJwLsY8=fJ)2R+@5of&D$#}Y#_B<7 z=&QqS?Z$-1)bx({^<yzE!KQSpUJQiT)wXNMr}A<wtbo6Q<KRtj8l(@f@#C*y6UVp0 z@5BFr*j&GPmc^#}SaSAecsINUvfFj#e)t5(^xN6r!v~@I0s4!a`!&6kx;t*$!X5J2 zm3M)f8qKnGcnh|qW#jiL`q&WdF}iV?*4F5^<1J#^NkQYz*NLdP<&+Y&H&IGz-C1<5 zlsei^=Kj5#%Yu56BjuNUQbDpOQG1S;<Cck%)?$v?o%OBOom7WWH@3{@<(W<^^a)|a z)@`UKN!0^&MO9JQriK<?4&gFWTs$!hYl-4LE8i~h&gXSJ-9S09DY28FtU-5bolo5B zJoFFHY}k|!ReWcQrk)O79ictAu}(Or@|p8&Ayn?Fmoqqe*Vq4+dZN1U7#t0$L)I_- z4j#(!lTZnwPGzUUKS15@tcEARXW@zPIoJ-Lhv&l=;3M!w_%wV8z5-u{%I~Z23%CXr zlJ_@Y5quMF3;!4Dx<*^d?gQU}mGE77ID8Kt1^)r{8Hx`fQ>@;{@B;WLlubEDb_4SI zCFHjy^cm!=#zO^MCz%)U`oMkR25=JOSI@GwaAVj3`@^%~0JsR!$J%|-=1>K(HGBeY z1D}JWJ^R0K2>cLk4?l+)*q8f{o!};LXSgM#kIoK(yTA%q3J-w0L;WJ=9&jqe7TM$B zFgO$L4d=iz*a5lrXHSJApzfze!t>!McqwG;lhw<zW8p6#^VC_r7&{K$4flihLOunV zeHb1Hxrg-*f`5cu-?Fd5L!hRx4~5)A>IYM@ef#n$D>w*FfIGt@;dkI9$i0<5Cz9pf zN*CE|C7cS6g2%vmcpN+tQkL0ncmg~f*28PzOn3uqg15q1@Xv5Id<mWi3#s38;0CZ2 zs{h-LIxsGEUHK8ZZE#x*cg*eo4xBRnu*0gGdaC%vsm3Pj1~d2$wq!S`;b$36IbB!O zMMP76m3VX)otg7y&7ylzb62M`lzmb`n;k2DHS<XY&V4|5>_$aJ;c*A!FU5c&92Lbo zi|f%}D@WI_41z9V*RO>0XdZS5HrYmf#P%pY@|7C<%3jaIouJ0PyFrb8%i&9KfA}gq z9KHsp!PlYsnm1rK)Y$g|sIjlo^$xrPz6a?KyuZWO;5xV#z7J{V-iMI(X=7m8p^brQ zhu){?X<s%LroDKdb9^xT7o`5#SXg78uQ>iLq;Jg5hkf9Mknv4cb%5WPvARNA%em(n zgid+a`7*h6<>02CriT9?DvB;b>il=I5q4J-muuC8-s?`+dTYv5qFT((rh!mY#h3uF zfKlC<8C_vM!22?V@i*B@bw?F)iLcZAvFyjar;UFYD_Wh=T<kdX`@!*$xhT7zs)Q$T z%vjRym#W}0jt_>6g*;v$xB0Wf;2Rtt4!LINLlRl~c<)HqpLCo6Rc7?%R<`HjmhK0h zK}T}!6JVQ0WvlrcHzi-&#WxdcyE=Fb+GYKK3=?d!wZHj~2r?WdZbLN#Dle-1T+N#? zoi5C2yD1$S>BQ~Utm_rJ7ASoy90KRUT_M+6d-ib>?Bci+o&k~VzJXI_7jQfuUIKML z@H5DHvcG_*z+0j23m$;qgO9`0A=iA5v8UN>IdXa);9uyJwvX92%WF5A_tH!5-)zo5 zVKi013^BV~d`&OK`?MQzIgp(#m|u=rSChGuie=x`=EeO}dS&0O*&lH#yWdeB7Lw0F z@O-!<ya39+7s65SVyN>ihWPb<2!8~Zz@Ng);Pvpw@OHQq-U)vK?}qrvJ_xUXjH&E? z=P7t4$A5r7hp)h^;M?$OsJ`zSxDH+iW#?bQ_o3Rr`s(q(-pd11^4#ygUnFOeq^~QI zZ&c@RCXXr;>ZO&*ZBS)Go~=x{R#=%}S1Xfyp~{5%Yh{9+ZBAtc#D3mNi2b~Wpvs1_ z&*J7i3enk^_c2Jlw>tj>l#Qta{7_Buxe#&L{oH+U^Q4Wt+vha3@f!ZuST?xB98#pt zK$B$BR1=@O`fGYieRu{<H@n6IQGcQO8*EC8jx{o%U$Bii{_H@cjo>i2F+37-@1CuL zo5C|7zpIu#7xJ7VdjsU7+1X#i&7t~(K~VK~E2zBk%)o3y{m$tJXd8Bat}@s%X%qk1 zs`UfhVwq`b@D^<S0>O*lrRU5CHseh{6gH`#Ua`nvrKm2*NTq92IEI-XMW{Aw_R&cu z`1<kWV;AH@;a*VJk3-=Ra5B_&<7hY$Dy|wxU+NtNRVSG5&6)rIdtdjg@Q-k-Jo&c; zG;^2_?QC-fAdX;*8Nh#D$Vi$@6;R8f`{?jVTpf-H>jZTtng~_hX(alf?x=e#<2Zc$ zCPgKRFSpl;y64#3-53-(-LIl>(R9!4FssWXQ8kTs$g^<aW<Z<f<Cj1eG@6fJh%RS7 zJ|4&Kxj}ly#i1v9EAan|j1n1tq8HuRs()YZydyDg#Qr^SIQuoe{%Fcgc{>Ik2B*Vg z;qh=LtcMCS6LQVd$Dy)k!&z`KoDJ#QJ?65qSHU^3FL5(hp4B+98;*waA@@+;DNttM zC(yFT!ZYAiFbi*n%zb5*#f6Y(>>l@$cK>-1q)vL5z$uVtZduam{Sdap%OGJrK0%-T zF=V&-v!(Dsj(-B5g+GP5-@F1A7IIyI{ovJbNB9dk8eRh@!E2$O!(9i@fIQ=~`^KB$ z#T?%Pm%-(5Z|r+J<e8Xv2iy<d1@&?Ed!d#faW9;`60U&D;6qUNZI8kg@V8Ly==bdD z>({C1)OV@gY@KXJdb^N^y4HqRu+hSc{u)wb@EL5emgFxvQLP_Pr212DJ*w(~JDzEk zSs}l&Mlh$tJqE+GzbJ+G`<r^o&6^?)yj56Z8I<%^;kqBYwsqhXY|4-7)+X$YzVd1E zuRJ~j2Sds%yEFVF90i|;>Z|??)epT0YvD_<1-=YBAwMdRm7QLNvgfgsdHT8J?Hjm$ zNgSNCr}fKeYgSS(gDqxFzh7eJ!1|@sGs@Iqyw_qKL;8W_@bnsl+=UJ4MF|zd6I~&n zI8Q&rtVphw2s_IfQvBcQEQ1R0e@|z*FRjw=EY;y&L&;s1u^wIHki=m55)3hh3c{wV z!}U;gM>7jSKYMLP$GQEi8%eu+74GxHO?66jTW#t|U;hSmQOAFS>TBPG>TBPDGvVK% z!u$iOuYDh$4e76}ul)$Bul*EW1wVu8Yrlf(Yx}SUL47UrXV%wl1l8AW4As|e3f0$c z2G!TH4#E1`Eg*9Z9_taZG6SCxvu6}LL$2@oL|}FX+y!zy@JeA1+#OyB_khdbo{;{} z+Y7FOtZT@UH*ar9+P!i}+Vmq+S<<ARY0c`BW&1#6Z!A0rj)N27esC7tA2!1SVHV;i z`xra~J_(P2tQ+wrz_%b_vnTgu4h=4VQ{Xvp8e9Xv3pMvO18xj!;U;h<+!Qv#%_04M zb}z`etq(aF8>R2@u1A-lEW~Yk?L%zsr8?vqyarpW3&~yDu-<Ot8?0kUcM9cYRPAWM zG-2XCspI5YiLj5TBegkwL@CN>K&AQnDm1Ri*!;a#M9;DDoE)o@j?%kJl-gw`baVqD z4cOF3hO)agP2t#e9jaiHz13E>V}HX}&ZV3($emD0?1E)*KGfK?2VM@p2d{>w!&@NN z_3UzZ7W@rd03U^CL*0wA-p1xq&VzsCcoBRVUIgEQm%w)*^T*lG;1A(fa0%Ribp8l# z3V#d-!pq?n@Jgs>kXOO2A@j{y=EJ?~pxW^-p{`wO<NKxVv;K*GH}((Nx6M=UI{i5r z_d&9+xvz*{lzK0Db&buO&XseUb&VYyyIxiAQ0b#leE!Tv1sPnTI+9ze@o}vRi-`bj zsuHS9E>gQ?Wb_ctS7hbM-(&;Tflb+!C~dc3Guh>T;BoK{*beW6C&RnoDUiAR?DrsZ z`B|O%es~jn5Iz7`z?E<%d>B3g{{kO{DwDg})Azo|Q%<|1KN{{7l?m@AxtAFA=CwM3 z>G%n@qCoI;gBLFddsrxQ$i`>dFwCMc6DixS9PEu1yXt1qC2k)Sctq$iS}3dgf`#nC zrgXoxxvqWgrwOEIjAhTeYT&*c9|f6L(2qoB?}F2y>~b{x13U)41j(DViSNRXIi?J( z&Yu9c;yjGivicdVdN>}=gh3ro+w)o62NTCraA+QT@=BH2vl2hS)-Mpup0WTrNSIGm zQ6=Ea*V5Qy#;Zf)#=a~Q*SF8~z(Tcs9=r8Jv%8xUgN9W&bg{GP5o0NIeHO*cCk2`3 z(AhJn-I<*IgLM~Mpr2IG(pK9(YZj|O6LtIr+=5LuP}#^1Px{Jhv6+sqgStn*9_|Bg zfRuxNg4piKm%}qTz8$KLQ+_sgaVNZ&<GZ2mGwz3PLh8LeYorg%{+r_!u$c3&goEKj za3}Z(+zrx4X7`1U!|y}Q3;ht%XJ+q!Pr=_o&XH9aQctX`=MZ;#4TDVApPhQ{mE<Yw zaAkA`55d+i5W>PPLlbW+;k82!!KQP`riHM?SH4EtbpF3WrGaaTrF8*vdhIjzwzTRR zvP+({b~d#(X+`_`Cv{ajDv2SU++dMbq8W#In2zsYQyP>9nLzhL+TQl_@D5b{cn|Ih z{{at&>tF|@z1ckA2T*zV2&xULp6;8v&M3U>l40L7kyn4}Dn0ctkHMBKpWqSTV&><= zw*!<p(qZdEgJ3#mx_l01jH`4U0y9waQ%dtn_Vl%pae$?l@te0tuW4pEm%F^Ie_WQ+ zB`X_soHdaRbt<JOGaD*zEPAoVKPJ?;XPZHh$2$ZoU3dSWXKcZyJje!nqd42w|CQ%+ z8IBpNTf2W7s&Cfw!SV1tI2r2sApNcP57+=dfTzQc;02JiF7~WL&jFclw>5FUhF@|_ zUt!PxRtnhoIamn)3^#;t!hW!jH1&r?P;;kxzBmBx2seWjun1}#vjwbzTSBcx*b1Hq z2SYt)+!m_e*bXj*+rw+&4)8{}6TA!V3?G5JK%TYQ^T_-9aLwhIc@=$V-qslG1^>Wt z8PxrUo~@~|kAwpt_c&SoSm3^JB-Asu1K|FUdkK5SHXT-StUC4}`<PU_SWUdUpnn4H zm9LI<w|}GRmA5vjo-`BrFRi7xTAIIxRpQI9O><}Ra8n`EwJz*G;&XvYzv|a;BDe-y zYO5i?%G1%X93BJrgVUk<kK^D}sJX#<sAq@munv9?a&MT;!UlLF)ZE~muo*rKPlV4y z%@NYS>T~e+ET;o%te`o=KBT1!YFyk6hr)TV6rKi0z|*1T62A{M);be5z_Z|7xB#9C z&w)RI=fmsZ1@JbgImHK|<`f@?7sJ(XF<c9O0BK7$r$`&IImN!%Ybko_w#_9{S8Xma z120EU-L$#Hz2P#BHQ#g<WWLnq7Rj5<Es_VDTO=*sFL7tS(z^j(4R3_EK+P@Q2a&D* z%_9x_r|O@|Y!o*8DIB)G`d3@u*;(%v8efn9U@Hm)FL<!90!^Y%Q`KCBGFA(_cs5vE zyc(q&7U^5MRz15IpcEIsfP;Gs(ZNd8z(w(>Z~V2@W<F5BXMqwUsolv#Js#MC!I?X! z`ca**8W-2Iwzu*YeYAMC4hQEoTGd*U@a**Qn+=VS-eG4`Yw3Y5W$~MhU|PrKEM<gX zlik&BWb*rc<vo;>%7Q*9TLo9Zqv1nP`FaGN1RsTG!QaA5;A2qj<ah7^_#}K9{vIlY zn*00$J_k4CyqW{;2mb`s&%OYML(PF62w#HZ;VV%6tL8q{4%Wa$@O7yE>^psP=R&JC z<(i6{Sdp(j*;o5!wKTQ5F}K=Fu=NWBmLIrxx>n$t=bf(jwUil%^gQL5^h;c$lamq? zCXP<emySvY8I^tsWK>R&<kX1WW(|%_jZEooXCj>?vrV(Do<@@<hbZ?4T62o$B)nr@ zL#`7oNcD@0wYR`(zB8WIK(0eqKS(BWHyf_?e1<k^R)LFJk4I;qUmj)D#OL8>cUd!O z#_GAljd)eo>9hE9k-8hjpvt?Du63x<ogMnq9g%!3LE~Rq>=jEbrMU*(d6t>(Q#zUw zjrb~@G>BkR7S$CbnylSW-HkSu!U~#Eaq*gjSC=H+^2ZzPEB)=&1AN*H?OS1xlgt+D zIHplzAU*7i2iz6YO`^WD$&#PJ#Nb*=wW)9wg&zIOAYND+df=Q+kA@?sQX*`!i|&qY z&*=Pot)RnHV^CdGEY-}J?d~445|y(kpO%@|>TdetiESgH`VC4y)*Ae8ZpCh~YW{^~ ze|~Ygw}+;uqf~yXQ6@4OKgR_){uXQc=cwZ_mP|L*qTbK%0YAWBk+YwLQU9R+?+lLm z`g*-<r@rH3$bG-}39N&9m#zuw9l8$qIn+2o@6eqCzkuoo^$y)tu%NGd#!kH1hdAB< zJ`eSd9QQW%j@*}U0LPn?ZoMnF3)H)ETKh^mt^d<IauYe;0?LM4!pTtY%xQhwU^pA< zUAdFs_E6(cy(@Pn+!<aBhr-L@u2A=}rI0bSw<lyw><xp5L*9?GcZDk8y&MmR4??{& zM;~qP%x%MXaty~iK)o}^T(`Y5$6TYwbHeO7uo5yi=p6|44&TA>OIQsDV(Y_TF`NKP z;E|BD>8Gu1?I`O+ZSCk(csTl_q3Zr|umR41r^4gmxv&mi3hUvIVH4D|$!2&9Y=QSd z)|+M@fV}UQeFUBapN5_Ab=U>pfb-!x*aN){m}iArOMM#L1)d3q!v$~_WKKT&L%0w= z3eSg6z(w#)cp>~JyaZAoy~VHslIHA8$Y&k0^B`%@sxk6>HG2VE2JeJd!xiuv_$0gz zz6*Z|--kECqK$aR0P2T!Zi4#pnwwz<{5346Io<))EboDb!+YV;kk1`tm%$bATKEuL z4IhD9ZA>$RBj74nK$H6e+!SKF>|XF$sGl%>4t^K@2{ywQ;9U43ybQhs)ns3Rufa92 z4-ZXWgXNGi$kxKY!b{-aV9fwVIdB?W3r~md!E4|@;C1jrcs=|W-VFZ*AAtXct6;$f zlr!uL--kRi$$kho)G_Vw2egIC)VP#qQ}%PTj6uBN>mNtBSy7uM(NmjXD++{gG{L*V zbfd`?A9mTcYa<md=c3yWW%{B^?~v!BOJC5-MK^;>;-afpxV6OGb>SM|GS4%YcL}=e zdRdK=8;iPuqz0}$IZ9py_12eW3m4*Wel#lJ8{?*~B=2`*l-n?BT_Lq_Jwt_MyukR^ zT_JUeZbToyM91b5bVUj_m5KUnBG&qR+jzcZ?`3ZVr=Zye&V@suhQ!;$C2&XhbGQ@K zeeh8DIHWz>+`z6-a|5ODJ-8eE3hn{bNAC%Dg=O#{SPpfMHUeG-N5iY(82CIK3*UwN zLfv!i2ls&o!SQfBWG=`%7}ml=pzg7%;e~J_yaFBte+?(Yhv78%1Uwq5?&`iZJ+D`W zj^<@^_#^VwUGC|FMOqpB1shF1*!&f)iYZYk!+Y>Cflnx3Di<nR`0bA4NT1R$0}g`6 z!`<Nte!6uZke-WZMYlJ8X2FrYq<iKmd|%MoS`9vfEt&H8pf+q@b@)wWMHR0ZrK^xG zUaO?&hO+aG5AF(`UTr|N$!|w$Gm%3UhYb6q0)Bf(?>;uMYDGgY*~rBnOr*(MZbjGF zWEFd`$qwmzvli?o+nfkT!!~#zY=;x!Nl<fTov;CRL)DG>@HE&17s6BEweVDUBRn16 z1+(xacn*9Eo(DgI=R?h%FM^sIyAY0r7eUQkEQY-E;Vpqv;AK$t@_hDm`R;>G&t^1N zGpd*JofW={mcduB^$P?#YWI1ToSLbklfj*NqgTaZeM!8|DlO?cdpT)W`mTV3;m@Gb zdZnKy*)2VPF&^C(?3!O1-AkVMv60Tk*!)EXzrpqma;C}`<xG{*BJ8pofl4AOwl39I z_L5(vGo9aS$(Pc89o!!N5-J}z`1ySRIh|j%I@#uM_A$NW*UB)KUzJs`<>t2%r$oaH zW=dR1D!<$e@mpY)U!C9GOZZBa`*f7wu-p|sZHHUQukv&o+!_84RQ~Sp?QjEf`rYdJ z=#>2~_I>i%A^gk`9>T3Cl!AJ!^Cohy+pr8uzgr5vC{!A%++|ZkhB9=C`=eOd%Ot_3 zv?|ZC{RCh62lA$5ulDo&G*o=g!2RK~@Cf)E)V<Ijq4N4XRQuL7Hf<A5;ZYUo`?&t) zvq|{y3lHIzTO$-cVUt+Cl*VAw`IN6hSmG;RB7I83%TV#W;-~i?$m#DGHPc^hi@qN2 z8>N>o1J0b+(#o5g(YK<;;4Rn`t-sM3X_BCZ!@Frg+#|bycIT`jSb*nA1@^OiD%d(y z7n>@4u-c63LQ~oI{cX~r16_ulS6jJG>rOs?=eq=#IqYnz1sQmsMWCrIrg{?hyf4U` zzbU`6*I<sH^mQ9;$orSb{ot-}W2o!QCQyCB0H}JfDXfJ9p-xVpW9!QY!HYQF5^8+4 z6}%O04ex{7z}0YD_zD~X--O#kjjyQY*-c2-PH=0;ryp#tyaeve@h(u$W_N{J16B%E zUb{in!v*Z=a;-wQ3A@riE^oPp6;Y-LHf$Jdez}%$oGe!j8ssTnVpcmpKv^jle^VM{ zYi|2!CvF=@nk`*WC$5A$!ULhwdJt5e7O|(F1)h#h*QS%@mN!rChpqgdpIiSUTh-Z0 zBFfEMHCoq`x@opBZ!$%&DJ|)CcNl3``uM)0txq|^&x@Xeq}QuHhd<^2_w4)U&5J%V zYdQIvbrJa+pC*{56F26k3H4yN_@^k`N88lwGUl$CNNaUE+?X)joy_aD?~%k?-C4M5 z;Kio1${y5RJU8%zVV!(OLsg>`ttto;ocbxms43d~yUrPGvVm;aAI|WVQ?Z%sG7YLN zPKP?>v2Y4J4yx^)0KX4w;ia$+-UFFSuyqg(Q1wXHt@Ly7BhhWaekl6^>$iRR*F5;o zUyEdH)uOoZYr^AG%uE@MT`h|i^Pu{GT|t9QX_bvIGi%7*Hix_^{q0aTV!qS87Y8-Q z>4M4|k8jKd%aGIS&-b8C%I=zTtL)VVDp!68?mseuOq1aZ$?6o;kaX6S@5SuFrt~S_ z15upqE14Iv`>F3i)sZaBz_Z|<Z~@eq<y?3STnJBu=fjiWh46WJ5qt$+0^f#<q28P1 zJFB)P=0{L=`7u--x{*C?zfN>2gI4wf^V+YgyS}qK)`Hbqf~{X5V0?G^tVEOSivIIT zBwNPYnbMkWXFn%zO8+vr9lRE*E?oze(i@=a+l^2*{S`b4-UJo*uc7k39Lh!?v!}<& zKf;Fn(JzJv<+YK0HJG9N|5+{L6nScyZ0u^;EMB4LP7EI|#!XjhwxF73Xkk%DruT+a z#r%#;Pq*AF!oH$B)~)3{S5&@bZ)N#@or8@zOsl(h!L2#I5AFc(heP3SU@d$Y_P|G> z?jL^(mD=AyrT8g$2mC!;4gUbw!sp<oocE7#TlhTO3;r4E@x?1p&k|mRnm1nqb&vfT zY=eJ=DyKK0%2R7S(sL?Tpwl=>b3Nmu@@$wjD|fJ1jlW<k3WTt>*P;32_A+>Uu&8=< z6n2XZ7CTT~Wgf%9qO4P5s%Ws7MVDdEKUn-7E{dBi?_e>0iBo_3rg=5LrHF2@I;-1K zpb0;<k0&WSt@&f3qm9Q@(X$r+n~I;gIPAadrus01qj!CM@kVaUxj9t%ZvoYZZ3)N1 zt)OhUHJkyrfy%>n@HDssya4V9uYehN3)~6b4Tr)<VF`Q&?h2K!Qn(K82APKS_JDl% z!`ln0-VB3!4m})dZRZGh1RMpAfuo_;XN-aEa3A<RxGz+_7zb5<)MuybPkc;TmB0Rc zi$Q6!{se>4c+Jqj?E}(L$sTO^#-x)-^Co!Ud4XM5ra+BJr^5Z<G}v37PRD&S_LJEU zPUh)97>wrTNp-;WV$on!c~Tt=Hl;!Js}Pp>${D0t={g=NZ72A7C{$Uc=J_AQeK5Pm zPlqJ)5ZnYN2csE023x;C2phMOmduDQWn<8iMjDM9j8=xnZZN8hX4q-`!C;i5RKFf? zsj^CiytqER2qyb*RSBgo?_g9mY-SHO*&uz5oQ=(7mu9#NoC9^nxo`q(gEQgjumgS{ zo&mG)I=BGJre{OdpM2wp_*nGNud)3%9gOB0U&f6aza~6h-(XZWQpjM-Hx|8+ylEV< z814#x0QZ8ILXAb2K#fH&gR;S|*wgoQv(YJzdiKNe+u+*|rv6JtkPYhCgH35wJ=qve z^_BOKH>LkxsIk;<U@2Sy%i&6R0DK4@0w0FQ!{0*X`7tQle8PS}s%^%{P>1KY&3`h8 zN?J!_AkLj?Y(e|^|6~v)JFik2{4L)Y>M87`@#OEJ#!$~djiH`}x`zG{*1{KI4}2MF z4D|}s80vNSbNB|-80v3uHGC6l47C<&4D~M5weUTtG1NM!G1Ny;W2jG{#!#O^jiEk+ z8bf^!HHP{Usywe^PuKN-qEj9|WUtO&p6=IWzRi$0w=^?E|IKc^@F?5MUcsg`s*VqU zt-kVd@}zWM0o5ligX$BnhGXC_pz8Q_@EZ6_sJ4CsybIn4UxqhB%|kASvcauTw$gPe zJ%_cR591-+w9fK~$X2|A6I_<U31%fB*mNcEH*T&pldkS=#`e0lL}6{<KOKj{4doDw zLsjYP&}P^f-|@OndE(BYKj|ES8=Gd`Gtk|(b(aTGXe=1NQ0dX>cy=}=Mm>WoFb2-? zFyTCt*0}_mY@o9E4vH#Yze_*X)N;Hll)e-yO}oSW;a+ee90u#)-mnvv!LuRjAncui z3V1!oBjCMoBzzK%hJS%$;5s-KY7T2(sCmk9a0uKFs(l;)_lK2G866Lggoi-Ak8~*1 zSg{(O2@iu>BhLB@TN{1^)FP}Sq1NzDgfGDw_#Qk8eg&t%V(c*$YK`tRI2^KmBU=Th z!)fq1I1|o*syoL+)v*Qa={lzIpvHdtu}{cb$G*jo)YY+|OnV!WT6?SHe8HwPsEp(D zq#dML={gCjy>-JK;XJ6c&WFm=BKCA2b2_?UOnPMAJpBhl)7-pOa~gMTh=!(?w=x`p zO=(fy3So(_Je{;Fecy)~o1Wq4CEq;hgSadI8b?jco0o4pG)-pY|H7fE*|3@X2Agak z8>;`+y`Z***i3dgAF3a|5LUp8p~j|{z?tw@umj!%&w#f;jZK$B+4NSZdUOMO`o17O zHl4J7+kexcX|C~Ai^v<Dt-CL%36Iw|G&LJ3Xt3oQo8Cj-G%kApYHa!&sIlpTa6DWI z4}}jw*<cxadY&&nPg>Kf4ZhtBR?-N;1k^XXTz^0s7qbUjzIoDB<VSVoai}`-dzgW% z;hykmcsP6x9s{3;C&E9$li-W+dH5211-=5`hJS&YCw&d>1mA#~C;c0g{cdDW+fU<V zl|eoGQF-n6?T7YB`~9EIlh%>0U{hMv&f;VH_sE;l|97ad{RglVegw<m$M6973DnsB zQ+Pc594gQMg0juW?CYB!ot)P;|H;rkX`TNIhW6H0SCRi<%Qv<!*x1$CK2T%(4WY*N z8^NJ)V^|9}gFUbaYHVK&HMVDsrj6|fLyhgXfve%Ra4p;sZc1IvK#lEpf*QM&K#lE7 zp~m*RLyhhCfEwHH2{pDK1~s-Xhbqqvkkey{e=^n>gxiO3N}@a)?X#+}XX#~l3$}iN zU^6HhB37c=Vu(Lp^~2hDRXv^?uLfETGSp>e*z=87wJvEmZfuG<1OHAvW^sFYZ4gI# zz^Z(o$IhlVfmGdpzP-X|rZ*nQMy&4sK{gCF*+K0{*ZVzv{WR<*+Z+wm7f**u*RgOv zcs!g2>!I#BX2P>!Bm60Bg15n0P<3fGTmxI+C-6k5zG)8B8by8s&c>u|@Mw<Pq4ISS zJPUS0<#8U=+SeX<13V3`gr~z-;rHREFbg*&UuQzzS@h0=`@#kAD0nt(f#<+8;CWE* zgDr%-1Lj=-ABGn~-tF-&f~qH%K-H&zv8U_Pq`q$b;$d)VRG%ohx%G3JYP;smoW+w9 zdpM^m5Nyf%6fC(&t-@%=_pgeqigmWkx60LlYOvM1AZB%~D*buv`ZS*^n=T;kIC=>s zgRX(rN)72yZ1KCFDY*TwMt`(bg6lrT1-B2lx_NVd&b$XZ2b=P)I;7L7+_WvlR=dNW zK+Tc=3{HSo!V};!cq+UKE`?XaJK#0&S$Hj!t*?WsE7wES&l}+3@J6V232uVtz?<PO z;4ScBxEwwYZ-sBe+u#@QcF23L-W_lZybI2Ncf(WRJ@9AnKDZLz4|$)<djR&qG!Me9 z;0maBSyw{6!}<{9J2&1Va28wz`R<ALB-Hn<pMuxGr{QDpIrwMzCn%G@0zK@w2J(J{ z_Zs9q2=8^c2YdsLg>ORH<p=C#srjc_=(c39W1p6&gLDL)r*ydLSBYz|C99tvxTtcv zsagLM&{9rEIg~y89z#%3cQU14JHl_em!S<drAc*zEQa?K?~w<k^Y5?@e(2|^5jmZw zDs;NnI*9$~C{OC$I_ujS+vi%7!ZF;Ec~Y~W>G<{7{b1b(99M__xmQP48aIUFeEnyn zN$33>YFzd&xCi_K?hpSBm8P$t%419F)}g8L(A<gcoirYs6{Vd%p_N}9o!3!o55-uS z%jbL>8~AZBeb2kL!z~xCBv7y=v!r2yipgDdf<9gkyHrm8U7jBs=XVzp*N)q)^HBMG zVi%T<uD1HQtW*r<I^4HEU9#ko=pAMfEX&TO@*e};+gs*Sy@UOJk$Ir7>0@HooE~2- z$S!=(FEMAu_`vQnFN8bdz8ET<)N|`Ueh81__(w1cm%^XGE8xrUO87ebIeY_N1!ecE zp~~lWDqwm{_u;0x&{F^4>_qwaMs+{ISnL04oYgea6>iC5Nqspgbr@gc&HI$;kI9Wr zz8r~<^h=tflOL1ANBWa>x$k7A&yxF+X8J|X+_yH<ztlA<ozhY1l#WWLbW}Q}Bhzn> zj!dU?Wcqc|k)wE=9la7drJE03)kZ(#v31<-l(udb;T~*nPsV@WV`6*lF)fYV&DIE( zQH*YM6||rsRO;)|y6#Wy(S4D))_x2~AJkfot7}LxSG}gFCaLz2Tos~8$4W)WPS;uA zIlIZ;V^Hgn?n7&Xr|LV@TCz}z%ALEV!!F;d|4!l7&}xnTfzq)v3(6X<_{IC5{oS1l zj*6`Yeu__4hq+IrR-^FWYDA;q!BjM^yRfy%iP%`fr8V-}l0A#wB_JosUofnsHGk%s zgAzF-j94$V#uKTbz!4iOR(s>14i4o^!N+og7a#+=XTo~7E!fmn)puNu;tgMaHR~YM zj<p`91Zo}3Zcyu94uM+t(g1IT^Wp!%v)~<&e#O>%JOs7gV-36q{tarq$H!3XJ@nlD zL8x~NR={oGBXDP^bsydEF?b4m20jB{hkt^9gBqV|y~Z2xE%+{c8@>;DH!k~6_#XT> zTnGD;#}6Ri?C?H<+rdxa1o%0e3jYQ9W`y@8<eL!QzhNCLV4l7S7Qz$ZhEQXhe(+q_ zAMz~*Z&Uat)cOW}CvaQXkA89p<Qs*yZee?v;dp1b6D)y4p~gNXkZ%xr-+_Ev(AFzx zETnY`RZ!~_YGE1FSm^&@?oHsd8vp<Q(;iw0S-Yo_h|Dw-MVR)YWzr&~S?_74W^0z3 z2uCW}LkL9?vL_*XD6(dkJs%{5>>>P~uj@MJ-1mL%8GQXe-|ypp9-W?Z-sd{keO>Qs z-_zhisCf$aK+RKl6l#9LlTh;#-i3W&JHqxD$XZLMFJw)n(+}pt{!r^G2SL^}Iz!+* zI1FA7M?lsVnmGb1;CP<3p7Lb42~L1pp~l<4g}Lxom<L%;<rKg?s4?Z!p~jRifyGd1 zq6D(`z$u3>z^U+iSP8eoX;88Hba(*NSo1J=7Q7nHgDc_ruyHfm7w`~x2}BoWT=o>G z@z`pp@mLpL1D8XM@7xWqgKt5N?|ckzfK5q-%iuv!<2wBy-?;R%oAI1;;9WeQ4>g{% z65bCt!3Q9HCyvHQzlRS&rRpbOghcxk><!mJCE{mb5qut2z!xBGF*D{z+sb)`XX^Q8 z%#V7y8S|q)?rcQ<4txhvpEYBDU&0T0rrzaz1e=nZX{_%+xCQoxpTh$9HM|FY1K)t( z!Oc)(e&0cj`TYU6!$x$>{|5JjJKzCOV}9xI57-Mfq~9k8Hik729lB@3=5Q|LEOd7P zYyp?Tmhf)a3O)r}!*y_1_y%kT-+_C=ui-xMd$=Fmrv>Q>_J=7jA8L%qg<avbkgzj# z7WKV^+nJm@W9D^feos-Ib(Ub9Z9G|*f3@-dF#Q%Pt}2iumVYXiR80%DK3zm{YXD?w z9wIxVysD(U+H^e3M`X{KiPawM`b=tS&M&5<%cH0)2nyc_^4J_Om6gkp<hS*u*`+$& z#xHhv7#r;N!1=i)C3%$p2_?%Je0&Hum%Nt>6YIF~#gJOIo?*3bRCGUvidaHdUQknF zcaY0OX!~!n*=0PN%51Duvi&IXnSUu<R4!qQ&So%IZ^ChJ{?eG7eyuMogrrHg3=V*5 z18eL}b`6EM!eQ_&cmn(aYAo#!I0m-icQlsP8EPy|eK}?<4W7)i;st5l#GeIx6OKPK zk&!fX?uJubXZ#7q(4<2DA{X$lxJj^y@yDO9m$1Y~O@aa5r)Q%af1X#CZyl7Iq&u=O z(-zaKT>Kz+=0TP1QP>$yg6Xgr9tS5w`K1J^o_{8Hct68~kjbtCxo5=uoL|^O2SM9< zq81?VI=B)&tlE-ZGfSIDVkd!1)?PAhQ-7)P4~tj(Qc=pk^!uzWclhVWI;T7B61nLx zxGzkFa$g#hKUQ)d5o%A~fNU@BMcieH{$R5q`sS$;2dO`TA^%GBj6W^1af%%7e@V~3 zO$Z6WCr@T#O}xkT{SaiGxY?SS9T$hPPlgFun=XoY;a_s|Ch|V{b%H1CgCFG&`Vvil zd?p;mb6<Ee><48>f2is<@yFEH2Et2t9t5R>!BD!ofIB=MHXoUO^L*~|dURD-%yiJd zKNv&)&BU5I^c6vzps!$Fz<A#Hm)s&9C>Z2VUC@O8aH#m51=Y8D0z3|mh9|-?umJM6 znL~=b#?P`d?B}V-T60g~o?4HeiSYf)YrLMw2nPL2j`J>3cs+4MUCfHvHt1;z4D?sx z*Ojj29{D>yU0;Oz<wnK<+@27Bm~(3{ho|sNo@K^lu7dK%LZ~pV;tsFRC4QJNmfkAs z@ozp`LfSPE5ls2lKk{r4mh!QG={M!4__VCP2gNn@J*2{=P;Mgb8@E^TcQ`E{i%j42 z=B}#8?Pe0QGNuTI{Ht!Kw@ggS#_47(C*JM)&9K{-dv2%PF>b#d%1w88ZlBKI;c>!v zw^!HW_DRv|e)bHxfA4{CK3bRi@A2GEerepl%5(pHp8K!I{oy$m%aAD!5^hdS{qE1w zk|@?E{`J~4KX(X)fSSQWu-~Q>f4AER5?iNWv)U|<jtb(~c;5Jz+!xL-9>G6y^BSmh z^CTocbk@NN_%xgWpM_V$=b`-f0#y1zo)iZqmz`g7Ppd}{6*W~w|4;*={L$Ayi#94I zDnjRE$-ks|T`G9G!UV<ml?kiA&}O|DR@{)k{Y!q4&iLmjztr^xewY8=gwokYI267M zr@#+kDf}49Et}!(@H6-r`~vc=^kc>)zk>Rm67KMP`I*R+o~Lm?lc-BN(zA8YP(QYU z_#0J9XPMYgXp%D@)>~gnZIPI-j>2vF{S)B+@Kksl%!b2Y9#l;wAIgnUD8CeQhxY_N z9+~V?{92#vm*T2{RO6K@2-)CD%$MYm2=5X-f<WPx%I#nJE%~Jp?Cc4r;5Pj}dNy&K zFfwlK+E8_Z#B;CqZ)(Q|n!ve<ZcXgOjrG{s{`H&&-mif;w|g7ujpwblzA-H&{!Z*` zS5Kh^z#{x8<7jpC6uP|ah|LLa)l;Yn)c{^7Ec}|J;<|K_P?M0s9E1^Wf3R3>FD0DT zDUz81#rRf@&SdC}j<{r{w(N}XH+3{xOwj`Ry4$w>0fGH((@wMfp$G7ymKWA^Svlho z(bDXK+)5oBRyHZSfPq3XLRqSK9_RKRMngpi6Q?q$Ikz5Zf8$b)B`B*ZEUzpjJ8aul z*;EBLqm)U%Wc;Mxk%7;5mm%-R6{F@MEHXAKX~<Z+2EMDc@*F?<gOrMA+j!|;iYHrI zs?J2ep(pRzz>eV@0hLycgsOiY4V8Ch!UthLNIq-Mm?f{!aZ+YJEaQ;oEJx-~nl<2z z-@ANk&XAo9$M8H4GN$cb4~bOn9q?p$A3O!Be~`AL8Jo<9Z3w>tsBkQXX%M^IL9hgl zhRktr*~`_bgjMhixB{L9*FhJ43THv}&&`IJa4zJG2IoR}I=l$Zg^a1YoQdEt&(pmf zvNp(NzkY}Q2Xof$Rq#!o7eeieb}iJdPK#kLcpc1v_|f#kErIHHTME_gxdCbrkMUX4 zzqSl!@w^;Pfw#fw5Z#!4$?k;L@O&3s0`GxO!<FzwcrRq12L~OxU&9CBHuxY^o~E{S zc&`WYN0X;1zd1KCpP;HTI&OGAf(ieM%NV?7uhMB^W>9xsOTVZ1hWCRu-{ZJX`Pv$& zy3CVM?qR&zxSM<~DKAzVK;Ou|c}eabXEx0=d2s{-{`JqDom5BE?}gp{tmp3MJa@kU z<(?NkcbD^bxSt{3-RC8_dw6cGX|Dczmn(hu;`Xn)-2Iy8?$<qcGataXn>1(iy@8Lz zb;B=^wd4MT`}`z#k01{-O~!(8oK?V{Vk!kQG3sB*n$O}@VuVpnrd+(nlpZP+B*{Ut zqpdQ$X>3ZSoL*5aZi%G^b>!pE+RIRBsTpnk0D-Rgl=*emCFLK5ryQnwfUb}6zx=ob z4uYRU<>_BQ)t9%zJK<OGG58IXKFCjv-YA!o`dB1WJT2tDAW3go717d@{&ir7!&<); zj-x;0HvRr~I1)B#X#3il!Ebr4%gxH`_01UW3zOVDy1HQ8iT^b>>$k#gZjIaY`{em1 zKhPPMa!b2^=;n*+a`TY?T{rLLxtTdM#?AYBZr<N>v&zeGJN<5CdvV{&eQ}bT`>|Kj z@F-`$=KtN<d49icVscVdL+QeHQRQLVXjOO2l8?+pc~Nnp)|T6rS<L*Pn$u3RsmIn& zhwznu$?Xa^(rPd_<Usr?|4<(_Yc~#tQ+YlVUIf{T-1Os8cAL1j5LvkWKO33S;F;W) z)Txtkb`z<;Za&wo64f20l1?Uvv2(waqhunpd5k$2OBsgJmc;%gcgepLr~cX*=Sch^ zw=##$w4aWK1w0=E<^D{lH1>D?oS)>+k<~@fN=1Nw7xe#Se-6eU^5+n!cH(hR{yZMa zpTnX2c{O)9j>m`RrAhuAlv`R{GUNZmqqyy#gel|4#;>fwF@DvV1M=&5D8HTz<=5-D z!)0W=UoWf2um5);`_KHFi+>chtTi(JEr9ZG6w1Gop!{3S9p3*ZzAkfll7ENgmQAY3 zofI8hSzc4|Un?)_s?X@$29+13Q1!=hI0{yHZePXUnW6UapU8IO{)Kx%qT4l8Fu0^V zFSq1`=p>F0i|emb)x*D%t2CLsO3Z_m4Jp@@_GoU_<W-KSDK*s^Rexfg0DiYXjWMTQ zF+UHgK;mC=v+|%_pu$Mk4E!j6oB?}7=Ixrg^Vu+u=UK1{o&!&VbKouTT=*u`Srk7* z<~_L51$&m7@cxy*!{Mzt8HXVM5?+z0Gqn|>x%vG$_LXTnUN?HY+mp5BVpF2F{2^4U zElv6}s+y0%n5xuRR~{bjV=z4k(u)1sjz#%;wX#XY1;)ZLnCi%FkMq+=+yVGV*Vuji z$$82vmK&M<Pkxu~cja-BC%*z+Ngs>gSjhZX_Z)aVRGz;Ku7o$i$Dz*E_yFDpKZUo$ zM%b%!H4cOK!o%Szcr1JXR>21$ZB=t-?<4SGo~gT=^Bt(WJCE_KG<p?xc<e*@RBLXz z=gPz|E3Ax0lLIY+LH|k)v{YUt2AWi?@Q8(w6ndFw#du$#(r2b86y&aOdAb&V$gS(3 z`X!%+IdDCc`=5vM=e^wFHRjaaO?rMGUY+PqrRQPg)P0hYb0!w~SF&HTc$Mf^CFk)- zZFGuH&N)b98t|iCVsbX+&uR?%m)tBJv_o)*C+yJ3rsqyj=~-u-sx5pVRC?|Tm7bYr zWX@2cAH(ebdMJDbxz0A-2$^@}(qHRvo{))KI?J?_-#ZFk43B}=K>9z-Sv372{SM{~ zQ`)u8P@c7Z^>`?q>MYax%7OUy!ZnGyCtny4EzIR`0n?*4{=ZfZ)YWbng&S24oB&l0 zusODAH;ns-Zof9k?IX%dH5U4R;Pz8Ix9bd8xqYJN_8iac^lc@LH(i8G`OmrVswB6M zNlQ-L|I-{<<C^pM1sjp=3>I_Jb{!eBBE1sFw{4WO7MJCle$}o>?rtlI{n}KpRX<hg znv<dzI=UmxwCsl<`ye8j*=bY81|YJ@&F1Lw{kjWzr?}3g=`cmmX6tc1&+0}{w{#9K z!$pRj!0J!Xz62Axy82m`Nw3ST(EKlbhsyw+3$8GD9cDnCi8Bzs2~{S%4JSj^N|^QQ zo1pS(<`=rk$3BBE!Y`owvK9UZeg(gP+u;8E?sqU9vfjoW3x9+aa67Dqzd)r=l{4Xb z=|{*8;AVWsS(q44R0h-)QF1WqU(NkL$SvBMeNq*T5_3icel5~i9;m{+7ZMxzCfFs4 zAc_lOl@-q-($&pZyvmC4Mr8k!`=xg|WSA%a6aUIjO-UchADN$N_P5;`PU3kN=)#up za@Y#K0NX?9>0It`+jAl^<sbU(MTvUyc9LYgN{3_q^~k46iA<~*m7<vJ??EYP1Zkq) zg1)ICyz(!(L;j6#TSsxX+{PLjv+kl89>en#cpT(>K3DE8gZ23@oA<KgB<{s^`_C-a z{NMJU+!6Ml&PJBos$qLL9m;<*pu(4ac@w@fq5Kyi&WFbuRhQa}cfWI&#QQH;@fVv0 zl!+PtN{-;loa}Nze-ganuJjw%@hDLaqNV#OoXw;JiHZ=}9lXpWK!v-~ON2XdT3;=a z@U%Xi>EI$)MU*TvTAfY3#ZKzmn^*IAr79H}Bndb6PRTEoccaWZ76Cba`$0eAU((Nd zDp)NLlz769tkaRsI>CeCfv^wM8q!>ND6E89JE~tl3@(AG@M*|-BIXS0!{O&V9|5KR zUQpr07zlGY62~U#BQtd#`tzL9y2GiWGRmArJ1m@oHU5<tRPl>P%mD$uvXjG3dWZ`s z6>Kh|<buslz3=WXHKR)H#%zi^DL7bLhzD$XPTaRf0nrt6v4HUVV(Kfzc1A%OnBnq! z;3E7@2p14r3!;hZ1k!mmkT1A2%%^yow6&k2X+2x}DZ5oD>S~Y@-`3e;h30>SkK)PR zJiX`1`x2h2r}l$r#_12`m;taq90-+82g3=FdC+Dq=WwW!brf6*M?+=!W8h|}HML*D z@lb1;wU#ywPJr_0M5y(@*)Rv@Lk%%cf~v<d&)U>qwT6~)4W|^+Z|`W$?4OYN*JkXn z3M#%;L&eKY+yg`LawW1>+;?zKNsO0&u`um#a!bXCOe~DW2tSx@j8I+0G<EA*k*27W z7!lR0+ZkyJw_m5KqFt+yRlcrkM<h0%)Rn-y<UfTgMT@CZNqh_A0`l|SkbKNp0S|=t z!d`F{JQl8nifzxp9H_CcS@3yyJ=ECOP4Go{3)}#u$Csh>y%S*(&aWpSlMi!Y$C$o@ z^U0YUQc_Z$ZxmdCIsa<z|6wX5N?<OMvrRT^k0h6h=OOFF&2YMZ0Jg;Pl&uKr>>9I# zsjhmaQkN2Z!rX)S%I9=mKF-ah?{lD?=N;SEUkTC5>Yk@FpZESHU1+T(!Q;&KghdQl zOFzZ1H=GQI!g9C}q7##*s-T=gW@h#am<GS#c?Q(^ET_Y^a3;)vXF&BcxcoZ~5{~XL zcn(xpDZPg03TGpe+Z4yT#KOv)wwzyHs$+*tIJM!ue<g;KU;DEf$@Py?kq2#f#1?bO z0<W^p#?3(;DMxbel6$1Do!}Tx)`YkwH{xfr&joSLtkd5GsxHw2X2O<Gc~vVo9JYb- z7dkTjznH(%LV3f7$W-5aoBP0!|Enr;^Sz$>OkVp}viGxi74p8~NZ9)^l}Jg(`=%{I zcn6o<BmeIL3q0wbxL<B;4|~9Up!~fbya0B9iZ?0nR@e#N4iA8<A$ty(b3ePn=XgE{ zDn49K+z6N9uOO4I#jYWJl<4T3+!AKXRO-xwzaFUxtp^P~#+UHJMx=$;N2Z0>N2Z0> zN2Y~Wa;AmP-%Jay<V*{%<V@=kj5~)yuNN8!haRH1$eXy%y4d6uiWpvXAUGshbuv$8 z)@R0NHO<lSk+N3B6LWiDgqzw4kwc3wyuAlx&c75ciXSSgcX+~{gr~xcv~SYK5l}f~ zFW3$Cf%=_e;6T_HD$4eU6CrtoOJ3xRfU2@&LB$`<*SQ}~fQm;s@B^3!e}egNJB-3c zxT_G7R-Gc)3>HJuo|(@>Ty>`Kd>|}^X^_4Tv!0^@X7W50_Jg#0%~=xD;Aozy7npS( ztTi<8b_u^3PRIIQX@ogV&OxDg8y8<QG2&nUrF5){Kn8XOp=<)~J0#2fUxIR<!i|4H zKl9o6M{b@4d%$y`!f7rX4bOvl@O-Fnxd1A!pufV*Q=p#YuHpF-xDH+l6+V|kl@kk~ z!a?(!$TOX*;2!X5*a^~4Xu?DDo0K0s%N?FaGzW8X<5}?FkX|b)%k!fJHC}Z-6I1?` zsM=O>i<Pw^N+rg>$}&|T$Ei9<WJ<1q`kAF-vsRP0ZuFf5<rjrPd;WgGlP|~b^51Rn zP<T7+3GagWa0R>uYA)9EP;;=}fcL|<pyptG1RsK1ApQ7e4eg`wXPzI2zd+4>qMR~w zpIX7Ec_zO$^)7|Qb3FHes%MdYP5p}Ws(jcb9Xiy3UDB2F1}uSZLWS7~{tnMY;v33& zQ-^a7i-no$U*+Z$D%QZ{+M~MTi=M<li_f7=8%&|*VrwX?oQEhrtJFBod}KB}LZ@LZ z<VC`1Sbn?8+Mr@lIibQc!mXSzG0bE8y7Ugr5T%%`8K1F!#=F(rTx!mZhxP}&W4(=~ z1CX}mX2xYrY3U3ijhE$`c$10_{Y&~(yiuOo*^_@wKb3U+4eSTipLZPm0jkcSemv!^ z>c5)|e}(062b=+ahc5gBo)6XUbqQ=hKZvx{5Z(lvKzXGFd=9GL>usohFQxT1@Ef=* zRC%x)Y=9ftv&E%;WctMvzc?4x?1#qsW|w)CP6VC_J3{gsN8=LnU}s2v<8*=KA7)%) zG1Rz(>I(<MW$;kA3U-I9p~fc^A1MQp;v;d^#7Ei=PHHGVnzP9MZ{uU!X=T#1-6J6G zw6Y}#ZS0MmQun_TPru}s6u4Y}9Z!jT{~(@9&*6Bg@gT)h)~TC#s&OI3(*aQNbRbkb z)wq!2>2Xl;RO3R5r^BHOM?l5Xkx=neV=~g7#$*&v*$c?TQ;l;do}LO7Pc`15c$xzh zPxGMSX+BguRlld=X%SRBRsUyKsD4k%e}^MU?Vear@lySX7ee(XQvNy9;6liHdv_^R zzv7MXG)Ug=oB<U-&x9IdJqs$HF6BNf)D}?Pqcw8sOHNuSp5~Ra{e)_~Z7|?pi8<!K zZV0JODyt&gBO3%~b_e?lxyb!XZd4e@xAmXGPjdHKxDQ+hBk%=yF5Cbwgq&|{!t52e zm}llVo4y(LWpX=U?>n#?d>^U|`T$B7A42KuF79w!Uv-97+)r_z7}FVh{^XbDR%oN2 zf6_PW*9hK;NCW!POlKR9r8Xt9*>SYCB3fB(5=vL(iHn_m-G5*#Fr!Sd_EiqX{Y&oM zL<js%aEvFU{5O3iU7++wKZzOpIT#+xGj(V)-gpQs<e7ScS#y*M<?l2o{hZAm*3S@R zJ9Ddy7+<%3f(6L+M=ceC5o~CP4OTzdrWS?BiPKqJy(deryi0D7pPNCIdb$qB&2rZf za5qT3)Aaux1@X7${<)Z8%*o~($3Xe<c;Z8NecY$W6$jLIJ*jR#syEE*_EaK@cb#Is zcQFj5fXv}B=2H_BiV)EaBG1bv)3K&x6G3JbP@QI?jf7nT!(Lj7uN&OS%kJD<s%oS{ zYjK$w*X+e}(ymZ)6oK!%KoeNvtyDd68aI~$DieBE1Up6fgOS5zh-(I&T0#46o|T#Z zrAvjC^f}X$6J{oU4utKI4T2Fk6v``T)9nvOLB(lqv*u|WRJtdhcQ?QZP<7T*q4MTz z_%5W4;VSI#hY4e)k??$zN@U7oO1Mw{i!d&W*8bf%TAek^Oze#dbJZe;AhL7DD`J7} z_mkEa8La%T^HBLkI*!jni}AbsHyQ2;r@+pz3`)lpFcVINgCTa9K0C4}(^lhm&A2e} zz^vz`>@;h-PlM9g=}_rM`EFRZq(P(GG<Zr~x@F_HTu!JB*19Xw`d4%R589YE`D7xA zQ>AJaQl(vPXwJR!);2|uCM2G?{6k;(m)s|P@lW}Jxyb8`zGlI_kemZM!MX4-NV((6 zKl7mceJyvmuSsoP={$pbLbAVYhW~%$>+f(wyr1Q^u%DOU7rA#Sl%H>a^7Bow2fP`| zFSkJXc^!Ay&#DW_j*Z->Ci^+RrmDKUH0I|_jQLk{|BoP~N%-NAR*_kENPiVk_UUDl z>M>U=`ql`eWn`%8(o;s)74Zi~99N8*Hc>5a{7e3jep*1qZ(YyeZ~1LKlzzxZOh4^& z@Nk}AfSGUul+#~^q&MdksJ!kqhz_0C;hT`#%$*?5GWwi@EUeF?knPOflY3&l`uqn) ztY3qOOF1e_u+~Y?Ts>(-?g+=1_i(q|_C8b@y9suHAHjp+f1up`F;sk6%^jZqHW8W1 z0)=aKz5WXouWc~wU&*m1!mBu6Do0hA+nh6&)7I&G31y=-9GA^1{U}WROYW9FnnAzL z@j3pKU%r6KV`=^veS8fwdEN%cK<qMe9=?at3;J@xdl}w}OmXc-?wr5YOHd@$ua-KC zqzG2W=}ASB(G$L6efQreN?KLgs7tGLDiE{M;X-czk{_i*x%)y-_zOCbzkh}8;cqYk zcR=c?&Yw_minf($?=^(Od2S3#VN-ZEq+igC`!|Q@^GyGssVmSHa~JSTAC(#ZYYnC2 zHc(-46?b_4aH`C6D^BOe!lI%ox285*a~)z^B>hbj%CG0z98CF7wi%+2#ZS$lR#N4s zl5#2Oua{nUm)s@&HHL@yGW;R8ra{HQ3@CT^^!&G#zr+4}0GV`t4|iV7e|{UMrmR@? z(O9OPg*pFHSbJC9wObX>MVLs;wEg_Kh<f742Hr1Jna0l$3@0~!<nOp#Tj?|tQNl2% z#**(ssB6#tiQL|L82!9|$*<Dc&TxV!JPO^&|Fi{7zJ4_9!n4K`j)2EPxvDQb0S<sl z{{!I+I2cNI!=d8P3huCuCnM8u7I5d+uj3#i&%~U6HTVChuV9omBNz&4(=YALX(J_@ z(oT9y#bkosd_85wen<7hr2Op!{3ky!X5qGjV_*s#3wyxva6CK-%AY4g>ElE0@Hz&i zS;f=A+y(XPBb4!HV%op{Rx8S)<eYF8Rgbn5QKg#XxYreFT-;MM^RxWDy=Z3gHpLPD zlK&LX_!rbEbI^zUoD18-Ja_=ihlfM@7ERrI67=;JE-y!7PH}Z8cl2-c78DGb81}Ef zRh!BIqc)tLP!9Yz^ft(I#=iCGP5uk(P2*|ua~V{<s~mQL8dp>Ltb)=<HI&|#bBFsW zMk8y<t#Fwf(;M@oXl$2O)Ko{a^NMrrvNe)Ra3!j%1G<Uuu9{nOg|ihuy<KHB9oV$x zyYkY;Iqj{g+4fat(i39u!%)4VNN>DL?$lftr87T&(s-BLuJJ9UJNg67oEMFA9muoB zxfF9X&ZT<&BG?~Z2akhGp!~fQN<R%6Xm75>xo!6#Q(U|qR>bS42fM@KMeRk#6jGJ} z1zSX^qa%k;{3}sa@l}p!ZLwXaS%KNcWEpYWlxap=E#gkxOnHg3KfVhhg0qgdKcsY; z75gAMeYCdxN*qS9bFP)y4Z&n6v-5{ROqyL`Ej9m32ikLHH=dSx@*L_L(n~Is1IX7* zdpHVt=S+grA^D{_3u6kroaZw5AjHRJufIyD@v$nnHzb0%2SdDW=0#JEn6q6^gQR~m z*JTPkhvx-w4!jc1g$l#V8zzrsmQx|?#=Al|JuwWmjJ7IPf|GKBD>2xlN0+yIq$oJd zXQn=)v6I$D=AC<BGfSHg@~g(OR;4N{TA5W`8!cf1o>hDhrdlcKt$+2anf6O<mOLa{ zJgKPKe56{8eZj!m$+344EL_gJz(TtKGj36$VnqZKiPMzjkfQkS;=YhWw(!o5kCew& zu9^`#yla1~*mRq%4-85ro>vrgGcjmg94+lvUfZv{n)a=;A8*vlZ|yELt3~5}TC@J= z#XBp0J*l!;Y8dghj$wmm{TP+m1S_T1#EqL7zR)(jy7VKI(4IXU>{@MqWnjUisHtdW z1ut1FGN72rx2iBuh<l$DNF>)x2t=~Qd@mghL2Pw2nW|RYe2(!r!oL(J+mogg3XHj! zi^9{?<tYqI|1){FDfe=r^1M7a6)LUW1dHJ#P-*Nns5JH!EP>SXo%7(X@O-Fw7#G2f za0%QBm%<3?<!0Cu-U0`}+hGyB6S5Xgdo;TDz<c2uNL|r=0g{g0SKwo?DSlW3kAP1? z#&gsU;@%92B<`K?Irs*A9x~?OyaYdiufnbHP52w!2>UfQbF<v@pxV(3AoV4)-^xeu zGoC+&pTo_tNfX9LU>~>@j)CaHJqdmTFNWj~?&I)#_$~Yic5iCdjJiFc+Ek~)9WW36 z2}@uj$_K5YS6gX5R9lHXuuWTuv&$W|l|F%c!X1!&%vEF~b9PUFonQq#2(nkQ(+%DW zyF>O4c2XhdAv(+haM=^pv`vbj+9uN=V=}G_d%;=oNO&$(ef&yDT60%H#)#Zqce3?x z=5?ETxb`nrJv<AJgr~q!@N%en>I!%w+yGTSJ#=R~|K~V(D$j**BCLiv@Jy(Bnku}i zpUr_$cs^u)f_o`cedG?vc(c0>s+@igUIDj2mB;%M_Ze4q4}~|tKJXSe5-x`m;hk_H zyc@2BD_}#?jpksS03U`Y!bhO;e!?Yb4al>^r*^z!tjwvcEAP+Gt*HL{sVvI=Rk$9M z63hOTk*Gr0-O5Z3H-z1pOh%w=DJOVYU0xBqkyV{}V{^xXsu9uYrW({WPBy%JT9jsh zElX^jsn}#WhhQke&3K4)cY*m<B5PlMRcx1s?~p1p@-OK^c}^DuwCT+CI=Yj7G_NEA z--B|=2k=n%F)W3j!OP+2ko0Z#OxYPbzUP^E@B9F1TRT6)aqu_zDEt#X4jVJi;SJaf zVu#Zlehqhq*x|H-9mz}D!pU$?I32c!mqPZ1cUQv>kTsPKX5AEcAXJ`nFl23`(+y@p z?NPxPwUY`@ggqc*(GK~XI~5)Q=fK|Z64(bWf!ga~6+9L`2Kz(B9r8sJ$E1sJ9a{P# zTARgcOB3UmcI(P6uA*RMPWL|>Mm{)2!K)7`J%X{|RP6UJ{oZQw8Jy)PCh2;Yyh?6( z4|asgGnFQ$aEIr1DH6%7;=!^y-K&E2-?>(CF5a#Bt*~3Sd2UsHEI06taVvGhr1Tr_ z)|={dt5>!7cg{6+-M@41&z^g?d+z<kbMIu_8{SiJFJuG_l_T=8I^4_r_bEoTybrGC z!C(GZP8%dPUx|wdVcqJt!n&m{?dtbiLb;(8R6JPE9gerusU6v&oa5GHw`v?e7<!6e z#=jDs>-P^_5yV>!<EzTliw{~Gsi_;QVws7^8kEh&xh2Cfs}6}Fys#}Gd06?M-Bmpc zxy{+k=6)tgNDs<*{Y(Ck9^|fJo{&7rw29lpZpik5$HIN#@sRqE>66(X7V;c{`kfRg zeX%w@DK0kV2jtE#D6{XbTVLj!T@$_wvB19+n%?E@yXf-P-*<5Ze<vzWC5tjUPa&h( zrEmyZ>1(F%>E)W><+Q|?s+O|6-dPz0#_-&#DW<CaGGePqX?SF1@uXrq^u3W65uB%n zdk`ine3l^WWM2?ZY+<+BSd4>Afo3e%Z!X7J#278*_skBU5-&t#ZOAM3_G4Cb$wV9> zz}Vgk)7l?a(M76_i!Sla+|j(++<^b=Nc(D-Y8(=q!WVCxNbg*RuehYG?Sb*U<U*QC zm1kFcA+36Qyp3b9;s~mmT=Kx`;G^O)W{{D$%LBE6G^(~l*pBP@c)PX3xGFGRm#c8S z_2FN+YB4tMPh{khwpC|;HAQOGzLs9b5!e1ur1LMuWu=+n2&z4KMkCvwOL=P2hUSjV z<b8j5DI5Twftn*mUEItG>wqsb7c3o)ftir<)}@Z=(B3g;ZJ!M3({r-nR7g4Ox-cJJ z1q<NKa1x|W=S+sLK&^$PUSih3D)co6Omzj#{nB|cn(IaR?VJs3;W<#jeja=c&WG(N zB(H{r@Op?DXDL)!e-m5@m&3>5t?(Im8&qBC4ybktZ5Q`LxDI{;Ux11Xv}N1@@GYpb z0WoXNZFvut@vQk&7eKys=R?{$=G>Oe@B^N=Kt+hJU~k$ZKfu%A4tN#(6W$6NHfBCP zYy=;Jjo}*D6uttR!8hS9@ISC6+?lX#4ST>gFaz!iC&1ldF-(EeU?+GT><n**UE#y< zVE7|E1S*=P!lAGyEQ5!``H;Oa-4&2?``m|NAGii)Le5HY`onkO0I0n6M8Yt<uhhBd zRb>%j>8wc1Tg@m^MQ(LbtTf8Oq<;~S{fm(nl_eECzm=kN5PWLWC-S%qMn+vkrx>I8 z-nv}dCpizf%`8o^bCStN<|C{(OIB8AU)GT&FX3e<OI8D6IpT1Ze3I$1Tfv+7wnj%x zE7yy*mA48jbMvd&$tbsEjCP!*^MMEQ8*kmnHVpcg^s02e4}woT;b_7^x*h{nHge{W zSsQpF9Ln=aP|lhNpMd#LS!xj+4~g6E6j%<=gca~oSP5ynIkk{BnKJ{v3{Qifz|-MR za3-YQ@0<Zs;F*y6xN{a{?=cPwqWzD%=RoG0I_E;>l{)iaF{Dqxt%2u5#TU|;iC49_ zH9SYH6Ef9x8BcTWsV`n79FP#fq<<yHtyErx<CZ^8q<8+M-woHz$OB9r{Zc6RT;{p^ zO8yRyi#112?U1Wa`hoh~T}m}+Ou4CU^unxvwekNT3EC8qg(U21mGI+{+X!e6I?oB7 zH7{O`57o6K^)I<g{-V1;^Uch)l=Hac)*B$>7tSrP4_ppUhB~LL5Z(#pSDja;@<Zp4 z$$!{q!tZxvVLhnh?l9zo;OhGHP*Pmx>tPLM{VO^2UglL@df13OUJsjs=NYEFFNi&l zEG*QP5vt6tLK@*VD^gWKQ)O1$mn!!-+@#d3RP+4+1fKog_cEsB?-@(;)NS;=1-XC8 z|I+u~2x!}xOXssmCojO+@FPecobv^I3hJD-cIcJ7+ngu;6CA{|&Q+TLw?q17%=v0_ zpw3mh2L1_eg-$a&ce)|mz;hG$AJ_~YMEcaZYV4cm><V?h@NV#Q*bb`v-5s(wmeU^I z2ls+4@ka!9gej0ZhSL$MJU9cp!*k=*517Hb@8E;=g*)p;f&`$7hkqppy!v#*0k0rX zcIE|)PIIKsCJ@Z9f}%iBs{<e@T>`-jD^Ru1vqLKl?KpuI%t$vCv!v*gX2eOc!v3O? zm=`VV53I*uL3C0@Pl4|JqK!`WXO;!x8NOJ~=^C@ox=-<|u6Wl5gZ?G`E8cZL(Abk7 zN_b`PoDS!}BO!gb=A1g!1BdY33sOfg^}plbB%Y6l3ghAMN~m+|=+kpX!u2o<egx?& zb$@_k;ZDSx6JdKe9@5Wa&b6a|#++w23T7i;2=m~xa57Y5W(xcQ>ioI}_@flEPmDvI z#XSs`L**xxFc((A2jOY(B}gBw`!SpeP5i`<;c>yIk*Qo+!~Iab@w247Dmt<vT9!ra z#bnd*MMQEe&BU^BERE{}s^GPM>Gu^ryFf)RU1#H7xoH+uK71ZL7+wI?=B2J?&Yrmx z&gXd{Tm-L%%i%R}6}%R%fs3L1-<>cC&%b*fSx??Q31^1<A7#7685Kn%YpRto8-MHP z{43GlN#mhvNiD%_Tun`xtsGdGqRcinwrqM1R`6n=c@f)wUmvVSZuh=5wLp6UfNEVz zJrQnY+tGp(*_1<5AeF9^rgSq5TQJRjph{w9ATG(R^3KtcMJhdQIx@c;Ukx+)_%`1A zm-Mxsx_Nv(><juDq{A=a(U7){S*QCe9K*BvQ1js*uokK>buOf=Fzde?!E1PI3Z(`0 zsXh#Mfv-UIsnYLZ`cfHtFny`rAp3!sbsp+d?alN4@HnWx)nTv`JOv&A>En00KxKmm zLDl!vw|XH|-|8}`zE!2?bg1|uH-`6O%0R~Oy_tglaAJH>Lsk6%vFd#UgZ`BmTNFyE zyoyz(^`)sY_d;yL+m3R_>MwfZUvftg>83GM-=eMoR5|6gfiMLQhTY*1DF3JfK3p$p ziwtXwpB|~tKXLuO7!9suFSX&_BmA`O_cdOMOZW1yf9ZGSezGU0vnQkt@5(JBp!_k? zb9WVghuc~4?tZjhcWX>S9je|B82ocrhx;k(ax?MUxOuGS=5d~z=ki<Oyhd#m<!kEC ze5@WfYYxUgc62EAXpvug?2d5zC-nMt-+0~29bw&1z}<4&sZj2l==nqGHN0<IyzU>b z#~)0a9Pagr{j&fF`9;y@pXk33cPh?If{HUmp1bej@38*W_LCV^OrEUA-RQq>iCrld zud?JwlZizkH!D#OLEMR(xfOm-p&BTWKwNB^@LhRUa<n~%acvabA6%xbisuwAgpaxI z_WXGdlmqXBq<iOns5b9vsPyt6TnrzD>mc=NvsUIwDE~hNzeV1Gicz?&xrE3}8g#^` z6ZJ$E7p<%q)1yE0qDIHI(b!Uqaqnv5|3OC7w$0AYk!@e*tvZQAduaTBd2AE6B!Ae5 z!+Z2(nr-Z~aU^WG5tbaDB<T^Br1naZBz={d8Zy(fcScy!EBxy{dxh=k$r192F6?=D zk{M2751HZQ^{^x@EXnAdBuR2lM%eE?Gm?HQJ?Xd7lU$gd<cstqdwL|<(<8~vX-PJ- z|4GQFX-PJxCViEf<et><Z)Nlj>nEdkSU(xPlfLQ|_C-cgC}$*vaz?Lk%*^N&_E$!) zu$wb_g+nLfh$J^3k>tX|lYDV_lFdDn%=AohVb3I+Gm^f_Nct)x>9^98+?<}|FSfl& z4CM^Axd}^>+>@GQb83>!N#UNJ6z=K0!!atoSJ>wCq;OA93itG+a8FMP_w=MtPVW`= zS9($?rymj4eEJdLIG>)Blce`d@<md<k=`?`=k%UQ+DOVt(v!kHJtG{S)06U+^rU<v zJt>z+?~&x@9!W0j5f0__r1+DbluM*1<?89FNm?Z*=@3_fjAd?h1xE%&3$o3;J`S9! zr0x(aV$76RHSsiSEv|{DI#_c=C#RS?0LPxG<<$mBxO-kLulC4oS9pBOOJ78I6QLw! zcMp!WoTM$2ZN&k3wUN_lG~S3(<3+aHy_ZDP97Z;nUR+?B>^PL31n<jWQu9!=k)v9f z%dpeFwUd{#^O?7y7u%^UB(+yH?x!A&rpA{=iDS2VsUbZ3GBk>yIlC3XZ+U|f8j2i` zFmZCH)IfE{t0$Q$%4RCC<XM3gv8JphgUSom8)XSwWUFen8aLTtU$xX!J7uN3ot$hx znNn6hy)4_z6xFP5ZK}%#;YJhs&6(I8;bwdO+{#H>FJo8puRzwgqvYikqcxG5{Htx- zM*`F36=`O|=xj7;>wLv!%qg!iLm$J6OPM>pKOdYCeBcdVXKUhu4x+SuxAS;E!u*VN zSCxrbYR?Wg(!!Extvy~$F>5)dt*_)+J4$ZjMvmT?xDlI0ty<@0RNSbJMoY^pXV^$f z+w5Hvz^3ED^!+HLUdHe+^OLOgtmGsOV|pPDu^}$qSv^Q=pCFI$1x>=-X;Ir55kDfG z&b!l9gV%001RxV1th+TfPn=C0zrGLK?zN_6c`c@`N|{*RPsi0)C4I65o8M9Qk{xq* zgHP;UJPNCsfy^Fpk@%ZT-*cX6VJwj03o#twNrya+H!b#g!RIk6X9qG_8SmlS_;z(m zW1U(C^D$^WJk2;g>|+gT&uC?gYsTGzz~0zzEevGg-x`P0Td2vSh7XB6_${vw_>P#s zcB!ri1a$f8lSP4`*7oWy2?Sop^75FVN1Z;n79Z5A&1mNwtP0F4qKx3&k$CN>4RiLc z#;}yV8pEATWMz6nowmQ&g^9oIf)Cd4L4+qI#vTba)1q~D+1(i2+iB5uBr(`tN@9a5 z%S&yX4eMW@mHoTVUio*QW!NUy|HP4{sJKac;~fRs`as3gY@odm6Q~3w4F_ssQlAOv zwJ{^9Noi<4R!`T^jZLH*1G8j=JxscNJzk_ypu{vJ3tFhp&|0u5-n6ygy?9Zw1(kfc z)LJ0-e-dvx>DL~mgED(x^J~hmy3(;^`#0$h%`MB1n#uNC11s{>6H9ikO^sDPZ3*6( z9MWoR36>~cs!z4nOe1O@SX&Y;tj^Bk;BtQrdM{pm5RqZCDo-w66!-lMQ?kxRVpG1E z{S)h_9m0#E6n(9wOZMCvrTvA$2gb!FAeY6gt;#dG(SpEKuKZ>Ex-IaLk$HZNPj_dL zQ>@tEs7yb#97`@V1%k=@japV9d)Uad^)!1hD8F8f@G25Fb9HL+Ce@ijGqAeIrZ$Df zdcH_Jd{#fW7O7Q6NmX9<4C9kE2{N5Mlo+Y5#kot>*`g)J#Oc5|u`<c<R7~}?J&mdi zydD^?V)ryQsIWs>8^dCorNwJX7Cm4sQvGOC+!uM&;)=9Gp#1q>@Pg$RHIjzi{}47E zdI0~~X-}U79~2Z%D=zTu*^(fxGTQ?t>Om#oR%?&+ur>IgE<Id`;X?9EE`{F@@rHXC z(YAO|a!Op-g4x9f8Vlsj?SW}iXDTZ<L8tyBIZIKv#;Ygo2u$KGQ>#+IHx5jeR}2jm zm6~9E{6XfY<kl7#wQ+=U&Zf%d@uDOJSCK8=p_w7J=<gi-R6(?)I@dU~4YFUzSF{#N z8dvtYZ(y#>&Ma&n6R_gXY(Y|GOh$qiobRcuqiZ0byb3Sg(HfSw4l&MAI30pn>z!(^ zrW1}JpJBE`ck_W%)r$|}-6~5`gCA7cuPSh6Ai+b~W+JD_2f~);VDB!68OxO*2Jo46 zO+tbg5*8;X2w7BNEmDHWiu)oVK@1CC)R!P~vFQzKlcLs`-~)0|s+wsgU5yV(lO0rn zHAkiLpG{X2f)5hXRZfDqu5@)K7Ob%LNc}~85LSNyG8@mO{;-PYVnKSE++pHcZ5<X= z{G|oA^5tVO3+7?ihEaaGax5i^*@4WI#d7F{fk?)B7-McA!&q{nmaQc{<WRF*V}4+| zGRad5G1EY`c58G&V6@m64eOvBbB%f$<BG2f1LLaDNwNq@{VG(Hm>&Cl$zK{)hWfrW zEIr&2{8mg|%L7@Ut`&hOrmkgytWI^!;fEF-Zak$r{Hnlovbt1p>2icIsyMwmFd84H z9|=j5<MglCu-IB7rL74*z<mkT+)FU{nKh{Bu@-~2+EQ6wZWrmU4@BC4-iQ@w;eac^ zqD8%o!}W_VB>ZC7a4qJV^frd|tFOl!wh{2<cu{f$e35Tw#VmLa(>79=^GoD_je!M9 zYVjqq#yj4#-zpE@6ns00TAi0H!wxRtn=wZk2P>*<2`rB_t3C;2^;z;Z-#>nou|#3J zjSrG*Hd_O0RI^FWByOWrxcL}kiCjNsq@TvU%BS+w0f8`7Rcy|Sx~hshf*-Y2Mfq`i zAhQ+2uu2}p4R`f54p9%nYKGKocZpF+w9@pLsB@=+A6=Ld6z<VVf6iFg#tD?amk%&D z$^k!MqYc!UlD7x4aHy*7dhS5;u?pqJ^ikNn&uhE3hzV>{wM`)K+O9jW+xx^egETs5 z1zy{=c}!rFT-XP@;e#Ir8Am8^+G9S>2Wci-Z<i=EncBXAEbJ{!9G^Wn@K)Er1)jH3 zV*=}~j6mRdD-sC2CVA&T;Cbtin4o@dwNO)=J~zD82lGkZ>Xj%o-pUMQb$M%%wNarp zEO3G6tuZly_15@6;CX96An?33BoKJs%8Ci<_SO^hSasG6A?vLi%qMwkLZZ-iq9Kd$ z5pBB?#y87ytL+J&1%cVHch#rSYnXn>)B`Ipm=HPXbM*z*yKW%xyjv0oJnz;90?)fM zV}iQ9JDXqsf<(=wQfPKyewvAw^MdER8P%L*rzCh`g3MYQpOv17U9(8uo|W?h<F<1u z-smlu`8H;B!Cx3vHD*PYEHw^Y_!mZVNFEbM8KZLV9T>GiC_iKvKP*p>r5h_3#aXHE zmL!<5eqWX#vwqiJFHDm&SDzF)uXo!Iz2|Nn?G{634%BMfonQ=VTwL=f77*R;@Z=vd zr%6G<{6BXbq}$V_6JD!*+|%J_@B&Da#>{onoT=qJe+5^-ui<_08>ni`_i!Ej3BCsD zhBtGKDW=Wd_)XwX$h8iYp>>Ch%IuBLSwdzH+}&X&a(d~_+Le9bX*@@u)~aYO)U8l+ zp!Op&9}maCVNjj-<KQwl9zF$`C+ofh$<o~~;i+&NEPxHsLm}J~7Q+-c8Fqms@MuU6 zl{*Ahz|pW0=0loj?qzTqycsh8)?EQ-!iV6Q@JV<UTnlHxjc_h(*qFKWaA$Y{+#g;9 zuZ7pZryvQ{eHku-Z@}x}ZcQk0;r{Se*caXohr_$z3GiMx0j`3%@P0TIJ^)XL55k4; zA-EVm3g3X}%56s6SPNUgXJ7_=77l>V!J&|S2i%k32B@_wFGF>MzYZ^fZ^5hKMtB!| z2dd-yBls@-7=8&qf!p9`ka^F}=Wt&lF!M%T<|jK}!#VJKxEcNozk=K0cW?)6+T8Bv zz6bo1=XA)#EVmbI1Sh~IP;2>{!BVJm44;GA$Ne3+EBqR=PRZS4C%b?9K5!qN=fO^J zA?yqnL*j;e1Jr)(f5Jmy>z&!x40eL)@Oao0X2B!jBd{NQ0rrQlz=7~hNZfM&fZG4N zE4}@!p>{K%_WeEqGXLByhr~U1Ivfknh2!9bP;0zyhbO}a;VJM9$a)P|qX&8LYZ!%l z&;v3F4uGuVa3@2p@mc`O;0jm{?}Mz-cAtb=^QA!q?eG0AJRNpxY4`O$7rH!aRA3f- z4bFid!nyEQI1ldDinSte5WEoP!HeJ|cnPeAmqHB}TnR6NSHXqw8u%kz3^gKf1MCiO zgk#_`csjfZ-T+C9?z8X~xD9GeS<g146WAYWP1z`TC(MI)!AX#`>sCY7qq*0>Rd6kQ z0B(Y$Y4<Dm2>cGRUd?UT)^XNA_0c{BC&H)U6u2H%!RKHtd=<U{wPtN68aCSdy9;~= zc7xjUdj!-PwLG{PYCK^JTne|sJK$IFarg~<4t@u<FZqu!V>cT5a1{I<mcc(@6?9nZ zQVScywXiw-2)2NKK&@G8)Q-M2xEtIJwugJb!LU6X1^0nva9>yjBXB9~3^kmgwQCQ- zL!m}3v=%KL9s`TvK&W8}t$n%@YVFet@KmUAhZ6V;)EXz9p-}@hurM2HuiClrGI$ZZ z3SJ4Hg;&9sAbF_!C0qnM?n%6XL*WuQ1}=ps!JFZw@OJnhyc0eKAA~Q#hoD9#9*1M$ zlkgt64t@lmfj`6bu+3iNlkgz;JgkNr;Ny_I+dXw}n)k32egG@sM^GaZ?4ROZ55I)> z!maQb_%&=s|K2vJ0SMM9x*70SI0XI%C&1s~BKRlNI78DW=mR!~@57y;hNoLV9k$pS z>O|f)P(uyvVFla|&W4mN?m`%Wsw1SpHLxRm9UcI8zyo3P{g{&s+rfij8teuShuvX+ zm<mV2G*|+Az^Rb+mhP4CSa<`>gm=My@OjuDz6=M$ui$a85&is>b#7ZY0(O8SVG0}# zd&9AC6lC8SHwsUIQz2!ddj^~cuYuX{dKiToKbQocfJIOz1eU@dU>W=aR=}N@b4Xe0 zwu06005}~U4r}3H$of%t9Hgvuqi`mi0ndWxLl<5P&xTLJS@1nL2YwCb!kr?tAYprW z9y}Oc01tzg!K2{<cq(L_syhi@4J+X_a5`K9FMvzo_3%cx8Qu=J!xd1=C0D}s@LqTb zWSy&f6np?44<CV3Ap7>XHSh_jN!m}sIdCm}AHD#;fvksh8+9bVgL}f);l7adv2F@{ z8>Yc`U=jQX&W9hv#qd-3AlwXJhg;wl_&MAGzl0q+kq^QFa2p&3e}WU>&oCGM0w=@Y z;5l#yTm=7wOJP&iT0IM!!}lTUb=@!EF7OZ7687m#dVzi6p0F711<!zc!%N}5a3zdD zjjnWsAHsv-_plpmb^!Sy><Uw%#!h;{vG7P(2K&HS@Mw4?JQiLHGvQ*`AKnA0i@EFI zVE7q49&Uvvz;<28S7BE;4)%m6!l95lo0|(yff`21hZn;rya5)%`yuTE_d7Tl{tQcD zvja&7P@^Zzz;K7c>2NBX0q4Ne;MH&*yc3=WAB7jdXW>O~GrSmn2``1MyVA`9_k;^z zN4OlG1aF7=@D5l6sY|*S!Iki8xC-76?}HD+hu{YIF#H%k0>6Zh!fkL3{1rX{|AbG$ z<_8gfVN3Wl>;#{IUE#Cv2>2Wv1fPc*(s>Pzg|EYt;hQiYz6Fcm+i)7BuItW%@5Afi z2XGnu6utyE!!O`hP#gGC7k2l9-@=YiYX?t-Kf~!zYX;}TU*U528_eiNdCnT4-cV}; z`@`mN2-F(EQLq)92wTG`uq`|TYVF`0sI`L^!9Cy=a8Gy*q%Q8>0{4R&iaG$Uf!*Nq z@KE>`OoczdH24e5fEkA{ZVgAl-tbh|2c8CxhG#*oIa>%v!JDDho@tC}4Ezpi%~_X2 ziMQ}>m<>ONIq++k3tM-m9S8S@QP=@$ZCN_3fCHh{mYoc%VK$rwt6(i$2DRqwRyY$r z2hV^_4<lcO8fCf=?hY@4d&5g$cQ_yRgO|a4cm<pSuYwv>S_)5tH^8&tGI%+>3El#4 zf$QOI@MU-h)DY7B@I&|j`~*G-x5I~Ei&Ww@><%A;%(8Y^=kIFF=s7qLJ`azBFT#oN zC0GexhBM(S@ND=Ryb-<$Z-*P9#*FAhaM!~Bz_;PY@B{cM{0@Ewo2HR3!(HGPusft} z=4#03M>rU6hZEp0Fc<y?YvAwjJopE^7_w=Mdk<^~AB60S;cDb)Ke!(54_|~4_z_Hj zKf;c1ryjJ=;C}D`m<<nvOzm(Ef*Kg2P3TU88Sr#S+t9rh9tGFJW8g-3EZhY9!cXA< zsL`UKa9=nIc7Z2AX8Jm#;jwTmEP><TRq!NuHJk`n!Cd$X%!6;jD0~;vCUw7r#js-r z^<H=!EQ6z91v~{-!W>uwC&TG*8k_+yho`}X@C>*do(b1N7d{Kmf#1S8@DDf_YFO)H z*bUBy$HGhDXm~k16)u34kp1mkjbkl_*Td`Ky>Kaf6y5+g!evlHSa-oDhf}|Rd%=6) zp>QSa3-5(v;eGHbxEg9i>T$RhJ_SF4Ps5f+kPpKY_&n5b)N61Ad;{jeH{mq65iW%9 zLX9{52d;ykz_;P2P{T`~!w$X3Z{Z;LEgT2GgX7`%un_(Li{OuN8vF^?!tL-J_$#~$ z?tmI?YP1vXhfUx{*bHuk%^?eVoSmTtn%E!EJruTsec|qKEZh?o!}jnDxHr_eQb%|j z><k}+2f$b1fly;dI!Asp)H(9oq0W(SekA!Z+#ROFLtsxh5*`UPe$)@nggS40J{$;_ z!NG71917RLVek#8bH{f&ihLWU!4u$-a5U@#bv}3&EQbYfDy)L1!&-PIoCnW>8hV-w zKZEqKxIe)2Ve3BB7hp$t5j-4T0#AaM!CZJ1oC@iaai_s+;92lmxDe7u<1U6v;5v8% z+zgk&R!396fCt0d;9>Ai*azMPheGyabWefzz<jt8PJydo4SWbLgO9>j;S=z6_$1s4 z*TQe%GjR7~$d_RXd>$SHUxtI=t8g5A4W0tughlWjs8O}ea3$OVH^9%~>u@XF0>6Sg z;5V?%vBYQC8GZ)`!0+J*_#-?C{sbq&?eKQU;w<-3*bu%C8^O<D6Zjo$3V(*p;W3%C z7hx9M6^@1N;Yzp<+z9uFEYfy5z$UOWJQj9?BjF)%4D1ebVH&&@_JkU|8w%frBj8t% zzB9LHKk5T;5<CT#z=?1H%z=-=T=*O;fLmY`HtA2k3R}V{a6ecAJHj&97nZ{uI2D$` zN_akGpH24?I2}F!XTXo(Y49s}2Ha%;@fmi7vtTNm4KpG8ak>NHxv&792P+}_bGjG9 z3!#P<=fhjzrEn!&0N;UE!f)Y1xaUCPH|z@+!&BjPunb-gtKd?2F1#7u3U7fM;BxpA zycO;@i1-c%z}w*zcqd!|?}m@T74QXk4}2f4g#Ur7;5YDo_yc?hHXlqq8}0_5fSuu! za0pxrE8x>m!-dbo#qdS=INSg?z?b1G@KyLBd>u9zLcR_Ug!GNNBj8(b0^A7Cf$zZe zko`>EH{tv66ZirA5q=1Ng&)CYL#e+&jTn9gBar=1-EQz}*av<CbKtjd9{e6^Ja9X_ z5B>_@f;-@6@OSt*{1g5R8|*?kcO2;m9t#`6Lf9By1e?HXVKcZ1?gYPvJHs7t7ufQ6 z`e)#-uodh8+dvHo?hbpwJz#&x{-N&WumfBMBXB+J2s;lW-9ZiT9R!EKZg4U@1lB_K zdv&ja-QhZT7}Si?G}vf3<pn$#_Jl{m!(kuT3mylLgeSnG;EC`U7=_2eb73aD6ZVCg ztJn|z1_!`hN3f3!><x#&p>QZX9v%-*g2Q1h%z`&V`oLXHQyC4Pgk#`qa4gi!iWA|d z@Fb`)#ccQo%z?X(q@4@9!9sX4EP`clGOU91t-BgHtcF*@X>c8!0pEtF!4Kd}s8PeS zp_4_rhr7XZ-~n(p902FQv5-D`cQ!m9E`%4r#qc7iA;rt!<M49$DqH|RfmgsrqsRx~ z9&jNX2(N`F!9`Hxj5okacq5z(m%(e`P4F(b9DV>FfnUSNVDl4bFTl3&3D^Oyg`MFu za5Q`tPJ++DV)!Dw4Q_ys!PnqZ@GbZ<d>g(2--ExykKit&Nq2B}_z4^UKZB#-7B~@p z4yV8`U@iO-&VgUSJK;9?tz*VflGgq=Xl(c6+1`lo*#krN$}jBUpP4Wqw{l9fOtYG` zh}-o|z~-^P&ABkKl~H4>qS-Stm~<8sjj5cGU0a7J-Aw44k5$#&BO63ZPtX=%X2ROS zKw41|Ej7dRO9GMh1+?>}wV&g1$(zaoj+w)~eM`-pQ@vUde3Hl6$qBDk^D4q^cNw%k zjTV@h-D?oXTbPwwnOj<A7V+o{>)5~zY>S_knwo0nba#%uW+S#}fmTK_SBZ(C!Hbge zN&RxGqKS(W7#?z>7~#_N2^tvQuXxiZ$ca4xs+9?<V!jDG!5}jb`12_O0jk$0hr|SS zI!tOH@MauP&-Q;M(Rp)tv9SUF(b0iT<a7Ry+nKbQelR8`G=@lozGc=>cy5g>W%yT@ zEFBN6W@}@X=EQ`?(1hT5M*WsDCaFu776j(wEG>x%jiI98InGkKHg4~V<<|F@q^u&{ zXb+Sg{JqGNQ?+;Z=6NbqSXV)+mGY5Gb;p?wrIA`V7M=zb;4|SFklVcio(b=SXTf#Q z<=^}8Z1^Lb1zYl)=fDHt1#l?57M8*5U=3UXXTclbmGEYGBfJGZ18;>2(c9q`cn4&T zf!Qm6F9PKro+EH2)PB~hAY=Y!pMg9`>Twl#kHB-_qwsS07-Y=cc@jPhpMs2yJNU(A z%-LBFe}~UOh0{xLf4Bj5hcCmC@O8-8tn&tBY}R=TUJl=ZSHKS;V~frwQ1bz{K;>hf zL*;jJb9ldK_VY4(rR)MvPt5PMv9HcQsj>S-V_R^w3I6goHFnTb+>%c%MAMcE15=cl z#5V8Il)zYgwfWC@GeuibJ;JRuaqO*9S!^~ww8vxRAh*fDesPjnz_A?Zt|p5sE3YhN zr`FS=1>;QanaP{Pb(5N+Hw0;f+wKiCuohR1Honu#*}SMRFPR}eB4l3?FEqeq7IX|k zEhdR5>Yls5q|>zMFKV*r3WV0FCX0@r9Ml<oq;hjf4a62lqd_bOC@j?K5t3Ho8iv+{ z9b>Y(G=FC;v{rKh^N<rw-nu@Jah{ktjbvb{v3*VO!Y@E%yQcE2uugFNsXgohZ?0of zys15AZciq0#lI9sl(q*V$nfOf6Q`7UlK$LG_%qb|Um;ab=Xa=p{sWf5MhzINf{o!E z*bFX!yTBV^3-};x1z&`%;j57K0q$nFJ5*ZV19rm2?V*&(9!TzB*a4Qnj!<)YFym_d z4*7xm5M*y8SNqH!2ET+Xz;PSlmm^?ncqHr!kA_FXW8fG#5Grl6$DT>sL*Oi)$zR-a z;c)l_91S%Gi2YC9ri9se*cqM*kA)NAsW1mJ&%vCp;KEX#m%?)RF06u^U@cVG&w&ja z)0Y7mPj}9Pd%_Fg36Ob9ZXsL<&xF^&OW?KeF1Q#n?rhFMYEBq3zsa1NK`d|?zjRi@ zhu~WHJbW5{4apB(#;2U;VR!fvWSqr$6W$Hqf@|R0a07f7G7e$R7T5tb=Sz9cGVbs` zMZ?g4E9B_ZIU_O8$uElLPZ^_)PYX$driPV@N&jl@|Ka$%UuGf+XEK@{ti)~;OI*TG zr6Ur&;JBU9s*sTG?7liKul!4H+|rV<Is~#uSAXKN+&vg}g8YWt7ZTsyLP%4|%wwY} z;F5<sBj83z)!xM2QIL4<Pz7}lgk#_UI1Wk|Cqn6raw}<%E#)iv?aAC{ChCkV+U&_@ zD}Sn#)~_;UJegQADn%Jjxwng(a+jFGrkmyQG8w^SVm@k0|L+jXxPQrQ(iOqZzB%?f z6~D;66CpXLlMDO7e26}r0w}*kq5QmpJG`&h*~oV0KArolL_Zf+Mzz?S1@KzB_}6~c zMEOjtXoUMX+|ApOJc1;yz>3ePvw0;qbE&@66(%eM_p3qDLzYZ=m)t8okX<?hJlPcd zCqGcXa@)ajD7&Y^gCKFs=!3Gy%!yQ;Ncy;sJDhG5FIsb7!R;pM!z^ivR%XZT8k>qK z|7!04k&tdqF_C~IP?E<AeY-ib!ZpXpD{KW{@jx0#oW$?Pj>LErS2t8~?q71Z^deV~ zHq12}FUT)*;a>1UNcu777%9D7!t*S68RVUFIh4N_K<VdM?y!FLZD9378R48=w|?Sw zlg-2i|4P=6!nH2_$X`kNk*bsRBdsOsN9inrR34;dS6OKmE^0e6Q|2y&{w2RiXKfJ3 z|GKWh@6y?IP&&H-N@q7hS$Pwb&TfI|&(ve@gm>}03a)@p!h7H=a3y>VJ^&S$AA-NY zM<C_1slQ5>Yk00t=agF}P8P#ib?ZF8CePo&Hxt|a>;E4*U+p^w$}iG+JN~}IlRu5$ zrSs>Ybp8^Q&No2m96cJHqer9jx1e;cI=OWI9+b{$uNa+w0N>>KV@SQ+)YZ4a%{)_A zaz2A<%WQ$I;g|4G_%%Ep5)Q6({R32(T+JOm`-42h_+ctMCoxRC9G|R{9X6D0Mlj=F zi6NpSp31AlD69;z7t(|bQSmwxq3s_?iq}dr{w24C^Mc>-i*&vNc7f=@>_z)0?8kEh z>Jp=1LzoL2LHSK}$#3C{+~NKB&?DUz)I+#uC+c8QwAz&Weai~8NM}$<uI<W+VAQ|r zRz+f2C<RFs*4MS!X5$tVAFqoUo>XcZg4sw@rF?BaLbr;9S%J`eu0}wRA5{3Rf%1>^ zwhN@}G?(hi@+0xY#7Wha^LXA3&VZ^j&w+bF@&r?7R=&9x&(A~EnH3i!P<m3`S^AW2 z!)5VEWGcsoa?eT9r+*Y8jgNm8sS-6A=VvL@zx12(b7OdjCp-u@${h#8K9WPZi8Nx| zzKp-ad-n}Pwj1|x+}9<!-P<H~czJ2Gth&Z}0E5Am7!}lM)P{FT`y(58%T(G20<Y63 z5(vD$s;+^6jiu#X<+n;*{v|hR&)-I{vnRw~uG~Ew%I)aG_>pi*I-4l1p^fj|;Pr`q zRBVeS`1l`9^qLkaX7V%LQ~Wq;8s>_&EsaRMdrC3(tQxJW&f;AsZXGYfP7&(alL6Bb zR;s_;d>5P$l!M4BPHys!sZr)p6uhvBNGYQNS%jNa==Oj~zsqobf@4h6Smvz7w(@Et zlypoxD!8O0=~!{8#FOWuQ>CFo*bU+mbCysE9LsYVRDG}#dagA4_15rw4)SSGX{;8` zhon1GPod6g&RRbUE=TV2?>@*krVnd2e3|FD@C`T*QdT&N;HOY!{EzT@=-}2Rko?b- z^`vvPtIWBNH$&2~>8t7rRo3@{cf<a01*8pY&UYLOSMi(!ABI|X_XxZMJ_c`ukHfp+ z8u%!D3cd!{!B61R@F%z)HbtM$!8VZm#N8E=7rTmsDkqhfpueQNq$4t=;eEN6)Du@v zj#k>k4<Z=yujc+ArW&jGnu;VYzQ)2`FZ@ft7fxHR<370o-JAOOo1S|KclN#>)Yku2 zRD6-yF5EZN<=(2S+~P`;^R>Z<e<iy%!mEQ*g49)4KA_(UyY)YwTR(<!!zZ3w%lSK8 z2ab2^jrF?qfA<Wy&pr2k;koxq&%JfUg?RVgT&H`7ajF`HrOK86v36~}IzBGcrC-%I z6uy6Y?j^ki<zRSk=y><uQm1=I&nV+u-Rk1}f9qt^7Wg|iH^Gf^b5p1|L4Do0xr)ET zd;BUgH|1{4eOt1dwWV78F@~55uEaR3x{bnMQ4oju*49|U<(Ymn9FM!;M!DlaD7TPb z88?$>CDmc+KQetU8{zGByP0L*wrASqd;dyy@O)lfk>FsB%w!?0;ilwDSU0b6f{E5L z<u5A467m;+07U+k9sVWv%D>GJ4Df`ilTdvzXTSD@>T{IcheOH>r#DpI+7HT~^Z^-t ztl(WZ4?3Ust&q=#chs#9g~ea@g!pySM0H3y1gmWUnqSqwyu7j?K`AOo`eK4hx{E+x zckz883uVB&<X-8c4bK;Pvf=noei#9}z)`RdJORr3age%>IjdIn*9kmR&Y8Yb=_Hru zmtY>GedQFu&9D%X9vs?5F1j>*ssms(&(havP-W3l%B65S;nJOyhf;pSJL}eKZo%Z5 zs%q71s*HX&VcfssqMN_5Gq3#9|F-dWqON`Qbuy-kjXJyXw|$<Rp!Ji9OKL80sXmkn zBi!0!&y+WcpBV^jxT)vIj0j7kR#aevGJCR-%a@7r#F)QNBYM5j5SIo-a-e6N9UzAn zm-W{Ga<tNn+!paN!p(pP8yK2HaplDE!8dZv*a});@xzTZ6(MUf1M@odY5>1u1~rBS zV!ptl;6+yOqCjr4zo8#iinETDMf|YpiemzywZ;=q2*h%vv0KiJr2yY<^D4eyFr6<y zYRrEOL-0i{ye-97LV=t^UT8NB5#v8)7{F;}Ba582kWZJJPgN0)`!Z<zwYMRm-*Oa3 zm6kI3yM-seh&Zhfy%Y|G>hD)%QGfrHa0$E)-U45Pw?f*@&TUZ1`F3~?yaR59)cM?o z*u4Vkw^u^NhWp@Xct6w{=m#O|l%0p*O!zQlov`y5WIe9)6l_LJS_d=WGq4X_4+p?! z;ZXP<ya<wSnlpGeL)IIbHQ_(N&w1voJm(A80G)pgkAUC7W8n|*0{A0jy`J+cyaN6P zuYrvl(x!zw!!IFvbN_&?V7n%aD?!$anKj}^!FD{euFIUC@d4Di8K<K2&afDEfmgx< zVH*-=ceo!+g~vhK7VcVj1Y{n(IeVD-?+#;0t^)p8*bVlF%nx@4!E!hhGJn|_0Y8GH zAoG14bnYGm8G~{Q;CNUJPlC$JRuN|5c5XY|w>$4z!n^9u%jhzXR+_xbWMxH|_OCYn zAEt7xLcv9nn0+Z@n1|FBiFKT9IX`$Af3~HPXlLF;xP$CV`>9Cal_Y9E4mGYb*-t8O z?5|WswFQx~Uz5+M+1WLCSy)_Yvu5)yKE+*tncIkvTuQ95T(Ky(q|gqPC?zTl*_@-a zxWMdUX3}uHO$T5LOJ#NW10~kYcE=XK+3fjabfw*tcmT#d(SRx)_iSqpsy8&Z&XR?W z!c1xV82;WtnCi+UjCY4oxHl|>2f|4(18V<((_jU>7&7O;RUdmbTmoz04N&_B+z)3! z+I!9!@I9z~13rR`W12ol<|?>N`RzHdGn@;%K*l#+wJFboXTuAj%6080@G)EjNr%o7 zsJ0*FtGg#$29<Z*42kb%KLOmX;Baxf*-v0GyoYB65$A}xo8Tj`C5nC$rog9QPq-H9 zOtGh-<~@7}v*CZ>+3;gH7jA~E?KbQEmq5m2%{kv&A#13eui!ek4So#2g$h`$|7UHp zS^s|sdBm?g_l3X1<Du67S3x>wT+Tmq8o^6pW4IBL-?_iQ=CCb!$IfsvWG;t09kzvw z;I42LYzLJ__k~K!uX2a$CHtV)!;tR|S0<)qv-_kuGgE~}7F%K4uG~zF`xiNhfBnTV zflB1#F_)OgHC~p3l<l!etrZp3rk0|t!X^}ZoM1)pJcEXXO_O#*Q9g*Z!-rtZzvL&y zb^eie*=s3li{;Oo;3RkpRNe1ZNMD4*7`BO<_d@Ba4|WU=wa>prr#*ScdQRuw`gEmj zLu;y|Lsf?%OEITvs<ym@5B)1yYb$v5R*LixXx;dBHS(y@4-1dv{WUQ`>|i%*!rO25 z<-i1MhE(I&h`{QY5R5rWRm85mvdXLply9G>o99~I+rX$YQ(^SCeP%wN+2orEDaNGq zZ@<)THMZYz6Egpj?i42K1AE;Qu0_|<=O=J1{1mEgu^C<kKZ6g#E%0slIs6S$&YJmG zU%^8NC#^G2hudHo{0`m-e}I(#PJ<?tX{7tcki5xh0!brgeR)@?_2u`$mhf5F3Qi=Q zk;dF=xI26i_iLT`D{yc48r%meuBh&x8Hy`E^W9+HeE?V07gs83s*18IqtgbKL~Vbt zqJe+KMG~*dznoX9@~fO#!{6Zuqhz)od15kCp{O`vqX2vBS7)V~ioW874KgFN8})2L z7~y8NkPe<R27B>5ImIMWJ60<zix7G#7aw?5RwN43O#GXN(Ed(B{M(n$7w{^=J+eVf zRbrCS459^um9Bh#ThGdS<DaiaxBjyq=i>We6$XlP>PzwaVX1?;3YWf+xdUdceiRPm z`6f67sw~r5{b%9vP-WRL_yN>feT8`zY}|mhBvc$c8R|E3pxjUZ=fNVl2$D~`FTqmy zCY%cY1FK;d{5b<^UeHXK4`;*aa4x(G&V#D|o)1^Ri{NTFAAS$7fSSX14P;*wvv&SG zcmvOi;Vtk%co$UJq&4#m(T~>1H-^m3aeG0njn9GWU=e&8&V<iG_M>o^yW_5a8{i{Q zYvkD{!mN>(ULNHR*B6=N#QbN|598eTS82gCP?TA^nD(#c{vQOAJ<~|B%ufgN`8%8r zRC`*8+(tU)ZdBTdbV>18k!q`Fy&{<{PE5a;qPKs^{fbBG2b<st-^1VX(<aytY7c;M z@KZPyYOTNOO3ZO`H^3j^*HCNw8)Dyf$oQC9<1f86;_vYJkS7vO?Rhr}-d~^Iyz<67 z685kAWt4GbVqsWeDp-afw^_S4*pw9ryuqgNfxsJV$_WGvHmNv~(!5bh^Q?ff&$jH2 z1Rt<7q<*w>OyC_Bta|Gvbm3ppfpp&+!Rwy9Ra4rIJTq_1%=c{r6}G#><KdoA<w<*( z4flaHa6dQ){y+BK1kT5*{U1ML#JEw0v6I0l`@WXSn8i$t8M9bIA7d6X%w`r$lo3f% zA+khKJP27sq7;>oB#Nj=q(VfcBLDYwo$EfIdp<Kg-zW6_{a(NS^XaAYp7*)#vtH*q z>wWIq;ZBBI7w&ercfh6fo`!I#pJ@vBB-|Eo&%>qr4yfO01@|i4)^N)pE$!gaSff2$ ztih=ca9hB=8*X>F_rM(jw+mdd4Iywx!VQD_DBN(km|v^=;XVVG?m>7FZcn(F535MH znAfT(xR}rKy$C1a_Qu~{X!8%iEd>|z#{yrt@o?+HO@!MNF5QdJ1#U9ju5gFIjetw{ zBDmlVgF75<8eEL+RTkW5;AX=mTayQuYz^Iu@D|*M;qHR_2;48>j)i*+ZUNjM;f{xU z3+ihE+^TRNgIgW$6L4vK{Ult{<*9IOTj6<5_%`IPG0K?Am+r)oUjp8XKtoP&eBhDv z)BZVZ1css1Jq?0ap|b;p^;0ilk$#e5&}#??o4;^E#-lAb-4^s21A97FvYwH3+KK{* z+doSGY%IpodMpJ&Kj>xw<q7tpfYx^Ifg1xCb20w5br-laCJls3$q9zL3T`Oe58<M} z;xirh!~Ft(L&pn#go`!If=h6F!lm+@hku^snF`LrzXbf-Ra|+}3Ag`YIhV5E1<yOP z@0_^yf?q}a!;gyIA8w(dcg{)4%-BCl8<iEBw;89STzJ1B7A}Pen_5r@Za=soaAAK7 zC@&Afr97wOpXVBOU2qg8J-55KJnIQH*-A*5UtuMpOp~`W(~kb3rFjf?1eo#x)mCKD z=!Z0-S@0POPJfc5cN{p+GY`*!yA}VY;@_U)(o5q+OenaT{2^rjil&&7<xDZnvB)%P zZPwrMFl&E(?Qq~y8YmAGB(00mZy3@{=}Lp!9Bu|&)B~R_><>2^e-DM51DDnb5DD*1 zLx;I;#)I?RBXZ{T!@tUFXzHjWy%Xn;Anf0D=k_Or@IU2sG}26Y9Rrv0`UqUg>sYvy z*GJ(}UXdrx>jbz|U+7ObuPB=$drMouQQO;qe{`>x{M@!I3)k*nSG8(Iq<p2=p~9v3 zs17Mkv=jbed5YW96u7s8c^Ymw+-KlMz?}v+8Sb-if%)9yOt_eT6)cB42QH<5E?jDF zS@`F<7kmsH#rZk@ee@UkbXO^<sQoKirCs3VRA75t@66{h$av;+A<{=_cnL1$a}iw1 z=VG`~aF@cRe7*vABHWd5pMwiK%j2^(a4G%k;8H$|Yp1kELOMb=eqV9<#EGxyBwVfj z??++9nNw<~VF+6HMs(w?!`3+SPHFJW`x{6zr3>|6&;{<Ba4FB*;6ks}+i;=3Y6sjU zaNmbZy7B?sYjAhNr96EIm+}r>C}N|~4q)8*+==?QxV+<ZxXHUe1nr-X4HO-vr@WH_ zIIGyUQSQ7G(*;r<R*UqV@@4-hO;i@8;RXwN5P6_<ehRlf+(U4C!aWR^o;?aT5ia^s zUjO+LF6H@Q{A=SehaV1($`y7{?Jq9RXumgLlXZUa@hoRulM>iJil6dV3T|g1Pa?gP zrc-c9&ric8J^v1Fcep>mrSxK2!}+=u_3Ak$*bS}`WUzOlJ}E9=*_rYg-a(MEe?==Y z3trBOq{<xyPFI`mWQi*<Tuw@AvR>w+{AfA%M|peKqv2H=zK@RWTxY*U?SbYlZOubG zspAXgodc0I@K?wbes+V>VY)x^L7gAzk%$qZcTc#SYXe_m2Jg_L{HTn6hT945?{K@o z{R3_Y+^cZo;G+E$6u?DzJh#C5HlNQe4HveC#<9G<SQhRF_`4k3y>Rb@3mxUN3D7~+ z2!B(Wn!~l=wuI{kw-wx4a9hKrHLiAWL*cfE8wIxm+`(`=!cB!sd;R%v?}j@SF4i#% zmcYFS?i#q5%NA^admr2jh&LVoJjYKpz>&^X!@mQ?=|@5uzPH4h4+--tsvs5M=Ts1f zO>1c$)9*o(o_m7}5Iz{`qcnuTrF0<AoZhE_J=YhAyAA&);or8x>7|ux`V>07U&tHF zdTZSulJ>7~vT3h|(zdoP>7xBO@AGy9O(w<hdFkT&VM<R55>Nfn0Q{q02K0o|m<hKk z+-$h_!Oeji1a}17UT{ak9S%1i?n7|#uV6gfF>on=uv1(PYk@t-k<bx7k4@`QZ~sL( z&<EH4hyIC*pbLWcC<6O!r(`Y}`m7B;q)4x)lYA89J<7)O2!gw;vLI~#D9uz>WkHZ# zrr$*5(GTu)xDDYx3%42EnQ;5SrLhUw{<(0eKbr@42i*B^OCY=#;L_UM0=QHb%ixl( zj|Xn$VdLAD(0vE?Vb%7+WtNyp=S;Q26yS0D=TI1r1*u{`QaTmSJzJO5hR>(cBJFHY zx?R{`t)$(?1;nyo;RCQ_LYKl%ucYXMr(_LRgY!qxIlt~mm9&Xu@lUI-EDTX4H8mbt znK`MvGhtU!9?Peq$?Hu4fBk%X4)0(FW)I;lNot&0QX6-t?Ir$U6fk}i7d4jYCNtEI z(96l8CbGYjNc%^1KsrEmzCuVkGad|F7j7KfdT=R<25<}DlKtEWm(F%=huZ`$`aV9V z9e`xCz~8iPM|Ly_F4<2?9@)v4;F5hLyH9p-AKWf*kHLj(!B23>{`?A;>`qCf?|!)S z{$_W$q)SWT*V03ma4#sY`EP@}!&8?+@rh7wc<1r7{VS?U$KYij>!JRju$s^wun$<R z3g#=c6`WK*?kcN+axC-l2SiE9{K2pEr8o+Ida)i=JpBAQ{>026?1i(6#HaN@hm4_J zBE~}aWG4Kza_K`wGtA#Z`IUr8_}d@<X!|{k^GrQ4W*_ntw(GfXo&ZLx5_RsBuP`uv z_2@}VQ*)q1-bkkYQHKTfp`YD+{DJjYAsk-<B^Fjd;-C>kZw$k2g(H1~9+)516X_cn zEYcPF#i3ri!5skiLAV3qQu-c*TL9Mu_bA*!aA{11KDPk6!)L?rj7q}axp0%=?u45H z_d~ct;U0!N4DNZj>2N74nQ&`+qaT3V5pEvbV7OQxEJ%WjJ%oZWaM70+JOXzNTzdB& zI$W>;?pU~Qz<m_%0l2Vj1@%h8cEarhcM@EBZ}$nf)8S5mi@i?u4BP{7r@|e9a+n2o zJlr{Ov3J1l^{#>YJpLv<zYA&hw3*T1sIB&Z`>v;+^Os;*(W4+@{~U@gvw%VHs?61` zKmJBlm;$b_!jqlL0;^TU{h?V>#fFC0sz~Nd%ME2~<!}Dh*Hw^`1sHBH?g3$Q*V0f3 zJ~Ar_F9qXEwodii0SOvY<45aTWZE`YB=sAalsY6u4_3Q?)a?SFa5I{x$C?H3vwu`} zq<a|dusrdLQPxzR%i!J#cLiJ;bFPFN4tEt?iXY=Qp2w|+i#|?mgu4yyCb$(5?wfF7 z_taZ(+roVZF4fU?xKx+%_hSuQmG)g-0q?P>s2Eppcu=e>JT|aLc#tcwXSW_9I1*FZ zcV#Wes@PVp*vRf7JzcT=qC#9fBYTG6Ee-AI<>49Fvmb{`50>!oi;0a6@7WFdpda=2 z@D7ZQ4(w+FF6rUhJ)|F}=y3$hk%oqc^a$1|>KYl@L*0&G$&+Jsc!u|k4e1sV&C!xS zN9*tp4euKgjCDKxG)L>{>*9N5sJJMATPS4?5y=*n2zi(C@OCD=w1;2Uu91CB!hJkE zBO+YvUrz$IJp4J~E?sI>Arnh;7Lvg=Ik@{LhWEOtu*rjqOnZdk_@qmpMxrVvUoI1e zFLx1CpcDNm%)rnHSMR_caUr_69rZ~5UY`Cv10zCM3COpEr>`#WIuf|Ir?<1Z==qYK z0$kZt7vy`3r*C-A;E=xR4tTp@P)b0v<MT$jLb9`6aT)r%;-RT&Nv=@3Z6g;}U(1zp z$c1O1&q+;mVW5*ouV<--B2?NTgqP3Kv#?VSe|(xgG$}qeFFOf~%sRLQ4oNziAI~Yk z=?K!Yen^)tQj}vzV1z3sHZV3W2F)ruB2cR_iRe--ED{nK#M(msx?DZ|-OuZS_4E(r zHZ&6@r<0(Ybzn?T2+B>j5%Rp1i&c9DhuFT9dh+#k_~N;su)yeu5VY-}7|tMx_!Slj zjqDj~i;!B8NaeyJ-9w^#1_#Clav_p`m7@Mpf#K0HMxbh8f!OH4pzaik$zlzM0HuIi z6Ez45{&t6FcuY`uFi9X$+P9v=w|f-QqUnG_bYH_aD8%>UN}@;_I(W%{Oh{}D>mB(w zbNE9IqGO$9=`WGC@)R;fWmib+;v{rok@29I+We(ROH*m>JZ0QPYL{9^hltzPF17nr zPZ!w=R-70%<rH^!$3t;FyZ4Oj(-VH>d^5NuDE#7+(_O=o@?E*{7yxkV?TZ0l$%3r( z%!JTbSGOMhqQYFE)IefgL6H$rkul-1A?Vmk`_@6{i;;OOH}S|}DEacfr`Zq^k6Ui^ zmsfF3L2_P30^J=}-Z#<sXXO;*-N|@UvT!8<j<3qowea+G<DJ{el|V1DBw&!4la#}8 zFEhRrcOuS_;tS34bR9hX5&B#G%gQ0kl%AQG2YbXpKyl0aPB8%>aa<mbxNAE-3#E+m zMc<jwKcvjQox#p_Y2Oowx@194>d+i2uAV`W!RU=$G53eZaNnrC{rv|Iae7BZ2eB#F zzU_vj4tDx>4e!=Yk)BG}8Sx{X-hBdl#>An=rzWo@;!`q*IwkIp3=8bamC_Aer%8O_ za=R0Gd)<sJ?NZ0GUk2`(OVnlO%1%m94T=>^8ij#e?*Ay3fEO+@(;Z@W6dM|@cA+|T z$ORyG{h`X<Dk!uy>!IC+IJ+8Zt0Yybh?MDQsMjKq(nh5CZib4J<a~^r9bqiDp9bPz zv4}t4*<yEocDe(Kh|%V^D-6Yp#%M>@#Yjcw<+>u1T@gv?nc4YRJl2VcGyZmBVsbI9 zOn31xnim+Td!%$fYD6(c!8U&6h@@=XMm3TZjRY3B1)RMnDH?e%bbIsjaX81V1E66L zNxWnv!iV6ZE_W^#84q0)v6-2!uBk&X_{Ts94`R}fI_#O3J~$~`Z&UHe3O-&=AH49v zwx1p;;qagxyy^&Qn0bIkQjz>dNo=O^(vN7b9;q30Q-%FhNe)eW1?fvHC<Q;l%(YOs zJuD%~1*^nOpA$_UEyV*CM>ibq#>l6Y_+;haJo^Ykw>EU<;GsEq|3yd8M(EsD5{&I} zw~3(jVE&r6?a|roLCZRHFjNP1kJ|%$Qa0_4l=HpAv~g|x*bCp^P2%n#mCK*%AQ`O{ zYl_kxkkO?@4*i3lE{3$E5lL7ZAf>2lcLI^o;UPUSoC=S`TqQa#gyt)Xx<HcfqHe+| zfo>!=CMY^QDi+HSrG0<(rx-G`Tp5`e^xa9#lprQ0XYfcYD{H1CF;2pd2z=8TqaH0$ zg@^>)aYLVC=WdF^u10J&Zhy<pFk#gs4wpi40VJ9NfQ^gK9+HFWKk1|GRH!LNqq?PJ z=Hzy@Ur*OQTA|p7UbCg@p$BYbO3fB|N+5Y?%Rz5+k$5FxE3od#yRS6lAyI!O-7lC@ zVzMag0&D<#Q)>wi3UyI1G?^eDZ}?2QX8TCY6kIYqwQY+C?Ca`^`9usqMEorr4e^n& zVIk4llO9Tk=OE)5hUtNRC;|MoLcA*^xEn&Gd00F=srSbPs_BW*Au%D*y+eXsEx7@Z zpO@_y784s1VIC=A)8-Mnep3hMZTt1+N2rJ?q>_e?i0mDLj|STwx7Z%hJ;HlBJxbXg zVICf(ZI9mKK{kQn@UcCjql4m*6U1VBm9f2odPK&AL<Po%v9{1tmhlSg(IY0VYcyLd z@+oWkM2E!2VZ2QBPkcF>$B3VGnaJ`s85Yx(?*G%Gx7w_X|Bc6Owny(6Jr%RduY&E- zwFjQzdZ*xhZQ2xhs}3fxinb?LQ&@z_TP5QGeTWE*>27@dY@eW>u^2AG$4+u(+b7zi zrmEN;VICe;Z4a(;L~pBBHQPhi2UVBxt8V;==K3<VRm1k{-P^MwYua96VYU~Ixv7Y1 z*<K-iV`-We+%p1|X=^}j+cyZ++>Ptm_PX8n>TSZbz3SLrVJ0P%xq*mIx0|G#gy6{7 zn2;c{rK~yRr`rwuxJ23*UN;=@Tv2UUqexyi8t{RravH7^shbSQ$Y>*|TMM|Jk+H0L zB&b^o$e578AS0@q39()KaH*51ZXzI!8g(=e=r#hsz^*Zd)UAWa;9x`QhCxBcbv2}J z6(EDdd$Zb7e7aSDH1XjhD%6h1Q#THH_6+G}a;+N%$dFz<&LKhFCcshMvEAePv%}GC z1Kv@QQKnFIn*bRc4VG*!g`^t<Sa*6lne^y3LE*&38d5h0kljLJO+D(S05Uu@q(@AM z;dM)(;8Bs05hf7b5Wq*o^)PACEr5h=!`r%@Nxp6Z@Qmpd?M{r=ez3u~Yn(bM%9GZ6 zkRg48!q^TItMwhMHZQiY)^*U)kv-f=(P~btofLf2$1XE}ZUcopTk}kaqN!_pV!n<B z8I55Dh6!ZM$hV&D8y4CF%T0D7>f1E4)O(R|fX%XSD-%cqn<r^^vhJ{HcbYpQSw6l$ zU`mV;Of+^hFs1C8nv0ucU7?uOB1b;HN3|~x-J_F+=OyLjx?=OQl3@RQc;FQk6Nvd{ zOj7oU)P$sH%$9D0$B*(<R(ysFMeF1Hoo6Jm6cEQ!1K#wh#Hg4sSGTmx!PuE`^-LPc zepTT2xqh@qYEEuX%#aX;3)=7Fd&(UL%iapk5ii=XkMEm>qK!_%7QG4gcElOm$`urW zsdkV|wX5M78clj;%Ej5G$s$V1{RCy#ACJ5s(InA~0flI8{p83fu_4v@QLMcNj!MmO zp|X5@r|YNmjDb^t?#9RWY@sw`^%QrLySP*zaXi4H6C8vq7{g1BkE$)cP$1EqF!rnj z&wPwpW3l`ZpOY0GpD~1{F+RQv<q10v-Ef+rYvw2uBHdhJGLKPoPrT*Bo|NWg9uMo> zkct$S8`g*vk4GG7B&~eAPzIoq5vY5Pk3#j)zO0od-{e6XdPrp`O=yfqb$G;}0=o5e zg=4!NH!=su=f<-lk%GA^9P=#9_-NulnR=s85^R<9g-_wyWZf9!QKlyJT8^Yj17g+u zvMA5bQ0?u)k_vKxEYl)RFq%qsUIM)aM_DW{52j`2y0b{>{YEQv7|obydYr+<MVY6y zB@b06)g{H;qeHV>7h8mq5O=ml3MYpXNAY{<C%A~iarYj_LaC+&E?TC8%F@!7`>8tc zq?fpz>VrxMr}w1I)8llox;5a9HOxhIeN)!rbnQ{w;VV7dsd-O7Cf1AN)UE5Fvox6J zHgqo)MQaxq5@+^%ryTT*4rH|9RFN9)EL0QNu`W~<iyfIVML~^ek)+CQOiul!V3#@` z3_@da7X{_Ek$yTjX>i_<u*}S1Zae9X`Kntn-0Dh7c?L;EB}Zkaj)>1q!a&Z)H`tL` z*f_jw#~GtqjL>n&VoG=>dr;(o&S#7k(Ichm>SYYvnZ^q&MqO!v5HWYnOT{-BoE6Vc zNkp{vW6Fp$Z?E<s&Et?Nfa|8Yh<F_P8O26&wnR!521`w9dj|yjqSk^!L(w+$N@yru zqAQkEE`j9|sON}1CMgXs%W_6ZBSW-Tct%1tZ@9##IaHS7xVxwTj3P%u_Jaee3px6} zF)9Uh?CKexj(r=v`_Gs8>UtxKyI*oa%0)Thv}IN1=fdK1Qd~Vy&3RcIB$*`o#4lwp zBm>#Q0VvA0ANaHWrXdIMx+0sB97jMwcsJN?IiwYZOBq8$A79%3rfD=+BF17qzLStV zRG=N3>EBD;u3L2Xr0fiu)pI>jI&N|5FZG=qOuSS|Ox|F+S)Qe-SKg@$vMah1PH!DY zrHD!7oKt$&JM1VjO{rS~3gsJx`>k_xVGdFDnBV#MPS&ZGs90M*r^YO;Th}H_J^-5b zqP4Q{xaOj6*kZ+C_A}zsIKk9z&QLI|w2^QX9yNR<HAAg7ht4BoG(yIY7U&Bpq}WU@ z@hVdNU3ry@(*C)-B4ctB*%JS%DZQ=<TTkPtTuhsgbu{!gt=ag~SyNMYdOcB(O(M00 zgjtPF8j_ls!3m=w5UuSa??sF<1;0vH1eK@@(+eNp`iL((hni|GNB5!RDl}L(9uw-9 zT%x4PXz)m$?lxW6fkM}fhaBc0i0(mm@w@#wx<!x@x^zAFz{dh`5l=lZ8yz~uA5F-} zr9vkAz}i9SOLuEJYtmnIIXuAFsAGu1h}K1`p%F<iD%_7@n&snrjLan#?qcW-c32)t zw5>VROmj@6y>vjNDy&Vz+=;;E5|`VTy6#wnY+GT4(>3(GE^M|RG3dOxEJ?q|>Kd|5 z*#oppNSPh)R#8sk!**rpwiTS3Kw+@nujM2Lxx#RUDoHm}s{6k%%&c0&@dyS)`Ya9E zsQEe>yw=ZYqlTWZ6AkTwWuv-geeSPW-RZJnS}tkhj*Oos{W|VwM_gY4qHyS=5EhRT zS(vhmA|ze!nvc$l(z8QnUk`#Pqf}PK6e5q+9(NS3D=0H7pKFh*;!a7cbj4hfv>Apr z!C7?}ed@Uf>dMx7>FSo5o5@lf9O-RSGmwXlavN!_BjB+pw**)c){_>JrlgD{C?40- zixN6U-Ldgx)wODT1UpN{!+xASD7!g!;?bvNCg|2fo$5>-4s|!~`toc<)Ow^LnMOof z(FnOm`*i9XM@aR36@I+ciY<X*WcE4PeZ_uZi-v9;r^=uS%tW1vkWonq7#ZbaLcpcF zLlUhglx7r8!ADD3@fHq8N*(Af%{qHxcVpF)J=*yoyQg<B^a!t{l$v`~$f;WHj00n5 zlra@$U8%UdwA@rz1gDMLfunQMg2jv|S;c<TZJcI*y6@%m(~xPSD8I8rb;aiD5{em| zn#=XXJu9VVla#0)*5nMMBBi1zqf?1$b78E((-l-y8tgM`AXVR$nuV$_$R6%co1yd6 zR7`fT+_9X~w%VRtvu@JIUP$A5$MEM~=-HC;tUbKrQhUW2AZ`VtbW(Rm+o}#7qQvPj zIkjXwqedn``_PNf<bO2EhX+W!M&OFdp)%Csq!j78!U7AccrhiU>u00XZ{A=wrCbXX zOn}saF|eiwr4k9Hy)|kf??cSdJ7ExnO<eAsbP<!y*ig7axfEMEN`gv(jKyDfF}f!_ zCE?g3<G{p37^jTf%sf3xW@EY<I)c&(%1q0Id8NU@rb0>Nm`Z?hPRV#qn5nHCS=!&A z6tHO8n$zeupC51qCT0$%Gh2!HM<?lZuSOl-C9Tf(m=9SpCAn2w-e9)U%+j2tqE<~( zOHxmcN*7rGeBUgTW<A*`oL912bo>H&<tmc>Vm*9%O)8ZpwS}x8)oh;j)H}nR9<s!w zWe6)SCM6S>FHj*k#*QxTLe@E=<L9W-lB6QVnAz=z^pPKWLaTOYYEoJvKSZS!E9ukA zTtV^pxC_aXvJ@VM>gBE}j)*;0gQ$VvEqFB|-j#--4fmeSP<YfDxlB1uYLIm551Pse zVZ%WQ87_v<PB!<<bVdZ(FFJrScAsJ`;r8c_%S%T0G=L7zNX|47``E@oFO+C&`@2>O zhmqz%ihCHP#h%m_FDx@VRS!n=(v=KkabON3TUs*PQCMH7WjGokWj{z#VUIo8l$_Ud zEn5lE3{r<=Xe}hIzgF1P(VQ#>8>a4sgd<Y<tbx>-m`pz}bzo*LWag$i>k*OC6ow5k zl_zpa3fLnPFR0Mpj?pyR&SJ*uJo0o8>RI1b>1vM6#HS58HPof-^T-GrST+~mVf0CJ z8E%~1-(JuGkj>9=1!iTXxy{0Dl3mIaYZ{%)rKd4=bahY4$HF4Two3ADOed#<I-6eZ z{z%VlV{-GcB*lG|hb1*t2$iMPV`{l`v^GS<kBZ99OvVXG?xCCMQtgpCI6FQ&pW|u- z;oIDC(V#*4J(^aBCyqjwou$L2dMR$vh9jl<$2WFslJ$rpCY~xQPpk)wjZ?8GHnMI` z#iC}{wUWCn>bVq0M_u_cokuP^8oMJu+#GA@T=EPPsuP$vf<Ex04KV4q$9zu@7>XIC zXp7=kI5ZlX!JKm<$gmdEPrLNMTtBDRd1y4mEUgtm4P>o|QcRgFb`@8T_$Q#Z;N!aS zn8NCSb+)5$Y9J>eI~6yj(U9=0yM1D<o0CUX>+P;u8d?8U)lyE1S^CiZJ{^joo?Op* z$soFT0Z&W<)f}R9Rvc+c|G%*IY`RmRDJTXUhoV&^`f8AmujfpLo3=FBPz)QnX&2Lv zVL!&l_e&4eD?0b3eo737J_tl{PSLj2G(R2%%+Vz24^<Ei4BAR%VuDT-HP9$${W{k8 zs96_UQZ;LDq_ai09$c)m-`Y!AdZZRXgJnHd)`inhN|P2ckOFP;uN4}QGEJGHGUJg~ ztM<W}xvkoBpJTcEAot=m)l&pY&dk60HA<Y6A~Qk-hMMQDo=q)<eGSs2j`qS7tM3?H z6kLjW{>EvcvCChr&gcxh;V6Dtkf34fSLlFX-(_pdg$|lLIZRU2h3*Ex>wY|dpw!M6 zkDwm0dKlt4iRL_w)4Ipg0ygaRkqQ@PdFZY%ZYJy5o65wjt0H0^dXID~LE)hi4MsdF zh_!sAPLC*(ZqIai3i2k0?dVC5VGk!D0?ig{1RfKt1f2lAVMCh~bhOsTx176;v-zg2 z7Ph54#n85ZbZ@BhaapXO1SCj*Z!cie7>^E{A(_}u!+s7|^0&^;uJDp}1t}OBLsCt# z`cTL-MQin}D2uaJWW|KbHbYkmttPV?QJ=@bP<50Q1H|j5M$KzFngpu=waP>tjy>+D zAlQ$(r!|fyAXD`4oZzJ7cr-Sn@x72u8WD2G&23p%BClrgkcJaLMnU!jc=Uv&v<9H! z<Y{|CO2Z}2kINo5vc}EOsf77M=gJ0#t}{b<_r^LoO-3jy#qS-ta6l8Y4!5<J3>3Qp zPIW-v9Hk7&+AzoVxK=_c1WEuYQ7N|)Q5EV5Fm=ctO0-`m)U<VK9Ap@>G|$@sT$ofs zFYB`F8XU@nMvZqbl7smahD=z8k`~T-kz!Y8UUD)kCpXr05VwcoTq?!S2XxzV3@xx~ zOO<y&HDr5n5%zQ#Cyn~cKj1^ff-LHFTWv8sCZJmNqnx3*$9WV?xXw0~I@2*sqNONK zwsUI9CH|@|343Htk9N~-+_5pLXnZaksb<H^g?^G+gKo#vHZdYn_yS>KDh{OU)#5oi z6|}f%EE8LxJGG+O&4FvmPYT+Mw<*j*>ErfZ`~Z}zirxi7rSQO64+p4~dbUShCt11& z(UV~A!l&vq*?qrh&w*|Y)LZp5GLq6@yXKhql45%d-?_evU0>9TQ@R4&qb9w)b-|yr zVo%1o@|HNV$14|C+^r1*oj&|xptMxhC(^XyjwrbJ=?_SIOlN|H0gt5!Dm%{^ryfE! z(IurvRx}J}Rif&LsffzW4yI`=)!q!<p7mIhD>+;%m(gyXHw@MNsxC*?3ESXsHpu97 zFQk;*_PK&+<WA!X+?ke<39X|h|BNnD_c|zbGDRDN9z+&h$<#xDM^FJYpwMYIW}<8% zjh4M`O2pHWRcdLZAXUZgP(Kxzi{s-doEI`R^lAomwR$t3*Sxi59j40_#<_4`b0;3U zSBK}AZDR#XIwiCDNVcuej;U6r0|=LFiZnMKcNH^9(ZVOR<`o(oBuY=rHN@GwsC7|K zF)3%%o9Q9rzu87*jsF?hhwY$dE{hD@{Q65G-BS=f0iqZBY1C-%l$xqI=njX!cg-H8 zb%pvYHaCTb$$DpNyw(ynjZ|)*>H-#v$y30g61Ck&>ZKKqhnm)(Xnq(B@oFq48<>+) zr$x<%UV^7Ib2ZYU0_&ycDjE+k#%X2fruPJ}wu8+A=ukFyD&2G`+r743&K$={{h;)f zNEGMv1$UuP;c`_Mvt8;^WYYibGCQYkxYkJ9Cc=n|%2SCg*KygyGg9qhcCK{)<*`_* zZE&G(n02G*hA}6@vB(2M=V5OP@2cqN=p`UDG249Vd10tFGoiug-)ZBY7u2~`Qf}VS zkH{JX7k}~lYr60K1#=w4V9y0)37hL+mewrl99dUrHuD$bKNnsy^zj|(QOZ=O<}?-0 z&Wg4H)`6#VOugx|2fWe8)%udoCl8mTa`gHR=apK>n>w%B0&(jrW?z?$dTICAlvIpT zJ6K0b!P8KQmdjbsIdmF86m7{I#p^m!y-uaK`nZ#rDVCPIZPtRKTk7127B|1r3s1)j z8#wOE9E*ok0rak(!v^xGg-77jUVm^dp>drNI}5Fk)<pR960>C3YwOC=tUDO0CRj$t zkutrJLL-7v2p+mZ=Q=nT;)0|~^~o099;P}Y<T5Mfgbi0qp)%7Q*~LPWZWnJFQ_uOK zv#xP=flqA0zR++zsA#8RcRsS;#+6EiQDmc%({Zj)q^y&Zr8;pLhAatCpX@C?2$@?h z1L`xg6qgIBJJ)-W>8)<ep2Iqhxp4XMnv7$bjaLtRd|Oh^!*Rg?m3QGidL3|{E^oFc zregN#GLg*yy=`+vm!Y%s<vodHy%eKI3`LeUb$>cbhlgnnw-P;Y`}g5-)fdyfF<*3( zQ!l6^8a7D0`9az^TQp22xtu}biy3}!H&NWCB^RBCG3DYfY~wg#ha{t@VJsu?(Fz_a zM5Do&xen=*9x70GQQYD?2VZDYUF$c!S%pS~4{PFG_;`BHPv?7~G;Hq3sarmv)4`=} zCq&!q;?JmX9t*FnY4!LCA=41h9;xt{AgPe`3&}`y+dfjWJa<#ipmh)`@M8Anc|5R3 z+61c-oe`jRR%HIi%Wy*q#Yz|BxT7VT{BO3f^mbaZwp!AWV|Izg$!)t8o}N?{3r#_I zeK9B-C#o}Il5ojSQVgzJOGt^qR+{4k8NXghJqVo(qS{DK&PmdHZLvCudijcqqHx!t z8$&PANoif&UF8-^T8@j%f&2I)btpx;Ijs>z2a;MNnmZJq3)*uxjSHHtqrmis?KnCy zoG~Gj^cbF{c|C29P}FqygIVU*b4uDX_S{kM-0C3ZE~Y)`bbC&p&@#E99MS!@J)}Ty zMSU#q5TR_TxG_uQF0;^Bl^btyO3%tilOsH7&*tgm0542`p(CS(Amm=Z;B1CVtQmAB zimEw>8gwpC)Kc_AdH|-EvYqoy%JnR5+GzUVp7PW9imq^@F>zO3N8weeBd7vrpUkUw zh4+Z54vN&2p1=C(dAVI&&ZTL#b@XVF#Tz|UZGniXR&^)N>QH2xl3C9qM|$c2ouD%9 znwd%0u9~g&i1-97A7$e3rdcJV)n9w{hxZDoFI?)-PyYG<wfl2Y7W(`JsRW67cBZV8 zzZOb8=amZhywEb+CR3OoG1(Is{h|gH%q8RjdT!S^#YeSQ%qp7h+=?VmTh!uD4mro{ zvJ2xFvs3g%wwq)Cq?JduGO1{T^pL9X9E-C|g*M4)7MUe`JG!t9HU(6;XXlQ%@K#aL z6%?{#9_v3`1x2@>xCQ@GXhDWnDY+$4M*eF2srOqgG%Qj`TG!@NR-9-WZc_WDW}_F^ zX@?J=bk}<?9@Ba~$@$AUE87to61h?{2j?YoH(Piajy2#hJ>}#x26#i4J6g_ik@==> zN;9B!ddG|xf+(xaC=yo!PSMEbMHYR=2_FICaOf;Mj#+Z2mxZ^KF%+dz_Bdj|t#6pF zUiT6=2XIuYE*%-dF%~W;l+h*p!zKK9a}ci*dmj%xb9v*+^TR${w=sLzD>WW}<QM<g z$O#iJ2E_SQUUXvB$GAv~<zD}~L*Kc1C;a@n?pi;4+m~e@DSz)%4>Y*^Mr7R;Q=dFp zu^it`jqrL@o;{-X>OH%9?3>-J_pafe&Mx!A<$xv~x;}7x!ST+|1a#5&Q2Tq=db#n; z=Di*&Gw`MJ)ysqgPv4)=ZDWP`i6cK7lvC|ux8~>gZb5{1xyyq)OFe%0)Vo)Yw5&L3 zd)A*>Eh^8Qy`ggR`K{OeGNoB4-_-`W`@Mat4<2<}%^yB5+2Zx}um0FC`Sz=st<G&Z z|F03vmN(0Vy5U|f$Sw4_WPLrc_FL`m4#=sx<oRm;)xID4;Lyc2Km0B7YDlk6zv52V z5+rxvli!}bc%(<YdM^&T;$36h&k2pcnA@g7bnLBd&ph^h-+7a9_Z-W0sycJWXP5f; zHA&c<xV-9!Q%5c~D|K@8fhOY{ygqwSwO5-UUY6_keEAXcO0L?z<<+MS>>F9}>axYD zPYrJ}ethq?!=G=_J$D=8^`>~EK1@6t`N`OKV*@UKeQo_a8{fSB)qCeGd$Ze+;BRV# zowyITsy)bZ_tkmi-0%CdravCOb8ch*8GE*0oYZK|p|@xKvNw19_xl_6z#WJz*W!uP zm+xBEYTd1?uS|II?%vmSX1*|b-iW(`kA<xE9<pW1lekNl<*GdVUF*gNj{bhvbFKC@ z*t+A2_wJqT79MGq^}(K&8D&m)ZiPGkaW9>}_lFA-`|awOQcdlBaCTPb<d`10OTAx7 zYI0ypleVS52sw-Tc%9{LU-r_8#+g6OUYTDqzTEp28tz)QCcD$zKJ%7Y70cJGaR&Mt zfP3uxz5UCEzw_h%Vec<%KL7W-CyaTo;@S>h{rrBT+AmJ6-D&;elg;t{IhI?Kw>W3f zcYCJox_YwSv6lC54{NjIa_Lt}54-K9ry6wce0dG-aA&!p?do0#JMiZG+d2=Mv;LLQ zqnCYM<B5^azm&eW(fdyaHlx?Kd~t%v-@E4NyqqR2YV>aMTC;^mo36S4Si`xiYCbmk z$bzRkE<M+E6v~9|f%Et7^=j;o2Qw>uvH8KKms&O&a(Cxt>to){{=UHHVBqtoJJ*ZD zck5Vg+O1!oJ+|%b@XuzyHUB-I<DVR>bSiJ_EB|Wu^!^UFZ&2-UA?hD27ZCU0R~vrH znsMj(MJuMBUG!zx{uzgR-(70^hAU03J+SS>G2FaUn&N%qzTZE%yZVyb?uqYs``Z&U z7bM=<V4(V<QkfAsAI0@(^Fj>1tH*MC&ecvhK5E_3YgHPI8`HRSy+77Im)iT2-6vz} zoZCJ0>I2W?9dg|6=kHy4#MSk;u5Iwu&uyPL(&AwA!1vz>xNxfOH_HYz9eaOvl^OH! zEeDoMZuaN)w;$QncGa~%pQ%^&7wgI(-^L|RR(_~+^FQ{T-JRJL_qnoM>X{2A+f1yt z@xnLV%g+g&dt~O0^us3~duHIyJLlbd@%0(#PD_-bc)cDQ_WK`IdZm}xJGlO_8Wrv+ z{Z+L|{)gr~I&+i%?H5;+xdIc%axF%-tN8ibJ9-VMw0m04OFN?v?VPZB@6o<~A6=X| zEVprm;keX~<xbAN{a}NsZ+tjr<--%cU4D1BP1QP7itqSX#IbV)Ijw&ixEyifVqbsn zz=NBcy?iEgXO&Vt>-aUu8WHmJ>+SQS>a49+>R|pKL*i!QN(+`-yEu2@);ZZD*G0EI z{(bP$<my|OuDxUIr<=}i*b((o<i2sZ=a1!DY^+pg+Q}1Y$>E<agl+gUf7!@^rM6#q z^Ny)cSDO6ZZ-2at7k<l9ylT?d`CmWXZTQ0-$_$Nux#4@Ip1xG0&8Eu*Jwxxkz0m}( zM{s8(%hjnrqIIp?Vz#C2s`PT~;_6>NUUtlyQ^$U)|4!FVWvBUl5r*#@vfTco-&L=( zb$`2Mk#DaW_Hlym{4HO7|J7@^jU3%9Z%xyM=NsZKRM=jB?<em_ub48yHFsZ)$o^~R zKiIUx@@_L4HXT<Yz&B=3$Av$Bg}WwM?v5$9JzMVlW1qC>67kxgR;$1GdG=dD(>nUa z{y9D5r{8~GG#z)9vs~HMXPO-Oc-iRR7lr;SWo*y(FW1O;`1$)=4nA_*pV>d9w{zk0 z6I_z$?;SmV@9-VZeKxv6_s1SjOFH!FsoD>nZT3R<#J9ctrd{owi4JZ$%k_PC;G{-% zm!E3>)EgHbyQtQ$9D8SE!%qkMY%9BR$5SughVnbaa^btvXCG?u%FfW##Tz<x?N+jT zM87d#yk73P@5{8B@a=)fdblR+R*LtdPScj&vZ%({3ge!OeyY!|vwa4<JU1a=+`|Kw zhrQSNyAQVF?oXCG-S_?UJAU}=)m5c0KH4|7!!y0x@4a@{-WFr0`St(!z=%C};9f_T z`?^lKdP^op&VA#af(^ZgSLr?Nw$GD&9voWg)W(E6J5E@GiyqIh-0TgF-~FTOwC8G7 zKlAh3YflBP@9<km|JVzQGqzqW|HJSz3o$yuMbiG>&m7Gz@Lv%#JLuep?*s+5&l}zN zL91#1Rcou2O})QDqg#CO%`cV<ZP-64E3a?A#Z`K}5<GI~m*0ksn7T4${QO6fzMIfz z#`YJK`jh2a&mR-rdcuW)4{g|=_4=r~!43RB>>Kb_`r~=aCluUM^;|y2*(huD=QCfK zJ@l@=ho_vHz3r((eZPHh!{L|Sp7!zPdz$2xJznD|E@hs}a$7ThoZjx?`&*7kjv2Um zey8N>=XZ{uu{ZUD<t;9xelb30AUb`d5&GP3MRsK?YW=X7y+3Vvru)FCbCcWT-I-Fp z$*nn)9y$FP`oZ2T*S5u(ukSDUZkKVsxtH%doHpy;6^}iadaU%m)L%b%VL`pu1MqD# zmg_fvRP*@(xOL^#vCp5cGJ2NRhPd&oJ3sNnxV8~(YuugxCvGT!jrR9WFTbeH52c>n zTWihR?WX61PyGI_*{gO<p7UP&ZVf*E?U%Pk!A`Q=;dAdkw#GO5oy@AQFN}L=|3iTh z?SIcr{IPOy!K1aNMK_p;dpKF{O5?CfJwLtWgAIej>#rO2(Cg2YzPG;rC&NBz|9hD! z)7N}B826oEOyuu<X<Ylozoun04=Xk4l><Yk&+mTm_d0v>tKA#%VAUU=eBle&-58eJ zf4oH1mG$E8{4wdSy_+XBt8j0n5jCUx9A2<CcIMR1jjFtcJCRuK@R0*S-3R`1y7MQa zO1$=D)icYN-}Cdadm2vL^J4$^HrH(MIlei@a+5zg_WsLvMLh6zgZqXL`K`&V*-w2x z@p9`Y_I`J8{Eq%r`)5F}{3v~Y?j8EXx_)i%OS||>%X?>DY<l4H#do$1-CMQFmgTAK zZn=s{z-*SQ7T>>Rbd~cp!vp#)EY<&=kOi;Z6*%|k$X%Uwo&Kn6(3tmNUs!Hd%MTm= za^;8RhrFMBYs3-XK^?YEj;s6r;N{0lm+*VrZyx%XJ1|M`_fB}P{?a=ylz6L`*W87_ zYz$s`VEl*4X9Gr+`0nn3TZTUL70NiD<=+2e;<AIO6W2ZPhVPPNKR?o8{)>+e-*UNs z;Pn1Y#{63EQH<XAvfMA*zT5g-y*5{;f7)o1b?{$n`i*+-kKpE2LWbqv+2cO1m(f>N z!h*WL_rUml8*+M{AK$cPsW5eVU(Nd}?w=p9bIsP$>&~3m*!bC&I1S8lx4d<=ZkeDT zh9`F3wE6O|`>PyOsc-zTw)^JFX=|XsZ8zZ?)hxI7hbk%c17>gCaL1xL<6iw}V$G?S zCN3-8=J^9l3R>)){1xOXV~xk(JEn2M6DhCv4}I*mgi(z*y+8l_!xg&M^7_nYb0fdn zGv=&nrBr{GJDoDB_Ndso=id3^fl`r!PED<!+po=~#FO3cnjSaj@q=_ucn!-{t+sIa zGsBKm&aL_Wn)g3B_{jXN@$=QcqUXOmaL2WjO`Gn49<bcS@Nu&q?VP=C#66ex#x!0P z_r|=Gavy|#+vtlf17CS(cAeVL1B_+;y}y}1@6xmXdT(wcS3+Vb---R!Uwd(VT$PEv z`rP{Rx@&hen1j27S?-xqas4~4Z~ok{DUYu{*{Nc+>T9ZZdA8i{2WOq$^UM!vo7XCJ zkmX(&G9+W$ug^~GQsTj*Q@`lf_1?@EcDL9RQhjB=fcxHFa^It{_s}hW?@@JgFQ@+8 zxZ1%9wMVUZGihe^A4WXgDCyN(=KgSc?50VxA(zW?XRlpOj+npp(ddhr54C!@U)-)0 zCAM$x^!134729X@&QE}S-otW(KUkIW$<%*+@bUUfU#$4{rM^dhShYBF`vZZOO1B>t z@NwT)@lDbi6z}1<yGOivPlKmM7hLLe#_!9MzrNA!i+l2iuG({ARE^TD7NEZz!g5V! zeKs}s!}3+jRIgvX+ku!>ExK*~>6VBDuL7T47hZh1b~Aiui{*0rML$sHUyZsy8Svs) zZQt!P=;2$Ry!D=+6BZth-8%XE21lmh`&3x5_xH{pR_~62SyM|tG2!*<vCYO!`8IIs ze&4dbFFyOulI@e43_Ph+D$7;d6<xAQpK0T_w4Y}^9oNtA$bh_&rTahIuj+m8Z3*cY zHwgO2az7oLHlfzNf3~PL_FL}-KM&q>Dt6bSr>3-RKYMk?dt;wp&<Wp4z`WAmyTz%8 zTg)qWywfuaAC5^M-st6qzLQ6medM9Um34Z4k#Hb-DDK2&x%YZL^;_mGW53)|GI#5U z0q5>I{_u(Wo7DN><5~T3>i+ccH{EdGKFfVmVsPJue|*?@(}qJABgSTZGkC+%ocfJ^ ze)N%3DX)a~Jo+HMk;rmCFFZV>YgEGnUP&RpZQXZA<Ik#oR&%y@y~@^?d*=P<JsWo8 z9_XOI_w=n<y(T<&YD?#3-4Dj?PWW<7N|)&$kAKAX_7ycEH^(=fgYN;b+`9|w9shOk z$a)8!DmA*w;U2F|`z(I)<_{MAv@Y<Wyx7~bG0y&)<whKgSW@euW-oVI^2|qvCzQ#m zuz!KCYg^?rX<v;_Z#!u8oA?F?+LFKbg&yhiCY{Q?(j&e?=hp9L#cr&)cEyru=Nb<_ z{a~Q0(-O#xX1S^nod>i&w)oTXk8e4e6aL!f<27IHdiu56pS|7c&yBAoJi8e8Ftgm3 z!}429U3&ZFQ<Hmj>~eeGy`xjN-?Q}T3Ek7Y{2uvucb`aHEK`T#?RR3r_>k$Jf4B69 z{g2OI_{q9)OB<~$<#RrC=FIT=cf3>!<M#e67j~`YveZTszEApQ@cNmZ1~+=_*1^+0 zoBB*CpUeH;yLh5G#yD$PZgq6YU&ck$9zAABqxH1|r|<h_WW5W6x2^f4-fuJBdM;{J z0`$+H;w`m%`CU<!N?ko%b*Nf;Z~xbuFZyg^=c~yHak=g8{AkWu)JF=-Jyv?znY<r% z-&eiGs>&bbv}#zZ$&M38qQ}-AQ>s(YoN@U-E47;C7M6W0bjZ3_KJRD^EBNZM`(E67 zwDWt@cJ=A_{M|$PU8sH%wz&kx?*86GLVMS(TIygc_3p{%>zp0Z>WPqfFVr71I`r!k zCpwKjODB-xS#HU3H8{wB>9L9(r@pJ6++A<n+jn+evbX=5{j+|1{OX(e3osvKxf1JN z@AX3Ls+a#&rTTZ@%>Az8(ncG89I-R$g%6(Ivu{*`(20t!a6!CdQXe?obIK>jk9Rn7 zG=1&6+h!*JR^!f<@0^|9J8j&X(R`wg<=R!8b2+_t_42_x8-2O4MDOiw@1DP?%K4C5 zLzf@uJFIHNn;6%z+;8!X(oZ}%uzb@GDt$kH@k^cFi1})3`_KQiV(7-XBfcB@a~q|8 zVYz3|&#Kz%1;2O4cBp-+AnMTOc88i&uDRpu<EO_hD^suZQP`^B`jozRItAT+ctY@> zTkqIA;84TO0X3suc&GQ8{K-%L{Laj?p|w_FT*q>*9WR!BB)r@<ua&oLI{in>ihE)n zkM9-Nu5+E`hxd+n?eQ42bBu}ny?<RW_Q}|#)7Df@exp?SQ#0GQxtv_8^qBEOMoxco z_Mk1JFXPU8mRooKFZFk<jEY+yGw+25KIj+lNkPe8eP&hp^M`{6hHP%y26<S>atZHm z$c-p7rD<kz$$V?Ie~0KbrK1kM6BW~`%Tv>a*IR?R+qW#2;XmL+ev|Es&S$**b=BkZ zho3qhu&Ln31!Xpe{4}c5j?Dw{U7`k*zEz>UR}YAp`|^T6d(WF(Z*9i;pwV?&|N20s z%A@xVIG)w#JA4C$<r>Bv+V$h=KicPaP2Jw*()2BDKmTL*yD5opoC>@g`@`kWq4zsk z?p)sNg^`_V#`Su6#e(14W&Y_k|BcCS-4#)(Lv-JmwH;nRkM?#4#rtPYiBHE)N!}25 zddcahD&3X*dxeK?e`4q5UhCTCX6)VHU<KM6%We4R#Ogagd@}tO-xRMGkG=KOl&??i zEwgyl&zpNa-ytHS_de(W%k`aEF=5s7pT~9G(Q;s^D>dJ0?>GLL#=+~)`<%juCQ6il zm%k~b&OufM-8BHOTnxpzhnxX)Rxnks?d1%}#nJAhkpu9uCcpDOAQ{Jsa&ee`Kx#%p zT3%w3n@G-0<d;mEr(8#9IoSyV_%=rTKLM9S-f$rC+4vaD4TfT0aoIfKI&xIBe5B;A zD^Vu2+}4BXJ(U{^#I8e>baLvD0m->3d_LqR2dYEAIf3#LF?K<r9x1>%Hz!n+|I94f zyS&MP=Hw=(r4BZM4#7L|{&W{_j(@{Z9osh=&?hw`F>_>&fA>^0x>hX*-~a))s8%hT zw`|_3Q_HrknztN~hn4aH2q`fs`DTQafPGwqSWHj@B2p8wGjlSNbNzd#=H$hv`N!nu zC8lN$Xx*}P>jBv1P0z#euKWSLg9hNb+O(Vj5ix+R+BR>~sd<|=?OJs*7GXp}Htq{e zO;7qqW66n6`$xlvZeXK3J1HX}|DTR(1kOq&U!O|5?WTQQ?sXX}cQ9Ew$!_hqq5i-$ z+2q`GzNFby*9`@mjMt%au~>1Vy$p3??lN~b&YRZ`Qq$8>26&D7hSNF(=P^tm|3p$p z7D=i*mg})rPP_MaYTK!Y{GscAG}jq7GuL8Sag8!vOz@AUJLlh|`{t={Zjo4StR}B# z5arYde5U{^@sAd4R*@{bo59U1*rflJSVsM?#8M=Z>(!BDoT<95uFH&!?Ln>ScXIUY z3poRFMqpBr9-n1&=Xw)K=G-01KcO2qFE=#Z9mS0$^hR4;4t>|)h6_!P*KaH>xvjYV zZY+?j9QweZ$&b7G{&o*%+xn4zImEwt)*}9fn%G~rj`+OXOsX1F9@nR9=4%hv70zEL zj~4?>nC`l|c?J8>KUA<-2cerdP1^rXx&C!|pqw)c4_R+cxEN03;~O_SvA9(d6W#1) z>G3qDyvd>G=HA4DNXFe_bPe;(Nh6X*-@ds?ImW~(Gci6Z_2#6_^oz;4x%7g(3Dw=W z{<b0X80_9Gl^l|Wqs`Y>B_1P26ySA@DvAllo^akkaXI=8x?RiEz|AT*8u46Lpw8?T zvIp+W-aNyLP7|M%x#4tTfo8;Y)ol?YE6ae?K!(6*UB7j479)S6=;ox)wA|cQH#2Rv zLf??~!A7NDS5+3N1!V5}ZKt#3_0s?Kj1`NdNi-uXZ!mU5ZlpJJrjJLVH#2$YWt-*X zWo6-QoSRb>=phQNj@_V!<mBhzau<`df5N7urKV#Q-9&Li2{z3wITyF<6t|S~xBJN) zzD?02&s_q4J0!ac@mNy5IUy!w<-4x05S{w1r;WCP-$2Uv+6Gf-f2U5J$-#QIotD27 zL=jtH)WWf@aI<Wm37gF6O>KJ#bWi9FmZ8}PwR?;ks8d^ibNB_q8%&s<B;J(TO~(E< zE}OhQ?JuG$JaTugR^A-V!z8e<a=0tv<_*ux_MPkISuG6tQZsL`vfV2Uc7?lhf8A!3 zR&cH}Wko98G-8K=pc*S~pYpmB%<07!8ENDG1`E{e7~0MH<|rwh1G&Cg$X}NzPAK4d zgzL(0kwBAkhot3a-L$|EK0XLylIGUQo7W<tSk7I<e=dra%~Lbn+ImCkkeo|z249~! zE!2C{zQFY;s56k8cw{6Q2OHvtxED|UP9Zsyl$<&$$-Nf+cS0#fq0!Sg&xib-(A;T~ zHTLT%>td3WmXL@Ge6OqKiU}=?KWlbfp}8}dmBULLIA*FY;2(|!;@gfrd<WtT@D5=5 zS61y5WT}Q;HrG^;r6vLSvfLCwmI^Lmb76ukbp{Bp2Ozxjf-Ke7+vWxcveYIZyb1xi zErKjnqNGxN5qeowN|2>|f%-95S&*e_0mU=tFUV5OfCe$wN|2@Q1#&UhRgk43fgWTo zMv$cj0S#m>QIMsE0}Ws<PmrY^1?tb-L_wB%7U%)yW(l&?BA~&{Efs`#Z?W?mBgj$( zhMQox6^2`FxNq=Y#`|1Wrv+K+4pd?y$I)1jrCI?EWv-ndOLYZGWiC{ZrDA|mnCm0R zQi(uAm`f34sXU-$=JEwuY9de)bCU&Gsv_Ri)9I@s$Wjr8>t(nn4EL1b78!1-;SS&( zyq%oiLxL<d2Jgpdu0W8bX5ihm4_I!tAWQ858pi3{C&*GS<2<UCTOtT@hTCVjV7z;^ zi^B^OWT|fqciM3C@J`ikmRlgmQgkg%8pnHBkflxmWit1@AWPAeIT_4Rb0P#C2TEtI zvLH+OqY>#i0t8vAyWt`YN1xNvas`H)hjZO~bovBYY82jw(cBn8mRexAMTXmn_fkIO zXZHxQ)Ju40M05WVWT~TuJ7%~=I5)kQpIs`*Qhs><LUYvw;aQ-MSnil0OZC9}5}Jz= zWT{-kjWS#sY}P)0HcODDzB1ei!};Jn11(ohkfrtkeaz3&6#;}`!|+~!=E4M_&Vlx` z+-X5*A2`RaxfDT=1NubE39?jke_Zy-b=g{wrM>{ta>oT(s%~AIYaqx{v4*4D7wHL0 zHLb7I0id#~r69y>xYLFk6M%PnSgt^jrFH=g_o8R_3bNE;pls&85QOl6@|im=$WlK8 zjbiRML6$1j0G}&i&Jtv)sz4){t0@Tm2T&e!O$Ax16HqR5_Xx7o{XjX)^%P{O{y+~g z=MrQo3+J?T-fk6Ssh)<5He9~p9yZ)I!|iZ$4VC(o%W8)pOL;X?Y7EDFiy%u?0D71? zKS7qN2{fL$I)YF~K#wxlQjn$Y0UF0#pdh3fsDQa>L6&j>jb$!Dkfkz#9$_v=kfp`~ zO<-=kAlQh;c0K|GS*l|br9R`lbrxi)e4vT^?8AaA^_!8qYUBc%+Rru=1Um^dl*8L6 z2>o<3yr<9Ml@esBG$1XPB?$d=bJ${j)?bjNUNziW!}+wZ<;n@Nlut|8Q+~FbAWID} z+#tiP2TEtTO@dG^t!yqp5NsV#2FooH1Y2x4)mr<a4FYAdTwg(!nh8YXpR#I>AWNw> zwp>X;7}K;x+vjJu2*TK+oy{c*LLGHLyJWe}f-H5}a90eM+|iaBD#%i^4L8qllRBYI zb9hq(S?W`u$(-iT1zGAi(6h{)6lAHNfTlC|iy%vR-=)+v=1L2K9S54qTs1+KY5?>! zbBzR9sy)zC%-to(Qr&=P)L2$^7lbh((38v!5M-%Tpc%}i3$oNhK+iDuh#>U)Ku<6? zTacxe1I=V^l^{!Pz1uFAw*{g7cDA`Xf>7s%>ub2>hFfJguY2rgZxLjvB*Uc|Znoj( z8E#)7Y#rCp0YT8yu1Y<}X$}yCelW<EixOn1DZ#Lv{OnXgu-S$?ZMfhN*j<(j6NE7) z&@7H)f*?z^4YlPu3bIr{H`sB0wxJ;Cn&IXd?lRCwmb)SdbAvFOn<B_kr-4SX+!;ZZ zni_6%GXz=cJWxK%T@qxe3HRIFBte!c*&Y1?%lQa`JuuuL!>tDz&2pOr!N&HmxdcHd zQ^QSla}nqR_}Qs~&@K&k#c+dqqF-RSL_wB1V7NnuYZ?hV&T=gUVVr2V!-lICWy{qP zWT~Y<WBJ(?f-Kd!m(6t%WT_QE1uVB(5b8JD<~j<(ybNd@%bgbl-H5Td34+k)#iB1` zIX^*`dckln8ScE{E*b7v9QsCn_8UPc=iW9qRS@i?;kFn~^|9qj3PStni$0IT3lN0x z3^&zqmw+B)xyyoJcl+5~q9DWzG?C@D2(r}R2W&1`5aw@&TWYwr{n6*~vmFIlYNz4$ z7_Q?0^c5`ESrGbA!|gL%>_FHsmg_6XQYQ@et>M}}Xv=jJgtqE}ZRckj3bNE{!>u=5 z)F9YcmWvf+sY8Z4YPhoTw%l!kplgQfVz~8#VaGYVO@dHI2{soX2=)Nz5X(&wgud2r zDpC8w?gAZVxxRudb=7cQN!r&^T?Ca?!G_xh^f^C!KoG|0$u^fF2<;N+2+JK31iLZB z<^~Bu|CXZEQI@MF2yM`CD-72%RjDsnuB{+Ty=l023|C>OE$1i5;z7<+{A|f#=p}(r zR)Wf^DTdo(xNU|zZ@5c_i%LiT%i+ZevQ(K2n=3B}_P}r*4R;_D{VG3uNRXwXvTQC^ z5Xt~(D$A`9WT{JryKK0`;YxkUaw&o=b!WECH4$W~aKl9yF41r)hAWBAayp0SBM9>a zpxItDj_4`KQvHDDFgH*T^Z;lDb18zbmI1V!xqLxb%K&<XxygboH4A7NbI%Jx82~M1 zZiOIAy$-a5xvhdQ-vas<b9)6@>Il$c=DrdHTMV>_x$}ac_dqW*=as9GrEUd!iMfh` zEL8_+A#?QwS*j(_0_NHZvQ!|@i_C=xvQ#wC3(WNvWT^z8`OFOwgn2j6Jm&DBQbv|~ z4Cs00o)BcI=YZxiH&>9QmH@3{Zn+>!Z3lXlx%UNO4FG5*bH@Z(>OBlzbe-=KgmyW? z=Bf$8nwH^04L8hinTA_nxJ8EBG#X=I)~hXoEcNafoBKcz#>IyF#c&-Tw&gkt!uSAa z28VY=5bO&&ea#ILgfcbUD8ror`ih@DF9<eqtj+ZmWU2K)$5?KYAhgv2n~N1>sbfIL zS?(J_2ydLt^%Vr02=q0}9TJ3bCpvx2MG3Oh4xke(w^I=8{dk)T5QK3A&^IhMK@jTK zaK{YSd4f_WS+0v9OU*Of0>fPaI>mC-trNnSP*7Pl$#5kn;{A4(^AUt{Hryz~Z8F>z z!$m!=)M<V;RuKAq!!0#jtx32ei{<<USt`qLxrW;bG>7H(2*UW_3Bw6O|BH@W%N-Sj zF)%vS@A=tFf-Dt=?m=@s1i=mg{lIc71X*nCHCOU!?TfJw&>5CX6oj#l;kFpA8ajZp zELTgAr8XMw4a4m-+yTQyO~oBq{A{csl%L_28m{CtrG8{NA3>P=8E$~#HUXVyxh;Y$ zRSw2La}@+(odM_q%Vi0|m=z6LbAE!LlR!VQ+yp@=D>O>Yl@w&D6rhVNmnH~v7sH(~ zT+~c`mu6WND+uk#aEA=n`8lP2=J2`*LOU|tPQx{wg}W$NuB9N11q?UEaHoNOWw|qg z&=zLf+$2F*Yk^W-W;uUBSbsL$_l8q*ZMl+yur3Pp8$WwMkfl02Z*zAGg3U2ptl>5R z{m##B5d@nv&*u6H!Wd*e?nGp{j)E{BG~5isod>$Ya+d_bHoahTQGzh<0lLa^s|8_= z=S7=aB*;?V8}6LpN-nVFd<3B`f&S$14hcfvxX|W?2*N&u;R+0Q1?U<-t6tIwdMc=_ z$}-$hAmv5lmt%sEx0h`$N|2?t0HGovw@naqXpznB6ohfkV)V%@mm<hg3xU>f9E$~E zjpARnT&f`KTN!Sa;r1KuQ^TDx+<C)YS%PeE9BQdXs1HG9)oR1-Fx*bVr7gpqGyH6p zAWPML#pdb?f(<iVqT#A7$9-}9Y%M|1A;ZluT(uQSmDF;AAZNH4hHJPI_rS4SQ$bjR z0$R&lx*+VG0Ig$gj37&m2YQ3K#|2?s3TQKPvjtgdG0^MGEfZv^4M3Zi+bqaZ?*naQ zZnq%x6+j!9J1WRh-vPbG+*v`E`W=YwyDh8!6a-uHs-3qff-pxk+<L<uTZO$~e)bzd zu!*Z}E=>^DEY~Pin&mnRLO%$!mAPC&7~2}T^G5E>TI@Nq+<8G*J6xyKo6I#5g!M@v zEq787=DO=`uAv~b!PjtqE<al!$WpHXy~W(?f-LpK23zhaL70mhZlB=-HerOp&o&f< zvNGIy!}Wa~Wz2E|1flOX+$F<}+KjO`x63htuwG}l(}o-H2FC3yH%JiX0fzJ1qJ3d^ z1)=XT+(^TXHr!Oh%`jY-t(Y%x9KnLHmjJYl^D$l!=5$8xvXPtjCgvaf>;gfkkGE{D zp&;lz5E-wsYPKLtRoiBBwFE&YfndBKH$@Qi>TR3rEC_lJ1mgv{qk=FVddKE^2*Q{K z2u2BVTLfWjvEAkd2txk`1d|211A?$;y+f(Dy@;zK2xCzoEw?}r#`5ptPF<E8BnV?$ z!yPkR=l3v2<T$zr!rZ`cR}5F-eOt~?5c(}37(=9Gksy@IPMhm22s#M_V+gtRg0Qyv zfz2fdg1s`_7{i?gf`P=dX9QucyUXUD7lb$rx8896yKzqwmqCCa$Qf?E;kxWm>Q<Hu z7KC{t&^ydMA;?mn7`e}kT+<KjXIl!wn(toRo5j!i2(r{4AKBbBK^W`pv$+X^EZ#J& zz|WREfE&<(pyPtds>_B;{1j(cST02n`d`CsGo0UNIK#qn)day#8ZOOn+kh&u+zvr# z3x{m3mLS+pAU~GN6@)(Ca61iG>oD%9WI2C9uwjPVXSg1pD^-Q%q6ArL^AVeSQxN(O z!<{wU-A8S?`vk#87;e1bJ~rGz!_i`xj<=*B%u~Knsw$^tg&>TnkJ;QAL8zmzm8!;a zB?Y11H(a9OHUU*<xh;awK2F$NXF-<Q22_LPb_haRzOlI#f?zjJDpga5CkXS}Z*49> z5Nye5rE0O<06~bua61gw_dBI(YdJyKGX&bs+#Eru^Y3lBTtTpjKj4mImYX67cEfO2 z4A=Jz?g-Rz2tqy#x5aQ3&MM{4a(;p^7ByU!;dTJkWx1V#Fh)OTa~%a?y&b3?%S{!8 zKHhNW4Hx{QQuSFbOc3m(;f@(D?L6*+XSpmvXm3D2Gq+8UrFH|IWbPwDmiip%FmqoD zf<6O%&fHl+C_kVb%v}+LJ<SV9UkS2*r3G24GEhC{stdxJB~V@Fnh3(#1t5Rs?h%Bu zI6!rnixgz3fk3x27cU5V`9QUq%MoO$aX_`0drT0<<3Kf;n<WTiN1z(aEfa+KIZ$=x z-VkJ|4}hvM_n{!HI|5Z@?kho-Itx^VxeJ0Ubq%O8bKaO56T*2UAV20R3$j#wpi0c$ zDacaofGRTANf7pWfqa?kE(mM1Koyu9D9BR7fNo<hQ;?+|2D+8Gae^%M3{ZLIo)v^S z4p2Gf77Mb}I-s)5Z4`ucJs|qNLs|8KAWMA)<ip$%LC_(f(#)L|gnkC76m!=ES*rX+ zjH#LP6@>Lzppwkh7ld<oK;F!?6J)6%pc2e=6J)74ATQ?n39{4>AjRA;K{&qwbdB}- zVL_I966jCno)KiJ`9N2hTPVm<tAMUBw@#3y-Uj-ExpxJjPX_v(xz7Yy>Lk!_%zY=w zQojOSX6_F`*mJmq^$6z53&K7-&@ar@5ri|EK$n<nCCF0u0bOJ+NRXv^0sX{WoFL4_ zfi5sNL=e{WfzC6RFUV4l1O3R{lY%TY2k0Dg^9A9&0MJ?HRtds+0iZL?y)DR69|8Tq z+$VxCPXYR#xs!q{brI-0=6)4qsat-=8Y6RM1mV0C(6`Lh6lAGJK&O~%Cdg8E1AW8X zeS&bN66geTy#!(W2lO>_34(BT73er~d4e!s1v<vu<ATsf0e!{X96?yW2l|q^<$|!+ z0rUlPTLr;B107}VBSARl26TkE<AN;pBhVq{E(*d~t6y-=h`Cz?S*jAyr_5CqggGM6 zLFO6>!nzdD0p{)&ggqsoPne4kgmYv-`<ZhIvQ#?I$IJ~EgmDhgKIX;?veY!7kC>Y& z2xmxv_A<9b5aygfA2Rp4Ak5=|_As|w5YF5I?Pl%^L6-UfXcu!o3c}nE=mX}we$~iQ zw*l>Bu96^}9RzxxxdwtP)duK2<~j(nR0z<!%!LcGR39LV?Mr__m@fbYFgHe!r9S-K z?x#N%1e<8MYldt7hb`Ay5c)jB<rwZw!@Xm;vxd81xW-rP@R|#P4Kv(2!yPr;F~gO= zYCr2M2<MRucbDNpfXeb*C|nS9!^jOca$|tXv0Q;5tZ^H;rABTYP<fWyC<y(pk^9QX zeGhai%bgR1c_<bg^?0a?AWLN%ZiM018E&KDE*b8!;p$$q!)qW2>#@p9;^->~Woo!} zhV#Lqo=!_SLFnTR*U4~?817NS?KIpT!&SgSpAOGY5Y9y!F3@m~817NSeP_6{hHHey zKOJ5(K^OxYZj0f*Gu&Cjg_g9Ry<ZT<7KVG)aEA@|h2i|MNEpEFC_oVAeuhgk+%m(h zG~D-wJ7>5UEV$|L`UtYrBZhm_a4QYB#&Bm0ciwQ-u`s8@t1SrcDj05};Z_=Mjo~gC z?y})(V-Ze=S67gwk_|W1aL*cUmf;Q<?vUXsV6jez=O+l~t_>GvxF-zvl;QRoZolFB zV6jez*I$sOmKkoP;Z7Oud&3RG0-k<0QxN)n!@X^|u2}TZa-o9geFK}DZMf=K7}0XI z1);As+~bDx!NQ1^D<=qjl;K>4n`pSnhFfE}*9>>maK{YS9g8J8jz~d>!*DLc<r;33 z;bNP5sRpd$eFa%+I#6To7oHP@ISEiB=9URU8w6^|+!jF?Pd2l|`%Dn*T63ElAqf4Y z;dUFYRtsCsUl8_n4L8bg!L7X19h~McLFlJj+uRaC*xNDOA;aC##+GX=2z`a&?lN4I z;bIN9shyX)ljGeY2>RUK=E4MFo($BG<<1Mj8bAk|%N2xud!R-v_l+Rz3w5-)C_(6_ z4L8Pc=YbmYvzG*6ucMRA%@Bk=(!0D=6PEK6g!LxF?KIqkyS)@D5&h#NL0D_)Y;&Cj zVNL5EFNKPQTrELZKQ-I}!_~UiOQB*R=PwBLVYowvOS{iYp<*GIB?$ZHhTCJfhF!c= zOO|UY2<IaVx5;qj0=*QJ0^wB<gfw@xxmtptyFp$GN&&eof>2h$Hs>b@_8tfd0J$_l zShq0THpBUac&WB5S4|MsUksOJxE(-H9)!135cY6GZO&g1^d1Px1G!Oxu%2zW1BPqZ z%}YUfAlFn7_K6KQ$#6%3peT?#CJ1ZmVK&!85aKo5D8rorf<och^MbJE5pHwwf)KCa zCK)dHelG<j!?R(6U?U9onc=#2x8*_wVV|>y&7}yk)Qg6D*>L*|cffEJBE1w88S(lF z!um#(%~cizJ83wV;Z_)Kwc(CNdnq&mDnCIuCmmyR^914jg;+0zMgX~Tg7BV5oXxcq zgf+L`UJ8u>avcRh*ZSC8njo}&!;LZAB*RTH+ycWbGF+E_UJ4BeaRdv(_}*|I8}78> z&KPdg16~S^3eS!ag!<@jb18zL;{&}E8XDxX1mWz~gEm)95ZVk78Xx4g34)x<=Bf$8 znNPz78*Via8Y!M#F9_v4$mYrk!WuFV8YJWr1!2wHaQh6`Bi>7)@j)(15bS~BwivGC zU@wJ+2D#3HU}Ft8!*KoyUJ8v0ash%+Z-yIVIG;o>g$4w<a)Qv_3^&SfC6l}q8W7}s z1Yxhka1#u783+vsa#sYQ43cdwQ4s6~5E>Qa4hX`U(GZ(kC<u1faC;1QKE+F+QQ_H3 zf?zjNZLWtP>}3H(u-qa+u)9NTu9hII%LDafxfO!YhYqv3FhN*D213I{yvGFLyg(ZI zG9GW#6=bRE>9$;LK}etBdKj)@hL=KPMtDsHVI3*c=JEwW4-B`(a21Aosb2i7pCIfh z8Sb*-+Gg8w9R)$3^SzWG&;5c0!EOM>GdE8V;sqMa+!jGtvjj?D?uZ~u{Q{K8-0y<W zjvn$-Nz7Ff1p5M%%v?u7Sa$>(!dyQ=7@Gm5FgHRFbQ~y^xfz161~uACO=GT?Ahdm; znapJg!rBthbIi>VgtiYfi@9xraONFoHgn$!!usi0FEx+3c7pK!G|&so#R$S0GSEvU zsV*}G(YZ)3wSwhh1z{f%e<!QTl^-pYS>@`dHA809I$u3t@_i2w|Mx%tLa)*f7}dV* zfMB}p)O-b|c~;_J_0t6}oQ%Og{tv;^U*>22CSORIzgdF+{O|w%TLS;TD}ic-aty;x z8zBGv6<Y!wi)F8$yxHM3y#AyV`{d0Iuh>X#B6;m^{;&b)UGkPvrG3iCgI3vc<!`;M zf^Wr2ewC|KtyaB8&04i@uj600UVSa_Kls~Op%!!t{!t%CKk9AhAN_5&uu}53?T0_v zk9d-?U5Z%uRwUtmeq>5gHjOu&zX1GU$LZw%Q|yd~p5eRc91phzzM0{tC1r5v=}EY0 zDj~;(&k*Dgk&_aios{Sr5ucXB?~St%{`U?3Ipd#-zq{a{{YwOJ`iJ3fAKUZ)0oR!~ z$_{SID^y3G`6v7GznOp1Tjwv!`3ErBlN(8or+)s^;X?rn<$%&(p%C-;{_spc>3?o| zmZ?Lh-c!ii@Gpvh{AR#)>Oii?-+l4-jg+rM^M8%w%qu18KPj&+j@19RytI9_i{wV_ zL2>$PhfVIy4*#F-fAFO}XYy~lefp=vPmjk9*T_O{<}mI_M<F-W962I;<^0>>^^ZVL z`){X<%E7Kn=2|1oNicjKziLo0r+wW7e`oqV+j9#1o%XJyhrCDd|IhzPV@~HUDJ>~I z37;*sxs1GYmy=6QO-f6|mpN_!N#07ewEut`i@%*VxC{A#`@i+)nKaM#NBZH^m%p12 zPy3gXlte==^J@#_EHC5n9|F(t?KU$wFPTHY2UIe0k~6c@B|N@SwohteE*b(|HcF|< z!R7IGs%S6F8K$4d-<J@MGrc?Ux3j%X!r%V*Xa9l$obopRU$^)YpgElLmw<VVzTH}n zWn$s!EYBO&PiI{J3HG$ttWU1Q_}qB?bVE2!d;Fh->6CHm9`WvwwG`#|W`=LK7acmj zBM;y#Uz`6=UC;D;+7l`tpZ_$lV&wi`3_me1Jw0FYO6Bj=u^TO~Vv6wJQqH(Zkm}Df zeNO%OKb<~L{k_@!3Htx8_@-~~c>IqB1^7D>A7RfXQvME&PftzD7XtqJ??O_zU)LE3 z!pU?7g1?iUftbHN0s-F;4Zzucd_4X>4H>8ZPLIErdi*`f<L?xYzr#HK#-IQF{U0m= zACI_cP7sE1OhkOnF!Hk7>fp@W+{|?H2}vA+MbF$!7UMsXn9%{H{(tPf4}6?gb>}^j zrFd-186`0wLIML(U?2_%Vp@e57_ovr1_J^N2ogYPoK$QAh<Fr4u^pLF$V|qfZr8i( zw(zc7QtB?<CGFCn&=h0{v1qfc1GIH%ch}qH-SzC`-KM2)<MyTX`~97J?=#Oc^T>8m zx_x(F^s(nT_uPBWJ@?#m&pr3gbDs~gV)Oo;xwEBD7CDN6C?*i6(Z6JPsUtks5gzRb zpN3W{e@A$daMHgf_`|<{L<w~2-`tyTxrH_8+(-R$g2tM7X`8_#fXO_yj_^*x$?-(v zUouSaf9b!@x_EiT67q73!#@6+P-!1;;UL=y)&eGciofr8a4!WVd0glS@9YSVcZ3Q4 z@b4c{0?EE5Hf+9o+l`g?f5@$4-njD)KihRoR(K@aTlTe+hD-Sm^V{iP-hT70+1prd z*;V<_?R>2xcgt-z&%F&e?9=U<{qfu1rmtIjcBXH<<K|?Arr*X0s9|pG_S<j7iN2#F ztT}!d8%4tAYZEtW`fq=?-F!>seLv18uK3EQ5XkGs58iZh?j}Br`=JlA66BJ(aWzr! zx#MS9T)5p0%`^DXAF^<g6{EaFsmbwe=FRwcL%vWR<Ajs#l_y+mN9Pvan2wJKC*w<m zlkJ=D2oJIVG_|cwaES&=@-t0%v>k2l?Iy$DWjyC!{C9{zGM>YCsr8ZLq@0gaySqpA z&e9M6ekg$-O5n*$;G&K!?DxHi)lPi+pS*eJJD9H~1Ef8||D-)wAe^)>9prxC!A|?X z3wyrvjUT!r*!ww39Q=EfnzThCGZPHBr&;2etiMN}_oI{kEIIGs|3^H9X`V^?QAfDc z5%$^sKlA9^4{+ae;+s4g&34^<Q|wrHj%ywDk?kM;pIDnteG2>r7XH5cbhh_D^m@~6 z>`#h!opI3LKeqmK%2(e9mQQ8O@gw<e3W2Ba?3Aw^U`o(Y{Z+<O{p+M(hR`$k&l?T= z4jDAT?=uaW<o8m8ruco9LDT$RW{_Isa)ajheYQdK{65E^8oxz@4)FV2gAVcgJcADN zdxb$q_*D<-$=%2Al?E;G`+S3z`F(*wEBuxWI?nG44LZT^iwru+?^On!;&-z_kMn!A zL8tkBu|aaqUSg0|3P%hY1k!}F$8IxXG6_@!rzxd-+i#0OBj8?ckXCJe#Go?Jj~WyK zjT)r)6RtIA66h5MO#xkJkUYSx2F(Dy(x5q@R~a-9^lF1@KxKmt0F4<WZ}K$;9R~U* z1|0z!H|Rc~*BZ10^g4r<fqu-O6`;tV<3Mt8d+cV1*Bf*a+#3u!1+?9u$ANH<Np~9P zO$KQ(9+w-OZef`)NO!}$#UR~c^Hzh3KyNchZ<g*bXawl(25Hrd!5AuKpm!P+0Zke- z0rW0|CV}2<&=k=12FU}z!JrwS_ZTz>^j?GJf!=3O4QR@s13*=S4goC~bQtI^gN^`w z!l3(r?lx!%=pKWXfocY=0M!jT4%9H{1kiqiP6EmI=*gV|y4aw{fi5xVG?3n~K#Xhn zW{5#~pnqwQ<{XC%8Up$`gNi^uZ%_&7XAK$!`m{k2klwK1oe!XYYS0YOZ3fK&X@1y~ zn+N)UK?i_7YS1B|pET$&kY>d_xg$UyGUz@a8M7Yy!k<R+p4>7xjq5$R6`+q8bR1~T zpc6nd2Au@@utBGQZa3(0pj`&Zt@@Zjd7#|}4Fc^kXb5PpK}DcD4JrZ68#Ds6&!ADD zj~i45`ez13KnD$)0Qwn&CV`yPrh$IZa5F&v%Ah%*!v@U*{enSDK%X&aIZn3{r#l{} z%lEq*4|{ThK)+-;hJZe6P!Z^t4VnZxV$c-OuNX89^sfz?0s5Rlhk<^=pd&!j2I<>@ z?>A@(=%)=@2Kp(3R)7u|bR1~Wpc6o!H0UJIPJ>PX-DJ??KsOtdUyF4_8?pC5R~s}9 z^m2oa0R4zTr+{8<&}pDo8I;dsuM8Rj+Un8)m0j#Q?2C&9`Z0rQK-&z`*8$&R&?%s| z8kAp;6)-3QdZ$6tKtEy75uj;<^cBGm8FUKhg9e=j`hY?C4d}f~2Q=ew1L(LxLqH!j zs01`;&?wMHT)K_uq>BZbH)tAYpFuUCy9`<Z`h-EJfbKD<bRky2pa|$+8dL*1WY7_y zPZ@Ly=+g$}3uvN2LqNY^Pz~ra2CV>n&Y%-O|JopZv+!38It_Hhp!^^j<{%8tuNo8q z{X2sufqvbfX`o+o=`crMFsKCdn=TgUL4#^Q-#2Il=x+@g!fci3xr}~5FED5n==lak zKvx<x2{dfbG|&|W9ood`Y|s+W8w^?jdc8rTPh)g3XcB1BphH0KGH40tJqDcydapr4 zPp5qingsfQL32R63|a!J7<2;YCk+~U2CZt)DA1h-%>l_8^0pe#T?QQiS}<s6i1syT z6sTcP1ayx<OF;V#Isx?S1`RzEiMv>!FB`N1^jj_+kiLt`XaMw^2Au}_l0o@Pxl`C6 zeN%DCpc2p*4O)5@H{lvIdKq^r859BizCn{f-!^C(=vxNO0e#b;8qlK#9RiY##<m0f zo<XCyXn$zXG|>NP&>YZr4XOeC7lRG~{i#d$9B#HUXa(rc4LSiNt4`g3{>-4$K>x#_ ze35&(3>pG@%%Bob%b-!9|8CIAbGakTpwmEqZBYJs+)ZZC9MInwRJ#HX6x&O?0X@^8 zBS1q2Edf2lpcSB}8*~Cl-<pL#piKsy2D-$c{4k@lK|?_LIxRX5G-%K$P{E)G=t6@g zfi@a64K!fT9MA@XYC!7^T6qB;vO%YTt}rNH!rwJ$4rth*LqKmb=me0yXN!LY^bUhY zUx+0%XcFi>22BIqV9*@U^#%>Si2h+v1ay-@lR!Ui&<fB_gH8dx-=NY}cnStZK>9vz zPp$@ZyFo{Q>IN+V)eO>C1n)5@0y=0=4d|a6bOh+<3_1n$^9I$o59i+*RUa!yi@S%5 z59D*G_app$?{kgq!xN41;fca;E!W3~hXIEhr=!Lr(IOq)eaa!%I2KhOD!=b*%HjUD zL$J7=3`0?U$M9ej=ubHM18w>d1x!W9#)pd{w|#MZc*~ar3O{{HxCk=E>h9q!xyl6; zzom6s#G|MLGf_RtCqwPP98rT7b*wyuZG_-B1&L}@w`3M51`6;{#z2R3WK!Uo<*2K+ zkyUphS=~qC3XZ6la@25K`@jU{ArDs@i$7MDh#`O1^6YmI-bjktBZ1z&#|C@g$l7Ep z>3y3-js3$#MKo{^cwF;PR9_g*8)m`B1O`I5Oe2gBmk{*GVe;_YX?YQBDL4D<?Tbe0 zOEOUpTtJL5TV1)JDd$kl68(BlC^v4F(TMD$xyluKMuW4@8e5VKy>6(|qn7rr<w{(_ zAE^X2h%ceHx%b>96c(Cfi5feGqc&CQOjpQNAGF6y3wJLo%}ov)Ei&L^6z*Rj2}8re zK0Tr}N6(y$7IzHqOw|Sc`kQx?n`-RLRbHq^Z{>MGDDsLQz?%vzuSJq0P5C{|H}d1^ zeCu-V*g~J&J9<=ZOfxwIad23eRAJTAJ(Q-qMB|LAQwdi44w1Ol(|m%=aiph8`WV-f zf$Pn{tx4d<<R`DjQJ?CcEYvt^IELzDeSsNN08V3kKHz)P_<?|5lg1A=FHaVd;_e*s zY9^|WJd<2(Y932QJ{hY2ESWJ)b*NQ2wlMr%66jAYDLB=Vs7-I{ZDUI~Y`I28ywn6$ z8p&1G(d$Q=|D1HKXQxQClk~RMU9;SpZT`jg&zzCnC`FBlqF8F%jS@Dh2#sJjl<HWy zBuvPG{prjx(v@R0&hape!&$bG!^)UVx#khq;rBfxYxKUa6>u8P=P#f9>#;zu{jTA+ zFOKXNbOHa@hSB4ZN5+v$YUtSa*gQo#ODM~nu!OFIE%=UB&b#sA!QsOs>)*Tfn&qbM zAI9K~gUGekQ{nM58qCHU3zq0wz{29+P`BtN!06Ux29Ev1>Wk5um8fx46elF%iRx%> z_M(J{i5P7aIuOn%&h|HdStQA3%{Zz-;i{w2nH7=4j6trE1FWDTmHxur70*D$o350} zf>l>fv+I+}9YtrBWtew1j*9_Znyum(ucP`{-YnVdi?&-r>?XxqC8E4fXCb6ThUnqG ze6IPImfcvxZo8VlRs-PiXfYUaBM)`!agGV{`^4EPweVrXL*ML`!3LS@AX;H~m|ai% z%prhWD=!E@ws<aAS^Mz#@a~>gzaA#ciNgKchj-VaeCu^lkV<uKC|9{E1h+TJNIVP` z0efa*C~)5zFk$#XxY_#KGiMOacy=$?_s~4dyzgrgf979XYuk{yKDDIhQ}*)r`YDg6 zByxrO$A>2|B=5OqSp&lkB`Z>&-aYHZZoBgry-Sk7qC6#umI0i)xqNH(Yz$!U?%vj~ zw0c{=)bhmN5n_7wAb~)<)im^zCf@`3Uxxf=#KKgrV$MJ*SGm;4i9RMQq4FcGb*i<Q zBPE$qk`eEWQIDht+13B$nv#cJ=p36MKGb4!j-RV@ik^(<%f;LKn_2-8SG~K}>M^|c zC2sV)b@`=H!yJR^)}FrI1HP+SmoR7S1m;4^ELMlY{kiJtt1C{R7PxBmClfKIwWG1t znpved93pA$R;RUFt%<kRVAQhGYt2Hn`NdNFRIn6TMaqO7BEb@`gWvhHPf#Bkexx00 zd==tbT8_<b@`dU*(X%$&#mbx8fsK{dv;*raFK-9dRcJn>X&enyo)rS<DhAI*ymB7O zs6izlsweM^4#lolUk{AEyzpgy?pofx!GP;%cyhc33L`XD>CT}5%|6W%6u!KDc*}K1 z_ez9U_p~+<T`GK@T#9)4nxj(s=0%7?WugzLF*>AfbTzDvNHHX*^KEZs+)PFd3#BJc zh`ONGi_Vt-7BZ!}W(3Y})<Z#4UZG9aB`L<}*wT7yuN}-(FuWyGP9n;x@TfGrG~0)( z@P37-Exc>HU_40l^@`b7Tfi$qg77$LAaX9cjBmbk!cX4iIo&bi>zo5+^w%jjSPxQ{ zc(B%t4TAhwFV<|NOnf{z6OPoKX!`B?d82;bWV$<N6{Txya&Hw(b`@83-#cC4YU`cc z0q4h*9V&?4xx@9&N!L3kodHHqod}asb4AiSe;)sT)gsk9ds95UxZ-K4H6`!4RohXS zzYg_%yNAnX?qnrhTK~qL)&`0F=*hv*?2eT}b=cbpSH%|>?z$u(0^`mMltNH!hs^&C z0ko^(&48oi&43GdGvET=47h+d0}2E)AlR9K{^lo=1$0}2H>-cY8B4I<fa>Y>7=pJ` z^@u(*u;+C^;|6WLmC=|)+lSw5{e7HfE9Yh}W2QGx5xKn=Gw=&Kv%(xuKx-XYqV<R? zYJUIkf&-1E#oWvlsy{`NcFk{g7Ts0pwX?GplN6ZihutlQwV{_u5l3g$a{BH8OiyTj z7+UTHLJZ-<?@?2}si*aH@=V}Pip@1Ejia7pk)j`HkgUsDqkb3i7|$8yU!z%Nncj$) z`<p-JLvOMW*Rg5ND|)%T*Hc_sLfhTn)RF*VC`%0GAk5v*hHBJ<7VF|G3XOjD0oj)) z{#wE^xs5A>oZ)%!ZIS+bC}hvO$yQEe6LHsO8z|3-y){Up@kAouXalZN{mm~xJe08< zn(b2-TY0X$HDoa!Y@JNiIEb=IjM62H?cPk6%}kfYRI>)v^S9Kk8)R{w%<$0q#Q9Ut z_8+ScO?52p&|Isnj}_rBPnBd5wMeF?CS9hzQS|7^c<wM_Hnb11*`Uxje7iJKZ+%7$ zVda%ywZi13u`Gp+?s$4P-ZVf1U*6_Jc|qziQ9)nXld|Na#=vml{=OcPZlbL=6)RWh zv9WTQ9_uSl(_>vls=H~RB4=w;Znn4eIW%O`JTz|aZQTr=O*jTH;@4!p+@?230yXyF z(UW}}NJlwRq`@n-vO{}cL0~|&K?887Ynyt6Fm?xmY?`m2MJai(r*gUSLW&IJ+A&<N z^{IY71CUk7&+15o`)LFj!i&jPTD5&7?uo(|HE*K;n>sU;bvDEASc^TGW(e(W)6>r8 z*!7OUxo--IXyE9nJT(}+Mm7b>38k=l%=?!=@ViWYzcR^w&zUnU5G&3q?*+LDLAL(6 zDiEoK(*p5zM1;54_@D2TPP{%@eQfYp-!PRm{nWIjXZQN0>j*bL%a5DVxLJqVuoyMA z4Mx}IcbV1_!p4cWK9#7TjIgDv_t-qJkA~IMtgqfTT-`cctmOG!$D#|f4xo*d3;10> zd!gm`>%6Va;I3=q)O%V(;Lcd;OJ}X!G@HU|=NdFp^`XIJ+tWS6`fK$ux)~xfv!p`G zRz>x+-y^eOjO`Wm%c9k{u<-eI6nRs1Cgkh9xt-bSTt*YE&YOLmH$$<6R+oy_txD@= z`&yH&w+OS*Vb;$M8j(=(SG2BC>~(Fl)%}W=`fBNn%XF!eOxf4J)!%#_1&U4)L3FM| zOBVV|u5WkBgE<!RP<ywll#<6M+EG6Ud8|_Vb5-+0XRBt~U)Lm}2-9w{sA$%vhzyIb zFDz=n(K1od8#Aox(ZZLhI#nxtdEIqKXLnj3PUhP4mb2!ltX+D83VV4nRlIP6%Fxxt z4SNOJ04cTxTK`A$CaPoEGFvTOpH+5UsAWlgAgopI(1e}c7%Pm$2(5H6!vHl>&okk; zy!EWGB0hoV^T1*9TH1|*RvZ1&8zoMif<EngY(fJT`x_$<M9_#Q3j2qr6p`BB(9A%K zIWETSXV5)kL|%PxluGSX57Ht((^5ysxHRXfgr`nRR&skTO3wY8+D24uN2qP39+kqV z|C07{!J6GaW+|$3C5dLSABM603%23HB48S^9meF4IieG#WNEh2@M*;`J<veiSQj;@ z&{apT`Q`)cxaXeubKys>8!PQfv-y77D=?9(+|sVSF;WvliwnaCjWM~ZL6I%bcq1yY zp!X$}Ajv4XNyZ9e(Xfcer@Xn!0Ne{|UP6IdWSn%nKa#!6f~+Gg{6x9J!nbU}WCzPH za2;7ZVkwapf_iK!EPS#ZdRk#&z8!i-VS&qfL(0+0B|gs^z(cpG10+alr}e^}R*^=z zgiEt?cUm^uict^R$pY>sSEV&$MJYu&Y)5E^W|?Y9>jO@EDZ-IE#%V956Q{kDPF!CC zH>MLmi2vZQQl&Jndb+>zG`x|WNhN50npy`YNRRzsUuA{7^`3yX?Uoqb-iER5mNq`# zhOzCIHa^~lVSr7L9~*35M%l4YZS`iv3AIvK(1LA-`uFVqkUCCU^+%wSQhgz;f2Dee z*2q%HgxHP>D!JT0SU5N=WKu%vCWX5`?Co~wnXT(Hm|L^^)!odMJ4+Qp{ZdbwBP_I= z!djpFC9K>q&P9JS&zf*Bc3(#|&db<QAv03#4HKESPT#_fr^&V9qG@$hm%}KVfXd>h z_6;|3ECI+r+c4G#&PMyZN3vn>uyXu1(H#cwShqxJxz;mUPYbAB>$FOErq$Q#wPmW< z$Mxg+zQ-gAXMe}l?BeZvpOf;6^R)f7=0SQcCSiX)Vio(VSd*~XUmZa({phg2d(!rI zG_#F^{T)p!;UFcXv`YxJv!2diOpJCa*6eEb*Cxlo{*HFoU!CePiq$z*dCmT+e)0ja zcr`>AEuPK(j>`UONi5U;j&$2!9eqmJUlnG;l#ayqw`^Q>+TVLA1|jGHZ$soHq(}AC zCXb*zA%3)Q_g|so+B#Rziz;jD9K}i-;?WF4tix-;5Tmo2Wvv-wrj=ocWin%9=Z$F+ z7YuRIU<X4iT-Z=*8{Jq!RPhKYsG=Tg_H-NIb?_Mqr$G`Ha#aHiHOceJ+2>0OaH8{s zVj>-8d7$;aK)xd;@98{m_6pBm-|RC(+BIPqSQwU>Zf#&2T7dqnRC=ev^=P0u#xrh{ zV8_)aPtuMTRZyo3({0B!mZy>lAv>=8u^kt(v%7WK@zL|Q<0GA=3Zee3XSN-;KH4ac zZg(pV?pTWUNo~d+jaVOwjs4HFTo;V}PoP%kYwSl=(YCRdEj`OVp=&{YdwSQl|JJPS z>u-n70$t!;XM4o+vDIDsag~Sv7wIVzGAb7?xcBOf?71;7#DDv3QfRfrywP~SK{Jr; zvK4yl9^Q_X_&FuS#oB%r6G77PT;;-~0_en6C>Uxsm2!u<imlsVaU8+rTCX8z)S2^T ztLJ=~DrY%0IdQ}GCPur^lAk@_maIO+9Oae+@UZ${&jn}s>s@m}UuJZFXfxX%IiHho z$b1?RNl~X+isjd&vUfd|)n`E5{`ht=sy4}0ii{|o4a-cP$*R`jUf=q+nN9CgR9+M} zd(pZC1*#j*U_r)hy<mKk?KNHAS_)!)=t+sy3&8fn<NCitM-3;P+o9n$c01bpLvFpC z!+9eSs=LLhD>5jm=2{t^(?}}otC4h`r|~asnX#FS&I``I@@$#=R?A#MdK@<FZ84ug z7AmYBU1l(=CV%$jfAb#=j&$ls<!d27ad=PxG3H~O1&S8u=v{yQKoR`+?sWyc&}Fq_ zKB+o5f=cR6`urh9Z0S0O*wCrV$@jfCaqKdv8|P<OZA%N?j(1Y<WNx>umrXRvm(k3V zyI+*-s-cyCg|gG<0PjHi;A2`Mo?t-7Lltn{*kIukE2LIsCTtpu60wkAA+U6Ow-Bv1 z9Fb;@<aV1Y>r%tR$nEZAfPB?-5k!`Djfhw&I(o`RQD)NPJv~k#4BvkSjf}3$>D-ix zZapZah6C6$r2y$oj*ej!o4+b<9Um9Re6A65q?~dX4*FDv;>ftlBp7wa7;Lj&wh$$e z92(n-t}oR$9ZjK2Ff(1>w69$;&GvUlhOf_$vnUQcWqh_%#M0%c%_{rL{=hDU+K}ds zn7VNdwTK;kuMzQhVX`dKOjcRTUEVimN<F(<w1^v2jhsDj7^mnqL;4e+rt@f8x%+4u zlvwuYB;}5)8LjUaExHu#L4zb0A7g%vLztEm*?0?_t(d4fs~D$WWjs_#Q|6_6-6Y^< zFj_Dw8w0chvxKnWt{kIb&sndj2;sI2uTSnDzGv2SDBf^w>ZO`?+K=gEPKq!pRBq~v z^X){X>_mS>k83B|I{Ow2XpNjbn$ca@ZsVxjQ$4+P*6dTvMVyk-O07$>SU8lT{;F9f zGm?!vonrmhRezVAD{(b{RprH5#^O?H^8lUD+2HER8mr@vh5`c3=9K|sTlX)Sb(BN2 z%6CN;s{fBPA{KbDu<!>d#KywH*Heh~g@rGq5bFvHpGhGG3JX7zK(Ml~@bN^rdio_5 zw-Ic-l`7Ni;$K*~z8%<Fc~d*^s>)b9aD8P<JMf;$3)+E?xie8thI^9Qb0uSRhyMKE ze*4->-%6X3>dF@SvmNlLQ+XSyfFJh~a4_McS*;?b9OXMWUnW=@B4~;}R<1{8^eE45 zOm`mpFjpxaW!k`btv9Qb>BK-eoftuZ!=M>FMPn+v&pOT}5DtV~m*`8J;~1aE0WDRY zp~v-wg?kW@z>ihNn{!_O!~~g4!)WJF)l@fSvE7Er5Fh26zmUi-ZMXWIe|A1s=dw_` zvdi#*>Lk<A38&fxtSXq$YyO3&Hl_2Bg}d(dL2tEYwFOwVWz=%(Ix+7e-ZT4Ri&#;w zWmqid?!4S$lO3}yhSoKT%w#K*!REWQ0!4oBJCwqSKW_xqBZo-7nC*U<LvLwm7WWEA zCRO7>)$D8~S59><@6SZ0lq{iqi3+6NWnpB=*s-wvU~}TznvNH{@3AA2vAv)1JfPT- z-9Nmn2<E6Kcpl5iv(b)3N#3fWY!pM-qiYIxy~q?}!DnG534ti9(uHAaLWmV1h@AvJ zF8J1Ex+_P2+sBltmRBHO5Zj7Ejp*EQj2dGg4fF%6ZfEvg;&LvebX-0-T%#~eC$5WF zt`HZ@JFEp{lqPp=iWYUssDX1CH6DLJ<N5dQRs3XBg+p=N`ea-IW7v)+a1=#pqbL4a z1xiw4HZVr}o2s<K6HX!0?X~ZrBV_DwgWLXZyS>z0$0cgpZki@jqPb358))e%yiT)h zNo`WRe^}9{6iJgsIS$j@#_0^!W#&N<C2)a<{#0+Xs;2T~)gI9-44)!hqddT})V-wg z3qWfNce!C|!HV$fh?0b|IHu&M0LP@YNA5WCZCmzjYsu@h?c%}VB}<-QyiLzZ+Kbi| zK{}=9jVa&0Yi2i6B{7=kKTFEnRPi;luYs%6R0M|Ri6FH?63F!%VkrnCDNK6<VuG0S z2jAyfMQF^EBtB_GSi-|HIRL7P&lNuLr_2t0tm<qc+%}}Wg2yQ&S~Kuf4!B4<Y8yE@ zcG7OzT8ez)pU4@~64JxU6hIkztS#LA5z5fYr-FV+O`p6^QH9*&Pz}q|EKk@VY^RA| z1yM!jD#_hJ4LYecGdBtywBzo{G2DFO&o(!Zp1EyDZO&Him48uqkz?yG3hy-)E|gYo zi3)pvyNmo+Z1OXvS64gbb+!_&?keG&C4I5=+9y$kOVp&|DdESMJRS{Qr*MDyvKoqm zbmq|y9zB((d#JZk^iW^rs@7J^0<psV`;BNV-?}!&ebM1K+0tT_#c2+zrNTj7)P-uk ziyk1X>nXfhfS^vB`22u2=cc!yb8r>WZ}L3#r%o^@6FH5WauIaYiTY-r12rWzWwboW z&eEDzs@~aRstfrn)l<E`oYq)UR;YfI3<n?ZV||^Tx!>3Q%vx6~>o}V1PGzWcZuc`x z9;z0z!p^q&_d!@TW!!I4v91^66BEa8g-Y|zisM1cvB^wSOoF2mxjpFq=HFdl9akdq z6J<<^dnw7v@gxK8;l3V|aPREPGAh%zdy@=@is-7z@z%(b%@NnpGlV^Dz8HREJk=Sc ztgvRaeR02SuJ|2`w5=j-*;QSSzCABZav0k3v#Yh`AJXRo`?<#cz9DG%cGzz`u%S#| zxeGm+(QGXH_}=XJe28C@9X}A_llHK%UpvW?hvdM}_p|%{REN>leD&z*L29fQGu3n! zJC^T=t)*i7I%4-HV|$X35ENmpe*uchc;g#D$}!Gq$ken+CZ=%Lt8vbndYf9jo;1p? zn@57_&l5cLNAzjHqbGYKT2or8b%*vTi}A*aRwYfA6shd49jL8nBvf0knM3&oPnpxR zE?|S8u%y+auTa%F0UulVyyHNtM*H1H>|)=(Sj8GEI>jp%yG`$;qp3%3_a>k0+J#{u z3RTU_eTjO(ZP7*%S-Jy6v~KoM>223Tih6~Q>P_W3tf=I6k`R)vJt3>S3ft2c1EtfT zd+tb<f25O=5ZZAPW7-2!m~O3{$xf4mLkD^knWvX2{8lab)jX1EyUh~qZX?kj*-4ZR z!8TvZY&}c)vtBJaYkRj_M9t2Tb=Ax1g!p>g`0F!gXDS^f)*A!+;vTPPPPKYX*>7s3 zL!oV@=}JA;=Zm5wNpi6-I$P@et&TX>;Jm1x!#r4hy3E6U@S&PpY?pcXLMpb?JS-(+ zJI#X#d-EVF&O9i`+04TmpF}%rm{FsgL!UTj^1|lhf2qTl_yfJ9rz7Zzp4bTJERMid z{3?1MJu^#(Tfd)u{tf{yi<R~+<#B@N^$u@)bw}^xhW&*0e9Gp(diB9gsQw3hCMHxl zv!~9ETx0hW=vEV|wo|?*e-Um#O}VwP@rB{MI_C)Z@7=5V6M-a%#3>-AIybPMJ;iot z?X0%Nl}zL`xb6TLTPiBkA_u=EeDPr20@I@C+@3+tz%LSL{&#C5R{*b!Vhok&4%Xvh z94#W8wUAZF8fiL(a`UqpkMrEFt(eQ{Lc_eAx|A1Zw=P2q4+dI|ZTO!Dhuy)$zTU$9 z2dyX$W}mM;i56L~k<vtz-5Q2#@oHXWU|KP54(?I~K@>juNwGr~*G?Ed<A0r>7N)V= zINHNy8eyCnrv^jRK<3xjXTDjp><N*>mRgzut-;w%dkzOmhVKPO_QO16lSn17sdqBY zyV?|6RAZ3Yo{3saL#(3;)-bS7DshsvjRr$f&O|3UMKHOf5brM(wcg^lS@7CNEO@q^ z3D=8Od!Jy!tsUuAkGSu!-W4P*>QmmZw>L0GH8Ys9l_BO9qs%QHBfq3O&y!<TkrIsB z`r6j)75k5NnGtP_{Sw(NtDm@!Zm0Yiodd8bJVj103*f-2XGt5Qwz@=&j<M=B%$NyV zGjDUb%eZz-y^43W6O)NBKJU+BN}CtH>h9%$Dfh}oF{>dn*Y4B;@z%3;L5m%2s2y*( zJKGjh_f~2r5s9jN9+aFuwC!n%GgGH>+~8$sPMYNfm=JMVmSQ^eE#uIBmcC)Hp)eHo z+XRbRk-nX`7=>7!b=T&ExONmfh7q+^HrIIUX_vI8J&oFY@7`p03Fo^>%;FV4oo66d z;jj9bY01Q~@+35KDs1B6@(reA6Jl>NFl(Xdz^spJ)DI~a*ZVMqp3W5(%teRDbkvx) z<puZNsnx>rsPfbl<u@xy39K=WS-db)DpMHhiKOC&0bhnw#fjn=^x>2(j483LchzR- zhR+nXU9_bxBj7Qzll)j&!(Gn9TN3bS0@k%ZAx${}kH>JkHD=TrO2q1G^`X&3i<teg zV;5H25x1<|$Gb0E8JxJ1#7vp4O&A!C79TJ%vXWa0w1yJ2y84suIN{)q?S7S^JXH8f znM(jnQMVD;_TyTfSaZDbRhj%a;<~Z?M=o-&2x$+XNLjhoGnqiyVg?*RD;hGHqe4Xx zG)Z!k*mWiQ9k0<mwmzTgPf$?1aI{%kNbLx*kaR<G_pcbiuAM9(o{?@*PPW$2t-yBN z8WvW;>lm`TYJ*v<>Qchj4purwjrB<hrcnY_Z4^htZEt8#E@#r#Ef%A-yp>Y;V!8Jg zXWfdo)W>?MW;xwsx~n$wB@s1Y#v-B}IQ8@Nv0v+vt(b6fq!}!MRcAH%#p4^AVS*15 zb0jm5h*VkaNV%fTKlYU?I~mWqn;>{wu3fnvUKRQR$y~c{wV73T70MI`{cJ1F)Z%!a z&hHV|jSYN6;@nLBT<g*?`RuuCzUet`tIB4o5WhW@n;myD{t6@G-YY#^?$ve(I#c+{ zx-;L1Zu*Aib+rFmhi<9&z1}5Cu?<O%%dMh){=S-&>e)L)coEjxyf!wu#@<ISg2}b8 z9Y`4~=Msb_l8!ooKO>_76-&0vPLSDtzI(Gc{{i!K`-Tf&;evpkJ0(PQZM%%fVL4lK z$U1*RJ+^Pmwh2qBHN~Q(mI`&oXBAlP#q-F|+B>DzzDRRm_?CK4vo|iP+)G*B(d3*A zM6fN19!BqhL)XDV%=ppM5e1?I=_uTe@g6(gLnCQWq3wnm>#ohuvf>nnxAk4i@~WjM zn)lN)i}wJ(*1tT9bT6Sy9VQ(pZLs=qs#mGe*HE8~?5*dubE!^k71~7oyasis%BtgC zB=)BsX1w#jyV?$whBu^U-Vd%;80@B0`ROP%*v&E6{SFPP)N>hwo#p8s?54T~J7G%J zGt6kX(vOv=r7a;ar9i^dd%K3)nOx<KN-z`Ez43&M21&+8tfo6}rSpcqIv5%z8xi$L za*QE$*4mAcQ;9JWI36Q`<1rFA9wULvV$MoAR*uKWsny2FsAF6ULrPTVeAWN|#>=7v zN6X0i(*YI0l)sC9&)M>HkBkS(d^*MtlX^pW^yq2Mm>@`d$GRMc+~64b!Es1d-1h$C zYZ?bNI1XuW41IUmnHL)xJI}VM&Hkas#|-+xWs#IL;Bkr5?8_}cZ+3&0bs@C>$s2Xk zKh0HWjCeez0pzaz(4PO}+w;u!(b(*jfiCmEwf8g5L93zEQXo^ev85ThvK%s|I;Q(_ zf~Vwc7tAZrfe>{ENom3c85;!X=k2hqHKj55-EK}A@^A#ePupUQ#<mpQZJ4mAB+8n| z(T&_h4!~iUtvC!rl*0fxOgUfx93~1F0EeMqcn;&XW212Ywi{~EyDUcO@Ikh{rxv|C zg?Mi*y1sdFQXIylQ2=raa9$jQJH#POS{%Zp#UV^u9Kyunz>Vz?hcIbz2$L3vFlliJ z6Q#wW5NFD^P1d5xxY9zrD=8Ks-klVS5Z5CX%OcZ1Rf}$L`QwF#DNSt$QLnD4tqs{f z9Ixv?9Iu1(#&cEse3tp_qxrMVXa9G%=n3Hg{?Omiy!40j*Ps<0<Gp#NV@oGlzHr06 zTVm31KcV4Xx9-V+NAYl9)YwoSw-nqHYu<rU6r=tTJBp+=p8CEKC<<M+@sm03q>j|o zYX?&JMtur&y=GfG$<)&>we14M_(uJ4OI=CPfc7budL@N#)GL-cN?}Po=Td9QCdJ{r z!)qHWg|9jMkxqP3)vecT!zsaI33R=7B9*#PpD|tzfo<NFlqn;+&9XCPYQiH${XR{F z>$RdM3Toa^{dsPzwg%}GxpIxz-de4cWTn)of1hx@wmpR<wQT^_Yf~wFquvLRdd+P^ z`sRejX`_)6txD8(D14?wOKNRG)@u`<aw+PcHqdFxXsW=%{q+xnsMX3Tbfd0MH`HsX zrdNrhuEhCNYVc);uL+-A!m<6Iw!bU=UuEk~4Kow<FPrGm@3E!htogcLGGl5#wlqgm zI!t>@p{Vwl#uLhG-b+Rnu<(^P$4hl~L20}!x0&^-(k@+hMs<|&E8}AWa=&aLvp#-L zU+edbOdz|i7TL-Ybj!NU?a2@>B?)isAiTa7v7%-SmwTTi;jKx+J39z(s72go;t1=F zqO)_XrO~!1CfkG;?)emL(R!pUjmEay>a~Z|K%#B}YHXXS*H$`Em3r+FP)oLEZ#(xA z^cTl_=9H&c-*-GS_9uPpw^QV3+1<6;iGVBIKQH*4)zbZUp;`-L^JGcZ>`w@{Si26@ zppZSa+8=@Sf}0ooBn#0?-pN7+(bkSa_SR~8XS-c+V_P4#A&sgpsqC6N2@^PM)V2DL zWk{xF&9FA(5mOi`$+bFn!<ovBDj{Gb)|p26hWfr0S|k}m+MK((IHYYvH~1mORut=^ zSRb=VMM$DdyMISyW~xh~n45i@PE>5s4);`a%~3sPcp|<nq}p=y)OtABqWkvrJlfpk z;&3T>)i_T_-LkODF{XEhx1dnQXZm%8YS!x|kKAGoSK7dowPrezt8fNa6K6>B%IHd@ z1MjTMwcIPSu+4cF2?=CTo6wWmuV*^BgM~b5;3nc2v(%1~mN(x?I_^r`NS<(spk2Lq z^wdRNsFVGjsPz6+YU`schT&k|Mr|=mMR@Ia{XQNX0L|@PZ`aZ^?V`N!3hfA!)RDp$ z`^Fm7kvwO3d6c}Ru+EmeRm}=$%xnC|4i<OqBty|js8M&LgxkdnA1HBqMeg_w`)&np zpnL#@<3P?gauQXk@a2K^+}*~Ot$%emzM0-#xwf{o&v@<>q<4_Ins47@2SlDjCx`W< zBBNXfJBA7NnEv}Lo}(}pzwbVcJaMGX!bFWYazegDI#SIoF^nem%0cY6+fG>e$df!2 zaYRL+I<)$<@{mrDUsVA>+%cX=Ejr{q!gw#idpRe}h`okbsQ#Vang|@>R@k_S!$)gP zP@0ZC@6b~Y-xw>s?+mAVczZ0oG10&KM`99bap1a$pnFN^=xN56<H-XfwrlurB~Rmt z^#j?s8SxjtzzRGAvcj{%ktlxAzRKT;rMrJdwg$Zm7eKL>A!Xpa<vu;^BQed}sG(}Z z*U56td+Esv3@M;b#wj41(bPBP+Jd>Av#VA;vp!9I9?!UP95QaCIh=#9-E@xKYb)#Y z7^n=iHi<N~=K!ssO@jKH|8X5<J=>S1rI$Xv1U#a%vWfCekji#NgQg>zzMi8ehk~-B ze^U1Q2i70`&x0F|1~dYW(fKx-;n$-#$O`Uo?5k`-CFHq7AA!76{dz~P%9Y1gsJY8D z_a!N|#$e07;85m1cb{ZdS6uIKS6uICYBULqa~{%`k@|Y7r;COCeVI|Od;+=bDR$?% zx<Q1PZT<#8O5h4O{p}FjFXY>$|6N@AEA<lco@+x9?TD*Y_WPG}Fct&|&t6jOSl_1N zTUi-J@oX9GV&ffI5^7x;_-KnK-6@)X%nTyP|2b~x7}8^tUPnqO$-g6=MHlXJo<iCp zZD-cj?s%_MEjupSyFF3Ri!=Il-|j)Au_IZi_1JH>UXhvl+0um68UF6x{;(QPO|!#U zrpUSgf{tPnLS%#^A<NNxw+tpd94Fms-ssy$+DWQCncFiI4xD|6iga=L$1y=~lhOjY zNr#ZGJG!U8sR<rTO>hixo_6J=qaK?oPxsK%D+3-HvKwpJLOYwJJ>kk5Gh~$8{nE2$ z)@cDegl@6@J9ia@-dHg4xQ3P3Jm(9Jb3J-1uY_MgeT9YZwDDZts1MorxThBu)?$Wy zXsEDot>k@_pA5b;zp$aAHEKaK&O=9KSZ-_^RX^grzFv1uXtX{S-vo#0(iua=H~M<( zV`Wcg95OMT#ORV)Hm6S>`=7;XV;gUxb<}2S5R$b=vNj>Yu5e65jE9KxsG7ctc)rO) zx}FEf6#GF@V-uW7JqGfz1MOckZFf2I2AY408U!lmVlJe!cBcJ$I4N}qHN+$LeWJRg z{*<e{BE~chSP$Di>|J@1Pst^o%DEd9rtIrUH`vzk4V)j=72vq^n*xExyjF7X4{zwO zU;4~yNEG#pHK|t7TfO!>$<@<?9XaRx09;gtQtTx8mz<00Y}ClRZGOoJ6(G6X(bwQp z#kJM4k-k~fkws{Xm1D?X15@No#$fBiA#-&}t3v+Wyu&~^!XPk1H3D{BoB;jly;i|p z<npxf4V*YTbQW$0r3hA2eiAOBy<49iQl{w3fjw6i^FDa;6x=tDN+HAs76Wnf7hx>u z#kuq+ChnR`PX9;JEc^$nrWmfCVn56{w;$)grpu1WS-U%4xiwRl@+3#fy3zDaM$&kA z`3v6KIA7M!JDuzye%or}dl<B?%;R<(ChaNy=Qavz-^*N5<S&47k%FRq4{0j$zOV7~ zgZ;atr*}<X{{?IF>(*}=*m#NlE-cvNl1m0J^1%PDkBh_7xII@r-!(b5RL09luK!6D z=QKN}HKeGcWB2uReKAuJWu+`zXEFcjVRwjXHuE&*>(ug;<XXPEvbOmZ(T4)_A{}jK zebx8K8NC>Nm{=W})w^^xV7<&S&r?Gd-1%#kLiRbfomu1!1Y|WF`?cwS^Ha}y?eTz7 zszV}KuboQb?sK@)G0ye5XmKeghb+D&&2GNRzTm8Df6pXYbOK8-&l<|osH9T)CqAy` zwi^)anFEUP=mTLFqP-%^l~(h@>d*PFsU_i5`zO~w_z*>|@-)#M<i+aQ4F=H!L-l;T zXp*Hb?$rbau@SB=3BCQ56rQw6#>jU>k{P@FA?FTT09A=>+HN6?l{+;t!nt(KTdk@J z6qA8cGB9F+YS;B)-TSFt-f&w^a63W%Y;JWwSj>b1#ZaySF%xB8F){8_&EO8o`>I#7 z4&kO(&KLvIQnZ(y5|%wB#qyBWG)C_jlIo9IXE`P23imH_il?__*8l}+bI2q^JZ<@O z75%TElr55WQ*={|^}CDSubhRRzI)hBONzQWy<a~oJ<e@*D}&KX-d}B}JCk~_yed%| z7$%W-bo-W|<6kHB10Uzd#J*7wQyEm8#Nl(5EQLhiO@~2iEG~Rr`h8S^a=2i)sB98K z$2&1;{pjM?ZWqhc4=alw&e&WV6=!YUL=c@>9M4fad{TT$U-nA-xFja-!~aEmpOrcy zDSY0&Utl#*30#`2sxS_i<5cFWmXybQLM4{0L@y(9yO#$r0Am@IPqzPv&m)=H$5^7F zT`vxFhFGTJU{}n-P=YRT#I!cIUKE<`$Enr>Z|BE&sjj>|ZZtP_F!SBf4$?*a#rjB< ztU&qSo}b&-9qSwJfo^Lp0MA@iFRAErT7B-LZGE=R(ML0Py;$VPyYmalM&I|C`KWgF z&vr=0Z`<v67r&&wG@+>}3OBB@<tl1#La#I+n<?FZq;RhCEJ=jZZH&i04TFvLS`$tG zDpGbe{ewPZh54Z)PR5dD%pBUaIA)(@_kzwhH}<y~i%(bwT8;S;XnFKxT!cq6B(>Ll z+@_05?+0Oq5ZxF%{-p!GBGP`@F$k(|)ayMcIrsd=pY_&;j=g*2nJhP_ZDQps*vXXN z(ZDUq2QfY`!K%cl!eM{@)F5zuU(NVYzUnfgoZ|K!l`FAbuc{lp!MInD&-05vVy$Qi zVw@7j#nHv4MS&k?Ds9JXMo65cvOeB9mrQY->^kxb{-Y?$Zi0GQe_pLk!E<`D-i~p) zZoxvkVq>sJah=BCYwpEmyu`)SXE|JEz36(F62!1Q2_H}xRa8;Aif)w2D4cW?#PhjZ zUV9d#KT#1Zs`AdpmNYKAqE~>N3>O!Mw^$;2=XRLdL_im}*rw*<L3b6Im$BstI&JRG z<iq8Sd~_)xGMbAmPi^$q#_ZZhf_BhvK#3;(#cX=1Kqc7<vhdiv>WZ!WOfm;nw74Sr z#rlNcM*%MOz@E#*!5rQ35~FB2ZIwki!z3)1TJ5l{vYD~Qc&=PuSZ@o>FsMmbyedN3 z+^erGwaj$AfgUBDE!~=s&X&|yr`H$K^_`twe@NGV_H-A7bQhdG-P(|DZFaiQom^9Y zaoPG`ecxfEm1q>Z(0H<OKxk=ltWNYW+vaeWe(!EgNTvRgR8lFWicqPVo(&Ym3TbCq zyCl=ty3Cq2vPD_mn^*2IP0?*xr#r8zY#bBQGUbW)x-|&IPPiW{QsWWBr(8$(iCg>x zZ<pilyDWO0-Pd-J8CmCL#4|mnc)aVP-!WkP_F3thS?nLu>78oIFFSAg-##b(#{3~o z%+mBT&cBo;DYmDr15ZTm#>L<poXRTZca>u*SIO%+nHVLTS*h*4z6lMx^zvB#c4tGU z{JHyrb$GMhs0|HaKl3LwVt^QpZ!XaO_>{j~jUmF`_$L0$0n@!|dyl+Jp3iYaRZBLv zTmcLg)unm#Fi{ozihL)3zuC^vm{$f~V7OGDc1a8QspzBbF+ICJHs%i^-j33`>Sv#H z&d_&V?Rzfz2fFE>V}848_bQ#UxGyn6t!dO2DAVkOT5&Yoap`(sW4`7&BCgySr;DKM zvpUQnh|6w*41MqFxz1yYHPf!4?QHp!WnchYrtytqzos4=jsAyx3_g4YQ%`}P=$xX2 zpQEet^Zg$*KW{%De!jXYKbjFpaz8Nn{P_9s^R-p^(Jf7@^K;()>jUTHqA_oMJguju z56MNR$LPE1wU|9wl)n=@nuyXL4Z@g}8}mA<2@bc_J||j~$pWqOo?30ceeDtz&b96| zJa%u2h=kp{E333`K?6cI*Q_gpoD1x<ZHAb4NI=J$+$$`3B|oz)cRoAI;Hp!~Zh6eO zn^kmtA~DySCn&dB&jk0M%HsYH<tZy+=NR<qtkmCZOV+K8dh6s!_?d;~4UCkGnj4|5 zL5Ja~$OmwP_Y+dvnO&ox1hi~1w<n%zeU9=UxR}hApt^E#^IHVAFS0qVsoN+*M(Tl- zmINJq=D<8{0KuIQ+?lKBYY01=|B}1_9PZF^qMx-ur9EZ&Vpe@QPw8hNmQO2>P~{>? zeeXI&i~^_KX|-vJLI>LUrrjE4K=?&v_tMkQYF=ISp_wihE;-fL1uw9YTt)qQRt?-L zYG>m<oR!oZj8P{cai^u2t8C?o17=6vR~)#h)Z7lg1dC50g|DXEw0MN?*4MIlo=E8A z70TW@o}~Kkl(oN#ooLKYkers7O!i;U5oqhb>#hGb<p5g_y0Fe$CknhOtH8Jm(@E>f zpe{V+yD);FY$w6Of+@EUkUlKZ?jE8ka}6sx$XfKhy{>4#%Q<DA5<y2wPDe^kN3_yH zb=YH#23zm5a;i&*M3pUBS7U|9H)0#WBbJTL)DdNKL=E5z8Y(%Mm8@zEilAeYj{_$} z-g@qNX0?*qYMXE*eT$#>c<@##m1MzIs#9J>W4?%rK2?A2hV!65+)ck*Ust!U$(6Ht znkD$<k;EKD{U?N@;b;nl-Em(MO$f>Aj^+jxyQl*f9kYgN#P$&dXRyeh86@d=>qjsp zH7mgek-8Q`oN6jhI!?<Y?i7$tqmHu(ro|7jfR54p03$r7c}{y3TCoKj;@YP0@ht1` z$f~B_R%x6X>YAZo=cJ%Iq1jOs(^bpBdIeGAT~k_Sv{|;#&0mx2@l$T>8>E8q*tea1 zKq@|y=<pY0>4I6snb2lM31}{aMtw+^QMAn<QY$NhwDZR$Qybv8{w{%1>mmn|*ime9 z6Xso4wdbPkx;V2rc}5?y={zw#m0|C7fI0boJUd}3k17@uRkZKrCVF&x<ENb1f`To7 zdkg~3T(OS(?}(~Jb-CFhtGth_DpJa5@2Q@%z}4nYlxz!`^QTl09E^-DMXXu5{pGep zhf$`%-Tp2|eYJiyWh*;LF04tkF?^rz2@cVyA0}L{>4hH^=aV(+`oJxz2Px0+jRPUc zNTW8uqJbZe=#2G!dI89#(k*c{y@%t8?H`_pK7>Y-IP1stn!SM2Z9lutS63gK61f@I z3P43uQdWz-U`mSSouQM)G=jn`jZ&_0L8M<+_PSfDF5Q<Wvaqn;50GTl2N|(E^Ogx? zK-x1CgRJ>RT561Je7bI*^4<RWu)v6Z*nva45I!}SnChJf3nV)@5}Ud_iMAZI59DM} zTC@8SE0GPBPF;Sq%?kGAsBW1wwGg-ThB=m7_-MoK;kjIeGdAkW6hw>KPkcQKi?O~! zh|#_yI{wu>n@Q73IHQV=pcUA@dhN8=3WudXFUus>YxWM8OYL4VBhyUdr<J@zIcDnn z^k!F*v_`agZ8}Aocef0CTMA1_BV?u^Jg<jh!_YAmBD#zha)Ok(S^u)ZUBCz;a_=ET z_8!7o_j%k8h?jCgCrU6+`=UT+25&)N!zfRY{HYJZTPEEbO5Cn1NsR2=yhY{eO@_i3 zw+|2VRzY}$;A`O(f-W1A_Frvm9kJKlWBcuU4P(eWe4y-fT(nw)ibGhtk4B4(9EvG* z#1wUFr*$%)V;m<ozC&!}6hxsK`ljFA(F|d{`8h=)I(Cj0!jULfre+M+<|`j*m&INr zg-^zao64-)nw57iWK6m3bhnA)Qpz+T!%6p@H)5DXTp{5?MFnt!kbG^=+8S2mMX%n| zx<4)@R1IhG{ALYlc@L^IS`QKS*$!_hy0&k4*9)Qs_s`tVm026L%IV?t90_0tgM@6l zlD_r3KKB6YNlbz=_axKhmEHJEUrmnB6QaY9H6+a^0U(#sE}L_6Xdgz3l_^EIz{bkk z+JW_z*R=!dbo*>bHc;6d0<5G`%@A=VcXnHEU&PTi1>j2Ji!I(?09tC!a;{Ps_%d%i z-#t2)yGCd2?<V~bD|5ulm#(CWYlC%wuALKgv<T@|H#+}KGRMktkTVvt?9-;|=^F}n z+4+Z%g{yGf5q4{vI(L!~GgLiQ5{SkQZU4yCI$;@Ztjv1RBT-80jW8vz$@TL=d)sml zI)iI=**#;%XF@MVxaJ!st!aLAZ--v|R_i*?cF8`yls9tu)|DRn!r5oRZQfo^$x{el zELtz2So!_U@A~h6Ave=3(hi_q#q+wmSu}Dz`6vC?YdO~N+voH4^SmIxHlDdUAl<&_ zqtDcAi<nBOmjYhNZ|_jWcGT^?t+!h)6Z6P!+dgzX;M%>sK@`+^EE)5<y|!QElHHh$ zxrKJ>kM-J@j+F^yR=J#3i|CyL_7)ie@`c`_K-^J)SNUdVMu#~sc?J>kj6E5OV|@zC z@UiwD$-h-M>U0#`c1o}=8H_tg6skvPBxmgJ`gCY7*CDs^9ks1jR_@TFRC%o)TPttV z<71U|dhDrO*!l_8+cbSk>w1G%=!{#S$V-y8%MgpJRn~V|<Zi?Uh@_+XE=xC(tSMyk zI(Oom54Bz%oT^7N+Q?cq*(jsg^Qv^CnE##Obgn+@ZI4CHeuu^qz9u=!lyg<{>&(VE zWy8qnt-xz(L7?jC>t}Vy<=XeO3Lf#X*?uARD0nT#yHni~qzl!@thM|~Vl2_l@*hsL zsU`{6;-7Tb{Lh3W5zWDP{Ggo^U{92)93YOGY}wt*Qg9qIBqO^;W3)}G7yHJPb*i;K z3hs#8b?ao#-<LYY#gVQf$q$$vknD7zzjc|t^y$^f3xVOczu9BMQgD6T$h3Ng>s~MX zhil*0|AV#f<LA}Bza1KnKD$c${&Gmt(Y_Za+qb_tuVkw?@xHDm*2hN<8|}_^mh&+6 zWZU>}Z2){~ZJf5JgHkS>5cBWoP<cinT#M@R8ofkW+Vw$O8+GqYa-S!!Ojb`<W+wv{ z-3-{<XI~SrocIXX+1bqj%lVFgy?OTODvR7!R)19Q8*aL5_YGlhaN^yCtS}X_-ZK0C zfK3#B<Lui4Hc|L(v#$);MB%$;Ul6byB?)wIp1mkp{R_mBmyP)t>SCELY|5Q0D~kpm zX#iripZP;J57cPrVp;9sJ`GLbq6CTwqisy;!`>ks(c84pt9=fZ{;ajYxh0knH(^jX z%y|4DOVHij&4RN&1R3wdjz|YP$G<<ocWT@CsP5N~ylT`XhrZ$XBr?JH>QRG>&~#c8 z&M~JP{giwVjpj5G4wkH>oV+1Box?H|s{e)%(bMV@$d21~nJAKUGhy@7i)Z+@G6;Q` zST%9J=!gxeCbJ^fb7Ch)cHImeFpds@n_)5W)ka|DwW0lCn`vp+EAPAnZ?C-btxtdK zxqM2+ae_)$jc75n#C)I%TtapeDK9_WzwEAK<yFPe3*&W|I@@Q?cD;ZCK*NL;Ai2O| zQD0c!M22CPy!Crjc(_f4sdGI~bdkc(F<&;Zluh8qfuP7Oi50ELu6@G}{*|jUe>^wN zB9YEtR{n{&{E6UY3C%i^9fpA=W0RSy234yVA{o)m8BUFfR-f56#3@9#xm2u=nHP(m z*ijX``j3DKWiGkSsSUskl_#Z9rIb8ZBkzs7$hWi7A2%_zJ4wRlU!}ja&+)7847tV= zc$tBzE|Q?u@jZq?SED)^Wt+uXqi>iq*5)$N^DQ7Nwq{J9tS{}7+JMJqan+&kKzVSP zwo3)4+bgR;2-^FE1CSXojkKwq<6>af2G0eJH(*XlI!&9ofnCoLg-+&Bcuo%Ww$``4 zMkQ^Ir&^b2*a1`XH0vpQ(q>mV9A#%k)#WpVoUZSLiZX*V;vi?b%{As{-kdgSW_oN0 zZ_6VkpO(f>3yN$jZ}wTi-+nC?E%nZkyV%^8#@k;-+wM%U2#k(5<~1b9<iLupmO)mF z{%H#n1^a9)t=hHPtXsv3ygkBy`ik{>l~@ca+FtoD22D*22q}4=vrI3Y5u1@v9A(nc zSR1Amncb&D|IWJrH|I%|Ftkbu;y;K?3l_zmS)HO+Uus>AAuef2a+grI3U#Saw=Dz| zaqg`BJY!QIj#1YdR$8B?w0<@6fV4PXpUl`_x{>%Uqx2orKVAr!@s`r`jDR+l!fPEU z-NZHD)QTzVU!wlRhX*x@n!BUFc|w$_=0xrzu}S-2W@(y$Y>@)fZ)_>sc@eCJ+Lj?G z)<H|Lt&hCosJ!}^b_$ube!yoHcivVTuc)PSZ9M0^AachmL*JN#oy?b7NE}{jaU40a z#g{F&UUFYg>#9JYDgtGGjHT*I*}Y!T&i=CH>{GAR_Of_vbCd12@39&Bty_ZJ0sXiM zSz%QKUcAoFVHa%1f$ZeQY$hdV#dUIABdbg6rG<}f8Qk|4d5fQQP^cKPy39JBr(8Wc zs83!w{8tCIH&(WDL|*D`gxZIJ{aY?=wBof<h#5+z&a2qPaCjyeQ}QuKlrhf3G59hO z96~<>sP`&zxf#6XkW&{v-esS8r{yD-yFWz&DO%K5xT{X`usH)wcf47zvY#B}l)vZ} z7H>|Z!E?_{GnPn$AK#HiOcg$Pc_Iz`Wv2OSctgr6Sf49!GOmwJ1kv-wR^JGX$n6aF z=jL;{D@lIlYC-KhoY!f$p_-?$uC6P59g<7+Un)5elw$BIhko~){1(S`r%@<-BxFgJ z?Tm4|Y=hc)ST^V`n?Wd)U3{4@TYNoSUf0w71bb(CqhS<;{#t053o)hZ)q4$!QKyX} zKI*1Gq53u(b{66n7ldu})$AmwV;@h9>!6_JG_*dxeoAy#C_&s>hVfe8S##_Rd^gGv zYpZ?-ZF|`k2F4oO^PD{B-FcPn*D0ZBrQDvYgOXi$j=jWYKgN+-+FgKq^FSr2Y}TAz z%%Z;GBX8EEZH}xJ>uSYNS@E#g7ll^oU>8wjRV<Ut)LF?)#mvpJrt6xxLsSos_spPD znQ<L_wZ%A|+X<7?EjC0lGm0pc&5Sz>(J2v4WYcSQLD&15pZHt$M$StQr`vk?4wHKL zV!2nV^U*^yf&WYCVYaycKJB||Q&huR5z=i8K9I}xxM7q2z-zV%Q^DDNZyvOJ7c50v zFJgOPSC`)E5?~X&i5TyhCX=20?TlmXq-RE#-=2gAiquGH&I@n^tUqU|6bhEgU|6zo zioz8xRBd_&wxpDlEo{Tt9*W<gkbk%juwKQX-Mg0eJhvNr%{LTBrYSPDp4pwiM-ibE zgeDzzu@65A?fEB|mXQ$nk?7V=sqp1W<=xRU4H@NtjPhfM6w29>ZLgMW!PG$X7C!zP zJc6OK5hPDaH=2_BDOGVN6jrICqTo%B>?*!6S;foFR>kJaA(GL)j4x+tU)5Shz_ssR zC<H&MbKJgW1bp2USrgA;td&4mR)4CZnI`)xqEQs3>5(m(A4uzKH?ukaeY>P*b8hbz zrcRsN-8A&CYsUumJ~KP2KE|Bd_0y2Lv2Ebm{GO?Rez>f)R+j{)K2DB3__?3;ZnQz_ z5rIa1Y$)W}H#c<VPA;cpr^yjvo+yNZY71VM(8sOVhDoNNCDYExd0UvTDCeymeaTyq z%0yR8gUxzxg|_!hYcw#`nTMsT#)jJNRdlNxRFaO&ZLKFok2R>pg?#KRW>RcEP5rs! zsNTMZW?(0^Qs|~2c78ND38_9-mV-9YC~xu;jFM`^>hxx+#Q_hipu2*BinD#tMznW2 zze{OdGt6aXE13(Y6xOGO(?azjI;%RobJ3Uy#>U%i&!x&QEWDIrQpr)#Vq?5#>Z-3A zuh;Qv>Q4=HB^vM9X|M3BI@c;m)7p$$b7VS?9$lIyI^J^|vKVgOOR`jqEdw;(%Bj$v zovz3UiroEvNsw1$H?<p|qNtRdSYEVfY+rxdKFaLLabF#3-kF%fwzRr=xLP?BM}{q8 zsKsaAGV-$c=CBkxY@-Ygs2Z@RY34RdzISQKsG~Ux3nN{kOUZZ2<h!9OQ9`~`CSR$D zm^z1iKieVSDJQM*-YIS%aK-_Zh$TFA4hbK165eYPPA5isqZtzJ_Yxk3*U`3wyYiZZ zh3%3sTcAa}Pwm%iMv>lYYMAID_C-&r1`1fR$od#c5%jvF1>6TfRZvJi<&%eAXVZ$r z+E%<i#~hRO0Ug=8;9+iUX!Y@nrR?iiMCwT2$W>3ShwroIi5D+y{Wi5<qx}6(AwRqh zl6M8Jx%9Z+6I-g)&f9W*dx>Rjx0ldfRb-ya$uusVr>Ep<5w`}T?4Ty<kuBJ}cpV2* zgc7s6;9m?;C?cfA!eU?`t9(8`x9>6ARb#cS{J_6JYZFT~_t|_FO+w|bc}TA8yr1E^ zn4A{9BE6h_0z8{KH)$Mmaen>DS=ToRzhZd@qs5>h^y5+w5yy#uP*HCe@!I;r@Uo>m zIJ{)f4vHF~M5?Wcg}bzlCA=~iUcAm(ZoW+)BS~S%H7h!GueGiOsZ_wR{St|m`jrRJ z1NN{&9dgGc5=wNeJzRcfuK7{UCI`f^axocytUPSNMNFCh61^(mzeFD`26;%D<*sVj z!g*XYF9qS@3C9v;zm;h$&TGX7F1cPDF%a#<ApWENIpVbNCA_b;8Y!7XKC~{mSVZcU zYQMFkOM)kQ7^MClcGHM?eKOl&?O>7zL5Vf7c$jCQ`V)|qejE{2Dq6UI-4#qD3JVt! zg9410J0)%!<;$pl2@<hBNQ<QpqNP;?(+BEzny_&u0>rpxcoGCgDcn^pNzFC-t0ciV zfx~h8iV0F^2~tmqN{mGQ%)O<oyrMfgA;}<$Cr~{v4D%C#YbFS*Y4zmVsCs(stX;}p z_6NVpvE(lbRF0pjImtF>@O<0du(0q8#+MUIb&g%oS1c8Ux^)?L9Y59GJ)^lhpVt;% z@yrVCf9rBFm0}N9?9yw3ywC)}VW}>(8)tS*BB)+SY5Hc!gO(*wHL<%BN*#*-)U`~_ z5QGv7*0k(j5%ZL_EL7zwYgy=HrV|8AWh4{d22KTof<O6Y|4*rAue>$Pb+@(`^)BG_ zXy-A76X%<*RXX349W_d*{8OTk(B-@OC9s5UtZI3jG8Ws$=XXryo%x8hI^rY0cq{Hb z8SAqJcLwp+&V-E}Jq)WIgUYm;u`6j8&C2sqi7Xce%vc=n-Kx7*i|0sTb4z7>IM>r$ zXA_|?+zj=&?GcS4UWd}JGr_fu)Ym-XqW3*?h@>6gp&e&4ub44uni^Z0+7|qg8BgE8 zqQT~r`5QA5%)I35U5>eMW6}&aCe<RAo$b{Ee{a%U)EG<<>Q@4FR3)Bb9wp}(_^Sr9 z&p4uEUNy*%n_uAfaO~1Z^L1S7$td#~oYjbp4v9U^ot%x>Xi$Z-603f7P?XANqf|~) zqIO(pxw&3jwz>xSHMa51j)yu>qkP80P+^Gn!m00jq@6OnxK}%o#2vCWsGUsW4m;eb zfTO97fZ~>_fU)lCQk`z&;23wahyGTp{Xq)dsBZ>aujSASCn&3)E$`QBeF0ltQi9x` zr&$`71ucWU>mRjP&_D={c_pD$BMVlSlsTD0Vau^S&LI>zwv&H5bL(g?_6<^JDQzOo z>r0y;!vr*Tw7C1(@~&F$WSrNRJ4uE~<>k5K(UYdP^?iAmGE&Fp2LONWnLhaN{2wAZ z26IYzc>deKF4@ELzn_3d$-??<Y8N%0zZ8{uBq+Am^@JnuCoSq5L)w(LjP@aEw3!LQ zDQH`v%+BGwHsV?J!D1pfRj+MH2Zuv2Q4tQmEe{6uc7D!~c$|nDHEEd@=<wSdp7e~G zCAfeeK8{8rSsM#(=c{OhJ-pAUF3F<CPdn9a_ikUXBKIA&{@nQMsPXs%nlE*Iq%$oK zO>CAW2b<Uwff5s&<BGt<xMyb_VADmh8mC5MVzZF}Xo*bp0(bkh0{YWPB^Xca3p_$j zy4(qZ*VZKLS;iYj5cEkyOUkq6$SD^E^fxOSSr)l1LDPT{LGB$ZvMLWqd%a3z136B* zxaRWI54fh?Z}qZ92`PD@n-ZCMk25i<B}h05MC>GDKM^#m-r`a*Yuu{-5r^IBnfKUV zO%Op&QhKHzua}$d=x1=@R4QiQbr17<T|<Nq%hZNU3FAgkZ-F?Yh(mR$<LvW8RCSJv zwc_&{d9K#&a(^BOX+;JtEi&<OCCg89%paG96jP`8pI}&=#0(#s-%5~XixVi95#S}$ zL=}WSqGa`21X?=dn!PgF!Har~D>&I{9478JA?Uk~3wHIMSmV@`e4sDE4@I0bq|=_X z@38NoW#Yo3L1KZ#{DtmLR+fKeovcj0L?_ekOq8wAQyNXYLQg6g4Xfk{g;uZ;E3`tc zDQF_CUHVS4VBeBZpah9|QU$V_rf9gH5uJm!^&ru<3Hc)Jm0omz)Y9*_^vY*j76)y^ zifm%itAd*xt{E!^a-0v$>rPZpFxAyo#A+NNar>_J2ob)kiMH=lDgvy!nndKWj|uB) zN`x5m5qUr&Y%SMu?jvlSIL;wa_=r*}hvelWG`<H$JG!&0Lx$)Q-C1HybY}%69@Ph> z58YX4h$p+VrR*GCTz6Jfx;sy;+MNTLxI3$4b!W%Cb!Vj!I<Du##))-j#kua>mq?&0 z7=d<owu0I<Q+EzxQ);yc6`troOYER0Q|QiN$815OBF+{Fk+ucGBy52T#<su+bdIF1 zcfp@jp=}F{Hh#Pzvu#0{xC~n$vk?0$BO3F|G_1TGt?m4x$q<}#ddwNZcb*TfM!9jo z`6R4+_!e;lyk@-I2uA&bCNC0k0ghQ}DB*=~Z`>n|vbn{haw8H%5?%|X$L^QsgtjuS zRF2%Q)S2(B^-*~d2b9(f+$Nxefjdl)eV{TAJu7-j8SdlBi_cghYf=}~7Ss(I9Tk+S z9OfCTqXKsCUw`v^fTAMQ!}D8^e;h=_=AFBqea*6tk}dq3L;`nnWfb26;i!1*;&whp zh8Gqe`iJKdnYBQ|7)UgWughZbh>={4#opH2G=eRV2*;(j#VV;Qr@C}p<alk11?pr4 zdRV(s@?10W^Vq`#x|v-9OLJD-(LPI4UCyh?JFCR;^{iLy!e=NFqgESCZw<2QK0<NX ztM2Y4>v-kd(eV0?1`TR&t*ck0<JWb?*Mh75PH7=DxURnzwbLc?<C%06ZvCxIp!(Pd zG@>U?uxMo82cum#7w%sHx%pcs?R8(APJhJFcMtP2Z9|w;bSd6vX`gJB=({|nKXCn! zlmmCfJ{6ZEW~D@#ip1pHTc37YxQ1d!L3f!mb1Uw$T|SWN)3yr#aJhJ<_3z_UM3kPO zPt)Y=JM}*2ilZ*AE^iaEHopEjo&7ena900)$2*r!y+8D`t4^vLPdsqTrKxV5`={z* z{bD|HyBx>KLVYF-g(kZc@ljRl)rLbm<$Fv?-CZJcOr}Ga_lt<0Q61tNXDd*i6J@&H zZvE`hNe_+T`h(C2{NRvSCnQGpLVth@G6q+_v`5Qfrv>u|C>NA|b!N;i3PqzAol9ue zWo&7HR1R4K^2nhWISnC)e4q$Yvux_4W3Z4p)Q*(#OGge-uFu&Wsg)~>6s;-I((1j( zcxm;ILSD9TNKJqWvuA~BB7-9o2FO(tOs~inyL+~hModXDVn8uWj95$3PQjqH<w4gN zlsUMjqfC14My3)rpPNq3=LqP}=5xTz=e}#qg_aYWqiPxR7u49E6dNHS4XySddF}H^ z0%TxdN+40{V)88YbV4EH^eIAA!nL!`E?IleJ}(^6zJWTXj%ZWgiRMOh^GjUOOHWKR zQaS)lDT(^llr~TMn}7Ib1t0Y2FAV3Yg*E#3?)7RUX8gGFaZBu4imGZ0>?Ir?oy%38 z2bZR=?TMC~ylzx>tB}13K|f}%CTNgbA9yx-ZOT+x&!F%i={L0U9=fo_^%993w1E<+ zN%X9q-cZ@t4qP~kNr>4~qXs(EF~-AoVL^kawz2mRxa(i1NHTzOZYNR3n!-XYh1gj6 zSi8{ml@GQ98!9)p0|OPlsTdf&u<~Q=Kygp}Ny1mQ7v?iR9jEH6{Y{3=T`cbhQSW_q zo8bD&%i4hr74CWn<qlMa+JWMp4YX=7EUN!*gmhIh!L!?ef%F#~%{V1g=TmPqRh9)} zbaAE#-pnGkmGuEBYx34eQ`RZ+hJwhtJZ-1;^mtC;?gwzi^a(Kq{Q#8wL~7VRNJ;ML zfm+68MZeqp;&#k?A5vs9E0rx{CnTXMXb`I~KS|~U@<t>Ucg5e!tlh^gN21-RVg(%1 z(IdB;)ljF7G_El9+5ynbLBOZX=C|I^W|NV8I@fN4W+s<^lFG0=B~5c9R=q}ssLo7B zEr9nYG%ofbNzez!8y`QI2sVC3HNYoR&6MrT1bVlOtay#Z)fEpWtBm7Mtqf)3l~rjI zCWxy|`<olALTRzjAyUehfn^6;p*!NnJCiAvufJaPXtON)tbA=pJuF7LG!K_=>}me- z-?YEXmQt{>pqJIt7jy5;qVp-xhZFG6vT_=sG8EC}c6}yr<jn5uSZefif{qXHrx?i4 z@a7S9FkeM)$8CKcFQ#1Pv>NQ46nioj0`y06fymp&SsMun6tz&MK~OVm8+@sP>{ZaF zQ_3u>G09Y=%-D-c^f#yAp!r;WGSxjHv}dG*c1m0&g(ifAX3x$|%^$4Lc12x6<7ksj z=n$Gl^T)-VWF|m=$V}i_WoF*XdC6=u3^f0*A6rFc8SUKB#4L!yZFT7+YR_xyQcSfX zHZGMnHQ+FvyyJz5l$X0*#&|$t>8hd(&JAMF7Db!fr<(i2aGjz{7WuS(rAc6lxy#h) zghenVMJD~WX7hC&)R6uBlQ5mM&~B3JuXPaxDZm>%P!R+|#IP0$?fNh*2<T*AY=spx zG3t_Y->WSw#RBTC=vk}wL7NOGOjvW@U+KJS0t1^h_-Wgf3v4UmFHtmP?-Wo0{W0Je zXr9$+r7+J*kP#4oOSK<*nH{mLQWQ(4O&YJ<`#buf5H>RC+1U@}NiIM{f2~0zr2y|b zJAkn2gS>?<R6kEDWUfGGy$>iso1<ruRVbv>(HeH<+(&ijSv$XpEf2%7*c8y8(g^mV zIctku-PK~h$5%Q#IX?)SNZ}9<{bdR}VfBVmR&NkiQdUn0N!y;C(*6umQ90G+3wS?J z1sCqVo+^@F=oDvb7EE%q#HWbz8M}0tR1zYo4!2X$VLDWuWTHZ{dy~o5bSD!Tk{wAV z>+4P?G9>%eWU~J5WFkYd`&=?TFt{UBMj2&$0WFQq3ilg#YErArLE|}PUqVhN8$w3X z+oM>vlqhjFKj{zLxar8y>}^?c?$%JqDtni#pPao&HD>c2e<8(lUWxY;wq$DBS)Jw9 zD>L(?#t3(*Xi93q_BY=!c5eN?Jf+`5o%$_=^xK|Y`rT2*^%yx#9|!NeG#yjf9Afsy zF5e&FfOOABzFDR`CLAK8vvufLY7R|XyJ>UU41a+J>?jfsN*+OV=?DeoDz^0v?tp?c zt#X`_0nqGzN!ejhPy4!yLzyd~gyu>J&_a$(l2i<nR75)S58C5$T&V+KGh0kuKs8c@ zSdM7a?OO{6jfpjnHhz1&vD|pH%UFLwYbL5K@^=*sOBu;|&);Us@t#-HAsXk+kKG;r zgW+d@$z6B5{>`h*s5v1ZaRJSdKU>9Bzl0i_26SrNqh61C_QZPhtjzN6NtCA<v8ee* zSVg6pzxY4gU=gp0(7?;Ix!PM#s0`EIP|>4$D(?}nB*f)~yZ<X~CFNDnw<eiED%U<e zqBTd)oXk{_j84rgpIxRfEs=xoeJ?rq=BO=tpA3DD-JIrk{;yS}`hzRt7q47J(SLA7 zY<iNl-~-BjLU-PR`nAVa5tJEaHMvx!W7+I?o4+(nJ4%-rh_UTjnXrW~WvHHh{_Y>m zY~Qofd`p_9mh)bKUfnC5*?W1=!0PFXDuehgh9;(YDcM3K+E|iaK4_2U7ViGrE1Wh8 z>#Olpw6OUbqSLM~yv;t9D(X8ofmh}-=JIWZHFXcOuL|go8W?Dv@`zHHr!2?_2%u{o zN8Fi`E~^y9c6iF8<V*Q(LTGHWXJ<R#n;Ouor!QzPr+&RJ7O0INHUuB<n2ymL55dEi zs5ONo`X>=9ihxL0#3Mu?X=NmflIdk6a+G1!Ur~}EMH)pY4I@Z*QIHZ1l8LY<H7-(& z8R^1FqliGNi@AhMJEqzZ*>vhROuuc-LdZmxiz6(S+Z<rCTN!xKB<v7447@7S>JxMl zD5n}swoWot4|HR=N>46oG)Czi-!HDBAsJSxvx!b1uuj~!!J(Xb<SNeqQX)R&Lyw$< zvsjT8&>x%%Op$4BJ++F_IS-~zW-#?9jwwBIvtmk#a@M<U@O)VBQa~KSl)yAozx>~x zI#b_u4CvvCo$@7Fu?pyqVg;s)9iiACfMxkD41dr+cKkRk#FBQZBya~aaECH*T1xNC zdpHAkFStzelhKaq2}N`jgY@F$fD(3*UPJ}DU8Z9%_tj#Mxqh{*FU`!lKV-%IomO9; zosgWJT-u-Ln0-Z(n<N}Kdrc<!t7Gz7q?CP;g!~eW6IOR&m1o0&Bu-;IhO!V+n-F@O zP-_GYaqSVD+>q{|Z@UCuIZ$<x;WB?9A#!`pS)KQ0R_DE2+Jb(!cBJm4qXdQG{4R4= z7?l9s(`_~D1~n$6#Iy}B0kcO$oN_Gc!G)IO6@+!0X#UwXj+nA?#nNFCh|-cTLr)~C zy4CYby^J4HM`3TNkM)TQ!N<yZ@)=VuIFJnLghB>QNl7#<W1A)<rOmz>H3ax0Dt0-q zOQ(-0?H^X>unMMP>|F?n=Ggo)q#gMnEQTv$IEBZxhqV<e*+m^IPtAPbL++hK%d0I7 z<!$~h_x*VB`;W57;f+Xyjz}&xi8{BSKhdUBF55k0tR)#UZmfztt|S~KEa*uSWgfxl z(dxQ(!sCr>oNw`@)@ct!F*0bY`o3S=<;;g4B+tc6NOufzs05$wSXtw;t?zqjs723H z8gslB*4@&YUAua7^vJg`Tm5$TC-aZuQ>}K)v&3UUcdw>sUjw<bOlZQ+H~;epE&f(J zpC7x_Pu0cLPV)KMWXB-=ZpF7@Jb@B-4!MmR;OKD)k1G|&;(8(qQV(^K0=I0qP>jqa zi*pVc7h_*2O(ZGzktPuHtdwCTEbPb#2<-=k{^qA%qJV9oS6)V>=u5_^YkFZ^M2YBF zh;4rJ8Ba!V=}I4m<h}=o^+5dddp3QEHIh41qG`Pf6RiZfJ-T69&=V(+%}zXm)`cG9 z!*p?>Q~8@~|I<_VPfk!;iW&ud8yv+d3TY@LF?FnGHh=m*KJ`*hW|aCTu2e-)szPRK z)4LSSXFaJ>lYOQ#8jcaXq_e`OGT8YpI6Fwt!Z4-VbhYF(j-p7d%w~Z*g?7V#c<MrX z45Fx#9;>R-5bdS}Pn_s1`A`4ksh9khQ0x@K<KQSvQS68)WM1_&+6i}V&Z>a^5RAYS ziRN2iNL|%06g*X{c8H;!DMsI$Tv6w5;L>e+I-`o;&%os<M@;je+DdUprqjB}>+Ri6 z>%~`DZe>GDM8tG_zp?Lak!li-*(FvpC{#SsJ#RylSPVTbE8P9d>k%xgY6@noV~|j# ztzrH3r5oC2kat}eHT@QA<w76&E)K@pY$yB+ne}<ii>z^N=QG(!XmDGBOX5@~b71}} z9DBBO7~<y$dh5&?mT#y!;_XWm2;`11;NSN*fB%I(>X?1GTv}!+kIjp3{WTkD(yvaD z{$L;-c9t_6?muK!^j)Fsh80FD<Y^`=-eLUOb$y?Bp>~Sqp2|tM^r5wd#qjNeNxxVT zS1w+zeLS=DKQ6^o*6h6mO%V0!sWq@ML$li;A(Ri3K<GzL5*`3eSdZ$d-sli5qSmVK zU(ne}AH(&Sim<&i7vXtcQ@PMX7ZmQ=PmMzN>VLr2KyLj;pIfQ9^_y$H;xK1=zwCg& z>KU`tZ@hImw;fLAV5zatr(*FUS@R$8V5zaN$%7n*+`m;Y+g@Arl!35}2Q8!gvG`bI z^V4|~i}bq({dfz(FwAdNN-e3F6;?n;K3t&dOec=RvNVY2QJy{0RLagZw?Z*(v|eNw zb2#T$m^x}2F^FunJ)&oBHdCoac=@B-8uY!u_*b{S*o@~qB2vM&HlTq1kbqLqKEf=H z=f6jpLn@OPl}U_(h0o_3N4-tT?!#L%x!C)BD?=opB<tf1(XcSivQlD+5a#GI9{RKG zaRqF9TmVT$0}d1_RG&djumj4Mk|DG<gM(I)hgDY-Kn0AJfVgTRCq$uIr%;lKDJU!; z3Lmmeo>$9Dbd6{gYE9Fq=P5;}#11GIJN7;{;nN<pIAu}R#-@9`;Q=9Ly+i~yCve~> zTJ@r&LrU&K#)#0`vsF@xQgo{J&9Ac!OS~7ibT`Az@d@ZBbImU@D>p;KY&fXgDAc|2 zIe`|!M;Qz{XnkRJgVa%Ja#++?SpM{AH)8o&h2YtcjFtU%E=39`>MfL5V{cx`cl9?P zr(-)#cw0j2CY3jZ9IT{B$hiuyHwPNg(UZN<ab@Y-M2(+Ou4r-K9(z~ArDM-gIjw6p ze}@u$EqdwEcUpmI)+2aHNtDWugQHkQQJ_K@4r|=2Z%G$&X+|Lv8HH?jg(!+b6v}A0 zxR9Q7A-|!DlPy*`xSq@?WQVA;FzO0X$OO~j%*CbrJY*B{dUHl8QyHb)0FG>ml7<YC zjY1WKMMa*q(C1qzX&X50C`$c$o%#tQ;=hSS?X3Au;u7kM{t3g!pFY`{7=B#hw*J)n z?rDC;(xq9LYqQYfSP(`mjCN8*_%mHB2m=cnNQ^GIc$O*jMPA8g)4o(K;wI3z;+vok zm3>5}rlX<vTUqJGuVvsCGH~<YU`HenlXBfDYbi9f_!Q>FMt^1XVOmn?6caJG{}lE- zxAMK7ZQMFJmQ>666{>UPnKRxNAAoGIJr-Y6ylF?&aKaI~zE5ZhcIgu}jSK#Bnj#cj z*#B7<(zuo@?AOwkY^Du!2hD~hS6h9yHG6epQ5r^xl8Hd-d@ms)4#Fz6aRZYAW{w5; zq=-+UJFiMfhNiMK2aV2EoHmGV`bK?We@&!*qxH(O@D)~pZ_H;6?k{)_W5xf=-n+n8 zQC$uD6B01o3@R$#j|v(EHC(I#QG-T3XwV3#s3-&yNF*dN7X$^x1}Yd(wANzPiWaR_ z+oDAU>m?`(Dk@sFURuR!Eiu-57cVW}v(}ou&z$50QS<fvfB)CRFU&K0t-bcz*V!|( zXJ+cN?Q)KDGtRh~*Eg-1)yEtz%3=yVT_2^I-n8+V#8Uj!(~}t~b5OFUmYtNZE}IvS zGY#1`T&+(UBo$@T#U!+~ZYIY(_PfTEHczD{StD#QVKf^N#cFn>0SHmm63*0jJvnH4 z?&<I7E%uj~ec8lnWObhqWg>=?d}*5UJyKbQ(Iji6d}oTV+fsxr6^FP0&xVFCv2@&! zVDaCL8xl3#r~689Qi4r)uKPBH)b>EKoOHg;Kw|olfuw1lZ{<lOCfR#HQ%??CK^R#U z5e-B3bXaR~q;0z6sc%yN$w@R~lvXGkP6e;z|8TF%EE&Tk9OsrwUAX<{HiaR`MZn%_ z)NoWcybzE*b98|Q@%E-PjkH$OOq&XqJsxirvx1?S=KB)+Vo1+3)IEG74Z#-m|KxYi z{yMB-R5nRQQ-w7h^F0!Jp=AnWcfBRvN<`u!N^+>_@h84}E?;hGjl};#7*#EsU|J0% zN_KTu!gMs<05lJxJ|u)16P0SYSuO(kHSZh>H?Qq$Vl0c0EXXD)3oV=NCu_fZj^1u* zoOCx5CWk_ik-qFErQcLff-?1wT+Q3UlFqhP4>g~=wZ{*4#i&E`VM&hQYpW|ygxM7; z#wWXWB<0(5BA4}BxV(jxJF=#cQf|2r=9#8f5Nxg2HU#3&2Q3RwGGT$-R?){aZ7+}S zGi8XoEpz#vT5y)aJ0}+CEpg{0dQ(I!`kNw`?j$>QQ$${SFH!M93MxF?6>QoMwXM%x zwEnZ^^kP01CXqE)UQe9DP{&m7_>-0<wMa|Tii=+L;hOv`R<nKgt2=Z@y^(s+xD@VW z%xrscrL=CQx!QXL!hLBJ(dSsHU0Ea9{BvnrLQ-?K9nSiTc(11CdEz*!I$7{l%Qt2t zN00hV9qZcRah97UrD*9z+B+-rvgW>^{v}o0+{Vynf3AvqSwHy=p^=pu{)*+s&Z%a< z2eizhluFAsPuSNf!rJP;a+^Do2YYE1X3E_}#?ENMsaV<AdIBL`PjKT7QUqKhAV6<l zhi%KQLE6R8e0?u>>btp;qEt=NO>7Hv=|>#1{5ZiD9qZK6G0v58q^GmZmTj9in76{E zrrUUuHD&vbJiO5}X>t2)G7pJ9vL*qto=mqb$2}fdOKPrZ)4t!6eh=|LxXZXymn;g< z$K#`q?a2k*ty|%CJLaUd+QSYz)Qyl{khla)#VnKDB@H8zAqmuXJA`i&(SD283R2c- zSJO&rhLfu*+K;X{Ud*$c(g3P--Adx={VLjx#z?$FV6qEo>C1{#zGz@dUz{BpNVXJO zOj?VqeqMn@e9>}Zt%YP*^5}hOI=x35%_7CRtjJi=jT<oE?Ww#D?eSFJYgtn7k@g15 zC=nj0S`8S8TO7yq!0Yb&Z26(RK_r&4=ltI)qIP+3amBW+i|D(TK~76+beK<QTue_l zv60`_7LgnTiDD0ViH)rK9}`^$adukPY73Xc$lvqfBkzJdIVq_&O}1<J;to@93CgMu zA3ba36^l*8E24glURxfaCCw16pww%neDqALpq3F;OY!KLm_aQws+Qu>Gcki&x2Rf* zN6*9zYCTL%HsSG4B7)iEOLZ7c<Q0lyR%T(E87|4;bJ9Elk;b&LVNXqlvo>Gjq^QMx zCHFj%YPxCk11&;O?M0e2u-)0n52F%Nzv17=dO`%~hJl>D@W#1lhr@v2w`i4Oi^`W+ zS@qL6++bgJ$i0Zfe*K0t2EIYGRS_iRAkivf633$IB}Y-!YqDXhQF&?$VT<V<wb0^B zj&#HTMUb7)O4+W&3TpjKO|;p|iAGA%%0wHrL8c~~uw6*RuwAH5*e=AZv<r3lYIUt; zyU>`vU8qUlE~ISg8|ATmp{8lA+Qm?oM<tarszXtwUF5L|+l7Q!yU2xbM>h*pGi(>4 z9kvU>Z_zHq7VSb}`F0^Yv<nd>w+j&@`I{IA;u6Q~XuA+qZ5Ls!tNdzBr=^9k<>W^# zv~Cw7rg#bxS}EIwq=Q;vR4qkI5HqNaHZ{>^Z;b89CTtfX58H+6gzZ9NOS=d&C9bt> z7aG&I3pMH6g_Mo83!xP4qBq~UO)4dv8;>gOqL_{R64SlC^k#Y^lPY?3c#(@8`EiaQ z;ekFqvsyIt=@}t4Ai&czrPw4ll7h9fu@;~k-fziX*v=&Nu$>8}Y-f4mnwVrTi9VdZ zmc)`~+!7%3Tiv#taWBOoNuRbUDP`3!VRo0WoHZv)#xT|gB1|f(#86d^2rFR&oNjxf z-|7HM98so}s}fo%o0nKYZDv$0Me`ClYO@n+^e4%V_9xDE2jiHyLNjRH)Wr#6*Ct|X zmlA#LQV}^9Jfx_DrY<(5hkZ%2p1N@UCyFEDaG39JQyi@eGr2e-@~}AMQ#DfdVK0_~ z412NahP_z4l3uJW<7#aIEqk%X^u1V3`d%DX9~C9kR3M-KBwPMELen|REkw?$Hd04Y zr}I!1t!UT+!f-=Gt2ShI<@P7E809%^Q+6@AY9qo{*XN#df+R;?{6peF<s&}Bk&DN= z;o~5AESRJgZ7C@crc6o&Nl9%8d#Rj>9`PmrWnFQn{2!j2lG4=}Be$|S=yOY4xXglN z3=5T#iit!-D;#?wHtHM8L;W^OO0-kDuYx4^_l~;%A9eqC$?h-481BpFps&n*VceHZ z=)Pb}_a!WJUof=6YausE1|+D>45+!51Ef^73X(D~p7Kjd8QV)*dPCUK6k)fe2)mOo zTon_mHuNGXiMZ;`9$i<#5@FSwnO#?P<(?ai-Rs%3IFr7RRlE`$%%b6ScRTf)H_zH# zE|<!i&bEzKPjg3Eh@94DX=oCuO2g8Q^uXp*QyS^>QPzRx=|@@e5D?8Xd+nrn)<sW7 z-OvX)AEuC7nQfZ8tYufPAtYs5DbAu<kjDd9?h}S`s;=++J0xX%eU@@O-_LH9;iRET zcH}b1M#+urBrg82v)Bzl(lY$`lrp^({<i$8BR1B{kvs9ll8x;0#ga*jB=!GieqH#b z$$wos=>O^Ze@4eHowmvB{Qp>9+PTo(ds^LA-`DEjC(k26new*f*`z9c{Wi91)C1<5 z(!9d&CCJO&^i6%T9E^T1&EpCh>8y@Tzam7A38s=Yr-psk9(DX`M3>M1a@6kU!u1K8 zM0k!1?;x!@5$^B9r6-5yI(>bJC!s&og?CKW&vW6OlEd>|_%_MmQWBDRoLRy~hI$4M z$#b~4lDx#|_A%|F>{OvCYk_nhL6sgI^6k6t2hZ%zz>v?^<<acj+*1a7F%^m58-;!- z@V4IGvt%cS9jCWet%`?IJM+_;{>d1C&Y&<t*22rg92PJ+NM@y^Qy@mz&kgtGQ!J7~ zvQhCNR2a?jn*zD>eo8*71v0WB9qn>h%T5jli!i>+Xsu*4;@U`aZD>o^1`&N|n38<i zC71oYaDOcOl9x7J8;@&aylZ1{Z7k8pJJ+VOliS+0=`CEl&k9NEL5ewR;iVQZl<4`P zE5*2y$9_EAFJ)iy(xz+WxK=E#vD_-3F9`4gU!s>g*JiSl*V?t2$*wi;MO@aLwn!#X ztTabye9vu=^9$>w4Vjuol8!XlYx_R(+$I;AuKnybg1Iq!$?DlatM_9k-p{RHr4+07 z+VumW$ZOYSI;67!-TJpO=W&3K%MG6~UfM8Q)>+X8dGR{e;iN^(Rv$Pza@IQsq5R}^ z$`UL;r?|#F{YtTkCwe2L)Jfx%W@&uzyiEvd`7);&x6t_-D$eLFXi1eD#$5f+np>eB zM=f&9=7C*#JFhHTScf@O>~vdp<R>GV@H}!RQ=2jJ{BUoz<dU5|j{#7h#zjwVUPx}@ z3z^Q#R%+g|K*tsPJZbA(4&OOHiwTQ(QX21=iz&HZBqroM#+fK>xH4N(v6p_z5bIz1 z*}t{EygnLxd3+!!#waYwS(MDAg0T{7n4hQq$9?(onoW%(-l|T+d`aBioa%hXNpWue zysI^rt}y(kR%B>PWS&+~<zq4~4vvql<vkN&vmju8d~A|$yushDUCN7!*JH~ra|n6g zvhKAvZO@x$o`ycuH})L1qKE3yP3)@>S_4vbKa0eVFPx4Kyoi~6uIz<?j~az8t;x$~ z->0-DuXl8pi2d4(SSYP1VJAO%w;*a~O<r7flQPa*F60~J;<)6B?-kd-+2Qb2wMRLV zS~4A&VN1z8M|3M0A)l<2j0DV^C$`kSG~T$BKvviy)cWitXfelM%Z4MpY=Syjr7E;B zqIt>mu|bd#%#x1sf@rbR%pL!*2J^;ZM8XM>jnp?yZe#kjpPN<0jf5v!gv;RkOQOB0 zeueA>7w^SLEBf54JkgG($@&bpV_A`QGb*Gg&dRXKXY9fQGb8)hi{x-Ce!YyidH0lh zp%j@YMaQam$Bald@Bu9SMhhA_6lb;^X2-I_J6WG_g&?2Lks1>(Z1%Ddn?dt9r_i=Z zrx8{@gH84tj7#)yP9RaH<YqNds7Toa7Y!j_Lh{)(Yfgi;v@hCw3&opF9yk*D@~>!F z{-WR<Zk44R5lSgJjYyU#v+=FVOw6?`GZ(pjg_JsT&qRPE5O5KatVs)gT))YY#zn}a z0PkSr8y=$02rK`SJKYOgOUu)tOIAzGC4aEdf9mb@c>R0ij^UL9$3<O@rgsZ2-qS6o zjuUxhZ~oKzuV34{sUwNfWaGib{zDEYAa8XB_*!T!gH9M?X5@of+^BCIXI-e+BN3-( zB#sO?t<qU{3C?W3Sl&J5oaSbKuyQH?sngwsnol8@Iv-h2KU}|!N~8icMGkDS!I>B9 zlb14AiVco;OPCv-!d!=ejq&>AufDjmk#*}*lrOIm$ki1Tamp^ndvu+zMHp|Dr&q<R z7zg{YoS^I`o_7ppGcIiGAsqyt=jSq>EoKIk(ueT-AFggA>DJPLHPhO#v%{Uj>0&lp z%fy1#<W0vfUf@sq<_u2;%@bE!D$bTr`Kj&;DIH48#}W-L>J%^K5U1*==SB)<0XAC| z%rl~iVk|B3imQdG6#pD%%}Sk&M)Q~bcpg)`ltrhNnCx$!m?{*1v!(K~gIe{Mog{x{ z{7&uf82s&!@b_1#6xCncG=H^E=1~7k(dzOg{W1BxU|WHUEo3IgH(+f~wR@S94S6~A z<T^$WahW|-WAihck8w8C^)U^FnW>EI;iIK8LV@MAnreUd@_Hs!F=+itd1WNZ>)BL_ zTPUyNU0%0TUi)k@t4%*8&G5xz-@2^NJa!<*QLC~P#T}8_+sPUVBQ-kgF6R0cmrox7 z4TZfDRn<lnr1<nMA0^5o5AvcnmjN+H!{Wq}b&uNhbuW)SKxB3iFZ?iXVmD4>iHhUB z@FV(Fp;X_?k)BSMp2;dY>n}O<7shoz@W~Cb)cpl-_&7a|#yQ|_A{X*SbM@VV3km+h z2csmn^7!CKsM0X|YlQWUv1{x9c2xQ!t2S|kgiOmiUauiX%$6Fg&u!MP3gvROC_{!i zj*B5C=hu&~tumMy$>4!o%wT5LeR-uV%F!J`lE06r*R$}Y2QM-rBfXelWXq#btG?)w z_4`#40uk6lPS<1keIFUtuzuB-$e!%GDs_KttG;rEt%y-{)@bs=!$EjCIBvT-3X%@( zhY_`5cn06k>MIv#VjPBv+`PH&M>0LHqDpi)Vf0kR%=vNZR7;d{;l$JxFFQ?7@t?(i zFA~3dM5TE*-EpZVjCGLsa+gTQ!CA+AQ{q%?(5A6W5wa#Th5s3eBwL$^WKK+omsWh? zr)tFaF%7eILMbxNgcfEDQ#C%|tvRE~^H%)v$zfa@V2QHNIR_!@i!xoSJyF85t@U$8 zm7FA}GnBQ2Qb|4L$9wV?!$?RsLK0DU@3}k8Zix2?>m7UZhxMd|CVkp29PjlKD;+%A zVC;~Ts!99)qCUhLxQ#Ds7&|?l(L1d<ga5fSk-=eob&u5THAVc)?-{?x_lzI=4)G~} z`QBTvR+$X*XP2zq^;@3Z?oL|@>W8LvO0_JXlPXTnX|G+dTgWYEJ>uI{wT8SHXN`qf z^%v0BM9c?lVshTJhzN20#ysj{QYDqO;4m4tXgFiEAy^CM4p>J?OlCpjo4E^<*xQn7 zX_9K`mQ<^fRI9e6Iz361xhq-Wo>`t9PN8_OkFw6t!s8CwDkqQkU{6COWV~dB4kDMT zpj@FUp&TK;POoE}blbdMa4akP<w?V{E_x*^`#IUJ7p*aInMk#`^_4aE78X)9O_tSE zZCsyBaely*hbwntG>;~-i%k1<r=f6ns=@}}rZ_dzbc|LHdJTEK#W7X8WV&8rsP;$K zGeoO}XLT=_Nj{XfmgW(w*`MTMtTt)1<{<-9ep)V~_{?r5k_4Kc(4lqOz7o_*bCzkY zRZaWM9}dUn$9rq6y3_TLLNsktK7m<BwGNkz%0+6a`@Duzb`Q^JSH`5_O?d(Xe77$> zzsu0(qnj~g&PZYiDF%cM1zmF4#`Vcz4H(_Q2I3?&u@N2EeE-`ZDe+~$*vcFza;5kK z5hQ=vPeXX(N4IX&bXPiBeY?;U>6iNT!mRpn+en_s1CH~AkQmW!8RnU*COOy|L^xw3 zI}A5Eq}%5Z?YgW>gi9s2sTbjvs^IXPlwx+GW!#>sWvt(VFFFDw=56xmNvoFCDDksX z=cPsbJKBujMp+P_94?a_PT_DyB3Fk6R?x-HS<#>nMdR?biSvfvrb_7N$r+`+52d(r zlid$PhbHSLRgh*XYwm8GhSL&r`*0C^Gi}V>nv&)@)CIbmMEL_7`_gYoFRqji70^ra z>}6fc@n3$;JyytdR#mmndsCMpL|r~wm2c`O=`W!!Uu2h1)MbPEXxtbrM}k>${jd<Z zEPQG1D#76n$`XdM+`}r6&aW36<t9L*Q<gUd$qvf0L3u2#bG%%WU|TF(t|XSyMSQE< zyp~}FYuPmi%czqrA4uRJL>b8)r7`j)0k%VB>ne0`L5HC;YwZFF@5~_<t$l46YdqRx zrC+nnZ5iw0{wR<A{N=;Rg=SSQm9EB9&FYwN2j?UV?*}z!5@C!`)3pSBr!-HKG{uCa zO<qYmyxdIFvwJUV0r|NL(t4#^Zo=4=ZXr6jzb{kT+}(A1DbO_O`=#{#^HP@VS<#YB zIgVK08)$m?Ivro-zU3Ib891l+Y?6;J9L@1Athu<G0EUXWdRvcvC!N#!-F!w*Hzw^F zstt8&iS8+CVY${gV*?r8=QhsVGr40)cay#oN{@}!yma|Q((*o287qf16l4yS=5mog z;O)_&^{|vR_d*^mu*_3EvFfSL-KZmpVJmcGXed1@bQ2d6+1i2&vO25P$asmBLDo-x zEk!-WMtnJDZGOTITUMx1v$^CfxAuaqRBp)cklS~aE2q(7`N{Z{=ee41WhJ-NtjtDl zH&hF*?~@Jd{UpDoBUBqR5Iy2#&5=<@+>q>32wUg#RwyTY7G=(7zn#x59TA_yM$;%0 zw^-9fo21^Y0DO~HkvnKIu!yFsoe6TVpmpeoW4ENG&?0eJ1g8ORt8?M#an_G`iDT_? zsanK3Ymhb`CJt$0y<udgt2V8vg$ugK*y?(owD_zAcZ(ZgrC8NUyOr)QCepbjo77;n zA10~CqcaU1A!>`H9I_){aUPY*bG;Hw;p>>}#+#Ojr)VhRLepG*ykK2?;f{D2gze96 zdPdf2Z9vxQ{HVqCEpF=9zgNom*qci_EKDVe)TP$NqHu><JZ}$UM-#GPu%Cp9LL|(O zAM(kER-O0$6jnIPu#+rJQ@jY8xpCjhvMdvn6I=dg0Owjr7%TLPv+}|59;`L$$EnmB z8XkVxxg0ZcZJ9)vO_-g_#cKA^))}71i9kC}!^j?kN2lfTrSuNXkES@E+h!)OsG)51 z{K%~*bRmf|qO9!odRCKqnc=TpF3xB>g`8F?NXS;FAjKn@a=DcQRm@H{7N{VaTizn| z851w(Rpi7Zp_>zy%*7p>p0r6?vbolMpkvcbC^|>z`I(7!k`=y8hCwhAIQNfu9D0#8 zXCXUMvNS!^s9!GW^j#G$ULhoXSPvUmW~*Xoo~qV!&y=w&JBd>vl!uan9xdIOQZ`p< zT$mn(Nj-<K=DoF=_3E;ft<RD=h>D(}O|!E=nXYN$l5w6Ry*SA*J#_G}o;1=+rFXQb zqElS?_es<hNw<i6QOBkeh};~hq}C~*)F(LweOr<qh@|(h%+xmz?HvVnlT@9|i%~4H zHcW;IZkB|a9AjxrdTlb!wZ;5KGF0t9b{e_5lJfh>O+Vv+fKBP-vd)Y_50X)mZ^j-^ zKwda6&38v}@kIu2*>VoqC42b7+8}#njNOly5+PqL$TiwL%UtskxJ9F!nMUE)_IA;H zW;kVUlrd&D*5(h3wcQQdr=w@hxrT(qy~Ndluxl+0UCaq{_U&E#z9U8b>eA%f+3WOr zd5eRD93%4VTt1V$_;dLJsx!RUS=cbIF&-WbsN6w>S4r0>Y?!~=g|j<IdKL0)C$|e@ zgm6Hib?}0GnZh*0^L1z-oDPkZctdBx`!x(N&~URXCofm7!+OJ$>3X4Kyxo^bSg~t8 zSfPnVtrR9%8Jd3O`Xnpz^7rI}Ykga{>(-^d{(s4PODHHSvRJgp?9^H+x=|EphAY^T zyP)r?`bKU`bd=I*C6{{x84(Ri%a%Whg|)3M#9PT*S||_=iP?q^rLE*GEtFFu1r)1| z;<!DN04e8wTDrhYJu~9_v~=~_pl+K1jZI53$gRaIRW;5hXN&(9)mBD^ol{~HUK?J= zAq73PYD7KR>4x<rHeJm*fh}!(8C7W$ElNAgNvde}-hYi3esm*DO;T;>JUBCJ?xh-H zD}!8eR)KRHXZ4Z9Bzm%B;1l6V;v7WHI)Q1eL{W%XEG%Q&FuU7ueJD->XX#WaIgWf; z!7fioVvQ1Ic*fv(M%LUb;8u==xyH%;+md-V=V73k``|6|5}LqKQ4n#GqY^la+kUNL z&5zTg63uNrda28DtxBXbv@FYn#5*ag8j{O0p@fUN=%J;H5|~_;7RSm`SjtizY@;ky zzm2kt%DkJ4#Lc9#jH=<ND6}d|2}~}_FjiQWjmY^FP1ya@)BM6-X(J7trMXdrKN7oJ zq3WHzn%K=;FWRbD_%8Yh-!rYjN?_I%zYj%?Y<0nfja2EwGLn5Ao)J1b*e5H?Gq$Mh z{auXl=KfnB5tk)OE0-nkqKpBJ%^j98UTkVP{x_`Q{=*V<Qk+jQIcjyhyyU%Qk_wl< z?bz-QnbuE}FMr>LD%ZN^v5_ArtyF%j<dm{hcN^K(uNX=Rcc?wUW!M5D3p|eND9Lu0 zNE_upT}jlKtlpt6ae(QVhe4T`>3H8rjCjX*7*y5Fn^D4{vtwavy)jNt4&5B>!+ygc zS*PE!PXuXKsvR3&7(K&eN7||+&IJ~WEK^US>7*jER&t(|gIwH`@?aL*!>1|57Ps!( zDA+JNJM@dGL)eUGOR-V)OHknIp=>(T?hsN&)|`J3(DW>`R8AhpbYMqP+Q62SSPbFH zAh(y;4~N?M1!7aKK7}Fq4fCbs3Kq(QR?bc$8E8J-S!tN9@np6d+Rbm67m3F+(xjUd znKH@al3Q+_+?~vahSm;pky+lsT{C7vE(Tv*%G@kVl0v6BGUo9GCMlDqe_~m3$T64{ zT-khUe-cqgOA#bzMcRoJL0ryVT4f~>b!_XX(w-!0;TEH|k>g&@w9WJ^$I%9psM4%C z@-S**-_}q!N}+UgRlJ@(j;5}DWjDW}bLzU)%FqaW12HTOi;x*c*kVaY)ljK<b$W;w zHyUR5v#|WyLf0Y_*=yat+bEKhjUZAadL}52O55?>D0$+G<TlYrJOQ|j-N+~yUEgOn z-EGwCiCSdTTcpV_IEk&*(&wurXLLDji6&0YnT9bZcAv_y3r`11L5PTD)q^M{x7)BN zNB1Jvj+}_EqV*sj*Aq$VQ{Dn2!+o?e#o$K%yt$+zHSg$G_~H)NiEfn$GrRP*9_mVq zlH_TINHNYPu}Cqx<w|z`C3mxWCEwYm>r2bFn+-HF_T>Sr@j9=}?~PE09h&uQ`5YDl zS5Lh$CMWbUCAq_`YE^3_r(~5;KY?5znEg^be2i}mgJ5Wp@r8)l`I4BNam({nlCqs! ziBDXOiODuk#vab7^-@UI0$EWFa@}r$ECD2H@8>qit%Hl`t4T?R4mF=ka7=Z2U&NtD z4@z?TdVWB8$`G#y2Mx*4kY<KGvfZ#q6jl!WgRewc?89+fWum(B>4J!?iihOnfsZM; z^q(zyRBa_k=3>vidHAY}XnojZ_AyUVwA<@pN>y3}4f9iZ_DsR%&0+KUX3tJcl-rFs zX|;$4z14%g#e-<IHO!V2WhuWrE|b<=My_I#t9CELfqzJIokWvry2-mY1^50#`Fx{y z=UIWG9~1rm3+36;%jn_+dYN{u=%7{qUZIUxndHWgSTy$d8oC@|I#3L{KO2%V9&Z&% zpO7n9gM!*^1~xYRLWKmWhE7Mq9ahA!&WxklAnitCG=?(67iD<tz{dL}*@#_&<9vRu zhuLOnEhokivGYmib$=V!*u1Z_2T|ZrshG0t5M?-Du(b7V>}*Ogp{-wCm|_6(>%&-M zD!0>XPthi?UoOP;aL1O}#;ho$OYkz+9+EA$%AExy;zy`~*Lhz0x1<^g)58XXYk~ZS z<E#^kb02Qiru0@GCXI^fP7aqQC2EdFU6`@Tb_NgYRd<kkGN6LgSN@p))Z^|#GDFh~ z%;Cl3=0n5%yj~c~wc!SvdA-);WyqY+i#eWTS{n0*wOqcN{Jg?e`*+dz^pEIU>7TD( z^DR+ugX6vG4sqpmx%ea9+saF*WqHx|%2sIOozlqtK`Z}W^)u5lI@EeQGVrfl;_V2f zu%n}f7InOSW29)Uey9%?6(lW^_D9Qg>wJEQFYORV_>VRu`5EByvy_BW<_F!d{^`Z? zoOEb~1{k`+?3r3N+qhy=Jh}#tP3$6@4z(SchbQFnz*%#?-)C{@tS&TveSEDsQ;0+o zsWb!~gBb4$B7D`RZNrtk(&#kLt(S`?w=eQccEer>9X>2J&EJKSr6{dV1$ijI#o!PT zul6O>h<3^zl2k$q(V{3AQNm(w$X}&%UMrA2U4h8@mxxlvDk+swNrCl4SEVePB&CLo zRY~R3qop)yERkl>dg>GtXKg_(S<ap22L(C%Oqpeh)eQ;<kRX$caCBiX&YRzJRZ`d* zN&rJ`HPM#iRccqH3RAYvh$}MX%jK~vUUm?6Hdgq>Z4Q#7jWks!X<Z)U?Xt8C*O9}W zOvke&A8h-{a7R^6@4)S<^U|cba(vNdMhQ-zmgBk=UsFk4f>pi*oB9)<Gws=^2D9Xg z5<;K9eC_AhZ+Jw%2Pz@W@-Yj6P{7%`?75iSrj+z?ZV<~*HnYtQw?hfGo4rHzc9z`K zn~s}9vliZqL<)_)L3L7-gH%Hn84cq2og1Gh|4H8LsKcQ{rn;dcgzJhO(F|?o&fH!| zB;mX}w|Qp@icT&qQw8aEhocSS@s?@If(@FK3>X~uNxf-+uCqx#d8l7KzSWV?2Emla zPY(P}J$b65Ycz7lPwVGuu$m%D`hJ@qo-?(+8Rc~i5$%vnGo$Dsp0dZ|BlV5j419iN zCKlqKe`t*|94d1j&&y0x#mDnHE9AB{g15SKrcc_14@!hX8!LD_Hc4BvVYPmGugK~O zeR8|y6|a}vT|MsD>%}luey6-Q>E~m9ElZ=+0%L|AOgIeCcw#kYOZF0HJcwn2lm1-1 z;mLW!{4K<!#Pq2s6lI`Hmww7x<QS#f($z<rf3nri*0+9upso8)v!%Fn`7IZ%5*<BU zwjNo28(zATGh(fAa^IWG_qNCEw_)YQ_%wY_(|FD;*^!5k=^-o7M^$e`$@ww4ljjgv z9_P-G^&JrI&BVJ&_%hYw+_bJ+v>03zGf}7a!n3i(0VEn{usll>d5;RI7fXPo&QqKp zu+a=q;>FSlMRps3b_2+?)F)1K^H`lg3LTqPsY_&uJvmO7GFk<CoGt}q^eC0)plcsv zye3d~q;#}ZTtF+Jh9f?acE4}{=!aTA)MY%9TfghSNimP2&Xo}^KTKJM?zq3Ww}ep5 zU(<OyKtxh?<@9(!UrQc1aA?a{9olL?Qk>F$@>ceP{DHzA7f-%^y+IV@7|3mWYQo;E z(9n5)K}OsK;}_p7q--siOWbqNm){C0a3XdVjTk#TzLG`@k=374ds-jz<^kD}A4dd5 zUHy3{0k-;6h`79+jO{$T&Mdq0*rjg8+%m8;fBJD4+3CVx*u*&8EMN~UX(;m3Pt3>; z#|#TaRdjewr37a!lu5FDHcIwzUN-fsI`EaPhWt4UA`2MnO_-du+R+%2>|=JhM72Fl zMuNF+D!~#-a=#HyHlL2^r1T`MrjuwDkqqzbik^qVqD3z%@@T!h^5Ktcomv-B%OrqX znfV!<eR20FyG^0L|02UcvmXFk86k_J;p{|wX`M(bp-)6+vWY}m>5+(NP>!;pdL+q< zq{bTovSc+bJMyCeHOkiBlnPh_S}kExIs!DH#cZewsgb0rAhqj5O;Mq34RP7y`g}&5 z7mSMBeMYw1{QPdd8}Lv{v@V+ci>kUMN<Z3dSX|!9V0SUt^gc<ruA`-%=sLA0CEC|o z)KauB2~NtC^R`Pm#@&v(-s~GvOCP0R>9|@Qk<{~CX>^rk@9V{Z6s0Jsi!7R+<}8t3 zi^8Hh<=&6{v}?+a_89@{R5l&57T(Neim7&Df)Zamh1W?E)~S9~C%Wd8tHZrVI>skH zpYJq>)i-90nAn)_l!w)?N*^)ti2^>Y`ZAI8U9@5Kk8~I@@p<duyg-YN#~_{Ekbkw# z8jfoyn4?E6jU-w}H;lfT5Z=;9acNg>$_s~Y-??3ZB?_2YpYPv_m?#GgZZ*O$&^uL; zOUobNv77#-zTU+lX}la6vVI?r>3STU-j%9<eVN{oCz%6Oq0>7&oW(dWWn<W;+Sxjh zCf~fWhw!ZWCy=;&FxboGv-DxiY;Eq`n}BRFBu7E6fNDa>@-V7z^3VtG`l-==GW8m7 zYZv>~jATbHVat_gj-pUZ<hczp`JiAy=AjgqgpHOZYtFo`?yxBvVR>OT@|v$9j`v5* z=0%-q+KbvDP_mvQbNr}~IV_jV4kfDxbB2@=41wg0W*LEu1o!io5$wzUVJekT)})i5 zhg7-}x}uZl$t5NEC~QWs1GG}5hd^tUPJz~`^epHu4Vwf#tzmVL#kdl(7<WPPYM+eY zMQE<3@mFXJDW(VV?QVIDEj{=OdS3N*VGi_++RKK_UMVEE1TumzJuODZ!ru2Zprf-g z68f{osDoZo`XyxfUGFIqkA{(UM$jFya*08w<5fnG1D&n@4T8>5%7u!QhC*YN@*w$~ zL3)r6ov9Ru#wis*<CO}biAn>v;T0w7RX!x|Kgb9cK~_RPhl*A2F-Vr6W(5C)ey7ws zlR8p533^hg3i_3n+69o+%(l!bWML+C30dBHLnUfC8<G}~9`u7IE9F2k)l3ftL1jw0 z(78(2LFV&akommHQxB#s7WO`Lv-<Ltgee7GgFs$omk|_p3xZ!Ny$+dPGqhgyK7dSb zFHVq5+7Eh8rTrn3-T*zJRzCH#|F%IOi`p}Sevsw2B+Hf1nLS*(du`{!=JU~>d(_Gk zkfrt#^t`6_8f2;c+e^Fb5CnfxX%=MC{UM7x2zo)KgT3@5NN(O|1fwAHs;sB;CAKrI zT|LO@<>*Jd1OW=fDD`x?r<<U#es^^}pf9vk(;Wh>)VKvunWlRRWa(ZDSwG(ZJ+FG7 zL$_$$uOZ9P9=o|59SYs1(&M1pl}e!BD4h#gj9)@`XxOiO*q6|Qn#Mu9yYXNIWaGj8 z(489NVaTkUxrfWqxzKM_S_zqS_dT6gIneJ^It==~(&^ALrBdiFr3KL4N>@T=WhG>_ z^)&PcmA(!wSNa0FN9jM1#ptzH5ZtR_@{L(5-NDd#TDnI<R=TG^Hg4<^bLBi9vT{Bj zx=*dl6bht%Z-C5~dmuSbWdx5yGS$fl{tn%*^e$vE_S~ECK*RQhEbId4!9ZgC7Fw(H zG-T!6V;?uF^n&EFS$eP+RIPLj^nlunLuT(;XpLHFh8|Su2VVO2zRu@O&_gQi+&c&! zR@w_{RLX(m5@bd&8hS+O49L>B1hSm}40=?hw?eCxRzZ&`Jq}rn*Ps{Fs}G^Ol{)re zF_P-_gsf)vgJyP+bo)Y9Ge<&JGX>Ce&3PeozS3w&zDJTCjDc#D#zM79<DojGVrYg^ zDRiOIKOrme?)$kC9|+kvemFE!^^S&SDV++fQJ>F*EN_#bKWUDxfYz$?YA;;^y{OV> zp(j-OI%N6%0Q#}!_fyF7o3TG(np!4wiBdP{Vx=C?Y^9#iMM}M(dZpc=xk`^imbZ<b zGO}GR_k*5PUk-)Lm*XLMjvyl_fXtWG&;#my+5wKvh9+y+Jm?{%JD>#`cNt`Hg9FLA zrqL0yvg!uCq+z>3mhLN%ygD!=xTLQ;N<INuSkHbgjlrJAdAbvlcjsjU+aBa-GPI3` zEr2>Iy$f|xI_Tga_=|cl05Y!zLx0t<IAmVkcSsPtu3-;AruQiHhK8;6Vb4MvH0*WA z;_jKlC1)*-eIYB2MNoy7)wcbeS0f<v^mfRkc>{u=QuR)NENqDnOB=|sM=f`P%yKnU zr7?O9a&#B8RQ2wKOfQp3rX4@}Ko;Y5PtX3ym0y>`To2d|x{Ojw5Bfk|wETub*7rw2 zZ)(nqp}#3z2)(5=8@f-ux&eAhX*pzZpMoy$B=z<x^tQ%$1G-Q3HbWL;r(74~Ajo1I z3N>ileCY2QcQ|Bm$3su5mGdD>tpR#R^%i-(`vwQWKQ!zC$l|VnHfq>9AND7xNyGjI ztyIfdL!9OPp?6i<4>Bt!K-McRhW@BA?uLG+^cTpy`VeZ?xSv55ciY3AbYJK_m1aXG zy%6fGweVBupDJDKr8hz{o6ZP+2brhOLvqI=BlytMc0*lQe@_LFdG$W@FSYV9Wa*xH zggZvP2AK!j9T@~4s9rzlL#5-PkCethA1hr6eWG+T^r_NX=rg6KAxq;0=yMHw#fNQx zHfh+uAj{FVN4e4+1X<r74w?6-L0@Q$vmmp)8nQC@$WtuOg%x_50-2TW!-C*TwX!{A zR{BFGJrep#rN?;bInYB|&P$=MRr&|Wd|n6rR(s=fkoCs5Av>yl0yU&bFWUrNuJkpu zKq)vn2o@@3K#P<zp(~ZTL02jDfPSiU24wyGHRwF`>e^$R_qRg-R{!pREN>^}Gow(w zMUdt42IxPkcQa&qA3^tYkk<4$WclcPtjk9ZWaHIwkoCbEeApY%X0`V=WcHdN?p0&& zOUTM9=Qz$%)t6c*O{Fs+i!mGOpkY@)7UPf5gX&cyWL|v&nJ-z#yRl?2WMOAOa#=DX zxZH=`3t7wVALl$uJ=lLZGb5#kp)#fGPGF9tlyjnML&tb}2%4qRH=v7@_AQ`p)#q%; z@^J{1p<zctmXF6Fv;5-`K`>k6E`csq>RIS~c?&Aiu%}LOF<u|Zn5|)(p`R$7K8n#> zsSdhSY4xct#;DVndu!M)#st9xr3=q+(#y{bf|oVy_s}a!A4470=S`61V>8rA!?r!k z<>MNtQDYoGHV9r*DuG^AI{F-!?s-syhCMdUQ7IWSuP*TPLNV=L^~RUbCbgzZAgk%W zKu@c*=VZ<ylq#q`YsI%f+p2%Rfz0PGA)DcKph_3h4$_0p(6ve<pe&6s60#T%LOnF> z5g#`C+#uLa!_I(A?-OWy4g11}-9IG=cF?egA=CRC)KkO$;luVV4}u*vEE_Vt;~>k& z>CjFp9qXmFUiwpLXO%AY(!W4=YH553^-}4-p<R?ZOy!J4rHdg;<4I^&l|BoZ2ZeMP zlb#LjrqT(JN!NMlE70yLecemH^3qHuG<&GDJ7jTx4VmTT(4Hz?>7_4u>08iVD&6R% zJ65?f|9r@-oC3vE?=;BLxDk3>bNLpuw^{MhJs2AI(Xf3Wi*YE!;Jz9*1hTL>kfm`Y z)LW(3c<BnLkA^+y!@AW3!G0RH9b{IHg3L+*w7*JE@zTj&S_@^XbcUDy0y;p$ZuDWd zLI-NtJ&=tck3xMl?0FydHuMW^*&Ctjl-`4`SNZ_DLFp6dmr9$U8<oC>mM8_aL2#2& z26UTJCUm<}H%ML^lpgee<OM|OK~LyrrC!jlly--fD#f5%lz50QxK$||`n6I&=uV{^ zXqi%Jof{eIp?;dnh0tSKzjr|gY1qAxmH30u!5X#>vJ%>18s~l*V>Wc9(t2p7Qn&Nn zQT%F1u197BOQ3;Dw?Nisj-DO_gEZ_U=uo9mkV$_E*<9dNXsAlxfsRmWhE`~5J!UXA zk++QCROm>R7C}cTO@d7C7AQ}{?t+FX-Rq^FLPu*@+66&yj8Z4a;+_EIYuIVfu}Wuo z>2&Bg4Z9Rtsa{<Vy`l6abiCQ4$aupso_2-Iavo&fkAa4(v=}-;sm$x$4gF5-9YP`3 zbP_8^LY7(~WT~Zd*tA*8DCk_ZG7g$zmLW@b0aUJGS3>ux<;Boc4f{1@mOFCrJwQu$ z59of?I|8auy#mPe)<OrVUI_=<N|l}mRVht_EZr-i->a2wvmG4?9jtK=_;C;%qI4Ft zztZK<9!mE^a^*fFcmg^wUFaFej$m&>HWTb!&wNeO&4H?w4u#BvIZ%y;ErM#5e&(fb zLv<SV0W?kNQ!hPn4%bUG>~v_l(pbnW&wyrV*j(rWrOUi@DRiNRErVt%-Q%VCbD8mI zSRr(g(y5SHUJhNXVU5sirN<zX_GF@RiH60XA1n2NOj-}sYuFXg9Hpzh^j_#5t&by_ z+RRny3D8fJPKM0NGti|P_9`?_=?yPEXCAlAHSApIGNnq$;=T{bsut#_&;q5+URpb! znYo6|hAvl{3x(-IS7_L)&?2Qby!3O(TGP<W7>86Ehpti@0hyIAp`U74r-mT7TB$2! z(roBw8a4>JMrp8@j)p9aYoIi3f44zDSH1fn>jAwMFbmQ!S&DG2(gBdAaU(P$UCLl7 zWG(hp=ohN@4s@MTGh{J3F68K<VcS7BDD4E9^m6EC4f_T3E2SH~^ghUZ-V7~OY1hj+ zRw(s=%u4qwIBICv_K=MNbD&>q*dpjQrJq3-<8A164f_E4jnb!Hx-W+Uxx<tZ90J{_ zGzhY|Cquv2wst*qrk2J{kd?*<&=QUDHFT3w+Ep&@RnRz%@pH&x{0X{4_1=K)RC*h- z)G~hRX8OlKzg6kU(C?H+L#8(w`m1_X2R*8^7BWx&3Ds-Z@mB{ycdh*qKXY@CGoeG& z-Z;q0uN=zJunQq;8$X9^)^Z2bU!}_+i&1=yv)o~^yE^zHRH6BO6|(%M|AHBTdXNLv zsq|3Dq;EksA8&^4MlU`12>OH4vg;VVm6k()R9XS8RC)lqPpJ`Fp|l!WuCx}qM`;~& zuhM$x0j0~Yr@o<#V7nW*-<Tn^6J&YY1A1A*`axD2<Di-9eKBO-uZ3Pwy%(TYm0p3Y zj^_N*UF*9RvMZ3kgRC@GL9c0y^^m3U33Q33@dadQymX`Uv}TDrn_UlGs(LR%rg!g6 zPVcOno!)Y2q3W%KLZ6p%-BIiE1t?SL707(v=2mweRSIF8a(NBvs%5q3uO0mn>a20s zKwXs9L1v{{^fc^qsGHK)UfTaRv>Xk~gTm5<x@j8EK@VxVg?9$Qk5q3gbeK{RWNADE z<!acI&|sx!y|l}3-Bqg*&=9i%S!(A&Z)h5qLx-#M1}|Oar4K{Pwft5?R(`omXsnlA z0)41f7DFE?{T}*Q=?Ul)rMI9@mC}j$nbO~&<x1x)b9C)puD{(1ov2>j0a=^e8+GfA z2SWua9SE891?V2NcOk`Nbd9ICp+BhfZVCWZYPG}tj*fsDHJ3+2mdl?)+iQI+g?3Q7 z8ycbMJ_Mbl^eANYvBMvoUd;n8?&A+~o~&`3p`J>g`mkN8W((W@VOORrA)5()2py&| zx;Ju;sB{dplTsnHmr^P8b|5*L<>@+TUzOelncg0&IOEf>Lm-P$2@TM&tDwV`?(uZ; zBaC_)w#d^B(4iW3m#5btS&EnuY=+EA<D<^<yPmdL?W8+F=F2^hrSX}k9UgOf6_C~W zh0yaIC5_pT)%i7E`YY&9D!t818@=>t=mnKN@1=i-a@FULpdm^f9(So_K`&~Io{*)s zKV&hkfPSPg9)#Y}vVRM*_Hz0f&bC!r1ih^7Y7%7aY8qto-TNTxM{=ubgIXB@?Wl2o z;puHpgP-D_gX*0N?XG%{Le@%NgJK%icb#h`H$oOx^)%;ED*X&PN@?UXE^Y<%vgY>! z=oO`lA#2(9LPu(hvS*#;8=!w^-fo60Z^PERG%oYB3d+&Ak3Hwo-TQf$?h(+dn%Z#a zHKmgvOLs10>F)F=mybHgdcf__$LhiFAoF177r2U}sf~p!ZqFCF9-(1Vq0L%;_d&fi zY}c0vP|AbeQ0eK=S891IWR`D$thO%vGoygUSPcD5eO?N^rF1)F-ai7ptzpkVe^>gG zm(F}S2u@QgH$v9q<x=C<>OnPRsa@*ndQU5%4XXE&r;j~#eASH>GoYO{jr*amG{)=D zdrCXM#`&~L`$PXw|MH-fDm@4Ko6;2M?@E7$HmcrRP?OR|$nyJ@gsI*^f3cN$8NoJx zbv>#l^sdI(1-ei5`auQi!BVJMrMG+O>(F}|_D{&X>hrprE%k#|6E{5=2H6-f2KuMQ zI2*DwrhDmJ=zW!5=A{on|I)ChAWP$I=s5LiFPei{?gxFKdi^1@JOTPp!_I>&?pYgL z+!@eEDxC+JbOm&ZT7CsG%O67@t6s*N950o2gFaP?L6+Jvkd5PKLKb&2^qK0Fd%d@z zlhb6J+?MJyy=>@n)f)_LQYwVLP&yR~%L=kIu7E7=_0X59cazua^_ENHXvp+VhQ3n0 z(U93|fWFqSMLz5X=ot0yK`5^DDRjJ2|F^kDt8@%xdS^mmexZM>y>iIXSPq$$*FAOn zyBh`egsg?-KxXgfkl9-X{imap)hcMS(#ufLNy7dLSsK|4@s`Fzkc}_vA+!89$Si04 z!&%-FO6w$64uLu-9S5Z=od}ubnUGn&+0zrAKJc{jMyGeArz@e|w5;CtVcXIH&E8PR zJRJ_1rxlRpd@huszFY>GFE@MX@1c$=UGAl8AUoo`?e+cxbyB^ocbQWw?FY%qMAooC zX1N^dtYH^I))#Ju-l3>7g8LxrZ=XVsYuM;!?<v$p<6Z`tz1yMBRc|@eRi%$YVgH3J zmpd}hbyMlCki{JgeW`KtAz3-e>Nd#Y&VelMVrW~H-T+zL<xrNT23d?xp?B0?)<4~- zHwv<Iy0f5HsH5~?0`#iV`H-bC2kN2r=0ldobx>Ee_ZU>D_4_JhG5!H<r!n4xEXIGJ zZW<%|eHY^h$YPuTZLcv-hAc)A)LmmVK$gZ5$YT5!+CgL74OxuU(6$=meaK>@|I5YL z73!%m_JS<N>0Vj^?WockFMSiT650s;UCZU)ka^JM1CH?;BMUNnLm-o$0`08Q)4X(* zm%a-1QfV`^i&BRV=?hBRKxS`O$a?L5&~7Rn0PU`H7-UDa0?2w)iKmM^E%US<8m_hV zl@HtPBNw(3vQhah$nx<4w1=klDP&${e(XlV-91f&^40Qm$l}h0_SCqSK^FH0$VSn- zJZ*w3Zud`I++Cr)H11xI#T@`y+)Bt|Tn$-jcR(?Xu?(^puRzvo|LH01Q)gvIPX~C) zgUsFtXm7PQ5;A*JpnWu~%7>i~?W<uwfvmsX3iZ~oJG|cAP#+Cj<@LUR_S3Ncc)gCF zadle5x<Hohc2Ks4#UM-La)?O)Bg3tp)<OrU-qVo9eE~X9!(Q=W8=$@#_Akin4gZ|= zglezHCU@8TKu^~~kErx+=-*05f8pk*qoMz3SR-W8!3<!%wMCo=ne+z8N_RQbPd!)( zg`Rrpo6tcjeaA~XedX$HA5TYkI>l3WCa0FhuF%11WiQCm7ywxt8Ur1x{w?<OTgc+x z4;`X$ABHUM^N_`T$J4fC)~xIcS=<~bN8=s}S==~eamRX^16kZ_A&Yw})L-M?0a@HX zL)MC$J$0f$&EBq_20`~|EgS=x<uQ<1E`bK9<#QpkJPR@_zk)2rgPxv;Ebbf7K#lu0 zWN|--EN<7$j!uHCU)Det_cBOU_h$rGKo<8NFMR|$RHbXY^i|06`@W|Roc`EI7=wPK zG5SDeuOD=nh8+%Bd%hjA(R&&6DK(uQd;rPw1sPoFadE$f25VSXF2GydzL1s1QJyY@ zUe?lm1sb9;UWd$sze9&>*e8%#8N>2Oi!l+Brx`MWYRIIE($m73(ftsUOQdT&y#m?Q zl=O_WaAtHcbc9+N2wA#Apd&SGIAoTWLq}=YO0U-l<!RWnUhnvhY2i`hRZpKl%hi`- zJEeukiYd?u+Edm-Rx=Z}Nek~8)<f0~e(vdE$jWb{5Bu7aJa1^y5zz5!xyaLnka=*K z*ZYH)uJQB%WUYO(*E_zm^RE^%%TM~S?ktbAbbkby^aM}mc&hgFN62Dq%ca#tS}ubi z3#);KX_-!ktUg|Z%yQRmX~EGd?E#r|XXqFW+YhqZIvui}QUT?wv<9*mmwV}T(6K6A z;-ybR$7$H}KI|3fcn#YKSsF2JE||}ULYCUmkUT?^5gZR$YG*>`eWll%2@O}hOT6CI zkhO!`AdB%9WR^dGPS6;iLS{LW8_^bH5M;g#hb+cv(1{x3EXZP1KxX;Jp04rq8&4lY zW-l|#+1nA4r-CwqT_Lk~I%G9C3$hqjLFU1Y&<KsO6tWoiLFU0zp8gJ5>-+>VE1i2d zD?33asg>OzvvM$GRxXFE#eNKhK6ByKJlGLB*?fj9?m>{njYAe=tf%uJi+d4NsB!Bd zi+c@Zaew3KG03dE;^}?Jtb7HXqE_T0p;_4hvU=MeI!62I^-x^t4#?~^LT2S@Xrx+s z9x^L`hs??so_6PQ^@(a_7-VtBK%+G7*^tGp^U@zfqg8sTm)-(dE?0W`1TuSFxo~}| z#^?c=y}po1bD`5zdW4sr4Vk?LPo25gX)$(!PS+T_L1u5HmyUzRsI=Hie*)RHg2j-H z^0#=p53*7IO~}&t6goq#d<j_^`*AVx9UXnngsc|IJuQH&K2}3^{`-ZO?#RWpGu2*i z$i{;sAghm4Je5F}^BJD5g_!QqkGAQR7S85&fxghN0gy?5;iY$a=_<%_^cr-Qdhi}J zRw<oAIa?_cvRv*4S>6tU>>5u#WL8dr&e0gBK^EgW=wxj}PeNQ;!P7T9b>z~*Nh&=I zqA-yThpfa;gDl1rPgg<~<57qrB*x2-dGL2=oO<vsWFG9z#f|YAwjX3+10l=DD9CE2 z0SbGgr*|NnC5^8jOCyu&D^h#iA+whcP0+C6KI}Be(wGKW8oz@qjdvll{I%EHlZ7sp zMqg;6+RK3~jUp)Y)YD3cjN;$tK5P#P&-C&=P4RS<r<I<%QITX1D<?t)N@qjn{c^~> zS_KuWSC2#HRri=n?PO1Np04-woTuJ<yVNE^mRcQTsjY)7wO61LP3?8aQtQLb9?RQg zPYXRQ_w<^lq5HbjE`%(#g^;B-sJBaP1T;xgI|rJqR0owRT>zN}D<JdWJx@FIabZI| zP51Por>{Kiv!9DG+|#9=I_&R!9tN4uqaZHNQAd+K{T#Bgx&taxPnSXF>61{t)@6rm zr?(SyuIlXunckt0>0J(48ml0){30|(W4sDkj87noG2#Fh<HwN2xCScM7}r4-;~vOj ztbr_z*F62pQ~H5US_@58D>ERovIw#?mO>ROz1>S6g)EI1z21A!<*N4;RH+p7b@q0J zj@1(C2U$4}gDj1cpel_q3NjBSLvLs;T;lb92A!vRzwmm$g&0Vwt^1)jHO3lGFL-(r zI$HHUge=|vK-Fq5y`M{W2Wa;UvDXV4sWGyl)0J|e$Ds6JDD;$49`v|UKJ>Iw9C}8n z0D4xb5L&M^8hTD?4D=_ZvCs=j<Dr+7ilIL%l|nBol|#KchzC{BE=sk~T9r<Ro=}<z ztx=i{J*hMY+D&83gLYL~0PU`{2--vGYG|FtSPVU{bUn1EN|!);DJ_L!O1DA#D%}aa zs4<p7@(H{2U^%pp(hBGel|BG%P-=wUR9X%FO=&IkmeM-tZKd_lYf3Lbe^GiF`m54k zpx2c)Kz%f|jDwgdXjmrn52bF<Mx`E5lTuIUU8P=7v(oO+drC3rpGv)<{nT<c^uC7m zgZ`zI1AU-02>MVd7qS>bp^r2y5BgXsANoWo4s}(_1yDDoLdfEdhPrFm7-(Ciu~3%M zc&LX`F|?ghDP(cWq3t!S3X=CMqzAQ7Po?S5j!HA3os?!n7I%)PdC<-(T>yQiJ}-hk zSGpS7q_i0NLg{*Fe~q!k(^5~jdAifnGEd7rt?={!^rc#EguYT*4SlV&7W%i+I_N)2 z>!Hm`FF=9%@-mdB^cSdu(grA9>1{~fNs%6GggPp{2X#{V0NO_B6Ug$m3Ch&4uc6LL zrySzWiq3&n>xfk0>6c!*8nQE>U2+`dL4VK~r~9zwo?i3Pk9^q4{axH?ki}i-!|wI; zs;B!0(AqVPZUbrUO0yttN-*kOFo>3|v>E!X(t;n+#+4p`%;$GKZGV^xtAjZ3V&x@I z8z3(06SiBf(;MpPcF1D%8cciExcfkTbOhcXvJrR^bh6&<tAlLb-T)P9*w3L;l&*(X zXlf5bBQ@+PXq3`=FZ~!Atzny?Q<XA?xVXDPr)k)MkfoLnS<cUePFLv+FI@wT(Xc;3 zXDGc4nJ;4wPYc(FUE*m2bf)UP2c4z#A!IQ+59QoI!*+zuR@xOZX)g3v&E+EK9F<-V zjZ?bG>#c;wYuIB@k<yc1+VKcRQMGac^r})LG(q*&K@*jpgDl-9s93{3g-VpZ^wL9* zboS1JURHZ6p;wgt?CDca1CB}y*G!xVF>RogltCPpp&1ZEIn)SEGOwV?<`raK-IT}N zQNw-<l_}i~nRN0nm&P>c9rfi_CIZ{5<z1MZ8Wli2HEbMYS2Y$xzt<Q|Om}R~@EP=b zP2(%b<|?C^+L*KyqGRCmG-#RX&4KPx`YCj%N^gSh*0A40e^7b|GGEp~%Qfs(=pLme zh)#;-&!KxYtmAQbptK(}PiHbiA)ALSf>x;XXQHS1_!zRh?Rh*cTcrm=_bVL&S*g7X zncg9BM>C)+G>xA@cJ}@{WM1VCPYeF2R`Q_-l!ilQ?_6j*^?o|^pi1XJ4=K&}dcW~{ zE1-u}x*BR!dcy0y3t35aJHgT3&??nC2zo?m0AwCq?Dh5=;bM%3xM5G3W^tnXsK(e0 zTCEg=Ebdj%V;c5L=y9cAd1?O1Ze-ZxX<(r{pRR<g)h&hAXxwGcTBUm+OCx@YE6H=9 zCscYa^rTWHWO@%ng*rN}hHP|v0Xkhv_aFkcQyS*!Waufiau&2sX*^{1YP{Zco_ddR z?Rh9<t?49B6QHNn%4Epe)lVSn0l)Nm%RH@yp3xXjKo+B5bXvdxhO#e%I7mPjK~}44 zAqHl`K836$4n5U{9e<ijZ8Y?(T0R3Z%iSpo^Q8}D-XG@aL}<OnD1<D=GRR`A^?I** zdLMdDV|)x*jFZPWuO@rC1Tvqm^<j5;dc)J_o_0TjqlVVy-Vnu4e)G?CmQVFG)6*hP zw?cM2ddi1&ILpP|eH=#vvkaN#>5%o`C!v=#M=wEtR(cJx7ID*f?yRUU6N<P~qjaOE zLngSeb3NVS>BxyrTI*@YVvZH+%dU|5av(%ulHUr*yt)-SOvC;R?V{AR#Mv7MO;Ibw zkXbnoGAoBqN(<L4u7|9>yyxlM$u8_Co_dzLupCeKdwR*!z%s@)9U~f`2bF#UJ*4zc zs7Af|2r{pZJl9FbdwLV9)v@yf$YvBBr}#5ms7|GeAd}wWrQ4OK1=Ca-gG_oTWM{`` zK<BHp)Jtc1>6_4WOV>*~PIYltLmc9$g%_b2s`n;zfzmsWwTREWUV24ZaG^@Khs>A# zA@ijPGJBsvGgYr+rPJFLGQC>J^e%yBsoo;5cZ=8STjlg}p^H@Sc*xQn3z@y^&r1s$ zv=(lHtQNk6{-Q0rbG3`H8)PwVghpu2AAtU<dTXKAm7azy=WjtaGJF8Nq0&zw8wC!k zao11^A=9gYHmKfo$n+L@=?&1ED!tiDH$m0|y4Sk=UI4wLdKW`x<z6VRK0gC-)17)d zq0WWXc={b=N3}+%!0H#eMoZ{bXrzYy1G3(eJI#4;^ZCx+K{Fh6xWG}3r>PgZ>t+{2 zmd1V1^_s>5kfpH>vNXESba|TwSw3F$v;neS+jW+^)0z#Ppq>t^nOIU$TvAPz^*3yK zSxrIFgp%^e{^%K1C9-?8{FS3FN)lKT?&p`(lufP}QB;+*UszdFR$EqCfflQa<d6T3 ziOU|_qN;dF+2qn%+YOE>Evi1fthlx`vR^c@wxoJgiK>WP_thGA|4Wh`Kel3GWpP=> z<WUn#OQz!OvF4?0CF+Qh+Ul~2#FhQZsa4{dxG($pWz{7U#ZgI`{o^VtYNPrmmQ+{d z7u6Q2XUJv0u&AtBJz;+|j!lt3jbAfS(hH6&np##q<D??-MSf!R=%XvA+n((wr0my~ zmq+)9*Bo6`QzEe}#_*bBhUX`CgW)yDl}#@xE-b5^s6`g;pXTfjuPrJsn>egua(PK` zVj<6u6vp`*!`~S}0ZLR>RiwCrFvFB~O>h$OlPYV=CgOXcR2sigwMEsnQt!GK?kAP3 z2~;mq!nz+RVckzE;YhqlNvmF@q?7k^%pWiBZ~Kv&7*$&wKVAJUK25d}ktTSmH2U(g ziW1jK&5gi^k1j2nIHjVbh76xZsh)NkZKSd~IIX0*Mw*J)JUvJL#_)GWaC(2ZKinT4 z1E0ZPq=6fUMu<BmZ2eU=MRn3BYOCwCr5rP4Y+-ffxg=IIc34#vby%c*Xl!luw6c=( z$CgZ|PgE3@kDXLqQc_DF99vU8ajaSyTQq5ERZ(?K$-xtOE6Aj&<8)_Stu)VZQ;0Pr zR#q{MW>FlgsGB;Wq&ikPDW=kxNNc)C5xDwI9luXqBtoB>SjqG%JS{2i63mdu{8GnD zm0ql*f<9RyMkbb&6xYORYO70%rp9W@E-2~JhMn5V%GlJRiWw0vV#RdLZ%V(cqNZ-r zq_T-+q#4OP1w;p>Kx<-?Dy!9@8L>X(hBv%0I#gDa&xlE;_@&NQpPD|!QC}oW6iZD> zNd-p4MjP?A5X;hY|F?g8kh-R6Fn*<K4<e1Jw2QWdg#Xcav;(i0)C?l|jp`@r-$(n# zdXL8U^`3~Xtu<ONQT=aU-_q_=*LT#e*0=W|QPZjVO;Wt#r1A>ehtzR<)vs$WE$T}; zN1~c*N+woT6vs*{tIICn$Wl}uZMz6%qzTLQJKFPQLmx<GuHEz7-sRU`_S!nmwU>QY zKka32@4fdPe$r{f3Wn#$jvhAZ*dgp|5^PUC?bwmW6`Xv!hOvL_N%^spkBj9G8$Hac z1zQMj8UNIi@*@Vrj8xT(t1X&PUNWwzxH!>Z%Q#9;Pim3hC%;uSl@rdbk)tF1bxK*) zIF2~XfriAUmete%v5Do(3)vQzl$T9qf><3Jf8_p2$$zi*8%;mVcDvats;Mcdmi`-? zR8&@8QXGS1dc)yN4)c=;i}m3U-(KZMed+X~dYqPI;iz%7l~YQXV$@Z*Nx{|>XS@01 z%Ck+sCe~F~%h6xmjFr{I#`l@Hf9!l_d8M*fQ&K+Zps?O)0>08?ZT%+H)%xjF5oSv< zQdL=2QR}0sOYK$OZhknasJuodic}_llfu99;@0^uuPiDaH>s?ooc`piq$pOwj3>rq z$J)MkHgz^7langzIA&O}$%K(Pr!*=Kv9%>dI#+UO%eKApo2bWVJ}Re`RG(kXStXrR zv!-o2mfff30Md>fLZO7e)bV{ekg002P+KxtCVyoWu?dn(F*~6$X~1c({KU@cQ(hd4 z{GH8P+nIyO>75;xIR_{$tCors=j23KGV=}j(2CGpFc~2mwWZR{V>NXXimI!NW^@Ts z*DLjSh&v;7(GJm5`&e<A9=D6CiOjG4@-Nn?qZH*pQTShbrYCk2<yTudZo&*s`iI0u zgu{J}oYS@#?}z?h8t=E{$CeH|?NuJN{l`tHD=X)uSB|jbm<QI<%7(-$Dr1#(wR)te zt&AbEL9B)j->&sf{{KhQcMa_OlxJ=KiBpTJZ2s`yINttmN{=zTyqH0pc3R9?inLR^ ze8Ks-T)9ik3AylB#33lV|A4;7o_yQ^;SsFuc##PS`ZC&u<G#jhJ03k_d~w;d{bNOw zWF}Z%R6V&Q5w-1j-!(mVZAJzuN~73v)^<AI)jvkPiBn>7B%M@VdA<|^hjaatKJxwg zhgF?kf7;6VXxsVIbN)JJXO&eY)kPItAYw`@$2ZGBwwy%E0kvOZb`us_th8pr`Q%0O zW@t=xN*?7Gn^;s{&SBDB_-@+|S1+P0$5=ZfX<Of4tKi}xm&W8+Ty59ZB;B^-kxu0l zIU1Ert*V{jqQ$C9YU{YP+;+T3do$f{XxDWWrIe<gB2-C7vkP7aA6!yVeDJ{<SN>}| zJ=)#*a-qIoI5VuQ+QM|O-P)6so&4IXeR2n&wq{~=Syk;pGN}7`V<g{Y6=k(Uw8f3D zs*!1P&Hk~emBn?ONio;2sH}|@P2*fk&RVtD+SR{_lO`nw!s-&n!ji-g$gKcrACowU z`v$40f4}k}P2YiI81`xODIVf-_<hQstJKxZc=Z7K-#C8$kY0PA|0n7%Y;NDHKSt}P zz3u(bzS`q@Polp6|6ZQ|TiV~mNdv}BD6cE28E1z#?%Q)WfLTXH$z<*{PAiFVXP_ij zs<$o~^uMkC_d7nQXaB|H!z4Qxxyonz{rpeZ`|tFZ|2^rsDr&F#X>WT!)OULvZ~phR z=O5b3|Bm(|$Is*oS`%3wW;b7IV%f5aF4q5mA+b?)6Xb%tyA^qG?9`f)*m%xHrxr~q z85f@H?axgQ;<|G&8N>d+Iv)NozJBw1t*V+I#yh!o)PDD;e<;r%%5&@2Oa9RR+WY#@ z5B=|l{`W)wbL+9A<I4~8p&#Z$(f07e`JbKt$@!67i7cq(hV00a$*f>Jnx*>Oa1YOo z<d$0rCrGJpkG9+S&kyzSKXX1V_ZhjP9*a$^Ii|9*x;PdqcECChZnefHl^0F6`{$z= zMCI8fSu;0*KOQ&Jug|k#om-!Q7u3mWw?2m*JYZ5{b0{WRwy*y<asGbi%cU$Gu?58c zo%ZrWdhI)(`k_33D9>**KmGRYB^EoLg&`6z#;Wi>G8ARY|8AYyH_7FAD6v_S!f{d7 z^vBs_8H#)IEfl&HMX}g$)skCynre$Aze%p6>yX%4RcG@=SnRCHXP2@tCU#cs*(~ch zYr@%;wY8N~V`mkdT{&?IYnjd(b@q%3)?o2$Xm}BFILGcX9wZ9g^6Nyz>l*fS%evBY z>tr#M7t4^XzaPfqwx8#$s*zItZys+*t~y-c+Aj5zu(!3x%UJf*qM9kTP+MGx<xKCB zGhj^M`p@@kFW=su|8{zMzo2qdZOK%BcfienPYM^_*}VZ-<9G;vu_7K`mAeA0ll<QE zn?(79)&D)`O9^{hUH?Pfa`cInQ+d>v^^-iQRaH`aqzyQBzCfR;8a+TBKOd!!aJ4*H z*z(#~mp9qASN-zb)0B$J^DC%@#Nu7-$ENW_S>z$Mc1w>{hZQ`1(_Z#mnY5QZ*5J~H zOQ(umW4=nlK`V9rC6+cuo=ug(kEgwBrbx|GjtP6pTW61D&K#`51C+NW_NKA~I(*2% zWu9$n|5~=Mt?G(uHKs2aNTd@hm1iw#D_xSYX^DL)pI9{ys!ikh!wP$GM6B8ZB!<e{ zYG?8g3Cl!lORb;i`sT^9_SjO2u6Is6CDo4YKfA1WI+IIQWAjv%t|%%mAs+;}p<5kk zxAyhlPS4g>$Fj>yil)hAD`oE5u{=vBmCK{Aoc`()urb~5Z<R|)YB;+|<4*qp{akss z8D3mj8+|mpO+D>n1H-;MP}`nVV0+cyRv!;I1Ze-Stk%5Cx@+B!_Je4?Yf6e_ZpwN# znQ-!4r|xRoYft|vH~%nUG>!HupVZ?}V*VWSLz1L^Kx}gPjH*(7xRXb>WJ!AR0(Du< zt&gb6nsF`2utff+{Pj;&;C)P%MCi+XV){S=PukQ?Wf+ljoc8js&2}C>9}+8?pr=&w z2%NSrhECn`%!qDTAF11t^JLR@zvEa_Udbs^wT!)O9q)YQg%>yNkrtjnO+1wIU#Xv# zenc9zj600wEg$f0ulh*czFYd^9?Vx~^l?os{IG0f(_a2KlkH_Mb^ekbkDppsURzd0 zPi2n7A(Q8u<UuE1G8D~Yd->z?*Op&pyg!Qv<R?a7kJHM*XvYi<{&)Oq*)IIx?>ZWf z74vj;@!9=&HmRmG#v|_KbrWUcm^!~L?YYs&cU)&LS{0h(_R4RY<55+mT-Nr#t@EGr zovD@8JlF3Ym6O*Q`OHK!(Qf`1SL^v^tg6nA$CFEJTQ;eLHx&3JWAf-;<y75|(Vzrk zHRn}}a;&&cPFVwa15`L|4eWM+%!4b-MY+v#swt@rU+JK4U2p}Kq#u1AP!i%NLz*0J z!riTGA4kih)3}y&t*al;=AF;U9kaoM!zbsk{|)oRb}RphT&j_iBg+=^G|ra7eVN~< zZa0zhtmw&=luPx0>3pa(Ii1vgw(OtZ_Iyjvp|px))28W;I|GZAmbTb;ax2K#G$#+w zx58&*8C(MS+d6-@eEq>}9en7d<Jzt#ofFwIQE9R@jBB-}TpEe-_MKzm!$$h{>sOP; zN~){r_4fKQecn}a^!?f!FJvpW=iRMzzOOx<=Oh{Ye*XPnuf57|YtP5pE4}|+?J14V zyL7JZSe152hhUehcC1S4(jn+FvQyPAx#>aow0(k3;W0mxce1ACbO?6-s7F;A9~9Z4 zI;$#;&x!P`W}gqQWL?#@D(yh_?`EG5)a)_<TW%{hx9{X_yEM}Hlu6b|;)U@o%>#X! z^1fKr8PGNKC)>+%MaE}nx?F|b1Muf6{5dc^=y`LGs;u$I_*_n}>YkS7fEH=XzKiR8 z|4~M;N7|0TPE|XO-{tspz9Bax*fGp|BWdjt7x^reOAA?_P8yOgvE|B+kF;z%po^8y z0Q?ajM&bjXSP{Evo%pH<Hq&-Z4|bg(A#m69pzA){RCN-T_#=t$e3x<_iJh=cwA`cn zV&})-U}pg7J3DUc?78iZ>A{W@wyWx~C4ZuJT)dX{q&<wJ{tsk(6<a<svt#vkRcRgh zu8QPa@>fm%c1{m=PTM}{;mYFXFb~ddm$aaZ$fE6MB;_pag|^_!UG!bu%GR|fxApd{ z{q1tJq}xx^r3wRH$)2dgmbP5mZW-?Ooo}KyfV{S~b^5NX`cbFPQ>QL35?&qFaWpSZ zPul0*VV<Q7#GY&={c8G{q$_>SwViDApGRNpZy)xp>TrKRWMAw`_yFuYj~%yl@myU= zdfStp>|aIQxw1{Q6?;+r?L+<T377b8|Ef^0I<zZoLhMO=K6%uA`_48d+|7R9biR*q zaL`rSL$prBCzqDny8ac`jrG}4zR%9)OFdd{cZcKL0BrPR%$N|48Hc3v#lv1fmZUW( zop1JK2R((w{z!BWm2qKv9T$B4xisC@wOzL#meVdLWd!@C9nsxdI^#zfcKI0Bt{?4C zmDVpK*dc9?pj%bf@xC5ieY&)x<t^pp%FDGo*B(V*^0foseR6$hWF)_?tlHW-zoi~N z!cORijm^9J@pnD_Cr!qUN5XOAkgz>!8THgMvT<}LKaSo;oLz==2)6%7YSUIp`7!dq zaLf?Dq^zAElKueNhuex=^5^tiIY~bnKtFPNa!k0JeP>6?YXIdY<;57aOMZu7_m6CZ z7iY}ZJ-x3R2vc3gvEJ~hj1}p@Vo%FG#gLeEkf%+wGz;6vyU~qmJ35kYfm@h-{m@9> z*KZVT<EW=65(}7;``_O^G4GA=XQbwScjANl$<fmN{tyXoa)E4P_~(AtMD%+`_<5(m zme0-mUo?D`4-JCLBm92Ew+kZS^35CfyDgH|7cP+P*^%%+MR?zcj<hcK+s^^psT`@@ zZ+#^1OCxsjyE}~__&lPMlL!v@l!E^a_LN-yg^_UoLLb7mkA#;-?BqwnXGQph2#<(x z-$>l>_L)kf^>uwjr!D&rM{GvzPmY8~ZAR;&K2kp4)_&CgHq(mOKRME7CPjRUrYqkl zbH9%x^>|LC9A-KNw(>qk_q*8v+eHyRFT&CObyOrg%1a~RA4WKu?un7`J?ZW4cZvhH z^6qx`i}JfJkgfavfdriy36HXTzsmjQIAFUq98Gs~B<_ci^895a{H;iM)Q2c9jOe@> ziF;0j$3-|jqAy>pbicbDu;rsJ{uhn=h7S$&dz)@IFQPv;!p}wc#R&7cF#mhPQxL=> z936+F{qeAf&X5Sd9^u0y94&|2BjM5U=e|hzxe<=`-;*QZvL@O6?uz84vYQJHf+r$l zV|F4q=+_4C5(&Q`!Wo%~ol7G&_e}%`at7&sCr5O?ityu3f$dWf{XvoN?b_g|Z&96X zBX*XYnuwg1k>DLU(z>5~*Tns*9I(A4!q-K3_lQ0pvGKq2Jq7w@7PlL%qXHMmwtu9Z z?-L1ct1j9KkLLZ&h(DJ__{z?S1bRlsqTM1oA4ZPLpGV4y5Bd4u>5;n2iiDSWjUd=N z!q>FH4@AN@M0m%D&5I-9=S4W$PIiriN9P^`B6bEv%K4Q@9_8CL?zb99=Sw?5U?k03 z>L)$u21yC02R%IXgmP8d3zB0!=Lw!-5R+cQdP6(#mmWx8Gm=_7TBXw0*QiulyHPH5 zqDqHCYgL-(DIXf4(l{hzRJuNeU{uKd$toQUJ*m<$p2k9>RXQGeiof)r*i$KVhDyt! zbt;v<U{nj8rPArp(<+_mX*P7WO6Ne&@RuIU^RxgOr_x2xvnsvX(_*MdrPo92Rl3B} zQfQ(|Z-buWFFm-^(=w<;rOTn`Rl35{1JJoDZG`^BU%J+<(OUMaRVq1rL8X$qk^En$ z(wCtZRr(iC8=zS#eH(g-KfWaE={-nhOzHYP)IY2A6aF{a1kF?F*N}|rbST=PQ3kY7 zr80KP{S?}trykH1DwP>}xk`I^l2PeOmCE_aRF(Gjlnwn<rTw4^mF9So^O&EhRL&bJ zRXWs@97lhl(tM~&rEyO(dfuqgLP+{)dNA6PTyeQYrDGvEVx|Y<JrzU0Q)wwwqtbFu zeE2K4SEaR3txBhRnhC8`>1?P@rE@&ZgC0`p0!U`&>A|A^!`iuk$5~bTdrAuwD3BtT z0u=@fP_&l0UjPpQ+ESpGKnql@CTWv2p=mSbQc^@2phCf_Q3_N+2w1R6(WphL7LCBs z9zo1e#40FJP%DB)tymD{|E~Sr_S!Qkp6B_`lgV$*yVl;{zJ2?<&Nrd80c*&3H)6@W zJwA3vXboUJV!WHM`iysTXl=oI%y<W}))?>B(AtLeJ>%VuC0oq#v7yj<3~Pt+?!fw> z@jek+!&pBs-lwpxGTxn`^(@vC#yf%~#}4DoFJ^nzF4&XC`x4fNjdwJ(c4Ntr(0KFv z%`&f!H@~RtSus36HeUHv<g)R~uN`~VB&?^5SAKo^8sp`V+P64y8GG7z<=4fpHC|4% z`c^I0PTtIa{J+k4InCu;oLr9m!gytdUTeHEt9sU%SkD@79sfUKyfZ^<4%V-XcP{_0 zH{SZtl6h{#co*~k2IE~4T8&u0G2UkW%S<&s))rbFST7iFiT^hmZ%=6TVg1f{uj2nr z##;`pwOG51cOCyfYP{=1s~_t{<K4jj^~Sp~wC=!q$#@6&FZ0g$*rw3hjP)nu-NOH$ z8}DFfZN(Zj-fjH<h4F3=ts$(x8t-HLf5v!sgw_*SyN!34|1!&sH~sBdJ7KRF@3Z{> zrSXo0mbB9z<CR)}%y^{^o+TxE&3Gk$**Y`+LhE&`H;fk?`-JgM2(5`SE%Ijm<A1;L z)`S+P@M7bQcMAVyADiuOXvMMiHQrkOf692Lh1PVe{f#%l|C^1MQ-8k2MUdD5#(O6J zHyCeSXwAgp^gT<P!+$yMVEY?d^;icR?;`$>81LfHT7q?`@iy}R*T&l%T5VX9jkkmU zzcJoYX!T&d#d!Pp|Ge>D6<TF1PRvo3wfuj<c-Mv2dMr-A<L&3a9KVc@Z3wN6SVtT0 z9sK{D@eYL6CahzPcQgNgZ@gPVYY^+L#=DjOvIQI;+ZI~ev5q(1A^!itcpnR`9atwA z?-Tt0wDAsy)>BxV1}49q{D0ASpAD@MtQp4p0{{PLyt_i{C9H(;j`Cl&#^YnVLu(IK z%6MPr|I5ZJyM3ND0V`v?6S4keypuw!1}kU0hhzQOc&CKcRIGyW#<50?w>Gq<VV!Qg zocfLZ#ds5;mBBjGcnes6HQqBrs}AeGjCUs1-;9@wQ@%A9tIl}k_kv|lgY9o<$?wi` z5d^jb>+i<f7+TF(GmW<m>lNee2(1#<Y~$_0`iJrMh1OMAbBwo)CHpmuztCETHQ#vG zW4&s;{h_r1tKN7wV!dX(cZAje*2TuV3G1K6yE(MBU@bD<K`hye8XwylTHCNLHQw!5 z|1#d8(0UB(y~eu(>)*!vL}(3TH5%_zSZ^5b&d_=mYpL;$V8z&?vi%LMU0BV=`x4e? zOxn@V+Kts}ynC?ZSd#5;XvH`tX*1plSmR926GLkf*5$@qgSC(G9v)g#usV%*Dwdo@ z8E?+(dR8s$1I9ZIYl87k53K~&YU9mdamkLfh0r<^tIv4rusErXcV=kK!TON#&c)i_ zc<V!J5!SWFyBKSt@h%CiMyz$l+l+O9@wSCl2iC`pw}i#T6_(o*T76jk#(NdkLB?AS zt+iO6GTwDqcbRrxA6orb8;o}Y)`0PD46Qq`ZZ+Nkth<eOQ)q3*+GxC6u<kM5!O+@@ z^%>*chV?n)-5y#)Sa%rjV_2JvcSmSFfpw?x4rASGyibMJPOJgreHQCJ;~fdD7qIRz z-d$LqH{O>*YZPmf@$SZ&WZG&^XuXbgpYg^xAF$b^oe)|R#WLPWSYI&Sn$VIn2wybb zDPkG#)X<7!$yS2nU#$C$cUovo$NG}-Ca?}RrIPC-o>jmaG~P3@<V?=^SY2q%#Cp(p z=U~bC2e!YVRgd*u<6VSRW4wz)YYEn)#@mQB*?5~nORmfOxAAsh9cH|x(CWeZzVXUc z8!oi5T>0H&&njcdc{S!gtiz3WU1+Vxdfa&XvE=*)+uzXIi1kC`y#wn=;~faCO;|rS z-pyD?8Sj?R8pM*VBJ&^C6yx0%THCRHWxPXJ@;loc|Ay8MtP$gV0_zy#9S*Ihuyz^m zPAoY`G(PrhXpLaW7M1xAYpU_?3ayv0UNPQLthXBP?$FwUC0kzRKdj@7SFV3~)&#77 z8}CG{<BfMxXw_iFm^Hb6ixoHCDWNqLYaio{W1V2UwV^c)Yl87k$2!q?6QPyC+Ru0k zSZ_1lGefHmYohVa#HuykIiWQd>#fFHk9CsqE()#1SaIWBf_1X-HilNSSjO9ib&BzJ zgjNY_n(_9CWxRc%brsgzjkk<-s`0K3t#w$_jd#7o8E=1RZNQpgyc@CP8V$$4p*4V& zFy2jA(~Wm?Xl=nt8Sfz0JB@d1Xl=vF81Hth8OA#lT909I+YL+GfpwbkJ`q~OSOw#K z3M*l}J45SPtkaEm1S@I0FND@EtTT=GB`i7n$N87g+Ku&J#=8eAZM?6CR%{}BP{u1~ zwKK*$F|;OOonyQ;SXtveJhY}@%{1PrSUKa3hgL1tY~!7Vl{en$p_RazW4sxxg7FqY z>rAW*jJFP}XuLB+YYx_2<DH9jy7AVB)*`HnjCV2C8OFOLv>LG%8E-Szna0}|S{+#L zHr^7}yNtIdwED0bjrS@nIWs&yRt~MTSgppp4(lxAT_0NgSRKZ@0jth<H-^?7Se?c@ zfOWR<ZVIi<SUtwO1xv2fjE@b5)>f?5#=8ycT;tsyT0>ZU#`_r7Oyk`VT2EkIX}rT& zvyAtt(AtT0mGM4{HQRVcLhA*r4;$|;tn-ZbrO+D1DjV-^tU1QJC$wJ2y4HAO2gG9M z8}EeBnuxX5cqd_9V7xV<bvV}b#ybV;LgSqpT5+uP##@Uu*LbIe)^x0o8*c(@p7CZv ztAN#Syk}y~H{QC?nu+x(<DG-Gz<B3|Rz22j#=8is-gp;>))K7G8gC=kMaJ74T5VVZ z#`^{@NqZKPz3e&3XIYYb=GH~?Sw>ct&oU>9U&f*Me?<=RS=NUHpZmyFKFgdvo6p-9 zdY@%GTgT@YnFGWx$DgP3-j{8Xe3mnjb-aJ+FHg=}O8yfM_WW{2Sn@x|FW*o6&p-8- z{}%tV^q~D($a49!UW+U;DvMyjpQtk$8?F1F#IfTut553q<5_=f8hrI%ub%wKbL~s6 zIrOp4^Y1_I-26YD-1*+$<PX?=M|xrBFAjZbc)@|6>HTWM&Mzm=+V}8z@1MM|c=_Vr z|8C%WcOLtgmtQRQ<x5I`zx$elt_-x}%;Ku2AAEG>TRyq}zm^S8_`|L5xP8vNZy$1D z5MRd^-%B&voBww0gmG`YA?sXSYfDqlj6|Y;+_<t&R(E#HSlJw-sc1Winb9m?-dWuu zxkzotkCV32uNloPOM92s(jRQKd5<4g_m6S03uyo7<;N@%!cGA(a?V@7W^~EV3VTc% zd;GZ3>E4WY`sv?njbek2Ffj(p_^II?5ebhgavPtd>|V@_9)9t>cBPy=kJ0fgEA^pq zv4dET5BTUlj|lZ%JCJ(b`;wcK+dG>l^Ib%CLHiYvW8^yC{<5NK#iUWjk88aI;q}um z+$Sd%dDSjFFP+Wi@?x8qfE1)&iWK7x$tP$g6_Za&P3=_qRGmxGQZE&gX>&<ddP&9P zN-oLES#=dtSm%=BMu!v<n_ZIJ=91J7m!x;PBs1cY?5Im}GIZ?{7V<SNDa2h;OgN;N zkbbxGDJErhQzW(6CFwSoWcpl^UFVYAMwjF_yQHwqCB+?@<PwRUE=j)NlGHAjq~*$k zRj*tkGwPD8T!~OIxjin)Ph>(+F@?ijQk>$DWFqd8<TRJ03NA_4yCl=-l5EK(xpgkd zZ*)mvvrCHG9Fj`xa7l8fOHv~)N$+w=W{*p<HB3Bq8>Vu#F3C@GNg?5qqMXsR^GPS< zJf$MZI+vv6oT7?J&v8j+u1m7@F3HJxK9x^?u}ca|TvBXvNG2iYvAld(&CS`Wep*as zT7;Jz9S<uaM@-W4QH<<GOFKtI_PeH#b428>MQOu`lps=`h+GZnSL72A35a3_AdS=P z?ZpF-;Ztq$O~~LoY$EINh$26S^fS>%+nql{h7{SKI@KlYm}4OEv`x~G;fzh@NX$7l zk?ZvFSvKi`G%9ifWMsA-BiEJV=h;N=RxK$aSEz;+c?MEH$4({J)k=!Um8X&O?U(~; z^~41>IT13XNFFl4{!i3m^B{7QMMUI0Z{0kbd{FXHM9wodF0f<nh16VRldnsRB65yt zRFPjohAy^K$(ffp`%O`KCNXgO6_Ila3HBGF7&-b)Txyf~kfFskc|Ro1jcHM;RYIC< zB1b!A_UxjV8zG~LY=G49<}XGk@VZyXay!+xh4k9wNys1<>Z6>01!?5XpP$dG5~Ijr z`{Lvs#k_-0^@_~m(=eCQqnwvP`fs*L4`hJLeNl{@K_1{OIddkHeXU$JnJv@$(M%#| zkL9BmgB`mMGP=pm=OIYly*7CglDN+%avpb3k=G!jiX6gn5}&tIod}6<wn+|BQluU- zqDVVr_zQNb4@3Gni5u1ZW{8})jmVcEjf%(_#4>NM?kihXE?X(PdFB<Tzl4<5ID~IX z+k`KbI;kM5A|&~Ipu4jxOcWC$ucxJi<`s~U3i4tFk@Ju`RcwEo%wE(`-?XZISrh|V z)YjE0w}|ixmUWOyC7vl2<m3vHtst{1$VC-oc?G$)f(%rUhbqVqd=mBP(-kpt?#z1y zHGKopPpd_#4xh;S#c_2+ra}4-v`JoKI985gW<lx>vB@Qn(pzlO0jW8{CURyeaimRd zlbEAyaz7+K#U_tHVn^HLN04Dfo`;l<v18=SOzC)=97-)m6_N8PgD2TBa=xVT6q`uf z)V$j!=G=xNA0npo9y{h{$gm<`lzf)hG2exh75N3EuGNltT?nH!YWV}`nUW&MLgIaP zj6BO}NRjg(b!+UH_dxm;k!K=|C~_SnaiyK=c8O8s0U_M_6qWGXkdm68pMb=!vtyot zG%E53$dDqhLgH)fRFe;)4L@R&;~@QtyaO_-NC8rRy`Abp$>#=}ybm&<NGBw*&W^bj zGNj07AoVxeF<*uZD)IwKb(0<QoRIZ4`8%ZaF`FDZiT2?pny6K4Aw!B3A@P1Yre0z` zX_Gd{Ah*m!`CKWf)V6ZHq`K9P*#arwW|M~@qZ@7V14!eiZSpjv{xddt5t6vWCa*xs zpS8)p%qul_+2jbw=zvX5f(+kdlhYt^wOy`*^nbyQxdbwFzfD>t)fSsv3mJL9CZB{f ze$ytOgCxFfldTe?$fJ+}MScnyQRI0@>^pWoyCG#o_G3=%|Gph_G$j7GO%jlLMP@-7 zpRi-z0~z{}O-hjApV(wQWZ)^A3_!|H+vKZ~k0RfPj41L8h};evjj=yL;)?8dDD#gZ z$3Pl)+NqL|8ZI$K`OJpIx%d;2OC%pIo<yV#GQbJqh+HYDIJ}F<ddQ$6cR?DtR1(E} z71Gb;k%;^^q=r+|5qVl-6!{aRTxZ9~NyrgJj)K&20VK-jBuJUd8WG7u1{FCEGOEaX zAPFvaM5#I;B}J~0d=$9_GOWmbkRdL8MEQIjQa{HgPeMjHsUOAs7E-g=CjWxez1t?o zPlhzu<a8m;Hn|AW-(r)MkkK}qTm`AQ+$JA|loh!hGN{M{kopyNs_#NZ75On_sKbu= zt>m-PCjWp8ud>MjhcQ|@ZE_T3M3IvrLm#kXauTD+JV?3Aj%koo-8NYPiLJKDYRTt= zHn~<}%q!ThyS0LBsvuugq@iJ1+lua<6*`|sRZQ*N`RNP+i_9LQIc|bvAqkr#g}ls; z{J!XZF;XQ9SnnEdkyHY5vmz<TN)9)|R4G~3ql)ApM-mXl6d@fpNhcxKM`U(Wdq-_L z_lby5W?9xvHc3gDW&aNt<9LuVOFjepTgysHDovz>6WOzrR9;ObpR6KM<_1ObkgrGN zoTld5bTRf8W`94QS$*w2wYl`&w7yRyCYOml91^mKJ;SFzD6)%B$C|xvQyx?IOzH@; zm+O}>BYn|vl9#ioX-3*`u1!)>_h~1FOP@PGm8u}=3L-ggf1903a#kcQ{jQ0$*sHZ+ zDpTfcVjsUerd89@hX0IW{1FvD#i~V8mNmg9k|=iJ$zjfO=SxWJBQ`NtMKqCmeMiMe zFKZ%Yel&_PWlklYhzKQ=#s7CiOiVKMwrOE`OfMH>ou_J&N`2zAfRIJ(75X$!X8uT! zkxBRLKHDRv2Xj*9V;ELpOioJp2}NYo{YepNj!Wn?FBKnR`!RMt6B5>fyySB{fnm;4 z6io_}&jn{#F+~|I`@Jh5e25)Q&KvzQ?<XMkHptx}sWq*UN<2R^Nac}2?8~!5Lfu(W zVwoO~c<X6~A@xGHMY2-D!`iJ>S*g1wGFCN_S}2l}v8suz7n(>-HAz<x89zEkT2+&Z zGMfv3I;Nt`xr#F9rOZd!b<azgYZZ|)Cl!%0|Cb`NtS^Ry53zUBU)TBV?DgOokk2VH z4>A-I#!o@&wf6F`FHA2dGlRE=gt<kQ^%S?w$`~_!nv!}A+QiJg|1?Jv{ydgU6QhZ= zvnJBcnn-yxk+GqPlt&XOk0NIKHPJ62a}*Cwt7Qgy=+3ZSUQG*I2VAnz9J!cUn3!Db zWB2KpLagTtA!(6qK{E5v2Q(?hj(a*JvYt}a0ylGoZJ16_)$FgVm~?`wI)tifA`@bV zN+p}~w>)R(BO8MsjwnKBID{tK=QnnYO#Kd_gt_PKm<&0e{(>TO>M6ffgz`9qW&Qkj zc1)IKIfN2k{09|7-FIq2KAPl7)%TK}N~XX4UbaX+OUw&)%jdI{d7Dkrd0KvjohqGY zSx+ibU`0*-$;vrhAm<I5Q1^dmLU|m*vK&H99m3KzDbiw!<g@g}1a1I~MpThhfBCaj z!c2lPA2+H9sT@M8pZ(R2k?mK<-xQ&y<8~`TP5Ts)owjRUvtwjiFz$7mWXR`kO~~gc zz9=BIF#8gj4DItVMY5D<?!WCAS)0D638^l7!-~mEs`YmJWMnh^jhNSB-m+v8ujiKk zXz4N?->(U^`1E)?ra(<!(}bKI!Wf%0L8YS14q<FKgz`9qv7t$k5?;+00-`b(NwtD6 z0a%1G58EUwBOyD{ipeG@^X-~Yo*KRo5ayGW+2&?VsMm1^su)r|5fZvFw)8FRF&<>c z$PVinlN6y|rygt*nSYjPLJ5DS3CnudAu1L5ysn7sZ(M(<9V4^Wzciu6UawIxv{=hz zo5=Y2jV3H>D>tV{?IXJ&Cvh9PMJVA;MP!cp7q_KHF|yHpaEc<7N0TD${KPR<4EKfb zt*2uZA)mi-19+HoE<p(w9d8raFn64w2&vY-O%ax^i5zZSzzxw}&eEq>(WmcwM?lzf zNXt&-412aIQqkB?RNdvka#lDJB%kZa=ek6YkC0D7j!W9)4#>SBsr9z7>BoBQn9ma< z_qtCY2M$wtJq(F)JQ$IuAax;`(HGs+1>~NtTI67?;k*CB`MKcrvgE_d#KdNlqEs9b zlB(kX@7wrCJ~K4M1e$;24)<&mW6Z-L_2JS5&44s2az120kyeQ0;VoTKeHg-NSVO&< z-U6vnF%LkbFwxQ<gUB7?QENO0k^93V@)|_$1dqrON3f@-NCGmV$Xp>TC`xrXM3zpN z-xt?GYQyr(;2y=Er5$|cUOnF9#|;~sqrdGtuJp_XVz`YlHpE90WAN?dBlqz}%laln z?&poj&moc|BCkTqiX3|+chVCUm9PL|g|b>~5hSBxN{};E%tw6^<#P{Yj*8g^=~qi1 zh72h32gryb6OQ8EXtnfXAd6Jar$I(ls`DZ8fZwR@&5$}pu7S)|Ie!|`sB#{J$g-k( z{RkpGMpOHJ`Z8pRiaCHz?^7|gkY*KgE@Z8WX@W@3(Xu`S=~pouAw4SQA;=vn=BJRW zRLqNz%_`>Kkb2b`Q;(+Ziktx%P-F>2${dxj53*I|d^2QFrTVJGDDuCMZHkOSh7>vU z80H^EP7`vF-KQ5p)~oWYf((V_3D%uK2*bngubYS&;8RqKFF>AvM1A^w$cS3j?;tNI zvhT5c8%dE`$fzRcLS&MP#^Ev{Os*062t;}(D$hNTond)`S`0v<T6~+B8kNtpkhmiM zgfuELbt-4E)UpbY7s6#>#1=wIDpfC}tjI>lkRlI59#c905;CfCejPHbQoZG^w6h}b zfW*1(61C4Pi1bd>KJS6Nu5w-lkrs<$u7j`>XZ7iAkP#L00E8V7E9Mc%E*0|(B(7rq z29bJ2%bI+g_kE;j{LFwPR4wWua;HI5uWm?Lk&Tc&D(7vGf?E2|ApI)UZirm*igG@T z^QI$;q#!Z!iOM_=!sQgJ?#m&gD%DMpJ&HUa`Eac$TGszU%8L90A}t>+Yf4;>ChTPu zApI)UWsr@EtcKj7$Ssgfifn~!QRF9(Aw~WMkw+y(Wj^8ruiv8*rXWkg5(aCW%)QYX zH=mdql}|S$uE<76LXn3db&5O>k%u!y<vEBm*3-t>Ej9zv2JuEzP@b|XPdzbQ`m@@( z9nuq~A~<#pq(&|4PDosl?T|)Ao`uNRh}!2Lkh02o^4r*Ys+j4J^(tmIWRZ$l4%w(; zZh%P3N6Xp_*`#82K$=y|bC5w5^LI#xikVc)T&H4Agh=~D%Q_vhL&aPKk(x#^?U1Kb zOc^3Ijba8MBP!-QkPRy4S;$K&W)I{J6?5cCtZ^zP4UyJ}mUS^?!al*+kX|l9wy2m- zKx$OX1CXsM=1Is@74s*Ev{<yP{ZD3Os+i*;(qd6e0g_QM^$=;XD5f1!r(&*wJgZ{v zg3MJh+aWKgm}el1Rm`gpY1L?1N1wuIQ85L`ZWZ$$h}=IP&DbA=yslzyhg_v%z6p_* z-=8)gFAX32F=U;J`2$2+K8hJPjgg>Yra+|SqnH9@K*d}JsZ}vOkS!{vA2MCVd<n8m z#XJs?-iem=BIGd@Gx1br5*2d_MD9GF7}j(aWTuK~g*>Zbu7^kuM$5VrvP;E02q~%A z=0}jSA}>OQ6xsjn%p@x3;~~3M&N;{u6>~mBIx4Egdm+s#W))<TiYY@nRLmD4az}lX z&rcvdDrPsNR>d6t4(g?1rbFaD{3xGuA?sDldm-{&hA5^BvO&e%0FiGlL@~ER?ocrg zLgaf2QOuK&O)BOkNTZ55V7fQPq8>a2(xGBzLbj@W8X)prhG<!9Alp^U&5*S!W(!2d zVYIBrA@UuBD4#z-o=`Cdypx)$m}!uwRLnV$%_`=-5E-k{vU(s}Rm^(G3o7Ow$dHP8 z2r{fj=5vspitIll78_CIG{~qTmqA`v<Z8$S&ag}f*SOC^Y7`lU^dD}={1ft$D)R}a z(PCklgFS~5xgHSaJewF<FQV3XA7p2k3U90%GEv3c2zf!p+zF{sF<*y_s+b=_WZj9D z^)lpj6*DQpK8cDs0V2;fh(>~38JVVHE`S`aV%`st^($IdHzclNZh#b2%sr6lDrP&R zPQ^SesZ`9LA+ioe%Q_&*45?yHgw(5;cL`B3mq8Y*m@6PlRLrfAMiuilNSliJkq{O0 zSBQK!J!-?lQ*33__>pT9TNJq%GN?!wM9y}RRg4Aj+5jo3Wqk!wR?GS!q))~C5hCCJ zj><DJO)3@hcF0B*b0K7%ifMyvQZZ{G{VL{eh<qa>TGqpmI#r8bLFyHe(_H<E)Iv6@ zoX>@9S2;I922`r+AcKnB2N_l5aY?0e{v%|E%K5;oH;+YQtQPW=ig_1gP~~$OWJJZ3 zAlp>TjgXgA%-xV774tA;kBZp|*`Z=$ImX4lb~~Q}iE$Q>g#Ktb2U4TR`yus;Tm>0c zIo|@QQ8_;V*{Nb4flO5~PeU4yw3q%8M9x=6<r$x+#T1ze8BsaQ73XOx=W`*uR7?XT zqhhXv45^&^A;XG%9wOfqh{`hr8C5wy1*uax{~i)osbU4zN=1%=loZK9_NbiaLFTHQ zmqE%Z)rTN!6}b)4ugF&+HB;<b{0JhIipJ{iA&b?r{tc1uL_~F;Qe>}55xIpTp~yVQ zpdyz;Wa|(u>sm;&TGpo_H7e$QNJ+(PhfGm1KZRVSVqS*CRm^^;Gb5>(;~>*i%)1~P zRLpxJ2^F&jGN58^g~(PWs@GP?78UcqkUACfGGv>InRo`<CKXc)c}&He1(7XLw5<0+ zhE>dJ$YK?<5h73gissdCKpIudFCg;VuPEj<NSlf|>P+_DRZJREQZe<A*nW0C9gsd1 zb0cJuin$k3RxvvuQ&h~0kaa3%(z_UkD(0P#eibttBKM0%^?E-<u5}US&vk1d!;0Jw zsX5w?c?z;o<-7-Srpo!)|6<gsR2fJ@k$I3hMOq>Cid+q8Q)DAV&e}(1{t9HBB0qp^ zROETcpd$Yga;%-t(PuH9RlO3BIjUZ>AzM^TBSh}YjaqdLWUGq#6r@qbd=VmB;b`=J z7t*0(eg=6=#ry@*r(zDQV{ci-#35@{Oco;B+-O<zA@c3BsLZX9A=Mh!LWUK&6S7m0 zZ$fq{@-$?(B7cR*L)<BVKgJF@n<XpqcE}V(W<wH+EE95^ozJz9XH~uKfZP$*D>!y& zWXaL7!-K?(s#L>}&0#8nV=qGXsF(xJp-)xJDUcX5K-8);Aww#r5mKkhd^Kc_B6mXM z+<MeL4?`9y@+_oLk=KPBZ>Ku$TxJqgo--g%sPbF}k?-O~%en$mR^&EFzakGo1{C=j zWQ!vIfD9^f)J$4TkvwFZB9}pi6zLOkf?dMfAyZVnz5&^(>h(0FR>iyqc|pazbr$1U z<$MNYM3HwxMiuFUluoqE^J&QReeHgKP*SO74MPel=0%7+nJ-%7#?SWlk)rVvhfL&S z6muqIj>_jU$l)sH0}%OMc9hS@AaND586tZ!QOpj=bQSY^NTZ4we;&0^F~>p5sx{7n ztW%^B(yz!hkO4*Rfeb40C}c>H7a+rm>^mnG8&TwB$fzRcL1J&S`>PF7qsUE=DT-`? zOjG1ZNI{WN$Q(ruJD*lnBm-$v<Wfjkkv_=KDRv3(kW{MWzXh4Oe=rh)d90qQ9l(1$ zZ|<@rM)vdw^T{g^xi4j6NDjMzHdM=c2V_K%nUGOM-VZ5FvrBj-WUX4(Cm~DJvOW*# zS22%3+EmQ5kc}$l6-bYYIrKtCi;6iFQdTkNKsKwG_d(XHm@6QID&|v=jVfjfWSffl zK4g=M`88xn#k>ZQJ8-Oap38Biib+AXtC))*vUdvf`)h@yQZZ{GJ5|i*AadVMw5;z! zMpVqtgs7O8AiGq|e)Bk9Rx!szMpaB6vPZ?t7ouX?ArmM}RG#Y~vHk3NeHK!qV!jTU zsA7HsnW|#`EU8q?LGxKFRm{l{*%PLaejA<z$*7piAaNDb38_;t*F(zF>=C{hB3C0O zggHMB8CGNzGEL=Nvw)+~Fy~-Bts{?UJw1&W**A{LJRh<+Ohs_412UqP^>N6kB42?d zPPI$;G(`4JqnuxXG^?DCVA7~lsm_MXRAeP&jv}9i)GP8mNX^^rrT<-G)Y6Z?h<QUT zeGVk9QmuqcQ{+>SIz_fYh7=irEK$oEe=)OPxU8V%6RPD;B4$|SGaE9ZNE;;n4!d6K zAtkk}`yuNpmK9ga`X6G-D%H!74Ph#RV>JuuLA9(?A$5wJ3n?qo09mJUUJV&gIj@KG ztC-J0wy2nIKsKtF|AlN*F}olGDrTQW9D}HsV<DSWOdc|<VlIXZs+bj!XI0E~kZmgF zPRK45vkfw&Vtx#fy9D|3XMjIKcBq(rFY&r2ia8E4tYR_{c>-t@b3UYBwfs`ZMnygd z8BpXFNPN0Ie!c>cz0+u|+yR-Qmh~&hh>CdyBHx0H%5(6gw1$eA4oRq(3m~H^rWqnn z7>)Azkfc&2yctrb$QL1HMIMFhQ91t%B2Opvat_wG8n3DSzIc%sc`jBoi@pIFP~?cq zsJkNXgvfqx)M9mzMHS0pQP#YAF)>qBs#Zv2m`bA8K!Vpk-cuZN`MjKsr)rehJn1o? z$;i2Pn-r3Ap4KBXmUedsc^oLI#<2+J<>e#a8ZkF*hB+59H8h3FIXlHA`Fe*GQ*w62 zPF2hdYf?xg<@}fxQ%Izyu%%WcJx-UWkjTi{W)+j2=92slH|N3<H>TL=kYsAWA-RI= zf!NE+C-!m5lTS`1K*gluF3Hq8q>$`)NqWd3Mfow3nCUOCmkY(Tj4{H3-YFC_R8+@g zC%G}XDK05cEuE@3N5>Qs3E2;~mQ_ro%MM8vhaHm2#96uQROy6lPi>MZ3^^p9sbN6c zG5Nea9axb<$svW*kRrKkrZAD_ic;mWxpdqmxr8P>x@(S0(v2?3mNd!dGV5HD9n_?d z&F^tZA#so@VIiL@yClEEA%(2m(Q4JJn8+3;IV4whNHR6-l63rFohq4WR3x9w6gIo0 zIOvdUVw+3S+g*~AdsCw_=abpuV-CqD<xW&PCZC#kh(pr#F3D|lNFn){OVUrcB)8Kg z`S_uFS%soJ0mLp(F>{qmvTI$ETkn$m2A34%E=rYiQ9dy|{B=2>N+bq!Oe&EaaY-u9 z=E}+^mB_TYBv*1tVXZ@wiGGJ<aywm8eAXek%!o^}a_^;Go?M~LCB*?v(wXcom*nDy zseH1jOq)xx1DfPAX}P1rT6!*%DZE9Id?wN8lH_KWq=#LSnR2+wr;tq5DN<k+T<4H{ zLGBER%2P-bGCLf?cO{R|F~veblVl=Qa!E$6Zd*Ag6NQ})Nv0+osbi9vi7v_2xFo;W zA*pQHC55LPl1@D9lJtm6vb$VTc*!A|<Q|vgCmyA1ktr4&l1-Ofk{fVIVY5SWiJdM< zP2@U}-Kx3F;V#KeaY?SxC3(3vYUfiZ>~TmjAy=U67@qd5NvfEWD?V0Cs+b>kNpZ?C zDkhywC0vs3b4V&X;F8=fhh#D}T=lS)&U(7oC55s}iaQ*VO^v!FUB`70JLg=o-zBM? z4&mFbZ`G;tsW~nwmK;(@Y;#F|#3hAkT#2yDQ!L2!3q^|ZO#qAVedQsCBy%;K`L|<| z`Na-NCFR<L9g|A!&?KKvjk=^5kE>LLT(RCE`NT#=im6n7$R))Zt_4I(FQ(Fo#V$#g zU6R@1lDu3~Q27)JoVB(IGp$R~a)#WF;k(gqb4X6kNZT=mV#y)J#5R|tMqHAfR;%(! zClmE9Np5sWddMZ2i6`lN(z%37@_jBT4mc!}*yWIXqUL0sb3VD)A%#@gCFvcSWK!u- zmt^Gb>iuHDzC<yT$~C$qFK6uSm~^6MnnTj^WN8(X+3b*PLe41KG1=slQyo&2^L2Ji zF0sxfg+Z4T_c)}Ok~431KE-sKOLF}#$?tSYG4>9XPd1U5<B(*c<dWnzhoq7tE=f(} zJb+cgY&uo%lJrK0WD`R!NltvH&L@{jxFp@@kbGvqCD~mLDdcKq=$s4r#SSSJ$}TDH z&?J}0kGiB#I8Ei8OQjoKlG*H%{IE+3QxZC#Y*L;&ZnbJIn_B0R%%DrMdt6eCCv`r# zRLLdjZ4SxjM_f{vmeTnY67?=gZqy{7NDsLrBX?U`^~xu6@}vVr@_i0TX9ir7-Q|)( zO-ARFE-rRRCR=t$Hap~!+{CQTCzngOB;V(de0IPkxm^z7JW@{QT*xlggrnNBOY&P> zBA0Wm<ECOUQ5<w)l8K2<OftFEjY(~DNqW0WGD9xO?r=yZGwPCTA#c?*lSpI}jV?)U zc1e2JC7CG&C!buMOY-YnQXF(hF0scU`E0zXbI#}5TvF_JNFlM)B{}(Nq;T|7(?WiZ zLyF0gOH$i3NoH~*F3C?jL*<;zX6jv%FF7Qi>32zP$R))QO;VYRe39O&MJki4b4g*b zL+DdYGMQZ2C3(5;&B{5KOpUrEU3iy{$z>W{lHIIHK9d}FNG=!uFO^R|mv3`PvEL#2 z<bX@kn;lY24!R_@$0eEgS$gTkY?~&9V!mIIWImG`c1bQ?XXisqzRe-oe7{3-i9wg7 zV`uApa)mh#$tN3Kk}0{Qu+1Tb<d93UHRtGM6^e@;QcN_vB-!DTY)O+sBC**e$*nF) zZFfm-$RWwZ9+#wQ&Q)bDBnyoWNu^3INta!cS?`c^qTeOS0hgq<xTG-XkW6BSOENoM zlHKK!+-`^Pot2rorrF#amlR44$tAbBBt7Di+_YIb=Uk!QA^Frsmt+TAQrPT}LUNl+ zibD=5W_N1B8T(O}<YKc`35$us6qgj`o~>w(N*0reX)Z}6T$1i{Nq)c~sf66KwO`CX zD#;`{_#AXeVVgtJiD8$dcDf`z>XK~XJiV-RuHGeujV>u}a|q98nxpf{WaqdfC--CR zXVoi{A8<%Ezsn`X*!enDE;G?3#Ttj?Q&U`$jXR`}nC6mf!Xb3LOH%bN$uznoJD>=s zs1v(fl9b=giCTk`)`>osB;}WMR7|GkLQPVI#V#qzukF~W(#cVmr0VACm|UvgC7BVI zWE1mrs(hl)C8>UwWCvW58+A#sFkk0fNY%L{H^(8xM7>MWjV{S`xTM&lNivbW$|Z%h z4oN2aT~gfWkW^;CCAn=5NvDQgl6k=;MY-R|>cM0t6<gqtOua+0$&yR*+gwuE;gaH0 z4#}l<x}-3%UN1eLh`S_La!H}=kV0nICHWDD6jP%vDa0<)OD`5{G+_ms>XKsIA<0aw zOA6B*l1fc?NipG&bh5`K={}ca%PuJlIV6+V>5|-tLkfk&#j5V9V!G^-{IE-k@@rPs z_(>;<C5NPPLoUfrT%=Q_iV26L3uT97(!&nP7UP!$`ON6*Syp@gy!SBa#}1O2f80d= zkCTt)wU4hiUgjAlCT3DC@={I0F;=R({8T2!WbmL*<ikGX6Fukc;4mNYm7n;<Jrd!) zzU!xw7@g`6h_`f!d}_}7z8R(Zxt~g6bgDyDs&@`FE{#(C#ZM(M-trGvjOoAji8Zu# z^z?SOG)H8HJS3jykjtxv_xN#TG1co>@;IxjrKx##SLe!wJx$A2)SWeRe%)DTEo)6R zw6E%E=_)Nso!i#bwXmnFebw^1x?)|iGC}?SF~O{J{;vsUzDa_n)|CyVrmpUmE=t|r z6SF=ycdlx&KbtTER<x{X=xJKo(GpwM+S;(Rx4om8^sT+CmUYKU-43vF^dfqa4a-(G zl^T|HG<A2kbelYyTb6a&c{KI*HLUDx?(Jyt!X#U>#Aqpgslz-gis8ktYPljx+|=A0 zeK7S4^X+QsXld$h5x1Xn_lovXLwBiZ8D(^6{lbQx&J``IEZ);OCTeKv>S|hJ#ddTy zH8-@jw{)1&_=}66-?q^*$(tc%WdK;Zrbm?v)Y{(1FjmQyb#`_&S1dn>t#Ftj5M^Lm zi0%rS*0`<Du76ou%d!;>rA`Xl9kb$Sc8^wtNtZ6`T-DRr+hybKo~Evz$~=~JbapdB z{CImXnxfjklvRK#q#Y5JvMNog!EP7G4j;Qjl6_E8npm}|^*I=o!5R^?`O2mhEe+kh zOIxX|v<&{PHKiU?sII0}&7CWKYOP0Jm;q*xHLPr5Hew~U96|oU@`64!t0=Wx)!f7g zGV5vsKZz|#jjN@v)Iyh3I+pcz_jInT;^^f^=_rfkk-0Khu2;Zi%$WRq9y6w%7sBog z!@F8YA*-uQ6=uS1WlfE>QY7;5SD~P=-960>PQ|E`#I>(#Zs`jvC2<C?;#aaQ>bFAB zR(1m@=GVO%Q;QGUsImmMM-?JyJ(YI=RptS#Qa|MivTy2I-p$DDWnA$~f%AGhX11^P zt=a8;VgY>XV#1nzdtOU-chhpy<or%zLsLgb=Q3%3`S1btiS49vI-gs+T3Tc==XI<p zwasO2WMgu1%N2BuOV5=Frrw)hoCL<Tuy?7+q}xqc?++Iz(b;SdK=T%!)6kygfx=RH zZ>zJsrKf?7;_7y9Otm$2w>7NlUD?pl*}0;(WN#K_C!k?<Q%AQArEMG7Ovcz!oZGo- zbpyKrJ)Irl$3>mz)7*h`Q728x)E#_2d*Qj~pFgLiZ>HHQhIm#>U&}I|$ySvWrKJh6 zwo?{1<q9_8eyCyI`ejOMHe&5ps?EHKk<CrG;cn>ZV*iHfbgeRQS?5Yw_Y7cT+1_PU zeJ{}L8itv6`Q>g|*3;f;Hl)Ffs3vG@W{l?NYA`7qz95S+=30Bwwxac%&79$Na>H^N zk8EgZ=w?}&%<NT?i7Ca{=$X~k)!Ah}uze?Mn#io2;tok``>Li6X<<c4eXd#I6kWz1 zh?8M=MN$UlIlZl|ElwcVtQRgX^>(+JWiRb*W&UnzK8O8=5VUvCVkMJ8ke-#tY+U@0 zmoDt-WP<fS&1>p2RSZ7Q@9bJ>D%N}{J?OWC6r$9!^4&qu!k*?!FS9<(2|t|E(c3c5 z-x&Ez5Oir1|GWk!uLV7AEnR{`GP`MId&in8s4{eJ)2ijYOi$-^b+W$7GNg0P>*!qC z)Nygka>kt1j8glSre)_cuvudm`w}nHQYDpK=5{Wtp2^IX)~4Q$p3B;sd)gKU6`$X^ zQU-yBi;|UD%L1$M&fcDm_Ejx(pZxT!6fGcT<U(5aHe_YR@b-o2e=`r88H2TWrBv0P zK8)Sb&e2O#hfFVQhkd_gm%2KawKVsdjW7GWW*0Nu!|my8m8s17ytI>f&)yK5mBia_ z)9(ISwyJ5RcQhfBOK(q0!_xL9uiL{_iOSFKT{)|xMT+hDmdfCW);jOwvZhjxlujC| zjft$Gy_<2>?u~OFEb8>eg#YoJ&K~wzq7-b&R)nAASS4JsC4m4l)0hx5OO%>=+M=Kc zsntKiD?3-WEb4TUOCMLjWxZWhLQTIfD7CDrXSrTBEsSlZs|DUzu?pX9O-o+sg*Z*J zvdO^t94rORW{|YG%jmRugxB|YQ&5;Ev1fO5nDjJ~a{z3x-?uZHx;S={v1L{>c4%cf z_197}`!8aTw!4)n#zf#Wbu(*_mxeWk=9b-4w$GAFF!Nh28z8G)1GKDnY0%WcsucFH z%mu98EoZN4o<lumcQkqBgkQqC-(BC*HOng(<T7?rsK~rd8I!%%2nw^4<}oAVJuO{c zk9(xMo(-ody7k!^mdrCN*ewWpgkD>?W)+iS55MjlKr=ckdb8Bf+{;f{+d%}X&rQvj zv!^aq^wuRQhBwsN?=jqjM}t-Z%r?g1ey^S{ectVF&Sk+-O4$gp2ew+)T_>@)=CL+7 z*w1r8Yb%{^e9i{e`)KwYWm(=wZzneTESXa*E4>hJU(1T>EIC1)B{znyzL?3=%87D0 zq~y;jURk<2{dK`FTDWcZ+L_gj9L!FD-TYwLNSoy}cP{K{S?PJ3J7;%roFav8?mVZ1 zA7Y9%T)gPq25+xd_B}4;z{z9hGfK~qQyC^=VOwucbLSPSVhs)FEu6!FOh-$XNd=&{ zdb`?t*7(Q7%;YQDTVk~fR=0Guc644*%kQhzUcv#A|0x%%oh>IV&X&^|waH|PZ~MqT zLW6Yu@|G@8I_CYLSu&X+Sbmf+nIx0>oegH?<tLt!Bw`RZ^);CNCy2>L_MW0eCHaXP zmMq7Z%X(Ux8_edN{gbZRe3nv}-?GT_duO$ay4E!GrR7JdJTp_vZ&uY_!byQOm`Qu* zzLqni^V!POCR|F>&1~sj=Hl61M9*yMX^PeMu9BmXTKiC;*8HS}Le{>mtp3&lt9XKi zR&iA>*a?dH3$MU_IW2CE3@gJ8w!+NOcl82mS28**=<-gKg{e|wyV6x%Rhl4N*k0Sf zL{(`7k6YD}b;%r?g@sJmC8>0)>M3`X!Ycn>3misPDYWIQ?7r|gva$;!m!B*+dR*uo zYWgW08hkVdpjN9?@SwgGj>?Lvkf4SdMxV^gT6Mvpr*hGuYi|qp=4_|h!J&1q3I_#o z4zZn7uGeW{`#{`Dsa#fn`Ul|l&bFUYhHEu%Wnwc@<cPj9W#k$onZGkXM#{izB@Ryw zSV=<Wu43)0#+dC)xqNTXtz#sv?Aj`UcGb<=-etCz>|j+tUttZjFgNRTM(DQI`)Y1$ zYOCh9rZ>l3QD?`$mr7fa6}47AtJ7q+$vHD)bzc>4)F^Ux$2*x5Hi|V@TBmhFx7}t{ zQrm4-#cj8lc2~BU_V2CDqR7fNvwTjq<;+xAt%_O)-Z9D*xZku`5;#Vwj4LdZJ~dXY zV3iRSg{utNO96FoMIjw`cs_w^YgXx892CjrmF2J_f`x15kMR(4g0CXbFgMWN{|Qrj z&<zc)0Qzf87#;E`fj{+BnaxR6#pzHsLS`z}jc2E`Bdm5DE2L_ZRtvTot*SdJDAx$b zE~D+NES~M%TgigB%0h*n%JO*EEUUI$kje=$XNLXSR)&mS{3x6Mq!M2A*j4fUQH7%G zy;Uny#cfxliaTXp`mN$l@7<jl(_Ps@I`_S`P83<$GM2Aet9a)u-=uAvpz1B;1XXXR zC}?l>jiUauT6^((t9uYpF}W~QWv?chjiMneJZdrm&CLK+o62@pR?PP9twKRu)zWx( zA_P0ws$8w+vR1V!_?~LDw(nV}mQ?wxWnl8&%lfGN6&aW_cNNR^XhpEIdGWhQZC^O` z9h`Qwv#!8?-WInrufUbz>bjX<0V|nyS0;}xuT`eCe0xdAsU7d6h_%!(CC=(egL@*X zrwzT8i8-+r-V;)pSa~ZG>uY|M$sNC+fqkck-I<lVN&>q(?F4GHh(q_3*QAxa$`ZoH z4m!eKjOE;0(y$Y&rj2^hcB{6I${P%O<*u@9r>!e9a004iA(ab<N@WJh?I&lV3JPd< zWd*Jbw>#1bSN&-5YTY@eyK-q(zj+n2(ptW~Bn-Q>TFR(L9k0`zV|go=tGc_Q$jV!p z*y-wu<c>eeAh<Ee=}U!~m+af9tPN%rPq4MD;;P(KIzhquSAqTV!YP=!e=C}LLgEL> z8s^{G<p<d$%IQt+R)`kxW`R+bL93bVS$Nl2l+zgg$_(t@@G5QYM)PoGxV>gs;cCq? z7jA;PFT#dNMR#Nb+ZhQAFCN<ksp9a9qCDZXTWcX<evz|U(%{lgFb-6{k+WJ-?<SCH zi}XF!5}DgXs-^K9)sk>U%fA7lS~|-+M&jUZlQB|<?rO>9DqPj3@f=nXb=QiuD9xP& z-d!zDbabnW9=vj6k9YdB+nNug!`?hjZVCNQ;!^)%T>3wZ%lwCN**A|1X1O=5NadWj z*CclLj@gjmE}>+_kPGfWvbxTuRyTwF`;&BR0Ci}1^O6pZunw=dw@D|fbnE2aEl@g* z&vc-7dz23JSw$eXPE`a7(}8klRB&6B4p*MaME;Fem1zQpPGa3|rIXkWoy5L%OQ%tu zYKiPjgMB+QUc8jHTPN4|fa#?=J}aSYDyrNkW+fjZA{fQ?on+3OBEz|=+nY+Nx$QNy zn!oyr=|;Mv$1a2#MU{8GSrxD1bQ-Sm);KG<v|E(`D+`LP@1e6&SNe29eV?69sC|A% zIrrLCc2$)Cr#GrZjM*PftkWZ|SISuBhCru~V?@}c93!N9F{=dI<*e$qdLg)(%DYq1 z>H^16C5hRwx0e+p@f~53)^NkD_vu_-B|*u*3p^}XlqPgp$@a3p92NBccI&0peH>7! zyE4TU^jkGwWrw*@L7^(SUnz6Ff~$b$zE8gq6tga9SS596P)G+?md^?Zil&fVD(9wC zyKs)n%fj4`T2aQ3>N19StTK9cx7rK!uZWw4g*Uvq%To@uNaY!0sbP$2oQO&{T6fo4 z3m?m4PJg>;f^t<!R9P@5C@7hW&1Z8Ol>;K~1&eO28q4DsO{Y;s)2=a!76qxI+1MXd zrXc3tW4~K1;D>O8>3_?q+1#NSWLe3pBybK@!;I9is-2VdbsWD$V|lAA%_NpPeyWwx za#kd@zqwSgSmkt*`rq%e=h&dU%H<@pzX9bePr0fmtJbJ~va0QBe_M(h^teN^`ZDdd zufAlf4ZU5=ptANNybka)sCoyxzxe7tXUV~rv8pw(_KlIST5AOft2S5Qw3|cMwpzp( zOCPhvR356y<ouO?XRmjEzu#OHTy}oKQ!Sh?vF`h~=9)K&3TBr#39FoG_L3kNUwaD? zU-ZQUr@U1h-mZTYhj-ebio-ikP{rY$7^vd#&ID9(<jg68Dvo>=huxw&N%cmIV(fOa zsXw-&CJVm25sr+YEklQuL~f-Hzsg{x(7ZB%+-6@HZfIq&|J{(v_`u;NF<%~W!#(JP zdbiv2t$Qar<kBwQ{o?*NPMpzH-RBLc>OOBwRrh(rs=Ch`S=D{s;HvKP##eQpH^eG@ z_9&}xRv&08tXgZDD?REsH~MyhJ^xCByB@34B3E?&*E%C1U%)Zn1d6;>6Z>CMv3fnq z*!luX1ii1YIGsPH+dr2Omc~i#4S_LJd!wM5+wPcZ{_1_>M%vv|;nVH!fB9+5db@tN z;;!GVx$AeU?)trzAS$%$_f~|l{ocwjw%=PJs`{(9y;XoWYkWVndh3VIs>9VBfrsBV zt2%0Ri0MWBg*3Mh$ME_+Sm{;uuXK-5dmX6i?z*g+d$WmrA&&D^b|S}7HHrUKEUT5G zRDrL0LiwUy^<>6VEs^XRjgcyFRZGU1wBQ?j)fQ;Gt0gCE`J!L7q`pfA0NZBgJAlp@ z*h_#n4E7S>t;u@{@K)u$1bFN6UIM(8c`pIp+Ps$lZ*|^FK*8)|?Ioc2W&z2>n?}58 zTk<`wH|a0F*7ar)Z`z!E4eZVG*jt0z>wonIt3Cx(#@geyn%5ff{;^8*eN}77SNNoM z^8I=5yR6Pwuj26fMLX<TYESjrMKN}*Y--m=9-a|>v(~PQ<FOL4LZ2r)65e-jtu&6q zN+KtTS^K%sL%y7AC2<^9lHf+1${i!uQzeoA{a$N9L88D@C6WIP;3|m%kCiAm742>h zG`A8kgI0Wp*jiLow@!Wun;!qG#yX+x&`I3yBI|S&UMsO|p{j1|d{`~ie4W`^M3{%? zs7T^{-?<`zkE@4QKTeY`PLFY{#>FN1!gS?Q0!QU?qHk1Jrm}oaLUV)`Y|f)20B=*z z;{pO#m1O3N+0L>gJC9dMfYYs!#0!==Cs?NSeQsy+86(1;Y{m$wKI>Eou2w*+K<daV zNX`@ye9^p0b68%fWwcW)$<5s*PA$iXuxmL+NcCD)3ASrl&8-XSZz0aNz861ck@pts z?-PfIb9;-eIKuIsrs0;MdZUby@tZYIm1NZ$s#>6KGP(aJcu>HYZB;eMZ6r6SdX3$v zH>;{0U%iehqOx-GsDr&$EC?98yg|f&QdWr_yPTfansK5r?RS;``~_?E94kbs$`;>$ z29i@n?Xat+J=Loe#n@G`sZ|9J%brGMutzI`y{AT4b@cM^aYeZFFzZug_MxL{lG*lG zA)?ljM82ysnfG9dijwi52~&V-3C3DX@JI{$h9R$>?2KG2kG7~-Oz5as4*P!9lZ1|n zB=T^KiX~J&F{A3hkw<BS4sS*GiXJ#BM^xb1+lVqx=%^@@M=Q!-aa*Q8NX%nB>_+vr zZtC$K)-tMjt!0I7`QEhMUfLnU$A3CV*e>3IphfLQv2gVk37$1#6*WNK!sPKI70U{s zUQ|HGT9SE^iCU0Htab>VaiXHU$DZ(rK6xBnOG8J?>J}clXC88LK6}gZ$dmBt$Li51 z;nR&98qQzIBf-3fqsSM>JL=M{tvo9}dht{g!!wCOD?bwxz9L=`A3a6Idw$A+r)3KK zDqi$T%8%7%3ORn`SG|&nM2=rWiSw|OLeZpXJh1utgJZW{mup>n<G9%U{$rbGH1pui z9%gd?l|ZKkk5Ufcfi<xi%`HoNm)G)?Y47#YL$TOg;tD)NSzZI=R~M@}$B*MF(%!2B z>H9(O$x{<&J<VC@AP<Xvfw&D%doldX1o_q1&FJC6bnVJj9);b&@1p-a7Q3p^t3VeL zkJUHMFkf>HqGGX`JY0Enl@}9G@*A4brvnEG$y_}y_Cnc<m8#dp5_L1oj(3m}hGP#g zh3mYy{vd93XGhOcsipUdBRkjW<;D(7#Oz-mmq=NT`zpt3hQd+iJLL)6dn7;lOkVQ8 zuBNUo9CwC#zvg}*F^9Qv*7K$%w2k*vKgLgLen^VJbK1;Vv(LU{?xMNppL6<&{5yBv zqM0XZx?t|i`Df3YweZCF1QP#+_s4iIh>e>pd7XRulKQUB%NbAIOU^EpI@*^t$@3Sx zm-O(g%a$va(33m}ps8btY%F`$lv<W_F1@^aNnb9rWTuR+C8gG`86bX7>CDNo##n4P z_LkTwvA<m#3w2)mvaZhV&eopzw2M!TFDUi2uWY}Phh)XiWoNXV#}7$4q+Dxw^N1c( zE@AST&HFgsb-eGEhi`i?`^h^~V~5q$1rAi2-+RUDCf6Jin>@LmkG;GXjO&XX#^+k> z6V2x<c%onn9lJml`d8lk;8ggMWluXW7L#_H?o-BIS<15&Jr(^r`cCvARO+ySL6Uar z@Ow(cPi@71iQaVthWDc78sr(Z-a)n0Vo%^gqq@eZ#i6l%gJv-gRHAVwPp)BLZ6I#J zIPOm3$)B;qfm49j8A$%-5x7S|<Io;*T`<mHqTCxHj%lGoo@UDTJDPaHlw_X3@oz65 z4^9?H7PlWCWMkS=R(dbz7W4eeBVyx&lE(PGs@VI;hu4v$ZblE|y<nUyOA69W)9=U6 z3P(v!=Aromv>~q}NYaOHG7BuVtud$5RP?uS@A0A!CA!Q<ub)?~s>u0D3i7pmiHOBy zOstJ!V^Xz#K7Yj2*L+7phRM1x#M}3iX4weaYzicIgso^XZ8ZS=lu668ZacfyR4n_m z1YEj5|D*vXPaZ^XGnp)xyCw|V0`to5Ev$yP%`mTRS2p!kWO^~)c?>CD((yac-<m>5 zo^m!o+SYq7m@H#^&UlISUNR;}F<W_`>2rP{MSjLE#!sHe&n3m?p%<b26h^rT#V+57 zvY{wT(Jn#1jPgMJ^3Tx4=x+4g=&R@w^ewdd`_VJd26Qpnh{~{NLqCkJKtF;qBbRSN z*>IFMq8~u-LA%h;qclbNJLqckar6pw7s?<hzl>gmUc_j)7F~>9hrSQJ9+mZyvX^g1 zZ$byqkE4U=C(-YtpF*EQH=r`A?m$naZRox7dFY+!h3Ej<fZl^%j(!gP2znp-N%ZsR zmr&ZM{5A9e^bzz+=rbtYUw#q&3c4?o%h%B3&<D{|(XXTDpxe-T^c!e9`W^Jc=n(ob z^t<Ri==acv&>iUa(EmZ7MjuE2iavqv&&dBFIu(5qO`^l-BJ_XJ52HUuH=$3VvZg$Z zK7#%n{W<z9I(0whG4urVIW&uopy#8%M(;$QM;}CAK%YQ=i~bh<9r`cy_vn$V4ZF}| z(LbQ?L|;bFME``!+VU5)31#e-yV1X)H=wVe521U|$5F;w`IqQx=yT}n=-<#c(1Rwj z{gpWy-3OHw<^c44=z-|v=t1Ze=p^)7^bqte^f2@RlrdcX9(ok|1C%M&%=Nd#D(Cu- z!PsQPZs2|A5&ZLB;aqR-!;-l^5x7wD3|`FjvNG54S<m7!N5!Gm^egkxG>|j(gxj(< ze8Ee~HOgDcw#0|;q<!S`4D@g`g-%7&sBGi1=xJyHJrgaW=cCwWJ~#`Nde))zRqWfW zGp9S-zE9HM$KqRuey&P;a8PNUB_vP(lx7(qHhAe~sj)VJv*oel%zDvA(Gc?p&5BK> zwC5ms>h_ezV+Hf)Tyq*DX(sa_4O8LdI(f2ey5y-rQdpVCX_#=%Zf;4M?MNJE^^t7E zq^q5cn532_?d82-oIFT6Wm4CLOrE1{79u^&%tu(|26jDbC2N7aWPHp)zj(Za^2pwm zrZ)8;wU1zLY-N(z#Kg%<k}pBM0)?Bv#Ub*xN>c9Tka2JF(iXEdEyLn;@q%$BQ|NVJ z%(Ac|jUg*_Ucp|UEV2})TPjbe3^w_3@PctYS9E&Ml8~jgg{j#k?P`imfvu6$c4!0V znAHwKAKrZ^7ca?VJ?gdPYI(A>wS|-|rK~v2HL*D3IC#nU9p%H>ybt&JbFBX|rbkfe zonNEU$G<`A(BGl+(ch!*LtjK!qJKm`g#HP=7ac{vi2e=Tf$m0shyERvUVRm1u8O^e zz7_o!nnB+{>rskaz8D>cE<*P~-;M5z-i7XuO7|X!eg!=UeHfjDQr6hP=%3L;Q1Xl& zio#+w=o#o_v>iPX?LnuYpF)p8??R77-^O<At>{Yhc=Sq?_A6hFo`|kTYtdWKlhFIo zQ_ydt)6mD!>FCeV8R+xqY3OTc65XF6nnFK{X3(FaIrKMZ9{oL9M0ca7qZ3&pD0}%} z^j+vN=vn9~XdQY#dJg(`bS5f;;{x;`^g?tdIuC6`7ob<73(>XcWvI+!>|2aE|IeXY zWKKPY_kf=7x;r}kt7`w*{J*}&tWT|7lF+OzaWakZj~#wN!TkR%6DW_*VXd-`Wuz>@ zOKcg(6kq0V^E!!fBxOArmHGb^bQ=10v<{t)N<H3*%KTpD?H=2(4KejS1--jUeg6;J zyEm<`R87{;0`K4@%a?l5{oyfMit<Xm(x}uchf4YKem!JNyY(1iJV+behu%}A9@4sI z10^eF@S@#=*R07k2gXjHJi_M%>~B=v2+8r9uB2?5<bdttrU%(cFcYuzYaHs$#ml`L z+4aGi_pBryMcr)%MnZ}a4+n<KtkOsmJtV&wAhTaR$Uf`{HW}9DN(!`?umcX0%>3)w zCUG6q-V8~38eu2$UNCMs-=^sF9?ooUU>33#pGj-;l7;o5JIq#e+0xEFvtb<ou`IG^ zYF=$_5Rf9s!BE`LZXUfYn_F4jW{B4&{Gv!uHVNN|V}wpyFfRB(8wuZJhX)S3bTQia ztuk=DBf>${tKlkBw5@#hiq_X4#c1J}eDdTWsJADunqR+>rEd%4_+<zaXCHXs{3~zf z)bJ%^ZIn;!KgA~a{4B<%jK4bc67+0zDS9s2jm|=^N6$weL@z|YgU&^Ngw99*h_YQM zPo!QKp$DUvpvR(@q07-FsGMTs_^aHFHllKRY$-Z`E<^7{ThZ^Lq$v-hZRj&-JNjGn za+K{=Y$eJ(9V?;I)8tvMN7tZtqgSC1qa5dzhtaFi=h17>-RQOGL`KO+(4)}n(UZ}2 zXcoN@m1D1)(08Nj(RTD>=tt2{qMt=Sg?<IyfIf=eipn<SHuTTvXV8D6x1$Hs=Yy#9 z{nyab(5>j%=!59R=r_<?&~Kp+qTA7*p=>|PKSzhqf1<Qe`K|Qlf1}gU@1wKO9cTmk zKj<p-2k0lzC()bHAE7d*a_mwu7d;D;U#H{vEA}CVwf~Z12=lcfbK8k*L+Sz-Ix(`V zoiCErPuBl^j+E6zvN2;<*7fmh6WDK)U(xaR$`Vj#Qiy|YF}s!&!z7m(Wg66;6zsLD z3tuB|UUI&rfcEm{<PY1ZV0X)`8|x&-e@WftbqMdPjKw<2rbpU?W0LaGD8(qBfW}dd zU1SO>OZF$B7osPlji?;gT#Hhj@>kFl`XnmHH^XQa{V^)XHPY6nqhoF7q)B9(@^;=I zuF@yrcCLni;HCRSx*(3r=>iGXEgNj->cr*0Wcl)9=)^L{GV_Po&ec)wx4_OtX`9$g zRLVKaug@;*qH|m}j&)bs_@BJ5u2LWKZ60sSBO@(NSn#T>l@!jZm7ME~y4&O=M>u9P zGKElk8zfVzWateIei+3}veJkFk>fm>aNSmtl#`-3bArs<KiDk6{!8j9ufurXVJzlO z+C}O<7d;A{hf2H6N2T2spfZjYqVGm8L06%dp&vvSqt~JDLHp77qLMfJ`sGb%Bl;b* z3H=GW6y1$3LuGw$My1_bP#JH`(d^Uc^WMx`W)5I}i<QUfAM<6Zz3)s`?1&s@9W-Cu z!d1(z9<yz(qaaov$_8`}sMnhuqE3{~jha2;)jLUcWuoroYvBAEjygb-y30NsFPTu{ zs5?CD!Qc%K8AQ?Wkb!V`MEo<Q)_!oDWdtv2S9zVl`*7c0K@-dT(t%3WE73SgpPO_0 z-DsB2%yi{Cltq`D&^2f$%9tpxMLD)Be-gbK{WMzUZvbTuGRJw08FRjr?RfbcaL%2S zzm496K8}7A{Tcc(^f{EVRpy+QIX`&_W&ISNPeX4;Gw7}8ndnB8{eswM(D$Raqiny; z`AfFX=Dg(<=v{EOx3POswx8blO7!!5mT@R^Vb&RkkHVx)9_D?G9*6F!n*<@jOZwb@ zu{DyJua1x285na>LXa6>;05D4T3UNd|JU=;>)EdM<!wFTHp<)MYGRj5ep^b$TAWC4 z8^s1G%yJquJk=ss7lLE@5{}>{by~c?_j|aki{^DAZ6Ni08;TvPMN=rp4dn|^=7sVS zbUNCKGG@#48`rDYPe6$+e+$i{(pCjj+H@b<*KJe!iDNf&o;h}HWt#>&!h4^0D^_f2 zQRxD!k!9_pAbyMb2NJRZ*8vYRYj)GBU~$0;tQ%EUO6g3-KK)dA2I@SxoD<|F1*kz) z`v)8Pzv5UYQT|KXK>9%D;b1#IlQxrfk?q!0bT&#qNdD$LBy+O4J|XkAR7>XTbI^KJ z%5X8d7`+5-M`ga2Wx~unE%WmRKEEH8zPYSQ-@F1pn)fL0>ni&uIE>i)-j}olg|fTi z1dx=?n@^io1-A+_C3bf7nxDLj6Ve!k_>1E9gD~Q)M6?m%cU=$>9G-}~ROt?mN~D7m z;^xhjQ2$s($|{ZN9fF$U&;NM!lE6%uW3U{v(n)_0@(y0ouF~JqzngrxoPLnDrb=bj zyBK{|PNOm(GZxJJOJB#BW6SSFKY%VnyHMU{KE4v|<uh}vxgI3z<QhJI0cBj7^J-;u zn9tXs&!E?#&!cP6KcO-okD@oAGA_`HbygZqwh_z&v9*=sBKT>@y|1&fK1xR4u8|(_ zep%8S*-8gYHPFwffuAP}+fls1OOi`FPC%K9%<FTMTgpben)bX8m2!R_mHJR`_8Im5 z#aS>(Q{?>-r#^CLX>?IKPDJpU7#JL=POg!;LCW*x<E1+06gvIu4X3frN!3L;nB(6@ zDzYz3hLOA|x2elJ&=dG9^XzFT@3NGY<&9aVt@sb*{UzSlSF2OFlP;wWUX^vK!{yc~ z4jbz_O9@}_k}@<>r-RUDA7&}Dlq-iGi&BsB+34vgbC|iF@*b4AtXxKCqU%wa2REYU zp=`6|{8U-$#$0FG;1O)MUnQTTc`xGKU#$(o6IuWFHemVsT7v8()&o!Et<C|-C|Ddi z{1Zbm(=>+A%rw#VxeiD0k~%cfhW5CaJ>DDJT*Ef!@-9GSu9$~PUFV}R*5w?7dktzn zT}&UuW})}%HZkX9&B?T-?ec49<`f_22ErFff)^v+z6Ld`ue~S9Iuu=l62j^n0drBR zVWD@UfUGT?H86**!P+8C!kGg5M4epMkP|MwMEYT@i*mch(Rg;^i5pKa`FF1BSYtN5 z(%#lVyIe}y0E+s?w74v>4Qy?srL!7A>N1hQL7=+VL8>7A-NQTB8IUm`pQGjY-7WhW zn{jx%^Kzij#BX<Xsl9)hrI~%@CFcmXp<cZ!Z{Og=RZMn%c}dl_hoR;WgkL~2XBF%d z5O*_vKFV<5B^#;<Bt8r~I@2iCnF;k4xyH1Q6oYe5;l(UzuNO$=rCd|$^zM#n4wK2R z5;l1|ueBlU3)}j!Fm0ctwaa%0uIrh~dC4IRXRiE43@Q_xCiyE7gI+~Uw2bE=-V6D( z$>-eHSI+WzKFWTRxpu++PmFVM<>jbcyO5S{KtF>vqC3!~=&NWm`cJeKJ(Q9xM<=6~ zqtfhL|0$o2_M)6~jIBncORhlWd}1Fe_j0U3`_U`W0rW#C*Rf((qyI*)K`)`qH=>k9 zI>=mO`Z#($pFe?0r`>{XL2pHWh;rYCxi{ku^e=q=EPBLvt~sEmp!cGS(J!E%LGMTJ zLLWc}(J!ILGN*hEJrUiCo`OD(E<v9}%jl2L&!WsD=H7}QqYv}>C+IKGr_krnr%}1K z^fNS%?nH~|FHkxE_YAre{T14dj-XedzecY^e}k?=Uq*k4j-rR}$F)E-iN1oKiS9u! zME`}p5B)dViN1l}fX0~jZbiqV_oEZgA#`8#C+L3Y@6i3xaSS%jwVHb_4nW_|=L69? z^kDQ7^boWctwFCrC!;b*Y3uR;ItBd}dNle7dJK9ZWAP+(I?DYr<plb6ROaLBc)Rnl z?3>8GM=kG99>G8FCFeKIwcQ4}dfjb)58BMf@gM>v>)>Thb9#FqU96s*!t|~^7YK+` zWezL3)3AqmfrCI<hwLq$ltDHy3=LBb`B>&p%5@DYWxE!YI&e;!TiNvflUzrY?d(J7 zr^c>>d0?`sgv^`4%dJGT#W0%?`@V)not+H}+d4T(BR9A;l7p&i8^ErsOu8l556v!_ zv|~d@dv}ky{jLx0o$EE++*2#@(q7&aXm~gcP7Cw)+BME+d*+w4(xhHmxuwtan^{&S z<R(wKaa7HHUHE0!o0rVOb*NWl@8Z79e22t}lVzrn*V9xd+E*C$p!qNTApI!&RWJDb zCi+eK=A-BdDEm_8JaIodhtHoxo6wt4X_Q+~Y;!(k3wj%${~P@@`aAS?R0{i9bPqa! z9>;R;LEnLHLKmX<qVGZPLuGE<jLP|#FQSd;185J*K3tjWBeAcbGPb^oa$UpR|0Vam zeVxx-hlo9d%J|xb$~dH46~`qVFd4J0yl>Xyu#N8wv~=-H&`sWzOX;iNH8C(^vLi1W z`#Q)@GitnaW=~#POYIg&XT^c`I0)CTIvl}E$|e26U$}4oH|il}r47sHp|7J$(bzce zoC@b^O+D9wa?biT4|X7LNw=YDJ<VhF&8k*IOz^6#XdG8XMI~Gu3&#29D5X*|XGjYK zFDZjmh`A-ahQ1$VmU8Wn9)cc>o`tdvHTO`m4K;O@d&#5^<?Wv9eGPUh@7=s_(RJ(S zT<(2|+`Ii|@24Fq_C=*%>&aAg;jzHQz+T?mNWd92?)MHZ-Uj=E{uzeork`kqj+o4m z_CS!tg)nEUAz{*%eY}I0)LGhc5@N;*dLnHk?QjyBM5m$4QMn(X9ZjQmp>jR{ezbt@ zK#S-PP|k&#>p5~Q^_P6ELw}8)jY_+74UY43dLECl4a?&D2c3HB7;PV}L1hAimmXMl z)637?vd0-s>h>HSQ8U%cu53S9K5N#zptsGsw-Ky5PIeLpfL_P7H}^5=*%!r~t`z4W z;c?#dGdBTn9I>p+{93x1bfx>eyjnYg8wsX|%xngZArDFKg~=2j6w%uao)-H2oqm}g zWT@D~!rte-nl7h%<t3pd)XSUaVey?a+548U>21=y%}!hRIoO=r=M;y$%!uJdU&@%u zB3pfa0evr@xlgJrg<6EJK`%wGM>z**uGuhem&cQadD~n+Z$OXab0aDRmh0YJGmou6 zm!h0kH`mYE_buPR=Ms7k+Jzp%{;6CCXCFAmd|&<@+KXPy&c+q!3Y7W3+>Ks|ei*$9 zU59=My%}X++FaKzqnr7B4J!8%Ux&)QQy)Qhplm<NKS3!&`IqQTs9fik>*R8s`{QUC zmFwej57o`+%cxu*--F(UuAt52y7+4Jv*?ZJooGLL7kUdy-O7XL=g@zko6v=<Gxwqm z=;zVZ=w@^i`T+VBlw;}gL+IDgM^XBvJc6=)EB^-lIx6cX`}Y;==D}<%r0*u6pFIM@ zd&z!c@NIx->oy#?(f@zz<_Nikhsxgf4`i0x1y<{(z)@f?Z|<A%?u3zJ$2}o5E0hfS z`Ve{RogADlf}Lp6%1YMM+h<mVXy|*Zf=r;^s^P5))z&sC$sFR;$trslJcH38cQo*l z)vb(rd49m`Vy=rmr_?UnALyZd=y_hUjDFOsEr+Yid)mx7hz%h$dwjutF!ti##Y!?N zE2_76ndQ7}R+$+=4vM|c-gZW^u#+#R<WpsX>m?sR?c|%n&t7urg3TdYD0f2HxiwLz zx5_5SI|Ls@{nHh_awnZkH2!2G+pmqZT=0^yDRWH;k$W8FRpgi_i_*g882lXcQa+!H zN>|Q8KZwe?EUEV#^l4PiWj%w=MPEVXT-N?H(*jiXGcQ8f#>JRF%FG9`h3NOuMX1a* zm!RCE7`qhRh+c;N66JWfd?IDzzL_%1h`kqWMc<EJhw>eU@+Z(nbOYLq$}uxB<!_?P z(Kk@$tMVk;oqIgXGtf>ni<Z#S(becB=oRP}(KV=yun(e-pjV^Mqh<6T=(VVfq#Mv9 zQ06^zEPWFy$I9H-Q!b;lYxyJS$5A<%Ls`qCDBrOtpTyj8D|#tPznEj=Poqou%<+GD zIm&%O<qx5EqSvAWs2nTbjs70J2Q4rZKZo9kZbCnbegWN%-j6<tZb5gT%)jNG=vMTP z=!2*X<%iJ&CvsXJJp&y=m!XfK_o0uX_oM%f?nJ+bzViU?4MOLjKR{QYkE0()e~A7R zeG-+i{!_FEeHz__?nEC%e}VoOeFps%`Yif9`W*TvbOe1B{WW?3C#0W84@X}>PeOl( zCeYubb?6_^3(*(R_o6SMt?0|>YV^<OCiE}p@6o@aFQL0pS&Lpl&q7~Cx1;|;XB^D_ z@&v{&x<5J_Jpg?SW&2eAFgwjP=ym9k|Bt=*0FSEL`u|TLKpfBn1pxsaF=&)x5Y!;3 zi3Avw5+Nukngl{fXo)Eh6m>AD#DHSQjvcQkRzyV&ihvFKz1XpFiJ*cN3-bT0wf8x5 zW)duj@AJOT?|&Y`cb&ES+H0>}&mM3-*bclG+z)&j<eXM`B^U%h1`h<k1UrFWg9m}q zhpgc*c6`^Kb|6i)HF#rd2=hesA%9|9K*nk51Z|)%2*KW|u@&<`S1XU0q9Euypf9Wx zkEN$MT!SO_W+Q*@Bjpf#vmfxjWj05?QnnVL*d1BJIUSTWoLQi(;oJ?%8qUMuK42}_ z3Va#d7nJ^qb9do*GT9bP0%c8yv9!}3<eZ_?0X!YtA7q^28~{q8WX*?u-#Hju0;Yh= zL0JQO7d#C74D14K0K0-efZf2RlqVIGdg%d5{Yf5<jTxUG1rHT=Qo)O(>rXeFa`dJ_ z@3-D$f|QDP_epRGo##q_nGVOlxg&Lu1ka3EC+D$PBHf#Wi`v7IURq+Se=@d}7rLN` zpAL%ZV2W`I^T#9WH$l)GWhgm98Eqqs9$sf7b^ic=?jthD#cu8c;||LlM!X`IEU*oD zGMEgG1bcw=JGxgs8tl*eY2XkL{m?T_W58*==YnByEGX*><G}mD0`N7k5d0i00>1{Q zf<J*2EPM$0It!G#DFwH}pTb}4d54zpFt^$c=QLD@<`k0D9lpG$e%*<)zwXSEP`$N1 zNiP?9(RDc@6L~7hpX7nDzqXmPZGL}&7i%;2qdbZ5TY=RL<yY<z<1T((Y)HqW`$Xs1 zKPS}5o;&#S7eTaQ6yc3l5T__#5Jo-aOMzKm`BLE;)vbRvV<>LV^2Z}1y<VX4>N|lc zx;9^Y*hk7PvXk=9w!E;F*(|UlybHiC;Kg7XSPi0gdX6a%tl=H~(eEpt1TW)V@^Lx% zDtHxG2VM<|{LwqLJ2!wLbH;$GOUFUSu9b+rX-Ak_!Alyd8@;;Jt(+`;y3e1eoLv0+ zD@Uw;Av{w#@&kz62GWBDZf34gY}1}mGwXZzR^=<i`x<{dvJ8+822p3ek;<E(9H|GB zA32up_9AB8Wf^YnBl63oep|s<Y?*f;Z;|Pp;342$;E~|H;0fS;U=D~~2u}i+fF<BV z;PW7Ti`t4u!Ogrc1;v&>4$AoT36QlK2VKzbm6n6~ygvm_133d1mOZyxkol*x5|sKS zZq<W(h%>g0z64KnRMM|$NDroP)sd?Psd#dqXf<f4N025N!u#(xNeP*PFVmt-<MY|0 zTsJ*X@|ugx_W-jkAD-GF`eAKTuY)4{w?N76e?aNG*MVY>-vd{GAA(ZmkHD><)JN>M zERrqh8#?hfw;|b#pK4ZwgLrVC`f`zM_*;Xw&MUg+K9W{0W#gZB9_2IgCh2bgMbBvK zVadxEpyYWkJjd>*w4gFY*97M^lxN+fFDsf-!gm<bQ*6Pr`}p#1zr)#xlYED>r_-XP z>kEu|^>6179@?XK51LYBflfH7v7EHt^*CwuI7ipx92LtsvR6IM5wV<J_0sB9FP>iY z;^|dCo_eL|nT8RIlr)=jz&ZW(`i3Y0(9Jb)!oh!nSk^i#xIv@g<xXiM4h`9_MbZ-` zz%%B{tZT@i)4WI4HL|F#3a!QHRT9IiWW-m&rCSmkLmBI{$Xhirt<v1~k?Xlf)&%lB z-juwuNxJgT3zi9H8gqjSDKZKi<%OMLbKzf7D8cn}%EKd`Cxa%-Q^!x|j>h`eIGjdP zVa6kmnD#}W?O0fY5KbkWmAXD0dxD@1K~FV7<ru~zc(fwZLkTR7O;?H3dJa?dxETi6 zddw@GP-Y7u<$b_&u*VwYG|DoMslKg?zs$0#+s-sXsq!@hFp|t4Ke;?l3$fCRL>8_i zODq1h+$5rLAF%_u6zvum@s`h6LHna$!4u(c2RX|rXKcggfvn$#7lN`UL!YI4GW1dU zy+3`Be((P**aCOyP&rc_{t}eE8vY#AFf8LA*|U)~U)i%^@4;ye9tpMqM}loZ)^VNo z;00huP}Y9w>%uF+PT*T0ap<>FjFZFP@=jdgj7H3VzyaXlpqzy`0;~Xgft;6cNGp6H zcr<u7DEk`^fqg*EBj`Sdd^;uk9GnBt{f!`l-4l492=)Ufg9E_1;6QLGC~M)YE$BC6 z{{e^a&YFR)jk5-zYvT?wr;PgD?J1zF`-}!fL-W8s;8;-9t^gbhP6jUkWlj8UP}ank zfhFKpP}aiRQHSMVGFSl~3RZ$AgR&Mr0+coIbHH=KbHOlpCwKuU_fhEDH#nR3=fI1> zZ$QQl;T@oSD;CeFNY=m)0c*evP}aib?8H2<5R^6XDIniggl`08ZTuck*2eD#uL9SA zSA(0tYrtmB%v$;0-~!&;fU;(OJa{8`BFNZ9&rsY9p2j<4nD7PQZQwjm*3K7zcYxP} zjK%Z}g{+ys!uvhodmwY^@J8?fP@2_a;7ITZumXG%ydGq(9ljfU3S1064ZaLM1O5Wm zf->lM4m=P<H^XOv&x5yvtH4Fz3*Z{?Mes}TC9pZB<z?^~@D;Ex_!^iGz7C!Pz70MB zt^?l%-vM`k?}9CwGiCu>g71SzfFFQ);D?~BD}4-J41NNx13v|uw_tq=OalK4rh*&6 zkzgHI4t@dN4sHVP1iu1b0lx-62We~JpTO_Ic6+ie1s(_f2o43efmz_sU>>*~oDKd4 zE&z9cH-T}D7;Ay7RfK;A_W+yig&hI+029Fjz$EZMuoZYT$eKpDH`o>&53+U>o(ytF zTX-tCKUfBK0%w2+gV%uaUHomJd>4NQcql02r7y7^vFjqIqaUfb4F@l64PhQx*D~uO zI$n}%JN2pz88L-jPaxXiK6;EMG8V8i)d=H{yZHG;72CxxfamYx7kclJE<Vzcnl3)J zGnc+3mvE*}Go82a3gMalr7}mlMB(-Fc)!zo%ZZhIFT&!|3AXE#2qt?G%+N?>l9vVV zLG5|VD#n`g&HirhUpP0TZg`}tF9CnQtCvd&P&#>}x0N#Z`)l8{P1iKivF+|7^_`0? z?GK}u<;(pDq62b2LK@f;91O~R2vQum58+bqSdh83a~!x3BwpP=&jgvPIrK$3FCPg0 zoA(gNd_(U&_yVMl3QIZV4B>v@81O*wOz=36b9`a?7AFrJ2Ihm<LT5aP?bEY_4}x-* z5F6u621N{KfsH6jDM*{rGlqwO^o3#0GwPW_($q7BW5ILaSAjD@&g1Es!jHf(?_Yoy zfUJo+_z8~zF9y#BF9B}=<*ec7;9OApJ2`8}nzS<?>;Ya2%D2DQgJs|ipq%}aGl$QB zw}5i?Zy~q`RY~8h`xlGA19_J-hw=@uoH-l<%9+EPz$M@<AboiF8Sr87b8sp61Go%q zLqGF4cs}?9I179Vyajw3{2E*VN<Z{0*aCbWl>X=i@Nn=&un#C_8jl5E2E~3*U-i~e z?xGwWaFer+m+jPkaL=Spwie>keg4pNm|>*fAc(TdC^BlxR7R||Fgx*A@9_8<&%w8s z`kKeoy;Lz5qV|3>lkUAo%#1V<V=jzo@HgRV)Zj7Pc_g|JXq&KFl`QYwSRW~fSgokV zIaxu@g=rS&^d1{AG}01HT*Z^~8<;3`qgEcK74S&X5u;Y5WAqaECfBkftY2rBsYAq2 zNxarUtW_l;e#ctfiZdE0kIX8<VDy5KUoLZSW&2Pb@hq>=o+Bf8b54q}ocD-siLL4i zhq0kPZ=;K%Z|{K<K=voqM$vxtPMr1NRq#Inr9wUj*MJ*9u}SPc>pJvi&>_yRz&$}d zHw$tmINT2W7VHjw4>G=UegQ?waqKaC1U3fg$DMd^U$7}Cwq_4-1Q-BEfwGr^J<+|C zD?!;q5$VYu3hhewPJRPr&xHLC-7`5El)V!6XPu6q2#|4kxD-4HWPefjOlm>Ggg*oi z0oQ}FM<TXK_D0f?o$QUA0QLmW0*?acf@$D&U|&$$?y;b>@mnZc|Cqg#L~MpAe^c<< z=r$fXXR9YD`1M8k`hf#N1!h%yKEd24!6lpqZ=!5?>Mtt2kbwTixyXArjZ<351MnJ? zKThx33m$W{IYe5|RP8H6_%p3Z#|o(pHcx2<Qs9_fI_ciCz3^f?%uQeE@alcvkPp+e zyU0L7tjtcg_{wnnm_HsF1xQ$vQU8SBTRR&?J-Lt6kL>BC0D~=mHDgaH!W!^cP{!sb zf-(jl4$2r@QhWov7<?1F2V}mf-w^)?l-$Tzd>bfZ?|#IM?uSF5jJdNx8DozDS*p-` zK{kMA@h)TSnV^idF9KzZE$wJC$b3h~+IN96)@FX<Yz3K*INyNGEA$R4#`8MnW?Zae z?Q~Ga+N(erV-G>k8__Pyz<97fdYk~ZK^85*yFnRSF9utJwV;fxSAlK7PeB=5e+}*j zZUx&5Qr>vd&WLFTtd;6_d+&e?e!m^)Pv!9Kos5@r@$No<&;~@?OYrO0b}`51J)-Sl zc(K|pN*jdVfYSDY9jlAd5TbNZ>~j`Oqjcum5o43XaNS2_AiBmhMx&J1uE^{#ke(=f zG}s+H9y}bB_LmCgf;~a$br^Ssr-Da;SA$1`*Mc(6d=TsdJ`2h?a}{_zD0PxYon*$; z3H2!7_DTIZ*ZqE-l*uXfvZ;9`Wm+vFXZMM&mWC}+y=^$DtS~Y7D{GGT9;vMP@M0@V zOo`M$xtc7KDXGA8c%}lRx8}V5*=nG~a2U23KZw`99#6bZ<0nsaLn#$@11gXWJ5~h> z;YF!{Z{J}ZZtf#8mO5_>ylj~=#uvHE82=dXM6e%t5_l3wU#Q<u4+F&%W`RZEaIhMr zkJPz?%n4-fa0<8rJQaK$91XHQ=bR3*uBCGY*0FT1&>zf!e>y001+g<@LDm~|uJAfo z$UF0SrwEie!X)rla55;m#2ON3z@yLbZoqzs9<K+l|9xGuw>NUpF<bS2(8~XUI*CsD z)#=Z+{pbTA@~MRCLXhYh(1kx`4*a9Ic__fE2#hDX50r1_j?jK~6mBNxXT^4@_=!G~ zu+T)M@rleuw|W4qm+4bZ9Z5aN{7vl1G%y{U4oah`1V@7BfYK^t9>+esa~^m#7zSm% zb{6;@$oNaYL6iAhU(%5Iob+MUp!B0MubTwU1<wH~uHI{L8Td5sSAkM|na{Ddr1Lmg zOSy@68GYXjP5~E!GOxT1ybrt`{1UtaWIX2F1@;4FzQ>t8=U<?l<(2u~Byce}8<hDT zXV2tYz3@u#LGS}m=6#%v(r?aWJyqs=Z9$pubp>U<cP#iMDBq$j2hRj+!I|Jn@B(l( zxDb2+lzFMl_g(;B244bS0i}&Jri`)srP9{A<0kv9H$=A)PMhXT&6~n6D7asWWZ}_$ z5?sP*aP%j}G#4+f_DgRh_DSkj?)5OEH)$VH7E4A-(nxwIi8l`2l*%P<5?MN26L=~c zynLYPy%(E(nq(NU7BLN8iJD~pR|ns~t>w>sL<XX>Qv63O^HXFda`_BA3Y2+=^nrDt zjJv)7rO(?8UIL;QI!}@L#-qG{1HK7<3;qboykiIW0~kkoKY~&pKY;=87qA=nD|k4_ z93m`saR)dYl=(>x7!QsEo4Dh9;*32DaX&odr~CMKNTJLlYk-XBr<Y<+N+aL#yUv2q zl`6AZi6=2Am0`l^pt~*1WqS*gYl67$MdzP*a^!DVT>f}IC&(+4n)AlDQupp7`Ku+V z064}nkEEGPTF5$lAc&pN^GeiUID_}zU=~Q<r2P)PrQY>$9C$r^>L$Dx#INdlhdA^y zraxf4oS``F54>|{av}5FNtI(Rn3dsPDk0pbzI@Vgijt4$Y6zyQ_+nrs<L2FrBE%0Y zPoJf6Na2kiPO7NJ2R$F-RO+;38=`c)Hc9Cvq$(=-<Jt(>u#}iOcq}fn)#HVdZR1HV z)R9V&HjsiG+(%?1b<zoj$W9)L5f*u&@8KZGI6%h;i~;o=$PiHGB16Ic;K|_W;Bc@I z908VrBf)dQQ^Cu@(cn$sX`qZ1(1GxC;2EH_nH=x~Fc<tUI2POn=7W2YxACB?Hx_`M zK+@8C<Qb1>KQIx@f<FnAw!;`z@4uZ27V};VP6tcC^TD&gxgdGfISr!HIn6XsbY(iY zmGsYoK0ZdLSmV?2Dt&}=S8F_(C%Ua!ohqHo1XEOsguMruyN~_iF3fv9m6`+7uTt~9 z_lQbGOrp6CE6elas+6=gqX^@)SC81t$T}7+&e=OC8l^n*K~KmF=+nJX9@E<_C!96H zC53Wvv#2QQ;@3X^Kty`^wfyn89fmRC)36-w7O<{)&q4O?BQh6V?G8h2H^@G(>gFsE z+u&RPO2SoOHaHuU(la;Kvr3FvRX4HSVchg=+STA(-bFX(fp>zJfy+VkHoO|dkKPrC z%?YpPo%M5Fe<F;oh2IReC$G1FV#gPPGS0mflrhR}psa}#x9a9ypxE<!z^UM3kbO`+ zTXiA0g!jw92f>Bl!{Acz5%78NQIItN{U-Ela2fAAKsjU83^_dk?g2gt%Dnq2@L=$1 zka?Z{b^!A>=?}yGK-yt=D!39X16P6Pf|NacCAbEZw$Ot#V%q|15Ncm#E&uM;crwq< z+QJdq7E)brAa&|KzOPT~wFOZ|e_M#?d892!R2BTmwUS~K+j?Q#wjjE1e3-Tn&%05+ zNLy&(`SGcJ&|`XP52v2mCwbmHqYFpuZaVUDACZ~pa%UL5EdNzx+=}-%z#xcCRNa0H zJd*df!DGR7;2`i_P-MW~jLy;C2XlG<5X5#l>p|Lw^BIV~JD-E-x$|ETJ=EV@xF7t2 z_ea4mLG(pF#MZT=Eg)%1-oqQf@4#Qd??G8t`2lPJ{s^`Oe*#56eg<V9=oe7ROqlRM z@Hg-bknvD>Jm|3YGX-Q^6h0dyPQ7ck3HUGGn}Lsj383iK9-!#pq3C1Z7<;^b6LSu< zEx4#Pp3EaUIGLZ_swi=nH1#w0-(Swz$MNlU%64haAo<+h$CNKR#l)46iqS}2=9fOd z(qkE=6kZr!1%KAGstKMWyr#l4o1L=wIX~i$$rgJA`Qtg<YVI@cWc+G&>>h~hm@FiS z-${2uMDbH`2=b@b=4)otgrl*Httcqa)*&8D#^k0=S&iuGalCs}B(@ZfJ%!aU;Y6B| z9Afet_f=Gts27hrfOlK16fztB-u$t`TRMK4DWu3U3!W<^$}MSxV40xEQhNq}Ix?JQ z%S#>!KMM4PkLgFY;MsjdSETLrf$^E;GxpIluls|HDfP_GK=2^mC1=UtX<%oN@rB-z zE~y>D`$ZsQD!o(gFi;B5T8G~I*Asl6ciMRPQ}8J8YcLILL)yoH$Af*rQ^8}wF<=HL zW0QU$=T4kVa5XppWR2IMPYHhjo(MKU2!p|H;83tXI1C&JG7bu}cH@iyv%yn9)=(VQ zT*Az=_50Q;@J!xoK;|0ZYrtIaF_1ngEJ7{>*Mk#5=0f`2D|-}r#wQajhA;aaCE)2G zW2SH+SPGVd<=`}s@t6K4P9=CJ?{d~>6-fKnyZ_Gv-{GC{neNGk!Ogr^fqXxtXMJRS z_#)o(!8u?BSPi}b)_`IIke%9!ZOAD0ti-7_f_Buw$>2S$A<ScJMP9yZDg1Z)i3+$6 zn&UnVot0>KnMlk)F2U?=9cqPyR|wBjaV{s3ue3|xnHHkghv)Mv7Un8+*S^@V@%08F z*S=VucO%gpBC(eXn%jqDRyRMwG}jwRlV2dosa?o(6O!rp!iZo0oknnj{JCaJe2QT) z`E|ofrqbb>_87TIDFvQu3#85V@<M99#awh2FZ>OQ8>@D*FSLoq6hopG_j2`P_GBcg zRNhS{R4ndXCk<V7AE|d~_n9!dTK<jbiRc376LkK$5R~!donQ#O3(Nx-fy^`XOx9W8 zzj&Vk-V4qG7lVu~o%=z?STffPuLB<frO$d8+z!&8>Dj_Z!B%mM+rY!Y$3fb(p6SX1 zpX9v&d>WhuJ_GWnXSlY5D|l~28CHTF!RJBN)AS72n;>IDy&q{U$ai15Kg8ao?hggQ zx8QdM{{tQmt^;L%Quc`^fbW8`AM+kq34RD(34R1F2G@hngCB!0f}eq(gP(()X@?uY z@!*%B>{osT-Ue<3<(trNz$KuZ$&xjzAHa>^kDz>y{xc}Q-SG=J0Q?mUfjhu)AiY8O zX^^pQ_ysTl{13>OSI<%ez;AhP4#rXMEx>)iJweex#>C-+!F|AfU@LGK*cueOurDa} z##pG{eMMW~9nK%)Cg)!}w;!yz{LzxKD0~UAxNX91;O5;7Af(-f@naf+ZHm(MOA8P3 z7q#%>w(_WD8evK!m4@Rj=rq)j%*Metc&+5meWbk7Ze&zE*)k76J|cr4cr=&{o&qw* z2uu4&0j~tRfOmtmH{F+%y(H!$x|j3}*pqk0xw=>MAFwa)BKPL|$-VA-wtReFUi1<3 zEEmo5g<oD-8P}kWbCR8AEt7+y3t0n(%YpTrky9s4EuKC#X8^w=nKQs##pe2I?D-lr zl@*er{3u@s+PIq5^OaFLp<>E-4wvt5y(HB0lASk}&kzo>?rrM1XYu3ClXL9n=FM7` zwv`g`OSJ|3yyEyA`TU{{VTBzZVVkeu_O%WP5eHeLqN6YYT15E#R5TYu<%}KASE0r+ z$>%t^c<KbdTPvR%1InJ_))9#(w^VWSpGZ8vw1_P!BXi{4qGgp>OMS%Iy>-yNrc`RB z9lqXd@AqY0%aCA;mYsusCwnPTLDBfh`DM(8TC_YY%H2B!5ILbxhSoQ0d7v13hu{4i zHhfV3q1hSPgN6;w$sRtkfA;9C{w!x1A91lhvWAVw9?@_3psZ|_;FrXrezFFQ>OVMV z$gs@*{5N!%*5xQ95g#rqFB(fS0|$@J3grwKHhf4%cFqZdvWH}3ss0&HlglfLV?7NU z$<MG3?N6`NtmOf2ZbeClP0|v4nk3PWE1FtC$o@n74a*!fbYRZNp@X3MQx(lx8Xsjv z6U+QQMw~ck1XF0&IT#!}!S9?kyq_=dkrOocUi2pn8hE5Hb#^SL`vaevF?7Vpp#xRb zP3n1t#S{HLP8=4>I6=$wHDwy)m>*k47s%3{EoC3nJh8vS+`&m`xe0+1*KpSN(Ww)P z%17{PZv!f(j-xITTE1^wrIq9iAAeSbe1wuM7lkF___cK`$(x!(@e*3r#m1!{t!QNX z;{2|09?WHDLzzYmA3rXKOeeJ55Q#_q?iC$3EhnMn(@{|mAJ4CrtKT-bi9MnS{f1zO z`iUVTX5^XB@@5-|#>`L1mgZ!a=1naVYpp?B<KqhBW1wEAt6|xRO=$ULRBBoJ<ElAY z=JR|3)az^?BPX+X>UfP?Qh(974012@$(x)rWIUTF<1~Mg@wX3P^H!{+{94)|b`~Y$ zBKEwf^oMKyHQxPkywy6or5ZTCyx$4MmFg~;zbD4s6id=;s90KYg)u>VDT<D)h{_HM zGKA{W^bW<fpK<k<lPsx7ZF#+{JsB0z(DBpNMRcQsaq%mf*87L``KmV}r59<e)H|7} zpl8WMH%lw@?s+Neo;INTpqE!IqHQl52UiQR@(C^D3~zw^(y#n3xn@gBJ`2lA5>iQ& z$zL4Fz$_EYXirw@cy1CjVv#sk8Asc&B*wBF+G9e?HBs5_#}7HX`Ig$f!v=F}*Dr0U z-9wGL{;+e1RTR@!MVH^T+7!||<y1<NkESMoO4ciz2x6^q5J9NtBzOZ2Z%7_`D!17t zwCv;yK4Sc2t|C+69Dq}Q<K(Y+EvCkHFdq8U_uy(qW?p%oMkHlABxu?}W)XdQ8CRWY z3@veq&Lb<D2`!t%wsviX4K*b>rG~goCQhJ<s74*&E08s5nh}ZnGb=)K9Wc4j6y?^# zsAj5d^jlMnR%bAt`~tTpM>$!mN+X6v4TsE)(4;|A%X`Xa$O$c%n0$yJOhymFhyJ)& zPC0#LLd(Z|1wAFNv?y<Cc|Vq*q`ox6Qads*Al6JXBJhl#)cXy_NtJU1tw8f80;!5* zT#GlucvLGlUOEBRc@kQlZn#E$+4D+hDd$$DOd~4BYNRU7hBIIaM6F8ZPLQFIM6lAY z_##{pgItF!v5FkIma@ToYYkuQD^E_p;*uFE1X1KeY*uZP(H4D#;aROWwZoEBLd(N# zG~=g^#}sS6Zns$w>8g|@8)a^!d6T*K%(SxDT9E*@W}<3kr44KPRL}Z|h7Gs*(jNoY z#14e}yIqCpB<1!wk<;Mf2?O}Zoz=aBmiPK2!~W5qib#DLpQ9pez!Yi07y4wcc@e!? zYME{|tApsxfmG*oU4fL}{77gy#iX7Qk&npjF`Fl=BpO<JLm8u@3?s(#oAp@Ptb)== zXPBckBNskO361^Ij5m-MP5LRLNk;9xoXfC}B#b#W6O9~gs*l<{Nnbz%j5Jj#Mul-4 zqQ45Raf$j%VTo&`xz|;+_hDb`>P-UIv$<+Bvu%2&to`!1_L30V)6Vt95;GnV8Os5Q zX?f;8SV{CcD-#*pXrfZ>^{iA5W5a}&kJPspo>ofS^2<RKNupB!Z`!!M(MJv@pv-h& zlFZLW$UgJ#H)IT&`IQ&(*OGQF^~TuoRCAs|g+AY3Qp~;>U~RIJ7a4k!m%+?`)JXe` zA;%vR^n@<%RF<YmRN|f29!II>25g$rzCF2gGbs)(8e5uIIz!o#mQ2zKJW?VPIqhe> zso^GH8D=4`O!FqA*jCZ*Cz&4;R%fa5dW}x2yum@2X^!&4VIm(Dyfl#p^i)e}g))GN zX}*?Heu$EsdnR0)$#sS)*%zgfj`;W5mR8XxHVae{vvo0B8dWb-QY%EY=UJAe_KDGS zu~i7^rlW>C-cUkHRDT$qqgFT&QMt$<OiWZKTPLaj(vi(H>1t62>#wAG)hZuyxKc1q zDxBDEOM9(@@XO}XIDQF|UR1_t(<5b!Zu^oAxkyf{MkFH5UJgK!mN5oev4>hsi-^w4 z*f<ll87#{%)O27I{p|6kN0GQ?ZbsZpLa=`-9)5I5IMO@Q6!P*_#}2~lgFd<0PG(S9 z=J<j<ews@?Nw+7b4<++ig)_8Akg=uJU16ize$|z}Pfp5`UY7SWf(b2;GFdo9f3(T; z{I2OUtxYQafmSA;#-2$>Bbp~MUTowgc@(pvcG6}`t5W=lg1ljp@v2w&;<?1|2b7Ly zX-FoWVo*M^G1#t7{K^!tVXJEL>}%r;uOyN|CT3G@W|>ENx9bdBMNR>=D^UOUMN3l> zl}alyiYfy_OqImYGNKU1+=*9FrUdIC%}GZr4b4l<6krRhN>UM~nydxV@=KcX36`jZ zwm~(IGI(TJeQGgEE#j<SIHOR_qe^GzF=7MdmxClq$(l5`HdgMUiW%kQ^iZ0*l<!sJ z)y}GPNSWgtg2QnpjITe)k$TfQ^@j7J6j751(>MLjR6)fYrG~mF5N(^x2;tu*2ewYN zdCxMr9cYGgtR6B7r;zgdV+k!kH;z_2rJkhSM2`S-R1alc1^M)!%Kk1DZIXM|Fl~RL z$=w^%Fo&`PrjnC#%XcbLrDpb^<&s|!B3>g*Z86OvF-V4_HtVaN8MZxc0{aK|s(}f% zmMLe%s!G*0_SLF4>J*2DCRp00Uh(J8UE$Fm07+>1Y#Yt{09_9qAd7*jizTK-XeZK~ zxKkyHL4*5iE0VQ4%4^nE#Uh%)>uV-s!z#-4S}qlNBe%J@a}zOqznc8`bxd1nf$8l` zY}eZIyYmnkmj6LO|0u!?=|u1isJd!Mj5cT`t@8=pj$D;5Yo3&NSZNW<(Rq4Lx9Z-* zF=jAFO~P9y7Hu=`YLF>Zbhn<P(!95x-BqQMiJ~NFZm<=Vj#jE1ZQ>0YZ8IWaam*+x zqSpb${Sl?iar+zjJsVYRvD0!PqNuj?D6&wcdf0$Sa&+`&2QpcF_buADAto?-Z>)Ay zdseRv$w#A<GM9<M%K=w9ZlfnUhV#t0RB3&sHEpSWpOT~16gwx4p1BqmPuAq_^vTB? z_=sF&dw{AiZDd%9vBC{>cE;>4@<k(J9^}bb%>H~+Cez%tb=v;gnqsdZs2z!JQYs^9 zi8)2ZoFvhrCE8lXT$+wbb*i3CG+FB=VROc@RbfX@_P2&j4Gyu&Z$^cKid8T4F8qyq z%3?ixPK`f3<l@x*_nX`H+HZRoKTvtzQ5hSre<Y=1cJ)c~E<I)9IkW4`ck%3Vj$T~a zI*|3qq!DYsS$^3`XJmbKNzaNy3is@?SJ|BNHvWf0Q8#FOCpJ!KH?}gd{ib*04}biT z`@bGtu>bbr9$zira@VwO_jW5s@axszws%KdoVxJ76WYyd-RiQr559iJh-vp+`RR%G zJU_nsh2PKWlA`BB$lt9A-vvIosN*w7^+_&kbN3BxgKfW<c;>`A+rRSDu<iX%?#+QI z&O6}mtv7$V^4s?Ycj|OY?yrsaoAv#;!#=paXXoMBd-d9U;TNNBB!91}zilt>`0VT@ z1=~Nl`O_8qY<cI~rE`j2svLW8TCcdRr(e|W@y@!BNqnPk*mK&A@k^dte*e6;UYox6 z_IvIuns-*0s;X0Zopr<ECzaRg_cZuB`Tp#$-!9(ggD1}H`d#Xw6Z-VM=aCW5mwpjW zcst{UjeR?f<a{A}$ic>0ujGF@?9KC^&raU<$&N>!eeCJ|??3Lkd!8ORA@j5SLZ2Q_ zdHFsTf5#ti-d8`rQF6t_gVtPsSn#TspZj*sp%1QGaqSOl%d5V4BW1AOO^m<8tBY<w z=AIr8@Abg1vupaCvSUs0&F9=W?U>B<{U2yNVfow|&QEH5`<`2O#9?o}|MM}|^mwiF zQ!9UM{L-2uZ+)*@$qO&1PTgZ;-yWQUXOB48_?3nEqhCxbZ0oE&b3sYpf)Rtu7d8IZ z_%3fP@6xN;2mQYsz(_{@?SId0pB`5H&4T-8#OJkGos{z8Jr9=lzW&r3?+NU^XZ!s& zV?$n3f5GO1p8fibNvrSae$&r=X3t!;_d`d2^!@5XJKi$CWA8`q{G5XUJ=s$ZHg3PM zqO8l|`<>F|(QdcC-}S*0*QZ>+r2U1LytnYuv_)T?Ap7N)sK4ZqXMVKwo06*z*>cC? z`Cs1gVd#yk-Z`aD)904{+GWRSwV$F?Th!mnUv(V!aplAB@7TBVteJ;3>-5V**A$)d z=1ZTCIN+<7CT>3sC6#-PgN<8H+y2O24|V?N`(D-W9sYLrjMYyjZ{2X<XZMWhdj5%} z`(AY;=T6mM(dMo3Jum9?*w)WZ+Vi>r*S~l5$|>)Be&J<jtU2Vy<Gy|Tsss53xS7Nk zcj2U;f7$osDUH^SJ!t)YNe4IksO_BKy6Y~udRcJ)Zx`>u!9DqHLF#S#k$b<pV&%zW z_Ic^@vfI`SU$<uV18d(O)#}x6ubxzXSkhUXQ&4}OFWCR>&hwvqW#)b7&i?PceFiRT zd-OheX%`Mz|5do`h@Z~5mwjUPk%{lIeGa(%^G}_--}z>1Xz6b=?wNi@)91E6eenEC z_qk-%Prp2m{M4T_=aU(qTsrWqbC2F*;_%y3RyDo!yZw4D+ZG-=;JEz{ogK&F#x3ga zfP<zT(IIg}?c^8txjp;NcAs3_eCC52)_-%*vnTX!etD}8Ldb6qN%xKS>)IXg)Eh_M zGi=3@Nw1G<dDHTbzWC_T#OddBt9Y>Mty@w!ccK2WlE0lewDRbq0#h!1W5%$9?mK_r zU7rkCz4v2DFLZn4)D`dEjxh*Ge4mz_a?5wUR{!wZCub~9x%%P2;=Otte^k4;ZqDU< zCbsydCHmK2{SCiq?O7|Y`Oi5?CtY~)<ninNy`kgTUv|6sr2G|etuEhwN-_3uk@{P( z^swiDIpOkaI<(vT{fdV+WIS^8Pw~O*t#?j+YWtp>&f0t{=ONVJl`Aited`MYs{3_M z{_y_6FAO~6<R=gLw%?tdPkeOw<MYnAqmVPY%_V=Ay<Zv*E*`O<-&e0Z+b`p&igOM- zGtl+)B@eZ2UUXv8p>m+{PW3k+<@E6-6{AMqx$nvU%A7v&!~ce+&A+d(>ZbF?*Udil zs^@Oz{Dt}}Zu7;|Gp^n5u5-pd)1~0Z&zAhR?-^^}SbcWcF~LjTn6&ms4hM|pkU+5U zjw|nKz4@4j_Di{F^QjYSnq7L<&!06ZAAA0}8^$gBdcoE{$nOsI*Lsh}?~K{eX}_Lp z+D~}(@?P((xvWK-ISaZqy}$K>TOR1K<a^Gjs=q6axuE94r`k?fJ><9enmLWHyZPXX z%)mjP^!$EF<(VZV@xwV^K;IB-{8aJRR~&iniK){HMx61$O}z`+ZCO)w)!L#L?mc{K z(Fav!XYkdL`Wt;yW%rwsOL9u@KmUd;`<`=c+|rR%5A?0Bp4Dqeul@SW;GpV%)!&po z?>Jyn(<|3@cyPs$SCkF9=!;_(EP3&g>sB2#u=DFb{qRgB^}Cm(`|Dw$eTM$K$qP%z z4m#-J%CjH8rrB`^1>c<X=21WIG53lGUm43?QtGco&$S<)JiJlSDf12-{>+L+U*2}p zvQy?AxA)$4m#po!`O^Du<2;V~d*kCqZSLzd@{q5`AG7v}Io*<u+h<z);itZ{@S*Ih z=l4By-$&_Z5+&Vt-g~RxNoV}9vG1FejUKIOv-#e8kNtlAu_>3oe9P&po@n2h1H$L1 zze`?SzxwuLhMe|E=i|?s@Kcw)O6PrX(Y7P1*VesVwes{fr%&blkop@tHo4i*>;Ap! zhgI_ijQZ}nBezfbBxBx!X8XT3vv0wy6Nbz|?a|d><KNa!tbTZOuj40w`$Ot+SAW~} zt#|J{q}PD8ZT4M$Z_$xWwzK@2r~dZt+T@LI7EXG)<rf!popa$&w>RtAwBI2eKfmph zM|T|9wEyfuoPSb(<5nHC=#Z_Ao;f-0`dfc^Ec3p%s$MDhGP$x*U7s_SPdxi0?6b@^ zgN^6y==|!9jc$AHspB5pYr@(yN1U{vUuu&>Q{Fn`z55?Y?QuJO)@b#&`j?CDdAsPM zhfjO5<=yMQKkw+9Zn@yB<=alrxZ?CKGk@%K!Ty}nQh#UUy|%P$=$5LksZB%9#@E^( zzxNwAC9iq#sb&vv{`9fKu1w{~3~2`&uidn7;X%m@o?3eF9S6+1|J94y&;RbCdz$sU z;jO#Fhp)Zlqh*|jRDYGP_c)=`r8lp8`mXsKHy!lc1@8^3`}mA0*`pu*_1O~-?%aJg z-vX+?raeYK{Ce@!jxTID_nRgkTsCFq&`z_uym`c;$!~8u<kZg3_2aCy`n!3;gsHVZ zUU^Y^qch*1|H0@Jjw`<TrNfu?Z+GA5<l|S|ef$NS_uNPF*Rk`fJ<cw>?dj?nWw$?j z!hN$}xFhATb<dtUy!9)mz0@fCeO4^)SASpb*j6y)riU&V{%!HuJ<c6H^2NoCo_ntM zC)4^be(tJMW{l%tPE)1<!N$e;Lmqiy=(zUVUtD&@JLMO*zv6(}@=ss9rN<9R$6vqw zmGU&c2~vOC($8Ge^x}6mJiq<D)V=3CSMpoQ;jOP<u(Wmen~r$+hq>Lbf7hwMu`ets zd~^O?FTDQ9cONYN?`@;r-?Ze;;^$7w_^#PelagN_bwB6D)ZaTJ`%HWK*v|9L34hmn zbE^+O|MAIz9~?Vl;*ys?t=z9!kA>LrUacj6U9SDl{PI`!Y_mtZgW3&zYs8Yn2R`vl zlOf~c!U->Kz2)|f-OT+K!N%pIho82`U5B1jlYGlZy`Dcc_uRc|_B!_aaksvc{nRC2 zbbjx0zT?yQW=!gIaQNE!&8lZV-Y&b_thxWqnEyu0<}Giz^4Yteo73ft&pEfta5~ty z?Tf?X_dWIUs^v%B7`Sxg=vMEIshHmE^eacVIeyjh{-a0cavoLveY5`Z*&UAi?eMne z|F`kN@5jEpA^XJ(Hq7mH)Pe`5t~&pQg}u3lLH(^7I`60ACg*>+Jih#?X=A=R=Hqie zJ+aFHFT8&3=&}R9dHu72v~woL!Nyw$Pq}f<hVowr=Oy($;`x&7$M$|`@!gkyb=cUA zXJ+K|z8ig>uKw;i=*07H-#7luOE=`ab;X>ShxOfFJNUdO;=&(X{neUwx1Pl~;xYC2 zOaH+7C%^k?@W#rgZ|eN;)T$>>UG-hs-Q5cw&Hke7!mUeazrU!z4=2qyeEy>Sw{5uO z<h1ntN3A`l=(%GTT{`=u$#JdDd;O(Thj9Reu`%P$PiI&4zvA7xMVsEZ_@-Ome0bKP zL+@*vuw}s2R}VVq;M+Pd&be0oJup1}hgm~9o-_0ALm%mwam8z&P4BdIZ0&<@cKYe6 zXRgUwGL8c=q#bPB^rd@`$=avs_IKJ$bQT?V`s3a2_|HXsw-<~XS$^apuU_}%D()&& zf44S&X267p|MhNKU{d&_3y;6$srUP?y8Ojc({AW9Vf5B^pHsKDsK2{EcE<J#E?U2L z+WhC8nwL7wT5(9<yVsun;2YQebn*75XDsC0q57LyblS$DbKm^<<D=huf67D8*Ir%l z(|(8C_w1KfoHBXV)5EXmh~9H9E!g;{yhEpadgd8>c70)=FK)W?w%$*U_~@yl-o0z_ z#K*3mRyXncp4=;;{;u3|ZJU#CZuR{6M|b=#oVD(WBiD6l-G1dKA8(v>&mNtcy-%7O z)Zeqc`|bbE?9AVuI(Y4vbtz9Ix6iuy*;5{zaY@bh&tCoIfDTKLb9+fQXXP!;&l}XD zHtxQ}WgCA<-TUPc7w4Tk^2oji-22YjX^&n!f^(<p@5hDb*JLlc{K3`*Pd1%0@9Lv^ zZYyZoY-ZJj=~q0xAb0sW+xQkk{Y?#y`E*8?=kC}t_4ZHNe0<Yc8@41b3xB<Ek0<(n zQ`vjv6ZDrSb&zy_D{J)c^XC>U9l7!Djq~<7rr_tKv-huFv+d-EdzDXJ`$p%*v~%^B zGIHIEUqA56Q8P{`dM^FDE0*_q_m`KRFU)^(L&mo3P21k3PyMg@Tl(s!4;=DJ&6FlB z3*&BC|IEC(pKMsW$DK>Qf8yjDjvg}gl-KxvmLb-W$lK|6%$Tgw;)$#omyO9NDVba} zP8UAP#+0+UH-7pU7R7X7bxZ;4gYqjgW6Da$jp00!{K<L2?&EeLj-sjKCRgN-k3?Ez z*KfxZl;@8hTQQ+~;oph1{D`p?MU(S)DH31tSf(v5-K9wCm5<BJ3yLOCI&&azH%Dq> z-=#=>#VsB?v26F$rdQhH5?MvtrHs`RVL^E@YmU1qGB1Z^<@u9~#(FuNzzS(lPPdi? zQ!3MrI&{pb{1|lc^s?YdoHicQBXtbRnX0)xQoE;i=fdh<J-VlksbH~X3^C=8FW4P1 zjVmtYQ}6Nyq8c-#Xk2M=S#d#m@RXvmioD6e5#<&6Ma5%|NIl|+G5w0COsU|=(~L2v z^c%yk;7u+YGh_s0k6zt-_U_)Z=aD^nk8#C1ZCoiAI&(<pA5En!Z}LAHKh?;0ho$4E zj+^mMCpC><_be#$O7mANrYm#Lg!-)A6g{ipMH|t--B;B`Q~3H!HogAQRHpw<D!bB_ z8g7-lPbyP)XMSyq<-&0}LGzEwx$JlHz5Aq7{y&mR$^S?y<Nrresr(;FrCuU`#SZ!U z`U!H=#V&RB^&)XcYX5}k;%NB9DJ2cGr@w4b+!i`Lro-Pw`9+EEpD20W->T`I_c(bK z<;8_`2cAs-iU4*Vt@{ben6hci3wBTB1?9UMl}|^@#un{bS$%QnH0PgG^Rxe<%4Wzc zV|q91yQiw<l5+;grQN3F$yjvv#9qL5q<q=2OR@Q?O55dbDQ`jfl;ZrnlA>M8(asx6 zLAid><HZ`W9e>%R#SAw7O6~e2md|<f(p~Baey@<)zwBCV{$8|Yx@)~Vgy-uI<T#iY z<zJCvy_}Yp%f)U*ySDI9FE-ySLCmX{#fZx6zVRNtB3F)iN&GD-*txZ2e*$Jg7L9hz zO8B&Nw?v|S!ERZuvPCSZ7|Vj$ZZ(8nrTco+f~n;NQ+BNvtEW^p=h*IUWfdhQe9*c} zmF}w=V?cI~&9!TcyOgDRMa9(avg$PuS=kJ^8Q06&KhX;Hi}YP<EA=w$DN;c>N2nW` zlm6un2kYxMl@SU2<(ORSyVKQ=zZ2uQk{LM>A^weA>M`90DtwnSS2jMcbX=hq<6p6| zz6Q5TowYCg?i&*pus6UGc|_QMr9|~KR!3Y!=*cHib-S;l^VU6ccAqxWc@`Bnkn3I6 z6Pcv$-WWAPE`yR?2rs99tG0ahCEqtV`CD-oluwY4EO$=^3(C>3(tp@uBZYr@Vbvs& z+P!FMWG($~N?A_d?zTo-G$n6BWEbIY=4|q~{DPw0R!)qGe@o_X=8aFn^QMT{c((GF zz+Y2maLY05xvqrn!(Vf`$x*3*-UDlRT{&ecR6y?2;^e*f;|49I0&@3|Q>47-EESMD zy{*3)mI^p>Kc@-1*yH`%<Gt(g8Z~zPHMLa0InU!=;PKw{c=GFn5_7<b=bWZVBf(Mu zr<}8g9A6^Om6i%P-+8=k9&a`R;kXh0=2$A=JPS2Rd8;fHaNdHNsJwNS3OHXtO;+Al zmI^rk=B%KJ?_Em;oYtJrGrV?|3OGM{JUP85t^ubj=jn{UR7+6~_QyGvB;~La<?wjh zJYGHm;CK-J3N00IUiNsedAzO&g=0VXOSM$MDTbP&yfRA#oM~jl_&eKD0jCuiF}${x z3UK+l%bV@-mf?w`JEXDPQUT{{sHw{P)=~kd6i>$AG)o1X8$I4ak2jbz8~h`_EK3EP zM?Bs#kJo|oGyKC}&{6?sv&Y-w@s@Lrg@5>~wN${_234ZGUo91I_TYR<vGVq`RKQsP zWy0QQsetpV$K%5XbqzR~oZ;YwG(wi5nmJ!#c=47ZJ}5lk??y`noY$ewQr_E^3OJ)^ zug0IWT%iKaY>zj`<MrZv1c8Vz%~I$PXMqf_(oz9uFyBNRr2euj6>ye&yjqXfA;<>? z>Mv+1?19Id>+!Zg4Rj>k?<^H?#vJJKaxI1KLWR`dHcJJZg`Hg99hM3>31n`N`fFjS zfHMH9OnE0-3b{a)D{qXY0!|TBsq&^+D&Sm`?8bM!r2@_hkN3RC`_|+A=<%-X?1sJ8 zQURyd<E`{~3sUrcY^h62VVe$hc?p(6E>I_F{&Fo9aBhIAP~I(;3OI|QrYY|MO9h<E z4s*j^X{mtokjGo<@m}_LuX()Bx^O3?#<$T@0Vlt!%PX`Lb^~gN`g_e%0Vl1S%j;_? zY&+CY^|#nk0p~NQ=_U<Jp{Lzle{(DqaFP$_+A;N)VyS?W168TKah3`=B~WK8uiR1r z=OU;X%Dco;0q5dWH@+H61)Oyr?|qL~djua6Y1oyP3OK(&ouj-RmI^p6dh#2y%1g3T z!07}vQ+WqlD&Pcqx$*5~sep5W#~a}Bsy*I3kGIC-z3lP!J<^SDKTBatJYLA-#rM`b z*3q>DO9h<i9`78F_lU<^=J8e@qxZ5Cc8#S7+sEadW2u1ifX92p<IU--cexXGuB8Ib zdXM*+$4fib{EmHdr>~^~P8rmBD!=KL!X9}3wt4<K9Os4&T8jP`YNUo;XQ_abbUb&0 zDzBBL7?(g9f6rM8`|R<YbmJOu-iJCx!>+d!x|ZSc$}L5|0ClSR`_)p|&J$c-mZfN` zP@~k}1C~Ospe|9~4ojgg{kZ5@d3#xk@d4C)<+Za^z&Ql!GUau#RKV#Cb*b`>wN$`4 z32L75hFL1$oB=ggd3lzikB6#JUYVr=&Mc^E<y~m0fO93(9OYeWsep4Q)WyoX$5H|3 zF{q1__oSr)&I?epmG_FJ0?vC-Rm%IwQUT{ns0)<0)lvax2h=R(HO@3tz>(kexLkRy zEyeg0>O$ppwN$`42I>ms9cL-z0(GVGhFJ>x0(F)0##xHKqQ6^jQ!Ev5uJ?F1d%U+j z-a8)e3_3<r=XsV2ICprwMIP^cjQwa$cfF+oPRGG|e?0BzKuZOj?oijLzauP#ErGgL zc>^pJaI%NE@r|-nz`4-lReQWgJl-;o*8$^qn#LEj6n!Yv0_BadRKRI-vg@zCr2@_s z9`72D*J!xwuc@U1&fy-fr^n0nc=;aB$>wfIO*h_B0cQ}@b;=uJsep4D)b+|c(^Bwg z<R<KymSSAu@#cEG1RC!l8n%U{0?rVq8<cmlrLaSuzipns8>w76a_VTIrRd+FZc^Sx zO9h;tp>9;(Z<Y!;8>w&;cC)46A$U4+;@fPgfYbAI{e1v<M_URRK;5kVhFB`#d=F*9 z{$wfog)uHKWGVWsGr7lE!zNiO;0%OXsJxRbg<bRf{p$H!pQFFKL0&$yRKO|Bb$OF5 zMOY{T;qO;VVPo@Lo-@`^*vWBx)2aTlEXABI-{oCkDaH{VZ?VT4RiMB5K^kK$#W;3? z%d4~$cD#`9N;Hl2mI^o>iuAV?2phCi!07>XtNJ_AQUT}miEh{&O9h<gJl<-Lx5eXq z=kXGz=x>pbMhi<(Z&0^u8bd6Fo<iNByfZC@9!zz^Znjjw37y5g+Ujqxr2<Z{)a4~x z3RyulSAUBw6>#<|H^1N3+}Yn!^c7GY)Zej|!u~;ZRNgpC1)Q^?IxFuyOJV<@4pZLE zmI^qhG7#lnane5BQjBf!Q{c32eL>UWeYgL+egCUEY-yK#$?>NN|F0j>mKEMHl}Gg& zqgTs$r>wh|<d1c}*(z;mcRq2HB`qpK7+f0rN6#p{q~j@7y#F71;<>RniHd2#Vo8hm z1pZp^m&9Ky{@OaN;ydscgiZ!i`0EOt3ijeJ%}I#w%U?Qwnf!(L8w@{-zij?S;dczY zT>kQ*X^JsVthiz&-8ja-=+N&y(+jy#)8`=>`j5i+yw@XR^QU_R_>$jWl*=E=Y>07u zHqQqHx?+~(izOf0pMGY{yU*+Y3NlvS<HmA5q3@9wfBAe)e~OHi=Y*279QzX$8eZOI zMOR+*a&}PfdskQNvc2BkT=0&Y^=$9D*0mbzRYBG$6MT$(-lOUx<~=#)JwE3BGve}x zUm5d$Rm?kvGRi-%|NrxUNCJDr<kfBeE;|{*uMaN&&m!s-^|<kuSS|y{DE;ll``<|~ zDzQKD5^IlR^CuSF-@g9W<c~XE<Pm!n6v96LTk^NN^0PDjapTX2_&fUYNAdq%dHzxS z+5gA$pS+v%Z+~yktzI3g`rDu9@F$5_`P*Oc^g^dWwe{ZqIuRSc<h2!laXN}<t(3&S zuTnw&Z==*G{ukNBIbr@kNT~(<zn4-A`9D#qW&Gb#sapQuTd6htzmHO{@qas|w();^ zrHE3~j+5UC(;XA?0u@x(woo!ZigSWc2P%~U)k&!}P_nuZC%=KB>j!c2tM@vikCWf4 z*SUC{{Gx^atW})+Cbe^yhFAdgfKsyexkRaDQ1>e(zo+t`QgS2AQ^pnQX{AzV!k;RY z2K9+jA*hd)8U?jpsY0lal&XaKP^mdkA1Ji|>V2gaLA|F`VN?ChH%c@IYK!vLKy6iO zBh(K{ZG-yWglML};wB-WepTKAs9%&ypn|t6l>#MljdRkV5|vs6)l#W7Q2Q#CKo{Fa zsT8P=N)<xwuhbkU`Tfo~XARUrN^OMVx3u7;1dzQ_At>3ICRb41l#+W=dMLFK>IkJ0 zm?R&gR0yh%QiV|cm0AQfK&k4%$qA>1sy3&G=FLnFK2C0(WiRu5dvDF)<gA*^<gCP} zYO6DolOdC9wuNe54$Tv7mLJMvMRj$kYGr!Pa}vTlnM4@OBtY9xb#`)6Na8=`)X=QW zqL`9K>f=X1*)&2mbCX4Op_<vrqLCp2rb0_us||>gOg2Nj3ofHdozSG(L7|#Gp`5C| zagAoS2+h+M%~a3Y3u`OZg~)JfsL49<U2~O9WsQ0uk<6-@$(c_1iGMb>!Sk9(Vo!|X zKYo(h7QbpuBZ;f-71SasJ(Eu2Qpw3*PD7TA>Zege8iVI$Cg*EHHS;&)%N1WtshZUF z)eIS#Qjhu7302FJgGkRgw@KXrI3iSe?Yv`$iA99pCvIkUzZ~5%PnZ1AEKHSGt!b)d zeg}?brD~Z*Tpn08JNYww#cfKkR7@&^sgGGJGD#_M=~e1=PIhuIRFj>Ynpty+lqa*M z)~&00MJjUB3pJ@EiV(#jSoP!xJ*!0Noz-=dI{9rQTTL1T<)~~(5Y-v+;;phKypT-o zAWw5uJF7F2Tt%%(PpDcG7jZ~fJv%v!XL&Xy5os7=M=d%lgfF(<hEvwb`azS4bZ~NI zsHR%1X4TBN7EXDiO^r4^Q9o2gw(_bfE1hZW{aIQ6n=dPy8mz^;iTrU4ty_zYwHEhj z;^r<rrD}aV>e|j9?-~T*mOa7bNBqTISX&;I{+giA-=^p&C|-0Fn*C@$jq3SXwv4Pg z)1tklM|ra*!w7FsVW>LP*3EmUs<N$9(b{{pesZJySY`=KvTtHrot`4;y04+t>8Vlg z8fISQsL;H#+RF8y&bN1Xe#I^Eu|Y`%)uF;zW-`o)vCIxIC%eqV$I=TY)wa0qaZI@L z<4<l$3#v1wdS0GMhc?1Yd}a{wU8Q=N_{{LhU0&?7;@pFMK5_MYPVTb8eKYZ)+)@jP z7s-`-wq7ey);a#N*Mt|yE9`}W^RRScpHo7sGn0dGXs&ZLME{<(PlzlejfJ4LT{po{ zbw;W&woU5p#B#b>4ArEkO5F1`AQ=kPgu_C^lXPiNvjKTFrBOTbq76z2i9`cd(R#c{ zOu$f8ZHgNS-lRx0Itf*Ft{0A+N+MKOd_gsu?dHQ}??Kg|lqSZS^!OF)n@WKsO|=fz z!HME)JQ8hefEIOqcI?<8(TSb4QmYQ7L|T-zy!~7cY7fX-S29sjcM}mJj75MvCQNuC zBn4mWa**BwLc<f>luTmcxMPjy%eWvO6`A;=QxHGSG;(5G$vMK3w9ehz$0H8mZTgp+ z#l*+vDo1kY^4uCH=TqUAx_r^>AJ;XY*yVm7*FC;JDMTs$G}m29wFcK^V!sM_c}rdp zrM~<dL_n_r^21U6d%iGup7G!F4S#<o22Z6|WsFPt&W#J!KeM61&a9Q&NG0dY$bd%& zI5L1rm8jFDfdoV7dyvzBn~Dt2ZAj8~)YIzpwnU><nU0AGx-UVuZ_5^+W)NYc$Rhs1 z$tfFMuM#d*UUancF2k@?|1iuQj=enC8;^OzF&T|5B&0}Jv_SJrn@)k&Jh|DRETn2g zxmp}Gh*ZSt^muv2Z5g0CCIs)b?z<3@_f*r1qE+IftW`8me3dq-dzWs=M&@>iq^uoc zO?({r5DOrF8+PqWI%zA`CnY{MIJs~075GorWM~u`2u8>&t;vrRI&0IO;teO2K}hN? z<dg@MS(DzjH}RAv*|!ezHoeiNW}9BB>q2%7I}2yV$yzPMm_iIGPQ{_>n7A}OL0m(L zOEOy2yw-rn@+Nib5v1pv7)IITT0oB>@F<O%U&5rh8~c;EbPd9o597`Cc*>;&xrs~g z%}c(#NT@DrYD5f$5?dCgHciS~;wH3*>B42ib`|lM5t~qq%nWOe8f0WcA@JRZ4qtp< z?fDi;eG7r_8I+tK+PUadF>oZTIg;VrV3KXTCRDRR8gW<y5%-0)iL+fpE=;Uayz4<5 zHWiIr<|d0{;?m5xUstSet5OI}dVz7*Rn}o};MWx&CpBN;I$^V;oDw2Vjia2<64N(q zI#D!3k|7U`V)LNmDsfC)8Xt#-x#?ic-E>+6ytpWMI*L9A{}oN@s_5-}oU-F7NAe6L zxo<-$ZraD=GUBwd@>o)P#5D#b%ul?iml1OQ>l<yI=l{Pf=k`V#uH?&FA*g79AiTP# zf0G_q8o~ctdRXadUGE0kmFRSWtJA(_B|5zTIn70rH+5(*pmjAS<(c$AW8+)etn?7o z#O4}Cq@EI*wQ?csdVN%b{U-s^vE5q;U~O}Xq(i^7O<BI~v1e^`*SE9yys)-c-C2LR ztLqo^2xPYBO3|+Mn#tK_&4Cu0D$TepS}I03O<v5J2i*gVkjH4UKmx)V)xfeu+{}G2 zIWpDuk7=~`f8CwjPm`Iac+nnN{hBUKdtD^j7L$a55|`3W?)*NBx7hi8dff$dOvEND zF;(mLV0b#pzIB!Z09dg-?U)M>&Zg$}1=`6>Tsl`rW0^KLGR3FZOxWFiGM#Lti;e6M zNu@K<O1xga#x|I*FBk*5@!Gj_DAahCtVD|F=<JMmSEuL750IiC(jPMIY2=ZpCStD% zODzy2S6*2vGP)(JUV{>3)T9cWSu?0bChmBmClA$JzK{~SV>1Gqk|bU@f^4}-(~;=Z zMyk^aO*`BQ5t$5KJ(0<aJXD~P+R3hiVY+0Yw38KLPGq!?LWQ+<Yi2TFm{-#F@f1AB zR21E*Ne@=ZdH|)a&Y%#MB~y8qWweoT`F>T~+McV*A;A)#*qGq=B>7*Rp2YuJH1jHp z#=IhF<_akLLi<XV<m(tXcSJaI3}+D>1R;R-iF<h`Q4XO{YIXKa9iwAiNE~LoLPqVp z%XqF1b=ah{6v-KOXCY7>O7f}!mbwf|st$R2AqL8DJ5-0V-56J=w<55wm~G`%Mnf_| zlF^D(n)sG>T$A2`JU(Ir7)}t*GUezXPTIB^vQp<V%9clGW%8mESs^6GTEVJXFMw8A z;xp-ukd^p3Hxn7TiHYZ$gpK@9*tr_EIu3V}w27=H6d&y&BYx9GzBsh_p(M|bytB6D zi^cfp5aXjmXkNC=(@`UJK?y3!Lzv()-gG5PelnA1;xIebLDto54YF2J9YWjeYkGWx z{#y`JdP5U2e6J_=P|uf59_vrc><lQf3T;-oMRCPW1pN~pltYaN?Mf;SXB~zIrKqVj z)nYYuaY?!$VKFr^_9i6Jq@fYcrT{_Hs8_Y{cr^2ev@%&kPusDEp|G`9L@_9+7ID%W zNrQ0>4x#O3)U-<K-72p10M{zZD!DGlYXPg)BoK27%Yq9CkrKP=?oIbz_WHjhDN8U^ z9gn5s&zoh&C%d!Hs+CFgy5pC9v&5>+WK}F9aZt<zGUP~Hl#IMc)g&N{7E<*+-_Ql? zAGg9tXl&*lNqA_%cr_uhY9S$cOEMy8ksNBALC!MSBY@kMFloILDiXxUj@nHqn8z%W zRAAyaVUv20l#K^R!b##_QcRjjWl|jpq@GlEpiubPc}DAovpS;#iC{f}MC*?#NP4K+ zFA(WUq(PH0q?8mbB^iq*k$9_EDY-dri-%T{&%~<djg;EPN=a)WC?!Bj-S98sPoM`) zaLN;TO)&DQd((t(Ve(Q}tV>R!i5gNx*;d_>RFo2nn*Lyoh*HG^wzZ;kGuBo`nM4-b zswjWIG<Drb6*08%i9u_jw+NzM$%GjxOzTKtq>9Ox2vtaFbuFqB#65br*YNsA^lFSm zWfxY6FJ&-sjgl@si$+L~J~%nu*brDL@|sdJs8#P!QhAP~JgO?qDJOm0GHcRRUMV#) z>&MBn!_u$npkh>2WxP|)GHiq1J+rL+aD430RU7eOve@=_8X;R4G(xPRS&%^s(qyG+ z6fCR^fzv`&eUqK?f!gZLRta3qaFSh$!Bg2G62LV{xawMq4AjzVGUMW_8@UZ0Zz6K9 zVd#32W-_{Eq)VoZWfjUVaP#i2?rIJhwxGM>fT2~1C$S1kVR9`y*R6=^1agupLng47 zpm?KBj+4-7jA7d98mvTeax1%LMuD}Zit~OAI`@)T3Z3%i5=$XjNHyt~SXK$FUeyU& zMN#{k(WTa=iGkGgWRUCIhV)C#Z=c;=QR$C@8OzeBP}V6W3!WO1d2Ac|5~`1BhVQF{ zNOTc<uLY(S(g~xTndS{fR)WM9^dgs)!vtxbcI6NO2+JBS(JZsLCz6ri#1k7l7!!PT zx;H8$bX##Xp;xD;crUA1uZ(HDl%t{fmTx(=CgfZ4v{93<TqGXMBwwZ>i{6GLo3<ra zMHWLd=aBiB{b*SLeL#kDY)5B3K8hUrwxessK}KbYW{Rex0sadwl#-Elt`u)n#HbV! z;57+g`}jg;Br<f9G2kLWycZHaY<c3wxNsRDkM0=C3+6d8iY%;2uVe@){IWrkr8T4= z3NHgKiJ^B~h3>*xKKlojpAnBq=p{ik6IEtIMCeV|xZ{h73~HigeRXloG*ip*7SEp> zT(&xO$4@4g;;5MvBFcv>5&pgp_Ba~yA?+{xnnq``-#DYKSuM>~okiSPG}bJqqN|tS zT+K-0l28Y_|JS7EWBjtR+8tBr2GHU4yt%sCDI=uR(7eIP<wDU~%uYtl9x~?}T(iav zgSqb@^_EK;NVi1DwnZ;NCT>@eb*I9cwO$%4SIK|ft*j4F;VZ>259DWt5>n3I$^$9K zaxEzv<(AC1q-0Ih$;`YYm{qL7$Z$|n?@%k#RTa8jRUus!<rAMqmL@TYNA%k|+1Zh+ zUMvZTM2RGW{?1D0<apP%x=~06s8i_1naSl1RzgJwrW7KchAU_uT4v=c>(i{8N`dCh zPL|?ID@&IbEhR75*4fFK)`j{rvJ!78@*?7tm*8NkS;Q>!OATA&Rv`|OLbOt$D8HB$ z1xb}mEC8rg0jIp9rQ*s*TdGmw>^Zp9$w?zpNXA>@5|gp2+GdP{6L9!(Yag?WKCPqM z++G#65I0TU4Ck}zYU{@`$!KX}pB0h7Z#EdXs(xVde<L}f(nRb#7?;<qup{%LT8?^% zi+Jd>CKCC78j5_=q5iJSEyQ~bdDXUAegI<5>MTiAZA++#I*(I#J;7!z*IHq8c>ehz z`-122%s#wGwTjF1?#l$a7<pp*q*l*whn&R+d6#z?pB^hg&&_UdnXJ9kym&<UL=pT2 z(JqheL0Th+dA^n6$T2)yCvDIlV`>sF+(3eEGhr#Ith{Kf`$|5f+U?%GZAX$p_Wi9& zpb9ItvEjf3UHBO#ZrD}f3rH`{db7L7#!sp(W)!p6Bx5wvBXOm{lH&PTeF+**LMyg4 zs;Xu6r#9jnU$(8Mr~bI^^=%QCOxI;~dWh&8_f>p|DX1CLwK_D|<-!zUR?nHw|3n#6 zAzrkzMDb+ZWF1jp@SD`#=!?51y~J%TsOnXC@#4o)=&M<u^=hIbH-u(kX+-3aji`mZ znKd$@yjZaFg=z(K4N{y$8S+7ig{Z`m$C!bLaS{~{)mv={)vRXmTE+|YCWnk)V#b4P zK64r(X2H`x65QGNIg8<Kkdn9=RbxiyB<79%pg#1H)0))D7ig-(8`LFnsmzdc<fp!P zNzsLfRGkXQxr<cx<m6i~6O-(4*{GzcYE+;5qDu1;l&E|T3?^(&!~q(g(s?$fyIkQ$ zDNAJ<<wr8QW+=@O0NrrWfuu`q+Do|UR8^8O^5(6Q+3X4GLd3n8>Gq6CMV3k`L#CtA ztflYBN+35u(hACvsgA6U+z}H<Qb?)$!tVX#noR3NGPtRW-!iy1VJT&ZwbQ{(&r*e1 z4OM?k{im9dd`Jz7m$!<(l6QKu)<jNCu#g<%fngjTYSKe&F^YS7;|!hirdMYq;}Wbt zZg!^tk@cQc@yR*|4bDnS9X=qdLMN?3CZzGxIp`pAs%&vgsR}<ht1=<LfywfC0?F29 zG6^)W7(^oV=cAM(=A@|PSoAkdipNlVlrr2RCR0DjPDMvqJk&y&-SWi8WXYtLI#PK> zvt}muI-)0+XLOweyNPJ3L@Uv;9xun6%JvqQHdVDu%yH?Hkx<%T70P;CY!xQ!l1DF6 zR29!9f;3fwKRVOe@cd-f=CIVH3ZgBPZ~mb6(X45Usab%lD+wuVFQ+0XlAuBP9E~tU zlY2Rs%ru6sQe*Uh3khGkzpI_HyB<AgKMt>xjJGDzHhhs<@si@PJ4>;v$&uDgbdCs| z;%4U_x=XRsTC~B*U70FJ-cqVV@l+BmvcaS~;KsPUAvX#-%*HHIa!)D9QU)QI+qvfk zbnYbct*Y8RU0c(hkP-7GPK~9lk6MO=WE!T;Y?PcF*dBdy0DVeaIykUB_Sis#&zXT0 z+Y%m+*N9#qqN}vz)tLdxZL;wXrA7PwA4^M5N=S|V50p!fUPPs3dM-6lqojY6s>6bm zkRQ?fWIc;oek5dxE?LUq2bc+rC}d?firJXW$>zdD2Z+adO~R`TN~636>xD1zYntsE zpJ7~R`Z1F#6W7Gq>%E*wCemF^;KWFSTK8M@#=6z6-<q?n&U8tR$P&y*q1?n}rQmB? z<!o@797quvfBqxNCyi6<M!On>ERriT>59DmUQsKfic0@2WvE|NHiLpD$#jxDKn75S zp?TPVXxoX&kPj?eNi=b-!JaUqt-)We7ff(O5<0&41Eb=d1)|kP84ve71ue|wH(wEn zyQ_?jA3&QZXn#*0s(Ot!4b)Q9DI4w3;ee^0#u;j2O-<SSd2;lbSESgh;i1hV(s?A1 zu*%d-L3=T@*~y4EjL-T*o}KlFui@K#-jM?3>krq91Kouriiy|7(vUEWgKVms{zTqU z#Vvr{8B`yu!?kea@d7oe)i=8ZSUqbEuNY1VDPoqC<WI)Nw#z*L=WRQ6Myoz$G~~r^ z<6xhTWr;cKG@MreSh8X@+s4N_Nu--n^)93@N)*McWWato@kSI=oK!Ijqq?a=>89!# z47h^>7!0eJ>!m;$EkrZ^el!d+cSkg>b~%~_Qc<QzZFff`x>C1Ga`ELPxI1#9eHwKq z+Lz_3l#EyHdGA7N{R&;Ts>&p%oME|X5ml9~oQm%5c<;={4K!K*w59HAJ{O=av&_dE zxseiB1x(^gufM5)J_&V|q&kODMT}SX!L|-<ZpGYHhUU>CqFW!$YY@3~v)0&c8x=64 zv!=tU2HFNgxM*vuZG$14?|7$LTf^5Az}bvmvzh$%L4+o0RvaYf6d_wWeYf3OLH(DH z?KC$Z#d?tTZX^4Ok%82d#6w$-cl#f?(bdPVcZ?Lrxf-Z}mhPS-bsIa`6eG`iqd<J= zo{}GC0`i7MnM6|LK;GO)L-Q~nx`3)oFMEGC8?ux`QUYXZ89=54;&fqDs7B=@Ew6Fn z>`8Pmb+_}MtIUX~kb-M*>f%{jmw9lg=5;sY_4H&+0x{&-7{bI)48ahKsdJzyynM6h zlXE}{t==Mavg?KR>3OOzk=+s@ldIiOExsJ4Z93K`<&wW7<sa<MhzQk{pj9c_MYbGO zK<BgTnr$~nX4PcbW>QO7Z6>+`rFM=rXNiay)`R3kUaRM5?9{hs@bDlmudnAUO#SvZ z!HsxbXdeBx^s>=k8cA6B(n#lJgg0v_qDt#=302QhHM2A5bxm|TWdSbo=mwj-=-!nO zHZ!y<c`F;~S|@6oEdPb>ne-(FnYpc3yh8G^pgR7NO*L+$39iYzfNc3p9=(K{|LR#L z7N5K{bd(n(=U6X)dr(0)C2{`Uu}S*hiH3%Jhl<bBB6+QzvylI(t1aqg#&$X`(+NTs zEXj+Z#yYrOFFvYgEmDuRFI~2fH(z)9E`3405pYy@x)2|1!$~ZnXUK(~)!o_@t}2ia z#!2=xTarKFAU{eGag%wX?1(lHOr}^nagr%leJ3LwSv%MG8)`rYlXcZCK6+}f0f|5( zpXxQxfF6)S*ambh-3)?Q2umJqKno$X{6bJLiO?=lB~}%feo36nF1T%%k&SSPJ|a+^ z`s}LGA?M}9w#f|pWUyrzMgz^XNC#M&rr9ml<vue`D(|<;sw$`AYb9wtc)A{{CcUfW zi3zj`iWgZJQ~eP|&@YW5rcn8!1%FozD@iCy48qu%7{raamC2PT+G(yFcHhX0V+xX` zU6-(|g_=lw@{~BMLoMp2X_w@i<B9#;h@<@ZjOlCoX3Rinb$Fe)@=$Un$L{Dl82<<6 zVAEAQn;c90^(V*m_JbHl=-x+GuJm|rk0q?t>A8|2ZLsgUzEIg%UxoF3mDKlDQs398 z`o2cR_*$KwEgX}&w+l$_R;Oo19BSr=)l*E)!ornDi}034vO2v|IF_F2(V?38(k|-d zNIzK>U;a443x&gD^A%oXUhR9${Q2q@n;qfG6BX4Q!*he`Qi62wY^dm_(b1AdF!GIw z-bdiY%z|Xli}DlknxcU>(cx$vYJB3ueP1IlJo>&myv)2Yij5pdayM=)diyu7s&Ia* zn*Ep>*^{ZwmGlxcHa^5lWfibV-Oo1u1UVwE`+P}cw3VAIY$j*tb(BCt?^qLJ*vPS5 zy3MwU&%|dCqnt|BL#O8zhsNnCP~)BunitP^dYnKMc9I*+V<RbXBer189&FL|@VyU; z?;VP-VC7DdeJs6E0SQa8^5q4*B$HD&VQ!ibk0CPXrqVX?F^<L+RJY2oaX1ASauY?I zu+kekL1yJADTs5uHW|G?n=bKW=^;5vsl`DRjF?l@&5GHZfmb8f*dYU_PgvHmHmB}i zP^xq$I%<W3SV)L3^vBN2Od#vLuvs;|WzX8GZE@uRYAa2GZ`xOSV`emtdf6yEa+O9F z(?GL(TQO9!l_GTwk7<OgpK`!&9Gj#v;U?F^6GGMTFG`KU(GyLBl2*mXsmxMLRn)43 zt%_9CG2Io^PWPiFrQF|<RBo)K?j!rZFR5;n^>-x2E<t@sg+wYwQjBk+B_&xDZMFN{ z7rvq%q?L-eTv>S9n<oDKZjHImgW&1HFGQ%Cd%iCv6*<dU9Ul-E%&q5wOnokuJ{Mhn z&@fSRhjc2Uk;_q4h~j7_g<~s=Y|BQL)S|Dl{5#Ll`s_Cvs?XjLNHQ+%CGL0Rt=Un{ zOpW$sS~&Wf>(k#B(?xN+YIU^B&?42>U0EOMib!Saknf=Rq&4bbrnulE<<Ho|phzL= zNUVDlv?_8M+3rvKg)(dN7EuGeX($!Sw-oK@>H$+Q+<WSmdeY`7RWD^RdNV$}BeWqI zfh0&MED@^^^1&FZ5OG}2r4n23y8D*<T<?rwgrvCMf?1Qg)z}Tv({2~k4q1Gd?XEN2 z=%SOmf<O%=m+SW)NiMf)eIkO+Cf?i?8{;8I)yeJQCLNi}oZt@_Db`^-NhjOyJ(3QY zj@x-;AMgc0Lz%{SMMN5jY!sE9EhoFku9iz`LN24=b(-wx<#ME|YW+5xCx_;VrGvuu zc~yoDqyfm0;K?qRLy++etQKe;S7#)+Go5ba)D0rR&9I$9&$a3>NG!-K@0~BDsJeVn z8L-ge7(qRIGe$Qo$4H*Z{g}k6BaIr2saoHR4tyuVzt3H#jnS!m$y$A#$~VHF;<?J? zJyMl9ZfqY#d9d<!?GeSEt8q8DDk+KDEeP4OEHod=yIF~(^{u;%>(4oYEVR{$Wo@Vg zV?2R!yaO{)SlwzCGPB>b*FDUU9iy=_d+IF9E7JNx^GuH2&eH7fu);h+SC~zespGN) zDnt$ftj>(rk*J@c!&Hxfm5;A<jlax<T2wOi^#*Ug>_<wy-CZvBmm2v#AgTI7xGHX3 zq-mND2k|0arGau*4vJ+|fo6#pKWApr@@5AbHM3{&;;_=OV|@c>9-B6F{~0BaDY86u z4-w;^4Yz6dpZ1yZXMIxGN5}^y6`|UkQJYSkd|KCFEb_6lgz*ox)SkSKR>*R=IC67H z1=Vb$_bb#BruN@(YT{>AXSS+z>$<U9&6vaZnbh=5*M(YZNDDj}P9?v8J*T50Iem%a z^=@KO*{BqSt6zqsm@@q7oUTMN4dyiJRIUnhoz?S8u@|;lWRz7W>h>3-=t8IHi(*s8 zUkEQkj^{60PeSwLz#mGp2q&Vh1?17Ss9FeJixPrx5(ToBx5TR1^zr{6d1nG1Re8nz z8xkcdN`fFLh$9A#vY3sKxYUF-Xdn?Hf})d<3?vYen3+JRR7XJtaY2iU)mpS#v06oI z6)W1f<Gxp{T5+uy7u;IwQor9h?_FmGw5|P~?|HuaWb!}vyyxA|yDt}>DBIF4>A3K! zP#YDj*#0(^)_a-UI%&VLv3mwty!CJV^A}*R$nWaRP$v|5NpHUm{Igqr(Ni%+PoFeF zGP1sw1vQuGiJJCEkzzgd)W6#DjX6v~*m|lzsKEx{WV}<UAE^P5vL)eMk(M%$dZUTP zBP*%EKBWf}{R!kH>75x#y@Y$En%I;&N!{WjMU@LDjMxrCCiRGlB_&_?Q7NO6qL8@W zI;kMubIRFh*nRKyFiN(CK%-0oM#+Ri$^Hb`e3a}&QL=7-&IS6G*HQj7<9@J`Nfl!& zStFJSRf3W+j`x&oOh(FBOEPUo%TD))HK=7@QhWbTw5&XJDEo^RshU-1B<b0cTVEuh zQ|nok6HqTzf2f`<Nz}9Lglz|kR+ci!f1si*;l4Svr;E5*9d%GzS#}(sI-+yPtW@eF zRiWR8Q%9MKlerl~bjw<X$eMnMP>%9r-4wJ6Zsc-WQPWv+a)p@`y5S~=w$AwKyYGHz zyz$iQ484t~L{ng=MKduHDn&=gY3|>{*y^5FalYP7;Oha>X)Wp=w;lfQiu28?vh*n9 zxS*@k_obFLLxmpQJ8gaY3+<NrCXo+BwKO?29QLj%zjAgzoq7_P<P<BuD-5>r8h&8T zD&RkQ5~ddQHR-6Xw{<!1uD*EV8y}0u3~7qQbIDVA*BKz^el&P%glB53wUCU4ZwfSv zVs1vmI?{8*(F!5yyUiFHhtQeKc5Dh~>6W9&t6D>rIo<uWh)L#%JxyE5PiN4Uk5wm# z=01W3tjo6U1{rpUZb;}4FCWzVY?+|LumQtbCN$EQZuthM+Hk6^Y@s{Rck=h;<JNm< zQ!CE*k3H=K3b|uX=88<R$>G624v-k&t26I!!o-D`?ndu<;-qZ_!8Wtuvw>j?b1=4e zdbzqU8|-J{pw&Hq$k>BS`m9W6E=8IcRZ9w(A!i@l^$kv&#h&=%WCtzqT3F=XM;ZPK zL(EO?#r)!S?x}Bb?mSJ>GiG**p5hAHZG-LbC62?|15uAfz;-Gy1U0@UZGl^@!F7h9 z^Eoa;5>=an_SJew*$Ia%WpUQTj$bewyZ^7kQ7)@{B!cWY?nIe7(_*~@dc@kd-bo^D zCp<rM8u%Y6UGUu=nkQ#&w&T|pCosM5mAf7SLvzQPS43lWmxfzhh|m%fuO;6Tuj`y9 z_Q#7?vzc;m0_Z7ispD5dyqfJP2b}_PtofB!;;x%ZrL^c=PcM^+QtL#WM4~|HWQwiH zk2`JZj}tT9&nb#r-nV;#>t&!yo$2`K#ZPvM7)yRDzC0TmN9Sat`pTg0vE9xs>~avy z>#u17$#nCM%4EXUJFiS8?Y{FF?M4Nxfz9e}af9nm)E?c7H5_jSOm`HHgzd4OXU+~; z<Da-EwK8o2DQZ`tE6N9K-9&eUtoAkBkA7c;zrBY0j0fZR;4GjdG`ic{AH5bUgl&_6 zxwc7k)tuPb0MlvV>{TDxu>1^ci9)h5^IapT)+DlGNE^+{gRC5xTW}@uOT1mlW%Q=R zEjB~S_7<tdOQ_^Mg;Az6btUVMw8<hR8{oBNsTH5r<AP~wD`gvBnOO=Ud}81RKM-JQ zk32cg6!-Z+*eY>mn9TH6r|2MNESZS4>a>pRit}m32rp`}3heHkz>w>wB|R$%oCq+9 zSncn4sfPWMX0QT7GdD}m1#h(-qoJ(my|e%&NEwJMUAagcG`>K@E1lL^;?1IJ$fPv! zs$lJCfNV#?k52KV)?T)wK7zybF&KoD9=Eb0OOB>?sT<DqT?uLFB;WZI+yB7hVa%1| zA$<}&KchsN?GARW$V(^MlV<f^_8ak@g+l^J=ZMJIi)G7l;+Qx+i0;8yYSg6D$y_mW z`uaj++D39V{!Dk#b*`kLHV*hM$mvWk&lKGddDDb<u4EAB2>PzZL9&-C$<1X;w=Tzy z8%i{jB-eFn(}CY!DAkrdA`#jR<q_hma>zdJA+tj!90{3iRz~2|Py?fe1m?=Ecd!E` zrN$hUthQ@#GN87?5Oozysjk;`AD`0k?T;>hXjvrse174<wfO9>x>Ae}q%4{BvjI@P z@qyTt^ijn}v+_il_(u_?N+BN_5Ksw~T-wF?95WiEqdAkp?6p0%fVMqK<E)_Rd{&4r z%BB*h_$NzLr<5Qx+?kRtePZ%1@9^>^3u)917e=+$`;S$ePjDsNxppMtal99XE+WzW z#Tvc%&Ohb~AKTv5ADm%1L!`;@2C3epG#PKWRAfcP5>lcj6LXxXFzYmOX01jGkSxo= zlx4UirfeomV#@MI5>s}L`It@|shNn5TyK)D0hH*J;bFDh##|%YZqGAmnZBulL6Vm_ z8=a2gbA-K;pqo)fr3SfDoG+umYs;YSQQ9keFKxz_iH<A;vQfd#DZ8J)7H0zed|{+q zYBC1y26$?y?jeqAMkA<BQ)q<5PA(G6^b+;Q48@YfP%PO&D3-8p=ok}b$p%huXF4ny zGuxVM0xOx_<eJ*uFiD7%NtV<NbCN7YH_SES9E7QdyQ_R2=@@Lg9wqg&9M?=g%XUyT z!l}(GWIGW$Et>j&BSy<C)bq!TkvQnYNNDbQG%=E5cI=Osbkd4+vzBR8Sv1=;HV((9 zBu;p=;i(w3wdEVL7e7$Jttjs#pbg%R#{Mb#v<?0~(f0eaQtSI02D@LI)IKczpw^sw z&%%P+ILIyUL@N$Y>rko@dm2f5Jj$$)I3Y%ftr#X15VaE(wFoTjtd$!aq;jnOu1h|1 zRAerCaHdY!7{t6uEj2C&<a=}v6G8o2P>t!|geq26)V_!BQXy&W4`)&>J8Ohdlyt<A zJ3W>@So_1`+h!WWKzvO{Mxrd~CQ;6l&!SXF2&DQKl&Iy|tz)BkS=!0HcROvBn~mM% zG9y39XIjZAm}o1x#W6SaUy1W-t4JJioG&qZJ<RtHbgxGlT&Wa~u!q9Bo6H=!u*2-u z{kE6#eKhs*#R}5BM&jZ>ctOMGKXuWli7Z00g|bFsvl<8NxJn;*Ma2xlKqpIHbmN3H zNGr-KbmGdnq!5t`nv@L3r4nnQ7HNqX{Qv6E4IZyZ>%JH-YP_N$AE-;5r>*%RMPuoM zZ9YBu56gonM=nwG&9C|jhAR9YLlSjKH8+W68<k!N(ZlXxv}uyrM{z!L8tr!^^>f8) zTkkt|SuWS=N<otrM+=<%(<FuPwJs{2H0wrzvZvg{LD`0;yWo7z?~>$vh&$p$I>bGa zn>7|vEWOhivMEtNo<%SpDeFbJRbg_?$0elmz)msDR+jaWaEib7QCC|;x=T8A5fS2* zAfcY;>Ss38%=zMkoluXF^{U~_#N!LT(p2@n;6m6AV;AkG^<Eayk|_yB(lOL9gJ3-r zl;UcMgvQc4<S%>J?aECC(f^@+tqwW*D4#W{F>@-U%K#_LnP!J=E;p3-zC|Vz0&)L; zHvEIOK4|B^FOf|xr>%kSdH_=27_b{la>8h|R4>*4b+Y{TJ`U21sE`S9qevlcc-*A4 zD!dj$EjP4XXBY!p{j{*8pRvIf4y{nKd$7!@s13UgaB2<J-ZzPNQTL=B%Q$BnzJGS> z*3`>V3C*InKR9qHEfXzr2@qT7{C$90!kYujlIpHR3Buf2;ohN3H$F?^-e#&eH8km` zF?^N!uF+a3*LF1OmDz~a%9mGIE|TF6Ow_v3NXd583W}@MEmy==h;N8UxgE!QnY`<M zyfPicNW0j`u%#@T2URA4P?wi}8CudOfphw4;`TUop-1;dyyH`mlG%->Z<1sBCUzw7 zumlnA-0jhQfC$<Bl3MY@3>t;2Z_*zThe!vRqSJxPc5Wc@Z~FDkF^=O~JIu*>m&oFp zCMngzq%6Hk!C^3)W6yOPft8aoI6@=d+wZ&RW%>4N7Bwq1s2XK4H_bpThjo>X!^FY> zZn)kgVa~!)t!&Jpf~<;kW=vqy;Htwk1pnBq9L7GrX48#9iuN;4Y?k3YDVeFX-D#42 zmILBs12{->0}Kg@P=)wXZ90<ou?Ul)(|S15w=^SX;cm8@ec`Xn$YJXxj%RddLZd@4 zxFfmu+022l^F~Z*DKg~Khq!Ah1})qbc8w$aK||yCOgogti`-cr+KoCFS3_d>>=r1w ztYyHn??DZKqI!msZKj#lq7wq`ZdUI*IBBxHucnz3b0@MI@``%XqL$eSTxKUQimSa% zNtzJhvAPe#1HN@wnA!u!QAb=H&$45cwe=%5S#s}|rg3bq)Gj3K)lQLr+CL5@E+)qb zoYQGFdCNS4Jwh;XkQL1tA_mR^eBv@uDy29i<=dGMLoP!r6^D`LFp$)02Q)Q;R2Jhj z{mqA7d!KzLE|F3dOnP3An~>ZYr{j6;z_W*DIczp+$$<|EsJt3gsC8a7-R$W>CU@`q zGQ+(jiY<K7)0Vy04lhl35(gae;=tA+Ioy%cy|)<oqsLbhj1gf&IhW1kDohhh(Ky*4 zJ<HZO*;_nA^-P+=N{weFqLtR7ra&fEi=NF=Ju@k9X9Qkr!n+xw+UAT8&`O&$)1h&~ zZ>ycR2rX(iBT?;K{~QlMJ7=XgWSVbTrj|m;e~szsQrXHCjiw@RfRKv30fCCGMMgt4 zv<VvOdY14_VieZbVNap2{`!XMPFn*lR09Y|D314_>XRCpY5UAaxL(f~WdI`5OT#Rx z<}d2K&n|>d%=nC}9xtn|kfnz99$cx4s9n7<RRrx;FVsQX(pK<)Nlu0pdsJ_5ms}5# z>p6C=>qUT?>r&&`=c%xel~}tBkX+9p*PUp98ZA3IQqS7){+?Q9fYvUd#BAQ72LtR# zNfnr(*_@%V(rnIkvpH815s_R1(`)Mnlg%2+glu*_OQ?w4`3Y*`aX1oa6lIdaF2gI? z0xBbno)4poY27;s$Sfq~g5fzyGhFgh7#y$DN!8)nVHoarz?rU1VdPBOrZ8erx%XKQ z6J^gSKC#nNikH+bD<p$zDCOVT^`gwu4o~XE)6hwWL6m6W0;lSu7r48mAYZ?>Qtkf! zp>qC^ZS#d}>z6n#9%~=HtXrn|ND<~Ved~%whow{1d+8?RokT1MR6=Fu(|P{SjPaF$ z-gn41#_VxYxAsclS!ATt4>dSiefqo~8jBw)x4qbQ%N;A#_+7KLFWKRVE!|Y+<(9`D z8Yi~8g-MzlDPFwG@@^c!87-<(bcfMJ@P8X6WY5av;$IGN4E0{RGcNGP=rvX5mpEz4 zu@U;2&RDV}kisIAe18;N-;DYUa}OI#3E&LlnyHYb;gU_H(h%y$KBP?MbPx2g7s@t? zTrC$NZdqL@Mrg6vkSG$>+=Q6rs!Ji_n5&-+(VA?#$+7hVDga5}wYcaEsLV2%dD|-A zy!SG|ETCw~_)pWsSqovNXg^I2QpV#2(#P+w6nD;PnY@tgk2xvwB4M_kBZHC`NmKO> zUxxN(pBsT;OUQqo(VjchmZ_#Uecwy*4<eR+AT4`{#MeS!Yd80~5|&)4(CHt`{ljnX zWY46y_YYHvYR6lpNR3?F$rE=#odE`qu;0sU)J~izHa&0s3^@%1Bdj3;X|YoT*eJaL zX(72-XcC#fwVyLx;|otss_-zuZiiaJ)BE0WIYa5HLFb8|L+{&?(fi&m!ztSOC)F#F zmuVV1n%~kS=z!GBtg&fIYzLgx7h_NqFxa}l=c0Q-)Qv$GopPKTD96l9r6|X6wH(VK zEISPLjMBeryJ+jPq^Sw*(ypDI*!E5eo9cB6*U@YLM_8Gwu=P6l1y+x5u2S^}{Kt2? zNHwYJy&j^9KCP1ZX};z=SRgGXH{DkBh{;C13N%Xg<ZnHWoJv&Btz~ZZd20WmGlA$= z`vf&p)%r5So{(2fGj!S34}Gcb>e%Iuo3@T=z09n+Pj!ussX<x5VCxk=7hN5j7<BPJ z(J|8=+oAXmw9MG2Atx)6bHt2MG)F4aV$#{I>=8RrfE>9|a%2#RPYSf5F(vLzpZ*G{ z9sw<xc23-DHFe1-UMvKY$gk>dqDvRvSFrz+B$8rS(#@yIO`V~)*-6#-DB%w}{o|{; zMzNFDR=!qbcQ<(BLq%>A#mbL)leQVNGV`{^ym9BX<_#YT2)1?9_-4+MXmK;TGmE$< zDwVis!sZ+8dcKE~7VC*i12?0m{@%`Z7Y!+XA#q2-FCk{8u=m-{4n}2kW>^b<#&!N? z+$~30gk5pIJGZthCk}&LF*p9jvQVg+wAg+EJz^uf%VdX4r_7o%QQ_F?J|rc#Zz`@N z$#xeIN8z_jC}dcN@xMW-d-yLm^=DX*L7k=4(@=S8x{d#`#UjJn4HF|b0P1X&+n4`F z?hvSRlvm3Ce6=wHYO+$TP{!^OsO9`JtTXs;>|Ox1LV3UBzp*O=ktu4o54n1-n#y{y zu`w8GrSe8V85>eXRjG|vp{kYI%;JrF=QG244a(Sk8%p-5WmvK#W$Yfu27O7J4C~EI z%i2w;zd=b~Aj2BM>Dk+qIta?7+ApDwRo;52Vx=Zx@h3{PL6s|Y4b<UE)n-}N7^OBs zO;GAHsEJBV%C@X^8meocOj_LmC25mk-3?_z|1YQumA88zC-kjQlhl<<p;oEsb*^dY zo+zN2uIg)9Bb2(cpJk0yYO_my<5Gk7a!gC0WJ)B%x)Dm6p$uz1lu3j8p&FI9n(vYv zqyGLHDqnd!540?zhmE74jK8fe_3R+aI#f-!xzw@yS{8rUm=1`BW?1J#4Oi+qsL@Kj z4^^zx!Gj&@*HFgv8K@J~^z;2J>oN^hddLaYRZu369)l`Zx%~Ytt4^uIp-diCLaj-Y z5S$2QV)Q<giN}Z`4pjwZ+?x+ouC9CrHCw6r11#%ub)_B3xUv@N7s|WE<$Vivh4Omk zIC6ua<m)#X*8Wf?_j947jAU4&UAYsWu2Npum3tJ*=+HY*zf#lpUDJO+tySL6Lml6K zexPL?sbT&Ks$QwggPhdZ8|oe94Tfq^sut=PrM}B$E>hjgIM@m4ZctI>?E__Eems;( zs}?A{CLWzo<CQw`5XZCwYOM0^hl;5yk3g9;cnYdRd9Ohkmv<RvS)ZznJ)lhZB2dP+ zGog%oH$W{^yBna4-It(_QoEnKa(z*`amt$tWrrE6TzOX$kfW7)5+}we^%tl`>hkMQ zCZz8|bt>-*DE^4=ZUvSlvlSUu7L*C;W+>ywKcI{sms1_dS;h=&9h9+q2UJ{ncS9LJ zCQ=Yc2IQtg9i!A~3|UT8>g`g8+DLK25_0cRsY%_NVf_QjxV#ftf2Q(wg)%OG3uSC< zEOTP{C=`EU7g(w`b}n~Z=?k??d3!?{S8}2Lr8Y)DnfSIqnew~ZrT*wrTU=@+No(ZV zUFsf}>Q9y$(}5^ZWtxQQ5GWI)5~#__I}*x-WhE3zgWPzkU)j8pVbwqx8?&LRls6a3 z*!TmKvGM#w%bKcoCsLUjUK5n;oyoA)LK)MWp-6OipFx=#{e6^0Mwc1ZhDt|sUWA&a zysK#<uUCK9LB-*vTlYYj^7|N6wVFN+WkU6ZYubY*@>n(P31v+8gEDr9LrqoFeAjf6 zYdRfjnwp;InqKId{u-)AP1m`mr8KX`<;hSo9?7t#LK%PGa!t2EO;^(|T+;)q9lM24 z@@0?=s|3o}o#UEDp`_nH&ET4@Io7dz6O<e`$*^vPGIoz7;Z3M&piWTJnNY^`CD*hY zN{%yUSle9FOtQe(?FThWP4|H^cK_v?_92^3Qq%rW#`Ib!V|OFe$!dC^Yg%@kV_E|h zR@0eK#_lPu>1j~4YP!@lZJO@bT?kdDrl&#~yT64p`f@AOxvDP@Kpn5z^b!<-AeJ9P z@dvdpMmP?21k`MG?-(ef_cNhnpps#o3}yUS0M$o%?NFxFo(0vYuB?VS11jBG19hfS zS3;ew)LN)>l)4sbsZ#5pmML`;)N-ZPL#<HicBqv~ZGbvYsf|$QE7b*cfl?1bU8vM1 zs8vc`KZCS_%CItK5>gHGo=_%k`$NelnGEYdC=<6iP(^Cvi<2#Dj+$nK9UFb1<|?m0 zl(BIj)BxoTgEFbH0?O3c>!8Zjy^312Q>mFyR8;tTE|k%dtDxqoE4M(+SL!*aW~E+& zGQRb$b8Lj5WPT>Y8VY4hS3{ZJP3>%_mv*j8mDf9VkArGayK|tV|4ok@s!gf0p^ST1 zL7DK~26c*>-szgY07U|0_Z=t`qu~)J{T^+yti@_$Gn7g3ccFf&ylyDt$5&AMDepTd zlYUpvV*siyKM6HVsgIy?RPHk<BUjMuv_fw~ooY;>jBjZREK5cd8P?8F#<zY@2P<zM zDC5c{PzCD8<)=8U#yu|eJk-zB#+y+2Dz^>lH06B(Wn9i^C&iVw3zTuW6RKEk92s?D zR0m~Zv{HC#V-=LK@n|RG3gtZoWq5a=>g2*EsEgF}Nhss*TdwIgsEgI~3)l39C63)Y zpnk5VcS9Mw&$_06g_4ifWms>yrh8LlFHv4Dl!<vU)TPQh9Ll(I57bE-%g>-FHn_42 zg&fs~+7GH$sY9VAs@)<e6SuZG?IRXMV(m@!QLB2wRBKLaOKilP*7gN;F$*(m>|wL2 z+gs;F>SNJa<!x=vP4#uLrq-6|tXTWPrpTgMk<M78y``>s)|~c8B(}IMGAr6%KMR}k zt6xypHnQH@72lobzjAMGb8B4#4)Wl7cy9CJw#IOCQ%fWqYdtK~)UvRyxv3$f>`+5p ztPYR=Z~HeQ6lt-8piv$Xnj2|}wAVF<B%F*(LJL|KMnbVxf*WmWfMXty-`WxL8H@-u zwzfC@lw7f$5Ucf_BZo@%@r(#9jI_td72|=LE_O}Dym4WuzN3Ai?Gy5i!FMNoMhLeL z5Vu2k(Ja_t{0gC!q58$f3=fQ%@hLRIghl@U57L`F4@a98v^7VzlgFO#|1<yVTNkvo zcC<7cMgq5n7Sy#Y4mm8NZ&CB!5^0G=|Ht|+>EU?3-4vlh)5j6COU0t5SYv2tLnzW5 zSwK*SMnk!+bLK=NvCz=wj)M=|)e4289kWdd8rs0S<Bn+c_qiqUHW_96=6Bmp6e+jV z8SQo9rdVV_G~8C#9`)s`8imv-6sw!v9Py{6MCiZLFR%L0`lGpZZdmF&QnRBa<|SoI z$Aa0B_E77b5E5FnM9O6AkLAB+&i^Vt5>GEW{zxPx>i^5}@$@7tF$&LaiqW8in_A}h zYJ0<^Hl5R&6uBQceG|hIMT5i9mb$j6m)OD!DKAxMemwnk^e0%JOghb{MQ&=DOWA5_ z_XW*nhm`Gv?#If12}fJwVpE=i`qv(bwl;T2uYtn+KlHDq)vk*Db;keDKc~Mzw4-h< z;iM~lsZc|E6OFS8O(@jT8Vl8hgfF#;6UP54e66$RMNM~zdi#ItzU1$my7~yEugO<c z3X8JW5b3ld^kc;*!9Pi|P(y1Z+Hz2gc8K0kQ%j26{x9{*m!9H(w7E5=CF(G{J=2KN zd^(x;-_|ca|D5vtW2RqoYwP@uHmBN@4)I|juWhp{&h|)sYkNaf`!&sV?Q<i;eX*m@ zx1A@}*bxmi&26D`+A=p(*W4U3?!jyc#TuKUp(ulj`EL6y>6t1#38AQKkEkL?Tiaui z27<C3@A2Z_^Z!Rl-zcHA%bSUh*C^RzD6b(1j6xjW|4aS!`R};+U+K&L$L<Bnw_QZM z%xhXuH<v*g!`VP#AklxU^xm=mcByD+qLUt#;kFx$)b<)X2(E3(?z}fQbTUW_G1zPm zO{fV^l(F(ODm2$6qd`ALe9~C(-KBk}wzOhqGt>67_G;@_o3?8YYuBkex1|kCw+5#5 zwfeSkONhg>aqkLGUP7~lUs~@TR`2%R+Elg=_V?&v?NP96oARf^=a%0AQ~S21v7KPg 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 z%0D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%0Dp!npw|+6k{}DJ&(Iov4fP$JAECaZLx0_C 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%0Dc-vVJB})18x3T6 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%0DU8yCbahl)x%Yj+^p#QS`y6 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%0Dm zHf2GnhV)69pj+w*wKr~l47m!t>JN;k#DcM1$EDI@iJ}mp(5pUCX$u2sL0Qa-*+*!0 zC{NPRtN%rQFgI#CiO-GWQE3`H7oOFwFxFhBQ7vuGvC^7z(_<|S`fjl|z9kQ<w_7cg z6SNSqauF@lt3JN}pvxjRR^Q`~?dl@Ic|VFZ?{sZROeJIlVOT;>^SJb;nDZa6A`~Sz z)-*Of9;Y(a)ObjF^;p=Hrn!499$D<D)8|ukS?nEk2NJzHCLamyP4w!}dk{*ICM2~9 zrt#`itgJxtuz3cU1XXBmMwn-*lQtFpFl(;-uzQB|Lkllw&FX(q81zXxSw{M#Qhnm9 z80M2Y93;zv#XnXAb**g9O=T9Vo%xaREw-%LqP1)H2?U$a^*c`>NnZaAaOt0{&sCo& zeHrYjKm5%bJ_xLp=#??rKkc!RW6v18EGQ#3Sz6WduArQe+v94G6PuhnGASTCh#h2< zx7}A{U#jeTY4b-=vf7I>aN{~vARWq6Kz4IJ9gn^Tt*o>p&66fQ<7(+EJjW@Fc~FK} zwxy2M*QR@E4L5}i5^F|f7`YZWn4hld2l-76<NIFqyP|Q3J3$HJGK7sTi&(Q?sRwIh zMTcpuutWNvVFn*KIocY^w`l@RLjN_Ih!U+SmCW*vzBn%o6~#@VaSh3r_=VB7ZFp^{ zeY{B9N<(bbWacv4CiQG;k^RlIdYz?KqX+e`zhOI#F~=Bhv9og}21C1+gzp>5sd>CA zNyuQnAK_ZnSwvXh4)J%OB?!V;rh#|&f5YY+*9Sq|xZ($WfPssTAlER?Nf<?RJ?ayT ziL9zm;K_0w?eyELW6$1GeZn*Ba|T9o_tG|x%p4eTZqE@Li%9<Q?U8b4xMkgtEA;!l zhCe`ar^<$?xTavsgw~B5umGwy7(@<&vMlJ*fHjm}vx<1pNR}RzQu?gl?+t={rKdAT zdb3Bv9|=D%b2J+^u+VhqBzA0bQYF^NAlua8YWLi8M=Z^pEy}j7K-3nI-}z+cscT{e zD6_IY=RH;DsM#ygiBzxVG>3bv<r$}A8Qp~L$Q}6}67}Z~*#itu^SF^0rl!riIAk{G zsuH%1#hpM&1=pUsBZUkKXsi4oGq;Mox^uaiX4UV^CHndOr;-nGCu~13g3&yoB`-zU zO@Nh8@(DAwHd00tW~sdj6qY3Jg=14|ielKN^EJ}4;%b<u{4PJQXNzhsovO8hg{+SB z$oVo^`uB%;mSelpG0HK`lx6^9sg`Kq^N|9Akla)o*j7p&to%1GXT-n-mZgMhim`zv zd(7+fo>(BzaWp#O<Ff!3rIJ%im|z-_Hx`(o^N(SMZ2g``W*PC3#vZ%=7i=A{DBbGQ zxRNZ)Y{h#NJ!!B2EcNKB&q@YGLtQewnlt0x<8!R7f;><g7H2`k9l0lKsnW0KbRkcB z5M|Ol?&J$&>1p#ON5YzOPe$AVs;&;c8gUAp4i(b%1w%TtpA3%FAwA9^?bU$}UF~$} zYGp_At4)WL(bc9yg(@O0Rbm}39Gg*75j(mrT|J~r!D9)hPD9lXHA;`f5(^mHRmi&7 z)XFtwb1Wm!tSckMh3(v&Ya1+I%5}ArtH3GOF$(@>q+lg&ik%#n!{y1G6iA@Oq0_$n z*l{~!&9-7N{mYNhSh2JPhiL7z%?+9DxR~J2bj1K9Vz+@ZrfnOU!m|J^Id2?Amlabu zkD-JB>X2eux^&=zVUx{PGJP;1NLJ>Ol_?o*S?X1f7^oOFb&WlMFqO*nFKozcBYDk; zflK2Fx&v{arQLa4qQ_f$W-@AA%lV!K{dSE8TP#+8fPn?Drzer-(HIOm*A}(G!=Gc1 z!`kF+b##AQ{|naFweJqr*X&VD2PB3~@3vs7f7(x6P(;%clNocoHsFnwWTT`3qj_9r zQ)4Nt#Kg>r(e!hFQ70WSLok5`iy8s~=#OB+kdokMUZ!OVtWnIX#aS?T%sU!y;ZUeX zadGH%oAA=mza#flb?}gPjJ#dTQ%$Gf)7B<JO3rWr>d<%!Oykj0L<1~^id;_CY1_0K zXZ{E)mxVVUO`DK9CopnE!pLQZMo!-2)mvdv7&$sBNWLRC3(>v)d%4jIHeIFNqSaa$ zBPs2LW3y}Ms~~l3M{YJzZSJe@Ij+9<KTWij_%s&A)Ao}fvjr1^iAKdr2}%zrhp23! z1=@1bkQ78@#>rB_K_ldjsP7q(*bo_ELlh=7grCq5U5O3hhgD%)RfrsK+7Jn8FC6P9 zG=xuT*AVZl?>#(hLj>ED$c(ENJZeK|KVp;ndiF!1oIyj_Bo#J9*mg~0?P;V_k|FMx zqp4?sR*qpnRM`r&a#UjFV|`P9IHl&?FlxM~cI2fLXptBOB;-NTsKf=f$#x2BCOxh~ z)Tgj1#@03-S{xdDDQ<JFwHFpW2(Pa_)#G9LN@nJe#m?|l>^Ul}#YKD)VAJH3w7D)Y zGP$W~kL8xShwsya70Jox{is_X82tUO;Ws#`RdY&aEfemZ0<D9WE}qP_9xrGbA!5)} z>}509%cf2tf<3`V+vY&BY=M=Rcx}pq`0cnmf+x2ivXn(fgDTy6izga3ekzryQ8DU! z5~Pzv_6#r(P8rl{{;N!@e;z^QuY4wVM6hCeCil1iNOa|v_Sie8SRW8;h&OH|%#)aP z%yKGTbFhv)4s(gn@f9_>2sg#(RC0)WN0Qdetfh^OJU|v6iHk`*!J0UTEo^-r^`<g4 zyY?Gu;8eYuXd@RIdi#{7&y7Atq`d9a;d3XMCMXq;OnZ-`^a4t(f5IHEdbC3$s^2|u zS{ETS7pvAOO(_E(2zoj6jtZUuDadM?wk;RMU1;5xwr$+#v$m6Wr)5A@2&LqB=t&mZ zMJVMdk~jN3^rjGdsfNs}DS6-|$8mmQDnSra$YK_TF~uRK{G>Byq2;4@2&`(P&$B<E z+P8z!9`ovV`k_Q&9YQ}3Hq5#zrqv$?k*P<hpmBwjUe#2SYX@=J<p)5)8aT{PtYZ{3 zJ3lr#3`-azWB=SS(*JM&Dccl|YfUP_dz?6LaxPC`7iRXT7A<;y)R4JT*a^o7X3^1* zxf|YjJrZLtXuxXTqj+vy877V5!5a~#Q9hO*RaBg+ubKublOz*lZ%BDNL(xkEad<tG zU^JAsmY;)hIr?j~=??m>CC?i~yq_s&SXxwI=&W*vo5y8`6+94)V>4|-W-mM*36WAL ztd?PTmVzqCpH}}L#|32sp=OW{5un88$`Hjp&AC}>3{Uce5y(mYw1$7OWP$G6$S`&| zGSV$g5NadCg$5(zWJ1w*MGEv?$n;%navK@qP`3QURDvL;ki{$oSWIz<DL+D*v(VDH zk)dYg_3+131*=L}NApDL*#CZ;4b=kVm)I-~nW^NjECP375PsH9ZA0$p&Q@dm{tr?| zg}a@lAWHcAz2YlBW^GKrRU04B>ZP<{^HT6(=QlTy)jCD9V`6AvldxZbL81_4t!fid zP}wS*z&r&J=>a0DU>8yF=$)aRPP8-RKYC|WhA~}d$WPhkEVLa{)J*aG#>pi!#Z0o$ zq{K}1=aMkm%GL;Pqm>n(R%RSZ64xRc0#cETNaksq7n;8@cHB^TK@+Rng7Fme^$<6d zJH{wbShX1wp`q+XgxL+TjvLqzrW|6%<Aur*dmGh!Ys!R_*8B4x`4g|&|M@?Hw{C8= z!Kjp4)yG#GL(7P2YbQcAjr69olO8efVlWGCWi5VqWZL}k@hDq!k2B6iAqUfy5gN$K zaE;cGnH>p_ui+x$IbnD>(~1$FY4y}CoQKVxxX{3!_!b(Jku)gi_RPdklE+5^p;?5Y zj*5i3sGRc{K=XTUD1&Q(3+<qW<9;KM!YOXBc2MUA;x7!Ud6b@1xHAiaakHRiL1FvL zSzjybWA~2EYQ=>}>>YL2ada132G@HUU4fAO`fzE$r^|vi*g9^+#oN>7e<&J4XVTqU zE#@#?84OZsPh>eB>B^Yp*N~}rNv2229<awTX-tsm`r7ETei*`&bYw-zFIT#;XYJNQ zkV<(*k0+%I88`a!v$p5acT&{6=AC)X+es#mdjm)l#MCK)AVG;o8(s=`ogx_T6iKK~ z*`${(e-}0yBUXyDb=+~k|H;MM*_kXOxc@3{2zk_JoO7S9Bd0fgzQOYq<)0nwenw^n zo_M>C&J0HoPudlh6Kq!OAxhv&*X|)>;N!7oQrmD2a!C(X0xo8TJ2qgdks9OaeO0aU zLqA4m>eZ;_?tCZP17D70Nug3`&6B&RhuZ@2Ea#b#Dc->OD$rt#IBJX$1MfK^RZ8$4 zCh3V${Hd=V`l3{B-!rYp9<|W#bt;^vq&#j?-9*9DY+gFtkeTXLvl-^4hy<kHIifYx zXoUms)C2ZHaxm>Lj5SedX0b+b(&le;e70C>MYD<-w49AYYpir_t}@c<gB>G~!mZ8y z;Qb?y@X+6YkAT*ffiG9S9EGuX)sub@H(t**k4tr1s4QEmvq$3%mRqOisK6|;r8g`= zurJOU*w%jyE0lhH9Z4a7hRC@RIaf~|6GhHfeyW&>Tp(Y*M5Z<E##?I>nN=o!6FF5P z$DGIo_5d~%nN)$uF()#whAJbYAkyD+f6-yJ377UkI);Q}#0P@jX~y^aS<;c6N;sq= zJ@N)R;<_LkG1vj93#fIDSN&m0pB;IQoD*gl?3#G%&YG;9jC4r`VdapE!l*ocixy>y zjRe_)<5;R9kZZ0QASbQ<23ueA^h>Go19jraMKH-)D`zQYep<c0GpCgKwB|?2lQA@6 zV0Xv~r`>I?;FOvV1woiaaxOGa@UXLZfNh`h!AM4e^j4}EzTO^`DuU^zb!`FrwzGne zGFqn0yWyjXP(X(k^LFg4?dsYBI{YjxC5hNy>K-hhKf$x-cs|4|bkSU1*2)FsqwEx9 zx$(Nlaym^p(T0_3%|I;T<;JaZOl(%tM6Ol0)uyK1x=1{Frd4UU2HvZ_k?+XoAOU|i zD-0JyrRUhAe=5R0V8p;vM-QWg6Vf#2r34~R$M(ewM6SyIH7c4GbI)B`mO6i>3afQW z_2OZz*XtBSzUG=Nq0ZT3YHoVS8(2Il)kt*oqi}YbO0-03iGl1$*p2UrhXqH$DhJ*j z^q)QaF6`ezCjD1yGcz4&8I3yGz|iQDK+6e?^4*{sdQhbZI`B~QITh1}4+%AID<Ey# zJEa~Ajj!#ln9W~Hm9qS>dG`T)@wo0KM3Brwh|)kCf}EPanjSx|6L6f0#D|*M;(XHa z&@eqX5#xMjhBR<abk-?fdxus%Fqr$a3`)e<@IE18Z#2Jz4eN}QA7>0_Y=#n;9nX#= zV3W>Ek(fPxV2FkDO3l|$@m!e+b&MH<SYQlzdlMJ~x<$sF&W=@mMA-UCr(~L9SmGi7 z$fnq-15Xd+E632>yuBQm&J%KE?op1`zS-d_fm+E%AWwE$y-tM757X?Q3Cm3n1TZy$ zcpx(a!P~c4$M@^M5-cb%X}M<7(u2rhtp}cuCoU8U5?>d@il?i|2+tbr;GB^=3uMY= zXEmM~N?G-Zu52~)^qv%T1#{EL6wIm0PA=J|Je$``6J;98ZPti^FI!k#5{z<kKD%A& z1KBFEG*-VoTZifFg&jEugP{L(_b{PQO<G#>KCNV_@dUMAcnWA>sQpT-d}T{+J(gRc z;**=j-|5DcR7uuhmc=c^7$?L<urTL-pJi!W8!uAU$J80j%8=G&Xw3b1Am`6YdGf%I zqf>tTe330b^4-}&ro|jR-@ngk4eesO=A-CYbg5@Yi#SJyo@Fr;WQ|B``GLB6vc^p~ z@pIlZmN@GNM;0Y_HU~nKkzpD(OYM^#<NQT6PlHUmgL7eiynVBI&6TP&re{BOxunN) z;h;bq$K0#<AkU1UJQ-{(R}%8f7|OH%V@@;j!`E%91Mk{`3}}Y@?8FT6!*_2(Lgnws zwKkG~V0$xZICgyS<|@e3AIcMzi3+7W{UM=TJ|?Ea?&YV3sB6;t#DD8>r<W4n*Sb^9 zwt9^Bq;f>n>l!Ig288-);^PgC3Dq<<XUpVi<u&pINAx(db+L4xL_<O+cp2YXie=H3 zg9A*K34yLWbxc#E3Z=L#G%`1FUI;4?ecv2EMT?j=%B<b=!pA)$5B#y_ck<9YRRx6+ zPHl>1a^gaw#D>Hk8|;A+nTQfSOB*S_>(I6CO<e4(-r%iwB^?oY>#dKwC;orQ0g`mt zTr<6AQmokyRB}-N_!~waVL105HQpJT(1Ls!U7@*+HJ`lwhzzzJHG{WW&{5*4=v1px zs}>5e78Zjxa=ONU46l3XCgFGqnJ0w}1F-iCP3kZp*3yufl_?D)OWGt_D_H4{W$tA5 zkI~bJ4Vf7VCI|gWwQ|V8Wz8AG(WT5Rime(NGIN9ARLTp3#p1P-4zTP0x0J%Mba<a* zzJcGZSrs(!&v7Otmco%=ZW;&QgTh0OOQyiNPncMB6r48iY3`2E3#>W~p(}}m1bVI| z`E?pTKm%WNQ4d9<vLqjhnifXYqiSWuK4mEM9bsrXc`KBI@&RD7k>8v3X;-S9m|qyw zCj5_pVXHLIA={QV|38_wRAY7c_?Cs4`VDbC6H;&3X{3eLrluk4CAA_YD_ROGkeW#H z__?~v&wJL!<x-bRFq@KCokwEpL+1J8`#){T!+1Q)M+z${j8${?Th;&m2WYpWM*dJ9 z^--Cup4B@?jIn0}n?bN*Nz3DMAoR#UXgOZZ`_)##@X4)B+g7Kef%ALj9N&K?rH}2> zud8z|o_6$!9yFS3+~(XIGApnGg5hElUy5m9Dq`)(<-L2<>n6c4vYQ73Zz!alpAKWV z$t3g!^GVB6lVxa}M{5u}-fRGe8RKRksm2_CyaIJaHAkxfxCW$&^4Qx+0Xj<#%Y~0> zv&o|Zd08=-MR7(W#-ia8X;7`YU?`3~a%#yNS*x%*wL?SZ8XR5ph~@Mq!s(wr^C&{` zP&ze!XwXzqWymU;CpT>MgppOQr+GRE4xeK2x?U0D+q2#Hf(H~rx|Bj#nYAj^-T?;L z>iLx`f>;XGI}3%S)oV6aT8rt-*>c4|7`eRM)5oY4#n@EGqFxyD)8@~QCMHY8m{k>K z$1@0?lCqssLEFZS2;P$8A?r?MJzKpcWbg0<2vPf{SACKYA#A?APpk#g;)>HWA!W1+ zwO&@V{xoL(^L_+dO59yc=D+{7%2qno<fHSNdt%KmO8FH%uKbp5z+(dM-^Qzvx2R3O zlu;kjl%r}>mkLKFxjL&n>$EP0QG6Z~o97Cn>6^X4fzuUNwr+ZE&bfEY-9Pva?Cn$A z51;5F5UP0idXzG7?&v;Vm9@8x%CKqfb1K4>N((4%Q{(Ok^O?FI<2$-Nx|AM}x~9~; zJJzC{O`&?pgLPFRLmPet9AUEVKdPnsU|gnF6DF8&ttV_H`$HQ3X|mH)Wy4q=>tKO+ zV*dRkh*vfCsKtDgnp=YKe@98&jK&-x<@SNQj+()dG57ZW4!wA*k)vb$x#+(_OC1lW zDntLqcnELuDs*W5Xa8D!SY2QT9?u0umVW6{z=VG-?j^!AtfzJRR0`|iJQz9@IYDl$ zMW-8C$a0XH;cgsT9maGZ``6tv;hZTA!_cyJ#i2Rnx~0s$j-|piBR`E_d(&Ds9V_Yq z$h1Zt)Jbtt*h_aRFOwRPe3;}gJ~Pj)lF1=H6?YIuLOI$K)-tyBFPhmb^WRHh6WI0U zRlh^E#LNx63sxTWnxML;^nZ!iT6U9R@KQIB$CaJ7d3@%l8g=63h`#Biv`F8m;giq8 zYL5_qeq`OVSG_>@_}%*adZc>}S@&>qz}(;<n(ZR68HdFS_pBTSusrOAhIS@M8YH3- zsS%BpL)Ov%f(Ro7$6$6UFihl5iWtuwgVAWy|HIMf%=6uxtqcym^#aD)apPcOs<eh; z6t)qd-*KWnE6Ev|^v^f5dCm%CiZE;4j?mg_1uSU`45W}Fdqo!b<lxh(3yT`;9qC&& z0WVziLjrNx-RvVV;=K4%IL40n@fq+CzF>|szCBTL=Udbkii@F8SQQ)00O_H)jY7EY zO`jsb=IK{Z05AFm*7h$}a%F>*%+S83Pw7LP7ZJ<&aj|5+0<nzm#0t|YRAR{=h$R%3 zFYLr}Y?C%%BUX^_PRUUpoB}kAoa$obD}P%31cr52s#tEr6hs@DqH3gCl|nZ-(~}O5 ze$T+s1=O2wsQ}Oythaeluf-iV%W;FVRAcZ3C>ung^M_*QxR`oopDWCT$SMJGVmSCz z2tFMoz^8KX<p(|$g>M2*+G7owDof|L3Y=dh%6~O3X;m`5!oa7(@fG8!?^Mw=UU<*% znQe>Z&~F<3FoD6#gpf^2F-f==p=n?F((F3{%1uof%`Nm>ZXNO5LN>XHIh31xY4iC- z50g#N)Ilmd%sqI<8g|w(O6(+IAb+GpF^5W&uiF0cz)EwPEv(l@u59Wl4)5=d@2@gr z>I87YJ=2hR3E{HPrZH&^J6NcMBJ-Awc%?)jKXo$M$v0ak90dp!8=pGeh29tm6?-VR zQ;A;|#FttSU%uHNCcOZmVu$g0QY&2;1B(b*I4;4BkpyBVCCE->*};jLE5b<4xe+O( zV4)O}+DRccJ}F#SWF%DVFgK|TXEbFKgMR|C9w$*Mk<#XWU(dK{+gyBJwY})$2@*S9 z%VJz^?7~=1TEjQYm#2qI!6`EyK;=@t8V`<IScj~5?bK{9X2*^o(Au5tAAx%LG88y6 z99U_OEwn=`CvFeUj+{*@tJy-UnNlHoFOtm;9uV_rqJC%au)Prnfs}>1gfqk^#2IRG z7^wkc8+#s!#irl{y+8^i9A$wT0;;ML7hf#!NosuK1D{I3mmm0)J-!JzVNL!V6VZQg zWYA3#fU%cLSJ@86dd8iP=?jW<sx9G6wFM9%QMDzkskQ*2ssj~siY(!0pN3z6P_ZR` z0q&7ntjgV}*aE~>ofZ3P7dso5Q1uqNRET482@qRsLY;aR<1@Jg2o2RUsQ0lHD$vC# zO~dI_JbYNSy1)sFrmE<uTG=*1a)g={<kpxnkf8w-hV;G>jtQxq<0oj|5Kk=?D4*k* z{ssAlDj1h}RKI>Rj~q?4c;@8fW6JouBe`bkyNELIfg=NHSOpQFo~5o5M0Is}C2=jU zC&Ijv0?A83<Rym=R?fly>%f!p!8;YlI$eMiViPLmBh<&SP8T3l?6B#QtcZe;SLs75 z5^o?G63cj@<q#T@c=*WvrAi%0L$Qkc_C`ox2Pi+4r2oILYk@V7HCJcG-2d*m_8ID= zNT(2{-Y3j-Fc|9iq>6uuc~iS)=>tKsxLHjpEXXp*QkNc&#tcw+x|*GyQ}fq+K>tE{ z35d<t@%{hK*l_cIN__sG{{uZ)BcT!uyCCWz@QCG!m?U(|EBUI;09eoK1+x<)ZGMrJ zK?UaK9N=;0tVu`Nk9%+NCC5?YS?dJ*lk<A|uXHm(SS6ZY6ZZHP+DW@hdnuQ7KuyLb zE%@*a?Q=58!vEl;NtoDTEu3o%KX#=icK^4jv%ku*F&0dlkr9}4!~hst57^lbjt%JG zO<>K!h7T5AQX?8v4&kx`L*ZJ)WCh`J@JY?WaJO{QG$JLF8%{!zDDFt<(U<rGei$=Y zG3Ag4!pNa8O+ilOK=E>IjT>s)jaGFnAtX9Ro9Wl-Rd}3rxOGR^fN777J2k%cNMfc2 z|Hs2YwXvgy(|)IVw&xS>KlyhYvzzxDJyk&c5Z4~qRuZIck?U34ktxO&J1*2?p>c=y zsym4jJgpVdrCJHA6Kmz-w;WNX$k`A&+4Rjt;<-mGt-izJ8$Xw0Tn(9Z5k{^UjV?z8 z1U=E}I0^|k&PdCl@fDud@{p4($S~L&E_W&AQZYrmFm~!}j=D&gZMm%4c*3i|aXM(P z@UvcQ{^5&%I4-)d3uOwn(n)!m46##h{KS!YF3mJK$DMjsVvhayA4SwQ%2q?l9TGJu zTMG>2MB=1ul{#p=K+vQdouEmTw;ZkV3O}Oq{pau=iN<17vlvf$>a>F+N_$BadC-&> z|2|m!NmKkJ>~ht5=)qB)yuo>gk$=^bu+_dAg4_q)cmLGMt@wkl@MYR@$4vaz-gV~M zBQ72=ZSOrU;n{UwW(Maq`0_$3b4&(xO-?f{H>dLbd=WJIz&kJVRAT#GCn|PcaJV%q zIHSa?``|n-LotsN%M6OFw0iwewES7jKN!@}nHP`sd5gCzo;rKzgp-XbJ9S{GIpNeC zPt7X}*>fe!M!V&?B$6+O2srYcavV#zwE6j@B3=#>T#|On=OTIN8%Vi9GS-@S^1=*H zAad?(z6KQJACIWQQVGkuF&<{=h?mPWlBZ=B`6yim(PC)}e?&{FbV4t2q2p<2zKC@N z?D5-sN7=Um&-R#-NLj#_-3rn_&Js{3CGzzcXW*m6FYs<WnfL{1k8)EApUC;v!TFS+ zFLRQcc(|u3f~K{6Eel~zkU&}d>lrdln9bBJpZ&+SwJ%*{$1Z|@DCDqhBwltTUND=o z)bsnl$!O_6*<QUKyWgw6XeDBkG1s)H&WL7v)#r%o^5i{LH7{0>D?H=kl1Q-Taioi7 z4Xor0M)XW_corn#d9Ob7sV)zm#%n5%Jnk)20FQP{<qnNdW5-V<(eOEHQ<)hH3C=j7 zDWN}jPCS_x<(AL0<8|zzB`=kilXQA=ydZhLD#U+WGA~6BG0>enz%8^<K}|Jl<>^G3 zeVM|y77FJpom-1P!OWuMV6qYl#T8Ztm6mWvZn^@P{v@YYWA7SOBOO9+u(iVg^K?)v zj#xV$jBFy|s~bw4QezrlkhVEDgKsbv#xu2l46{u0(}%vALSh-FffJd(1#~g*)Zujd z+zvo0VIhv=OXOH{quz^!p$%XPl9PU;vNAN31al`&G`eyrRTI<(mV^VzfgP$<NTuvh zZCd@cTBiPg?7a(|omF-J{Y>Trh7dRd1PJ#7j4(ok5h4bOc%ox_u&Etrl&Dch4KzyB z0cPrGa~YfoCQgD8QyaVy72C8$MN2iYs1rm9me$~{LD7FutT~-%5on2u@_v77?Y+-) z&YUEJm-hdD-uHZxd47AXz1Lp*e%~8;sx0*rkG1&nG^S0Y?lOycQ3_C`<VxFlIjDMz z(>BbyeZ<^wkwd2)WeD!?+jW(n*>1gP+w!T^w=pq?H);^{vjsC5Y{5)GLbSV`#$CqZ z@O$`60vIoxjOePga_bF|wJA7|UN+$&g6-~wxfx7c>EkQ5LN-_xK%`;{Z)942wo-i) zi13iEY=BmM$pIP54r0hZ#SXKJ70oUp+9IpC>c7Ob__8`&Zdo<1ut{KxxwDH27f`X% zFqXQtlGDqwE~~n#WOievt}A{n^Jr;#gY=XPvm^~optPg-Q`y%O%5{X|XD(@3T_G$v zOY||PT<M2oEXqPg%WYwn2W#dPYOY)XuAd6CVB{M2e&#rv+eqZt#8N5ItJ5A`k0**Q z3I)40q7%y1t67?q`vYgqB1KPGbGu@SUy5o!<n<L;JDlU$Ne0VK0<s*klZ@BC4egBH zn3Z-0%PA{~5VO)QFzKz2XC)!aN&<)sSxF{MF#5<)IYvs8W3C7}#=_8Fi#VC{5$EQH zh;w3$xNn3uMs=eVg58pVcKT+F)I*44m)_W^mYhRmdMzoWpR^U0whsrhxxu^_bKR;C zU69<0l5A6eWb4{LmK-6}A|EJYP-PEh{pVSFDVG>GoERe8_^}p1&YdcwfqxxeC*o6A zqB#5r)fo993t<Bma>1-uPnlPfb#^vPHyg;6WgG#kndI0g0v-;l-e!j|G1Sl@1CMkC ziH<`EC%0|&ABO*BT=LH=ei`&5wG8%8V^X49Hpbfmva6p&TJ7V<=xZtSt>E&dWWElx zYl@={tJ<vB%QqL5B_&k5(X5R6xIo?5nxlTUOgghuw#CdzFq%m~TYcG46PG;|k>Nar zII)<Nz*yGDi;0jG69MxqR@A0R+*{M(?(}hYLgr3@l#z2XnoP^B&30Y=auaFbnY59b z3o4~0W-~uvuKtr~rvGQk(}%ZP10v(<dDC;5o&*&U`=uCN6g!KzD3J_rt>~)FR;fAp zD{MU@GBVs|E6&2F0*F9}u*@clEEdgcdj6hm@H#1KIgKu0@Wn2YY){6!%bf_$st<8q zgjAd}VURYeF<K9vHEz@hoy2{N*SeS_TBv%vtn#OpNw@lxvVpU71JFWkn&`m_eY$96 zq66%ZMeBA4H}0<{Jv7vicp=24ebpq31`5sgRaZ<W_EkTlVT1C4jOGKAhhZl*(<zPW z<?idUYy0L%3*P`PRI02SY|}*O!mTBu<<VQh_797ylBqRsi;`NJ<cRn)CpSpWb<k`3 zWi(7K%aes6KEef`JtlU`6DJ|nR>ZX(9`U8o?kRJ*F0whNyk_3?$RS_VyJ>IE!41WV zP*S&$B$fg_qeHsa45Kcu?;>a!8KHAZ|H1mS4(NW|F4oYnpgU6|qYxPyf*PZx|44IT zH|pY|5E)aV)izNOH_MqeN25bhv;1l`O9_l!YgR8sBTKxAo8TMnCucUoo`0~679&>a zh+jltN0~2?9!|1&#)4#LG;}|uPeG~!ZqZ<^#K1Y)kHX|=EE>u7Pl=t7BgoIuh7?ck zIbS?5TaR9lMWThghnmEyWucrDVt*DqKS?r+=1396wcJyd>#X9eOkLERKRW4roER+w zFREimfjI=2=#BnQ-ZVbk5Lb9f<CiPrwfy}5@BbpT{;%8rRZE}CxAeRwjw#~#jLOXV zX#p(MZ_+D6iAxu+n&kP6I(v3Lqu1mz<G}1d*u=NL^BHvlnrv{KtU_uvmzdX$=QC=R z>)H+}cXvFW5g67o=NXlCBk6p`l3v9UvjrhkbfWqK$-a$K8zUWqVk2QhU#xHBODAzN zAN?fEtb`pdn|h6Hd;0@hq=xeuft1c?$Q%w@2>SU9BjV$BG4V!UKc6AbBPBQ!lQS0L z3}x7h=QBju1;Nf|?7+~10b!#1`3xaDpCO>(M6ycHyk=GBGt8>aXGl<Mo~!d2#??M+ zaqWDD039lQ{CtM2g!38Of$7BtcibdMjps9zZrTlcJFay;L#YuqgetnMmRBmtfX}j) zKc8XAPVHRE_|?v5xRmYQM$kd;FvpgLb>}nO9#dv$VV3d2Y*BTrBR+D*6&Rc5_53jm zMaP8Q!V`~SB<~1V!FAIo9K-NZQhy9Xi8F7@oViVpVJH$9@gXc8!&rhIcbD6gIg|!& zoL+Bi$HN>q9m9}i^@U9hO;kkpR8M&aCz^3xvtt-B1d}?3@iZSVYUj9q`#Xm53-Wqy z<Gj@mXlj`t9>dt#TW6>47{)Gm8jliR`Z4u#pko-T@o_)LFeH${V4HI2Zo}+w;u~j2 z*%&Hn8u~ws$;UNDANJD~(WST=%*$LmUEy3GJnoeZGNrzZ1>@-oBNGv3weEC<Qy9MB zz)x40@Gw;;YC2spgIGbdK0X2zvJqh5DBApVg%I6g#z|{Cb|Qm_l$~(8LR=rQ1NM2k zLhkBMSIC{0ce0#`U293D(-pga<I@#QGs#T6QpVP|$>|D_!|94Hpr5W#F1u>t=?Ymu zl0IaDlAH9&pRSO=+UW`t&t5ta)9DHk8%|f$HNDMGSIogx-RTMubh^U6jproN>54kZ zHV~Hgqx(Kx(E+=KjA5ly21{Up7>$$yO%Fh+ovx_!MyD&xLC84f;{i@r)Cp+P`KUWx zaUjc;b#b^nVJ&rSM_ECsovu*tY~rB3)_=49^&pk9ujpt&Ew`exUW~f)6-$i5tgL;l z-{DuGP`Oh7jdJ4(9T$+QH~WUZS=fj_D3&@c`eJn>-=?imlSukq+w%&{G#VbWs?RXV ztM7Gl-hZ^}rb7-@95^l4*GyHRUJi_WCK?LEyL9_gDGrX|v21J+9M0F3aKK%w`A*>k ze(spjcFC`uI@(ch+*xnbD?3f2sk=c%X{Asyi(eRiu;tKgqhs`1?lR8^taKb*zmwcB zp%<`84G(PnfNcRX<v1PK($x1Ri79;)b)o<H3hnr<k!t-<ti=8&F!Vn~B=dBJ%&4#T zKf7|2;7m;VpW+Oma_WDIunU59DraM8!GH#$d;e3&`kw-+|0%2ZU$d(Ir&(41Q(XSl zxaxlzSN%_Mt^X-N8>Nr;KV>EKKP@!1^TFaMW-PF}-o{~L|1-qp@ZMzum5>(AbHaYo zA{WusMYc5H1zr8x8K`0XTE)E{*Wkt*ptp1AB!gOAtf^mnQqFmkbH^J^O6u2YOC65& z$p&UO%|b`f7Fbj?wgvZ9KSi7BvmMxx3@Nt}MNBz#n`tyE8;i;^hrif!Yc$??ylo?% zZtdjHqqm@g>}CUp>Hg*C0EhQZS^1O|Dut=rvi!h*<p}b|6Bt>$(VFF6`N9v_4Kq;f zSvjcIILTm*lYrEb#<WakT=zZ<WD0XUh8JZlsmc{s!S8|39Z&OM$qrU!1LrcWoHG8Q zhWbF${-;s`>dDOi6h~H}QE-nmy$)yk37CEYK^5f7w6ceYRA{qhCrT;Nq?F=;BvRln zoUv_1C$7Xosw_{iS<tPmvOK=NI`n%|V);{1qSQQs-tp9RyDUY}NfUw{B51+3!iuLK zAcnZ&J4VqB)wln?)L8zM)R;%+Z(4$Fe5vHzS4qA{Yb<I+Xg@m$xmp==jhw8RKT-}9 z?~y|re;O1uKhe(GkuDM_5Y3vn)f<0q7ynp8HSlaA-deBP#RUiIZdJeiILpiHSaioD zx%E1a0i$`x7VSjC?~)W6vX=9zF>Ya`dklpxPm6ZCsy1ks8JqUSyg6?kW-tQnwm_>% z^QTN?UUQwK6Alm2g?8jydTr%D#~O9Yn^$HqjCPNd{rw^LBTx@n(^kFSMR-)W2#K30 zV#Fe~xs>r2H1}J+x!=Y=uwV}^x5dlhAv{hs@}G(<BFQMKAu3jfc+BvABU|@XnK+$l zN2cXkBkcvKCAZBnGU!KS8MHOh#j;^*q(ZiaDX@Bk9bN9}AZmD5u0>mvMLwV1ZvC$e z{t><MPy4@aI{Qu?A@Z1Q9!pIN!#-MJ<%zq?Go`aapHoCL@iEu1+#Qz~vCnbIre4?? zH;cda37xoq-M0(NI89tszxJ4RS#ZG}ek#Npi2^GMO=UF=;JuA!!Ivn;YonDxjLlZK zx>=`Sp|tMpM$&Xh@ibsN?gq8%s$1LHx;wyn<Yu-`%a}>GKt_%pxS6dwSB}}G=EG{P zv90*TOSf-))Rw}o3s*nJdYKNWL4`2;!qt04m|87M??7cKN!Frq_8PMkja|M)#+-AB zEK_`CJoW{cGL@9A97(*@87%#ldF7fIMtGU232G3#t1wm{TAZ<+_X2Ge{X8nc9s-tO zY_AP;Gx#o>n%&CuM$7F|F<R!1JzKTYR*GRAEHZf(fzitJ(TtnY@jM<<XHAo}p`Nbd zyJn%V;Ev+jQ!RH$JBC7IrQuy;K~`H%7gyXEXU|jW=(V^7d>0~RLAKnUjAP0Mf_WHk z!4jcqZfnQdf(g0&n@C$&vNx(0TBIM2Hw#^>{fb)HR8+lU7JEb!7kjpa1AMG}Hr4Kh zDX&f={TEe~{@Mw==%pZ+V>gwS40n&V>5-r^L0U9HkDHr%z|%*>_#?%$%59GnUo}-> zjg(3OiY<>6J9k`pNpZ!FD=WnnU!5TMZw?@M#stCblN1~RNR?$v$a-b2`lN2A9KNe} z;?#t#YHP1;LwUE{TB@umaHTUV#GDGvji9v}KRSax!<6aN{ZzwPVGnGwLTuPp*E%b? zH|^_cmIK_k%pAQ!#2?>I%F3nbW4B_L;)JO*3R48^=WKT6au-$UYD=iK9YcJrcoOb# zj^+^jm{YyaEOa9bPT4nImgA<&vh?WEb`k1~j|H0$ea{rdR#iy2!MH~zyQg?ptFpc^ zZO4+8^)hD*+pw`H@_Hn;($7vTJ_sS^4djI^Qt`?L4&k#%N2Q4pZF7)AUq>#>15b5% zaC7y!40LSCy<wwqF8;6Evq>SLg5IKUZ5#1zGRAGh<`sYHlfbD>lEC+!`d&4~xqfO) zE&d6ZH4b6J!W=QoGk-dX=$yEnUjrQJ7q<P%x*DLctJ8MvIZfMs*Nf{P{92%@YU>!Z znBof*ZwF3ct@q1jS=(eUB6qL?#J<nqw8@E?kU2Om^S0>J5~nzFMKt?K0qXkNj{Zvm zPX}Ar#>7-(m|0iVsRUm>W&AH)k1v+BcYjedr~&SkK~A;Ff01wUH)FIYLmRwa-{fyb zxx?8aJd0N+>!N18$F{h*R`HB!A*o>MTy;s;A?*K^M|s-87j0W++lX~mVDW{O*~{%p zOPP3q%Tm}lYbvysRx${-c4Fn^RGP>ZEy<PwHQ6#n*~SU7t;H-$c6AB!Al1&W&GNu$ ztgdp<&Wl{!tZrdhV&UiTd&&DGOX`y7qHT=pZ!y>Cwcx@^7neJ4klFm*Zw47{n&?Pm zX+-6olqgfezu=}&9rUT@>$97>wD}uPu^4sZ9RtrkD5*yk$TdTzTcnfnqWd-8DI_>E z>eT9=P*()+$b-E2Lx5IrXCRtzhGN?;%bS&p=5=wo+v(BnRpr^9NiLi>ySR1(IY$mG z{7tv4TkSb`?NZqq^lC2j3_aLx7_hp1Fn@Rg%Q`WjgA;aSt554)L-^<6nP^wpq0_dk zkJG2?#_iqZ681xK2Ls!C?eNEUYzFDTwZgS;v<RtH(4<Hu>%UCYkPCJA<N0nY=cClO zEMhT=`xv8T?p^hJ4a%OP;e1H-t%~F8?%IUP6I$)M`dg!7Uri`uH@BKl7K4htqHnEY zH*&1lYgheHV;YC*ocaM}qB)%paXI%`4?cH3#Hw>|7`RcFUTM}}Quw=S4MR_Cn|;r# zHw@bSs-JukmbcbUa%*n87}WXlGSvA}&g=YkkRSDMn(BPfkfRS`mQd$YcuAA|5sdB* zyCA-u!$+{U%8%G2EcI)J*zlzj8%VGmYFh|<y%*3MdjY+YYtIez7KhK#xP+c%AFg!k z71u`DcbUv~eeg0Hb1d@+;b=s6$Fkz^m!&Pp_j#+U6b?lU;Y{(NZ#>P=>!%rLeQuMK zUN6wziHW;+)vyv>`uG~GkgdTA;A$zwMX*T18(}aJ&WB)vV|i5jSvw*z@=F<mPFR_v z`I3#$82oSIqo3F!MG2dQ(MR8`pQgiG<EXjFUhk~n5NmUuUEDVV)y7Yi6?ftXMWmmc zCoAw}6TLRU3ZWIGLOv&_8(rL}XRLL!{nu&5RTog=@{Xrg=hBcMd^MuT6VyS$8HT>< zDQab`MlP=M=@TVRI7UJ$U9zuZBy2a?&l!@!)JdEn>7{m?BX!hRtKJZyTt{efhNL%l zhQzXw%E41PK++q%nmK-6$TAwqr_&?WEcpotDKt}dtf4aXs<&$t0;!99Vrj8m+LKT8 zZF2m<*sa?uqxQ6(c8Gh;A*7$eYx~AY)*ZoYZZPk}><f-UUU<XN4qTaS5?(w%{$RF3 zSH4%t+8d5P5N0+jNJcpR0Ktzx0HQ?SMcx~aKRk6Mio?^XN+?ph@JT=5Lyjz%P1Ivr z<ciRJ>9vsss|Wo$3$Y7#HXSQqYX_2K6ah~-+o4YVNS-A;ohgv<>_dq-Ry5nZo(%et zR0eHcPdoa3UQfv8^#qvL+l?{$Qp)_SgJ@daScjEdyp>cWA5Qke-nqR&o;&ih4z4D) z#mq^dvk@eqog`(&k-KtM!dVA#Vr{8_VcEiG_kjvoZ7E=y$EwOSu`bezQd5RiLY+7p zKUqq-eea1`9gz4iWesHud@#u`vY<?UFv0`o2P33z{vbn*s!970FO;L00mE~E;b4RX zwstT=#&j@Zr^QXO@1fdvmM*S(e^_0U!*DQS7tjwzC_@nl5&U3;Y;mk|x{X7<;Dmz_ z=5g&{L@@f<m=KJ+!@-EJ?)PAXIz07VqFjH7>(i;#yf3C`QpFukL6qtl^(I-PFqD`j z$={6boBk)vht@{TV|bD4T-_#P>|9yg^2e)-IB`Kfkzb@}ILDToxft}Bi$SDhvNotr zQI|S#W1__AQ$N@zf9#MhErDh<71XkJxqGufWoFB)tWanzB`p4ScXU&^b(dCXLae)l zRPW!QUG9jx_0u`xev&E}EcRee4XYwzA?AwA*1us58yfK~4dR?CL*VVo<YF|NQ|*=Y zUYq))(qf?VnHoX6IdrsY2p_z95whw<faAJLWLbyq4^wkg;?(_sRw72=;;GkIGU!J! zH)tYPLvWEoCQ<;Auh(6lOLV;R^;&r-j;K_+H+p(T<75;Khs~`<F_P68I#4@qbJm?T z4#iybdJ*%cBg1Z2tJ$14-Gr={5bg(5z@m@L)Oz2D1QnlhCYdYRWsNpUOINh7<6MU! zvv6KO-`P6fVO?II;a!SP5G*&$?^wDUS;{g?alMd!=~A8u<}Z|m64NJvJ=NnvFNa>e zjrM6NbS#C&z4~QU3{6KUR$l4~Wr<8vcr6|xxs2epyKUpDj`|lm$U;1xMh4QOaF;?L z(=ZUGU(9B@0=C;>wqq`bO9y6<g=cu6W>}zfoj`#w%%D2wFHQ<_!nbYwL!h={n;OSF zT_z2$mmLe5K0K!D0m{qUM21}+KibH<jl3d}A(p8cO7-<lJQ8H*u_gw(NAXBr&)>wV z>>G<QnKzZ;POSE!fCgl<l`;fzNsGPqRkmEM@>&jza%NZ2cDIaA<-C12Ihns?<2eW! zM93gHW(d3FAAL-X(IFkc8QxW(z-h9xuR28G#+NR=Ym3<;(!7^{5;;d5iaN(CoTmp? zan&0`A?b~>DI>*Im&c-`4U)y{--WQ;71T`BlBi0|E+r-f;<SBpO{EH(x27u;SB+Uw ztaDFb)mf`_E<bCcB}JzK*tJ}d*VToP>Yt;XXcsI$Wy=K+&W2%&iqc3cjB-@H0S=c} zbdB*Xt{dVnG1N7@>v?eJI#jhM>2s%9^v%t?AHP(LW0vch;I84ZX|g*0T+z;IV!1<% z3!>!<%(Aj^oyh9vQ9@~<ikhp%k*E^VIeKYZy2Th;Otw>z*;QU9F(}Z^vXF_jcqk)j z{OY=NZ6jUXiLKsrnH8<x;8<%)=J;aC>{?!Qa{0c!M(tEQ4I$Es9`=uk_8Z*edUn>Y zrKT>=YC@E$o{43ub{?#*60!0$s9^W8+{S_zohy|~1aTU;Y*j`d;~uSWmAXe6Wx=Jo zqrsrMj`dx)?DsL1z(O9Fv)MY2S0DuBuvg`d#}wE84MbLXuoqWjFi{P~l^F9GQjeB_ z*uCf}Gzev(mVsEM3>4~gbgEQdr%9~W-(#E0QLGp5rx7aM9DO!(%U{({=O(+ZjVI_H zDIP%#@t0)gFNX)Uo^(GNS9ow#o5C9QW))XGOOr+uqjbXh4l&TK`n_EtC@B(V#uzmN zFQMsMB4#G0&b{~6&Y#vV68BNe7L_f~Uh~9?L6r`H4Ra9c9@@$6XNshz&3cSRI++%G z6BMud7Cjs2Yj@8SI<cPn+{C>I6oqLlqjo)ph;UL?Y92*?Lr&2G(Iyj9zd*$Fwd+lW zlT+#2I<H`rMyt;q;Df5(*|8#-6WS?N6|;%QxuIeyW1dU#5Gh!(JnE#_y3OBG#*4Gb zb;>i*pfv0ueiy(~4c1K?z-PXe$6rmQhUi5!WwTd4L!N@>bI&J#L6wy%bxQ9A)@Pe< z<!?b%;}JwGDleBCx$ZVMLY3ueQ-$W+@~}|PGH&C;cNnw1F0>Vj(()6as0&e9VJpdU z#4PbWSRFqs>TgS3*i*h*lneYq%sjqm6|ZvR{2aeWaxu>je4Sv{+<3PIsN0(dXj-|L zZ!`~@*2yc`a<%mpv(#&=ZHj?jSlmP;R*$h38><J_VrYwz)SHX0HrZ3eDH9AS?73#N zgscUJ+vP?JbjA5N&u?}tc*I(p1zg^y*`x)iACrG>%t<jDkwY)66qeJc3ONkBoLazH z$~Dm{C2{<WMuu`Z3^`Y>lvnP20hK^*%`aDrUbp9AY-&W&M(XEAE;jUyBNxhx6&fG8 zOy>F09SXlaUn-=Zv=UaVmo<o3C@SCH@LjAg{g)*oE)B#!eVf(B%U(s<m(KOiL}(aU zcaXuxm3VF830*H{qSL9x`J)Bu&J8}L(@=p9Tz~%9@ZOf<$O|>@Aqtr6B>jDa#N@V* zkf^W~B613^sGbmP_IMRWMaM+#4%xt(M<0t5o_7?q$gznJrJuSlT(wbjM(DAPS2Qgq zcGmygm^-*RVrJHF6Po5Qi4VC)6Cp#mNRnLq9Y$0&p$X1rQCnR5esku|X}#*VHK;wS zsD(QWTb8UteAVo!kqgb9yHz_kVzU7%=8Q`>bja?$8aFj-v@*rc?|93$)|~FEahvBQ zs?SE8eTo&6jYos_Hn5cgk$nEaDr*@v|Bzzy^19d@;LSvDEVS2JmeJS>24v-+-H<HE zip!i_8IemeM|DU>7Uyj&X6ptEt9OS*r2}W8^Y)vGEUT=S9)v>QY(O3_ws=@PzFB>~ zCFHx=5SI>*l@;|pyfL^;HMkSJ)q-Zdx8SmRm3j+=+hvoviX$3eHp?Q*W+_*Zpe|{` zYq=9UBLiDhllLfICBJ#RstDO+5s8K6x)`nA8<ug|;@~o_eaUYrQk4yxV(?WfNkopV z7sq;~|9q8267g*6qY^snU})4|ois{xE?3~bcU+f)D8FE!$4M`9-}XbX48!ZjaL05= z(cuwIj0B}aGzPtIOL+@Vn?7Ew%p%RW-u+5tFM?J%sGpL+cY1NvWr;TMEKgbr?nbP; zVXEZ`NSkV;64F%1Y=$)cY`14sVx7Y!!B)=UYWWo$DxA(@M<aq#CoOIQarugAS<A6+ zmyx%d^kM%eAL|wPWEX+m0>u}<glOC2>PS#es^ZYXc;UQKan+wl)2L41Zo(-~VZwc8 z;3~9M^W)aAagTx<{A??(o0^kE&bn_`^yq9g&h9SvnzcNYDCHNdYd4$Q32nK1$@?d| zoG8XexirDL?h=#}OVR-fr@En%IaDFWC6+pP&2=*5c%{}HPlo76F6&7HRh!XwyTInO zWMrDY!Ln4r0h%mUOS2++d4Trw+LuYOy0-J1M)9lYE}So}6GnSF6-~KHIXc{)uRIoW z-iNwzd|g!KQA?Z2H0AdMn|12!aNo&H+m#WB5c^^t3ugO<%aNTX&#1CwxW?Z65V8o< z><j&aDdS&Bl9ch1bn92R7uT9gc{agiPX4v_LJpk~cT^l^{n-;cYH;l-Ard!)5ai-8 z?RQH8uBq9U(seOj{isobPyQsgEU~P@z7pHmU^S#@-XM?n$6(r|CJ%$Tb<go0p&N`C zU+}hSw)n*(RgKE>3voE_>>X=1*lL(9o5FbrPHx>&7Q=|Ohw@-^mLz{)HqhC$Eo-t@ zdb0MI?|c~F8V1F={`K&lUcC=In0nS>t23Q|0;O61y;o?(wk_*tuM3l(wbg*OxL1O) zi?0S$@X*qfjKYwekPU{5WBTG~go(ES-K;v;;yVEoLl?(PqdDu548LKOT&__c6S{iN zYJtxoE+Cg-U=FdQ4BsZ7W_rJOX6*OQ6sKMN-kHVWRiUsz^!<;W5>V3I`CkWhDX-4b zG#M(}m1SM3l$dO23#+MJ+yTzjL85l?hWa=g0&L_FEzK~qS)wX+OCm|Q^})MXK4=e) zd=FRG_`9NwnF<G1wY^o!pnGR=)vM|ERKFOsgb`;ysEM&YCpxx%TiJDgx`<_xiAf_Y z(B|6X^3ZDfm!<!i!QzaZMGJ#lv@pnG^u)rTy<QfEGFsBzL+toFqK)QZxLjd)rA^LH z+}2w^D?^GdaHajmN(r`Pm}76fqf*VxOYJc-X*=xEVOoJ2pErhQ*pAY=nef_to%x*Z zZ&I8oFp{uP!CDx)Q4INa6aUt2B7#{YX8cokpA#-h3}Pp)#c9qxyyt!0o*ha=dkSq9 zD7W`%ml)I({-yU3vH^J^T~<aML<?G8C1JN{`_7f1Zi<W*yZSXQw@#ByKB`=+?saAB zlh2b+MDUesrayoDzVwcCXMF&<P>>LzRaQNcxkkNQrBptw_*p(zKIuj?gjv1H@Z4>5 z$iF{@3RZR^S;JSH_9#x9-oWdTt;u(C)h4sXMTgUhtNIaD3-ZvzW~A56<?M_M2Bx_x z3cZUUoboBR0m{wd_72ZMxwu`r*VZ1F5DQCGHd4_0N!$Lc-{w7(5*~B?*Pe|8ng()M z@w0__Pg4{=SAPby5D^(HT3)$k#=QCKAWe|G#3kF36n!YI{Vd_Vzl&q|eiNU@H&l<Z z5s~Fn&l39y{OO?vRN#H}kulB)q0B|WNXG^UbQJZ;`d^w?&w1BApG+ujeRLE*OBF+_ zs&jdD+~VhUA5J&OX_o5>FPgv3Ej9CB3MK!Ku%uITxx&QQD}FyJRhOuK+D82}e!PvM ztlA7is9oq}rK9?57WyYy6#8E{u^7a@v454z2TrQ_w!!=B#8&cf{QVNr9m>+YPqnCT zM19UhR(WeG{aq-TFa2b=%7t%v89A|1m%z7Sj|kQ$>qk_rj_?u9wMs&9Qv#EOMSOEw zNW$^=Mwe7jDw)>}&Qysgj{Gf7nLoN+^7+|*9vK+@J2g5~mUqgvTK|)s<YlgiT|R-A zjWJWnO-kk<=#wmY<W)x3cy$4rBK!P9=gn+%QC&=m$8OZCYs)Bw{XLNKKW%T4d966| zFonBWe$&vB)EMKVU(@i~I7t?3la7|d8Ydg?M9^I(CM2s2maGEx$tp^5_(%LDWt^R_ zJ(YXq<3%mSRsY1-&Vh~rwoc;@J3#KFADBABzfr8~LICr)F&Ouuk-Rd^1%5lvtB+D? zP@p6!*MUEf&dogSpLB?;d%}DQ{R8@#;i^&UhEnspS$CjYZVWJCeQkJ8tryj$S4zq= zt#8>zEn@9*pK4-ydW8-q%|{C?Vvpe~U&w5}VIKsYMvV(jq#xO)$0az%HU2GU2fGtp z@^(?7<1Niy4(HBaHT2g)cWQW#bt;yqm)y&p65kIE9J<;R>xn$Vvch&R^{HP_k}`ur zF)%VhV{P?Bs5WEB*-+uGK%WVoZSIH>uvX1xA$_(@<%G3$^$UVo3ub!jVs^hRCWB_h z7r@ccwD3U+eMLoJ(8_{Pddth@Q^_^xlux+tT&X^WmexDNqFm>A2Ndo1=v*dVxsKNc zWj1oj7?OoEw!Vz7t!^U+K#}sck%8}Q^#b)4%jk~S_p_eV0rj+4n}nXv!^3^)d3sQ$ zQ!$4k-C=wzy<$M~L8!h-U7g`(tM9+t`+j`~Nu_eP^}AK5wNo;*q9u!{2}YV<<+;v% zUHN-}@y&4KKAop(zoC4@@k~k6&#V}zH?FkC6h>4HKJKeNumZ2?y5I46N(*1olC4#g z-1@CmT~rLk;e()$7COkz1?$=rY_hC?LIrl}{Lr&BL|th>A*?XgU_3g!>mX*Wjw9F& zEDhh<$7fDt*y&pBJ+X0py&UbY%8?~w#<+%3Iik52t({UigI)Z8RL562SGhEGP!yM> zhIQpG87+)e))c-Pxgi`2G@~(NTeVHS(jWP#IX8l><qx}`Yj=U>*WN!rhX~7!Dzm9- zm-)lz{JS)5w-c*d=AVK2sxij&%&p0aZ_FI=t0-t5-CZUJOX%CFY1emBw|Du5PDx+_ zqxO=vHg8qd(eKw6xtsaM-pFffy|1bJ>wW#M>`m@suNR!`A=f1fxt>w$c5Qkg1iA=; zeV;q{G!Kd0H)l6=G`}f}-7_QU3I|O@J?kmNN#3n*PC0L~(HWF(8Gk{&5N($0da6R| zMQFNsv37hbR=}x4^SesAsC&J)+79-=;B7nJF8Y0jcCv{vS$lNg?M4@JEU-;E*WvaW zyf;9_u(Ei#fbFnjEw@i^#X*jhE@G3_a6g!!U&Llaii+Pl<zK&ut&ALrF^=C_Cdfr> z;tb(Qx`<7LT@dUdwr&h+EO08iU&JP47qJOEoVTj5B&$U<F{`?WO@jDW<LV+d<LV+d zaqS{D0Xp~k_(g285-wts!nuop#c2|x#*5fgGtOVPwxa{<S~XBb7%ogxba@8@U1Y## zS<BsdR#%QR#4%qd3~{O#tIa@q{S7hNcHSm|M6n%|k%1;=CG>Wu`+!{r8y^WEMp`gf zm#H{>!wky`^D$U}y$M;{@sL77t6s7LV{ThJDm;W?KmSO_H$7nb{00GgHR`6z+$2Md zSQ~NbU04oS8I5qNVH<tQm$|(q#CglWGn<yGeaHFuvzt1wYps+@#DwCnaTDagJ=M{W zSY@eB(q~vBMIOUQXybiw0p@Ort0)EdVRsQQSm+5<n|YDJ5>g;{OPm?kodS{6HOHEs zS%_I%t;AKl_MkzyB~Es*DjQ@3nI_&6*TSIPRsn0djy9z@@(1e1xm!G0fLqf|z;qJ` zY9L#t;=2yR4N0Lm$d=h9Xrfz>MYcECg-;ji613$w6%Wy}E&c1P`Xy+JD=aFH5-^!G z%D_8SeJfPv1(4B856NDtZm=3ySd<M+vOm7KnRl)355iTM+KDXz+$@&x)Ar*g*ufWB z#UzK-uaQBj^M0SPxcs+_#m0ax*>^08Mfmgy;X6<)HYU+h2|qwA$_~EhgD;X`u?R^8 zh@??oS#cs}WofMJ#f(Wg8<Q+m?_jn!=E36H(~F+DER(6{tQ=)`5cUeWM4T?IGxcFo zdPi3k1Q)+hXc^ws%Few3JytIk?)vN84PqKUhLSCEDA}S3*4!+1H~Ju9iJKG>0x04N zov#$I#!O)Ra3~5L_GOlC_KhL(k~K=HIh#p1_ImEmg6&%AQ*w0d*B+k97GCRvX&GJ< zwfan5vAl^}i_^k3)8Wkh@lAz(sc`!Ktl_6DUFBZSAbw<|4qF^z2n$NNyo`plI-_P& ziGun{5P!H`QHTT)u%#3YDNtPX1`02<knNO4oT>1{vf57+OBJOXGGvw(_T68q?9+lp z$)KXdQe~g^q%gKnMjuQQQ>DS}gjCrV-&9y86)aWuWler!>8e_)$QV*Zj<66*P?XUm zRf0{$KB=O_@l*-)T*)F;MD$dt?;y3Ssk)<0^TA@o5$tgYd;DkUF@!s%i|e!2a|;bo zCi*DHbNP-=|JrEb&a<~saL%8sU5lzAMb){Jbs}wWfR_3w66Lq6NC;&ruKU@+MziW@ zt!b^Pw&AfU<SDD{Hdvn21mH#6itoA;>-8Z=w1<2IdDKK3_~-}R7$AOz+Dioh({Ee% zD1&kLD|?RAB<IS}z(*R)Q>zPjbX+lJ)fex<%C`EO4GD7L^gHe5#}UG#p@VgNWzdi8 zV$jc9%7)$ixLRzD>;zVibbP==r=%ygSG!3cOl$ctEM3pXoCwenx)OcG3ihR_9H<A= zkb~6*1X+sWnn|&2ZGgz34G>K*_}GH&P_xK0t62oBW)aBOEHdZyupCQ8FO^^^dysL@ zI)D|+uWN~y@iPu!Q;~x`R8$TkW6HGRuozj@i>A6ht{3~7rC(zL&i`6rwEIquPNCYf z<l*FOo0jXP<ufPm2!-VYh4sOduMmqj+)4@`P*_6^uwQM1UDI`gbhR2_GEUG<4z8+I zoHDMg#qIwIX>GzL<~g-xVj)L4ieg};d%1cCfi6NyV2YPZ+Gp|Fi2td0$)F!{4O;Q~ zfNWUt60)))K=JxuURk_qnh}1}h~0!APbp&MfN0Q%=-GsBstKf{ZhKW#Kz+GNTSl=p zgpr(Ww${GEX-~O8TGZ|<+`ml$xJ6-qY6U<}2$wz~^dzE!H???!?Vq6tF2PvYm%a_@ zG#R^A05(fkD*%&mf^KqfRjmNXxbi$y4{eYl)%w2z*8dgA_kYc-{+~c738{Sl#$^V1 zOOdDQj!$vbxRz>jwSNXx-D^Co2&T$ku4>Att-+*Hh|PXCsjOle<ii?7gGVd5$Qs(j zajU!`5j*&_3|zQ{c+&KL-BgmzQkXjXm{PiD{CQ0so~~De<ggpB%Y3Q7+xbkG=GcY? z3Po02`x&np6bek6r4I2UqcW8&O=txgGSy`4TBf=+Wva<IA!_A-kZ8Gr6qIR&Zg-e3 zUB~}IdMcTkwBk<}Pl?uqr+K&A6zvkCr_^OoWl5YE-Rj5NMYQ@+$SNHH>PPvmI!IsU zoXhnc*8-$xG)<f)8;7eW@2PEjsmlW8oDWCjUKEk!x)W<6D1q$TIQ4i-y>3hi^`A?8 zwxK!ksf@DXB+LTDw#d<2!Z{t|_%rIQFW<lQ>Wjype3EHnN#Zxu|Jq=nkF>J?B@!;F zsBxy`s)A;|5Xze7*TIjUhP6V@T9cdQtGjmF#DJ`2c4fTeX0<Eh>*BRpA}sq6b;7zP zH^i^g)hGFD<k7~KknE}wN^OU-mnbZz?eog`E#l*{UEg8dyTO*1K&we>a%H@SXs&He zQJCuPdzXaK{C)544ZGyU(5>;q!~$8`W8(soB8d~Fq>JYpMeOU!c-b2@SCiDugUc=> z(@j^#pGkpJq!>k+?-p`_2&TRWn;~EpoxCd33YFY3@_Xvp$e<s=G-xIFF4?e>D`YuZ zfE;~m@M91)!j<ui4NCQegh^7n5oUXkZB>K}@>MxlQb=}@&bLmwT{SN~p-NB9Wu~j< z6&}B8UO`oUi3v2>N+RYR`6*$#8O?JO6r0MdoERy0mrH1A5m^_={B`uDy6fmChQ7fr z>*G9xEsy6l*i}`RyXGFb>^0hl-L?sK+jDlCMg_Oxg#6Lug8O~Du;^{#qWYH)Y857~ zfaKOG<WGqJ4sY41$SaOqg+c8CX{n!$er2$6oIrFD?ksYv*UmzYahp^O#EY@kjNH2e z0plN6g(H+it(NDuZt@hoesViyLxPLLZzq4!HqKGDjf(I{l>A8BF!TtAY~!ghVs+Gs zqu{n>{MbfI6h>JH<R{0p!J|R&sZE$sco%NRPiSTV!D1>3<bg7T%=W0n4Id{Q6FF<z znx_0)RWKEFvRS^l+ySYsxfCI&BJY&!mFu?IYacOAIA3(r)(-jp_|IiWs&$VZGGD<a z%`i1~r;4loj0UcHDRYZWwQJJooIh6m8D3QPgizYD9T&T*aVX0Rl=QE*lG8*(o2+c| zPY>4h^JOOtmUTsqf_=lUDA!($U(TZQ2qA5&SLl}zLl?CS%nWw6J|C%y2U)a33m=-S zTH%%Sy%XNSyIcP3ly0@hC3a(M_P7M+H@ext!?Bjy`x4jf*@aTH0aitOeZCh8LBuM% z2mNNf_|OC!$Rc5SJwH7+AwitMvaLDjrd8}p!+mM&-nwvgH+y&LUYw|iFtxhbo}ugZ zO<rrvT7^wT+VjPW6S7pd?WayYo87wo#1-E%K2Lalf=%A4E7;vszV<@Imc1u3pWetw z%M);hcePUvPOM|qdMHTe4B@TXN!CMU_vfl0!YdU$qv7QV;$@+t$uuJ#@p1^kG@9CY zxg^Kx^1YagQFc+M{MI2(+wY~@FqXVUw^}SY=o;M}v}iVbl+xAV3)M*aT|d2$da=8( zIPxE4wvdkOMScL2ZaC4i61}+b?Q;0fArDuLO-&e=P9ma;!yk3e>muthX!yKz#bJ1} zlwx)p1nR1WIF+@)#ADf!uZ^~p<sRQzC+>EMJE^%v1d5G7eI&4YF|`Pmy9jH)?Zn&x z@~hUEZ#!)tEE`&Fkx#m^rI};A5+ASh!K*$j_6_eE5+r^47#M#aPScWX&v$!1U_=<} zzKTvgG!8eu*i?YF*6ALWUIpo@vBft%&N+E5fFK>Y0fJdayAFcnjh95Q`*i=$Uu<mZ zPm@{}pZf`8SM}Y$x6n25b+X#UDxu-knfi)MF|WLDN9#haS1rOmVynn%e0FZ<`6o72 z<MJdu-%O6-NnJB3LKIhNb^(f6XiWcg`znZY)Y?#}io@#=Osc39vUOeCM5$NpD#F27 z2@Qs)a>V9#E&89`+8S=V$P3(1(==SqFk8BPMAwQ~riyvUIHMDLgrBYI7-UmvO%gR~ zH)qry&$W))@ZL^a%-Bw#G&=C10zf|^T68Wgqi1z5z{ey)L@kYh<}YPhz51Iq(vUEf z_v@SL^;?(4CIPF}w~wd^mS&+N+&}NPR$|{7A~j*f;W6Sa<O!NE%M-QH^bqmkanC%E zaGOOv2OBsF;CF3V9&v6Yar1-jGO}hZxT||pDLP~j(&*41R|<}_fBDx@Xcz!Vi%1&1 zWWqyB%phWcSk;H;mcCar@#50gFyW<m)XHmXJl~ljg4O4Nqfg25n2>(sry*K~u0$@0 ztcfg<%lr?XHxU_w%PGF$F~T+$0}?Ke7{WENDnS%kKWQ%-k0sTdGSIW#%FZZNPo>{G zsf0due+j)FZ{&x*Heg|R$r;q!>S)YhLHht<-H0{)tcNRu^>76&3#XBpD8*s@MYgeR zbk>l|HkmtC4rEV>uCc8>(2=9L=j)}A+xJ^mMlYFhVWn;5`4j1F7glC0<I2`tpe!>f zh-4<-k0@*0@YTu2-=+JDzs(43T3+8G1;n+0X$~-7_3waDSM`e!U8p|Q-Az-W8PS-u zsNA}=({5dgHoHevO3RI1g5s*z@2ifbO5cxKI~&y!A-a%SxhJl|{m;$SDo<~&mmM)( zPt0>E!!Bgk4rER4{6%fszK)uV);(6motApfDp)~n+V2J{x${)@LmB0bEq29YI1{i5 zLWM?hPCB4eVkad7ARQ~B^TufqIszm~?iz^PrO<tT4MZPOP=x-T9Ck(BtQ;$E$cG8n zLGSN!=daK?*GQ!z!CVE=6ZR{3Mr(d~^a9jf;Fm`)DB%p}-EwZnNxCV(I$f&<C=GDB zi^EUDBWT@mkVB6lwhlH(QRh-6)=TGS<lYH7ccM!w2K|zXK_>4oa7jgP&5ov}Waq7J z=dEVvt=M^u?9^WqJq>l2Q3CxY411)5@GSENeh9iZ@Ip3ED1fBb%G+Mu4*go)4$W)D zm|qijV!AheY4bw6b9pgB7yI?Zi)jkFxmi%t&^%?dTat~?&2um??CQkDP!?E-l(H3* zj<-E7Io_6898m!>(Z!K}0Y)uWjbW(M;-VJcp#j}OtCnR1gMPFu2CY-G8iI#e$iggu z=Uj#z!o0-Z;^h3LVlxKQUJ-mM;XDQBxp3MfdOobxJG87v=y*=&Z1YQHuA+;krAZH| zO#3Aj?7lFDvlLox9IBouch}veLYFFle0dz+Q<l4hb!E>kGMG~#SxOSrW9br06mbd3 zn4{fO=F+Y<=Wqqc^vIzU*1KtM&cTfZgQ8v{t*Leh+vw1eBP?6YB7b%%A&7_0DR#eS zXY0VB*y*Cd#=dS+iHt&IOo@z^{v*Y2?GG*rkufD&ZHtta{$t!~Q5w*>pYDfV<Z_n# zW#>102-d7MtEHc-s&UL}-6U<dfRs~|$E&dI+l@CfbJIJ+d;ULp|97vVtdEJ8K1CmK zQi@jt`Lq;U`%|UeNmDvR$}54$1+#(51zhN(N~<STT0LSQR+o~Jfsr5Y08)RaT@;E) z9D_^`Qme0FiU@Js^?h_8S;dsD`-V3s^P`$cAj>FrDKs~Ita=g!>U^WFF0QIVMV$I% z!@FdCrpq}Z-krVt;Of_@{KwD1mP)8+vLmEPk6+4NhHCewcFl3Z90(Q)zdrmryqI{i zH@VVI-4Y3N5jNK=+qo7dBTV`}@bghGX{!mLuF2o>t*0aB(ziEP;g;{oUFQAw1d?P` z;8h_H>APZD?DVgk5oycc9BIq1P^6UTH&FEr$w8RO>qd$0Y1bY`46EuUM#|%zqMdy0 zsarU5XBP=GAP}?oNv&&bodJCO=dy{tvd3N7;;xJzYN#x7eRzSjuBuKCD3ll~mN;4& z(8OMs)x!;!kRz4Mq?p*>739?|s8N@v)ReocecwWE&#p`Igp0_Rri;iINU_>Q<d~#o z%rNtDJ>LWEw*?!aeVHa(RY+CGB0Z#Pyykq8mznoAtq^PHiR&sw+L$melE2TKD79K6 z-g54@Qq4BIYWx(IzHoPSr;Z2d-pSdP7_?_g#O}5BjIe|nqO7~l!8RMyboQmV_9LW* zP3g^vqXkUFTAb1|{~_(~u5+$)UBn3Db(&v}56+<tPFn~ozBk?*iUaDa`deThDYlad zYg0c>t~q}WBa+H+?d<x5{ys6tnv4E`C^YegFSb3J;Q;rW=ThmqJ(}ClUX-2s#!#*8 z*db%=)R*NCf4oy)3H_K;jhgG!SK{4nBlgyw-<MoQkbV_Pu(0&*QNMhNsC@e(*SxG< zX^g!=`7l^{9hHL5<W=l?C~r!bv{IqhI%u4FXga#o#mWj?{l&@^D0QPs5u{^-7HK|t zzP#45lI%6kD_)=c;KD*zkGwpS6@94~nZ;FmXs5y*%nt$;Jo<q2M13IBOTFV}akv;( zebnL42Ag!z)sOLk{|?={td>bX+3qEIN?M59lnA;|xj1s0%%~tb#t+MgjxySn%f%5r z2Vo-IgErLOoU>J<>arfKW9my~Mi(l`xw||QQj+T~9@o^(Cdl+-$Dbj0lB!nM^-Yef zC$6C3g7RcHb9#UnM0(4b?gsXoq<ckI=*Ryk1<m(4$v?kI+HT)BqvhKmCu$tryCyN# zh$V|s7RcVHfj3p<5_$*sBePl7Dz3G-wM3NSjm2L|s%xWokX)*ldAZ37pPYesiHL_` zA#d~2-0jmEDUkIfqsd*<5^vs6TdK05N+@>TZ<8PTv!m%#3bQn?^C1K_3)r$1O4*=t z{rrl$IjCHJVRo>YzcAZc(r_K^+1o3efv<n~VG=6778OxLh1;gi1fpIFvsCemI3v~a zoo-unkCl;P#_xY+%B(6D125Li*qe}`L$%VM__Zn!vZ{dHkm~cZ%iRPSxfArVtm5}$ zlR2r~s%MAi01sTiubwWiQYnZ9JYT3|A=cOL#|{^Bk8f7EoNdMZMl3W<QycJ*kHXbl z4T;hullT?acIC6=H;<sGwPMH1Ze!F`Tdg_sqNF3FNntr)9-OIOZV&RMzsOTcn!tQd zARH9lvJYhtF$Rki*QdO4CN<;^P>KIQty>7%5ed;*<c{>?fx%sGah<k)5eoTp-(J&# z2QiR-2L$N)gwCU1Rs~J+h}paN*t+Oivn7bT?Q#$nTkLqJ2y{rDgKMc4Tx-=CC_jSh zd)>7@;czIxT#JNjeb{6pq0F~T&;@U#mK{=U@F=iwGlmU+-lG->3%O0ZlgM<;TisgB zL2&$CFnDRMo)nEPtQ6F;buEK5%bmrw(lMq!6->U?!TSkSj&dZ#CRL6&&1&L>q^bo8 zXD`dWUt^W49;=zm6EzCF1kE44r`Y+8eOIqD$@8jVq>PrAdz+OW;(aar;jt+sgi!Uh zZPF3zQglfy8)l$Shpn9o9PTWT4dv$nc(C-jZ!dn!uCf!(b^)Wa{S_?}(WD|o#6t}t ztRqq!xfOD=1YLGj^bbws)>dnX`mxymws1D2tF;<UTGBX~U+lbZ-*G;mdM3n8-qV<m ztM?VG97-EX`E#aNbnU{FO7m_R?l675{@4ql#DD6KCjzwkL-bI8h_3nrpGC!INeQ*U zt^kR^hk?k}$IG#hm16;1OHgnfYJpu)LM`wZ5ZC&+Yaw$jfNOoI1tiOAfd*YrKx$bn z(BM&EAww|}Yk?Su7<*0F(lS>YG|LA61LeB+cU7(>Xfoxxx`v$de{m@#rFN2#b(uP( zp4AIVStZ@sUN1~0Yf2tj^8r3Qjm}!e7><=&aJ)x6H<@^u>%}W;PCD=EAg44$vff&- z12_^H%ogvcA|4CqZnU;Z>iqBL#=hTGZj_+O<VK=vEg{eKkZC?rN7%b$u~tlEZ<xYB ztK#F#>wkog8l|m99HX@EEfvM+Rby1Ds*;&~>1Dy7jmwm6pZg%z`R5D!GU$gkf+Us} zqQ;-UZyC0PGlV6%w9NrB=!Xo!AcKr!Yg)Wo1ksC~-fQ6gt7K;6>#xdPbq~tgUc6~- z*5I%!&6ZnGf1h@&79ByD-)_D?tLP+)=%i13@rF;KZ?k%D*`L*ioOZ6eB{%k)*roZc zn!dL-87kE)kdlw?S@r5i)lvo@dnR_4SWhB|I|(AAUwZ<I;myMEyvjnJS2<WUpwaw! z6~;Imfycf}ow^>EBDK{>B|%8-eEoS9=8^nyh@3+e>jsCb<yUa1jO;S~nTOazf<4o` za`~zTWG%-&QO1!D`>Zv~p<$I?1Xdq!ScNQ0<TyNnG6Qn-o~-4MpkxrkBPa?NqtPH$ zR}{*&QP+0JX!%i^iDsSTpsc+<a%QxxjEbcRE^@D-ESx@Yu|;&WH&h{xeD1HZCOwEE zzf8<fiBVT#%Md-wRS43`DuldNr$vj>s=;#YO%z_Du!navSMrKOBwbnSK+{^!3^u*8 ziql$jv^vpbw<)QPusx~$Y>DheiB7AFa_K6|B%eN>d_tCdIZjV;T@}7{#DgS%Ze@qO zg447N7uS9aj@hU9HVjCli#o3wNQ9{y)6hl}s7Z9E2@mDo)%aw(<7mRv&VEK8n$Xcg z8fhsJv<Um|06&{rp!zYzT$s4h{Eq3rpAlNq+Kb5&ub~=3Jt4%*C;VpJ^?`R(f0?>b z;dz-Z0_c}53RQAcsY5e0(jkUFIwNE`GUOb4bjC7_S1NOoFrir07)F>qx+R0ZLnG8g zSn{&?_K!=5Wx}9Eark|Klw=i$-;uXvLa*;P(nyE<yw*ZM{^emre^aJcNvpv4RF=Of z(_q<VNMz6H;UM5;ZK`j$7Lx3vSu6>8Ay!8(EBKo->mkH9WrTBY%E)e5CD4GqStcm1 z{X5G(E?6ZXZCv%_2zpO!KA2ELe9Z0n*-i4wQ_cShwu#eP(1GVQ&r=!raLo78Aq}I4 z^-%CGBOM^<%l;?wKPfhej+^CsvUTyPcF#7E1pM=^l??jfry%vwEqo5xJ==^WxwP(? z4EiBMFvy_pl_<Jnzt`^Bt@tsi?wKs2lRp1%?VfoxqrTBaR8+;`R_e*vnQO69#g?HK zUkNIX?5o%AHdD7xk0aW-aw3L*o}{-4@gqqENz&W-)Uw4y8P@aPf+e}MY$1bw$Pf%N zNCJuaeP@e1@MBWhLKe|UpGjp44>@(!|5mTPA?np@|I~lmF>+NJxt9YDba=d3)!yvZ zWHy<N5j)Km_-pI?w)2dNxb5;v*m$-?{k)Q8GiA+%)|-OVNf(5TpHr*L5UL!#(6@p4 zHpolj_AzTEYTJamWRq9Z$EMpmCu3$D?O~YTO!TRZqIEL*tx>eaU^CJ4w&ISS)B&V_ z2}|<7L|0E|mU{TMbMmnAw5+TFvcKsBH>$>3_AK1^X3<%;S#%b$Fl);4rTT<N&GPZk zf1DUC123wJAcbNMjXDc9QS{_Z<HHSUK?vA|dsludTmAmQ(!4D_Xsye<*biap=c#~^ zExkOLHQaFF{Dl1o!+W&Ts-(cnX<3qbDr-o#WEfquMcgoDQ>I(bLlG}_3&Ue=>YCG+ zWUUgHF%Ol9of27Hwut@t5`0M;x8|EDBZh4OYgUgT9ZCshCp@YZ9)N(|Ub!24t|hqK zmN&G^&@BHqdk@}jQdc|Z?{mEtr@5QdRg&s&QnxM)b>t4?3=LslCC9?XpYW2LhFflf zn`mL%1{eMeX<AnVV!-~Gfe2$s#svCvPCbmCZpY^H`9E(<iNB=kI=Vo$ROJ<+tX~JH zcj0c^UV21DOLy9ber;oGAlo=qMUvR>tgIX4c+S-`x1NaPM{h~WqSq4X#YxL{a36VL z5F5mR(R66FAKEg}>b#(_7=nh@BYgBzKh`6F_Z%%`Tt~pSK1)!oe2USd?nT~=Bi$vV zV5c>f7%LS&ii7{2m2me~8+FDF4n$*Z-O+N@>&k_Oy(VKwu0^!_sC~Oe6VKkQKEATf zb|(cs8p++0Ju}Dcc!kuolpqe<Dx*K!T7uwFI40KcARF?@2k}uSt8StU?Mq7m*wU6F z@vxRoYjBljAzp`f{gM!gphz)Bv*nzeyd}t^WgJ3_mH~S%D`e3fP>NqDFJvmvCMPD4 zmvf|T#8Qc&Q;ACJB&D8(lyJE9T<X>0kb<mb-PM&+q`83pWzp<~ecfOO*{yx63Z~-9 zaz2|}7!fE>RMyO!U0D~`!~%^6ZPs1g5uK1hcH($9|5an#EfnT-cnqiEmGm?$qP&fk zdx^jGNatP{eU|nQyqRosaRL7bog4>c&yqrODpNNiJF3(@I*-!os*GOBrZ&IEI=WP_ zdN`4_rebf#nI=x+VZyTH^;lykMJi>}+MKlNty-75W?pxLG@Mcq;H3D)q4#+>r&j+y zO!ACLx#2<fD_$f!nsS?|bxEa?wSc@?hH<B&Q^AA$WRH$4r~FnqsFpv9BOjSUJr@pt z;6mBdH;MV;mt^ck2DMB}@%s3}PS^qND~7AQSV#NXQWmEU!vY$0*;RCYQ7e;L$loG6 zZBa-2<|g>MZTCQXV9O1IU>wY-qqISpDV{TsE>oDUJ26<5AI#IS(k*egDDk0mNYu>b zN8naAhj&Yup*zf?v&`<8SVGZmI>a^xam~EB(A}a|QJSP`Q0&6W+-0W+pR*NqiHQV^ zmgf%dF4vsp@==Tt&UAIJlv4$v&T03sUQeHpkDw?li1s-`-c;5?kL3r^*Lrx$#IsTy z_Ab~}Z8S-C%5w>}CL3#%ZYZ5{?~LIl5g~RXJ!NnFwb{#kt7Xy;tk$dvYIV6<Vl;ZM z^bxy}o>xom_7htsy+N(<ljg6RN`z&f`x%b6a(Sv(O2gX^R$=q1M3Fms33ZU?=s|4e z8FNR=Oe+$r%Z%Yw?PyOs5hbfuUBGo`kvjvf>_={NtIQNCvI}FHQ8{!dg{dXB(Y);l z6_D3@&SbZ0&bR1rcyMmkPaxbTQS<oDB<F?ak0nW=0#eOeu`qb`h&vf|*@7bo^AkY` zLXQYz&vQ#MKwFTf$q*zFX4z2T_8dE}D~N<6dpVBnJe~txDy*qceXI6$Yt+-YQ-lV- z)-|ozsu;{u6RY?Pw(FVNc{W5cw-iU-&L<>fxsB?@D#C$t_tjk~erAj|mkzI|A*s}f zxg5=;xa*i}Ay5WBir+n?qN`sp?lJ>|5?cnFGdx(%rBtj8MlT_6rQ$77Df<Mk=7+ps z;hyirayb?fqq+j4<@t3~w|jTFR}Co|Hhpo92;4|K=5ANnj4|D=(oGSenaJO#vdKai z_rchqfrn|D!eBJ^>8zWrg9O`lwLdq@3RyalEW<c&Q#Z3oCe#=ko<8`^K+NqSYKb1U z?bO?eod_M>v6Z6L>V=EWuJ-7^3q6(}%=I}7XoKVEo8(~nl8xdWIIl#i4^abkexy#x z+wF<e);x7Vq!#kjg^@ZnPhAwL2j!`~k$P~Rx|mEmMxe8mN77-Ron?QdL6shen=^h2 zksuzy#;n)iG%B7Q!>+4i=D5MP+G3t%W>R-O?o>Q*Xa_pZS#}t5dtKDr@gp?8t-1Gy z@+xrI06o{v5YAU*%aYd^$SGHUtfEJkDcCEn(;xzZ0@Py-JL3|}de&?~FzX161m|SQ z-@w&XBTMwI@QZccU<sC%!tINp+93J!JLYeD(A>wsi5vn~u3qL!Eo@XuC(RZHZ~76w z0P~_?9>lCrG*@aFO7$nD^j7d7ZkI)+)cwS~pg}2-lTx3T9glCtXmQ<poscd)A<GXr zNmt)2HobgMhBJkwnQFdMAXIZw@CB+6O^&}5Ov0~5YSi=t@_|q{Xex5lbo?0nTU_s- z(i-oT*~%u0nW{~=sg2Yp%t!crOFlC1!fI}0{xHV+k@-$2WcCstIH_N1<8MY}zNLy0 zIuj3+@R|*)Tx{gdbd`<Gk+MKi`1ZRrRObP8Wk?=^U$c{%;i7FkmF;^p$tgaCx<i)v zY4e3J`|p*NqgSeRh!WCBv58})t!7|>iah;*n+zDd#b8UF1cpC{DVS7PS@m=@k$8mg z<@`s(sF(6?bv#1{Ch<<3zfLE38Q}J-#c)Shd9tT-++?adQ~esU6auNPu@>2OK~}tB z6r*HyjSlI$B=X;a{<o=kEzoFpuW|hXtC&x24=&21J-TaL#>m=|gpuRdtd>BNtr#Yz z54m#9YDF?3lg+8w5Y^T0_KlVRYp#0;R!&0=ar)8li%ICvF4wTXIHI*LX-SBiYk5a- zg_dn-DPz=fEU=Vi``4_N(0ynrn~hrT_5esAJ;pZmE|l&nlc*w?MwMi%HP`J4;ydF| z6l(YAbrNIY9(}jMT^ov8Qpgb*N*P6}MYrq1A%oxpoPD*|JLR%=8`>_6sX$IBk9vC5 zp0S^fwNw~c3{2&Yr0C5CPKcf4%dofgbpBYB4sSnQ%c5G`9UZbPKuMgVMeaG-zzZ~W z*r&`%mPMo|0*b?C@{rcR+)>HrCJuY!9FI>Ny4AyEb%}&vwGCXVOn4r*GI}>Nj6Er+ zeja!=ZTo~kU$>{E(q-W;=fl0$1{n2~&`hkR$RPV_452!OIk%&6OCqhc#a|1Z&ZZt2 zN}GDE^bSvsF}DKCTN$#)m^-L?7bcbUauBJh+BuSGmm18md1^gW%e4i*kzsi5wyeLL zr`V}0>M}(Tf5>3mfLLi8U|0&l9wxV^>N^#8y7-BUN%HO`ao{Df$MKrl`;AkUouE0R zIZ_P=T}>`Qx+jM0uO@`-KPVr#Dpel@RNup&=CL)fK&8Ghran4B-uomW7gIK^LKDD< zi2G_QIzd^g4#=-F_wCnPn)#(VtUguFY4EE@*_hO}NkqB>m2iy^c_8Fu>-AgqWD2Q` zST=S3y?{C!`O`e;#Z|i5zowGEu2l=9&z{kGJcfq)`9m52+fXPf4ZJ=F7uUU=&%7;q za$6%fWkqF6)dZF;bsM*At{L%5x`|2Ac@c1U@2r6%<*B)01BKiSq&)jgO!cwTt^h^* z{@$OQRC`(7-;V}camJ3tdw860`ewnJ3X~BdFsD&ze;R#vf<`Nd#>zS$7O7wkj#FLK z3e{lD-1x~s(9uFm=u$<xb@c;%1nH4(o&7*xougZKKhQM{iT16-AL#3IbnEg5`i30c zI{ksZF-Jc*r>8m*u^U%h`#CpB8LnHu)lKpWlQtA#Q-Uywh)Kc0q}+i?%4W+3K~f`I z_9l=#$d)Z8z9g0OAL6re0cMH7Eb>bA9wiyG$SY?v1uNN)Q9G<W6N5yX;dl&^Zid4! z$O9Qxq&)R7l=?h%2mBa|mP(y8r$bm<v!KN;C)ZwAOC~Yoah_r6B!*PYGc2LRkal^7 zrIZ*7OrBv$C5D2KXINT^p;*W>EV0B;IK{A{KaQdLLH_Kk=wAn~R`mNBipLD=y<9Iz zTKMCMAMEbtzj_7g;E`(jWCMq)V($D(xs-8FPk=2v)0C6dhDBpZkPOAo9Kz(jlpMb# zMtNPWKchlmtk!QlNxLIf_s1b;>-4DA@b>A=8)JM_+nMW%sMW1+pPMwzV+i)9xf7JS zB%J-jm~V(>ZfuBmLbJG{oBJn<h+V-_SE|IV>0q$XumGhxhi1;26xK31#LXRWYE_;^ z^-}$@`f0WHKJU%*^WH49$kwUW&|-)7xmR?U^n%nvxa995w7PEJl3B*61%T!ybb&fY zFF7$txJeTJXx|e4G%ukqM1dC+iR+sf3mlR*y7z2HFPRym;T(CjOX=A(8j7p>#lta6 z+RRmwS5;JM{`)8>X1Of32iVxqu?d^%Y{<pD(L%PSFfCeai54mT`?WYFTBJJIuf^7A zk?LW;77NiL)x~}-PK_3+KK5(zplFfmWWN><juxq2npz~DOV#%iUE_4$Q#Ul9E$MQT z7Me$9%(@wy`J}ilnDy0FlH#v!lhFOu3KAdkwUx2+nG79BwL%~1KZ#m_y)1}{wLpIA zkh^-MbC=3A<xr!BTopv$z7$>6uKWr62Zr~w%W0{yra*_V&~bNp=1Zll!4ppokeae3 z<|}y9JML!EPi<2qlE<95K1U=!IZ+#*qfPRT6OYQ-B%e5On0|e<NuHQ!lk|7uNvwHC zo20c9QP(dyYM&6`${O3@Ls<QmiAD?E@F$FSw%pbc`+;ZgQq|hEwIqKPjgS7lT81$! z)Q@^L8HH&@eU%__XyQqvITt1;V3d`wc9^a3CFRPMb#c5`S*I=3>(+LZv18drl^Phg zB|SN_Q*NPc=R4oz>gLV718kBNauRCNiHJE9MuH3kk!vBS4TBX2ul~}rh}u_DlNGY( zfX*}2O%j$1qP>;BON_Px<lGxT&o<hdnM-*9yM^o*Amy7v_U<-nMMM7t`Zq(p#O*2O zVgU4n(f$_nHluw4<dRRIyZ%q)sX}%ZNQ+N}>`kCs(5#TX1H?O}pznfq8~4?RQs51J z9kkNq{Ts;Ty@Dp$-S&gr?Po#m;)e-Mfpv%Zdj!b+eJAKYO!5~&-!}9}qP?s=%id|e zy$a;M{Q);iecq(J1msfg2f38vj*L<+13B%%qq0mh@P+K(K`!N_88OygaZI$gm<P(; z#p9rVH(d@sKFj`(q3(q4D`nZQjrRGDEc=O}=RPgVHku#L2e}^?&EnZ{<6Z@FDepKZ z%f4XRzX$Y1LmNR4o4xY6S$3*PxdK!&^qxffVnUC0#n}DBXGXL-p$8ILabA{v*Cf9i zbco5@1kzkzA^SXNnxV@1S=M3bl?h!3y1;0+fXd{?LiR<_i0OPUXw1-kp#L;Kew?^d zW@p*oSROhIw9V`t337X#AeZti(4EG8PU7|??khoGGVW^=_c~CEX;lTyH$OglL6+?` z4ITvj+|c3A=E#SkPEha-beH=Ea$R1MxL1R|Y}`Lj-1maMV^Vg4yp+9uPL@qE4OWA+ z5x0;%?ZPZO)X-(1>4v^VL4VZT{^+8p!4sgbm>-ADrB7*ytGu%9hMo>`t)2&RonH>R z$GERf+`mrTuY$g6+^;3>j}!MX&_5gZ=ZQOmH7}QZD(GJ0o&j=yF95Zf_GQo~4ZRTL z`S~RvuaRyBd5-uV=wXv`-o-H$mV!JL?gV)%JOJ8a@*V`ayq|$w-uUxk?A}6>x_+Mm zO|@M28IbFDZ{pq$I>@-+Pu!FKm?;X2@yjlyY?*JDgWR`Iyd>tAQJQEkm$xPKuOKg> zze=>t3&~z4<zGOa`schX+I##}q@{760J$H}e|5|USAaYpTnjqP?0p;LrLhXq>okRI zFX#wE2lrBU8hRt>NJDQ==q`}wx^rI}bKNUJ$C$m9pkobfO0+L0TIqFJc9L<=0iA4U zF6babF9PZ8ULku0NRKTQvYSC6eL){>745vmDSbg9eL*38L7HYSWDkNu`hq-tPrV}6 zCEXyG{A!S=^it3&^W$oer}R4#_ah*$OFj;|-t2uk+1sA%eGBvs<9;V`A5Pp~fmR!L z%9YWNQ$b#rtO1dY(EbHWVkoZzc_=>t3ZVqK&U-;?Ox~|RuJcK+kF~|CL7rb826?&_ z-w@O7R*=^g_k%o_oWC^I7B6^X^yB5AcbXqpfkq9z9kkZaJ3#L52SKjY7SKB5em-#v zZ;ISb&<)0Y2FTsMFmW#fz00_lC+;<gyArhCxFd<X0pzvChd@8D)c+{RQ~w`8p88LM zJk2kDGvT#(egnvLehcW`CV3giwYo8JZwB3H+*=a&bBTL5=sm{0H*pW|BX-S?e$WQv z4uk&E(2bz?8u~EkuMBMkxh}s3Z8Tcz)lrvcgPhw9y2-egB<`24iQFBa_ZjzFAP>h0 z*T&rRGLYw{w}D*V4WRd%i}!%s#TJmaIEVH}d#8Z(W@sVP8lu~q`<BRE2-3@<h3u6e z=RTOYKLvfrxQ`}oagcjbte!kQp-bKt<-HViv$=Q$$mQLdxL*QoGVb=o{eI&97wE&r z{YBy){}-|JoCWfbKO6KBvo{yye#{5`#PZOkAkRau0eK#}X<4jyzmm`q%OmYFkk{xV ziMA2szWpue7W3^BAouNuiTfDnW5)e?;$E;Kx?KkPYvW!Aa<_k#xSs^gEhz4{CG;)O z-<XT<fZWByAlIdBWpr_TLg#=sn~U>7?&6A}SVvs`_87KHSI6+a0p#J`^G>q5#o7_0 zvCerj$lJ2^^;xDPm4)nRkjH5Sbd=Fv1Davz&7h+Vz4YDD?UnC|=)AvTr=xQ>X4!Fu zR)9Q2?*(}r+>+2|655{7SvO_b-&!co1$ij1e_xb0{X<dS>7c(ed$U2>v|7j(g1im5 z3UsT{`amw_&u)%xuLrp<8x#6?LI-ckvX7hF=^%GI3Oe3G^v(}QDW3&>!tC7va(h1n zxxEWM648f2Cz{*)5-R<5mg#hSAzO^Xj&4lo%*|P*9k7M$r67;L*MUB1zAXW{Zz~da z6r{(`3fcO^efi(VHswbk?}0uE^0xacx5i#Z_VG9_J2s&%khgT(Kt8HG;S*W*J=5wg zkkh(98EFrJ{>!+B-WKJZoX|@^&V5~?ElaeIfn45~KNZ9Kb<n3QME?fz@ctxme*yZm zai2`wqdy(po(B2{<DLm}x6e)77lCd!?w=&?TR^u^L<-pr3H>9;<NjYjp09R-{?Xii z59E?x_YcutALuj29RN9ZG;wbR=|aXrc1z;!O5C4-wix%3#69-*C|O$>wi@^8Aea1- z#C<L3bH@F%#C;FwSfgzOd6~ZRGqFDS!_UT2`xTJ)HpfBU+x!K{`<Tz!LawuTc>{=K zLi<}mL^|l^&&3w|36QtgFZidZa}VfWOoNwzT<5D2cM$Zi#$BGc?@8QEpsyMCV~P7? z(4pq<VRuA7Izc<k-ZMb%$K{E;7<8X;U!S-)ChpCkuN(K4#QnF#eF*do<5m;*jL%1Z z&j)?exN|`6?~4=n6`*e!w>NP=n7Drj`nGXDnYdq0+^>WF&A9)TxHG;G{XG@5)3|4V z+~2v0dkN@%<Gwg?7bou3pzj#>&l7iT;@$-Mu5mw<xbw$izvN9IFAHx6Jz)0U0dft_ z*cN*&e+Y7WuK<0|?Dc}&-YSsyT7Ho1{Ws|QX788D-cff(Dd&Q;3|+`(gIvniuSf2; zK)a0l9guS$N!(+;k!89nwUC_va_+mn8Qp#W^aJC5806eL68Br69~$@HK@S=F73fEX zrhF^9nDOl>?^Mvg8}|&5%X=Zndr&V;==Pn_#Wv87&Ba$h?&6F0NA9;ln$cx`4dmRP zC2reynAbDzVIb!|1LWh6&x200)@A&=QC{HzX06P{(V%fdSAg~ydIQL%tO0onz8CZp z<Gw#}f0Ve7fPQM+#}jwi_oCZ1p#L=P4MHsn$6tfaGuqz^nSNgYdC#r<e`1aFU68ka z_w9<bJqaEDV5I#4$TfWp$m{2&pr4r^SA*Q&cO-kC1U=9CVV_Uvo1jO`#r+_6@t+`< z`~>Jx<F@=DayvlIeICgDeG%v}v-c;--WAE-HK6}8?pqRfUE;nE^xww4IdNzFF#2&e z=yBuD1?@HTGEfLF=;ube8sysF1@eB~9*}EVcqsOGjtBk1T$}=O7taB?y*~u~(zx>z z_ezk<`+BnX6Oe1L7xaX=_!Y?I9rdFquLSy)ai0cq?&XPl4alV|2mRXYy*=4`5aj+I z|L+mKEun*}(T_7gPnz3jgUD$7TLAJN-bzr5(MCY7!G}N|-p_-k824X6t%k-y?)KRK zK$g)?1i9Pyj7MF*vnQfEe-hC(KaG8^&pygEe^aE(^ZzT$&NTD}ko)^~ko&Pdp^qeV zdqPM2H?uCL!7(7$;DX0v-|PyI%UcF&GkfbmhZy=4$Yb{|&@`jn19B;2KaXx(ei3y! zCZV$v8UP(?Zr=uSw>N>@-`kVDdlLG7LNk9!ufW`%1ah|@19e(#yzz-B<$a*T%-+o) zxAzs0+xydB#rQk)$>`!NkjLNLgf2~Jbwb|+9d45E2f5@z))FLt0^}+40LVi$rKKfE zo{>-mR5U4n400(yoRVC$CKm}kJ)z!&ZUt#~Qh|PLl(L`@HMn|el(!z_Vf#ozpH1ke z2|eeamh1?V_dJkm_1%M`lwW~dN|AjPj$Qyd(p*$P?&4jCwq#GY^tc)1aqv$dcX3}r z2ThN(OF&1Nlox|s%1t15`>AB_O9?#=nqe-U0J)35IJ_m)@*e`Z+s}jC-^UU<s2FK~ z3_9ARTn2I}H-Un`Ab0zvgdPVS<NkvFvqf?Lwj-j84}jdoCldMr=vZ^{W01ReH*2Ww z$3KAF#g`NMIcTQ2_%+B~TskAVcopb4<Gv2$+_xs~^`PU8JDRxP1Nm5O&e1K|;g&M* zP3Rk-ry1>>V_LGa49x{iHS{8o&(<yk`E2d$K|bR9AjoGMPd&CJ`-R2EAA@`aunH=h zF4wXv#_i2Mt|gmgl9z&hX)ZnjDq1zW{P>p8n|lP*W%jN)p(WGdib8fH=s`n20sYWW z=ZP($M&El%OLl_!c5taBtj=8y^7?)tp}z$^WNyC<a(Rz}T;B9kTe2S*_k`10vR@f` z5y++dV?t9;Z^>S2EyOgC_dHGndC%kPpk3znUpu1P?}C16wDE*acv|FM400FmOz2Y} z@3m}Cv{TNA_Wl6m+*c;r=Ms82aSuK-x;QJLixL_Jc^Yl(jHxj5=`Gp07We0aJmg<U zwEGk71!qOcgP<Q-*ggjG*!@RPuf@>kKpsQ)f;@&!I=dx1(Nb#`=x65kRUpqp*MmF{ zeHwJ7N%<_urL@h8I-d(V$)wB$?KCNugHATul^~b=KF}?e!){GzPeQHFh-K>(&?)A& z1LS4vnV^!<${?5bO3<lBdjrV*y$*Dm(bgw>_kd0}+P9OvpMW}y_C&JRc}`3AOpEb_ zpr;x43Xn_w2IzhZ+o9*SWM>%nc#!Mz5|DF02s+caw<hkZpGnJPv^Rm=#h;!>{cN;e zko$2H$ff)o<aN{G=Tje;y`w<?X&RJ3XB+KYkjr}>=#7>}-5^h+%R!#fTR^kS#g{?u z+fP6q-cx3`WX~|}ERb{OgKn|ZdMoH0<6fV*{{%YMXxkI*QIN|!<5|=j#yub8@;-9` zT%&yn<h0_mV<<a7=Nb3uAP?mQp!1FPLXd~@C7^x_<;y`H%6EglX7Tb~&>lnIozoIl zuYV2lvi0H%Tf%xzFX(Jb>34&)!>o{f1oR9;w}O0K;||b}`L+$@zI_AaaoWOC+9B6W z?Q5YjKm5pPeaF3^kj-p4Dm$XDy_bl~hWOt?y?%5b--D>Z^*yvDJ5*n$QIEUk=sx>i z#+NF8#*OWLEhsbd(=+;7SeT!7<3UMw3rmQH9eIe``!x0#a2@x9qx)v`B8w@V;(3Sm zCD~`UW=FPkxj&I79lt)UujPo=?1+|QvT4#G(&X1Q_$9m7AV=TJ4kbLTgy-VJrLTUw zuV%KETMv$EIVGFkcWAF@yZGNiRy?xhBK(`y+rmWg%&(*WS@P#B_eZqLpar=t?X6k+ zYh6O}GuUY+-}N|adeo!*nyAN{lO9V*r4}Z$XDDv;J(6z>pM`mb>tcGHQ49ZN#0k@B z$F|JK+7%~EjURPhvCqPBBRWejecS2d#dP~R>18rcuF3f{a$;P^@Sf3{9oBNZr+d^% z>3$>bV_ZZx@hi9I;a{|`Fq}u;vUvYs3hz$Jh3kEy>lN)EskA?`mi9`|e3(AnBuo~T zIkmL920Kw7$-RuY4EguCN+CO`<yqM=eMk3_^w~yATR#4dd%oh*brPQmkSyly<NmNU zJF%t1%7b__<+e-qXL=Z-pURI%k{_d=f83g#*7Dwh%8`DXI+%Co`z%UpYsO$LpbU9V z>rJRXq16cu;?C{iJfKoSa}!cM6YSx~AMii^{xJf+T8)jras+&5<nXCET*mkK`-=$p zz7zf8@ARCV={fp~qXoYA=CD>K;%_*o&+JI#`^+4^uf1j<lGE?UIlP!07JqNc$^4g` zom-;?zHiClM-HhO-j%bz@W>kdFLE*uomQh?QG?lr9DZdE&&$btYYylAx-F-}&C_d+ zH5VFxuaAJQa!UMtYHCEZ3^_TM*2vlEIXMsH=;a*!1v!})=j>>;FaG{iQ{UnD_FOt% z8Hs%JVSh(kjq$fNXd{Yf{HqA~QdrV2k1t5nEX&6O&1L#6Iz7Q`VJ;5y_O%Nl{+8z4 z=Ho<j0P*+ooSl4}oP2V$!Op0hooCg^*++8toE&~zE)F$ji@&^X4@Dy14F}f@nlp>P zt_b)(n8Uejo0W39{S@3v-+>uZLrR)n(y-OmOdc_sikc(U2#bw76ZEKYRgXC;fnIOi z4$vG!oe9kXy~$|O@j^o?-Hzsf`iwRg^c+Lwgt|f37_9=j$k6<RdO-a~TL7ACXkkK& zK!0wuUXaEGt=Zy)mVo}kxJyAAN492t3H5`9j5`R@NTM}cme3GL`Mot80cnianypS~ zEoj8J>p{OZ?uLXmg04622S866cT+;QfJTkG8I&2iHKE%;>y36hsKwBhgzf;{XtXiV z6hn6<v>mj;X!n9Nns3c^B=k+tO-9=Z(%8H;dmy1*p!XZ?A&|!Pt+p-M(H>|YG}^-; zjrCiz#}e8Ly4h$?fHeLm(-LY&1<;3$#^jInT*-e4(Q(N>YTOy1zsJ3LbrCUe&pu{c z<!i-KYsSDhAO@q^-xzlmNc%@yv#x~b?q|0dO?3v1Hr%-hl|fsL)(z5rr`D{J(0tIC z(Rx7I1J#->NN6GGPNOXX(e;Jfo6us=-9}piqJsoiHIJh{&^<;|jn0BL+`)vFf&SUJ zLm;hylK&D~4f+@3t_3Nlv}WrQ+5q~RaW{grQren*AfZj5`;2=Fh^`FW%?aHKy5DHG zf!Yn-p3oN14~=#Q=m<k&3Ec(ysnNEBjx=;{LOVb|Guk&npEj*_CiDR4QRD6c(Gf(e zhZ5Qi`Y)sH0nyci`*1>!fgU&7UeM8oo=8aL>ItJMr)wW#tK~gMO3_~%O<_IOkmNg} zlPl}|)BXvWT5Y$pqYlhdjH`L#<BY4>Do0(Qf^lbq)bnYz+R~BguY-(R25J9AYu24m z1=MET`5^h-n)M{K05r|G3qjg3*_tg%s24QdxQjvBMcHb5_8l$7e7JG@K&n|<tyXn3 z2#rAxv}GXm9$T$ubTk5uZacKqAno99&DJKg9yHUq8$c!FZcOL{pyQ3Z33RG)Z%Jq~ z=tSe*3Q|65wG!*-c4#LXcMIst#=Rq<F;L04cY(fQ-0cb73p&lXJ3wl$TeEK_v=h`} z+y_9)wXNB%gdPGhG=jDpbQ=HZ#V7PIsMENQfz%Uj&Gshr1n7L@Lbg5Yw7&@{Z7(pc zQtBS_SMly>2563P6`xNt$%-9ECD3z>E6u-ZZl#B#Ss;xJsQ>t@^`F*kc0!VRv2kVR zOyial>ITU~{m0)<<IYd02gINW?gIX5#=bRMn9w4S+*AMY_blTsPG||}4~)B%zyEAH z_a&t9i+rU1<FDpB$bSh9fnH?X5&q6H?&^frf}|t$AAdD3(rSAt9c_g6V&i^*zvmct zQ$n|ZE;sIG{+?^xTNAns^m60g&fhNMZux&YI~Tynsxr^tbT^Q09)_2+&@P1px&=Di zdf!5j>L+Pznt~2Zvu3tZsj8%kRH}-qN;;8Nf`DWOb`1&=U1X!;*a*yIc3W+9zzD1c zhZ!>p((HhfVOovK4p{+hg_Ze#=hm%zzH?8dd-p;ob${RgyuNepcg}s(P2<zw;!{dk zXYiA*CM_4w?AxDa!TN>uIsBv;i21ki>3MuA3hP1qr1KQazl~4x_%tM}hw$?sg>|9v z={0=XBdm+~`D0;yv+?OLK8*_NJNWq%VWnlC{fX`*(%B5+A3jkO#{Ap(M0bX66;^yv z{avzd!SR0_e$zg+;d1QXj1?*ElRqxOei<ofpL`p~eh*f-v`@zat=u=BYwy!sLHl={ zVDGnK|3lcnA7?G3r+J9%L-q1#mX`NvPAC0Kbv>;`X}^N<<t+#uOwtyTNFr_<7UR#F zXDts6pI5lXf8MI~H(mbe^Pl?XeD|&IdFHym51#hYWa;eh-|O4*ncMfC{phM|wq11b zWp_FmUcL3V)n$La@WPHyeroMI$K83?k7jPV=z*2L?fmQO%5Qz?*5g0s{C?~gk6iO# za_evV+=c(O^QtFL`iPT0o-PfRJMx(~KDnahUEC2|Zp8btsal6=PPDX))yZ(F&@q@X zP;vN%G#!~rHeDMQr<~Nf<+y65ZXKCy?@)jHPU4hudCS4?;%<?2hKM7;)^w4E9Jjos zKp)xGQOTrgDH~x(K;yd}D<l;A)N>E~iz_7?ZS<SUv#%sfoi3BLpbPJp35}svoI$y% zs4{UziXb^gZUdQMgjUw{H`LvH@R*=6&&X3Ct!K-c7eP!$Xg#}|kruRcj1k<nGWIco zn+wJqBXN+!j9dre^U0;(2-3;OEg)q^?gg1-<YAB*MxF#&V1$nEwsYjNXvJhPLT4^L zjL-^goDrH4rWv^u<RBy0fEXW;%jyGJ#|WKkB^a3i8DWH0^HYp`8)TLdTE#9hLaWc! z=gOtioEvB4#N`-2jL-^Tf{`f50Y+#RnP-IJduzK~)-Z_4$Xy`28JPkZV}zd9+{efd zLFO2tXUq;WLQ&m!o?JRTRe?9SOJknyT$LH2`w)|i;6kV|!^oe3EHF|5X**xe`A!gv zkq1C}82KBJaYnumGR??8fgEIH5yU`XpkL@ZY{wjf@x#cOAPGh;1{q;wGsqMpH-OAB zG5~VmgK}B7lZKHmf-ErdO%US(In|FqRx`2yVlvWlEP98LGeLS734)9;vK?fCku1nQ zMm_;D!^r(02N{_LS!Co{kk$+3R=f)0W8`fRi;>fggXbAp50YbKE65llNsviKMnI++ zxd&vHk*|ZyGx9XZVMbmCX}d^n#akfj7&)mG5rC1kAiEifgOnM$0c4z!3dj^AcYz#W z<ROqbMxFp!VC1JD#(KHVuY;^+q;)064<qM*bTV=YNDm`BK}HxUfJ`uQ2gp7~9t4?T z<Xa#I8JPoFWaL*Mt+;sU9;eGzVf-+1CWysI5G29Kc90w+S&%VCJ^@1CE_TbhA7q-5 zX^>e)o&}j_<W-QvjJyrfcCnoEX~$#yFtQ$mzR~QKz7=FQBlOMkG9x1(<BZ$`GR4T( zK@KqTG{_tyFM}*F@)n4J1)f`<lTN_+VPq|c$w(ZelaU)hdKjsIj4*N+$OIz~f$U@C z36L2^ehPAsk=H>M8EHKc;|Di$+*X_e;$!3z5Q~wWAPGhaAUQ_v02yQCL6AvCz6CPP z$Q;NlBfkQfZ;%dm*=x`Qu)O6ZAI=Z)>Bpbxh~rm%`y*1(MjCtmT6q%sJ>;~sqm~`1 zwGS3agYb%c=3^~JFJ|+B&wuVNqV~2HsmuUrd<KlzE(2L)qzh!ekuzz^AQMSB)$No| zk4!!fGR4RvAd4wk^CU?57MZ*R;=@f0x4(W55`RS29RD78l@T9E4@(sQDKoMeWFI5D zKxP=pfy^=TF_3vi?gm+8<UtTRO?2x#4bsNQQy}XYc^<@K<QE_bMh=7YFtVx*?P6pN z$P^<TAO{(VgDfy|El68bu5$*2zWwjEVi+XO$T-MuM!o=&W8_hgF-D#QnP6lNWQvhj zK@KqTCde!!$DWLKF|rzDfsqS94m0v0kTy$h*Hs{^V=_sC#2L8>WSWuNKxP=Z4`hy! zuYt@n@;Jz0M*a?DH7;7XetrdHcCAca2U*87cu2vp7&#TBlacd4b~6$M$uY7GWQ38A zf{ZgV2r|jYEg<_Cxd&v1k*|QvG4c(Nc}9K!vdG9wAan`E^~P^N+8Fu2AU;Okb1I?@ zBj<p`83}?U7})~S!^rg@<xAz#Zvq)(<Sr23WwPe0ASNT<1)+C9xUF~zB*DlVAmfaj zcpCi7$XbwAHdZ%)SZw@!6yyL)H3Txl$frT(7<m}vAR|wM7$27F{0c}XBfkepFmm$g z@F61?g5((40#arq2{OjWD98jOp9Ps?<S~%e%jFvW0K{VCUqEt<ybUtK$m#Ee=UL7d zgG@2aHjsmi^nw_1x%9mthnePcAmdCk4Kl&V4?!jwIRrAp$e%!F8CiV>jvYn<Ae|fJ z`fLa3VWbZv$H*8+nUODmj4-kvWQ>u202yaw0c3)aWvdYr7+C`{%}4}fmXQR=JR>)P z7#rnw-40?h@*qeLBL_fojQkj6oRQZ+CKx&PeW)QLK9B`QE&*xVB-f`4q=%6r$XJ84 z@4O-yj#yE;FC^A%Mx9u62Z)gv-Sv@4%%pohjQHt34<ms^l?3T}6Vrr@<q8S6sU)&m zCDC;%u`HFu;+#ZHlde)prAJNwZj}UbDhbw95*krScw8lsNtHyWRANo5Bz8a{ese}8 ze!43nx56KoQ%UfkN<#B03DbQMmQQ3+B~iML#xxd97L3H`euzv0CVg9k5kEbz!$`oV zk{~@x%rqfOCE?8t($QP3;s_KQE^6RR0aaBtF`lD=2w|bIM|d<4-QLKjuCWp-iS1TM z(9EgCUsFk7OeMi_m4qf#624a@kx7+Ar&MC?Q%P)EAtCdCO8m1b2|TZo;6asyURFtX zUL}zQg@i+kDhX2;%e@?qw5cTOQ;B7&Bo<dl#7wBf-=mU1StY?Sm4qf#5}r~?WLhQB z8I@RbDv8Z2Bx)|I#BboV7tp{HIuxIy(LkF@f<BdmOqGP=Dv2ai675lmRaQxCOd*yz zp%VX;N&?d=3C^e_G^djAyh<XADv8p8Ec?f@+EfzrDI{i^D)Glv5=f{d*rSqASta2y zl|&{~5}i_sHLa4^3@4Up&Z)#duadx`N`eNimP-Dy%ut(3!akKmOqE3GnlH=8N~k2( zqY%GYR*8R1C4mW*1gBIInpR18MkSFsl|<)NVlAp9X5h-K+^&GxrV>BBzm#bLrb>cw zm4p&13HPWZQdUWHOeNNYN@7zA37XR?@z1CvFsG8>yh=igDhV67<}0^77->^U)Ta{5 zR7otZkdT>Z5SowgrnTs|<m+Q!2Jsz`$>SgiM*f~sG4d+N3?uJ?#D6X4v*t{Yf0Ky` zGJP7ptz$UX54V8K;nuWEt^+9tWs(J%*<`P=?bXK3l&V1}Vq0M=*uz?SC*_0hEV(&P zf=n~=2*{KrYn}v|X%LZf#2+d*avsbMrpu$`N!onIG6STVt=aoFsn#m#!LmYXrGiZ8 z^NT3U-Y6g1e(oW^_mGum*=g*u=<}H#((WN09%6aOb`R<CkRcEG3lEv{knecNa~|@N zhy2n*e&->})~McipNCvnC+<jyGR@YmWFl3}r|q1mFF?9-mC_!U(5H<^mB4Q|pB*4= zEi$>0<xHtYL1=wQsq9{!APo+7mwXk($H;d;5{&#K2+e42szV?qBCT7W!ypuqTyom` zaSaXkW?b??kT%>8aLGoHG9%Z6Byc6&)!alHTw`^~I0$_a$0ZMd#2NV?AY+U?3(|9* zoaz;j^7%6P6KU4T<edM2<NYF;Yy?S|GT8-E4$7oT<T9Du1JZ_TGH#v!hBVj6<R3tc z>tym95MNRztIkF$j2Abb^Fi9OGT8t!SCq*|LB?*DNeyKF7MXkoq~}(dJO<*sQzo+@ z=7das4l=>WF+RhX`K+ut17!MMnfO7BNts*;lK8w#dO@Zb879paWz9Iq^gfw<3B>oP zOlC>5UnVbr^n61m{|aJ0E|cGZl)o*LQ_g|MUXjUqkZCsWTn#ewx~xf)W>F@$fXuxq zlP`dnzmv&+kTFJPiQv&Hx8Gj`nPKFYAmuY;&F?^_89Dv~C=1`9ck@{bl2|K~PLTNv zWReB3Hz$&eddQs~avvkfWI8uctqt&e{*r0hx9`AlggT3;MILd89kpa)M=gi=k;;x* zbrPn0?5HKkmXUm|Jz~&W3#S<3AKuxG()%#O+N51*{E=^psO6^ehc0X5nn37(p6U=P zhn~ZF>RgA|`9wp05p8UWH)%oh2@y#g@@tT77dxpapFe;+-5_>8VdHxNM`M$ipYBb_ zb&gqEL?j_<Ya+4V{3ovQhms<0xEd?611kg98!OR*dp_-udOndA;^?+1p7e+2h5NZC z82#)6oLHev;;1BAue0^$w4<Sxo{xOKERF(K;|~vt@oekxElp@n@zFSRHNn^)KHw0_ zXDc-S2XAn2TX7A@r_PrNecx@37~yU{{=maxgga&RL$kO^Ug>=t#Mms8dqLt2(lO%R z0>@N{>rs1`+i$%4w_go>gz9E*k5N9@gvRJ7yQwe~kxE=UYr%8q_x-RcgyP5d>ZycA zkmo@t4?7=13m_-px2t&@B+;lLY0ha!tYf4TWQviSKrq0iobLl!-N?BEPuSLaF;uYO zU_qVHm129m{n|g-pOVnvAzWh$yFw%I0px@KrJP@^6SvN9f#9%^G^gOWF+p5S2S|u% zwu4;CH2FGl{c|TsC(}FxvYF-cU63xOc?o11q7|Ua@ekjY0hwXsz2^gOku_0}?SO9S zJ3)Ft+*TAp+E}W4L41sShf*<e2!v|r=G?m0FsL`&oG%3FW|~fr5vIw2WSHg-klUH& zt00uKTh>z`6HN0nkTR>`vUQl77+DK4!^jSh8q2v1g0LaA;vSGWmg>KQ%ro*lh;OUx z`NJT4S<YvC5O;i7&S8*ornv@WKhqRIsHLs=XZQPEATvz!Fo?-Ye-<Rp$ge@h7&-9* zvDlGvz7XU&mNPvI`4EU(dIsbm)7%2`DAUlBkB69M4usm}=JPhlBGa6Aq1`T5vjgNE zrWppAW%+ytq!n>$C8+J6$3W(o=I=mok}YW#K&TaNS;t+39%P#HKqi>Swu4MEQU#e} z<O?9vjC>E|03-CI;T$7v>v0Tr%H!t}ka<?aB*;aL8ak1U#>OiAv)g_fG(MKkBOvP- z`3Xpfk+(tOjGWtnh|S1$BHQE|?g4p|)$ofTxKvR0vs1${R>P;D>0$Z229jgsy;y6M z8QB1`$Vd@{`n|Q$_RoQAZj=seJOM)e?rL5INifZ^CWKeY?OG4g#>jOb2}W)KS;KOE z2&9|kJPWdpX<i4(G0o{%Aev0$2dOd5b`bKa+loBM7}MMVLTz_7{|)4Bra1tzooRjo zGRZXm8>EM|^i-_!a*V`4YK$a7#u&K+WP*`LiF`!%^9vwdtUiALd8knzXZ)1WL96i3 z9^q@S5}#uEYyjEENFT^FBX@z!Fft7?%g75L^NhR=;=4+&^SL3r2VFmJ1)28Lxrfy` z2aU<{xf{e{WEv#S$nzkbj2s5p&Bz*@PvjVhgOnM`f-LTkTX8qYUgr6~0{L4{D-x^~ zKZ0h0rK0EfW*ey>7EkTbh;scC#9hzlndUl>DW<s@WS(j0iM)MG^EAk7O!IRP<7&BG ztD>j@BPK|K5qkb^Kg;=Mki#tJFM`Z4%~K#NmN}7)TKWqRYP;LglPr|ZG+_{GyQ{ex zWDV2gKwf5=zW|}{ZLUNq_LzSJ<Pg(52SVS8b2YDlkbm5=PKaSdG0lY_Z!*mlAlsRy z7vvqL*$c9pY3>7Q1#!#zCP;>9ehNa~a5cXLDKpK9IA2`NG#7yEWty!ZJ*)@!faDmV zXY0z0{4bD2Mo#(=j%8NXWgz3MtN{@EZmL`7F_3$i=3Wr;ysP;-$Q09j7lgiZ<!W95 zd6a4X2(p=J-ghb12}~0Oq26)x*$MIt(-c9vnC32!Ii~p<NH^0w2l6u0EP_xEx@8@Y zD~0qdjXTE91ECAPD;gv7BOtAe+yv6b$o(Lz8F>O^9V7n=VllGv!x+7cTnv(6WEV)= zwQ_xK0V%Lnd<EpqMk|~-C5{%jbISLj8Dpt_1wsd(+xFux$9&2(Cddg)(*;7K#r5GQ zKvpx&*Fb2rxSFRy+L`8OAp4l+k02(~oQ@_;GffQSQl{w!p%LYlbqh!*(|ieJhH0J# z>0+8gAhS$kY`{^;G-rW4&omZDfoZxxXw<p&82}k!np;5*G0o>e=v(7%U(i!>uQAOJ zKqi>x6%ZdA8}ERuW8|!j7<G(X0upEB29QohMnDpbOoB}8l*i$>L1@&uEqxK>fkq9T zacCOyID7+|R%qN*XKcbqXrzMJxCCU1m6at8BNHIgjC==Vj*(x2OmxY0K7BJ*%gg1` zKMb-T#P+;XXCJF`A2d@epZ^Rp&B!-E78&_xkaeuA6*!-sX_Q4RT?az<9ai8M4A?e; zv@+5Sasng6AZ?7?12V_RUxCok<ofyhAoM&NZ)qFKbfd&8(9E-Zeh;$1$jLaXTV&)S zkn%3M727~Iv(i%_^rW0S!bd<7Omhziy-UE=JPfj%X`TUDWSXCW&~fUv^ba8KFwLn~ zAo{TyMnJ|HxdCK?k&lD4T`#xmD<C;m)-xcj=sxaM>PgqDhoEt`W#U<*P$U@M3&AnK z_R~io(J__8rWF$MFDN7&SX4;F?>nC790`~z3C2|tPN*cBQAw<zkf^`RNz}6F`({$R zqA_z)C4v1ai5}nt&*aRgB>0R<BG0MBI;ar8Nq0h}`dEIe^#o1=0iQ}DmO?_ooJy>5 zg@hxMDv2FbNW{OWk|2EpO|GG3(!E-V#Dbx9DzQQe3HjqH3FcH19%m#Ri20{E3HgJ@ zNpk7okU!L>lCV!9fncXXf`M^`L<0L%657v6EEGAQ5^F{wVRKF;fq9jL4ynX?O(79; zQ6<4QRT4R@lGuv($o`3#!B86~et)D#A)y$3<IC;SNH`d#OaF{SIys40A-exAX(Co+ zL?zZfg~ZHxPVhYTf=U9ulUdGDzdxapK#xj-WtD`-R1&>cC9ww-67WxP5{m@)sU$qB zlIVg;Vv7oi28>f!yJFGE3YElK6=DV3R1#jTl9*2+G5<Q1ghMKcS}KXf8A0dxH>)Jp zsStmtM<D@oL?wY~g+!yqsj@esW;Etgh!yHlNu;Kd=w6jrw<{!OO>p8jBU1|T2j*20 zI;@aDu<bNfXMZ5%Q%TrVNwixfu^xp41Ct5~#ilq3M1u!Z5;jg}^$A3yT`Gy~R*2=N zH_W(4ZZu#852+-&pc3n_N@A_=<@v<?K9vM5l|<qyv1*(I&A^C4{E-%{M~-W(Nuoi2 zbW+t=`xFu|aT35%1^jcWCNR%Q$O^Tc!P*tFB0Zc~!N3$Ju~?YCWh8ku7K<EKNwjsf ztg%dgz*I?STp<Dfj6#CJMU_P3@8da#qGg4I{c|b_uRD{ciUxaB65Xc|D?G1~sCgF8 zC+5$oBs{4SYnBtgX+F;h)&TRIgaT1>4J!-1Go})Yo@sOY!V1L#^C}7Y-mhpPWtCWC zoP<sPoJxX=Dv8p&n55Ff{y>jPBGW2~8E5lU0e?az(VR-G35A4X^9qRs>8(m~eIk)o zpF(1*6%q}aDhYS0B-*1AYob9qDz$X`wyXZ5fei~?JRv~mL3AA38y%apy;(m85gJ3J z>atT|IodSUs!owuJnMkBdr5EH!lJRBiWJYR>3_~JoU-Wd9Brgo#!_J^C8b(F)zj;y zvg)ZwW9LM7=bUYsk?bqfhN{_&OFHPWrbtKtEUu9Ah+}O0?nNG{zGQD<D4WDHy7^*% zRo&0l1WFCnN`3iSEn7+Ei}=}>N@tBaOb(VZLxpTIT}a`pP{?mjC0|2c$?9memL0Tt z*3KqV7)(~vm3+D8%2Sn8uLcely>Pf%^T6KJ;E)$)seGlN-l1H^1JkJiZ<W%iVpXH8 z<h?Klm#77$OK6`5mMa=KS}Ayxne1@N3#*#s*;>w9rT%QmTP45&PoDjSl-EoBrCQFb ztYkIGhi=pqG*t0+M=smzRSu*I-pUW;1~tmuptm~)iW#q$3aOH(?uAs%JCp#ugATCl zO`flM8#GuL^^TgsY^KkXe6XY$iG!n>Ru%_J-pUtCMI4*TKrR*1-rgux2E6@Ns`hJ= zR|mbGtCVuyu~1D7d3&RpOYQMgshTf(ORo+Uy$4(^HRv7kwbZcp;HYH_UeDM1H2$pR zQr@97oXUG)AwTHt_flol>yYYb!P_0Re6P2jIXo-xb%@kwQt-<lP$Slk%JEVJK)nG$ zP-~z-s56LQs5MYP)EX!#>I@<<>J12vdIJKa)<8j0YoI`>HBhkB8Yp0<18E$m+=*%1 zP)%zMrAh`dK$D`JPU*A4fX2bBNm0f3UG#>bUPLKfilMUJP|MeFC}>jXS}tY<t$}6+ zok7eFI)j)YnivMOS&5lKn}TKwt$}6?T}SoX25(0RgRY~5LDx~jpzA2xpy?>vpy{Z( z!P`;7pzA1M(6*eWMZE!2qs}0vN1Z`Tky-;ylT8fzgHueGx)d~J>N%!OT?dN!G#&7E zpfKn<P#AO_C=9v|v<;dLv<;dLtQ))?C=9v|6ow`(?``Iivfe;z1YK5QouD<)T0v`| z^@7$wYX+S`tQ)ijT07_rV*Q{s&>BK(pml`afVG6qAl4H)gIH5&4YaP%8fa~yHPHG( zXAo-)y#ebCt%24WS_7>&v<6yp=nP`rp)-iJht43@A3B3rgXj!m9ilUcwTR9jO*8g# z#0JIGpuLNuAz##<y3r|}Z5_<wBr#pZDPX?lrPXw*fRn<$WctQ|rWuh<%|>P{lN`=9 z-O@;AlT^7}7<EeO&(eY_g|mT5Cb=h{spZ6}W@cz`aI|SPY%9-SW{nb3bjCVV%vVyy z{`xYGPFEFzWf~{6K4U~I%s8PH87H(9V??aM6oSQ<La^%MgqB;J&^n6~T3~TP3n)g! zih~ncYA_<!7>tO;g-Ql^DzTj48d^tiLhA%hXkt|eW>iMRRLY2$Lph<zQzeR5#dOIu zG*2o36QoL%p@HM3tY~PeV5!6$!3j+coY1Vm2~7u#h<Sh$ngAFPk)IO^`J7O!R|tYU zBO<ypBEmW+6wf)KK+Xw8a7IMvRtRD?ClstXp(xD>g=a=YTxLWBWJW|JW<-QwMnvpo zL<C(%MA*Q&dvB_$_)?tgHL)O!=q(gZv=$Lo^cD&)dJBaatwn^JCKiO9CKiMry@kS% z-a_F>Z=tZHw@`S}T11%ATPR#<Eh21bEh2n1vkd5S6X8sshQgZOLg7tsp)l9Pf^es` zh_I)%i14SkP#A1xY0}#wENatGcx+-om~3Y0ZE7huu~7Kb<|e|Z-a_G2Z=tZNw@`T1 zT11%DTPWOWEh6mdEfjwB77D{nEC|P1iwMhFiwMtp3x#RDg~GMoLSb8L5#hUu1z}uo zp>VFZP*~SnD7<SeBFt+oBHU{&BJ67|BK&JDVj9p|#B`vw<cpbny6K|SwyLXRP8;iE z8}k*c%o;0L8#Y-b+w1xzjl2jufwBxQS4!n<r8b(R_rBl+ps|mPX}_AS4Cm8Xhv(}j zAT|}Nb*h1MW2rC6ZaCRz8xqRkNTZA;R4An~$^OD<IY%!m*-m>`ID0#@1^nfm<fdGz zGMFlp{R)&vyUA_EOm@T}JMhwPfeBnSRM?y!u7BE^7b1ZAr(MVpw^_PyUQq2TRR&3S z^-!&lM+gv^Z!C!v4iiE+FDnbRskaRFmI|3{arX_fl=8f~lFt@vI8Q4TMYU2m8yi6j zhT(gouZHug!DOmXD5ag9o7i3@%Xa%J*(?d2&MD-v$S9Ob14CuP=~AVL`8!|5t;JML zl(%zZG9Sb{x5+u#YBkj_`k-3EBwH?tZWNz!Dwe!yC{?WGKbCb)$m%ZNkQq)D>CPd> zL@tFflcbJMm(T(yHyig3;WQEzhQC}b!Aur6Dof(zPtKt*gj<ajNlW>n*9QsF%}NZ7 zQg5n&X)U|Q!$@2|>^wH%CN&dyC6n*Bhh-*Df7S_of_4m+hwK`sMj)||5)=p@_Yb1$ zD09V<&DdTPBe$NyIlY!yCEGaiIi_(>`O37K!e5zE7;d)p7n4*RI*ZP$^#bxPV(wCs zJ=xSi6M=JF+EGG|WX?c9t++9r%i?C1@TRDeZM9ujcc|k&j~z!F?t|IB^%$MR)MSq_ zldVxipugHR1lN);<f{;BrDPlRj?@~DiSDL*G8CPMR*LcHUdV9jD7V42dYb2&oP>?W zxuzyf;~o{a{8{2^5jR4_<rBvlP8s4RKC{?kiK>^)h#}=9u?>hQ`Mw6Hf-zGg^3uHy z`-pUED?|-vX@@8~c-<<A8)#D8$PeMBOfKIijxpL1vq_mMW{)TlnyA?>V&k*XZG3pL zj?;}z?#X&t%$GKEtBxq$@TP6k`cpP>kJ=XD*G3mo7@%<NT$!_XF|_R&xNdG7pSGE3 zea<95+0dyduBQ!Ti+GMhILx+X>vK~*+Tem=wNUa*`7GcX$!ohdVN%6WzO$A}59~@+ zsy5q(x^BezvAwr5H&n}%_7sg|@`|0Em_rKLibw@e&8CO&Ovxx-)kDD|jY%q>HQG1y zr}D*if7oc>R!v?{Q7J)@tvwpV_XsdMXY2bx>~AS%HkFFC(om&66fxRqrf=*=As@(> zv1llj+at(sGcDw=r%Q?Lp#a+rBdbmt&{x@)LfeCu(cV=VO^yWH1OEEQP<sHWuEUxC zC_V<|xw9QlB<;W@*LG8-@XKbzcolE0K)sp%mS6i&aSzsV?KJy3GjY3kZ3{<r89KBv zGuLG@az1M&YpIS$P&suzg3Q~7B@!4)Wi=ISxPr3LEF+{GbXLhhp2dbIsk9JrI>0Se zUXW;0I;$0LQnBu-uUb4wnbA|-#?nTcuGyl8_bQ93SfP+r>P?+l+l#7D>OGGMeq&5p zbuCdjMb)g5itNahl@c_oG?Td9z#1Wzhi*q`Y)uk2mXJ*nyLLAN?^4rE?6tw)%3`y= z%;4T`u91A*T%`51UM~5$iNITBn&6hKuOnz)Sx0d+H6?BHYT8z}KjbyHn0ejq@S60= zoOQiErDKI(<P0lWnya~6^mfTBdV$s{Ua900ol)O5aT=m;m~GN0^DYDRd1!P?WysHL zmda95E|sZ#F0@pZOsCIKtj+X!*d{lby#SP#uTuZ$jLnkT=ag=tJZ<BQlVj-wh!4Rd z%lu6i-(o#nZR8d>I$7}OWT7L<q@!fXHfRr)rYV-}6X^_+XCR+?HXLGlo1oQc{HxVz z9IVx8Jgn-P`c4%dh4bVjO})oN2#mJ-`01^4KCN@$5tNb(n=3tyZZ2J-+4@ADhBuR` z2eqx^7Y)=yTc>H_Lz?W|LsA-nygm)t5q#3n9koM5iX(WVuF<<fy%M5#hDYUQMwcm? zL|Ly%pG=Lga=N;WC$zn*tR|f6CH044q|*u4Vqfrg+o)R5&2r)LVZ;xUBdWw9azvGg zF-KI12(y$*8dgimw4<t70%=e+l_>6NI_b$7=tLf8=|mo1=|mn^=|p0(TcS=)+^J-B zL~ly^CeD-<I$w(GZOsRsNX|8SPjZdkkzAwqBiHEN$TeY_ls&F)XqNJHLv(bG7V@S1 zTo>?2;zTYHX2i8;9vn1wo&lZzs!!JOEVK%q37;*TiCJk(Gm$Q<W)mFsgq;sp)H{h6 z(U^_u7vq)|DP7qltEPRa(J$G4&!pxy%`;iq7XVrHJsO=CovXYwa_U#%dDrqv%QBvw zbl-qyARBlRr)=rQ0#B+F@GQJn%y|wPyDkIiy1FjCY<82AXV?u5H>ua;CUZKmska>i zPog=?Wqq!(yBWxjv{FQshMm`>Po^#_<aCW^4A^BaxA)|mG(6P*za$WG|0okkN9s|g z&>po%kydi$QK?<;y0@y_fg>?4tl!4sN(V|(@nDG)(Uq>Yp8(;;W=YlcDo^WKvD#)k zR%lC=O=_98O&wrzmUWw&P&@53jtV;it;WsBK5KMu3c3zfEr_lB3|+G{k<N}}H;Zpp zyXR11ARjR=&AGXzM9rDGM%C=nhgdH(j!3bPIbyvc-fIxNMCsUDDl_c?*DQf_lr@*A zz3Oy<ZsEgokrZks+VRsEV|F%Ljhc}?%AKGnPozq2&4v0b$@?Dv=#MwMy7G*ylr5Xo z(wwSmr)xWBokYz>GbJmP&?xko$n&x`4_TmQK^}6ZS|zb;(j}`V)nH{e-*&nuSk-T+ ztNmo(O1G(0ijD0%_EI!r*dtdi8rMq{l;W11n10#!4;qKO9k803?MT(sY=@|(W;-@D zHQPZ+XO<&~&aMv~s!~2Cyf%*uow4ga@8I#iSK>NX|44+^(MOQVPCtTF?ttb}uREJ- zmvXH>mDkNpbnun@Kq$Kj%>A^aOlr-NI&DjurjT0ETqCyt57acNv}_T5*~n0~h^|vD zy0+C5E!`Z5bS)q(R~i#llS<1LUg^3;SGBrn>8e4btD3;>L5N-H!C&{tQ@EQzdgNCL ztR9OtkrFYbL{8L{P_xLnv_$x^sYG&UQ;pWMTD9b2y&aG8)++P>Y#}?GEhvv(HC~V; z9@26i!D_q!DVd~ahT|bKY|0y+$g1-`8Jp}$E&Ca*RTuk1QNPdK{82w%Z)QazA(zo7 zym>1UiQsoMVA__RRhdsMHzse3^qq37{R&yUx2UBflkFYqZ{O*>!-!s;f48$!{~b5l zHg;61m2|u5cTBtSA%{07&D7t+L@$Ag<NvxY;OIK>0^1+fH4Y;ky@dD;{M$}&(<R-B zO6f*CL0awJfbXK_)8e7*YIhCKxo7uu<KePwrI;#o)6*ff(Q>xC)O%yKdn6L--b~f+ z?yKR6=MK#E;t!~-LzYw@-|~NY<?;0o9}fNIn78(R^k-}L4!!v2$L^UtdBgs;KfB~( z&-PvUApWQrbXP*W%V;?nAE_#M(5zDJ-ju84MQ!L|vF`09d>Oa9D?3>3E))lDj&6>H zHf-7uSic2-f_i-@8rrbl+7#QeJ`mfuIUEa`W_aVKk9XAYH(J*lm!8~;_Rmq~VmrxL zYrOGE!?-G+u9T{!zM5~{wIB3t+SPUKmYv4;jLS|o(t9%hA1>(~$`>-#ZhEGzw5QrV zoDP_N)5wlw>v{F#$v5BDd?8!yc8lJHum7Y9zMZw9Oup0|Fav?^O{Kv>eD|(4+P!O2 zcUP%YfPN=F`a>PTSVu4z_Q$$=^TqDYQnj`lJwUyX9<IUp9aNZSYY~5R3~#p^<E9qT zN2Z3a#Ncq=#zil7b~a+I__rLdd!`q0?J{;6N&MVmT#HZJ@V6^=V1FBaZl%9tf$fPE zum6e0!ifeA!DWr#mt&7c2yOHVLV5c#q%Fv=W>k#4Q8fCITONNdD~p_qMxRlF_!B~7 z;*XV?MhyQ##zyg{%&x@S8(WM`&<q-7BL)2^YLmjA?U*hjhfhA_Si$eC(FJ>1kOWA{ zxDlVz;tyz1>&`%4PT8AbslrBeDnpTnx+to>ReY);*K46E;*Wo28#VXg_{tl-*iYf# zsL*$y#csa4gt{u_7ce>uzY)Yw`ydYBb<-{QD+N@)j4>qYC$~v$3l$O&W$-j=NoqO! z(dR9wZx$X;!QbS?GU`k%?uXxM$oFBiG5}B0f9u7k0BY)kACJzjK4XvguLJ#P_du=Q z105)>f^s^L+Xj?gz;CzYs@S6*Am0w-X9h}YC;5iPMNL?WqUNr5)KbVd8!-x7Fh1?v zX@pU0oqnc0d$g!&JD{Szq-`_)wP1u$uR1B+(Mf-dkK$_=tTYCzNSR_|X5|X{)0+sx zv=Z;gXWsbayT-fk(vcOXNBBETlY*g5<Qbv`ba@NS5qy(p2RhQ0x6u5+W%A5G2let6 Rnj84meyu$L5)~R@{&yXbun7PF literal 0 HcmV?d00001 diff --git a/external/freetype/objs/freetype.lib.recipe b/external/freetype/objs/freetype.lib.recipe new file mode 100644 index 000000000..a53f9611d --- /dev/null +++ b/external/freetype/objs/freetype.lib.recipe @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project> + <ProjectOutputs /> + <ContentFiles /> + <SatelliteDlls /> + <NonRecipeFileRefs /> +</Project> \ No newline at end of file diff --git a/external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt b/external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt new file mode 100644 index 000000000..59995233d --- /dev/null +++ b/external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt @@ -0,0 +1 @@ +C:\Projects\Applications\trview\external\freetype\objs\x64\Debug\freetype.lib diff --git a/external/freetype/src/autofit/afblue.c b/external/freetype/src/autofit/afblue.c new file mode 100644 index 000000000..d7655b9b9 --- /dev/null +++ b/external/freetype/src/autofit/afblue.c @@ -0,0 +1,779 @@ +/* This file has been generated by the Perl script `afblue.pl', */ +/* using data from file `afblue.dat'. */ + +/**************************************************************************** + * + * afblue.c + * + * Auto-fitter data for blue strings (body). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "aftypes.h" + + + FT_LOCAL_ARRAY_DEF( char ) + af_blue_strings[] = + { + /* */ + '\xF0', '\x9E', '\xA4', '\x8C', ' ', '\xF0', '\x9E', '\xA4', '\x85', ' ', '\xF0', '\x9E', '\xA4', '\x88', ' ', '\xF0', '\x9E', '\xA4', '\x8F', ' ', '\xF0', '\x9E', '\xA4', '\x94', ' ', '\xF0', '\x9E', '\xA4', '\x9A', /* 𞤌 𞤅 𞤈 𞤠𞤔 𞤚 */ + '\0', + '\xF0', '\x9E', '\xA4', '\x82', ' ', '\xF0', '\x9E', '\xA4', '\x96', /* 𞤂 𞤖 */ + '\0', + '\xF0', '\x9E', '\xA4', '\xAC', ' ', '\xF0', '\x9E', '\xA4', '\xAE', ' ', '\xF0', '\x9E', '\xA4', '\xBB', ' ', '\xF0', '\x9E', '\xA4', '\xBC', ' ', '\xF0', '\x9E', '\xA4', '\xBE', /* 𞤬 𞤮 𞤻 𞤼 𞤾 */ + '\0', + '\xF0', '\x9E', '\xA4', '\xA4', ' ', '\xF0', '\x9E', '\xA4', '\xA8', ' ', '\xF0', '\x9E', '\xA4', '\xA9', ' ', '\xF0', '\x9E', '\xA4', '\xAD', ' ', '\xF0', '\x9E', '\xA4', '\xB4', ' ', '\xF0', '\x9E', '\xA4', '\xB8', ' ', '\xF0', '\x9E', '\xA4', '\xBA', ' ', '\xF0', '\x9E', '\xA5', '\x80', /* 𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀 */ + '\0', + '\xD8', '\xA7', ' ', '\xD8', '\xA5', ' ', '\xD9', '\x84', ' ', '\xD9', '\x83', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', /* ا Ø¥ Ù„ Ùƒ Ø· ظ */ + '\0', + '\xD8', '\xAA', ' ', '\xD8', '\xAB', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', ' ', '\xD9', '\x83', /* ت Ø« Ø· ظ Ùƒ */ + '\0', + '\xD9', '\x80', /* Ù€ */ + '\0', + '\xD4', '\xB1', ' ', '\xD5', '\x84', ' ', '\xD5', '\x92', ' ', '\xD5', '\x8D', ' ', '\xD4', '\xB2', ' ', '\xD4', '\xB3', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x95', /* Ô± Õ„ Õ’ Õ Ô² Ô³ Ô´ Õ• */ + '\0', + '\xD5', '\x92', ' ', '\xD5', '\x88', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x83', ' ', '\xD5', '\x87', ' ', '\xD5', '\x8D', ' ', '\xD5', '\x8F', ' ', '\xD5', '\x95', /* Õ’ Õˆ Ô´ Õƒ Õ‡ Õ Õ Õ• */ + '\0', + '\xD5', '\xA5', ' ', '\xD5', '\xA7', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xB4', ' ', '\xD5', '\xBE', ' ', '\xD6', '\x86', ' ', '\xD5', '\xB3', /* Õ¥ Õ§ Õ« Õ´ Õ¾ Ö† Õ³ */ + '\0', + '\xD5', '\xA1', ' ', '\xD5', '\xB5', ' ', '\xD6', '\x82', ' ', '\xD5', '\xBD', ' ', '\xD5', '\xA3', ' ', '\xD5', '\xB7', ' ', '\xD6', '\x80', ' ', '\xD6', '\x85', /* Õ¡ Õµ Ö‚ Õ½ Õ£ Õ· Ö€ Ö… */ + '\0', + '\xD5', '\xB0', ' ', '\xD5', '\xB8', ' ', '\xD5', '\xB3', ' ', '\xD5', '\xA1', ' ', '\xD5', '\xA5', ' ', '\xD5', '\xAE', ' ', '\xD5', '\xBD', ' ', '\xD6', '\x85', /* Õ° Õ¸ Õ³ Õ¡ Õ¥ Õ® Õ½ Ö… */ + '\0', + '\xD5', '\xA2', ' ', '\xD5', '\xA8', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xAC', ' ', '\xD5', '\xB2', ' ', '\xD5', '\xBA', ' ', '\xD6', '\x83', ' ', '\xD6', '\x81', /* Õ¢ Õ¨ Õ« Õ¬ Õ² Õº Öƒ Ö */ + '\0', + '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', ' ', '\xF0', '\x90', '\xAC', '\x90', ' ', '\xF0', '\x90', '\xAC', '\x9B', /* 𬀠ð¬ ð¬ 𬛠*/ + '\0', + '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', /* 𬀠ð¬ */ + '\0', + '\xEA', '\x9A', '\xA7', ' ', '\xEA', '\x9A', '\xA8', ' ', '\xEA', '\x9B', '\x9B', ' ', '\xEA', '\x9B', '\x89', ' ', '\xEA', '\x9B', '\x81', ' ', '\xEA', '\x9B', '\x88', ' ', '\xEA', '\x9B', '\xAB', ' ', '\xEA', '\x9B', '\xAF', /* ꚧ ꚨ ê›› ꛉ ê› ê›ˆ ꛫ ꛯ */ + '\0', + '\xEA', '\x9A', '\xAD', ' ', '\xEA', '\x9A', '\xB3', ' ', '\xEA', '\x9A', '\xB6', ' ', '\xEA', '\x9B', '\xAC', ' ', '\xEA', '\x9A', '\xA2', ' ', '\xEA', '\x9A', '\xBD', ' ', '\xEA', '\x9B', '\xAF', ' ', '\xEA', '\x9B', '\xB2', /* êš­ êš³ ꚶ ꛬ ꚢ êš½ ꛯ ꛲ */ + '\0', + '\xE0', '\xA6', '\x85', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xAD', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* অ ড ত ন ব ভ ল ক */ + '\0', + '\xE0', '\xA6', '\x87', ' ', '\xE0', '\xA6', '\x9F', ' ', '\xE0', '\xA6', '\xA0', ' ', '\xE0', '\xA6', '\xBF', ' ', '\xE0', '\xA7', '\x80', ' ', '\xE0', '\xA7', '\x88', ' ', '\xE0', '\xA7', '\x97', /* ই ট ঠ ি ী ৈ ৗ */ + '\0', + '\xE0', '\xA6', '\x93', ' ', '\xE0', '\xA6', '\x8F', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* ও ঠড ত ন ব ল ক */ + '\0', + '\xE1', '\x9D', '\x90', ' ', '\xE1', '\x9D', '\x88', /* á ሠ*/ + '\0', + '\xE1', '\x9D', '\x85', ' ', '\xE1', '\x9D', '\x8A', ' ', '\xE1', '\x9D', '\x8E', /* á… áŠ áŽ */ + '\0', + '\xE1', '\x9D', '\x82', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8C', /* Ⴀრበጠ*/ + '\0', + '\xE1', '\x9D', '\x80', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x86', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8B', ' ', '\xE1', '\x9D', '\x8F', ' ', '\xE1', '\x9D', '\x91', /* ဠრᆠበዠá á‘ */ + '\0', + '\xE1', '\x97', '\x9C', ' ', '\xE1', '\x96', '\xB4', ' ', '\xE1', '\x90', '\x81', ' ', '\xE1', '\x92', '\xA3', ' ', '\xE1', '\x91', '\xAB', ' ', '\xE1', '\x91', '\x8E', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xB0', /* á—œ á–´ á á’£ á‘« á‘Ž ᔑ á—° */ + '\0', + '\xE1', '\x97', '\xB6', ' ', '\xE1', '\x96', '\xB5', ' ', '\xE1', '\x92', '\xA7', ' ', '\xE1', '\x90', '\x83', ' ', '\xE1', '\x91', '\x8C', ' ', '\xE1', '\x92', '\x8D', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xA2', /* á—¶ á–µ á’§ რᑌ ᒠᔑ á—¢ */ + '\0', + '\xE1', '\x93', '\x93', ' ', '\xE1', '\x93', '\x95', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x84', ' ', '\xE1', '\x95', '\x84', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* á““ á“• á“€ á“‚ á“„ á•„ ᕆ ᘣ */ + '\0', + '\xE1', '\x95', '\x83', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x95', '\x82', ' ', '\xE1', '\x93', '\x97', ' ', '\xE1', '\x93', '\x9A', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* ᕃ á“‚ á“€ á•‚ á“— á“š ᕆ ᘣ */ + '\0', + '\xE1', '\x90', '\xAA', ' ', '\xE1', '\x99', '\x86', ' ', '\xE1', '\xA3', '\x98', ' ', '\xE1', '\x90', '\xA2', ' ', '\xE1', '\x92', '\xBE', ' ', '\xE1', '\xA3', '\x97', ' ', '\xE1', '\x94', '\x86', /* ᪠ᙆ ᣘ ᢠᒾ ᣗ ᔆ */ + '\0', + '\xE1', '\x99', '\x86', ' ', '\xE1', '\x97', '\xAE', ' ', '\xE1', '\x92', '\xBB', ' ', '\xE1', '\x90', '\x9E', ' ', '\xE1', '\x94', '\x86', ' ', '\xE1', '\x92', '\xA1', ' ', '\xE1', '\x92', '\xA2', ' ', '\xE1', '\x93', '\x91', /* ᙆ á—® á’» ហᔆ á’¡ á’¢ á“‘ */ + '\0', + '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xAC', ' ', '\xF0', '\x90', '\x8A', '\xAD', ' ', '\xF0', '\x90', '\x8A', '\xB1', ' ', '\xF0', '\x90', '\x8A', '\xBA', ' ', '\xF0', '\x90', '\x8A', '\xBC', ' ', '\xF0', '\x90', '\x8A', '\xBF', /* ðŠ§ ðŠ« ðŠ¬ ðŠ­ ðŠ± ðŠº ðŠ¼ ðŠ¿ */ + '\0', + '\xF0', '\x90', '\x8A', '\xA3', ' ', '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xB7', ' ', '\xF0', '\x90', '\x8B', '\x80', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xB8', ' ', '\xF0', '\x90', '\x8B', '\x89', /* ðŠ£ ðŠ§ ðŠ· ð‹€ ðŠ« ðŠ¸ ð‹‰ */ + '\0', + '\xF0', '\x91', '\x84', '\x83', ' ', '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x89', ' ', '\xF0', '\x91', '\x84', '\x99', ' ', '\xF0', '\x91', '\x84', '\x97', /* 𑄃 ð‘„… 𑄉 ð‘„™ ð‘„— */ + '\0', + '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x9B', ' ', '\xF0', '\x91', '\x84', '\x9D', ' ', '\xF0', '\x91', '\x84', '\x97', ' ', '\xF0', '\x91', '\x84', '\x93', /* ð‘„… ð‘„› ð‘„ ð‘„— ð‘„“ */ + '\0', + '\xF0', '\x91', '\x84', '\x96', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x98', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x99', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA4', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA5', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', /* 𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢 */ + '\0', + '\xE1', '\x8F', '\x86', ' ', '\xE1', '\x8E', '\xBB', ' ', '\xE1', '\x8E', '\xAC', ' ', '\xE1', '\x8F', '\x83', ' ', '\xE1', '\x8E', '\xA4', ' ', '\xE1', '\x8F', '\xA3', ' ', '\xE1', '\x8E', '\xA6', ' ', '\xE1', '\x8F', '\x95', /* ᆠᎻ Ꭼ რᎤ ᣠᎦ á• */ + '\0', + '\xEA', '\xAE', '\x92', ' ', '\xEA', '\xAE', '\xA4', ' ', '\xEA', '\xAE', '\xB6', ' ', '\xEA', '\xAD', '\xB4', ' ', '\xEA', '\xAD', '\xBE', ' ', '\xEA', '\xAE', '\x97', ' ', '\xEA', '\xAE', '\x9D', ' ', '\xEA', '\xAE', '\xBF', /* ê®’ ꮤ ꮶ ê­´ ê­¾ ê®— ê® ê®¿ */ + '\0', + '\xEA', '\xAE', '\x96', ' ', '\xEA', '\xAD', '\xBC', ' ', '\xEA', '\xAE', '\x93', ' ', '\xEA', '\xAE', '\xA0', ' ', '\xEA', '\xAE', '\xB3', ' ', '\xEA', '\xAD', '\xB6', ' ', '\xEA', '\xAE', '\xA5', ' ', '\xEA', '\xAE', '\xBB', /* ê®– ê­¼ ꮓ ê®  ꮳ ê­¶ ꮥ ê®» */ + '\0', + '\xE1', '\x8F', '\xB8', ' ', '\xEA', '\xAE', '\x90', ' ', '\xEA', '\xAD', '\xB9', ' ', '\xEA', '\xAD', '\xBB', /* á¸ ê® ê­¹ ê­» */ + '\0', + '\xE2', '\xB2', '\x8C', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\xA0', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB2', '\xA4', ' ', '\xE2', '\xB3', '\x8A', /* Ⲍ Ⲏ â²  Ⳟ Ⲟ ⲠⲤ Ⳋ */ + '\0', + '\xE2', '\xB3', '\x90', ' ', '\xE2', '\xB3', '\x98', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB3', '\x9C', ' ', '\xE2', '\xB2', '\xB0', /* ⳠⳘ Ⳟ Ⲏ Ⲟ ⲠⳜ â²° */ + '\0', + '\xE2', '\xB2', '\x8D', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\xA1', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB2', '\xA5', ' ', '\xE2', '\xB3', '\x8B', /* ⲠⲠⲡ ⳟ ⲟ ⲑ â²¥ ⳋ */ + '\0', + '\xE2', '\xB3', '\x91', ' ', '\xE2', '\xB3', '\x99', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB3', '\x9D', ' ', '\xE2', '\xB3', '\x92', /* ⳑ â³™ ⳟ Ⲡⲟ ⲑ â³ â³’ */ + '\0', + '\xF0', '\x90', '\xA0', '\x8D', ' ', '\xF0', '\x90', '\xA0', '\x99', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB1', ' ', '\xF0', '\x90', '\xA0', '\x85', ' ', '\xF0', '\x90', '\xA0', '\x93', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xA6', /* ð  ð ™ ð ³ ð ± ð … ð “ ð £ ð ¦ */ + '\0', + '\xF0', '\x90', '\xA0', '\x83', ' ', '\xF0', '\x90', '\xA0', '\x8A', ' ', '\xF0', '\x90', '\xA0', '\x9B', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB5', ' ', '\xF0', '\x90', '\xA0', '\x90', /* ð ƒ ð Š ð › ð £ ð ³ ð µ ð  */ + '\0', + '\xF0', '\x90', '\xA0', '\x88', ' ', '\xF0', '\x90', '\xA0', '\x8F', ' ', '\xF0', '\x90', '\xA0', '\x96', /* ð ˆ ð  ð – */ + '\0', + '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\x9F', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б Ð’ Е П З О С Э */ + '\0', + '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\xA8', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б Ð’ Е Ш З О С Э */ + '\0', + '\xD1', '\x85', ' ', '\xD0', '\xBF', ' ', '\xD0', '\xBD', ' ', '\xD1', '\x88', ' ', '\xD0', '\xB5', ' ', '\xD0', '\xB7', ' ', '\xD0', '\xBE', ' ', '\xD1', '\x81', /* Ñ… п н ш е з о Ñ */ + '\0', + '\xD1', '\x80', ' ', '\xD1', '\x83', ' ', '\xD1', '\x84', /* Ñ€ у Ñ„ */ + '\0', + '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x8B', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x91', /* ð‚ ð„ ð‹ ð— ð‘ */ + '\0', + '\xF0', '\x90', '\x90', '\x80', ' ', '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x9B', /* ð€ ð‚ ð„ ð— ð› */ + '\0', + '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xB3', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x90', '\xB9', /* ðª ð¬ ð³ ð¿ ð¹ */ + '\0', + '\xF0', '\x90', '\x90', '\xA8', ' ', '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x91', '\x83', /* ð¨ ðª ð¬ ð¿ 𑃠*/ + '\0', + '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xA8', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x89', ' ', '\xE0', '\xA4', '\x9B', ' ', '\xE0', '\xA4', '\x9F', ' ', '\xE0', '\xA4', '\xA0', ' ', '\xE0', '\xA4', '\xA1', /* क न म उ छ ट ठ ड */ + '\0', + '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C', /* ई ठओ औ ि ी ो ौ */ + '\0', + '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ + '\0', + '\xE0', '\xA5', '\x81', ' ', '\xE0', '\xA5', '\x83', /* ॠृ */ + '\0', + '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\x83', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x8D', '\x90', ' ', '\xE1', '\x88', '\x9B', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x8B', ' ', '\xE1', '\x8B', '\x90', /* ሀ ሃ ዘ á ማ በ á‹‹ á‹ */ + '\0', + '\xE1', '\x88', '\x88', ' ', '\xE1', '\x88', '\x90', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\xAA', ' ', '\xE1', '\x8B', '\x90', ' ', '\xE1', '\x8C', '\xA8', /* ለ ሠበ ዘ ሀ ሪ ዠጨ */ + '\0', + '\xE1', '\x83', '\x92', ' ', '\xE1', '\x83', '\x93', ' ', '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x97', ' ', '\xE1', '\x83', '\x98', ' ', '\xE1', '\x83', '\x9D', ' ', '\xE1', '\x83', '\xA6', /* გ დ ე ვ თ ი რღ */ + '\0', + '\xE1', '\x83', '\x90', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xAB', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\x9E', /* რზ მ ს შ ძ ხ პ */ + '\0', + '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xA9', ' ', '\xE1', '\x83', '\xAC', /* ს ხ ქ ზ მ შ ჩ წ */ + '\0', + '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x9F', ' ', '\xE1', '\x83', '\xA2', ' ', '\xE1', '\x83', '\xA3', ' ', '\xE1', '\x83', '\xA4', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\xA7', /* ე ვ ჟ ტ უ ფ ქ ყ */ + '\0', + '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xB9', ' ', '\xE1', '\x82', '\xBC', ' ', '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xB3', ' ', '\xE1', '\x82', '\xBA', /* Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ á‚¥ Ⴓ Ⴚ */ + '\0', + '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xA8', ' ', '\xE1', '\x82', '\xA6', ' ', '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xAA', ' ', '\xE1', '\x82', '\xAB', /* Ⴄ á‚¥ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ á‚« */ + '\0', + '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x97', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x87', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x96', /* â´ â´— â´‚ â´„ â´… â´‡ â´” â´– */ + '\0', + '\xE2', '\xB4', '\x88', ' ', '\xE2', '\xB4', '\x8C', ' ', '\xE2', '\xB4', '\x96', ' ', '\xE2', '\xB4', '\x8E', ' ', '\xE2', '\xB4', '\x83', ' ', '\xE2', '\xB4', '\x86', ' ', '\xE2', '\xB4', '\x8B', ' ', '\xE2', '\xB4', '\xA2', /* â´ˆ â´Œ â´– â´Ž â´ƒ â´† â´‹ â´¢ */ + '\0', + '\xE2', '\xB4', '\x90', ' ', '\xE2', '\xB4', '\x91', ' ', '\xE2', '\xB4', '\x93', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x99', ' ', '\xE2', '\xB4', '\x9B', ' ', '\xE2', '\xB4', '\xA1', ' ', '\xE2', '\xB4', '\xA3', /* â´ â´‘ â´“ â´• â´™ â´› â´¡ â´£ */ + '\0', + '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x98', ' ', '\xE2', '\xB4', '\x9D', /* â´„ â´… â´” â´• â´ â´‚ â´˜ â´ */ + '\0', + '\xE1', '\xB2', '\x9C', ' ', '\xE1', '\xB2', '\x9F', ' ', '\xE1', '\xB2', '\xB3', ' ', '\xE1', '\xB2', '\xB8', ' ', '\xE1', '\xB2', '\x92', ' ', '\xE1', '\xB2', '\x94', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xB4', /* Ნ Ჟ á²³ Ჸ á²’ á²” á² á²´ */ + '\0', + '\xE1', '\xB2', '\x98', ' ', '\xE1', '\xB2', '\xB2', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xA9', ' ', '\xE1', '\xB2', '\x9B', ' ', '\xE1', '\xB2', '\xA8', ' ', '\xE1', '\xB2', '\xAF', ' ', '\xE1', '\xB2', '\xBD', /* Ი á²² ᲠᲩ á²› Შ Ჯ á²½ */ + '\0', + '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x94', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\xAB', ' ', '\xE2', '\xB0', '\x8B', /* â°… â°” â°ª â°„ â°‚ â°Š â°« â°‹ */ + '\0', + '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x9E', ' ', '\xE2', '\xB0', '\xA1', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\x94', /* â°… â°„ â°‚ â°ª â°ž â°¡ â°Š â°” */ + '\0', + '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB1', '\x84', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x9B', ' ', '\xE2', '\xB0', '\xBB', /* â°µ ⱄ ⱚ â°´ â°² â°º â±› â°» */ + '\0', + '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB1', '\x8E', ' ', '\xE2', '\xB1', '\x91', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x84', /* â°µ â°´ â°² ⱚ ⱎ ⱑ â°º ⱄ */ + '\0', + '\xF0', '\x90', '\x8C', '\xB2', ' ', '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8D', '\x80', ' ', '\xF0', '\x90', '\x8D', '\x84', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', ' ', '\xF0', '\x90', '\x8C', '\xBE', /* ðŒ² ðŒ¶ ð€ ð„ ðŒ´ ðƒ ðˆ ðŒ¾ */ + '\0', + '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', /* ðŒ¶ ðŒ´ ðƒ ðˆ */ + '\0', + '\xCE', '\x93', ' ', '\xCE', '\x92', ' ', '\xCE', '\x95', ' ', '\xCE', '\x96', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', ' ', '\xCE', '\xA9', /* Γ Î’ Ε Ζ Θ Ο Ω */ + '\0', + '\xCE', '\x92', ' ', '\xCE', '\x94', ' ', '\xCE', '\x96', ' ', '\xCE', '\x9E', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', /* Î’ Δ Ζ Ξ Θ Ο */ + '\0', + '\xCE', '\xB2', ' ', '\xCE', '\xB8', ' ', '\xCE', '\xB4', ' ', '\xCE', '\xB6', ' ', '\xCE', '\xBB', ' ', '\xCE', '\xBE', /* β θ δ ζ λ ξ */ + '\0', + '\xCE', '\xB1', ' ', '\xCE', '\xB5', ' ', '\xCE', '\xB9', ' ', '\xCE', '\xBF', ' ', '\xCF', '\x80', ' ', '\xCF', '\x83', ' ', '\xCF', '\x84', ' ', '\xCF', '\x89', /* α ε ι ο Ï€ σ Ï„ ω */ + '\0', + '\xCE', '\xB2', ' ', '\xCE', '\xB3', ' ', '\xCE', '\xB7', ' ', '\xCE', '\xBC', ' ', '\xCF', '\x81', ' ', '\xCF', '\x86', ' ', '\xCF', '\x87', ' ', '\xCF', '\x88', /* β γ η μ Ï Ï† χ ψ */ + '\0', + '\xE0', '\xAA', '\xA4', ' ', '\xE0', '\xAA', '\xA8', ' ', '\xE0', '\xAA', '\x8B', ' ', '\xE0', '\xAA', '\x8C', ' ', '\xE0', '\xAA', '\x9B', ' ', '\xE0', '\xAA', '\x9F', ' ', '\xE0', '\xAA', '\xB0', ' ', '\xE0', '\xAB', '\xA6', /* ત ન ઋ ઌ છ ટ ર ૦ */ + '\0', + '\xE0', '\xAA', '\x96', ' ', '\xE0', '\xAA', '\x97', ' ', '\xE0', '\xAA', '\x98', ' ', '\xE0', '\xAA', '\x9E', ' ', '\xE0', '\xAA', '\x87', ' ', '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\xA0', ' ', '\xE0', '\xAA', '\x9C', /* ખ ગ ઘ ઞ ઇ ઈ ઠ જ */ + '\0', + '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\x8A', ' ', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB2', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB6', '\xE0', '\xAB', '\x8D', '\xE0', '\xAA', '\x9A', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\x9C', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\xB8', '\xE0', '\xAB', '\x80', /* ઈ ઊ િ à«€ લી શà«àªšàª¿ જિ સી */ + '\0', + '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAB', '\x84', ' ', '\xE0', '\xAA', '\x96', '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x84', /* ૠૃ à«„ ખૠછૃ છૄ */ + '\0', + '\xE0', '\xAB', '\xA6', ' ', '\xE0', '\xAB', '\xA7', ' ', '\xE0', '\xAB', '\xA8', ' ', '\xE0', '\xAB', '\xA9', ' ', '\xE0', '\xAB', '\xAD', /* ૦ ૧ ૨ à«© à«­ */ + '\0', + '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8', /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */ + '\0', + '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8', /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */ + '\0', + '\xE0', '\xA8', '\x87', ' ', '\xE0', '\xA8', '\x88', ' ', '\xE0', '\xA8', '\x89', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA9', '\xB3', ' ', '\xE0', '\xA8', '\xBF', ' ', '\xE0', '\xA9', '\x80', /* ਇ ਈ ਉ ਠਓ ੳ ਿ à©€ */ + '\0', + '\xE0', '\xA8', '\x85', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA0', ' ', '\xE0', '\xA8', '\xB0', ' ', '\xE0', '\xA8', '\xB8', /* ਅ ਠਓ ਗ ਜ ਠ ਰ ਸ */ + '\0', + '\xE0', '\xA9', '\xA6', ' ', '\xE0', '\xA9', '\xA7', ' ', '\xE0', '\xA9', '\xA8', ' ', '\xE0', '\xA9', '\xA9', ' ', '\xE0', '\xA9', '\xAD', /* ੦ ੧ ੨ à©© à©­ */ + '\0', + '\xD7', '\x91', ' ', '\xD7', '\x93', ' ', '\xD7', '\x94', ' ', '\xD7', '\x97', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', /* ב ד ×” ×— ך ×› × ×¡ */ + '\0', + '\xD7', '\x91', ' ', '\xD7', '\x98', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', ' ', '\xD7', '\xA6', /* ב ט ×› × ×¡ צ */ + '\0', + '\xD7', '\xA7', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9F', ' ', '\xD7', '\xA3', ' ', '\xD7', '\xA5', /* ק ך ן ×£ ×¥ */ + '\0', + '\xE0', '\xB2', '\x87', ' ', '\xE0', '\xB2', '\x8A', ' ', '\xE0', '\xB2', '\x90', ' ', '\xE0', '\xB2', '\xA3', ' ', '\xE0', '\xB2', '\xB8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA6', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xB0', '\xE0', '\xB2', '\xBE', /* ಇ ಊ ಠಣ ಸಾ ನಾ ದಾ ರಾ */ + '\0', + '\xE0', '\xB2', '\x85', ' ', '\xE0', '\xB2', '\x89', ' ', '\xE0', '\xB2', '\x8E', ' ', '\xE0', '\xB2', '\xB2', ' ', '\xE0', '\xB3', '\xA6', ' ', '\xE0', '\xB3', '\xA8', ' ', '\xE0', '\xB3', '\xAC', ' ', '\xE0', '\xB3', '\xAD', /* ಅ ಉ ಎ ಲ ೦ ೨ ೬ à³­ */ + '\0', + '\xEA', '\xA4', '\x85', ' ', '\xEA', '\xA4', '\x8F', ' ', '\xEA', '\xA4', '\x81', ' ', '\xEA', '\xA4', '\x8B', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', /* ꤅ ê¤ ê¤ ê¤‹ ꤀ ê¤ */ + '\0', + '\xEA', '\xA4', '\x88', ' ', '\xEA', '\xA4', '\x98', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', ' ', '\xEA', '\xA4', '\xA2', /* ꤈ ꤘ ꤀ ê¤ ê¤¢ */ + '\0', + '\xEA', '\xA4', '\x96', ' ', '\xEA', '\xA4', '\xA1', /* ꤖ ꤡ */ + '\0', + '\xEA', '\xA4', '\x91', ' ', '\xEA', '\xA4', '\x9C', ' ', '\xEA', '\xA4', '\x9E', /* ꤑ ꤜ ꤞ */ + '\0', + '\xEA', '\xA4', '\x91', '\xEA', '\xA4', '\xAC', ' ', '\xEA', '\xA4', '\x9C', '\xEA', '\xA4', '\xAD', ' ', '\xEA', '\xA4', '\x94', '\xEA', '\xA4', '\xAC', /* ꤑ꤬ ꤜ꤭ ꤔ꤬ */ + '\0', + '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x91', ' ', '\xE1', '\x9E', '\x93', ' ', '\xE1', '\x9E', '\xA7', ' ', '\xE1', '\x9E', '\xA9', ' ', '\xE1', '\x9E', '\xB6', /* áž áž‘ áž“ ឧ áž© ា */ + '\0', + '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x80', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x82', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x90', /* ក្ក ក្ហក្គ ក្ហ*/ + '\0', + '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x83', ' ', '\xE1', '\x9E', '\x85', ' ', '\xE1', '\x9E', '\x8B', ' ', '\xE1', '\x9E', '\x94', ' ', '\xE1', '\x9E', '\x98', ' ', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xB2', /* ហឃ áž… áž‹ áž” ម áž™ áž² */ + '\0', + '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', ' ', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\xB2', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xA2', '\xE1', '\x9E', '\xBF', /* ážáŸ’ážš រៀ ឲ្យ អឿ */ + '\0', + '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x83', ' ', '\xE1', '\x9E', '\x84', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x85', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9E', '\xBF', ' ', '\xE1', '\x9E', '\x9B', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9E', '\xBF', /* ន្ážáŸ’រៃ ង្ážáŸ’áž™ ក្បៀ ច្រៀ ន្ážáž¿ ល្បឿ */ + '\0', + '\xE1', '\xA7', '\xA0', ' ', '\xE1', '\xA7', '\xA1', /* ᧠ ᧡ */ + '\0', + '\xE1', '\xA7', '\xB6', ' ', '\xE1', '\xA7', '\xB9', /* ᧶ ᧹ */ + '\0', + '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\x94', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\xA1', ' ', '\xE0', '\xBA', '\xA5', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\x87', /* າ ດ ອ ມ ລ ວ ຣ ງ */ + '\0', + '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\x9A', ' ', '\xE0', '\xBA', '\x8D', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\xAE', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA2', /* າ ອ ບ ຠຣ ຮ ວ ຢ */ + '\0', + '\xE0', '\xBA', '\x9B', ' ', '\xE0', '\xBA', '\xA2', ' ', '\xE0', '\xBA', '\x9F', ' ', '\xE0', '\xBA', '\x9D', /* ປ ຢ ຟ ຠ*/ + '\0', + '\xE0', '\xBB', '\x82', ' ', '\xE0', '\xBB', '\x84', ' ', '\xE0', '\xBB', '\x83', /* ໂ ໄ ໃ */ + '\0', + '\xE0', '\xBA', '\x87', ' ', '\xE0', '\xBA', '\x8A', ' ', '\xE0', '\xBA', '\x96', ' ', '\xE0', '\xBA', '\xBD', ' ', '\xE0', '\xBB', '\x86', ' ', '\xE0', '\xBA', '\xAF', /* ງ ຊ ຖ ຽ ໆ ຯ */ + '\0', + 'T', ' ', 'H', ' ', 'E', ' ', 'Z', ' ', 'O', ' ', 'C', ' ', 'Q', ' ', 'S', /* T H E Z O C Q S */ + '\0', + 'H', ' ', 'E', ' ', 'Z', ' ', 'L', ' ', 'O', ' ', 'C', ' ', 'U', ' ', 'S', /* H E Z L O C U S */ + '\0', + 'f', ' ', 'i', ' ', 'j', ' ', 'k', ' ', 'd', ' ', 'b', ' ', 'h', /* f i j k d b h */ + '\0', + 'u', ' ', 'v', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* u v x z o e s c */ + '\0', + 'n', ' ', 'r', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* n r x z o e s c */ + '\0', + 'p', ' ', 'q', ' ', 'g', ' ', 'j', ' ', 'y', /* p q g j y */ + '\0', + '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x85', ' ', '\xE2', '\x82', '\x87', ' ', '\xE2', '\x82', '\x88', /* â‚€ ₃ â‚… ₇ ₈ */ + '\0', + '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x81', ' ', '\xE2', '\x82', '\x82', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x88', /* â‚€ â‚ â‚‚ ₃ ₈ */ + '\0', + '\xE1', '\xB5', '\xA2', ' ', '\xE2', '\xB1', '\xBC', ' ', '\xE2', '\x82', '\x95', ' ', '\xE2', '\x82', '\x96', ' ', '\xE2', '\x82', '\x97', /* áµ¢ â±¼ â‚• â‚– â‚— */ + '\0', + '\xE2', '\x82', '\x90', ' ', '\xE2', '\x82', '\x91', ' ', '\xE2', '\x82', '\x92', ' ', '\xE2', '\x82', '\x93', ' ', '\xE2', '\x82', '\x99', ' ', '\xE2', '\x82', '\x9B', ' ', '\xE1', '\xB5', '\xA5', ' ', '\xE1', '\xB5', '\xA4', ' ', '\xE1', '\xB5', '\xA3', /* â‚ â‚‘ â‚’ â‚“ â‚™ â‚› áµ¥ ᵤ áµ£ */ + '\0', + '\xE1', '\xB5', '\xA6', ' ', '\xE1', '\xB5', '\xA7', ' ', '\xE1', '\xB5', '\xA8', ' ', '\xE1', '\xB5', '\xA9', ' ', '\xE2', '\x82', '\x9A', /* ᵦ ᵧ ᵨ ᵩ â‚š */ + '\0', + '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB3', ' ', '\xE2', '\x81', '\xB5', ' ', '\xE2', '\x81', '\xB7', ' ', '\xE1', '\xB5', '\x80', ' ', '\xE1', '\xB4', '\xB4', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xBC', /* Ⱐ³ âµ â· áµ€ á´´ á´± á´¼ */ + '\0', + '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB9', ' ', '\xC2', '\xB2', ' ', '\xC2', '\xB3', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xB8', ' ', '\xE1', '\xB4', '\xBC', ' ', '\xE1', '\xB5', '\x81', /* Ⱐ¹ ² ³ á´± á´¸ á´¼ áµ */ + '\0', + '\xE1', '\xB5', '\x87', ' ', '\xE1', '\xB5', '\x88', ' ', '\xE1', '\xB5', '\x8F', ' ', '\xCA', '\xB0', ' ', '\xCA', '\xB2', ' ', '\xE1', '\xB6', '\xA0', ' ', '\xE2', '\x81', '\xB1', /* ᵇ ᵈ áµ Ê° ʲ ᶠ â± */ + '\0', + '\xE1', '\xB5', '\x89', ' ', '\xE1', '\xB5', '\x92', ' ', '\xCA', '\xB3', ' ', '\xCB', '\xA2', ' ', '\xCB', '\xA3', ' ', '\xE1', '\xB6', '\x9C', ' ', '\xE1', '\xB6', '\xBB', /* ᵉ áµ’ ʳ Ë¢ Ë£ ᶜ ᶻ */ + '\0', + '\xE1', '\xB5', '\x96', ' ', '\xCA', '\xB8', ' ', '\xE1', '\xB5', '\x8D', /* áµ– ʸ áµ */ + '\0', + '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\xA7', ' ', '\xEA', '\x93', '\xB1', ' ', '\xEA', '\x93', '\xB6', ' ', '\xEA', '\x93', '\xA9', ' ', '\xEA', '\x93', '\x9A', ' ', '\xEA', '\x93', '\xB5', ' ', '\xEA', '\x93', '\xB3', /* ê“¡ ꓧ ꓱ ꓶ ê“© ê“š ꓵ ꓳ */ + '\0', + '\xEA', '\x93', '\x95', ' ', '\xEA', '\x93', '\x9C', ' ', '\xEA', '\x93', '\x9E', ' ', '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\x9B', ' ', '\xEA', '\x93', '\xA2', ' ', '\xEA', '\x93', '\xB3', ' ', '\xEA', '\x93', '\xB4', /* ê“• ê“œ ê“ž ê“¡ ê“› ê“¢ ꓳ ê“´ */ + '\0', + '\xE0', '\xB4', '\x92', ' ', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xB1', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', ' ', '\xE0', '\xB4', '\x9A', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\xAA', /* à´’ à´Ÿ à´  à´± à´š à´ª à´šàµà´š à´ªàµà´ª */ + '\0', + '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2', /* à´Ÿ à´  à´§ à´¶ à´˜ à´š à´¥ à´² */ + '\0', + '\xF0', '\x96', '\xB9', '\x80', ' ', '\xF0', '\x96', '\xB9', '\x81', ' ', '\xF0', '\x96', '\xB9', '\x82', ' ', '\xF0', '\x96', '\xB9', '\x83', ' ', '\xF0', '\x96', '\xB9', '\x8F', ' ', '\xF0', '\x96', '\xB9', '\x9A', ' ', '\xF0', '\x96', '\xB9', '\x9F', /* ð–¹€ 𖹠𖹂 𖹃 𖹠𖹚 𖹟 */ + '\0', + '\xF0', '\x96', '\xB9', '\x80', ' ', '\xF0', '\x96', '\xB9', '\x81', ' ', '\xF0', '\x96', '\xB9', '\x82', ' ', '\xF0', '\x96', '\xB9', '\x83', ' ', '\xF0', '\x96', '\xB9', '\x8F', ' ', '\xF0', '\x96', '\xB9', '\x9A', ' ', '\xF0', '\x96', '\xB9', '\x92', ' ', '\xF0', '\x96', '\xB9', '\x93', /* ð–¹€ 𖹠𖹂 𖹃 𖹠𖹚 ð–¹’ 𖹓 */ + '\0', + '\xF0', '\x96', '\xB9', '\xA4', ' ', '\xF0', '\x96', '\xB9', '\xAC', ' ', '\xF0', '\x96', '\xB9', '\xA7', ' ', '\xF0', '\x96', '\xB9', '\xB4', ' ', '\xF0', '\x96', '\xB9', '\xB6', ' ', '\xF0', '\x96', '\xB9', '\xBE', /* 𖹤 𖹬 𖹧 ð–¹´ 𖹶 ð–¹¾ */ + '\0', + '\xF0', '\x96', '\xB9', '\xA0', ' ', '\xF0', '\x96', '\xB9', '\xA1', ' ', '\xF0', '\x96', '\xB9', '\xA2', ' ', '\xF0', '\x96', '\xB9', '\xB9', ' ', '\xF0', '\x96', '\xB9', '\xB3', ' ', '\xF0', '\x96', '\xB9', '\xAE', /* ð–¹  𖹡 ð–¹¢ ð–¹¹ ð–¹³ ð–¹® */ + '\0', + '\xF0', '\x96', '\xB9', '\xA0', ' ', '\xF0', '\x96', '\xB9', '\xA1', ' ', '\xF0', '\x96', '\xB9', '\xA2', ' ', '\xF0', '\x96', '\xB9', '\xB3', ' ', '\xF0', '\x96', '\xB9', '\xAD', ' ', '\xF0', '\x96', '\xB9', '\xBD', /* ð–¹  𖹡 ð–¹¢ ð–¹³ ð–¹­ ð–¹½ */ + '\0', + '\xF0', '\x96', '\xB9', '\xA5', ' ', '\xF0', '\x96', '\xB9', '\xA8', ' ', '\xF0', '\x96', '\xB9', '\xA9', /* ð–¹¥ 𖹨 𖹩 */ + '\0', + '\xF0', '\x96', '\xBA', '\x80', ' ', '\xF0', '\x96', '\xBA', '\x85', ' ', '\xF0', '\x96', '\xBA', '\x88', ' ', '\xF0', '\x96', '\xBA', '\x84', ' ', '\xF0', '\x96', '\xBA', '\x8D', /* 𖺀 ð–º… 𖺈 𖺄 ð–º */ + '\0', + '\xE1', '\xA0', '\xB3', ' ', '\xE1', '\xA0', '\xB4', ' ', '\xE1', '\xA0', '\xB6', ' ', '\xE1', '\xA0', '\xBD', ' ', '\xE1', '\xA1', '\x82', ' ', '\xE1', '\xA1', '\x8A', ' ', '\xE2', '\x80', '\x8D', '\xE1', '\xA1', '\xA1', '\xE2', '\x80', '\x8D', ' ', '\xE2', '\x80', '\x8D', '\xE1', '\xA1', '\xB3', '\xE2', '\x80', '\x8D', /* á ³ á ´ á ¶ á ½ á¡‚ á¡Š â€á¡¡â€ â€á¡³â€ */ + '\0', + '\xE1', '\xA1', '\x83', /* ᡃ */ + '\0', + '\xE1', '\x80', '\x81', ' ', '\xE1', '\x80', '\x82', ' ', '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\xA5', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* ဠဂ င ဒ ဠᥠአዠ*/ + '\0', + '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x8E', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x95', ' ', '\xE1', '\x80', '\x97', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* င ဎ ဒ ပ ဗ ဠአዠ*/ + '\0', + '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xBC', ' ', '\xE1', '\x81', '\x8D', ' ', '\xE1', '\x81', '\x8F', ' ', '\xE1', '\x81', '\x86', ' ', '\xE1', '\x80', '\xAB', ' ', '\xE1', '\x80', '\xAD', /* ဩ ြ á á ᆠါ ိ */ + '\0', + '\xE1', '\x80', '\x89', ' ', '\xE1', '\x80', '\x8A', ' ', '\xE1', '\x80', '\xA5', ' ', '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xA8', ' ', '\xE1', '\x81', '\x82', ' ', '\xE1', '\x81', '\x85', ' ', '\xE1', '\x81', '\x89', /* ဉ ည ဥ ဩ ဨ á‚ á… á‰ */ + '\0', + '\xDF', '\x90', ' ', '\xDF', '\x89', ' ', '\xDF', '\x92', ' ', '\xDF', '\x9F', ' ', '\xDF', '\x96', ' ', '\xDF', '\x9C', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ß ß‰ ß’ ߟ ß– ßœ ß  ߥ */ + '\0', + '\xDF', '\x80', ' ', '\xDF', '\x98', ' ', '\xDF', '\xA1', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ߀ ߘ ß¡ ß  ߥ */ + '\0', + '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ß ß› ß‹ */ + '\0', + '\xDF', '\x8E', ' ', '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ߎ ß ß› ß‹ */ + '\0', + '\xE1', '\xB1', '\x9B', ' ', '\xE1', '\xB1', '\x9C', ' ', '\xE1', '\xB1', '\x9D', ' ', '\xE1', '\xB1', '\xA1', ' ', '\xE1', '\xB1', '\xA2', ' ', '\xE1', '\xB1', '\xA5', /* á±› ᱜ ᱠᱡ á±¢ á±¥ */ + '\0', + '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\x98', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* ð°— ð°˜ ð°§ */ + '\0', + '\xF0', '\x90', '\xB0', '\x89', ' ', '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\xA6', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* ð°‰ ð°— ð°¦ ð°§ */ + '\0', + '\xF0', '\x90', '\x92', '\xBE', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x92', ' ', '\xF0', '\x90', '\x93', '\x93', ' ', '\xF0', '\x90', '\x92', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xB5', ' ', '\xF0', '\x90', '\x93', '\x86', /* ð’¾ ð“ 𓒠𓓠𒻠𓂠𒵠𓆠*/ + '\0', + '\xF0', '\x90', '\x92', '\xB0', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xBF', ' ', '\xF0', '\x90', '\x93', '\x8E', ' ', '\xF0', '\x90', '\x92', '\xB9', /* ð’° ð“ ð“‚ ð’¿ ð“Ž ð’¹ */ + '\0', + '\xF0', '\x90', '\x92', '\xBC', ' ', '\xF0', '\x90', '\x92', '\xBD', ' ', '\xF0', '\x90', '\x92', '\xBE', /* ð’¼ ð’½ ð’¾ */ + '\0', + '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xB6', ' ', '\xF0', '\x90', '\x93', '\xBA', ' ', '\xF0', '\x90', '\x93', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x9D', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xAE', /* 𓵠𓶠𓺠𓻠ð“ 𓣠𓪠𓮠*/ + '\0', + '\xF0', '\x90', '\x93', '\x98', ' ', '\xF0', '\x90', '\x93', '\x9A', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xA1', ' ', '\xF0', '\x90', '\x93', '\xA7', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xB6', /* 𓘠𓚠𓣠𓵠𓡠𓧠𓪠𓶠*/ + '\0', + '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA6', ' ', '\xF0', '\x90', '\x93', '\xB8', ' ', '\xF0', '\x90', '\x93', '\xB9', ' ', '\xF0', '\x90', '\x93', '\x9B', /* 𓤠𓦠𓸠𓹠𓛠*/ + '\0', + '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA5', ' ', '\xF0', '\x90', '\x93', '\xA6', /* 𓤠𓥠𓦠*/ + '\0', + '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x89', ' ', '\xF0', '\x90', '\x92', '\x90', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\x98', ' ', '\xF0', '\x90', '\x92', '\x9B', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA3', /* ð’† ð’‰ ð’ ð’’ ð’˜ ð’› ð’  ð’£ */ + '\0', + '\xF0', '\x90', '\x92', '\x80', ' ', '\xF0', '\x90', '\x92', '\x82', ' ', '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x88', ' ', '\xF0', '\x90', '\x92', '\x8A', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA9', /* ð’€ ð’‚ ð’† ð’ˆ ð’Š ð’’ ð’  ð’© */ + '\0', + '\xF0', '\x90', '\xB4', '\x83', ' ', '\xF0', '\x90', '\xB4', '\x80', ' ', '\xF0', '\x90', '\xB4', '\x86', ' ', '\xF0', '\x90', '\xB4', '\x96', ' ', '\xF0', '\x90', '\xB4', '\x95', /* ð´ƒ ð´€ ð´† ð´– ð´• */ + '\0', + '\xF0', '\x90', '\xB4', '\x94', ' ', '\xF0', '\x90', '\xB4', '\x96', ' ', '\xF0', '\x90', '\xB4', '\x95', ' ', '\xF0', '\x90', '\xB4', '\x91', ' ', '\xF0', '\x90', '\xB4', '\x90', /* ð´” ð´– ð´• ð´‘ ð´ */ + '\0', + '\xD9', '\x80', /* Ù€ */ + '\0', + '\xEA', '\xA2', '\x9C', ' ', '\xEA', '\xA2', '\x9E', ' ', '\xEA', '\xA2', '\xB3', ' ', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\x96', ' ', '\xEA', '\xA2', '\x92', ' ', '\xEA', '\xA2', '\x9D', ' ', '\xEA', '\xA2', '\x9B', /* ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ê¢ ê¢› */ + '\0', + '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\xA8', ' ', '\xEA', '\xA2', '\xBA', ' ', '\xEA', '\xA2', '\xA4', ' ', '\xEA', '\xA2', '\x8E', /* ꢂ ꢨ ꢺ ꢤ ꢎ */ + '\0', + '\xF0', '\x90', '\x91', '\x95', ' ', '\xF0', '\x90', '\x91', '\x99', /* ð‘• ð‘™ */ + '\0', + '\xF0', '\x90', '\x91', '\x94', ' ', '\xF0', '\x90', '\x91', '\x96', ' ', '\xF0', '\x90', '\x91', '\x97', ' ', '\xF0', '\x90', '\x91', '\xB9', ' ', '\xF0', '\x90', '\x91', '\xBB', /* 𑔠𑖠𑗠𑹠𑻠*/ + '\0', + '\xF0', '\x90', '\x91', '\x9F', ' ', '\xF0', '\x90', '\x91', '\xA3', /* ð‘Ÿ ð‘£ */ + '\0', + '\xF0', '\x90', '\x91', '\xB1', ' ', '\xF0', '\x90', '\x91', '\xB2', ' ', '\xF0', '\x90', '\x91', '\xB3', ' ', '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xB8', ' ', '\xF0', '\x90', '\x91', '\xBA', ' ', '\xF0', '\x90', '\x91', '\xBC', /* 𑱠𑲠𑳠𑴠𑸠𑺠𑼠*/ + '\0', + '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xBB', ' ', '\xF0', '\x90', '\x91', '\xB9', /* 𑴠𑻠𑹠*/ + '\0', + '\xE0', '\xB6', '\x89', ' ', '\xE0', '\xB6', '\x9A', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\xB4', ' ', '\xE0', '\xB6', '\xBA', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB7', '\x86', /* ඉ ක චඳ ප ය ල à·† */ + '\0', + '\xE0', '\xB6', '\x91', ' ', '\xE0', '\xB6', '\x94', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xA2', ' ', '\xE0', '\xB6', '\xA7', ' ', '\xE0', '\xB6', '\xAE', ' ', '\xE0', '\xB6', '\xB0', ' ', '\xE0', '\xB6', '\xBB', /* එ ඔ චජ ට ථ ධ ර */ + '\0', + '\xE0', '\xB6', '\xAF', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\x8B', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x96', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xB6', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xAF', '\xE0', '\xB7', '\x94', /* ද ඳ උ ල තූ තු බු දු */ + '\0', + '\xE1', '\xAE', '\x8B', ' ', '\xE1', '\xAE', '\x9E', ' ', '\xE1', '\xAE', '\xAE', ' ', '\xE1', '\xAE', '\xBD', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x88', /* ᮋ ᮞ á®® ᮽ á®° ᮈ */ + '\0', + '\xE1', '\xAE', '\x84', ' ', '\xE1', '\xAE', '\x94', ' ', '\xE1', '\xAE', '\x95', ' ', '\xE1', '\xAE', '\x97', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x86', ' ', '\xE1', '\xAE', '\x88', ' ', '\xE1', '\xAE', '\x89', /* ᮄ á®” ᮕ á®— á®° ᮆ ᮈ ᮉ */ + '\0', + '\xE1', '\xAE', '\xBC', ' ', '\xE1', '\xB3', '\x84', /* ᮼ ᳄ */ + '\0', + '\xEA', '\xAA', '\x86', ' ', '\xEA', '\xAA', '\x94', ' ', '\xEA', '\xAA', '\x92', ' ', '\xEA', '\xAA', '\x96', ' ', '\xEA', '\xAA', '\xAB', /* ꪆ ꪔ ꪒ ꪖ ꪫ */ + '\0', + '\xEA', '\xAA', '\x89', ' ', '\xEA', '\xAA', '\xAB', ' ', '\xEA', '\xAA', '\xAE', /* ꪉ ꪫ ꪮ */ + '\0', + '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x92', ' ', '\xE0', '\xAE', '\x93', ' ', '\xE0', '\xAE', '\xB1', ' ', '\xE0', '\xAE', '\x88', ' ', '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9A', /* உ à®’ ஓ à®± ஈ க à®™ ச */ + '\0', + '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x9A', ' ', '\xE0', '\xAE', '\xB2', ' ', '\xE0', '\xAE', '\xB6', ' ', '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9F', ' ', '\xE0', '\xAE', '\xAA', /* க ச ல ஶ உ à®™ ட ப */ + '\0', + '\xE0', '\xB0', '\x87', ' ', '\xE0', '\xB0', '\x8C', ' ', '\xE0', '\xB0', '\x99', ' ', '\xE0', '\xB0', '\x9E', ' ', '\xE0', '\xB0', '\xA3', ' ', '\xE0', '\xB0', '\xB1', ' ', '\xE0', '\xB1', '\xAF', /* à°‡ à°Œ à°™ à°ž à°£ à°± ౯ */ + '\0', + '\xE0', '\xB0', '\x85', ' ', '\xE0', '\xB0', '\x95', ' ', '\xE0', '\xB0', '\x9A', ' ', '\xE0', '\xB0', '\xB0', ' ', '\xE0', '\xB0', '\xBD', ' ', '\xE0', '\xB1', '\xA8', ' ', '\xE0', '\xB1', '\xAC', /* à°… à°• à°š à°° à°½ ౨ ౬ */ + '\0', + '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB9', '\x80', ' ', '\xE0', '\xB9', '\x81', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\x81', ' ', '\xE0', '\xB8', '\xB2', /* บ เ ๠อ ภา */ + '\0', + '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\xA9', ' ', '\xE0', '\xB8', '\xAF', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\xA2', ' ', '\xE0', '\xB8', '\xAE', /* บ ป ษ ฯ อ ย ฮ */ + '\0', + '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\x9D', ' ', '\xE0', '\xB8', '\x9F', /* ป ภฟ */ + '\0', + '\xE0', '\xB9', '\x82', ' ', '\xE0', '\xB9', '\x83', ' ', '\xE0', '\xB9', '\x84', /* โ ใ ไ */ + '\0', + '\xE0', '\xB8', '\x8E', ' ', '\xE0', '\xB8', '\x8F', ' ', '\xE0', '\xB8', '\xA4', ' ', '\xE0', '\xB8', '\xA6', /* ฎ ภฤ ฦ */ + '\0', + '\xE0', '\xB8', '\x8D', ' ', '\xE0', '\xB8', '\x90', /* ภภ*/ + '\0', + '\xE0', '\xB9', '\x90', ' ', '\xE0', '\xB9', '\x91', ' ', '\xE0', '\xB9', '\x93', /* ๠๑ ๓ */ + '\0', + '\xE2', '\xB5', '\x94', ' ', '\xE2', '\xB5', '\x99', ' ', '\xE2', '\xB5', '\x9B', ' ', '\xE2', '\xB5', '\x9E', ' ', '\xE2', '\xB4', '\xB5', ' ', '\xE2', '\xB4', '\xBC', ' ', '\xE2', '\xB4', '\xB9', ' ', '\xE2', '\xB5', '\x8E', /* âµ” âµ™ âµ› ⵞ â´µ â´¼ â´¹ ⵎ */ + '\0', + '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x98', '\x9C', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x96', '\x9D', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', /* ê— ê˜– ꘙ ꘜ ê–œ ê– ê”… ê•¢ */ + '\0', + '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x97', '\x9E', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x94', '\x86', /* ê— ê˜– ꘙ ê—ž ê”… ê•¢ ê–œ ꔆ */ +#ifdef AF_CONFIG_OPTION_CJK + '\0', + '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* ä»– 们 ä½  來 們 到 å’Œ 地 */ + ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB8', '\xAD', ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x83', /* 对 å° å°± 席 我 æ—¶ 時 會 */ + ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\x88', '\xB0', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* æ¥ ç‚º 能 舰 說 说 è¿™ 這 */ + ' ', '\xE9', '\xBD', '\x8A', ' ', '|', /* 齊 | */ + ' ', '\xE5', '\x86', '\x9B', ' ', '\xE5', '\x90', '\x8C', ' ', '\xE5', '\xB7', '\xB2', ' ', '\xE6', '\x84', '\xBF', ' ', '\xE6', '\x97', '\xA2', ' ', '\xE6', '\x98', '\x9F', ' ', '\xE6', '\x98', '\xAF', ' ', '\xE6', '\x99', '\xAF', /* 军 åŒ å·² æ„¿ æ—¢ 星 是 景 */ + ' ', '\xE6', '\xB0', '\x91', ' ', '\xE7', '\x85', '\xA7', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\xA8', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\xA6', '\x81', /* æ°‘ ç…§ 现 ç¾ ç† ç”¨ ç½® è¦ */ + ' ', '\xE8', '\xBB', '\x8D', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x85', '\x8D', ' ', '\xE9', '\x87', '\x8C', ' ', '\xE9', '\x96', '\x8B', ' ', '\xE9', '\x9B', '\xB7', ' ', '\xE9', '\x9C', '\xB2', ' ', '\xE9', '\x9D', '\xA2', /* è» é‚£ é… é‡Œ é–‹ é›· 露 é¢ */ + ' ', '\xE9', '\xA1', '\xBE', /* 顾 */ + '\0', + '\xE4', '\xB8', '\xAA', ' ', '\xE4', '\xB8', '\xBA', ' ', '\xE4', '\xBA', '\xBA', ' ', '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xA5', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', /* 个 为 人 ä»– 以 们 ä½  來 */ + ' ', '\xE5', '\x80', '\x8B', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\xA4', '\xA7', ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', /* 個 們 到 å’Œ 大 对 å° å°± */ + ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x89', ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\xA6', '\x81', ' ', '\xE8', '\xAA', '\xAA', /* 我 æ—¶ 時 有 æ¥ ç‚º è¦ èªª */ + ' ', '\xE8', '\xAF', '\xB4', ' ', '|', /* 说 | */ + ' ', '\xE4', '\xB8', '\xBB', ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE5', '\x9B', '\xA0', ' ', '\xE5', '\xAE', '\x83', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x84', '\x8F', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\x9F', /* 主 些 å›  它 想 æ„ ç† ç”Ÿ */ + ' ', '\xE7', '\x95', '\xB6', ' ', '\xE7', '\x9C', '\x8B', ' ', '\xE7', '\x9D', '\x80', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\x80', '\x85', ' ', '\xE8', '\x87', '\xAA', ' ', '\xE8', '\x91', '\x97', ' ', '\xE8', '\xA3', '\xA1', /* 當 看 ç€ ç½® 者 自 è‘— 裡 */ + ' ', '\xE8', '\xBF', '\x87', ' ', '\xE8', '\xBF', '\x98', ' ', '\xE8', '\xBF', '\x9B', ' ', '\xE9', '\x80', '\xB2', ' ', '\xE9', '\x81', '\x8E', ' ', '\xE9', '\x81', '\x93', ' ', '\xE9', '\x82', '\x84', ' ', '\xE9', '\x87', '\x8C', /* 过 还 è¿› 進 éŽ é“ é‚„ 里 */ + ' ', '\xE9', '\x9D', '\xA2', /* é¢ */ +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + '\0', + ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 些 们 ä½  來 們 到 å’Œ 地 */ + ' ', '\xE5', '\xA5', '\xB9', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB9', '\xB4', ' ', '\xE5', '\xBE', '\x97', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x9C', '\x80', /* 她 å°† å°‡ å°± å¹´ å¾— 情 最 */ + ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE7', '\x90', '\x86', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* æ · 樣 ç† èƒ½ 說 说 è¿™ 這 */ + ' ', '\xE9', '\x80', '\x9A', ' ', '|', /* 通 | */ + ' ', '\xE5', '\x8D', '\xB3', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x90', '\xA7', ' ', '\xE5', '\x90', '\xAC', ' ', '\xE5', '\x91', '\xA2', ' ', '\xE5', '\x93', '\x81', ' ', '\xE5', '\x93', '\x8D', ' ', '\xE5', '\x97', '\x8E', /* å³ å— å§ å¬ å‘¢ å“ å“ å—Ž */ + ' ', '\xE5', '\xB8', '\x88', ' ', '\xE5', '\xB8', '\xAB', ' ', '\xE6', '\x94', '\xB6', ' ', '\xE6', '\x96', '\xAD', ' ', '\xE6', '\x96', '\xB7', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE7', '\x9C', '\xBC', ' ', '\xE9', '\x96', '\x93', /* 师 師 收 æ–­ æ–· 明 眼 é–“ */ + ' ', '\xE9', '\x97', '\xB4', ' ', '\xE9', '\x99', '\x85', ' ', '\xE9', '\x99', '\x88', ' ', '\xE9', '\x99', '\x90', ' ', '\xE9', '\x99', '\xA4', ' ', '\xE9', '\x99', '\xB3', ' ', '\xE9', '\x9A', '\x8F', ' ', '\xE9', '\x9A', '\x9B', /* é—´ é™… 陈 é™ é™¤ 陳 éš éš› */ + ' ', '\xE9', '\x9A', '\xA8', /* 隨 */ + '\0', + '\xE4', '\xBA', '\x8B', ' ', '\xE5', '\x89', '\x8D', ' ', '\xE5', '\xAD', '\xB8', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x88', '\x96', /* 事 å‰ å­¸ å°† å°‡ 情 想 或 */ + ' ', '\xE6', '\x94', '\xBF', ' ', '\xE6', '\x96', '\xAF', ' ', '\xE6', '\x96', '\xB0', ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE6', '\xB0', '\x91', ' ', '\xE6', '\xB2', '\x92', ' ', '\xE6', '\xB2', '\xA1', /* 政 æ–¯ æ–° æ · 樣 æ°‘ æ²’ 没 */ + ' ', '\xE7', '\x84', '\xB6', ' ', '\xE7', '\x89', '\xB9', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x83', ' ', '\xE7', '\xAC', '\xAC', ' ', '\xE7', '\xB6', '\x93', ' ', '\xE8', '\xB0', '\x81', /* 然 特 现 ç¾ çƒ ç¬¬ 經 è° */ + ' ', '\xE8', '\xB5', '\xB7', ' ', '|', /* èµ· | */ + ' ', '\xE4', '\xBE', '\x8B', ' ', '\xE5', '\x88', '\xA5', ' ', '\xE5', '\x88', '\xAB', ' ', '\xE5', '\x88', '\xB6', ' ', '\xE5', '\x8A', '\xA8', ' ', '\xE5', '\x8B', '\x95', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x97', '\x8E', /* 例 別 别 制 动 å‹• å— å—Ž */ + ' ', '\xE5', '\xA2', '\x9E', ' ', '\xE6', '\x8C', '\x87', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE6', '\x9C', '\x9D', ' ', '\xE6', '\x9C', '\x9F', ' ', '\xE6', '\x9E', '\x84', ' ', '\xE7', '\x89', '\xA9', ' ', '\xE7', '\xA1', '\xAE', /* 增 指 明 æœ æœŸ æž„ 物 ç¡® */ + ' ', '\xE7', '\xA7', '\x8D', ' ', '\xE8', '\xAA', '\xBF', ' ', '\xE8', '\xB0', '\x83', ' ', '\xE8', '\xB2', '\xBB', ' ', '\xE8', '\xB4', '\xB9', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x83', '\xBD', ' ', '\xE9', '\x96', '\x93', /* ç§ èª¿ è°ƒ è²» è´¹ é‚£ 都 é–“ */ + ' ', '\xE9', '\x97', '\xB4', /* é—´ */ +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ +#endif /* AF_CONFIG_OPTION_CJK */ + '\0', + + }; + + + /* stringsets are specific to styles */ + FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) + af_blue_stringsets[] = + { + /* */ + { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ARABIC_BOTTOM, 0 }, + { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BAMUM_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_BENGALI_BASE, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_BUHID_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 }, + { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CARIAN_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 }, + { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CHEROKEE_SMALL, 0 }, + { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 }, + { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYPRIOT_SMALL, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CYRILLIC_SMALL, 0 }, + { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_DEVANAGARI_BASE, 0 }, + { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 }, + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GREEK_SMALL, 0 }, + { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 }, + { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 }, + { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 }, + { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_LONG }, + { AF_BLUE_STRING_HEBREW_BOTTOM, 0 }, + { AF_BLUE_STRING_HEBREW_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_KANNADA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 }, + { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 }, + { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP }, + { AF_BLUE_STRING_KHMER_BOTTOM, 0 }, + { AF_BLUE_STRING_KHMER_DESCENDER, 0 }, + { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LAO_BOTTOM, 0 }, + { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LAO_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LISU_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 }, + { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_NKO_BOTTOM, 0 }, + { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OL_CHIKI, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 }, + { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ROHINGYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ROHINGYA_BOTTOM, 0 }, + { AF_BLUE_STRING_ROHINGYA_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 }, + { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 }, + { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SINHALA_BOTTOM, 0 }, + { AF_BLUE_STRING_SINHALA_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 }, + { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TAMIL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TELUGU_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_THAI_BOTTOM, 0 }, + { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_THAI_DESCENDER, 0 }, + { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TIFINAGH, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_VAI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, +#ifdef AF_CONFIG_OPTION_CJK + { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP }, + { AF_BLUE_STRING_CJK_BOTTOM, 0 }, +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ }, + { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | + AF_BLUE_PROPERTY_CJK_RIGHT }, +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + { AF_BLUE_STRING_MAX, 0 }, +#endif /* AF_CONFIG_OPTION_CJK */ + + }; + + +/* END */ diff --git a/external/freetype/src/autofit/afblue.cin b/external/freetype/src/autofit/afblue.cin new file mode 100644 index 000000000..d561c5093 --- /dev/null +++ b/external/freetype/src/autofit/afblue.cin @@ -0,0 +1,39 @@ +/**************************************************************************** + * + * afblue.c + * + * Auto-fitter data for blue strings (body). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "aftypes.h" + + + FT_LOCAL_ARRAY_DEF( char ) + af_blue_strings[] = + { + /* */ +@AF_BLUE_STRINGS_ARRAY@ + }; + + + /* stringsets are specific to styles */ + FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) + af_blue_stringsets[] = + { + /* */ +@AF_BLUE_STRINGSETS_ARRAY@ + }; + + +/* END */ diff --git a/external/freetype/src/autofit/afblue.dat b/external/freetype/src/autofit/afblue.dat new file mode 100644 index 000000000..8299baa25 --- /dev/null +++ b/external/freetype/src/autofit/afblue.dat @@ -0,0 +1,1121 @@ +// afblue.dat +// +// Auto-fitter data for blue strings. +// +// Copyright (C) 2013-2023 by +// David Turner, Robert Wilhelm, and Werner Lemberg. +// +// This file is part of the FreeType project, and may only be used, +// modified, and distributed under the terms of the FreeType project +// license, LICENSE.TXT. By continuing to use, modify, or distribute +// this file you indicate that you have read the license and +// understand and accept it fully. + + +// This file contains data specific to blue zones. It gets processed by +// a script to simulate `jagged arrays', with enumeration values holding +// offsets into the arrays. +// +// The format of the file is rather simple: A section starts with three +// labels separated by whitespace and followed by a colon (everything in a +// single line); the first label gives the name of the enumeration template, +// the second the name of the array template, and the third the name of the +// `maximum' template. The script then fills the corresponding templates +// (indicated by `@' characters around the name). +// +// A section contains one or more data records. Each data record consists +// of two or more lines. The first line holds the enumeration name, and the +// remaining lines the corresponding array data. +// +// There are two possible representations for array data. +// +// - A string of characters or character clusters (for example, representing +// Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double +// quotes, using C syntax, where the elements are separated by spaces. +// There can be only one string per line, thus the starting and ending +// double quote must be the first and last character in the line, +// respectively, ignoring whitespace before and after the string. If +// there are multiple strings (in multiple lines), they are concatenated +// to a single string. In the output, a string gets represented as a +// series of singles bytes, followed by a zero byte. The enumeration +// values simply hold byte offsets to the start of the corresponding +// strings. +// +// For strings, the `maximum' template holds the maximum number of +// non-space characters in all strings. +// +// - Data blocks enclosed in balanced braces, which get copied verbatim and +// which can span multiple lines. The opening brace of a block must be +// the first character of a line (ignoring whitespace), and the closing +// brace the last (ignoring whitespace also). The script appends a comma +// character after each block and counts the number of blocks to set the +// enumeration values. +// +// For data blocks, the `maximum' template holds the maximum number of +// array elements. +// +// A section can contain either strings only or data blocks only. +// +// A comment line starts with `//'; it gets removed. A preprocessor +// directive line (using the standard syntax of `cpp') starts with `#' and +// gets copied verbatim to both the enumeration and the array. Whitespace +// outside of a string is insignificant. +// +// Preprocessor directives are ignored while the script computes maximum +// values; this essentially means that the maximum values can easily be too +// large. Given that the purpose of those values is to create local +// fixed-size arrays at compile time for further processing of the blue zone +// data, this isn't a problem. Note the final zero byte of a string is not +// counted. Note also that the count holds the number of UTF-8 encoded +// characters, not bytes. + + +// The blue zone string data, to be used in the blue stringsets below. + +AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: + + AF_BLUE_STRING_ADLAM_CAPITAL_TOP + "𞤌 𞤅 𞤈 𞤠𞤔 𞤚" + AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM + "𞤂 𞤖" + AF_BLUE_STRING_ADLAM_SMALL_TOP + "𞤬 𞤮 𞤻 𞤼 𞤾" + AF_BLUE_STRING_ADLAM_SMALL_BOTTOM + "𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀" + + AF_BLUE_STRING_ARABIC_TOP + "ا Ø¥ Ù„ Ùƒ Ø· ظ" + AF_BLUE_STRING_ARABIC_BOTTOM + "ت Ø« Ø· ظ Ùƒ" + // We don't necessarily have access to medial forms via Unicode in case + // Arabic presentational forms are missing. The only character that is + // guaranteed to have the same vertical position with joining (that is, + // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both + // round and flat curves. + AF_BLUE_STRING_ARABIC_JOIN + "Ù€" + + AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP + "Ô± Õ„ Õ’ Õ Ô² Ô³ Ô´ Õ•" + AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM + "Õ’ Õˆ Ô´ Õƒ Õ‡ Õ Õ Õ•" + AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER + "Õ¥ Õ§ Õ« Õ´ Õ¾ Ö† Õ³" + AF_BLUE_STRING_ARMENIAN_SMALL_TOP + "Õ¡ Õµ Ö‚ Õ½ Õ£ Õ· Ö€ Ö…" + AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM + "Õ° Õ¸ Õ³ Õ¡ Õ¥ Õ® Õ½ Ö…" + AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER + "Õ¢ Õ¨ Õ« Õ¬ Õ² Õº Öƒ Ö" + + AF_BLUE_STRING_AVESTAN_TOP + "𬀠ð¬ ð¬ ð¬›" + AF_BLUE_STRING_AVESTAN_BOTTOM + "𬀠ð¬" + + AF_BLUE_STRING_BAMUM_TOP + "ꚧ ꚨ ê›› ꛉ ê› ê›ˆ ꛫ ꛯ" + AF_BLUE_STRING_BAMUM_BOTTOM + "êš­ êš³ ꚶ ꛬ ꚢ êš½ ꛯ ꛲" + + AF_BLUE_STRING_BENGALI_BASE + "অ ড ত ন ব ভ ল ক" + AF_BLUE_STRING_BENGALI_TOP + "ই ট ঠ ি ী ৈ ৗ" + AF_BLUE_STRING_BENGALI_HEAD + "ও ঠড ত ন ব ল ক" + + AF_BLUE_STRING_BUHID_TOP + "á áˆ" + AF_BLUE_STRING_BUHID_LARGE + "á… áŠ áŽ" + AF_BLUE_STRING_BUHID_SMALL + "ႠრበáŒ" + AF_BLUE_STRING_BUHID_BOTTOM + "ဠრᆠበዠá á‘" + + AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP + "á—œ á–´ á á’£ á‘« á‘Ž ᔑ á—°" + AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM + "á—¶ á–µ á’§ რᑌ ᒠᔑ á—¢" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP + "á““ á“• á“€ á“‚ á“„ á•„ ᕆ ᘣ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM + "ᕃ á“‚ á“€ á•‚ á“— á“š ᕆ ᘣ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP + "᪠ᙆ ᣘ ᢠᒾ ᣗ ᔆ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM + "ᙆ á—® á’» ហᔆ á’¡ á’¢ á“‘" + + AF_BLUE_STRING_CARIAN_TOP + "ðŠ§ ðŠ« ðŠ¬ ðŠ­ ðŠ± ðŠº ðŠ¼ ðŠ¿" + AF_BLUE_STRING_CARIAN_BOTTOM + "ðŠ£ ðŠ§ ðŠ· ð‹€ ðŠ« ðŠ¸ ð‹‰" + + AF_BLUE_STRING_CHAKMA_TOP + "𑄃 ð‘„… 𑄉 ð‘„™ ð‘„—" + AF_BLUE_STRING_CHAKMA_BOTTOM + "ð‘„… ð‘„› ð‘„ ð‘„— ð‘„“" + AF_BLUE_STRING_CHAKMA_DESCENDER + "𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢" + + AF_BLUE_STRING_CHEROKEE_CAPITAL + "ᆠᎻ Ꭼ რᎤ ᣠᎦ á•" + AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER + "ê®’ ꮤ ꮶ ê­´ ê­¾ ê®— ê® ê®¿" + AF_BLUE_STRING_CHEROKEE_SMALL + "ê®– ê­¼ ꮓ ê®  ꮳ ê­¶ ꮥ ê®»" + AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER + "á¸ ê® ê­¹ ê­»" + + AF_BLUE_STRING_COPTIC_CAPITAL_TOP + "Ⲍ Ⲏ â²  Ⳟ Ⲟ ⲠⲤ Ⳋ" + AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM + "ⳠⳘ Ⳟ Ⲏ Ⲟ ⲠⳜ â²°" + AF_BLUE_STRING_COPTIC_SMALL_TOP + "ⲠⲠⲡ ⳟ ⲟ ⲑ â²¥ ⳋ" + AF_BLUE_STRING_COPTIC_SMALL_BOTTOM + "ⳑ â³™ ⳟ Ⲡⲟ ⲑ â³ â³’" + + AF_BLUE_STRING_CYPRIOT_TOP + "ð  ð ™ ð ³ ð ± ð … ð “ ð £ ð ¦" + AF_BLUE_STRING_CYPRIOT_BOTTOM + "ð ƒ ð Š ð › ð £ ð ³ ð µ ð " + AF_BLUE_STRING_CYPRIOT_SMALL + "ð ˆ ð  ð –" + + AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP + "Б Ð’ Е П З О С Э" + AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM + "Б Ð’ Е Ш З О С Э" + AF_BLUE_STRING_CYRILLIC_SMALL + "Ñ… п н ш е з о Ñ" + AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER + "Ñ€ у Ñ„" + + AF_BLUE_STRING_DESERET_CAPITAL_TOP + "ð‚ ð„ ð‹ ð— ð‘" + AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM + "ð€ ð‚ ð„ ð— ð›" + AF_BLUE_STRING_DESERET_SMALL_TOP + "ðª ð¬ ð³ ð¿ ð¹" + AF_BLUE_STRING_DESERET_SMALL_BOTTOM + "ð¨ ðª ð¬ ð¿ ð‘ƒ" + + AF_BLUE_STRING_DEVANAGARI_BASE + "क न म उ छ ट ठ ड" + AF_BLUE_STRING_DEVANAGARI_TOP + "ई ठओ औ ि ी ो ौ" + // note that some fonts have extreme variation in the height of the + // round head elements; for this reason we also define the `base' + // blue zone, which must be always present + AF_BLUE_STRING_DEVANAGARI_HEAD + "क म अ आ थ ध भ श" + AF_BLUE_STRING_DEVANAGARI_BOTTOM + "ॠृ" + + AF_BLUE_STRING_ETHIOPIC_TOP + "ሀ ሃ ዘ á ማ በ á‹‹ á‹" + AF_BLUE_STRING_ETHIOPIC_BOTTOM + "ለ ሠበ ዘ ሀ ሪ ዠጨ" + + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP + "გ დ ე ვ თ ი რღ" + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM + "რზ მ ს შ ძ ხ პ" + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER + "ს ხ ქ ზ მ შ ჩ წ" + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER + "ე ვ ჟ ტ უ ფ ქ ყ" + + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP + "Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ á‚¥ Ⴓ Ⴚ" + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM + "Ⴄ á‚¥ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ á‚«" + + AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP + "â´ â´— â´‚ â´„ â´… â´‡ â´” â´–" + AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM + "â´ˆ â´Œ â´– â´Ž â´ƒ â´† â´‹ â´¢" + AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER + "â´ â´‘ â´“ â´• â´™ â´› â´¡ â´£" + AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER + "â´„ â´… â´” â´• â´ â´‚ â´˜ â´" + + AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP + "Ნ Ჟ á²³ Ჸ á²’ á²” á² á²´" + AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM + "Ი á²² ᲠᲩ á²› Შ Ჯ á²½" + + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP + "â°… â°” â°ª â°„ â°‚ â°Š â°« â°‹" + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM + "â°… â°„ â°‚ â°ª â°ž â°¡ â°Š â°”" + AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP + "â°µ ⱄ ⱚ â°´ â°² â°º â±› â°»" + AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM + "â°µ â°´ â°² ⱚ ⱎ ⱑ â°º ⱄ" + + AF_BLUE_STRING_GOTHIC_TOP + "ðŒ² ðŒ¶ ð€ ð„ ðŒ´ ðƒ ðˆ ðŒ¾" + AF_BLUE_STRING_GOTHIC_BOTTOM + "ðŒ¶ ðŒ´ ðƒ ðˆ" + + AF_BLUE_STRING_GREEK_CAPITAL_TOP + "Γ Î’ Ε Ζ Θ Ο Ω" + AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM + "Î’ Δ Ζ Ξ Θ Ο" + AF_BLUE_STRING_GREEK_SMALL_BETA_TOP + "β θ δ ζ λ ξ" + AF_BLUE_STRING_GREEK_SMALL + "α ε ι ο Ï€ σ Ï„ ω" + AF_BLUE_STRING_GREEK_SMALL_DESCENDER + "β γ η μ Ï Ï† χ ψ" + + AF_BLUE_STRING_GUJARATI_TOP + "ત ન ઋ ઌ છ ટ ર ૦" + AF_BLUE_STRING_GUJARATI_BOTTOM + "ખ ગ ઘ ઞ ઇ ઈ ઠ જ" + AF_BLUE_STRING_GUJARATI_ASCENDER + "ઈ ઊ િ à«€ લી શà«àªšàª¿ જિ સી" + AF_BLUE_STRING_GUJARATI_DESCENDER + "ૠૃ à«„ ખૠછૃ છૄ" + AF_BLUE_STRING_GUJARATI_DIGIT_TOP + "૦ ૧ ૨ à«© à«­" + + AF_BLUE_STRING_GURMUKHI_BASE + "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" + AF_BLUE_STRING_GURMUKHI_HEAD + "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" + AF_BLUE_STRING_GURMUKHI_TOP + "ਇ ਈ ਉ ਠਓ ੳ ਿ à©€" + AF_BLUE_STRING_GURMUKHI_BOTTOM + "ਅ ਠਓ ਗ ਜ ਠ ਰ ਸ" + AF_BLUE_STRING_GURMUKHI_DIGIT_TOP + "੦ ੧ ੨ à©© à©­" + + AF_BLUE_STRING_HEBREW_TOP + "ב ד ×” ×— ך ×› × ×¡" + AF_BLUE_STRING_HEBREW_BOTTOM + "ב ט ×› × ×¡ צ" + AF_BLUE_STRING_HEBREW_DESCENDER + "ק ך ן ×£ ×¥" + + AF_BLUE_STRING_KANNADA_TOP + "ಇ ಊ ಠಣ ಸಾ ನಾ ದಾ ರಾ" + AF_BLUE_STRING_KANNADA_BOTTOM + "ಅ ಉ ಎ ಲ ೦ ೨ ೬ à³­" + + AF_BLUE_STRING_KAYAH_LI_TOP + "꤅ ê¤ ê¤ ê¤‹ ꤀ ê¤" + AF_BLUE_STRING_KAYAH_LI_BOTTOM + "꤈ ꤘ ꤀ ê¤ ê¤¢" + AF_BLUE_STRING_KAYAH_LI_ASCENDER + "ꤖ ꤡ" + AF_BLUE_STRING_KAYAH_LI_DESCENDER + "ꤑ ꤜ ꤞ" + AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER + "ꤑ꤬ ꤜ꤭ ꤔ꤬" + + AF_BLUE_STRING_KHMER_TOP + "áž áž‘ áž“ ឧ áž© ា" + AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP + "ក្ក ក្ហក្គ ក្áž" + AF_BLUE_STRING_KHMER_BOTTOM + "ហឃ áž… áž‹ áž” ម áž™ áž²" + AF_BLUE_STRING_KHMER_DESCENDER + "ážáŸ’ážš រៀ ឲ្យ អឿ" + AF_BLUE_STRING_KHMER_LARGE_DESCENDER + "ន្ážáŸ’រៃ ង្ážáŸ’áž™ ក្បៀ ច្រៀ ន្ážáž¿ ល្បឿ" + + AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP + "᧠ ᧡" + AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM + "᧶ ᧹" + + AF_BLUE_STRING_LAO_TOP + "າ ດ ອ ມ ລ ວ ຣ ງ" + AF_BLUE_STRING_LAO_BOTTOM + "າ ອ ບ ຠຣ ຮ ວ ຢ" + AF_BLUE_STRING_LAO_ASCENDER + "ປ ຢ ຟ àº" + AF_BLUE_STRING_LAO_LARGE_ASCENDER + "ໂ ໄ ໃ" + AF_BLUE_STRING_LAO_DESCENDER + "ງ ຊ ຖ ຽ ໆ ຯ" + + AF_BLUE_STRING_LATIN_CAPITAL_TOP + "T H E Z O C Q S" + AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM + "H E Z L O C U S" + AF_BLUE_STRING_LATIN_SMALL_F_TOP + "f i j k d b h" + AF_BLUE_STRING_LATIN_SMALL_TOP + "u v x z o e s c" + AF_BLUE_STRING_LATIN_SMALL_BOTTOM + "n r x z o e s c" + AF_BLUE_STRING_LATIN_SMALL_DESCENDER + "p q g j y" + + // we assume that both the subscript and superscript ranges + // don't contain oldstyle digits (actually, most fonts probably + // have digits only in those ranges) + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP + "â‚€ ₃ â‚… ₇ ₈" + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM + "â‚€ â‚ â‚‚ ₃ ₈" + AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP + "áµ¢ â±¼ â‚• â‚– â‚—" + AF_BLUE_STRING_LATIN_SUBS_SMALL + "â‚ â‚‘ â‚’ â‚“ â‚™ â‚› áµ¥ ᵤ áµ£" + AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER + "ᵦ ᵧ ᵨ ᵩ â‚š" + + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP + "Ⱐ³ âµ â· áµ€ á´´ á´± á´¼" + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM + "Ⱐ¹ ² ³ á´± á´¸ á´¼ áµ" + AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP + "ᵇ ᵈ áµ Ê° ʲ ᶠ â±" + AF_BLUE_STRING_LATIN_SUPS_SMALL + "ᵉ áµ’ ʳ Ë¢ Ë£ ᶜ ᶻ" + AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER + "áµ– ʸ áµ" + + AF_BLUE_STRING_LISU_TOP + "ê“¡ ꓧ ꓱ ꓶ ê“© ê“š ꓵ ꓳ" + AF_BLUE_STRING_LISU_BOTTOM + "ê“• ê“œ ê“ž ê“¡ ê“› ê“¢ ꓳ ê“´" + + AF_BLUE_STRING_MALAYALAM_TOP + "à´’ à´Ÿ à´  à´± à´š à´ª à´šàµà´š à´ªàµà´ª" + AF_BLUE_STRING_MALAYALAM_BOTTOM + "à´Ÿ à´  à´§ à´¶ à´˜ à´š à´¥ à´²" + + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP + "ð–¹€ 𖹠𖹂 𖹃 𖹠𖹚 𖹟" + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM + "ð–¹€ 𖹠𖹂 𖹃 𖹠𖹚 ð–¹’ 𖹓" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP + "𖹤 𖹬 𖹧 ð–¹´ 𖹶 ð–¹¾" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP + "ð–¹  𖹡 ð–¹¢ ð–¹¹ ð–¹³ ð–¹®" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM + "ð–¹  𖹡 ð–¹¢ ð–¹³ ð–¹­ ð–¹½" + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER + "ð–¹¥ 𖹨 𖹩" + AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP + "𖺀 ð–º… 𖺈 𖺄 ð–º" + + AF_BLUE_STRING_MONGOLIAN_TOP_BASE + "á ³ á ´ á ¶ á ½ á¡‚ á¡Š â€á¡¡â€ â€á¡³â€" + AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE + "ᡃ" + + AF_BLUE_STRING_MYANMAR_TOP + "ဠဂ င ဒ ဠᥠአá‹" + AF_BLUE_STRING_MYANMAR_BOTTOM + "င ဎ ဒ ပ ဗ ဠአá‹" + AF_BLUE_STRING_MYANMAR_ASCENDER + "ဩ ြ á á ᆠါ ိ" + AF_BLUE_STRING_MYANMAR_DESCENDER + "ဉ ည ဥ ဩ ဨ á‚ á… á‰" + + AF_BLUE_STRING_NKO_TOP + "ß ß‰ ß’ ߟ ß– ßœ ß  ߥ" + AF_BLUE_STRING_NKO_BOTTOM + "߀ ߘ ß¡ ß  ߥ" + AF_BLUE_STRING_NKO_SMALL_TOP + "ß ß› ß‹" + AF_BLUE_STRING_NKO_SMALL_BOTTOM + "ߎ ß ß› ß‹" + + AF_BLUE_STRING_OL_CHIKI + "á±› ᱜ ᱠᱡ á±¢ á±¥" + + AF_BLUE_STRING_OLD_TURKIC_TOP + "ð°— ð°˜ ð°§" + AF_BLUE_STRING_OLD_TURKIC_BOTTOM + "ð°‰ ð°— ð°¦ ð°§" + + AF_BLUE_STRING_OSAGE_CAPITAL_TOP + "ð’¾ ð“ ð“’ ð““ ð’» ð“‚ ð’µ ð“†" + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM + "ð’° ð“ ð“‚ ð’¿ ð“Ž ð’¹" + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER + "ð’¼ ð’½ ð’¾" + AF_BLUE_STRING_OSAGE_SMALL_TOP + "𓵠𓶠𓺠𓻠ð“ 𓣠𓪠ð“®" + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM + "𓘠𓚠𓣠𓵠𓡠𓧠𓪠ð“¶" + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER + "𓤠𓦠𓸠𓹠ð“›" + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER + "𓤠𓥠ð“¦" + + AF_BLUE_STRING_OSMANYA_TOP + "ð’† ð’‰ ð’ ð’’ ð’˜ ð’› ð’  ð’£" + AF_BLUE_STRING_OSMANYA_BOTTOM + "ð’€ ð’‚ ð’† ð’ˆ ð’Š ð’’ ð’  ð’©" + + AF_BLUE_STRING_ROHINGYA_TOP + "ð´ƒ ð´€ ð´† ð´– ð´•" + AF_BLUE_STRING_ROHINGYA_BOTTOM + "ð´” ð´– ð´• ð´‘ ð´" + AF_BLUE_STRING_ROHINGYA_JOIN + "Ù€" + + AF_BLUE_STRING_SAURASHTRA_TOP + "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ê¢ ê¢›" + AF_BLUE_STRING_SAURASHTRA_BOTTOM + "ꢂ ꢨ ꢺ ꢤ ꢎ" + + AF_BLUE_STRING_SHAVIAN_TOP + "ð‘• ð‘™" + AF_BLUE_STRING_SHAVIAN_BOTTOM + "𑔠𑖠𑗠𑹠ð‘»" + AF_BLUE_STRING_SHAVIAN_DESCENDER + "ð‘Ÿ ð‘£" + AF_BLUE_STRING_SHAVIAN_SMALL_TOP + "𑱠𑲠𑳠𑴠𑸠𑺠ð‘¼" + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM + "ð‘´ ð‘» ð‘¹" + + AF_BLUE_STRING_SINHALA_TOP + "ඉ ක චඳ ප ය ල à·†" + AF_BLUE_STRING_SINHALA_BOTTOM + "එ ඔ චජ ට ථ ධ ර" + AF_BLUE_STRING_SINHALA_DESCENDER + "ද ඳ උ ල තූ තු බු දු" + + AF_BLUE_STRING_SUNDANESE_TOP + "ᮋ ᮞ á®® ᮽ á®° ᮈ" + AF_BLUE_STRING_SUNDANESE_BOTTOM + "ᮄ á®” ᮕ á®— á®° ᮆ ᮈ ᮉ" + AF_BLUE_STRING_SUNDANESE_DESCENDER + "ᮼ ᳄" + + AF_BLUE_STRING_TAI_VIET_TOP + "ꪆ ꪔ ꪒ ꪖ ꪫ" + AF_BLUE_STRING_TAI_VIET_BOTTOM + "ꪉ ꪫ ꪮ" + + AF_BLUE_STRING_TAMIL_TOP + "உ à®’ ஓ à®± ஈ க à®™ ச" + AF_BLUE_STRING_TAMIL_BOTTOM + "க ச ல ஶ உ à®™ ட ப" + + AF_BLUE_STRING_TELUGU_TOP + "à°‡ à°Œ à°™ à°ž à°£ à°± ౯" + AF_BLUE_STRING_TELUGU_BOTTOM + "à°… à°• à°š à°° à°½ ౨ ౬" + + AF_BLUE_STRING_THAI_TOP + "บ เ ๠อ ภา" + AF_BLUE_STRING_THAI_BOTTOM + "บ ป ษ ฯ อ ย ฮ" + AF_BLUE_STRING_THAI_ASCENDER + "ป ภฟ" + AF_BLUE_STRING_THAI_LARGE_ASCENDER + "โ ใ ไ" + AF_BLUE_STRING_THAI_DESCENDER + "ฎ ภฤ ฦ" + AF_BLUE_STRING_THAI_LARGE_DESCENDER + "ภà¸" + AF_BLUE_STRING_THAI_DIGIT_TOP + "๠๑ ๓" + + AF_BLUE_STRING_TIFINAGH + "âµ” âµ™ âµ› ⵞ â´µ â´¼ â´¹ ⵎ" + + AF_BLUE_STRING_VAI_TOP + "ê— ê˜– ꘙ ꘜ ê–œ ê– ê”… ê•¢" + AF_BLUE_STRING_VAI_BOTTOM + "ê— ê˜– ꘙ ê—ž ê”… ê•¢ ê–œ ꔆ" + + +#ifdef AF_CONFIG_OPTION_CJK + + AF_BLUE_STRING_CJK_TOP + "ä»– 们 ä½  來 們 到 å’Œ 地" + " 对 å° å°± 席 我 æ—¶ 時 會" + " æ¥ ç‚º 能 舰 說 说 è¿™ 這" + " 齊 |" + " 军 åŒ å·² æ„¿ æ—¢ 星 是 景" + " æ°‘ ç…§ 现 ç¾ ç† ç”¨ ç½® è¦" + " è» é‚£ é… é‡Œ é–‹ é›· 露 é¢" + " 顾" + AF_BLUE_STRING_CJK_BOTTOM + "个 为 人 ä»– 以 们 ä½  來" + " 個 們 到 å’Œ 大 对 å° å°±" + " 我 æ—¶ 時 有 æ¥ ç‚º è¦ èªª" + " 说 |" + " 主 些 å›  它 想 æ„ ç† ç”Ÿ" + " 當 看 ç€ ç½® 者 自 è‘— 裡" + " 过 还 è¿› 進 éŽ é“ é‚„ 里" + " é¢" + +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + + AF_BLUE_STRING_CJK_LEFT + " 些 们 ä½  來 們 到 å’Œ 地" + " 她 å°† å°‡ å°± å¹´ å¾— 情 最" + " æ · 樣 ç† èƒ½ 說 说 è¿™ 這" + " 通 |" + " å³ å— å§ å¬ å‘¢ å“ å“ å—Ž" + " 师 師 收 æ–­ æ–· 明 眼 é–“" + " é—´ é™… 陈 é™ é™¤ 陳 éš éš›" + " 隨" + AF_BLUE_STRING_CJK_RIGHT + "事 å‰ å­¸ å°† å°‡ 情 想 或" + " 政 æ–¯ æ–° æ · 樣 æ°‘ æ²’ 没" + " 然 特 现 ç¾ çƒ ç¬¬ 經 è°" + " èµ· |" + " 例 別 别 制 动 å‹• å— å—Ž" + " 增 指 明 æœ æœŸ æž„ 物 ç¡®" + " ç§ èª¿ è°ƒ è²» è´¹ é‚£ 都 é–“" + " é—´" + +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + +#endif /* AF_CONFIG_OPTION_CJK */ + + +// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'. +// +// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some +// explanations. +// +// A blue zone in general is defined by a reference and an overshoot line. +// During the hinting process, all coordinate values between those two lines +// are set equal to the reference value, provided that the blue zone is not +// wider than 0.75 pixels (otherwise the blue zone gets ignored). All +// entries must have `AF_BLUE_STRING_MAX' as the final line. +// +// During the glyph analysis, edges are sorted from bottom to top, and then +// sequentially checked, edge by edge, against the blue zones in the order +// given below. +// +// +// latin auto-hinter +// ----------------- +// +// Characters in a blue string are automatically classified as having a flat +// (reference) or a round (overshoot) extremum. The blue zone is then set +// up by the mean values of all flat extrema and all round extrema, +// respectively. Only horizontal blue zones (i.e., adjusting vertical +// coordinate values) are supported. +// +// Some scripts like Khmer need character composition to get all necessary +// blue zones, since Unicode only provides an abstract data model that +// doesn't represent all possible glyph shapes. For such character +// clusters, the HarfBuzz library is used to convert them into the +// corresponding glyphs. The largest glyph element (where `largest' can be +// either `largest ascender' or `largest descender') then defines the +// corresponding flat or round extremum. +// +// For the latin auto-hinter, the overshoot should be larger than the +// reference for top zones, and vice versa for bottom zones. +// +// LATIN_TOP +// Take the maximum flat and round coordinate values of the blue string +// characters for computing the blue zone's reference and overshoot +// values. +// +// If not set, take the minimum values. +// +// Mutually exclusive with `LATIN_SUB_TOP'. +// +// LATIN_SUB_TOP +// For all glyphs of a character cluster, compute the maximum flat +// and round coordinate values of each component, then take the +// smallest of the maximum values. The idea is to get the top of +// subscript glyphs, as used in Khmer, for example. Note that +// this mechanism doesn't work for ordinary ligatures. +// +// This flags indicates a secondary blue zone: It gets removed if +// there is a non-LATIN_SUB_TOP blue zone at the same coordinate +// value (after scaling). +// +// Mutually exclusive with `LATIN_TOP'. +// +// LATIN_NEUTRAL +// Ignore round extrema and define the blue zone with flat values only. +// Both top and bottom of contours can match. This is useful for +// scripts like Devanagari where vowel signs attach to the base +// character and are implemented as components of composite glyphs. +// +// If not set, both round and flat extrema are taken into account. +// Additionally, only the top or the bottom of a contour can match, +// depending on the LATIN_TOP flag. +// +// Neutral blue zones should always follow non-neutral blue zones. +// +// LATIN_X_HEIGHT +// Scale all glyphs vertically from the corresponding script to make the +// reference line of this blue zone align on the grid. The scaling +// takes place before all other blue zones get aligned to the grid. +// Only one blue character string of a script style can have this flag. +// +// LATIN_LONG +// Apply an additional constraint for blue zone values: Don't +// necessarily use the extremum as-is but a segment of the topmost (or +// bottommost) contour that is longer than a heuristic threshold, and +// which is not too far away vertically from the real extremum. This +// ensures that small bumps in the outline are ignored (for example, the +// `vertical serifs' found in many Hebrew glyph designs). +// +// The segment must be at least EM/25 font units long, and the distance +// to the extremum must be smaller than EM/4. +// +// +// cjk auto-hinter +// --------------- +// +// Characters in a blue string are *not* automatically classified. Instead, +// first come the characters used for the overshoot value, then the +// character `|', then the characters used for the reference value +// (everything separated by space characters). The blue zone is then set up +// by the mean values of all reference values and all overshoot values, +// respectively. Both horizontal and vertical blue zones (i.e., adjusting +// vertical and horizontal coordinate values, respectively) are supported. +// +// For the cjk auto-hinter, the overshoot should be smaller than the +// reference for top zones, and vice versa for bottom zones. +// +// CJK_TOP +// Take the maximum flat and round coordinate values of the blue string +// characters. If not set, take the minimum values. +// +// CJK_RIGHT +// A synonym for CJK_TOP. If CJK_HORIZ is set, this flag indicates the +// right blue zone, taking horizontal maximum values. +// +// CJK_HORIZ +// Define a blue zone for horizontal hinting (i.e., vertical blue +// zones). If not set, this is a blue zone for vertical hinting. + + +AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: + + AF_BLUE_STRINGSET_ADLM + { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ARAB + { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ARABIC_BOTTOM, 0 } + { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ARMN + { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_AVST + { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BAMU + { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BAMUM_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BENG + { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_BENGALI_BASE, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BUHD + { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_BUHID_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CAKM + { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 } + { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CANS + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CARI + { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CARIAN_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CHER + { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 } + { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CHEROKEE_SMALL, 0 } + { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_COPT + { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CPRT + { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 } + { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYPRIOT_SMALL, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CYRL + { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CYRILLIC_SMALL, 0 } + { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_DEVA + { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_DEVANAGARI_BASE, 0 } + { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_DSRT + { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ETHI + { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GEOR + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 } + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 } + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GEOK + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GLAG + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GOTH + { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GREK + { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GREEK_SMALL, 0 } + { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GUJR + { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 } + { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 } + { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GURU + { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 } + { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_HEBR + { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_LONG } + { AF_BLUE_STRING_HEBREW_BOTTOM, 0 } + { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KNDA + { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KALI + { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 } + { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 } + { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KHMR + { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP } + { AF_BLUE_STRING_KHMER_BOTTOM, 0 } + { AF_BLUE_STRING_KHMER_DESCENDER, 0 } + { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KHMS + { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LAO + { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LAO_BOTTOM, 0 } + { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LAO_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LATN + { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LATB + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 } + { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LATP + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 } + { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LISU + { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LISU_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_MLYM + { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_MEDF + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_MONG + { AF_BLUE_STRING_MONGOLIAN_TOP_BASE, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_MYMR + { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 } + { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_NKOO + { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_NKO_BOTTOM, 0 } + { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_NONE + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OLCK + { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OL_CHIKI, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ORKH + { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OSGE + { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 } + { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OSMA + { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ROHG + { AF_BLUE_STRING_ROHINGYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ROHINGYA_BOTTOM, 0 } + { AF_BLUE_STRING_ROHINGYA_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SAUR + { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SHAW + { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 } + { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 } + { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SINH + { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SINHALA_BOTTOM, 0 } + { AF_BLUE_STRING_SINHALA_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SUND + { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 } + { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TAML + { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TAMIL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TAVT + { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TELU + { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_THAI + { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_THAI_BOTTOM, 0 } + { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_THAI_DESCENDER, 0 } + { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TFNG + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TIFINAGH, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_VAII + { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_VAI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + +#ifdef AF_CONFIG_OPTION_CJK + + AF_BLUE_STRINGSET_HANI + { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP } + { AF_BLUE_STRING_CJK_BOTTOM, 0 } +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ } + { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | + AF_BLUE_PROPERTY_CJK_RIGHT } +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + { AF_BLUE_STRING_MAX, 0 } + +#endif /* AF_CONFIG_OPTION_CJK */ + + +// END diff --git a/external/freetype/src/autofit/afblue.h b/external/freetype/src/autofit/afblue.h new file mode 100644 index 000000000..76f2f47cb --- /dev/null +++ b/external/freetype/src/autofit/afblue.h @@ -0,0 +1,429 @@ +/* This file has been generated by the Perl script `afblue.pl', */ +/* using data from file `afblue.dat'. */ + +/**************************************************************************** + * + * afblue.h + * + * Auto-fitter data for blue strings (specification). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFBLUE_H_ +#define AFBLUE_H_ + + +FT_BEGIN_HEADER + + + /* an auxiliary macro to decode a UTF-8 character -- since we only use */ + /* hard-coded, self-converted data, no error checking is performed */ +#define GET_UTF8_CHAR( ch, p ) \ + do \ + { \ + ch = (unsigned char)*p++; \ + if ( ch >= 0x80 ) \ + { \ + FT_UInt len_; \ + \ + \ + if ( ch < 0xE0 ) \ + { \ + len_ = 1; \ + ch &= 0x1F; \ + } \ + else if ( ch < 0xF0 ) \ + { \ + len_ = 2; \ + ch &= 0x0F; \ + } \ + else \ + { \ + len_ = 3; \ + ch &= 0x07; \ + } \ + \ + for ( ; len_ > 0; len_-- ) \ + ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ + } \ + } while ( 0 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* At the bottommost level, we define strings for finding blue zones. */ + + +#define AF_BLUE_STRING_MAX_LEN 51 + + /* The AF_Blue_String enumeration values are offsets into the */ + /* `af_blue_strings' array. */ + + typedef enum AF_Blue_String_ + { + AF_BLUE_STRING_ADLAM_CAPITAL_TOP = 0, + AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM = 30, + AF_BLUE_STRING_ADLAM_SMALL_TOP = 40, + AF_BLUE_STRING_ADLAM_SMALL_BOTTOM = 65, + AF_BLUE_STRING_ARABIC_TOP = 105, + AF_BLUE_STRING_ARABIC_BOTTOM = 123, + AF_BLUE_STRING_ARABIC_JOIN = 138, + AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP = 141, + AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM = 165, + AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER = 189, + AF_BLUE_STRING_ARMENIAN_SMALL_TOP = 210, + AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM = 234, + AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER = 258, + AF_BLUE_STRING_AVESTAN_TOP = 282, + AF_BLUE_STRING_AVESTAN_BOTTOM = 302, + AF_BLUE_STRING_BAMUM_TOP = 312, + AF_BLUE_STRING_BAMUM_BOTTOM = 344, + AF_BLUE_STRING_BENGALI_BASE = 376, + AF_BLUE_STRING_BENGALI_TOP = 408, + AF_BLUE_STRING_BENGALI_HEAD = 436, + AF_BLUE_STRING_BUHID_TOP = 468, + AF_BLUE_STRING_BUHID_LARGE = 476, + AF_BLUE_STRING_BUHID_SMALL = 488, + AF_BLUE_STRING_BUHID_BOTTOM = 504, + AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP = 532, + AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM = 564, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP = 596, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM = 628, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP = 660, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM = 688, + AF_BLUE_STRING_CARIAN_TOP = 720, + AF_BLUE_STRING_CARIAN_BOTTOM = 760, + AF_BLUE_STRING_CHAKMA_TOP = 795, + AF_BLUE_STRING_CHAKMA_BOTTOM = 820, + AF_BLUE_STRING_CHAKMA_DESCENDER = 845, + AF_BLUE_STRING_CHEROKEE_CAPITAL = 910, + AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER = 942, + AF_BLUE_STRING_CHEROKEE_SMALL = 974, + AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER = 1006, + AF_BLUE_STRING_COPTIC_CAPITAL_TOP = 1022, + AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM = 1054, + AF_BLUE_STRING_COPTIC_SMALL_TOP = 1086, + AF_BLUE_STRING_COPTIC_SMALL_BOTTOM = 1118, + AF_BLUE_STRING_CYPRIOT_TOP = 1150, + AF_BLUE_STRING_CYPRIOT_BOTTOM = 1190, + AF_BLUE_STRING_CYPRIOT_SMALL = 1225, + AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 1240, + AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 1264, + AF_BLUE_STRING_CYRILLIC_SMALL = 1288, + AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 1312, + AF_BLUE_STRING_DESERET_CAPITAL_TOP = 1321, + AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM = 1346, + AF_BLUE_STRING_DESERET_SMALL_TOP = 1371, + AF_BLUE_STRING_DESERET_SMALL_BOTTOM = 1396, + AF_BLUE_STRING_DEVANAGARI_BASE = 1421, + AF_BLUE_STRING_DEVANAGARI_TOP = 1453, + AF_BLUE_STRING_DEVANAGARI_HEAD = 1485, + AF_BLUE_STRING_DEVANAGARI_BOTTOM = 1517, + AF_BLUE_STRING_ETHIOPIC_TOP = 1525, + AF_BLUE_STRING_ETHIOPIC_BOTTOM = 1557, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP = 1589, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM = 1621, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER = 1653, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER = 1685, + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP = 1717, + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM = 1749, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP = 1781, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM = 1813, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER = 1845, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER = 1877, + AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP = 1909, + AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM = 1941, + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP = 1973, + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM = 2005, + AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP = 2037, + AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM = 2069, + AF_BLUE_STRING_GOTHIC_TOP = 2101, + AF_BLUE_STRING_GOTHIC_BOTTOM = 2141, + AF_BLUE_STRING_GREEK_CAPITAL_TOP = 2161, + AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 2182, + AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 2200, + AF_BLUE_STRING_GREEK_SMALL = 2218, + AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 2242, + AF_BLUE_STRING_GUJARATI_TOP = 2266, + AF_BLUE_STRING_GUJARATI_BOTTOM = 2298, + AF_BLUE_STRING_GUJARATI_ASCENDER = 2330, + AF_BLUE_STRING_GUJARATI_DESCENDER = 2380, + AF_BLUE_STRING_GUJARATI_DIGIT_TOP = 2413, + AF_BLUE_STRING_GURMUKHI_BASE = 2433, + AF_BLUE_STRING_GURMUKHI_HEAD = 2465, + AF_BLUE_STRING_GURMUKHI_TOP = 2497, + AF_BLUE_STRING_GURMUKHI_BOTTOM = 2529, + AF_BLUE_STRING_GURMUKHI_DIGIT_TOP = 2561, + AF_BLUE_STRING_HEBREW_TOP = 2581, + AF_BLUE_STRING_HEBREW_BOTTOM = 2605, + AF_BLUE_STRING_HEBREW_DESCENDER = 2623, + AF_BLUE_STRING_KANNADA_TOP = 2638, + AF_BLUE_STRING_KANNADA_BOTTOM = 2682, + AF_BLUE_STRING_KAYAH_LI_TOP = 2714, + AF_BLUE_STRING_KAYAH_LI_BOTTOM = 2738, + AF_BLUE_STRING_KAYAH_LI_ASCENDER = 2758, + AF_BLUE_STRING_KAYAH_LI_DESCENDER = 2766, + AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER = 2778, + AF_BLUE_STRING_KHMER_TOP = 2799, + AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP = 2823, + AF_BLUE_STRING_KHMER_BOTTOM = 2863, + AF_BLUE_STRING_KHMER_DESCENDER = 2895, + AF_BLUE_STRING_KHMER_LARGE_DESCENDER = 2929, + AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP = 3016, + AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM = 3024, + AF_BLUE_STRING_LAO_TOP = 3032, + AF_BLUE_STRING_LAO_BOTTOM = 3064, + AF_BLUE_STRING_LAO_ASCENDER = 3096, + AF_BLUE_STRING_LAO_LARGE_ASCENDER = 3112, + AF_BLUE_STRING_LAO_DESCENDER = 3124, + AF_BLUE_STRING_LATIN_CAPITAL_TOP = 3148, + AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 3164, + AF_BLUE_STRING_LATIN_SMALL_F_TOP = 3180, + AF_BLUE_STRING_LATIN_SMALL_TOP = 3194, + AF_BLUE_STRING_LATIN_SMALL_BOTTOM = 3210, + AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 3226, + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 3236, + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 3256, + AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 3276, + AF_BLUE_STRING_LATIN_SUBS_SMALL = 3296, + AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 3332, + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 3352, + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 3383, + AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 3412, + AF_BLUE_STRING_LATIN_SUPS_SMALL = 3438, + AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 3463, + AF_BLUE_STRING_LISU_TOP = 3474, + AF_BLUE_STRING_LISU_BOTTOM = 3506, + AF_BLUE_STRING_MALAYALAM_TOP = 3538, + AF_BLUE_STRING_MALAYALAM_BOTTOM = 3582, + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_TOP = 3614, + AF_BLUE_STRING_MEDEFAIDRIN_CAPITAL_BOTTOM = 3649, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_F_TOP = 3689, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_TOP = 3719, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_BOTTOM = 3749, + AF_BLUE_STRING_MEDEFAIDRIN_SMALL_DESCENDER = 3779, + AF_BLUE_STRING_MEDEFAIDRIN_DIGIT_TOP = 3794, + AF_BLUE_STRING_MONGOLIAN_TOP_BASE = 3819, + AF_BLUE_STRING_MONGOLIAN_BOTTOM_BASE = 3863, + AF_BLUE_STRING_MYANMAR_TOP = 3867, + AF_BLUE_STRING_MYANMAR_BOTTOM = 3899, + AF_BLUE_STRING_MYANMAR_ASCENDER = 3931, + AF_BLUE_STRING_MYANMAR_DESCENDER = 3959, + AF_BLUE_STRING_NKO_TOP = 3991, + AF_BLUE_STRING_NKO_BOTTOM = 4015, + AF_BLUE_STRING_NKO_SMALL_TOP = 4030, + AF_BLUE_STRING_NKO_SMALL_BOTTOM = 4039, + AF_BLUE_STRING_OL_CHIKI = 4051, + AF_BLUE_STRING_OLD_TURKIC_TOP = 4075, + AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 4090, + AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 4110, + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 4150, + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 4180, + AF_BLUE_STRING_OSAGE_SMALL_TOP = 4195, + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 4235, + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4275, + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4300, + AF_BLUE_STRING_OSMANYA_TOP = 4315, + AF_BLUE_STRING_OSMANYA_BOTTOM = 4355, + AF_BLUE_STRING_ROHINGYA_TOP = 4395, + AF_BLUE_STRING_ROHINGYA_BOTTOM = 4420, + AF_BLUE_STRING_ROHINGYA_JOIN = 4445, + AF_BLUE_STRING_SAURASHTRA_TOP = 4448, + AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4480, + AF_BLUE_STRING_SHAVIAN_TOP = 4500, + AF_BLUE_STRING_SHAVIAN_BOTTOM = 4510, + AF_BLUE_STRING_SHAVIAN_DESCENDER = 4535, + AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4545, + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4580, + AF_BLUE_STRING_SINHALA_TOP = 4595, + AF_BLUE_STRING_SINHALA_BOTTOM = 4627, + AF_BLUE_STRING_SINHALA_DESCENDER = 4659, + AF_BLUE_STRING_SUNDANESE_TOP = 4703, + AF_BLUE_STRING_SUNDANESE_BOTTOM = 4727, + AF_BLUE_STRING_SUNDANESE_DESCENDER = 4759, + AF_BLUE_STRING_TAI_VIET_TOP = 4767, + AF_BLUE_STRING_TAI_VIET_BOTTOM = 4787, + AF_BLUE_STRING_TAMIL_TOP = 4799, + AF_BLUE_STRING_TAMIL_BOTTOM = 4831, + AF_BLUE_STRING_TELUGU_TOP = 4863, + AF_BLUE_STRING_TELUGU_BOTTOM = 4891, + AF_BLUE_STRING_THAI_TOP = 4919, + AF_BLUE_STRING_THAI_BOTTOM = 4943, + AF_BLUE_STRING_THAI_ASCENDER = 4971, + AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4983, + AF_BLUE_STRING_THAI_DESCENDER = 4995, + AF_BLUE_STRING_THAI_LARGE_DESCENDER = 5011, + AF_BLUE_STRING_THAI_DIGIT_TOP = 5019, + AF_BLUE_STRING_TIFINAGH = 5031, + AF_BLUE_STRING_VAI_TOP = 5063, + AF_BLUE_STRING_VAI_BOTTOM = 5095, + af_blue_1_1 = 5126, +#ifdef AF_CONFIG_OPTION_CJK + AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, + AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203, + af_blue_1_1_1 = af_blue_1_1 + 404, +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + AF_BLUE_STRING_CJK_LEFT = af_blue_1_1_1 + 1, + AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 204, + af_blue_1_1_2 = af_blue_1_1_1 + 405, +#else + af_blue_1_1_2 = af_blue_1_1_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + af_blue_1_2 = af_blue_1_1_2 + 0, +#else + af_blue_1_2 = af_blue_1_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK */ + + + AF_BLUE_STRING_MAX /* do not remove */ + + } AF_Blue_String; + + + FT_LOCAL_ARRAY( char ) + af_blue_strings[]; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S E T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* The next level is to group blue strings into style-specific sets. */ + + + /* Properties are specific to a writing system. We assume that a given */ + /* blue string can't be used in more than a single writing system, which */ + /* is a safe bet. */ +#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 ) +#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 ) +#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 ) +#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 ) + +#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ +#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP + + +#define AF_BLUE_STRINGSET_MAX_LEN 8 + + /* The AF_Blue_Stringset enumeration values are offsets into the */ + /* `af_blue_stringsets' array. */ + + typedef enum AF_Blue_Stringset_ + { + AF_BLUE_STRINGSET_ADLM = 0, + AF_BLUE_STRINGSET_ARAB = 5, + AF_BLUE_STRINGSET_ARMN = 9, + AF_BLUE_STRINGSET_AVST = 16, + AF_BLUE_STRINGSET_BAMU = 19, + AF_BLUE_STRINGSET_BENG = 22, + AF_BLUE_STRINGSET_BUHD = 27, + AF_BLUE_STRINGSET_CAKM = 32, + AF_BLUE_STRINGSET_CANS = 36, + AF_BLUE_STRINGSET_CARI = 43, + AF_BLUE_STRINGSET_CHER = 46, + AF_BLUE_STRINGSET_COPT = 53, + AF_BLUE_STRINGSET_CPRT = 58, + AF_BLUE_STRINGSET_CYRL = 63, + AF_BLUE_STRINGSET_DEVA = 69, + AF_BLUE_STRINGSET_DSRT = 75, + AF_BLUE_STRINGSET_ETHI = 80, + AF_BLUE_STRINGSET_GEOR = 83, + AF_BLUE_STRINGSET_GEOK = 90, + AF_BLUE_STRINGSET_GLAG = 97, + AF_BLUE_STRINGSET_GOTH = 102, + AF_BLUE_STRINGSET_GREK = 105, + AF_BLUE_STRINGSET_GUJR = 112, + AF_BLUE_STRINGSET_GURU = 118, + AF_BLUE_STRINGSET_HEBR = 124, + AF_BLUE_STRINGSET_KNDA = 128, + AF_BLUE_STRINGSET_KALI = 131, + AF_BLUE_STRINGSET_KHMR = 137, + AF_BLUE_STRINGSET_KHMS = 143, + AF_BLUE_STRINGSET_LAO = 146, + AF_BLUE_STRINGSET_LATN = 152, + AF_BLUE_STRINGSET_LATB = 159, + AF_BLUE_STRINGSET_LATP = 166, + AF_BLUE_STRINGSET_LISU = 173, + AF_BLUE_STRINGSET_MLYM = 176, + AF_BLUE_STRINGSET_MEDF = 179, + AF_BLUE_STRINGSET_MONG = 187, + AF_BLUE_STRINGSET_MYMR = 190, + AF_BLUE_STRINGSET_NKOO = 195, + AF_BLUE_STRINGSET_NONE = 200, + AF_BLUE_STRINGSET_OLCK = 201, + AF_BLUE_STRINGSET_ORKH = 204, + AF_BLUE_STRINGSET_OSGE = 207, + AF_BLUE_STRINGSET_OSMA = 215, + AF_BLUE_STRINGSET_ROHG = 218, + AF_BLUE_STRINGSET_SAUR = 222, + AF_BLUE_STRINGSET_SHAW = 225, + AF_BLUE_STRINGSET_SINH = 231, + AF_BLUE_STRINGSET_SUND = 235, + AF_BLUE_STRINGSET_TAML = 239, + AF_BLUE_STRINGSET_TAVT = 242, + AF_BLUE_STRINGSET_TELU = 245, + AF_BLUE_STRINGSET_THAI = 248, + AF_BLUE_STRINGSET_TFNG = 256, + AF_BLUE_STRINGSET_VAII = 259, + af_blue_2_1 = 262, +#ifdef AF_CONFIG_OPTION_CJK + AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, + af_blue_2_1_1 = af_blue_2_1 + 2, +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + af_blue_2_1_2 = af_blue_2_1_1 + 2, +#else + af_blue_2_1_2 = af_blue_2_1_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + af_blue_2_2 = af_blue_2_1_2 + 1, +#else + af_blue_2_2 = af_blue_2_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK */ + + + AF_BLUE_STRINGSET_MAX /* do not remove */ + + } AF_Blue_Stringset; + + + typedef struct AF_Blue_StringRec_ + { + AF_Blue_String string; + FT_UShort properties; + + } AF_Blue_StringRec; + + + FT_LOCAL_ARRAY( AF_Blue_StringRec ) + af_blue_stringsets[]; + +/* */ + +FT_END_HEADER + + +#endif /* AFBLUE_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afblue.hin b/external/freetype/src/autofit/afblue.hin new file mode 100644 index 000000000..6a31298e6 --- /dev/null +++ b/external/freetype/src/autofit/afblue.hin @@ -0,0 +1,146 @@ +/**************************************************************************** + * + * afblue.h + * + * Auto-fitter data for blue strings (specification). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFBLUE_H_ +#define AFBLUE_H_ + + +FT_BEGIN_HEADER + + + /* an auxiliary macro to decode a UTF-8 character -- since we only use */ + /* hard-coded, self-converted data, no error checking is performed */ +#define GET_UTF8_CHAR( ch, p ) \ + do \ + { \ + ch = (unsigned char)*p++; \ + if ( ch >= 0x80 ) \ + { \ + FT_UInt len_; \ + \ + \ + if ( ch < 0xE0 ) \ + { \ + len_ = 1; \ + ch &= 0x1F; \ + } \ + else if ( ch < 0xF0 ) \ + { \ + len_ = 2; \ + ch &= 0x0F; \ + } \ + else \ + { \ + len_ = 3; \ + ch &= 0x07; \ + } \ + \ + for ( ; len_ > 0; len_-- ) \ + ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ + } \ + } while ( 0 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* At the bottommost level, we define strings for finding blue zones. */ + + +#define AF_BLUE_STRING_MAX_LEN @AF_BLUE_STRING_MAX_LEN@ + + /* The AF_Blue_String enumeration values are offsets into the */ + /* `af_blue_strings' array. */ + + typedef enum AF_Blue_String_ + { +@AF_BLUE_STRING_ENUM@ + + AF_BLUE_STRING_MAX /* do not remove */ + + } AF_Blue_String; + + + FT_LOCAL_ARRAY( char ) + af_blue_strings[]; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S E T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* The next level is to group blue strings into style-specific sets. */ + + + /* Properties are specific to a writing system. We assume that a given */ + /* blue string can't be used in more than a single writing system, which */ + /* is a safe bet. */ +#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 ) +#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 ) +#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 ) +#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 ) + +#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ +#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP + + +#define AF_BLUE_STRINGSET_MAX_LEN @AF_BLUE_STRINGSET_MAX_LEN@ + + /* The AF_Blue_Stringset enumeration values are offsets into the */ + /* `af_blue_stringsets' array. */ + + typedef enum AF_Blue_Stringset_ + { +@AF_BLUE_STRINGSET_ENUM@ + + AF_BLUE_STRINGSET_MAX /* do not remove */ + + } AF_Blue_Stringset; + + + typedef struct AF_Blue_StringRec_ + { + AF_Blue_String string; + FT_UShort properties; + + } AF_Blue_StringRec; + + + FT_LOCAL_ARRAY( AF_Blue_StringRec ) + af_blue_stringsets[]; + +/* */ + +FT_END_HEADER + + +#endif /* AFBLUE_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afcjk.c b/external/freetype/src/autofit/afcjk.c new file mode 100644 index 000000000..f414289ad --- /dev/null +++ b/external/freetype/src/autofit/afcjk.c @@ -0,0 +1,2383 @@ +/**************************************************************************** + * + * afcjk.c + * + * Auto-fitter hinting routines for CJK writing system (body). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /* + * The algorithm is based on akito's autohint patch, archived at + * + * https://web.archive.org/web/20051219160454/http://www.kde.gr.jp:80/~akito/patch/freetype2/2.1.7/ + * + */ + +#include <freetype/ftadvanc.h> +#include <freetype/internal/ftdebug.h> + +#include "afglobal.h" +#include "aflatin.h" +#include "afcjk.h" + + +#ifdef AF_CONFIG_OPTION_CJK + +#undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + +#include "aferrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT afcjk + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Basically the Latin version with AF_CJKMetrics */ + /* to replace AF_LatinMetrics. */ + + FT_LOCAL_DEF( void ) + af_cjk_metrics_init_widths( AF_CJKMetrics metrics, + FT_Face face ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + FT_TRACE5(( "\n" )); + FT_TRACE5(( "cjk standard widths computation (style `%s')\n", + af_style_names[metrics->root.style_class->style] )); + FT_TRACE5(( "===================================================\n" )); + FT_TRACE5(( "\n" )); + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_ULong glyph_index; + int dim; + AF_CJKMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + AF_StyleClass style_class = metrics->root.style_class; + AF_ScriptClass script_class = af_script_classes[style_class->script]; + + /* If HarfBuzz is not available, we need a pointer to a single */ + /* unsigned long value. */ +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + void* shaper_buf; +#else + FT_ULong shaper_buf_; + void* shaper_buf = &shaper_buf_; +#endif + + const char* p; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_ULong ch = 0; +#endif + + p = script_class->standard_charstring; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + shaper_buf = af_shaper_buf_create( face ); +#endif + + /* We check a list of standard characters. The first match wins. */ + + glyph_index = 0; + while ( *p ) + { + unsigned int num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + /* otherwise exit loop if we have a result */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + NULL, + NULL ); + if ( glyph_index ) + break; + } + + af_shaper_buf_destroy( face, shaper_buf ); + + if ( !glyph_index ) + goto Exit; + + if ( !glyph_index ) + goto Exit; + + FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n", + ch, glyph_index )); + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + + scaler->x_scale = 0x10000L; + scaler->y_scale = 0x10000L; + scaler->x_delta = 0; + scaler->y_delta = 0; + + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_CJKAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + /* + * We assume that the glyphs selected for the stem width + * computation are `featureless' enough so that the linking + * algorithm works fine without adjustments of its scoring + * function. + */ + af_latin_hints_link_segments( hints, + 0, + NULL, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_CJK_MAX_WIDTHS ) + axis->widths[num_widths++].org = dist; + } + } + + /* this also replaces multiple almost identical stem widths */ + /* with a single one (the value 100 is heuristic) */ + af_sort_and_quantize_widths( &num_widths, axis->widths, + dummy->units_per_em / 100 ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_CJKAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + FT_TRACE5(( "%s widths:\n", + dim == AF_DIMENSION_VERT ? "horizontal" + : "vertical" )); + + FT_TRACE5(( " %ld (standard)", axis->standard_width )); + for ( i = 1; i < axis->width_count; i++ ) + FT_TRACE5(( " %ld", axis->widths[i].org )); + + FT_TRACE5(( "\n" )); + } +#endif + } + } + + FT_TRACE5(( "\n" )); + + af_glyph_hints_done( hints ); + } + + + /* Find all blue zones. */ + + static void + af_cjk_metrics_init_blues( AF_CJKMetrics metrics, + FT_Face face ) + { + FT_Pos fills[AF_BLUE_STRING_MAX_LEN]; + FT_Pos flats[AF_BLUE_STRING_MAX_LEN]; + + FT_UInt num_fills; + FT_UInt num_flats; + + FT_Bool fill; + + AF_CJKBlue blue; + FT_Error error; + AF_CJKAxis axis; + FT_Outline outline; + + AF_StyleClass sc = metrics->root.style_class; + + AF_Blue_Stringset bss = sc->blue_stringset; + const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; + + /* If HarfBuzz is not available, we need a pointer to a single */ + /* unsigned long value. */ +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + void* shaper_buf; +#else + FT_ULong shaper_buf_; + void* shaper_buf = &shaper_buf_; +#endif + + + /* we walk over the blue character strings as specified in the */ + /* style's entry in the `af_blue_stringset' array, computing its */ + /* extremum points (depending on the string properties) */ + + FT_TRACE5(( "cjk blue zones computation\n" )); + FT_TRACE5(( "==========================\n" )); + FT_TRACE5(( "\n" )); + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + shaper_buf = af_shaper_buf_create( face ); +#endif + + for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) + { + const char* p = &af_blue_strings[bs->string]; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) + axis = &metrics->axis[AF_DIMENSION_HORZ]; + else + axis = &metrics->axis[AF_DIMENSION_VERT]; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_String* cjk_blue_name[4] = + { + (FT_String*)"bottom", /* -- , -- */ + (FT_String*)"top", /* -- , TOP */ + (FT_String*)"left", /* HORIZ, -- */ + (FT_String*)"right" /* HORIZ, TOP */ + }; + + + FT_TRACE5(( "blue zone %d (%s):\n", + axis->blue_count, + cjk_blue_name[AF_CJK_IS_HORIZ_BLUE( bs ) | + AF_CJK_IS_TOP_BLUE( bs ) ] )); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + num_fills = 0; + num_flats = 0; + + fill = 1; /* start with characters that define fill values */ + FT_TRACE5(( " [overshoot values]\n" )); + + while ( *p ) + { + FT_ULong glyph_index; + FT_Pos best_pos; /* same as points.y or points.x, resp. */ + FT_Int best_point; + FT_Vector* points; + + unsigned int num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; + FT_ULong ch; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + /* switch to characters that define flat values */ + if ( *p == '|' ) + { + fill = 0; + FT_TRACE5(( " [reference values]\n" )); + p++; + continue; + } + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + NULL, + NULL ); + if ( glyph_index == 0 ) + { + FT_TRACE5(( " U+%04lX unavailable\n", ch )); + continue; + } + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + outline = face->glyph->outline; + if ( error || outline.n_points <= 2 ) + { + FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); + continue; + } + + /* now compute min or max point indices and coordinates */ + points = outline.points; + best_point = -1; + best_pos = 0; /* make compiler happy */ + + { + FT_Int nn; + FT_Int pp, first, last; + + + last = -1; + for ( nn = 0; nn < outline.n_contours; nn++ ) + { + first = last + 1; + last = outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last <= first ) + continue; + + if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) + { + if ( AF_CJK_IS_RIGHT_BLUE( bs ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].x > best_pos ) + { + best_point = pp; + best_pos = points[pp].x; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].x < best_pos ) + { + best_point = pp; + best_pos = points[pp].x; + } + } + } + else + { + if ( AF_CJK_IS_TOP_BLUE( bs ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_pos ) + { + best_point = pp; + best_pos = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_pos ) + { + best_point = pp; + best_pos = points[pp].y; + } + } + } + } + + FT_TRACE5(( " U+%04lX: best_pos = %5ld\n", ch, best_pos )); + } + + if ( fill ) + fills[num_fills++] = best_pos; + else + flats[num_flats++] = best_pos; + + } /* end while loop */ + + if ( num_flats == 0 && num_fills == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + FT_TRACE5(( " empty\n" )); + continue; + } + + /* we have computed the contents of the `fill' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_fills, fills ); + af_sort_pos( num_flats, flats ); + + blue = &axis->blues[axis->blue_count]; + blue_ref = &blue->ref.org; + blue_shoot = &blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = fills[num_fills / 2]; + } + else if ( num_fills == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = fills[num_fills / 2]; + *blue_shoot = flats[num_flats / 2]; + } + + /* make sure blue_ref >= blue_shoot for top/right or */ + /* vice versa for bottom/left */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool under_ref = FT_BOOL( shoot < ref ); + + + /* AF_CJK_IS_TOP_BLUE covers `right' and `top' */ + if ( AF_CJK_IS_TOP_BLUE( bs ) ^ under_ref ) + { + *blue_ref = + *blue_shoot = ( shoot + ref ) / 2; + + FT_TRACE5(( " [reference smaller than overshoot," + " taking mean value]\n" )); + } + } + + blue->flags = 0; + if ( AF_CJK_IS_TOP_BLUE( bs ) ) + blue->flags |= AF_CJK_BLUE_TOP; + + FT_TRACE5(( " -> reference = %ld\n", *blue_ref )); + FT_TRACE5(( " overshoot = %ld\n", *blue_shoot )); + + } /* end for loop */ + + af_shaper_buf_destroy( face, shaper_buf ); + + FT_TRACE5(( "\n" )); + + return; + } + + + /* Basically the Latin version with type AF_CJKMetrics for metrics. */ + + FT_LOCAL_DEF( void ) + af_cjk_metrics_check_digits( AF_CJKMetrics metrics, + FT_Face face ) + { + FT_Bool started = 0, same_width = 1; + FT_Long advance = 0, old_advance = 0; + + /* If HarfBuzz is not available, we need a pointer to a single */ + /* unsigned long value. */ +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + void* shaper_buf; +#else + FT_ULong shaper_buf_; + void* shaper_buf = &shaper_buf_; +#endif + + /* in all supported charmaps, digits have character codes 0x30-0x39 */ + const char digits[] = "0 1 2 3 4 5 6 7 8 9"; + const char* p; + + + p = digits; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + shaper_buf = af_shaper_buf_create( face ); +#endif + + while ( *p ) + { + FT_ULong glyph_index; + unsigned int num_idx; + + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + &advance, + NULL ); + if ( !glyph_index ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + af_shaper_buf_destroy( face, shaper_buf ); + + metrics->root.digits_have_same_width = same_width; + } + + + /* Initialize global metrics. */ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_metrics_init( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Face face ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + { + af_cjk_metrics_init_widths( metrics, face ); + af_cjk_metrics_init_blues( metrics, face ); + af_cjk_metrics_check_digits( metrics, face ); + } + + face->charmap = oldmap; + return FT_Err_Ok; + } + + + /* Adjust scaling value, then scale and shift widths */ + /* and blue zones (if applicable) for given dimension. */ + + static void + af_cjk_metrics_scale_dim( AF_CJKMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_CJKAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + axis->scale = scale; + axis->delta = delta; + + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_CJKBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_CJK_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + + /* shoot is under shoot for cjk */ + delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + FT_TRACE5(( "delta: %ld", delta1 )); + if ( delta2 < 32 ) + delta2 = 0; +#if 0 + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); +#endif + else + delta2 = FT_PIX_ROUND( delta2 ); + FT_TRACE5(( "/%ld\n", delta2 )); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->shoot.fit = blue->ref.fit - delta2; + + FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]:\n", + ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V', + nn, blue->ref.org, blue->shoot.org )); + FT_TRACE5(( " ref: cur=%.2f fit=%.2f\n", + (double)blue->ref.cur / 64, + (double)blue->ref.fit / 64 )); + FT_TRACE5(( " shoot: cur=%.2f fit=%.2f\n", + (double)blue->shoot.cur / 64, + (double)blue->shoot.fit / 64 )); + + blue->flags |= AF_CJK_BLUE_ACTIVE; + } + } + } + + + /* Scale global values in both directions. */ + + FT_LOCAL_DEF( void ) + af_cjk_metrics_scale( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + AF_Scaler scaler ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + + /* we copy the whole structure since the x and y scaling values */ + /* are not modified, contrary to e.g. the `latin' auto-hinter */ + metrics->root.scaler = *scaler; + + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + FT_CALLBACK_DEF( void ) + af_cjk_get_standard_widths( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Walk over all contours and compute its segments. */ + + static FT_Error + af_cjk_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); + FT_Error error; + AF_Segment seg; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( error ) + return error; + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Point pt = seg->first; + AF_Point last = seg->last; + FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; + FT_UInt f1; + + + seg->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = pt->flags & AF_FLAG_CONTROL; + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + seg->flags |= AF_EDGE_ROUND; + } + } + + return FT_Err_Ok; + } + + + static void + af_cjk_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); + AF_Direction major_dir = axis->major_dir; + AF_Segment seg1, seg2; + FT_Pos len_threshold; + FT_Pos dist_threshold; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + + dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + if ( seg1->dir != major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos dist = seg2->pos - seg1->pos; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + if ( dist * 8 < seg1->score * 9 && + ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) + { + seg1->score = dist; + seg1->len = len; + seg1->link = seg2; + } + + if ( dist * 8 < seg2->score * 9 && + ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) + { + seg2->score = dist; + seg2->len = len; + seg2->link = seg1; + } + } + } + } + } + + /* + * now compute the `serif' segments + * + * In Hanzi, some strokes are wider on one or both of the ends. + * We either identify the stems on the ends as serifs or remove + * the linkage, depending on the length of the stems. + * + */ + + { + AF_Segment link1, link2; + + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + link1 = seg1->link; + if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) + continue; + + if ( seg1->score >= dist_threshold ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + if ( seg2->pos > seg1->pos || seg1 == seg2 ) + continue; + + link2 = seg2->link; + if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) + continue; + + if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) + continue; + + if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) + continue; + + /* seg2 < seg1 < link1 < link2 */ + + if ( seg1->len >= seg2->len * 3 ) + { + AF_Segment seg; + + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Segment link = seg->link; + + + if ( link == seg2 ) + { + seg->link = NULL; + seg->serif = link1; + } + else if ( link == link2 ) + { + seg->link = NULL; + seg->serif = seg1; + } + } + } + else + { + seg1->link = link1->link = NULL; + + break; + } + } + } + } + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = NULL; + + if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) + seg1->serif = seg2->link; + } + } + } + } + + + static FT_Error + af_cjk_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = FT_Err_Ok; + FT_Memory memory = hints->memory; + AF_CJKAxis laxis = &((AF_CJKMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); + AF_Segment seg; + + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + /********************************************************************** + * + * We begin by generating a sorted table of edges for the current + * direction. To do so, we simply scan each segment and try to find + * an edge in our table that corresponds to its position. + * + * If no edge is found, we create and insert a new edge in the + * sorted table. Otherwise, we simply add the segment to the edge's + * list which is then processed in the second step to compute the + * edge's properties. + * + * Note that the edges table is sorted along the segment/edge + * position. + * + */ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = FT_DivFix( 64 / 4, scale ); + else + edge_distance_threshold = laxis->edge_distance_threshold; + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_Pos best = 0xFFFFU; + FT_UInt ee; + + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + if ( edge->dir != seg->dir ) + continue; + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && dist < best ) + { + AF_Segment link = seg->link; + + + /* check whether all linked segments of the candidate edge */ + /* can make a single edge. */ + if ( link ) + { + AF_Segment seg1 = edge->first; + FT_Pos dist2 = 0; + + + do + { + AF_Segment link1 = seg1->link; + + + if ( link1 ) + { + dist2 = AF_SEGMENT_DIST( link, link1 ); + if ( dist2 >= edge_distance_threshold ) + break; + } + + } while ( ( seg1 = seg1->edge_next ) != edge->first ); + + if ( dist2 >= edge_distance_threshold ) + continue; + } + + best = dist; + found = edge; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, 0, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->dir = seg->dir; + edge->fpos = seg->pos; + edge->opos = FT_MulFix( seg->pos, scale ); + edge->pos = edge->opos; + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /******************************************************************* + * + * Good, we now compute each edge's properties according to the + * segments found on its position. Basically, these are + * + * - the edge's main direction + * - stem edge, serif edge or both (which defaults to stem then) + * - rounded edge, straight or both (which defaults to straight) + * - link for edge + * + */ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + + + seg = edge->first; + if ( !seg ) + goto Skip_Loop; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = FT_BOOL( seg->serif && seg->serif->edge != edge ); + + if ( seg->link || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = AF_SEGMENT_DIST( seg, seg2 ); + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + Skip_Loop: + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = NULL; + } + } + + Exit: + return error; + } + + + /* Detect segments and edges for given dimension. */ + + static FT_Error + af_cjk_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_cjk_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_cjk_hints_link_segments( hints, dim ); + + error = af_cjk_hints_compute_edges( hints, dim ); + } + return error; + } + + + /* Compute all edges which lie within blue zones. */ + + static void + af_cjk_hints_compute_blue_edges( AF_GlyphHints hints, + AF_CJKMetrics metrics, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edge, axis->num_edges ); + AF_CJKAxis cjk = &metrics->axis[dim]; + FT_Fixed scale = cjk->scale; + FT_Pos best_dist0; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist0 > 64 / 2 ) /* maximum 1/2 pixel */ + best_dist0 = 64 / 2; + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* If the distant between an edge and a blue zone is shorter than */ + /* best_dist0, set the blue zone for the edge. Then search for */ + /* the blue zone with the smallest best_dist to the edge. */ + + for ( ; edge < edge_limit; edge++ ) + { + FT_UInt bb; + AF_Width best_blue = NULL; + FT_Pos best_dist = best_dist0; + + + for ( bb = 0; bb < cjk->blue_count; bb++ ) + { + AF_CJKBlue blue = cjk->blues + bb; + FT_Bool is_top_right_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_CJK_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_right_blue = + (FT_Byte)( ( blue->flags & AF_CJK_BLUE_TOP ) != 0 ); + is_major_dir = + FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_right_blue ^ is_major_dir ) + { + FT_Pos dist; + AF_Width compare; + + + /* Compare the edge to the closest blue zone type */ + if ( FT_ABS( edge->fpos - blue->ref.org ) > + FT_ABS( edge->fpos - blue->shoot.org ) ) + compare = &blue->shoot; + else + compare = &blue->ref; + + dist = edge->fpos - compare->org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = compare; + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + /* Initalize hinting engine. */ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics_ ) /* AF_CJKMetrics */ + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); + + /* + * correct x_scale and y_scale when needed, since they may have + * been modified af_cjk_scale_dim above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels unless in `light' or `lcd' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* Snap a given width in scaled coordinates to one of the */ + /* current standard widths. */ + + static FT_Pos + af_cjk_snap_width( AF_Width widths, + FT_UInt count, + FT_Pos width ) + { + FT_UInt n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* Compute the snapped width of a given stem. */ + /* There is a lot of voodoo in this function; changing the hard-coded */ + /* parameters influence the whole hinting process. */ + + static FT_Pos + af_cjk_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + FT_UInt base_flags, + FT_UInt stem_flags ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)hints->metrics; + AF_CJKAxis axis = &metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Bool vertical = FT_BOOL( dim == AF_DIMENSION_VERT ); + + FT_UNUSED( base_flags ); + FT_UNUSED( stem_flags ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + if ( axis->width_count > 0 ) + { + if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 54 ) + dist += ( 54 - dist ) / 2; + else if ( dist < 3 * 64 ) + { + FT_Pos delta; + + + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + else if ( delta < 22 ) + dist += 10; + else if ( delta < 42 ) + dist += delta; + else if ( delta < 54 ) + dist += 54; + else + dist += delta; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + dist = ( dist + 22 ) & ~63; + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* Align one stem edge relative to the previous stem edge. */ + + static void + af_cjk_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_cjk_compute_stem_width( hints, dim, dist, + base_edge->flags, + stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + FT_TRACE5(( " CJKLINK: edge %td @%d (opos=%.2f) linked to %.2f," + " dist was %.2f, now %.2f\n", + stem_edge - hints->axis[dim].edges, stem_edge->fpos, + (double)stem_edge->opos / 64, + (double)stem_edge->pos / 64, + (double)dist / 64, + (double)fitted_width / 64 )); + } + + + /* Shift the coordinates of the `serif' edge by the same amount */ + /* as the corresponding `base' edge has been moved already. */ + + static void + af_cjk_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 +#define AF_LIGHT_MODE_MAX_VERT_GAP 15 +#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 + + + static FT_Pos + af_hint_normal_stem( AF_GlyphHints hints, + AF_Edge edge, + AF_Edge edge2, + FT_Pos anchor, + AF_Dimension dim ) + { + FT_Pos org_len, cur_len, org_center; + FT_Pos cur_pos1, cur_pos2; + FT_Pos d_off1, u_off1, d_off2, u_off2, delta; + FT_Pos offset; + FT_Pos threshold = 64; + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( ( edge->flags & AF_EDGE_ROUND ) && + ( edge2->flags & AF_EDGE_ROUND ) ) + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; + } + else + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; + } + } + + org_len = edge2->opos - edge->opos; + cur_len = af_cjk_compute_stem_width( hints, dim, org_len, + edge->flags, + edge2->flags ); + + org_center = ( edge->opos + edge2->opos ) / 2 + anchor; + cur_pos1 = org_center - cur_len / 2; + cur_pos2 = cur_pos1 + cur_len; + d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); + d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); + u_off1 = 64 - d_off1; + u_off2 = 64 - d_off2; + delta = 0; + + + if ( d_off1 == 0 || d_off2 == 0 ) + goto Exit; + + if ( cur_len <= threshold ) + { + if ( d_off2 < cur_len ) + { + if ( u_off1 <= d_off2 ) + delta = u_off1; + else + delta = -d_off2; + } + + goto Exit; + } + + if ( threshold < 64 ) + { + if ( d_off1 >= threshold || u_off1 >= threshold || + d_off2 >= threshold || u_off2 >= threshold ) + goto Exit; + } + + offset = cur_len & 63; + + if ( offset < 32 ) + { + if ( u_off1 <= offset || d_off2 <= offset ) + goto Exit; + } + else + offset = 64 - threshold; + + d_off1 = threshold - u_off1; + u_off1 = u_off1 - offset; + u_off2 = threshold - d_off2; + d_off2 = d_off2 - offset; + + if ( d_off1 <= u_off1 ) + u_off1 = -d_off1; + + if ( d_off2 <= u_off2 ) + u_off2 = -d_off2; + + if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) + delta = u_off1; + else + delta = u_off2; + + Exit: + +#if 1 + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = AF_LIGHT_MODE_MAX_DELTA_ABS; + else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; + } +#endif + + cur_pos1 += delta; + + if ( edge->opos < edge2->opos ) + { + edge->pos = cur_pos1; + edge2->pos = cur_pos1 + cur_len; + } + else + { + edge->pos = cur_pos1 + cur_len; + edge2->pos = cur_pos1; + } + + return delta; + } + + + /* The main grid-fitting routine. */ + + static void + af_cjk_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = NULL; + FT_Pos delta = 0; + FT_Int skipped = 0; + FT_Bool has_last_stem = FALSE; + FT_Pos last_stem_pos = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt num_actions = 0; +#endif + + + FT_TRACE5(( "cjk %s edge hinting (style `%s')\n", + dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", + af_style_names[hints->metrics->style_class->style] )); + + /* we begin by aligning all stems relative to the blue zone */ + + if ( AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " CJKBLUE: edge %td @%d (opos=%.2f) snapped to %.2f," + " was %.2f\n", + edge1 - edges, edge1->fpos, (double)edge1->opos / 64, + (double)blue->fit / 64, (double)edge1->pos / 64 )); + + num_actions++; +#endif + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_cjk_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we align all stem edges. */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + skipped++; + continue; + } + + /* Some CJK characters have so many stems that + * the hinter is likely to merge two adjacent ones. + * To solve this problem, if either edge of a stem + * is too close to the previous one, we avoid + * aligning the two edges, but rather interpolate + * their locations at the end of this function in + * order to preserve the space between the stems. + */ + if ( has_last_stem && + ( edge->pos < last_stem_pos + 64 || + edge2->pos < last_stem_pos + 64 ) ) + { + skipped++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + FT_TRACE5(( "ASSERTION FAILED for edge %td\n", edge2 - edges )); + + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + + continue; + } + + if ( edge2 < edge ) + { + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + + /* We rarely reaches here it seems; + * usually the two edges belonging + * to one stem are marked as DONE together + */ + has_last_stem = TRUE; + last_stem_pos = edge->pos; + continue; + } + + if ( dim != AF_DIMENSION_VERT && !anchor ) + { + +#if 0 + if ( fixedpitch ) + { + AF_Edge left = edge; + AF_Edge right = edge_limit - 1; + AF_EdgeRec left1, left2, right1, right2; + FT_Pos target, center1, center2; + FT_Pos delta1, delta2, d1, d2; + + + while ( right > left && !right->link ) + right--; + + left1 = *left; + left2 = *left->link; + right1 = *right->link; + right2 = *right; + + delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; + target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; + + delta1 = delta; + delta1 += af_hint_normal_stem( hints, left, left->link, + delta1, 0 ); + + if ( left->link != right ) + af_hint_normal_stem( hints, right->link, right, delta1, 0 ); + + center1 = left->pos + ( right->pos - left->pos ) / 2; + + if ( center1 >= target ) + delta2 = delta - 32; + else + delta2 = delta + 32; + + delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); + + if ( delta1 != delta2 ) + { + if ( left->link != right ) + af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); + + center2 = left1.pos + ( right2.pos - left1.pos ) / 2; + + d1 = center1 - target; + d2 = center2 - target; + + if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) + { + left->pos = left1.pos; + left->link->pos = left2.pos; + + if ( left->link != right ) + { + right->link->pos = right1.pos; + right->pos = right2.pos; + } + + delta1 = delta2; + } + } + + delta = delta1; + right->link->flags |= AF_EDGE_DONE; + right->flags |= AF_EDGE_DONE; + } + else + +#endif /* 0 */ + + delta = af_hint_normal_stem( hints, edge, edge2, 0, + AF_DIMENSION_HORZ ); + } + else + af_hint_normal_stem( hints, edge, edge2, delta, dim ); + +#if 0 + printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", + edge - edges, edge2 - edges, + (double)( edge->pos - edge->opos ) / 64, + (double)( edge2->pos - edge2->opos ) / 64 ); +#endif + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + has_last_stem = TRUE; + last_stem_pos = edge2->pos; + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( edge1->link == edge1 + 1 && + edge2->link == edge2 + 1 && + edge3->link == edge3 + 1 && span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( !skipped ) + goto Exit; + + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & AF_EDGE_DONE ) + continue; + + if ( edge->serif ) + { + af_cjk_align_serif_edge( hints, edge->serif, edge ); + edge->flags |= AF_EDGE_DONE; + skipped--; + } + } + + if ( !skipped ) + goto Exit; + + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge before, after; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + before = after = edge; + + while ( --before >= edges ) + if ( before->flags & AF_EDGE_DONE ) + break; + + while ( ++after < edge_limit ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges || after < edge_limit ) + { + if ( before < edges ) + af_cjk_align_serif_edge( hints, after, edge ); + else if ( after >= edge_limit ) + af_cjk_align_serif_edge( hints, before, edge ); + else + { + if ( after->fpos == before->fpos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->fpos - before->fpos, + after->pos - before->pos, + after->fpos - before->fpos ); + } + } + } + + Exit: + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !num_actions ) + FT_TRACE5(( " (none)\n" )); + FT_TRACE5(( "\n" )); +#endif + + return; + } + + + static void + af_cjk_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); + AF_Edge edge; + FT_Bool snapping; + + + snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && + AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || + ( dim == AF_DIMENSION_VERT && + AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); + + for ( edge = edges; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AF_Segment seg = edge->first; + + + if ( snapping ) + { + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + else + { + FT_Pos delta = edge->pos - edge->opos; + + + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x += delta; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y += delta; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + } + + + /* Apply the complete hinting algorithm to a CJK glyph. */ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics_ ) /* AF_CJKMetrics */ + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + FT_Error error; + int dim; + + FT_UNUSED( metrics ); + FT_UNUSED( glyph_index ); + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + + af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_HORZ ); + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_VERT ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_cjk_hint_edges( hints, (AF_Dimension)dim ); + af_cjk_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_cjk_writing_system_class, + + AF_WRITING_SYSTEM_CJK, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_cjk_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_cjk_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_cjk_hints_apply /* style_hints_apply */ + ) + + +#else /* !AF_CONFIG_OPTION_CJK */ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_cjk_writing_system_class, + + AF_WRITING_SYSTEM_CJK, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ + ) + + +#endif /* !AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/external/freetype/src/autofit/afcjk.h b/external/freetype/src/autofit/afcjk.h new file mode 100644 index 000000000..f380ef6e0 --- /dev/null +++ b/external/freetype/src/autofit/afcjk.h @@ -0,0 +1,141 @@ +/**************************************************************************** + * + * afcjk.h + * + * Auto-fitter hinting routines for CJK writing system (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFCJK_H_ +#define AFCJK_H_ + +#include "afhints.h" +#include "aflatin.h" + + +FT_BEGIN_HEADER + + + /* the CJK-specific writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * CJK glyphs tend to fill the square. So we have both vertical and + * horizontal blue zones. But some glyphs have flat bounding strokes that + * leave some space between neighbour glyphs. + */ + +#define AF_CJK_IS_TOP_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP ) +#define AF_CJK_IS_HORIZ_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ ) +#define AF_CJK_IS_RIGHT_BLUE AF_CJK_IS_TOP_BLUE + +#define AF_CJK_MAX_WIDTHS 16 + + +#define AF_CJK_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ +#define AF_CJK_BLUE_TOP ( 1U << 1 ) /* result of AF_CJK_IS_TOP_BLUE */ +#define AF_CJK_BLUE_ADJUSTMENT ( 1U << 2 ) /* used for scale adjustment */ + /* optimization */ + + + typedef struct AF_CJKBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; /* undershoot */ + FT_UInt flags; + + } AF_CJKBlueRec, *AF_CJKBlue; + + + typedef struct AF_CJKAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; /* number of used widths */ + AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ + FT_Pos edge_distance_threshold; /* used for creating edges */ + FT_Pos standard_width; /* the default stem thickness */ + FT_Bool extra_light; /* is standard width very light? */ + + /* used for horizontal metrics too for CJK */ + FT_Bool control_overshoot; + FT_UInt blue_count; + AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_CJKAxisRec, *AF_CJKAxis; + + + typedef struct AF_CJKMetricsRec_ + { + AF_StyleMetricsRec root; + FT_UInt units_per_em; + AF_CJKAxisRec axis[AF_DIMENSION_MAX]; + + } AF_CJKMetricsRec, *AF_CJKMetrics; + + +#ifdef AF_CONFIG_OPTION_CJK + FT_LOCAL( FT_Error ) + af_cjk_metrics_init( AF_StyleMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_scale( AF_StyleMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ); + + /* shared; called from afindic.c */ + FT_LOCAL( void ) + af_cjk_metrics_check_digits( AF_CJKMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_init_widths( AF_CJKMetrics metrics, + FT_Face face ); +#endif /* AF_CONFIG_OPTION_CJK */ + + +/* */ + +FT_END_HEADER + +#endif /* AFCJK_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afcover.h b/external/freetype/src/autofit/afcover.h new file mode 100644 index 000000000..102ed4278 --- /dev/null +++ b/external/freetype/src/autofit/afcover.h @@ -0,0 +1,105 @@ +/**************************************************************************** + * + * afcover.h + * + * Auto-fitter coverages (specification only). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* This header file can be included multiple times. */ + /* Define `COVERAGE' as needed. */ + + + /* Add new coverages here. The first and second arguments are the */ + /* coverage name in lowercase and uppercase, respectively, followed */ + /* by a description string. The last four arguments are the four */ + /* characters defining the corresponding OpenType feature. */ + +#if 0 + /* XXX: It's not possible to define blue zone characters in advance. */ + COVERAGE( alternative_fractions, ALTERNATIVE_FRACTIONS, + "alternative fractions", + 'a', 'f', 'r', 'c' ) +#endif + + COVERAGE( petite_capitals_from_capitals, PETITE_CAPITALS_FROM_CAPITALS, + "petite capitals from capitals", + 'c', '2', 'c', 'p' ) + + COVERAGE( small_capitals_from_capitals, SMALL_CAPITALS_FROM_CAPITALS, + "small capitals from capitals", + 'c', '2', 's', 'c' ) + +#if 0 + /* XXX: Only digits are in this coverage, however, both normal style */ + /* and oldstyle representation forms are possible. */ + COVERAGE( denominators, DENOMINATORS, + "denominators", + 'd', 'n', 'o', 'm' ) +#endif + +#if 0 + /* XXX: It's not possible to define blue zone characters in advance. */ + COVERAGE( fractions, FRACTIONS, + "fractions", + 'f', 'r', 'a', 'c' ) +#endif + +#if 0 + /* XXX: Only digits are in this coverage, however, both normal style */ + /* and oldstyle representation forms are possible. */ + COVERAGE( numerators, NUMERATORS, + "numerators", + 'n', 'u', 'm', 'r' ) +#endif + + COVERAGE( ordinals, ORDINALS, + "ordinals", + 'o', 'r', 'd', 'n' ) + + COVERAGE( petite_capitals, PETITE_CAPITALS, + "petite capitals", + 'p', 'c', 'a', 'p' ) + + COVERAGE( ruby, RUBY, + "ruby", + 'r', 'u', 'b', 'y' ) + + COVERAGE( scientific_inferiors, SCIENTIFIC_INFERIORS, + "scientific inferiors", + 's', 'i', 'n', 'f' ) + + COVERAGE( small_capitals, SMALL_CAPITALS, + "small capitals", + 's', 'm', 'c', 'p' ) + + COVERAGE( subscript, SUBSCRIPT, + "subscript", + 's', 'u', 'b', 's' ) + + COVERAGE( superscript, SUPERSCRIPT, + "superscript", + 's', 'u', 'p', 's' ) + + COVERAGE( titling, TITLING, + "titling", + 't', 'i', 't', 'l' ) + +#if 0 + /* to be always excluded */ + COVERAGE(nalt, 'n', 'a', 'l', 't'); /* Alternate Annotation Forms (?) */ + COVERAGE(ornm, 'o', 'r', 'n', 'm'); /* Ornaments (?) */ +#endif + + +/* END */ diff --git a/external/freetype/src/autofit/afdummy.c b/external/freetype/src/autofit/afdummy.c new file mode 100644 index 000000000..a4629b528 --- /dev/null +++ b/external/freetype/src/autofit/afdummy.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * + * afdummy.c + * + * Auto-fitter dummy routines to be used if no hinting should be + * performed (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "afdummy.h" +#include "afhints.h" +#include "aferrors.h" + + + static FT_Error + af_dummy_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics ) + { + af_glyph_hints_rescale( hints, metrics ); + + hints->x_scale = metrics->scaler.x_scale; + hints->y_scale = metrics->scaler.y_scale; + hints->x_delta = metrics->scaler.x_delta; + hints->y_delta = metrics->scaler.y_delta; + + return FT_Err_Ok; + } + + + static FT_Error + af_dummy_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ) + { + FT_Error error; + + FT_UNUSED( glyph_index ); + FT_UNUSED( metrics ); + + + error = af_glyph_hints_reload( hints, outline ); + if ( !error ) + af_glyph_hints_save( hints, outline ); + + return error; + } + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_dummy_writing_system_class, + + AF_WRITING_SYSTEM_DUMMY, + + sizeof ( AF_StyleMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_dummy_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_dummy_hints_apply /* style_hints_apply */ + ) + + +/* END */ diff --git a/external/freetype/src/autofit/afdummy.h b/external/freetype/src/autofit/afdummy.h new file mode 100644 index 000000000..a7af3f62c --- /dev/null +++ b/external/freetype/src/autofit/afdummy.h @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * afdummy.h + * + * Auto-fitter dummy routines to be used if no hinting should be + * performed (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFDUMMY_H_ +#define AFDUMMY_H_ + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + /* A dummy writing system used when no hinting should be performed. */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_dummy_writing_system_class ) + +/* */ + +FT_END_HEADER + + +#endif /* AFDUMMY_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/aferrors.h b/external/freetype/src/autofit/aferrors.h new file mode 100644 index 000000000..88faf05c9 --- /dev/null +++ b/external/freetype/src/autofit/aferrors.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * aferrors.h + * + * Autofitter error codes (specification only). + * + * Copyright (C) 2005-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the Autofitter error enumeration + * constants. + * + */ + +#ifndef AFERRORS_H_ +#define AFERRORS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX AF_Err_ +#define FT_ERR_BASE FT_Mod_Err_Autofit + +#include <freetype/fterrors.h> + +#endif /* AFERRORS_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afglobal.c b/external/freetype/src/autofit/afglobal.c new file mode 100644 index 000000000..b1957570f --- /dev/null +++ b/external/freetype/src/autofit/afglobal.c @@ -0,0 +1,513 @@ +/**************************************************************************** + * + * afglobal.c + * + * Auto-fitter routines to compute global hinting values (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "afglobal.h" +#include "afranges.h" +#include "afshaper.h" +#include "afws-decl.h" +#include <freetype/internal/ftdebug.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT afglobal + + +#include "aferrors.h" + + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + AF_DEFINE_SCRIPT_CLASS( \ + af_ ## s ## _script_class, \ + AF_SCRIPT_ ## S, \ + af_ ## s ## _uniranges, \ + af_ ## s ## _nonbase_uniranges, \ + AF_ ## H, \ + ss ) + +#include "afscript.h" + + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + AF_DEFINE_STYLE_CLASS( \ + af_ ## s ## _style_class, \ + AF_STYLE_ ## S, \ + ws, \ + sc, \ + ss, \ + c ) + +#include "afstyles.h" + + +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) \ + &af_ ## ws ## _writing_system_class, + + FT_LOCAL_ARRAY_DEF( AF_WritingSystemClass ) + af_writing_system_classes[] = + { + +#include "afws-iter.h" + + NULL /* do not remove */ + }; + + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + &af_ ## s ## _script_class, + + FT_LOCAL_ARRAY_DEF( AF_ScriptClass ) + af_script_classes[] = + { + +#include "afscript.h" + + NULL /* do not remove */ + }; + + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + &af_ ## s ## _style_class, + + FT_LOCAL_ARRAY_DEF( AF_StyleClass ) + af_style_classes[] = + { + +#include "afstyles.h" + + NULL /* do not remove */ + }; + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) #s, + + FT_LOCAL_ARRAY_DEF( char* ) + af_style_names[] = + { + +#include "afstyles.h" + + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /* Compute the style index of each glyph within a given face. */ + + static FT_Error + af_face_globals_compute_style_coverage( AF_FaceGlobals globals ) + { + FT_Error error; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_UShort* gstyles = globals->glyph_styles; + FT_UShort ss; + FT_UShort dflt = 0xFFFFU; /* a non-valid value */ + FT_UInt i; + + + /* the value AF_STYLE_UNASSIGNED means `uncovered glyph' */ + for ( i = 0; i < globals->glyph_count; i++ ) + gstyles[i] = AF_STYLE_UNASSIGNED; + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* + * Ignore this error; we simply use the fallback style. + * XXX: Shouldn't we rather disable hinting? + */ + error = FT_Err_Ok; + goto Exit; + } + + /* scan each style in a Unicode charmap */ + for ( ss = 0; af_style_classes[ss]; ss++ ) + { + AF_StyleClass style_class = + af_style_classes[ss]; + AF_ScriptClass script_class = + af_script_classes[style_class->script]; + AF_Script_UniRange range; + + + if ( !script_class->script_uni_ranges ) + continue; + + /* + * Scan all Unicode points in the range and set the corresponding + * glyph style index. + */ + if ( style_class->coverage == AF_COVERAGE_DEFAULT ) + { + if ( style_class->script == globals->module->default_script ) + dflt = ss; + + for ( range = script_class->script_uni_ranges; + range->first != 0; + range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) + gstyles[gindex] = ss; + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) + gstyles[gindex] = ss; + } + } + + /* do the same for the script's non-base characters */ + for ( range = script_class->script_uni_nonbase_ranges; + range->first != 0; + range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == ss ) + gstyles[gindex] |= AF_NONBASE; + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == ss ) + gstyles[gindex] |= AF_NONBASE; + } + } + } + else + { + /* get glyphs not directly addressable by cmap */ + af_shaper_get_coverage( globals, style_class, gstyles, 0 ); + } + } + + /* handle the remaining default OpenType features ... */ + for ( ss = 0; af_style_classes[ss]; ss++ ) + { + AF_StyleClass style_class = af_style_classes[ss]; + + + if ( style_class->coverage == AF_COVERAGE_DEFAULT ) + af_shaper_get_coverage( globals, style_class, gstyles, 0 ); + } + + /* ... and finally the default OpenType features of the default script */ + af_shaper_get_coverage( globals, af_style_classes[dflt], gstyles, 1 ); + + /* mark ASCII digits */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt gindex = FT_Get_Char_Index( face, i ); + + + if ( gindex != 0 && gindex < globals->glyph_count ) + gstyles[gindex] |= AF_DIGIT; + } + + Exit: + /* + * By default, all uncovered glyphs are set to the fallback style. + * XXX: Shouldn't we disable hinting or do something similar? + */ + if ( globals->module->fallback_style != AF_STYLE_UNASSIGNED ) + { + FT_UInt nn; + + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( ( gstyles[nn] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) + { + gstyles[nn] &= ~AF_STYLE_MASK; + gstyles[nn] |= globals->module->fallback_style; + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + + FT_TRACE4(( "\n" )); + FT_TRACE4(( "style coverage\n" )); + FT_TRACE4(( "==============\n" )); + FT_TRACE4(( "\n" )); + + for ( ss = 0; af_style_classes[ss]; ss++ ) + { + AF_StyleClass style_class = af_style_classes[ss]; + FT_UInt count = 0; + FT_UInt idx; + + + FT_TRACE4(( "%s:\n", af_style_names[style_class->style] )); + + for ( idx = 0; idx < globals->glyph_count; idx++ ) + { + if ( ( gstyles[idx] & AF_STYLE_MASK ) == style_class->style ) + { + if ( !( count % 10 ) ) + FT_TRACE4(( " " )); + + FT_TRACE4(( " %d", idx )); + count++; + + if ( !( count % 10 ) ) + FT_TRACE4(( "\n" )); + } + } + + if ( !count ) + FT_TRACE4(( " (none)\n" )); + if ( count % 10 ) + FT_TRACE4(( "\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + face->charmap = old_charmap; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals, + AF_Module module ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals = NULL; + + + memory = face->memory; + + /* we allocate an AF_FaceGlobals structure together */ + /* with the glyph_styles array */ + if ( FT_QALLOC( globals, + sizeof ( *globals ) + + (FT_ULong)face->num_glyphs * sizeof ( FT_UShort ) ) ) + goto Exit; + + FT_ZERO( &globals->metrics ); + + globals->face = face; + globals->glyph_count = (FT_UInt)face->num_glyphs; + /* right after the globals structure come the glyph styles */ + globals->glyph_styles = (FT_UShort*)( globals + 1 ); + globals->module = module; + globals->stem_darkening_for_ppem = 0; + globals->darken_x = 0; + globals->darken_y = 0; + globals->standard_vertical_width = 0; + globals->standard_horizontal_width = 0; + globals->scale_down_factor = 0; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + globals->hb_font = hb_ft_font_create_( face, NULL ); + globals->hb_buf = hb_buffer_create(); +#endif + + error = af_face_globals_compute_style_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + else + globals->increase_x_height = AF_PROP_INCREASE_X_HEIGHT_MAX; + + Exit: + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( void* globals_ ) + { + AF_FaceGlobals globals = (AF_FaceGlobals)globals_; + + + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + + for ( nn = 0; nn < AF_STYLE_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_StyleClass style_class = + af_style_classes[nn]; + AF_WritingSystemClass writing_system_class = + af_writing_system_classes[style_class->writing_system]; + + + if ( writing_system_class->style_metrics_done ) + writing_system_class->style_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + hb_font_destroy( globals->hb_font ); + hb_buffer_destroy( globals->hb_buf ); +#endif + + /* no need to free `globals->glyph_styles'; */ + /* it is part of the `globals' array */ + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_StyleMetrics *ametrics ) + { + AF_StyleMetrics metrics = NULL; + + AF_Style style = (AF_Style)options; + AF_WritingSystemClass writing_system_class; + AF_StyleClass style_class; + + FT_Error error = FT_Err_Ok; + + + if ( gindex >= globals->glyph_count ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* if we have a forced style (via `options'), use it, */ + /* otherwise look into `glyph_styles' array */ + if ( style == AF_STYLE_NONE_DFLT || style + 1 >= AF_STYLE_MAX ) + style = (AF_Style)( globals->glyph_styles[gindex] & + AF_STYLE_UNASSIGNED ); + + Again: + style_class = af_style_classes[style]; + writing_system_class = af_writing_system_classes + [style_class->writing_system]; + + metrics = globals->metrics[style]; + if ( !metrics ) + { + /* create the global metrics object if necessary */ + FT_Memory memory = globals->face->memory; + + + if ( FT_ALLOC( metrics, writing_system_class->style_metrics_size ) ) + goto Exit; + + metrics->style_class = style_class; + metrics->globals = globals; + + if ( writing_system_class->style_metrics_init ) + { + error = writing_system_class->style_metrics_init( metrics, + globals->face ); + if ( error ) + { + if ( writing_system_class->style_metrics_done ) + writing_system_class->style_metrics_done( metrics ); + + FT_FREE( metrics ); + + /* internal error code -1 indicates */ + /* that no blue zones have been found */ + if ( error == -1 ) + { + style = (AF_Style)( globals->glyph_styles[gindex] & + AF_STYLE_UNASSIGNED ); + /* IMPORTANT: Clear the error code, see + * https://gitlab.freedesktop.org/freetype/freetype/-/issues/1063 + */ + error = FT_Err_Ok; + goto Again; + } + + goto Exit; + } + } + + globals->metrics[style] = metrics; + } + + Exit: + *ametrics = metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ) + { + if ( gindex < globals->glyph_count ) + return FT_BOOL( globals->glyph_styles[gindex] & AF_DIGIT ); + + return FT_BOOL( 0 ); + } + + +/* END */ diff --git a/external/freetype/src/autofit/afglobal.h b/external/freetype/src/autofit/afglobal.h new file mode 100644 index 000000000..66170e419 --- /dev/null +++ b/external/freetype/src/autofit/afglobal.h @@ -0,0 +1,173 @@ +/**************************************************************************** + * + * afglobal.h + * + * Auto-fitter routines to compute global hinting values + * (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFGLOBAL_H_ +#define AFGLOBAL_H_ + + +#include "aftypes.h" +#include "afmodule.h" +#include "afshaper.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL_ARRAY( AF_WritingSystemClass ) + af_writing_system_classes[]; + + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class ) + +#include "afscript.h" + + FT_LOCAL_ARRAY( AF_ScriptClass ) + af_script_classes[]; + + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + AF_DECLARE_STYLE_CLASS( af_ ## s ## _style_class ) + +#include "afstyles.h" + + FT_LOCAL_ARRAY( AF_StyleClass ) + af_style_classes[]; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_LOCAL_ARRAY( char* ) + af_style_names[]; +#endif + + + /* + * Default values and flags for both autofitter globals (found in + * AF_ModuleRec) and face globals (in AF_FaceGlobalsRec). + */ + + /* index of fallback style in `af_style_classes' */ +#ifdef AF_CONFIG_OPTION_CJK +#define AF_STYLE_FALLBACK AF_STYLE_HANI_DFLT +#else +#define AF_STYLE_FALLBACK AF_STYLE_NONE_DFLT +#endif + /* default script for OpenType; ignored if HarfBuzz isn't used */ +#define AF_SCRIPT_DEFAULT AF_SCRIPT_LATN + + /* a bit mask for AF_DIGIT and AF_NONBASE */ +#define AF_STYLE_MASK 0x3FFF + /* an uncovered glyph */ +#define AF_STYLE_UNASSIGNED AF_STYLE_MASK + + /* if this flag is set, we have an ASCII digit */ +#define AF_DIGIT 0x8000U + /* if this flag is set, we have a non-base character */ +#define AF_NONBASE 0x4000U + + /* `increase-x-height' property */ +#define AF_PROP_INCREASE_X_HEIGHT_MIN 6 +#define AF_PROP_INCREASE_X_HEIGHT_MAX 0 + + + /************************************************************************/ + /************************************************************************/ + /***** *****/ + /***** F A C E G L O B A L S *****/ + /***** *****/ + /************************************************************************/ + /************************************************************************/ + + + /* + * Note that glyph_styles[] maps each glyph to an index into the + * `af_style_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_UInt glyph_count; /* unsigned face->num_glyphs */ + FT_UShort* glyph_styles; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + hb_font_t* hb_font; + hb_buffer_t* hb_buf; /* for feature comparison */ +#endif + + /* per-face auto-hinter properties */ + FT_UInt increase_x_height; + + AF_StyleMetrics metrics[AF_STYLE_MAX]; + + /* Compute darkening amount once per size. Use this to check whether */ + /* darken_{x,y} needs to be recomputed. */ + FT_UShort stem_darkening_for_ppem; + /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_HORZ] */ + /* to compute the darkening amount. */ + FT_Pos standard_vertical_width; + /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_VERT] */ + /* to compute the darkening amount. */ + FT_Pos standard_horizontal_width; + /* The actual amount to darken a glyph along the X axis. */ + FT_Pos darken_x; + /* The actual amount to darken a glyph along the Y axis. */ + FT_Pos darken_y; + /* Amount to scale down by to keep emboldened points */ + /* on the Y-axis in pre-computed blue zones. */ + FT_Fixed scale_down_factor; + AF_Module module; /* to access global properties */ + + } AF_FaceGlobalsRec; + + + /* + * model the global hints data for a given face, decomposed into + * style-specific items + */ + + FT_LOCAL( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals, + AF_Module module ); + + FT_LOCAL( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_StyleMetrics *ametrics ); + + FT_LOCAL( void ) + af_face_globals_free( void* globals ); + + FT_LOCAL( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ); + + /* */ + + +FT_END_HEADER + +#endif /* AFGLOBAL_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afhints.c b/external/freetype/src/autofit/afhints.c new file mode 100644 index 000000000..e4a378fbf --- /dev/null +++ b/external/freetype/src/autofit/afhints.c @@ -0,0 +1,1796 @@ +/**************************************************************************** + * + * afhints.c + * + * Auto-fitter hinting routines (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "afhints.h" +#include "aferrors.h" +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT afhints + + + FT_LOCAL_DEF( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ) + { + FT_UInt i, j; + FT_Pos swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j] >= table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + FT_LOCAL_DEF( void ) + af_sort_and_quantize_widths( FT_UInt* count, + AF_Width table, + FT_Pos threshold ) + { + FT_UInt i, j; + FT_UInt cur_idx; + FT_Pos cur_val; + FT_Pos sum; + AF_WidthRec swap; + + + if ( *count == 1 ) + return; + + /* sort */ + for ( i = 1; i < *count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j].org >= table[j - 1].org ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + + cur_idx = 0; + cur_val = table[cur_idx].org; + + /* compute and use mean values for clusters not larger than */ + /* `threshold'; this is very primitive and might not yield */ + /* the best result, but normally, using reference character */ + /* `o', `*count' is 2, so the code below is fully sufficient */ + for ( i = 1; i < *count; i++ ) + { + if ( table[i].org - cur_val > threshold || + i == *count - 1 ) + { + sum = 0; + + /* fix loop for end of array */ + if ( table[i].org - cur_val <= threshold && + i == *count - 1 ) + i++; + + for ( j = cur_idx; j < i; j++ ) + { + sum += table[j].org; + table[j].org = 0; + } + table[cur_idx].org = sum / (FT_Pos)j; + + if ( i < *count - 1 ) + { + cur_idx = i + 1; + cur_val = table[cur_idx].org; + } + } + } + + cur_idx = 1; + + /* compress array to remove zero values */ + for ( i = 1; i < *count; i++ ) + { + if ( table[i].org ) + table[cur_idx++] = table[i]; + } + + *count = cur_idx; + } + + /* Get new segment for given axis. */ + + FT_LOCAL_DEF( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ) + { + FT_Error error = FT_Err_Ok; + AF_Segment segment = NULL; + + + if ( axis->num_segments < AF_SEGMENTS_EMBEDDED ) + { + if ( !axis->segments ) + { + axis->segments = axis->embedded.segments; + axis->max_segments = AF_SEGMENTS_EMBEDDED; + } + } + else if ( axis->num_segments >= axis->max_segments ) + { + FT_UInt old_max = axis->max_segments; + FT_UInt new_max = old_max; + FT_UInt big_max = FT_INT_MAX / sizeof ( *segment ); + + + if ( old_max >= big_max ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( axis->segments == axis->embedded.segments ) + { + if ( FT_NEW_ARRAY( axis->segments, new_max ) ) + goto Exit; + ft_memcpy( axis->segments, axis->embedded.segments, + sizeof ( axis->embedded.segments ) ); + } + else + { + if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) + goto Exit; + } + + axis->max_segments = new_max; + } + + segment = axis->segments + axis->num_segments++; + + Exit: + *asegment = segment; + return error; + } + + + /* Get new edge for given axis, direction, and position, */ + /* without initializing the edge itself. */ + + FT_LOCAL_DEF( FT_Error ) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Bool top_to_bottom_hinting, + FT_Memory memory, + AF_Edge *anedge ) + { + FT_Error error = FT_Err_Ok; + AF_Edge edge = NULL; + AF_Edge edges; + + + if ( axis->num_edges < AF_EDGES_EMBEDDED ) + { + if ( !axis->edges ) + { + axis->edges = axis->embedded.edges; + axis->max_edges = AF_EDGES_EMBEDDED; + } + } + else if ( axis->num_edges >= axis->max_edges ) + { + FT_UInt old_max = axis->max_edges; + FT_UInt new_max = old_max; + FT_UInt big_max = FT_INT_MAX / sizeof ( *edge ); + + + if ( old_max >= big_max ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( axis->edges == axis->embedded.edges ) + { + if ( FT_NEW_ARRAY( axis->edges, new_max ) ) + goto Exit; + ft_memcpy( axis->edges, axis->embedded.edges, + sizeof ( axis->embedded.edges ) ); + } + else + { + if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) + goto Exit; + } + + axis->max_edges = new_max; + } + + edges = axis->edges; + edge = edges + axis->num_edges; + + while ( edge > edges ) + { + if ( top_to_bottom_hinting ? ( edge[-1].fpos > fpos ) + : ( edge[-1].fpos < fpos ) ) + break; + + /* we want the edge with same position and minor direction */ + /* to appear before those in the major one in the list */ + if ( edge[-1].fpos == fpos && dir == axis->major_dir ) + break; + + edge[0] = edge[-1]; + edge--; + } + + axis->num_edges++; + + Exit: + *anedge = edge; + return error; + } + + +#ifdef FT_DEBUG_AUTOFIT + +#include FT_CONFIG_STANDARD_LIBRARY_H + + /* The dump functions are used in the `ftgrid' demo program, too. */ +#define AF_DUMP( varformat ) \ + do \ + { \ + if ( to_stdout ) \ + printf varformat; \ + else \ + FT_TRACE7( varformat ); \ + } while ( 0 ) + + + static const char* + af_dir_str( AF_Direction dir ) + { + const char* result; + + + switch ( dir ) + { + case AF_DIR_UP: + result = "up"; + break; + case AF_DIR_DOWN: + result = "down"; + break; + case AF_DIR_LEFT: + result = "left"; + break; + case AF_DIR_RIGHT: + result = "right"; + break; + default: + result = "none"; + } + + return result; + } + + +#define AF_INDEX_NUM( ptr, base ) (int)( (ptr) ? ( (ptr) - (base) ) : -1 ) + + + static char* + af_print_idx( char* p, + size_t n, + int idx ) + { + if ( idx == -1 ) + { + p[0] = '-'; + p[1] = '-'; + p[2] = '\0'; + } + else + ft_snprintf( p, n, "%d", idx ); + + return p; + } + + + static int + af_get_segment_index( AF_GlyphHints hints, + int point_idx, + int dimension ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Point point = hints->points + point_idx; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment segment; + + + for ( segment = segments; segment < limit; segment++ ) + { + if ( segment->first <= segment->last ) + { + if ( point >= segment->first && point <= segment->last ) + break; + } + else + { + AF_Point p = segment->first; + + + for (;;) + { + if ( point == p ) + goto Exit; + + if ( p == segment->last ) + break; + + p = p->next; + } + } + } + + Exit: + if ( segment == limit ) + return -1; + + return (int)( segment - segments ); + } + + + static int + af_get_edge_index( AF_GlyphHints hints, + int segment_idx, + int dimension ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Segment segment = axis->segments + segment_idx; + + + return segment_idx == -1 ? -1 : AF_INDEX_NUM( segment->edge, edges ); + } + + + static int + af_get_strong_edge_index( AF_GlyphHints hints, + AF_Edge* strong_edges, + int dimension ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + + + return AF_INDEX_NUM( strong_edges[dimension], edges ); + } + + +#ifdef __cplusplus + extern "C" { +#endif + void + af_glyph_hints_dump_points( AF_GlyphHints hints, + FT_Bool to_stdout ) + { + AF_Point points = hints->points; + AF_Point limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* climit = contour + hints->num_contours; + AF_Point point; + + + AF_DUMP(( "Table of points:\n" )); + + if ( hints->num_points ) + { + AF_DUMP(( " index hedge hseg vedge vseg flags " + /* " XXXXX XXXXX XXXXX XXXXX XXXXX XXXXXX" */ + " xorg yorg xscale yscale xfit yfit " + /* " XXXXX XXXXX XXXX.XX XXXX.XX XXXX.XX XXXX.XX" */ + " hbef haft vbef vaft" )); + /* " XXXXX XXXXX XXXXX XXXXX" */ + } + else + AF_DUMP(( " (none)\n" )); + + for ( point = points; point < limit; point++ ) + { + int point_idx = AF_INDEX_NUM( point, points ); + int segment_idx_0 = af_get_segment_index( hints, point_idx, 0 ); + int segment_idx_1 = af_get_segment_index( hints, point_idx, 1 ); + + char buf1[16], buf2[16], buf3[16], buf4[16]; + char buf5[16], buf6[16], buf7[16], buf8[16]; + + + /* insert extra newline at the beginning of a contour */ + if ( contour < climit && *contour == point ) + { + AF_DUMP(( "\n" )); + contour++; + } + + AF_DUMP(( " %5d %5s %5s %5s %5s %s" + " %5d %5d %7.2f %7.2f %7.2f %7.2f" + " %5s %5s %5s %5s\n", + point_idx, + af_print_idx( buf1, 16, + af_get_edge_index( hints, segment_idx_1, 1 ) ), + af_print_idx( buf2, 16, segment_idx_1 ), + af_print_idx( buf3, 16, + af_get_edge_index( hints, segment_idx_0, 0 ) ), + af_print_idx( buf4, 16, segment_idx_0 ), + ( point->flags & AF_FLAG_NEAR ) + ? " near " + : ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) + ? " weak " + : "strong", + + point->fx, + point->fy, + (double)point->ox / 64, + (double)point->oy / 64, + (double)point->x / 64, + (double)point->y / 64, + + af_print_idx( buf5, 16, + af_get_strong_edge_index( hints, + point->before, + 1 ) ), + af_print_idx( buf6, 16, + af_get_strong_edge_index( hints, + point->after, + 1 ) ), + af_print_idx( buf7, 16, + af_get_strong_edge_index( hints, + point->before, + 0 ) ), + af_print_idx( buf8, 16, + af_get_strong_edge_index( hints, + point->after, + 0 ) ) )); + } + AF_DUMP(( "\n" )); + } +#ifdef __cplusplus + } +#endif + + + static const char* + af_edge_flags_to_string( FT_UInt flags ) + { + static char temp[32]; + int pos = 0; + + + if ( flags & AF_EDGE_ROUND ) + { + ft_memcpy( temp + pos, "round", 5 ); + pos += 5; + } + if ( flags & AF_EDGE_SERIF ) + { + if ( pos > 0 ) + temp[pos++] = ' '; + ft_memcpy( temp + pos, "serif", 5 ); + pos += 5; + } + if ( pos == 0 ) + return "normal"; + + temp[pos] = '\0'; + + return temp; + } + + + /* Dump the array of linked segments. */ + +#ifdef __cplusplus + extern "C" { +#endif + void + af_glyph_hints_dump_segments( AF_GlyphHints hints, + FT_Bool to_stdout ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Point points = hints->points; + AF_Edge edges = axis->edges; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + char buf1[16], buf2[16], buf3[16]; + + + AF_DUMP(( "Table of %s segments:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" + : "horizontal" )); + if ( axis->num_segments ) + { + AF_DUMP(( " index pos delta dir from to " + /* " XXXXX XXXXX XXXXX XXXXX XXXX XXXX" */ + " link serif edge" + /* " XXXX XXXXX XXXX" */ + " height extra flags\n" )); + /* " XXXXXX XXXXX XXXXXXXXXXX" */ + } + else + AF_DUMP(( " (none)\n" )); + + for ( seg = segments; seg < limit; seg++ ) + AF_DUMP(( " %5d %5d %5d %5s %4d %4d" + " %4s %5s %4s" + " %6d %5d %11s\n", + AF_INDEX_NUM( seg, segments ), + seg->pos, + seg->delta, + af_dir_str( (AF_Direction)seg->dir ), + AF_INDEX_NUM( seg->first, points ), + AF_INDEX_NUM( seg->last, points ), + + af_print_idx( buf1, 16, + AF_INDEX_NUM( seg->link, segments ) ), + af_print_idx( buf2, 16, + AF_INDEX_NUM( seg->serif, segments ) ), + af_print_idx( buf3, 16, + AF_INDEX_NUM( seg->edge, edges ) ), + + seg->height, + seg->height - ( seg->max_coord - seg->min_coord ), + af_edge_flags_to_string( seg->flags ) )); + AF_DUMP(( "\n" )); + } + } +#ifdef __cplusplus + } +#endif + + + /* Fetch number of segments. */ + +#ifdef __cplusplus + extern "C" { +#endif + FT_Error + af_glyph_hints_get_num_segments( AF_GlyphHints hints, + FT_Int dimension, + FT_UInt* num_segments ) + { + AF_Dimension dim; + AF_AxisHints axis; + + + dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; + + axis = &hints->axis[dim]; + *num_segments = axis->num_segments; + + return FT_Err_Ok; + } +#ifdef __cplusplus + } +#endif + + + /* Fetch offset of segments into user supplied offset array. */ + +#ifdef __cplusplus + extern "C" { +#endif + FT_Error + af_glyph_hints_get_segment_offset( AF_GlyphHints hints, + FT_Int dimension, + FT_UInt idx, + FT_Pos *offset, + FT_Bool *is_blue, + FT_Pos *blue_offset ) + { + AF_Dimension dim; + AF_AxisHints axis; + AF_Segment seg; + + + if ( !offset ) + return FT_THROW( Invalid_Argument ); + + dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; + + axis = &hints->axis[dim]; + + if ( idx >= axis->num_segments ) + return FT_THROW( Invalid_Argument ); + + seg = &axis->segments[idx]; + *offset = ( dim == AF_DIMENSION_HORZ ) ? seg->first->fx + : seg->first->fy; + if ( seg->edge ) + *is_blue = FT_BOOL( seg->edge->blue_edge ); + else + *is_blue = FALSE; + + if ( *is_blue ) + *blue_offset = seg->edge->blue_edge->org; + else + *blue_offset = 0; + + return FT_Err_Ok; + } +#ifdef __cplusplus + } +#endif + + + /* Dump the array of linked edges. */ + +#ifdef __cplusplus + extern "C" { +#endif + void + af_glyph_hints_dump_edges( AF_GlyphHints hints, + FT_Bool to_stdout ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Edge limit = edges + axis->num_edges; + AF_Edge edge; + + char buf1[16], buf2[16]; + + + /* + * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges + * since they have a constant X coordinate. + */ + if ( dimension == AF_DIMENSION_HORZ ) + AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", + "vertical", + 65536 * 64 / (double)hints->x_scale, + 10 * (double)hints->x_scale / 65536 / 64 )); + else + AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", + "horizontal", + 65536 * 64 / (double)hints->y_scale, + 10 * (double)hints->y_scale / 65536 / 64 )); + + if ( axis->num_edges ) + { + AF_DUMP(( " index pos dir link serif" + /* " XXXXX XXXX.XX XXXXX XXXX XXXXX" */ + " blue opos pos flags\n" )); + /* " X XXXX.XX XXXX.XX XXXXXXXXXXX" */ + } + else + AF_DUMP(( " (none)\n" )); + + for ( edge = edges; edge < limit; edge++ ) + AF_DUMP(( " %5d %7.2f %5s %4s %5s" + " %c %7.2f %7.2f %11s\n", + AF_INDEX_NUM( edge, edges ), + (double)(int)edge->opos / 64, + af_dir_str( (AF_Direction)edge->dir ), + af_print_idx( buf1, 16, + AF_INDEX_NUM( edge->link, edges ) ), + af_print_idx( buf2, 16, + AF_INDEX_NUM( edge->serif, edges ) ), + + edge->blue_edge ? 'y' : 'n', + (double)edge->opos / 64, + (double)edge->pos / 64, + af_edge_flags_to_string( edge->flags ) )); + AF_DUMP(( "\n" )); + } + } +#ifdef __cplusplus + } +#endif + +#undef AF_DUMP + +#endif /* !FT_DEBUG_AUTOFIT */ + + + /* Compute the direction value of a given vector. */ + + FT_LOCAL_DEF( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ll, ss; /* long and short arm lengths */ + AF_Direction dir; /* candidate direction */ + + + if ( dy >= dx ) + { + if ( dy >= -dx ) + { + dir = AF_DIR_UP; + ll = dy; + ss = dx; + } + else + { + dir = AF_DIR_LEFT; + ll = -dx; + ss = dy; + } + } + else /* dy < dx */ + { + if ( dy >= -dx ) + { + dir = AF_DIR_RIGHT; + ll = dx; + ss = dy; + } + else + { + dir = AF_DIR_DOWN; + ll = -dy; + ss = dx; + } + } + + /* return no direction if arm lengths do not differ enough */ + /* (value 14 is heuristic, corresponding to approx. 4.1 degrees) */ + /* the long arm is never negative */ + if ( ll <= 14 * FT_ABS( ss ) ) + dir = AF_DIR_NONE; + + return dir; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ) + { + /* no need to initialize the embedded items */ + FT_MEM_ZERO( hints, sizeof ( *hints ) - sizeof ( hints->embedded ) ); + hints->memory = memory; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_done( AF_GlyphHints hints ) + { + FT_Memory memory; + int dim; + + + if ( !( hints && hints->memory ) ) + return; + + memory = hints->memory; + + /* + * note that we don't need to free the segment and edge + * buffers since they are really within the hints->points array + */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_AxisHints axis = &hints->axis[dim]; + + + axis->num_segments = 0; + axis->max_segments = 0; + if ( axis->segments != axis->embedded.segments ) + FT_FREE( axis->segments ); + + axis->num_edges = 0; + axis->max_edges = 0; + if ( axis->edges != axis->embedded.edges ) + FT_FREE( axis->edges ); + } + + if ( hints->contours != hints->embedded.contours ) + FT_FREE( hints->contours ); + hints->max_contours = 0; + hints->num_contours = 0; + + if ( hints->points != hints->embedded.points ) + FT_FREE( hints->points ); + hints->max_points = 0; + hints->num_points = 0; + + hints->memory = NULL; + } + + + /* Reset metrics. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_StyleMetrics metrics ) + { + hints->metrics = metrics; + hints->scaler_flags = metrics->scaler.flags; + } + + + /* Recompute all AF_Point in AF_GlyphHints from the definitions */ + /* in a source outline. */ + + FT_LOCAL_DEF( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_Error error = FT_Err_Ok; + AF_Point points; + FT_Int old_max, new_max; + FT_Fixed x_scale = hints->x_scale; + FT_Fixed y_scale = hints->y_scale; + FT_Pos x_delta = hints->x_delta; + FT_Pos y_delta = hints->y_delta; + FT_Memory memory = hints->memory; + + + hints->num_points = 0; + hints->num_contours = 0; + + hints->axis[0].num_segments = 0; + hints->axis[0].num_edges = 0; + hints->axis[1].num_segments = 0; + hints->axis[1].num_edges = 0; + + /* first of all, reallocate the contours array if necessary */ + new_max = outline->n_contours; + old_max = hints->max_contours; + + if ( new_max <= AF_CONTOURS_EMBEDDED ) + { + if ( !hints->contours ) + { + hints->contours = hints->embedded.contours; + hints->max_contours = AF_CONTOURS_EMBEDDED; + } + } + else if ( new_max > old_max ) + { + if ( hints->contours == hints->embedded.contours ) + hints->contours = NULL; + + new_max = ( new_max + 3 ) & ~3; /* round up to a multiple of 4 */ + + if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) + goto Exit; + + hints->max_contours = new_max; + } + + /* + * then reallocate the points arrays if necessary -- + * note that we reserve two additional point positions, used to + * hint metrics appropriately + */ + new_max = outline->n_points + 2; + old_max = hints->max_points; + + if ( new_max <= AF_POINTS_EMBEDDED ) + { + if ( !hints->points ) + { + hints->points = hints->embedded.points; + hints->max_points = AF_POINTS_EMBEDDED; + } + } + else if ( new_max > old_max ) + { + if ( hints->points == hints->embedded.points ) + hints->points = NULL; + + new_max = ( new_max + 2 + 7 ) & ~7; /* round up to a multiple of 8 */ + + if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) + goto Exit; + + hints->max_points = new_max; + } + + hints->num_points = outline->n_points; + hints->num_contours = outline->n_contours; + + /* We can't rely on the value of `FT_Outline.flags' to know the fill */ + /* direction used for a glyph, given that some fonts are broken (e.g., */ + /* the Arphic ones). We thus recompute it each time we need to. */ + /* */ + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; + + if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) + { + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; + } + + hints->x_scale = x_scale; + hints->y_scale = y_scale; + hints->x_delta = x_delta; + hints->y_delta = y_delta; + + points = hints->points; + if ( hints->num_points == 0 ) + goto Exit; + + { + AF_Point point; + AF_Point point_limit = points + hints->num_points; + + /* value 20 in `near_limit' is heuristic */ + FT_UInt units_per_em = hints->metrics->scaler.face->units_per_EM; + FT_Int near_limit = 20 * units_per_em / 2048; + + + /* compute coordinates & Bezier flags, next and prev */ + { + FT_Vector* vec = outline->points; + char* tag = outline->tags; + FT_Short endpoint = outline->contours[0]; + AF_Point end = points + endpoint; + AF_Point prev = end; + FT_Int contour_index = 0; + + + for ( point = points; point < point_limit; point++, vec++, tag++ ) + { + FT_Pos out_x, out_y; + + + point->in_dir = (FT_Char)AF_DIR_NONE; + point->out_dir = (FT_Char)AF_DIR_NONE; + + point->fx = (FT_Short)vec->x; + point->fy = (FT_Short)vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; + point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; + + end->fx = (FT_Short)outline->points[endpoint].x; + end->fy = (FT_Short)outline->points[endpoint].y; + + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_CURVE_TAG_CONIC: + point->flags = AF_FLAG_CONIC; + break; + case FT_CURVE_TAG_CUBIC: + point->flags = AF_FLAG_CUBIC; + break; + default: + point->flags = AF_FLAG_NONE; + } + + out_x = point->fx - prev->fx; + out_y = point->fy - prev->fy; + + if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) + prev->flags |= AF_FLAG_NEAR; + + point->prev = prev; + prev->next = point; + prev = point; + + if ( point == end ) + { + if ( ++contour_index < outline->n_contours ) + { + endpoint = outline->contours[contour_index]; + end = points + endpoint; + prev = end; + } + } + +#ifdef FT_DEBUG_AUTOFIT + point->before[0] = NULL; + point->before[1] = NULL; + point->after[0] = NULL; + point->after[1] = NULL; +#endif + + } + } + + /* set up the contours array */ + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + short* end = outline->contours; + short idx = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + idx; + idx = (short)( end[0] + 1 ); + } + } + + { + /* + * Compute directions of `in' and `out' vectors. + * + * Note that distances between points that are very near to each + * other are accumulated. In other words, the auto-hinter either + * prepends the small vectors between near points to the first + * non-near vector, or the sum of small vector lengths exceeds a + * threshold, thus `grouping' the small vectors. All intermediate + * points are tagged as weak; the directions are adjusted also to + * be equal to the accumulated one. + */ + + FT_Int near_limit2 = 2 * near_limit - 1; + + AF_Point* contour; + AF_Point* contour_limit = hints->contours + hints->num_contours; + + + for ( contour = hints->contours; contour < contour_limit; contour++ ) + { + AF_Point first = *contour; + AF_Point next, prev, curr; + + FT_Pos out_x, out_y; + + + /* since the first point of a contour could be part of a */ + /* series of near points, go backwards to find the first */ + /* non-near point and adjust `first' */ + + point = first; + prev = first->prev; + + while ( prev != first ) + { + out_x = point->fx - prev->fx; + out_y = point->fy - prev->fy; + + /* + * We use Taxicab metrics to measure the vector length. + * + * Note that the accumulated distances so far could have the + * opposite direction of the distance measured here. For this + * reason we use `near_limit2' for the comparison to get a + * non-near point even in the worst case. + */ + if ( FT_ABS( out_x ) + FT_ABS( out_y ) >= near_limit2 ) + break; + + point = prev; + prev = prev->prev; + } + + /* adjust first point */ + first = point; + + /* now loop over all points of the contour to get */ + /* `in' and `out' vector directions */ + + curr = first; + + /* + * We abuse the `u' and `v' fields to store index deltas to the + * next and previous non-near point, respectively. + * + * To avoid problems with not having non-near points, we point to + * `first' by default as the next non-near point. + * + */ + curr->u = (FT_Pos)( first - curr ); + first->v = -curr->u; + + out_x = 0; + out_y = 0; + + next = first; + do + { + AF_Direction out_dir; + + + point = next; + next = point->next; + + out_x += next->fx - point->fx; + out_y += next->fy - point->fy; + + if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) + { + next->flags |= AF_FLAG_WEAK_INTERPOLATION; + continue; + } + + curr->u = (FT_Pos)( next - curr ); + next->v = -curr->u; + + out_dir = af_direction_compute( out_x, out_y ); + + /* adjust directions for all points inbetween; */ + /* the loop also updates position of `curr' */ + curr->out_dir = (FT_Char)out_dir; + for ( curr = curr->next; curr != next; curr = curr->next ) + { + curr->in_dir = (FT_Char)out_dir; + curr->out_dir = (FT_Char)out_dir; + } + next->in_dir = (FT_Char)out_dir; + + curr->u = (FT_Pos)( first - curr ); + first->v = -curr->u; + + out_x = 0; + out_y = 0; + + } while ( next != first ); + } + + /* + * The next step is to `simplify' an outline's topology so that we + * can identify local extrema more reliably: A series of + * non-horizontal or non-vertical vectors pointing into the same + * quadrant are handled as a single, long vector. From a + * topological point of the view, the intermediate points are of no + * interest and thus tagged as weak. + */ + + for ( point = points; point < point_limit; point++ ) + { + if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) + continue; + + if ( point->in_dir == AF_DIR_NONE && + point->out_dir == AF_DIR_NONE ) + { + /* check whether both vectors point into the same quadrant */ + + FT_Pos in_x, in_y; + FT_Pos out_x, out_y; + + AF_Point next_u = point + point->u; + AF_Point prev_v = point + point->v; + + + in_x = point->fx - prev_v->fx; + in_y = point->fy - prev_v->fy; + + out_x = next_u->fx - point->fx; + out_y = next_u->fy - point->fy; + + if ( ( in_x ^ out_x ) >= 0 && ( in_y ^ out_y ) >= 0 ) + { + /* yes, so tag current point as weak */ + /* and update index deltas */ + + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + + prev_v->u = (FT_Pos)( next_u - prev_v ); + next_u->v = -prev_v->u; + } + } + } + + /* + * Finally, check for remaining weak points. Everything else not + * collected in edges so far is then implicitly classified as strong + * points. + */ + + for ( point = points; point < point_limit; point++ ) + { + if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) + continue; + + if ( point->flags & AF_FLAG_CONTROL ) + { + /* control points are always weak */ + Is_Weak_Point: + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + } + else if ( point->out_dir == point->in_dir ) + { + if ( point->out_dir != AF_DIR_NONE ) + { + /* current point lies on a horizontal or */ + /* vertical segment (but doesn't start or end it) */ + goto Is_Weak_Point; + } + + { + AF_Point next_u = point + point->u; + AF_Point prev_v = point + point->v; + + + if ( ft_corner_is_flat( point->fx - prev_v->fx, + point->fy - prev_v->fy, + next_u->fx - point->fx, + next_u->fy - point->fy ) ) + { + /* either the `in' or the `out' vector is much more */ + /* dominant than the other one, so tag current point */ + /* as weak and update index deltas */ + + prev_v->u = (FT_Pos)( next_u - prev_v ); + next_u->v = -prev_v->u; + + goto Is_Weak_Point; + } + } + } + else if ( point->in_dir == -point->out_dir ) + { + /* current point forms a spike */ + goto Is_Weak_Point; + } + } + } + } + + Exit: + return error; + } + + + /* Store the hinted outline in an FT_Outline structure. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + + for ( ; point < limit; point++, vec++, tag++ ) + { + vec->x = point->x; + vec->y = point->y; + + if ( point->flags & AF_FLAG_CONIC ) + tag[0] = FT_CURVE_TAG_CONIC; + else if ( point->flags & AF_FLAG_CUBIC ) + tag[0] = FT_CURVE_TAG_CUBIC; + else + tag[0] = FT_CURVE_TAG_ON; + } + } + + + /**************************************************************** + * + * EDGE POINT GRID-FITTING + * + ****************************************************************/ + + + /* Align all points of an edge to the same coordinate value, */ + /* either horizontally or vertically. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); + AF_Segment seg; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( !edge ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + + if ( point == last ) + break; + + point = point->next; + } + } + } + else + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( !edge ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + + if ( point == last ) + break; + + point = point->next; + } + } + } + } + + + /**************************************************************** + * + * STRONG POINT INTERPOLATION + * + ****************************************************************/ + + + /* Hint the strong points -- this is equivalent to the TrueType `IP' */ + /* hinting instruction. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); + FT_UInt touch_flag; + + + if ( dim == AF_DIMENSION_HORZ ) + touch_flag = AF_FLAG_TOUCH_X; + else + touch_flag = AF_FLAG_TOUCH_Y; + + if ( edges < edge_limit ) + { + AF_Point point; + AF_Edge edge; + + + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + + /* if this point is candidate to weak interpolation, we */ + /* interpolate it after all strong points have been processed */ + + if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ) + continue; + + if ( dim == AF_DIMENSION_VERT ) + { + u = point->fy; + ou = point->oy; + } + else + { + u = point->fx; + ou = point->ox; + } + + fu = u; + + /* is the point before the first edge? */ + edge = edges; + delta = edge->fpos - u; + if ( delta >= 0 ) + { + u = edge->pos - ( edge->opos - ou ); + +#ifdef FT_DEBUG_AUTOFIT + point->before[dim] = edge; + point->after[dim] = NULL; +#endif + + goto Store_Point; + } + + /* is the point after the last edge? */ + edge = edge_limit - 1; + delta = u - edge->fpos; + if ( delta >= 0 ) + { + u = edge->pos + ( ou - edge->opos ); + +#ifdef FT_DEBUG_AUTOFIT + point->before[dim] = NULL; + point->after[dim] = edge; +#endif + + goto Store_Point; + } + + { + FT_PtrDist min, max, mid; + FT_Pos fpos; + + + /* find enclosing edges */ + min = 0; + max = edge_limit - edges; + +#if 1 + /* for a small number of edges, a linear search is better */ + if ( max <= 8 ) + { + FT_PtrDist nn; + + + for ( nn = 0; nn < max; nn++ ) + if ( edges[nn].fpos >= u ) + break; + + if ( edges[nn].fpos == u ) + { + u = edges[nn].pos; + goto Store_Point; + } + min = nn; + } + else +#endif + while ( min < max ) + { + mid = ( max + min ) >> 1; + edge = edges + mid; + fpos = edge->fpos; + + if ( u < fpos ) + max = mid; + else if ( u > fpos ) + min = mid + 1; + else + { + /* we are on the edge */ + u = edge->pos; + +#ifdef FT_DEBUG_AUTOFIT + point->before[dim] = NULL; + point->after[dim] = NULL; +#endif + + goto Store_Point; + } + } + + /* point is not on an edge */ + { + AF_Edge before = edges + min - 1; + AF_Edge after = edges + min + 0; + + +#ifdef FT_DEBUG_AUTOFIT + point->before[dim] = before; + point->after[dim] = after; +#endif + + /* assert( before && after && before != after ) */ + if ( before->scale == 0 ) + before->scale = FT_DivFix( after->pos - before->pos, + after->fpos - before->fpos ); + + u = before->pos + FT_MulFix( fu - before->fpos, + before->scale ); + } + } + + Store_Point: + /* save the point position */ + if ( dim == AF_DIMENSION_HORZ ) + point->x = u; + else + point->y = u; + + point->flags |= touch_flag; + } + } + } + + + /**************************************************************** + * + * WEAK POINT INTERPOLATION + * + ****************************************************************/ + + + /* Shift the original coordinates of all points between `p1' and */ + /* `p2' to get hinted coordinates, using the same difference as */ + /* given by `ref'. */ + + static void + af_iup_shift( AF_Point p1, + AF_Point p2, + AF_Point ref ) + { + AF_Point p; + FT_Pos delta = ref->u - ref->v; + + + if ( delta == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + p->u = p->v + delta; + + for ( p = ref + 1; p <= p2; p++ ) + p->u = p->v + delta; + } + + + /* Interpolate the original coordinates of all points between `p1' and */ + /* `p2' to get hinted coordinates, using `ref1' and `ref2' as the */ + /* reference points. The `u' and `v' members are the current and */ + /* original coordinate values, respectively. */ + /* */ + /* Details can be found in the TrueType bytecode specification. */ + + static void + af_iup_interp( AF_Point p1, + AF_Point p2, + AF_Point ref1, + AF_Point ref2 ) + { + AF_Point p; + FT_Pos u, v1, v2, u1, u2, d1, d2; + + + if ( p1 > p2 ) + return; + + if ( ref1->v > ref2->v ) + { + p = ref1; + ref1 = ref2; + ref2 = p; + } + + v1 = ref1->v; + v2 = ref2->v; + u1 = ref1->u; + u2 = ref2->u; + d1 = u1 - v1; + d2 = u2 - v2; + + if ( u1 == u2 || v1 == v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = u1; + + p->u = u; + } + } + else + { + FT_Fixed scale = FT_DivFix( u2 - u1, v2 - v1 ); + + + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = u1 + FT_MulFix( u - v1, scale ); + + p->u = u; + } + } + } + + + /* Hint the weak points -- this is equivalent to the TrueType `IUP' */ + /* hinting instruction. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + FT_UInt touch_flag; + AF_Point point; + AF_Point end_point; + AF_Point first_point; + + + /* PASS 1: Move segment points to edge positions */ + + if ( dim == AF_DIMENSION_HORZ ) + { + touch_flag = AF_FLAG_TOUCH_X; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->x; + point->v = point->ox; + } + } + else + { + touch_flag = AF_FLAG_TOUCH_Y; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->y; + point->v = point->oy; + } + } + + for ( ; contour < contour_limit; contour++ ) + { + AF_Point first_touched, last_touched; + + + point = *contour; + end_point = point->prev; + first_point = point; + + /* find first touched point */ + for (;;) + { + if ( point > end_point ) /* no touched point in contour */ + goto NextContour; + + if ( point->flags & touch_flag ) + break; + + point++; + } + + first_touched = point; + + for (;;) + { + FT_ASSERT( point <= end_point && + ( point->flags & touch_flag ) != 0 ); + + /* skip any touched neighbours */ + while ( point < end_point && + ( point[1].flags & touch_flag ) != 0 ) + point++; + + last_touched = point; + + /* find the next touched point, if any */ + point++; + for (;;) + { + if ( point > end_point ) + goto EndContour; + + if ( ( point->flags & touch_flag ) != 0 ) + break; + + point++; + } + + /* interpolate between last_touched and point */ + af_iup_interp( last_touched + 1, point - 1, + last_touched, point ); + } + + EndContour: + /* special case: only one point was touched */ + if ( last_touched == first_touched ) + af_iup_shift( first_point, end_point, first_touched ); + + else /* interpolate the last part */ + { + if ( last_touched < end_point ) + af_iup_interp( last_touched + 1, end_point, + last_touched, first_touched ); + + if ( first_touched > points ) + af_iup_interp( first_point, first_touched - 1, + last_touched, first_touched ); + } + + NextContour: + ; + } + + /* now save the interpolated values back to x/y */ + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + } + else + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + } + } + + +/* END */ diff --git a/external/freetype/src/autofit/afhints.h b/external/freetype/src/autofit/afhints.h new file mode 100644 index 000000000..d1cf9529b --- /dev/null +++ b/external/freetype/src/autofit/afhints.h @@ -0,0 +1,467 @@ +/**************************************************************************** + * + * afhints.h + * + * Auto-fitter hinting routines (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFHINTS_H_ +#define AFHINTS_H_ + +#include "aftypes.h" + +FT_BEGIN_HEADER + + /* + * The definition of outline glyph hints. These are shared by all + * writing system analysis routines (until now). + */ + + typedef enum AF_Dimension_ + { + AF_DIMENSION_HORZ = 0, /* x coordinates, */ + /* i.e., vertical segments & edges */ + AF_DIMENSION_VERT = 1, /* y coordinates, */ + /* i.e., horizontal segments & edges */ + + AF_DIMENSION_MAX /* do not remove */ + + } AF_Dimension; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1 + dir2 == 0' */ + typedef enum AF_Direction_ + { + AF_DIR_NONE = 4, + AF_DIR_RIGHT = 1, + AF_DIR_LEFT = -1, + AF_DIR_UP = 2, + AF_DIR_DOWN = -2 + + } AF_Direction; + + + /* + * The following explanations are mostly taken from the article + * + * Real-Time Grid Fitting of Typographic Outlines + * + * by David Turner and Werner Lemberg + * + * https://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf + * + * with appropriate updates. + * + * + * Segments + * + * `af_{cjk,latin,...}_hints_compute_segments' are the functions to + * find segments in an outline. + * + * A segment is a series of at least two consecutive points that are + * approximately aligned along a coordinate axis. The analysis to do + * so is specific to a writing system. + * + * + * Edges + * + * `af_{cjk,latin,...}_hints_compute_edges' are the functions to find + * edges. + * + * As soon as segments are defined, the auto-hinter groups them into + * edges. An edge corresponds to a single position on the main + * dimension that collects one or more segments (allowing for a small + * threshold). + * + * As an example, the `latin' writing system first tries to grid-fit + * edges, then to align segments on the edges unless it detects that + * they form a serif. + * + * + * A H + * | | + * | | + * | | + * | | + * C | | F + * +------<-----+ +-----<------+ + * | B G | + * | | + * | | + * +--------------->------------------+ + * D E + * + * + * Stems + * + * Stems are detected by `af_{cjk,latin,...}_hint_edges'. + * + * Segments need to be `linked' to other ones in order to detect stems. + * A stem is made of two segments that face each other in opposite + * directions and that are sufficiently close to each other. Using + * vocabulary from the TrueType specification, stem segments form a + * `black distance'. + * + * In the above ASCII drawing, the horizontal segments are BC, DE, and + * FG; the vertical segments are AB, CD, EF, and GH. + * + * Each segment has at most one `best' candidate to form a black + * distance, or no candidate at all. Notice that two distinct segments + * can have the same candidate, which frequently means a serif. + * + * A stem is recognized by the following condition: + * + * best segment_1 = segment_2 && best segment_2 = segment_1 + * + * The best candidate is stored in field `link' in structure + * `AF_Segment'. + * + * In the above ASCII drawing, the best candidate for both AB and CD is + * GH, while the best candidate for GH is AB. Similarly, the best + * candidate for EF and GH is AB, while the best candidate for AB is + * GH. + * + * The detection and handling of stems is dependent on the writing + * system. + * + * + * Serifs + * + * Serifs are detected by `af_{cjk,latin,...}_hint_edges'. + * + * In comparison to a stem, a serif (as handled by the auto-hinter + * module that takes care of the `latin' writing system) has + * + * best segment_1 = segment_2 && best segment_2 != segment_1 + * + * where segment_1 corresponds to the serif segment (CD and EF in the + * above ASCII drawing). + * + * The best candidate is stored in field `serif' in structure + * `AF_Segment' (and `link' is set to NULL). + * + * + * Touched points + * + * A point is called `touched' if it has been processed somehow by the + * auto-hinter. It basically means that it shouldn't be moved again + * (or moved only under certain constraints to preserve the already + * applied processing). + * + * + * Flat and round segments + * + * Segments are `round' or `flat', depending on the series of points + * that define them. A segment is round if the next and previous point + * of an extremum (which can be either a single point or sequence of + * points) are both conic or cubic control points. Otherwise, a + * segment with an extremum is flat. + * + * + * Strong Points + * + * Experience has shown that points not part of an edge need to be + * interpolated linearly between their two closest edges, even if these + * are not part of the contour of those particular points. Typical + * candidates for this are + * + * - angle points (i.e., points where the `in' and `out' direction + * differ greatly) + * + * - inflection points (i.e., where the `in' and `out' angles are the + * same, but the curvature changes sign) [currently, such points + * aren't handled specially in the auto-hinter] + * + * `af_glyph_hints_align_strong_points' is the function that takes + * care of such situations; it is equivalent to the TrueType `IP' + * hinting instruction. + * + * + * Weak Points + * + * Other points in the outline must be interpolated using the + * coordinates of their previous and next unfitted contour neighbours. + * These are called `weak points' and are touched by the function + * `af_glyph_hints_align_weak_points', equivalent to the TrueType `IUP' + * hinting instruction. Typical candidates are control points and + * points on the contour without a major direction. + * + * The major effect is to reduce possible distortion caused by + * alignment of edges and strong points, thus weak points are processed + * after strong points. + */ + + + /* point hint flags */ +#define AF_FLAG_NONE 0 + + /* point type flags */ +#define AF_FLAG_CONIC ( 1U << 0 ) +#define AF_FLAG_CUBIC ( 1U << 1 ) +#define AF_FLAG_CONTROL ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) + + /* point touch flags */ +#define AF_FLAG_TOUCH_X ( 1U << 2 ) +#define AF_FLAG_TOUCH_Y ( 1U << 3 ) + + /* candidates for weak interpolation have this flag set */ +#define AF_FLAG_WEAK_INTERPOLATION ( 1U << 4 ) + + /* the distance to the next point is very small */ +#define AF_FLAG_NEAR ( 1U << 5 ) + + + /* edge hint flags */ +#define AF_EDGE_NORMAL 0 +#define AF_EDGE_ROUND ( 1U << 0 ) +#define AF_EDGE_SERIF ( 1U << 1 ) +#define AF_EDGE_DONE ( 1U << 2 ) +#define AF_EDGE_NEUTRAL ( 1U << 3 ) /* edge aligns to a neutral blue zone */ + + + typedef struct AF_PointRec_* AF_Point; + typedef struct AF_SegmentRec_* AF_Segment; + typedef struct AF_EdgeRec_* AF_Edge; + + + typedef struct AF_PointRec_ + { + FT_UShort flags; /* point flags used by hinter */ + FT_Char in_dir; /* direction of inwards vector */ + FT_Char out_dir; /* direction of outwards vector */ + + FT_Pos ox, oy; /* original, scaled position */ + FT_Short fx, fy; /* original, unscaled position (in font units) */ + FT_Pos x, y; /* current position */ + FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ + + AF_Point next; /* next point in contour */ + AF_Point prev; /* previous point in contour */ + +#ifdef FT_DEBUG_AUTOFIT + /* track `before' and `after' edges for strong points */ + AF_Edge before[2]; + AF_Edge after[2]; +#endif + + } AF_PointRec; + + + typedef struct AF_SegmentRec_ + { + FT_Byte flags; /* edge/segment flags for this segment */ + FT_Char dir; /* segment direction */ + FT_Short pos; /* position of segment */ + FT_Short delta; /* deviation from segment position */ + FT_Short min_coord; /* minimum coordinate of segment */ + FT_Short max_coord; /* maximum coordinate of segment */ + FT_Short height; /* the hinted segment height */ + + AF_Edge edge; /* the segment's parent edge */ + AF_Segment edge_next; /* link to next segment in parent edge */ + + AF_Segment link; /* (stem) link segment */ + AF_Segment serif; /* primary segment for serifs */ + FT_Pos score; /* used during stem matching */ + FT_Pos len; /* used during stem matching */ + + AF_Point first; /* first point in edge segment */ + AF_Point last; /* last point in edge segment */ + + } AF_SegmentRec; + + + typedef struct AF_EdgeRec_ + { + FT_Short fpos; /* original, unscaled position (in font units) */ + FT_Pos opos; /* original, scaled position */ + FT_Pos pos; /* current position */ + + FT_Byte flags; /* edge flags */ + FT_Char dir; /* edge direction */ + FT_Fixed scale; /* used to speed up interpolation between edges */ + + AF_Width blue_edge; /* non-NULL if this is a blue edge */ + AF_Edge link; /* link edge */ + AF_Edge serif; /* primary edge for serifs */ + FT_Int score; /* used during stem matching */ + + AF_Segment first; /* first segment in edge */ + AF_Segment last; /* last segment in edge */ + + } AF_EdgeRec; + +#define AF_SEGMENTS_EMBEDDED 18 /* number of embedded segments */ +#define AF_EDGES_EMBEDDED 12 /* number of embedded edges */ + + typedef struct AF_AxisHintsRec_ + { + FT_UInt num_segments; /* number of used segments */ + FT_UInt max_segments; /* number of allocated segments */ + AF_Segment segments; /* segments array */ + + FT_UInt num_edges; /* number of used edges */ + FT_UInt max_edges; /* number of allocated edges */ + AF_Edge edges; /* edges array */ + + AF_Direction major_dir; /* either vertical or horizontal */ + + /* two arrays to avoid allocation penalty */ + struct + { + AF_SegmentRec segments[AF_SEGMENTS_EMBEDDED]; + AF_EdgeRec edges[AF_EDGES_EMBEDDED]; + } embedded; + + + } AF_AxisHintsRec, *AF_AxisHints; + + +#define AF_POINTS_EMBEDDED 96 /* number of embedded points */ +#define AF_CONTOURS_EMBEDDED 8 /* number of embedded contours */ + + typedef struct AF_GlyphHintsRec_ + { + FT_Memory memory; + + FT_Fixed x_scale; + FT_Pos x_delta; + + FT_Fixed y_scale; + FT_Pos y_delta; + + FT_Int max_points; /* number of allocated points */ + FT_Int num_points; /* number of used points */ + AF_Point points; /* points array */ + + FT_Int max_contours; /* number of allocated contours */ + FT_Int num_contours; /* number of used contours */ + AF_Point* contours; /* contours array */ + + AF_AxisHintsRec axis[AF_DIMENSION_MAX]; + + FT_UInt32 scaler_flags; /* copy of scaler flags */ + FT_UInt32 other_flags; /* free for style-specific */ + /* implementations */ + AF_StyleMetrics metrics; + + /* Two arrays to avoid allocation penalty. */ + /* The `embedded' structure must be the last element! */ + struct + { + AF_Point contours[AF_CONTOURS_EMBEDDED]; + AF_PointRec points[AF_POINTS_EMBEDDED]; + } embedded; + + } AF_GlyphHintsRec; + + +#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) +#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) + + +#ifdef FT_DEBUG_AUTOFIT + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + ( !af_debug_disable_horz_hints_ && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + ( !af_debug_disable_vert_hints_ && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) + +#define AF_HINTS_DO_BLUES( h ) ( !af_debug_disable_blue_hints_ ) + +#else /* !FT_DEBUG_AUTOFIT */ + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) + +#define AF_HINTS_DO_BLUES( h ) 1 + +#endif /* !FT_DEBUG_AUTOFIT */ + + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + + + FT_LOCAL( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ); + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ); + + FT_LOCAL( FT_Error) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Bool top_to_bottom_hinting, + FT_Memory memory, + AF_Edge *edge ); + + FT_LOCAL( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ); + + FT_LOCAL( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_StyleMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_done( AF_GlyphHints hints ); + +/* */ + +#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) + +#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ + ? (seg1)->pos - (seg2)->pos \ + : (seg2)->pos - (seg1)->pos ) + + +FT_END_HEADER + +#endif /* AFHINTS_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afindic.c b/external/freetype/src/autofit/afindic.c new file mode 100644 index 000000000..7fb12c63d --- /dev/null +++ b/external/freetype/src/autofit/afindic.c @@ -0,0 +1,157 @@ +/**************************************************************************** + * + * afindic.c + * + * Auto-fitter hinting routines for Indic writing system (body). + * + * Copyright (C) 2007-2023 by + * Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "aftypes.h" +#include "aflatin.h" +#include "afcjk.h" + + +#ifdef AF_CONFIG_OPTION_INDIC + +#include "afindic.h" +#include "aferrors.h" + + + static FT_Error + af_indic_metrics_init( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Face face ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + + /* skip blue zone init in CJK routines */ + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + face->charmap = NULL; + else + { + af_cjk_metrics_init_widths( metrics, face ); +#if 0 + /* either need indic specific blue_chars[] or just skip blue zones */ + af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars ); +#endif + af_cjk_metrics_check_digits( metrics, face ); + } + + face->charmap = oldmap; + return FT_Err_Ok; + } + + + static void + af_indic_metrics_scale( AF_StyleMetrics metrics, + AF_Scaler scaler ) + { + /* use CJK routines */ + af_cjk_metrics_scale( metrics, scaler ); + } + + + static FT_Error + af_indic_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_init( hints, metrics ); + } + + + static FT_Error + af_indic_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_apply( glyph_index, hints, outline, metrics ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + static void + af_indic_get_standard_widths( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** I N D I C S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_indic_writing_system_class, + + AF_WRITING_SYSTEM_INDIC, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_indic_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_indic_hints_apply /* style_hints_apply */ + ) + + +#else /* !AF_CONFIG_OPTION_INDIC */ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_indic_writing_system_class, + + AF_WRITING_SYSTEM_INDIC, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ + ) + + +#endif /* !AF_CONFIG_OPTION_INDIC */ + + +/* END */ diff --git a/external/freetype/src/autofit/afindic.h b/external/freetype/src/autofit/afindic.h new file mode 100644 index 000000000..3eb67f63b --- /dev/null +++ b/external/freetype/src/autofit/afindic.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * afindic.h + * + * Auto-fitter hinting routines for Indic writing system + * (specification). + * + * Copyright (C) 2007-2023 by + * Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFINDIC_H_ +#define AFINDIC_H_ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the `indic' writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_indic_writing_system_class ) + + +/* */ + +FT_END_HEADER + +#endif /* AFINDIC_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/aflatin.c b/external/freetype/src/autofit/aflatin.c new file mode 100644 index 000000000..b86367aa9 --- /dev/null +++ b/external/freetype/src/autofit/aflatin.c @@ -0,0 +1,3644 @@ +/**************************************************************************** + * + * aflatin.c + * + * Auto-fitter hinting routines for latin writing system (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftadvanc.h> +#include <freetype/internal/ftdebug.h> + +#include "afglobal.h" +#include "aflatin.h" +#include "aferrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT aflatin + + + /* needed for computation of round vs. flat segments */ +#define FLAT_THRESHOLD( x ) ( x / 14 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Find segments and links, compute all stem widths, and initialize */ + /* standard width and height for the glyph with given charcode. */ + + FT_LOCAL_DEF( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + FT_TRACE5(( "\n" )); + FT_TRACE5(( "latin standard widths computation (style `%s')\n", + af_style_names[metrics->root.style_class->style] )); + FT_TRACE5(( "=====================================================\n" )); + FT_TRACE5(( "\n" )); + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_ULong glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + AF_StyleClass style_class = metrics->root.style_class; + AF_ScriptClass script_class = af_script_classes[style_class->script]; + + /* If HarfBuzz is not available, we need a pointer to a single */ + /* unsigned long value. */ +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + void* shaper_buf; +#else + FT_ULong shaper_buf_; + void* shaper_buf = &shaper_buf_; +#endif + + const char* p; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_ULong ch = 0; +#endif + + + p = script_class->standard_charstring; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + shaper_buf = af_shaper_buf_create( face ); +#endif + /* + * We check a list of standard characters to catch features like + * `c2sc' (small caps from caps) that don't contain lowercase letters + * by definition, or other features that mainly operate on numerals. + * The first match wins. + */ + + glyph_index = 0; + while ( *p ) + { + unsigned int num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + /* otherwise exit loop if we have a result */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + NULL, + NULL ); + if ( glyph_index ) + break; + } + + af_shaper_buf_destroy( face, shaper_buf ); + + if ( !glyph_index ) + { + FT_TRACE5(( "standard character missing;" + " using fallback stem widths\n" )); + goto Exit; + } + + FT_TRACE5(( "standard character: U+%04lX (glyph index %ld)\n", + ch, glyph_index )); + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + + scaler->x_scale = 0x10000L; + scaler->y_scale = 0x10000L; + scaler->x_delta = 0; + scaler->y_delta = 0; + + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + /* + * We assume that the glyphs selected for the stem width + * computation are `featureless' enough so that the linking + * algorithm works fine without adjustments of its scoring + * function. + */ + af_latin_hints_link_segments( hints, + 0, + NULL, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = FT_OFFSET( seg, axhints->num_segments ); + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[num_widths++].org = dist; + } + } + + /* this also replaces multiple almost identical stem widths */ + /* with a single one (the value 100 is heuristic) */ + af_sort_and_quantize_widths( &num_widths, axis->widths, + dummy->units_per_em / 100 ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + FT_TRACE5(( "%s widths:\n", + dim == AF_DIMENSION_VERT ? "horizontal" + : "vertical" )); + + FT_TRACE5(( " %ld (standard)", axis->standard_width )); + for ( i = 1; i < axis->width_count; i++ ) + FT_TRACE5(( " %ld", axis->widths[i].org )); + + FT_TRACE5(( "\n" )); + } +#endif + } + } + + FT_TRACE5(( "\n" )); + + af_glyph_hints_done( hints ); + } + + + static void + af_latin_sort_blue( FT_UInt count, + AF_LatinBlue* table ) + { + FT_UInt i, j; + AF_LatinBlue swap; + + + /* we sort from bottom to top */ + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + FT_Pos a, b; + + + if ( table[j - 1]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + a = table[j - 1]->ref.org; + else + a = table[j - 1]->shoot.org; + + if ( table[j]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + b = table[j]->ref.org; + else + b = table[j]->shoot.org; + + if ( b >= a ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + /* Find all blue zones. Flat segments give the reference points, */ + /* round segments the overshoot positions. */ + + static int + af_latin_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_BLUE_STRING_MAX_LEN]; + FT_Pos rounds[AF_BLUE_STRING_MAX_LEN]; + + FT_UInt num_flats; + FT_UInt num_rounds; + + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_Outline outline; + + AF_StyleClass sc = metrics->root.style_class; + + AF_Blue_Stringset bss = sc->blue_stringset; + const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; + + FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); + + /* If HarfBuzz is not available, we need a pointer to a single */ + /* unsigned long value. */ +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + void* shaper_buf; +#else + FT_ULong shaper_buf_; + void* shaper_buf = &shaper_buf_; +#endif + + + /* we walk over the blue character strings as specified in the */ + /* style's entry in the `af_blue_stringset' array */ + + FT_TRACE5(( "latin blue zones computation\n" )); + FT_TRACE5(( "============================\n" )); + FT_TRACE5(( "\n" )); + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + shaper_buf = af_shaper_buf_create( face ); +#endif + + for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) + { + const char* p = &af_blue_strings[bs->string]; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + FT_Pos ascender; + FT_Pos descender; + + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Bool have_flag = 0; + + + FT_TRACE5(( "blue zone %d", axis->blue_count )); + + if ( bs->properties ) + { + FT_TRACE5(( " (" )); + + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + { + FT_TRACE5(( "top" )); + have_flag = 1; + } + else if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) + { + FT_TRACE5(( "sub top" )); + have_flag = 1; + } + + if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) + { + if ( have_flag ) + FT_TRACE5(( ", " )); + FT_TRACE5(( "neutral" )); + have_flag = 1; + } + + if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) + { + if ( have_flag ) + FT_TRACE5(( ", " )); + FT_TRACE5(( "small top" )); + have_flag = 1; + } + + if ( AF_LATIN_IS_LONG_BLUE( bs ) ) + { + if ( have_flag ) + FT_TRACE5(( ", " )); + FT_TRACE5(( "long" )); + } + + FT_TRACE5(( ")" )); + } + + FT_TRACE5(( ":\n" )); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + num_flats = 0; + num_rounds = 0; + ascender = 0; + descender = 0; + + while ( *p ) + { + FT_ULong glyph_index; + FT_Long y_offset; + FT_Int best_point, best_contour_first, best_contour_last; + FT_Vector* points; + + FT_Pos best_y_extremum; /* same as points.y */ + FT_Bool best_round = 0; + + unsigned int i, num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; + FT_ULong ch; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + + if ( !num_idx ) + { + FT_TRACE5(( " U+%04lX unavailable\n", ch )); + continue; + } + + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + best_y_extremum = FT_INT_MIN; + else + best_y_extremum = FT_INT_MAX; + + /* iterate over all glyph elements of the character cluster */ + /* and get the data of the `biggest' one */ + for ( i = 0; i < num_idx; i++ ) + { + FT_Pos best_y; + FT_Bool round = 0; + + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + i, + NULL, + &y_offset ); + if ( glyph_index == 0 ) + { + FT_TRACE5(( " U+%04lX unavailable\n", ch )); + continue; + } + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + outline = face->glyph->outline; + /* reject glyphs that don't produce any rendering */ + if ( error || outline.n_points <= 2 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( num_idx == 1 ) + FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); + else + FT_TRACE5(( " component %d of cluster starting with U+%04lX" + " contains no (usable) outlines\n", i, ch )); +#endif + continue; + } + + /* now compute min or max point indices and coordinates */ + points = outline.points; + best_point = -1; + best_contour_first = -1; + best_contour_last = -1; + best_y = 0; /* make compiler happy */ + + { + FT_Int nn; + FT_Int pp, first, last; + + + last = -1; + for ( nn = 0; nn < outline.n_contours; nn++ ) + { + first = last + 1; + last = outline.contours[nn]; + + /* Avoid single-point contours since they are never */ + /* rasterized. In some fonts, they correspond to mark */ + /* attachment points that are way outside of the glyph's */ + /* real outline. */ + if ( last <= first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bs ) || + AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) + { + for ( pp = first; pp <= last; pp++ ) + { + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + ascender = FT_MAX( ascender, best_y + y_offset ); + } + else + descender = FT_MIN( descender, points[pp].y + y_offset ); + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + { + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + descender = FT_MIN( descender, best_y + y_offset ); + } + else + ascender = FT_MAX( ascender, points[pp].y + y_offset ); + } + } + + if ( best_point > best_contour_last ) + { + best_contour_first = first; + best_contour_last = last; + } + } + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + if ( best_point >= 0 ) + { + FT_Pos best_x = points[best_point].x; + FT_Int prev, next; + FT_Int best_segment_first, best_segment_last; + FT_Int best_on_point_first, best_on_point_last; + FT_Pos dist; + + + best_segment_first = best_point; + best_segment_last = best_point; + + if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON ) + { + best_on_point_first = best_point; + best_on_point_last = best_point; + } + else + { + best_on_point_first = -1; + best_on_point_last = -1; + } + + /* look for the previous and next points on the contour */ + /* that are not on the same Y coordinate, then threshold */ + /* the `closeness'... */ + prev = best_point; + next = prev; + + do + { + if ( prev > best_contour_first ) + prev--; + else + prev = best_contour_last; + + dist = FT_ABS( points[prev].y - best_y ); + /* accept a small distance or a small angle (both values are */ + /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ + if ( dist > 5 ) + if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) + break; + + best_segment_first = prev; + + if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON ) + { + best_on_point_first = prev; + if ( best_on_point_last < 0 ) + best_on_point_last = prev; + } + + } while ( prev != best_point ); + + do + { + if ( next < best_contour_last ) + next++; + else + next = best_contour_first; + + dist = FT_ABS( points[next].y - best_y ); + if ( dist > 5 ) + if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) + break; + + best_segment_last = next; + + if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON ) + { + best_on_point_last = next; + if ( best_on_point_first < 0 ) + best_on_point_first = next; + } + + } while ( next != best_point ); + + if ( AF_LATIN_IS_LONG_BLUE( bs ) ) + { + /* If this flag is set, we have an additional constraint to */ + /* get the blue zone distance: Find a segment of the topmost */ + /* (or bottommost) contour that is longer than a heuristic */ + /* threshold. This ensures that small bumps in the outline */ + /* are ignored (for example, the `vertical serifs' found in */ + /* many Hebrew glyph designs). */ + + /* If this segment is long enough, we are done. Otherwise, */ + /* search the segment next to the extremum that is long */ + /* enough, has the same direction, and a not too large */ + /* vertical distance from the extremum. Note that the */ + /* algorithm doesn't check whether the found segment is */ + /* actually the one (vertically) nearest to the extremum. */ + + /* heuristic threshold value */ + FT_Pos length_threshold = metrics->units_per_em / 25; + + + dist = FT_ABS( points[best_segment_last].x - + points[best_segment_first].x ); + + if ( dist < length_threshold && + best_segment_last - best_segment_first + 2 <= + best_contour_last - best_contour_first ) + { + /* heuristic threshold value */ + FT_Pos height_threshold = metrics->units_per_em / 4; + + FT_Int first; + FT_Int last; + FT_Bool hit; + + /* we intentionally declare these two variables */ + /* outside of the loop since various compilers emit */ + /* incorrect warning messages otherwise, talking about */ + /* `possibly uninitialized variables' */ + FT_Int p_first = 0; /* make compiler happy */ + FT_Int p_last = 0; + + FT_Bool left2right; + + + /* compute direction */ + prev = best_point; + + do + { + if ( prev > best_contour_first ) + prev--; + else + prev = best_contour_last; + + if ( points[prev].x != best_x ) + break; + + } while ( prev != best_point ); + + /* skip glyph for the degenerate case */ + if ( prev == best_point ) + continue; + + left2right = FT_BOOL( points[prev].x < points[best_point].x ); + + first = best_segment_last; + last = first; + hit = 0; + + do + { + FT_Bool l2r; + FT_Pos d; + + + if ( !hit ) + { + /* no hit; adjust first point */ + first = last; + + /* also adjust first and last on point */ + if ( FT_CURVE_TAG( outline.tags[first] ) == + FT_CURVE_TAG_ON ) + { + p_first = first; + p_last = first; + } + else + { + p_first = -1; + p_last = -1; + } + + hit = 1; + } + + if ( last < best_contour_last ) + last++; + else + last = best_contour_first; + + if ( FT_ABS( best_y - points[first].y ) > height_threshold ) + { + /* vertical distance too large */ + hit = 0; + continue; + } + + /* same test as above */ + dist = FT_ABS( points[last].y - points[first].y ); + if ( dist > 5 ) + if ( FT_ABS( points[last].x - points[first].x ) <= + 20 * dist ) + { + hit = 0; + continue; + } + + if ( FT_CURVE_TAG( outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + p_last = last; + if ( p_first < 0 ) + p_first = last; + } + + l2r = FT_BOOL( points[first].x < points[last].x ); + d = FT_ABS( points[last].x - points[first].x ); + + if ( l2r == left2right && + d >= length_threshold ) + { + /* all constraints are met; update segment after */ + /* finding its end */ + do + { + if ( last < best_contour_last ) + last++; + else + last = best_contour_first; + + d = FT_ABS( points[last].y - points[first].y ); + if ( d > 5 ) + if ( FT_ABS( points[next].x - points[first].x ) <= + 20 * dist ) + { + if ( last > best_contour_first ) + last--; + else + last = best_contour_last; + break; + } + + p_last = last; + + if ( FT_CURVE_TAG( outline.tags[last] ) == + FT_CURVE_TAG_ON ) + { + p_last = last; + if ( p_first < 0 ) + p_first = last; + } + + } while ( last != best_segment_first ); + + best_y = points[first].y; + + best_segment_first = first; + best_segment_last = last; + + best_on_point_first = p_first; + best_on_point_last = p_last; + + break; + } + + } while ( last != best_segment_first ); + } + } + + /* for computing blue zones, we add the y offset as returned */ + /* by the currently used OpenType feature -- for example, */ + /* superscript glyphs might be identical to subscript glyphs */ + /* with a vertical shift */ + best_y += y_offset; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( num_idx == 1 ) + FT_TRACE5(( " U+%04lX: best_y = %5ld", ch, best_y )); + else + FT_TRACE5(( " component %d of cluster starting with U+%04lX:" + " best_y = %5ld", i, ch, best_y )); +#endif + + /* now set the `round' flag depending on the segment's kind: */ + /* */ + /* - if the horizontal distance between the first and last */ + /* `on' point is larger than a heuristic threshold */ + /* we have a flat segment */ + /* - if either the first or the last point of the segment is */ + /* an `off' point, the segment is round, otherwise it is */ + /* flat */ + if ( best_on_point_first >= 0 && + best_on_point_last >= 0 && + ( FT_ABS( points[best_on_point_last].x - + points[best_on_point_first].x ) ) > + flat_threshold ) + round = 0; + else + round = FT_BOOL( + FT_CURVE_TAG( outline.tags[best_segment_first] ) != + FT_CURVE_TAG_ON || + FT_CURVE_TAG( outline.tags[best_segment_last] ) != + FT_CURVE_TAG_ON ); + + if ( round && AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) + { + /* only use flat segments for a neutral blue zone */ + FT_TRACE5(( " (round, skipped)\n" )); + continue; + } + + FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); + } + + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + { + if ( best_y > best_y_extremum ) + { + best_y_extremum = best_y; + best_round = round; + } + } + else + { + if ( best_y < best_y_extremum ) + { + best_y_extremum = best_y; + best_round = round; + } + } + + } /* end for loop */ + + if ( !( best_y_extremum == FT_INT_MIN || + best_y_extremum == FT_INT_MAX ) ) + { + if ( best_round ) + rounds[num_rounds++] = best_y_extremum; + else + flats[num_flats++] = best_y_extremum; + } + + } /* end while loop */ + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + FT_TRACE5(( " empty\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = &axis->blues[axis->blue_count]; + blue_ref = &blue->ref.org; + blue_shoot = &blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats [num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( ( AF_LATIN_IS_TOP_BLUE( bs ) || + AF_LATIN_IS_SUB_TOP_BLUE( bs) ) ^ over_ref ) + { + *blue_ref = + *blue_shoot = ( shoot + ref ) / 2; + + FT_TRACE5(( " [overshoot smaller than reference," + " taking mean value]\n" )); + } + } + + blue->ascender = ascender; + blue->descender = descender; + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_SUB_TOP; + if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_NEUTRAL; + + /* + * The following flag is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + FT_TRACE5(( " -> reference = %ld\n", *blue_ref )); + FT_TRACE5(( " overshoot = %ld\n", *blue_shoot )); + + } /* end for loop */ + + af_shaper_buf_destroy( face, shaper_buf ); + + if ( axis->blue_count ) + { + /* we finally check whether blue zones are ordered; */ + /* `ref' and `shoot' values of two blue zones must not overlap */ + + FT_UInt i; + AF_LatinBlue blue_sorted[AF_BLUE_STRINGSET_MAX_LEN + 2]; + + + for ( i = 0; i < axis->blue_count; i++ ) + blue_sorted[i] = &axis->blues[i]; + + /* sort bottoms of blue zones... */ + af_latin_sort_blue( axis->blue_count, blue_sorted ); + + /* ...and adjust top values if necessary */ + for ( i = 0; i < axis->blue_count - 1; i++ ) + { + FT_Pos* a; + FT_Pos* b; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool a_is_top = 0; +#endif + + + if ( blue_sorted[i]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + { + a = &blue_sorted[i]->shoot.org; +#ifdef FT_DEBUG_LEVEL_TRACE + a_is_top = 1; +#endif + } + else + a = &blue_sorted[i]->ref.org; + + if ( blue_sorted[i + 1]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + b = &blue_sorted[i + 1]->shoot.org; + else + b = &blue_sorted[i + 1]->ref.org; + + if ( *a > *b ) + { + *a = *b; + FT_TRACE5(( "blue zone overlap:" + " adjusting %s %td to %ld\n", + a_is_top ? "overshoot" : "reference", + blue_sorted[i] - axis->blues, + *a )); + } + } + + FT_TRACE5(( "\n" )); + + return 0; + } + else + { + /* disable hinting for the current style if there are no blue zones */ + + AF_FaceGlobals globals = metrics->root.globals; + FT_UShort* gstyles = globals->glyph_styles; + + FT_UInt i; + + + FT_TRACE5(( "no blue zones found:" + " hinting disabled for this style\n" )); + + for ( i = 0; i < globals->glyph_count; i++ ) + { + if ( ( gstyles[i] & AF_STYLE_MASK ) == sc->style ) + gstyles[i] = AF_STYLE_NONE_DFLT; + } + + FT_TRACE5(( "\n" )); + + return 1; + } + } + + + /* Check whether all ASCII digits have the same advance width. */ + + FT_LOCAL_DEF( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Bool started = 0, same_width = 1; + FT_Long advance = 0, old_advance = 0; + + /* If HarfBuzz is not available, we need a pointer to a single */ + /* unsigned long value. */ +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + void* shaper_buf; +#else + FT_ULong shaper_buf_; + void* shaper_buf = &shaper_buf_; +#endif + + /* in all supported charmaps, digits have character codes 0x30-0x39 */ + const char digits[] = "0 1 2 3 4 5 6 7 8 9"; + const char* p; + + + p = digits; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + shaper_buf = af_shaper_buf_create( face ); +#endif + + while ( *p ) + { + FT_ULong glyph_index; + unsigned int num_idx; + + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + &advance, + NULL ); + if ( !glyph_index ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + af_shaper_buf_destroy( face, shaper_buf ); + + metrics->root.digits_have_same_width = same_width; + } + + + /* Initialize global metrics. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_metrics_init( AF_StyleMetrics metrics_, /* AF_LatinMetrics */ + FT_Face face ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + FT_Error error = FT_Err_Ok; + + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + { + af_latin_metrics_init_widths( metrics, face ); + if ( af_latin_metrics_init_blues( metrics, face ) ) + { + /* use internal error code to indicate missing blue zones */ + error = -1; + goto Exit; + } + af_latin_metrics_check_digits( metrics, face ); + } + + Exit: + face->charmap = oldmap; + return error; + } + + + /* Adjust scaling value, then scale and shift widths */ + /* and blue zones (if applicable) for given dimension. */ + + static void + af_latin_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct X and Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + { + AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &Axis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled; + FT_Pos threshold; + FT_Pos fitted; + FT_UInt limit; + FT_UInt ppem; + + + scaled = FT_MulFix( blue->shoot.org, scale ); + ppem = metrics->root.scaler.face->size->metrics.x_ppem; + limit = metrics->root.globals->increase_x_height; + threshold = 40; + + /* if the `increase-x-height' property is active, */ + /* we round up much more often */ + if ( limit && + ppem <= limit && + ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) + threshold = 52; + + fitted = ( scaled + threshold ) & ~63; + + if ( scaled != fitted ) + { +#if 0 + if ( dim == AF_DIMENSION_HORZ ) + { + if ( fitted < scaled ) + scale -= scale / 50; /* scale *= 0.98 */ + } + else +#endif + if ( dim == AF_DIMENSION_VERT ) + { + FT_Pos max_height; + FT_Pos dist; + FT_Fixed new_scale; + + + new_scale = FT_MulDiv( scale, fitted, scaled ); + + /* the scaling should not change the result by more than two pixels */ + max_height = metrics->units_per_em; + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + max_height = FT_MAX( max_height, Axis->blues[nn].ascender ); + max_height = FT_MAX( max_height, -Axis->blues[nn].descender ); + } + + dist = FT_ABS( FT_MulFix( max_height, new_scale - scale ) ); + dist &= ~127; + + if ( dist == 0 ) + { + FT_TRACE5(( "af_latin_metrics_scale_dim:" + " x height alignment (style `%s'):\n", + af_style_names[metrics->root.style_class->style] )); + FT_TRACE5(( " " + " vertical scaling changed" + " from %.5f to %.5f (by %ld%%)\n", + (double)scale / 65536, + (double)new_scale / 65536, + ( fitted - scaled ) * 100 / scaled )); + FT_TRACE5(( "\n" )); + + scale = new_scale; + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + { + FT_TRACE5(( "af_latin_metrics_scale_dim:" + " x height alignment (style `%s'):\n", + af_style_names[metrics->root.style_class->style] )); + FT_TRACE5(( " " + " excessive vertical scaling abandoned\n" )); + FT_TRACE5(( "\n" )); + } +#endif + } + } + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + FT_TRACE5(( "%s widths (style `%s')\n", + dim == AF_DIMENSION_HORZ ? "horizontal" : "vertical", + af_style_names[metrics->root.style_class->style] )); + + /* scale the widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + + FT_TRACE5(( " %ld scaled to %.2f\n", + width->org, + (double)width->cur / 64 )); + } + + FT_TRACE5(( "\n" )); + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 5/8 pixels */ + axis->extra_light = + FT_BOOL( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( axis->extra_light ) + { + FT_TRACE5(( "`%s' style is extra light (at current resolution)\n", + af_style_names[metrics->root.style_class->style] )); + FT_TRACE5(( "\n" )); + } +#endif + + if ( dim == AF_DIMENSION_VERT ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( axis->blue_count ) + FT_TRACE5(( "blue zones (style `%s')\n", + af_style_names[metrics->root.style_class->style] )); +#endif + + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { +#if 0 + FT_Pos delta1; +#endif + FT_Pos delta2; + + + /* use discrete values for blue zone widths */ + +#if 0 + + /* generic, original code */ + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + +#else + + /* simplified version due to abs(dist) <= 48 */ + delta2 = dist; + if ( dist < 0 ) + delta2 = -delta2; + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 48 ) + delta2 = 32; + else + delta2 = 64; + + if ( dist < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit - delta2; + +#endif + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + + /* use sub-top blue zone only if it doesn't overlap with */ + /* another (non-sup-top) blue zone; otherwise, the */ + /* effect would be similar to a neutral blue zone, which */ + /* is not desired here */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_UInt i; + + + if ( !( blue->flags & AF_LATIN_BLUE_SUB_TOP ) ) + continue; + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + for ( i = 0; i < axis->blue_count; i++ ) + { + AF_LatinBlue b = &axis->blues[i]; + + + if ( b->flags & AF_LATIN_BLUE_SUB_TOP ) + continue; + if ( !( b->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + if ( b->ref.fit <= blue->shoot.fit && + b->shoot.fit >= blue->ref.fit ) + { + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + break; + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + + + FT_TRACE5(( " reference %d: %ld scaled to %.2f%s\n", + nn, + blue->ref.org, + (double)blue->ref.fit / 64, + ( blue->flags & AF_LATIN_BLUE_ACTIVE ) ? "" + : " (inactive)" )); + FT_TRACE5(( " overshoot %d: %ld scaled to %.2f%s\n", + nn, + blue->shoot.org, + (double)blue->shoot.fit / 64, + ( blue->flags & AF_LATIN_BLUE_ACTIVE ) ? "" + : " (inactive)" )); + } +#endif + } + } + + + /* Scale global values in both directions. */ + + FT_LOCAL_DEF( void ) + af_latin_metrics_scale( AF_StyleMetrics metrics_, /* AF_LatinMetrics */ + AF_Scaler scaler ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + metrics->root.scaler.flags = scaler->flags; + + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + FT_CALLBACK_DEF( void ) + af_latin_get_standard_widths( AF_StyleMetrics metrics_, /* AF_LatinMetrics */ + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Walk over all contours and compute its segments. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = FT_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point last = point->prev; + int on_edge = 0; + + /* we call values measured along a segment (point->v) */ + /* `coordinates', and values orthogonal to it (point->u) */ + /* `positions' */ + FT_Pos min_pos = 32000; + FT_Pos max_pos = -32000; + FT_Pos min_coord = 32000; + FT_Pos max_coord = -32000; + FT_UShort min_flags = AF_FLAG_NONE; + FT_UShort max_flags = AF_FLAG_NONE; + FT_Pos min_on_coord = 32000; + FT_Pos max_on_coord = -32000; + + FT_Bool passed; + + AF_Segment prev_segment = NULL; + + FT_Pos prev_min_pos = min_pos; + FT_Pos prev_max_pos = max_pos; + FT_Pos prev_min_coord = min_coord; + FT_Pos prev_max_coord = max_coord; + FT_UShort prev_min_flags = min_flags; + FT_UShort prev_max_flags = max_flags; + FT_Pos prev_min_on_coord = min_on_coord; + FT_Pos prev_max_on_coord = max_on_coord; + + + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + break; + } + if ( point == last ) + break; + } + } + + last = point; + passed = 0; + + for (;;) + { + FT_Pos u, v; + + + if ( on_edge ) + { + /* get minimum and maximum position */ + u = point->u; + if ( u < min_pos ) + min_pos = u; + if ( u > max_pos ) + max_pos = u; + + /* get minimum and maximum coordinate together with flags */ + v = point->v; + if ( v < min_coord ) + { + min_coord = v; + min_flags = point->flags; + } + if ( v > max_coord ) + { + max_coord = v; + max_flags = point->flags; + } + + /* get minimum and maximum coordinate of `on' points */ + if ( !( point->flags & AF_FLAG_CONTROL ) ) + { + v = point->v; + if ( v < min_on_coord ) + min_on_coord = v; + if ( v > max_on_coord ) + max_on_coord = v; + } + + if ( point->out_dir != segment_dir || point == last ) + { + /* check whether the new segment's start point is identical to */ + /* the previous segment's end point; for example, this might */ + /* happen for spikes */ + + if ( !prev_segment || segment->first != prev_segment->last ) + { + /* points are different: we are just leaving an edge, thus */ + /* record a new segment */ + + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); + + /* a segment is round if either its first or last point */ + /* is a control point, and the length of the on points */ + /* inbetween doesn't exceed a heuristic limit */ + if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && + ( max_on_coord - min_on_coord ) < flat_threshold ) + segment->flags |= AF_EDGE_ROUND; + + segment->min_coord = (FT_Short)min_coord; + segment->max_coord = (FT_Short)max_coord; + segment->height = segment->max_coord - segment->min_coord; + + prev_segment = segment; + prev_min_pos = min_pos; + prev_max_pos = max_pos; + prev_min_coord = min_coord; + prev_max_coord = max_coord; + prev_min_flags = min_flags; + prev_max_flags = max_flags; + prev_min_on_coord = min_on_coord; + prev_max_on_coord = max_on_coord; + } + else + { + /* points are the same: we don't create a new segment but */ + /* merge the current segment with the previous one */ + + if ( prev_segment->last->in_dir == point->in_dir ) + { + /* we have identical directions (this can happen for */ + /* degenerate outlines that move zig-zag along the main */ + /* axis without changing the coordinate value of the other */ + /* axis, and where the segments have just been merged): */ + /* unify segments */ + + /* update constraints */ + + if ( prev_min_pos < min_pos ) + min_pos = prev_min_pos; + if ( prev_max_pos > max_pos ) + max_pos = prev_max_pos; + + if ( prev_min_coord < min_coord ) + { + min_coord = prev_min_coord; + min_flags = prev_min_flags; + } + if ( prev_max_coord > max_coord ) + { + max_coord = prev_max_coord; + max_flags = prev_max_flags; + } + + if ( prev_min_on_coord < min_on_coord ) + min_on_coord = prev_min_on_coord; + if ( prev_max_on_coord > max_on_coord ) + max_on_coord = prev_max_on_coord; + + prev_segment->last = point; + prev_segment->pos = (FT_Short)( ( min_pos + + max_pos ) >> 1 ); + prev_segment->delta = (FT_Short)( ( max_pos - + min_pos ) >> 1 ); + + if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && + ( max_on_coord - min_on_coord ) < flat_threshold ) + prev_segment->flags |= AF_EDGE_ROUND; + else + prev_segment->flags &= ~AF_EDGE_ROUND; + + prev_segment->min_coord = (FT_Short)min_coord; + prev_segment->max_coord = (FT_Short)max_coord; + prev_segment->height = prev_segment->max_coord - + prev_segment->min_coord; + } + else + { + /* we have different directions; use the properties of the */ + /* longer segment and discard the other one */ + + if ( FT_ABS( prev_max_coord - prev_min_coord ) > + FT_ABS( max_coord - min_coord ) ) + { + /* discard current segment */ + + if ( min_pos < prev_min_pos ) + prev_min_pos = min_pos; + if ( max_pos > prev_max_pos ) + prev_max_pos = max_pos; + + prev_segment->last = point; + prev_segment->pos = (FT_Short)( ( prev_min_pos + + prev_max_pos ) >> 1 ); + prev_segment->delta = (FT_Short)( ( prev_max_pos - + prev_min_pos ) >> 1 ); + } + else + { + /* discard previous segment */ + + if ( prev_min_pos < min_pos ) + min_pos = prev_min_pos; + if ( prev_max_pos > max_pos ) + max_pos = prev_max_pos; + + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); + + if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && + ( max_on_coord - min_on_coord ) < flat_threshold ) + segment->flags |= AF_EDGE_ROUND; + + segment->min_coord = (FT_Short)min_coord; + segment->max_coord = (FT_Short)max_coord; + segment->height = segment->max_coord - + segment->min_coord; + + *prev_segment = *segment; + + prev_min_pos = min_pos; + prev_max_pos = max_pos; + prev_min_coord = min_coord; + prev_max_coord = max_coord; + prev_min_flags = min_flags; + prev_max_flags = max_flags; + prev_min_on_coord = min_on_coord; + prev_max_on_coord = max_on_coord; + } + } + + axis->num_segments--; + } + + on_edge = 0; + segment = NULL; + + /* fall through */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + /* if we are not on an edge, check whether the major direction */ + /* coincides with the current point's `out' direction, or */ + /* whether we have a single-point contour */ + if ( !on_edge && + ( FT_ABS( point->out_dir ) == major_dir || + point == point->prev ) ) + { + /* + * For efficiency, we restrict the number of segments to 1000, + * which is a heuristic value: it is very unlikely that a glyph + * with so many segments can be hinted in a sensible way. + * Reasons: + * + * - The glyph has really 1000 segments; this implies that it has + * at least 2000 outline points. Assuming 'normal' fonts that + * have superfluous points optimized away, viewing such a glyph + * only makes sense at large magnifications where hinting + * isn't applied anyway. + * + * - We have a broken glyph. Hinting doesn't make sense in this + * case either. + */ + if ( axis->num_segments > 1000 ) + { + FT_TRACE0(( "af_latin_hints_compute_segments:" + " more than 1000 segments in this glyph;\n" )); + FT_TRACE0(( " " + " hinting is suppressed\n" )); + axis->num_segments = 0; + return FT_Err_Ok; + } + + /* this is the start of a new segment! */ + segment_dir = (AF_Direction)point->out_dir; + + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + /* clear all segment fields */ + segment[0] = seg0; + + segment->dir = (FT_Char)segment_dir; + segment->first = point; + segment->last = point; + + /* `af_axis_hints_new_segment' reallocates memory, */ + /* thus we have to refresh the `prev_segment' pointer */ + if ( prev_segment ) + prev_segment = segment - 1; + + min_pos = max_pos = point->u; + min_coord = max_coord = point->v; + min_flags = max_flags = point->flags; + + if ( point->flags & AF_FLAG_CONTROL ) + { + min_on_coord = 32000; + max_on_coord = -32000; + } + else + min_on_coord = max_on_coord = point->v; + + on_edge = 1; + + if ( point == point->prev ) + { + /* we have a one-point segment: this is a one-point */ + /* contour with `in' and `out' direction set to */ + /* AF_DIR_NONE */ + segment->pos = (FT_Short)min_pos; + + if (point->flags & AF_FLAG_CONTROL) + segment->flags |= AF_EDGE_ROUND; + + segment->min_coord = (FT_Short)point->v; + segment->max_coord = (FT_Short)point->v; + segment->height = 0; + + on_edge = 0; + segment = NULL; + } + } + + point = point->next; + } + + } /* contours */ + + + /* now slightly increase the height of segments if this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = FT_OFFSET( segments, axis->num_segments ); + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first_v < last_v ) + { + AF_Point p; + + + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + AF_Point p; + + + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + + Exit: + return error; + } + + + /* Link segments to form stems and serifs. If `width_count' and */ + /* `widths' are non-zero, use them to fine-tune the scoring function. */ + + FT_LOCAL_DEF( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); + FT_Pos len_threshold, len_score, dist_score, max_width; + AF_Segment seg1, seg2; + + + if ( width_count ) + max_width = widths[width_count - 1].org; + else + max_width = 0; + + /* a heuristic value to set up a minimum value for overlapping */ + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + /* a heuristic value to weight lengths */ + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + + /* a heuristic value to weight distances (no call to */ + /* AF_LATIN_CONSTANT needed, since we work on multiples */ + /* of the stem width) */ + dist_score = 3000; + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + if ( seg1->dir != axis->major_dir ) + continue; + + /* search for stems having opposite directions, */ + /* with seg1 to the `left' of seg2 */ + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + + + if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 ) + { + /* compute distance between the two segments */ + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + /* compute maximum coordinate difference of the two segments */ + /* (that is, how much they overlap) */ + len = max - min; + if ( len >= len_threshold ) + { + /* + * The score is the sum of two demerits indicating the + * `badness' of a fit, measured along the segments' main axis + * and orthogonal to it, respectively. + * + * - The less overlapping along the main axis, the worse it + * is, causing a larger demerit. + * + * - The nearer the orthogonal distance to a stem width, the + * better it is, causing a smaller demerit. For simplicity, + * however, we only increase the demerit for values that + * exceed the largest stem width. + */ + + FT_Pos dist = pos2 - pos1; + + FT_Pos dist_demerit, score; + + + if ( max_width ) + { + /* distance demerits are based on multiples of `max_width'; */ + /* we scale by 1024 for getting more precision */ + FT_Pos delta = ( dist << 10 ) / max_width - ( 1 << 10 ); + + + if ( delta > 10000 ) + dist_demerit = 32000; + else if ( delta > 0 ) + dist_demerit = delta * delta / dist_score; + else + dist_demerit = 0; + } + else + dist_demerit = dist; /* default if no widths available */ + + score = dist_demerit + len_score / len; + + /* and we search for the smallest score */ + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now compute the `serif' segments, cf. explanations in `afhints.h' */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = NULL; + seg1->serif = seg2->link; + } + } + } + } + + + /* Link segments to edges, using feature analysis for selection. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = FT_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_StyleClass style_class = hints->metrics->style_class; + AF_ScriptClass script_class = af_script_classes[style_class->script]; + + FT_Bool top_to_bottom_hinting = 0; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = FT_OFFSET( segments, axis->num_segments ); + AF_Segment seg; + +#if 0 + AF_Direction up_dir; +#endif + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + FT_Pos segment_width_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + +#if 0 + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; +#endif + + if ( dim == AF_DIMENSION_VERT ) + top_to_bottom_hinting = script_class->top_to_bottom_hinting; + + /* + * We ignore all segments that are less than 1 pixel in length + * to avoid many problems with serif fonts. We compute the + * corresponding threshold in font units. + */ + if ( dim == AF_DIMENSION_HORZ ) + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + else + segment_length_threshold = 0; + + /* + * Similarly, we ignore segments that have a width delta + * larger than 0.5px (i.e., a width larger than 1px). + */ + segment_width_threshold = FT_DivFix( 32, scale ); + + /********************************************************************** + * + * We begin by generating a sorted table of edges for the current + * direction. To do so, we simply scan each segment and try to find + * an edge in our table that corresponds to its position. + * + * If no edge is found, we create and insert a new edge in the + * sorted table. Otherwise, we simply add the segment to the edge's + * list which gets processed in the second step to compute the + * edge's properties. + * + * Note that the table of edges is sorted along the segment/edge + * position. + * + */ + + /* assure that edge distance threshold is at most 0.25px */ + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_UInt ee; + + + /* ignore too short segments, too wide ones, and, in this loop, */ + /* one-point segments without a direction */ + if ( seg->height < segment_length_threshold || + seg->delta > segment_width_threshold || + seg->dir == AF_DIR_NONE ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif && + 2 * seg->height < 3 * segment_length_threshold ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + top_to_bottom_hinting, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->dir = seg->dir; + edge->fpos = seg->pos; + edge->opos = FT_MulFix( seg->pos, scale ); + edge->pos = edge->opos; + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /* we loop again over all segments to catch one-point segments */ + /* without a direction: if possible, link them to existing edges */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_UInt ee; + + + if ( seg->dir != AF_DIR_NONE ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold ) + { + found = edge; + break; + } + } + + /* one-point segments without a match are ignored */ + if ( found ) + { + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /******************************************************************* + * + * Good, we now compute each edge's properties according to the + * segments found on its position. Basically, these are + * + * - the edge's main direction + * - stem edge, serif edge or both (which defaults to stem then) + * - rounded edge, straight or both (which defaults to straight) + * - link for edge + * + */ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ +#if 0 + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ +#endif + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + +#if 0 + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord - seg->min_coord; + else + downs += seg->max_coord - seg->min_coord; +#endif + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = FT_BOOL( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = NULL; + } + } + + Exit: + return error; + } + + + /* Detect segments and edges for given dimension. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin_hints_link_segments( hints, width_count, widths, dim ); + + error = af_latin_hints_compute_edges( hints, dim ); + } + + return error; + } + + + /* Compute all edges which lie within blue zones. */ + + static void + af_latin_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edge, axis->num_edges ); + AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; + FT_Fixed scale = latin->scale; + + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_UInt bb; + AF_Width best_blue = NULL; + FT_Bool best_blue_is_neutral = 0; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + /* (the value 40 is heuristic) */ + best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); + + /* assure a minimum distance of 0.5px */ + if ( best_dist > 64 / 2 ) + best_dist = 64 / 2; + + for ( bb = 0; bb < latin->blue_count; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_neutral_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too large) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges (against the major */ + /* direction); if it is a bottom zone, check for left edges (in */ + /* the major direction) -- this assumes the TrueType convention */ + /* for the orientation of contours */ + is_top_blue = + (FT_Byte)( ( blue->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) != 0 ); + is_neutral_blue = + (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_NEUTRAL ) != 0); + is_major_dir = + FT_BOOL( edge->dir == axis->major_dir ); + + /* neutral blue zones are handled for both directions */ + if ( is_top_blue ^ is_major_dir || is_neutral_blue ) + { + FT_Pos dist; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - blue->ref.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = &blue->ref; + best_blue_is_neutral = is_neutral_blue; + } + + /* now compare it to the overshoot position and check whether */ + /* the edge is rounded, and whether the edge is over the */ + /* reference position of a top zone, or under the reference */ + /* position of a bottom zone (provided we don't have a */ + /* neutral blue zone) */ + if ( edge->flags & AF_EDGE_ROUND && + dist != 0 && + !is_neutral_blue ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = &blue->shoot; + best_blue_is_neutral = is_neutral_blue; + } + } + } + } + } + + if ( best_blue ) + { + edge->blue_edge = best_blue; + if ( best_blue_is_neutral ) + edge->flags |= AF_EDGE_NEUTRAL; + } + } + } + + + /* Initalize hinting engine. */ + + static FT_Error + af_latin_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics_ ) /* AF_LatinMetrics */ + { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified by `af_latin_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels unless in `light' or `lcd' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' or `lcd' mode we disable horizontal hinting completely. + * We also do it if the face is italic. + * + * However, if warping is enabled (which only works in `light' hinting + * mode), advance widths get adjusted, too. + */ + if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || + ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* Snap a given width in scaled coordinates to one of the */ + /* current standard widths. */ + + static FT_Pos + af_latin_snap_width( AF_Width widths, + FT_UInt count, + FT_Pos width ) + { + FT_UInt n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* Compute the snapped width of a given stem, ignoring very thin ones. */ + /* There is a lot of voodoo in this function; changing the hard-coded */ + /* parameters influence the whole hinting process. */ + + static FT_Pos + af_latin_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + FT_Pos base_delta, + FT_UInt base_flags, + FT_UInt stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + if ( ( stem_flags & AF_EDGE_SERIF ) && + vertical && + ( dist < 3 * 64 ) ) + goto Done_Width; + + else if ( base_flags & AF_EDGE_ROUND ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; + + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + { + /* A stem's end position depends on two values: the start */ + /* position and the stem length. The former gets usually */ + /* rounded to the grid, while the latter gets rounded also if it */ + /* exceeds a certain length (see below in this function). This */ + /* `double rounding' can lead to a great difference to the */ + /* original, unhinted position; this normally doesn't matter for */ + /* large PPEM values, but for small sizes it can easily make */ + /* outlines collide. For this reason, we adjust the stem length */ + /* by a small amount depending on the PPEM value in case the */ + /* former and latter rounding both point into the same */ + /* direction. */ + + FT_Pos bdelta = 0; + + + if ( ( ( width > 0 ) && ( base_delta > 0 ) ) || + ( ( width < 0 ) && ( base_delta < 0 ) ) ) + { + FT_UInt ppem = metrics->root.scaler.face->size->metrics.x_ppem; + + + if ( ppem < 10 ) + bdelta = base_delta; + else if ( ppem < 30 ) + bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20; + + if ( bdelta < 0 ) + bdelta = -bdelta; + } + + dist = ( dist - bdelta + 32 ) & ~63; + } + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + FT_Pos org_dist = dist; + + + dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Pos delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if ( delta >= 16 ) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* Align one stem edge relative to the previous stem edge. */ + + static void + af_latin_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist, base_delta; + FT_Pos fitted_width; + + + dist = stem_edge->opos - base_edge->opos; + base_delta = base_edge->pos - base_edge->opos; + + fitted_width = af_latin_compute_stem_width( hints, dim, + dist, base_delta, + base_edge->flags, + stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + FT_TRACE5(( " LINK: edge %td (opos=%.2f) linked to %.2f," + " dist was %.2f, now %.2f\n", + stem_edge - hints->axis[dim].edges, + (double)stem_edge->opos / 64, (double)stem_edge->pos / 64, + (double)dist / 64, (double)fitted_width / 64 )); + } + + + /* Shift the coordinates of the `serif' edge by the same amount */ + /* as the corresponding `base' edge has been moved already. */ + + static void + af_latin_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* The main grid-fitting routine. */ + + static void + af_latin_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = FT_OFFSET( edges, axis->num_edges ); + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = NULL; + FT_Int has_serifs = 0; + + AF_StyleClass style_class = hints->metrics->style_class; + AF_ScriptClass script_class = af_script_classes[style_class->script]; + + FT_Bool top_to_bottom_hinting = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt num_actions = 0; +#endif + + + FT_TRACE5(( "latin %s edge hinting (style `%s')\n", + dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", + af_style_names[hints->metrics->style_class->style] )); + + if ( dim == AF_DIMENSION_VERT ) + top_to_bottom_hinting = script_class->top_to_bottom_hinting; + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; /* these edges form the stem to check */ + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + edge1 = NULL; + edge2 = edge->link; + + /* + * If a stem contains both a neutral and a non-neutral blue zone, + * skip the neutral one. Otherwise, outlines with different + * directions might be incorrectly aligned at the same vertical + * position. + * + * If we have two neutral blue zones, skip one of them. + * + */ + if ( edge->blue_edge && edge2 && edge2->blue_edge ) + { + FT_Byte neutral = edge->flags & AF_EDGE_NEUTRAL; + FT_Byte neutral2 = edge2->flags & AF_EDGE_NEUTRAL; + + + if ( neutral2 ) + { + edge2->blue_edge = NULL; + edge2->flags &= ~AF_EDGE_NEUTRAL; + } + else if ( neutral ) + { + edge->blue_edge = NULL; + edge->flags &= ~AF_EDGE_NEUTRAL; + } + } + + blue = edge->blue_edge; + if ( blue ) + edge1 = edge; + + /* flip edges if the other edge is aligned to a blue zone */ + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !anchor ) + FT_TRACE5(( " BLUE_ANCHOR: edge %td (opos=%.2f) snapped to %.2f," + " was %.2f (anchor=edge %td)\n", + edge1 - edges, + (double)edge1->opos / 64, (double)blue->fit / 64, + (double)edge1->pos / 64, edge - edges )); + else + FT_TRACE5(( " BLUE: edge %td (opos=%.2f) snapped to %.2f," + " was %.2f\n", + edge1 - edges, + (double)edge1->opos / 64, (double)blue->fit / 64, + (double)edge1->pos / 64 )); + + num_actions++; +#endif + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we align all other stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + FT_TRACE5(( " ASSERTION FAILED for edge %td\n", edge2 - edges )); + + af_latin_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + continue; + } + + if ( !anchor ) + { + /* if we reach this if clause, no stem has been aligned yet */ + + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin_compute_stem_width( hints, dim, + org_len, 0, + edge->flags, + edge2->flags ); + + /* some voodoo to specially round edges for small stem widths; */ + /* the idea is to align the center of a stem, then shifting */ + /* the stem edges to suitable positions */ + if ( cur_len <= 64 ) + { + /* width <= 1px */ + u_off = 32; + d_off = 32; + } + else + { + /* 1px < width < 1.5px */ + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + + FT_TRACE5(( " ANCHOR: edge %td (opos=%.2f) and %td (opos=%.2f)" + " snapped to %.2f and %.2f\n", + edge - edges, (double)edge->opos / 64, + edge2 - edges, (double)edge2->opos / 64, + (double)edge->pos / 64, (double)edge2->pos / 64 )); + + af_latin_align_linked_edge( hints, dim, edge, edge2 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions += 2; +#endif + } + else + { + FT_Pos org_pos, org_len, org_center, cur_len; + FT_Pos cur_pos1, cur_pos2, delta1, delta2; + + + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( hints, dim, + org_len, 0, + edge->flags, + edge2->flags ); + + if ( edge2->flags & AF_EDGE_DONE ) + { + FT_TRACE5(( " ADJUST: edge %td (pos=%.2f) moved to %.2f\n", + edge - edges, (double)edge->pos / 64, + (double)( edge2->pos - cur_len ) / 64 )); + + edge->pos = edge2->pos - cur_len; + } + + else if ( cur_len < 96 ) + { + FT_Pos u_off, d_off; + + + cur_pos1 = FT_PIX_ROUND( org_center ); + + if ( cur_len <= 64 ) + { + u_off = 32; + d_off = 32; + } + else + { + u_off = 38; + d_off = 26; + } + + delta1 = org_center - ( cur_pos1 - u_off ); + if ( delta1 < 0 ) + delta1 = -delta1; + + delta2 = org_center - ( cur_pos1 + d_off ); + if ( delta2 < 0 ) + delta2 = -delta2; + + if ( delta1 < delta2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + + FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)" + " snapped to %.2f and %.2f\n", + edge - edges, (double)edge->opos / 64, + edge2 - edges, (double)edge2->opos / 64, + (double)edge->pos / 64, (double)edge2->pos / 64 )); + } + + else + { + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( hints, dim, + org_len, 0, + edge->flags, + edge2->flags ); + + cur_pos1 = FT_PIX_ROUND( org_pos ); + delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; + if ( delta1 < 0 ) + delta1 = -delta1; + + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; + if ( delta2 < 0 ) + delta2 = -delta2; + + edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; + edge2->pos = edge->pos + cur_len; + + FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)" + " snapped to %.2f and %.2f\n", + edge - edges, (double)edge->opos / 64, + edge2 - edges, (double)edge2->opos / 64, + (double)edge->pos / 64, (double)edge2->pos / 64 )); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && + ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos ) + : ( edge->pos < edge[-1].pos ) ) ) + { + /* don't move if stem would (almost) disappear otherwise; */ + /* the ad-hoc value 16 corresponds to 1/4px */ + if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", + edge - edges, + (double)edge->pos / 64, + (double)edge[-1].pos / 64 )); + + num_actions++; +#endif + + edge->pos = edge[-1].pos; + } + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin_align_serif_edge( hints, edge->serif, edge ); + FT_TRACE5(( " SERIF: edge %td (opos=%.2f) serif to %td (opos=%.2f)" + " aligned to %.2f\n", + edge - edges, (double)edge->opos / 64, + edge->serif - edges, (double)edge->serif->opos / 64, + (double)edge->pos / 64 )); + } + else if ( !anchor ) + { + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + FT_TRACE5(( " SERIF_ANCHOR: edge %td (opos=%.2f)" + " snapped to %.2f\n", + edge - edges, + (double)edge->opos / 64, (double)edge->pos / 64 )); + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + + FT_TRACE5(( " SERIF_LINK1: edge %td (opos=%.2f) snapped to %.2f" + " from %td (opos=%.2f)\n", + edge - edges, (double)edge->opos / 64, + (double)edge->pos / 64, + before - edges, (double)before->opos / 64 )); + } + else + { + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); + FT_TRACE5(( " SERIF_LINK2: edge %td (opos=%.2f)" + " snapped to %.2f\n", + edge - edges, + (double)edge->opos / 64, (double)edge->pos / 64 )); + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && + ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos ) + : ( edge->pos < edge[-1].pos ) ) ) + { + /* don't move if stem would (almost) disappear otherwise; */ + /* the ad-hoc value 16 corresponds to 1/4px */ + if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", + edge - edges, + (double)edge->pos / 64, + (double)edge[-1].pos / 64 )); + + num_actions++; +#endif + edge->pos = edge[-1].pos; + } + } + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + ( top_to_bottom_hinting ? ( edge->pos < edge[1].pos ) + : ( edge->pos > edge[1].pos ) ) ) + { + /* don't move if stem would (almost) disappear otherwise; */ + /* the ad-hoc value 16 corresponds to 1/4px */ + if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", + edge - edges, + (double)edge->pos / 64, + (double)edge[1].pos / 64 )); + + num_actions++; +#endif + + edge->pos = edge[1].pos; + } + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !num_actions ) + FT_TRACE5(( " (none)\n" )); + FT_TRACE5(( "\n" )); +#endif + } + + + /* Apply the complete hinting algorithm to a latin glyph. */ + + static FT_Error + af_latin_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics_ ) /* AF_LatinMetrics */ + { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + FT_Error error; + int dim; + + AF_LatinAxis axis; + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + axis = &metrics->axis[AF_DIMENSION_HORZ]; + error = af_latin_hints_detect_features( hints, + axis->width_count, + axis->widths, + AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + axis = &metrics->axis[AF_DIMENSION_VERT]; + error = af_latin_hints_detect_features( hints, + axis->width_count, + axis->widths, + AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + /* apply blue zones to base characters only */ + if ( !( metrics->root.globals->glyph_styles[glyph_index] & AF_NONBASE ) ) + af_latin_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_latin_writing_system_class, + + AF_WRITING_SYSTEM_LATIN, + + sizeof ( AF_LatinMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_latin_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_latin_hints_apply /* style_hints_apply */ + ) + + +/* END */ diff --git a/external/freetype/src/autofit/aflatin.h b/external/freetype/src/autofit/aflatin.h new file mode 100644 index 000000000..31aa91d3b --- /dev/null +++ b/external/freetype/src/autofit/aflatin.h @@ -0,0 +1,194 @@ +/**************************************************************************** + * + * aflatin.h + * + * Auto-fitter hinting routines for latin writing system + * (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFLATIN_H_ +#define AFLATIN_H_ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + /* the `latin' writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class ) + + + /* constants are given with units_per_em == 2048 in mind */ +#define AF_LATIN_CONSTANT( metrics, c ) \ + ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * The following declarations could be embedded in the file `aflatin.c'; + * they have been made semi-public to allow alternate writing system + * hinters to re-use some of them. + */ + + +#define AF_LATIN_IS_TOP_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP ) +#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP ) +#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL ) +#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT ) +#define AF_LATIN_IS_LONG_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) + +#define AF_LATIN_MAX_WIDTHS 16 + + +#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ +#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */ +#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript top */ + /* blue zone */ +#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have neutral blue zone */ +#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustment */ + /* optimization */ + + + typedef struct AF_LatinBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; + FT_Pos ascender; + FT_Pos descender; + FT_UInt flags; + + } AF_LatinBlueRec, *AF_LatinBlue; + + + typedef struct AF_LatinAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; /* number of used widths */ + AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ + FT_Pos edge_distance_threshold; /* used for creating edges */ + FT_Pos standard_width; /* the default stem thickness */ + FT_Bool extra_light; /* is standard width very light? */ + + /* ignored for horizontal metrics */ + FT_UInt blue_count; + AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_LatinAxisRec, *AF_LatinAxis; + + + typedef struct AF_LatinMetricsRec_ + { + AF_StyleMetricsRec root; + FT_UInt units_per_em; + AF_LatinAxisRec axis[AF_DIMENSION_MAX]; + + } AF_LatinMetricsRec, *AF_LatinMetrics; + + + FT_LOCAL( FT_Error ) + af_latin_metrics_init( AF_StyleMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_scale( AF_StyleMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */ +#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */ +#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */ + /* adjustment */ +#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */ + + +#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) + +#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) + +#define AF_LATIN_HINTS_DO_MONO( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) + + + /* + * The next functions shouldn't normally be exported. However, other + * writing systems might like to use these functions as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* AFLATIN_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afloader.c b/external/freetype/src/autofit/afloader.c new file mode 100644 index 000000000..7c47d562a --- /dev/null +++ b/external/freetype/src/autofit/afloader.c @@ -0,0 +1,706 @@ +/**************************************************************************** + * + * afloader.c + * + * Auto-fitter glyph loading routines (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "afglobal.h" +#include "afloader.h" +#include "afhints.h" +#include "aferrors.h" +#include "afmodule.h" + +#include <freetype/internal/ftcalc.h> + + + /* Initialize glyph loader. */ + + FT_LOCAL_DEF( void ) + af_loader_init( AF_Loader loader, + AF_GlyphHints hints ) + { + FT_ZERO( loader ); + + loader->hints = hints; + } + + + /* Reset glyph loader and compute globals if necessary. */ + + FT_LOCAL_DEF( FT_Error ) + af_loader_reset( AF_Loader loader, + AF_Module module, + FT_Face face ) + { + FT_Error error = FT_Err_Ok; + + + loader->face = face; + loader->globals = (AF_FaceGlobals)face->autohint.data; + + if ( !loader->globals ) + { + error = af_face_globals_new( face, &loader->globals, module ); + if ( !error ) + { + face->autohint.data = (FT_Pointer)loader->globals; + face->autohint.finalizer = af_face_globals_free; + } + } + + return error; + } + + + /* Finalize glyph loader. */ + + FT_LOCAL_DEF( void ) + af_loader_done( AF_Loader loader ) + { + loader->face = NULL; + loader->globals = NULL; + loader->hints = NULL; + } + + +#define af_intToFixed( i ) \ + ( (FT_Fixed)( (FT_UInt32)(i) << 16 ) ) +#define af_fixedToInt( x ) \ + ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) +#define af_floatToFixed( f ) \ + ( (FT_Fixed)( (f) * 65536.0 + 0.5 ) ) + + + static FT_Error + af_loader_embolden_glyph_in_slot( AF_Loader loader, + FT_Face face, + AF_StyleMetrics style_metrics ) + { + FT_Error error = FT_Err_Ok; + + FT_GlyphSlot slot = face->glyph; + AF_FaceGlobals globals = loader->globals; + AF_WritingSystemClass writing_system_class; + + FT_Size_Metrics* size_metrics = &face->size->internal->autohint_metrics; + + FT_Pos stdVW = 0; + FT_Pos stdHW = 0; + + FT_Bool size_changed = size_metrics->x_ppem != + globals->stem_darkening_for_ppem; + + FT_Fixed em_size = af_intToFixed( face->units_per_EM ); + + FT_Matrix scale_down_matrix = { 0x10000L, 0, 0, 0x10000L }; + + + /* Skip stem darkening for broken fonts. */ + if ( !face->units_per_EM ) + { + error = FT_ERR( Corrupted_Font_Header ); + goto Exit; + } + + /* + * We depend on the writing system (script analyzers) to supply + * standard widths for the script of the glyph we are looking at. If + * it can't deliver, stem darkening is disabled. + */ + writing_system_class = + af_writing_system_classes[style_metrics->style_class->writing_system]; + + if ( writing_system_class->style_metrics_getstdw ) + writing_system_class->style_metrics_getstdw( style_metrics, + &stdHW, + &stdVW ); + else + { + error = FT_ERR( Unimplemented_Feature ); + goto Exit; + } + + if ( size_changed || + ( stdVW > 0 && stdVW != globals->standard_vertical_width ) ) + { + FT_Fixed darken_by_font_units_x, darken_x; + + + darken_by_font_units_x = + af_loader_compute_darkening( loader, + face, + stdVW ) ; + darken_x = FT_MulFix( darken_by_font_units_x, + size_metrics->x_scale ); + + globals->standard_vertical_width = stdVW; + globals->stem_darkening_for_ppem = size_metrics->x_ppem; + globals->darken_x = af_fixedToInt( darken_x ); + } + + if ( size_changed || + ( stdHW > 0 && stdHW != globals->standard_horizontal_width ) ) + { + FT_Fixed darken_by_font_units_y, darken_y; + + + darken_by_font_units_y = + af_loader_compute_darkening( loader, + face, + stdHW ) ; + darken_y = FT_MulFix( darken_by_font_units_y, + size_metrics->y_scale ); + + globals->standard_horizontal_width = stdHW; + globals->stem_darkening_for_ppem = size_metrics->x_ppem; + globals->darken_y = af_fixedToInt( darken_y ); + + /* + * Scale outlines down on the Y-axis to keep them inside their blue + * zones. The stronger the emboldening, the stronger the downscaling + * (plus heuristical padding to prevent outlines still falling out + * their zones due to rounding). + * + * Reason: `FT_Outline_Embolden' works by shifting the rightmost + * points of stems farther to the right, and topmost points farther + * up. This positions points on the Y-axis outside their + * pre-computed blue zones and leads to distortion when applying the + * hints in the code further below. Code outside this emboldening + * block doesn't know we are presenting it with modified outlines the + * analyzer didn't see! + * + * An unfortunate side effect of downscaling is that the emboldening + * effect is slightly decreased. The loss becomes more pronounced + * versus the CFF driver at smaller sizes, e.g., at 9ppem and below. + */ + globals->scale_down_factor = + FT_DivFix( em_size - ( darken_by_font_units_y + af_intToFixed( 8 ) ), + em_size ); + } + + FT_Outline_EmboldenXY( &slot->outline, + globals->darken_x, + globals->darken_y ); + + scale_down_matrix.yy = globals->scale_down_factor; + FT_Outline_Transform( &slot->outline, &scale_down_matrix ); + + Exit: + return error; + } + + + /* Load the glyph at index into the current slot of a face and hint it. */ + + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + AF_Module module, + FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + + FT_Size size = face->size; + FT_Size_Internal size_internal = size->internal; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal slot_internal = slot->internal; + FT_GlyphLoader gloader = slot_internal->loader; + + AF_GlyphHints hints = loader->hints; + AF_ScalerRec scaler; + AF_StyleMetrics style_metrics; + FT_UInt style_options = AF_STYLE_NONE_DFLT; + AF_StyleClass style_class; + AF_WritingSystemClass writing_system_class; + + + FT_ZERO( &scaler ); + + if ( !size_internal->autohint_metrics.x_scale || + size_internal->autohint_mode != FT_LOAD_TARGET_MODE( load_flags ) ) + { + /* switching between hinting modes usually means different scaling */ + /* values; this later on enforces recomputation of everything */ + /* related to the current size */ + + size_internal->autohint_mode = FT_LOAD_TARGET_MODE( load_flags ); + size_internal->autohint_metrics = size->metrics; + +#ifdef AF_CONFIG_OPTION_TT_SIZE_METRICS + { + FT_Size_Metrics* size_metrics = &size_internal->autohint_metrics; + + + /* set metrics to integer values and adjust scaling accordingly; */ + /* this is the same setup as with TrueType fonts, cf. function */ + /* `tt_size_reset' in file `ttobjs.c' */ + size_metrics->ascender = FT_PIX_ROUND( + FT_MulFix( face->ascender, + size_metrics->y_scale ) ); + size_metrics->descender = FT_PIX_ROUND( + FT_MulFix( face->descender, + size_metrics->y_scale ) ); + size_metrics->height = FT_PIX_ROUND( + FT_MulFix( face->height, + size_metrics->y_scale ) ); + + size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, + face->units_per_EM ); + size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, + face->units_per_EM ); + size_metrics->max_advance = FT_PIX_ROUND( + FT_MulFix( face->max_advance_width, + size_metrics->x_scale ) ); + } +#endif /* AF_CONFIG_OPTION_TT_SIZE_METRICS */ + } + + /* + * TODO: This code currently doesn't support fractional advance widths, + * i.e., placing hinted glyphs at anything other than integer + * x-positions. This is only relevant for the warper code, which + * scales and shifts glyphs to optimize blackness of stems (hinting on + * the x-axis by nature places things on pixel integers, hinting on the + * y-axis only, i.e., LIGHT mode, doesn't touch the x-axis). The delta + * values of the scaler would need to be adjusted. + */ + scaler.face = face; + scaler.x_scale = size_internal->autohint_metrics.x_scale; + scaler.x_delta = 0; + scaler.y_scale = size_internal->autohint_metrics.y_scale; + scaler.y_delta = 0; + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; + + /* note that the fallback style can't be changed anymore */ + /* after the first call of `af_loader_load_glyph' */ + error = af_loader_reset( loader, module, face ); + if ( error ) + goto Exit; + + /* + * Glyphs (really code points) are assigned to scripts. Script + * analysis is done lazily: For each glyph that passes through here, + * the corresponding script analyzer is called, but returns immediately + * if it has been run already. + */ + error = af_face_globals_get_metrics( loader->globals, glyph_index, + style_options, &style_metrics ); + if ( error ) + goto Exit; + + style_class = style_metrics->style_class; + writing_system_class = + af_writing_system_classes[style_class->writing_system]; + + loader->metrics = style_metrics; + + if ( writing_system_class->style_metrics_scale ) + writing_system_class->style_metrics_scale( style_metrics, &scaler ); + else + style_metrics->scaler = scaler; + + if ( writing_system_class->style_hints_init ) + { + error = writing_system_class->style_hints_init( hints, + style_metrics ); + if ( error ) + goto Exit; + } + + /* + * Do the main work of `af_loader_load_glyph'. Note that we never have + * to deal with composite glyphs as those get loaded into + * FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. + * In the rare cases where FT_LOAD_NO_RECURSE is set, it implies + * FT_LOAD_NO_SCALE and as such the auto-hinter is never called. + */ + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM | + FT_LOAD_LINEAR_DESIGN; + load_flags &= ~FT_LOAD_RENDER; + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + /* + * Apply stem darkening (emboldening) here before hints are applied to + * the outline. Glyphs are scaled down proportionally to the + * emboldening so that curve points don't fall outside their + * precomputed blue zones. + * + * Any emboldening done by the font driver (e.g., the CFF driver) + * doesn't reach here because the autohinter loads the unprocessed + * glyphs in font units for analysis (functions `af_*_metrics_init_*') + * and then above to prepare it for the rasterizers by itself, + * independently of the font driver. So emboldening must be done here, + * within the autohinter. + * + * All glyphs to be autohinted pass through here one by one. The + * standard widths can therefore change from one glyph to the next, + * depending on what script a glyph is assigned to (each script has its + * own set of standard widths and other metrics). The darkening amount + * must therefore be recomputed for each size and + * `standard_{vertical,horizontal}_width' change. + * + * Ignore errors and carry on without emboldening. + * + */ + + /* stem darkening only works well in `light' mode */ + if ( scaler.render_mode == FT_RENDER_MODE_LIGHT && + ( !face->internal->no_stem_darkening || + ( face->internal->no_stem_darkening < 0 && + !module->no_stem_darkening ) ) ) + af_loader_embolden_glyph_in_slot( loader, face, style_metrics ); + + loader->transformed = slot_internal->glyph_transformed; + if ( loader->transformed ) + { + FT_Matrix inverse; + + + loader->trans_matrix = slot_internal->glyph_matrix; + loader->trans_delta = slot_internal->glyph_delta; + + inverse = loader->trans_matrix; + if ( !FT_Matrix_Invert( &inverse ) ) + FT_Vector_Transform( &loader->trans_delta, &inverse ); + } + + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_OUTLINE: + /* translate the loaded glyph when an internal transform is needed */ + if ( loader->transformed ) + FT_Outline_Translate( &slot->outline, + loader->trans_delta.x, + loader->trans_delta.y ); + + /* compute original horizontal phantom points */ + /* (and ignore vertical ones) */ + loader->pp1.x = hints->x_delta; + loader->pp1.y = hints->y_delta; + loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, + hints->x_scale ) + hints->x_delta; + loader->pp2.y = hints->y_delta; + + /* be sure to check for spacing glyphs */ + if ( slot->outline.n_points == 0 ) + goto Hint_Metrics; + + /* now load the slot image into the auto-outline */ + /* and run the automatic hinting process */ + if ( writing_system_class->style_hints_apply ) + { + error = writing_system_class->style_hints_apply( + glyph_index, + hints, + &gloader->base.outline, + style_metrics ); + if ( error ) + goto Exit; + } + + /* we now need to adjust the metrics according to the change in */ + /* width/positioning that occurred during the hinting process */ + if ( scaler.render_mode != FT_RENDER_MODE_LIGHT ) + { + AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; + + + if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) + { + AF_Edge edge1 = axis->edges; /* leftmost edge */ + AF_Edge edge2 = edge1 + + axis->num_edges - 1; /* rightmost edge */ + + FT_Pos old_rsb = loader->pp2.x - edge2->opos; + /* loader->pp1.x is always zero at this point of time */ + FT_Pos old_lsb = edge1->opos; /* - loader->pp1.x */ + FT_Pos new_lsb = edge1->pos; + + /* remember unhinted values to later account */ + /* for rounding errors */ + FT_Pos pp1x_uh = new_lsb - old_lsb; + FT_Pos pp2x_uh = edge2->pos + old_rsb; + + + /* prefer too much space over too little space */ + /* for very small sizes */ + + if ( old_lsb < 24 ) + pp1x_uh -= 8; + + if ( old_rsb < 24 ) + pp2x_uh += 8; + + loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); + loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); + + if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) + loader->pp1.x -= 64; + + if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) + loader->pp2.x += 64; + + slot->lsb_delta = loader->pp1.x - pp1x_uh; + slot->rsb_delta = loader->pp2.x - pp2x_uh; + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x ); + loader->pp2.x = FT_PIX_ROUND( pp2x ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + } + /* `light' mode uses integer advance widths */ + /* but sets `lsb_delta' and `rsb_delta' */ + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x ); + loader->pp2.x = FT_PIX_ROUND( pp2x ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + + break; + + default: + /* we don't support other formats (yet?) */ + error = FT_THROW( Unimplemented_Feature ); + } + + Hint_Metrics: + { + FT_BBox bbox; + FT_Vector vvector; + + + vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; + vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; + vvector.x = FT_MulFix( vvector.x, style_metrics->scaler.x_scale ); + vvector.y = FT_MulFix( vvector.y, style_metrics->scaler.y_scale ); + + /* transform the hinted outline if needed */ + if ( loader->transformed ) + { + FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); + FT_Vector_Transform( &vvector, &loader->trans_matrix ); + } + + /* we must translate our final outline by -pp1.x and compute */ + /* the new metrics */ + if ( loader->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); + + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + + slot->metrics.width = bbox.xMax - bbox.xMin; + slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.horiBearingX = bbox.xMin; + slot->metrics.horiBearingY = bbox.yMax; + + slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); + slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); + + /* for mono-width fonts (like Andale, Courier, etc.) we need */ + /* to keep the original rounded advance width; ditto for */ + /* digits if all have the same advance width */ + if ( scaler.render_mode != FT_RENDER_MODE_LIGHT && + ( FT_IS_FIXED_WIDTH( slot->face ) || + ( af_face_globals_is_digit( loader->globals, glyph_index ) && + style_metrics->digits_have_same_width ) ) ) + { + slot->metrics.horiAdvance = + FT_MulFix( slot->metrics.horiAdvance, + style_metrics->scaler.x_scale ); + + /* Set delta values to 0. Otherwise code that uses them is */ + /* going to ruin the fixed advance width. */ + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + else + { + /* non-spacing glyphs must stay as-is */ + if ( slot->metrics.horiAdvance ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + } + + slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, + style_metrics->scaler.y_scale ); + + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + + Exit: + return error; + } + + + /* + * Compute amount of font units the face should be emboldened by, in + * analogy to the CFF driver's `cf2_computeDarkening' function. See there + * for details of the algorithm. + * + * XXX: Currently a crude adaption of the original algorithm. Do better? + */ + FT_LOCAL_DEF( FT_Fixed ) + af_loader_compute_darkening( AF_Loader loader, + FT_Face face, + FT_Pos standard_width ) + { + AF_Module module = loader->globals->module; + + FT_UShort units_per_EM; + FT_Fixed ppem, em_ratio; + FT_Fixed stem_width, stem_width_per_1000, scaled_stem, darken_amount; + FT_Int log_base_2; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + + + ppem = FT_MAX( af_intToFixed( 4 ), + af_intToFixed( face->size->metrics.x_ppem ) ); + units_per_EM = face->units_per_EM; + + em_ratio = FT_DivFix( af_intToFixed( 1000 ), + af_intToFixed ( units_per_EM ) ); + if ( em_ratio < af_floatToFixed( .01 ) ) + { + /* If something goes wrong, don't embolden. */ + return 0; + } + + x1 = module->darken_params[0]; + y1 = module->darken_params[1]; + x2 = module->darken_params[2]; + y2 = module->darken_params[3]; + x3 = module->darken_params[4]; + y3 = module->darken_params[5]; + x4 = module->darken_params[6]; + y4 = module->darken_params[7]; + + if ( standard_width <= 0 ) + { + stem_width = af_intToFixed( 75 ); /* taken from cf2font.c */ + stem_width_per_1000 = stem_width; + } + else + { + stem_width = af_intToFixed( standard_width ); + stem_width_per_1000 = FT_MulFix( stem_width, em_ratio ); + } + + log_base_2 = FT_MSB( (FT_UInt32)stem_width_per_1000 ) + + FT_MSB( (FT_UInt32)ppem ); + + if ( log_base_2 >= 46 ) + { + /* possible overflow */ + scaled_stem = af_intToFixed( x4 ); + } + else + scaled_stem = FT_MulFix( stem_width_per_1000, ppem ); + + /* now apply the darkening parameters */ + if ( scaled_stem < af_intToFixed( x1 ) ) + darken_amount = FT_DivFix( af_intToFixed( y1 ), ppem ); + + else if ( scaled_stem < af_intToFixed( x2 ) ) + { + FT_Int xdelta = x2 - x1; + FT_Int ydelta = y2 - y1; + FT_Int x = stem_width_per_1000 - + FT_DivFix( af_intToFixed( x1 ), ppem ); + + + if ( !xdelta ) + goto Try_x3; + + darken_amount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( af_intToFixed( y1 ), ppem ); + } + + else if ( scaled_stem < af_intToFixed( x3 ) ) + { + Try_x3: + { + FT_Int xdelta = x3 - x2; + FT_Int ydelta = y3 - y2; + FT_Int x = stem_width_per_1000 - + FT_DivFix( af_intToFixed( x2 ), ppem ); + + + if ( !xdelta ) + goto Try_x4; + + darken_amount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( af_intToFixed( y2 ), ppem ); + } + } + + else if ( scaled_stem < af_intToFixed( x4 ) ) + { + Try_x4: + { + FT_Int xdelta = x4 - x3; + FT_Int ydelta = y4 - y3; + FT_Int x = stem_width_per_1000 - + FT_DivFix( af_intToFixed( x3 ), ppem ); + + + if ( !xdelta ) + goto Use_y4; + + darken_amount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( af_intToFixed( y3 ), ppem ); + } + } + + else + { + Use_y4: + darken_amount = FT_DivFix( af_intToFixed( y4 ), ppem ); + } + + /* Convert darken_amount from per 1000 em to true character space. */ + return FT_DivFix( darken_amount, em_ratio ); + } + + +/* END */ diff --git a/external/freetype/src/autofit/afloader.h b/external/freetype/src/autofit/afloader.h new file mode 100644 index 000000000..e4e197e37 --- /dev/null +++ b/external/freetype/src/autofit/afloader.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * afloader.h + * + * Auto-fitter glyph loading routines (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFLOADER_H_ +#define AFLOADER_H_ + +#include "afhints.h" +#include "afmodule.h" +#include "afglobal.h" + + +FT_BEGIN_HEADER + + /* + * The autofitter module's (global) data structure to communicate with + * actual fonts. If necessary, `local' data like the current face, the + * current face's auto-hint data, or the current glyph's parameters + * relevant to auto-hinting are `swapped in'. Cf. functions like + * `af_loader_reset' and `af_loader_load_g'. + */ + + typedef struct AF_LoaderRec_ + { + /* current face data */ + FT_Face face; + AF_FaceGlobals globals; + + /* current glyph data */ + AF_GlyphHints hints; + AF_StyleMetrics metrics; + FT_Bool transformed; + FT_Matrix trans_matrix; + FT_Vector trans_delta; + FT_Vector pp1; + FT_Vector pp2; + /* we don't handle vertical phantom points */ + + } AF_LoaderRec, *AF_Loader; + + + FT_LOCAL( void ) + af_loader_init( AF_Loader loader, + AF_GlyphHints hints ); + + + FT_LOCAL( FT_Error ) + af_loader_reset( AF_Loader loader, + AF_Module module, + FT_Face face ); + + + FT_LOCAL( void ) + af_loader_done( AF_Loader loader ); + + + FT_LOCAL( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + AF_Module module, + FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags ); + + FT_LOCAL( FT_Fixed ) + af_loader_compute_darkening( AF_Loader loader, + FT_Face face, + FT_Pos standard_width ); + +/* */ + + +FT_END_HEADER + +#endif /* AFLOADER_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afmodule.c b/external/freetype/src/autofit/afmodule.c new file mode 100644 index 000000000..20a6b96bc --- /dev/null +++ b/external/freetype/src/autofit/afmodule.c @@ -0,0 +1,527 @@ +/**************************************************************************** + * + * afmodule.c + * + * Auto-fitter module implementation (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "afglobal.h" +#include "afmodule.h" +#include "afloader.h" +#include "aferrors.h" + +#ifdef FT_DEBUG_AUTOFIT + +#ifndef FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef __cplusplus + extern "C" { +#endif + extern void + af_glyph_hints_dump_segments( AF_GlyphHints hints, + FT_Bool to_stdout ); + extern void + af_glyph_hints_dump_points( AF_GlyphHints hints, + FT_Bool to_stdout ); + extern void + af_glyph_hints_dump_edges( AF_GlyphHints hints, + FT_Bool to_stdout ); +#ifdef __cplusplus + } +#endif + +#endif + + int af_debug_disable_horz_hints_; + int af_debug_disable_vert_hints_; + int af_debug_disable_blue_hints_; + + /* we use a global object instead of a local one for debugging */ + static AF_GlyphHintsRec af_debug_hints_rec_[1]; + + void* af_debug_hints_ = af_debug_hints_rec_; +#endif + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftdriver.h> +#include <freetype/internal/services/svprop.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT afmodule + + + static FT_Error + af_property_get_face_globals( FT_Face face, + AF_FaceGlobals* aglobals, + AF_Module module ) + { + FT_Error error = FT_Err_Ok; + AF_FaceGlobals globals; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + globals = (AF_FaceGlobals)face->autohint.data; + if ( !globals ) + { + /* trigger computation of the global style data */ + /* in case it hasn't been done yet */ + error = af_face_globals_new( face, &globals, module ); + if ( !error ) + { + face->autohint.data = (FT_Pointer)globals; + face->autohint.finalizer = af_face_globals_free; + } + } + + if ( !error ) + *aglobals = globals; + + return error; + } + + + static FT_Error + af_property_set( FT_Module ft_module, + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + AF_Module module = (AF_Module)ft_module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "fallback-script" ) ) + { + AF_Script* fallback_script; + FT_UInt ss; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + fallback_script = (AF_Script*)value; + + /* We translate the fallback script to a fallback style that uses */ + /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its */ + /* coverage value. */ + for ( ss = 0; af_style_classes[ss]; ss++ ) + { + AF_StyleClass style_class = af_style_classes[ss]; + + + if ( style_class->script == *fallback_script && + style_class->coverage == AF_COVERAGE_DEFAULT ) + { + module->fallback_style = ss; + break; + } + } + + if ( !af_style_classes[ss] ) + { + FT_TRACE2(( "af_property_set: Invalid value %d for property `%s'\n", + *fallback_script, property_name )); + return FT_THROW( Invalid_Argument ); + } + + return error; + } + else if ( !ft_strcmp( property_name, "default-script" ) ) + { + AF_Script* default_script; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + default_script = (AF_Script*)value; + + module->default_script = *default_script; + + return error; + } + else if ( !ft_strcmp( property_name, "increase-x-height" ) ) + { + FT_Prop_IncreaseXHeight* prop; + AF_FaceGlobals globals; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + prop = (FT_Prop_IncreaseXHeight*)value; + + error = af_property_get_face_globals( prop->face, &globals, module ); + if ( !error ) + globals->increase_x_height = prop->limit; + + return error; + } + else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_Int dp[8]; + + + if ( value_is_string ) + { + const char* s = (const char*)value; + char* ep; + int i; + + + /* eight comma-separated numbers */ + for ( i = 0; i < 7; i++ ) + { + dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( *ep != ',' || s == ep ) + return FT_THROW( Invalid_Argument ); + + s = ep + 1; + } + + dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) + return FT_THROW( Invalid_Argument ); + + darken_params = dp; + } + else +#endif + darken_params = (FT_Int*)value; + + x1 = darken_params[0]; + y1 = darken_params[1]; + x2 = darken_params[2]; + y2 = darken_params[3]; + x3 = darken_params[4]; + y3 = darken_params[5]; + x4 = darken_params[6]; + y4 = darken_params[7]; + + if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || + y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || + x1 > x2 || x2 > x3 || x3 > x4 || + y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) + return FT_THROW( Invalid_Argument ); + + module->darken_params[0] = x1; + module->darken_params[1] = y1; + module->darken_params[2] = x2; + module->darken_params[3] = y2; + module->darken_params[4] = x3; + module->darken_params[5] = y3; + module->darken_params[6] = x4; + module->darken_params[7] = y4; + + return error; + } + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long nsd = ft_strtol( s, NULL, 10 ); + + + if ( !nsd ) + module->no_stem_darkening = FALSE; + else + module->no_stem_darkening = TRUE; + } + else +#endif + { + FT_Bool* no_stem_darkening = (FT_Bool*)value; + + + module->no_stem_darkening = *no_stem_darkening; + } + + return error; + } + + FT_TRACE2(( "af_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + static FT_Error + af_property_get( FT_Module ft_module, + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + AF_Module module = (AF_Module)ft_module; + + + if ( !ft_strcmp( property_name, "glyph-to-script-map" ) ) + { + FT_Prop_GlyphToScriptMap* prop = (FT_Prop_GlyphToScriptMap*)value; + AF_FaceGlobals globals; + + + error = af_property_get_face_globals( prop->face, &globals, module ); + if ( !error ) + prop->map = globals->glyph_styles; + + return error; + } + else if ( !ft_strcmp( property_name, "fallback-script" ) ) + { + AF_Script* val = (AF_Script*)value; + + AF_StyleClass style_class = af_style_classes[module->fallback_style]; + + + *val = style_class->script; + + return error; + } + else if ( !ft_strcmp( property_name, "default-script" ) ) + { + AF_Script* val = (AF_Script*)value; + + + *val = module->default_script; + + return error; + } + else if ( !ft_strcmp( property_name, "increase-x-height" ) ) + { + FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value; + AF_FaceGlobals globals; + + + error = af_property_get_face_globals( prop->face, &globals, module ); + if ( !error ) + prop->limit = globals->increase_x_height; + + return error; + } + else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params = module->darken_params; + FT_Int* val = (FT_Int*)value; + + + val[0] = darken_params[0]; + val[1] = darken_params[1]; + val[2] = darken_params[2]; + val[3] = darken_params[3]; + val[4] = darken_params[4]; + val[5] = darken_params[5]; + val[6] = darken_params[6]; + val[7] = darken_params[7]; + + return error; + } + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { + FT_Bool no_stem_darkening = module->no_stem_darkening; + FT_Bool* val = (FT_Bool*)value; + + + *val = no_stem_darkening; + + return error; + } + + FT_TRACE2(( "af_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + af_service_properties, + + af_property_set, /* FT_Properties_SetFunc set_property */ + af_property_get /* FT_Properties_GetFunc get_property */ + ) + + + FT_DEFINE_SERVICEDESCREC1( + af_services, + + FT_SERVICE_ID_PROPERTIES, &af_service_properties ) + + + FT_CALLBACK_DEF( FT_Module_Interface ) + af_get_interface( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( af_services, module_interface ); + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_init( FT_Module ft_module ) /* AF_Module */ + { + AF_Module module = (AF_Module)ft_module; + + + module->fallback_style = AF_STYLE_FALLBACK; + module->default_script = AF_SCRIPT_DEFAULT; + module->no_stem_darkening = TRUE; + + module->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; + module->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; + module->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; + module->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; + module->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; + module->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; + module->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; + module->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + af_autofitter_done( FT_Module ft_module ) /* AF_Module */ + { + FT_UNUSED( ft_module ); + +#ifdef FT_DEBUG_AUTOFIT + if ( af_debug_hints_rec_->memory ) + af_glyph_hints_done( af_debug_hints_rec_ ); +#endif + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_load_glyph( FT_AutoHinter module_, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + AF_Module module = (AF_Module)module_; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = module->root.library->memory; + +#ifdef FT_DEBUG_AUTOFIT + + /* in debug mode, we use a global object that survives this routine */ + + AF_GlyphHints hints = af_debug_hints_rec_; + AF_LoaderRec loader[1]; + + FT_UNUSED( size ); + + + if ( hints->memory ) + af_glyph_hints_done( hints ); + + af_glyph_hints_init( hints, memory ); + af_loader_init( loader, hints ); + + error = af_loader_load_glyph( loader, module, slot->face, + glyph_index, load_flags ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] ) + { +#endif + af_glyph_hints_dump_points( hints, 0 ); + af_glyph_hints_dump_segments( hints, 0 ); + af_glyph_hints_dump_edges( hints, 0 ); +#ifdef FT_DEBUG_LEVEL_TRACE + } +#endif + + af_loader_done( loader ); + + return error; + +#else /* !FT_DEBUG_AUTOFIT */ + + AF_GlyphHintsRec hints[1]; + AF_LoaderRec loader[1]; + + FT_UNUSED( size ); + + + af_glyph_hints_init( hints, memory ); + af_loader_init( loader, hints ); + + error = af_loader_load_glyph( loader, module, slot->face, + glyph_index, load_flags ); + + af_loader_done( loader ); + af_glyph_hints_done( hints ); + + return error; + +#endif /* !FT_DEBUG_AUTOFIT */ + } + + + FT_DEFINE_AUTOHINTER_INTERFACE( + af_autofitter_interface, + + NULL, /* FT_AutoHinter_GlobalResetFunc reset_face */ + NULL, /* FT_AutoHinter_GlobalGetFunc get_global_hints */ + NULL, /* FT_AutoHinter_GlobalDoneFunc done_global_hints */ + af_autofitter_load_glyph /* FT_AutoHinter_GlyphLoadFunc load_glyph */ + ) + + FT_DEFINE_MODULE( + autofit_module_class, + + FT_MODULE_HINTER, + sizeof ( AF_ModuleRec ), + + "autofitter", + 0x10000L, /* version 1.0 of the autofitter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*)&af_autofitter_interface, + + af_autofitter_init, /* FT_Module_Constructor module_init */ + af_autofitter_done, /* FT_Module_Destructor module_done */ + af_get_interface /* FT_Module_Requester get_interface */ + ) + + +/* END */ diff --git a/external/freetype/src/autofit/afmodule.h b/external/freetype/src/autofit/afmodule.h new file mode 100644 index 000000000..4b8b4562c --- /dev/null +++ b/external/freetype/src/autofit/afmodule.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * + * afmodule.h + * + * Auto-fitter module implementation (specification). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFMODULE_H_ +#define AFMODULE_H_ + +#include <freetype/internal/ftobjs.h> +#include <freetype/ftmodapi.h> + + +FT_BEGIN_HEADER + + + /* + * This is the `extended' FT_Module structure that holds the + * autofitter's global data. + */ + + typedef struct AF_ModuleRec_ + { + FT_ModuleRec root; + + FT_UInt fallback_style; + AF_Script default_script; + FT_Bool no_stem_darkening; + FT_Int darken_params[8]; + + } AF_ModuleRec, *AF_Module; + + +FT_DECLARE_AUTOHINTER_INTERFACE( af_autofitter_interface ) +FT_DECLARE_MODULE( autofit_module_class ) + + +FT_END_HEADER + +#endif /* AFMODULE_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afranges.c b/external/freetype/src/autofit/afranges.c new file mode 100644 index 000000000..cfcaf340a --- /dev/null +++ b/external/freetype/src/autofit/afranges.c @@ -0,0 +1,1072 @@ +/**************************************************************************** + * + * afranges.c + * + * Auto-fitter Unicode script ranges (body). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "afranges.h" + + /* + * The algorithm for assigning properties and styles to the `glyph_styles' + * array is as follows (cf. the implementation in + * `af_face_globals_compute_style_coverage'). + * + * Walk over all scripts (as listed in `afscript.h'). + * + * For a given script, walk over all styles (as listed in `afstyles.h'). + * The order of styles is important and should be as follows. + * + * - First come styles based on OpenType features (small caps, for + * example). Since features rely on glyph indices, thus completely + * bypassing character codes, no properties are assigned. + * + * - Next comes the default style, using the character ranges as defined + * below. This also assigns properties. + * + * Note that there also exist fallback scripts, mainly covering + * superscript and subscript glyphs of a script that are not present as + * OpenType features. Fallback scripts are defined below, also + * assigning properties; they are applied after the corresponding + * script. + * + */ + + + /* XXX Check base character ranges again: */ + /* Right now, they are quickly derived by visual inspection. */ + /* I can imagine that fine-tuning is necessary. */ + + /* for the auto-hinter, a `non-base character' is something that should */ + /* not be affected by blue zones, regardless of whether this is a */ + /* spacing or no-spacing glyph */ + + /* the `af_xxxx_nonbase_uniranges' ranges must be strict subsets */ + /* of the corresponding `af_xxxx_uniranges' ranges */ + + + const AF_Script_UniRangeRec af_adlm_uniranges[] = + { + AF_UNIRANGE_REC( 0x1E900, 0x1E95F ), /* Adlam */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_adlm_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1D944, 0x1E94A ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_arab_uniranges[] = + { + AF_UNIRANGE_REC( 0x0600, 0x06FF ), /* Arabic */ + AF_UNIRANGE_REC( 0x0750, 0x07FF ), /* Arabic Supplement */ + AF_UNIRANGE_REC( 0x08A0, 0x08FF ), /* Arabic Extended-A */ + AF_UNIRANGE_REC( 0xFB50, 0xFDFF ), /* Arabic Presentation Forms-A */ + AF_UNIRANGE_REC( 0xFE70, 0xFEFF ), /* Arabic Presentation Forms-B */ + AF_UNIRANGE_REC( 0x1EE00, 0x1EEFF ), /* Arabic Mathematical Alphabetic Symbols */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_arab_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0600, 0x0605 ), + AF_UNIRANGE_REC( 0x0610, 0x061A ), + AF_UNIRANGE_REC( 0x064B, 0x065F ), + AF_UNIRANGE_REC( 0x0670, 0x0670 ), + AF_UNIRANGE_REC( 0x06D6, 0x06DC ), + AF_UNIRANGE_REC( 0x06DF, 0x06E4 ), + AF_UNIRANGE_REC( 0x06E7, 0x06E8 ), + AF_UNIRANGE_REC( 0x06EA, 0x06ED ), + AF_UNIRANGE_REC( 0x08D4, 0x08E1 ), + AF_UNIRANGE_REC( 0x08D3, 0x08FF ), + AF_UNIRANGE_REC( 0xFBB2, 0xFBC1 ), + AF_UNIRANGE_REC( 0xFE70, 0xFE70 ), + AF_UNIRANGE_REC( 0xFE72, 0xFE72 ), + AF_UNIRANGE_REC( 0xFE74, 0xFE74 ), + AF_UNIRANGE_REC( 0xFE76, 0xFE76 ), + AF_UNIRANGE_REC( 0xFE78, 0xFE78 ), + AF_UNIRANGE_REC( 0xFE7A, 0xFE7A ), + AF_UNIRANGE_REC( 0xFE7C, 0xFE7C ), + AF_UNIRANGE_REC( 0xFE7E, 0xFE7E ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_armn_uniranges[] = + { + AF_UNIRANGE_REC( 0x0530, 0x058F ), /* Armenian */ + AF_UNIRANGE_REC( 0xFB13, 0xFB17 ), /* Alphab. Present. Forms (Armenian) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_armn_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0559, 0x055F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_avst_uniranges[] = + { + AF_UNIRANGE_REC( 0x10B00, 0x10B3F ), /* Avestan */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_avst_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x10B39, 0x10B3F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_bamu_uniranges[] = + { + AF_UNIRANGE_REC( 0xA6A0, 0xA6FF ), /* Bamum */ +#if 0 + /* The characters in the Bamum supplement are pictograms, */ + /* not (directly) related to the syllabic Bamum script */ + AF_UNIRANGE_REC( 0x16800, 0x16A3F ), /* Bamum Supplement */ +#endif + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_bamu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA6F0, 0xA6F1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_beng_uniranges[] = + { + AF_UNIRANGE_REC( 0x0980, 0x09FF ), /* Bengali */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_beng_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0981, 0x0981 ), + AF_UNIRANGE_REC( 0x09BC, 0x09BC ), + AF_UNIRANGE_REC( 0x09C1, 0x09C4 ), + AF_UNIRANGE_REC( 0x09CD, 0x09CD ), + AF_UNIRANGE_REC( 0x09E2, 0x09E3 ), + AF_UNIRANGE_REC( 0x09FE, 0x09FE ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_buhd_uniranges[] = + { + AF_UNIRANGE_REC( 0x1740, 0x175F ), /* Buhid */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_buhd_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1752, 0x1753 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cakm_uniranges[] = + { + AF_UNIRANGE_REC( 0x11100, 0x1114F ), /* Chakma */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cakm_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x11100, 0x11102 ), + AF_UNIRANGE_REC( 0x11127, 0x11134 ), + AF_UNIRANGE_REC( 0x11146, 0x11146 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cans_uniranges[] = + { + AF_UNIRANGE_REC( 0x1400, 0x167F ), /* Unified Canadian Aboriginal Syllabics */ + AF_UNIRANGE_REC( 0x18B0, 0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cans_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cari_uniranges[] = + { + AF_UNIRANGE_REC( 0x102A0, 0x102DF ), /* Carian */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cari_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cher_uniranges[] = + { + AF_UNIRANGE_REC( 0x13A0, 0x13FF ), /* Cherokee */ + AF_UNIRANGE_REC( 0xAB70, 0xABBF ), /* Cherokee Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cher_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_copt_uniranges[] = + { + AF_UNIRANGE_REC( 0x2C80, 0x2CFF ), /* Coptic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_copt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x2CEF, 0x2CF1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cprt_uniranges[] = + { + AF_UNIRANGE_REC( 0x10800, 0x1083F ), /* Cypriot */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cprt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cyrl_uniranges[] = + { + AF_UNIRANGE_REC( 0x0400, 0x04FF ), /* Cyrillic */ + AF_UNIRANGE_REC( 0x0500, 0x052F ), /* Cyrillic Supplement */ + AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), /* Cyrillic Extended-A */ + AF_UNIRANGE_REC( 0xA640, 0xA69F ), /* Cyrillic Extended-B */ + AF_UNIRANGE_REC( 0x1C80, 0x1C8F ), /* Cyrillic Extended-C */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cyrl_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0483, 0x0489 ), + AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), + AF_UNIRANGE_REC( 0xA66F, 0xA67F ), + AF_UNIRANGE_REC( 0xA69E, 0xA69F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + /* There are some characters in the Devanagari Unicode block that are */ + /* generic to Indic scripts; we omit them so that their presence doesn't */ + /* trigger Devanagari. */ + + const AF_Script_UniRangeRec af_deva_uniranges[] = + { + AF_UNIRANGE_REC( 0x0900, 0x093B ), /* Devanagari */ + /* omitting U+093C nukta */ + AF_UNIRANGE_REC( 0x093D, 0x0950 ), /* ... continued */ + /* omitting U+0951 udatta, U+0952 anudatta */ + AF_UNIRANGE_REC( 0x0953, 0x0963 ), /* ... continued */ + /* omitting U+0964 danda, U+0965 double danda */ + AF_UNIRANGE_REC( 0x0966, 0x097F ), /* ... continued */ + AF_UNIRANGE_REC( 0x20B9, 0x20B9 ), /* (new) Rupee sign */ + AF_UNIRANGE_REC( 0xA8E0, 0xA8FF ), /* Devanagari Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_deva_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0900, 0x0902 ), + AF_UNIRANGE_REC( 0x093A, 0x093A ), + AF_UNIRANGE_REC( 0x0941, 0x0948 ), + AF_UNIRANGE_REC( 0x094D, 0x094D ), + AF_UNIRANGE_REC( 0x0953, 0x0957 ), + AF_UNIRANGE_REC( 0x0962, 0x0963 ), + AF_UNIRANGE_REC( 0xA8E0, 0xA8F1 ), + AF_UNIRANGE_REC( 0xA8FF, 0xA8FF ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_dsrt_uniranges[] = + { + AF_UNIRANGE_REC( 0x10400, 0x1044F ), /* Deseret */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_dsrt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_ethi_uniranges[] = + { + AF_UNIRANGE_REC( 0x1200, 0x137F ), /* Ethiopic */ + AF_UNIRANGE_REC( 0x1380, 0x139F ), /* Ethiopic Supplement */ + AF_UNIRANGE_REC( 0x2D80, 0x2DDF ), /* Ethiopic Extended */ + AF_UNIRANGE_REC( 0xAB00, 0xAB2F ), /* Ethiopic Extended-A */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_ethi_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x135D, 0x135F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_geor_uniranges[] = + { + AF_UNIRANGE_REC( 0x10D0, 0x10FF ), /* Georgian (Mkhedruli) */ + AF_UNIRANGE_REC( 0x1C90, 0x1CBF ), /* Georgian Extended (Mtavruli) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_geor_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_geok_uniranges[] = + { + /* Khutsuri */ + AF_UNIRANGE_REC( 0x10A0, 0x10CD ), /* Georgian (Asomtavruli) */ + AF_UNIRANGE_REC( 0x2D00, 0x2D2D ), /* Georgian Supplement (Nuskhuri) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_geok_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_glag_uniranges[] = + { + AF_UNIRANGE_REC( 0x2C00, 0x2C5F ), /* Glagolitic */ + AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), /* Glagolitic Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_glag_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_goth_uniranges[] = + { + AF_UNIRANGE_REC( 0x10330, 0x1034F ), /* Gothic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_goth_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_grek_uniranges[] = + { + AF_UNIRANGE_REC( 0x0370, 0x03FF ), /* Greek and Coptic */ + AF_UNIRANGE_REC( 0x1F00, 0x1FFF ), /* Greek Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_grek_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x037A, 0x037A ), + AF_UNIRANGE_REC( 0x0384, 0x0385 ), + AF_UNIRANGE_REC( 0x1FBD, 0x1FC1 ), + AF_UNIRANGE_REC( 0x1FCD, 0x1FCF ), + AF_UNIRANGE_REC( 0x1FDD, 0x1FDF ), + AF_UNIRANGE_REC( 0x1FED, 0x1FEF ), + AF_UNIRANGE_REC( 0x1FFD, 0x1FFE ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_gujr_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A80, 0x0AFF ), /* Gujarati */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_gujr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A81, 0x0A82 ), + AF_UNIRANGE_REC( 0x0ABC, 0x0ABC ), + AF_UNIRANGE_REC( 0x0AC1, 0x0AC8 ), + AF_UNIRANGE_REC( 0x0ACD, 0x0ACD ), + AF_UNIRANGE_REC( 0x0AE2, 0x0AE3 ), + AF_UNIRANGE_REC( 0x0AFA, 0x0AFF ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_guru_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A00, 0x0A7F ), /* Gurmukhi */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_guru_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A01, 0x0A02 ), + AF_UNIRANGE_REC( 0x0A3C, 0x0A3C ), + AF_UNIRANGE_REC( 0x0A41, 0x0A51 ), + AF_UNIRANGE_REC( 0x0A70, 0x0A71 ), + AF_UNIRANGE_REC( 0x0A75, 0x0A75 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_hebr_uniranges[] = + { + AF_UNIRANGE_REC( 0x0590, 0x05FF ), /* Hebrew */ + AF_UNIRANGE_REC( 0xFB1D, 0xFB4F ), /* Alphab. Present. Forms (Hebrew) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_hebr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0591, 0x05BF ), + AF_UNIRANGE_REC( 0x05C1, 0x05C2 ), + AF_UNIRANGE_REC( 0x05C4, 0x05C5 ), + AF_UNIRANGE_REC( 0x05C7, 0x05C7 ), + AF_UNIRANGE_REC( 0xFB1E, 0xFB1E ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_kali_uniranges[] = + { + AF_UNIRANGE_REC( 0xA900, 0xA92F ), /* Kayah Li */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_kali_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA926, 0xA92D ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_knda_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C80, 0x0CFF ), /* Kannada */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_knda_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C81, 0x0C81 ), + AF_UNIRANGE_REC( 0x0CBC, 0x0CBC ), + AF_UNIRANGE_REC( 0x0CBF, 0x0CBF ), + AF_UNIRANGE_REC( 0x0CC6, 0x0CC6 ), + AF_UNIRANGE_REC( 0x0CCC, 0x0CCD ), + AF_UNIRANGE_REC( 0x0CE2, 0x0CE3 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_khmr_uniranges[] = + { + AF_UNIRANGE_REC( 0x1780, 0x17FF ), /* Khmer */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_khmr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x17B7, 0x17BD ), + AF_UNIRANGE_REC( 0x17C6, 0x17C6 ), + AF_UNIRANGE_REC( 0x17C9, 0x17D3 ), + AF_UNIRANGE_REC( 0x17DD, 0x17DD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_khms_uniranges[] = + { + AF_UNIRANGE_REC( 0x19E0, 0x19FF ), /* Khmer Symbols */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_khms_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_lao_uniranges[] = + { + AF_UNIRANGE_REC( 0x0E80, 0x0EFF ), /* Lao */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_lao_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0EB1, 0x0EB1 ), + AF_UNIRANGE_REC( 0x0EB4, 0x0EBC ), + AF_UNIRANGE_REC( 0x0EC8, 0x0ECD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_latn_uniranges[] = + { + AF_UNIRANGE_REC( 0x0020, 0x007F ), /* Basic Latin (no control chars) */ + AF_UNIRANGE_REC( 0x00A0, 0x00A9 ), /* Latin-1 Supplement (no control chars) */ + AF_UNIRANGE_REC( 0x00AB, 0x00B1 ), /* ... continued */ + AF_UNIRANGE_REC( 0x00B4, 0x00B8 ), /* ... continued */ + AF_UNIRANGE_REC( 0x00BB, 0x00FF ), /* ... continued */ + AF_UNIRANGE_REC( 0x0100, 0x017F ), /* Latin Extended-A */ + AF_UNIRANGE_REC( 0x0180, 0x024F ), /* Latin Extended-B */ + AF_UNIRANGE_REC( 0x0250, 0x02AF ), /* IPA Extensions */ + AF_UNIRANGE_REC( 0x02B9, 0x02DF ), /* Spacing Modifier Letters */ + AF_UNIRANGE_REC( 0x02E5, 0x02FF ), /* ... continued */ + AF_UNIRANGE_REC( 0x0300, 0x036F ), /* Combining Diacritical Marks */ + AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ), /* Combining Diacritical Marks Extended */ + AF_UNIRANGE_REC( 0x1D00, 0x1D2B ), /* Phonetic Extensions */ + AF_UNIRANGE_REC( 0x1D6B, 0x1D77 ), /* ... continued */ + AF_UNIRANGE_REC( 0x1D79, 0x1D7F ), /* ... continued */ + AF_UNIRANGE_REC( 0x1D80, 0x1D9A ), /* Phonetic Extensions Supplement */ + AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ), /* Combining Diacritical Marks Supplement */ + AF_UNIRANGE_REC( 0x1E00, 0x1EFF ), /* Latin Extended Additional */ + AF_UNIRANGE_REC( 0x2000, 0x206F ), /* General Punctuation */ + AF_UNIRANGE_REC( 0x20A0, 0x20B8 ), /* Currency Symbols ... */ + AF_UNIRANGE_REC( 0x20BA, 0x20CF ), /* ... except new Rupee sign */ + AF_UNIRANGE_REC( 0x2150, 0x218F ), /* Number Forms */ + AF_UNIRANGE_REC( 0x2C60, 0x2C7B ), /* Latin Extended-C */ + AF_UNIRANGE_REC( 0x2C7E, 0x2C7F ), /* ... continued */ + AF_UNIRANGE_REC( 0x2E00, 0x2E7F ), /* Supplemental Punctuation */ + AF_UNIRANGE_REC( 0xA720, 0xA76F ), /* Latin Extended-D */ + AF_UNIRANGE_REC( 0xA771, 0xA7F7 ), /* ... continued */ + AF_UNIRANGE_REC( 0xA7FA, 0xA7FF ), /* ... continued */ + AF_UNIRANGE_REC( 0xAB30, 0xAB5B ), /* Latin Extended-E */ + AF_UNIRANGE_REC( 0xAB60, 0xAB6F ), /* ... continued */ + AF_UNIRANGE_REC( 0xFB00, 0xFB06 ), /* Alphab. Present. Forms (Latin Ligs) */ + AF_UNIRANGE_REC( 0x1D400, 0x1D7FF ), /* Mathematical Alphanumeric Symbols */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_latn_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x005E, 0x0060 ), + AF_UNIRANGE_REC( 0x007E, 0x007E ), + AF_UNIRANGE_REC( 0x00A8, 0x00A9 ), + AF_UNIRANGE_REC( 0x00AE, 0x00B0 ), + AF_UNIRANGE_REC( 0x00B4, 0x00B4 ), + AF_UNIRANGE_REC( 0x00B8, 0x00B8 ), + AF_UNIRANGE_REC( 0x00BC, 0x00BE ), + AF_UNIRANGE_REC( 0x02B9, 0x02DF ), + AF_UNIRANGE_REC( 0x02E5, 0x02FF ), + AF_UNIRANGE_REC( 0x0300, 0x036F ), + AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ), + AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ), + AF_UNIRANGE_REC( 0x2017, 0x2017 ), + AF_UNIRANGE_REC( 0x203E, 0x203E ), + AF_UNIRANGE_REC( 0xA788, 0xA788 ), + AF_UNIRANGE_REC( 0xA7F8, 0xA7FA ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_latb_uniranges[] = + { + AF_UNIRANGE_REC( 0x1D62, 0x1D6A ), /* some small subscript letters */ + AF_UNIRANGE_REC( 0x2080, 0x209C ), /* subscript digits and letters */ + AF_UNIRANGE_REC( 0x2C7C, 0x2C7C ), /* latin subscript small letter j */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_latb_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_latp_uniranges[] = + { + AF_UNIRANGE_REC( 0x00AA, 0x00AA ), /* feminine ordinal indicator */ + AF_UNIRANGE_REC( 0x00B2, 0x00B3 ), /* superscript two and three */ + AF_UNIRANGE_REC( 0x00B9, 0x00BA ), /* superscript one, masc. ord. indic. */ + AF_UNIRANGE_REC( 0x02B0, 0x02B8 ), /* some latin superscript mod. letters */ + AF_UNIRANGE_REC( 0x02E0, 0x02E4 ), /* some IPA modifier letters */ + AF_UNIRANGE_REC( 0x1D2C, 0x1D61 ), /* latin superscript modifier letters */ + AF_UNIRANGE_REC( 0x1D78, 0x1D78 ), /* modifier letter cyrillic en */ + AF_UNIRANGE_REC( 0x1D9B, 0x1DBF ), /* more modifier letters */ + AF_UNIRANGE_REC( 0x2070, 0x207F ), /* superscript digits and letters */ + AF_UNIRANGE_REC( 0x2C7D, 0x2C7D ), /* modifier letter capital v */ + AF_UNIRANGE_REC( 0xA770, 0xA770 ), /* modifier letter us */ + AF_UNIRANGE_REC( 0xA7F8, 0xA7F9 ), /* more modifier letters */ + AF_UNIRANGE_REC( 0xAB5C, 0xAB5F ), /* more modifier letters */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_latp_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_lisu_uniranges[] = + { + AF_UNIRANGE_REC( 0xA4D0, 0xA4FF ), /* Lisu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_lisu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_mlym_uniranges[] = + { + AF_UNIRANGE_REC( 0x0D00, 0x0D7F ), /* Malayalam */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mlym_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0D00, 0x0D01 ), + AF_UNIRANGE_REC( 0x0D3B, 0x0D3C ), + AF_UNIRANGE_REC( 0x0D4D, 0x0D4E ), + AF_UNIRANGE_REC( 0x0D62, 0x0D63 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_medf_uniranges[] = + { + AF_UNIRANGE_REC( 0x16E40, 0x16E9F ), /* Medefaidrin */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_medf_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_mong_uniranges[] = + { + AF_UNIRANGE_REC( 0x1800, 0x18AF ), /* Mongolian */ + AF_UNIRANGE_REC( 0x11660, 0x1167F ), /* Mongolian Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mong_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1885, 0x1886 ), + AF_UNIRANGE_REC( 0x18A9, 0x18A9 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_mymr_uniranges[] = + { + AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */ + AF_UNIRANGE_REC( 0xA9E0, 0xA9FF ), /* Myanmar Extended-B */ + AF_UNIRANGE_REC( 0xAA60, 0xAA7F ), /* Myanmar Extended-A */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mymr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x102D, 0x1030 ), + AF_UNIRANGE_REC( 0x1032, 0x1037 ), + AF_UNIRANGE_REC( 0x103A, 0x103A ), + AF_UNIRANGE_REC( 0x103D, 0x103E ), + AF_UNIRANGE_REC( 0x1058, 0x1059 ), + AF_UNIRANGE_REC( 0x105E, 0x1060 ), + AF_UNIRANGE_REC( 0x1071, 0x1074 ), + AF_UNIRANGE_REC( 0x1082, 0x1082 ), + AF_UNIRANGE_REC( 0x1085, 0x1086 ), + AF_UNIRANGE_REC( 0x108D, 0x108D ), + AF_UNIRANGE_REC( 0xA9E5, 0xA9E5 ), + AF_UNIRANGE_REC( 0xAA7C, 0xAA7C ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_nkoo_uniranges[] = + { + AF_UNIRANGE_REC( 0x07C0, 0x07FF ), /* N'Ko */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_nkoo_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x07EB, 0x07F5 ), + AF_UNIRANGE_REC( 0x07FD, 0x07FD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_none_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_none_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_olck_uniranges[] = + { + AF_UNIRANGE_REC( 0x1C50, 0x1C7F ), /* Ol Chiki */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_olck_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_orkh_uniranges[] = + { + AF_UNIRANGE_REC( 0x10C00, 0x10C4F ), /* Old Turkic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_orkh_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_osge_uniranges[] = + { + AF_UNIRANGE_REC( 0x104B0, 0x104FF ), /* Osage */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_osge_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_osma_uniranges[] = + { + AF_UNIRANGE_REC( 0x10480, 0x104AF ), /* Osmanya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_osma_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_rohg_uniranges[] = + { + AF_UNIRANGE_REC( 0x10D00, 0x10D3F ), /* Hanifi Rohingya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_rohg_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_saur_uniranges[] = + { + AF_UNIRANGE_REC( 0xA880, 0xA8DF ), /* Saurashtra */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_saur_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA880, 0xA881 ), + AF_UNIRANGE_REC( 0xA8B4, 0xA8C5 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_shaw_uniranges[] = + { + AF_UNIRANGE_REC( 0x10450, 0x1047F ), /* Shavian */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_shaw_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_sinh_uniranges[] = + { + AF_UNIRANGE_REC( 0x0D80, 0x0DFF ), /* Sinhala */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sinh_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0DCA, 0x0DCA ), + AF_UNIRANGE_REC( 0x0DD2, 0x0DD6 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_sund_uniranges[] = + { + AF_UNIRANGE_REC( 0x1B80, 0x1BBF ), /* Sundanese */ + AF_UNIRANGE_REC( 0x1CC0, 0x1CCF ), /* Sundanese Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sund_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1B80, 0x1B82 ), + AF_UNIRANGE_REC( 0x1BA1, 0x1BAD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_taml_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B80, 0x0BFF ), /* Tamil */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_taml_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B82, 0x0B82 ), + AF_UNIRANGE_REC( 0x0BC0, 0x0BC2 ), + AF_UNIRANGE_REC( 0x0BCD, 0x0BCD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_tavt_uniranges[] = + { + AF_UNIRANGE_REC( 0xAA80, 0xAADF ), /* Tai Viet */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tavt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xAAB0, 0xAAB0 ), + AF_UNIRANGE_REC( 0xAAB2, 0xAAB4 ), + AF_UNIRANGE_REC( 0xAAB7, 0xAAB8 ), + AF_UNIRANGE_REC( 0xAABE, 0xAABF ), + AF_UNIRANGE_REC( 0xAAC1, 0xAAC1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_telu_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C00, 0x0C7F ), /* Telugu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_telu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C00, 0x0C00 ), + AF_UNIRANGE_REC( 0x0C04, 0x0C04 ), + AF_UNIRANGE_REC( 0x0C3E, 0x0C40 ), + AF_UNIRANGE_REC( 0x0C46, 0x0C56 ), + AF_UNIRANGE_REC( 0x0C62, 0x0C63 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_thai_uniranges[] = + { + AF_UNIRANGE_REC( 0x0E00, 0x0E7F ), /* Thai */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_thai_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0E31, 0x0E31 ), + AF_UNIRANGE_REC( 0x0E34, 0x0E3A ), + AF_UNIRANGE_REC( 0x0E47, 0x0E4E ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_tfng_uniranges[] = + { + AF_UNIRANGE_REC( 0x2D30, 0x2D7F ), /* Tifinagh */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tfng_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_vaii_uniranges[] = + { + AF_UNIRANGE_REC( 0xA500, 0xA63F ), /* Vai */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_vaii_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + +#ifdef AF_CONFIG_OPTION_INDIC + + const AF_Script_UniRangeRec af_limb_uniranges[] = + { + AF_UNIRANGE_REC( 0x1900, 0x194F ), /* Limbu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_limb_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1920, 0x1922 ), + AF_UNIRANGE_REC( 0x1927, 0x1934 ), + AF_UNIRANGE_REC( 0x1937, 0x193B ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_orya_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B00, 0x0B7F ), /* Oriya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_orya_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B01, 0x0B02 ), + AF_UNIRANGE_REC( 0x0B3C, 0x0B3C ), + AF_UNIRANGE_REC( 0x0B3F, 0x0B3F ), + AF_UNIRANGE_REC( 0x0B41, 0x0B44 ), + AF_UNIRANGE_REC( 0x0B4D, 0x0B56 ), + AF_UNIRANGE_REC( 0x0B62, 0x0B63 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_sylo_uniranges[] = + { + AF_UNIRANGE_REC( 0xA800, 0xA82F ), /* Syloti Nagri */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sylo_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA802, 0xA802 ), + AF_UNIRANGE_REC( 0xA806, 0xA806 ), + AF_UNIRANGE_REC( 0xA80B, 0xA80B ), + AF_UNIRANGE_REC( 0xA825, 0xA826 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_tibt_uniranges[] = + { + AF_UNIRANGE_REC( 0x0F00, 0x0FFF ), /* Tibetan */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tibt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0F18, 0x0F19 ), + AF_UNIRANGE_REC( 0x0F35, 0x0F35 ), + AF_UNIRANGE_REC( 0x0F37, 0x0F37 ), + AF_UNIRANGE_REC( 0x0F39, 0x0F39 ), + AF_UNIRANGE_REC( 0x0F3E, 0x0F3F ), + AF_UNIRANGE_REC( 0x0F71, 0x0F7E ), + AF_UNIRANGE_REC( 0x0F80, 0x0F84 ), + AF_UNIRANGE_REC( 0x0F86, 0x0F87 ), + AF_UNIRANGE_REC( 0x0F8D, 0x0FBC ), + AF_UNIRANGE_REC( 0, 0 ) + }; + +#endif /* !AF_CONFIG_OPTION_INDIC */ + +#ifdef AF_CONFIG_OPTION_CJK + + /* this corresponds to Unicode 6.0 */ + + const AF_Script_UniRangeRec af_hani_uniranges[] = + { + AF_UNIRANGE_REC( 0x1100, 0x11FF ), /* Hangul Jamo */ + AF_UNIRANGE_REC( 0x2E80, 0x2EFF ), /* CJK Radicals Supplement */ + AF_UNIRANGE_REC( 0x2F00, 0x2FDF ), /* Kangxi Radicals */ + AF_UNIRANGE_REC( 0x2FF0, 0x2FFF ), /* Ideographic Description Characters */ + AF_UNIRANGE_REC( 0x3000, 0x303F ), /* CJK Symbols and Punctuation */ + AF_UNIRANGE_REC( 0x3040, 0x309F ), /* Hiragana */ + AF_UNIRANGE_REC( 0x30A0, 0x30FF ), /* Katakana */ + AF_UNIRANGE_REC( 0x3100, 0x312F ), /* Bopomofo */ + AF_UNIRANGE_REC( 0x3130, 0x318F ), /* Hangul Compatibility Jamo */ + AF_UNIRANGE_REC( 0x3190, 0x319F ), /* Kanbun */ + AF_UNIRANGE_REC( 0x31A0, 0x31BF ), /* Bopomofo Extended */ + AF_UNIRANGE_REC( 0x31C0, 0x31EF ), /* CJK Strokes */ + AF_UNIRANGE_REC( 0x31F0, 0x31FF ), /* Katakana Phonetic Extensions */ + AF_UNIRANGE_REC( 0x3300, 0x33FF ), /* CJK Compatibility */ + AF_UNIRANGE_REC( 0x3400, 0x4DBF ), /* CJK Unified Ideographs Extension A */ + AF_UNIRANGE_REC( 0x4DC0, 0x4DFF ), /* Yijing Hexagram Symbols */ + AF_UNIRANGE_REC( 0x4E00, 0x9FFF ), /* CJK Unified Ideographs */ + AF_UNIRANGE_REC( 0xA960, 0xA97F ), /* Hangul Jamo Extended-A */ + AF_UNIRANGE_REC( 0xAC00, 0xD7AF ), /* Hangul Syllables */ + AF_UNIRANGE_REC( 0xD7B0, 0xD7FF ), /* Hangul Jamo Extended-B */ + AF_UNIRANGE_REC( 0xF900, 0xFAFF ), /* CJK Compatibility Ideographs */ + AF_UNIRANGE_REC( 0xFE10, 0xFE1F ), /* Vertical forms */ + AF_UNIRANGE_REC( 0xFE30, 0xFE4F ), /* CJK Compatibility Forms */ + AF_UNIRANGE_REC( 0xFF00, 0xFFEF ), /* Halfwidth and Fullwidth Forms */ + AF_UNIRANGE_REC( 0x1B000, 0x1B0FF ), /* Kana Supplement */ + AF_UNIRANGE_REC( 0x1B100, 0x1B12F ), /* Kana Extended-A */ + AF_UNIRANGE_REC( 0x1D300, 0x1D35F ), /* Tai Xuan Hing Symbols */ + AF_UNIRANGE_REC( 0x20000, 0x2A6DF ), /* CJK Unified Ideographs Extension B */ + AF_UNIRANGE_REC( 0x2A700, 0x2B73F ), /* CJK Unified Ideographs Extension C */ + AF_UNIRANGE_REC( 0x2B740, 0x2B81F ), /* CJK Unified Ideographs Extension D */ + AF_UNIRANGE_REC( 0x2B820, 0x2CEAF ), /* CJK Unified Ideographs Extension E */ + AF_UNIRANGE_REC( 0x2CEB0, 0x2EBEF ), /* CJK Unified Ideographs Extension F */ + AF_UNIRANGE_REC( 0x2F800, 0x2FA1F ), /* CJK Compatibility Ideographs Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_hani_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x302A, 0x302F ), + AF_UNIRANGE_REC( 0x3190, 0x319F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + +#endif /* !AF_CONFIG_OPTION_CJK */ + +/* END */ diff --git a/external/freetype/src/autofit/afranges.h b/external/freetype/src/autofit/afranges.h new file mode 100644 index 000000000..5775738bc --- /dev/null +++ b/external/freetype/src/autofit/afranges.h @@ -0,0 +1,47 @@ +/**************************************************************************** + * + * afranges.h + * + * Auto-fitter Unicode script ranges (specification). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFRANGES_H_ +#define AFRANGES_H_ + + +#include "aftypes.h" + + +FT_BEGIN_HEADER + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + extern const AF_Script_UniRangeRec af_ ## s ## _uniranges[]; + +#include "afscript.h" + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + extern const AF_Script_UniRangeRec af_ ## s ## _nonbase_uniranges[]; + +#include "afscript.h" + + /* */ + +FT_END_HEADER + +#endif /* AFRANGES_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afscript.h b/external/freetype/src/autofit/afscript.h new file mode 100644 index 000000000..3a101937d --- /dev/null +++ b/external/freetype/src/autofit/afscript.h @@ -0,0 +1,408 @@ +/**************************************************************************** + * + * afscript.h + * + * Auto-fitter scripts (specification only). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* The following part can be included multiple times. */ + /* Define `SCRIPT' as needed. */ + + + /* Add new scripts here. The first and second arguments are the */ + /* script name in lowercase and uppercase, respectively, followed */ + /* by a description string. Then comes the corresponding HarfBuzz */ + /* script name tag, followed by a string of standard characters (to */ + /* derive the standard width and height of stems). */ + /* */ + /* Note that fallback scripts only have a default style, thus we */ + /* use `HB_SCRIPT_INVALID' as the HarfBuzz script name tag for */ + /* them. */ + + SCRIPT( adlm, ADLM, + "Adlam", + HB_SCRIPT_ADLAM, + HINTING_BOTTOM_TO_TOP, + "\xF0\x9E\xA4\x8C \xF0\x9E\xA4\xAE" ) /* 𞤌 𞤮 */ + + SCRIPT( arab, ARAB, + "Arabic", + HB_SCRIPT_ARABIC, + HINTING_BOTTOM_TO_TOP, + "\xD9\x84 \xD8\xAD \xD9\x80" ) /* Ù„ Ø­ Ù€ */ + + SCRIPT( armn, ARMN, + "Armenian", + HB_SCRIPT_ARMENIAN, + HINTING_BOTTOM_TO_TOP, + "\xD5\xBD \xD5\x8D" ) /* Õ½ Õ */ + + SCRIPT( avst, AVST, + "Avestan", + HB_SCRIPT_AVESTAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xAC\x9A" ) /* 𬚠*/ + + SCRIPT( bamu, BAMU, + "Bamum", + HB_SCRIPT_BAMUM, + HINTING_BOTTOM_TO_TOP, + "\xEA\x9B\x81 \xEA\x9B\xAF" ) /* ê› ê›¯ */ + + /* there are no simple forms for letters; we thus use two digit shapes */ + SCRIPT( beng, BENG, + "Bengali", + HB_SCRIPT_BENGALI, + HINTING_TOP_TO_BOTTOM, + "\xE0\xA7\xA6 \xE0\xA7\xAA" ) /* ০ ৪ */ + + SCRIPT( buhd, BUHD, + "Buhid", + HB_SCRIPT_BUHID, + HINTING_BOTTOM_TO_TOP, + "\xE1\x9D\x8B \xE1\x9D\x8F" ) /* á‹ á */ + + SCRIPT( cakm, CAKM, + "Chakma", + HB_SCRIPT_CHAKMA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x91\x84\xA4 \xF0\x91\x84\x89 \xF0\x91\x84\x9B" ) /* 𑄤 𑄉 ð‘„› */ + + SCRIPT( cans, CANS, + "Canadian Syllabics", + HB_SCRIPT_CANADIAN_SYLLABICS, + HINTING_BOTTOM_TO_TOP, + "\xE1\x91\x8C \xE1\x93\x9A" ) /* á‘Œ á“š */ + + SCRIPT( cari, CARI, + "Carian", + HB_SCRIPT_CARIAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x8A\xAB \xF0\x90\x8B\x89" ) /* ðŠ« ð‹‰ */ + + SCRIPT( cher, CHER, + "Cherokee", + HB_SCRIPT_CHEROKEE, + HINTING_BOTTOM_TO_TOP, + "\xE1\x8E\xA4 \xE1\x8F\x85 \xEA\xAE\x95" ) /* Ꭴ á… ê®• */ + + SCRIPT( copt, COPT, + "Coptic", + HB_SCRIPT_COPTIC, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB2\x9E \xE2\xB2\x9F" ) /* Ⲟ ⲟ */ + + SCRIPT( cprt, CPRT, + "Cypriot", + HB_SCRIPT_CYPRIOT, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xA0\x85 \xF0\x90\xA0\xA3" ) /* ð … ð £ */ + + SCRIPT( cyrl, CYRL, + "Cyrillic", + HB_SCRIPT_CYRILLIC, + HINTING_BOTTOM_TO_TOP, + "\xD0\xBE \xD0\x9E" ) /* о О */ + + SCRIPT( deva, DEVA, + "Devanagari", + HB_SCRIPT_DEVANAGARI, + HINTING_TOP_TO_BOTTOM, + "\xE0\xA4\xA0 \xE0\xA4\xB5 \xE0\xA4\x9F" ) /* ठ व ट */ + + SCRIPT( dsrt, DSRT, + "Deseret", + HB_SCRIPT_DESERET, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x90\x84 \xF0\x90\x90\xAC" ) /* ð„ ð¬ */ + + SCRIPT( ethi, ETHI, + "Ethiopic", + HB_SCRIPT_ETHIOPIC, + HINTING_BOTTOM_TO_TOP, + "\xE1\x8B\x90" ) /* á‹ */ + + SCRIPT( geor, GEOR, + "Georgian (Mkhedruli)", + HB_SCRIPT_GEORGIAN, + HINTING_BOTTOM_TO_TOP, + "\xE1\x83\x98 \xE1\x83\x94 \xE1\x83\x90 \xE1\xB2\xBF" ) /* ი ე რᲘ */ + + SCRIPT( geok, GEOK, + "Georgian (Khutsuri)", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE1\x82\xB6 \xE1\x82\xB1 \xE2\xB4\x99" ) /* Ⴖ Ⴑ â´™ */ + + SCRIPT( glag, GLAG, + "Glagolitic", + HB_SCRIPT_GLAGOLITIC, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB0\x95 \xE2\xB1\x85" ) /* â°• â±… */ + + SCRIPT( goth, GOTH, + "Gothic", + HB_SCRIPT_GOTHIC, + HINTING_TOP_TO_BOTTOM, + "\xF0\x90\x8C\xB4 \xF0\x90\x8C\xBE \xF0\x90\x8D\x83" ) /* ðŒ´ ðŒ¾ ðƒ */ + + SCRIPT( grek, GREK, + "Greek", + HB_SCRIPT_GREEK, + HINTING_BOTTOM_TO_TOP, + "\xCE\xBF \xCE\x9F" ) /* ο Ο */ + + SCRIPT( gujr, GUJR, + "Gujarati", + HB_SCRIPT_GUJARATI, + HINTING_BOTTOM_TO_TOP, + "\xE0\xAA\x9F \xE0\xAB\xA6" ) /* ટ ૦ */ + + SCRIPT( guru, GURU, + "Gurmukhi", + HB_SCRIPT_GURMUKHI, + HINTING_TOP_TO_BOTTOM, + "\xE0\xA8\xA0 \xE0\xA8\xB0 \xE0\xA9\xA6" ) /* ਠ ਰ ੦ */ + + SCRIPT( hebr, HEBR, + "Hebrew", + HB_SCRIPT_HEBREW, + HINTING_BOTTOM_TO_TOP, + "\xD7\x9D" ) /* × */ + + SCRIPT( kali, KALI, + "Kayah Li", + HB_SCRIPT_KAYAH_LI, + HINTING_BOTTOM_TO_TOP, + "\xEA\xA4\x8D \xEA\xA4\x80" ) /* ê¤ ê¤€ */ + + /* only digit zero has a simple shape in the Khmer script */ + SCRIPT( khmr, KHMR, + "Khmer", + HB_SCRIPT_KHMER, + HINTING_BOTTOM_TO_TOP, + "\xE1\x9F\xA0" ) /* ០ */ + + SCRIPT( khms, KHMS, + "Khmer Symbols", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE1\xA7\xA1 \xE1\xA7\xAA" ) /* ᧡ ᧪ */ + + SCRIPT( knda, KNDA, + "Kannada", + HB_SCRIPT_KANNADA, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB3\xA6 \xE0\xB2\xAC" ) /* ೦ ಬ */ + + /* only digit zero has a simple shape in the Lao script */ + SCRIPT( lao, LAO, + "Lao", + HB_SCRIPT_LAO, + HINTING_BOTTOM_TO_TOP, + "\xE0\xBB\x90" ) /* à» */ + + SCRIPT( latn, LATN, + "Latin", + HB_SCRIPT_LATIN, + HINTING_BOTTOM_TO_TOP, + "o O 0" ) + + SCRIPT( latb, LATB, + "Latin Subscript Fallback", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE2\x82\x92 \xE2\x82\x80" ) /* â‚’ â‚€ */ + + SCRIPT( latp, LATP, + "Latin Superscript Fallback", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE1\xB5\x92 \xE1\xB4\xBC \xE2\x81\xB0" ) /* áµ’ á´¼ â° */ + + SCRIPT( lisu, LISU, + "Lisu", + HB_SCRIPT_LISU, + HINTING_BOTTOM_TO_TOP, + "\xEA\x93\xB3" ) /* ꓳ */ + + SCRIPT( mlym, MLYM, + "Malayalam", + HB_SCRIPT_MALAYALAM, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB4\xA0 \xE0\xB4\xB1" ) /* à´  à´± */ + + SCRIPT( medf, MEDF, + "Medefaidrin", + HB_SCRIPT_MEDEFAIDRIN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x96\xB9\xA1 \xF0\x96\xB9\x9B \xF0\x96\xB9\xAF" ) /* 𖹡 ð–¹› 𖹯 */ + + SCRIPT( mong, MONG, + "Mongolian", + HB_SCRIPT_MONGOLIAN, + HINTING_TOP_TO_BOTTOM, + "\xE1\xA1\x82 \xE1\xA0\xAA" ) /* á¡‚ á ª */ + + SCRIPT( mymr, MYMR, + "Myanmar", + HB_SCRIPT_MYANMAR, + HINTING_BOTTOM_TO_TOP, + "\xE1\x80\x9D \xE1\x80\x84 \xE1\x80\x82" ) /* ဠင ဂ */ + + SCRIPT( nkoo, NKOO, + "N'Ko", + HB_SCRIPT_NKO, + HINTING_BOTTOM_TO_TOP, + "\xDF\x8B \xDF\x80" ) /* ß‹ ߀ */ + + SCRIPT( none, NONE, + "no script", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "" ) + + SCRIPT( olck, OLCK, + "Ol Chiki", + HB_SCRIPT_OL_CHIKI, + HINTING_BOTTOM_TO_TOP, + "\xE1\xB1\x9B" ) /* á±› */ + + SCRIPT( orkh, ORKH, + "Old Turkic", + HB_SCRIPT_OLD_TURKIC, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xB0\x97" ) /* ð°— */ + + SCRIPT( osge, OSGE, + "Osage", + HB_SCRIPT_OSAGE, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x93\x82 \xF0\x90\x93\xAA" ) /* 𓂠𓪠*/ + + SCRIPT( osma, OSMA, + "Osmanya", + HB_SCRIPT_OSMANYA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x92\x86 \xF0\x90\x92\xA0" ) /* ð’† ð’  */ + + SCRIPT( rohg, ROHG, + "Hanifi Rohingya", + HB_SCRIPT_HANIFI_ROHINGYA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xB4\xB0" ) /* ð´° */ + + SCRIPT( saur, SAUR, + "Saurashtra", + HB_SCRIPT_SAURASHTRA, + HINTING_BOTTOM_TO_TOP, + "\xEA\xA2\x9D \xEA\xA3\x90" ) /* ê¢ ê£ */ + + SCRIPT( shaw, SHAW, + "Shavian", + HB_SCRIPT_SHAVIAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x91\xB4" ) /* ð‘´ */ + + SCRIPT( sinh, SINH, + "Sinhala", + HB_SCRIPT_SINHALA, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB6\xA7" ) /* ට */ + + /* only digit zero has a simple (round) shape in the Sundanese script */ + SCRIPT( sund, SUND, + "Sundanese", + HB_SCRIPT_SUNDANESE, + HINTING_BOTTOM_TO_TOP, + "\xE1\xAE\xB0" ) /* á®° */ + + /* only digit zero has a simple (round) shape in the Tamil script */ + SCRIPT( taml, TAML, + "Tamil", + HB_SCRIPT_TAMIL, + HINTING_BOTTOM_TO_TOP, + "\xE0\xAF\xA6" ) /* ௦ */ + + SCRIPT( tavt, TAVT, + "Tai Viet", + HB_SCRIPT_TAI_VIET, + HINTING_BOTTOM_TO_TOP, + "\xEA\xAA\x92 \xEA\xAA\xAB" ) /* ꪒ ꪫ */ + + /* there are no simple forms for letters; we thus use two digit shapes */ + SCRIPT( telu, TELU, + "Telugu", + HB_SCRIPT_TELUGU, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB1\xA6 \xE0\xB1\xA7" ) /* ౦ ౧ */ + + SCRIPT( tfng, TFNG, + "Tifinagh", + HB_SCRIPT_TIFINAGH, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB5\x94" ) /* âµ” */ + + SCRIPT( thai, THAI, + "Thai", + HB_SCRIPT_THAI, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๠*/ + + SCRIPT( vaii, VAII, + "Vai", + HB_SCRIPT_VAI, + HINTING_BOTTOM_TO_TOP, + "\xEA\x98\x93 \xEA\x96\x9C \xEA\x96\xB4" ) /* ꘓ ê–œ ê–´ */ + +#ifdef AF_CONFIG_OPTION_INDIC + + SCRIPT( limb, LIMB, + "Limbu", + HB_SCRIPT_LIMBU, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + + SCRIPT( orya, ORYA, + "Oriya", + HB_SCRIPT_ORIYA, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + + SCRIPT( sylo, SYLO, + "Syloti Nagri", + HB_SCRIPT_SYLOTI_NAGRI, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + + SCRIPT( tibt, TIBT, + "Tibetan", + HB_SCRIPT_TIBETAN, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + +#endif /* AF_CONFIG_OPTION_INDIC */ + +#ifdef AF_CONFIG_OPTION_CJK + + SCRIPT( hani, HANI, + "CJKV ideographs", + HB_SCRIPT_HAN, + HINTING_BOTTOM_TO_TOP, + "\xE7\x94\xB0 \xE5\x9B\x97" ) /* ç”° å›— */ + +#endif /* AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/external/freetype/src/autofit/afshaper.c b/external/freetype/src/autofit/afshaper.c new file mode 100644 index 000000000..abc6f1d29 --- /dev/null +++ b/external/freetype/src/autofit/afshaper.c @@ -0,0 +1,690 @@ +/**************************************************************************** + * + * afshaper.c + * + * HarfBuzz interface for accessing OpenType features (body). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/ftadvanc.h> +#include "afglobal.h" +#include "aftypes.h" +#include "afshaper.h" + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT afshaper + + + /* + * We use `sets' (in the HarfBuzz sense, which comes quite near to the + * usual mathematical meaning) to manage both lookups and glyph indices. + * + * 1. For each coverage, collect lookup IDs in a set. Note that an + * auto-hinter `coverage' is represented by one `feature', and a + * feature consists of an arbitrary number of (font specific) `lookup's + * that actually do the mapping job. Please check the OpenType + * specification for more details on features and lookups. + * + * 2. Create glyph ID sets from the corresponding lookup sets. + * + * 3. The glyph set corresponding to AF_COVERAGE_DEFAULT is computed + * with all lookups specific to the OpenType script activated. It + * relies on the order of AF_DEFINE_STYLE_CLASS entries so that + * special coverages (like `oldstyle figures') don't get overwritten. + * + */ + + + /* load coverage tags */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + static const hb_tag_t name ## _coverage[] = \ + { \ + HB_TAG( tag1, tag2, tag3, tag4 ), \ + HB_TAG_NONE \ + }; + + +#include "afcover.h" + + + /* define mapping between coverage tags and AF_Coverage */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + name ## _coverage, + + + static const hb_tag_t* coverages[] = + { +#include "afcover.h" + + NULL /* AF_COVERAGE_DEFAULT */ + }; + + + /* load HarfBuzz script tags */ +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) h, + + + static const hb_script_t scripts[] = + { +#include "afscript.h" + }; + + + FT_Error + af_shaper_get_coverage( AF_FaceGlobals globals, + AF_StyleClass style_class, + FT_UShort* gstyles, + FT_Bool default_script ) + { + hb_face_t* face; + + hb_set_t* gsub_lookups = NULL; /* GSUB lookups for a given script */ + hb_set_t* gsub_glyphs = NULL; /* glyphs covered by GSUB lookups */ + hb_set_t* gpos_lookups = NULL; /* GPOS lookups for a given script */ + hb_set_t* gpos_glyphs = NULL; /* glyphs covered by GPOS lookups */ + + hb_script_t script; + const hb_tag_t* coverage_tags; + hb_tag_t script_tags[] = { HB_TAG_NONE, + HB_TAG_NONE, + HB_TAG_NONE, + HB_TAG_NONE }; + + hb_codepoint_t idx; +#ifdef FT_DEBUG_LEVEL_TRACE + int count; +#endif + + + if ( !globals || !style_class || !gstyles ) + return FT_THROW( Invalid_Argument ); + + face = hb_font_get_face( globals->hb_font ); + + coverage_tags = coverages[style_class->coverage]; + script = scripts[style_class->script]; + + /* Convert a HarfBuzz script tag into the corresponding OpenType */ + /* tag or tags -- some Indic scripts like Devanagari have an old */ + /* and a new set of features. */ + { + unsigned int tags_count = 3; + hb_tag_t tags[3]; + + + hb_ot_tags_from_script_and_language( script, + HB_LANGUAGE_INVALID, + &tags_count, + tags, + NULL, + NULL ); + script_tags[0] = tags_count > 0 ? tags[0] : HB_TAG_NONE; + script_tags[1] = tags_count > 1 ? tags[1] : HB_TAG_NONE; + script_tags[2] = tags_count > 2 ? tags[2] : HB_TAG_NONE; + } + + /* If the second tag is HB_OT_TAG_DEFAULT_SCRIPT, change that to */ + /* HB_TAG_NONE except for the default script. */ + if ( default_script ) + { + if ( script_tags[0] == HB_TAG_NONE ) + script_tags[0] = HB_OT_TAG_DEFAULT_SCRIPT; + else + { + if ( script_tags[1] == HB_TAG_NONE ) + script_tags[1] = HB_OT_TAG_DEFAULT_SCRIPT; + else if ( script_tags[1] != HB_OT_TAG_DEFAULT_SCRIPT ) + script_tags[2] = HB_OT_TAG_DEFAULT_SCRIPT; + } + } + else + { + /* we use non-standard tags like `khms' for special purposes; */ + /* HarfBuzz maps them to `DFLT', which we don't want to handle here */ + if ( script_tags[0] == HB_OT_TAG_DEFAULT_SCRIPT ) + goto Exit; + } + + gsub_lookups = hb_set_create(); + hb_ot_layout_collect_lookups( face, + HB_OT_TAG_GSUB, + script_tags, + NULL, + coverage_tags, + gsub_lookups ); + + if ( hb_set_is_empty( gsub_lookups ) ) + goto Exit; /* nothing to do */ + + FT_TRACE4(( "GSUB lookups (style `%s'):\n", + af_style_names[style_class->style] )); + FT_TRACE4(( " " )); + +#ifdef FT_DEBUG_LEVEL_TRACE + count = 0; +#endif + + gsub_glyphs = hb_set_create(); + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %d", idx )); + count++; +#endif + + /* get output coverage of GSUB feature */ + hb_ot_layout_lookup_collect_glyphs( face, + HB_OT_TAG_GSUB, + idx, + NULL, + NULL, + NULL, + gsub_glyphs ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE4(( " (none)" )); + FT_TRACE4(( "\n" )); + FT_TRACE4(( "\n" )); +#endif + + FT_TRACE4(( "GPOS lookups (style `%s'):\n", + af_style_names[style_class->style] )); + FT_TRACE4(( " " )); + + gpos_lookups = hb_set_create(); + hb_ot_layout_collect_lookups( face, + HB_OT_TAG_GPOS, + script_tags, + NULL, + coverage_tags, + gpos_lookups ); + +#ifdef FT_DEBUG_LEVEL_TRACE + count = 0; +#endif + + gpos_glyphs = hb_set_create(); + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %d", idx )); + count++; +#endif + + /* get input coverage of GPOS feature */ + hb_ot_layout_lookup_collect_glyphs( face, + HB_OT_TAG_GPOS, + idx, + NULL, + gpos_glyphs, + NULL, + NULL ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE4(( " (none)" )); + FT_TRACE4(( "\n" )); + FT_TRACE4(( "\n" )); +#endif + + /* + * We now check whether we can construct blue zones, using glyphs + * covered by the feature only. In case there is not a single zone + * (that is, not a single character is covered), we skip this coverage. + * + */ + if ( style_class->coverage != AF_COVERAGE_DEFAULT ) + { + AF_Blue_Stringset bss = style_class->blue_stringset; + const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; + + FT_Bool found = 0; + + + for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) + { + const char* p = &af_blue_strings[bs->string]; + + + while ( *p ) + { + hb_codepoint_t ch; + + + GET_UTF8_CHAR( ch, p ); + + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, + &idx ); ) + { + hb_codepoint_t gidx = FT_Get_Char_Index( globals->face, ch ); + + + if ( hb_ot_layout_lookup_would_substitute( face, idx, + &gidx, 1, 1 ) ) + { + found = 1; + break; + } + } + } + } + + if ( !found ) + { + FT_TRACE4(( " no blue characters found; style skipped\n" )); + goto Exit; + } + } + + /* + * Various OpenType features might use the same glyphs at different + * vertical positions; for example, superscript and subscript glyphs + * could be the same. However, the auto-hinter is completely + * agnostic of OpenType features after the feature analysis has been + * completed: The engine then simply receives a glyph index and returns a + * hinted and usually rendered glyph. + * + * Consider the superscript feature of font `pala.ttf': Some of the + * glyphs are `real', that is, they have a zero vertical offset, but + * most of them are small caps glyphs shifted up to the superscript + * position (that is, the `sups' feature is present in both the GSUB and + * GPOS tables). The code for blue zones computation actually uses a + * feature's y offset so that the `real' glyphs get correct hints. But + * later on it is impossible to decide whether a glyph index belongs to, + * say, the small caps or superscript feature. + * + * For this reason, we don't assign a style to a glyph if the current + * feature covers the glyph in both the GSUB and the GPOS tables. This + * is quite a broad condition, assuming that + * + * (a) glyphs that get used in multiple features are present in a + * feature without vertical shift, + * + * and + * + * (b) a feature's GPOS data really moves the glyph vertically. + * + * Not fulfilling condition (a) makes a font larger; it would also + * reduce the number of glyphs that could be addressed directly without + * using OpenType features, so this assumption is rather strong. + * + * Condition (b) is much weaker, and there might be glyphs which get + * missed. However, the OpenType features we are going to handle are + * primarily located in GSUB, and HarfBuzz doesn't provide an API to + * directly get the necessary information from the GPOS table. A + * possible solution might be to directly parse the GPOS table to find + * out whether a glyph gets shifted vertically, but this is something I + * would like to avoid if not really necessary. + * + * Note that we don't follow this logic for the default coverage. + * Complex scripts like Devanagari have mandatory GPOS features to + * position many glyph elements, using mark-to-base or mark-to-ligature + * tables; the number of glyphs missed due to condition (b) would be far + * too large. + * + */ + if ( style_class->coverage != AF_COVERAGE_DEFAULT ) + hb_set_subtract( gsub_glyphs, gpos_glyphs ); + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" )); + count = 0; +#endif + + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( count % 10 ) ) + { + FT_TRACE4(( "\n" )); + FT_TRACE4(( " " )); + } + + FT_TRACE4(( " %d", idx )); + count++; +#endif + + /* glyph indices returned by `hb_ot_layout_lookup_collect_glyphs' */ + /* can be arbitrary: some fonts use fake indices for processing */ + /* internal to GSUB or GPOS, which is fully valid */ + if ( idx >= (hb_codepoint_t)globals->glyph_count ) + continue; + + if ( gstyles[idx] == AF_STYLE_UNASSIGNED ) + gstyles[idx] = (FT_UShort)style_class->style; +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE4(( "*" )); +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + { + FT_TRACE4(( "\n" )); + FT_TRACE4(( " (none)" )); + } + FT_TRACE4(( "\n" )); + FT_TRACE4(( "\n" )); +#endif + + Exit: + hb_set_destroy( gsub_lookups ); + hb_set_destroy( gsub_glyphs ); + hb_set_destroy( gpos_lookups ); + hb_set_destroy( gpos_glyphs ); + + return FT_Err_Ok; + } + + + /* construct HarfBuzz features */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + static const hb_feature_t name ## _feature[] = \ + { \ + { \ + HB_TAG( tag1, tag2, tag3, tag4 ), \ + 1, 0, (unsigned int)-1 \ + } \ + }; + + +#include "afcover.h" + + + /* define mapping between HarfBuzz features and AF_Coverage */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + name ## _feature, + + + static const hb_feature_t* features[] = + { +#include "afcover.h" + + NULL /* AF_COVERAGE_DEFAULT */ + }; + + + void* + af_shaper_buf_create( FT_Face face ) + { + FT_UNUSED( face ); + + return (void*)hb_buffer_create(); + } + + + void + af_shaper_buf_destroy( FT_Face face, + void* buf ) + { + FT_UNUSED( face ); + + hb_buffer_destroy( (hb_buffer_t*)buf ); + } + + + const char* + af_shaper_get_cluster( const char* p, + AF_StyleMetrics metrics, + void* buf_, + unsigned int* count ) + { + AF_StyleClass style_class; + const hb_feature_t* feature; + FT_Int upem; + const char* q; + int len; + + hb_buffer_t* buf = (hb_buffer_t*)buf_; + hb_font_t* font; + hb_codepoint_t dummy; + + + upem = (FT_Int)metrics->globals->face->units_per_EM; + style_class = metrics->style_class; + feature = features[style_class->coverage]; + + font = metrics->globals->hb_font; + + /* we shape at a size of units per EM; this means font units */ + hb_font_set_scale( font, upem, upem ); + + while ( *p == ' ' ) + p++; + + /* count bytes up to next space (or end of buffer) */ + q = p; + while ( !( *q == ' ' || *q == '\0' ) ) + GET_UTF8_CHAR( dummy, q ); + len = (int)( q - p ); + + /* feed character(s) to the HarfBuzz buffer */ + hb_buffer_clear_contents( buf ); + hb_buffer_add_utf8( buf, p, len, 0, len ); + + /* we let HarfBuzz guess the script and writing direction */ + hb_buffer_guess_segment_properties( buf ); + + /* shape buffer, which means conversion from character codes to */ + /* glyph indices, possibly applying a feature */ + hb_shape( font, buf, feature, feature ? 1 : 0 ); + + if ( feature ) + { + hb_buffer_t* hb_buf = metrics->globals->hb_buf; + + unsigned int gcount; + hb_glyph_info_t* ginfo; + + unsigned int hb_gcount; + hb_glyph_info_t* hb_ginfo; + + + /* we have to check whether applying a feature does actually change */ + /* glyph indices; otherwise the affected glyph or glyphs aren't */ + /* available at all in the feature */ + + hb_buffer_clear_contents( hb_buf ); + hb_buffer_add_utf8( hb_buf, p, len, 0, len ); + hb_buffer_guess_segment_properties( hb_buf ); + hb_shape( font, hb_buf, NULL, 0 ); + + ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); + hb_ginfo = hb_buffer_get_glyph_infos( hb_buf, &hb_gcount ); + + if ( gcount == hb_gcount ) + { + unsigned int i; + + + for (i = 0; i < gcount; i++ ) + if ( ginfo[i].codepoint != hb_ginfo[i].codepoint ) + break; + + if ( i == gcount ) + { + /* both buffers have identical glyph indices */ + hb_buffer_clear_contents( buf ); + } + } + } + + *count = hb_buffer_get_length( buf ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( feature && *count > 1 ) + FT_TRACE1(( "af_shaper_get_cluster:" + " input character mapped to multiple glyphs\n" )); +#endif + + return q; + } + + + FT_ULong + af_shaper_get_elem( AF_StyleMetrics metrics, + void* buf_, + unsigned int idx, + FT_Long* advance, + FT_Long* y_offset ) + { + hb_buffer_t* buf = (hb_buffer_t*)buf_; + hb_glyph_info_t* ginfo; + hb_glyph_position_t* gpos; + unsigned int gcount; + + FT_UNUSED( metrics ); + + + ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); + gpos = hb_buffer_get_glyph_positions( buf, &gcount ); + + if ( idx >= gcount ) + return 0; + + if ( advance ) + *advance = gpos[idx].x_advance; + if ( y_offset ) + *y_offset = gpos[idx].y_offset; + + return ginfo[idx].codepoint; + } + + +#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + FT_Error + af_shaper_get_coverage( AF_FaceGlobals globals, + AF_StyleClass style_class, + FT_UShort* gstyles, + FT_Bool default_script ) + { + FT_UNUSED( globals ); + FT_UNUSED( style_class ); + FT_UNUSED( gstyles ); + FT_UNUSED( default_script ); + + return FT_Err_Ok; + } + + + void* + af_shaper_buf_create( FT_Face face ) + { + FT_UNUSED( face ); + + return NULL; + } + + + void + af_shaper_buf_destroy( FT_Face face, + void* buf ) + { + FT_UNUSED( face ); + FT_UNUSED( buf ); + } + + + const char* + af_shaper_get_cluster( const char* p, + AF_StyleMetrics metrics, + void* buf_, + unsigned int* count ) + { + FT_Face face = metrics->globals->face; + FT_ULong ch, dummy = 0; + FT_ULong* buf = (FT_ULong*)buf_; + + + while ( *p == ' ' ) + p++; + + GET_UTF8_CHAR( ch, p ); + + /* since we don't have an engine to handle clusters, */ + /* we scan the characters but return zero */ + while ( !( *p == ' ' || *p == '\0' ) ) + GET_UTF8_CHAR( dummy, p ); + + if ( dummy ) + { + *buf = 0; + *count = 0; + } + else + { + *buf = FT_Get_Char_Index( face, ch ); + *count = 1; + } + + return p; + } + + + FT_ULong + af_shaper_get_elem( AF_StyleMetrics metrics, + void* buf_, + unsigned int idx, + FT_Long* advance, + FT_Long* y_offset ) + { + FT_Face face = metrics->globals->face; + FT_ULong glyph_index = *(FT_ULong*)buf_; + + FT_UNUSED( idx ); + + + if ( advance ) + FT_Get_Advance( face, + glyph_index, + FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM, + advance ); + + if ( y_offset ) + *y_offset = 0; + + return glyph_index; + } + + +#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afshaper.h b/external/freetype/src/autofit/afshaper.h new file mode 100644 index 000000000..054a18ffb --- /dev/null +++ b/external/freetype/src/autofit/afshaper.h @@ -0,0 +1,71 @@ +/**************************************************************************** + * + * afshaper.h + * + * HarfBuzz interface for accessing OpenType features (specification). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFSHAPER_H_ +#define AFSHAPER_H_ + + +#include <freetype/freetype.h> + + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + +#include <hb.h> +#include <hb-ot.h> +#include "ft-hb.h" + +#endif + + +FT_BEGIN_HEADER + + FT_Error + af_shaper_get_coverage( AF_FaceGlobals globals, + AF_StyleClass style_class, + FT_UShort* gstyles, + FT_Bool default_script ); + + + void* + af_shaper_buf_create( FT_Face face ); + + void + af_shaper_buf_destroy( FT_Face face, + void* buf ); + + const char* + af_shaper_get_cluster( const char* p, + AF_StyleMetrics metrics, + void* buf_, + unsigned int* count ); + + FT_ULong + af_shaper_get_elem( AF_StyleMetrics metrics, + void* buf_, + unsigned int idx, + FT_Long* x_advance, + FT_Long* y_offset ); + + /* */ + +FT_END_HEADER + +#endif /* AFSHAPER_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afstyles.h b/external/freetype/src/autofit/afstyles.h new file mode 100644 index 000000000..73ebef017 --- /dev/null +++ b/external/freetype/src/autofit/afstyles.h @@ -0,0 +1,487 @@ +/**************************************************************************** + * + * afstyles.h + * + * Auto-fitter styles (specification only). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* The following part can be included multiple times. */ + /* Define `STYLE' as needed. */ + + + /* Add new styles here. The first and second arguments are the */ + /* style name in lowercase and uppercase, respectively, followed */ + /* by a description string. The next arguments are the */ + /* corresponding writing system, script, blue stringset, and */ + /* coverage. */ + /* */ + /* Note that styles using `AF_COVERAGE_DEFAULT' should always */ + /* come after styles with other coverages. Also note that */ + /* fallback scripts only use `AF_COVERAGE_DEFAULT' for its */ + /* style. */ + /* */ + /* Example: */ + /* */ + /* STYLE( cyrl_dflt, CYRL_DFLT, */ + /* "Cyrillic default style", */ + /* AF_WRITING_SYSTEM_LATIN, */ + /* AF_SCRIPT_CYRL, */ + /* AF_BLUE_STRINGSET_CYRL, */ + /* AF_COVERAGE_DEFAULT ) */ + +#undef STYLE_LATIN +#define STYLE_LATIN( s, S, f, F, ds, df, C ) \ + STYLE( s ## _ ## f, S ## _ ## F, \ + ds " " df " style", \ + AF_WRITING_SYSTEM_LATIN, \ + AF_SCRIPT_ ## S, \ + AF_BLUE_STRINGSET_ ## S, \ + AF_COVERAGE_ ## C ) + +#undef META_STYLE_LATIN +#define META_STYLE_LATIN( s, S, ds ) \ + STYLE_LATIN( s, S, c2cp, C2CP, ds, \ + "petite capitals from capitals", \ + PETITE_CAPITALS_FROM_CAPITALS ) \ + STYLE_LATIN( s, S, c2sc, C2SC, ds, \ + "small capitals from capitals", \ + SMALL_CAPITALS_FROM_CAPITALS ) \ + STYLE_LATIN( s, S, ordn, ORDN, ds, \ + "ordinals", \ + ORDINALS ) \ + STYLE_LATIN( s, S, pcap, PCAP, ds, \ + "petite capitals", \ + PETITE_CAPITALS ) \ + STYLE_LATIN( s, S, sinf, SINF, ds, \ + "scientific inferiors", \ + SCIENTIFIC_INFERIORS ) \ + STYLE_LATIN( s, S, smcp, SMCP, ds, \ + "small capitals", \ + SMALL_CAPITALS ) \ + STYLE_LATIN( s, S, subs, SUBS, ds, \ + "subscript", \ + SUBSCRIPT ) \ + STYLE_LATIN( s, S, sups, SUPS, ds, \ + "superscript", \ + SUPERSCRIPT ) \ + STYLE_LATIN( s, S, titl, TITL, ds, \ + "titling", \ + TITLING ) \ + STYLE_LATIN( s, S, dflt, DFLT, ds, \ + "default", \ + DEFAULT ) + + + STYLE( adlm_dflt, ADLM_DFLT, + "Adlam default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ADLM, + AF_BLUE_STRINGSET_ADLM, + AF_COVERAGE_DEFAULT ) + + STYLE( arab_dflt, ARAB_DFLT, + "Arabic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ARAB, + AF_BLUE_STRINGSET_ARAB, + AF_COVERAGE_DEFAULT ) + + STYLE( armn_dflt, ARMN_DFLT, + "Armenian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ARMN, + AF_BLUE_STRINGSET_ARMN, + AF_COVERAGE_DEFAULT ) + + STYLE( avst_dflt, AVST_DFLT, + "Avestan default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_AVST, + AF_BLUE_STRINGSET_AVST, + AF_COVERAGE_DEFAULT ) + + STYLE( bamu_dflt, BAMU_DFLT, + "Bamum default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BAMU, + AF_BLUE_STRINGSET_BAMU, + AF_COVERAGE_DEFAULT ) + + STYLE( beng_dflt, BENG_DFLT, + "Bengali default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BENG, + AF_BLUE_STRINGSET_BENG, + AF_COVERAGE_DEFAULT ) + + STYLE( buhd_dflt, BUHD_DFLT, + "Buhid default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BUHD, + AF_BLUE_STRINGSET_BUHD, + AF_COVERAGE_DEFAULT ) + + STYLE( cakm_dflt, CAKM_DFLT, + "Chakma default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CAKM, + AF_BLUE_STRINGSET_CAKM, + AF_COVERAGE_DEFAULT ) + + STYLE( cans_dflt, CANS_DFLT, + "Canadian Syllabics default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CANS, + AF_BLUE_STRINGSET_CANS, + AF_COVERAGE_DEFAULT ) + + STYLE( cari_dflt, CARI_DFLT, + "Carian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CARI, + AF_BLUE_STRINGSET_CARI, + AF_COVERAGE_DEFAULT ) + + STYLE( cher_dflt, CHER_DFLT, + "Cherokee default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CHER, + AF_BLUE_STRINGSET_CHER, + AF_COVERAGE_DEFAULT ) + + STYLE( copt_dflt, COPT_DFLT, + "Coptic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_COPT, + AF_BLUE_STRINGSET_COPT, + AF_COVERAGE_DEFAULT ) + + STYLE( cprt_dflt, CPRT_DFLT, + "Cypriot default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CPRT, + AF_BLUE_STRINGSET_CPRT, + AF_COVERAGE_DEFAULT ) + + META_STYLE_LATIN( cyrl, CYRL, "Cyrillic" ) + + STYLE( deva_dflt, DEVA_DFLT, + "Devanagari default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_DEVA, + AF_BLUE_STRINGSET_DEVA, + AF_COVERAGE_DEFAULT ) + + STYLE( dsrt_dflt, DSRT_DFLT, + "Deseret default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_DSRT, + AF_BLUE_STRINGSET_DSRT, + AF_COVERAGE_DEFAULT ) + + STYLE( ethi_dflt, ETHI_DFLT, + "Ethiopic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ETHI, + AF_BLUE_STRINGSET_ETHI, + AF_COVERAGE_DEFAULT ) + + STYLE( geor_dflt, GEOR_DFLT, + "Georgian (Mkhedruli) default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GEOR, + AF_BLUE_STRINGSET_GEOR, + AF_COVERAGE_DEFAULT ) + + STYLE( geok_dflt, GEOK_DFLT, + "Georgian (Khutsuri) default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GEOK, + AF_BLUE_STRINGSET_GEOK, + AF_COVERAGE_DEFAULT ) + + STYLE( glag_dflt, GLAG_DFLT, + "Glagolitic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GLAG, + AF_BLUE_STRINGSET_GLAG, + AF_COVERAGE_DEFAULT ) + + STYLE( goth_dflt, GOTH_DFLT, + "Gothic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GOTH, + AF_BLUE_STRINGSET_GOTH, + AF_COVERAGE_DEFAULT ) + + META_STYLE_LATIN( grek, GREK, "Greek" ) + + STYLE( gujr_dflt, GUJR_DFLT, + "Gujarati default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GUJR, + AF_BLUE_STRINGSET_GUJR, + AF_COVERAGE_DEFAULT ) + + STYLE( guru_dflt, GURU_DFLT, + "Gurmukhi default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GURU, + AF_BLUE_STRINGSET_GURU, + AF_COVERAGE_DEFAULT ) + + STYLE( hebr_dflt, HEBR_DFLT, + "Hebrew default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_HEBR, + AF_BLUE_STRINGSET_HEBR, + AF_COVERAGE_DEFAULT ) + + STYLE( kali_dflt, KALI_DFLT, + "Kayah Li default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KALI, + AF_BLUE_STRINGSET_KALI, + AF_COVERAGE_DEFAULT ) + + STYLE( khmr_dflt, KHMR_DFLT, + "Khmer default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KHMR, + AF_BLUE_STRINGSET_KHMR, + AF_COVERAGE_DEFAULT ) + + STYLE( khms_dflt, KHMS_DFLT, + "Khmer Symbols default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KHMS, + AF_BLUE_STRINGSET_KHMS, + AF_COVERAGE_DEFAULT ) + + STYLE( knda_dflt, KNDA_DFLT, + "Kannada default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KNDA, + AF_BLUE_STRINGSET_KNDA, + AF_COVERAGE_DEFAULT ) + + STYLE( lao_dflt, LAO_DFLT, + "Lao default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LAO, + AF_BLUE_STRINGSET_LAO, + AF_COVERAGE_DEFAULT ) + + META_STYLE_LATIN( latn, LATN, "Latin" ) + + STYLE( latb_dflt, LATB_DFLT, + "Latin subscript fallback default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LATB, + AF_BLUE_STRINGSET_LATB, + AF_COVERAGE_DEFAULT ) + + STYLE( latp_dflt, LATP_DFLT, + "Latin superscript fallback default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LATP, + AF_BLUE_STRINGSET_LATP, + AF_COVERAGE_DEFAULT ) + + STYLE( lisu_dflt, LISU_DFLT, + "Lisu default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LISU, + AF_BLUE_STRINGSET_LISU, + AF_COVERAGE_DEFAULT ) + + STYLE( mlym_dflt, MLYM_DFLT, + "Malayalam default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MLYM, + AF_BLUE_STRINGSET_MLYM, + AF_COVERAGE_DEFAULT ) + + STYLE( medf_dflt, MEDF_DFLT, + "Medefaidrin default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MEDF, + AF_BLUE_STRINGSET_MEDF, + AF_COVERAGE_DEFAULT ) + + STYLE( mong_dflt, MONG_DFLT, + "Mongolian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MONG, + AF_BLUE_STRINGSET_MONG, + AF_COVERAGE_DEFAULT ) + + STYLE( mymr_dflt, MYMR_DFLT, + "Myanmar default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MYMR, + AF_BLUE_STRINGSET_MYMR, + AF_COVERAGE_DEFAULT ) + + STYLE( nkoo_dflt, NKOO_DFLT, + "N'Ko default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_NKOO, + AF_BLUE_STRINGSET_NKOO, + AF_COVERAGE_DEFAULT ) + + STYLE( none_dflt, NONE_DFLT, + "no style", + AF_WRITING_SYSTEM_DUMMY, + AF_SCRIPT_NONE, + AF_BLUE_STRINGSET_NONE, + AF_COVERAGE_DEFAULT ) + + STYLE( olck_dflt, OLCK_DFLT, + "Ol Chiki default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OLCK, + AF_BLUE_STRINGSET_OLCK, + AF_COVERAGE_DEFAULT ) + + STYLE( orkh_dflt, ORKH_DFLT, + "Old Turkic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ORKH, + AF_BLUE_STRINGSET_ORKH, + AF_COVERAGE_DEFAULT ) + + STYLE( osge_dflt, OSGE_DFLT, + "Osage default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OSGE, + AF_BLUE_STRINGSET_OSGE, + AF_COVERAGE_DEFAULT ) + + STYLE( osma_dflt, OSMA_DFLT, + "Osmanya default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OSMA, + AF_BLUE_STRINGSET_OSMA, + AF_COVERAGE_DEFAULT ) + + STYLE( rohg_dflt, ROHG_DFLT, + "Hanifi Rohingya default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ROHG, + AF_BLUE_STRINGSET_ROHG, + AF_COVERAGE_DEFAULT ) + + STYLE( saur_dflt, SAUR_DFLT, + "Saurashtra default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SAUR, + AF_BLUE_STRINGSET_SAUR, + AF_COVERAGE_DEFAULT ) + + STYLE( shaw_dflt, SHAW_DFLT, + "Shavian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SHAW, + AF_BLUE_STRINGSET_SHAW, + AF_COVERAGE_DEFAULT ) + + STYLE( sinh_dflt, SINH_DFLT, + "Sinhala default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SINH, + AF_BLUE_STRINGSET_SINH, + AF_COVERAGE_DEFAULT ) + + STYLE( sund_dflt, SUND_DFLT, + "Sundanese default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SUND, + AF_BLUE_STRINGSET_SUND, + AF_COVERAGE_DEFAULT ) + + STYLE( taml_dflt, TAML_DFLT, + "Tamil default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TAML, + AF_BLUE_STRINGSET_TAML, + AF_COVERAGE_DEFAULT ) + + STYLE( tavt_dflt, TAVT_DFLT, + "Tai Viet default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TAVT, + AF_BLUE_STRINGSET_TAVT, + AF_COVERAGE_DEFAULT ) + + STYLE( telu_dflt, TELU_DFLT, + "Telugu default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TELU, + AF_BLUE_STRINGSET_TELU, + AF_COVERAGE_DEFAULT ) + + STYLE( tfng_dflt, TFNG_DFLT, + "Tifinagh default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TFNG, + AF_BLUE_STRINGSET_TFNG, + AF_COVERAGE_DEFAULT ) + + STYLE( thai_dflt, THAI_DFLT, + "Thai default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_THAI, + AF_BLUE_STRINGSET_THAI, + AF_COVERAGE_DEFAULT ) + + STYLE( vaii_dflt, VAII_DFLT, + "Vai default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_VAII, + AF_BLUE_STRINGSET_VAII, + AF_COVERAGE_DEFAULT ) + +#ifdef AF_CONFIG_OPTION_INDIC + + /* no blue stringset support for the Indic writing system yet */ +#undef STYLE_DEFAULT_INDIC +#define STYLE_DEFAULT_INDIC( s, S, d ) \ + STYLE( s ## _dflt, S ## _DFLT, \ + d " default style", \ + AF_WRITING_SYSTEM_INDIC, \ + AF_SCRIPT_ ## S, \ + (AF_Blue_Stringset)0, \ + AF_COVERAGE_DEFAULT ) + + STYLE_DEFAULT_INDIC( limb, LIMB, "Limbu" ) + STYLE_DEFAULT_INDIC( orya, ORYA, "Oriya" ) + STYLE_DEFAULT_INDIC( sylo, SYLO, "Syloti Nagri" ) + STYLE_DEFAULT_INDIC( tibt, TIBT, "Tibetan" ) + +#endif /* AF_CONFIG_OPTION_INDIC */ + +#ifdef AF_CONFIG_OPTION_CJK + + STYLE( hani_dflt, HANI_DFLT, + "CJKV ideographs default style", + AF_WRITING_SYSTEM_CJK, + AF_SCRIPT_HANI, + AF_BLUE_STRINGSET_HANI, + AF_COVERAGE_DEFAULT ) + +#endif /* AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/external/freetype/src/autofit/aftypes.h b/external/freetype/src/autofit/aftypes.h new file mode 100644 index 000000000..661519449 --- /dev/null +++ b/external/freetype/src/autofit/aftypes.h @@ -0,0 +1,511 @@ +/**************************************************************************** + * + * aftypes.h + * + * Auto-fitter types (specification only). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************* + * + * The auto-fitter is a complete rewrite of the old auto-hinter. + * Its main feature is the ability to differentiate between different + * writing systems and scripts in order to apply specific rules. + * + * The code has also been compartmentalized into several entities that + * should make algorithmic experimentation easier than with the old + * code. + * + *************************************************************************/ + + +#ifndef AFTYPES_H_ +#define AFTYPES_H_ + + +#include <freetype/freetype.h> +#include <freetype/ftoutln.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> + +#include "afblue.h" + +#ifdef FT_DEBUG_AUTOFIT +#include FT_CONFIG_STANDARD_LIBRARY_H +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** D E B U G G I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef FT_DEBUG_AUTOFIT + +extern int af_debug_disable_horz_hints_; +extern int af_debug_disable_vert_hints_; +extern int af_debug_disable_blue_hints_; +extern void* af_debug_hints_; + +#endif /* FT_DEBUG_AUTOFIT */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** U T I L I T Y S T U F F *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_WidthRec_ + { + FT_Pos org; /* original position/width in font units */ + FT_Pos cur; /* current/scaled position/width in device subpixels */ + FT_Pos fit; /* current/fitted position/width in device subpixels */ + + } AF_WidthRec, *AF_Width; + + + FT_LOCAL( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ); + + FT_LOCAL( void ) + af_sort_and_quantize_widths( FT_UInt* count, + AF_Width widths, + FT_Pos threshold ); + + + /* + * opaque handle to glyph-specific hints -- see `afhints.h' for more + * details + */ + typedef struct AF_GlyphHintsRec_* AF_GlyphHints; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C A L E R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * A scaler models the target pixel device that will receive the + * auto-hinted glyph image. + */ + +#define AF_SCALER_FLAG_NO_HORIZONTAL 1U /* disable horizontal hinting */ +#define AF_SCALER_FLAG_NO_VERTICAL 2U /* disable vertical hinting */ +#define AF_SCALER_FLAG_NO_ADVANCE 4U /* disable advance hinting */ + + + typedef struct AF_ScalerRec_ + { + FT_Face face; /* source font face */ + FT_Fixed x_scale; /* from font units to 1/64 device pixels */ + FT_Fixed y_scale; /* from font units to 1/64 device pixels */ + FT_Pos x_delta; /* in 1/64 device pixels */ + FT_Pos y_delta; /* in 1/64 device pixels */ + FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ + FT_UInt32 flags; /* additional control flags, see above */ + + } AF_ScalerRec, *AF_Scaler; + + +#define AF_SCALER_EQUAL_SCALES( a, b ) \ + ( (a)->x_scale == (b)->x_scale && \ + (a)->y_scale == (b)->y_scale && \ + (a)->x_delta == (b)->x_delta && \ + (a)->y_delta == (b)->y_delta ) + + + typedef struct AF_StyleMetricsRec_* AF_StyleMetrics; + + /* + * This function parses an FT_Face to compute global metrics for + * a specific style. + */ + typedef FT_Error + (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics, + FT_Face face ); + + typedef void + (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics, + AF_Scaler scaler ); + + typedef void + (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics ); + + typedef void + (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics metrics, + FT_Pos* stdHW, + FT_Pos* stdVW ); + + + typedef FT_Error + (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints, + AF_StyleMetrics metrics ); + + typedef FT_Error + (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** W R I T I N G S Y S T E M S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * For the auto-hinter, a writing system consists of multiple scripts that + * can be handled similarly *in a typographical way*; the relationship is + * not based on history. For example, both the Greek and the unrelated + * Armenian scripts share the same features like ascender, descender, + * x-height, etc. Essentially, a writing system is covered by a + * submodule of the auto-fitter; it contains + * + * - a specific global analyzer that computes global metrics specific to + * the script (based on script-specific characters to identify ascender + * height, x-height, etc.), + * + * - a specific glyph analyzer that computes segments and edges for each + * glyph covered by the script, + * + * - a specific grid-fitting algorithm that distorts the scaled glyph + * outline according to the results of the glyph analyzer. + */ + +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) \ + AF_WRITING_SYSTEM_ ## WS, + + /* The list of known writing systems. */ + typedef enum AF_WritingSystem_ + { + +#include "afws-iter.h" + + AF_WRITING_SYSTEM_MAX /* do not remove */ + + } AF_WritingSystem; + + + typedef struct AF_WritingSystemClassRec_ + { + AF_WritingSystem writing_system; + + FT_Offset style_metrics_size; + AF_WritingSystem_InitMetricsFunc style_metrics_init; + AF_WritingSystem_ScaleMetricsFunc style_metrics_scale; + AF_WritingSystem_DoneMetricsFunc style_metrics_done; + AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw; + + AF_WritingSystem_InitHintsFunc style_hints_init; + AF_WritingSystem_ApplyHintsFunc style_hints_apply; + + } AF_WritingSystemClassRec; + + typedef const AF_WritingSystemClassRec* AF_WritingSystemClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C R I P T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * Each script is associated with two sets of Unicode ranges to test + * whether the font face supports the script, and which non-base + * characters the script contains. + * + * We use four-letter script tags from the OpenType specification, + * extended by `NONE', which indicates `no script'. + */ + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + AF_SCRIPT_ ## S, + + /* The list of known scripts. */ + typedef enum AF_Script_ + { + +#include "afscript.h" + + AF_SCRIPT_MAX /* do not remove */ + + } AF_Script; + + + typedef struct AF_Script_UniRangeRec_ + { + FT_UInt32 first; + FT_UInt32 last; + + } AF_Script_UniRangeRec; + +#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } + + typedef const AF_Script_UniRangeRec* AF_Script_UniRange; + + + typedef struct AF_ScriptClassRec_ + { + AF_Script script; + + /* last element in the ranges must be { 0, 0 } */ + AF_Script_UniRange script_uni_ranges; + AF_Script_UniRange script_uni_nonbase_ranges; + + FT_Bool top_to_bottom_hinting; + + const char* standard_charstring; /* for default width and height */ + + } AF_ScriptClassRec; + + typedef const AF_ScriptClassRec* AF_ScriptClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C O V E R A G E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * Usually, a font contains more glyphs than can be addressed by its + * character map. + * + * In the PostScript font world, encoding vectors specific to a given + * task are used to select such glyphs, and these glyphs can be often + * recognized by having a suffix in its glyph names. For example, a + * superscript glyph `A' might be called `A.sup'. Unfortunately, this + * naming scheme is not standardized and thus unusable for us. + * + * In the OpenType world, a better solution was invented, namely + * `features', which cleanly separate a character's input encoding from + * the corresponding glyph's appearance, and which don't use glyph names + * at all. For our purposes, and slightly generalized, an OpenType + * feature is a name of a mapping that maps character codes to + * non-standard glyph indices (features get used for other things also). + * For example, the `sups' feature provides superscript glyphs, thus + * mapping character codes like `A' or `B' to superscript glyph + * representation forms. How this mapping happens is completely + * uninteresting to us. + * + * For the auto-hinter, a `coverage' represents all glyphs of an OpenType + * feature collected in a set (as listed below) that can be hinted + * together. To continue the above example, superscript glyphs must not + * be hinted together with normal glyphs because the blue zones + * completely differ. + * + * Note that FreeType itself doesn't compute coverages; it only provides + * the glyphs addressable by the default Unicode character map. Instead, + * we use the HarfBuzz library (if available), which has many functions + * exactly for this purpose. + * + * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't + * listed separately (including the glyphs addressable by the character + * map). In case HarfBuzz isn't available, it exactly covers the glyphs + * addressable by the character map. + * + */ + +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + AF_COVERAGE_ ## NAME, + + + typedef enum AF_Coverage_ + { +#include "afcover.h" + + AF_COVERAGE_DEFAULT + + } AF_Coverage; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S T Y L E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The topmost structure for modelling the auto-hinter glyph input data + * is a `style class', grouping everything together. + */ + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + AF_STYLE_ ## S, + + /* The list of known styles. */ + typedef enum AF_Style_ + { + +#include "afstyles.h" + + AF_STYLE_MAX /* do not remove */ + + } AF_Style; + + + typedef struct AF_StyleClassRec_ + { + AF_Style style; + + AF_WritingSystem writing_system; + AF_Script script; + AF_Blue_Stringset blue_stringset; + AF_Coverage coverage; + + } AF_StyleClassRec; + + typedef const AF_StyleClassRec* AF_StyleClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S T Y L E M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; + + /* This is the main structure that combines everything. Autofit modules */ + /* specific to writing systems derive their structures from it, for */ + /* example `AF_LatinMetrics'. */ + + typedef struct AF_StyleMetricsRec_ + { + AF_StyleClass style_class; + AF_ScalerRec scaler; + FT_Bool digits_have_same_width; + + AF_FaceGlobals globals; /* to access properties */ + + } AF_StyleMetricsRec; + + +#define AF_HINTING_BOTTOM_TO_TOP 0 +#define AF_HINTING_TOP_TO_BOTTOM 1 + + + /* Declare and define vtables for classes */ +#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \ + FT_CALLBACK_TABLE const AF_WritingSystemClassRec \ + writing_system_class; + +#define AF_DEFINE_WRITING_SYSTEM_CLASS( \ + writing_system_class, \ + system, \ + m_size, \ + m_init, \ + m_scale, \ + m_done, \ + m_stdw, \ + h_init, \ + h_apply ) \ + FT_CALLBACK_TABLE_DEF \ + const AF_WritingSystemClassRec writing_system_class = \ + { \ + system, \ + \ + m_size, \ + \ + m_init, \ + m_scale, \ + m_done, \ + m_stdw, \ + \ + h_init, \ + h_apply \ + }; + + +#define AF_DECLARE_SCRIPT_CLASS( script_class ) \ + FT_CALLBACK_TABLE const AF_ScriptClassRec \ + script_class; + +#define AF_DEFINE_SCRIPT_CLASS( \ + script_class, \ + script, \ + ranges, \ + nonbase_ranges, \ + top_to_bottom, \ + std_charstring ) \ + FT_CALLBACK_TABLE_DEF \ + const AF_ScriptClassRec script_class = \ + { \ + script, \ + ranges, \ + nonbase_ranges, \ + top_to_bottom, \ + std_charstring, \ + }; + + +#define AF_DECLARE_STYLE_CLASS( style_class ) \ + FT_CALLBACK_TABLE const AF_StyleClassRec \ + style_class; + +#define AF_DEFINE_STYLE_CLASS( \ + style_class, \ + style, \ + writing_system, \ + script, \ + blue_stringset, \ + coverage ) \ + FT_CALLBACK_TABLE_DEF \ + const AF_StyleClassRec style_class = \ + { \ + style, \ + writing_system, \ + script, \ + blue_stringset, \ + coverage \ + }; + +/* */ + + +FT_END_HEADER + +#endif /* AFTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afws-decl.h b/external/freetype/src/autofit/afws-decl.h new file mode 100644 index 000000000..48c888afe --- /dev/null +++ b/external/freetype/src/autofit/afws-decl.h @@ -0,0 +1,33 @@ +/**************************************************************************** + * + * afws-decl.h + * + * Auto-fitter writing system declarations (specification only). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFWS_DECL_H_ +#define AFWS_DECL_H_ + + /* Since preprocessor directives can't create other preprocessor */ + /* directives, we have to include the header files manually. */ + +#include "afdummy.h" +#include "aflatin.h" +#include "afcjk.h" +#include "afindic.h" + +#endif /* AFWS_DECL_H_ */ + + +/* END */ diff --git a/external/freetype/src/autofit/afws-iter.h b/external/freetype/src/autofit/afws-iter.h new file mode 100644 index 000000000..a0a686f8c --- /dev/null +++ b/external/freetype/src/autofit/afws-iter.h @@ -0,0 +1,31 @@ +/**************************************************************************** + * + * afws-iter.h + * + * Auto-fitter writing systems iterator (specification only). + * + * Copyright (C) 2013-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /* This header may be included multiple times. */ + /* Define `WRITING_SYSTEM' as needed. */ + + + /* Add new writing systems here. The arguments are the writing system */ + /* name in lowercase and uppercase, respectively. */ + + WRITING_SYSTEM( dummy, DUMMY ) + WRITING_SYSTEM( latin, LATIN ) + WRITING_SYSTEM( cjk, CJK ) + WRITING_SYSTEM( indic, INDIC ) + + +/* END */ diff --git a/external/freetype/src/autofit/autofit.c b/external/freetype/src/autofit/autofit.c new file mode 100644 index 000000000..8bd609b5e --- /dev/null +++ b/external/freetype/src/autofit/autofit.c @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * autofit.c + * + * Auto-fitter module (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ft-hb.c" +#include "afblue.c" +#include "afcjk.c" +#include "afdummy.c" +#include "afglobal.c" +#include "afhints.c" +#include "afindic.c" +#include "aflatin.c" +#include "afloader.c" +#include "afmodule.c" +#include "afranges.c" +#include "afshaper.c" + + +/* END */ diff --git a/external/freetype/src/autofit/ft-hb.c b/external/freetype/src/autofit/ft-hb.c new file mode 100644 index 000000000..71aee0455 --- /dev/null +++ b/external/freetype/src/autofit/ft-hb.c @@ -0,0 +1,115 @@ +/* + * Copyright © 2009, 2023 Red Hat, Inc. + * Copyright © 2015 Google, Inc. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod, Matthias Clasen + * Google Author(s): Behdad Esfahbod + */ + +#include <freetype/freetype.h> +#include <freetype/tttables.h> + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + +#include "ft-hb.h" + +/* The following three functions are a more or less verbatim + * copy of corresponding HarfBuzz code from hb-ft.cc + */ + +static hb_blob_t * +hb_ft_reference_table_ (hb_face_t *face, hb_tag_t tag, void *user_data) +{ + FT_Face ft_face = (FT_Face) user_data; + FT_Byte *buffer; + FT_ULong length = 0; + FT_Error error; + + FT_UNUSED (face); + + /* Note: FreeType like HarfBuzz uses the NONE tag for fetching the entire blob */ + + error = FT_Load_Sfnt_Table (ft_face, tag, 0, NULL, &length); + if (error) + return NULL; + + buffer = (FT_Byte *) ft_smalloc (length); + if (!buffer) + return NULL; + + error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length); + if (error) + { + free (buffer); + return NULL; + } + + return hb_blob_create ((const char *) buffer, length, + HB_MEMORY_MODE_WRITABLE, + buffer, ft_sfree); +} + +static hb_face_t * +hb_ft_face_create_ (FT_Face ft_face, + hb_destroy_func_t destroy) +{ + hb_face_t *face; + + if (!ft_face->stream->read) { + hb_blob_t *blob; + + blob = hb_blob_create ((const char *) ft_face->stream->base, + (unsigned int) ft_face->stream->size, + HB_MEMORY_MODE_READONLY, + ft_face, destroy); + face = hb_face_create (blob, ft_face->face_index); + hb_blob_destroy (blob); + } else { + face = hb_face_create_for_tables (hb_ft_reference_table_, ft_face, destroy); + } + + hb_face_set_index (face, ft_face->face_index); + hb_face_set_upem (face, ft_face->units_per_EM); + + return face; +} + +FT_LOCAL_DEF(hb_font_t *) +hb_ft_font_create_ (FT_Face ft_face, + hb_destroy_func_t destroy) +{ + hb_font_t *font; + hb_face_t *face; + + face = hb_ft_face_create_ (ft_face, destroy); + font = hb_font_create (face); + hb_face_destroy (face); + return font; +} + +#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ + +/* ANSI C doesn't like empty source files */ +typedef int ft_hb_dummy_; + +#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ + +/* END */ diff --git a/external/freetype/src/autofit/ft-hb.h b/external/freetype/src/autofit/ft-hb.h new file mode 100644 index 000000000..92a5774bc --- /dev/null +++ b/external/freetype/src/autofit/ft-hb.h @@ -0,0 +1,48 @@ +/* + * Copyright © 2009, 2023 Red Hat, Inc. + * Copyright © 2015 Google, Inc. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod, Matthias Clasen + * Google Author(s): Behdad Esfahbod + */ + +#ifndef FT_HB_H +#define FT_HB_H + +#include <hb.h> + +#include <freetype/internal/compiler-macros.h> +#include <freetype/freetype.h> + + +FT_BEGIN_HEADER + +FT_LOCAL(hb_font_t *) +hb_ft_font_create_ (FT_Face ft_face, + hb_destroy_func_t destroy); + + +FT_END_HEADER + +#endif /* FT_HB_H */ + + +/* END */ diff --git a/external/freetype/src/autofit/module.mk b/external/freetype/src/autofit/module.mk new file mode 100644 index 000000000..95cb20ad2 --- /dev/null +++ b/external/freetype/src/autofit/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 auto-fitter module definition +# + + +# Copyright (C) 2003-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += AUTOFIT_MODULE + +define AUTOFIT_MODULE +$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)autofit $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/autofit/rules.mk b/external/freetype/src/autofit/rules.mk new file mode 100644 index 000000000..a46ba3f0f --- /dev/null +++ b/external/freetype/src/autofit/rules.mk @@ -0,0 +1,88 @@ +# +# FreeType 2 auto-fitter module configuration rules +# + + +# Copyright (C) 2003-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# AUTOF driver directory +# +AUTOF_DIR := $(SRC_DIR)/autofit + + +# compilation flags for the driver +# +AUTOF_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# AUTOF driver sources (i.e., C files) +# +AUTOF_DRV_SRC := $(AUTOF_DIR)/afblue.c \ + $(AUTOF_DIR)/afcjk.c \ + $(AUTOF_DIR)/afdummy.c \ + $(AUTOF_DIR)/afglobal.c \ + $(AUTOF_DIR)/afhints.c \ + $(AUTOF_DIR)/afindic.c \ + $(AUTOF_DIR)/aflatin.c \ + $(AUTOF_DIR)/afloader.c \ + $(AUTOF_DIR)/afmodule.c \ + $(AUTOF_DIR)/afranges.c \ + $(AUTOF_DIR)/afshaper.c \ + $(AUTOF_DIR)/ft-hb.c + +# AUTOF driver headers +# +AUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h) \ + $(AUTOF_DIR)/afcover.h \ + $(AUTOF_DIR)/aferrors.h \ + $(AUTOF_DIR)/afscript.h \ + $(AUTOF_DIR)/afstyles.h \ + $(AUTOF_DIR)/aftypes.h \ + $(AUTOF_DIR)/afws-decl.h \ + $(AUTOF_DIR)/afws-iter.h + + +# AUTOF driver object(s) +# +# AUTOF_DRV_OBJ_M is used during `multi' builds. +# AUTOF_DRV_OBJ_S is used during `single' builds. +# +AUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O) +AUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O + +# AUTOF driver source file for single build +# +AUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c + + +# AUTOF driver - single object +# +$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \ + $(FREETYPE_H) $(AUTOF_DRV_H) + $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S)) + + +# AUTOF driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H) + $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(AUTOF_DRV_OBJ_S) +DRV_OBJS_M += $(AUTOF_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/base/ftadvanc.c b/external/freetype/src/base/ftadvanc.c new file mode 100644 index 000000000..de25476fe --- /dev/null +++ b/external/freetype/src/base/ftadvanc.c @@ -0,0 +1,174 @@ +/**************************************************************************** + * + * ftadvanc.c + * + * Quick computation of advance widths (body). + * + * Copyright (C) 2008-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftadvanc.h> +#include <freetype/internal/ftobjs.h> + + + static FT_Error + ft_face_scale_advances_( FT_Face face, + FT_Fixed* advances, + FT_UInt count, + FT_Int32 flags ) + { + FT_Fixed scale; + FT_UInt nn; + + + if ( flags & FT_LOAD_NO_SCALE ) + return FT_Err_Ok; + + if ( !face->size ) + return FT_THROW( Invalid_Size_Handle ); + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + scale = face->size->metrics.y_scale; + else + scale = face->size->metrics.x_scale; + + /* this must be the same scaling as to get linear{Hori,Vert}Advance */ + /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ + + for ( nn = 0; nn < count; nn++ ) + advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); + + return FT_Err_Ok; + } + + + /* at the moment, we can perform fast advance retrieval only in */ + /* the following cases: */ + /* */ + /* - unscaled load */ + /* - unhinted load */ + /* - light-hinted load */ + /* - if a variations font, it must have an `HVAR' or `VVAR' */ + /* table (thus the old MM or GX fonts don't qualify; this */ + /* gets checked by the driver-specific functions) */ + +#define LOAD_ADVANCE_FAST_CHECK( face, flags ) \ + ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ + FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 flags, + FT_Fixed *padvance ) + { + FT_Face_GetAdvancesFunc func; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !padvance ) + return FT_THROW( Invalid_Argument ); + + if ( gindex >= (FT_UInt)face->num_glyphs ) + return FT_THROW( Invalid_Glyph_Index ); + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) ) + { + FT_Error error; + + + error = func( face, gindex, 1, flags, padvance ); + if ( !error ) + return ft_face_scale_advances_( face, padvance, 1, flags ); + + if ( FT_ERR_NEQ( error, Unimplemented_Feature ) ) + return error; + } + + return FT_Get_Advances( face, gindex, 1, flags, padvance ); + } + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *padvances ) + { + FT_Error error = FT_Err_Ok; + + FT_Face_GetAdvancesFunc func; + + FT_UInt num, end, nn; + FT_Int factor; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !padvances ) + return FT_THROW( Invalid_Argument ); + + num = (FT_UInt)face->num_glyphs; + end = start + count; + if ( start >= num || end < start || end > num ) + return FT_THROW( Invalid_Glyph_Index ); + + if ( count == 0 ) + return FT_Err_Ok; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) ) + { + error = func( face, start, count, flags, padvances ); + if ( !error ) + return ft_face_scale_advances_( face, padvances, count, flags ); + + if ( FT_ERR_NEQ( error, Unimplemented_Feature ) ) + return error; + } + + error = FT_Err_Ok; + + if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) + return FT_THROW( Unimplemented_Feature ); + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024; + for ( nn = 0; nn < count; nn++ ) + { + error = FT_Load_Glyph( face, start + nn, flags ); + if ( error ) + break; + + /* scale from 26.6 to 16.16, unless NO_SCALE was requested */ + padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? face->glyph->advance.y * factor + : face->glyph->advance.x * factor; + } + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftbase.c b/external/freetype/src/base/ftbase.c new file mode 100644 index 000000000..156510f00 --- /dev/null +++ b/external/freetype/src/base/ftbase.c @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * ftbase.c + * + * Single object library component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftadvanc.c" +#include "ftcalc.c" +#include "ftcolor.c" +#include "ftdbgmem.c" +#include "fterrors.c" +#include "ftfntfmt.c" +#include "ftgloadr.c" +#include "fthash.c" +#include "ftlcdfil.c" +#include "ftmac.c" +#include "ftobjs.c" +#include "ftoutln.c" +#include "ftpsprop.c" +#include "ftrfork.c" +#include "ftsnames.c" +#include "ftstream.c" +#include "fttrigon.c" +#include "ftutil.c" + + +/* END */ diff --git a/external/freetype/src/base/ftbase.h b/external/freetype/src/base/ftbase.h new file mode 100644 index 000000000..00790d3b2 --- /dev/null +++ b/external/freetype/src/base/ftbase.h @@ -0,0 +1,82 @@ +/**************************************************************************** + * + * ftbase.h + * + * Private functions used in the `base' module (specification). + * + * Copyright (C) 2008-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTBASE_H_ +#define FTBASE_H_ + + +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + + + FT_DECLARE_GLYPH( ft_bitmap_glyph_class ) + FT_DECLARE_GLYPH( ft_outline_glyph_class ) + FT_DECLARE_GLYPH( ft_svg_glyph_class ) + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* MacOS resource fork cannot exceed 16MB at least for Carbon code; */ + /* see https://support.microsoft.com/en-us/kb/130437 */ +#define FT_MAC_RFORK_MAX_LEN 0x00FFFFFFUL + + + /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ + /* font, and try to load a face specified by the face_index. */ + FT_LOCAL( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ); + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From ftmac.c. */ + FT_LOCAL( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ); + + +#if defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \ + !defined( FT_MACINTOSH ) + /* Mac OS X/Darwin kernel often changes recommended method to access */ + /* the resource fork and older methods makes the kernel issue the */ + /* warning of deprecated method. To calm it down, the methods based */ + /* on Darwin VFS should be grouped and skip the rest methods after */ + /* the case the resource is opened but found to lack a font in it. */ + FT_LOCAL( FT_Bool ) + ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt rule_index ); +#endif + +#endif /* FT_CONFIG_OPTION_MAC_FONTS */ + + +FT_END_HEADER + +#endif /* FTBASE_H_ */ + + +/* END */ diff --git a/external/freetype/src/base/ftbbox.c b/external/freetype/src/base/ftbbox.c new file mode 100644 index 000000000..385fea404 --- /dev/null +++ b/external/freetype/src/base/ftbbox.c @@ -0,0 +1,542 @@ +/**************************************************************************** + * + * ftbbox.c + * + * FreeType bbox computation (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used + * modified and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component has a _single_ role: to compute exact outline bounding + * boxes. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftbbox.h> +#include <freetype/ftimage.h> +#include <freetype/ftoutln.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftobjs.h> + + + typedef struct TBBox_Rec_ + { + FT_Vector last; + FT_BBox bbox; + + } TBBox_Rec; + + +#define FT_UPDATE_BBOX( p, bbox ) \ + FT_BEGIN_STMNT \ + if ( p->x < bbox.xMin ) \ + bbox.xMin = p->x; \ + if ( p->x > bbox.xMax ) \ + bbox.xMax = p->x; \ + if ( p->y < bbox.yMin ) \ + bbox.yMin = p->y; \ + if ( p->y > bbox.yMax ) \ + bbox.yMax = p->y; \ + FT_END_STMNT + +#define CHECK_X( p, bbox ) \ + ( p->x < bbox.xMin || p->x > bbox.xMax ) + +#define CHECK_Y( p, bbox ) \ + ( p->y < bbox.yMin || p->y > bbox.yMax ) + + + /************************************************************************** + * + * @Function: + * BBox_Move_To + * + * @Description: + * This function is used as a `move_to' emitter during + * FT_Outline_Decompose(). It simply records the destination point + * in `user->last'. We also update bbox in case contour starts with + * an implicit `on' point. + * + * @Input: + * to :: + * A pointer to the destination vector. + * + * @InOut: + * user :: + * A pointer to the current walk context. + * + * @Return: + * Always 0. Needed for the interface only. + */ + FT_CALLBACK_DEF( int ) + BBox_Move_To( const FT_Vector* to, + void* user_ ) + { + TBBox_Rec* user = (TBBox_Rec*)user_; + + + FT_UPDATE_BBOX( to, user->bbox ); + + user->last = *to; + + return 0; + } + + + /************************************************************************** + * + * @Function: + * BBox_Line_To + * + * @Description: + * This function is used as a `line_to' emitter during + * FT_Outline_Decompose(). It simply records the destination point + * in `user->last'; no further computations are necessary because + * bbox already contains both explicit ends of the line segment. + * + * @Input: + * to :: + * A pointer to the destination vector. + * + * @InOut: + * user :: + * A pointer to the current walk context. + * + * @Return: + * Always 0. Needed for the interface only. + */ + FT_CALLBACK_DEF( int ) + BBox_Line_To( const FT_Vector* to, + void* user_ ) + { + TBBox_Rec* user = (TBBox_Rec*)user_; + + + user->last = *to; + + return 0; + } + + + /************************************************************************** + * + * @Function: + * BBox_Conic_Check + * + * @Description: + * Find the extrema of a 1-dimensional conic Bezier curve and update + * a bounding range. This version uses direct computation, as it + * doesn't need square roots. + * + * @Input: + * y1 :: + * The start coordinate. + * + * y2 :: + * The coordinate of the control point. + * + * y3 :: + * The end coordinate. + * + * @InOut: + * min :: + * The address of the current minimum. + * + * max :: + * The address of the current maximum. + */ + static void + BBox_Conic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos* min, + FT_Pos* max ) + { + /* This function is only called when a control off-point is outside */ + /* the bbox that contains all on-points. It finds a local extremum */ + /* within the segment, equal to (y1*y3 - y2*y2)/(y1 - 2*y2 + y3). */ + /* Or, offsetting from y2, we get */ + + y1 -= y2; + y3 -= y2; + y2 += FT_MulDiv( y1, y3, y1 + y3 ); + + if ( y2 < *min ) + *min = y2; + if ( y2 > *max ) + *max = y2; + } + + + /************************************************************************** + * + * @Function: + * BBox_Conic_To + * + * @Description: + * This function is used as a `conic_to' emitter during + * FT_Outline_Decompose(). It checks a conic Bezier curve with the + * current bounding box, and computes its extrema if necessary to + * update it. + * + * @Input: + * control :: + * A pointer to a control point. + * + * to :: + * A pointer to the destination vector. + * + * @InOut: + * user :: + * The address of the current walk context. + * + * @Return: + * Always 0. Needed for the interface only. + * + * @Note: + * In the case of a non-monotonous arc, we compute directly the + * extremum coordinates, as it is sufficiently fast. + */ + FT_CALLBACK_DEF( int ) + BBox_Conic_To( const FT_Vector* control, + const FT_Vector* to, + void* user_ ) + { + TBBox_Rec* user = (TBBox_Rec*)user_; + + + /* in case `to' is implicit and not included in bbox yet */ + FT_UPDATE_BBOX( to, user->bbox ); + + if ( CHECK_X( control, user->bbox ) ) + BBox_Conic_Check( user->last.x, + control->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control, user->bbox ) ) + BBox_Conic_Check( user->last.y, + control->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + /************************************************************************** + * + * @Function: + * BBox_Cubic_Check + * + * @Description: + * Find the extrema of a 1-dimensional cubic Bezier curve and + * update a bounding range. This version uses iterative splitting + * because it is faster than the exact solution with square roots. + * + * @Input: + * p1 :: + * The start coordinate. + * + * p2 :: + * The coordinate of the first control point. + * + * p3 :: + * The coordinate of the second control point. + * + * p4 :: + * The end coordinate. + * + * @InOut: + * min :: + * The address of the current minimum. + * + * max :: + * The address of the current maximum. + */ + static FT_Pos + cubic_peak( FT_Pos q1, + FT_Pos q2, + FT_Pos q3, + FT_Pos q4 ) + { + FT_Pos peak = 0; + FT_Int shift; + + + /* This function finds a peak of a cubic segment if it is above 0 */ + /* using iterative bisection of the segment, or returns 0. */ + /* The fixed-point arithmetic of bisection is inherently stable */ + /* but may loose accuracy in the two lowest bits. To compensate, */ + /* we upscale the segment if there is room. Large values may need */ + /* to be downscaled to avoid overflows during bisection. */ + /* It is called with either q2 or q3 positive, which is necessary */ + /* for the peak to exist and avoids undefined FT_MSB. */ + + shift = 27 - FT_MSB( (FT_UInt32)( FT_ABS( q1 ) | + FT_ABS( q2 ) | + FT_ABS( q3 ) | + FT_ABS( q4 ) ) ); + + if ( shift > 0 ) + { + /* upscaling too much just wastes time */ + if ( shift > 2 ) + shift = 2; + + q1 *= 1 << shift; + q2 *= 1 << shift; + q3 *= 1 << shift; + q4 *= 1 << shift; + } + else + { + q1 >>= -shift; + q2 >>= -shift; + q3 >>= -shift; + q4 >>= -shift; + } + + /* for a peak to exist above 0, the cubic segment must have */ + /* at least one of its control off-points above 0. */ + while ( q2 > 0 || q3 > 0 ) + { + /* determine which half contains the maximum and split */ + if ( q1 + q2 > q3 + q4 ) /* first half */ + { + q4 = q4 + q3; + q3 = q3 + q2; + q2 = q2 + q1; + q4 = q4 + q3; + q3 = q3 + q2; + q4 = ( q4 + q3 ) >> 3; + q3 = q3 >> 2; + q2 = q2 >> 1; + } + else /* second half */ + { + q1 = q1 + q2; + q2 = q2 + q3; + q3 = q3 + q4; + q1 = q1 + q2; + q2 = q2 + q3; + q1 = ( q1 + q2 ) >> 3; + q2 = q2 >> 2; + q3 = q3 >> 1; + } + + /* check whether either end reached the maximum */ + if ( q1 == q2 && q1 >= q3 ) + { + peak = q1; + break; + } + if ( q3 == q4 && q2 <= q4 ) + { + peak = q4; + break; + } + } + + if ( shift > 0 ) + peak >>= shift; + else + peak <<= -shift; + + return peak; + } + + + static void + BBox_Cubic_Check( FT_Pos p1, + FT_Pos p2, + FT_Pos p3, + FT_Pos p4, + FT_Pos* min, + FT_Pos* max ) + { + /* This function is only called when a control off-point is outside */ + /* the bbox that contains all on-points. So at least one of the */ + /* conditions below holds and cubic_peak is called with at least one */ + /* non-zero argument. */ + + if ( p2 > *max || p3 > *max ) + *max += cubic_peak( p1 - *max, p2 - *max, p3 - *max, p4 - *max ); + + /* now flip the signs to update the minimum */ + if ( p2 < *min || p3 < *min ) + *min -= cubic_peak( *min - p1, *min - p2, *min - p3, *min - p4 ); + } + + + /************************************************************************** + * + * @Function: + * BBox_Cubic_To + * + * @Description: + * This function is used as a `cubic_to' emitter during + * FT_Outline_Decompose(). It checks a cubic Bezier curve with the + * current bounding box, and computes its extrema if necessary to + * update it. + * + * @Input: + * control1 :: + * A pointer to the first control point. + * + * control2 :: + * A pointer to the second control point. + * + * to :: + * A pointer to the destination vector. + * + * @InOut: + * user :: + * The address of the current walk context. + * + * @Return: + * Always 0. Needed for the interface only. + * + * @Note: + * In the case of a non-monotonous arc, we don't compute directly + * extremum coordinates, we subdivide instead. + */ + FT_CALLBACK_DEF( int ) + BBox_Cubic_To( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user_ ) + { + TBBox_Rec* user = (TBBox_Rec*)user_; + + + /* We don't need to check `to' since it is always an on-point, */ + /* thus within the bbox. Only segments with an off-point outside */ + /* the bbox can possibly reach new extreme values. */ + + if ( CHECK_X( control1, user->bbox ) || + CHECK_X( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.x, + control1->x, + control2->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control1, user->bbox ) || + CHECK_Y( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.y, + control1->y, + control2->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + FT_DEFINE_OUTLINE_FUNCS( + bbox_interface, + + (FT_Outline_MoveTo_Func) BBox_Move_To, /* move_to */ + (FT_Outline_LineTo_Func) BBox_Line_To, /* line_to */ + (FT_Outline_ConicTo_Func)BBox_Conic_To, /* conic_to */ + (FT_Outline_CubicTo_Func)BBox_Cubic_To, /* cubic_to */ + 0, /* shift */ + 0 /* delta */ + ) + + + /* documentation is in ftbbox.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ) + { + FT_BBox cbox = { 0x7FFFFFFFL, 0x7FFFFFFFL, + -0x7FFFFFFFL, -0x7FFFFFFFL }; + FT_BBox bbox = { 0x7FFFFFFFL, 0x7FFFFFFFL, + -0x7FFFFFFFL, -0x7FFFFFFFL }; + FT_Vector* vec; + FT_UShort n; + + + if ( !abbox ) + return FT_THROW( Invalid_Argument ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + /* if outline is empty, return (0,0,0,0) */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + { + abbox->xMin = abbox->xMax = 0; + abbox->yMin = abbox->yMax = 0; + + return 0; + } + + /* We compute the control box as well as the bounding box of */ + /* all `on' points in the outline. Then, if the two boxes */ + /* coincide, we exit immediately. */ + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + FT_UPDATE_BBOX( vec, cbox ); + + if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) + FT_UPDATE_BBOX( vec, bbox ); + + vec++; + } + + /* test two boxes for equality */ + if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || + cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) + { + /* the two boxes are different, now walk over the outline to */ + /* get the Bezier arc extrema. */ + + FT_Error error; + TBBox_Rec user; + + + user.bbox = bbox; + + error = FT_Outline_Decompose( outline, &bbox_interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/external/freetype/src/base/ftbdf.c b/external/freetype/src/base/ftbdf.c new file mode 100644 index 000000000..f697c00fe --- /dev/null +++ b/external/freetype/src/base/ftbdf.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * ftbdf.c + * + * FreeType API for accessing BDF-specific strings (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svbdf.h> + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + FT_Error error; + const char* encoding = NULL; + const char* registry = NULL; + + FT_Service_BDF service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_charset_id ) + error = service->get_charset_id( face, &encoding, &registry ); + else + error = FT_THROW( Invalid_Argument ); + + if ( acharset_encoding ) + *acharset_encoding = encoding; + + if ( acharset_registry ) + *acharset_registry = registry; + + return error; + } + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + FT_Error error; + + FT_Service_BDF service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !aproperty ) + return FT_THROW( Invalid_Argument ); + + aproperty->type = BDF_PROPERTY_TYPE_NONE; + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_property ) + error = service->get_property( face, prop_name, aproperty ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftbitmap.c b/external/freetype/src/base/ftbitmap.c new file mode 100644 index 000000000..1c93648dc --- /dev/null +++ b/external/freetype/src/base/ftbitmap.c @@ -0,0 +1,1144 @@ +/**************************************************************************** + * + * ftbitmap.c + * + * FreeType utility functions for bitmaps (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftbitmap.h> +#include <freetype/ftimage.h> +#include <freetype/internal/ftobjs.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT bitmap + + + static + const FT_Bitmap null_bitmap = { 0, 0, 0, NULL, 0, 0, 0, NULL }; + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_Init( FT_Bitmap *abitmap ) + { + if ( abitmap ) + *abitmap = null_bitmap; + } + + + /* deprecated function name; retained for ABI compatibility */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ) + { + if ( abitmap ) + *abitmap = null_bitmap; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target) + { + FT_Memory memory; + FT_Error error = FT_Err_Ok; + FT_Int pitch; + FT_Int flip; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !source || !target ) + return FT_THROW( Invalid_Argument ); + + if ( source == target ) + return FT_Err_Ok; + + flip = ( source->pitch < 0 && target->pitch > 0 ) || + ( source->pitch > 0 && target->pitch < 0 ); + + memory = library->memory; + FT_FREE( target->buffer ); + + *target = *source; + + if ( flip ) + target->pitch = -target->pitch; + + if ( !source->buffer ) + return FT_Err_Ok; + + pitch = source->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + FT_MEM_QALLOC_MULT( target->buffer, target->rows, pitch ); + + if ( !error ) + { + if ( flip ) + { + /* take care of bitmap flow */ + FT_UInt i; + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + + + t += (FT_ULong)pitch * ( target->rows - 1 ); + + for ( i = target->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, pitch ); + + s += pitch; + t -= pitch; + } + } + else + FT_MEM_COPY( target->buffer, source->buffer, + (FT_Long)source->rows * pitch ); + } + + return error; + } + + + /* Enlarge `bitmap' horizontally and vertically by `xpixels' */ + /* and `ypixels', respectively. */ + + static FT_Error + ft_bitmap_assure_buffer( FT_Memory memory, + FT_Bitmap* bitmap, + FT_UInt xpixels, + FT_UInt ypixels ) + { + FT_Error error; + unsigned int pitch; + unsigned int new_pitch; + FT_UInt bpp; + FT_UInt width, height; + unsigned char* buffer = NULL; + + + width = bitmap->width; + height = bitmap->rows; + pitch = (unsigned int)FT_ABS( bitmap->pitch ); + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + bpp = 1; + new_pitch = ( width + xpixels + 7 ) >> 3; + break; + case FT_PIXEL_MODE_GRAY2: + bpp = 2; + new_pitch = ( width + xpixels + 3 ) >> 2; + break; + case FT_PIXEL_MODE_GRAY4: + bpp = 4; + new_pitch = ( width + xpixels + 1 ) >> 1; + break; + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + bpp = 8; + new_pitch = width + xpixels; + break; + default: + return FT_THROW( Invalid_Glyph_Format ); + } + + /* if no need to allocate memory */ + if ( ypixels == 0 && new_pitch <= pitch ) + { + /* zero the padding */ + FT_UInt bit_width = pitch * 8; + FT_UInt bit_last = ( width + xpixels ) * bpp; + + + if ( bit_last < bit_width ) + { + FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); + FT_Byte* end = bitmap->buffer + pitch; + FT_UInt shift = bit_last & 7; + FT_UInt mask = 0xFF00U >> shift; + FT_UInt count = height; + + + for ( ; count > 0; count--, line += pitch, end += pitch ) + { + FT_Byte* write = line; + + + if ( shift > 0 ) + { + write[0] = (FT_Byte)( write[0] & mask ); + write++; + } + if ( write < end ) + FT_MEM_ZERO( write, end - write ); + } + } + + return FT_Err_Ok; + } + + /* otherwise allocate new buffer */ + if ( FT_QALLOC_MULT( buffer, bitmap->rows + ypixels, new_pitch ) ) + return error; + + /* new rows get added at the top of the bitmap, */ + /* thus take care of the flow direction */ + if ( bitmap->pitch > 0 ) + { + FT_UInt len = ( width * bpp + 7 ) >> 3; + + unsigned char* in = bitmap->buffer; + unsigned char* out = buffer; + + unsigned char* limit = bitmap->buffer + pitch * bitmap->rows; + unsigned int delta = new_pitch - len; + + + FT_MEM_ZERO( out, new_pitch * ypixels ); + out += new_pitch * ypixels; + + while ( in < limit ) + { + FT_MEM_COPY( out, in, len ); + in += pitch; + out += len; + + /* we use FT_QALLOC_MULT, which doesn't zero out the buffer; */ + /* consequently, we have to manually zero out the remaining bytes */ + FT_MEM_ZERO( out, delta ); + out += delta; + } + } + else + { + FT_UInt len = ( width * bpp + 7 ) >> 3; + + unsigned char* in = bitmap->buffer; + unsigned char* out = buffer; + + unsigned char* limit = bitmap->buffer + pitch * bitmap->rows; + unsigned int delta = new_pitch - len; + + + while ( in < limit ) + { + FT_MEM_COPY( out, in, len ); + in += pitch; + out += len; + + FT_MEM_ZERO( out, delta ); + out += delta; + } + + FT_MEM_ZERO( out, new_pitch * ypixels ); + } + + FT_FREE( bitmap->buffer ); + bitmap->buffer = buffer; + + /* set pitch only, width and height are left untouched */ + if ( bitmap->pitch < 0 ) + bitmap->pitch = -(int)new_pitch; + else + bitmap->pitch = (int)new_pitch; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ) + { + FT_Error error; + unsigned char* p; + FT_Int i, x, pitch; + FT_UInt y; + FT_Int xstr, ystr; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !bitmap || !bitmap->buffer ) + return FT_THROW( Invalid_Argument ); + + if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || + ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) + return FT_THROW( Invalid_Argument ); + + xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; + ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; + + if ( xstr == 0 && ystr == 0 ) + return FT_Err_Ok; + else if ( xstr < 0 || ystr < 0 ) + return FT_THROW( Invalid_Argument ); + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + { + FT_Bitmap tmp; + + + /* convert to 8bpp */ + FT_Bitmap_Init( &tmp ); + error = FT_Bitmap_Convert( library, bitmap, &tmp, 1 ); + if ( error ) + return error; + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + } + break; + + case FT_PIXEL_MODE_MONO: + if ( xstr > 8 ) + xstr = 8; + break; + + case FT_PIXEL_MODE_LCD: + xstr *= 3; + break; + + case FT_PIXEL_MODE_LCD_V: + ystr *= 3; + break; + + case FT_PIXEL_MODE_BGRA: + /* We don't embolden color glyphs. */ + return FT_Err_Ok; + } + + error = ft_bitmap_assure_buffer( library->memory, bitmap, + (FT_UInt)xstr, (FT_UInt)ystr ); + if ( error ) + return error; + + /* take care of bitmap flow */ + pitch = bitmap->pitch; + if ( pitch > 0 ) + p = bitmap->buffer + pitch * ystr; + else + { + pitch = -pitch; + p = bitmap->buffer + (FT_UInt)pitch * ( bitmap->rows - 1 ); + } + + /* for each row */ + for ( y = 0; y < bitmap->rows; y++ ) + { + /* + * Horizontally: + * + * From the last pixel on, make each pixel or'ed with the + * `xstr' pixels before it. + */ + for ( x = pitch - 1; x >= 0; x-- ) + { + unsigned char tmp; + + + tmp = p[x]; + for ( i = 1; i <= xstr; i++ ) + { + if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) + { + p[x] |= tmp >> i; + + /* the maximum value of 8 for `xstr' comes from here */ + if ( x > 0 ) + p[x] |= p[x - 1] << ( 8 - i ); + +#if 0 + if ( p[x] == 0xFF ) + break; +#endif + } + else + { + if ( x - i >= 0 ) + { + if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) + { + p[x] = (unsigned char)( bitmap->num_grays - 1 ); + break; + } + else + { + p[x] = (unsigned char)( p[x] + p[x - i] ); + if ( p[x] == bitmap->num_grays - 1 ) + break; + } + } + else + break; + } + } + } + + /* + * Vertically: + * + * Make the above `ystr' rows or'ed with it. + */ + for ( x = 1; x <= ystr; x++ ) + { + unsigned char* q; + + + q = p - bitmap->pitch * x; + for ( i = 0; i < pitch; i++ ) + q[i] |= p[i]; + } + + p += bitmap->pitch; + } + + bitmap->width += (FT_UInt)xstr; + bitmap->rows += (FT_UInt)ystr; + + return FT_Err_Ok; + } + + + static FT_Byte + ft_gray_for_premultiplied_srgb_bgra( const FT_Byte* bgra ) + { + FT_UInt a = bgra[3]; + FT_UInt l; + + + /* Short-circuit transparent color to avoid division by zero. */ + if ( !a ) + return 0; + + /* + * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722 + * coefficients for RGB channels *on the linear colors*. + * A gamma of 2.2 is fair to assume. And then, we need to + * undo the premultiplication too. + * + * http://www.brucelindbloom.com/index.html?WorkingSpaceInfo.html#SideNotes + * + * We do the computation with integers only, applying a gamma of 2.0. + * We guarantee 32-bit arithmetic to avoid overflow but the resulting + * luminosity fits into 16 bits. + * + */ + + l = ( 4731UL /* 0.072186 * 65536 */ * bgra[0] * bgra[0] + + 46868UL /* 0.715158 * 65536 */ * bgra[1] * bgra[1] + + 13937UL /* 0.212656 * 65536 */ * bgra[2] * bgra[2] ) >> 16; + + /* + * Final transparency can be determined as follows. + * + * - If alpha is zero, we want 0. + * - If alpha is zero and luminosity is zero, we want 255. + * - If alpha is zero and luminosity is one, we want 0. + * + * So the formula is a * (1 - l) = a - l * a. + * + * We still need to undo premultiplication by dividing l by a*a. + * + */ + + return (FT_Byte)( a - l / a ); + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + FT_Byte* s; + FT_Byte* t; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !source || !target ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + case FT_PIXEL_MODE_BGRA: + { + FT_Int width = (FT_Int)source->width; + FT_Int neg = ( target->pitch == 0 && source->pitch < 0 ) || + target->pitch < 0; + + + FT_Bitmap_Done( library, target ); + + target->pixel_mode = FT_PIXEL_MODE_GRAY; + target->rows = source->rows; + target->width = source->width; + + if ( alignment ) + { + FT_Int rem = width % alignment; + + + if ( rem ) + width = alignment > 0 ? width - rem + alignment + : width - rem - alignment; + } + + if ( FT_QALLOC_MULT( target->buffer, target->rows, width ) ) + return error; + + target->pitch = neg ? -width : width; + } + break; + + default: + error = FT_THROW( Invalid_Argument ); + } + + s = source->buffer; + t = target->buffer; + + /* take care of bitmap flow */ + if ( source->pitch < 0 ) + s -= source->pitch * (FT_Int)( source->rows - 1 ); + if ( target->pitch < 0 ) + t -= target->pitch * (FT_Int)( target->rows - 1 ); + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + { + FT_UInt i; + + + target->num_grays = 2; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + /* get the full bytes */ + for ( j = source->width >> 3; j > 0; j-- ) + { + FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + + + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); + tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); + tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); + tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); + tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); + tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); + tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); + tt[7] = (FT_Byte)( val & 0x01 ); + + tt += 8; + ss += 1; + } + + /* get remaining pixels (if any) */ + j = source->width & 7; + if ( j > 0 ) + { + FT_Int val = *ss; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + val <<= 1; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_UInt width = source->width; + FT_UInt i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, width ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY2: + { + FT_UInt i; + + + target->num_grays = 4; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + /* get the full bytes */ + for ( j = source->width >> 2; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); + tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); + tt[3] = (FT_Byte)( ( val & 0x03 ) ); + + ss += 1; + tt += 4; + } + + j = source->width & 3; + if ( j > 0 ) + { + FT_Int val = ss[0]; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + val <<= 2; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY4: + { + FT_UInt i; + + + target->num_grays = 16; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + /* get the full bytes */ + for ( j = source->width >> 1; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); + tt[1] = (FT_Byte)( ( val & 0x0F ) ); + + ss += 1; + tt += 2; + } + + if ( source->width & 1 ) + tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_BGRA: + { + FT_UInt i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + for ( j = source->width; j > 0; j-- ) + { + tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss ); + + ss += 4; + tt += 1; + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + default: + ; + } + + return error; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Blend( FT_Library library, + const FT_Bitmap* source_, + const FT_Vector source_offset_, + FT_Bitmap* target, + FT_Vector *atarget_offset, + FT_Color color ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + FT_Bitmap source_bitmap; + const FT_Bitmap* source; + + FT_Vector source_offset; + FT_Vector target_offset; + + FT_Bool free_source_bitmap = 0; + FT_Bool free_target_bitmap_on_error = 0; + + FT_Pos source_llx, source_lly, source_urx, source_ury; + FT_Pos target_llx, target_lly, target_urx, target_ury; + FT_Pos final_llx, final_lly, final_urx, final_ury; + + unsigned int final_rows, final_width; + long x, y; + + + if ( !library || !target || !source_ || !atarget_offset ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + if ( !( target->pixel_mode == FT_PIXEL_MODE_NONE || + ( target->pixel_mode == FT_PIXEL_MODE_BGRA && + target->buffer ) ) ) + return FT_THROW( Invalid_Argument ); + + if ( source_->pixel_mode == FT_PIXEL_MODE_NONE ) + return FT_Err_Ok; /* nothing to do */ + + /* pitches must have the same sign */ + if ( target->pixel_mode == FT_PIXEL_MODE_BGRA && + ( source_->pitch ^ target->pitch ) < 0 ) + return FT_THROW( Invalid_Argument ); + + if ( !( source_->width && source_->rows ) ) + return FT_Err_Ok; /* nothing to do */ + + /* assure integer pixel offsets */ + source_offset.x = FT_PIX_FLOOR( source_offset_.x ); + source_offset.y = FT_PIX_FLOOR( source_offset_.y ); + target_offset.x = FT_PIX_FLOOR( atarget_offset->x ); + target_offset.y = FT_PIX_FLOOR( atarget_offset->y ); + + /* get source bitmap dimensions */ + source_llx = source_offset.x; + if ( FT_LONG_MIN + (FT_Pos)( source_->rows << 6 ) + 64 > source_offset.y ) + { + FT_TRACE5(( + "FT_Bitmap_Blend: y coordinate overflow in source bitmap\n" )); + return FT_THROW( Invalid_Argument ); + } + source_lly = source_offset.y - ( source_->rows << 6 ); + + if ( FT_LONG_MAX - (FT_Pos)( source_->width << 6 ) - 64 < source_llx ) + { + FT_TRACE5(( + "FT_Bitmap_Blend: x coordinate overflow in source bitmap\n" )); + return FT_THROW( Invalid_Argument ); + } + source_urx = source_llx + ( source_->width << 6 ); + source_ury = source_offset.y; + + /* get target bitmap dimensions */ + if ( target->width && target->rows ) + { + target_llx = target_offset.x; + if ( FT_LONG_MIN + (FT_Pos)( target->rows << 6 ) > target_offset.y ) + { + FT_TRACE5(( + "FT_Bitmap_Blend: y coordinate overflow in target bitmap\n" )); + return FT_THROW( Invalid_Argument ); + } + target_lly = target_offset.y - ( target->rows << 6 ); + + if ( FT_LONG_MAX - (FT_Pos)( target->width << 6 ) < target_llx ) + { + FT_TRACE5(( + "FT_Bitmap_Blend: x coordinate overflow in target bitmap\n" )); + return FT_THROW( Invalid_Argument ); + } + target_urx = target_llx + ( target->width << 6 ); + target_ury = target_offset.y; + } + else + { + target_llx = FT_LONG_MAX; + target_lly = FT_LONG_MAX; + target_urx = FT_LONG_MIN; + target_ury = FT_LONG_MIN; + } + + /* compute final bitmap dimensions */ + final_llx = FT_MIN( source_llx, target_llx ); + final_lly = FT_MIN( source_lly, target_lly ); + final_urx = FT_MAX( source_urx, target_urx ); + final_ury = FT_MAX( source_ury, target_ury ); + + final_width = ( final_urx - final_llx ) >> 6; + final_rows = ( final_ury - final_lly ) >> 6; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( "FT_Bitmap_Blend:\n" )); + FT_TRACE5(( " source bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n", + source_llx / 64, source_lly / 64, + source_urx / 64, source_ury / 64, + source_->width, source_->rows )); + + if ( target->width && target->rows ) + FT_TRACE5(( " target bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n", + target_llx / 64, target_lly / 64, + target_urx / 64, target_ury / 64, + target->width, target->rows )); + else + FT_TRACE5(( " target bitmap: empty\n" )); + + if ( final_width && final_rows ) + FT_TRACE5(( " final bitmap: (%ld, %ld) -- (%ld, %ld); %d x %d\n", + final_llx / 64, final_lly / 64, + final_urx / 64, final_ury / 64, + final_width, final_rows )); + else + FT_TRACE5(( " final bitmap: empty\n" )); +#endif /* FT_DEBUG_LEVEL_TRACE */ + + if ( !( final_width && final_rows ) ) + return FT_Err_Ok; /* nothing to do */ + + /* for blending, set offset vector of final bitmap */ + /* temporarily to (0,0) */ + source_llx -= final_llx; + source_lly -= final_lly; + + if ( target->width && target->rows ) + { + target_llx -= final_llx; + target_lly -= final_lly; + } + + /* set up target bitmap */ + if ( target->pixel_mode == FT_PIXEL_MODE_NONE ) + { + /* create new empty bitmap */ + target->width = final_width; + target->rows = final_rows; + target->pixel_mode = FT_PIXEL_MODE_BGRA; + target->pitch = (int)final_width * 4; + target->num_grays = 256; + + if ( FT_LONG_MAX / target->pitch < (int)target->rows ) + { + FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n", + final_width, final_rows )); + return FT_THROW( Invalid_Argument ); + } + + if ( FT_ALLOC( target->buffer, target->pitch * (int)target->rows ) ) + return error; + + free_target_bitmap_on_error = 1; + } + else if ( target->width != final_width || + target->rows != final_rows ) + { + /* adjust old bitmap to enlarged size */ + int pitch, new_pitch; + + unsigned char* buffer = NULL; + + + pitch = target->pitch; + + if ( pitch < 0 ) + pitch = -pitch; + + new_pitch = (int)final_width * 4; + + if ( FT_LONG_MAX / new_pitch < (int)final_rows ) + { + FT_TRACE5(( "FT_Blend_Bitmap: target bitmap too large (%d x %d)\n", + final_width, final_rows )); + return FT_THROW( Invalid_Argument ); + } + + /* TODO: provide an in-buffer solution for large bitmaps */ + /* to avoid allocation of a new buffer */ + if ( FT_ALLOC( buffer, new_pitch * (int)final_rows ) ) + goto Error; + + /* copy data to new buffer */ + x = target_llx >> 6; + y = target_lly >> 6; + + /* the bitmap flow is from top to bottom, */ + /* but y is measured from bottom to top */ + if ( target->pitch < 0 ) + { + /* XXX */ + } + else + { + unsigned char* p = + target->buffer; + unsigned char* q = + buffer + + ( final_rows - y - target->rows ) * new_pitch + + x * 4; + unsigned char* limit_p = + p + pitch * (int)target->rows; + + + while ( p < limit_p ) + { + FT_MEM_COPY( q, p, pitch ); + + p += pitch; + q += new_pitch; + } + } + + FT_FREE( target->buffer ); + + target->width = final_width; + target->rows = final_rows; + + if ( target->pitch < 0 ) + target->pitch = -new_pitch; + else + target->pitch = new_pitch; + + target->buffer = buffer; + } + + /* adjust source bitmap if necessary */ + if ( source_->pixel_mode != FT_PIXEL_MODE_GRAY ) + { + FT_Bitmap_Init( &source_bitmap ); + error = FT_Bitmap_Convert( library, source_, &source_bitmap, 1 ); + if ( error ) + goto Error; + + source = &source_bitmap; + free_source_bitmap = 1; + } + else + source = source_; + + /* do blending; the code below returns pre-multiplied channels, */ + /* similar to what FreeType gets from `CBDT' tables */ + x = source_llx >> 6; + y = source_lly >> 6; + + /* the bitmap flow is from top to bottom, */ + /* but y is measured from bottom to top */ + if ( target->pitch < 0 ) + { + /* XXX */ + } + else + { + unsigned char* p = + source->buffer; + unsigned char* q = + target->buffer + + ( target->rows - y - source->rows ) * target->pitch + + x * 4; + unsigned char* limit_p = + p + source->pitch * (int)source->rows; + + + while ( p < limit_p ) + { + unsigned char* r = p; + unsigned char* s = q; + unsigned char* limit_r = r + source->width; + + + while ( r < limit_r ) + { + int aa = *r++; + int fa = color.alpha * aa / 255; + + int fb = color.blue * fa / 255; + int fg = color.green * fa / 255; + int fr = color.red * fa / 255; + + int ba2 = 255 - fa; + + int bb = s[0]; + int bg = s[1]; + int br = s[2]; + int ba = s[3]; + + + *s++ = (unsigned char)( bb * ba2 / 255 + fb ); + *s++ = (unsigned char)( bg * ba2 / 255 + fg ); + *s++ = (unsigned char)( br * ba2 / 255 + fr ); + *s++ = (unsigned char)( ba * ba2 / 255 + fa ); + } + + p += source->pitch; + q += target->pitch; + } + } + + atarget_offset->x = final_llx; + atarget_offset->y = final_lly + ( final_rows << 6 ); + + Error: + if ( error && free_target_bitmap_on_error ) + FT_Bitmap_Done( library, target ); + + if ( free_source_bitmap ) + FT_Bitmap_Done( library, &source_bitmap ); + + return error; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) + { + if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && + !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Bitmap bitmap; + FT_Error error; + + + FT_Bitmap_Init( &bitmap ); + error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); + if ( error ) + return error; + + slot->bitmap = bitmap; + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !bitmap ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + FT_FREE( bitmap->buffer ); + *bitmap = null_bitmap; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/external/freetype/src/base/ftcalc.c b/external/freetype/src/base/ftcalc.c new file mode 100644 index 000000000..c5bc7e3b1 --- /dev/null +++ b/external/freetype/src/base/ftcalc.c @@ -0,0 +1,1127 @@ +/**************************************************************************** + * + * ftcalc.c + * + * Arithmetic computations (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * Support for 1-complement arithmetic has been totally dropped in this + * release. You can still write your own code if you need it. + * + */ + + /************************************************************************** + * + * Implementing basic computation routines. + * + * FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), + * and FT_FloorFix() are declared in freetype.h. + * + */ + + +#include <freetype/ftglyph.h> +#include <freetype/fttrigon.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> + + +#ifdef FT_MULFIX_ASSEMBLER +#undef FT_MulFix +#endif + +/* we need to emulate a 64-bit data type if a real one isn't available */ + +#ifndef FT_INT64 + + typedef struct FT_Int64_ + { + FT_UInt32 lo; + FT_UInt32 hi; + + } FT_Int64; + +#endif /* !FT_INT64 */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT calc + + + /* transfer sign, leaving a positive number; */ + /* we need an unsigned value to safely negate INT_MIN (or LONG_MIN) */ +#define FT_MOVE_SIGN( x, x_unsigned, s ) \ + FT_BEGIN_STMNT \ + if ( x < 0 ) \ + { \ + x_unsigned = 0U - (x_unsigned); \ + s = -s; \ + } \ + FT_END_STMNT + + /* The following three functions are available regardless of whether */ + /* FT_INT64 is defined. */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_RoundFix( FT_Fixed a ) + { + return ( ADD_LONG( a, 0x8000L - ( a < 0 ) ) ) & ~0xFFFFL; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_CeilFix( FT_Fixed a ) + { + return ( ADD_LONG( a, 0xFFFFL ) ) & ~0xFFFFL; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_FloorFix( FT_Fixed a ) + { + return a & ~0xFFFFL; + } + +#ifndef FT_MSB + + FT_BASE_DEF( FT_Int ) + FT_MSB( FT_UInt32 z ) + { + FT_Int shift = 0; + + + /* determine msb bit index in `shift' */ + if ( z & 0xFFFF0000UL ) + { + z >>= 16; + shift += 16; + } + if ( z & 0x0000FF00UL ) + { + z >>= 8; + shift += 8; + } + if ( z & 0x000000F0UL ) + { + z >>= 4; + shift += 4; + } + if ( z & 0x0000000CUL ) + { + z >>= 2; + shift += 2; + } + if ( z & 0x00000002UL ) + { + /* z >>= 1; */ + shift += 1; + } + + return shift; + } + +#endif /* !FT_MSB */ + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Fixed ) + FT_Hypot( FT_Fixed x, + FT_Fixed y ) + { + FT_Vector v; + + + v.x = x; + v.y = y; + + return FT_Vector_Length( &v ); + } + + +#ifdef FT_INT64 + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt64 a, b, c, d; + FT_Long d_; + + + a = (FT_UInt64)a_; + b = (FT_UInt64)b_; + c = (FT_UInt64)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + d = c > 0 ? ( a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFUL; + + d_ = (FT_Long)d; + + return s < 0 ? NEG_LONG( d_ ) : d_; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt64 a, b, c, d; + FT_Long d_; + + + a = (FT_UInt64)a_; + b = (FT_UInt64)b_; + c = (FT_UInt64)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + d = c > 0 ? a * b / c + : 0x7FFFFFFFUL; + + d_ = (FT_Long)d; + + return s < 0 ? NEG_LONG( d_ ) : d_; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a_, + FT_Long b_ ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( (FT_Int32)a_, (FT_Int32)b_ ); + +#else + + FT_Int64 ab = (FT_Int64)a_ * (FT_Int64)b_; + + /* this requires arithmetic right shift of signed numbers */ + return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 ); + +#endif /* FT_MULFIX_ASSEMBLER */ + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a_, + FT_Long b_ ) + { + FT_Int s = 1; + FT_UInt64 a, b, q; + FT_Long q_; + + + a = (FT_UInt64)a_; + b = (FT_UInt64)b_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + + q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b + : 0x7FFFFFFFUL; + + q_ = (FT_Long)q; + + return s < 0 ? NEG_LONG( q_ ) : q_; + } + + +#else /* !FT_INT64 */ + + + static void + ft_multo64( FT_UInt32 x, + FT_UInt32 y, + FT_Int64 *z ) + { + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + lo1 = x & 0x0000FFFFU; hi1 = x >> 16; + lo2 = y & 0x0000FFFFU; hi2 = y >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + z->lo = lo; + z->hi = hi; + } + + + static FT_UInt32 + ft_div64by32( FT_UInt32 hi, + FT_UInt32 lo, + FT_UInt32 y ) + { + FT_UInt32 r, q; + FT_Int i; + + + if ( hi >= y ) + return (FT_UInt32)0x7FFFFFFFL; + + /* We shift as many bits as we can into the high register, perform */ + /* 32-bit division with modulo there, then work through the remaining */ + /* bits with long division. This optimization is especially noticeable */ + /* for smaller dividends that barely use the high register. */ + + i = 31 - FT_MSB( hi ); + r = ( hi << i ) | ( lo >> ( 32 - i ) ); lo <<= i; /* left 64-bit shift */ + q = r / y; + r -= q * y; /* remainder */ + + i = 32 - i; /* bits remaining in low register */ + do + { + q <<= 1; + r = ( r << 1 ) | ( lo >> 31 ); lo <<= 1; + + if ( r >= y ) + { + r -= y; + q |= 1; + } + } while ( --i ); + + return q; + } + + + static void + FT_Add64( FT_Int64* x, + FT_Int64* y, + FT_Int64 *z ) + { + FT_UInt32 lo, hi; + + + lo = x->lo + y->lo; + hi = x->hi + y->hi + ( lo < x->lo ); + + z->lo = lo; + z->hi = hi; + } + + + /* The FT_MulDiv function has been optimized thanks to ideas from */ + /* Graham Asher and Alexei Podtelezhnikov. The trick is to optimize */ + /* a rather common case when everything fits within 32-bits. */ + /* */ + /* We compute 'a*b+c/2', then divide it by 'c' (all positive values). */ + /* */ + /* The product of two positive numbers never exceeds the square of */ + /* its mean values. Therefore, we always avoid the overflow by */ + /* imposing */ + /* */ + /* (a + b) / 2 <= sqrt(X - c/2) , */ + /* */ + /* where X = 2^32 - 1, the maximum unsigned 32-bit value, and using */ + /* unsigned arithmetic. Now we replace `sqrt' with a linear function */ + /* that is smaller or equal for all values of c in the interval */ + /* [0;X/2]; it should be equal to sqrt(X) and sqrt(3X/4) at the */ + /* endpoints. Substituting the linear solution and explicit numbers */ + /* we get */ + /* */ + /* a + b <= 131071.99 - c / 122291.84 . */ + /* */ + /* In practice, we should use a faster and even stronger inequality */ + /* */ + /* a + b <= 131071 - (c >> 16) */ + /* */ + /* or, alternatively, */ + /* */ + /* a + b <= 129894 - (c >> 17) . */ + /* */ + /* FT_MulFix, on the other hand, is optimized for a small value of */ + /* the first argument, when the second argument can be much larger. */ + /* This can be achieved by scaling the second argument and the limit */ + /* in the above inequalities. For example, */ + /* */ + /* a + (b >> 8) <= (131071 >> 4) */ + /* */ + /* covers the practical range of use. The actual test below is a bit */ + /* tighter to avoid the border case overflows. */ + /* */ + /* In the case of FT_DivFix, the exact overflow check */ + /* */ + /* a << 16 <= X - c/2 */ + /* */ + /* is scaled down by 2^16 and we use */ + /* */ + /* a <= 65535 - (c >> 17) . */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt32 a, b, c; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + c = (FT_UInt32)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + if ( c == 0 ) + a = 0x7FFFFFFFUL; + + else if ( a + b <= 129894UL - ( c >> 17 ) ) + a = ( a * b + ( c >> 1 ) ) / c; + + else + { + FT_Int64 temp, temp2; + + + ft_multo64( a, b, &temp ); + + temp2.hi = 0; + temp2.lo = c >> 1; + + FT_Add64( &temp, &temp2, &temp ); + + /* last attempt to ditch long division */ + a = ( temp.hi == 0 ) ? temp.lo / c + : ft_div64by32( temp.hi, temp.lo, c ); + } + + a_ = (FT_Long)a; + + return s < 0 ? NEG_LONG( a_ ) : a_; + } + + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt32 a, b, c; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + c = (FT_UInt32)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + if ( c == 0 ) + a = 0x7FFFFFFFUL; + + else if ( a + b <= 131071UL ) + a = a * b / c; + + else + { + FT_Int64 temp; + + + ft_multo64( a, b, &temp ); + + /* last attempt to ditch long division */ + a = ( temp.hi == 0 ) ? temp.lo / c + : ft_div64by32( temp.hi, temp.lo, c ); + } + + a_ = (FT_Long)a; + + return s < 0 ? NEG_LONG( a_ ) : a_; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a_, + FT_Long b_ ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a_, b_ ); + +#elif 0 + + /* + * This code is nonportable. See comment below. + * + * However, on a platform where right-shift of a signed quantity fills + * the leftmost bits by copying the sign bit, it might be faster. + */ + + FT_Long sa, sb; + FT_UInt32 a, b; + + + /* + * This is a clever way of converting a signed number `a' into its + * absolute value (stored back into `a') and its sign. The sign is + * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' + * was negative. (Similarly for `b' and `sb'). + * + * Unfortunately, it doesn't work (at least not portably). + * + * It makes the assumption that right-shift on a negative signed value + * fills the leftmost bits by copying the sign bit. This is wrong. + * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, + * the result of right-shift of a negative signed value is + * implementation-defined. At least one implementation fills the + * leftmost bits with 0s (i.e., it is exactly the same as an unsigned + * right shift). This means that when `a' is negative, `sa' ends up + * with the value 1 rather than -1. After that, everything else goes + * wrong. + */ + sa = ( a_ >> ( sizeof ( a_ ) * 8 - 1 ) ); + a = ( a_ ^ sa ) - sa; + sb = ( b_ >> ( sizeof ( b_ ) * 8 - 1 ) ); + b = ( b_ ^ sb ) - sb; + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + + if ( a + ( b >> 8 ) <= 8190UL ) + a = ( a * b + 0x8000U ) >> 16; + else + { + FT_UInt32 al = a & 0xFFFFUL; + + + a = ( a >> 16 ) * b + al * ( b >> 16 ) + + ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + sa ^= sb; + a = ( a ^ sa ) - sa; + + return (FT_Long)a; + +#else /* 0 */ + + FT_Int s = 1; + FT_UInt32 a, b; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + + if ( a + ( b >> 8 ) <= 8190UL ) + a = ( a * b + 0x8000UL ) >> 16; + else + { + FT_UInt32 al = a & 0xFFFFUL; + + + a = ( a >> 16 ) * b + al * ( b >> 16 ) + + ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + a_ = (FT_Long)a; + + return s < 0 ? NEG_LONG( a_ ) : a_; + +#endif /* 0 */ + + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a_, + FT_Long b_ ) + { + FT_Int s = 1; + FT_UInt32 a, b, q; + FT_Long q_; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + + if ( b == 0 ) + { + /* check for division by 0 */ + q = 0x7FFFFFFFUL; + } + else if ( a <= 65535UL - ( b >> 17 ) ) + { + /* compute result directly */ + q = ( ( a << 16 ) + ( b >> 1 ) ) / b; + } + else + { + /* we need more bits; we have to do it by hand */ + FT_Int64 temp, temp2; + + + temp.hi = a >> 16; + temp.lo = a << 16; + temp2.hi = 0; + temp2.lo = b >> 1; + + FT_Add64( &temp, &temp2, &temp ); + q = ft_div64by32( temp.hi, temp.lo, b ); + } + + q_ = (FT_Long)q; + + return s < 0 ? NEG_LONG( q_ ) : q_; + } + + +#endif /* !FT_INT64 */ + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix *b ) + { + FT_Fixed xx, xy, yx, yy; + + + if ( !a || !b ) + return; + + xx = ADD_LONG( FT_MulFix( a->xx, b->xx ), + FT_MulFix( a->xy, b->yx ) ); + xy = ADD_LONG( FT_MulFix( a->xx, b->xy ), + FT_MulFix( a->xy, b->yy ) ); + yx = ADD_LONG( FT_MulFix( a->yx, b->xx ), + FT_MulFix( a->yy, b->yx ) ); + yy = ADD_LONG( FT_MulFix( a->yx, b->xy ), + FT_MulFix( a->yy, b->yy ) ); + + b->xx = xx; + b->xy = xy; + b->yx = yx; + b->yy = yy; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ) + { + FT_Pos delta, xx, yy; + + + if ( !matrix ) + return FT_THROW( Invalid_Argument ); + + /* compute discriminant */ + delta = FT_MulFix( matrix->xx, matrix->yy ) - + FT_MulFix( matrix->xy, matrix->yx ); + + if ( !delta ) + return FT_THROW( Invalid_Argument ); /* matrix can't be inverted */ + + matrix->xy = -FT_DivFix( matrix->xy, delta ); + matrix->yx = -FT_DivFix( matrix->yx, delta ); + + xx = matrix->xx; + yy = matrix->yy; + + matrix->xx = FT_DivFix( yy, delta ); + matrix->yy = FT_DivFix( xx, delta ); + + return FT_Err_Ok; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ) + { + FT_Fixed xx, xy, yx, yy; + + FT_Long val = 0x10000L * scaling; + + + if ( !a || !b ) + return; + + xx = ADD_LONG( FT_MulDiv( a->xx, b->xx, val ), + FT_MulDiv( a->xy, b->yx, val ) ); + xy = ADD_LONG( FT_MulDiv( a->xx, b->xy, val ), + FT_MulDiv( a->xy, b->yy, val ) ); + yx = ADD_LONG( FT_MulDiv( a->yx, b->xx, val ), + FT_MulDiv( a->yy, b->yx, val ) ); + yy = ADD_LONG( FT_MulDiv( a->yx, b->xy, val ), + FT_MulDiv( a->yy, b->yy, val ) ); + + b->xx = xx; + b->xy = xy; + b->yx = yx; + b->yy = yy; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Bool ) + FT_Matrix_Check( const FT_Matrix* matrix ) + { + FT_Fixed xx, xy, yx, yy; + FT_Fixed val; + FT_Int shift; + FT_ULong temp1, temp2; + + + if ( !matrix ) + return 0; + + xx = matrix->xx; + xy = matrix->xy; + yx = matrix->yx; + yy = matrix->yy; + val = FT_ABS( xx ) | FT_ABS( xy ) | FT_ABS( yx ) | FT_ABS( yy ); + + /* we only handle non-zero 32-bit values */ + if ( !val || val > 0x7FFFFFFFL ) + return 0; + + /* Scale matrix to avoid the temp1 overflow, which is */ + /* more stringent than avoiding the temp2 overflow. */ + + shift = FT_MSB( val ) - 12; + + if ( shift > 0 ) + { + xx >>= shift; + xy >>= shift; + yx >>= shift; + yy >>= shift; + } + + temp1 = 32U * (FT_ULong)FT_ABS( xx * yy - xy * yx ); + temp2 = (FT_ULong)( xx * xx ) + (FT_ULong)( xy * xy ) + + (FT_ULong)( yx * yx ) + (FT_ULong)( yy * yy ); + + if ( temp1 <= temp2 ) + return 0; + + return 1; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ) + { + FT_Pos xz, yz; + + FT_Long val = 0x10000L * scaling; + + + if ( !vector || !matrix ) + return; + + xz = ADD_LONG( FT_MulDiv( vector->x, matrix->xx, val ), + FT_MulDiv( vector->y, matrix->xy, val ) ); + yz = ADD_LONG( FT_MulDiv( vector->x, matrix->yx, val ), + FT_MulDiv( vector->y, matrix->yy, val ) ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_UInt32 ) + FT_Vector_NormLen( FT_Vector* vector ) + { + FT_Int32 x_ = vector->x; + FT_Int32 y_ = vector->y; + FT_Int32 b, z; + FT_UInt32 x, y, u, v, l; + FT_Int sx = 1, sy = 1, shift; + + + x = (FT_UInt32)x_; + y = (FT_UInt32)y_; + + FT_MOVE_SIGN( x_, x, sx ); + FT_MOVE_SIGN( y_, y, sy ); + + /* trivial cases */ + if ( x == 0 ) + { + if ( y > 0 ) + vector->y = sy * 0x10000; + return y; + } + else if ( y == 0 ) + { + if ( x > 0 ) + vector->x = sx * 0x10000; + return x; + } + + /* Estimate length and prenormalize by shifting so that */ + /* the new approximate length is between 2/3 and 4/3. */ + /* The magic constant 0xAAAAAAAAUL (2/3 of 2^32) helps */ + /* achieve this in 16.16 fixed-point representation. */ + l = x > y ? x + ( y >> 1 ) + : y + ( x >> 1 ); + + shift = 31 - FT_MSB( l ); + shift -= 15 + ( l >= ( 0xAAAAAAAAUL >> shift ) ); + + if ( shift > 0 ) + { + x <<= shift; + y <<= shift; + + /* re-estimate length for tiny vectors */ + l = x > y ? x + ( y >> 1 ) + : y + ( x >> 1 ); + } + else + { + x >>= -shift; + y >>= -shift; + l >>= -shift; + } + + /* lower linear approximation for reciprocal length minus one */ + b = 0x10000 - (FT_Int32)l; + + x_ = (FT_Int32)x; + y_ = (FT_Int32)y; + + /* Newton's iterations */ + do + { + u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) ); + v = (FT_UInt32)( y_ + ( y_ * b >> 16 ) ); + + /* Normalized squared length in the parentheses approaches 2^32. */ + /* On two's complement systems, converting to signed gives the */ + /* difference with 2^32 even if the expression wraps around. */ + z = -(FT_Int32)( u * u + v * v ) / 0x200; + z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000; + + b += z; + + } while ( z > 0 ); + + vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u; + vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v; + + /* Conversion to signed helps to recover from likely wrap around */ + /* in calculating the prenormalized length, because it gives the */ + /* correct difference with 2^32 on two's complement systems. */ + l = (FT_UInt32)( 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000 ); + if ( shift > 0 ) + l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift; + else + l <<= -shift; + + return l; + } + + +#if 0 + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ) + { + FT_UInt32 root, rem_hi, rem_lo, test_div; + FT_Int count; + + + root = 0; + + if ( x > 0 ) + { + rem_hi = 0; + rem_lo = (FT_UInt32)x; + count = 24; + do + { + rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); + rem_lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem_hi >= test_div ) + { + rem_hi -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + +#endif /* 0 */ + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + /* we silently ignore overflow errors since such large values */ + /* lead to even more (harmless) rendering errors later on */ + +#ifdef FT_INT64 + + FT_Int64 delta = SUB_INT64( MUL_INT64( in_x, out_y ), + MUL_INT64( in_y, out_x ) ); + + + return ( delta > 0 ) - ( delta < 0 ); + +#else + + FT_Int result; + + + if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L && + ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L ) + { + FT_Long z1 = MUL_LONG( in_x, out_y ); + FT_Long z2 = MUL_LONG( in_y, out_x ); + + + if ( z1 > z2 ) + result = +1; + else if ( z1 < z2 ) + result = -1; + else + result = 0; + } + else /* products might overflow 32 bits */ + { + FT_Int64 z1, z2; + + + /* XXX: this function does not allow 64-bit arguments */ + ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 ); + ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 ); + + if ( z1.hi > z2.hi ) + result = +1; + else if ( z1.hi < z2.hi ) + result = -1; + else if ( z1.lo > z2.lo ) + result = +1; + else if ( z1.lo < z2.lo ) + result = -1; + else + result = 0; + } + + /* XXX: only the sign of return value, +1/0/-1 must be used */ + return result; + +#endif + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Pos ax = in_x + out_x; + FT_Pos ay = in_y + out_y; + + FT_Pos d_in, d_out, d_hypot; + + + /* The idea of this function is to compare the length of the */ + /* hypotenuse with the `in' and `out' length. The `corner' */ + /* represented by `in' and `out' is flat if the hypotenuse's */ + /* length isn't too large. */ + /* */ + /* This approach has the advantage that the angle between */ + /* `in' and `out' is not checked. In case one of the two */ + /* vectors is `dominant', that is, much larger than the */ + /* other vector, we thus always have a flat corner. */ + /* */ + /* hypotenuse */ + /* x---------------------------x */ + /* \ / */ + /* \ / */ + /* in \ / out */ + /* \ / */ + /* o */ + /* Point */ + + d_in = FT_HYPOT( in_x, in_y ); + d_out = FT_HYPOT( out_x, out_y ); + d_hypot = FT_HYPOT( ax, ay ); + + /* now do a simple length comparison: */ + /* */ + /* d_in + d_out < 17/16 d_hypot */ + + return ( d_in + d_out - d_hypot ) < ( d_hypot >> 4 ); + } + + + FT_BASE_DEF( FT_Int32 ) + FT_MulAddFix( FT_Fixed* s, + FT_Int32* f, + FT_UInt count ) + { + FT_UInt i; + FT_Int64 temp; + + +#ifdef FT_INT64 + temp = 0; + + for ( i = 0; i < count; ++i ) + temp += (FT_Int64)s[i] * f[i]; + + return (FT_Int32)( ( temp + 0x8000 ) >> 16 ); +#else + temp.hi = 0; + temp.lo = 0; + + for ( i = 0; i < count; ++i ) + { + FT_Int64 multResult; + + FT_Int sign = 1; + FT_UInt32 carry = 0; + + FT_UInt32 scalar; + FT_UInt32 factor; + + + scalar = (FT_UInt32)s[i]; + factor = (FT_UInt32)f[i]; + + FT_MOVE_SIGN( s[i], scalar, sign ); + FT_MOVE_SIGN( f[i], factor, sign ); + + ft_multo64( scalar, factor, &multResult ); + + if ( sign < 0 ) + { + /* Emulated `FT_Int64` negation. */ + carry = ( multResult.lo == 0 ); + + multResult.lo = ~multResult.lo + 1; + multResult.hi = ~multResult.hi + carry; + } + + FT_Add64( &temp, &multResult, &temp ); + } + + /* Shift and round value. */ + return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) ) + + ( 1 & ( temp.lo >> 15 ) ) ); + + +#endif /* !FT_INT64 */ + + } + + +/* END */ diff --git a/external/freetype/src/base/ftcid.c b/external/freetype/src/base/ftcid.c new file mode 100644 index 000000000..866cd23e9 --- /dev/null +++ b/external/freetype/src/base/ftcid.c @@ -0,0 +1,117 @@ +/**************************************************************************** + * + * ftcid.c + * + * FreeType API for accessing CID font information. + * + * Copyright (C) 2007-2023 by + * Derek Clegg and Michael Toftdal. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftcid.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svcid.h> + + + /* documentation is in ftcid.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement) + { + FT_Error error; + const char* r = NULL; + const char* o = NULL; + FT_Int s = 0; + + + error = FT_ERR( Invalid_Argument ); + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_ros ) + error = service->get_ros( face, &r, &o, &s ); + } + + if ( registry ) + *registry = r; + + if ( ordering ) + *ordering = o; + + if ( supplement ) + *supplement = s; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_Bool ic = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_is_cid ) + error = service->get_is_cid( face, &ic); + } + + if ( is_cid ) + *is_cid = ic; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_UInt c = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_cid_from_glyph_index ) + error = service->get_cid_from_glyph_index( face, glyph_index, &c); + } + + if ( cid ) + *cid = c; + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftcolor.c b/external/freetype/src/base/ftcolor.c new file mode 100644 index 000000000..bcd6e893d --- /dev/null +++ b/external/freetype/src/base/ftcolor.c @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * ftcolor.c + * + * FreeType's glyph color management (body). + * + * Copyright (C) 2018-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/sfnt.h> +#include <freetype/internal/tttypes.h> +#include <freetype/ftcolor.h> + + +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS + + static + const FT_Palette_Data null_palette_data = { 0, NULL, NULL, 0, NULL }; + + + /* documentation is in ftcolor.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Palette_Data_Get( FT_Face face, + FT_Palette_Data *apalette_data ) + { + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + if ( !apalette_data) + return FT_THROW( Invalid_Argument ); + + if ( FT_IS_SFNT( face ) ) + *apalette_data = ( (TT_Face)face )->palette_data; + else + *apalette_data = null_palette_data; + + return FT_Err_Ok; + } + + + /* documentation is in ftcolor.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Palette_Select( FT_Face face, + FT_UShort palette_index, + FT_Color* *apalette ) + { + FT_Error error; + + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !FT_IS_SFNT( face ) ) + { + if ( apalette ) + *apalette = NULL; + + return FT_Err_Ok; + } + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + error = sfnt->set_palette( ttface, palette_index ); + if ( error ) + return error; + + ttface->palette_index = palette_index; + + if ( apalette ) + *apalette = ttface->palette; + + return FT_Err_Ok; + } + + + /* documentation is in ftcolor.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Palette_Set_Foreground_Color( FT_Face face, + FT_Color foreground_color ) + { + TT_Face ttface; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !FT_IS_SFNT( face ) ) + return FT_Err_Ok; + + ttface = (TT_Face)face; + + ttface->foreground_color = foreground_color; + ttface->have_foreground_color = 1; + + return FT_Err_Ok; + } + +#else /* !TT_CONFIG_OPTION_COLOR_LAYERS */ + + FT_EXPORT_DEF( FT_Error ) + FT_Palette_Data_Get( FT_Face face, + FT_Palette_Data *apalette_data ) + { + FT_UNUSED( face ); + FT_UNUSED( apalette_data ); + + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Palette_Select( FT_Face face, + FT_UShort palette_index, + FT_Color* *apalette ) + { + FT_UNUSED( face ); + FT_UNUSED( palette_index ); + FT_UNUSED( apalette ); + + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Palette_Set_Foreground_Color( FT_Face face, + FT_Color foreground_color ) + { + FT_UNUSED( face ); + FT_UNUSED( foreground_color ); + + + return FT_THROW( Unimplemented_Feature ); + } + +#endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */ + + +/* END */ diff --git a/external/freetype/src/base/ftdbgmem.c b/external/freetype/src/base/ftdbgmem.c new file mode 100644 index 000000000..8fab50dd0 --- /dev/null +++ b/external/freetype/src/base/ftdbgmem.c @@ -0,0 +1,971 @@ +/**************************************************************************** + * + * ftdbgmem.c + * + * Memory debugger (body). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftmemory.h> +#include <freetype/ftsystem.h> +#include <freetype/fterrors.h> +#include <freetype/fttypes.h> + + +#ifdef FT_DEBUG_MEMORY + +#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released + * to the heap. This is useful to detect double-frees + * or weird heap corruption, but it uses large amounts of + * memory, however. + */ + +#include FT_CONFIG_STANDARD_LIBRARY_H + + FT_BASE_DEF( const char* ) ft_debug_file_ = NULL; + FT_BASE_DEF( long ) ft_debug_lineno_ = 0; + + extern void + FT_DumpMemory( FT_Memory memory ); + + + typedef struct FT_MemSourceRec_* FT_MemSource; + typedef struct FT_MemNodeRec_* FT_MemNode; + typedef struct FT_MemTableRec_* FT_MemTable; + + +#define FT_MEM_VAL( addr ) ( (FT_PtrDist)(FT_Pointer)( addr ) ) + + /* + * This structure holds statistics for a single allocation/release + * site. This is useful to know where memory operations happen the + * most. + */ + typedef struct FT_MemSourceRec_ + { + const char* file_name; + long line_no; + + FT_Long cur_blocks; /* current number of allocated blocks */ + FT_Long max_blocks; /* max. number of allocated blocks */ + FT_Long all_blocks; /* total number of blocks allocated */ + + FT_Long cur_size; /* current cumulative allocated size */ + FT_Long max_size; /* maximum cumulative allocated size */ + FT_Long all_size; /* total cumulative allocated size */ + + FT_Long cur_max; /* current maximum allocated size */ + + FT_UInt32 hash; + FT_MemSource link; + + } FT_MemSourceRec; + + + /* + * We don't need a resizable array for the memory sources because + * their number is pretty limited within FreeType. + */ +#define FT_MEM_SOURCE_BUCKETS 128 + + /* + * This structure holds information related to a single allocated + * memory block. If KEEPALIVE is defined, blocks that are freed by + * FreeType are never released to the system. Instead, their `size' + * field is set to `-size'. This is mainly useful to detect double + * frees, at the price of a large memory footprint during execution. + */ + typedef struct FT_MemNodeRec_ + { + FT_Byte* address; + FT_Long size; /* < 0 if the block was freed */ + + FT_MemSource source; + +#ifdef KEEPALIVE + const char* free_file_name; + FT_Long free_line_no; +#endif + + FT_MemNode link; + + } FT_MemNodeRec; + + + /* + * The global structure, containing compound statistics and all hash + * tables. + */ + typedef struct FT_MemTableRec_ + { + FT_Long size; + FT_Long nodes; + FT_MemNode* buckets; + + FT_Long alloc_total; + FT_Long alloc_current; + FT_Long alloc_max; + FT_Long alloc_count; + + FT_Bool bound_total; + FT_Long alloc_total_max; + + FT_Bool bound_count; + FT_Long alloc_count_max; + + FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; + + FT_Bool keep_alive; + + FT_Memory memory; + FT_Pointer memory_user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemTableRec; + + +#define FT_MEM_SIZE_MIN 7 +#define FT_MEM_SIZE_MAX 13845163 + +#define FT_FILENAME( x ) ( (x) ? (x) : "unknown file" ) + + + /* + * Prime numbers are ugly to handle. It would be better to implement + * L-Hashing, which is 10% faster and doesn't require divisions. + */ + static const FT_Int ft_mem_primes[] = + { + 7, + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, + }; + + + static FT_Long + ft_mem_closest_prime( FT_Long num ) + { + size_t i; + + + for ( i = 0; + i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) + if ( ft_mem_primes[i] > num ) + return ft_mem_primes[i]; + + return FT_MEM_SIZE_MAX; + } + + + static void + ft_mem_debug_panic( const char* fmt, + ... ) + { + va_list ap; + + + printf( "FreeType.Debug: " ); + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + + printf( "\n" ); + exit( EXIT_FAILURE ); + } + + + static FT_Pointer + ft_mem_table_alloc( FT_MemTable table, + FT_Long size ) + { + FT_Memory memory = table->memory; + FT_Pointer block; + + + memory->user = table->memory_user; + block = table->alloc( memory, size ); + memory->user = table; + + return block; + } + + + static void + ft_mem_table_free( FT_MemTable table, + FT_Pointer block ) + { + FT_Memory memory = table->memory; + + + memory->user = table->memory_user; + table->free( memory, block ); + memory->user = table; + } + + + static void + ft_mem_table_resize( FT_MemTable table ) + { + FT_Long new_size; + + + new_size = ft_mem_closest_prime( table->nodes ); + if ( new_size != table->size ) + { + FT_MemNode* new_buckets; + FT_Long i; + + + new_buckets = (FT_MemNode *) + ft_mem_table_alloc( + table, + new_size * (FT_Long)sizeof ( FT_MemNode ) ); + if ( !new_buckets ) + return; + + FT_ARRAY_ZERO( new_buckets, new_size ); + + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode node, next, *pnode; + FT_PtrDist hash; + + + node = table->buckets[i]; + while ( node ) + { + next = node->link; + hash = FT_MEM_VAL( node->address ) % (FT_PtrDist)new_size; + pnode = new_buckets + hash; + + node->link = pnode[0]; + pnode[0] = node; + + node = next; + } + } + + if ( table->buckets ) + ft_mem_table_free( table, table->buckets ); + + table->buckets = new_buckets; + table->size = new_size; + } + } + + + static void + ft_mem_table_destroy( FT_MemTable table ) + { + FT_Long i; + FT_Long leak_count = 0; + FT_Long leaks = 0; + + + /* remove all blocks from the table, revealing leaked ones */ + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode *pnode = table->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = NULL; + + if ( node->size > 0 ) + { + printf( + "leaked memory block at address %p, size %8ld in (%s:%ld)\n", + (void*)node->address, + node->size, + FT_FILENAME( node->source->file_name ), + node->source->line_no ); + + leak_count++; + leaks += node->size; + + ft_mem_table_free( table, node->address ); + } + + node->address = NULL; + node->size = 0; + + ft_mem_table_free( table, node ); + node = next; + } + table->buckets[i] = NULL; + } + + ft_mem_table_free( table, table->buckets ); + table->buckets = NULL; + + table->size = 0; + table->nodes = 0; + + /* remove all sources */ + for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) + { + FT_MemSource source, next; + + + for ( source = table->sources[i]; source != NULL; source = next ) + { + next = source->link; + ft_mem_table_free( table, source ); + } + + table->sources[i] = NULL; + } + + printf( "FreeType: total memory allocations = %ld\n", + table->alloc_total ); + printf( "FreeType: maximum memory footprint = %ld\n", + table->alloc_max ); + + if ( leak_count > 0 ) + ft_mem_debug_panic( + "FreeType: %ld bytes of memory leaked in %ld blocks\n", + leaks, leak_count ); + + printf( "FreeType: no memory leaks detected\n" ); + } + + + static FT_MemNode* + ft_mem_table_get_nodep( FT_MemTable table, + FT_Byte* address ) + { + FT_PtrDist hash; + FT_MemNode *pnode, node; + + + hash = FT_MEM_VAL( address ); + pnode = table->buckets + ( hash % (FT_PtrDist)table->size ); + + for (;;) + { + node = pnode[0]; + if ( !node ) + break; + + if ( node->address == address ) + break; + + pnode = &node->link; + } + return pnode; + } + + + static FT_MemSource + ft_mem_table_get_source( FT_MemTable table ) + { + FT_UInt32 hash; + FT_MemSource node, *pnode; + + + /* cast to FT_PtrDist first since void* can be larger */ + /* than FT_UInt32 and GCC 4.1.1 emits a warning */ + hash = (FT_UInt32)(FT_PtrDist)(void*)ft_debug_file_ + + (FT_UInt32)( 5 * ft_debug_lineno_ ); + pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; + + for (;;) + { + node = *pnode; + if ( !node ) + break; + + if ( node->file_name == ft_debug_file_ && + node->line_no == ft_debug_lineno_ ) + goto Exit; + + pnode = &node->link; + } + + node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( !node ) + ft_mem_debug_panic( + "not enough memory to perform memory debugging\n" ); + + node->file_name = ft_debug_file_; + node->line_no = ft_debug_lineno_; + + node->cur_blocks = 0; + node->max_blocks = 0; + node->all_blocks = 0; + + node->cur_size = 0; + node->max_size = 0; + node->all_size = 0; + + node->cur_max = 0; + + node->link = NULL; + node->hash = hash; + *pnode = node; + + Exit: + return node; + } + + + static void + ft_mem_table_set( FT_MemTable table, + FT_Byte* address, + FT_Long size, + FT_Long delta ) + { + FT_MemNode *pnode, node; + + + if ( table ) + { + FT_MemSource source; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + if ( node->size < 0 ) + { + /* This block was already freed. Our memory is now completely */ + /* corrupted! */ + /* This can only happen in keep-alive mode. */ + ft_mem_debug_panic( + "memory heap corrupted (allocating freed block)" ); + } + else + { + /* This block was already allocated. This means that our memory */ + /* is also corrupted! */ + ft_mem_debug_panic( + "memory heap corrupted (re-allocating allocated block at" + " %p, of size %ld)\n" + "org=%s:%d new=%s:%d\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( ft_debug_file_ ), ft_debug_lineno_ ); + } + } + + /* we need to create a new node in this table */ + node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( !node ) + ft_mem_debug_panic( "not enough memory to run memory tests" ); + + node->address = address; + node->size = size; + node->source = source = ft_mem_table_get_source( table ); + + if ( delta == 0 ) + { + /* this is an allocation */ + source->all_blocks++; + source->cur_blocks++; + if ( source->cur_blocks > source->max_blocks ) + source->max_blocks = source->cur_blocks; + } + + if ( size > source->cur_max ) + source->cur_max = size; + + if ( delta != 0 ) + { + /* we are growing or shrinking a reallocated block */ + source->cur_size += delta; + table->alloc_current += delta; + } + else + { + /* we are allocating a new block */ + source->cur_size += size; + table->alloc_current += size; + } + + source->all_size += size; + + if ( source->cur_size > source->max_size ) + source->max_size = source->cur_size; + + node->free_file_name = NULL; + node->free_line_no = 0; + + node->link = pnode[0]; + + pnode[0] = node; + table->nodes++; + + table->alloc_total += size; + + if ( table->alloc_current > table->alloc_max ) + table->alloc_max = table->alloc_current; + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + + + static void + ft_mem_table_remove( FT_MemTable table, + FT_Byte* address, + FT_Long delta ) + { + if ( table ) + { + FT_MemNode *pnode, node; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + FT_MemSource source; + + + if ( node->size < 0 ) + ft_mem_debug_panic( + "freeing memory block at %p more than once\n" + " at (%s:%ld)!\n" + " Block was allocated at (%s:%ld)\n" + " and released at (%s:%ld).", + address, + FT_FILENAME( ft_debug_file_ ), ft_debug_lineno_, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( node->free_file_name ), node->free_line_no ); + + /* scramble the node's content for additional safety */ + FT_MEM_SET( address, 0xF3, node->size ); + + if ( delta == 0 ) + { + source = node->source; + + source->cur_blocks--; + source->cur_size -= node->size; + + table->alloc_current -= node->size; + } + + if ( table->keep_alive ) + { + /* we simply invert the node's size to indicate that the node */ + /* was freed. */ + node->size = -node->size; + node->free_file_name = ft_debug_file_; + node->free_line_no = ft_debug_lineno_; + } + else + { + table->nodes--; + + *pnode = node->link; + + node->size = 0; + node->source = NULL; + + ft_mem_table_free( table, node ); + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + else + ft_mem_debug_panic( + "trying to free unknown block at %p in (%s:%ld)\n", + address, + FT_FILENAME( ft_debug_file_ ), ft_debug_lineno_ ); + } + } + + + static FT_Pointer + ft_mem_debug_alloc( FT_Memory memory, + FT_Long size ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_Byte* block; + + + if ( size <= 0 ) + ft_mem_debug_panic( "negative block size allocation (%ld)", size ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( table->bound_total && + table->alloc_total_max - table->alloc_current > size ) + return NULL; + + block = (FT_Byte *)ft_mem_table_alloc( table, size ); + if ( block ) + { + ft_mem_table_set( table, block, size, 0 ); + + table->alloc_count++; + } + + ft_debug_file_ = "<unknown>"; + ft_debug_lineno_ = 0; + + return (FT_Pointer)block; + } + + + static void + ft_mem_debug_free( FT_Memory memory, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( !block ) + ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", + FT_FILENAME( ft_debug_file_ ), + ft_debug_lineno_ ); + + ft_mem_table_remove( table, (FT_Byte*)block, 0 ); + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + table->alloc_count--; + + ft_debug_file_ = "<unknown>"; + ft_debug_lineno_ = 0; + } + + + static FT_Pointer + ft_mem_debug_realloc( FT_Memory memory, + FT_Long cur_size, + FT_Long new_size, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_MemNode node, *pnode; + FT_Pointer new_block; + FT_Long delta; + + const char* file_name = FT_FILENAME( ft_debug_file_ ); + FT_Long line_no = ft_debug_lineno_; + + + /* unlikely, but possible */ + if ( new_size == cur_size ) + return block; + + /* the following is valid according to ANSI C */ +#if 0 + if ( !block || !cur_size ) + ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", + file_name, line_no ); +#endif + + /* while the following is allowed in ANSI C also, we abort since */ + /* such case should be handled by FreeType. */ + if ( new_size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", + block, cur_size, file_name, line_no ); + + /* check `cur_size' value */ + pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); + node = *pnode; + if ( !node ) + ft_mem_debug_panic( + "trying to reallocate unknown block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate freed block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size != cur_size ) + ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " + "%ld instead of %ld in (%s:%ld)", + block, cur_size, node->size, file_name, line_no ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + delta = new_size - cur_size; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( delta > 0 && + table->bound_total && + table->alloc_current + delta > table->alloc_total_max ) + return NULL; + + new_block = (FT_Pointer)ft_mem_table_alloc( table, new_size ); + if ( !new_block ) + return NULL; + + ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); + + ft_memcpy( new_block, block, cur_size < new_size ? (size_t)cur_size + : (size_t)new_size ); + + ft_mem_table_remove( table, (FT_Byte*)block, delta ); + + ft_debug_file_ = "<unknown>"; + ft_debug_lineno_ = 0; + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + return new_block; + } + + + extern void + ft_mem_debug_init( FT_Memory memory ) + { + FT_MemTable table; + + + if ( !ft_getenv( "FT2_DEBUG_MEMORY" ) ) + return; + + table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); + + if ( table ) + { + FT_ZERO( table ); + + table->memory = memory; + table->memory_user = memory->user; + table->alloc = memory->alloc; + table->realloc = memory->realloc; + table->free = memory->free; + + ft_mem_table_resize( table ); + + if ( table->size ) + { + const char* p; + + + memory->user = table; + memory->alloc = ft_mem_debug_alloc; + memory->realloc = ft_mem_debug_realloc; + memory->free = ft_mem_debug_free; + + p = ft_getenv( "FT2_ALLOC_TOTAL_MAX" ); + if ( p ) + { + FT_Long total_max = ft_strtol( p, NULL, 10 ); + + + if ( total_max > 0 ) + { + table->bound_total = 1; + table->alloc_total_max = total_max; + } + } + + p = ft_getenv( "FT2_ALLOC_COUNT_MAX" ); + if ( p ) + { + FT_Long total_count = ft_strtol( p, NULL, 10 ); + + + if ( total_count > 0 ) + { + table->bound_count = 1; + table->alloc_count_max = total_count; + } + } + + p = ft_getenv( "FT2_KEEP_ALIVE" ); + if ( p ) + { + FT_Long keep_alive = ft_strtol( p, NULL, 10 ); + + + if ( keep_alive > 0 ) + table->keep_alive = 1; + } + } + else + memory->free( memory, table ); + } + } + + + extern void + ft_mem_debug_done( FT_Memory memory ) + { + if ( memory->free == ft_mem_debug_free ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + FT_DumpMemory( memory ); + + ft_mem_table_destroy( table ); + + memory->free = table->free; + memory->realloc = table->realloc; + memory->alloc = table->alloc; + memory->user = table->memory_user; + + memory->free( memory, table ); + } + } + + + FT_COMPARE_DEF( int ) + ft_mem_source_compare( const void* p1, + const void* p2 ) + { + FT_MemSource s1 = *(FT_MemSource*)p1; + FT_MemSource s2 = *(FT_MemSource*)p2; + + + if ( s2->max_size > s1->max_size ) + return 1; + else if ( s2->max_size < s1->max_size ) + return -1; + else + return 0; + } + + + extern void + FT_DumpMemory( FT_Memory memory ) + { + if ( memory->free == ft_mem_debug_free ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_MemSource* bucket = table->sources; + FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; + FT_MemSource* sources; + FT_Int nn, count; + const char* fmt; + + + count = 0; + for ( ; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + count++; + } + + sources = (FT_MemSource*) + ft_mem_table_alloc( + table, count * (FT_Long)sizeof ( *sources ) ); + + count = 0; + for ( bucket = table->sources; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + sources[count++] = source; + } + + ft_qsort( sources, + (size_t)count, + sizeof ( *sources ), + ft_mem_source_compare ); + + printf( "FreeType Memory Dump: " + "current=%ld max=%ld total=%ld count=%ld\n", + table->alloc_current, table->alloc_max, + table->alloc_total, table->alloc_count ); + printf( " block block sizes sizes sizes source\n" ); + printf( " count high sum highsum max location\n" ); + printf( "-------------------------------------------------\n" ); + + fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; + + for ( nn = 0; nn < count; nn++ ) + { + FT_MemSource source = sources[nn]; + + + printf( fmt, + source->cur_blocks, source->max_blocks, + source->cur_size, source->max_size, source->cur_max, + FT_FILENAME( source->file_name ), + source->line_no ); + } + printf( "------------------------------------------------\n" ); + + ft_mem_table_free( table, sources ); + } + } + +#else /* !FT_DEBUG_MEMORY */ + + /* ANSI C doesn't like empty source files */ + typedef int debug_mem_dummy_; + +#endif /* !FT_DEBUG_MEMORY */ + + +/* END */ diff --git a/external/freetype/src/base/ftdebug.c b/external/freetype/src/base/ftdebug.c new file mode 100644 index 000000000..61c4563b0 --- /dev/null +++ b/external/freetype/src/base/ftdebug.c @@ -0,0 +1,644 @@ +/**************************************************************************** + * + * ftdebug.c + * + * Debugging and logging component (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This component contains various macros and functions used to ease the + * debugging of the FreeType engine. Its main purpose is in assertion + * checking, tracing, and error detection. + * + * There are now three debugging modes: + * + * - trace mode + * + * Error and trace messages are sent to the log file (which can be the + * standard error output). + * + * - error mode + * + * Only error messages are generated. + * + * - release mode: + * + * No error message is sent or generated. The code is free from any + * debugging parts. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/ftlogging.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> + + +#ifdef FT_DEBUG_LOGGING + + /************************************************************************** + * + * Variables used to control logging. + * + * 1. `ft_default_trace_level` stores the value of trace levels, which are + * provided to FreeType using the `FT2_DEBUG` environment variable. + * + * 2. `ft_fileptr` stores the `FILE*` handle. + * + * 3. `ft_component` is a string that holds the name of `FT_COMPONENT`. + * + * 4. The flag `ft_component_flag` prints the name of `FT_COMPONENT` along + * with the actual log message if set to true. + * + * 5. The flag `ft_timestamp_flag` prints time along with the actual log + * message if set to ture. + * + * 6. `ft_have_newline_char` is used to differentiate between a log + * message with and without a trailing newline character. + * + * 7. `ft_custom_trace_level` stores the custom trace level value, which + * is provided by the user at run-time. + * + * We use `static` to avoid 'unused variable' warnings. + * + */ + static const char* ft_default_trace_level = NULL; + static FILE* ft_fileptr = NULL; + static const char* ft_component = NULL; + static FT_Bool ft_component_flag = FALSE; + static FT_Bool ft_timestamp_flag = FALSE; + static FT_Bool ft_have_newline_char = TRUE; + static const char* ft_custom_trace_level = NULL; + + /* declared in ftdebug.h */ + + dlg_handler ft_default_log_handler = NULL; + FT_Custom_Log_Handler custom_output_handler = NULL; + +#endif /* FT_DEBUG_LOGGING */ + + +#ifdef FT_DEBUG_LEVEL_ERROR + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( int ) + FT_Throw( FT_Error error, + int line, + const char* file ) + { +#if 0 + /* activating the code in this block makes FreeType very chatty */ + fprintf( stderr, + "%s:%d: error 0x%02x: %s\n", + file, + line, + error, + FT_Error_String( error ) ); +#else + FT_UNUSED( error ); + FT_UNUSED( line ); + FT_UNUSED( file ); +#endif + + return 0; + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0; */ + /* this gets adjusted at run-time */ + static int ft_trace_levels_enabled[trace_count]; + + /* array of trace levels, always initialized to 0 */ + static int ft_trace_levels_disabled[trace_count]; + + /* a pointer to either `ft_trace_levels_enabled' */ + /* or `ft_trace_levels_disabled' */ + int* ft_trace_levels; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include <freetype/internal/fttrace.h> + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Trace_Disable( void ) + { + ft_trace_levels = ft_trace_levels_disabled; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Trace_Enable( void ) + { + ft_trace_levels = ft_trace_levels_enabled; + } + + + /************************************************************************** + * + * Initialize the tracing sub-system. This is done by retrieving the + * value of the `FT2_DEBUG' environment variable. It must be a list of + * toggles, separated by spaces, `;', or `,'. Example: + * + * export FT2_DEBUG="any:3 memory:7 stream:5" + * + * This requests that all levels be set to 3, except the trace level for + * the memory and stream components which are set to 7 and 5, + * respectively. + * + * See the file `include/freetype/internal/fttrace.h' for details of + * the available toggle names. + * + * The level must be between 0 and 7; 0 means quiet (except for serious + * runtime errors), and 7 means _very_ verbose. + */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = NULL; + + +#ifdef FT_DEBUG_LOGGING + if ( ft_custom_trace_level != NULL ) + ft2_debug = ft_custom_trace_level; + else + ft2_debug = ft_default_trace_level; +#else + ft2_debug = ft_getenv( "FT2_DEBUG" ); +#endif + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + +#ifdef FT_DEBUG_LOGGING + + /* check extra arguments for logging */ + if ( *p == '-' ) + { + const char* r = ++p; + + + if ( *r == 'v' ) + { + const char* s = ++r; + + + ft_component_flag = TRUE; + + if ( *s == 't' ) + { + ft_timestamp_flag = TRUE; + p++; + } + + p++; + } + + else if ( *r == 't' ) + { + const char* s = ++r; + + + ft_timestamp_flag = TRUE; + + if ( *s == 'v' ) + { + ft_component_flag = TRUE; + p++; + } + + p++; + } + } + +#endif /* FT_DEBUG_LOGGING */ + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( !*p ) + break; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels_enabled[n] = level; + } + else + ft_trace_levels_enabled[found] = level; + } + } + } + } + + ft_trace_levels = ft_trace_levels_enabled; + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + + FT_BASE_DEF( void ) + FT_Trace_Disable( void ) + { + /* nothing */ + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Trace_Enable( void ) + { + /* nothing */ + } + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LOGGING + + /************************************************************************** + * + * Initialize and de-initialize 'dlg' library. + * + */ + + FT_BASE_DEF( void ) + ft_logging_init( void ) + { + ft_default_log_handler = ft_log_handler; + ft_default_trace_level = ft_getenv( "FT2_DEBUG" ); + + if ( ft_getenv( "FT_LOGGING_FILE" ) ) + ft_fileptr = ft_fopen( ft_getenv( "FT_LOGGING_FILE" ), "w" ); + else + ft_fileptr = stderr; + + ft_debug_init(); + + /* Set the default output handler for 'dlg'. */ + dlg_set_handler( ft_default_log_handler, NULL ); + } + + + FT_BASE_DEF( void ) + ft_logging_deinit( void ) + { + if ( ft_fileptr != stderr ) + ft_fclose( ft_fileptr ); + } + + + /************************************************************************** + * + * An output log handler for FreeType. + * + */ + FT_BASE_DEF( void ) + ft_log_handler( const struct dlg_origin* origin, + const char* string, + void* data ) + { + char features_buf[128]; + char* bufp = features_buf; + + FT_UNUSED( data ); + + + if ( ft_have_newline_char ) + { + const char* features = NULL; + size_t features_length = 0; + + +#define FEATURES_TIMESTAMP "[%h:%m] " +#define FEATURES_COMPONENT "[%t] " +#define FEATURES_TIMESTAMP_COMPONENT "[%h:%m %t] " + + if ( ft_timestamp_flag && ft_component_flag ) + { + features = FEATURES_TIMESTAMP_COMPONENT; + features_length = sizeof ( FEATURES_TIMESTAMP_COMPONENT ); + } + else if ( ft_timestamp_flag ) + { + features = FEATURES_TIMESTAMP; + features_length = sizeof ( FEATURES_TIMESTAMP ); + } + else if ( ft_component_flag ) + { + features = FEATURES_COMPONENT; + features_length = sizeof ( FEATURES_COMPONENT ); + } + + if ( ft_component_flag || ft_timestamp_flag ) + { + ft_strncpy( features_buf, features, features_length ); + bufp += features_length - 1; + } + + if ( ft_component_flag ) + { + size_t tag_length = ft_strlen( *origin->tags ); + size_t i; + + + /* To vertically align tracing messages we compensate the */ + /* different FT_COMPONENT string lengths by inserting an */ + /* appropriate amount of space characters. */ + for ( i = 0; + i < FT_MAX_TRACE_LEVEL_LENGTH - tag_length; + i++ ) + *bufp++ = ' '; + } + } + + /* Finally add the format string for the tracing message. */ + *bufp++ = '%'; + *bufp++ = 'c'; + *bufp = '\0'; + + dlg_generic_outputf_stream( ft_fileptr, + (const char*)features_buf, + origin, + string, + dlg_default_output_styles, + true ); + + if ( ft_strrchr( string, '\n' ) ) + ft_have_newline_char = TRUE; + else + ft_have_newline_char = FALSE; + } + + + /* documentation is in ftdebug.h */ + FT_BASE_DEF( void ) + ft_add_tag( const char* tag ) + { + ft_component = tag; + + dlg_add_tag( tag, NULL ); + } + + + /* documentation is in ftdebug.h */ + FT_BASE_DEF( void ) + ft_remove_tag( const char* tag ) + { + dlg_remove_tag( tag, NULL ); + } + + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Level( const char* level ) + { + ft_component_flag = FALSE; + ft_timestamp_flag = FALSE; + ft_custom_trace_level = level; + + ft_debug_init(); + } + + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Default_Level( void ) + { + ft_component_flag = FALSE; + ft_timestamp_flag = FALSE; + ft_custom_trace_level = NULL; + + ft_debug_init(); + } + + + /************************************************************************** + * + * Functions to handle a custom log handler. + * + */ + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Log_Handler( FT_Custom_Log_Handler handler ) + { + custom_output_handler = handler; + } + + + /* documentation is in ftlogging.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Default_Log_Handler( void ) + { + custom_output_handler = NULL; + } + + + /* documentation is in ftdebug.h */ + FT_BASE_DEF( void ) + FT_Logging_Callback( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + custom_output_handler( ft_component, fmt, ap ); + va_end( ap ); + } + +#else /* !FT_DEBUG_LOGGING */ + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Level( const char* level ) + { + FT_UNUSED( level ); + } + + + FT_EXPORT_DEF( void ) + FT_Trace_Set_Default_Level( void ) + { + /* nothing */ + } + + + FT_EXPORT_DEF( void ) + FT_Set_Log_Handler( FT_Custom_Log_Handler handler ) + { + FT_UNUSED( handler ); + } + + + FT_EXPORT_DEF( void ) + FT_Set_Default_Log_Handler( void ) + { + /* nothing */ + } + +#endif /* !FT_DEBUG_LOGGING */ + + +/* END */ diff --git a/external/freetype/src/base/fterrors.c b/external/freetype/src/base/fterrors.c new file mode 100644 index 000000000..5ad9709c8 --- /dev/null +++ b/external/freetype/src/base/fterrors.c @@ -0,0 +1,45 @@ +/**************************************************************************** + * + * fterrors.c + * + * FreeType API for error code handling. + * + * Copyright (C) 2018-2023 by + * Armin Hasitzka, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/fterrors.h> + + + /* documentation is in fterrors.h */ + + FT_EXPORT_DEF( const char* ) + FT_Error_String( FT_Error error_code ) + { + if ( error_code < 0 || + error_code >= FT_ERR_CAT( FT_ERR_PREFIX, Max ) ) + return NULL; + +#if defined( FT_CONFIG_OPTION_ERROR_STRINGS ) || \ + defined( FT_DEBUG_LEVEL_ERROR ) + +#undef FTERRORS_H_ +#define FT_ERROR_START_LIST switch ( FT_ERROR_BASE( error_code ) ) { +#define FT_ERRORDEF( e, v, s ) case v: return s; +#define FT_ERROR_END_LIST } + +#include <freetype/fterrors.h> + +#endif /* defined( FT_CONFIG_OPTION_ERROR_STRINGS ) || ... */ + + return NULL; + } diff --git a/external/freetype/src/base/ftfntfmt.c b/external/freetype/src/base/ftfntfmt.c new file mode 100644 index 000000000..0b41f7cc8 --- /dev/null +++ b/external/freetype/src/base/ftfntfmt.c @@ -0,0 +1,54 @@ +/**************************************************************************** + * + * ftfntfmt.c + * + * FreeType utility file for font formats (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftfntfmt.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svfntfmt.h> + + + /* documentation is in ftfntfmt.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT ); + + return result; + } + + + /* deprecated function name; retained for ABI compatibility */ + + FT_EXPORT_DEF( const char* ) + FT_Get_X11_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT ); + + return result; + } + + +/* END */ diff --git a/external/freetype/src/base/ftfstype.c b/external/freetype/src/base/ftfstype.c new file mode 100644 index 000000000..ea24e64c6 --- /dev/null +++ b/external/freetype/src/base/ftfstype.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * + * ftfstype.c + * + * FreeType utility file to access FSType data (body). + * + * Copyright (C) 2008-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/t1tables.h> +#include <freetype/tttables.h> +#include <freetype/internal/ftserv.h> +#include <freetype/internal/services/svpsinfo.h> + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ) + { + TT_OS2* os2; + + + /* first, try to get the fs_type directly from the font */ + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_extra ) + { + PS_FontExtraRec extra; + + + if ( !service->ps_get_font_extra( face, &extra ) && + extra.fs_type != 0 ) + return extra.fs_type; + } + } + + /* look at FSType before fsType for Type42 */ + + if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, FT_SFNT_OS2 ) ) != NULL && + os2->version != 0xFFFFU ) + return os2->fsType; + + return 0; + } + + +/* END */ diff --git a/external/freetype/src/base/ftgasp.c b/external/freetype/src/base/ftgasp.c new file mode 100644 index 000000000..29b7b08b7 --- /dev/null +++ b/external/freetype/src/base/ftgasp.c @@ -0,0 +1,60 @@ +/**************************************************************************** + * + * ftgasp.c + * + * Access of TrueType's `gasp' table (body). + * + * Copyright (C) 2007-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftgasp.h> +#include <freetype/internal/tttypes.h> + + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ) + { + FT_Int result = FT_GASP_NO_TABLE; + + + if ( face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->gasp.numRanges > 0 ) + { + TT_GaspRange range = ttface->gasp.gaspRanges; + TT_GaspRange range_end = range + ttface->gasp.numRanges; + + + while ( ppem > range->maxPPEM ) + { + range++; + if ( range >= range_end ) + goto Exit; + } + + result = range->gaspFlag; + + /* ensure that we don't have spurious bits */ + if ( ttface->gasp.version == 0 ) + result &= 3; + } + } + Exit: + return result; + } + + +/* END */ diff --git a/external/freetype/src/base/ftgloadr.c b/external/freetype/src/base/ftgloadr.c new file mode 100644 index 000000000..9823d09e4 --- /dev/null +++ b/external/freetype/src/base/ftgloadr.c @@ -0,0 +1,392 @@ +/**************************************************************************** + * + * ftgloadr.c + * + * The FreeType glyph loader (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftgloadr.h> +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftobjs.h> + +#undef FT_COMPONENT +#define FT_COMPONENT gloader + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** G L Y P H L O A D E R *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * The glyph loader is a simple object which is used to load a set of + * glyphs easily. It is critical for the correct loading of composites. + * + * Ideally, one can see it as a stack of abstract `glyph' objects. + * + * loader.base Is really the bottom of the stack. It describes a + * single glyph image made of the juxtaposition of + * several glyphs (those `in the stack'). + * + * loader.current Describes the top of the stack, on which a new + * glyph can be loaded. + * + * Rewind Clears the stack. + * Prepare Set up `loader.current' for addition of a new glyph + * image. + * Add Add the `current' glyph image to the `base' one, + * and prepare for another one. + * + * The glyph loader is now a base object. Each driver used to + * re-implement it in one way or the other, which wasted code and + * energy. + * + */ + + + /* create a new glyph loader */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ) + { + FT_GlyphLoader loader = NULL; + FT_Error error; + + + if ( !FT_NEW( loader ) ) + { + loader->memory = memory; + *aloader = loader; + } + return error; + } + + + /* rewind the glyph loader - reset counters to 0 */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + base->outline.n_points = 0; + base->outline.n_contours = 0; + base->outline.flags = 0; + base->num_subglyphs = 0; + + *current = *base; + } + + + /* reset glyph loader, free all allocated tables, */ + /* and start from zero */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ) + { + FT_Memory memory = loader->memory; + + + FT_FREE( loader->base.outline.points ); + FT_FREE( loader->base.outline.tags ); + FT_FREE( loader->base.outline.contours ); + FT_FREE( loader->base.extra_points ); + FT_FREE( loader->base.subglyphs ); + + loader->base.extra_points2 = NULL; + + loader->max_points = 0; + loader->max_contours = 0; + loader->max_subglyphs = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + /* delete a glyph loader */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ) + { + if ( loader ) + { + FT_Memory memory = loader->memory; + + + FT_GlyphLoader_Reset( loader ); + FT_FREE( loader ); + } + } + + + /* re-adjust the `current' outline fields */ + static void + FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) + { + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + + + current->points = FT_OFFSET( base->points, base->n_points ); + current->tags = FT_OFFSET( base->tags, base->n_points ); + current->contours = FT_OFFSET( base->contours, base->n_contours ); + + /* handle extra points table - if any */ + if ( loader->use_extra ) + { + loader->current.extra_points = loader->base.extra_points + + base->n_points; + + loader->current.extra_points2 = loader->base.extra_points2 + + base->n_points; + } + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) + { + FT_Error error; + FT_Memory memory = loader->memory; + + + if ( loader->max_points == 0 || + loader->base.extra_points != NULL ) + return FT_Err_Ok; + + if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) + { + loader->use_extra = 1; + loader->base.extra_points2 = loader->base.extra_points + + loader->max_points; + + FT_GlyphLoader_Adjust_Points( loader ); + } + return error; + } + + + /* re-adjust the `current' subglyphs field */ + static void + FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + current->subglyphs = FT_OFFSET( base->subglyphs, base->num_subglyphs ); + } + + + /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ + /* This function reallocates its outline tables if necessary. Note that */ + /* it DOESN'T change the number of points within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + FT_Bool adjust = 0; + + FT_UInt new_max, old_max, min_new_max; + + + error = FT_GlyphLoader_CreateExtra( loader ); + if ( error ) + goto Exit; + + /* check points & tags */ + new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points + + n_points; + old_max = loader->max_points; + + if ( new_max > old_max ) + { + if ( new_max > FT_OUTLINE_POINTS_MAX ) + { + error = FT_THROW( Array_Too_Large ); + goto Exit; + } + + min_new_max = old_max + ( old_max >> 1 ); + if ( new_max < min_new_max ) + new_max = min_new_max; + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( new_max > FT_OUTLINE_POINTS_MAX ) + new_max = FT_OUTLINE_POINTS_MAX; + + if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || + FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) + goto Exit; + + if ( loader->use_extra ) + { + if ( FT_RENEW_ARRAY( loader->base.extra_points, + old_max * 2, new_max * 2 ) ) + goto Exit; + + FT_ARRAY_MOVE( loader->base.extra_points + new_max, + loader->base.extra_points + old_max, + old_max ); + + loader->base.extra_points2 = loader->base.extra_points + new_max; + } + + adjust = 1; + loader->max_points = new_max; + } + + error = FT_GlyphLoader_CreateExtra( loader ); + if ( error ) + goto Exit; + + /* check contours */ + old_max = loader->max_contours; + new_max = (FT_UInt)base->n_contours + (FT_UInt)current->n_contours + + n_contours; + if ( new_max > old_max ) + { + if ( new_max > FT_OUTLINE_CONTOURS_MAX ) + { + error = FT_THROW( Array_Too_Large ); + goto Exit; + } + + min_new_max = old_max + ( old_max >> 1 ); + if ( new_max < min_new_max ) + new_max = min_new_max; + new_max = FT_PAD_CEIL( new_max, 4 ); + if ( new_max > FT_OUTLINE_CONTOURS_MAX ) + new_max = FT_OUTLINE_CONTOURS_MAX; + + if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) + goto Exit; + + adjust = 1; + loader->max_contours = new_max; + } + + if ( adjust ) + FT_GlyphLoader_Adjust_Points( loader ); + + Exit: + if ( error ) + FT_GlyphLoader_Reset( loader ); + + return error; + } + + + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max, old_max; + + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + old_max = loader->max_subglyphs; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 2 ); + if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) + goto Exit; + + loader->max_subglyphs = new_max; + + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + Exit: + return error; + } + + + /* prepare loader for the addition of a new glyph on top of the base one */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) + { + FT_GlyphLoad current = &loader->current; + + + current->outline.n_points = 0; + current->outline.n_contours = 0; + current->num_subglyphs = 0; + + FT_GlyphLoader_Adjust_Points ( loader ); + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + + /* add current glyph to the base image -- and prepare for another */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ) + { + FT_GlyphLoad base; + FT_GlyphLoad current; + + FT_Int n_curr_contours; + FT_Int n_base_points; + FT_Int n; + + + if ( !loader ) + return; + + base = &loader->base; + current = &loader->current; + + n_curr_contours = current->outline.n_contours; + n_base_points = base->outline.n_points; + + base->outline.n_points = + (short)( base->outline.n_points + current->outline.n_points ); + base->outline.n_contours = + (short)( base->outline.n_contours + current->outline.n_contours ); + + base->num_subglyphs += current->num_subglyphs; + + /* adjust contours count in newest outline */ + for ( n = 0; n < n_curr_contours; n++ ) + current->outline.contours[n] = + (short)( current->outline.contours[n] + n_base_points ); + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + +/* END */ diff --git a/external/freetype/src/base/ftglyph.c b/external/freetype/src/base/ftglyph.c new file mode 100644 index 000000000..393d4949f --- /dev/null +++ b/external/freetype/src/base/ftglyph.c @@ -0,0 +1,911 @@ +/**************************************************************************** + * + * ftglyph.c + * + * FreeType convenience functions to handle glyphs (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * This file contains the definition of several convenience functions + * that can be used by client applications to easily retrieve glyph + * bitmaps and outlines from a given face. + * + * These functions should be optional if you are writing a font server + * or text layout engine on top of FreeType. However, they are pretty + * handy for many other simple uses of the library. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftglyph.h> +#include <freetype/ftoutln.h> +#include <freetype/ftbitmap.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/otsvg.h> + +#include "ftbase.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT glyph + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_BitmapGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, + FT_GlyphSlot slot ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + glyph->left = slot->bitmap_left; + glyph->top = slot->bitmap_top; + + /* do lazy copying whenever possible */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + glyph->bitmap = slot->bitmap; + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + FT_Bitmap_Init( &glyph->bitmap ); + error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_copy( FT_Glyph bitmap_source, + FT_Glyph bitmap_target ) + { + FT_Library library = bitmap_source->library; + FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; + FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; + + + target->left = source->left; + target->top = source->top; + + return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Library library = FT_GLYPH( glyph )->library; + + + FT_Bitmap_Done( library, &glyph->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, + FT_BBox* cbox ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + + + cbox->xMin = glyph->left * 64; + cbox->xMax = cbox->xMin + (FT_Pos)( glyph->bitmap.width * 64 ); + cbox->yMax = glyph->top * 64; + cbox->yMin = cbox->yMax - (FT_Pos)( glyph->bitmap.rows * 64 ); + } + + + FT_DEFINE_GLYPH( + ft_bitmap_glyph_class, + + sizeof ( FT_BitmapGlyphRec ), + FT_GLYPH_FORMAT_BITMAP, + + ft_bitmap_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_bitmap_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_bitmap_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + NULL, /* FT_Glyph_TransformFunc glyph_transform */ + ft_bitmap_glyph_bbox, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + NULL /* FT_Glyph_PrepareFunc glyph_prepare */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_OutlineGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_init( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + FT_Outline* source = &slot->outline; + FT_Outline* target = &glyph->outline; + + + /* check format in glyph slot */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + /* allocate new outline */ + error = FT_Outline_New( library, + (FT_UInt)source->n_points, + source->n_contours, + &glyph->outline ); + if ( error ) + goto Exit; + + FT_Outline_Copy( source, target ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_done( FT_Glyph outline_glyph ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_copy( FT_Glyph outline_source, + FT_Glyph outline_target ) + { + FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; + FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; + FT_Error error; + FT_Library library = FT_GLYPH( source )->library; + + + error = FT_Outline_New( library, + (FT_UInt)source->outline.n_points, + source->outline.n_contours, + &target->outline ); + if ( !error ) + FT_Outline_Copy( &source->outline, &target->outline ); + + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_transform( FT_Glyph outline_glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + if ( matrix ) + FT_Outline_Transform( &glyph->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_bbox( FT_Glyph outline_glyph, + FT_BBox* bbox ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Get_CBox( &glyph->outline, bbox ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_prepare( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + slot->outline = glyph->outline; + slot->outline.flags &= ~FT_OUTLINE_OWNER; + + return FT_Err_Ok; + } + + + FT_DEFINE_GLYPH( + ft_outline_glyph_class, + + sizeof ( FT_OutlineGlyphRec ), + FT_GLYPH_FORMAT_OUTLINE, + + ft_outline_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_outline_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_outline_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + ft_outline_glyph_transform, /* FT_Glyph_TransformFunc glyph_transform */ + ft_outline_glyph_bbox, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + ft_outline_glyph_prepare /* FT_Glyph_PrepareFunc glyph_prepare */ + ) + + +#ifdef FT_CONFIG_OPTION_SVG + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_SvgGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ft_svg_glyph_init( FT_Glyph svg_glyph, + FT_GlyphSlot slot ) + { + FT_ULong doc_length; + FT_SVG_Document document; + FT_SvgGlyph glyph = (FT_SvgGlyph)svg_glyph; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = FT_GLYPH( glyph )->library->memory; + + + if ( slot->format != FT_GLYPH_FORMAT_SVG ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + if ( slot->other == NULL ) + { + error = FT_THROW( Invalid_Slot_Handle ); + goto Exit; + } + + document = (FT_SVG_Document)slot->other; + + if ( document->svg_document_length == 0 ) + { + error = FT_THROW( Invalid_Slot_Handle ); + goto Exit; + } + + /* allocate a new document */ + doc_length = document->svg_document_length; + if ( FT_QALLOC( glyph->svg_document, doc_length ) ) + goto Exit; + glyph->svg_document_length = doc_length; + + glyph->glyph_index = slot->glyph_index; + + glyph->metrics = document->metrics; + glyph->units_per_EM = document->units_per_EM; + + glyph->start_glyph_id = document->start_glyph_id; + glyph->end_glyph_id = document->end_glyph_id; + + glyph->transform = document->transform; + glyph->delta = document->delta; + + /* copy the document into glyph */ + FT_MEM_COPY( glyph->svg_document, document->svg_document, doc_length ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_svg_glyph_done( FT_Glyph svg_glyph ) + { + FT_SvgGlyph glyph = (FT_SvgGlyph)svg_glyph; + FT_Memory memory = svg_glyph->library->memory; + + + /* just free the memory */ + FT_FREE( glyph->svg_document ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_svg_glyph_copy( FT_Glyph svg_source, + FT_Glyph svg_target ) + { + FT_SvgGlyph source = (FT_SvgGlyph)svg_source; + FT_SvgGlyph target = (FT_SvgGlyph)svg_target; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = FT_GLYPH( source )->library->memory; + + + if ( svg_source->format != FT_GLYPH_FORMAT_SVG ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + if ( source->svg_document_length == 0 ) + { + error = FT_THROW( Invalid_Slot_Handle ); + goto Exit; + } + + target->glyph_index = source->glyph_index; + + target->svg_document_length = source->svg_document_length; + + target->metrics = source->metrics; + target->units_per_EM = source->units_per_EM; + + target->start_glyph_id = source->start_glyph_id; + target->end_glyph_id = source->end_glyph_id; + + target->transform = source->transform; + target->delta = source->delta; + + /* allocate space for the SVG document */ + if ( FT_QALLOC( target->svg_document, target->svg_document_length ) ) + goto Exit; + + /* copy the document */ + FT_MEM_COPY( target->svg_document, + source->svg_document, + target->svg_document_length ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_svg_glyph_transform( FT_Glyph svg_glyph, + const FT_Matrix* _matrix, + const FT_Vector* _delta ) + { + FT_SvgGlyph glyph = (FT_SvgGlyph)svg_glyph; + FT_Matrix* matrix = (FT_Matrix*)_matrix; + FT_Vector* delta = (FT_Vector*)_delta; + + FT_Matrix tmp_matrix; + FT_Vector tmp_delta; + + FT_Matrix a, b; + FT_Pos x, y; + + + if ( !matrix ) + { + tmp_matrix.xx = 0x10000; + tmp_matrix.xy = 0; + tmp_matrix.yx = 0; + tmp_matrix.yy = 0x10000; + + matrix = &tmp_matrix; + } + + if ( !delta ) + { + tmp_delta.x = 0; + tmp_delta.y = 0; + + delta = &tmp_delta; + } + + a = glyph->transform; + b = *matrix; + FT_Matrix_Multiply( &b, &a ); + + x = ADD_LONG( ADD_LONG( FT_MulFix( matrix->xx, glyph->delta.x ), + FT_MulFix( matrix->xy, glyph->delta.y ) ), + delta->x ); + y = ADD_LONG( ADD_LONG( FT_MulFix( matrix->yx, glyph->delta.x ), + FT_MulFix( matrix->yy, glyph->delta.y ) ), + delta->y ); + + glyph->delta.x = x; + glyph->delta.y = y; + + glyph->transform = a; + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_svg_glyph_prepare( FT_Glyph svg_glyph, + FT_GlyphSlot slot ) + { + FT_SvgGlyph glyph = (FT_SvgGlyph)svg_glyph; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = svg_glyph->library->memory; + + FT_SVG_Document document = NULL; + + + if ( FT_NEW( document ) ) + return error; + + document->svg_document = glyph->svg_document; + document->svg_document_length = glyph->svg_document_length; + + document->metrics = glyph->metrics; + document->units_per_EM = glyph->units_per_EM; + + document->start_glyph_id = glyph->start_glyph_id; + document->end_glyph_id = glyph->end_glyph_id; + + document->transform = glyph->transform; + document->delta = glyph->delta; + + slot->format = FT_GLYPH_FORMAT_SVG; + slot->glyph_index = glyph->glyph_index; + slot->other = document; + + return error; + } + + + FT_DEFINE_GLYPH( + ft_svg_glyph_class, + + sizeof ( FT_SvgGlyphRec ), + FT_GLYPH_FORMAT_SVG, + + ft_svg_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_svg_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_svg_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + ft_svg_glyph_transform, /* FT_Glyph_TransformFunc glyph_transform */ + NULL, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + ft_svg_glyph_prepare /* FT_Glyph_PrepareFunc glyph_prepare */ + ) + +#endif /* FT_CONFIG_OPTION_SVG */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_Glyph class and API ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + ft_new_glyph( FT_Library library, + const FT_Glyph_Class* clazz, + FT_Glyph* aglyph ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Glyph glyph = NULL; + + + *aglyph = NULL; + + if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) + { + glyph->library = library; + glyph->clazz = clazz; + glyph->format = clazz->glyph_format; + + *aglyph = glyph; + } + + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ) + { + FT_Glyph copy; + FT_Error error; + const FT_Glyph_Class* clazz; + + + /* check arguments */ + if ( !target || !source || !source->clazz ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + *target = NULL; + + if ( !source || !source->clazz ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + clazz = source->clazz; + error = ft_new_glyph( source->library, clazz, &copy ); + if ( error ) + goto Exit; + + copy->advance = source->advance; + copy->format = source->format; + + if ( clazz->glyph_copy ) + error = clazz->glyph_copy( source, copy ); + + if ( error ) + FT_Done_Glyph( copy ); + else + *target = copy; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT( FT_Error ) + FT_New_Glyph( FT_Library library, + FT_Glyph_Format format, + FT_Glyph *aglyph ) + { + const FT_Glyph_Class* clazz = NULL; + + if ( !library || !aglyph ) + return FT_THROW( Invalid_Argument ); + + /* if it is a bitmap, that's easy :-) */ + if ( format == FT_GLYPH_FORMAT_BITMAP ) + clazz = &ft_bitmap_glyph_class; + + /* if it is an outline */ + else if ( format == FT_GLYPH_FORMAT_OUTLINE ) + clazz = &ft_outline_glyph_class; + +#ifdef FT_CONFIG_OPTION_SVG + /* if it is an SVG glyph */ + else if ( format == FT_GLYPH_FORMAT_SVG ) + clazz = &ft_svg_glyph_class; +#endif + + else + { + /* try to find a renderer that supports the glyph image format */ + FT_Renderer render = FT_Lookup_Renderer( library, format, 0 ); + + + if ( render ) + clazz = &render->glyph_class; + } + + if ( !clazz ) + return FT_THROW( Invalid_Glyph_Format ); + + /* create FT_Glyph object */ + return ft_new_glyph( library, clazz, aglyph ); + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ) + { + FT_Error error; + FT_Glyph glyph; + + + if ( !slot ) + return FT_THROW( Invalid_Slot_Handle ); + + if ( !aglyph ) + return FT_THROW( Invalid_Argument ); + + /* create FT_Glyph object */ + error = FT_New_Glyph( slot->library, slot->format, &glyph ); + if ( error ) + goto Exit; + + /* copy advance while converting 26.6 to 16.16 format */ + if ( slot->advance.x >= 0x8000L * 64 || + slot->advance.x <= -0x8000L * 64 ) + { + FT_ERROR(( "FT_Get_Glyph: advance width too large\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit2; + } + if ( slot->advance.y >= 0x8000L * 64 || + slot->advance.y <= -0x8000L * 64 ) + { + FT_ERROR(( "FT_Get_Glyph: advance height too large\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit2; + } + + glyph->advance.x = slot->advance.x * 1024; + glyph->advance.y = slot->advance.y * 1024; + + /* now import the image from the glyph slot */ + error = glyph->clazz->glyph_init( glyph, slot ); + + Exit2: + /* if an error occurred, destroy the glyph */ + if ( error ) + { + FT_Done_Glyph( glyph ); + *aglyph = NULL; + } + else + *aglyph = glyph; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( !glyph || !glyph->clazz ) + error = FT_THROW( Invalid_Argument ); + else + { + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_transform ) + { + /* transform glyph image */ + clazz->glyph_transform( glyph, matrix, delta ); + + /* transform advance vector */ + if ( matrix ) + FT_Vector_Transform( &glyph->advance, matrix ); + } + else + error = FT_THROW( Invalid_Glyph_Format ); + } + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ) + { + const FT_Glyph_Class* clazz; + + + if ( !acbox ) + return; + + acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; + + if ( !glyph || !glyph->clazz ) + return; + + clazz = glyph->clazz; + if ( !clazz->glyph_bbox ) + return; + + /* retrieve bbox in 26.6 coordinates */ + clazz->glyph_bbox( glyph, acbox ); + + /* perform grid fitting if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); + acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); + acbox->xMax = FT_PIX_CEIL_LONG( acbox->xMax ); + acbox->yMax = FT_PIX_CEIL_LONG( acbox->yMax ); + } + + /* convert to integer pixels if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin >>= 6; + acbox->yMin >>= 6; + acbox->xMax >>= 6; + acbox->yMax >>= 6; + } + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + const FT_Vector* origin, + FT_Bool destroy ) + { + FT_GlyphSlotRec dummy; + FT_GlyphSlot_InternalRec dummy_internal; + FT_Error error = FT_Err_Ok; + FT_Glyph b, glyph; + FT_BitmapGlyph bitmap = NULL; + const FT_Glyph_Class* clazz; + + FT_Library library; + + + /* check argument */ + if ( !the_glyph ) + goto Bad; + glyph = *the_glyph; + if ( !glyph ) + goto Bad; + + clazz = glyph->clazz; + library = glyph->library; + if ( !library || !clazz ) + goto Bad; + + /* when called with a bitmap glyph, do nothing and return successfully */ + if ( clazz == &ft_bitmap_glyph_class ) + goto Exit; + + if ( !clazz->glyph_prepare ) + goto Bad; + + /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ + /* then calling FT_Render_Glyph_Internal() */ + + FT_ZERO( &dummy ); + FT_ZERO( &dummy_internal ); + dummy.internal = &dummy_internal; + dummy.library = library; + dummy.format = clazz->glyph_format; + + /* create result bitmap glyph */ + error = ft_new_glyph( library, &ft_bitmap_glyph_class, &b ); + if ( error ) + goto Exit; + bitmap = (FT_BitmapGlyph)b; + +#if 1 + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, NULL, origin ); +#else + FT_UNUSED( origin ); +#endif + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + +#ifdef FT_CONFIG_OPTION_SVG + if ( clazz == &ft_svg_glyph_class ) + { + FT_Memory memory = library->memory; + + + FT_FREE( dummy.other ); + } +#endif + +#if 1 + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, NULL, &v ); + } +#endif + + if ( error ) + goto Exit; + + /* in case of success, copy the bitmap to the glyph bitmap */ + error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); + if ( error ) + goto Exit; + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + + Exit: + if ( error && bitmap ) + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + + return error; + + Bad: + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Done_Glyph( FT_Glyph glyph ) + { + if ( glyph ) + { + FT_Memory memory = glyph->library->memory; + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_done ) + clazz->glyph_done( glyph ); + + FT_FREE( glyph ); + } + } + + +/* END */ diff --git a/external/freetype/src/base/ftgxval.c b/external/freetype/src/base/ftgxval.c new file mode 100644 index 000000000..6b3c5d248 --- /dev/null +++ b/external/freetype/src/base/ftgxval.c @@ -0,0 +1,141 @@ +/**************************************************************************** + * + * ftgxval.c + * + * FreeType API for validating TrueTypeGX/AAT tables (body). + * + * Copyright (C) 2004-2023 by + * Masatake YAMATO, Redhat K.K, + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svgxval.h> + + + /* documentation is in ftgxval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ) + { + FT_Service_GXvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( !tables ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + tables, + table_length ); + else + error = FT_THROW( Unimplemented_Feature ); + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( table ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ) + { + FT_Service_CKERNvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( !ckern_table ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + ckern_table ); + else + error = FT_THROW( Unimplemented_Feature ); + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + +/* END */ diff --git a/external/freetype/src/base/fthash.c b/external/freetype/src/base/fthash.c new file mode 100644 index 000000000..313bbbb4b --- /dev/null +++ b/external/freetype/src/base/fthash.c @@ -0,0 +1,338 @@ +/**************************************************************************** + * + * fthash.c + * + * Hashing functions (body). + * + */ + +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001-2015 + * Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /************************************************************************** + * + * This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50 + * + * taken from Mark Leisher's xmbdfed package + * + */ + + +#include <freetype/internal/fthash.h> +#include <freetype/internal/ftmemory.h> + + +#define INITIAL_HT_SIZE 241 + + + static FT_ULong + hash_str_lookup( FT_Hashkey* key ) + { + const char* kp = key->str; + FT_ULong res = 0; + + + /* Mocklisp hash function. */ + while ( *kp ) + res = ( res << 5 ) - res + (FT_ULong)*kp++; + + return res; + } + + + static FT_ULong + hash_num_lookup( FT_Hashkey* key ) + { + FT_ULong num = (FT_ULong)key->num; + FT_ULong res; + + + /* Mocklisp hash function. */ + res = num & 0xFF; + res = ( res << 5 ) - res + ( ( num >> 8 ) & 0xFF ); + res = ( res << 5 ) - res + ( ( num >> 16 ) & 0xFF ); + res = ( res << 5 ) - res + ( ( num >> 24 ) & 0xFF ); + + return res; + } + + + static FT_Bool + hash_str_compare( FT_Hashkey* a, + FT_Hashkey* b ) + { + if ( a->str[0] == b->str[0] && + ft_strcmp( a->str, b->str ) == 0 ) + return 1; + + return 0; + } + + + static FT_Bool + hash_num_compare( FT_Hashkey* a, + FT_Hashkey* b ) + { + if ( a->num == b->num ) + return 1; + + return 0; + } + + + static FT_Hashnode* + hash_bucket( FT_Hashkey key, + FT_Hash hash ) + { + FT_ULong res = 0; + FT_Hashnode* bp = hash->table; + FT_Hashnode* ndp; + + + res = (hash->lookup)( &key ); + + ndp = bp + ( res % hash->size ); + while ( *ndp ) + { + if ( (hash->compare)( &(*ndp)->key, &key ) ) + break; + + ndp--; + if ( ndp < bp ) + ndp = bp + ( hash->size - 1 ); + } + + return ndp; + } + + + static FT_Error + hash_rehash( FT_Hash hash, + FT_Memory memory ) + { + FT_Hashnode* obp = hash->table; + FT_Hashnode* bp; + FT_Hashnode* nbp; + + FT_UInt i, sz = hash->size; + FT_Error error = FT_Err_Ok; + + + hash->size <<= 1; + hash->limit = hash->size / 3; + + if ( FT_NEW_ARRAY( hash->table, hash->size ) ) + goto Exit; + + for ( i = 0, bp = obp; i < sz; i++, bp++ ) + { + if ( *bp ) + { + nbp = hash_bucket( (*bp)->key, hash ); + *nbp = *bp; + } + } + + FT_FREE( obp ); + + Exit: + return error; + } + + + static FT_Error + hash_init( FT_Hash hash, + FT_Bool is_num, + FT_Memory memory ) + { + FT_UInt sz = INITIAL_HT_SIZE; + FT_Error error; + + + hash->size = sz; + hash->limit = sz / 3; + hash->used = 0; + + if ( is_num ) + { + hash->lookup = hash_num_lookup; + hash->compare = hash_num_compare; + } + else + { + hash->lookup = hash_str_lookup; + hash->compare = hash_str_compare; + } + + FT_MEM_NEW_ARRAY( hash->table, sz ); + + return error; + } + + + FT_Error + ft_hash_str_init( FT_Hash hash, + FT_Memory memory ) + { + return hash_init( hash, 0, memory ); + } + + + FT_Error + ft_hash_num_init( FT_Hash hash, + FT_Memory memory ) + { + return hash_init( hash, 1, memory ); + } + + + void + ft_hash_str_free( FT_Hash hash, + FT_Memory memory ) + { + if ( hash ) + { + FT_UInt sz = hash->size; + FT_Hashnode* bp = hash->table; + FT_UInt i; + + + for ( i = 0; i < sz; i++, bp++ ) + FT_FREE( *bp ); + + FT_FREE( hash->table ); + } + } + + + /* `ft_hash_num_free' is the same as `ft_hash_str_free' */ + + + static FT_Error + hash_insert( FT_Hashkey key, + size_t data, + FT_Hash hash, + FT_Memory memory ) + { + FT_Hashnode nn; + FT_Hashnode* bp = hash_bucket( key, hash ); + FT_Error error = FT_Err_Ok; + + + nn = *bp; + if ( !nn ) + { + if ( FT_QNEW( nn ) ) + goto Exit; + *bp = nn; + + nn->key = key; + nn->data = data; + + if ( hash->used >= hash->limit ) + { + error = hash_rehash( hash, memory ); + if ( error ) + goto Exit; + } + + hash->used++; + } + else + nn->data = data; + + Exit: + return error; + } + + + FT_Error + ft_hash_str_insert( const char* key, + size_t data, + FT_Hash hash, + FT_Memory memory ) + { + FT_Hashkey hk; + + + hk.str = key; + + return hash_insert( hk, data, hash, memory ); + } + + + FT_Error + ft_hash_num_insert( FT_Int num, + size_t data, + FT_Hash hash, + FT_Memory memory ) + { + FT_Hashkey hk; + + + hk.num = num; + + return hash_insert( hk, data, hash, memory ); + } + + + static size_t* + hash_lookup( FT_Hashkey key, + FT_Hash hash ) + { + FT_Hashnode* np = hash_bucket( key, hash ); + + + return (*np) ? &(*np)->data + : NULL; + } + + + size_t* + ft_hash_str_lookup( const char* key, + FT_Hash hash ) + { + FT_Hashkey hk; + + + hk.str = key; + + return hash_lookup( hk, hash ); + } + + + size_t* + ft_hash_num_lookup( FT_Int num, + FT_Hash hash ) + { + FT_Hashkey hk; + + + hk.num = num; + + return hash_lookup( hk, hash ); + } + + +/* END */ diff --git a/external/freetype/src/base/ftinit.c b/external/freetype/src/base/ftinit.c new file mode 100644 index 000000000..c9c71d24b --- /dev/null +++ b/external/freetype/src/base/ftinit.c @@ -0,0 +1,263 @@ +/**************************************************************************** + * + * ftinit.c + * + * FreeType initialization layer (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * The purpose of this file is to implement the following two + * functions: + * + * FT_Add_Default_Modules(): + * This function is used to add the set of default modules to a + * fresh new library object. The set is taken from the header file + * `freetype/config/ftmodule.h'. See the document `FreeType 2.0 + * Build System' for more information. + * + * FT_Init_FreeType(): + * This function creates a system object for the current platform, + * builds a library out of it, then calls FT_Default_Drivers(). + * + * Note that even if FT_Init_FreeType() uses the implementation of the + * system object defined at build time, client applications are still + * able to provide their own `ftsystem.c'. + * + */ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftmodapi.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT init + + +#undef FT_USE_MODULE +#ifdef __cplusplus +#define FT_USE_MODULE( type, x ) extern "C" const type x; +#else +#define FT_USE_MODULE( type, x ) extern const type x; +#endif + +#include FT_CONFIG_MODULES_H + +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), + + static + const FT_Module_Class* const ft_default_modules[] = + { +#include FT_CONFIG_MODULES_H + 0 + }; + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Add_Default_Modules( FT_Library library ) + { + FT_Error error; + const FT_Module_Class* const* cur; + + + /* GCC 4.6 warns the type difference: + * FT_Module_Class** != const FT_Module_Class* const* + */ + cur = (const FT_Module_Class* const*)ft_default_modules; + + /* test for valid `library' delayed to FT_Add_Module() */ + while ( *cur ) + { + error = FT_Add_Module( library, *cur ); + /* notify errors, but don't stop */ + if ( error ) + FT_TRACE0(( "FT_Add_Default_Module:" + " Cannot install `%s', error = 0x%x\n", + (*cur)->module_name, error )); + cur++; + } + } + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + +#define MAX_LENGTH 128 + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Default_Properties( FT_Library library ) + { + const char* env; + const char* p; + const char* q; + + char module_name[MAX_LENGTH + 1]; + char property_name[MAX_LENGTH + 1]; + char property_value[MAX_LENGTH + 1]; + + int i; + + + env = ft_getenv( "FREETYPE_PROPERTIES" ); + if ( !env ) + return; + + for ( p = env; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' ) + continue; + + /* read module name, followed by `:' */ + q = p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == ':' ) + break; + module_name[i] = *p++; + } + module_name[i] = '\0'; + + if ( !*p || *p != ':' || p == q ) + break; + + /* read property name, followed by `=' */ + q = ++p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == '=' ) + break; + property_name[i] = *p++; + } + property_name[i] = '\0'; + + if ( !*p || *p != '=' || p == q ) + break; + + /* read property value, followed by whitespace (if any) */ + q = ++p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == ' ' || *p == '\t' ) + break; + property_value[i] = *p++; + } + property_value[i] = '\0'; + + if ( !( *p == '\0' || *p == ' ' || *p == '\t' ) || p == q ) + break; + + /* we completely ignore errors */ + ft_property_string_set( library, + module_name, + property_name, + property_value ); + + if ( !*p ) + break; + } + } + +#else + + FT_EXPORT_DEF( void ) + FT_Set_Default_Properties( FT_Library library ) + { + FT_UNUSED( library ); + } + +#endif + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ) + { + FT_Error error; + FT_Memory memory; + + +#ifdef FT_DEBUG_LOGGING + ft_logging_init(); +#endif + + /* check of `alibrary' delayed to `FT_New_Library' */ + + /* First of all, allocate a new system object -- this function is part */ + /* of the system-specific component, i.e. `ftsystem.c'. */ + + memory = FT_New_Memory(); + if ( !memory ) + { + FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); + return FT_THROW( Unimplemented_Feature ); + } + + /* build a library out of it, then fill it with the set of */ + /* default drivers. */ + + error = FT_New_Library( memory, alibrary ); + if ( error ) + FT_Done_Memory( memory ); + else + FT_Add_Default_Modules( *alibrary ); + + FT_Set_Default_Properties( *alibrary ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_FreeType( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + memory = library->memory; + + /* Discard the library object */ + FT_Done_Library( library ); + + /* discard memory manager */ + FT_Done_Memory( memory ); + +#ifdef FT_DEBUG_LOGGING + ft_logging_deinit(); +#endif + + return FT_Err_Ok; + } + + +/* END */ diff --git a/external/freetype/src/base/ftlcdfil.c b/external/freetype/src/base/ftlcdfil.c new file mode 100644 index 000000000..6c3fd66e0 --- /dev/null +++ b/external/freetype/src/base/ftlcdfil.c @@ -0,0 +1,437 @@ +/**************************************************************************** + * + * ftlcdfil.c + * + * FreeType API for color filtering of subpixel bitmap glyphs (body). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftlcdfil.h> +#include <freetype/ftimage.h> +#include <freetype/internal/ftobjs.h> + + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + +/* define USE_LEGACY to implement the legacy filter */ +#define USE_LEGACY + +#define FT_SHIFTCLAMP( x ) ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) ) + + + /* add padding according to filter weights */ + FT_BASE_DEF( void ) + ft_lcd_padding( FT_BBox* cbox, + FT_GlyphSlot slot, + FT_Render_Mode mode ) + { + FT_Byte* lcd_weights; + FT_Bitmap_LcdFilterFunc lcd_filter_func; + + + /* Per-face LCD filtering takes priority if set up. */ + if ( slot->face && slot->face->internal->lcd_filter_func ) + { + lcd_weights = slot->face->internal->lcd_weights; + lcd_filter_func = slot->face->internal->lcd_filter_func; + } + else + { + lcd_weights = slot->library->lcd_weights; + lcd_filter_func = slot->library->lcd_filter_func; + } + + if ( lcd_filter_func == ft_lcd_filter_fir ) + { + if ( mode == FT_RENDER_MODE_LCD ) + { + cbox->xMin -= lcd_weights[0] ? 43 : + lcd_weights[1] ? 22 : 0; + cbox->xMax += lcd_weights[4] ? 43 : + lcd_weights[3] ? 22 : 0; + } + else if ( mode == FT_RENDER_MODE_LCD_V ) + { + cbox->yMin -= lcd_weights[0] ? 43 : + lcd_weights[1] ? 22 : 0; + cbox->yMax += lcd_weights[4] ? 43 : + lcd_weights[3] ? 22 : 0; + } + } + } + + + /* FIR filter used by the default and light filters */ + FT_BASE_DEF( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_LcdFiveTapFilter weights ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + FT_Byte* origin = bitmap->buffer; + FT_Byte mode = bitmap->pixel_mode; + + + /* take care of bitmap flow */ + if ( pitch > 0 && height > 0 ) + origin += pitch * (FT_Int)( height - 1 ); + + /* horizontal in-place FIR filter */ + if ( mode == FT_PIXEL_MODE_LCD && width >= 2 ) + { + FT_Byte* line = origin; + + + /* `fir' must be at least 32 bit wide, since the sum of */ + /* the values in `weights' can exceed 0xFF */ + + for ( ; height > 0; height--, line -= pitch ) + { + FT_UInt fir[5]; + FT_UInt val, xx; + + + val = line[0]; + fir[2] = weights[2] * val; + fir[3] = weights[3] * val; + fir[4] = weights[4] * val; + + val = line[1]; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + + for ( xx = 2; xx < width; xx++ ) + { + val = line[xx]; + fir[0] = fir[1] + weights[0] * val; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + + line[xx - 2] = FT_SHIFTCLAMP( fir[0] ); + } + + line[xx - 2] = FT_SHIFTCLAMP( fir[1] ); + line[xx - 1] = FT_SHIFTCLAMP( fir[2] ); + } + } + + /* vertical in-place FIR filter */ + else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 2 ) + { + FT_Byte* column = origin; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_UInt fir[5]; + FT_UInt val, yy; + + + val = col[0]; + fir[2] = weights[2] * val; + fir[3] = weights[3] * val; + fir[4] = weights[4] * val; + col -= pitch; + + val = col[0]; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + col -= pitch; + + for ( yy = 2; yy < height; yy++, col -= pitch ) + { + val = col[0]; + fir[0] = fir[1] + weights[0] * val; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + + col[pitch * 2] = FT_SHIFTCLAMP( fir[0] ); + } + + col[pitch * 2] = FT_SHIFTCLAMP( fir[1] ); + col[pitch] = FT_SHIFTCLAMP( fir[2] ); + } + } + } + + +#ifdef USE_LEGACY + + /* intra-pixel filter used by the legacy filter */ + static void + _ft_lcd_filter_legacy( FT_Bitmap* bitmap, + FT_Byte* weights ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + FT_Byte* origin = bitmap->buffer; + FT_Byte mode = bitmap->pixel_mode; + + static const unsigned int filters[3][3] = + { + { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, + { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, + { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } + }; + + FT_UNUSED( weights ); + + + /* take care of bitmap flow */ + if ( pitch > 0 && height > 0 ) + origin += pitch * (FT_Int)( height - 1 ); + + /* horizontal in-place intra-pixel filter */ + if ( mode == FT_PIXEL_MODE_LCD && width >= 3 ) + { + FT_Byte* line = origin; + + + for ( ; height > 0; height--, line -= pitch ) + { + FT_UInt xx; + + + for ( xx = 0; xx < width; xx += 3 ) + { + FT_UInt r, g, b; + FT_UInt p; + + + p = line[xx]; + r = filters[0][0] * p; + g = filters[0][1] * p; + b = filters[0][2] * p; + + p = line[xx + 1]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = line[xx + 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + line[xx] = (FT_Byte)( r / 65536 ); + line[xx + 1] = (FT_Byte)( g / 65536 ); + line[xx + 2] = (FT_Byte)( b / 65536 ); + } + } + } + else if ( mode == FT_PIXEL_MODE_LCD_V && height >= 3 ) + { + FT_Byte* column = origin; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column - 2 * pitch; + + + for ( ; height > 0; height -= 3, col -= 3 * pitch ) + { + FT_UInt r, g, b; + FT_UInt p; + + + p = col[0]; + r = filters[0][0] * p; + g = filters[0][1] * p; + b = filters[0][2] * p; + + p = col[pitch]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = col[pitch * 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + col[0] = (FT_Byte)( r / 65536 ); + col[pitch] = (FT_Byte)( g / 65536 ); + col[pitch * 2] = (FT_Byte)( b / 65536 ); + } + } + } + } + +#endif /* USE_LEGACY */ + + + /* documentation in ftlcdfil.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !weights ) + return FT_THROW( Invalid_Argument ); + + ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; + + return FT_Err_Ok; + } + + + /* documentation in ftlcdfil.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + static const FT_LcdFiveTapFilter default_weights = + { 0x08, 0x4d, 0x56, 0x4d, 0x08 }; + static const FT_LcdFiveTapFilter light_weights = + { 0x00, 0x55, 0x56, 0x55, 0x00 }; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + switch ( filter ) + { + case FT_LCD_FILTER_NONE: + library->lcd_filter_func = NULL; + break; + + case FT_LCD_FILTER_DEFAULT: + ft_memcpy( library->lcd_weights, + default_weights, + FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; + break; + + case FT_LCD_FILTER_LIGHT: + ft_memcpy( library->lcd_weights, + light_weights, + FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; + break; + +#ifdef USE_LEGACY + + case FT_LCD_FILTER_LEGACY: + case FT_LCD_FILTER_LEGACY1: + library->lcd_filter_func = _ft_lcd_filter_legacy; + break; + +#endif + + default: + return FT_THROW( Invalid_Argument ); + } + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdGeometry( FT_Library library, + FT_Vector sub[3] ) + { + FT_UNUSED( library ); + FT_UNUSED( sub ); + + return FT_THROW( Unimplemented_Feature ); + } + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* add padding to accommodate outline shifts */ + FT_BASE_DEF( void ) + ft_lcd_padding( FT_BBox* cbox, + FT_GlyphSlot slot, + FT_Render_Mode mode ) + { + FT_Vector* sub = slot->library->lcd_geometry; + + if ( mode == FT_RENDER_MODE_LCD ) + { + cbox->xMin -= FT_MAX( FT_MAX( sub[0].x, sub[1].x ), sub[2].x ); + cbox->xMax -= FT_MIN( FT_MIN( sub[0].x, sub[1].x ), sub[2].x ); + cbox->yMin -= FT_MAX( FT_MAX( sub[0].y, sub[1].y ), sub[2].y ); + cbox->yMax -= FT_MIN( FT_MIN( sub[0].y, sub[1].y ), sub[2].y ); + } + else if ( mode == FT_RENDER_MODE_LCD_V ) + { + cbox->xMin -= FT_MAX( FT_MAX( sub[0].y, sub[1].y ), sub[2].y ); + cbox->xMax -= FT_MIN( FT_MIN( sub[0].y, sub[1].y ), sub[2].y ); + cbox->yMin += FT_MIN( FT_MIN( sub[0].x, sub[1].x ), sub[2].x ); + cbox->yMax += FT_MAX( FT_MAX( sub[0].x, sub[1].x ), sub[2].x ); + } + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + FT_UNUSED( library ); + FT_UNUSED( weights ); + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + FT_UNUSED( library ); + FT_UNUSED( filter ); + + return FT_THROW( Unimplemented_Feature ); + } + + + /* documentation in ftlcdfil.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdGeometry( FT_Library library, + FT_Vector sub[3] ) + { + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !sub ) + return FT_THROW( Invalid_Argument ); + + ft_memcpy( library->lcd_geometry, sub, 3 * sizeof( FT_Vector ) ); + + return FT_Err_Ok; + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + +/* END */ diff --git a/external/freetype/src/base/ftmac.c b/external/freetype/src/base/ftmac.c new file mode 100644 index 000000000..492d05538 --- /dev/null +++ b/external/freetype/src/base/ftmac.c @@ -0,0 +1,1090 @@ +/**************************************************************************** + * + * ftmac.c + * + * Mac FOND support. Written by just@letterror.com. + * Heavily modified by mpsuzuki, George Williams, and Sean McBride. + * + * This file is for Mac OS X only; see builds/mac/ftoldmac.c for + * classic platforms built by MPW. + * + * Copyright (C) 1996-2023 by + * Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* + Notes + + Mac suitcase files can (and often do!) contain multiple fonts. To + support this I use the face_index argument of FT_(Open|New)_Face() + functions, and pretend the suitcase file is a collection. + + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. + + The Mac FOND support works roughly like this: + + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. + + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. + + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) + + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). + + - Some suitcase fonts (notably Onyx) might point the `LWFN' file to + itself, even though it doesn't contains `POST' resources. To handle + this special case without opening the file an extra time, we just + ignore errors from the `LWFN' and fallback to the `sfnt' if both are + available. + */ + + +#include <freetype/freetype.h> +#include <freetype/tttags.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include "ftbase.h" + + +#ifdef FT_MACINTOSH + + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#if !HAVE_ANSI_OS_INLINE +#undef OS_INLINE +#define OS_INLINE static __inline__ +#endif + + /* `configure' checks the availability of `ResourceIndex' strictly */ + /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always. If it is */ + /* not set (e.g., a build without `configure'), the availability */ + /* is guessed from the SDK version. */ +#ifndef HAVE_TYPE_RESOURCE_INDEX +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) +#define HAVE_TYPE_RESOURCE_INDEX 0 +#else +#define HAVE_TYPE_RESOURCE_INDEX 1 +#endif +#endif /* !HAVE_TYPE_RESOURCE_INDEX */ + +#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) + typedef short ResourceIndex; +#endif + +#include <CoreServices/CoreServices.h> +#include <ApplicationServices/ApplicationServices.h> +#include <sys/syslimits.h> /* PATH_MAX */ + + /* Don't want warnings about our own use of deprecated functions. */ +#define FT_DEPRECATED_ATTRIBUTE + +#include <freetype/ftmac.h> + +#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ +#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault +#endif + + + /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over + TrueType in case *both* are available (this is not common, + but it *is* possible). */ +#ifndef PREFER_LWFN +#define PREFER_LWFN 1 +#endif + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_THROW( Unimplemented_Feature ); + } + + + /* Private function. */ + /* The FSSpec type has been discouraged for a long time, */ + /* unfortunately an FSRef replacement API for */ + /* ATSFontGetFileSpecification() is only available in */ + /* Mac OS X 10.5 and later. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { +#if defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + + OSStatus err; + + err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); + + return err; +#elif __LP64__ /* No 64bit Carbon API on legacy platforms */ + FT_UNUSED( ats_font_id ); + FT_UNUSED( ats_font_ref ); + + + return fnfErr; +#else /* 32bit Carbon API on legacy platforms */ + OSStatus err; + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); + + return err; +#endif + } + + + static FT_Error + FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, + FSRef* ats_font_ref, + FT_Long* face_index ) + { + CFStringRef cf_fontName; + ATSFontRef ats_font_id; + + + *face_index = 0; + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + CFRelease( cf_fontName ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) + return FT_THROW( Unknown_File_Format ); + + if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) + return FT_THROW( Unknown_File_Format ); + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ + { + ATSFontRef id2 = ats_font_id - 1; + FSRef ref2; + + + while ( id2 > 0 ) + { + if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) + break; + if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) + break; + + id2 --; + } + *face_index = ats_font_id - ( id2 + 1 ); + } + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + if ( !fontName || !face_index ) + return FT_THROW( Invalid_Argument); + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( err ) + return err; + + if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) + return FT_THROW( Unknown_File_Format ); + + return FT_Err_Ok; + } + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { +#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_THROW( Unimplemented_Feature ); +#else + FSRef ref; + FT_Error err; + + + if ( !fontName || !face_index ) + return FT_THROW( Invalid_Argument ); + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( err ) + return err; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, + pathSpec, NULL ) ) + return FT_THROW( Unknown_File_Format ); + + return FT_Err_Ok; +#endif + } + + + static OSErr + FT_FSPathMakeRes( const UInt8* pathname, + ResFileRefNum* res ) + { + OSErr err; + FSRef ref; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return FT_THROW( Cannot_Open_Resource ); + + /* at present, no support for dfont format */ + err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); + if ( noErr == err ) + return err; + + /* fallback to original resource-fork font */ + *res = FSOpenResFile( &ref, fsRdPerm ); + err = ResError(); + + return err; + } + + + /* Return the file type for given pathname */ + static OSType + get_file_type_from_path( const UInt8* pathname ) + { + FSRef ref; + FSCatalogInfo info; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, + NULL, NULL, NULL ) ) + return ( OSType ) 0; + + return ( (FInfo *)( info.finderInfo ) )->fdType; + } + + + /* Given a PostScript font name, create the Macintosh LWFN file name. */ + static void + create_lwfn_name( char* ps_name, + Str255 lwfn_file_name ) + { + int max = 5, count = 0; + FT_Byte* p = lwfn_file_name; + FT_Byte* q = (FT_Byte*)ps_name; + + + lwfn_file_name[0] = 0; + + while ( *q ) + { + if ( ft_isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + static short + count_faces_sfnt( char* fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return EndianS16_BtoN( *( (short*)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + } + + + static short + count_faces_scalable( char* fond_data ) + { + AsscEntry* assoc; + short i, face, face_all; + + + face_all = EndianS16_BtoN( *( (short *)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; + + for ( i = 0; i < face_all; i++ ) + { + if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) + face++; + } + return face; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. + + Thanks to Paul Miller (paulm@profoundeffects.com) for the fix + to load a face OTHER than the first one in the FOND! + */ + + + static void + parse_fond( char* fond_data, + short* have_sfnt, + ResID* sfnt_id, + Str255 lwfn_file_name, + short face_index ) + { + AsscEntry* assoc; + AsscEntry* base_assoc; + FamRec* fond; + + + *sfnt_id = 0; + *have_sfnt = 0; + lwfn_file_name[0] = 0; + + fond = (FamRec*)fond_data; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + base_assoc = assoc; + + /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ + if ( 47 < face_index ) + return; + + /* Let's do a little range checking before we get too excited here */ + if ( face_index < count_faces_sfnt( fond_data ) ) + { + assoc += face_index; /* add on the face_index! */ + + /* if the face at this index is not scalable, + fall back to the first one (old behavior) */ + if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( assoc->fontID ); + } + else if ( base_assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); + } + } + + if ( EndianS32_BtoN( fond->ffStylOff ) ) + { + unsigned char* p = (unsigned char*)fond_data; + StyleTable* style; + unsigned short string_count; + char ps_name[256]; + unsigned char* names[64]; + int i; + + + p += EndianS32_BtoN( fond->ffStylOff ); + style = (StyleTable*)p; + p += sizeof ( StyleTable ); + string_count = EndianS16_BtoN( *(short*)(p) ); + string_count = FT_MIN( 64, string_count ); + p += sizeof ( short ); + + for ( i = 0; i < string_count; i++ ) + { + names[i] = p; + p += names[i][0]; + p++; + } + + { + size_t ps_name_len = (size_t)names[0][0]; + + + if ( ps_name_len != 0 ) + { + ft_memcpy( ps_name, names[0] + 1, ps_name_len ); + ps_name[ps_name_len] = 0; + } + if ( style->indexes[face_index] > 1 && + style->indexes[face_index] <= string_count ) + { + unsigned char* suffixes = names[style->indexes[face_index] - 1]; + + + for ( i = 1; i <= suffixes[0]; i++ ) + { + unsigned char* s; + size_t j = suffixes[i] - 1; + + + if ( j < string_count && ( s = names[j] ) != NULL ) + { + size_t s_len = (size_t)s[0]; + + + if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) + { + ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); + ps_name_len += s_len; + ps_name[ps_name_len] = 0; + } + } + } + } + } + + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + static FT_Error + lookup_lwfn_by_fond( const UInt8* path_fond, + ConstStr255Param base_lwfn, + UInt8* path_lwfn, + size_t path_size ) + { + FSRef ref, par_ref; + size_t dirname_len; + + + /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ + /* We should not extract parent directory by string manipulation. */ + + if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) + return FT_THROW( Invalid_Argument ); + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, &par_ref ) ) + return FT_THROW( Invalid_Argument ); + + if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) + return FT_THROW( Invalid_Argument ); + + if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) + return FT_THROW( Invalid_Argument ); + + /* now we have absolute dirname in path_lwfn */ + ft_strcat( (char *)path_lwfn, "/" ); + dirname_len = ft_strlen( (char *)path_lwfn ); + ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; + + if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) + return FT_THROW( Cannot_Open_Resource ); + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, NULL ) ) + return FT_THROW( Cannot_Open_Resource ); + + return FT_Err_Ok; + } + + + static short + count_faces( Handle fond, + const UInt8* pathname ) + { + ResID sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[PATH_MAX]; + FT_Error err; + short num_faces; + + + have_sfnt = have_lwfn = 0; + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + + if ( lwfn_file_name[0] ) + { + err = lookup_lwfn_by_fond( pathname, lwfn_file_name, + buff, sizeof ( buff ) ); + if ( !err ) + have_lwfn = 1; + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + num_faces = 1; + else + num_faces = count_faces_scalable( *fond ); + + return num_faces; + } + + + /* Read Type 1 data from the POST resources inside the LWFN file, + return a PFB buffer. This is somewhat convoluted because the FT2 + PFB parser wants the ASCII header as one chunk, and the LWFN + chunks are often not organized that way, so we glue chunks + of the same type together. */ + static FT_Error + read_lwfn( FT_Memory memory, + ResFileRefNum res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + ResID res_id; + unsigned char *buffer, *p, *size_p = NULL; + FT_ULong total_size = 0; + FT_ULong old_total_size = 0; + FT_ULong post_size, pfb_chunk_size; + Handle post_data; + char code, last_code; + + + UseResFile( res ); + + /* First pass: load all POST resources, and determine the size of */ + /* the output buffer. */ + res_id = 501; + last_code = -1; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( !post_data ) + break; /* we are done */ + + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( code == 5 ) + total_size += 2; /* just the end code */ + else + total_size += 6; /* code + 4 bytes chunk length */ + } + + total_size += (FT_ULong)GetHandleSize( post_data ) - 2; + last_code = code; + + /* detect resource fork overflow */ + if ( FT_MAC_RFORK_MAX_LEN < total_size ) + { + error = FT_THROW( Array_Too_Large ); + goto Error; + } + + old_total_size = total_size; + } + + if ( FT_QALLOC( buffer, (FT_Long)total_size ) ) + goto Error; + + /* Second pass: append all POST data to the buffer, add PFB fields. */ + /* Glue all consecutive chunks of the same type together. */ + p = buffer; + res_id = 501; + last_code = -1; + pfb_chunk_size = 0; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( !post_data ) + break; /* we are done */ + + post_size = (FT_ULong)GetHandleSize( post_data ) - 2; + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( last_code != -1 ) + { + /* we are done adding a chunk, fill in the size field */ + if ( size_p ) + { + *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); + } + pfb_chunk_size = 0; + } + + *p++ = 0x80; + if ( code == 5 ) + *p++ = 0x03; /* the end */ + else if ( code == 2 ) + *p++ = 0x02; /* binary segment */ + else + *p++ = 0x01; /* ASCII segment */ + + if ( code != 5 ) + { + size_p = p; /* save for later */ + p += 4; /* make space for size field */ + } + } + + ft_memcpy( p, *post_data + 2, post_size ); + pfb_chunk_size += post_size; + p += post_size; + last_code = code; + } + + *pfb_data = buffer; + *size = total_size; + + Error: + CloseResFile( res ); + return error; + } + + + /* Create a new FT_Face from a file path to an LWFN file. */ + static FT_Error + FT_New_Face_From_LWFN( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Byte* pfb_data; + FT_ULong pfb_size; + FT_Error error; + ResFileRefNum res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) + return FT_THROW( Cannot_Open_Resource ); + + pfb_data = NULL; + pfb_size = 0; + error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); + CloseResFile( res ); /* PFB is already loaded, useless anymore */ + if ( error ) + return error; + + return open_face_from_buffer( library, + pfb_data, + pfb_size, + face_index, + "type1", + aface ); + } + + + /* Create a new FT_Face from an SFNT resource, specified by res ID. */ + static FT_Error + FT_New_Face_From_SFNT( FT_Library library, + ResID sfnt_id, + FT_Long face_index, + FT_Face* aface ) + { + Handle sfnt = NULL; + FT_Byte* sfnt_data; + size_t sfnt_size; + FT_Error error = FT_Err_Ok; + FT_Memory memory = library->memory; + int is_cff, is_sfnt_ps; + + + sfnt = GetResource( TTAG_sfnt, sfnt_id ); + if ( !sfnt ) + return FT_THROW( Invalid_Handle ); + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + + /* detect resource fork overflow */ + if ( FT_MAC_RFORK_MAX_LEN < sfnt_size ) + return FT_THROW( Array_Too_Large ); + + if ( FT_QALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + ft_memcpy( sfnt_data, *sfnt, sfnt_size ); + ReleaseResource( sfnt ); + + is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); + + if ( is_sfnt_ps ) + { + FT_Stream stream; + + + if ( FT_NEW( stream ) ) + goto Try_OpenType; + + FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); + if ( !open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ) ) + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + FT_FREE( sfnt_data ); + goto Exit; + } + + FT_FREE( stream ); + } + Try_OpenType: + error = open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + Exit: + return error; + } + + + /* Create a new FT_Face from a file path to a suitcase file. */ + static FT_Error + FT_New_Face_From_Suitcase( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error = FT_ERR( Cannot_Open_Resource ); + ResFileRefNum res_ref; + ResourceIndex res_index; + Handle fond; + short num_faces_in_res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) + return FT_THROW( Cannot_Open_Resource ); + + UseResFile( res_ref ); + if ( ResError() ) + return FT_THROW( Cannot_Open_Resource ); + + num_faces_in_res = 0; + for ( res_index = 1; ; res_index++ ) + { + short num_faces_in_fond; + + + fond = Get1IndResource( TTAG_FOND, res_index ); + if ( ResError() ) + break; + + num_faces_in_fond = count_faces( fond, pathname ); + num_faces_in_res += num_faces_in_fond; + + if ( 0 <= face_index && face_index < num_faces_in_fond && error ) + error = FT_New_Face_From_FOND( library, fond, face_index, aface ); + + face_index -= num_faces_in_fond; + } + + CloseResFile( res_ref ); + if ( !error && aface && *aface ) + (*aface)->num_faces = num_faces_in_res; + return error; + } + + + /* documentation is in ftmac.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face* aface ) + { + short have_sfnt, have_lwfn = 0; + ResID sfnt_id, fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[PATH_MAX]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + /* check of `library' and `aface' delayed to `FT_New_Face_From_XXX' */ + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != TTAG_FOND ) + return FT_THROW( Invalid_File_Format ); + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); + + if ( lwfn_file_name[0] ) + { + ResFileRefNum res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + + { + UInt8 path_fond[PATH_MAX]; + FSRef ref; + + + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, + NULL, NULL, NULL, &ref, NULL ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( !error ) + have_lwfn = 1; + } + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + error = FT_New_Face_From_LWFN( library, + path_lwfn, + face_index, + aface ); + else + error = FT_THROW( Unknown_File_Format ); + + found_no_lwfn_file: + if ( have_sfnt && error ) + error = FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return error; + } + + + /* Common function to load a new FT_Face from a resource file. */ + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + OSType file_type; + FT_Error error; + + + /* LWFN is a (very) specific file format, check for it explicitly */ + file_type = get_file_type_from_path( pathname ); + if ( file_type == TTAG_LWFN ) + return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); + if ( error ) + { + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + } + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * FT_New_Face + * + * @Description: + * This is the Mac-specific implementation of FT_New_Face. In + * addition to the standard FT_New_Face() functionality, it also + * accepts pathnames to Mac suitcase files. For further + * documentation see the original FT_New_Face() in freetype.h. + */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_THROW( Invalid_Argument ); + + *aface = NULL; + + /* try resourcefork based font: LWFN, FFIL */ + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); + if ( error || *aface ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /************************************************************************** + * + * @Function: + * FT_New_Face_From_FSRef + * + * @Description: + * FT_New_Face_From_FSRef is identical to FT_New_Face except it + * accepts an FSRef instead of a path. + * + * This function is deprecated because Carbon data types (FSRef) + * are not cross-platform, and thus not suitable for the FreeType API. + */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef* ref, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error; + FT_Open_Args args; + + OSErr err; + UInt8 pathname[PATH_MAX]; + + + /* check of `library' and `aface' delayed to */ + /* `FT_New_Face_From_Resource' */ + + if ( !ref ) + return FT_THROW( Invalid_Argument ); + + err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_THROW( Cannot_Open_Resource ); + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error || *aface ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /************************************************************************** + * + * @Function: + * FT_New_Face_From_FSSpec + * + * @Description: + * FT_New_Face_From_FSSpec is identical to FT_New_Face except it + * accepts an FSSpec instead of a path. + * + * This function is deprecated because FSSpec is deprecated in Mac OS X + */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { +#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) + FT_UNUSED( library ); + FT_UNUSED( spec ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_THROW( Unimplemented_Feature ); +#else + FSRef ref; + + + /* check of `library' and `aface' delayed to `FT_New_Face_From_FSRef' */ + + if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) + return FT_THROW( Invalid_Argument ); + else + return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); +#endif + } + +#else /* !FT_MACINTOSH */ + + /* ANSI C doesn't like empty source files */ + typedef int ft_mac_dummy_; + +#endif /* !FT_MACINTOSH */ + + +/* END */ diff --git a/external/freetype/src/base/ftmm.c b/external/freetype/src/base/ftmm.c new file mode 100644 index 000000000..9e2dd7ee7 --- /dev/null +++ b/external/freetype/src/base/ftmm.c @@ -0,0 +1,704 @@ +/**************************************************************************** + * + * ftmm.c + * + * Multiple Master font support (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftmm.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svmm.h> +#include <freetype/internal/services/svmetric.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT mm + + + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + error = FT_ERR( Invalid_Argument ); + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + static FT_Error + ft_face_get_mvar_service( FT_Face face, + FT_Service_MetricsVariations *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + error = FT_ERR( Invalid_Argument ); + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + METRICS_VARIATIONS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !amaster ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm ) + error = service->get_mm( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !amaster ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_var ) + error = service->get_mm_var( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_MM_Var( FT_Library library, + FT_MM_Var* amaster ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + memory = library->memory; + FT_FREE( amaster ); + + return FT_Err_Ok; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); + + if ( !error ) + { + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + } + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_WeightVector( FT_Face face, + FT_UInt len, + FT_Fixed* weightvector ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( len && !weightvector ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->set_mm_weightvector ) + error = service->set_mm_weightvector( face, len, weightvector ); + + if ( !error ) + { + if ( len ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + } + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_WeightVector( FT_Face face, + FT_UInt* len, + FT_Fixed* weightvector ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( len && !weightvector ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_weightvector ) + error = service->get_mm_weightvector( face, len, weightvector ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_var_design ) + error = service_mm->set_var_design( face, num_coords, coords ); + + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_var_design ) + error = service->get_var_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_mm_blend ) + error = service_mm->set_mm_blend( face, num_coords, coords ); + + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_mm_blend ) + error = service_mm->set_mm_blend( face, num_coords, coords ); + + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_blend ) + error = service->get_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_blend ) + error = service->get_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Axis_Flags( FT_MM_Var* master, + FT_UInt axis_index, + FT_UInt* flags ) + { + FT_UShort* axis_flags; + + + if ( !master || !flags ) + return FT_THROW( Invalid_Argument ); + + if ( axis_index >= master->num_axis ) + return FT_THROW( Invalid_Argument ); + + /* the axis flags array immediately follows the data of `master' */ + axis_flags = (FT_UShort*)&( master[1] ); + *flags = axis_flags[axis_index]; + + return FT_Err_Ok; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ) + { + FT_Error error; + + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_named_instance ) + error = service_mm->set_named_instance( face, instance_index ); + + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + face->face_index = ( instance_index << 16 ) | + ( face->face_index & 0xFFFFL ); + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ) + { + FT_Error error; + + FT_Service_MultiMasters service_mm = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + /* no error if `get_default_named_instance` is not available */ + if ( service_mm->get_default_named_instance ) + error = service_mm->get_default_named_instance( face, + instance_index ); + else + error = FT_Err_Ok; + } + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftobjs.c b/external/freetype/src/base/ftobjs.c new file mode 100644 index 000000000..89a25bc73 --- /dev/null +++ b/external/freetype/src/base/ftobjs.c @@ -0,0 +1,5914 @@ +/**************************************************************************** + * + * ftobjs.c + * + * The FreeType private base classes (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftlist.h> +#include <freetype/ftoutln.h> +#include <freetype/ftfntfmt.h> +#include <freetype/otsvg.h> + +#include <freetype/internal/ftvalid.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftrfork.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/sfnt.h> /* for SFNT_Load_Table_Func */ +#include <freetype/internal/psaux.h> /* for PS_Driver */ +#include <freetype/internal/svginterface.h> + +#include <freetype/tttables.h> +#include <freetype/tttags.h> +#include <freetype/ttnameid.h> + +#include <freetype/internal/services/svprop.h> +#include <freetype/internal/services/svsfnt.h> +#include <freetype/internal/services/svpostnm.h> +#include <freetype/internal/services/svgldict.h> +#include <freetype/internal/services/svttcmap.h> +#include <freetype/internal/services/svkern.h> +#include <freetype/internal/services/svtteng.h> + +#include <freetype/ftdriver.h> + +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#include "ftbase.h" +#endif + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#include <freetype/ftbitmap.h> + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `conversion from XXX to YYY, */ + /* possible loss of data' in order to compile cleanly with */ + /* the maximum level of warnings: `md5.c' is non-FreeType */ + /* code, and it gets used during development builds only. */ +#pragma warning( push ) +#pragma warning( disable : 4244 ) +#endif /* _MSC_VER */ + + /* It's easiest to include `md5.c' directly. However, since OpenSSL */ + /* also provides the same functions, there might be conflicts if */ + /* both FreeType and OpenSSL are built as static libraries. For */ + /* this reason, we put the MD5 stuff into the `FT_' namespace. */ +#define MD5_u32plus FT_MD5_u32plus +#define MD5_CTX FT_MD5_CTX +#define MD5_Init FT_MD5_Init +#define MD5_Update FT_MD5_Update +#define MD5_Final FT_MD5_Final + +#undef HAVE_OPENSSL + +#include "md5.c" + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + + /* This array must stay in sync with the @FT_Pixel_Mode enumeration */ + /* (in file `ftimage.h`). */ + + static const char* const pixel_modes[] = + { + "none", + "monochrome bitmap", + "gray 8-bit bitmap", + "gray 2-bit bitmap", + "gray 4-bit bitmap", + "LCD 8-bit bitmap", + "vertical LCD 8-bit bitmap", + "BGRA 32-bit color image bitmap", + "SDF 8-bit bitmap" + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + +#define GRID_FIT_METRICS + + + /* forward declaration */ + static FT_Error + ft_open_face_internal( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface, + FT_Bool test_mac_fonts ); + + + FT_BASE_DEF( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ) + { + FT_Pointer result = NULL; + FT_ServiceDesc desc = service_descriptors; + + + if ( desc && service_id ) + { + for ( ; desc->serv_id != NULL; desc++ ) + { + if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) + { + result = (FT_Pointer)desc->serv_data; + break; + } + } + } + + return result; + } + + + FT_BASE_DEF( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ) + { + valid->base = base; + valid->limit = limit; + valid->level = level; + valid->error = FT_Err_Ok; + } + + + FT_BASE_DEF( FT_Int ) + ft_validator_run( FT_Validator valid ) + { + /* This function doesn't work! None should call it. */ + FT_UNUSED( valid ); + + return -1; + } + + + FT_BASE_DEF( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ) + { + /* since the cast below also disables the compiler's */ + /* type check, we introduce a dummy variable, which */ + /* will be optimized away */ + volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; + + + valid->error = error; + + /* throw away volatileness; use `jump_buffer' or the */ + /* compiler may warn about an unused local variable */ + ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S T R E A M ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new input stream from an FT_Open_Args structure */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream = NULL; + FT_UInt mode; + + + *astream = NULL; + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !args ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + mode = args->flags & + ( FT_OPEN_MEMORY | FT_OPEN_STREAM | FT_OPEN_PATHNAME ); + + if ( mode == FT_OPEN_MEMORY ) + { + /* create a memory-based stream */ + if ( FT_NEW( stream ) ) + goto Exit; + + FT_Stream_OpenMemory( stream, + (const FT_Byte*)args->memory_base, + (FT_ULong)args->memory_size ); + stream->memory = memory; + } + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + + else if ( mode == FT_OPEN_PATHNAME ) + { + /* create a normal system stream */ + if ( FT_NEW( stream ) ) + goto Exit; + + stream->memory = memory; + error = FT_Stream_Open( stream, args->pathname ); + if ( error ) + FT_FREE( stream ); + } + else if ( ( mode == FT_OPEN_STREAM ) && args->stream ) + { + /* use an existing, user-provided stream */ + + /* in this case, we do not need to allocate a new stream object */ + /* since the caller is responsible for closing it himself */ + stream = args->stream; + stream->memory = memory; + error = FT_Err_Ok; + } + +#endif + + else + { + error = FT_THROW( Invalid_Argument ); + if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) + FT_Stream_Close( args->stream ); + } + + if ( !error ) + *astream = stream; + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ) + { + if ( stream ) + { + FT_Memory memory = stream->memory; + + + FT_Stream_Close( stream ); + + if ( !external ) + FT_FREE( stream ); + } + } + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT objs + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ft_glyphslot_init( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + FT_Error error = FT_Err_Ok; + FT_Slot_Internal internal = NULL; + + + slot->library = driver->root.library; + + if ( FT_NEW( internal ) ) + goto Exit; + + slot->internal = internal; + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + error = FT_GlyphLoader_New( memory, &internal->loader ); + + if ( !error && clazz->init_slot ) + error = clazz->init_slot( slot ); + +#ifdef FT_CONFIG_OPTION_SVG + /* if SVG table exists, allocate the space in `slot->other` */ + if ( slot->face->face_flags & FT_FACE_FLAG_SVG ) + { + FT_SVG_Document document = NULL; + + + if ( FT_NEW( document ) ) + goto Exit; + slot->other = document; + } +#endif + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) + { + if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FT_FREE( slot->bitmap.buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* assume that the bitmap buffer was stolen or not */ + /* allocated from the heap */ + slot->bitmap.buffer = NULL; + } + } + + + /* overflow-resistant presetting of bitmap position and dimensions; */ + /* also check whether the size is too large for rendering */ + FT_BASE_DEF( FT_Bool ) + ft_glyphslot_preset_bitmap( FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + + FT_Pixel_Mode pixel_mode; + + FT_BBox cbox, pbox; + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + FT_Pos x_left, y_top; + FT_Pos width, height, pitch; + + + if ( slot->format == FT_GLYPH_FORMAT_SVG ) + { + FT_Module module; + SVG_Service svg_service; + + + module = FT_Get_Module( slot->library, "ot-svg" ); + svg_service = (SVG_Service)module->clazz->module_interface; + + return (FT_Bool)svg_service->preset_slot( module, slot, FALSE ); + } + else if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + return 1; + + if ( origin ) + { + x_shift = origin->x; + y_shift = origin->y; + } + + /* compute the control box, and grid-fit it, */ + /* taking into account the origin shift */ + FT_Outline_Get_CBox( outline, &cbox ); + + /* rough estimate of pixel box */ + pbox.xMin = ( cbox.xMin >> 6 ) + ( x_shift >> 6 ); + pbox.yMin = ( cbox.yMin >> 6 ) + ( y_shift >> 6 ); + pbox.xMax = ( cbox.xMax >> 6 ) + ( x_shift >> 6 ); + pbox.yMax = ( cbox.yMax >> 6 ) + ( y_shift >> 6 ); + + /* tiny remainder box */ + cbox.xMin = ( cbox.xMin & 63 ) + ( x_shift & 63 ); + cbox.yMin = ( cbox.yMin & 63 ) + ( y_shift & 63 ); + cbox.xMax = ( cbox.xMax & 63 ) + ( x_shift & 63 ); + cbox.yMax = ( cbox.yMax & 63 ) + ( y_shift & 63 ); + + switch ( mode ) + { + case FT_RENDER_MODE_MONO: + pixel_mode = FT_PIXEL_MODE_MONO; +#if 1 + /* x */ + + /* undocumented but confirmed: bbox values get rounded; */ + /* we do asymmetric rounding so that the center of a pixel */ + /* gets always included */ + + pbox.xMin += ( cbox.xMin + 31 ) >> 6; + pbox.xMax += ( cbox.xMax + 32 ) >> 6; + + /* if the bbox collapsed, we add a pixel based on the total */ + /* rounding remainder to cover most of the original cbox */ + + if ( pbox.xMin == pbox.xMax ) + { + if ( ( ( cbox.xMin + 31 ) & 63 ) - 31 + + ( ( cbox.xMax + 32 ) & 63 ) - 32 < 0 ) + pbox.xMin -= 1; + else + pbox.xMax += 1; + } + + /* y */ + + pbox.yMin += ( cbox.yMin + 31 ) >> 6; + pbox.yMax += ( cbox.yMax + 32 ) >> 6; + + if ( pbox.yMin == pbox.yMax ) + { + if ( ( ( cbox.yMin + 31 ) & 63 ) - 31 + + ( ( cbox.yMax + 32 ) & 63 ) - 32 < 0 ) + pbox.yMin -= 1; + else + pbox.yMax += 1; + } + + break; +#else + goto Adjust; +#endif + + case FT_RENDER_MODE_LCD: + pixel_mode = FT_PIXEL_MODE_LCD; + ft_lcd_padding( &cbox, slot, mode ); + goto Adjust; + + case FT_RENDER_MODE_LCD_V: + pixel_mode = FT_PIXEL_MODE_LCD_V; + ft_lcd_padding( &cbox, slot, mode ); + goto Adjust; + + case FT_RENDER_MODE_NORMAL: + case FT_RENDER_MODE_LIGHT: + default: + pixel_mode = FT_PIXEL_MODE_GRAY; + Adjust: + pbox.xMin += cbox.xMin >> 6; + pbox.yMin += cbox.yMin >> 6; + pbox.xMax += ( cbox.xMax + 63 ) >> 6; + pbox.yMax += ( cbox.yMax + 63 ) >> 6; + } + + x_left = pbox.xMin; + y_top = pbox.yMax; + + width = pbox.xMax - pbox.xMin; + height = pbox.yMax - pbox.yMin; + + switch ( pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + pitch = ( ( width + 15 ) >> 4 ) << 1; + break; + + case FT_PIXEL_MODE_LCD: + width *= 3; + pitch = FT_PAD_CEIL( width, 4 ); + break; + + case FT_PIXEL_MODE_LCD_V: + height *= 3; + FALL_THROUGH; + + case FT_PIXEL_MODE_GRAY: + default: + pitch = width; + } + + slot->bitmap_left = (FT_Int)x_left; + slot->bitmap_top = (FT_Int)y_top; + + bitmap->pixel_mode = (unsigned char)pixel_mode; + bitmap->num_grays = 256; + bitmap->width = (unsigned int)width; + bitmap->rows = (unsigned int)height; + bitmap->pitch = pitch; + + if ( pbox.xMin < -0x8000 || pbox.xMax > 0x7FFF || + pbox.yMin < -0x8000 || pbox.yMax > 0x7FFF ) + { + FT_TRACE3(( "ft_glyphslot_preset_bitmap: [%ld %ld %ld %ld]\n", + pbox.xMin, pbox.yMin, pbox.xMax, pbox.yMax )); + return 1; + } + + return 0; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ) + { + ft_glyphslot_free_bitmap( slot ); + + slot->bitmap.buffer = buffer; + + FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); + } + + + FT_BASE_DEF( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Error error; + + + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( slot->bitmap.buffer ); + else + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + FT_MEM_ALLOC( slot->bitmap.buffer, size ); + return error; + } + + + static void + ft_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + slot->glyph_index = 0; + + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + + slot->bitmap.width = 0; + slot->bitmap.rows = 0; + slot->bitmap.pitch = 0; + slot->bitmap.pixel_mode = 0; + /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = NULL; + slot->control_data = NULL; + slot->control_len = 0; + +#ifndef FT_CONFIG_OPTION_SVG + slot->other = NULL; +#else + if ( !( slot->face->face_flags & FT_FACE_FLAG_SVG ) ) + slot->other = NULL; + else + { + if ( slot->internal->flags & FT_GLYPH_OWN_GZIP_SVG ) + { + FT_Memory memory = slot->face->memory; + FT_SVG_Document doc = (FT_SVG_Document)slot->other; + + + FT_FREE( doc->svg_document ); + slot->internal->flags &= ~FT_GLYPH_OWN_GZIP_SVG; + } + } +#endif + + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + slot->advance.x = 0; + slot->advance.y = 0; + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + + + static void + ft_glyphslot_done( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + +#ifdef FT_CONFIG_OPTION_SVG + if ( slot->face->face_flags & FT_FACE_FLAG_SVG ) + { + /* Free memory in case SVG was there. */ + /* `slot->internal` might be NULL in out-of-memory situations. */ + if ( slot->internal && slot->internal->flags & FT_GLYPH_OWN_GZIP_SVG ) + { + FT_SVG_Document doc = (FT_SVG_Document)slot->other; + + + FT_FREE( doc->svg_document ); + + slot->internal->flags &= ~FT_GLYPH_OWN_GZIP_SVG; + } + + FT_FREE( slot->other ); + } +#endif + + if ( clazz->done_slot ) + clazz->done_slot( slot ); + + /* free bitmap buffer if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* slot->internal might be NULL in out-of-memory situations */ + if ( slot->internal ) + { + /* free glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + FT_GlyphLoader_Done( slot->internal->loader ); + slot->internal->loader = NULL; + } + + FT_FREE( slot->internal ); + } + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ) + { + FT_Error error; + FT_Driver driver; + FT_Driver_Class clazz; + FT_Memory memory; + FT_GlyphSlot slot = NULL; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !face->driver ) + return FT_THROW( Invalid_Argument ); + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); + if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) + { + slot->face = face; + + error = ft_glyphslot_init( slot ); + if ( error ) + { + ft_glyphslot_done( slot ); + FT_FREE( slot ); + goto Exit; + } + + slot->next = face->glyph; + face->glyph = slot; + + if ( aslot ) + *aslot = slot; + } + else if ( aslot ) + *aslot = NULL; + + + Exit: + FT_TRACE4(( "FT_New_GlyphSlot: Return 0x%x\n", error )); + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ) + { + if ( slot ) + { + FT_Driver driver = slot->face->driver; + FT_Memory memory = driver->root.memory; + FT_GlyphSlot prev; + FT_GlyphSlot cur; + + + /* Remove slot from its parent face's list */ + prev = NULL; + cur = slot->face->glyph; + + while ( cur ) + { + if ( cur == slot ) + { + if ( !prev ) + slot->face->glyph = cur->next; + else + prev->next = cur->next; + + /* finalize client-specific data */ + if ( slot->generic.finalizer ) + slot->generic.finalizer( slot ); + + ft_glyphslot_done( slot ); + FT_FREE( slot ); + break; + } + prev = cur; + cur = cur->next; + } + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Face_Internal internal; + + + if ( !face ) + return; + + internal = face->internal; + + internal->transform_flags = 0; + + if ( !matrix ) + { + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + matrix = &internal->transform_matrix; + } + else + internal->transform_matrix = *matrix; + + /* set transform_flags bit flag 0 if `matrix' isn't the identity */ + if ( ( matrix->xy | matrix->yx ) || + matrix->xx != 0x10000L || + matrix->yy != 0x10000L ) + internal->transform_flags |= 1; + + if ( !delta ) + { + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + + delta = &internal->transform_delta; + } + else + internal->transform_delta = *delta; + + /* set transform_flags bit flag 1 if `delta' isn't the null vector */ + if ( delta->x | delta->y ) + internal->transform_flags |= 2; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Get_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Face_Internal internal; + + + if ( !face ) + return; + + internal = face->internal; + + if ( matrix ) + *matrix = internal->transform_matrix; + + if ( delta ) + *delta = internal->transform_delta; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ); + + +#ifdef GRID_FIT_METRICS + static void + ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, + FT_Bool vertical ) + { + FT_Glyph_Metrics* metrics = &slot->metrics; + FT_Pos right, bottom; + + + if ( vertical ) + { + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY ); + + right = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingX, + metrics->width ) ); + bottom = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingY, + metrics->height ) ); + + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + metrics->width = SUB_LONG( right, + metrics->vertBearingX ); + metrics->height = SUB_LONG( bottom, + metrics->vertBearingY ); + } + else + { + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + right = FT_PIX_CEIL_LONG( ADD_LONG( metrics->horiBearingX, + metrics->width ) ); + bottom = FT_PIX_FLOOR( SUB_LONG( metrics->horiBearingY, + metrics->height ) ); + + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY ); + + metrics->width = SUB_LONG( right, + metrics->horiBearingX ); + metrics->height = SUB_LONG( metrics->horiBearingY, + bottom ); + } + + metrics->horiAdvance = FT_PIX_ROUND_LONG( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND_LONG( metrics->vertAdvance ); + } +#endif /* GRID_FIT_METRICS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + FT_Driver driver; + FT_GlyphSlot slot; + FT_Library library; + FT_Bool autohint = FALSE; + FT_Module hinter; + TT_Face ttface = (TT_Face)face; + + + if ( !face || !face->size || !face->glyph ) + return FT_THROW( Invalid_Face_Handle ); + + /* The validity test for `glyph_index' is performed by the */ + /* font drivers. */ + + slot = face->glyph; + ft_glyphslot_clear( slot ); + + driver = face->driver; + library = driver->root.library; + hinter = library->auto_hinter; + + /* undefined scale means no scale */ + if ( face->size->metrics.x_ppem == 0 || + face->size->metrics.y_ppem == 0 ) + load_flags |= FT_LOAD_NO_SCALE; + + /* resolve load flags dependencies */ + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM; + + if ( load_flags & FT_LOAD_NO_SCALE ) + { + load_flags |= FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP; + + load_flags &= ~FT_LOAD_RENDER; + } + + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + load_flags &= ~FT_LOAD_RENDER; + + /* + * Determine whether we need to auto-hint or not. + * The general rules are: + * + * - Do only auto-hinting if we have + * + * - a hinter module, + * - a scalable font, + * - not a tricky font, and + * - no transforms except simple slants and/or rotations by + * integer multiples of 90 degrees. + * + * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't + * have a native font hinter. + * + * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't + * any hinting bytecode in the TrueType/OpenType font. + * + * - Exception: The font is `tricky' and requires the native hinter to + * load properly. + */ + + if ( hinter && + !( load_flags & FT_LOAD_NO_HINTING ) && + !( load_flags & FT_LOAD_NO_AUTOHINT ) && + FT_IS_SCALABLE( face ) && + !FT_IS_TRICKY( face ) && + ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) || + ( face->internal->transform_matrix.yx == 0 && + face->internal->transform_matrix.xx != 0 ) || + ( face->internal->transform_matrix.xx == 0 && + face->internal->transform_matrix.yx != 0 ) ) ) + { + if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || + !FT_DRIVER_HAS_HINTER( driver ) ) + autohint = TRUE; + else + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + FT_Bool is_light_type1; + + + /* only the new Adobe engine (for both CFF and Type 1) is `light'; */ + /* we use `strstr' to catch both `Type 1' and `CID Type 1' */ + is_light_type1 = + ft_strstr( FT_Get_Font_Format( face ), "Type 1" ) != NULL && + ((PS_Driver)driver)->hinting_engine == FT_HINTING_ADOBE; + + /* the check for `num_locations' assures that we actually */ + /* test for instructions in a TTF and not in a CFF-based OTF */ + /* */ + /* since `maxSizeOfInstructions' might be unreliable, we */ + /* check the size of the `fpgm' and `prep' tables, too -- */ + /* the assumption is that there don't exist real TTFs where */ + /* both `fpgm' and `prep' tables are missing */ + if ( ( mode == FT_RENDER_MODE_LIGHT && + ( !FT_DRIVER_HINTS_LIGHTLY( driver ) && + !is_light_type1 ) ) || + ( FT_IS_SFNT( face ) && + ttface->num_locations && + ttface->max_profile.maxSizeOfInstructions == 0 && + ttface->font_program_size == 0 && + ttface->cvt_program_size == 0 ) ) + autohint = TRUE; + } + } + + if ( autohint ) + { + FT_AutoHinter_Interface hinting; + + + /* XXX: The use of the `FT_LOAD_XXX_ONLY` flags is not very */ + /* elegant. */ + + /* try to load SVG documents if available */ + if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 && + FT_HAS_SVG( face ) ) + { + error = driver->clazz->load_glyph( slot, face->size, + glyph_index, + load_flags | FT_LOAD_SVG_ONLY ); + + if ( !error && slot->format == FT_GLYPH_FORMAT_SVG ) + goto Load_Ok; + } + + /* try to load embedded bitmaps if available */ + if ( FT_HAS_FIXED_SIZES( face ) && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = driver->clazz->load_glyph( slot, face->size, + glyph_index, + load_flags | FT_LOAD_SBITS_ONLY ); + + if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) + goto Load_Ok; + } + + { + FT_Face_Internal internal = face->internal; + FT_Int transform_flags = internal->transform_flags; + + + /* since the auto-hinter calls FT_Load_Glyph by itself, */ + /* make sure that glyphs aren't transformed */ + internal->transform_flags = 0; + + /* load auto-hinted outline */ + hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface; + + error = hinting->load_glyph( (FT_AutoHinter)hinter, + slot, face->size, + glyph_index, load_flags ); + + internal->transform_flags = transform_flags; + } + } + else + { + error = driver->clazz->load_glyph( slot, + face->size, + glyph_index, + load_flags ); + if ( error ) + goto Exit; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* check that the loaded outline is correct */ + error = FT_Outline_Check( &slot->outline ); + if ( error ) + goto Exit; + +#ifdef GRID_FIT_METRICS + if ( !( load_flags & FT_LOAD_NO_HINTING ) ) + ft_glyphslot_grid_fit_metrics( + slot, + FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); +#endif + } + } + + Load_Ok: + /* compute the advance */ + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + slot->advance.x = 0; + slot->advance.y = slot->metrics.vertAdvance; + } + else + { + slot->advance.x = slot->metrics.horiAdvance; + slot->advance.y = 0; + } + + /* compute the linear advance in 16.16 pixels */ + if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && + FT_IS_SCALABLE( face ) ) + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + /* it's tricky! */ + slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, + metrics->x_scale, 64 ); + + slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, + metrics->y_scale, 64 ); + } + + if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) + { + FT_Face_Internal internal = face->internal; + + + /* now, transform the glyph image if needed */ + if ( internal->transform_flags ) + { + /* get renderer */ + FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); + + + if ( renderer ) + error = renderer->clazz->transform_glyph( + renderer, slot, + &internal->transform_matrix, + &internal->transform_delta ); + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* apply `standard' transformation if no renderer is available */ + if ( internal->transform_flags & 1 ) + FT_Outline_Transform( &slot->outline, + &internal->transform_matrix ); + + if ( internal->transform_flags & 2 ) + FT_Outline_Translate( &slot->outline, + internal->transform_delta.x, + internal->transform_delta.y ); + } + + /* transform advance */ + FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); + } + } + + slot->glyph_index = glyph_index; + slot->internal->load_flags = load_flags; + + /* do we need to render the image or preset the bitmap now? */ + if ( !error && + ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + slot->format != FT_GLYPH_FORMAT_BITMAP && + slot->format != FT_GLYPH_FORMAT_COMPOSITE ) + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_NORMAL && + load_flags & FT_LOAD_MONOCHROME ) + mode = FT_RENDER_MODE_MONO; + + if ( load_flags & FT_LOAD_RENDER ) + error = FT_Render_Glyph( slot, mode ); + else + ft_glyphslot_preset_bitmap( slot, mode, NULL ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( "FT_Load_Glyph: index %d, flags 0x%x\n", + glyph_index, load_flags )); + FT_TRACE5(( " bitmap %dx%d %s, %s (mode %d)\n", + slot->bitmap.width, + slot->bitmap.rows, + slot->outline.points ? + slot->bitmap.buffer ? "rendered" + : "preset" + : + slot->internal->flags & FT_GLYPH_OWN_BITMAP ? "owned" + : "unowned", + pixel_modes[slot->bitmap.pixel_mode], + slot->bitmap.pixel_mode )); + FT_TRACE5(( "\n" )); + FT_TRACE5(( " x advance: %f\n", (double)slot->advance.x / 64 )); + FT_TRACE5(( " y advance: %f\n", (double)slot->advance.y / 64 )); + FT_TRACE5(( " linear x advance: %f\n", + (double)slot->linearHoriAdvance / 65536 )); + FT_TRACE5(( " linear y advance: %f\n", + (double)slot->linearVertAdvance / 65536 )); + + { + FT_Glyph_Metrics* metrics = &slot->metrics; + + + FT_TRACE5(( " metrics:\n" )); + FT_TRACE5(( " width: %f\n", (double)metrics->width / 64 )); + FT_TRACE5(( " height: %f\n", (double)metrics->height / 64 )); + FT_TRACE5(( "\n" )); + FT_TRACE5(( " horiBearingX: %f\n", + (double)metrics->horiBearingX / 64 )); + FT_TRACE5(( " horiBearingY: %f\n", + (double)metrics->horiBearingY / 64 )); + FT_TRACE5(( " horiAdvance: %f\n", + (double)metrics->horiAdvance / 64 )); + FT_TRACE5(( "\n" )); + FT_TRACE5(( " vertBearingX: %f\n", + (double)metrics->vertBearingX / 64 )); + FT_TRACE5(( " vertBearingY: %f\n", + (double)metrics->vertBearingY / 64 )); + FT_TRACE5(( " vertAdvance: %f\n", + (double)metrics->vertAdvance / 64 )); + } +#endif + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ) + { + FT_UInt glyph_index; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + glyph_index = (FT_UInt)char_code; + if ( face->charmap ) + glyph_index = FT_Get_Char_Index( face, char_code ); + + return FT_Load_Glyph( face, glyph_index, load_flags ); + } + + + /* destructor for sizes list */ + static void + destroy_size( FT_Memory memory, + void* size_, + void* driver_ ) + { + FT_Size size = (FT_Size)size_; + FT_Driver driver = (FT_Driver)driver_; + + + /* finalize client-specific data */ + if ( size->generic.finalizer ) + size->generic.finalizer( size ); + + /* finalize format-specific stuff */ + if ( driver->clazz->done_size ) + driver->clazz->done_size( size ); + + FT_FREE( size->internal ); + FT_FREE( size ); + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ); + + + static void + destroy_charmaps( FT_Face face, + FT_Memory memory ) + { + FT_Int n; + + + if ( !face ) + return; + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + ft_cmap_done_internal( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + + /* destructor for faces list */ + static void + destroy_face( FT_Memory memory, + void* face_, + void* driver_ ) + { + FT_Face face = (FT_Face)face_; + FT_Driver driver = (FT_Driver)driver_; + FT_Driver_Class clazz = driver->clazz; + + + /* discard auto-hinting data */ + if ( face->autohint.finalizer ) + face->autohint.finalizer( face->autohint.data ); + + /* Discard glyph slots for this face. */ + /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ + while ( face->glyph ) + FT_Done_GlyphSlot( face->glyph ); + + /* discard all sizes for this face */ + FT_List_Finalize( &face->sizes_list, + destroy_size, + memory, + driver ); + face->size = NULL; + + /* now discard client data */ + if ( face->generic.finalizer ) + face->generic.finalizer( face ); + + /* discard charmaps */ + destroy_charmaps( face, memory ); + + /* finalize format-specific stuff */ + if ( clazz->done_face ) + clazz->done_face( face ); + + /* close the stream for this face if needed */ + FT_Stream_Free( + face->stream, + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->stream = NULL; + + /* get rid of it */ + if ( face->internal ) + { + FT_FREE( face->internal ); + } + FT_FREE( face ); + } + + + static void + Destroy_Driver( FT_Driver driver ) + { + FT_List_Finalize( &driver->faces_list, + destroy_face, + driver->root.memory, + driver ); + } + + + /************************************************************************** + * + * @Function: + * find_unicode_charmap + * + * @Description: + * This function finds a Unicode charmap, if there is one. + * And if there is more than one, it tries to favour the more + * extensive one, i.e., one that supports UCS-4 against those which + * are limited to the BMP (said UCS-2 encoding.) + * + * This function is called from open_face() (just below), and also + * from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). + */ + static FT_Error + find_unicode_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return FT_THROW( Invalid_CharMap_Handle ); + + /* + * The original TrueType specification(s) only specified charmap + * formats that are capable of mapping 8 or 16 bit character codes to + * glyph indices. + * + * However, recent updates to the Apple and OpenType specifications + * introduced new formats that are capable of mapping 32-bit character + * codes as well. And these are already used on some fonts, mainly to + * map non-BMP Asian ideographs as defined in Unicode. + * + * For compatibility purposes, these fonts generally come with + * *several* Unicode charmaps: + * + * - One of them in the "old" 16-bit format, that cannot access + * all glyphs in the font. + * + * - Another one in the "new" 32-bit format, that can access all + * the glyphs. + * + * This function has been written to always favor a 32-bit charmap + * when found. Otherwise, a 16-bit one is returned when found. + */ + + /* Since the `interesting' table, with IDs (3,10), is normally the */ + /* last one, we loop backwards. This loses with type1 fonts with */ + /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ + /* chars (.01% ?), and this is the same about 99.99% of the time! */ + + cur = first + face->num_charmaps; /* points after the last one */ + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + /* XXX If some new encodings to represent UCS-4 are added, */ + /* they should be added here. */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + } + + /* We do not have any UCS-4 charmap. */ + /* Do the loop again and search for UCS-2 charmaps. */ + cur = first + face->num_charmaps; + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_THROW( Invalid_CharMap_Handle ); + } + + + /************************************************************************** + * + * @Function: + * find_variant_selector_charmap + * + * @Description: + * This function finds the variant selector charmap, if there is one. + * There can only be one (platform=0, specific=5, format=14). + */ + static FT_CharMap + find_variant_selector_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* end; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return NULL; + + end = first + face->num_charmaps; /* points after the last one */ + + for ( cur = first; cur < end; cur++ ) + { + if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && + FT_Get_CMap_Format( cur[0] ) == 14 ) + return cur[0]; + } + + return NULL; + } + + + /************************************************************************** + * + * @Function: + * open_face + * + * @Description: + * This function does some work for FT_Open_Face(). + */ + static FT_Error + open_face( FT_Driver driver, + FT_Stream *astream, + FT_Bool *anexternal_stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter* params, + FT_Face *aface ) + { + FT_Memory memory; + FT_Driver_Class clazz; + FT_Face face = NULL; + FT_Face_Internal internal = NULL; + + FT_Error error, error2; + + + clazz = driver->clazz; + memory = driver->root.memory; + + /* allocate the face object and perform basic initialization */ + if ( FT_ALLOC( face, clazz->face_object_size ) ) + goto Fail; + + face->driver = driver; + face->memory = memory; + face->stream = *astream; + + /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ + if ( *anexternal_stream ) + face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; + + if ( FT_NEW( internal ) ) + goto Fail; + + face->internal = internal; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + int i; + + + face->internal->incremental_interface = NULL; + for ( i = 0; i < num_params && !face->internal->incremental_interface; + i++ ) + if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) + face->internal->incremental_interface = + (FT_Incremental_Interface)params[i].data; + } +#endif + + face->internal->random_seed = -1; + + if ( clazz->init_face ) + error = clazz->init_face( *astream, + face, + (FT_Int)face_index, + num_params, + params ); + /* Stream may have been changed. */ + *astream = face->stream; + *anexternal_stream = + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0; + if ( error ) + goto Fail; + + /* select Unicode charmap by default */ + error2 = find_unicode_charmap( face ); + + /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ + /* is returned. */ + + /* no error should happen, but we want to play safe */ + if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) ) + { + error = error2; + goto Fail; + } + + *aface = face; + + Fail: + if ( error ) + { + destroy_charmaps( face, memory ); + if ( clazz->done_face ) + clazz->done_face( face ); + FT_FREE( internal ); + FT_FREE( face ); + *aface = NULL; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/base/ftmac.c */ + +#ifndef FT_MACINTOSH + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `aface' delayed to `FT_Open_Face' */ + if ( !pathname ) + return FT_THROW( Invalid_Argument ); + + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + args.stream = NULL; + + return ft_open_face_internal( library, &args, face_index, aface, 1 ); + } + +#endif + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `face' delayed to `FT_Open_Face' */ + if ( !file_base ) + return FT_THROW( Invalid_Argument ); + + args.flags = FT_OPEN_MEMORY; + args.memory_base = file_base; + args.memory_size = file_size; + args.stream = NULL; + + return ft_open_face_internal( library, &args, face_index, aface, 1 ); + } + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* The behavior here is very similar to that in base/ftmac.c, but it */ + /* is designed to work on non-mac systems, so no mac specific calls. */ + /* */ + /* We look at the file and determine if it is a mac dfont file or a mac */ + /* resource file, or a macbinary file containing a mac resource file. */ + /* */ + /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ + /* the point, especially since there may be multiple `FOND' resources. */ + /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ + /* they occur in the file. */ + /* */ + /* Note that multiple `POST' resources do not mean multiple postscript */ + /* fonts; they all get jammed together to make what is essentially a */ + /* pfb file. */ + /* */ + /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ + /* */ + /* As soon as we get an `sfnt' load it into memory and pass it off to */ + /* FT_Open_Face. */ + /* */ + /* If we have a (set of) `POST' resources, massage them into a (memory) */ + /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ + /* going to try to save the kerning info. After all that lives in the */ + /* `FOND' which isn't in the file containing the `POST' resources so */ + /* we don't really have access to it. */ + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ + /* It frees the memory it uses. */ + /* From `ftmac.c'. */ + static void + memory_stream_close( FT_Stream stream ) + { + FT_Memory memory = (FT_Memory)stream->descriptor.pointer; + + + FT_FREE( stream->base ); + stream->size = 0; + stream->close = NULL; + FT_FREE( stream ); + } + + + /* Create a new memory stream from a buffer and a size. */ + /* From `ftmac.c'. */ + static FT_Error + new_memory_stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream_CloseFunc close, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream = NULL; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !base ) + return FT_THROW( Invalid_Argument ); + + *astream = NULL; + memory = library->memory; + if ( FT_NEW( stream ) ) + goto Exit; + + FT_Stream_OpenMemory( stream, base, size ); + + stream->descriptor.pointer = memory; + stream->close = close; + + *astream = stream; + + Exit: + return error; + } + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From `ftmac.c'. */ + FT_LOCAL_DEF( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Memory memory = library->memory; + + + args.driver = NULL; + args.flags = 0; + + if ( driver_name ) + { + args.driver = FT_Get_Module( library, driver_name ); + if ( !args.driver ) + { + FT_FREE( base ); + return FT_THROW( Missing_Module ); + } + + args.flags = args.flags | FT_OPEN_DRIVER; + } + + /* `memory_stream_close` also frees the stream object. */ + error = new_memory_stream( library, + base, + size, + memory_stream_close, + &args.stream ); + if ( error ) + { + FT_FREE( base ); + return error; + } + + args.flags |= FT_OPEN_STREAM; + +#ifdef FT_MACINTOSH + /* At this point, the face index has served its purpose; */ + /* whoever calls this function has already used it to */ + /* locate the correct font data. We should not propagate */ + /* this index to FT_Open_Face() (unless it is negative). */ + + if ( face_index > 0 ) + face_index &= 0x7FFF0000L; /* retain GX data */ +#endif + + return ft_open_face_internal( library, &args, face_index, aface, 0 ); + } + + + /* Look up `TYP1' or `CID ' table from sfnt table directory. */ + /* `offset' and `length' must exclude the binary header in tables. */ + + /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ + /* format too. Here, since we can't expect that the TrueType font */ + /* driver is loaded unconditionally, we must parse the font by */ + /* ourselves. We are only interested in the name of the table and */ + /* the offset. */ + + static FT_Error + ft_lookup_PS_in_sfnt_stream( FT_Stream stream, + FT_Long face_index, + FT_ULong* offset, + FT_ULong* length, + FT_Bool* is_sfnt_cid ) + { + FT_Error error; + FT_UShort numTables; + FT_Long pstable_index; + FT_ULong tag; + int i; + + + *offset = 0; + *length = 0; + *is_sfnt_cid = FALSE; + + /* TODO: support for sfnt-wrapped PS/CID in TTC format */ + + /* version check for 'typ1' (should be ignored?) */ + if ( FT_READ_ULONG( tag ) ) + return error; + if ( tag != TTAG_typ1 ) + return FT_THROW( Unknown_File_Format ); + + if ( FT_READ_USHORT( numTables ) ) + return error; + if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ + return error; + + pstable_index = -1; + *is_sfnt_cid = FALSE; + + for ( i = 0; i < numTables; i++ ) + { + if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || + FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) + return error; + + if ( tag == TTAG_CID ) + { + pstable_index++; + *offset += 22; + *length -= 22; + *is_sfnt_cid = TRUE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + else if ( tag == TTAG_TYP1 ) + { + pstable_index++; + *offset += 24; + *length -= 24; + *is_sfnt_cid = FALSE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + if ( face_index >= 0 && pstable_index == face_index ) + return FT_Err_Ok; + } + + return FT_THROW( Table_Missing ); + } + + + FT_LOCAL_DEF( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ) + { + FT_Error error; + FT_Memory memory = library->memory; + FT_ULong offset, length; + FT_ULong pos; + FT_Bool is_sfnt_cid; + FT_Byte* sfnt_ps = NULL; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* ignore GX stuff */ + if ( face_index > 0 ) + face_index &= 0xFFFFL; + + pos = FT_STREAM_POS(); + + error = ft_lookup_PS_in_sfnt_stream( stream, + face_index, + &offset, + &length, + &is_sfnt_cid ); + if ( error ) + goto Exit; + + if ( offset > stream->size ) + { + FT_TRACE2(( "open_face_PS_from_sfnt_stream: invalid table offset\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + else if ( length > stream->size - offset ) + { + FT_TRACE2(( "open_face_PS_from_sfnt_stream: invalid table length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + error = FT_Stream_Seek( stream, pos + offset ); + if ( error ) + goto Exit; + + if ( FT_QALLOC( sfnt_ps, (FT_Long)length ) ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); + if ( error ) + { + FT_FREE( sfnt_ps ); + goto Exit; + } + + error = open_face_from_buffer( library, + sfnt_ps, + length, + FT_MIN( face_index, 0 ), + is_sfnt_cid ? "t1cid" : "type1", + aface ); + Exit: + { + FT_Error error1; + + + if ( FT_ERR_EQ( error, Unknown_File_Format ) ) + { + error1 = FT_Stream_Seek( stream, pos ); + if ( error1 ) + return error1; + } + + return error; + } + } + + +#ifndef FT_MACINTOSH + + /* The resource header says we've got resource_cnt `POST' (type1) */ + /* resources in this file. They all need to be coalesced into */ + /* one lump which gets passed on to the type1 driver. */ + /* Here can be only one PostScript font in a file so face_index */ + /* must be 0 (or -1). */ + /* */ + static FT_Error + Mac_Read_POST_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error = FT_ERR( Cannot_Open_Resource ); + FT_Memory memory = library->memory; + + FT_Byte* pfb_data = NULL; + int i, type, flags; + FT_ULong len; + FT_ULong pfb_len, pfb_pos, pfb_lenpos; + FT_ULong rlen, temp; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index != 0 ) + return error; + + /* Find the length of all the POST resources, concatenated. Assume */ + /* worst case (each resource in its own section). */ + pfb_len = 0; + for ( i = 0; i < resource_cnt; i++ ) + { + error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); + if ( error ) + goto Exit; + if ( FT_READ_ULONG( temp ) ) /* actually LONG */ + goto Exit; + + /* FT2 allocator takes signed long buffer length, + * too large value causing overflow should be checked + */ + FT_TRACE4(( " POST fragment #%d: length=0x%08lx" + " total pfb_len=0x%08lx\n", + i, temp, pfb_len + temp + 6 )); + + if ( FT_MAC_RFORK_MAX_LEN < temp || + FT_MAC_RFORK_MAX_LEN - temp < pfb_len + 6 ) + { + FT_TRACE2(( " MacOS resource length cannot exceed" + " 0x%08lx\n", + FT_MAC_RFORK_MAX_LEN )); + + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + + pfb_len += temp + 6; + } + + FT_TRACE2(( " total buffer size to concatenate" + " %ld POST fragments: 0x%08lx\n", + resource_cnt, pfb_len + 2 )); + + if ( pfb_len + 2 < 6 ) + { + FT_TRACE2(( " too long fragment length makes" + " pfb_len confused: pfb_len=0x%08lx\n", + pfb_len )); + + error = FT_THROW( Array_Too_Large ); + goto Exit; + } + + if ( FT_QALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) + goto Exit; + + pfb_data[0] = 0x80; + pfb_data[1] = 1; /* Ascii section */ + pfb_data[2] = 0; /* 4-byte length, fill in later */ + pfb_data[3] = 0; + pfb_data[4] = 0; + pfb_data[5] = 0; + pfb_pos = 6; + pfb_lenpos = 2; + + len = 0; + type = 1; + + for ( i = 0; i < resource_cnt; i++ ) + { + error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); + if ( error ) + goto Exit2; + if ( FT_READ_ULONG( rlen ) ) + goto Exit2; + + /* FT2 allocator takes signed long buffer length, + * too large fragment length causing overflow should be checked + */ + if ( 0x7FFFFFFFUL < rlen ) + { + error = FT_THROW( Invalid_Offset ); + goto Exit2; + } + + if ( FT_READ_USHORT( flags ) ) + goto Exit2; + + FT_TRACE3(( "POST fragment[%d]:" + " offsets=0x%08lx, rlen=0x%08lx, flags=0x%04x\n", + i, offsets[i], rlen, flags )); + + error = FT_ERR( Array_Too_Large ); + + /* postpone the check of `rlen longer than buffer' */ + /* until `FT_Stream_Read' */ + + if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ + { + FT_TRACE3(( " Skip POST fragment #%d because it is a comment\n", + i )); + continue; + } + + /* the flags are part of the resource, so rlen >= 2, */ + /* but some fonts declare rlen = 0 for empty fragment */ + if ( rlen > 2 ) + rlen -= 2; + else + rlen = 0; + + if ( ( flags >> 8 ) == type ) + len += rlen; + else + { + FT_TRACE3(( " Write POST fragment #%d header (4-byte) to buffer" + " %p + 0x%08lx\n", + i, (void*)pfb_data, pfb_lenpos )); + + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; + + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + if ( ( flags >> 8 ) == 5 ) /* End of font mark */ + break; + + FT_TRACE3(( " Write POST fragment #%d header (6-byte) to buffer" + " %p + 0x%08lx\n", + i, (void*)pfb_data, pfb_pos )); + + if ( pfb_pos + 6 > pfb_len + 2 ) + goto Exit2; + + pfb_data[pfb_pos++] = 0x80; + + type = flags >> 8; + len = rlen; + + pfb_data[pfb_pos++] = (FT_Byte)type; + pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + } + + if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) + goto Exit2; + + FT_TRACE3(( " Load POST fragment #%d (%ld byte) to buffer" + " %p + 0x%08lx\n", + i, rlen, (void*)pfb_data, pfb_pos )); + + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); + if ( error ) + goto Exit2; + + pfb_pos += rlen; + } + + error = FT_ERR( Array_Too_Large ); + + if ( pfb_pos + 2 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_pos++] = 0x80; + pfb_data[pfb_pos++] = 3; + + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + return open_face_from_buffer( library, + pfb_data, + pfb_pos, + face_index, + "type1", + aface ); + + Exit2: + if ( FT_ERR_EQ( error, Array_Too_Large ) ) + FT_TRACE2(( " Abort due to too-short buffer to store" + " all POST fragments\n" )); + else if ( FT_ERR_EQ( error, Invalid_Offset ) ) + FT_TRACE2(( " Abort due to invalid offset in a POST fragment\n" )); + + if ( error ) + error = FT_ERR( Cannot_Open_Resource ); + FT_FREE( pfb_data ); + + Exit: + return error; + } + + + /* The resource header says we've got resource_cnt `sfnt' */ + /* (TrueType/OpenType) resources in this file. Look through */ + /* them for the one indicated by face_index, load it into mem, */ + /* pass it on to the truetype driver, and return it. */ + /* */ + static FT_Error + Mac_Read_sfnt_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Byte* sfnt_data = NULL; + FT_Error error; + FT_ULong flag_offset; + FT_ULong rlen; + int is_cff; + FT_Long face_index_in_resource = 0; + + + if ( face_index < 0 ) + face_index = -face_index - 1; + if ( face_index >= resource_cnt ) + return FT_THROW( Cannot_Open_Resource ); + + flag_offset = (FT_ULong)offsets[face_index]; + error = FT_Stream_Seek( stream, flag_offset ); + if ( error ) + goto Exit; + + if ( FT_READ_ULONG( rlen ) ) + goto Exit; + if ( !rlen ) + return FT_THROW( Cannot_Open_Resource ); + if ( rlen > FT_MAC_RFORK_MAX_LEN ) + return FT_THROW( Invalid_Offset ); + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ); + if ( !error ) + goto Exit; + + /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ + error = FT_Stream_Seek( stream, flag_offset + 4 ); + if ( error ) + goto Exit; + + if ( FT_QALLOC( sfnt_data, rlen ) ) + return error; + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen ); + if ( error ) + { + FT_FREE( sfnt_data ); + goto Exit; + } + + is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + error = open_face_from_buffer( library, + sfnt_data, + rlen, + face_index_in_resource, + is_cff ? "cff" : "truetype", + aface ); + + Exit: + return error; + } + + + /* Check for a valid resource fork header, or a valid dfont */ + /* header. In a resource fork the first 16 bytes are repeated */ + /* at the location specified by bytes 4-7. In a dfont bytes */ + /* 4-7 point to 16 bytes of zeroes instead. */ + /* */ + static FT_Error + IsMacResource( FT_Library library, + FT_Stream stream, + FT_Long resource_offset, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Long map_offset, rdata_pos; + FT_Long *data_offsets; + FT_Long count; + + + error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, + &map_offset, &rdata_pos ); + if ( error ) + return error; + + /* POST resources must be sorted to concatenate properly */ + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdata_pos, + TTAG_POST, TRUE, + &data_offsets, &count ); + if ( !error ) + { + error = Mac_Read_POST_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); + /* POST exists in an LWFN providing a single face */ + if ( !error ) + (*aface)->num_faces = 1; + return error; + } + + /* sfnt resources should not be sorted to preserve the face order by + QuickDraw API */ + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdata_pos, + TTAG_sfnt, FALSE, + &data_offsets, &count ); + if ( !error ) + { + FT_Long face_index_internal = face_index % count; + + + error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, + face_index_internal, aface ); + FT_FREE( data_offsets ); + if ( !error ) + (*aface)->num_faces = count; + } + + return error; + } + + + /* Check for a valid macbinary header, and if we find one */ + /* check that the (flattened) resource fork in it is valid. */ + /* */ + static FT_Error + IsMacBinary( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface ) + { + unsigned char header[128]; + FT_Error error; + FT_Long dlen, offset; + + + if ( !stream ) + return FT_THROW( Invalid_Stream_Operation ); + + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); + if ( error ) + goto Exit; + + if ( header[ 0] != 0 || + header[74] != 0 || + header[82] != 0 || + header[ 1] == 0 || + header[ 1] > 33 || + header[63] != 0 || + header[2 + header[1]] != 0 || + header[0x53] > 0x7F ) + return FT_THROW( Unknown_File_Format ); + + dlen = ( header[0x53] << 24 ) | + ( header[0x54] << 16 ) | + ( header[0x55] << 8 ) | + header[0x56]; +#if 0 + rlen = ( header[0x57] << 24 ) | + ( header[0x58] << 16 ) | + ( header[0x59] << 8 ) | + header[0x5A]; +#endif /* 0 */ + offset = 128 + ( ( dlen + 127 ) & ~127 ); + + return IsMacResource( library, stream, offset, face_index, aface ); + + Exit: + return error; + } + + + static FT_Error + load_face_in_embedded_rfork( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT raccess + + FT_Memory memory = library->memory; + FT_Error error = FT_ERR( Unknown_File_Format ); + FT_UInt i; + + char* file_names[FT_RACCESS_N_RULES]; + FT_Long offsets[FT_RACCESS_N_RULES]; + FT_Error errors[FT_RACCESS_N_RULES]; + FT_Bool is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */ + + FT_Open_Args args2; + FT_Stream stream2 = NULL; + + + FT_Raccess_Guess( library, stream, + args->pathname, file_names, offsets, errors ); + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i ); + if ( is_darwin_vfs && vfs_rfork_has_no_font ) + { + FT_TRACE3(( "Skip rule %d: darwin vfs resource fork" + " is already checked and" + " no font is found\n", + i )); + continue; + } + + if ( errors[i] ) + { + FT_TRACE3(( "Error 0x%x has occurred in rule %d\n", + errors[i], i )); + continue; + } + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_names[i] ? file_names[i] : args->pathname; + + FT_TRACE3(( "Try rule %d: %s (offset=%ld) ...", + i, args2.pathname, offsets[i] )); + + error = FT_Stream_New( library, &args2, &stream2 ); + if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) ) + vfs_rfork_has_no_font = TRUE; + + if ( error ) + { + FT_TRACE3(( "failed\n" )); + continue; + } + + error = IsMacResource( library, stream2, offsets[i], + face_index, aface ); + FT_Stream_Free( stream2, 0 ); + + FT_TRACE3(( "%s\n", error ? "failed": "successful" )); + + if ( !error ) + break; + else if ( is_darwin_vfs ) + vfs_rfork_has_no_font = TRUE; + } + + for (i = 0; i < FT_RACCESS_N_RULES; i++) + { + if ( file_names[i] ) + FT_FREE( file_names[i] ); + } + + /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ + if ( error ) + error = FT_ERR( Unknown_File_Format ); + + return error; + +#undef FT_COMPONENT +#define FT_COMPONENT objs + + } + + + /* Check for some macintosh formats without Carbon framework. */ + /* Is this a macbinary file? If so look at the resource fork. */ + /* Is this a mac dfont file? */ + /* Is this an old style resource fork? (in data) */ + /* Else call load_face_in_embedded_rfork to try extra rules */ + /* (defined in `ftrfork.c'). */ + /* */ + static FT_Error + load_mac_face( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + FT_Error error; + FT_UNUSED( args ); + + + error = IsMacBinary( library, stream, face_index, aface ); + if ( FT_ERR_EQ( error, Unknown_File_Format ) ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT raccess + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE3(( "Try as dfont: " )); + if ( !( args->flags & FT_OPEN_MEMORY ) ) + FT_TRACE3(( "%s ...", args->pathname )); +#endif + + error = IsMacResource( library, stream, 0, face_index, aface ); + + FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); + +#undef FT_COMPONENT +#define FT_COMPONENT objs + + } + + if ( ( FT_ERR_EQ( error, Unknown_File_Format ) || + FT_ERR_EQ( error, Invalid_Stream_Operation ) ) && + ( args->flags & FT_OPEN_PATHNAME ) ) + error = load_face_in_embedded_rfork( library, stream, + face_index, aface, args ); + return error; + } +#endif + +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ) + { + return ft_open_face_internal( library, args, face_index, aface, 1 ); + } + + + static FT_Error + ft_open_face_internal( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface, + FT_Bool test_mac_fonts ) + { + FT_Error error; + FT_Driver driver = NULL; + FT_Memory memory = NULL; + FT_Stream stream = NULL; + FT_Face face = NULL; + FT_ListNode node = NULL; + FT_Bool external_stream; + FT_Module* cur; + FT_Module* limit; + +#ifndef FT_CONFIG_OPTION_MAC_FONTS + FT_UNUSED( test_mac_fonts ); +#endif + + + /* only use lower 31 bits together with sign bit */ + if ( face_index > 0 ) + face_index &= 0x7FFFFFFFL; + else + { + face_index = -face_index; + face_index &= 0x7FFFFFFFL; + face_index = -face_index; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE3(( "FT_Open_Face: " )); + if ( face_index < 0 ) + FT_TRACE3(( "Requesting number of faces and named instances\n")); + else + { + FT_TRACE3(( "Requesting face %ld", face_index & 0xFFFFL )); + if ( face_index & 0x7FFF0000L ) + FT_TRACE3(( ", named instance %ld", face_index >> 16 )); + FT_TRACE3(( "\n" )); + } +#endif + + /* test for valid `library' delayed to `FT_Stream_New' */ + + if ( !args ) + return FT_THROW( Invalid_Argument ); + + external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && + args->stream ); + + /* create input stream */ + error = FT_Stream_New( library, args, &stream ); + if ( error ) + goto Fail3; + + /* Do this error check after `FT_Stream_New` to ensure that the */ + /* 'close' callback is called. */ + if ( !aface && face_index >= 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail3; + } + + memory = library->memory; + + /* If the font driver is specified in the `args' structure, use */ + /* it. Otherwise, we scan the list of registered drivers. */ + if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) + { + driver = FT_DRIVER( args->driver ); + + /* not all modules are drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( driver ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = NULL; + + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, &stream, &external_stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + } + else + error = FT_THROW( Invalid_Handle ); + + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + else + { + error = FT_ERR( Missing_Module ); + + /* check each font driver for an appropriate format */ + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + { + /* not all modules are font drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( cur[0] ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = NULL; + + + driver = FT_DRIVER( cur[0] ); + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, &stream, &external_stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + if ( test_mac_fonts && + ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && + FT_ERR_EQ( error, Table_Missing ) ) + { + /* TrueType but essential tables are missing */ + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + break; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + num_params, + params, + aface ); + if ( !error ) + { + FT_Stream_Free( stream, external_stream ); + return error; + } + } +#endif + + if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) + goto Fail3; + } + } + + Fail3: + /* If we are on the mac, and we get an */ + /* FT_Err_Invalid_Stream_Operation it may be because we have an */ + /* empty data fork, so we need to check the resource fork. */ + if ( FT_ERR_NEQ( error, Cannot_Open_Stream ) && + FT_ERR_NEQ( error, Unknown_File_Format ) && + FT_ERR_NEQ( error, Invalid_Stream_Operation ) ) + goto Fail2; + +#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) + if ( test_mac_fonts ) + { + error = load_mac_face( library, stream, face_index, aface, args ); + if ( !error ) + { + /* We don't want to go to Success here. We've already done */ + /* that. On the other hand, if we succeeded we still need to */ + /* close this stream (we opened a different stream which */ + /* extracted the interesting information out of this stream */ + /* here. That stream will still be open and the face will */ + /* point to it). */ + FT_Stream_Free( stream, external_stream ); + return error; + } + } + + if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) + goto Fail2; +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + /* no driver is able to handle this format */ + error = FT_THROW( Unknown_File_Format ); + + Fail2: + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + + Success: + FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); + + /* add the face object to its driver's list */ + if ( FT_QNEW( node ) ) + goto Fail; + + node->data = face; + /* don't assume driver is the same as face->driver, so use */ + /* face->driver instead. */ + FT_List_Add( &face->driver->faces_list, node ); + + /* now allocate a glyph slot object for the face */ + FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); + + if ( face_index >= 0 ) + { + error = FT_New_GlyphSlot( face, NULL ); + if ( error ) + goto Fail; + + /* finally, allocate a size object for the face */ + { + FT_Size size; + + + FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); + + error = FT_New_Size( face, &size ); + if ( error ) + goto Fail; + + face->size = size; + } + } + + /* some checks */ + + if ( FT_IS_SCALABLE( face ) ) + { + if ( face->height < 0 ) + face->height = (FT_Short)-face->height; + + if ( !FT_HAS_VERTICAL( face ) ) + face->max_advance_height = (FT_Short)face->height; + } + + if ( FT_HAS_FIXED_SIZES( face ) ) + { + FT_Int i; + + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( bsize->height < 0 ) + bsize->height = -bsize->height; + if ( bsize->x_ppem < 0 ) + bsize->x_ppem = -bsize->x_ppem; + if ( bsize->y_ppem < 0 ) + bsize->y_ppem = -bsize->y_ppem; + + /* check whether negation actually has worked */ + if ( bsize->height < 0 || bsize->x_ppem < 0 || bsize->y_ppem < 0 ) + { + FT_TRACE0(( "FT_Open_Face:" + " Invalid bitmap dimensions for strike %d," + " now disabled\n", i )); + bsize->width = 0; + bsize->height = 0; + bsize->size = 0; + bsize->x_ppem = 0; + bsize->y_ppem = 0; + } + } + } + + /* initialize internal face data */ + { + FT_Face_Internal internal = face->internal; + + + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + + internal->refcount = 1; + + internal->no_stem_darkening = -1; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + /* Per-face filtering can only be set up by FT_Face_Properties */ + internal->lcd_filter_func = NULL; +#endif + } + + if ( aface ) + *aface = face; + else + FT_Done_Face( face ); + + goto Exit; + + Fail: + if ( node ) + FT_Done_Face( face ); /* face must be in the driver's list */ + else if ( face ) + destroy_face( memory, face, driver ); + + Exit: +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !error && face_index < 0 ) + { + FT_TRACE3(( "FT_Open_Face: The font has %ld face%s\n", + face->num_faces, + face->num_faces == 1 ? "" : "s" )); + FT_TRACE3(( " and %ld named instance%s for face %ld\n", + face->style_flags >> 16, + ( face->style_flags >> 16 ) == 1 ? "" : "s", + -face_index - 1 )); + } +#endif + + FT_TRACE4(( "FT_Open_Face: Return 0x%x\n", error )); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ) + { + FT_Open_Args open; + + + /* test for valid `face' delayed to `FT_Attach_Stream' */ + + if ( !filepathname ) + return FT_THROW( Invalid_Argument ); + + open.stream = NULL; + open.flags = FT_OPEN_PATHNAME; + open.pathname = (char*)filepathname; + + return FT_Attach_Stream( face, &open ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_Stream( FT_Face face, + const FT_Open_Args* parameters ) + { + FT_Stream stream; + FT_Error error; + FT_Driver driver; + + FT_Driver_Class clazz; + + + /* test for valid `parameters' delayed to `FT_Stream_New' */ + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + driver = face->driver; + if ( !driver ) + return FT_THROW( Invalid_Driver_Handle ); + + error = FT_Stream_New( driver->root.library, parameters, &stream ); + if ( error ) + goto Exit; + + /* we implement FT_Attach_Stream in each driver through the */ + /* `attach_file' interface */ + + error = FT_ERR( Unimplemented_Feature ); + clazz = driver->clazz; + if ( clazz->attach_file ) + error = clazz->attach_file( face, stream ); + + /* close the attached stream */ + FT_Stream_Free( stream, + FT_BOOL( parameters->stream && + ( parameters->flags & FT_OPEN_STREAM ) ) ); + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Face( FT_Face face ) + { + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + face->internal->refcount++; + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Face( FT_Face face ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_ListNode node; + + + error = FT_ERR( Invalid_Face_Handle ); + if ( face && face->driver ) + { + face->internal->refcount--; + if ( face->internal->refcount > 0 ) + error = FT_Err_Ok; + else + { + driver = face->driver; + memory = driver->root.memory; + + /* find face in driver's list */ + node = FT_List_Find( &driver->faces_list, face ); + if ( node ) + { + /* remove face object from the driver's list */ + FT_List_Remove( &driver->faces_list, node ); + FT_FREE( node ); + + /* now destroy the object proper */ + destroy_face( memory, face, driver ); + error = FT_Err_Ok; + } + } + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size *asize ) + { + FT_Error error; + FT_Memory memory; + FT_Driver driver; + FT_Driver_Class clazz; + + FT_Size size = NULL; + FT_ListNode node = NULL; + + FT_Size_Internal internal = NULL; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !asize ) + return FT_THROW( Invalid_Argument ); + + if ( !face->driver ) + return FT_THROW( Invalid_Driver_Handle ); + + *asize = NULL; + + driver = face->driver; + clazz = driver->clazz; + memory = face->memory; + + /* Allocate new size object and perform basic initialisation */ + if ( FT_ALLOC( size, clazz->size_object_size ) || FT_QNEW( node ) ) + goto Exit; + + size->face = face; + + if ( FT_NEW( internal ) ) + goto Exit; + + size->internal = internal; + + if ( clazz->init_size ) + error = clazz->init_size( size ); + + /* in case of success, add to the face's list */ + if ( !error ) + { + *asize = size; + node->data = size; + FT_List_Add( &face->sizes_list, node ); + } + + Exit: + if ( error ) + { + FT_FREE( node ); + if ( size ) + FT_FREE( size->internal ); + FT_FREE( size ); + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Size( FT_Size size ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Face face; + FT_ListNode node; + + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + face = size->face; + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + driver = face->driver; + if ( !driver ) + return FT_THROW( Invalid_Driver_Handle ); + + memory = driver->root.memory; + + error = FT_Err_Ok; + node = FT_List_Find( &face->sizes_list, size ); + if ( node ) + { + FT_List_Remove( &face->sizes_list, node ); + FT_FREE( node ); + + if ( face->size == size ) + { + face->size = NULL; + if ( face->sizes_list.head ) + face->size = (FT_Size)(face->sizes_list.head->data); + } + + destroy_size( memory, size, driver ); + } + else + error = FT_THROW( Invalid_Size_Handle ); + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ) + { + FT_Int i; + FT_Long w, h; + + + if ( !FT_HAS_FIXED_SIZES( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + /* FT_Bitmap_Size doesn't provide enough info... */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + return FT_THROW( Unimplemented_Feature ); + + w = FT_REQUEST_WIDTH ( req ); + h = FT_REQUEST_HEIGHT( req ); + + if ( req->width && !req->height ) + h = w; + else if ( !req->width && req->height ) + w = h; + + w = FT_PIX_ROUND( w ); + h = FT_PIX_ROUND( h ); + + if ( !w || !h ) + return FT_THROW( Invalid_Pixel_Size ); + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) + continue; + + if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) + { + FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i )); + + if ( size_index ) + *size_index = (FT_ULong)i; + + return FT_Err_Ok; + } + } + + FT_TRACE3(( "FT_Match_Size: no matching bitmap strike\n" )); + + return FT_THROW( Invalid_Pixel_Size ); + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ) + { + FT_Pos height = metrics->height; + + + /* compensate for glyph with bbox above/below the baseline */ + if ( metrics->horiBearingY < 0 ) + { + if ( height < metrics->horiBearingY ) + height = metrics->horiBearingY; + } + else if ( metrics->horiBearingY > 0 ) + height -= metrics->horiBearingY; + + /* the factor 1.2 is a heuristical value */ + if ( !advance ) + advance = height * 12 / 10; + + metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; + metrics->vertBearingY = ( advance - height ) / 2; + metrics->vertAdvance = advance; + } + + + static void + ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + +#ifdef GRID_FIT_METRICS + metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, + metrics->y_scale ) ); + + metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, + metrics->y_scale ) ); + + metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, + metrics->y_scale ) ); + + metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, + metrics->x_scale ) ); +#else /* !GRID_FIT_METRICS */ + metrics->ascender = FT_MulFix( face->ascender, + metrics->y_scale ); + + metrics->descender = FT_MulFix( face->descender, + metrics->y_scale ); + + metrics->height = FT_MulFix( face->height, + metrics->y_scale ); + + metrics->max_advance = FT_MulFix( face->max_advance_width, + metrics->x_scale ); +#endif /* !GRID_FIT_METRICS */ + } + + + FT_BASE_DEF( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ) + { + FT_Size_Metrics* metrics; + FT_Bitmap_Size* bsize; + + + metrics = &face->size->metrics; + bsize = face->available_sizes + strike_index; + + metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); + + if ( FT_IS_SCALABLE( face ) ) + { + metrics->x_scale = FT_DivFix( bsize->x_ppem, + face->units_per_EM ); + metrics->y_scale = FT_DivFix( bsize->y_ppem, + face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + metrics->ascender = bsize->y_ppem; + metrics->descender = 0; + metrics->height = bsize->height << 6; + metrics->max_advance = bsize->x_ppem; + } + } + + + FT_BASE_DEF( FT_Error ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ) + { + FT_Error error = FT_Err_Ok; + + FT_Size_Metrics* metrics; + + + metrics = &face->size->metrics; + + if ( FT_IS_SCALABLE( face ) ) + { + FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; + + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + w = h = face->units_per_EM; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + w = h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_BBOX: + w = face->bbox.xMax - face->bbox.xMin; + h = face->bbox.yMax - face->bbox.yMin; + break; + + case FT_SIZE_REQUEST_TYPE_CELL: + w = face->max_advance_width; + h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_SCALES: + metrics->x_scale = (FT_Fixed)req->width; + metrics->y_scale = (FT_Fixed)req->height; + if ( !metrics->x_scale ) + metrics->x_scale = metrics->y_scale; + else if ( !metrics->y_scale ) + metrics->y_scale = metrics->x_scale; + goto Calculate_Ppem; + + case FT_SIZE_REQUEST_TYPE_MAX: + break; + } + + /* to be on the safe side */ + if ( w < 0 ) + w = -w; + + if ( h < 0 ) + h = -h; + + scaled_w = FT_REQUEST_WIDTH ( req ); + scaled_h = FT_REQUEST_HEIGHT( req ); + + /* determine scales */ + if ( req->height || !req->width ) + { + if ( h == 0 ) + { + FT_ERROR(( "FT_Request_Metrics: Divide by zero\n" )); + error = FT_ERR( Divide_By_Zero ); + goto Exit; + } + + metrics->y_scale = FT_DivFix( scaled_h, h ); + } + + if ( req->width ) + { + if ( w == 0 ) + { + FT_ERROR(( "FT_Request_Metrics: Divide by zero\n" )); + error = FT_ERR( Divide_By_Zero ); + goto Exit; + } + + metrics->x_scale = FT_DivFix( scaled_w, w ); + } + else + { + metrics->x_scale = metrics->y_scale; + scaled_w = FT_MulDiv( scaled_h, w, h ); + } + + if ( !req->height ) + { + metrics->y_scale = metrics->x_scale; + scaled_h = FT_MulDiv( scaled_w, h, w ); + } + + if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) + { + if ( metrics->y_scale > metrics->x_scale ) + metrics->y_scale = metrics->x_scale; + else + metrics->x_scale = metrics->y_scale; + } + + Calculate_Ppem: + /* calculate the ppems */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + { + scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); + scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); + } + + scaled_w = ( scaled_w + 32 ) >> 6; + scaled_h = ( scaled_h + 32 ) >> 6; + if ( scaled_w > (FT_Long)FT_USHORT_MAX || + scaled_h > (FT_Long)FT_USHORT_MAX ) + { + FT_ERROR(( "FT_Request_Metrics: Resulting ppem size too large\n" )); + error = FT_ERR( Invalid_Pixel_Size ); + goto Exit; + } + + metrics->x_ppem = (FT_UShort)scaled_w; + metrics->y_ppem = (FT_UShort)scaled_h; + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + FT_ZERO( metrics ); + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ) + { + FT_Error error = FT_Err_Ok; + FT_Driver_Class clazz; + + + if ( !face || !FT_HAS_FIXED_SIZES( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) + return FT_THROW( Invalid_Argument ); + + clazz = face->driver->clazz; + + if ( clazz->select_size ) + { + error = clazz->select_size( face->size, (FT_ULong)strike_index ); + + FT_TRACE5(( "FT_Select_Size (%s driver):\n", + face->driver->root.clazz->module_name )); + } + else + { + FT_Select_Metrics( face, (FT_ULong)strike_index ); + + FT_TRACE5(( "FT_Select_Size:\n" )); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + FT_TRACE5(( " x scale: %ld (%f)\n", + metrics->x_scale, (double)metrics->x_scale / 65536 )); + FT_TRACE5(( " y scale: %ld (%f)\n", + metrics->y_scale, (double)metrics->y_scale / 65536 )); + FT_TRACE5(( " ascender: %f\n", + (double)metrics->ascender / 64 )); + FT_TRACE5(( " descender: %f\n", + (double)metrics->descender / 64 )); + FT_TRACE5(( " height: %f\n", + (double)metrics->height / 64 )); + FT_TRACE5(( " max advance: %f\n", + (double)metrics->max_advance / 64 )); + FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); + FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); + } +#endif + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ) + { + FT_Error error; + FT_Driver_Class clazz; + FT_ULong strike_index; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !face->size ) + return FT_THROW( Invalid_Size_Handle ); + + if ( !req || req->width < 0 || req->height < 0 || + req->type >= FT_SIZE_REQUEST_TYPE_MAX ) + return FT_THROW( Invalid_Argument ); + + /* signal the auto-hinter to recompute its size metrics */ + /* (if requested) */ + face->size->internal->autohint_metrics.x_scale = 0; + + clazz = face->driver->clazz; + + if ( clazz->request_size ) + { + error = clazz->request_size( face->size, req ); + + FT_TRACE5(( "FT_Request_Size (%s driver):\n", + face->driver->root.clazz->module_name )); + } + else if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) + { + /* + * The reason that a driver doesn't have `request_size' defined is + * either that the scaling here suffices or that the supported formats + * are bitmap-only and size matching is not implemented. + * + * In the latter case, a simple size matching is done. + */ + error = FT_Match_Size( face, req, 0, &strike_index ); + if ( error ) + goto Exit; + + return FT_Select_Size( face, (FT_Int)strike_index ); + } + else + { + error = FT_Request_Metrics( face, req ); + if ( error ) + goto Exit; + + FT_TRACE5(( "FT_Request_Size:\n" )); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + FT_TRACE5(( " x scale: %ld (%f)\n", + metrics->x_scale, (double)metrics->x_scale / 65536 )); + FT_TRACE5(( " y scale: %ld (%f)\n", + metrics->y_scale, (double)metrics->y_scale / 65536 )); + FT_TRACE5(( " ascender: %f\n", + (double)metrics->ascender / 64 )); + FT_TRACE5(( " descender: %f\n", + (double)metrics->descender / 64 )); + FT_TRACE5(( " height: %f\n", + (double)metrics->height / 64 )); + FT_TRACE5(( " max advance: %f\n", + (double)metrics->max_advance / 64 )); + FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); + FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); + } +#endif + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) + { + FT_Size_RequestRec req; + + + /* check of `face' delayed to `FT_Request_Size' */ + + if ( !char_width ) + char_width = char_height; + else if ( !char_height ) + char_height = char_width; + + if ( !horz_resolution ) + horz_resolution = vert_resolution; + else if ( !vert_resolution ) + vert_resolution = horz_resolution; + + if ( char_width < 1 * 64 ) + char_width = 1 * 64; + if ( char_height < 1 * 64 ) + char_height = 1 * 64; + + if ( !horz_resolution ) + horz_resolution = vert_resolution = 72; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = char_width; + req.height = char_height; + req.horiResolution = horz_resolution; + req.vertResolution = vert_resolution; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ) + { + FT_Size_RequestRec req; + + + /* check of `face' delayed to `FT_Request_Size' */ + + if ( pixel_width == 0 ) + pixel_width = pixel_height; + else if ( pixel_height == 0 ) + pixel_height = pixel_width; + + if ( pixel_width < 1 ) + pixel_width = 1; + if ( pixel_height < 1 ) + pixel_height = 1; + + /* use `>=' to avoid potential compiler warning on 16bit platforms */ + if ( pixel_width >= 0xFFFFU ) + pixel_width = 0xFFFFU; + if ( pixel_height >= 0xFFFFU ) + pixel_height = 0xFFFFU; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = (FT_Long)( pixel_width << 6 ); + req.height = (FT_Long)( pixel_height << 6 ); + req.horiResolution = 0; + req.vertResolution = 0; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ) + { + FT_Error error = FT_Err_Ok; + FT_Driver driver; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !akerning ) + return FT_THROW( Invalid_Argument ); + + driver = face->driver; + + akerning->x = 0; + akerning->y = 0; + + if ( driver->clazz->get_kerning ) + { + error = driver->clazz->get_kerning( face, + left_glyph, + right_glyph, + akerning ); + if ( !error ) + { + if ( kern_mode != FT_KERNING_UNSCALED ) + { + akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); + akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); + + if ( kern_mode != FT_KERNING_UNFITTED ) + { + FT_Pos orig_x = akerning->x; + FT_Pos orig_y = akerning->y; + + + /* we scale down kerning values for small ppem values */ + /* to avoid that rounding makes them too big. */ + /* `25' has been determined heuristically. */ + if ( face->size->metrics.x_ppem < 25 ) + akerning->x = FT_MulDiv( orig_x, + face->size->metrics.x_ppem, 25 ); + if ( face->size->metrics.y_ppem < 25 ) + akerning->y = FT_MulDiv( orig_y, + face->size->metrics.y_ppem, 25 ); + + akerning->x = FT_PIX_ROUND( akerning->x ); + akerning->y = FT_PIX_ROUND( akerning->y ); + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Pos orig_x_rounded = FT_PIX_ROUND( orig_x ); + FT_Pos orig_y_rounded = FT_PIX_ROUND( orig_y ); + + + if ( akerning->x != orig_x_rounded || + akerning->y != orig_y_rounded ) + FT_TRACE5(( "FT_Get_Kerning: horizontal kerning" + " (%ld, %ld) scaled down to (%ld, %ld) pixels\n", + orig_x_rounded / 64, orig_y_rounded / 64, + akerning->x / 64, akerning->y / 64 )); + } +#endif + } + } + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ) + { + FT_Service_Kerning service; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !akerning ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_FIND_SERVICE( face, service, KERNING ); + if ( !service ) + return FT_THROW( Unimplemented_Feature ); + + error = service->get_track( face, + point_size, + degree, + akerning ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + /* FT_ENCODING_NONE is a valid encoding for BDF, PCF, and Windows FNT */ + if ( encoding == FT_ENCODING_NONE && !face->num_charmaps ) + return FT_THROW( Invalid_Argument ); + + /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ + /* charmap available, i.e., one with UCS-4 characters, if possible. */ + /* */ + /* This is done by find_unicode_charmap() above, to share code. */ + if ( encoding == FT_ENCODING_UNICODE ) + return find_unicode_charmap( face ); + + cur = face->charmaps; + if ( !cur ) + return FT_THROW( Invalid_CharMap_Handle ); + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0]->encoding == encoding ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_THROW( Invalid_Argument ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + cur = face->charmaps; + if ( !cur || !charmap ) + return FT_THROW( Invalid_CharMap_Handle ); + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == charmap && + FT_Get_CMap_Format ( charmap ) != 14 ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_THROW( Invalid_Argument ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ) + { + FT_Int i; + + + if ( !charmap || !charmap->face ) + return -1; + + for ( i = 0; i < charmap->face->num_charmaps; i++ ) + if ( charmap->face->charmaps[i] == charmap ) + break; + + FT_ASSERT( i < charmap->face->num_charmaps ); + + return i; + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ) + { + FT_CMap_Class clazz = cmap->clazz; + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( clazz->done ) + clazz->done( cmap ); + + FT_FREE( cmap ); + } + + + FT_BASE_DEF( void ) + FT_CMap_Done( FT_CMap cmap ) + { + if ( cmap ) + { + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error; + FT_Int i, j; + + + for ( i = 0; i < face->num_charmaps; i++ ) + { + if ( (FT_CMap)face->charmaps[i] == cmap ) + { + FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; + + + if ( FT_QRENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps - 1 ) ) + return; + + /* remove it from our list of charmaps */ + for ( j = i + 1; j < face->num_charmaps; j++ ) + { + if ( j == face->num_charmaps - 1 ) + face->charmaps[j - 1] = last_charmap; + else + face->charmaps[j - 1] = face->charmaps[j]; + } + + face->num_charmaps--; + + if ( (FT_CMap)face->charmap == cmap ) + face->charmap = NULL; + + ft_cmap_done_internal( cmap ); + + break; + } + } + } + } + + + FT_BASE_DEF( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ) + { + FT_Error error; + FT_Face face; + FT_Memory memory; + FT_CMap cmap = NULL; + + + if ( !clazz || !charmap || !charmap->face ) + return FT_THROW( Invalid_Argument ); + + face = charmap->face; + memory = FT_FACE_MEMORY( face ); + + if ( !FT_ALLOC( cmap, clazz->size ) ) + { + cmap->charmap = *charmap; + cmap->clazz = clazz; + + if ( clazz->init ) + { + error = clazz->init( cmap, init_data ); + if ( error ) + goto Fail; + } + + /* add it to our list of charmaps */ + if ( FT_QRENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps + 1 ) ) + goto Fail; + + face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; + } + + Exit: + if ( acmap ) + *acmap = cmap; + + return error; + + Fail: + ft_cmap_done_internal( cmap ); + cmap = NULL; + goto Exit; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ) + { + FT_UInt result = 0; + + + if ( face && face->charmap ) + { + FT_CMap cmap = FT_CMAP( face->charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); + } + + result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); + if ( result >= (FT_UInt)face->num_glyphs ) + result = 0; + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + /* only do something if we have a charmap, and we have glyphs at all */ + if ( face && face->charmap && face->num_glyphs ) + { + gindex = FT_Get_Char_Index( face, 0 ); + if ( gindex == 0 ) + result = FT_Get_Next_Char( face, 0, &gindex ); + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong charcode, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap && face->num_glyphs ) + { + FT_UInt32 code = (FT_UInt32)charcode; + FT_CMap cmap = FT_CMAP( face->charmap ); + + + do + { + gindex = cmap->clazz->char_next( cmap, &code ); + + } while ( gindex >= (FT_UInt)face->num_glyphs ); + + result = ( gindex == 0 ) ? 0 : code; + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ) + { + FT_Error error = FT_Err_Ok; + + + if ( num_properties > 0 && !properties ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + for ( ; num_properties > 0; num_properties-- ) + { + if ( properties->tag == FT_PARAM_TAG_STEM_DARKENING ) + { + if ( properties->data ) + { + if ( *( (FT_Bool*)properties->data ) == TRUE ) + face->internal->no_stem_darkening = FALSE; + else + face->internal->no_stem_darkening = TRUE; + } + else + { + /* use module default */ + face->internal->no_stem_darkening = -1; + } + } + else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS ) + { +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + if ( properties->data ) + { + ft_memcpy( face->internal->lcd_weights, + properties->data, + FT_LCD_FILTER_FIVE_TAPS ); + face->internal->lcd_filter_func = ft_lcd_filter_fir; + } +#else + error = FT_THROW( Unimplemented_Feature ); + goto Exit; +#endif + } + else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED ) + { + if ( properties->data ) + { + face->internal->random_seed = *( (FT_Int32*)properties->data ); + if ( face->internal->random_seed < 0 ) + face->internal->random_seed = 0; + } + else + { + /* use module default */ + face->internal->random_seed = -1; + } + } + else + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( error ) + break; + + properties++; + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_UInt result = 0; + + + if ( face && + face->charmap && + face->charmap->encoding == FT_ENCODING_UNICODE ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + FT_CMap ucmap = FT_CMAP( face->charmap ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIndex:" + " too large charcode" )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIndex:" + " too large variantSelector" )); + FT_TRACE1(( " 0x%lx is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_index( vcmap, ucmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_Int result = -1; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" + " too large charcode" )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" + " too large variantSelector" )); + FT_TRACE1(( " 0x%lx is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_default( vcmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->variant_list( vcmap, memory ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetVariantsOfChar: too large charcode" )); + FT_TRACE1(( " 0x%lx is truncated\n", charcode )); + } + + result = vcmap->clazz->charvariant_list( vcmap, memory, + (FT_UInt32)charcode ); + } + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%lx is truncated\n", variantSelector )); + } + + result = vcmap->clazz->variantchar_list( vcmap, memory, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + const FT_String* glyph_name ) + { + FT_UInt result = 0; + + + if ( face && + FT_HAS_GLYPH_NAMES( face ) && + glyph_name ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->name_index ) + result = service->name_index( face, glyph_name ); + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_Error error; + FT_Service_GlyphDict service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !buffer || buffer_max == 0 ) + return FT_THROW( Invalid_Argument ); + + /* clean up buffer */ + ((FT_Byte*)buffer)[0] = '\0'; + + if ( (FT_Long)glyph_index >= face->num_glyphs ) + return FT_THROW( Invalid_Glyph_Index ); + + if ( !FT_HAS_GLYPH_NAMES( face ) ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_LOOKUP_SERVICE( face, service, GLYPH_DICT ); + if ( service && service->get_name ) + error = service->get_name( face, glyph_index, buffer, buffer_max ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Postscript_Name( FT_Face face ) + { + const char* result = NULL; + + + if ( !face ) + goto Exit; + + if ( !result ) + { + FT_Service_PsFontName service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + POSTSCRIPT_FONT_NAME ); + + if ( service && service->get_ps_font_name ) + result = service->get_ps_font_name( face ); + } + + Exit: + return result; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ) + { + void* table = NULL; + FT_Service_SFNT_Table service; + + + if ( face && FT_IS_SFNT( face ) ) + { + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service ) + table = service->get_table( face, tag ); + } + + return table; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Service_SFNT_Table service; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( !service ) + return FT_THROW( Unimplemented_Feature ); + + return service->load_table( face, tag, offset, buffer, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ) + { + FT_Service_SFNT_Table service; + FT_ULong offset; + + + /* test for valid `length' delayed to `service->table_info' */ + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( !service ) + return FT_THROW( Unimplemented_Feature ); + + return service->table_info( face, table_index, tag, &offset, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return 0; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( !service ) + return 0; + if ( service->get_cmap_info( charmap, &cmap_info )) + return 0; + + return cmap_info.language; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return -1; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( !service ) + return -1; + if ( service->get_cmap_info( charmap, &cmap_info )) + return -1; + + return cmap_info.format; + } + + + /* documentation is in ftsizes.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Activate_Size( FT_Size size ) + { + FT_Face face; + + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + face = size->face; + if ( !face || !face->driver ) + return FT_THROW( Invalid_Face_Handle ); + + /* we don't need anything more complex than that; all size objects */ + /* are already listed by the face */ + face->size = size; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* lookup a renderer by glyph format in the library's list */ + FT_BASE_DEF( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ) + { + FT_ListNode cur; + FT_Renderer result = NULL; + + + if ( !library ) + goto Exit; + + cur = library->renderers.head; + + if ( node ) + { + if ( *node ) + cur = (*node)->next; + *node = NULL; + } + + while ( cur ) + { + FT_Renderer renderer = FT_RENDERER( cur->data ); + + + if ( renderer->glyph_format == format ) + { + if ( node ) + *node = cur; + + result = renderer; + break; + } + cur = cur->next; + } + + Exit: + return result; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ) + { + FT_Face face = slot->face; + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Renderer result = library->cur_renderer; + + + if ( !result || result->glyph_format != slot->format ) + result = FT_Lookup_Renderer( library, slot->format, 0 ); + + return result; + } + + + static void + ft_set_current_renderer( FT_Library library ) + { + FT_Renderer renderer; + + + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); + library->cur_renderer = renderer; + } + + + static FT_Error + ft_add_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_Error error; + FT_ListNode node = NULL; + + + if ( FT_QNEW( node ) ) + goto Exit; + + { + FT_Renderer render = FT_RENDERER( module ); + FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; + + + render->clazz = clazz; + render->glyph_format = clazz->glyph_format; + + /* allocate raster object if needed */ + if ( clazz->raster_class && clazz->raster_class->raster_new ) + { + error = clazz->raster_class->raster_new( memory, &render->raster ); + if ( error ) + goto Fail; + + render->raster_render = clazz->raster_class->raster_render; + render->render = clazz->render_glyph; + } + +#ifdef FT_CONFIG_OPTION_SVG + if ( clazz->glyph_format == FT_GLYPH_FORMAT_SVG ) + render->render = clazz->render_glyph; +#endif + + /* add to list */ + node->data = module; + FT_List_Add( &library->renderers, node ); + + ft_set_current_renderer( library ); + } + + Fail: + if ( error ) + FT_FREE( node ); + + Exit: + return error; + } + + + static void + ft_remove_renderer( FT_Module module ) + { + FT_Library library; + FT_Memory memory; + FT_ListNode node; + + + library = module->library; + if ( !library ) + return; + + memory = library->memory; + + node = FT_List_Find( &library->renderers, module ); + if ( node ) + { + FT_Renderer render = FT_RENDERER( module ); + + + /* release raster object, if any */ + if ( render->raster ) + render->clazz->raster_class->raster_done( render->raster ); + + /* remove from list */ + FT_List_Remove( &library->renderers, node ); + FT_FREE( node ); + + ft_set_current_renderer( library ); + } + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ) + { + /* test for valid `library' delayed to `FT_Lookup_Renderer' */ + + return FT_Lookup_Renderer( library, format, 0 ); + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ) + { + FT_ListNode node; + FT_Error error = FT_Err_Ok; + + FT_Renderer_SetModeFunc set_mode; + + + if ( !library ) + { + error = FT_THROW( Invalid_Library_Handle ); + goto Exit; + } + + if ( !renderer ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( num_params > 0 && !parameters ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + node = FT_List_Find( &library->renderers, renderer ); + if ( !node ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_List_Up( &library->renderers, node ); + + if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) + library->cur_renderer = renderer; + + set_mode = renderer->clazz->set_mode; + + for ( ; num_params > 0; num_params-- ) + { + error = set_mode( renderer, parameters->tag, parameters->data ); + if ( error ) + break; + parameters++; + } + + Exit: + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Error error = FT_Err_Ok; + FT_Face face = slot->face; + FT_Renderer renderer; + + + switch ( slot->format ) + { + default: + if ( slot->internal->load_flags & FT_LOAD_COLOR ) + { + FT_LayerIterator iterator; + + FT_UInt base_glyph = slot->glyph_index; + + FT_Bool have_layers; + FT_UInt glyph_index; + FT_UInt color_index; + + + /* check whether we have colored glyph layers */ + iterator.p = NULL; + have_layers = FT_Get_Color_Glyph_Layer( face, + base_glyph, + &glyph_index, + &color_index, + &iterator ); + if ( have_layers ) + { + error = FT_New_GlyphSlot( face, NULL ); + if ( !error ) + { + TT_Face ttface = (TT_Face)face; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + + + do + { + FT_Int32 load_flags = slot->internal->load_flags; + + + /* disable the `FT_LOAD_COLOR' flag to avoid recursion */ + /* right here in this function */ + load_flags &= ~FT_LOAD_COLOR; + + /* render into the new `face->glyph' glyph slot */ + load_flags |= FT_LOAD_RENDER; + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + break; + + /* blend new `face->glyph' into old `slot'; */ + /* at the first call, `slot' is still empty */ + error = sfnt->colr_blend( ttface, + color_index, + slot, + face->glyph ); + if ( error ) + break; + + } while ( FT_Get_Color_Glyph_Layer( face, + base_glyph, + &glyph_index, + &color_index, + &iterator ) ); + + if ( !error ) + slot->format = FT_GLYPH_FORMAT_BITMAP; + + /* this call also restores `slot' as the glyph slot */ + FT_Done_GlyphSlot( face->glyph ); + } + + if ( !error ) + return error; + + /* Failed to do the colored layer. Draw outline instead. */ + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + } + + { + FT_ListNode node = NULL; + + + /* small shortcut for the very common case */ + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + renderer = library->cur_renderer; + node = library->renderers.head; + } + else + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + + error = FT_ERR( Cannot_Render_Glyph ); + while ( renderer ) + { + error = renderer->render( renderer, slot, render_mode, NULL ); + if ( !error || + FT_ERR_NEQ( error, Cannot_Render_Glyph ) ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format. */ + + /* now, look for another renderer that supports the same */ + /* format. */ + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + } + + /* it is not an error if we cannot render a bitmap glyph */ + if ( FT_ERR_EQ( error, Cannot_Render_Glyph ) && + slot->format == FT_GLYPH_FORMAT_BITMAP ) + error = FT_Err_Ok; + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + +#undef FT_COMPONENT +#define FT_COMPONENT checksum + + /* + * Computing the MD5 checksum is expensive, unnecessarily distorting a + * possible profiling of FreeType if compiled with tracing support. For + * this reason, we execute the following code only if explicitly + * requested. + */ + + /* we use FT_TRACE3 in this block */ + if ( !error && + ft_trace_levels[trace_checksum] >= 3 && + slot->bitmap.buffer ) + { + FT_Bitmap bitmap; + FT_Error err; + + + FT_Bitmap_Init( &bitmap ); + + /* we convert to a single bitmap format for computing the checksum */ + /* this also converts the bitmap flow to `down' (i.e., pitch > 0) */ + err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 ); + if ( !err ) + { + MD5_CTX ctx; + unsigned char md5[16]; + unsigned long coverage = 0; + int i, j; + int rows = (int)bitmap.rows; + int pitch = bitmap.pitch; + + + FT_TRACE3(( "FT_Render_Glyph: bitmap %dx%d, %s (mode %d)\n", + pitch, + rows, + pixel_modes[slot->bitmap.pixel_mode], + slot->bitmap.pixel_mode )); + + for ( i = 0; i < rows; i++ ) + for ( j = 0; j < pitch; j++ ) + coverage += bitmap.buffer[i * pitch + j]; + + FT_TRACE3(( " Total coverage: %lu\n", coverage )); + + MD5_Init( &ctx ); + if ( bitmap.buffer ) + MD5_Update( &ctx, bitmap.buffer, + (unsigned long)rows * (unsigned long)pitch ); + MD5_Final( md5, &ctx ); + + FT_TRACE3(( " MD5 checksum: " )); + for ( i = 0; i < 16; i++ ) + FT_TRACE3(( "%02X", md5[i] )); + FT_TRACE3(( "\n" )); + } + + FT_Bitmap_Done( library, &bitmap ); + } + + /* + * Dump bitmap in Netpbm format (PBM or PGM). + */ + + /* we use FT_TRACE7 in this block */ + if ( !error && + ft_trace_levels[trace_checksum] >= 7 && + slot->bitmap.buffer ) + { + if ( slot->bitmap.rows < 128U && + slot->bitmap.width < 128U ) + { + int rows = (int)slot->bitmap.rows; + int width = (int)slot->bitmap.width; + int pitch = slot->bitmap.pitch; + int i, j, m; + + unsigned char* topleft = slot->bitmap.buffer; + + + if ( pitch < 0 ) + topleft -= pitch * ( rows - 1 ); + + FT_TRACE7(( "Netpbm image: start\n" )); + switch ( slot->bitmap.pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + FT_TRACE7(( "P1 %d %d\n", width, rows )); + for ( i = 0; i < rows; i++ ) + { + for ( j = 0; j < width; ) + for ( m = 128; m > 0 && j < width; m >>= 1, j++ ) + FT_TRACE7(( " %d", + ( topleft[i * pitch + j / 8] & m ) != 0 )); + FT_TRACE7(( "\n" )); + } + break; + + default: + FT_TRACE7(( "P2 %d %d 255\n", width, rows )); + for ( i = 0; i < rows; i++ ) + { + for ( j = 0; j < width; j += 1 ) + FT_TRACE7(( " %3u", topleft[i * pitch + j] )); + FT_TRACE7(( "\n" )); + } + } + FT_TRACE7(( "Netpbm image: end\n" )); + } + else + FT_TRACE7(( "Netpbm image: too large, omitted\n" )); + } + +#undef FT_COMPONENT +#define FT_COMPONENT objs + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Library library; + + + if ( !slot || !slot->face ) + return FT_THROW( Invalid_Argument ); + + library = FT_FACE_LIBRARY( slot->face ); + + return FT_Render_Glyph_Internal( library, slot, render_mode ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @Function: + * Destroy_Module + * + * @Description: + * Destroys a given module object. For drivers, this also destroys + * all child faces. + * + * @InOut: + * module :: + * A handle to the target driver object. + * + * @Note: + * The driver _must_ be LOCKED! + */ + static void + Destroy_Module( FT_Module module ) + { + FT_Memory memory = module->memory; + FT_Module_Class* clazz = module->clazz; + FT_Library library = module->library; + + + if ( library && library->auto_hinter == module ) + library->auto_hinter = NULL; + + /* if the module is a renderer */ + if ( FT_MODULE_IS_RENDERER( module ) ) + ft_remove_renderer( module ); + + /* if the module is a font driver, add some steps */ + if ( FT_MODULE_IS_DRIVER( module ) ) + Destroy_Driver( FT_DRIVER( module ) ); + + /* finalize the module object */ + if ( clazz->module_done ) + clazz->module_done( module ); + + /* discard it */ + FT_FREE( module ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ) + { + FT_Error error; + FT_Memory memory; + FT_Module module = NULL; + FT_UInt nn; + + +#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ + FREETYPE_MINOR ) + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !clazz ) + return FT_THROW( Invalid_Argument ); + + /* check FreeType version */ + if ( clazz->module_requires > FREETYPE_VER_FIXED ) + return FT_THROW( Invalid_Version ); + + /* look for a module with the same name in the library's table */ + for ( nn = 0; nn < library->num_modules; nn++ ) + { + module = library->modules[nn]; + if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) + { + /* this installed module has the same name, compare their versions */ + if ( clazz->module_version <= module->clazz->module_version ) + return FT_THROW( Lower_Module_Version ); + + /* remove the module from our list, then exit the loop to replace */ + /* it by our new version.. */ + FT_Remove_Module( library, module ); + break; + } + } + + memory = library->memory; + error = FT_Err_Ok; + + if ( library->num_modules >= FT_MAX_MODULES ) + { + error = FT_THROW( Too_Many_Drivers ); + goto Exit; + } + + /* allocate module object */ + if ( FT_ALLOC( module, clazz->module_size ) ) + goto Exit; + + /* base initialization */ + module->library = library; + module->memory = memory; + module->clazz = (FT_Module_Class*)clazz; + + /* check whether the module is a renderer - this must be performed */ + /* before the normal module initialization */ + if ( FT_MODULE_IS_RENDERER( module ) ) + { + /* add to the renderers list */ + error = ft_add_renderer( module ); + if ( error ) + goto Fail; + } + + /* is the module a auto-hinter? */ + if ( FT_MODULE_IS_HINTER( module ) ) + library->auto_hinter = module; + + /* if the module is a font driver */ + if ( FT_MODULE_IS_DRIVER( module ) ) + { + FT_Driver driver = FT_DRIVER( module ); + + + driver->clazz = (FT_Driver_Class)module->clazz; + } + + if ( clazz->module_init ) + { + error = clazz->module_init( module ); + if ( error ) + goto Fail; + } + + /* add module to the library's table */ + library->modules[library->num_modules++] = module; + + Exit: + return error; + + Fail: + if ( FT_MODULE_IS_RENDERER( module ) ) + { + FT_Renderer renderer = FT_RENDERER( module ); + + + if ( renderer->clazz && + renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + renderer->raster ) + renderer->clazz->raster_class->raster_done( renderer->raster ); + } + + FT_FREE( module ); + goto Exit; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ) + { + FT_Module result = NULL; + FT_Module* cur; + FT_Module* limit; + + + if ( !library || !module_name ) + return result; + + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) + { + result = cur[0]; + break; + } + + return result; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ) + { + FT_Module module; + + + /* test for valid `library' delayed to FT_Get_Module() */ + + module = FT_Get_Module( library, mod_name ); + + return module ? module->clazz->module_interface : 0; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id, + FT_Bool global ) + { + FT_Pointer result = NULL; + + + if ( module ) + { + FT_ASSERT( module->clazz && module->clazz->get_interface ); + + /* first, look for the service in the module */ + if ( module->clazz->get_interface ) + result = module->clazz->get_interface( module, service_id ); + + if ( global && !result ) + { + /* we didn't find it, look in all other modules then */ + FT_Library library = module->library; + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] != module ) + { + FT_ASSERT( cur[0]->clazz ); + + if ( cur[0]->clazz->get_interface ) + { + result = cur[0]->clazz->get_interface( cur[0], service_id ); + if ( result ) + break; + } + } + } + } + } + + return result; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ) + { + /* try to find the module from the table, then remove it from there */ + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( module ) + { + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == module ) + { + /* remove it from the table */ + library->num_modules--; + limit--; + while ( cur < limit ) + { + cur[0] = cur[1]; + cur++; + } + limit[0] = NULL; + + /* destroy the module */ + Destroy_Module( module ); + + return FT_Err_Ok; + } + } + } + return FT_THROW( Invalid_Driver_Handle ); + } + + + static FT_Error + ft_property_do( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value, + FT_Bool set, + FT_Bool value_is_string ) + { + FT_Module* cur; + FT_Module* limit; + FT_Module_Interface interface; + + FT_Service_Properties service; + +#ifdef FT_DEBUG_LEVEL_ERROR + const FT_String* set_name = "FT_Property_Set"; + const FT_String* get_name = "FT_Property_Get"; + const FT_String* func_name = set ? set_name : get_name; +#endif + + FT_Bool missing_func; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !module_name || !property_name || !value ) + return FT_THROW( Invalid_Argument ); + + cur = library->modules; + limit = cur + library->num_modules; + + /* search module */ + for ( ; cur < limit; cur++ ) + if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) ) + break; + + if ( cur == limit ) + { + FT_TRACE2(( "%s: can't find module `%s'\n", + func_name, module_name )); + return FT_THROW( Missing_Module ); + } + + /* check whether we have a service interface */ + if ( !cur[0]->clazz->get_interface ) + { + FT_TRACE2(( "%s: module `%s' doesn't support properties\n", + func_name, module_name )); + return FT_THROW( Unimplemented_Feature ); + } + + /* search property service */ + interface = cur[0]->clazz->get_interface( cur[0], + FT_SERVICE_ID_PROPERTIES ); + if ( !interface ) + { + FT_TRACE2(( "%s: module `%s' doesn't support properties\n", + func_name, module_name )); + return FT_THROW( Unimplemented_Feature ); + } + + service = (FT_Service_Properties)interface; + + if ( set ) + missing_func = FT_BOOL( !service->set_property ); + else + missing_func = FT_BOOL( !service->get_property ); + + if ( missing_func ) + { + FT_TRACE2(( "%s: property service of module `%s' is broken\n", + func_name, module_name )); + return FT_THROW( Unimplemented_Feature ); + } + + return set ? service->set_property( cur[0], + property_name, + value, + value_is_string ) + : service->get_property( cur[0], + property_name, + value ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ) + { + return ft_property_do( library, + module_name, + property_name, + (void*)value, + TRUE, + FALSE ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ) + { + return ft_property_do( library, + module_name, + property_name, + value, + FALSE, + FALSE ); + } + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + /* this variant is used for handling the FREETYPE_PROPERTIES */ + /* environment variable */ + + FT_BASE_DEF( FT_Error ) + ft_property_string_set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + FT_String* value ) + { + return ft_property_do( library, + module_name, + property_name, + (void*)value, + TRUE, + TRUE ); + } + +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Library( FT_Library library ) + { + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + library->refcount++; + + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ) + { + FT_Library library = NULL; + FT_Error error; + + + if ( !memory || !alibrary ) + return FT_THROW( Invalid_Argument ); + +#ifndef FT_DEBUG_LOGGING +#ifdef FT_DEBUG_LEVEL_ERROR + /* init debugging support */ + ft_debug_init(); +#endif /* FT_DEBUG_LEVEL_ERROR */ +#endif /* !FT_DEBUG_LOGGING */ + + /* first of all, allocate the library object */ + if ( FT_NEW( library ) ) + return error; + + library->memory = memory; + + library->version_major = FREETYPE_MAJOR; + library->version_minor = FREETYPE_MINOR; + library->version_patch = FREETYPE_PATCH; + + library->refcount = 1; + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ) + { + FT_Int major = 0; + FT_Int minor = 0; + FT_Int patch = 0; + + + if ( library ) + { + major = library->version_major; + minor = library->version_minor; + patch = library->version_patch; + } + + if ( amajor ) + *amajor = major; + + if ( aminor ) + *aminor = minor; + + if ( apatch ) + *apatch = patch; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Library( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + library->refcount--; + if ( library->refcount > 0 ) + goto Exit; + + memory = library->memory; + + /* + * Close all faces in the library. If we don't do this, we can have + * some subtle memory leaks. + * + * Example: + * + * - the cff font driver uses the pshinter module in cff_size_done + * - if the pshinter module is destroyed before the cff font driver, + * opened FT_Face objects managed by the driver are not properly + * destroyed, resulting in a memory leak + * + * Some faces are dependent on other faces, like Type42 faces that + * depend on TrueType faces synthesized internally. + * + * The order of drivers should be specified in driver_name[]. + */ + { + FT_UInt m, n; + const char* driver_name[] = { "type42", NULL }; + + + for ( m = 0; + m < sizeof ( driver_name ) / sizeof ( driver_name[0] ); + m++ ) + { + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + const char* module_name = module->clazz->module_name; + FT_List faces; + + + if ( driver_name[m] && + ft_strcmp( module_name, driver_name[m] ) != 0 ) + continue; + + if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) + continue; + + FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name )); + + faces = &FT_DRIVER( module )->faces_list; + while ( faces->head ) + { + FT_Done_Face( FT_FACE( faces->head->data ) ); + if ( faces->head ) + FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); + } + } + } + } + + /* Close all other modules in the library */ +#if 1 + /* XXX Modules are removed in the reversed order so that */ + /* type42 module is removed before truetype module. This */ + /* avoids double free in some occasions. It is a hack. */ + while ( library->num_modules > 0 ) + FT_Remove_Module( library, + library->modules[library->num_modules - 1] ); +#else + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + + + if ( module ) + { + Destroy_Module( module ); + library->modules[n] = NULL; + } + } + } +#endif + + FT_FREE( library ); + + Exit: + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ) + { + if ( library && debug_hook && + hook_index < + ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) + library->debug_hooks[hook_index] = debug_hook; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ) + { + FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; + + + if ( library ) + { + FT_Module module = FT_Get_Module( library, "truetype" ); + + + if ( module ) + { + FT_Service_TrueTypeEngine service; + + + service = (FT_Service_TrueTypeEngine) + ft_module_get_service( module, + FT_SERVICE_ID_TRUETYPE_ENGINE, + 0 ); + if ( service ) + result = service->engine_type; + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( glyph && + glyph->subglyphs && + glyph->format == FT_GLYPH_FORMAT_COMPOSITE && + sub_index < glyph->num_subglyphs ) + { + FT_SubGlyph subg = glyph->subglyphs + sub_index; + + + *p_index = subg->index; + *p_flags = subg->flags; + *p_arg1 = subg->arg1; + *p_arg2 = subg->arg2; + *p_transform = subg->transform; + + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Get_Color_Glyph_Layer( FT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ) + { + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face || + !aglyph_index || + !acolor_index || + !iterator || + base_glyph >= (FT_UInt)face->num_glyphs ) + return 0; + + if ( !FT_IS_SFNT( face ) ) + return 0; + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + if ( sfnt->get_colr_layer ) + return sfnt->get_colr_layer( ttface, + base_glyph, + aglyph_index, + acolor_index, + iterator ); + else + return 0; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Get_Color_Glyph_Paint( FT_Face face, + FT_UInt base_glyph, + FT_Color_Root_Transform root_transform, + FT_OpaquePaint* paint ) + { + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face || !paint ) + return 0; + + if ( !FT_IS_SFNT( face ) ) + return 0; + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + if ( sfnt->get_colr_layer ) + return sfnt->get_colr_glyph_paint( ttface, + base_glyph, + root_transform, + paint ); + else + return 0; + } + + + /* documentation is in ftcolor.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Get_Color_Glyph_ClipBox( FT_Face face, + FT_UInt base_glyph, + FT_ClipBox* clip_box ) + { + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face || !clip_box ) + return 0; + + if ( !FT_IS_SFNT( face ) ) + return 0; + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + if ( sfnt->get_color_glyph_clipbox ) + return sfnt->get_color_glyph_clipbox( ttface, + base_glyph, + clip_box ); + else + return 0; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Get_Paint_Layers( FT_Face face, + FT_LayerIterator* layer_iterator, + FT_OpaquePaint* paint ) + { + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face || !paint || !layer_iterator ) + return 0; + + if ( !FT_IS_SFNT( face ) ) + return 0; + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + if ( sfnt->get_paint_layers ) + return sfnt->get_paint_layers( ttface, layer_iterator, paint ); + else + return 0; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Get_Paint( FT_Face face, + FT_OpaquePaint opaque_paint, + FT_COLR_Paint* paint ) + { + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face || !paint ) + return 0; + + if ( !FT_IS_SFNT( face ) ) + return 0; + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + if ( sfnt->get_paint ) + return sfnt->get_paint( ttface, opaque_paint, paint ); + else + return 0; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Get_Colorline_Stops ( FT_Face face, + FT_ColorStop * color_stop, + FT_ColorStopIterator *iterator ) + { + TT_Face ttface; + SFNT_Service sfnt; + + + if ( !face || !color_stop || !iterator ) + return 0; + + if ( !FT_IS_SFNT( face ) ) + return 0; + + ttface = (TT_Face)face; + sfnt = (SFNT_Service)ttface->sfnt; + + if ( sfnt->get_colorline_stops ) + return sfnt->get_colorline_stops ( ttface, color_stop, iterator ); + else + return 0; + } + + +/* END */ diff --git a/external/freetype/src/base/ftotval.c b/external/freetype/src/base/ftotval.c new file mode 100644 index 000000000..192e12a71 --- /dev/null +++ b/external/freetype/src/base/ftotval.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * + * ftotval.c + * + * FreeType API for validating OpenType tables (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/internal/ftdebug.h> + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svotval.h> +#include <freetype/ftotval.h> + + + /* documentation is in ftotval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ) + { + FT_Service_OTvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( !( BASE_table && + GDEF_table && + GPOS_table && + GSUB_table && + JSTF_table ) ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + BASE_table, + GDEF_table, + GPOS_table, + GSUB_table, + JSTF_table ); + else + error = FT_THROW( Unimplemented_Feature ); + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( table ); + } + + +/* END */ diff --git a/external/freetype/src/base/ftoutln.c b/external/freetype/src/base/ftoutln.c new file mode 100644 index 000000000..134f39d2b --- /dev/null +++ b/external/freetype/src/base/ftoutln.c @@ -0,0 +1,1118 @@ +/**************************************************************************** + * + * ftoutln.c + * + * FreeType outline management (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftoutln.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/fttrigon.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT outline + + + static + const FT_Outline null_outline = { 0, 0, NULL, NULL, NULL, 0 }; + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( (x) * ( 1L << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_Int first; /* index of first point in contour */ + FT_Int last; /* index of last point in contour */ + + FT_Int tag; /* current point's state */ + + FT_Int shift; + FT_Pos delta; + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !func_interface ) + return FT_THROW( Invalid_Argument ); + + shift = func_interface->shift; + delta = func_interface->delta; + + last = -1; + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_TRACE5(( "FT_Outline_Decompose: Contour %d\n", n )); + + first = last + 1; + last = outline->contours[n]; + if ( last < first ) + goto Invalid_Outline; + + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + /* v_last = v_start; */ + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + (double)v_start.x / 64, (double)v_start.y / 64 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + (double)vec.x / 64, (double)vec.y / 64 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + (double)vec.x / 64, + (double)vec.y / 64, + (double)v_control.x / 64, + (double)v_control.y / 64 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + (double)v_middle.x / 64, + (double)v_middle.y / 64, + (double)v_control.x / 64, + (double)v_control.y / 64 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + (double)v_start.x / 64, + (double)v_start.y / 64, + (double)v_control.x / 64, + (double)v_control.y / 64 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + (double)vec.x / 64, + (double)vec.y / 64, + (double)vec1.x / 64, + (double)vec1.y / 64, + (double)vec2.x / 64, + (double)vec2.y / 64 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + (double)v_start.x / 64, + (double)v_start.y / 64, + (double)vec1.x / 64, + (double)vec1.y / 64, + (double)vec2.x / 64, + (double)vec2.y / 64 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + (double)v_start.x / 64, (double)v_start.y / 64 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n" )); + return FT_Err_Ok; + + Invalid_Outline: + error = FT_THROW( Invalid_Outline ); + /* fall through */ + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error )); + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + FT_Error error; + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + memory = library->memory; + + if ( !anoutline || !memory ) + return FT_THROW( Invalid_Argument ); + + *anoutline = null_outline; + + if ( numContours < 0 || + (FT_UInt)numContours > numPoints ) + return FT_THROW( Invalid_Argument ); + + if ( numPoints > FT_OUTLINE_POINTS_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || + FT_NEW_ARRAY( anoutline->tags, numPoints ) || + FT_NEW_ARRAY( anoutline->contours, numContours ) ) + goto Fail; + + anoutline->n_points = (FT_Short)numPoints; + anoutline->n_contours = (FT_Short)numContours; + anoutline->flags |= FT_OUTLINE_OWNER; + + return FT_Err_Ok; + + Fail: + anoutline->flags |= FT_OUTLINE_OWNER; + FT_Outline_Done( library, anoutline ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Check( FT_Outline* outline ) + { + if ( outline ) + { + FT_Int n_points = outline->n_points; + FT_Int n_contours = outline->n_contours; + FT_Int end0, end; + FT_Int n; + + + /* empty glyph? */ + if ( n_points == 0 && n_contours == 0 ) + return FT_Err_Ok; + + /* check point and contour counts */ + if ( n_points <= 0 || n_contours <= 0 ) + goto Bad; + + end0 = -1; + for ( n = 0; n < n_contours; n++ ) + { + end = outline->contours[n]; + + /* note that we don't accept empty contours */ + if ( end <= end0 || end >= n_points ) + goto Bad; + + end0 = end; + } + + if ( end0 != n_points - 1 ) + goto Bad; + + /* XXX: check the tags array */ + return FT_Err_Ok; + } + + Bad: + return FT_THROW( Invalid_Outline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ) + { + FT_Int is_owner; + + + if ( !source || !target ) + return FT_THROW( Invalid_Outline ); + + if ( source->n_points != target->n_points || + source->n_contours != target->n_contours ) + return FT_THROW( Invalid_Argument ); + + if ( source == target ) + return FT_Err_Ok; + + if ( source->n_points ) + { + FT_ARRAY_COPY( target->points, source->points, source->n_points ); + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + } + + if ( source->n_contours ) + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + + /* copy all flags, except the `FT_OUTLINE_OWNER' one */ + is_owner = target->flags & FT_OUTLINE_OWNER; + target->flags = source->flags; + + target->flags &= ~FT_OUTLINE_OWNER; + target->flags |= is_owner; + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + memory = library->memory; + + if ( !memory ) + return FT_THROW( Invalid_Argument ); + + if ( outline->flags & FT_OUTLINE_OWNER ) + { + FT_FREE( outline->points ); + FT_FREE( outline->tags ); + FT_FREE( outline->contours ); + } + *outline = null_outline; + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + FT_Pos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + FT_Pos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ) + { + FT_UShort n; + FT_Vector* vec; + + + if ( !outline ) + return; + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + vec->x = ADD_LONG( vec->x, xOffset ); + vec->y = ADD_LONG( vec->y, yOffset ); + vec++; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Reverse( FT_Outline* outline ) + { + FT_UShort n; + FT_Int first, last; + + + if ( !outline ) + return; + + last = -1; + for ( n = 0; n < outline->n_contours; n++ ) + { + /* keep the first contour point as is and swap points around it */ + /* to guarantee that the cubic arches stay valid after reverse */ + first = last + 2; + last = outline->contours[n]; + + /* reverse point table */ + { + FT_Vector* p = outline->points + first; + FT_Vector* q = outline->points + last; + FT_Vector swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + /* reverse tags table */ + { + char* p = outline->tags + first; + char* q = outline->tags + last; + + + while ( p < q ) + { + char swap; + + + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + } + + outline->flags ^= FT_OUTLINE_REVERSE_FILL; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ) + { + FT_Error error; + FT_Renderer renderer; + FT_ListNode node; + FT_BBox cbox; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !params ) + return FT_THROW( Invalid_Argument ); + + FT_Outline_Get_CBox( outline, &cbox ); + if ( cbox.xMin < -0x1000000L || cbox.yMin < -0x1000000L || + cbox.xMax > 0x1000000L || cbox.yMax > 0x1000000L ) + return FT_THROW( Invalid_Outline ); + + renderer = library->cur_renderer; + node = library->renderers.head; + + params->source = (void*)outline; + + /* preset clip_box for direct mode */ + if ( params->flags & FT_RASTER_FLAG_DIRECT && + !( params->flags & FT_RASTER_FLAG_CLIP ) ) + { + params->clip_box.xMin = cbox.xMin >> 6; + params->clip_box.yMin = cbox.yMin >> 6; + params->clip_box.xMax = ( cbox.xMax + 63 ) >> 6; + params->clip_box.yMax = ( cbox.yMax + 63 ) >> 6; + } + + error = FT_ERR( Cannot_Render_Glyph ); + while ( renderer ) + { + error = renderer->raster_render( renderer->raster, params ); + if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format */ + + /* now, look for another renderer that supports the same */ + /* format */ + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, + &node ); + } + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ) + { + FT_Raster_Params params; + + + if ( !abitmap ) + return FT_THROW( Invalid_Argument ); + + /* other checks are delayed to `FT_Outline_Render' */ + + params.target = abitmap; + params.flags = 0; + + if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + params.flags |= FT_RASTER_FLAG_AA; + + return FT_Outline_Render( library, outline, &params ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ) + { + FT_Pos xz, yz; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulFix( vector->x, matrix->xx ) + + FT_MulFix( vector->y, matrix->xy ); + + yz = FT_MulFix( vector->x, matrix->yx ) + + FT_MulFix( vector->y, matrix->yy ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ) + { + FT_Vector* vec; + FT_Vector* limit; + + + if ( !outline || !matrix || !outline->points ) + return; + + vec = outline->points; + limit = vec + outline->n_points; + + for ( ; vec < limit; vec++ ) + FT_Vector_Transform( vec, matrix ); + } + + +#if 0 + +#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ + do \ + { \ + (first) = ( c > 0 ) ? (outline)->points + \ + (outline)->contours[c - 1] + 1 \ + : (outline)->points; \ + (last) = (outline)->points + (outline)->contours[c]; \ + } while ( 0 ) + + + /* Is a point in some contour? */ + /* */ + /* We treat every point of the contour as if it */ + /* it were ON. That is, we allow false positives, */ + /* but disallow false negatives. (XXX really?) */ + static FT_Bool + ft_contour_has( FT_Outline* outline, + FT_Short c, + FT_Vector* point ) + { + FT_Vector* first; + FT_Vector* last; + FT_Vector* a; + FT_Vector* b; + FT_UInt n = 0; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( a = first; a <= last; a++ ) + { + FT_Pos x; + FT_Int intersect; + + + b = ( a == last ) ? first : a + 1; + + intersect = ( a->y - point->y ) ^ ( b->y - point->y ); + + /* a and b are on the same side */ + if ( intersect >= 0 ) + { + if ( intersect == 0 && a->y == point->y ) + { + if ( ( a->x <= point->x && b->x >= point->x ) || + ( a->x >= point->x && b->x <= point->x ) ) + return 1; + } + + continue; + } + + x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); + + if ( x < point->x ) + n++; + else if ( x == point->x ) + return 1; + } + + return n & 1; + } + + + static FT_Bool + ft_contour_enclosed( FT_Outline* outline, + FT_UShort c ) + { + FT_Vector* first; + FT_Vector* last; + FT_Short i; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( i = 0; i < outline->n_contours; i++ ) + { + if ( i != c && ft_contour_has( outline, i, first ) ) + { + FT_Vector* pt; + + + for ( pt = first + 1; pt <= last; pt++ ) + if ( !ft_contour_has( outline, i, pt ) ) + return 0; + + return 1; + } + } + + return 0; + } + + + /* This version differs from the public one in that each */ + /* part (contour not enclosed in another contour) of the */ + /* outline is checked for orientation. This is */ + /* necessary for some buggy CJK fonts. */ + static FT_Orientation + ft_outline_get_orientation( FT_Outline* outline ) + { + FT_Short i; + FT_Vector* first; + FT_Vector* last; + FT_Orientation orient = FT_ORIENTATION_NONE; + + + first = outline->points; + for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) + { + FT_Vector* point; + FT_Vector* xmin_point; + FT_Pos xmin; + + + last = outline->points + outline->contours[i]; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + if ( ft_contour_enclosed( outline, i ) ) + continue; + + xmin = first->x; + xmin_point = first; + + for ( point = first + 1; point <= last; point++ ) + { + if ( point->x < xmin ) + { + xmin = point->x; + xmin_point = point; + } + } + + /* check the orientation of the contour */ + { + FT_Vector* prev; + FT_Vector* next; + FT_Orientation o; + + + prev = ( xmin_point == first ) ? last : xmin_point - 1; + next = ( xmin_point == last ) ? first : xmin_point + 1; + + if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > + FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) + o = FT_ORIENTATION_POSTSCRIPT; + else + o = FT_ORIENTATION_TRUETYPE; + + if ( orient == FT_ORIENTATION_NONE ) + orient = o; + else if ( orient != o ) + return FT_ORIENTATION_NONE; + } + } + + return orient; + } + +#endif /* 0 */ + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ) + { + return FT_Outline_EmboldenXY( outline, strength, strength ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ) + { + FT_Vector* points; + FT_Int c, first, last; + FT_Orientation orientation; + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + xstrength /= 2; + ystrength /= 2; + if ( xstrength == 0 && ystrength == 0 ) + return FT_Err_Ok; + + orientation = FT_Outline_Get_Orientation( outline ); + if ( orientation == FT_ORIENTATION_NONE ) + { + if ( outline->n_contours ) + return FT_THROW( Invalid_Argument ); + else + return FT_Err_Ok; + } + + points = outline->points; + + last = -1; + for ( c = 0; c < outline->n_contours; c++ ) + { + FT_Vector in, out, anchor, shift; + FT_Fixed l_in, l_out, l_anchor = 0, l, q, d; + FT_Int i, j, k; + + + first = last + 1; + last = outline->contours[c]; + l_in = 0; + + /* pacify compiler */ + in.x = in.y = anchor.x = anchor.y = 0; + + /* Counter j cycles though the points; counter i advances only */ + /* when points are moved; anchor k marks the first moved point. */ + for ( i = last, j = first, k = -1; + j != i && i != k; + j = j < last ? j + 1 : first ) + { + if ( j != k ) + { + out.x = points[j].x - points[i].x; + out.y = points[j].y - points[i].y; + l_out = (FT_Fixed)FT_Vector_NormLen( &out ); + + if ( l_out == 0 ) + continue; + } + else + { + out = anchor; + l_out = l_anchor; + } + + if ( l_in != 0 ) + { + if ( k < 0 ) + { + k = i; + anchor = in; + l_anchor = l_in; + } + + d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y ); + + /* shift only if turn is less than ~160 degrees */ + if ( d > -0xF000L ) + { + d = d + 0x10000L; + + /* shift components along lateral bisector in proper orientation */ + shift.x = in.y + out.y; + shift.y = in.x + out.x; + + if ( orientation == FT_ORIENTATION_TRUETYPE ) + shift.x = -shift.x; + else + shift.y = -shift.y; + + /* restrict shift magnitude to better handle collapsing segments */ + q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x ); + if ( orientation == FT_ORIENTATION_TRUETYPE ) + q = -q; + + l = FT_MIN( l_in, l_out ); + + /* non-strict inequalities avoid divide-by-zero when q == l == 0 */ + if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) ) + shift.x = FT_MulDiv( shift.x, xstrength, d ); + else + shift.x = FT_MulDiv( shift.x, l, q ); + + + if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) ) + shift.y = FT_MulDiv( shift.y, ystrength, d ); + else + shift.y = FT_MulDiv( shift.y, l, q ); + } + else + shift.x = shift.y = 0; + + for ( ; + i != j; + i = i < last ? i + 1 : first ) + { + points[i].x += xstrength + shift.x; + points[i].y += ystrength + shift.y; + } + } + else + i = j; + + in = out; + l_in = l_out; + } + } + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ) + { + FT_BBox cbox = { 0, 0, 0, 0 }; + FT_Int xshift, yshift; + FT_Vector* points; + FT_Vector v_prev, v_cur; + FT_Int c, n, first, last; + FT_Pos area = 0; + + + if ( !outline || outline->n_points <= 0 ) + return FT_ORIENTATION_TRUETYPE; + + /* We use the nonzero winding rule to find the orientation. */ + /* Since glyph outlines behave much more `regular' than arbitrary */ + /* cubic or quadratic curves, this test deals with the polygon */ + /* only that is spanned up by the control points. */ + + FT_Outline_Get_CBox( outline, &cbox ); + + /* Handle collapsed outlines to avoid undefined FT_MSB. */ + if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax ) + return FT_ORIENTATION_NONE; + + /* Reject values large outlines. */ + if ( cbox.xMin < -0x1000000L || cbox.yMin < -0x1000000L || + cbox.xMax > 0x1000000L || cbox.yMax > 0x1000000L ) + return FT_ORIENTATION_NONE; + + xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) | + FT_ABS( cbox.xMin ) ) ) - 14; + xshift = FT_MAX( xshift, 0 ); + + yshift = FT_MSB( (FT_UInt32)( cbox.yMax - cbox.yMin ) ) - 14; + yshift = FT_MAX( yshift, 0 ); + + points = outline->points; + + last = -1; + for ( c = 0; c < outline->n_contours; c++ ) + { + first = last + 1; + last = outline->contours[c]; + + v_prev.x = points[last].x >> xshift; + v_prev.y = points[last].y >> yshift; + + for ( n = first; n <= last; n++ ) + { + v_cur.x = points[n].x >> xshift; + v_cur.y = points[n].y >> yshift; + + area = ADD_LONG( area, + MUL_LONG( v_cur.y - v_prev.y, + v_cur.x + v_prev.x ) ); + + v_prev = v_cur; + } + } + + if ( area > 0 ) + return FT_ORIENTATION_POSTSCRIPT; + else if ( area < 0 ) + return FT_ORIENTATION_TRUETYPE; + else + return FT_ORIENTATION_NONE; + } + + +/* END */ diff --git a/external/freetype/src/base/ftpatent.c b/external/freetype/src/base/ftpatent.c new file mode 100644 index 000000000..cb5efadff --- /dev/null +++ b/external/freetype/src/base/ftpatent.c @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * ftpatent.c + * + * FreeType API for checking patented TrueType bytecode instructions + * (body). Obsolete, retained for backward compatibility. + * + * Copyright (C) 2007-2023 by + * David Turner. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/freetype.h> +#include <freetype/tttags.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/services/svsfnt.h> +#include <freetype/internal/services/svttglyf.h> + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ) + { + FT_UNUSED( face ); + + return FALSE; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ) + { + FT_UNUSED( face ); + FT_UNUSED( value ); + + return FALSE; + } + +/* END */ diff --git a/external/freetype/src/base/ftpfr.c b/external/freetype/src/base/ftpfr.c new file mode 100644 index 000000000..378385a59 --- /dev/null +++ b/external/freetype/src/base/ftpfr.c @@ -0,0 +1,152 @@ +/**************************************************************************** + * + * ftpfr.c + * + * FreeType API for accessing PFR-specific data (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/internal/ftdebug.h> + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svpfr.h> + + + /* check the format */ + static FT_Service_PfrMetrics + ft_pfr_check( FT_Face face ) + { + FT_Service_PfrMetrics service = NULL; + + + if ( face ) + FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); + + return service; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + FT_Error error = FT_Err_Ok; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_metrics( face, + aoutline_resolution, + ametrics_resolution, + ametrics_x_scale, + ametrics_y_scale ); + } + else + { + FT_Fixed x_scale, y_scale; + + + /* this is not a PFR font */ + if ( aoutline_resolution ) + *aoutline_resolution = face->units_per_EM; + + if ( ametrics_resolution ) + *ametrics_resolution = face->units_per_EM; + + x_scale = y_scale = 0x10000L; + if ( face->size ) + { + x_scale = face->size->metrics.x_scale; + y_scale = face->size->metrics.y_scale; + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + error = FT_THROW( Unknown_File_Format ); + } + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !avector ) + return FT_THROW( Invalid_Argument ); + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_kerning( face, left, right, avector ); + else + error = FT_Get_Kerning( face, left, right, + FT_KERNING_UNSCALED, avector ); + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !aadvance ) + return FT_THROW( Invalid_Argument ); + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_advance( face, gindex, aadvance ); + else + /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ + error = FT_THROW( Invalid_Argument ); + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftpsprop.c b/external/freetype/src/base/ftpsprop.c new file mode 100644 index 000000000..cefdf489d --- /dev/null +++ b/external/freetype/src/base/ftpsprop.c @@ -0,0 +1,284 @@ +/**************************************************************************** + * + * ftpsprop.c + * + * Get and set properties of PostScript drivers (body). + * See `ftdriver.h' for available properties. + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftdriver.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/psaux.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftpsprop.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT psprops + + + FT_BASE_CALLBACK_DEF( FT_Error ) + ps_property_set( FT_Module module, /* PS_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + PS_Driver driver = (PS_Driver)module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_Int dp[8]; + + + if ( value_is_string ) + { + const char* s = (const char*)value; + char* ep; + int i; + + + /* eight comma-separated numbers */ + for ( i = 0; i < 7; i++ ) + { + dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( *ep != ',' || s == ep ) + return FT_THROW( Invalid_Argument ); + + s = ep + 1; + } + + dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) + return FT_THROW( Invalid_Argument ); + + darken_params = dp; + } + else +#endif + darken_params = (FT_Int*)value; + + x1 = darken_params[0]; + y1 = darken_params[1]; + x2 = darken_params[2]; + y2 = darken_params[3]; + x3 = darken_params[4]; + y3 = darken_params[5]; + x4 = darken_params[6]; + y4 = darken_params[7]; + + if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || + y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || + x1 > x2 || x2 > x3 || x3 > x4 || + y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) + return FT_THROW( Invalid_Argument ); + + driver->darken_params[0] = x1; + driver->darken_params[1] = y1; + driver->darken_params[2] = x2; + driver->darken_params[3] = y2; + driver->darken_params[4] = x3; + driver->darken_params[5] = y3; + driver->darken_params[6] = x4; + driver->darken_params[7] = y4; + + return error; + } + + else if ( !ft_strcmp( property_name, "hinting-engine" ) ) + { +#if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \ + defined( T1_CONFIG_OPTION_OLD_ENGINE ) + const char* module_name = module->clazz->module_name; +#endif + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + if ( !ft_strcmp( s, "adobe" ) ) + driver->hinting_engine = FT_HINTING_ADOBE; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + else if ( !ft_strcmp( module_name, "cff" ) && + !ft_strcmp( s, "freetype" ) ) + driver->hinting_engine = FT_HINTING_FREETYPE; +#endif + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + else if ( ( !ft_strcmp( module_name, "type1" ) || + !ft_strcmp( module_name, "t1cid" ) ) && + !ft_strcmp( s, "freetype" ) ) + driver->hinting_engine = FT_HINTING_FREETYPE; +#endif + + else + return FT_THROW( Invalid_Argument ); + } + else +#endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */ + { + FT_UInt* hinting_engine = (FT_UInt*)value; + + + if ( *hinting_engine == FT_HINTING_ADOBE +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + || ( *hinting_engine == FT_HINTING_FREETYPE && + !ft_strcmp( module_name, "cff" ) ) +#endif +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + || ( *hinting_engine == FT_HINTING_FREETYPE && + ( !ft_strcmp( module_name, "type1" ) || + !ft_strcmp( module_name, "t1cid" ) ) ) +#endif + ) + driver->hinting_engine = *hinting_engine; + else + error = FT_ERR( Unimplemented_Feature ); + } + + return error; + } + + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long nsd = ft_strtol( s, NULL, 10 ); + + + if ( !nsd ) + driver->no_stem_darkening = FALSE; + else + driver->no_stem_darkening = TRUE; + } + else +#endif + { + FT_Bool* no_stem_darkening = (FT_Bool*)value; + + + driver->no_stem_darkening = *no_stem_darkening; + } + + return error; + } + + else if ( !ft_strcmp( property_name, "random-seed" ) ) + { + FT_Int32 random_seed; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + random_seed = (FT_Int32)ft_strtol( s, NULL, 10 ); + } + else +#endif + random_seed = *(FT_Int32*)value; + + if ( random_seed < 0 ) + random_seed = 0; + + driver->random_seed = random_seed; + + return error; + } + + FT_TRACE2(( "ps_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_BASE_CALLBACK_DEF( FT_Error ) + ps_property_get( FT_Module module, /* PS_Driver */ + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + PS_Driver driver = (PS_Driver)module; + + + if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params = driver->darken_params; + FT_Int* val = (FT_Int*)value; + + + val[0] = darken_params[0]; + val[1] = darken_params[1]; + val[2] = darken_params[2]; + val[3] = darken_params[3]; + val[4] = darken_params[4]; + val[5] = darken_params[5]; + val[6] = darken_params[6]; + val[7] = darken_params[7]; + + return error; + } + + else if ( !ft_strcmp( property_name, "hinting-engine" ) ) + { + FT_UInt hinting_engine = driver->hinting_engine; + FT_UInt* val = (FT_UInt*)value; + + + *val = hinting_engine; + + return error; + } + + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { + FT_Bool no_stem_darkening = driver->no_stem_darkening; + FT_Bool* val = (FT_Bool*)value; + + + *val = no_stem_darkening; + + return error; + } + + FT_TRACE2(( "ps_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + +/* END */ diff --git a/external/freetype/src/base/ftrfork.c b/external/freetype/src/base/ftrfork.c new file mode 100644 index 000000000..2ab430195 --- /dev/null +++ b/external/freetype/src/base/ftrfork.c @@ -0,0 +1,934 @@ +/**************************************************************************** + * + * ftrfork.c + * + * Embedded resource forks accessor (body). + * + * Copyright (C) 2004-2023 by + * Masatake YAMATO and Redhat K.K. + * + * FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are + * derived from ftobjs.c. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * Development of the code in this file is support of + * Information-technology Promotion Agency, Japan. + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftrfork.h> + +#include "ftbase.h" + +#undef FT_COMPONENT +#define FT_COMPONENT raccess + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Resource fork directory access ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ) + { + FT_Error error; + unsigned char head[16], head2[16]; + FT_Long map_pos, map_len, rdata_len; + int allzeros, allmatch, i; + FT_Long type_list; + + FT_UNUSED( library ); + + + error = FT_Stream_Seek( stream, (FT_ULong)rfork_offset ); + if ( error ) + return error; + + error = FT_Stream_Read( stream, (FT_Byte*)head, 16 ); + if ( error ) + return error; + + /* ensure positive values */ + if ( head[0] >= 0x80 || + head[4] >= 0x80 || + head[8] >= 0x80 || + head[12] >= 0x80 ) + return FT_THROW( Unknown_File_Format ); + + *rdata_pos = ( head[ 0] << 24 ) | + ( head[ 1] << 16 ) | + ( head[ 2] << 8 ) | + head[ 3]; + map_pos = ( head[ 4] << 24 ) | + ( head[ 5] << 16 ) | + ( head[ 6] << 8 ) | + head[ 7]; + rdata_len = ( head[ 8] << 24 ) | + ( head[ 9] << 16 ) | + ( head[10] << 8 ) | + head[11]; + map_len = ( head[12] << 24 ) | + ( head[13] << 16 ) | + ( head[14] << 8 ) | + head[15]; + + /* the map must not be empty */ + if ( !map_pos ) + return FT_THROW( Unknown_File_Format ); + + /* check whether rdata and map overlap */ + if ( *rdata_pos < map_pos ) + { + if ( *rdata_pos > map_pos - rdata_len ) + return FT_THROW( Unknown_File_Format ); + } + else + { + if ( map_pos > *rdata_pos - map_len ) + return FT_THROW( Unknown_File_Format ); + } + + /* check whether end of rdata or map exceeds stream size */ + if ( FT_LONG_MAX - rdata_len < *rdata_pos || + FT_LONG_MAX - map_len < map_pos || + + FT_LONG_MAX - ( *rdata_pos + rdata_len ) < rfork_offset || + FT_LONG_MAX - ( map_pos + map_len ) < rfork_offset || + + (FT_ULong)( rfork_offset + *rdata_pos + rdata_len ) > stream->size || + (FT_ULong)( rfork_offset + map_pos + map_len ) > stream->size ) + return FT_THROW( Unknown_File_Format ); + + *rdata_pos += rfork_offset; + map_pos += rfork_offset; + + error = FT_Stream_Seek( stream, (FT_ULong)map_pos ); + if ( error ) + return error; + + head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + + error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); + if ( error ) + return error; + + allzeros = 1; + allmatch = 1; + for ( i = 0; i < 16; i++ ) + { + if ( head2[i] != 0 ) + allzeros = 0; + if ( head2[i] != head[i] ) + allmatch = 0; + } + if ( !allzeros && !allmatch ) + return FT_THROW( Unknown_File_Format ); + + /* If we have reached this point then it is probably a mac resource */ + /* file. Now, does it contain any interesting resources? */ + + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + + 2 /* skip file resource number */ + + 2 ); /* skip attributes */ + + if ( FT_READ_SHORT( type_list ) ) + return error; + if ( type_list < 0 ) + return FT_THROW( Unknown_File_Format ); + + error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) ); + if ( error ) + return error; + + *map_offset = map_pos + type_list; + return FT_Err_Ok; + } + + + FT_COMPARE_DEF( int ) + ft_raccess_sort_ref_by_id( const void* a, + const void* b ) + { + return ( (FT_RFork_Ref*)a )->res_id - ( (FT_RFork_Ref*)b )->res_id; + } + + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Bool sort_by_res_id, + FT_Long **offsets, + FT_Long *count ) + { + FT_Error error; + int i, j, cnt, subcnt; + FT_Long tag_internal, rpos; + FT_Memory memory = library->memory; + FT_Long temp; + FT_Long *offsets_internal = NULL; + FT_RFork_Ref *ref = NULL; + + + FT_TRACE3(( "\n" )); + error = FT_Stream_Seek( stream, (FT_ULong)map_offset ); + if ( error ) + return error; + + if ( FT_READ_SHORT( cnt ) ) + return error; + cnt++; + + /* `rpos' is a signed 16bit integer offset to resource records; the */ + /* size of a resource record is 12 bytes. The map header is 28 bytes, */ + /* and a type list needs 10 bytes or more. If we assume that the name */ + /* list is empty and we have only a single entry in the type list, */ + /* there can be at most */ + /* */ + /* (32768 - 28 - 10) / 12 = 2727 */ + /* */ + /* resources. */ + /* */ + /* A type list starts with a two-byte counter, followed by 10-byte */ + /* type records. Assuming that there are no resources, the number of */ + /* type records can be at most */ + /* */ + /* (32768 - 28 - 2) / 8 = 4079 */ + /* */ + if ( cnt > 4079 ) + return FT_THROW( Invalid_Table ); + + for ( i = 0; i < cnt; i++ ) + { + if ( FT_READ_LONG( tag_internal ) || + FT_READ_SHORT( subcnt ) || + FT_READ_SHORT( rpos ) ) + return error; + + FT_TRACE2(( "Resource tags: %c%c%c%c\n", + (char)( 0xFF & ( tag_internal >> 24 ) ), + (char)( 0xFF & ( tag_internal >> 16 ) ), + (char)( 0xFF & ( tag_internal >> 8 ) ), + (char)( 0xFF & ( tag_internal >> 0 ) ) )); + FT_TRACE3(( " : subcount=%d, suboffset=0x%04lx\n", + subcnt, rpos )); + + if ( tag_internal == tag ) + { + *count = subcnt + 1; + rpos += map_offset; + + /* a zero count might be valid in the resource specification, */ + /* however, it is completely useless to us */ + if ( *count < 1 || *count > 2727 ) + return FT_THROW( Invalid_Table ); + + error = FT_Stream_Seek( stream, (FT_ULong)rpos ); + if ( error ) + return error; + + if ( FT_QNEW_ARRAY( ref, *count ) ) + return error; + + for ( j = 0; j < *count; j++ ) + { + if ( FT_READ_SHORT( ref[j].res_id ) ) + goto Exit; + if ( FT_STREAM_SKIP( 2 ) ) /* resource name offset */ + goto Exit; + if ( FT_READ_LONG( temp ) ) /* attributes (8bit), offset (24bit) */ + goto Exit; + if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + goto Exit; + + /* + * According to Inside Macintosh: More Macintosh Toolbox, + * "Resource IDs" (1-46), there are some reserved IDs. + * However, FreeType2 is not a font synthesizer, no need + * to check the acceptable resource ID. + */ + if ( temp < 0 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + ref[j].offset = temp & 0xFFFFFFL; + + FT_TRACE3(( " [%d]:" + " resource_id=0x%04x, offset=0x%08lx\n", + j, (FT_UShort)ref[j].res_id, ref[j].offset )); + } + + if ( sort_by_res_id ) + { + ft_qsort( ref, + (size_t)*count, + sizeof ( FT_RFork_Ref ), + ft_raccess_sort_ref_by_id ); + + FT_TRACE3(( " -- sort resources by their ids --\n" )); + + for ( j = 0; j < *count; j++ ) + FT_TRACE3(( " [%d]:" + " resource_id=0x%04x, offset=0x%08lx\n", + j, ref[j].res_id, ref[j].offset )); + } + + if ( FT_QNEW_ARRAY( offsets_internal, *count ) ) + goto Exit; + + /* XXX: duplicated reference ID, + * gap between reference IDs are acceptable? + * further investigation on Apple implementation is needed. + */ + for ( j = 0; j < *count; j++ ) + offsets_internal[j] = rdata_pos + ref[j].offset; + + *offsets = offsets_internal; + error = FT_Err_Ok; + + Exit: + FT_FREE( ref ); + return error; + } + } + + return FT_THROW( Cannot_Open_Resource ); + } + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Guessing functions ****/ + /**** ****/ + /**** When you add a new guessing function, ****/ + /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + CONST_FT_RFORK_RULE_ARRAY_BEGIN( ft_raccess_guess_table, + ft_raccess_guess_rec ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( apple_double, apple_double ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( apple_single, apple_single ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( darwin_ufs_export, darwin_ufs_export ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( darwin_newvfs, darwin_newvfs ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( darwin_hfsplus, darwin_hfsplus ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( vfat, vfat ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( linux_cap, linux_cap ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( linux_double, linux_double ) + CONST_FT_RFORK_RULE_ARRAY_ENTRY( linux_netatalk, linux_netatalk ) + CONST_FT_RFORK_RULE_ARRAY_END + + + /*************************************************************************/ + /**** ****/ + /**** Helper functions ****/ + /**** ****/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char* file_name, + FT_Long *result_offset ); + + static char * + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ); + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Int i; + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + if ( NULL != stream ) + errors[i] = FT_Stream_Seek( stream, 0 ); + else + errors[i] = FT_Err_Ok; + + if ( errors[i] ) + continue; + + errors[i] = ft_raccess_guess_table[i].func( library, + stream, base_name, + &(new_names[i]), + &(offsets[i]) ); + } + + return; + } + + +#if defined( FT_CONFIG_OPTION_MAC_FONTS ) && !defined( FT_MACINTOSH ) + static FT_RFork_Rule + raccess_get_rule_type_from_rule_index( FT_Library library, + FT_UInt rule_index ) + { + FT_UNUSED( library ); + + if ( rule_index >= FT_RACCESS_N_RULES ) + return FT_RFork_Rule_invalid; + + return ft_raccess_guess_table[rule_index].type; + } + + + /* + * For this function, refer ftbase.h. + */ + FT_LOCAL_DEF( FT_Bool ) + ft_raccess_rule_by_darwin_vfs( FT_Library library, + FT_UInt rule_index ) + { + switch( raccess_get_rule_type_from_rule_index( library, rule_index ) ) + { + case FT_RFork_Rule_darwin_newvfs: + case FT_RFork_Rule_darwin_hfsplus: + return TRUE; + + default: + return FALSE; + } + } +#endif + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x07; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_THROW( Cannot_Open_Stream ); + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x00; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_THROW( Cannot_Open_Stream ); + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + newpath = raccess_make_file_name( memory, base_file_name, "._" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with hfs+ drivers (or Macs). + */ + FT_Error error; + char* newpath = NULL; + FT_Memory memory; + FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 6 > FT_INT_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_QALLOC( newpath, base_file_len + 6 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with Mac OS X (> 10.1). + */ + FT_Error error; + char* newpath = NULL; + FT_Memory memory; + FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 18 > FT_INT_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_QALLOC( newpath, base_file_len + 18 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + "resource.frk/" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, "%" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + ".AppleDouble/" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ) + { + FT_Int32 magic_from_stream; + FT_Error error; + FT_Int32 version_number = 0; + FT_UShort n_of_entries; + + int i; + FT_Int32 entry_id, entry_offset, entry_length = 0; + + const FT_Int32 resource_fork_entry_id = 0x2; + + FT_UNUSED( library ); + FT_UNUSED( base_file_name ); + FT_UNUSED( version_number ); + FT_UNUSED( entry_length ); + + + if ( FT_READ_LONG( magic_from_stream ) ) + return error; + if ( magic_from_stream != magic ) + return FT_THROW( Unknown_File_Format ); + + if ( FT_READ_LONG( version_number ) ) + return error; + + /* filler */ + error = FT_Stream_Skip( stream, 16 ); + if ( error ) + return error; + + if ( FT_READ_USHORT( n_of_entries ) ) + return error; + if ( n_of_entries == 0 ) + return FT_THROW( Unknown_File_Format ); + + for ( i = 0; i < n_of_entries; i++ ) + { + if ( FT_READ_LONG( entry_id ) ) + return error; + if ( entry_id == resource_fork_entry_id ) + { + if ( FT_READ_LONG( entry_offset ) || + FT_READ_LONG( entry_length ) ) + continue; + *result_offset = entry_offset; + + return FT_Err_Ok; + } + else + { + error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + if ( error ) + return error; + } + } + + return FT_THROW( Unknown_File_Format ); + } + + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char *file_name, + FT_Long *result_offset ) + { + FT_Open_Args args2; + FT_Stream stream2; + char* nouse = NULL; + FT_Error error; + + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_name; + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + return error; + + error = raccess_guess_apple_double( library, stream2, file_name, + &nouse, result_offset ); + + FT_Stream_Free( stream2, 0 ); + + return error; + } + + + static char* + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ) + { + char* new_name = NULL; + const char* tmp; + const char* slash; + size_t new_length; + FT_Error error; + + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_QALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, + original_name, + (size_t)( tmp - original_name + 1 ) ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /************************************************************************** + * Dummy function; just sets errors + */ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char *base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Int i; + + FT_UNUSED( library ); + FT_UNUSED( stream ); + FT_UNUSED( base_name ); + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_ERR( Unimplemented_Feature ); + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/external/freetype/src/base/ftsnames.c b/external/freetype/src/base/ftsnames.c new file mode 100644 index 000000000..1917a3f1d --- /dev/null +++ b/external/freetype/src/base/ftsnames.c @@ -0,0 +1,185 @@ +/**************************************************************************** + * + * ftsnames.c + * + * Simple interface to access SFNT name tables (which are used + * to hold font names, copyright info, notices, etc.) (body). + * + * This is _not_ used to retrieve glyph names! + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include <freetype/ftsnames.h> +#include <freetype/internal/tttypes.h> +#include <freetype/internal/ftstream.h> + + +#ifdef TT_CONFIG_OPTION_SFNT_NAMES + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ) + { + return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; + } + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( idx < (FT_UInt)ttface->num_names ) + { + TT_Name entry = ttface->name_table.names + idx; + + + /* load name on demand */ + if ( entry->stringLength > 0 && !entry->string ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_QNEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + aname->platform_id = entry->platformID; + aname->encoding_id = entry->encodingID; + aname->language_id = entry->languageID; + aname->name_id = entry->nameID; + aname->string = (FT_Byte*)entry->string; + aname->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( alangTag && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->name_table.format != 1 ) + return FT_THROW( Invalid_Table ); + + if ( langID > 0x8000U && + langID - 0x8000U < ttface->name_table.numLangTagRecords ) + { + TT_LangTag entry = ttface->name_table.langTags + + ( langID - 0x8000U ); + + + /* load name on demand */ + if ( entry->stringLength > 0 && !entry->string ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_QNEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + alangTag->string = (FT_Byte*)entry->string; + alangTag->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#else /* !TT_CONFIG_OPTION_SFNT_NAMES */ + + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ) + { + FT_UNUSED( face ); + + return 0; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_UNUSED( face ); + FT_UNUSED( idx ); + FT_UNUSED( aname ); + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ) + { + FT_UNUSED( face ); + FT_UNUSED( langID ); + FT_UNUSED( alangTag ); + + return FT_THROW( Unimplemented_Feature ); + } + + +#endif /* !TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ diff --git a/external/freetype/src/base/ftstream.c b/external/freetype/src/base/ftstream.c new file mode 100644 index 000000000..64826aceb --- /dev/null +++ b/external/freetype/src/base/ftstream.c @@ -0,0 +1,872 @@ +/**************************************************************************** + * + * ftstream.c + * + * I/O stream support (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftdebug.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT stream + + + FT_BASE_DEF( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ) + { + stream->base = (FT_Byte*) base; + stream->size = size; + stream->pos = 0; + stream->cursor = NULL; + stream->read = NULL; + stream->close = NULL; + } + + + FT_BASE_DEF( void ) + FT_Stream_Close( FT_Stream stream ) + { + if ( stream && stream->close ) + stream->close( stream ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ) + { + FT_Error error = FT_Err_Ok; + + + if ( stream->read ) + { + if ( stream->read( stream, pos, NULL, 0 ) ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + } + } + /* note that seeking to the first position after the file is valid */ + else if ( pos > stream->size ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + } + + if ( !error ) + stream->pos = pos; + + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ) + { + if ( distance < 0 ) + return FT_THROW( Invalid_Stream_Operation ); + + return FT_Stream_Seek( stream, stream->pos + (FT_ULong)distance ); + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_Pos( FT_Stream stream ) + { + return stream->pos; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + if ( pos >= stream->size ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + return FT_THROW( Invalid_Stream_Operation ); + } + + if ( stream->read ) + read_bytes = stream->read( stream, pos, buffer, count ); + else + { + read_bytes = stream->size - pos; + if ( read_bytes > count ) + read_bytes = count; + + /* Allow "reading" zero bytes without UB even if buffer is NULL */ + if ( count ) + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + } + + stream->pos = pos + read_bytes; + + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + error = FT_THROW( Invalid_Stream_Operation ); + } + + return error; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong read_bytes = 0; + + + if ( stream->pos >= stream->size ) + goto Exit; + + if ( stream->read ) + read_bytes = stream->read( stream, stream->pos, buffer, count ); + else + { + read_bytes = stream->size - stream->pos; + if ( read_bytes > count ) + read_bytes = count; + + /* Allow "reading" zero bytes without UB even if buffer is NULL */ + if ( count ) + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + } + + stream->pos += read_bytes; + + Exit: + return read_bytes; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + FT_Error error; + + + error = FT_Stream_EnterFrame( stream, count ); + if ( !error ) + { + *pbytes = (FT_Byte*)stream->cursor; + + /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ + stream->cursor = NULL; + stream->limit = NULL; + } + + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ) + { + if ( stream && stream->read ) + { + FT_Memory memory = stream->memory; + + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, *pbytes ); +#else + FT_FREE( *pbytes ); +#endif + } + + *pbytes = NULL; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + FT_TRACE7(( "FT_Stream_EnterFrame: %ld bytes\n", count )); + + /* check for nested frame access */ + FT_ASSERT( stream && stream->cursor == 0 ); + + if ( stream->read ) + { + /* allocate the frame in memory */ + FT_Memory memory = stream->memory; + + + /* simple sanity check */ + if ( count > stream->size ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " frame size (%lu) larger than stream size (%lu)\n", + count, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + goto Exit; + } + +#ifdef FT_DEBUG_MEMORY + /* assume `ft_debug_file_` and `ft_debug_lineno_` are already set */ + stream->base = (unsigned char*)ft_mem_qalloc( memory, + (FT_Long)count, + &error ); + if ( error ) + goto Exit; +#else + if ( FT_QALLOC( stream->base, count ) ) + goto Exit; +#endif + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + FT_FREE( stream->base ); + error = FT_THROW( Invalid_Stream_Operation ); + } + + stream->cursor = stream->base; + stream->limit = FT_OFFSET( stream->cursor, count ); + stream->pos += read_bytes; + } + else + { + /* check current and new position */ + if ( stream->pos >= stream->size || + stream->size - stream->pos < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", + stream->pos, count, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->limit = stream->cursor + count; + stream->pos += count; + } + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ExitFrame( FT_Stream stream ) + { + /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ + /* that it is possible to access a frame of length 0 in */ + /* some weird fonts (usually, when accessing an array of */ + /* 0 records, like in some strange kern tables). */ + /* */ + /* In this case, the loader code handles the 0-length table */ + /* gracefully; however, stream.cursor is really set to 0 by the */ + /* FT_Stream_EnterFrame() call, and this is not an error. */ + + FT_TRACE7(( "FT_Stream_ExitFrame\n" )); + + FT_ASSERT( stream ); + + if ( stream->read ) + { + FT_Memory memory = stream->memory; + + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, stream->base ); + stream->base = NULL; +#else + FT_FREE( stream->base ); +#endif + } + + stream->cursor = NULL; + stream->limit = NULL; + } + + + FT_BASE_DEF( FT_Byte ) + FT_Stream_GetByte( FT_Stream stream ) + { + FT_Byte result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + if ( stream->cursor < stream->limit ) + result = *stream->cursor++; + + return result; + } + + + FT_BASE_DEF( FT_UInt16 ) + FT_Stream_GetUShort( FT_Stream stream ) + { + FT_Byte* p; + FT_UInt16 result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_USHORT( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_UInt16 ) + FT_Stream_GetUShortLE( FT_Stream stream ) + { + FT_Byte* p; + FT_UInt16 result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_USHORT_LE( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_UInt32 ) + FT_Stream_GetUOffset( FT_Stream stream ) + { + FT_Byte* p; + FT_UInt32 result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 2 < stream->limit ) + result = FT_NEXT_UOFF3( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_UInt32 ) + FT_Stream_GetULong( FT_Stream stream ) + { + FT_Byte* p; + FT_UInt32 result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_ULONG( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_UInt32 ) + FT_Stream_GetULongLE( FT_Stream stream ) + { + FT_Byte* p; + FT_UInt32 result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_ULONG_LE( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Byte ) + FT_Stream_ReadByte( FT_Stream stream, + FT_Error* error ) + { + FT_Byte result = 0; + + + FT_ASSERT( stream ); + + if ( stream->pos < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) + goto Fail; + } + else + result = stream->base[stream->pos]; + } + else + goto Fail; + + stream->pos++; + + *error = FT_Err_Ok; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadByte:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return result; + } + + + FT_BASE_DEF( FT_UInt16 ) + FT_Stream_ReadUShort( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p; + FT_UInt16 result = 0; + + + FT_ASSERT( stream ); + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_USHORT( p ); + } + else + goto Fail; + + stream->pos += 2; + + *error = FT_Err_Ok; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadUShort:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return result; + } + + + FT_BASE_DEF( FT_UInt16 ) + FT_Stream_ReadUShortLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p; + FT_UInt16 result = 0; + + + FT_ASSERT( stream ); + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_USHORT_LE( p ); + } + else + goto Fail; + + stream->pos += 2; + + *error = FT_Err_Ok; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadUShortLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return result; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_ReadUOffset( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[3]; + FT_Byte* p; + FT_ULong result = 0; + + + FT_ASSERT( stream ); + + if ( stream->pos + 2 < stream->size ) + { + if ( stream->read ) + { + if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_UOFF3( p ); + } + else + goto Fail; + + stream->pos += 3; + + *error = FT_Err_Ok; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadUOffset:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return result; + } + + + FT_BASE_DEF( FT_UInt32 ) + FT_Stream_ReadULong( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p; + FT_UInt32 result = 0; + + + FT_ASSERT( stream ); + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_ULONG( p ); + } + else + goto Fail; + + stream->pos += 4; + + *error = FT_Err_Ok; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadULong:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return result; + } + + + FT_BASE_DEF( FT_UInt32 ) + FT_Stream_ReadULongLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p; + FT_UInt32 result = 0; + + + FT_ASSERT( stream ); + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_ULONG_LE( p ); + } + else + goto Fail; + + stream->pos += 4; + + *error = FT_Err_Ok; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadULongLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return result; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ) + { + FT_Error error; + FT_Bool frame_accessed = 0; + FT_Byte* cursor; + + + if ( !fields ) + return FT_THROW( Invalid_Argument ); + + if ( !stream ) + return FT_THROW( Invalid_Stream_Handle ); + + cursor = stream->cursor; + + error = FT_Err_Ok; + do + { + FT_ULong value; + FT_Int sign_shift; + FT_Byte* p; + + + switch ( fields->value ) + { + case ft_frame_start: /* access a new frame */ + error = FT_Stream_EnterFrame( stream, fields->offset ); + if ( error ) + goto Exit; + + frame_accessed = 1; + cursor = stream->cursor; + fields++; + continue; /* loop! */ + + case ft_frame_bytes: /* read a byte sequence */ + case ft_frame_skip: /* skip some bytes */ + { + FT_UInt len = fields->size; + + + if ( cursor + len > stream->limit ) + { + error = FT_THROW( Invalid_Stream_Operation ); + goto Exit; + } + + if ( fields->value == ft_frame_bytes ) + { + p = (FT_Byte*)structure + fields->offset; + FT_MEM_COPY( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = FT_NEXT_BYTE( cursor ); + sign_shift = 24; + break; + + case ft_frame_short_be: + case ft_frame_ushort_be: /* read a 2-byte big-endian short */ + value = FT_NEXT_USHORT( cursor ); + sign_shift = 16; + break; + + case ft_frame_short_le: + case ft_frame_ushort_le: /* read a 2-byte little-endian short */ + value = FT_NEXT_USHORT_LE( cursor ); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = FT_NEXT_ULONG( cursor ); + sign_shift = 0; + break; + + case ft_frame_long_le: + case ft_frame_ulong_le: /* read a 4-byte little-endian long */ + value = FT_NEXT_ULONG_LE( cursor ); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = FT_NEXT_UOFF3( cursor ); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = FT_NEXT_UOFF3_LE( cursor ); + sign_shift = 8; + break; + + default: + /* otherwise, exit the loop */ + stream->cursor = cursor; + goto Exit; + } + + /* now, compute the signed value is necessary */ + if ( fields->value & FT_FRAME_OP_SIGNED ) + value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); + + /* finally, store the value in the object */ + + p = (FT_Byte*)structure + fields->offset; + switch ( fields->size ) + { + case ( 8 / FT_CHAR_BIT ): + *(FT_Byte*)p = (FT_Byte)value; + break; + + case ( 16 / FT_CHAR_BIT ): + *(FT_UShort*)p = (FT_UShort)value; + break; + + case ( 32 / FT_CHAR_BIT ): + *(FT_UInt32*)p = (FT_UInt32)value; + break; + + default: /* for 64-bit systems */ + *(FT_ULong*)p = (FT_ULong)value; + } + + /* go to next field */ + fields++; + } + while ( 1 ); + + Exit: + /* close the frame if it was opened by this read */ + if ( frame_accessed ) + FT_Stream_ExitFrame( stream ); + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftstroke.c b/external/freetype/src/base/ftstroke.c new file mode 100644 index 000000000..92f1e4308 --- /dev/null +++ b/external/freetype/src/base/ftstroke.c @@ -0,0 +1,2403 @@ +/**************************************************************************** + * + * ftstroke.c + * + * FreeType path stroker (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftstroke.h> +#include <freetype/fttrigon.h> +#include <freetype/ftoutln.h> +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> + + + /* declare an extern to access `ft_outline_glyph_class' globally */ + /* allocated in `ftglyph.c' */ + FT_CALLBACK_TABLE const FT_Glyph_Class ft_outline_glyph_class; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT + : FT_STROKER_BORDER_LEFT; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT + : FT_STROKER_BORDER_RIGHT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BEZIER COMPUTATIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 8 ) + +#define FT_EPSILON 2 + +#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) + + + static FT_Pos + ft_pos_abs( FT_Pos x ) + { + return x >= 0 ? x : -x; + } + + + static void + ft_conic_split( FT_Vector* base ) + { + FT_Pos a, b; + + + base[4].x = base[2].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = ( a + b ) >> 2; + base[1].x = a >> 1; + + base[4].y = base[2].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = ( a + b ) >> 2; + base[1].y = a >> 1; + } + + + static FT_Bool + ft_conic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_out ) + { + FT_Vector d1, d2; + FT_Angle theta; + FT_Int close1, close2; + + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + + if ( close1 ) + { + if ( close2 ) + { + /* basically a point; */ + /* do nothing to retain original direction */ + } + else + { + *angle_in = + *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + else /* !close1 */ + { + if ( close2 ) + { + *angle_in = + *angle_out = FT_Atan2( d1.x, d1.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + + theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); + + return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); + } + + + static void + ft_cubic_split( FT_Vector* base ) + { + FT_Pos a, b, c; + + + base[6].x = base[3].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = ( a + c ) >> 3; + + base[6].y = base[3].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = ( a + c ) >> 3; + } + + + /* Return the average of `angle1' and `angle2'. */ + /* This gives correct result even if `angle1' and `angle2' */ + /* have opposite signs. */ + static FT_Angle + ft_angle_mean( FT_Angle angle1, + FT_Angle angle2 ) + { + return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2; + } + + + static FT_Bool + ft_cubic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_mid, + FT_Angle *angle_out ) + { + FT_Vector d1, d2, d3; + FT_Angle theta1, theta2; + FT_Int close1, close2, close3; + + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); + + if ( close1 ) + { + if ( close2 ) + { + if ( close3 ) + { + /* basically a point; */ + /* do nothing to retain original direction */ + } + else /* !close3 */ + { + *angle_in = + *angle_mid = + *angle_out = FT_Atan2( d3.x, d3.y ); + } + } + else /* !close2 */ + { + if ( close3 ) + { + *angle_in = + *angle_mid = + *angle_out = FT_Atan2( d2.x, d2.y ); + } + else /* !close3 */ + { + *angle_in = + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + } + } + else /* !close1 */ + { + if ( close2 ) + { + if ( close3 ) + { + *angle_in = + *angle_mid = + *angle_out = FT_Atan2( d1.x, d1.y ); + } + else /* !close3 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + *angle_mid = ft_angle_mean( *angle_in, *angle_out ); + } + } + else /* !close2 */ + { + if ( close3 ) + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = + *angle_out = FT_Atan2( d2.x, d2.y ); + } + else /* !close3 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + } + } + + theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); + theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); + + return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && + theta2 < FT_SMALL_CUBIC_THRESHOLD ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STROKE BORDERS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef enum FT_StrokeTags_ + { + FT_STROKE_TAG_ON = 1, /* on-curve point */ + FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + FT_STROKE_TAG_END = 8 /* sub-path end */ + + } FT_StrokeTags; + +#define FT_STROKE_TAG_BEGIN_END ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END ) + + typedef struct FT_StrokeBorderRec_ + { + FT_UInt num_points; + FT_UInt max_points; + FT_Vector* points; + FT_Byte* tags; + FT_Bool movable; /* TRUE for ends of lineto borders */ + FT_Int start; /* index of current sub-path start point */ + FT_Memory memory; + FT_Bool valid; + + } FT_StrokeBorderRec, *FT_StrokeBorder; + + + static FT_Error + ft_stroke_border_grow( FT_StrokeBorder border, + FT_UInt new_points ) + { + FT_UInt old_max = border->max_points; + FT_UInt new_max = border->num_points + new_points; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + FT_UInt cur_max = old_max; + FT_Memory memory = border->memory; + + + while ( cur_max < new_max ) + cur_max += ( cur_max >> 1 ) + 16; + + if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || + FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) + goto Exit; + + border->max_points = cur_max; + } + + Exit: + return error; + } + + + static void + ft_stroke_border_close( FT_StrokeBorder border, + FT_Bool reverse ) + { + FT_UInt start = (FT_UInt)border->start; + FT_UInt count = border->num_points; + + + FT_ASSERT( border->start >= 0 ); + + /* don't record empty paths! */ + if ( count <= start + 1U ) + border->num_points = start; + else + { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; + border->tags[start] = border->tags[count]; + + if ( reverse ) + { + /* reverse the points */ + { + FT_Vector* vec1 = border->points + start + 1; + FT_Vector* vec2 = border->points + count - 1; + + + for ( ; vec1 < vec2; vec1++, vec2-- ) + { + FT_Vector tmp; + + + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + + /* then the tags */ + { + FT_Byte* tag1 = border->tags + start + 1; + FT_Byte* tag2 = border->tags + count - 1; + + + for ( ; tag1 < tag2; tag1++, tag2-- ) + { + FT_Byte tmp; + + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + + border->tags[start ] |= FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= FT_STROKE_TAG_END; + } + + border->start = -1; + border->movable = FALSE; + } + + + static FT_Error + ft_stroke_border_lineto( FT_StrokeBorder border, + FT_Vector* to, + FT_Bool movable ) + { + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( border->start >= 0 ); + + if ( border->movable ) + { + /* move last point */ + border->points[border->num_points - 1] = *to; + } + else + { + /* don't add zero-length lineto, but always add moveto */ + if ( border->num_points > (FT_UInt)border->start && + FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) && + FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) ) + return error; + + /* add one point */ + error = ft_stroke_border_grow( border, 1 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *to; + tag[0] = FT_STROKE_TAG_ON; + + border->num_points += 1; + } + } + border->movable = movable; + return error; + } + + + static FT_Error + ft_stroke_border_conicto( FT_StrokeBorder border, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 2 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control; + vec[1] = *to; + + tag[0] = 0; + tag[1] = FT_STROKE_TAG_ON; + + border->num_points += 2; + } + + border->movable = FALSE; + + return error; + } + + + static FT_Error + ft_stroke_border_cubicto( FT_StrokeBorder border, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 3 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + + tag[0] = FT_STROKE_TAG_CUBIC; + tag[1] = FT_STROKE_TAG_CUBIC; + tag[2] = FT_STROKE_TAG_ON; + + border->num_points += 3; + } + + border->movable = FALSE; + + return error; + } + + +#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) + + + static FT_Error + ft_stroke_border_arcto( FT_StrokeBorder border, + FT_Vector* center, + FT_Fixed radius, + FT_Angle angle_start, + FT_Angle angle_diff ) + { + FT_Fixed coef; + FT_Vector a0, a1, a2, a3; + FT_Int i, arcs = 1; + FT_Error error = FT_Err_Ok; + + + /* number of cubic arcs to draw */ + while ( angle_diff > FT_ARC_CUBIC_ANGLE * arcs || + -angle_diff > FT_ARC_CUBIC_ANGLE * arcs ) + arcs++; + + /* control tangents */ + coef = FT_Tan( angle_diff / ( 4 * arcs ) ); + coef += coef / 3; + + /* compute start and first control point */ + FT_Vector_From_Polar( &a0, radius, angle_start ); + a1.x = FT_MulFix( -a0.y, coef ); + a1.y = FT_MulFix( a0.x, coef ); + + a0.x += center->x; + a0.y += center->y; + a1.x += a0.x; + a1.y += a0.y; + + for ( i = 1; i <= arcs; i++ ) + { + /* compute end and second control point */ + FT_Vector_From_Polar( &a3, radius, + angle_start + i * angle_diff / arcs ); + a2.x = FT_MulFix( a3.y, coef ); + a2.y = FT_MulFix( -a3.x, coef ); + + a3.x += center->x; + a3.y += center->y; + a2.x += a3.x; + a2.y += a3.y; + + /* add cubic arc */ + error = ft_stroke_border_cubicto( border, &a1, &a2, &a3 ); + if ( error ) + break; + + /* a0 = a3; */ + a1.x = a3.x - a2.x + a3.x; + a1.y = a3.y - a2.y + a3.y; + } + + return error; + } + + + static FT_Error + ft_stroke_border_moveto( FT_StrokeBorder border, + FT_Vector* to ) + { + /* close current open path if any ? */ + if ( border->start >= 0 ) + ft_stroke_border_close( border, FALSE ); + + border->start = (FT_Int)border->num_points; + border->movable = FALSE; + + return ft_stroke_border_lineto( border, to, FALSE ); + } + + + static void + ft_stroke_border_init( FT_StrokeBorder border, + FT_Memory memory ) + { + border->memory = memory; + border->points = NULL; + border->tags = NULL; + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_reset( FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_done( FT_StrokeBorder border ) + { + FT_Memory memory = border->memory; + + + FT_FREE( border->points ); + FT_FREE( border->tags ); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static FT_Error + ft_stroke_border_get_counts( FT_StrokeBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_points = 0; + FT_UInt num_contours = 0; + + FT_UInt count = border->num_points; + FT_Vector* point = border->points; + FT_Byte* tags = border->tags; + FT_Int in_contour = 0; + + + for ( ; count > 0; count--, num_points++, point++, tags++ ) + { + if ( tags[0] & FT_STROKE_TAG_BEGIN ) + { + if ( in_contour != 0 ) + goto Fail; + + in_contour = 1; + } + else if ( in_contour == 0 ) + goto Fail; + + if ( tags[0] & FT_STROKE_TAG_END ) + { + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = TRUE; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + + Fail: + num_points = 0; + num_contours = 0; + goto Exit; + } + + + static void + ft_stroke_border_export( FT_StrokeBorder border, + FT_Outline* outline ) + { + /* copy point locations */ + if ( border->num_points ) + FT_ARRAY_COPY( outline->points + outline->n_points, + border->points, + border->num_points ); + + /* copy tags */ + { + FT_UInt count = border->num_points; + FT_Byte* read = border->tags; + FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; + + + for ( ; count > 0; count--, read++, write++ ) + { + if ( *read & FT_STROKE_TAG_ON ) + *write = FT_CURVE_TAG_ON; + else if ( *read & FT_STROKE_TAG_CUBIC ) + *write = FT_CURVE_TAG_CUBIC; + else + *write = FT_CURVE_TAG_CONIC; + } + } + + /* copy contours */ + { + FT_UInt count = border->num_points; + FT_Byte* tags = border->tags; + FT_Short* write = outline->contours + outline->n_contours; + FT_Short idx = (FT_Short)outline->n_points; + + + for ( ; count > 0; count--, tags++, idx++ ) + { + if ( *tags & FT_STROKE_TAG_END ) + { + *write++ = idx; + outline->n_contours++; + } + } + } + + outline->n_points += (short)border->num_points; + + FT_ASSERT( FT_Outline_Check( outline ) == 0 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STROKER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) + + typedef struct FT_StrokerRec_ + { + FT_Angle angle_in; /* direction into curr join */ + FT_Angle angle_out; /* direction out of join */ + FT_Vector center; /* current position */ + FT_Fixed line_length; /* length of last lineto */ + FT_Bool first_point; /* is this the start? */ + FT_Bool subpath_open; /* is the subpath open? */ + FT_Angle subpath_angle; /* subpath start direction */ + FT_Vector subpath_start; /* subpath start position */ + FT_Fixed subpath_line_length; /* subpath start lineto len */ + FT_Bool handle_wide_strokes; /* use wide strokes logic? */ + + FT_Stroker_LineCap line_cap; + FT_Stroker_LineJoin line_join; + FT_Stroker_LineJoin line_join_saved; + FT_Fixed miter_limit; + FT_Fixed radius; + + FT_StrokeBorderRec borders[2]; + FT_Library library; + + } FT_StrokerRec; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ) + { + FT_Error error; /* assigned in FT_NEW */ + FT_Memory memory; + FT_Stroker stroker = NULL; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !astroker ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + if ( !FT_NEW( stroker ) ) + { + stroker->library = library; + + ft_stroke_border_init( &stroker->borders[0], memory ); + ft_stroke_border_init( &stroker->borders[1], memory ); + } + + *astroker = stroker; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ) + { + if ( !stroker ) + return; + + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + + /* ensure miter limit has sensible value */ + if ( stroker->miter_limit < 0x10000L ) + stroker->miter_limit = 0x10000L; + + /* save line join style: */ + /* line join style can be temporarily changed when stroking curves */ + stroker->line_join_saved = line_join; + + FT_Stroker_Rewind( stroker ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Rewind( FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Done( FT_Stroker stroker ) + { + if ( stroker ) + { + FT_Memory memory = stroker->library->memory; + + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + stroker->library = NULL; + FT_FREE( stroker ); + } + } + + + /* create a circular arc at a corner or cap */ + static FT_Error + ft_stroker_arcto( FT_Stroker stroker, + FT_Int side ) + { + FT_Angle total, rotate; + FT_Fixed radius = stroker->radius; + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border = stroker->borders + side; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( total == FT_ANGLE_PI ) + total = -rotate * 2; + + error = ft_stroke_border_arcto( border, + &stroker->center, + radius, + stroker->angle_in + rotate, + total ); + border->movable = FALSE; + return error; + } + + + /* add a cap at the end of an opened path */ + static FT_Error + ft_stroker_cap( FT_Stroker stroker, + FT_Angle angle, + FT_Int side ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) + { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + FT_ANGLE_PI; + + error = ft_stroker_arcto( stroker, side ); + } + else + { + /* add a square or butt cap */ + FT_Vector middle, delta; + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + /* compute middle point and first angle point */ + FT_Vector_From_Polar( &middle, radius, angle ); + delta.x = side ? middle.y : -middle.y; + delta.y = side ? -middle.x : middle.x; + + if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + { + middle.x += stroker->center.x; + middle.y += stroker->center.y; + } + else /* FT_STROKER_LINECAP_BUTT */ + { + middle.x = stroker->center.x; + middle.y = stroker->center.y; + } + + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + delta.x = middle.x - delta.x + middle.x; + delta.y = middle.y - delta.y + middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + + Exit: + return error; + } + + + /* process an inside corner, i.e. compute intersection */ + static FT_Error + ft_stroker_inside( FT_Stroker stroker, + FT_Int side, + FT_Fixed line_length ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Angle phi, theta, rotate; + FT_Fixed length; + FT_Vector sigma = { 0, 0 }; + FT_Vector delta; + FT_Error error = FT_Err_Ok; + FT_Bool intersect; /* use intersection of lines? */ + + + rotate = FT_SIDE_TO_ROTATE( side ); + + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; + + /* Only intersect borders if between two lineto's and both */ + /* lines are long enough (line_length is zero for curves). */ + /* Also avoid U-turns of nearly 180 degree. */ + if ( !border->movable || line_length == 0 || + theta > 0x59C000 || theta < -0x59C000 ) + intersect = FALSE; + else + { + /* compute minimum required length of lines */ + FT_Fixed min_length; + + + FT_Vector_Unit( &sigma, theta ); + min_length = + ft_pos_abs( FT_MulDiv( stroker->radius, sigma.y, sigma.x ) ); + + intersect = FT_BOOL( min_length && + stroker->line_length >= min_length && + line_length >= min_length ); + } + + if ( !intersect ) + { + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + } + else + { + /* compute median angle */ + phi = stroker->angle_in + theta + rotate; + + length = FT_DivFix( stroker->radius, sigma.x ); + + FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + + return error; + } + + + /* process an outside corner, i.e. compute bevel/miter/round */ + static FT_Error + ft_stroker_outside( FT_Stroker stroker, + FT_Int side, + FT_Fixed line_length ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Error error; + FT_Angle rotate; + + + if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) + error = ft_stroker_arcto( stroker, side ); + else + { + /* this is a mitered (pointed) or beveled (truncated) corner */ + FT_Fixed radius = stroker->radius; + FT_Vector sigma = { 0, 0 }; + FT_Angle theta = 0, phi = 0; + FT_Bool bevel, fixed_bevel; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + bevel = + FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL ); + + fixed_bevel = + FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE ); + + /* check miter limit first */ + if ( !bevel ) + { + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; + + if ( theta == FT_ANGLE_PI2 ) + theta = -rotate; + + phi = stroker->angle_in + theta + rotate; + + FT_Vector_From_Polar( &sigma, stroker->miter_limit, theta ); + + /* is miter limit exceeded? */ + if ( sigma.x < 0x10000L ) + { + /* don't create variable bevels for very small deviations; */ + /* FT_Sin(x) = 0 for x <= 57 */ + if ( fixed_bevel || ft_pos_abs( theta ) > 57 ) + bevel = TRUE; + } + } + + if ( bevel ) /* this is a bevel (broken angle) */ + { + if ( fixed_bevel ) + { + /* the outer corners are simply joined together */ + FT_Vector delta; + + + /* add bevel */ + FT_Vector_From_Polar( &delta, + radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else /* variable bevel or clipped miter */ + { + /* the miter is truncated */ + FT_Vector middle, delta; + FT_Fixed coef; + + + /* compute middle point and first angle point */ + FT_Vector_From_Polar( &middle, + FT_MulFix( radius, stroker->miter_limit ), + phi ); + + coef = FT_DivFix( 0x10000L - sigma.x, sigma.y ); + delta.x = FT_MulFix( middle.y, coef ); + delta.y = FT_MulFix( -middle.x, coef ); + + middle.x += stroker->center.x; + middle.y += stroker->center.y; + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + delta.x = middle.x - delta.x + middle.x; + delta.y = middle.y - delta.y + middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* finally, add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if ( line_length == 0 ) + { + FT_Vector_From_Polar( &delta, + radius, + stroker->angle_out + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + } + } + else /* this is a miter (intersection) */ + { + FT_Fixed length; + FT_Vector delta; + + + length = FT_MulDiv( stroker->radius, stroker->miter_limit, sigma.x ); + + FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* now add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if ( line_length == 0 ) + { + FT_Vector_From_Polar( &delta, + stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + } + } + + Exit: + return error; + } + + + static FT_Error + ft_stroker_process_corner( FT_Stroker stroker, + FT_Fixed line_length ) + { + FT_Error error = FT_Err_Ok; + FT_Angle turn; + FT_Int inside_side; + + + turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn == 0 ) + goto Exit; + + /* when we turn to the right, the inside side is 0 */ + /* otherwise, the inside side is 1 */ + inside_side = ( turn < 0 ); + + /* process the inside side */ + error = ft_stroker_inside( stroker, inside_side, line_length ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, !inside_side, line_length ); + + Exit: + return error; + } + + + /* add two points to the left and right borders corresponding to the */ + /* start of the subpath */ + static FT_Error + ft_stroker_subpath_start( FT_Stroker stroker, + FT_Angle start_angle, + FT_Fixed line_length ) + { + FT_Vector delta; + FT_Vector point; + FT_Error error; + FT_StrokeBorder border; + + + FT_Vector_From_Polar( &delta, stroker->radius, + start_angle + FT_ANGLE_PI2 ); + + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + + border = stroker->borders; + error = ft_stroke_border_moveto( border, &point ); + if ( error ) + goto Exit; + + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + + border++; + error = ft_stroke_border_moveto( border, &point ); + + /* save angle, position, and line length for last join */ + /* (line_length is zero for curves) */ + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + stroker->subpath_line_length = line_length; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border; + FT_Vector delta; + FT_Angle angle; + FT_Int side; + FT_Fixed line_length; + + + if ( !stroker || !to ) + return FT_THROW( Invalid_Argument ); + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + + /* a zero-length lineto is a no-op; avoid creating a spurious corner */ + if ( delta.x == 0 && delta.y == 0 ) + goto Exit; + + /* compute length of line */ + line_length = FT_Vector_Length( &delta ); + + angle = FT_Atan2( delta.x, delta.y ); + FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); + + /* process corner if necessary */ + if ( stroker->first_point ) + { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start( stroker, angle, line_length ); + if ( error ) + goto Exit; + } + else + { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner( stroker, line_length ); + if ( error ) + goto Exit; + } + + /* now add a line segment to both the `inside' and `outside' paths */ + for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) + { + FT_Vector point; + + + point.x = to->x + delta.x; + point.y = to->y + delta.y; + + /* the ends of lineto borders are movable */ + error = ft_stroke_border_lineto( border, &point, TRUE ); + if ( error ) + goto Exit; + + delta.x = -delta.x; + delta.y = -delta.y; + } + + stroker->angle_in = angle; + stroker->center = *to; + stroker->line_length = line_length; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[34]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 30; + FT_Bool first_arc = TRUE; + + + if ( !stroker || !control || !to ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* if all control points are coincident, this is a no-op; */ + /* avoid creating a spurious corner */ + if ( FT_IS_SMALL( stroker->center.x - control->x ) && + FT_IS_SMALL( stroker->center.y - control->y ) && + FT_IS_SMALL( control->x - to->x ) && + FT_IS_SMALL( control->y - to->y ) ) + { + stroker->center = *to; + goto Exit; + } + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_out; + + + /* initialize with current direction */ + angle_in = angle_out = stroker->angle_in; + + if ( arc < limit && + !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) + { + if ( stroker->first_point ) + stroker->angle_in = angle_in; + + ft_conic_split( arc ); + arc += 2; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, angle_in, 0 ); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner( stroker, 0 ); + } + } + else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) > + FT_SMALL_CONIC_THRESHOLD / 4 ) + { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[2]; + stroker->angle_out = angle_in; + stroker->line_join = FT_STROKER_LINEJOIN_ROUND; + + error = ft_stroker_process_corner( stroker, 0 ); + + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; + } + + if ( error ) + goto Exit; + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl, end; + FT_Angle theta, phi, rotate, alpha0 = 0; + FT_Fixed length; + FT_StrokeBorder border; + FT_Int side; + + + theta = FT_Angle_Diff( angle_in, angle_out ) / 2; + phi = angle_in + theta; + length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); + + /* compute direction of original arc */ + if ( stroker->handle_wide_strokes ) + alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y ); + + for ( border = stroker->borders, side = 0; + side <= 1; + side++, border++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control point */ + FT_Vector_From_Polar( &ctrl, length, phi + rotate ); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + if ( stroker->handle_wide_strokes ) + { + FT_Vector start; + FT_Angle alpha1; + + + /* determine whether the border radius is greater than the */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = FT_Atan2( end.x - start.x, end.y - start.y ); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) > + FT_ANGLE_PI / 2 ) + { + FT_Angle beta, gamma; + FT_Vector bvec, delta; + FT_Fixed blen, sinA, sinB, alen; + + + /* use the sine rule to find the intersection point */ + beta = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y ); + gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = FT_Vector_Length( &bvec ); + + sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); + sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); + + alen = FT_MulDiv( blen, sinA, sinB ); + + FT_Vector_From_Polar( &delta, alen, beta ); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_conicto( border, &ctrl, &start ); + if ( error ) + goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_conicto( border, &ctrl, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 2; + + stroker->angle_in = angle_out; + } + + stroker->center = *to; + stroker->line_length = 0; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[37]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 32; + FT_Bool first_arc = TRUE; + + + if ( !stroker || !control1 || !control2 || !to ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* if all control points are coincident, this is a no-op; */ + /* avoid creating a spurious corner */ + if ( FT_IS_SMALL( stroker->center.x - control1->x ) && + FT_IS_SMALL( stroker->center.y - control1->y ) && + FT_IS_SMALL( control1->x - control2->x ) && + FT_IS_SMALL( control1->y - control2->y ) && + FT_IS_SMALL( control2->x - to->x ) && + FT_IS_SMALL( control2->y - to->y ) ) + { + stroker->center = *to; + goto Exit; + } + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_mid, angle_out; + + + /* initialize with current direction */ + angle_in = angle_out = angle_mid = stroker->angle_in; + + if ( arc < limit && + !ft_cubic_is_small_enough( arc, &angle_in, + &angle_mid, &angle_out ) ) + { + if ( stroker->first_point ) + stroker->angle_in = angle_in; + + ft_cubic_split( arc ); + arc += 3; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, angle_in, 0 ); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner( stroker, 0 ); + } + } + else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) > + FT_SMALL_CUBIC_THRESHOLD / 4 ) + { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[3]; + stroker->angle_out = angle_in; + stroker->line_join = FT_STROKER_LINEJOIN_ROUND; + + error = ft_stroker_process_corner( stroker, 0 ); + + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; + } + + if ( error ) + goto Exit; + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl1, ctrl2, end; + FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; + FT_Fixed length1, length2; + FT_StrokeBorder border; + FT_Int side; + + + theta1 = FT_Angle_Diff( angle_in, angle_mid ) / 2; + theta2 = FT_Angle_Diff( angle_mid, angle_out ) / 2; + phi1 = ft_angle_mean( angle_in, angle_mid ); + phi2 = ft_angle_mean( angle_mid, angle_out ); + length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); + length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) ); + + /* compute direction of original arc */ + if ( stroker->handle_wide_strokes ) + alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y ); + + for ( border = stroker->borders, side = 0; + side <= 1; + side++, border++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control points */ + FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + if ( stroker->handle_wide_strokes ) + { + FT_Vector start; + FT_Angle alpha1; + + + /* determine whether the border radius is greater than the */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = FT_Atan2( end.x - start.x, end.y - start.y ); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) > + FT_ANGLE_PI / 2 ) + { + FT_Angle beta, gamma; + FT_Vector bvec, delta; + FT_Fixed blen, sinA, sinB, alen; + + + /* use the sine rule to find the intersection point */ + beta = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y ); + gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = FT_Vector_Length( &bvec ); + + sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); + sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); + + alen = FT_MulDiv( blen, sinA, sinB ); + + FT_Vector_From_Polar( &delta, alen, beta ); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_cubicto( border, + &ctrl2, + &ctrl1, + &start ); + if ( error ) + goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 3; + + stroker->angle_in = angle_out; + } + + stroker->center = *to; + stroker->line_length = 0; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ) + { + if ( !stroker || !to ) + return FT_THROW( Invalid_Argument ); + + /* We cannot process the first point, because there is not enough */ + /* information regarding its corner/cap. The latter will be processed */ + /* in the `FT_Stroker_EndSubPath' routine. */ + /* */ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + + /* Determine if we need to check whether the border radius is greater */ + /* than the radius of curvature of a curve, to handle this case */ + /* specially. This is only required if bevel joins or butt caps may */ + /* be created, because round & miter joins and round & square caps */ + /* cover the negative sector created with wide strokes. */ + stroker->handle_wide_strokes = + FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND || + ( stroker->subpath_open && + stroker->line_cap == FT_STROKER_LINECAP_BUTT ) ); + + /* record the subpath start point for each border */ + stroker->subpath_start = *to; + + stroker->angle_in = 0; + + return FT_Err_Ok; + } + + + static FT_Error + ft_stroker_add_reverse_left( FT_Stroker stroker, + FT_Bool open ) + { + FT_StrokeBorder right = stroker->borders + 0; + FT_StrokeBorder left = stroker->borders + 1; + FT_Int new_points; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( left->start >= 0 ); + + new_points = (FT_Int)left->num_points - left->start; + if ( new_points > 0 ) + { + error = ft_stroke_border_grow( right, (FT_UInt)new_points ); + if ( error ) + goto Exit; + + { + FT_Vector* dst_point = right->points + right->num_points; + FT_Byte* dst_tag = right->tags + right->num_points; + FT_Vector* src_point = left->points + left->num_points - 1; + FT_Byte* src_tag = left->tags + left->num_points - 1; + + + while ( src_point >= left->points + left->start ) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + + if ( open ) + dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; + else + { + FT_Byte ttag = + (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); + + + /* switch begin/end tags if necessary */ + if ( ttag == FT_STROKE_TAG_BEGIN || + ttag == FT_STROKE_TAG_END ) + dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; + } + + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + + left->num_points = (FT_UInt)left->start; + right->num_points += (FT_UInt)new_points; + + right->movable = FALSE; + left->movable = FALSE; + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + /* there's a lot of magic in this function! */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + + + if ( !stroker ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( stroker->subpath_open ) + { + FT_StrokeBorder right = stroker->borders; + + + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); + if ( error ) + goto Exit; + + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left( stroker, TRUE ); + if ( error ) + goto Exit; + + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = ft_stroker_cap( stroker, + stroker->subpath_angle + FT_ANGLE_PI, 0 ); + if ( error ) + goto Exit; + + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close( right, FALSE ); + } + else + { + /* close the path if needed */ + if ( !FT_IS_SMALL( stroker->center.x - stroker->subpath_start.x ) || + !FT_IS_SMALL( stroker->center.y - stroker->subpath_start.y ) ) + { + error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } + + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + + error = ft_stroker_process_corner( stroker, + stroker->subpath_line_length ); + if ( error ) + goto Exit; + + /* then end our two subpaths */ + ft_stroke_border_close( stroker->borders + 0, FALSE ); + ft_stroke_border_close( stroker->borders + 1, TRUE ); + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt num_points = 0, num_contours = 0; + FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt count1, count2, num_points = 0; + FT_UInt count3, count4, num_contours = 0; + FT_Error error; + + + if ( !stroker ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + 0, + &count1, &count2 ); + if ( error ) + goto Exit; + + error = ft_stroke_border_get_counts( stroker->borders + 1, + &count3, &count4 ); + if ( error ) + goto Exit; + + num_points = count1 + count3; + num_contours = count2 + count4; + + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ) + { + if ( !stroker || !outline ) + return; + + if ( border == FT_STROKER_BORDER_LEFT || + border == FT_STROKER_BORDER_RIGHT ) + { + FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ) + { + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); + } + + + /* documentation is in ftstroke.h */ + + /* + * The following is very similar to FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_Int first; /* index of first point in contour */ + FT_Int last; /* index of last point in contour */ + + FT_Int tag; /* current point's state */ + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !stroker ) + return FT_THROW( Invalid_Argument ); + + FT_Stroker_Rewind( stroker ); + + last = -1; + for ( n = 0; n < outline->n_contours; n++ ) + { + first = last + 1; + last = outline->contours[n]; + + /* skip empty points; we don't stroke these */ + if ( last <= first ) + continue; + + limit = outline->points + last; + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* First point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + } + point--; + tags--; + } + + error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = point->x; + vec.y = point->y; + + error = FT_Stroker_LineTo( stroker, &vec ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec = point[0]; + + if ( tag == FT_CURVE_TAG_ON ) + { + error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1 = point[-2]; + vec2 = point[-1]; + + if ( point <= limit ) + { + FT_Vector vec; + + + vec = point[0]; + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); + if ( error ) + goto Exit; + continue; + } + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); + goto Close; + } + } + } + + Close: + if ( error ) + goto Exit; + + /* don't try to end the path if no segments have been generated */ + if ( !stroker->first_point ) + { + error = FT_Stroker_EndSubPath( stroker ); + if ( error ) + goto Exit; + } + } + + return FT_Err_Ok; + + Exit: + return error; + + Invalid_Outline: + return FT_THROW( Invalid_Outline ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_Glyph glyph = NULL; + + + if ( !pglyph ) + goto Exit; + + glyph = *pglyph; + if ( !glyph || glyph->clazz != &ft_outline_glyph_class ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, &copy ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + (FT_Int)num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_Export( stroker, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_Glyph glyph = NULL; + + + if ( !pglyph ) + goto Exit; + + glyph = *pglyph; + if ( !glyph || glyph->clazz != &ft_outline_glyph_class ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, &copy ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; + FT_StrokerBorder border; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + border = FT_Outline_GetOutsideBorder( outline ); + if ( inside ) + { + if ( border == FT_STROKER_BORDER_LEFT ) + border = FT_STROKER_BORDER_RIGHT; + else + border = FT_STROKER_BORDER_LEFT; + } + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + (FT_Int)num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/ftsynth.c b/external/freetype/src/base/ftsynth.c new file mode 100644 index 000000000..f32edd338 --- /dev/null +++ b/external/freetype/src/base/ftsynth.c @@ -0,0 +1,180 @@ +/**************************************************************************** + * + * ftsynth.c + * + * FreeType synthesizing code for emboldening and slanting (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftsynth.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftoutln.h> +#include <freetype/ftbitmap.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT synth + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) + { + /* Value '0x0366A' corresponds to a shear angle of about 12 degrees. */ + FT_GlyphSlot_Slant( slot, 0x0366A, 0 ); + } + + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Slant( FT_GlyphSlot slot, + FT_Fixed xslant, + FT_Fixed yslant ) + { + FT_Matrix transform; + FT_Outline* outline; + + + if ( !slot ) + return; + + outline = &slot->outline; + + /* only oblique outline glyphs */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + return; + + /* we don't touch the advance width */ + + /* For italic, simply apply a shear transform */ + transform.xx = 0x10000L; + transform.yx = -yslant; + + transform.xy = xslant; + transform.yy = 0x10000L; + + FT_Outline_Transform( outline, &transform ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL EMBOLDENING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_GlyphSlot_AdjustWeight( slot, 0x0AAA, 0x0AAA ); + } + + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_AdjustWeight( FT_GlyphSlot slot, + FT_Fixed xdelta, + FT_Fixed ydelta ) + { + FT_Library library; + FT_Size size; + FT_Error error; + FT_Pos xstr, ystr; + + + if ( !slot ) + return; + + library = slot->library; + size = slot->face->size; + + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && + slot->format != FT_GLYPH_FORMAT_BITMAP ) + return; + + /* express deltas in pixels in 26.6 format */ + xstr = (FT_Pos)size->metrics.x_ppem * xdelta / 1024; + ystr = (FT_Pos)size->metrics.y_ppem * ydelta / 1024; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + FT_Outline_EmboldenXY( &slot->outline, xstr, ystr ); + + else /* slot->format == FT_GLYPH_FORMAT_BITMAP */ + { + /* round to full pixels */ + xstr &= ~63; + if ( xstr == 0 ) + xstr = 1 << 6; + ystr &= ~63; + + /* + * XXX: overflow check for 16-bit system, for compatibility + * with FT_GlyphSlot_Embolden() since FreeType 2.1.10. + * unfortunately, this function return no informations + * about the cause of error. + */ + if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) + { + FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); + FT_TRACE1(( "too strong emboldening parameter ystr=%ld\n", ystr )); + return; + } + error = FT_GlyphSlot_Own_Bitmap( slot ); + if ( error ) + return; + + error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); + if ( error ) + return; + } + + if ( slot->advance.x ) + slot->advance.x += xstr; + + if ( slot->advance.y ) + slot->advance.y += ystr; + + slot->metrics.width += xstr; + slot->metrics.height += ystr; + slot->metrics.horiAdvance += xstr; + slot->metrics.vertAdvance += ystr; + slot->metrics.horiBearingY += ystr; + + /* XXX: 16-bit overflow case must be excluded before here */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + slot->bitmap_top += (FT_Int)( ystr >> 6 ); + } + + +/* END */ diff --git a/external/freetype/src/base/ftsystem.c b/external/freetype/src/base/ftsystem.c new file mode 100644 index 000000000..61c99e363 --- /dev/null +++ b/external/freetype/src/base/ftsystem.c @@ -0,0 +1,338 @@ +/**************************************************************************** + * + * ftsystem.c + * + * ANSI-specific FreeType low-level system interface (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * This file contains the default interface used by FreeType to access + * low-level, i.e. memory management, i/o access as well as thread + * synchronisation. It can be replaced by user-specific routines if + * necessary. + * + */ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/ftsystem.h> +#include <freetype/fterrors.h> +#include <freetype/fttypes.h> + + + /************************************************************************** + * + * MEMORY MANAGEMENT INTERFACE + * + */ + + /************************************************************************** + * + * It is not necessary to do any error checking for the + * allocation-related functions. This will be done by the higher level + * routines like ft_mem_alloc() or ft_mem_realloc(). + * + */ + + + /************************************************************************** + * + * @Function: + * ft_alloc + * + * @Description: + * The memory allocation function. + * + * @Input: + * memory :: + * A pointer to the memory object. + * + * size :: + * The requested size in bytes. + * + * @Return: + * The address of newly allocated block. + */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return ft_smalloc( (size_t)size ); + } + + + /************************************************************************** + * + * @Function: + * ft_realloc + * + * @Description: + * The memory reallocation function. + * + * @Input: + * memory :: + * A pointer to the memory object. + * + * cur_size :: + * The current size of the allocated memory block. + * + * new_size :: + * The newly requested size in bytes. + * + * block :: + * The current address of the block in memory. + * + * @Return: + * The address of the reallocated memory block. + */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return ft_srealloc( block, (size_t)new_size ); + } + + + /************************************************************************** + * + * @Function: + * ft_free + * + * @Description: + * The memory release function. + * + * @Input: + * memory :: + * A pointer to the memory object. + * + * block :: + * The address of block in memory to be freed. + */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + ft_sfree( block ); + } + + + /************************************************************************** + * + * RESOURCE MANAGEMENT INTERFACE + * + */ + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + /************************************************************************** + * + * @Function: + * ft_ansi_stream_close + * + * @Description: + * The function to close a stream. + * + * @Input: + * stream :: + * A pointer to the stream object. + */ + FT_CALLBACK_DEF( void ) + ft_ansi_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = NULL; + } + + + /************************************************************************** + * + * @Function: + * ft_ansi_stream_io + * + * @Description: + * The function to open a stream. + * + * @Input: + * stream :: + * A pointer to the stream object. + * + * offset :: + * The position in the data stream to start reading. + * + * buffer :: + * The address of buffer to store the read data. + * + * count :: + * The number of bytes to read from the stream. + * + * @Return: + * The number of bytes actually read. If `count' is zero (that is, + * the function is used for seeking), a non-zero return value + * indicates an error. + */ + FT_CALLBACK_DEF( unsigned long ) + ft_ansi_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + if ( offset > stream->size && !count ) + return 1; + + file = STREAM_FILE( stream ); + + if ( stream->pos != offset ) + ft_fseek( file, (long)offset, SEEK_SET ); + + /* Avoid calling `fread` with `buffer=NULL` and `count=0`, */ + /* which is undefined behaviour. */ + if ( !count ) + return 0; + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + + + /* documentation is in ftstream.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + FT_FILE* file; + + + if ( !stream ) + return FT_THROW( Invalid_Stream_Handle ); + + stream->descriptor.pointer = NULL; + stream->pathname.pointer = (char*)filepathname; + stream->base = NULL; + stream->pos = 0; + stream->read = NULL; + stream->close = NULL; + + file = ft_fopen( filepathname, "rb" ); + if ( !file ) + { + FT_ERROR(( "FT_Stream_Open:" + " could not open `%s'\n", filepathname )); + + return FT_THROW( Cannot_Open_Resource ); + } + + ft_fseek( file, 0, SEEK_END ); + stream->size = (unsigned long)ft_ftell( file ); + if ( !stream->size ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); + ft_fclose( file ); + return FT_THROW( Cannot_Open_Stream ); + } + ft_fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->read = ft_ansi_stream_io; + stream->close = ft_ansi_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + +#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = NULL; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + ft_sfree( memory ); + } + + +/* END */ diff --git a/external/freetype/src/base/fttrigon.c b/external/freetype/src/base/fttrigon.c new file mode 100644 index 000000000..2dd2c3459 --- /dev/null +++ b/external/freetype/src/base/fttrigon.c @@ -0,0 +1,517 @@ +/**************************************************************************** + * + * fttrigon.c + * + * FreeType trigonometric functions (body). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * This is a fixed-point CORDIC implementation of trigonometric + * functions as well as transformations between Cartesian and polar + * coordinates. The angles are represented as 16.16 fixed-point values + * in degrees, i.e., the angular resolution is 2^-16 degrees. Note that + * only vectors longer than 2^16*180/pi (or at least 22 bits) on a + * discrete Cartesian grid can have the same or better angular + * resolution. Therefore, to maintain this precision, some functions + * require an interim upscaling of the vectors, whereas others operate + * with 24-bit long vectors directly. + * + */ + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/fttrigon.h> + + + /* the Cordic shrink factor 0.858785336480436 * 2^32 */ +#define FT_TRIG_SCALE 0xDBD95B16UL + + /* the highest bit in overflow-safe vector components, */ + /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ +#define FT_TRIG_SAFE_MSB 29 + + /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ +#define FT_TRIG_MAX_ITERS 23 + + static const FT_Angle + ft_trig_arctan_table[] = + { + 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, + 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, + 57L, 29L, 14L, 7L, 4L, 2L, 1L + }; + + +#ifdef FT_INT64 + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Int s = 1; + + + if ( val < 0 ) + { + val = -val; + s = -1; + } + + /* 0x40000000 comes from regression analysis between true */ + /* and CORDIC hypotenuse, so it minimizes the error */ + val = (FT_Fixed)( + ( (FT_UInt64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 ); + + return s < 0 ? -val : val; + } + +#else /* !FT_INT64 */ + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Int s = 1; + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + if ( val < 0 ) + { + val = -val; + s = -1; + } + + lo1 = (FT_UInt32)val & 0x0000FFFFU; + hi1 = (FT_UInt32)val >> 16; + lo2 = FT_TRIG_SCALE & 0x0000FFFFU; + hi2 = FT_TRIG_SCALE >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + /* 0x40000000 comes from regression analysis between true */ + /* and CORDIC hypotenuse, so it minimizes the error */ + + /* Check carry overflow of lo + 0x40000000 */ + lo += 0x40000000UL; + hi += ( lo < 0x40000000UL ); + + val = (FT_Fixed)hi; + + return s < 0 ? -val : val; + } + +#endif /* !FT_INT64 */ + + + /* undefined and never called for zero vector */ + static FT_Int + ft_trig_prenorm( FT_Vector* vec ) + { + FT_Pos x, y; + FT_Int shift; + + + x = vec->x; + y = vec->y; + + shift = FT_MSB( (FT_UInt32)( FT_ABS( x ) | FT_ABS( y ) ) ); + + if ( shift <= FT_TRIG_SAFE_MSB ) + { + shift = FT_TRIG_SAFE_MSB - shift; + vec->x = (FT_Pos)( (FT_ULong)x << shift ); + vec->y = (FT_Pos)( (FT_ULong)y << shift ); + } + else + { + shift -= FT_TRIG_SAFE_MSB; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + + return shift; + } + + + static void + ft_trig_pseudo_rotate( FT_Vector* vec, + FT_Angle theta ) + { + FT_Int i; + FT_Fixed x, y, xtemp, b; + const FT_Angle *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Rotate inside [-PI/4,PI/4] sector */ + while ( theta < -FT_ANGLE_PI4 ) + { + xtemp = y; + y = -x; + x = xtemp; + theta += FT_ANGLE_PI2; + } + + while ( theta > FT_ANGLE_PI4 ) + { + xtemp = -y; + y = x; + x = xtemp; + theta -= FT_ANGLE_PI2; + } + + arctanptr = ft_trig_arctan_table; + + /* Pseudorotations, with right shifts */ + for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ ) + { + if ( theta < 0 ) + { + xtemp = x + ( ( y + b ) >> i ); + y = y - ( ( x + b ) >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( ( y + b ) >> i ); + y = y + ( ( x + b ) >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } + + vec->x = x; + vec->y = y; + } + + + static void + ft_trig_pseudo_polarize( FT_Vector* vec ) + { + FT_Angle theta; + FT_Int i; + FT_Fixed x, y, xtemp, b; + const FT_Angle *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into [-PI/4,PI/4] sector */ + if ( y > x ) + { + if ( y > -x ) + { + theta = FT_ANGLE_PI2; + xtemp = y; + y = -x; + x = xtemp; + } + else + { + theta = y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI; + x = -x; + y = -y; + } + } + else + { + if ( y < -x ) + { + theta = -FT_ANGLE_PI2; + xtemp = -y; + y = x; + x = xtemp; + } + else + { + theta = 0; + } + } + + arctanptr = ft_trig_arctan_table; + + /* Pseudorotations, with right shifts */ + for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ ) + { + if ( y > 0 ) + { + xtemp = x + ( ( y + b ) >> i ); + y = y - ( ( x + b ) >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( ( y + b ) >> i ); + y = y + ( ( x + b ) >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } + + /* round theta to acknowledge its error that mostly comes */ + /* from accumulated rounding errors in the arctan table */ + if ( theta >= 0 ) + theta = FT_PAD_ROUND( theta, 16 ); + else + theta = -FT_PAD_ROUND( -theta, 16 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Cos( FT_Angle angle ) + { + FT_Vector v; + + + FT_Vector_Unit( &v, angle ); + + return v.x; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Sin( FT_Angle angle ) + { + FT_Vector v; + + + FT_Vector_Unit( &v, angle ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Tan( FT_Angle angle ) + { + FT_Vector v = { 1 << 24, 0 }; + + + ft_trig_pseudo_rotate( &v, angle ); + + return FT_DivFix( v.y, v.x ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Atan2( FT_Fixed dx, + FT_Fixed dy ) + { + FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ) + { + if ( !vec ) + return; + + vec->x = FT_TRIG_SCALE >> 8; + vec->y = 0; + ft_trig_pseudo_rotate( vec, angle ); + vec->x = ( vec->x + 0x80L ) >> 8; + vec->y = ( vec->y + 0x80L ) >> 8; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ) + { + FT_Int shift; + FT_Vector v; + + + if ( !vec || !angle ) + return; + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_rotate( &v, angle ); + v.x = ft_trig_downscale( v.x ); + v.y = ft_trig_downscale( v.y ); + + if ( shift > 0 ) + { + FT_Int32 half = (FT_Int32)1L << ( shift - 1 ); + + + vec->x = ( v.x + half - ( v.x < 0 ) ) >> shift; + vec->y = ( v.y + half - ( v.y < 0 ) ) >> shift; + } + else + { + shift = -shift; + vec->x = (FT_Pos)( (FT_ULong)v.x << shift ); + vec->y = (FT_Pos)( (FT_ULong)v.y << shift ); + } + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ) + { + FT_Int shift; + FT_Vector v; + + + if ( !vec ) + return 0; + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return FT_ABS( v.y ); + } + else if ( v.y == 0 ) + { + return FT_ABS( v.x ); + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1L << ( shift - 1 ) ) ) >> shift; + + return (FT_Fixed)( (FT_UInt32)v.x << -shift ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ) + { + FT_Int shift; + FT_Vector v; + + + if ( !vec || !length || !angle ) + return; + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = shift >= 0 ? ( v.x >> shift ) + : (FT_Fixed)( (FT_UInt32)v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ) + { + if ( !vec ) + return; + + vec->x = length; + vec->y = 0; + + FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ) + { + FT_Angle delta = angle2 - angle1; + + + while ( delta <= -FT_ANGLE_PI ) + delta += FT_ANGLE_2PI; + + while ( delta > FT_ANGLE_PI ) + delta -= FT_ANGLE_2PI; + + return delta; + } + + +/* END */ diff --git a/external/freetype/src/base/fttype1.c b/external/freetype/src/base/fttype1.c new file mode 100644 index 000000000..637c5cf77 --- /dev/null +++ b/external/freetype/src/base/fttype1.c @@ -0,0 +1,126 @@ +/**************************************************************************** + * + * fttype1.c + * + * FreeType utility file for PS names support (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftserv.h> +#include <freetype/internal/services/svpsinfo.h> + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + FT_Error error; + FT_Service_PsInfo service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !afont_info ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_info ) + error = service->ps_get_font_info( face, afont_info ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ) + { + FT_Int result = 0; + FT_Service_PsInfo service; + + + if ( face ) + { + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_has_glyph_names ) + result = service->ps_has_glyph_names( face ); + } + + return result; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_PrivateRec* afont_private ) + { + FT_Error error; + FT_Service_PsInfo service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !afont_private ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_private ) + error = service->ps_get_font_private( face, afont_private ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_PS_Font_Value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ) + { + FT_Int result = 0; + FT_Service_PsInfo service = NULL; + + + if ( face ) + { + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_value ) + result = service->ps_get_font_value( face, key, idx, + value, value_len ); + } + + return result; + } + + +/* END */ diff --git a/external/freetype/src/base/ftutil.c b/external/freetype/src/base/ftutil.c new file mode 100644 index 000000000..6120846d2 --- /dev/null +++ b/external/freetype/src/base/ftutil.c @@ -0,0 +1,442 @@ +/**************************************************************************** + * + * ftutil.c + * + * FreeType utility file for memory and list management (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftlist.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT memory + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** M E M O R Y M A N A G E M E N T *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer block = ft_mem_qalloc( memory, size, &error ); + + if ( !error && block && size > 0 ) + FT_MEM_ZERO( block, size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + FT_Pointer block = NULL; + + + if ( size > 0 ) + { + block = memory->alloc( memory, size ); + if ( !block ) + error = FT_THROW( Out_Of_Memory ); + } + else if ( size < 0 ) + { + /* may help catch/prevent security issues */ + error = FT_THROW( Invalid_Argument ); + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + block = ft_mem_qrealloc( memory, item_size, + cur_count, new_count, block, &error ); + if ( !error && block && new_count > cur_count ) + FT_MEM_ZERO( (char*)block + cur_count * item_size, + ( new_count - cur_count ) * item_size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + /* Note that we now accept `item_size == 0' as a valid parameter, in + * order to cover very weird cases where an ALLOC_MULT macro would be + * called. + */ + if ( cur_count < 0 || new_count < 0 || item_size < 0 ) + { + /* may help catch/prevent nasty security issues */ + error = FT_THROW( Invalid_Argument ); + } + else if ( new_count == 0 || item_size == 0 ) + { + ft_mem_free( memory, block ); + block = NULL; + } + else if ( new_count > FT_INT_MAX / item_size ) + { + error = FT_THROW( Array_Too_Large ); + } + else if ( cur_count == 0 ) + { + FT_ASSERT( !block ); + + block = memory->alloc( memory, new_count * item_size ); + if ( block == NULL ) + error = FT_THROW( Out_Of_Memory ); + } + else + { + FT_Pointer block2; + FT_Long cur_size = cur_count * item_size; + FT_Long new_size = new_count * item_size; + + + block2 = memory->realloc( memory, cur_size, new_size, block ); + if ( !block2 ) + error = FT_THROW( Out_Of_Memory ); + else + block = block2; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( void ) + ft_mem_free( FT_Memory memory, + const void *P ) + { + if ( P ) + memory->free( memory, (void*)P ); + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer p = ft_mem_qalloc( memory, (FT_Long)size, &error ); + + + if ( !error && address && size > 0 ) + ft_memcpy( p, address, size ); + + *p_error = error; + return p; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ) + { + FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 + : 0; + + + return ft_mem_dup( memory, str, len, p_error ); + } + + + FT_BASE_DEF( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ) + { + while ( size > 1 && *src != 0 ) + { + *dst++ = *src++; + size--; + } + + *dst = 0; /* always zero-terminate */ + + return *src != 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** D O U B L Y L I N K E D L I S T S *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#undef FT_COMPONENT +#define FT_COMPONENT list + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ) + { + FT_ListNode cur; + + + if ( !list ) + return NULL; + + cur = list->head; + while ( cur ) + { + if ( cur->data == data ) + return cur; + + cur = cur->next; + } + + return NULL; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Add( FT_List list, + FT_ListNode node ) + { + FT_ListNode before; + + + if ( !list || !node ) + return; + + before = list->tail; + + node->next = NULL; + node->prev = before; + + if ( before ) + before->next = node; + else + list->head = node; + + list->tail = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ) + { + FT_ListNode after; + + + if ( !list || !node ) + return; + + after = list->head; + + node->next = after; + node->prev = NULL; + + if ( !after ) + list->tail = node; + else + after->prev = node; + + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + if ( !list || !node ) + return; + + before = node->prev; + after = node->next; + + if ( before ) + before->next = after; + else + list->head = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Up( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + if ( !list || !node ) + return; + + before = node->prev; + after = node->next; + + /* check whether we are already on top of the list */ + if ( !before ) + return; + + before->next = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + + node->prev = NULL; + node->next = list->head; + list->head->prev = node; + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ) + { + FT_ListNode cur; + FT_Error error = FT_Err_Ok; + + + if ( !list || !iterator ) + return FT_THROW( Invalid_Argument ); + + cur = list->head; + + while ( cur ) + { + FT_ListNode next = cur->next; + + + error = iterator( cur, user ); + if ( error ) + break; + + cur = next; + } + + return error; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ) + { + FT_ListNode cur; + + + if ( !list || !memory ) + return; + + cur = list->head; + while ( cur ) + { + FT_ListNode next = cur->next; + void* data = cur->data; + + + if ( destroy ) + destroy( memory, data, user ); + + FT_FREE( cur ); + cur = next; + } + + list->head = NULL; + list->tail = NULL; + } + + +/* END */ diff --git a/external/freetype/src/base/ftver.rc b/external/freetype/src/base/ftver.rc new file mode 100644 index 000000000..137a6334b --- /dev/null +++ b/external/freetype/src/base/ftver.rc @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ftver.rc */ +/* */ +/* FreeType VERSIONINFO resource for Windows DLLs. */ +/* */ +/* Copyright (C) 2018-2023 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include<windows.h> + +#define FT_VERSION 2,13,2,0 +#define FT_VERSION_STR "2.13.2" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION FT_VERSION +PRODUCTVERSION FT_VERSION +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG +FILEFLAGS VS_FF_DEBUG +#endif +#ifdef DLL_EXPORT +FILETYPE VFT_DLL +#define FT_FILENAME "freetype.dll" +#else +FILETYPE VFT_STATIC_LIB +#define FT_FILENAME "freetype.lib" +#endif +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "The FreeType Project" + VALUE "FileDescription", "Font Rendering Library" + VALUE "FileVersion", FT_VERSION_STR + VALUE "ProductName", "FreeType" + VALUE "ProductVersion", FT_VERSION_STR + VALUE "LegalCopyright", L"\x00A9 2000-2023 The FreeType Project www.freetype.org. All rights reserved." + VALUE "InternalName", "freetype" + VALUE "OriginalFilename", FT_FILENAME + END + END + + BLOCK "VarFileInfo" + BEGIN + /* The following line should only be modified for localized versions. */ + /* It consists of any number of WORD,WORD pairs, with each pair */ + /* describing a "language,codepage" combination supported by the file. */ + VALUE "Translation", 0x409, 1200 + END +END diff --git a/external/freetype/src/base/ftwinfnt.c b/external/freetype/src/base/ftwinfnt.c new file mode 100644 index 000000000..03b023e07 --- /dev/null +++ b/external/freetype/src/base/ftwinfnt.c @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * ftwinfnt.c + * + * FreeType API for accessing Windows FNT specific info (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/ftwinfnt.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svwinfnt.h> + + + /* documentation is in ftwinfnt.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *header ) + { + FT_Service_WinFnt service; + FT_Error error; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !header ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); + + if ( service ) + error = service->get_header( face, header ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + +/* END */ diff --git a/external/freetype/src/base/md5.c b/external/freetype/src/base/md5.c new file mode 100644 index 000000000..b235e17a5 --- /dev/null +++ b/external/freetype/src/base/md5.c @@ -0,0 +1,291 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * (This is a heavily cut-down "BSD license".) + * + * This differs from Colin Plumb's older public domain implementation in that + * no exactly 32-bit integer data type is required (any 32-bit or wider + * unsigned integer data type will do), there's no compile-time endianness + * configuration, and the function prototypes match OpenSSL's. No code from + * Colin Plumb's implementation has been reused; this comment merely compares + * the properties of the two independent implementations. + * + * The primary goals of this implementation are portability and ease of use. + * It is meant to be fast, but not as fast as possible. Some known + * optimizations are not included to reduce source code size and avoid + * compile-time configuration. + */ + +#ifndef HAVE_OPENSSL + +#include <string.h> + +#include "md5.h" + +/* + * The basic MD5 functions. + * + * F and G are optimized compared to their RFC 1321 definitions for + * architectures that lack an AND-NOT instruction, just like in Colin Plumb's + * implementation. + */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) +#define H(x, y, z) (((x) ^ (y)) ^ (z)) +#define H2(x, y, z) ((x) ^ ((y) ^ (z))) +#define I(x, y, z) ((y) ^ ((x) | ~(z))) + +/* + * The MD5 transformation for all four rounds. + */ +#define STEP(f, a, b, c, d, x, t, s) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +/* + * SET reads 4 input bytes in little-endian byte order and stores them in a + * properly aligned word in host byte order. + * + * The check for little-endian architectures that tolerate unaligned memory + * accesses is just an optimization. Nothing will break if it fails to detect + * a suitable architecture. + * + * Unfortunately, this optimization may be a C strict aliasing rules violation + * if the caller's data buffer has effective type that cannot be aliased by + * MD5_u32plus. In practice, this problem may occur if these MD5 routines are + * inlined into a calling function, or with future and dangerously advanced + * link-time optimizations. For the time being, keeping these MD5 routines in + * their own translation unit avoids the problem. + */ +#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) +#define SET(n) \ + (*(MD5_u32plus *)&ptr[(n) * 4]) +#define GET(n) \ + SET(n) +#else +#define SET(n) \ + (ctx->block[(n)] = \ + (MD5_u32plus)ptr[(n) * 4] | \ + ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ + ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ + ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) +#define GET(n) \ + (ctx->block[(n)]) +#endif + +/* + * This processes one or more 64-byte data blocks, but does NOT update the bit + * counters. There are no alignment requirements. + */ +static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) +{ + const unsigned char *ptr; + MD5_u32plus a, b, c, d; + MD5_u32plus saved_a, saved_b, saved_c, saved_d; + + ptr = (const unsigned char *)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + +/* Round 1 */ + STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) + STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) + STEP(F, c, d, a, b, SET(2), 0x242070db, 17) + STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22) + STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7) + STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12) + STEP(F, c, d, a, b, SET(6), 0xa8304613, 17) + STEP(F, b, c, d, a, SET(7), 0xfd469501, 22) + STEP(F, a, b, c, d, SET(8), 0x698098d8, 7) + STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12) + STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17) + STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22) + STEP(F, a, b, c, d, SET(12), 0x6b901122, 7) + STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) + STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) + STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) + +/* Round 2 */ + STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) + STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) + STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) + STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) + STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) + STEP(G, d, a, b, c, GET(10), 0x02441453, 9) + STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) + STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) + STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) + STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) + STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) + STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) + STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) + STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) + STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) + STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) + +/* Round 3 */ + STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) + STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11) + STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) + STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23) + STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) + STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11) + STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) + STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23) + STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) + STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11) + STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) + STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23) + STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) + STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11) + STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) + STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23) + +/* Round 4 */ + STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) + STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) + STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) + STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) + STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) + STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) + STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) + STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) + STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) + STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) + STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) + STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) + STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) + STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) + STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) + STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while (size -= 64); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +void MD5_Init(MD5_CTX *ctx) +{ + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + + ctx->lo = 0; + ctx->hi = 0; +} + +void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) +{ + MD5_u32plus saved_lo; + unsigned long used, available; + + saved_lo = ctx->lo; + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) + ctx->hi++; + ctx->hi += size >> 29; + + used = saved_lo & 0x3f; + + if (used) { + available = 64 - used; + + if (size < available) { + memcpy(&ctx->buffer[used], data, size); + return; + } + + memcpy(&ctx->buffer[used], data, available); + data = (const unsigned char *)data + available; + size -= available; + body(ctx, ctx->buffer, 64); + } + + if (size >= 64) { + data = body(ctx, data, size & ~(unsigned long)0x3f); + size &= 0x3f; + } + + memcpy(ctx->buffer, data, size); +} + +#define OUT(dst, src) \ + (dst)[0] = (unsigned char)(src); \ + (dst)[1] = (unsigned char)((src) >> 8); \ + (dst)[2] = (unsigned char)((src) >> 16); \ + (dst)[3] = (unsigned char)((src) >> 24); + +void MD5_Final(unsigned char *result, MD5_CTX *ctx) +{ + unsigned long used, available; + + used = ctx->lo & 0x3f; + + ctx->buffer[used++] = 0x80; + + available = 64 - used; + + if (available < 8) { + memset(&ctx->buffer[used], 0, available); + body(ctx, ctx->buffer, 64); + used = 0; + available = 64; + } + + memset(&ctx->buffer[used], 0, available - 8); + + ctx->lo <<= 3; + OUT(&ctx->buffer[56], ctx->lo) + OUT(&ctx->buffer[60], ctx->hi) + + body(ctx, ctx->buffer, 64); + + OUT(&result[0], ctx->a) + OUT(&result[4], ctx->b) + OUT(&result[8], ctx->c) + OUT(&result[12], ctx->d) + + memset(ctx, 0, sizeof(*ctx)); +} + +#endif diff --git a/external/freetype/src/base/md5.h b/external/freetype/src/base/md5.h new file mode 100644 index 000000000..2da44bf35 --- /dev/null +++ b/external/freetype/src/base/md5.h @@ -0,0 +1,45 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * See md5.c for more information. + */ + +#ifdef HAVE_OPENSSL +#include <openssl/md5.h> +#elif !defined(_MD5_H) +#define _MD5_H + +/* Any 32-bit or wider unsigned integer data type will do */ +typedef unsigned int MD5_u32plus; + +typedef struct { + MD5_u32plus lo, hi; + MD5_u32plus a, b, c, d; + unsigned char buffer[64]; + MD5_u32plus block[16]; +} MD5_CTX; + +extern void MD5_Init(MD5_CTX *ctx); +extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); +extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); + +#endif diff --git a/external/freetype/src/base/rules.mk b/external/freetype/src/base/rules.mk new file mode 100644 index 000000000..b7de9b5ca --- /dev/null +++ b/external/freetype/src/base/rules.mk @@ -0,0 +1,108 @@ +# +# FreeType 2 base layer configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# It sets the following variables which are used by the master Makefile +# after the call: +# +# BASE_OBJ_S: The single-object base layer. +# BASE_OBJ_M: A list of all objects for a multiple-objects build. +# BASE_EXT_OBJ: A list of base layer extensions, i.e., components found +# in `src/base' which are not compiled within the base +# layer proper. + + +BASE_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(BASE_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# Base layer sources +# +# ftsystem, ftinit, and ftdebug are handled by freetype.mk +# +# All files listed here should be included in `ftbase.c' (for a `single' +# build). +# +BASE_SRC := $(BASE_DIR)/ftadvanc.c \ + $(BASE_DIR)/ftcalc.c \ + $(BASE_DIR)/ftcolor.c \ + $(BASE_DIR)/ftdbgmem.c \ + $(BASE_DIR)/fterrors.c \ + $(BASE_DIR)/ftfntfmt.c \ + $(BASE_DIR)/ftgloadr.c \ + $(BASE_DIR)/fthash.c \ + $(BASE_DIR)/ftlcdfil.c \ + $(BASE_DIR)/ftobjs.c \ + $(BASE_DIR)/ftoutln.c \ + $(BASE_DIR)/ftpsprop.c \ + $(BASE_DIR)/ftrfork.c \ + $(BASE_DIR)/ftsnames.c \ + $(BASE_DIR)/ftstream.c \ + $(BASE_DIR)/fttrigon.c \ + $(BASE_DIR)/ftutil.c + + +ifneq ($(ftmac_c),) + BASE_SRC += $(BASE_DIR)/$(ftmac_c) +endif + +# for simplicity, we also handle `md5.c' (which gets included by `ftobjs.h') +BASE_H := $(BASE_DIR)/ftbase.h \ + $(BASE_DIR)/md5.c \ + $(BASE_DIR)/md5.h + +# Base layer `extensions' sources +# +# An extension is added to the library file as a separate object. It is +# then linked to the final executable only if one of its symbols is used by +# the application. +# +BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS)) + +# Default extensions objects +# +BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) + + +# Base layer object(s) +# +# BASE_OBJ_M is used during `multi' builds (each base source file compiles +# to a single object file). +# +# BASE_OBJ_S is used during `single' builds (the whole base layer is +# compiled as a single object file using ftbase.c). +# +BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) +BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O + +# Base layer root source file for single build +# +BASE_SRC_S := $(BASE_DIR)/ftbase.c + + +# Base layer - single object build +# +$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S)) + + +# Multiple objects build + extensions +# +$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# EOF diff --git a/external/freetype/src/bdf/README b/external/freetype/src/bdf/README new file mode 100644 index 000000000..d7cb8c14e --- /dev/null +++ b/external/freetype/src/bdf/README @@ -0,0 +1,152 @@ + FreeType font driver for BDF fonts + + Francesco Zappa Nardelli + <francesco.zappa.nardelli@ens.fr> + + +Introduction +************ + +BDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe, +which is intended to be easily understood by both humans and computers. +This code implements a BDF driver for the FreeType library, following the +Adobe Specification V 2.2. The specification of the BDF font format is +available from Adobe's web site: + + https://adobe-type-tools.github.io/font-tech-notes/pdfs/5005.BDF_Spec.pdf + +Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org). +They do not define vertical metrics, because the X Consortium BDF +specification has removed them. + + +Encodings +********* + +[This section is out of date, retained for historical reasons. BDF + properties can be retrieved with `FT_Get_BDF_Property`, character set ID + values with `FT_Get_BDF_Charset_ID`.] + +The variety of encodings that accompanies bdf fonts appears to encompass the +small set defined in freetype.h. On the other hand, two properties that +specify encoding and registry are usually defined in bdf fonts. + +I decided to make these two properties directly accessible, leaving to the +client application the work of interpreting them. For instance: + + + #include FT_INTERNAL_BDF_TYPES_H + + FT_Face face; + BDF_Public_Face bdfface; + + + FT_New_Face( library, ..., &face ); + + bdfface = (BDF_Public_Face)face; + + if ( ( bdfface->charset_registry == "ISO10646" ) && + ( bdfface->charset_encoding == "1" ) ) + [..] + + +Thus the driver always exports `ft_encoding_none' as face->charmap.encoding. +FT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong +value given as argument into the corresponding glyph number. + +If the two properties are not available, Adobe Standard Encoding should be +assumed. + + +Anti-Aliased Bitmaps +******************** + +The driver supports an extension to the BDF format as used in Mark Leisher's +xmbdfed bitmap font editor. Microsoft's SBIT tool expects bitmap fonts in +that format for adding anti-aliased them to TrueType fonts. It introduces a +fourth field to the `SIZE' keyword which gives the bpp value (bits per +pixel) of the glyph data in the font. Possible values are 1 (the default), +2 (four gray levels), 4 (16 gray levels), and 8 (256 gray levels). The +driver returns either a bitmap with 1 bit per pixel or a pixmap with 8bits +per pixel (using 4, 16, and 256 gray levels, respectively). + + +Known problems +************** + +- A font is entirely loaded into memory. Obviously, this is not the Right + Thing(TM). If you have big fonts I suggest you convert them into PCF + format (using the bdftopcf utility): the PCF font drive of FreeType can + perform incremental glyph loading. + +When I have some time, I will implement on-demand glyph parsing. + +- Except for encodings properties, client applications have no visibility of + the PCF_Face object. This means that applications cannot directly access + font tables and must trust FreeType. + +- Currently, glyph names are ignored. + + I plan to give full visibility of the BDF_Face object in an upcoming + revision of the driver, thus implementing also glyph names. + +- As I have never seen a BDF font that defines vertical metrics, vertical + metrics are (parsed and) discarded. If you own a BDF font that defines + vertical metrics, please let me know (I will implement them in 5-10 + minutes). + + +License +******* + +Copyright (C) 2001-2002 by Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** Portions of the driver (that is, bdflib.c and bdf.h): + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2002, 2011 Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Credits +******* + +This driver is based on excellent Mark Leisher's bdf library. If you +find something good in this driver you should probably thank him, not +me. diff --git a/external/freetype/src/bdf/bdf.c b/external/freetype/src/bdf/bdf.c new file mode 100644 index 000000000..249012e59 --- /dev/null +++ b/external/freetype/src/bdf/bdf.c @@ -0,0 +1,34 @@ +/* bdf.c + + FreeType font driver for bdf files + + Copyright (C) 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "bdflib.c" +#include "bdfdrivr.c" + + +/* END */ diff --git a/external/freetype/src/bdf/bdf.h b/external/freetype/src/bdf/bdf.h new file mode 100644 index 000000000..e2cb52c10 --- /dev/null +++ b/external/freetype/src/bdf/bdf.h @@ -0,0 +1,253 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001-2004, 2011 Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef BDF_H_ +#define BDF_H_ + + +/* + * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher + */ + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/fthash.h> + + +FT_BEGIN_HEADER + + +/* Imported from bdfP.h */ + +#define _bdf_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] & ( 1UL << ( (e) & 31 ) ) ) +#define _bdf_set_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] |= ( 1UL << ( (e) & 31 ) ) ) +#define _bdf_clear_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] &= ~( 1UL << ( (e) & 31 ) ) ) + +/* end of bdfP.h */ + + + /************************************************************************** + * + * BDF font options macros and types. + * + */ + + +#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */ +#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */ +#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */ +#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */ +#define BDF_MONOWIDTH 0x10 /* Font has mono width. */ +#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */ + +#define BDF_ALL_SPACING ( BDF_PROPORTIONAL | \ + BDF_MONOWIDTH | \ + BDF_CHARCELL ) + +#define BDF_DEFAULT_LOAD_OPTIONS ( BDF_CORRECT_METRICS | \ + BDF_KEEP_COMMENTS | \ + BDF_KEEP_UNENCODED | \ + BDF_PROPORTIONAL ) + + + typedef struct bdf_options_t_ + { + int correct_metrics; + int keep_unencoded; + int keep_comments; + int font_spacing; + + } bdf_options_t; + + + /* Callback function type for unknown configuration options. */ + typedef int + (*bdf_options_callback_t)( bdf_options_t* opts, + char** params, + unsigned long nparams, + void* client_data ); + + + /************************************************************************** + * + * BDF font property macros and types. + * + */ + + +#define BDF_ATOM 1 +#define BDF_INTEGER 2 +#define BDF_CARDINAL 3 + + + /* This structure represents a particular property of a font. */ + /* There are a set of defaults and each font has their own. */ + typedef struct bdf_property_t_ + { + const char* name; /* Name of the property. */ + int format; /* Format of the property. */ + int builtin; /* A builtin property. */ + union + { + char* atom; + long l; + unsigned long ul; + + } value; /* Value of the property. */ + + } bdf_property_t; + + + /************************************************************************** + * + * BDF font metric and glyph types. + * + */ + + + typedef struct bdf_bbx_t_ + { + unsigned short width; + unsigned short height; + + short x_offset; + short y_offset; + + short ascent; + short descent; + + } bdf_bbx_t; + + + typedef struct bdf_glyph_t_ + { + char* name; /* Glyph name. */ + unsigned long encoding; /* Glyph encoding. */ + unsigned short swidth; /* Scalable width. */ + unsigned short dwidth; /* Device width. */ + bdf_bbx_t bbx; /* Glyph bounding box. */ + unsigned char* bitmap; /* Glyph bitmap. */ + unsigned long bpr; /* Number of bytes used per row. */ + unsigned short bytes; /* Number of bytes used for the bitmap. */ + + } bdf_glyph_t; + + + typedef struct bdf_font_t_ + { + char* name; /* Name of the font. */ + bdf_bbx_t bbx; /* Font bounding box. */ + + unsigned long point_size; /* Point size of the font. */ + unsigned long resolution_x; /* Font horizontal resolution. */ + unsigned long resolution_y; /* Font vertical resolution. */ + + int spacing; /* Font spacing value. */ + + unsigned short monowidth; /* Logical width for monowidth font. */ + + unsigned long default_char; /* Encoding of the default glyph. */ + + long font_ascent; /* Font ascent. */ + long font_descent; /* Font descent. */ + + unsigned long glyphs_size; /* Glyph structures allocated. */ + unsigned long glyphs_used; /* Glyph structures used. */ + bdf_glyph_t* glyphs; /* Glyphs themselves. */ + + unsigned long unencoded_size; /* Unencoded glyph struct. allocated. */ + unsigned long unencoded_used; /* Unencoded glyph struct. used. */ + bdf_glyph_t* unencoded; /* Unencoded glyphs themselves. */ + + unsigned long props_size; /* Font properties allocated. */ + unsigned long props_used; /* Font properties used. */ + bdf_property_t* props; /* Font properties themselves. */ + + char* comments; /* Font comments. */ + unsigned long comments_len; /* Length of comment string. */ + + void* internal; /* Internal data for the font. */ + + unsigned short bpp; /* Bits per pixel. */ + + FT_Memory memory; + + bdf_property_t* user_props; + unsigned long nuser_props; + FT_HashRec proptbl; + + } bdf_font_t; + + + /************************************************************************** + * + * Types for load/save callbacks. + * + */ + + + /* Error codes. */ +#define BDF_MISSING_START -1 +#define BDF_MISSING_FONTNAME -2 +#define BDF_MISSING_SIZE -3 +#define BDF_MISSING_CHARS -4 +#define BDF_MISSING_STARTCHAR -5 +#define BDF_MISSING_ENCODING -6 +#define BDF_MISSING_BBX -7 + +#define BDF_OUT_OF_MEMORY -20 + +#define BDF_INVALID_LINE -100 + + + /************************************************************************** + * + * BDF font API. + * + */ + + FT_LOCAL( FT_Error ) + bdf_load_font( FT_Stream stream, + FT_Memory memory, + bdf_options_t* opts, + bdf_font_t* *font ); + + FT_LOCAL( void ) + bdf_free_font( bdf_font_t* font ); + + FT_LOCAL( bdf_property_t * ) + bdf_get_font_property( bdf_font_t* font, + const char* name ); + + +FT_END_HEADER + + +#endif /* BDF_H_ */ + + +/* END */ diff --git a/external/freetype/src/bdf/bdfdrivr.c b/external/freetype/src/bdf/bdfdrivr.c new file mode 100644 index 000000000..e02a16093 --- /dev/null +++ b/external/freetype/src/bdf/bdfdrivr.c @@ -0,0 +1,1013 @@ +/* bdfdrivr.c + + FreeType font driver for bdf files + + Copyright (C) 2001-2008, 2011, 2013, 2014 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftbdf.h> +#include <freetype/ttnameid.h> + +#include <freetype/internal/services/svbdf.h> +#include <freetype/internal/services/svfntfmt.h> + +#include "bdf.h" +#include "bdfdrivr.h" + +#include "bdferror.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT bdfdriver + + + typedef struct BDF_CMapRec_ + { + FT_CMapRec cmap; + FT_ULong num_encodings; /* ftobjs.h: FT_CMap->clazz->size */ + BDF_encoding_el* encodings; + + } BDF_CMapRec, *BDF_CMap; + + + FT_CALLBACK_DEF( FT_Error ) + bdf_cmap_init( FT_CMap bdfcmap, + FT_Pointer init_data ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_Face face = (BDF_Face)FT_CMAP_FACE( cmap ); + FT_UNUSED( init_data ); + + + cmap->num_encodings = face->bdffont->glyphs_used; + cmap->encodings = face->en_table; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + bdf_cmap_done( FT_CMap bdfcmap ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + + + cmap->encodings = NULL; + cmap->num_encodings = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + bdf_cmap_char_index( FT_CMap bdfcmap, + FT_UInt32 charcode ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_encoding_el* encodings = cmap->encodings; + FT_UShort result = 0; /* encodings->glyph */ + + FT_ULong min = 0; + FT_ULong max = cmap->num_encodings; + FT_ULong mid = ( min + max ) >> 1; + + + while ( min < max ) + { + FT_ULong code = encodings[mid].enc; + + + if ( charcode == code ) + { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ + result = encodings[mid].glyph + 1; + break; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + + /* reasonable prediction in a continuous block */ + mid += charcode - code; + if ( mid >= max || mid < min ) + mid = ( min + max ) >> 1; + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + bdf_cmap_char_next( FT_CMap bdfcmap, + FT_UInt32 *acharcode ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_encoding_el* encodings = cmap->encodings; + FT_UShort result = 0; /* encodings->glyph */ + FT_ULong charcode = *acharcode + 1; + + FT_ULong min = 0; + FT_ULong max = cmap->num_encodings; + FT_ULong mid = ( min + max ) >> 1; + + + while ( min < max ) + { + FT_ULong code = encodings[mid].enc; + + + if ( charcode == code ) + { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ + result = encodings[mid].glyph + 1; + goto Exit; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + + /* prediction in a continuous block */ + mid += charcode - code; + if ( mid >= max || mid < min ) + mid = ( min + max ) >> 1; + } + + charcode = 0; + if ( min < cmap->num_encodings ) + { + charcode = encodings[min].enc; + result = encodings[min].glyph + 1; + } + + Exit: + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%lx > 32bit API", + charcode )); + *acharcode = 0; + /* XXX: result should be changed to indicate an overflow error */ + } + else + *acharcode = (FT_UInt32)charcode; + return result; + } + + + static + const FT_CMap_ClassRec bdf_cmap_class = + { + sizeof ( BDF_CMapRec ), + bdf_cmap_init, + bdf_cmap_done, + bdf_cmap_char_index, + bdf_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + static FT_Error + bdf_interpret_style( BDF_Face bdf ) + { + FT_Error error = FT_Err_Ok; + FT_Face face = FT_FACE( bdf ); + FT_Memory memory = face->memory; + bdf_font_t* font = bdf->bdffont; + bdf_property_t* prop; + + const char* strings[4] = { NULL, NULL, NULL, NULL }; + size_t lengths[4], nn, len; + + + face->style_flags = 0; + + prop = bdf_get_font_property( font, "SLANT" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) + ? "Oblique" + : "Italic"; + } + + prop = bdf_get_font_property( font, "WEIGHT_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + strings[1] = "Bold"; + } + + prop = bdf_get_font_property( font, "SETWIDTH_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[3] = (const char *)(prop->value.atom); + + prop = bdf_get_font_property( font, "ADD_STYLE_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[0] = (const char *)(prop->value.atom); + + for ( len = 0, nn = 0; nn < 4; nn++ ) + { + lengths[nn] = 0; + if ( strings[nn] ) + { + lengths[nn] = ft_strlen( strings[nn] ); + len += lengths[nn] + 1; + } + } + + if ( len == 0 ) + { + strings[0] = "Regular"; + lengths[0] = ft_strlen( strings[0] ); + len = lengths[0] + 1; + } + + { + char* s; + + + if ( FT_QALLOC( face->style_name, len ) ) + return error; + + s = face->style_name; + + for ( nn = 0; nn < 4; nn++ ) + { + const char* src = strings[nn]; + + + len = lengths[nn]; + + if ( !src ) + continue; + + /* separate elements with a space */ + if ( s != face->style_name ) + *s++ = ' '; + + ft_memcpy( s, src, len ); + + /* need to convert spaces to dashes for */ + /* add_style_name and setwidth_name */ + if ( nn == 0 || nn == 3 ) + { + size_t mm; + + + for ( mm = 0; mm < len; mm++ ) + if ( s[mm] == ' ' ) + s[mm] = '-'; + } + + s += len; + } + *s = 0; + } + + return error; + } + + + FT_CALLBACK_DEF( void ) + BDF_Face_Done( FT_Face face ) /* BDF_Face */ + { + BDF_Face bdfface = (BDF_Face)face; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + bdf_free_font( bdfface->bdffont ); + + FT_FREE( bdfface->en_table ); + + FT_FREE( bdfface->charset_encoding ); + FT_FREE( bdfface->charset_registry ); + FT_FREE( face->family_name ); + FT_FREE( face->style_name ); + + FT_FREE( face->available_sizes ); + + FT_FREE( bdfface->bdffont ); + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Face_Init( FT_Stream stream, + FT_Face face, /* BDF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error = FT_Err_Ok; + BDF_Face bdfface = (BDF_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + + bdf_font_t* font = NULL; + bdf_options_t options; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + FT_TRACE2(( "BDF driver\n" )); + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + options.correct_metrics = 1; /* FZ XXX: options semantics */ + options.keep_unencoded = 1; + options.keep_comments = 0; + options.font_spacing = BDF_PROPORTIONAL; + + error = bdf_load_font( stream, memory, &options, &font ); + if ( FT_ERR_EQ( error, Missing_Startfont_Field ) ) + { + FT_TRACE2(( " not a BDF file\n" )); + goto Fail; + } + else if ( error ) + goto Exit; + + /* we have a bdf font: let's construct the face object */ + bdfface->bdffont = font; + + /* BDF cannot have multiple faces in a single font file. + * XXX: non-zero face_index is already invalid argument, but + * Type1, Type42 driver has a convention to return + * an invalid argument error when the font could be + * opened by the specified driver. + */ + if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 ) + { + FT_ERROR(( "BDF_Face_Init: invalid face index\n" )); + BDF_Face_Done( face ); + return FT_THROW( Invalid_Argument ); + } + + { + bdf_property_t* prop = NULL; + + + FT_TRACE4(( " number of glyphs: allocated %ld (used %ld)\n", + font->glyphs_size, + font->glyphs_used )); + FT_TRACE4(( " number of unencoded glyphs: allocated %ld (used %ld)\n", + font->unencoded_size, + font->unencoded_used )); + + face->num_faces = 1; + face->face_index = 0; + + face->face_flags |= FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; + + prop = bdf_get_font_property( font, "SPACING" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || + *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) + face->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ + /* FZ XXX: I need a font to implement this */ + + prop = bdf_get_font_property( font, "FAMILY_NAME" ); + if ( prop && prop->value.atom ) + { + if ( FT_STRDUP( face->family_name, prop->value.atom ) ) + goto Exit; + } + else + face->family_name = NULL; + + if ( FT_SET_ERROR( bdf_interpret_style( bdfface ) ) ) + goto Exit; + + /* the number of glyphs (with one slot for the undefined glyph */ + /* at position 0 and all unencoded glyphs) */ + face->num_glyphs = (FT_Long)( font->glyphs_size + 1 ); + + face->num_fixed_sizes = 1; + if ( FT_NEW( face->available_sizes ) ) + goto Exit; + + { + FT_Bitmap_Size* bsize = face->available_sizes; + FT_Short resolution_x = 0; + FT_Short resolution_y = 0; + long value; + + + /* sanity checks */ + if ( font->font_ascent > 0x7FFF || font->font_ascent < -0x7FFF ) + { + font->font_ascent = font->font_ascent < 0 ? -0x7FFF : 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping font ascent to value %ld\n", + font->font_ascent )); + } + if ( font->font_descent > 0x7FFF || font->font_descent < -0x7FFF ) + { + font->font_descent = font->font_descent < 0 ? -0x7FFF : 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping font descent to value %ld\n", + font->font_descent )); + } + + bsize->height = (FT_Short)( font->font_ascent + font->font_descent ); + + prop = bdf_get_font_property( font, "AVERAGE_WIDTH" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "BDF_Face_Init: negative average width\n" )); +#endif + if ( prop->value.l > 0x7FFFL * 10 - 5 || + prop->value.l < -( 0x7FFFL * 10 - 5 ) ) + { + bsize->width = 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping average width to value %d\n", + bsize->width )); + } + else + bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) ); + } + else + { + /* this is a heuristical value */ + bsize->width = ( bsize->height * 2 + 1 ) / 3; + } + + prop = bdf_get_font_property( font, "POINT_SIZE" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "BDF_Face_Init: negative point size\n" )); +#endif + /* convert from 722.7 decipoints to 72 points per inch */ + if ( prop->value.l > 0x504C2L || /* 0x7FFF * 72270/7200 */ + prop->value.l < -0x504C2L ) + { + bsize->size = 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping point size to value %ld\n", + bsize->size )); + } + else + bsize->size = FT_MulDiv( FT_ABS( prop->value.l ), + 64 * 7200, + 72270L ); + } + else if ( font->point_size ) + { + if ( font->point_size > 0x7FFF ) + { + bsize->size = 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping point size to value %ld\n", + bsize->size )); + } + else + bsize->size = (FT_Pos)font->point_size << 6; + } + else + { + /* this is a heuristical value */ + bsize->size = bsize->width * 64; + } + + prop = bdf_get_font_property( font, "PIXEL_SIZE" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "BDF_Face_Init: negative pixel size\n" )); +#endif + if ( prop->value.l > 0x7FFF || prop->value.l < -0x7FFF ) + { + bsize->y_ppem = 0x7FFF << 6; + FT_TRACE0(( "BDF_Face_Init: clamping pixel size to value %ld\n", + bsize->y_ppem )); + } + else + bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6; + } + + prop = bdf_get_font_property( font, "RESOLUTION_X" ); + if ( prop ) + value = prop->value.l; + else + value = (long)font->resolution_x; + if ( value ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( value < 0 ) + FT_TRACE0(( "BDF_Face_Init: negative X resolution\n" )); +#endif + if ( value > 0x7FFF || value < -0x7FFF ) + { + resolution_x = 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping X resolution to value %d\n", + resolution_x )); + } + else + resolution_x = FT_ABS( (FT_Short)value ); + } + + prop = bdf_get_font_property( font, "RESOLUTION_Y" ); + if ( prop ) + value = prop->value.l; + else + value = (long)font->resolution_y; + if ( value ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( value < 0 ) + FT_TRACE0(( "BDF_Face_Init: negative Y resolution\n" )); +#endif + if ( value > 0x7FFF || value < -0x7FFF ) + { + resolution_y = 0x7FFF; + FT_TRACE0(( "BDF_Face_Init: clamping Y resolution to value %d\n", + resolution_y )); + } + else + resolution_y = FT_ABS( (FT_Short)value ); + } + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = FT_MulDiv( bsize->y_ppem, resolution_y, 72 ); + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = FT_MulDiv( bsize->y_ppem, + resolution_x, + resolution_y ); + else + bsize->x_ppem = bsize->y_ppem; + } + + /* encoding table */ + { + bdf_glyph_t* cur = font->glyphs; + unsigned long n; + + + if ( FT_QNEW_ARRAY( bdfface->en_table, font->glyphs_size ) ) + goto Exit; + + bdfface->default_glyph = 0; + for ( n = 0; n < font->glyphs_size; n++ ) + { + (bdfface->en_table[n]).enc = cur[n].encoding; + FT_TRACE4(( " idx %ld, val 0x%lX\n", n, cur[n].encoding )); + (bdfface->en_table[n]).glyph = (FT_UShort)n; + + if ( cur[n].encoding == font->default_char ) + { + if ( n < FT_UINT_MAX ) + bdfface->default_glyph = (FT_UInt)n; + else + FT_TRACE1(( "BDF_Face_Init:" + " idx %ld is too large for this system\n", n )); + } + } + } + + /* charmaps */ + { + bdf_property_t *charset_registry, *charset_encoding; + FT_Bool unicode_charmap = 0; + + + charset_registry = + bdf_get_font_property( font, "CHARSET_REGISTRY" ); + charset_encoding = + bdf_get_font_property( font, "CHARSET_ENCODING" ); + if ( charset_registry && charset_encoding ) + { + if ( charset_registry->format == BDF_ATOM && + charset_encoding->format == BDF_ATOM && + charset_registry->value.atom && + charset_encoding->value.atom ) + { + const char* s; + + + if ( FT_STRDUP( bdfface->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( bdfface->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + + /* Uh, oh, compare first letters manually to avoid dependency */ + /* on locales. */ + s = bdfface->charset_registry; + if ( ( s[0] == 'i' || s[0] == 'I' ) && + ( s[1] == 's' || s[1] == 'S' ) && + ( s[2] == 'o' || s[2] == 'O' ) ) + { + s += 3; + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( bdfface->charset_encoding, "1" ) ) ) + unicode_charmap = 1; + /* another name for ASCII */ + else if ( !ft_strcmp( s, "646.1991" ) && + !ft_strcmp( bdfface->charset_encoding, "IRV" ) ) + unicode_charmap = 1; + } + + { + FT_CharMapRec charmap; + + + charmap.face = face; + charmap.encoding = FT_ENCODING_NONE; + /* initial platform/encoding should indicate unset status? */ + charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; + charmap.encoding_id = TT_APPLE_ID_DEFAULT; + + if ( unicode_charmap ) + { + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; + } + + error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); + } + + goto Exit; + } + } + + /* otherwise assume Adobe standard encoding */ + + { + FT_CharMapRec charmap; + + + charmap.face = face; + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.platform_id = TT_PLATFORM_ADOBE; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; + + error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); + + /* Select default charmap */ + if ( face->num_charmaps ) + face->charmap = face->charmaps[0]; + } + } + } + + Exit: + return error; + + Fail: + BDF_Face_Done( face ); + return FT_THROW( Unknown_File_Format ); + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + bdf_font_t* bdffont = ( (BDF_Face)size->face )->bdffont; + + + FT_Select_Metrics( size->face, strike_index ); + + size->metrics.ascender = bdffont->font_ascent * 64; + size->metrics.descender = -bdffont->font_descent * 64; + size->metrics.max_advance = bdffont->bbx.width * 64; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Size_Request( FT_Size size, + FT_Size_Request req ) + { + FT_Face face = size->face; + FT_Bitmap_Size* bsize = face->available_sizes; + bdf_font_t* bdffont = ( (BDF_Face)face )->bdffont; + FT_Error error = FT_ERR( Invalid_Pixel_Size ); + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = FT_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == ( bdffont->font_ascent + + bdffont->font_descent ) ) + error = FT_Err_Ok; + break; + + default: + error = FT_THROW( Unimplemented_Feature ); + break; + } + + if ( error ) + return error; + else + return BDF_Size_Select( size, 0 ); + } + + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Glyph_Load( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + BDF_Face bdf = (BDF_Face)FT_SIZE_FACE( size ); + FT_Face face = FT_FACE( bdf ); + FT_Error error = FT_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + bdf_glyph_t glyph; + int bpp = bdf->bdffont->bpp; + + FT_UNUSED( load_flags ); + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( glyph_index >= (FT_UInt)face->num_glyphs ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_TRACE1(( "BDF_Glyph_Load: glyph index %d\n", glyph_index )); + + /* index 0 is the undefined glyph */ + if ( glyph_index == 0 ) + glyph_index = bdf->default_glyph; + else + glyph_index--; + + /* slot, bitmap => freetype, glyph => bdflib */ + glyph = bdf->bdffont->glyphs[glyph_index]; + + bitmap->rows = glyph.bbx.height; + bitmap->width = glyph.bbx.width; + if ( glyph.bpr > FT_INT_MAX ) + FT_TRACE1(( "BDF_Glyph_Load: too large pitch %ld is truncated\n", + glyph.bpr )); + bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */ + + /* note: we don't allocate a new array to hold the bitmap; */ + /* we can simply point to it */ + ft_glyphslot_set_bitmap( slot, glyph.bitmap ); + + switch ( bpp ) + { + case 1: + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + break; + case 2: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2; + break; + case 4: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4; + break; + case 8: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + break; + } + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = glyph.bbx.x_offset; + slot->bitmap_top = glyph.bbx.ascent; + + slot->metrics.horiAdvance = (FT_Pos)( glyph.dwidth * 64 ); + slot->metrics.horiBearingX = (FT_Pos)( glyph.bbx.x_offset * 64 ); + slot->metrics.horiBearingY = (FT_Pos)( glyph.bbx.ascent * 64 ); + slot->metrics.width = (FT_Pos)( bitmap->width * 64 ); + slot->metrics.height = (FT_Pos)( bitmap->rows * 64 ); + + /* + * XXX DWIDTH1 and VVECTOR should be parsed and + * used here, provided such fonts do exist. + */ + ft_synthesize_vertical_metrics( &slot->metrics, + bdf->bdffont->bbx.height * 64 ); + + Exit: + return error; + } + + + /* + * + * BDF SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + bdf_get_bdf_property( FT_Face face, /* BDF_Face */ + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + BDF_Face bdfface = (BDF_Face)face; + bdf_property_t* prop; + + + FT_ASSERT( bdfface && bdfface->bdffont ); + + prop = bdf_get_font_property( bdfface->bdffont, prop_name ); + if ( prop ) + { + switch ( prop->format ) + { + case BDF_ATOM: + aproperty->type = BDF_PROPERTY_TYPE_ATOM; + aproperty->u.atom = prop->value.atom; + break; + + case BDF_INTEGER: + if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) + { + FT_TRACE1(( "bdf_get_bdf_property:" + " too large integer 0x%lx is truncated\n", + prop->value.l )); + } + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = (FT_Int32)prop->value.l; + break; + + case BDF_CARDINAL: + if ( prop->value.ul > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "bdf_get_bdf_property:" + " too large cardinal 0x%lx is truncated\n", + prop->value.ul )); + } + aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; + aproperty->u.cardinal = (FT_UInt32)prop->value.ul; + break; + + default: + goto Fail; + } + return 0; + } + + Fail: + return FT_THROW( Invalid_Argument ); + } + + + FT_CALLBACK_DEF( FT_Error ) + bdf_get_charset_id( FT_Face face, /* BDF_Face */ + const char* *acharset_encoding, + const char* *acharset_registry ) + { + BDF_Face bdfface = (BDF_Face)face; + + + *acharset_encoding = bdfface->charset_encoding; + *acharset_registry = bdfface->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec bdf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, /* get_charset_id */ + (FT_BDF_GetPropertyFunc) bdf_get_bdf_property /* get_property */ + }; + + + /* + * + * SERVICES LIST + * + */ + + static const FT_ServiceDescRec bdf_services[] = + { + { FT_SERVICE_ID_BDF, &bdf_service_bdf }, + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_BDF }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + bdf_driver_requester( FT_Module module, + const char* name ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( bdf_services, name ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec bdf_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "bdf", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + bdf_driver_requester /* FT_Module_Requester get_interface */ + }, + + sizeof ( BDF_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + BDF_Face_Init, /* FT_Face_InitFunc init_face */ + BDF_Face_Done, /* FT_Face_DoneFunc done_face */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ + + BDF_Glyph_Load, /* FT_Slot_LoadFunc load_glyph */ + + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ + + BDF_Size_Request, /* FT_Size_RequestFunc request_size */ + BDF_Size_Select /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/bdf/bdfdrivr.h b/external/freetype/src/bdf/bdfdrivr.h new file mode 100644 index 000000000..54aaa3353 --- /dev/null +++ b/external/freetype/src/bdf/bdfdrivr.h @@ -0,0 +1,72 @@ +/* bdfdrivr.h + + FreeType font driver for bdf fonts + + Copyright (C) 2001, 2002, 2003, 2004 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef BDFDRIVR_H_ +#define BDFDRIVR_H_ + +#include <freetype/internal/ftdrv.h> + +#include "bdf.h" + + +FT_BEGIN_HEADER + + + typedef struct BDF_encoding_el_ + { + FT_ULong enc; + FT_UShort glyph; + + } BDF_encoding_el; + + + typedef struct BDF_FaceRec_ + { + FT_FaceRec root; + + char* charset_encoding; + char* charset_registry; + + bdf_font_t* bdffont; + + BDF_encoding_el* en_table; + + FT_UInt default_glyph; + + } BDF_FaceRec, *BDF_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class; + + +FT_END_HEADER + + +#endif /* BDFDRIVR_H_ */ + + +/* END */ diff --git a/external/freetype/src/bdf/bdferror.h b/external/freetype/src/bdf/bdferror.h new file mode 100644 index 000000000..c1b544487 --- /dev/null +++ b/external/freetype/src/bdf/bdferror.h @@ -0,0 +1,45 @@ +/* + * Copyright 2001, 2002, 2012 Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /************************************************************************** + * + * This file is used to define the BDF error enumeration constants. + * + */ + +#ifndef BDFERROR_H_ +#define BDFERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX BDF_Err_ +#define FT_ERR_BASE FT_Mod_Err_BDF + +#include <freetype/fterrors.h> + +#endif /* BDFERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/bdf/bdflib.c b/external/freetype/src/bdf/bdflib.c new file mode 100644 index 000000000..0fa7e0a8c --- /dev/null +++ b/external/freetype/src/bdf/bdflib.c @@ -0,0 +1,2387 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001-2014 + * Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /************************************************************************** + * + * This file is based on bdf.c,v 1.22 2000/03/16 20:08:50 + * + * taken from Mark Leisher's xmbdfed package + * + */ + + + +#include <freetype/freetype.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftobjs.h> + +#include "bdf.h" +#include "bdferror.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT bdflib + + +#define BUFSIZE 128 + + + /************************************************************************** + * + * Default BDF font options. + * + */ + + + static const bdf_options_t bdf_opts_ = + { + 1, /* Correct metrics. */ + 1, /* Preserve unencoded glyphs. */ + 0, /* Preserve comments. */ + BDF_PROPORTIONAL /* Default spacing. */ + }; + + + /************************************************************************** + * + * Builtin BDF font properties. + * + */ + + /* List of most properties that might appear in a font. Doesn't include */ + /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts. */ + + static const bdf_property_t bdf_properties_[] = + { + { "ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } }, + { "AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } }, + { "CHARSET_ENCODING", BDF_ATOM, 1, { 0 } }, + { "CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } }, + { "COMMENT", BDF_ATOM, 1, { 0 } }, + { "COPYRIGHT", BDF_ATOM, 1, { 0 } }, + { "DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } }, + { "DESTINATION", BDF_CARDINAL, 1, { 0 } }, + { "DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } }, + { "END_SPACE", BDF_INTEGER, 1, { 0 } }, + { "FACE_NAME", BDF_ATOM, 1, { 0 } }, + { "FAMILY_NAME", BDF_ATOM, 1, { 0 } }, + { "FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "FONT", BDF_ATOM, 1, { 0 } }, + { "FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } }, + { "FONT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "FONT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "FOUNDRY", BDF_ATOM, 1, { 0 } }, + { "FULL_NAME", BDF_ATOM, 1, { 0 } }, + { "ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } }, + { "MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { "MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { "NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { "NOTICE", BDF_ATOM, 1, { 0 } }, + { "PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { "POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "RAW_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_END_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { "RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { "RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { "RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { "RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } }, + { "RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { "RESOLUTION", BDF_INTEGER, 1, { 0 } }, + { "RESOLUTION_X", BDF_CARDINAL, 1, { 0 } }, + { "RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } }, + { "SETWIDTH_NAME", BDF_ATOM, 1, { 0 } }, + { "SLANT", BDF_ATOM, 1, { 0 } }, + { "SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { "SPACING", BDF_ATOM, 1, { 0 } }, + { "STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { "STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { "SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { "SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { "SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { "UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { "UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { "WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { "WEIGHT_NAME", BDF_ATOM, 1, { 0 } }, + { "X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { "_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } }, + { "_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, + }; + + static const unsigned long + num_bdf_properties_ = sizeof ( bdf_properties_ ) / + sizeof ( bdf_properties_[0] ); + + + /* An auxiliary macro to parse properties, to be used in conditionals. */ + /* It behaves like `strncmp' but also tests the following character */ + /* whether it is a whitespace or null. */ + /* `property' is a constant string of length `n' to compare with. */ +#define _bdf_strncmp( name, property, n ) \ + ( ft_strncmp( name, property, n ) || \ + !( name[n] == ' ' || \ + name[n] == '\0' || \ + name[n] == '\n' || \ + name[n] == '\r' || \ + name[n] == '\t' ) ) + + /* Auto correction messages. */ +#define ACMSG1 "FONT_ASCENT property missing. " \ + "Added `FONT_ASCENT %hd'.\n" +#define ACMSG2 "FONT_DESCENT property missing. " \ + "Added `FONT_DESCENT %hd'.\n" +#define ACMSG3 "Font width != actual width. Old: %d New: %d.\n" +#define ACMSG4 "Font left bearing != actual left bearing. " \ + "Old: %hd New: %hd.\n" +#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd.\n" +#define ACMSG6 "Font descent != actual descent. Old: %d New: %d.\n" +#define ACMSG7 "Font height != actual height. Old: %d New: %d.\n" +#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made.\n" +#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically.\n" +#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width.\n" +#define ACMSG11 "SIZE bits per pixel field adjusted to %hd.\n" +#define ACMSG13 "Glyph %lu extra rows removed.\n" +#define ACMSG14 "Glyph %lu extra columns removed.\n" +#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found.\n" +#define ACMSG16 "Glyph %lu missing columns padded with zero bits.\n" +#define ACMSG17 "Adjusting number of glyphs to %ld.\n" + + /* Error messages. */ +#define ERRMSG1 "[line %ld] Missing `%s' line.\n" +#define ERRMSG2 "[line %ld] Font header corrupted or missing fields.\n" +#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields.\n" +#define ERRMSG4 "[line %ld] BBX too big.\n" +#define ERRMSG5 "[line %ld] `%s' value too big.\n" +#define ERRMSG6 "[line %ld] Input line too long.\n" +#define ERRMSG7 "[line %ld] Font name too long.\n" +#define ERRMSG8 "[line %ld] Invalid `%s' value.\n" +#define ERRMSG9 "[line %ld] Invalid keyword.\n" + + /* Debug messages. */ +#define DBGMSG1 " [%6ld] %s" /* no \n */ +#define DBGMSG2 " (0x%lX)\n" + + + /************************************************************************** + * + * Utility types and functions. + * + */ + + + /* Function type for parsing lines of a BDF font. */ + + typedef FT_Error + (*bdf_line_func_t_)( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ); + + + /* List structure for splitting lines into fields. */ + + typedef struct bdf_list_t__ + { + char** field; + unsigned long size; + unsigned long used; + FT_Memory memory; + + } bdf_list_t_; + + + /* Structure used while loading BDF fonts. */ + + typedef struct bdf_parse_t__ + { + unsigned long flags; + unsigned long cnt; + unsigned long row; + + short minlb; + short maxlb; + short maxrb; + short maxas; + short maxds; + + short rbearing; + + char* glyph_name; + long glyph_enc; + + bdf_font_t* font; + bdf_options_t* opts; + + bdf_list_t_ list; + + FT_Memory memory; + unsigned long size; /* the stream size */ + + } bdf_parse_t_; + + +#define setsbit( m, cc ) \ + ( m[(FT_Byte)(cc) >> 3] |= (FT_Byte)( 1 << ( (cc) & 7 ) ) ) +#define sbitset( m, cc ) \ + ( m[(FT_Byte)(cc) >> 3] & ( 1 << ( (cc) & 7 ) ) ) + + + static void + bdf_list_init_( bdf_list_t_* list, + FT_Memory memory ) + { + FT_ZERO( list ); + list->memory = memory; + } + + + static void + bdf_list_done_( bdf_list_t_* list ) + { + FT_Memory memory = list->memory; + + + if ( memory ) + { + FT_FREE( list->field ); + FT_ZERO( list ); + } + } + + + static FT_Error + bdf_list_ensure_( bdf_list_t_* list, + unsigned long num_items ) /* same as bdf_list_t_.used */ + { + FT_Error error = FT_Err_Ok; + + + if ( num_items > list->size ) + { + unsigned long oldsize = list->size; /* same as bdf_list_t_.size */ + unsigned long newsize = oldsize + ( oldsize >> 1 ) + 5; + unsigned long bigsize = (unsigned long)( FT_INT_MAX / sizeof ( char* ) ); + FT_Memory memory = list->memory; + + + if ( oldsize == bigsize ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + else if ( newsize < oldsize || newsize > bigsize ) + newsize = bigsize; + + if ( FT_QRENEW_ARRAY( list->field, oldsize, newsize ) ) + goto Exit; + + list->size = newsize; + } + + Exit: + return error; + } + + + static void + bdf_list_shift_( bdf_list_t_* list, + unsigned long n ) + { + unsigned long i, u; + + + if ( list == NULL || list->used == 0 || n == 0 ) + return; + + if ( n >= list->used ) + { + list->used = 0; + return; + } + + for ( u = n, i = 0; u < list->used; i++, u++ ) + list->field[i] = list->field[u]; + list->used -= n; + } + + + /* An empty string for empty fields. */ + + static const char empty[] = ""; /* XXX eliminate this */ + + + static char * + bdf_list_join_( bdf_list_t_* list, + int c, + unsigned long *alen ) + { + unsigned long i, j; + char* dp; + + + *alen = 0; + + if ( list == NULL || list->used == 0 ) + return NULL; + + dp = list->field[0]; + for ( i = j = 0; i < list->used; i++ ) + { + char* fp = list->field[i]; + + + while ( *fp ) + dp[j++] = *fp++; + + if ( i + 1 < list->used ) + dp[j++] = (char)c; + } + if ( dp != empty ) + dp[j] = 0; + + *alen = j; + return dp; + } + + + /* The code below ensures that we have at least 4 + 1 `field' */ + /* elements in `list' (which are possibly NULL) so that we */ + /* don't have to check the number of fields in most cases. */ + + static FT_Error + bdf_list_split_( bdf_list_t_* list, + const char* separators, + char* line, + unsigned long linelen ) + { + unsigned long final_empty; + int mult; + const char *sp, *end; + char *ep; + char seps[32]; + FT_Error error = FT_Err_Ok; + + + /* Initialize the list. */ + list->used = 0; + if ( list->size ) + { + list->field[0] = (char*)empty; + list->field[1] = (char*)empty; + list->field[2] = (char*)empty; + list->field[3] = (char*)empty; + list->field[4] = (char*)empty; + } + + /* If the line is empty, then simply return. */ + if ( linelen == 0 || line[0] == 0 ) + goto Exit; + + /* In the original code, if the `separators' parameter is NULL or */ + /* empty, the list is split into individual bytes. We don't need */ + /* this, so an error is signaled. */ + if ( separators == NULL || *separators == 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* Prepare the separator bitmap. */ + FT_MEM_ZERO( seps, 32 ); + + /* If the very last character of the separator string is a plus, then */ + /* set the `mult' flag to indicate that multiple separators should be */ + /* collapsed into one. */ + for ( mult = 0, sp = separators; sp && *sp; sp++ ) + { + if ( *sp == '+' && *( sp + 1 ) == 0 ) + mult = 1; + else + setsbit( seps, *sp ); + } + + /* Break the line up into fields. */ + for ( final_empty = 0, sp = ep = line, end = sp + linelen; + sp < end && *sp; ) + { + /* Collect everything that is not a separator. */ + for ( ; *ep && !sbitset( seps, *ep ); ep++ ) + ; + + /* Resize the list if necessary. */ + if ( list->used == list->size ) + { + error = bdf_list_ensure_( list, list->used + 1 ); + if ( error ) + goto Exit; + } + + /* Assign the field appropriately. */ + list->field[list->used++] = ( ep > sp ) ? (char*)sp : (char*)empty; + + sp = ep; + + if ( mult ) + { + /* If multiple separators should be collapsed, do it now by */ + /* setting all the separator characters to 0. */ + for ( ; *ep && sbitset( seps, *ep ); ep++ ) + *ep = 0; + } + else if ( *ep != 0 ) + /* Don't collapse multiple separators by making them 0, so just */ + /* make the one encountered 0. */ + *ep++ = 0; + + final_empty = ( ep > sp && *ep == 0 ); + sp = ep; + } + + /* Finally, NULL-terminate the list. */ + if ( list->used + final_empty >= list->size ) + { + error = bdf_list_ensure_( list, list->used + final_empty + 1 ); + if ( error ) + goto Exit; + } + + if ( final_empty ) + list->field[list->used++] = (char*)empty; + + list->field[list->used] = NULL; + + Exit: + return error; + } + + +#define NO_SKIP 256 /* this value cannot be stored in a 'char' */ + + + static FT_Error + bdf_readstream_( FT_Stream stream, + bdf_line_func_t_ callback, + void* client_data, + unsigned long *lno ) + { + bdf_line_func_t_ cb; + unsigned long lineno, buf_size; + int refill, hold, to_skip; + ptrdiff_t bytes, start, end, cursor, avail; + char* buf = NULL; + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + + if ( callback == NULL ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* initial size and allocation of the input buffer */ + buf_size = 1024; + + if ( FT_QALLOC( buf, buf_size ) ) + goto Exit; + + cb = callback; + lineno = 1; + buf[0] = 0; + start = 0; + avail = 0; + cursor = 0; + refill = 1; + to_skip = NO_SKIP; + bytes = 0; /* make compiler happy */ + + for (;;) + { + if ( refill ) + { + bytes = (ptrdiff_t)FT_Stream_TryRead( + stream, (FT_Byte*)buf + cursor, + buf_size - (unsigned long)cursor ); + avail = cursor + bytes; + cursor = 0; + refill = 0; + } + + end = start; + + /* should we skip an optional character like \n or \r? */ + if ( start < avail && buf[start] == to_skip ) + { + start += 1; + to_skip = NO_SKIP; + continue; + } + + /* try to find the end of the line */ + while ( end < avail && buf[end] != '\n' && buf[end] != '\r' ) + end++; + + /* if we hit the end of the buffer, try shifting its content */ + /* or even resizing it */ + if ( end >= avail ) + { + if ( bytes == 0 ) + { + /* last line in file doesn't end in \r or \n; */ + /* ignore it then exit */ + if ( lineno == 1 ) + error = FT_THROW( Missing_Startfont_Field ); + break; + } + + if ( start == 0 ) + { + /* this line is definitely too long; try resizing the input */ + /* buffer a bit to handle it. */ + FT_ULong new_size; + + + if ( buf_size >= 65536UL ) /* limit ourselves to 64KByte */ + { + if ( lineno == 1 ) + error = FT_THROW( Missing_Startfont_Field ); + else + { + FT_ERROR(( "bdf_readstream_: " ERRMSG6, lineno )); + error = FT_THROW( Invalid_Argument ); + } + goto Exit; + } + + new_size = buf_size * 2; + if ( FT_QREALLOC( buf, buf_size, new_size ) ) + goto Exit; + + cursor = avail; + buf_size = new_size; + } + else + { + bytes = avail - start; + + FT_MEM_MOVE( buf, buf + start, bytes ); + + cursor = bytes; + start = 0; + } + refill = 1; + continue; + } + + /* Temporarily NUL-terminate the line. */ + hold = buf[end]; + buf[end] = 0; + + /* XXX: Use encoding independent value for 0x1A */ + if ( buf[start] != '#' && buf[start] != 0x1A && end > start ) + { + error = (*cb)( buf + start, (unsigned long)( end - start ), lineno, + (void*)&cb, client_data ); + /* Redo if we have encountered CHARS without properties. */ + if ( error == -1 ) + error = (*cb)( buf + start, (unsigned long)( end - start ), lineno, + (void*)&cb, client_data ); + if ( error ) + break; + } + + lineno += 1; + buf[end] = (char)hold; + start = end + 1; + + if ( hold == '\n' ) + to_skip = '\r'; + else if ( hold == '\r' ) + to_skip = '\n'; + else + to_skip = NO_SKIP; + } + + *lno = lineno; + + Exit: + FT_FREE( buf ); + return error; + } + + + /* XXX: make this work with EBCDIC also */ + + static const unsigned char a2i[128] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + static const unsigned char ddigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + static const unsigned char hdigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, + 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + + /* Routine to convert a decimal ASCII string to an unsigned long integer. */ + static unsigned long + bdf_atoul_( const char* s ) + { + unsigned long v; + + + if ( s == NULL || *s == 0 ) + return 0; + + for ( v = 0; sbitset( ddigits, *s ); s++ ) + { + if ( v < ( FT_ULONG_MAX - 9 ) / 10 ) + v = v * 10 + a2i[(int)*s]; + else + { + v = FT_ULONG_MAX; + break; + } + } + + return v; + } + + + /* Routine to convert a decimal ASCII string to a signed long integer. */ + static long + bdf_atol_( const char* s ) + { + long v, neg; + + + if ( s == NULL || *s == 0 ) + return 0; + + /* Check for a minus sign. */ + neg = 0; + if ( *s == '-' ) + { + s++; + neg = 1; + } + + for ( v = 0; sbitset( ddigits, *s ); s++ ) + { + if ( v < ( FT_LONG_MAX - 9 ) / 10 ) + v = v * 10 + a2i[(int)*s]; + else + { + v = FT_LONG_MAX; + break; + } + } + + return ( !neg ) ? v : -v; + } + + + /* Routine to convert a decimal ASCII string to an unsigned short integer. */ + static unsigned short + bdf_atous_( const char* s ) + { + unsigned short v; + + + if ( s == NULL || *s == 0 ) + return 0; + + for ( v = 0; sbitset( ddigits, *s ); s++ ) + { + if ( v < ( FT_USHORT_MAX - 9 ) / 10 ) + v = (unsigned short)( v * 10 + a2i[(int)*s] ); + else + { + v = FT_USHORT_MAX; + break; + } + } + + return v; + } + + + /* Routine to convert a decimal ASCII string to a signed short integer. */ + static short + bdf_atos_( const char* s ) + { + short v, neg; + + + if ( s == NULL || *s == 0 ) + return 0; + + /* Check for a minus. */ + neg = 0; + if ( *s == '-' ) + { + s++; + neg = 1; + } + + for ( v = 0; sbitset( ddigits, *s ); s++ ) + { + if ( v < ( SHRT_MAX - 9 ) / 10 ) + v = (short)( v * 10 + a2i[(int)*s] ); + else + { + v = SHRT_MAX; + break; + } + } + + return (short)( ( !neg ) ? v : -v ); + } + + + /* Routine to compare two glyphs by encoding so they can be sorted. */ + FT_COMPARE_DEF( int ) + by_encoding( const void* a, + const void* b ) + { + bdf_glyph_t *c1, *c2; + + + c1 = (bdf_glyph_t *)a; + c2 = (bdf_glyph_t *)b; + + if ( c1->encoding < c2->encoding ) + return -1; + + if ( c1->encoding > c2->encoding ) + return 1; + + return 0; + } + + + static FT_Error + bdf_create_property( const char* name, + int format, + bdf_font_t* font ) + { + size_t n; + bdf_property_t* p; + FT_Memory memory = font->memory; + FT_Error error = FT_Err_Ok; + + + /* First check whether the property has */ + /* already been added or not. If it has, then */ + /* simply ignore it. */ + if ( ft_hash_str_lookup( name, &(font->proptbl) ) ) + goto Exit; + + if ( FT_QRENEW_ARRAY( font->user_props, + font->nuser_props, + font->nuser_props + 1 ) ) + goto Exit; + + p = font->user_props + font->nuser_props; + + n = ft_strlen( name ) + 1; + if ( n > FT_LONG_MAX ) + return FT_THROW( Invalid_Argument ); + + if ( FT_QALLOC( p->name, n ) ) + goto Exit; + + FT_MEM_COPY( (char *)p->name, name, n ); + + p->format = format; + p->builtin = 0; + p->value.atom = NULL; /* nothing is ever stored here */ + + n = num_bdf_properties_ + font->nuser_props; + + error = ft_hash_str_insert( p->name, n, &(font->proptbl), memory ); + if ( error ) + goto Exit; + + font->nuser_props++; + + Exit: + return error; + } + + + static bdf_property_t* + bdf_get_property( const char* name, + bdf_font_t* font ) + { + size_t* propid; + + + if ( name == NULL || *name == 0 ) + return NULL; + + if ( ( propid = ft_hash_str_lookup( name, &(font->proptbl) ) ) == NULL ) + return NULL; + + if ( *propid >= num_bdf_properties_ ) + return font->user_props + ( *propid - num_bdf_properties_ ); + + return (bdf_property_t*)bdf_properties_ + *propid; + } + + + /************************************************************************** + * + * BDF font file parsing flags and functions. + * + */ + + + /* Parse flags. */ + +#define BDF_START_ 0x0001U +#define BDF_FONT_NAME_ 0x0002U +#define BDF_SIZE_ 0x0004U +#define BDF_FONT_BBX_ 0x0008U +#define BDF_PROPS_ 0x0010U +#define BDF_GLYPHS_ 0x0020U +#define BDF_GLYPH_ 0x0040U +#define BDF_ENCODING_ 0x0080U +#define BDF_SWIDTH_ 0x0100U +#define BDF_DWIDTH_ 0x0200U +#define BDF_BBX_ 0x0400U +#define BDF_BITMAP_ 0x0800U + +#define BDF_SWIDTH_ADJ_ 0x1000U + +#define BDF_GLYPH_BITS_ ( BDF_GLYPH_ | \ + BDF_ENCODING_ | \ + BDF_SWIDTH_ | \ + BDF_DWIDTH_ | \ + BDF_BBX_ | \ + BDF_BITMAP_ ) + +#define BDF_GLYPH_WIDTH_CHECK_ 0x40000000UL +#define BDF_GLYPH_HEIGHT_CHECK_ 0x80000000UL + + + static FT_Error + bdf_add_comment_( bdf_font_t* font, + const char* comment, + unsigned long len ) + { + char* cp; + FT_Memory memory = font->memory; + FT_Error error = FT_Err_Ok; + + + if ( FT_QRENEW_ARRAY( font->comments, + font->comments_len, + font->comments_len + len + 1 ) ) + goto Exit; + + cp = font->comments + font->comments_len; + + FT_MEM_COPY( cp, comment, len ); + cp[len] = '\0'; + + font->comments_len += len + 1; + + Exit: + return error; + } + + + /* Set the spacing from the font name if it exists, or set it to the */ + /* default specified in the options. */ + static FT_Error + bdf_set_default_spacing_( bdf_font_t* font, + bdf_options_t* opts, + unsigned long lineno ) + { + size_t len; + char name[256]; + bdf_list_t_ list; + FT_Memory memory; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( lineno ); /* only used in debug mode */ + + + if ( font == NULL || font->name == NULL || font->name[0] == 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + memory = font->memory; + + bdf_list_init_( &list, memory ); + + font->spacing = opts->font_spacing; + + len = ft_strlen( font->name ) + 1; + /* Limit ourselves to 256 characters in the font name. */ + if ( len >= 256 ) + { + FT_ERROR(( "bdf_set_default_spacing_: " ERRMSG7, lineno )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_MEM_COPY( name, font->name, len ); + + error = bdf_list_split_( &list, "-", name, (unsigned long)len ); + if ( error ) + goto Fail; + + if ( list.used == 15 ) + { + switch ( list.field[11][0] ) + { + case 'C': + case 'c': + font->spacing = BDF_CHARCELL; + break; + case 'M': + case 'm': + font->spacing = BDF_MONOWIDTH; + break; + case 'P': + case 'p': + font->spacing = BDF_PROPORTIONAL; + break; + } + } + + Fail: + bdf_list_done_( &list ); + + Exit: + return error; + } + + + /* Determine whether the property is an atom or not. If it is, then */ + /* clean it up so the double quotes are removed if they exist. */ + static int + bdf_is_atom_( char* line, + unsigned long linelen, + char** name, + char** value, + bdf_font_t* font ) + { + int hold; + char *sp, *ep; + bdf_property_t* p; + + + sp = ep = line; + + while ( *ep && *ep != ' ' && *ep != '\t' ) + ep++; + + hold = *ep; + *ep = '\0'; + + p = bdf_get_property( sp, font ); + + /* If the property exists and is not an atom, just return here. */ + if ( p && p->format != BDF_ATOM ) + { + *ep = (char)hold; /* Undo NUL-termination. */ + return 0; + } + + *name = sp; + + /* The property is an atom. Trim all leading and trailing whitespace */ + /* and double quotes for the atom value. */ + sp = ep; + ep = line + linelen; + + /* Trim the leading whitespace if it exists. */ + if ( sp < ep ) + do + sp++; + while ( *sp == ' ' || *sp == '\t' ); + + /* Trim the leading double quote if it exists. */ + if ( *sp == '"' ) + sp++; + + *value = sp; + + /* Trim the trailing whitespace if it exists. */ + if ( sp < ep ) + do + *ep-- = '\0'; + while ( *ep == ' ' || *ep == '\t' ); + + /* Trim the trailing double quote if it exists. */ + if ( *ep == '"' ) + *ep = '\0'; + + return 1; + } + + + static FT_Error + bdf_add_property_( bdf_font_t* font, + const char* name, + char* value, + unsigned long lineno ) + { + size_t* propid; + bdf_property_t *prop, *fp; + FT_Memory memory = font->memory; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( lineno ); /* only used in debug mode */ + + + /* First, check whether the property already exists in the font. */ + if ( ( propid = ft_hash_str_lookup( name, + (FT_Hash)font->internal ) ) != NULL ) + { + /* The property already exists in the font, so simply replace */ + /* the value of the property with the current value. */ + fp = font->props + *propid; + + switch ( fp->format ) + { + case BDF_ATOM: + /* Delete the current atom if it exists. */ + FT_FREE( fp->value.atom ); + + if ( value && value[0] != 0 ) + { + if ( FT_STRDUP( fp->value.atom, value ) ) + goto Exit; + } + break; + + case BDF_INTEGER: + fp->value.l = bdf_atol_( value ); + break; + + case BDF_CARDINAL: + fp->value.ul = bdf_atoul_( value ); + break; + + default: + ; + } + + goto Exit; + } + + /* See whether this property type exists yet or not. */ + /* If not, create it. */ + propid = ft_hash_str_lookup( name, &(font->proptbl) ); + if ( !propid ) + { + error = bdf_create_property( name, BDF_ATOM, font ); + if ( error ) + goto Exit; + propid = ft_hash_str_lookup( name, &(font->proptbl) ); + } + + /* Allocate another property if this is overflowing. */ + if ( font->props_used == font->props_size ) + { + if ( FT_QRENEW_ARRAY( font->props, + font->props_size, + font->props_size + 1 ) ) + goto Exit; + + font->props_size++; + } + + if ( *propid >= num_bdf_properties_ ) + prop = font->user_props + ( *propid - num_bdf_properties_ ); + else + prop = (bdf_property_t*)bdf_properties_ + *propid; + + fp = font->props + font->props_used; + + fp->name = prop->name; + fp->format = prop->format; + fp->builtin = prop->builtin; + + switch ( prop->format ) + { + case BDF_ATOM: + fp->value.atom = NULL; + if ( value && value[0] ) + { + if ( FT_STRDUP( fp->value.atom, value ) ) + goto Exit; + } + break; + + case BDF_INTEGER: + fp->value.l = bdf_atol_( value ); + break; + + case BDF_CARDINAL: + fp->value.ul = bdf_atoul_( value ); + break; + } + + /* If the property happens to be a comment, then it doesn't need */ + /* to be added to the internal hash table. */ + if ( _bdf_strncmp( name, "COMMENT", 7 ) != 0 ) + { + /* Add the property to the font property table. */ + error = ft_hash_str_insert( fp->name, + font->props_used, + (FT_Hash)font->internal, + memory ); + if ( error ) + goto Exit; + } + + font->props_used++; + + /* Some special cases need to be handled here. The DEFAULT_CHAR */ + /* property needs to be located if it exists in the property list, the */ + /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are */ + /* present, and the SPACING property should override the default */ + /* spacing. */ + if ( _bdf_strncmp( name, "DEFAULT_CHAR", 12 ) == 0 ) + font->default_char = fp->value.ul; + else if ( _bdf_strncmp( name, "FONT_ASCENT", 11 ) == 0 ) + font->font_ascent = fp->value.l; + else if ( _bdf_strncmp( name, "FONT_DESCENT", 12 ) == 0 ) + font->font_descent = fp->value.l; + else if ( _bdf_strncmp( name, "SPACING", 7 ) == 0 ) + { + if ( !fp->value.atom ) + { + FT_ERROR(( "bdf_add_property_: " ERRMSG8, lineno, "SPACING" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' ) + font->spacing = BDF_PROPORTIONAL; + else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' ) + font->spacing = BDF_MONOWIDTH; + else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' ) + font->spacing = BDF_CHARCELL; + } + + Exit: + return error; + } + + + static const unsigned char nibble_mask[8] = + { + 0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE + }; + + + static FT_Error + bdf_parse_end_( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + /* a no-op; we ignore everything after `ENDFONT' */ + + FT_UNUSED( line ); + FT_UNUSED( linelen ); + FT_UNUSED( lineno ); + FT_UNUSED( call_data ); + FT_UNUSED( client_data ); + + return FT_Err_Ok; + } + + + /* Actually parse the glyph info and bitmaps. */ + static FT_Error + bdf_parse_glyphs_( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + int c, mask_index; + char* s; + unsigned char* bp; + unsigned long i, slen, nibbles; + + bdf_line_func_t_* next; + bdf_parse_t_* p; + bdf_glyph_t* glyph; + bdf_font_t* font; + + FT_Memory memory; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( lineno ); /* only used in debug mode */ + + + next = (bdf_line_func_t_ *)call_data; + p = (bdf_parse_t_ *) client_data; + + font = p->font; + memory = font->memory; + + /* Check for a comment. */ + if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) + { + if ( p->opts->keep_comments ) + { + linelen -= 7; + + s = line + 7; + if ( *s != 0 ) + { + s++; + linelen--; + } + error = bdf_add_comment_( p->font, s, linelen ); + } + goto Exit; + } + + /* The very first thing expected is the number of glyphs. */ + if ( !( p->flags & BDF_GLYPHS_ ) ) + { + if ( _bdf_strncmp( line, "CHARS", 5 ) != 0 ) + { + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "CHARS" )); + error = FT_THROW( Missing_Chars_Field ); + goto Exit; + } + + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + p->cnt = font->glyphs_size = bdf_atoul_( p->list.field[1] ); + + /* We need at least 20 bytes per glyph. */ + if ( p->cnt > p->size / 20 ) + { + p->cnt = font->glyphs_size = p->size / 20; + FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG17, p->cnt )); + } + + /* Make sure the number of glyphs is non-zero. */ + if ( p->cnt == 0 ) + font->glyphs_size = 64; + + /* Limit ourselves to 1,114,112 glyphs in the font (this is the */ + /* number of code points available in Unicode). */ + if ( p->cnt >= 0x110000UL ) + { + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG5, lineno, "CHARS" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) ) + goto Exit; + + p->flags |= BDF_GLYPHS_; + + goto Exit; + } + + /* Check for the ENDFONT field. */ + if ( _bdf_strncmp( line, "ENDFONT", 7 ) == 0 ) + { + if ( p->flags & BDF_GLYPH_BITS_ ) + { + /* Missing ENDCHAR field. */ + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "ENDCHAR" )); + error = FT_THROW( Corrupted_Font_Glyphs ); + goto Exit; + } + + /* Sort the glyphs by encoding. */ + ft_qsort( (char *)font->glyphs, + font->glyphs_used, + sizeof ( bdf_glyph_t ), + by_encoding ); + + p->flags &= ~BDF_START_; + *next = bdf_parse_end_; + + goto Exit; + } + + /* Check for the ENDCHAR field. */ + if ( _bdf_strncmp( line, "ENDCHAR", 7 ) == 0 ) + { + p->glyph_enc = 0; + p->flags &= ~BDF_GLYPH_BITS_; + + goto Exit; + } + + /* Check whether a glyph is being scanned but should be */ + /* ignored because it is an unencoded glyph. */ + if ( ( p->flags & BDF_GLYPH_ ) && + p->glyph_enc == -1 && + p->opts->keep_unencoded == 0 ) + goto Exit; + + /* Check for the STARTCHAR field. */ + if ( _bdf_strncmp( line, "STARTCHAR", 9 ) == 0 ) + { + if ( p->flags & BDF_GLYPH_BITS_ ) + { + /* Missing ENDCHAR field. */ + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "ENDCHAR" )); + error = FT_THROW( Missing_Startchar_Field ); + goto Exit; + } + + /* Set the character name in the parse info first until the */ + /* encoding can be checked for an unencoded character. */ + FT_FREE( p->glyph_name ); + + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + bdf_list_shift_( &p->list, 1 ); + + s = bdf_list_join_( &p->list, ' ', &slen ); + + if ( !s ) + { + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG8, lineno, "STARTCHAR" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( FT_QALLOC( p->glyph_name, slen + 1 ) ) + goto Exit; + + FT_MEM_COPY( p->glyph_name, s, slen + 1 ); + + p->flags |= BDF_GLYPH_; + + FT_TRACE4(( DBGMSG1, lineno, s )); + + goto Exit; + } + + /* Check for the ENCODING field. */ + if ( _bdf_strncmp( line, "ENCODING", 8 ) == 0 ) + { + if ( !( p->flags & BDF_GLYPH_ ) ) + { + /* Missing STARTCHAR field. */ + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "STARTCHAR" )); + error = FT_THROW( Missing_Startchar_Field ); + goto Exit; + } + + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + p->glyph_enc = bdf_atol_( p->list.field[1] ); + + /* Normalize negative encoding values. The specification only */ + /* allows -1, but we can be more generous here. */ + if ( p->glyph_enc < -1 ) + p->glyph_enc = -1; + + /* Check for alternative encoding format. */ + if ( p->glyph_enc == -1 && p->list.used > 2 ) + p->glyph_enc = bdf_atol_( p->list.field[2] ); + + if ( p->glyph_enc < -1 || p->glyph_enc >= 0x110000L ) + p->glyph_enc = -1; + + FT_TRACE4(( DBGMSG2, p->glyph_enc )); + + if ( p->glyph_enc >= 0 ) + { + /* Make sure there are enough glyphs allocated in case the */ + /* number of characters happen to be wrong. */ + if ( font->glyphs_used == font->glyphs_size ) + { + if ( FT_RENEW_ARRAY( font->glyphs, + font->glyphs_size, + font->glyphs_size + 64 ) ) + goto Exit; + + font->glyphs_size += 64; + } + + glyph = font->glyphs + font->glyphs_used++; + glyph->name = p->glyph_name; + glyph->encoding = (unsigned long)p->glyph_enc; + + /* Reset the initial glyph info. */ + p->glyph_name = NULL; + } + else + { + /* Unencoded glyph. Check whether it should */ + /* be added or not. */ + if ( p->opts->keep_unencoded ) + { + /* Allocate the next unencoded glyph. */ + if ( font->unencoded_used == font->unencoded_size ) + { + if ( FT_RENEW_ARRAY( font->unencoded , + font->unencoded_size, + font->unencoded_size + 4 ) ) + goto Exit; + + font->unencoded_size += 4; + } + + glyph = font->unencoded + font->unencoded_used; + glyph->name = p->glyph_name; + glyph->encoding = font->unencoded_used++; + + /* Reset the initial glyph info. */ + p->glyph_name = NULL; + } + else + { + /* Free up the glyph name if the unencoded shouldn't be */ + /* kept. */ + FT_FREE( p->glyph_name ); + } + } + + /* Clear the flags that might be added when width and height are */ + /* checked for consistency. */ + p->flags &= ~( BDF_GLYPH_WIDTH_CHECK_ | BDF_GLYPH_HEIGHT_CHECK_ ); + + p->flags |= BDF_ENCODING_; + + goto Exit; + } + + if ( !( p->flags & BDF_ENCODING_ ) ) + goto Missing_Encoding; + + /* Point at the glyph being constructed. */ + if ( p->glyph_enc == -1 ) + glyph = font->unencoded + ( font->unencoded_used - 1 ); + else + glyph = font->glyphs + ( font->glyphs_used - 1 ); + + /* Check whether a bitmap is being constructed. */ + if ( p->flags & BDF_BITMAP_ ) + { + /* If there are more rows than are specified in the glyph metrics, */ + /* ignore the remaining lines. */ + if ( p->row >= (unsigned long)glyph->bbx.height ) + { + if ( !( p->flags & BDF_GLYPH_HEIGHT_CHECK_ ) ) + { + FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG13, glyph->encoding )); + p->flags |= BDF_GLYPH_HEIGHT_CHECK_; + } + + goto Exit; + } + + /* Only collect the number of nibbles indicated by the glyph */ + /* metrics. If there are more columns, they are simply ignored. */ + nibbles = glyph->bpr << 1; + bp = glyph->bitmap + p->row * glyph->bpr; + + for ( i = 0; i < nibbles; i++ ) + { + c = line[i]; + if ( !sbitset( hdigits, c ) ) + break; + *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] ); + if ( i + 1 < nibbles && ( i & 1 ) ) + *++bp = 0; + } + + /* If any line has not enough columns, */ + /* indicate they have been padded with zero bits. */ + if ( i < nibbles && + !( p->flags & BDF_GLYPH_WIDTH_CHECK_ ) ) + { + FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG16, glyph->encoding )); + p->flags |= BDF_GLYPH_WIDTH_CHECK_; + } + + /* Remove possible garbage at the right. */ + mask_index = ( glyph->bbx.width * p->font->bpp ) & 7; + if ( glyph->bbx.width ) + *bp &= nibble_mask[mask_index]; + + /* If any line has extra columns, indicate they have been removed. */ + if ( i == nibbles && + sbitset( hdigits, line[nibbles] ) && + !( p->flags & BDF_GLYPH_WIDTH_CHECK_ ) ) + { + FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG14, glyph->encoding )); + p->flags |= BDF_GLYPH_WIDTH_CHECK_; + } + + p->row++; + goto Exit; + } + + /* Expect the SWIDTH (scalable width) field next. */ + if ( _bdf_strncmp( line, "SWIDTH", 6 ) == 0 ) + { + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + glyph->swidth = bdf_atous_( p->list.field[1] ); + p->flags |= BDF_SWIDTH_; + + goto Exit; + } + + /* Expect the DWIDTH (device width) field next. */ + if ( _bdf_strncmp( line, "DWIDTH", 6 ) == 0 ) + { + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + glyph->dwidth = bdf_atous_( p->list.field[1] ); + + if ( !( p->flags & BDF_SWIDTH_ ) ) + { + /* Missing SWIDTH field. Emit an auto correction message and set */ + /* the scalable width from the device width. */ + FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG9, lineno )); + + glyph->swidth = (unsigned short)FT_MulDiv( + glyph->dwidth, 72000L, + (FT_Long)( font->point_size * + font->resolution_x ) ); + } + + p->flags |= BDF_DWIDTH_; + goto Exit; + } + + /* Expect the BBX field next. */ + if ( _bdf_strncmp( line, "BBX", 3 ) == 0 ) + { + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + glyph->bbx.width = bdf_atous_( p->list.field[1] ); + glyph->bbx.height = bdf_atous_( p->list.field[2] ); + glyph->bbx.x_offset = bdf_atos_( p->list.field[3] ); + glyph->bbx.y_offset = bdf_atos_( p->list.field[4] ); + + /* Generate the ascent and descent of the character. */ + glyph->bbx.ascent = (short)( glyph->bbx.height + glyph->bbx.y_offset ); + glyph->bbx.descent = (short)( -glyph->bbx.y_offset ); + + /* Determine the overall font bounding box as the characters are */ + /* loaded so corrections can be done later if indicated. */ + p->maxas = (short)FT_MAX( glyph->bbx.ascent, p->maxas ); + p->maxds = (short)FT_MAX( glyph->bbx.descent, p->maxds ); + + p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset ); + + p->maxrb = (short)FT_MAX( p->rbearing, p->maxrb ); + p->minlb = (short)FT_MIN( glyph->bbx.x_offset, p->minlb ); + p->maxlb = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb ); + + if ( !( p->flags & BDF_DWIDTH_ ) ) + { + /* Missing DWIDTH field. Emit an auto correction message and set */ + /* the device width to the glyph width. */ + FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG10, lineno )); + glyph->dwidth = glyph->bbx.width; + } + + /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */ + /* value if necessary. */ + if ( p->opts->correct_metrics ) + { + /* Determine the point size of the glyph. */ + unsigned short sw = (unsigned short)FT_MulDiv( + glyph->dwidth, 72000L, + (FT_Long)( font->point_size * + font->resolution_x ) ); + + + if ( sw != glyph->swidth ) + { + glyph->swidth = sw; + + p->flags |= BDF_SWIDTH_ADJ_; + } + } + + p->flags |= BDF_BBX_; + goto Exit; + } + + /* And finally, gather up the bitmap. */ + if ( _bdf_strncmp( line, "BITMAP", 6 ) == 0 ) + { + unsigned long bitmap_size; + + + if ( !( p->flags & BDF_BBX_ ) ) + { + /* Missing BBX field. */ + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "BBX" )); + error = FT_THROW( Missing_Bbx_Field ); + goto Exit; + } + + /* Allocate enough space for the bitmap. */ + glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3; + + bitmap_size = glyph->bpr * glyph->bbx.height; + if ( glyph->bpr > 0xFFFFU || bitmap_size > 0xFFFFU ) + { + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG4, lineno )); + error = FT_THROW( Bbx_Too_Big ); + goto Exit; + } + else + glyph->bytes = (unsigned short)bitmap_size; + + if ( FT_ALLOC( glyph->bitmap, glyph->bytes ) ) + goto Exit; + + p->row = 0; + p->flags |= BDF_BITMAP_; + + goto Exit; + } + + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG9, lineno )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + + Missing_Encoding: + /* Missing ENCODING field. */ + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "ENCODING" )); + error = FT_THROW( Missing_Encoding_Field ); + + Exit: + if ( error && ( p->flags & BDF_GLYPH_ ) ) + FT_FREE( p->glyph_name ); + + return error; + } + + + /* Load the font properties. */ + static FT_Error + bdf_parse_properties_( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + unsigned long vlen; + bdf_line_func_t_* next; + bdf_parse_t_* p; + char* name; + char* value; + char nbuf[BUFSIZE]; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( lineno ); + + + next = (bdf_line_func_t_ *)call_data; + p = (bdf_parse_t_ *) client_data; + + /* Check for the end of the properties. */ + if ( _bdf_strncmp( line, "ENDPROPERTIES", 13 ) == 0 ) + { + /* If the FONT_ASCENT or FONT_DESCENT properties have not been */ + /* encountered yet, then make sure they are added as properties and */ + /* make sure they are set from the font bounding box info. */ + /* */ + /* This is *always* done regardless of the options, because X11 */ + /* requires these two fields to compile fonts. */ + if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 ) + { + p->font->font_ascent = p->font->bbx.ascent; + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent ); + error = bdf_add_property_( p->font, "FONT_ASCENT", + nbuf, lineno ); + if ( error ) + goto Exit; + + FT_TRACE2(( "bdf_parse_properties_: " ACMSG1, p->font->bbx.ascent )); + } + + if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 ) + { + p->font->font_descent = p->font->bbx.descent; + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent ); + error = bdf_add_property_( p->font, "FONT_DESCENT", + nbuf, lineno ); + if ( error ) + goto Exit; + + FT_TRACE2(( "bdf_parse_properties_: " ACMSG2, p->font->bbx.descent )); + } + + p->flags &= ~BDF_PROPS_; + *next = bdf_parse_glyphs_; + + goto Exit; + } + + /* Ignore the _XFREE86_GLYPH_RANGES properties. */ + if ( _bdf_strncmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 ) + goto Exit; + + /* Handle COMMENT fields and properties in a special way to preserve */ + /* the spacing. */ + if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) + { + name = value = line; + value += 7; + if ( *value ) + *value++ = 0; + error = bdf_add_property_( p->font, name, value, lineno ); + if ( error ) + goto Exit; + } + else if ( bdf_is_atom_( line, linelen, &name, &value, p->font ) ) + { + error = bdf_add_property_( p->font, name, value, lineno ); + if ( error ) + goto Exit; + } + else + { + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + name = p->list.field[0]; + + bdf_list_shift_( &p->list, 1 ); + value = bdf_list_join_( &p->list, ' ', &vlen ); + + error = bdf_add_property_( p->font, name, value, lineno ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + /* Load the font header. */ + static FT_Error + bdf_parse_start_( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + unsigned long slen; + bdf_line_func_t_* next; + bdf_parse_t_* p; + bdf_font_t* font; + char *s; + + FT_Memory memory = NULL; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( lineno ); /* only used in debug mode */ + + + next = (bdf_line_func_t_ *)call_data; + p = (bdf_parse_t_ *) client_data; + + if ( p->font ) + memory = p->font->memory; + + /* Check for a comment. This is done to handle those fonts that have */ + /* comments before the STARTFONT line for some reason. */ + if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) + { + if ( p->opts->keep_comments && p->font ) + { + linelen -= 7; + + s = line + 7; + if ( *s != 0 ) + { + s++; + linelen--; + } + error = bdf_add_comment_( p->font, s, linelen ); + } + goto Exit; + } + + if ( !( p->flags & BDF_START_ ) ) + { + memory = p->memory; + + if ( _bdf_strncmp( line, "STARTFONT", 9 ) != 0 ) + { + /* we don't emit an error message since this code gets */ + /* explicitly caught one level higher */ + error = FT_THROW( Missing_Startfont_Field ); + goto Exit; + } + + p->flags = BDF_START_; + font = p->font = NULL; + + if ( FT_NEW( font ) ) + goto Exit; + p->font = font; + + font->memory = p->memory; + + { /* setup */ + size_t i; + bdf_property_t* prop; + + + error = ft_hash_str_init( &(font->proptbl), memory ); + if ( error ) + goto Exit; + for ( i = 0, prop = (bdf_property_t*)bdf_properties_; + i < num_bdf_properties_; i++, prop++ ) + { + error = ft_hash_str_insert( prop->name, i, + &(font->proptbl), memory ); + if ( error ) + goto Exit; + } + } + + if ( FT_QALLOC( p->font->internal, sizeof ( FT_HashRec ) ) ) + goto Exit; + error = ft_hash_str_init( (FT_Hash)p->font->internal, memory ); + if ( error ) + goto Exit; + p->font->spacing = p->opts->font_spacing; + p->font->default_char = ~0UL; + + goto Exit; + } + + /* Check for the start of the properties. */ + if ( _bdf_strncmp( line, "STARTPROPERTIES", 15 ) == 0 ) + { + if ( !( p->flags & BDF_FONT_BBX_ ) ) + { + /* Missing the FONTBOUNDINGBOX field. */ + FT_ERROR(( "bdf_parse_start_: " ERRMSG1, lineno, "FONTBOUNDINGBOX" )); + error = FT_THROW( Missing_Fontboundingbox_Field ); + goto Exit; + } + + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + /* at this point, `p->font' can't be NULL */ + p->cnt = p->font->props_size = bdf_atoul_( p->list.field[1] ); + /* We need at least 4 bytes per property. */ + if ( p->cnt > p->size / 4 ) + { + p->font->props_size = 0; + + FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG5, lineno, "STARTPROPERTIES" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( FT_NEW_ARRAY( p->font->props, p->cnt ) ) + { + p->font->props_size = 0; + goto Exit; + } + + p->flags |= BDF_PROPS_; + *next = bdf_parse_properties_; + + goto Exit; + } + + /* Check for the FONTBOUNDINGBOX field. */ + if ( _bdf_strncmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) + { + if ( !( p->flags & BDF_SIZE_ ) ) + { + /* Missing the SIZE field. */ + FT_ERROR(( "bdf_parse_start_: " ERRMSG1, lineno, "SIZE" )); + error = FT_THROW( Missing_Size_Field ); + goto Exit; + } + + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + p->font->bbx.width = bdf_atous_( p->list.field[1] ); + p->font->bbx.height = bdf_atous_( p->list.field[2] ); + + p->font->bbx.x_offset = bdf_atos_( p->list.field[3] ); + p->font->bbx.y_offset = bdf_atos_( p->list.field[4] ); + + p->font->bbx.ascent = (short)( p->font->bbx.height + + p->font->bbx.y_offset ); + + p->font->bbx.descent = (short)( -p->font->bbx.y_offset ); + + p->flags |= BDF_FONT_BBX_; + + goto Exit; + } + + /* The next thing to check for is the FONT field. */ + if ( _bdf_strncmp( line, "FONT", 4 ) == 0 ) + { + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + bdf_list_shift_( &p->list, 1 ); + + s = bdf_list_join_( &p->list, ' ', &slen ); + + if ( !s ) + { + FT_ERROR(( "bdf_parse_start_: " ERRMSG8, lineno, "FONT" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allowing multiple `FONT' lines (which is invalid) doesn't hurt... */ + FT_FREE( p->font->name ); + + if ( FT_QALLOC( p->font->name, slen + 1 ) ) + goto Exit; + FT_MEM_COPY( p->font->name, s, slen + 1 ); + + /* If the font name is an XLFD name, set the spacing to the one in */ + /* the font name. If there is no spacing fall back on the default. */ + error = bdf_set_default_spacing_( p->font, p->opts, lineno ); + if ( error ) + goto Exit; + + p->flags |= BDF_FONT_NAME_; + + goto Exit; + } + + /* Check for the SIZE field. */ + if ( _bdf_strncmp( line, "SIZE", 4 ) == 0 ) + { + if ( !( p->flags & BDF_FONT_NAME_ ) ) + { + /* Missing the FONT field. */ + FT_ERROR(( "bdf_parse_start_: " ERRMSG1, lineno, "FONT" )); + error = FT_THROW( Missing_Font_Field ); + goto Exit; + } + + error = bdf_list_split_( &p->list, " +", line, linelen ); + if ( error ) + goto Exit; + + p->font->point_size = bdf_atoul_( p->list.field[1] ); + p->font->resolution_x = bdf_atoul_( p->list.field[2] ); + p->font->resolution_y = bdf_atoul_( p->list.field[3] ); + + /* Check for the bits per pixel field. */ + if ( p->list.used == 5 ) + { + unsigned short bpp; + + + bpp = bdf_atous_( p->list.field[4] ); + + /* Only values 1, 2, 4, 8 are allowed for greymap fonts. */ + if ( bpp > 4 ) + p->font->bpp = 8; + else if ( bpp > 2 ) + p->font->bpp = 4; + else if ( bpp > 1 ) + p->font->bpp = 2; + else + p->font->bpp = 1; + + if ( p->font->bpp != bpp ) + FT_TRACE2(( "bdf_parse_start_: " ACMSG11, p->font->bpp )); + } + else + p->font->bpp = 1; + + p->flags |= BDF_SIZE_; + + goto Exit; + } + + /* Check for the CHARS field -- font properties are optional */ + if ( _bdf_strncmp( line, "CHARS", 5 ) == 0 ) + { + char nbuf[BUFSIZE]; + + + if ( !( p->flags & BDF_FONT_BBX_ ) ) + { + /* Missing the FONTBOUNDINGBOX field. */ + FT_ERROR(( "bdf_parse_start_: " ERRMSG1, lineno, "FONTBOUNDINGBOX" )); + error = FT_THROW( Missing_Fontboundingbox_Field ); + goto Exit; + } + + /* Add the two standard X11 properties which are required */ + /* for compiling fonts. */ + p->font->font_ascent = p->font->bbx.ascent; + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent ); + error = bdf_add_property_( p->font, "FONT_ASCENT", + nbuf, lineno ); + if ( error ) + goto Exit; + FT_TRACE2(( "bdf_parse_properties_: " ACMSG1, p->font->bbx.ascent )); + + p->font->font_descent = p->font->bbx.descent; + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent ); + error = bdf_add_property_( p->font, "FONT_DESCENT", + nbuf, lineno ); + if ( error ) + goto Exit; + FT_TRACE2(( "bdf_parse_properties_: " ACMSG2, p->font->bbx.descent )); + + *next = bdf_parse_glyphs_; + + /* A special return value. */ + error = -1; + goto Exit; + } + + FT_ERROR(( "bdf_parse_start_: " ERRMSG9, lineno )); + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + /************************************************************************** + * + * API. + * + */ + + + FT_LOCAL_DEF( FT_Error ) + bdf_load_font( FT_Stream stream, + FT_Memory memory, + bdf_options_t* opts, + bdf_font_t* *font ) + { + unsigned long lineno = 0; /* make compiler happy */ + bdf_parse_t_ *p = NULL; + + FT_Error error = FT_Err_Ok; + + + if ( FT_NEW( p ) ) + goto Exit; + + p->opts = (bdf_options_t*)( opts ? opts : &bdf_opts_ ); + p->minlb = 32767; + p->size = stream->size; + p->memory = memory; /* only during font creation */ + + bdf_list_init_( &p->list, memory ); + + error = bdf_readstream_( stream, bdf_parse_start_, + (void *)p, &lineno ); + if ( error ) + goto Fail; + + if ( p->font ) + { + /* If the font is not proportional, set the font's monowidth */ + /* field to the width of the font bounding box. */ + + if ( p->font->spacing != BDF_PROPORTIONAL ) + p->font->monowidth = p->font->bbx.width; + + /* If the number of glyphs loaded is not that of the original count, */ + /* indicate the difference. */ + if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG15, p->cnt, + p->font->glyphs_used + p->font->unencoded_used )); + } + + /* Once the font has been loaded, adjust the overall font metrics if */ + /* necessary. */ + if ( p->opts->correct_metrics != 0 && + ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) ) + { + if ( p->maxrb - p->minlb != p->font->bbx.width ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG3, + p->font->bbx.width, p->maxrb - p->minlb )); + p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb ); + } + + if ( p->font->bbx.x_offset != p->minlb ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG4, + p->font->bbx.x_offset, p->minlb )); + p->font->bbx.x_offset = p->minlb; + } + + if ( p->font->bbx.ascent != p->maxas ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG5, + p->font->bbx.ascent, p->maxas )); + p->font->bbx.ascent = p->maxas; + } + + if ( p->font->bbx.descent != p->maxds ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG6, + p->font->bbx.descent, p->maxds )); + p->font->bbx.descent = p->maxds; + p->font->bbx.y_offset = (short)( -p->maxds ); + } + + if ( p->maxas + p->maxds != p->font->bbx.height ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG7, + p->font->bbx.height, p->maxas + p->maxds )); + p->font->bbx.height = (unsigned short)( p->maxas + p->maxds ); + } + + if ( p->flags & BDF_SWIDTH_ADJ_ ) + FT_TRACE2(( "bdf_load_font: " ACMSG8 )); + } + } + + if ( p->flags & BDF_START_ ) + { + /* The ENDFONT field was never reached or did not exist. */ + if ( !( p->flags & BDF_GLYPHS_ ) ) + { + /* Error happened while parsing header. */ + FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno )); + error = FT_THROW( Corrupted_Font_Header ); + goto Fail; + } + else + { + /* Error happened when parsing glyphs. */ + FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno )); + error = FT_THROW( Corrupted_Font_Glyphs ); + goto Fail; + } + } + + if ( !p->font && !error ) + error = FT_THROW( Invalid_File_Format ); + + *font = p->font; + + Exit: + if ( p ) + { + bdf_list_done_( &p->list ); + + FT_FREE( p->glyph_name ); + FT_FREE( p ); + } + + return error; + + Fail: + bdf_free_font( p->font ); + + FT_FREE( p->font ); + + goto Exit; + } + + + FT_LOCAL_DEF( void ) + bdf_free_font( bdf_font_t* font ) + { + bdf_property_t* prop; + unsigned long i; + bdf_glyph_t* glyphs; + FT_Memory memory; + + + if ( font == NULL ) + return; + + memory = font->memory; + + FT_FREE( font->name ); + + /* Free up the internal hash table of property names. */ + if ( font->internal ) + { + ft_hash_str_free( (FT_Hash)font->internal, memory ); + FT_FREE( font->internal ); + } + + /* Free up the comment info. */ + FT_FREE( font->comments ); + + /* Free up the properties. */ + for ( i = 0; i < font->props_size; i++ ) + { + if ( font->props[i].format == BDF_ATOM ) + FT_FREE( font->props[i].value.atom ); + } + + FT_FREE( font->props ); + + /* Free up the character info. */ + for ( i = 0, glyphs = font->glyphs; + i < font->glyphs_used; i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used; + i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + FT_FREE( font->glyphs ); + FT_FREE( font->unencoded ); + + /* bdf_cleanup */ + ft_hash_str_free( &(font->proptbl), memory ); + + /* Free up the user defined properties. */ + for ( prop = font->user_props, i = 0; + i < font->nuser_props; i++, prop++ ) + FT_FREE( prop->name ); + + FT_FREE( font->user_props ); + + /* FREE( font ); */ /* XXX Fixme */ + } + + + FT_LOCAL_DEF( bdf_property_t * ) + bdf_get_font_property( bdf_font_t* font, + const char* name ) + { + size_t* propid; + + + if ( font == NULL || font->props_size == 0 || name == NULL || *name == 0 ) + return 0; + + propid = ft_hash_str_lookup( name, (FT_Hash)font->internal ); + + return propid ? ( font->props + *propid ) : 0; + } + + +/* END */ diff --git a/external/freetype/src/bdf/module.mk b/external/freetype/src/bdf/module.mk new file mode 100644 index 000000000..fe06ae8e0 --- /dev/null +++ b/external/freetype/src/bdf/module.mk @@ -0,0 +1,34 @@ +# +# FreeType 2 BDF module definition +# + +# Copyright 2001, 2002, 2006 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +FTMODULE_H_COMMANDS += BDF_DRIVER + +define BDF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, bdf_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)bdf $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/bdf/rules.mk b/external/freetype/src/bdf/rules.mk new file mode 100644 index 000000000..d1dd76b1c --- /dev/null +++ b/external/freetype/src/bdf/rules.mk @@ -0,0 +1,84 @@ +# +# FreeType 2 bdf driver configuration rules +# + + +# Copyright (C) 2001, 2002, 2003, 2008 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + + + +# bdf driver directory +# +BDF_DIR := $(SRC_DIR)/bdf + + +BDF_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(BDF_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# bdf driver sources (i.e., C files) +# +BDF_DRV_SRC := $(BDF_DIR)/bdflib.c \ + $(BDF_DIR)/bdfdrivr.c + + +# bdf driver headers +# +BDF_DRV_H := $(BDF_DIR)/bdf.h \ + $(BDF_DIR)/bdfdrivr.h \ + $(BDF_DIR)/bdferror.h + +# bdf driver object(s) +# +# BDF_DRV_OBJ_M is used during `multi' builds +# BDF_DRV_OBJ_S is used during `single' builds +# +BDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O) +BDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O + +# bdf driver source file for single build +# +BDF_DRV_SRC_S := $(BDF_DIR)/bdf.c + + +# bdf driver - single object +# +$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S)) + + +# bdf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(BDF_DRV_OBJ_S) +DRV_OBJS_M += $(BDF_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/bzip2/ftbzip2.c b/external/freetype/src/bzip2/ftbzip2.c new file mode 100644 index 000000000..ad342bd01 --- /dev/null +++ b/external/freetype/src/bzip2/ftbzip2.c @@ -0,0 +1,535 @@ +/**************************************************************************** + * + * ftbzip2.c + * + * FreeType support for .bz2 compressed files. + * + * This optional component relies on libbz2. It should mainly be used to + * parse compressed PCF fonts, as found with many X11 server + * distributions. + * + * Copyright (C) 2010-2023 by + * Joel Klinghed. + * + * based on `src/gzip/ftgzip.c' + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftbzip2.h> +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Bzip2_Err_ +#define FT_ERR_BASE FT_Mod_Err_Bzip2 + +#include <freetype/fterrors.h> + + +#ifdef FT_CONFIG_OPTION_USE_BZIP2 + +#define BZ_NO_STDIO /* Do not need FILE */ +#include <bzlib.h> + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** B Z I P 2 M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + /* it is better to use FreeType memory routines instead of raw + 'malloc/free' */ + + typedef void* (*alloc_func)( void*, int, int ); + typedef void (*free_func) ( void*, void* ); + + + static void* + ft_bzip2_alloc( void* memory_, /* FT_Memory */ + int items, + int size ) + { + FT_Memory memory = (FT_Memory)memory_; + + FT_ULong sz = (FT_ULong)size * (FT_ULong)items; + FT_Error error; + FT_Pointer p = NULL; + + + FT_MEM_QALLOC( p, sz ); + return p; + } + + + static void + ft_bzip2_free( void* memory_, /* FT_Memory */ + void* address ) + { + FT_Memory memory = (FT_Memory)memory_; + + + FT_MEM_FREE( address ); + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** B Z I P 2 F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_BZIP2_BUFFER_SIZE 4096 + + typedef struct FT_BZip2FileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + bz_stream bzstream; /* bzlib input stream */ + + FT_Byte input[FT_BZIP2_BUFFER_SIZE]; /* input read buffer */ + + FT_Byte buffer[FT_BZIP2_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + FT_Bool reset; /* reset before next read */ + + } FT_BZip2FileRec, *FT_BZip2File; + + + /* check and skip .bz2 header - we don't support `transparent' compression */ + static FT_Error + ft_bzip2_check_header( FT_Stream stream ) + { + FT_Error error = FT_Err_Ok; + FT_Byte head[4]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 4 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers; */ + /* head[2] is the version, and head[3] the blocksize */ + if ( head[0] != 0x42 || + head[1] != 0x5A || + head[2] != 0x68 ) /* only support bzip2 (huffman) */ + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + Exit: + return error; + } + + + static FT_Error + ft_bzip2_file_init( FT_BZip2File zip, + FT_Stream stream, + FT_Stream source ) + { + bz_stream* bzstream = &zip->bzstream; + FT_Error error = FT_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_BZIP2_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + zip->reset = 0; + + /* check .bz2 header */ + { + stream = source; + + error = ft_bzip2_check_header( stream ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + } + + /* initialize bzlib */ + bzstream->bzalloc = ft_bzip2_alloc; + bzstream->bzfree = ft_bzip2_free; + bzstream->opaque = zip->memory; + + bzstream->avail_in = 0; + bzstream->next_in = (char*)zip->buffer; + + if ( BZ2_bzDecompressInit( bzstream, 0, 0 ) != BZ_OK || + !bzstream->next_in ) + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + static void + ft_bzip2_file_done( FT_BZip2File zip ) + { + bz_stream* bzstream = &zip->bzstream; + + + BZ2_bzDecompressEnd( bzstream ); + + /* clear the rest */ + bzstream->bzalloc = NULL; + bzstream->bzfree = NULL; + bzstream->opaque = NULL; + bzstream->next_in = NULL; + bzstream->next_out = NULL; + bzstream->avail_in = 0; + bzstream->avail_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_bzip2_file_reset( FT_BZip2File zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( 0 ) ) + { + bz_stream* bzstream = &zip->bzstream; + + + BZ2_bzDecompressEnd( bzstream ); + + bzstream->avail_in = 0; + bzstream->next_in = (char*)zip->input; + bzstream->avail_out = 0; + bzstream->next_out = (char*)zip->buffer; + + zip->limit = zip->buffer + FT_BZIP2_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + zip->reset = 0; + + BZ2_bzDecompressInit( bzstream, 0, 0 ); + } + + return error; + } + + + static FT_Error + ft_bzip2_file_fill_input( FT_BZip2File zip ) + { + bz_stream* bzstream = &zip->bzstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_BZIP2_BUFFER_SIZE ); + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + } + else + { + size = stream->size - stream->pos; + if ( size > FT_BZIP2_BUFFER_SIZE ) + size = FT_BZIP2_BUFFER_SIZE; + + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + bzstream->next_in = (char*)zip->input; + bzstream->avail_in = size; + + return FT_Err_Ok; + } + + + static FT_Error + ft_bzip2_file_fill_output( FT_BZip2File zip ) + { + bz_stream* bzstream = &zip->bzstream; + FT_Error error = FT_Err_Ok; + + + zip->cursor = zip->buffer; + bzstream->next_out = (char*)zip->cursor; + bzstream->avail_out = FT_BZIP2_BUFFER_SIZE; + + while ( bzstream->avail_out > 0 ) + { + int err; + + + if ( bzstream->avail_in == 0 ) + { + error = ft_bzip2_file_fill_input( zip ); + if ( error ) + break; + } + + err = BZ2_bzDecompress( bzstream ); + + if ( err != BZ_OK ) + { + zip->reset = 1; + + if ( err == BZ_STREAM_END ) + { + zip->limit = (FT_Byte*)bzstream->next_out; + if ( zip->limit == zip->cursor ) + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + else + { + zip->limit = zip->cursor; + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + } + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_BZIP2_BUFFER_SIZE */ + static FT_Error + ft_bzip2_file_skip_output( FT_BZip2File zip, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + + + for (;;) + { + FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); + + + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_bzip2_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_bzip2_file_io( FT_BZip2File zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Reset inflate stream if seeking backwards or bzip reported an error. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos || zip->reset ) + { + error = ft_bzip2_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_bzip2_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_bzip2_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** B Z E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_bzip2_stream_close( FT_Stream stream ) + { + FT_BZip2File zip = (FT_BZip2File)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize bzip file descriptor */ + ft_bzip2_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static unsigned long + ft_bzip2_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_BZip2File zip = (FT_BZip2File)stream->descriptor.pointer; + + + return ft_bzip2_file_io( zip, offset, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory; + FT_BZip2File zip = NULL; + + + if ( !stream || !source ) + { + error = FT_THROW( Invalid_Stream_Handle ); + goto Exit; + } + + memory = source->memory; + + /* + * check the header right now; this prevents allocating unnecessary + * objects when we don't need them + */ + error = ft_bzip2_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_bzip2_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = NULL; + stream->read = ft_bzip2_stream_io; + stream->close = ft_bzip2_stream_close; + + Exit: + return error; + } + +#else /* !FT_CONFIG_OPTION_USE_BZIP2 */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return FT_THROW( Unimplemented_Feature ); + } + +#endif /* !FT_CONFIG_OPTION_USE_BZIP2 */ + + +/* END */ diff --git a/external/freetype/src/bzip2/rules.mk b/external/freetype/src/bzip2/rules.mk new file mode 100644 index 000000000..f4d3733eb --- /dev/null +++ b/external/freetype/src/bzip2/rules.mk @@ -0,0 +1,64 @@ +# +# FreeType 2 BZIP2 support configuration rules +# + +# Copyright (C) 2010-2023 by +# Joel Klinghed. +# +# based on `src/lzw/rules.mk' +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# BZIP2 driver directory +# +BZIP2_DIR := $(SRC_DIR)/bzip2 + + +# compilation flags for the driver +# +BZIP2_COMPILE := $(CC) $(ANSIFLAGS) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# BZIP2 support sources (i.e., C files) +# +BZIP2_DRV_SRC := $(BZIP2_DIR)/ftbzip2.c + +# BZIP2 driver object(s) +# +# BZIP2_DRV_OBJ_M is used during `multi' builds +# BZIP2_DRV_OBJ_S is used during `single' builds +# +BZIP2_DRV_OBJ_M := $(OBJ_DIR)/ftbzip2.$O +BZIP2_DRV_OBJ_S := $(OBJ_DIR)/ftbzip2.$O + +# BZIP2 support source file for single build +# +BZIP2_DRV_SRC_S := $(BZIP2_DIR)/ftbzip2.c + + +# BZIP2 support - single object +# +$(BZIP2_DRV_OBJ_S): $(BZIP2_DRV_SRC_S) $(BZIP2_DRV_SRC) $(FREETYPE_H) $(BZIP2_DRV_H) + $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BZIP2_DRV_SRC_S)) + + +# BZIP2 support - multiple objects +# +$(OBJ_DIR)/%.$O: $(BZIP2_DIR)/%.c $(FREETYPE_H) $(BZIP2_DRV_H) + $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(BZIP2_DRV_OBJ_S) +DRV_OBJS_M += $(BZIP2_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/cache/ftcache.c b/external/freetype/src/cache/ftcache.c new file mode 100644 index 000000000..1af2e6772 --- /dev/null +++ b/external/freetype/src/cache/ftcache.c @@ -0,0 +1,31 @@ +/**************************************************************************** + * + * ftcache.c + * + * The FreeType Caching sub-system (body only). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftcbasic.c" +#include "ftccache.c" +#include "ftccmap.c" +#include "ftcglyph.c" +#include "ftcimage.c" +#include "ftcmanag.c" +#include "ftcmru.c" +#include "ftcsbits.c" + + +/* END */ diff --git a/external/freetype/src/cache/ftcbasic.c b/external/freetype/src/cache/ftcbasic.c new file mode 100644 index 000000000..24a56c8d2 --- /dev/null +++ b/external/freetype/src/cache/ftcbasic.c @@ -0,0 +1,638 @@ +/**************************************************************************** + * + * ftcbasic.c + * + * The FreeType basic cache interface (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftcache.h> +#include "ftcglyph.h" +#include "ftcimage.h" +#include "ftcsbits.h" + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT cache + + + /* + * Basic Families + * + */ + typedef struct FTC_BasicAttrRec_ + { + FTC_ScalerRec scaler; + FT_UInt load_flags; + + } FTC_BasicAttrRec, *FTC_BasicAttrs; + +#define FTC_BASIC_ATTR_COMPARE( a, b ) \ + FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ + (a)->load_flags == (b)->load_flags ) + +#define FTC_BASIC_ATTR_HASH( a ) \ + ( FTC_SCALER_HASH( &(a)->scaler ) + 31 * (a)->load_flags ) + + + typedef struct FTC_BasicQueryRec_ + { + FTC_GQueryRec gquery; + FTC_BasicAttrRec attrs; + + } FTC_BasicQueryRec, *FTC_BasicQuery; + + + typedef struct FTC_BasicFamilyRec_ + { + FTC_FamilyRec family; + FTC_BasicAttrRec attrs; + + } FTC_BasicFamilyRec, *FTC_BasicFamily; + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_family_compare( FTC_MruNode ftcfamily, + FT_Pointer ftcquery ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; + + + return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_init( FTC_MruNode ftcfamily, + FT_Pointer ftcquery, + FT_Pointer ftccache ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; + FTC_Cache cache = (FTC_Cache)ftccache; + + + FTC_Family_Init( FTC_FAMILY( family ), cache ); + family->attrs = query->attrs; + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + ftc_basic_family_get_count( FTC_Family ftcfamily, + FTC_Manager manager ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FT_Face face; + FT_UInt result = 0; + + + error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, + &face ); + + if ( error || !face ) + return result; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs ) + { + FT_TRACE1(( "ftc_basic_family_get_count:" + " the number of glyphs in this face is %ld,\n", + face->num_glyphs )); + FT_TRACE1(( " " + " which is too much and thus truncated\n" )); + } +#endif + + result = (FT_UInt)face->num_glyphs; + + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_bitmap( FTC_Family ftcfamily, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FT_Size size; + + + error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size ); + if ( !error ) + { + FT_Face face = size->face; + + + error = FT_Load_Glyph( + face, + gindex, + (FT_Int)family->attrs.load_flags | FT_LOAD_RENDER ); + if ( !error ) + *aface = face; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_glyph( FTC_Family ftcfamily, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FTC_Scaler scaler = &family->attrs.scaler; + FT_Face face; + FT_Size size; + + + /* we will now load the glyph image */ + error = FTC_Manager_LookupSize( cache->manager, + scaler, + &size ); + if ( !error ) + { + face = size->face; + + error = FT_Load_Glyph( face, + gindex, + (FT_Int)family->attrs.load_flags ); + if ( !error ) + { + if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || + face->glyph->format == FT_GLYPH_FORMAT_OUTLINE || + face->glyph->format == FT_GLYPH_FORMAT_SVG ) + { + /* ok, copy it */ + FT_Glyph glyph; + + + error = FT_Get_Glyph( face->glyph, &glyph ); + if ( !error ) + { + *aglyph = glyph; + goto Exit; + } + } + else + error = FT_THROW( Invalid_Argument ); + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_gnode_compare_faceid( FTC_Node ftcgnode, + FT_Pointer ftcface_id, + FTC_Cache cache, + FT_Bool* list_changed ) + { + FTC_GNode gnode = (FTC_GNode)ftcgnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FTC_BasicFamily family = (FTC_BasicFamily)gnode->family; + FT_Bool result; + + + if ( list_changed ) + *list_changed = FALSE; + result = FT_BOOL( family->attrs.scaler.face_id == face_id ); + if ( result ) + { + /* we must call this function to avoid this node from appearing + * in later lookups with the same face_id! + */ + FTC_GNode_UnselectFamily( gnode, cache ); + } + return result; + } + + + /* + * + * basic image cache + * + */ + + static + const FTC_IFamilyClassRec ftc_basic_image_family_class = + { + { + sizeof ( FTC_BasicFamilyRec ), + + ftc_basic_family_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_basic_family_init, /* FTC_MruNode_InitFunc node_init */ + NULL, /* FTC_MruNode_ResetFunc node_reset */ + NULL /* FTC_MruNode_DoneFunc node_done */ + }, + + ftc_basic_family_load_glyph /* FTC_IFamily_LoadGlyphFunc family_load_glyph */ + }; + + + static + const FTC_GCacheClassRec ftc_basic_image_cache_class = + { + { + ftc_inode_new, /* FTC_Node_NewFunc node_new */ + ftc_inode_weight, /* FTC_Node_WeightFunc node_weight */ + ftc_gnode_compare, /* FTC_Node_CompareFunc node_compare */ + ftc_basic_gnode_compare_faceid, /* FTC_Node_CompareFunc node_remove_faceid */ + ftc_inode_free, /* FTC_Node_FreeFunc node_free */ + + sizeof ( FTC_GCacheRec ), + ftc_gcache_init, /* FTC_Cache_InitFunc cache_init */ + ftc_gcache_done /* FTC_Cache_DoneFunc cache_done */ + }, + + (FTC_MruListClass)&ftc_basic_image_family_class + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_image_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_Error error; + FT_Offset hash; + + + /* some argument checks are delayed to `FTC_Cache_Lookup' */ + if ( !aglyph ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + + /* + * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt', + * but public `FT_ImageType->flags' is of type `FT_Int32'. + * + * On 16bit systems, higher bits of type->flags cannot be handled. + */ +#if 0xFFFFFFFFUL > FT_UINT_MAX + if ( (type->flags & (FT_ULong)FT_UINT_MAX) ) + FT_TRACE1(( "FTC_ImageCache_Lookup:" + " higher bits in load_flags 0x%lx are dropped\n", + (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) )); +#endif + + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = (FT_UInt)type->flags; + + query.attrs.scaler.pixel = 1; + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + ftc_gnode_compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, gindex, + FTC_GQUERY( &query ), + &node ); +#endif + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + } + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_Error error; + FT_Offset hash; + + + /* some argument checks are delayed to `FTC_Cache_Lookup' */ + if ( !aglyph || !scaler ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + + /* + * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt', + * but public `FT_Face->face_flags' is of type `FT_Long'. + * + * On long > int systems, higher bits of load_flags cannot be handled. + */ +#if FT_ULONG_MAX > FT_UINT_MAX + if ( load_flags > FT_UINT_MAX ) + FT_TRACE1(( "FTC_ImageCache_LookupScaler:" + " higher bits in load_flags 0x%lx are dropped\n", + load_flags & ~((FT_ULong)FT_UINT_MAX) )); +#endif + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = (FT_UInt)load_flags; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + ftc_gnode_compare, + hash, gindex, + &query, + node, + error ); + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + } + + Exit: + return error; + } + + + /* + * + * basic small bitmap cache + * + */ + + static + const FTC_SFamilyClassRec ftc_basic_sbit_family_class = + { + { + sizeof ( FTC_BasicFamilyRec ), + ftc_basic_family_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_basic_family_init, /* FTC_MruNode_InitFunc node_init */ + NULL, /* FTC_MruNode_ResetFunc node_reset */ + NULL /* FTC_MruNode_DoneFunc node_done */ + }, + + ftc_basic_family_get_count, + ftc_basic_family_load_bitmap + }; + + + static + const FTC_GCacheClassRec ftc_basic_sbit_cache_class = + { + { + ftc_snode_new, /* FTC_Node_NewFunc node_new */ + ftc_snode_weight, /* FTC_Node_WeightFunc node_weight */ + ftc_snode_compare, /* FTC_Node_CompareFunc node_compare */ + ftc_basic_gnode_compare_faceid, /* FTC_Node_CompareFunc node_remove_faceid */ + ftc_snode_free, /* FTC_Node_FreeFunc node_free */ + + sizeof ( FTC_GCacheRec ), + ftc_gcache_init, /* FTC_Cache_InitFunc cache_init */ + ftc_gcache_done /* FTC_Cache_DoneFunc cache_done */ + }, + + (FTC_MruListClass)&ftc_basic_sbit_family_class + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_Offset hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to `FTC_Cache_Lookup' */ + if ( !ansbit ) + return FT_THROW( Invalid_Argument ); + + *ansbit = NULL; + + /* + * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt', + * but public `FT_ImageType->flags' is of type `FT_Int32'. + * + * On 16bit systems, higher bits of type->flags cannot be handled. + */ +#if 0xFFFFFFFFUL > FT_UINT_MAX + if ( (type->flags & (FT_ULong)FT_UINT_MAX) ) + FT_TRACE1(( "FTC_ImageCache_Lookup:" + " higher bits in load_flags 0x%lx are dropped\n", + (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) )); +#endif + + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = (FT_UInt)type->flags; + + query.attrs.scaler.pixel = 1; + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + ftc_snode_compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, + gindex, + FTC_GQUERY( &query ), + &node ); +#endif + if ( error ) + goto Exit; + + *ansbit = FTC_SNODE( node )->sbits + + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_Offset hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to `FTC_Cache_Lookup' */ + if ( !ansbit || !scaler ) + return FT_THROW( Invalid_Argument ); + + *ansbit = NULL; + + /* + * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt', + * but public `FT_Face->face_flags' is of type `FT_Long'. + * + * On long > int systems, higher bits of load_flags cannot be handled. + */ +#if FT_ULONG_MAX > FT_UINT_MAX + if ( load_flags > FT_UINT_MAX ) + FT_TRACE1(( "FTC_ImageCache_LookupScaler:" + " higher bits in load_flags 0x%lx are dropped\n", + load_flags & ~((FT_ULong)FT_UINT_MAX) )); +#endif + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = (FT_UInt)load_flags; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + ftc_snode_compare, + hash, gindex, + &query, + node, + error ); + if ( error ) + goto Exit; + + *ansbit = FTC_SNODE( node )->sbits + + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + + Exit: + return error; + } + + +/* END */ diff --git a/external/freetype/src/cache/ftccache.c b/external/freetype/src/cache/ftccache.c new file mode 100644 index 000000000..e0698557b --- /dev/null +++ b/external/freetype/src/cache/ftccache.c @@ -0,0 +1,599 @@ +/**************************************************************************** + * + * ftccache.c + * + * The FreeType internal cache interface (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "ftcmanag.h" +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT cache + + +#define FTC_HASH_MAX_LOAD 2 +#define FTC_HASH_MIN_LOAD 1 +#define FTC_HASH_SUB_LOAD ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD ) + + /* this one _must_ be a power of 2! */ +#define FTC_HASH_INITIAL_SIZE 8 + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE NODE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* add a new node to the head of the manager's circular MRU list */ + static void + ftc_node_mru_link( FTC_Node node, + FTC_Manager manager ) + { + void *nl = &manager->nodes_list; + + + FTC_MruNode_Prepend( (FTC_MruNode*)nl, + (FTC_MruNode)node ); + manager->num_nodes++; + } + + + /* remove a node from the manager's MRU list */ + static void + ftc_node_mru_unlink( FTC_Node node, + FTC_Manager manager ) + { + void *nl = &manager->nodes_list; + + + FTC_MruNode_Remove( (FTC_MruNode*)nl, + (FTC_MruNode)node ); + manager->num_nodes--; + } + + +#ifndef FTC_INLINE + + /* move a node to the head of the manager's MRU list */ + static void + ftc_node_mru_up( FTC_Node node, + FTC_Manager manager ) + { + FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list, + (FTC_MruNode)node ); + } + + + /* get a top bucket for specified hash from cache, + * body for FTC_NODE_TOP_FOR_HASH( cache, hash ) + */ + FT_LOCAL_DEF( FTC_Node* ) + ftc_get_top_node_for_hash( FTC_Cache cache, + FT_Offset hash ) + { + FT_Offset idx; + + + idx = hash & cache->mask; + if ( idx >= cache->p ) + idx = hash & ( cache->mask >> 1 ); + + return cache->buckets + idx; + } + +#endif /* !FTC_INLINE */ + + + /* Note that this function cannot fail. If we cannot re-size the + * buckets array appropriately, we simply degrade the hash table's + * performance! + */ + static void + ftc_cache_resize( FTC_Cache cache ) + { + for (;;) + { + FTC_Node node, *pnode; + FT_UFast p = cache->p; + FT_UFast size = cache->mask + 1; /* available size */ + FT_UFast half = size >> 1; + + + /* do we need to expand the buckets array? */ + if ( cache->slack < 0 ) + { + FTC_Node new_list = NULL; + + + /* try to expand the buckets array _before_ splitting + * the bucket lists + */ + if ( p == size ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + /* if we can't expand the array, leave immediately */ + if ( FT_QRENEW_ARRAY( cache->buckets, size, size * 2 ) ) + break; + + cache->mask = 2 * size - 1; + half = size; + } + + /* the bucket to split */ + pnode = cache->buckets + p - half; + + for (;;) + { + node = *pnode; + if ( !node ) + break; + + if ( node->hash & half ) + { + *pnode = node->link; + node->link = new_list; + new_list = node; + } + else + pnode = &node->link; + } + + cache->buckets[p] = new_list; + + cache->slack += FTC_HASH_MAX_LOAD; + cache->p = p + 1; + + FT_TRACE2(( "ftc_cache_resize: cache %u increased to %u hashes\n", + cache->index, cache->p )); + } + + /* do we need to shrink the buckets array? */ + else if ( cache->slack > (FT_Long)p * FTC_HASH_SUB_LOAD ) + { + FTC_Node old_list = cache->buckets[--p]; + + + if ( p < FTC_HASH_INITIAL_SIZE ) + break; + + if ( p == half ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + /* if we can't shrink the array, leave immediately */ + if ( FT_QRENEW_ARRAY( cache->buckets, size, half ) ) + break; + + cache->mask = half - 1; + } + + /* the bucket to merge */ + pnode = cache->buckets + p - half; + + while ( *pnode ) + pnode = &(*pnode)->link; + + *pnode = old_list; + + cache->slack -= FTC_HASH_MAX_LOAD; + cache->p = p; + + FT_TRACE2(( "ftc_cache_resize: cache %u decreased to %u hashes\n", + cache->index, cache->p )); + } + + /* otherwise, the hash table is balanced */ + else + break; + } + } + + + /* remove a node from its cache's hash table */ + static void + ftc_node_hash_unlink( FTC_Node node0, + FTC_Cache cache ) + { + FTC_Node *pnode = FTC_NODE_TOP_FOR_HASH( cache, node0->hash ); + + + for (;;) + { + FTC_Node node = *pnode; + + + if ( !node ) + { + FT_TRACE0(( "ftc_node_hash_unlink: unknown node\n" )); + return; + } + + if ( node == node0 ) + break; + + pnode = &node->link; + } + + *pnode = node0->link; + node0->link = NULL; + + cache->slack++; + ftc_cache_resize( cache ); + } + + + /* add a node to the `top' of its cache's hash table */ + static void + ftc_node_hash_link( FTC_Node node, + FTC_Cache cache ) + { + FTC_Node *pnode = FTC_NODE_TOP_FOR_HASH( cache, node->hash ); + + + node->link = *pnode; + *pnode = node; + + cache->slack--; + ftc_cache_resize( cache ); + } + + + /* remove a node from the cache manager */ + FT_LOCAL_DEF( void ) + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ) + { + FTC_Cache cache; + + +#ifdef FT_DEBUG_ERROR + /* find node's cache */ + if ( node->cache_index >= manager->num_caches ) + { + FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + cache = manager->caches[node->cache_index]; + +#ifdef FT_DEBUG_ERROR + if ( !cache ) + { + FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + + /* remove node from mru list */ + ftc_node_mru_unlink( node, manager ); + + /* remove node from cache's hash table */ + ftc_node_hash_unlink( node, cache ); + + /* now finalize it */ + cache->clazz.node_free( node, cache ); + +#if 0 + /* check, just in case of general corruption :-) */ + if ( manager->num_nodes == 0 ) + FT_TRACE0(( "ftc_node_destroy: invalid cache node count (%u)\n", + manager->num_nodes )); +#endif + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ABSTRACT CACHE CLASS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + ftc_cache_init( FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + cache->p = FTC_HASH_INITIAL_SIZE; + cache->mask = FTC_HASH_INITIAL_SIZE - 1; + cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; + + FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE ); + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ) + { + return ftc_cache_init( cache ); + } + + + FT_LOCAL_DEF( void ) + ftc_cache_done( FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + + + if ( cache->buckets ) + { + FTC_Manager manager = cache->manager; + FT_UFast count = cache->p; + FT_UFast i; + + + for ( i = 0; i < count; i++ ) + { + FTC_Node node = cache->buckets[i], next; + + + while ( node ) + { + next = node->link; + node->link = NULL; + + /* remove node from mru list */ + ftc_node_mru_unlink( node, manager ); + + /* now finalize it */ + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + + cache->clazz.node_free( node, cache ); + node = next; + } + } + } + + FT_FREE( cache->buckets ); + + cache->p = 0; + cache->mask = 0; + cache->slack = 0; + } + + + FT_LOCAL_DEF( void ) + FTC_Cache_Done( FTC_Cache cache ) + { + ftc_cache_done( cache ); + } + + + static void + ftc_cache_add( FTC_Cache cache, + FT_Offset hash, + FTC_Node node ) + { + node->hash = hash; + node->cache_index = (FT_UShort)cache->index; + node->ref_count = 0; + + ftc_node_hash_link( node, cache ); + ftc_node_mru_link( node, cache->manager ); + + { + FTC_Manager manager = cache->manager; + + + manager->cur_weight += cache->clazz.node_weight( node, cache ); + + if ( manager->cur_weight >= manager->max_weight ) + { + node->ref_count++; + FTC_Manager_Compress( manager ); + node->ref_count--; + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_Offset hash, + FT_Pointer query, + FTC_Node *anode ) + { + FT_Error error; + FTC_Node node; + + + /* + * We use the FTC_CACHE_TRYLOOP macros to support out-of-memory + * errors (OOM) correctly, i.e., by flushing the cache progressively + * in order to make more room. + */ + + FTC_CACHE_TRYLOOP( cache ) + { + error = cache->clazz.node_new( &node, query, cache ); + } + FTC_CACHE_TRYLOOP_END( NULL ) + + if ( error ) + node = NULL; + else + { + /* don't assume that the cache has the same number of buckets, since + * our allocation request might have triggered global cache flushing + */ + ftc_cache_add( cache, hash, node ); + } + + *anode = node; + return error; + } + + +#ifndef FTC_INLINE + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_Offset hash, + FT_Pointer query, + FTC_Node *anode ) + { + FTC_Node* bucket; + FTC_Node* pnode; + FTC_Node node; + FT_Error error = FT_Err_Ok; + FT_Bool list_changed = FALSE; + + FTC_Node_CompareFunc compare = cache->clazz.node_compare; + + + if ( !cache || !anode ) + return FT_THROW( Invalid_Argument ); + + /* Go to the `top' node of the list sharing same masked hash */ + bucket = pnode = FTC_NODE_TOP_FOR_HASH( cache, hash ); + + /* Lookup a node with exactly same hash and queried properties. */ + /* NOTE: _nodcomp() may change the linked list to reduce memory. */ + for (;;) + { + node = *pnode; + if ( !node ) + goto NewNode; + + if ( node->hash == hash && + compare( node, query, cache, &list_changed ) ) + break; + + pnode = &node->link; + } + + if ( list_changed ) + { + /* Update bucket by modified linked list */ + bucket = pnode = FTC_NODE_TOP_FOR_HASH( cache, hash ); + + /* Update pnode by modified linked list */ + while ( *pnode != node ) + { + if ( !*pnode ) + { + FT_ERROR(( "FTC_Cache_Lookup: oops!!! node missing\n" )); + goto NewNode; + } + else + pnode = &(*pnode)->link; + } + } + + /* Reorder the list to move the found node to the `top' */ + if ( node != *bucket ) + { + *pnode = node->link; + node->link = *bucket; + *bucket = node; + } + + /* move to head of MRU list */ + { + FTC_Manager manager = cache->manager; + + + if ( node != manager->nodes_list ) + ftc_node_mru_up( node, manager ); + } + *anode = node; + + return error; + + NewNode: + return FTC_Cache_NewNode( cache, hash, query, anode ); + } + +#endif /* !FTC_INLINE */ + + + FT_LOCAL_DEF( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ) + { + FTC_Manager manager = cache->manager; + FTC_Node frees = NULL; + FT_UFast count = cache->p; + FT_UFast i; + + + for ( i = 0; i < count; i++ ) + { + FTC_Node* pnode = cache->buckets + i; + + + for (;;) + { + FTC_Node node = *pnode; + FT_Bool list_changed = FALSE; + + + if ( !node ) + break; + + if ( cache->clazz.node_remove_faceid( node, face_id, + cache, &list_changed ) ) + { + *pnode = node->link; + node->link = frees; + frees = node; + } + else + pnode = &node->link; + } + } + + /* remove all nodes in the free list */ + while ( frees ) + { + FTC_Node node; + + + node = frees; + frees = node->link; + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + ftc_node_mru_unlink( node, manager ); + + cache->clazz.node_free( node, cache ); + + cache->slack++; + } + + ftc_cache_resize( cache ); + } + + +/* END */ diff --git a/external/freetype/src/cache/ftccache.h b/external/freetype/src/cache/ftccache.h new file mode 100644 index 000000000..850d2554b --- /dev/null +++ b/external/freetype/src/cache/ftccache.h @@ -0,0 +1,355 @@ +/**************************************************************************** + * + * ftccache.h + * + * FreeType internal cache interface (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCCACHE_H_ +#define FTCCACHE_H_ + +#include <freetype/internal/compiler-macros.h> +#include "ftcmru.h" + +FT_BEGIN_HEADER + +#define FTC_FACE_ID_HASH( i ) \ + ( ( (FT_Offset)(i) >> 3 ) ^ ( (FT_Offset)(i) << 7 ) ) + + /* handle to cache object */ + typedef struct FTC_CacheRec_* FTC_Cache; + + /* handle to cache class */ + typedef const struct FTC_CacheClassRec_* FTC_CacheClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE NODE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * Each cache controls one or more cache nodes. Each node is part of + * the global_lru list of the manager. Its `data' field however is used + * as a reference count for now. + * + * A node can be anything, depending on the type of information held by + * the cache. It can be an individual glyph image, a set of bitmaps + * glyphs for a given size, some metrics, etc. + * + */ + + /* structure size should be 20 bytes on 32-bits machines */ + typedef struct FTC_NodeRec_ + { + FTC_MruNodeRec mru; /* circular mru list pointer */ + FTC_Node link; /* used for hashing */ + FT_Offset hash; /* used for hashing too */ + FT_UShort cache_index; /* index of cache the node belongs to */ + FT_Short ref_count; /* reference count for this node */ + + } FTC_NodeRec; + + +#define FTC_NODE( x ) ( (FTC_Node)(x) ) +#define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) + +#define FTC_NODE_NEXT( x ) FTC_NODE( (x)->mru.next ) +#define FTC_NODE_PREV( x ) FTC_NODE( (x)->mru.prev ) + + /* address the hash table entries */ +#ifdef FTC_INLINE +#define FTC_NODE_TOP_FOR_HASH( cache, hash ) \ + ( ( cache )->buckets + \ + ( ( ( ( hash ) & ( cache )->mask ) >= ( cache )->p ) \ + ? ( ( hash ) & ( ( cache )->mask >> 1 ) ) \ + : ( ( hash ) & ( cache )->mask ) ) ) +#else + FT_LOCAL( FTC_Node* ) + ftc_get_top_node_for_hash( FTC_Cache cache, + FT_Offset hash ); +#define FTC_NODE_TOP_FOR_HASH( cache, hash ) \ + ftc_get_top_node_for_hash( ( cache ), ( hash ) ) +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* initialize a new cache node */ + typedef FT_Error + (*FTC_Node_NewFunc)( FTC_Node *pnode, + FT_Pointer query, + FTC_Cache cache ); + + typedef FT_Offset + (*FTC_Node_WeightFunc)( FTC_Node node, + FTC_Cache cache ); + + /* compare a node to a given key pair */ + typedef FT_Bool + (*FTC_Node_CompareFunc)( FTC_Node node, + FT_Pointer key, + FTC_Cache cache, + FT_Bool* list_changed ); + + + typedef void + (*FTC_Node_FreeFunc)( FTC_Node node, + FTC_Cache cache ); + + typedef FT_Error + (*FTC_Cache_InitFunc)( FTC_Cache cache ); + + typedef void + (*FTC_Cache_DoneFunc)( FTC_Cache cache ); + + + typedef struct FTC_CacheClassRec_ + { + FTC_Node_NewFunc node_new; + FTC_Node_WeightFunc node_weight; + FTC_Node_CompareFunc node_compare; + FTC_Node_CompareFunc node_remove_faceid; + FTC_Node_FreeFunc node_free; + + FT_Offset cache_size; + FTC_Cache_InitFunc cache_init; + FTC_Cache_DoneFunc cache_done; + + } FTC_CacheClassRec; + + + /* each cache really implements a hash table to manage its nodes */ + /* the number of the table entries (buckets) can change dynamically */ + /* each bucket contains a linked lists of nodes for a given hash */ + typedef struct FTC_CacheRec_ + { + FT_UFast p; /* hash table counter */ + FT_UFast mask; /* hash table index range */ + FT_Long slack; + FTC_Node* buckets; + + FTC_CacheClassRec clazz; /* local copy, for speed */ + + FTC_Manager manager; + FT_Memory memory; + FT_UInt index; /* in manager's table */ + + FTC_CacheClass org_class; /* original class pointer */ + + } FTC_CacheRec; + + +#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) +#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) + + + /* default cache initialize */ + FT_LOCAL( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ); + + /* default cache finalizer */ + FT_LOCAL( void ) + FTC_Cache_Done( FTC_Cache cache ); + + /* Call this function to look up the cache. If no corresponding + * node is found, a new one is automatically created. This function + * is capable of flushing the cache adequately to make room for the + * new cache object. + */ + +#ifndef FTC_INLINE + FT_LOCAL( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_Offset hash, + FT_Pointer query, + FTC_Node *anode ); +#endif + + FT_LOCAL( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_Offset hash, + FT_Pointer query, + FTC_Node *anode ); + + /* Remove all nodes that relate to a given face_id. This is useful + * when un-installing fonts. Note that if a cache node relates to + * the face_id but is locked (i.e., has `ref_count > 0'), the node + * will _not_ be destroyed, but its internal face_id reference will + * be modified. + * + * The final result will be that the node will never come back + * in further lookup requests, and will be flushed on demand from + * the cache normally when its reference count reaches 0. + */ + FT_LOCAL( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ); + + +#ifdef FTC_INLINE + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_Node *_bucket, *_pnode, _node; \ + FTC_Cache _cache = FTC_CACHE( cache ); \ + FT_Offset _hash = (FT_Offset)(hash); \ + FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ + FT_Bool _list_changed = FALSE; \ + \ + \ + error = FT_Err_Ok; \ + node = NULL; \ + \ + /* Go to the `top' node of the list sharing same masked hash */ \ + _bucket = _pnode = FTC_NODE_TOP_FOR_HASH( _cache, _hash ); \ + \ + /* Look up a node with identical hash and queried properties. */ \ + /* NOTE: _nodcomp() may change the linked list to reduce memory. */ \ + for (;;) \ + { \ + _node = *_pnode; \ + if ( !_node ) \ + goto NewNode_; \ + \ + if ( _node->hash == _hash && \ + _nodcomp( _node, query, _cache, &_list_changed ) ) \ + break; \ + \ + _pnode = &_node->link; \ + } \ + \ + if ( _list_changed ) \ + { \ + /* Update _bucket by possibly modified linked list */ \ + _bucket = _pnode = FTC_NODE_TOP_FOR_HASH( _cache, _hash ); \ + \ + /* Update _pnode by possibly modified linked list */ \ + while ( *_pnode != _node ) \ + { \ + if ( !*_pnode ) \ + { \ + FT_ERROR(( "FTC_CACHE_LOOKUP_CMP: oops!!! node missing\n" )); \ + goto NewNode_; \ + } \ + else \ + _pnode = &(*_pnode)->link; \ + } \ + } \ + \ + /* Reorder the list to move the found node to the `top' */ \ + if ( _node != *_bucket ) \ + { \ + *_pnode = _node->link; \ + _node->link = *_bucket; \ + *_bucket = _node; \ + } \ + \ + /* Update MRU list */ \ + { \ + FTC_Manager _manager = _cache->manager; \ + void* _nl = &_manager->nodes_list; \ + \ + \ + if ( _node != _manager->nodes_list ) \ + FTC_MruNode_Up( (FTC_MruNode*)_nl, \ + (FTC_MruNode)_node ); \ + } \ + goto Ok_; \ + \ + NewNode_: \ + error = FTC_Cache_NewNode( _cache, _hash, query, &_node ); \ + \ + Ok_: \ + node = _node; \ + FT_END_STMNT + +#else /* !FTC_INLINE */ + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, \ + (FTC_Node*)&(node) ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + + /* + * This macro, together with FTC_CACHE_TRYLOOP_END, defines a retry + * loop to flush the cache repeatedly in case of memory overflows. + * + * It is used when creating a new cache node, or within a lookup + * that needs to allocate data (e.g. the sbit cache lookup). + * + * Example: + * + * { + * FTC_CACHE_TRYLOOP( cache ) + * error = load_data( ... ); + * FTC_CACHE_TRYLOOP_END() + * } + * + */ +#define FTC_CACHE_TRYLOOP( cache ) \ + { \ + FTC_Manager _try_manager = FTC_CACHE( cache )->manager; \ + FT_UInt _try_count = 4; \ + \ + \ + for (;;) \ + { \ + FT_UInt _try_done; + + +#define FTC_CACHE_TRYLOOP_END( list_changed ) \ + if ( !error || FT_ERR_NEQ( error, Out_Of_Memory ) ) \ + break; \ + \ + _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \ + if ( _try_done > 0 && list_changed != NULL ) \ + *(FT_Bool*)( list_changed ) = TRUE; \ + \ + if ( _try_done == 0 ) \ + break; \ + \ + if ( _try_done == _try_count ) \ + { \ + _try_count *= 2; \ + if ( _try_count < _try_done || \ + _try_count > _try_manager->num_nodes ) \ + _try_count = _try_manager->num_nodes; \ + } \ + } \ + } + + /* */ + +FT_END_HEADER + + +#endif /* FTCCACHE_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftccback.h b/external/freetype/src/cache/ftccback.h new file mode 100644 index 000000000..5f9db213a --- /dev/null +++ b/external/freetype/src/cache/ftccback.h @@ -0,0 +1,93 @@ +/**************************************************************************** + * + * ftccback.h + * + * Callback functions of the caching sub-system (specification only). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTCCBACK_H_ +#define FTCCBACK_H_ + +#include <freetype/ftcache.h> +#include "ftcmru.h" +#include "ftcimage.h" +#include "ftcmanag.h" +#include "ftcglyph.h" +#include "ftcsbits.h" + +FT_BEGIN_HEADER + + FT_LOCAL( void ) + ftc_inode_free( FTC_Node inode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_inode_new( FTC_Node *pinode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_Offset ) + ftc_inode_weight( FTC_Node inode, + FTC_Cache cache ); + + + FT_LOCAL( void ) + ftc_snode_free( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_snode_new( FTC_Node *psnode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_Offset ) + ftc_snode_weight( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Bool ) + ftc_snode_compare( FTC_Node snode, + FT_Pointer gquery, + FTC_Cache cache, + FT_Bool* list_changed ); + + + FT_LOCAL( FT_Bool ) + ftc_gnode_compare( FTC_Node gnode, + FT_Pointer gquery, + FTC_Cache cache, + FT_Bool* list_changed ); + + + FT_LOCAL( FT_Error ) + ftc_gcache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_gcache_done( FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_cache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_cache_done( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ); + +FT_END_HEADER + +#endif /* FTCCBACK_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftccmap.c b/external/freetype/src/cache/ftccmap.c new file mode 100644 index 000000000..84f22a667 --- /dev/null +++ b/external/freetype/src/cache/ftccmap.c @@ -0,0 +1,323 @@ +/**************************************************************************** + * + * ftccmap.c + * + * FreeType CharMap cache (body) + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/ftcache.h> +#include "ftcmanag.h" +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT cache + + + /************************************************************************** + * + * Each FTC_CMapNode contains a simple array to map a range of character + * codes to equivalent glyph indices. + * + * For now, the implementation is very basic: Each node maps a range of + * 128 consecutive character codes to their corresponding glyph indices. + * + * We could do more complex things, but I don't think it is really very + * useful. + * + */ + + + /* number of glyph indices / character code per node */ +#define FTC_CMAP_INDICES_MAX 128 + + /* compute a query/node hash */ +#define FTC_CMAP_HASH( faceid, index, charcode ) \ + ( FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \ + ( (charcode) / FTC_CMAP_INDICES_MAX ) ) + + /* the charmap query */ + typedef struct FTC_CMapQueryRec_ + { + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 char_code; + + } FTC_CMapQueryRec, *FTC_CMapQuery; + +#define FTC_CMAP_QUERY( x ) ((FTC_CMapQuery)(x)) + + /* the cmap cache node */ + typedef struct FTC_CMapNodeRec_ + { + FTC_NodeRec node; + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 first; /* first character in node */ + FT_UInt16 indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices */ + + } FTC_CMapNodeRec, *FTC_CMapNode; + +#define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) ) + + /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */ + /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet */ +#define FTC_CMAP_UNKNOWN (FT_UInt16)~0 + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHARMAP NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( void ) + ftc_cmap_node_free( FTC_Node ftcnode, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FT_Memory memory = cache->memory; + + + FT_FREE( node ); + } + + + /* initialize a new cmap node */ + FT_CALLBACK_DEF( FT_Error ) + ftc_cmap_node_new( FTC_Node *ftcanode, + FT_Pointer ftcquery, + FTC_Cache cache ) + { + FTC_CMapNode *anode = (FTC_CMapNode*)ftcanode; + FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; + FT_Error error; + FT_Memory memory = cache->memory; + FTC_CMapNode node = NULL; + FT_UInt nn; + + + if ( !FT_QNEW( node ) ) + { + node->face_id = query->face_id; + node->cmap_index = query->cmap_index; + node->first = (query->char_code / FTC_CMAP_INDICES_MAX) * + FTC_CMAP_INDICES_MAX; + + for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ ) + node->indices[nn] = FTC_CMAP_UNKNOWN; + } + + *anode = node; + return error; + } + + + /* compute the weight of a given cmap node */ + FT_CALLBACK_DEF( FT_Offset ) + ftc_cmap_node_weight( FTC_Node cnode, + FTC_Cache cache ) + { + FT_UNUSED( cnode ); + FT_UNUSED( cache ); + + return sizeof ( *cnode ); + } + + + /* compare a cmap node to a given query */ + FT_CALLBACK_DEF( FT_Bool ) + ftc_cmap_node_compare( FTC_Node ftcnode, + FT_Pointer ftcquery, + FTC_Cache cache, + FT_Bool* list_changed ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; + FT_UNUSED( cache ); + + + if ( list_changed ) + *list_changed = FALSE; + if ( node->face_id == query->face_id && + node->cmap_index == query->cmap_index ) + { + FT_UInt32 offset = (FT_UInt32)( query->char_code - node->first ); + + + return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); + } + + return 0; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_cmap_node_remove_faceid( FTC_Node ftcnode, + FT_Pointer ftcface_id, + FTC_Cache cache, + FT_Bool* list_changed ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FT_UNUSED( cache ); + + + if ( list_changed ) + *list_changed = FALSE; + return FT_BOOL( node->face_id == face_id ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE CACHE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static + const FTC_CacheClassRec ftc_cmap_cache_class = + { + ftc_cmap_node_new, /* FTC_Node_NewFunc node_new */ + ftc_cmap_node_weight, /* FTC_Node_WeightFunc node_weight */ + ftc_cmap_node_compare, /* FTC_Node_CompareFunc node_compare */ + ftc_cmap_node_remove_faceid, /* FTC_Node_CompareFunc node_remove_faceid */ + ftc_cmap_node_free, /* FTC_Node_FreeFunc node_free */ + + sizeof ( FTC_CacheRec ), + ftc_cache_init, /* FTC_Cache_InitFunc cache_init */ + ftc_cache_done, /* FTC_Cache_DoneFunc cache_done */ + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ) + { + return FTC_Manager_RegisterCache( manager, + &ftc_cmap_cache_class, + FTC_CACHE_P( acache ) ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cmap_cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ) + { + FTC_Cache cache = FTC_CACHE( cmap_cache ); + FTC_CMapQueryRec query; + FTC_Node node; + FT_Error error; + FT_UInt gindex = 0; + FT_Offset hash; + FT_Int no_cmap_change = 0; + + + if ( cmap_index < 0 ) + { + /* Treat a negative cmap index as a special value, meaning that you */ + /* don't want to change the FT_Face's character map through this */ + /* call. This can be useful if the face requester callback already */ + /* sets the face's charmap to the appropriate value. */ + + no_cmap_change = 1; + cmap_index = 0; + } + + if ( !cache ) + { + FT_TRACE0(( "FTC_CMapCache_Lookup: bad arguments, returning 0\n" )); + return 0; + } + + query.face_id = face_id; + query.cmap_index = (FT_UInt)cmap_index; + query.char_code = char_code; + + hash = FTC_CMAP_HASH( face_id, (FT_UInt)cmap_index, char_code ); + +#if 1 + FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query, + node, error ); +#else + error = FTC_Cache_Lookup( cache, hash, &query, &node ); +#endif + if ( error ) + goto Exit; + + FT_ASSERT( char_code - FTC_CMAP_NODE( node )->first < + FTC_CMAP_INDICES_MAX ); + + /* something rotten can happen with rogue clients */ + if ( char_code - FTC_CMAP_NODE( node )->first >= FTC_CMAP_INDICES_MAX ) + return 0; /* XXX: should return appropriate error */ + + gindex = FTC_CMAP_NODE( node )->indices[char_code - + FTC_CMAP_NODE( node )->first]; + if ( gindex == FTC_CMAP_UNKNOWN ) + { + FT_Face face; + + + gindex = 0; + + error = FTC_Manager_LookupFace( cache->manager, + FTC_CMAP_NODE( node )->face_id, + &face ); + if ( error ) + goto Exit; + + if ( cmap_index < face->num_charmaps ) + { + FT_CharMap old = face->charmap; + FT_CharMap cmap = face->charmaps[cmap_index]; + + + if ( !no_cmap_change ) + face->charmap = cmap; + + gindex = FT_Get_Char_Index( face, char_code ); + + if ( !no_cmap_change ) + face->charmap = old; + } + + FTC_CMAP_NODE( node )->indices[char_code - + FTC_CMAP_NODE( node )->first] + = (FT_UShort)gindex; + } + + Exit: + return gindex; + } + + +/* END */ diff --git a/external/freetype/src/cache/ftcerror.h b/external/freetype/src/cache/ftcerror.h new file mode 100644 index 000000000..dc1a62013 --- /dev/null +++ b/external/freetype/src/cache/ftcerror.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * ftcerror.h + * + * Caching sub-system error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the caching sub-system error enumeration + * constants. + * + */ + +#ifndef FTCERROR_H_ +#define FTCERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX FTC_Err_ +#define FT_ERR_BASE FT_Mod_Err_Cache + +#include <freetype/fterrors.h> + +#endif /* FTCERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcglyph.c b/external/freetype/src/cache/ftcglyph.c new file mode 100644 index 000000000..d344733f3 --- /dev/null +++ b/external/freetype/src/cache/ftcglyph.c @@ -0,0 +1,204 @@ +/**************************************************************************** + * + * ftcglyph.c + * + * FreeType Glyph Image (FT_Glyph) cache (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/ftcache.h> +#include "ftcglyph.h" +#include <freetype/fterrors.h> + +#include "ftccback.h" +#include "ftcerror.h" + + + /* create a new chunk node, setting its cache index and ref count */ + FT_LOCAL_DEF( void ) + FTC_GNode_Init( FTC_GNode gnode, + FT_UInt gindex, + FTC_Family family ) + { + gnode->family = family; + gnode->gindex = gindex; + family->num_nodes++; + } + + + FT_LOCAL_DEF( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ) + { + FTC_Family family = gnode->family; + + + gnode->family = NULL; + if ( family && --family->num_nodes == 0 ) + FTC_FAMILY_FREE( family, cache ); + } + + + FT_LOCAL_DEF( void ) + FTC_GNode_Done( FTC_GNode gnode, + FTC_Cache cache ) + { + /* finalize the node */ + gnode->gindex = 0; + + FTC_GNode_UnselectFamily( gnode, cache ); + } + + + FT_LOCAL_DEF( FT_Bool ) + ftc_gnode_compare( FTC_Node ftcgnode, + FT_Pointer ftcgquery, + FTC_Cache cache, + FT_Bool* list_changed ) + { + FTC_GNode gnode = (FTC_GNode)ftcgnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + FT_UNUSED( cache ); + + + if ( list_changed ) + *list_changed = FALSE; + return FT_BOOL( gnode->family == gquery->family && + gnode->gindex == gquery->gindex ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHUNK SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ) + { + FTC_GCacheClass clazz = FTC_CACHE_GCACHE_CLASS( cache ); + + + family->clazz = clazz->family_class; + family->num_nodes = 0; + family->cache = cache; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_gcache_init( FTC_Cache cache ) + { + FTC_GCache gcache = (FTC_GCache)cache; + FT_Error error; + + + error = FTC_Cache_Init( cache ); + if ( !error ) + { + FTC_GCacheClass clazz = (FTC_GCacheClass)cache->org_class; + + FTC_MruList_Init( &gcache->families, + clazz->family_class, + 0, /* no maximum here! */ + cache, + cache->memory ); + } + + return error; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_Init( FTC_GCache gcache ) + { + return ftc_gcache_init( FTC_CACHE( gcache ) ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ftc_gcache_done( FTC_Cache cache ) + { + FTC_GCache gcache = (FTC_GCache)cache; + + + FTC_Cache_Done( cache ); + FTC_MruList_Done( &gcache->families ); + } + + +#if 0 + + FT_LOCAL_DEF( void ) + FTC_GCache_Done( FTC_GCache gcache ) + { + ftc_gcache_done( FTC_CACHE( gcache ) ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ) + { + return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, + (FTC_Cache*)acache ); + } + + +#ifndef FTC_INLINE + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_Lookup( FTC_GCache gcache, + FT_Offset hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ) + { + FT_Error error; + + + query->gindex = gindex; + + FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); + if ( !error ) + { + FTC_Family family = query->family; + + + /* prevent the family from being destroyed too early when an */ + /* out-of-memory condition occurs during glyph node initialization. */ + family->num_nodes++; + + error = FTC_Cache_Lookup( FTC_CACHE( gcache ), hash, query, anode ); + + if ( --family->num_nodes == 0 ) + FTC_FAMILY_FREE( family, cache ); + } + return error; + } + +#endif /* !FTC_INLINE */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcglyph.h b/external/freetype/src/cache/ftcglyph.h new file mode 100644 index 000000000..0181e9816 --- /dev/null +++ b/external/freetype/src/cache/ftcglyph.h @@ -0,0 +1,315 @@ +/**************************************************************************** + * + * ftcglyph.h + * + * FreeType abstract glyph cache (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* + * + * FTC_GCache is an _abstract_ cache object optimized to store glyph + * data. It works as follows: + * + * - It manages FTC_GNode objects. Each one of them can hold one or more + * glyph `items'. Item types are not specified in the FTC_GCache but + * in classes that extend it. + * + * - Glyph attributes, like face ID, character size, render mode, etc., + * can be grouped into abstract `glyph families'. This avoids storing + * the attributes within the FTC_GCache, since it is likely that many + * FTC_GNodes will belong to the same family in typical uses. + * + * - Each FTC_GNode is thus an FTC_Node with two additional fields: + * + * * gindex: A glyph index, or the first index in a glyph range. + * * family: A pointer to a glyph `family'. + * + * - Family types are not fully specific in the FTC_Family type, but + * by classes that extend it. + * + * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache. + * They share an FTC_Family sub-class called FTC_BasicFamily which is + * used to store the following data: face ID, pixel/point sizes, load + * flags. For more details see the file `src/cache/ftcbasic.c'. + * + * Client applications can extend FTC_GNode with their own FTC_GNode + * and FTC_Family sub-classes to implement more complex caches (e.g., + * handling automatic synthesis, like obliquing & emboldening, colored + * glyphs, etc.). + * + * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and + * `ftcsbits.h', which both extend FTC_GCache with additional + * optimizations. + * + * A typical FTC_GCache implementation must provide at least the + * following: + * + * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: + * my_node_new (must call FTC_GNode_Init) + * my_node_free (must call FTC_GNode_Done) + * my_node_compare (must call ftc_gnode_compare) + * my_node_remove_faceid (must call ftc_gnode_unselect in case + * of match) + * + * - FTC_Family sub-class, e.g. MyFamily, with relevant methods: + * my_family_compare + * my_family_init + * my_family_reset (optional) + * my_family_done + * + * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query + * data. + * + * - Constant structures for a FTC_GNodeClass. + * + * - MyCacheNew() can be implemented easily as a call to the convenience + * function FTC_GCache_New. + * + * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will + * automatically: + * + * - Search for the corresponding family in the cache, or create + * a new one if necessary. Put it in FTC_GQUERY(myquery).family + * + * - Call FTC_Cache_Lookup. + * + * If it returns NULL, you should create a new node, then call + * ftc_cache_add as usual. + */ + + + /************************************************************************** + * + * Important: The functions defined in this file are only used to + * implement an abstract glyph cache class. You need to + * provide additional logic to implement a complete cache. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef FTCGLYPH_H_ +#define FTCGLYPH_H_ + + +#include "ftcmanag.h" + + +FT_BEGIN_HEADER + + + /* + * We can group glyphs into `families'. Each family correspond to a + * given face ID, character size, transform, etc. + * + * Families are implemented as MRU list nodes. They are + * reference-counted. + */ + + typedef struct FTC_FamilyRec_ + { + FTC_MruNodeRec mrunode; + FT_UInt num_nodes; /* current number of nodes in this family */ + FTC_Cache cache; + FTC_MruListClass clazz; + + } FTC_FamilyRec, *FTC_Family; + +#define FTC_FAMILY( x ) ( (FTC_Family)(x) ) +#define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) ) + + + typedef struct FTC_GNodeRec_ + { + FTC_NodeRec node; + FTC_Family family; + FT_UInt gindex; + + } FTC_GNodeRec, *FTC_GNode; + +#define FTC_GNODE( x ) ( (FTC_GNode)(x) ) +#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) ) + + + typedef struct FTC_GQueryRec_ + { + FT_UInt gindex; + FTC_Family family; + + } FTC_GQueryRec, *FTC_GQuery; + +#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) ) + + + /************************************************************************** + * + * These functions are exported so that they can be called from + * user-provided cache classes; otherwise, they are really part of the + * cache sub-system internals. + */ + + /* must be called by derived FTC_Node_InitFunc routines */ + FT_LOCAL( void ) + FTC_GNode_Init( FTC_GNode node, + FT_UInt gindex, /* glyph index for node */ + FTC_Family family ); + + /* call this function to clear a node's family -- this is necessary */ + /* to implement the `node_remove_faceid' cache method correctly */ + FT_LOCAL( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ); + + /* must be called by derived FTC_Node_DoneFunc routines */ + FT_LOCAL( void ) + FTC_GNode_Done( FTC_GNode node, + FTC_Cache cache ); + + + FT_LOCAL( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ); + + typedef struct FTC_GCacheRec_ + { + FTC_CacheRec cache; + FTC_MruListRec families; + + } FTC_GCacheRec, *FTC_GCache; + +#define FTC_GCACHE( x ) ((FTC_GCache)(x)) + + +#if 0 + /* can be used as @FTC_Cache_InitFunc */ + FT_LOCAL( FT_Error ) + FTC_GCache_Init( FTC_GCache cache ); +#endif + + +#if 0 + /* can be used as @FTC_Cache_DoneFunc */ + FT_LOCAL( void ) + FTC_GCache_Done( FTC_GCache cache ); +#endif + + + /* the glyph cache class adds fields for the family implementation */ + typedef struct FTC_GCacheClassRec_ + { + FTC_CacheClassRec clazz; + FTC_MruListClass family_class; + + } FTC_GCacheClassRec; + + typedef const FTC_GCacheClassRec* FTC_GCacheClass; + +#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) + +#define FTC_CACHE_GCACHE_CLASS( x ) \ + FTC_GCACHE_CLASS( FTC_CACHE( x )->org_class ) +#define FTC_CACHE_FAMILY_CLASS( x ) \ + ( (FTC_MruListClass)FTC_CACHE_GCACHE_CLASS( x )->family_class ) + + + /* convenience function; use it instead of FTC_Manager_Register_Cache */ + FT_LOCAL( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ); + +#ifndef FTC_INLINE + FT_LOCAL( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_Offset hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ); +#endif + + + /* */ + + +#define FTC_FAMILY_FREE( family, cache ) \ + FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \ + (FTC_MruNode)(family) ) + + +#ifdef FTC_INLINE + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_GCache _gcache = FTC_GCACHE( cache ); \ + FTC_GQuery _gquery = (FTC_GQuery)( query ); \ + FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \ + FTC_MruNode _mrunode; \ + \ + \ + _gquery->gindex = (gindex); \ + \ + FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ + _mrunode, error ); \ + _gquery->family = FTC_FAMILY( _mrunode ); \ + if ( !error ) \ + { \ + FTC_Family _gqfamily = _gquery->family; \ + \ + \ + _gqfamily->num_nodes++; \ + \ + FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \ + \ + if ( --_gqfamily->num_nodes == 0 ) \ + FTC_FAMILY_FREE( _gqfamily, _gcache ); \ + } \ + FT_END_STMNT + /* */ + +#else /* !FTC_INLINE */ + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + \ + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ + FTC_GQUERY( query ), &node ); \ + \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + +FT_END_HEADER + + +#endif /* FTCGLYPH_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcimage.c b/external/freetype/src/cache/ftcimage.c new file mode 100644 index 000000000..428e5e1a7 --- /dev/null +++ b/external/freetype/src/cache/ftcimage.c @@ -0,0 +1,164 @@ +/**************************************************************************** + * + * ftcimage.c + * + * FreeType Image cache (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftcache.h> +#include "ftcimage.h" +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftobjs.h> + +#include "ftccback.h" +#include "ftcerror.h" + + + /* finalize a given glyph image node */ + FT_LOCAL_DEF( void ) + ftc_inode_free( FTC_Node ftcinode, + FTC_Cache cache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_Memory memory = cache->memory; + + + if ( inode->glyph ) + { + FT_Done_Glyph( inode->glyph ); + inode->glyph = NULL; + } + + FTC_GNode_Done( FTC_GNODE( inode ), cache ); + FT_FREE( inode ); + } + + + FT_LOCAL_DEF( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ) + { + ftc_inode_free( FTC_NODE( inode ), cache ); + } + + + /* initialize a new glyph image node */ + FT_LOCAL_DEF( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + FTC_INode inode = NULL; + + + if ( !FT_QNEW( inode ) ) + { + FTC_GNode gnode = FTC_GNODE( inode ); + FTC_Family family = gquery->family; + FT_UInt gindex = gquery->gindex; + FTC_IFamilyClass clazz = FTC_CACHE_IFAMILY_CLASS( cache ); + + + /* initialize its inner fields */ + FTC_GNode_Init( gnode, gindex, family ); + inode->glyph = NULL; + + /* we will now load the glyph image */ + error = clazz->family_load_glyph( family, gindex, cache, + &inode->glyph ); + if ( error ) + { + FTC_INode_Free( inode, cache ); + inode = NULL; + } + } + + *pinode = inode; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_inode_new( FTC_Node *ftcpinode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_INode *pinode = (FTC_INode*)ftcpinode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + + + return FTC_INode_New( pinode, gquery, cache ); + } + + + FT_LOCAL_DEF( FT_Offset ) + ftc_inode_weight( FTC_Node ftcinode, + FTC_Cache ftccache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_Offset size = 0; + FT_Glyph glyph = inode->glyph; + + FT_UNUSED( ftccache ); + + + switch ( glyph->format ) + { + case FT_GLYPH_FORMAT_BITMAP: + { + FT_BitmapGlyph bitg; + + + bitg = (FT_BitmapGlyph)glyph; + size = bitg->bitmap.rows * (FT_Offset)FT_ABS( bitg->bitmap.pitch ) + + sizeof ( *bitg ); + } + break; + + case FT_GLYPH_FORMAT_OUTLINE: + { + FT_OutlineGlyph outg; + + + outg = (FT_OutlineGlyph)glyph; + size = (FT_Offset)outg->outline.n_points * + ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) + + (FT_Offset)outg->outline.n_contours * sizeof ( FT_Short ) + + sizeof ( *outg ); + } + break; + + default: + ; + } + + size += sizeof ( *inode ); + return size; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Offset ) + FTC_INode_Weight( FTC_INode inode ) + { + return ftc_inode_weight( FTC_NODE( inode ), NULL ); + } + +#endif /* 0 */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcimage.h b/external/freetype/src/cache/ftcimage.h new file mode 100644 index 000000000..d2a807f15 --- /dev/null +++ b/external/freetype/src/cache/ftcimage.h @@ -0,0 +1,106 @@ +/**************************************************************************** + * + * ftcimage.h + * + * FreeType Generic Image cache (specification) + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* + * FTC_ICache is an _abstract_ cache used to store a single FT_Glyph + * image per cache node. + * + * FTC_ICache extends FTC_GCache. For an implementation example, + * see FTC_ImageCache in `src/cache/ftbasic.c'. + */ + + + /************************************************************************** + * + * Each image cache really manages FT_Glyph objects. + * + */ + + +#ifndef FTCIMAGE_H_ +#define FTCIMAGE_H_ + + +#include <freetype/ftcache.h> +#include "ftcglyph.h" + +FT_BEGIN_HEADER + + + /* the FT_Glyph image node type - we store only 1 glyph per node */ + typedef struct FTC_INodeRec_ + { + FTC_GNodeRec gnode; + FT_Glyph glyph; + + } FTC_INodeRec, *FTC_INode; + +#define FTC_INODE( x ) ( (FTC_INode)( x ) ) +#define FTC_INODE_GINDEX( x ) FTC_GNODE( x )->gindex +#define FTC_INODE_FAMILY( x ) FTC_GNODE( x )->family + + typedef FT_Error + (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ); + + typedef struct FTC_IFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_IFamily_LoadGlyphFunc family_load_glyph; + + } FTC_IFamilyClassRec; + + typedef const FTC_IFamilyClassRec* FTC_IFamilyClass; + +#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) + +#define FTC_CACHE_IFAMILY_CLASS( x ) \ + FTC_IFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class ) + + + /* can be used as a @FTC_Node_FreeFunc */ + FT_LOCAL( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ); + + /* Can be used as @FTC_Node_NewFunc. `gquery.index' and `gquery.family' + * must be set correctly. This function will call the `family_load_glyph' + * method to load the FT_Glyph into the cache node. + */ + FT_LOCAL( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ); + +#if 0 + /* can be used as @FTC_Node_WeightFunc */ + FT_LOCAL( FT_ULong ) + FTC_INode_Weight( FTC_INode inode ); +#endif + + + /* */ + +FT_END_HEADER + +#endif /* FTCIMAGE_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcmanag.c b/external/freetype/src/cache/ftcmanag.c new file mode 100644 index 000000000..94f8469c9 --- /dev/null +++ b/external/freetype/src/cache/ftcmanag.c @@ -0,0 +1,696 @@ +/**************************************************************************** + * + * ftcmanag.c + * + * FreeType Cache Manager (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftcache.h> +#include "ftcmanag.h" +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftsizes.h> + +#include "ftccback.h" +#include "ftcerror.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT cache + + + static FT_Error + ftc_scaler_lookup_size( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Face face; + FT_Size size = NULL; + FT_Error error; + + + error = FTC_Manager_LookupFace( manager, scaler->face_id, &face ); + if ( error ) + goto Exit; + + error = FT_New_Size( face, &size ); + if ( error ) + goto Exit; + + FT_Activate_Size( size ); + + if ( scaler->pixel ) + error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height ); + else + error = FT_Set_Char_Size( face, + (FT_F26Dot6)scaler->width, + (FT_F26Dot6)scaler->height, + scaler->x_res, + scaler->y_res ); + if ( error ) + { + FT_Done_Size( size ); + size = NULL; + } + + Exit: + *asize = size; + return error; + } + + + typedef struct FTC_SizeNodeRec_ + { + FTC_MruNodeRec node; + FT_Size size; + FTC_ScalerRec scaler; + + } FTC_SizeNodeRec, *FTC_SizeNode; + +#define FTC_SIZE_NODE( x ) ( (FTC_SizeNode)( x ) ) + + + FT_CALLBACK_DEF( void ) + ftc_size_node_done( FTC_MruNode ftcnode, + FT_Pointer data ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FT_Size size = node->size; + FT_UNUSED( data ); + + + if ( size ) + FT_Done_Size( size ); + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_size_node_compare( FTC_MruNode ftcnode, + FT_Pointer ftcscaler ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Scaler scaler0 = &node->scaler; + + + if ( FTC_SCALER_COMPARE( scaler0, scaler ) ) + { + FT_Activate_Size( node->size ); + return 1; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_init( FTC_MruNode ftcnode, + FT_Pointer ftcscaler, + FT_Pointer ftcmanager ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_reset( FTC_MruNode ftcnode, + FT_Pointer ftcscaler, + FT_Pointer ftcmanager ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + FT_Done_Size( node->size ); + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + static + const FTC_MruListClassRec ftc_size_list_class = + { + sizeof ( FTC_SizeNodeRec ), + + ftc_size_node_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_size_node_init, /* FTC_MruNode_InitFunc node_init */ + ftc_size_node_reset, /* FTC_MruNode_ResetFunc node_reset */ + ftc_size_node_done /* FTC_MruNode_DoneFunc node_done */ + }; + + + /* helper function used by ftc_face_node_done */ + static FT_Bool + ftc_size_node_compare_faceid( FTC_MruNode ftcnode, + FT_Pointer ftcface_id ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + + + return FT_BOOL( node->scaler.face_id == face_id ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Error error; + FTC_MruNode mrunode; + + + if ( !asize || !scaler ) + return FT_THROW( Invalid_Argument ); + + *asize = NULL; + + if ( !manager ) + return FT_THROW( Invalid_Cache_Handle ); + +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare, + mrunode, error ); + +#else + error = FTC_MruList_Lookup( &manager->sizes, scaler, &mrunode ); +#endif + + if ( !error ) + *asize = FTC_SIZE_NODE( mrunode )->size; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE MRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FaceNodeRec_ + { + FTC_MruNodeRec node; + FTC_FaceID face_id; + FT_Face face; + + } FTC_FaceNodeRec, *FTC_FaceNode; + +#define FTC_FACE_NODE( x ) ( ( FTC_FaceNode )( x ) ) + + + FT_CALLBACK_DEF( FT_Error ) + ftc_face_node_init( FTC_MruNode ftcnode, + FT_Pointer ftcface_id, + FT_Pointer ftcmanager ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FTC_Manager manager = (FTC_Manager)ftcmanager; + FT_Error error; + + + node->face_id = face_id; + + error = manager->request_face( face_id, + manager->library, + manager->request_data, + &node->face ); + if ( !error ) + { + /* destroy initial size object; it will be re-created later */ + if ( node->face->size ) + FT_Done_Size( node->face->size ); + } + + return error; + } + + + FT_CALLBACK_DEF( void ) + ftc_face_node_done( FTC_MruNode ftcnode, + FT_Pointer ftcmanager ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + /* we must begin by removing all scalers for the target face */ + /* from the manager's list */ + FTC_MruList_RemoveSelection( &manager->sizes, + ftc_size_node_compare_faceid, + node->face_id ); + + /* all right, we can discard the face now */ + FT_Done_Face( node->face ); + node->face = NULL; + node->face_id = NULL; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_face_node_compare( FTC_MruNode ftcnode, + FT_Pointer ftcface_id ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + + + return FT_BOOL( node->face_id == face_id ); + } + + + static + const FTC_MruListClassRec ftc_face_list_class = + { + sizeof ( FTC_FaceNodeRec), + + ftc_face_node_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_face_node_init, /* FTC_MruNode_InitFunc node_init */ + NULL, /* FTC_MruNode_ResetFunc node_reset */ + ftc_face_node_done /* FTC_MruNode_DoneFunc node_done */ + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) + { + FT_Error error; + FTC_MruNode mrunode; + + + if ( !aface ) + return FT_THROW( Invalid_Argument ); + + *aface = NULL; + + if ( !manager ) + return FT_THROW( Invalid_Cache_Handle ); + + /* we break encapsulation for the sake of speed */ +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare, + mrunode, error ); + +#else + error = FTC_MruList_Lookup( &manager->faces, face_id, &mrunode ); +#endif + + if ( !error ) + *aface = FTC_FACE_NODE( mrunode )->face; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ) + { + FT_Error error; + FT_Memory memory; + FTC_Manager manager = NULL; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !amanager || !requester ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + if ( FT_QNEW( manager ) ) + goto Exit; + + if ( max_faces == 0 ) + max_faces = FTC_MAX_FACES_DEFAULT; + + if ( max_sizes == 0 ) + max_sizes = FTC_MAX_SIZES_DEFAULT; + + if ( max_bytes == 0 ) + max_bytes = FTC_MAX_BYTES_DEFAULT; + + manager->library = library; + manager->memory = memory; + manager->max_weight = max_bytes; + manager->cur_weight = 0; + + manager->request_face = requester; + manager->request_data = req_data; + + FTC_MruList_Init( &manager->faces, + &ftc_face_list_class, + max_faces, + manager, + memory ); + + FTC_MruList_Init( &manager->sizes, + &ftc_size_list_class, + max_sizes, + manager, + memory ); + + manager->nodes_list = NULL; + manager->num_nodes = 0; + manager->num_caches = 0; + + *amanager = manager; + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_Done( FTC_Manager manager ) + { + FT_Memory memory; + FT_UInt idx; + + + if ( !manager || !manager->library ) + return; + + memory = manager->memory; + + /* now discard all caches */ + for ( idx = manager->num_caches; idx-- > 0; ) + { + FTC_Cache cache = manager->caches[idx]; + + + if ( cache ) + { + cache->clazz.cache_done( cache ); + FT_FREE( cache ); + manager->caches[idx] = NULL; + } + } + manager->num_caches = 0; + + /* discard faces and sizes */ + FTC_MruList_Done( &manager->sizes ); + FTC_MruList_Done( &manager->faces ); + + manager->library = NULL; + manager->memory = NULL; + + FT_FREE( manager ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_Reset( FTC_Manager manager ) + { + if ( !manager ) + return; + + FTC_MruList_Reset( &manager->sizes ); + FTC_MruList_Reset( &manager->faces ); + + FTC_Manager_FlushN( manager, manager->num_nodes ); + } + + +#ifdef FT_DEBUG_ERROR + + static void + FTC_Manager_Check( FTC_Manager manager ) + { + FTC_Node node, first; + + + first = manager->nodes_list; + + /* check node weights */ + if ( first ) + { + FT_Offset weight = 0; + + + node = first; + + do + { + FTC_Cache cache = manager->caches[node->cache_index]; + + + if ( node->cache_index >= manager->num_caches ) + FT_TRACE0(( "FTC_Manager_Check: invalid node (cache index = %hu\n", + node->cache_index )); + else + weight += cache->clazz.node_weight( node, cache ); + + node = FTC_NODE_NEXT( node ); + + } while ( node != first ); + + if ( weight != manager->cur_weight ) + FT_TRACE0(( "FTC_Manager_Check: invalid weight %ld instead of %ld\n", + manager->cur_weight, weight )); + } + + /* check circular list */ + if ( first ) + { + FT_UFast count = 0; + + + node = first; + do + { + count++; + node = FTC_NODE_NEXT( node ); + + } while ( node != first ); + + if ( count != manager->num_nodes ) + FT_TRACE0(( "FTC_Manager_Check:" + " invalid cache node count %u instead of %u\n", + manager->num_nodes, count )); + } + } + +#endif /* FT_DEBUG_ERROR */ + + + /* `Compress' the manager's data, i.e., get rid of old cache nodes */ + /* that are not referenced anymore in order to limit the total */ + /* memory used by the cache. */ + + /* documentation is in ftcmanag.h */ + + FT_LOCAL_DEF( void ) + FTC_Manager_Compress( FTC_Manager manager ) + { + FTC_Node node, prev, first; + + + if ( !manager ) + return; + + first = manager->nodes_list; + +#ifdef FT_DEBUG_ERROR + FTC_Manager_Check( manager ); + + FT_TRACE0(( "compressing, weight = %ld, max = %ld, nodes = %u\n", + manager->cur_weight, manager->max_weight, + manager->num_nodes )); +#endif + + if ( manager->cur_weight < manager->max_weight || !first ) + return; + + /* go to last node -- it's a circular list */ + prev = FTC_NODE_PREV( first ); + do + { + node = prev; + prev = FTC_NODE_PREV( node ); + + if ( node->ref_count <= 0 ) + ftc_node_destroy( node, manager ); + + } while ( node != first && manager->cur_weight > manager->max_weight ); + } + + + /* documentation is in ftcmanag.h */ + + FT_LOCAL_DEF( FT_Error ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FTC_Cache cache = NULL; + + + if ( manager && clazz && acache ) + { + FT_Memory memory = manager->memory; + + + if ( manager->num_caches >= FTC_MAX_CACHES ) + { + error = FT_THROW( Too_Many_Caches ); + FT_ERROR(( "FTC_Manager_RegisterCache:" + " too many registered caches\n" )); + goto Exit; + } + + if ( !FT_QALLOC( cache, clazz->cache_size ) ) + { + cache->manager = manager; + cache->memory = memory; + cache->clazz = clazz[0]; + cache->org_class = clazz; + + /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ + /* IF IT IS NOT SET CORRECTLY */ + cache->index = manager->num_caches; + + error = clazz->cache_init( cache ); + if ( error ) + { + clazz->cache_done( cache ); + FT_FREE( cache ); + goto Exit; + } + + manager->caches[manager->num_caches++] = cache; + } + } + + Exit: + if ( acache ) + *acache = cache; + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ) + { + FTC_Node first = manager->nodes_list; + FTC_Node prev, node; + FT_UInt result = 0; + + + /* try to remove `count' nodes from the list */ + if ( !first || !count ) + return result; + + /* go to last node -- it's a circular list */ + prev = FTC_NODE_PREV( first ); + do + { + node = prev; + prev = FTC_NODE_PREV( node ); + + /* don't touch locked nodes */ + if ( node->ref_count <= 0 ) + { + ftc_node_destroy( node, manager ); + result++; + } + } while ( node != first && result < count ); + + return result; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ) + { + FT_UInt nn; + + + if ( !manager ) + return; + + /* this will remove all FTC_SizeNode that correspond to + * the face_id as well + */ + FTC_MruList_RemoveSelection( &manager->faces, + ftc_face_node_compare, + face_id ); + + for ( nn = 0; nn < manager->num_caches; nn++ ) + FTC_Cache_RemoveFaceID( manager->caches[nn], face_id ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ) + { + if ( node && + manager && + node->cache_index < manager->num_caches ) + node->ref_count--; + } + + +/* END */ diff --git a/external/freetype/src/cache/ftcmanag.h b/external/freetype/src/cache/ftcmanag.h new file mode 100644 index 000000000..5b30929c9 --- /dev/null +++ b/external/freetype/src/cache/ftcmanag.h @@ -0,0 +1,175 @@ +/**************************************************************************** + * + * ftcmanag.h + * + * FreeType Cache Manager (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * A cache manager is in charge of the following: + * + * - Maintain a mapping between generic FTC_FaceIDs and live FT_Face + * objects. The mapping itself is performed through a user-provided + * callback. However, the manager maintains a small cache of FT_Face + * and FT_Size objects in order to speed up things considerably. + * + * - Manage one or more cache objects. Each cache is in charge of + * holding a varying number of `cache nodes'. Each cache node + * represents a minimal amount of individually accessible cached + * data. For example, a cache node can be an FT_Glyph image + * containing a vector outline, or some glyph metrics, or anything + * else. + * + * Each cache node has a certain size in bytes that is added to the + * total amount of `cache memory' within the manager. + * + * All cache nodes are located in a global LRU list, where the oldest + * node is at the tail of the list. + * + * Each node belongs to a single cache, and includes a reference + * count to avoid destroying it (due to caching). + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef FTCMANAG_H_ +#define FTCMANAG_H_ + + +#include <freetype/ftcache.h> +#include "ftcmru.h" +#include "ftccache.h" + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @Section: + * cache_subsystem + * + */ + + +#define FTC_MAX_FACES_DEFAULT 2 +#define FTC_MAX_SIZES_DEFAULT 4 +#define FTC_MAX_BYTES_DEFAULT 200000L /* ~200kByte by default */ + + /* maximum number of caches registered in a single manager */ +#define FTC_MAX_CACHES 16 + + + typedef struct FTC_ManagerRec_ + { + FT_Library library; + FT_Memory memory; + + FTC_Node nodes_list; + FT_Offset max_weight; + FT_Offset cur_weight; + FT_UInt num_nodes; + + FTC_Cache caches[FTC_MAX_CACHES]; + FT_UInt num_caches; + + FTC_MruListRec faces; + FTC_MruListRec sizes; + + FT_Pointer request_data; + FTC_Face_Requester request_face; + + } FTC_ManagerRec; + + + /************************************************************************** + * + * @Function: + * FTC_Manager_Compress + * + * @Description: + * This function is used to check the state of the cache manager if + * its `num_bytes' field is greater than its `max_bytes' field. It + * will flush as many old cache nodes as possible (ignoring cache + * nodes with a non-zero reference count). + * + * @InOut: + * manager :: + * A handle to the cache manager. + * + * @Note: + * Client applications should not call this function directly. It is + * normally invoked by specific cache implementations. + * + * The reason this function is exported is to allow client-specific + * cache classes. + */ + FT_LOCAL( void ) + FTC_Manager_Compress( FTC_Manager manager ); + + + /* try to flush `count' old nodes from the cache; return the number + * of really flushed nodes + */ + FT_LOCAL( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ); + + + /* this must be used internally for the moment */ + FT_LOCAL( FT_Error ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ); + + /* */ + +#define FTC_SCALER_COMPARE( a, b ) \ + ( (a)->face_id == (b)->face_id && \ + (a)->width == (b)->width && \ + (a)->height == (b)->height && \ + ((a)->pixel != 0) == ((b)->pixel != 0) && \ + ( (a)->pixel || \ + ( (a)->x_res == (b)->x_res && \ + (a)->y_res == (b)->y_res ) ) ) + +#define FTC_SCALER_HASH( q ) \ + ( FTC_FACE_ID_HASH( (q)->face_id ) + \ + (q)->width + (q)->height*7 + \ + ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) + + /* */ + +FT_END_HEADER + +#endif /* FTCMANAG_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcmru.c b/external/freetype/src/cache/ftcmru.c new file mode 100644 index 000000000..ad10a06bc --- /dev/null +++ b/external/freetype/src/cache/ftcmru.c @@ -0,0 +1,352 @@ +/**************************************************************************** + * + * ftcmru.c + * + * FreeType MRU support (body). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftcache.h> +#include "ftcmru.h" +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> + +#include "ftcerror.h" + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + if ( first ) + { + FTC_MruNode last = first->prev; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + { + fprintf( stderr, "FTC_MruNode_Prepend: invalid action\n" ); + exit( 2 ); + } + cnode = cnode->next; + + } while ( cnode != first ); + } +#endif + + first->prev = node; + last->next = node; + node->next = first; + node->prev = last; + } + else + { + node->next = node; + node->prev = node; + } + *plist = node; + } + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + FT_ASSERT( first ); + + if ( first != node ) + { + FTC_MruNode prev, next, last; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Up: invalid action\n" ); + exit( 2 ); + Ok: + } +#endif + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + last = first->prev; + + last->next = node; + first->prev = node; + + node->next = first; + node->prev = last; + + *plist = node; + } + } + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + FTC_MruNode prev, next; + + + FT_ASSERT( first ); + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Remove: invalid action\n" ); + exit( 2 ); + Ok: + } +#endif + + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + if ( node == next ) + { + FT_ASSERT( first == node ); + FT_ASSERT( prev == node ); + + *plist = NULL; + } + else if ( node == first ) + *plist = next; + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ) + { + list->num_nodes = 0; + list->max_nodes = max_nodes; + list->nodes = NULL; + list->clazz = *clazz; + list->data = data; + list->memory = memory; + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Reset( FTC_MruList list ) + { + while ( list->nodes ) + FTC_MruList_Remove( list, list->nodes ); + + FT_ASSERT( list->num_nodes == 0 ); + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Done( FTC_MruList list ) + { + FTC_MruList_Reset( list ); + } + + +#ifndef FTC_INLINE + FT_LOCAL_DEF( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ) + { + FTC_MruNode_CompareFunc compare = list->clazz.node_compare; + FTC_MruNode first, node; + + + first = list->nodes; + node = NULL; + + if ( first ) + { + node = first; + do + { + if ( compare( node, key ) ) + { + if ( node != first ) + FTC_MruNode_Up( &list->nodes, node ); + + return node; + } + + node = node->next; + + } while ( node != first); + } + + return NULL; + } +#endif + + FT_LOCAL_DEF( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FT_Error error; + FTC_MruNode node = NULL; + FT_Memory memory = list->memory; + + + if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 ) + { + node = list->nodes->prev; + + FT_ASSERT( node ); + + if ( list->clazz.node_reset ) + { + FTC_MruNode_Up( &list->nodes, node ); + + error = list->clazz.node_reset( node, key, list->data ); + if ( !error ) + goto Exit; + } + + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + } + + /* zero new node in case of node_init failure */ + else if ( FT_ALLOC( node, list->clazz.node_size ) ) + goto Exit; + + error = list->clazz.node_init( node, key, list->data ); + if ( error ) + goto Fail; + + FTC_MruNode_Prepend( &list->nodes, node ); + list->num_nodes++; + + Exit: + *anode = node; + return error; + + Fail: + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + goto Exit; + } + + +#ifndef FTC_INLINE + FT_LOCAL_DEF( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FTC_MruNode node; + + + node = FTC_MruList_Find( list, key ); + if ( !node ) + return FTC_MruList_New( list, key, anode ); + + *anode = node; + return 0; + } +#endif /* FTC_INLINE */ + + FT_LOCAL_DEF( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ) + { + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + { + FT_Memory memory = list->memory; + + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + } + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ) + { + FTC_MruNode first = list->nodes; + FTC_MruNode prev, node; + + + if ( !first || !selection ) + return; + + prev = first->prev; + do + { + node = prev; + prev = node->prev; + + if ( selection( node, key ) ) + FTC_MruList_Remove( list, node ); + + } while ( node != first ); + } + + +/* END */ diff --git a/external/freetype/src/cache/ftcmru.h b/external/freetype/src/cache/ftcmru.h new file mode 100644 index 000000000..45e5249ca --- /dev/null +++ b/external/freetype/src/cache/ftcmru.h @@ -0,0 +1,248 @@ +/**************************************************************************** + * + * ftcmru.h + * + * Simple MRU list-cache (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * An MRU is a list that cannot hold more than a certain number of + * elements (`max_elements'). All elements in the list are sorted in + * least-recently-used order, i.e., the `oldest' element is at the tail + * of the list. + * + * When doing a lookup (either through `Lookup()' or `Lookup_Node()'), + * the list is searched for an element with the corresponding key. If + * it is found, the element is moved to the head of the list and is + * returned. + * + * If no corresponding element is found, the lookup routine will try to + * obtain a new element with the relevant key. If the list is already + * full, the oldest element from the list is discarded and replaced by a + * new one; a new element is added to the list otherwise. + * + * Note that it is possible to pre-allocate the element list nodes. + * This is handy if `max_elements' is sufficiently small, as it saves + * allocations/releases during the lookup process. + * + */ + + +#ifndef FTCMRU_H_ +#define FTCMRU_H_ + + +#include <freetype/freetype.h> +#include <freetype/internal/compiler-macros.h> + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + +#define xxFT_DEBUG_ERROR +#define FTC_INLINE + +FT_BEGIN_HEADER + + typedef struct FTC_MruNodeRec_* FTC_MruNode; + + typedef struct FTC_MruNodeRec_ + { + FTC_MruNode next; + FTC_MruNode prev; + + } FTC_MruNodeRec; + + + FT_LOCAL( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ); + + + typedef struct FTC_MruListRec_* FTC_MruList; + + typedef struct FTC_MruListClassRec_ const * FTC_MruListClass; + + + typedef FT_Bool + (*FTC_MruNode_CompareFunc)( FTC_MruNode node, + FT_Pointer key ); + + typedef FT_Error + (*FTC_MruNode_InitFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef FT_Error + (*FTC_MruNode_ResetFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef void + (*FTC_MruNode_DoneFunc)( FTC_MruNode node, + FT_Pointer data ); + + + typedef struct FTC_MruListClassRec_ + { + FT_Offset node_size; + + FTC_MruNode_CompareFunc node_compare; + FTC_MruNode_InitFunc node_init; + FTC_MruNode_ResetFunc node_reset; + FTC_MruNode_DoneFunc node_done; + + } FTC_MruListClassRec; + + + typedef struct FTC_MruListRec_ + { + FT_UInt num_nodes; + FT_UInt max_nodes; + FTC_MruNode nodes; + FT_Pointer data; + FTC_MruListClassRec clazz; + FT_Memory memory; + + } FTC_MruListRec; + + + FT_LOCAL( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ); + + FT_LOCAL( void ) + FTC_MruList_Reset( FTC_MruList list ); + + + FT_LOCAL( void ) + FTC_MruList_Done( FTC_MruList list ); + + + FT_LOCAL( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ); + + FT_LOCAL( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ); + + +#ifdef FTC_INLINE + +#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \ + FT_BEGIN_STMNT \ + FTC_MruNode* _pfirst = &(list)->nodes; \ + FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \ + FTC_MruNode _first, _node; \ + \ + \ + error = FT_Err_Ok; \ + _first = *(_pfirst); \ + _node = NULL; \ + \ + if ( _first ) \ + { \ + _node = _first; \ + do \ + { \ + if ( _compare( _node, (key) ) ) \ + { \ + if ( _node != _first ) \ + FTC_MruNode_Up( _pfirst, _node ); \ + \ + node = _node; \ + goto MruOk_; \ + } \ + _node = _node->next; \ + \ + } while ( _node != _first); \ + } \ + \ + error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \ + MruOk_: \ + ; \ + FT_END_STMNT + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) + +#else /* !FTC_INLINE */ + + FT_LOCAL( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ); + + FT_LOCAL( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *pnode ); + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) + +#endif /* !FTC_INLINE */ + + +#define FTC_MRULIST_LOOP( list, node ) \ + FT_BEGIN_STMNT \ + FTC_MruNode _first = (list)->nodes; \ + \ + \ + if ( _first ) \ + { \ + FTC_MruNode _node = _first; \ + \ + \ + do \ + { \ + *(FTC_MruNode*)&(node) = _node; + + +#define FTC_MRULIST_LOOP_END() \ + _node = _node->next; \ + \ + } while ( _node != _first ); \ + } \ + FT_END_STMNT + + /* */ + +FT_END_HEADER + + +#endif /* FTCMRU_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/ftcsbits.c b/external/freetype/src/cache/ftcsbits.c new file mode 100644 index 000000000..9929a0bcc --- /dev/null +++ b/external/freetype/src/cache/ftcsbits.c @@ -0,0 +1,414 @@ +/**************************************************************************** + * + * ftcsbits.c + * + * FreeType sbits manager (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftcache.h> +#include "ftcsbits.h" +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/fterrors.h> + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT cache + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SBIT CACHE NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ftc_sbit_copy_bitmap( FTC_SBit sbit, + FT_Bitmap* bitmap, + FT_Memory memory ) + { + FT_Error error; + FT_Int pitch = bitmap->pitch; + FT_ULong size; + + + if ( pitch < 0 ) + pitch = -pitch; + + size = (FT_ULong)pitch * bitmap->rows; + + if ( !FT_QALLOC( sbit->buffer, size ) ) + FT_MEM_COPY( sbit->buffer, bitmap->buffer, size ); + + return error; + } + + + FT_LOCAL_DEF( void ) + ftc_snode_free( FTC_Node ftcsnode, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FTC_SBit sbit = snode->sbits; + FT_UInt count = snode->count; + FT_Memory memory = cache->memory; + + + for ( ; count > 0; sbit++, count-- ) + FT_FREE( sbit->buffer ); + + FTC_GNode_Done( FTC_GNODE( snode ), cache ); + + FT_FREE( snode ); + } + + + FT_LOCAL_DEF( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ) + { + ftc_snode_free( FTC_NODE( snode ), cache ); + } + + + /* + * This function tries to load a small bitmap within a given FTC_SNode. + * Note that it returns a non-zero error code _only_ in the case of + * out-of-memory condition. For all other errors (e.g., corresponding + * to a bad font file), this function will mark the sbit as `unavailable' + * and return a value of 0. + * + * You should also read the comment within the @ftc_snode_compare + * function below to see how out-of-memory is handled during a lookup. + */ + static FT_Error + ftc_snode_load( FTC_SNode snode, + FTC_Manager manager, + FT_UInt gindex, + FT_ULong *asize ) + { + FT_Error error; + FTC_GNode gnode = FTC_GNODE( snode ); + FTC_Family family = gnode->family; + FT_Face face; + FTC_SBit sbit; + FTC_SFamilyClass clazz; + + + if ( gindex - gnode->gindex >= snode->count ) + { + FT_ERROR(( "ftc_snode_load: invalid glyph index" )); + return FT_THROW( Invalid_Argument ); + } + + sbit = snode->sbits + ( gindex - gnode->gindex ); + clazz = (FTC_SFamilyClass)family->clazz; + + error = clazz->family_load_glyph( family, gindex, manager, &face ); + if ( error ) + goto BadGlyph; + + { + FT_Int temp; + FT_GlyphSlot slot = face->glyph; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Pos xadvance, yadvance; /* FT_GlyphSlot->advance.{x|y} */ + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + FT_TRACE0(( "ftc_snode_load:" + " glyph loaded didn't return a bitmap\n" )); + goto BadGlyph; + } + + /* Check whether our values fit into 8/16-bit containers! */ + /* If this is not the case, our bitmap is too large */ + /* and we will leave it as `missing' with sbit.buffer = 0 */ + +#define CHECK_CHAR( d ) ( temp = (FT_Char)d, (FT_Int) temp == (FT_Int) d ) +#define CHECK_BYTE( d ) ( temp = (FT_Byte)d, (FT_UInt)temp == (FT_UInt)d ) +#define CHECK_SHRT( d ) ( temp = (FT_Short)d, (FT_Int)temp == (FT_Int) d ) + + /* horizontal advance in pixels */ + xadvance = ( slot->advance.x + 32 ) >> 6; + yadvance = ( slot->advance.y + 32 ) >> 6; + + if ( !CHECK_BYTE( bitmap->rows ) || + !CHECK_BYTE( bitmap->width ) || + !CHECK_SHRT( bitmap->pitch ) || + !CHECK_CHAR( slot->bitmap_left ) || + !CHECK_CHAR( slot->bitmap_top ) || + !CHECK_CHAR( xadvance ) || + !CHECK_CHAR( yadvance ) ) + { + FT_TRACE2(( "ftc_snode_load:" + " glyph too large for small bitmap cache\n")); + goto BadGlyph; + } + + sbit->width = (FT_Byte)bitmap->width; + sbit->height = (FT_Byte)bitmap->rows; + sbit->pitch = (FT_Short)bitmap->pitch; + sbit->left = (FT_Char)slot->bitmap_left; + sbit->top = (FT_Char)slot->bitmap_top; + sbit->xadvance = (FT_Char)xadvance; + sbit->yadvance = (FT_Char)yadvance; + sbit->format = (FT_Byte)bitmap->pixel_mode; + sbit->max_grays = (FT_Byte)( bitmap->num_grays - 1 ); + + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + /* take the bitmap ownership */ + sbit->buffer = bitmap->buffer; + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* copy the bitmap into a new buffer -- ignore error */ + error = ftc_sbit_copy_bitmap( sbit, bitmap, manager->memory ); + } + + /* now, compute size */ + if ( asize ) + *asize = (FT_ULong)FT_ABS( sbit->pitch ) * sbit->height; + + } /* glyph loading successful */ + + /* ignore the errors that might have occurred -- */ + /* we mark unloaded glyphs with `sbit.buffer == 0' */ + /* and `width == 255', `height == 0' */ + /* */ + if ( error && FT_ERR_NEQ( error, Out_Of_Memory ) ) + { + BadGlyph: + sbit->width = 255; + sbit->height = 0; + sbit->buffer = NULL; + error = FT_Err_Ok; + if ( asize ) + *asize = 0; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + FTC_SNode snode = NULL; + FT_UInt gindex = gquery->gindex; + FTC_Family family = gquery->family; + + FTC_SFamilyClass clazz = FTC_CACHE_SFAMILY_CLASS( cache ); + FT_UInt total; + FT_UInt node_count; + + + total = clazz->family_get_count( family, cache->manager ); + if ( total == 0 || gindex >= total ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( !FT_QNEW( snode ) ) + { + FT_UInt count, start; + + + start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE ); + count = total - start; + if ( count > FTC_SBIT_ITEMS_PER_NODE ) + count = FTC_SBIT_ITEMS_PER_NODE; + + FTC_GNode_Init( FTC_GNODE( snode ), start, family ); + + snode->count = count; + for ( node_count = 0; node_count < count; node_count++ ) + { + snode->sbits[node_count].width = 255; + snode->sbits[node_count].height = 0; + snode->sbits[node_count].buffer = NULL; + } + + error = ftc_snode_load( snode, + cache->manager, + gindex, + NULL ); + if ( error ) + { + FTC_SNode_Free( snode, cache ); + snode = NULL; + } + } + + Exit: + *psnode = snode; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_snode_new( FTC_Node *ftcpsnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_SNode *psnode = (FTC_SNode*)ftcpsnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + + + return FTC_SNode_New( psnode, gquery, cache ); + } + + + FT_LOCAL_DEF( FT_Offset ) + ftc_snode_weight( FTC_Node ftcsnode, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FT_UInt count = snode->count; + FTC_SBit sbit = snode->sbits; + FT_Int pitch; + FT_Offset size; + + FT_UNUSED( cache ); + + + FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE ); + + /* the node itself */ + size = sizeof ( *snode ); + + for ( ; count > 0; count--, sbit++ ) + { + if ( sbit->buffer ) + { + pitch = sbit->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + /* add the size of a given glyph image */ + size += (FT_Offset)pitch * sbit->height; + } + } + + return size; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Offset ) + FTC_SNode_Weight( FTC_SNode snode ) + { + return ftc_snode_weight( FTC_NODE( snode ), NULL ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Bool ) + ftc_snode_compare( FTC_Node ftcsnode, + FT_Pointer ftcgquery, + FTC_Cache cache, + FT_Bool* list_changed ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + FTC_GNode gnode = FTC_GNODE( snode ); + FT_UInt gindex = gquery->gindex; + FT_Bool result; + + + if ( list_changed ) + *list_changed = FALSE; + result = FT_BOOL( gnode->family == gquery->family && + gindex - gnode->gindex < snode->count ); + if ( result ) + { + /* check if we need to load the glyph bitmap now */ + FTC_SBit sbit = snode->sbits + ( gindex - gnode->gindex ); + + + /* + * The following code illustrates what to do when you want to + * perform operations that may fail within a lookup function. + * + * Here, we want to load a small bitmap on-demand; we thus + * need to call the `ftc_snode_load' function which may return + * a non-zero error code only when we are out of memory (OOM). + * + * The correct thing to do is to use @FTC_CACHE_TRYLOOP and + * @FTC_CACHE_TRYLOOP_END in order to implement a retry loop + * that is capable of flushing the cache incrementally when + * an OOM errors occur. + * + * However, we need to `lock' the node before this operation to + * prevent it from being flushed within the loop. + * + * When we exit the loop, we unlock the node, then check the `error' + * variable. If it is non-zero, this means that the cache was + * completely flushed and that no usable memory was found to load + * the bitmap. + * + * We then prefer to return a value of 0 (i.e., NO MATCH). This + * ensures that the caller will try to allocate a new node. + * This operation consequently _fail_ and the lookup function + * returns the appropriate OOM error code. + * + * Note that `buffer == NULL && width == 255' is a hack used to + * tag `unavailable' bitmaps in the array. We should never try + * to load these. + * + */ + + if ( !sbit->buffer && sbit->width == 255 ) + { + FT_ULong size; + FT_Error error; + + + ftcsnode->ref_count++; /* lock node to prevent flushing */ + /* in retry loop */ + + FTC_CACHE_TRYLOOP( cache ) + { + error = ftc_snode_load( snode, cache->manager, gindex, &size ); + } + FTC_CACHE_TRYLOOP_END( list_changed ) + + ftcsnode->ref_count--; /* unlock the node */ + + if ( error ) + result = 0; + else + cache->manager->cur_weight += size; + } + } + + return result; + } + +/* END */ diff --git a/external/freetype/src/cache/ftcsbits.h b/external/freetype/src/cache/ftcsbits.h new file mode 100644 index 000000000..e833cb5c3 --- /dev/null +++ b/external/freetype/src/cache/ftcsbits.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * ftcsbits.h + * + * A small-bitmap cache (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTCSBITS_H_ +#define FTCSBITS_H_ + + +#include <freetype/ftcache.h> +#include "ftcglyph.h" + + +FT_BEGIN_HEADER + +#define FTC_SBIT_ITEMS_PER_NODE 16 + + typedef struct FTC_SNodeRec_ + { + FTC_GNodeRec gnode; + FT_UInt count; + FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; + + } FTC_SNodeRec, *FTC_SNode; + + +#define FTC_SNODE( x ) ( (FTC_SNode)( x ) ) +#define FTC_SNODE_GINDEX( x ) FTC_GNODE( x )->gindex +#define FTC_SNODE_FAMILY( x ) FTC_GNODE( x )->family + + typedef FT_UInt + (*FTC_SFamily_GetCountFunc)( FTC_Family family, + FTC_Manager manager ); + + typedef FT_Error + (*FTC_SFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ); + + typedef struct FTC_SFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_SFamily_GetCountFunc family_get_count; + FTC_SFamily_LoadGlyphFunc family_load_glyph; + + } FTC_SFamilyClassRec; + + typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; + +#define FTC_SFAMILY_CLASS( x ) ( (FTC_SFamilyClass)(x) ) + +#define FTC_CACHE_SFAMILY_CLASS( x ) \ + FTC_SFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class ) + + + FT_LOCAL( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ); + +#if 0 + FT_LOCAL( FT_ULong ) + FTC_SNode_Weight( FTC_SNode inode ); +#endif + + /* */ + +FT_END_HEADER + +#endif /* FTCSBITS_H_ */ + + +/* END */ diff --git a/external/freetype/src/cache/rules.mk b/external/freetype/src/cache/rules.mk new file mode 100644 index 000000000..82b39aa33 --- /dev/null +++ b/external/freetype/src/cache/rules.mk @@ -0,0 +1,85 @@ +# +# FreeType 2 Cache configuration rules +# + + +# Copyright (C) 2000-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Cache driver directory +# +CACHE_DIR := $(SRC_DIR)/cache + + +# compilation flags for the driver +# +CACHE_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# Cache driver sources (i.e., C files) +# +CACHE_DRV_SRC := $(CACHE_DIR)/ftcbasic.c \ + $(CACHE_DIR)/ftccache.c \ + $(CACHE_DIR)/ftccmap.c \ + $(CACHE_DIR)/ftcglyph.c \ + $(CACHE_DIR)/ftcimage.c \ + $(CACHE_DIR)/ftcmanag.c \ + $(CACHE_DIR)/ftcmru.c \ + $(CACHE_DIR)/ftcsbits.c + + +# Cache driver headers +# +CACHE_DRV_H := $(CACHE_DIR)/ftccache.h \ + $(CACHE_DIR)/ftccback.h \ + $(CACHE_DIR)/ftcerror.h \ + $(CACHE_DIR)/ftcglyph.h \ + $(CACHE_DIR)/ftcimage.h \ + $(CACHE_DIR)/ftcmanag.h \ + $(CACHE_DIR)/ftcmru.h \ + $(CACHE_DIR)/ftcsbits.h + + +# Cache driver object(s) +# +# CACHE_DRV_OBJ_M is used during `multi' builds. +# CACHE_DRV_OBJ_S is used during `single' builds. +# +CACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O) +CACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O + +# Cache driver source file for single build +# +CACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c + + +# Cache driver - single object +# +$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \ + $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S)) + + +# Cache driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CACHE_DRV_OBJ_S) +DRV_OBJS_M += $(CACHE_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/cff/cff.c b/external/freetype/src/cff/cff.c new file mode 100644 index 000000000..b486c389e --- /dev/null +++ b/external/freetype/src/cff/cff.c @@ -0,0 +1,28 @@ +/**************************************************************************** + * + * cff.c + * + * FreeType OpenType driver component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "cffcmap.c" +#include "cffdrivr.c" +#include "cffgload.c" +#include "cffparse.c" +#include "cffload.c" +#include "cffobjs.c" + +/* END */ diff --git a/external/freetype/src/cff/cffcmap.c b/external/freetype/src/cff/cffcmap.c new file mode 100644 index 000000000..10d287bc8 --- /dev/null +++ b/external/freetype/src/cff/cffcmap.c @@ -0,0 +1,230 @@ +/**************************************************************************** + * + * cffcmap.c + * + * CFF character mapping table (cmap) support (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include "cffcmap.h" +#include "cffload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_encoding_init( FT_CMap cmap, + FT_Pointer pointer ) + { + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Encoding encoding = &cff->encoding; + + FT_UNUSED( pointer ); + + + cffcmap->gids = encoding->codes; + + return 0; + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_encoding_done( FT_CMap cmap ) + { + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + + + cffcmap->gids = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_index( FT_CMap cmap, + FT_UInt32 char_code ) + { + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + FT_UInt result = 0; + + + if ( char_code < 256 ) + result = cffcmap->gids[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_next( FT_CMap cmap, + FT_UInt32 *pchar_code ) + { + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + while ( char_code < 255 ) + { + result = cffcmap->gids[++char_code]; + if ( result ) + { + *pchar_code = char_code; + break; + } + } + + return result; + } + + + FT_DEFINE_CMAP_CLASS( + cff_cmap_encoding_class_rec, + + sizeof ( CFF_CMapStdRec ), + + (FT_CMap_InitFunc) cff_cmap_encoding_init, /* init */ + (FT_CMap_DoneFunc) cff_cmap_encoding_done, /* done */ + (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, /* char_index */ + (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char* ) + cff_sid_to_glyph_name( void* face_, /* TT_Face */ + FT_UInt idx ) + { + TT_Face face = (TT_Face)face_; + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_UInt sid = charset->sids[idx]; + + + return cff_index_get_sid_string( cff, sid ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ + FT_Pointer pointer ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + FT_UNUSED( pointer ); + + + /* can't build Unicode map for CID-keyed font */ + /* because we don't know glyph names. */ + if ( !charset->sids ) + return FT_THROW( No_Unicode_Glyph_Name ); + + if ( !psnames->unicodes_init ) + return FT_THROW( Unimplemented_Feature ); + + return psnames->unicodes_init( memory, + unicodes, + cff->num_glyphs, + &cff_sid_to_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 char_code ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 *pchar_code ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_DEFINE_CMAP_CLASS( + cff_cmap_unicode_class_rec, + + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) cff_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) cff_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + ) + + +/* END */ diff --git a/external/freetype/src/cff/cffcmap.h b/external/freetype/src/cff/cffcmap.h new file mode 100644 index 000000000..b2afc2fab --- /dev/null +++ b/external/freetype/src/cff/cffcmap.h @@ -0,0 +1,67 @@ +/**************************************************************************** + * + * cffcmap.h + * + * CFF character mapping table (cmap) support (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFCMAP_H_ +#define CFFCMAP_H_ + +#include <freetype/internal/cffotypes.h> + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct CFF_CMapStdRec_* CFF_CMapStd; + + typedef struct CFF_CMapStdRec_ + { + FT_CMapRec cmap; + FT_UShort* gids; /* up to 256 elements */ + + } CFF_CMapStdRec; + + + FT_DECLARE_CMAP_CLASS( cff_cmap_encoding_class_rec ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_DECLARE_CMAP_CLASS( cff_cmap_unicode_class_rec ) + + +FT_END_HEADER + +#endif /* CFFCMAP_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cffdrivr.c b/external/freetype/src/cff/cffdrivr.c new file mode 100644 index 000000000..9898d625c --- /dev/null +++ b/external/freetype/src/cff/cffdrivr.c @@ -0,0 +1,1263 @@ +/**************************************************************************** + * + * cffdrivr.c + * + * OpenType font driver implementation (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Dominik Röttsches. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/sfnt.h> +#include <freetype/internal/psaux.h> +#include <freetype/internal/ftpsprop.h> +#include <freetype/internal/services/svcid.h> +#include <freetype/internal/services/svpsinfo.h> +#include <freetype/internal/services/svpostnm.h> +#include <freetype/internal/services/svttcmap.h> +#include <freetype/internal/services/svcfftl.h> + +#include "cffdrivr.h" +#include "cffgload.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cffparse.h" +#include "cffobjs.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/internal/services/svmm.h> +#include <freetype/internal/services/svmetric.h> +#endif + +#include "cfferrs.h" + +#include <freetype/internal/services/svfntfmt.h> +#include <freetype/internal/services/svgldict.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/ftdriver.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cffdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @Function: + * cff_get_kerning + * + * @Description: + * A driver method used to return the kerning vector between two + * glyphs of the same face. + * + * @Input: + * face :: + * A handle to the source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * @Output: + * kerning :: + * The kerning vector. This is in font units for + * scalable formats, and in pixels for fixed-sizes + * formats. + * + * @Return: + * FreeType error code. 0 means success. + * + * @Note: + * Only horizontal layouts (left-to-right & right-to-left) are + * supported by this function. Other layouts, or more sophisticated + * kernings, are out of scope of this method (the basic driver + * interface is meant to be simple). + * + * They can be implemented by format-specific interfaces. + */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_kerning( FT_Face face, /* CFF_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + CFF_Face cffface = (CFF_Face)face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( cffface, left_glyph, right_glyph ); + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * cff_glyph_load + * + * @Description: + * A driver method used to load a glyph within a given glyph slot. + * + * @Input: + * slot :: + * A handle to the target slot object where the glyph + * will be loaded. + * + * size :: + * A handle to the source face size at which the glyph + * must be scaled, loaded, etc. + * + * glyph_index :: + * The index of the glyph in the font file. + * + * load_flags :: + * A flag indicating what to load for this glyph. The + * FT_LOAD_??? constants can be used to control the + * glyph loading process (e.g., whether the outline + * should be scaled, whether to load bitmaps or not, + * whether to hint the outline, etc). + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_CALLBACK_DEF( FT_Error ) + cff_glyph_load( FT_GlyphSlot slot, /* CFF_GlyphSlot */ + FT_Size size, /* CFF_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_GlyphSlot cffslot = (CFF_GlyphSlot)slot; + CFF_Size cffsize = (CFF_Size)size; + + + if ( !cffslot ) + return FT_THROW( Invalid_Slot_Handle ); + + FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index )); + + /* check whether we want a scaled outline or bitmap */ + if ( !cffsize ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + /* reset the size object if necessary */ + if ( load_flags & FT_LOAD_NO_SCALE ) + size = NULL; + + if ( size ) + { + /* these two objects must have the same parent */ + if ( size->face != slot->face ) + return FT_THROW( Invalid_Face_Handle ); + } + + /* now load the glyph outline if necessary */ + error = cff_slot_load( cffslot, cffsize, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ) + { + FT_UInt nn; + FT_Error error = FT_Err_Ok; + FT_GlyphSlot slot = face->glyph; + + + if ( FT_IS_SFNT( face ) ) + { + /* OpenType 1.7 mandates that the data from `hmtx' table be used; */ + /* it is no longer necessary that those values are identical to */ + /* the values in the `CFF' table */ + + CFF_Face cffface = (CFF_Face)face; + FT_Short dummy; + + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without VVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + /* check whether we have data from the `vmtx' table at all; */ + /* otherwise we extract the info from the CFF glyphstrings */ + /* (instead of synthesizing a global value using the `OS/2' */ + /* table) */ + if ( !cffface->vertical_info ) + goto Missing_Table; + + for ( nn = 0; nn < count; nn++ ) + { + FT_UShort ah; + + + ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface, + 1, + start + nn, + &dummy, + &ah ); + + FT_TRACE5(( " idx %d: advance height %d font unit%s\n", + start + nn, + ah, + ah == 1 ? "" : "s" )); + advances[nn] = ah; + } + } + else + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without HVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + /* check whether we have data from the `hmtx' table at all */ + if ( !cffface->horizontal.number_Of_HMetrics ) + goto Missing_Table; + + for ( nn = 0; nn < count; nn++ ) + { + FT_UShort aw; + + + ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface, + 0, + start + nn, + &dummy, + &aw ); + + FT_TRACE5(( " idx %d: advance width %d font unit%s\n", + start + nn, + aw, + aw == 1 ? "" : "s" )); + advances[nn] = aw; + } + } + + return error; + } + + Missing_Table: + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + + for ( nn = 0; nn < count; nn++ ) + { + error = cff_glyph_load( slot, face->size, start + nn, flags ); + if ( error ) + break; + + advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? slot->linearVertAdvance + : slot->linearHoriAdvance; + } + + return error; + } + + + /* + * GLYPH DICT SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + cff_get_glyph_name( FT_Face face, /* CFF_Face */ + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + CFF_Face cffface = (CFF_Face)face; + CFF_Font font = (CFF_Font)cffface->extra.data; + FT_String* gname; + FT_UShort sid; + FT_Error error; + + + /* CFF2 table does not have glyph names; */ + /* we need to use `post' table method */ + if ( font->version_major == 2 ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_GlyphDict service = + (FT_Service_GlyphDict)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_GLYPH_DICT, + 0 ); + + + if ( service && service->get_name ) + return service->get_name( face, glyph_index, buffer, buffer_max ); + else + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from a CFF2 font\n" )); + FT_ERROR(( " " + " without the `psnames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + } + + if ( !font->psnames ) + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from CFF & CEF fonts\n" )); + FT_ERROR(( " " + " without the `psnames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + /* first, locate the sid in the charset table */ + sid = font->charset.sids[glyph_index]; + + /* now, look up the name itself */ + gname = cff_index_get_sid_string( font, sid ); + + if ( gname ) + FT_STRCPYN( buffer, gname, buffer_max ); + + error = FT_Err_Ok; + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_get_name_index( FT_Face face, /* CFF_Face */ + const FT_String* glyph_name ) + { + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames; + FT_String* name; + FT_UShort sid; + FT_UInt i; + + + /* CFF2 table does not have glyph names; */ + /* we need to use `post' table method */ + if ( cff->version_major == 2 ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_GlyphDict service = + (FT_Service_GlyphDict)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_GLYPH_DICT, + 0 ); + + + if ( service && service->name_index ) + return service->name_index( face, glyph_name ); + else + { + FT_ERROR(( "cff_get_name_index:" + " cannot get glyph index from a CFF2 font\n" )); + FT_ERROR(( " " + " without the `psnames' module\n" )); + return 0; + } + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + return 0; + + for ( i = 0; i < cff->num_glyphs; i++ ) + { + sid = charset->sids[i]; + + if ( sid > 390 ) + name = cff_index_get_string( cff, sid - 391 ); + else + name = (FT_String *)psnames->adobe_std_strings( sid ); + + if ( !name ) + continue; + + if ( !ft_strcmp( glyph_name, name ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC( + cff_service_glyph_dict, + + cff_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */ + cff_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */ + ) + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Int ) + cff_ps_has_glyph_names( FT_Face face ) + { + return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_ps_get_font_info( FT_Face face, /* CFF_Face */ + PS_FontInfoRec* afont_info ) + { + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + FT_Error error = FT_Err_Ok; + + + if ( cffface->is_cff2 ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + if ( cff && !cff->font_info ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + FT_Memory memory = FT_FACE_MEMORY( face ); + PS_FontInfoRec* font_info = NULL; + + + if ( FT_QNEW( font_info ) ) + goto Fail; + + font_info->version = cff_index_get_sid_string( cff, + dict->version ); + font_info->notice = cff_index_get_sid_string( cff, + dict->notice ); + font_info->full_name = cff_index_get_sid_string( cff, + dict->full_name ); + font_info->family_name = cff_index_get_sid_string( cff, + dict->family_name ); + font_info->weight = cff_index_get_sid_string( cff, + dict->weight ); + font_info->italic_angle = dict->italic_angle; + font_info->is_fixed_pitch = dict->is_fixed_pitch; + font_info->underline_position = (FT_Short)dict->underline_position; + font_info->underline_thickness = (FT_UShort)dict->underline_thickness; + + cff->font_info = font_info; + } + + if ( cff ) + *afont_info = *cff->font_info; + + Fail: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_ps_get_font_extra( FT_Face face, /* CFF_Face */ + PS_FontExtraRec* afont_extra ) + { + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + FT_Error error = FT_Err_Ok; + + + if ( cff && !cff->font_extra ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + FT_Memory memory = FT_FACE_MEMORY( face ); + PS_FontExtraRec* font_extra = NULL; + FT_String* embedded_postscript; + + + if ( FT_QNEW( font_extra ) ) + goto Fail; + + font_extra->fs_type = 0U; + + embedded_postscript = cff_index_get_sid_string( + cff, + dict->embedded_postscript ); + if ( embedded_postscript ) + { + FT_String* start_fstype; + FT_String* start_def; + + + /* Identify the XYZ integer in `/FSType XYZ def' substring. */ + if ( ( start_fstype = ft_strstr( embedded_postscript, + "/FSType" ) ) != NULL && + ( start_def = ft_strstr( start_fstype + + sizeof ( "/FSType" ) - 1, + "def" ) ) != NULL ) + { + FT_String* s; + + + for ( s = start_fstype + sizeof ( "/FSType" ) - 1; + s != start_def; + s++ ) + { + if ( *s >= '0' && *s <= '9' ) + { + if ( font_extra->fs_type >= ( FT_USHORT_MAX - 9 ) / 10 ) + { + /* Overflow - ignore the FSType value. */ + font_extra->fs_type = 0U; + break; + } + + font_extra->fs_type *= 10; + font_extra->fs_type += (FT_UShort)( *s - '0' ); + } + else if ( *s != ' ' && *s != '\n' && *s != '\r' ) + { + /* Non-whitespace character between `/FSType' and next `def' */ + /* - ignore the FSType value. */ + font_extra->fs_type = 0U; + break; + } + } + } + } + + cff->font_extra = font_extra; + } + + if ( cff ) + *afont_extra = *cff->font_extra; + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_PSINFOREC( + cff_service_ps_info, + + cff_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */ + cff_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */ + cff_ps_has_glyph_names, /* PS_HasGlyphNamesFunc ps_has_glyph_names */ + /* unsupported with CFF fonts */ + NULL, /* PS_GetFontPrivateFunc ps_get_font_private */ + /* not implemented */ + NULL /* PS_GetFontValueFunc ps_get_font_value */ + ) + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + FT_CALLBACK_DEF( const char* ) + cff_get_ps_name( FT_Face face ) /* CFF_Face */ + { + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + + + /* following the OpenType specification 1.7, we return the name stored */ + /* in the `name' table for a CFF wrapped into an SFNT container */ + + if ( FT_IS_SFNT( face ) && sfnt ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_PsFontName service = + (FT_Service_PsFontName)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, + 0 ); + + + if ( service && service->get_ps_font_name ) + return service->get_ps_font_name( face ); + } + + return cff ? (const char*)cff->font_name : NULL; + } + + + FT_DEFINE_SERVICE_PSFONTNAMEREC( + cff_service_ps_name, + + cff_get_ps_name /* FT_PsName_GetFunc get_ps_font_name */ + ) + + + /* + * TT CMAP INFO + * + * If the charmap is a synthetic Unicode encoding cmap or + * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO + * service defined in SFNT module. + * + * Otherwise call the service function in the sfnt module. + * + */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + FT_Error error = FT_Err_Ok; + + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + + + if ( cmap->clazz != &cff_cmap_encoding_class_rec && + cmap->clazz != &cff_cmap_unicode_class_rec ) + { + FT_Module sfnt = FT_Get_Module( library, "sfnt" ); + FT_Service_TTCMaps service = + (FT_Service_TTCMaps)ft_module_get_service( sfnt, + FT_SERVICE_ID_TT_CMAP, + 0 ); + + + if ( service && service->get_cmap_info ) + error = service->get_cmap_info( charmap, cmap_info ); + } + else + error = FT_THROW( Invalid_CharMap_Format ); + + return error; + } + + + FT_DEFINE_SERVICE_TTCMAPSREC( + cff_service_get_cmap_info, + + cff_get_cmap_info /* TT_CMap_Info_GetFunc get_cmap_info */ + ) + + + /* + * CID INFO SERVICE + * + */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_ros( FT_Face face, /* FT_Face */ + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + if ( registry ) + { + if ( !cff->registry ) + cff->registry = cff_index_get_sid_string( cff, + dict->cid_registry ); + *registry = cff->registry; + } + + if ( ordering ) + { + if ( !cff->ordering ) + cff->ordering = cff_index_get_sid_string( cff, + dict->cid_ordering ); + *ordering = cff->ordering; + } + + /* + * XXX: According to Adobe TechNote #5176, the supplement in CFF + * can be a real number. We truncate it to fit public API + * since freetype-2.3.6. + */ + if ( supplement ) + { + if ( dict->cid_supplement < FT_INT_MIN || + dict->cid_supplement > FT_INT_MAX ) + FT_TRACE1(( "cff_get_ros: too large supplement %ld is truncated\n", + dict->cid_supplement )); + *supplement = (FT_Int)dict->cid_supplement; + } + } + + Fail: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_is_cid( FT_Face face, /* CFF_Face */ + FT_Bool *is_cid ) + { + FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + + + *is_cid = 0; + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry != 0xFFFFU ) + *is_cid = 1; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_cid_from_glyph_index( FT_Face face, /* CFF_Face */ + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + + + if ( cff ) + { + FT_UInt c; + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + if ( glyph_index >= cff->num_glyphs ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + c = cff->charset.sids[glyph_index]; + + if ( cid ) + *cid = c; + } + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_CIDREC( + cff_service_cid_info, + + cff_get_ros, + /* FT_CID_GetRegistryOrderingSupplementFunc get_ros */ + cff_get_is_cid, + /* FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid */ + cff_get_cid_from_glyph_index + /* FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index */ + ) + + + /* + * PROPERTY SERVICE + * + */ + + FT_DEFINE_SERVICE_PROPERTIESREC( + cff_service_properties, + + ps_property_set, /* FT_Properties_SetFunc set_property */ + ps_property_get /* FT_Properties_GetFunc get_property */ + ) + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* + * MULTIPLE MASTER SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + cff_set_mm_blend( FT_Face face, /* CFF_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->set_mm_blend( face, num_coords, coords ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_mm_blend( FT_Face face, /* CFF_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_mm_blend( face, num_coords, coords ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_set_mm_weightvector( FT_Face face, /* CFF_Face */ + FT_UInt len, + FT_Fixed* weightvector ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->set_mm_weightvector( face, len, weightvector ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_mm_weightvector( FT_Face face, /* CFF_Face */ + FT_UInt* len, + FT_Fixed* weightvector ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_mm_weightvector( face, len, weightvector ); + } + + + FT_CALLBACK_DEF( void ) + cff_construct_ps_name( FT_Face face ) /* CFF_Face */ + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + mm->construct_ps_name( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_mm_var( FT_Face face, /* CFF_Face */ + FT_MM_Var* *master ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_mm_var( face, master ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_set_var_design( FT_Face face, /* CFF_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->set_var_design( face, num_coords, coords ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_var_design( FT_Face face, /* CFF_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_var_design( face, num_coords, coords ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_set_named_instance( FT_Face face, /* CFF_Face */ + FT_UInt instance_index ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->set_named_instance( face, instance_index ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_default_named_instance( FT_Face face, /* CFF_Face */ + FT_UInt *instance_index ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_default_named_instance( face, instance_index ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_load_item_variation_store( FT_Face face, /* CFF_Face */ + FT_ULong offset, + GX_ItemVarStore itemStore ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->load_item_var_store( face, offset, itemStore ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_load_delta_set_index_mapping( FT_Face face, /* CFF_Face */ + FT_ULong offset, + GX_DeltaSetIdxMap map, + GX_ItemVarStore itemStore, + FT_ULong table_len ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->load_delta_set_idx_map( face, offset, map, + itemStore, table_len ); + } + + + FT_CALLBACK_DEF( FT_Int ) + cff_get_item_delta( FT_Face face, /* CFF_Face */ + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_item_delta( face, itemStore, outerIndex, innerIndex ); + } + + + FT_CALLBACK_DEF( void ) + cff_done_item_variation_store( FT_Face face, /* CFF_Face */ + GX_ItemVarStore itemStore ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + mm->done_item_var_store( face, itemStore ); + } + + + FT_CALLBACK_DEF( void ) + cff_done_delta_set_index_map( FT_Face face, /* CFF_Face */ + GX_DeltaSetIdxMap deltaSetIdxMap ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + mm->done_delta_set_idx_map( face, deltaSetIdxMap ); + } + + + + FT_DEFINE_SERVICE_MULTIMASTERSREC( + cff_service_multi_masters, + + NULL, /* FT_Get_MM_Func get_mm */ + NULL, /* FT_Set_MM_Design_Func set_mm_design */ + cff_set_mm_blend, /* FT_Set_MM_Blend_Func set_mm_blend */ + cff_get_mm_blend, /* FT_Get_MM_Blend_Func get_mm_blend */ + cff_get_mm_var, /* FT_Get_MM_Var_Func get_mm_var */ + cff_set_var_design, /* FT_Set_Var_Design_Func set_var_design */ + cff_get_var_design, /* FT_Get_Var_Design_Func get_var_design */ + cff_set_named_instance, + /* FT_Set_Named_Instance_Func set_named_instance */ + cff_get_default_named_instance, + /* FT_Get_Default_Named_Instance_Func get_default_named_instance */ + cff_set_mm_weightvector, + /* FT_Set_MM_WeightVector_Func set_mm_weightvector */ + cff_get_mm_weightvector, + /* FT_Get_MM_WeightVector_Func get_mm_weightvector */ + cff_construct_ps_name, + /* FT_Construct_PS_Name_Func construct_ps_name */ + cff_load_delta_set_index_mapping, + /* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */ + cff_load_item_variation_store, + /* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */ + cff_get_item_delta, + /* FT_Var_Get_Item_Delta_Func get_item_delta */ + cff_done_item_variation_store, + /* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */ + cff_done_delta_set_index_map, + /* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */ + cff_get_var_blend, /* FT_Get_Var_Blend_Func get_var_blend */ + cff_done_blend /* FT_Done_Blend_Func done_blend */ + ) + + + /* + * METRICS VARIATIONS SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + cff_hadvance_adjust( FT_Face face, /* CFF_Face */ + FT_UInt gindex, + FT_Int *avalue ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MetricsVariations + var = (FT_Service_MetricsVariations)cffface->tt_var; + + + return var->hadvance_adjust( face, gindex, avalue ); + } + + + FT_CALLBACK_DEF( void ) + cff_metrics_adjust( FT_Face face ) /* CFF_Face */ + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MetricsVariations + var = (FT_Service_MetricsVariations)cffface->tt_var; + + + var->metrics_adjust( face ); + } + + + FT_DEFINE_SERVICE_METRICSVARIATIONSREC( + cff_service_metrics_variations, + + cff_hadvance_adjust, /* FT_HAdvance_Adjust_Func hadvance_adjust */ + NULL, /* FT_LSB_Adjust_Func lsb_adjust */ + NULL, /* FT_RSB_Adjust_Func rsb_adjust */ + + NULL, /* FT_VAdvance_Adjust_Func vadvance_adjust */ + NULL, /* FT_TSB_Adjust_Func tsb_adjust */ + NULL, /* FT_BSB_Adjust_Func bsb_adjust */ + NULL, /* FT_VOrg_Adjust_Func vorg_adjust */ + + cff_metrics_adjust, /* FT_Metrics_Adjust_Func metrics_adjust */ + NULL /* FT_Size_Reset_Func size_reset */ + ) +#endif + + + /* + * CFFLOAD SERVICE + * + */ + + FT_DEFINE_SERVICE_CFFLOADREC( + cff_service_cff_load, + + cff_get_standard_encoding, /* FT_Get_Standard_Encoding_Func get_standard_encoding */ + cff_load_private_dict, /* FT_Load_Private_Dict_Func load_private_dict */ + cff_fd_select_get, /* FT_FD_Select_Get_Func fd_select_get */ + cff_blend_check_vector, /* FT_Blend_Check_Vector_Func blend_check_vector */ + cff_blend_build_vector /* FT_Blend_Build_Vector_Func blend_build_vector */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#if defined TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC10( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_MULTI_MASTERS, &cff_service_multi_masters, + FT_SERVICE_ID_METRICS_VARIATIONS, &cff_service_metrics_variations, + FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cff_service_ps_name, + FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict, + FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info, + FT_SERVICE_ID_CID, &cff_service_cid_info, + FT_SERVICE_ID_PROPERTIES, &cff_service_properties, + FT_SERVICE_ID_CFF_LOAD, &cff_service_cff_load + ) +#else + FT_DEFINE_SERVICEDESCREC8( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cff_service_ps_name, + FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict, + FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info, + FT_SERVICE_ID_CID, &cff_service_cid_info, + FT_SERVICE_ID_PROPERTIES, &cff_service_properties, + FT_SERVICE_ID_CFF_LOAD, &cff_service_cff_load + ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cff_get_interface( FT_Module driver, /* CFF_Driver */ + const char* module_interface ) + { + FT_Library library; + FT_Module sfnt; + FT_Module_Interface result; + + + result = ft_service_list_lookup( cff_services, module_interface ); + if ( result ) + return result; + + /* `driver' is not yet evaluated */ + if ( !driver ) + return NULL; + library = driver->library; + if ( !library ) + return NULL; + + /* we pass our request to the `sfnt' module */ + sfnt = FT_Get_Module( library, "sfnt" ); + + return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define CFF_SIZE_SELECT cff_size_select +#else +#define CFF_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER( + cff_driver_class, + + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER | + FT_MODULE_DRIVER_HINTS_LIGHTLY, + + sizeof ( PS_DriverRec ), + "cff", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + cff_driver_init, /* FT_Module_Constructor module_init */ + cff_driver_done, /* FT_Module_Destructor module_done */ + cff_get_interface, /* FT_Module_Requester get_interface */ + + sizeof ( TT_FaceRec ), + sizeof ( CFF_SizeRec ), + sizeof ( CFF_GlyphSlotRec ), + + cff_face_init, /* FT_Face_InitFunc init_face */ + cff_face_done, /* FT_Face_DoneFunc done_face */ + cff_size_init, /* FT_Size_InitFunc init_size */ + cff_size_done, /* FT_Size_DoneFunc done_size */ + cff_slot_init, /* FT_Slot_InitFunc init_slot */ + cff_slot_done, /* FT_Slot_DoneFunc done_slot */ + + cff_glyph_load, /* FT_Slot_LoadFunc load_glyph */ + + cff_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + cff_get_advances, /* FT_Face_GetAdvancesFunc get_advances */ + + cff_size_request, /* FT_Size_RequestFunc request_size */ + CFF_SIZE_SELECT /* FT_Size_SelectFunc select_size */ + ) + + +/* END */ diff --git a/external/freetype/src/cff/cffdrivr.h b/external/freetype/src/cff/cffdrivr.h new file mode 100644 index 000000000..ab1f147bb --- /dev/null +++ b/external/freetype/src/cff/cffdrivr.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * cffdrivr.h + * + * High-level OpenType driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFDRIVER_H_ +#define CFFDRIVER_H_ + + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_DECLARE_DRIVER( cff_driver_class ) + +FT_END_HEADER + +#endif /* CFFDRIVER_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cfferrs.h b/external/freetype/src/cff/cfferrs.h new file mode 100644 index 000000000..bc9a3043f --- /dev/null +++ b/external/freetype/src/cff/cfferrs.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * cfferrs.h + * + * CFF error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the CFF error enumeration constants. + * + */ + +#ifndef CFFERRS_H_ +#define CFFERRS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX CFF_Err_ +#define FT_ERR_BASE FT_Mod_Err_CFF + + +#include <freetype/fterrors.h> + +#endif /* CFFERRS_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cffgload.c b/external/freetype/src/cff/cffgload.c new file mode 100644 index 000000000..c483d1d1a --- /dev/null +++ b/external/freetype/src/cff/cffgload.c @@ -0,0 +1,762 @@ +/**************************************************************************** + * + * cffgload.c + * + * OpenType Glyph Loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/sfnt.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/psaux.h> +#include <freetype/ftoutln.h> +#include <freetype/ftdriver.h> + +#include "cffload.h" +#include "cffgload.h" + +#include "cfferrs.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#define IS_DEFAULT_INSTANCE( _face ) \ + ( !( FT_IS_NAMED_INSTANCE( _face ) || \ + FT_IS_VARIATION( _face ) ) ) +#else +#define IS_DEFAULT_INSTANCE( _face ) 1 +#endif + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cffgload + + + FT_LOCAL_DEF( FT_Error ) + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + FT_Error error = + face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &data ); + + + *pointer = (FT_Byte*)data.pointer; + *length = data.length; + + return error; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)( face->extra.data ); + + + return cff_index_access_element( &cff->charstrings_index, glyph_index, + pointer, length ); + } + } + + + FT_LOCAL_DEF( void ) + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ) + { +#ifndef FT_CONFIG_OPTION_INCREMENTAL + FT_UNUSED( length ); +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + + + data.pointer = *pointer; + data.length = (FT_UInt)length; + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, &data ); + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)( face->extra.data ); + + + cff_index_forget_element( &cff->charstrings_index, pointer ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#if 0 /* unused until we support pure CFF fonts */ + + + FT_LOCAL_DEF( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ) + { + FT_Error error = FT_Err_Ok; + CFF_Decoder decoder; + FT_Int glyph_index; + CFF_Font cff = (CFF_Font)face->other; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + const CFF_Decoder_Funcs decoder_funcs = psaux->cff_decoder_funcs; + + + *max_advance = 0; + + /* Initialize load decoder */ + decoder_funcs->init( &decoder, face, 0, 0, 0, 0, 0, 0 ); + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* For each glyph, parse the glyph charstring and extract */ + /* the advance width. */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + /* now get load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = decoder_funcs->prepare( &decoder, size, glyph_index ); + if ( !error ) + error = decoder_funcs->parse_charstrings_old( &decoder, + charstring, + charstring_len, + 0 ); + + cff_free_glyph_data( face, &charstring, &charstring_len ); + } + + /* ignore the error if one has occurred -- skip to next glyph */ + error = FT_Err_Ok; + } + + *max_advance = decoder.builder.advance.x; + + return FT_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_Decoder decoder; + PS_Decoder psdecoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting, scaled, force_scaling; + CFF_Font cff = (CFF_Font)face->extra.data; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + const CFF_Decoder_Funcs decoder_funcs = psaux->cff_decoder_funcs; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + + force_scaling = FALSE; + + /* in a CID-keyed font, consider `glyph_index' as a CID and map */ + /* it immediately to the real glyph_index -- if it isn't a */ + /* subsetted font, glyph_indices and CIDs are identical, though */ + if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && + cff->charset.cids ) + { + /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ + if ( glyph_index != 0 ) + { + glyph_index = cff_charset_cid_to_gindex( &cff->charset, + glyph_index ); + if ( glyph_index == 0 ) + return FT_THROW( Invalid_Argument ); + } + } + else if ( glyph_index >= cff->num_glyphs ) + return FT_THROW( Invalid_Argument ); + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size ) + { + CFF_Face cff_face = (CFF_Face)size->root.face; + SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; + FT_Stream stream = cff_face->root.stream; + + + if ( size->strike_index != 0xFFFFFFFFUL && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 && + IS_DEFAULT_INSTANCE( size->root.face ) ) + { + TT_SBit_MetricsRec metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_UInt)load_flags, + stream, + &glyph->root.bitmap, + &metrics ); + + if ( !error ) + { + FT_Bool has_vertical_info; + FT_UShort advance; + FT_Short dummy; + + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + glyph->root.metrics.width = (FT_Pos)metrics.width * 64; + glyph->root.metrics.height = (FT_Pos)metrics.height * 64; + + glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX * 64; + glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY * 64; + glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance * 64; + + glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX * 64; + glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY * 64; + glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance * 64; + + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->root.bitmap_left = metrics.vertBearingX; + glyph->root.bitmap_top = metrics.vertBearingY; + } + else + { + glyph->root.bitmap_left = metrics.horiBearingX; + glyph->root.bitmap_top = metrics.horiBearingY; + } + + /* compute linear advance widths */ + + (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 0, + glyph_index, + &dummy, + &advance ); + glyph->root.linearHoriAdvance = advance; + + has_vertical_info = FT_BOOL( + face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ); + + /* get the vertical metrics from the vmtx table if we have one */ + if ( has_vertical_info ) + { + (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &dummy, + &advance ); + glyph->root.linearVertAdvance = advance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + glyph->root.linearVertAdvance = (FT_Pos) + ( face->os2.sTypoAscender - face->os2.sTypoDescender ); + else + glyph->root.linearVertAdvance = (FT_Pos) + ( face->horizontal.Ascender - face->horizontal.Descender ); + } + + return error; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* return immediately if we only want the embedded bitmaps */ + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return FT_THROW( Invalid_Argument ); + +#ifdef FT_CONFIG_OPTION_SVG + /* check for OT-SVG */ + if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 && + ( load_flags & FT_LOAD_COLOR ) && + face->svg ) + { + /* + * We load the SVG document and try to grab the advances from the + * table. For the bearings we rely on the presetting hook to do that. + */ + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + if ( size && (size->root.metrics.x_ppem < 1 || + size->root.metrics.y_ppem < 1 ) ) + { + error = FT_THROW( Invalid_Size_Handle ); + return error; + } + + FT_TRACE3(( "Trying to load SVG glyph\n" )); + + error = sfnt->load_svg_doc( (FT_GlyphSlot)glyph, glyph_index ); + if ( !error ) + { + FT_Fixed x_scale = size->root.metrics.x_scale; + FT_Fixed y_scale = size->root.metrics.y_scale; + + FT_Short dummy; + FT_UShort advanceX; + FT_UShort advanceY; + + + FT_TRACE3(( "Successfully loaded SVG glyph\n" )); + + glyph->root.format = FT_GLYPH_FORMAT_SVG; + + /* + * If horizontal or vertical advances are not present in the table, + * this is a problem with the font since the standard requires them. + * However, we are graceful and calculate the values by ourselves + * for the vertical case. + */ + sfnt->get_metrics( face, + FALSE, + glyph_index, + &dummy, + &advanceX ); + sfnt->get_metrics( face, + TRUE, + glyph_index, + &dummy, + &advanceY ); + + glyph->root.linearHoriAdvance = advanceX; + glyph->root.linearVertAdvance = advanceY; + + glyph->root.metrics.horiAdvance = FT_MulFix( advanceX, x_scale ); + glyph->root.metrics.vertAdvance = FT_MulFix( advanceY, y_scale ); + + return error; + } + + FT_TRACE3(( "Failed to load SVG glyph\n" )); + } + +#endif /* FT_CONFIG_OPTION_SVG */ + + /* if we have a CID subfont, use its matrix (which has already */ + /* been multiplied with the root matrix) */ + + /* this scaling is only relevant if the PS hinter isn't active */ + if ( cff->num_subfonts ) + { + FT_Long top_upm, sub_upm; + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + fd_index = (FT_Byte)( cff->num_subfonts - 1 ); + + top_upm = (FT_Long)cff->top_font.font_dict.units_per_em; + sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em; + + font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; + font_offset = cff->subfonts[fd_index]->font_dict.font_offset; + + if ( top_upm != sub_upm ) + { + glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); + glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); + + force_scaling = TRUE; + } + } + else + { + font_matrix = cff->top_font.font_dict.font_matrix; + font_offset = cff->top_font.font_dict.font_offset; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + /* top-level code ensures that FT_LOAD_NO_HINTING is set */ + /* if FT_LOAD_NO_SCALE is active */ + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); + + glyph->hint = hinting; + glyph->scaled = scaled; + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ + + { +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face ); +#endif + + FT_Byte* charstring; + FT_ULong charstring_len; + + + decoder_funcs->init( &decoder, face, size, glyph, hinting, + FT_LOAD_TARGET_MODE( load_flags ), + cff_get_glyph_data, + cff_free_glyph_data ); + + /* this is for pure CFFs */ + if ( load_flags & FT_LOAD_ADVANCE_ONLY ) + decoder.width_only = TRUE; + + decoder.builder.no_recurse = + FT_BOOL( load_flags & FT_LOAD_NO_RECURSE ); + + /* this function also checks for a valid subfont index */ + error = decoder_funcs->prepare( &decoder, size, glyph_index ); + if ( error ) + goto Glyph_Build_Finished; + + /* now load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( error ) + goto Glyph_Build_Finished; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + /* choose which CFF renderer to use */ + if ( driver->hinting_engine == FT_HINTING_FREETYPE ) + error = decoder_funcs->parse_charstrings_old( &decoder, + charstring, + charstring_len, + 0 ); + else +#endif + { + psaux->ps_decoder_init( &psdecoder, &decoder, FALSE ); + + error = decoder_funcs->parse_charstrings( &psdecoder, + charstring, + charstring_len ); + + /* Adobe's engine uses 16.16 numbers everywhere; */ + /* as a consequence, glyphs larger than 2000ppem get rejected */ + if ( FT_ERR_EQ( error, Glyph_Too_Big ) ) + { + /* this time, we retry unhinted and scale up the glyph later on */ + /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */ + /* 0x400 for both `x_scale' and `y_scale' in this case) */ + hinting = FALSE; + force_scaling = TRUE; + glyph->hint = hinting; + + error = decoder_funcs->parse_charstrings( &psdecoder, + charstring, + charstring_len ); + } + } + + cff_free_glyph_data( face, &charstring, charstring_len ); + + if ( error ) + goto Glyph_Build_Finished; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Control data and length may not be available for incremental */ + /* fonts. */ + if ( face->root.internal->incremental_interface ) + { + glyph->root.control_data = NULL; + glyph->root.control_len = 0; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* We set control_data and control_len if charstrings is loaded. */ + /* See how charstring loads at cff_index_access_element() in */ + /* cffload.c. */ + { + CFF_Index csindex = &cff->charstrings_index; + + + if ( csindex->offsets ) + { + glyph->root.control_data = csindex->bytes + + csindex->offsets[glyph_index] - 1; + glyph->root.control_len = (FT_Long)charstring_len; + } + } + + Glyph_Build_Finished: + /* save new glyph tables, if no error */ + if ( !error ) + decoder.builder.funcs.done( &decoder.builder ); + /* XXX: anything to do for broken glyph entry? */ + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder.builder.left_bearing.x; + metrics.bearing_y = 0; + metrics.advance = decoder.builder.advance.x; + metrics.advance_v = decoder.builder.advance.y; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + + decoder.builder.left_bearing.x = metrics.bearing_x; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = metrics.advance_v; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + if ( !error ) + { + /* Now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax. */ + + /* For composite glyphs, return only left side bearing and */ + /* advance width. */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.glyph_width; + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Bool has_vertical_info; + + + if ( face->horizontal.number_Of_HMetrics ) + { + FT_Short horiBearingX = 0; + FT_UShort horiAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, + glyph_index, + &horiBearingX, + &horiAdvance ); + metrics->horiAdvance = horiAdvance; + metrics->horiBearingX = horiBearingX; + glyph->root.linearHoriAdvance = horiAdvance; + } + else + { + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; + } + + glyph->root.internal->glyph_transformed = 0; + + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ); + + /* get the vertical metrics from the vmtx table if we have one */ + if ( has_vertical_info ) + { + FT_Short vertBearingY = 0; + FT_UShort vertAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &vertBearingY, + &vertAdvance ); + metrics->vertBearingY = vertBearingY; + metrics->vertAdvance = vertAdvance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + } + + glyph->root.linearVertAdvance = metrics->vertAdvance; + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + glyph->root.outline.flags = 0; + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* apply the font matrix, if any */ + if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || + font_matrix.xy != 0 || font_matrix.yx != 0 ) + { + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, + font_matrix.xx ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, + font_matrix.yy ); + } + + if ( font_offset.x || font_offset.y ) + { + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, + font_offset.y ); + + metrics->horiAdvance += font_offset.x; + metrics->vertAdvance += font_offset.y; + } + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = &glyph->root.outline; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( has_vertical_info ) + { + metrics->vertBearingX = metrics->horiBearingX - + metrics->horiAdvance / 2; + metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, + glyph->y_scale ); + } + else + { + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + } + + return error; + } + + +/* END */ diff --git a/external/freetype/src/cff/cffgload.h b/external/freetype/src/cff/cffgload.h new file mode 100644 index 000000000..3b8cf236d --- /dev/null +++ b/external/freetype/src/cff/cffgload.h @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * cffgload.h + * + * OpenType Glyph Loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFGLOAD_H_ +#define CFFGLOAD_H_ + + +#include <freetype/freetype.h> +#include <freetype/internal/cffotypes.h> + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_Error ) + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ); + FT_LOCAL( void ) + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ); + + +#if 0 /* unused until we support pure CFF fonts */ + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + + FT_LOCAL( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* CFFGLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cffload.c b/external/freetype/src/cff/cffload.c new file mode 100644 index 000000000..af79082e9 --- /dev/null +++ b/external/freetype/src/cff/cffload.c @@ -0,0 +1,2579 @@ +/**************************************************************************** + * + * cffload.c + * + * OpenType and CFF data/program tables loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include <freetype/t1tables.h> +#include <freetype/internal/psaux.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/ftmm.h> +#include <freetype/internal/services/svmm.h> +#endif + +#include "cffload.h" +#include "cffparse.h" + +#include "cfferrs.h" + + +#define FT_FIXED_ONE ( (FT_Fixed)0x10000 ) + + +#if 1 + + static const FT_UShort cff_isoadobe_charset[229] = + { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228 + }; + + static const FT_UShort cff_expert_charset[166] = + { + 0, 1, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 326, 150, + 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 + }; + + static const FT_UShort cff_expertsubset_charset[87] = + { + 0, 1, 231, 232, 235, 236, 237, 238, + 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, + 300, 301, 302, 305, 314, 315, 158, 155, + 163, 320, 321, 322, 323, 324, 325, 326, + 150, 164, 169, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 + }; + + static const FT_UShort cff_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 115, 116, + 117, 118, 119, 120, 121, 122, 0, 123, + 0, 124, 125, 126, 127, 128, 129, 130, + 131, 0, 132, 133, 0, 134, 135, 136, + 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 139, 0, 0, 0, 0, + 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, + 146, 147, 148, 149, 0, 0, 0, 0 + }; + + static const FT_UShort cff_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 0, 253, 254, 255, 256, 257, 0, 0, + 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, + 110, 267, 268, 269, 0, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, + 309, 310, 311, 0, 312, 0, 0, 312, + 0, 0, 314, 315, 0, 0, 316, 317, + 318, 0, 0, 0, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 0, 0, + 326, 150, 164, 169, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378 + }; + +#endif /* 1 */ + + + FT_LOCAL_DEF( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ) + { + return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] + : 0 ); + } + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cffload + + + /* read an offset from the index's stream current position */ + static FT_ULong + cff_index_read_offset( CFF_Index idx, + FT_Error *errorp ) + { + FT_Error error; + FT_Stream stream = idx->stream; + FT_Byte tmp[4]; + FT_ULong result = 0; + + + if ( !FT_STREAM_READ( tmp, idx->off_size ) ) + { + FT_Int nn; + + + for ( nn = 0; nn < idx->off_size; nn++ ) + result = ( result << 8 ) | tmp[nn]; + } + + *errorp = error; + return result; + } + + + static FT_Error + cff_index_init( CFF_Index idx, + FT_Stream stream, + FT_Bool load, + FT_Bool cff2 ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt count; + + + FT_ZERO( idx ); + + idx->stream = stream; + idx->start = FT_STREAM_POS(); + + if ( cff2 ) + { + if ( FT_READ_ULONG( count ) ) + goto Exit; + idx->hdr_size = 5; + } + else + { + if ( FT_READ_USHORT( count ) ) + goto Exit; + idx->hdr_size = 3; + } + + if ( count > 0 ) + { + FT_Byte offsize; + FT_ULong size; + + + /* there is at least one element; read the offset size, */ + /* then access the offset table to compute the index's total size */ + if ( FT_READ_BYTE( offsize ) ) + goto Exit; + + if ( offsize < 1 || offsize > 4 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + idx->count = count; + idx->off_size = offsize; + size = (FT_ULong)( count + 1 ) * offsize; + + idx->data_offset = idx->start + idx->hdr_size + size; + + if ( FT_STREAM_SKIP( size - offsize ) ) + goto Exit; + + size = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( size == 0 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + idx->data_size = --size; + + if ( load ) + { + /* load the data */ + if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) + goto Exit; + } + else + { + /* skip the data */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + static void + cff_index_done( CFF_Index idx ) + { + if ( idx->stream ) + { + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->bytes ) + FT_FRAME_RELEASE( idx->bytes ); + + FT_FREE( idx->offsets ); + FT_ZERO( idx ); + } + } + + + static FT_Error + cff_index_load_offsets( CFF_Index idx ) + { + FT_Error error = FT_Err_Ok; + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->count > 0 && !idx->offsets ) + { + FT_Byte offsize = idx->off_size; + FT_ULong data_size; + FT_Byte* p; + FT_Byte* p_end; + FT_ULong* poff; + + + data_size = (FT_ULong)( idx->count + 1 ) * offsize; + + if ( FT_QNEW_ARRAY( idx->offsets, idx->count + 1 ) || + FT_STREAM_SEEK( idx->start + idx->hdr_size ) || + FT_FRAME_ENTER( data_size ) ) + goto Exit; + + poff = idx->offsets; + p = (FT_Byte*)stream->cursor; + p_end = p + data_size; + + switch ( offsize ) + { + case 1: + for ( ; p < p_end; p++, poff++ ) + poff[0] = p[0]; + break; + + case 2: + for ( ; p < p_end; p += 2, poff++ ) + poff[0] = FT_PEEK_USHORT( p ); + break; + + case 3: + for ( ; p < p_end; p += 3, poff++ ) + poff[0] = FT_PEEK_UOFF3( p ); + break; + + default: + for ( ; p < p_end; p += 4, poff++ ) + poff[0] = FT_PEEK_ULONG( p ); + } + + FT_FRAME_EXIT(); + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + /* Allocate a table containing pointers to an index's elements. */ + /* The `pool' argument makes this function convert the index */ + /* entries to C-style strings (that is, null-terminated). */ + static FT_Error + cff_index_get_pointers( CFF_Index idx, + FT_Byte*** table, + FT_Byte** pool, + FT_ULong* pool_size ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = idx->stream->memory; + + FT_Byte** tbl = NULL; + FT_Byte* new_bytes = NULL; + FT_ULong new_size; + + + *table = NULL; + + if ( !idx->offsets ) + { + error = cff_index_load_offsets( idx ); + if ( error ) + goto Exit; + } + + new_size = idx->data_size + idx->count; + + if ( idx->count > 0 && + !FT_QNEW_ARRAY( tbl, idx->count + 1 ) && + ( !pool || !FT_ALLOC( new_bytes, new_size ) ) ) + { + FT_ULong n, cur_offset; + FT_ULong extra = 0; + FT_Byte* org_bytes = idx->bytes; + + + /* at this point, `idx->offsets' can't be NULL */ + cur_offset = idx->offsets[0] - 1; + + /* sanity check */ + if ( cur_offset != 0 ) + { + FT_TRACE0(( "cff_index_get_pointers:" + " invalid first offset value %ld set to zero\n", + cur_offset )); + cur_offset = 0; + } + + if ( !pool ) + tbl[0] = org_bytes + cur_offset; + else + tbl[0] = new_bytes + cur_offset; + + for ( n = 1; n <= idx->count; n++ ) + { + FT_ULong next_offset = idx->offsets[n] - 1; + + + /* two sanity checks for invalid offset tables */ + if ( next_offset < cur_offset ) + next_offset = cur_offset; + else if ( next_offset > idx->data_size ) + next_offset = idx->data_size; + + if ( !pool ) + tbl[n] = org_bytes + next_offset; + else + { + tbl[n] = new_bytes + next_offset + extra; + + if ( next_offset != cur_offset ) + { + FT_MEM_COPY( tbl[n - 1], + org_bytes + cur_offset, + tbl[n] - tbl[n - 1] ); + tbl[n][0] = '\0'; + tbl[n] += 1; + extra++; + } + } + + cur_offset = next_offset; + } + *table = tbl; + + if ( pool ) + *pool = new_bytes; + if ( pool_size ) + *pool_size = new_size; + } + + Exit: + if ( error && new_bytes ) + FT_FREE( new_bytes ); + if ( error && tbl ) + FT_FREE( tbl ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ) + { + FT_Error error = FT_Err_Ok; + + + if ( idx && idx->count > element ) + { + /* compute start and end offsets */ + FT_Stream stream = idx->stream; + FT_ULong off1, off2 = 0; + + + /* load offsets from file or the offset table */ + if ( !idx->offsets ) + { + FT_ULong pos = element * idx->off_size; + + + if ( FT_STREAM_SEEK( idx->start + idx->hdr_size + pos ) ) + goto Exit; + + off1 = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( off1 != 0 ) + { + do + { + element++; + off2 = cff_index_read_offset( idx, &error ); + + } while ( off2 == 0 && element < idx->count ); + } + } + else /* use offsets table */ + { + off1 = idx->offsets[element]; + if ( off1 ) + { + do + { + element++; + off2 = idx->offsets[element]; + + } while ( off2 == 0 && element < idx->count ); + } + } + + /* XXX: should check off2 does not exceed the end of this entry; */ + /* at present, only truncate off2 at the end of this stream */ + if ( off2 > stream->size + 1 || + idx->data_offset > stream->size - off2 + 1 ) + { + FT_ERROR(( "cff_index_access_element:" + " offset to next entry (%ld)" + " exceeds the end of stream (%ld)\n", + off2, stream->size - idx->data_offset + 1 )); + off2 = stream->size - idx->data_offset + 1; + } + + /* access element */ + if ( off1 && off2 > off1 ) + { + *pbyte_len = off2 - off1; + + if ( idx->bytes ) + { + /* this index was completely loaded in memory, that's easy */ + *pbytes = idx->bytes + off1 - 1; + } + else + { + /* this index is still on disk/file, access it through a frame */ + if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || + FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) + goto Exit; + } + } + else + { + /* empty index element */ + *pbytes = 0; + *pbyte_len = 0; + } + } + else + error = FT_THROW( Invalid_Argument ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ) + { + if ( idx->bytes == 0 ) + { + FT_Stream stream = idx->stream; + + + FT_FRAME_RELEASE( *pbytes ); + } + } + + + /* get an entry from Name INDEX */ + FT_LOCAL_DEF( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ) + { + CFF_Index idx = &font->name_index; + FT_Memory memory; + FT_Byte* bytes; + FT_ULong byte_len; + FT_Error error; + FT_String* name = NULL; + + + if ( !idx->stream ) /* CFF2 does not include a name index */ + goto Exit; + + memory = idx->stream->memory; + + error = cff_index_access_element( idx, element, &bytes, &byte_len ); + if ( error ) + goto Exit; + + if ( !FT_QALLOC( name, byte_len + 1 ) ) + { + FT_MEM_COPY( name, bytes, byte_len ); + name[byte_len] = 0; + } + cff_index_forget_element( idx, &bytes ); + + Exit: + return name; + } + + + /* get an entry from String INDEX */ + FT_LOCAL_DEF( FT_String* ) + cff_index_get_string( CFF_Font font, + FT_UInt element ) + { + return ( element < font->num_strings ) + ? (FT_String*)font->strings[element] + : NULL; + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ) + { + /* value 0xFFFFU indicates a missing dictionary entry */ + if ( sid == 0xFFFFU ) + return NULL; + + /* if it is not a standard string, return it */ + if ( sid > 390 ) + return cff_index_get_string( font, sid - 391 ); + + /* CID-keyed CFF fonts don't have glyph names */ + if ( !font->psnames ) + return NULL; + + /* this is a standard string */ + return (FT_String *)font->psnames->adobe_std_strings( sid ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** FD Select table support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static void + CFF_Done_FD_Select( CFF_FDSelect fdselect, + FT_Stream stream ) + { + if ( fdselect->data ) + FT_FRAME_RELEASE( fdselect->data ); + + fdselect->data_size = 0; + fdselect->format = 0; + fdselect->range_count = 0; + } + + + static FT_Error + CFF_Load_FD_Select( CFF_FDSelect fdselect, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong offset ) + { + FT_Error error; + FT_Byte format; + FT_UInt num_ranges; + + + /* read format */ + if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) + goto Exit; + + fdselect->format = format; + fdselect->cache_count = 0; /* clear cache */ + + switch ( format ) + { + case 0: /* format 0, that's simple */ + fdselect->data_size = num_glyphs; + goto Load_Data; + + case 3: /* format 3, a tad more complex */ + if ( FT_READ_USHORT( num_ranges ) ) + goto Exit; + + if ( !num_ranges ) + { + FT_TRACE0(( "CFF_Load_FD_Select: empty FDSelect array\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + fdselect->data_size = num_ranges * 3 + 2; + + Load_Data: + if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) + goto Exit; + break; + + default: /* hmm... that's wrong */ + error = FT_THROW( Invalid_File_Format ); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ) + { + FT_Byte fd = 0; + + + /* if there is no FDSelect, return zero */ + /* Note: CFF2 with just one Font Dict has no FDSelect */ + if ( !fdselect->data ) + goto Exit; + + switch ( fdselect->format ) + { + case 0: + fd = fdselect->data[glyph_index]; + break; + + case 3: + /* first, compare to the cache */ + if ( glyph_index - fdselect->cache_first < fdselect->cache_count ) + { + fd = fdselect->cache_fd; + break; + } + + /* then, look up the ranges array */ + { + FT_Byte* p = fdselect->data; + FT_Byte* p_limit = p + fdselect->data_size; + FT_Byte fd2; + FT_UInt first, limit; + + + first = FT_NEXT_USHORT( p ); + do + { + if ( glyph_index < first ) + break; + + fd2 = *p++; + limit = FT_NEXT_USHORT( p ); + + if ( glyph_index < limit ) + { + fd = fd2; + + /* update cache */ + fdselect->cache_first = first; + fdselect->cache_count = limit - first; + fdselect->cache_fd = fd2; + break; + } + first = limit; + + } while ( p < p_limit ); + } + break; + + default: + ; + } + + Exit: + return fd; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** CFF font support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + cff_charset_compute_cids( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_UInt i; + FT_UShort max_cid = 0; + + + if ( charset->max_cid > 0 ) + goto Exit; + + for ( i = 0; i < num_glyphs; i++ ) + { + if ( charset->sids[i] > max_cid ) + max_cid = charset->sids[i]; + } + + if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) ) + goto Exit; + + /* When multiple GIDs map to the same CID, we choose the lowest */ + /* GID. This is not described in any spec, but it matches the */ + /* behaviour of recent Acroread versions. The loop stops when */ + /* the unsigned index wraps around after reaching zero. */ + for ( i = num_glyphs - 1; i < num_glyphs; i-- ) + charset->cids[charset->sids[i]] = (FT_UShort)i; + + charset->max_cid = max_cid; + charset->num_glyphs = num_glyphs; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ) + { + FT_UInt result = 0; + + + if ( cid <= charset->max_cid ) + result = charset->cids[cid]; + + return result; + } + + + static void + cff_charset_free_cids( CFF_Charset charset, + FT_Memory memory ) + { + FT_FREE( charset->cids ); + charset->max_cid = 0; + } + + + static void + cff_charset_done( CFF_Charset charset, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + cff_charset_free_cids( charset, memory ); + + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + } + + + static FT_Error + cff_charset_load( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset, + FT_Bool invert ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + FT_UShort glyph_sid; + + + /* If the offset is greater than 2, we have to parse the charset */ + /* table. */ + if ( offset > 2 ) + { + FT_UInt j; + + + charset->offset = base_offset + offset; + + /* Get the format of the table. */ + if ( FT_STREAM_SEEK( charset->offset ) || + FT_READ_BYTE( charset->format ) ) + goto Exit; + + /* Allocate memory for sids. */ + if ( FT_QNEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* assign the .notdef glyph */ + charset->sids[0] = 0; + + switch ( charset->format ) + { + case 0: + if ( num_glyphs > 0 ) + { + if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) + goto Exit; + + for ( j = 1; j < num_glyphs; j++ ) + charset->sids[j] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + break; + + case 1: + case 2: + { + FT_UInt nleft; + FT_UInt i; + + + j = 1; + + while ( j < num_glyphs ) + { + /* Read the first glyph sid of the range. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Read the number of glyphs in the range. */ + if ( charset->format == 2 ) + { + if ( FT_READ_USHORT( nleft ) ) + goto Exit; + } + else + { + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + } + + /* try to rescue some of the SIDs if `nleft' is too large */ + if ( glyph_sid > 0xFFFFL - nleft ) + { + FT_ERROR(( "cff_charset_load: invalid SID range trimmed" + " nleft=%d -> %ld\n", nleft, 0xFFFFL - glyph_sid )); + nleft = ( FT_UInt )( 0xFFFFL - glyph_sid ); + } + + /* Fill in the range of sids -- `nleft + 1' glyphs. */ + for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) + charset->sids[j] = glyph_sid; + } + } + break; + + default: + FT_ERROR(( "cff_charset_load: invalid table format\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + else + { + /* Parse default tables corresponding to offset == 0, 1, or 2. */ + /* CFF specification intimates the following: */ + /* */ + /* In order to use a predefined charset, the following must be */ + /* true: The charset constructed for the glyphs in the font's */ + /* charstrings dictionary must match the predefined charset in */ + /* the first num_glyphs. */ + + charset->offset = offset; /* record charset type */ + + switch ( (FT_UInt)offset ) + { + case 0: + if ( num_glyphs > 229 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" )); + FT_ERROR(( "predefined charset (Adobe ISO-Latin)\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_QNEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); + + break; + + case 1: + if ( num_glyphs > 166 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" )); + FT_ERROR(( "predefined charset (Adobe Expert)\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_QNEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); + + break; + + case 2: + if ( num_glyphs > 87 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" )); + FT_ERROR(( "predefined charset (Adobe Expert Subset)\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_QNEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); + + break; + + default: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + /* we have to invert the `sids' array for subsetted CID-keyed fonts */ + if ( invert ) + error = cff_charset_compute_cids( charset, num_glyphs, memory ); + + Exit: + /* Clean up if there was an error. */ + if ( error ) + { + FT_FREE( charset->sids ); + FT_FREE( charset->cids ); + charset->format = 0; + charset->offset = 0; + } + + return error; + } + + + static void + cff_vstore_done( CFF_VStoreRec* vstore, + FT_Memory memory ) + { + FT_UInt i; + + + /* free regionList and axisLists */ + if ( vstore->varRegionList ) + { + for ( i = 0; i < vstore->regionCount; i++ ) + FT_FREE( vstore->varRegionList[i].axisList ); + } + FT_FREE( vstore->varRegionList ); + + /* free varData and indices */ + if ( vstore->varData ) + { + for ( i = 0; i < vstore->dataCount; i++ ) + FT_FREE( vstore->varData[i].regionIndices ); + } + FT_FREE( vstore->varData ); + } + + + /* convert 2.14 to Fixed */ + #define FT_fdot14ToFixed( x ) ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) + + + static FT_Error + cff_vstore_load( CFF_VStoreRec* vstore, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_ERR( Invalid_File_Format ); + + FT_ULong* dataOffsetArray = NULL; + FT_UInt i, j; + + + /* no offset means no vstore to parse */ + if ( offset ) + { + FT_UInt vsOffset; + FT_UInt format; + FT_UInt dataCount; + FT_UInt regionCount; + FT_ULong regionListOffset; + + + /* we need to parse the table to determine its size; */ + /* skip table length */ + if ( FT_STREAM_SEEK( base_offset + offset ) || + FT_STREAM_SKIP( 2 ) ) + goto Exit; + + /* actual variation store begins after the length */ + vsOffset = FT_STREAM_POS(); + + /* check the header */ + if ( FT_READ_USHORT( format ) ) + goto Exit; + if ( format != 1 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* read top level fields */ + if ( FT_READ_ULONG( regionListOffset ) || + FT_READ_USHORT( dataCount ) ) + goto Exit; + + /* make temporary copy of item variation data offsets; */ + /* we'll parse region list first, then come back */ + if ( FT_QNEW_ARRAY( dataOffsetArray, dataCount ) ) + goto Exit; + + for ( i = 0; i < dataCount; i++ ) + { + if ( FT_READ_ULONG( dataOffsetArray[i] ) ) + goto Exit; + } + + /* parse regionList and axisLists */ + if ( FT_STREAM_SEEK( vsOffset + regionListOffset ) || + FT_READ_USHORT( vstore->axisCount ) || + FT_READ_USHORT( regionCount ) ) + goto Exit; + + vstore->regionCount = 0; + if ( FT_QNEW_ARRAY( vstore->varRegionList, regionCount ) ) + goto Exit; + + for ( i = 0; i < regionCount; i++ ) + { + CFF_VarRegion* region = &vstore->varRegionList[i]; + + + if ( FT_QNEW_ARRAY( region->axisList, vstore->axisCount ) ) + goto Exit; + + /* keep track of how many axisList to deallocate on error */ + vstore->regionCount++; + + for ( j = 0; j < vstore->axisCount; j++ ) + { + CFF_AxisCoords* axis = &region->axisList[j]; + + FT_Int16 start14, peak14, end14; + + + if ( FT_READ_SHORT( start14 ) || + FT_READ_SHORT( peak14 ) || + FT_READ_SHORT( end14 ) ) + goto Exit; + + axis->startCoord = FT_fdot14ToFixed( start14 ); + axis->peakCoord = FT_fdot14ToFixed( peak14 ); + axis->endCoord = FT_fdot14ToFixed( end14 ); + } + } + + /* use dataOffsetArray now to parse varData items */ + vstore->dataCount = 0; + if ( FT_QNEW_ARRAY( vstore->varData, dataCount ) ) + goto Exit; + + for ( i = 0; i < dataCount; i++ ) + { + CFF_VarData* data = &vstore->varData[i]; + + + if ( FT_STREAM_SEEK( vsOffset + dataOffsetArray[i] ) ) + goto Exit; + + /* ignore `itemCount' and `shortDeltaCount' */ + /* because CFF2 has no delta sets */ + if ( FT_STREAM_SKIP( 4 ) ) + goto Exit; + + /* Note: just record values; consistency is checked later */ + /* by cff_blend_build_vector when it consumes `vstore' */ + + if ( FT_READ_USHORT( data->regionIdxCount ) ) + goto Exit; + + if ( FT_QNEW_ARRAY( data->regionIndices, data->regionIdxCount ) ) + goto Exit; + + /* keep track of how many regionIndices to deallocate on error */ + vstore->dataCount++; + + for ( j = 0; j < data->regionIdxCount; j++ ) + { + if ( FT_READ_USHORT( data->regionIndices[j] ) ) + goto Exit; + } + } + } + + error = FT_Err_Ok; + + Exit: + FT_FREE( dataOffsetArray ); + if ( error ) + cff_vstore_done( vstore, memory ); + + return error; + } + + + /* Clear blend stack (after blend values are consumed). */ + /* */ + /* TODO: Should do this in cff_run_parse, but subFont */ + /* ref is not available there. */ + /* */ + /* Allocation is not changed when stack is cleared. */ + FT_LOCAL_DEF( void ) + cff_blend_clear( CFF_SubFont subFont ) + { + subFont->blend_top = subFont->blend_stack; + subFont->blend_used = 0; + } + + + /* Blend numOperands on the stack, */ + /* store results into the first numBlends values, */ + /* then pop remaining arguments. */ + /* */ + /* This is comparable to `cf2_doBlend' but */ + /* the cffparse stack is different and can't be written. */ + /* Blended values are written to a different buffer, */ + /* using reserved operator 255. */ + /* */ + /* Blend calculation is done in 16.16 fixed-point. */ + FT_LOCAL_DEF( FT_Error ) + cff_blend_doBlend( CFF_SubFont subFont, + CFF_Parser parser, + FT_UInt numBlends ) + { + FT_UInt delta; + FT_UInt base; + FT_UInt i, j; + FT_UInt size; + + CFF_Blend blend = &subFont->blend; + + FT_Memory memory = subFont->blend.font->memory; /* for FT_REALLOC */ + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + + /* compute expected number of operands for this blend */ + FT_UInt numOperands = (FT_UInt)( numBlends * blend->lenBV ); + FT_UInt count = (FT_UInt)( parser->top - 1 - parser->stack ); + + + if ( numOperands > count ) + { + FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d argument%s\n", + count, + count == 1 ? "" : "s" )); + + error = FT_THROW( Stack_Underflow ); + goto Exit; + } + + /* check whether we have room for `numBlends' values at `blend_top' */ + size = 5 * numBlends; /* add 5 bytes per entry */ + if ( subFont->blend_used + size > subFont->blend_alloc ) + { + FT_Byte* blend_stack_old = subFont->blend_stack; + FT_Byte* blend_top_old = subFont->blend_top; + + + /* increase or allocate `blend_stack' and reset `blend_top'; */ + /* prepare to append `numBlends' values to the buffer */ + if ( FT_QREALLOC( subFont->blend_stack, + subFont->blend_alloc, + subFont->blend_alloc + size ) ) + goto Exit; + + subFont->blend_top = subFont->blend_stack + subFont->blend_used; + subFont->blend_alloc += size; + + /* iterate over the parser stack and adjust pointers */ + /* if the reallocated buffer has a different address */ + if ( blend_stack_old && + subFont->blend_stack != blend_stack_old ) + { + FT_PtrDist offset = subFont->blend_stack - blend_stack_old; + FT_Byte** p; + + + for ( p = parser->stack; p < parser->top; p++ ) + { + if ( *p >= blend_stack_old && *p < blend_top_old ) + *p += offset; + } + } + } + subFont->blend_used += size; + + base = count - numOperands; /* index of first blend arg */ + delta = base + numBlends; /* index of first delta arg */ + + for ( i = 0; i < numBlends; i++ ) + { + const FT_Int32* weight = &blend->BV[1]; + FT_Fixed sum; + + + /* convert inputs to 16.16 fixed point */ + sum = cff_parse_fixed( parser, &parser->stack[i + base] ); + + for ( j = 1; j < blend->lenBV; j++ ) + sum += FT_MulFix( cff_parse_fixed( parser, &parser->stack[delta++] ), + *weight++ ); + + /* point parser stack to new value on blend_stack */ + parser->stack[i + base] = subFont->blend_top; + + /* Push blended result as Type 2 5-byte fixed-point number. This */ + /* will not conflict with actual DICTs because 255 is a reserved */ + /* opcode in both CFF and CFF2 DICTs. See `cff_parse_num' for */ + /* decode of this, which rounds to an integer. */ + *subFont->blend_top++ = 255; + *subFont->blend_top++ = (FT_Byte)( sum >> 24 ); + *subFont->blend_top++ = (FT_Byte)( sum >> 16 ); + *subFont->blend_top++ = (FT_Byte)( sum >> 8 ); + *subFont->blend_top++ = (FT_Byte)sum; + } + + /* leave only numBlends results on parser stack */ + parser->top = &parser->stack[base + numBlends]; + + Exit: + return error; + } + + + /* Compute a blend vector from variation store index and normalized */ + /* vector based on pseudo-code in OpenType Font Variations Overview. */ + /* */ + /* Note: lenNDV == 0 produces a default blend vector, (1,0,0,...). */ + FT_LOCAL_DEF( FT_Error ) + cff_blend_build_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + FT_Memory memory = blend->font->memory; /* for FT_REALLOC */ + + FT_UInt len; + CFF_VStore vs; + CFF_VarData* varData; + FT_UInt master; + + + /* protect against malformed fonts */ + if ( !( lenNDV == 0 || NDV ) ) + { + FT_TRACE4(( " cff_blend_build_vector:" + " Malformed Normalize Design Vector data\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + blend->builtBV = FALSE; + + vs = &blend->font->vstore; + + /* VStore and fvar must be consistent */ + if ( lenNDV != 0 && lenNDV != vs->axisCount ) + { + FT_TRACE4(( " cff_blend_build_vector: Axis count mismatch\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( vsindex >= vs->dataCount ) + { + FT_TRACE4(( " cff_blend_build_vector: vsindex out of range\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* select the item variation data structure */ + varData = &vs->varData[vsindex]; + + /* prepare buffer for the blend vector */ + len = varData->regionIdxCount + 1; /* add 1 for default component */ + if ( FT_QRENEW_ARRAY( blend->BV, blend->lenBV, len ) ) + goto Exit; + + blend->lenBV = len; + + /* outer loop steps through master designs to be blended */ + for ( master = 0; master < len; master++ ) + { + FT_UInt j; + FT_UInt idx; + CFF_VarRegion* varRegion; + + + /* default factor is always one */ + if ( master == 0 ) + { + blend->BV[master] = FT_FIXED_ONE; + FT_TRACE4(( " build blend vector len %d\n", len )); + FT_TRACE4(( " [ %f ", blend->BV[master] / 65536.0 )); + continue; + } + + /* VStore array does not include default master, so subtract one */ + idx = varData->regionIndices[master - 1]; + varRegion = &vs->varRegionList[idx]; + + if ( idx >= vs->regionCount ) + { + FT_TRACE4(( " cff_blend_build_vector:" + " region index out of range\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Note: `lenNDV' could be zero. */ + /* In that case, build default blend vector (1,0,0...). */ + if ( !lenNDV ) + { + blend->BV[master] = 0; + continue; + } + + /* In the normal case, initialize each component to 1 */ + /* before inner loop. */ + blend->BV[master] = FT_FIXED_ONE; /* default */ + + /* inner loop steps through axes in this region */ + for ( j = 0; j < lenNDV; j++ ) + { + CFF_AxisCoords* axis = &varRegion->axisList[j]; + FT_Fixed axisScalar; + + + /* compute the scalar contribution of this axis; */ + /* ignore invalid ranges */ + if ( axis->startCoord > axis->peakCoord || + axis->peakCoord > axis->endCoord ) + axisScalar = FT_FIXED_ONE; + + else if ( axis->startCoord < 0 && + axis->endCoord > 0 && + axis->peakCoord != 0 ) + axisScalar = FT_FIXED_ONE; + + /* peak of 0 means ignore this axis */ + else if ( axis->peakCoord == 0 ) + axisScalar = FT_FIXED_ONE; + + /* ignore this region if coords are out of range */ + else if ( NDV[j] < axis->startCoord || + NDV[j] > axis->endCoord ) + axisScalar = 0; + + /* calculate a proportional factor */ + else + { + if ( NDV[j] == axis->peakCoord ) + axisScalar = FT_FIXED_ONE; + else if ( NDV[j] < axis->peakCoord ) + axisScalar = FT_DivFix( NDV[j] - axis->startCoord, + axis->peakCoord - axis->startCoord ); + else + axisScalar = FT_DivFix( axis->endCoord - NDV[j], + axis->endCoord - axis->peakCoord ); + } + + /* take product of all the axis scalars */ + blend->BV[master] = FT_MulFix( blend->BV[master], axisScalar ); + } + + FT_TRACE4(( ", %f ", + blend->BV[master] / 65536.0 )); + } + + FT_TRACE4(( "]\n" )); + + /* record the parameters used to build the blend vector */ + blend->lastVsindex = vsindex; + + if ( lenNDV != 0 ) + { + /* user has set a normalized vector */ + if ( FT_QRENEW_ARRAY( blend->lastNDV, blend->lenNDV, lenNDV ) ) + goto Exit; + + FT_MEM_COPY( blend->lastNDV, + NDV, + lenNDV * sizeof ( *NDV ) ); + } + + blend->lenNDV = lenNDV; + blend->builtBV = TRUE; + + Exit: + return error; + } + + + /* `lenNDV' is zero for default vector; */ + /* return TRUE if blend vector needs to be built. */ + FT_LOCAL_DEF( FT_Bool ) + cff_blend_check_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + if ( !blend->builtBV || + blend->lastVsindex != vsindex || + blend->lenNDV != lenNDV || + ( lenNDV && + ft_memcmp( NDV, + blend->lastNDV, + lenNDV * sizeof ( *NDV ) ) != 0 ) ) + { + /* need to build blend vector */ + return TRUE; + } + + return FALSE; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + FT_LOCAL_DEF( FT_Error ) + cff_get_var_blend( FT_Face face, /* CFF_Face */ + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_var_blend( face, + num_coords, + coords, + normalizedcoords, + mm_var ); + } + + + FT_LOCAL_DEF( void ) + cff_done_blend( FT_Face face ) /* CFF_Face */ + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + if ( mm ) + mm->done_blend( face ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static void + cff_encoding_done( CFF_Encoding encoding ) + { + encoding->format = 0; + encoding->offset = 0; + encoding->count = 0; + } + + + static FT_Error + cff_encoding_load( CFF_Encoding encoding, + CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count; + FT_UInt j; + FT_UShort glyph_sid; + FT_UInt glyph_code; + + + /* Check for charset->sids. If we do not have this, we fail. */ + if ( !charset->sids ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Note: The encoding table in a CFF font is indexed by glyph index; */ + /* the first encoded glyph index is 1. Hence, we read the character */ + /* code (`glyph_code') at index j and make the assignment: */ + /* */ + /* encoding->codes[glyph_code] = j + 1 */ + /* */ + /* We also make the assignment: */ + /* */ + /* encoding->sids[glyph_code] = charset->sids[j + 1] */ + /* */ + /* This gives us both a code to GID and a code to SID mapping. */ + + if ( offset > 1 ) + { + /* Zero out the code to gid/sid mappings. */ + FT_ARRAY_ZERO( encoding->sids, 256 ); + FT_ARRAY_ZERO( encoding->codes, 256 ); + + encoding->offset = base_offset + offset; + + /* we need to parse the table to determine its size */ + if ( FT_STREAM_SEEK( encoding->offset ) || + FT_READ_BYTE( encoding->format ) || + FT_READ_BYTE( count ) ) + goto Exit; + + switch ( encoding->format & 0x7F ) + { + case 0: + { + FT_Byte* p; + + + /* By convention, GID 0 is always ".notdef" and is never */ + /* coded in the font. Hence, the number of codes found */ + /* in the table is `count+1'. */ + /* */ + encoding->count = count + 1; + + if ( FT_FRAME_ENTER( count ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + + for ( j = 1; j <= count; j++ ) + { + glyph_code = *p++; + + /* Make sure j is not too big. */ + if ( j < num_glyphs ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)j; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[j]; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + { + FT_UInt nleft; + FT_UInt i = 1; + FT_UInt k; + + + encoding->count = 0; + + /* Parse the Format1 ranges. */ + for ( j = 0; j < count; j++, i += nleft ) + { + /* Read the first glyph code of the range. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the number of codes in the range. */ + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + + /* Increment nleft, so we read `nleft + 1' codes/sids. */ + nleft++; + + /* compute max number of character codes */ + if ( (FT_UInt)nleft > encoding->count ) + encoding->count = nleft; + + /* Fill in the range of codes/sids. */ + for ( k = i; k < nleft + i; k++, glyph_code++ ) + { + /* Make sure k is not too big. */ + if ( k < num_glyphs && glyph_code < 256 ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)k; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[k]; + } + } + } + + /* simple check; one never knows what can be found in a font */ + if ( encoding->count > 256 ) + encoding->count = 256; + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Parse supplemental encodings, if any. */ + if ( encoding->format & 0x80 ) + { + FT_UInt gindex; + + + /* count supplements */ + if ( FT_READ_BYTE( count ) ) + goto Exit; + + for ( j = 0; j < count; j++ ) + { + /* Read supplemental glyph code. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the SID associated with this glyph code. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = glyph_sid; + + /* First, look up GID which has been assigned to */ + /* SID glyph_sid. */ + for ( gindex = 0; gindex < num_glyphs; gindex++ ) + { + if ( charset->sids[gindex] == glyph_sid ) + { + encoding->codes[glyph_code] = (FT_UShort)gindex; + break; + } + } + } + } + } + else + { + /* We take into account the fact a CFF font can use a predefined */ + /* encoding without containing all of the glyphs encoded by this */ + /* encoding (see the note at the end of section 12 in the CFF */ + /* specification). */ + + switch ( (FT_UInt)offset ) + { + case 0: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); + goto Populate; + + case 1: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); + + Populate: + /* Construct code to GID mapping from code to SID mapping */ + /* and charset. */ + + encoding->offset = offset; /* used in cff_face_init */ + encoding->count = 0; + + error = cff_charset_compute_cids( charset, num_glyphs, + stream->memory ); + if ( error ) + goto Exit; + + for ( j = 0; j < 256; j++ ) + { + FT_UInt sid = encoding->sids[j]; + FT_UInt gid = 0; + + + if ( sid ) + gid = cff_charset_cid_to_gindex( charset, sid ); + + if ( gid != 0 ) + { + encoding->codes[j] = (FT_UShort)gid; + encoding->count = j + 1; + } + else + { + encoding->codes[j] = 0; + encoding->sids [j] = 0; + } + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + Exit: + + /* Clean up if there was an error. */ + return error; + } + + + /* Parse private dictionary; first call is always from `cff_face_init', */ + /* so NDV has not been set for CFF2 variation. */ + /* */ + /* `cff_slot_load' must call this function each time NDV changes. */ + FT_LOCAL_DEF( FT_Error ) + cff_load_private_dict( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + FT_Error error = FT_Err_Ok; + CFF_ParserRec parser; + CFF_FontRecDict top = &subfont->font_dict; + CFF_Private priv = &subfont->private_dict; + FT_Stream stream = font->stream; + FT_UInt stackSize; + + + /* store handle needed to access memory, vstore for blend; */ + /* we need this for clean-up even if there is no private DICT */ + subfont->blend.font = font; + subfont->blend.usedBV = FALSE; /* clear state */ + + if ( !top->private_offset || !top->private_size ) + goto Exit2; /* no private DICT, do nothing */ + + /* set defaults */ + FT_ZERO( priv ); + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = -1; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + /* provide inputs for blend calculations */ + priv->subfont = subfont; + subfont->lenNDV = lenNDV; + subfont->NDV = NDV; + + /* add 1 for the operator */ + stackSize = font->cff2 ? font->top_font.font_dict.maxstack + 1 + : CFF_MAX_STACK_DEPTH + 1; + + if ( cff_parser_init( &parser, + font->cff2 ? CFF2_CODE_PRIVATE : CFF_CODE_PRIVATE, + priv, + font->library, + stackSize, + top->num_designs, + top->num_axes ) ) + goto Exit; + + if ( FT_STREAM_SEEK( font->base_offset + top->private_offset ) || + FT_FRAME_ENTER( top->private_size ) ) + goto Exit; + + FT_TRACE4(( " private dictionary:\n" )); + error = cff_parser_run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + /* ensure that `num_blue_values' is even */ + priv->num_blue_values &= ~1; + + /* sanitize `initialRandomSeed' to be a positive value, if necessary; */ + /* this is not mandated by the specification but by our implementation */ + if ( priv->initial_random_seed < 0 ) + priv->initial_random_seed = -priv->initial_random_seed; + else if ( priv->initial_random_seed == 0 ) + priv->initial_random_seed = 987654321; + + /* some sanitizing to avoid overflows later on; */ + /* the upper limits are ad-hoc values */ + if ( priv->blue_shift > 1000 || priv->blue_shift < 0 ) + { + FT_TRACE2(( "cff_load_private_dict:" + " setting unlikely BlueShift value %ld to default (7)\n", + priv->blue_shift )); + priv->blue_shift = 7; + } + + if ( priv->blue_fuzz > 1000 || priv->blue_fuzz < 0 ) + { + FT_TRACE2(( "cff_load_private_dict:" + " setting unlikely BlueFuzz value %ld to default (1)\n", + priv->blue_fuzz )); + priv->blue_fuzz = 1; + } + + Exit: + /* clean up */ + cff_blend_clear( subfont ); /* clear blend stack */ + cff_parser_done( &parser ); /* free parser stack */ + + Exit2: + /* no clean up (parser not initialized) */ + return error; + } + + + /* There are 3 ways to call this function, distinguished by code. */ + /* */ + /* . CFF_CODE_TOPDICT for either a CFF Top DICT or a CFF Font DICT */ + /* . CFF2_CODE_TOPDICT for CFF2 Top DICT */ + /* . CFF2_CODE_FONTDICT for CFF2 Font DICT */ + + static FT_Error + cff_subfont_load( CFF_SubFont subfont, + CFF_Index idx, + FT_UInt font_index, + FT_Stream stream, + FT_ULong base_offset, + FT_UInt code, + CFF_Font font, + CFF_Face face ) + { + FT_Error error; + CFF_ParserRec parser; + FT_Byte* dict = NULL; + FT_ULong dict_len; + CFF_FontRecDict top = &subfont->font_dict; + CFF_Private priv = &subfont->private_dict; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Bool cff2 = FT_BOOL( code == CFF2_CODE_TOPDICT || + code == CFF2_CODE_FONTDICT ); + FT_UInt stackSize = cff2 ? CFF2_DEFAULT_STACK + : CFF_MAX_STACK_DEPTH; + + + /* Note: We use default stack size for CFF2 Font DICT because */ + /* Top and Font DICTs are not allowed to have blend operators. */ + error = cff_parser_init( &parser, + code, + top, + font->library, + stackSize, + 0, + 0 ); + if ( error ) + goto Exit; + + /* set defaults */ + FT_ZERO( top ); + + top->underline_position = -( 100L << 16 ); + top->underline_thickness = 50L << 16; + top->charstring_type = 2; + top->font_matrix.xx = 0x10000L; + top->font_matrix.yy = 0x10000L; + top->cid_count = 8720; + + /* we use the implementation specific SID value 0xFFFF to indicate */ + /* missing entries */ + top->version = 0xFFFFU; + top->notice = 0xFFFFU; + top->copyright = 0xFFFFU; + top->full_name = 0xFFFFU; + top->family_name = 0xFFFFU; + top->weight = 0xFFFFU; + top->embedded_postscript = 0xFFFFU; + + top->cid_registry = 0xFFFFU; + top->cid_ordering = 0xFFFFU; + top->cid_font_name = 0xFFFFU; + + /* set default stack size */ + top->maxstack = cff2 ? CFF2_DEFAULT_STACK : 48; + + if ( idx->count ) /* count is nonzero for a real index */ + error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + else + { + /* CFF2 has a fake top dict index; */ + /* simulate `cff_index_access_element' */ + + /* Note: macros implicitly use `stream' and set `error' */ + if ( FT_STREAM_SEEK( idx->data_offset ) || + FT_FRAME_EXTRACT( idx->data_size, dict ) ) + goto Exit; + + dict_len = idx->data_size; + } + + if ( !error ) + { + FT_TRACE4(( " top dictionary:\n" )); + error = cff_parser_run( &parser, dict, FT_OFFSET( dict, dict_len ) ); + } + + /* clean up regardless of error */ + if ( idx->count ) + cff_index_forget_element( idx, &dict ); + else + FT_FRAME_RELEASE( dict ); + + if ( error ) + goto Exit; + + /* if it is a CID font, we stop there */ + if ( top->cid_registry != 0xFFFFU ) + goto Exit; + + /* Parse the private dictionary, if any. */ + /* */ + /* CFF2 does not have a private dictionary in the Top DICT */ + /* but may have one in a Font DICT. We need to parse */ + /* the latter here in order to load any local subrs. */ + error = cff_load_private_dict( font, subfont, 0, 0 ); + if ( error ) + goto Exit; + + if ( !cff2 ) + { + /* + * Initialize the random number generator. + * + * - If we have a face-specific seed, use it. + * If non-zero, update it to a positive value. + * + * - Otherwise, use the seed from the CFF driver. + * If non-zero, update it to a positive value. + * + * - If the random value is zero, use the seed given by the subfont's + * `initialRandomSeed' value. + * + */ + if ( face->root.internal->random_seed == -1 ) + { + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face ); + + + subfont->random = (FT_UInt32)driver->random_seed; + if ( driver->random_seed ) + { + do + { + driver->random_seed = + (FT_Int32)psaux->cff_random( (FT_UInt32)driver->random_seed ); + + } while ( driver->random_seed < 0 ); + } + } + else + { + subfont->random = (FT_UInt32)face->root.internal->random_seed; + if ( face->root.internal->random_seed ) + { + do + { + face->root.internal->random_seed = + (FT_Int32)psaux->cff_random( + (FT_UInt32)face->root.internal->random_seed ); + + } while ( face->root.internal->random_seed < 0 ); + } + } + + if ( !subfont->random ) + subfont->random = (FT_UInt32)priv->initial_random_seed; + } + + /* read the local subrs, if any */ + if ( priv->local_subrs_offset ) + { + if ( FT_STREAM_SEEK( base_offset + top->private_offset + + priv->local_subrs_offset ) ) + goto Exit; + + error = cff_index_init( &subfont->local_subrs_index, stream, 1, cff2 ); + if ( error ) + goto Exit; + + error = cff_index_get_pointers( &subfont->local_subrs_index, + &subfont->local_subrs, NULL, NULL ); + if ( error ) + goto Exit; + } + + Exit: + cff_parser_done( &parser ); /* free parser stack */ + + return error; + } + + + static void + cff_subfont_done( FT_Memory memory, + CFF_SubFont subfont ) + { + if ( subfont ) + { + cff_index_done( &subfont->local_subrs_index ); + FT_FREE( subfont->local_subrs ); + + FT_FREE( subfont->blend.lastNDV ); + FT_FREE( subfont->blend.BV ); + FT_FREE( subfont->blend_stack ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + CFF_Face face, + FT_Bool pure_cff, + FT_Bool cff2 ) + { + static const FT_Frame_Field cff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRec + + FT_FRAME_START( 3 ), + FT_FRAME_BYTE( version_major ), + FT_FRAME_BYTE( version_minor ), + FT_FRAME_BYTE( header_size ), + FT_FRAME_END + }; + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong base_offset; + CFF_FontRecDict dict; + CFF_IndexRec string_index; + FT_UInt subfont_index; + + + FT_ZERO( font ); + FT_ZERO( &string_index ); + + dict = &font->top_font.font_dict; + base_offset = FT_STREAM_POS(); + + font->library = library; + font->stream = stream; + font->memory = memory; + font->cff2 = cff2; + font->base_offset = base_offset; + + /* read CFF font header */ + if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) + goto Exit; + + if ( cff2 ) + { + if ( font->version_major != 2 || + font->header_size < 5 ) + { + FT_TRACE2(( " not a CFF2 font header\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( FT_READ_USHORT( font->top_dict_length ) ) + goto Exit; + } + else + { + FT_Byte absolute_offset; + + + if ( FT_READ_BYTE( absolute_offset ) ) + goto Exit; + + if ( font->version_major != 1 || + font->header_size < 4 || + absolute_offset > 4 ) + { + FT_TRACE2(( " not a CFF font header\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + } + + /* skip the rest of the header */ + if ( FT_STREAM_SEEK( base_offset + font->header_size ) ) + { + /* For pure CFFs we have read only four bytes so far. Contrary to */ + /* other formats like SFNT those bytes doesn't define a signature; */ + /* it is thus possible that the font isn't a CFF at all. */ + if ( pure_cff ) + { + FT_TRACE2(( " not a CFF file\n" )); + error = FT_THROW( Unknown_File_Format ); + } + goto Exit; + } + + if ( cff2 ) + { + /* For CFF2, the top dict data immediately follow the header */ + /* and the length is stored in the header `offSize' field; */ + /* there is no index for it. */ + /* */ + /* Use the `font_dict_index' to save the current position */ + /* and length of data, but leave count at zero as an indicator. */ + FT_ZERO( &font->font_dict_index ); + + font->font_dict_index.data_offset = FT_STREAM_POS(); + font->font_dict_index.data_size = font->top_dict_length; + + /* skip the top dict data for now, we will parse it later */ + if ( FT_STREAM_SKIP( font->top_dict_length ) ) + goto Exit; + + /* next, read the global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1, cff2 ) ) ) + goto Exit; + } + else + { + /* for CFF, read the name, top dict, string and global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->name_index, + stream, 0, cff2 ) ) ) + { + if ( pure_cff ) + { + FT_TRACE2(( " not a CFF file\n" )); + error = FT_THROW( Unknown_File_Format ); + } + goto Exit; + } + + /* if we have an empty font name, */ + /* it must be the only font in the CFF */ + if ( font->name_index.count > 1 && + font->name_index.data_size < font->name_index.count ) + { + /* for pure CFFs, we still haven't checked enough bytes */ + /* to be sure that it is a CFF at all */ + error = pure_cff ? FT_THROW( Unknown_File_Format ) + : FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( FT_SET_ERROR( cff_index_init( &font->font_dict_index, + stream, 0, cff2 ) ) || + FT_SET_ERROR( cff_index_init( &string_index, + stream, 1, cff2 ) ) || + FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1, cff2 ) ) || + FT_SET_ERROR( cff_index_get_pointers( &string_index, + &font->strings, + &font->string_pool, + &font->string_pool_size ) ) ) + goto Exit; + + /* there must be a Top DICT index entry for each name index entry */ + if ( font->name_index.count > font->font_dict_index.count ) + { + FT_ERROR(( "cff_font_load:" + " not enough entries in Top DICT index\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + font->num_strings = string_index.count; + + if ( pure_cff ) + { + /* well, we don't really forget the `disabled' fonts... */ + subfont_index = (FT_UInt)( face_index & 0xFFFF ); + + if ( face_index > 0 && subfont_index >= font->name_index.count ) + { + FT_ERROR(( "cff_font_load:" + " invalid subfont index for pure CFF font (%d)\n", + subfont_index )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + font->num_faces = font->name_index.count; + } + else + { + subfont_index = 0; + + if ( font->name_index.count > 1 ) + { + FT_ERROR(( "cff_font_load:" + " invalid CFF font with multiple subfonts\n" )); + FT_ERROR(( " " + " in SFNT wrapper\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + /* in case of a font format check, simply exit now */ + if ( face_index < 0 ) + goto Exit; + + /* now, parse the top-level font dictionary */ + FT_TRACE4(( "parsing top-level\n" )); + error = cff_subfont_load( &font->top_font, + &font->font_dict_index, + subfont_index, + stream, + base_offset, + cff2 ? CFF2_CODE_TOPDICT : CFF_CODE_TOPDICT, + font, + face ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_index_init( &font->charstrings_index, stream, 0, cff2 ); + if ( error ) + goto Exit; + + /* now, check for a CID or CFF2 font */ + if ( dict->cid_registry != 0xFFFFU || + cff2 ) + { + CFF_IndexRec fd_index; + CFF_SubFont sub = NULL; + FT_UInt idx; + + + /* for CFF2, read the Variation Store if available; */ + /* this must follow the Top DICT parse and precede any Private DICT */ + error = cff_vstore_load( &font->vstore, + stream, + base_offset, + dict->vstore_offset ); + if ( error ) + goto Exit; + + /* this is a CID-keyed font, we must now allocate a table of */ + /* sub-fonts, then load each of them separately */ + if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) + goto Exit; + + error = cff_index_init( &fd_index, stream, 0, cff2 ); + if ( error ) + goto Exit; + + /* Font Dicts are not limited to 256 for CFF2. */ + /* TODO: support this for CFF2 */ + if ( fd_index.count > CFF_MAX_CID_FONTS ) + { + FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); + goto Fail_CID; + } + + /* allocate & read each font dict independently */ + font->num_subfonts = fd_index.count; + if ( FT_NEW_ARRAY( sub, fd_index.count ) ) + goto Fail_CID; + + /* set up pointer table */ + for ( idx = 0; idx < fd_index.count; idx++ ) + font->subfonts[idx] = sub + idx; + + /* now load each subfont independently */ + for ( idx = 0; idx < fd_index.count; idx++ ) + { + sub = font->subfonts[idx]; + FT_TRACE4(( "parsing subfont %u\n", idx )); + error = cff_subfont_load( sub, + &fd_index, + idx, + stream, + base_offset, + cff2 ? CFF2_CODE_FONTDICT + : CFF_CODE_TOPDICT, + font, + face ); + if ( error ) + goto Fail_CID; + } + + /* now load the FD Select array; */ + /* CFF2 omits FDSelect if there is only one FD */ + if ( !cff2 || fd_index.count > 1 ) + error = CFF_Load_FD_Select( &font->fd_select, + font->charstrings_index.count, + stream, + base_offset + dict->cid_fd_select_offset ); + + Fail_CID: + cff_index_done( &fd_index ); + + if ( error ) + goto Exit; + } + else + font->num_subfonts = 0; + + /* read the charstrings index now */ + if ( dict->charstrings_offset == 0 ) + { + FT_ERROR(( "cff_font_load: no charstrings offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + font->num_glyphs = font->charstrings_index.count; + + error = cff_index_get_pointers( &font->global_subrs_index, + &font->global_subrs, NULL, NULL ); + + if ( error ) + goto Exit; + + /* read the Charset and Encoding tables if available */ + if ( !cff2 && font->num_glyphs > 0 ) + { + FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); + + + error = cff_charset_load( &font->charset, font->num_glyphs, stream, + base_offset, dict->charset_offset, invert ); + if ( error ) + goto Exit; + + /* CID-keyed CFFs don't have an encoding */ + if ( dict->cid_registry == 0xFFFFU ) + { + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; + } + } + + /* get the font name (/CIDFontName for CID-keyed fonts, */ + /* /FontName otherwise) */ + font->font_name = cff_index_get_name( font, subfont_index ); + + Exit: + cff_index_done( &string_index ); + + return error; + } + + + FT_LOCAL_DEF( void ) + cff_font_done( CFF_Font font ) + { + FT_Memory memory = font->memory; + FT_UInt idx; + + + cff_index_done( &font->global_subrs_index ); + cff_index_done( &font->font_dict_index ); + cff_index_done( &font->name_index ); + cff_index_done( &font->charstrings_index ); + + /* release font dictionaries, but only if working with */ + /* a CID keyed CFF font or a CFF2 font */ + if ( font->num_subfonts > 0 ) + { + for ( idx = 0; idx < font->num_subfonts; idx++ ) + cff_subfont_done( memory, font->subfonts[idx] ); + + /* the subfonts array has been allocated as a single block */ + FT_FREE( font->subfonts[0] ); + } + + cff_encoding_done( &font->encoding ); + cff_charset_done( &font->charset, font->stream ); + cff_vstore_done( &font->vstore, memory ); + + cff_subfont_done( memory, &font->top_font ); + + CFF_Done_FD_Select( &font->fd_select, font->stream ); + + FT_FREE( font->font_info ); + + FT_FREE( font->font_name ); + FT_FREE( font->global_subrs ); + FT_FREE( font->strings ); + FT_FREE( font->string_pool ); + + if ( font->cf2_instance.finalizer ) + { + font->cf2_instance.finalizer( font->cf2_instance.data ); + FT_FREE( font->cf2_instance.data ); + } + + FT_FREE( font->font_extra ); + } + + +/* END */ diff --git a/external/freetype/src/cff/cffload.h b/external/freetype/src/cff/cffload.h new file mode 100644 index 000000000..b5286b0c8 --- /dev/null +++ b/external/freetype/src/cff/cffload.h @@ -0,0 +1,124 @@ +/**************************************************************************** + * + * cffload.h + * + * OpenType & CFF data/program tables loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFLOAD_H_ +#define CFFLOAD_H_ + + +#include <freetype/internal/cfftypes.h> +#include "cffparse.h" +#include <freetype/internal/cffotypes.h> /* for CFF_Face */ + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ); + + + FT_LOCAL( FT_String* ) + cff_index_get_string( CFF_Font font, + FT_UInt element ); + + FT_LOCAL( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ); + + + FT_LOCAL( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ); + + FT_LOCAL( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ); + + FT_LOCAL( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ); + + + FT_LOCAL( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ); + + + FT_LOCAL( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + CFF_Face face, + FT_Bool pure_cff, + FT_Bool cff2 ); + + FT_LOCAL( void ) + cff_font_done( CFF_Font font ); + + + FT_LOCAL( FT_Error ) + cff_load_private_dict( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Bool ) + cff_blend_check_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( FT_Error ) + cff_blend_build_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( void ) + cff_blend_clear( CFF_SubFont subFont ); + + FT_LOCAL( FT_Error ) + cff_blend_doBlend( CFF_SubFont subfont, + CFF_Parser parser, + FT_UInt numBlends ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_LOCAL( FT_Error ) + cff_get_var_blend( FT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + FT_LOCAL( void ) + cff_done_blend( FT_Face face ); +#endif + + +FT_END_HEADER + +#endif /* CFFLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cffobjs.c b/external/freetype/src/cff/cffobjs.c new file mode 100644 index 000000000..6d08620c4 --- /dev/null +++ b/external/freetype/src/cff/cffobjs.c @@ -0,0 +1,1204 @@ +/**************************************************************************** + * + * cffobjs.c + * + * OpenType objects manager (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftstream.h> +#include <freetype/fterrors.h> +#include <freetype/ttnameid.h> +#include <freetype/tttags.h> +#include <freetype/internal/sfnt.h> +#include <freetype/ftdriver.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/ftmm.h> +#include <freetype/internal/services/svmm.h> +#include <freetype/internal/services/svmetric.h> +#endif + +#include <freetype/internal/cffotypes.h> +#include "cffobjs.h" +#include "cffload.h" +#include "cffcmap.h" + +#include "cfferrs.h" + +#include <freetype/internal/psaux.h> +#include <freetype/internal/services/svcfftl.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cffobjs + + + /************************************************************************** + * + * SIZE FUNCTIONS + * + */ + + + static PSH_Globals_Funcs + cff_size_get_globals_funcs( CFF_Size size ) + { + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = font->pshinter; + FT_Module module; + + + module = FT_Get_Module( font->library, "pshinter" ); + + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cff_size_done( FT_Size cffsize ) /* CFF_Size */ + { + FT_Memory memory = cffsize->face->memory; + CFF_Size size = (CFF_Size)cffsize; + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)cffsize->internal->module_data; + + + if ( internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cff_size_get_globals_funcs( size ); + if ( funcs ) + { + FT_UInt i; + + + funcs->destroy( internal->topfont ); + + for ( i = font->num_subfonts; i > 0; i-- ) + funcs->destroy( internal->subfonts[i - 1] ); + } + + FT_FREE( internal ); + } + } + + + /* CFF and Type 1 private dictionaries have slightly different */ + /* structures; we need to synthesize a Type 1 dictionary on the fly */ + + static void + cff_make_private_dict( CFF_SubFont subfont, + PS_Private priv ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_ZERO( priv ); + + count = priv->num_blue_values = cpriv->num_blue_values; + for ( n = 0; n < count; n++ ) + priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; + + count = priv->num_other_blues = cpriv->num_other_blues; + for ( n = 0; n < count; n++ ) + priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; + + count = priv->num_family_blues = cpriv->num_family_blues; + for ( n = 0; n < count; n++ ) + priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; + + count = priv->num_family_other_blues = cpriv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; + + priv->blue_scale = cpriv->blue_scale; + priv->blue_shift = (FT_Int)cpriv->blue_shift; + priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; + + priv->standard_width[0] = (FT_UShort)cpriv->standard_width; + priv->standard_height[0] = (FT_UShort)cpriv->standard_height; + + count = priv->num_snap_widths = cpriv->num_snap_widths; + for ( n = 0; n < count; n++ ) + priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; + + count = priv->num_snap_heights = cpriv->num_snap_heights; + for ( n = 0; n < count; n++ ) + priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; + + priv->force_bold = cpriv->force_bold; + priv->language_group = cpriv->language_group; + priv->lenIV = cpriv->lenIV; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_size_init( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + FT_Error error = FT_Err_Ok; + PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); + + FT_Memory memory = cffsize->face->memory; + CFF_Internal internal = NULL; + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_Font)face->extra.data; + + PS_PrivateRec priv; + + FT_UInt i; + + if ( !funcs ) + goto Exit; + + if ( FT_NEW( internal ) ) + goto Exit; + + cff_make_private_dict( &font->top_font, &priv ); + error = funcs->create( memory, &priv, &internal->topfont ); + if ( error ) + goto Exit; + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + + + cff_make_private_dict( sub, &priv ); + error = funcs->create( memory, &priv, &internal->subfonts[i - 1] ); + if ( error ) + goto Exit; + } + + cffsize->internal->module_data = internal; + + size->strike_index = 0xFFFFFFFFUL; + + Exit: + if ( error ) + { + if ( internal ) + { + for ( i = font->num_subfonts; i > 0; i-- ) + FT_FREE( internal->subfonts[i - 1] ); + FT_FREE( internal->topfont ); + } + + FT_FREE( internal ); + } + + return error; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + + cffsize->strike_index = strike_index; + + FT_Select_Metrics( size->face, strike_index ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face face = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal->module_data; + + FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return FT_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + FT_LOCAL_DEF( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ) + { + FT_Error error; + + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + CFF_Face cffface = (CFF_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + FT_ULong strike_index; + + + if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) + cffsize->strike_index = 0xFFFFFFFFUL; + else + return cff_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + error = FT_Request_Metrics( size->face, req ); + if ( error ) + goto Exit; + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face cffface = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)cffface->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal->module_data; + + FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + Exit: + return error; + } + + + /************************************************************************** + * + * SLOT FUNCTIONS + * + */ + + FT_LOCAL_DEF( void ) + cff_slot_done( FT_GlyphSlot slot ) + { + if ( slot->internal ) + slot->internal->glyph_hints = NULL; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ) + { + CFF_Face face = (CFF_Face)slot->face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = font->pshinter; + + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->library, "pshinter" ); + if ( module ) + { + T2_Hints_Funcs funcs; + + + funcs = pshinter->get_t2_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * FACE FUNCTIONS + * + */ + + static FT_String* + cff_strcpy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result; + + + FT_MEM_STRDUP( result, source ); + + return result; + } + + + /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ + /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ + /* have been seen in the wild. */ + + static void + remove_subset_prefix( FT_String* name ) + { + FT_Int32 idx = 0; + FT_Int32 length = (FT_Int32)ft_strlen( name ) + 1; + FT_Bool continue_search = 1; + + + while ( continue_search ) + { + if ( length >= 7 && name[6] == '+' ) + { + for ( idx = 0; idx < 6; idx++ ) + { + /* ASCII uppercase letters */ + if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) + continue_search = 0; + } + + if ( continue_search ) + { + for ( idx = 7; idx < length; idx++ ) + name[idx - 7] = name[idx]; + length -= 7; + } + } + else + continue_search = 0; + } + } + + + /* Remove the style part from the family name (if present). */ + + static void + remove_style( FT_String* family_name, + const FT_String* style_name ) + { + FT_Int32 family_name_length, style_name_length; + + + family_name_length = (FT_Int32)ft_strlen( family_name ); + style_name_length = (FT_Int32)ft_strlen( style_name ); + + if ( family_name_length > style_name_length ) + { + FT_Int idx; + + + for ( idx = 1; idx <= style_name_length; idx++ ) + { + if ( family_name[family_name_length - idx] != + style_name[style_name_length - idx] ) + break; + } + + if ( idx > style_name_length ) + { + /* family_name ends with style_name; remove it */ + idx = family_name_length - style_name_length - 1; + + /* also remove special characters */ + /* between real family name and style */ + while ( idx > 0 && + ( family_name[idx] == '-' || + family_name[idx] == ' ' || + family_name[idx] == '_' || + family_name[idx] == '+' ) ) + idx--; + + if ( idx > 0 ) + family_name[idx + 1] = '\0'; + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face cffface, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CFF_Face face = (CFF_Face)cffface; + FT_Error error; + SFNT_Service sfnt; + FT_Service_PsCMaps psnames; + PSHinter_Service pshinter; + PSAux_Service psaux; + FT_Service_CFFLoad cffload; + FT_Bool pure_cff = 1; + FT_Bool cff2 = 0; + FT_Bool sfnt_format = 0; + FT_Library library = cffface->driver->root.library; + + + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, + "sfnt" ); + if ( !sfnt ) + { + FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + + pshinter = (PSHinter_Service)FT_Get_Module_Interface( library, + "pshinter" ); + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, + "psaux" ); + if ( !psaux ) + { + FT_ERROR(( "cff_face_init: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + face->psaux = psaux; + + FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD ); + + FT_TRACE2(( "CFF driver\n" )); + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check whether we have a valid OpenType file */ + FT_TRACE2(( " " )); + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( !error ) + { + if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ + { + FT_TRACE2(( " not an OpenType/CFF font\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* if we are performing a simple font format check, exit immediately */ + if ( face_index < 0 ) + return FT_Err_Ok; + + sfnt_format = 1; + + /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ + /* font; in the latter case it doesn't have a `head' table */ + error = face->goto_table( face, TTAG_head, stream, 0 ); + if ( !error ) + { + pure_cff = 0; + + /* load font directory */ + error = sfnt->load_face( stream, face, face_index, + num_params, params ); + if ( error ) + goto Exit; + } + else + { + /* load the `cmap' table explicitly */ + error = sfnt->load_cmap( face, stream ); + if ( error ) + goto Exit; + } + + /* now load the CFF part of the file; */ + /* give priority to CFF2 */ + error = face->goto_table( face, TTAG_CFF2, stream, 0 ); + if ( !error ) + { + cff2 = 1; + face->is_cff2 = cff2; + } + + if ( FT_ERR_EQ( error, Table_Missing ) ) + error = face->goto_table( face, TTAG_CFF, stream, 0 ); + + if ( error ) + goto Exit; + } + else + { + /* rewind to start of file; we are going to load a pure-CFF font */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + error = FT_Err_Ok; + } + + /* now load and parse the CFF table in the file */ + { + CFF_Font cff = NULL; + CFF_FontRecDict dict; + FT_Memory memory = cffface->memory; + FT_Int32 flags; + FT_UInt i; + + + if ( FT_NEW( cff ) ) + goto Exit; + + face->extra.data = cff; + error = cff_font_load( library, + stream, + face_index, + cff, + face, + pure_cff, + cff2 ); + if ( error ) + goto Exit; + + /* if we are performing a simple font format check, exit immediately */ + /* (this is here for pure CFF) */ + if ( face_index < 0 ) + { + cffface->num_faces = (FT_Long)cff->num_faces; + return FT_Err_Ok; + } + + cff->pshinter = pshinter; + cff->psnames = psnames; + cff->cffload = cffload; + + cffface->face_index = face_index & 0xFFFF; + + /* Complement the root flags with some interesting information. */ + /* Note that this is only necessary for pure CFF and CEF fonts; */ + /* SFNT based fonts use the `name' table instead. */ + + cffface->num_glyphs = (FT_Long)cff->num_glyphs; + + dict = &cff->top_font.font_dict; + + /* we need the `psnames' module for CFF and CEF formats */ + /* which aren't CID-keyed */ + if ( dict->cid_registry == 0xFFFFU && !psnames ) + { + FT_ERROR(( "cff_face_init:" + " cannot open CFF & CEF fonts\n" )); + FT_ERROR(( " " + " without the `psnames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt idx; + FT_String* s; + + + FT_TRACE4(( "SIDs\n" )); + + /* dump string index, including default strings for convenience */ + for ( idx = 0; idx <= 390; idx++ ) + { + s = cff_index_get_sid_string( cff, idx ); + if ( s ) + FT_TRACE4(( " %5d %s\n", idx, s )); + } + + /* In Multiple Master CFFs, two SIDs hold the Normalize Design */ + /* Vector (NDV) and Convert Design Vector (CDV) charstrings, */ + /* which may contain null bytes in the middle of the data, too. */ + /* We thus access `cff->strings' directly. */ + for ( idx = 1; idx < cff->num_strings; idx++ ) + { + FT_Byte* s1 = cff->strings[idx - 1]; + FT_Byte* s2 = cff->strings[idx]; + FT_PtrDist s1len = s2 - s1 - 1; /* without the final null byte */ + FT_PtrDist l; + + + FT_TRACE4(( " %5d ", idx + 390 )); + for ( l = 0; l < s1len; l++ ) + FT_TRACE4(( "%c", s1[l] )); + FT_TRACE4(( "\n" )); + } + + /* print last element */ + if ( cff->num_strings ) + { + FT_Byte* s1 = cff->strings[cff->num_strings - 1]; + FT_Byte* s2 = cff->string_pool + cff->string_pool_size; + FT_PtrDist s1len = s2 - s1 - 1; + FT_PtrDist l; + + + FT_TRACE4(( " %5d ", cff->num_strings + 390 )); + for ( l = 0; l < s1len; l++ ) + FT_TRACE4(( "%c", s1[l] )); + FT_TRACE4(( "\n" )); + } + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_UInt instance_index = (FT_UInt)face_index >> 16; + + + if ( FT_HAS_MULTIPLE_MASTERS( cffface ) && + instance_index > 0 ) + { + error = FT_Set_Named_Instance( cffface, instance_index ); + if ( error ) + goto Exit; + } + } +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( !dict->has_font_matrix ) + dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; + + /* Normalize the font matrix so that `matrix->yy' is 1; if */ + /* it is zero, we use `matrix->yx' instead. The scaling is */ + /* done with `units_per_em' then (at this point, it already */ + /* contains the scaling factor, but without normalization */ + /* of the matrix). */ + /* */ + /* Note that the offsets must be expressed in integer font */ + /* units. */ + + { + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Fixed temp; + + + temp = matrix->yy ? FT_ABS( matrix->yy ) + : FT_ABS( matrix->yx ); + + if ( temp != 0x10000L ) + { + *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + for ( i = cff->num_subfonts; i > 0; i-- ) + { + CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; + CFF_FontRecDict top = &cff->top_font.font_dict; + + FT_Matrix* matrix; + FT_Vector* offset; + FT_ULong* upm; + FT_Fixed temp; + + + if ( sub->has_font_matrix ) + { + FT_Long scaling; + + + /* if we have a top-level matrix, */ + /* concatenate the subfont matrix */ + + if ( top->has_font_matrix ) + { + if ( top->units_per_em > 1 && sub->units_per_em > 1 ) + scaling = (FT_Long)FT_MIN( top->units_per_em, + sub->units_per_em ); + else + scaling = 1; + + FT_Matrix_Multiply_Scaled( &top->font_matrix, + &sub->font_matrix, + scaling ); + FT_Vector_Transform_Scaled( &sub->font_offset, + &top->font_matrix, + scaling ); + + sub->units_per_em = (FT_ULong) + FT_MulDiv( (FT_Long)sub->units_per_em, + (FT_Long)top->units_per_em, + scaling ); + } + } + else + { + sub->font_matrix = top->font_matrix; + sub->font_offset = top->font_offset; + + sub->units_per_em = top->units_per_em; + } + + matrix = &sub->font_matrix; + offset = &sub->font_offset; + upm = &sub->units_per_em; + + temp = matrix->yy ? FT_ABS( matrix->yy ) + : FT_ABS( matrix->yx ); + + + if ( temp != 0x10000L ) + { + *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + if ( pure_cff ) + { + char* style_name = NULL; + + + /* set up num_faces */ + cffface->num_faces = (FT_Long)cff->num_faces; + + /* compute number of glyphs */ + if ( dict->cid_registry != 0xFFFFU ) + cffface->num_glyphs = (FT_Long)( cff->charset.max_cid + 1 ); + else + cffface->num_glyphs = (FT_Long)cff->charstrings_index.count; + + /* set global bbox, as well as EM size */ + cffface->bbox.xMin = dict->font_bbox.xMin >> 16; + cffface->bbox.yMin = dict->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; + cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; + + cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); + + cffface->ascender = (FT_Short)( cffface->bbox.yMax ); + cffface->descender = (FT_Short)( cffface->bbox.yMin ); + + cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); + if ( cffface->height < cffface->ascender - cffface->descender ) + cffface->height = (FT_Short)( cffface->ascender - + cffface->descender ); + + cffface->underline_position = + (FT_Short)( dict->underline_position >> 16 ); + cffface->underline_thickness = + (FT_Short)( dict->underline_thickness >> 16 ); + + /* retrieve font family & style name */ + if ( dict->family_name ) + { + char* family_name; + + + family_name = cff_index_get_sid_string( cff, dict->family_name ); + if ( family_name ) + cffface->family_name = cff_strcpy( memory, family_name ); + } + + if ( !cffface->family_name ) + { + cffface->family_name = cff_index_get_name( + cff, + (FT_UInt)( face_index & 0xFFFF ) ); + if ( cffface->family_name ) + remove_subset_prefix( cffface->family_name ); + } + + if ( cffface->family_name ) + { + char* full = cff_index_get_sid_string( cff, + dict->full_name ); + char* fullp = full; + char* family = cffface->family_name; + + + /* We try to extract the style name from the full name. */ + /* We need to ignore spaces and dashes during the search. */ + if ( full && family ) + { + while ( *fullp ) + { + /* skip common characters at the start of both strings */ + if ( *fullp == *family ) + { + family++; + fullp++; + continue; + } + + /* ignore spaces and dashes in full name during comparison */ + if ( *fullp == ' ' || *fullp == '-' ) + { + fullp++; + continue; + } + + /* ignore spaces and dashes in family name during comparison */ + if ( *family == ' ' || *family == '-' ) + { + family++; + continue; + } + + if ( !*family && *fullp ) + { + /* The full name begins with the same characters as the */ + /* family name, with spaces and dashes removed. In this */ + /* case, the remaining string in `fullp' will be used as */ + /* the style name. */ + style_name = cff_strcpy( memory, fullp ); + + /* remove the style part from the family name (if present) */ + if ( style_name ) + remove_style( cffface->family_name, style_name ); + } + break; + } + } + } + else + { + char *cid_font_name = + cff_index_get_sid_string( cff, + dict->cid_font_name ); + + + /* do we have a `/FontName' for a CID-keyed font? */ + if ( cid_font_name ) + cffface->family_name = cff_strcpy( memory, cid_font_name ); + } + + if ( style_name ) + cffface->style_name = style_name; + else + /* assume "Regular" style if we don't know better */ + cffface->style_name = cff_strcpy( memory, "Regular" ); + + /******************************************************************** + * + * Compute face flags. + */ + flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( sfnt_format ) + flags |= FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ +#if 0 + /* kerning available? */ + if ( face->kern_pairs ) + flags |= FT_FACE_FLAG_KERNING; +#endif + + cffface->face_flags |= flags; + + /******************************************************************** + * + * Compute style flags. + */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + { + char *weight = cff_index_get_sid_string( cff, + dict->weight ); + + + if ( weight ) + if ( !ft_strcmp( weight, "Bold" ) || + !ft_strcmp( weight, "Black" ) ) + flags |= FT_STYLE_FLAG_BOLD; + } + + /* double check */ + if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) + if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || + !ft_strncmp( cffface->style_name, "Black", 5 ) ) + flags |= FT_STYLE_FLAG_BOLD; + + cffface->style_flags = flags; + } + + /* CID-keyed CFF or CFF2 fonts don't have glyph names -- the SFNT */ + /* loader has unset this flag because of the 3.0 `post' table. */ + if ( dict->cid_registry == 0xFFFFU && !cff2 ) + cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; + + if ( dict->cid_registry != 0xFFFFU && pure_cff ) + cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; + + /******************************************************************** + * + * Compute char maps. + */ + + /* Try to synthesize a Unicode charmap if there is none available */ + /* already. If an OpenType font contains a Unicode "cmap", we */ + /* will use it, whatever be in the CFF part of the file. */ + { + FT_CharMapRec cmaprec; + FT_CharMap cmap; + FT_Int nn; + CFF_Encoding encoding = &cff->encoding; + + + for ( nn = 0; nn < cffface->num_charmaps; nn++ ) + { + cmap = cffface->charmaps[nn]; + + /* Windows Unicode? */ + if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && + cmap->encoding_id == TT_MS_ID_UNICODE_CS ) + goto Skip_Unicode; + + /* Apple Unicode platform id? */ + if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) + goto Skip_Unicode; /* Apple Unicode */ + } + + /* since CID-keyed fonts don't contain glyph names, we can't */ + /* construct a cmap */ + if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) + goto Exit; + + /* we didn't find a Unicode charmap -- synthesize one */ + cmaprec.face = cffface; + cmaprec.platform_id = TT_PLATFORM_MICROSOFT; + cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; + cmaprec.encoding = FT_ENCODING_UNICODE; + + nn = cffface->num_charmaps; + + error = FT_CMap_New( &cff_cmap_unicode_class_rec, NULL, + &cmaprec, NULL ); + if ( error && + FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) && + FT_ERR_NEQ( error, Unimplemented_Feature ) ) + goto Exit; + error = FT_Err_Ok; + + /* if no Unicode charmap was previously selected, select this one */ + if ( !cffface->charmap && nn != cffface->num_charmaps ) + cffface->charmap = cffface->charmaps[nn]; + + Skip_Unicode: + if ( encoding->count > 0 ) + { + FT_CMap_Class clazz; + + + cmaprec.face = cffface; + cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ + + if ( encoding->offset == 0 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; + cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; + clazz = &cff_cmap_encoding_class_rec; + } + else if ( encoding->offset == 1 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; + cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; + clazz = &cff_cmap_encoding_class_rec; + } + else + { + cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; + cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; + clazz = &cff_cmap_encoding_class_rec; + } + + error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_face_done( FT_Face cffface ) /* CFF_Face */ + { + CFF_Face face = (CFF_Face)cffface; + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = cffface->memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + cff_font_done( cff ); + FT_FREE( face->extra.data ); + } + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + cff_done_blend( cffface ); + face->blend = NULL; +#endif + } + + + FT_LOCAL_DEF( FT_Error ) + cff_driver_init( FT_Module module ) /* CFF_Driver */ + { + PS_Driver driver = (PS_Driver)module; + + FT_UInt32 seed; + + + /* set default property values, cf. `ftcffdrv.h' */ + driver->hinting_engine = FT_HINTING_ADOBE; + + driver->no_stem_darkening = TRUE; + + driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; + driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; + driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; + driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; + driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; + driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; + driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; + driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&module ^ + (FT_Offset)(char*)module->memory ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + + driver->random_seed = (FT_Int32)seed; + if ( driver->random_seed < 0 ) + driver->random_seed = -driver->random_seed; + else if ( driver->random_seed == 0 ) + driver->random_seed = 123456789; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cff_driver_done( FT_Module module ) /* CFF_Driver */ + { + FT_UNUSED( module ); + } + + +/* END */ diff --git a/external/freetype/src/cff/cffobjs.h b/external/freetype/src/cff/cffobjs.h new file mode 100644 index 000000000..8f05f6132 --- /dev/null +++ b/external/freetype/src/cff/cffobjs.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * cffobjs.h + * + * OpenType objects manager (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFOBJS_H_ +#define CFFOBJS_H_ + + + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + cff_size_init( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( void ) + cff_size_done( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ); + +#endif + + FT_LOCAL( void ) + cff_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ); + + + /************************************************************************** + * + * Face functions + */ + FT_LOCAL( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face face, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cff_face_done( FT_Face face ); /* CFF_Face */ + + + /************************************************************************** + * + * Driver functions + */ + FT_LOCAL( FT_Error ) + cff_driver_init( FT_Module module ); /* PS_Driver */ + + FT_LOCAL( void ) + cff_driver_done( FT_Module module ); /* PS_Driver */ + + +FT_END_HEADER + +#endif /* CFFOBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cffparse.c b/external/freetype/src/cff/cffparse.c new file mode 100644 index 000000000..3b076704c --- /dev/null +++ b/external/freetype/src/cff/cffparse.c @@ -0,0 +1,1513 @@ +/**************************************************************************** + * + * cffparse.c + * + * CFF token stream parser (body) + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "cffparse.h" +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/psaux.h> +#include <freetype/ftlist.h> + +#include "cfferrs.h" +#include "cffload.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cffparse + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library, + FT_UInt stackSize, + FT_UShort num_designs, + FT_UShort num_axes ) + { + FT_Memory memory = library->memory; /* for FT_NEW_ARRAY */ + FT_Error error; /* for FT_NEW_ARRAY */ + + + FT_ZERO( parser ); + +#if 0 + parser->top = parser->stack; +#endif + parser->object_code = code; + parser->object = object; + parser->library = library; + parser->num_designs = num_designs; + parser->num_axes = num_axes; + + /* allocate the stack buffer */ + if ( FT_QNEW_ARRAY( parser->stack, stackSize ) ) + goto Exit; + + parser->stackSize = stackSize; + parser->top = parser->stack; /* empty stack */ + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_parser_done( CFF_Parser parser ) + { + FT_Memory memory = parser->library->memory; /* for FT_FREE */ + + + FT_FREE( parser->stack ); + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_List_Finalize( &parser->t2_strings, NULL, memory, NULL ); +#endif + } + + + /* The parser limit checks in the next two functions are supposed */ + /* to detect the immediate crossing of the stream boundary. They */ + /* shall not be triggered from the distant t2_strings buffers. */ + + /* read an integer */ + static FT_Long + cff_parse_integer( FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Int v = *p++; + FT_Long val = 0; + + + if ( v == 28 ) + { + if ( p + 2 > limit && limit >= p ) + goto Bad; + + val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); + } + else if ( v == 29 ) + { + if ( p + 4 > limit && limit >= p ) + goto Bad; + + val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | + ( (FT_ULong)p[1] << 16 ) | + ( (FT_ULong)p[2] << 8 ) | + (FT_ULong)p[3] ); + } + else if ( v < 247 ) + { + val = v - 139; + } + else if ( v < 251 ) + { + if ( p + 1 > limit && limit >= p ) + goto Bad; + + val = ( v - 247 ) * 256 + p[0] + 108; + } + else + { + if ( p + 1 > limit && limit >= p ) + goto Bad; + + val = -( v - 251 ) * 256 - p[0] - 108; + } + + Exit: + return val; + + Bad: + val = 0; + FT_TRACE4(( "!!!END OF DATA:!!!" )); + goto Exit; + } + + + static const FT_Long power_tens[] = + { + 1L, + 10L, + 100L, + 1000L, + 10000L, + 100000L, + 1000000L, + 10000000L, + 100000000L, + 1000000000L + }; + + /* maximum values allowed for multiplying */ + /* with the corresponding `power_tens' element */ + static const FT_Long power_ten_limits[] = + { + FT_LONG_MAX / 1L, + FT_LONG_MAX / 10L, + FT_LONG_MAX / 100L, + FT_LONG_MAX / 1000L, + FT_LONG_MAX / 10000L, + FT_LONG_MAX / 100000L, + FT_LONG_MAX / 1000000L, + FT_LONG_MAX / 10000000L, + FT_LONG_MAX / 100000000L, + FT_LONG_MAX / 1000000000L, + }; + + + /* read a real */ + static FT_Fixed + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Long power_ten, + FT_Long* scaling ) + { + FT_Byte* p = start; + FT_Int nib; + FT_UInt phase; + + FT_Long result, number, exponent; + FT_Int sign = 0, exponent_sign = 0, have_overflow = 0; + FT_Long exponent_add, integer_length, fraction_length; + + + if ( scaling ) + *scaling = 0; + + result = 0; + + number = 0; + exponent = 0; + + exponent_add = 0; + integer_length = 0; + fraction_length = 0; + + /* First of all, read the integer part. */ + phase = 4; + + for (;;) + { + /* If we entered this iteration with phase == 4, we need to */ + /* read a new byte. This also skips past the initial 0x1E. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p + 1 > limit && limit >= p ) + goto Bad; + } + + /* Get the nibble. */ + nib = (FT_Int)( p[0] >> phase ) & 0xF; + phase = 4 - phase; + + if ( nib == 0xE ) + sign = 1; + else if ( nib > 9 ) + break; + else + { + /* Increase exponent if we can't add the digit. */ + if ( number >= 0xCCCCCCCL ) + exponent_add++; + /* Skip leading zeros. */ + else if ( nib || number ) + { + integer_length++; + number = number * 10 + nib; + } + } + } + + /* Read fraction part, if any. */ + if ( nib == 0xA ) + for (;;) + { + /* If we entered this iteration with phase == 4, we need */ + /* to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p + 1 > limit && limit >= p ) + goto Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Skip leading zeros if possible. */ + if ( !nib && !number ) + exponent_add--; + /* Only add digit if we don't overflow. */ + else if ( number < 0xCCCCCCCL && fraction_length < 9 ) + { + fraction_length++; + number = number * 10 + nib; + } + } + + /* Read exponent, if any. */ + if ( nib == 12 ) + { + exponent_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + for (;;) + { + /* If we entered this iteration with phase == 4, */ + /* we need to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p + 1 > limit && limit >= p ) + goto Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Arbitrarily limit exponent. */ + if ( exponent > 1000 ) + have_overflow = 1; + else + exponent = exponent * 10 + nib; + } + + if ( exponent_sign ) + exponent = -exponent; + } + + if ( !number ) + goto Exit; + + if ( have_overflow ) + { + if ( exponent_sign ) + goto Underflow; + else + goto Overflow; + } + + /* We don't check `power_ten' and `exponent_add'. */ + exponent += power_ten + exponent_add; + + if ( scaling ) + { + /* Only use `fraction_length'. */ + fraction_length += integer_length; + exponent += integer_length; + + if ( fraction_length <= 5 ) + { + if ( number > 0x7FFFL ) + { + result = FT_DivFix( number, 10 ); + *scaling = exponent - fraction_length + 1; + } + else + { + if ( exponent > 0 ) + { + FT_Long new_fraction_length, shift; + + + /* Make `scaling' as small as possible. */ + new_fraction_length = FT_MIN( exponent, 5 ); + shift = new_fraction_length - fraction_length; + + if ( shift > 0 ) + { + exponent -= new_fraction_length; + number *= power_tens[shift]; + if ( number > 0x7FFFL ) + { + number /= 10; + exponent += 1; + } + } + else + exponent -= fraction_length; + } + else + exponent -= fraction_length; + + result = (FT_Long)( (FT_ULong)number << 16 ); + *scaling = exponent; + } + } + else + { + if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) + { + result = FT_DivFix( number, power_tens[fraction_length - 4] ); + *scaling = exponent - 4; + } + else + { + result = FT_DivFix( number, power_tens[fraction_length - 5] ); + *scaling = exponent - 5; + } + } + } + else + { + integer_length += exponent; + fraction_length -= exponent; + + if ( integer_length > 5 ) + goto Overflow; + if ( integer_length < -5 ) + goto Underflow; + + /* Remove non-significant digits. */ + if ( integer_length < 0 ) + { + number /= power_tens[-integer_length]; + fraction_length += integer_length; + } + + /* this can only happen if exponent was non-zero */ + if ( fraction_length == 10 ) + { + number /= 10; + fraction_length -= 1; + } + + /* Convert into 16.16 format. */ + if ( fraction_length > 0 ) + { + if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) + goto Exit; + + result = FT_DivFix( number, power_tens[fraction_length] ); + } + else + { + number *= power_tens[-fraction_length]; + + if ( number > 0x7FFFL ) + goto Overflow; + + result = (FT_Long)( (FT_ULong)number << 16 ); + } + } + + Exit: + if ( sign ) + result = -result; + + return result; + + Overflow: + result = 0x7FFFFFFFL; + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + goto Exit; + + Underflow: + result = 0; + FT_TRACE4(( "!!!UNDERFLOW:!!!" )); + goto Exit; + + Bad: + result = 0; + FT_TRACE4(( "!!!END OF DATA:!!!" )); + goto Exit; + } + + + /* read a number, either integer or real */ + FT_LOCAL_DEF( FT_Long ) + cff_parse_num( CFF_Parser parser, + FT_Byte** d ) + { + if ( **d == 30 ) + { + /* binary-coded decimal is truncated to integer */ + return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; + } + + else if ( **d == 255 ) + { + /* 16.16 fixed-point is used internally for CFF2 blend results. */ + /* Since these are trusted values, a limit check is not needed. */ + + /* After the 255, 4 bytes give the number. */ + /* The blend value is converted to integer, with rounding; */ + /* due to the right-shift we don't need the lowest byte. */ +#if 0 + return (FT_Short)( + ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | + (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 ); +#else + return (FT_Short)( + ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 8 ) | + (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 ); +#endif + } + + else + return cff_parse_integer( *d, parser->limit ); + } + + + /* read a floating point number, either integer or real */ + static FT_Fixed + do_fixed( CFF_Parser parser, + FT_Byte** d, + FT_Long scaling ) + { + if ( **d == 30 ) + return cff_parse_real( *d, parser->limit, scaling, NULL ); + else if ( **d == 255 ) + { + FT_Fixed val = ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | + (FT_UInt32)*( d[0] + 4 ) ) ); + + if ( scaling ) + { + if ( FT_ABS( val ) > power_ten_limits[scaling] ) + { + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + return val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; + } + val *= power_tens[scaling]; + } + return val; + } + else + { + FT_Long val = cff_parse_integer( *d, parser->limit ); + + + if ( scaling ) + { + if ( ( FT_ABS( val ) << 16 ) > power_ten_limits[scaling] ) + { + val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; + goto Overflow; + } + + val *= power_tens[scaling]; + } + + if ( val > 0x7FFF ) + { + val = 0x7FFFFFFFL; + goto Overflow; + } + else if ( val < -0x7FFF ) + { + val = -0x7FFFFFFFL; + goto Overflow; + } + + return (FT_Long)( (FT_ULong)val << 16 ); + + Overflow: + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + return val; + } + } + + + /* read a floating point number, either integer or real */ + FT_LOCAL_DEF( FT_Fixed ) + cff_parse_fixed( CFF_Parser parser, + FT_Byte** d ) + { + return do_fixed( parser, d, 0 ); + } + + + /* read a floating point number, either integer or real, */ + /* but return `10^scaling' times the number read in */ + static FT_Fixed + cff_parse_fixed_scaled( CFF_Parser parser, + FT_Byte** d, + FT_Long scaling ) + { + return do_fixed( parser, d, scaling ); + } + + + /* read a floating point number, either integer or real, */ + /* and return it as precise as possible -- `scaling' returns */ + /* the scaling factor (as a power of 10) */ + static FT_Fixed + cff_parse_fixed_dynamic( CFF_Parser parser, + FT_Byte** d, + FT_Long* scaling ) + { + FT_ASSERT( scaling ); + + if ( **d == 30 ) + return cff_parse_real( *d, parser->limit, 0, scaling ); + else + { + FT_Long number; + FT_Int integer_length; + + + number = cff_parse_integer( *d, parser->limit ); + + if ( number > 0x7FFFL ) + { + for ( integer_length = 5; integer_length < 10; integer_length++ ) + if ( number < power_tens[integer_length] ) + break; + + if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) + { + *scaling = integer_length - 4; + return FT_DivFix( number, power_tens[integer_length - 4] ); + } + else + { + *scaling = integer_length - 5; + return FT_DivFix( number, power_tens[integer_length - 5] ); + } + } + else + { + *scaling = 0; + return (FT_Long)( (FT_ULong)number << 16 ); + } + } + } + + + static FT_Error + cff_parse_font_matrix( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Byte** data = parser->stack; + + + if ( parser->top >= parser->stack + 6 ) + { + FT_Fixed values[6]; + FT_Long scalings[6]; + + FT_Long min_scaling, max_scaling; + int i; + + + dict->has_font_matrix = TRUE; + + /* We expect a well-formed font matrix, that is, the matrix elements */ + /* `xx' and `yy' are of approximately the same magnitude. To avoid */ + /* loss of precision, we use the magnitude of the largest matrix */ + /* element to scale all other elements. The scaling factor is then */ + /* contained in the `units_per_em' value. */ + + max_scaling = FT_LONG_MIN; + min_scaling = FT_LONG_MAX; + + for ( i = 0; i < 6; i++ ) + { + values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] ); + if ( values[i] ) + { + if ( scalings[i] > max_scaling ) + max_scaling = scalings[i]; + if ( scalings[i] < min_scaling ) + min_scaling = scalings[i]; + } + } + + if ( max_scaling < -9 || + max_scaling > 0 || + ( max_scaling - min_scaling ) < 0 || + ( max_scaling - min_scaling ) > 9 ) + { + FT_TRACE1(( "cff_parse_font_matrix:" + " strange scaling values (minimum %ld, maximum %ld),\n", + min_scaling, max_scaling )); + FT_TRACE1(( " " + " using default matrix\n" )); + goto Unlikely; + } + + for ( i = 0; i < 6; i++ ) + { + FT_Fixed value = values[i]; + FT_Long divisor, half_divisor; + + + if ( !value ) + continue; + + divisor = power_tens[max_scaling - scalings[i]]; + half_divisor = divisor >> 1; + + if ( value < 0 ) + { + if ( FT_LONG_MIN + half_divisor < value ) + values[i] = ( value - half_divisor ) / divisor; + else + values[i] = FT_LONG_MIN / divisor; + } + else + { + if ( FT_LONG_MAX - half_divisor > value ) + values[i] = ( value + half_divisor ) / divisor; + else + values[i] = FT_LONG_MAX / divisor; + } + } + + matrix->xx = values[0]; + matrix->yx = values[1]; + matrix->xy = values[2]; + matrix->yy = values[3]; + offset->x = values[4]; + offset->y = values[5]; + + *upm = (FT_ULong)power_tens[-max_scaling]; + + FT_TRACE4(( " [%f %f %f %f %f %f]\n", + (double)matrix->xx / (double)*upm / 65536, + (double)matrix->xy / (double)*upm / 65536, + (double)matrix->yx / (double)*upm / 65536, + (double)matrix->yy / (double)*upm / 65536, + (double)offset->x / (double)*upm / 65536, + (double)offset->y / (double)*upm / 65536 )); + + if ( !FT_Matrix_Check( matrix ) ) + { + FT_TRACE1(( "cff_parse_font_matrix:" + " degenerate values, using default matrix\n" )); + goto Unlikely; + } + + return FT_Err_Ok; + } + else + return FT_THROW( Stack_Underflow ); + + Unlikely: + /* Return default matrix in case of unlikely values. */ + + matrix->xx = 0x10000L; + matrix->yx = 0; + matrix->xy = 0; + matrix->yy = 0x10000L; + offset->x = 0; + offset->y = 0; + *upm = 1; + + return FT_Err_Ok; + } + + + static FT_Error + cff_parse_font_bbox( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_BBox* bbox = &dict->font_bbox; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = FT_ERR( Stack_Underflow ); + + if ( parser->top >= parser->stack + 4 ) + { + bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) ); + error = FT_Err_Ok; + + FT_TRACE4(( " [%ld %ld %ld %ld]\n", + bbox->xMin / 65536, + bbox->yMin / 65536, + bbox->xMax / 65536, + bbox->yMax / 65536 )); + } + + return error; + } + + + static FT_Error + cff_parse_private_dict( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = FT_ERR( Stack_Underflow ); + + if ( parser->top >= parser->stack + 2 ) + { + FT_Long tmp; + + + tmp = cff_parse_num( parser, data++ ); + if ( tmp < 0 ) + { + FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + dict->private_size = (FT_ULong)tmp; + + tmp = cff_parse_num( parser, data ); + if ( tmp < 0 ) + { + FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + dict->private_offset = (FT_ULong)tmp; + + FT_TRACE4(( " %lu %lu\n", + dict->private_size, dict->private_offset )); + + error = FT_Err_Ok; + } + + Fail: + return error; + } + + + /* The `MultipleMaster' operator comes before any */ + /* top DICT operators that contain T2 charstrings. */ + + static FT_Error + cff_parse_multiple_master( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Error error; + + +#ifdef FT_DEBUG_LEVEL_TRACE + /* beautify tracing message */ + if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] < 4 ) + FT_TRACE1(( "Multiple Master CFFs not supported yet," + " handling first master design only\n" )); + else + FT_TRACE1(( " (not supported yet," + " handling first master design only)\n" )); +#endif + + error = FT_ERR( Stack_Underflow ); + + /* currently, we handle only the first argument */ + if ( parser->top >= parser->stack + 5 ) + { + FT_Long num_designs = cff_parse_num( parser, parser->stack ); + + + if ( num_designs > 16 || num_designs < 2 ) + { + FT_ERROR(( "cff_parse_multiple_master:" + " Invalid number of designs\n" )); + error = FT_THROW( Invalid_File_Format ); + } + else + { + dict->num_designs = (FT_UShort)num_designs; + dict->num_axes = (FT_UShort)( parser->top - parser->stack - 4 ); + + parser->num_designs = dict->num_designs; + parser->num_axes = dict->num_axes; + + error = FT_Err_Ok; + } + } + + return error; + } + + + static FT_Error + cff_parse_cid_ros( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = FT_ERR( Stack_Underflow ); + + if ( parser->top >= parser->stack + 3 ) + { + dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ ); + dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ ); + if ( **data == 30 ) + FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); + dict->cid_supplement = cff_parse_num( parser, data ); + if ( dict->cid_supplement < 0 ) + FT_TRACE1(( "cff_parse_cid_ros: negative supplement %ld is found\n", + dict->cid_supplement )); + error = FT_Err_Ok; + + FT_TRACE4(( " %d %d %ld\n", + dict->cid_registry, + dict->cid_ordering, + dict->cid_supplement )); + } + + return error; + } + + + static FT_Error + cff_parse_vsindex( CFF_Parser parser ) + { + /* vsindex operator can only be used in a Private DICT */ + CFF_Private priv = (CFF_Private)parser->object; + FT_Byte** data = parser->stack; + CFF_Blend blend; + FT_Error error; + + + if ( !priv || !priv->subfont ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + blend = &priv->subfont->blend; + + if ( blend->usedBV ) + { + FT_ERROR(( " cff_parse_vsindex: vsindex not allowed after blend\n" )); + error = FT_THROW( Syntax_Error ); + goto Exit; + } + + priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ ); + + FT_TRACE4(( " %d\n", priv->vsindex )); + + error = FT_Err_Ok; + + Exit: + return error; + } + + + static FT_Error + cff_parse_blend( CFF_Parser parser ) + { + /* blend operator can only be used in a Private DICT */ + CFF_Private priv = (CFF_Private)parser->object; + CFF_SubFont subFont; + CFF_Blend blend; + FT_UInt numBlends; + FT_Error error; + + + if ( !priv || !priv->subfont ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + subFont = priv->subfont; + blend = &subFont->blend; + + if ( cff_blend_check_vector( blend, + priv->vsindex, + subFont->lenNDV, + subFont->NDV ) ) + { + error = cff_blend_build_vector( blend, + priv->vsindex, + subFont->lenNDV, + subFont->NDV ); + if ( error ) + goto Exit; + } + + numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 ); + if ( numBlends > parser->stackSize ) + { + FT_ERROR(( "cff_parse_blend: Invalid number of blends\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_TRACE4(( " %d value%s blended\n", + numBlends, + numBlends == 1 ? "" : "s" )); + + error = cff_blend_doBlend( subFont, parser, numBlends ); + + blend->usedBV = TRUE; + + Exit: + return error; + } + + + /* maxstack operator increases parser and operand stacks for CFF2 */ + static FT_Error + cff_parse_maxstack( CFF_Parser parser ) + { + /* maxstack operator can only be used in a Top DICT */ + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error = FT_Err_Ok; + + + if ( !dict ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ ); + if ( dict->maxstack > CFF2_MAX_STACK ) + dict->maxstack = CFF2_MAX_STACK; + if ( dict->maxstack < CFF2_DEFAULT_STACK ) + dict->maxstack = CFF2_DEFAULT_STACK; + + FT_TRACE4(( " %d\n", dict->maxstack )); + + Exit: + return error; + } + + +#define CFF_FIELD_NUM( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_num ) +#define CFF_FIELD_FIXED( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_fixed ) +#define CFF_FIELD_FIXED_1000( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_fixed_thousand ) +#define CFF_FIELD_STRING( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_string ) +#define CFF_FIELD_BOOL( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_bool ) + + +#undef CFF_FIELD +#undef CFF_FIELD_DELTA + + +#ifndef FT_DEBUG_LEVEL_TRACE + + +#define CFF_FIELD_CALLBACK( code, name, id ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0 \ + }, + +#define CFF_FIELD_BLEND( code, id ) \ + { \ + cff_kind_blend, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_blend, \ + 0, 0 \ + }, + +#define CFF_FIELD( code, name, id, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0 \ + }, + +#define CFF_FIELD_DELTA( code, name, max, id ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ) \ + }, + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + +#else /* FT_DEBUG_LEVEL_TRACE */ + + + +#define CFF_FIELD_CALLBACK( code, name, id ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0, \ + id \ + }, + +#define CFF_FIELD_BLEND( code, id ) \ + { \ + cff_kind_blend, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_blend, \ + 0, 0, \ + id \ + }, + +#define CFF_FIELD( code, name, id, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0, \ + id \ + }, + +#define CFF_FIELD_DELTA( code, name, max, id ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ), \ + id \ + }, + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0, 0 } + }; + + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Error error = FT_Err_Ok; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PSAux_Service psaux; + + FT_Library library = parser->library; + FT_Memory memory = library->memory; +#endif + + parser->top = parser->stack; + parser->start = start; + parser->limit = limit; + parser->cursor = start; + + while ( p < limit ) + { + FT_UInt v = *p; + + + /* Opcode 31 is legacy MM T2 operator, not a number. */ + /* Opcode 255 is reserved and should not appear in fonts; */ + /* it is used internally for CFF2 blends. */ + if ( v >= 27 && v != 31 && v != 255 ) + { + /* it's a number; we will push its position on the stack */ + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + *parser->top++ = p; + + /* now, skip it */ + if ( v == 30 ) + { + /* skip real number */ + p++; + for (;;) + { + /* An unterminated floating point number at the */ + /* end of a dictionary is invalid but harmless. */ + if ( p >= limit ) + goto Exit; + v = p[0] >> 4; + if ( v == 15 ) + break; + v = p[0] & 0xF; + if ( v == 15 ) + break; + p++; + } + } + else if ( v == 28 ) + p += 2; + else if ( v == 29 ) + p += 4; + else if ( v > 246 ) + p += 1; + } +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + else if ( v == 31 ) + { + /* a Type 2 charstring */ + + CFF_Decoder decoder; + CFF_FontRec cff_rec; + FT_Byte* charstring_base; + FT_ULong charstring_len; + + FT_Fixed* stack; + FT_Byte* q = NULL; + + + charstring_base = ++p; + + /* search `endchar' operator */ + for (;;) + { + if ( p >= limit ) + goto Exit; + if ( *p == 14 ) + break; + p++; + } + + charstring_len = (FT_ULong)( p - charstring_base ) + 1; + + /* construct CFF_Decoder object */ + FT_ZERO( &decoder ); + FT_ZERO( &cff_rec ); + + cff_rec.top_font.font_dict.num_designs = parser->num_designs; + cff_rec.top_font.font_dict.num_axes = parser->num_axes; + decoder.cff = &cff_rec; + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); + if ( !psaux ) + { + FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + error = psaux->cff_decoder_funcs->parse_charstrings_old( + &decoder, charstring_base, charstring_len, 1 ); + if ( error ) + goto Exit; + + /* Now copy the stack data in the temporary decoder object, */ + /* converting it back to charstring number representations */ + /* (this is ugly, I know). */ + /* The maximum required size is 5 bytes per stack element. */ + if ( FT_QALLOC( q, (FT_Long)( 2 * sizeof ( FT_ListNode ) ) + + 5 * ( decoder.top - decoder.stack ) ) ) + goto Exit; + + FT_List_Add( &parser->t2_strings, (FT_ListNode)q ); + + q += 2 * sizeof ( FT_ListNode ); + + for ( stack = decoder.stack; stack < decoder.top; stack++ ) + { + FT_Long num = *stack; + + + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + *parser->top++ = q; + + if ( num & 0xFFFFU ) + { + *q++ = 255; + *q++ = (FT_Byte)( ( num >> 24 ) & 0xFF ); + *q++ = (FT_Byte)( ( num >> 16 ) & 0xFF ); + *q++ = (FT_Byte)( ( num >> 8 ) & 0xFF ); + *q++ = (FT_Byte)( ( num ) & 0xFF ); + } + else + { + num >>= 16; + + if ( -107 <= num && num <= 107 ) + *q++ = (FT_Byte)( num + 139 ); + else if ( 108 <= num && num <= 1131 ) + { + *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 ); + *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); + } + else if ( -1131 <= num && num <= -108 ) + { + *q++ = (FT_Byte)( ( ( -num - 108 ) >> 8 ) + 251 ); + *q++ = (FT_Byte)( ( -num - 108) & 0xFF ); + } + else + { + *q++ = 28; + *q++ = (FT_Byte)( num >> 8 ); + *q++ = (FT_Byte)( num & 0xFF ); + } + } + } + } +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + else + { + /* This is not a number, hence it's an operator. Compute its code */ + /* and look for it in our current list. */ + + FT_UInt code; + FT_UInt num_args; + const CFF_Field_Handler* field; + + + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + num_args = (FT_UInt)( parser->top - parser->stack ); + *parser->top = p; + code = v; + + if ( v == 12 ) + { + /* two byte operator */ + p++; + if ( p >= limit ) + goto Syntax_Error; + + code = 0x100 | p[0]; + } + code = code | parser->object_code; + + for ( field = cff_field_handlers; field->kind; field++ ) + { + if ( field->code == (FT_Int)code ) + { + /* we found our field's handler; read it */ + FT_Long val; + FT_Byte* q = (FT_Byte*)parser->object + field->offset; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %s", field->id )); +#endif + + /* check that we have enough arguments -- except for */ + /* delta encoded arrays, which can be empty */ + if ( field->kind != cff_kind_delta && num_args < 1 ) + goto Stack_Underflow; + + switch ( field->kind ) + { + case cff_kind_bool: + case cff_kind_string: + case cff_kind_num: + val = cff_parse_num( parser, parser->stack ); + goto Store_Number; + + case cff_kind_fixed: + val = cff_parse_fixed( parser, parser->stack ); + goto Store_Number; + + case cff_kind_fixed_thousand: + val = cff_parse_fixed_scaled( parser, parser->stack, 3 ); + + Store_Number: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + switch ( field->kind ) + { + case cff_kind_bool: + FT_TRACE4(( " %s\n", val ? "true" : "false" )); + break; + + case cff_kind_string: + FT_TRACE4(( " %ld (SID)\n", val )); + break; + + case cff_kind_num: + FT_TRACE4(( " %ld\n", val )); + break; + + case cff_kind_fixed: + FT_TRACE4(( " %f\n", (double)val / 65536 )); + break; + + case cff_kind_fixed_thousand: + FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 )); + break; + + default: + ; /* never reached */ + } +#endif + + break; + + case cff_kind_delta: + { + FT_Byte* qcount = (FT_Byte*)parser->object + + field->count_offset; + + FT_Byte** data = parser->stack; + + + if ( num_args > field->array_max ) + num_args = field->array_max; + + FT_TRACE4(( " [" )); + + /* store count */ + *qcount = (FT_Byte)num_args; + + val = 0; + while ( num_args > 0 ) + { + val = ADD_LONG( val, cff_parse_num( parser, data++ ) ); + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + + FT_TRACE4(( " %ld", val )); + + q += field->size; + num_args--; + } + + FT_TRACE4(( "]\n" )); + } + break; + + default: /* callback or blend */ + error = field->reader( parser ); + if ( error ) + goto Exit; + } + goto Found; + } + } + + /* this is an unknown operator, or it is unsupported; */ + /* we will ignore it for now. */ + + Found: + /* clear stack */ + /* TODO: could clear blend stack here, */ + /* but we don't have access to subFont */ + if ( field->kind != cff_kind_blend ) + parser->top = parser->stack; + } + p++; + } /* while ( p < limit ) */ + + Exit: + return error; + + Stack_Overflow: + error = FT_THROW( Invalid_Argument ); + goto Exit; + + Stack_Underflow: + error = FT_THROW( Invalid_Argument ); + goto Exit; + + Syntax_Error: + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + +/* END */ diff --git a/external/freetype/src/cff/cffparse.h b/external/freetype/src/cff/cffparse.h new file mode 100644 index 000000000..418caacc6 --- /dev/null +++ b/external/freetype/src/cff/cffparse.h @@ -0,0 +1,143 @@ +/**************************************************************************** + * + * cffparse.h + * + * CFF token stream parser (specification) + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFPARSE_H_ +#define CFFPARSE_H_ + + +#include <freetype/internal/cfftypes.h> +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + + + /* CFF uses constant parser stack size; */ + /* CFF2 can increase from default 193 */ +#define CFF_MAX_STACK_DEPTH 96 + + /* + * There are plans to remove the `maxstack' operator in a forthcoming + * revision of the CFF2 specification, increasing the (then static) stack + * size to 513. By making the default stack size equal to the maximum + * stack size, the operator is essentially disabled, which has the + * desired effect in FreeType. + */ +#define CFF2_MAX_STACK 513 +#define CFF2_DEFAULT_STACK 513 + +#define CFF_CODE_TOPDICT 0x1000 +#define CFF_CODE_PRIVATE 0x2000 +#define CFF2_CODE_TOPDICT 0x3000 +#define CFF2_CODE_FONTDICT 0x4000 +#define CFF2_CODE_PRIVATE 0x5000 + + + typedef struct CFF_ParserRec_ + { + FT_Library library; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* cursor; + + FT_Byte** stack; + FT_Byte** top; + FT_UInt stackSize; /* allocated size */ + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_ListRec t2_strings; +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + FT_UInt object_code; + void* object; + + FT_UShort num_designs; /* a copy of `CFF_FontRecDict->num_designs' */ + FT_UShort num_axes; /* a copy of `CFF_FontRecDict->num_axes' */ + + } CFF_ParserRec, *CFF_Parser; + + + FT_LOCAL( FT_Long ) + cff_parse_num( CFF_Parser parser, + FT_Byte** d ); + + FT_LOCAL( FT_Fixed ) + cff_parse_fixed( CFF_Parser parser, + FT_Byte** d ); + + FT_LOCAL( FT_Error ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library, + FT_UInt stackSize, + FT_UShort num_designs, + FT_UShort num_axes ); + + FT_LOCAL( void ) + cff_parser_done( CFF_Parser parser ); + + FT_LOCAL( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ); + + + enum + { + cff_kind_none = 0, + cff_kind_num, + cff_kind_fixed, + cff_kind_fixed_thousand, + cff_kind_string, + cff_kind_bool, + cff_kind_delta, + cff_kind_callback, + cff_kind_blend, + + cff_kind_max /* do not remove */ + }; + + + /* now generate handlers for the most simple fields */ + typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); + + typedef struct CFF_Field_Handler_ + { + int kind; + int code; + FT_UInt offset; + FT_Byte size; + CFF_Field_Reader reader; + FT_UInt array_max; + FT_UInt count_offset; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* id; +#endif + + } CFF_Field_Handler; + + +FT_END_HEADER + + +#endif /* CFFPARSE_H_ */ + + +/* END */ diff --git a/external/freetype/src/cff/cfftoken.h b/external/freetype/src/cff/cfftoken.h new file mode 100644 index 000000000..b61cb0e66 --- /dev/null +++ b/external/freetype/src/cff/cfftoken.h @@ -0,0 +1,150 @@ +/**************************************************************************** + * + * cfftoken.h + * + * CFF token definitions (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec + +#undef CFFCODE +#define CFFCODE CFF_CODE_TOPDICT + + CFF_FIELD_STRING ( 0, version, "Version" ) + CFF_FIELD_STRING ( 1, notice, "Notice" ) + CFF_FIELD_STRING ( 0x100, copyright, "Copyright" ) + CFF_FIELD_STRING ( 2, full_name, "FullName" ) + CFF_FIELD_STRING ( 3, family_name, "FamilyName" ) + CFF_FIELD_STRING ( 4, weight, "Weight" ) + CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" ) + CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" ) + CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" ) + CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" ) + CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" ) + CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" ) + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + CFF_FIELD_NUM ( 13, unique_id, "UniqueID" ) + CFF_FIELD_CALLBACK( 5, font_bbox, "FontBBox" ) + CFF_FIELD_NUM ( 0x108, stroke_width, "StrokeWidth" ) +#if 0 + CFF_FIELD_DELTA ( 14, xuid, 16, "XUID" ) +#endif + CFF_FIELD_NUM ( 15, charset_offset, "charset" ) + CFF_FIELD_NUM ( 16, encoding_offset, "Encoding" ) + CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" ) + CFF_FIELD_CALLBACK( 18, private_dict, "Private" ) + CFF_FIELD_NUM ( 0x114, synthetic_base, "SyntheticBase" ) + CFF_FIELD_STRING ( 0x115, embedded_postscript, "PostScript" ) + +#if 0 + CFF_FIELD_STRING ( 0x116, base_font_name, "BaseFontName" ) + CFF_FIELD_DELTA ( 0x117, base_font_blend, 16, "BaseFontBlend" ) +#endif + + /* the next two operators were removed from the Type2 specification */ + /* in version 16-March-2000 */ + CFF_FIELD_CALLBACK( 0x118, multiple_master, "MultipleMaster" ) +#if 0 + CFF_FIELD_CALLBACK( 0x11A, blend_axis_types, "BlendAxisTypes" ) +#endif + + CFF_FIELD_CALLBACK( 0x11E, cid_ros, "ROS" ) + CFF_FIELD_NUM ( 0x11F, cid_font_version, "CIDFontVersion" ) + CFF_FIELD_NUM ( 0x120, cid_font_revision, "CIDFontRevision" ) + CFF_FIELD_NUM ( 0x121, cid_font_type, "CIDFontType" ) + CFF_FIELD_NUM ( 0x122, cid_count, "CIDCount" ) + CFF_FIELD_NUM ( 0x123, cid_uid_base, "UIDBase" ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" ) + CFF_FIELD_STRING ( 0x126, cid_font_name, "FontName" ) + +#if 0 + CFF_FIELD_NUM ( 0x127, chameleon, "Chameleon" ) +#endif + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFF_CODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) + CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) + CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" ) + CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" ) + CFF_FIELD_NUM ( 10, standard_width, "StdHW" ) + CFF_FIELD_NUM ( 11, standard_height, "StdVW" ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" ) + CFF_FIELD_BOOL ( 0x10E, force_bold, "ForceBold" ) + CFF_FIELD_FIXED ( 0x10F, force_bold_threshold, "ForceBoldThreshold" ) + CFF_FIELD_NUM ( 0x110, lenIV, "lenIV" ) + CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" ) + CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" ) + CFF_FIELD_NUM ( 0x113, initial_random_seed, "initialRandomSeed" ) + CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" ) + CFF_FIELD_NUM ( 20, default_width, "defaultWidthX" ) + CFF_FIELD_NUM ( 21, nominal_width, "nominalWidthX" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_TOPDICT + + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" ) + CFF_FIELD_NUM ( 24, vstore_offset, "vstore" ) + CFF_FIELD_CALLBACK( 25, maxstack, "maxstack" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_FONTDICT + + CFF_FIELD_CALLBACK( 18, private_dict, "Private" ) + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) + CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) + CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" ) + CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" ) + CFF_FIELD_NUM ( 10, standard_width, "StdHW" ) + CFF_FIELD_NUM ( 11, standard_height, "StdVW" ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" ) + CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" ) + CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" ) + CFF_FIELD_CALLBACK ( 22, vsindex, "vsindex" ) + CFF_FIELD_BLEND ( 23, "blend" ) + CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" ) + + +/* END */ diff --git a/external/freetype/src/cff/module.mk b/external/freetype/src/cff/module.mk new file mode 100644 index 000000000..b881d049f --- /dev/null +++ b/external/freetype/src/cff/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 CFF module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += CFF_DRIVER + +define CFF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/cff/rules.mk b/external/freetype/src/cff/rules.mk new file mode 100644 index 000000000..629424adf --- /dev/null +++ b/external/freetype/src/cff/rules.mk @@ -0,0 +1,75 @@ +# +# FreeType 2 OpenType/CFF driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# OpenType driver directory +# +CFF_DIR := $(SRC_DIR)/cff + + +CFF_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(CFF_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# CFF driver sources (i.e., C files) +# +CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c \ + $(CFF_DIR)/cffdrivr.c \ + $(CFF_DIR)/cffgload.c \ + $(CFF_DIR)/cffload.c \ + $(CFF_DIR)/cffobjs.c \ + $(CFF_DIR)/cffparse.c + + +# CFF driver headers +# +CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \ + $(CFF_DIR)/cfferrs.h \ + $(CFF_DIR)/cfftoken.h + + +# CFF driver object(s) +# +# CFF_DRV_OBJ_M is used during `multi' builds +# CFF_DRV_OBJ_S is used during `single' builds +# +CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O) +CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O + +# CFF driver source file for single build +# +CFF_DRV_SRC_S := $(CFF_DIR)/cff.c + + +# CFF driver - single object +# +$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H) + $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S)) + + +# CFF driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H) + $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CFF_DRV_OBJ_S) +DRV_OBJS_M += $(CFF_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/cid/ciderrs.h b/external/freetype/src/cid/ciderrs.h new file mode 100644 index 000000000..40a1097d0 --- /dev/null +++ b/external/freetype/src/cid/ciderrs.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * ciderrs.h + * + * CID error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the CID error enumeration constants. + * + */ + +#ifndef CIDERRS_H_ +#define CIDERRS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX CID_Err_ +#define FT_ERR_BASE FT_Mod_Err_CID + +#include <freetype/fterrors.h> + +#endif /* CIDERRS_H_ */ + + +/* END */ diff --git a/external/freetype/src/cid/cidgload.c b/external/freetype/src/cid/cidgload.c new file mode 100644 index 000000000..eaca765ad --- /dev/null +++ b/external/freetype/src/cid/cidgload.c @@ -0,0 +1,618 @@ +/**************************************************************************** + * + * cidgload.c + * + * CID-keyed Type1 Glyph Loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "cidload.h" +#include "cidgload.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/ftoutln.h> +#include <freetype/internal/ftcalc.h> + +#include <freetype/internal/psaux.h> +#include <freetype/internal/cfftypes.h> +#include <freetype/ftdriver.h> + +#include "ciderrs.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cidgload + + + /* + * A helper function to compute FD number (`fd_select`), the offset to the + * head of the glyph data (`off1`), and the offset to the and of the glyph + * data (`off2`). + * + * The number how many times `cid_get_offset` is invoked can be controlled + * by the number of non-NULL arguments. If `fd_select` is non-NULL but + * `off1` and `off2` are NULL, `cid_get_offset` is invoked only for + * `fd_select`; `off1` and `off2` are not validated. + * + */ + FT_LOCAL_DEF( FT_Error ) + cid_compute_fd_and_offsets( CID_Face face, + FT_UInt glyph_index, + FT_ULong* fd_select_p, + FT_ULong* off1_p, + FT_ULong* off2_p ) + { + FT_Error error = FT_Err_Ok; + + CID_FaceInfo cid = &face->cid; + FT_Stream stream = face->cid_stream; + FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; + + FT_Byte* p; + FT_Bool need_frame_exit = 0; + FT_ULong fd_select, off1, off2; + + + /* For ordinary fonts, read the CID font dictionary index */ + /* and charstring offset from the CIDMap. */ + + if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + + glyph_index * entry_len ) || + FT_FRAME_ENTER( 2 * entry_len ) ) + goto Exit; + + need_frame_exit = 1; + + p = (FT_Byte*)stream->cursor; + fd_select = cid_get_offset( &p, cid->fd_bytes ); + off1 = cid_get_offset( &p, cid->gd_bytes ); + + p += cid->fd_bytes; + off2 = cid_get_offset( &p, cid->gd_bytes ); + + if ( fd_select_p ) + *fd_select_p = fd_select; + if ( off1_p ) + *off1_p = off1; + if ( off2_p ) + *off2_p = off2; + + if ( fd_select >= cid->num_dicts ) + { + /* + * fd_select == 0xFF is often used to indicate that the CID + * has no charstring to be rendered, similar to GID = 0xFFFF + * in TrueType fonts. + */ + if ( ( cid->fd_bytes == 1 && fd_select == 0xFFU ) || + ( cid->fd_bytes == 2 && fd_select == 0xFFFFU ) ) + { + FT_TRACE1(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE1(( " FD number %ld is the maximum\n", + fd_select )); + FT_TRACE1(( " integer fitting into %d byte%s\n", + cid->fd_bytes, cid->fd_bytes == 1 ? "" : "s" )); + } + else + { + FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE0(( " FD number %ld is larger\n", + fd_select )); + FT_TRACE0(( " than number of dictionaries (%d)\n", + cid->num_dicts )); + } + + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + else if ( off2 > stream->size ) + { + FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE0(( " end of the glyph data\n" )); + FT_TRACE0(( " is beyond the data stream\n" )); + + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + else if ( off1 > off2 ) + { + FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE0(( " the end position of glyph data\n" )); + FT_TRACE0(( " is set before the start position\n" )); + + error = FT_THROW( Invalid_Offset ); + } + + Exit: + if ( need_frame_exit ) + FT_FRAME_EXIT(); + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cid_load_glyph( T1_Decoder decoder, + FT_UInt glyph_index ) + { + CID_Face face = (CID_Face)decoder->builder.face; + CID_FaceInfo cid = &face->cid; + FT_Byte* p; + FT_ULong fd_select; + FT_Stream stream = face->cid_stream; + FT_Error error = FT_Err_Ok; + FT_Byte* charstring = NULL; + FT_Memory memory = face->root.memory; + FT_ULong glyph_length = 0; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Bool force_scaling = FALSE; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec *inc = + face->root.internal->incremental_interface; +#endif + + + FT_TRACE1(( "cid_load_glyph: glyph index %u\n", glyph_index )); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* For incremental fonts get the character data using */ + /* the callback function. */ + if ( inc ) + { + FT_Data glyph_data; + + + error = inc->funcs->get_glyph_data( inc->object, + glyph_index, &glyph_data ); + if ( error || glyph_data.length < cid->fd_bytes ) + goto Exit; + + p = (FT_Byte*)glyph_data.pointer; + fd_select = cid_get_offset( &p, cid->fd_bytes ); + + glyph_length = glyph_data.length - cid->fd_bytes; + + if ( !FT_QALLOC( charstring, glyph_length ) ) + FT_MEM_COPY( charstring, glyph_data.pointer + cid->fd_bytes, + glyph_length ); + + inc->funcs->free_glyph_data( inc->object, &glyph_data ); + + if ( error ) + goto Exit; + } + + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ULong off1, off2; + + + error = cid_compute_fd_and_offsets( face, glyph_index, + &fd_select, &off1, &off2 ); + if ( error ) + goto Exit; + + glyph_length = off2 - off1; + + if ( glyph_length == 0 || + FT_QALLOC( charstring, glyph_length ) || + FT_STREAM_READ_AT( cid->data_offset + off1, + charstring, glyph_length ) ) + goto Exit; + } + + /* Now set up the subrs array and parse the charstrings. */ + { + CID_FaceDict dict; + CID_Subrs cid_subrs = face->subrs + fd_select; + FT_UInt cs_offset; + + + /* Set up subrs */ + decoder->num_subrs = cid_subrs->num_subrs; + decoder->subrs = cid_subrs->code; + decoder->subrs_len = 0; + decoder->subrs_hash = NULL; + + /* Set up font matrix */ + dict = cid->font_dicts + fd_select; + + decoder->font_matrix = dict->font_matrix; + decoder->font_offset = dict->font_offset; + decoder->lenIV = dict->private_dict.lenIV; + + /* Decode the charstring. */ + + /* Adjustment for seed bytes. */ + cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0; + if ( cs_offset > glyph_length ) + { + FT_TRACE0(( "cid_load_glyph: fail for glyph_index=%d, " + "offset to the charstring is beyond glyph length\n", + glyph_index )); + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + + /* Decrypt only if lenIV >= 0. */ + if ( decoder->lenIV >= 0 ) + psaux->t1_decrypt( charstring, glyph_length, 4330 ); + + /* choose which renderer to use */ +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + if ( ( (PS_Driver)FT_FACE_DRIVER( face ) )->hinting_engine == + FT_HINTING_FREETYPE || + decoder->builder.metrics_only ) + error = psaux->t1_decoder_funcs->parse_charstrings_old( + decoder, + charstring + cs_offset, + glyph_length - cs_offset ); +#else + if ( decoder->builder.metrics_only ) + error = psaux->t1_decoder_funcs->parse_metrics( + decoder, + charstring + cs_offset, + glyph_length - cs_offset ); +#endif + else + { + PS_Decoder psdecoder; + CFF_SubFontRec subfont; + + + psaux->ps_decoder_init( &psdecoder, decoder, TRUE ); + + psaux->t1_make_subfont( FT_FACE( face ), + &dict->private_dict, + &subfont ); + psdecoder.current_subfont = &subfont; + + error = psaux->t1_decoder_funcs->parse_charstrings( + &psdecoder, + charstring + cs_offset, + glyph_length - cs_offset ); + + /* Adobe's engine uses 16.16 numbers everywhere; */ + /* as a consequence, glyphs larger than 2000ppem get rejected */ + if ( FT_ERR_EQ( error, Glyph_Too_Big ) ) + { + /* this time, we retry unhinted and scale up the glyph later on */ + /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */ + /* 0x400 for both `x_scale' and `y_scale' in this case) */ + ((CID_GlyphSlot)decoder->builder.glyph)->hint = FALSE; + + force_scaling = TRUE; + + error = psaux->t1_decoder_funcs->parse_charstrings( + &psdecoder, + charstring + cs_offset, + glyph_length - cs_offset ); + } + } + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && inc && inc->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); + metrics.bearing_y = 0; + metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); + metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); + + error = inc->funcs->get_glyph_metrics( inc->object, + glyph_index, FALSE, &metrics ); + + decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); + decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); + decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + Exit: + FT_FREE( charstring ); + + ((CID_GlyphSlot)decoder->builder.glyph)->scaled = force_scaling; + + return error; + } + + +#if 0 + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + cid_face_compute_max_advance( CID_Face face, + FT_Int* max_advance ) + { + FT_Error error; + T1_DecoderRec decoder; + FT_Int glyph_index; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + *max_advance = 0; + + /* Initialize load decoder */ + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + 0, /* glyph names! XXX */ + 0, /* blend == 0 */ + 0, /* hinting == 0 */ + cid_load_glyph ); + if ( error ) + return error; + + /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ + /* if we ever support CID-keyed multiple master fonts */ + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* for each glyph, parse the glyph charstring and extract */ + /* the advance width */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + /* now get load the unscaled outline */ + error = cid_load_glyph( &decoder, glyph_index ); + /* ignore the error if one occurred - skip to next glyph */ + } + + *max_advance = FIXED_TO_INT( decoder.builder.advance.x ); + + psaux->t1_decoder_funcs->done( &decoder ); + + return FT_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cid_slot_load_glyph( FT_GlyphSlot cidglyph, /* CID_GlyphSlot */ + FT_Size cidsize, /* CID_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph; + FT_Error error; + T1_DecoderRec decoder; + CID_Face face = (CID_Face)cidglyph->face; + FT_Bool hinting; + FT_Bool scaled; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_Bool must_finish_decoder = FALSE; + + + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = cidsize->metrics.x_scale; + glyph->y_scale = cidsize->metrics.y_scale; + + cidglyph->outline.n_points = 0; + cidglyph->outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); + + glyph->hint = hinting; + glyph->scaled = scaled; + cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; + + error = psaux->t1_decoder_funcs->init( &decoder, + cidglyph->face, + cidsize, + cidglyph, + 0, /* glyph names -- XXX */ + 0, /* blend == 0 */ + hinting, + FT_LOAD_TARGET_MODE( load_flags ), + cid_load_glyph ); + if ( error ) + goto Exit; + + /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ + /* if we ever support CID-keyed multiple master fonts */ + + must_finish_decoder = TRUE; + + /* set up the decoder */ + decoder.builder.no_recurse = FT_BOOL( load_flags & FT_LOAD_NO_RECURSE ); + + error = cid_load_glyph( &decoder, glyph_index ); + if ( error ) + goto Exit; + + /* copy flags back for forced scaling */ + hinting = glyph->hint; + scaled = glyph->scaled; + + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + psaux->t1_decoder_funcs->done( &decoder ); + + must_finish_decoder = FALSE; + + /* now set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + cidglyph->outline.flags &= FT_OUTLINE_OWNER; + cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = cidglyph->internal; + + + cidglyph->metrics.horiBearingX = + FIXED_TO_INT( decoder.builder.left_bearing.x ); + cidglyph->metrics.horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &cidglyph->metrics; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + cidglyph->linearHoriAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + cidglyph->internal->glyph_transformed = 0; + + /* make up vertical ones */ + metrics->vertAdvance = ( face->cid.font_bbox.yMax - + face->cid.font_bbox.yMin ) >> 16; + cidglyph->linearVertAdvance = metrics->vertAdvance; + + cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; + + if ( cidsize->metrics.y_ppem < 24 ) + cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + /* apply the font matrix, if any */ + if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || + font_matrix.xy != 0 || font_matrix.yx != 0 ) + { + FT_Outline_Transform( &cidglyph->outline, &font_matrix ); + + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, + font_matrix.xx ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, + font_matrix.yy ); + } + + if ( font_offset.x || font_offset.y ) + { + FT_Outline_Translate( &cidglyph->outline, + font_offset.x, + font_offset.y ); + + metrics->horiAdvance += font_offset.x; + metrics->vertAdvance += font_offset.y; + } + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || scaled ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = decoder.builder.base; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &cidglyph->outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + + Exit: + + if ( must_finish_decoder ) + psaux->t1_decoder_funcs->done( &decoder ); + + return error; + } + + +/* END */ diff --git a/external/freetype/src/cid/cidgload.h b/external/freetype/src/cid/cidgload.h new file mode 100644 index 000000000..edd622923 --- /dev/null +++ b/external/freetype/src/cid/cidgload.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * + * cidgload.h + * + * OpenType Glyph Loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CIDGLOAD_H_ +#define CIDGLOAD_H_ + + +#include "cidobjs.h" + + +FT_BEGIN_HEADER + + +#if 0 + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cid_face_compute_max_advance( CID_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cid_slot_load_glyph( FT_GlyphSlot glyph, /* CID_Glyph_Slot */ + FT_Size size, /* CID_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + FT_LOCAL( FT_Error ) + cid_compute_fd_and_offsets( CID_Face face, + FT_UInt glyph_index, + FT_ULong* fd_select_p, + FT_ULong* off1_p, + FT_ULong* off2_p ); + + +FT_END_HEADER + +#endif /* CIDGLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/cid/cidload.c b/external/freetype/src/cid/cidload.c new file mode 100644 index 000000000..a7da8ea39 --- /dev/null +++ b/external/freetype/src/cid/cidload.c @@ -0,0 +1,950 @@ +/**************************************************************************** + * + * cidload.c + * + * CID-keyed Type1 font loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <ft2build.h> +#include <freetype/internal/ftdebug.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/ftmm.h> +#include <freetype/internal/t1types.h> +#include <freetype/internal/psaux.h> + +#include "cidload.h" + +#include "ciderrs.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cidload + + + /* read a single offset */ + FT_LOCAL_DEF( FT_ULong ) + cid_get_offset( FT_Byte* *start, + FT_UInt offsize ) + { + FT_ULong result; + FT_Byte* p = *start; + + + for ( result = 0; offsize > 0; offsize-- ) + { + result <<= 8; + result |= *p++; + } + + *start = p; + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + cid_load_keyword( CID_Face face, + CID_Loader* loader, + const T1_Field keyword ) + { + FT_Error error; + CID_Parser* parser = &loader->parser; + FT_Byte* object; + void* dummy_object; + CID_FaceInfo cid = &face->cid; + + + /* if the keyword has a dedicated callback, call it */ + if ( keyword->type == T1_FIELD_TYPE_CALLBACK ) + { + FT_TRACE4(( " %s", keyword->ident )); + + keyword->reader( (FT_Face)face, parser ); + error = parser->root.error; + goto Exit; + } + + /* we must now compute the address of our target object */ + switch ( keyword->location ) + { + case T1_FIELD_LOCATION_CID_INFO: + object = (FT_Byte*)cid; + break; + + case T1_FIELD_LOCATION_FONT_INFO: + object = (FT_Byte*)&cid->font_info; + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + object = (FT_Byte*)&face->font_extra; + break; + + case T1_FIELD_LOCATION_BBOX: + object = (FT_Byte*)&cid->font_bbox; + break; + + default: + { + CID_FaceDict dict; + + + if ( parser->num_dict >= cid->num_dicts ) + { + FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n", + keyword->ident )); + error = FT_THROW( Syntax_Error ); + goto Exit; + } + + dict = cid->font_dicts + parser->num_dict; + switch ( keyword->location ) + { + case T1_FIELD_LOCATION_PRIVATE: + object = (FT_Byte*)&dict->private_dict; + break; + + default: + object = (FT_Byte*)dict; + } + } + } + + FT_TRACE4(( " %s", keyword->ident )); + + dummy_object = object; + + /* now, load the keyword data in the object's field(s) */ + if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY || + keyword->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = cid_parser_load_field_table( &loader->parser, keyword, + &dummy_object ); + else + error = cid_parser_load_field( &loader->parser, + keyword, &dummy_object ); + + FT_TRACE4(( "\n" )); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + cid_parse_font_matrix( FT_Face face, /* CID_Face */ + void* parser_ ) + { + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; + CID_FaceDict dict; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + + + if ( parser->num_dict < cidface->cid.num_dicts ) + { + FT_Matrix* matrix; + FT_Vector* offset; + FT_Int result; + + + dict = cidface->cid.font_dicts + parser->num_dict; + matrix = &dict->font_matrix; + offset = &dict->font_offset; + + /* input is scaled by 1000 to accommodate default FontMatrix */ + result = cid_parser_to_fixed_array( parser, 6, temp, 3 ); + + if ( result < 6 ) + { + FT_ERROR(( "cid_parse_font_matrix: not enough matrix elements\n" )); + goto Exit; + } + + FT_TRACE4(( " [%f %f %f %f %f %f]\n", + (double)temp[0] / 65536 / 1000, + (double)temp[1] / 65536 / 1000, + (double)temp[2] / 65536 / 1000, + (double)temp[3] / 65536 / 1000, + (double)temp[4] / 65536 / 1000, + (double)temp[5] / 65536 / 1000 )); + + temp_scale = FT_ABS( temp[3] ); + + if ( temp_scale == 0 ) + { + FT_ERROR(( "cid_parse_font_matrix: invalid font matrix\n" )); + goto Exit; + } + + /* atypical case */ + if ( temp_scale != 0x10000L ) + { + /* set units per EM based on FontMatrix values */ + face->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); + + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + if ( !FT_Matrix_Check( matrix ) ) + { + FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* note that the font offsets are expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + Exit: + return; + } + + + FT_CALLBACK_DEF( void ) + parse_fd_array( FT_Face face, /* CID_Face */ + void* parser_ ) + { + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; + CID_FaceInfo cid = &cidface->cid; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Stream stream = parser->stream; + FT_Error error = FT_Err_Ok; + FT_Long num_dicts, max_dicts; + + + num_dicts = cid_parser_to_int( parser ); + if ( num_dicts < 0 || num_dicts > FT_INT_MAX ) + { + FT_ERROR(( "parse_fd_array: invalid number of dictionaries\n" )); + goto Exit; + } + + FT_TRACE4(( " %ld\n", num_dicts )); + + /* + * A single entry in the FDArray must (at least) contain the following + * structure elements. + * + * %ADOBeginFontDict 18 + * X dict begin 13 + * /FontMatrix [X X X X] 22 + * /Private X dict begin 22 + * end 4 + * end 4 + * %ADOEndFontDict 16 + * + * This needs 18+13+22+22+4+4+16=99 bytes or more. Normally, you also + * need a `dup X' at the very beginning and a `put' at the end, so a + * rough guess using 100 bytes as the minimum is justified. + */ + max_dicts = (FT_Long)( stream->size / 100 ); + if ( num_dicts > max_dicts ) + { + FT_TRACE0(( "parse_fd_array: adjusting FDArray size" + " (from %ld to %ld)\n", + num_dicts, max_dicts )); + num_dicts = max_dicts; + } + + if ( !cid->font_dicts ) + { + FT_UInt n; + + + if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) ) + goto Exit; + + cid->num_dicts = num_dicts; + + /* set some default values (the same as for Type 1 fonts) */ + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + + + dict->private_dict.blue_shift = 7; + dict->private_dict.blue_fuzz = 1; + dict->private_dict.lenIV = 4; + dict->private_dict.expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + dict->private_dict.blue_scale = (FT_Fixed)( + 0.039625 * 0x10000L * 1000 ); + } + } + + Exit: + return; + } + + + /* By mistake, `expansion_factor' appears both in PS_PrivateRec */ + /* and CID_FaceDictRec (both are public header files and can't */ + /* be thus changed). We simply copy the value. */ + + FT_CALLBACK_DEF( void ) + parse_expansion_factor( FT_Face face, /* CID_Face */ + void* parser_ ) + { + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; + CID_FaceDict dict; + + + if ( parser->num_dict < cidface->cid.num_dicts ) + { + dict = cidface->cid.font_dicts + parser->num_dict; + + dict->expansion_factor = cid_parser_to_fixed( parser, 0 ); + dict->private_dict.expansion_factor = dict->expansion_factor; + + FT_TRACE4(( "%ld\n", dict->expansion_factor )); + } + + return; + } + + + /* By mistake, `CID_FaceDictRec' doesn't contain a field for the */ + /* `FontName' keyword. FreeType doesn't need it, but it is nice */ + /* to catch it for producing better trace output. */ + + FT_CALLBACK_DEF( void ) + parse_font_name( FT_Face face, /* CID_Face */ + void* parser_ ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; + + + if ( parser->num_dict < cidface->cid.num_dicts ) + { + T1_TokenRec token; + FT_UInt len; + + + cid_parser_to_token( parser, &token ); + + len = (FT_UInt)( token.limit - token.start ); + if ( len ) + FT_TRACE4(( " %.*s\n", len, token.start )); + else + FT_TRACE4(( " <no value>\n" )); + } +#else + FT_UNUSED( face ); + FT_UNUSED( parser_ ); +#endif + + return; + } + + + static + const T1_FieldRec cid_field_records[] = + { + +#include "cidtoken.h" + + T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 ) + T1_FIELD_CALLBACK( "FontMatrix", cid_parse_font_matrix, 0 ) + T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 ) + T1_FIELD_CALLBACK( "FontName", parse_font_name, 0 ) + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + + static FT_Error + cid_parse_dict( CID_Face face, + CID_Loader* loader, + FT_Byte* base, + FT_ULong size ) + { + CID_Parser* parser = &loader->parser; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = FT_Err_Ok; + + { + FT_Byte* cur = base; + FT_Byte* limit = cur + size; + + + for (;;) + { + FT_Byte* newlimit; + + + parser->root.cursor = cur; + cid_parser_skip_spaces( parser ); + + if ( parser->root.cursor >= limit ) + newlimit = limit - 1 - 17; + else + newlimit = parser->root.cursor - 17; + + /* look for `%ADOBeginFontDict' */ + for ( ; cur < newlimit; cur++ ) + { + if ( *cur == '%' && + ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) + { + /* if /FDArray was found, then cid->num_dicts is > 0, and */ + /* we can start increasing parser->num_dict */ + if ( face->cid.num_dicts > 0 ) + { + parser->num_dict++; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " FontDict %u", parser->num_dict )); + if ( parser->num_dict > face->cid.num_dicts ) + FT_TRACE4(( " (ignored)" )); + FT_TRACE4(( "\n" )); +#endif + } + } + } + + cur = parser->root.cursor; + /* no error can occur in cid_parser_skip_spaces */ + if ( cur >= limit ) + break; + + cid_parser_skip_PS_token( parser ); + if ( parser->root.cursor >= limit || parser->root.error ) + break; + + /* look for immediates */ + if ( *cur == '/' && cur + 2 < limit ) + { + FT_UInt len; + + + cur++; + len = (FT_UInt)( parser->root.cursor - cur ); + + if ( len > 0 && len < 22 ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)cid_field_records; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == ft_strlen( (const char*)name ) ) + { + FT_UInt n; + + + for ( n = 1; n < len; n++ ) + if ( cur[n] != name[n] ) + break; + + if ( n >= len ) + { + /* we found it - run the parsing callback */ + parser->root.error = cid_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + keyword++; + } + } + } + + cur = parser->root.cursor; + } + + if ( !face->cid.num_dicts ) + { + FT_ERROR(( "cid_parse_dict: No font dictionary found\n" )); + return FT_THROW( Invalid_File_Format ); + } + } + + return parser->root.error; + } + + + /* read the subrmap and the subrs of each font dict */ + static FT_Error + cid_read_subrs( CID_Face face ) + { + CID_FaceInfo cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Stream stream = face->cid_stream; + FT_Error error; + FT_UInt n; + CID_Subrs subr; + FT_UInt max_offsets = 0; + FT_ULong* offsets = NULL; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) ) + goto Exit; + + subr = face->subrs; + for ( n = 0; n < cid->num_dicts; n++, subr++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + FT_Int lenIV = dict->private_dict.lenIV; + FT_UInt count, num_subrs = dict->num_subrs; + FT_ULong data_len; + FT_Byte* p; + + + if ( !num_subrs ) + continue; + + /* reallocate offsets array if needed */ + if ( num_subrs + 1 > max_offsets ) + { + FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 ); + + + if ( new_max <= max_offsets ) + { + error = FT_THROW( Syntax_Error ); + goto Fail; + } + + if ( FT_QRENEW_ARRAY( offsets, max_offsets, new_max ) ) + goto Fail; + + max_offsets = new_max; + } + + /* read the subrmap's offsets */ + if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || + FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) + goto Fail; + + p = (FT_Byte*)stream->cursor; + for ( count = 0; count <= num_subrs; count++ ) + offsets[count] = cid_get_offset( &p, dict->sd_bytes ); + + FT_FRAME_EXIT(); + + /* offsets must be ordered */ + for ( count = 1; count <= num_subrs; count++ ) + if ( offsets[count - 1] > offsets[count] ) + { + FT_ERROR(( "cid_read_subrs: offsets are not ordered\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + if ( offsets[num_subrs] > stream->size - cid->data_offset ) + { + FT_ERROR(( "cid_read_subrs: too large `subrs' offsets\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* now, compute the size of subrs charstrings, */ + /* allocate, and read them */ + data_len = offsets[num_subrs] - offsets[0]; + + if ( FT_QNEW_ARRAY( subr->code, num_subrs + 1 ) || + FT_QALLOC( subr->code[0], data_len ) ) + goto Fail; + + if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) || + FT_STREAM_READ( subr->code[0], data_len ) ) + goto Fail; + + /* set up pointers */ + for ( count = 1; count <= num_subrs; count++ ) + { + FT_ULong len; + + + len = offsets[count] - offsets[count - 1]; + subr->code[count] = subr->code[count - 1] + len; + } + + /* decrypt subroutines, but only if lenIV >= 0 */ + if ( lenIV >= 0 ) + { + for ( count = 0; count < num_subrs; count++ ) + { + FT_ULong len; + + + len = offsets[count + 1] - offsets[count]; + psaux->t1_decrypt( subr->code[count], len, 4330 ); + } + } + + subr->num_subrs = (FT_Int)num_subrs; + } + + Exit: + FT_FREE( offsets ); + return error; + + Fail: + if ( face->subrs ) + { + for ( n = 0; n < cid->num_dicts; n++ ) + { + if ( face->subrs[n].code ) + FT_FREE( face->subrs[n].code[0] ); + + FT_FREE( face->subrs[n].code ); + } + FT_FREE( face->subrs ); + } + goto Exit; + } + + + static void + cid_init_loader( CID_Loader* loader, + CID_Face face ) + { + FT_UNUSED( face ); + + FT_ZERO( loader ); + } + + + static void + cid_done_loader( CID_Loader* loader ) + { + CID_Parser* parser = &loader->parser; + + + /* finalize parser */ + cid_parser_done( parser ); + } + + + static FT_Error + cid_hex_to_binary( FT_Byte* data, + FT_ULong data_len, + FT_ULong offset, + CID_Face face, + FT_ULong* data_written ) + { + FT_Stream stream = face->root.stream; + FT_Error error; + + FT_Byte buffer[256]; + FT_Byte *p, *plimit; + FT_Byte *d = data, *dlimit; + FT_Byte val; + + FT_Bool upper_nibble, done; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + dlimit = d + data_len; + p = buffer; + plimit = p; + + upper_nibble = 1; + done = 0; + + while ( d < dlimit ) + { + if ( p >= plimit ) + { + FT_ULong oldpos = FT_STREAM_POS(); + FT_ULong size = stream->size - oldpos; + + + if ( size == 0 ) + { + error = FT_THROW( Syntax_Error ); + goto Exit; + } + + if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) ) + goto Exit; + p = buffer; + plimit = p + FT_STREAM_POS() - oldpos; + } + + if ( ft_isdigit( *p ) ) + val = (FT_Byte)( *p - '0' ); + else if ( *p >= 'a' && *p <= 'f' ) + val = (FT_Byte)( *p - 'a' + 10 ); + else if ( *p >= 'A' && *p <= 'F' ) + val = (FT_Byte)( *p - 'A' + 10 ); + else if ( *p == ' ' || + *p == '\t' || + *p == '\r' || + *p == '\n' || + *p == '\f' || + *p == '\0' ) + { + p++; + continue; + } + else if ( *p == '>' ) + { + val = 0; + done = 1; + } + else + { + error = FT_THROW( Syntax_Error ); + goto Exit; + } + + if ( upper_nibble ) + *d = (FT_Byte)( val << 4 ); + else + { + *d = (FT_Byte)( *d + val ); + d++; + } + + upper_nibble = (FT_Byte)( 1 - upper_nibble ); + + if ( done ) + break; + + p++; + } + + error = FT_Err_Ok; + + Exit: + *data_written = (FT_ULong)( d - data ); + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_face_open( CID_Face face, + FT_Int face_index ) + { + CID_Loader loader; + CID_Parser* parser; + FT_Memory memory = face->root.memory; + FT_Error error; + FT_UInt n; + + CID_FaceInfo cid = &face->cid; + + FT_ULong binary_length; + + + cid_init_loader( &loader, face ); + + parser = &loader.parser; + error = cid_parser_new( parser, face->root.stream, face->root.memory, + (PSAux_Service)face->psaux ); + if ( error ) + goto Exit; + + error = cid_parse_dict( face, &loader, + parser->postscript, + parser->postscript_len ); + if ( error ) + goto Exit; + + if ( face_index < 0 ) + goto Exit; + + if ( FT_NEW( face->cid_stream ) ) + goto Exit; + + if ( parser->binary_length ) + { + if ( parser->binary_length > + face->root.stream->size - parser->data_offset ) + { + FT_TRACE0(( "cid_face_open: adjusting length of binary data\n" )); + FT_TRACE0(( " (from %lu to %lu bytes)\n", + parser->binary_length, + face->root.stream->size - parser->data_offset )); + parser->binary_length = face->root.stream->size - + parser->data_offset; + } + + /* we must convert the data section from hexadecimal to binary */ + if ( FT_QALLOC( face->binary_data, parser->binary_length ) || + FT_SET_ERROR( cid_hex_to_binary( face->binary_data, + parser->binary_length, + parser->data_offset, + face, + &binary_length ) ) ) + goto Exit; + + FT_Stream_OpenMemory( face->cid_stream, + face->binary_data, binary_length ); + cid->data_offset = 0; + } + else + { + *face->cid_stream = *face->root.stream; + cid->data_offset = loader.parser.data_offset; + } + + /* sanity tests */ + + if ( cid->gd_bytes == 0 ) + { + FT_ERROR(( "cid_face_open:" + " Invalid `GDBytes' value\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* allow at most 32bit offsets */ + if ( cid->fd_bytes > 4 || cid->gd_bytes > 4 ) + { + FT_ERROR(( "cid_face_open:" + " Values of `FDBytes' or `GDBytes' larger than 4\n" )); + FT_ERROR(( " " + " are not supported\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + binary_length = face->cid_stream->size - cid->data_offset; + + if ( cid->cidmap_offset > binary_length ) + { + FT_ERROR(( "cid_face_open: Invalid `CIDMapOffset' value\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* the initial pre-check prevents the multiplication overflow */ + if ( cid->cid_count > FT_ULONG_MAX / 8 || + cid->cid_count * ( cid->fd_bytes + cid->gd_bytes ) > + binary_length - cid->cidmap_offset ) + { + FT_ERROR(( "cid_face_open: Invalid `CIDCount' value\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + + + /* the upper limits are ad-hoc values */ + if ( dict->private_dict.blue_shift > 1000 || + dict->private_dict.blue_shift < 0 ) + { + FT_TRACE2(( "cid_face_open:" + " setting unlikely BlueShift value %d to default (7)\n", + dict->private_dict.blue_shift )); + dict->private_dict.blue_shift = 7; + } + + if ( dict->private_dict.blue_fuzz > 1000 || + dict->private_dict.blue_fuzz < 0 ) + { + FT_TRACE2(( "cid_face_open:" + " setting unlikely BlueFuzz value %d to default (1)\n", + dict->private_dict.blue_fuzz )); + dict->private_dict.blue_fuzz = 1; + } + + if ( dict->num_subrs && dict->sd_bytes == 0 ) + { + FT_ERROR(( "cid_face_open: Invalid `SDBytes' value\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( dict->sd_bytes > 4 ) + { + FT_ERROR(( "cid_face_open:" + " Values of `SDBytes' larger than 4" + " are not supported\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( dict->subrmap_offset > binary_length ) + { + FT_ERROR(( "cid_face_open: Invalid `SubrMapOffset' value\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* the initial pre-check prevents the multiplication overflow */ + if ( dict->num_subrs > FT_UINT_MAX / 4 || + dict->num_subrs * dict->sd_bytes > + binary_length - dict->subrmap_offset ) + { + FT_ERROR(( "cid_face_open: Invalid `SubrCount' value\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + /* we can now safely proceed */ + error = cid_read_subrs( face ); + + Exit: + cid_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/external/freetype/src/cid/cidload.h b/external/freetype/src/cid/cidload.h new file mode 100644 index 000000000..d12d2962a --- /dev/null +++ b/external/freetype/src/cid/cidload.h @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * cidload.h + * + * CID-keyed Type1 font loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CIDLOAD_H_ +#define CIDLOAD_H_ + + +#include <freetype/internal/ftstream.h> +#include "cidparse.h" + + +FT_BEGIN_HEADER + + + typedef struct CID_Loader_ + { + CID_Parser parser; /* parser used to read the stream */ + FT_Int num_chars; /* number of characters in encoding */ + + } CID_Loader; + + + FT_LOCAL( FT_ULong ) + cid_get_offset( FT_Byte** start, + FT_UInt offsize ); + + FT_LOCAL( FT_Error ) + cid_face_open( CID_Face face, + FT_Int face_index ); + + +FT_END_HEADER + +#endif /* CIDLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/cid/cidobjs.c b/external/freetype/src/cid/cidobjs.c new file mode 100644 index 000000000..f698a4192 --- /dev/null +++ b/external/freetype/src/cid/cidobjs.c @@ -0,0 +1,543 @@ +/**************************************************************************** + * + * cidobjs.c + * + * CID objects manager (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> + +#include "cidgload.h" +#include "cidload.h" + +#include <freetype/internal/services/svpscmap.h> +#include <freetype/internal/psaux.h> +#include <freetype/internal/pshints.h> +#include <freetype/ftdriver.h> + +#include "ciderrs.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cidobjs + + + /************************************************************************** + * + * SLOT FUNCTIONS + * + */ + + FT_LOCAL_DEF( void ) + cid_slot_done( FT_GlyphSlot slot ) + { + if ( slot->internal ) + slot->internal->glyph_hints = NULL; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_slot_init( FT_GlyphSlot slot ) + { + CID_Face face; + PSHinter_Service pshinter; + + + face = (CID_Face)slot->face; + pshinter = (PSHinter_Service)face->pshinter; + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->library, "pshinter" ); + if ( module ) + { + T1_Hints_Funcs funcs; + + + funcs = pshinter->get_t1_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return 0; + } + + + /************************************************************************** + * + * SIZE FUNCTIONS + * + */ + + + static PSH_Globals_Funcs + cid_size_get_globals_funcs( CID_Size size ) + { + CID_Face face = (CID_Face)size->root.face; + PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cid_size_done( FT_Size cidsize ) /* CID_Size */ + { + CID_Size size = (CID_Size)cidsize; + + + if ( cidsize->internal->module_data ) + { + PSH_Globals_Funcs funcs; + + + funcs = cid_size_get_globals_funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)cidsize->internal->module_data ); + + cidsize->internal->module_data = NULL; + } + } + + + FT_LOCAL_DEF( FT_Error ) + cid_size_init( FT_Size cidsize ) /* CID_Size */ + { + CID_Size size = (CID_Size)cidsize; + FT_Error error = FT_Err_Ok; + PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + CID_Face face = (CID_Face)cidsize->face; + CID_FaceDict dict = face->cid.font_dicts + face->root.face_index; + PS_Private priv = &dict->private_dict; + + + error = funcs->create( cidsize->face->memory, priv, &globals ); + if ( !error ) + cidsize->internal->module_data = globals; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_size_request( FT_Size size, + FT_Size_Request req ) + { + FT_Error error; + + PSH_Globals_Funcs funcs; + + + error = FT_Request_Metrics( size->face, req ); + if ( error ) + goto Exit; + + funcs = cid_size_get_globals_funcs( (CID_Size)size ); + + if ( funcs ) + funcs->set_scale( (PSH_Globals)size->internal->module_data, + size->metrics.x_scale, + size->metrics.y_scale, + 0, 0 ); + + Exit: + return error; + } + + + /************************************************************************** + * + * FACE FUNCTIONS + * + */ + + /************************************************************************** + * + * @Function: + * cid_face_done + * + * @Description: + * Finalizes a given face object. + * + * @Input: + * face :: + * A pointer to the face object to destroy. + */ + FT_LOCAL_DEF( void ) + cid_face_done( FT_Face cidface ) /* CID_Face */ + { + CID_Face face = (CID_Face)cidface; + FT_Memory memory; + CID_FaceInfo cid; + PS_FontInfo info; + + + if ( !face ) + return; + + cid = &face->cid; + info = &cid->font_info; + memory = cidface->memory; + + /* release subrs */ + if ( face->subrs ) + { + FT_UInt n; + + + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_Subrs subr = face->subrs + n; + + + if ( subr->code ) + { + FT_FREE( subr->code[0] ); + FT_FREE( subr->code ); + } + } + + FT_FREE( face->subrs ); + } + + /* release FontInfo strings */ + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + + /* release font dictionaries */ + FT_FREE( cid->font_dicts ); + cid->num_dicts = 0; + + /* release other strings */ + FT_FREE( cid->cid_font_name ); + FT_FREE( cid->registry ); + FT_FREE( cid->ordering ); + + cidface->family_name = NULL; + cidface->style_name = NULL; + + FT_FREE( face->binary_data ); + FT_FREE( face->cid_stream ); + } + + + /************************************************************************** + * + * @Function: + * cid_face_init + * + * @Description: + * Initializes a given CID face object. + * + * @Input: + * stream :: + * Dummy argument for compatibility with the `FT_Face_InitFunc` API. + * Ignored. The stream should be passed through `face->root.stream`. + * + * face_index :: + * The index of the font face in the resource. + * + * num_params :: + * Number of additional generic parameters. Ignored. + * + * params :: + * Additional generic parameters. Ignored. + * + * @InOut: + * face :: + * The newly built face object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + cid_face_init( FT_Stream stream, + FT_Face cidface, /* CID_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CID_Face face = (CID_Face)cidface; + FT_Error error; + PSAux_Service psaux; + PSHinter_Service pshinter; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + cidface->num_faces = 1; + + psaux = (PSAux_Service)face->psaux; + if ( !psaux ) + { + psaux = (PSAux_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psaux" ); + + if ( !psaux ) + { + FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + face->psaux = psaux; + } + + pshinter = (PSHinter_Service)face->pshinter; + if ( !pshinter ) + { + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "pshinter" ); + + face->pshinter = pshinter; + } + + FT_TRACE2(( "CID driver\n" )); + + /* open the tokenizer; this will also check the font format */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = cid_face_open( face, face_index ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + /* XXX: handle CID fonts with more than a single face */ + if ( ( face_index & 0xFFFF ) != 0 ) + { + FT_ERROR(( "cid_face_init: invalid face index\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ + { + CID_FaceInfo cid = &face->cid; + PS_FontInfo info = &cid->font_info; + + + cidface->num_glyphs = (FT_Long)cid->cid_count; + cidface->num_charmaps = 0; + + cidface->face_index = face_index & 0xFFFF; + + cidface->face_flags |= FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( info->is_fixed_pitch ) + cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* + * For the sfnt-wrapped CID fonts for MacOS, currently, + * its `cmap' tables are ignored, and the content in + * its `CID ' table is treated the same as naked CID-keyed + * font. See ft_lookup_PS_in_sfnt_stream(). + */ + cidface->face_flags |= FT_FACE_FLAG_CID_KEYED; + + /* XXX: TODO: add kerning with .afm support */ + + /* get style name -- be careful, some broken fonts only */ + /* have a /FontName dictionary entry! */ + cidface->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + cidface->style_name = (char *)"Regular"; + if ( cidface->family_name ) + { + char* full = info->full_name; + char* family = cidface->family_name; + + + if ( full ) + { + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + cidface->style_name = full; + break; + } + } + } + } + } + else + { + /* do we have a `/FontName'? */ + if ( cid->cid_font_name ) + cidface->family_name = cid->cid_font_name; + } + + /* compute style flags */ + cidface->style_flags = 0; + if ( info->italic_angle ) + cidface->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + cidface->style_flags |= FT_STYLE_FLAG_BOLD; + } + + /* no embedded bitmap support */ + cidface->num_fixed_sizes = 0; + cidface->available_sizes = NULL; + + cidface->bbox.xMin = cid->font_bbox.xMin >> 16; + cidface->bbox.yMin = cid->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16; + cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16; + + if ( !cidface->units_per_EM ) + cidface->units_per_EM = 1000; + + cidface->ascender = (FT_Short)( cidface->bbox.yMax ); + cidface->descender = (FT_Short)( cidface->bbox.yMin ); + + cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 ); + if ( cidface->height < cidface->ascender - cidface->descender ) + cidface->height = (FT_Short)( cidface->ascender - cidface->descender ); + + cidface->underline_position = (FT_Short)info->underline_position; + cidface->underline_thickness = (FT_Short)info->underline_thickness; + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * cid_driver_init + * + * @Description: + * Initializes a given CID driver object. + * + * @Input: + * driver :: + * A handle to the target driver object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + cid_driver_init( FT_Module module ) + { + PS_Driver driver = (PS_Driver)module; + + FT_UInt32 seed; + + + /* set default property values, cf. `ftt1drv.h' */ + driver->hinting_engine = FT_HINTING_ADOBE; + + driver->no_stem_darkening = TRUE; + + driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; + driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; + driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; + driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; + driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; + driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; + driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; + driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&module ^ + (FT_Offset)(char*)module->memory ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + + driver->random_seed = (FT_Int32)seed; + if ( driver->random_seed < 0 ) + driver->random_seed = -driver->random_seed; + else if ( driver->random_seed == 0 ) + driver->random_seed = 123456789; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * cid_driver_done + * + * @Description: + * Finalizes a given CID driver. + * + * @Input: + * driver :: + * A handle to the target CID driver. + */ + FT_LOCAL_DEF( void ) + cid_driver_done( FT_Module driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/external/freetype/src/cid/cidobjs.h b/external/freetype/src/cid/cidobjs.h new file mode 100644 index 000000000..83c0c61c3 --- /dev/null +++ b/external/freetype/src/cid/cidobjs.h @@ -0,0 +1,154 @@ +/**************************************************************************** + * + * cidobjs.h + * + * CID objects manager (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CIDOBJS_H_ +#define CIDOBJS_H_ + + +#include <ft2build.h> +#include <freetype/internal/ftobjs.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/t1types.h> + + +FT_BEGIN_HEADER + + + /* The following structures must be defined by the hinter */ + typedef struct CID_Size_Hints_ CID_Size_Hints; + typedef struct CID_Glyph_Hints_ CID_Glyph_Hints; + + + /************************************************************************** + * + * @Type: + * CID_Driver + * + * @Description: + * A handle to a Type 1 driver object. + */ + typedef struct CID_DriverRec_* CID_Driver; + + + /************************************************************************** + * + * @Type: + * CID_Size + * + * @Description: + * A handle to a Type 1 size object. + */ + typedef struct CID_SizeRec_* CID_Size; + + + /************************************************************************** + * + * @Type: + * CID_GlyphSlot + * + * @Description: + * A handle to a Type 1 glyph slot object. + */ + typedef struct CID_GlyphSlotRec_* CID_GlyphSlot; + + + /************************************************************************** + * + * @Type: + * CID_CharMap + * + * @Description: + * A handle to a Type 1 character mapping object. + * + * @Note: + * The Type 1 format doesn't use a charmap but an encoding table. + * The driver is responsible for making up charmap objects + * corresponding to these tables. + */ + typedef struct CID_CharMapRec_* CID_CharMap; + + + /************************************************************************** + * + * HERE BEGINS THE TYPE 1 SPECIFIC STUFF + * + */ + + + typedef struct CID_SizeRec_ + { + FT_SizeRec root; + FT_Bool valid; + + } CID_SizeRec; + + + typedef struct CID_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CID_GlyphSlotRec; + + + FT_LOCAL( void ) + cid_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cid_slot_init( FT_GlyphSlot slot ); + + + FT_LOCAL( void ) + cid_size_done( FT_Size size ); /* CID_Size */ + + FT_LOCAL( FT_Error ) + cid_size_init( FT_Size size ); /* CID_Size */ + + FT_LOCAL( FT_Error ) + cid_size_request( FT_Size size, /* CID_Size */ + FT_Size_Request req ); + + FT_LOCAL( FT_Error ) + cid_face_init( FT_Stream stream, + FT_Face face, /* CID_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cid_face_done( FT_Face face ); /* CID_Face */ + + + FT_LOCAL( FT_Error ) + cid_driver_init( FT_Module driver ); + + FT_LOCAL( void ) + cid_driver_done( FT_Module driver ); + + +FT_END_HEADER + +#endif /* CIDOBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/cid/cidparse.c b/external/freetype/src/cid/cidparse.c new file mode 100644 index 000000000..171a88621 --- /dev/null +++ b/external/freetype/src/cid/cidparse.c @@ -0,0 +1,286 @@ +/**************************************************************************** + * + * cidparse.c + * + * CID-keyed Type1 parser (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftstream.h> + +#include "cidparse.h" + +#include "ciderrs.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cidparse + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INPUT STREAM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define STARTDATA "StartData" +#define STARTDATA_LEN ( sizeof ( STARTDATA ) - 1 ) +#define SFNTS "/sfnts" +#define SFNTS_LEN ( sizeof ( SFNTS ) - 1 ) + + + FT_LOCAL_DEF( FT_Error ) + cid_parser_new( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error; + FT_ULong base_offset, offset, ps_len; + FT_Byte *cur, *limit; + FT_Byte *arg1, *arg2; + + + FT_ZERO( parser ); + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + + base_offset = FT_STREAM_POS(); + + /* first of all, check the font format in the header */ + if ( FT_FRAME_ENTER( 31 ) ) + { + FT_TRACE2(( " not a CID-keyed font\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( ft_strncmp( (char *)stream->cursor, + "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) ) + { + FT_TRACE2(( " not a CID-keyed font\n" )); + error = FT_THROW( Unknown_File_Format ); + } + + FT_FRAME_EXIT(); + if ( error ) + goto Exit; + + Again: + /* now, read the rest of the file until we find */ + /* `StartData' or `/sfnts' */ + { + /* + * The algorithm is as follows (omitting the case with less than 256 + * bytes to fill for simplicity). + * + * 1. Fill the buffer with 256 + STARTDATA_LEN bytes. + * + * 2. Search for the STARTDATA and SFNTS strings at positions + * buffer[0], buffer[1], ..., + * buffer[255 + STARTDATA_LEN - SFNTS_LEN]. + * + * 3. Move the last STARTDATA_LEN bytes to buffer[0]. + * + * 4. Fill the buffer with 256 bytes, starting at STARTDATA_LEN. + * + * 5. Repeat with step 2. + * + */ + FT_Byte buffer[256 + STARTDATA_LEN + 1]; + + /* values for the first loop */ + FT_ULong read_len = 256 + STARTDATA_LEN; + FT_ULong read_offset = 0; + FT_Byte* p = buffer; + + + for ( offset = FT_STREAM_POS(); ; offset += 256 ) + { + FT_ULong stream_len; + + + stream_len = stream->size - FT_STREAM_POS(); + + read_len = FT_MIN( read_len, stream_len ); + if ( FT_STREAM_READ( p, read_len ) ) + goto Exit; + + /* ensure that we do not compare with data beyond the buffer */ + p[read_len] = '\0'; + + limit = p + read_len - SFNTS_LEN; + + for ( p = buffer; p < limit; p++ ) + { + if ( p[0] == 'S' && + ft_strncmp( (char*)p, STARTDATA, STARTDATA_LEN ) == 0 ) + { + /* save offset of binary data after `StartData' */ + offset += (FT_ULong)( p - buffer ) + STARTDATA_LEN + 1; + goto Found; + } + else if ( p[1] == 's' && + ft_strncmp( (char*)p, SFNTS, SFNTS_LEN ) == 0 ) + { + offset += (FT_ULong)( p - buffer ) + SFNTS_LEN + 1; + goto Found; + } + } + + if ( read_offset + read_len < STARTDATA_LEN ) + { + FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_MEM_MOVE( buffer, + buffer + read_offset + read_len - STARTDATA_LEN, + STARTDATA_LEN ); + + /* values for the next loop */ + read_len = 256; + read_offset = STARTDATA_LEN; + p = buffer + read_offset; + } + } + + Found: + /* We have found the start of the binary data or the `/sfnts' token. */ + /* Now rewind and extract the frame corresponding to this PostScript */ + /* section. */ + + ps_len = offset - base_offset; + if ( FT_STREAM_SEEK( base_offset ) || + FT_FRAME_EXTRACT( ps_len, parser->postscript ) ) + goto Exit; + + parser->data_offset = offset; + parser->postscript_len = ps_len; + parser->root.base = parser->postscript; + parser->root.cursor = parser->postscript; + parser->root.limit = parser->root.cursor + ps_len; + parser->num_dict = FT_UINT_MAX; + + /* Finally, we check whether `StartData' or `/sfnts' was real -- */ + /* it could be in a comment or string. We also get the arguments */ + /* of `StartData' to find out whether the data is represented in */ + /* binary or hex format. */ + + arg1 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg2 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + + limit = parser->root.limit; + cur = parser->root.cursor; + + while ( cur <= limit - SFNTS_LEN ) + { + if ( parser->root.error ) + { + error = parser->root.error; + goto Exit; + } + + if ( cur[0] == 'S' && + cur <= limit - STARTDATA_LEN && + ft_strncmp( (char*)cur, STARTDATA, STARTDATA_LEN ) == 0 ) + { + T1_TokenRec type_token; + FT_Long binary_length; + + + parser->root.cursor = arg1; + cid_parser_to_token( parser, &type_token ); + if ( type_token.limit - type_token.start == 5 && + ft_memcmp( (char*)type_token.start, "(Hex)", 5 ) == 0 ) + { + parser->root.cursor = arg2; + binary_length = cid_parser_to_int( parser ); + if ( binary_length < 0 ) + { + FT_ERROR(( "cid_parser_new: invalid length of hex data\n" )); + error = FT_THROW( Invalid_File_Format ); + } + else + parser->binary_length = (FT_ULong)binary_length; + } + + goto Exit; + } + else if ( cur[1] == 's' && + ft_strncmp( (char*)cur, SFNTS, SFNTS_LEN ) == 0 ) + { + FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg1 = arg2; + arg2 = cur; + cur = parser->root.cursor; + } + + /* we haven't found the correct `StartData'; go back and continue */ + /* searching */ + FT_FRAME_RELEASE( parser->postscript ); + if ( !FT_STREAM_SEEK( offset ) ) + goto Again; + + Exit: + return error; + } + + +#undef STARTDATA +#undef STARTDATA_LEN +#undef SFNTS +#undef SFNTS_LEN + + + FT_LOCAL_DEF( void ) + cid_parser_done( CID_Parser* parser ) + { + /* always free the private dictionary */ + if ( parser->postscript ) + { + FT_Stream stream = parser->stream; + + + FT_FRAME_RELEASE( parser->postscript ); + } + parser->root.funcs.done( &parser->root ); + } + + +/* END */ diff --git a/external/freetype/src/cid/cidparse.h b/external/freetype/src/cid/cidparse.h new file mode 100644 index 000000000..2fd4e7a93 --- /dev/null +++ b/external/freetype/src/cid/cidparse.h @@ -0,0 +1,130 @@ +/**************************************************************************** + * + * cidparse.h + * + * CID-keyed Type1 parser (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CIDPARSE_H_ +#define CIDPARSE_H_ + + +#include <freetype/internal/t1types.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/psaux.h> + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @Struct: + * CID_Parser + * + * @Description: + * A CID_Parser is an object used to parse a Type 1 fonts very + * quickly. + * + * @Fields: + * root :: + * The root PS_ParserRec fields. + * + * stream :: + * The current input stream. + * + * postscript :: + * A pointer to the data to be parsed. + * + * postscript_len :: + * The length of the data to be parsed. + * + * data_offset :: + * The start position of the binary data (i.e., the + * end of the data to be parsed. + * + * binary_length :: + * The length of the data after the `StartData' + * command if the data format is hexadecimal. + * + * cid :: + * A structure which holds the information about + * the current font. + * + * num_dict :: + * The number of font dictionaries. + */ + typedef struct CID_Parser_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* postscript; + FT_ULong postscript_len; + + FT_ULong data_offset; + + FT_ULong binary_length; + + CID_FaceInfo cid; + FT_UInt num_dict; + + } CID_Parser; + + + FT_LOCAL( FT_Error ) + cid_parser_new( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( void ) + cid_parser_done( CID_Parser* parser ); + + + /************************************************************************** + * + * PARSING ROUTINES + * + */ + +#define cid_parser_skip_spaces( p ) \ + (p)->root.funcs.skip_spaces( &(p)->root ) +#define cid_parser_skip_PS_token( p ) \ + (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root ) +#define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define cid_parser_to_coord_array( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define cid_parser_to_fixed_array( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define cid_parser_to_token( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define cid_parser_to_token_array( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define cid_parser_load_field( p, f, o ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 ) +#define cid_parser_load_field_table( p, f, o ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 ) + + +FT_END_HEADER + +#endif /* CIDPARSE_H_ */ + + +/* END */ diff --git a/external/freetype/src/cid/cidriver.c b/external/freetype/src/cid/cidriver.c new file mode 100644 index 000000000..99e7b1183 --- /dev/null +++ b/external/freetype/src/cid/cidriver.c @@ -0,0 +1,274 @@ +/**************************************************************************** + * + * cidriver.c + * + * CID driver interface (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "cidriver.h" +#include "cidgload.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftpsprop.h> + +#include "ciderrs.h" + +#include <freetype/internal/services/svpostnm.h> +#include <freetype/internal/services/svfntfmt.h> +#include <freetype/internal/services/svpsinfo.h> +#include <freetype/internal/services/svcid.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/ftdriver.h> + +#include <freetype/internal/psaux.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ciddriver + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + FT_CALLBACK_DEF( const char* ) + cid_get_postscript_name( FT_Face face ) /* CID_Face */ + { + CID_Face cidface = (CID_Face)face; + const char* result = cidface->cid.cid_font_name; + + + if ( result && result[0] == '/' ) + result++; + + return result; + } + + + static const FT_Service_PsFontNameRec cid_service_ps_name = + { + (FT_PsName_GetFunc)cid_get_postscript_name /* get_ps_font_name */ + }; + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + cid_ps_get_font_info( FT_Face face, /* CID_Face */ + PS_FontInfoRec* afont_info ) + { + *afont_info = ( (CID_Face)face )->cid.font_info; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + cid_ps_get_font_extra( FT_Face face, /* CID_Face */ + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ( (CID_Face)face )->font_extra; + + return FT_Err_Ok; + } + + + static const FT_Service_PsInfoRec cid_service_ps_info = + { + cid_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */ + cid_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */ + /* unsupported with CID fonts */ + NULL, /* PS_HasGlyphNamesFunc ps_has_glyph_names */ + /* unsupported */ + NULL, /* PS_GetFontPrivateFunc ps_get_font_private */ + /* not implemented */ + NULL /* PS_GetFontValueFunc ps_get_font_value */ + }; + + + /* + * CID INFO SERVICE + * + */ + FT_CALLBACK_DEF( FT_Error ) + cid_get_ros( FT_Face face, /* CID_Face */ + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + CID_Face cidface = (CID_Face)face; + CID_FaceInfo cid = &cidface->cid; + + + if ( registry ) + *registry = cid->registry; + + if ( ordering ) + *ordering = cid->ordering; + + if ( supplement ) + *supplement = cid->supplement; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + cid_get_is_cid( FT_Face face, /* CID_Face */ + FT_Bool *is_cid ) + { + FT_Error error = FT_Err_Ok; + FT_UNUSED( face ); + + + /* + * XXX: If the ROS is Adobe-Identity-H or -V, + * the font has no reliable information about + * its glyph collection. Should we not set + * *is_cid in such cases? + */ + if ( is_cid ) + *is_cid = 1; + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cid_get_cid_from_glyph_index( FT_Face face, /* CID_Face */ + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_Err_Ok; + CID_Face cidface = (CID_Face)face; + + + /* + * Currently, FreeType does not support incrementally-defined, CID-keyed + * fonts that store the glyph description data in a `/GlyphDirectory` + * array or dictionary. Fonts loaded by the incremental loading feature + * are thus not handled here. + */ + error = cid_compute_fd_and_offsets( cidface, glyph_index, + NULL, NULL, NULL ); + if ( error ) + *cid = 0; + else + *cid = glyph_index; + + return error; + } + + + static const FT_Service_CIDRec cid_service_cid_info = + { + cid_get_ros, + /* FT_CID_GetRegistryOrderingSupplementFunc get_ros */ + cid_get_is_cid, + /* FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid */ + cid_get_cid_from_glyph_index + /* FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index */ + }; + + + /* + * PROPERTY SERVICE + * + */ + + FT_DEFINE_SERVICE_PROPERTIESREC( + cid_service_properties, + + ps_property_set, /* FT_Properties_SetFunc set_property */ + ps_property_get /* FT_Properties_GetFunc get_property */ + ) + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec cid_services[] = + { + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CID }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, + { FT_SERVICE_ID_CID, &cid_service_cid_info }, + { FT_SERVICE_ID_PROPERTIES, &cid_service_properties }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cid_get_interface( FT_Module module, + const char* cid_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( cid_services, cid_interface ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1cid_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + sizeof ( PS_DriverRec ), + + "t1cid", /* module name */ + 0x10000L, /* version 1.0 of driver */ + 0x20000L, /* requires FreeType 2.0 */ + + NULL, /* module-specific interface */ + + cid_driver_init, /* FT_Module_Constructor module_init */ + cid_driver_done, /* FT_Module_Destructor module_done */ + cid_get_interface /* FT_Module_Requester get_interface */ + }, + + sizeof ( CID_FaceRec ), + sizeof ( CID_SizeRec ), + sizeof ( CID_GlyphSlotRec ), + + cid_face_init, /* FT_Face_InitFunc init_face */ + cid_face_done, /* FT_Face_DoneFunc done_face */ + cid_size_init, /* FT_Size_InitFunc init_size */ + cid_size_done, /* FT_Size_DoneFunc done_size */ + cid_slot_init, /* FT_Slot_InitFunc init_slot */ + cid_slot_done, /* FT_Slot_DoneFunc done_slot */ + + cid_slot_load_glyph, /* FT_Slot_LoadFunc load_glyph */ + + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ + + cid_size_request, /* FT_Size_RequestFunc request_size */ + NULL /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/cid/cidriver.h b/external/freetype/src/cid/cidriver.h new file mode 100644 index 000000000..a6249385c --- /dev/null +++ b/external/freetype/src/cid/cidriver.h @@ -0,0 +1,36 @@ +/**************************************************************************** + * + * cidriver.h + * + * High-level CID driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CIDRIVER_H_ +#define CIDRIVER_H_ + + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_CALLBACK_TABLE + const FT_Driver_ClassRec t1cid_driver_class; + +FT_END_HEADER + +#endif /* CIDRIVER_H_ */ + + +/* END */ diff --git a/external/freetype/src/cid/cidtoken.h b/external/freetype/src/cid/cidtoken.h new file mode 100644 index 000000000..925951acd --- /dev/null +++ b/external/freetype/src/cid/cidtoken.h @@ -0,0 +1,115 @@ +/**************************************************************************** + * + * cidtoken.h + * + * CID token definitions (specification only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FaceInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_CID_INFO + + T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 ) + T1_FIELD_FIXED ( "CIDFontVersion", cid_version, 0 ) + T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 ) + T1_FIELD_STRING ( "Registry", registry, 0 ) + T1_FIELD_STRING ( "Ordering", ordering, 0 ) + T1_FIELD_NUM ( "Supplement", supplement, 0 ) + T1_FIELD_NUM ( "UIDBase", uid_base, 0 ) + + T1_FIELD_NUM_TABLE( "XUID", xuid, 16, 0 ) + + T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 ) + T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 ) + T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 ) + T1_FIELD_NUM ( "CIDCount", cid_count, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, 0 ) + T1_FIELD_STRING( "Notice", notice, 0 ) + T1_FIELD_STRING( "FullName", full_name, 0 ) + T1_FIELD_STRING( "FamilyName", family_name, 0 ) + T1_FIELD_STRING( "Weight", weight, 0 ) + T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FaceDictRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_NUM ( "PaintType", paint_type, 0 ) + T1_FIELD_NUM ( "FontType", font_type, 0 ) + T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 ) + T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 ) + T1_FIELD_NUM ( "SubrCount", num_subrs, 0 ) + T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 ) + T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_PrivateRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_PRIVATE + + T1_FIELD_NUM ( "UniqueID", unique_id, 0 ) + T1_FIELD_NUM ( "lenIV", lenIV, 0 ) + T1_FIELD_NUM ( "LanguageGroup", language_group, 0 ) + T1_FIELD_NUM ( "password", password, 0 ) + + T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 ) + T1_FIELD_NUM ( "BlueShift", blue_shift, 0 ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 ) + + T1_FIELD_BOOL ( "ForceBold", force_bold, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, 0 ) + + +/* END */ diff --git a/external/freetype/src/cid/module.mk b/external/freetype/src/cid/module.mk new file mode 100644 index 000000000..563cb3489 --- /dev/null +++ b/external/freetype/src/cid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 CID module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE1CID_DRIVER + +define TYPE1CID_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/cid/rules.mk b/external/freetype/src/cid/rules.mk new file mode 100644 index 000000000..c526ad38d --- /dev/null +++ b/external/freetype/src/cid/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 CID driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# CID driver directory +# +CID_DIR := $(SRC_DIR)/cid + + +CID_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(CID_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# CID driver sources (i.e., C files) +# +CID_DRV_SRC := $(CID_DIR)/cidparse.c \ + $(CID_DIR)/cidload.c \ + $(CID_DIR)/cidriver.c \ + $(CID_DIR)/cidgload.c \ + $(CID_DIR)/cidobjs.c + +# CID driver headers +# +CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \ + $(CID_DIR)/cidtoken.h \ + $(CID_DIR)/ciderrs.h + + +# CID driver object(s) +# +# CID_DRV_OBJ_M is used during `multi' builds +# CID_DRV_OBJ_S is used during `single' builds +# +CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O) +CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O + +# CID driver source file for single build +# +CID_DRV_SRC_S := $(CID_DIR)/type1cid.c + + +# CID driver - single object +# +$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S)) + + +# CID driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CID_DRV_OBJ_S) +DRV_OBJS_M += $(CID_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/cid/type1cid.c b/external/freetype/src/cid/type1cid.c new file mode 100644 index 000000000..905c896a3 --- /dev/null +++ b/external/freetype/src/cid/type1cid.c @@ -0,0 +1,28 @@ +/**************************************************************************** + * + * type1cid.c + * + * FreeType OpenType driver component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "cidgload.c" +#include "cidload.c" +#include "cidobjs.c" +#include "cidparse.c" +#include "cidriver.c" + + +/* END */ diff --git a/external/freetype/src/dlg/dlgwrap.c b/external/freetype/src/dlg/dlgwrap.c new file mode 100644 index 000000000..e9dc3410a --- /dev/null +++ b/external/freetype/src/dlg/dlgwrap.c @@ -0,0 +1,32 @@ +/**************************************************************************** + * + * dlgwrap.c + * + * Wrapper file for the 'dlg' library (body only) + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <ft2build.h> +#include FT_CONFIG_OPTIONS_H + + +#ifdef FT_DEBUG_LOGGING +#define DLG_STATIC +#include "dlg.c" +#else + /* ANSI C doesn't like empty source files */ + typedef int dlg_dummy_; +#endif + + +/* END */ diff --git a/external/freetype/src/dlg/rules.mk b/external/freetype/src/dlg/rules.mk new file mode 100644 index 000000000..7f506fd35 --- /dev/null +++ b/external/freetype/src/dlg/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 dlg logging library configuration rules +# + + +# Copyright (C) 2020-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# dlg logging library directory +# +DLG_DIR := $(SRC_DIR)/dlg + + +# compilation flags for the library +# +DLG_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(DLG_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# dlg logging library sources (i.e., C files) +# +DLG_SRC := $(DLG_DIR)/dlgwrap.c + +# dlg logging library headers +# +DLG_H := $(TOP_DIR)/include/dlg/dlg.h \ + $(TOP_DIR)/include/dlg/output.h + + +# dlg logging library object(s) +# +# DLG_OBJ_M is used during `multi' builds +# DLG_OBJ_S is used during `single' builds +# +DLG_OBJ_M := $(DLG_SRC:$(DLG_DIR)/%.c=$(OBJ_DIR)/%.$O) +DLG_OBJ_S := $(OBJ_DIR)/dlg.$O + +# dlg logging library source file for single build +# +DLG_SRC_S := $(DLG_DIR)/dlgwrap.c + + +# dlg logging library - single object +# +$(DLG_OBJ_S): $(DLG_SRC_S) $(DLG_SRC) $(FREETYPE_H) $(DLG_H) + $(DLG_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(DLG_SRC_S)) + + +# dlg logging library - multiple objects +# +$(OBJ_DIR)/%.$O: $(DLG_DIR)/%.c $(FREETYPE_H) $(DLG_H) + $(DLG_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main object lists +# +DLG_OBJS_S += $(DLG_OBJ_S) +DLG_OBJS_M += $(DLG_OBJ_M) + + +# EOF diff --git a/external/freetype/src/gxvalid/README b/external/freetype/src/gxvalid/README new file mode 100644 index 000000000..0e3db322e --- /dev/null +++ b/external/freetype/src/gxvalid/README @@ -0,0 +1,532 @@ +gxvalid: TrueType GX validator +============================== + + +1. What is this +--------------- + + `gxvalid' is a module to validate TrueType GX tables: a collection of + additional tables in TrueType font which are used by `QuickDraw GX + Text', Apple Advanced Typography (AAT). In addition, gxvalid can + validates `kern' tables which have been extended for AAT. Like the + otvalid module, gxvalid uses FreeType 2's validator framework + (ftvalid). + + You can link gxvalid with your program; before running your own layout + engine, gxvalid validates a font file. As the result, you can remove + error-checking code from the layout engine. It is also possible to + use gxvalid as a stand-alone font validator; the `ftvalid' test + program included in the ft2demo bundle calls gxvalid internally. + A stand-alone font validator may be useful for font developers. + + This documents documents the following issues. + + - supported TrueType GX tables + - fundamental validation limitations + - permissive error handling of broken GX tables + - `kern' table issue. + + +2. Supported tables +------------------- + + The following GX tables are currently supported. + + bsln + feat + just + kern(*) + lcar + mort + morx + opbd + prop + trak + + The following GX tables are currently unsupported. + + cvar + fdsc + fmtx + fvar + gvar + Zapf + + The following GX tables won't be supported. + + acnt(**) + hsty(***) + + The following undocumented tables in TrueType fonts designed for Apple + platform aren't handled either. + + addg + CVTM + TPNM + umif + + + *) The `kern' validator handles both the classic and the new kern + formats; the former is supported on both Microsoft and Apple + platforms, while the latter is supported on Apple platforms. + + **) `acnt' tables are not supported by currently available Apple font + tools. + + ***) There is one more Apple extension, `hsty', but it is for + Newton-OS, not GX (Newton-OS is a platform by Apple, but it can + use sfnt- housed bitmap fonts only). Therefore, it should be + excluded from `Apple platform' in the context of TrueType. + gxvalid ignores it as Apple font tools do so. + + + We have checked 183 fonts bundled with MacOS 9.1, MacOS 9.2, MacOS + 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. In addition, + we have checked 67 Dynalab fonts (designed for MacOS) and 189 Ricoh + fonts (designed for Windows and MacOS dual platforms). The number of + fonts including TrueType GX tables are as follows. + + bsln: 76 + feat: 191 + just: 84 + kern: 59 + lcar: 4 + mort: 326 + morx: 19 + opbd: 4 + prop: 114 + trak: 16 + + Dynalab and Ricoh fonts don't have GX tables except of `feat' and + `mort'. + + +3. Fundamental validation limitations +------------------------------------- + + TrueType GX provides layout information to libraries for font + rasterizers and text layout. gxvalid can check whether the layout + data in a font is conformant to the TrueType GX format specified by + Apple. But gxvalid cannot check a how QuickDraw GX/AAT renderer uses + the stored information. + + 3-1. Validation of State Machine activity + ----------------------------------------- + + QuickDraw GX/AAT uses a `State Machine' to provide `stateful' layout + features, and TrueType GX stores the state transition diagram of + this `State Machine' in a `StateTable' data structure. While the + State Machine receives a series of glyph IDs, the State Machine + starts with `start of text' state, walks around various states and + generates various layout information to the renderer, and finally + reaches the `end of text' state. + + gxvalid can check essential errors like: + + - possibility of state transitions to undefined states + - existence of glyph IDs that the State Machine doesn't know how + to handle + - the State Machine cannot compute the layout information from + given diagram + + These errors can be checked within finite steps, and without the + State Machine itself, because these are `expression' errors of state + transition diagram. + + There is no limitation about how long the State Machine walks + around, so validation of the algorithm in the state transition + diagram requires infinite steps, even if we had a State Machine in + gxvalid. Therefore, the following errors and problems cannot be + checked. + + - existence of states which the State Machine never transits to + - the possibility that the State Machine never reaches `end of + text' + - the possibility of stack underflow/overflow in the State Machine + (in ligature and contextual glyph substitutions, the State + Machine can store 16 glyphs onto its stack) + + In addition, gxvalid doesn't check `temporary glyph IDs' used in the + chained State Machines (in `mort' and `morx' tables). If a layout + feature is implemented by a single State Machine, a glyph ID + converted by the State Machine is passed to the glyph renderer, thus + it should not point to an undefined glyph ID. But if a layout + feature is implemented by chained State Machines, a component State + Machine (if it is not the final one) is permitted to generate + undefined glyph IDs for temporary use, because it is handled by next + component State Machine and not by the glyph renderer. To validate + such temporary glyph IDs, gxvalid must stack all undefined glyph IDs + which can occur in the output of the previous State Machine and + search them in the `ClassTable' structure of the current State + Machine. It is too complex to list all possible glyph IDs from the + StateTable, especially from a ligature substitution table. + + 3-2. Validation of relationship between multiple layout features + ---------------------------------------------------------------- + + gxvalid does not validate the relationship between multiple layout + features at all. + + If multiple layout features are defined in TrueType GX tables, + possible interactions, overrides, and conflicts between layout + features are implicitly given in the font too. For example, there + are several predefined spacing control features: + + - Text Spacing (Proportional/Monospace/Half-width/Normal) + - Number Spacing (Monospaced-numbers/Proportional-numbers) + - Kana Spacing (Full-width/Proportional) + - Ideographic Spacing (Full-width/Proportional) + - CJK Roman Spacing (Half-width/Proportional/Default-roman + /Full-width-roman/Proportional) + + If all layout features are independently managed, we can activate + inconsistent typographic rules like `Text Spacing=Monospace' and + `Ideographic Spacing=Proportional' at the same time. + + The combinations of layout features is managed by a 32bit integer + (one bit each for selector setting), so we can define relationships + between up to 32 features, theoretically. But if one feature + setting affects another feature setting, we need typographic + priority rules to validate the relationship. Unfortunately, the + TrueType GX format specification does not give such information even + for predefined features. + + +4. Permissive error handling of broken GX tables +------------------------------------------------ + + When Apple's font rendering system finds an inconsistency, like a + specification violation or an unspecified value in a TrueType GX + table, it does not always return error. In most cases, the rendering + engine silently ignores such wrong values or even whole tables. In + fact, MacOS is shipped with fonts including broken GX/AAT tables, but + no harmful effects due to `officially broken' fonts are observed by + end-users. + + gxvalid is designed to continue the validation process as long as + possible. When gxvalid find wrong values, gxvalid warns it at least, + and takes a fallback procedure if possible. The fallback procedure + depends on the debug level. + + We used the following three tools to investigate Apple's error handling. + + - FontValidator (for MacOS 8.5 - 9.2) resource fork font + - ftxvalidator (for MacOS X 10.1 -) dfont or naked-sfnt + - ftxdumperfuser (for MacOS X 10.1 -) dfont or naked-sfnt + + However, all tests were done on a PowerPC based Macintosh; at present, + we have not checked those tools on a m68k-based Macintosh. + + In total, we checked 183 fonts bundled to MacOS 9.1, MacOS 9.2, MacOS + 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. These fonts + are distributed officially, but many broken GX/AAT tables were found + by Apple's font tools. In the following, we list typical violation of + the GX specification, in fonts officially distributed with those Apple + systems. + + 4-1. broken BinSrchHeader (19/183) + ---------------------------------- + + `BinSrchHeader' is a header of a data array for m68k platforms to + access memory efficiently. Although there are only two independent + parameters for real (`unitSize' and `nUnits'), BinSrchHeader has + three additional parameters which can be calculated from `unitSize' + and `nUnits', for fast setup. Apple font tools ignore them + silently, so gxvalid warns if it finds and inconsistency, and always + continues validation. The additional parameters are ignored + regardless of the consistency. + + 19 fonts include such inconsistencies; all breaks are in the + BinSrchHeader structure of the `kern' table. + + 4-2. too-short LookupTable (5/183) + ---------------------------------- + + LookupTable format 0 is a simple array to get a value from a given + GID (glyph ID); the index of this array is a GID too. Therefore, + the length of the array is expected to be same as the maximum GID + value defined in the `maxp' table, but there are some fonts whose + LookupTable format 0 is too short to cover all GIDs. FontValidator + ignores this error silently, ftxvalidator and ftxdumperfuser both + warn and continue. Similar problems are found in format 3 subtables + of `kern'. gxvalid warns always and abort if the validation level + is set to FT_VALIDATE_PARANOID. + + 5 fonts include too-short kern format 0 subtables. + 1 font includes too-short kern format 3 subtable. + + 4-3. broken LookupTable format 2 (1/183) + ---------------------------------------- + + LookupTable format 2, subformat 4 covers the GID space by a + collection of segments which are specified by `firstGlyph' and + `lastGlyph'. Some fonts store `firstGlyph' and `lastGlyph' in + reverse order, so the segment specification is broken. Apple font + tools ignore this error silently; a broken segment is ignored as if + it did not exist. gxvalid warns and normalize the segment at + FT_VALIDATE_DEFAULT, or ignore the segment at FT_VALIDATE_TIGHT, or + abort at FT_VALIDATE_PARANOID. + + 1 font includes broken LookupTable format 2, in the `just' table. + + *) It seems that all fonts manufactured by ITC for AppleWorks have + this error. + + 4-4. bad bracketing in glyph property (14/183) + ---------------------------------------------- + + GX/AAT defines a `bracketing' property of the glyphs in the `prop' + table, to control layout features of strings enclosed inside and + outside of brackets. Some fonts give inappropriate bracket + properties to glyphs. Apple font tools warn about this error; + gxvalid warns too and aborts at FT_VALIDATE_PARANOID. + + 14 fonts include wrong bracket properties. + + + 4-5. invalid feature number (117/183) + ------------------------------------- + + The GX/AAT extension can include 255 different layout features, + but popular layout features are predefined (see + https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html). + Some fonts include feature numbers which are incompatible with the + predefined feature registry. + + In our survey, there are 140 fonts including `feat' table. + + a) 67 fonts use a feature number which should not be used. + b) 117 fonts set the wrong feature range (nSetting). This is mostly + found in the `mort' and `morx' tables. + + Apple font tools give no warning, although they cannot recognize + what the feature is. At FT_VALIDATE_DEFAULT, gxvalid warns but + continues in both cases (a, b). At FT_VALIDATE_TIGHT, gxvalid warns + and aborts for (a), but continues for (b). At FT_VALIDATE_PARANOID, + gxvalid warns and aborts in both cases (a, b). + + 4-6. invalid prop version (10/183) + ---------------------------------- + + As most TrueType GX tables, the `prop' table must start with a 32bit + version identifier: 0x00010000, 0x00020000 or 0x00030000. But some + fonts store nonsense binary data instead. When Apple font tools + find them, they abort the processing immediately, and the data which + follows is unhandled. gxvalid does the same. + + 10 fonts include broken `prop' version. + + All of these fonts are classic TrueType fonts for the Japanese + script, manufactured by Apple. + + 4-7. unknown resource name (2/183) + ------------------------------------ + + NOTE: THIS IS NOT A TRUETYPE GX ERROR. + + If a TrueType font is stored in the resource fork or in dfont + format, the data must be tagged as `sfnt' in the resource fork index + to invoke TrueType font handler for the data. But the TrueType font + data in `Keyboard.dfont' is tagged as `kbd', and that in + `LastResort.dfont' is tagged as `lst'. Apple font tools can detect + that the data is in TrueType format and successfully validate them. + Maybe this is possible because they are known to be dfont. The + current implementation of the resource fork driver of FreeType + cannot do that, thus gxvalid cannot validate them. + + 2 fonts use an unknown tag for the TrueType font resource. + +5. `kern' table issues +---------------------- + + In common terminology of TrueType, `kern' is classified as a basic and + platform-independent table. But there are Apple extensions of `kern', + and there is an extension which requires a GX state machine for + contextual kerning. Therefore, gxvalid includes a special validator + for `kern' tables. Unfortunately, there is no exact algorithm to + check Apple's extension, so gxvalid includes a heuristic algorithm to + find the proper validation routines for all possible data formats, + including the data format for Microsoft. By calling + classic_kern_validate() instead of gxv_validate(), you can specify the + `kern' format explicitly. However, current FreeType2 uses Microsoft + `kern' format only, others are ignored (and should be handled in a + library one level higher than FreeType). + + 5-1. History + ------------ + + The original 16bit version of `kern' was designed by Apple in the + pre-GX era, and it was also approved by Microsoft. Afterwards, + Apple designed a new 32bit version of the `kern' table. According + to the documentation, the difference between the 16bit and 32bit + version is only the size of variables in the `kern' header. In the + following, we call the original 16bit version as `classic', and + 32bit version as `new'. + + 5-2. Versions and dialects which should be differentiated + --------------------------------------------------------- + + The `kern' table consists of a table header and several subtables. + The version number which identifies a `classic' or a `new' version + is explicitly written in the table header, but there are + undocumented differences between Microsoft's and Apple's formats. + It is called a `dialect' in the following. There are three cases + which should be handled: the new Apple-dialect, the classic + Apple-dialect, and the classic Microsoft-dialect. An analysis of + the formats and the auto detection algorithm of gxvalid is described + in the following. + + 5-2-1. Version detection: classic and new kern + ---------------------------------------------- + + According to Apple TrueType specification, there are only two + differences between the classic and the new: + + - The `kern' table header starts with the version number. + The classic version starts with 0x0000 (16bit), + the new version starts with 0x00010000 (32bit). + + - In the `kern' table header, the number of subtables follows + the version number. + In the classic version, it is stored as a 16bit value. + In the new version, it is stored as a 32bit value. + + From Apple font tool's output (DumpKERN is also tested in addition + to the three Apple font tools in above), there is another + undocumented difference. In the new version, the subtable header + includes a 16bit variable named `tupleIndex' which does not exist + in the classic version. + + The new version can store all subtable formats (0, 1, 2, and 3), + but the Apple TrueType specification does not mention the subtable + formats available in the classic version. + + 5-2-2. Available subtable formats in classic version + ---------------------------------------------------- + + Although the Apple TrueType specification recommends to use the + classic version in the case if the font is designed for both the + Apple and Microsoft platforms, it does not document the available + subtable formats in the classic version. + + According to the Microsoft TrueType specification, the subtable + format assured for Windows and OS/2 support is only subtable + format 0. The Microsoft TrueType specification also describes + subtable format 2, but does not mention which platforms support + it. Subtable formats 1, 3, and higher are documented as reserved + for future use. Therefore, the classic version can store subtable + formats 0 and 2, at least. `ttfdump.exe', a font tool provided by + Microsoft, ignores the subtable format written in the subtable + header, and parses the table as if all subtables are in format 0. + + `kern' subtable format 1 uses a StateTable, so it cannot be + utilized without a GX State Machine. Therefore, it is reasonable + to assume that format 1 (and 3) were introduced after Apple had + introduced GX and moved to the new 32bit version. + + 5-2-3. Apple and Microsoft dialects + ----------------------------------- + + The `kern' subtable has a 16bit `coverage' field to describe + kerning attributes, but bit interpretations by Apple and Microsoft + are different: For example, Apple uses bits 0-7 to identify the + subtable, while Microsoft uses bits 8-15. + + In addition, due to the output of DumpKERN and FontValidator, + Apple's bit interpretations of coverage in classic and new version + are incompatible also. In summary, there are three dialects: + classic Apple dialect, classic Microsoft dialect, and new Apple + dialect. The classic Microsoft dialect and the new Apple dialect + are documented by each vendors' TrueType font specification, but + the documentation for classic Apple dialect is not available. + + For example, in the new Apple dialect, bit 15 is documented as + `set to 1 if the kerning is vertical'. On the other hand, in + classic Microsoft dialect, bit 1 is documented as `set to 1 if the + kerning is horizontal'. From the outputs of DumpKERN and + FontValidator, classic Apple dialect recognizes 15 as `set to 1 + when the kerning is horizontal'. From the results of similar + experiments, classic Apple dialect seems to be the Endian reverse + of the classic Microsoft dialect. + + As a conclusion it must be noted that no font tool can identify + classic Apple dialect or classic Microsoft dialect automatically. + + 5-2-4. gxvalid auto dialect detection algorithm + ----------------------------------------------- + + The first 16 bits of the `kern' table are enough to identify the + version: + + - if the first 16 bits are 0x0000, the `kern' table is in + classic Apple dialect or classic Microsoft dialect + - if the first 16 bits are 0x0001, and next 16 bits are 0x0000, + the kern table is in new Apple dialect. + + If the `kern' table is a classic one, the 16bit `coverage' field + is checked next. Firstly, the coverage bits are decoded for the + classic Apple dialect using the following bit masks (this is based + on DumpKERN output): + + 0x8000: 1=horizontal, 0=vertical + 0x4000: not used + 0x2000: 1=cross-stream, 0=normal + 0x1FF0: reserved + 0x000F: subtable format + + If any of reserved bits are set or the subtable bits is + interpreted as format 1 or 3, we take it as `impossible in classic + Apple dialect' and retry, using the classic Microsoft dialect. + + The most popular coverage in new Apple-dialect: 0x8000, + The most popular coverage in classic Apple-dialect: 0x0000, + The most popular coverage in classic Microsoft dialect: 0x0001. + + 5-3. Tested fonts + ----------------- + + We checked 59 fonts bundled with MacOS and 38 fonts bundled with + Windows, where all font include a `kern' table. + + - fonts bundled with MacOS + * new Apple dialect + format 0: 18 + format 2: 1 + format 3: 1 + * classic Apple dialect + format 0: 14 + * classic Microsoft dialect + format 0: 15 + + - fonts bundled with Windows + * classic Microsoft dialect + format 0: 38 + + It looks strange that classic Microsoft-dialect fonts are bundled to + MacOS: they come from MSIE for MacOS, except of MarkerFelt.dfont. + + + ACKNOWLEDGEMENT + --------------- + + Some parts of gxvalid are derived from both the `gxlayout' module and + the `otvalid' module. Development of gxlayout was supported by the + Information-technology Promotion Agency(IPA), Japan. + + The detailed analysis of undefined glyph ID utilization in `mort' and + `morx' tables is provided by George Williams. + +------------------------------------------------------------------------ + +Copyright (C) 2004-2023 by +suzuki toshiya, Masatake YAMATO, Red hat K.K., +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of README --- diff --git a/external/freetype/src/gxvalid/gxvalid.c b/external/freetype/src/gxvalid/gxvalid.c new file mode 100644 index 000000000..e0359f4df --- /dev/null +++ b/external/freetype/src/gxvalid/gxvalid.c @@ -0,0 +1,46 @@ +/**************************************************************************** + * + * gxvalid.c + * + * FreeType validator for TrueTypeGX/AAT tables (body only). + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "gxvbsln.c" +#include "gxvcommn.c" +#include "gxvfeat.c" +#include "gxvjust.c" +#include "gxvkern.c" +#include "gxvlcar.c" +#include "gxvmod.c" +#include "gxvmort.c" +#include "gxvmort0.c" +#include "gxvmort1.c" +#include "gxvmort2.c" +#include "gxvmort4.c" +#include "gxvmort5.c" +#include "gxvmorx.c" +#include "gxvmorx0.c" +#include "gxvmorx1.c" +#include "gxvmorx2.c" +#include "gxvmorx4.c" +#include "gxvmorx5.c" +#include "gxvopbd.c" +#include "gxvprop.c" +#include "gxvtrak.c" + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvalid.h b/external/freetype/src/gxvalid/gxvalid.h new file mode 100644 index 000000000..a83408b41 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvalid.h @@ -0,0 +1,107 @@ +/**************************************************************************** + * + * gxvalid.h + * + * TrueTypeGX/AAT table validation (specification only). + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef GXVALID_H_ +#define GXVALID_H_ + +#include <freetype/freetype.h> + +#include "gxverror.h" /* must come before `ftvalid.h' */ + +#include <freetype/internal/ftvalid.h> +#include <freetype/internal/ftstream.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + gxv_feat_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + + FT_LOCAL( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + + FT_LOCAL( void ) + gxv_trak_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_just_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_kern_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_kern_validate_classic( FT_Bytes table, + FT_Face face, + FT_Int dialect_flags, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_prop_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + +FT_END_HEADER + + +#endif /* GXVALID_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvbsln.c b/external/freetype/src/gxvalid/gxvbsln.c new file mode 100644 index 000000000..030a64ee4 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvbsln.c @@ -0,0 +1,334 @@ +/**************************************************************************** + * + * gxvbsln.c + * + * TrueTypeGX/AAT bsln table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvbsln + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_BSLN_VALUE_COUNT 32 +#define GXV_BSLN_VALUE_EMPTY 0xFFFFU + + + typedef struct GXV_bsln_DataRec_ + { + FT_Bytes ctlPoints_p; + FT_UShort defaultBaseline; + + } GXV_bsln_DataRec, *GXV_bsln_Data; + + +#define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_bsln_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_UShort v = value_p->u; + FT_UShort* ctlPoints; + + FT_UNUSED( glyph ); + + + GXV_NAME_ENTER( "lookup value" ); + + if ( v >= GXV_BSLN_VALUE_COUNT ) + FT_INVALID_DATA; + + ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p ); + if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY ) + FT_INVALID_DATA; + + GXV_EXIT; + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + ... | + | + 16bit value array | + +===============+ | + | value | <-------+ + ... + */ + + static GXV_LookupValueDesc + gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range ? */ + offset = (FT_UShort)( base_value_p->u + + ( relative_gindex * sizeof ( FT_UShort ) ) ); + + p = gxvalid->lookuptbl_head + offset; + limit = lookuptbl_limit; + GXV_LIMIT_CHECK( 2 ); + + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_bsln_parts_fmt0_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 0" ); + + /* deltas */ + GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT ); + + gxvalid->table_data = NULL; /* No ctlPoints here. */ + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt1_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 1" ); + + /* deltas */ + gxv_bsln_parts_fmt0_validate( p, limit, gxvalid ); + + /* mappingData */ + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_bsln_LookupValue_validate; + gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT, + limit, + gxvalid ); + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt2_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = tables; + + FT_UShort stdGlyph; + FT_UShort ctlPoint; + FT_Int i; + + FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline ); + + + GXV_NAME_ENTER( "parts format 2" ); + + GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) ); + + /* stdGlyph */ + stdGlyph = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph )); + + gxv_glyphid_validate( stdGlyph, gxvalid ); + + /* Record the position of ctlPoints */ + GXV_BSLN_DATA( ctlPoints_p ) = p; + + /* ctlPoints */ + for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ ) + { + ctlPoint = FT_NEXT_USHORT( p ); + if ( ctlPoint == GXV_BSLN_VALUE_EMPTY ) + { + if ( i == defaultBaseline ) + FT_INVALID_DATA; + } + else + gxv_ctlPoint_validate( stdGlyph, ctlPoint, gxvalid ); + } + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt3_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator gxvalid) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 3" ); + + /* stdGlyph + ctlPoints */ + gxv_bsln_parts_fmt2_validate( p, limit, gxvalid ); + + /* mappingData */ + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_bsln_LookupValue_validate; + gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ), + limit, + gxvalid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** bsln TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + + GXV_bsln_DataRec bslnrec; + GXV_bsln_Data bsln = &bslnrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + FT_UShort format; + FT_UShort defaultBaseline; + + GXV_Validate_Func fmt_funcs_table [] = + { + gxv_bsln_parts_fmt0_validate, + gxv_bsln_parts_fmt1_validate, + gxv_bsln_parts_fmt2_validate, + gxv_bsln_parts_fmt3_validate, + }; + + + gxvalid->root = ftvalid; + gxvalid->table_data = bsln; + gxvalid->face = face; + + FT_TRACE3(( "validating `bsln' table\n" )); + GXV_INIT; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + defaultBaseline = FT_NEXT_USHORT( p ); + + /* only version 1.0 is defined (1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* only format 1, 2, 3 are defined (1996) */ + GXV_TRACE(( " (format = %d)\n", format )); + if ( format > 3 ) + FT_INVALID_FORMAT; + + if ( defaultBaseline > 31 ) + FT_INVALID_FORMAT; + + bsln->defaultBaseline = defaultBaseline; + + fmt_funcs_table[format]( p, limit, gxvalid ); + + FT_TRACE4(( "\n" )); + } + + +/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc + (do not change this comment) */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvcommn.c b/external/freetype/src/gxvalid/gxvcommn.c new file mode 100644 index 000000000..7f908742a --- /dev/null +++ b/external/freetype/src/gxvalid/gxvcommn.c @@ -0,0 +1,1747 @@ +/**************************************************************************** + * + * gxvcommn.c + * + * TrueTypeGX/AAT common tables validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvcommon + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 16bit offset sorter *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_COMPARE_DEF( int ) + gxv_compare_ushort_offset( const void* a, + const void* b ) + { + return *(FT_UShort*)a - *(FT_UShort*)b; + } + + + FT_LOCAL_DEF( void ) + gxv_set_length_by_ushort_offset( FT_UShort* offset, + FT_UShort** length, + FT_UShort* buff, + FT_UInt nmemb, + FT_UShort limit, + GXV_Validator gxvalid ) + { + FT_UInt i; + + + for ( i = 0; i < nmemb; i++ ) + *(length[i]) = 0; + + for ( i = 0; i < nmemb; i++ ) + buff[i] = offset[i]; + buff[nmemb] = limit; + + ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_UShort ), + gxv_compare_ushort_offset ); + + if ( buff[nmemb] > limit ) + FT_INVALID_OFFSET; + + for ( i = 0; i < nmemb; i++ ) + { + FT_UInt j; + + + for ( j = 0; j < nmemb; j++ ) + if ( buff[j] == offset[i] ) + break; + + if ( j == nmemb ) + FT_INVALID_OFFSET; + + *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] ); + + if ( 0 != offset[i] && 0 == *(length[i]) ) + FT_INVALID_OFFSET; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 32bit offset sorter *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_COMPARE_DEF( int ) + gxv_compare_ulong_offset( const void* a, + const void* b ) + { + FT_ULong a_ = *(FT_ULong*)a; + FT_ULong b_ = *(FT_ULong*)b; + + + if ( a_ < b_ ) + return -1; + else if ( a_ > b_ ) + return 1; + else + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_set_length_by_ulong_offset( FT_ULong* offset, + FT_ULong** length, + FT_ULong* buff, + FT_UInt nmemb, + FT_ULong limit, + GXV_Validator gxvalid) + { + FT_UInt i; + + + for ( i = 0; i < nmemb; i++ ) + *(length[i]) = 0; + + for ( i = 0; i < nmemb; i++ ) + buff[i] = offset[i]; + buff[nmemb] = limit; + + ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_ULong ), + gxv_compare_ulong_offset ); + + if ( buff[nmemb] > limit ) + FT_INVALID_OFFSET; + + for ( i = 0; i < nmemb; i++ ) + { + FT_UInt j; + + + for ( j = 0; j < nmemb; j++ ) + if ( buff[j] == offset[i] ) + break; + + if ( j == nmemb ) + FT_INVALID_OFFSET; + + *(length[i]) = buff[j + 1] - buff[j]; + + if ( 0 != offset[i] && 0 == *(length[i]) ) + FT_INVALID_OFFSET; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** scan value array and get min & max *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + gxv_array_getlimits_byte( FT_Bytes table, + FT_Bytes limit, + FT_Byte* min, + FT_Byte* max, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + *min = 0xFF; + *max = 0x00; + + while ( p < limit ) + { + FT_Byte val; + + + GXV_LIMIT_CHECK( 1 ); + val = FT_NEXT_BYTE( p ); + + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + FT_LOCAL_DEF( void ) + gxv_array_getlimits_ushort( FT_Bytes table, + FT_Bytes limit, + FT_UShort* min, + FT_UShort* max, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + *min = 0xFFFFU; + *max = 0x0000; + + while ( p < limit ) + { + FT_UShort val; + + + GXV_LIMIT_CHECK( 2 ); + val = FT_NEXT_USHORT( p ); + + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BINSEARCHHEADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_BinSrchHeader_ + { + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort searchRange; + FT_UShort entrySelector; + FT_UShort rangeShift; + + } GXV_BinSrchHeader; + + + static void + gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader* binSrchHeader, + GXV_Validator gxvalid ) + { + FT_UShort searchRange; + FT_UShort entrySelector; + FT_UShort rangeShift; + + + if ( binSrchHeader->unitSize == 0 ) + FT_INVALID_DATA; + + if ( binSrchHeader->nUnits == 0 ) + { + if ( binSrchHeader->searchRange == 0 && + binSrchHeader->entrySelector == 0 && + binSrchHeader->rangeShift == 0 ) + return; + else + FT_INVALID_DATA; + } + + for ( searchRange = 1, entrySelector = 1; + ( searchRange * 2 ) <= binSrchHeader->nUnits && + searchRange < 0x8000U; + searchRange *= 2, entrySelector++ ) + ; + + entrySelector--; + searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize ); + rangeShift = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize + - searchRange ); + + if ( searchRange != binSrchHeader->searchRange || + entrySelector != binSrchHeader->entrySelector || + rangeShift != binSrchHeader->rangeShift ) + { + GXV_TRACE(( "Inconsistency found in BinSrchHeader\n" )); + GXV_TRACE(( "originally: unitSize=%d, nUnits=%d, " + "searchRange=%d, entrySelector=%d, " + "rangeShift=%d\n", + binSrchHeader->unitSize, binSrchHeader->nUnits, + binSrchHeader->searchRange, binSrchHeader->entrySelector, + binSrchHeader->rangeShift )); + GXV_TRACE(( "calculated: unitSize=%d, nUnits=%d, " + "searchRange=%d, entrySelector=%d, " + "rangeShift=%d\n", + binSrchHeader->unitSize, binSrchHeader->nUnits, + searchRange, entrySelector, rangeShift )); + + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + } + + + /* + * parser & validator of BinSrchHeader + * which is used in LookupTable format 2, 4, 6. + * + * Essential parameters (unitSize, nUnits) are returned by + * given pointer, others (searchRange, entrySelector, rangeShift) + * can be calculated by essential parameters, so they are just + * validated and discarded. + * + * However, wrong values in searchRange, entrySelector, rangeShift + * won't cause fatal errors, because these parameters might be + * only used in old m68k font driver in MacOS. + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + + FT_LOCAL_DEF( void ) + gxv_BinSrchHeader_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort* unitSize_p, + FT_UShort* nUnits_p, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + GXV_BinSrchHeader binSrchHeader; + + + GXV_NAME_ENTER( "BinSrchHeader validate" ); + + if ( *unitSize_p == 0 ) + { + GXV_LIMIT_CHECK( 2 ); + binSrchHeader.unitSize = FT_NEXT_USHORT( p ); + } + else + binSrchHeader.unitSize = *unitSize_p; + + if ( *nUnits_p == 0 ) + { + GXV_LIMIT_CHECK( 2 ); + binSrchHeader.nUnits = FT_NEXT_USHORT( p ); + } + else + binSrchHeader.nUnits = *nUnits_p; + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + binSrchHeader.searchRange = FT_NEXT_USHORT( p ); + binSrchHeader.entrySelector = FT_NEXT_USHORT( p ); + binSrchHeader.rangeShift = FT_NEXT_USHORT( p ); + GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits )); + + gxv_BinSrchHeader_check_consistency( &binSrchHeader, gxvalid ); + + if ( *unitSize_p == 0 ) + *unitSize_p = binSrchHeader.unitSize; + + if ( *nUnits_p == 0 ) + *nUnits_p = binSrchHeader.nUnits; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUP TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_LOOKUP_VALUE_LOAD( P, SIGNSPEC ) \ + ( P += 2, gxv_lookup_value_load( P - 2, SIGNSPEC ) ) + + static GXV_LookupValueDesc + gxv_lookup_value_load( FT_Bytes p, + GXV_LookupValue_SignSpec signspec ) + { + GXV_LookupValueDesc v; + + + if ( signspec == GXV_LOOKUPVALUE_UNSIGNED ) + v.u = FT_NEXT_USHORT( p ); + else + v.s = FT_NEXT_SHORT( p ); + + return v; + } + + +#define GXV_UNITSIZE_VALIDATE( FORMAT, UNITSIZE, NUNITS, CORRECTSIZE ) \ + FT_BEGIN_STMNT \ + if ( UNITSIZE != CORRECTSIZE ) \ + { \ + FT_ERROR(( "unitSize=%d differs from" \ + " expected unitSize=%d" \ + " in LookupTable %s\n", \ + UNITSIZE, CORRECTSIZE, FORMAT )); \ + if ( UNITSIZE != 0 && NUNITS != 0 ) \ + { \ + FT_ERROR(( " cannot validate anymore\n" )); \ + FT_INVALID_FORMAT; \ + } \ + else \ + FT_ERROR(( " forcibly continues\n" )); \ + } \ + FT_END_STMNT + + + /* ================= Simple Array Format 0 Lookup Table ================ */ + static void + gxv_LookupTable_fmt0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 0" ); + + GXV_LIMIT_CHECK( 2 * gxvalid->face->num_glyphs ); + + for ( i = 0; i < gxvalid->face->num_glyphs; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + if ( p + 2 >= limit ) /* some fonts have too-short fmt0 array */ + { + GXV_TRACE(( "too short, glyphs %d - %ld are missing\n", + i, gxvalid->face->num_glyphs )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + break; + } + + value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); + gxvalid->lookupval_func( i, &value, gxvalid ); + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + /* ================= Segment Single Format 2 Lookup Table ============== */ + /* + * Apple spec says: + * + * To guarantee that a binary search terminates, you must include one or + * more special `end of search table' values at the end of the data to + * be searched. The number of termination values that need to be + * included is table-specific. The value that indicates binary search + * termination is 0xFFFF. + * + * The problem is that nUnits does not include this end-marker. It's + * quite difficult to discriminate whether the following 0xFFFF comes from + * the end-marker or some next data. + * + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + static void + gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes table, + FT_UShort unitSize, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + while ( ( p + 4 ) < gxvalid->root->limit ) + { + if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */ + p[2] != 0xFF || p[3] != 0xFF ) /* firstGlyph */ + break; + p += unitSize; + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_LookupTable_fmt2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort gid; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort unit; + FT_UShort lastGlyph; + FT_UShort firstGlyph; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 2" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); + p += gxvalid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 ); + + for ( unit = 0, gid = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + lastGlyph = FT_NEXT_USHORT( p ); + firstGlyph = FT_NEXT_USHORT( p ); + value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); + + gxv_glyphid_validate( firstGlyph, gxvalid ); + gxv_glyphid_validate( lastGlyph, gxvalid ); + + if ( lastGlyph < gid ) + { + GXV_TRACE(( "reverse ordered segment specification:" + " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", + unit, lastGlyph, unit - 1 , gid )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + + if ( lastGlyph < firstGlyph ) + { + GXV_TRACE(( "reverse ordered range specification at unit %d:" + " lastGlyph %d < firstGlyph %d ", + unit, lastGlyph, firstGlyph )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + + if ( gxvalid->root->level == FT_VALIDATE_TIGHT ) + continue; /* ftxvalidator silently skips such an entry */ + + FT_TRACE4(( "continuing with exchanged values\n" )); + gid = firstGlyph; + firstGlyph = lastGlyph; + lastGlyph = gid; + } + + for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) + gxvalid->lookupval_func( gid, &value, gxvalid ); + } + + gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid ); + p += gxvalid->subtable_length; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + /* ================= Segment Array Format 4 Lookup Table =============== */ + static void + gxv_LookupTable_fmt4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort unit; + FT_UShort gid; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort lastGlyph; + FT_UShort firstGlyph; + GXV_LookupValueDesc base_value; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 4" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); + p += gxvalid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 ); + + for ( unit = 0, gid = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 ); + lastGlyph = FT_NEXT_USHORT( p ); + firstGlyph = FT_NEXT_USHORT( p ); + + gxv_glyphid_validate( firstGlyph, gxvalid ); + gxv_glyphid_validate( lastGlyph, gxvalid ); + + if ( lastGlyph < gid ) + { + GXV_TRACE(( "reverse ordered segment specification:" + " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", + unit, lastGlyph, unit - 1 , gid )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + + if ( lastGlyph < firstGlyph ) + { + GXV_TRACE(( "reverse ordered range specification at unit %d:" + " lastGlyph %d < firstGlyph %d ", + unit, lastGlyph, firstGlyph )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + + if ( gxvalid->root->level == FT_VALIDATE_TIGHT ) + continue; /* ftxvalidator silently skips such an entry */ + + FT_TRACE4(( "continuing with exchanged values\n" )); + gid = firstGlyph; + firstGlyph = lastGlyph; + lastGlyph = gid; + } + + GXV_LIMIT_CHECK( 2 ); + base_value = GXV_LOOKUP_VALUE_LOAD( p, GXV_LOOKUPVALUE_UNSIGNED ); + + for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) + { + value = gxvalid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), + &base_value, + limit, + gxvalid ); + + gxvalid->lookupval_func( gid, &value, gxvalid ); + } + } + + gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid ); + p += gxvalid->subtable_length; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + /* ================= Segment Table Format 6 Lookup Table =============== */ + static void + gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes table, + FT_UShort unitSize, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + while ( p < gxvalid->root->limit ) + { + if ( p[0] != 0xFF || p[1] != 0xFF ) + break; + p += unitSize; + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_LookupTable_fmt6_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort unit; + FT_UShort prev_glyph; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort glyph; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 6" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid ); + p += gxvalid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 ); + + for ( unit = 0, prev_glyph = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 ); + glyph = FT_NEXT_USHORT( p ); + value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); + + if ( gxv_glyphid_validate( glyph, gxvalid ) ) + GXV_TRACE(( " endmarker found within defined range" + " (entry %d < nUnits=%d)\n", + unit, nUnits )); + + if ( prev_glyph > glyph ) + { + GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n", + glyph, prev_glyph )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + prev_glyph = glyph; + + gxvalid->lookupval_func( glyph, &value, gxvalid ); + } + + gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, gxvalid ); + p += gxvalid->subtable_length; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + /* ================= Trimmed Array Format 8 Lookup Table =============== */ + static void + gxv_LookupTable_fmt8_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_LookupValueDesc value; + FT_UShort firstGlyph; + FT_UShort glyphCount; + + + GXV_NAME_ENTER( "LookupTable format 8" ); + + /* firstGlyph + glyphCount */ + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + glyphCount = FT_NEXT_USHORT( p ); + + gxv_glyphid_validate( firstGlyph, gxvalid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), gxvalid ); + + /* valueArray */ + for ( i = 0; i < glyphCount; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign ); + gxvalid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, gxvalid ); + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_LookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort format; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_LookupTable_fmt0_validate, /* 0 */ + NULL, /* 1 */ + gxv_LookupTable_fmt2_validate, /* 2 */ + NULL, /* 3 */ + gxv_LookupTable_fmt4_validate, /* 4 */ + NULL, /* 5 */ + gxv_LookupTable_fmt6_validate, /* 6 */ + NULL, /* 7 */ + gxv_LookupTable_fmt8_validate, /* 8 */ + }; + + GXV_Validate_Func func; + + + GXV_NAME_ENTER( "LookupTable" ); + + /* lookuptbl_head may be used in fmt4 transit function. */ + gxvalid->lookuptbl_head = table; + + /* format */ + GXV_LIMIT_CHECK( 2 ); + format = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (format %d)\n", format )); + + if ( format > 8 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[format]; + if ( !func ) + FT_INVALID_FORMAT; + + func( p, limit, gxvalid ); + p += gxvalid->subtable_length; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Glyph ID *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Int ) + gxv_glyphid_validate( FT_UShort gid, + GXV_Validator gxvalid ) + { + FT_Face face; + + + if ( gid == 0xFFFFU ) + { + GXV_EXIT; + return 1; + } + + face = gxvalid->face; + if ( face->num_glyphs < gid ) + { + GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %ld < %d\n", + face->num_glyphs, gid )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CONTROL POINT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_ctlPoint_validate( FT_UShort gid, + FT_UShort ctl_point, + GXV_Validator gxvalid ) + { + FT_Face face; + FT_Error error; + + FT_GlyphSlot glyph; + FT_Outline outline; + FT_UShort n_points; + + + face = gxvalid->face; + + error = FT_Load_Glyph( face, + gid, + FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM ); + if ( error ) + FT_INVALID_GLYPH_ID; + + glyph = face->glyph; + outline = glyph->outline; + n_points = (FT_UShort)outline.n_points; + + if ( !( ctl_point < n_points ) ) + FT_INVALID_DATA; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SFNT NAME *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_sfntName_validate( FT_UShort name_index, + FT_UShort min_index, + FT_UShort max_index, + GXV_Validator gxvalid ) + { + FT_SfntName name; + FT_UInt i; + FT_UInt nnames; + + + GXV_NAME_ENTER( "sfntName" ); + + if ( name_index < min_index || max_index < name_index ) + FT_INVALID_FORMAT; + + nnames = FT_Get_Sfnt_Name_Count( gxvalid->face ); + for ( i = 0; i < nnames; i++ ) + { + if ( FT_Get_Sfnt_Name( gxvalid->face, i, &name ) != FT_Err_Ok ) + continue; + + if ( name.name_id == name_index ) + goto Out; + } + + GXV_TRACE(( " nameIndex = %d (UNTITLED)\n", name_index )); + FT_INVALID_DATA; + goto Exit; /* make compiler happy */ + + Out: + FT_TRACE1(( " nameIndex = %d (", name_index )); + GXV_TRACE_HEXDUMP_SFNTNAME( name ); + FT_TRACE1(( ")\n" )); + + Exit: + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STATE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* -------------------------- Class Table --------------------------- */ + + /* + * highestClass specifies how many classes are defined in this + * Class Subtable. Apple spec does not mention whether undefined + * holes in the class (e.g.: 0-3 are predefined, 4 is unused, 5 is used) + * are permitted. At present, holes in a defined class are not checked. + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + + static void + gxv_ClassTable_validate( FT_Bytes table, + FT_UShort* length_p, + FT_UShort stateSize, + FT_Byte* maxClassID_p, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort firstGlyph; + FT_UShort nGlyphs; + + + GXV_NAME_ENTER( "ClassTable" ); + + *maxClassID_p = 3; /* Classes 0, 2, and 3 are predefined */ + + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + nGlyphs = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (firstGlyph = %d, nGlyphs = %d)\n", firstGlyph, nGlyphs )); + + if ( !nGlyphs ) + goto Out; + + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), gxvalid ); + + { + FT_Byte nGlyphInClass[256]; + FT_Byte classID; + FT_UShort i; + + + FT_MEM_ZERO( nGlyphInClass, 256 ); + + + for ( i = 0; i < nGlyphs; i++ ) + { + GXV_LIMIT_CHECK( 1 ); + classID = FT_NEXT_BYTE( p ); + switch ( classID ) + { + /* following classes should not appear in class array */ + case 0: /* end of text */ + case 2: /* out of bounds */ + case 3: /* end of line */ + FT_INVALID_DATA; + break; + + case 1: /* out of bounds */ + default: /* user-defined: 4 - ( stateSize - 1 ) */ + if ( classID >= stateSize ) + FT_INVALID_DATA; /* assign glyph to undefined state */ + + nGlyphInClass[classID]++; + break; + } + } + *length_p = (FT_UShort)( p - table ); + + /* scan max ClassID in use */ + for ( i = 0; i < stateSize; i++ ) + if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) ) + *maxClassID_p = (FT_Byte)i; /* XXX: Check Range? */ + } + + Out: + GXV_TRACE(( "Declared stateSize=0x%02x, Used maxClassID=0x%02x\n", + stateSize, *maxClassID_p )); + GXV_EXIT; + } + + + /* --------------------------- State Array ----------------------------- */ + + static void + gxv_StateArray_validate( FT_Bytes table, + FT_UShort* length_p, + FT_Byte maxClassID, + FT_UShort stateSize, + FT_Byte* maxState_p, + FT_Byte* maxEntry_p, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_Byte clazz; + FT_Byte entry; + + FT_UNUSED( stateSize ); /* for the non-debugging case */ + + + GXV_NAME_ENTER( "StateArray" ); + + GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n", + (int)( *length_p ), stateSize, (int)maxClassID )); + + /* + * 2 states are predefined and must be described in StateArray: + * state 0 (start of text), 1 (start of line) + */ + GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 ); + + *maxState_p = 0; + *maxEntry_p = 0; + + /* read if enough to read another state */ + while ( p + ( 1 + maxClassID ) <= limit ) + { + (*maxState_p)++; + for ( clazz = 0; clazz <= maxClassID; clazz++ ) + { + entry = FT_NEXT_BYTE( p ); + *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry ); + } + } + GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", + *maxState_p, *maxEntry_p )); + + *length_p = (FT_UShort)( p - table ); + + GXV_EXIT; + } + + + /* --------------------------- Entry Table ----------------------------- */ + + static void + gxv_EntryTable_validate( FT_Bytes table, + FT_UShort* length_p, + FT_Byte maxEntry, + FT_UShort stateArray, + FT_UShort stateArray_length, + FT_Byte maxClassID, + FT_Bytes statetable_table, + FT_Bytes statetable_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_Byte entry; + FT_Byte state; + FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( statetable ); + + GXV_XStateTable_GlyphOffsetDesc glyphOffset; + + + GXV_NAME_ENTER( "EntryTable" ); + + GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); + + if ( ( maxEntry + 1 ) * entrySize > *length_p ) + { + GXV_SET_ERR_IF_PARANOID( FT_INVALID_TOO_SHORT ); + + /* ftxvalidator and FontValidator both warn and continue */ + maxEntry = (FT_Byte)( *length_p / entrySize - 1 ); + GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n", + maxEntry )); + } + + for ( entry = 0; entry <= maxEntry; entry++ ) + { + FT_UShort newState; + FT_UShort flags; + + + GXV_LIMIT_CHECK( 2 + 2 ); + newState = FT_NEXT_USHORT( p ); + flags = FT_NEXT_USHORT( p ); + + + if ( newState < stateArray || + stateArray + stateArray_length < newState ) + { + GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n", + newState )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + continue; + } + + if ( 0 != ( ( newState - stateArray ) % ( 1 + maxClassID ) ) ) + { + GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n", + newState, 1 + maxClassID )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + continue; + } + + state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) ); + + switch ( GXV_GLYPHOFFSET_FMT( statetable ) ) + { + case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ + break; + + case GXV_GLYPHOFFSET_UCHAR: + glyphOffset.uc = FT_NEXT_BYTE( p ); + break; + + case GXV_GLYPHOFFSET_CHAR: + glyphOffset.c = FT_NEXT_CHAR( p ); + break; + + case GXV_GLYPHOFFSET_USHORT: + glyphOffset.u = FT_NEXT_USHORT( p ); + break; + + case GXV_GLYPHOFFSET_SHORT: + glyphOffset.s = FT_NEXT_SHORT( p ); + break; + + case GXV_GLYPHOFFSET_ULONG: + glyphOffset.ul = FT_NEXT_ULONG( p ); + break; + + case GXV_GLYPHOFFSET_LONG: + glyphOffset.l = FT_NEXT_LONG( p ); + break; + } + + if ( gxvalid->statetable.entry_validate_func ) + gxvalid->statetable.entry_validate_func( state, + flags, + &glyphOffset, + statetable_table, + statetable_limit, + gxvalid ); + } + + *length_p = (FT_UShort)( p - table ); + + GXV_EXIT; + } + + + /* =========================== State Table ============================= */ + + FT_LOCAL_DEF( void ) + gxv_StateTable_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_UShort o[3]; + FT_UShort* l[3]; + FT_UShort buff[4]; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + + gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, gxvalid ); + } + + + FT_LOCAL_DEF( void ) + gxv_StateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_UShort stateSize; + FT_UShort classTable; /* offset to Class(Sub)Table */ + FT_UShort stateArray; /* offset to StateArray */ + FT_UShort entryTable; /* offset to EntryTable */ + + FT_UShort classTable_length; + FT_UShort stateArray_length; + FT_UShort entryTable_length; + FT_Byte maxClassID; + FT_Byte maxState; + FT_Byte maxEntry; + + GXV_StateTable_Subtable_Setup_Func setup_func; + + FT_Bytes p = table; + + + GXV_NAME_ENTER( "StateTable" ); + + GXV_TRACE(( "StateTable header\n" )); + + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + stateSize = FT_NEXT_USHORT( p ); + classTable = FT_NEXT_USHORT( p ); + stateArray = FT_NEXT_USHORT( p ); + entryTable = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "stateSize=0x%04x\n", stateSize )); + GXV_TRACE(( "offset to classTable=0x%04x\n", classTable )); + GXV_TRACE(( "offset to stateArray=0x%04x\n", stateArray )); + GXV_TRACE(( "offset to entryTable=0x%04x\n", entryTable )); + + if ( stateSize > 0xFF ) + FT_INVALID_DATA; + + if ( gxvalid->statetable.optdata_load_func ) + gxvalid->statetable.optdata_load_func( p, limit, gxvalid ); + + if ( gxvalid->statetable.subtable_setup_func ) + setup_func = gxvalid->statetable.subtable_setup_func; + else + setup_func = gxv_StateTable_subtable_setup; + + setup_func( (FT_UShort)( limit - table ), + classTable, + stateArray, + entryTable, + &classTable_length, + &stateArray_length, + &entryTable_length, + gxvalid ); + + GXV_TRACE(( "StateTable Subtables\n" )); + + if ( classTable != 0 ) + gxv_ClassTable_validate( table + classTable, + &classTable_length, + stateSize, + &maxClassID, + gxvalid ); + else + maxClassID = (FT_Byte)( stateSize - 1 ); + + if ( stateArray != 0 ) + gxv_StateArray_validate( table + stateArray, + &stateArray_length, + maxClassID, + stateSize, + &maxState, + &maxEntry, + gxvalid ); + else + { +#if 0 + maxState = 1; /* 0:start of text, 1:start of line are predefined */ +#endif + maxEntry = 0; + } + + if ( maxEntry > 0 && entryTable == 0 ) + FT_INVALID_OFFSET; + + if ( entryTable != 0 ) + gxv_EntryTable_validate( table + entryTable, + &entryTable_length, + maxEntry, + stateArray, + stateArray_length, + maxClassID, + table, + limit, + gxvalid ); + + GXV_EXIT; + } + + + /* ================= eXtended State Table (for morx) =================== */ + + FT_LOCAL_DEF( void ) + gxv_XStateTable_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_ULong o[3]; + FT_ULong* l[3]; + FT_ULong buff[4]; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + + gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, gxvalid ); + } + + + static void + gxv_XClassTable_lookupval_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_UNUSED( glyph ); + + if ( value_p->u >= gxvalid->xstatetable.nClasses ) + FT_INVALID_DATA; + if ( value_p->u > gxvalid->xstatetable.maxClassID ) + gxvalid->xstatetable.maxClassID = value_p->u; + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 16bit value array | + +===============+ | + | value | <-------+ + .... + */ + static GXV_LookupValueDesc + gxv_XClassTable_lookupfmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = gxvalid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_XStateArray_validate( FT_Bytes table, + FT_ULong* length_p, + FT_UShort maxClassID, + FT_ULong stateSize, + FT_UShort* maxState_p, + FT_UShort* maxEntry_p, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort clazz; + FT_UShort entry; + + FT_UNUSED( stateSize ); /* for the non-debugging case */ + + + GXV_NAME_ENTER( "XStateArray" ); + + GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n", + (int)( *length_p ), (int)stateSize, (int)maxClassID )); + + /* + * 2 states are predefined and must be described: + * state 0 (start of text), 1 (start of line) + */ + GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 * 2 ); + + *maxState_p = 0; + *maxEntry_p = 0; + + /* read if enough to read another state */ + while ( p + ( ( 1 + maxClassID ) * 2 ) <= limit ) + { + (*maxState_p)++; + for ( clazz = 0; clazz <= maxClassID; clazz++ ) + { + entry = FT_NEXT_USHORT( p ); + *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry ); + } + } + GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", + *maxState_p, *maxEntry_p )); + + *length_p = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static void + gxv_XEntryTable_validate( FT_Bytes table, + FT_ULong* length_p, + FT_UShort maxEntry, + FT_ULong stateArray_length, + FT_UShort maxClassID, + FT_Bytes xstatetable_table, + FT_Bytes xstatetable_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort entry; + FT_UShort state; + FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( xstatetable ); + + + GXV_NAME_ENTER( "XEntryTable" ); + GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); + + if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit ) + FT_INVALID_TOO_SHORT; + + for (entry = 0; entry <= maxEntry; entry++ ) + { + FT_UShort newState_idx; + FT_UShort flags; + GXV_XStateTable_GlyphOffsetDesc glyphOffset; + + + GXV_LIMIT_CHECK( 2 + 2 ); + newState_idx = FT_NEXT_USHORT( p ); + flags = FT_NEXT_USHORT( p ); + + if ( stateArray_length < (FT_ULong)( newState_idx * 2 ) ) + { + GXV_TRACE(( " newState index 0x%04x points out of stateArray\n", + newState_idx )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + + state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) ); + if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) ) + { + FT_TRACE4(( "-> new state = %d (supposed)\n", + state )); + FT_TRACE4(( "but newState index 0x%04x" + " is not aligned to %d-classes\n", + newState_idx, 1 + maxClassID )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + + switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) ) + { + case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ + break; + + case GXV_GLYPHOFFSET_UCHAR: + glyphOffset.uc = FT_NEXT_BYTE( p ); + break; + + case GXV_GLYPHOFFSET_CHAR: + glyphOffset.c = FT_NEXT_CHAR( p ); + break; + + case GXV_GLYPHOFFSET_USHORT: + glyphOffset.u = FT_NEXT_USHORT( p ); + break; + + case GXV_GLYPHOFFSET_SHORT: + glyphOffset.s = FT_NEXT_SHORT( p ); + break; + + case GXV_GLYPHOFFSET_ULONG: + glyphOffset.ul = FT_NEXT_ULONG( p ); + break; + + case GXV_GLYPHOFFSET_LONG: + glyphOffset.l = FT_NEXT_LONG( p ); + break; + + default: + GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); + goto Exit; + } + + if ( gxvalid->xstatetable.entry_validate_func ) + gxvalid->xstatetable.entry_validate_func( state, + flags, + &glyphOffset, + xstatetable_table, + xstatetable_limit, + gxvalid ); + } + + Exit: + *length_p = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_XStateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + /* StateHeader members */ + FT_ULong classTable; /* offset to Class(Sub)Table */ + FT_ULong stateArray; /* offset to StateArray */ + FT_ULong entryTable; /* offset to EntryTable */ + + FT_ULong classTable_length; + FT_ULong stateArray_length; + FT_ULong entryTable_length; + FT_UShort maxState; + FT_UShort maxEntry; + + GXV_XStateTable_Subtable_Setup_Func setup_func; + + FT_Bytes p = table; + + + GXV_NAME_ENTER( "XStateTable" ); + + GXV_TRACE(( "XStateTable header\n" )); + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + gxvalid->xstatetable.nClasses = FT_NEXT_ULONG( p ); + classTable = FT_NEXT_ULONG( p ); + stateArray = FT_NEXT_ULONG( p ); + entryTable = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "nClasses =0x%08lx\n", gxvalid->xstatetable.nClasses )); + GXV_TRACE(( "offset to classTable=0x%08lx\n", classTable )); + GXV_TRACE(( "offset to stateArray=0x%08lx\n", stateArray )); + GXV_TRACE(( "offset to entryTable=0x%08lx\n", entryTable )); + + if ( gxvalid->xstatetable.nClasses > 0xFFFFU ) + FT_INVALID_DATA; + + GXV_TRACE(( "StateTable Subtables\n" )); + + if ( gxvalid->xstatetable.optdata_load_func ) + gxvalid->xstatetable.optdata_load_func( p, limit, gxvalid ); + + if ( gxvalid->xstatetable.subtable_setup_func ) + setup_func = gxvalid->xstatetable.subtable_setup_func; + else + setup_func = gxv_XStateTable_subtable_setup; + + setup_func( (FT_ULong)( limit - table ), + classTable, + stateArray, + entryTable, + &classTable_length, + &stateArray_length, + &entryTable_length, + gxvalid ); + + if ( classTable != 0 ) + { + gxvalid->xstatetable.maxClassID = 0; + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_XClassTable_lookupval_validate; + gxvalid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit; + gxv_LookupTable_validate( table + classTable, + table + classTable + classTable_length, + gxvalid ); +#if 0 + if ( gxvalid->subtable_length < classTable_length ) + classTable_length = gxvalid->subtable_length; +#endif + } + else + { + /* XXX: check range? */ + gxvalid->xstatetable.maxClassID = + (FT_UShort)( gxvalid->xstatetable.nClasses - 1 ); + } + + if ( stateArray != 0 ) + gxv_XStateArray_validate( table + stateArray, + &stateArray_length, + gxvalid->xstatetable.maxClassID, + gxvalid->xstatetable.nClasses, + &maxState, + &maxEntry, + gxvalid ); + else + { +#if 0 + maxState = 1; /* 0:start of text, 1:start of line are predefined */ +#endif + maxEntry = 0; + } + + if ( maxEntry > 0 && entryTable == 0 ) + FT_INVALID_OFFSET; + + if ( entryTable != 0 ) + gxv_XEntryTable_validate( table + entryTable, + &entryTable_length, + maxEntry, + stateArray_length, + gxvalid->xstatetable.maxClassID, + table, + limit, + gxvalid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Table overlapping *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ranges( FT_Bytes table1_start, + FT_ULong table1_length, + FT_Bytes table2_start, + FT_ULong table2_length ) + { + if ( table1_start == table2_start ) + { + if ( ( table1_length == 0 || table2_length == 0 ) ) + goto Out; + } + else if ( table1_start < table2_start ) + { + if ( ( table1_start + table1_length ) <= table2_start ) + goto Out; + } + else if ( table1_start > table2_start ) + { + if ( ( table1_start >= table2_start + table2_length ) ) + goto Out; + } + return 1; + + Out: + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_odtect_add_range( FT_Bytes start, + FT_ULong length, + const FT_String* name, + GXV_odtect_Range odtect ) + { + odtect->range[odtect->nRanges].start = start; + odtect->range[odtect->nRanges].length = length; + odtect->range[odtect->nRanges].name = (FT_String*)name; + odtect->nRanges++; + } + + + FT_LOCAL_DEF( void ) + gxv_odtect_validate( GXV_odtect_Range odtect, + GXV_Validator gxvalid ) + { + FT_UInt i, j; + + + GXV_NAME_ENTER( "check overlap among multi ranges" ); + + for ( i = 0; i < odtect->nRanges; i++ ) + for ( j = 0; j < i; j++ ) + if ( 0 != gxv_compare_ranges( odtect->range[i].start, + odtect->range[i].length, + odtect->range[j].start, + odtect->range[j].length ) ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( odtect->range[i].name || odtect->range[j].name ) + GXV_TRACE(( "found overlap between range %d and range %d\n", + i, j )); + else + GXV_TRACE(( "found overlap between `%s' and `%s\'\n", + odtect->range[i].name, + odtect->range[j].name )); +#endif + FT_INVALID_OFFSET; + } + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvcommn.h b/external/freetype/src/gxvalid/gxvcommn.h new file mode 100644 index 000000000..f88d23a41 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvcommn.h @@ -0,0 +1,584 @@ +/**************************************************************************** + * + * gxvcommn.h + * + * TrueTypeGX/AAT common tables validation (specification). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + + /* + * keywords in variable naming + * --------------------------- + * table: Of type FT_Bytes, pointing to the start of this table/subtable. + * limit: Of type FT_Bytes, pointing to the end of this table/subtable, + * including padding for alignment. + * offset: Of type FT_UInt, the number of octets from the start to target. + * length: Of type FT_UInt, the number of octets from the start to the + * end in this table/subtable, including padding for alignment. + * + * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc. + */ + + +#ifndef GXVCOMMN_H_ +#define GXVCOMMN_H_ + + +#include "gxvalid.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/ftsnames.h> + + +FT_BEGIN_HEADER + + + /* some variables are not evaluated or only used in trace */ + +#ifdef FT_DEBUG_LEVEL_TRACE +#define GXV_LOAD_TRACE_VARS +#else +#undef GXV_LOAD_TRACE_VARS +#endif + +#undef GXV_LOAD_UNUSED_VARS /* debug purpose */ + +#define IS_PARANOID_VALIDATION \ + ( gxvalid->root->level >= FT_VALIDATE_PARANOID ) +#define GXV_SET_ERR_IF_PARANOID( err ) \ + do { if ( IS_PARANOID_VALIDATION ) ( err ); } while ( 0 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALIDATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_ValidatorRec_* GXV_Validator; + + +#define DUMMY_LIMIT 0 + + typedef void + (*GXV_Validate_Func)( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + + /* ====================== LookupTable Validator ======================== */ + + typedef union GXV_LookupValueDesc_ + { + FT_UShort u; + FT_Short s; + + } GXV_LookupValueDesc; + + typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr; + + typedef enum GXV_LookupValue_SignSpec_ + { + GXV_LOOKUPVALUE_UNSIGNED = 0, + GXV_LOOKUPVALUE_SIGNED + + } GXV_LookupValue_SignSpec; + + + typedef void + (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ); + + typedef GXV_LookupValueDesc + (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ); + + + /* ====================== StateTable Validator ========================= */ + + typedef enum GXV_GlyphOffset_Format_ + { + GXV_GLYPHOFFSET_NONE = -1, + GXV_GLYPHOFFSET_UCHAR = 2, + GXV_GLYPHOFFSET_CHAR, + GXV_GLYPHOFFSET_USHORT = 4, + GXV_GLYPHOFFSET_SHORT, + GXV_GLYPHOFFSET_ULONG = 8, + GXV_GLYPHOFFSET_LONG + + } GXV_GlyphOffset_Format; + + +#define GXV_GLYPHOFFSET_FMT( table ) \ + ( gxvalid->table.entry_glyphoffset_fmt ) + +#define GXV_GLYPHOFFSET_SIZE( table ) \ + ( gxvalid->table.entry_glyphoffset_fmt / 2 ) + + + /* ----------------------- 16bit StateTable ---------------------------- */ + + typedef union GXV_StateTable_GlyphOffsetDesc_ + { + FT_Byte uc; + FT_UShort u; /* same as GXV_LookupValueDesc */ + FT_ULong ul; + FT_Char c; + FT_Short s; /* same as GXV_LookupValueDesc */ + FT_Long l; + + } GXV_StateTable_GlyphOffsetDesc; + + typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr; + + typedef void + (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator gxvalid ); + + typedef void + (*GXV_StateTable_Entry_Validate_Func)( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes statetable_table, + FT_Bytes statetable_limit, + GXV_Validator gxvalid ); + + typedef void + (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + typedef struct GXV_StateTable_ValidatorRec_ + { + GXV_GlyphOffset_Format entry_glyphoffset_fmt; + void* optdata; + + GXV_StateTable_Subtable_Setup_Func subtable_setup_func; + GXV_StateTable_Entry_Validate_Func entry_validate_func; + GXV_StateTable_OptData_Load_Func optdata_load_func; + + } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData; + + + /* ---------------------- 32bit XStateTable ---------------------------- */ + + typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc; + + typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr; + + typedef void + (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator gxvalid ); + + typedef void + (*GXV_XStateTable_Entry_Validate_Func)( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes xstatetable_table, + FT_Bytes xstatetable_limit, + GXV_Validator gxvalid ); + + + typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func; + + + typedef struct GXV_XStateTable_ValidatorRec_ + { + int entry_glyphoffset_fmt; + void* optdata; + + GXV_XStateTable_Subtable_Setup_Func subtable_setup_func; + GXV_XStateTable_Entry_Validate_Func entry_validate_func; + GXV_XStateTable_OptData_Load_Func optdata_load_func; + + FT_ULong nClasses; + FT_UShort maxClassID; + + } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData; + + + /* ===================================================================== */ + + typedef struct GXV_ValidatorRec_ + { + FT_Validator root; + + FT_Face face; + void* table_data; + + FT_ULong subtable_length; + + GXV_LookupValue_SignSpec lookupval_sign; + GXV_Lookup_Value_Validate_Func lookupval_func; + GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans; + FT_Bytes lookuptbl_head; + + FT_UShort min_gid; + FT_UShort max_gid; + + GXV_StateTable_ValidatorRec statetable; + GXV_XStateTable_ValidatorRec xstatetable; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt debug_indent; + const FT_String* debug_function_name[3]; +#endif + + } GXV_ValidatorRec; + + +#define GXV_TABLE_DATA( tag, field ) \ + ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field ) + +#undef FT_INVALID_ +#define FT_INVALID_( _error ) \ + ft_validator_error( gxvalid->root, FT_THROW( _error ) ) + +#define GXV_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define GXV_INIT gxvalid->debug_indent = 0 + +#define GXV_NAME_ENTER( name ) \ + FT_BEGIN_STMNT \ + gxvalid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \ + FT_TRACE4(( "%s table\n", name )); \ + FT_END_STMNT + +#define GXV_EXIT gxvalid->debug_indent -= 2 + +#define GXV_TRACE( s ) \ + FT_BEGIN_STMNT \ + FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \ + FT_TRACE4( s ); \ + FT_END_STMNT + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define GXV_INIT do { } while ( 0 ) +#define GXV_NAME_ENTER( name ) do { } while ( 0 ) +#define GXV_EXIT do { } while ( 0 ) + +#define GXV_TRACE( s ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 32bit alignment checking *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \ + FT_BEGIN_STMNT \ + { \ + if ( (a) & 3 ) \ + FT_INVALID_OFFSET; \ + } \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Dumping Binary Data *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_TRACE_HEXDUMP( p, len ) \ + FT_BEGIN_STMNT \ + { \ + FT_Bytes b; \ + \ + \ + for ( b = p; b < (FT_Bytes)p + len; b++ ) \ + FT_TRACE1(("\\x%02x", *b)); \ + } \ + FT_END_STMNT + +#define GXV_TRACE_HEXDUMP_C( p, len ) \ + FT_BEGIN_STMNT \ + { \ + FT_Bytes b; \ + \ + \ + for ( b = p; b < (FT_Bytes)p + len; b++ ) \ + if ( 0x40 < *b && *b < 0x7E ) \ + FT_TRACE1(("%c", *b)); \ + else \ + FT_TRACE1(("\\x%02x", *b)); \ + } \ + FT_END_STMNT + +#define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \ + GXV_TRACE_HEXDUMP( n.string, n.string_len ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUP TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_BinSrchHeader_validate( FT_Bytes p, + FT_Bytes limit, + FT_UShort* unitSize_p, + FT_UShort* nUnits_p, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_LookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Glyph ID *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( FT_Int ) + gxv_glyphid_validate( FT_UShort gid, + GXV_Validator gxvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CONTROL POINT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_ctlPoint_validate( FT_UShort gid, + FT_UShort ctl_point, + GXV_Validator gxvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SFNT NAME *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_sfntName_validate( FT_UShort name_index, + FT_UShort min_index, + FT_UShort max_index, + GXV_Validator gxvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STATE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_StateTable_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_XStateTable_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_StateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_XStateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY MACROS AND FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_array_getlimits_byte( FT_Bytes table, + FT_Bytes limit, + FT_Byte* min, + FT_Byte* max, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_array_getlimits_ushort( FT_Bytes table, + FT_Bytes limit, + FT_UShort* min, + FT_UShort* max, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_set_length_by_ushort_offset( FT_UShort* offset, + FT_UShort** length, + FT_UShort* buff, + FT_UInt nmemb, + FT_UShort limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_set_length_by_ulong_offset( FT_ULong* offset, + FT_ULong** length, + FT_ULong* buff, + FT_UInt nmemb, + FT_ULong limit, + GXV_Validator gxvalid); + + +#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \ + FT_BEGIN_STMNT \ + if ( (_offset) > gxvalid->subtable_length ) \ + FT_INVALID_OFFSET; \ + FT_END_STMNT + +#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( ( p + (_count) - gxvalid->subtable_start ) > \ + gxvalid->subtable_length ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + +#define GXV_USHORT_TO_SHORT( _us ) \ + ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) ) + +#define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 ) +#define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE + +#define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 ) +#define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Table overlapping *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_odtect_DataRec_ + { + FT_Bytes start; + FT_ULong length; + FT_String* name; + + } GXV_odtect_DataRec, *GXV_odtect_Data; + + typedef struct GXV_odtect_RangeRec_ + { + FT_UInt nRanges; + GXV_odtect_Data range; + + } GXV_odtect_RangeRec, *GXV_odtect_Range; + + + FT_LOCAL( void ) + gxv_odtect_add_range( FT_Bytes start, + FT_ULong length, + const FT_String* name, + GXV_odtect_Range odtect ); + + FT_LOCAL( void ) + gxv_odtect_validate( GXV_odtect_Range odtect, + GXV_Validator gxvalid ); + + +#define GXV_ODTECT( n, odtect ) \ + GXV_odtect_DataRec odtect ## _range[n]; \ + GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \ + GXV_odtect_Range odtect = NULL + +#define GXV_ODTECT_INIT( odtect ) \ + FT_BEGIN_STMNT \ + odtect ## _rec.nRanges = 0; \ + odtect ## _rec.range = odtect ## _range; \ + odtect = & odtect ## _rec; \ + FT_END_STMNT + + + /* */ + +FT_END_HEADER + +#endif /* GXVCOMMN_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxverror.h b/external/freetype/src/gxvalid/gxverror.h new file mode 100644 index 000000000..09311ed3c --- /dev/null +++ b/external/freetype/src/gxvalid/gxverror.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * gxverror.h + * + * TrueTypeGX/AAT validation module error codes (specification only). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + + /************************************************************************** + * + * This file is used to define the OpenType validation module error + * enumeration constants. + * + */ + +#ifndef GXVERROR_H_ +#define GXVERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX GXV_Err_ +#define FT_ERR_BASE FT_Mod_Err_GXvalid + +#include <freetype/fterrors.h> + +#endif /* GXVERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvfeat.c b/external/freetype/src/gxvalid/gxvfeat.c new file mode 100644 index 000000000..6cf18212a --- /dev/null +++ b/external/freetype/src/gxvalid/gxvfeat.c @@ -0,0 +1,339 @@ +/**************************************************************************** + * + * gxvfeat.c + * + * TrueTypeGX/AAT feat table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" +#include "gxvfeat.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvfeat + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_feat_DataRec_ + { + FT_UInt reserved_size; + FT_UShort feature; + FT_UShort setting; + + } GXV_feat_DataRec, *GXV_feat_Data; + + +#define GXV_FEAT_DATA( field ) GXV_TABLE_DATA( feat, field ) + + + typedef enum GXV_FeatureFlagsMask_ + { + GXV_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000U, + GXV_FEAT_MASK_DYNAMIC_DEFAULT = 0x4000, + GXV_FEAT_MASK_UNUSED = 0x3F00, + GXV_FEAT_MASK_DEFAULT_SETTING = 0x00FF + + } GXV_FeatureFlagsMask; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_feat_registry_validate( FT_UShort feature, + FT_UShort nSettings, + FT_Bool exclusive, + GXV_Validator gxvalid ) + { + GXV_NAME_ENTER( "feature in registry" ); + + GXV_TRACE(( " (feature = %u)\n", feature )); + + if ( feature >= gxv_feat_registry_length ) + { + GXV_TRACE(( "feature number %d is out of range %lu\n", + feature, gxv_feat_registry_length )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + goto Exit; + } + + if ( gxv_feat_registry[feature].existence == 0 ) + { + GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n", + feature )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + goto Exit; + } + + if ( gxv_feat_registry[feature].apple_reserved ) + { + /* Don't use here. Apple is reserved. */ + GXV_TRACE(( "feature number %d is reserved by Apple\n", feature )); + if ( gxvalid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + if ( nSettings != gxv_feat_registry[feature].nSettings ) + { + GXV_TRACE(( "feature %d: nSettings %d != defined nSettings %d\n", + feature, nSettings, + gxv_feat_registry[feature].nSettings )); + if ( gxvalid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + if ( exclusive != gxv_feat_registry[feature].exclusive ) + { + GXV_TRACE(( "exclusive flag %d differs from predefined value\n", + exclusive )); + if ( gxvalid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + Exit: + GXV_EXIT; + } + + + static void + gxv_feat_name_index_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + FT_Short nameIndex; + + + GXV_NAME_ENTER( "nameIndex" ); + + GXV_LIMIT_CHECK( 2 ); + nameIndex = FT_NEXT_SHORT ( p ); + GXV_TRACE(( " (nameIndex = %d)\n", nameIndex )); + + gxv_sfntName_validate( (FT_UShort)nameIndex, + 255, + 32768U, + gxvalid ); + + GXV_EXIT; + } + + + static void + gxv_feat_setting_validate( FT_Bytes table, + FT_Bytes limit, + FT_Bool exclusive, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort setting; + + + GXV_NAME_ENTER( "setting" ); + + GXV_LIMIT_CHECK( 2 ); + + setting = FT_NEXT_USHORT( p ); + + /* If we have exclusive setting, the setting should be odd. */ + if ( exclusive && ( setting & 1 ) == 0 ) + FT_INVALID_DATA; + + gxv_feat_name_index_validate( p, limit, gxvalid ); + + GXV_FEAT_DATA( setting ) = setting; + + GXV_EXIT; + } + + + static void + gxv_feat_name_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UInt reserved_size = GXV_FEAT_DATA( reserved_size ); + + FT_UShort feature; + FT_UShort nSettings; + FT_ULong settingTable; + FT_UShort featureFlags; + + FT_Bool exclusive; + FT_Int last_setting; + FT_UInt i; + + + GXV_NAME_ENTER( "name" ); + + /* feature + nSettings + settingTable + featureFlags */ + GXV_LIMIT_CHECK( 2 + 2 + 4 + 2 ); + + feature = FT_NEXT_USHORT( p ); + GXV_FEAT_DATA( feature ) = feature; + + nSettings = FT_NEXT_USHORT( p ); + settingTable = FT_NEXT_ULONG ( p ); + featureFlags = FT_NEXT_USHORT( p ); + + if ( settingTable < reserved_size ) + FT_INVALID_OFFSET; + + if ( ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 ) + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + + exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS ); + if ( exclusive ) + { + FT_Byte dynamic_default; + + + if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT ) + dynamic_default = (FT_Byte)( featureFlags & + GXV_FEAT_MASK_DEFAULT_SETTING ); + else + dynamic_default = 0; + + /* If exclusive, check whether default setting is in the range. */ + if ( !( dynamic_default < nSettings ) ) + FT_INVALID_FORMAT; + } + + gxv_feat_registry_validate( feature, nSettings, exclusive, gxvalid ); + + gxv_feat_name_index_validate( p, limit, gxvalid ); + + p = gxvalid->root->base + settingTable; + for ( last_setting = -1, i = 0; i < nSettings; i++ ) + { + gxv_feat_setting_validate( p, limit, exclusive, gxvalid ); + + if ( (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting ) + GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); + + last_setting = (FT_Int)GXV_FEAT_DATA( setting ); + /* setting + nameIndex */ + p += ( 2 + 2 ); + } + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** feat TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_feat_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + + GXV_feat_DataRec featrec; + GXV_feat_Data feat = &featrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_UInt featureNameCount; + + FT_UInt i; + FT_Int last_feature; + + + gxvalid->root = ftvalid; + gxvalid->table_data = feat; + gxvalid->face = face; + + FT_TRACE3(( "validating `feat' table\n" )); + GXV_INIT; + + feat->reserved_size = 0; + + /* version + featureNameCount + none_0 + none_1 */ + GXV_LIMIT_CHECK( 4 + 2 + 2 + 4 ); + feat->reserved_size += 4 + 2 + 2 + 4; + + if ( FT_NEXT_ULONG( p ) != 0x00010000UL ) /* Version */ + FT_INVALID_FORMAT; + + featureNameCount = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount )); + + if ( !( IS_PARANOID_VALIDATION ) ) + p += 6; /* skip (none) and (none) */ + else + { + if ( FT_NEXT_USHORT( p ) != 0 ) + FT_INVALID_DATA; + + if ( FT_NEXT_ULONG( p ) != 0 ) + FT_INVALID_DATA; + } + + feat->reserved_size += featureNameCount * ( 2 + 2 + 4 + 2 + 2 ); + + for ( last_feature = -1, i = 0; i < featureNameCount; i++ ) + { + gxv_feat_name_validate( p, limit, gxvalid ); + + if ( (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature ) + GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT ); + + last_feature = GXV_FEAT_DATA( feature ); + p += 2 + 2 + 4 + 2 + 2; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvfeat.h b/external/freetype/src/gxvalid/gxvfeat.h new file mode 100644 index 000000000..b33c1bc68 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvfeat.h @@ -0,0 +1,173 @@ +/**************************************************************************** + * + * gxvfeat.h + * + * TrueTypeGX/AAT feat table validation (specification). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef GXVFEAT_H_ +#define GXVFEAT_H_ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Registry predefined by Apple *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* TODO: More compact format */ + typedef struct GXV_Feature_RegistryRec_ + { + FT_Bool existence; + FT_Bool apple_reserved; + FT_Bool exclusive; + FT_Byte nSettings; + + } GX_Feature_RegistryRec; + + +#define gxv_feat_registry_length \ + ( sizeof ( gxv_feat_registry ) / \ + sizeof ( GX_Feature_RegistryRec ) ) + + + static GX_Feature_RegistryRec gxv_feat_registry[] = + { + /* Generated from gxvfgen.c */ + {1, 0, 0, 1}, /* All Typographic Features */ + {1, 0, 0, 8}, /* Ligatures */ + {1, 0, 1, 3}, /* Cursive Connection */ + {1, 0, 1, 6}, /* Letter Case */ + {1, 0, 0, 1}, /* Vertical Substitution */ + {1, 0, 0, 1}, /* Linguistic Rearrangement */ + {1, 0, 1, 2}, /* Number Spacing */ + {1, 1, 0, 0}, /* Apple Reserved 1 */ + {1, 0, 0, 5}, /* Smart Swashes */ + {1, 0, 1, 3}, /* Diacritics */ + {1, 0, 1, 4}, /* Vertical Position */ + {1, 0, 1, 3}, /* Fractions */ + {1, 1, 0, 0}, /* Apple Reserved 2 */ + {1, 0, 0, 1}, /* Overlapping Characters */ + {1, 0, 0, 6}, /* Typographic Extras */ + {1, 0, 0, 5}, /* Mathematical Extras */ + {1, 0, 1, 7}, /* Ornament Sets */ + {1, 0, 1, 1}, /* Character Alternatives */ + {1, 0, 1, 5}, /* Design Complexity */ + {1, 0, 1, 6}, /* Style Options */ + {1, 0, 1, 11}, /* Character Shape */ + {1, 0, 1, 2}, /* Number Case */ + {1, 0, 1, 4}, /* Text Spacing */ + {1, 0, 1, 10}, /* Transliteration */ + {1, 0, 1, 9}, /* Annotation */ + {1, 0, 1, 2}, /* Kana Spacing */ + {1, 0, 1, 2}, /* Ideographic Spacing */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {1, 0, 1, 4}, /* Text Spacing */ + {1, 0, 1, 2}, /* Kana Spacing */ + {1, 0, 1, 2}, /* Ideographic Spacing */ + {1, 0, 1, 4}, /* CJK Roman Spacing */ + }; + + +#endif /* GXVFEAT_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvfgen.c b/external/freetype/src/gxvalid/gxvfgen.c new file mode 100644 index 000000000..cf98bb36c --- /dev/null +++ b/external/freetype/src/gxvalid/gxvfgen.c @@ -0,0 +1,484 @@ +/**************************************************************************** + * + * gxfgen.c + * + * Generate feature registry data for gxv `feat' validator. + * This program is derived from gxfeatreg.c in gxlayout. + * + * Copyright (C) 2004-2023 by + * Masatake YAMATO and Redhat K.K. + * + * This file may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxfeatreg.c + * + * Database of font features pre-defined by Apple Computer, Inc. + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html + * (body). + * + * Copyright 2003 by + * Masatake YAMATO and Redhat K.K. + * + * This file may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * Development of gxfeatreg.c is supported by + * Information-technology Promotion Agency, Japan. + * + */ + + +/**************************************************************************** + * + * This file is compiled as a stand-alone executable. + * This file is never compiled into `libfreetype2'. + * The output of this file is used in `gxvfeat.c'. + * ----------------------------------------------------------------------- + * Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen + * Run: ./gxvfgen > tmp.c + * + */ + + /******************************************************************** + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + + /* + * If you add a new setting to a feature, check the number of settings + * in the feature. If the number is greater than the value defined as + * FEATREG_MAX_SETTING, update the value. + */ +#define FEATREG_MAX_SETTING 12 + + /******************************************************************** + * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + */ + + +#include <stdio.h> +#include <string.h> + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define APPLE_RESERVED "Apple Reserved" +#define APPLE_RESERVED_LENGTH 14 + + typedef struct GX_Feature_RegistryRec_ + { + const char* feat_name; + char exclusive; + char* setting_name[FEATREG_MAX_SETTING]; + + } GX_Feature_RegistryRec; + + +#define EMPTYFEAT {0, 0, {NULL}} + + + static GX_Feature_RegistryRec featreg_table[] = + { + { /* 0 */ + "All Typographic Features", + 0, + { + "All Type Features", + NULL + } + }, { /* 1 */ + "Ligatures", + 0, + { + "Required Ligatures", + "Common Ligatures", + "Rare Ligatures", + "Logos", + "Rebus Pictures", + "Diphthong Ligatures", + "Squared Ligatures", + "Squared Ligatures, Abbreviated", + NULL + } + }, { /* 2 */ + "Cursive Connection", + 1, + { + "Unconnected", + "Partially Connected", + "Cursive", + NULL + } + }, { /* 3 */ + "Letter Case", + 1, + { + "Upper & Lower Case", + "All Caps", + "All Lower Case", + "Small Caps", + "Initial Caps", + "Initial Caps & Small Caps", + NULL + } + }, { /* 4 */ + "Vertical Substitution", + 0, + { + /* "Substitute Vertical Forms", */ + "Turns on the feature", + NULL + } + }, { /* 5 */ + "Linguistic Rearrangement", + 0, + { + /* "Linguistic Rearrangement", */ + "Turns on the feature", + NULL + } + }, { /* 6 */ + "Number Spacing", + 1, + { + "Monospaced Numbers", + "Proportional Numbers", + NULL + } + }, { /* 7 */ + APPLE_RESERVED " 1", + 0, + {NULL} + }, { /* 8 */ + "Smart Swashes", + 0, + { + "Word Initial Swashes", + "Word Final Swashes", + "Line Initial Swashes", + "Line Final Swashes", + "Non-Final Swashes", + NULL + } + }, { /* 9 */ + "Diacritics", + 1, + { + "Show Diacritics", + "Hide Diacritics", + "Decompose Diacritics", + NULL + } + }, { /* 10 */ + "Vertical Position", + 1, + { + /* "Normal Position", */ + "No Vertical Position", + "Superiors", + "Inferiors", + "Ordinals", + NULL + } + }, { /* 11 */ + "Fractions", + 1, + { + "No Fractions", + "Vertical Fractions", + "Diagonal Fractions", + NULL + } + }, { /* 12 */ + APPLE_RESERVED " 2", + 0, + {NULL} + }, { /* 13 */ + "Overlapping Characters", + 0, + { + /* "Prevent Overlap", */ + "Turns on the feature", + NULL + } + }, { /* 14 */ + "Typographic Extras", + 0, + { + "Hyphens to Em Dash", + "Hyphens to En Dash", + "Unslashed Zero", + "Form Interrobang", + "Smart Quotes", + "Periods to Ellipsis", + NULL + } + }, { /* 15 */ + "Mathematical Extras", + 0, + { + "Hyphens to Minus", + "Asterisk to Multiply", + "Slash to Divide", + "Inequality Ligatures", + "Exponents", + NULL + } + }, { /* 16 */ + "Ornament Sets", + 1, + { + "No Ornaments", + "Dingbats", + "Pi Characters", + "Fleurons", + "Decorative Borders", + "International Symbols", + "Math Symbols", + NULL + } + }, { /* 17 */ + "Character Alternatives", + 1, + { + "No Alternates", + /* TODO */ + NULL + } + }, { /* 18 */ + "Design Complexity", + 1, + { + "Design Level 1", + "Design Level 2", + "Design Level 3", + "Design Level 4", + "Design Level 5", + /* TODO */ + NULL + } + }, { /* 19 */ + "Style Options", + 1, + { + "No Style Options", + "Display Text", + "Engraved Text", + "Illuminated Caps", + "Tilling Caps", + "Tall Caps", + NULL + } + }, { /* 20 */ + "Character Shape", + 1, + { + "Traditional Characters", + "Simplified Characters", + "JIS 1978 Characters", + "JIS 1983 Characters", + "JIS 1990 Characters", + "Traditional Characters, Alternative Set 1", + "Traditional Characters, Alternative Set 2", + "Traditional Characters, Alternative Set 3", + "Traditional Characters, Alternative Set 4", + "Traditional Characters, Alternative Set 5", + "Expert Characters", + NULL /* count => 12 */ + } + }, { /* 21 */ + "Number Case", + 1, + { + "Lower Case Numbers", + "Upper Case Numbers", + NULL + } + }, { /* 22 */ + "Text Spacing", + 1, + { + "Proportional", + "Monospaced", + "Half-width", + "Normal", + NULL + } + }, /* Here after Newer */ { /* 23 */ + "Transliteration", + 1, + { + "No Transliteration", + "Hanja To Hangul", + "Hiragana to Katakana", + "Katakana to Hiragana", + "Kana to Romanization", + "Romanization to Hiragana", + "Romanization to Katakana", + "Hanja to Hangul, Alternative Set 1", + "Hanja to Hangul, Alternative Set 2", + "Hanja to Hangul, Alternative Set 3", + NULL + } + }, { /* 24 */ + "Annotation", + 1, + { + "No Annotation", + "Box Annotation", + "Rounded Box Annotation", + "Circle Annotation", + "Inverted Circle Annotation", + "Parenthesis Annotation", + "Period Annotation", + "Roman Numeral Annotation", + "Diamond Annotation", + NULL + } + }, { /* 25 */ + "Kana Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 26 */ + "Ideographic Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 27-30 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */ + EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 96-98 */ + EMPTYFEAT, /* 99 */ { /* 100 => 22 */ + "Text Spacing", + 1, + { + "Proportional", + "Monospaced", + "Half-width", + "Normal", + NULL + } + }, { /* 101 => 25 */ + "Kana Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 102 => 26 */ + "Ideographic Spacing", + 1, + { + "Full Width", + "Proportional", + NULL + } + }, { /* 103 */ + "CJK Roman Spacing", + 1, + { + "Half-width", + "Proportional", + "Default Roman", + "Full-width Roman", + NULL + } + }, { /* 104 => 1 */ + "All Typographic Features", + 0, + { + "All Type Features", + NULL + } + } + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Generator *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + int + main( void ) + { + int i; + + + printf( " {\n" ); + printf( " /* Generated from %s */\n", __FILE__ ); + + for ( i = 0; + i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec ); + i++ ) + { + const char* feat_name; + int nSettings; + + + feat_name = featreg_table[i].feat_name; + for ( nSettings = 0; + featreg_table[i].setting_name[nSettings]; + nSettings++) + ; /* Do nothing */ + + printf( " {%1d, %1d, %1d, %2d}, /* %s */\n", + feat_name ? 1 : 0, + ( feat_name && + ( ft_strncmp( feat_name, + APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 ) + ) ? 1 : 0, + featreg_table[i].exclusive ? 1 : 0, + nSettings, + feat_name ? feat_name : "__EMPTY__" ); + } + + printf( " };\n" ); + + return 0; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvjust.c b/external/freetype/src/gxvalid/gxvjust.c new file mode 100644 index 000000000..5cca94d8f --- /dev/null +++ b/external/freetype/src/gxvalid/gxvjust.c @@ -0,0 +1,721 @@ +/**************************************************************************** + * + * gxvjust.c + * + * TrueTypeGX/AAT just table validation (body). + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include <freetype/ftsnames.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvjust + + /* + * referred `just' table format specification: + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6just.html + * last updated 2000. + * ---------------------------------------------- + * [JUST HEADER]: GXV_JUST_HEADER_SIZE + * version (fixed: 32bit) = 0x00010000 + * format (uint16: 16bit) = 0 is only defined (2000) + * horizOffset (uint16: 16bit) + * vertOffset (uint16: 16bit) + * ---------------------------------------------- + */ + + typedef struct GXV_just_DataRec_ + { + FT_UShort wdc_offset_max; + FT_UShort wdc_offset_min; + FT_UShort pc_offset_max; + FT_UShort pc_offset_min; + + } GXV_just_DataRec, *GXV_just_Data; + + +#define GXV_JUST_DATA( a ) GXV_TABLE_DATA( just, a ) + + + /* GX just table does not define their subset of GID */ + static void + gxv_just_check_max_gid( FT_UShort gid, + const FT_String* msg_tag, + GXV_Validator gxvalid ) + { + FT_UNUSED( msg_tag ); + + if ( gid < gxvalid->face->num_glyphs ) + return; + + GXV_TRACE(( "just table includes too large %s" + " GID=%d > %ld (in maxp)\n", + msg_tag, gid, gxvalid->face->num_glyphs )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + + + static void + gxv_just_wdp_entry_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_ULong justClass; +#ifdef GXV_LOAD_UNUSED_VARS + FT_Fixed beforeGrowLimit; + FT_Fixed beforeShrinkGrowLimit; + FT_Fixed afterGrowLimit; + FT_Fixed afterShrinkGrowLimit; + FT_UShort growFlags; + FT_UShort shrinkFlags; +#endif + + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 ); + justClass = FT_NEXT_ULONG( p ); +#ifndef GXV_LOAD_UNUSED_VARS + p += 4 + 4 + 4 + 4 + 2 + 2; +#else + beforeGrowLimit = FT_NEXT_ULONG( p ); + beforeShrinkGrowLimit = FT_NEXT_ULONG( p ); + afterGrowLimit = FT_NEXT_ULONG( p ); + afterShrinkGrowLimit = FT_NEXT_ULONG( p ); + growFlags = FT_NEXT_USHORT( p ); + shrinkFlags = FT_NEXT_USHORT( p ); +#endif + + /* According to Apple spec, only 7bits in justClass is used */ + if ( ( justClass & 0xFFFFFF80UL ) != 0 ) + { + GXV_TRACE(( "just table includes non-zero value" + " in unused justClass higher bits" + " of WidthDeltaPair" )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_just_wdc_entry_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_ULong count, i; + + + GXV_LIMIT_CHECK( 4 ); + count = FT_NEXT_ULONG( p ); + for ( i = 0; i < count; i++ ) + { + GXV_TRACE(( "validating wdc pair %lu/%lu\n", i + 1, count )); + gxv_just_wdp_entry_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_just_widthDeltaClusters_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_Bytes wdc_end = table + GXV_JUST_DATA( wdc_offset_max ); + + + GXV_NAME_ENTER( "just justDeltaClusters" ); + + if ( limit <= wdc_end ) + FT_INVALID_OFFSET; + + while ( p <= wdc_end ) + { + gxv_just_wdc_entry_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static void + gxv_just_actSubrecord_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + FT_Fixed lowerLimit; + FT_Fixed upperLimit; +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort order; +#endif + FT_UShort decomposedCount; + + FT_UInt i; + + + GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); + lowerLimit = FT_NEXT_LONG( p ); + upperLimit = FT_NEXT_LONG( p ); +#ifdef GXV_LOAD_UNUSED_VARS + order = FT_NEXT_USHORT( p ); +#else + p += 2; +#endif + decomposedCount = FT_NEXT_USHORT( p ); + + if ( lowerLimit >= upperLimit ) + { + GXV_TRACE(( "just table includes invalid range spec:" + " lowerLimit(%ld) > upperLimit(%ld)\n", + lowerLimit, upperLimit )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + + for ( i = 0; i < decomposedCount; i++ ) + { + FT_UShort glyphs; + + + GXV_LIMIT_CHECK( 2 ); + glyphs = FT_NEXT_USHORT( p ); + gxv_just_check_max_gid( glyphs, "type0:glyphs", gxvalid ); + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_just_actSubrecord_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort addGlyph; + + + GXV_LIMIT_CHECK( 2 ); + addGlyph = FT_NEXT_USHORT( p ); + + gxv_just_check_max_gid( addGlyph, "type1:addGlyph", gxvalid ); + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_just_actSubrecord_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; +#ifdef GXV_LOAD_UNUSED_VARS + FT_Fixed substThreshhold; /* Apple misspelled "Threshhold" */ +#endif + FT_UShort addGlyph; + FT_UShort substGlyph; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); +#ifdef GXV_LOAD_UNUSED_VARS + substThreshhold = FT_NEXT_ULONG( p ); +#else + p += 4; +#endif + addGlyph = FT_NEXT_USHORT( p ); + substGlyph = FT_NEXT_USHORT( p ); + + if ( addGlyph != 0xFFFF ) + gxv_just_check_max_gid( addGlyph, "type2:addGlyph", gxvalid ); + + gxv_just_check_max_gid( substGlyph, "type2:substGlyph", gxvalid ); + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + static void + gxv_just_actSubrecord_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_ULong variantsAxis; + FT_Fixed minimumLimit; + FT_Fixed noStretchValue; + FT_Fixed maximumLimit; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + variantsAxis = FT_NEXT_ULONG( p ); + minimumLimit = FT_NEXT_LONG( p ); + noStretchValue = FT_NEXT_LONG( p ); + maximumLimit = FT_NEXT_LONG( p ); + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + if ( variantsAxis != 0x64756374L ) /* 'duct' */ + GXV_TRACE(( "variantsAxis 0x%08lx is non default value", + variantsAxis )); + + if ( minimumLimit > noStretchValue ) + GXV_TRACE(( "type4:minimumLimit 0x%08lx > noStretchValue 0x%08lx\n", + minimumLimit, noStretchValue )); + else if ( noStretchValue > maximumLimit ) + GXV_TRACE(( "type4:noStretchValue 0x%08lx > maximumLimit 0x%08lx\n", + noStretchValue, maximumLimit )); + else if ( !IS_PARANOID_VALIDATION ) + return; + + FT_INVALID_DATA; + } + + + static void + gxv_just_actSubrecord_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort flags; + FT_UShort glyph; + + + GXV_LIMIT_CHECK( 2 + 2 ); + flags = FT_NEXT_USHORT( p ); + glyph = FT_NEXT_USHORT( p ); + + if ( flags ) + GXV_TRACE(( "type5: nonzero value 0x%04x in unused flags\n", + flags )); + gxv_just_check_max_gid( glyph, "type5:glyph", gxvalid ); + + gxvalid->subtable_length = (FT_ULong)( p - table ); + } + + + /* parse single actSubrecord */ + static void + gxv_just_actSubrecord_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort actionClass; + FT_UShort actionType; + FT_ULong actionLength; + + + GXV_NAME_ENTER( "just actSubrecord" ); + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + actionClass = FT_NEXT_USHORT( p ); + actionType = FT_NEXT_USHORT( p ); + actionLength = FT_NEXT_ULONG( p ); + + /* actionClass is related with justClass using 7bit only */ + if ( ( actionClass & 0xFF80 ) != 0 ) + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + + if ( actionType == 0 ) + gxv_just_actSubrecord_type0_validate( p, limit, gxvalid ); + else if ( actionType == 1 ) + gxv_just_actSubrecord_type1_validate( p, limit, gxvalid ); + else if ( actionType == 2 ) + gxv_just_actSubrecord_type2_validate( p, limit, gxvalid ); + else if ( actionType == 3 ) + ; /* Stretch glyph action: no actionData */ + else if ( actionType == 4 ) + gxv_just_actSubrecord_type4_validate( p, limit, gxvalid ); + else if ( actionType == 5 ) + gxv_just_actSubrecord_type5_validate( p, limit, gxvalid ); + else + FT_INVALID_DATA; + + gxvalid->subtable_length = actionLength; + + GXV_EXIT; + } + + + static void + gxv_just_pcActionRecord_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_ULong actionCount; + FT_ULong i; + + + GXV_LIMIT_CHECK( 4 ); + actionCount = FT_NEXT_ULONG( p ); + GXV_TRACE(( "actionCount = %lu\n", actionCount )); + + for ( i = 0; i < actionCount; i++ ) + { + gxv_just_actSubrecord_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static void + gxv_just_pcTable_LookupValue_entry_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_UNUSED( glyph ); + + if ( value_p->u > GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_max ) = value_p->u; + if ( value_p->u < GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_min ) = value_p->u; + } + + + static void + gxv_just_pcLookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "just pcLookupTable" ); + GXV_JUST_DATA( pc_offset_max ) = 0x0000; + GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU; + + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate; + + gxv_LookupTable_validate( p, limit, gxvalid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + static void + gxv_just_postcompTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "just postcompTable" ); + + gxv_just_pcLookupTable_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + + gxv_just_pcActionRecord_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static void + gxv_just_classTable_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + /* TODO: validate markClass & currentClass */ + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort markClass; + FT_UShort currentClass; +#endif + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + FT_UNUSED( gxvalid ); + +#ifndef GXV_LOAD_UNUSED_VARS + FT_UNUSED( flags ); +#else + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markClass = (FT_UShort)( ( flags >> 7 ) & 0x7F ); + currentClass = (FT_UShort)( flags & 0x7F ); +#endif + } + + + static void + gxv_just_justClassTable_validate ( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort length; + FT_UShort coverage; + FT_ULong subFeatureFlags; + + + GXV_NAME_ENTER( "just justClassTable" ); + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( " justClassTable: coverage = 0x%04x ", coverage )); + if ( ( coverage & 0x4000 ) == 0 ) + GXV_TRACE(( "ascending\n" )); + else + GXV_TRACE(( "descending\n" )); + + if ( subFeatureFlags ) + GXV_TRACE(( " justClassTable: nonzero value (0x%08lx)" + " in unused subFeatureFlags\n", subFeatureFlags )); + + gxvalid->statetable.optdata = NULL; + gxvalid->statetable.optdata_load_func = NULL; + gxvalid->statetable.subtable_setup_func = NULL; + gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + gxvalid->statetable.entry_validate_func = + gxv_just_classTable_entry_validate; + + gxv_StateTable_validate( p, table + length, gxvalid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + static void + gxv_just_wdcTable_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_UNUSED( glyph ); + + if ( value_p->u > GXV_JUST_DATA( wdc_offset_max ) ) + GXV_JUST_DATA( wdc_offset_max ) = value_p->u; + if ( value_p->u < GXV_JUST_DATA( wdc_offset_min ) ) + GXV_JUST_DATA( wdc_offset_min ) = value_p->u; + } + + + static void + gxv_just_justData_lookuptable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + GXV_JUST_DATA( wdc_offset_max ) = 0x0000; + GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU; + + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_just_wdcTable_LookupValue_validate; + + gxv_LookupTable_validate( p, limit, gxvalid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + /* + * gxv_just_justData_validate() parses and validates horizData, vertData. + */ + static void + gxv_just_justData_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + /* + * following 3 offsets are measured from the start of `just' + * (which table points to), not justData + */ + FT_UShort justClassTableOffset; + FT_UShort wdcTableOffset; + FT_UShort pcTableOffset; + FT_Bytes p = table; + + GXV_ODTECT( 4, odtect ); + + + GXV_NAME_ENTER( "just justData" ); + + GXV_ODTECT_INIT( odtect ); + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + justClassTableOffset = FT_NEXT_USHORT( p ); + wdcTableOffset = FT_NEXT_USHORT( p ); + pcTableOffset = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (justClassTableOffset = 0x%04x)\n", justClassTableOffset )); + GXV_TRACE(( " (wdcTableOffset = 0x%04x)\n", wdcTableOffset )); + GXV_TRACE(( " (pcTableOffset = 0x%04x)\n", pcTableOffset )); + + gxv_just_justData_lookuptable_validate( p, limit, gxvalid ); + gxv_odtect_add_range( p, gxvalid->subtable_length, + "just_LookupTable", odtect ); + + if ( wdcTableOffset ) + { + gxv_just_widthDeltaClusters_validate( + gxvalid->root->base + wdcTableOffset, limit, gxvalid ); + gxv_odtect_add_range( gxvalid->root->base + wdcTableOffset, + gxvalid->subtable_length, "just_wdcTable", odtect ); + } + + if ( pcTableOffset ) + { + gxv_just_postcompTable_validate( gxvalid->root->base + pcTableOffset, + limit, gxvalid ); + gxv_odtect_add_range( gxvalid->root->base + pcTableOffset, + gxvalid->subtable_length, "just_pcTable", odtect ); + } + + if ( justClassTableOffset ) + { + gxv_just_justClassTable_validate( + gxvalid->root->base + justClassTableOffset, limit, gxvalid ); + gxv_odtect_add_range( gxvalid->root->base + justClassTableOffset, + gxvalid->subtable_length, "just_justClassTable", + odtect ); + } + + gxv_odtect_validate( odtect, gxvalid ); + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_just_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + GXV_just_DataRec justrec; + GXV_just_Data just = &justrec; + + FT_ULong version; + FT_UShort format; + FT_UShort horizOffset; + FT_UShort vertOffset; + + GXV_ODTECT( 3, odtect ); + + + GXV_ODTECT_INIT( odtect ); + + gxvalid->root = ftvalid; + gxvalid->table_data = just; + gxvalid->face = face; + + FT_TRACE3(( "validating `just' table\n" )); + GXV_INIT; + + limit = gxvalid->root->limit; + + GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + horizOffset = FT_NEXT_USHORT( p ); + vertOffset = FT_NEXT_USHORT( p ); + gxv_odtect_add_range( table, (FT_ULong)( p - table ), + "just header", odtect ); + + + /* Version 1.0 (always:2000) */ + GXV_TRACE(( " (version = 0x%08lx)\n", version )); + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* format 0 (always:2000) */ + GXV_TRACE(( " (format = 0x%04x)\n", format )); + if ( format != 0x0000 ) + FT_INVALID_FORMAT; + + GXV_TRACE(( " (horizOffset = %d)\n", horizOffset )); + GXV_TRACE(( " (vertOffset = %d)\n", vertOffset )); + + + /* validate justData */ + if ( 0 < horizOffset ) + { + gxv_just_justData_validate( table + horizOffset, limit, gxvalid ); + gxv_odtect_add_range( table + horizOffset, gxvalid->subtable_length, + "horizJustData", odtect ); + } + + if ( 0 < vertOffset ) + { + gxv_just_justData_validate( table + vertOffset, limit, gxvalid ); + gxv_odtect_add_range( table + vertOffset, gxvalid->subtable_length, + "vertJustData", odtect ); + } + + gxv_odtect_validate( odtect, gxvalid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvkern.c b/external/freetype/src/gxvalid/gxvkern.c new file mode 100644 index 000000000..21fc24596 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvkern.c @@ -0,0 +1,920 @@ +/**************************************************************************** + * + * gxvkern.c + * + * TrueTypeGX/AAT kern table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include <freetype/ftsnames.h> +#include <freetype/internal/services/svgxval.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvkern + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef enum GXV_kern_Version_ + { + KERN_VERSION_CLASSIC = 0x0000, + KERN_VERSION_NEW = 0x0001 + + } GXV_kern_Version; + + + typedef enum GXV_kern_Dialect_ + { + KERN_DIALECT_UNKNOWN = 0, + KERN_DIALECT_MS = FT_VALIDATE_MS, + KERN_DIALECT_APPLE = FT_VALIDATE_APPLE, + KERN_DIALECT_ANY = FT_VALIDATE_CKERN + + } GXV_kern_Dialect; + + + typedef struct GXV_kern_DataRec_ + { + GXV_kern_Version version; + void *subtable_data; + GXV_kern_Dialect dialect_request; + + } GXV_kern_DataRec, *GXV_kern_Data; + + +#define GXV_KERN_DATA( field ) GXV_TABLE_DATA( kern, field ) + +#define KERN_IS_CLASSIC( gxvalid ) \ + ( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) ) +#define KERN_IS_NEW( gxvalid ) \ + ( KERN_VERSION_NEW == GXV_KERN_DATA( version ) ) + +#define KERN_DIALECT( gxvalid ) \ + GXV_KERN_DATA( dialect_request ) +#define KERN_ALLOWS_MS( gxvalid ) \ + ( KERN_DIALECT( gxvalid ) & KERN_DIALECT_MS ) +#define KERN_ALLOWS_APPLE( gxvalid ) \ + ( KERN_DIALECT( gxvalid ) & KERN_DIALECT_APPLE ) + +#define GXV_KERN_HEADER_SIZE ( KERN_IS_NEW( gxvalid ) ? 8 : 4 ) +#define GXV_KERN_SUBTABLE_HEADER_SIZE ( KERN_IS_NEW( gxvalid ) ? 8 : 6 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SUBTABLE VALIDATORS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* ============================= format 0 ============================== */ + + static void + gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nPairs, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort i; + + FT_UShort last_gid_left = 0; + FT_UShort last_gid_right = 0; + + FT_UNUSED( limit ); + + + GXV_NAME_ENTER( "kern format 0 pairs" ); + + for ( i = 0; i < nPairs; i++ ) + { + FT_UShort gid_left; + FT_UShort gid_right; +#ifdef GXV_LOAD_UNUSED_VARS + FT_Short kernValue; +#endif + + + /* left */ + gid_left = FT_NEXT_USHORT( p ); + gxv_glyphid_validate( gid_left, gxvalid ); + + /* right */ + gid_right = FT_NEXT_USHORT( p ); + gxv_glyphid_validate( gid_right, gxvalid ); + + /* Pairs of left and right GIDs must be unique and sorted. */ + GXV_TRACE(( "left gid = %u, right gid = %u\n", gid_left, gid_right )); + if ( gid_left == last_gid_left ) + { + if ( last_gid_right < gid_right ) + last_gid_right = gid_right; + else + FT_INVALID_DATA; + } + else if ( last_gid_left < gid_left ) + { + last_gid_left = gid_left; + last_gid_right = gid_right; + } + else + FT_INVALID_DATA; + + /* skip the kern value */ +#ifdef GXV_LOAD_UNUSED_VARS + kernValue = FT_NEXT_SHORT( p ); +#else + p += 2; +#endif + } + + GXV_EXIT; + } + + static void + gxv_kern_subtable_fmt0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + + FT_UShort nPairs; + FT_UShort unitSize; + + + GXV_NAME_ENTER( "kern subtable format 0" ); + + unitSize = 2 + 2 + 2; + nPairs = 0; + + /* nPairs, searchRange, entrySelector, rangeShift */ + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, gxvalid ); + p += 2 + 2 + 2 + 2; + + gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, gxvalid ); + + GXV_EXIT; + } + + + /* ============================= format 1 ============================== */ + + + typedef struct GXV_kern_fmt1_StateOptRec_ + { + FT_UShort valueTable; + FT_UShort valueTable_length; + + } GXV_kern_fmt1_StateOptRec, *GXV_kern_fmt1_StateOptRecData; + + + static void + gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + GXV_kern_fmt1_StateOptRecData optdata = + (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->valueTable = FT_NEXT_USHORT( p ); + } + + + /* + * passed tables_size covers whole StateTable, including kern fmt1 header + */ + static void + gxv_kern_subtable_fmt1_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_UShort o[4]; + FT_UShort *l[4]; + FT_UShort buff[5]; + + GXV_kern_fmt1_StateOptRecData optdata = + (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->valueTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->valueTable_length); + + gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, gxvalid ); + } + + + /* + * passed table & limit are of whole StateTable, not including subtables + */ + static void + gxv_kern_subtable_fmt1_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort push; + FT_UShort dontAdvance; +#endif + FT_UShort valueOffset; +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort kernAction; + FT_UShort kernValue; +#endif + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + + +#ifdef GXV_LOAD_UNUSED_VARS + push = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); +#endif + valueOffset = (FT_UShort)( flags & 0x3FFF ); + + { + GXV_kern_fmt1_StateOptRecData vt_rec = + (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata; + FT_Bytes p; + + + if ( valueOffset < vt_rec->valueTable ) + FT_INVALID_OFFSET; + + p = table + valueOffset; + limit = table + vt_rec->valueTable + vt_rec->valueTable_length; + + GXV_LIMIT_CHECK( 2 + 2 ); +#ifdef GXV_LOAD_UNUSED_VARS + kernAction = FT_NEXT_USHORT( p ); + kernValue = FT_NEXT_USHORT( p ); +#endif + } + } + + + static void + gxv_kern_subtable_fmt1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + GXV_kern_fmt1_StateOptRec vt_rec; + + + GXV_NAME_ENTER( "kern subtable format 1" ); + + gxvalid->statetable.optdata = + &vt_rec; + gxvalid->statetable.optdata_load_func = + gxv_kern_subtable_fmt1_valueTable_load; + gxvalid->statetable.subtable_setup_func = + gxv_kern_subtable_fmt1_subtable_setup; + gxvalid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_NONE; + gxvalid->statetable.entry_validate_func = + gxv_kern_subtable_fmt1_entry_validate; + + gxv_StateTable_validate( p, limit, gxvalid ); + + GXV_EXIT; + } + + + /* ================ Data for Class-Based Subtables 2, 3 ================ */ + + typedef enum GXV_kern_ClassSpec_ + { + GXV_KERN_CLS_L = 0, + GXV_KERN_CLS_R + + } GXV_kern_ClassSpec; + + + /* ============================= format 2 ============================== */ + + /* ---------------------- format 2 specific data ----------------------- */ + + typedef struct GXV_kern_subtable_fmt2_DataRec_ + { + FT_UShort rowWidth; + FT_UShort array; + FT_UShort offset_min[2]; + FT_UShort offset_max[2]; + const FT_String* class_tag[2]; + GXV_odtect_Range odtect; + + } GXV_kern_subtable_fmt2_DataRec, *GXV_kern_subtable_fmt2_Data; + + +#define GXV_KERN_FMT2_DATA( field ) \ + ( ( (GXV_kern_subtable_fmt2_DataRec *) \ + ( GXV_KERN_DATA( subtable_data ) ) )->field ) + + + /* -------------------------- utility functions ----------------------- */ + + static void + gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes table, + FT_Bytes limit, + GXV_kern_ClassSpec spec, + GXV_Validator gxvalid ) + { + const FT_String* tag = GXV_KERN_FMT2_DATA( class_tag[spec] ); + GXV_odtect_Range odtect = GXV_KERN_FMT2_DATA( odtect ); + + FT_Bytes p = table; + FT_UShort firstGlyph; + FT_UShort nGlyphs; + + + GXV_NAME_ENTER( "kern format 2 classTable" ); + + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + nGlyphs = FT_NEXT_USHORT( p ); + GXV_TRACE(( " %s firstGlyph=%d, nGlyphs=%d\n", + tag, firstGlyph, nGlyphs )); + + gxv_glyphid_validate( firstGlyph, gxvalid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), gxvalid ); + + gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ), + &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ), + &( GXV_KERN_FMT2_DATA( offset_max[spec] ) ), + gxvalid ); + + gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect ); + + GXV_EXIT; + } + + + static void + gxv_kern_subtable_fmt2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + GXV_ODTECT( 3, odtect ); + GXV_kern_subtable_fmt2_DataRec fmt2_rec = + { 0, 0, { 0, 0 }, { 0, 0 }, { "leftClass", "rightClass" }, NULL }; + + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + FT_UShort leftOffsetTable; + FT_UShort rightOffsetTable; + + + GXV_NAME_ENTER( "kern subtable format 2" ); + + GXV_ODTECT_INIT( odtect ); + fmt2_rec.odtect = odtect; + GXV_KERN_DATA( subtable_data ) = &fmt2_rec; + + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + GXV_KERN_FMT2_DATA( rowWidth ) = FT_NEXT_USHORT( p ); + leftOffsetTable = FT_NEXT_USHORT( p ); + rightOffsetTable = FT_NEXT_USHORT( p ); + GXV_KERN_FMT2_DATA( array ) = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "rowWidth = %d\n", GXV_KERN_FMT2_DATA( rowWidth ) )); + + + GXV_LIMIT_CHECK( leftOffsetTable ); + GXV_LIMIT_CHECK( rightOffsetTable ); + GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) ); + + gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit, + GXV_KERN_CLS_L, gxvalid ); + + gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit, + GXV_KERN_CLS_R, gxvalid ); + + if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) + + GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] ) + < GXV_KERN_FMT2_DATA( array ) ) + FT_INVALID_OFFSET; + + gxv_odtect_add_range( table + GXV_KERN_FMT2_DATA( array ), + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_L] ) + + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_R] ) + - GXV_KERN_FMT2_DATA( array ), + "array", odtect ); + + gxv_odtect_validate( odtect, gxvalid ); + + GXV_EXIT; + } + + + /* ============================= format 3 ============================== */ + + static void + gxv_kern_subtable_fmt3_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + FT_UShort glyphCount; + FT_Byte kernValueCount; + FT_Byte leftClassCount; + FT_Byte rightClassCount; + FT_Byte flags; + + + GXV_NAME_ENTER( "kern subtable format 3" ); + + GXV_LIMIT_CHECK( 2 + 1 + 1 + 1 + 1 ); + glyphCount = FT_NEXT_USHORT( p ); + kernValueCount = FT_NEXT_BYTE( p ); + leftClassCount = FT_NEXT_BYTE( p ); + rightClassCount = FT_NEXT_BYTE( p ); + flags = FT_NEXT_BYTE( p ); + + if ( gxvalid->face->num_glyphs != glyphCount ) + { + GXV_TRACE(( "maxGID=%ld, but glyphCount=%d\n", + gxvalid->face->num_glyphs, glyphCount )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + + if ( flags != 0 ) + GXV_TRACE(( "kern subtable fmt3 has nonzero value" + " (%d) in unused flag\n", flags )); + /* + * just skip kernValue[kernValueCount] + */ + GXV_LIMIT_CHECK( 2 * kernValueCount ); + p += 2 * kernValueCount; + + /* + * check leftClass[gid] < leftClassCount + */ + { + FT_Byte min, max; + + + GXV_LIMIT_CHECK( glyphCount ); + gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, gxvalid ); + p += gxvalid->subtable_length; + + if ( leftClassCount < max ) + FT_INVALID_DATA; + } + + /* + * check rightClass[gid] < rightClassCount + */ + { + FT_Byte min, max; + + + GXV_LIMIT_CHECK( glyphCount ); + gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, gxvalid ); + p += gxvalid->subtable_length; + + if ( rightClassCount < max ) + FT_INVALID_DATA; + } + + /* + * check kernIndex[i, j] < kernValueCount + */ + { + FT_UShort i, j; + + + for ( i = 0; i < leftClassCount; i++ ) + { + for ( j = 0; j < rightClassCount; j++ ) + { + GXV_LIMIT_CHECK( 1 ); + if ( kernValueCount < FT_NEXT_BYTE( p ) ) + FT_INVALID_OFFSET; + } + } + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static FT_Bool + gxv_kern_coverage_new_apple_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator gxvalid ) + { + /* new Apple-dialect */ +#ifdef GXV_LOAD_TRACE_VARS + FT_Bool kernVertical; + FT_Bool kernCrossStream; + FT_Bool kernVariation; +#endif + + FT_UNUSED( gxvalid ); + + + /* reserved bits = 0 */ + if ( coverage & 0x1FFC ) + return FALSE; + +#ifdef GXV_LOAD_TRACE_VARS + kernVertical = FT_BOOL( ( coverage >> 15 ) & 1 ); + kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 ); + kernVariation = FT_BOOL( ( coverage >> 13 ) & 1 ); +#endif + + *format = (FT_UShort)( coverage & 0x0003 ); + + GXV_TRACE(( "new Apple-dialect: " + "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n", + !kernVertical, kernCrossStream, kernVariation, *format )); + + GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); + + return TRUE; + } + + + static FT_Bool + gxv_kern_coverage_classic_apple_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator gxvalid ) + { + /* classic Apple-dialect */ +#ifdef GXV_LOAD_TRACE_VARS + FT_Bool horizontal; + FT_Bool cross_stream; +#endif + + + /* check expected flags, but don't check if MS-dialect is impossible */ + if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( gxvalid ) ) + return FALSE; + + /* reserved bits = 0 */ + if ( coverage & 0x02FC ) + return FALSE; + +#ifdef GXV_LOAD_TRACE_VARS + horizontal = FT_BOOL( ( coverage >> 15 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 ); +#endif + + *format = (FT_UShort)( coverage & 0x0003 ); + + GXV_TRACE(( "classic Apple-dialect: " + "horizontal=%d, cross-stream=%d, format=%d\n", + horizontal, cross_stream, *format )); + + /* format 1 requires GX State Machine, too new for classic */ + if ( *format == 1 ) + return FALSE; + + GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); + + return TRUE; + } + + + static FT_Bool + gxv_kern_coverage_classic_microsoft_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator gxvalid ) + { + /* classic Microsoft-dialect */ +#ifdef GXV_LOAD_TRACE_VARS + FT_Bool horizontal; + FT_Bool minimum; + FT_Bool cross_stream; + FT_Bool override; +#endif + + FT_UNUSED( gxvalid ); + + + /* reserved bits = 0 */ + if ( coverage & 0xFDF0 ) + return FALSE; + +#ifdef GXV_LOAD_TRACE_VARS + horizontal = FT_BOOL( coverage & 1 ); + minimum = FT_BOOL( ( coverage >> 1 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 ); + override = FT_BOOL( ( coverage >> 3 ) & 1 ); +#endif + + *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 ); + + GXV_TRACE(( "classic Microsoft-dialect: " + "horizontal=%d, minimum=%d, cross-stream=%d, " + "override=%d, format=%d\n", + horizontal, minimum, cross_stream, override, *format )); + + if ( *format == 2 ) + GXV_TRACE(( + "kerning values in Microsoft format 2 subtable are ignored\n" )); + + return TRUE; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MAIN *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static GXV_kern_Dialect + gxv_kern_coverage_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator gxvalid ) + { + GXV_kern_Dialect result = KERN_DIALECT_UNKNOWN; + + + GXV_NAME_ENTER( "validating coverage" ); + + GXV_TRACE(( "interpret coverage 0x%04x by Apple style\n", coverage )); + + if ( KERN_IS_NEW( gxvalid ) ) + { + if ( gxv_kern_coverage_new_apple_validate( coverage, + format, + gxvalid ) ) + { + result = KERN_DIALECT_APPLE; + goto Exit; + } + } + + if ( KERN_IS_CLASSIC( gxvalid ) && KERN_ALLOWS_APPLE( gxvalid ) ) + { + if ( gxv_kern_coverage_classic_apple_validate( coverage, + format, + gxvalid ) ) + { + result = KERN_DIALECT_APPLE; + goto Exit; + } + } + + if ( KERN_IS_CLASSIC( gxvalid ) && KERN_ALLOWS_MS( gxvalid ) ) + { + if ( gxv_kern_coverage_classic_microsoft_validate( coverage, + format, + gxvalid ) ) + { + result = KERN_DIALECT_MS; + goto Exit; + } + } + + GXV_TRACE(( "cannot interpret coverage, broken kern subtable\n" )); + + Exit: + GXV_EXIT; + return result; + } + + + static void + gxv_kern_subtable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; +#ifdef GXV_LOAD_TRACE_VARS + FT_UShort version = 0; /* MS only: subtable version, unused */ +#endif + FT_ULong length; /* MS: 16bit, Apple: 32bit */ + FT_UShort coverage; +#ifdef GXV_LOAD_TRACE_VARS + FT_UShort tupleIndex = 0; /* Apple only */ +#endif + FT_UShort u16[2]; + FT_UShort format = 255; /* subtable format */ + + + GXV_NAME_ENTER( "kern subtable" ); + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + u16[0] = FT_NEXT_USHORT( p ); /* Apple: length_hi MS: version */ + u16[1] = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */ + coverage = FT_NEXT_USHORT( p ); + + switch ( gxv_kern_coverage_validate( coverage, &format, gxvalid ) ) + { + case KERN_DIALECT_MS: +#ifdef GXV_LOAD_TRACE_VARS + version = u16[0]; +#endif + length = u16[1]; +#ifdef GXV_LOAD_TRACE_VARS + tupleIndex = 0; +#endif + GXV_TRACE(( "Subtable version = %d\n", version )); + GXV_TRACE(( "Subtable length = %lu\n", length )); + break; + + case KERN_DIALECT_APPLE: +#ifdef GXV_LOAD_TRACE_VARS + version = 0; +#endif + length = ( (FT_ULong)u16[0] << 16 ) + u16[1]; +#ifdef GXV_LOAD_TRACE_VARS + tupleIndex = 0; +#endif + GXV_TRACE(( "Subtable length = %lu\n", length )); + + if ( KERN_IS_NEW( gxvalid ) ) + { + GXV_LIMIT_CHECK( 2 ); +#ifdef GXV_LOAD_TRACE_VARS + tupleIndex = FT_NEXT_USHORT( p ); +#else + p += 2; +#endif + GXV_TRACE(( "Subtable tupleIndex = %d\n", tupleIndex )); + } + break; + + default: + length = u16[1]; + GXV_TRACE(( "cannot detect subtable dialect, " + "just skip %lu byte\n", length )); + goto Exit; + } + + /* formats 1, 2, 3 require the position of the start of this subtable */ + if ( format == 0 ) + gxv_kern_subtable_fmt0_validate( table, table + length, gxvalid ); + else if ( format == 1 ) + gxv_kern_subtable_fmt1_validate( table, table + length, gxvalid ); + else if ( format == 2 ) + gxv_kern_subtable_fmt2_validate( table, table + length, gxvalid ); + else if ( format == 3 ) + gxv_kern_subtable_fmt3_validate( table, table + length, gxvalid ); + else + FT_INVALID_DATA; + + Exit: + gxvalid->subtable_length = length; + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** kern TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_kern_validate_generic( FT_Bytes table, + FT_Face face, + FT_Bool classic_only, + GXV_kern_Dialect dialect_request, + FT_Validator ftvalid ) + { + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + + GXV_kern_DataRec kernrec; + GXV_kern_Data kern = &kernrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong nTables = 0; + FT_UInt i; + + + gxvalid->root = ftvalid; + gxvalid->table_data = kern; + gxvalid->face = face; + + FT_TRACE3(( "validating `kern' table\n" )); + GXV_INIT; + KERN_DIALECT( gxvalid ) = dialect_request; + + GXV_LIMIT_CHECK( 2 ); + GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p ); + GXV_TRACE(( "version 0x%04x (higher 16bit)\n", + GXV_KERN_DATA( version ) )); + + if ( 0x0001 < GXV_KERN_DATA( version ) ) + FT_INVALID_FORMAT; + else if ( KERN_IS_CLASSIC( gxvalid ) ) + { + GXV_LIMIT_CHECK( 2 ); + nTables = FT_NEXT_USHORT( p ); + } + else if ( KERN_IS_NEW( gxvalid ) ) + { + if ( classic_only ) + FT_INVALID_FORMAT; + + if ( 0x0000 != FT_NEXT_USHORT( p ) ) + FT_INVALID_FORMAT; + + GXV_LIMIT_CHECK( 4 ); + nTables = FT_NEXT_ULONG( p ); + } + + for ( i = 0; i < nTables; i++ ) + { + GXV_TRACE(( "validating subtable %d/%lu\n", i, nTables )); + /* p should be 32bit-aligned? */ + gxv_kern_subtable_validate( p, 0, gxvalid ); + p += gxvalid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + + FT_LOCAL_DEF( void ) + gxv_kern_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + gxv_kern_validate_generic( table, face, 0, KERN_DIALECT_ANY, ftvalid ); + } + + + FT_LOCAL_DEF( void ) + gxv_kern_validate_classic( FT_Bytes table, + FT_Face face, + FT_Int dialect_flags, + FT_Validator ftvalid ) + { + GXV_kern_Dialect dialect_request; + + + dialect_request = (GXV_kern_Dialect)dialect_flags; + gxv_kern_validate_generic( table, face, 1, dialect_request, ftvalid ); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvlcar.c b/external/freetype/src/gxvalid/gxvlcar.c new file mode 100644 index 000000000..5f3bf8907 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvlcar.c @@ -0,0 +1,224 @@ +/**************************************************************************** + * + * gxvlcar.c + * + * TrueTypeGX/AAT lcar table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvlcar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_lcar_DataRec_ + { + FT_UShort format; + + } GXV_lcar_DataRec, *GXV_lcar_Data; + + +#define GXV_LCAR_DATA( FIELD ) GXV_TABLE_DATA( lcar, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_lcar_partial_validate( FT_Short partial, + FT_UShort glyph, + GXV_Validator gxvalid ) + { + GXV_NAME_ENTER( "partial" ); + + if ( GXV_LCAR_DATA( format ) != 1 ) + goto Exit; + + gxv_ctlPoint_validate( glyph, (FT_UShort)partial, gxvalid ); + + Exit: + GXV_EXIT; + } + + + static void + gxv_lcar_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_Bytes p = gxvalid->root->base + value_p->u; + FT_Bytes limit = gxvalid->root->limit; + FT_UShort count; + FT_Short partial; + FT_UShort i; + + + GXV_NAME_ENTER( "element in lookupTable" ); + + GXV_LIMIT_CHECK( 2 ); + count = FT_NEXT_USHORT( p ); + + GXV_LIMIT_CHECK( 2 * count ); + for ( i = 0; i < count; i++ ) + { + partial = FT_NEXT_SHORT( p ); + gxv_lcar_partial_validate( partial, glyph, gxvalid ); + } + + GXV_EXIT; + } + + + /* + +------ lcar --------------------+ + | | + | +===============+ | + | | lookup header | | + | +===============+ | + | | BinSrchHeader | | + | +===============+ | + | | lastGlyph[0] | | + | +---------------+ | + | | firstGlyph[0] | | head of lcar sfnt table + | +---------------+ | + + | | offset[0] | -> | offset [byte] + | +===============+ | + + | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + | +---------------+ | + | | firstGlyph[1] | | + | +---------------+ | + | | offset[1] | | + | +===============+ | + | | + | .... | + | | + | 16bit value array | + | +===============+ | + +------| value | <-------+ + | .... + | + | + | + | + | + +----> lcar values...handled by lcar callback function + */ + + static GXV_LookupValueDesc + gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + FT_UNUSED( lookuptbl_limit ); + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + p = gxvalid->root->base + offset; + limit = gxvalid->root->limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** lcar TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + + GXV_lcar_DataRec lcarrec; + GXV_lcar_Data lcar = &lcarrec; + + FT_Fixed version; + + + gxvalid->root = ftvalid; + gxvalid->table_data = lcar; + gxvalid->face = face; + + FT_TRACE3(( "validating `lcar' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_LONG( p ); + GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p ); + + if ( version != 0x00010000UL) + FT_INVALID_FORMAT; + + if ( GXV_LCAR_DATA( format ) > 1 ) + FT_INVALID_FORMAT; + + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_lcar_LookupValue_validate; + gxvalid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit; + gxv_LookupTable_validate( p, limit, gxvalid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmod.c b/external/freetype/src/gxvalid/gxvmod.c new file mode 100644 index 000000000..0b4115bbc --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmod.c @@ -0,0 +1,288 @@ +/**************************************************************************** + * + * gxvmod.c + * + * FreeType's TrueTypeGX/AAT validation module implementation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include <freetype/tttables.h> +#include <freetype/tttags.h> +#include <freetype/ftgxval.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svgxval.h> + +#include "gxvmod.h" +#include "gxvalid.h" +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmodule + + + static FT_Error + gxv_load_table( FT_Face face, + FT_Tag tag, + FT_Byte* volatile* table, + FT_ULong* table_len ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); + if ( FT_ERR_EQ( error, Table_Missing ) ) + return FT_Err_Ok; + if ( error ) + goto Exit; + + if ( FT_QALLOC( *table, *table_len ) ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); + + Exit: + return error; + } + + +#define GXV_TABLE_DECL( _sfnt ) \ + FT_Byte* volatile _sfnt = NULL; \ + FT_ULong len_ ## _sfnt = 0 + +#define GXV_TABLE_LOAD( _sfnt ) \ + FT_BEGIN_STMNT \ + if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \ + ( gx_flags & FT_VALIDATE_ ## _sfnt ) ) \ + { \ + error = gxv_load_table( face, TTAG_ ## _sfnt, \ + &_sfnt, &len_ ## _sfnt ); \ + if ( error ) \ + goto Exit; \ + } \ + FT_END_STMNT + +#define GXV_TABLE_VALIDATE( _sfnt ) \ + FT_BEGIN_STMNT \ + if ( _sfnt ) \ + { \ + ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \ + FT_VALIDATE_DEFAULT ); \ + if ( ft_setjmp( valid.jump_buffer ) == 0 ) \ + gxv_ ## _sfnt ## _validate( _sfnt, face, &valid ); \ + error = valid.error; \ + if ( error ) \ + goto Exit; \ + } \ + FT_END_STMNT + +#define GXV_TABLE_SET( _sfnt ) \ + if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) \ + tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt + + + static FT_Error + gxv_validate( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_count ) + { + FT_Memory volatile memory = FT_FACE_MEMORY( face ); + + FT_Error error = FT_Err_Ok; + FT_ValidatorRec volatile valid; + + FT_UInt i; + + + GXV_TABLE_DECL( feat ); + GXV_TABLE_DECL( bsln ); + GXV_TABLE_DECL( trak ); + GXV_TABLE_DECL( just ); + GXV_TABLE_DECL( mort ); + GXV_TABLE_DECL( morx ); + GXV_TABLE_DECL( kern ); + GXV_TABLE_DECL( opbd ); + GXV_TABLE_DECL( prop ); + GXV_TABLE_DECL( lcar ); + + for ( i = 0; i < table_count; i++ ) + tables[i] = 0; + + /* load tables */ + GXV_TABLE_LOAD( feat ); + GXV_TABLE_LOAD( bsln ); + GXV_TABLE_LOAD( trak ); + GXV_TABLE_LOAD( just ); + GXV_TABLE_LOAD( mort ); + GXV_TABLE_LOAD( morx ); + GXV_TABLE_LOAD( kern ); + GXV_TABLE_LOAD( opbd ); + GXV_TABLE_LOAD( prop ); + GXV_TABLE_LOAD( lcar ); + + /* validate tables */ + GXV_TABLE_VALIDATE( feat ); + GXV_TABLE_VALIDATE( bsln ); + GXV_TABLE_VALIDATE( trak ); + GXV_TABLE_VALIDATE( just ); + GXV_TABLE_VALIDATE( mort ); + GXV_TABLE_VALIDATE( morx ); + GXV_TABLE_VALIDATE( kern ); + GXV_TABLE_VALIDATE( opbd ); + GXV_TABLE_VALIDATE( prop ); + GXV_TABLE_VALIDATE( lcar ); + + /* Set results */ + GXV_TABLE_SET( feat ); + GXV_TABLE_SET( mort ); + GXV_TABLE_SET( morx ); + GXV_TABLE_SET( bsln ); + GXV_TABLE_SET( just ); + GXV_TABLE_SET( kern ); + GXV_TABLE_SET( opbd ); + GXV_TABLE_SET( trak ); + GXV_TABLE_SET( prop ); + GXV_TABLE_SET( lcar ); + + Exit: + if ( error ) + { + FT_FREE( feat ); + FT_FREE( bsln ); + FT_FREE( trak ); + FT_FREE( just ); + FT_FREE( mort ); + FT_FREE( morx ); + FT_FREE( kern ); + FT_FREE( opbd ); + FT_FREE( prop ); + FT_FREE( lcar ); + } + + return error; + } + + + static FT_Error + classic_kern_validate( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes* ckern_table ) + { + FT_Memory volatile memory = FT_FACE_MEMORY( face ); + + FT_Byte* volatile ckern = NULL; + FT_ULong len_ckern = 0; + + /* without volatile on `error' GCC 4.1.1. emits: */ + /* warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */ + /* this warning seems spurious but --- */ + FT_Error volatile error; + FT_ValidatorRec volatile valid; + + + *ckern_table = NULL; + + error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern ); + if ( error ) + goto Exit; + + if ( ckern ) + { + ft_validator_init( &valid, ckern, ckern + len_ckern, + FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + gxv_kern_validate_classic( ckern, face, + ckern_flags & FT_VALIDATE_CKERN, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + *ckern_table = ckern; + + Exit: + if ( error ) + FT_FREE( ckern ); + + return error; + } + + + static + const FT_Service_GXvalidateRec gxvalid_interface = + { + gxv_validate /* validate */ + }; + + + static + const FT_Service_CKERNvalidateRec ckernvalid_interface = + { + classic_kern_validate /* validate */ + }; + + + static + const FT_ServiceDescRec gxvalid_services[] = + { + { FT_SERVICE_ID_GX_VALIDATE, &gxvalid_interface }, + { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + gxvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( gxvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class gxv_module_class = + { + 0, + sizeof ( FT_ModuleRec ), + "gxvalid", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) gxvalid_get_service /* get_interface */ + }; + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmod.h b/external/freetype/src/gxvalid/gxvmod.h new file mode 100644 index 000000000..db3d1d9f5 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmod.h @@ -0,0 +1,46 @@ +/**************************************************************************** + * + * gxvmod.h + * + * FreeType's TrueTypeGX/AAT validation module implementation + * (specification). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef GXVMOD_H_ +#define GXVMOD_H_ + +#include <freetype/ftmodapi.h> + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) gxv_module_class; + + +FT_END_HEADER + +#endif /* GXVMOD_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort.c b/external/freetype/src/gxvalid/gxvmort.c new file mode 100644 index 000000000..7032d6349 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort.c @@ -0,0 +1,301 @@ +/**************************************************************************** + * + * gxvmort.c + * + * TrueTypeGX/AAT mort table validation (body). + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmort.h" +#include "gxvfeat.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmort + + + static void + gxv_mort_feature_validate( GXV_mort_feature f, + GXV_Validator gxvalid ) + { + if ( f->featureType >= gxv_feat_registry_length ) + { + GXV_TRACE(( "featureType %d is out of registered range, " + "setting %d is unchecked\n", + f->featureType, f->featureSetting )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + else if ( !gxv_feat_registry[f->featureType].existence ) + { + GXV_TRACE(( "featureType %d is within registered area " + "but undefined, setting %d is unchecked\n", + f->featureType, f->featureSetting )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + else + { + FT_Byte nSettings_max; + + + /* nSettings in gxvfeat.c is halved for exclusive on/off settings */ + nSettings_max = gxv_feat_registry[f->featureType].nSettings; + if ( gxv_feat_registry[f->featureType].exclusive ) + nSettings_max = (FT_Byte)( 2 * nSettings_max ); + + GXV_TRACE(( "featureType %d is registered", f->featureType )); + GXV_TRACE(( "setting %d", f->featureSetting )); + + if ( f->featureSetting > nSettings_max ) + { + GXV_TRACE(( "out of defined range %d", nSettings_max )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + GXV_TRACE(( "\n" )); + } + + /* TODO: enableFlags must be unique value in specified chain? */ + } + + + /* + * nFeatureFlags is typed to FT_ULong to accept that in + * mort (typed FT_UShort) and morx (typed FT_ULong). + */ + FT_LOCAL_DEF( void ) + gxv_mort_featurearray_validate( FT_Bytes table, + FT_Bytes limit, + FT_ULong nFeatureFlags, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_ULong i; + + GXV_mort_featureRec f = GXV_MORT_FEATURE_OFF; + + + GXV_NAME_ENTER( "mort feature list" ); + for ( i = 0; i < nFeatureFlags; i++ ) + { + GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 ); + f.featureType = FT_NEXT_USHORT( p ); + f.featureSetting = FT_NEXT_USHORT( p ); + f.enableFlags = FT_NEXT_ULONG( p ); + f.disableFlags = FT_NEXT_ULONG( p ); + + gxv_mort_feature_validate( &f, gxvalid ); + } + + if ( !IS_GXV_MORT_FEATURE_OFF( f ) ) + FT_INVALID_DATA; + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator gxvalid ) + { + FT_UNUSED( gxvalid ); + FT_UNUSED( coverage ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( coverage & 0x8000U ) + GXV_TRACE(( " this subtable is for vertical text only\n" )); + else + GXV_TRACE(( " this subtable is for horizontal text only\n" )); + + if ( coverage & 0x4000 ) + GXV_TRACE(( " this subtable is applied to glyph array " + "in descending order\n" )); + else + GXV_TRACE(( " this subtable is applied to glyph array " + "in ascending order\n" )); + + if ( coverage & 0x2000 ) + GXV_TRACE(( " this subtable is forcibly applied to " + "vertical/horizontal text\n" )); + + if ( coverage & 0x1FF8 ) + GXV_TRACE(( " coverage has non-zero bits in reserved area\n" )); +#endif + } + + + static void + gxv_mort_subtables_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nSubtables, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_mort_subtable_type0_validate, /* 0 */ + gxv_mort_subtable_type1_validate, /* 1 */ + gxv_mort_subtable_type2_validate, /* 2 */ + NULL, /* 3 */ + gxv_mort_subtable_type4_validate, /* 4 */ + gxv_mort_subtable_type5_validate, /* 5 */ + + }; + + FT_UShort i; + + + GXV_NAME_ENTER( "subtables in a chain" ); + + for ( i = 0; i < nSubtables; i++ ) + { + GXV_Validate_Func func; + + FT_UShort length; + FT_UShort coverage; +#ifdef GXV_LOAD_UNUSED_VARS + FT_ULong subFeatureFlags; +#endif + FT_UInt type; + FT_UInt rest; + + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); +#ifdef GXV_LOAD_UNUSED_VARS + subFeatureFlags = FT_NEXT_ULONG( p ); +#else + p += 4; +#endif + + GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", + i + 1, nSubtables, length )); + type = coverage & 0x0007; + rest = length - ( 2 + 2 + 4 ); + + GXV_LIMIT_CHECK( rest ); + gxv_mort_coverage_validate( coverage, gxvalid ); + + if ( type > 5 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[type]; + if ( !func ) + GXV_TRACE(( "morx type %d is reserved\n", type )); + + func( p, p + rest, gxvalid ); + + p += rest; + /* TODO: validate subFeatureFlags */ + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static void + gxv_mort_chain_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; +#ifdef GXV_LOAD_UNUSED_VARS + FT_ULong defaultFlags; +#endif + FT_ULong chainLength; + FT_UShort nFeatureFlags; + FT_UShort nSubtables; + + + GXV_NAME_ENTER( "mort chain header" ); + + GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); +#ifdef GXV_LOAD_UNUSED_VARS + defaultFlags = FT_NEXT_ULONG( p ); +#else + p += 4; +#endif + chainLength = FT_NEXT_ULONG( p ); + nFeatureFlags = FT_NEXT_USHORT( p ); + nSubtables = FT_NEXT_USHORT( p ); + + gxv_mort_featurearray_validate( p, table + chainLength, + nFeatureFlags, gxvalid ); + p += gxvalid->subtable_length; + gxv_mort_subtables_validate( p, table + chainLength, nSubtables, gxvalid ); + gxvalid->subtable_length = chainLength; + + /* TODO: validate defaultFlags */ + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_ULong version; + FT_ULong nChains; + FT_ULong i; + + + gxvalid->root = ftvalid; + gxvalid->face = face; + limit = gxvalid->root->limit; + + FT_TRACE3(( "validating `mort' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 4 ); + version = FT_NEXT_ULONG( p ); + nChains = FT_NEXT_ULONG( p ); + + if (version != 0x00010000UL) + FT_INVALID_FORMAT; + + for ( i = 0; i < nChains; i++ ) + { + GXV_TRACE(( "validating chain %lu/%lu\n", i + 1, nChains )); + GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); + gxv_mort_chain_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort.h b/external/freetype/src/gxvalid/gxvmort.h new file mode 100644 index 000000000..5c819bdbc --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort.h @@ -0,0 +1,99 @@ +/**************************************************************************** + * + * gxvmort.h + * + * TrueTypeGX/AAT common definition for mort table (specification). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef GXVMORT_H_ +#define GXVMORT_H_ + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include <freetype/ftsnames.h> + + +FT_BEGIN_HEADER + + + typedef struct GXV_mort_featureRec_ + { + FT_UShort featureType; + FT_UShort featureSetting; + FT_ULong enableFlags; + FT_ULong disableFlags; + + } GXV_mort_featureRec, *GXV_mort_feature; + +#define GXV_MORT_FEATURE_OFF {0, 1, 0x00000000UL, 0x00000000UL} + +#define IS_GXV_MORT_FEATURE_OFF( f ) \ + ( (f).featureType == 0 || \ + (f).featureSetting == 1 || \ + (f).enableFlags == 0x00000000UL || \ + (f).disableFlags == 0x00000000UL ) + + + FT_LOCAL( void ) + gxv_mort_featurearray_validate( FT_Bytes table, + FT_Bytes limit, + FT_ULong nFeatureFlags, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + +FT_END_HEADER + +#endif /* GXVMORT_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort0.c b/external/freetype/src/gxvalid/gxvmort0.c new file mode 100644 index 000000000..24e70a0da --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort0.c @@ -0,0 +1,152 @@ +/**************************************************************************** + * + * gxvmort0.c + * + * TrueTypeGX/AAT mort table validation + * body for type0 (Indic Script Rearrangement) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmort.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmort + + + static const char* GXV_Mort_IndicScript_Msg[] = + { + "no change", + "Ax => xA", + "xD => Dx", + "AxD => DxA", + "ABx => xAB", + "ABx => xBA", + "xCD => CDx", + "xCD => DCx", + "AxCD => CDxA", + "AxCD => DCxA", + "ABxD => DxAB", + "ABxD => DxBA", + "ABxCD => CDxAB", + "ABxCD => CDxBA", + "ABxCD => DCxAB", + "ABxCD => DCxBA", + + }; + + + static void + gxv_mort_subtable_type0_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_UShort markFirst; + FT_UShort dontAdvance; + FT_UShort markLast; + FT_UShort reserved; + FT_UShort verb = 0; + + FT_UNUSED( state ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */ + FT_UNUSED( glyphOffset_p ); /* case */ + + + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); + + GXV_TRACE(( " IndicScript MorphRule for glyphOffset 0x%04x", + glyphOffset_p->u )); + GXV_TRACE(( " markFirst=%01d", markFirst )); + GXV_TRACE(( " dontAdvance=%01d", dontAdvance )); + GXV_TRACE(( " markLast=%01d", markLast )); + GXV_TRACE(( " %02d", verb )); + GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] )); + + if ( markFirst > 0 && markLast > 0 ) + { + GXV_TRACE(( " [odd] a glyph is marked as the first and last" + " in Indic rearrangement\n" )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + + if ( markFirst > 0 && dontAdvance > 0 ) + { + GXV_TRACE(( " [odd] the first glyph is marked as dontAdvance" + " in Indic rearrangement\n" )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + else + GXV_TRACE(( "\n" )); + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( + "mort chain subtable type0 (Indic-Script Rearrangement)" ); + + GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); + + gxvalid->statetable.optdata = NULL; + gxvalid->statetable.optdata_load_func = NULL; + gxvalid->statetable.subtable_setup_func = NULL; + gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + gxvalid->statetable.entry_validate_func = + gxv_mort_subtable_type0_entry_validate; + + gxv_StateTable_validate( p, limit, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort1.c b/external/freetype/src/gxvalid/gxvmort1.c new file mode 100644 index 000000000..ea5591f98 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort1.c @@ -0,0 +1,260 @@ +/**************************************************************************** + * + * gxvmort1.c + * + * TrueTypeGX/AAT mort table validation + * body for type1 (Contextual Substitution) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmort.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmort + + + typedef struct GXV_mort_subtable_type1_StateOptRec_ + { + FT_UShort substitutionTable; + FT_UShort substitutionTable_length; + + } GXV_mort_subtable_type1_StateOptRec, + *GXV_mort_subtable_type1_StateOptRecData; + +#define GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 ) + + + static void + gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type1_StateOptRecData optdata = + (GXV_mort_subtable_type1_StateOptRecData)gxvalid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->substitutionTable = FT_NEXT_USHORT( p ); + } + + + static void + gxv_mort_subtable_type1_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_UShort o[4]; + FT_UShort *l[4]; + FT_UShort buff[5]; + + GXV_mort_subtable_type1_StateOptRecData optdata = + (GXV_mort_subtable_type1_StateOptRecData)gxvalid->statetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->substitutionTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &( optdata->substitutionTable_length ); + + gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, gxvalid ); + } + + + static void + gxv_mort_subtable_type1_offset_to_subst_validate( + FT_Short wordOffset, + const FT_String* tag, + FT_Byte state, + GXV_Validator gxvalid ) + { + FT_UShort substTable; + FT_UShort substTable_limit; + + FT_UNUSED( tag ); + FT_UNUSED( state ); + + + substTable = + ((GXV_mort_subtable_type1_StateOptRec *) + (gxvalid->statetable.optdata))->substitutionTable; + substTable_limit = + (FT_UShort)( substTable + + ((GXV_mort_subtable_type1_StateOptRec *) + (gxvalid->statetable.optdata))->substitutionTable_length ); + + gxvalid->min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 ); + gxvalid->max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 ); + gxvalid->max_gid = (FT_UShort)( FT_MAX( gxvalid->max_gid, + gxvalid->face->num_glyphs ) ); + + /* XXX: check range? */ + + /* TODO: min_gid & max_gid comparison with ClassTable contents */ + } + + + static void + gxv_mort_subtable_type1_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort setMark; + FT_UShort dontAdvance; +#endif + FT_UShort reserved; + FT_Short markOffset; + FT_Short currentOffset; + + FT_UNUSED( table ); + FT_UNUSED( limit ); + + +#ifdef GXV_LOAD_UNUSED_VARS + setMark = (FT_UShort)( flags >> 15 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); +#endif + reserved = (FT_UShort)( flags & 0x3FFF ); + + markOffset = (FT_Short)( glyphOffset_p->ul >> 16 ); + currentOffset = (FT_Short)( glyphOffset_p->ul ); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + + gxv_mort_subtable_type1_offset_to_subst_validate( markOffset, + "markOffset", + state, + gxvalid ); + + gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset, + "currentOffset", + state, + gxvalid ); + } + + + static void + gxv_mort_subtable_type1_substTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort num_gids = (FT_UShort)( + ((GXV_mort_subtable_type1_StateOptRec *) + (gxvalid->statetable.optdata))->substitutionTable_length / 2 ); + FT_UShort i; + + + GXV_NAME_ENTER( "validating contents of substitutionTable" ); + for ( i = 0; i < num_gids; i++ ) + { + FT_UShort dst_gid; + + + GXV_LIMIT_CHECK( 2 ); + dst_gid = FT_NEXT_USHORT( p ); + + if ( dst_gid >= 0xFFFFU ) + continue; + + if ( dst_gid < gxvalid->min_gid || gxvalid->max_gid < dst_gid ) + { + GXV_TRACE(( "substTable include a strange gid[%d]=%d >" + " out of define range (%d..%d)\n", + i, dst_gid, gxvalid->min_gid, gxvalid->max_gid )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + } + + GXV_EXIT; + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, and entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "mort chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE ); + + gxvalid->statetable.optdata = + &st_rec; + gxvalid->statetable.optdata_load_func = + gxv_mort_subtable_type1_substitutionTable_load; + gxvalid->statetable.subtable_setup_func = + gxv_mort_subtable_type1_subtable_setup; + gxvalid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + gxvalid->statetable.entry_validate_func = + + gxv_mort_subtable_type1_entry_validate; + gxv_StateTable_validate( p, limit, gxvalid ); + + gxv_mort_subtable_type1_substTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort2.c b/external/freetype/src/gxvalid/gxvmort2.c new file mode 100644 index 000000000..50644f06a --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort2.c @@ -0,0 +1,312 @@ +/**************************************************************************** + * + * gxvmort2.c + * + * TrueTypeGX/AAT mort table validation + * body for type2 (Ligature Substitution) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmort.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmort + + + typedef struct GXV_mort_subtable_type2_StateOptRec_ + { + FT_UShort ligActionTable; + FT_UShort componentTable; + FT_UShort ligatureTable; + FT_UShort ligActionTable_length; + FT_UShort componentTable_length; + FT_UShort ligatureTable_length; + + } GXV_mort_subtable_type2_StateOptRec, + *GXV_mort_subtable_type2_StateOptRecData; + +#define GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 + 2 + 2 ) + + + static void + gxv_mort_subtable_type2_opttable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + optdata->ligActionTable = FT_NEXT_USHORT( p ); + optdata->componentTable = FT_NEXT_USHORT( p ); + optdata->ligatureTable = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "offset to ligActionTable=0x%04x\n", + optdata->ligActionTable )); + GXV_TRACE(( "offset to componentTable=0x%04x\n", + optdata->componentTable )); + GXV_TRACE(( "offset to ligatureTable=0x%04x\n", + optdata->ligatureTable )); + } + + + static void + gxv_mort_subtable_type2_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort *classTable_length_p, + FT_UShort *stateArray_length_p, + FT_UShort *entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_UShort o[6]; + FT_UShort *l[6]; + FT_UShort buff[7]; + + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; + + + GXV_NAME_ENTER( "subtable boundaries setup" ); + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->ligActionTable; + o[4] = optdata->componentTable; + o[5] = optdata->ligatureTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->ligActionTable_length); + l[4] = &(optdata->componentTable_length); + l[5] = &(optdata->ligatureTable_length); + + gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, gxvalid ); + + GXV_TRACE(( "classTable: offset=0x%04x length=0x%04x\n", + classTable, *classTable_length_p )); + GXV_TRACE(( "stateArray: offset=0x%04x length=0x%04x\n", + stateArray, *stateArray_length_p )); + GXV_TRACE(( "entryTable: offset=0x%04x length=0x%04x\n", + entryTable, *entryTable_length_p )); + GXV_TRACE(( "ligActionTable: offset=0x%04x length=0x%04x\n", + optdata->ligActionTable, + optdata->ligActionTable_length )); + GXV_TRACE(( "componentTable: offset=0x%04x length=0x%04x\n", + optdata->componentTable, + optdata->componentTable_length )); + GXV_TRACE(( "ligatureTable: offset=0x%04x length=0x%04x\n", + optdata->ligatureTable, + optdata->ligatureTable_length )); + + GXV_EXIT; + } + + + static void + gxv_mort_subtable_type2_ligActionOffset_validate( + FT_Bytes table, + FT_UShort ligActionOffset, + GXV_Validator gxvalid ) + { + /* access ligActionTable */ + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; + + FT_Bytes lat_base = table + optdata->ligActionTable; + FT_Bytes p = table + ligActionOffset; + FT_Bytes lat_limit = lat_base + optdata->ligActionTable; + + + GXV_32BIT_ALIGNMENT_VALIDATE( ligActionOffset ); + if ( p < lat_base ) + { + GXV_TRACE(( "too short offset 0x%04x: p < lat_base (%ld byte rewind)\n", + ligActionOffset, lat_base - p )); + + /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + else if ( lat_limit < p ) + { + GXV_TRACE(( "too large offset 0x%04x: lat_limit < p (%ld byte overrun)\n", + ligActionOffset, p - lat_limit )); + + /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + else + { + /* validate entry in ligActionTable */ + FT_ULong lig_action; +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort last; + FT_UShort store; +#endif + FT_ULong offset; + + + lig_action = FT_NEXT_ULONG( p ); +#ifdef GXV_LOAD_UNUSED_VARS + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); +#endif + + /* Apple spec defines this offset as a word offset */ + offset = lig_action & 0x3FFFFFFFUL; + if ( offset * 2 < optdata->ligatureTable ) + { + GXV_TRACE(( "too short offset 0x%08lx:" + " 2 x offset < ligatureTable (%lu byte rewind)\n", + offset, optdata->ligatureTable - offset * 2 )); + + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } else if ( offset * 2 > + optdata->ligatureTable + optdata->ligatureTable_length ) + { + GXV_TRACE(( "too long offset 0x%08lx:" + " 2 x offset > ligatureTable + ligatureTable_length" + " (%lu byte overrun)\n", + offset, + optdata->ligatureTable + optdata->ligatureTable_length + - offset * 2 )); + + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + } + } + + + static void + gxv_mort_subtable_type2_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort setComponent; + FT_UShort dontAdvance; +#endif + FT_UShort offset; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + FT_UNUSED( limit ); + + +#ifdef GXV_LOAD_UNUSED_VARS + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); +#endif + + offset = (FT_UShort)( flags & 0x3FFFU ); + + if ( 0 < offset ) + gxv_mort_subtable_type2_ligActionOffset_validate( table, offset, + gxvalid ); + } + + + static void + gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes table, + GXV_Validator gxvalid ) + { + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata; + + FT_Bytes p = table + optdata->ligatureTable; + FT_Bytes limit = table + optdata->ligatureTable + + optdata->ligatureTable_length; + + + GXV_NAME_ENTER( "mort chain subtable type2 - substitutionTable" ); + if ( 0 != optdata->ligatureTable ) + { + /* Apple does not give specification of ligatureTable format */ + while ( p < limit ) + { + FT_UShort lig_gid; + + + GXV_LIMIT_CHECK( 2 ); + lig_gid = FT_NEXT_USHORT( p ); + + if ( gxvalid->face->num_glyphs < lig_gid ) + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + } + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type2_StateOptRec lig_rec; + + + GXV_NAME_ENTER( "mort chain subtable type2 (Ligature Substitution)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE ); + + gxvalid->statetable.optdata = + &lig_rec; + gxvalid->statetable.optdata_load_func = + gxv_mort_subtable_type2_opttable_load; + gxvalid->statetable.subtable_setup_func = + gxv_mort_subtable_type2_subtable_setup; + gxvalid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_NONE; + gxvalid->statetable.entry_validate_func = + gxv_mort_subtable_type2_entry_validate; + + gxv_StateTable_validate( p, limit, gxvalid ); + + p += gxvalid->subtable_length; + gxv_mort_subtable_type2_ligatureTable_validate( table, gxvalid ); + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort4.c b/external/freetype/src/gxvalid/gxvmort4.c new file mode 100644 index 000000000..0641b1133 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort4.c @@ -0,0 +1,126 @@ +/**************************************************************************** + * + * gxvmort4.c + * + * TrueTypeGX/AAT mort table validation + * body for type4 (Non-Contextual Glyph Substitution) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmort.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmort + + + static void + gxv_mort_subtable_type4_lookupval_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_UNUSED( glyph ); + + gxv_glyphid_validate( value_p->u, gxvalid ); + } + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 16bit value array | + +===============+ | + | value | <-------+ + .... + */ + + static GXV_LookupValueDesc + gxv_mort_subtable_type4_lookupfmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = gxvalid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "mort chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate; + gxvalid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit; + + gxv_LookupTable_validate( p, limit, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmort5.c b/external/freetype/src/gxvalid/gxvmort5.c new file mode 100644 index 000000000..9225bb0c6 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmort5.c @@ -0,0 +1,234 @@ +/**************************************************************************** + * + * gxvmort5.c + * + * TrueTypeGX/AAT mort table validation + * body for type5 (Contextual Glyph Insertion) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmort.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmort + + + /* + * mort subtable type5 (Contextual Glyph Insertion) + * has the format of StateTable with insertion-glyph-list, + * but without name. The offset is given by glyphOffset in + * entryTable. There is no table location declaration + * like xxxTable. + */ + + typedef struct GXV_mort_subtable_type5_StateOptRec_ + { + FT_UShort classTable; + FT_UShort stateArray; + FT_UShort entryTable; + +#define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE GXV_STATETABLE_HEADER_SIZE + + FT_UShort* classTable_length_p; + FT_UShort* stateArray_length_p; + FT_UShort* entryTable_length_p; + + } GXV_mort_subtable_type5_StateOptRec, + *GXV_mort_subtable_type5_StateOptRecData; + + + static void + gxv_mort_subtable_type5_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator gxvalid ) + { + GXV_mort_subtable_type5_StateOptRecData optdata = + (GXV_mort_subtable_type5_StateOptRecData)gxvalid->statetable.optdata; + + + gxv_StateTable_subtable_setup( table_size, + classTable, + stateArray, + entryTable, + classTable_length_p, + stateArray_length_p, + entryTable_length_p, + gxvalid ); + + optdata->classTable = classTable; + optdata->stateArray = stateArray; + optdata->entryTable = entryTable; + + optdata->classTable_length_p = classTable_length_p; + optdata->stateArray_length_p = stateArray_length_p; + optdata->entryTable_length_p = entryTable_length_p; + } + + + static void + gxv_mort_subtable_type5_InsertList_validate( FT_UShort offset, + FT_UShort count, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + /* + * We don't know the range of insertion-glyph-list. + * Set range by whole of state table. + */ + FT_Bytes p = table + offset; + + GXV_mort_subtable_type5_StateOptRecData optdata = + (GXV_mort_subtable_type5_StateOptRecData)gxvalid->statetable.optdata; + + if ( optdata->classTable < offset && + offset < optdata->classTable + *(optdata->classTable_length_p) ) + GXV_TRACE(( " offset runs into ClassTable" )); + if ( optdata->stateArray < offset && + offset < optdata->stateArray + *(optdata->stateArray_length_p) ) + GXV_TRACE(( " offset runs into StateArray" )); + if ( optdata->entryTable < offset && + offset < optdata->entryTable + *(optdata->entryTable_length_p) ) + GXV_TRACE(( " offset runs into EntryTable" )); + +#ifndef GXV_LOAD_TRACE_VARS + GXV_LIMIT_CHECK( count * 2 ); +#else + while ( p < table + offset + ( count * 2 ) ) + { + FT_UShort insert_glyphID; + + + GXV_LIMIT_CHECK( 2 ); + insert_glyphID = FT_NEXT_USHORT( p ); + GXV_TRACE(( " 0x%04x", insert_glyphID )); + } + GXV_TRACE(( "\n" )); +#endif + } + + + static void + gxv_mort_subtable_type5_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_Bool setMark; + FT_Bool dontAdvance; + FT_Bool currentIsKashidaLike; + FT_Bool markedIsKashidaLike; + FT_Bool currentInsertBefore; + FT_Bool markedInsertBefore; +#endif + FT_Byte currentInsertCount; + FT_Byte markedInsertCount; + FT_UShort currentInsertList; + FT_UShort markedInsertList; + + FT_UNUSED( state ); + + +#ifdef GXV_LOAD_UNUSED_VARS + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); +#endif + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_UShort)( glyphOffset->ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset->ul ); + + if ( 0 != currentInsertList && 0 != currentInsertCount ) + { + gxv_mort_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, + limit, + gxvalid ); + } + + if ( 0 != markedInsertList && 0 != markedInsertCount ) + { + gxv_mort_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, + limit, + gxvalid ); + } + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type5_StateOptRec et_rec; + GXV_mort_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "mort chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE ); + + gxvalid->statetable.optdata = + et; + gxvalid->statetable.optdata_load_func = + NULL; + gxvalid->statetable.subtable_setup_func = + gxv_mort_subtable_type5_subtable_setup; + gxvalid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + gxvalid->statetable.entry_validate_func = + gxv_mort_subtable_type5_entry_validate; + + gxv_StateTable_validate( p, limit, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx.c b/external/freetype/src/gxvalid/gxvmorx.c new file mode 100644 index 000000000..931bf006b --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx.c @@ -0,0 +1,199 @@ +/**************************************************************************** + * + * gxvmorx.c + * + * TrueTypeGX/AAT morx table validation (body). + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmorx.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmorx + + + static void + gxv_morx_subtables_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nSubtables, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_morx_subtable_type0_validate, /* 0 */ + gxv_morx_subtable_type1_validate, /* 1 */ + gxv_morx_subtable_type2_validate, /* 2 */ + NULL, /* 3 */ + gxv_morx_subtable_type4_validate, /* 4 */ + gxv_morx_subtable_type5_validate, /* 5 */ + + }; + + FT_UShort i; + + + GXV_NAME_ENTER( "subtables in a chain" ); + + for ( i = 0; i < nSubtables; i++ ) + { + GXV_Validate_Func func; + + FT_ULong length; + FT_ULong coverage; +#ifdef GXV_LOAD_UNUSED_VARS + FT_ULong subFeatureFlags; +#endif + FT_ULong type; + FT_ULong rest; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 ); + length = FT_NEXT_ULONG( p ); + coverage = FT_NEXT_ULONG( p ); +#ifdef GXV_LOAD_UNUSED_VARS + subFeatureFlags = FT_NEXT_ULONG( p ); +#else + p += 4; +#endif + + GXV_TRACE(( "validating chain subtable %d/%d (%lu bytes)\n", + i + 1, nSubtables, length )); + + type = coverage & 0x0007; + rest = length - ( 4 + 4 + 4 ); + GXV_LIMIT_CHECK( rest ); + + /* morx coverage consists of mort_coverage & 16bit padding */ + gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ), + gxvalid ); + if ( type > 5 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[type]; + if ( !func ) + GXV_TRACE(( "morx type %lu is reserved\n", type )); + + func( p, p + rest, gxvalid ); + + /* TODO: subFeatureFlags should be unique in a table? */ + p += rest; + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + + GXV_EXIT; + } + + + static void + gxv_morx_chain_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; +#ifdef GXV_LOAD_UNUSED_VARS + FT_ULong defaultFlags; +#endif + FT_ULong chainLength; + FT_ULong nFeatureFlags; + FT_ULong nSubtables; + + + GXV_NAME_ENTER( "morx chain header" ); + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); +#ifdef GXV_LOAD_UNUSED_VARS + defaultFlags = FT_NEXT_ULONG( p ); +#else + p += 4; +#endif + chainLength = FT_NEXT_ULONG( p ); + nFeatureFlags = FT_NEXT_ULONG( p ); + nSubtables = FT_NEXT_ULONG( p ); + + /* feature-array of morx is same with that of mort */ + gxv_mort_featurearray_validate( p, limit, nFeatureFlags, gxvalid ); + p += gxvalid->subtable_length; + + if ( nSubtables >= 0x10000L ) + FT_INVALID_DATA; + + gxv_morx_subtables_validate( p, table + chainLength, + (FT_UShort)nSubtables, gxvalid ); + + gxvalid->subtable_length = chainLength; + + /* TODO: defaultFlags should be compared with the flags in tables */ + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_morx_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_ULong version; + FT_ULong nChains; + FT_ULong i; + + + gxvalid->root = ftvalid; + gxvalid->face = face; + + FT_TRACE3(( "validating `morx' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 4 ); + version = FT_NEXT_ULONG( p ); + nChains = FT_NEXT_ULONG( p ); + + if ( version != 0x00020000UL ) + FT_INVALID_FORMAT; + + for ( i = 0; i < nChains; i++ ) + { + GXV_TRACE(( "validating chain %lu/%lu\n", i + 1, nChains )); + GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); + gxv_morx_chain_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx.h b/external/freetype/src/gxvalid/gxvmorx.h new file mode 100644 index 000000000..27572553d --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx.h @@ -0,0 +1,73 @@ +/**************************************************************************** + * + * gxvmorx.h + * + * TrueTypeGX/AAT common definition for morx table (specification). + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#ifndef GXVMORX_H_ +#define GXVMORX_H_ + + +#include "gxvalid.h" +#include "gxvcommn.h" +#include "gxvmort.h" + +#include <freetype/ftsnames.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + gxv_morx_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ); + + +FT_END_HEADER + +#endif /* GXVMORX_H_ */ + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx0.c b/external/freetype/src/gxvalid/gxvmorx0.c new file mode 100644 index 000000000..73523f363 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx0.c @@ -0,0 +1,112 @@ +/**************************************************************************** + * + * gxvmorx0.c + * + * TrueTypeGX/AAT morx table validation + * body for type0 (Indic Script Rearrangement) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmorx.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmorx + + + static void + gxv_morx_subtable_type0_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_XStateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort markFirst; + FT_UShort dontAdvance; + FT_UShort markLast; +#endif + FT_UShort reserved; +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort verb; +#endif + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + +#ifdef GXV_LOAD_UNUSED_VARS + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); +#endif + + reserved = (FT_UShort)( flags & 0x1FF0 ); +#ifdef GXV_LOAD_UNUSED_VARS + verb = (FT_UShort)( flags & 0x000F ); +#endif + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + FT_INVALID_DATA; + } + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( + "morx chain subtable type0 (Indic-Script Rearrangement)" ); + + GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); + + gxvalid->xstatetable.optdata = NULL; + gxvalid->xstatetable.optdata_load_func = NULL; + gxvalid->xstatetable.subtable_setup_func = NULL; + gxvalid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + gxvalid->xstatetable.entry_validate_func = + gxv_morx_subtable_type0_entry_validate; + + gxv_XStateTable_validate( p, limit, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx1.c b/external/freetype/src/gxvalid/gxvmorx1.c new file mode 100644 index 000000000..71a201880 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx1.c @@ -0,0 +1,278 @@ +/**************************************************************************** + * + * gxvmorx1.c + * + * TrueTypeGX/AAT morx table validation + * body for type1 (Contextual Substitution) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmorx.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmorx + + + typedef struct GXV_morx_subtable_type1_StateOptRec_ + { + FT_ULong substitutionTable; + FT_ULong substitutionTable_length; + FT_UShort substitutionTable_num_lookupTables; + + } GXV_morx_subtable_type1_StateOptRec, + *GXV_morx_subtable_type1_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 ) + + + static void + gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->substitutionTable = FT_NEXT_USHORT( p ); + } + + + static void + gxv_morx_subtable_type1_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_ULong o[4]; + FT_ULong *l[4]; + FT_ULong buff[5]; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->substitutionTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->substitutionTable_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, gxvalid ); + } + + + static void + gxv_morx_subtable_type1_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_TRACE_VARS + FT_UShort setMark; + FT_UShort dontAdvance; +#endif + FT_UShort reserved; + FT_Short markIndex; + FT_Short currentIndex; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; + + FT_UNUSED( state ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + +#ifdef GXV_LOAD_TRACE_VARS + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); +#endif + + reserved = (FT_UShort)( flags & 0x3FFF ); + + markIndex = (FT_Short)( glyphOffset_p->ul >> 16 ); + currentIndex = (FT_Short)( glyphOffset_p->ul ); + + GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n", + setMark, dontAdvance )); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA ); + } + + GXV_TRACE(( "markIndex = %d, currentIndex = %d\n", + markIndex, currentIndex )); + + if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 ) + optdata->substitutionTable_num_lookupTables = + (FT_UShort)( markIndex + 1 ); + + if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 ) + optdata->substitutionTable_num_lookupTables = + (FT_UShort)( currentIndex + 1 ); + } + + + static void + gxv_morx_subtable_type1_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + FT_UNUSED( glyph ); /* for the non-debugging case */ + + GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value_p->u )); + + if ( value_p->u > gxvalid->face->num_glyphs ) + FT_INVALID_GLYPH_ID; + } + + + static GXV_LookupValueDesc + gxv_morx_subtable_type1_LookupFmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = gxvalid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /* + * TODO: length should be limit? + **/ + static void + gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata; + + + /* TODO: calculate offset/length for each lookupTables */ + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate; + gxvalid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit; + + for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ ) + { + FT_ULong offset; + + + GXV_LIMIT_CHECK( 4 ); + offset = FT_NEXT_ULONG( p ); + + gxv_LookupTable_validate( table + offset, limit, gxvalid ); + } + + /* TODO: overlapping of lookupTables in substitutionTable */ + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "morx chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE ); + + st_rec.substitutionTable_num_lookupTables = 0; + + gxvalid->xstatetable.optdata = + &st_rec; + gxvalid->xstatetable.optdata_load_func = + gxv_morx_subtable_type1_substitutionTable_load; + gxvalid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type1_subtable_setup; + gxvalid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + gxvalid->xstatetable.entry_validate_func = + gxv_morx_subtable_type1_entry_validate; + + gxv_XStateTable_validate( p, limit, gxvalid ); + + gxv_morx_subtable_type1_substitutionTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx2.c b/external/freetype/src/gxvalid/gxvmorx2.c new file mode 100644 index 000000000..858c81143 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx2.c @@ -0,0 +1,331 @@ +/**************************************************************************** + * + * gxvmorx2.c + * + * TrueTypeGX/AAT morx table validation + * body for type2 (Ligature Substitution) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmorx.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmorx + + + typedef struct GXV_morx_subtable_type2_StateOptRec_ + { + FT_ULong ligActionTable; + FT_ULong componentTable; + FT_ULong ligatureTable; + FT_ULong ligActionTable_length; + FT_ULong componentTable_length; + FT_ULong ligatureTable_length; + + } GXV_morx_subtable_type2_StateOptRec, + *GXV_morx_subtable_type2_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \ + ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 ) + + + static void + gxv_morx_subtable_type2_opttable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 ); + optdata->ligActionTable = FT_NEXT_ULONG( p ); + optdata->componentTable = FT_NEXT_ULONG( p ); + optdata->ligatureTable = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "offset to ligActionTable=0x%08lx\n", + optdata->ligActionTable )); + GXV_TRACE(( "offset to componentTable=0x%08lx\n", + optdata->componentTable )); + GXV_TRACE(( "offset to ligatureTable=0x%08lx\n", + optdata->ligatureTable )); + } + + + static void + gxv_morx_subtable_type2_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_ULong o[6]; + FT_ULong* l[6]; + FT_ULong buff[7]; + + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; + + + GXV_NAME_ENTER( "subtable boundaries setup" ); + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->ligActionTable; + o[4] = optdata->componentTable; + o[5] = optdata->ligatureTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->ligActionTable_length); + l[4] = &(optdata->componentTable_length); + l[5] = &(optdata->ligatureTable_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, gxvalid ); + + GXV_TRACE(( "classTable: offset=0x%08lx length=0x%08lx\n", + classTable, *classTable_length_p )); + GXV_TRACE(( "stateArray: offset=0x%08lx length=0x%08lx\n", + stateArray, *stateArray_length_p )); + GXV_TRACE(( "entryTable: offset=0x%08lx length=0x%08lx\n", + entryTable, *entryTable_length_p )); + GXV_TRACE(( "ligActionTable: offset=0x%08lx length=0x%08lx\n", + optdata->ligActionTable, + optdata->ligActionTable_length )); + GXV_TRACE(( "componentTable: offset=0x%08lx length=0x%08lx\n", + optdata->componentTable, + optdata->componentTable_length )); + GXV_TRACE(( "ligatureTable: offset=0x%08lx length=0x%08lx\n", + optdata->ligatureTable, + optdata->ligatureTable_length )); + + GXV_EXIT; + } + + +#define GXV_MORX_LIGACTION_ENTRY_SIZE 4 + + + static void + gxv_morx_subtable_type2_ligActionIndex_validate( + FT_Bytes table, + FT_UShort ligActionIndex, + GXV_Validator gxvalid ) + { + /* access ligActionTable */ + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; + + FT_Bytes lat_base = table + optdata->ligActionTable; + FT_Bytes p = lat_base + + ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE; + FT_Bytes lat_limit = lat_base + optdata->ligActionTable; + + + if ( p < lat_base ) + { + GXV_TRACE(( "p < lat_base (%ld byte rewind)\n", lat_base - p )); + FT_INVALID_OFFSET; + } + else if ( lat_limit < p ) + { + GXV_TRACE(( "lat_limit < p (%ld byte overrun)\n", p - lat_limit )); + FT_INVALID_OFFSET; + } + + { + /* validate entry in ligActionTable */ + FT_ULong lig_action; +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort last; + FT_UShort store; +#endif + FT_ULong offset; + FT_Long gid_limit; + + + lig_action = FT_NEXT_ULONG( p ); +#ifdef GXV_LOAD_UNUSED_VARS + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); +#endif + + offset = lig_action & 0x3FFFFFFFUL; + + /* this offset is 30-bit signed value to add to GID */ + /* it is different from the location offset in mort */ + if ( ( offset & 0x3FFF0000UL ) == 0x3FFF0000UL ) + { /* negative offset */ + gid_limit = gxvalid->face->num_glyphs - + (FT_Long)( offset & 0x0000FFFFUL ); + if ( gid_limit > 0 ) + return; + + GXV_TRACE(( "ligature action table includes" + " too negative offset moving all GID" + " below defined range: 0x%04lx\n", + offset & 0xFFFFU )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + else if ( ( offset & 0x3FFF0000UL ) == 0x00000000UL ) + { /* positive offset */ + if ( (FT_Long)offset < gxvalid->face->num_glyphs ) + return; + + GXV_TRACE(( "ligature action table includes" + " too large offset moving all GID" + " over defined range: 0x%04lx\n", + offset & 0xFFFFU )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + + GXV_TRACE(( "ligature action table includes" + " invalid offset to add to 16-bit GID:" + " 0x%08lx\n", offset )); + GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET ); + } + } + + + static void + gxv_morx_subtable_type2_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_UShort setComponent; + FT_UShort dontAdvance; + FT_UShort performAction; +#endif + FT_UShort reserved; + FT_UShort ligActionIndex; + + FT_UNUSED( state ); + FT_UNUSED( limit ); + + +#ifdef GXV_LOAD_UNUSED_VARS + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + performAction = (FT_UShort)( ( flags >> 13 ) & 1 ); +#endif + + reserved = (FT_UShort)( flags & 0x1FFF ); + ligActionIndex = glyphOffset_p->u; + + if ( reserved > 0 ) + GXV_TRACE(( " reserved 14bit is non-zero\n" )); + + if ( 0 < ligActionIndex ) + gxv_morx_subtable_type2_ligActionIndex_validate( + table, ligActionIndex, gxvalid ); + } + + + static void + gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes table, + GXV_Validator gxvalid ) + { + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata; + + FT_Bytes p = table + optdata->ligatureTable; + FT_Bytes limit = table + optdata->ligatureTable + + optdata->ligatureTable_length; + + + GXV_NAME_ENTER( "morx chain subtable type2 - substitutionTable" ); + + if ( 0 != optdata->ligatureTable ) + { + /* Apple does not give specification of ligatureTable format */ + while ( p < limit ) + { + FT_UShort lig_gid; + + + GXV_LIMIT_CHECK( 2 ); + lig_gid = FT_NEXT_USHORT( p ); + if ( lig_gid < gxvalid->face->num_glyphs ) + GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID ); + } + } + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type2_StateOptRec lig_rec; + + + GXV_NAME_ENTER( "morx chain subtable type2 (Ligature Substitution)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE ); + + gxvalid->xstatetable.optdata = + &lig_rec; + gxvalid->xstatetable.optdata_load_func = + gxv_morx_subtable_type2_opttable_load; + gxvalid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type2_subtable_setup; + gxvalid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_USHORT; + gxvalid->xstatetable.entry_validate_func = + gxv_morx_subtable_type2_entry_validate; + + gxv_XStateTable_validate( p, limit, gxvalid ); + +#if 0 + p += gxvalid->subtable_length; +#endif + gxv_morx_subtable_type2_ligatureTable_validate( table, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx4.c b/external/freetype/src/gxvalid/gxvmorx4.c new file mode 100644 index 000000000..c9ad19906 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx4.c @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * gxvmorx4.c + * + * TrueTypeGX/AAT morx table validation + * body for "morx" type4 (Non-Contextual Glyph Substitution) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmorx.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmorx + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + GXV_NAME_ENTER( "morx chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + gxv_mort_subtable_type4_validate( table, limit, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvmorx5.c b/external/freetype/src/gxvalid/gxvmorx5.c new file mode 100644 index 000000000..95fa4e288 --- /dev/null +++ b/external/freetype/src/gxvalid/gxvmorx5.c @@ -0,0 +1,226 @@ +/**************************************************************************** + * + * gxvmorx5.c + * + * TrueTypeGX/AAT morx table validation + * body for type5 (Contextual Glyph Insertion) subtable. + * + * Copyright (C) 2005-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvmorx.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvmorx + + + /* + * `morx' subtable type5 (Contextual Glyph Insertion) + * has format of a StateTable with insertion-glyph-list + * without name. However, the 32bit offset from the head + * of subtable to the i-g-l is given after `entryTable', + * without variable name specification (the existence of + * this offset to the table is different from mort type5). + */ + + + typedef struct GXV_morx_subtable_type5_StateOptRec_ + { + FT_ULong insertionGlyphList; + FT_ULong insertionGlyphList_length; + + } GXV_morx_subtable_type5_StateOptRec, + *GXV_morx_subtable_type5_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 4 ) + + + static void + gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRecData optdata = + (GXV_morx_subtable_type5_StateOptRecData)gxvalid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 4 ); + optdata->insertionGlyphList = FT_NEXT_ULONG( p ); + } + + + static void + gxv_morx_subtable_type5_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator gxvalid ) + { + FT_ULong o[4]; + FT_ULong* l[4]; + FT_ULong buff[5]; + + GXV_morx_subtable_type5_StateOptRecData optdata = + (GXV_morx_subtable_type5_StateOptRecData)gxvalid->xstatetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->insertionGlyphList; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->insertionGlyphList_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, gxvalid ); + } + + + static void + gxv_morx_subtable_type5_InsertList_validate( FT_UShort table_index, + FT_UShort count, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table + table_index * 2; + + +#ifndef GXV_LOAD_TRACE_VARS + GXV_LIMIT_CHECK( count * 2 ); +#else + while ( p < table + count * 2 + table_index * 2 ) + { + FT_UShort insert_glyphID; + + + GXV_LIMIT_CHECK( 2 ); + insert_glyphID = FT_NEXT_USHORT( p ); + GXV_TRACE(( " 0x%04x", insert_glyphID )); + } + + GXV_TRACE(( "\n" )); +#endif + } + + + static void + gxv_morx_subtable_type5_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { +#ifdef GXV_LOAD_UNUSED_VARS + FT_Bool setMark; + FT_Bool dontAdvance; + FT_Bool currentIsKashidaLike; + FT_Bool markedIsKashidaLike; + FT_Bool currentInsertBefore; + FT_Bool markedInsertBefore; +#endif + FT_Byte currentInsertCount; + FT_Byte markedInsertCount; + FT_Byte currentInsertList; + FT_UShort markedInsertList; + + FT_UNUSED( state ); + + +#ifdef GXV_LOAD_UNUSED_VARS + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); +#endif + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_Byte) ( glyphOffset_p->ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset_p->ul ); + + if ( currentInsertList && 0 != currentInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, limit, + gxvalid ); + + if ( markedInsertList && 0 != markedInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, limit, + gxvalid ); + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRec et_rec; + GXV_morx_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "morx chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE ); + + gxvalid->xstatetable.optdata = + et; + gxvalid->xstatetable.optdata_load_func = + gxv_morx_subtable_type5_insertionGlyphList_load; + gxvalid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type5_subtable_setup; + gxvalid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + gxvalid->xstatetable.entry_validate_func = + gxv_morx_subtable_type5_entry_validate; + + gxv_XStateTable_validate( p, limit, gxvalid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvopbd.c b/external/freetype/src/gxvalid/gxvopbd.c new file mode 100644 index 000000000..5e9a9665e --- /dev/null +++ b/external/freetype/src/gxvalid/gxvopbd.c @@ -0,0 +1,218 @@ +/**************************************************************************** + * + * gxvopbd.c + * + * TrueTypeGX/AAT opbd table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvopbd + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_opbd_DataRec_ + { + FT_UShort format; + FT_UShort valueOffset_min; + + } GXV_opbd_DataRec, *GXV_opbd_Data; + + +#define GXV_OPBD_DATA( FIELD ) GXV_TABLE_DATA( opbd, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_opbd_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + /* offset in LookupTable is measured from the head of opbd table */ + FT_Bytes p = gxvalid->root->base + value_p->u; + FT_Bytes limit = gxvalid->root->limit; + FT_Short delta_value; + int i; + + + if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) ) + GXV_OPBD_DATA( valueOffset_min ) = value_p->u; + + for ( i = 0; i < 4; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + delta_value = FT_NEXT_SHORT( p ); + + if ( GXV_OPBD_DATA( format ) ) /* format 1, value is ctrl pt. */ + { + if ( delta_value == -1 ) + continue; + + gxv_ctlPoint_validate( glyph, (FT_UShort)delta_value, gxvalid ); + } + else /* format 0, value is distance */ + continue; + } + } + + + /* + opbd ---------------------+ + | + +===============+ | + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of opbd sfnt table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 48bit value array | + +===============+ | + | value | <-------+ + | | + | | + | | + +---------------+ + .... */ + + static GXV_LookupValueDesc + gxv_opbd_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + GXV_LookupValueDesc value; + + FT_UNUSED( lookuptbl_limit ); + FT_UNUSED( gxvalid ); + + /* XXX: check range? */ + value.u = (FT_UShort)( base_value_p->u + + relative_gindex * 4 * sizeof ( FT_Short ) ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** opbd TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + GXV_opbd_DataRec opbdrec; + GXV_opbd_Data opbd = &opbdrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + + + gxvalid->root = ftvalid; + gxvalid->table_data = opbd; + gxvalid->face = face; + + FT_TRACE3(( "validating `opbd' table\n" )); + GXV_INIT; + GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU; + + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p ); + + + /* only 0x00010000 is defined (1996) */ + GXV_TRACE(( "(version=0x%08lx)\n", version )); + if ( 0x00010000UL != version ) + FT_INVALID_FORMAT; + + /* only values 0 and 1 are defined (1996) */ + GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) )); + if ( 0x0001 < GXV_OPBD_DATA( format ) ) + FT_INVALID_FORMAT; + + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_opbd_LookupValue_validate; + gxvalid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, gxvalid ); + p += gxvalid->subtable_length; + + if ( p > table + GXV_OPBD_DATA( valueOffset_min ) ) + { + GXV_TRACE(( + "found overlap between LookupTable and opbd_value array\n" )); + FT_INVALID_OFFSET; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvprop.c b/external/freetype/src/gxvalid/gxvprop.c new file mode 100644 index 000000000..63a052a8e --- /dev/null +++ b/external/freetype/src/gxvalid/gxvprop.c @@ -0,0 +1,330 @@ +/**************************************************************************** + * + * gxvprop.c + * + * TrueTypeGX/AAT prop table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvprop + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_PROP_HEADER_SIZE ( 4 + 2 + 2 ) +#define GXV_PROP_SIZE_MIN GXV_PROP_HEADER_SIZE + + typedef struct GXV_prop_DataRec_ + { + FT_Fixed version; + + } GXV_prop_DataRec, *GXV_prop_Data; + +#define GXV_PROP_DATA( field ) GXV_TABLE_DATA( prop, field ) + +#define GXV_PROP_FLOATER 0x8000U +#define GXV_PROP_USE_COMPLEMENTARY_BRACKET 0x1000U +#define GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET 0x0F00U +#define GXV_PROP_ATTACHING_TO_RIGHT 0x0080U +#define GXV_PROP_RESERVED 0x0060U +#define GXV_PROP_DIRECTIONALITY_CLASS 0x001FU + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_prop_zero_advance_validate( FT_UShort gid, + GXV_Validator gxvalid ) + { + FT_Face face; + FT_Error error; + FT_GlyphSlot glyph; + + + GXV_NAME_ENTER( "zero advance" ); + + face = gxvalid->face; + + error = FT_Load_Glyph( face, + gid, + FT_LOAD_IGNORE_TRANSFORM ); + if ( error ) + FT_INVALID_GLYPH_ID; + + glyph = face->glyph; + + if ( glyph->advance.x != (FT_Pos)0 || + glyph->advance.y != (FT_Pos)0 ) + { + GXV_TRACE(( " found non-zero advance in zero-advance glyph\n" )); + FT_INVALID_DATA; + } + + GXV_EXIT; + } + + + /* Pass 0 as GLYPH to check the default property */ + static void + gxv_prop_property_validate( FT_UShort property, + FT_UShort glyph, + GXV_Validator gxvalid ) + { + if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) ) + gxv_prop_zero_advance_validate( glyph, gxvalid ); + + if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET ) + { + FT_UShort offset; + char complement; + + + offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ); + if ( offset == 0 ) + { + GXV_TRACE(( " found zero offset to property\n" )); + FT_INVALID_OFFSET; + } + + complement = (char)( offset >> 8 ); + if ( complement & 0x08 ) + { + /* Top bit is set: negative */ + + /* Calculate the absolute offset */ + complement = (char)( ( complement & 0x07 ) + 1 ); + + /* The gid for complement must be greater than 0 */ + if ( glyph <= complement ) + { + GXV_TRACE(( " found non-positive glyph complement\n" )); + FT_INVALID_DATA; + } + } + else + { + /* The gid for complement must be the face. */ + gxv_glyphid_validate( (FT_UShort)( glyph + complement ), gxvalid ); + } + } + else + { + if ( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ) + GXV_TRACE(( "glyph %d cannot have complementary bracketing\n", + glyph )); + } + + /* this is introduced in version 2.0 */ + if ( property & GXV_PROP_ATTACHING_TO_RIGHT ) + { + if ( GXV_PROP_DATA( version ) == 0x00010000UL ) + { + GXV_TRACE(( " found older version (1.0) in new version table\n" )); + FT_INVALID_DATA; + } + } + + if ( property & GXV_PROP_RESERVED ) + { + GXV_TRACE(( " found non-zero bits in reserved bits\n" )); + FT_INVALID_DATA; + } + + if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 ) + { + /* TODO: Too restricted. Use the validation level. */ + if ( GXV_PROP_DATA( version ) == 0x00010000UL || + GXV_PROP_DATA( version ) == 0x00020000UL ) + { + GXV_TRACE(( " found too old version in directionality class\n" )); + FT_INVALID_DATA; + } + } + } + + + static void + gxv_prop_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator gxvalid ) + { + gxv_prop_property_validate( value_p->u, glyph, gxvalid ); + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + ... | + | + 16bit value array | + +===============+ | + | value | <-------+ + ... + */ + + static GXV_LookupValueDesc + gxv_prop_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator gxvalid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + p = gxvalid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** prop TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_prop_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + + GXV_prop_DataRec proprec; + GXV_prop_Data prop = &proprec; + + FT_Fixed version; + FT_UShort format; + FT_UShort defaultProp; + + + gxvalid->root = ftvalid; + gxvalid->table_data = prop; + gxvalid->face = face; + + FT_TRACE3(( "validating `prop' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_LONG( p ); + format = FT_NEXT_USHORT( p ); + defaultProp = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " version 0x%08lx\n", version )); + GXV_TRACE(( " format 0x%04x\n", format )); + GXV_TRACE(( " defaultProp 0x%04x\n", defaultProp )); + + /* only versions 1.0, 2.0, 3.0 are defined (1996) */ + if ( version != 0x00010000UL && + version != 0x00020000UL && + version != 0x00030000UL ) + { + GXV_TRACE(( " found unknown version\n" )); + FT_INVALID_FORMAT; + } + + + /* only formats 0x0000, 0x0001 are defined (1996) */ + if ( format > 1 ) + { + GXV_TRACE(( " found unknown format\n" )); + FT_INVALID_FORMAT; + } + + gxv_prop_property_validate( defaultProp, 0, gxvalid ); + + if ( format == 0 ) + { + FT_TRACE3(( "(format 0, no per-glyph properties, " + "remaining %ld bytes are skipped)", limit - p )); + goto Exit; + } + + /* format == 1 */ + GXV_PROP_DATA( version ) = version; + + gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + gxvalid->lookupval_func = gxv_prop_LookupValue_validate; + gxvalid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, gxvalid ); + + Exit: + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/gxvtrak.c b/external/freetype/src/gxvalid/gxvtrak.c new file mode 100644 index 000000000..f3fb51c8a --- /dev/null +++ b/external/freetype/src/gxvalid/gxvtrak.c @@ -0,0 +1,288 @@ +/**************************************************************************** + * + * gxvtrak.c + * + * TrueTypeGX/AAT trak table validation (body). + * + * Copyright (C) 2004-2023 by + * suzuki toshiya, Masatake YAMATO, Red Hat K.K., + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +/**************************************************************************** + * + * gxvalid is derived from both gxlayout module and otvalid module. + * Development of gxlayout is supported by the Information-technology + * Promotion Agency(IPA), Japan. + * + */ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT gxvtrak + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * referred track table format specification: + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6trak.html + * last update was 1996. + * ---------------------------------------------- + * [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN + * version (fixed: 32bit) = 0x00010000 + * format (uint16: 16bit) = 0 is only defined (1996) + * horizOffset (uint16: 16bit) + * vertOffset (uint16: 16bit) + * reserved (uint16: 16bit) = 0 + * ---------------------------------------------- + * [VARIABLE BODY]: + * horizData + * header ( 2 + 2 + 4 + * trackTable + nTracks * ( 4 + 2 + 2 ) + * sizeTable + nSizes * 4 ) + * ---------------------------------------------- + * vertData + * header ( 2 + 2 + 4 + * trackTable + nTracks * ( 4 + 2 + 2 ) + * sizeTable + nSizes * 4 ) + * ---------------------------------------------- + */ + typedef struct GXV_trak_DataRec_ + { + FT_UShort trackValueOffset_min; + FT_UShort trackValueOffset_max; + + } GXV_trak_DataRec, *GXV_trak_Data; + + +#define GXV_TRAK_DATA( FIELD ) GXV_TABLE_DATA( trak, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_trak_trackTable_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nTracks, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + + FT_Fixed track, t; + FT_UShort nameIndex; + FT_UShort offset; + FT_UShort i, j; + + + GXV_NAME_ENTER( "trackTable" ); + + GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU; + GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000; + + GXV_LIMIT_CHECK( nTracks * ( 4 + 2 + 2 ) ); + + for ( i = 0; i < nTracks; i++ ) + { + p = table + i * ( 4 + 2 + 2 ); + track = FT_NEXT_LONG( p ); + nameIndex = FT_NEXT_USHORT( p ); + offset = FT_NEXT_USHORT( p ); + + if ( offset < GXV_TRAK_DATA( trackValueOffset_min ) ) + GXV_TRAK_DATA( trackValueOffset_min ) = offset; + if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) ) + GXV_TRAK_DATA( trackValueOffset_max ) = offset; + + gxv_sfntName_validate( nameIndex, 256, 32767, gxvalid ); + + for ( j = i; j < nTracks; j++ ) + { + p = table + j * ( 4 + 2 + 2 ); + t = FT_NEXT_LONG( p ); + if ( t == track ) + GXV_TRACE(( "duplicated entries found for track value 0x%lx\n", + track )); + } + } + + gxvalid->subtable_length = (FT_ULong)( p - table ); + GXV_EXIT; + } + + + static void + gxv_trak_trackData_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator gxvalid ) + { + FT_Bytes p = table; + FT_UShort nTracks; + FT_UShort nSizes; + FT_ULong sizeTableOffset; + + GXV_ODTECT( 4, odtect ); + + + GXV_ODTECT_INIT( odtect ); + GXV_NAME_ENTER( "trackData" ); + + /* read the header of trackData */ + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + nTracks = FT_NEXT_USHORT( p ); + nSizes = FT_NEXT_USHORT( p ); + sizeTableOffset = FT_NEXT_ULONG( p ); + + gxv_odtect_add_range( table, (FT_ULong)( p - table ), + "trackData header", odtect ); + + /* validate trackTable */ + gxv_trak_trackTable_validate( p, limit, nTracks, gxvalid ); + gxv_odtect_add_range( p, gxvalid->subtable_length, + "trackTable", odtect ); + + /* sizeTable is array of FT_Fixed, don't check contents */ + p = gxvalid->root->base + sizeTableOffset; + GXV_LIMIT_CHECK( nSizes * 4 ); + gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect ); + + /* validate trackValueOffet */ + p = gxvalid->root->base + GXV_TRAK_DATA( trackValueOffset_min ); + if ( limit - p < nTracks * nSizes * 2 ) + GXV_TRACE(( "too short trackValue array\n" )); + + p = gxvalid->root->base + GXV_TRAK_DATA( trackValueOffset_max ); + GXV_LIMIT_CHECK( nSizes * 2 ); + + gxv_odtect_add_range( gxvalid->root->base + + GXV_TRAK_DATA( trackValueOffset_min ), + GXV_TRAK_DATA( trackValueOffset_max ) + - GXV_TRAK_DATA( trackValueOffset_min ) + + nSizes * 2, + "trackValue array", odtect ); + + gxv_odtect_validate( odtect, gxvalid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** trak TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_trak_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + + GXV_ValidatorRec gxvalidrec; + GXV_Validator gxvalid = &gxvalidrec; + GXV_trak_DataRec trakrec; + GXV_trak_Data trak = &trakrec; + + FT_ULong version; + FT_UShort format; + FT_UShort horizOffset; + FT_UShort vertOffset; + FT_UShort reserved; + + + GXV_ODTECT( 3, odtect ); + + GXV_ODTECT_INIT( odtect ); + gxvalid->root = ftvalid; + gxvalid->table_data = trak; + gxvalid->face = face; + + limit = gxvalid->root->limit; + + FT_TRACE3(( "validating `trak' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + horizOffset = FT_NEXT_USHORT( p ); + vertOffset = FT_NEXT_USHORT( p ); + reserved = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (version = 0x%08lx)\n", version )); + GXV_TRACE(( " (format = 0x%04x)\n", format )); + GXV_TRACE(( " (horizOffset = 0x%04x)\n", horizOffset )); + GXV_TRACE(( " (vertOffset = 0x%04x)\n", vertOffset )); + GXV_TRACE(( " (reserved = 0x%04x)\n", reserved )); + + /* Version 1.0 (always:1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* format 0 (always:1996) */ + if ( format != 0x0000 ) + FT_INVALID_FORMAT; + + GXV_32BIT_ALIGNMENT_VALIDATE( horizOffset ); + GXV_32BIT_ALIGNMENT_VALIDATE( vertOffset ); + + /* Reserved Fixed Value (always) */ + if ( reserved != 0x0000 ) + FT_INVALID_DATA; + + /* validate trackData */ + if ( 0 < horizOffset ) + { + gxv_trak_trackData_validate( table + horizOffset, limit, gxvalid ); + gxv_odtect_add_range( table + horizOffset, gxvalid->subtable_length, + "horizJustData", odtect ); + } + + if ( 0 < vertOffset ) + { + gxv_trak_trackData_validate( table + vertOffset, limit, gxvalid ); + gxv_odtect_add_range( table + vertOffset, gxvalid->subtable_length, + "vertJustData", odtect ); + } + + gxv_odtect_validate( odtect, gxvalid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/gxvalid/module.mk b/external/freetype/src/gxvalid/module.mk new file mode 100644 index 000000000..49491348a --- /dev/null +++ b/external/freetype/src/gxvalid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 gxvalid module definition +# + +# Copyright (C) 2004-2023 by +# suzuki toshiya, Masatake YAMATO, Red Hat K.K., +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += GXVALID_MODULE + +define GXVALID_MODULE +$(OPEN_DRIVER) FT_Module_Class, gxv_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)gxvalid $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/gxvalid/rules.mk b/external/freetype/src/gxvalid/rules.mk new file mode 100644 index 000000000..95ae6334e --- /dev/null +++ b/external/freetype/src/gxvalid/rules.mk @@ -0,0 +1,98 @@ +# +# FreeType 2 TrueTypeGX/AAT validation driver configuration rules +# + + +# Copyright (C) 2004-2023 by +# suzuki toshiya, Masatake YAMATO, Red Hat K.K., +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# GXV driver directory +# +GXV_DIR := $(SRC_DIR)/gxvalid + + +# compilation flags for the driver +# +GXV_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(GXV_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# GXV driver sources (i.e., C files) +# +GXV_DRV_SRC := $(GXV_DIR)/gxvcommn.c \ + $(GXV_DIR)/gxvfeat.c \ + $(GXV_DIR)/gxvbsln.c \ + $(GXV_DIR)/gxvtrak.c \ + $(GXV_DIR)/gxvopbd.c \ + $(GXV_DIR)/gxvprop.c \ + $(GXV_DIR)/gxvjust.c \ + $(GXV_DIR)/gxvmort.c \ + $(GXV_DIR)/gxvmort0.c \ + $(GXV_DIR)/gxvmort1.c \ + $(GXV_DIR)/gxvmort2.c \ + $(GXV_DIR)/gxvmort4.c \ + $(GXV_DIR)/gxvmort5.c \ + $(GXV_DIR)/gxvmorx.c \ + $(GXV_DIR)/gxvmorx0.c \ + $(GXV_DIR)/gxvmorx1.c \ + $(GXV_DIR)/gxvmorx2.c \ + $(GXV_DIR)/gxvmorx4.c \ + $(GXV_DIR)/gxvmorx5.c \ + $(GXV_DIR)/gxvlcar.c \ + $(GXV_DIR)/gxvkern.c \ + $(GXV_DIR)/gxvmod.c + +# GXV driver headers +# +GXV_DRV_H := $(GXV_DIR)/gxvalid.h \ + $(GXV_DIR)/gxverror.h \ + $(GXV_DIR)/gxvcommn.h \ + $(GXV_DIR)/gxvfeat.h \ + $(GXV_DIR)/gxvmod.h \ + $(GXV_DIR)/gxvmort.h \ + $(GXV_DIR)/gxvmorx.h + + +# GXV driver object(s) +# +# GXV_DRV_OBJ_M is used during `multi' builds. +# GXV_DRV_OBJ_S is used during `single' builds. +# +GXV_DRV_OBJ_M := $(GXV_DRV_SRC:$(GXV_DIR)/%.c=$(OBJ_DIR)/%.$O) +GXV_DRV_OBJ_S := $(OBJ_DIR)/gxvalid.$O + +# GXV driver source file for single build +# +GXV_DRV_SRC_S := $(GXV_DIR)/gxvalid.c + + +# GXV driver - single object +# +$(GXV_DRV_OBJ_S): $(GXV_DRV_SRC_S) $(GXV_DRV_SRC) \ + $(FREETYPE_H) $(GXV_DRV_H) + $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GXV_DRV_SRC_S)) + + +# GXV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(GXV_DIR)/%.c $(FREETYPE_H) $(GXV_DRV_H) + $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(GXV_DRV_OBJ_S) +DRV_OBJS_M += $(GXV_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/gzip/README.freetype b/external/freetype/src/gzip/README.freetype new file mode 100644 index 000000000..76298b06b --- /dev/null +++ b/external/freetype/src/gzip/README.freetype @@ -0,0 +1,23 @@ +Name: zlib +Short Name: zlib +URL: http://zlib.net/ +Version: 1.2.13 +License: see `zlib.h` + +Description: +"A massively spiffy yet delicately unobtrusive compression library." + +'zlib' is a free, general-purpose, legally unencumbered lossless +data-compression library. 'zlib' implements the "deflate" compression +algorithm described by RFC 1951, which combines the LZ77 (Lempel-Ziv) +algorithm with Huffman coding. zlib also implements the zlib (RFC 1950) and +gzip (RFC 1952) wrapper formats. + +Local Modifications: +The files in this directory have been prepared as follows. + + - Take the unmodified source code files from the zlib distribution that are + included by `ftgzip.c`. + - Copy `zconf.h` to `ftzconf.h` (which stays unmodified otherwise). + - Run zlib's `zlib2ansi` script on all `.c` files. + - Apply the diff file(s) in the `patches` folder. diff --git a/external/freetype/src/gzip/adler32.c b/external/freetype/src/gzip/adler32.c new file mode 100644 index 000000000..aa032e1dd --- /dev/null +++ b/external/freetype/src/gzip/adler32.c @@ -0,0 +1,192 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef Z_FREETYPE +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); +#endif + +#define BASE 65521U /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32_z( + uLong adler, + const Bytef *buf, + z_size_t len) +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32( + uLong adler, + const Bytef *buf, + uInt len) +{ + return adler32_z(adler, buf, len); +} + +#ifndef Z_FREETYPE + +/* ========================================================================= */ +local uLong adler32_combine_( + uLong adler1, + uLong adler2, + z_off64_t len2) +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine( + uLong adler1, + uLong adler2, + z_off_t len2) +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64( + uLong adler1, + uLong adler2, + z_off64_t len2) +{ + return adler32_combine_(adler1, adler2, len2); +} + +#endif /* !Z_FREETYPE */ diff --git a/external/freetype/src/gzip/crc32.c b/external/freetype/src/gzip/crc32.c new file mode 100644 index 000000000..6cd1b09d5 --- /dev/null +++ b/external/freetype/src/gzip/crc32.c @@ -0,0 +1,1135 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2022 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * This interleaved implementation of a CRC makes use of pipelined multiple + * arithmetic-logic units, commonly found in modern CPU cores. It is due to + * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + MAKECRCH can be #defined to write out crc32.h. A main() routine is also + produced, so that this one source file can be compiled to an executable. + */ + +#ifdef MAKECRCH +# include <stdio.h> +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */ + + /* + A CRC of a message is computed on N braids of words in the message, where + each word consists of W bytes (4 or 8). If N is 3, for example, then three + running sparse CRCs are calculated respectively on each braid, at these + indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ... + This is done starting at a word boundary, and continues until as many blocks + of N * W bytes as are available have been processed. The results are combined + into a single CRC at the end. For this code, N must be in the range 1..6 and + W must be 4 or 8. The upper limit on N can be increased if desired by adding + more #if blocks, extending the patterns apparent in the code. In addition, + crc32.h would need to be regenerated, if the maximum N value is increased. + + N and W are chosen empirically by benchmarking the execution time on a given + processor. The choices for N and W below were based on testing on Intel Kaby + Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64 + Octeon II processors. The Intel, AMD, and ARM processors were all fastest + with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4. + They were all tested with either gcc or clang, all using the -O3 optimization + level. Your mileage may vary. + */ + +/* Define N */ +#ifdef Z_TESTN +# define N Z_TESTN +#else +# define N 5 +#endif +#if N < 1 || N > 6 +# error N must be in 1..6 +#endif + +/* + z_crc_t must be at least 32 bits. z_word_t must be at least as long as + z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and + that bytes are eight bits. + */ + +/* + Define W and the associated z_word_t type. If W is not defined, then a + braided calculation is not used, and the associated tables and code are not + compiled. + */ +#ifdef Z_TESTW +# if Z_TESTW-1 != -1 +# define W Z_TESTW +# endif +#else +# ifdef MAKECRCH +# define W 8 /* required for MAKECRCH */ +# else +# if defined(__x86_64__) || defined(__aarch64__) +# define W 8 +# else +# define W 4 +# endif +# endif +#endif +#ifdef W +# if W == 8 && defined(Z_U8) + typedef Z_U8 z_word_t; +# elif defined(Z_U4) +# undef W +# define W 4 + typedef Z_U4 z_word_t; +# else +# undef W +# endif +#endif + +/* If available, use the ARM processor CRC32 instruction. */ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 +# define ARMCRC32 +#endif + +#ifndef Z_FREETYPE +/* Local functions. */ +local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); +local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); +#endif /* Z_FREETYPE */ + +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) + local z_word_t byte_swap OF((z_word_t word)); +#endif + +#if defined(W) && !defined(ARMCRC32) + local z_crc_t crc_word OF((z_word_t data)); + local z_word_t crc_word_big OF((z_word_t data)); +#endif + +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) +/* + Swap the bytes in a z_word_t to convert between little and big endian. Any + self-respecting compiler will optimize this to a single machine byte-swap + instruction, if one is available. This assumes that word_t is either 32 bits + or 64 bits. + */ +local z_word_t byte_swap( + z_word_t word) +{ +# if W == 8 + return + (word & 0xff00000000000000) >> 56 | + (word & 0xff000000000000) >> 40 | + (word & 0xff0000000000) >> 24 | + (word & 0xff00000000) >> 8 | + (word & 0xff000000) << 8 | + (word & 0xff0000) << 24 | + (word & 0xff00) << 40 | + (word & 0xff) << 56; +# else /* W == 4 */ + return + (word & 0xff000000) >> 24 | + (word & 0xff0000) >> 8 | + (word & 0xff00) << 8 | + (word & 0xff) << 24; +# endif +} +#endif + +/* CRC polynomial. */ +#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ + +#ifdef DYNAMIC_CRC_TABLE + +local z_crc_t FAR crc_table[256]; +local z_crc_t FAR x2n_table[32]; +local void make_crc_table OF((void)); +#ifdef W + local z_word_t FAR crc_big_table[256]; + local z_crc_t FAR crc_braid_table[W][256]; + local z_word_t FAR crc_braid_big_table[W][256]; + local void braid OF((z_crc_t [][256], z_word_t [][256], int, int)); +#endif +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *, int)); + local void write_table32hi OF((FILE *, const z_word_t FAR *, int)); + local void write_table64 OF((FILE *, const z_word_t FAR *, int)); +#endif /* MAKECRCH */ + +/* + Define a once() function depending on the availability of atomics. If this is + compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in + multiple threads, and if atomics are not available, then get_crc_table() must + be called to initialize the tables and must return before any threads are + allowed to compute or combine CRCs. + */ + +/* Definition of once functionality. */ +typedef struct once_s once_t; +local void once OF((once_t *, void (*)(void))); + +/* Check for the availability of atomics. */ +#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ + !defined(__STDC_NO_ATOMICS__) + +#include <stdatomic.h> + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + atomic_flag begun; + atomic_int done; +}; +#define ONCE_INIT {ATOMIC_FLAG_INIT, 0} + +/* + Run the provided init() function exactly once, even if multiple threads + invoke once() at the same time. The state must be a once_t initialized with + ONCE_INIT. + */ +local void once(state, init) + once_t *state; + void (*init)(void); +{ + if (!atomic_load(&state->done)) { + if (atomic_flag_test_and_set(&state->begun)) + while (!atomic_load(&state->done)) + ; + else { + init(); + atomic_store(&state->done, 1); + } + } +} + +#else /* no atomics */ + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + volatile int begun; + volatile int done; +}; +#define ONCE_INIT {0, 0} + +/* Test and set. Alas, not atomic, but tries to minimize the period of + vulnerability. */ +local int test_and_set OF((int volatile *)); +local int test_and_set( + int volatile *flag) +{ + int was; + + was = *flag; + *flag = 1; + return was; +} + +/* Run the provided init() function once. This is not thread-safe. */ +local void once(state, init) + once_t *state; + void (*init)(void); +{ + if (!state->done) { + if (test_and_set(&state->begun)) + while (!state->done) + ; + else { + init(); + state->done = 1; + } + } +} + +#endif + +/* State for once(). */ +local once_t made = ONCE_INIT; + +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x + (which is shifting right by one and adding x^32 mod p if the bit shifted out + is a one). We start with the highest power (least significant bit) of q and + repeat for all eight bits of q. + + The table is simply the CRC of all possible eight bit values. This is all the + information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. + */ + +local void make_crc_table() +{ + unsigned i, j, n; + z_crc_t p; + + /* initialize the CRC of bytes tables */ + for (i = 0; i < 256; i++) { + p = i; + for (j = 0; j < 8; j++) + p = p & 1 ? (p >> 1) ^ POLY : p >> 1; + crc_table[i] = p; +#ifdef W + crc_big_table[i] = byte_swap(p); +#endif + } + + /* initialize the x^2^n mod p(x) table */ + p = (z_crc_t)1 << 30; /* x^1 */ + x2n_table[0] = p; + for (n = 1; n < 32; n++) + x2n_table[n] = p = multmodp(p, p); + +#ifdef W + /* initialize the braiding tables -- needs x2n_table[] */ + braid(crc_braid_table, crc_braid_big_table, N, W); +#endif + +#ifdef MAKECRCH + { + /* + The crc32.h header file contains tables for both 32-bit and 64-bit + z_word_t's, and so requires a 64-bit type be available. In that case, + z_word_t must be defined to be 64-bits. This code then also generates + and writes out the tables for the case that z_word_t is 32 bits. + */ +#if !defined(W) || W != 8 +# error Need a 64-bit integer type in order to generate crc32.h. +#endif + FILE *out; + int k, n; + z_crc_t ltl[8][256]; + z_word_t big[8][256]; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + + /* write out little-endian CRC table to crc32.h */ + fprintf(out, + "/* crc32.h -- tables for rapid CRC calculation\n" + " * Generated automatically by crc32.c\n */\n" + "\n" + "local const z_crc_t FAR crc_table[] = {\n" + " "); + write_table(out, crc_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#ifdef W\n" + "\n" + "#if W == 8\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table64(out, crc_big_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table32hi(out, crc_big_table, 256); + fprintf(out, + "};\n" + "\n" + "#endif\n"); + + /* write out braid tables for each value of N */ + for (n = 1; n <= 6; n++) { + fprintf(out, + "\n" + "#if N == %d\n", n); + + /* compute braid tables for this N and 64-bit word_t */ + braid(ltl, big, n, 8); + + /* write out braid tables for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#if W == 8\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table64(out, big[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n"); + + /* compute braid tables for this N and 32-bit word_t */ + braid(ltl, big, n, 4); + + /* write out braid tables for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table32hi(out, big[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "#endif\n" + "\n" + "#endif\n"); + } + fprintf(out, + "\n" + "#endif\n"); + + /* write out zeros operator table to crc32.h */ + fprintf(out, + "\n" + "local const z_crc_t FAR x2n_table[] = {\n" + " "); + write_table(out, x2n_table, 32); + fprintf(out, + "};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH + +/* + Write the 32-bit values in table[0..k-1] to out, five per line in + hexadecimal separated by commas. + */ +local void write_table( + FILE *out, + const z_crc_t FAR *table, + int k) +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the high 32-bits of each value in table[0..k-1] to out, five per line + in hexadecimal separated by commas. + */ +local void write_table32hi( + FILE *out, + const z_word_t FAR *table, + int k) +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n] >> 32), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the 64-bit values in table[0..k-1] to out, three per line in + hexadecimal separated by commas. This assumes that if there is a 64-bit + type, then there is also a long long integer type, and it is at least 64 + bits. If not, then the type cast and format string can be adjusted + accordingly. + */ +local void write_table64( + FILE *out, + const z_word_t FAR *table, + int k) +{ + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : " ", + (unsigned long long)(table[n]), + n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", ")); +} + +/* Actually do the deed. */ +int main() +{ + make_crc_table(); + return 0; +} + +#endif /* MAKECRCH */ + +#ifdef W +/* + Generate the little and big-endian braid tables for the given n and z_word_t + size w. Each array must have room for w blocks of 256 elements. + */ +local void braid(ltl, big, n, w) + z_crc_t ltl[][256]; + z_word_t big[][256]; + int n; + int w; +{ + int k; + z_crc_t i, p, q; + for (k = 0; k < w; k++) { + p = x2nmodp((n * w + 3 - k) << 3, 0); + ltl[k][0] = 0; + big[w - 1 - k][0] = 0; + for (i = 1; i < 256; i++) { + ltl[k][i] = q = multmodp(i << 24, p); + big[w - 1 - k][i] = byte_swap(q); + } + } +} +#endif + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ======================================================================== + * Routines used for CRC calculation. Some are also required for the table + * generation above. + */ + +#ifndef Z_FREETYPE + +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp( + z_crc_t a, + z_crc_t b) +{ + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} + +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp( + z_off64_t n, + unsigned k) +{ + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + +/* ========================================================================= + * This function can be used by asm versions of crc32(), and to force the + * generation of the CRC tables in a threaded application. + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +#endif /* Z_FREETYPE */ + +/* ========================================================================= + * Use ARM machine instructions if available. This will compute the CRC about + * ten times faster than the braided calculation. This code does not check for + * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will + * only be defined if the compilation specifies an ARM processor architecture + * that has the instructions. For example, compiling with -march=armv8.1-a or + * -march=armv8-a+crc, or -march=native if the compile machine has the crc32 + * instructions. + */ +#ifdef ARMCRC32 + +/* + Constants empirically determined to maximize speed. These values are from + measurements on a Cortex-A57. Your mileage may vary. + */ +#define Z_BATCH 3990 /* number of words in a batch */ +#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ +#define Z_BATCH_MIN 800 /* fewest words in a final batch */ + +unsigned long ZEXPORT crc32_z( + unsigned long crc, + const unsigned char FAR *buf, + z_size_t len) +{ + z_crc_t val; + z_word_t crc1, crc2; + const z_word_t *word; + z_word_t val0, val1, val2; + z_size_t last, last2, i; + z_size_t num; + + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; + +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; + + /* Compute the CRC up to a word boundary. */ + while (len && ((z_size_t)buf & 7) != 0) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */ + word = (z_word_t const *)buf; + num = len >> 3; + len &= 7; + + /* Do three interleaved CRCs to realize the throughput of one crc32x + instruction per cycle. Each CRC is calculated on Z_BATCH words. The + three CRCs are combined into a single CRC after each set of batches. */ + while (num >= 3 * Z_BATCH) { + crc1 = 0; + crc2 = 0; + for (i = 0; i < Z_BATCH; i++) { + val0 = word[i]; + val1 = word[i + Z_BATCH]; + val2 = word[i + 2 * Z_BATCH]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * Z_BATCH; + num -= 3 * Z_BATCH; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2; + } + + /* Do one last smaller batch with the remaining words, if there are enough + to pay for the combination of CRCs. */ + last = num / 3; + if (last >= Z_BATCH_MIN) { + last2 = last << 1; + crc1 = 0; + crc2 = 0; + for (i = 0; i < last; i++) { + val0 = word[i]; + val1 = word[i + last]; + val2 = word[i + last2]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * last; + num -= 3 * last; + val = x2nmodp(last, 6); + crc = multmodp(val, crc) ^ crc1; + crc = multmodp(val, crc) ^ crc2; + } + + /* Compute the CRC on any remaining words. */ + for (i = 0; i < num; i++) { + val0 = word[i]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + } + word += num; + + /* Complete the CRC on any remaining bytes. */ + buf = (const unsigned char FAR *)word; + while (len) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; +} + +#else + +#ifdef W + +/* + Return the CRC of the W bytes in the word_t data, taking the + least-significant byte of the word as the first byte of data, without any pre + or post conditioning. This is used to combine the CRCs of each braid. + */ +local z_crc_t crc_word( + z_word_t data) +{ + int k; + for (k = 0; k < W; k++) + data = (data >> 8) ^ crc_table[data & 0xff]; + return (z_crc_t)data; +} + +local z_word_t crc_word_big( + z_word_t data) +{ + int k; + for (k = 0; k < W; k++) + data = (data << 8) ^ + crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; + return data; +} + +#endif + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z( + unsigned long crc, + const unsigned char FAR *buf, + z_size_t len) +{ + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; + +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; + +#ifdef W + + /* If provided enough bytes, do a braided CRC calculation. */ + if (len >= N * W + W - 1) { + z_size_t blks; + z_word_t const *words; + unsigned endian; + int k; + + /* Compute the CRC up to a z_word_t boundary. */ + while (len && ((z_size_t)buf & (W - 1)) != 0) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Compute the CRC on as many N z_word_t blocks as are available. */ + blks = len / (N * W); + len -= blks * N * W; + words = (z_word_t const *)buf; + + /* Do endian check at execution time instead of compile time, since ARM + processors can change the endianess at execution time. If the + compiler knows what the endianess will be, it can optimize out the + check and the unused branch. */ + endian = 1; + if (*(unsigned char *)&endian) { + /* Little endian. */ + + z_crc_t crc0; + z_word_t word0; +#if N > 1 + z_crc_t crc1; + z_word_t word1; +#if N > 2 + z_crc_t crc2; + z_word_t word2; +#if N > 3 + z_crc_t crc3; + z_word_t word3; +#if N > 4 + z_crc_t crc4; + z_word_t word4; +#if N > 5 + z_crc_t crc5; + z_word_t word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = crc; +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + crc = crc_word(crc0 ^ words[0]); +#if N > 1 + crc = crc_word(crc1 ^ words[1] ^ crc); +#if N > 2 + crc = crc_word(crc2 ^ words[2] ^ crc); +#if N > 3 + crc = crc_word(crc3 ^ words[3] ^ crc); +#if N > 4 + crc = crc_word(crc4 ^ words[4] ^ crc); +#if N > 5 + crc = crc_word(crc5 ^ words[5] ^ crc); +#endif +#endif +#endif +#endif +#endif + words += N; + } + else { + /* Big endian. */ + + z_word_t crc0, word0, comb; +#if N > 1 + z_word_t crc1, word1; +#if N > 2 + z_word_t crc2, word2; +#if N > 3 + z_word_t crc3, word3; +#if N > 4 + z_word_t crc4, word4; +#if N > 5 + z_word_t crc5, word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = byte_swap(crc); +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_big_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_big_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_big_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_big_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_big_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_big_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + comb = crc_word_big(crc0 ^ words[0]); +#if N > 1 + comb = crc_word_big(crc1 ^ words[1] ^ comb); +#if N > 2 + comb = crc_word_big(crc2 ^ words[2] ^ comb); +#if N > 3 + comb = crc_word_big(crc3 ^ words[3] ^ comb); +#if N > 4 + comb = crc_word_big(crc4 ^ words[4] ^ comb); +#if N > 5 + comb = crc_word_big(crc5 ^ words[5] ^ comb); +#endif +#endif +#endif +#endif +#endif + words += N; + crc = byte_swap(comb); + } + + /* + Update the pointer to the remaining bytes to process. + */ + buf = (unsigned char const *)words; + } + +#endif /* W */ + + /* Complete the computation of the CRC on any remaining bytes. */ + while (len >= 8) { + len -= 8; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + while (len) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; +} + +#endif + +/* ========================================================================= */ +unsigned long ZEXPORT crc32( + unsigned long crc, + const unsigned char FAR *buf, + uInt len) +{ + return crc32_z(crc, buf, len); +} + +#ifndef Z_FREETYPE + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine64( + uLong crc1, + uLong crc2, + z_off64_t len2) +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine( + uLong crc1, + uLong crc2, + z_off_t len2) +{ + return crc32_combine64(crc1, crc2, (z_off64_t)len2); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen64( + z_off64_t len2) +{ +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return x2nmodp(len2, 3); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen( + z_off_t len2) +{ + return crc32_combine_gen64((z_off64_t)len2); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_op( + uLong crc1, + uLong crc2, + uLong op) +{ + return multmodp(op, crc1) ^ (crc2 & 0xffffffff); +} + +#endif /* Z_FREETYPE */ diff --git a/external/freetype/src/gzip/crc32.h b/external/freetype/src/gzip/crc32.h new file mode 100644 index 000000000..137df68d6 --- /dev/null +++ b/external/freetype/src/gzip/crc32.h @@ -0,0 +1,9446 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}; + +#ifdef W + +#if W == 8 + +local const z_word_t FAR crc_big_table[] = { + 0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}; + +#else /* W == 4 */ + +local const z_word_t FAR crc_big_table[] = { + 0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}; + +#endif + +#if N == 1 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}, + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}, + {0x0000000000000000, 0x41311b1900000000, 0x8262363200000000, + 0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000, + 0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000, + 0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000, + 0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000, + 0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000, + 0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000, + 0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000, + 0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000, + 0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000, + 0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000, + 0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000, + 0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000, + 0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000, + 0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000, + 0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000, + 0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000, + 0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000, + 0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000, + 0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000, + 0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000, + 0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000, + 0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000, + 0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000, + 0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000, + 0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000, + 0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000, + 0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000, + 0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000, + 0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000, + 0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000, + 0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000, + 0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000, + 0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000, + 0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000, + 0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000, + 0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000, + 0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000, + 0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000, + 0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000, + 0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000, + 0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000, + 0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000, + 0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000, + 0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000, + 0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000, + 0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000, + 0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000, + 0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000, + 0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000, + 0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000, + 0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000, + 0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000, + 0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000, + 0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000, + 0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000, + 0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000, + 0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000, + 0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000, + 0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000, + 0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000, + 0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000, + 0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000, + 0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000, + 0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000, + 0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000, + 0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000, + 0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000, + 0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000, + 0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000, + 0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000, + 0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000, + 0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000, + 0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000, + 0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000, + 0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000, + 0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000, + 0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000, + 0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000, + 0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000, + 0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000, + 0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000, + 0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000, + 0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000, + 0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000, + 0x72fd249300000000}, + {0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000, + 0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000, + 0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000, + 0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000, + 0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000, + 0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000, + 0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000, + 0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000, + 0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000, + 0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000, + 0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000, + 0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000, + 0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000, + 0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000, + 0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000, + 0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000, + 0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000, + 0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000, + 0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000, + 0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000, + 0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000, + 0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000, + 0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000, + 0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000, + 0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000, + 0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000, + 0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000, + 0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000, + 0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000, + 0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000, + 0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000, + 0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000, + 0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000, + 0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000, + 0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000, + 0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000, + 0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000, + 0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000, + 0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000, + 0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000, + 0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000, + 0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000, + 0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000, + 0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000, + 0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000, + 0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000, + 0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000, + 0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000, + 0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000, + 0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000, + 0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000, + 0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000, + 0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000, + 0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000, + 0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000, + 0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000, + 0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000, + 0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000, + 0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000, + 0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000, + 0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000, + 0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000, + 0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000, + 0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000, + 0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000, + 0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000, + 0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000, + 0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000, + 0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000, + 0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000, + 0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000, + 0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000, + 0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000, + 0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000, + 0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000, + 0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000, + 0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000, + 0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000, + 0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000, + 0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000, + 0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000, + 0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000, + 0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000, + 0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000, + 0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000, + 0xed3498be00000000}, + {0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000, + 0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000, + 0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000, + 0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000, + 0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000, + 0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000, + 0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000, + 0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000, + 0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000, + 0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000, + 0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000, + 0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000, + 0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000, + 0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000, + 0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000, + 0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000, + 0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000, + 0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000, + 0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000, + 0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000, + 0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000, + 0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000, + 0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000, + 0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000, + 0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000, + 0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000, + 0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000, + 0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000, + 0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000, + 0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000, + 0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000, + 0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000, + 0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000, + 0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000, + 0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000, + 0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000, + 0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000, + 0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000, + 0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000, + 0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000, + 0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000, + 0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000, + 0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000, + 0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000, + 0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000, + 0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000, + 0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000, + 0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000, + 0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000, + 0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000, + 0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000, + 0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000, + 0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000, + 0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000, + 0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000, + 0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000, + 0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000, + 0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000, + 0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000, + 0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000, + 0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000, + 0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000, + 0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000, + 0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000, + 0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000, + 0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000, + 0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000, + 0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000, + 0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000, + 0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000, + 0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000, + 0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000, + 0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000, + 0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000, + 0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000, + 0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000, + 0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000, + 0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000, + 0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000, + 0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000, + 0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000, + 0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000, + 0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000, + 0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000, + 0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000, + 0xf10605de00000000}, + {0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000, + 0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000, + 0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000, + 0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000, + 0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000, + 0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000, + 0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000, + 0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000, + 0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000, + 0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000, + 0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000, + 0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000, + 0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000, + 0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000, + 0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000, + 0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000, + 0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000, + 0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000, + 0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000, + 0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000, + 0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000, + 0x572f712300000000, 0x4958f35800000000, 0xf971936500000000, + 0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000, + 0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000, + 0x8813836800000000, 0x383ae35500000000, 0xe840431200000000, + 0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000, + 0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000, + 0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000, + 0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000, + 0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000, + 0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000, + 0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000, + 0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000, + 0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000, + 0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000, + 0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000, + 0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000, + 0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000, + 0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000, + 0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000, + 0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000, + 0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000, + 0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000, + 0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000, + 0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000, + 0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000, + 0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000, + 0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000, + 0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000, + 0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000, + 0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000, + 0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000, + 0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000, + 0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000, + 0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000, + 0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000, + 0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000, + 0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000, + 0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000, + 0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000, + 0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000, + 0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000, + 0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000, + 0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000, + 0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000, + 0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000, + 0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000, + 0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000, + 0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000, + 0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000, + 0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000, + 0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000, + 0x983485b900000000, 0x281de58400000000, 0xf86745c300000000, + 0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000, + 0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000, + 0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000, + 0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000, + 0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000, + 0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000, + 0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000, + 0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000, + 0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000, + 0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000, + 0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000, + 0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000, + 0x8cc764ca00000000}, + {0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000, + 0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000, + 0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000, + 0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000, + 0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000, + 0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000, + 0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000, + 0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000, + 0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000, + 0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000, + 0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000, + 0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000, + 0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000, + 0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000, + 0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000, + 0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000, + 0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000, + 0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000, + 0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000, + 0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000, + 0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000, + 0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000, + 0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000, + 0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000, + 0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000, + 0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000, + 0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000, + 0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000, + 0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000, + 0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000, + 0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000, + 0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000, + 0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000, + 0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000, + 0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000, + 0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000, + 0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000, + 0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000, + 0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000, + 0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000, + 0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000, + 0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000, + 0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000, + 0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000, + 0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000, + 0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000, + 0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000, + 0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000, + 0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000, + 0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000, + 0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000, + 0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000, + 0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000, + 0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000, + 0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000, + 0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000, + 0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000, + 0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000, + 0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000, + 0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000, + 0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000, + 0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000, + 0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000, + 0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000, + 0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000, + 0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000, + 0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000, + 0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000, + 0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000, + 0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000, + 0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000, + 0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000, + 0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000, + 0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000, + 0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000, + 0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000, + 0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000, + 0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000, + 0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000, + 0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000, + 0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000, + 0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000, + 0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000, + 0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000, + 0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000, + 0xccabc4e400000000}, + {0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000, + 0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000, + 0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000, + 0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000, + 0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000, + 0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000, + 0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000, + 0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000, + 0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000, + 0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000, + 0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000, + 0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000, + 0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000, + 0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000, + 0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000, + 0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000, + 0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000, + 0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000, + 0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000, + 0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000, + 0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000, + 0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000, + 0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000, + 0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000, + 0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000, + 0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000, + 0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000, + 0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000, + 0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000, + 0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000, + 0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000, + 0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000, + 0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000, + 0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000, + 0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000, + 0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000, + 0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000, + 0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000, + 0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000, + 0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000, + 0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000, + 0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000, + 0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000, + 0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000, + 0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000, + 0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000, + 0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000, + 0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000, + 0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000, + 0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000, + 0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000, + 0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000, + 0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000, + 0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000, + 0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000, + 0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000, + 0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000, + 0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000, + 0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000, + 0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000, + 0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000, + 0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000, + 0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000, + 0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000, + 0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000, + 0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000, + 0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000, + 0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000, + 0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000, + 0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000, + 0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000, + 0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000, + 0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000, + 0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000, + 0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000, + 0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000, + 0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000, + 0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000, + 0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000, + 0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000, + 0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000, + 0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000, + 0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000, + 0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000, + 0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000, + 0x304a369200000000}, + {0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000, + 0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000, + 0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000, + 0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000, + 0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000, + 0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000, + 0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000, + 0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000, + 0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000, + 0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000, + 0x1923316900000000, 0x87239ba500000000, 0x566276f900000000, + 0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000, + 0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000, + 0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000, + 0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000, + 0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000, + 0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000, + 0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000, + 0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000, + 0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000, + 0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000, + 0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000, + 0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000, + 0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000, + 0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000, + 0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000, + 0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000, + 0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000, + 0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000, + 0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000, + 0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000, + 0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000, + 0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000, + 0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000, + 0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000, + 0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000, + 0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000, + 0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000, + 0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000, + 0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000, + 0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000, + 0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000, + 0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000, + 0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000, + 0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000, + 0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000, + 0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000, + 0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000, + 0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000, + 0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000, + 0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000, + 0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000, + 0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000, + 0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000, + 0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000, + 0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000, + 0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000, + 0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000, + 0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000, + 0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000, + 0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000, + 0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000, + 0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000, + 0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000, + 0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000, + 0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000, + 0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000, + 0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000, + 0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000, + 0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000, + 0x6171384400000000, 0xff71928800000000, 0xe678578200000000, + 0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000, + 0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000, + 0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000, + 0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000, + 0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000, + 0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000, + 0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000, + 0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000, + 0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000, + 0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000, + 0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000, + 0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000, + 0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000, + 0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000, + 0xe6064b2600000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}, + {0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64, + 0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1, + 0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e, + 0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61, + 0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82, + 0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff, + 0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7, + 0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da, + 0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139, + 0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6, + 0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89, + 0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c, + 0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0, + 0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d, + 0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a, + 0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177, + 0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de, + 0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b, + 0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824, + 0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e, + 0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad, + 0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0, + 0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d, + 0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60, + 0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83, + 0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822, + 0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d, + 0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8, + 0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171, + 0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c, + 0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b, + 0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6, + 0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca, + 0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f, + 0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430, + 0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf, + 0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c, + 0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51, + 0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9, + 0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84, + 0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67, + 0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398, + 0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7, + 0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62, + 0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e, + 0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923, + 0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4, + 0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9, + 0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070, + 0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5, + 0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a, + 0x72fd2493}, + {0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907, + 0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f, + 0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a, + 0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e, + 0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512, + 0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14, + 0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b, + 0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d, + 0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731, + 0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925, + 0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620, + 0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28, + 0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70, + 0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176, + 0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d, + 0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b, + 0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b, + 0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63, + 0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266, + 0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a, + 0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446, + 0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40, + 0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557, + 0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51, + 0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d, + 0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0, + 0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5, + 0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed, + 0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd, + 0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb, + 0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0, + 0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6, + 0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de, + 0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6, + 0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3, + 0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7, + 0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb, + 0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd, + 0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92, + 0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094, + 0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598, + 0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c, + 0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489, + 0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81, + 0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9, + 0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af, + 0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4, + 0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2, + 0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2, + 0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba, + 0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf, + 0xed3498be}, + {0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f, + 0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d, + 0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0, + 0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42, + 0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95, + 0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2, + 0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a, + 0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d, + 0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea, + 0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748, + 0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5, + 0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27, + 0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b, + 0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac, + 0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4, + 0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3, + 0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44, + 0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6, + 0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b, + 0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329, + 0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe, + 0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9, + 0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1, + 0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6, + 0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921, + 0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555, + 0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8, + 0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a, + 0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd, + 0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a, + 0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2, + 0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5, + 0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2, + 0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330, + 0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad, + 0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f, + 0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8, + 0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef, + 0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc, + 0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb, + 0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c, + 0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e, + 0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03, + 0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1, + 0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6, + 0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1, + 0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9, + 0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e, + 0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409, + 0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb, + 0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966, + 0xf10605de}}; + +#endif + +#endif + +#if N == 2 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}, + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000, + 0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000, + 0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000, + 0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000, + 0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000, + 0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000, + 0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000, + 0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000, + 0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000, + 0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000, + 0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000, + 0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000, + 0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000, + 0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000, + 0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000, + 0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000, + 0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000, + 0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000, + 0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000, + 0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000, + 0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000, + 0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000, + 0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000, + 0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000, + 0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000, + 0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000, + 0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000, + 0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000, + 0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000, + 0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000, + 0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000, + 0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000, + 0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000, + 0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000, + 0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000, + 0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000, + 0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000, + 0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000, + 0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000, + 0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000, + 0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000, + 0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000, + 0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000, + 0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000, + 0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000, + 0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000, + 0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000, + 0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000, + 0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000, + 0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000, + 0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000, + 0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000, + 0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000, + 0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000, + 0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000, + 0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000, + 0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000, + 0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000, + 0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000, + 0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000, + 0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000, + 0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000, + 0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000, + 0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000, + 0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000, + 0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000, + 0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000, + 0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000, + 0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000, + 0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000, + 0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000, + 0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000, + 0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000, + 0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000, + 0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000, + 0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000, + 0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000, + 0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000, + 0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000, + 0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000, + 0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000, + 0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000, + 0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000, + 0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000, + 0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000, + 0x4b0c4f4900000000}, + {0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000, + 0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000, + 0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000, + 0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000, + 0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000, + 0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000, + 0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000, + 0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000, + 0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000, + 0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000, + 0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000, + 0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000, + 0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000, + 0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000, + 0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000, + 0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000, + 0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000, + 0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000, + 0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000, + 0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000, + 0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000, + 0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000, + 0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000, + 0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000, + 0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000, + 0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000, + 0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000, + 0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000, + 0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000, + 0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000, + 0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000, + 0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000, + 0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000, + 0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000, + 0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000, + 0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000, + 0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000, + 0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000, + 0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000, + 0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000, + 0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000, + 0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000, + 0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000, + 0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000, + 0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000, + 0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000, + 0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000, + 0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000, + 0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000, + 0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000, + 0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000, + 0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000, + 0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000, + 0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000, + 0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000, + 0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000, + 0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000, + 0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000, + 0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000, + 0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000, + 0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000, + 0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000, + 0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000, + 0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000, + 0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000, + 0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000, + 0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000, + 0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000, + 0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000, + 0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000, + 0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000, + 0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000, + 0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000, + 0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000, + 0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000, + 0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000, + 0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000, + 0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000, + 0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000, + 0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000, + 0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000, + 0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000, + 0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000, + 0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000, + 0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000, + 0x14d747e100000000}, + {0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000, + 0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000, + 0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000, + 0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000, + 0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000, + 0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000, + 0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000, + 0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000, + 0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000, + 0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000, + 0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000, + 0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000, + 0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000, + 0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000, + 0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000, + 0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000, + 0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000, + 0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000, + 0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000, + 0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000, + 0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000, + 0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000, + 0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000, + 0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000, + 0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000, + 0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000, + 0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000, + 0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000, + 0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000, + 0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000, + 0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000, + 0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000, + 0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000, + 0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000, + 0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000, + 0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000, + 0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000, + 0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000, + 0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000, + 0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000, + 0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000, + 0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000, + 0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000, + 0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000, + 0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000, + 0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000, + 0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000, + 0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000, + 0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000, + 0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000, + 0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000, + 0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000, + 0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000, + 0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000, + 0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000, + 0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000, + 0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000, + 0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000, + 0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000, + 0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000, + 0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000, + 0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000, + 0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000, + 0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000, + 0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000, + 0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000, + 0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000, + 0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000, + 0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000, + 0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000, + 0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000, + 0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000, + 0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000, + 0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000, + 0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000, + 0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000, + 0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000, + 0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000, + 0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000, + 0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000, + 0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000, + 0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000, + 0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000, + 0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000, + 0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000, + 0xaa933b1a00000000}, + {0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000, + 0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000, + 0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000, + 0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000, + 0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000, + 0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000, + 0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000, + 0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000, + 0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000, + 0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000, + 0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000, + 0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000, + 0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000, + 0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000, + 0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000, + 0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000, + 0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000, + 0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000, + 0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000, + 0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000, + 0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000, + 0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000, + 0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000, + 0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000, + 0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000, + 0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000, + 0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000, + 0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000, + 0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000, + 0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000, + 0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000, + 0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000, + 0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000, + 0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000, + 0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000, + 0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000, + 0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000, + 0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000, + 0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000, + 0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000, + 0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000, + 0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000, + 0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000, + 0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000, + 0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000, + 0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000, + 0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000, + 0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000, + 0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000, + 0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000, + 0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000, + 0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000, + 0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000, + 0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000, + 0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000, + 0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000, + 0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000, + 0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000, + 0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000, + 0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000, + 0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000, + 0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000, + 0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000, + 0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000, + 0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000, + 0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000, + 0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000, + 0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000, + 0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000, + 0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000, + 0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000, + 0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000, + 0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000, + 0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000, + 0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000, + 0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000, + 0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000, + 0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000, + 0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000, + 0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000, + 0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000, + 0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000, + 0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000, + 0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000, + 0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000, + 0x6571193600000000}, + {0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000, + 0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000, + 0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000, + 0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000, + 0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000, + 0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000, + 0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000, + 0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000, + 0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000, + 0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000, + 0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000, + 0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000, + 0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000, + 0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000, + 0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000, + 0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000, + 0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000, + 0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000, + 0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000, + 0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000, + 0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000, + 0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000, + 0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000, + 0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000, + 0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000, + 0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000, + 0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000, + 0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000, + 0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000, + 0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000, + 0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000, + 0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000, + 0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000, + 0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000, + 0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000, + 0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000, + 0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000, + 0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000, + 0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000, + 0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000, + 0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000, + 0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000, + 0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000, + 0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000, + 0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000, + 0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000, + 0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000, + 0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000, + 0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000, + 0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000, + 0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000, + 0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000, + 0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000, + 0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000, + 0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000, + 0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000, + 0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000, + 0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000, + 0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000, + 0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000, + 0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000, + 0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000, + 0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000, + 0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000, + 0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000, + 0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000, + 0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000, + 0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000, + 0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000, + 0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000, + 0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000, + 0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000, + 0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000, + 0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000, + 0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000, + 0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000, + 0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000, + 0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000, + 0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000, + 0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000, + 0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000, + 0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000, + 0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000, + 0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000, + 0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000, + 0xa68cee3d00000000}, + {0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000, + 0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000, + 0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000, + 0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000, + 0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000, + 0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000, + 0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000, + 0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000, + 0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000, + 0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000, + 0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000, + 0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000, + 0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000, + 0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000, + 0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000, + 0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000, + 0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000, + 0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000, + 0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000, + 0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000, + 0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000, + 0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000, + 0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000, + 0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000, + 0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000, + 0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000, + 0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000, + 0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000, + 0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000, + 0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000, + 0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000, + 0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000, + 0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000, + 0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000, + 0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000, + 0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000, + 0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000, + 0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000, + 0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000, + 0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000, + 0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000, + 0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000, + 0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000, + 0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000, + 0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000, + 0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000, + 0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000, + 0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000, + 0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000, + 0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000, + 0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000, + 0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000, + 0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000, + 0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000, + 0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000, + 0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000, + 0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000, + 0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000, + 0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000, + 0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000, + 0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000, + 0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000, + 0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000, + 0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000, + 0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000, + 0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000, + 0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000, + 0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000, + 0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000, + 0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000, + 0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000, + 0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000, + 0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000, + 0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000, + 0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000, + 0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000, + 0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000, + 0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000, + 0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000, + 0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000, + 0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000, + 0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000, + 0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000, + 0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000, + 0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000, + 0x51e8883f00000000}, + {0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000, + 0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000, + 0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000, + 0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000, + 0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000, + 0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000, + 0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000, + 0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000, + 0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000, + 0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000, + 0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000, + 0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000, + 0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000, + 0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000, + 0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000, + 0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000, + 0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000, + 0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000, + 0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000, + 0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000, + 0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000, + 0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000, + 0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000, + 0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000, + 0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000, + 0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000, + 0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000, + 0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000, + 0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000, + 0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000, + 0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000, + 0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000, + 0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000, + 0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000, + 0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000, + 0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000, + 0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000, + 0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000, + 0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000, + 0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000, + 0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000, + 0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000, + 0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000, + 0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000, + 0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000, + 0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000, + 0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000, + 0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000, + 0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000, + 0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000, + 0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000, + 0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000, + 0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000, + 0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000, + 0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000, + 0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000, + 0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000, + 0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000, + 0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000, + 0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000, + 0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000, + 0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000, + 0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000, + 0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000, + 0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000, + 0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000, + 0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000, + 0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000, + 0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000, + 0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000, + 0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000, + 0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000, + 0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000, + 0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000, + 0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000, + 0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000, + 0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000, + 0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000, + 0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000, + 0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000, + 0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000, + 0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000, + 0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000, + 0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000, + 0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000, + 0x8ae9531c00000000}, + {0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000, + 0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000, + 0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000, + 0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000, + 0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000, + 0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000, + 0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000, + 0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000, + 0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000, + 0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000, + 0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000, + 0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000, + 0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000, + 0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000, + 0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000, + 0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000, + 0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000, + 0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000, + 0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000, + 0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000, + 0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000, + 0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000, + 0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000, + 0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000, + 0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000, + 0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000, + 0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000, + 0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000, + 0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000, + 0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000, + 0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000, + 0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000, + 0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000, + 0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000, + 0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000, + 0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000, + 0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000, + 0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000, + 0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000, + 0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000, + 0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000, + 0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000, + 0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000, + 0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000, + 0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000, + 0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000, + 0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000, + 0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000, + 0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000, + 0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000, + 0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000, + 0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000, + 0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000, + 0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000, + 0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000, + 0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000, + 0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000, + 0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000, + 0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000, + 0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000, + 0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000, + 0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000, + 0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000, + 0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000, + 0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000, + 0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000, + 0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000, + 0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000, + 0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000, + 0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000, + 0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000, + 0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000, + 0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000, + 0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000, + 0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000, + 0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000, + 0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000, + 0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000, + 0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000, + 0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000, + 0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000, + 0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000, + 0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000, + 0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000, + 0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000, + 0xd739710d00000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5, + 0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d, + 0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf, + 0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027, + 0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050, + 0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098, + 0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb, + 0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173, + 0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104, + 0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c, + 0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e, + 0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6, + 0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358, + 0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390, + 0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312, + 0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da, + 0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd, + 0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335, + 0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387, + 0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de, + 0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9, + 0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261, + 0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283, + 0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b, + 0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c, + 0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c, + 0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e, + 0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6, + 0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1, + 0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619, + 0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b, + 0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653, + 0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785, + 0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d, + 0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf, + 0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757, + 0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720, + 0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8, + 0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593, + 0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b, + 0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c, + 0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4, + 0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506, + 0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe, + 0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428, + 0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0, + 0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462, + 0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa, + 0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd, + 0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445, + 0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7, + 0x8cc764ca}, + {0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b, + 0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27, + 0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a, + 0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285, + 0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef, + 0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf, + 0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a, + 0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a, + 0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70, + 0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf, + 0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2, + 0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e, + 0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f, + 0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f, + 0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae, + 0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe, + 0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97, + 0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b, + 0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436, + 0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e, + 0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4, + 0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4, + 0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46, + 0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716, + 0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c, + 0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5, + 0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8, + 0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774, + 0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d, + 0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d, + 0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc, + 0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec, + 0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82, + 0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e, + 0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623, + 0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c, + 0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6, + 0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6, + 0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c, + 0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c, + 0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66, + 0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9, + 0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4, + 0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978, + 0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416, + 0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946, + 0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7, + 0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7, + 0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e, + 0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32, + 0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f, + 0xccabc4e4}, + {0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4, + 0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895, + 0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50, + 0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656, + 0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154, + 0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906, + 0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258, + 0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a, + 0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08, + 0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e, + 0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb, + 0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa, + 0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44, + 0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316, + 0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0, + 0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2, + 0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7, + 0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6, + 0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73, + 0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba, + 0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8, + 0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea, + 0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b, + 0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29, + 0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b, + 0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e, + 0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb, + 0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a, + 0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef, + 0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd, + 0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b, + 0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019, + 0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3, + 0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2, + 0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417, + 0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11, + 0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13, + 0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241, + 0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b, + 0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09, + 0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b, + 0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d, + 0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8, + 0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9, + 0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003, + 0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851, + 0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7, + 0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5, + 0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190, + 0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1, + 0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134, + 0x304a3692}, + {0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84, + 0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f, + 0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15, + 0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2, + 0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf, + 0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7, + 0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb, + 0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3, + 0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae, + 0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749, + 0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243, + 0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8, + 0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29, + 0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61, + 0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8, + 0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0, + 0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1, + 0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a, + 0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40, + 0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e, + 0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03, + 0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b, + 0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee, + 0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6, + 0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb, + 0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f, + 0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495, + 0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e, + 0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f, + 0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067, + 0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be, + 0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6, + 0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e, + 0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5, + 0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf, + 0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958, + 0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305, + 0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d, + 0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338, + 0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370, + 0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d, + 0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca, + 0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0, + 0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b, + 0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083, + 0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb, + 0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012, + 0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a, + 0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b, + 0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0, + 0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea, + 0xe6064b26}}; + +#endif + +#endif + +#if N == 3 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}, + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000, + 0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000, + 0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000, + 0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000, + 0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000, + 0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000, + 0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000, + 0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000, + 0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000, + 0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000, + 0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000, + 0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000, + 0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000, + 0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000, + 0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000, + 0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000, + 0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000, + 0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000, + 0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000, + 0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000, + 0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000, + 0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000, + 0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000, + 0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000, + 0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000, + 0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000, + 0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000, + 0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000, + 0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000, + 0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000, + 0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000, + 0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000, + 0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000, + 0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000, + 0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000, + 0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000, + 0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000, + 0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000, + 0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000, + 0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000, + 0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000, + 0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000, + 0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000, + 0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000, + 0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000, + 0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000, + 0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000, + 0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000, + 0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000, + 0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000, + 0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000, + 0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000, + 0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000, + 0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000, + 0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000, + 0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000, + 0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000, + 0x08eda52100000000, 0x4391370100000000, 0x005a918600000000, + 0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000, + 0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000, + 0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000, + 0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000, + 0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000, + 0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000, + 0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000, + 0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000, + 0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000, + 0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000, + 0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000, + 0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000, + 0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000, + 0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000, + 0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000, + 0x7b23114500000000, 0x305f836500000000, 0x739425e200000000, + 0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000, + 0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000, + 0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000, + 0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000, + 0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000, + 0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000, + 0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000, + 0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000, + 0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000, + 0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000, + 0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000, + 0x4e36ba1800000000}, + {0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000, + 0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000, + 0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000, + 0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000, + 0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000, + 0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000, + 0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000, + 0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000, + 0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000, + 0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000, + 0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000, + 0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000, + 0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000, + 0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000, + 0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000, + 0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000, + 0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000, + 0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000, + 0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000, + 0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000, + 0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000, + 0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000, + 0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000, + 0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000, + 0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000, + 0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000, + 0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000, + 0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000, + 0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000, + 0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000, + 0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000, + 0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000, + 0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000, + 0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000, + 0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000, + 0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000, + 0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000, + 0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000, + 0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000, + 0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000, + 0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000, + 0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000, + 0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000, + 0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000, + 0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000, + 0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000, + 0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000, + 0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000, + 0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000, + 0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000, + 0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000, + 0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000, + 0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000, + 0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000, + 0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000, + 0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000, + 0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000, + 0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000, + 0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000, + 0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000, + 0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000, + 0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000, + 0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000, + 0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000, + 0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000, + 0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000, + 0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000, + 0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000, + 0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000, + 0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000, + 0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000, + 0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000, + 0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000, + 0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000, + 0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000, + 0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000, + 0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000, + 0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000, + 0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000, + 0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000, + 0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000, + 0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000, + 0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000, + 0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000, + 0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000, + 0xa1d67c9100000000}, + {0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000, + 0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000, + 0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000, + 0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000, + 0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000, + 0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000, + 0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000, + 0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000, + 0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000, + 0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000, + 0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000, + 0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000, + 0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000, + 0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000, + 0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000, + 0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000, + 0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000, + 0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000, + 0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000, + 0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000, + 0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000, + 0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000, + 0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000, + 0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000, + 0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000, + 0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000, + 0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000, + 0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000, + 0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000, + 0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000, + 0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000, + 0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000, + 0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000, + 0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000, + 0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000, + 0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000, + 0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000, + 0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000, + 0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000, + 0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000, + 0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000, + 0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000, + 0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000, + 0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000, + 0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000, + 0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000, + 0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000, + 0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000, + 0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000, + 0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000, + 0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000, + 0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000, + 0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000, + 0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000, + 0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000, + 0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000, + 0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000, + 0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000, + 0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000, + 0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000, + 0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000, + 0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000, + 0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000, + 0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000, + 0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000, + 0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000, + 0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000, + 0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000, + 0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000, + 0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000, + 0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000, + 0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000, + 0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000, + 0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000, + 0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000, + 0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000, + 0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000, + 0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000, + 0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000, + 0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000, + 0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000, + 0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000, + 0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000, + 0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000, + 0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000, + 0xa8ef40a100000000}, + {0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000, + 0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000, + 0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000, + 0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000, + 0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000, + 0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000, + 0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000, + 0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000, + 0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000, + 0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000, + 0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000, + 0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000, + 0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000, + 0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000, + 0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000, + 0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000, + 0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000, + 0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000, + 0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000, + 0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000, + 0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000, + 0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000, + 0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000, + 0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000, + 0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000, + 0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000, + 0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000, + 0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000, + 0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000, + 0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000, + 0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000, + 0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000, + 0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000, + 0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000, + 0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000, + 0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000, + 0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000, + 0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000, + 0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000, + 0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000, + 0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000, + 0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000, + 0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000, + 0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000, + 0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000, + 0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000, + 0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000, + 0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000, + 0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000, + 0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000, + 0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000, + 0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000, + 0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000, + 0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000, + 0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000, + 0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000, + 0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000, + 0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000, + 0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000, + 0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000, + 0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000, + 0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000, + 0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000, + 0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000, + 0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000, + 0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000, + 0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000, + 0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000, + 0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000, + 0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000, + 0x933d017400000000, 0xd506661100000000, 0x46a022f000000000, + 0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000, + 0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000, + 0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000, + 0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000, + 0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000, + 0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000, + 0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000, + 0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000, + 0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000, + 0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000, + 0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000, + 0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000, + 0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000, + 0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000, + 0x356bacd800000000}, + {0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000, + 0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000, + 0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000, + 0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000, + 0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000, + 0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000, + 0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000, + 0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000, + 0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000, + 0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000, + 0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000, + 0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000, + 0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000, + 0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000, + 0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000, + 0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000, + 0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000, + 0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000, + 0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000, + 0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000, + 0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000, + 0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000, + 0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000, + 0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000, + 0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000, + 0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000, + 0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000, + 0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000, + 0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000, + 0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000, + 0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000, + 0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000, + 0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000, + 0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000, + 0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000, + 0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000, + 0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000, + 0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000, + 0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000, + 0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000, + 0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000, + 0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000, + 0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000, + 0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000, + 0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000, + 0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000, + 0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000, + 0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000, + 0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000, + 0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000, + 0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000, + 0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000, + 0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000, + 0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000, + 0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000, + 0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000, + 0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000, + 0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000, + 0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000, + 0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000, + 0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000, + 0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000, + 0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000, + 0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000, + 0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000, + 0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000, + 0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000, + 0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000, + 0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000, + 0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000, + 0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000, + 0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000, + 0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000, + 0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000, + 0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000, + 0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000, + 0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000, + 0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000, + 0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000, + 0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000, + 0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000, + 0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000, + 0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000, + 0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000, + 0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000, + 0x48686b5600000000}, + {0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000, + 0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000, + 0x805af17200000000, 0x403ed96500000000, 0x002643b900000000, + 0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000, + 0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000, + 0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000, + 0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000, + 0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000, + 0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000, + 0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000, + 0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000, + 0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000, + 0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000, + 0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000, + 0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000, + 0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000, + 0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000, + 0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000, + 0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000, + 0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000, + 0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000, + 0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000, + 0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000, + 0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000, + 0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000, + 0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000, + 0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000, + 0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000, + 0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000, + 0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000, + 0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000, + 0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000, + 0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000, + 0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000, + 0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000, + 0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000, + 0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000, + 0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000, + 0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000, + 0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000, + 0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000, + 0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000, + 0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000, + 0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000, + 0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000, + 0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000, + 0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000, + 0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000, + 0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000, + 0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000, + 0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000, + 0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000, + 0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000, + 0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000, + 0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000, + 0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000, + 0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000, + 0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000, + 0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000, + 0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000, + 0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000, + 0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000, + 0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000, + 0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000, + 0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000, + 0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000, + 0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000, + 0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000, + 0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000, + 0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000, + 0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000, + 0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000, + 0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000, + 0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000, + 0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000, + 0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000, + 0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000, + 0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000, + 0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000, + 0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000, + 0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000, + 0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000, + 0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000, + 0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000, + 0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000, + 0xcaa2517800000000}, + {0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000, + 0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000, + 0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000, + 0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000, + 0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000, + 0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000, + 0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000, + 0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000, + 0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000, + 0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000, + 0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000, + 0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000, + 0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000, + 0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000, + 0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000, + 0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000, + 0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000, + 0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000, + 0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000, + 0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000, + 0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000, + 0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000, + 0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000, + 0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000, + 0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000, + 0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000, + 0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000, + 0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000, + 0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000, + 0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000, + 0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000, + 0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000, + 0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000, + 0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000, + 0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000, + 0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000, + 0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000, + 0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000, + 0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000, + 0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000, + 0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000, + 0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000, + 0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000, + 0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000, + 0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000, + 0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000, + 0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000, + 0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000, + 0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000, + 0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000, + 0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000, + 0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000, + 0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000, + 0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000, + 0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000, + 0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000, + 0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000, + 0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000, + 0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000, + 0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000, + 0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000, + 0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000, + 0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000, + 0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000, + 0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000, + 0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000, + 0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000, + 0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000, + 0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000, + 0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000, + 0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000, + 0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000, + 0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000, + 0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000, + 0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000, + 0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000, + 0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000, + 0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000, + 0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000, + 0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000, + 0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000, + 0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000, + 0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000, + 0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000, + 0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000, + 0x0c7ac97b00000000}, + {0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000, + 0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000, + 0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000, + 0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000, + 0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000, + 0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000, + 0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000, + 0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000, + 0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000, + 0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000, + 0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000, + 0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000, + 0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000, + 0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000, + 0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000, + 0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000, + 0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000, + 0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000, + 0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000, + 0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000, + 0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000, + 0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000, + 0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000, + 0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000, + 0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000, + 0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000, + 0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000, + 0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000, + 0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000, + 0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000, + 0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000, + 0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000, + 0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000, + 0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000, + 0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000, + 0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000, + 0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000, + 0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000, + 0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000, + 0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000, + 0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000, + 0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000, + 0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000, + 0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000, + 0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000, + 0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000, + 0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000, + 0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000, + 0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000, + 0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000, + 0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000, + 0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000, + 0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000, + 0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000, + 0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000, + 0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000, + 0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000, + 0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000, + 0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000, + 0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000, + 0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000, + 0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000, + 0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000, + 0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000, + 0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000, + 0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000, + 0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000, + 0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000, + 0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000, + 0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000, + 0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000, + 0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000, + 0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000, + 0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000, + 0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000, + 0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000, + 0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000, + 0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000, + 0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000, + 0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000, + 0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000, + 0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000, + 0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000, + 0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000, + 0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000, + 0x5185cd0900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d, + 0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac, + 0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8, + 0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95, + 0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817, + 0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d, + 0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac, + 0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6, + 0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564, + 0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39, + 0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d, + 0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac, + 0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de, + 0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594, + 0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b, + 0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01, + 0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f, + 0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de, + 0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba, + 0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65, + 0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7, + 0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad, + 0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de, + 0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294, + 0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716, + 0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71, + 0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15, + 0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4, + 0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca, + 0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280, + 0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f, + 0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15, + 0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9, + 0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748, + 0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c, + 0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971, + 0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3, + 0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9, + 0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196, + 0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc, + 0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e, + 0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03, + 0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67, + 0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296, + 0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a, + 0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170, + 0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af, + 0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5, + 0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb, + 0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a, + 0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e, + 0x4b0c4f49}, + {0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09, + 0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc, + 0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e, + 0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc, + 0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934, + 0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2, + 0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b, + 0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad, + 0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155, + 0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187, + 0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65, + 0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390, + 0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e, + 0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378, + 0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889, + 0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f, + 0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0, + 0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145, + 0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7, + 0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a, + 0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2, + 0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924, + 0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2, + 0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514, + 0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec, + 0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709, + 0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb, + 0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e, + 0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1, + 0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227, + 0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6, + 0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030, + 0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0, + 0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55, + 0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7, + 0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165, + 0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d, + 0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b, + 0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c, + 0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a, + 0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362, + 0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0, + 0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52, + 0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7, + 0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237, + 0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1, + 0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020, + 0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6, + 0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719, + 0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec, + 0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e, + 0x14d747e1}, + {0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0, + 0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b, + 0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652, + 0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437, + 0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514, + 0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265, + 0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de, + 0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af, + 0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c, + 0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9, + 0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0, + 0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b, + 0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6, + 0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7, + 0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734, + 0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045, + 0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8, + 0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303, + 0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a, + 0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9, + 0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea, + 0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b, + 0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6, + 0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7, + 0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4, + 0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6, + 0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f, + 0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054, + 0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9, + 0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8, + 0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b, + 0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a, + 0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441, + 0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a, + 0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3, + 0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6, + 0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5, + 0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94, + 0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9, + 0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288, + 0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab, + 0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce, + 0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7, + 0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c, + 0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527, + 0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256, + 0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5, + 0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4, + 0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39, + 0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2, + 0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db, + 0xaa933b1a}, + {0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603, + 0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d, + 0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9, + 0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b, + 0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a, + 0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792, + 0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4, + 0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c, + 0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d, + 0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f, + 0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb, + 0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65, + 0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330, + 0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8, + 0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da, + 0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742, + 0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f, + 0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1, + 0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5, + 0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f, + 0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e, + 0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6, + 0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8, + 0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250, + 0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021, + 0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb, + 0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f, + 0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511, + 0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c, + 0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4, + 0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886, + 0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e, + 0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b, + 0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5, + 0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791, + 0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003, + 0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272, + 0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea, + 0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc, + 0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24, + 0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55, + 0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7, + 0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3, + 0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d, + 0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548, + 0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0, + 0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2, + 0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a, + 0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47, + 0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9, + 0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad, + 0x65711936}}; + +#endif + +#endif + +#if N == 4 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a, + 0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe, + 0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b, + 0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656, + 0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd, + 0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d, + 0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7, + 0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47, + 0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac, + 0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691, + 0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404, + 0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0, + 0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4, + 0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424, + 0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5, + 0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65, + 0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67, + 0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3, + 0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626, + 0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9, + 0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222, + 0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2, + 0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a, + 0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a, + 0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1, + 0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2, + 0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077, + 0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3, + 0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1, + 0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621, + 0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0, + 0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60, + 0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0, + 0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64, + 0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1, + 0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc, + 0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027, + 0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7, + 0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9, + 0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79, + 0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292, + 0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af, + 0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a, + 0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee, + 0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e, + 0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe, + 0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f, + 0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff, + 0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd, + 0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29, + 0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc, + 0xe3c45916}, + {0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344, + 0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59, + 0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e, + 0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463, + 0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98, + 0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d, + 0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3, + 0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656, + 0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad, + 0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0, + 0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397, + 0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a, + 0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2, + 0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357, + 0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8, + 0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d, + 0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696, + 0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b, + 0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc, + 0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0, + 0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b, + 0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be, + 0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811, + 0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384, + 0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f, + 0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955, + 0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362, + 0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f, + 0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94, + 0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701, + 0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe, + 0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b, + 0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1, + 0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc, + 0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b, + 0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986, + 0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d, + 0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8, + 0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4, + 0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371, + 0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a, + 0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87, + 0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0, + 0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad, + 0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527, + 0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2, + 0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d, + 0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998, + 0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73, + 0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e, + 0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59, + 0xa7520488}, + {0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20, + 0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09, + 0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431, + 0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a, + 0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203, + 0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b, + 0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14, + 0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c, + 0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25, + 0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e, + 0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36, + 0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f, + 0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649, + 0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961, + 0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58, + 0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170, + 0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b, + 0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742, + 0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a, + 0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55, + 0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c, + 0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64, + 0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f, + 0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77, + 0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e, + 0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a, + 0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2, + 0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b, + 0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090, + 0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8, + 0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881, + 0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9, + 0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6, + 0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f, + 0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7, + 0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c, + 0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695, + 0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd, + 0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb, + 0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3, + 0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa, + 0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1, + 0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9, + 0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0, + 0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df, + 0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7, + 0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace, + 0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6, + 0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd, + 0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4, + 0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec, + 0x3522e9e4}, + {0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1, + 0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86, + 0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b, + 0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669, + 0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7, + 0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352, + 0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03, + 0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6, + 0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38, + 0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a, + 0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7, + 0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80, + 0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7, + 0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522, + 0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d, + 0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8, + 0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103, + 0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54, + 0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9, + 0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0, + 0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e, + 0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb, + 0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1, + 0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624, + 0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea, + 0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a, + 0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37, + 0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360, + 0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab, + 0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e, + 0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741, + 0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4, + 0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334, + 0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63, + 0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de, + 0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c, + 0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942, + 0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7, + 0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131, + 0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4, + 0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a, + 0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758, + 0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5, + 0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2, + 0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32, + 0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7, + 0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8, + 0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d, + 0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6, + 0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1, + 0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c, + 0x97411e28}, + {0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474, + 0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5, + 0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6, + 0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7, + 0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938, + 0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051, + 0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a, + 0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3, + 0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c, + 0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d, + 0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e, + 0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf, + 0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740, + 0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29, + 0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592, + 0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb, + 0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4, + 0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365, + 0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036, + 0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7, + 0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08, + 0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561, + 0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a, + 0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663, + 0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac, + 0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d, + 0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce, + 0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f, + 0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50, + 0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639, + 0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82, + 0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb, + 0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954, + 0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5, + 0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86, + 0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7, + 0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418, + 0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71, + 0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa, + 0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93, + 0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c, + 0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d, + 0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e, + 0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df, + 0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60, + 0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309, + 0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2, + 0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db, + 0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4, + 0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45, + 0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16, + 0x93c7a00b}, + {0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45, + 0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb, + 0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d, + 0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696, + 0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf, + 0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb, + 0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028, + 0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c, + 0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65, + 0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be, + 0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038, + 0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6, + 0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15, + 0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11, + 0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d, + 0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19, + 0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05, + 0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b, + 0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d, + 0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c, + 0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35, + 0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31, + 0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068, + 0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c, + 0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25, + 0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a, + 0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac, + 0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22, + 0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e, + 0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a, + 0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36, + 0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32, + 0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84, + 0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a, + 0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c, + 0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057, + 0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e, + 0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a, + 0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc, + 0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8, + 0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1, + 0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a, + 0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec, + 0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62, + 0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4, + 0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0, + 0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc, + 0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8, + 0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4, + 0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a, + 0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc, + 0xce5f968d}, + {0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de, + 0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b, + 0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d, + 0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680, + 0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4, + 0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d, + 0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde, + 0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97, + 0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3, + 0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e, + 0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678, + 0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d, + 0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723, + 0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a, + 0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0, + 0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9, + 0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85, + 0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770, + 0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56, + 0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a, + 0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e, + 0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67, + 0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785, + 0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc, + 0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788, + 0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90, + 0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6, + 0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843, + 0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f, + 0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336, + 0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac, + 0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5, + 0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68, + 0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d, + 0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb, + 0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36, + 0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72, + 0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b, + 0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b, + 0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402, + 0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446, + 0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb, + 0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed, + 0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418, + 0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95, + 0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc, + 0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946, + 0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f, + 0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233, + 0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6, + 0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0, + 0x3e721277}, + {0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb, + 0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9, + 0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11, + 0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d, + 0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9, + 0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c, + 0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881, + 0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274, + 0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790, + 0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc, + 0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514, + 0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56, + 0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9, + 0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c, + 0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13, + 0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6, + 0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c, + 0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e, + 0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386, + 0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376, + 0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692, + 0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67, + 0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416, + 0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3, + 0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07, + 0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd, + 0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15, + 0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457, + 0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd, + 0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28, + 0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337, + 0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2, + 0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594, + 0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6, + 0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e, + 0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52, + 0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6, + 0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143, + 0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17, + 0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2, + 0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306, + 0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a, + 0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182, + 0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0, + 0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496, + 0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63, + 0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c, + 0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89, + 0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903, + 0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041, + 0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9, + 0x1c65ace7}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000, + 0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000, + 0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000, + 0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000, + 0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000, + 0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000, + 0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000, + 0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000, + 0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000, + 0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000, + 0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000, + 0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000, + 0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000, + 0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000, + 0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000, + 0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000, + 0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000, + 0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000, + 0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000, + 0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000, + 0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000, + 0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000, + 0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000, + 0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000, + 0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000, + 0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000, + 0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000, + 0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000, + 0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000, + 0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000, + 0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000, + 0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000, + 0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000, + 0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000, + 0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000, + 0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000, + 0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000, + 0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000, + 0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000, + 0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000, + 0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000, + 0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000, + 0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000, + 0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000, + 0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000, + 0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000, + 0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000, + 0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000, + 0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000, + 0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000, + 0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000, + 0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000, + 0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000, + 0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000, + 0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000, + 0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000, + 0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000, + 0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000, + 0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000, + 0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000, + 0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000, + 0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000, + 0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000, + 0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000, + 0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000, + 0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000, + 0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000, + 0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000, + 0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000, + 0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000, + 0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000, + 0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000, + 0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000, + 0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000, + 0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000, + 0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000, + 0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000, + 0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000, + 0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000, + 0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000, + 0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000, + 0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000, + 0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000, + 0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000, + 0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000, + 0xe7ac651c00000000}, + {0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000, + 0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000, + 0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000, + 0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000, + 0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000, + 0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000, + 0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000, + 0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000, + 0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000, + 0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000, + 0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000, + 0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000, + 0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000, + 0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000, + 0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000, + 0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000, + 0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000, + 0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000, + 0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000, + 0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000, + 0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000, + 0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000, + 0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000, + 0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000, + 0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000, + 0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000, + 0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000, + 0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000, + 0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000, + 0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000, + 0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000, + 0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000, + 0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000, + 0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000, + 0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000, + 0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000, + 0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000, + 0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000, + 0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000, + 0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000, + 0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000, + 0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000, + 0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000, + 0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000, + 0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000, + 0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000, + 0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000, + 0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000, + 0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000, + 0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000, + 0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000, + 0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000, + 0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000, + 0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000, + 0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000, + 0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000, + 0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000, + 0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000, + 0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000, + 0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000, + 0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000, + 0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000, + 0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000, + 0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000, + 0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000, + 0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000, + 0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000, + 0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000, + 0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000, + 0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000, + 0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000, + 0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000, + 0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000, + 0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000, + 0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000, + 0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000, + 0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000, + 0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000, + 0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000, + 0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000, + 0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000, + 0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000, + 0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000, + 0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000, + 0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000, + 0x7712723e00000000}, + {0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000, + 0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000, + 0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000, + 0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000, + 0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000, + 0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000, + 0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000, + 0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000, + 0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000, + 0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000, + 0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000, + 0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000, + 0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000, + 0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000, + 0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000, + 0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000, + 0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000, + 0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000, + 0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000, + 0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000, + 0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000, + 0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000, + 0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000, + 0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000, + 0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000, + 0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000, + 0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000, + 0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000, + 0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000, + 0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000, + 0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000, + 0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000, + 0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000, + 0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000, + 0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000, + 0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000, + 0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000, + 0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000, + 0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000, + 0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000, + 0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000, + 0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000, + 0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000, + 0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000, + 0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000, + 0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000, + 0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000, + 0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000, + 0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000, + 0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000, + 0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000, + 0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000, + 0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000, + 0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000, + 0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000, + 0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000, + 0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000, + 0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000, + 0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000, + 0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000, + 0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000, + 0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000, + 0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000, + 0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000, + 0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000, + 0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000, + 0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000, + 0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000, + 0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000, + 0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000, + 0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000, + 0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000, + 0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000, + 0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000, + 0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000, + 0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000, + 0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000, + 0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000, + 0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000, + 0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000, + 0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000, + 0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000, + 0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000, + 0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000, + 0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000, + 0x8d965fce00000000}, + {0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000, + 0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000, + 0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000, + 0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000, + 0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000, + 0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000, + 0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000, + 0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000, + 0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000, + 0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000, + 0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000, + 0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000, + 0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000, + 0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000, + 0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000, + 0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000, + 0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000, + 0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000, + 0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000, + 0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000, + 0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000, + 0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000, + 0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000, + 0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000, + 0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000, + 0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000, + 0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000, + 0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000, + 0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000, + 0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000, + 0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000, + 0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000, + 0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000, + 0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000, + 0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000, + 0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000, + 0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000, + 0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000, + 0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000, + 0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000, + 0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000, + 0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000, + 0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000, + 0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000, + 0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000, + 0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000, + 0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000, + 0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000, + 0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000, + 0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000, + 0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000, + 0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000, + 0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000, + 0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000, + 0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000, + 0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000, + 0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000, + 0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000, + 0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000, + 0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000, + 0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000, + 0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000, + 0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000, + 0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000, + 0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000, + 0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000, + 0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000, + 0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000, + 0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000, + 0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000, + 0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000, + 0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000, + 0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000, + 0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000, + 0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000, + 0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000, + 0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000, + 0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000, + 0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000, + 0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000, + 0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000, + 0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000, + 0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000, + 0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000, + 0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000, + 0x0ba0c79300000000}, + {0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000, + 0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000, + 0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000, + 0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000, + 0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000, + 0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000, + 0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000, + 0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000, + 0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000, + 0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000, + 0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000, + 0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000, + 0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000, + 0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000, + 0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000, + 0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000, + 0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000, + 0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000, + 0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000, + 0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000, + 0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000, + 0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000, + 0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000, + 0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000, + 0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000, + 0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000, + 0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000, + 0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000, + 0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000, + 0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000, + 0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000, + 0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000, + 0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000, + 0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000, + 0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000, + 0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000, + 0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000, + 0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000, + 0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000, + 0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000, + 0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000, + 0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000, + 0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000, + 0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000, + 0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000, + 0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000, + 0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000, + 0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000, + 0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000, + 0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000, + 0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000, + 0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000, + 0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000, + 0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000, + 0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000, + 0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000, + 0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000, + 0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000, + 0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000, + 0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000, + 0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000, + 0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000, + 0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000, + 0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000, + 0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000, + 0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000, + 0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000, + 0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000, + 0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000, + 0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000, + 0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000, + 0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000, + 0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000, + 0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000, + 0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000, + 0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000, + 0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000, + 0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000, + 0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000, + 0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000, + 0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000, + 0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000, + 0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000, + 0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000, + 0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000, + 0x281e419700000000}, + {0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000, + 0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000, + 0x304a428900000000, 0x38a922b500000000, 0x011e763800000000, + 0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000, + 0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000, + 0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000, + 0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000, + 0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000, + 0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000, + 0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000, + 0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000, + 0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000, + 0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000, + 0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000, + 0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000, + 0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000, + 0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000, + 0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000, + 0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000, + 0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000, + 0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000, + 0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000, + 0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000, + 0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000, + 0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000, + 0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000, + 0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000, + 0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000, + 0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000, + 0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000, + 0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000, + 0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000, + 0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000, + 0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000, + 0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000, + 0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000, + 0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000, + 0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000, + 0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000, + 0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000, + 0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000, + 0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000, + 0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000, + 0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000, + 0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000, + 0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000, + 0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000, + 0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000, + 0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000, + 0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000, + 0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000, + 0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000, + 0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000, + 0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000, + 0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000, + 0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000, + 0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000, + 0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000, + 0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000, + 0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000, + 0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000, + 0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000, + 0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000, + 0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000, + 0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000, + 0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000, + 0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000, + 0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000, + 0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000, + 0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000, + 0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000, + 0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000, + 0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000, + 0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000, + 0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000, + 0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000, + 0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000, + 0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000, + 0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000, + 0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000, + 0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000, + 0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000, + 0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000, + 0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000, + 0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000, + 0xe4e9223500000000}, + {0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000, + 0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000, + 0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000, + 0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000, + 0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000, + 0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000, + 0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000, + 0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000, + 0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000, + 0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000, + 0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000, + 0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000, + 0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000, + 0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000, + 0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000, + 0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000, + 0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000, + 0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000, + 0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000, + 0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000, + 0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000, + 0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000, + 0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000, + 0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000, + 0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000, + 0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000, + 0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000, + 0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000, + 0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000, + 0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000, + 0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000, + 0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000, + 0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000, + 0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000, + 0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000, + 0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000, + 0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000, + 0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000, + 0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000, + 0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000, + 0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000, + 0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000, + 0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000, + 0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000, + 0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000, + 0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000, + 0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000, + 0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000, + 0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000, + 0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000, + 0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000, + 0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000, + 0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000, + 0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000, + 0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000, + 0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000, + 0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000, + 0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000, + 0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000, + 0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000, + 0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000, + 0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000, + 0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000, + 0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000, + 0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000, + 0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000, + 0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000, + 0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000, + 0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000, + 0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000, + 0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000, + 0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000, + 0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000, + 0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000, + 0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000, + 0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000, + 0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000, + 0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000, + 0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000, + 0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000, + 0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000, + 0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000, + 0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000, + 0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000, + 0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000, + 0x880452a700000000}, + {0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000, + 0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000, + 0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000, + 0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000, + 0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000, + 0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000, + 0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000, + 0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000, + 0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000, + 0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000, + 0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000, + 0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000, + 0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000, + 0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000, + 0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000, + 0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000, + 0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000, + 0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000, + 0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000, + 0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000, + 0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000, + 0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000, + 0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000, + 0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000, + 0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000, + 0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000, + 0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000, + 0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000, + 0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000, + 0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000, + 0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000, + 0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000, + 0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000, + 0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000, + 0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000, + 0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000, + 0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000, + 0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000, + 0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000, + 0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000, + 0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000, + 0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000, + 0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000, + 0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000, + 0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000, + 0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000, + 0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000, + 0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000, + 0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000, + 0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000, + 0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000, + 0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000, + 0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000, + 0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000, + 0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000, + 0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000, + 0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000, + 0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000, + 0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000, + 0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000, + 0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000, + 0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000, + 0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000, + 0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000, + 0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000, + 0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000, + 0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000, + 0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000, + 0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000, + 0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000, + 0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000, + 0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000, + 0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000, + 0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000, + 0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000, + 0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000, + 0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000, + 0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000, + 0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000, + 0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000, + 0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000, + 0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000, + 0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000, + 0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000, + 0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000, + 0x1659c4e300000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0, + 0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587, + 0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa, + 0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09, + 0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee, + 0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3, + 0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3, + 0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce, + 0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429, + 0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda, + 0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7, + 0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0, + 0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd, + 0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0, + 0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287, + 0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a, + 0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9, + 0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e, + 0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3, + 0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3, + 0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054, + 0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49, + 0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da, + 0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7, + 0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20, + 0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d, + 0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00, + 0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347, + 0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14, + 0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209, + 0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e, + 0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33, + 0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3, + 0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194, + 0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9, + 0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a, + 0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd, + 0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0, + 0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d, + 0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460, + 0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87, + 0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674, + 0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509, + 0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e, + 0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae, + 0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3, + 0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694, + 0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989, + 0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da, + 0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d, + 0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0, + 0xa68cee3d}, + {0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19, + 0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae, + 0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb, + 0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a, + 0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55, + 0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1, + 0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c, + 0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8, + 0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7, + 0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936, + 0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453, + 0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4, + 0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941, + 0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5, + 0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93, + 0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17, + 0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e, + 0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89, + 0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec, + 0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0, + 0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf, + 0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b, + 0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b, + 0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f, + 0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0, + 0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e, + 0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b, + 0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc, + 0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5, + 0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261, + 0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637, + 0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3, + 0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57, + 0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0, + 0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85, + 0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454, + 0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b, + 0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f, + 0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423, + 0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7, + 0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8, + 0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739, + 0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c, + 0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb, + 0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f, + 0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b, + 0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd, + 0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59, + 0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070, + 0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7, + 0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2, + 0x51e8883f}, + {0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a, + 0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276, + 0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed, + 0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55, + 0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b, + 0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8, + 0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320, + 0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413, + 0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd, + 0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75, + 0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee, + 0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312, + 0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca, + 0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9, + 0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad, + 0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e, + 0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504, + 0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8, + 0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63, + 0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353, + 0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d, + 0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be, + 0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae, + 0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d, + 0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943, + 0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7, + 0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c, + 0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390, + 0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a, + 0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239, + 0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d, + 0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e, + 0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c, + 0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0, + 0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b, + 0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93, + 0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d, + 0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e, + 0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c, + 0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f, + 0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1, + 0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579, + 0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2, + 0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e, + 0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c, + 0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f, + 0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b, + 0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158, + 0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2, + 0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e, + 0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5, + 0x8ae9531c}, + {0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4, + 0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd, + 0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220, + 0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf, + 0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495, + 0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def, + 0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90, + 0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea, + 0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0, + 0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f, + 0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2, + 0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab, + 0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e, + 0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754, + 0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda, + 0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0, + 0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c, + 0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215, + 0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8, + 0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910, + 0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a, + 0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30, + 0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658, + 0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22, + 0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478, + 0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2, + 0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f, + 0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606, + 0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba, + 0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0, + 0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e, + 0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034, + 0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f, + 0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996, + 0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b, + 0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84, + 0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de, + 0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4, + 0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5, + 0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f, + 0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5, + 0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a, + 0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7, + 0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce, + 0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65, + 0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f, + 0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91, + 0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb, + 0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57, + 0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e, + 0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3, + 0xd739710d}}; + +#endif + +#endif + +#if N == 5 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df, + 0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8, + 0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef, + 0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376, + 0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201, + 0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399, + 0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372, + 0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea, + 0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d, + 0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004, + 0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353, + 0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334, + 0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a, + 0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2, + 0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a, + 0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2, + 0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b, + 0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c, + 0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b, + 0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f, + 0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338, + 0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0, + 0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6, + 0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e, + 0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319, + 0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3, + 0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4, + 0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783, + 0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a, + 0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492, + 0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a, + 0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2, + 0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496, + 0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1, + 0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6, + 0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f, + 0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548, + 0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0, + 0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741, + 0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9, + 0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae, + 0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437, + 0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760, + 0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707, + 0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433, + 0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab, + 0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703, + 0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b, + 0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412, + 0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475, + 0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722, + 0xe9947565}, + {0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5, + 0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22, + 0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c, + 0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed, + 0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d, + 0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1, + 0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e, + 0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32, + 0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142, + 0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93, + 0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d, + 0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a, + 0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58, + 0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14, + 0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81, + 0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd, + 0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab, + 0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c, + 0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72, + 0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f, + 0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff, + 0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3, + 0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30, + 0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c, + 0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c, + 0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558, + 0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146, + 0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581, + 0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7, + 0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab, + 0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e, + 0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272, + 0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838, + 0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff, + 0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1, + 0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330, + 0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840, + 0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c, + 0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb, + 0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7, + 0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7, + 0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616, + 0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208, + 0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf, + 0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85, + 0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9, + 0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c, + 0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10, + 0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76, + 0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1, + 0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf, + 0xf7d05006}, + {0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b, + 0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774, + 0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58, + 0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a, + 0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb, + 0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952, + 0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e, + 0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7, + 0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746, + 0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14, + 0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338, + 0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907, + 0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777, + 0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de, + 0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064, + 0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd, + 0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951, + 0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e, + 0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42, + 0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b, + 0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a, + 0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3, + 0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904, + 0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad, + 0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c, + 0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d, + 0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861, + 0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e, + 0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2, + 0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b, + 0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1, + 0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78, + 0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f, + 0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40, + 0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c, + 0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e, + 0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf, + 0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166, + 0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d, + 0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4, + 0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805, + 0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157, + 0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b, + 0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644, + 0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43, + 0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea, + 0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850, + 0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9, + 0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165, + 0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a, + 0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676, + 0xb2075b94}, + {0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf, + 0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61, + 0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be, + 0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd, + 0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3, + 0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063, + 0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105, + 0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5, + 0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb, + 0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8, + 0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07, + 0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9, + 0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5, + 0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515, + 0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4, + 0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014, + 0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7, + 0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269, + 0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6, + 0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af, + 0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1, + 0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111, + 0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d, + 0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad, + 0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3, + 0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75, + 0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa, + 0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74, + 0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7, + 0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477, + 0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6, + 0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176, + 0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af, + 0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71, + 0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae, + 0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd, + 0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3, + 0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073, + 0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0, + 0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400, + 0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e, + 0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d, + 0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2, + 0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c, + 0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5, + 0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505, + 0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4, + 0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004, + 0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7, + 0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279, + 0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6, + 0xba50bcb9}, + {0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897, + 0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb, + 0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2, + 0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2, + 0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372, + 0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70, + 0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92, + 0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190, + 0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40, + 0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430, + 0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759, + 0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75, + 0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2, + 0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0, + 0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7, + 0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5, + 0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39, + 0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215, + 0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c, + 0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5, + 0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625, + 0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27, + 0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c, + 0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e, + 0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee, + 0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71, + 0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18, + 0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134, + 0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8, + 0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba, + 0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd, + 0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff, + 0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a, + 0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6, + 0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf, + 0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf, + 0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f, + 0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d, + 0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d, + 0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f, + 0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af, + 0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df, + 0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6, + 0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a, + 0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef, + 0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed, + 0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa, + 0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8, + 0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624, + 0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08, + 0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861, + 0x808abcf4}, + {0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2, + 0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd, + 0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76, + 0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52, + 0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e, + 0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124, + 0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147, + 0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d, + 0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31, + 0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15, + 0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae, + 0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1, + 0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d, + 0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307, + 0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9, + 0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3, + 0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084, + 0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb, + 0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850, + 0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2, + 0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe, + 0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94, + 0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261, + 0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b, + 0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917, + 0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53, + 0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8, + 0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787, + 0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0, + 0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba, + 0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404, + 0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e, + 0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af, + 0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0, + 0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b, + 0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f, + 0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543, + 0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129, + 0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627, + 0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d, + 0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51, + 0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75, + 0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce, + 0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1, + 0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760, + 0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a, + 0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4, + 0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde, + 0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089, + 0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6, + 0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d, + 0xefdb3f95}, + {0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8, + 0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7, + 0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945, + 0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9, + 0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652, + 0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc, + 0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a, + 0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4, + 0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f, + 0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3, + 0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51, + 0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e, + 0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c, + 0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362, + 0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11, + 0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff, + 0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7, + 0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8, + 0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a, + 0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690, + 0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b, + 0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5, + 0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05, + 0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb, + 0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740, + 0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f, + 0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded, + 0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2, + 0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa, + 0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714, + 0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67, + 0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89, + 0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7, + 0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8, + 0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a, + 0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6, + 0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d, + 0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3, + 0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9, + 0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57, + 0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc, + 0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540, + 0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2, + 0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd, + 0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93, + 0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d, + 0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e, + 0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0, + 0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8, + 0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7, + 0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75, + 0x0e2fbf43}, + {0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc, + 0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a, + 0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3, + 0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7, + 0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b, + 0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154, + 0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3, + 0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc, + 0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330, + 0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264, + 0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd, + 0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b, + 0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a, + 0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175, + 0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275, + 0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a, + 0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234, + 0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2, + 0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b, + 0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a, + 0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6, + 0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189, + 0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b, + 0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204, + 0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8, + 0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226, + 0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff, + 0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219, + 0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167, + 0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258, + 0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158, + 0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267, + 0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c, + 0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da, + 0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003, + 0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157, + 0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b, + 0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4, + 0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179, + 0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246, + 0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a, + 0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de, + 0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107, + 0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1, + 0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba, + 0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285, + 0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185, + 0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba, + 0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4, + 0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322, + 0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb, + 0xf4377108}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000, + 0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000, + 0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000, + 0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000, + 0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000, + 0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000, + 0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000, + 0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000, + 0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000, + 0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000, + 0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000, + 0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000, + 0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000, + 0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000, + 0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000, + 0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000, + 0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000, + 0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000, + 0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000, + 0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000, + 0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000, + 0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000, + 0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000, + 0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000, + 0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000, + 0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000, + 0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000, + 0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000, + 0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000, + 0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000, + 0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000, + 0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000, + 0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000, + 0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000, + 0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000, + 0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000, + 0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000, + 0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000, + 0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000, + 0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000, + 0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000, + 0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000, + 0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000, + 0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000, + 0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000, + 0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000, + 0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000, + 0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000, + 0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000, + 0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000, + 0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000, + 0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000, + 0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000, + 0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000, + 0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000, + 0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000, + 0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000, + 0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000, + 0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000, + 0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000, + 0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000, + 0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000, + 0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000, + 0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000, + 0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000, + 0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000, + 0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000, + 0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000, + 0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000, + 0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000, + 0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000, + 0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000, + 0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000, + 0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000, + 0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000, + 0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000, + 0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000, + 0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000, + 0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000, + 0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000, + 0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000, + 0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000, + 0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000, + 0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000, + 0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000, + 0x087137f400000000}, + {0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000, + 0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000, + 0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000, + 0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000, + 0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000, + 0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000, + 0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000, + 0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000, + 0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000, + 0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000, + 0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000, + 0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000, + 0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000, + 0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000, + 0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000, + 0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000, + 0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000, + 0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000, + 0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000, + 0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000, + 0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000, + 0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000, + 0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000, + 0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000, + 0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000, + 0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000, + 0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000, + 0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000, + 0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000, + 0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000, + 0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000, + 0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000, + 0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000, + 0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000, + 0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000, + 0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000, + 0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000, + 0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000, + 0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000, + 0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000, + 0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000, + 0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000, + 0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000, + 0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000, + 0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000, + 0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000, + 0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000, + 0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000, + 0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000, + 0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000, + 0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000, + 0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000, + 0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000, + 0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000, + 0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000, + 0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000, + 0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000, + 0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000, + 0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000, + 0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000, + 0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000, + 0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000, + 0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000, + 0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000, + 0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000, + 0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000, + 0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000, + 0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000, + 0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000, + 0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000, + 0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000, + 0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000, + 0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000, + 0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000, + 0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000, + 0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000, + 0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000, + 0x1129fad400000000, 0x621116d400000000, 0x544094f000000000, + 0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000, + 0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000, + 0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000, + 0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000, + 0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000, + 0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000, + 0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000, + 0x43bf2f0e00000000}, + {0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000, + 0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000, + 0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000, + 0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000, + 0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000, + 0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000, + 0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000, + 0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000, + 0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000, + 0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000, + 0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000, + 0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000, + 0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000, + 0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000, + 0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000, + 0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000, + 0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000, + 0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000, + 0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000, + 0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000, + 0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000, + 0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000, + 0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000, + 0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000, + 0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000, + 0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000, + 0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000, + 0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000, + 0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000, + 0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000, + 0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000, + 0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000, + 0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000, + 0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000, + 0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000, + 0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000, + 0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000, + 0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000, + 0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000, + 0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000, + 0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000, + 0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000, + 0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000, + 0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000, + 0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000, + 0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000, + 0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000, + 0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000, + 0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000, + 0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000, + 0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000, + 0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000, + 0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000, + 0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000, + 0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000, + 0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000, + 0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000, + 0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000, + 0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000, + 0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000, + 0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000, + 0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000, + 0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000, + 0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000, + 0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000, + 0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000, + 0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000, + 0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000, + 0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000, + 0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000, + 0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000, + 0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000, + 0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000, + 0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000, + 0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000, + 0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000, + 0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000, + 0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000, + 0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000, + 0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000, + 0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000, + 0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000, + 0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000, + 0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000, + 0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000, + 0x953fdbef00000000}, + {0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000, + 0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000, + 0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000, + 0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000, + 0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000, + 0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000, + 0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000, + 0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000, + 0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000, + 0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000, + 0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000, + 0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000, + 0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000, + 0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000, + 0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000, + 0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000, + 0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000, + 0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000, + 0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000, + 0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000, + 0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000, + 0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000, + 0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000, + 0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000, + 0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000, + 0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000, + 0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000, + 0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000, + 0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000, + 0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000, + 0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000, + 0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000, + 0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000, + 0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000, + 0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000, + 0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000, + 0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000, + 0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000, + 0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000, + 0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000, + 0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000, + 0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000, + 0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000, + 0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000, + 0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000, + 0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000, + 0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000, + 0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000, + 0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000, + 0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000, + 0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000, + 0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000, + 0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000, + 0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000, + 0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000, + 0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000, + 0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000, + 0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000, + 0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000, + 0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000, + 0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000, + 0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000, + 0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000, + 0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000, + 0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000, + 0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000, + 0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000, + 0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000, + 0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000, + 0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000, + 0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000, + 0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000, + 0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000, + 0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000, + 0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000, + 0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000, + 0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000, + 0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000, + 0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000, + 0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000, + 0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000, + 0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000, + 0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000, + 0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000, + 0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000, + 0xf4bc8a8000000000}, + {0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000, + 0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000, + 0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000, + 0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000, + 0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000, + 0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000, + 0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000, + 0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000, + 0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000, + 0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000, + 0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000, + 0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000, + 0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000, + 0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000, + 0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000, + 0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000, + 0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000, + 0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000, + 0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000, + 0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000, + 0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000, + 0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000, + 0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000, + 0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000, + 0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000, + 0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000, + 0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000, + 0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000, + 0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000, + 0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000, + 0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000, + 0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000, + 0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000, + 0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000, + 0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000, + 0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000, + 0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000, + 0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000, + 0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000, + 0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000, + 0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000, + 0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000, + 0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000, + 0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000, + 0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000, + 0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000, + 0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000, + 0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000, + 0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000, + 0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000, + 0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000, + 0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000, + 0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000, + 0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000, + 0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000, + 0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000, + 0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000, + 0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000, + 0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000, + 0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000, + 0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000, + 0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000, + 0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000, + 0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000, + 0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000, + 0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000, + 0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000, + 0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000, + 0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000, + 0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000, + 0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000, + 0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000, + 0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000, + 0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000, + 0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000, + 0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000, + 0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000, + 0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000, + 0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000, + 0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000, + 0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000, + 0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000, + 0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000, + 0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000, + 0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000, + 0xb9bc50ba00000000}, + {0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000, + 0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000, + 0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000, + 0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000, + 0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000, + 0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000, + 0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000, + 0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000, + 0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000, + 0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000, + 0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000, + 0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000, + 0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000, + 0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000, + 0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000, + 0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000, + 0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000, + 0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000, + 0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000, + 0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000, + 0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000, + 0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000, + 0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000, + 0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000, + 0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000, + 0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000, + 0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000, + 0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000, + 0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000, + 0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000, + 0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000, + 0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000, + 0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000, + 0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000, + 0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000, + 0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000, + 0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000, + 0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000, + 0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000, + 0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000, + 0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000, + 0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000, + 0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000, + 0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000, + 0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000, + 0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000, + 0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000, + 0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000, + 0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000, + 0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000, + 0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000, + 0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000, + 0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000, + 0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000, + 0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000, + 0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000, + 0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000, + 0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000, + 0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000, + 0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000, + 0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000, + 0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000, + 0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000, + 0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000, + 0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000, + 0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000, + 0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000, + 0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000, + 0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000, + 0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000, + 0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000, + 0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000, + 0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000, + 0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000, + 0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000, + 0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000, + 0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000, + 0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000, + 0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000, + 0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000, + 0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000, + 0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000, + 0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000, + 0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000, + 0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000, + 0x945b07b200000000}, + {0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000, + 0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000, + 0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000, + 0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000, + 0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000, + 0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000, + 0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000, + 0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000, + 0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000, + 0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000, + 0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000, + 0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000, + 0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000, + 0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000, + 0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000, + 0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000, + 0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000, + 0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000, + 0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000, + 0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000, + 0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000, + 0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000, + 0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000, + 0x149f066100000000, 0xef839db200000000, 0x468814fc00000000, + 0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000, + 0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000, + 0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000, + 0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000, + 0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000, + 0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000, + 0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000, + 0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000, + 0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000, + 0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000, + 0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000, + 0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000, + 0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000, + 0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000, + 0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000, + 0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000, + 0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000, + 0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000, + 0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000, + 0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000, + 0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000, + 0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000, + 0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000, + 0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000, + 0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000, + 0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000, + 0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000, + 0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000, + 0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000, + 0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000, + 0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000, + 0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000, + 0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000, + 0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000, + 0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000, + 0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000, + 0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000, + 0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000, + 0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000, + 0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000, + 0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000, + 0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000, + 0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000, + 0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000, + 0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000, + 0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000, + 0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000, + 0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000, + 0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000, + 0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000, + 0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000, + 0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000, + 0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000, + 0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000, + 0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000, + 0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000, + 0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000, + 0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000, + 0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000, + 0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000, + 0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000, + 0x0650d0f700000000}, + {0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000, + 0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000, + 0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000, + 0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000, + 0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000, + 0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000, + 0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000, + 0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000, + 0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000, + 0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000, + 0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000, + 0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000, + 0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000, + 0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000, + 0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000, + 0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000, + 0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000, + 0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000, + 0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000, + 0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000, + 0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000, + 0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000, + 0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000, + 0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000, + 0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000, + 0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000, + 0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000, + 0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000, + 0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000, + 0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000, + 0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000, + 0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000, + 0xc702c15700000000, 0x809085f800000000, 0x082039d200000000, + 0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000, + 0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000, + 0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000, + 0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000, + 0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000, + 0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000, + 0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000, + 0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000, + 0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000, + 0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000, + 0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000, + 0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000, + 0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000, + 0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000, + 0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000, + 0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000, + 0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000, + 0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000, + 0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000, + 0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000, + 0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000, + 0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000, + 0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000, + 0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000, + 0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000, + 0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000, + 0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000, + 0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000, + 0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000, + 0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000, + 0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000, + 0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000, + 0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000, + 0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000, + 0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000, + 0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000, + 0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000, + 0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000, + 0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000, + 0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000, + 0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000, + 0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000, + 0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000, + 0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000, + 0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000, + 0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000, + 0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000, + 0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000, + 0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000, + 0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000, + 0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000, + 0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000, + 0x657594e900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873, + 0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661, + 0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441, + 0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44, + 0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1, + 0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05, + 0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa, + 0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e, + 0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb, + 0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be, + 0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e, + 0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c, + 0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d, + 0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9, + 0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f, + 0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b, + 0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39, + 0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b, + 0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b, + 0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20, + 0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595, + 0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61, + 0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0, + 0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644, + 0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1, + 0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d, + 0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d, + 0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f, + 0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad, + 0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359, + 0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f, + 0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b, + 0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7, + 0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5, + 0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5, + 0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0, + 0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65, + 0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091, + 0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633, + 0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7, + 0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272, + 0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77, + 0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57, + 0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145, + 0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9, + 0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d, + 0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb, + 0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f, + 0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad, + 0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf, + 0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f, + 0x4e36ba18}, + {0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b, + 0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8, + 0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19, + 0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4, + 0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239, + 0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd, + 0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258, + 0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc, + 0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41, + 0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c, + 0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d, + 0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e, + 0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba, + 0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e, + 0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8, + 0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c, + 0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f, + 0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c, + 0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d, + 0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d, + 0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0, + 0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014, + 0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc, + 0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628, + 0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5, + 0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941, + 0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0, + 0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53, + 0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880, + 0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264, + 0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92, + 0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776, + 0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8, + 0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b, + 0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea, + 0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837, + 0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca, + 0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e, + 0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211, + 0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5, + 0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08, + 0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5, + 0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934, + 0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7, + 0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049, + 0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad, + 0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b, + 0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf, + 0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c, + 0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f, + 0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e, + 0xa1d67c91}, + {0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9, + 0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de, + 0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94, + 0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0, + 0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a, + 0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924, + 0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052, + 0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c, + 0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6, + 0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2, + 0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8, + 0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f, + 0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d, + 0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273, + 0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30, + 0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e, + 0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7, + 0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980, + 0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca, + 0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8, + 0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62, + 0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c, + 0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c, + 0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032, + 0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798, + 0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d, + 0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07, + 0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630, + 0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389, + 0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7, + 0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4, + 0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca, + 0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55, + 0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662, + 0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828, + 0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c, + 0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6, + 0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98, + 0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3, + 0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d, + 0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037, + 0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913, + 0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759, + 0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e, + 0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1, + 0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf, + 0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c, + 0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2, + 0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b, + 0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c, + 0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276, + 0xa8ef40a1}, + {0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e, + 0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8, + 0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819, + 0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f, + 0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d, + 0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756, + 0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0, + 0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb, + 0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9, + 0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f, + 0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e, + 0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8, + 0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835, + 0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e, + 0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62, + 0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749, + 0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b, + 0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d, + 0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc, + 0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80, + 0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2, + 0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599, + 0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05, + 0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e, + 0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c, + 0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e, + 0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef, + 0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359, + 0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b, + 0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0, + 0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc, + 0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7, + 0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f, + 0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189, + 0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568, + 0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e, + 0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c, + 0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27, + 0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794, + 0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf, + 0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d, + 0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db, + 0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a, + 0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c, + 0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544, + 0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f, + 0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013, + 0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38, + 0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea, + 0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c, + 0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd, + 0x356bacd8}}; + +#endif + +#endif + +#if N == 6 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370, + 0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d, + 0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69, + 0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426, + 0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3, + 0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f, + 0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c, + 0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490, + 0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155, + 0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a, + 0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e, + 0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603, + 0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349, + 0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5, + 0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50, + 0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc, + 0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b, + 0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76, + 0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862, + 0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9, + 0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c, + 0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0, + 0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937, + 0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b, + 0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e, + 0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e, + 0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a, + 0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357, + 0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0, + 0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c, + 0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9, + 0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165, + 0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766, + 0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b, + 0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f, + 0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030, + 0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5, + 0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59, + 0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63, + 0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf, + 0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a, + 0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845, + 0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51, + 0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c, + 0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f, + 0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3, + 0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46, + 0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea, + 0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d, + 0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60, + 0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74, + 0x8568a0a8}, + {0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5, + 0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf, + 0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5, + 0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba, + 0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf, + 0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f, + 0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0, + 0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450, + 0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55, + 0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a, + 0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620, + 0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a, + 0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454, + 0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4, + 0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534, + 0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584, + 0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694, + 0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e, + 0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4, + 0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1, + 0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4, + 0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164, + 0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1, + 0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911, + 0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314, + 0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c, + 0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6, + 0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec, + 0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc, + 0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c, + 0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c, + 0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c, + 0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716, + 0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c, + 0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676, + 0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879, + 0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c, + 0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc, + 0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77, + 0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7, + 0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2, + 0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd, + 0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7, + 0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad, + 0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897, + 0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827, + 0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7, + 0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947, + 0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57, + 0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d, + 0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37, + 0x0d907052}, + {0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d, + 0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89, + 0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31, + 0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81, + 0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e, + 0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0, + 0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f, + 0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291, + 0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e, + 0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e, + 0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936, + 0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2, + 0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13, + 0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d, + 0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f, + 0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1, + 0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a, + 0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae, + 0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516, + 0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f, + 0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20, + 0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe, + 0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28, + 0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6, + 0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419, + 0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5, + 0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d, + 0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889, + 0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412, + 0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c, + 0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e, + 0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0, + 0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02, + 0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986, + 0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e, + 0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e, + 0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221, + 0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf, + 0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913, + 0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d, + 0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622, + 0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592, + 0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a, + 0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae, + 0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c, + 0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82, + 0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20, + 0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe, + 0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025, + 0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1, + 0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719, + 0xfd1a6c8a}, + {0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3, + 0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb, + 0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d, + 0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb, + 0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9, + 0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156, + 0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045, + 0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa, + 0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8, + 0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e, + 0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8, + 0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0, + 0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38, + 0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87, + 0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46, + 0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9, + 0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585, + 0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d, + 0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb, + 0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531, + 0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03, + 0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc, + 0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33, + 0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c, + 0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be, + 0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d, + 0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b, + 0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303, + 0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f, + 0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0, + 0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801, + 0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe, + 0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e, + 0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346, + 0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620, + 0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776, + 0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844, + 0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb, + 0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0, + 0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f, + 0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d, + 0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b, + 0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d, + 0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75, + 0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795, + 0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a, + 0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb, + 0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354, + 0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28, + 0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30, + 0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856, + 0x7895f01a}, + {0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188, + 0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33, + 0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d, + 0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445, + 0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2, + 0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058, + 0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43, + 0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9, + 0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e, + 0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06, + 0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228, + 0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93, + 0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e, + 0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4, + 0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b, + 0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371, + 0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265, + 0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede, + 0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0, + 0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f, + 0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8, + 0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32, + 0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae, + 0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544, + 0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3, + 0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f, + 0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911, + 0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa, + 0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be, + 0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54, + 0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b, + 0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1, + 0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652, + 0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9, + 0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7, + 0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f, + 0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68, + 0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782, + 0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797, + 0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d, + 0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a, + 0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2, + 0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc, + 0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647, + 0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4, + 0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e, + 0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41, + 0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab, + 0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf, + 0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904, + 0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a, + 0x9239b848}, + {0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad, + 0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0, + 0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40, + 0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b, + 0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d, + 0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b, + 0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb, + 0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d, + 0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b, + 0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0, + 0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840, + 0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d, + 0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b, + 0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d, + 0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6, + 0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0, + 0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580, + 0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd, + 0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d, + 0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b, + 0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d, + 0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b, + 0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6, + 0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0, + 0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6, + 0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c, + 0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c, + 0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461, + 0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841, + 0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317, + 0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac, + 0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa, + 0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7, + 0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba, + 0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a, + 0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161, + 0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777, + 0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21, + 0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a, + 0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc, + 0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da, + 0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1, + 0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01, + 0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c, + 0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241, + 0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917, + 0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac, + 0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa, + 0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da, + 0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397, + 0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537, + 0xeb36d3cc}, + {0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b, + 0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059, + 0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251, + 0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d, + 0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9, + 0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c, + 0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41, + 0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4, + 0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10, + 0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c, + 0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54, + 0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476, + 0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8, + 0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d, + 0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92, + 0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307, + 0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad, + 0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f, + 0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87, + 0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17, + 0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3, + 0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46, + 0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197, + 0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02, + 0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6, + 0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e, + 0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96, + 0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4, + 0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e, + 0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b, + 0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934, + 0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1, + 0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7, + 0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5, + 0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd, + 0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1, + 0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475, + 0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0, + 0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155, + 0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0, + 0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304, + 0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348, + 0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140, + 0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862, + 0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14, + 0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181, + 0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e, + 0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab, + 0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01, + 0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523, + 0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b, + 0x38e5f3c5}, + {0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06, + 0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad, + 0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509, + 0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba, + 0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414, + 0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3, + 0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733, + 0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994, + 0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a, + 0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889, + 0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d, + 0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386, + 0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621, + 0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886, + 0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e, + 0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389, + 0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f, + 0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294, + 0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30, + 0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3, + 0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d, + 0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba, + 0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a, + 0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad, + 0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03, + 0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2, + 0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306, + 0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad, + 0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b, + 0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc, + 0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914, + 0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3, + 0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435, + 0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e, + 0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a, + 0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589, + 0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27, + 0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080, + 0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21, + 0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586, + 0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28, + 0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b, + 0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f, + 0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94, + 0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12, + 0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5, + 0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d, + 0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba, + 0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c, + 0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7, + 0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103, + 0x3d3101a2}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000, + 0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000, + 0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000, + 0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000, + 0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000, + 0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000, + 0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000, + 0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000, + 0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000, + 0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000, + 0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000, + 0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000, + 0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000, + 0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000, + 0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000, + 0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000, + 0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000, + 0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000, + 0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000, + 0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000, + 0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000, + 0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000, + 0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000, + 0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000, + 0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000, + 0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000, + 0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000, + 0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000, + 0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000, + 0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000, + 0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000, + 0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000, + 0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000, + 0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000, + 0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000, + 0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000, + 0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000, + 0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000, + 0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000, + 0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000, + 0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000, + 0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000, + 0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000, + 0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000, + 0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000, + 0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000, + 0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000, + 0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000, + 0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000, + 0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000, + 0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000, + 0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000, + 0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000, + 0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000, + 0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000, + 0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000, + 0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000, + 0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000, + 0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000, + 0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000, + 0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000, + 0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000, + 0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000, + 0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000, + 0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000, + 0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000, + 0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000, + 0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000, + 0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000, + 0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000, + 0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000, + 0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000, + 0x3688267d00000000, 0x9718319500000000, 0x35af787600000000, + 0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000, + 0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000, + 0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000, + 0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000, + 0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000, + 0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000, + 0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000, + 0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000, + 0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000, + 0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000, + 0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000, + 0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000, + 0xa201313d00000000}, + {0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000, + 0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000, + 0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000, + 0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000, + 0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000, + 0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000, + 0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000, + 0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000, + 0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000, + 0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000, + 0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000, + 0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000, + 0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000, + 0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000, + 0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000, + 0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000, + 0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000, + 0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000, + 0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000, + 0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000, + 0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000, + 0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000, + 0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000, + 0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000, + 0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000, + 0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000, + 0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000, + 0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000, + 0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000, + 0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000, + 0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000, + 0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000, + 0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000, + 0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000, + 0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000, + 0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000, + 0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000, + 0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000, + 0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000, + 0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000, + 0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000, + 0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000, + 0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000, + 0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000, + 0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000, + 0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000, + 0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000, + 0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000, + 0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000, + 0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000, + 0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000, + 0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000, + 0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000, + 0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000, + 0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000, + 0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000, + 0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000, + 0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000, + 0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000, + 0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000, + 0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000, + 0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000, + 0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000, + 0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000, + 0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000, + 0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000, + 0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000, + 0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000, + 0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000, + 0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000, + 0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000, + 0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000, + 0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000, + 0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000, + 0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000, + 0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000, + 0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000, + 0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000, + 0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000, + 0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000, + 0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000, + 0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000, + 0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000, + 0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000, + 0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000, + 0xc5f3e53800000000}, + {0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000, + 0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000, + 0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000, + 0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000, + 0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000, + 0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000, + 0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000, + 0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000, + 0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000, + 0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000, + 0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000, + 0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000, + 0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000, + 0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000, + 0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000, + 0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000, + 0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000, + 0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000, + 0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000, + 0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000, + 0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000, + 0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000, + 0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000, + 0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000, + 0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000, + 0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000, + 0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000, + 0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000, + 0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000, + 0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000, + 0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000, + 0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000, + 0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000, + 0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000, + 0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000, + 0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000, + 0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000, + 0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000, + 0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000, + 0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000, + 0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000, + 0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000, + 0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000, + 0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000, + 0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000, + 0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000, + 0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000, + 0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000, + 0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000, + 0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000, + 0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000, + 0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000, + 0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000, + 0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000, + 0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000, + 0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000, + 0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000, + 0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000, + 0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000, + 0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000, + 0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000, + 0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000, + 0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000, + 0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000, + 0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000, + 0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000, + 0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000, + 0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000, + 0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000, + 0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000, + 0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000, + 0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000, + 0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000, + 0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000, + 0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000, + 0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000, + 0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000, + 0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000, + 0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000, + 0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000, + 0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000, + 0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000, + 0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000, + 0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000, + 0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000, + 0xccd336eb00000000}, + {0x0000000000000000, 0x6238282a00000000, 0xc470505400000000, + 0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000, + 0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000, + 0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000, + 0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000, + 0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000, + 0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000, + 0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000, + 0xb249204500000000, 0xd071086f00000000, 0x7639701100000000, + 0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000, + 0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000, + 0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000, + 0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000, + 0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000, + 0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000, + 0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000, + 0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000, + 0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000, + 0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000, + 0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000, + 0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000, + 0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000, + 0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000, + 0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000, + 0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000, + 0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000, + 0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000, + 0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000, + 0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000, + 0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000, + 0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000, + 0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000, + 0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000, + 0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000, + 0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000, + 0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000, + 0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000, + 0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000, + 0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000, + 0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000, + 0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000, + 0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000, + 0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000, + 0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000, + 0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000, + 0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000, + 0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000, + 0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000, + 0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000, + 0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000, + 0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000, + 0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000, + 0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000, + 0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000, + 0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000, + 0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000, + 0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000, + 0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000, + 0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000, + 0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000, + 0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000, + 0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000, + 0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000, + 0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000, + 0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000, + 0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000, + 0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000, + 0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000, + 0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000, + 0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000, + 0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000, + 0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000, + 0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000, + 0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000, + 0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000, + 0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000, + 0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000, + 0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000, + 0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000, + 0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000, + 0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000, + 0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000, + 0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000, + 0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000, + 0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000, + 0x48b8399200000000}, + {0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000, + 0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000, + 0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000, + 0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000, + 0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000, + 0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000, + 0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000, + 0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000, + 0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000, + 0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000, + 0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000, + 0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000, + 0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000, + 0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000, + 0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000, + 0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000, + 0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000, + 0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000, + 0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000, + 0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000, + 0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000, + 0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000, + 0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000, + 0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000, + 0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000, + 0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000, + 0xb521428400000000, 0xf909d42700000000, 0x762efede00000000, + 0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000, + 0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000, + 0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000, + 0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000, + 0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000, + 0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000, + 0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000, + 0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000, + 0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000, + 0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000, + 0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000, + 0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000, + 0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000, + 0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000, + 0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000, + 0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000, + 0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000, + 0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000, + 0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000, + 0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000, + 0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000, + 0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000, + 0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000, + 0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000, + 0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000, + 0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000, + 0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000, + 0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000, + 0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000, + 0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000, + 0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000, + 0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000, + 0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000, + 0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000, + 0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000, + 0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000, + 0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000, + 0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000, + 0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000, + 0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000, + 0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000, + 0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000, + 0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000, + 0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000, + 0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000, + 0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000, + 0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000, + 0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000, + 0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000, + 0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000, + 0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000, + 0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000, + 0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000, + 0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000, + 0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000, + 0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000, + 0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000, + 0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000, + 0x1af0957800000000}, + {0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000, + 0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000, + 0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000, + 0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000, + 0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000, + 0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000, + 0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000, + 0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000, + 0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000, + 0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000, + 0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000, + 0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000, + 0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000, + 0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000, + 0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000, + 0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000, + 0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000, + 0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000, + 0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000, + 0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000, + 0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000, + 0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000, + 0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000, + 0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000, + 0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000, + 0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000, + 0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000, + 0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000, + 0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000, + 0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000, + 0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000, + 0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000, + 0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000, + 0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000, + 0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000, + 0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000, + 0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000, + 0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000, + 0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000, + 0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000, + 0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000, + 0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000, + 0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000, + 0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000, + 0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000, + 0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000, + 0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000, + 0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000, + 0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000, + 0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000, + 0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000, + 0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000, + 0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000, + 0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000, + 0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000, + 0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000, + 0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000, + 0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000, + 0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000, + 0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000, + 0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000, + 0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000, + 0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000, + 0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000, + 0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000, + 0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000, + 0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000, + 0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000, + 0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000, + 0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000, + 0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000, + 0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000, + 0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000, + 0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000, + 0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000, + 0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000, + 0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000, + 0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000, + 0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000, + 0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000, + 0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000, + 0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000, + 0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000, + 0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000, + 0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000, + 0x8a6c1afd00000000}, + {0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000, + 0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000, + 0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000, + 0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000, + 0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000, + 0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000, + 0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000, + 0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000, + 0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000, + 0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000, + 0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000, + 0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000, + 0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000, + 0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000, + 0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000, + 0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000, + 0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000, + 0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000, + 0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000, + 0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000, + 0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000, + 0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000, + 0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000, + 0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000, + 0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000, + 0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000, + 0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000, + 0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000, + 0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000, + 0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000, + 0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000, + 0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000, + 0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000, + 0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000, + 0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000, + 0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000, + 0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000, + 0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000, + 0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000, + 0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000, + 0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000, + 0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000, + 0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000, + 0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000, + 0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000, + 0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000, + 0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000, + 0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000, + 0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000, + 0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000, + 0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000, + 0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000, + 0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000, + 0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000, + 0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000, + 0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000, + 0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000, + 0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000, + 0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000, + 0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000, + 0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000, + 0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000, + 0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000, + 0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000, + 0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000, + 0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000, + 0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000, + 0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000, + 0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000, + 0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000, + 0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000, + 0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000, + 0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000, + 0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000, + 0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000, + 0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000, + 0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000, + 0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000, + 0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000, + 0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000, + 0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000, + 0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000, + 0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000, + 0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000, + 0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000, + 0x5270900d00000000}, + {0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000, + 0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000, + 0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000, + 0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000, + 0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000, + 0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000, + 0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000, + 0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000, + 0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000, + 0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000, + 0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000, + 0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000, + 0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000, + 0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000, + 0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000, + 0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000, + 0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000, + 0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000, + 0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000, + 0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000, + 0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000, + 0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000, + 0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000, + 0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000, + 0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000, + 0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000, + 0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000, + 0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000, + 0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000, + 0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000, + 0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000, + 0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000, + 0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000, + 0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000, + 0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000, + 0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000, + 0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000, + 0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000, + 0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000, + 0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000, + 0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000, + 0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000, + 0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000, + 0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000, + 0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000, + 0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000, + 0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000, + 0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000, + 0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000, + 0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000, + 0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000, + 0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000, + 0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000, + 0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000, + 0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000, + 0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000, + 0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000, + 0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000, + 0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000, + 0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000, + 0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000, + 0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000, + 0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000, + 0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000, + 0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000, + 0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000, + 0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000, + 0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000, + 0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000, + 0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000, + 0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000, + 0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000, + 0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000, + 0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000, + 0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000, + 0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000, + 0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000, + 0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000, + 0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000, + 0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000, + 0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000, + 0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000, + 0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000, + 0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000, + 0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000, + 0xa8a0688500000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912, + 0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba, + 0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3, + 0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30, + 0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e, + 0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3, + 0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73, + 0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe, + 0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0, + 0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643, + 0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a, + 0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082, + 0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4, + 0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279, + 0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735, + 0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8, + 0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad, + 0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05, + 0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c, + 0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718, + 0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46, + 0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb, + 0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc, + 0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41, + 0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f, + 0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad, + 0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4, + 0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c, + 0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779, + 0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4, + 0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8, + 0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235, + 0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7, + 0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f, + 0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476, + 0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195, + 0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb, + 0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46, + 0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622, + 0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af, + 0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1, + 0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12, + 0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b, + 0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3, + 0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51, + 0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc, + 0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90, + 0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d, + 0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708, + 0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0, + 0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9, + 0x48686b56}, + {0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c, + 0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae, + 0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb, + 0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90, + 0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410, + 0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b, + 0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6, + 0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed, + 0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d, + 0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036, + 0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953, + 0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1, + 0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca, + 0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781, + 0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d, + 0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416, + 0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f, + 0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd, + 0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8, + 0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b, + 0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb, + 0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0, + 0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5, + 0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e, + 0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e, + 0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558, + 0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d, + 0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf, + 0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6, + 0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad, + 0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971, + 0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a, + 0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b, + 0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969, + 0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c, + 0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57, + 0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7, + 0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c, + 0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab, + 0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0, + 0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160, + 0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b, + 0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e, + 0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac, + 0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d, + 0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546, + 0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a, + 0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1, + 0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8, + 0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a, + 0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f, + 0xcaa25178}, + {0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00, + 0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b, + 0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed, + 0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777, + 0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01, + 0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a, + 0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef, + 0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74, + 0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002, + 0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498, + 0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee, + 0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75, + 0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05, + 0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e, + 0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8, + 0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73, + 0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404, + 0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f, + 0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9, + 0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71, + 0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607, + 0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c, + 0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb, + 0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470, + 0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806, + 0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790, + 0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6, + 0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d, + 0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a, + 0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991, + 0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7, + 0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c, + 0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09, + 0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92, + 0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4, + 0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e, + 0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08, + 0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593, + 0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3, + 0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778, + 0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e, + 0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94, + 0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2, + 0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079, + 0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c, + 0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497, + 0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1, + 0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a, + 0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d, + 0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396, + 0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0, + 0x0c7ac97b}, + {0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669, + 0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853, + 0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062, + 0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527, + 0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad, + 0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545, + 0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27, + 0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf, + 0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45, + 0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800, + 0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031, + 0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b, + 0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26, + 0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce, + 0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d, + 0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5, + 0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130, + 0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a, + 0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b, + 0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480, + 0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a, + 0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2, + 0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e, + 0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996, + 0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c, + 0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc, + 0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd, + 0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7, + 0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232, + 0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da, + 0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439, + 0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1, + 0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da, + 0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0, + 0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1, + 0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94, + 0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e, + 0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6, + 0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2, + 0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a, + 0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0, + 0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95, + 0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4, + 0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e, + 0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395, + 0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d, + 0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e, + 0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676, + 0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83, + 0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9, + 0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888, + 0x5185cd09}}; + +#endif + +#endif + +#endif + +local const z_crc_t FAR x2n_table[] = { + 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, + 0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, + 0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0, + 0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169, + 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37, + 0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a, + 0xc40ba6d0, 0xc4e22c3c}; diff --git a/external/freetype/src/gzip/ftgzip.c b/external/freetype/src/gzip/ftgzip.c new file mode 100644 index 000000000..ca6a2aabe --- /dev/null +++ b/external/freetype/src/gzip/ftgzip.c @@ -0,0 +1,805 @@ +/**************************************************************************** + * + * ftgzip.c + * + * FreeType support for .gz compressed files. + * + * This optional component relies on zlib. It should mainly be used to + * parse compressed PCF fonts, as found with many X11 server + * distributions. + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftgzip.h> +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Gzip_Err_ +#define FT_ERR_BASE FT_Mod_Err_Gzip + +#include <freetype/fterrors.h> + + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + +#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB + +#include <zlib.h> + +#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + /* In this case, we include our own modified sources of the ZLib */ + /* within the `gzip' component. The modifications were necessary */ + /* to #include all files without conflicts, as well as preventing */ + /* the definition of `extern' functions that may cause linking */ + /* conflicts when a program is linked with both FreeType and the */ + /* original ZLib. */ + +#ifndef USE_ZLIB_ZCALLOC +#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutil.c */ +#endif + + /* Note that our `zlib.h' includes `ftzconf.h' instead of `zconf.h'; */ + /* the main reason is that even a global `zlib.h' includes `zconf.h' */ + /* with */ + /* */ + /* #include "zconf.h" */ + /* */ + /* instead of the expected */ + /* */ + /* #include <zconf.h> */ + /* */ + /* so that configuration with `FT_CONFIG_OPTION_SYSTEM_ZLIB' might */ + /* include the wrong `zconf.h' file, leading to errors. */ + +#define ZEXPORT + /* prevent zlib functions from being visible outside their object files */ +#define ZEXTERN static + +#define HAVE_MEMCPY 1 +#define Z_SOLO 1 +#define Z_FREETYPE 1 + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `conversion from XXX to YYY, */ + /* possible loss of data' in order to compile cleanly with */ + /* the maximum level of warnings: zlib is non-FreeType */ + /* code. */ +#pragma warning( push ) +#pragma warning( disable : 4244 ) +#endif /* _MSC_VER */ + +#if defined( __GNUC__ ) +#pragma GCC diagnostic push +#ifndef __cplusplus +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#endif +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +#include "zutil.c" +#include "inffast.c" +#include "inflate.c" +#include "inftrees.c" +#include "adler32.c" +#include "crc32.c" + +#if defined( __GNUC__ ) +#pragma GCC diagnostic pop +#endif + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + +#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + /* it is better to use FreeType memory routines instead of raw + 'malloc/free' */ + + static voidpf + ft_gzip_alloc( voidpf opaque, + uInt items, + uInt size ) + { + FT_Memory memory = (FT_Memory)opaque; + FT_ULong sz = (FT_ULong)size * items; + FT_Error error; + FT_Pointer p = NULL; + + + /* allocate and zero out */ + FT_MEM_ALLOC( p, sz ); + return p; + } + + + static void + ft_gzip_free( voidpf opaque, + voidpf address ) + { + FT_Memory memory = (FT_Memory)opaque; + + + FT_MEM_FREE( address ); + } + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_GZIP_BUFFER_SIZE 4096 + + typedef struct FT_GZipFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + z_stream zstream; /* zlib input stream */ + + FT_ULong start; /* starting position, after .gz header */ + FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ + + FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_GZipFileRec, *FT_GZipFile; + + + /* gzip flag byte */ +#define FT_GZIP_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define FT_GZIP_HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define FT_GZIP_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define FT_GZIP_ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define FT_GZIP_COMMENT 0x10 /* bit 4 set: file comment present */ +#define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ + + + /* check and skip .gz header - we don't support `transparent' compression */ + static FT_Error + ft_gzip_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[4]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 4 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers; */ + /* head[2] is the method, and head[3] the flags */ + if ( head[0] != 0x1F || + head[1] != 0x8B || + head[2] != Z_DEFLATED || + (head[3] & FT_GZIP_RESERVED) ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* skip time, xflags and os code */ + (void)FT_STREAM_SKIP( 6 ); + + /* skip the extra field */ + if ( head[3] & FT_GZIP_EXTRA_FIELD ) + { + FT_UInt len; + + + if ( FT_READ_USHORT_LE( len ) || + FT_STREAM_SKIP( len ) ) + goto Exit; + } + + /* skip original file name */ + if ( head[3] & FT_GZIP_ORIG_NAME ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip .gz comment */ + if ( head[3] & FT_GZIP_COMMENT ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip CRC */ + if ( head[3] & FT_GZIP_HEAD_CRC ) + if ( FT_STREAM_SKIP( 2 ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + ft_gzip_file_init( FT_GZipFile zip, + FT_Stream stream, + FT_Stream source ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = FT_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .gz header */ + { + stream = source; + + error = ft_gzip_check_header( stream ); + if ( error ) + goto Exit; + + zip->start = FT_STREAM_POS(); + } + + /* initialize zlib -- there is no zlib header in the compressed stream */ + zstream->zalloc = ft_gzip_alloc; + zstream->zfree = ft_gzip_free; + zstream->opaque = stream->memory; + + zstream->avail_in = 0; + zstream->next_in = zip->buffer; + + if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || + !zstream->next_in ) + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + static void + ft_gzip_file_done( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + + + inflateEnd( zstream ); + + /* clear the rest */ + zstream->zalloc = NULL; + zstream->zfree = NULL; + zstream->opaque = NULL; + zstream->next_in = NULL; + zstream->next_out = NULL; + zstream->avail_in = 0; + zstream->avail_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_gzip_file_reset( FT_GZipFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( zip->start ) ) + { + z_stream* zstream = &zip->zstream; + + + inflateReset( zstream ); + + zstream->avail_in = 0; + zstream->next_in = zip->input; + zstream->avail_out = 0; + zstream->next_out = zip->buffer; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_gzip_file_fill_input( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_GZIP_BUFFER_SIZE ); + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + } + else + { + size = stream->size - stream->pos; + if ( size > FT_GZIP_BUFFER_SIZE ) + size = FT_GZIP_BUFFER_SIZE; + + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + zstream->next_in = zip->input; + zstream->avail_in = size; + + return FT_Err_Ok; + } + + + static FT_Error + ft_gzip_file_fill_output( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = FT_Err_Ok; + + + zip->cursor = zip->buffer; + zstream->next_out = zip->cursor; + zstream->avail_out = FT_GZIP_BUFFER_SIZE; + + while ( zstream->avail_out > 0 ) + { + int err; + + + if ( zstream->avail_in == 0 ) + { + error = ft_gzip_file_fill_input( zip ); + if ( error ) + break; + } + + err = inflate( zstream, Z_NO_FLUSH ); + + if ( err == Z_STREAM_END ) + { + zip->limit = zstream->next_out; + if ( zip->limit == zip->cursor ) + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + else if ( err != Z_OK ) + { + zip->limit = zip->cursor; + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */ + static FT_Error + ft_gzip_file_skip_output( FT_GZipFile zip, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + + + for (;;) + { + FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); + + + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_gzip_file_io( FT_GZipFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Reset inflate stream if we're seeking backwards. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos ) + { + error = ft_gzip_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** G Z E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_gzip_stream_close( FT_Stream stream ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize gzip file descriptor */ + ft_gzip_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + + if ( !stream->read ) + FT_FREE( stream->base ); + } + + + static unsigned long + ft_gzip_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + + + return ft_gzip_file_io( zip, offset, buffer, count ); + } + + + static FT_ULong + ft_gzip_get_uncompressed_size( FT_Stream stream ) + { + FT_Error error; + FT_ULong old_pos; + FT_ULong result = 0; + + + old_pos = stream->pos; + if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) + { + result = FT_Stream_ReadULongLE( stream, &error ); + if ( error ) + result = 0; + + (void)FT_Stream_Seek( stream, old_pos ); + } + + return result; + } + + + /* documentation is in ftgzip.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory; + FT_GZipFile zip = NULL; + + + if ( !stream || !source ) + { + error = FT_THROW( Invalid_Stream_Handle ); + goto Exit; + } + + memory = source->memory; + + /* + * check the header right now; this prevents allocating un-necessary + * objects when we don't need them + */ + error = ft_gzip_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_gzip_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + /* + * We use the following trick to try to dramatically improve the + * performance while dealing with small files. If the original stream + * size is less than a certain threshold, we try to load the whole font + * file into memory. This saves us from using the 32KB buffer needed + * to inflate the file, plus the two 4KB intermediate input/output + * buffers used in the `FT_GZipFile' structure. + */ + { + FT_ULong zip_size = ft_gzip_get_uncompressed_size( source ); + + + if ( zip_size != 0 && zip_size < 40 * 1024 ) + { + FT_Byte* zip_buff = NULL; + + + if ( !FT_QALLOC( zip_buff, zip_size ) ) + { + FT_ULong count; + + + count = ft_gzip_file_io( zip, 0, zip_buff, zip_size ); + if ( count == zip_size ) + { + ft_gzip_file_done( zip ); + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + + stream->size = zip_size; + stream->pos = 0; + stream->base = zip_buff; + stream->read = NULL; + stream->close = ft_gzip_stream_close; + + goto Exit; + } + + ft_gzip_file_io( zip, 0, NULL, 0 ); + FT_FREE( zip_buff ); + } + error = FT_Err_Ok; + } + + if ( zip_size ) + stream->size = zip_size; + else + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + } + + stream->pos = 0; + stream->base = NULL; + stream->read = ft_gzip_stream_io; + stream->close = ft_gzip_stream_close; + + Exit: + return error; + } + + + /* documentation is in ftgzip.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ) + { + z_stream stream; + int err; + + + /* check for `input' delayed to `inflate' */ + + if ( !memory || !output_len || !output ) + return FT_THROW( Invalid_Argument ); + + /* this function is modeled after zlib's `uncompress' function */ + + stream.next_in = (Bytef*)input; + stream.avail_in = (uInt)input_len; + + stream.next_out = output; + stream.avail_out = (uInt)*output_len; + + stream.zalloc = ft_gzip_alloc; + stream.zfree = ft_gzip_free; + stream.opaque = memory; + + err = inflateInit2( &stream, MAX_WBITS|32 ); + + if ( err != Z_OK ) + return FT_THROW( Invalid_Argument ); + + err = inflate( &stream, Z_FINISH ); + if ( err != Z_STREAM_END ) + { + inflateEnd( &stream ); + if ( err == Z_OK ) + err = Z_BUF_ERROR; + } + else + { + *output_len = stream.total_out; + + err = inflateEnd( &stream ); + } + + if ( err == Z_MEM_ERROR ) + return FT_THROW( Out_Of_Memory ); + + if ( err == Z_BUF_ERROR ) + return FT_THROW( Array_Too_Large ); + + if ( err == Z_DATA_ERROR ) + return FT_THROW( Invalid_Table ); + + if ( err == Z_NEED_DICT ) + return FT_THROW( Invalid_Table ); + + return FT_Err_Ok; + } + + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ) + { + FT_UNUSED( memory ); + FT_UNUSED( output ); + FT_UNUSED( output_len ); + FT_UNUSED( input ); + FT_UNUSED( input_len ); + + return FT_THROW( Unimplemented_Feature ); + } + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + + +/* END */ diff --git a/external/freetype/src/gzip/ftzconf.h b/external/freetype/src/gzip/ftzconf.h new file mode 100644 index 000000000..bf977d3e7 --- /dev/null +++ b/external/freetype/src/gzip/ftzconf.h @@ -0,0 +1,547 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include <stddef.h> + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include <limits.h> +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include <sys/types.h> /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include <stdarg.h> /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include <stddef.h> /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) +# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/external/freetype/src/gzip/gzguts.h b/external/freetype/src/gzip/gzguts.h new file mode 100644 index 000000000..4f09a52a7 --- /dev/null +++ b/external/freetype/src/gzip/gzguts.h @@ -0,0 +1,219 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004-2019 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include <stdio.h> +#include "zlib.h" +#ifdef STDC +# include <string.h> +# include <stdlib.h> +# include <limits.h> +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include <fcntl.h> + +#ifdef _WIN32 +# include <stddef.h> +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include <io.h> +#endif + +#if defined(_WIN32) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include <windows.h> +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include <errno.h> +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY__ 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + int reset; /* true if a reset is pending after a Z_FINISH */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/external/freetype/src/gzip/inffast.c b/external/freetype/src/gzip/inffast.c new file mode 100644 index 000000000..809737b13 --- /dev/null +++ b/external/freetype/src/gzip/inffast.c @@ -0,0 +1,323 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast( + z_streamp strm, + unsigned start) +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code const *here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - 5); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = lcode + (hold & lmask); + dolen: + op = (unsigned)(here->bits); + hold >>= op; + bits -= op; + op = (unsigned)(here->op); + if (op == 0) { /* literal */ + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here->val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = dcode + (hold & dmask); + dodist: + op = (unsigned)(here->bits); + hold >>= op; + bits -= op; + op = (unsigned)(here->op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here->val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = window; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } while (len > 2); + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode + here->val + (hold & ((1U << op) - 1)); + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode + here->val + (hold & ((1U << op) - 1)); + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/external/freetype/src/gzip/inffast.h b/external/freetype/src/gzip/inffast.h new file mode 100644 index 000000000..684ae878c --- /dev/null +++ b/external/freetype/src/gzip/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +static void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/external/freetype/src/gzip/inffixed.h b/external/freetype/src/gzip/inffixed.h new file mode 100644 index 000000000..d62832776 --- /dev/null +++ b/external/freetype/src/gzip/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/external/freetype/src/gzip/inflate.c b/external/freetype/src/gzip/inflate.c new file mode 100644 index 000000000..5117e2e26 --- /dev/null +++ b/external/freetype/src/gzip/inflate.c @@ -0,0 +1,1605 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2022 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +#ifndef Z_FREETYPE +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); +#endif + +local int inflateStateCheck( + z_streamp strm) +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep( + z_streamp strm) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->flags = -1; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset( + z_streamp strm) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2( + z_streamp strm, + int windowBits) +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + if (windowBits < -15) + return Z_STREAM_ERROR; + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_( + z_streamp strm, + int windowBits, + const char *version, + int stream_size) +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +#ifndef Z_FREETYPE + +int ZEXPORT inflateInit_( + z_streamp strm, + const char *version, + int stream_size) +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime( + z_streamp strm, + int bits, + int value) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +#endif /* !Z_FREETYPE */ + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables( + struct inflate_state FAR *state) +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include <stdio.h> + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow( + z_streamp strm, + const Bytef *end, + unsigned copy) +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE_CHECK(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate( + z_streamp strm, + int flush) +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + /* fallthrough */ + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + /* fallthrough */ + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + /* fallthrough */ + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + /* fallthrough */ + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL && + (len = state->head->extra_len - state->length) < + state->head->extra_max) { + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + /* fallthrough */ + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + /* fallthrough */ + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + /* fallthrough */ + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + /* fallthrough */ + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + /* fallthrough */ + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ + case COPY_: + state->mode = COPY; + /* fallthrough */ + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + /* fallthrough */ + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + /* fallthrough */ + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ + case LEN_: + state->mode = LEN; + /* fallthrough */ + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + /* fallthrough */ + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + /* fallthrough */ + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + /* fallthrough */ + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + /* fallthrough */ + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE_CHECK(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + /* fallthrough */ + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + /* fallthrough */ + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + /* fallthrough */ + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE_CHECK(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd( + z_streamp strm) +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +#ifndef Z_FREETYPE + +int ZEXPORT inflateGetDictionary( + z_streamp strm, + Bytef *dictionary, + uInt *dictLength) +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary( + z_streamp strm, + const Bytef *dictionary, + uInt dictLength) +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader( + z_streamp strm, + gz_headerp head) +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch( + unsigned FAR *have, + const unsigned char FAR *buf, + unsigned len) +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync( + z_streamp strm) +{ + unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->flags = flags; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint( + z_streamp strm) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy( + z_streamp dest, + z_streamp source) +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine( + z_streamp strm, + int subvert) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate( + z_streamp strm, + int check) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check && state->wrap) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark( + z_streamp strm) +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed( + z_streamp strm) +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} + +#endif /* !Z_FREETYPE */ diff --git a/external/freetype/src/gzip/inflate.h b/external/freetype/src/gzip/inflate.h new file mode 100644 index 000000000..c6f5a52e1 --- /dev/null +++ b/external/freetype/src/gzip/inflate.h @@ -0,0 +1,131 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2019 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifndef INFLATE_H +#define INFLATE_H + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags, 0 if zlib, or + -1 if raw or no header yet */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; + +#endif /* INFLATE_H */ diff --git a/external/freetype/src/gzip/inftrees.c b/external/freetype/src/gzip/inftrees.c new file mode 100644 index 000000000..dd4965e9a --- /dev/null +++ b/external/freetype/src/gzip/inftrees.c @@ -0,0 +1,304 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2022 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +static const char inflate_copyright[] = + " inflate 1.2.13 Copyright 1995-2022 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table( + codetype type, + unsigned short FAR *lens, + unsigned codes, + code FAR * FAR *table, + unsigned FAR *bits, + unsigned short FAR *work) +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + unsigned match; /* use base and extra for symbol >= match */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + match = 20; + break; + case LENS: + base = lbase; + extra = lext; + match = 257; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if (work[sym] + 1U < match) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/external/freetype/src/gzip/inftrees.h b/external/freetype/src/gzip/inftrees.h new file mode 100644 index 000000000..a2207efb1 --- /dev/null +++ b/external/freetype/src/gzip/inftrees.h @@ -0,0 +1,67 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifndef INFTREES_H +#define INFTREES_H + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +static int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); + +#endif /* INFTREES_H_ */ diff --git a/external/freetype/src/gzip/patches/freetype-zlib.diff b/external/freetype/src/gzip/patches/freetype-zlib.diff new file mode 100644 index 000000000..6ac76df62 --- /dev/null +++ b/external/freetype/src/gzip/patches/freetype-zlib.diff @@ -0,0 +1,469 @@ +[zlib] Fix zlib sources for compilation with FreeType + +We must ensure that they do not issue compiler errors or warnings when they +are compiled as part of `src/gzip/ftgzip.c`. + +* src/gzip/gzguts.h (COPY): Rename to... +(COPY__): ... this since `COPY` and `COPY_` conflict with enum values, +which have the same name in `zlib.h`. + +* src/gzip/inflate.c, src/gzip/adler32.c, src/gzip/crc32.c, +src/gzip/zutil.c: Omit unused function declarations and definitions when +`Z_FREETYPE` is defined. + +* src/gzip/inffast.h (inflate_fast): Declare as static. + +* src/gzip/inftrees.c (inflate_copyright): Declare as static. + +* src/gzip/zlib.h: Include `ftzconf.h` instead of `zconf.h` to avoid +conflicts with system-installed headers. +Omit unused function declarations when `Z_FREETYPE` is defined. +(inflateInit2)[Z_FREETYPE]: Provide proper declaration. + +* src/gzip/zutil.h: Use `ft_memxxx` functions instead of `memxxx`. +Omit unused function declarations when `Z_FREETYPE` is defined. + +* src/gzip/inflate.h, src/gzip/inftrees.h: Add header guard macros to +prevent compiler errors. + +* src/gzip/inftrees.h: Add header guard macros to prevent compiler errors. +(inflate_table): Declare as static. + +diff --git b/src/gzip/adler32.c a/src/gzip/adler32.c +index be5e8a247..aa032e1dd 100644 +--- b/src/gzip/adler32.c ++++ a/src/gzip/adler32.c +@@ -7,7 +7,9 @@ + + #include "zutil.h" + ++#ifndef Z_FREETYPE + local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); ++#endif + + #define BASE 65521U /* largest prime smaller than 65536 */ + #define NMAX 5552 +@@ -139,6 +141,8 @@ uLong ZEXPORT adler32( + return adler32_z(adler, buf, len); + } + ++#ifndef Z_FREETYPE ++ + /* ========================================================================= */ + local uLong adler32_combine_( + uLong adler1, +@@ -184,3 +188,5 @@ uLong ZEXPORT adler32_combine64( + { + return adler32_combine_(adler1, adler2, len2); + } ++ ++#endif /* !Z_FREETYPE */ +diff --git b/src/gzip/crc32.c a/src/gzip/crc32.c +index 3a52aa89d..6cd1b09d5 100644 +--- b/src/gzip/crc32.c ++++ a/src/gzip/crc32.c +@@ -103,9 +103,11 @@ + # define ARMCRC32 + #endif + ++#ifndef Z_FREETYPE + /* Local functions. */ + local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); + local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); ++#endif /* Z_FREETYPE */ + + #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) + local z_word_t byte_swap OF((z_word_t word)); +@@ -544,6 +546,8 @@ local void braid(ltl, big, n, w) + * generation above. + */ + ++#ifndef Z_FREETYPE ++ + /* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. +@@ -600,6 +604,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table() + return (const z_crc_t FAR *)crc_table; + } + ++#endif /* Z_FREETYPE */ ++ + /* ========================================================================= + * Use ARM machine instructions if available. This will compute the CRC about + * ten times faster than the braided calculation. This code does not check for +@@ -1077,6 +1083,8 @@ unsigned long ZEXPORT crc32( + return crc32_z(crc, buf, len); + } + ++#ifndef Z_FREETYPE ++ + /* ========================================================================= */ + uLong ZEXPORT crc32_combine64( + uLong crc1, +@@ -1123,3 +1131,5 @@ uLong ZEXPORT crc32_combine_op( + { + return multmodp(op, crc1) ^ (crc2 & 0xffffffff); + } ++ ++#endif /* Z_FREETYPE */ +diff --git b/src/gzip/gzguts.h a/src/gzip/gzguts.h +index 57faf3716..4f09a52a7 100644 +--- b/src/gzip/gzguts.h ++++ a/src/gzip/gzguts.h +@@ -163,7 +163,7 @@ + + /* values for gz_state how */ + #define LOOK 0 /* look for a gzip header */ +-#define COPY 1 /* copy input directly */ ++#define COPY__ 1 /* copy input directly */ + #define GZIP 2 /* decompress a gzip stream */ + + /* internal gzip file state data structure */ +diff --git b/src/gzip/inffast.h a/src/gzip/inffast.h +index e5c1aa4ca..684ae878c 100644 +--- b/src/gzip/inffast.h ++++ a/src/gzip/inffast.h +@@ -8,4 +8,4 @@ + subject to change. Applications should only use zlib.h. + */ + +-void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); ++static void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); +diff --git b/src/gzip/inflate.c a/src/gzip/inflate.c +index c9e566b03..5117e2e26 100644 +--- b/src/gzip/inflate.c ++++ a/src/gzip/inflate.c +@@ -99,8 +99,10 @@ local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + #ifdef BUILDFIXED + void makefixed OF((void)); + #endif ++#ifndef Z_FREETYPE + local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); ++#endif + + local int inflateStateCheck( + z_streamp strm) +@@ -239,6 +241,8 @@ int ZEXPORT inflateInit2_( + return ret; + } + ++#ifndef Z_FREETYPE ++ + int ZEXPORT inflateInit_( + z_streamp strm, + const char *version, +@@ -268,6 +272,8 @@ int ZEXPORT inflatePrime( + return Z_OK; + } + ++#endif /* !Z_FREETYPE */ ++ + /* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. +@@ -1315,6 +1321,8 @@ int ZEXPORT inflateEnd( + return Z_OK; + } + ++#ifndef Z_FREETYPE ++ + int ZEXPORT inflateGetDictionary( + z_streamp strm, + Bytef *dictionary, +@@ -1593,3 +1601,5 @@ unsigned long ZEXPORT inflateCodesUsed( + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); + } ++ ++#endif /* !Z_FREETYPE */ +diff --git b/src/gzip/inflate.h a/src/gzip/inflate.h +index f127b6b1f..c6f5a52e1 100644 +--- b/src/gzip/inflate.h ++++ a/src/gzip/inflate.h +@@ -3,6 +3,9 @@ + * For conditions of distribution and use, see copyright notice in zlib.h + */ + ++#ifndef INFLATE_H ++#define INFLATE_H ++ + /* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. +@@ -124,3 +127,5 @@ struct inflate_state { + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ + }; ++ ++#endif /* INFLATE_H */ +diff --git b/src/gzip/inftrees.c a/src/gzip/inftrees.c +index d8405a24c..dd4965e9a 100644 +--- b/src/gzip/inftrees.c ++++ a/src/gzip/inftrees.c +@@ -8,7 +8,7 @@ + + #define MAXBITS 15 + +-const char inflate_copyright[] = ++static const char inflate_copyright[] = + " inflate 1.2.13 Copyright 1995-2022 Mark Adler "; + /* + If you use the zlib library in a product, an acknowledgment is welcome +diff --git b/src/gzip/inftrees.h a/src/gzip/inftrees.h +index f53665311..a2207efb1 100644 +--- b/src/gzip/inftrees.h ++++ a/src/gzip/inftrees.h +@@ -3,6 +3,9 @@ + * For conditions of distribution and use, see copyright notice in zlib.h + */ + ++#ifndef INFTREES_H ++#define INFTREES_H ++ + /* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. +@@ -57,6 +60,8 @@ typedef enum { + DISTS + } codetype; + +-int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, ++static int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); ++ ++#endif /* INFTREES_H_ */ +diff --git b/src/gzip/zlib.h a/src/gzip/zlib.h +index 953cb5012..3f2f76e3c 100644 +--- b/src/gzip/zlib.h ++++ a/src/gzip/zlib.h +@@ -31,7 +31,7 @@ + #ifndef ZLIB_H + #define ZLIB_H + +-#include "zconf.h" ++#include "ftzconf.h" + + #ifdef __cplusplus + extern "C" { +@@ -211,6 +211,8 @@ typedef gz_header FAR *gz_headerp; + + #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + ++#ifndef Z_FREETYPE ++ + #define zlib_version zlibVersion() + /* for compatibility with versions < 1.0.2 */ + +@@ -373,6 +375,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); + deallocated). + */ + ++#endif /* !Z_FREETYPE */ + + /* + ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +@@ -534,6 +537,8 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); + The following functions are needed only in some special applications. + */ + ++#ifndef Z_FREETYPE ++ + /* + ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, +@@ -956,6 +961,8 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + destination. + */ + ++#endif /* !Z_FREETYPE */ ++ + ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); + /* + This function is equivalent to inflateEnd followed by inflateInit, +@@ -980,6 +987,8 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + the windowBits parameter is invalid. + */ + ++#ifndef Z_FREETYPE ++ + ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +@@ -1069,6 +1078,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + stream state was inconsistent. + */ + ++#endif /* !Z_FREETYPE */ ++ + /* + ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); +@@ -1095,6 +1106,8 @@ typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); + typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + ++#ifndef Z_FREETYPE ++ + ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +@@ -1214,6 +1227,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); + 27-31: 0 (reserved) + */ + ++#endif /* !Z_FREETYPE */ ++ + #ifndef Z_SOLO + + /* utility functions */ +@@ -1765,6 +1780,8 @@ ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2)); + crc32_combine_op(). + */ + ++#ifndef Z_FREETYPE ++ + ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); + /* + Give the same result as crc32_combine(), using op in place of len2. op is +@@ -1822,6 +1839,19 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + ZLIB_VERSION, (int)sizeof(z_stream)) + #endif + ++#else /* Z_FREETYPE */ ++ ++ ++ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, ++ const char *version, int stream_size)); ++ ++# define inflateInit2(strm, windowBits) \ ++ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ ++ (int)sizeof(z_stream)) ++ ++#endif /* Z_FREETYPE */ ++ ++ + #ifndef Z_SOLO + + /* gzgetc() macro and its supporting function and exposed data structure. Note +@@ -1901,20 +1931,25 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ + + #else /* Z_SOLO */ + ++#ifndef Z_FREETYPE + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); ++#endif + + #endif /* !Z_SOLO */ + + /* undocumented functions */ ++#ifndef Z_FREETYPE + ZEXTERN const char * ZEXPORT zError OF((int)); + ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); + ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); + ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); + ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); + ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); ++#endif /* !Z_FREETYPE */ + ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ++#ifndef Z_FREETYPE + ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); + #if defined(_WIN32) && !defined(Z_SOLO) + ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, +@@ -1927,6 +1962,7 @@ ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + va_list va)); + # endif + #endif ++#endif /* !Z_FREETYPE */ + + #ifdef __cplusplus + } +diff --git b/src/gzip/zutil.c a/src/gzip/zutil.c +index ef174ca64..542706ca0 100644 +--- b/src/gzip/zutil.c ++++ a/src/gzip/zutil.c +@@ -10,6 +10,8 @@ + # include "gzguts.h" + #endif + ++#ifndef Z_FREETYPE ++ + z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ +@@ -138,6 +140,8 @@ const char * ZEXPORT zError( + return ERR_MSG(err); + } + ++#endif /* !Z_FREETYPE */ ++ + #if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 + /* The older Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. +@@ -159,6 +163,8 @@ void ZLIB_INTERNAL zmemcpy( + } while (--len != 0); + } + ++#ifndef Z_FREETYPE ++ + int ZLIB_INTERNAL zmemcmp( + const Bytef* s1, + const Bytef* s2, +@@ -181,6 +187,7 @@ void ZLIB_INTERNAL zmemzero( + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); + } ++#endif /* !Z_FREETYPE */ + #endif + + #ifndef Z_SOLO +diff --git b/src/gzip/zutil.h a/src/gzip/zutil.h +index 0bc7f4ecd..055ba8b62 100644 +--- b/src/gzip/zutil.h ++++ a/src/gzip/zutil.h +@@ -53,8 +53,10 @@ typedef unsigned long ulg; + # endif + #endif + ++#ifndef Z_FREETYPE + extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ + /* (size given to avoid silly warnings with Visual C++) */ ++#endif /* !Z_FREETYPE */ + + #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +@@ -188,6 +190,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ + #pragma warn -8066 + #endif + ++#ifndef Z_FREETYPE ++ + /* provide prototypes for these when building zlib without LFS */ + #if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) +@@ -196,6 +200,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); + #endif + ++#endif /* !Z_FREETYPE */ ++ + /* common defaults */ + + #ifndef OS_CODE +@@ -227,9 +233,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ + # define zmemcmp _fmemcmp + # define zmemzero(dest, len) _fmemset(dest, 0, len) + # else +-# define zmemcpy memcpy +-# define zmemcmp memcmp +-# define zmemzero(dest, len) memset(dest, 0, len) ++# define zmemcpy ft_memcpy ++# define zmemcmp ft_memcmp ++# define zmemzero(dest, len) ft_memset(dest, 0, len) + # endif + #else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); diff --git a/external/freetype/src/gzip/rules.mk b/external/freetype/src/gzip/rules.mk new file mode 100644 index 000000000..c76eacb1a --- /dev/null +++ b/external/freetype/src/gzip/rules.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 GZip support configuration rules +# + + +# Copyright (C) 2002-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# gzip driver directory +# +GZIP_DIR := $(SRC_DIR)/gzip + + +# compilation flags for the driver +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) +else + GZIP_COMPILE := $(CC) $(ANSIFLAGS) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) +endif + + +# gzip support sources +# +# All source and header files get loaded by `ftgzip.c' only if SYSTEM_ZLIB +# is not defined (regardless whether we have a `single' or a `multi' build). +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c \ + $(GZIP_DIR)/crc32.c \ + $(GZIP_DIR)/crc32.h \ + $(GZIP_DIR)/ftzconf.h \ + $(GZIP_DIR)/inffast.c \ + $(GZIP_DIR)/inffast.h \ + $(GZIP_DIR)/inffixed.h \ + $(GZIP_DIR)/inflate.c \ + $(GZIP_DIR)/inflate.h \ + $(GZIP_DIR)/inftrees.c \ + $(GZIP_DIR)/inftrees.h \ + $(GZIP_DIR)/zlib.h \ + $(GZIP_DIR)/zutil.c \ + $(GZIP_DIR)/zutil.h +endif + +# gzip driver object(s) +# +# GZIP_DRV_OBJ is used during both `single' and `multi' builds +# +GZIP_DRV_OBJ := $(OBJ_DIR)/ftgzip.$O + + +# gzip main source file +# +GZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c + + +# gzip support - object +# +$(GZIP_DRV_OBJ): $(GZIP_DRV_SRC) $(GZIP_DRV_SRCS) $(FREETYPE_H) + $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC)) + + +# update main driver object lists +# +DRV_OBJS_S += $(GZIP_DRV_OBJ) +DRV_OBJS_M += $(GZIP_DRV_OBJ) + + +# EOF diff --git a/external/freetype/src/gzip/zlib.h b/external/freetype/src/gzip/zlib.h new file mode 100644 index 000000000..3f2f76e3c --- /dev/null +++ b/external/freetype/src/gzip/zlib.h @@ -0,0 +1,1971 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.13, October 13th, 2022 + + Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "ftzconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.13" +#define ZLIB_VERNUM 0x12d0 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 13 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip and raw deflate streams in + memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in the case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte will go here */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use by the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field for deflate() */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#ifndef Z_FREETYPE + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary. Some output may be provided even if + flush is zero. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more output + in that case. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed + codes block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. + + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. + + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + +#endif /* !Z_FREETYPE */ + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +#ifndef Z_FREETYPE + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields zalloc, zfree and opaque must be initialized before by the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similarly, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similarly, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +#endif /* !Z_FREETYPE */ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +#ifndef Z_FREETYPE + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +#endif /* !Z_FREETYPE */ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +#ifndef Z_FREETYPE + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#endif /* !Z_FREETYPE */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Read and decompress up to len uncompressed bytes from file into buf. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevertheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, resetting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); +/* + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written or 0 in case of error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + Compress and write nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf(), + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Compress and write the given null-terminated string s to file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Compress and write c, converted to an unsigned char, into file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Read and decompress one byte from file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewind file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Return true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Return the error message for the last error which occurred on file. + errnum is set to zlib error number. If an error occurred in the file system + and not in the compression library, errnum is set to Z_ERRNO and the + application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clear the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2)); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). +*/ + +#ifndef Z_FREETYPE + +ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#else /* Z_FREETYPE */ + + +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); + +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) + +#endif /* Z_FREETYPE */ + + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# define crc32_combine_gen crc32_combine_gen64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); +#endif + +#else /* Z_SOLO */ + +#ifndef Z_FREETYPE + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); +#endif + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +#ifndef Z_FREETYPE +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); +#endif /* !Z_FREETYPE */ +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +#ifndef Z_FREETYPE +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif +#endif /* !Z_FREETYPE */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/external/freetype/src/gzip/zutil.c b/external/freetype/src/gzip/zutil.c new file mode 100644 index 000000000..542706ca0 --- /dev/null +++ b/external/freetype/src/gzip/zutil.c @@ -0,0 +1,334 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2017 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +#ifndef Z_FREETYPE + +z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef ZLIB_DEBUG + flags += 1 << 8; +#endif + /* +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif + */ +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef ZLIB_DEBUG +#include <stdlib.h> +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error( + char *m) +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError( + int err) +{ + return ERR_MSG(err); +} + +#endif /* !Z_FREETYPE */ + +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 + /* The older Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy( + Bytef* dest, + const Bytef* source, + uInt len) +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +#ifndef Z_FREETYPE + +int ZLIB_INTERNAL zmemcmp( + const Bytef* s1, + const Bytef* s2, + uInt len) +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero( + Bytef* dest, + uInt len) +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif /* !Z_FREETYPE */ +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf; + ulg bsize = (ulg)items*size; + + (void)opaque; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) +{ + int n; + + (void)opaque; + + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) +{ + (void)opaque; + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) +{ + (void)opaque; + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc( + voidpf opaque, + unsigned items, + unsigned size) +{ + (void)opaque; + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree( + voidpf opaque, + voidpf ptr) +{ + (void)opaque; + free(ptr); +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/external/freetype/src/gzip/zutil.h b/external/freetype/src/gzip/zutil.h new file mode 100644 index 000000000..055ba8b62 --- /dev/null +++ b/external/freetype/src/gzip/zutil.h @@ -0,0 +1,281 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include <stddef.h> +# endif +# include <string.h> +# include <stdlib.h> +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC) +# include <limits.h> +# if (ULONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long +# elif (ULLONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long long +# elif (UINT_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned +# endif +#endif + +#ifndef Z_FREETYPE +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ +#endif /* !Z_FREETYPE */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include <alloc.h> +# endif +# else /* MSC or DJGPP */ +# include <malloc.h> +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include <malloc.h> +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include <unix.h> /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +#ifndef Z_FREETYPE + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); +#endif + +#endif /* !Z_FREETYPE */ + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy ft_memcpy +# define zmemcmp ft_memcmp +# define zmemzero(dest, len) ft_memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include <stdio.h> + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/external/freetype/src/lzw/ftlzw.c b/external/freetype/src/lzw/ftlzw.c new file mode 100644 index 000000000..88383792a --- /dev/null +++ b/external/freetype/src/lzw/ftlzw.c @@ -0,0 +1,415 @@ +/**************************************************************************** + * + * ftlzw.c + * + * FreeType support for .Z compressed files. + * + * This optional component relies on NetBSD's zopen(). It should mainly + * be used to parse compressed PCF fonts, as found with many X11 server + * distributions. + * + * Copyright (C) 2004-2023 by + * Albert Chin-A-Young. + * + * based on code in `src/gzip/ftgzip.c' + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftlzw.h> +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX LZW_Err_ +#define FT_ERR_BASE FT_Mod_Err_LZW + +#include <freetype/fterrors.h> + + +#ifdef FT_CONFIG_OPTION_USE_LZW + +#include "ftzopen.h" + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_LZW_BUFFER_SIZE 4096 + + typedef struct FT_LZWFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + FT_LzwStateRec lzw; /* lzw decompressor state */ + + FT_Byte buffer[FT_LZW_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_LZWFileRec, *FT_LZWFile; + + + /* check and skip .Z header */ + static FT_Error + ft_lzw_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[2]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 2 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers */ + if ( head[0] != 0x1F || + head[1] != 0x9D ) + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + static FT_Error + ft_lzw_file_init( FT_LZWFile zip, + FT_Stream stream, + FT_Stream source ) + { + FT_LzwState lzw = &zip->lzw; + FT_Error error; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .Z header */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + /* initialize internal lzw variable */ + ft_lzwstate_init( lzw, source ); + + Exit: + return error; + } + + + static void + ft_lzw_file_done( FT_LZWFile zip ) + { + /* clear the rest */ + ft_lzwstate_done( &zip->lzw ); + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_lzw_file_reset( FT_LZWFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( 0 ) ) + { + ft_lzwstate_reset( &zip->lzw ); + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_lzw_file_fill_output( FT_LZWFile zip ) + { + FT_LzwState lzw = &zip->lzw; + FT_ULong count; + FT_Error error = FT_Err_Ok; + + + zip->cursor = zip->buffer; + + count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE ); + + zip->limit = zip->cursor + count; + + if ( count == 0 ) + error = FT_THROW( Invalid_Stream_Operation ); + + return error; + } + + + /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */ + static FT_Error + ft_lzw_file_skip_output( FT_LZWFile zip, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + + + /* first, we skip what we can from the output buffer */ + { + FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); + + + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + } + + /* next, we skip as many bytes remaining as possible */ + while ( count > 0 ) + { + FT_ULong delta = FT_LZW_BUFFER_SIZE; + FT_ULong numread; + + + if ( delta > count ) + delta = count; + + numread = ft_lzwstate_io( &zip->lzw, NULL, delta ); + if ( numread < delta ) + { + /* not enough bytes */ + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + + zip->pos += delta; + count -= delta; + } + + return error; + } + + + static FT_ULong + ft_lzw_file_io( FT_LZWFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* seeking backwards. */ + if ( pos < zip->pos ) + { + /* If the new position is within the output buffer, simply */ + /* decrement pointers, otherwise we reset the stream completely! */ + if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) ) + { + zip->cursor -= zip->pos - pos; + zip->pos = pos; + } + else + { + error = ft_lzw_file_reset( zip ); + if ( error ) + goto Exit; + } + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer + result, zip->cursor, delta ); + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_lzw_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** L Z W E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_lzw_stream_close( FT_Stream stream ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize lzw file descriptor */ + ft_lzw_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static unsigned long + ft_lzw_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + + + return ft_lzw_file_io( zip, offset, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory; + FT_LZWFile zip = NULL; + + + if ( !stream || !source ) + { + error = FT_THROW( Invalid_Stream_Handle ); + goto Exit; + } + + memory = source->memory; + + /* + * Check the header right now; this prevents allocation of a huge + * LZWFile object (400 KByte of heap memory) if not necessary. + * + * Did I mention that you should never use .Z compressed font + * files? + */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_lzw_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = NULL; + stream->read = ft_lzw_stream_io; + stream->close = ft_lzw_stream_close; + + Exit: + return error; + } + + +#include "ftzopen.c" + + +#else /* !FT_CONFIG_OPTION_USE_LZW */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return FT_THROW( Unimplemented_Feature ); + } + + +#endif /* !FT_CONFIG_OPTION_USE_LZW */ + + +/* END */ diff --git a/external/freetype/src/lzw/ftzopen.c b/external/freetype/src/lzw/ftzopen.c new file mode 100644 index 000000000..e680c4de5 --- /dev/null +++ b/external/freetype/src/lzw/ftzopen.c @@ -0,0 +1,429 @@ +/**************************************************************************** + * + * ftzopen.c + * + * FreeType support for .Z compressed files. + * + * This optional component relies on NetBSD's zopen(). It should mainly + * be used to parse compressed PCF fonts, as found with many X11 server + * distributions. + * + * Copyright (C) 2005-2023 by + * David Turner. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include "ftzopen.h" +#include <freetype/internal/ftmemory.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftdebug.h> + + + static int + ft_lzwstate_refill( FT_LzwState state ) + { + FT_ULong count; + + + if ( state->in_eof ) + return -1; + + count = FT_Stream_TryRead( state->source, + state->buf_tab, + state->num_bits ); /* WHY? */ + + state->buf_size = (FT_UInt)count; + state->buf_total += count; + state->in_eof = FT_BOOL( count < state->num_bits ); + state->buf_offset = 0; + + state->buf_size <<= 3; + if ( state->buf_size > state->num_bits ) + state->buf_size -= state->num_bits - 1; + else + return -1; /* not enough data */ + + if ( count == 0 ) /* end of file */ + return -1; + + return 0; + } + + + static FT_Int32 + ft_lzwstate_get_code( FT_LzwState state ) + { + FT_UInt num_bits = state->num_bits; + FT_UInt offset = state->buf_offset; + FT_Byte* p; + FT_Int result; + + + if ( state->buf_clear || + offset >= state->buf_size || + state->free_ent >= state->free_bits ) + { + if ( state->free_ent >= state->free_bits ) + { + state->num_bits = ++num_bits; + if ( num_bits > LZW_MAX_BITS ) + return -1; + + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << num_bits ) - 256 ) + : state->max_free + 1; + } + + if ( state->buf_clear ) + { + state->num_bits = num_bits = LZW_INIT_BITS; + state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 ); + state->buf_clear = 0; + } + + if ( ft_lzwstate_refill( state ) < 0 ) + return -1; + + offset = 0; + } + + state->buf_offset = offset + num_bits; + + p = &state->buf_tab[offset >> 3]; + offset &= 7; + result = *p++ >> offset; + offset = 8 - offset; + num_bits -= offset; + + if ( num_bits >= 8 ) + { + result |= *p++ << offset; + offset += 8; + num_bits -= 8; + } + if ( num_bits > 0 ) + result |= ( *p & LZW_MASK( num_bits ) ) << offset; + + return result; + } + + + /* grow the character stack */ + static int + ft_lzwstate_stack_grow( FT_LzwState state ) + { + if ( state->stack_top >= state->stack_size ) + { + FT_Memory memory = state->memory; + FT_Error error; + FT_Offset old_size = state->stack_size; + FT_Offset new_size = old_size; + + new_size = new_size + ( new_size >> 1 ) + 4; + + /* if relocating to heap */ + if ( state->stack == state->stack_0 ) + { + state->stack = NULL; + old_size = 0; + } + + /* requirement of the character stack larger than 1<<LZW_MAX_BITS */ + /* implies bug in the decompression code */ + if ( new_size > ( 1 << LZW_MAX_BITS ) ) + { + new_size = 1 << LZW_MAX_BITS; + if ( new_size == old_size ) + return -1; + } + + if ( FT_QREALLOC( state->stack, old_size, new_size ) ) + return -1; + + /* if relocating to heap */ + if ( old_size == 0 ) + FT_MEM_COPY( state->stack, state->stack_0, FT_LZW_DEFAULT_STACK_SIZE ); + + state->stack_size = new_size; + } + return 0; + } + + + /* grow the prefix/suffix arrays */ + static int + ft_lzwstate_prefix_grow( FT_LzwState state ) + { + FT_UInt old_size = state->prefix_size; + FT_UInt new_size = old_size; + FT_Memory memory = state->memory; + FT_Error error; + + + if ( new_size == 0 ) /* first allocation -> 9 bits */ + new_size = 512; + else + new_size += new_size >> 2; /* don't grow too fast */ + + /* + * Note that the `suffix' array is located in the same memory block + * pointed to by `prefix'. + * + * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer + * to write it literally. + * + */ + if ( FT_REALLOC_MULT( state->prefix, old_size, new_size, + sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) ) + return -1; + + /* now adjust `suffix' and move the data accordingly */ + state->suffix = (FT_Byte*)( state->prefix + new_size ); + + FT_MEM_MOVE( state->suffix, + state->prefix + old_size, + old_size * sizeof ( FT_Byte ) ); + + state->prefix_size = new_size; + return 0; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_reset( FT_LzwState state ) + { + state->in_eof = 0; + state->buf_offset = 0; + state->buf_size = 0; + state->buf_clear = 0; + state->buf_total = 0; + state->stack_top = 0; + state->num_bits = LZW_INIT_BITS; + state->phase = FT_LZW_PHASE_START; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ) + { + FT_ZERO( state ); + + state->source = source; + state->memory = source->memory; + + state->prefix = NULL; + state->suffix = NULL; + state->prefix_size = 0; + + state->stack = state->stack_0; + state->stack_size = sizeof ( state->stack_0 ); + + ft_lzwstate_reset( state ); + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_done( FT_LzwState state ) + { + FT_Memory memory = state->memory; + + + ft_lzwstate_reset( state ); + + if ( state->stack != state->stack_0 ) + FT_FREE( state->stack ); + + FT_FREE( state->prefix ); + state->suffix = NULL; + + FT_ZERO( state ); + } + + +#define FTLZW_STACK_PUSH( c ) \ + FT_BEGIN_STMNT \ + if ( state->stack_top >= state->stack_size && \ + ft_lzwstate_stack_grow( state ) < 0 ) \ + goto Eof; \ + \ + state->stack[state->stack_top++] = (FT_Byte)(c); \ + FT_END_STMNT + + + FT_LOCAL_DEF( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ) + { + FT_ULong result = 0; + + FT_UInt old_char = state->old_char; + FT_UInt old_code = state->old_code; + FT_UInt in_code = state->in_code; + + + if ( out_size == 0 ) + goto Exit; + + switch ( state->phase ) + { + case FT_LZW_PHASE_START: + { + FT_Byte max_bits; + FT_Int32 c; + + + /* skip magic bytes, and read max_bits + block_flag */ + if ( FT_Stream_Seek( state->source, 2 ) != 0 || + FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 ) + goto Eof; + + state->max_bits = max_bits & LZW_BIT_MASK; + state->block_mode = max_bits & LZW_BLOCK_MASK; + state->max_free = (FT_UInt)( ( 1UL << state->max_bits ) - 256 ); + + if ( state->max_bits > LZW_MAX_BITS ) + goto Eof; + + state->num_bits = LZW_INIT_BITS; + state->free_ent = ( state->block_mode ? LZW_FIRST + : LZW_CLEAR ) - 256; + in_code = 0; + + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 ) + : state->max_free + 1; + + c = ft_lzwstate_get_code( state ); + if ( c < 0 || c > 255 ) + goto Eof; + + old_code = old_char = (FT_UInt)c; + + if ( buffer ) + buffer[result] = (FT_Byte)old_char; + + if ( ++result >= out_size ) + goto Exit; + + state->phase = FT_LZW_PHASE_CODE; + } + FALL_THROUGH; + + case FT_LZW_PHASE_CODE: + { + FT_Int32 c; + FT_UInt code; + + + NextCode: + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + code = (FT_UInt)c; + + if ( code == LZW_CLEAR && state->block_mode ) + { + /* why not LZW_FIRST-256 ? */ + state->free_ent = ( LZW_FIRST - 1 ) - 256; + state->buf_clear = 1; + + /* not quite right, but at least more predictable */ + old_code = 0; + old_char = 0; + + goto NextCode; + } + + in_code = code; /* save code for later */ + + if ( code >= 256U ) + { + /* special case for KwKwKwK */ + if ( code - 256U >= state->free_ent ) + { + /* corrupted LZW stream */ + if ( code - 256U > state->free_ent ) + goto Eof; + + FTLZW_STACK_PUSH( old_char ); + code = old_code; + } + + while ( code >= 256U ) + { + if ( !state->prefix ) + goto Eof; + + FTLZW_STACK_PUSH( state->suffix[code - 256] ); + code = state->prefix[code - 256]; + } + } + + old_char = code; + FTLZW_STACK_PUSH( old_char ); + + state->phase = FT_LZW_PHASE_STACK; + } + FALL_THROUGH; + + case FT_LZW_PHASE_STACK: + { + while ( state->stack_top > 0 ) + { + state->stack_top--; + + if ( buffer ) + buffer[result] = state->stack[state->stack_top]; + + if ( ++result == out_size ) + goto Exit; + } + + /* now create new entry */ + if ( state->free_ent < state->max_free ) + { + if ( state->free_ent >= state->prefix_size && + ft_lzwstate_prefix_grow( state ) < 0 ) + goto Eof; + + FT_ASSERT( state->free_ent < state->prefix_size ); + + state->prefix[state->free_ent] = (FT_UShort)old_code; + state->suffix[state->free_ent] = (FT_Byte) old_char; + + state->free_ent += 1; + } + + old_code = in_code; + + state->phase = FT_LZW_PHASE_CODE; + goto NextCode; + } + + default: /* state == EOF */ + ; + } + + Exit: + state->old_code = old_code; + state->old_char = old_char; + state->in_code = in_code; + + return result; + + Eof: + state->phase = FT_LZW_PHASE_EOF; + goto Exit; + } + + +/* END */ diff --git a/external/freetype/src/lzw/ftzopen.h b/external/freetype/src/lzw/ftzopen.h new file mode 100644 index 000000000..6c7563643 --- /dev/null +++ b/external/freetype/src/lzw/ftzopen.h @@ -0,0 +1,174 @@ +/**************************************************************************** + * + * ftzopen.h + * + * FreeType support for .Z compressed files. + * + * This optional component relies on NetBSD's zopen(). It should mainly + * be used to parse compressed PCF fonts, as found with many X11 server + * distributions. + * + * Copyright (C) 2005-2023 by + * David Turner. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTZOPEN_H_ +#define FTZOPEN_H_ + +#include <freetype/freetype.h> + +FT_BEGIN_HEADER + + /* + * This is a complete re-implementation of the LZW file reader, + * since the old one was incredibly badly written, using + * 400 KByte of heap memory before decompressing anything. + * + */ + +#define FT_LZW_IN_BUFF_SIZE 64 +#define FT_LZW_DEFAULT_STACK_SIZE 64 + +#define LZW_INIT_BITS 9 +#define LZW_MAX_BITS 16 + +#define LZW_CLEAR 256 +#define LZW_FIRST 257 + +#define LZW_BIT_MASK 0x1F +#define LZW_BLOCK_MASK 0x80 +#define LZW_MASK( n ) ( ( 1U << (n) ) - 1U ) + + + typedef enum FT_LzwPhase_ + { + FT_LZW_PHASE_START = 0, + FT_LZW_PHASE_CODE, + FT_LZW_PHASE_STACK, + FT_LZW_PHASE_EOF + + } FT_LzwPhase; + + + /* + * state of LZW decompressor + * + * small technical note + * -------------------- + * + * We use a few tricks in this implementation that are explained here to + * ease debugging and maintenance. + * + * - First of all, the `prefix' and `suffix' arrays contain the suffix + * and prefix for codes over 256; this means that + * + * prefix_of(code) == state->prefix[code-256] + * suffix_of(code) == state->suffix[code-256] + * + * Each prefix is a 16-bit code, and each suffix an 8-bit byte. + * + * Both arrays are stored in a single memory block, pointed to by + * `state->prefix'. This means that the following equality is always + * true: + * + * state->suffix == (FT_Byte*)(state->prefix + state->prefix_size) + * + * Of course, state->prefix_size is the number of prefix/suffix slots + * in the arrays, corresponding to codes 256..255+prefix_size. + * + * - `free_ent' is the index of the next free entry in the `prefix' + * and `suffix' arrays. This means that the corresponding `next free + * code' is really `256+free_ent'. + * + * Moreover, `max_free' is the maximum value that `free_ent' can reach. + * + * `max_free' corresponds to `(1 << max_bits) - 256'. Note that this + * value is always <= 0xFF00, which means that both `free_ent' and + * `max_free' can be stored in an FT_UInt variable, even on 16-bit + * machines. + * + * If `free_ent == max_free', you cannot add new codes to the + * prefix/suffix table. + * + * - `num_bits' is the current number of code bits, starting at 9 and + * growing each time `free_ent' reaches the value of `free_bits'. The + * latter is computed as follows + * + * if num_bits < max_bits: + * free_bits = (1 << num_bits)-256 + * else: + * free_bits = max_free + 1 + * + * Since the value of `max_free + 1' can never be reached by + * `free_ent', `num_bits' cannot grow larger than `max_bits'. + */ + + typedef struct FT_LzwStateRec_ + { + FT_LzwPhase phase; + FT_Int in_eof; + + FT_Byte buf_tab[16]; + FT_UInt buf_offset; + FT_UInt buf_size; + FT_Bool buf_clear; + FT_Offset buf_total; + + FT_UInt max_bits; /* max code bits, from file header */ + FT_Int block_mode; /* block mode flag, from file header */ + FT_UInt max_free; /* (1 << max_bits) - 256 */ + + FT_UInt num_bits; /* current code bit number */ + FT_UInt free_ent; /* index of next free entry */ + FT_UInt free_bits; /* if reached by free_ent, increment num_bits */ + FT_UInt old_code; + FT_UInt old_char; + FT_UInt in_code; + + FT_UShort* prefix; /* always dynamically allocated / reallocated */ + FT_Byte* suffix; /* suffix = (FT_Byte*)(prefix + prefix_size) */ + FT_UInt prefix_size; /* number of slots in `prefix' or `suffix' */ + + FT_Byte* stack; /* character stack */ + FT_UInt stack_top; + FT_Offset stack_size; + FT_Byte stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */ + + FT_Stream source; /* source stream */ + FT_Memory memory; + + } FT_LzwStateRec, *FT_LzwState; + + + FT_LOCAL( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ); + + FT_LOCAL( void ) + ft_lzwstate_done( FT_LzwState state ); + + + FT_LOCAL( void ) + ft_lzwstate_reset( FT_LzwState state ); + + + FT_LOCAL( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ); + +/* */ + +FT_END_HEADER + +#endif /* FTZOPEN_H_ */ + + +/* END */ diff --git a/external/freetype/src/lzw/rules.mk b/external/freetype/src/lzw/rules.mk new file mode 100644 index 000000000..b750216fb --- /dev/null +++ b/external/freetype/src/lzw/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 LZW support configuration rules +# + + +# Copyright (C) 2004-2023 by +# Albert Chin-A-Young. +# +# based on `src/lzw/rules.mk' +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# LZW driver directory +# +LZW_DIR := $(SRC_DIR)/lzw + + +# compilation flags for the driver +# +LZW_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(LZW_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# LZW support sources (i.e., C files) +# +LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c + +# LZW support headers +# +LZW_DRV_H := $(LZW_DIR)/ftzopen.h \ + $(LZW_DIR)/ftzopen.c + + +# LZW driver object(s) +# +# LZW_DRV_OBJ_M is used during `multi' builds +# LZW_DRV_OBJ_S is used during `single' builds +# +LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O +LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O + +# LZW support source file for single build +# +LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c + + +# LZW support - single object +# +$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S)) + + +# LZW support - multiple objects +# +$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(LZW_DRV_OBJ_S) +DRV_OBJS_M += $(LZW_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/otvalid/module.mk b/external/freetype/src/otvalid/module.mk new file mode 100644 index 000000000..90138426e --- /dev/null +++ b/external/freetype/src/otvalid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 otvalid module definition +# + + +# Copyright (C) 2004-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += OTVALID_MODULE + +define OTVALID_MODULE +$(OPEN_DRIVER) FT_Module_Class, otv_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)otvalid $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/otvalid/otvalid.c b/external/freetype/src/otvalid/otvalid.c new file mode 100644 index 000000000..3b1e23a6f --- /dev/null +++ b/external/freetype/src/otvalid/otvalid.c @@ -0,0 +1,31 @@ +/**************************************************************************** + * + * otvalid.c + * + * FreeType validator for OpenType tables (body only). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "otvbase.c" +#include "otvcommn.c" +#include "otvgdef.c" +#include "otvgpos.c" +#include "otvgsub.c" +#include "otvjstf.c" +#include "otvmath.c" +#include "otvmod.c" + + +/* END */ diff --git a/external/freetype/src/otvalid/otvalid.h b/external/freetype/src/otvalid/otvalid.h new file mode 100644 index 000000000..7edadb771 --- /dev/null +++ b/external/freetype/src/otvalid/otvalid.h @@ -0,0 +1,77 @@ +/**************************************************************************** + * + * otvalid.h + * + * OpenType table validation (specification only). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef OTVALID_H_ +#define OTVALID_H_ + + +#include <freetype/freetype.h> + +#include "otverror.h" /* must come before `ftvalid.h' */ + +#include <freetype/internal/ftvalid.h> +#include <freetype/internal/ftstream.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + otv_BASE_validate( FT_Bytes table, + FT_Validator valid ); + + /* GSUB and GPOS tables should already be validated; */ + /* if missing, set corresponding argument to 0 */ + FT_LOCAL( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_GPOS_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_GSUB_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator valid ); + + /* GSUB and GPOS tables should already be validated; */ + /* if missing, set corresponding argument to 0 */ + FT_LOCAL( void ) + otv_JSTF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_MATH_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ); + + +FT_END_HEADER + +#endif /* OTVALID_H_ */ + + +/* END */ diff --git a/external/freetype/src/otvalid/otvbase.c b/external/freetype/src/otvalid/otvbase.c new file mode 100644 index 000000000..f449795f8 --- /dev/null +++ b/external/freetype/src/otvalid/otvbase.c @@ -0,0 +1,345 @@ +/**************************************************************************** + * + * otvbase.c + * + * OpenType BASE table validation (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvbase + + + static void + otv_BaseCoord_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt BaseCoordFormat; + + + OTV_NAME_ENTER( "BaseCoord" ); + + OTV_LIMIT_CHECK( 4 ); + BaseCoordFormat = FT_NEXT_USHORT( p ); + p += 2; /* skip Coordinate */ + + OTV_TRACE(( " (format %d)\n", BaseCoordFormat )); + + switch ( BaseCoordFormat ) + { + case 1: /* BaseCoordFormat1 */ + break; + + case 2: /* BaseCoordFormat2 */ + OTV_LIMIT_CHECK( 4 ); /* ReferenceGlyph, BaseCoordPoint */ + break; + + case 3: /* BaseCoordFormat3 */ + OTV_LIMIT_CHECK( 2 ); + /* DeviceTable */ + otv_Device_validate( table + FT_NEXT_USHORT( p ), otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static void + otv_BaseTagList_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt BaseTagCount; + + + OTV_NAME_ENTER( "BaseTagList" ); + + OTV_LIMIT_CHECK( 2 ); + + BaseTagCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount )); + + OTV_LIMIT_CHECK( BaseTagCount * 4 ); /* BaselineTag */ + + OTV_EXIT; + } + + + static void + otv_BaseValues_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt BaseCoordCount; + + + OTV_NAME_ENTER( "BaseValues" ); + + OTV_LIMIT_CHECK( 4 ); + + p += 2; /* skip DefaultIndex */ + BaseCoordCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount )); + + OTV_LIMIT_CHECK( BaseCoordCount * 2 ); + + /* BaseCoord */ + for ( ; BaseCoordCount > 0; BaseCoordCount-- ) + otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), otvalid ); + + OTV_EXIT; + } + + + static void + otv_MinMax_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt FeatMinMaxCount; + + OTV_OPTIONAL_TABLE( MinCoord ); + OTV_OPTIONAL_TABLE( MaxCoord ); + + + OTV_NAME_ENTER( "MinMax" ); + + OTV_LIMIT_CHECK( 6 ); + + OTV_OPTIONAL_OFFSET( MinCoord ); + OTV_OPTIONAL_OFFSET( MaxCoord ); + FeatMinMaxCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount )); + + table_size = FeatMinMaxCount * 8 + 6; + + OTV_SIZE_CHECK( MinCoord ); + if ( MinCoord ) + otv_BaseCoord_validate( table + MinCoord, otvalid ); + + OTV_SIZE_CHECK( MaxCoord ); + if ( MaxCoord ) + otv_BaseCoord_validate( table + MaxCoord, otvalid ); + + OTV_LIMIT_CHECK( FeatMinMaxCount * 8 ); + + /* FeatMinMaxRecord */ + for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- ) + { + p += 4; /* skip FeatureTableTag */ + + OTV_OPTIONAL_OFFSET( MinCoord ); + OTV_OPTIONAL_OFFSET( MaxCoord ); + + OTV_SIZE_CHECK( MinCoord ); + if ( MinCoord ) + otv_BaseCoord_validate( table + MinCoord, otvalid ); + + OTV_SIZE_CHECK( MaxCoord ); + if ( MaxCoord ) + otv_BaseCoord_validate( table + MaxCoord, otvalid ); + } + + OTV_EXIT; + } + + + static void + otv_BaseScript_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt BaseLangSysCount; + + OTV_OPTIONAL_TABLE( BaseValues ); + OTV_OPTIONAL_TABLE( DefaultMinMax ); + + + OTV_NAME_ENTER( "BaseScript" ); + + OTV_LIMIT_CHECK( 6 ); + OTV_OPTIONAL_OFFSET( BaseValues ); + OTV_OPTIONAL_OFFSET( DefaultMinMax ); + BaseLangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount )); + + table_size = BaseLangSysCount * 6 + 6; + + OTV_SIZE_CHECK( BaseValues ); + if ( BaseValues ) + otv_BaseValues_validate( table + BaseValues, otvalid ); + + OTV_SIZE_CHECK( DefaultMinMax ); + if ( DefaultMinMax ) + otv_MinMax_validate( table + DefaultMinMax, otvalid ); + + OTV_LIMIT_CHECK( BaseLangSysCount * 6 ); + + /* BaseLangSysRecord */ + for ( ; BaseLangSysCount > 0; BaseLangSysCount-- ) + { + p += 4; /* skip BaseLangSysTag */ + + otv_MinMax_validate( table + FT_NEXT_USHORT( p ), otvalid ); + } + + OTV_EXIT; + } + + + static void + otv_BaseScriptList_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt BaseScriptCount; + + + OTV_NAME_ENTER( "BaseScriptList" ); + + OTV_LIMIT_CHECK( 2 ); + BaseScriptCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount )); + + OTV_LIMIT_CHECK( BaseScriptCount * 6 ); + + /* BaseScriptRecord */ + for ( ; BaseScriptCount > 0; BaseScriptCount-- ) + { + p += 4; /* skip BaseScriptTag */ + + /* BaseScript */ + otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), otvalid ); + } + + OTV_EXIT; + } + + + static void + otv_Axis_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( BaseTagList ); + + + OTV_NAME_ENTER( "Axis" ); + + OTV_LIMIT_CHECK( 4 ); + OTV_OPTIONAL_OFFSET( BaseTagList ); + + table_size = 4; + + OTV_SIZE_CHECK( BaseTagList ); + if ( BaseTagList ) + otv_BaseTagList_validate( table + BaseTagList, otvalid ); + + /* BaseScriptList */ + otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), otvalid ); + + OTV_EXIT; + } + + + FT_LOCAL_DEF( void ) + otv_BASE_validate( FT_Bytes table, + FT_Validator ftvalid ) + { + OTV_ValidatorRec otvalidrec; + OTV_Validator otvalid = &otvalidrec; + FT_Bytes p = table; + FT_UInt table_size; + FT_UShort version; + + OTV_OPTIONAL_TABLE( HorizAxis ); + OTV_OPTIONAL_TABLE( VertAxis ); + + OTV_OPTIONAL_TABLE32( itemVarStore ); + + + otvalid->root = ftvalid; + + FT_TRACE3(( "validating BASE table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 4 ); + + if ( FT_NEXT_USHORT( p ) != 1 ) /* majorVersion */ + FT_INVALID_FORMAT; + + version = FT_NEXT_USHORT( p ); /* minorVersion */ + + table_size = 8; + switch ( version ) + { + case 0: + OTV_LIMIT_CHECK( 4 ); + break; + + case 1: + OTV_LIMIT_CHECK( 8 ); + table_size += 4; + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_OPTIONAL_OFFSET( HorizAxis ); + OTV_SIZE_CHECK( HorizAxis ); + if ( HorizAxis ) + otv_Axis_validate( table + HorizAxis, otvalid ); + + OTV_OPTIONAL_OFFSET( VertAxis ); + OTV_SIZE_CHECK( VertAxis ); + if ( VertAxis ) + otv_Axis_validate( table + VertAxis, otvalid ); + + if ( version > 0 ) + { + OTV_OPTIONAL_OFFSET32( itemVarStore ); + OTV_SIZE_CHECK32( itemVarStore ); + if ( itemVarStore ) + OTV_TRACE(( " [omitting itemVarStore validation]\n" )); /* XXX */ + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvcommn.c b/external/freetype/src/otvalid/otvcommn.c new file mode 100644 index 000000000..b94d8a065 --- /dev/null +++ b/external/freetype/src/otvalid/otvcommn.c @@ -0,0 +1,1099 @@ +/**************************************************************************** + * + * otvcommn.c + * + * OpenType common tables validation (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvcommon + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** COVERAGE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Coverage_validate( FT_Bytes table, + OTV_Validator otvalid, + FT_Int expected_count ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat; + FT_UInt total = 0; + + + OTV_NAME_ENTER( "Coverage" ); + + OTV_LIMIT_CHECK( 4 ); + CoverageFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", CoverageFormat )); + + switch ( CoverageFormat ) + { + case 1: /* CoverageFormat1 */ + { + FT_UInt GlyphCount; + FT_UInt i; + + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* GlyphArray */ + + for ( i = 0; i < GlyphCount; i++ ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + + total = GlyphCount; + } + break; + + case 2: /* CoverageFormat2 */ + { + FT_UInt n, RangeCount; + FT_UInt Start, End, StartCoverageIndex, last = 0; + + + RangeCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (RangeCount = %d)\n", RangeCount )); + + OTV_LIMIT_CHECK( RangeCount * 6 ); + + /* RangeRecord */ + for ( n = 0; n < RangeCount; n++ ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + StartCoverageIndex = FT_NEXT_USHORT( p ); + + if ( Start > End || StartCoverageIndex != total ) + FT_INVALID_DATA; + + if ( End >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + + if ( n > 0 && Start <= last ) + FT_INVALID_DATA; + + total += End - Start + 1; + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* Generally, a coverage table offset has an associated count field. */ + /* The number of glyphs in the table should match this field. If */ + /* there is no associated count, a value of -1 tells us not to check. */ + if ( expected_count != -1 && (FT_UInt)expected_count != total ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ) + { + FT_Bytes p = table; + + + p += 4; /* skip CoverageFormat and Glyph/RangeCount */ + + return FT_NEXT_USHORT( p ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); + FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ + FT_UInt result = 0; + + + if ( !count ) + return result; + + switch ( CoverageFormat ) + { + case 1: + p += ( count - 1 ) * 2; + result = FT_NEXT_USHORT( p ); + break; + + case 2: + p += ( count - 1 ) * 6 + 2; + result = FT_NEXT_USHORT( p ); + break; + + default: + ; + } + + return result; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); + FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ + FT_UInt result = 0; + + + switch ( CoverageFormat ) + { + case 1: + return count; + + case 2: + { + FT_UInt Start, End; + + + for ( ; count > 0; count-- ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + p += 2; /* skip StartCoverageIndex */ + + result += End - Start + 1; + } + } + break; + + default: + ; + } + + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt ClassFormat; + + + OTV_NAME_ENTER( "ClassDef" ); + + OTV_LIMIT_CHECK( 4 ); + ClassFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", ClassFormat )); + + switch ( ClassFormat ) + { + case 1: /* ClassDefFormat1 */ + { + FT_UInt StartGlyph; + FT_UInt GlyphCount; + + + OTV_LIMIT_CHECK( 4 ); + + StartGlyph = FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* ClassValueArray */ + + if ( StartGlyph + GlyphCount - 1 >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + break; + + case 2: /* ClassDefFormat2 */ + { + FT_UInt n, ClassRangeCount; + FT_UInt Start, End, last = 0; + + + ClassRangeCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassRangeCount = %d)\n", ClassRangeCount )); + + OTV_LIMIT_CHECK( ClassRangeCount * 6 ); + + /* ClassRangeRecord */ + for ( n = 0; n < ClassRangeCount; n++ ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + p += 2; /* skip Class */ + + if ( Start > End || ( n > 0 && Start <= last ) ) + FT_INVALID_DATA; + + if ( End >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* no need to check glyph indices used as input to class definition */ + /* tables since even invalid glyph indices return a meaningful result */ + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt StartSize, EndSize, DeltaFormat, count; + + + OTV_NAME_ENTER( "Device" ); + + OTV_LIMIT_CHECK( 6 ); + StartSize = FT_NEXT_USHORT( p ); + EndSize = FT_NEXT_USHORT( p ); + DeltaFormat = FT_NEXT_USHORT( p ); + + if ( DeltaFormat == 0x8000U ) + { + /* VariationIndex, nothing to do */ + } + else + { + if ( DeltaFormat < 1 || DeltaFormat > 3 ) + FT_INVALID_FORMAT; + + if ( EndSize < StartSize ) + FT_INVALID_DATA; + + count = EndSize - StartSize + 1; + OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 ); /* DeltaValue */ + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses otvalid->type_count */ + /* uses otvalid->type_funcs */ + + FT_LOCAL_DEF( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt LookupType, LookupFlag, SubTableCount; + OTV_Validate_Func validate; + + + OTV_NAME_ENTER( "Lookup" ); + + OTV_LIMIT_CHECK( 6 ); + LookupType = FT_NEXT_USHORT( p ); + LookupFlag = FT_NEXT_USHORT( p ); + SubTableCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (type %d)\n", LookupType )); + + if ( LookupType == 0 || LookupType > otvalid->type_count ) + FT_INVALID_DATA; + + validate = otvalid->type_funcs[LookupType - 1]; + + OTV_TRACE(( " (SubTableCount = %d)\n", SubTableCount )); + + OTV_LIMIT_CHECK( SubTableCount * 2 ); + + /* SubTable */ + for ( ; SubTableCount > 0; SubTableCount-- ) + validate( table + FT_NEXT_USHORT( p ), otvalid ); + + if ( LookupFlag & 0x10 ) + OTV_LIMIT_CHECK( 2 ); /* MarkFilteringSet */ + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt LookupCount; + + + OTV_NAME_ENTER( "LookupList" ); + + OTV_LIMIT_CHECK( 2 ); + LookupCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); + + OTV_LIMIT_CHECK( LookupCount * 2 ); + + otvalid->lookup_count = LookupCount; + + /* Lookup */ + for ( ; LookupCount > 0; LookupCount-- ) + otv_Lookup_validate( table + FT_NEXT_USHORT( p ), otvalid ); + + OTV_EXIT; + } + + + static FT_UInt + otv_LookupList_get_count( FT_Bytes table ) + { + return FT_NEXT_USHORT( table ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses otvalid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt LookupCount; + + + OTV_NAME_ENTER( "Feature" ); + + OTV_LIMIT_CHECK( 4 ); + p += 2; /* skip FeatureParams (unused) */ + LookupCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); + + OTV_LIMIT_CHECK( LookupCount * 2 ); + + /* LookupListIndex */ + for ( ; LookupCount > 0; LookupCount-- ) + if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + static FT_UInt + otv_Feature_get_count( FT_Bytes table ) + { + return FT_NEXT_USHORT( table ); + } + + + /* sets otvalid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt FeatureCount; + + + OTV_NAME_ENTER( "FeatureList" ); + + OTV_LIMIT_CHECK( 2 ); + FeatureCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); + + OTV_LIMIT_CHECK( FeatureCount * 2 ); + + otvalid->lookup_count = otv_LookupList_get_count( lookups ); + + /* FeatureRecord */ + for ( ; FeatureCount > 0; FeatureCount-- ) + { + p += 4; /* skip FeatureTag */ + + /* Feature */ + otv_Feature_validate( table + FT_NEXT_USHORT( p ), otvalid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* uses otvalid->extra1 (number of features) */ + + FT_LOCAL_DEF( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt ReqFeatureIndex; + FT_UInt FeatureCount; + + + OTV_NAME_ENTER( "LangSys" ); + + OTV_LIMIT_CHECK( 6 ); + p += 2; /* skip LookupOrder (unused) */ + ReqFeatureIndex = FT_NEXT_USHORT( p ); + FeatureCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ReqFeatureIndex = %d)\n", ReqFeatureIndex )); + OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); + + if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= otvalid->extra1 ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( FeatureCount * 2 ); + + /* FeatureIndex */ + for ( ; FeatureCount > 0; FeatureCount-- ) + if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_UInt DefaultLangSys, LangSysCount; + FT_Bytes p = table; + + + OTV_NAME_ENTER( "Script" ); + + OTV_LIMIT_CHECK( 4 ); + DefaultLangSys = FT_NEXT_USHORT( p ); + LangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LangSysCount = %d)\n", LangSysCount )); + + if ( DefaultLangSys != 0 ) + otv_LangSys_validate( table + DefaultLangSys, otvalid ); + + OTV_LIMIT_CHECK( LangSysCount * 6 ); + + /* LangSysRecord */ + for ( ; LangSysCount > 0; LangSysCount-- ) + { + p += 4; /* skip LangSysTag */ + + /* LangSys */ + otv_LangSys_validate( table + FT_NEXT_USHORT( p ), otvalid ); + } + + OTV_EXIT; + } + + + /* sets otvalid->extra1 (number of features) */ + + FT_LOCAL_DEF( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator otvalid ) + { + FT_UInt ScriptCount; + FT_Bytes p = table; + + + OTV_NAME_ENTER( "ScriptList" ); + + OTV_LIMIT_CHECK( 2 ); + ScriptCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ScriptCount = %d)\n", ScriptCount )); + + OTV_LIMIT_CHECK( ScriptCount * 6 ); + + otvalid->extra1 = otv_Feature_get_count( features ); + + /* ScriptRecord */ + for ( ; ScriptCount > 0; ScriptCount-- ) + { + p += 4; /* skip ScriptTag */ + + otv_Script_validate( table + FT_NEXT_USHORT( p ), otvalid ); /* Script */ + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + u: uint16 + ux: unit16 [x] + + s: struct + sx: struct [x] + sxy: struct [x], using external y count + + x: uint16 x + + C: Coverage + + O: Offset + On: Offset (NULL) + Ox: Offset [x] + Onx: Offset (NULL) [x] + */ + + FT_LOCAL_DEF( void ) + otv_x_Ox( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Count; + OTV_Validate_Func func; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 2 ); + + otvalid->nesting_level++; + func = otvalid->func[otvalid->nesting_level]; + + for ( ; Count > 0; Count-- ) + func( table + FT_NEXT_USHORT( p ), otvalid ); + + otvalid->nesting_level--; + + OTV_EXIT; + } + + + FT_LOCAL_DEF( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Count, Coverage; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)Count ); + + OTV_LIMIT_CHECK( Count * 2 ); + + otvalid->nesting_level++; + func = otvalid->func[otvalid->nesting_level]; + + for ( ; Count > 0; Count-- ) + func( table + FT_NEXT_USHORT( p ), otvalid ); + + otvalid->nesting_level--; + + OTV_EXIT; + } + + + /* uses otvalid->extra1 (if > 0: array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Count; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 2 ); + + if ( otvalid->extra1 ) + { + for ( ; Count > 0; Count-- ) + if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* `ux' in the function's name is not really correct since only x-1 */ + /* elements are tested */ + + /* uses otvalid->extra1 (array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Count1, Count2; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + Count1 = FT_NEXT_USHORT( p ); + Count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count1 = %d)\n", Count1 )); + OTV_TRACE(( " (Count2 = %d)\n", Count2 )); + + if ( Count1 == 0 ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 ); + p += ( Count1 - 1 ) * 2; + + for ( ; Count2 > 0; Count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= Count1 ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* `uy' in the function's name is not really correct since only y-1 */ + /* elements are tested */ + + /* uses otvalid->extra1 (array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt BacktrackCount, InputCount, LookaheadCount; + FT_UInt Count; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + BacktrackCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackCount = %d)\n", BacktrackCount )); + + OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 ); + p += BacktrackCount * 2; + + InputCount = FT_NEXT_USHORT( p ); + if ( InputCount == 0 ) + FT_INVALID_DATA; + + OTV_TRACE(( " (InputCount = %d)\n", InputCount )); + + OTV_LIMIT_CHECK( InputCount * 2 ); + p += ( InputCount - 1 ) * 2; + + LookaheadCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadCount = %d)\n", LookaheadCount )); + + OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 ); + p += LookaheadCount * 2; + + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 4 ); + + for ( ; Count > 0; Count-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* sets otvalid->extra1 (valid->lookup_count) */ + + FT_LOCAL_DEF( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Coverage, ClassDef, ClassSetCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 6 ); + Coverage = FT_NEXT_USHORT( p ); + ClassDef = FT_NEXT_USHORT( p ); + ClassSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassSetCount = %d)\n", ClassSetCount )); + + otv_Coverage_validate( table + Coverage, otvalid, -1 ); + otv_ClassDef_validate( table + ClassDef, otvalid ); + + OTV_LIMIT_CHECK( ClassSetCount * 2 ); + + otvalid->nesting_level++; + func = otvalid->func[otvalid->nesting_level]; + otvalid->extra1 = otvalid->lookup_count; + + for ( ; ClassSetCount > 0; ClassSetCount-- ) + { + FT_UInt offset = FT_NEXT_USHORT( p ); + + + if ( offset ) + func( table + offset, otvalid ); + } + + otvalid->nesting_level--; + + OTV_EXIT; + } + + + /* uses otvalid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt GlyphCount, Count, count1; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 4 ); + GlyphCount = FT_NEXT_USHORT( p ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 ); + + for ( count1 = GlyphCount; count1 > 0; count1-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); + + for ( ; Count > 0; Count-- ) + { + if ( FT_NEXT_USHORT( p ) >= GlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* sets otvalid->extra1 (valid->lookup_count) */ + + FT_LOCAL_DEF( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Coverage; + FT_UInt BacktrackClassDef, InputClassDef, LookaheadClassDef; + FT_UInt ChainClassSetCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 10 ); + Coverage = FT_NEXT_USHORT( p ); + BacktrackClassDef = FT_NEXT_USHORT( p ); + InputClassDef = FT_NEXT_USHORT( p ); + LookaheadClassDef = FT_NEXT_USHORT( p ); + ChainClassSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ChainClassSetCount = %d)\n", ChainClassSetCount )); + + otv_Coverage_validate( table + Coverage, otvalid, -1 ); + + otv_ClassDef_validate( table + BacktrackClassDef, otvalid ); + otv_ClassDef_validate( table + InputClassDef, otvalid ); + otv_ClassDef_validate( table + LookaheadClassDef, otvalid ); + + OTV_LIMIT_CHECK( ChainClassSetCount * 2 ); + + otvalid->nesting_level++; + func = otvalid->func[otvalid->nesting_level]; + otvalid->extra1 = otvalid->lookup_count; + + for ( ; ChainClassSetCount > 0; ChainClassSetCount-- ) + { + FT_UInt offset = FT_NEXT_USHORT( p ); + + + if ( offset ) + func( table + offset, otvalid ); + } + + otvalid->nesting_level--; + + OTV_EXIT; + } + + + /* uses otvalid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount; + FT_UInt count1, count2; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 2 ); + BacktrackGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); + + InputGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (InputGlyphCount = %d)\n", InputGlyphCount )); + + OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 ); + + for ( count1 = InputGlyphCount; count1 > 0; count1-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); + + LookaheadGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); + + OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); + + for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); + + count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", count2 )); + + OTV_LIMIT_CHECK( count2 * 4 ); + + for ( ; count2 > 0; count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputGlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ) + { + FT_Bytes p = table + 8; + + + return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ) + { + FT_Bytes p, lookup; + FT_UInt count; + + + if ( !table ) + return 0; + + /* LookupList */ + p = table + 8; + table += FT_NEXT_USHORT( p ); + + /* LookupCount */ + p = table; + count = FT_NEXT_USHORT( p ); + + for ( ; count > 0; count-- ) + { + FT_Bytes oldp; + + + /* Lookup */ + lookup = table + FT_NEXT_USHORT( p ); + + oldp = p; + + /* LookupFlag */ + p = lookup + 2; + if ( FT_NEXT_USHORT( p ) & 0xFF00U ) + return 1; + + p = oldp; + } + + return 0; + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvcommn.h b/external/freetype/src/otvalid/otvcommn.h new file mode 100644 index 000000000..6702c0008 --- /dev/null +++ b/external/freetype/src/otvalid/otvcommn.h @@ -0,0 +1,468 @@ +/**************************************************************************** + * + * otvcommn.h + * + * OpenType common tables validation (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef OTVCOMMN_H_ +#define OTVCOMMN_H_ + + +#include "otvalid.h" +#include <freetype/internal/ftdebug.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALIDATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct OTV_ValidatorRec_* OTV_Validator; + + typedef void (*OTV_Validate_Func)( FT_Bytes table, + OTV_Validator otvalid ); + + typedef struct OTV_ValidatorRec_ + { + FT_Validator root; + FT_UInt type_count; + OTV_Validate_Func* type_funcs; + + FT_UInt lookup_count; + FT_UInt glyph_count; + + FT_UInt nesting_level; + + OTV_Validate_Func func[3]; + + FT_UInt extra1; /* for passing parameters */ + FT_UInt extra2; + FT_Bytes extra3; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt debug_indent; + const FT_String* debug_function_name[3]; +#endif + + } OTV_ValidatorRec; + + +#undef FT_INVALID_ +#define FT_INVALID_( _error ) \ + ft_validator_error( otvalid->root, FT_THROW( _error ) ) + +#define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \ + FT_Bytes _table ## _p + +#define OTV_OPTIONAL_TABLE32( _table ) FT_ULong _table; \ + FT_Bytes _table ## _p + +#define OTV_OPTIONAL_OFFSET( _offset ) \ + FT_BEGIN_STMNT \ + _offset ## _p = p; \ + _offset = FT_NEXT_USHORT( p ); \ + FT_END_STMNT + +#define OTV_OPTIONAL_OFFSET32( _offset ) \ + FT_BEGIN_STMNT \ + _offset ## _p = p; \ + _offset = FT_NEXT_ULONG( p ); \ + FT_END_STMNT + +#define OTV_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( p + (_count) > otvalid->root->limit ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + +#define OTV_SIZE_CHECK( _size ) \ + FT_BEGIN_STMNT \ + if ( _size > 0 && _size < table_size ) \ + { \ + if ( otvalid->root->level == FT_VALIDATE_PARANOID ) \ + FT_INVALID_OFFSET; \ + else \ + { \ + /* strip off `const' */ \ + FT_Byte* pp = (FT_Byte*)_size ## _p; \ + \ + \ + FT_TRACE3(( "\n" )); \ + FT_TRACE3(( "Invalid offset to optional table `%s'" \ + " set to zero.\n", \ + #_size )); \ + FT_TRACE3(( "\n" )); \ + \ + _size = pp[0] = pp[1] = 0; \ + } \ + } \ + FT_END_STMNT + +#define OTV_SIZE_CHECK32( _size ) \ + FT_BEGIN_STMNT \ + if ( _size > 0 && _size < table_size ) \ + { \ + if ( otvalid->root->level == FT_VALIDATE_PARANOID ) \ + FT_INVALID_OFFSET; \ + else \ + { \ + /* strip off `const' */ \ + FT_Byte* pp = (FT_Byte*)_size ## _p; \ + \ + \ + FT_TRACE3(( "\n" )); \ + FT_TRACE3(( "Invalid offset to optional table `%s'" \ + " set to zero.\n", \ + #_size )); \ + FT_TRACE3(( "\n" )); \ + \ + _size = pp[0] = pp[1] = pp[2] = pp[3] = 0; \ + } \ + } \ + FT_END_STMNT + + +#define OTV_NAME_(x) #x +#define OTV_NAME(x) OTV_NAME_(x) + +#define OTV_FUNC_(x) x##Func +#define OTV_FUNC(x) OTV_FUNC_(x) + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define OTV_NEST1( x ) \ + FT_BEGIN_STMNT \ + otvalid->nesting_level = 0; \ + otvalid->func[0] = OTV_FUNC( x ); \ + otvalid->debug_function_name[0] = OTV_NAME( x ); \ + FT_END_STMNT + +#define OTV_NEST2( x, y ) \ + FT_BEGIN_STMNT \ + otvalid->nesting_level = 0; \ + otvalid->func[0] = OTV_FUNC( x ); \ + otvalid->func[1] = OTV_FUNC( y ); \ + otvalid->debug_function_name[0] = OTV_NAME( x ); \ + otvalid->debug_function_name[1] = OTV_NAME( y ); \ + FT_END_STMNT + +#define OTV_NEST3( x, y, z ) \ + FT_BEGIN_STMNT \ + otvalid->nesting_level = 0; \ + otvalid->func[0] = OTV_FUNC( x ); \ + otvalid->func[1] = OTV_FUNC( y ); \ + otvalid->func[2] = OTV_FUNC( z ); \ + otvalid->debug_function_name[0] = OTV_NAME( x ); \ + otvalid->debug_function_name[1] = OTV_NAME( y ); \ + otvalid->debug_function_name[2] = OTV_NAME( z ); \ + FT_END_STMNT + +#define OTV_INIT otvalid->debug_indent = 0 + +#define OTV_ENTER \ + FT_BEGIN_STMNT \ + otvalid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \ + FT_TRACE4(( "%s table\n", \ + otvalid->debug_function_name[otvalid->nesting_level] )); \ + FT_END_STMNT + +#define OTV_NAME_ENTER( name ) \ + FT_BEGIN_STMNT \ + otvalid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \ + FT_TRACE4(( "%s table\n", name )); \ + FT_END_STMNT + +#define OTV_EXIT otvalid->debug_indent -= 2 + +#define OTV_TRACE( s ) \ + FT_BEGIN_STMNT \ + FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \ + FT_TRACE4( s ); \ + FT_END_STMNT + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define OTV_NEST1( x ) \ + FT_BEGIN_STMNT \ + otvalid->nesting_level = 0; \ + otvalid->func[0] = OTV_FUNC( x ); \ + FT_END_STMNT + +#define OTV_NEST2( x, y ) \ + FT_BEGIN_STMNT \ + otvalid->nesting_level = 0; \ + otvalid->func[0] = OTV_FUNC( x ); \ + otvalid->func[1] = OTV_FUNC( y ); \ + FT_END_STMNT + +#define OTV_NEST3( x, y, z ) \ + FT_BEGIN_STMNT \ + otvalid->nesting_level = 0; \ + otvalid->func[0] = OTV_FUNC( x ); \ + otvalid->func[1] = OTV_FUNC( y ); \ + otvalid->func[2] = OTV_FUNC( z ); \ + FT_END_STMNT + +#define OTV_INIT do { } while ( 0 ) +#define OTV_ENTER do { } while ( 0 ) +#define OTV_NAME_ENTER( name ) do { } while ( 0 ) +#define OTV_EXIT do { } while ( 0 ) + +#define OTV_TRACE( s ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define OTV_RUN otvalid->func[0] + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** COVERAGE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Coverage_validate( FT_Bytes table, + OTV_Validator otvalid, + FT_Int expected_count ); + + /* return first covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ); + + /* return last covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ); + + /* return number of covered glyphs */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator otvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator otvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator otvalid ); + + FT_LOCAL( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator otvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator otvalid ); + + /* lookups must already be validated */ + FT_LOCAL( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator otvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator otvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator otvalid ); + + /* features must already be validated */ + FT_LOCAL( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator otvalid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define ChainPosClassSetFunc otv_x_Ox +#define ChainPosRuleSetFunc otv_x_Ox +#define ChainSubClassSetFunc otv_x_Ox +#define ChainSubRuleSetFunc otv_x_Ox +#define JstfLangSysFunc otv_x_Ox +#define JstfMaxFunc otv_x_Ox +#define LigGlyphFunc otv_x_Ox +#define LigatureArrayFunc otv_x_Ox +#define LigatureSetFunc otv_x_Ox +#define PosClassSetFunc otv_x_Ox +#define PosRuleSetFunc otv_x_Ox +#define SubClassSetFunc otv_x_Ox +#define SubRuleSetFunc otv_x_Ox + + FT_LOCAL( void ) + otv_x_Ox ( FT_Bytes table, + OTV_Validator otvalid ); + +#define AlternateSubstFormat1Func otv_u_C_x_Ox +#define ChainContextPosFormat1Func otv_u_C_x_Ox +#define ChainContextSubstFormat1Func otv_u_C_x_Ox +#define ContextPosFormat1Func otv_u_C_x_Ox +#define ContextSubstFormat1Func otv_u_C_x_Ox +#define LigatureSubstFormat1Func otv_u_C_x_Ox +#define MultipleSubstFormat1Func otv_u_C_x_Ox + + FT_LOCAL( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator otvalid ); + +#define AlternateSetFunc otv_x_ux +#define AttachPointFunc otv_x_ux +#define ExtenderGlyphFunc otv_x_ux +#define JstfGPOSModListFunc otv_x_ux +#define JstfGSUBModListFunc otv_x_ux +#define SequenceFunc otv_x_ux + + FT_LOCAL( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator otvalid ); + +#define PosClassRuleFunc otv_x_y_ux_sy +#define PosRuleFunc otv_x_y_ux_sy +#define SubClassRuleFunc otv_x_y_ux_sy +#define SubRuleFunc otv_x_y_ux_sy + + FT_LOCAL( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator otvalid ); + +#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp + + FT_LOCAL( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator otvalid ); + +#define ContextPosFormat2Func otv_u_O_O_x_Onx +#define ContextSubstFormat2Func otv_u_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator otvalid ); + +#define ContextPosFormat3Func otv_u_x_y_Ox_sy +#define ContextSubstFormat3Func otv_u_x_y_Ox_sy + + FT_LOCAL( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator otvalid ); + +#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx +#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator otvalid ); + +#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp +#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp + + FT_LOCAL( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator otvalid ); + + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); + + /* */ + +FT_END_HEADER + +#endif /* OTVCOMMN_H_ */ + + +/* END */ diff --git a/external/freetype/src/otvalid/otverror.h b/external/freetype/src/otvalid/otverror.h new file mode 100644 index 000000000..4c4049ca5 --- /dev/null +++ b/external/freetype/src/otvalid/otverror.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * otverror.h + * + * OpenType validation module error codes (specification only). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the OpenType validation module error + * enumeration constants. + * + */ + +#ifndef OTVERROR_H_ +#define OTVERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX OTV_Err_ +#define FT_ERR_BASE FT_Mod_Err_OTvalid + +#include <freetype/fterrors.h> + +#endif /* OTVERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/otvalid/otvgdef.c b/external/freetype/src/otvalid/otvgdef.c new file mode 100644 index 000000000..d62e8187f --- /dev/null +++ b/external/freetype/src/otvalid/otvgdef.c @@ -0,0 +1,303 @@ +/**************************************************************************** + * + * otvgdef.c + * + * OpenType GDEF table validation (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvgdef + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define AttachListFunc otv_O_x_Ox +#define LigCaretListFunc otv_O_x_Ox + + /* sets valid->extra1 (0) */ + + static void + otv_O_x_Ox( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_Bytes Coverage; + FT_UInt GlyphCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + otv_Coverage_validate( Coverage, otvalid, (FT_Int)GlyphCount ); + if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + otvalid->nesting_level++; + func = otvalid->func[otvalid->nesting_level]; + otvalid->extra1 = 0; + + for ( ; GlyphCount > 0; GlyphCount-- ) + func( table + FT_NEXT_USHORT( p ), otvalid ); + + otvalid->nesting_level--; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LIGATURE CARETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define CaretValueFunc otv_CaretValue_validate + + static void + otv_CaretValue_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt CaretValueFormat; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + + CaretValueFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format = %d)\n", CaretValueFormat )); + + switch ( CaretValueFormat ) + { + case 1: /* CaretValueFormat1 */ + /* skip Coordinate, no test */ + break; + + case 2: /* CaretValueFormat2 */ + /* skip CaretValuePoint, no test */ + break; + + case 3: /* CaretValueFormat3 */ + p += 2; /* skip Coordinate */ + + OTV_LIMIT_CHECK( 2 ); + + /* DeviceTable */ + otv_Device_validate( table + FT_NEXT_USHORT( p ), otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MARK GLYPH SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MarkGlyphSets_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt MarkGlyphSetCount; + + + OTV_NAME_ENTER( "MarkGlyphSets" ); + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 2 ); + MarkGlyphSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (MarkGlyphSetCount = %d)\n", MarkGlyphSetCount )); + + OTV_LIMIT_CHECK( MarkGlyphSetCount * 4 ); /* CoverageOffsets */ + + for ( ; MarkGlyphSetCount > 0; MarkGlyphSetCount-- ) + otv_Coverage_validate( table + FT_NEXT_ULONG( p ), otvalid, -1 ); + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GDEF TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec otvalidrec; + OTV_Validator otvalid = &otvalidrec; + FT_Bytes p = table; + FT_UInt table_size; + FT_UShort version; + FT_Bool need_MarkAttachClassDef = 1; + + OTV_OPTIONAL_TABLE( GlyphClassDef ); + OTV_OPTIONAL_TABLE( AttachListOffset ); + OTV_OPTIONAL_TABLE( LigCaretListOffset ); + OTV_OPTIONAL_TABLE( MarkAttachClassDef ); + OTV_OPTIONAL_TABLE( MarkGlyphSetsDef ); + + OTV_OPTIONAL_TABLE32( itemVarStore ); + + + otvalid->root = ftvalid; + + FT_TRACE3(( "validating GDEF table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 4 ); + + if ( FT_NEXT_USHORT( p ) != 1 ) /* majorVersion */ + FT_INVALID_FORMAT; + + version = FT_NEXT_USHORT( p ); /* minorVersion */ + + table_size = 10; + switch ( version ) + { + case 0: + /* MarkAttachClassDef has been added to the OpenType */ + /* specification without increasing GDEF's version, */ + /* so we use this ugly hack to find out whether the */ + /* table is needed actually. */ + + need_MarkAttachClassDef = FT_BOOL( + otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) || + otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) ); + + if ( need_MarkAttachClassDef ) + { + OTV_LIMIT_CHECK( 8 ); + table_size += 2; + } + else + OTV_LIMIT_CHECK( 6 ); /* OpenType < 1.2 */ + + break; + + case 2: + OTV_LIMIT_CHECK( 10 ); + table_size += 4; + break; + + case 3: + OTV_LIMIT_CHECK( 14 ); + table_size += 8; + break; + + default: + FT_INVALID_FORMAT; + } + + otvalid->glyph_count = glyph_count; + + OTV_OPTIONAL_OFFSET( GlyphClassDef ); + OTV_SIZE_CHECK( GlyphClassDef ); + if ( GlyphClassDef ) + otv_ClassDef_validate( table + GlyphClassDef, otvalid ); + + OTV_OPTIONAL_OFFSET( AttachListOffset ); + OTV_SIZE_CHECK( AttachListOffset ); + if ( AttachListOffset ) + { + OTV_NEST2( AttachList, AttachPoint ); + OTV_RUN( table + AttachListOffset, otvalid ); + } + + OTV_OPTIONAL_OFFSET( LigCaretListOffset ); + OTV_SIZE_CHECK( LigCaretListOffset ); + if ( LigCaretListOffset ) + { + OTV_NEST3( LigCaretList, LigGlyph, CaretValue ); + OTV_RUN( table + LigCaretListOffset, otvalid ); + } + + if ( need_MarkAttachClassDef ) + { + OTV_OPTIONAL_OFFSET( MarkAttachClassDef ); + OTV_SIZE_CHECK( MarkAttachClassDef ); + if ( MarkAttachClassDef ) + otv_ClassDef_validate( table + MarkAttachClassDef, otvalid ); + } + + if ( version > 0 ) + { + OTV_OPTIONAL_OFFSET( MarkGlyphSetsDef ); + OTV_SIZE_CHECK( MarkGlyphSetsDef ); + if ( MarkGlyphSetsDef ) + otv_MarkGlyphSets_validate( table + MarkGlyphSetsDef, otvalid ); + } + + if ( version > 2 ) + { + OTV_OPTIONAL_OFFSET32( itemVarStore ); + OTV_SIZE_CHECK32( itemVarStore ); + if ( itemVarStore ) + OTV_TRACE(( " [omitting itemVarStore validation]\n" )); /* XXX */ + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvgpos.c b/external/freetype/src/otvalid/otvgpos.c new file mode 100644 index 000000000..f6102afbc --- /dev/null +++ b/external/freetype/src/otvalid/otvgpos.c @@ -0,0 +1,1051 @@ +/**************************************************************************** + * + * otvgpos.c + * + * OpenType GPOS table validation (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvgpos + + + static void + otv_Anchor_validate( FT_Bytes table, + OTV_Validator valid ); + + static void + otv_MarkArray_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define BaseArrayFunc otv_x_sxy +#define LigatureAttachFunc otv_x_sxy +#define Mark2ArrayFunc otv_x_sxy + + /* uses valid->extra1 (counter) */ + /* uses valid->extra2 (boolean to handle NULL anchor field) */ + + static void + otv_x_sxy( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Count, count1, table_size; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * otvalid->extra1 * 2 ); + + table_size = Count * otvalid->extra1 * 2 + 2; + + for ( ; Count > 0; Count-- ) + for ( count1 = otvalid->extra1; count1 > 0; count1-- ) + { + OTV_OPTIONAL_TABLE( anchor_offset ); + + + OTV_OPTIONAL_OFFSET( anchor_offset ); + + if ( otvalid->extra2 ) + { + OTV_SIZE_CHECK( anchor_offset ); + if ( anchor_offset ) + otv_Anchor_validate( table + anchor_offset, otvalid ); + } + else + otv_Anchor_validate( table + anchor_offset, otvalid ); + } + + OTV_EXIT; + } + + +#define MarkBasePosFormat1Func otv_u_O_O_u_O_O +#define MarkLigPosFormat1Func otv_u_O_O_u_O_O +#define MarkMarkPosFormat1Func otv_u_O_O_u_O_O + + /* sets otvalid->extra1 (class count) */ + + static void + otv_u_O_O_u_O_O( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt Coverage1, Coverage2, ClassCount; + FT_UInt Array1, Array2; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip PosFormat */ + + OTV_LIMIT_CHECK( 10 ); + Coverage1 = FT_NEXT_USHORT( p ); + Coverage2 = FT_NEXT_USHORT( p ); + ClassCount = FT_NEXT_USHORT( p ); + Array1 = FT_NEXT_USHORT( p ); + Array2 = FT_NEXT_USHORT( p ); + + otv_Coverage_validate( table + Coverage1, otvalid, -1 ); + otv_Coverage_validate( table + Coverage2, otvalid, -1 ); + + otv_MarkArray_validate( table + Array1, otvalid ); + + otvalid->nesting_level++; + func = otvalid->func[otvalid->nesting_level]; + otvalid->extra1 = ClassCount; + + func( table + Array2, otvalid ); + + otvalid->nesting_level--; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALUE RECORDS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_UInt + otv_value_length( FT_UInt format ) + { + FT_UInt count; + + + count = ( ( format & 0xAA ) >> 1 ) + ( format & 0x55 ); + count = ( ( count & 0xCC ) >> 2 ) + ( count & 0x33 ); + count = ( ( count & 0xF0 ) >> 4 ) + ( count & 0x0F ); + + return count * 2; + } + + + /* uses otvalid->extra3 (pointer to base table) */ + + static void + otv_ValueRecord_validate( FT_Bytes table, + FT_UInt format, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt count; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Int loop; + FT_ULong res = 0; + + + OTV_NAME_ENTER( "ValueRecord" ); + + /* display `format' in dual representation */ + for ( loop = 7; loop >= 0; loop-- ) + { + res <<= 4; + res += ( format >> loop ) & 1; + } + + OTV_TRACE(( " (format 0b%08lx)\n", res )); +#endif + + if ( format >= 0x100 ) + FT_INVALID_FORMAT; + + for ( count = 4; count > 0; count-- ) + { + if ( format & 1 ) + { + /* XPlacement, YPlacement, XAdvance, YAdvance */ + OTV_LIMIT_CHECK( 2 ); + p += 2; + } + + format >>= 1; + } + + for ( count = 4; count > 0; count-- ) + { + if ( format & 1 ) + { + FT_PtrDist table_size; + + OTV_OPTIONAL_TABLE( device ); + + + /* XPlaDevice, YPlaDevice, XAdvDevice, YAdvDevice */ + OTV_LIMIT_CHECK( 2 ); + OTV_OPTIONAL_OFFSET( device ); + + table_size = p - otvalid->extra3; + + OTV_SIZE_CHECK( device ); + if ( device ) + otv_Device_validate( otvalid->extra3 + device, otvalid ); + } + format >>= 1; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ANCHORS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_Anchor_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt AnchorFormat; + + + OTV_NAME_ENTER( "Anchor"); + + OTV_LIMIT_CHECK( 6 ); + AnchorFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", AnchorFormat )); + + p += 4; /* skip XCoordinate and YCoordinate */ + + switch ( AnchorFormat ) + { + case 1: + break; + + case 2: + OTV_LIMIT_CHECK( 2 ); /* AnchorPoint */ + break; + + case 3: + { + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( XDeviceTable ); + OTV_OPTIONAL_TABLE( YDeviceTable ); + + + OTV_LIMIT_CHECK( 4 ); + OTV_OPTIONAL_OFFSET( XDeviceTable ); + OTV_OPTIONAL_OFFSET( YDeviceTable ); + + table_size = 6 + 4; + + OTV_SIZE_CHECK( XDeviceTable ); + if ( XDeviceTable ) + otv_Device_validate( table + XDeviceTable, otvalid ); + + OTV_SIZE_CHECK( YDeviceTable ); + if ( YDeviceTable ) + otv_Device_validate( table + YDeviceTable, otvalid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MARK ARRAYS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MarkArray_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt MarkCount; + + + OTV_NAME_ENTER( "MarkArray" ); + + OTV_LIMIT_CHECK( 2 ); + MarkCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (MarkCount = %d)\n", MarkCount )); + + OTV_LIMIT_CHECK( MarkCount * 4 ); + + /* MarkRecord */ + for ( ; MarkCount > 0; MarkCount-- ) + { + p += 2; /* skip Class */ + /* MarkAnchor */ + otv_Anchor_validate( table + FT_NEXT_USHORT( p ), otvalid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 1 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra3 (pointer to base table) */ + + static void + otv_SinglePos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "SinglePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + otvalid->extra3 = table; + + switch ( PosFormat ) + { + case 1: /* SinglePosFormat1 */ + { + FT_UInt Coverage, ValueFormat; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat = FT_NEXT_USHORT( p ); + + otv_Coverage_validate( table + Coverage, otvalid, -1 ); + otv_ValueRecord_validate( p, ValueFormat, otvalid ); /* Value */ + } + break; + + case 2: /* SinglePosFormat2 */ + { + FT_UInt Coverage, ValueFormat, ValueCount, len_value; + + + OTV_LIMIT_CHECK( 6 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat = FT_NEXT_USHORT( p ); + ValueCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ValueCount = %d)\n", ValueCount )); + + len_value = otv_value_length( ValueFormat ); + + otv_Coverage_validate( table + Coverage, + otvalid, + (FT_Int)ValueCount ); + + OTV_LIMIT_CHECK( ValueCount * len_value ); + + /* Value */ + for ( ; ValueCount > 0; ValueCount-- ) + { + otv_ValueRecord_validate( p, ValueFormat, otvalid ); + p += len_value; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 2 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra3 (pointer to base table) */ + + static void + otv_PairSet_validate( FT_Bytes table, + FT_UInt format1, + FT_UInt format2, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt value_len1, value_len2, PairValueCount; + + + OTV_NAME_ENTER( "PairSet" ); + + otvalid->extra3 = table; + + OTV_LIMIT_CHECK( 2 ); + PairValueCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (PairValueCount = %d)\n", PairValueCount )); + + value_len1 = otv_value_length( format1 ); + value_len2 = otv_value_length( format2 ); + + OTV_LIMIT_CHECK( PairValueCount * ( value_len1 + value_len2 + 2 ) ); + + /* PairValueRecord */ + for ( ; PairValueCount > 0; PairValueCount-- ) + { + p += 2; /* skip SecondGlyph */ + + if ( format1 ) + otv_ValueRecord_validate( p, format1, otvalid ); /* Value1 */ + p += value_len1; + + if ( format2 ) + otv_ValueRecord_validate( p, format2, otvalid ); /* Value2 */ + p += value_len2; + } + + OTV_EXIT; + } + + + /* sets otvalid->extra3 (pointer to base table) */ + + static void + otv_PairPos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "PairPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* PairPosFormat1 */ + { + FT_UInt Coverage, ValueFormat1, ValueFormat2, PairSetCount; + + + OTV_LIMIT_CHECK( 8 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat1 = FT_NEXT_USHORT( p ); + ValueFormat2 = FT_NEXT_USHORT( p ); + PairSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (PairSetCount = %d)\n", PairSetCount )); + + otv_Coverage_validate( table + Coverage, otvalid, -1 ); + + OTV_LIMIT_CHECK( PairSetCount * 2 ); + + /* PairSetOffset */ + for ( ; PairSetCount > 0; PairSetCount-- ) + otv_PairSet_validate( table + FT_NEXT_USHORT( p ), + ValueFormat1, ValueFormat2, otvalid ); + } + break; + + case 2: /* PairPosFormat2 */ + { + FT_UInt Coverage, ValueFormat1, ValueFormat2, ClassDef1, ClassDef2; + FT_UInt ClassCount1, ClassCount2, len_value1, len_value2, count; + + + OTV_LIMIT_CHECK( 14 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat1 = FT_NEXT_USHORT( p ); + ValueFormat2 = FT_NEXT_USHORT( p ); + ClassDef1 = FT_NEXT_USHORT( p ); + ClassDef2 = FT_NEXT_USHORT( p ); + ClassCount1 = FT_NEXT_USHORT( p ); + ClassCount2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassCount1 = %d)\n", ClassCount1 )); + OTV_TRACE(( " (ClassCount2 = %d)\n", ClassCount2 )); + + len_value1 = otv_value_length( ValueFormat1 ); + len_value2 = otv_value_length( ValueFormat2 ); + + otv_Coverage_validate( table + Coverage, otvalid, -1 ); + otv_ClassDef_validate( table + ClassDef1, otvalid ); + otv_ClassDef_validate( table + ClassDef2, otvalid ); + + OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 * + ( len_value1 + len_value2 ) ); + + otvalid->extra3 = table; + + /* Class1Record */ + for ( ; ClassCount1 > 0; ClassCount1-- ) + { + /* Class2Record */ + for ( count = ClassCount2; count > 0; count-- ) + { + if ( ValueFormat1 ) + /* Value1 */ + otv_ValueRecord_validate( p, ValueFormat1, otvalid ); + p += len_value1; + + if ( ValueFormat2 ) + /* Value2 */ + otv_ValueRecord_validate( p, ValueFormat2, otvalid ); + p += len_value2; + } + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 3 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_CursivePos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "CursivePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* CursivePosFormat1 */ + { + FT_UInt table_size; + FT_UInt Coverage, EntryExitCount; + + OTV_OPTIONAL_TABLE( EntryAnchor ); + OTV_OPTIONAL_TABLE( ExitAnchor ); + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + EntryExitCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (EntryExitCount = %d)\n", EntryExitCount )); + + otv_Coverage_validate( table + Coverage, + otvalid, + (FT_Int)EntryExitCount ); + + OTV_LIMIT_CHECK( EntryExitCount * 4 ); + + table_size = EntryExitCount * 4 + 4; + + /* EntryExitRecord */ + for ( ; EntryExitCount > 0; EntryExitCount-- ) + { + OTV_OPTIONAL_OFFSET( EntryAnchor ); + OTV_OPTIONAL_OFFSET( ExitAnchor ); + + OTV_SIZE_CHECK( EntryAnchor ); + if ( EntryAnchor ) + otv_Anchor_validate( table + EntryAnchor, otvalid ); + + OTV_SIZE_CHECK( ExitAnchor ); + if ( ExitAnchor ) + otv_Anchor_validate( table + ExitAnchor, otvalid ); + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* UNDOCUMENTED (in OpenType 1.5): */ + /* BaseRecord tables can contain NULL pointers. */ + + /* sets otvalid->extra2 (1) */ + + static void + otv_MarkBasePos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkBasePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + otvalid->extra2 = 1; + OTV_NEST2( MarkBasePosFormat1, BaseArray ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 5 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra2 (1) */ + + static void + otv_MarkLigPos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkLigPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + otvalid->extra2 = 1; + OTV_NEST3( MarkLigPosFormat1, LigatureArray, LigatureAttach ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra2 (0) */ + + static void + otv_MarkMarkPos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkMarkPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + otvalid->extra2 = 0; + OTV_NEST2( MarkMarkPosFormat1, Mark2Array ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 7 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra1 (lookup count) */ + + static void + otv_ContextPos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ContextPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + otvalid->extra1 = otvalid->lookup_count; + OTV_NEST3( ContextPosFormat1, PosRuleSet, PosRule ); + OTV_RUN( table, otvalid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ContextPosFormat2, PosClassSet, PosClassRule ); + OTV_RUN( table, otvalid ); + break; + + case 3: + OTV_NEST1( ContextPosFormat3 ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 8 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra1 (lookup count) */ + + static void + otv_ChainContextPos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ChainContextPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + otvalid->extra1 = otvalid->lookup_count; + OTV_NEST3( ChainContextPosFormat1, + ChainPosRuleSet, ChainPosRule ); + OTV_RUN( table, otvalid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ChainContextPosFormat2, + ChainPosClassSet, ChainPosClassRule ); + OTV_RUN( table, otvalid ); + break; + + case 3: + OTV_NEST1( ChainContextPosFormat3 ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 9 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses otvalid->type_funcs */ + + static void + otv_ExtensionPos_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ExtensionPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* ExtensionPosFormat1 */ + { + FT_UInt ExtensionLookupType; + FT_ULong ExtensionOffset; + OTV_Validate_Func validate; + + + OTV_LIMIT_CHECK( 6 ); + ExtensionLookupType = FT_NEXT_USHORT( p ); + ExtensionOffset = FT_NEXT_ULONG( p ); + + if ( ExtensionLookupType == 0 || ExtensionLookupType >= 9 ) + FT_INVALID_DATA; + + validate = otvalid->type_funcs[ExtensionLookupType - 1]; + validate( table + ExtensionOffset, otvalid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static const OTV_Validate_Func otv_gpos_validate_funcs[9] = + { + otv_SinglePos_validate, + otv_PairPos_validate, + otv_CursivePos_validate, + otv_MarkBasePos_validate, + otv_MarkLigPos_validate, + otv_MarkMarkPos_validate, + otv_ContextPos_validate, + otv_ChainContextPos_validate, + otv_ExtensionPos_validate + }; + + + /* sets otvalid->type_count */ + /* sets otvalid->type_funcs */ + + FT_LOCAL_DEF( void ) + otv_GPOS_subtable_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + otvalid->type_count = 9; + otvalid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + + otv_Lookup_validate( table, otvalid ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GPOS_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator otvalid = &validrec; + FT_Bytes p = table; + FT_UInt table_size; + FT_UShort version; + FT_UInt ScriptList, FeatureList, LookupList; + + OTV_OPTIONAL_TABLE32( featureVariations ); + + + otvalid->root = ftvalid; + + FT_TRACE3(( "validating GPOS table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 4 ); + + if ( FT_NEXT_USHORT( p ) != 1 ) /* majorVersion */ + FT_INVALID_FORMAT; + + version = FT_NEXT_USHORT( p ); /* minorVersion */ + + table_size = 10; + switch ( version ) + { + case 0: + OTV_LIMIT_CHECK( 6 ); + break; + + case 1: + OTV_LIMIT_CHECK( 10 ); + table_size += 4; + break; + + default: + FT_INVALID_FORMAT; + } + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + otvalid->type_count = 9; + otvalid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + otvalid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + otvalid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + otvalid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + otvalid ); + + if ( version > 0 ) + { + OTV_OPTIONAL_OFFSET32( featureVariations ); + OTV_SIZE_CHECK32( featureVariations ); + if ( featureVariations ) + OTV_TRACE(( " [omitting featureVariations validation]\n" )); /* XXX */ + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvgpos.h b/external/freetype/src/otvalid/otvgpos.h new file mode 100644 index 000000000..b5d0f5485 --- /dev/null +++ b/external/freetype/src/otvalid/otvgpos.h @@ -0,0 +1,36 @@ +/**************************************************************************** + * + * otvgpos.h + * + * OpenType GPOS table validator (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef OTVGPOS_H_ +#define OTVGPOS_H_ + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + otv_GPOS_subtable_validate( FT_Bytes table, + OTV_Validator valid ); + + +FT_END_HEADER + +#endif /* OTVGPOS_H_ */ + + +/* END */ diff --git a/external/freetype/src/otvalid/otvgsub.c b/external/freetype/src/otvalid/otvgsub.c new file mode 100644 index 000000000..5d40d9243 --- /dev/null +++ b/external/freetype/src/otvalid/otvgsub.c @@ -0,0 +1,627 @@ +/**************************************************************************** + * + * otvgsub.c + * + * OpenType GSUB table validation (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvgsub + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 1 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses otvalid->glyph_count */ + + static void + otv_SingleSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "SingleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* SingleSubstFormat1 */ + { + FT_Bytes Coverage; + FT_Int DeltaGlyphID; + FT_UInt first_cov, last_cov; + FT_UInt first_idx, last_idx; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + DeltaGlyphID = FT_NEXT_SHORT( p ); + + otv_Coverage_validate( Coverage, otvalid, -1 ); + + first_cov = otv_Coverage_get_first( Coverage ); + last_cov = otv_Coverage_get_last( Coverage ); + + /* These additions are modulo 65536. */ + first_idx = (FT_UInt)( (FT_Int)first_cov + DeltaGlyphID ) & 0xFFFFU; + last_idx = (FT_UInt)( (FT_Int)last_cov + DeltaGlyphID ) & 0xFFFFU; + + /* Since the maximum number of glyphs is 2^16 - 1 = 65535, */ + /* the largest possible glyph index is 65534. For this */ + /* reason there can't be a wrap-around region, which would */ + /* imply the use of the invalid glyph index 65535. */ + if ( first_idx > last_idx ) + FT_INVALID_DATA; + + if ( last_idx >= otvalid->glyph_count ) + FT_INVALID_DATA; + } + break; + + case 2: /* SingleSubstFormat2 */ + { + FT_UInt Coverage, GlyphCount; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + otv_Coverage_validate( table + Coverage, + otvalid, + (FT_Int)GlyphCount ); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + /* Substitute */ + for ( ; GlyphCount > 0; GlyphCount-- ) + if ( FT_NEXT_USHORT( p ) >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 2 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra1 (glyph count) */ + + static void + otv_MultipleSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "MultipleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + otvalid->extra1 = otvalid->glyph_count; + OTV_NEST2( MultipleSubstFormat1, Sequence ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 3 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra1 (glyph count) */ + + static void + otv_AlternateSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "AlternateSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + otvalid->extra1 = otvalid->glyph_count; + OTV_NEST2( AlternateSubstFormat1, AlternateSet ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define LigatureFunc otv_Ligature_validate + + /* uses otvalid->glyph_count */ + + static void + otv_Ligature_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt LigatureGlyph, CompCount; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + LigatureGlyph = FT_NEXT_USHORT( p ); + if ( LigatureGlyph >= otvalid->glyph_count ) + FT_INVALID_DATA; + + CompCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (CompCount = %d)\n", CompCount )); + + if ( CompCount == 0 ) + FT_INVALID_DATA; + + CompCount--; + + OTV_LIMIT_CHECK( CompCount * 2 ); /* Component */ + + /* no need to check the Component glyph indices */ + + OTV_EXIT; + } + + + static void + otv_LigatureSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "LigatureSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + OTV_NEST3( LigatureSubstFormat1, LigatureSet, Ligature ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 5 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra1 (lookup count) */ + + static void + otv_ContextSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ContextSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + otvalid->extra1 = otvalid->lookup_count; + OTV_NEST3( ContextSubstFormat1, SubRuleSet, SubRule ); + OTV_RUN( table, otvalid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ContextSubstFormat2, SubClassSet, SubClassRule ); + OTV_RUN( table, otvalid ); + break; + + case 3: + OTV_NEST1( ContextSubstFormat3 ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->extra1 (lookup count) */ + + static void + otv_ChainContextSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ChainContextSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + otvalid->extra1 = otvalid->lookup_count; + OTV_NEST3( ChainContextSubstFormat1, + ChainSubRuleSet, ChainSubRule ); + OTV_RUN( table, otvalid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ChainContextSubstFormat2, + ChainSubClassSet, ChainSubClassRule ); + OTV_RUN( table, otvalid ); + break; + + case 3: + OTV_NEST1( ChainContextSubstFormat3 ); + OTV_RUN( table, otvalid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 7 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses otvalid->type_funcs */ + + static void + otv_ExtensionSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ExtensionSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* ExtensionSubstFormat1 */ + { + FT_UInt ExtensionLookupType; + FT_ULong ExtensionOffset; + OTV_Validate_Func validate; + + + OTV_LIMIT_CHECK( 6 ); + ExtensionLookupType = FT_NEXT_USHORT( p ); + ExtensionOffset = FT_NEXT_ULONG( p ); + + if ( ExtensionLookupType == 0 || + ExtensionLookupType == 7 || + ExtensionLookupType > 8 ) + FT_INVALID_DATA; + + validate = otvalid->type_funcs[ExtensionLookupType - 1]; + validate( table + ExtensionOffset, otvalid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 8 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses otvalid->glyph_count */ + + static void + otv_ReverseChainSingleSubst_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table, Coverage; + FT_UInt SubstFormat; + FT_UInt BacktrackGlyphCount, LookaheadGlyphCount, GlyphCount; + + + OTV_NAME_ENTER( "ReverseChainSingleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* ReverseChainSingleSubstFormat1 */ + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + BacktrackGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); + + otv_Coverage_validate( Coverage, otvalid, -1 ); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); + + LookaheadGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); + + OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); + + for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 ); + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + /* Substitute */ + for ( ; GlyphCount > 0; GlyphCount-- ) + if ( FT_NEXT_USHORT( p ) >= otvalid->glyph_count ) + FT_INVALID_DATA; + + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static const OTV_Validate_Func otv_gsub_validate_funcs[8] = + { + otv_SingleSubst_validate, + otv_MultipleSubst_validate, + otv_AlternateSubst_validate, + otv_LigatureSubst_validate, + otv_ContextSubst_validate, + otv_ChainContextSubst_validate, + otv_ExtensionSubst_validate, + otv_ReverseChainSingleSubst_validate + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->type_count */ + /* sets otvalid->type_funcs */ + /* sets otvalid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GSUB_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec otvalidrec; + OTV_Validator otvalid = &otvalidrec; + FT_Bytes p = table; + FT_UInt table_size; + FT_UShort version; + FT_UInt ScriptList, FeatureList, LookupList; + + OTV_OPTIONAL_TABLE32( featureVariations ); + + + otvalid->root = ftvalid; + + FT_TRACE3(( "validating GSUB table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 4 ); + + if ( FT_NEXT_USHORT( p ) != 1 ) /* majorVersion */ + FT_INVALID_FORMAT; + + version = FT_NEXT_USHORT( p ); /* minorVersion */ + + table_size = 10; + switch ( version ) + { + case 0: + OTV_LIMIT_CHECK( 6 ); + break; + + case 1: + OTV_LIMIT_CHECK( 10 ); + table_size += 4; + break; + + default: + FT_INVALID_FORMAT; + } + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + otvalid->type_count = 8; + otvalid->type_funcs = (OTV_Validate_Func*)otv_gsub_validate_funcs; + otvalid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + otvalid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + otvalid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + otvalid ); + + if ( version > 0 ) + { + OTV_OPTIONAL_OFFSET32( featureVariations ); + OTV_SIZE_CHECK32( featureVariations ); + if ( featureVariations ) + OTV_TRACE(( " [omitting featureVariations validation]\n" )); /* XXX */ + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvjstf.c b/external/freetype/src/otvalid/otvjstf.c new file mode 100644 index 000000000..712039c66 --- /dev/null +++ b/external/freetype/src/otvalid/otvjstf.c @@ -0,0 +1,259 @@ +/**************************************************************************** + * + * otvjstf.c + * + * OpenType JSTF table validation (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvjstf + + +#define JstfPriorityFunc otv_JstfPriority_validate +#define JstfLookupFunc otv_GPOS_subtable_validate + + /* uses otvalid->extra1 (GSUB lookup count) */ + /* uses otvalid->extra2 (GPOS lookup count) */ + /* sets otvalid->extra1 (counter) */ + + static void + otv_JstfPriority_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt gsub_lookup_count, gpos_lookup_count; + + OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB ); + OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB ); + OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS ); + OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS ); + OTV_OPTIONAL_TABLE( ExtensionEnableGSUB ); + OTV_OPTIONAL_TABLE( ExtensionDisableGSUB ); + OTV_OPTIONAL_TABLE( ExtensionEnableGPOS ); + OTV_OPTIONAL_TABLE( ExtensionDisableGPOS ); + OTV_OPTIONAL_TABLE( ShrinkageJstfMax ); + OTV_OPTIONAL_TABLE( ExtensionJstfMax ); + + + OTV_ENTER; + OTV_TRACE(( "JstfPriority table\n" )); + + OTV_LIMIT_CHECK( 20 ); + + gsub_lookup_count = otvalid->extra1; + gpos_lookup_count = otvalid->extra2; + + table_size = 20; + + otvalid->extra1 = gsub_lookup_count; + + OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB ); + OTV_SIZE_CHECK( ShrinkageEnableGSUB ); + if ( ShrinkageEnableGSUB ) + otv_x_ux( table + ShrinkageEnableGSUB, otvalid ); + + OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB ); + OTV_SIZE_CHECK( ShrinkageDisableGSUB ); + if ( ShrinkageDisableGSUB ) + otv_x_ux( table + ShrinkageDisableGSUB, otvalid ); + + otvalid->extra1 = gpos_lookup_count; + + OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS ); + OTV_SIZE_CHECK( ShrinkageEnableGPOS ); + if ( ShrinkageEnableGPOS ) + otv_x_ux( table + ShrinkageEnableGPOS, otvalid ); + + OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS ); + OTV_SIZE_CHECK( ShrinkageDisableGPOS ); + if ( ShrinkageDisableGPOS ) + otv_x_ux( table + ShrinkageDisableGPOS, otvalid ); + + OTV_OPTIONAL_OFFSET( ShrinkageJstfMax ); + OTV_SIZE_CHECK( ShrinkageJstfMax ); + if ( ShrinkageJstfMax ) + { + /* XXX: check lookup types? */ + OTV_NEST2( JstfMax, JstfLookup ); + OTV_RUN( table + ShrinkageJstfMax, otvalid ); + } + + otvalid->extra1 = gsub_lookup_count; + + OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB ); + OTV_SIZE_CHECK( ExtensionEnableGSUB ); + if ( ExtensionEnableGSUB ) + otv_x_ux( table + ExtensionEnableGSUB, otvalid ); + + OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB ); + OTV_SIZE_CHECK( ExtensionDisableGSUB ); + if ( ExtensionDisableGSUB ) + otv_x_ux( table + ExtensionDisableGSUB, otvalid ); + + otvalid->extra1 = gpos_lookup_count; + + OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS ); + OTV_SIZE_CHECK( ExtensionEnableGPOS ); + if ( ExtensionEnableGPOS ) + otv_x_ux( table + ExtensionEnableGPOS, otvalid ); + + OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS ); + OTV_SIZE_CHECK( ExtensionDisableGPOS ); + if ( ExtensionDisableGPOS ) + otv_x_ux( table + ExtensionDisableGPOS, otvalid ); + + OTV_OPTIONAL_OFFSET( ExtensionJstfMax ); + OTV_SIZE_CHECK( ExtensionJstfMax ); + if ( ExtensionJstfMax ) + { + /* XXX: check lookup types? */ + OTV_NEST2( JstfMax, JstfLookup ); + OTV_RUN( table + ExtensionJstfMax, otvalid ); + } + + otvalid->extra1 = gsub_lookup_count; + otvalid->extra2 = gpos_lookup_count; + + OTV_EXIT; + } + + + /* sets otvalid->extra (glyph count) */ + /* sets otvalid->func1 (otv_JstfPriority_validate) */ + + static void + otv_JstfScript_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt JstfLangSysCount; + + OTV_OPTIONAL_TABLE( ExtGlyph ); + OTV_OPTIONAL_TABLE( DefJstfLangSys ); + + + OTV_NAME_ENTER( "JstfScript" ); + + OTV_LIMIT_CHECK( 6 ); + OTV_OPTIONAL_OFFSET( ExtGlyph ); + OTV_OPTIONAL_OFFSET( DefJstfLangSys ); + JstfLangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (JstfLangSysCount = %d)\n", JstfLangSysCount )); + + table_size = JstfLangSysCount * 6 + 6; + + OTV_SIZE_CHECK( ExtGlyph ); + if ( ExtGlyph ) + { + otvalid->extra1 = otvalid->glyph_count; + OTV_NEST1( ExtenderGlyph ); + OTV_RUN( table + ExtGlyph, otvalid ); + } + + OTV_SIZE_CHECK( DefJstfLangSys ); + if ( DefJstfLangSys ) + { + OTV_NEST2( JstfLangSys, JstfPriority ); + OTV_RUN( table + DefJstfLangSys, otvalid ); + } + + OTV_LIMIT_CHECK( 6 * JstfLangSysCount ); + + /* JstfLangSysRecord */ + OTV_NEST2( JstfLangSys, JstfPriority ); + for ( ; JstfLangSysCount > 0; JstfLangSysCount-- ) + { + p += 4; /* skip JstfLangSysTag */ + + OTV_RUN( table + FT_NEXT_USHORT( p ), otvalid ); + } + + OTV_EXIT; + } + + + /* sets otvalid->extra1 (GSUB lookup count) */ + /* sets otvalid->extra2 (GPOS lookup count) */ + /* sets otvalid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_JSTF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec otvalidrec; + OTV_Validator otvalid = &otvalidrec; + FT_Bytes p = table; + FT_UInt JstfScriptCount; + + + otvalid->root = ftvalid; + + + FT_TRACE3(( "validating JSTF table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 6 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + JstfScriptCount = FT_NEXT_USHORT( p ); + + FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount )); + + OTV_LIMIT_CHECK( JstfScriptCount * 6 ); + + if ( gsub ) + otvalid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub ); + else + otvalid->extra1 = 0; + + if ( gpos ) + otvalid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos ); + else + otvalid->extra2 = 0; + + otvalid->glyph_count = glyph_count; + + /* JstfScriptRecord */ + for ( ; JstfScriptCount > 0; JstfScriptCount-- ) + { + p += 4; /* skip JstfScriptTag */ + + /* JstfScript */ + otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), otvalid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvmath.c b/external/freetype/src/otvalid/otvmath.c new file mode 100644 index 000000000..01fd863c9 --- /dev/null +++ b/external/freetype/src/otvalid/otvmath.c @@ -0,0 +1,453 @@ +/**************************************************************************** + * + * otvmath.c + * + * OpenType MATH table validation (body). + * + * Copyright (C) 2007-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by George Williams. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvmath + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH TYPOGRAPHIC CONSTANTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathConstants_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt i; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + OTV_NAME_ENTER( "MathConstants" ); + + /* 56 constants, 51 have device tables */ + OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) ); + table_size = 2 * ( 56 + 51 ); + + p += 4 * 2; /* First 4 constants have no device tables */ + for ( i = 0; i < 51; i++ ) + { + p += 2; /* skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, otvalid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH ITALICS CORRECTION *****/ + /***** MATH TOP ACCENT ATTACHMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathItalicsCorrectionInfo_validate( FT_Bytes table, + OTV_Validator otvalid, + FT_Int isItalic ) + { + FT_Bytes p = table; + FT_UInt i, cnt, table_size; + + OTV_OPTIONAL_TABLE( Coverage ); + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + FT_UNUSED( isItalic ); /* only used if tracing is active */ + + + OTV_NAME_ENTER( isItalic ? "MathItalicsCorrectionInfo" + : "MathTopAccentAttachment" ); + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( Coverage ); + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * cnt ); + table_size = 4 + 4 * cnt; + + OTV_SIZE_CHECK( Coverage ); + otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); + + for ( i = 0; i < cnt; i++ ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, otvalid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH KERNING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathKern_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt i, cnt, table_size; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + /* OTV_NAME_ENTER( "MathKern" ); */ + + OTV_LIMIT_CHECK( 2 ); + + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * cnt + 2 ); + table_size = 4 + 4 * cnt; + + /* Heights */ + for ( i = 0; i < cnt; i++ ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, otvalid ); + } + + /* One more Kerning value */ + for ( i = 0; i < cnt + 1; i++ ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, otvalid ); + } + + OTV_EXIT; + } + + + static void + otv_MathKernInfo_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt i, j, cnt, table_size; + + OTV_OPTIONAL_TABLE( Coverage ); + OTV_OPTIONAL_TABLE( MKRecordOffset ); + + + OTV_NAME_ENTER( "MathKernInfo" ); + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( Coverage ); + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 8 * cnt ); + table_size = 4 + 8 * cnt; + + OTV_SIZE_CHECK( Coverage ); + otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); + + for ( i = 0; i < cnt; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + OTV_OPTIONAL_OFFSET( MKRecordOffset ); + OTV_SIZE_CHECK( MKRecordOffset ); + if ( MKRecordOffset ) + otv_MathKern_validate( table + MKRecordOffset, otvalid ); + } + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH GLYPH INFO *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathGlyphInfo_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt MathItalicsCorrectionInfo, MathTopAccentAttachment; + FT_UInt ExtendedShapeCoverage, MathKernInfo; + + + OTV_NAME_ENTER( "MathGlyphInfo" ); + + OTV_LIMIT_CHECK( 8 ); + + MathItalicsCorrectionInfo = FT_NEXT_USHORT( p ); + MathTopAccentAttachment = FT_NEXT_USHORT( p ); + ExtendedShapeCoverage = FT_NEXT_USHORT( p ); + MathKernInfo = FT_NEXT_USHORT( p ); + + if ( MathItalicsCorrectionInfo ) + otv_MathItalicsCorrectionInfo_validate( + table + MathItalicsCorrectionInfo, otvalid, TRUE ); + + /* Italic correction and Top Accent Attachment have the same format */ + if ( MathTopAccentAttachment ) + otv_MathItalicsCorrectionInfo_validate( + table + MathTopAccentAttachment, otvalid, FALSE ); + + if ( ExtendedShapeCoverage ) + { + OTV_NAME_ENTER( "ExtendedShapeCoverage" ); + otv_Coverage_validate( table + ExtendedShapeCoverage, otvalid, -1 ); + OTV_EXIT; + } + + if ( MathKernInfo ) + otv_MathKernInfo_validate( table + MathKernInfo, otvalid ); + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH GLYPH CONSTRUCTION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_GlyphAssembly_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt pcnt, table_size; + FT_UInt i; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + /* OTV_NAME_ENTER( "GlyphAssembly" ); */ + + OTV_LIMIT_CHECK( 6 ); + + p += 2; /* Skip the Italics Correction value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + pcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 8 * pcnt ); + table_size = 6 + 8 * pcnt; + + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, otvalid ); + + for ( i = 0; i < pcnt; i++ ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + p += 2*4; /* skip the Start, End, Full, and Flags fields */ + } + + /* OTV_EXIT; */ + } + + + static void + otv_MathGlyphConstruction_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt vcnt, table_size; + FT_UInt i; + + OTV_OPTIONAL_TABLE( GlyphAssembly ); + + + /* OTV_NAME_ENTER( "MathGlyphConstruction" ); */ + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( GlyphAssembly ); + vcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * vcnt ); + table_size = 4 + 4 * vcnt; + + for ( i = 0; i < vcnt; i++ ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= otvalid->glyph_count ) + FT_INVALID_GLYPH_ID; + p += 2; /* skip the size */ + } + + OTV_SIZE_CHECK( GlyphAssembly ); + if ( GlyphAssembly ) + otv_GlyphAssembly_validate( table+GlyphAssembly, otvalid ); + + /* OTV_EXIT; */ + } + + + static void + otv_MathVariants_validate( FT_Bytes table, + OTV_Validator otvalid ) + { + FT_Bytes p = table; + FT_UInt vcnt, hcnt, i, table_size; + + OTV_OPTIONAL_TABLE( VCoverage ); + OTV_OPTIONAL_TABLE( HCoverage ); + OTV_OPTIONAL_TABLE( Offset ); + + + OTV_NAME_ENTER( "MathVariants" ); + + OTV_LIMIT_CHECK( 10 ); + + p += 2; /* Skip the MinConnectorOverlap constant */ + OTV_OPTIONAL_OFFSET( VCoverage ); + OTV_OPTIONAL_OFFSET( HCoverage ); + vcnt = FT_NEXT_USHORT( p ); + hcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt ); + table_size = 10 + 2 * vcnt + 2 * hcnt; + + OTV_SIZE_CHECK( VCoverage ); + if ( VCoverage ) + otv_Coverage_validate( table + VCoverage, otvalid, (FT_Int)vcnt ); + + OTV_SIZE_CHECK( HCoverage ); + if ( HCoverage ) + otv_Coverage_validate( table + HCoverage, otvalid, (FT_Int)hcnt ); + + for ( i = 0; i < vcnt; i++ ) + { + OTV_OPTIONAL_OFFSET( Offset ); + OTV_SIZE_CHECK( Offset ); + otv_MathGlyphConstruction_validate( table + Offset, otvalid ); + } + + for ( i = 0; i < hcnt; i++ ) + { + OTV_OPTIONAL_OFFSET( Offset ); + OTV_SIZE_CHECK( Offset ); + otv_MathGlyphConstruction_validate( table + Offset, otvalid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets otvalid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_MATH_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec otvalidrec; + OTV_Validator otvalid = &otvalidrec; + FT_Bytes p = table; + FT_UInt MathConstants, MathGlyphInfo, MathVariants; + + + otvalid->root = ftvalid; + + FT_TRACE3(( "validating MATH table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + MathConstants = FT_NEXT_USHORT( p ); + MathGlyphInfo = FT_NEXT_USHORT( p ); + MathVariants = FT_NEXT_USHORT( p ); + + otvalid->glyph_count = glyph_count; + + otv_MathConstants_validate( table + MathConstants, + otvalid ); + otv_MathGlyphInfo_validate( table + MathGlyphInfo, + otvalid ); + otv_MathVariants_validate ( table + MathVariants, + otvalid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/external/freetype/src/otvalid/otvmod.c b/external/freetype/src/otvalid/otvmod.c new file mode 100644 index 000000000..d6057c5a4 --- /dev/null +++ b/external/freetype/src/otvalid/otvmod.c @@ -0,0 +1,281 @@ +/**************************************************************************** + * + * otvmod.c + * + * FreeType's OpenType validation module implementation (body). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/tttables.h> +#include <freetype/tttags.h> +#include <freetype/ftotval.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svotval.h> + +#include "otvmod.h" +#include "otvalid.h" +#include "otvcommn.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otvmodule + + + static FT_Error + otv_load_table( FT_Face face, + FT_Tag tag, + FT_Byte* volatile* table, + FT_ULong* table_len ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); + if ( FT_ERR_EQ( error, Table_Missing ) ) + return FT_Err_Ok; + if ( error ) + goto Exit; + + if ( FT_QALLOC( *table, *table_len ) ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); + + Exit: + return error; + } + + + static FT_Error + otv_validate( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *ot_base, + FT_Bytes *ot_gdef, + FT_Bytes *ot_gpos, + FT_Bytes *ot_gsub, + FT_Bytes *ot_jstf ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* volatile base; + FT_Byte* volatile gdef; + FT_Byte* volatile gpos; + FT_Byte* volatile gsub; + FT_Byte* volatile jstf; + FT_Byte* volatile math; + FT_ULong len_base, len_gdef, len_gpos, len_gsub, len_jstf; + FT_ULong len_math; + FT_UInt num_glyphs = (FT_UInt)face->num_glyphs; + FT_ValidatorRec volatile valid; + + + base = gdef = gpos = gsub = jstf = math = NULL; + len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0; + + /* + * XXX: OpenType tables cannot handle 32-bit glyph index, + * although broken TrueType can have 32-bit glyph index. + */ + if ( face->num_glyphs > 0xFFFFL ) + { + FT_TRACE1(( "otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08lx) ", + face->num_glyphs )); + FT_TRACE1(( "are not handled by OpenType tables\n" )); + num_glyphs = 0xFFFF; + } + + /* load tables */ + + if ( ot_flags & FT_VALIDATE_BASE ) + { + error = otv_load_table( face, TTAG_BASE, &base, &len_base ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GDEF ) + { + error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GPOS ) + { + error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GSUB ) + { + error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_JSTF ) + { + error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_MATH ) + { + error = otv_load_table( face, TTAG_MATH, &math, &len_math ); + if ( error ) + goto Exit; + } + + /* validate tables */ + + if ( base ) + { + ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_BASE_validate( base, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gpos ) + { + ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GPOS_validate( gpos, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gsub ) + { + ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GSUB_validate( gsub, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gdef ) + { + ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GDEF_validate( gdef, gsub, gpos, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( jstf ) + { + ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_JSTF_validate( jstf, gsub, gpos, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( math ) + { + ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_MATH_validate( math, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + *ot_base = (FT_Bytes)base; + *ot_gdef = (FT_Bytes)gdef; + *ot_gpos = (FT_Bytes)gpos; + *ot_gsub = (FT_Bytes)gsub; + *ot_jstf = (FT_Bytes)jstf; + + Exit: + if ( error ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( base ); + FT_FREE( gdef ); + FT_FREE( gpos ); + FT_FREE( gsub ); + FT_FREE( jstf ); + } + + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( math ); /* Can't return this as API is frozen */ + } + + return error; + } + + + static + const FT_Service_OTvalidateRec otvalid_interface = + { + otv_validate /* validate */ + }; + + + static + const FT_ServiceDescRec otvalid_services[] = + { + { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + otvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( otvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class otv_module_class = + { + 0, + sizeof ( FT_ModuleRec ), + "otvalid", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) otvalid_get_service /* get_interface */ + }; + + +/* END */ diff --git a/external/freetype/src/otvalid/otvmod.h b/external/freetype/src/otvalid/otvmod.h new file mode 100644 index 000000000..f0e68dbc0 --- /dev/null +++ b/external/freetype/src/otvalid/otvmod.h @@ -0,0 +1,38 @@ +/**************************************************************************** + * + * otvmod.h + * + * FreeType's OpenType validation module implementation + * (specification). + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef OTVMOD_H_ +#define OTVMOD_H_ + + +#include <freetype/ftmodapi.h> + + +FT_BEGIN_HEADER + + + FT_EXPORT_VAR( const FT_Module_Class ) otv_module_class; + + +FT_END_HEADER + +#endif /* OTVMOD_H_ */ + + +/* END */ diff --git a/external/freetype/src/otvalid/rules.mk b/external/freetype/src/otvalid/rules.mk new file mode 100644 index 000000000..800cb8733 --- /dev/null +++ b/external/freetype/src/otvalid/rules.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 OpenType validation driver configuration rules +# + + +# Copyright (C) 2004-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# OTV driver directory +# +OTV_DIR := $(SRC_DIR)/otvalid + + +# compilation flags for the driver +# +OTV_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(OTV_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# OTV driver sources (i.e., C files) +# +OTV_DRV_SRC := $(OTV_DIR)/otvbase.c \ + $(OTV_DIR)/otvcommn.c \ + $(OTV_DIR)/otvgdef.c \ + $(OTV_DIR)/otvgpos.c \ + $(OTV_DIR)/otvgsub.c \ + $(OTV_DIR)/otvjstf.c \ + $(OTV_DIR)/otvmath.c \ + $(OTV_DIR)/otvmod.c + +# OTV driver headers +# +OTV_DRV_H := $(OTV_DIR)/otvalid.h \ + $(OTV_DIR)/otvcommn.h \ + $(OTV_DIR)/otverror.h \ + $(OTV_DIR)/otvgpos.h \ + $(OTV_DIR)/otvmod.h + + +# OTV driver object(s) +# +# OTV_DRV_OBJ_M is used during `multi' builds. +# OTV_DRV_OBJ_S is used during `single' builds. +# +OTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O) +OTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O + +# OTV driver source file for single build +# +OTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c + + +# OTV driver - single object +# +$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \ + $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S)) + + +# OTV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(OTV_DRV_OBJ_S) +DRV_OBJS_M += $(OTV_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/pcf/README b/external/freetype/src/pcf/README new file mode 100644 index 000000000..09ea970ed --- /dev/null +++ b/external/freetype/src/pcf/README @@ -0,0 +1,96 @@ + FreeType font driver for PCF fonts + + Francesco Zappa Nardelli + <francesco.zappa.nardelli@ens.fr> + + +Introduction +************ + +PCF (Portable Compiled Format) is a binary bitmap font format, largely used +in X world. This code implements a PCF driver for the FreeType library. +Glyph images are loaded into memory only on demand, thus leading to a small +memory footprint. + +Information on the PCF font format can only be worked out from +`pcfread.c', and `pcfwrite.c', to be found, for instance, in the XFree86 +(www.xfree86.org) source tree (xc/lib/font/bitmap/). + +Many good bitmap fonts in bdf format come with XFree86: they can be +compiled into the pcf format using the `bdftopcf' utility. + + +Supported hardware +****************** + +The driver has been tested on linux/x86 and sunos5.5/sparc. In both +cases the compiler was gcc. When back in Paris, I will test it also +on linux/alpha. + + +Encodings +********* + +Use `FT_Get_BDF_Charset_ID' to access the encoding and registry. + +The driver always exports `ft_encoding_none' as face->charmap.encoding. +FT_Get_Char_Index() behavior is unmodified, that is, it converts the ULong +value given as argument into the corresponding glyph number. + + +Known problems +************** + +- dealing explicitly with encodings breaks the uniformity of FreeType 2 + API. + +- except for encodings properties, client applications have no + visibility of the PCF_Face object. This means that applications + cannot directly access font tables and are obliged to trust + FreeType. + +- currently, glyph names and ink_metrics are ignored. + +I plan to give full visibility of the PCF_Face object in the next +release of the driver, thus implementing also glyph names and +ink_metrics. + +- height is defined as (ascent - descent). Is this correct? + +- if unable to read size information from the font, PCF_Init_Face + sets available_size->width and available_size->height to 12. + +- too many english grammar errors in the readme file :-( + + +License +******* + +Copyright (C) 2000 by Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Credits +******* + +Keith Packard wrote the pcf driver found in XFree86. His work is at +the same time the specification and the sample implementation of the +PCF format. Undoubtedly, this driver is inspired from his work. diff --git a/external/freetype/src/pcf/module.mk b/external/freetype/src/pcf/module.mk new file mode 100644 index 000000000..df383ff0f --- /dev/null +++ b/external/freetype/src/pcf/module.mk @@ -0,0 +1,34 @@ +# +# FreeType 2 PCF module definition +# + +# Copyright 2000, 2006 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +FTMODULE_H_COMMANDS += PCF_DRIVER + +define PCF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, pcf_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pcf $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/pcf/pcf.c b/external/freetype/src/pcf/pcf.c new file mode 100644 index 000000000..6b30fb249 --- /dev/null +++ b/external/freetype/src/pcf/pcf.c @@ -0,0 +1,35 @@ +/* pcf.c + + FreeType font driver for pcf fonts + + Copyright 2000-2001, 2003 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "pcfdrivr.c" +#include "pcfread.c" +#include "pcfutil.c" + + +/* END */ diff --git a/external/freetype/src/pcf/pcf.h b/external/freetype/src/pcf/pcf.h new file mode 100644 index 000000000..3134cc355 --- /dev/null +++ b/external/freetype/src/pcf/pcf.h @@ -0,0 +1,251 @@ +/* pcf.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002, 2003, 2006, 2010 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef PCF_H_ +#define PCF_H_ + + +#include <freetype/internal/ftdrv.h> +#include <freetype/internal/ftstream.h> + + +FT_BEGIN_HEADER + + typedef struct PCF_TableRec_ + { + FT_ULong type; + FT_ULong format; + FT_ULong size; + FT_ULong offset; + + } PCF_TableRec, *PCF_Table; + + + typedef struct PCF_TocRec_ + { + FT_ULong version; + FT_ULong count; + PCF_Table tables; + + } PCF_TocRec, *PCF_Toc; + + + typedef struct PCF_ParsePropertyRec_ + { + FT_Long name; + FT_Byte isString; + FT_Long value; + + } PCF_ParsePropertyRec, *PCF_ParseProperty; + + + typedef struct PCF_PropertyRec_ + { + FT_String* name; + FT_Byte isString; + + union + { + FT_String* atom; + FT_Long l; + FT_ULong ul; + + } value; + + } PCF_PropertyRec, *PCF_Property; + + + typedef struct PCF_Compressed_MetricRec_ + { + FT_Byte leftSideBearing; + FT_Byte rightSideBearing; + FT_Byte characterWidth; + FT_Byte ascent; + FT_Byte descent; + + } PCF_Compressed_MetricRec, *PCF_Compressed_Metric; + + + typedef struct PCF_MetricRec_ + { + FT_Short leftSideBearing; + FT_Short rightSideBearing; + FT_Short characterWidth; + FT_Short ascent; + FT_Short descent; + FT_Short attributes; + + FT_ULong bits; /* offset into the PCF_BITMAPS table */ + + } PCF_MetricRec, *PCF_Metric; + + + typedef struct PCF_EncRec_ + { + FT_UShort firstCol; + FT_UShort lastCol; + FT_UShort firstRow; + FT_UShort lastRow; + FT_UShort defaultChar; + + FT_UShort* offset; + + } PCF_EncRec, *PCF_Enc; + + + typedef struct PCF_AccelRec_ + { + FT_Byte noOverlap; + FT_Byte constantMetrics; + FT_Byte terminalFont; + FT_Byte constantWidth; + FT_Byte inkInside; + FT_Byte inkMetrics; + FT_Byte drawDirection; + FT_Long fontAscent; + FT_Long fontDescent; + FT_Long maxOverlap; + PCF_MetricRec minbounds; + PCF_MetricRec maxbounds; + PCF_MetricRec ink_minbounds; + PCF_MetricRec ink_maxbounds; + + } PCF_AccelRec, *PCF_Accel; + + + /* + * This file uses X11 terminology for PCF data; an `encoding' in X11 speak + * is the same as a `character code' in FreeType speak. + */ + typedef struct PCF_FaceRec_ + { + FT_FaceRec root; + + FT_StreamRec comp_stream; + FT_Stream comp_source; + + char* charset_encoding; + char* charset_registry; + + PCF_TocRec toc; + PCF_AccelRec accel; + + int nprops; + PCF_Property properties; + + FT_ULong nmetrics; + PCF_Metric metrics; + + PCF_EncRec enc; + + FT_ULong bitmapsFormat; + + } PCF_FaceRec, *PCF_Face; + + + typedef struct PCF_DriverRec_ + { + FT_DriverRec root; + + FT_Bool no_long_family_names; + + } PCF_DriverRec, *PCF_Driver; + + + /* macros for pcf font format */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#define PCF_FILE_VERSION ( ( 'p' << 24 ) | \ + ( 'c' << 16 ) | \ + ( 'f' << 8 ) | 1 ) +#define PCF_FORMAT_MASK 0xFFFFFF00UL + +#define PCF_DEFAULT_FORMAT 0x00000000UL +#define PCF_INKBOUNDS 0x00000200UL +#define PCF_ACCEL_W_INKBOUNDS 0x00000100UL +#define PCF_COMPRESSED_METRICS 0x00000100UL + +#define PCF_FORMAT_MATCH( a, b ) \ + ( ( (a) & PCF_FORMAT_MASK ) == ( (b) & PCF_FORMAT_MASK ) ) + +#define PCF_GLYPH_PAD_MASK ( 3 << 0 ) +#define PCF_BYTE_MASK ( 1 << 2 ) +#define PCF_BIT_MASK ( 1 << 3 ) +#define PCF_SCAN_UNIT_MASK ( 3 << 4 ) + +#define PCF_BYTE_ORDER( f ) \ + ( ( (f) & PCF_BYTE_MASK ) ? MSBFirst : LSBFirst ) +#define PCF_BIT_ORDER( f ) \ + ( ( (f) & PCF_BIT_MASK ) ? MSBFirst : LSBFirst ) +#define PCF_GLYPH_PAD_INDEX( f ) \ + ( (f) & PCF_GLYPH_PAD_MASK ) +#define PCF_GLYPH_PAD( f ) \ + ( 1 << PCF_GLYPH_PAD_INDEX( f ) ) +#define PCF_SCAN_UNIT_INDEX( f ) \ + ( ( (f) & PCF_SCAN_UNIT_MASK ) >> 4 ) +#define PCF_SCAN_UNIT( f ) \ + ( 1 << PCF_SCAN_UNIT_INDEX( f ) ) +#define PCF_FORMAT_BITS( f ) \ + ( (f) & ( PCF_GLYPH_PAD_MASK | \ + PCF_BYTE_MASK | \ + PCF_BIT_MASK | \ + PCF_SCAN_UNIT_MASK ) ) + +#define PCF_SIZE_TO_INDEX( s ) ( (s) == 4 ? 2 : (s) == 2 ? 1 : 0 ) +#define PCF_INDEX_TO_SIZE( b ) ( 1 << b ) + +#define PCF_FORMAT( bit, byte, glyph, scan ) \ + ( ( PCF_SIZE_TO_INDEX( scan ) << 4 ) | \ + ( ( (bit) == MSBFirst ? 1 : 0 ) << 3 ) | \ + ( ( (byte) == MSBFirst ? 1 : 0 ) << 2 ) | \ + ( PCF_SIZE_TO_INDEX( glyph ) << 0 ) ) + +#define PCF_PROPERTIES ( 1 << 0 ) +#define PCF_ACCELERATORS ( 1 << 1 ) +#define PCF_METRICS ( 1 << 2 ) +#define PCF_BITMAPS ( 1 << 3 ) +#define PCF_INK_METRICS ( 1 << 4 ) +#define PCF_BDF_ENCODINGS ( 1 << 5 ) +#define PCF_SWIDTHS ( 1 << 6 ) +#define PCF_GLYPH_NAMES ( 1 << 7 ) +#define PCF_BDF_ACCELERATORS ( 1 << 8 ) + +#define GLYPHPADOPTIONS 4 /* I'm not sure about this */ + + FT_LOCAL( FT_Error ) + pcf_load_font( FT_Stream stream, + PCF_Face face, + FT_Long face_index ); + +FT_END_HEADER + +#endif /* PCF_H_ */ + + +/* END */ diff --git a/external/freetype/src/pcf/pcfdrivr.c b/external/freetype/src/pcf/pcfdrivr.c new file mode 100644 index 000000000..f1dba0240 --- /dev/null +++ b/external/freetype/src/pcf/pcfdrivr.c @@ -0,0 +1,836 @@ +/* pcfdrivr.c + + FreeType font driver for pcf files + + Copyright (C) 2000-2004, 2006-2011, 2013, 2014 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftgzip.h> +#include <freetype/ftlzw.h> +#include <freetype/ftbzip2.h> +#include <freetype/fterrors.h> +#include <freetype/ftbdf.h> +#include <freetype/ttnameid.h> + +#include "pcf.h" +#include "pcfdrivr.h" +#include "pcfread.h" + +#include "pcferror.h" +#include "pcfutil.h" + +#undef FT_COMPONENT +#define FT_COMPONENT pcfread + +#include <freetype/internal/services/svbdf.h> +#include <freetype/internal/services/svfntfmt.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/ftdriver.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT pcfdriver + + + /* + * This file uses X11 terminology for PCF data; an `encoding' in X11 speak + * is the same as a `character code' in FreeType speak. + */ + typedef struct PCF_CMapRec_ + { + FT_CMapRec root; + PCF_Enc enc; + + } PCF_CMapRec, *PCF_CMap; + + + FT_CALLBACK_DEF( FT_Error ) + pcf_cmap_init( FT_CMap cmap, /* PCF_CMap */ + FT_Pointer init_data ) + { + PCF_CMap pcfcmap = (PCF_CMap)cmap; + PCF_Face face = (PCF_Face)FT_CMAP_FACE( cmap ); + + FT_UNUSED( init_data ); + + + pcfcmap->enc = &face->enc; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + pcf_cmap_done( FT_CMap cmap ) /* PCF_CMap */ + { + PCF_CMap pcfcmap = (PCF_CMap)cmap; + + + pcfcmap->enc = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pcf_cmap_char_index( FT_CMap cmap, /* PCF_CMap */ + FT_UInt32 charcode ) + { + PCF_Enc enc = ( (PCF_CMap)cmap )->enc; + + FT_UInt32 i = ( charcode >> 8 ) - enc->firstRow; + FT_UInt32 j = ( charcode & 0xFF ) - enc->firstCol; + FT_UInt32 h = enc->lastRow - enc->firstRow + 1; + FT_UInt32 w = enc->lastCol - enc->firstCol + 1; + + + /* wrapped around "negative" values are also rejected */ + if ( i >= h || j >= w ) + return 0; + + return (FT_UInt)enc->offset[i * w + j]; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pcf_cmap_char_next( FT_CMap cmap, /* PCF_CMap */ + FT_UInt32 *acharcode ) + { + PCF_Enc enc = ( (PCF_CMap)cmap )->enc; + FT_UInt32 charcode = *acharcode + 1; + + FT_UInt32 i = ( charcode >> 8 ) - enc->firstRow; + FT_UInt32 j = ( charcode & 0xFF ) - enc->firstCol; + FT_UInt32 h = enc->lastRow - enc->firstRow + 1; + FT_UInt32 w = enc->lastCol - enc->firstCol + 1; + + FT_UInt result = 0; + + + /* adjust wrapped around "negative" values */ + if ( (FT_Int32)i < 0 ) + i = 0; + if ( (FT_Int32)j < 0 ) + j = 0; + + for ( ; i < h; i++, j = 0 ) + for ( ; j < w; j++ ) + { + result = (FT_UInt)enc->offset[i * w + j]; + if ( result != 0xFFFFU ) + goto Exit; + } + + Exit: + *acharcode = ( ( i + enc->firstRow ) << 8 ) | ( j + enc->firstCol ); + + return result; + } + + + static + const FT_CMap_ClassRec pcf_cmap_class = + { + sizeof ( PCF_CMapRec ), + pcf_cmap_init, + pcf_cmap_done, + pcf_cmap_char_index, + pcf_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + FT_CALLBACK_DEF( void ) + PCF_Face_Done( FT_Face face ) /* PCF_Face */ + { + PCF_Face pcfface = (PCF_Face)face; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( pcfface->metrics ); + FT_FREE( pcfface->enc.offset ); + + /* free properties */ + if ( pcfface->properties ) + { + FT_Int i; + + + for ( i = 0; i < pcfface->nprops; i++ ) + { + PCF_Property prop = &pcfface->properties[i]; + + + if ( prop ) + { + FT_FREE( prop->name ); + if ( prop->isString ) + FT_FREE( prop->value.atom ); + } + } + + FT_FREE( pcfface->properties ); + } + + FT_FREE( pcfface->toc.tables ); + FT_FREE( face->family_name ); + FT_FREE( face->style_name ); + FT_FREE( face->available_sizes ); + FT_FREE( pcfface->charset_encoding ); + FT_FREE( pcfface->charset_registry ); + + /* close compressed stream if any */ + if ( face->stream == &pcfface->comp_stream ) + { + FT_Stream_Close( &pcfface->comp_stream ); + face->stream = pcfface->comp_source; + } + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Face_Init( FT_Stream stream, + FT_Face face, /* PCF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + PCF_Face pcfface = (PCF_Face)face; + FT_Error error; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + FT_TRACE2(( "PCF driver\n" )); + + error = pcf_load_font( stream, pcfface, face_index ); + if ( error ) + { + PCF_Face_Done( face ); + +#if defined( FT_CONFIG_OPTION_USE_ZLIB ) || \ + defined( FT_CONFIG_OPTION_USE_LZW ) || \ + defined( FT_CONFIG_OPTION_USE_BZIP2 ) + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + { + FT_Error error2; + + + /* this didn't work, try gzip support! */ + FT_TRACE2(( " ... try gzip stream\n" )); + error2 = FT_Stream_OpenGzip( &pcfface->comp_stream, stream ); + if ( FT_ERR_EQ( error2, Unimplemented_Feature ) ) + goto Fail; + + error = error2; + } +#endif /* FT_CONFIG_OPTION_USE_ZLIB */ + +#ifdef FT_CONFIG_OPTION_USE_LZW + if ( error ) + { + FT_Error error3; + + + /* this didn't work, try LZW support! */ + FT_TRACE2(( " ... try LZW stream\n" )); + error3 = FT_Stream_OpenLZW( &pcfface->comp_stream, stream ); + if ( FT_ERR_EQ( error3, Unimplemented_Feature ) ) + goto Fail; + + error = error3; + } +#endif /* FT_CONFIG_OPTION_USE_LZW */ + +#ifdef FT_CONFIG_OPTION_USE_BZIP2 + if ( error ) + { + FT_Error error4; + + + /* this didn't work, try Bzip2 support! */ + FT_TRACE2(( " ... try Bzip2 stream\n" )); + error4 = FT_Stream_OpenBzip2( &pcfface->comp_stream, stream ); + if ( FT_ERR_EQ( error4, Unimplemented_Feature ) ) + goto Fail; + + error = error4; + } +#endif /* FT_CONFIG_OPTION_USE_BZIP2 */ + + if ( error ) + goto Fail; + + pcfface->comp_source = stream; + face->stream = &pcfface->comp_stream; + + stream = face->stream; + + error = pcf_load_font( stream, pcfface, face_index ); + if ( error ) + goto Fail; + +#else /* !(FT_CONFIG_OPTION_USE_ZLIB || + FT_CONFIG_OPTION_USE_LZW || + FT_CONFIG_OPTION_USE_BZIP2) */ + + goto Fail; + +#endif + } + + /* PCF cannot have multiple faces in a single font file. + * XXX: A non-zero face_index is already an invalid argument, but + * Type1, Type42 drivers have a convention to return + * an invalid argument error when the font could be + * opened by the specified driver. + */ + if ( face_index < 0 ) + goto Exit; + else if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 ) + { + FT_ERROR(( "PCF_Face_Init: invalid face index\n" )); + PCF_Face_Done( face ); + return FT_THROW( Invalid_Argument ); + } + + /* set up charmap */ + { + FT_String *charset_registry = pcfface->charset_registry; + FT_String *charset_encoding = pcfface->charset_encoding; + FT_Bool unicode_charmap = 0; + + + if ( charset_registry && charset_encoding ) + { + char* s = charset_registry; + + + /* Uh, oh, compare first letters manually to avoid dependency + on locales. */ + if ( ( s[0] == 'i' || s[0] == 'I' ) && + ( s[1] == 's' || s[1] == 'S' ) && + ( s[2] == 'o' || s[2] == 'O' ) ) + { + s += 3; + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( pcfface->charset_encoding, "1" ) ) ) + unicode_charmap = 1; + /* another name for ASCII */ + else if ( !ft_strcmp( s, "646.1991" ) && + !ft_strcmp( pcfface->charset_encoding, "IRV" ) ) + unicode_charmap = 1; + } + } + + { + FT_CharMapRec charmap; + + + charmap.face = face; + charmap.encoding = FT_ENCODING_NONE; + /* initial platform/encoding should indicate unset status? */ + charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; + charmap.encoding_id = TT_APPLE_ID_DEFAULT; + + if ( unicode_charmap ) + { + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; + } + + error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL ); + } + } + + Exit: + return error; + + Fail: + FT_TRACE2(( " not a PCF file\n" )); + PCF_Face_Done( face ); + error = FT_THROW( Unknown_File_Format ); /* error */ + goto Exit; + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + PCF_Accel accel = &( (PCF_Face)size->face )->accel; + + + FT_Select_Metrics( size->face, strike_index ); + + size->metrics.ascender = accel->fontAscent * 64; + size->metrics.descender = -accel->fontDescent * 64; + size->metrics.max_advance = accel->maxbounds.characterWidth * 64; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Size_Request( FT_Size size, + FT_Size_Request req ) + { + PCF_Face face = (PCF_Face)size->face; + FT_Bitmap_Size* bsize = size->face->available_sizes; + FT_Error error = FT_ERR( Invalid_Pixel_Size ); + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = FT_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == ( face->accel.fontAscent + + face->accel.fontDescent ) ) + error = FT_Err_Ok; + break; + + default: + error = FT_THROW( Unimplemented_Feature ); + break; + } + + if ( error ) + return error; + else + return PCF_Size_Select( size, 0 ); + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Glyph_Load( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + PCF_Face face = (PCF_Face)FT_SIZE_FACE( size ); + FT_Stream stream; + FT_Error error = FT_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + PCF_Metric metric; + FT_ULong bytes; + + + FT_TRACE1(( "PCF_Glyph_Load: glyph index %d\n", glyph_index )); + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + stream = face->root.stream; + + metric = face->metrics + glyph_index; + + bitmap->rows = (unsigned int)( metric->ascent + + metric->descent ); + bitmap->width = (unsigned int)( metric->rightSideBearing - + metric->leftSideBearing ); + bitmap->num_grays = 1; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) ) + { + case 1: + bitmap->pitch = (int)( ( bitmap->width + 7 ) >> 3 ); + break; + + case 2: + bitmap->pitch = (int)( ( ( bitmap->width + 15 ) >> 4 ) << 1 ); + break; + + case 4: + bitmap->pitch = (int)( ( ( bitmap->width + 31 ) >> 5 ) << 2 ); + break; + + case 8: + bitmap->pitch = (int)( ( ( bitmap->width + 63 ) >> 6 ) << 3 ); + break; + + default: + return FT_THROW( Invalid_File_Format ); + } + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = metric->leftSideBearing; + slot->bitmap_top = metric->ascent; + + slot->metrics.horiAdvance = (FT_Pos)( metric->characterWidth * 64 ); + slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing * 64 ); + slot->metrics.horiBearingY = (FT_Pos)( metric->ascent * 64 ); + slot->metrics.width = (FT_Pos)( ( metric->rightSideBearing - + metric->leftSideBearing ) * 64 ); + slot->metrics.height = (FT_Pos)( bitmap->rows * 64 ); + + ft_synthesize_vertical_metrics( &slot->metrics, + ( face->accel.fontAscent + + face->accel.fontDescent ) * 64 ); + + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + goto Exit; + + /* XXX: to do: are there cases that need repadding the bitmap? */ + bytes = (FT_ULong)bitmap->pitch * bitmap->rows; + + error = ft_glyphslot_alloc_bitmap( slot, (FT_ULong)bytes ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( metric->bits ) || + FT_STREAM_READ( bitmap->buffer, bytes ) ) + goto Exit; + + if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst ) + BitOrderInvert( bitmap->buffer, bytes ); + + if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) != + PCF_BIT_ORDER( face->bitmapsFormat ) ) ) + { + switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) ) + { + case 1: + break; + + case 2: + TwoByteSwap( bitmap->buffer, bytes ); + break; + + case 4: + FourByteSwap( bitmap->buffer, bytes ); + break; + } + } + + Exit: + return error; + } + + + /* + * + * BDF SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + pcf_get_bdf_property( FT_Face face, /* PCF_Face */ + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + PCF_Face pcfface = (PCF_Face)face; + PCF_Property prop; + + + prop = pcf_find_property( pcfface, prop_name ); + if ( prop ) + { + if ( prop->isString ) + { + aproperty->type = BDF_PROPERTY_TYPE_ATOM; + aproperty->u.atom = prop->value.atom; + } + else + { + if ( prop->value.l > 0x7FFFFFFFL || + prop->value.l < ( -1 - 0x7FFFFFFFL ) ) + { + FT_TRACE2(( "pcf_get_bdf_property:" + " too large integer 0x%lx is truncated\n", + prop->value.l )); + } + + /* + * The PCF driver loads all properties as signed integers. + * This really doesn't seem to be a problem, because this is + * sufficient for any meaningful values. + */ + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = (FT_Int32)prop->value.l; + } + + return FT_Err_Ok; + } + + return FT_THROW( Invalid_Argument ); + } + + + FT_CALLBACK_DEF( FT_Error ) + pcf_get_charset_id( FT_Face face, /* PCF_Face */ + const char* *acharset_encoding, + const char* *acharset_registry ) + { + PCF_Face pcfface = (PCF_Face)face; + + + *acharset_encoding = pcfface->charset_encoding; + *acharset_registry = pcfface->charset_registry; + + return FT_Err_Ok; + } + + + static const FT_Service_BDFRec pcf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id, /* get_charset_id */ + (FT_BDF_GetPropertyFunc) pcf_get_bdf_property /* get_property */ + }; + + + /* + * PROPERTY SERVICE + * + */ + FT_CALLBACK_DEF( FT_Error ) + pcf_property_set( FT_Module module, /* PCF_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + + FT_Error error = FT_Err_Ok; + PCF_Driver driver = (PCF_Driver)module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "no-long-family-names" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long lfn = ft_strtol( s, NULL, 10 ); + + + if ( lfn == 0 ) + driver->no_long_family_names = 0; + else if ( lfn == 1 ) + driver->no_long_family_names = 1; + else + return FT_THROW( Invalid_Argument ); + } + else +#endif + { + FT_Bool* no_long_family_names = (FT_Bool*)value; + + + driver->no_long_family_names = *no_long_family_names; + } + + return error; + } + +#else /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_UNUSED( module ); + FT_UNUSED( value ); + FT_UNUSED( value_is_string ); +#ifndef FT_DEBUG_LEVEL_TRACE + FT_UNUSED( property_name ); +#endif + +#endif /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_TRACE2(( "pcf_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_CALLBACK_DEF( FT_Error ) + pcf_property_get( FT_Module module, /* PCF_Driver */ + const char* property_name, + void* value ) + { +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + + FT_Error error = FT_Err_Ok; + PCF_Driver driver = (PCF_Driver)module; + + + if ( !ft_strcmp( property_name, "no-long-family-names" ) ) + { + FT_Bool no_long_family_names = driver->no_long_family_names; + FT_Bool* val = (FT_Bool*)value; + + + *val = no_long_family_names; + + return error; + } + +#else /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_UNUSED( module ); + FT_UNUSED( value ); +#ifndef FT_DEBUG_LEVEL_TRACE + FT_UNUSED( property_name ); +#endif + +#endif /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_TRACE2(( "pcf_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + pcf_service_properties, + + (FT_Properties_SetFunc)pcf_property_set, /* set_property */ + (FT_Properties_GetFunc)pcf_property_get ) /* get_property */ + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pcf_services[] = + { + { FT_SERVICE_ID_BDF, &pcf_service_bdf }, + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_PCF }, + { FT_SERVICE_ID_PROPERTIES, &pcf_service_properties }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + pcf_driver_requester( FT_Module module, + const char* name ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pcf_services, name ); + } + + + FT_CALLBACK_DEF( FT_Error ) + pcf_driver_init( FT_Module module ) /* PCF_Driver */ + { +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + PCF_Driver driver = (PCF_Driver)module; + + + driver->no_long_family_names = 0; +#else + FT_UNUSED( module ); +#endif + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + pcf_driver_done( FT_Module module ) /* PCF_Driver */ + { + FT_UNUSED( module ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec pcf_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + + sizeof ( PCF_DriverRec ), + "pcf", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + pcf_driver_init, /* FT_Module_Constructor module_init */ + pcf_driver_done, /* FT_Module_Destructor module_done */ + pcf_driver_requester /* FT_Module_Requester get_interface */ + }, + + sizeof ( PCF_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + PCF_Face_Init, /* FT_Face_InitFunc init_face */ + PCF_Face_Done, /* FT_Face_DoneFunc done_face */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ + + PCF_Glyph_Load, /* FT_Slot_LoadFunc load_glyph */ + + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ + + PCF_Size_Request, /* FT_Size_RequestFunc request_size */ + PCF_Size_Select /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/pcf/pcfdrivr.h b/external/freetype/src/pcf/pcfdrivr.h new file mode 100644 index 000000000..d46539374 --- /dev/null +++ b/external/freetype/src/pcf/pcfdrivr.h @@ -0,0 +1,44 @@ +/* pcfdrivr.h + + FreeType font driver for pcf fonts + + Copyright 2000-2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef PCFDRIVR_H_ +#define PCFDRIVR_H_ + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pcf_driver_class; + +FT_END_HEADER + + +#endif /* PCFDRIVR_H_ */ + + +/* END */ diff --git a/external/freetype/src/pcf/pcferror.h b/external/freetype/src/pcf/pcferror.h new file mode 100644 index 000000000..8b9e9902a --- /dev/null +++ b/external/freetype/src/pcf/pcferror.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * pcferror.h + * + * PCF error codes (specification only). + * + * Copyright 2001, 2012 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the PCF error enumeration constants. + * + */ + +#ifndef PCFERROR_H_ +#define PCFERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PCF_Err_ +#define FT_ERR_BASE FT_Mod_Err_PCF + +#include <freetype/fterrors.h> + +#endif /* PCFERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/pcf/pcfread.c b/external/freetype/src/pcf/pcfread.c new file mode 100644 index 000000000..f167bcb8a --- /dev/null +++ b/external/freetype/src/pcf/pcfread.c @@ -0,0 +1,1731 @@ +/* pcfread.c + + FreeType font driver for pcf fonts + + Copyright 2000-2010, 2012-2014 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftobjs.h> + +#include "pcf.h" +#include "pcfread.h" + +#include "pcferror.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT pcfread + + +#ifdef FT_DEBUG_LEVEL_TRACE + static const char* const tableNames[] = + { + "properties", + "accelerators", + "metrics", + "bitmaps", + "ink metrics", + "encodings", + "swidths", + "glyph names", + "BDF accelerators" + }; +#endif + + + static + const FT_Frame_Field pcf_toc_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_TocRec + + FT_FRAME_START( 8 ), + FT_FRAME_ULONG_LE( version ), + FT_FRAME_ULONG_LE( count ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_table_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( type ), + FT_FRAME_ULONG_LE( format ), + FT_FRAME_ULONG_LE( size ), /* rounded up to a multiple of 4 */ + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; + + + static FT_Error + pcf_read_TOC( FT_Stream stream, + PCF_Face face ) + { + FT_Error error; + PCF_Toc toc = &face->toc; + PCF_Table tables; + + FT_Memory memory = FT_FACE( face )->memory; + FT_UInt n; + + FT_ULong size; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ_FIELDS( pcf_toc_header, toc ) ) + return FT_THROW( Cannot_Open_Resource ); + + if ( toc->version != PCF_FILE_VERSION || + toc->count == 0 ) + return FT_THROW( Invalid_File_Format ); + + if ( stream->size < 16 ) + return FT_THROW( Invalid_File_Format ); + + /* we need 16 bytes per TOC entry, */ + /* and there can be most 9 tables */ + if ( toc->count > ( stream->size >> 4 ) || + toc->count > 9 ) + { + FT_TRACE0(( "pcf_read_TOC: adjusting number of tables" + " (from %ld to %ld)\n", + toc->count, + FT_MIN( stream->size >> 4, 9 ) )); + toc->count = FT_MIN( stream->size >> 4, 9 ); + } + + if ( FT_QNEW_ARRAY( face->toc.tables, toc->count ) ) + return error; + + tables = face->toc.tables; + for ( n = 0; n < toc->count; n++ ) + { + if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) ) + goto Exit; + tables++; + } + + /* Sort tables and check for overlaps. Because they are almost */ + /* always ordered already, an in-place bubble sort with simultaneous */ + /* boundary checking seems appropriate. */ + tables = face->toc.tables; + + for ( n = 0; n < toc->count - 1; n++ ) + { + FT_UInt i, have_change; + + + have_change = 0; + + for ( i = 0; i < toc->count - 1 - n; i++ ) + { + PCF_TableRec tmp; + + + if ( tables[i].offset > tables[i + 1].offset ) + { + tmp = tables[i]; + tables[i] = tables[i + 1]; + tables[i + 1] = tmp; + + have_change = 1; + } + + if ( ( tables[i].size > tables[i + 1].offset ) || + ( tables[i].offset > tables[i + 1].offset - tables[i].size ) ) + { + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + } + + if ( !have_change ) + break; + } + + /* + * We now check whether the `size' and `offset' values are reasonable: + * `offset' + `size' must not exceed the stream size. + * + * Note, however, that X11's `pcfWriteFont' routine (used by the + * `bdftopcf' program to create PCF font files) has two special + * features. + * + * - It always assigns the accelerator table a size of 100 bytes in the + * TOC, regardless of its real size, which can vary between 34 and 72 + * bytes. + * + * - Due to the way the routine is designed, it ships out the last font + * table with its real size, ignoring the TOC's size value. Since + * the TOC size values are always rounded up to a multiple of 4, the + * difference can be up to three bytes for all tables except the + * accelerator table, for which the difference can be as large as 66 + * bytes. + * + */ + + tables = face->toc.tables; + size = stream->size; + + for ( n = 0; n < toc->count - 1; n++ ) + { + /* we need two checks to avoid overflow */ + if ( ( tables->size > size ) || + ( tables->offset > size - tables->size ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + tables++; + } + + /* only check `tables->offset' for last table element ... */ + if ( ( tables->offset > size ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + /* ... and adjust `tables->size' to the real value if necessary */ + if ( tables->size > size - tables->offset ) + tables->size = size - tables->offset; + +#ifdef FT_DEBUG_LEVEL_TRACE + + { + FT_UInt i, j; + const char* name = "?"; + + + FT_TRACE4(( "pcf_read_TOC:\n" )); + + FT_TRACE4(( " number of tables: %ld\n", face->toc.count )); + + tables = face->toc.tables; + for ( i = 0; i < toc->count; i++ ) + { + for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] ); + j++ ) + if ( tables[i].type == 1UL << j ) + name = tableNames[j]; + + FT_TRACE4(( " %d: type=%s, format=0x%lX," + " size=%ld (0x%lX), offset=%ld (0x%lX)\n", + i, name, + tables[i].format, + tables[i].size, tables[i].size, + tables[i].offset, tables[i].offset )); + } + } + +#endif + + return FT_Err_Ok; + + Exit: + FT_FREE( face->toc.tables ); + return error; + } + + +#define PCF_METRIC_SIZE 12 + + static + const FT_Frame_Field pcf_metric_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_MetricRec + + FT_FRAME_START( PCF_METRIC_SIZE ), + FT_FRAME_SHORT_LE( leftSideBearing ), + FT_FRAME_SHORT_LE( rightSideBearing ), + FT_FRAME_SHORT_LE( characterWidth ), + FT_FRAME_SHORT_LE( ascent ), + FT_FRAME_SHORT_LE( descent ), + FT_FRAME_SHORT_LE( attributes ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_metric_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_MetricRec + + FT_FRAME_START( PCF_METRIC_SIZE ), + FT_FRAME_SHORT( leftSideBearing ), + FT_FRAME_SHORT( rightSideBearing ), + FT_FRAME_SHORT( characterWidth ), + FT_FRAME_SHORT( ascent ), + FT_FRAME_SHORT( descent ), + FT_FRAME_SHORT( attributes ), + FT_FRAME_END + }; + + +#define PCF_COMPRESSED_METRIC_SIZE 5 + + static + const FT_Frame_Field pcf_compressed_metric_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_Compressed_MetricRec + + FT_FRAME_START( PCF_COMPRESSED_METRIC_SIZE ), + FT_FRAME_BYTE( leftSideBearing ), + FT_FRAME_BYTE( rightSideBearing ), + FT_FRAME_BYTE( characterWidth ), + FT_FRAME_BYTE( ascent ), + FT_FRAME_BYTE( descent ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_metric( FT_Stream stream, + FT_ULong format, + PCF_Metric metric ) + { + FT_Error error = FT_Err_Ok; + + + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + const FT_Frame_Field* fields; + + + /* parsing normal metrics */ + fields = ( PCF_BYTE_ORDER( format ) == MSBFirst ) + ? pcf_metric_msb_header + : pcf_metric_header; + + /* the following sets `error' but doesn't return in case of failure */ + (void)FT_STREAM_READ_FIELDS( fields, metric ); + } + else + { + PCF_Compressed_MetricRec compr; + + + /* parsing compressed metrics */ + if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) ) + goto Exit; + + metric->leftSideBearing = (FT_Short)( compr.leftSideBearing - 0x80 ); + metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 ); + metric->characterWidth = (FT_Short)( compr.characterWidth - 0x80 ); + metric->ascent = (FT_Short)( compr.ascent - 0x80 ); + metric->descent = (FT_Short)( compr.descent - 0x80 ); + metric->attributes = 0; + } + + FT_TRACE5(( " width=%d," + " lsb=%d, rsb=%d," + " ascent=%d, descent=%d," + " attributes=%d\n", + metric->characterWidth, + metric->leftSideBearing, + metric->rightSideBearing, + metric->ascent, + metric->descent, + metric->attributes )); + + Exit: + return error; + } + + + static FT_Error + pcf_seek_to_table_type( FT_Stream stream, + PCF_Table tables, + FT_ULong ntables, /* same as PCF_Toc->count */ + FT_ULong type, + FT_ULong *aformat, + FT_ULong *asize ) + { + FT_Error error = FT_ERR( Invalid_File_Format ); + FT_ULong i; + + + for ( i = 0; i < ntables; i++ ) + if ( tables[i].type == type ) + { + if ( stream->pos > tables[i].offset ) + { + error = FT_THROW( Invalid_Stream_Skip ); + goto Fail; + } + + if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) ) + { + error = FT_THROW( Invalid_Stream_Skip ); + goto Fail; + } + + *asize = tables[i].size; + *aformat = tables[i].format; + + return FT_Err_Ok; + } + + Fail: + *asize = 0; + return error; + } + + + static FT_Bool + pcf_has_table_type( PCF_Table tables, + FT_ULong ntables, /* same as PCF_Toc->count */ + FT_ULong type ) + { + FT_ULong i; + + + for ( i = 0; i < ntables; i++ ) + if ( tables[i].type == type ) + return TRUE; + + return FALSE; + } + + +#define PCF_PROPERTY_SIZE 9 + + static + const FT_Frame_Field pcf_property_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_ParsePropertyRec + + FT_FRAME_START( PCF_PROPERTY_SIZE ), + FT_FRAME_LONG_LE( name ), + FT_FRAME_BYTE ( isString ), + FT_FRAME_LONG_LE( value ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_property_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_ParsePropertyRec + + FT_FRAME_START( PCF_PROPERTY_SIZE ), + FT_FRAME_LONG( name ), + FT_FRAME_BYTE( isString ), + FT_FRAME_LONG( value ), + FT_FRAME_END + }; + + + FT_LOCAL_DEF( PCF_Property ) + pcf_find_property( PCF_Face face, + const FT_String* prop ) + { + PCF_Property properties = face->properties; + FT_Bool found = 0; + int i; + + + for ( i = 0; i < face->nprops && !found; i++ ) + { + if ( !ft_strcmp( properties[i].name, prop ) ) + found = 1; + } + + if ( found ) + return properties + i - 1; + else + return NULL; + } + + + static FT_Error + pcf_get_properties( FT_Stream stream, + PCF_Face face ) + { + PCF_ParseProperty props = NULL; + PCF_Property properties = NULL; + FT_ULong nprops, orig_nprops, i; + FT_ULong format, size; + FT_Error error; + FT_Memory memory = FT_FACE( face )->memory; + FT_ULong string_size; + FT_String* strings = NULL; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_PROPERTIES, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + FT_TRACE4(( "pcf_get_properties:\n" )); + FT_TRACE4(( " format: 0x%lX (%s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB" )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + goto Bail; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( orig_nprops ); + else + (void)FT_READ_ULONG_LE( orig_nprops ); + if ( error ) + goto Bail; + + FT_TRACE4(( " number of properties: %ld\n", orig_nprops )); + + /* rough estimate */ + if ( orig_nprops > size / PCF_PROPERTY_SIZE ) + { + error = FT_THROW( Invalid_Table ); + goto Bail; + } + + /* as a heuristic limit to avoid excessive allocation in */ + /* gzip bombs (i.e., very small, invalid input data that */ + /* pretends to expand to an insanely large file) we only */ + /* load the first 256 properties */ + if ( orig_nprops > 256 ) + { + FT_TRACE0(( "pcf_get_properties:" + " only loading first 256 properties\n" )); + nprops = 256; + } + else + nprops = orig_nprops; + + face->nprops = (int)nprops; + + if ( FT_QNEW_ARRAY( props, nprops ) ) + goto Bail; + + for ( i = 0; i < nprops; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) ) + goto Bail; + } + } + + /* this skip will only work if we really have an extremely large */ + /* number of properties; it will fail for fake data, avoiding an */ + /* unnecessarily large allocation later on */ + if ( FT_STREAM_SKIP( ( orig_nprops - nprops ) * PCF_PROPERTY_SIZE ) ) + { + error = FT_THROW( Invalid_Stream_Skip ); + goto Bail; + } + + /* pad the property array */ + /* */ + /* clever here - nprops is the same as the number of odd-units read, */ + /* as only isStringProp are odd length (Keith Packard) */ + /* */ + if ( orig_nprops & 3 ) + { + i = 4 - ( orig_nprops & 3 ); + if ( FT_STREAM_SKIP( i ) ) + { + error = FT_THROW( Invalid_Stream_Skip ); + goto Bail; + } + } + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( string_size ); + else + (void)FT_READ_ULONG_LE( string_size ); + if ( error ) + goto Bail; + + FT_TRACE4(( " string size: %ld\n", string_size )); + + /* rough estimate */ + if ( string_size > size - orig_nprops * PCF_PROPERTY_SIZE ) + { + error = FT_THROW( Invalid_Table ); + goto Bail; + } + + /* the strings in the `strings' array are PostScript strings, */ + /* which can have a maximum length of 65536 characters each */ + if ( string_size > 16777472 ) /* 256 * (65536 + 1) */ + { + FT_TRACE0(( "pcf_get_properties:" + " loading only 16777472 bytes of strings array\n" )); + string_size = 16777472; + } + + /* allocate one more byte so that we have a final null byte */ + if ( FT_QALLOC( strings, string_size + 1 ) || + FT_STREAM_READ( strings, string_size ) ) + goto Bail; + + strings[string_size] = '\0'; + + /* zero out in case of failure */ + if ( FT_NEW_ARRAY( properties, nprops ) ) + goto Bail; + + face->properties = properties; + + FT_TRACE4(( "\n" )); + for ( i = 0; i < nprops; i++ ) + { + FT_Long name_offset = props[i].name; + + + if ( ( name_offset < 0 ) || + ( (FT_ULong)name_offset > string_size ) ) + { + error = FT_THROW( Invalid_Offset ); + goto Bail; + } + + if ( FT_STRDUP( properties[i].name, strings + name_offset ) ) + goto Bail; + + FT_TRACE4(( " %s:", properties[i].name )); + + properties[i].isString = props[i].isString; + + if ( props[i].isString ) + { + FT_Long value_offset = props[i].value; + + + if ( ( value_offset < 0 ) || + ( (FT_ULong)value_offset > string_size ) ) + { + error = FT_THROW( Invalid_Offset ); + goto Bail; + } + + if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) ) + goto Bail; + + FT_TRACE4(( " `%s'\n", properties[i].value.atom )); + } + else + { + properties[i].value.l = props[i].value; + + FT_TRACE4(( " %ld\n", properties[i].value.l )); + } + } + + error = FT_Err_Ok; + + Bail: + FT_FREE( props ); + FT_FREE( strings ); + + return error; + } + + + static FT_Error + pcf_get_metrics( FT_Stream stream, + PCF_Face face ) + { + FT_Error error; + FT_Memory memory = FT_FACE( face )->memory; + FT_ULong format, size; + PCF_Metric metrics = NULL; + FT_ULong nmetrics, orig_nmetrics, i; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_METRICS, + &format, + &size ); + if ( error ) + return error; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + FT_TRACE4(( "pcf_get_metrics:\n" )); + FT_TRACE4(( " format: 0x%lX (%s, %s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB", + PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ? + "compressed" : "uncompressed" )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ) + return FT_THROW( Invalid_File_Format ); + + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( orig_nmetrics ); + else + (void)FT_READ_ULONG_LE( orig_nmetrics ); + } + else + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_USHORT( orig_nmetrics ); + else + (void)FT_READ_USHORT_LE( orig_nmetrics ); + } + if ( error ) + return FT_THROW( Invalid_File_Format ); + + FT_TRACE4(( " number of metrics: %ld\n", orig_nmetrics )); + + /* rough estimate */ + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + if ( orig_nmetrics > size / PCF_METRIC_SIZE ) + return FT_THROW( Invalid_Table ); + } + else + { + if ( orig_nmetrics > size / PCF_COMPRESSED_METRIC_SIZE ) + return FT_THROW( Invalid_Table ); + } + + if ( !orig_nmetrics ) + return FT_THROW( Invalid_Table ); + + /* + * PCF is a format from ancient times; Unicode was in its infancy, and + * widely used two-byte character sets for CJK scripts (Big 5, GB 2312, + * JIS X 0208, etc.) did have at most 15000 characters. Even the more + * exotic CNS 11643 and CCCII standards, which were essentially + * three-byte character sets, provided less then 65536 assigned + * characters. + * + * While technically possible to have a larger number of glyphs in PCF + * files, we thus limit the number to 65535, taking into account that we + * synthesize the metrics of glyph 0 to be a copy of the `default + * character', and that 0xFFFF in the encodings array indicates a + * missing glyph. + */ + if ( orig_nmetrics > 65534 ) + { + FT_TRACE0(( "pcf_get_metrics:" + " only loading first 65534 metrics\n" )); + nmetrics = 65534; + } + else + nmetrics = orig_nmetrics; + + face->nmetrics = nmetrics + 1; + + if ( FT_QNEW_ARRAY( face->metrics, face->nmetrics ) ) + return error; + + /* we handle glyph index 0 later on */ + metrics = face->metrics + 1; + + FT_TRACE4(( "\n" )); + for ( i = 1; i < face->nmetrics; i++, metrics++ ) + { + FT_TRACE5(( " idx %ld:", i )); + error = pcf_get_metric( stream, format, metrics ); + + metrics->bits = 0; + + if ( error ) + break; + + /* sanity checks -- those values are used in `PCF_Glyph_Load' to */ + /* compute a glyph's bitmap dimensions, thus setting them to zero in */ + /* case of an error disables this particular glyph only */ + if ( metrics->rightSideBearing < metrics->leftSideBearing || + metrics->ascent < -metrics->descent ) + { + metrics->characterWidth = 0; + metrics->leftSideBearing = 0; + metrics->rightSideBearing = 0; + metrics->ascent = 0; + metrics->descent = 0; + + FT_TRACE0(( "pcf_get_metrics:" + " invalid metrics for glyph %ld\n", i )); + } + } + + if ( error ) + FT_FREE( face->metrics ); + + Bail: + return error; + } + + + static FT_Error + pcf_get_bitmaps( FT_Stream stream, + PCF_Face face ) + { + FT_Error error; + FT_ULong bitmapSizes[GLYPHPADOPTIONS]; + FT_ULong format, size, pos; + FT_ULong nbitmaps, orig_nbitmaps, i, sizebitmaps = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_BITMAPS, + &format, + &size ); + if ( error ) + return error; + + error = FT_Stream_EnterFrame( stream, 8 ); + if ( error ) + return error; + + format = FT_GET_ULONG_LE(); + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + orig_nbitmaps = FT_GET_ULONG(); + else + orig_nbitmaps = FT_GET_ULONG_LE(); + + FT_Stream_ExitFrame( stream ); + + FT_TRACE4(( "pcf_get_bitmaps:\n" )); + FT_TRACE4(( " format: 0x%lX\n", format )); + FT_TRACE4(( " (%s, %s,\n", + PCF_BYTE_ORDER( format ) == MSBFirst + ? "most significant byte first" + : "least significant byte first", + PCF_BIT_ORDER( format ) == MSBFirst + ? "most significant bit first" + : "least significant bit first" )); + FT_TRACE4(( " padding=%d bit%s, scanning=%d bit%s)\n", + 8 << PCF_GLYPH_PAD_INDEX( format ), + ( 8 << PCF_GLYPH_PAD_INDEX( format ) ) == 1 ? "" : "s", + 8 << PCF_SCAN_UNIT_INDEX( format ), + ( 8 << PCF_SCAN_UNIT_INDEX( format ) ) == 1 ? "" : "s" )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + return FT_THROW( Invalid_File_Format ); + + FT_TRACE4(( " number of bitmaps: %ld\n", orig_nbitmaps )); + + /* see comment in `pcf_get_metrics' */ + if ( orig_nbitmaps > 65534 ) + { + FT_TRACE0(( "pcf_get_bitmaps:" + " only loading first 65534 bitmaps\n" )); + nbitmaps = 65534; + } + else + nbitmaps = orig_nbitmaps; + + /* no extra bitmap for glyph 0 */ + if ( nbitmaps != face->nmetrics - 1 ) + return FT_THROW( Invalid_File_Format ); + + /* start position of bitmap data */ + pos = stream->pos + nbitmaps * 4 + 4 * 4; + + FT_TRACE5(( "\n" )); + for ( i = 1; i <= nbitmaps; i++ ) + { + FT_ULong offset; + + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( offset ); + else + (void)FT_READ_ULONG_LE( offset ); + + FT_TRACE5(( " bitmap %lu: offset %lu (0x%lX)\n", + i, offset, offset )); + + /* right now, we only check the offset with a rough estimate; */ + /* actual bitmaps are only loaded on demand */ + if ( offset > size ) + { + FT_TRACE0(( "pcf_get_bitmaps:" + " invalid offset to bitmap data of glyph %lu\n", i )); + face->metrics[i].bits = pos; + } + else + face->metrics[i].bits = pos + offset; + } + if ( error ) + goto Bail; + + for ( i = 0; i < GLYPHPADOPTIONS; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( bitmapSizes[i] ); + else + (void)FT_READ_ULONG_LE( bitmapSizes[i] ); + if ( error ) + goto Bail; + + sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )]; + + FT_TRACE4(( " %d-bit padding implies a size of %lu\n", + 8 << i, bitmapSizes[i] )); + } + + FT_TRACE4(( " %lu bitmaps, using %d-bit padding\n", + nbitmaps, + 8 << PCF_GLYPH_PAD_INDEX( format ) )); + FT_TRACE4(( " bitmap size: %lu\n", sizebitmaps )); + + FT_UNUSED( sizebitmaps ); /* only used for debugging */ + + face->bitmapsFormat = format; + + Bail: + return error; + } + + + /* + * This file uses X11 terminology for PCF data; an `encoding' in X11 speak + * is the same as a character code in FreeType speak. + */ +#define PCF_ENC_SIZE 10 + + static + const FT_Frame_Field pcf_enc_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_EncRec + + FT_FRAME_START( PCF_ENC_SIZE ), + FT_FRAME_USHORT_LE( firstCol ), + FT_FRAME_USHORT_LE( lastCol ), + FT_FRAME_USHORT_LE( firstRow ), + FT_FRAME_USHORT_LE( lastRow ), + FT_FRAME_USHORT_LE( defaultChar ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_enc_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_EncRec + + FT_FRAME_START( PCF_ENC_SIZE ), + FT_FRAME_USHORT( firstCol ), + FT_FRAME_USHORT( lastCol ), + FT_FRAME_USHORT( firstRow ), + FT_FRAME_USHORT( lastRow ), + FT_FRAME_USHORT( defaultChar ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_encodings( FT_Stream stream, + PCF_Face face ) + { + FT_Error error; + FT_Memory memory = FT_FACE( face )->memory; + FT_ULong format, size; + PCF_Enc enc = &face->enc; + FT_ULong nencoding; + FT_UShort* offset; + FT_UShort defaultCharRow, defaultCharCol; + FT_UShort encodingOffset, defaultCharEncodingOffset; + FT_UShort i, j; + FT_Byte* pos; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_BDF_ENCODINGS, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + FT_TRACE4(( "pcf_get_encodings:\n" )); + FT_TRACE4(( " format: 0x%lX (%s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB" )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_BDF_ENCODINGS ) ) + return FT_THROW( Invalid_File_Format ); + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_enc_msb_header, enc ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_enc_header, enc ) ) + goto Bail; + } + + FT_TRACE4(( " firstCol 0x%X, lastCol 0x%X\n", + enc->firstCol, enc->lastCol )); + FT_TRACE4(( " firstRow 0x%X, lastRow 0x%X\n", + enc->firstRow, enc->lastRow )); + FT_TRACE4(( " defaultChar 0x%X\n", + enc->defaultChar )); + + /* sanity checks; we limit numbers of rows and columns to 256 */ + if ( enc->firstCol > enc->lastCol || + enc->lastCol > 0xFF || + enc->firstRow > enc->lastRow || + enc->lastRow > 0xFF ) + return FT_THROW( Invalid_Table ); + + FT_TRACE5(( "\n" )); + + defaultCharRow = enc->defaultChar >> 8; + defaultCharCol = enc->defaultChar & 0xFF; + + /* validate default character */ + if ( defaultCharRow < enc->firstRow || + defaultCharRow > enc->lastRow || + defaultCharCol < enc->firstCol || + defaultCharCol > enc->lastCol ) + { + enc->defaultChar = enc->firstRow * 256U + enc->firstCol; + FT_TRACE0(( "pcf_get_encodings:" + " Invalid default character set to %u\n", + enc->defaultChar )); + + defaultCharRow = enc->firstRow; + defaultCharCol = enc->firstCol; + } + + nencoding = (FT_ULong)( enc->lastCol - enc->firstCol + 1 ) * + (FT_ULong)( enc->lastRow - enc->firstRow + 1 ); + + error = FT_Stream_EnterFrame( stream, 2 * nencoding ); + if ( error ) + goto Bail; + + /* + * FreeType mandates that glyph index 0 is the `undefined glyph', which + * PCF calls the `default character'. However, FreeType needs glyph + * index 0 to be used for the undefined glyph only, which is is not the + * case for PCF. For this reason, we add one slot for glyph index 0 and + * simply copy the default character to it. + * + * `stream->cursor' still points to the beginning of the frame; we can + * thus easily get the offset to the default character. + */ + pos = stream->cursor + + 2 * ( ( defaultCharRow - enc->firstRow ) * + ( enc->lastCol - enc->firstCol + 1 ) + + defaultCharCol - enc->firstCol ); + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + defaultCharEncodingOffset = FT_PEEK_USHORT( pos ); + else + defaultCharEncodingOffset = FT_PEEK_USHORT_LE( pos ); + + if ( defaultCharEncodingOffset == 0xFFFF ) + { + FT_TRACE0(( "pcf_get_encodings:" + " No glyph for default character,\n" )); + FT_TRACE0(( " " + " setting it to the first glyph of the font\n" )); + defaultCharEncodingOffset = 1; + } + else + { + defaultCharEncodingOffset++; + + if ( defaultCharEncodingOffset >= face->nmetrics ) + { + FT_TRACE0(( "pcf_get_encodings:" + " Invalid glyph index for default character,\n" )); + FT_TRACE0(( " " + " setting it to the first glyph of the font\n" )); + defaultCharEncodingOffset = 1; + } + } + + /* copy metrics of default character to index 0 */ + face->metrics[0] = face->metrics[defaultCharEncodingOffset]; + + if ( FT_QNEW_ARRAY( enc->offset, nencoding ) ) + goto Bail; + + /* now loop over all values */ + offset = enc->offset; + for ( i = enc->firstRow; i <= enc->lastRow; i++ ) + { + for ( j = enc->firstCol; j <= enc->lastCol; j++ ) + { + /* X11's reference implementation uses the equivalent to */ + /* `FT_GET_SHORT', however PCF fonts with more than 32768 */ + /* characters (e.g., `unifont.pcf') clearly show that an */ + /* unsigned value is needed. */ + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + encodingOffset = FT_GET_USHORT(); + else + encodingOffset = FT_GET_USHORT_LE(); + + /* everything is off by 1 due to the artificial glyph 0 */ + *offset++ = encodingOffset == 0xFFFF ? 0xFFFF + : encodingOffset + 1; + } + } + FT_Stream_ExitFrame( stream ); + + Bail: + return error; + } + + + static + const FT_Frame_Field pcf_accel_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_AccelRec + + FT_FRAME_START( 20 ), + FT_FRAME_BYTE ( noOverlap ), + FT_FRAME_BYTE ( constantMetrics ), + FT_FRAME_BYTE ( terminalFont ), + FT_FRAME_BYTE ( constantWidth ), + FT_FRAME_BYTE ( inkInside ), + FT_FRAME_BYTE ( inkMetrics ), + FT_FRAME_BYTE ( drawDirection ), + FT_FRAME_SKIP_BYTES( 1 ), + FT_FRAME_LONG_LE ( fontAscent ), + FT_FRAME_LONG_LE ( fontDescent ), + FT_FRAME_LONG_LE ( maxOverlap ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_accel_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_AccelRec + + FT_FRAME_START( 20 ), + FT_FRAME_BYTE ( noOverlap ), + FT_FRAME_BYTE ( constantMetrics ), + FT_FRAME_BYTE ( terminalFont ), + FT_FRAME_BYTE ( constantWidth ), + FT_FRAME_BYTE ( inkInside ), + FT_FRAME_BYTE ( inkMetrics ), + FT_FRAME_BYTE ( drawDirection ), + FT_FRAME_SKIP_BYTES( 1 ), + FT_FRAME_LONG ( fontAscent ), + FT_FRAME_LONG ( fontDescent ), + FT_FRAME_LONG ( maxOverlap ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_accel( FT_Stream stream, + PCF_Face face, + FT_ULong type ) + { + FT_ULong format, size; + FT_Error error; + PCF_Accel accel = &face->accel; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + type, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + FT_TRACE4(( "pcf_get_accel%s:\n", + type == PCF_BDF_ACCELERATORS ? " (getting BDF accelerators)" + : "" )); + FT_TRACE4(( " format: 0x%lX (%s, %s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB", + PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ? + "accelerated" : "not accelerated" )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) + goto Bail; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_accel_msb_header, accel ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_accel_header, accel ) ) + goto Bail; + } + + FT_TRACE5(( " noOverlap=%s, constantMetrics=%s," + " terminalFont=%s, constantWidth=%s\n", + accel->noOverlap ? "yes" : "no", + accel->constantMetrics ? "yes" : "no", + accel->terminalFont ? "yes" : "no", + accel->constantWidth ? "yes" : "no" )); + FT_TRACE5(( " inkInside=%s, inkMetrics=%s, drawDirection=%s\n", + accel->inkInside ? "yes" : "no", + accel->inkMetrics ? "yes" : "no", + accel->drawDirection ? "RTL" : "LTR" )); + FT_TRACE5(( " fontAscent=%ld, fontDescent=%ld, maxOverlap=%ld\n", + accel->fontAscent, + accel->fontDescent, + accel->maxOverlap )); + + /* sanity checks */ + if ( FT_ABS( accel->fontAscent ) > 0x7FFF ) + { + accel->fontAscent = accel->fontAscent < 0 ? -0x7FFF : 0x7FFF; + FT_TRACE0(( "pfc_get_accel: clamping font ascent to value %ld\n", + accel->fontAscent )); + } + if ( FT_ABS( accel->fontDescent ) > 0x7FFF ) + { + accel->fontDescent = accel->fontDescent < 0 ? -0x7FFF : 0x7FFF; + FT_TRACE0(( "pfc_get_accel: clamping font descent to value %ld\n", + accel->fontDescent )); + } + + FT_TRACE5(( " minbounds:" )); + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->minbounds) ); + if ( error ) + goto Bail; + + FT_TRACE5(( " maxbounds:" )); + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->maxbounds) ); + if ( error ) + goto Bail; + + if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) + { + FT_TRACE5(( " ink minbounds:" )); + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->ink_minbounds) ); + if ( error ) + goto Bail; + + FT_TRACE5(( " ink maxbounds:" )); + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->ink_maxbounds) ); + if ( error ) + goto Bail; + } + else + { + accel->ink_minbounds = accel->minbounds; + accel->ink_maxbounds = accel->maxbounds; + } + + Bail: + return error; + } + + + static FT_Error + pcf_interpret_style( PCF_Face pcf ) + { + FT_Error error = FT_Err_Ok; + FT_Face face = FT_FACE( pcf ); + FT_Memory memory = face->memory; + + PCF_Property prop; + + const char* strings[4] = { NULL, NULL, NULL, NULL }; + size_t lengths[4], nn, len; + + + face->style_flags = 0; + + prop = pcf_find_property( pcf, "SLANT" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + strings[2] = ( *(prop->value.atom) == 'O' || + *(prop->value.atom) == 'o' ) ? "Oblique" + : "Italic"; + } + + prop = pcf_find_property( pcf, "WEIGHT_NAME" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + strings[1] = "Bold"; + } + + prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[3] = (const char*)( prop->value.atom ); + + prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[0] = (const char*)( prop->value.atom ); + + for ( len = 0, nn = 0; nn < 4; nn++ ) + { + lengths[nn] = 0; + if ( strings[nn] ) + { + lengths[nn] = ft_strlen( strings[nn] ); + len += lengths[nn] + 1; + } + } + + if ( len == 0 ) + { + strings[0] = "Regular"; + lengths[0] = ft_strlen( strings[0] ); + len = lengths[0] + 1; + } + + { + char* s; + + + if ( FT_QALLOC( face->style_name, len ) ) + return error; + + s = face->style_name; + + for ( nn = 0; nn < 4; nn++ ) + { + const char* src = strings[nn]; + + + len = lengths[nn]; + + if ( !src ) + continue; + + /* separate elements with a space */ + if ( s != face->style_name ) + *s++ = ' '; + + ft_memcpy( s, src, len ); + + /* need to convert spaces to dashes for */ + /* add_style_name and setwidth_name */ + if ( nn == 0 || nn == 3 ) + { + size_t mm; + + + for ( mm = 0; mm < len; mm++ ) + if ( s[mm] == ' ' ) + s[mm] = '-'; + } + + s += len; + } + *s = 0; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pcf_load_font( FT_Stream stream, + PCF_Face face, + FT_Long face_index ) + { + FT_Face root = FT_FACE( face ); + FT_Error error; + FT_Memory memory = FT_FACE( face )->memory; + FT_Bool hasBDFAccelerators; + + + error = pcf_read_TOC( stream, face ); + if ( error ) + goto Exit; + + root->num_faces = 1; + root->face_index = 0; + + /* If we are performing a simple font format check, exit immediately. */ + if ( face_index < 0 ) + return FT_Err_Ok; + + error = pcf_get_properties( stream, face ); + if ( error ) + goto Exit; + + /* Use the old accelerators if no BDF accelerators are in the file. */ + hasBDFAccelerators = pcf_has_table_type( face->toc.tables, + face->toc.count, + PCF_BDF_ACCELERATORS ); + if ( !hasBDFAccelerators ) + { + error = pcf_get_accel( stream, face, PCF_ACCELERATORS ); + if ( error ) + goto Exit; + } + + /* metrics */ + error = pcf_get_metrics( stream, face ); + if ( error ) + goto Exit; + + /* bitmaps */ + error = pcf_get_bitmaps( stream, face ); + if ( error ) + goto Exit; + + /* encodings */ + error = pcf_get_encodings( stream, face ); + if ( error ) + goto Exit; + + /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ + if ( hasBDFAccelerators ) + { + error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS ); + if ( error ) + goto Exit; + } + + /* XXX: TO DO: inkmetrics and glyph_names are missing */ + + /* now construct the face object */ + { + PCF_Property prop; + + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; + + if ( face->accel.constantWidth ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( FT_SET_ERROR( pcf_interpret_style( face ) ) ) + goto Exit; + + prop = pcf_find_property( face, "FAMILY_NAME" ); + if ( prop && prop->isString ) + { + +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + + PCF_Driver driver = (PCF_Driver)FT_FACE_DRIVER( face ); + + + if ( !driver->no_long_family_names ) + { + /* Prepend the foundry name plus a space to the family name. */ + /* There are many fonts just called `Fixed' which look */ + /* completely different, and which have nothing to do with each */ + /* other. When selecting `Fixed' in KDE or Gnome one gets */ + /* results that appear rather random, the style changes often if */ + /* one changes the size and one cannot select some fonts at all. */ + /* */ + /* We also check whether we have `wide' characters; all put */ + /* together, we get family names like `Sony Fixed' or `Misc */ + /* Fixed Wide'. */ + + PCF_Property foundry_prop, point_size_prop, average_width_prop; + + int l = ft_strlen( prop->value.atom ) + 1; + int wide = 0; + + + foundry_prop = pcf_find_property( face, "FOUNDRY" ); + point_size_prop = pcf_find_property( face, "POINT_SIZE" ); + average_width_prop = pcf_find_property( face, "AVERAGE_WIDTH" ); + + if ( point_size_prop && average_width_prop ) + { + if ( average_width_prop->value.l >= point_size_prop->value.l ) + { + /* This font is at least square shaped or even wider */ + wide = 1; + l += ft_strlen( " Wide" ); + } + } + + if ( foundry_prop && foundry_prop->isString ) + { + l += ft_strlen( foundry_prop->value.atom ) + 1; + + if ( FT_QALLOC( root->family_name, l ) ) + goto Exit; + + ft_strcpy( root->family_name, foundry_prop->value.atom ); + ft_strcat( root->family_name, " " ); + ft_strcat( root->family_name, prop->value.atom ); + } + else + { + if ( FT_QALLOC( root->family_name, l ) ) + goto Exit; + + ft_strcpy( root->family_name, prop->value.atom ); + } + + if ( wide ) + ft_strcat( root->family_name, " Wide" ); + } + else + +#endif /* PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + { + if ( FT_STRDUP( root->family_name, prop->value.atom ) ) + goto Exit; + } + } + else + root->family_name = NULL; + + root->num_glyphs = (FT_Long)face->nmetrics; + + root->num_fixed_sizes = 1; + if ( FT_NEW( root->available_sizes ) ) + goto Exit; + + { + FT_Bitmap_Size* bsize = root->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; + + + /* for simplicity, we take absolute values of integer properties */ + +#if 0 + bsize->height = face->accel.maxbounds.ascent << 6; +#endif + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( face->accel.fontAscent + face->accel.fontDescent < 0 ) + FT_TRACE0(( "pcf_load_font: negative height\n" )); +#endif + if ( FT_ABS( face->accel.fontAscent + + face->accel.fontDescent ) > 0x7FFF ) + { + bsize->height = 0x7FFF; + FT_TRACE0(( "pcf_load_font: clamping height to value %d\n", + bsize->height )); + } + else + bsize->height = FT_ABS( (FT_Short)( face->accel.fontAscent + + face->accel.fontDescent ) ); + + prop = pcf_find_property( face, "AVERAGE_WIDTH" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "pcf_load_font: negative average width\n" )); +#endif + if ( ( FT_ABS( prop->value.l ) > 0x7FFFL * 10 - 5 ) ) + { + bsize->width = 0x7FFF; + FT_TRACE0(( "pcf_load_font: clamping average width to value %d\n", + bsize->width )); + } + else + bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) ); + } + else + { + /* this is a heuristical value */ + bsize->width = ( bsize->height * 2 + 1 ) / 3; + } + + prop = pcf_find_property( face, "POINT_SIZE" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "pcf_load_font: negative point size\n" )); +#endif + /* convert from 722.7 decipoints to 72 points per inch */ + if ( FT_ABS( prop->value.l ) > 0x504C2L ) /* 0x7FFF * 72270/7200 */ + { + bsize->size = 0x7FFF; + FT_TRACE0(( "pcf_load_font: clamping point size to value %ld\n", + bsize->size )); + } + else + bsize->size = FT_MulDiv( FT_ABS( prop->value.l ), + 64 * 7200, + 72270L ); + } + + prop = pcf_find_property( face, "PIXEL_SIZE" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "pcf_load_font: negative pixel size\n" )); +#endif + if ( FT_ABS( prop->value.l ) > 0x7FFF ) + { + bsize->y_ppem = 0x7FFF << 6; + FT_TRACE0(( "pcf_load_font: clamping pixel size to value %ld\n", + bsize->y_ppem )); + } + else + bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6; + } + + prop = pcf_find_property( face, "RESOLUTION_X" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "pcf_load_font: negative X resolution\n" )); +#endif + if ( FT_ABS( prop->value.l ) > 0x7FFF ) + { + resolution_x = 0x7FFF; + FT_TRACE0(( "pcf_load_font: clamping X resolution to value %d\n", + resolution_x )); + } + else + resolution_x = FT_ABS( (FT_Short)prop->value.l ); + } + + prop = pcf_find_property( face, "RESOLUTION_Y" ); + if ( prop ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( prop->value.l < 0 ) + FT_TRACE0(( "pcf_load_font: negative Y resolution\n" )); +#endif + if ( FT_ABS( prop->value.l ) > 0x7FFF ) + { + resolution_y = 0x7FFF; + FT_TRACE0(( "pcf_load_font: clamping Y resolution to value %d\n", + resolution_y )); + } + else + resolution_y = FT_ABS( (FT_Short)prop->value.l ); + } + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = FT_MulDiv( bsize->y_ppem, resolution_y, 72 ); + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = FT_MulDiv( bsize->y_ppem, + resolution_x, + resolution_y ); + else + bsize->x_ppem = bsize->y_ppem; + } + + /* set up charset */ + { + PCF_Property charset_registry, charset_encoding; + + + charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); + charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); + + if ( charset_registry && charset_registry->isString && + charset_encoding && charset_encoding->isString ) + { + if ( FT_STRDUP( face->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( face->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + } + } + } + + Exit: + if ( error ) + { + /* This is done to respect the behaviour of the original */ + /* PCF font driver. */ + error = FT_THROW( Invalid_File_Format ); + } + + return error; + } + + +/* END */ diff --git a/external/freetype/src/pcf/pcfread.h b/external/freetype/src/pcf/pcfread.h new file mode 100644 index 000000000..a54648fbf --- /dev/null +++ b/external/freetype/src/pcf/pcfread.h @@ -0,0 +1,44 @@ +/* pcfread.h + + FreeType font driver for pcf fonts + + Copyright 2003 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef PCFREAD_H_ +#define PCFREAD_H_ + + + +FT_BEGIN_HEADER + + FT_LOCAL( PCF_Property ) + pcf_find_property( PCF_Face face, + const FT_String* prop ); + +FT_END_HEADER + +#endif /* PCFREAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/pcf/pcfutil.c b/external/freetype/src/pcf/pcfutil.c new file mode 100644 index 000000000..957572691 --- /dev/null +++ b/external/freetype/src/pcf/pcfutil.c @@ -0,0 +1,119 @@ +/* + +Copyright 1990, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ +/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */ + +/* + * Author: Keith Packard, MIT X Consortium + */ + +/* Modified for use with FreeType */ + + +#include "pcfutil.h" + + + /* + * Invert bit order within each BYTE of an array. + */ + + FT_LOCAL_DEF( void ) + BitOrderInvert( unsigned char* buf, + size_t nbytes ) + { + for ( ; nbytes > 0; nbytes--, buf++ ) + { + unsigned int val = *buf; + + + val = ( ( val >> 1 ) & 0x55 ) | ( ( val << 1 ) & 0xAA ); + val = ( ( val >> 2 ) & 0x33 ) | ( ( val << 2 ) & 0xCC ); + val = ( ( val >> 4 ) & 0x0F ) | ( ( val << 4 ) & 0xF0 ); + + *buf = (unsigned char)val; + } + } + + +#if defined( __clang__ ) || \ + ( defined( __GNUC__ ) && \ + ( __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 8 ) ) ) + +#define BSWAP16( x ) __builtin_bswap16( x ) +#define BSWAP32( x ) __builtin_bswap32( x ) + +#elif defined( _MSC_VER ) && _MSC_VER >= 1300 + +#pragma intrinsic( _byteswap_ushort ) +#pragma intrinsic( _byteswap_ulong ) + +#define BSWAP16( x ) _byteswap_ushort( x ) +#define BSWAP32( x ) _byteswap_ulong( x ) + +#else + +#define BSWAP16( x ) \ + (FT_UInt16)( ( ( ( x ) >> 8 ) & 0xff ) | \ + ( ( ( x ) & 0xff ) << 8 ) ) +#define BSWAP32( x ) \ + (FT_UInt32)( ( ( ( x ) & 0xff000000u ) >> 24 ) | \ + ( ( ( x ) & 0x00ff0000u ) >> 8 ) | \ + ( ( ( x ) & 0x0000ff00u ) << 8 ) | \ + ( ( ( x ) & 0x000000ffu ) << 24 ) ) + +#endif + + /* + * Invert byte order within each 16-bits of an array. + */ + + FT_LOCAL_DEF( void ) + TwoByteSwap( unsigned char* buf, + size_t nbytes ) + { + FT_UInt16* b = (FT_UInt16*)buf; + + + for ( ; nbytes >= 2; nbytes -= 2, b++ ) + *b = BSWAP16( *b ); + } + + /* + * Invert byte order within each 32-bits of an array. + */ + + FT_LOCAL_DEF( void ) + FourByteSwap( unsigned char* buf, + size_t nbytes ) + { + FT_UInt32* b = (FT_UInt32*)buf; + + + for ( ; nbytes >= 4; nbytes -= 4, b++ ) + *b = BSWAP32( *b ); + } + + +/* END */ diff --git a/external/freetype/src/pcf/pcfutil.h b/external/freetype/src/pcf/pcfutil.h new file mode 100644 index 000000000..a197c1559 --- /dev/null +++ b/external/freetype/src/pcf/pcfutil.h @@ -0,0 +1,55 @@ +/* pcfutil.h + + FreeType font driver for pcf fonts + + Copyright 2000, 2001, 2004 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef PCFUTIL_H_ +#define PCFUTIL_H_ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/compiler-macros.h> + +FT_BEGIN_HEADER + + FT_LOCAL( void ) + BitOrderInvert( unsigned char* buf, + size_t nbytes ); + + FT_LOCAL( void ) + TwoByteSwap( unsigned char* buf, + size_t nbytes ); + + FT_LOCAL( void ) + FourByteSwap( unsigned char* buf, + size_t nbytes ); + +FT_END_HEADER + +#endif /* PCFUTIL_H_ */ + + +/* END */ diff --git a/external/freetype/src/pcf/rules.mk b/external/freetype/src/pcf/rules.mk new file mode 100644 index 000000000..1b55daf4f --- /dev/null +++ b/external/freetype/src/pcf/rules.mk @@ -0,0 +1,82 @@ +# +# FreeType 2 pcf driver configuration rules +# + + +# Copyright (C) 2000, 2001, 2003, 2008 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# pcf driver directory +# +PCF_DIR := $(SRC_DIR)/pcf + + +PCF_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(PCF_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# pcf driver sources (i.e., C files) +# +PCF_DRV_SRC := $(PCF_DIR)/pcfdrivr.c \ + $(PCF_DIR)/pcfread.c \ + $(PCF_DIR)/pcfutil.c + +# pcf driver headers +# +PCF_DRV_H := $(PCF_DRV_SRC:%.c=%.h) \ + $(PCF_DIR)/pcf.h \ + $(PCF_DIR)/pcferror.h + +# pcf driver object(s) +# +# PCF_DRV_OBJ_M is used during `multi' builds +# PCF_DRV_OBJ_S is used during `single' builds +# +PCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O) +PCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O + +# pcf driver source file for single build +# +PCF_DRV_SRC_S := $(PCF_DIR)/pcf.c + + +# pcf driver - single object +# +$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S)) + + +# pcf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PCF_DRV_OBJ_S) +DRV_OBJS_M += $(PCF_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/pfr/module.mk b/external/freetype/src/pfr/module.mk new file mode 100644 index 000000000..388a38ed0 --- /dev/null +++ b/external/freetype/src/pfr/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PFR module definition +# + + +# Copyright (C) 2002-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PFR_DRIVER + +define PFR_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, pfr_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pfr $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/pfr/pfr.c b/external/freetype/src/pfr/pfr.c new file mode 100644 index 000000000..d3738152d --- /dev/null +++ b/external/freetype/src/pfr/pfr.c @@ -0,0 +1,29 @@ +/**************************************************************************** + * + * pfr.c + * + * FreeType PFR driver component. + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "pfrcmap.c" +#include "pfrdrivr.c" +#include "pfrgload.c" +#include "pfrload.c" +#include "pfrobjs.c" +#include "pfrsbit.c" + + +/* END */ diff --git a/external/freetype/src/pfr/pfrcmap.c b/external/freetype/src/pfr/pfrcmap.c new file mode 100644 index 000000000..08fe41d54 --- /dev/null +++ b/external/freetype/src/pfr/pfrcmap.c @@ -0,0 +1,188 @@ +/**************************************************************************** + * + * pfrcmap.c + * + * FreeType PFR cmap handling (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include "pfrcmap.h" +#include "pfrobjs.h" + +#include "pfrerror.h" + + + FT_CALLBACK_DEF( FT_Error ) + pfr_cmap_init( FT_CMap cmap, /* PFR_CMap */ + FT_Pointer pointer ) + { + PFR_CMap pfrcmap = (PFR_CMap)cmap; + FT_Error error = FT_Err_Ok; + PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); + + FT_UNUSED( pointer ); + + + pfrcmap->num_chars = face->phy_font.num_chars; + pfrcmap->chars = face->phy_font.chars; + + /* just for safety, check that the character entries are correctly */ + /* sorted in increasing character code order */ + { + FT_UInt n; + + + for ( n = 1; n < pfrcmap->num_chars; n++ ) + { + if ( pfrcmap->chars[n - 1].char_code >= pfrcmap->chars[n].char_code ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + pfr_cmap_done( FT_CMap cmap ) /* PFR_CMap */ + { + PFR_CMap pfrcmap = (PFR_CMap)cmap; + + + pfrcmap->chars = NULL; + pfrcmap->num_chars = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pfr_cmap_char_index( FT_CMap cmap, /* PFR_CMap */ + FT_UInt32 char_code ) + { + PFR_CMap pfrcmap = (PFR_CMap)cmap; + FT_UInt min = 0; + FT_UInt max = pfrcmap->num_chars; + FT_UInt mid = min + ( max - min ) / 2; + PFR_Char gchar; + + + while ( min < max ) + { + gchar = pfrcmap->chars + mid; + + if ( gchar->char_code == char_code ) + return mid + 1; + + if ( gchar->char_code < char_code ) + min = mid + 1; + else + max = mid; + + /* reasonable prediction in a continuous block */ + mid += char_code - gchar->char_code; + if ( mid >= max || mid < min ) + mid = min + ( max - min ) / 2; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pfr_cmap_char_next( FT_CMap cmap, /* PFR_CMap */ + FT_UInt32 *pchar_code ) + { + PFR_CMap pfrcmap = (PFR_CMap)cmap; + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + Restart: + { + FT_UInt min = 0; + FT_UInt max = pfrcmap->num_chars; + FT_UInt mid = min + ( max - min ) / 2; + PFR_Char gchar; + + + while ( min < max ) + { + gchar = pfrcmap->chars + mid; + + if ( gchar->char_code == char_code ) + { + result = mid; + if ( result != 0 ) + { + result++; + goto Exit; + } + + char_code++; + goto Restart; + } + + if ( gchar->char_code < char_code ) + min = mid + 1; + else + max = mid; + + /* reasonable prediction in a continuous block */ + mid += char_code - gchar->char_code; + if ( mid >= max || mid < min ) + mid = min + ( max - min ) / 2; + } + + /* we didn't find it, but we have a pair just above it */ + char_code = 0; + + if ( min < pfrcmap->num_chars ) + { + gchar = pfrcmap->chars + min; + result = min; + if ( result != 0 ) + { + result++; + char_code = gchar->char_code; + } + } + } + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + pfr_cmap_class_rec = + { + sizeof ( PFR_CMapRec ), + + (FT_CMap_InitFunc) pfr_cmap_init, /* init */ + (FT_CMap_DoneFunc) pfr_cmap_done, /* done */ + (FT_CMap_CharIndexFunc)pfr_cmap_char_index, /* char_index */ + (FT_CMap_CharNextFunc) pfr_cmap_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + +/* END */ diff --git a/external/freetype/src/pfr/pfrcmap.h b/external/freetype/src/pfr/pfrcmap.h new file mode 100644 index 000000000..8110f175e --- /dev/null +++ b/external/freetype/src/pfr/pfrcmap.h @@ -0,0 +1,45 @@ +/**************************************************************************** + * + * pfrcmap.h + * + * FreeType PFR cmap handling (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFRCMAP_H_ +#define PFRCMAP_H_ + +#include <freetype/internal/ftobjs.h> +#include "pfrtypes.h" + + +FT_BEGIN_HEADER + + typedef struct PFR_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt num_chars; + PFR_Char chars; + + } PFR_CMapRec, *PFR_CMap; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec pfr_cmap_class_rec; + +FT_END_HEADER + + +#endif /* PFRCMAP_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrdrivr.c b/external/freetype/src/pfr/pfrdrivr.c new file mode 100644 index 000000000..0048f5241 --- /dev/null +++ b/external/freetype/src/pfr/pfrdrivr.c @@ -0,0 +1,212 @@ +/**************************************************************************** + * + * pfrdrivr.c + * + * FreeType PFR driver interface (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/services/svpfr.h> +#include <freetype/internal/services/svfntfmt.h> +#include "pfrdrivr.h" +#include "pfrobjs.h" + +#include "pfrerror.h" + + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_kerning( FT_Face face, /* PFR_Face */ + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + PFR_Face pfrface = (PFR_Face)face; + PFR_PhyFont phys = &pfrface->phy_font; + + + (void)pfr_face_get_kerning( face, left, right, avector ); + + /* convert from metrics to outline units when necessary */ + if ( phys->outline_resolution != phys->metrics_resolution ) + { + if ( avector->x != 0 ) + avector->x = FT_MulDiv( avector->x, + (FT_Long)phys->outline_resolution, + (FT_Long)phys->metrics_resolution ); + + if ( avector->y != 0 ) + avector->y = FT_MulDiv( avector->y, + (FT_Long)phys->outline_resolution, + (FT_Long)phys->metrics_resolution ); + } + + return FT_Err_Ok; + } + + + /* + * PFR METRICS SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_advance( FT_Face face, /* PFR_Face */ + FT_UInt gindex, + FT_Pos *anadvance ) + { + PFR_Face pfrface = (PFR_Face)face; + FT_Error error = FT_ERR( Invalid_Argument ); + + + *anadvance = 0; + + if ( !gindex ) + goto Exit; + + gindex--; + + if ( pfrface ) + { + PFR_PhyFont phys = &pfrface->phy_font; + + + if ( gindex < phys->num_chars ) + { + *anadvance = phys->chars[gindex].advance; + error = FT_Err_Ok; + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_metrics( FT_Face face, /* PFR_Face */ + FT_UInt *anoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + PFR_Face pfrface = (PFR_Face)face; + PFR_PhyFont phys = &pfrface->phy_font; + FT_Fixed x_scale, y_scale; + FT_Size size = pfrface->root.size; + + + if ( anoutline_resolution ) + *anoutline_resolution = phys->outline_resolution; + + if ( ametrics_resolution ) + *ametrics_resolution = phys->metrics_resolution; + + x_scale = 0x10000L; + y_scale = 0x10000L; + + if ( size ) + { + x_scale = FT_DivFix( size->metrics.x_ppem << 6, + (FT_Long)phys->metrics_resolution ); + + y_scale = FT_DivFix( size->metrics.y_ppem << 6, + (FT_Long)phys->metrics_resolution ); + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + return FT_Err_Ok; + } + + + static + const FT_Service_PfrMetricsRec pfr_metrics_service_rec = + { + pfr_get_metrics, /* get_metrics */ + pfr_face_get_kerning, /* get_kerning */ + pfr_get_advance /* get_advance */ + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pfr_services[] = + { + { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec }, + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_PFR }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + pfr_get_service( FT_Module module, + const FT_String* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pfr_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec pfr_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE, + + sizeof ( FT_DriverRec ), + + "pfr", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + pfr_get_service /* FT_Module_Requester get_interface */ + }, + + sizeof ( PFR_FaceRec ), + sizeof ( PFR_SizeRec ), + sizeof ( PFR_SlotRec ), + + pfr_face_init, /* FT_Face_InitFunc init_face */ + pfr_face_done, /* FT_Face_DoneFunc done_face */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + pfr_slot_init, /* FT_Slot_InitFunc init_slot */ + pfr_slot_done, /* FT_Slot_DoneFunc done_slot */ + + pfr_slot_load, /* FT_Slot_LoadFunc load_glyph */ + + pfr_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ + + NULL, /* FT_Size_RequestFunc request_size */ + NULL, /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/pfr/pfrdrivr.h b/external/freetype/src/pfr/pfrdrivr.h new file mode 100644 index 000000000..da14468d4 --- /dev/null +++ b/external/freetype/src/pfr/pfrdrivr.h @@ -0,0 +1,36 @@ +/**************************************************************************** + * + * pfrdrivr.h + * + * High-level Type PFR driver interface (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFRDRIVR_H_ +#define PFRDRIVR_H_ + + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pfr_driver_class; + +FT_END_HEADER + + +#endif /* PFRDRIVR_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrerror.h b/external/freetype/src/pfr/pfrerror.h new file mode 100644 index 000000000..5dfb254d6 --- /dev/null +++ b/external/freetype/src/pfr/pfrerror.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * pfrerror.h + * + * PFR error codes (specification only). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the PFR error enumeration constants. + * + */ + +#ifndef PFRERROR_H_ +#define PFRERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PFR_Err_ +#define FT_ERR_BASE FT_Mod_Err_PFR + +#include <freetype/fterrors.h> + +#endif /* PFRERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrgload.c b/external/freetype/src/pfr/pfrgload.c new file mode 100644 index 000000000..48cf27ec8 --- /dev/null +++ b/external/freetype/src/pfr/pfrgload.c @@ -0,0 +1,849 @@ +/**************************************************************************** + * + * pfrgload.c + * + * FreeType PFR glyph loader (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "pfrgload.h" +#include "pfrsbit.h" +#include "pfrload.h" /* for macro definitions */ +#include <freetype/internal/ftdebug.h> + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR GLYPH BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + pfr_glyph_init( PFR_Glyph glyph, + FT_GlyphLoader loader ) + { + FT_ZERO( glyph ); + + glyph->loader = loader; + + FT_GlyphLoader_Rewind( loader ); + } + + + FT_LOCAL_DEF( void ) + pfr_glyph_done( PFR_Glyph glyph ) + { + FT_Memory memory = glyph->loader->memory; + + + FT_FREE( glyph->x_control ); + glyph->y_control = NULL; + + glyph->max_xy_control = 0; +#if 0 + glyph->num_x_control = 0; + glyph->num_y_control = 0; +#endif + + FT_FREE( glyph->subs ); + + glyph->max_subs = 0; + glyph->num_subs = 0; + + glyph->loader = NULL; + glyph->path_begun = 0; + } + + + /* close current contour, if any */ + static void + pfr_glyph_close_contour( PFR_Glyph glyph ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Int last, first; + + + if ( !glyph->path_begun ) + return; + + /* compute first and last point indices in current glyph outline */ + last = outline->n_points - 1; + first = 0; + if ( outline->n_contours > 0 ) + first = outline->contours[outline->n_contours - 1]; + + /* if the last point falls on the same location as the first one */ + /* we need to delete it */ + if ( last > first ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + last; + + + if ( p1->x == p2->x && p1->y == p2->y ) + { + outline->n_points--; + last--; + } + } + + /* don't add empty contours */ + if ( last >= first ) + outline->contours[outline->n_contours++] = (short)last; + + glyph->path_begun = 0; + } + + + /* reset glyph to start the loading of a new glyph */ + static void + pfr_glyph_start( PFR_Glyph glyph ) + { + glyph->path_begun = 0; + } + + + static FT_Error + pfr_glyph_line_to( PFR_Glyph glyph, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Error error; + + + /* check that we have begun a new path */ + if ( !glyph->path_begun ) + { + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); + goto Exit; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 0 ); + if ( !error ) + { + FT_Int n = outline->n_points; + + + outline->points[n] = *to; + outline->tags [n] = FT_CURVE_TAG_ON; + + outline->n_points++; + } + + Exit: + return error; + } + + + static FT_Error + pfr_glyph_curve_to( PFR_Glyph glyph, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Error error; + + + /* check that we have begun a new path */ + if ( !glyph->path_begun ) + { + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); + goto Exit; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 3, 0 ); + if ( !error ) + { + FT_Vector* vec = outline->points + outline->n_points; + FT_Byte* tag = (FT_Byte*)outline->tags + outline->n_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + tag[0] = FT_CURVE_TAG_CUBIC; + tag[1] = FT_CURVE_TAG_CUBIC; + tag[2] = FT_CURVE_TAG_ON; + + outline->n_points = (FT_Short)( outline->n_points + 3 ); + } + + Exit: + return error; + } + + + static FT_Error + pfr_glyph_move_to( PFR_Glyph glyph, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Error error; + + + /* close current contour if any */ + pfr_glyph_close_contour( glyph ); + + /* indicate that a new contour has started */ + glyph->path_begun = 1; + + /* check that there is space for a new contour and a new point */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 ); + if ( !error ) + { + /* add new start point */ + error = pfr_glyph_line_to( glyph, to ); + } + + return error; + } + + + static void + pfr_glyph_end( PFR_Glyph glyph ) + { + /* close current contour if any */ + pfr_glyph_close_contour( glyph ); + + /* merge the current glyph into the stack */ + FT_GlyphLoader_Add( glyph->loader ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR GLYPH LOADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* load a simple glyph */ + static FT_Error + pfr_glyph_load_simple( PFR_Glyph glyph, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = glyph->loader->memory; + FT_UInt flags, x_count, y_count, i, count, mask; + FT_Int x; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + /* test for composite glyphs */ + if ( flags & PFR_GLYPH_IS_COMPOUND ) + goto Failure; + + x_count = 0; + y_count = 0; + + if ( flags & PFR_GLYPH_1BYTE_XYCOUNT ) + { + PFR_CHECK( 1 ); + count = PFR_NEXT_BYTE( p ); + x_count = count & 15; + y_count = count >> 4; + } + else + { + if ( flags & PFR_GLYPH_XCOUNT ) + { + PFR_CHECK( 1 ); + x_count = PFR_NEXT_BYTE( p ); + } + + if ( flags & PFR_GLYPH_YCOUNT ) + { + PFR_CHECK( 1 ); + y_count = PFR_NEXT_BYTE( p ); + } + } + + count = x_count + y_count; + + /* re-allocate array when necessary */ + if ( count > glyph->max_xy_control ) + { + FT_UInt new_max = FT_PAD_CEIL( count, 8 ); + + + if ( FT_RENEW_ARRAY( glyph->x_control, + glyph->max_xy_control, + new_max ) ) + goto Exit; + + glyph->max_xy_control = new_max; + } + + glyph->y_control = glyph->x_control + x_count; + + mask = 0; + x = 0; + + for ( i = 0; i < count; i++ ) + { + if ( ( i & 7 ) == 0 ) + { + PFR_CHECK( 1 ); + mask = PFR_NEXT_BYTE( p ); + } + + if ( mask & 1 ) + { + PFR_CHECK( 2 ); + x = PFR_NEXT_SHORT( p ); + } + else + { + PFR_CHECK( 1 ); + x += PFR_NEXT_BYTE( p ); + } + + glyph->x_control[i] = x; + + mask >>= 1; + } + + /* XXX: we ignore the secondary stroke and edge definitions */ + /* since we don't support native PFR hinting */ + /* */ + if ( flags & PFR_GLYPH_SINGLE_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if ( error ) + goto Exit; + } + + pfr_glyph_start( glyph ); + + /* now load a simple glyph */ + { + FT_Vector pos[4]; + FT_Vector* cur; + + + pos[0].x = pos[0].y = 0; + pos[3] = pos[0]; + + for (;;) + { + FT_UInt format, format_low, args_format = 0, args_count, n; + + + /**************************************************************** + * read instruction + */ + PFR_CHECK( 1 ); + format = PFR_NEXT_BYTE( p ); + format_low = format & 15; + + switch ( format >> 4 ) + { + case 0: /* end glyph */ + FT_TRACE6(( "- end glyph" )); + args_count = 0; + break; + + case 1: /* general line operation */ + FT_TRACE6(( "- general line" )); + goto Line1; + + case 4: /* move to inside contour */ + FT_TRACE6(( "- move to inside" )); + goto Line1; + + case 5: /* move to outside contour */ + FT_TRACE6(( "- move to outside" )); + Line1: + args_format = format_low; + args_count = 1; + break; + + case 2: /* horizontal line to */ + FT_TRACE6(( "- horizontal line to cx.%d", format_low )); + if ( format_low >= x_count ) + goto Failure; + pos[0].x = glyph->x_control[format_low]; + pos[0].y = pos[3].y; + pos[3] = pos[0]; + args_count = 0; + break; + + case 3: /* vertical line to */ + FT_TRACE6(( "- vertical line to cy.%d", format_low )); + if ( format_low >= y_count ) + goto Failure; + pos[0].x = pos[3].x; + pos[0].y = glyph->y_control[format_low]; + pos[3] = pos[0]; + args_count = 0; + break; + + case 6: /* horizontal to vertical curve */ + FT_TRACE6(( "- hv curve" )); + args_format = 0xB8E; + args_count = 3; + break; + + case 7: /* vertical to horizontal curve */ + FT_TRACE6(( "- vh curve" )); + args_format = 0xE2B; + args_count = 3; + break; + + default: /* general curve to */ + FT_TRACE6(( "- general curve" )); + args_count = 4; + args_format = format_low; + } + + /************************************************************ + * now read arguments + */ + cur = pos; + for ( n = 0; n < args_count; n++ ) + { + FT_UInt idx; + FT_Int delta; + + + /* read the X argument */ + switch ( args_format & 3 ) + { + case 0: /* 8-bit index */ + PFR_CHECK( 1 ); + idx = PFR_NEXT_BYTE( p ); + if ( idx >= x_count ) + goto Failure; + cur->x = glyph->x_control[idx]; + FT_TRACE7(( " cx#%d", idx )); + break; + + case 1: /* 16-bit absolute value */ + PFR_CHECK( 2 ); + cur->x = PFR_NEXT_SHORT( p ); + FT_TRACE7(( " x.%ld", cur->x )); + break; + + case 2: /* 8-bit delta */ + PFR_CHECK( 1 ); + delta = PFR_NEXT_INT8( p ); + cur->x = pos[3].x + delta; + FT_TRACE7(( " dx.%d", delta )); + break; + + default: + FT_TRACE7(( " |" )); + cur->x = pos[3].x; + } + + /* read the Y argument */ + switch ( ( args_format >> 2 ) & 3 ) + { + case 0: /* 8-bit index */ + PFR_CHECK( 1 ); + idx = PFR_NEXT_BYTE( p ); + if ( idx >= y_count ) + goto Failure; + cur->y = glyph->y_control[idx]; + FT_TRACE7(( " cy#%d", idx )); + break; + + case 1: /* 16-bit absolute value */ + PFR_CHECK( 2 ); + cur->y = PFR_NEXT_SHORT( p ); + FT_TRACE7(( " y.%ld", cur->y )); + break; + + case 2: /* 8-bit delta */ + PFR_CHECK( 1 ); + delta = PFR_NEXT_INT8( p ); + cur->y = pos[3].y + delta; + FT_TRACE7(( " dy.%d", delta )); + break; + + default: + FT_TRACE7(( " -" )); + cur->y = pos[3].y; + } + + /* read the additional format flag for the general curve */ + if ( n == 0 && args_count == 4 ) + { + PFR_CHECK( 1 ); + args_format = PFR_NEXT_BYTE( p ); + args_count--; + } + else + args_format >>= 4; + + /* save the previous point */ + pos[3] = cur[0]; + cur++; + } + + FT_TRACE7(( "\n" )); + + /************************************************************ + * finally, execute instruction + */ + switch ( format >> 4 ) + { + case 0: /* end glyph => EXIT */ + pfr_glyph_end( glyph ); + goto Exit; + + case 1: /* line operations */ + case 2: + case 3: + error = pfr_glyph_line_to( glyph, pos ); + goto Test_Error; + + case 4: /* move to inside contour */ + case 5: /* move to outside contour */ + error = pfr_glyph_move_to( glyph, pos ); + goto Test_Error; + + default: /* curve operations */ + error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 ); + + Test_Error: /* test error condition */ + if ( error ) + goto Exit; + } + } /* for (;;) */ + } + + Exit: + return error; + + Failure: + Too_Short: + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_glyph_load_simple: invalid glyph data\n" )); + goto Exit; + } + + + /* load a composite/compound glyph */ + static FT_Error + pfr_glyph_load_compound( PFR_Glyph glyph, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = glyph->loader->memory; + PFR_SubGlyph subglyph; + FT_UInt flags, i, count, org_count; + FT_Int x_pos, y_pos; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + /* test for composite glyphs */ + if ( !( flags & PFR_GLYPH_IS_COMPOUND ) ) + goto Failure; + + count = flags & 0x3F; + + /* ignore extra items when present */ + /* */ + if ( flags & PFR_GLYPH_COMPOUND_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if ( error ) + goto Exit; + } + + /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because */ + /* the PFR format is dumb, using direct file offsets to point to the */ + /* sub-glyphs (instead of glyph indices). Sigh. */ + /* */ + /* For now, we load the list of sub-glyphs into a different array */ + /* but this will prevent us from using the auto-hinter at its best */ + /* quality. */ + /* */ + org_count = glyph->num_subs; + + if ( org_count + count > glyph->max_subs ) + { + FT_UInt new_max = ( org_count + count + 3 ) & (FT_UInt)-4; + + + /* we arbitrarily limit the number of subglyphs */ + /* to avoid endless recursion */ + if ( new_max > 64 ) + { + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_glyph_load_compound:" + " too many compound glyphs components\n" )); + goto Exit; + } + + if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) ) + goto Exit; + + glyph->max_subs = new_max; + } + + subglyph = glyph->subs + org_count; + + for ( i = 0; i < count; i++, subglyph++ ) + { + FT_UInt format; + + + x_pos = 0; + y_pos = 0; + + PFR_CHECK( 1 ); + format = PFR_NEXT_BYTE( p ); + + /* read scale when available */ + subglyph->x_scale = 0x10000L; + if ( format & PFR_SUBGLYPH_XSCALE ) + { + PFR_CHECK( 2 ); + subglyph->x_scale = PFR_NEXT_SHORT( p ) * 16; + } + + subglyph->y_scale = 0x10000L; + if ( format & PFR_SUBGLYPH_YSCALE ) + { + PFR_CHECK( 2 ); + subglyph->y_scale = PFR_NEXT_SHORT( p ) * 16; + } + + /* read offset */ + switch ( format & 3 ) + { + case 1: + PFR_CHECK( 2 ); + x_pos = PFR_NEXT_SHORT( p ); + break; + + case 2: + PFR_CHECK( 1 ); + x_pos += PFR_NEXT_INT8( p ); + break; + + default: + ; + } + + switch ( ( format >> 2 ) & 3 ) + { + case 1: + PFR_CHECK( 2 ); + y_pos = PFR_NEXT_SHORT( p ); + break; + + case 2: + PFR_CHECK( 1 ); + y_pos += PFR_NEXT_INT8( p ); + break; + + default: + ; + } + + subglyph->x_delta = x_pos; + subglyph->y_delta = y_pos; + + /* read glyph position and size now */ + if ( format & PFR_SUBGLYPH_2BYTE_SIZE ) + { + PFR_CHECK( 2 ); + subglyph->gps_size = PFR_NEXT_USHORT( p ); + } + else + { + PFR_CHECK( 1 ); + subglyph->gps_size = PFR_NEXT_BYTE( p ); + } + + if ( format & PFR_SUBGLYPH_3BYTE_OFFSET ) + { + PFR_CHECK( 3 ); + subglyph->gps_offset = PFR_NEXT_ULONG( p ); + } + else + { + PFR_CHECK( 2 ); + subglyph->gps_offset = PFR_NEXT_USHORT( p ); + } + + glyph->num_subs++; + } + + Exit: + return error; + + Failure: + Too_Short: + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_glyph_load_compound: invalid glyph data\n" )); + goto Exit; + } + + + static FT_Error + pfr_glyph_load_rec( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ) + { + FT_Error error; + FT_Byte* p; + FT_Byte* limit; + + + if ( FT_STREAM_SEEK( gps_offset + offset ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + limit = p + size; + + if ( size > 0 && *p & PFR_GLYPH_IS_COMPOUND ) + { + FT_UInt n, old_count, count; + FT_GlyphLoader loader = glyph->loader; + FT_Outline* base = &loader->base.outline; + + + old_count = glyph->num_subs; + + /* this is a compound glyph - load it */ + error = pfr_glyph_load_compound( glyph, p, limit ); + + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + count = glyph->num_subs - old_count; + + FT_TRACE4(( "compound glyph with %d element%s (offset %lu):\n", + count, + count == 1 ? "" : "s", + offset )); + + /* now, load each individual glyph */ + for ( n = 0; n < count; n++ ) + { + FT_Int i, old_points, num_points; + PFR_SubGlyph subglyph; + + + FT_TRACE4(( " subglyph %d:\n", n )); + + subglyph = glyph->subs + old_count + n; + old_points = base->n_points; + + error = pfr_glyph_load_rec( glyph, stream, gps_offset, + subglyph->gps_offset, + subglyph->gps_size ); + if ( error ) + break; + + /* note that `glyph->subs' might have been re-allocated */ + subglyph = glyph->subs + old_count + n; + num_points = base->n_points - old_points; + + /* translate and eventually scale the new glyph points */ + if ( subglyph->x_scale != 0x10000L || subglyph->y_scale != 0x10000L ) + { + FT_Vector* vec = base->points + old_points; + + + for ( i = 0; i < num_points; i++, vec++ ) + { + vec->x = FT_MulFix( vec->x, subglyph->x_scale ) + + subglyph->x_delta; + vec->y = FT_MulFix( vec->y, subglyph->y_scale ) + + subglyph->y_delta; + } + } + else + { + FT_Vector* vec = loader->base.outline.points + old_points; + + + for ( i = 0; i < num_points; i++, vec++ ) + { + vec->x += subglyph->x_delta; + vec->y += subglyph->y_delta; + } + } + + /* proceed to next sub-glyph */ + } + + FT_TRACE4(( "end compound glyph with %d element%s\n", + count, + count == 1 ? "" : "s" )); + } + else + { + FT_TRACE4(( "simple glyph (offset %lu)\n", offset )); + + /* load a simple glyph */ + error = pfr_glyph_load_simple( glyph, p, limit ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_glyph_load( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ) + { + /* initialize glyph loader */ + FT_GlyphLoader_Rewind( glyph->loader ); + + glyph->num_subs = 0; + + /* load the glyph, recursively when needed */ + return pfr_glyph_load_rec( glyph, stream, gps_offset, offset, size ); + } + + +/* END */ diff --git a/external/freetype/src/pfr/pfrgload.h b/external/freetype/src/pfr/pfrgload.h new file mode 100644 index 000000000..92a59bc5d --- /dev/null +++ b/external/freetype/src/pfr/pfrgload.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * + * pfrgload.h + * + * FreeType PFR glyph loader (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFRGLOAD_H_ +#define PFRGLOAD_H_ + +#include "pfrtypes.h" + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + pfr_glyph_init( PFR_Glyph glyph, + FT_GlyphLoader loader ); + + FT_LOCAL( void ) + pfr_glyph_done( PFR_Glyph glyph ); + + + FT_LOCAL( FT_Error ) + pfr_glyph_load( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ); + + +FT_END_HEADER + + +#endif /* PFRGLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrload.c b/external/freetype/src/pfr/pfrload.c new file mode 100644 index 000000000..856a5942f --- /dev/null +++ b/external/freetype/src/pfr/pfrload.c @@ -0,0 +1,1062 @@ +/**************************************************************************** + * + * pfrload.c + * + * FreeType PFR loader (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "pfrload.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT pfr + + + /* + * The overall structure of a PFR file is as follows. + * + * PFR header + * 58 bytes (contains nPhysFonts) + * + * Logical font directory (size at most 2^16 bytes) + * 2 bytes (nLogFonts) + * + nLogFonts * 5 bytes + * + * ==> nLogFonts <= 13106 + * + * Logical font section (size at most 2^24 bytes) + * nLogFonts * logFontRecord + * + * logFontRecord (size at most 2^16 bytes) + * 12 bytes (fontMatrix) + * + 1 byte (flags) + * + 0-5 bytes (depending on `flags') + * + 0-(1+255*(2+255)) = 0-65536 (depending on `flags') + * + 5 bytes (physical font info) + * + 0-1 bytes (depending on PFR header) + * + * ==> minimum size 18 bytes + * + * Physical font section (size at most 2^24 bytes) + * nPhysFonts * (physFontRecord + * + nBitmapSizes * nBmapChars * bmapCharRecord) + * + * physFontRecord (size at most 2^24 bytes) + * 14 bytes (font info) + * + 1 byte (flags) + * + 0-2 (depending on `flags') + * + 0-? (structure too complicated to be shown here; depending on + * `flags'; contains `nBitmapSizes' and `nBmapChars') + * + 3 bytes (nAuxBytes) + * + nAuxBytes + * + 1 byte (nBlueValues) + * + 2 * nBlueValues + * + 6 bytes (hinting data) + * + 2 bytes (nCharacters) + * + nCharacters * (4-10 bytes) (depending on `flags') + * + * ==> minimum size 27 bytes + * + * bmapCharRecord + * 4-7 bytes + * + * Glyph program strings (three possible types: simpleGps, compoundGps, + * and bitmapGps; size at most 2^24 bytes) + * simpleGps (size at most 2^16 bytes) + * 1 byte (flags) + * 1-2 bytes (n[XY]orus, depending on `flags') + * 0-(64+512*2) = 0-1088 bytes (depending on `n[XY]orus') + * 0-? (structure too complicated to be shown here; depending on + * `flags') + * 1-? glyph data (faintly resembling PS Type 1 charstrings) + * + * ==> minimum size 3 bytes + * + * compoundGps (size at most 2^16 bytes) + * 1 byte (nElements <= 63, flags) + * + 0-(1+255*(2+255)) = 0-65536 (depending on `flags') + * + nElements * (6-14 bytes) + * + * bitmapGps (size at most 2^16 bytes) + * 1 byte (flags) + * 3-13 bytes (position info, depending on `flags') + * 0-? bitmap data + * + * ==> minimum size 4 bytes + * + * PFR trailer + * 8 bytes + * + * + * ==> minimum size of a valid PFR: + * 58 (header) + * + 2 (nLogFonts) + * + 27 (1 physFontRecord) + * + 8 (trailer) + * ----- + * 95 bytes + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** EXTRA ITEMS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + pfr_extra_items_skip( FT_Byte* *pp, + FT_Byte* limit ) + { + return pfr_extra_items_parse( pp, limit, NULL, NULL ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_extra_items_parse( FT_Byte* *pp, + FT_Byte* limit, + PFR_ExtraItem item_list, + FT_Pointer item_data ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* p = *pp; + FT_UInt num_items, item_type, item_size; + + + PFR_CHECK( 1 ); + num_items = PFR_NEXT_BYTE( p ); + + for ( ; num_items > 0; num_items-- ) + { + PFR_CHECK( 2 ); + item_size = PFR_NEXT_BYTE( p ); + item_type = PFR_NEXT_BYTE( p ); + + PFR_CHECK( item_size ); + + if ( item_list ) + { + PFR_ExtraItem extra = item_list; + + + for ( extra = item_list; extra->parser != NULL; extra++ ) + { + if ( extra->type == item_type ) + { + error = extra->parser( p, p + item_size, item_data ); + if ( error ) + goto Exit; + + break; + } + } + } + + p += item_size; + } + + Exit: + *pp = p; + return error; + + Too_Short: + FT_ERROR(( "pfr_extra_items_parse: invalid extra items table\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR HEADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static const FT_Frame_Field pfr_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PFR_HeaderRec + + FT_FRAME_START( 58 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_USHORT( version ), + FT_FRAME_USHORT( signature2 ), + FT_FRAME_USHORT( header_size ), + + FT_FRAME_USHORT( log_dir_size ), + FT_FRAME_USHORT( log_dir_offset ), + + FT_FRAME_USHORT( log_font_max_size ), + FT_FRAME_UOFF3 ( log_font_section_size ), + FT_FRAME_UOFF3 ( log_font_section_offset ), + + FT_FRAME_USHORT( phy_font_max_size ), + FT_FRAME_UOFF3 ( phy_font_section_size ), + FT_FRAME_UOFF3 ( phy_font_section_offset ), + + FT_FRAME_USHORT( gps_max_size ), + FT_FRAME_UOFF3 ( gps_section_size ), + FT_FRAME_UOFF3 ( gps_section_offset ), + + FT_FRAME_BYTE ( max_blue_values ), + FT_FRAME_BYTE ( max_x_orus ), + FT_FRAME_BYTE ( max_y_orus ), + + FT_FRAME_BYTE ( phy_font_max_size_high ), + FT_FRAME_BYTE ( color_flags ), + + FT_FRAME_UOFF3 ( bct_max_size ), + FT_FRAME_UOFF3 ( bct_set_max_size ), + FT_FRAME_UOFF3 ( phy_bct_set_max_size ), + + FT_FRAME_USHORT( num_phy_fonts ), + FT_FRAME_BYTE ( max_vert_stem_snap ), + FT_FRAME_BYTE ( max_horz_stem_snap ), + FT_FRAME_USHORT( max_chars ), + FT_FRAME_END + }; + + + FT_LOCAL_DEF( FT_Error ) + pfr_header_load( PFR_Header header, + FT_Stream stream ) + { + FT_Error error; + + + /* read header directly */ + if ( !FT_STREAM_SEEK( 0 ) && + !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) ) + { + /* make a few adjustments to the header */ + header->phy_font_max_size += + (FT_UInt32)header->phy_font_max_size_high << 16; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + pfr_header_check( PFR_Header header ) + { + FT_Bool result = 1; + + + /* check signature and header size */ + if ( header->signature != 0x50465230L || /* "PFR0" */ + header->version > 4 || + header->header_size < 58 || + header->signature2 != 0x0D0A ) /* CR/LF */ + result = 0; + + return result; + } + + + /***********************************************************************/ + /***********************************************************************/ + /***** *****/ + /***** PFR LOGICAL FONTS *****/ + /***** *****/ + /***********************************************************************/ + /***********************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + pfr_log_font_count( FT_Stream stream, + FT_UInt32 section_offset, + FT_Long *acount ) + { + FT_Error error; + FT_UInt count; + FT_UInt result = 0; + + + if ( FT_STREAM_SEEK( section_offset ) || + FT_READ_USHORT( count ) ) + goto Exit; + + /* check maximum value and a rough minimum size: */ + /* - no more than 13106 log fonts */ + /* - we need 5 bytes for a log header record */ + /* - we need at least 18 bytes for a log font record */ + /* - the overall size is at least 95 bytes plus the */ + /* log header and log font records */ + if ( count > ( ( 1 << 16 ) - 2 ) / 5 || + 2 + count * 5 >= stream->size - section_offset || + 95 + count * ( 5 + 18 ) >= stream->size ) + { + FT_ERROR(( "pfr_log_font_count:" + " invalid number of logical fonts\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + result = count; + + Exit: + *acount = (FT_Long)result; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_log_font_load( PFR_LogFont log_font, + FT_Stream stream, + FT_UInt idx, + FT_UInt32 section_offset, + FT_Bool size_increment ) + { + FT_UInt num_log_fonts; + FT_UInt flags; + FT_UInt32 offset; + FT_UInt32 size; + FT_Error error; + + + if ( FT_STREAM_SEEK( section_offset ) || + FT_READ_USHORT( num_log_fonts ) ) + goto Exit; + + if ( idx >= num_log_fonts ) + return FT_THROW( Invalid_Argument ); + + if ( FT_STREAM_SKIP( idx * 5 ) || + FT_READ_USHORT( size ) || + FT_READ_UOFF3 ( offset ) ) + goto Exit; + + /* save logical font size and offset */ + log_font->size = size; + log_font->offset = offset; + + /* now, check the rest of the table before loading it */ + { + FT_Byte* p; + FT_Byte* limit; + FT_UInt local; + + + if ( FT_STREAM_SEEK( offset ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK( 13 ); + + log_font->matrix[0] = PFR_NEXT_LONG( p ); + log_font->matrix[1] = PFR_NEXT_LONG( p ); + log_font->matrix[2] = PFR_NEXT_LONG( p ); + log_font->matrix[3] = PFR_NEXT_LONG( p ); + + flags = PFR_NEXT_BYTE( p ); + + local = 0; + if ( flags & PFR_LOG_STROKE ) + { + local++; + if ( flags & PFR_LOG_2BYTE_STROKE ) + local++; + + if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER ) + local += 3; + } + if ( flags & PFR_LOG_BOLD ) + { + local++; + if ( flags & PFR_LOG_2BYTE_BOLD ) + local++; + } + + PFR_CHECK( local ); + + if ( flags & PFR_LOG_STROKE ) + { + log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE ) + ? PFR_NEXT_SHORT( p ) + : PFR_NEXT_BYTE( p ); + + if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER ) + log_font->miter_limit = PFR_NEXT_LONG( p ); + } + + if ( flags & PFR_LOG_BOLD ) + log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD ) + ? PFR_NEXT_SHORT( p ) + : PFR_NEXT_BYTE( p ); + + if ( flags & PFR_LOG_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if ( error ) + goto Fail; + } + + PFR_CHECK( 5 ); + log_font->phys_size = PFR_NEXT_USHORT( p ); + log_font->phys_offset = PFR_NEXT_ULONG( p ); + if ( size_increment ) + { + PFR_CHECK( 1 ); + log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16; + } + } + + Fail: + FT_FRAME_EXIT(); + + Exit: + return error; + + Too_Short: + FT_ERROR(( "pfr_log_font_load: invalid logical font table\n" )); + error = FT_THROW( Invalid_Table ); + goto Fail; + } + + + /***********************************************************************/ + /***********************************************************************/ + /***** *****/ + /***** PFR PHYSICAL FONTS *****/ + /***** *****/ + /***********************************************************************/ + /***********************************************************************/ + + + /* load bitmap strikes lists */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_bitmap_info( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) + { + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + FT_Memory memory = phy_font->memory; + PFR_Strike strike; + FT_UInt flags0; + FT_UInt n, count, size1; + FT_Error error = FT_Err_Ok; + + + PFR_CHECK( 5 ); + + p += 3; /* skip bctSize */ + flags0 = PFR_NEXT_BYTE( p ); + count = PFR_NEXT_BYTE( p ); + + /* re-allocate when needed */ + if ( phy_font->num_strikes + count > phy_font->max_strikes ) + { + FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); + + + if ( FT_RENEW_ARRAY( phy_font->strikes, + phy_font->num_strikes, + new_max ) ) + goto Exit; + + phy_font->max_strikes = new_max; + } + + size1 = 1 + 1 + 1 + 2 + 2 + 1; + if ( flags0 & PFR_STRIKE_2BYTE_XPPM ) + size1++; + + if ( flags0 & PFR_STRIKE_2BYTE_YPPM ) + size1++; + + if ( flags0 & PFR_STRIKE_3BYTE_SIZE ) + size1++; + + if ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) + size1++; + + if ( flags0 & PFR_STRIKE_2BYTE_COUNT ) + size1++; + + strike = phy_font->strikes + phy_font->num_strikes; + + PFR_CHECK( count * size1 ); + + for ( n = 0; n < count; n++, strike++ ) + { + strike->x_ppm = ( flags0 & PFR_STRIKE_2BYTE_XPPM ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + strike->y_ppm = ( flags0 & PFR_STRIKE_2BYTE_YPPM ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + strike->flags = PFR_NEXT_BYTE( p ); + + strike->bct_size = ( flags0 & PFR_STRIKE_3BYTE_SIZE ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + + strike->bct_offset = ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + + strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + } + + phy_font->num_strikes += count; + + Exit: + return error; + + Too_Short: + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_extra_item_load_bitmap_info:" + " invalid bitmap info table\n" )); + goto Exit; + } + + + /* Load font ID. This is a so-called `unique' name that is rather + * long and descriptive (like `Tiresias ScreenFont v7.51'). + * + * Note that a PFR font's family name is contained in an *undocumented* + * string of the `auxiliary data' portion of a physical font record. This + * may also contain the `real' style name! + * + * If no family name is present, the font ID is used instead for the + * family. + */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_font_id( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) + { + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + FT_Error error = FT_Err_Ok; + FT_Memory memory = phy_font->memory; + FT_UInt len = (FT_UInt)( limit - p ); + + + if ( phy_font->font_id ) + goto Exit; + + if ( FT_QALLOC( phy_font->font_id, len + 1 ) ) + goto Exit; + + /* copy font ID name, and terminate it for safety */ + FT_MEM_COPY( phy_font->font_id, p, len ); + phy_font->font_id[len] = 0; + + Exit: + return error; + } + + + /* load stem snap tables */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_stem_snaps( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) + { + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + FT_UInt count, num_vert, num_horz; + FT_Int* snaps = NULL; + FT_Error error = FT_Err_Ok; + FT_Memory memory = phy_font->memory; + + + if ( phy_font->vertical.stem_snaps ) + goto Exit; + + PFR_CHECK( 1 ); + count = PFR_NEXT_BYTE( p ); + + num_vert = count & 15; + num_horz = count >> 4; + count = num_vert + num_horz; + + PFR_CHECK( count * 2 ); + + if ( FT_QNEW_ARRAY( snaps, count ) ) + goto Exit; + + phy_font->vertical.stem_snaps = snaps; + phy_font->horizontal.stem_snaps = snaps + num_vert; + + for ( ; count > 0; count--, snaps++ ) + *snaps = FT_NEXT_SHORT( p ); + + Exit: + return error; + + Too_Short: + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_extra_item_load_stem_snaps:" + " invalid stem snaps table\n" )); + goto Exit; + } + + + /* load kerning pair data */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_kerning_pairs( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) + { + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + PFR_KernItem item = NULL; + FT_Error error = FT_Err_Ok; + FT_Memory memory = phy_font->memory; + + + if ( FT_NEW( item ) ) + goto Exit; + + PFR_CHECK( 4 ); + + item->pair_count = PFR_NEXT_BYTE( p ); + item->base_adj = PFR_NEXT_SHORT( p ); + item->flags = PFR_NEXT_BYTE( p ); + item->offset = phy_font->offset + + (FT_Offset)( p - phy_font->cursor ); + +#ifndef PFR_CONFIG_NO_CHECKS + item->pair_size = 3; + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + item->pair_size += 2; + + if ( item->flags & PFR_KERN_2BYTE_ADJ ) + item->pair_size += 1; + + PFR_CHECK( item->pair_count * item->pair_size ); +#endif + + /* load first and last pairs into the item to speed up */ + /* lookup later... */ + if ( item->pair_count > 0 ) + { + FT_UInt char1, char2; + FT_Byte* q; + + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + { + q = p; + char1 = PFR_NEXT_USHORT( q ); + char2 = PFR_NEXT_USHORT( q ); + + item->pair1 = PFR_KERN_INDEX( char1, char2 ); + + q = p + item->pair_size * ( item->pair_count - 1 ); + char1 = PFR_NEXT_USHORT( q ); + char2 = PFR_NEXT_USHORT( q ); + + item->pair2 = PFR_KERN_INDEX( char1, char2 ); + } + else + { + q = p; + char1 = PFR_NEXT_BYTE( q ); + char2 = PFR_NEXT_BYTE( q ); + + item->pair1 = PFR_KERN_INDEX( char1, char2 ); + + q = p + item->pair_size * ( item->pair_count - 1 ); + char1 = PFR_NEXT_BYTE( q ); + char2 = PFR_NEXT_BYTE( q ); + + item->pair2 = PFR_KERN_INDEX( char1, char2 ); + } + + /* add new item to the current list */ + item->next = NULL; + *phy_font->kern_items_tail = item; + phy_font->kern_items_tail = &item->next; + phy_font->num_kern_pairs += item->pair_count; + } + else + { + /* empty item! */ + FT_FREE( item ); + } + + Exit: + return error; + + Too_Short: + FT_FREE( item ); + + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_extra_item_load_kerning_pairs:" + " invalid kerning pairs table\n" )); + goto Exit; + } + + + static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = + { + { 1, pfr_extra_item_load_bitmap_info }, + { 2, pfr_extra_item_load_font_id }, + { 3, pfr_extra_item_load_stem_snaps }, + { 4, pfr_extra_item_load_kerning_pairs }, + { 0, NULL } + }; + + + /* + * Load a name from the auxiliary data. Since this extracts undocumented + * strings from the font file, we need to be careful here. + */ + static FT_Error + pfr_aux_name_load( FT_Byte* p, + FT_UInt len, + FT_Memory memory, + FT_String* *astring ) + { + FT_Error error = FT_Err_Ok; + FT_String* result = NULL; + FT_UInt n, ok; + + + if ( *astring ) + FT_FREE( *astring ); + + if ( len > 0 && p[len - 1] == 0 ) + len--; + + /* check that each character is ASCII */ + /* for making sure not to load garbage */ + ok = ( len > 0 ); + for ( n = 0; n < len; n++ ) + if ( p[n] < 32 || p[n] > 127 ) + { + ok = 0; + break; + } + + if ( ok ) + { + if ( FT_QALLOC( result, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( result, p, len ); + result[len] = 0; + } + + Exit: + *astring = result; + return error; + } + + + FT_LOCAL_DEF( void ) + pfr_phy_font_done( PFR_PhyFont phy_font, + FT_Memory memory ) + { + FT_FREE( phy_font->font_id ); + FT_FREE( phy_font->family_name ); + FT_FREE( phy_font->style_name ); + + FT_FREE( phy_font->vertical.stem_snaps ); + phy_font->vertical.num_stem_snaps = 0; + + phy_font->horizontal.stem_snaps = NULL; + phy_font->horizontal.num_stem_snaps = 0; + + FT_FREE( phy_font->strikes ); + phy_font->num_strikes = 0; + phy_font->max_strikes = 0; + + FT_FREE( phy_font->chars ); + phy_font->num_chars = 0; + phy_font->chars_offset = 0; + + FT_FREE( phy_font->blue_values ); + phy_font->num_blue_values = 0; + + { + PFR_KernItem item, next; + + + item = phy_font->kern_items; + while ( item ) + { + next = item->next; + FT_FREE( item ); + item = next; + } + phy_font->kern_items = NULL; + phy_font->kern_items_tail = NULL; + } + + phy_font->num_kern_pairs = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_phy_font_load( PFR_PhyFont phy_font, + FT_Stream stream, + FT_UInt32 offset, + FT_UInt32 size ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt flags; + FT_ULong num_aux; + FT_Byte* p; + FT_Byte* limit; + + + phy_font->memory = memory; + phy_font->offset = offset; + + phy_font->kern_items = NULL; + phy_font->kern_items_tail = &phy_font->kern_items; + + if ( FT_STREAM_SEEK( offset ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + phy_font->cursor = stream->cursor; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK( 15 ); + phy_font->font_ref_number = PFR_NEXT_USHORT( p ); + phy_font->outline_resolution = PFR_NEXT_USHORT( p ); + phy_font->metrics_resolution = PFR_NEXT_USHORT( p ); + phy_font->bbox.xMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.xMax = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMax = PFR_NEXT_SHORT( p ); + phy_font->flags = flags = PFR_NEXT_BYTE( p ); + + if ( !phy_font->outline_resolution || + !phy_font->metrics_resolution ) + { + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_phy_font_load: invalid resolution\n" )); + goto Fail; + } + + /* get the standard advance for non-proportional fonts */ + if ( !( flags & PFR_PHY_PROPORTIONAL ) ) + { + PFR_CHECK( 2 ); + phy_font->standard_advance = PFR_NEXT_SHORT( p ); + } + + /* load the extra items when present */ + if ( flags & PFR_PHY_EXTRA_ITEMS ) + { + error = pfr_extra_items_parse( &p, limit, + pfr_phy_font_extra_items, phy_font ); + if ( error ) + goto Fail; + } + + /* In certain fonts, the auxiliary bytes contain interesting */ + /* information. These are not in the specification but can be */ + /* guessed by looking at the content of a few 'PFR0' fonts. */ + PFR_CHECK( 3 ); + num_aux = PFR_NEXT_ULONG( p ); + + if ( num_aux > 0 ) + { + FT_Byte* q = p; + FT_Byte* q2; + + + PFR_CHECK_SIZE( num_aux ); + p += num_aux; + + while ( num_aux > 0 ) + { + FT_UInt length, type; + + + if ( q + 4 > p ) + break; + + length = PFR_NEXT_USHORT( q ); + if ( length < 4 || length > num_aux ) + break; + + q2 = q + length - 2; + type = PFR_NEXT_USHORT( q ); + + switch ( type ) + { + case 1: + /* this seems to correspond to the font's family name, padded to */ + /* an even number of bytes with a zero byte appended if needed */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->family_name ); + if ( error ) + goto Exit; + break; + + case 2: + if ( q + 32 > q2 ) + break; + + q += 10; + phy_font->ascent = PFR_NEXT_SHORT( q ); + phy_font->descent = PFR_NEXT_SHORT( q ); + phy_font->leading = PFR_NEXT_SHORT( q ); + break; + + case 3: + /* this seems to correspond to the font's style name, padded to */ + /* an even number of bytes with a zero byte appended if needed */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->style_name ); + if ( error ) + goto Exit; + break; + + default: + ; + } + + q = q2; + num_aux -= length; + } + } + + /* read the blue values */ + { + FT_UInt n, count; + + + PFR_CHECK( 1 ); + phy_font->num_blue_values = count = PFR_NEXT_BYTE( p ); + + PFR_CHECK( count * 2 ); + + if ( FT_QNEW_ARRAY( phy_font->blue_values, count ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + phy_font->blue_values[n] = PFR_NEXT_SHORT( p ); + } + + PFR_CHECK( 8 ); + phy_font->blue_fuzz = PFR_NEXT_BYTE( p ); + phy_font->blue_scale = PFR_NEXT_BYTE( p ); + + phy_font->vertical.standard = PFR_NEXT_USHORT( p ); + phy_font->horizontal.standard = PFR_NEXT_USHORT( p ); + + /* read the character descriptors */ + { + FT_UInt n, count, Size; + + + phy_font->num_chars = count = PFR_NEXT_USHORT( p ); + phy_font->chars_offset = offset + (FT_Offset)( p - stream->cursor ); + + if ( !phy_font->num_chars ) + { + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_phy_font_load: no glyphs\n" )); + goto Fail; + } + + Size = 1 + 1 + 2; + if ( flags & PFR_PHY_2BYTE_CHARCODE ) + Size += 1; + + if ( flags & PFR_PHY_PROPORTIONAL ) + Size += 2; + + if ( flags & PFR_PHY_ASCII_CODE ) + Size += 1; + + if ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + Size += 1; + + if ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + Size += 1; + + PFR_CHECK_SIZE( count * Size ); + + if ( FT_QNEW_ARRAY( phy_font->chars, count ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + { + PFR_Char cur = &phy_font->chars[n]; + + + cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->advance = ( flags & PFR_PHY_PROPORTIONAL ) + ? PFR_NEXT_SHORT( p ) + : phy_font->standard_advance; + +#if 0 + cur->ascii = ( flags & PFR_PHY_ASCII_CODE ) + ? PFR_NEXT_BYTE( p ) + : 0; +#else + if ( flags & PFR_PHY_ASCII_CODE ) + p += 1; +#endif + cur->gps_size = ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + } + } + + /* that's it! */ + + Fail: + FT_FRAME_EXIT(); + + /* save position of bitmap info */ + phy_font->bct_offset = FT_STREAM_POS(); + phy_font->cursor = NULL; + + Exit: + return error; + + Too_Short: + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" )); + goto Fail; + } + + +/* END */ diff --git a/external/freetype/src/pfr/pfrload.h b/external/freetype/src/pfr/pfrload.h new file mode 100644 index 000000000..d7b20a457 --- /dev/null +++ b/external/freetype/src/pfr/pfrload.h @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * pfrload.h + * + * FreeType PFR loader (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFRLOAD_H_ +#define PFRLOAD_H_ + +#include "pfrobjs.h" +#include <freetype/internal/ftstream.h> + + +FT_BEGIN_HEADER + + /* some size checks should be always done (mainly to prevent */ + /* excessive allocation for malformed data), ... */ +#define PFR_CHECK_SIZE( x ) do \ + { \ + if ( p + (x) > limit ) \ + goto Too_Short; \ + } while ( 0 ) + + /* ... and some only if intensive checking is explicitly requested */ +#ifdef PFR_CONFIG_NO_CHECKS +#define PFR_CHECK( x ) do { } while ( 0 ) +#else +#define PFR_CHECK PFR_CHECK_SIZE +#endif + +#define PFR_NEXT_BYTE( p ) FT_NEXT_BYTE( p ) +#define PFR_NEXT_INT8( p ) FT_NEXT_CHAR( p ) +#define PFR_NEXT_SHORT( p ) FT_NEXT_SHORT( p ) +#define PFR_NEXT_USHORT( p ) FT_NEXT_USHORT( p ) +#define PFR_NEXT_LONG( p ) FT_NEXT_OFF3( p ) +#define PFR_NEXT_ULONG( p ) FT_NEXT_UOFF3( p ) + + + /* handling extra items */ + + typedef FT_Error + (*PFR_ExtraItem_ParseFunc)( FT_Byte* p, + FT_Byte* limit, + FT_Pointer data ); + + typedef struct PFR_ExtraItemRec_ + { + FT_UInt type; + PFR_ExtraItem_ParseFunc parser; + + } PFR_ExtraItemRec; + + typedef const struct PFR_ExtraItemRec_* PFR_ExtraItem; + + + FT_LOCAL( FT_Error ) + pfr_extra_items_skip( FT_Byte* *pp, + FT_Byte* limit ); + + FT_LOCAL( FT_Error ) + pfr_extra_items_parse( FT_Byte* *pp, + FT_Byte* limit, + PFR_ExtraItem item_list, + FT_Pointer item_data ); + + + /* load a PFR header */ + FT_LOCAL( FT_Error ) + pfr_header_load( PFR_Header header, + FT_Stream stream ); + + /* check a PFR header */ + FT_LOCAL( FT_Bool ) + pfr_header_check( PFR_Header header ); + + + /* return number of logical fonts in this file */ + FT_LOCAL( FT_Error ) + pfr_log_font_count( FT_Stream stream, + FT_UInt32 log_section_offset, + FT_Long *acount ); + + /* load a pfr logical font entry */ + FT_LOCAL( FT_Error ) + pfr_log_font_load( PFR_LogFont log_font, + FT_Stream stream, + FT_UInt face_index, + FT_UInt32 section_offset, + FT_Bool size_increment ); + + + /* load a physical font entry */ + FT_LOCAL( FT_Error ) + pfr_phy_font_load( PFR_PhyFont phy_font, + FT_Stream stream, + FT_UInt32 offset, + FT_UInt32 size ); + + /* finalize a physical font */ + FT_LOCAL( void ) + pfr_phy_font_done( PFR_PhyFont phy_font, + FT_Memory memory ); + + /* */ + +FT_END_HEADER + +#endif /* PFRLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrobjs.c b/external/freetype/src/pfr/pfrobjs.c new file mode 100644 index 000000000..8ef17c663 --- /dev/null +++ b/external/freetype/src/pfr/pfrobjs.c @@ -0,0 +1,603 @@ +/**************************************************************************** + * + * pfrobjs.c + * + * FreeType PFR object methods (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "pfrobjs.h" +#include "pfrload.h" +#include "pfrgload.h" +#include "pfrcmap.h" +#include "pfrsbit.h" +#include <freetype/ftoutln.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/ttnameid.h> + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE OBJECT METHODS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + pfr_face_done( FT_Face pfrface ) /* PFR_Face */ + { + PFR_Face face = (PFR_Face)pfrface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = pfrface->memory; + + /* we don't want dangling pointers */ + pfrface->family_name = NULL; + pfrface->style_name = NULL; + + /* finalize the physical font record */ + pfr_phy_font_done( &face->phy_font, memory ); + + /* no need to finalize the logical font or the header */ + FT_FREE( pfrface->available_sizes ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_face_init( FT_Stream stream, + FT_Face pfrface, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + FT_TRACE2(( "PFR driver\n" )); + + /* load the header and check it */ + error = pfr_header_load( &face->header, stream ); + if ( error ) + { + FT_TRACE2(( " not a PFR font\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( !pfr_header_check( &face->header ) ) + { + FT_TRACE2(( " not a PFR font\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* check face index */ + { + FT_Long num_faces; + + + error = pfr_log_font_count( stream, + face->header.log_dir_offset, + &num_faces ); + if ( error ) + goto Exit; + + pfrface->num_faces = num_faces; + } + + if ( face_index < 0 ) + goto Exit; + + if ( ( face_index & 0xFFFF ) >= pfrface->num_faces ) + { + FT_ERROR(( "pfr_face_init: invalid face index\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* load the face */ + error = pfr_log_font_load( + &face->log_font, + stream, + (FT_UInt)( face_index & 0xFFFF ), + face->header.log_dir_offset, + FT_BOOL( face->header.phy_font_max_size_high ) ); + if ( error ) + goto Exit; + + /* load the physical font descriptor */ + error = pfr_phy_font_load( &face->phy_font, stream, + face->log_font.phys_offset, + face->log_font.phys_size ); + if ( error ) + goto Exit; + + /* set up all root face fields */ + { + PFR_PhyFont phy_font = &face->phy_font; + + + pfrface->face_index = face_index & 0xFFFF; + pfrface->num_glyphs = (FT_Long)phy_font->num_chars + 1; + + pfrface->face_flags |= FT_FACE_FLAG_SCALABLE; + + /* if gps_offset == 0 for all characters, we */ + /* assume that the font only contains bitmaps */ + { + FT_UInt nn; + + + for ( nn = 0; nn < phy_font->num_chars; nn++ ) + if ( phy_font->chars[nn].gps_offset != 0 ) + break; + + if ( nn == phy_font->num_chars ) + { + if ( phy_font->num_strikes > 0 ) + pfrface->face_flags &= ~FT_FACE_FLAG_SCALABLE; + else + { + FT_ERROR(( "pfr_face_init: font doesn't contain glyphs\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + } + + if ( !( phy_font->flags & PFR_PHY_PROPORTIONAL ) ) + pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( phy_font->flags & PFR_PHY_VERTICAL ) + pfrface->face_flags |= FT_FACE_FLAG_VERTICAL; + else + pfrface->face_flags |= FT_FACE_FLAG_HORIZONTAL; + + if ( phy_font->num_strikes > 0 ) + pfrface->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + + if ( phy_font->num_kern_pairs > 0 ) + pfrface->face_flags |= FT_FACE_FLAG_KERNING; + + /* If no family name was found in the `undocumented' auxiliary + * data, use the font ID instead. This sucks but is better than + * nothing. + */ + pfrface->family_name = phy_font->family_name; + if ( !pfrface->family_name ) + pfrface->family_name = phy_font->font_id; + + /* note that the style name can be NULL in certain PFR fonts, + * probably meaning `Regular' + */ + pfrface->style_name = phy_font->style_name; + + pfrface->num_fixed_sizes = 0; + pfrface->available_sizes = NULL; + + pfrface->bbox = phy_font->bbox; + pfrface->units_per_EM = (FT_UShort)phy_font->outline_resolution; + pfrface->ascender = (FT_Short) phy_font->bbox.yMax; + pfrface->descender = (FT_Short) phy_font->bbox.yMin; + + pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 ); + if ( pfrface->height < pfrface->ascender - pfrface->descender ) + pfrface->height = (FT_Short)( pfrface->ascender - pfrface->descender ); + + if ( phy_font->num_strikes > 0 ) + { + FT_UInt n, count = phy_font->num_strikes; + FT_Bitmap_Size* size; + PFR_Strike strike; + FT_Memory memory = pfrface->memory; + + + if ( FT_QNEW_ARRAY( pfrface->available_sizes, count ) ) + goto Exit; + + size = pfrface->available_sizes; + strike = phy_font->strikes; + for ( n = 0; n < count; n++, size++, strike++ ) + { + size->height = (FT_Short)strike->y_ppm; + size->width = (FT_Short)strike->x_ppm; + size->size = (FT_Pos)( strike->y_ppm << 6 ); + size->x_ppem = (FT_Pos)( strike->x_ppm << 6 ); + size->y_ppem = (FT_Pos)( strike->y_ppm << 6 ); + } + pfrface->num_fixed_sizes = (FT_Int)count; + } + + /* now compute maximum advance width */ + if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 ) + pfrface->max_advance_width = (FT_Short)phy_font->standard_advance; + else + { + FT_Int max = 0; + FT_UInt count = phy_font->num_chars; + PFR_Char gchar = phy_font->chars; + + + for ( ; count > 0; count--, gchar++ ) + { + if ( max < gchar->advance ) + max = gchar->advance; + } + + pfrface->max_advance_width = (FT_Short)max; + } + + pfrface->max_advance_height = pfrface->height; + + pfrface->underline_position = (FT_Short)( -pfrface->units_per_EM / 10 ); + pfrface->underline_thickness = (FT_Short)( pfrface->units_per_EM / 30 ); + + /* create charmap */ + { + FT_CharMapRec charmap; + + + charmap.face = pfrface; + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; + charmap.encoding = FT_ENCODING_UNICODE; + + error = FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL ); + } + + /* check whether we have loaded any kerning pairs */ + if ( phy_font->num_kern_pairs ) + pfrface->face_flags |= FT_FACE_FLAG_KERNING; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SLOT OBJECT METHOD *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_init( FT_GlyphSlot pfrslot ) /* PFR_Slot */ + { + PFR_Slot slot = (PFR_Slot)pfrslot; + FT_GlyphLoader loader = pfrslot->internal->loader; + + + pfr_glyph_init( &slot->glyph, loader ); + + return 0; + } + + + FT_LOCAL_DEF( void ) + pfr_slot_done( FT_GlyphSlot pfrslot ) /* PFR_Slot */ + { + PFR_Slot slot = (PFR_Slot)pfrslot; + + + pfr_glyph_done( &slot->glyph ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_load( FT_GlyphSlot pfrslot, /* PFR_Slot */ + FT_Size pfrsize, /* PFR_Size */ + FT_UInt gindex, + FT_Int32 load_flags ) + { + PFR_Slot slot = (PFR_Slot)pfrslot; + PFR_Size size = (PFR_Size)pfrsize; + FT_Error error; + PFR_Face face = (PFR_Face)pfrslot->face; + PFR_Char gchar; + FT_Outline* outline = &pfrslot->outline; + FT_ULong gps_offset; + + + FT_TRACE1(( "pfr_slot_load: glyph index %d\n", gindex )); + + if ( gindex > 0 ) + gindex--; + + if ( !face || gindex >= face->phy_font.num_chars ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* try to load an embedded bitmap */ + if ( !( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) ) + { + error = pfr_slot_load_bitmap( + slot, + size, + gindex, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); + if ( !error ) + goto Exit; + } + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + gchar = face->phy_font.chars + gindex; + pfrslot->format = FT_GLYPH_FORMAT_OUTLINE; + outline->n_points = 0; + outline->n_contours = 0; + gps_offset = face->header.gps_section_offset; + + /* load the glyph outline (FT_LOAD_NO_RECURSE isn't supported) */ + error = pfr_glyph_load( &slot->glyph, face->root.stream, + gps_offset, gchar->gps_offset, gchar->gps_size ); + + if ( !error ) + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &pfrslot->metrics; + FT_Pos advance; + FT_UInt em_metrics, em_outline; + FT_Bool scaling; + + + scaling = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE ) ); + + /* copy outline data */ + *outline = slot->glyph.loader->base.outline; + + outline->flags &= ~FT_OUTLINE_OWNER; + outline->flags |= FT_OUTLINE_REVERSE_FILL; + + if ( pfrsize->metrics.y_ppem < 24 ) + outline->flags |= FT_OUTLINE_HIGH_PRECISION; + + /* compute the advance vector */ + metrics->horiAdvance = 0; + metrics->vertAdvance = 0; + + advance = gchar->advance; + em_metrics = face->phy_font.metrics_resolution; + em_outline = face->phy_font.outline_resolution; + + if ( em_metrics != em_outline ) + advance = FT_MulDiv( advance, + (FT_Long)em_outline, + (FT_Long)em_metrics ); + + if ( face->phy_font.flags & PFR_PHY_VERTICAL ) + metrics->vertAdvance = advance; + else + metrics->horiAdvance = advance; + + pfrslot->linearHoriAdvance = metrics->horiAdvance; + pfrslot->linearVertAdvance = metrics->vertAdvance; + + /* make up vertical metrics(?) */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + +#if 0 /* some fonts seem to be broken here! */ + + /* Apply the font matrix, if any. */ + /* TODO: Test existing fonts with unusual matrix */ + /* whether we have to adjust Units per EM. */ + { + FT_Matrix font_matrix; + + + font_matrix.xx = face->log_font.matrix[0] << 8; + font_matrix.yx = face->log_font.matrix[1] << 8; + font_matrix.xy = face->log_font.matrix[2] << 8; + font_matrix.yy = face->log_font.matrix[3] << 8; + + FT_Outline_Transform( outline, &font_matrix ); + } +#endif + + /* scale when needed */ + if ( scaling ) + { + FT_Int n; + FT_Fixed x_scale = pfrsize->metrics.x_scale; + FT_Fixed y_scale = pfrsize->metrics.y_scale; + FT_Vector* vec = outline->points; + + + /* scale outline points */ + for ( n = 0; n < outline->n_points; n++, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* scale the advance */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the rest of the metrics */ + FT_Outline_Get_CBox( outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax - metrics->height; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** KERNING METHOD *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_face_get_kerning( FT_Face pfrface, /* PFR_Face */ + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error = FT_Err_Ok; + PFR_PhyFont phy_font = &face->phy_font; + FT_UInt32 code1, code2, pair; + + + kerning->x = 0; + kerning->y = 0; + + /* PFR indexing skips .notdef, which becomes UINT_MAX */ + glyph1--; + glyph2--; + + /* check the array bounds, .notdef is automatically out */ + if ( glyph1 >= phy_font->num_chars || + glyph2 >= phy_font->num_chars ) + goto Exit; + + /* convert glyph indices to character codes */ + code1 = phy_font->chars[glyph1].char_code; + code2 = phy_font->chars[glyph2].char_code; + pair = PFR_KERN_INDEX( code1, code2 ); + + /* now search the list of kerning items */ + { + PFR_KernItem item = phy_font->kern_items; + FT_Stream stream = pfrface->stream; + + + for ( ; item; item = item->next ) + { + if ( pair >= item->pair1 && pair <= item->pair2 ) + goto FoundPair; + } + goto Exit; + + FoundPair: /* we found an item, now parse it and find the value if any */ + if ( FT_STREAM_SEEK( item->offset ) || + FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) + goto Exit; + + { + FT_UInt count = item->pair_count; + FT_UInt size = item->pair_size; + FT_UInt power = 1 << FT_MSB( count ); + FT_UInt probe = power * size; + FT_UInt extra = count - power; + FT_Byte* base = stream->cursor; + FT_Bool twobytes = FT_BOOL( item->flags & PFR_KERN_2BYTE_CHAR ); + FT_Bool twobyte_adj = FT_BOOL( item->flags & PFR_KERN_2BYTE_ADJ ); + FT_Byte* p; + FT_UInt32 cpair; + + + if ( extra > 0 ) + { + p = base + extra * size; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + goto Found; + + if ( cpair < pair ) + { + if ( twobyte_adj ) + p += 2; + else + p++; + base = p; + } + } + + while ( probe > size ) + { + probe >>= 1; + p = base + probe; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + goto Found; + + if ( cpair < pair ) + base += probe; + } + + p = base; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + { + FT_Int value; + + + Found: + if ( twobyte_adj ) + value = FT_PEEK_SHORT( p ); + else + value = p[0]; + + kerning->x = item->base_adj + value; + } + } + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + +/* END */ diff --git a/external/freetype/src/pfr/pfrobjs.h b/external/freetype/src/pfr/pfrobjs.h new file mode 100644 index 000000000..fcf8c3812 --- /dev/null +++ b/external/freetype/src/pfr/pfrobjs.h @@ -0,0 +1,96 @@ +/**************************************************************************** + * + * pfrobjs.h + * + * FreeType PFR object methods (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFROBJS_H_ +#define PFROBJS_H_ + +#include "pfrtypes.h" + + +FT_BEGIN_HEADER + + typedef struct PFR_FaceRec_* PFR_Face; + + typedef struct PFR_SizeRec_* PFR_Size; + + typedef struct PFR_SlotRec_* PFR_Slot; + + + typedef struct PFR_FaceRec_ + { + FT_FaceRec root; + PFR_HeaderRec header; + PFR_LogFontRec log_font; + PFR_PhyFontRec phy_font; + + } PFR_FaceRec; + + + typedef struct PFR_SizeRec_ + { + FT_SizeRec root; + + } PFR_SizeRec; + + + typedef struct PFR_SlotRec_ + { + FT_GlyphSlotRec root; + PFR_GlyphRec glyph; + + } PFR_SlotRec; + + + FT_LOCAL( FT_Error ) + pfr_face_init( FT_Stream stream, + FT_Face face, /* PFR_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + pfr_face_done( FT_Face face ); /* PFR_Face */ + + + FT_LOCAL( FT_Error ) + pfr_face_get_kerning( FT_Face face, /* PFR_Face */ + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + + FT_LOCAL( FT_Error ) + pfr_slot_init( FT_GlyphSlot slot ); /* PFR_Slot */ + + FT_LOCAL( void ) + pfr_slot_done( FT_GlyphSlot slot ); /* PFR_Slot */ + + + FT_LOCAL( FT_Error ) + pfr_slot_load( FT_GlyphSlot slot, /* PFR_Slot */ + FT_Size size, /* PFR_Size */ + FT_UInt gindex, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* PFROBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrsbit.c b/external/freetype/src/pfr/pfrsbit.c new file mode 100644 index 000000000..46a988e8e --- /dev/null +++ b/external/freetype/src/pfr/pfrsbit.c @@ -0,0 +1,813 @@ +/**************************************************************************** + * + * pfrsbit.c + * + * FreeType PFR bitmap loader (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "pfrsbit.h" +#include "pfrload.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR BIT WRITER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PFR_BitWriter_ + { + FT_Byte* line; /* current line start */ + FT_Int pitch; /* line size in bytes */ + FT_UInt width; /* width in pixels/bits */ + FT_UInt rows; /* number of remaining rows to scan */ + FT_UInt total; /* total number of bits to draw */ + + } PFR_BitWriterRec, *PFR_BitWriter; + + + static void + pfr_bitwriter_init( PFR_BitWriter writer, + FT_Bitmap* target, + FT_Bool decreasing ) + { + writer->line = target->buffer; + writer->pitch = target->pitch; + writer->width = target->width; + writer->rows = target->rows; + writer->total = writer->width * writer->rows; + + if ( !decreasing ) + { + writer->line += writer->pitch * (FT_Int)( target->rows - 1 ); + writer->pitch = -writer->pitch; + } + } + + + static void + pfr_bitwriter_decode_bytes( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_UInt n, reload; + FT_UInt left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt val = 0; + FT_UInt c = 0; + + + n = (FT_UInt)( limit - p ) * 8; + if ( n > writer->total ) + n = writer->total; + + reload = n & 7; + + for ( ; n > 0; n-- ) + { + if ( ( n & 7 ) == reload ) + val = *p++; + + if ( val & 0x80 ) + c |= mask; + + val <<= 1; + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte)c; + left = writer->width; + mask = 0x80; + + writer->line += writer->pitch; + cur = writer->line; + c = 0; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + mask = 0x80; + c = 0; + cur++; + } + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte)c; + } + + + static void + pfr_bitwriter_decode_rle1( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int phase, count, counts[2]; + FT_UInt n, reload; + FT_UInt left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt c = 0; + + + n = writer->total; + + phase = 1; + counts[0] = 0; + counts[1] = 0; + count = 0; + reload = 1; + + for ( ; n > 0; n-- ) + { + if ( reload ) + { + do + { + if ( phase ) + { + FT_Int v; + + + if ( p >= limit ) + break; + + v = *p++; + counts[0] = v >> 4; + counts[1] = v & 15; + phase = 0; + count = counts[0]; + } + else + { + phase = 1; + count = counts[1]; + } + + } while ( count == 0 ); + } + + if ( phase ) + c |= mask; + + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte)c; + left = writer->width; + mask = 0x80; + + writer->line += writer->pitch; + cur = writer->line; + c = 0; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + mask = 0x80; + c = 0; + cur++; + } + + reload = ( --count <= 0 ); + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte) c; + } + + + static void + pfr_bitwriter_decode_rle2( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int phase, count; + FT_UInt n, reload; + FT_UInt left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt c = 0; + + + n = writer->total; + + phase = 1; + count = 0; + reload = 1; + + for ( ; n > 0; n-- ) + { + if ( reload ) + { + do + { + if ( p >= limit ) + break; + + count = *p++; + phase = phase ^ 1; + + } while ( count == 0 ); + } + + if ( phase ) + c |= mask; + + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte)c; + c = 0; + mask = 0x80; + left = writer->width; + + writer->line += writer->pitch; + cur = writer->line; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + c = 0; + mask = 0x80; + cur++; + } + + reload = ( --count <= 0 ); + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte) c; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BITMAP DATA DECODING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + pfr_lookup_bitmap_data( FT_Byte* base, + FT_Byte* limit, + FT_UInt count, + FT_UInt* flags, + FT_UInt char_code, + FT_ULong* found_offset, + FT_ULong* found_size ) + { + FT_UInt min, max, mid, char_len; + FT_Bool two = FT_BOOL( *flags & PFR_BITMAP_2BYTE_CHARCODE ); + FT_Byte* buff; + + + char_len = 4; + if ( two ) + char_len += 1; + if ( *flags & PFR_BITMAP_2BYTE_SIZE ) + char_len += 1; + if ( *flags & PFR_BITMAP_3BYTE_OFFSET ) + char_len += 1; + + if ( !( *flags & PFR_BITMAP_CHARCODES_VALIDATED ) ) + { + FT_Byte* p; + FT_Byte* lim; + FT_UInt code; + FT_Long prev_code; + + + *flags |= PFR_BITMAP_VALID_CHARCODES; + prev_code = -1; + lim = base + count * char_len; + + if ( lim > limit ) + { + FT_TRACE0(( "pfr_lookup_bitmap_data:" + " number of bitmap records too large,\n" )); + FT_TRACE0(( " " + " thus ignoring all bitmaps in this strike\n" )); + *flags &= ~PFR_BITMAP_VALID_CHARCODES; + } + else + { + /* check whether records are sorted by code */ + for ( p = base; p < lim; p += char_len ) + { + if ( two ) + code = FT_PEEK_USHORT( p ); + else + code = *p; + + if ( (FT_Long)code <= prev_code ) + { + FT_TRACE0(( "pfr_lookup_bitmap_data:" + " bitmap records are not sorted,\n" )); + FT_TRACE0(( " " + " thus ignoring all bitmaps in this strike\n" )); + *flags &= ~PFR_BITMAP_VALID_CHARCODES; + break; + } + + prev_code = code; + } + } + + *flags |= PFR_BITMAP_CHARCODES_VALIDATED; + } + + /* ignore bitmaps in case table is not valid */ + /* (this might be sanitized, but PFR is dead...) */ + if ( !( *flags & PFR_BITMAP_VALID_CHARCODES ) ) + goto Fail; + + min = 0; + max = count; + mid = min + ( max - min ) / 2; + + /* binary search */ + while ( min < max ) + { + FT_UInt code; + + + buff = base + mid * char_len; + + if ( two ) + code = PFR_NEXT_USHORT( buff ); + else + code = PFR_NEXT_BYTE( buff ); + + if ( char_code < code ) + max = mid; + else if ( char_code > code ) + min = mid + 1; + else + goto Found_It; + + /* reasonable prediction in a continuous block */ + mid += char_code - code; + if ( mid >= max || mid < min ) + mid = min + ( max - min ) / 2; + } + + Fail: + /* Not found */ + *found_size = 0; + *found_offset = 0; + return; + + Found_It: + if ( *flags & PFR_BITMAP_2BYTE_SIZE ) + *found_size = PFR_NEXT_USHORT( buff ); + else + *found_size = PFR_NEXT_BYTE( buff ); + + if ( *flags & PFR_BITMAP_3BYTE_OFFSET ) + *found_offset = PFR_NEXT_ULONG( buff ); + else + *found_offset = PFR_NEXT_USHORT( buff ); + } + + + /* load bitmap metrics. `*aadvance' must be set to the default value */ + /* before calling this function */ + /* */ + static FT_Error + pfr_load_bitmap_metrics( FT_Byte** pdata, + FT_Byte* limit, + FT_Long scaled_advance, + FT_Long *axpos, + FT_Long *aypos, + FT_UInt *axsize, + FT_UInt *aysize, + FT_Long *aadvance, + FT_UInt *aformat ) + { + FT_Error error = FT_Err_Ok; + FT_Byte flags; + FT_Byte b; + FT_Byte* p = *pdata; + FT_Long xpos, ypos, advance; + FT_UInt xsize, ysize; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + xpos = 0; + ypos = 0; + xsize = 0; + ysize = 0; + advance = 0; + + switch ( flags & 3 ) + { + case 0: + PFR_CHECK( 1 ); + b = PFR_NEXT_BYTE( p ); + xpos = (FT_Char)b >> 4; + ypos = ( (FT_Char)( b << 4 ) ) >> 4; + break; + + case 1: + PFR_CHECK( 2 ); + xpos = PFR_NEXT_INT8( p ); + ypos = PFR_NEXT_INT8( p ); + break; + + case 2: + PFR_CHECK( 4 ); + xpos = PFR_NEXT_SHORT( p ); + ypos = PFR_NEXT_SHORT( p ); + break; + + case 3: + PFR_CHECK( 6 ); + xpos = PFR_NEXT_LONG( p ); + ypos = PFR_NEXT_LONG( p ); + break; + + default: + ; + } + + flags >>= 2; + switch ( flags & 3 ) + { + case 0: + /* blank image */ + xsize = 0; + ysize = 0; + break; + + case 1: + PFR_CHECK( 1 ); + b = PFR_NEXT_BYTE( p ); + xsize = ( b >> 4 ) & 0xF; + ysize = b & 0xF; + break; + + case 2: + PFR_CHECK( 2 ); + xsize = PFR_NEXT_BYTE( p ); + ysize = PFR_NEXT_BYTE( p ); + break; + + case 3: + PFR_CHECK( 4 ); + xsize = PFR_NEXT_USHORT( p ); + ysize = PFR_NEXT_USHORT( p ); + break; + + default: + ; + } + + flags >>= 2; + switch ( flags & 3 ) + { + case 0: + advance = scaled_advance; + break; + + case 1: + PFR_CHECK( 1 ); + advance = PFR_NEXT_INT8( p ) * 256; + break; + + case 2: + PFR_CHECK( 2 ); + advance = PFR_NEXT_SHORT( p ); + break; + + case 3: + PFR_CHECK( 3 ); + advance = PFR_NEXT_LONG( p ); + break; + + default: + ; + } + + *axpos = xpos; + *aypos = ypos; + *axsize = xsize; + *aysize = ysize; + *aadvance = advance; + *aformat = flags >> 2; + *pdata = p; + + Exit: + return error; + + Too_Short: + error = FT_THROW( Invalid_Table ); + FT_ERROR(( "pfr_load_bitmap_metrics: invalid glyph data\n" )); + goto Exit; + } + + + static FT_Error + pfr_load_bitmap_bits( FT_Byte* p, + FT_Byte* limit, + FT_UInt format, + FT_Bool decreasing, + FT_Bitmap* target ) + { + FT_Error error = FT_Err_Ok; + PFR_BitWriterRec writer; + + + if ( target->rows > 0 && target->width > 0 ) + { + pfr_bitwriter_init( &writer, target, decreasing ); + + switch ( format ) + { + case 0: /* packed bits */ + pfr_bitwriter_decode_bytes( &writer, p, limit ); + break; + + case 1: /* RLE1 */ + pfr_bitwriter_decode_rle1( &writer, p, limit ); + break; + + case 2: /* RLE2 */ + pfr_bitwriter_decode_rle2( &writer, p, limit ); + break; + + default: + ; + } + } + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BITMAP LOADING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_load_bitmap( PFR_Slot glyph, + PFR_Size size, + FT_UInt glyph_index, + FT_Bool metrics_only ) + { + FT_Error error; + PFR_Face face = (PFR_Face) glyph->root.face; + FT_Stream stream = face->root.stream; + PFR_PhyFont phys = &face->phy_font; + FT_ULong gps_offset; + FT_ULong gps_size; + PFR_Char character; + PFR_Strike strike; + + + character = &phys->chars[glyph_index]; + + /* look up a bitmap strike corresponding to the current */ + /* character dimensions */ + { + FT_UInt n; + + + strike = phys->strikes; + for ( n = 0; n < phys->num_strikes; n++ ) + { + if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem && + strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem ) + goto Found_Strike; + + strike++; + } + + /* couldn't find it */ + return FT_THROW( Invalid_Argument ); + } + + Found_Strike: + + /* now look up the glyph's position within the file */ + { + FT_UInt char_len; + + + char_len = 4; + if ( strike->flags & PFR_BITMAP_2BYTE_CHARCODE ) + char_len += 1; + if ( strike->flags & PFR_BITMAP_2BYTE_SIZE ) + char_len += 1; + if ( strike->flags & PFR_BITMAP_3BYTE_OFFSET ) + char_len += 1; + + /* access data directly in the frame to speed up lookups */ + if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) || + FT_FRAME_ENTER( char_len * strike->num_bitmaps ) ) + goto Exit; + + pfr_lookup_bitmap_data( stream->cursor, + stream->limit, + strike->num_bitmaps, + &strike->flags, + character->char_code, + &gps_offset, + &gps_size ); + + FT_FRAME_EXIT(); + + if ( gps_size == 0 ) + { + /* could not find a bitmap program string for this glyph */ + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + /* get the bitmap metrics */ + { + FT_Long xpos = 0, ypos = 0, advance = 0; + FT_UInt xsize = 0, ysize = 0, format = 0; + FT_Byte* p; + + + /* compute linear advance */ + advance = character->advance; + if ( phys->metrics_resolution != phys->outline_resolution ) + advance = FT_MulDiv( advance, + (FT_Long)phys->outline_resolution, + (FT_Long)phys->metrics_resolution ); + + glyph->root.linearHoriAdvance = advance; + + /* compute default advance, i.e., scaled advance; this can be */ + /* overridden in the bitmap header of certain glyphs */ + advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8, + character->advance, + (FT_Long)phys->metrics_resolution ); + + if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) || + FT_FRAME_ENTER( gps_size ) ) + goto Exit; + + p = stream->cursor; + error = pfr_load_bitmap_metrics( &p, stream->limit, + advance, + &xpos, &ypos, + &xsize, &ysize, + &advance, &format ); + if ( error ) + goto Exit1; + + /* + * Before allocating the target bitmap, we check whether the given + * bitmap dimensions are valid, depending on the image format. + * + * Format 0: We have a stream of pixels (with 8 pixels per byte). + * + * (xsize * ysize + 7) / 8 <= gps_size + * + * Format 1: Run-length encoding; the high nibble holds the number of + * white bits, the low nibble the number of black bits. In + * other words, a single byte can represent at most 15 + * pixels. + * + * xsize * ysize <= 15 * gps_size + * + * Format 2: Run-length encoding; the high byte holds the number of + * white bits, the low byte the number of black bits. In + * other words, two bytes can represent at most 255 pixels. + * + * xsize * ysize <= 255 * (gps_size + 1) / 2 + */ + switch ( format ) + { + case 0: + if ( ( (FT_ULong)xsize * ysize + 7 ) / 8 > gps_size ) + error = FT_THROW( Invalid_Table ); + break; + case 1: + if ( (FT_ULong)xsize * ysize > 15 * gps_size ) + error = FT_THROW( Invalid_Table ); + break; + case 2: + if ( (FT_ULong)xsize * ysize > 255 * ( ( gps_size + 1 ) / 2 ) ) + error = FT_THROW( Invalid_Table ); + break; + default: + FT_ERROR(( "pfr_slot_load_bitmap: invalid image type\n" )); + error = FT_THROW( Invalid_Table ); + } + + if ( error ) + { + if ( FT_ERR_EQ( error, Invalid_Table ) ) + FT_ERROR(( "pfr_slot_load_bitmap: invalid bitmap dimensions\n" )); + goto Exit1; + } + + /* + * XXX: on 16bit systems we return an error for huge bitmaps + * that cause size truncation, because truncated + * size properties make bitmap glyphs broken. + */ + if ( xpos > FT_INT_MAX || + xpos < FT_INT_MIN || + ysize > FT_INT_MAX || + ypos > FT_INT_MAX - (FT_Long)ysize || + ypos + (FT_Long)ysize < FT_INT_MIN ) + { + FT_TRACE1(( "pfr_slot_load_bitmap:" + " huge bitmap glyph %ldx%ld over FT_GlyphSlot\n", + xpos, ypos )); + error = FT_THROW( Invalid_Pixel_Size ); + } + + if ( !error ) + { + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + /* Set up glyph bitmap and metrics */ + + /* XXX: needs casts to fit FT_Bitmap.{width|rows|pitch} */ + glyph->root.bitmap.width = xsize; + glyph->root.bitmap.rows = ysize; + glyph->root.bitmap.pitch = (FT_Int)( xsize + 7 ) >> 3; + glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO; + + /* XXX: needs casts to fit FT_Glyph_Metrics.{width|height} */ + glyph->root.metrics.width = (FT_Pos)xsize << 6; + glyph->root.metrics.height = (FT_Pos)ysize << 6; + glyph->root.metrics.horiBearingX = xpos * 64; + glyph->root.metrics.horiBearingY = ypos * 64; + glyph->root.metrics.horiAdvance = FT_PIX_ROUND( ( advance >> 2 ) ); + glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1; + glyph->root.metrics.vertBearingY = 0; + glyph->root.metrics.vertAdvance = size->root.metrics.height; + + /* XXX: needs casts fit FT_GlyphSlotRec.bitmap_{left|top} */ + glyph->root.bitmap_left = (FT_Int)xpos; + glyph->root.bitmap_top = (FT_Int)( ypos + (FT_Long)ysize ); + + if ( metrics_only ) + goto Exit1; + + /* Allocate and read bitmap data */ + { + FT_ULong len = (FT_ULong)glyph->root.bitmap.pitch * ysize; + + + error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); + if ( !error ) + error = pfr_load_bitmap_bits( + p, + stream->limit, + format, + FT_BOOL( face->header.color_flags & + PFR_FLAG_INVERT_BITMAP ), + &glyph->root.bitmap ); + } + } + + Exit1: + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + +/* END */ diff --git a/external/freetype/src/pfr/pfrsbit.h b/external/freetype/src/pfr/pfrsbit.h new file mode 100644 index 000000000..3e1dba9ae --- /dev/null +++ b/external/freetype/src/pfr/pfrsbit.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * + * pfrsbit.h + * + * FreeType PFR bitmap loader (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFRSBIT_H_ +#define PFRSBIT_H_ + +#include "pfrobjs.h" + +FT_BEGIN_HEADER + + FT_LOCAL( FT_Error ) + pfr_slot_load_bitmap( PFR_Slot glyph, + PFR_Size size, + FT_UInt glyph_index, + FT_Bool metrics_only ); + +FT_END_HEADER + +#endif /* PFRSBIT_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/pfrtypes.h b/external/freetype/src/pfr/pfrtypes.h new file mode 100644 index 000000000..2f8909f06 --- /dev/null +++ b/external/freetype/src/pfr/pfrtypes.h @@ -0,0 +1,331 @@ +/**************************************************************************** + * + * pfrtypes.h + * + * FreeType PFR data structures (specification only). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PFRTYPES_H_ +#define PFRTYPES_H_ + +#include <freetype/internal/ftobjs.h> + +FT_BEGIN_HEADER + + /************************************************************************/ + + /* the PFR Header structure */ + typedef struct PFR_HeaderRec_ + { + FT_UInt32 signature; + FT_UInt version; + FT_UInt signature2; + FT_UInt header_size; + + FT_UInt log_dir_size; + FT_UInt log_dir_offset; + + FT_UInt log_font_max_size; + FT_UInt32 log_font_section_size; + FT_UInt32 log_font_section_offset; + + FT_UInt32 phy_font_max_size; + FT_UInt32 phy_font_section_size; + FT_UInt32 phy_font_section_offset; + + FT_UInt gps_max_size; + FT_UInt32 gps_section_size; + FT_UInt32 gps_section_offset; + + FT_UInt max_blue_values; + FT_UInt max_x_orus; + FT_UInt max_y_orus; + + FT_UInt phy_font_max_size_high; + FT_UInt color_flags; + + FT_UInt32 bct_max_size; + FT_UInt32 bct_set_max_size; + FT_UInt32 phy_bct_set_max_size; + + FT_UInt num_phy_fonts; + FT_UInt max_vert_stem_snap; + FT_UInt max_horz_stem_snap; + FT_UInt max_chars; + + } PFR_HeaderRec, *PFR_Header; + + + /* used in `color_flags' field of the PFR_Header */ +#define PFR_FLAG_BLACK_PIXEL 0x01U +#define PFR_FLAG_INVERT_BITMAP 0x02U + + + /************************************************************************/ + + typedef struct PFR_LogFontRec_ + { + FT_UInt32 size; + FT_UInt32 offset; + + FT_Int32 matrix[4]; + FT_UInt stroke_flags; + FT_Int stroke_thickness; + FT_Int bold_thickness; + FT_Int32 miter_limit; + + FT_UInt32 phys_size; + FT_UInt32 phys_offset; + + } PFR_LogFontRec, *PFR_LogFont; + + +#define PFR_LINE_JOIN_MITER 0x00U +#define PFR_LINE_JOIN_ROUND 0x01U +#define PFR_LINE_JOIN_BEVEL 0x02U +#define PFR_LINE_JOIN_MASK ( PFR_LINE_JOIN_ROUND | PFR_LINE_JOIN_BEVEL ) + +#define PFR_LOG_STROKE 0x04U +#define PFR_LOG_2BYTE_STROKE 0x08U +#define PFR_LOG_BOLD 0x10U +#define PFR_LOG_2BYTE_BOLD 0x20U +#define PFR_LOG_EXTRA_ITEMS 0x40U + + + /************************************************************************/ + +#define PFR_BITMAP_2BYTE_CHARCODE 0x01U +#define PFR_BITMAP_2BYTE_SIZE 0x02U +#define PFR_BITMAP_3BYTE_OFFSET 0x04U + + /* not part of the specification but used for implementation */ +#define PFR_BITMAP_CHARCODES_VALIDATED 0x40U +#define PFR_BITMAP_VALID_CHARCODES 0x80U + + + typedef struct PFR_BitmapCharRec_ + { + FT_UInt char_code; + FT_UInt gps_size; + FT_UInt32 gps_offset; + + } PFR_BitmapCharRec, *PFR_BitmapChar; + + +#define PFR_STRIKE_2BYTE_XPPM 0x01U +#define PFR_STRIKE_2BYTE_YPPM 0x02U +#define PFR_STRIKE_3BYTE_SIZE 0x04U +#define PFR_STRIKE_3BYTE_OFFSET 0x08U +#define PFR_STRIKE_2BYTE_COUNT 0x10U + + + typedef struct PFR_StrikeRec_ + { + FT_UInt x_ppm; + FT_UInt y_ppm; + FT_UInt flags; + + FT_UInt32 gps_size; + FT_UInt32 gps_offset; + + FT_UInt32 bct_size; + FT_UInt32 bct_offset; + + /* optional */ + FT_UInt num_bitmaps; + PFR_BitmapChar bitmaps; + + } PFR_StrikeRec, *PFR_Strike; + + + /************************************************************************/ + + typedef struct PFR_CharRec_ + { + FT_UInt char_code; + FT_Int advance; + FT_UInt gps_size; + FT_UInt32 gps_offset; + + } PFR_CharRec, *PFR_Char; + + + /************************************************************************/ + + typedef struct PFR_DimensionRec_ + { + FT_UInt standard; + FT_UInt num_stem_snaps; + FT_Int* stem_snaps; + + } PFR_DimensionRec, *PFR_Dimension; + + /************************************************************************/ + + typedef struct PFR_KernItemRec_* PFR_KernItem; + + typedef struct PFR_KernItemRec_ + { + PFR_KernItem next; + FT_Byte pair_count; + FT_Byte flags; + FT_Short base_adj; + FT_UInt pair_size; + FT_Offset offset; + FT_UInt32 pair1; + FT_UInt32 pair2; + + } PFR_KernItemRec; + + +#define PFR_KERN_INDEX( g1, g2 ) \ + ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) + +#define PFR_KERN_PAIR_INDEX( pair ) \ + PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) + +#define PFR_NEXT_KPAIR( p ) ( p += 2, \ + ( (FT_UInt32)p[-2] << 16 ) | p[-1] ) + + + /************************************************************************/ + + typedef struct PFR_PhyFontRec_ + { + FT_Memory memory; + FT_UInt32 offset; + + FT_UInt font_ref_number; + FT_UInt outline_resolution; + FT_UInt metrics_resolution; + FT_BBox bbox; + FT_UInt flags; + FT_Int standard_advance; + + FT_Int ascent; /* optional, bbox.yMax if not present */ + FT_Int descent; /* optional, bbox.yMin if not present */ + FT_Int leading; /* optional, 0 if not present */ + + PFR_DimensionRec horizontal; + PFR_DimensionRec vertical; + + FT_String* font_id; + FT_String* family_name; + FT_String* style_name; + + FT_UInt num_strikes; + FT_UInt max_strikes; + PFR_StrikeRec* strikes; + + FT_UInt num_blue_values; + FT_Int *blue_values; + FT_UInt blue_fuzz; + FT_UInt blue_scale; + + FT_UInt num_chars; + FT_Offset chars_offset; + PFR_Char chars; + + FT_UInt num_kern_pairs; + PFR_KernItem kern_items; + PFR_KernItem* kern_items_tail; + + /* not part of the spec, but used during load */ + FT_ULong bct_offset; + FT_Byte* cursor; + + } PFR_PhyFontRec, *PFR_PhyFont; + + +#define PFR_PHY_VERTICAL 0x01U +#define PFR_PHY_2BYTE_CHARCODE 0x02U +#define PFR_PHY_PROPORTIONAL 0x04U +#define PFR_PHY_ASCII_CODE 0x08U +#define PFR_PHY_2BYTE_GPS_SIZE 0x10U +#define PFR_PHY_3BYTE_GPS_OFFSET 0x20U +#define PFR_PHY_EXTRA_ITEMS 0x80U + + +#define PFR_KERN_2BYTE_CHAR 0x01U +#define PFR_KERN_2BYTE_ADJ 0x02U + + + /************************************************************************/ + +#define PFR_GLYPH_YCOUNT 0x01U +#define PFR_GLYPH_XCOUNT 0x02U +#define PFR_GLYPH_1BYTE_XYCOUNT 0x04U + +#define PFR_GLYPH_SINGLE_EXTRA_ITEMS 0x08U +#define PFR_GLYPH_COMPOUND_EXTRA_ITEMS 0x40U + +#define PFR_GLYPH_IS_COMPOUND 0x80U + + + /* controlled coordinate */ + typedef struct PFR_CoordRec_ + { + FT_UInt org; + FT_UInt cur; + + } PFR_CoordRec, *PFR_Coord; + + + typedef struct PFR_SubGlyphRec_ + { + FT_Fixed x_scale; + FT_Fixed y_scale; + FT_Int x_delta; + FT_Int y_delta; + FT_UInt32 gps_offset; + FT_UInt gps_size; + + } PFR_SubGlyphRec, *PFR_SubGlyph; + + +#define PFR_SUBGLYPH_XSCALE 0x10U +#define PFR_SUBGLYPH_YSCALE 0x20U +#define PFR_SUBGLYPH_2BYTE_SIZE 0x40U +#define PFR_SUBGLYPH_3BYTE_OFFSET 0x80U + + + typedef struct PFR_GlyphRec_ + { + FT_Byte format; + +#if 0 + FT_UInt num_x_control; + FT_UInt num_y_control; +#endif + FT_UInt max_xy_control; + FT_Pos* x_control; + FT_Pos* y_control; + + + FT_UInt num_subs; + FT_UInt max_subs; + PFR_SubGlyphRec* subs; + + FT_GlyphLoader loader; + FT_Bool path_begun; + + } PFR_GlyphRec, *PFR_Glyph; + + +FT_END_HEADER + +#endif /* PFRTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/src/pfr/rules.mk b/external/freetype/src/pfr/rules.mk new file mode 100644 index 000000000..50695fd28 --- /dev/null +++ b/external/freetype/src/pfr/rules.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 PFR driver configuration rules +# + + +# Copyright (C) 2002-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# pfr driver directory +# +PFR_DIR := $(SRC_DIR)/pfr + + +# compilation flags for the driver +# +PFR_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(PFR_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# pfr driver sources (i.e., C files) +# +PFR_DRV_SRC := $(PFR_DIR)/pfrload.c \ + $(PFR_DIR)/pfrgload.c \ + $(PFR_DIR)/pfrcmap.c \ + $(PFR_DIR)/pfrdrivr.c \ + $(PFR_DIR)/pfrsbit.c \ + $(PFR_DIR)/pfrobjs.c + +# pfr driver headers +# +PFR_DRV_H := $(PFR_DRV_SRC:%.c=%.h) \ + $(PFR_DIR)/pfrerror.h \ + $(PFR_DIR)/pfrtypes.h + + +# Pfr driver object(s) +# +# PFR_DRV_OBJ_M is used during `multi' builds +# PFR_DRV_OBJ_S is used during `single' builds +# +PFR_DRV_OBJ_M := $(PFR_DRV_SRC:$(PFR_DIR)/%.c=$(OBJ_DIR)/%.$O) +PFR_DRV_OBJ_S := $(OBJ_DIR)/pfr.$O + +# pfr driver source file for single build +# +PFR_DRV_SRC_S := $(PFR_DIR)/pfr.c + + +# pfr driver - single object +# +$(PFR_DRV_OBJ_S): $(PFR_DRV_SRC_S) $(PFR_DRV_SRC) $(FREETYPE_H) $(PFR_DRV_H) + $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PFR_DRV_SRC_S)) + + +# pfr driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PFR_DIR)/%.c $(FREETYPE_H) $(PFR_DRV_H) + $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PFR_DRV_OBJ_S) +DRV_OBJS_M += $(PFR_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/psaux/afmparse.c b/external/freetype/src/psaux/afmparse.c new file mode 100644 index 000000000..db08941de --- /dev/null +++ b/external/freetype/src/psaux/afmparse.c @@ -0,0 +1,1094 @@ +/**************************************************************************** + * + * afmparse.c + * + * AFM parser (body). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/freetype.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/psaux.h> + +#ifndef T1_CONFIG_OPTION_NO_AFM + +#include "afmparse.h" +#include "psconv.h" + +#include "psauxerr.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT afmparse + + + /************************************************************************** + * + * AFM_Stream + * + * The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. + * + */ + + enum + { + AFM_STREAM_STATUS_NORMAL, + AFM_STREAM_STATUS_EOC, + AFM_STREAM_STATUS_EOL, + AFM_STREAM_STATUS_EOF + }; + + + typedef struct AFM_StreamRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + FT_Int status; + + } AFM_StreamRec; + + +#ifndef EOF +#define EOF -1 +#endif + + + /* this works because empty lines are ignored */ +#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) + +#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) +#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) + + /* column separator; there is no `column' in the spec actually */ +#define AFM_IS_SEP( ch ) ( (ch) == ';' ) + +#define AFM_GETC() \ + ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ + : EOF ) + +#define AFM_STREAM_KEY_BEGIN( stream ) \ + (char*)( (stream)->cursor - 1 ) + +#define AFM_STREAM_KEY_LEN( stream, key ) \ + (FT_Offset)( (char*)(stream)->cursor - key - 1 ) + +#define AFM_STATUS_EOC( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOC ) + +#define AFM_STATUS_EOL( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOL ) + +#define AFM_STATUS_EOF( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOF ) + + + static int + afm_stream_skip_spaces( AFM_Stream stream ) + { + int ch = 0; /* make stupid compiler happy */ + + + if ( AFM_STATUS_EOC( stream ) ) + return ';'; + + while ( 1 ) + { + ch = AFM_GETC(); + if ( !AFM_IS_SPACE( ch ) ) + break; + } + + if ( AFM_IS_NEWLINE( ch ) ) + stream->status = AFM_STREAM_STATUS_EOL; + else if ( AFM_IS_SEP( ch ) ) + stream->status = AFM_STREAM_STATUS_EOC; + else if ( AFM_IS_EOF( ch ) ) + stream->status = AFM_STREAM_STATUS_EOF; + + return ch; + } + + + /* read a key or value in current column */ + static char* + afm_stream_read_one( AFM_Stream stream ) + { + char* str; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOC( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + while ( 1 ) + { + int ch = AFM_GETC(); + + + if ( AFM_IS_SPACE( ch ) ) + break; + else if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_SEP( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOC; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /* read a string (i.e., read to EOL) */ + static char* + afm_stream_read_string( AFM_Stream stream ) + { + char* str; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOL( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + /* scan to eol */ + while ( 1 ) + { + int ch = AFM_GETC(); + + + if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /************************************************************************** + * + * AFM_Parser + * + */ + + /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ + typedef enum AFM_Token_ + { + AFM_TOKEN_ASCENDER, + AFM_TOKEN_AXISLABEL, + AFM_TOKEN_AXISTYPE, + AFM_TOKEN_B, + AFM_TOKEN_BLENDAXISTYPES, + AFM_TOKEN_BLENDDESIGNMAP, + AFM_TOKEN_BLENDDESIGNPOSITIONS, + AFM_TOKEN_C, + AFM_TOKEN_CC, + AFM_TOKEN_CH, + AFM_TOKEN_CAPHEIGHT, + AFM_TOKEN_CHARWIDTH, + AFM_TOKEN_CHARACTERSET, + AFM_TOKEN_CHARACTERS, + AFM_TOKEN_DESCENDER, + AFM_TOKEN_ENCODINGSCHEME, + AFM_TOKEN_ENDAXIS, + AFM_TOKEN_ENDCHARMETRICS, + AFM_TOKEN_ENDCOMPOSITES, + AFM_TOKEN_ENDDIRECTION, + AFM_TOKEN_ENDFONTMETRICS, + AFM_TOKEN_ENDKERNDATA, + AFM_TOKEN_ENDKERNPAIRS, + AFM_TOKEN_ENDTRACKKERN, + AFM_TOKEN_ESCCHAR, + AFM_TOKEN_FAMILYNAME, + AFM_TOKEN_FONTBBOX, + AFM_TOKEN_FONTNAME, + AFM_TOKEN_FULLNAME, + AFM_TOKEN_ISBASEFONT, + AFM_TOKEN_ISCIDFONT, + AFM_TOKEN_ISFIXEDPITCH, + AFM_TOKEN_ISFIXEDV, + AFM_TOKEN_ITALICANGLE, + AFM_TOKEN_KP, + AFM_TOKEN_KPH, + AFM_TOKEN_KPX, + AFM_TOKEN_KPY, + AFM_TOKEN_L, + AFM_TOKEN_MAPPINGSCHEME, + AFM_TOKEN_METRICSSETS, + AFM_TOKEN_N, + AFM_TOKEN_NOTICE, + AFM_TOKEN_PCC, + AFM_TOKEN_STARTAXIS, + AFM_TOKEN_STARTCHARMETRICS, + AFM_TOKEN_STARTCOMPOSITES, + AFM_TOKEN_STARTDIRECTION, + AFM_TOKEN_STARTFONTMETRICS, + AFM_TOKEN_STARTKERNDATA, + AFM_TOKEN_STARTKERNPAIRS, + AFM_TOKEN_STARTKERNPAIRS0, + AFM_TOKEN_STARTKERNPAIRS1, + AFM_TOKEN_STARTTRACKKERN, + AFM_TOKEN_STDHW, + AFM_TOKEN_STDVW, + AFM_TOKEN_TRACKKERN, + AFM_TOKEN_UNDERLINEPOSITION, + AFM_TOKEN_UNDERLINETHICKNESS, + AFM_TOKEN_VV, + AFM_TOKEN_VVECTOR, + AFM_TOKEN_VERSION, + AFM_TOKEN_W, + AFM_TOKEN_W0, + AFM_TOKEN_W0X, + AFM_TOKEN_W0Y, + AFM_TOKEN_W1, + AFM_TOKEN_W1X, + AFM_TOKEN_W1Y, + AFM_TOKEN_WX, + AFM_TOKEN_WY, + AFM_TOKEN_WEIGHT, + AFM_TOKEN_WEIGHTVECTOR, + AFM_TOKEN_XHEIGHT, + N_AFM_TOKENS, + AFM_TOKEN_UNKNOWN + + } AFM_Token; + + + static const char* const afm_key_table[N_AFM_TOKENS] = + { + "Ascender", + "AxisLabel", + "AxisType", + "B", + "BlendAxisTypes", + "BlendDesignMap", + "BlendDesignPositions", + "C", + "CC", + "CH", + "CapHeight", + "CharWidth", + "CharacterSet", + "Characters", + "Descender", + "EncodingScheme", + "EndAxis", + "EndCharMetrics", + "EndComposites", + "EndDirection", + "EndFontMetrics", + "EndKernData", + "EndKernPairs", + "EndTrackKern", + "EscChar", + "FamilyName", + "FontBBox", + "FontName", + "FullName", + "IsBaseFont", + "IsCIDFont", + "IsFixedPitch", + "IsFixedV", + "ItalicAngle", + "KP", + "KPH", + "KPX", + "KPY", + "L", + "MappingScheme", + "MetricsSets", + "N", + "Notice", + "PCC", + "StartAxis", + "StartCharMetrics", + "StartComposites", + "StartDirection", + "StartFontMetrics", + "StartKernData", + "StartKernPairs", + "StartKernPairs0", + "StartKernPairs1", + "StartTrackKern", + "StdHW", + "StdVW", + "TrackKern", + "UnderlinePosition", + "UnderlineThickness", + "VV", + "VVector", + "Version", + "W", + "W0", + "W0X", + "W0Y", + "W1", + "W1X", + "W1Y", + "WX", + "WY", + "Weight", + "WeightVector", + "XHeight" + }; + + + /* + * `afm_parser_read_vals' and `afm_parser_next_key' provide + * high-level operations to an AFM_Stream. The rest of the + * parser functions should use them without accessing the + * AFM_Stream directly. + */ + + FT_LOCAL_DEF( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_Int n ) + { + AFM_Stream stream = parser->stream; + char* str; + FT_Int i; + + + if ( n > AFM_MAX_ARGUMENTS ) + return 0; + + for ( i = 0; i < n; i++ ) + { + FT_Offset len; + AFM_Value val = vals + i; + + + if ( val->type == AFM_VALUE_TYPE_STRING ) + str = afm_stream_read_string( stream ); + else + str = afm_stream_read_one( stream ); + + if ( !str ) + break; + + len = AFM_STREAM_KEY_LEN( stream, str ); + + switch ( val->type ) + { + case AFM_VALUE_TYPE_STRING: + case AFM_VALUE_TYPE_NAME: + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( !FT_QALLOC( val->u.s, len + 1 ) ) + { + ft_memcpy( val->u.s, str, len ); + val->u.s[len] = '\0'; + } + } + break; + + case AFM_VALUE_TYPE_FIXED: + val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len, 0 ); + break; + + case AFM_VALUE_TYPE_INTEGER: + val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len ); + break; + + case AFM_VALUE_TYPE_BOOL: + val->u.b = FT_BOOL( len == 4 && + !ft_strncmp( str, "true", 4 ) ); + break; + + case AFM_VALUE_TYPE_INDEX: + if ( parser->get_index ) + val->u.i = parser->get_index( str, len, parser->user_data ); + else + val->u.i = 0; + break; + } + } + + return i; + } + + + FT_LOCAL_DEF( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ) + { + AFM_Stream stream = parser->stream; + char* key = NULL; /* make stupid compiler happy */ + + + if ( line ) + { + while ( 1 ) + { + /* skip current line */ + if ( !AFM_STATUS_EOL( stream ) ) + afm_stream_read_string( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty line */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOL( stream ) ) + continue; + + break; + } + } + else + { + while ( 1 ) + { + /* skip current column */ + while ( !AFM_STATUS_EOC( stream ) ) + afm_stream_read_one( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty column */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOC( stream ) ) + continue; + + break; + } + } + + if ( len ) + *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key ) + : 0; + + return key; + } + + + static AFM_Token + afm_tokenize( const char* key, + FT_Offset len ) + { + int n; + + + for ( n = 0; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) == *key ) + { + for ( ; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) != *key ) + return AFM_TOKEN_UNKNOWN; + + if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) + return (AFM_Token) n; + } + } + } + + return AFM_TOKEN_UNKNOWN; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ) + { + AFM_Stream stream = NULL; + FT_Error error; + + + if ( FT_NEW( stream ) ) + return error; + + stream->cursor = stream->base = base; + stream->limit = limit; + + /* don't skip the first line during the first call */ + stream->status = AFM_STREAM_STATUS_EOL; + + parser->memory = memory; + parser->stream = stream; + parser->FontInfo = NULL; + parser->get_index = NULL; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + afm_parser_done( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + + + FT_FREE( parser->stream ); + } + + + static FT_Error + afm_parser_read_int( AFM_Parser parser, + FT_Int* aint ) + { + AFM_ValueRec val; + + + val.type = AFM_VALUE_TYPE_INTEGER; + + if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) + { + *aint = val.u.i; + + return FT_Err_Ok; + } + else + return FT_THROW( Syntax_Error ); + } + + + static FT_Error + afm_parse_track_kern( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_Stream stream = parser->stream; + AFM_TrackKern tk; + + char* key; + FT_Offset len; + int n = -1; + FT_Int tmp; + + + if ( afm_parser_read_int( parser, &tmp ) ) + goto Fail; + + if ( tmp < 0 ) + { + FT_ERROR(( "afm_parse_track_kern: invalid number of track kerns\n" )); + goto Fail; + } + + fi->NumTrackKern = (FT_UInt)tmp; + FT_TRACE3(( "afm_parse_track_kern: %u track kern%s expected\n", + fi->NumTrackKern, + fi->NumTrackKern == 1 ? "" : "s" )); + + /* Rough sanity check: The minimum line length of the `TrackKern` */ + /* command is 20 characters (including the EOL character). */ + if ( (FT_ULong)( stream->limit - stream->cursor ) / 20 < + fi->NumTrackKern ) + { + FT_ERROR(( "afm_parse_track_kern:" + " number of track kern entries exceeds stream size\n" )); + goto Fail; + } + + if ( fi->NumTrackKern ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[5]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_TRACKKERN: + n++; + + if ( n >= (int)fi->NumTrackKern ) + { + FT_ERROR(( "afm_parse_track_kern: too many track kern data\n" )); + goto Fail; + } + + tk = fi->TrackKerns + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + shared_vals[4].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) + { + FT_ERROR(( "afm_parse_track_kern:" + " insufficient number of parameters for entry %d\n", + n )); + goto Fail; + } + + tk->degree = shared_vals[0].u.i; + tk->min_ptsize = shared_vals[1].u.f; + tk->min_kern = shared_vals[2].u.f; + tk->max_ptsize = shared_vals[3].u.f; + tk->max_kern = shared_vals[4].u.f; + + break; + + case AFM_TOKEN_ENDTRACKKERN: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + tmp = n + 1; + if ( (FT_UInt)tmp != fi->NumTrackKern ) + { + FT_TRACE1(( "afm_parse_track_kern: %s%d track kern entr%s seen\n", + tmp == 0 ? "" : "only ", + tmp, + tmp == 1 ? "y" : "ies" )); + fi->NumTrackKern = (FT_UInt)tmp; + } + else + FT_TRACE3(( "afm_parse_track_kern: %d track kern entr%s seen\n", + tmp, + tmp == 1 ? "y" : "ies" )); + return FT_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + + + /* compare two kerning pairs */ + FT_COMPARE_DEF( int ) + afm_compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair kp1 = (AFM_KernPair)a; + AFM_KernPair kp2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); + FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + static FT_Error + afm_parse_kern_pairs( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_Stream stream = parser->stream; + AFM_KernPair kp; + char* key; + FT_Offset len; + int n = -1; + FT_Int tmp; + + + if ( afm_parser_read_int( parser, &tmp ) ) + goto Fail; + + if ( tmp < 0 ) + { + FT_ERROR(( "afm_parse_kern_pairs: invalid number of kern pairs\n" )); + goto Fail; + } + + fi->NumKernPair = (FT_UInt)tmp; + FT_TRACE3(( "afm_parse_kern_pairs: %u kern pair%s expected\n", + fi->NumKernPair, + fi->NumKernPair == 1 ? "" : "s" )); + + /* Rough sanity check: The minimum line length of the `KP`, */ + /* `KPH`,`KPX`, and `KPY` commands is 10 characters (including */ + /* the EOL character). */ + if ( (FT_ULong)( stream->limit - stream->cursor ) / 10 < + fi->NumKernPair ) + { + FT_ERROR(( "afm_parse_kern_pairs:" + " number of kern pairs exceeds stream size\n" )); + goto Fail; + } + + if ( fi->NumKernPair ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + switch ( token ) + { + case AFM_TOKEN_KP: + case AFM_TOKEN_KPX: + case AFM_TOKEN_KPY: + { + FT_Int r; + AFM_ValueRec shared_vals[4]; + + + n++; + + if ( n >= (int)fi->NumKernPair ) + { + FT_ERROR(( "afm_parse_kern_pairs: too many kern pairs\n" )); + goto Fail; + } + + kp = fi->KernPairs + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INDEX; + shared_vals[1].type = AFM_VALUE_TYPE_INDEX; + shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; + r = afm_parser_read_vals( parser, shared_vals, 4 ); + if ( r < 3 ) + { + FT_ERROR(( "afm_parse_kern_pairs:" + " insufficient number of parameters for entry %d\n", + n )); + goto Fail; + } + + /* index values can't be negative */ + kp->index1 = shared_vals[0].u.u; + kp->index2 = shared_vals[1].u.u; + if ( token == AFM_TOKEN_KPY ) + { + kp->x = 0; + kp->y = shared_vals[2].u.i; + } + else + { + kp->x = shared_vals[2].u.i; + kp->y = ( token == AFM_TOKEN_KP && r == 4 ) + ? shared_vals[3].u.i : 0; + } + } + break; + + case AFM_TOKEN_ENDKERNPAIRS: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + tmp = n + 1; + if ( (FT_UInt)tmp != fi->NumKernPair ) + { + FT_TRACE1(( "afm_parse_kern_pairs: %s%d kern pair%s seen\n", + tmp == 0 ? "" : "only ", + tmp, + tmp == 1 ? "" : "s" )); + fi->NumKernPair = (FT_UInt)tmp; + } + else + FT_TRACE3(( "afm_parse_kern_pairs: %d kern pair%s seen\n", + tmp, + tmp == 1 ? "" : "s" )); + + ft_qsort( fi->KernPairs, fi->NumKernPair, + sizeof ( AFM_KernPairRec ), + afm_compare_kern_pairs ); + return FT_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + + static FT_Error + afm_parse_kern_data( AFM_Parser parser ) + { + FT_Error error; + char* key; + FT_Offset len; + + int have_trackkern = 0; + int have_kernpairs = 0; + + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_STARTTRACKKERN: + if ( have_trackkern ) + { + FT_ERROR(( "afm_parse_kern_data:" + " invalid second horizontal track kern section\n" )); + goto Fail; + } + + error = afm_parse_track_kern( parser ); + if ( error ) + return error; + + have_trackkern = 1; + break; + + case AFM_TOKEN_STARTKERNPAIRS: + case AFM_TOKEN_STARTKERNPAIRS0: + if ( have_kernpairs ) + { + FT_ERROR(( "afm_parse_kern_data:" + " invalid second horizontal kern pair section\n" )); + goto Fail; + } + + error = afm_parse_kern_pairs( parser ); + if ( error ) + return error; + + have_kernpairs = 1; + break; + + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + return FT_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + + static FT_Error + afm_parser_skip_section( AFM_Parser parser, + FT_Int n, + AFM_Token end_section ) + { + char* key; + FT_Offset len; + + + while ( n-- > 0 ) + { + key = afm_parser_next_key( parser, 1, NULL ); + if ( !key ) + goto Fail; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) + return FT_Err_Ok; + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_parse( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + AFM_FontInfo fi = parser->FontInfo; + FT_Error error = FT_ERR( Syntax_Error ); + char* key; + FT_Offset len; + FT_Int metrics_sets = 0; + + + if ( !fi ) + return FT_THROW( Invalid_Argument ); + + key = afm_parser_next_key( parser, 1, &len ); + if ( !key || len != 16 || + ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) + return FT_THROW( Unknown_File_Format ); + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[4]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_METRICSSETS: + if ( afm_parser_read_int( parser, &metrics_sets ) ) + goto Fail; + + if ( metrics_sets != 0 && metrics_sets != 2 ) + { + error = FT_THROW( Unimplemented_Feature ); + + goto Fail; + } + break; + + case AFM_TOKEN_ISCIDFONT: + shared_vals[0].type = AFM_VALUE_TYPE_BOOL; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->IsCIDFont = shared_vals[0].u.b; + break; + + case AFM_TOKEN_FONTBBOX: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) + goto Fail; + + fi->FontBBox.xMin = shared_vals[0].u.f; + fi->FontBBox.yMin = shared_vals[1].u.f; + fi->FontBBox.xMax = shared_vals[2].u.f; + fi->FontBBox.yMax = shared_vals[3].u.f; + break; + + case AFM_TOKEN_ASCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Ascender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_DESCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Descender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_STARTCHARMETRICS: + { + FT_Int n = 0; + + + if ( afm_parser_read_int( parser, &n ) ) + goto Fail; + + error = afm_parser_skip_section( parser, n, + AFM_TOKEN_ENDCHARMETRICS ); + if ( error ) + return error; + } + break; + + case AFM_TOKEN_STARTKERNDATA: + error = afm_parse_kern_data( parser ); + if ( error ) + goto Fail; + /* we only support kern data, so ... */ + FALL_THROUGH; + + case AFM_TOKEN_ENDFONTMETRICS: + return FT_Err_Ok; + + default: + break; + } + } + + Fail: + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + fi->IsCIDFont = 0; + + return error; + } + +#else /* T1_CONFIG_OPTION_NO_AFM */ + + /* ANSI C doesn't like empty source files */ + typedef int afm_parse_dummy_; + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + +/* END */ diff --git a/external/freetype/src/psaux/afmparse.h b/external/freetype/src/psaux/afmparse.h new file mode 100644 index 000000000..2d3b6e6e1 --- /dev/null +++ b/external/freetype/src/psaux/afmparse.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * + * afmparse.h + * + * AFM parser (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef AFMPARSE_H_ +#define AFMPARSE_H_ + + +#include <freetype/internal/psaux.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ); + + + FT_LOCAL( FT_Error ) + afm_parser_parse( AFM_Parser parser ); + + + enum AFM_ValueType_ + { + AFM_VALUE_TYPE_STRING, + AFM_VALUE_TYPE_NAME, + AFM_VALUE_TYPE_FIXED, /* real number */ + AFM_VALUE_TYPE_INTEGER, + AFM_VALUE_TYPE_BOOL, + AFM_VALUE_TYPE_INDEX /* glyph index */ + }; + + + typedef struct AFM_ValueRec_ + { + enum AFM_ValueType_ type; + union + { + char* s; + FT_Fixed f; + FT_Int i; + FT_UInt u; + FT_Bool b; + + } u; + + } AFM_ValueRec, *AFM_Value; + +#define AFM_MAX_ARGUMENTS 5 + + FT_LOCAL( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_Int n ); + + /* read the next key from the next line or column */ + FT_LOCAL( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ); + +FT_END_HEADER + +#endif /* AFMPARSE_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/cffdecode.c b/external/freetype/src/psaux/cffdecode.c new file mode 100644 index 000000000..562d17d22 --- /dev/null +++ b/external/freetype/src/psaux/cffdecode.c @@ -0,0 +1,2423 @@ +/**************************************************************************** + * + * cffdecode.c + * + * PostScript CFF (Type 2) decoding routines (body). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftserv.h> +#include <freetype/internal/services/svcfftl.h> + +#include "cffdecode.h" +#include "psobjs.h" + +#include "psauxerr.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cffdecode + + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + + typedef enum CFF_Operator_ + { + cff_op_unknown = 0, + + cff_op_rmoveto, + cff_op_hmoveto, + cff_op_vmoveto, + + cff_op_rlineto, + cff_op_hlineto, + cff_op_vlineto, + + cff_op_rrcurveto, + cff_op_hhcurveto, + cff_op_hvcurveto, + cff_op_rcurveline, + cff_op_rlinecurve, + cff_op_vhcurveto, + cff_op_vvcurveto, + + cff_op_flex, + cff_op_hflex, + cff_op_hflex1, + cff_op_flex1, + + cff_op_endchar, + + cff_op_hstem, + cff_op_vstem, + cff_op_hstemhm, + cff_op_vstemhm, + + cff_op_hintmask, + cff_op_cntrmask, + cff_op_dotsection, /* deprecated, acts as no-op */ + + cff_op_abs, + cff_op_add, + cff_op_sub, + cff_op_div, + cff_op_neg, + cff_op_random, + cff_op_mul, + cff_op_sqrt, + + cff_op_blend, + + cff_op_drop, + cff_op_exch, + cff_op_index, + cff_op_roll, + cff_op_dup, + + cff_op_put, + cff_op_get, + cff_op_store, + cff_op_load, + + cff_op_and, + cff_op_or, + cff_op_not, + cff_op_eq, + cff_op_ifelse, + + cff_op_callsubr, + cff_op_callgsubr, + cff_op_return, + + /* Type 1 opcodes: invalid but seen in real life */ + cff_op_hsbw, + cff_op_closepath, + cff_op_callothersubr, + cff_op_pop, + cff_op_seac, + cff_op_sbw, + cff_op_setcurrentpoint, + + /* do not remove */ + cff_op_max + + } CFF_Operator; + + +#define CFF_COUNT_CHECK_WIDTH 0x80 +#define CFF_COUNT_EXACT 0x40 +#define CFF_COUNT_CLEAR_STACK 0x20 + + /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ + /* used for checking the width and requested numbers of arguments */ + /* only; they are set to zero afterwards */ + + /* the other two flags are informative only and unused currently */ + + static const FT_Byte cff_argument_counts[] = + { + 0, /* unknown */ + + 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + + 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 13, /* flex */ + 7, + 9, + 11, + + 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ + + 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + + 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ + 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ + 0, /* dotsection */ + + 1, /* abs */ + 2, + 2, + 2, + 1, + 0, + 2, + 1, + + 1, /* blend */ + + 1, /* drop */ + 2, + 1, + 2, + 1, + + 2, /* put */ + 1, + 4, + 3, + + 2, /* and */ + 2, + 1, + 2, + 4, + + 1, /* callsubr */ + 1, + 0, + + 2, /* hsbw */ + 0, + 0, + 0, + 5, /* seac */ + 4, /* sbw */ + 2 /* setcurrentpoint */ + }; + + + static FT_Error + cff_operator_seac( CFF_Decoder* decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + CFF_Builder* builder = &decoder->builder; + FT_Int bchar_index, achar_index; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; + FT_Pos glyph_width; + + + if ( decoder->seac ) + { + FT_ERROR(( "cff_operator_seac: invalid nested seac\n" )); + return FT_THROW( Syntax_Error ); + } + + adx = ADD_LONG( adx, decoder->builder.left_bearing.x ); + ady = ADD_LONG( ady, decoder->builder.left_bearing.y ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( face->root.internal->incremental_interface ) + { + bchar_index = bchar; + achar_index = achar; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + CFF_Font cff = (CFF_Font)( face->extra.data ); + + + bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); + achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "cff_operator_seac:" + " invalid seac character code arguments\n" )); + return FT_THROW( Syntax_Error ); + } + + /* If we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( builder->no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)( adx >> 16 ); + subg->arg2 = (FT_Int)( ady >> 16 ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + } + + FT_GlyphLoader_Prepare( builder->loader ); + + /* First load `bchar' in builder */ + error = decoder->get_glyph_callback( face, (FT_UInt)bchar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len, 0 ); + decoder->seac = FALSE; + + decoder->free_glyph_callback( face, &charstring, charstring_len ); + + if ( error ) + goto Exit; + } + + /* Save the left bearing, advance and glyph width of the base */ + /* character as they will be erased by the next load. */ + + left_bearing = builder->left_bearing; + advance = builder->advance; + glyph_width = decoder->glyph_width; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = SUB_LONG( adx, asb ); + builder->pos_y = ady; + + /* Now load `achar' on top of the base outline. */ + error = decoder->get_glyph_callback( face, (FT_UInt)achar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len, 0 ); + decoder->seac = FALSE; + + decoder->free_glyph_callback( face, &charstring, charstring_len ); + + if ( error ) + goto Exit; + } + + /* Restore the left side bearing, advance and glyph width */ + /* of the base character. */ + builder->left_bearing = left_bearing; + builder->advance = advance; + decoder->glyph_width = glyph_width; + + builder->pos_x = 0; + builder->pos_y = 0; + + Exit: + return error; + } + +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** GENERIC CHARSTRING PARSING *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @Function: + * cff_compute_bias + * + * @Description: + * Computes the bias value in dependence of the number of glyph + * subroutines. + * + * @Input: + * in_charstring_type :: + * The `CharstringType' value of the top DICT + * dictionary. + * + * num_subrs :: + * The number of glyph subroutines. + * + * @Return: + * The bias value. + */ + static FT_Int + cff_compute_bias( FT_Int in_charstring_type, + FT_UInt num_subrs ) + { + FT_Int result; + + + if ( in_charstring_type == 1 ) + result = 0; + else if ( num_subrs < 1240 ) + result = 107; + else if ( num_subrs < 33900U ) + result = 1131; + else + result = 32768U; + + return result; + } + + + FT_LOCAL_DEF( FT_Int ) + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ) + { + FT_UInt n; + FT_UShort glyph_sid; + + FT_Service_CFFLoad cffload; + + + /* CID-keyed fonts don't have glyph names */ + if ( !cff->charset.sids ) + return -1; + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + +#if 0 + /* retrieve cffload from list of current modules */ + FT_Service_CFFLoad cffload; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD ); + if ( !cffload ) + { + FT_ERROR(( "cff_lookup_glyph_by_stdcharcode:" + " the `cffload' module is not available\n" )); + return FT_THROW( Unimplemented_Feature ); + } +#endif + + cffload = (FT_Service_CFFLoad)cff->cffload; + + /* Get code to SID mapping from `cff_standard_encoding'. */ + glyph_sid = cffload->get_standard_encoding( (FT_UInt)charcode ); + + for ( n = 0; n < cff->num_glyphs; n++ ) + { + if ( cff->charset.sids[n] == glyph_sid ) + return (FT_Int)n; + } + + return -1; + } + + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + + /************************************************************************** + * + * @Function: + * cff_decoder_parse_charstrings + * + * @Description: + * Parses a given Type 2 charstrings program. + * + * @InOut: + * decoder :: + * The current Type 1 decoder. + * + * @Input: + * charstring_base :: + * The base of the charstring stream. + * + * charstring_len :: + * The length in bytes of the charstring stream. + * + * in_dict :: + * Set to 1 if function is called from top or + * private DICT (needed for Multiple Master CFFs). + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len, + FT_Bool in_dict ) + { + FT_Error error; + CFF_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + CFF_Builder* builder = &decoder->builder; + FT_Pos x, y; + FT_Fixed* stack; + FT_Int charstring_type = + decoder->cff->top_font.font_dict.charstring_type; + FT_UShort num_designs = + decoder->cff->top_font.font_dict.num_designs; + FT_UShort num_axes = + decoder->cff->top_font.font_dict.num_axes; + + T2_Hints_Funcs hinter; + + + /* set default width */ + decoder->num_hints = 0; + decoder->read_width = 1; + + /* initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + stack = decoder->top; + + hinter = (T2_Hints_Funcs)builder->hints_funcs; + + builder->path_begun = 0; + + if ( !charstring_base ) + return FT_Err_Ok; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = FT_Err_Ok; + + x = builder->pos_x; + y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + /* now execute loop */ + while ( ip < limit ) + { + CFF_Operator op; + FT_Byte v; + + + /********************************************************************* + * + * Decode operator or operand + */ + v = *ip++; + if ( v >= 32 || v == 28 ) + { + FT_Int shift = 16; + FT_Int32 val; + + + /* this is an operand, push it on the stack */ + + /* if we use shifts, all computations are done with unsigned */ + /* values; the conversion to a signed value is the last step */ + if ( v == 28 ) + { + if ( ip + 1 >= limit ) + goto Syntax_Error; + val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] ); + ip += 2; + } + else if ( v < 247 ) + val = (FT_Int32)v - 139; + else if ( v < 251 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108; + } + else if ( v < 255 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108; + } + else + { + if ( ip + 3 >= limit ) + goto Syntax_Error; + val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | + ( (FT_UInt32)ip[1] << 16 ) | + ( (FT_UInt32)ip[2] << 8 ) | + (FT_UInt32)ip[3] ); + ip += 4; + if ( charstring_type == 2 ) + shift = 0; + } + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + val = (FT_Int32)( (FT_UInt32)val << shift ); + *decoder->top++ = val; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( val & 0xFFFFL ) ) + FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) )); + else + FT_TRACE4(( " %.5f", val / 65536.0 )); +#endif + + } + else + { + /* The specification says that normally arguments are to be taken */ + /* from the bottom of the stack. However, this seems not to be */ + /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ + /* arguments similar to a PS interpreter. */ + + FT_Fixed* args = decoder->top; + FT_Int num_args = (FT_Int)( args - decoder->stack ); + FT_Int req_args; + + + /* find operator */ + op = cff_op_unknown; + + switch ( v ) + { + case 1: + op = cff_op_hstem; + break; + case 3: + op = cff_op_vstem; + break; + case 4: + op = cff_op_vmoveto; + break; + case 5: + op = cff_op_rlineto; + break; + case 6: + op = cff_op_hlineto; + break; + case 7: + op = cff_op_vlineto; + break; + case 8: + op = cff_op_rrcurveto; + break; + case 9: + op = cff_op_closepath; + break; + case 10: + op = cff_op_callsubr; + break; + case 11: + op = cff_op_return; + break; + case 12: + if ( ip >= limit ) + goto Syntax_Error; + v = *ip++; + + switch ( v ) + { + case 0: + op = cff_op_dotsection; + break; + case 1: /* this is actually the Type1 vstem3 operator */ + op = cff_op_vstem; + break; + case 2: /* this is actually the Type1 hstem3 operator */ + op = cff_op_hstem; + break; + case 3: + op = cff_op_and; + break; + case 4: + op = cff_op_or; + break; + case 5: + op = cff_op_not; + break; + case 6: + op = cff_op_seac; + break; + case 7: + op = cff_op_sbw; + break; + case 8: + op = cff_op_store; + break; + case 9: + op = cff_op_abs; + break; + case 10: + op = cff_op_add; + break; + case 11: + op = cff_op_sub; + break; + case 12: + op = cff_op_div; + break; + case 13: + op = cff_op_load; + break; + case 14: + op = cff_op_neg; + break; + case 15: + op = cff_op_eq; + break; + case 16: + op = cff_op_callothersubr; + break; + case 17: + op = cff_op_pop; + break; + case 18: + op = cff_op_drop; + break; + case 20: + op = cff_op_put; + break; + case 21: + op = cff_op_get; + break; + case 22: + op = cff_op_ifelse; + break; + case 23: + op = cff_op_random; + break; + case 24: + op = cff_op_mul; + break; + case 26: + op = cff_op_sqrt; + break; + case 27: + op = cff_op_dup; + break; + case 28: + op = cff_op_exch; + break; + case 29: + op = cff_op_index; + break; + case 30: + op = cff_op_roll; + break; + case 33: + op = cff_op_setcurrentpoint; + break; + case 34: + op = cff_op_hflex; + break; + case 35: + op = cff_op_flex; + break; + case 36: + op = cff_op_hflex1; + break; + case 37: + op = cff_op_flex1; + break; + default: + FT_TRACE4(( " unknown op (12, %d)\n", v )); + break; + } + break; + case 13: + op = cff_op_hsbw; + break; + case 14: + op = cff_op_endchar; + break; + case 16: + op = cff_op_blend; + break; + case 18: + op = cff_op_hstemhm; + break; + case 19: + op = cff_op_hintmask; + break; + case 20: + op = cff_op_cntrmask; + break; + case 21: + op = cff_op_rmoveto; + break; + case 22: + op = cff_op_hmoveto; + break; + case 23: + op = cff_op_vstemhm; + break; + case 24: + op = cff_op_rcurveline; + break; + case 25: + op = cff_op_rlinecurve; + break; + case 26: + op = cff_op_vvcurveto; + break; + case 27: + op = cff_op_hhcurveto; + break; + case 29: + op = cff_op_callgsubr; + break; + case 30: + op = cff_op_vhcurveto; + break; + case 31: + op = cff_op_hvcurveto; + break; + default: + FT_TRACE4(( " unknown op (%d)\n", v )); + break; + } + + if ( op == cff_op_unknown ) + continue; + + /* in Multiple Master CFFs, T2 charstrings can appear in */ + /* dictionaries, but some operators are prohibited */ + if ( in_dict ) + { + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_vmoveto: + case cff_op_rlineto: + case cff_op_hlineto: + case cff_op_vlineto: + case cff_op_rrcurveto: + case cff_op_hstemhm: + case cff_op_hintmask: + case cff_op_cntrmask: + case cff_op_rmoveto: + case cff_op_hmoveto: + case cff_op_vstemhm: + case cff_op_rcurveline: + case cff_op_rlinecurve: + case cff_op_vvcurveto: + case cff_op_hhcurveto: + case cff_op_vhcurveto: + case cff_op_hvcurveto: + case cff_op_hflex: + case cff_op_flex: + case cff_op_hflex1: + case cff_op_flex1: + case cff_op_callsubr: + case cff_op_callgsubr: + /* deprecated opcodes */ + case cff_op_dotsection: + /* invalid Type 1 opcodes */ + case cff_op_hsbw: + case cff_op_closepath: + case cff_op_callothersubr: + case cff_op_seac: + case cff_op_sbw: + case cff_op_setcurrentpoint: + goto MM_Error; + + default: + break; + } + } + + /* check arguments */ + req_args = cff_argument_counts[op]; + if ( req_args & CFF_COUNT_CHECK_WIDTH ) + { + if ( num_args > 0 && decoder->read_width ) + { + /* If `nominal_width' is non-zero, the number is really a */ + /* difference against `nominal_width'. Else, the number here */ + /* is truly a width, not a difference against `nominal_width'. */ + /* If the font does not set `nominal_width', then */ + /* `nominal_width' defaults to zero, and so we can set */ + /* `glyph_width' to `nominal_width' plus number on the stack */ + /* -- for either case. */ + + FT_Int set_width_ok; + + + switch ( op ) + { + case cff_op_hmoveto: + case cff_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + case cff_op_rmoveto: + case cff_op_hintmask: + case cff_op_cntrmask: + set_width_ok = num_args & 1; + break; + + case cff_op_endchar: + /* If there is a width specified for endchar, we either have */ + /* 1 argument or 5 arguments. We like to argue. */ + set_width_ok = in_dict + ? 0 + : ( ( num_args == 5 ) || ( num_args == 1 ) ); + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + + ( stack[0] >> 16 ); + + if ( decoder->width_only ) + { + /* we only want the advance width; stop here */ + break; + } + + /* Consumed an argument. */ + num_args--; + } + } + + decoder->read_width = 0; + req_args = 0; + } + + req_args &= 0x000F; + if ( num_args < req_args ) + goto Stack_Underflow; + args -= req_args; + num_args -= req_args; + + /* At this point, `args' points to the first argument of the */ + /* operand in case `req_args' isn't zero. Otherwise, we have */ + /* to adjust `args' manually. */ + + /* Note that we only pop arguments from the stack which we */ + /* really need and can digest so that we can continue in case */ + /* of superfluous stack elements. */ + + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + /* the number of arguments is always even here */ + FT_TRACE4(( "%s\n", + op == cff_op_hstem ? " hstem" : + ( op == cff_op_vstem ? " vstem" : + ( op == cff_op_hstemhm ? " hstemhm" : " vstemhm" ) ) )); + + if ( hinter ) + hinter->stems( hinter->hints, + ( op == cff_op_hstem || op == cff_op_hstemhm ), + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + args = stack; + break; + + case cff_op_hintmask: + case cff_op_cntrmask: + FT_TRACE4(( "%s", op == cff_op_hintmask ? " hintmask" + : " cntrmask" )); + + /* implement vstem when needed -- */ + /* the specification doesn't say it, but this also works */ + /* with the 'cntrmask' operator */ + /* */ + if ( num_args > 0 ) + { + if ( hinter ) + hinter->stems( hinter->hints, + 0, + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + } + + /* In a valid charstring there must be at least one byte */ + /* after `hintmask' or `cntrmask' (e.g., for a `return' */ + /* instruction). Additionally, there must be space for */ + /* `num_hints' bits. */ + + if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit ) + goto Syntax_Error; + + if ( hinter ) + { + if ( op == cff_op_hintmask ) + hinter->hintmask( hinter->hints, + (FT_UInt)builder->current->n_points, + (FT_UInt)decoder->num_hints, + ip ); + else + hinter->counter( hinter->hints, + (FT_UInt)decoder->num_hints, + ip ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt maskbyte; + + + FT_TRACE4(( " (maskbytes:" )); + + for ( maskbyte = 0; + maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 ); + maskbyte++, ip++ ) + FT_TRACE4(( " 0x%02X", *ip )); + + FT_TRACE4(( ")\n" )); + } +#else + ip += ( decoder->num_hints + 7 ) >> 3; +#endif + args = stack; + break; + + case cff_op_rmoveto: + FT_TRACE4(( " rmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x = ADD_LONG( x, args[-2] ); + y = ADD_LONG( y, args[-1] ); + args = stack; + break; + + case cff_op_vmoveto: + FT_TRACE4(( " vmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + y = ADD_LONG( y, args[-1] ); + args = stack; + break; + + case cff_op_hmoveto: + FT_TRACE4(( " hmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x = ADD_LONG( x, args[-1] ); + args = stack; + break; + + case cff_op_rlineto: + FT_TRACE4(( " rlineto\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_args / 2 ) ) + goto Fail; + + if ( num_args < 2 ) + goto Stack_Underflow; + + args -= num_args & ~1; + while ( args < decoder->top ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + } + args = stack; + break; + + case cff_op_hlineto: + case cff_op_vlineto: + { + FT_Int phase = ( op == cff_op_hlineto ); + + + FT_TRACE4(( "%s\n", op == cff_op_hlineto ? " hlineto" + : " vlineto" )); + + if ( num_args < 0 ) + goto Stack_Underflow; + + /* there exist subsetted fonts (found in PDFs) */ + /* which call `hlineto' without arguments */ + if ( num_args == 0 ) + break; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_args ) ) + goto Fail; + + args = stack; + while ( args < decoder->top ) + { + if ( phase ) + x = ADD_LONG( x, args[0] ); + else + y = ADD_LONG( y, args[0] ); + + if ( cff_builder_add_point1( builder, x, y ) ) + goto Fail; + + args++; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rrcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " rrcurveto\n" )); + + if ( num_args < 6 ) + goto Stack_Underflow; + + nargs = num_args - num_args % 6; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, nargs / 2 ) ) + goto Fail; + + args -= nargs; + while ( args < decoder->top ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[4] ); + y = ADD_LONG( y, args[5] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 6; + } + args = stack; + } + break; + + case cff_op_vvcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " vvcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + + nargs = num_args & ~2; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + + if ( nargs & 1 ) + { + x = ADD_LONG( x, args[0] ); + args++; + nargs--; + } + + if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + y = ADD_LONG( y, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 4; + } + args = stack; + } + break; + + case cff_op_hhcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " hhcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + + nargs = num_args & ~2; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + if ( nargs & 1 ) + { + y = ADD_LONG( y, args[0] ); + args++; + nargs--; + } + + if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + x = ADD_LONG( x, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[3] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 4; + } + args = stack; + } + break; + + case cff_op_vhcurveto: + case cff_op_hvcurveto: + { + FT_Int phase; + FT_Int nargs; + + + FT_TRACE4(( "%s\n", op == cff_op_vhcurveto ? " vhcurveto" + : " hvcurveto" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ + /* we enforce it by clearing the second bit */ + + nargs = num_args & ~2; + + args -= nargs; + if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) ) + goto Stack_Underflow; + + phase = ( op == cff_op_hvcurveto ); + + while ( nargs >= 4 ) + { + nargs -= 4; + if ( phase ) + { + x = ADD_LONG( x, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + y = ADD_LONG( y, args[3] ); + if ( nargs == 1 ) + x = ADD_LONG( x, args[4] ); + cff_builder_add_point( builder, x, y, 1 ); + } + else + { + y = ADD_LONG( y, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[3] ); + if ( nargs == 1 ) + y = ADD_LONG( y, args[4] ); + cff_builder_add_point( builder, x, y, 1 ); + } + args += 4; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rlinecurve: + { + FT_Int num_lines; + FT_Int nargs; + + + FT_TRACE4(( " rlinecurve\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args & ~1; + num_lines = ( nargs - 6 ) / 2; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_lines + 3 ) ) + goto Fail; + + args -= nargs; + + /* first, add the line segments */ + while ( num_lines > 0 ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 2; + num_lines--; + } + + /* then the curve */ + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[4] ); + y = ADD_LONG( y, args[5] ); + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + } + break; + + case cff_op_rcurveline: + { + FT_Int num_curves; + FT_Int nargs; + + + FT_TRACE4(( " rcurveline\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args - 2; + nargs = nargs - nargs % 6 + 2; + num_curves = ( nargs - 2 ) / 6; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_curves * 3 + 2 ) ) + goto Fail; + + args -= nargs; + + /* first, add the curves */ + while ( num_curves > 0 ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[4] ); + y = ADD_LONG( y, args[5] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 6; + num_curves--; + } + + /* then the final line */ + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + } + break; + + case cff_op_hflex1: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex1\n" )); + + /* adding five more points: 4 control points, 1 on-curve point */ + /* -- make sure we have enough space for the start point if it */ + /* needs to be added */ + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y position for later use */ + start_y = y; + + /* first control point */ + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x = ADD_LONG( x, args[4] ); + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x = ADD_LONG( x, args[5] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x = ADD_LONG( x, args[6] ); + y = ADD_LONG( y, args[7] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start */ + x = ADD_LONG( x, args[8] ); + y = start_y; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_hflex: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y-position for later use */ + start_y = y; + + /* first control point */ + x = ADD_LONG( x, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x = ADD_LONG( x, args[3] ); + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x = ADD_LONG( x, args[4] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x = ADD_LONG( x, args[5] ); + y = start_y; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start point's */ + /* y-value -- we don't add this point, though */ + x = ADD_LONG( x, args[6] ); + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex1: + { + FT_Pos start_x, start_y; /* record start x, y values for */ + /* alter use */ + FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; + FT_Fixed* temp; + + + FT_TRACE4(( " flex1\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's x, y position for later use */ + start_x = x; + start_y = y; + + /* XXX: figure out whether this is supposed to be a horizontal */ + /* or vertical flex; the Type 2 specification is vague... */ + + temp = args; + + /* grab up to the last argument */ + for ( count = 5; count > 0; count-- ) + { + dx = ADD_LONG( dx, temp[0] ); + dy = ADD_LONG( dy, temp[1] ); + temp += 2; + } + + if ( dx < 0 ) + dx = NEG_LONG( dx ); + if ( dy < 0 ) + dy = NEG_LONG( dy ); + + /* strange test, but here it is... */ + horizontal = ( dx > dy ); + + for ( count = 5; count > 0; count-- ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, + FT_BOOL( count == 3 ) ); + args += 2; + } + + /* is last operand an x- or y-delta? */ + if ( horizontal ) + { + x = ADD_LONG( x, args[0] ); + y = start_y; + } + else + { + x = start_x; + y = ADD_LONG( y, args[0] ); + } + + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex: + { + FT_UInt count; + + + FT_TRACE4(( " flex\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + for ( count = 6; count > 0; count-- ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, + FT_BOOL( count == 4 || count == 1 ) ); + args += 2; + } + + args = stack; + } + break; + + case cff_op_seac: + FT_TRACE4(( " seac\n" )); + + error = cff_operator_seac( decoder, + args[0], args[1], args[2], + (FT_Int)( args[3] >> 16 ), + (FT_Int)( args[4] >> 16 ) ); + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_endchar: + /* in dictionaries, `endchar' simply indicates end of data */ + if ( in_dict ) + return error; + + FT_TRACE4(( " endchar\n" )); + + /* We are going to emulate the seac operator. */ + if ( num_args >= 4 ) + { + /* Save glyph width so that the subglyphs don't overwrite it. */ + FT_Pos glyph_width = decoder->glyph_width; + + + error = cff_operator_seac( decoder, + 0L, args[-4], args[-3], + (FT_Int)( args[-2] >> 16 ), + (FT_Int)( args[-1] >> 16 ) ); + + decoder->glyph_width = glyph_width; + } + else + { + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + (FT_UInt)builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + error = hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + if ( error ) + goto Fail; + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + } + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_abs: + FT_TRACE4(( " abs\n" )); + + if ( args[0] < 0 ) + { + if ( args[0] == FT_LONG_MIN ) + args[0] = FT_LONG_MAX; + else + args[0] = -args[0]; + } + args++; + break; + + case cff_op_add: + FT_TRACE4(( " add\n" )); + + args[0] = ADD_LONG( args[0], args[1] ); + args++; + break; + + case cff_op_sub: + FT_TRACE4(( " sub\n" )); + + args[0] = SUB_LONG( args[0], args[1] ); + args++; + break; + + case cff_op_div: + FT_TRACE4(( " div\n" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case cff_op_neg: + FT_TRACE4(( " neg\n" )); + + if ( args[0] == FT_LONG_MIN ) + args[0] = FT_LONG_MAX; + args[0] = -args[0]; + args++; + break; + + case cff_op_random: + { + FT_UInt32* randval = in_dict ? &decoder->cff->top_font.random + : &decoder->current_subfont->random; + + + FT_TRACE4(( " random\n" )); + + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + args[0] = (FT_Fixed)( ( *randval & 0xFFFF ) + 1 ); + args++; + + *randval = cff_random( *randval ); + } + break; + + case cff_op_mul: + FT_TRACE4(( " mul\n" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case cff_op_sqrt: + FT_TRACE4(( " sqrt\n" )); + + /* without upper limit the loop below might not finish */ + if ( args[0] > 0x7FFFFFFFL ) + args[0] = 46341; + else if ( args[0] > 0 ) + { + FT_Fixed root = args[0]; + FT_Fixed new_root; + + + for (;;) + { + new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; + if ( new_root == root ) + break; + root = new_root; + } + args[0] = new_root; + } + else + args[0] = 0; + args++; + break; + + case cff_op_drop: + /* nothing */ + FT_TRACE4(( " drop\n" )); + + break; + + case cff_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch\n" )); + + tmp = args[0]; + args[0] = args[1]; + args[1] = tmp; + args += 2; + } + break; + + case cff_op_index: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " index\n" )); + + if ( idx < 0 ) + idx = 0; + else if ( idx > num_args - 2 ) + idx = num_args - 2; + args[0] = args[-( idx + 1 )]; + args++; + } + break; + + case cff_op_roll: + { + FT_Int count = (FT_Int)( args[0] >> 16 ); + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " roll\n" )); + + if ( count <= 0 ) + count = 1; + + args -= count; + if ( args < stack ) + goto Stack_Underflow; + + if ( idx >= 0 ) + { + idx = idx % count; + while ( idx > 0 ) + { + FT_Fixed tmp = args[count - 1]; + FT_Int i; + + + for ( i = count - 2; i >= 0; i-- ) + args[i + 1] = args[i]; + args[0] = tmp; + idx--; + } + } + else + { + /* before C99 it is implementation-defined whether */ + /* the result of `%' is negative if the first operand */ + /* is negative */ + idx = -( NEG_INT( idx ) % count ); + while ( idx < 0 ) + { + FT_Fixed tmp = args[0]; + FT_Int i; + + + for ( i = 0; i < count - 1; i++ ) + args[i] = args[i + 1]; + args[count - 1] = tmp; + idx++; + } + } + args += count; + } + break; + + case cff_op_dup: + FT_TRACE4(( " dup\n" )); + + args[1] = args[0]; + args += 2; + break; + + case cff_op_put: + { + FT_Fixed val = args[0]; + FT_UInt idx = (FT_UInt)( args[1] >> 16 ); + + + FT_TRACE4(( " put\n" )); + + /* the Type2 specification before version 16-March-2000 */ + /* didn't give a hard-coded size limit of the temporary */ + /* storage array; instead, an argument of the */ + /* `MultipleMaster' operator set the size */ + if ( idx < CFF_MAX_TRANS_ELEMENTS ) + decoder->buildchar[idx] = val; + } + break; + + case cff_op_get: + { + FT_UInt idx = (FT_UInt)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get\n" )); + + if ( idx < CFF_MAX_TRANS_ELEMENTS ) + val = decoder->buildchar[idx]; + + args[0] = val; + args++; + } + break; + + case cff_op_store: + /* this operator was removed from the Type2 specification */ + /* in version 16-March-2000 */ + + /* since we currently don't handle interpolation of multiple */ + /* master fonts, this is a no-op */ + FT_TRACE4(( " store\n" )); + break; + + case cff_op_load: + /* this operator was removed from the Type2 specification */ + /* in version 16-March-2000 */ + { + FT_UInt reg_idx = (FT_UInt)args[0]; + FT_UInt idx = (FT_UInt)args[1]; + FT_UInt count = (FT_UInt)args[2]; + + + FT_TRACE4(( " load\n" )); + + /* since we currently don't handle interpolation of multiple */ + /* master fonts, we store a vector [1 0 0 ...] in the */ + /* temporary storage array regardless of the Registry index */ + if ( reg_idx <= 2 && + idx < CFF_MAX_TRANS_ELEMENTS && + count <= num_axes ) + { + FT_UInt end, i; + + + end = FT_MIN( idx + count, CFF_MAX_TRANS_ELEMENTS ); + + if ( idx < end ) + decoder->buildchar[idx] = 1 << 16; + + for ( i = idx + 1; i < end; i++ ) + decoder->buildchar[i] = 0; + } + } + break; + + case cff_op_blend: + /* this operator was removed from the Type2 specification */ + /* in version 16-March-2000 */ + if ( num_designs ) + { + FT_Int num_results = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " blend\n" )); + + if ( num_results < 0 ) + goto Syntax_Error; + + if ( num_results > num_args || + num_results * (FT_Int)num_designs > num_args ) + goto Stack_Underflow; + + /* since we currently don't handle interpolation of multiple */ + /* master fonts, return the `num_results' values of the */ + /* first master */ + args -= num_results * ( num_designs - 1 ); + num_args -= num_results * ( num_designs - 1 ); + } + else + goto Syntax_Error; + break; + + case cff_op_dotsection: + /* this operator is deprecated and ignored by the parser */ + FT_TRACE4(( " dotsection\n" )); + break; + + case cff_op_closepath: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " closepath (invalid op)\n" )); + + args = stack; + break; + + case cff_op_hsbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " hsbw (invalid op)\n" )); + + decoder->glyph_width = + ADD_LONG( decoder->nominal_width, ( args[1] >> 16 ) ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = 0; + + x = ADD_LONG( decoder->builder.pos_x, args[0] ); + y = decoder->builder.pos_y; + args = stack; + break; + + case cff_op_sbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " sbw (invalid op)\n" )); + + decoder->glyph_width = + ADD_LONG( decoder->nominal_width, ( args[2] >> 16 ) ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = args[1]; + + x = ADD_LONG( decoder->builder.pos_x, args[0] ); + y = ADD_LONG( decoder->builder.pos_y, args[1] ); + args = stack; + break; + + case cff_op_setcurrentpoint: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " setcurrentpoint (invalid op)\n" )); + + x = ADD_LONG( decoder->builder.pos_x, args[0] ); + y = ADD_LONG( decoder->builder.pos_y, args[1] ); + args = stack; + break; + + case cff_op_callothersubr: + { + FT_Fixed arg; + + + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from */ + /* probably Type 1 to CFF, and some parsers seem to accept */ + /* it */ + + FT_TRACE4(( " callothersubr (invalid op)\n" )); + + /* subsequent `pop' operands should add the arguments, */ + /* this is the implementation described for `unknown' */ + /* other subroutines in the Type1 spec. */ + /* */ + /* XXX Fix return arguments (see discussion below). */ + + arg = 2 + ( args[-2] >> 16 ); + if ( arg >= CFF_MAX_OPERANDS ) + goto Stack_Underflow; + + args -= arg; + if ( args < stack ) + goto Stack_Underflow; + } + break; + + case cff_op_pop: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " pop (invalid op)\n" )); + + /* XXX Increasing `args' is wrong: After a certain number of */ + /* `pop's we get a stack overflow. Reason for doing it is */ + /* code like this (actually found in a CFF font): */ + /* */ + /* 17 1 3 callothersubr */ + /* pop */ + /* callsubr */ + /* */ + /* Since we handle `callothersubr' as a no-op, and */ + /* `callsubr' needs at least one argument, `pop' can't be a */ + /* no-op too as it basically should be. */ + /* */ + /* The right solution would be to provide real support for */ + /* `callothersubr' as done in `t1decode.c', however, given */ + /* the fact that CFF fonts with `pop' are invalid, it is */ + /* questionable whether it is worth the time. */ + args++; + break; + + case cff_op_and: + { + FT_Fixed cond = ( args[0] && args[1] ); + + + FT_TRACE4(( " and\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_or: + { + FT_Fixed cond = ( args[0] || args[1] ); + + + FT_TRACE4(( " or\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_not: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " not\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_eq: + { + FT_Fixed cond = ( args[0] == args[1] ); + + + FT_TRACE4(( " eq\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_ifelse: + { + FT_Fixed cond = ( args[2] <= args[3] ); + + + FT_TRACE4(( " ifelse\n" )); + + if ( !cond ) + args[0] = args[1]; + args++; + } + break; + + case cff_op_callsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->locals_bias ); + + + FT_TRACE4(( " callsubr (idx %d, entering level %td)\n", + idx, + zone - decoder->zones + 1 )); + + if ( idx >= decoder->num_locals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid local subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->locals[idx]; + zone->limit = decoder->locals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_callgsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->globals_bias ); + + + FT_TRACE4(( " callgsubr (idx %d, entering level %td)\n", + idx, + zone - decoder->zones + 1 )); + + if ( idx >= decoder->num_globals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid global subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->globals[idx]; + zone->limit = decoder->globals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_return: + FT_TRACE4(( " return (leaving level %td)\n", + decoder->zone - decoder->zones )); + + if ( decoder->zone <= decoder->zones ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + decoder->zone--; + zone = decoder->zone; + ip = zone->cursor; + limit = zone->limit; + break; + + default: + FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); + + if ( ip[-1] == 12 ) + FT_ERROR(( " %d", ip[0] )); + FT_ERROR(( "\n" )); + + return FT_THROW( Unimplemented_Feature ); + } + + decoder->top = args; + + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n" )); + FT_TRACE4(( "\n" )); + + Fail: + return error; + + MM_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings:" + " invalid opcode found in top DICT charstring\n")); + return FT_THROW( Invalid_File_Format ); + + Syntax_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" )); + return FT_THROW( Invalid_File_Format ); + + Stack_Underflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" )); + return FT_THROW( Too_Few_Arguments ); + + Stack_Overflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" )); + return FT_THROW( Stack_Overflow ); + } + +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /************************************************************************** + * + * @Function: + * cff_decoder_init + * + * @Description: + * Initializes a given glyph decoder. + * + * @InOut: + * decoder :: + * A pointer to the glyph builder to initialize. + * + * @Input: + * face :: + * The current face object. + * + * size :: + * The current size object. + * + * slot :: + * The current glyph object. + * + * hinting :: + * Whether hinting is active. + * + * hint_mode :: + * The hinting mode. + */ + FT_LOCAL_DEF( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode, + CFF_Decoder_Get_Glyph_Callback get_callback, + CFF_Decoder_Free_Glyph_Callback free_callback ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + /* clear everything */ + FT_ZERO( decoder ); + + /* initialize builder */ + cff_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* initialize Type2 decoder */ + decoder->cff = cff; + decoder->num_globals = cff->global_subrs_index.count; + decoder->globals = cff->global_subrs; + decoder->globals_bias = cff_compute_bias( + cff->top_font.font_dict.charstring_type, + decoder->num_globals ); + + decoder->hint_mode = hint_mode; + + decoder->get_glyph_callback = get_callback; + decoder->free_glyph_callback = free_callback; + } + + + /* this function is used to select the subfont */ + /* and the locals subrs array */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ) + { + CFF_Builder *builder = &decoder->builder; + CFF_Font cff = (CFF_Font)builder->face->extra.data; + CFF_SubFont sub = &cff->top_font; + FT_Error error = FT_Err_Ok; + + FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)cff->cffload; + + + /* manage CID fonts */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cffload->fd_select_get( &cff->fd_select, + glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + { + FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_TRACE3(( " in subfont %d:\n", fd_index )); + + sub = cff->subfonts[fd_index]; + + if ( builder->hints_funcs && size ) + { + FT_Size ftsize = FT_SIZE( size ); + CFF_Internal internal = (CFF_Internal)ftsize->internal->module_data; + + + /* for CFFs without subfonts, this value has already been set */ + builder->hints_globals = (void *)internal->subfonts[fd_index]; + } + } + + decoder->num_locals = sub->local_subrs_index.count; + decoder->locals = sub->local_subrs; + decoder->locals_bias = cff_compute_bias( + decoder->cff->top_font.font_dict.charstring_type, + decoder->num_locals ); + + decoder->glyph_width = sub->private_dict.default_width; + decoder->nominal_width = sub->private_dict.nominal_width; + + decoder->current_subfont = sub; + + Exit: + return error; + } + + +/* END */ diff --git a/external/freetype/src/psaux/cffdecode.h b/external/freetype/src/psaux/cffdecode.h new file mode 100644 index 000000000..e8bb4001c --- /dev/null +++ b/external/freetype/src/psaux/cffdecode.h @@ -0,0 +1,63 @@ +/**************************************************************************** + * + * cffdecode.h + * + * PostScript CFF (Type 2) decoding routines (specification). + * + * Copyright (C) 2017-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef CFFDECODE_H_ +#define CFFDECODE_H_ + + +#include <freetype/internal/psaux.h> + + +FT_BEGIN_HEADER + + FT_LOCAL( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode, + CFF_Decoder_Get_Glyph_Callback get_callback, + CFF_Decoder_Free_Glyph_Callback free_callback ); + + FT_LOCAL( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + + + FT_LOCAL( FT_Int ) + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ); + + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_LOCAL( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len, + FT_Bool in_dict ); +#endif + + +FT_END_HEADER + +#endif + + +/* END */ diff --git a/external/freetype/src/psaux/module.mk b/external/freetype/src/psaux/module.mk new file mode 100644 index 000000000..c6fb4eb50 --- /dev/null +++ b/external/freetype/src/psaux/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSaux module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSAUX_MODULE + +define PSAUX_MODULE +$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/psaux/psarrst.c b/external/freetype/src/psaux/psarrst.c new file mode 100644 index 000000000..70313d283 --- /dev/null +++ b/external/freetype/src/psaux/psarrst.c @@ -0,0 +1,240 @@ +/**************************************************************************** + * + * psarrst.c + * + * Adobe's code for Array Stacks (body). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> + +#include "psglue.h" +#include "psarrst.h" + +#include "pserror.h" + + + /* + * CF2_ArrStack uses an error pointer, to enable shared errors. + * Shared errors are necessary when multiple objects allow the program + * to continue after detecting errors. Only the first error should be + * recorded. + */ + + FT_LOCAL_DEF( void ) + cf2_arrstack_init( CF2_ArrStack arrstack, + FT_Memory memory, + FT_Error* error, + size_t sizeItem ) + { + FT_ASSERT( arrstack ); + + /* initialize the structure */ + arrstack->memory = memory; + arrstack->error = error; + arrstack->sizeItem = sizeItem; + arrstack->allocated = 0; + arrstack->count = 0; + arrstack->totalSize = 0; + arrstack->ptr = NULL; + } + + + FT_LOCAL_DEF( void ) + cf2_arrstack_finalize( CF2_ArrStack arrstack ) + { + FT_Memory memory = arrstack->memory; /* for FT_FREE */ + + + FT_ASSERT( arrstack ); + + arrstack->allocated = 0; + arrstack->count = 0; + arrstack->totalSize = 0; + + /* free the data buffer */ + FT_FREE( arrstack->ptr ); + } + + + /* allocate or reallocate the buffer size; */ + /* return false on memory error */ + static FT_Bool + cf2_arrstack_setNumElements( CF2_ArrStack arrstack, + size_t numElements ) + { + FT_ASSERT( arrstack ); + + { + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + FT_Memory memory = arrstack->memory; /* for FT_REALLOC */ + + size_t newSize = numElements * arrstack->sizeItem; + + + if ( numElements > FT_LONG_MAX / arrstack->sizeItem ) + goto exit; + + + FT_ASSERT( newSize > 0 ); /* avoid realloc with zero size */ + + if ( !FT_QREALLOC( arrstack->ptr, arrstack->totalSize, newSize ) ) + { + arrstack->allocated = numElements; + arrstack->totalSize = newSize; + + if ( arrstack->count > numElements ) + { + /* we truncated the list! */ + CF2_SET_ERROR( arrstack->error, Stack_Overflow ); + arrstack->count = numElements; + return FALSE; + } + + return TRUE; /* success */ + } + } + + exit: + /* if there's not already an error, store this one */ + CF2_SET_ERROR( arrstack->error, Out_Of_Memory ); + + return FALSE; + } + + + /* set the count, ensuring allocation is sufficient */ + FT_LOCAL_DEF( void ) + cf2_arrstack_setCount( CF2_ArrStack arrstack, + size_t numElements ) + { + FT_ASSERT( arrstack ); + + if ( numElements > arrstack->allocated ) + { + /* expand the allocation first */ + if ( !cf2_arrstack_setNumElements( arrstack, numElements ) ) + return; + } + + arrstack->count = numElements; + } + + + /* clear the count */ + FT_LOCAL_DEF( void ) + cf2_arrstack_clear( CF2_ArrStack arrstack ) + { + FT_ASSERT( arrstack ); + + arrstack->count = 0; + } + + + /* current number of items */ + FT_LOCAL_DEF( size_t ) + cf2_arrstack_size( const CF2_ArrStack arrstack ) + { + FT_ASSERT( arrstack ); + + return arrstack->count; + } + + + FT_LOCAL_DEF( void* ) + cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ) + { + FT_ASSERT( arrstack ); + + return arrstack->ptr; + } + + + /* return pointer to the given element */ + FT_LOCAL_DEF( void* ) + cf2_arrstack_getPointer( const CF2_ArrStack arrstack, + size_t idx ) + { + void* newPtr; + + + FT_ASSERT( arrstack ); + + if ( idx >= arrstack->count ) + { + /* overflow */ + CF2_SET_ERROR( arrstack->error, Stack_Overflow ); + idx = 0; /* choose safe default */ + } + + newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem; + + return newPtr; + } + + + /* push (append) an element at the end of the list; */ + /* return false on memory error */ + /* TODO: should there be a length param for extra checking? */ + FT_LOCAL_DEF( void ) + cf2_arrstack_push( CF2_ArrStack arrstack, + const void* ptr ) + { + FT_ASSERT( arrstack ); + + if ( arrstack->count == arrstack->allocated ) + { + /* increase the buffer size */ + if ( !cf2_arrstack_setNumElements( + arrstack, arrstack->allocated * 2 + 16 ) ) + { + /* on error, ignore the push */ + return; + } + } + + FT_ASSERT( ptr ); + + { + size_t offset = arrstack->count * arrstack->sizeItem; + void* newPtr = (FT_Byte*)arrstack->ptr + offset; + + + FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem ); + arrstack->count += 1; + } + } + + +/* END */ diff --git a/external/freetype/src/psaux/psarrst.h b/external/freetype/src/psaux/psarrst.h new file mode 100644 index 000000000..31e5330cc --- /dev/null +++ b/external/freetype/src/psaux/psarrst.h @@ -0,0 +1,99 @@ +/**************************************************************************** + * + * psarrst.h + * + * Adobe's code for Array Stacks (specification). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSARRST_H_ +#define PSARRST_H_ + + +#include "pserror.h" + + +FT_BEGIN_HEADER + + + /* need to define the struct here (not opaque) so it can be allocated by */ + /* clients */ + typedef struct CF2_ArrStackRec_ + { + FT_Memory memory; + FT_Error* error; + + size_t sizeItem; /* bytes per element */ + size_t allocated; /* items allocated */ + size_t count; /* number of elements allocated */ + size_t totalSize; /* total bytes allocated */ + + void* ptr; /* ptr to data */ + + } CF2_ArrStackRec, *CF2_ArrStack; + + + FT_LOCAL( void ) + cf2_arrstack_init( CF2_ArrStack arrstack, + FT_Memory memory, + FT_Error* error, + size_t sizeItem ); + FT_LOCAL( void ) + cf2_arrstack_finalize( CF2_ArrStack arrstack ); + + FT_LOCAL( void ) + cf2_arrstack_setCount( CF2_ArrStack arrstack, + size_t numElements ); + FT_LOCAL( void ) + cf2_arrstack_clear( CF2_ArrStack arrstack ); + FT_LOCAL( size_t ) + cf2_arrstack_size( const CF2_ArrStack arrstack ); + + FT_LOCAL( void* ) + cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ); + FT_LOCAL( void* ) + cf2_arrstack_getPointer( const CF2_ArrStack arrstack, + size_t idx ); + + FT_LOCAL( void ) + cf2_arrstack_push( CF2_ArrStack arrstack, + const void* ptr ); + + +FT_END_HEADER + + +#endif /* PSARRST_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psaux.c b/external/freetype/src/psaux/psaux.c new file mode 100644 index 000000000..5879ed163 --- /dev/null +++ b/external/freetype/src/psaux/psaux.c @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * psaux.c + * + * FreeType auxiliary PostScript driver component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "afmparse.c" +#include "psauxmod.c" +#include "psconv.c" +#include "psobjs.c" +#include "t1cmap.c" +#include "t1decode.c" +#include "cffdecode.c" + +#include "psarrst.c" +#include "psblues.c" +#include "pserror.c" +#include "psfont.c" +#include "psft.c" +#include "pshints.c" +#include "psintrp.c" +#include "psread.c" +#include "psstack.c" + + +/* END */ diff --git a/external/freetype/src/psaux/psauxerr.h b/external/freetype/src/psaux/psauxerr.h new file mode 100644 index 000000000..895ffa48c --- /dev/null +++ b/external/freetype/src/psaux/psauxerr.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * psauxerr.h + * + * PS auxiliary module error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the PS auxiliary module error enumeration + * constants. + * + */ + +#ifndef PSAUXERR_H_ +#define PSAUXERR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PSaux_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSaux + +#include <freetype/fterrors.h> + +#endif /* PSAUXERR_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psauxmod.c b/external/freetype/src/psaux/psauxmod.c new file mode 100644 index 000000000..45e35aa53 --- /dev/null +++ b/external/freetype/src/psaux/psauxmod.c @@ -0,0 +1,190 @@ +/**************************************************************************** + * + * psauxmod.c + * + * FreeType auxiliary PostScript module implementation (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "psauxmod.h" +#include "psobjs.h" +#include "t1decode.h" +#include "t1cmap.h" +#include "psft.h" +#include "cffdecode.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.h" +#endif + + + FT_CALLBACK_TABLE_DEF + const PS_Table_FuncsRec ps_table_funcs = + { + ps_table_new, /* init */ + ps_table_done, /* done */ + ps_table_add, /* add */ + ps_table_release /* release */ + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Parser_FuncsRec ps_parser_funcs = + { + ps_parser_init, /* init */ + ps_parser_done, /* done */ + + ps_parser_skip_spaces, /* skip_spaces */ + ps_parser_skip_PS_token, /* skip_PS_token */ + + ps_parser_to_int, /* to_int */ + ps_parser_to_fixed, /* to_fixed */ + ps_parser_to_bytes, /* to_bytes */ + ps_parser_to_coord_array, /* to_coord_array */ + ps_parser_to_fixed_array, /* to_fixed_array */ + ps_parser_to_token, /* to_token */ + ps_parser_to_token_array, /* to_token_array */ + + ps_parser_load_field, /* load_field */ + ps_parser_load_field_table /* load_field_table */ + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Builder_FuncsRec ps_builder_funcs = + { + ps_builder_init, /* init */ + ps_builder_done /* done */ + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Builder_FuncsRec t1_builder_funcs = + { + t1_builder_init, /* init */ + t1_builder_done, /* done */ + + t1_builder_check_points, /* check_points */ + t1_builder_add_point, /* add_point */ + t1_builder_add_point1, /* add_point1 */ + t1_builder_add_contour, /* add_contour */ + t1_builder_start_point, /* start_point */ + t1_builder_close_contour /* close_contour */ + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Decoder_FuncsRec t1_decoder_funcs = + { + t1_decoder_init, /* init */ + t1_decoder_done, /* done */ +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + t1_decoder_parse_charstrings, /* parse_charstrings_old */ +#else + t1_decoder_parse_metrics, /* parse_metrics */ +#endif + cf2_decoder_parse_charstrings /* parse_charstrings */ + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE_DEF + const AFM_Parser_FuncsRec afm_parser_funcs = + { + afm_parser_init, /* init */ + afm_parser_done, /* done */ + afm_parser_parse /* parse */ + }; +#endif + + + FT_CALLBACK_TABLE_DEF + const T1_CMap_ClassesRec t1_cmap_classes = + { + &t1_cmap_standard_class_rec, + &t1_cmap_expert_class_rec, + &t1_cmap_custom_class_rec, + &t1_cmap_unicode_class_rec + }; + + + FT_CALLBACK_TABLE_DEF + const CFF_Builder_FuncsRec cff_builder_funcs = + { + cff_builder_init, /* init */ + cff_builder_done, /* done */ + + cff_check_points, /* check_points */ + cff_builder_add_point, /* add_point */ + cff_builder_add_point1, /* add_point1 */ + cff_builder_add_contour, /* add_contour */ + cff_builder_start_point, /* start_point */ + cff_builder_close_contour /* close_contour */ + }; + + + FT_CALLBACK_TABLE_DEF + const CFF_Decoder_FuncsRec cff_decoder_funcs = + { + cff_decoder_init, /* init */ + cff_decoder_prepare, /* prepare */ + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + cff_decoder_parse_charstrings, /* parse_charstrings_old */ +#endif + cf2_decoder_parse_charstrings /* parse_charstrings */ + }; + + + static + const PSAux_Interface psaux_interface = + { + &ps_table_funcs, + &ps_parser_funcs, + &t1_builder_funcs, + &t1_decoder_funcs, + t1_decrypt, + cff_random, + ps_decoder_init, + t1_make_subfont, + + (const T1_CMap_ClassesRec*) &t1_cmap_classes, + +#ifndef T1_CONFIG_OPTION_NO_AFM + &afm_parser_funcs, +#else + 0, +#endif + + &cff_decoder_funcs, + }; + + + FT_DEFINE_MODULE( + psaux_module_class, + + 0, + sizeof ( FT_ModuleRec ), + "psaux", + 0x20000L, + 0x20000L, + + &psaux_interface, /* module-specific interface */ + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL /* get_interface */ + ) + + +/* END */ diff --git a/external/freetype/src/psaux/psauxmod.h b/external/freetype/src/psaux/psauxmod.h new file mode 100644 index 000000000..94dbf4881 --- /dev/null +++ b/external/freetype/src/psaux/psauxmod.h @@ -0,0 +1,60 @@ +/**************************************************************************** + * + * psauxmod.h + * + * FreeType auxiliary PostScript module implementation (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSAUXMOD_H_ +#define PSAUXMOD_H_ + + +#include <freetype/ftmodapi.h> + +#include <freetype/internal/psaux.h> + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const CFF_Builder_FuncsRec cff_builder_funcs; + + FT_CALLBACK_TABLE + const PS_Builder_FuncsRec ps_builder_funcs; + +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE + const AFM_Parser_FuncsRec afm_parser_funcs; +#endif + + FT_CALLBACK_TABLE + const T1_CMap_ClassesRec t1_cmap_classes; + + FT_CALLBACK_TABLE + const CFF_Decoder_FuncsRec cff_decoder_funcs; + + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + + + FT_DECLARE_MODULE( psaux_module_class ) + + +FT_END_HEADER + +#endif /* PSAUXMOD_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psblues.c b/external/freetype/src/psaux/psblues.c new file mode 100644 index 000000000..f9c864fea --- /dev/null +++ b/external/freetype/src/psaux/psblues.c @@ -0,0 +1,583 @@ +/**************************************************************************** + * + * psblues.c + * + * Adobe's code for handling Blue Zones (body). + * + * Copyright 2009-2014 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> + +#include "psblues.h" +#include "pshints.h" +#include "psfont.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cf2blues + + + /* + * For blue values, the FreeType parser produces an array of integers, + * while the Adobe CFF engine produces an array of fixed. + * Define a macro to convert FreeType to fixed. + */ +#define cf2_blueToFixed( x ) cf2_intToFixed( x ) + + + FT_LOCAL_DEF( void ) + cf2_blues_init( CF2_Blues blues, + CF2_Font font ) + { + /* pointer to parsed font object */ + PS_Decoder* decoder = font->decoder; + + CF2_Fixed zoneHeight; + CF2_Fixed maxZoneHeight = 0; + CF2_Fixed csUnitsPerPixel; + + size_t numBlueValues; + size_t numOtherBlues; + size_t numFamilyBlues; + size_t numFamilyOtherBlues; + + FT_Pos* blueValues; + FT_Pos* otherBlues; + FT_Pos* familyBlues; + FT_Pos* familyOtherBlues; + + size_t i; + CF2_Fixed emBoxBottom, emBoxTop; + +#if 0 + CF2_Int unitsPerEm = font->unitsPerEm; + + + if ( unitsPerEm == 0 ) + unitsPerEm = 1000; +#endif + + FT_ZERO( blues ); + blues->scale = font->innerTransform.d; + + cf2_getBlueMetrics( decoder, + &blues->blueScale, + &blues->blueShift, + &blues->blueFuzz ); + + cf2_getBlueValues( decoder, &numBlueValues, &blueValues ); + cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues ); + cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues ); + cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues ); + + /* + * synthetic em box hint heuristic + * + * Apply this when ideographic dictionary (LanguageGroup 1) has no + * real alignment zones. Adobe tools generate dummy zones at -250 and + * 1100 for a 1000 unit em. Fonts with ICF-based alignment zones + * should not enable the heuristic. When the heuristic is enabled, + * the font's blue zones are ignored. + * + */ + + /* get em box from OS/2 typoAscender/Descender */ + /* TODO: FreeType does not parse these metrics. Skip them for now. */ +#if 0 + FCM_getHorizontalLineMetrics( &e, + font->font, + &ascender, + &descender, + &linegap ); + if ( ascender - descender == unitsPerEm ) + { + emBoxBottom = cf2_intToFixed( descender ); + emBoxTop = cf2_intToFixed( ascender ); + } + else +#endif + { + emBoxBottom = CF2_ICF_Bottom; + emBoxTop = CF2_ICF_Top; + } + + if ( cf2_getLanguageGroup( decoder ) == 1 && + ( numBlueValues == 0 || + ( numBlueValues == 4 && + cf2_blueToFixed( blueValues[0] ) < emBoxBottom && + cf2_blueToFixed( blueValues[1] ) < emBoxBottom && + cf2_blueToFixed( blueValues[2] ) > emBoxTop && + cf2_blueToFixed( blueValues[3] ) > emBoxTop ) ) ) + { + /* + * Construct hint edges suitable for synthetic ghost hints at top + * and bottom of em box. +-CF2_MIN_COUNTER allows for unhinted + * features above or below the last hinted edge. This also gives a + * net 1 pixel boost to the height of ideographic glyphs. + * + * Note: Adjust synthetic hints outward by epsilon (0x.0001) to + * avoid interference. E.g., some fonts have real hints at + * 880 and -120. + */ + + blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON; + blues->emBoxBottomEdge.dsCoord = cf2_fixedRound( + FT_MulFix( + blues->emBoxBottomEdge.csCoord, + blues->scale ) ) - + CF2_MIN_COUNTER; + blues->emBoxBottomEdge.scale = blues->scale; + blues->emBoxBottomEdge.flags = CF2_GhostBottom | + CF2_Locked | + CF2_Synthetic; + + blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON + + 2 * font->darkenY; + blues->emBoxTopEdge.dsCoord = cf2_fixedRound( + FT_MulFix( + blues->emBoxTopEdge.csCoord, + blues->scale ) ) + + CF2_MIN_COUNTER; + blues->emBoxTopEdge.scale = blues->scale; + blues->emBoxTopEdge.flags = CF2_GhostTop | + CF2_Locked | + CF2_Synthetic; + + blues->doEmBoxHints = TRUE; /* enable the heuristic */ + + return; + } + + /* copy `BlueValues' and `OtherBlues' to a combined array of top and */ + /* bottom zones */ + for ( i = 0; i < numBlueValues; i += 2 ) + { + blues->zone[blues->count].csBottomEdge = + cf2_blueToFixed( blueValues[i] ); + blues->zone[blues->count].csTopEdge = + cf2_blueToFixed( blueValues[i + 1] ); + + zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge, + blues->zone[blues->count].csBottomEdge ); + + if ( zoneHeight < 0 ) + { + FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); + continue; /* reject this zone */ + } + + if ( zoneHeight > maxZoneHeight ) + { + /* take maximum before darkening adjustment */ + /* so overshoot suppression point doesn't change */ + maxZoneHeight = zoneHeight; + } + + /* adjust both edges of top zone upward by twice darkening amount */ + if ( i != 0 ) + { + blues->zone[blues->count].csTopEdge += 2 * font->darkenY; + blues->zone[blues->count].csBottomEdge += 2 * font->darkenY; + } + + /* first `BlueValue' is bottom zone; others are top */ + if ( i == 0 ) + { + blues->zone[blues->count].bottomZone = + TRUE; + blues->zone[blues->count].csFlatEdge = + blues->zone[blues->count].csTopEdge; + } + else + { + blues->zone[blues->count].bottomZone = + FALSE; + blues->zone[blues->count].csFlatEdge = + blues->zone[blues->count].csBottomEdge; + } + + blues->count += 1; + } + + for ( i = 0; i < numOtherBlues; i += 2 ) + { + blues->zone[blues->count].csBottomEdge = + cf2_blueToFixed( otherBlues[i] ); + blues->zone[blues->count].csTopEdge = + cf2_blueToFixed( otherBlues[i + 1] ); + + zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge, + blues->zone[blues->count].csBottomEdge ); + + if ( zoneHeight < 0 ) + { + FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); + continue; /* reject this zone */ + } + + if ( zoneHeight > maxZoneHeight ) + { + /* take maximum before darkening adjustment */ + /* so overshoot suppression point doesn't change */ + maxZoneHeight = zoneHeight; + } + + /* Note: bottom zones are not adjusted for darkening amount */ + + /* all OtherBlues are bottom zone */ + blues->zone[blues->count].bottomZone = + TRUE; + blues->zone[blues->count].csFlatEdge = + blues->zone[blues->count].csTopEdge; + + blues->count += 1; + } + + /* Adjust for FamilyBlues */ + + /* Search for the nearest flat edge in `FamilyBlues' or */ + /* `FamilyOtherBlues'. According to the Black Book, any matching edge */ + /* must be within one device pixel */ + + csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale ); + + /* loop on all zones in this font */ + for ( i = 0; i < blues->count; i++ ) + { + size_t j; + CF2_Fixed minDiff; + CF2_Fixed flatFamilyEdge, diff; + /* value for this font */ + CF2_Fixed flatEdge = blues->zone[i].csFlatEdge; + + + if ( blues->zone[i].bottomZone ) + { + /* In a bottom zone, the top edge is the flat edge. */ + /* Search `FamilyOtherBlues' for bottom zones; look for closest */ + /* Family edge that is within the one pixel threshold. */ + + minDiff = CF2_FIXED_MAX; + + for ( j = 0; j < numFamilyOtherBlues; j += 2 ) + { + /* top edge */ + flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] ); + + diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) ); + + if ( diff < minDiff && diff < csUnitsPerPixel ) + { + blues->zone[i].csFlatEdge = flatFamilyEdge; + minDiff = diff; + + if ( diff == 0 ) + break; + } + } + + /* check the first member of FamilyBlues, which is a bottom zone */ + if ( numFamilyBlues >= 2 ) + { + /* top edge */ + flatFamilyEdge = cf2_blueToFixed( familyBlues[1] ); + + diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) ); + + if ( diff < minDiff && diff < csUnitsPerPixel ) + blues->zone[i].csFlatEdge = flatFamilyEdge; + } + } + else + { + /* In a top zone, the bottom edge is the flat edge. */ + /* Search `FamilyBlues' for top zones; skip first zone, which is a */ + /* bottom zone; look for closest Family edge that is within the */ + /* one pixel threshold */ + + minDiff = CF2_FIXED_MAX; + + for ( j = 2; j < numFamilyBlues; j += 2 ) + { + /* bottom edge */ + flatFamilyEdge = cf2_blueToFixed( familyBlues[j] ); + + /* adjust edges of top zone upward by twice darkening amount */ + flatFamilyEdge += 2 * font->darkenY; /* bottom edge */ + + diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) ); + + if ( diff < minDiff && diff < csUnitsPerPixel ) + { + blues->zone[i].csFlatEdge = flatFamilyEdge; + minDiff = diff; + + if ( diff == 0 ) + break; + } + } + } + } + + /* TODO: enforce separation of zones, including BlueFuzz */ + + /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */ + /* `bcsetup.c'. */ + + if ( maxZoneHeight > 0 ) + { + if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ), + maxZoneHeight ) ) + { + /* clamp at maximum scale */ + blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ), + maxZoneHeight ); + } + + /* + * TODO: Revisit the bug fix for 613448. The minimum scale + * requirement catches a number of library fonts. For + * example, with default BlueScale (.039625) and 0.4 minimum, + * the test below catches any font with maxZoneHeight < 10.1. + * There are library fonts ranging from 2 to 10 that get + * caught, including e.g., Eurostile LT Std Medium with + * maxZoneHeight of 6. + * + */ +#if 0 + if ( blueScale < .4 / maxZoneHeight ) + { + tetraphilia_assert( 0 ); + /* clamp at minimum scale, per bug 0613448 fix */ + blueScale = .4 / maxZoneHeight; + } +#endif + + } + + /* + * Suppress overshoot and boost blue zones at small sizes. Boost + * amount varies linearly from 0.5 pixel near 0 to 0 pixel at + * blueScale cutoff. + * Note: This boost amount is different from the coretype heuristic. + * + */ + + if ( blues->scale < blues->blueScale ) + { + blues->suppressOvershoot = TRUE; + + /* Change rounding threshold for `dsFlatEdge'. */ + /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */ + /* 10ppem Arial */ + + blues->boost = cf2_doubleToFixed( .6 ) - + FT_MulDiv( cf2_doubleToFixed ( .6 ), + blues->scale, + blues->blueScale ); + if ( blues->boost > 0x7FFF ) + { + /* boost must remain less than 0.5, or baseline could go negative */ + blues->boost = 0x7FFF; + } + } + + /* boost and darkening have similar effects; don't do both */ + if ( font->stemDarkened ) + blues->boost = 0; + + /* set device space alignment for each zone; */ + /* apply boost amount before rounding flat edge */ + + for ( i = 0; i < blues->count; i++ ) + { + if ( blues->zone[i].bottomZone ) + blues->zone[i].dsFlatEdge = cf2_fixedRound( + FT_MulFix( + blues->zone[i].csFlatEdge, + blues->scale ) - + blues->boost ); + else + blues->zone[i].dsFlatEdge = cf2_fixedRound( + FT_MulFix( + blues->zone[i].csFlatEdge, + blues->scale ) + + blues->boost ); + } + } + + + /* + * Check whether `stemHint' is captured by one of the blue zones. + * + * Zero, one or both edges may be valid; only valid edges can be + * captured. For compatibility with CoolType, search top and bottom + * zones in the same pass (see `BlueLock'). If a hint is captured, + * return true and position the edge(s) in one of 3 ways: + * + * 1) If `BlueScale' suppresses overshoot, position the captured edge + * at the flat edge of the zone. + * 2) If overshoot is not suppressed and `BlueShift' requires + * overshoot, position the captured edge a minimum of 1 device pixel + * from the flat edge. + * 3) If overshoot is not suppressed or required, position the captured + * edge at the nearest device pixel. + * + */ + FT_LOCAL_DEF( FT_Bool ) + cf2_blues_capture( const CF2_Blues blues, + CF2_Hint bottomHintEdge, + CF2_Hint topHintEdge ) + { + /* TODO: validate? */ + CF2_Fixed csFuzz = blues->blueFuzz; + + /* new position of captured edge */ + CF2_Fixed dsNew; + + /* amount that hint is moved when positioned */ + CF2_Fixed dsMove = 0; + + FT_Bool captured = FALSE; + CF2_UInt i; + + + /* assert edge flags are consistent */ + FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) && + !cf2_hint_isBottom( topHintEdge ) ); + + /* TODO: search once without blue fuzz for compatibility with coretype? */ + for ( i = 0; i < blues->count; i++ ) + { + if ( blues->zone[i].bottomZone && + cf2_hint_isBottom( bottomHintEdge ) ) + { + if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <= + bottomHintEdge->csCoord && + bottomHintEdge->csCoord <= + ADD_INT32( blues->zone[i].csTopEdge, csFuzz ) ) + { + /* bottom edge captured by bottom zone */ + + if ( blues->suppressOvershoot ) + dsNew = blues->zone[i].dsFlatEdge; + + else if ( SUB_INT32( blues->zone[i].csTopEdge, + bottomHintEdge->csCoord ) >= + blues->blueShift ) + { + /* guarantee minimum of 1 pixel overshoot */ + dsNew = FT_MIN( + cf2_fixedRound( bottomHintEdge->dsCoord ), + SUB_INT32( blues->zone[i].dsFlatEdge, + cf2_intToFixed( 1 ) ) ); + } + + else + { + /* simply round captured edge */ + dsNew = cf2_fixedRound( bottomHintEdge->dsCoord ); + } + + dsMove = SUB_INT32( dsNew, bottomHintEdge->dsCoord ); + captured = TRUE; + + break; + } + } + + if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) ) + { + if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <= + topHintEdge->csCoord && + topHintEdge->csCoord <= + ADD_INT32( blues->zone[i].csTopEdge, csFuzz ) ) + { + /* top edge captured by top zone */ + + if ( blues->suppressOvershoot ) + dsNew = blues->zone[i].dsFlatEdge; + + else if ( SUB_INT32( topHintEdge->csCoord, + blues->zone[i].csBottomEdge ) >= + blues->blueShift ) + { + /* guarantee minimum of 1 pixel overshoot */ + dsNew = FT_MAX( + cf2_fixedRound( topHintEdge->dsCoord ), + blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) ); + } + + else + { + /* simply round captured edge */ + dsNew = cf2_fixedRound( topHintEdge->dsCoord ); + } + + dsMove = SUB_INT32( dsNew, topHintEdge->dsCoord ); + captured = TRUE; + + break; + } + } + } + + if ( captured ) + { + /* move both edges and flag them `locked' */ + if ( cf2_hint_isValid( bottomHintEdge ) ) + { + bottomHintEdge->dsCoord = ADD_INT32( bottomHintEdge->dsCoord, + dsMove ); + cf2_hint_lock( bottomHintEdge ); + } + + if ( cf2_hint_isValid( topHintEdge ) ) + { + topHintEdge->dsCoord = ADD_INT32( topHintEdge->dsCoord, dsMove ); + cf2_hint_lock( topHintEdge ); + } + } + + return captured; + } + + +/* END */ diff --git a/external/freetype/src/psaux/psblues.h b/external/freetype/src/psaux/psblues.h new file mode 100644 index 000000000..55fb88ecd --- /dev/null +++ b/external/freetype/src/psaux/psblues.h @@ -0,0 +1,185 @@ +/**************************************************************************** + * + * psblues.h + * + * Adobe's code for handling Blue Zones (specification). + * + * Copyright 2009-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + + /* + * A `CF2_Blues' object stores the blue zones (horizontal alignment + * zones) of a font. These are specified in the CFF private dictionary + * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'. + * Each zone is defined by a top and bottom edge in character space. + * Further, each zone is either a top zone or a bottom zone, as recorded + * by `bottomZone'. + * + * The maximum number of `BlueValues' and `FamilyBlues' is 7 each. + * However, these are combined to produce a total of 7 zones. + * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues' + * is 5 and these are combined to produce an additional 5 zones. + * + * Blue zones are used to `capture' hints and force them to a common + * alignment point. This alignment is recorded in device space in + * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be + * constructed independently of scaling. Construction may occur once + * the matrix is known. Other features implemented in the Capture + * method are overshoot suppression, overshoot enforcement, and Blue + * Boost. + * + * Capture is determined by `BlueValues' and `OtherBlues', but the + * alignment point may be adjusted to the scaled flat edge of + * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the + * curved edge of a zone. + * + */ + + +#ifndef PSBLUES_H_ +#define PSBLUES_H_ + + +#include "psglue.h" + + +FT_BEGIN_HEADER + + + /* + * `CF2_Hint' is shared by `cf2hints.h' and + * `cf2blues.h', but `cf2blues.h' depends on + * `cf2hints.h', so define it here. Note: The typedef is in + * `cf2glue.h'. + * + */ + enum + { + CF2_GhostBottom = 0x1, /* a single bottom edge */ + CF2_GhostTop = 0x2, /* a single top edge */ + CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */ + CF2_PairTop = 0x8, /* the top edge of a stem hint */ + CF2_Locked = 0x10, /* this edge has been aligned */ + /* by a blue zone */ + CF2_Synthetic = 0x20 /* this edge was synthesized */ + }; + + + /* + * Default value for OS/2 typoAscender/Descender when their difference + * is not equal to `unitsPerEm'. The default is based on -250 and 1100 + * in `CF2_Blues', assuming 1000 units per em here. + * + */ + enum + { + CF2_ICF_Top = cf2_intToFixed( 880 ), + CF2_ICF_Bottom = cf2_intToFixed( -120 ) + }; + + + /* + * Constant used for hint adjustment and for synthetic em box hint + * placement. + */ +#define CF2_MIN_COUNTER cf2_doubleToFixed( 0.5 ) + + + /* shared typedef is in cf2glue.h */ + struct CF2_HintRec_ + { + CF2_UInt flags; /* attributes of the edge */ + size_t index; /* index in original stem hint array */ + /* (if not synthetic) */ + CF2_Fixed csCoord; + CF2_Fixed dsCoord; + CF2_Fixed scale; + }; + + + typedef struct CF2_BlueRec_ + { + CF2_Fixed csBottomEdge; + CF2_Fixed csTopEdge; + CF2_Fixed csFlatEdge; /* may be from either local or Family zones */ + CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */ + /* of top zone (rounded) */ + FT_Bool bottomZone; + + } CF2_BlueRec; + + + /* max total blue zones is 12 */ + enum + { + CF2_MAX_BLUES = 7, + CF2_MAX_OTHERBLUES = 5 + }; + + + typedef struct CF2_BluesRec_ + { + CF2_Fixed scale; + CF2_UInt count; + FT_Bool suppressOvershoot; + FT_Bool doEmBoxHints; + + CF2_Fixed blueScale; + CF2_Fixed blueShift; + CF2_Fixed blueFuzz; + + CF2_Fixed boost; + + CF2_HintRec emBoxTopEdge; + CF2_HintRec emBoxBottomEdge; + + CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES]; + + } CF2_BluesRec, *CF2_Blues; + + + FT_LOCAL( void ) + cf2_blues_init( CF2_Blues blues, + CF2_Font font ); + FT_LOCAL( FT_Bool ) + cf2_blues_capture( const CF2_Blues blues, + CF2_Hint bottomHintEdge, + CF2_Hint topHintEdge ); + + +FT_END_HEADER + + +#endif /* PSBLUES_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psconv.c b/external/freetype/src/psaux/psconv.c new file mode 100644 index 000000000..b9c7138d8 --- /dev/null +++ b/external/freetype/src/psaux/psconv.c @@ -0,0 +1,610 @@ +/**************************************************************************** + * + * psconv.c + * + * Some convenience conversions (body). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/psaux.h> +#include <freetype/internal/ftdebug.h> + +#include "psconv.h" +#include "psauxerr.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT psconv + + + /* The following array is used by various functions to quickly convert */ + /* digits (both decimal and non-decimal) into numbers. */ + +#if 'A' == 65 + /* ASCII */ + + static const FT_Char ft_char_table[128] = + { + /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + }; + + /* no character >= 0x80 can represent a valid number */ +#define OP >= + +#endif /* 'A' == 65 */ + +#if 'A' == 193 + /* EBCDIC */ + + static const FT_Char ft_char_table[128] = + { + /* 0x80 */ + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + }; + + /* no character < 0x80 can represent a valid number */ +#define OP < + +#endif /* 'A' == 193 */ + + + FT_LOCAL_DEF( FT_Long ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Long base ) + { + FT_Byte* p = *cursor; + + FT_Long num = 0; + FT_Bool sign = 0; + FT_Bool have_overflow = 0; + + FT_Long num_limit; + FT_Char c_limit; + + + if ( p >= limit ) + goto Bad; + + if ( base < 2 || base > 36 ) + { + FT_TRACE4(( "!!!INVALID BASE:!!!" )); + return 0; + } + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + goto Bad; + + /* only a single sign is allowed */ + if ( *p == '-' || *p == '+' ) + return 0; + } + + num_limit = 0x7FFFFFFFL / base; + c_limit = (FT_Char)( 0x7FFFFFFFL % base ); + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7F]; + + if ( c < 0 || c >= base ) + break; + + if ( num > num_limit || ( num == num_limit && c > c_limit ) ) + have_overflow = 1; + else + num = num * base + c; + } + + *cursor = p; + + if ( have_overflow ) + { + num = 0x7FFFFFFFL; + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + } + + if ( sign ) + num = -num; + + return num; + + Bad: + FT_TRACE4(( "!!!END OF DATA:!!!" )); + return 0; + } + + + FT_LOCAL_DEF( FT_Long ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ) + + { + FT_Byte* p = *cursor; + FT_Byte* curp; + + FT_Long num; + + + curp = p; + num = PS_Conv_Strtol( &p, limit, 10 ); + + if ( p == curp ) + return 0; + + if ( p < limit && *p == '#' ) + { + p++; + + curp = p; + num = PS_Conv_Strtol( &p, limit, num ); + + if ( p == curp ) + return 0; + } + + *cursor = p; + + return num; + } + + + FT_LOCAL_DEF( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Long power_ten ) + { + FT_Byte* p = *cursor; + FT_Byte* curp; + + FT_Fixed integral = 0; + FT_Long decimal = 0; + FT_Long divider = 1; + + FT_Bool sign = 0; + FT_Bool have_overflow = 0; + FT_Bool have_underflow = 0; + + + if ( p >= limit ) + goto Bad; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + goto Bad; + + /* only a single sign is allowed */ + if ( *p == '-' || *p == '+' ) + return 0; + } + + /* read the integer part */ + if ( *p != '.' ) + { + curp = p; + integral = PS_Conv_ToInt( &p, limit ); + + if ( p == curp ) + return 0; + + if ( integral > 0x7FFF ) + have_overflow = 1; + else + integral = (FT_Fixed)( (FT_UInt32)integral << 16 ); + } + + /* read the decimal part */ + if ( p < limit && *p == '.' ) + { + p++; + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7F]; + + if ( c < 0 || c >= 10 ) + break; + + /* only add digit if we don't overflow */ + if ( divider < 0xCCCCCCCL && decimal < 0xCCCCCCCL ) + { + decimal = decimal * 10 + c; + + if ( !integral && power_ten > 0 ) + power_ten--; + else + divider *= 10; + } + } + } + + /* read exponent, if any */ + if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) + { + FT_Long exponent; + + + p++; + + curp = p; + exponent = PS_Conv_ToInt( &p, limit ); + + if ( curp == p ) + return 0; + + /* arbitrarily limit exponent */ + if ( exponent > 1000 ) + have_overflow = 1; + else if ( exponent < -1000 ) + have_underflow = 1; + else + power_ten += exponent; + } + + *cursor = p; + + if ( !integral && !decimal ) + return 0; + + if ( have_overflow ) + goto Overflow; + if ( have_underflow ) + goto Underflow; + + while ( power_ten > 0 ) + { + if ( integral >= 0xCCCCCCCL ) + goto Overflow; + integral *= 10; + + if ( decimal >= 0xCCCCCCCL ) + { + if ( divider == 1 ) + goto Overflow; + divider /= 10; + } + else + decimal *= 10; + + power_ten--; + } + + while ( power_ten < 0 ) + { + integral /= 10; + if ( divider < 0xCCCCCCCL ) + divider *= 10; + else + decimal /= 10; + + if ( !integral && !decimal ) + goto Underflow; + + power_ten++; + } + + if ( decimal ) + { + decimal = FT_DivFix( decimal, divider ); + /* it's not necessary to check this addition for overflow */ + /* due to the structure of the real number representation */ + integral += decimal; + } + + Exit: + if ( sign ) + integral = -integral; + + return integral; + + Bad: + FT_TRACE4(( "!!!END OF DATA:!!!" )); + return 0; + + Overflow: + integral = 0x7FFFFFFFL; + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + goto Exit; + + Underflow: + FT_TRACE4(( "!!!UNDERFLOW:!!!" )); + return 0; + } + + +#if 0 + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + + + for ( p = *cursor; r < n && p < limit; p++ ) + { + FT_Byte b; + + + if ( *p != '\\' ) + { + buffer[r++] = *p; + + continue; + } + + p++; + + switch ( *p ) + { + case 'n': + b = '\n'; + break; + case 'r': + b = '\r'; + break; + case 't': + b = '\t'; + break; + case 'b': + b = '\b'; + break; + case 'f': + b = '\f'; + break; + case '\r': + p++; + if ( *p != '\n' ) + { + b = *p; + + break; + } + /* no break */ + case '\n': + continue; + break; + default: + if ( IS_PS_DIGIT( *p ) ) + { + b = *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + { + b = b * 8 + *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + b = b * 8 + *p - '0'; + else + { + buffer[r++] = b; + b = *p; + } + } + else + { + buffer[r++] = b; + b = *p; + } + } + else + b = *p; + break; + } + + buffer[r++] = b; + } + + *cursor = p; + + return r; + } +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + FT_UInt w = 0; + FT_UInt pad = 0x01; + + + n *= 2; + +#if 1 + + p = *cursor; + + if ( p >= limit ) + return 0; + + if ( n > (FT_UInt)( limit - p ) ) + n = (FT_UInt)( limit - p ); + + /* we try to process two nibbles at a time to be as fast as possible */ + for ( ; r < n; r++ ) + { + FT_UInt c = p[r]; + + + if ( IS_PS_SPACE( c ) ) + continue; + + if ( c OP 0x80 ) + break; + + c = (FT_UInt)ft_char_table[c & 0x7F]; + if ( c >= 16 ) + break; + + pad = ( pad << 4 ) | c; + if ( pad & 0x100 ) + { + buffer[w++] = (FT_Byte)pad; + pad = 0x01; + } + } + + if ( pad != 0x01 ) + buffer[w++] = (FT_Byte)( pad << 4 ); + + *cursor = p + r; + + return w; + +#else /* 0 */ + + for ( r = 0; r < n; r++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) ) + continue; + + if ( *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7F]; + + if ( (unsigned)c >= 16 ) + break; + + if ( r & 1 ) + { + *buffer = (FT_Byte)( *buffer + c ); + buffer++; + } + else + *buffer = (FT_Byte)( c << 4 ); + + r++; + } + + *cursor = p; + + return ( r + 1 ) / 2; + +#endif /* 0 */ + + } + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ) + { + FT_Byte* p; + FT_UInt r; + FT_UInt s = *seed; + + +#if 1 + + p = *cursor; + + if ( p >= limit ) + return 0; + + if ( n > (FT_UInt)( limit - p ) ) + n = (FT_UInt)( limit - p ); + + for ( r = 0; r < n; r++ ) + { + FT_UInt val = p[r]; + FT_UInt b = ( val ^ ( s >> 8 ) ); + + + s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; + buffer[r] = (FT_Byte) b; + } + + *cursor = p + n; + *seed = (FT_UShort)s; + +#else /* 0 */ + + for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) + { + FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); + + + s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); + *buffer++ = b; + } + *cursor = p; + *seed = s; + +#endif /* 0 */ + + return r; + } + + +/* END */ diff --git a/external/freetype/src/psaux/psconv.h b/external/freetype/src/psaux/psconv.h new file mode 100644 index 000000000..b7c3ee00b --- /dev/null +++ b/external/freetype/src/psaux/psconv.h @@ -0,0 +1,70 @@ +/**************************************************************************** + * + * psconv.h + * + * Some convenience conversions (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSCONV_H_ +#define PSCONV_H_ + + +#include <freetype/internal/psaux.h> + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Long ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Long base ); + + + FT_LOCAL( FT_Long ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ); + + FT_LOCAL( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Long power_ten ); + +#if 0 + FT_LOCAL( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); +#endif + + FT_LOCAL( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); + + FT_LOCAL( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ); + + +FT_END_HEADER + +#endif /* PSCONV_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/pserror.c b/external/freetype/src/psaux/pserror.c new file mode 100644 index 000000000..98cebcf74 --- /dev/null +++ b/external/freetype/src/psaux/pserror.c @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * pserror.c + * + * Adobe's code for error handling (body). + * + * Copyright 2006-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include "pserror.h" + + + FT_LOCAL_DEF( void ) + cf2_setError( FT_Error* error, + FT_Error value ) + { + if ( error && !*error ) + *error = value; + } + + +/* END */ diff --git a/external/freetype/src/psaux/pserror.h b/external/freetype/src/psaux/pserror.h new file mode 100644 index 000000000..5738853fa --- /dev/null +++ b/external/freetype/src/psaux/pserror.h @@ -0,0 +1,120 @@ +/**************************************************************************** + * + * pserror.h + * + * Adobe's code for error handling (specification). + * + * Copyright 2006-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSERROR_H_ +#define PSERROR_H_ + + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX CF2_Err_ +#define FT_ERR_BASE FT_Mod_Err_CF2 + + +#include <freetype/fterrors.h> +#include <freetype/internal/compiler-macros.h> +#include "psft.h" + + +FT_BEGIN_HEADER + + + /* + * A poor-man error facility. + * + * This code being written in vanilla C, doesn't have the luxury of a + * language-supported exception mechanism such as the one available in + * Java. Instead, we are stuck with using error codes that must be + * carefully managed and preserved. However, it is convenient for us to + * model our error mechanism on a Java-like exception mechanism. + * When we assign an error code we are thus `throwing' an error. + * + * The preservation of an error code is done by coding convention. + * Upon a function call if the error code is anything other than + * `FT_Err_Ok', which is guaranteed to be zero, we + * will return without altering that error. This will allow the + * error to propagate and be handled at the appropriate location in + * the code. + * + * This allows a style of code where the error code is initialized + * up front and a block of calls are made with the error code only + * being checked after the block. If a new error occurs, the original + * error will be preserved and a functional no-op should result in any + * subsequent function that has an initial error code not equal to + * `FT_Err_Ok'. + * + * Errors are encoded by calling the `FT_THROW' macro. For example, + * + * { + * FT_Error e; + * + * + * ... + * e = FT_THROW( Out_Of_Memory ); + * } + * + */ + + + /* Set error code to a particular value. */ + FT_LOCAL( void ) + cf2_setError( FT_Error* error, + FT_Error value ); + + + /* + * A macro that conditionally sets an error code. + * + * This macro will first check whether `error' is set; + * if not, it will set it to `e'. + * + */ +#define CF2_SET_ERROR( error, e ) \ + cf2_setError( error, FT_THROW( e ) ) + + +FT_END_HEADER + + +#endif /* PSERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psfixed.h b/external/freetype/src/psaux/psfixed.h new file mode 100644 index 000000000..299d07637 --- /dev/null +++ b/external/freetype/src/psaux/psfixed.h @@ -0,0 +1,94 @@ +/**************************************************************************** + * + * psfixed.h + * + * Adobe's code for Fixed-Point Mathematics (specification only). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSFIXED_H_ +#define PSFIXED_H_ + + +FT_BEGIN_HEADER + + + /* rasterizer integer and fixed-point arithmetic must be 32-bit */ + +#define CF2_Fixed CF2_F16Dot16 + typedef FT_Int32 CF2_Frac; /* 2.30 fixed-point */ + + +#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL ) +#define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L ) +#define CF2_FIXED_ONE ( (CF2_Fixed)0x10000L ) +#define CF2_FIXED_EPSILON ( (CF2_Fixed)0x0001 ) + + /* in C 89, left and right shift of negative numbers is */ + /* implementation specific behaviour in the general case */ + +#define cf2_intToFixed( i ) \ + ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) ) +#define cf2_fixedToInt( x ) \ + ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) +#define cf2_fixedRound( x ) \ + ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) ) +#define cf2_doubleToFixed( f ) \ + ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) ) +#define cf2_fixedAbs( x ) \ + ( (x) < 0 ? NEG_INT32( x ) : (x) ) +#define cf2_fixedFloor( x ) \ + ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) ) +#define cf2_fixedFraction( x ) \ + ( (x) - cf2_fixedFloor( x ) ) +#define cf2_fracToFixed( x ) \ + ( ( (x) + 0x2000 - ( (x) < 0 ) ) >> 14 ) + + + /* signed numeric types */ + typedef enum CF2_NumberType_ + { + CF2_NumberFixed, /* 16.16 */ + CF2_NumberFrac, /* 2.30 */ + CF2_NumberInt /* 32.0 */ + + } CF2_NumberType; + + +FT_END_HEADER + + +#endif /* PSFIXED_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psfont.c b/external/freetype/src/psaux/psfont.c new file mode 100644 index 000000000..0db1f0c5b --- /dev/null +++ b/external/freetype/src/psaux/psfont.c @@ -0,0 +1,566 @@ +/**************************************************************************** + * + * psfont.c + * + * Adobe's code for font instances (body). + * + * Copyright 2007-2014 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include <freetype/internal/ftcalc.h> + +#include "psft.h" + +#include "psglue.h" +#include "psfont.h" +#include "pserror.h" +#include "psintrp.h" + + + /* Compute a stem darkening amount in character space. */ + static void + cf2_computeDarkening( CF2_Fixed emRatio, + CF2_Fixed ppem, + CF2_Fixed stemWidth, + CF2_Fixed* darkenAmount, + CF2_Fixed boldenAmount, + FT_Bool stemDarkened, + FT_Int* darkenParams ) + { + /* + * Total darkening amount is computed in 1000 unit character space + * using the modified 5 part curve as Adobe's Avalon rasterizer. + * The darkening amount is smaller for thicker stems. + * It becomes zero when the stem is thicker than 2.333 pixels. + * + * By default, we use + * + * darkenAmount = 0.4 pixels if scaledStem <= 0.5 pixels, + * darkenAmount = 0.275 pixels if 1 <= scaledStem <= 1.667 pixels, + * darkenAmount = 0 pixel if scaledStem >= 2.333 pixels, + * + * and piecewise linear in-between: + * + * + * darkening + * ^ + * | + * | (x1,y1) + * |--------+ + * | \ + * | \ + * | \ (x3,y3) + * | +----------+ + * | (x2,y2) \ + * | \ + * | \ + * | +----------------- + * | (x4,y4) + * +---------------------------------------------> stem + * thickness + * + * + * This corresponds to the following values for the + * `darkening-parameters' property: + * + * (x1, y1) = (500, 400) + * (x2, y2) = (1000, 275) + * (x3, y3) = (1667, 275) + * (x4, y4) = (2333, 0) + * + */ + + /* Internal calculations are done in units per thousand for */ + /* convenience. The x axis is scaled stem width in */ + /* thousandths of a pixel. That is, 1000 is 1 pixel. */ + /* The y axis is darkening amount in thousandths of a pixel.*/ + /* In the code, below, dividing by ppem and */ + /* adjusting for emRatio converts darkenAmount to character */ + /* space (font units). */ + CF2_Fixed stemWidthPer1000, scaledStem; + FT_Int logBase2; + + + *darkenAmount = 0; + + if ( boldenAmount == 0 && !stemDarkened ) + return; + + /* protect against range problems and divide by zero */ + if ( emRatio < cf2_doubleToFixed( .01 ) ) + return; + + if ( stemDarkened ) + { + FT_Int x1 = darkenParams[0]; + FT_Int y1 = darkenParams[1]; + FT_Int x2 = darkenParams[2]; + FT_Int y2 = darkenParams[3]; + FT_Int x3 = darkenParams[4]; + FT_Int y3 = darkenParams[5]; + FT_Int x4 = darkenParams[6]; + FT_Int y4 = darkenParams[7]; + + + /* convert from true character space to 1000 unit character space; */ + /* add synthetic emboldening effect */ + + /* `stemWidthPer1000' will not overflow for a legitimate font */ + + stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio ); + + /* `scaledStem' can easily overflow, so we must clamp its maximum */ + /* value; the test doesn't need to be precise, but must be */ + /* conservative. The clamp value (default 2333) where */ + /* `darkenAmount' is zero is well below the overflow value of */ + /* 32767. */ + /* */ + /* FT_MSB computes the integer part of the base 2 logarithm. The */ + /* number of bits for the product is 1 or 2 more than the sum of */ + /* logarithms; remembering that the 16 lowest bits of the fraction */ + /* are dropped this is correct to within a factor of almost 4. */ + /* For example, 0x80.0000 * 0x80.0000 = 0x4000.0000 is 23+23 and */ + /* is flagged as possible overflow because 0xFF.FFFF * 0xFF.FFFF = */ + /* 0xFFFF.FE00 is also 23+23. */ + + logBase2 = FT_MSB( (FT_UInt32)stemWidthPer1000 ) + + FT_MSB( (FT_UInt32)ppem ); + + if ( logBase2 >= 46 ) + /* possible overflow */ + scaledStem = cf2_intToFixed( x4 ); + else + scaledStem = FT_MulFix( stemWidthPer1000, ppem ); + + /* now apply the darkening parameters */ + + if ( scaledStem < cf2_intToFixed( x1 ) ) + *darkenAmount = FT_DivFix( cf2_intToFixed( y1 ), ppem ); + + else if ( scaledStem < cf2_intToFixed( x2 ) ) + { + FT_Int xdelta = x2 - x1; + FT_Int ydelta = y2 - y1; + FT_Int x = stemWidthPer1000 - + FT_DivFix( cf2_intToFixed( x1 ), ppem ); + + + if ( !xdelta ) + goto Try_x3; + + *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( cf2_intToFixed( y1 ), ppem ); + } + + else if ( scaledStem < cf2_intToFixed( x3 ) ) + { + Try_x3: + { + FT_Int xdelta = x3 - x2; + FT_Int ydelta = y3 - y2; + FT_Int x = stemWidthPer1000 - + FT_DivFix( cf2_intToFixed( x2 ), ppem ); + + + if ( !xdelta ) + goto Try_x4; + + *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( cf2_intToFixed( y2 ), ppem ); + } + } + + else if ( scaledStem < cf2_intToFixed( x4 ) ) + { + Try_x4: + { + FT_Int xdelta = x4 - x3; + FT_Int ydelta = y4 - y3; + FT_Int x = stemWidthPer1000 - + FT_DivFix( cf2_intToFixed( x3 ), ppem ); + + + if ( !xdelta ) + goto Use_y4; + + *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( cf2_intToFixed( y3 ), ppem ); + } + } + + else + { + Use_y4: + *darkenAmount = FT_DivFix( cf2_intToFixed( y4 ), ppem ); + } + + /* use half the amount on each side and convert back to true */ + /* character space */ + *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio ); + } + + /* add synthetic emboldening effect in character space */ + *darkenAmount += boldenAmount / 2; + } + + + /* set up values for the current FontDict and matrix; */ + /* called for each glyph to be rendered */ + + /* caller's transform is adjusted for subpixel positioning */ + static void + cf2_font_setup( CF2_Font font, + const CF2_Matrix* transform ) + { + /* pointer to parsed font object */ + PS_Decoder* decoder = font->decoder; + + FT_Bool needExtraSetup = FALSE; + + CFF_VStoreRec* vstore; + FT_Bool hasVariations = FALSE; + + /* character space units */ + CF2_Fixed boldenX = font->syntheticEmboldeningAmountX; + CF2_Fixed boldenY = font->syntheticEmboldeningAmountY; + + CFF_SubFont subFont; + CF2_Fixed ppem; + + CF2_UInt lenNormalizedV = 0; + FT_Fixed* normalizedV = NULL; + + /* clear previous error */ + font->error = FT_Err_Ok; + + /* if a CID fontDict has changed, we need to recompute some cached */ + /* data */ + subFont = cf2_getSubfont( decoder ); + if ( font->lastSubfont != subFont ) + { + font->lastSubfont = subFont; + needExtraSetup = TRUE; + } + + if ( !font->isT1 ) + { + /* check for variation vectors */ + vstore = cf2_getVStore( decoder ); + hasVariations = ( vstore->dataCount != 0 ); + + if ( hasVariations ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)font->cffload; + + + /* check whether Private DICT in this subfont needs to be reparsed */ + font->error = cf2_getNormalizedVector( decoder, + &lenNormalizedV, + &normalizedV ); + if ( font->error ) + return; + + if ( cffload->blend_check_vector( &subFont->blend, + subFont->private_dict.vsindex, + lenNormalizedV, + normalizedV ) ) + { + /* blend has changed, reparse */ + cffload->load_private_dict( decoder->cff, + subFont, + lenNormalizedV, + normalizedV ); + needExtraSetup = TRUE; + } +#endif + + /* copy from subfont */ + font->blend.font = subFont->blend.font; + + /* clear state of charstring blend */ + font->blend.usedBV = FALSE; + + /* initialize value for charstring */ + font->vsindex = subFont->private_dict.vsindex; + + /* store vector inputs for blends in charstring */ + font->lenNDV = lenNormalizedV; + font->NDV = normalizedV; + } + } + + /* if ppem has changed, we need to recompute some cached data */ + /* note: because of CID font matrix concatenation, ppem and transform */ + /* do not necessarily track. */ + ppem = cf2_getPpemY( decoder ); + if ( font->ppem != ppem ) + { + font->ppem = ppem; + needExtraSetup = TRUE; + } + + /* copy hinted flag on each call */ + font->hinted = FT_BOOL( font->renderingFlags & CF2_FlagsHinted ); + + /* determine if transform has changed; */ + /* include Fontmatrix but ignore translation */ + if ( ft_memcmp( transform, + &font->currentTransform, + 4 * sizeof ( CF2_Fixed ) ) != 0 ) + { + /* save `key' information for `cache of one' matrix data; */ + /* save client transform, without the translation */ + font->currentTransform = *transform; + font->currentTransform.tx = + font->currentTransform.ty = cf2_intToFixed( 0 ); + + /* TODO: FreeType transform is simple scalar; for now, use identity */ + /* for outer */ + font->innerTransform = *transform; + font->outerTransform.a = + font->outerTransform.d = cf2_intToFixed( 1 ); + font->outerTransform.b = + font->outerTransform.c = cf2_intToFixed( 0 ); + + needExtraSetup = TRUE; + } + + /* + * font->darkened is set to true if there is a stem darkening request or + * the font is synthetic emboldened. + * font->darkened controls whether to adjust blue zones, winding order, + * and hinting. + * + */ + if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) ) + { + font->stemDarkened = + FT_BOOL( font->renderingFlags & CF2_FlagsDarkened ); + + /* blue zones depend on darkened flag */ + needExtraSetup = TRUE; + } + + /* recompute variables that are dependent on transform or FontDict or */ + /* darken flag */ + if ( needExtraSetup ) + { + /* StdVW is found in the private dictionary; */ + /* recompute darkening amounts whenever private dictionary or */ + /* transform change */ + /* Note: a rendering flag turns darkening on or off, so we want to */ + /* store the `on' amounts; */ + /* darkening amount is computed in character space */ + /* TODO: testing size-dependent darkening here; */ + /* what to do for rotations? */ + + CF2_Fixed emRatio; + CF2_Fixed stdHW; + CF2_Int unitsPerEm = font->unitsPerEm; + + + if ( unitsPerEm == 0 ) + unitsPerEm = 1000; + + ppem = FT_MAX( cf2_intToFixed( 4 ), + font->ppem ); /* use minimum ppem of 4 */ + +#if 0 + /* since vstem is measured in the x-direction, we use the `a' member */ + /* of the fontMatrix */ + emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a ); +#endif + + /* Freetype does not preserve the fontMatrix when parsing; use */ + /* unitsPerEm instead. */ + /* TODO: check precision of this */ + emRatio = cf2_intToFixed( 1000 ) / unitsPerEm; + font->stdVW = cf2_getStdVW( decoder ); + + if ( font->stdVW <= 0 ) + font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); + + if ( boldenX > 0 ) + { + /* Ensure that boldenX is at least 1 pixel for synthetic bold font */ + /* (similar to what Avalon does) */ + boldenX = FT_MAX( boldenX, + FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) ); + + /* Synthetic emboldening adds at least 1 pixel to darkenX, while */ + /* stem darkening adds at most half pixel. Since the purpose of */ + /* stem darkening (readability at small sizes) is met with */ + /* synthetic emboldening, no need to add stem darkening for a */ + /* synthetic bold font. */ + cf2_computeDarkening( emRatio, + ppem, + font->stdVW, + &font->darkenX, + boldenX, + FALSE, + font->darkenParams ); + } + else + cf2_computeDarkening( emRatio, + ppem, + font->stdVW, + &font->darkenX, + 0, + font->stemDarkened, + font->darkenParams ); + +#if 0 + /* since hstem is measured in the y-direction, we use the `d' member */ + /* of the fontMatrix */ + /* TODO: use the same units per em as above; check this */ + emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d ); +#endif + + /* set the default stem width, because it must be the same for all */ + /* family members; */ + /* choose a constant for StdHW that depends on font contrast */ + stdHW = cf2_getStdHW( decoder ); + + if ( stdHW > 0 && font->stdVW > MUL_INT32( 2, stdHW ) ) + font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); + else + { + /* low contrast font gets less hstem darkening */ + font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio ); + } + + cf2_computeDarkening( emRatio, + ppem, + font->stdHW, + &font->darkenY, + boldenY, + font->stemDarkened, + font->darkenParams ); + + if ( font->darkenX != 0 || font->darkenY != 0 ) + font->darkened = TRUE; + else + font->darkened = FALSE; + + font->reverseWinding = FALSE; /* initial expectation is CCW */ + + /* compute blue zones for this instance */ + cf2_blues_init( &font->blues, font ); + + } /* needExtraSetup */ + } + + + /* equivalent to AdobeGetOutline */ + FT_LOCAL_DEF( FT_Error ) + cf2_getGlyphOutline( CF2_Font font, + CF2_Buffer charstring, + const CF2_Matrix* transform, + CF2_F16Dot16* glyphWidth ) + { + FT_Error lastError = FT_Err_Ok; + + FT_Vector translation; + +#if 0 + FT_Vector advancePoint; +#endif + + CF2_Fixed advWidth = 0; + FT_Bool needWinding; + + + /* Note: use both integer and fraction for outlines. This allows bbox */ + /* to come out directly. */ + + translation.x = transform->tx; + translation.y = transform->ty; + + /* set up values based on transform */ + cf2_font_setup( font, transform ); + if ( font->error ) + goto exit; /* setup encountered an error */ + + /* reset darken direction */ + font->reverseWinding = FALSE; + + /* winding order only affects darkening */ + needWinding = font->darkened; + + while ( 1 ) + { + /* reset output buffer */ + cf2_outline_reset( &font->outline ); + + /* build the outline, passing the full translation */ + cf2_interpT2CharString( font, + charstring, + (CF2_OutlineCallbacks)&font->outline, + &translation, + FALSE, + 0, + 0, + &advWidth ); + + if ( font->error ) + goto exit; + + if ( !needWinding ) + break; + + /* check winding order */ + if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */ + break; + + /* invert darkening and render again */ + /* TODO: this should be a parameter to getOutline-computeOffset */ + font->reverseWinding = TRUE; + + needWinding = FALSE; /* exit after next iteration */ + } + + /* finish storing client outline */ + cf2_outline_close( &font->outline ); + + exit: + /* FreeType just wants the advance width; there is no translation */ + *glyphWidth = advWidth; + + /* free resources and collect errors from objects we've used */ + cf2_setError( &font->error, lastError ); + + return font->error; + } + + +/* END */ diff --git a/external/freetype/src/psaux/psfont.h b/external/freetype/src/psaux/psfont.h new file mode 100644 index 000000000..836fce4e4 --- /dev/null +++ b/external/freetype/src/psaux/psfont.h @@ -0,0 +1,134 @@ +/**************************************************************************** + * + * psfont.h + * + * Adobe's code for font instances (specification). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSFONT_H_ +#define PSFONT_H_ + + +#include <freetype/internal/services/svcfftl.h> + +#include "psft.h" +#include "psblues.h" + + +FT_BEGIN_HEADER + + +#define CF2_OPERAND_STACK_SIZE 48 +#define CF2_MAX_SUBR 16 /* maximum subroutine nesting; */ + /* only 10 are allowed but there exist */ + /* fonts like `HiraKakuProN-W3.ttf' */ + /* (Hiragino Kaku Gothic ProN W3; */ + /* 8.2d6e1; 2014-12-19) that exceed */ + /* this limit */ +#define CF2_STORAGE_SIZE 32 + + + /* typedef is in `cf2glue.h' */ + struct CF2_FontRec_ + { + FT_Memory memory; + FT_Error error; /* shared error for this instance */ + + FT_Bool isT1; + FT_Bool isCFF2; + CF2_RenderingFlags renderingFlags; + + /* variables that depend on Transform: */ + /* the following have zero translation; */ + /* inner * outer = font * original */ + + CF2_Matrix currentTransform; /* original client matrix */ + CF2_Matrix innerTransform; /* for hinting; erect, scaled */ + CF2_Matrix outerTransform; /* post hinting; includes rotations */ + CF2_Fixed ppem; /* transform-dependent */ + + /* variation data */ + CFF_BlendRec blend; /* cached charstring blend vector */ + CF2_UInt vsindex; /* current vsindex */ + CF2_UInt lenNDV; /* current length NDV or zero */ + FT_Fixed* NDV; /* ptr to current NDV or NULL */ + + CF2_Int unitsPerEm; + + CF2_Fixed syntheticEmboldeningAmountX; /* character space units */ + CF2_Fixed syntheticEmboldeningAmountY; /* character space units */ + + /* FreeType related members */ + CF2_OutlineRec outline; /* freetype glyph outline functions */ + PS_Decoder* decoder; + CFF_SubFont lastSubfont; /* FreeType parsed data; */ + /* top font or subfont */ + + /* these flags can vary from one call to the next */ + FT_Bool hinted; + FT_Bool darkened; /* true if stemDarkened or synthetic bold */ + /* i.e. darkenX != 0 || darkenY != 0 */ + FT_Bool stemDarkened; + + FT_Int darkenParams[8]; /* 1000 unit character space */ + + /* variables that depend on both FontDict and Transform */ + CF2_Fixed stdVW; /* in character space; depends on dict entry */ + CF2_Fixed stdHW; /* in character space; depends on dict entry */ + CF2_Fixed darkenX; /* character space units */ + CF2_Fixed darkenY; /* depends on transform */ + /* and private dict (StdVW) */ + FT_Bool reverseWinding; /* darken assuming */ + /* counterclockwise winding */ + + CF2_BluesRec blues; /* computed zone data */ + + FT_Service_CFFLoad cffload; /* pointer to cff functions */ + }; + + + FT_LOCAL( FT_Error ) + cf2_getGlyphOutline( CF2_Font font, + CF2_Buffer charstring, + const CF2_Matrix* transform, + CF2_F16Dot16* glyphWidth ); + + +FT_END_HEADER + + +#endif /* PSFONT_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psft.c b/external/freetype/src/psaux/psft.c new file mode 100644 index 000000000..618864e6e --- /dev/null +++ b/external/freetype/src/psaux/psft.c @@ -0,0 +1,895 @@ +/**************************************************************************** + * + * psft.c + * + * FreeType Glue Component to Adobe's Interpreter (body). + * + * Copyright 2013-2014 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> + +#include "psfont.h" +#include "pserror.h" +#include "psobjs.h" +#include "cffdecode.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/ftmm.h> +#include <freetype/internal/services/svmm.h> +#endif + +#include <freetype/internal/services/svcfftl.h> + + +#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */ + + + /* + * This check should avoid most internal overflow cases. Clients should + * generally respond to `Glyph_Too_Big' by getting a glyph outline + * at EM size, scaling it and filling it as a graphics operation. + * + */ + static FT_Error + cf2_checkTransform( const CF2_Matrix* transform, + CF2_Int unitsPerEm ) + { + CF2_Fixed maxScale; + + + if ( transform->a <= 0 || transform->d <= 0 ) + return FT_THROW( Invalid_Size_Handle ); + + FT_ASSERT( unitsPerEm > 0 ); + FT_ASSERT( transform->b == 0 && transform->c == 0 ); + FT_ASSERT( transform->tx == 0 && transform->ty == 0 ); + + if ( unitsPerEm > 0x7FFF ) + return FT_THROW( Glyph_Too_Big ); + + maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) ); + + if ( transform->a > maxScale || transform->d > maxScale ) + return FT_THROW( Glyph_Too_Big ); + + return FT_Err_Ok; + } + + + static void + cf2_setGlyphWidth( CF2_Outline outline, + CF2_Fixed width ) + { + PS_Decoder* decoder = outline->decoder; + + + FT_ASSERT( decoder ); + + if ( !decoder->builder.is_t1 ) + *decoder->glyph_width = cf2_fixedToInt( width ); + } + + + /* Clean up font instance. */ + static void + cf2_free_instance( void* ptr ) + { + CF2_Font font = (CF2_Font)ptr; + + + if ( font ) + { + FT_Memory memory = font->memory; + + + FT_FREE( font->blend.lastNDV ); + FT_FREE( font->blend.BV ); + } + } + + + /********************************************* + * + * functions for handling client outline; + * FreeType uses coordinates in 26.6 format + * + */ + + static void + cf2_builder_moveTo( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ) + { + /* downcast the object pointer */ + CF2_Outline outline = (CF2_Outline)callbacks; + PS_Builder* builder; + + (void)params; /* only used in debug mode */ + + + FT_ASSERT( outline && outline->decoder ); + FT_ASSERT( params->op == CF2_PathOpMoveTo ); + + builder = &outline->decoder->builder; + + /* note: two successive moves simply close the contour twice */ + ps_builder_close_contour( builder ); + builder->path_begun = 0; + } + + + static void + cf2_builder_lineTo( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ) + { + FT_Error error; + + /* downcast the object pointer */ + CF2_Outline outline = (CF2_Outline)callbacks; + PS_Builder* builder; + + + FT_ASSERT( outline && outline->decoder ); + FT_ASSERT( params->op == CF2_PathOpLineTo ); + + builder = &outline->decoder->builder; + + if ( !builder->path_begun ) + { + /* record the move before the line; also check points and set */ + /* `path_begun' */ + error = ps_builder_start_point( builder, + params->pt0.x, + params->pt0.y ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + } + + /* `ps_builder_add_point1' includes a check_points call for one point */ + error = ps_builder_add_point1( builder, + params->pt1.x, + params->pt1.y ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + } + + + static void + cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ) + { + FT_Error error; + + /* downcast the object pointer */ + CF2_Outline outline = (CF2_Outline)callbacks; + PS_Builder* builder; + + + FT_ASSERT( outline && outline->decoder ); + FT_ASSERT( params->op == CF2_PathOpCubeTo ); + + builder = &outline->decoder->builder; + + if ( !builder->path_begun ) + { + /* record the move before the line; also check points and set */ + /* `path_begun' */ + error = ps_builder_start_point( builder, + params->pt0.x, + params->pt0.y ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + } + + /* prepare room for 3 points: 2 off-curve, 1 on-curve */ + error = ps_builder_check_points( builder, 3 ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + + ps_builder_add_point( builder, + params->pt1.x, + params->pt1.y, 0 ); + ps_builder_add_point( builder, + params->pt2.x, + params->pt2.y, 0 ); + ps_builder_add_point( builder, + params->pt3.x, + params->pt3.y, 1 ); + } + + + static void + cf2_outline_init( CF2_Outline outline, + FT_Memory memory, + FT_Error* error ) + { + FT_ZERO( outline ); + + outline->root.memory = memory; + outline->root.error = error; + + outline->root.moveTo = cf2_builder_moveTo; + outline->root.lineTo = cf2_builder_lineTo; + outline->root.cubeTo = cf2_builder_cubeTo; + } + + + /* get scaling and hint flag from GlyphSlot */ + static void + cf2_getScaleAndHintFlag( PS_Decoder* decoder, + CF2_Fixed* x_scale, + CF2_Fixed* y_scale, + FT_Bool* hinted, + FT_Bool* scaled ) + { + FT_ASSERT( decoder && decoder->builder.glyph ); + + /* note: FreeType scale includes a factor of 64 */ + *hinted = decoder->builder.glyph->hint; + *scaled = decoder->builder.glyph->scaled; + + if ( *hinted ) + { + *x_scale = ADD_INT32( decoder->builder.glyph->x_scale, 32 ) / 64; + *y_scale = ADD_INT32( decoder->builder.glyph->y_scale, 32 ) / 64; + } + else + { + /* for unhinted outlines, `cff_slot_load' does the scaling, */ + /* thus render at `unity' scale */ + + *x_scale = 0x0400; /* 1/64 as 16.16 */ + *y_scale = 0x0400; + } + } + + + /* get units per em from `FT_Face' */ + /* TODO: should handle font matrix concatenation? */ + static FT_UShort + cf2_getUnitsPerEm( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->builder.face ); + + return decoder->builder.face->units_per_EM; + } + + + /* Main entry point: Render one glyph. */ + FT_LOCAL_DEF( FT_Error ) + cf2_decoder_parse_charstrings( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ) + { + FT_Memory memory; + FT_Error error = FT_Err_Ok; + CF2_Font font; + + FT_Bool is_t1 = decoder->builder.is_t1; + + + FT_ASSERT( decoder && + ( is_t1 || decoder->cff ) ); + + if ( is_t1 && !decoder->current_subfont ) + { + FT_ERROR(( "cf2_decoder_parse_charstrings (Type 1): " + "SubFont missing. Use `t1_make_subfont' first\n" )); + return FT_THROW( Invalid_Table ); + } + + memory = decoder->builder.memory; + + /* CF2 data is saved here across glyphs */ + font = (CF2_Font)decoder->cf2_instance->data; + + /* on first glyph, allocate instance structure */ + if ( !decoder->cf2_instance->data ) + { + decoder->cf2_instance->finalizer = + (FT_Generic_Finalizer)cf2_free_instance; + + if ( FT_ALLOC( decoder->cf2_instance->data, + sizeof ( CF2_FontRec ) ) ) + return FT_THROW( Out_Of_Memory ); + + font = (CF2_Font)decoder->cf2_instance->data; + + font->memory = memory; + + if ( !is_t1 ) + font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload; + + /* initialize a client outline, to be shared by each glyph rendered */ + cf2_outline_init( &font->outline, font->memory, &font->error ); + } + + /* save decoder; it is a stack variable and will be different on each */ + /* call */ + font->decoder = decoder; + font->outline.decoder = decoder; + + { + /* build parameters for Adobe engine */ + + PS_Builder* builder = &decoder->builder; + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); + + FT_Bool no_stem_darkening_driver = + driver->no_stem_darkening; + FT_Char no_stem_darkening_font = + builder->face->internal->no_stem_darkening; + + /* local error */ + FT_Error error2 = FT_Err_Ok; + CF2_BufferRec buf; + CF2_Matrix transform; + CF2_F16Dot16 glyphWidth; + + FT_Bool hinted; + FT_Bool scaled; + + + /* FreeType has already looked up the GID; convert to */ + /* `RegionBuffer', assuming that the input has been validated */ + FT_ASSERT( charstring_base + charstring_len >= charstring_base ); + + FT_ZERO( &buf ); + buf.start = + buf.ptr = charstring_base; + buf.end = FT_OFFSET( charstring_base, charstring_len ); + + FT_ZERO( &transform ); + + cf2_getScaleAndHintFlag( decoder, + &transform.a, + &transform.d, + &hinted, + &scaled ); + + if ( is_t1 ) + font->isCFF2 = FALSE; + else + { + /* copy isCFF2 boolean from TT_Face to CF2_Font */ + font->isCFF2 = ((TT_Face)builder->face)->is_cff2; + } + font->isT1 = is_t1; + + font->renderingFlags = 0; + if ( hinted ) + font->renderingFlags |= CF2_FlagsHinted; + if ( scaled && ( !no_stem_darkening_font || + ( no_stem_darkening_font < 0 && + !no_stem_darkening_driver ) ) ) + font->renderingFlags |= CF2_FlagsDarkened; + + font->darkenParams[0] = driver->darken_params[0]; + font->darkenParams[1] = driver->darken_params[1]; + font->darkenParams[2] = driver->darken_params[2]; + font->darkenParams[3] = driver->darken_params[3]; + font->darkenParams[4] = driver->darken_params[4]; + font->darkenParams[5] = driver->darken_params[5]; + font->darkenParams[6] = driver->darken_params[6]; + font->darkenParams[7] = driver->darken_params[7]; + + /* now get an outline for this glyph; */ + /* also get units per em to validate scale */ + font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder ); + + if ( scaled ) + { + error2 = cf2_checkTransform( &transform, font->unitsPerEm ); + if ( error2 ) + return error2; + } + + error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth ); + if ( error2 ) + return FT_ERR( Invalid_File_Format ); + + cf2_setGlyphWidth( &font->outline, glyphWidth ); + + return FT_Err_Ok; + } + } + + + /* get pointer to current FreeType subfont (based on current glyphID) */ + FT_LOCAL_DEF( CFF_SubFont ) + cf2_getSubfont( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return decoder->current_subfont; + } + + + /* get pointer to VStore structure */ + FT_LOCAL_DEF( CFF_VStore ) + cf2_getVStore( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->cff ); + + return &decoder->cff->vstore; + } + + + /* get maxstack value from CFF2 Top DICT */ + FT_LOCAL_DEF( FT_UInt ) + cf2_getMaxstack( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->cff ); + + return decoder->cff->top_font.font_dict.maxstack; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Get normalized design vector for current render request; */ + /* return pointer and length. */ + /* */ + /* Note: Uses FT_Fixed not CF2_Fixed for the vector. */ + FT_LOCAL_DEF( FT_Error ) + cf2_getNormalizedVector( PS_Decoder* decoder, + CF2_UInt *len, + FT_Fixed* *vec ) + { + TT_Face face; + FT_Service_MultiMasters mm; + + + FT_ASSERT( decoder && decoder->builder.face ); + FT_ASSERT( vec && len ); + FT_ASSERT( !decoder->builder.is_t1 ); + + face = (TT_Face)decoder->builder.face; + mm = (FT_Service_MultiMasters)face->mm; + + return mm->get_var_blend( FT_FACE( face ), len, NULL, vec, NULL ); + } +#endif + + + /* get `y_ppem' from `CFF_Size' */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getPpemY( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && + decoder->builder.face && + decoder->builder.face->size ); + + /* + * Note that `y_ppem' can be zero if there wasn't a call to + * `FT_Set_Char_Size' or something similar. However, this isn't a + * problem since we come to this place in the code only if + * FT_LOAD_NO_SCALE is set (the other case gets caught by + * `cf2_checkTransform'). The ppem value is needed to compute the stem + * darkening, which is disabled for getting the unscaled outline. + * + */ + return cf2_intToFixed( + decoder->builder.face->size->metrics.y_ppem ); + } + + + /* get standard stem widths for the current subfont; */ + /* FreeType stores these as integer font units */ + /* (note: variable names seem swapped) */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getStdVW( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.standard_height ); + } + + + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getStdHW( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.standard_width ); + } + + + /* note: FreeType stores 1000 times the actual value for `BlueScale' */ + FT_LOCAL_DEF( void ) + cf2_getBlueMetrics( PS_Decoder* decoder, + CF2_Fixed* blueScale, + CF2_Fixed* blueShift, + CF2_Fixed* blueFuzz ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *blueScale = FT_DivFix( + decoder->current_subfont->private_dict.blue_scale, + cf2_intToFixed( 1000 ) ); + *blueShift = cf2_intToFixed( + decoder->current_subfont->private_dict.blue_shift ); + *blueFuzz = cf2_intToFixed( + decoder->current_subfont->private_dict.blue_fuzz ); + } + + + /* get blue values counts and arrays; the FreeType parser has validated */ + /* the counts and verified that each is an even number */ + FT_LOCAL_DEF( void ) + cf2_getBlueValues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_blue_values; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.blue_values; + } + + + FT_LOCAL_DEF( void ) + cf2_getOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_other_blues; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.other_blues; + } + + + FT_LOCAL_DEF( void ) + cf2_getFamilyBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_family_blues; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.family_blues; + } + + + FT_LOCAL_DEF( void ) + cf2_getFamilyOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_family_other_blues; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.family_other_blues; + } + + + FT_LOCAL_DEF( CF2_Int ) + cf2_getLanguageGroup( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return decoder->current_subfont->private_dict.language_group; + } + + + /* convert unbiased subroutine index to `CF2_Buffer' and */ + /* return 0 on success */ + FT_LOCAL_DEF( CF2_Int ) + cf2_initGlobalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ) + { + CF2_UInt idx; + + + FT_ASSERT( decoder ); + + FT_ZERO( buf ); + + idx = (CF2_UInt)( subrNum + decoder->globals_bias ); + if ( idx >= decoder->num_globals ) + return TRUE; /* error */ + + FT_ASSERT( decoder->globals ); + + buf->start = + buf->ptr = decoder->globals[idx]; + buf->end = decoder->globals[idx + 1]; + + return FALSE; /* success */ + } + + + /* convert AdobeStandardEncoding code to CF2_Buffer; */ + /* used for seac component */ + FT_LOCAL_DEF( FT_Error ) + cf2_getSeacComponent( PS_Decoder* decoder, + CF2_Int code, + CF2_Buffer buf ) + { + CF2_Int gid; + FT_Byte* charstring; + FT_ULong len; + FT_Error error; + + + FT_ASSERT( decoder ); + FT_ASSERT( !decoder->builder.is_t1 ); + + FT_ZERO( buf ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( decoder->builder.face->internal->incremental_interface ) + gid = code; + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code ); + if ( gid < 0 ) + return FT_THROW( Invalid_Glyph_Format ); + } + + error = decoder->get_glyph_callback( (TT_Face)decoder->builder.face, + (CF2_UInt)gid, + &charstring, + &len ); + /* TODO: for now, just pass the FreeType error through */ + if ( error ) + return error; + + /* assume input has been validated */ + FT_ASSERT( charstring + len >= charstring ); + + buf->start = charstring; + buf->end = FT_OFFSET( charstring, len ); + buf->ptr = buf->start; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cf2_freeSeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ) + { + FT_ASSERT( decoder ); + FT_ASSERT( !decoder->builder.is_t1 ); + + decoder->free_glyph_callback( (TT_Face)decoder->builder.face, + (FT_Byte**)&buf->start, + (FT_ULong)( buf->end - buf->start ) ); + } + + + FT_LOCAL_DEF( FT_Error ) + cf2_getT1SeacComponent( PS_Decoder* decoder, + FT_UInt glyph_index, + CF2_Buffer buf ) + { + FT_Data glyph_data; + FT_Error error = FT_Err_Ok; + T1_Face face = (T1_Face)decoder->builder.face; + T1_Font type1 = &face->type1; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec *inc = + face->root.internal->incremental_interface; + + + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( inc ) + error = inc->funcs->get_glyph_data( inc->object, + glyph_index, &glyph_data ); + else +#endif + /* For ordinary fonts get the character data stored in the face record. */ + { + glyph_data.pointer = type1->charstrings[glyph_index]; + glyph_data.length = type1->charstrings_len[glyph_index]; + } + + if ( !error ) + { + FT_Byte* charstring_base = (FT_Byte*)glyph_data.pointer; + FT_ULong charstring_len = glyph_data.length; + + + FT_ASSERT( charstring_base + charstring_len >= charstring_base ); + + FT_ZERO( buf ); + buf->start = + buf->ptr = charstring_base; + buf->end = charstring_base + charstring_len; + } + + return error; + } + + + FT_LOCAL_DEF( void ) + cf2_freeT1SeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + T1_Face face; + FT_Data data; + + + FT_ASSERT( decoder ); + + face = (T1_Face)decoder->builder.face; + + data.pointer = buf->start; + data.length = (FT_UInt)( buf->end - buf->start ); + + if ( face->root.internal->incremental_interface ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &data ); + +#else /* !FT_CONFIG_OPTION_INCREMENTAL */ + + FT_UNUSED( decoder ); + FT_UNUSED( buf ); + +#endif /* !FT_CONFIG_OPTION_INCREMENTAL */ + } + + + FT_LOCAL_DEF( CF2_Int ) + cf2_initLocalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ) + { + CF2_UInt idx; + + + FT_ASSERT( decoder ); + + FT_ZERO( buf ); + + idx = (CF2_UInt)( subrNum + decoder->locals_bias ); + if ( idx >= decoder->num_locals ) + return TRUE; /* error */ + + FT_ASSERT( decoder->locals ); + + buf->start = decoder->locals[idx]; + + if ( decoder->builder.is_t1 ) + { + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + if ( decoder->locals_len ) + buf->end = FT_OFFSET( buf->start, decoder->locals_len[idx] ); + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + buf->start += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + buf->end = decoder->locals[idx + 1]; + } + + if ( !buf->start ) + { + FT_ERROR(( "cf2_initLocalRegionBuffer (Type 1 mode):" + " invoking empty subrs\n" )); + } + } + else + { + buf->end = decoder->locals[idx + 1]; + } + + buf->ptr = buf->start; + + return FALSE; /* success */ + } + + + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getDefaultWidthX( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.default_width ); + } + + + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getNominalWidthX( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.nominal_width ); + } + + + FT_LOCAL_DEF( void ) + cf2_outline_reset( CF2_Outline outline ) + { + PS_Decoder* decoder = outline->decoder; + + + FT_ASSERT( decoder ); + + outline->root.windingMomentum = 0; + + FT_GlyphLoader_Rewind( decoder->builder.loader ); + } + + + FT_LOCAL_DEF( void ) + cf2_outline_close( CF2_Outline outline ) + { + PS_Decoder* decoder = outline->decoder; + + + FT_ASSERT( decoder ); + + ps_builder_close_contour( &decoder->builder ); + + FT_GlyphLoader_Add( decoder->builder.loader ); + } + + +/* END */ diff --git a/external/freetype/src/psaux/psft.h b/external/freetype/src/psaux/psft.h new file mode 100644 index 000000000..3da454e60 --- /dev/null +++ b/external/freetype/src/psaux/psft.h @@ -0,0 +1,167 @@ +/**************************************************************************** + * + * psft.h + * + * FreeType Glue Component to Adobe's Interpreter (specification). + * + * Copyright 2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSFT_H_ +#define PSFT_H_ + + +#include <freetype/internal/compiler-macros.h> +#include "pstypes.h" + + /* TODO: disable asserts for now */ +#define CF2_NDEBUG + + +#include <freetype/ftsystem.h> + +#include "psglue.h" +#include <freetype/internal/psaux.h> /* for PS_Decoder */ + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + cf2_decoder_parse_charstrings( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + FT_LOCAL( CFF_SubFont ) + cf2_getSubfont( PS_Decoder* decoder ); + + FT_LOCAL( CFF_VStore ) + cf2_getVStore( PS_Decoder* decoder ); + + FT_LOCAL( FT_UInt ) + cf2_getMaxstack( PS_Decoder* decoder ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_LOCAL( FT_Error ) + cf2_getNormalizedVector( PS_Decoder* decoder, + CF2_UInt *len, + FT_Fixed* *vec ); +#endif + + FT_LOCAL( CF2_Fixed ) + cf2_getPpemY( PS_Decoder* decoder ); + FT_LOCAL( CF2_Fixed ) + cf2_getStdVW( PS_Decoder* decoder ); + FT_LOCAL( CF2_Fixed ) + cf2_getStdHW( PS_Decoder* decoder ); + + FT_LOCAL( void ) + cf2_getBlueMetrics( PS_Decoder* decoder, + CF2_Fixed* blueScale, + CF2_Fixed* blueShift, + CF2_Fixed* blueFuzz ); + FT_LOCAL( void ) + cf2_getBlueValues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + FT_LOCAL( void ) + cf2_getOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + FT_LOCAL( void ) + cf2_getFamilyBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + FT_LOCAL( void ) + cf2_getFamilyOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + + FT_LOCAL( CF2_Int ) + cf2_getLanguageGroup( PS_Decoder* decoder ); + + FT_LOCAL( CF2_Int ) + cf2_initGlobalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ); + FT_LOCAL( FT_Error ) + cf2_getSeacComponent( PS_Decoder* decoder, + CF2_Int code, + CF2_Buffer buf ); + FT_LOCAL( void ) + cf2_freeSeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ); + FT_LOCAL( CF2_Int ) + cf2_initLocalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ); + + FT_LOCAL( CF2_Fixed ) + cf2_getDefaultWidthX( PS_Decoder* decoder ); + FT_LOCAL( CF2_Fixed ) + cf2_getNominalWidthX( PS_Decoder* decoder ); + + + FT_LOCAL( FT_Error ) + cf2_getT1SeacComponent( PS_Decoder* decoder, + FT_UInt glyph_index, + CF2_Buffer buf ); + FT_LOCAL( void ) + cf2_freeT1SeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ); + + /* + * FreeType client outline + * + * process output from the charstring interpreter + */ + typedef struct CF2_OutlineRec_ + { + CF2_OutlineCallbacksRec root; /* base class must be first */ + PS_Decoder* decoder; + + } CF2_OutlineRec, *CF2_Outline; + + + FT_LOCAL( void ) + cf2_outline_reset( CF2_Outline outline ); + FT_LOCAL( void ) + cf2_outline_close( CF2_Outline outline ); + + +FT_END_HEADER + + +#endif /* PSFT_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psglue.h b/external/freetype/src/psaux/psglue.h new file mode 100644 index 000000000..63085d71c --- /dev/null +++ b/external/freetype/src/psaux/psglue.h @@ -0,0 +1,144 @@ +/**************************************************************************** + * + * psglue.h + * + * Adobe's code for shared stuff (specification only). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSGLUE_H_ +#define PSGLUE_H_ + + +/* common includes for other modules */ +#include "pserror.h" +#include "psfixed.h" +#include "psarrst.h" +#include "psread.h" + + +FT_BEGIN_HEADER + + + /* rendering parameters */ + + /* apply hints to rendered glyphs */ +#define CF2_FlagsHinted 1 + /* for testing */ +#define CF2_FlagsDarkened 2 + + /* type for holding the flags */ + typedef CF2_Int CF2_RenderingFlags; + + + /* elements of a glyph outline */ + typedef enum CF2_PathOp_ + { + CF2_PathOpMoveTo = 1, /* change the current point */ + CF2_PathOpLineTo = 2, /* line */ + CF2_PathOpQuadTo = 3, /* quadratic curve */ + CF2_PathOpCubeTo = 4 /* cubic curve */ + + } CF2_PathOp; + + + /* a matrix of fixed-point values */ + typedef struct CF2_Matrix_ + { + CF2_F16Dot16 a; + CF2_F16Dot16 b; + CF2_F16Dot16 c; + CF2_F16Dot16 d; + CF2_F16Dot16 tx; + CF2_F16Dot16 ty; + + } CF2_Matrix; + + + /* these typedefs are needed by more than one header file */ + /* and gcc compiler doesn't allow redefinition */ + typedef struct CF2_FontRec_ CF2_FontRec, *CF2_Font; + typedef struct CF2_HintRec_ CF2_HintRec, *CF2_Hint; + + + /* A common structure for all callback parameters. */ + /* */ + /* Some members may be unused. For example, `pt0' is not used for */ + /* `moveTo' and `pt3' is not used for `quadTo'. The initial point `pt0' */ + /* is included for each path element for generality; curve conversions */ + /* need it. The `op' parameter allows one function to handle multiple */ + /* element types. */ + + typedef struct CF2_CallbackParamsRec_ + { + FT_Vector pt0; + FT_Vector pt1; + FT_Vector pt2; + FT_Vector pt3; + + CF2_Int op; + + } CF2_CallbackParamsRec, *CF2_CallbackParams; + + + /* forward reference */ + typedef struct CF2_OutlineCallbacksRec_ CF2_OutlineCallbacksRec, + *CF2_OutlineCallbacks; + + /* callback function pointers */ + typedef void + (*CF2_Callback_Type)( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ); + + + struct CF2_OutlineCallbacksRec_ + { + CF2_Callback_Type moveTo; + CF2_Callback_Type lineTo; + CF2_Callback_Type quadTo; + CF2_Callback_Type cubeTo; + + CF2_Int windingMomentum; /* for winding order detection */ + + FT_Memory memory; + FT_Error* error; + }; + + +FT_END_HEADER + + +#endif /* PSGLUE_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/pshints.c b/external/freetype/src/psaux/pshints.c new file mode 100644 index 000000000..7bd08a9c9 --- /dev/null +++ b/external/freetype/src/psaux/pshints.c @@ -0,0 +1,1952 @@ +/**************************************************************************** + * + * pshints.c + * + * Adobe's code for handling CFF hints (body). + * + * Copyright 2007-2014 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> + +#include "psglue.h" +#include "psfont.h" +#include "pshints.h" +#include "psintrp.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cf2hints + + + typedef struct CF2_HintMoveRec_ + { + size_t j; /* index of upper hint map edge */ + CF2_Fixed moveUp; /* adjustment to optimum position */ + + } CF2_HintMoveRec, *CF2_HintMove; + + + /* Compute angular momentum for winding order detection. It is called */ + /* for all lines and curves, but not necessarily in element order. */ + static CF2_Int + cf2_getWindingMomentum( CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2 ) + { + /* cross product of pt1 position from origin with pt2 position from */ + /* pt1; we reduce the precision so that the result fits into 32 bits */ + + return ( x1 >> 16 ) * ( SUB_INT32( y2, y1 ) >> 16 ) - + ( y1 >> 16 ) * ( SUB_INT32( x2, x1 ) >> 16 ); + } + + + /* + * Construct from a StemHint; this is used as a parameter to + * `cf2_blues_capture'. + * `hintOrigin' is the character space displacement of a seac accent. + * Adjust stem hint for darkening here. + * + */ + static void + cf2_hint_init( CF2_Hint hint, + const CF2_ArrStack stemHintArray, + size_t indexStemHint, + const CF2_Font font, + CF2_Fixed hintOrigin, + CF2_Fixed scale, + FT_Bool bottom ) + { + CF2_Fixed width; + const CF2_StemHintRec* stemHint; + + + FT_ZERO( hint ); + + stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer( + stemHintArray, + indexStemHint ); + + width = SUB_INT32( stemHint->max, stemHint->min ); + + if ( width == cf2_intToFixed( -21 ) ) + { + /* ghost bottom */ + + if ( bottom ) + { + hint->csCoord = stemHint->max; + hint->flags = CF2_GhostBottom; + } + else + hint->flags = 0; + } + + else if ( width == cf2_intToFixed( -20 ) ) + { + /* ghost top */ + + if ( bottom ) + hint->flags = 0; + else + { + hint->csCoord = stemHint->min; + hint->flags = CF2_GhostTop; + } + } + + else if ( width < 0 ) + { + /* inverted pair */ + + /* + * Hints with negative widths were produced by an early version of a + * non-Adobe font tool. The Type 2 spec allows edge (ghost) hints + * with negative widths, but says + * + * All other negative widths have undefined meaning. + * + * CoolType has a silent workaround that negates the hint width; for + * permissive mode, we do the same here. + * + * Note: Such fonts cannot use ghost hints, but should otherwise work. + * Note: Some poor hints in our faux fonts can produce negative + * widths at some blends. For example, see a light weight of + * `u' in ASerifMM. + * + */ + if ( bottom ) + { + hint->csCoord = stemHint->max; + hint->flags = CF2_PairBottom; + } + else + { + hint->csCoord = stemHint->min; + hint->flags = CF2_PairTop; + } + } + + else + { + /* normal pair */ + + if ( bottom ) + { + hint->csCoord = stemHint->min; + hint->flags = CF2_PairBottom; + } + else + { + hint->csCoord = stemHint->max; + hint->flags = CF2_PairTop; + } + } + + /* Now that ghost hints have been detected, adjust this edge for */ + /* darkening. Bottoms are not changed; tops are incremented by twice */ + /* `darkenY'. */ + if ( cf2_hint_isTop( hint ) ) + hint->csCoord = ADD_INT32( hint->csCoord, 2 * font->darkenY ); + + hint->csCoord = ADD_INT32( hint->csCoord, hintOrigin ); + hint->scale = scale; + hint->index = indexStemHint; /* index in original stem hint array */ + + /* if original stem hint has been used, use the same position */ + if ( hint->flags != 0 && stemHint->used ) + { + if ( cf2_hint_isTop( hint ) ) + hint->dsCoord = stemHint->maxDS; + else + hint->dsCoord = stemHint->minDS; + + cf2_hint_lock( hint ); + } + else + hint->dsCoord = FT_MulFix( hint->csCoord, scale ); + } + + + /* initialize an invalid hint map element */ + static void + cf2_hint_initZero( CF2_Hint hint ) + { + FT_ZERO( hint ); + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hint_isValid( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags ); + } + + + static FT_Bool + cf2_hint_isPair( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags & ( CF2_PairBottom | CF2_PairTop ) ); + } + + + static FT_Bool + cf2_hint_isPairTop( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags & CF2_PairTop ); + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hint_isTop( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags & ( CF2_PairTop | CF2_GhostTop ) ); + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hint_isBottom( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags & ( CF2_PairBottom | CF2_GhostBottom ) ); + } + + + static FT_Bool + cf2_hint_isLocked( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags & CF2_Locked ); + } + + + static FT_Bool + cf2_hint_isSynthetic( const CF2_Hint hint ) + { + return FT_BOOL( hint->flags & CF2_Synthetic ); + } + + + FT_LOCAL_DEF( void ) + cf2_hint_lock( CF2_Hint hint ) + { + hint->flags |= CF2_Locked; + } + + + FT_LOCAL_DEF( void ) + cf2_hintmap_init( CF2_HintMap hintmap, + CF2_Font font, + CF2_HintMap initialMap, + CF2_ArrStack hintMoves, + CF2_Fixed scale ) + { + FT_ZERO( hintmap ); + + /* copy parameters from font instance */ + hintmap->hinted = font->hinted; + hintmap->scale = scale; + hintmap->font = font; + hintmap->initialHintMap = initialMap; + /* will clear in `cf2_hintmap_adjustHints' */ + hintmap->hintMoves = hintMoves; + } + + + static FT_Bool + cf2_hintmap_isValid( const CF2_HintMap hintmap ) + { + return hintmap->isValid; + } + + + static void + cf2_hintmap_dump( CF2_HintMap hintmap ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + CF2_UInt i; + + + FT_TRACE6(( " index csCoord dsCoord scale flags\n" )); + + for ( i = 0; i < hintmap->count; i++ ) + { + CF2_Hint hint = &hintmap->edge[i]; + + + FT_TRACE6(( " %3zu %7.2f %7.2f %5d %s%s%s%s\n", + hint->index, + hint->csCoord / 65536.0, + hint->dsCoord / ( hint->scale * 1.0 ), + hint->scale, + ( cf2_hint_isPair( hint ) ? "p" : "g" ), + ( cf2_hint_isTop( hint ) ? "t" : "b" ), + ( cf2_hint_isLocked( hint ) ? "L" : ""), + ( cf2_hint_isSynthetic( hint ) ? "S" : "" ) )); + } +#else + FT_UNUSED( hintmap ); +#endif + } + + + /* transform character space coordinate to device space using hint map */ + static CF2_Fixed + cf2_hintmap_map( CF2_HintMap hintmap, + CF2_Fixed csCoord ) + { + if ( hintmap->count == 0 || !hintmap->hinted ) + { + /* there are no hints; use uniform scale and zero offset */ + return FT_MulFix( csCoord, hintmap->scale ); + } + else + { + /* start linear search from last hit */ + CF2_UInt i = hintmap->lastIndex; + + + FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES ); + + /* search up */ + while ( i < hintmap->count - 1 && + csCoord >= hintmap->edge[i + 1].csCoord ) + i += 1; + + /* search down */ + while ( i > 0 && csCoord < hintmap->edge[i].csCoord ) + i -= 1; + + hintmap->lastIndex = i; + + if ( i == 0 && csCoord < hintmap->edge[0].csCoord ) + { + /* special case for points below first edge: use uniform scale */ + return ADD_INT32( FT_MulFix( SUB_INT32( csCoord, + hintmap->edge[0].csCoord ), + hintmap->scale ), + hintmap->edge[0].dsCoord ); + } + else + { + /* + * Note: entries with duplicate csCoord are allowed. + * Use edge[i], the highest entry where csCoord >= entry[i].csCoord + */ + return ADD_INT32( FT_MulFix( SUB_INT32( csCoord, + hintmap->edge[i].csCoord ), + hintmap->edge[i].scale ), + hintmap->edge[i].dsCoord ); + } + } + } + + + /* + * This hinting policy moves a hint pair in device space so that one of + * its two edges is on a device pixel boundary (its fractional part is + * zero). `cf2_hintmap_insertHint' guarantees no overlap in CS + * space. Ensure here that there is no overlap in DS. + * + * In the first pass, edges are adjusted relative to adjacent hints. + * Those that are below have already been adjusted. Those that are + * above have not yet been adjusted. If a hint above blocks an + * adjustment to an optimal position, we will try again in a second + * pass. The second pass is top-down. + * + */ + + static void + cf2_hintmap_adjustHints( CF2_HintMap hintmap ) + { + size_t i, j; + + + cf2_arrstack_clear( hintmap->hintMoves ); /* working storage */ + + /* + * First pass is bottom-up (font hint order) without look-ahead. + * Locked edges are already adjusted. + * Unlocked edges begin with dsCoord from `initialHintMap'. + * Save edges that are not optimally adjusted in `hintMoves' array, + * and process them in second pass. + */ + + for ( i = 0; i < hintmap->count; i++ ) + { + FT_Bool isPair = cf2_hint_isPair( &hintmap->edge[i] ); + + /* final amount to move edge or edge pair */ + CF2_Fixed move = 0; + + CF2_Fixed dsCoord_i; + CF2_Fixed dsCoord_j; + + + /* index of upper edge (same value for ghost hint) */ + j = isPair ? i + 1 : i; + + FT_ASSERT( j < hintmap->count ); + FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) ); + FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) ); + FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) == + cf2_hint_isLocked( &hintmap->edge[j] ) ); + + dsCoord_i = hintmap->edge[i].dsCoord; + dsCoord_j = hintmap->edge[j].dsCoord; + + if ( !cf2_hint_isLocked( &hintmap->edge[i] ) ) + { + /* hint edge is not locked, we can adjust it */ + CF2_Fixed fracDown = cf2_fixedFraction( dsCoord_i ); + CF2_Fixed fracUp = cf2_fixedFraction( dsCoord_j ); + + /* calculate all four possibilities; moves down are negative */ + CF2_Fixed downMoveDown = 0 - fracDown; + CF2_Fixed upMoveDown = 0 - fracUp; + CF2_Fixed downMoveUp = ( fracDown == 0 ) + ? 0 + : cf2_intToFixed( 1 ) - fracDown; + CF2_Fixed upMoveUp = ( fracUp == 0 ) + ? 0 + : cf2_intToFixed( 1 ) - fracUp; + + /* smallest move up */ + CF2_Fixed moveUp = FT_MIN( downMoveUp, upMoveUp ); + /* smallest move down */ + CF2_Fixed moveDown = FT_MAX( downMoveDown, upMoveDown ); + + CF2_Fixed downMinCounter = CF2_MIN_COUNTER; + CF2_Fixed upMinCounter = CF2_MIN_COUNTER; + FT_Bool saveEdge = FALSE; + + + /* minimum counter constraint doesn't apply when adjacent edges */ + /* are synthetic */ + /* TODO: doesn't seem a big effect; for now, reduce the code */ +#if 0 + if ( i == 0 || + cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) ) + downMinCounter = 0; + + if ( j >= hintmap->count - 1 || + cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) ) + upMinCounter = 0; +#endif + + /* is there room to move up? */ + /* there is if we are at top of array or the next edge is at or */ + /* beyond proposed move up? */ + if ( j >= hintmap->count - 1 || + hintmap->edge[j + 1].dsCoord >= + ADD_INT32( dsCoord_j, moveUp + upMinCounter ) ) + { + /* there is room to move up; is there also room to move down? */ + if ( i == 0 || + hintmap->edge[i - 1].dsCoord <= + ADD_INT32( dsCoord_i, moveDown - downMinCounter ) ) + { + /* move smaller absolute amount */ + move = ( -moveDown < moveUp ) ? moveDown : moveUp; /* optimum */ + } + else + move = moveUp; + } + else + { + /* is there room to move down? */ + if ( i == 0 || + hintmap->edge[i - 1].dsCoord <= + ADD_INT32( dsCoord_i, moveDown - downMinCounter ) ) + { + move = moveDown; + /* true if non-optimum move */ + saveEdge = FT_BOOL( moveUp < -moveDown ); + } + else + { + /* no room to move either way without overlapping or reducing */ + /* the counter too much */ + move = 0; + saveEdge = TRUE; + } + } + + /* Identify non-moves and moves down that aren't optimal, and save */ + /* them for second pass. */ + /* Do this only if there is an unlocked edge above (which could */ + /* possibly move). */ + if ( saveEdge && + j < hintmap->count - 1 && + !cf2_hint_isLocked( &hintmap->edge[j + 1] ) ) + { + CF2_HintMoveRec savedMove; + + + savedMove.j = j; + /* desired adjustment in second pass */ + savedMove.moveUp = moveUp - move; + + cf2_arrstack_push( hintmap->hintMoves, &savedMove ); + } + + /* move the edge(s) */ + hintmap->edge[i].dsCoord = ADD_INT32( dsCoord_i, move ); + if ( isPair ) + hintmap->edge[j].dsCoord = ADD_INT32( dsCoord_j, move ); + } + + /* assert there are no overlaps in device space; */ + /* ignore tests if there was overflow (that is, if */ + /* operands have the same sign but the sum does not) */ + FT_ASSERT( i == 0 || + ( ( dsCoord_i ^ move ) >= 0 && + ( dsCoord_i ^ hintmap->edge[i].dsCoord ) < 0 ) || + hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord ); + FT_ASSERT( i < j || + ( ( dsCoord_j ^ move ) >= 0 && + ( dsCoord_j ^ hintmap->edge[j].dsCoord ) < 0 ) || + hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord ); + + /* adjust the scales, avoiding divide by zero */ + if ( i > 0 ) + { + if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord ) + hintmap->edge[i - 1].scale = + FT_DivFix( SUB_INT32( hintmap->edge[i].dsCoord, + hintmap->edge[i - 1].dsCoord ), + SUB_INT32( hintmap->edge[i].csCoord, + hintmap->edge[i - 1].csCoord ) ); + } + + if ( isPair ) + { + if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord ) + hintmap->edge[j - 1].scale = + FT_DivFix( SUB_INT32( hintmap->edge[j].dsCoord, + hintmap->edge[j - 1].dsCoord ), + SUB_INT32( hintmap->edge[j].csCoord, + hintmap->edge[j - 1].csCoord ) ); + + i += 1; /* skip upper edge on next loop */ + } + } + + /* second pass tries to move non-optimal hints up, in case there is */ + /* room now */ + for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- ) + { + CF2_HintMove hintMove = (CF2_HintMove) + cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 ); + + + j = hintMove->j; + + /* this was tested before the push, above */ + FT_ASSERT( j < hintmap->count - 1 ); + + /* is there room to move up? */ + if ( hintmap->edge[j + 1].dsCoord >= + ADD_INT32( hintmap->edge[j].dsCoord, + hintMove->moveUp + CF2_MIN_COUNTER ) ) + { + /* there is more room now, move edge up */ + hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord, + hintMove->moveUp ); + + if ( cf2_hint_isPair( &hintmap->edge[j] ) ) + { + FT_ASSERT( j > 0 ); + hintmap->edge[j - 1].dsCoord = + ADD_INT32( hintmap->edge[j - 1].dsCoord, hintMove->moveUp ); + } + } + } + } + + + /* insert hint edges into map, sorted by csCoord */ + static void + cf2_hintmap_insertHint( CF2_HintMap hintmap, + CF2_Hint bottomHintEdge, + CF2_Hint topHintEdge ) + { + CF2_UInt indexInsert; + + /* set default values, then check for edge hints */ + FT_Bool isPair = TRUE; + CF2_Hint firstHintEdge = bottomHintEdge; + CF2_Hint secondHintEdge = topHintEdge; + + + /* one or none of the input params may be invalid when dealing with */ + /* edge hints; at least one edge must be valid */ + FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) || + cf2_hint_isValid( topHintEdge ) ); + + /* determine how many and which edges to insert */ + if ( !cf2_hint_isValid( bottomHintEdge ) ) + { + /* insert only the top edge */ + firstHintEdge = topHintEdge; + isPair = FALSE; + } + else if ( !cf2_hint_isValid( topHintEdge ) ) + { + /* insert only the bottom edge */ + isPair = FALSE; + } + + /* paired edges must be in proper order */ + if ( isPair && + topHintEdge->csCoord < bottomHintEdge->csCoord ) + return; + + /* linear search to find index value of insertion point */ + indexInsert = 0; + for ( ; indexInsert < hintmap->count; indexInsert++ ) + { + if ( hintmap->edge[indexInsert].csCoord >= firstHintEdge->csCoord ) + break; + } + + FT_TRACE7(( " Got hint at %.2f (%.2f)\n", + firstHintEdge->csCoord / 65536.0, + firstHintEdge->dsCoord / 65536.0 )); + if ( isPair ) + FT_TRACE7(( " Got hint at %.2f (%.2f)\n", + secondHintEdge->csCoord / 65536.0, + secondHintEdge->dsCoord / 65536.0 )); + + /* + * Discard any hints that overlap in character space. Most often, this + * is while building the initial map, where captured hints from all + * zones are combined. Define overlap to include hints that `touch' + * (overlap zero). Hiragino Sans/Gothic fonts have numerous hints that + * touch. Some fonts have non-ideographic glyphs that overlap our + * synthetic hints. + * + * Overlap also occurs when darkening stem hints that are close. + * + */ + if ( indexInsert < hintmap->count ) + { + /* we are inserting before an existing edge: */ + /* verify that an existing edge is not the same */ + if ( hintmap->edge[indexInsert].csCoord == firstHintEdge->csCoord ) + return; /* ignore overlapping stem hint */ + + /* verify that a new pair does not straddle the next edge */ + if ( isPair && + hintmap->edge[indexInsert].csCoord <= secondHintEdge->csCoord ) + return; /* ignore overlapping stem hint */ + + /* verify that we are not inserting between paired edges */ + if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) ) + return; /* ignore overlapping stem hint */ + } + + /* recompute device space locations using initial hint map */ + if ( cf2_hintmap_isValid( hintmap->initialHintMap ) && + !cf2_hint_isLocked( firstHintEdge ) ) + { + if ( isPair ) + { + /* Use hint map to position the center of stem, and nominal scale */ + /* to position the two edges. This preserves the stem width. */ + CF2_Fixed midpoint = + cf2_hintmap_map( + hintmap->initialHintMap, + ADD_INT32( + firstHintEdge->csCoord, + SUB_INT32 ( secondHintEdge->csCoord, + firstHintEdge->csCoord ) / 2 ) ); + CF2_Fixed halfWidth = + FT_MulFix( SUB_INT32( secondHintEdge->csCoord, + firstHintEdge->csCoord ) / 2, + hintmap->scale ); + + + firstHintEdge->dsCoord = SUB_INT32( midpoint, halfWidth ); + secondHintEdge->dsCoord = ADD_INT32( midpoint, halfWidth ); + } + else + firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap, + firstHintEdge->csCoord ); + } + + /* + * Discard any hints that overlap in device space; this can occur + * because locked hints have been moved to align with blue zones. + * + * TODO: Although we might correct this later during adjustment, we + * don't currently have a way to delete a conflicting hint once it has + * been inserted. See v2.030 MinionPro-Regular, 12 ppem darkened, + * initial hint map for second path, glyph 945 (the perispomeni (tilde) + * in U+1F6E, Greek omega with psili and perispomeni). Darkening is + * 25. Pair 667,747 initially conflicts in design space with top edge + * 660. This is because 667 maps to 7.87, and the top edge was + * captured by a zone at 8.0. The pair is later successfully inserted + * in a zone without the top edge. In this zone it is adjusted to 8.0, + * and no longer conflicts with the top edge in design space. This + * means it can be included in yet a later zone which does have the top + * edge hint. This produces a small mismatch between the first and + * last points of this path, even though the hint masks are the same. + * The density map difference is tiny (1/256). + * + */ + + if ( indexInsert > 0 ) + { + /* we are inserting after an existing edge */ + if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord ) + return; + } + + if ( indexInsert < hintmap->count ) + { + /* we are inserting before an existing edge */ + if ( isPair ) + { + if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) + return; + } + else + { + if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) + return; + } + } + + /* make room to insert */ + { + CF2_UInt iSrc = hintmap->count - 1; + CF2_UInt iDst = isPair ? hintmap->count + 1 : hintmap->count; + + CF2_UInt count = hintmap->count - indexInsert; + + + if ( iDst >= CF2_MAX_HINT_EDGES ) + { + FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" )); + return; + } + + while ( count-- ) + hintmap->edge[iDst--] = hintmap->edge[iSrc--]; + + /* insert first edge */ + hintmap->edge[indexInsert] = *firstHintEdge; /* copy struct */ + hintmap->count += 1; + + FT_TRACE7(( " Inserting hint %.2f (%.2f)\n", + firstHintEdge->csCoord / 65536.0, + firstHintEdge->dsCoord / 65536.0 )); + + if ( isPair ) + { + /* insert second edge */ + hintmap->edge[indexInsert + 1] = *secondHintEdge; /* copy struct */ + hintmap->count += 1; + + FT_TRACE7(( " Inserting hint %.2f (%.2f)\n", + secondHintEdge->csCoord / 65536.0, + secondHintEdge->dsCoord / 65536.0 )); + + } + } + + return; + } + + + /* + * Build a map from hints and mask. + * + * This function may recur one level if `hintmap->initialHintMap' is not yet + * valid. + * If `initialMap' is true, simply build initial map. + * + * Synthetic hints are used in two ways. A hint at zero is inserted, if + * needed, in the initial hint map, to prevent translations from + * propagating across the origin. If synthetic em box hints are enabled + * for ideographic dictionaries, then they are inserted in all hint + * maps, including the initial one. + * + */ + FT_LOCAL_DEF( void ) + cf2_hintmap_build( CF2_HintMap hintmap, + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOrigin, + FT_Bool initialMap ) + { + FT_Byte* maskPtr; + + CF2_Font font = hintmap->font; + CF2_HintMaskRec tempHintMask; + + size_t bitCount, i; + FT_Byte maskByte; + + + /* check whether initial map is constructed */ + if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) ) + { + /* make recursive call with initialHintMap and temporary mask; */ + /* temporary mask will get all bits set, below */ + cf2_hintmask_init( &tempHintMask, hintMask->error ); + cf2_hintmap_build( hintmap->initialHintMap, + hStemHintArray, + vStemHintArray, + &tempHintMask, + hintOrigin, + TRUE ); + } + + if ( !cf2_hintmask_isValid( hintMask ) ) + { + /* without a hint mask, assume all hints are active */ + cf2_hintmask_setAll( hintMask, + cf2_arrstack_size( hStemHintArray ) + + cf2_arrstack_size( vStemHintArray ) ); + if ( !cf2_hintmask_isValid( hintMask ) ) + { + if ( font->isT1 ) + { + /* no error, just continue unhinted */ + *hintMask->error = FT_Err_Ok; + hintmap->hinted = FALSE; + } + return; /* too many stem hints */ + } + } + + /* begin by clearing the map */ + hintmap->count = 0; + hintmap->lastIndex = 0; + + /* make a copy of the hint mask so we can modify it */ + tempHintMask = *hintMask; + maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); + + /* use the hStem hints only, which are first in the mask */ + bitCount = cf2_arrstack_size( hStemHintArray ); + + /* Defense-in-depth. Should never return here. */ + if ( bitCount > hintMask->bitCount ) + return; + + /* synthetic embox hints get highest priority */ + if ( font->blues.doEmBoxHints ) + { + CF2_HintRec dummy; + + + cf2_hint_initZero( &dummy ); /* invalid hint map element */ + + /* ghost bottom */ + cf2_hintmap_insertHint( hintmap, + &font->blues.emBoxBottomEdge, + &dummy ); + /* ghost top */ + cf2_hintmap_insertHint( hintmap, + &dummy, + &font->blues.emBoxTopEdge ); + } + + /* insert hints captured by a blue zone or already locked (higher */ + /* priority) */ + for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) + { + if ( maskByte & *maskPtr ) + { + /* expand StemHint into two `CF2_Hint' elements */ + CF2_HintRec bottomHintEdge, topHintEdge; + + + cf2_hint_init( &bottomHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + TRUE /* bottom */ ); + cf2_hint_init( &topHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + FALSE /* top */ ); + + if ( cf2_hint_isLocked( &bottomHintEdge ) || + cf2_hint_isLocked( &topHintEdge ) || + cf2_blues_capture( &font->blues, + &bottomHintEdge, + &topHintEdge ) ) + { + /* insert captured hint into map */ + cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); + + *maskPtr &= ~maskByte; /* turn off the bit for this hint */ + } + } + + if ( ( i & 7 ) == 7 ) + { + /* move to next mask byte */ + maskPtr++; + maskByte = 0x80; + } + else + maskByte >>= 1; + } + + /* initial hint map includes only captured hints plus maybe one at 0 */ + + /* + * TODO: There is a problem here because we are trying to build a + * single hint map containing all captured hints. It is + * possible for there to be conflicts between captured hints, + * either because of darkening or because the hints are in + * separate hint zones (we are ignoring hint zones for the + * initial map). An example of the latter is MinionPro-Regular + * v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem. + * A stem hint for the psili conflicts with the top edge hint + * for the base character. The stem hint gets priority because + * of its sort order. In glyph 884 (Greek Capital Alpha with + * Psili and Oxia), the top of the base character gets a stem + * hint, and the psili does not. This creates different initial + * maps for the two glyphs resulting in different renderings of + * the base character. Will probably defer this either as not + * worth the cost or as a font bug. I don't think there is any + * good reason for an accent to be captured by an alignment + * zone. -darnold 2/12/10 + */ + + if ( initialMap ) + { + /* Apply a heuristic that inserts a point for (0,0), unless it's */ + /* already covered by a mapping. This locks the baseline for glyphs */ + /* that have no baseline hints. */ + + if ( hintmap->count == 0 || + hintmap->edge[0].csCoord > 0 || + hintmap->edge[hintmap->count - 1].csCoord < 0 ) + { + /* all edges are above 0 or all edges are below 0; */ + /* construct a locked edge hint at 0 */ + + CF2_HintRec edge, invalid; + + + cf2_hint_initZero( &edge ); + + edge.flags = CF2_GhostBottom | + CF2_Locked | + CF2_Synthetic; + edge.scale = hintmap->scale; + + cf2_hint_initZero( &invalid ); + cf2_hintmap_insertHint( hintmap, &edge, &invalid ); + } + } + else + { + /* insert remaining hints */ + + maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); + + for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) + { + if ( maskByte & *maskPtr ) + { + CF2_HintRec bottomHintEdge, topHintEdge; + + + cf2_hint_init( &bottomHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + TRUE /* bottom */ ); + cf2_hint_init( &topHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + FALSE /* top */ ); + + cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); + } + + if ( ( i & 7 ) == 7 ) + { + /* move to next mask byte */ + maskPtr++; + maskByte = 0x80; + } + else + maskByte >>= 1; + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( initialMap ) + { + FT_TRACE6(( "flags: [p]air [g]host [t]op" + " [b]ottom [L]ocked [S]ynthetic\n" )); + FT_TRACE6(( "Initial hintmap:\n" )); + } + else + FT_TRACE6(( "Hints:\n" )); +#endif + + cf2_hintmap_dump( hintmap ); + + /* + * Note: The following line is a convenient place to break when + * debugging hinting. Examine `hintmap->edge' for the list of + * enabled hints, then step over the call to see the effect of + * adjustment. We stop here first on the recursive call that + * creates the initial map, and then on each counter group and + * hint zone. + */ + + /* adjust positions of hint edges that are not locked to blue zones */ + cf2_hintmap_adjustHints( hintmap ); + + FT_TRACE6(( "Hints adjusted:\n" )); + cf2_hintmap_dump( hintmap ); + + /* save the position of all hints that were used in this hint map; */ + /* if we use them again, we'll locate them in the same position */ + if ( !initialMap ) + { + for ( i = 0; i < hintmap->count; i++ ) + { + if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) ) + { + /* Note: include both valid and invalid edges */ + /* Note: top and bottom edges are copied back separately */ + CF2_StemHint stemhint = (CF2_StemHint) + cf2_arrstack_getPointer( hStemHintArray, + hintmap->edge[i].index ); + + + if ( cf2_hint_isTop( &hintmap->edge[i] ) ) + stemhint->maxDS = hintmap->edge[i].dsCoord; + else + stemhint->minDS = hintmap->edge[i].dsCoord; + + stemhint->used = TRUE; + } + } + } + + /* hint map is ready to use */ + hintmap->isValid = TRUE; + + /* remember this mask has been used */ + cf2_hintmask_setNew( hintMask, FALSE ); + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_init( CF2_GlyphPath glyphpath, + CF2_Font font, + CF2_OutlineCallbacks callbacks, + CF2_Fixed scaleY, + /* CF2_Fixed hShift, */ + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOriginY, + const CF2_Blues blues, + const FT_Vector* fractionalTranslation ) + { + FT_ZERO( glyphpath ); + + glyphpath->font = font; + glyphpath->callbacks = callbacks; + + cf2_arrstack_init( &glyphpath->hintMoves, + font->memory, + &font->error, + sizeof ( CF2_HintMoveRec ) ); + + cf2_hintmap_init( &glyphpath->initialHintMap, + font, + &glyphpath->initialHintMap, + &glyphpath->hintMoves, + scaleY ); + cf2_hintmap_init( &glyphpath->firstHintMap, + font, + &glyphpath->initialHintMap, + &glyphpath->hintMoves, + scaleY ); + cf2_hintmap_init( &glyphpath->hintMap, + font, + &glyphpath->initialHintMap, + &glyphpath->hintMoves, + scaleY ); + + glyphpath->scaleX = font->innerTransform.a; + glyphpath->scaleC = font->innerTransform.c; + glyphpath->scaleY = font->innerTransform.d; + + glyphpath->fractionalTranslation = *fractionalTranslation; + +#if 0 + glyphpath->hShift = hShift; /* for fauxing */ +#endif + + glyphpath->hStemHintArray = hStemHintArray; + glyphpath->vStemHintArray = vStemHintArray; + glyphpath->hintMask = hintMask; /* ptr to current mask */ + glyphpath->hintOriginY = hintOriginY; + glyphpath->blues = blues; + glyphpath->darken = font->darkened; /* TODO: should we make copies? */ + glyphpath->xOffset = font->darkenX; + glyphpath->yOffset = font->darkenY; + glyphpath->miterLimit = 2 * FT_MAX( + cf2_fixedAbs( glyphpath->xOffset ), + cf2_fixedAbs( glyphpath->yOffset ) ); + + /* .1 character space unit */ + glyphpath->snapThreshold = cf2_doubleToFixed( 0.1 ); + + glyphpath->moveIsPending = TRUE; + glyphpath->pathIsOpen = FALSE; + glyphpath->pathIsClosing = FALSE; + glyphpath->elemIsQueued = FALSE; + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ) + { + cf2_arrstack_finalize( &glyphpath->hintMoves ); + } + + + /* + * Hint point in y-direction and apply outerTransform. + * Input `current' hint map (which is actually delayed by one element). + * Input x,y point in Character Space. + * Output x,y point in Device Space, including translation. + */ + static void + cf2_glyphpath_hintPoint( CF2_GlyphPath glyphpath, + CF2_HintMap hintmap, + FT_Vector* ppt, + CF2_Fixed x, + CF2_Fixed y ) + { + FT_Vector pt; /* hinted point in upright DS */ + + + pt.x = ADD_INT32( FT_MulFix( glyphpath->scaleX, x ), + FT_MulFix( glyphpath->scaleC, y ) ); + pt.y = cf2_hintmap_map( hintmap, y ); + + ppt->x = ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.a, pt.x ), + ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.c, pt.y ), + glyphpath->fractionalTranslation.x ) ); + ppt->y = ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.b, pt.x ), + ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.d, pt.y ), + glyphpath->fractionalTranslation.y ) ); + } + + + /* + * From two line segments, (u1,u2) and (v1,v2), compute a point of + * intersection on the corresponding lines. + * Return false if no intersection is found, or if the intersection is + * too far away from the ends of the line segments, u2 and v1. + * + */ + static FT_Bool + cf2_glyphpath_computeIntersection( CF2_GlyphPath glyphpath, + const FT_Vector* u1, + const FT_Vector* u2, + const FT_Vector* v1, + const FT_Vector* v2, + FT_Vector* intersection ) + { + /* + * Let `u' be a zero-based vector from the first segment, `v' from the + * second segment. + * Let `w 'be the zero-based vector from `u1' to `v1'. + * `perp' is the `perpendicular dot product'; see + * https://mathworld.wolfram.com/PerpDotProduct.html. + * `s' is the parameter for the parametric line for the first segment + * (`u'). + * + * See notation in + * http://geomalgorithms.com/a05-_intersect-1.html. + * Calculations are done in 16.16, but must handle the squaring of + * line lengths in character space. We scale all vectors by 1/32 to + * avoid overflow. This allows values up to 4095 to be squared. The + * scale factor cancels in the divide. + * + * TODO: the scale factor could be computed from UnitsPerEm. + * + */ + +#define cf2_perp( a, b ) \ + ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) ) + + /* round and divide by 32 */ +#define CF2_CS_SCALE( x ) \ + ( ( (x) + 0x10 ) >> 5 ) + + FT_Vector u, v, w; /* scaled vectors */ + CF2_Fixed denominator, s; + + + u.x = CF2_CS_SCALE( SUB_INT32( u2->x, u1->x ) ); + u.y = CF2_CS_SCALE( SUB_INT32( u2->y, u1->y ) ); + v.x = CF2_CS_SCALE( SUB_INT32( v2->x, v1->x ) ); + v.y = CF2_CS_SCALE( SUB_INT32( v2->y, v1->y ) ); + w.x = CF2_CS_SCALE( SUB_INT32( v1->x, u1->x ) ); + w.y = CF2_CS_SCALE( SUB_INT32( v1->y, u1->y ) ); + + denominator = cf2_perp( u, v ); + + if ( denominator == 0 ) + return FALSE; /* parallel or coincident lines */ + + s = FT_DivFix( cf2_perp( w, v ), denominator ); + + intersection->x = ADD_INT32( u1->x, + FT_MulFix( s, SUB_INT32( u2->x, u1->x ) ) ); + intersection->y = ADD_INT32( u1->y, + FT_MulFix( s, SUB_INT32( u2->y, u1->y ) ) ); + + + /* + * Special case snapping for horizontal and vertical lines. + * This cleans up intersections and reduces problems with winding + * order detection. + * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685. + * Note: these calculations are in character space. + * + */ + + if ( u1->x == u2->x && + cf2_fixedAbs( SUB_INT32( intersection->x, + u1->x ) ) < glyphpath->snapThreshold ) + intersection->x = u1->x; + if ( u1->y == u2->y && + cf2_fixedAbs( SUB_INT32( intersection->y, + u1->y ) ) < glyphpath->snapThreshold ) + intersection->y = u1->y; + + if ( v1->x == v2->x && + cf2_fixedAbs( SUB_INT32( intersection->x, + v1->x ) ) < glyphpath->snapThreshold ) + intersection->x = v1->x; + if ( v1->y == v2->y && + cf2_fixedAbs( SUB_INT32( intersection->y, + v1->y ) ) < glyphpath->snapThreshold ) + intersection->y = v1->y; + + /* limit the intersection distance from midpoint of u2 and v1 */ + if ( cf2_fixedAbs( intersection->x - ADD_INT32( u2->x, v1->x ) / 2 ) > + glyphpath->miterLimit || + cf2_fixedAbs( intersection->y - ADD_INT32( u2->y, v1->y ) / 2 ) > + glyphpath->miterLimit ) + return FALSE; + + return TRUE; + } + + + /* + * Push the cached element (glyphpath->prevElem*) to the outline + * consumer. When a darkening offset is used, the end point of the + * cached element may be adjusted to an intersection point or we may + * synthesize a connecting line to the current element. If we are + * closing a subpath, we may also generate a connecting line to the start + * point. + * + * This is where Character Space (CS) is converted to Device Space (DS) + * using a hint map. This calculation must use a HintMap that was valid + * at the time the element was saved. For the first point in a subpath, + * that is a saved HintMap. For most elements, it just means the caller + * has delayed building a HintMap from the current HintMask. + * + * Transform each point with outerTransform and call the outline + * callbacks. This is a general 3x3 transform: + * + * x' = a*x + c*y + tx, y' = b*x + d*y + ty + * + * but it uses 4 elements from CF2_Font and the translation part + * from CF2_GlyphPath. + * + */ + static void + cf2_glyphpath_pushPrevElem( CF2_GlyphPath glyphpath, + CF2_HintMap hintmap, + FT_Vector* nextP0, + FT_Vector nextP1, + FT_Bool close ) + { + CF2_CallbackParamsRec params; + + FT_Vector* prevP0; + FT_Vector* prevP1; + + FT_Vector intersection = { 0, 0 }; + FT_Bool useIntersection = FALSE; + + + FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo || + glyphpath->prevElemOp == CF2_PathOpCubeTo ); + + if ( glyphpath->prevElemOp == CF2_PathOpLineTo ) + { + prevP0 = &glyphpath->prevElemP0; + prevP1 = &glyphpath->prevElemP1; + } + else + { + prevP0 = &glyphpath->prevElemP2; + prevP1 = &glyphpath->prevElemP3; + } + + /* optimization: if previous and next elements are offset by the same */ + /* amount, then there will be no gap, and no need to compute an */ + /* intersection. */ + if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y ) + { + /* previous element does not join next element: */ + /* adjust end point of previous element to the intersection */ + useIntersection = cf2_glyphpath_computeIntersection( glyphpath, + prevP0, + prevP1, + nextP0, + &nextP1, + &intersection ); + if ( useIntersection ) + { + /* modify the last point of the cached element (either line or */ + /* curve) */ + *prevP1 = intersection; + } + } + + params.pt0 = glyphpath->currentDS; + + switch( glyphpath->prevElemOp ) + { + case CF2_PathOpLineTo: + params.op = CF2_PathOpLineTo; + + /* note: pt2 and pt3 are unused */ + + if ( close ) + { + /* use first hint map if closing */ + cf2_glyphpath_hintPoint( glyphpath, + &glyphpath->firstHintMap, + &params.pt1, + glyphpath->prevElemP1.x, + glyphpath->prevElemP1.y ); + } + else + { + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + &params.pt1, + glyphpath->prevElemP1.x, + glyphpath->prevElemP1.y ); + } + + /* output only non-zero length lines */ + if ( params.pt0.x != params.pt1.x || params.pt0.y != params.pt1.y ) + { + glyphpath->callbacks->lineTo( glyphpath->callbacks, &params ); + + glyphpath->currentDS = params.pt1; + } + break; + + case CF2_PathOpCubeTo: + params.op = CF2_PathOpCubeTo; + + /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */ + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + &params.pt1, + glyphpath->prevElemP1.x, + glyphpath->prevElemP1.y ); + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + &params.pt2, + glyphpath->prevElemP2.x, + glyphpath->prevElemP2.y ); + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + &params.pt3, + glyphpath->prevElemP3.x, + glyphpath->prevElemP3.y ); + + glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params ); + + glyphpath->currentDS = params.pt3; + + break; + } + + if ( !useIntersection || close ) + { + /* insert connecting line between end of previous element and start */ + /* of current one */ + /* note: at the end of a subpath, we might do both, so use `nextP0' */ + /* before we change it, below */ + + if ( close ) + { + /* if we are closing the subpath, then nextP0 is in the first */ + /* hint zone */ + cf2_glyphpath_hintPoint( glyphpath, + &glyphpath->firstHintMap, + &params.pt1, + nextP0->x, + nextP0->y ); + } + else + { + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + &params.pt1, + nextP0->x, + nextP0->y ); + } + + if ( params.pt1.x != glyphpath->currentDS.x || + params.pt1.y != glyphpath->currentDS.y ) + { + /* length is nonzero */ + params.op = CF2_PathOpLineTo; + params.pt0 = glyphpath->currentDS; + + /* note: pt2 and pt3 are unused */ + glyphpath->callbacks->lineTo( glyphpath->callbacks, &params ); + + glyphpath->currentDS = params.pt1; + } + } + + if ( useIntersection ) + { + /* return intersection point to caller */ + *nextP0 = intersection; + } + } + + + /* push a MoveTo element based on current point and offset of current */ + /* element */ + static void + cf2_glyphpath_pushMove( CF2_GlyphPath glyphpath, + FT_Vector start ) + { + CF2_CallbackParamsRec params; + + + params.op = CF2_PathOpMoveTo; + params.pt0 = glyphpath->currentDS; + + /* Test if move has really happened yet; it would have called */ + /* `cf2_hintmap_build' to set `isValid'. */ + if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ) + { + /* we are here iff first subpath is missing a moveto operator: */ + /* synthesize first moveTo to finish initialization of hintMap */ + cf2_glyphpath_moveTo( glyphpath, + glyphpath->start.x, + glyphpath->start.y ); + } + + cf2_glyphpath_hintPoint( glyphpath, + &glyphpath->hintMap, + &params.pt1, + start.x, + start.y ); + + /* note: pt2 and pt3 are unused */ + glyphpath->callbacks->moveTo( glyphpath->callbacks, &params ); + + glyphpath->currentDS = params.pt1; + glyphpath->offsetStart0 = start; + } + + + /* + * All coordinates are in character space. + * On input, (x1, y1) and (x2, y2) give line segment. + * On output, (x, y) give offset vector. + * We use a piecewise approximation to trig functions. + * + * TODO: Offset true perpendicular and proper length + * supply the y-translation for hinting here, too, + * that adds yOffset unconditionally to *y. + */ + static void + cf2_glyphpath_computeOffset( CF2_GlyphPath glyphpath, + CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2, + CF2_Fixed* x, + CF2_Fixed* y ) + { + CF2_Fixed dx = SUB_INT32( x2, x1 ); + CF2_Fixed dy = SUB_INT32( y2, y1 ); + + + /* note: negative offsets don't work here; negate deltas to change */ + /* quadrants, below */ + if ( glyphpath->font->reverseWinding ) + { + dx = NEG_INT32( dx ); + dy = NEG_INT32( dy ); + } + + *x = *y = 0; + + if ( !glyphpath->darken ) + return; + + /* add momentum for this path element */ + glyphpath->callbacks->windingMomentum = + ADD_INT32( glyphpath->callbacks->windingMomentum, + cf2_getWindingMomentum( x1, y1, x2, y2 ) ); + + /* note: allow mixed integer and fixed multiplication here */ + if ( dx >= 0 ) + { + if ( dy >= 0 ) + { + /* first quadrant, +x +y */ + + if ( dx > MUL_INT32( 2, dy ) ) + { + /* +x */ + *x = 0; + *y = 0; + } + else if ( dy > MUL_INT32( 2, dx ) ) + { + /* +y */ + *x = glyphpath->xOffset; + *y = glyphpath->yOffset; + } + else + { + /* +x +y */ + *x = FT_MulFix( cf2_doubleToFixed( 0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ), + glyphpath->yOffset ); + } + } + else + { + /* fourth quadrant, +x -y */ + + if ( dx > MUL_INT32( -2, dy ) ) + { + /* +x */ + *x = 0; + *y = 0; + } + else if ( NEG_INT32( dy ) > MUL_INT32( 2, dx ) ) + { + /* -y */ + *x = NEG_INT32( glyphpath->xOffset ); + *y = glyphpath->yOffset; + } + else + { + /* +x -y */ + *x = FT_MulFix( cf2_doubleToFixed( -0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ), + glyphpath->yOffset ); + } + } + } + else + { + if ( dy >= 0 ) + { + /* second quadrant, -x +y */ + + if ( NEG_INT32( dx ) > MUL_INT32( 2, dy ) ) + { + /* -x */ + *x = 0; + *y = MUL_INT32( 2, glyphpath->yOffset ); + } + else if ( dy > MUL_INT32( -2, dx ) ) + { + /* +y */ + *x = glyphpath->xOffset; + *y = glyphpath->yOffset; + } + else + { + /* -x +y */ + *x = FT_MulFix( cf2_doubleToFixed( 0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ), + glyphpath->yOffset ); + } + } + else + { + /* third quadrant, -x -y */ + + if ( NEG_INT32( dx ) > MUL_INT32( -2, dy ) ) + { + /* -x */ + *x = 0; + *y = MUL_INT32( 2, glyphpath->yOffset ); + } + else if ( NEG_INT32( dy ) > MUL_INT32( -2, dx ) ) + { + /* -y */ + *x = NEG_INT32( glyphpath->xOffset ); + *y = glyphpath->yOffset; + } + else + { + /* -x -y */ + *x = FT_MulFix( cf2_doubleToFixed( -0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ), + glyphpath->yOffset ); + } + } + } + } + + + /* + * The functions cf2_glyphpath_{moveTo,lineTo,curveTo,closeOpenPath} are + * called by the interpreter with Character Space (CS) coordinates. Each + * path element is placed into a queue of length one to await the + * calculation of the following element. At that time, the darkening + * offset of the following element is known and joins can be computed, + * including possible modification of this element, before mapping to + * Device Space (DS) and passing it on to the outline consumer. + * + */ + FT_LOCAL_DEF( void ) + cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ) + { + cf2_glyphpath_closeOpenPath( glyphpath ); + + /* save the parameters of the move for later, when we'll know how to */ + /* offset it; */ + /* also save last move point */ + glyphpath->currentCS.x = glyphpath->start.x = x; + glyphpath->currentCS.y = glyphpath->start.y = y; + + glyphpath->moveIsPending = TRUE; + + /* ensure we have a valid map with current mask */ + if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) || + cf2_hintmask_isNew( glyphpath->hintMask ) ) + cf2_hintmap_build( &glyphpath->hintMap, + glyphpath->hStemHintArray, + glyphpath->vStemHintArray, + glyphpath->hintMask, + glyphpath->hintOriginY, + FALSE ); + + /* save a copy of current HintMap to use when drawing initial point */ + glyphpath->firstHintMap = glyphpath->hintMap; /* structure copy */ + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ) + { + CF2_Fixed xOffset, yOffset; + FT_Vector P0, P1; + FT_Bool newHintMap; + + /* + * New hints will be applied after cf2_glyphpath_pushPrevElem has run. + * In case this is a synthesized closing line, any new hints should be + * delayed until this path is closed (`cf2_hintmask_isNew' will be + * called again before the next line or curve). + */ + + /* true if new hint map not on close */ + newHintMap = cf2_hintmask_isNew( glyphpath->hintMask ) && + !glyphpath->pathIsClosing; + + /* + * Zero-length lines may occur in the charstring. Because we cannot + * compute darkening offsets or intersections from zero-length lines, + * it is best to remove them and avoid artifacts. However, zero-length + * lines in CS at the start of a new hint map can generate non-zero + * lines in DS due to hint substitution. We detect a change in hint + * map here and pass those zero-length lines along. + */ + + /* + * Note: Find explicitly closed paths here with a conditional + * breakpoint using + * + * !gp->pathIsClosing && gp->start.x == x && gp->start.y == y + * + */ + + if ( glyphpath->currentCS.x == x && + glyphpath->currentCS.y == y && + !newHintMap ) + /* + * Ignore zero-length lines in CS where the hint map is the same + * because the line in DS will also be zero length. + * + * Ignore zero-length lines when we synthesize a closing line because + * the close will be handled in cf2_glyphPath_pushPrevElem. + */ + return; + + cf2_glyphpath_computeOffset( glyphpath, + glyphpath->currentCS.x, + glyphpath->currentCS.y, + x, + y, + &xOffset, + &yOffset ); + + /* construct offset points */ + P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset ); + P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset ); + P1.x = ADD_INT32( x, xOffset ); + P1.y = ADD_INT32( y, yOffset ); + + if ( glyphpath->moveIsPending ) + { + /* emit offset 1st point as MoveTo */ + cf2_glyphpath_pushMove( glyphpath, P0 ); + + glyphpath->moveIsPending = FALSE; /* adjust state machine */ + glyphpath->pathIsOpen = TRUE; + + glyphpath->offsetStart1 = P1; /* record second point */ + } + + if ( glyphpath->elemIsQueued ) + { + FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || + glyphpath->hintMap.count == 0 ); + + cf2_glyphpath_pushPrevElem( glyphpath, + &glyphpath->hintMap, + &P0, + P1, + FALSE ); + } + + /* queue the current element with offset points */ + glyphpath->elemIsQueued = TRUE; + glyphpath->prevElemOp = CF2_PathOpLineTo; + glyphpath->prevElemP0 = P0; + glyphpath->prevElemP1 = P1; + + /* update current map */ + if ( newHintMap ) + cf2_hintmap_build( &glyphpath->hintMap, + glyphpath->hStemHintArray, + glyphpath->vStemHintArray, + glyphpath->hintMask, + glyphpath->hintOriginY, + FALSE ); + + glyphpath->currentCS.x = x; /* pre-offset current point */ + glyphpath->currentCS.y = y; + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2, + CF2_Fixed x3, + CF2_Fixed y3 ) + { + CF2_Fixed xOffset1, yOffset1, xOffset3, yOffset3; + FT_Vector P0, P1, P2, P3; + + + /* TODO: ignore zero length portions of curve?? */ + cf2_glyphpath_computeOffset( glyphpath, + glyphpath->currentCS.x, + glyphpath->currentCS.y, + x1, + y1, + &xOffset1, + &yOffset1 ); + cf2_glyphpath_computeOffset( glyphpath, + x2, + y2, + x3, + y3, + &xOffset3, + &yOffset3 ); + + /* add momentum from the middle segment */ + glyphpath->callbacks->windingMomentum = + ADD_INT32( glyphpath->callbacks->windingMomentum, + cf2_getWindingMomentum( x1, y1, x2, y2 ) ); + + /* construct offset points */ + P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset1 ); + P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset1 ); + P1.x = ADD_INT32( x1, xOffset1 ); + P1.y = ADD_INT32( y1, yOffset1 ); + /* note: preserve angle of final segment by using offset3 at both ends */ + P2.x = ADD_INT32( x2, xOffset3 ); + P2.y = ADD_INT32( y2, yOffset3 ); + P3.x = ADD_INT32( x3, xOffset3 ); + P3.y = ADD_INT32( y3, yOffset3 ); + + if ( glyphpath->moveIsPending ) + { + /* emit offset 1st point as MoveTo */ + cf2_glyphpath_pushMove( glyphpath, P0 ); + + glyphpath->moveIsPending = FALSE; + glyphpath->pathIsOpen = TRUE; + + glyphpath->offsetStart1 = P1; /* record second point */ + } + + if ( glyphpath->elemIsQueued ) + { + FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || + glyphpath->hintMap.count == 0 ); + + cf2_glyphpath_pushPrevElem( glyphpath, + &glyphpath->hintMap, + &P0, + P1, + FALSE ); + } + + /* queue the current element with offset points */ + glyphpath->elemIsQueued = TRUE; + glyphpath->prevElemOp = CF2_PathOpCubeTo; + glyphpath->prevElemP0 = P0; + glyphpath->prevElemP1 = P1; + glyphpath->prevElemP2 = P2; + glyphpath->prevElemP3 = P3; + + /* update current map */ + if ( cf2_hintmask_isNew( glyphpath->hintMask ) ) + cf2_hintmap_build( &glyphpath->hintMap, + glyphpath->hStemHintArray, + glyphpath->vStemHintArray, + glyphpath->hintMask, + glyphpath->hintOriginY, + FALSE ); + + glyphpath->currentCS.x = x3; /* pre-offset current point */ + glyphpath->currentCS.y = y3; + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ) + { + if ( glyphpath->pathIsOpen ) + { + /* + * A closing line in Character Space line is always generated below + * with `cf2_glyphPath_lineTo'. It may be ignored later if it turns + * out to be zero length in Device Space. + */ + glyphpath->pathIsClosing = TRUE; + + cf2_glyphpath_lineTo( glyphpath, + glyphpath->start.x, + glyphpath->start.y ); + + /* empty the final element from the queue and close the path */ + if ( glyphpath->elemIsQueued ) + cf2_glyphpath_pushPrevElem( glyphpath, + &glyphpath->hintMap, + &glyphpath->offsetStart0, + glyphpath->offsetStart1, + TRUE ); + + /* reset state machine */ + glyphpath->moveIsPending = TRUE; + glyphpath->pathIsOpen = FALSE; + glyphpath->pathIsClosing = FALSE; + glyphpath->elemIsQueued = FALSE; + } + } + + +/* END */ diff --git a/external/freetype/src/psaux/pshints.h b/external/freetype/src/psaux/pshints.h new file mode 100644 index 000000000..31a823036 --- /dev/null +++ b/external/freetype/src/psaux/pshints.h @@ -0,0 +1,288 @@ +/**************************************************************************** + * + * pshints.h + * + * Adobe's code for handling CFF hints (body). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSHINT_H_ +#define PSHINT_H_ + +FT_BEGIN_HEADER + + + enum + { + CF2_MAX_HINTS = 96 /* maximum # of hints */ + }; + + + /* + * A HintMask object stores a bit mask that specifies which hints in the + * charstring are active at a given time. Hints in CFF must be declared + * at the start, before any drawing operators, with horizontal hints + * preceding vertical hints. The HintMask is ordered the same way, with + * horizontal hints immediately followed by vertical hints. Clients are + * responsible for knowing how many of each type are present. + * + * The maximum total number of hints is 96, as specified by the CFF + * specification. + * + * A HintMask is built 0 or more times while interpreting a charstring, by + * the HintMask operator. There is only one HintMask, but it is built or + * rebuilt each time there is a hint substitution (HintMask operator) in + * the charstring. A default HintMask with all bits set is built if there + * has been no HintMask operator prior to the first drawing operator. + * + */ + + typedef struct CF2_HintMaskRec_ + { + FT_Error* error; + + FT_Bool isValid; + FT_Bool isNew; + + size_t bitCount; + size_t byteCount; + + FT_Byte mask[( CF2_MAX_HINTS + 7 ) / 8]; + + } CF2_HintMaskRec, *CF2_HintMask; + + + typedef struct CF2_StemHintRec_ + { + FT_Bool used; /* DS positions are valid */ + + CF2_Fixed min; /* original character space value */ + CF2_Fixed max; + + CF2_Fixed minDS; /* DS position after first use */ + CF2_Fixed maxDS; + + } CF2_StemHintRec, *CF2_StemHint; + + + /* + * A HintMap object stores a piecewise linear function for mapping + * y-coordinates from character space to device space, providing + * appropriate pixel alignment to stem edges. + * + * The map is implemented as an array of `CF2_Hint' elements, each + * representing an edge. When edges are paired, as from stem hints, the + * bottom edge must immediately precede the top edge in the array. + * Element character space AND device space positions must both increase + * monotonically in the array. `CF2_Hint' elements are also used as + * parameters to `cf2_blues_capture'. + * + * The `cf2_hintmap_build' method must be called before any drawing + * operation (beginning with a Move operator) and at each hint + * substitution (HintMask operator). + * + * The `cf2_hintmap_map' method is called to transform y-coordinates at + * each drawing operation (move, line, curve). + * + */ + + /* TODO: make this a CF2_ArrStack and add a deep copy method */ + enum + { + CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2 + }; + + + typedef struct CF2_HintMapRec_ + { + CF2_Font font; + + /* initial map based on blue zones */ + struct CF2_HintMapRec_* initialHintMap; + + /* working storage for 2nd pass adjustHints */ + CF2_ArrStack hintMoves; + + FT_Bool isValid; + FT_Bool hinted; + + CF2_Fixed scale; + CF2_UInt count; + + /* start search from this index */ + CF2_UInt lastIndex; + + CF2_HintRec edge[CF2_MAX_HINT_EDGES]; /* 192 */ + + } CF2_HintMapRec, *CF2_HintMap; + + + FT_LOCAL( FT_Bool ) + cf2_hint_isValid( const CF2_Hint hint ); + FT_LOCAL( FT_Bool ) + cf2_hint_isTop( const CF2_Hint hint ); + FT_LOCAL( FT_Bool ) + cf2_hint_isBottom( const CF2_Hint hint ); + FT_LOCAL( void ) + cf2_hint_lock( CF2_Hint hint ); + + + FT_LOCAL( void ) + cf2_hintmap_init( CF2_HintMap hintmap, + CF2_Font font, + CF2_HintMap initialMap, + CF2_ArrStack hintMoves, + CF2_Fixed scale ); + FT_LOCAL( void ) + cf2_hintmap_build( CF2_HintMap hintmap, + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOrigin, + FT_Bool initialMap ); + + + /* + * GlyphPath is a wrapper for drawing operations that scales the + * coordinates according to the render matrix and HintMap. It also tracks + * open paths to control ClosePath and to insert MoveTo for broken fonts. + * + */ + typedef struct CF2_GlyphPathRec_ + { + /* TODO: gather some of these into a hinting context */ + + CF2_Font font; /* font instance */ + CF2_OutlineCallbacks callbacks; /* outline consumer */ + + + CF2_HintMapRec hintMap; /* current hint map */ + CF2_HintMapRec firstHintMap; /* saved copy */ + CF2_HintMapRec initialHintMap; /* based on all captured hints */ + + CF2_ArrStackRec hintMoves; /* list of hint moves for 2nd pass */ + + CF2_Fixed scaleX; /* matrix a */ + CF2_Fixed scaleC; /* matrix c */ + CF2_Fixed scaleY; /* matrix d */ + + FT_Vector fractionalTranslation; /* including deviceXScale */ +#if 0 + CF2_Fixed hShift; /* character space horizontal shift */ + /* (for fauxing) */ +#endif + + FT_Bool pathIsOpen; /* true after MoveTo */ + FT_Bool pathIsClosing; /* true when synthesizing closepath line */ + FT_Bool darken; /* true if stem darkening */ + FT_Bool moveIsPending; /* true between MoveTo and offset MoveTo */ + + /* references used to call `cf2_hintmap_build', if necessary */ + CF2_ArrStack hStemHintArray; + CF2_ArrStack vStemHintArray; + CF2_HintMask hintMask; /* ptr to the current mask */ + CF2_Fixed hintOriginY; /* copy of current origin */ + const CF2_BluesRec* blues; + + CF2_Fixed xOffset; /* character space offsets */ + CF2_Fixed yOffset; + + /* character space miter limit threshold */ + CF2_Fixed miterLimit; + /* vertical/horizontal snap distance in character space */ + CF2_Fixed snapThreshold; + + FT_Vector offsetStart0; /* first and second points of first */ + FT_Vector offsetStart1; /* element with offset applied */ + + /* current point, character space, before offset */ + FT_Vector currentCS; + /* current point, device space */ + FT_Vector currentDS; + /* start point of subpath, character space */ + FT_Vector start; + + /* the following members constitute the `queue' of one element */ + FT_Bool elemIsQueued; + CF2_Int prevElemOp; + + FT_Vector prevElemP0; + FT_Vector prevElemP1; + FT_Vector prevElemP2; + FT_Vector prevElemP3; + + } CF2_GlyphPathRec, *CF2_GlyphPath; + + + FT_LOCAL( void ) + cf2_glyphpath_init( CF2_GlyphPath glyphpath, + CF2_Font font, + CF2_OutlineCallbacks callbacks, + CF2_Fixed scaleY, + /* CF2_Fixed hShift, */ + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOrigin, + const CF2_Blues blues, + const FT_Vector* fractionalTranslation ); + FT_LOCAL( void ) + cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ); + + FT_LOCAL( void ) + cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ); + FT_LOCAL( void ) + cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ); + FT_LOCAL( void ) + cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2, + CF2_Fixed x3, + CF2_Fixed y3 ); + FT_LOCAL( void ) + cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ); + + +FT_END_HEADER + + +#endif /* PSHINT_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psintrp.c b/external/freetype/src/psaux/psintrp.c new file mode 100644 index 000000000..6c640eebd --- /dev/null +++ b/external/freetype/src/psaux/psintrp.c @@ -0,0 +1,3059 @@ +/**************************************************************************** + * + * psintrp.c + * + * Adobe's CFF Interpreter (body). + * + * Copyright 2007-2014 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/services/svcfftl.h> + +#include "psglue.h" +#include "psfont.h" +#include "psstack.h" +#include "pshints.h" +#include "psintrp.h" + +#include "pserror.h" + +#include "psobjs.h" /* for cff_random */ +#include "t1decode.h" /* for t1 seac */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT cf2interp + + + FT_LOCAL_DEF( void ) + cf2_hintmask_init( CF2_HintMask hintmask, + FT_Error* error ) + { + FT_ZERO( hintmask ); + + hintmask->error = error; + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hintmask_isValid( const CF2_HintMask hintmask ) + { + return hintmask->isValid; + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hintmask_isNew( const CF2_HintMask hintmask ) + { + return hintmask->isNew; + } + + + FT_LOCAL_DEF( void ) + cf2_hintmask_setNew( CF2_HintMask hintmask, + FT_Bool val ) + { + hintmask->isNew = val; + } + + + /* clients call `getMaskPtr' in order to iterate */ + /* through hint mask */ + + FT_LOCAL_DEF( FT_Byte* ) + cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ) + { + return hintmask->mask; + } + + + static size_t + cf2_hintmask_setCounts( CF2_HintMask hintmask, + size_t bitCount ) + { + if ( bitCount > CF2_MAX_HINTS ) + { + /* total of h and v stems must be <= 96 */ + CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format ); + return 0; + } + + hintmask->bitCount = bitCount; + hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8; + + hintmask->isValid = TRUE; + hintmask->isNew = TRUE; + + return bitCount; + } + + + /* consume the hintmask bytes from the charstring, advancing the src */ + /* pointer */ + static void + cf2_hintmask_read( CF2_HintMask hintmask, + CF2_Buffer charstring, + size_t bitCount ) + { + size_t i; + +#ifndef CF2_NDEBUG + /* these are the bits in the final mask byte that should be zero */ + /* Note: this variable is only used in an assert expression below */ + /* and then only if CF2_NDEBUG is not defined */ + CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; +#endif + + + /* initialize counts and isValid */ + if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) + return; + + FT_ASSERT( hintmask->byteCount > 0 ); + + FT_TRACE4(( " (maskbytes:" )); + + /* set mask and advance interpreter's charstring pointer */ + for ( i = 0; i < hintmask->byteCount; i++ ) + { + hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring ); + FT_TRACE4(( " 0x%02X", hintmask->mask[i] )); + } + + FT_TRACE4(( ")\n" )); + + /* assert any unused bits in last byte are zero unless there's a prior */ + /* error */ + /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ +#ifndef CF2_NDEBUG + FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 || + *hintmask->error ); +#endif + } + + + FT_LOCAL_DEF( void ) + cf2_hintmask_setAll( CF2_HintMask hintmask, + size_t bitCount ) + { + size_t i; + CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; + + + /* initialize counts and isValid */ + if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) + return; + + FT_ASSERT( hintmask->byteCount > 0 ); + FT_ASSERT( hintmask->byteCount <= + sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) ); + + /* set mask to all ones */ + for ( i = 0; i < hintmask->byteCount; i++ ) + hintmask->mask[i] = 0xFF; + + /* clear unused bits */ + /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ + hintmask->mask[hintmask->byteCount - 1] &= ~mask; + } + + + /* Type2 charstring opcodes */ + enum + { + cf2_cmdRESERVED_0, /* 0 */ + cf2_cmdHSTEM, /* 1 */ + cf2_cmdRESERVED_2, /* 2 */ + cf2_cmdVSTEM, /* 3 */ + cf2_cmdVMOVETO, /* 4 */ + cf2_cmdRLINETO, /* 5 */ + cf2_cmdHLINETO, /* 6 */ + cf2_cmdVLINETO, /* 7 */ + cf2_cmdRRCURVETO, /* 8 */ + cf2_cmdCLOSEPATH, /* 9 T1 only */ + cf2_cmdCALLSUBR, /* 10 */ + cf2_cmdRETURN, /* 11 */ + cf2_cmdESC, /* 12 */ + cf2_cmdHSBW, /* 13 T1 only */ + cf2_cmdENDCHAR, /* 14 */ + cf2_cmdVSINDEX, /* 15 */ + cf2_cmdBLEND, /* 16 */ + cf2_cmdRESERVED_17, /* 17 */ + cf2_cmdHSTEMHM, /* 18 */ + cf2_cmdHINTMASK, /* 19 */ + cf2_cmdCNTRMASK, /* 20 */ + cf2_cmdRMOVETO, /* 21 */ + cf2_cmdHMOVETO, /* 22 */ + cf2_cmdVSTEMHM, /* 23 */ + cf2_cmdRCURVELINE, /* 24 */ + cf2_cmdRLINECURVE, /* 25 */ + cf2_cmdVVCURVETO, /* 26 */ + cf2_cmdHHCURVETO, /* 27 */ + cf2_cmdEXTENDEDNMBR, /* 28 */ + cf2_cmdCALLGSUBR, /* 29 */ + cf2_cmdVHCURVETO, /* 30 */ + cf2_cmdHVCURVETO /* 31 */ + }; + + enum + { + cf2_escDOTSECTION, /* 0 */ + cf2_escVSTEM3, /* 1 T1 only */ + cf2_escHSTEM3, /* 2 T1 only */ + cf2_escAND, /* 3 */ + cf2_escOR, /* 4 */ + cf2_escNOT, /* 5 */ + cf2_escSEAC, /* 6 T1 only */ + cf2_escSBW, /* 7 T1 only */ + cf2_escRESERVED_8, /* 8 */ + cf2_escABS, /* 9 */ + cf2_escADD, /* 10 like otherADD */ + cf2_escSUB, /* 11 like otherSUB */ + cf2_escDIV, /* 12 */ + cf2_escRESERVED_13, /* 13 */ + cf2_escNEG, /* 14 */ + cf2_escEQ, /* 15 */ + cf2_escCALLOTHERSUBR,/* 16 T1 only */ + cf2_escPOP, /* 17 T1 only */ + cf2_escDROP, /* 18 */ + cf2_escRESERVED_19, /* 19 */ + cf2_escPUT, /* 20 like otherPUT */ + cf2_escGET, /* 21 like otherGET */ + cf2_escIFELSE, /* 22 like otherIFELSE */ + cf2_escRANDOM, /* 23 like otherRANDOM */ + cf2_escMUL, /* 24 like otherMUL */ + cf2_escRESERVED_25, /* 25 */ + cf2_escSQRT, /* 26 */ + cf2_escDUP, /* 27 like otherDUP */ + cf2_escEXCH, /* 28 like otherEXCH */ + cf2_escINDEX, /* 29 */ + cf2_escROLL, /* 30 */ + cf2_escRESERVED_31, /* 31 */ + cf2_escRESERVED_32, /* 32 */ + cf2_escSETCURRENTPT, /* 33 T1 only */ + cf2_escHFLEX, /* 34 */ + cf2_escFLEX, /* 35 */ + cf2_escHFLEX1, /* 36 */ + cf2_escFLEX1, /* 37 */ + cf2_escRESERVED_38 /* 38 & all higher */ + }; + + + /* `stemHintArray' does not change once we start drawing the outline. */ + static void + cf2_doStems( const CF2_Font font, + CF2_Stack opStack, + CF2_ArrStack stemHintArray, + CF2_Fixed* width, + FT_Bool* haveWidth, + CF2_Fixed hintOffset ) + { + CF2_UInt i; + CF2_UInt count = cf2_stack_count( opStack ); + FT_Bool hasWidthArg = FT_BOOL( count & 1 ); + + /* variable accumulates delta values from operand stack */ + CF2_Fixed position = hintOffset; + + if ( font->isT1 && !font->decoder->flex_state && !*haveWidth ) + FT_ERROR(( "cf2_doStems (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( !font->isT1 && hasWidthArg && !*haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + cf2_getNominalWidthX( font->decoder ) ); + + if ( font->decoder->width_only ) + goto exit; + + for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 ) + { + /* construct a CF2_StemHint and push it onto the list */ + CF2_StemHintRec stemhint; + + + stemhint.min = + position = ADD_INT32( position, + cf2_stack_getReal( opStack, i ) ); + stemhint.max = + position = ADD_INT32( position, + cf2_stack_getReal( opStack, i + 1 ) ); + + stemhint.used = FALSE; + stemhint.maxDS = + stemhint.minDS = 0; + + cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */ + } + + cf2_stack_clear( opStack ); + + exit: + /* cf2_doStems must define a width (may be default) */ + *haveWidth = TRUE; + } + + + static void + cf2_doFlex( CF2_Stack opStack, + CF2_Fixed* curX, + CF2_Fixed* curY, + CF2_GlyphPath glyphPath, + const FT_Bool* readFromStack, + FT_Bool doConditionalLastRead ) + { + CF2_Fixed vals[14]; + CF2_UInt idx; + FT_Bool isHFlex; + CF2_Int top, i, j; + + + vals[0] = *curX; + vals[1] = *curY; + idx = 0; + isHFlex = FT_BOOL( readFromStack[9] == FALSE ); + top = isHFlex ? 9 : 10; + + for ( i = 0; i < top; i++ ) + { + vals[i + 2] = vals[i]; + if ( readFromStack[i] ) + vals[i + 2] = ADD_INT32( vals[i + 2], cf2_stack_getReal( opStack, + idx++ ) ); + } + + if ( isHFlex ) + vals[9 + 2] = *curY; + + if ( doConditionalLastRead ) + { + FT_Bool lastIsX = FT_BOOL( + cf2_fixedAbs( SUB_INT32( vals[10], *curX ) ) > + cf2_fixedAbs( SUB_INT32( vals[11], *curY ) ) ); + CF2_Fixed lastVal = cf2_stack_getReal( opStack, idx ); + + + if ( lastIsX ) + { + vals[12] = ADD_INT32( vals[10], lastVal ); + vals[13] = *curY; + } + else + { + vals[12] = *curX; + vals[13] = ADD_INT32( vals[11], lastVal ); + } + } + else + { + if ( readFromStack[10] ) + vals[12] = ADD_INT32( vals[10], + cf2_stack_getReal( opStack, idx++ ) ); + else + vals[12] = *curX; + + if ( readFromStack[11] ) + vals[13] = ADD_INT32( vals[11], + cf2_stack_getReal( opStack, idx ) ); + else + vals[13] = *curY; + } + + for ( j = 0; j < 2; j++ ) + cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2], + vals[j * 6 + 3], + vals[j * 6 + 4], + vals[j * 6 + 5], + vals[j * 6 + 6], + vals[j * 6 + 7] ); + + cf2_stack_clear( opStack ); + + *curX = vals[12]; + *curY = vals[13]; + } + + + /* Blend numOperands on the stack, */ + /* store results into the first numBlends values, */ + /* then pop remaining arguments. */ + static void + cf2_doBlend( const CFF_Blend blend, + CF2_Stack opStack, + CF2_UInt numBlends ) + { + CF2_UInt delta; + CF2_UInt base; + CF2_UInt i, j; + CF2_UInt numOperands = (CF2_UInt)( numBlends * blend->lenBV ); + + + base = cf2_stack_count( opStack ) - numOperands; + delta = base + numBlends; + + for ( i = 0; i < numBlends; i++ ) + { + const CF2_Fixed* weight = &blend->BV[1]; + + /* start with first term */ + CF2_Fixed sum = cf2_stack_getReal( opStack, i + base ); + + + for ( j = 1; j < blend->lenBV; j++ ) + sum = ADD_INT32( sum, + FT_MulFix( *weight++, + cf2_stack_getReal( opStack, + delta++ ) ) ); + + /* store blended result */ + cf2_stack_setReal( opStack, i + base, sum ); + } + + /* leave only `numBlends' results on stack */ + cf2_stack_pop( opStack, numOperands - numBlends ); + } + + + /* + * `error' is a shared error code used by many objects in this + * routine. Before the code continues from an error, it must check and + * record the error in `*error'. The idea is that this shared + * error code will record the first error encountered. If testing + * for an error anyway, the cost of `goto exit' is small, so we do it, + * even if continuing would be safe. In this case, `lastError' is + * set, so the testing and storing can be done in one place, at `exit'. + * + * Continuing after an error is intended for objects which do their own + * testing of `*error', e.g., array stack functions. This allows us to + * avoid an extra test after the call. + * + * Unimplemented opcodes are ignored. + * + */ + FT_LOCAL_DEF( void ) + cf2_interpT2CharString( CF2_Font font, + const CF2_Buffer buf, + CF2_OutlineCallbacks callbacks, + const FT_Vector* translation, + FT_Bool doingSeac, + CF2_Fixed curX, + CF2_Fixed curY, + CF2_Fixed* width ) + { + /* lastError is used for errors that are immediately tested */ + FT_Error lastError = FT_Err_Ok; + + /* pointer to parsed font object */ + PS_Decoder* decoder = font->decoder; + + FT_Error* error = &font->error; + FT_Memory memory = font->memory; + + CF2_Fixed scaleY = font->innerTransform.d; + CF2_Fixed nominalWidthX = cf2_getNominalWidthX( decoder ); + + /* stuff for Type 1 */ + FT_Int known_othersubr_result_cnt = 0; + FT_Bool large_int = FALSE; + FT_Bool initial_map_ready = FALSE; + +#define PS_STORAGE_SIZE 3 + CF2_F16Dot16 results[PS_STORAGE_SIZE]; /* for othersubr results */ + FT_Int result_cnt = 0; + + /* save this for hinting seac accents */ + CF2_Fixed hintOriginY = curY; + + CF2_Stack opStack = NULL; + FT_UInt stackSize; + FT_Byte op1; /* first opcode byte */ + + CF2_F16Dot16 storage[CF2_STORAGE_SIZE]; /* for `put' and `get' */ + CF2_F16Dot16 flexStore[6]; /* for Type 1 flex */ + + /* instruction limit; 20,000,000 matches Avalon */ + FT_UInt32 instructionLimit = 20000000UL; + + CF2_ArrStackRec subrStack; + + FT_Bool haveWidth; + CF2_Buffer charstring = NULL; + + CF2_Int charstringIndex = -1; /* initialize to empty */ + + /* TODO: placeholders for hint structures */ + + /* objects used for hinting */ + CF2_ArrStackRec hStemHintArray; + CF2_ArrStackRec vStemHintArray; + + CF2_HintMaskRec hintMask; + CF2_GlyphPathRec glyphPath; + + + FT_ZERO( &storage ); + FT_ZERO( &results ); + FT_ZERO( &flexStore ); + + /* initialize the remaining objects */ + cf2_arrstack_init( &subrStack, + memory, + error, + sizeof ( CF2_BufferRec ) ); + cf2_arrstack_init( &hStemHintArray, + memory, + error, + sizeof ( CF2_StemHintRec ) ); + cf2_arrstack_init( &vStemHintArray, + memory, + error, + sizeof ( CF2_StemHintRec ) ); + + /* initialize CF2_StemHint arrays */ + cf2_hintmask_init( &hintMask, error ); + + /* initialize path map to manage drawing operations */ + + /* Note: last 4 params are used to handle `MoveToPermissive', which */ + /* may need to call `hintMap.Build' */ + /* TODO: MoveToPermissive is gone; are these still needed? */ + cf2_glyphpath_init( &glyphPath, + font, + callbacks, + scaleY, + /* hShift, */ + &hStemHintArray, + &vStemHintArray, + &hintMask, + hintOriginY, + &font->blues, + translation ); + + /* + * Initialize state for width parsing. From the CFF Spec: + * + * The first stack-clearing operator, which must be one of hstem, + * hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto, + * rmoveto, or endchar, takes an additional argument - the width (as + * described earlier), which may be expressed as zero or one numeric + * argument. + * + * What we implement here uses the first validly specified width, but + * does not detect errors for specifying more than one width. + * + * If one of the above operators occurs without explicitly specifying + * a width, we assume the default width. + * + * CFF2 charstrings always return the default width (0). + * + */ + haveWidth = font->isCFF2 ? TRUE : FALSE; + *width = cf2_getDefaultWidthX( decoder ); + + /* + * Note: At this point, all pointers to resources must be NULL + * and all local objects must be initialized. + * There must be no branches to `exit:' above this point. + * + */ + + /* allocate an operand stack */ + stackSize = font->isCFF2 ? cf2_getMaxstack( decoder ) + : CF2_OPERAND_STACK_SIZE; + opStack = cf2_stack_init( memory, error, stackSize ); + + if ( !opStack ) + { + lastError = FT_THROW( Out_Of_Memory ); + goto exit; + } + + /* initialize subroutine stack by placing top level charstring as */ + /* first element (max depth plus one for the charstring) */ + /* Note: Caller owns and must finalize the first charstring. */ + /* Our copy of it does not change that requirement. */ + cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 ); + + charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack ); + + /* catch errors so far */ + if ( *error ) + goto exit; + + *charstring = *buf; /* structure copy */ + charstringIndex = 0; /* entry is valid now */ + + /* main interpreter loop */ + while ( 1 ) + { + if ( font->isT1 ) + FT_ASSERT( known_othersubr_result_cnt == 0 || + result_cnt == 0 ); + + if ( cf2_buf_isEnd( charstring ) ) + { + /* If we've reached the end of the charstring, simulate a */ + /* cf2_cmdRETURN or cf2_cmdENDCHAR. */ + /* We do this for both CFF and CFF2. */ + if ( charstringIndex ) + op1 = cf2_cmdRETURN; /* end of buffer for subroutine */ + else + op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */ + } + else + { + op1 = (FT_Byte)cf2_buf_readByte( charstring ); + + /* Explicit RETURN and ENDCHAR in CFF2 should be ignored. */ + /* Note: Trace message will report 0 instead of 11 or 14. */ + if ( ( op1 == cf2_cmdRETURN || op1 == cf2_cmdENDCHAR ) && + font->isCFF2 ) + op1 = cf2_cmdRESERVED_0; + } + + if ( font->isT1 ) + { + if ( !initial_map_ready && + !( op1 == cf2_cmdHSTEM || + op1 == cf2_cmdVSTEM || + op1 == cf2_cmdHSBW || + op1 == cf2_cmdCALLSUBR || + op1 == cf2_cmdRETURN || + op1 == cf2_cmdESC || + op1 == cf2_cmdENDCHAR || + op1 >= 32 /* Numbers */ ) ) + { + /* Skip outline commands first time round. */ + /* `endchar' will trigger initial hintmap build */ + /* and rewind the charstring. */ + FT_TRACE4(( " <outline command skipped>\n" )); + cf2_stack_clear( opStack ); + continue; + } + + if ( result_cnt > 0 && + !( op1 == cf2_cmdCALLSUBR || + op1 == cf2_cmdRETURN || + op1 == cf2_cmdESC || + op1 >= 32 /* Numbers */ ) ) + { + /* all operands have been transferred by previous pops */ + result_cnt = 0; + } + + if ( large_int && !( op1 >= 32 || op1 == cf2_escDIV ) ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " no `div' after large integer\n" )); + + large_int = FALSE; + } + } + + /* check for errors once per loop */ + if ( *error ) + goto exit; + + instructionLimit--; + if ( instructionLimit == 0 ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + switch( op1 ) + { + case cf2_cmdRESERVED_0: + case cf2_cmdRESERVED_2: + case cf2_cmdRESERVED_17: + /* we may get here if we have a prior error */ + FT_TRACE4(( " unknown op (%d)\n", op1 )); + break; + + case cf2_cmdVSINDEX: + FT_TRACE4(( " vsindex\n" )); + + if ( !font->isCFF2 ) + break; /* clear stack & ignore */ + + if ( font->blend.usedBV ) + { + /* vsindex not allowed after blend */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + { + FT_Int temp = cf2_stack_popInt( opStack ); + + + if ( temp >= 0 ) + font->vsindex = (FT_UInt)temp; + } + break; + + case cf2_cmdBLEND: + { + FT_UInt numBlends; + + + FT_TRACE4(( " blend\n" )); + + if ( !font->isCFF2 ) + break; /* clear stack & ignore */ + + /* do we have a `blend' op in a non-variant font? */ + if ( !font->blend.font ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* check cached blend vector */ + if ( font->cffload->blend_check_vector( &font->blend, + font->vsindex, + font->lenNDV, + font->NDV ) ) + { + lastError = font->cffload->blend_build_vector( &font->blend, + font->vsindex, + font->lenNDV, + font->NDV ); + if ( lastError ) + goto exit; + } + + /* do the blend */ + numBlends = (FT_UInt)cf2_stack_popInt( opStack ); + if ( numBlends > stackSize ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + cf2_doBlend( &font->blend, opStack, numBlends ); + + font->blend.usedBV = TRUE; + } + continue; /* do not clear the stack */ + + case cf2_cmdHSTEMHM: + case cf2_cmdHSTEM: + FT_TRACE4(( "%s\n", op1 == cf2_cmdHSTEMHM ? " hstemhm" + : " hstem" )); + + if ( !font->isT1 ) + { + /* never add hints after the mask is computed */ + /* except if in Type 1 mode (no hintmask op) */ + if ( cf2_hintmask_isValid( &hintMask ) ) + { + FT_TRACE4(( "cf2_interpT2CharString:" + " invalid horizontal hint mask\n" )); + break; + } + } + + /* add left-sidebearing correction in Type 1 mode */ + cf2_doStems( font, + opStack, + &hStemHintArray, + width, + &haveWidth, + font->isT1 ? decoder->builder.left_bearing->y + : 0 ); + + if ( decoder->width_only ) + goto exit; + + break; + + case cf2_cmdVSTEMHM: + case cf2_cmdVSTEM: + FT_TRACE4(( "%s\n", op1 == cf2_cmdVSTEMHM ? " vstemhm" + : " vstem" )); + + if ( !font->isT1 ) + { + /* never add hints after the mask is computed */ + /* except if in Type 1 mode (no hintmask op) */ + if ( cf2_hintmask_isValid( &hintMask ) ) + { + FT_TRACE4(( "cf2_interpT2CharString:" + " invalid vertical hint mask\n" )); + break; + } + } + + /* add left-sidebearing correction in Type 1 mode */ + cf2_doStems( font, + opStack, + &vStemHintArray, + width, + &haveWidth, + font->isT1 ? decoder->builder.left_bearing->x + : 0 ); + + if ( decoder->width_only ) + goto exit; + + break; + + case cf2_cmdVMOVETO: + FT_TRACE4(( " vmoveto\n" )); + + if ( font->isT1 && !decoder->flex_state && !haveWidth ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) ); + + if ( !decoder->flex_state ) + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + break; + + case cf2_cmdRLINETO: + { + CF2_UInt idx; + CF2_UInt count = cf2_stack_count( opStack ); + + + FT_TRACE4(( " rlineto\n" )); + + for ( idx = 0; idx < count; idx += 2 ) + { + curX = ADD_INT32( curX, cf2_stack_getReal( opStack, + idx + 0 ) ); + curY = ADD_INT32( curY, cf2_stack_getReal( opStack, + idx + 1 ) ); + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdHLINETO: + case cf2_cmdVLINETO: + { + CF2_UInt idx; + CF2_UInt count = cf2_stack_count( opStack ); + + FT_Bool isX = FT_BOOL( op1 == cf2_cmdHLINETO ); + + + FT_TRACE4(( "%s\n", isX ? " hlineto" : " vlineto" )); + + for ( idx = 0; idx < count; idx++ ) + { + CF2_Fixed v = cf2_stack_getReal( opStack, idx ); + + + if ( isX ) + curX = ADD_INT32( curX, v ); + else + curY = ADD_INT32( curY, v ); + + isX = !isX; + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + } + + cf2_stack_clear( opStack ); + } + continue; + + case cf2_cmdRCURVELINE: + case cf2_cmdRRCURVETO: + { + CF2_UInt count = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + FT_TRACE4(( "%s\n", op1 == cf2_cmdRCURVELINE ? " rcurveline" + : " rrcurveto" )); + + while ( idx + 6 <= count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 ); + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 ); + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 6; + } + + if ( op1 == cf2_cmdRCURVELINE ) + { + curX = ADD_INT32( curX, cf2_stack_getReal( opStack, + idx + 0 ) ); + curY = ADD_INT32( curY, cf2_stack_getReal( opStack, + idx + 1 ) ); + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdCLOSEPATH: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (%d)\n", op1 )); + else + { + FT_TRACE4(( " closepath\n" )); + + /* if there is no path, `closepath' is a no-op */ + cf2_glyphpath_closeOpenPath( &glyphPath ); + + haveWidth = TRUE; + } + break; + + case cf2_cmdCALLGSUBR: + case cf2_cmdCALLSUBR: + { + CF2_Int subrNum; + + + FT_TRACE4(( "%s", op1 == cf2_cmdCALLGSUBR ? " callgsubr" + : " callsubr" )); + + if ( ( !font->isT1 && charstringIndex > CF2_MAX_SUBR ) || + ( font->isT1 && charstringIndex > T1_MAX_SUBRS_CALLS ) ) + { + /* max subr plus one for charstring */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* overflow of stack */ + } + + /* push our current CFF charstring region on subrStack */ + charstring = (CF2_Buffer) + cf2_arrstack_getPointer( + &subrStack, + (size_t)charstringIndex + 1 ); + + /* set up the new CFF region and pointer */ + subrNum = cf2_stack_popInt( opStack ); + + if ( font->isT1 && decoder->locals_hash ) + { + size_t* val = ft_hash_num_lookup( subrNum, + decoder->locals_hash ); + + + if ( val ) + subrNum = *val; + else + subrNum = -1; + } + + switch ( op1 ) + { + case cf2_cmdCALLGSUBR: + FT_TRACE4(( " (idx %d, entering level %d)\n", + subrNum + decoder->globals_bias, + charstringIndex + 1 )); + + if ( cf2_initGlobalRegionBuffer( decoder, + subrNum, + charstring ) ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* subroutine lookup or stream error */ + } + break; + + default: + /* cf2_cmdCALLSUBR */ + FT_TRACE4(( " (idx %d, entering level %d)\n", + subrNum + decoder->locals_bias, + charstringIndex + 1 )); + + if ( cf2_initLocalRegionBuffer( decoder, + subrNum, + charstring ) ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* subroutine lookup or stream error */ + } + } + + charstringIndex += 1; /* entry is valid now */ + } + continue; /* do not clear the stack */ + + case cf2_cmdRETURN: + FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); + + if ( charstringIndex < 1 ) + { + /* Note: cannot return from top charstring */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* underflow of stack */ + } + + /* restore position in previous charstring */ + charstring = (CF2_Buffer) + cf2_arrstack_getPointer( + &subrStack, + (CF2_UInt)--charstringIndex ); + continue; /* do not clear the stack */ + + case cf2_cmdESC: + { + FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring ); + + + /* first switch for 2-byte operators handles CFF2 */ + /* and opcodes that are reserved for both CFF and CFF2 */ + switch ( op2 ) + { + case cf2_escHFLEX: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, FALSE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, FALSE /* dy3 */, + TRUE /* dx4 */, FALSE /* dy4 */, + TRUE /* dx5 */, FALSE /* dy5 */, + TRUE /* dx6 */, FALSE /* dy6 */ + }; + + + FT_TRACE4(( " hflex\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + continue; + + case cf2_escFLEX: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, TRUE /* dy3 */, + TRUE /* dx4 */, TRUE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + TRUE /* dx6 */, TRUE /* dy6 */ + }; + + + FT_TRACE4(( " flex\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + break; /* TODO: why is this not a continue? */ + + case cf2_escHFLEX1: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, FALSE /* dy3 */, + TRUE /* dx4 */, FALSE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + TRUE /* dx6 */, FALSE /* dy6 */ + }; + + + FT_TRACE4(( " hflex1\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + continue; + + case cf2_escFLEX1: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, TRUE /* dy3 */, + TRUE /* dx4 */, TRUE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + FALSE /* dx6 */, FALSE /* dy6 */ + }; + + + FT_TRACE4(( " flex1\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + TRUE /* doConditionalLastRead */ ); + } + continue; + + /* these opcodes are always reserved */ + case cf2_escRESERVED_8: + case cf2_escRESERVED_13: + case cf2_escRESERVED_19: + case cf2_escRESERVED_25: + case cf2_escRESERVED_31: + case cf2_escRESERVED_32: + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + break; + + default: + { + if ( font->isCFF2 || op2 >= cf2_escRESERVED_38 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else if ( font->isT1 && result_cnt > 0 && op2 != cf2_escPOP ) + { + /* all operands have been transferred by previous pops */ + result_cnt = 0; + } + else + { + /* second switch for 2-byte operators handles */ + /* CFF and Type 1 */ + switch ( op2 ) + { + + case cf2_escDOTSECTION: + /* something about `flip type of locking' -- ignore it */ + FT_TRACE4(( " dotsection\n" )); + + break; + + case cf2_escVSTEM3: + case cf2_escHSTEM3: + /* + * Type 1: Type 2: + * x0 dx0 x1 dx1 x2 dx2 vstem3 x dx {dxa dxb}* vstem + * y0 dy0 y1 dy1 y2 dy2 hstem3 y dy {dya dyb}* hstem + * relative to lsb point relative to zero + * + */ + { + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + CF2_F16Dot16 v0, v1, v2; + + FT_Bool isV = FT_BOOL( op2 == cf2_escVSTEM3 ); + + + FT_TRACE4(( "%s\n", isV ? " vstem3" + : " hstem3" )); + + FT_ASSERT( cf2_stack_count( opStack ) == 6 ); + + v0 = cf2_stack_getReal( opStack, 0 ); + v1 = cf2_stack_getReal( opStack, 2 ); + v2 = cf2_stack_getReal( opStack, 4 ); + + cf2_stack_setReal( + opStack, 2, + SUB_INT32( SUB_INT32( v1, v0 ), + cf2_stack_getReal( opStack, 1 ) ) ); + cf2_stack_setReal( + opStack, 4, + SUB_INT32( SUB_INT32( v2, v1 ), + cf2_stack_getReal( opStack, 3 ) ) ); + + /* add left-sidebearing correction */ + cf2_doStems( font, + opStack, + isV ? &vStemHintArray : &hStemHintArray, + width, + &haveWidth, + isV ? decoder->builder.left_bearing->x + : decoder->builder.left_bearing->y ); + + if ( decoder->width_only ) + goto exit; + } + } + break; + + case cf2_escAND: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " and\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, arg1 && arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escOR: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " or\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, arg1 || arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escNOT: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " not\n" )); + + arg = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, !arg ); + } + continue; /* do not clear the stack */ + + case cf2_escSEAC: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + FT_Error error2; + CF2_Int bchar_index, achar_index; + FT_Vector left_bearing, advance; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + T1_Face face = (T1_Face)decoder->builder.face; +#endif + CF2_BufferRec component; + CF2_Fixed dummyWidth; + + CF2_Int achar = cf2_stack_popInt( opStack ); + CF2_Int bchar = cf2_stack_popInt( opStack ); + + FT_Pos ady = cf2_stack_popFixed ( opStack ); + FT_Pos adx = cf2_stack_popFixed ( opStack ); + FT_Pos asb = cf2_stack_popFixed ( opStack ); + + + FT_TRACE4(( " seac\n" )); + + if ( doingSeac ) + { + FT_ERROR(( " nested seac\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* nested seac */ + } + + if ( decoder->builder.metrics_only ) + { + FT_ERROR(( " unexpected seac\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* unexpected seac */ + } + + /* `glyph_names' is set to 0 for CID fonts which do */ + /* not include an encoding. How can we deal with */ + /* these? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( decoder->glyph_names == 0 && + !face->root.internal->incremental_interface ) +#else + if ( decoder->glyph_names == 0 ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ERROR(( "cf2_interpT2CharString:\n" )); + FT_ERROR(( " (Type 1 seac) glyph names table" + " not available in this font\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* seac weirdness */ + adx += decoder->builder.left_bearing->x; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + { + /* the caller must handle the font encoding also */ + bchar_index = bchar; + achar_index = achar; + } + else +#endif + { + bchar_index = t1_lookup_glyph_by_stdcharcode_ps( + decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode_ps( + decoder, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "cf2_interpT2CharString:\n" )); + FT_ERROR(( " (Type 1 seac) invalid" + " seac character code arguments\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* if we are trying to load a composite glyph, */ + /* do not load the accent character and return */ + /* the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error2 = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); + subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + + goto exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + /* prepare loader */ + FT_GlyphLoader_Prepare( decoder->builder.loader ); + + error2 = cf2_getT1SeacComponent( decoder, + (FT_UInt)bchar_index, + &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + + /* save the left bearing and width of the SEAC */ + /* glyph as they will be erased by the next load */ + + left_bearing = *decoder->builder.left_bearing; + advance = *decoder->builder.advance; + + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + 0, + 0, + &dummyWidth ); + cf2_freeT1SeacComponent( decoder, &component ); + + /* If the SEAC glyph doesn't have a (H)SBW of its */ + /* own use the values from the base glyph. */ + + if ( !haveWidth ) + { + left_bearing = *decoder->builder.left_bearing; + advance = *decoder->builder.advance; + } + + decoder->builder.left_bearing->x = 0; + decoder->builder.left_bearing->y = 0; + + /* Now load `achar' on top of */ + /* the base outline */ + + error2 = cf2_getT1SeacComponent( decoder, + (FT_UInt)achar_index, + &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + adx - asb, + ady, + &dummyWidth ); + cf2_freeT1SeacComponent( decoder, &component ); + + /* restore the left side bearing and advance width */ + /* of the SEAC glyph or base character (saved above) */ + + *decoder->builder.left_bearing = left_bearing; + *decoder->builder.advance = advance; + + goto exit; + } + break; + + case cf2_escSBW: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + CF2_Fixed lsb_x, lsb_y; + PS_Builder* builder; + + + FT_TRACE4(( " sbw" )); + + builder = &decoder->builder; + + builder->advance->y = cf2_stack_popFixed( opStack ); + builder->advance->x = cf2_stack_popFixed( opStack ); + + lsb_y = cf2_stack_popFixed( opStack ); + lsb_x = cf2_stack_popFixed( opStack ); + + builder->left_bearing->x = + ADD_INT32( builder->left_bearing->x, lsb_x ); + builder->left_bearing->y = + ADD_INT32( builder->left_bearing->y, lsb_y ); + + haveWidth = TRUE; + + /* the `metrics_only' indicates that we only want */ + /* to compute the glyph's metrics (lsb + advance */ + /* width), not load the rest of it; so exit */ + /* immediately */ + if ( builder->metrics_only ) + goto exit; + + if ( initial_map_ready ) + { + curX = ADD_INT32( curX, lsb_x ); + curY = ADD_INT32( curY, lsb_y ); + } + } + break; + + case cf2_escABS: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " abs\n" )); + + arg = cf2_stack_popFixed( opStack ); + + if ( arg < -CF2_FIXED_MAX ) + cf2_stack_pushFixed( opStack, CF2_FIXED_MAX ); + else + cf2_stack_pushFixed( opStack, FT_ABS( arg ) ); + } + continue; /* do not clear the stack */ + + case cf2_escADD: + { + CF2_F16Dot16 summand1; + CF2_F16Dot16 summand2; + + + FT_TRACE4(( " add\n" )); + + summand2 = cf2_stack_popFixed( opStack ); + summand1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + ADD_INT32( summand1, + summand2 ) ); + } + continue; /* do not clear the stack */ + + case cf2_escSUB: + { + CF2_F16Dot16 minuend; + CF2_F16Dot16 subtrahend; + + + FT_TRACE4(( " sub\n" )); + + subtrahend = cf2_stack_popFixed( opStack ); + minuend = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + SUB_INT32( minuend, subtrahend ) ); + } + continue; /* do not clear the stack */ + + case cf2_escDIV: + { + CF2_F16Dot16 dividend; + CF2_F16Dot16 divisor; + + + FT_TRACE4(( " div\n" )); + + if ( font->isT1 && large_int ) + { + divisor = (CF2_F16Dot16)cf2_stack_popInt( opStack ); + dividend = (CF2_F16Dot16)cf2_stack_popInt( opStack ); + + large_int = FALSE; + } + else + { + divisor = cf2_stack_popFixed( opStack ); + dividend = cf2_stack_popFixed( opStack ); + } + + cf2_stack_pushFixed( opStack, + FT_DivFix( dividend, divisor ) ); + + } + continue; /* do not clear the stack */ + + case cf2_escNEG: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " neg\n" )); + + arg = cf2_stack_popFixed( opStack ); + + if ( arg < -CF2_FIXED_MAX ) + cf2_stack_pushFixed( opStack, CF2_FIXED_MAX ); + else + cf2_stack_pushFixed( opStack, -arg ); + } + continue; /* do not clear the stack */ + + case cf2_escEQ: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " eq\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, arg1 == arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escCALLOTHERSUBR: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + CF2_Int subr_no; + CF2_Int arg_cnt; + CF2_UInt count; + CF2_UInt opIdx = 0; + + + FT_TRACE4(( " callothersubr\n" )); + + subr_no = cf2_stack_popInt( opStack ); + arg_cnt = cf2_stack_popInt( opStack ); + + /******************************************************** + * + * remove all operands to callothersubr from the stack + * + * for handled othersubrs, where we know the number of + * arguments, we increase the stack by the value of + * known_othersubr_result_cnt + * + * for unhandled othersubrs the following pops adjust + * the stack pointer as necessary + */ + + count = cf2_stack_count( opStack ); + if ( (CF2_UInt)arg_cnt > count ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " stack underflow\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + opIdx += count - (CF2_UInt)arg_cnt; + + known_othersubr_result_cnt = 0; + result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == <whatever>' */ + /* might not be correct; an othersubr expects a */ + /* certain number of operands on the PostScript stack */ + /* (as opposed to the T1 stack) but it doesn't have to */ + /* put them there by itself; previous othersubrs might */ + /* have left the operands there if they were not */ + /* followed by an appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux */ + /* doesn't accept a font that contains charstrings */ + /* like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray */ + /* exists. */ + + switch ( subr_no ) + { + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( initial_map_ready && + ( !decoder->flex_state || + decoder->num_flex_vectors != 7 ) ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " unexpected flex end\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* the two `results' are popped */ + /* by the following setcurrentpoint */ + cf2_stack_pushFixed( opStack, curX ); + cf2_stack_pushFixed( opStack, curY ); + known_othersubr_result_cnt = 2; + break; + + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( !initial_map_ready ) + break; + + if ( ps_builder_check_points( &decoder->builder, 6 ) ) + goto exit; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + FT_Int idx2; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( !initial_map_ready ) + break; + + if ( !decoder->flex_state ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " missing flex start\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* note that we should not add a point for */ + /* index 0; this will move our current position */ + /* to the flex point without adding any point */ + /* to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + { + /* in malformed fonts it is possible to have */ + /* other opcodes in the middle of a flex (which */ + /* don't increase `num_flex_vectors'); we thus */ + /* have to check whether we can add a point */ + + if ( ps_builder_check_points( &decoder->builder, + 1 ) ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* map: 1->2 2->4 3->6 4->2 5->4 6->6 */ + idx2 = ( idx > 3 ? idx - 3 : idx ) * 2; + + flexStore[idx2 - 2] = curX; + flexStore[idx2 - 1] = curY; + + if ( idx == 3 || idx == 6 ) + cf2_glyphpath_curveTo( &glyphPath, + flexStore[0], + flexStore[1], + flexStore[2], + flexStore[3], + flexStore[4], + flexStore[5] ); + } + } + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + if ( initial_map_ready ) + { + /* do not clear hints if initial hintmap */ + /* is not ready - we need to collate all */ + cf2_arrstack_clear( &vStemHintArray ); + cf2_arrstack_clear( &hStemHintArray ); + + cf2_hintmask_init( &hintMask, error ); + hintMask.isValid = FALSE; + hintMask.isNew = TRUE; + } + + known_othersubr_result_cnt = 1; + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + cf2_stack_clear( opStack ); + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + CF2_UInt delta; + CF2_UInt values; + + + if ( !blend ) + { + FT_ERROR(( + "cf2_interpT2CharString:" + " unexpected multiple masters operator\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + num_points = (FT_UInt)subr_no - 13 + + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * + blend->num_designs ) ) + { + FT_ERROR(( + "cf2_interpT2CharString:" + " incorrect number of multiple masters arguments\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* We want to compute */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */ + /* */ + /* However, given that w0 + w1 + ... + wk == 1, we */ + /* can rewrite it easily as */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1. */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = opIdx + num_points; + values = opIdx; + for ( nn = 0; nn < num_points; nn++ ) + { + CF2_Fixed tmp = cf2_stack_getReal( opStack, + values ); + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp = ADD_INT32( tmp, + FT_MulFix( + cf2_stack_getReal( opStack, + delta++ ), + blend->weight_vector[mm] ) ); + + cf2_stack_setReal( opStack, values++, tmp ); + } + cf2_stack_pop( opStack, + (CF2_UInt)arg_cnt - num_points ); + + known_othersubr_result_cnt = (FT_Int)num_points; + break; + } + + case 19: + /* <idx> 1 19 callothersubr */ + /* ==> replace elements starting from index */ + /* cvi( <idx> ) of BuildCharArray with */ + /* WeightVector */ + { + FT_UInt idx; + PS_Blend blend = decoder->blend; + FT_UInt len_buildchar = decoder->len_buildchar; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = (FT_UInt)cf2_stack_popInt( opStack ); + + if ( len_buildchar < blend->num_designs || + len_buildchar - blend->num_designs < idx ) + goto Unexpected_OtherSubr; + + if ( decoder->buildchar && blend->weight_vector ) + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof ( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* <arg1> <arg2> 2 20 callothersubr pop */ + /* ==> push <arg1> + <arg2> onto T1 stack */ + { + CF2_F16Dot16 summand1; + CF2_F16Dot16 summand2; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + summand2 = cf2_stack_popFixed( opStack ); + summand1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + ADD_INT32( summand1, + summand2 ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 21: + /* <arg1> <arg2> 2 21 callothersubr pop */ + /* ==> push <arg1> - <arg2> onto T1 stack */ + { + CF2_F16Dot16 minuend; + CF2_F16Dot16 subtrahend; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + subtrahend = cf2_stack_popFixed( opStack ); + minuend = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + SUB_INT32( minuend, + subtrahend ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 22: + /* <arg1> <arg2> 2 22 callothersubr pop */ + /* ==> push <arg1> * <arg2> onto T1 stack */ + { + CF2_F16Dot16 factor1; + CF2_F16Dot16 factor2; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + factor2 = cf2_stack_popFixed( opStack ); + factor1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + FT_MulFix( factor1, factor2 ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 23: + /* <arg1> <arg2> 2 23 callothersubr pop */ + /* ==> push <arg1> / <arg2> onto T1 stack */ + { + CF2_F16Dot16 dividend; + CF2_F16Dot16 divisor; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + divisor = cf2_stack_popFixed( opStack ); + dividend = cf2_stack_popFixed( opStack ); + + if ( divisor == 0 ) + goto Unexpected_OtherSubr; + + cf2_stack_pushFixed( opStack, + FT_DivFix( dividend, + divisor ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 24: + /* <val> <idx> 2 24 callothersubr */ + /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ + { + CF2_UInt idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 2 || !blend ) + goto Unexpected_OtherSubr; + + idx = (CF2_UInt)cf2_stack_popInt( opStack ); + + if ( idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = + cf2_stack_popFixed( opStack ); + } + break; + + case 25: + /* <idx> 1 25 callothersubr pop */ + /* ==> push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + CF2_UInt idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = (CF2_UInt)cf2_stack_popInt( opStack ); + + if ( idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + cf2_stack_pushFixed( opStack, + decoder->buildchar[idx] ); + known_othersubr_result_cnt = 1; + } + break; + +#if 0 + case 26: + /* <val> mark <idx> */ + /* ==> set BuildCharArray[cvi( <idx> )] = <val>, */ + /* leave mark on T1 stack */ + /* <val> <idx> */ + /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ + XXX which routine has left its mark on the + XXX (PostScript) stack?; + break; +#endif + + case 27: + /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ + /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ + /* otherwise push <res2> */ + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + CF2_F16Dot16 cond1; + CF2_F16Dot16 cond2; + + + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + cond2 = cf2_stack_popFixed( opStack ); + cond1 = cf2_stack_popFixed( opStack ); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + cond1 <= cond2 ? arg1 : arg2 ); + known_othersubr_result_cnt = 1; + } + break; + + case 28: + /* 0 28 callothersubr pop */ + /* ==> push random value from interval [0, 1) */ + /* onto stack */ + { + CF2_F16Dot16 r; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + r = (CF2_F16Dot16) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); + + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); + + cf2_stack_pushFixed( opStack, r ); + known_othersubr_result_cnt = 1; + } + break; + + default: + if ( arg_cnt >= 0 && subr_no >= 0 ) + { + FT_Int i; + + + FT_ERROR(( + "cf2_interpT2CharString (Type 1 mode):" + " unknown othersubr [%d %d], wish me luck\n", + arg_cnt, subr_no )); + + /* store the unused args */ + /* for this unhandled OtherSubr */ + + if ( arg_cnt > PS_STORAGE_SIZE ) + arg_cnt = PS_STORAGE_SIZE; + result_cnt = arg_cnt; + + for ( i = 1; i <= arg_cnt; i++ ) + results[result_cnt - i] = + cf2_stack_popFixed( opStack ); + + break; + } + /* fall through */ + + Unexpected_OtherSubr: + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " invalid othersubr [%d %d]\n", + arg_cnt, subr_no )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + } + continue; /* do not clear the stack */ + + case cf2_escPOP: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + continue; + } + + if ( result_cnt == 0 ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " no more operands for othersubr\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + result_cnt--; + cf2_stack_pushFixed( opStack, results[result_cnt] ); + } + continue; /* do not clear the stack */ + + case cf2_escDROP: + FT_TRACE4(( " drop\n" )); + + (void)cf2_stack_popFixed( opStack ); + continue; /* do not clear the stack */ + + case cf2_escPUT: + { + CF2_F16Dot16 val; + CF2_UInt idx; + + + FT_TRACE4(( " put\n" )); + + idx = (CF2_UInt)cf2_stack_popInt( opStack ); + val = cf2_stack_popFixed( opStack ); + + if ( idx < CF2_STORAGE_SIZE ) + storage[idx] = val; + } + continue; /* do not clear the stack */ + + case cf2_escGET: + { + CF2_UInt idx; + + + FT_TRACE4(( " get\n" )); + + idx = (CF2_UInt)cf2_stack_popInt( opStack ); + + if ( idx < CF2_STORAGE_SIZE ) + cf2_stack_pushFixed( opStack, storage[idx] ); + } + continue; /* do not clear the stack */ + + case cf2_escIFELSE: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + CF2_F16Dot16 cond1; + CF2_F16Dot16 cond2; + + + FT_TRACE4(( " ifelse\n" )); + + cond2 = cf2_stack_popFixed( opStack ); + cond1 = cf2_stack_popFixed( opStack ); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + cond1 <= cond2 ? arg1 : arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escRANDOM: /* in spec */ + { + CF2_F16Dot16 r; + + + FT_TRACE4(( " random\n" )); + + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + r = (CF2_F16Dot16) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); + + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); + + cf2_stack_pushFixed( opStack, r ); + } + continue; /* do not clear the stack */ + + case cf2_escMUL: + { + CF2_F16Dot16 factor1; + CF2_F16Dot16 factor2; + + + FT_TRACE4(( " mul\n" )); + + factor2 = cf2_stack_popFixed( opStack ); + factor1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + FT_MulFix( factor1, factor2 ) ); + } + continue; /* do not clear the stack */ + + case cf2_escSQRT: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " sqrt\n" )); + + arg = cf2_stack_popFixed( opStack ); + if ( arg > 0 ) + { + /* use a start value that doesn't make */ + /* the algorithm's addition overflow */ + FT_Fixed root = arg < 10 ? arg : arg >> 1; + FT_Fixed new_root; + + + /* Babylonian method */ + for (;;) + { + new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1; + if ( new_root == root ) + break; + root = new_root; + } + arg = new_root; + } + else + arg = 0; + + cf2_stack_pushFixed( opStack, arg ); + } + continue; /* do not clear the stack */ + + case cf2_escDUP: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " dup\n" )); + + arg = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, arg ); + cf2_stack_pushFixed( opStack, arg ); + } + continue; /* do not clear the stack */ + + case cf2_escEXCH: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " exch\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, arg2 ); + cf2_stack_pushFixed( opStack, arg1 ); + } + continue; /* do not clear the stack */ + + case cf2_escINDEX: + { + CF2_Int idx; + CF2_UInt size; + + + FT_TRACE4(( " index\n" )); + + idx = cf2_stack_popInt( opStack ); + size = cf2_stack_count( opStack ); + + if ( size > 0 ) + { + /* for `cf2_stack_getReal', */ + /* index 0 is bottom of stack */ + CF2_UInt gr_idx; + + + if ( idx < 0 ) + gr_idx = size - 1; + else if ( (CF2_UInt)idx >= size ) + gr_idx = 0; + else + gr_idx = size - 1 - (CF2_UInt)idx; + + cf2_stack_pushFixed( opStack, + cf2_stack_getReal( opStack, + gr_idx ) ); + } + } + continue; /* do not clear the stack */ + + case cf2_escROLL: + { + CF2_Int idx; + CF2_Int count; + + + FT_TRACE4(( " roll\n" )); + + idx = cf2_stack_popInt( opStack ); + count = cf2_stack_popInt( opStack ); + + cf2_stack_roll( opStack, count, idx ); + } + continue; /* do not clear the stack */ + + case cf2_escSETCURRENTPT: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + FT_TRACE4(( " setcurrentpoint" )); + + if ( !initial_map_ready ) + break; + + /* From the T1 specification, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs */ + /* procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled */ + /* above. */ + + /* Note, however, that both Ghostscript and Adobe */ + /* Distiller handle this situation by silently */ + /* ignoring the inappropriate `setcurrentpoint' */ + /* instruction. So we do the same. */ +#if 0 + + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "cf2_interpT2CharString:" + " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + } + else + ... +#endif + + curY = cf2_stack_popFixed( opStack ); + curX = cf2_stack_popFixed( opStack ); + + decoder->flex_state = 0; + } + break; + + } /* end of 2nd switch checking op2 */ + } + } + } /* end of 1st switch checking op2 */ + } /* case cf2_cmdESC */ + + break; + + case cf2_cmdHSBW: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (%d)\n", op1 )); + else + { + CF2_Fixed lsb_x; + PS_Builder* builder; + + + FT_TRACE4(( " hsbw\n" )); + + builder = &decoder->builder; + + builder->advance->x = cf2_stack_popFixed( opStack ); + builder->advance->y = 0; + + lsb_x = cf2_stack_popFixed( opStack ); + + builder->left_bearing->x = ADD_INT32( builder->left_bearing->x, + lsb_x ); + + haveWidth = TRUE; + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + goto exit; + + if ( initial_map_ready ) + curX = ADD_INT32( curX, lsb_x ); + } + break; + + case cf2_cmdENDCHAR: + FT_TRACE4(( " endchar\n" )); + + if ( font->isT1 && !initial_map_ready ) + { + FT_TRACE5(( "cf2_interpT2CharString (Type 1 mode): " + "Build initial hintmap, rewinding...\n" )); + + /* trigger initial hintmap build */ + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + initial_map_ready = TRUE; + + /* change hints routine - clear for rewind */ + cf2_arrstack_clear( &vStemHintArray ); + cf2_arrstack_clear( &hStemHintArray ); + + cf2_hintmask_init( &hintMask, error ); + hintMask.isValid = FALSE; + hintMask.isNew = TRUE; + + /* rewind charstring */ + /* some charstrings use endchar from a final subroutine call */ + /* without returning, detect these and exit to the top level */ + /* charstring */ + while ( charstringIndex > 0 ) + { + FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); + + /* restore position in previous charstring */ + charstring = (CF2_Buffer) + cf2_arrstack_getPointer( + &subrStack, + (CF2_UInt)--charstringIndex ); + } + charstring->ptr = charstring->start; + + break; + } + + if ( cf2_stack_count( opStack ) == 1 || + cf2_stack_count( opStack ) == 5 ) + { + if ( !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + } + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + /* close path if still open */ + cf2_glyphpath_closeOpenPath( &glyphPath ); + + /* disable seac for CFF2 and Type1 */ + /* (charstring ending with args on stack) */ + if ( !font->isCFF2 && !font->isT1 && cf2_stack_count( opStack ) > 1 ) + { + /* must be either 4 or 5 -- */ + /* this is a (deprecated) implied `seac' operator */ + + CF2_Int achar; + CF2_Int bchar; + CF2_BufferRec component; + CF2_Fixed dummyWidth; /* ignore component width */ + FT_Error error2; + + + if ( doingSeac ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* nested seac */ + } + + achar = cf2_stack_popInt( opStack ); + bchar = cf2_stack_popInt( opStack ); + + curY = cf2_stack_popFixed( opStack ); + curX = cf2_stack_popFixed( opStack ); + + error2 = cf2_getSeacComponent( decoder, achar, &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + curX, + curY, + &dummyWidth ); + cf2_freeSeacComponent( decoder, &component ); + + error2 = cf2_getSeacComponent( decoder, bchar, &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + 0, + 0, + &dummyWidth ); + cf2_freeSeacComponent( decoder, &component ); + } + goto exit; + + case cf2_cmdCNTRMASK: + case cf2_cmdHINTMASK: + /* the final \n in the tracing message gets added in */ + /* `cf2_hintmask_read' (which also traces the mask bytes) */ + FT_TRACE4(( "%s", op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" )); + + /* never add hints after the mask is computed */ + if ( cf2_stack_count( opStack ) > 1 && + cf2_hintmask_isValid( &hintMask ) ) + { + FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" )); + break; + } + + /* if there are arguments on the stack, there this is an */ + /* implied cf2_cmdVSTEMHM */ + cf2_doStems( font, + opStack, + &vStemHintArray, + width, + &haveWidth, + 0 ); + + if ( decoder->width_only ) + goto exit; + + if ( op1 == cf2_cmdHINTMASK ) + { + /* consume the hint mask bytes which follow the operator */ + cf2_hintmask_read( &hintMask, + charstring, + cf2_arrstack_size( &hStemHintArray ) + + cf2_arrstack_size( &vStemHintArray ) ); + } + else + { + /* + * Consume the counter mask bytes which follow the operator: + * Build a temporary hint map, just to place and lock those + * stems participating in the counter mask. These are most + * likely the dominant hstems, and are grouped together in a + * few counter groups, not necessarily in correspondence + * with the hint groups. This reduces the chances of + * conflicts between hstems that are initially placed in + * separate hint groups and then brought together. The + * positions are copied back to `hStemHintArray', so we can + * discard `counterMask' and `counterHintMap'. + * + */ + CF2_HintMapRec counterHintMap; + CF2_HintMaskRec counterMask; + + + cf2_hintmap_init( &counterHintMap, + font, + &glyphPath.initialHintMap, + &glyphPath.hintMoves, + scaleY ); + cf2_hintmask_init( &counterMask, error ); + + cf2_hintmask_read( &counterMask, + charstring, + cf2_arrstack_size( &hStemHintArray ) + + cf2_arrstack_size( &vStemHintArray ) ); + cf2_hintmap_build( &counterHintMap, + &hStemHintArray, + &vStemHintArray, + &counterMask, + 0, + FALSE ); + } + break; + + case cf2_cmdRMOVETO: + FT_TRACE4(( " rmoveto\n" )); + + if ( font->isT1 && !decoder->flex_state && !haveWidth ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( cf2_stack_count( opStack ) > 2 && !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) ); + curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) ); + + if ( !decoder->flex_state ) + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + break; + + case cf2_cmdHMOVETO: + FT_TRACE4(( " hmoveto\n" )); + + if ( font->isT1 && !decoder->flex_state && !haveWidth ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) ); + + if ( !decoder->flex_state ) + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + break; + + case cf2_cmdRLINECURVE: + { + CF2_UInt count = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + FT_TRACE4(( " rlinecurve\n" )); + + while ( idx + 6 < count ) + { + curX = ADD_INT32( curX, cf2_stack_getReal( opStack, + idx + 0 ) ); + curY = ADD_INT32( curY, cf2_stack_getReal( opStack, + idx + 1 ) ); + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + idx += 2; + } + + while ( idx < count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 ); + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 ); + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 6; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdVVCURVETO: + { + CF2_UInt count, count1 = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + /* (and sorting the stack indexing to suit) */ + count = count1 & ~2U; + idx += count1 - count; + + FT_TRACE4(( " vvcurveto\n" )); + + while ( idx < count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + if ( ( count - idx ) & 1 ) + { + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curX ); + + idx++; + } + else + x1 = curX; + + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + x3 = x2; + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 ); + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 4; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdHHCURVETO: + { + CF2_UInt count, count1 = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + /* (and sorting the stack indexing to suit) */ + count = count1 & ~2U; + idx += count1 - count; + + FT_TRACE4(( " hhcurveto\n" )); + + while ( idx < count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + if ( ( count - idx ) & 1 ) + { + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curY ); + + idx++; + } + else + y1 = curY; + + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 ); + y3 = y2; + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 4; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdVHCURVETO: + case cf2_cmdHVCURVETO: + { + CF2_UInt count, count1 = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + FT_Bool alternate = FT_BOOL( op1 == cf2_cmdHVCURVETO ); + + + /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */ + /* 8n+4, or 8n+5, we enforce it by clearing the */ + /* second bit */ + /* (and sorting the stack indexing to suit) */ + count = count1 & ~2U; + idx += count1 - count; + + FT_TRACE4(( "%s\n", alternate ? " hvcurveto" : " vhcurveto" )); + + while ( idx < count ) + { + CF2_Fixed x1, x2, x3, y1, y2, y3; + + + if ( alternate ) + { + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + y1 = curY; + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 ); + + if ( count - idx == 5 ) + { + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 ); + + idx++; + } + else + x3 = x2; + + alternate = FALSE; + } + else + { + x1 = curX; + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 ); + + if ( count - idx == 5 ) + { + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), y2 ); + + idx++; + } + else + y3 = y2; + + alternate = TRUE; + } + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 4; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdEXTENDEDNMBR: + { + CF2_Int v; + + CF2_Int byte1 = cf2_buf_readByte( charstring ); + CF2_Int byte2 = cf2_buf_readByte( charstring ); + + + v = (FT_Short)( ( byte1 << 8 ) | + byte2 ); + + FT_TRACE4(( " %d", v )); + + cf2_stack_pushInt( opStack, v ); + } + continue; + + default: + /* numbers */ + { + if ( /* op1 >= 32 && */ op1 <= 246 ) + { + CF2_Int v; + + + v = op1 - 139; + + FT_TRACE4(( " %d", v )); + + /* -107 .. 107 */ + cf2_stack_pushInt( opStack, v ); + } + + else if ( /* op1 >= 247 && */ op1 <= 250 ) + { + CF2_Int v; + + + v = op1; + v -= 247; + v *= 256; + v += cf2_buf_readByte( charstring ); + v += 108; + + FT_TRACE4(( " %d", v )); + + /* 108 .. 1131 */ + cf2_stack_pushInt( opStack, v ); + } + + else if ( /* op1 >= 251 && */ op1 <= 254 ) + { + CF2_Int v; + + + v = op1; + v -= 251; + v *= 256; + v += cf2_buf_readByte( charstring ); + v = -v - 108; + + FT_TRACE4(( " %d", v )); + + /* -1131 .. -108 */ + cf2_stack_pushInt( opStack, v ); + } + + else /* op1 == 255 */ + { + CF2_Fixed v; + + FT_UInt32 byte1 = (FT_UInt32)cf2_buf_readByte( charstring ); + FT_UInt32 byte2 = (FT_UInt32)cf2_buf_readByte( charstring ); + FT_UInt32 byte3 = (FT_UInt32)cf2_buf_readByte( charstring ); + FT_UInt32 byte4 = (FT_UInt32)cf2_buf_readByte( charstring ); + + + v = (CF2_Fixed)( ( byte1 << 24 ) | + ( byte2 << 16 ) | + ( byte3 << 8 ) | + byte4 ); + + /* + * For Type 1: + * + * According to the specification, values > 32000 or < -32000 + * must be followed by a `div' operator to make the result be + * in the range [-32000;32000]. We expect that the second + * argument of `div' is not a large number. Additionally, we + * don't handle stuff like `<large1> <large2> <num> div <num> + * div' or <large1> <large2> <num> div div'. This is probably + * not allowed anyway. + * + * <large> <num> <num>+ div is not checked but should not be + * allowed as the large value remains untouched. + * + */ + if ( font->isT1 ) + { + if ( v > 32000 || v < -32000 ) + { + if ( large_int ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " no `div' after large integer\n" )); + else + large_int = TRUE; + } + + FT_TRACE4(( " %d", v )); + + cf2_stack_pushInt( opStack, (CF2_Int)v ); + } + else + { + FT_TRACE4(( " %.5fF", v / 65536.0 )); + + cf2_stack_pushFixed( opStack, v ); + } + } + } + continue; /* don't clear stack */ + + } /* end of switch statement checking `op1' */ + + cf2_stack_clear( opStack ); + + } /* end of main interpreter loop */ + + /* we get here if the charstring ends without cf2_cmdENDCHAR */ + FT_TRACE4(( "cf2_interpT2CharString:" + " charstring ends without ENDCHAR\n" )); + + exit: + /* check whether last error seen is also the first one */ + cf2_setError( error, lastError ); + + if ( *error ) + FT_TRACE4(( "charstring error %d\n", *error )); + + /* free resources from objects we've used */ + cf2_glyphpath_finalize( &glyphPath ); + cf2_arrstack_finalize( &vStemHintArray ); + cf2_arrstack_finalize( &hStemHintArray ); + cf2_arrstack_finalize( &subrStack ); + cf2_stack_free( opStack ); + + FT_TRACE4(( "\n" )); + + return; + } + + +/* END */ diff --git a/external/freetype/src/psaux/psintrp.h b/external/freetype/src/psaux/psintrp.h new file mode 100644 index 000000000..d8b9342ec --- /dev/null +++ b/external/freetype/src/psaux/psintrp.h @@ -0,0 +1,83 @@ +/**************************************************************************** + * + * psintrp.h + * + * Adobe's CFF Interpreter (specification). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSINTRP_H_ +#define PSINTRP_H_ + + +#include "psft.h" +#include "pshints.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + cf2_hintmask_init( CF2_HintMask hintmask, + FT_Error* error ); + FT_LOCAL( FT_Bool ) + cf2_hintmask_isValid( const CF2_HintMask hintmask ); + FT_LOCAL( FT_Bool ) + cf2_hintmask_isNew( const CF2_HintMask hintmask ); + FT_LOCAL( void ) + cf2_hintmask_setNew( CF2_HintMask hintmask, + FT_Bool val ); + FT_LOCAL( FT_Byte* ) + cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ); + FT_LOCAL( void ) + cf2_hintmask_setAll( CF2_HintMask hintmask, + size_t bitCount ); + + FT_LOCAL( void ) + cf2_interpT2CharString( CF2_Font font, + const CF2_Buffer buf, + CF2_OutlineCallbacks callbacks, + const FT_Vector* translation, + FT_Bool doingSeac, + CF2_Fixed curX, + CF2_Fixed curY, + CF2_Fixed* width ); + + +FT_END_HEADER + + +#endif /* PSINTRP_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psobjs.c b/external/freetype/src/psaux/psobjs.c new file mode 100644 index 000000000..8da755d0e --- /dev/null +++ b/external/freetype/src/psaux/psobjs.c @@ -0,0 +1,2562 @@ +/**************************************************************************** + * + * psobjs.c + * + * Auxiliary functions for PostScript fonts (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/psaux.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/ftdriver.h> + +#include "psobjs.h" +#include "psconv.h" + +#include "psauxerr.h" +#include "psauxmod.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT psobjs + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @Function: + * ps_table_new + * + * @Description: + * Initializes a PS_Table. + * + * @InOut: + * table :: + * The address of the target table. + * + * @Input: + * count :: + * The table size = the maximum number of elements. + * + * memory :: + * The memory object to use for all subsequent + * reallocations. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ) + { + FT_Error error; + + + table->memory = memory; + if ( FT_NEW_ARRAY( table->elements, count ) || + FT_NEW_ARRAY( table->lengths, count ) ) + goto Exit; + + table->max_elems = count; + table->init = 0xDEADBEEFUL; + table->block = NULL; + table->capacity = 0; + table->cursor = 0; + + *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; + + Exit: + if ( error ) + FT_FREE( table->elements ); + + return error; + } + + + static FT_Error + ps_table_realloc( PS_Table table, + FT_Offset new_size ) + { + FT_Memory memory = table->memory; + FT_Byte* old_base = table->block; + FT_Error error; + + + /* (re)allocate the base block */ + if ( FT_REALLOC( table->block, table->capacity, new_size ) ) + return error; + + /* rebase offsets if necessary */ + if ( old_base && table->block != old_base ) + { + FT_Byte** offset = table->elements; + FT_Byte** limit = offset + table->max_elems; + + + for ( ; offset < limit; offset++ ) + { + if ( *offset ) + *offset = table->block + ( *offset - old_base ); + } + } + + table->capacity = new_size; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * ps_table_add + * + * @Description: + * Adds an object to a PS_Table, possibly growing its memory block. + * + * @InOut: + * table :: + * The target table. + * + * @Input: + * idx :: + * The index of the object in the table. + * + * object :: + * The address of the object to copy in memory. + * + * length :: + * The length in bytes of the source object. + * + * @Return: + * FreeType error code. 0 means success. An error is returned if a + * reallocation fails. + */ + FT_LOCAL_DEF( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + const void* object, + FT_UInt length ) + { + if ( idx < 0 || idx >= table->max_elems ) + { + FT_ERROR(( "ps_table_add: invalid index\n" )); + return FT_THROW( Invalid_Argument ); + } + + /* grow the base block if needed */ + if ( table->cursor + length > table->capacity ) + { + FT_Error error; + FT_Offset new_size = table->capacity; + FT_PtrDist in_offset; + + + in_offset = (FT_Byte*)object - table->block; + if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity ) + in_offset = -1; + + while ( new_size < table->cursor + length ) + { + /* increase size by 25% and round up to the nearest multiple + of 1024 */ + new_size += ( new_size >> 2 ) + 1; + new_size = FT_PAD_CEIL( new_size, 1024 ); + } + + error = ps_table_realloc( table, new_size ); + if ( error ) + return error; + + if ( in_offset >= 0 ) + object = table->block + in_offset; + } + + /* add the object to the base block and adjust offset */ + table->elements[idx] = FT_OFFSET( table->block, table->cursor ); + table->lengths [idx] = length; + FT_MEM_COPY( table->block + table->cursor, object, length ); + + table->cursor += length; + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * ps_table_done + * + * @Description: + * Finalizes a PS_TableRec (i.e., reallocate it to its current + * cursor). + * + * @InOut: + * table :: + * The target table. + */ + FT_LOCAL_DEF( void ) + ps_table_done( PS_Table table ) + { + /* no problem if shrinking fails */ + ps_table_realloc( table, table->cursor ); + } + + + FT_LOCAL_DEF( void ) + ps_table_release( PS_Table table ) + { + FT_Memory memory = table->memory; + + + if ( table->init == 0xDEADBEEFUL ) + { + FT_FREE( table->block ); + FT_FREE( table->elements ); + FT_FREE( table->lengths ); + table->init = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* first character must be already part of the comment */ + + static void + skip_comment( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( IS_PS_NEWLINE( *cur ) ) + break; + cur++; + } + + *acur = cur; + } + + + static void + skip_spaces( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( !IS_PS_SPACE( *cur ) ) + { + if ( *cur == '%' ) + /* According to the PLRM, a comment is equal to a space. */ + skip_comment( &cur, limit ); + else + break; + } + cur++; + } + + *acur = cur; + } + + +#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) + + + /* first character must be `('; */ + /* *acur is positioned at the character after the closing `)' */ + + static FT_Error + skip_literal_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Int embed = 0; + FT_Error error = FT_ERR( Invalid_File_Format ); + unsigned int i; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + cur++; + + if ( c == '\\' ) + { + /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ + /* A backslash can introduce three different types */ + /* of escape sequences: */ + /* - a special escaped char like \r, \n, etc. */ + /* - a one-, two-, or three-digit octal number */ + /* - none of the above in which case the backslash is ignored */ + + if ( cur == limit ) + /* error (or to be ignored?) */ + break; + + switch ( *cur ) + { + /* skip `special' escape */ + case 'n': + case 'r': + case 't': + case 'b': + case 'f': + case '\\': + case '(': + case ')': + cur++; + break; + + default: + /* skip octal escape or ignore backslash */ + for ( i = 0; i < 3 && cur < limit; i++ ) + { + if ( !IS_OCTAL_DIGIT( *cur ) ) + break; + + cur++; + } + } + } + else if ( c == '(' ) + embed++; + else if ( c == ')' ) + { + embed--; + if ( embed == 0 ) + { + error = FT_Err_Ok; + break; + } + } + } + + *acur = cur; + + return error; + } + + + /* first character must be `<' */ + + static FT_Error + skip_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Error err = FT_Err_Ok; + + + while ( ++cur < limit ) + { + /* All whitespace characters are ignored. */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; + + if ( !IS_PS_XDIGIT( *cur ) ) + break; + } + + if ( cur < limit && *cur != '>' ) + { + FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); + err = FT_THROW( Invalid_File_Format ); + } + else + cur++; + + *acur = cur; + return err; + } + + + /* first character must be the opening brace that */ + /* starts the procedure */ + + /* NB: [ and ] need not match: */ + /* `/foo {[} def' is a valid PostScript fragment, */ + /* even within a Type1 font */ + + static FT_Error + skip_procedure( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur; + FT_Int embed = 0; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( **acur == '{' ); + + for ( cur = *acur; cur < limit && error == FT_Err_Ok; cur++ ) + { + switch ( *cur ) + { + case '{': + embed++; + break; + + case '}': + embed--; + if ( embed == 0 ) + { + cur++; + goto end; + } + break; + + case '(': + error = skip_literal_string( &cur, limit ); + break; + + case '<': + error = skip_string( &cur, limit ); + break; + + case '%': + skip_comment( &cur, limit ); + break; + } + } + + end: + if ( embed != 0 ) + error = FT_THROW( Invalid_File_Format ); + + *acur = cur; + + return error; + } + + + /************************************************************************ + * + * All exported parsing routines handle leading whitespace and stop at + * the first character which isn't part of the just handled token. + * + */ + + + FT_LOCAL_DEF( void ) + ps_parser_skip_PS_token( PS_Parser parser ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* character in a name (PS Ref Manual, 3rd ed, p31). */ + /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ + + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + FT_Error error = FT_Err_Ok; + + + skip_spaces( &cur, limit ); /* this also skips comments */ + if ( cur >= limit ) + goto Exit; + + /* self-delimiting, single-character tokens */ + if ( *cur == '[' || *cur == ']' ) + { + cur++; + goto Exit; + } + + /* skip balanced expressions (procedures and strings) */ + + if ( *cur == '{' ) /* {...} */ + { + error = skip_procedure( &cur, limit ); + goto Exit; + } + + if ( *cur == '(' ) /* (...) */ + { + error = skip_literal_string( &cur, limit ); + goto Exit; + } + + if ( *cur == '<' ) /* <...> */ + { + if ( cur + 1 < limit && *( cur + 1 ) == '<' ) /* << */ + { + cur++; + cur++; + } + else + error = skip_string( &cur, limit ); + + goto Exit; + } + + if ( *cur == '>' ) + { + cur++; + if ( cur >= limit || *cur != '>' ) /* >> */ + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " unexpected closing delimiter `>'\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + cur++; + goto Exit; + } + + if ( *cur == '/' ) + cur++; + + /* anything else */ + while ( cur < limit ) + { + /* *cur might be invalid (e.g., ')' or '}'), but this */ + /* is handled by the test `cur == parser->cursor' below */ + if ( IS_PS_DELIM( *cur ) ) + break; + + cur++; + } + + Exit: + if ( cur < limit && cur == parser->cursor ) + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " current token is `%c' which is self-delimiting\n", + *cur )); + FT_ERROR(( " " + " but invalid at this point\n" )); + + error = FT_THROW( Invalid_File_Format ); + } + + if ( cur > limit ) + cur = limit; + + parser->error = error; + parser->cursor = cur; + } + + + FT_LOCAL_DEF( void ) + ps_parser_skip_spaces( PS_Parser parser ) + { + skip_spaces( &parser->cursor, parser->limit ); + } + + + /* `token' here means either something between balanced delimiters */ + /* or the next token; the delimiters are not removed. */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ) + { + FT_Byte* cur; + FT_Byte* limit; + FT_Int embed; + + + token->type = T1_TOKEN_TYPE_NONE; + token->start = NULL; + token->limit = NULL; + + /* first of all, skip leading whitespace */ + ps_parser_skip_spaces( parser ); + + cur = parser->cursor; + limit = parser->limit; + + if ( cur >= limit ) + return; + + switch ( *cur ) + { + /************* check for literal string *****************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + token->start = cur; + + if ( skip_literal_string( &cur, limit ) == FT_Err_Ok ) + token->limit = cur; + break; + + /************* check for programs/array *****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + token->start = cur; + + if ( skip_procedure( &cur, limit ) == FT_Err_Ok ) + token->limit = cur; + break; + + /************* check for table/array ********************/ + /* XXX: in theory we should also look for "<<" */ + /* since this is semantically equivalent to "["; */ + /* in practice it doesn't matter (?) */ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + embed = 1; + token->start = cur++; + + /* we need this to catch `[ ]' */ + parser->cursor = cur; + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + while ( cur < limit && !parser->error ) + { + /* XXX: this is wrong because it does not */ + /* skip comments, procedures, and strings */ + if ( *cur == '[' ) + embed++; + else if ( *cur == ']' ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = ++cur; + break; + } + } + + parser->cursor = cur; + ps_parser_skip_PS_token( parser ); + /* we need this to catch `[XXX ]' */ + ps_parser_skip_spaces ( parser ); + cur = parser->cursor; + } + break; + + /* ************ otherwise, it is any token **************/ + default: + token->start = cur; + token->type = ( *cur == '/' ) ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY; + ps_parser_skip_PS_token( parser ); + cur = parser->cursor; + if ( !parser->error ) + token->limit = cur; + } + + if ( !token->limit ) + { + token->start = NULL; + token->type = T1_TOKEN_TYPE_NONE; + } + + parser->cursor = cur; + } + + + /* NB: `tokens' can be NULL if we only want to count */ + /* the number of array elements */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ) + { + T1_TokenRec master; + + + *pnum_tokens = -1; + + /* this also handles leading whitespace */ + ps_parser_to_token( parser, &master ); + + if ( master.type == T1_TOKEN_TYPE_ARRAY ) + { + FT_Byte* old_cursor = parser->cursor; + FT_Byte* old_limit = parser->limit; + T1_Token cur = tokens; + T1_Token limit = cur + max_tokens; + + + /* don't include outermost delimiters */ + parser->cursor = master.start + 1; + parser->limit = master.limit - 1; + + while ( parser->cursor < parser->limit ) + { + T1_TokenRec token; + + + ps_parser_to_token( parser, &token ); + if ( !token.type ) + break; + + if ( tokens && cur < limit ) + *cur = token; + + cur++; + } + + *pnum_tokens = (FT_Int)( cur - tokens ); + + parser->cursor = old_cursor; + parser->limit = old_limit; + } + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `coords' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_coords' */ + + static FT_Int + ps_tocoordarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_coords, + FT_Short* coords ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* check for the beginning of an array; otherwise, only one number */ + /* will be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the coordinates */ + while ( cur < limit ) + { + FT_Short dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( coords && count >= max_coords ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( coords ? &coords[count] : &dummy ) = + (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `values' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_values' */ + /* */ + /* return number of successfully parsed values */ + + static FT_Int + ps_tofixedarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* Check for the beginning of an array. Otherwise, only one number */ + /* will be read. */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the values */ + while ( cur < limit ) + { + FT_Fixed dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( values && count >= max_values ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( values ? &values[count] : &dummy ) = + PS_Conv_ToFixed( &cur, limit, power_ten ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + +#if 0 + + static FT_String* + ps_tostring( FT_Byte** cursor, + FT_Byte* limit, + FT_Memory memory ) + { + FT_Byte* cur = *cursor; + FT_UInt len = 0; + FT_Int count; + FT_String* result; + FT_Error error; + + + /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ + /* that simply doesn't begin with an opening parenthesis, even */ + /* though they have a closing one! E.g. "amuncial.pfb" */ + /* */ + /* We must deal with these ill-fated cases there. Note that */ + /* these fonts didn't work with the old Type 1 driver as the */ + /* notice/copyright was not recognized as a valid string token */ + /* and made the old token parser commit errors. */ + + while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) + cur++; + if ( cur + 1 >= limit ) + return 0; + + if ( *cur == '(' ) + cur++; /* skip the opening parenthesis, if there is one */ + + *cursor = cur; + count = 0; + + /* then, count its length */ + for ( ; cur < limit; cur++ ) + { + if ( *cur == '(' ) + count++; + + else if ( *cur == ')' ) + { + count--; + if ( count < 0 ) + break; + } + } + + len = (FT_UInt)( cur - *cursor ); + if ( cur >= limit || FT_QALLOC( result, len + 1 ) ) + return 0; + + /* now copy the string */ + FT_MEM_COPY( result, *cursor, len ); + result[len] = '\0'; + *cursor = cur; + return result; + } + +#endif /* 0 */ + + + static int + ps_tobool( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Bool result = 0; + + + /* return 1 if we find `true', 0 otherwise */ + if ( cur + 3 < limit && + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) + { + result = 1; + cur += 5; + } + else if ( cur + 4 < limit && + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) + { + result = 0; + cur += 6; + } + + *acur = cur; + return result; + } + + + /* load a simple field (i.e. non-table) into the current list of objects */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec token; + FT_Byte* cur; + FT_Byte* limit; + FT_UInt count; + FT_UInt idx; + FT_Error error; + T1_FieldType type; + + + /* this also skips leading whitespace */ + ps_parser_to_token( parser, &token ); + if ( !token.type ) + goto Fail; + + count = 1; + idx = 0; + cur = token.start; + limit = token.limit; + + type = field->type; + + /* we must detect arrays in /FontBBox */ + if ( type == T1_FIELD_TYPE_BBOX ) + { + T1_TokenRec token2; + FT_Byte* old_cur = parser->cursor; + FT_Byte* old_limit = parser->limit; + + + /* don't include delimiters */ + parser->cursor = token.start + 1; + parser->limit = token.limit - 1; + + ps_parser_to_token( parser, &token2 ); + parser->cursor = old_cur; + parser->limit = old_limit; + + if ( token2.type == T1_TOKEN_TYPE_ARRAY ) + { + type = T1_FIELD_TYPE_MM_BBOX; + goto FieldArray; + } + } + else if ( token.type == T1_TOKEN_TYPE_ARRAY ) + { + count = max_objects; + + FieldArray: + /* if this is an array and we have no blend, an error occurs */ + if ( max_objects == 0 ) + goto Fail; + + idx = 1; + + /* don't include delimiters */ + cur++; + limit--; + } + + for ( ; count > 0; count--, idx++ ) + { + FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; + FT_Long val; + + + skip_spaces( &cur, limit ); + + switch ( type ) + { + case T1_FIELD_TYPE_BOOL: + val = ps_tobool( &cur, limit ); + FT_TRACE4(( " %s", val ? "true" : "false" )); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED: + val = PS_Conv_ToFixed( &cur, limit, 0 ); + FT_TRACE4(( " %f", (double)val / 65536 )); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED_1000: + val = PS_Conv_ToFixed( &cur, limit, 3 ); + FT_TRACE4(( " %f", (double)val / 65536 / 1000 )); + goto Store_Integer; + + case T1_FIELD_TYPE_INTEGER: + val = PS_Conv_ToInt( &cur, limit ); + FT_TRACE4(( " %ld", val )); + /* fall through */ + + Store_Integer: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)q = (FT_UShort)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)q = (FT_UInt32)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case T1_FIELD_TYPE_STRING: + case T1_FIELD_TYPE_KEY: + { + FT_Memory memory = parser->memory; + FT_UInt len = (FT_UInt)( limit - cur ); + FT_String* string = NULL; + + + if ( cur >= limit ) + break; + + /* we allow both a string or a name */ + /* for cases like /FontName (foo) def */ + if ( token.type == T1_TOKEN_TYPE_KEY ) + { + /* don't include leading `/' */ + len--; + cur++; + } + else if ( token.type == T1_TOKEN_TYPE_STRING ) + { + /* don't include delimiting parentheses */ + /* XXX we don't handle <<...>> here */ + /* XXX should we convert octal escapes? */ + /* if so, what encoding should we use? */ + cur++; + len -= 2; + } + else + { + FT_ERROR(( "ps_parser_load_field:" + " expected a name or string\n" )); + FT_ERROR(( " " + " but found token of type %d instead\n", + token.type )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* for this to work (FT_String**)q must have been */ + /* initialized to NULL */ + if ( *(FT_String**)q ) + { + FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", + field->ident )); + FT_FREE( *(FT_String**)q ); + } + + if ( FT_QALLOC( string, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( string, cur, len ); + string[len] = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( token.type == T1_TOKEN_TYPE_STRING ) + FT_TRACE4(( " (%s)", string )); + else + FT_TRACE4(( " /%s", string )); +#endif + + *(FT_String**)q = string; + } + break; + + case T1_FIELD_TYPE_BBOX: + { + FT_Fixed temp[4]; + FT_BBox* bbox = (FT_BBox*)q; + FT_Int result; + + + result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); + + if ( result < 4 ) + { + FT_ERROR(( "ps_parser_load_field:" + " expected four integers in bounding box\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + bbox->xMin = FT_RoundFix( temp[0] ); + bbox->yMin = FT_RoundFix( temp[1] ); + bbox->xMax = FT_RoundFix( temp[2] ); + bbox->yMax = FT_RoundFix( temp[3] ); + + FT_TRACE4(( " [%ld %ld %ld %ld]", + bbox->xMin / 65536, + bbox->yMin / 65536, + bbox->xMax / 65536, + bbox->yMax / 65536 )); + } + break; + + case T1_FIELD_TYPE_MM_BBOX: + { + FT_Memory memory = parser->memory; + FT_Fixed* temp = NULL; + FT_Int result; + FT_UInt i; + + + if ( FT_QNEW_ARRAY( temp, max_objects * 4 ) ) + goto Exit; + + for ( i = 0; i < 4; i++ ) + { + result = ps_tofixedarray( &cur, limit, (FT_Int)max_objects, + temp + i * max_objects, 0 ); + if ( result < 0 || (FT_UInt)result < max_objects ) + { + FT_ERROR(( "ps_parser_load_field:" + " expected %d integer%s in the %s subarray\n", + max_objects, max_objects > 1 ? "s" : "", + i == 0 ? "first" + : ( i == 1 ? "second" + : ( i == 2 ? "third" + : "fourth" ) ) )); + FT_ERROR(( " " + " of /FontBBox in the /Blend dictionary\n" )); + error = FT_THROW( Invalid_File_Format ); + + FT_FREE( temp ); + goto Exit; + } + + skip_spaces( &cur, limit ); + } + + FT_TRACE4(( " [" )); + for ( i = 0; i < max_objects; i++ ) + { + FT_BBox* bbox = (FT_BBox*)objects[i]; + + + bbox->xMin = FT_RoundFix( temp[i ] ); + bbox->yMin = FT_RoundFix( temp[i + max_objects] ); + bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] ); + bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] ); + + FT_TRACE4(( " [%ld %ld %ld %ld]", + bbox->xMin / 65536, + bbox->yMin / 65536, + bbox->xMax / 65536, + bbox->yMax / 65536 )); + } + FT_TRACE4(( "]" )); + + FT_FREE( temp ); + } + break; + + default: + /* an error occurred */ + goto Fail; + } + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + error = FT_Err_Ok; + + Exit: + return error; + + Fail: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + +#define T1_MAX_TABLE_ELEMENTS 32 + + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; + T1_Token token; + FT_Int num_elements; + FT_Error error = FT_Err_Ok; + FT_Byte* old_cursor; + FT_Byte* old_limit; + T1_FieldRec fieldrec = *(T1_Field)field; + + + fieldrec.type = T1_FIELD_TYPE_INTEGER; + if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || + field->type == T1_FIELD_TYPE_BBOX ) + fieldrec.type = T1_FIELD_TYPE_FIXED; + + ps_parser_to_token_array( parser, elements, + T1_MAX_TABLE_ELEMENTS, &num_elements ); + if ( num_elements < 0 ) + { + error = FT_ERR( Ignore ); + goto Exit; + } + if ( (FT_UInt)num_elements > field->array_max ) + num_elements = (FT_Int)field->array_max; + + old_cursor = parser->cursor; + old_limit = parser->limit; + + /* we store the elements count if necessary; */ + /* we further assume that `count_offset' can't be zero */ + if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) + *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = + (FT_Byte)num_elements; + + FT_TRACE4(( " [" )); + + /* we now load each element, adjusting the field.offset on each one */ + token = elements; + for ( ; num_elements > 0; num_elements--, token++ ) + { + parser->cursor = token->start; + parser->limit = token->limit; + + error = ps_parser_load_field( parser, + &fieldrec, + objects, + max_objects, + 0 ); + if ( error ) + break; + + fieldrec.offset += fieldrec.size; + } + + FT_TRACE4(( "]" )); + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + parser->cursor = old_cursor; + parser->limit = old_limit; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Long ) + ps_parser_to_int( PS_Parser parser ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToInt( &parser->cursor, parser->limit ); + } + + + /* first character must be `<' if `delimiters' is non-zero */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_ULong* pnum_bytes, + FT_Bool delimiters ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* cur; + + + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + if ( cur >= parser->limit ) + goto Exit; + + if ( delimiters ) + { + if ( *cur != '<' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + cur++; + } + + *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, + parser->limit, + bytes, + max_bytes ); + + parser->cursor = cur; + + if ( delimiters ) + { + if ( cur < parser->limit && *cur != '>' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + parser->cursor++; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ) + { + ps_parser_skip_spaces( parser ); + return ps_tocoordarray( &parser->cursor, parser->limit, + max_coords, coords ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return ps_tofixedarray( &parser->cursor, parser->limit, + max_values, values, power_ten ); + } + + +#if 0 + + FT_LOCAL_DEF( FT_String* ) + T1_ToString( PS_Parser parser ) + { + return ps_tostring( &parser->cursor, parser->limit, parser->memory ); + } + + + FT_LOCAL_DEF( FT_Bool ) + T1_ToBool( PS_Parser parser ) + { + return ps_tobool( &parser->cursor, parser->limit ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ) + { + parser->error = FT_Err_Ok; + parser->base = base; + parser->limit = limit; + parser->cursor = base; + parser->memory = memory; + parser->funcs = ps_parser_funcs; + } + + + FT_LOCAL_DEF( void ) + ps_parser_done( PS_Parser parser ) + { + FT_UNUSED( parser ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @Function: + * t1_builder_init + * + * @Description: + * Initializes a given glyph builder. + * + * @InOut: + * builder :: + * A pointer to the glyph builder to initialize. + * + * @Input: + * face :: + * The current face object. + * + * size :: + * The current size object. + * + * glyph :: + * The current glyph object. + * + * hinting :: + * Whether hinting should be applied. + */ + FT_LOCAL_DEF( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->parse_state = T1_Parse_Start; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = size->internal->module_data; + builder->hints_funcs = NULL; + + if ( hinting ) + builder->hints_funcs = glyph->internal->glyph_hints; + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = t1_builder_funcs; + } + + + /************************************************************************** + * + * @Function: + * t1_builder_done + * + * @Description: + * Finalizes a given glyph builder. Its contents can still be used + * after the call, but the function saves important information + * within the corresponding glyph slot. + * + * @Input: + * builder :: + * A pointer to the glyph builder to finalize. + */ + FT_LOCAL_DEF( void ) + t1_builder_done( T1_Builder builder ) + { + FT_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = FIXED_TO_INT( x ); + point->y = FIXED_TO_INT( y ); + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = t1_builder_check_points( builder, 1 ); + if ( !error ) + t1_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + /* this might happen in invalid fonts */ + if ( !outline ) + { + FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); + return FT_THROW( Invalid_File_Format ); + } + + if ( !builder->load_points ) + { + outline->n_contours++; + return FT_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = FT_ERR( Invalid_File_Format ); + + + /* test whether we are building a new contour */ + + if ( builder->parse_state == T1_Parse_Have_Path ) + error = FT_Err_Ok; + else + { + builder->parse_state = T1_Parse_Have_Path; + error = t1_builder_add_contour( builder ); + if ( !error ) + error = t1_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + t1_builder_close_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* in malformed fonts it can happen that a contour was started */ + /* but no points were added */ + if ( outline->n_contours && first == outline->n_points ) + { + outline->n_contours--; + return; + } + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether the first and the last point is the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @Function: + * cff_builder_init + * + * @Description: + * Initializes a given glyph builder. + * + * @InOut: + * builder :: + * A pointer to the glyph builder to initialize. + * + * @Input: + * face :: + * The current face object. + * + * size :: + * The current size object. + * + * glyph :: + * The current glyph object. + * + * hinting :: + * Whether hinting is active. + */ + FT_LOCAL_DEF( void ) + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->path_begun = 0; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->root.memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->root.internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = NULL; + builder->hints_funcs = NULL; + + if ( hinting && size ) + { + FT_Size ftsize = FT_SIZE( size ); + CFF_Internal internal = (CFF_Internal)ftsize->internal->module_data; + + if ( internal ) + { + builder->hints_globals = (void *)internal->topfont; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } + } + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = cff_builder_funcs; + } + + + /************************************************************************** + * + * @Function: + * cff_builder_done + * + * @Description: + * Finalizes a given glyph builder. Its contents can still be used + * after the call, but the function saves important information + * within the corresponding glyph slot. + * + * @Input: + * builder :: + * A pointer to the glyph builder to finalize. + */ + FT_LOCAL_DEF( void ) + cff_builder_done( CFF_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + cff_check_points( CFF_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); + + + if ( driver->hinting_engine == FT_HINTING_FREETYPE ) + { + point->x = x >> 16; + point->y = y >> 16; + } + else +#endif + { + /* cf2_decoder_parse_charstrings uses 16.16 coordinates */ + point->x = x >> 10; + point->y = y >> 10; + } + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = cff_check_points( builder, 1 ); + if ( !error ) + cff_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + cff_builder_add_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return FT_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = FT_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = cff_builder_add_contour( builder ); + if ( !error ) + error = cff_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + cff_builder_close_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* in malformed fonts it can happen that a contour was started */ + /* but no points were added */ + if ( outline->n_contours && first == outline->n_points ) + { + outline->n_contours--; + return; + } + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and if it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether begin point and last point are the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @Function: + * ps_builder_init + * + * @Description: + * Initializes a given glyph builder. + * + * @InOut: + * builder :: + * A pointer to the glyph builder to initialize. + * + * @Input: + * face :: + * The current face object. + * + * size :: + * The current size object. + * + * glyph :: + * The current glyph object. + * + * hinting :: + * Whether hinting should be applied. + */ + FT_LOCAL_DEF( void ) + ps_builder_init( PS_Builder* ps_builder, + void* builder, + FT_Bool is_t1 ) + { + FT_ZERO( ps_builder ); + + if ( is_t1 ) + { + T1_Builder t1builder = (T1_Builder)builder; + + + ps_builder->memory = t1builder->memory; + ps_builder->face = (FT_Face)t1builder->face; + ps_builder->glyph = (CFF_GlyphSlot)t1builder->glyph; + ps_builder->loader = t1builder->loader; + ps_builder->base = t1builder->base; + ps_builder->current = t1builder->current; + + ps_builder->pos_x = &t1builder->pos_x; + ps_builder->pos_y = &t1builder->pos_y; + + ps_builder->left_bearing = &t1builder->left_bearing; + ps_builder->advance = &t1builder->advance; + + ps_builder->bbox = &t1builder->bbox; + ps_builder->path_begun = 0; + ps_builder->load_points = t1builder->load_points; + ps_builder->no_recurse = t1builder->no_recurse; + + ps_builder->metrics_only = t1builder->metrics_only; + } + else + { + CFF_Builder* cffbuilder = (CFF_Builder*)builder; + + + ps_builder->memory = cffbuilder->memory; + ps_builder->face = (FT_Face)cffbuilder->face; + ps_builder->glyph = cffbuilder->glyph; + ps_builder->loader = cffbuilder->loader; + ps_builder->base = cffbuilder->base; + ps_builder->current = cffbuilder->current; + + ps_builder->pos_x = &cffbuilder->pos_x; + ps_builder->pos_y = &cffbuilder->pos_y; + + ps_builder->left_bearing = &cffbuilder->left_bearing; + ps_builder->advance = &cffbuilder->advance; + + ps_builder->bbox = &cffbuilder->bbox; + ps_builder->path_begun = cffbuilder->path_begun; + ps_builder->load_points = cffbuilder->load_points; + ps_builder->no_recurse = cffbuilder->no_recurse; + + ps_builder->metrics_only = cffbuilder->metrics_only; + } + + ps_builder->is_t1 = is_t1; + ps_builder->funcs = ps_builder_funcs; + } + + + /************************************************************************** + * + * @Function: + * ps_builder_done + * + * @Description: + * Finalizes a given glyph builder. Its contents can still be used + * after the call, but the function saves important information + * within the corresponding glyph slot. + * + * @Input: + * builder :: + * A pointer to the glyph builder to finalize. + */ + FT_LOCAL_DEF( void ) + ps_builder_done( PS_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_check_points( PS_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + ps_builder_add_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); + + + if ( !builder->is_t1 && + driver->hinting_engine == FT_HINTING_FREETYPE ) + { + point->x = x >> 16; + point->y = y >> 16; + } + else +#endif +#ifdef T1_CONFIG_OPTION_OLD_ENGINE +#ifndef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); +#endif + if ( builder->is_t1 && + driver->hinting_engine == FT_HINTING_FREETYPE ) + { + point->x = FIXED_TO_INT( x ); + point->y = FIXED_TO_INT( y ); + } + else +#endif + { + /* cf2_decoder_parse_charstrings uses 16.16 coordinates */ + point->x = x >> 10; + point->y = y >> 10; + } + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_add_point1( PS_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = ps_builder_check_points( builder, 1 ); + if ( !error ) + ps_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_add_contour( PS_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + /* this might happen in invalid fonts */ + if ( !outline ) + { + FT_ERROR(( "ps_builder_add_contour: no outline to add points to\n" )); + return FT_THROW( Invalid_File_Format ); + } + + if ( !builder->load_points ) + { + outline->n_contours++; + return FT_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_start_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = FT_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = ps_builder_add_contour( builder ); + if ( !error ) + error = ps_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + ps_builder_close_contour( PS_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* in malformed fonts it can happen that a contour was started */ + /* but no points were added */ + if ( outline->n_contours && first == outline->n_points ) + { + outline->n_contours--; + return; + } + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether the first and the last point is the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @Function: + * ps_decoder_init + * + * @Description: + * Creates a wrapper decoder for use in the combined + * Type 1 / CFF interpreter. + * + * @InOut: + * ps_decoder :: + * A pointer to the decoder to initialize. + * + * @Input: + * decoder :: + * A pointer to the original decoder. + * + * is_t1 :: + * Flag indicating Type 1 or CFF + */ + FT_LOCAL_DEF( void ) + ps_decoder_init( PS_Decoder* ps_decoder, + void* decoder, + FT_Bool is_t1 ) + { + FT_ZERO( ps_decoder ); + + if ( is_t1 ) + { + T1_Decoder t1_decoder = (T1_Decoder)decoder; + + + ps_builder_init( &ps_decoder->builder, + &t1_decoder->builder, + is_t1 ); + + ps_decoder->cf2_instance = &t1_decoder->cf2_instance; + ps_decoder->psnames = t1_decoder->psnames; + + ps_decoder->num_glyphs = t1_decoder->num_glyphs; + ps_decoder->glyph_names = t1_decoder->glyph_names; + ps_decoder->hint_mode = t1_decoder->hint_mode; + ps_decoder->blend = t1_decoder->blend; + + ps_decoder->num_locals = (FT_UInt)t1_decoder->num_subrs; + ps_decoder->locals = t1_decoder->subrs; + ps_decoder->locals_len = t1_decoder->subrs_len; + ps_decoder->locals_hash = t1_decoder->subrs_hash; + + ps_decoder->buildchar = t1_decoder->buildchar; + ps_decoder->len_buildchar = t1_decoder->len_buildchar; + + ps_decoder->lenIV = t1_decoder->lenIV; + } + else + { + CFF_Decoder* cff_decoder = (CFF_Decoder*)decoder; + + + ps_builder_init( &ps_decoder->builder, + &cff_decoder->builder, + is_t1 ); + + ps_decoder->cff = cff_decoder->cff; + ps_decoder->cf2_instance = &cff_decoder->cff->cf2_instance; + ps_decoder->current_subfont = cff_decoder->current_subfont; + + ps_decoder->num_globals = cff_decoder->num_globals; + ps_decoder->globals = cff_decoder->globals; + ps_decoder->globals_bias = cff_decoder->globals_bias; + ps_decoder->num_locals = cff_decoder->num_locals; + ps_decoder->locals = cff_decoder->locals; + ps_decoder->locals_bias = cff_decoder->locals_bias; + + ps_decoder->glyph_width = &cff_decoder->glyph_width; + ps_decoder->width_only = cff_decoder->width_only; + + ps_decoder->hint_mode = cff_decoder->hint_mode; + + ps_decoder->get_glyph_callback = cff_decoder->get_glyph_callback; + ps_decoder->free_glyph_callback = cff_decoder->free_glyph_callback; + } + } + + + /* Synthesize a SubFont object for Type 1 fonts, for use in the */ + /* new interpreter to access Private dict data. */ + FT_LOCAL_DEF( void ) + t1_make_subfont( FT_Face face, + PS_Private priv, + CFF_SubFont subfont ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_ZERO( subfont ); + FT_ZERO( cpriv ); + + count = cpriv->num_blue_values = priv->num_blue_values; + for ( n = 0; n < count; n++ ) + cpriv->blue_values[n] = (FT_Pos)priv->blue_values[n]; + + count = cpriv->num_other_blues = priv->num_other_blues; + for ( n = 0; n < count; n++ ) + cpriv->other_blues[n] = (FT_Pos)priv->other_blues[n]; + + count = cpriv->num_family_blues = priv->num_family_blues; + for ( n = 0; n < count; n++ ) + cpriv->family_blues[n] = (FT_Pos)priv->family_blues[n]; + + count = cpriv->num_family_other_blues = priv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + cpriv->family_other_blues[n] = (FT_Pos)priv->family_other_blues[n]; + + cpriv->blue_scale = priv->blue_scale; + cpriv->blue_shift = (FT_Pos)priv->blue_shift; + cpriv->blue_fuzz = (FT_Pos)priv->blue_fuzz; + + cpriv->standard_width = (FT_Pos)priv->standard_width[0]; + cpriv->standard_height = (FT_Pos)priv->standard_height[0]; + + count = cpriv->num_snap_widths = priv->num_snap_widths; + for ( n = 0; n < count; n++ ) + cpriv->snap_widths[n] = (FT_Pos)priv->snap_widths[n]; + + count = cpriv->num_snap_heights = priv->num_snap_heights; + for ( n = 0; n < count; n++ ) + cpriv->snap_heights[n] = (FT_Pos)priv->snap_heights[n]; + + cpriv->force_bold = priv->force_bold; + cpriv->lenIV = priv->lenIV; + cpriv->language_group = priv->language_group; + cpriv->expansion_factor = priv->expansion_factor; + + cpriv->subfont = subfont; + + + /* Initialize the random number generator. */ + if ( face->internal->random_seed != -1 ) + { + /* If we have a face-specific seed, use it. */ + /* If non-zero, update it to a positive value. */ + subfont->random = (FT_UInt32)face->internal->random_seed; + if ( face->internal->random_seed ) + { + do + { + face->internal->random_seed = (FT_Int32)cff_random( + (FT_UInt32)face->internal->random_seed ); + + } while ( face->internal->random_seed < 0 ); + } + } + if ( !subfont->random ) + { + FT_UInt32 seed; + + + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&face ^ + (FT_Offset)(char*)&subfont ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + if ( seed == 0 ) + seed = 0x7384; + + subfont->random = seed; + } + } + + + FT_LOCAL_DEF( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ) + { + PS_Conv_EexecDecode( &buffer, + FT_OFFSET( buffer, length ), + buffer, + length, + &seed ); + } + + + FT_LOCAL_DEF( FT_UInt32 ) + cff_random( FT_UInt32 r ) + { + /* a 32bit version of the `xorshift' algorithm */ + r ^= r << 13; + r ^= r >> 17; + r ^= r << 5; + + return r; + } + + +/* END */ diff --git a/external/freetype/src/psaux/psobjs.h b/external/freetype/src/psaux/psobjs.h new file mode 100644 index 000000000..d5bce5410 --- /dev/null +++ b/external/freetype/src/psaux/psobjs.h @@ -0,0 +1,312 @@ +/**************************************************************************** + * + * psobjs.h + * + * Auxiliary functions for PostScript fonts (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSOBJS_H_ +#define PSOBJS_H_ + + +#include <freetype/internal/psaux.h> +#include <freetype/internal/cffotypes.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE + const PS_Table_FuncsRec ps_table_funcs; + + FT_CALLBACK_TABLE + const PS_Parser_FuncsRec ps_parser_funcs; + + FT_CALLBACK_TABLE + const T1_Builder_FuncsRec t1_builder_funcs; + + + FT_LOCAL( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ); + + FT_LOCAL( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + const void* object, + FT_UInt length ); + + FT_LOCAL( void ) + ps_table_done( PS_Table table ); + + + FT_LOCAL( void ) + ps_table_release( PS_Table table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL( void ) + ps_parser_skip_spaces( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_skip_PS_token( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ); + + FT_LOCAL( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Long ) + ps_parser_to_int( PS_Parser parser ); + + + FT_LOCAL( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_ULong* pnum_bytes, + FT_Bool delimiters ); + + + FT_LOCAL( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ); + + + FT_LOCAL( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL( void ) + ps_parser_done( PS_Parser parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + t1_builder_done( T1_Builder builder ); + + FT_LOCAL( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ); + + FT_LOCAL( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + t1_builder_add_contour( T1_Builder builder ); + + + FT_LOCAL( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + + FT_LOCAL( void ) + t1_builder_close_contour( T1_Builder builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + cff_builder_done( CFF_Builder* builder ); + + FT_LOCAL( FT_Error ) + cff_check_points( CFF_Builder* builder, + FT_Int count ); + + FT_LOCAL( void ) + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + FT_LOCAL( FT_Error ) + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + FT_LOCAL( FT_Error ) + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + FT_LOCAL( void ) + cff_builder_close_contour( CFF_Builder* builder ); + + FT_LOCAL( FT_Error ) + cff_builder_add_contour( CFF_Builder* builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + ps_builder_init( PS_Builder* ps_builder, + void* builder, + FT_Bool is_t1 ); + + + FT_LOCAL( void ) + ps_builder_done( PS_Builder* builder ); + + FT_LOCAL( FT_Error ) + ps_builder_check_points( PS_Builder* builder, + FT_Int count ); + + FT_LOCAL( void ) + ps_builder_add_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + ps_builder_add_point1( PS_Builder* builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + ps_builder_add_contour( PS_Builder* builder ); + + FT_LOCAL( FT_Error ) + ps_builder_start_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( void ) + ps_builder_close_contour( PS_Builder* builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + ps_decoder_init( PS_Decoder* ps_decoder, + void* decoder, + FT_Bool is_t1 ); + + FT_LOCAL( void ) + t1_make_subfont( FT_Face face, + PS_Private priv, + CFF_SubFont subfont ); + + FT_LOCAL( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + + FT_LOCAL( FT_UInt32 ) + cff_random( FT_UInt32 r ); + + +FT_END_HEADER + +#endif /* PSOBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psread.c b/external/freetype/src/psaux/psread.c new file mode 100644 index 000000000..7f657f2cd --- /dev/null +++ b/external/freetype/src/psaux/psread.c @@ -0,0 +1,112 @@ +/**************************************************************************** + * + * psread.c + * + * Adobe's code for stream handling (body). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> + +#include "psglue.h" + +#include "pserror.h" + + + /* Define CF2_IO_FAIL as 1 to enable random errors and random */ + /* value errors in I/O. */ +#define CF2_IO_FAIL 0 + + +#if CF2_IO_FAIL + + /* set the .00 value to a nonzero probability */ + static int + randomError2( void ) + { + /* for region buffer ReadByte (interp) function */ + return (double)rand() / RAND_MAX < .00; + } + + /* set the .00 value to a nonzero probability */ + static CF2_Int + randomValue() + { + return (double)rand() / RAND_MAX < .00 ? rand() : 0; + } + +#endif /* CF2_IO_FAIL */ + + + /* Region Buffer */ + /* */ + /* Can be constructed from a copied buffer managed by */ + /* `FCM_getDatablock'. */ + /* Reads bytes with check for end of buffer. */ + + /* reading past the end of the buffer sets error and returns zero */ + FT_LOCAL_DEF( CF2_Int ) + cf2_buf_readByte( CF2_Buffer buf ) + { + if ( buf->ptr < buf->end ) + { +#if CF2_IO_FAIL + if ( randomError2() ) + { + CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); + return 0; + } + + return *(buf->ptr)++ + randomValue(); +#else + return *(buf->ptr)++; +#endif + } + else + { + CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); + return 0; + } + } + + + /* note: end condition can occur without error */ + FT_LOCAL_DEF( FT_Bool ) + cf2_buf_isEnd( CF2_Buffer buf ) + { + return FT_BOOL( buf->ptr >= buf->end ); + } + + +/* END */ diff --git a/external/freetype/src/psaux/psread.h b/external/freetype/src/psaux/psread.h new file mode 100644 index 000000000..9e55fe044 --- /dev/null +++ b/external/freetype/src/psaux/psread.h @@ -0,0 +1,68 @@ +/**************************************************************************** + * + * psread.h + * + * Adobe's code for stream handling (specification). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSREAD_H_ +#define PSREAD_H_ + + +FT_BEGIN_HEADER + + + typedef struct CF2_BufferRec_ + { + FT_Error* error; + const FT_Byte* start; + const FT_Byte* end; + const FT_Byte* ptr; + + } CF2_BufferRec, *CF2_Buffer; + + + FT_LOCAL( CF2_Int ) + cf2_buf_readByte( CF2_Buffer buf ); + FT_LOCAL( FT_Bool ) + cf2_buf_isEnd( CF2_Buffer buf ); + + +FT_END_HEADER + + +#endif /* PSREAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/psstack.c b/external/freetype/src/psaux/psstack.c new file mode 100644 index 000000000..797486588 --- /dev/null +++ b/external/freetype/src/psaux/psstack.c @@ -0,0 +1,329 @@ +/**************************************************************************** + * + * psstack.c + * + * Adobe's code for emulating a CFF stack (body). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#include "psft.h" +#include <freetype/internal/ftdebug.h> + +#include "psglue.h" +#include "psfont.h" +#include "psstack.h" + +#include "pserror.h" + + + /* Allocate and initialize an instance of CF2_Stack. */ + /* Note: This function returns NULL on error (does not set */ + /* `error'). */ + FT_LOCAL_DEF( CF2_Stack ) + cf2_stack_init( FT_Memory memory, + FT_Error* e, + FT_UInt stackSize ) + { + FT_Error error; /* for FT_QNEW */ + CF2_Stack stack = NULL; + + + if ( FT_QNEW( stack ) ) + return NULL; + + stack->memory = memory; + stack->error = e; + + /* allocate the stack buffer */ + if ( FT_QNEW_ARRAY( stack->buffer, stackSize ) ) + { + FT_FREE( stack ); + return NULL; + } + + stack->stackSize = stackSize; + stack->top = stack->buffer; /* empty stack */ + + return stack; + } + + + FT_LOCAL_DEF( void ) + cf2_stack_free( CF2_Stack stack ) + { + if ( stack ) + { + FT_Memory memory = stack->memory; + + /* free the buffer */ + FT_FREE( stack->buffer ); + + /* free the main structure */ + FT_FREE( stack ); + } + } + + + FT_LOCAL_DEF( CF2_UInt ) + cf2_stack_count( CF2_Stack stack ) + { + return (CF2_UInt)( stack->top - stack->buffer ); + } + + + FT_LOCAL_DEF( void ) + cf2_stack_pushInt( CF2_Stack stack, + CF2_Int val ) + { + if ( stack->top == stack->buffer + stack->stackSize ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; /* stack overflow */ + } + + stack->top->u.i = val; + stack->top->type = CF2_NumberInt; + stack->top++; + } + + + FT_LOCAL_DEF( void ) + cf2_stack_pushFixed( CF2_Stack stack, + CF2_Fixed val ) + { + if ( stack->top == stack->buffer + stack->stackSize ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; /* stack overflow */ + } + + stack->top->u.r = val; + stack->top->type = CF2_NumberFixed; + stack->top++; + } + + + /* this function is only allowed to pop an integer type */ + FT_LOCAL_DEF( CF2_Int ) + cf2_stack_popInt( CF2_Stack stack ) + { + if ( stack->top == stack->buffer ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return 0; /* underflow */ + } + if ( stack->top[-1].type != CF2_NumberInt ) + { + CF2_SET_ERROR( stack->error, Syntax_Error ); + return 0; /* type mismatch */ + } + + stack->top--; + + return stack->top->u.i; + } + + + /* Note: type mismatch is silently cast */ + /* TODO: check this */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_stack_popFixed( CF2_Stack stack ) + { + if ( stack->top == stack->buffer ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return cf2_intToFixed( 0 ); /* underflow */ + } + + stack->top--; + + switch ( stack->top->type ) + { + case CF2_NumberInt: + return cf2_intToFixed( stack->top->u.i ); + case CF2_NumberFrac: + return cf2_fracToFixed( stack->top->u.f ); + default: + return stack->top->u.r; + } + } + + + /* Note: type mismatch is silently cast */ + /* TODO: check this */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_stack_getReal( CF2_Stack stack, + CF2_UInt idx ) + { + FT_ASSERT( cf2_stack_count( stack ) <= stack->stackSize ); + + if ( idx >= cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return cf2_intToFixed( 0 ); /* bounds error */ + } + + switch ( stack->buffer[idx].type ) + { + case CF2_NumberInt: + return cf2_intToFixed( stack->buffer[idx].u.i ); + case CF2_NumberFrac: + return cf2_fracToFixed( stack->buffer[idx].u.f ); + default: + return stack->buffer[idx].u.r; + } + } + + + /* provide random access to stack */ + FT_LOCAL_DEF( void ) + cf2_stack_setReal( CF2_Stack stack, + CF2_UInt idx, + CF2_Fixed val ) + { + if ( idx > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; + } + + stack->buffer[idx].u.r = val; + stack->buffer[idx].type = CF2_NumberFixed; + } + + + /* discard (pop) num values from stack */ + FT_LOCAL_DEF( void ) + cf2_stack_pop( CF2_Stack stack, + CF2_UInt num ) + { + if ( num > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return; + } + stack->top -= num; + } + + + FT_LOCAL_DEF( void ) + cf2_stack_roll( CF2_Stack stack, + CF2_Int count, + CF2_Int shift ) + { + /* we initialize this variable to avoid compiler warnings */ + CF2_StackNumber last = { { 0 }, CF2_NumberInt }; + + CF2_Int start_idx, idx, i; + + + if ( count < 2 ) + return; /* nothing to do (values 0 and 1), or undefined value */ + + if ( (CF2_UInt)count > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; + } + + /* before C99 it is implementation-defined whether */ + /* the result of `%' is negative if the first operand */ + /* is negative */ + if ( shift < 0 ) + shift = -( ( -shift ) % count ); + else + shift %= count; + + if ( shift == 0 ) + return; /* nothing to do */ + + /* We use the following algorithm to do the rolling, */ + /* which needs two temporary variables only. */ + /* */ + /* Example: */ + /* */ + /* count = 8 */ + /* shift = 2 */ + /* */ + /* stack indices before roll: 7 6 5 4 3 2 1 0 */ + /* stack indices after roll: 1 0 7 6 5 4 3 2 */ + /* */ + /* The value of index 0 gets moved to index 2, while */ + /* the old value of index 2 gets moved to index 4, */ + /* and so on. We thus have the following copying */ + /* chains for shift value 2. */ + /* */ + /* 0 -> 2 -> 4 -> 6 -> 0 */ + /* 1 -> 3 -> 5 -> 7 -> 1 */ + /* */ + /* If `count' and `shift' are incommensurable, we */ + /* have a single chain only. Otherwise, increase */ + /* the start index by 1 after the first chain, then */ + /* do the next chain until all elements in all */ + /* chains are handled. */ + + start_idx = -1; + idx = -1; + for ( i = 0; i < count; i++ ) + { + CF2_StackNumber tmp; + + + if ( start_idx == idx ) + { + start_idx++; + idx = start_idx; + last = stack->buffer[idx]; + } + + idx += shift; + if ( idx >= count ) + idx -= count; + else if ( idx < 0 ) + idx += count; + + tmp = stack->buffer[idx]; + stack->buffer[idx] = last; + last = tmp; + } + } + + + FT_LOCAL_DEF( void ) + cf2_stack_clear( CF2_Stack stack ) + { + stack->top = stack->buffer; + } + + +/* END */ diff --git a/external/freetype/src/psaux/psstack.h b/external/freetype/src/psaux/psstack.h new file mode 100644 index 000000000..907b42400 --- /dev/null +++ b/external/freetype/src/psaux/psstack.h @@ -0,0 +1,122 @@ +/**************************************************************************** + * + * psstack.h + * + * Adobe's code for emulating a CFF stack (specification). + * + * Copyright 2007-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSSTACK_H_ +#define PSSTACK_H_ + +#include <freetype/internal/compiler-macros.h> + +FT_BEGIN_HEADER + + + /* CFF operand stack; specified maximum of 48 or 192 values */ + typedef struct CF2_StackNumber_ + { + union + { + CF2_Fixed r; /* 16.16 fixed-point */ + CF2_Frac f; /* 2.30 fixed-point (for font matrix) */ + CF2_Int i; + } u; + + CF2_NumberType type; + + } CF2_StackNumber; + + + typedef struct CF2_StackRec_ + { + FT_Memory memory; + FT_Error* error; + CF2_StackNumber* buffer; + CF2_StackNumber* top; + FT_UInt stackSize; + + } CF2_StackRec, *CF2_Stack; + + + FT_LOCAL( CF2_Stack ) + cf2_stack_init( FT_Memory memory, + FT_Error* error, + FT_UInt stackSize ); + FT_LOCAL( void ) + cf2_stack_free( CF2_Stack stack ); + + FT_LOCAL( CF2_UInt ) + cf2_stack_count( CF2_Stack stack ); + + FT_LOCAL( void ) + cf2_stack_pushInt( CF2_Stack stack, + CF2_Int val ); + FT_LOCAL( void ) + cf2_stack_pushFixed( CF2_Stack stack, + CF2_Fixed val ); + + FT_LOCAL( CF2_Int ) + cf2_stack_popInt( CF2_Stack stack ); + FT_LOCAL( CF2_Fixed ) + cf2_stack_popFixed( CF2_Stack stack ); + + FT_LOCAL( CF2_Fixed ) + cf2_stack_getReal( CF2_Stack stack, + CF2_UInt idx ); + FT_LOCAL( void ) + cf2_stack_setReal( CF2_Stack stack, + CF2_UInt idx, + CF2_Fixed val ); + + FT_LOCAL( void ) + cf2_stack_pop( CF2_Stack stack, + CF2_UInt num ); + + FT_LOCAL( void ) + cf2_stack_roll( CF2_Stack stack, + CF2_Int count, + CF2_Int idx ); + + FT_LOCAL( void ) + cf2_stack_clear( CF2_Stack stack ); + + +FT_END_HEADER + + +#endif /* PSSTACK_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/pstypes.h b/external/freetype/src/psaux/pstypes.h new file mode 100644 index 000000000..435ef7e1f --- /dev/null +++ b/external/freetype/src/psaux/pstypes.h @@ -0,0 +1,77 @@ +/**************************************************************************** + * + * pstypes.h + * + * Adobe's code for defining data types (specification only). + * + * Copyright 2011-2013 Adobe Systems Incorporated. + * + * This software, and all works of authorship, whether in source or + * object code form as indicated by the copyright notice(s) included + * herein (collectively, the "Work") is made available, and may only be + * used, modified, and distributed under the FreeType Project License, + * LICENSE.TXT. Additionally, subject to the terms and conditions of the + * FreeType Project License, each contributor to the Work hereby grants + * to any individual or legal entity exercising permissions granted by + * the FreeType Project License and this section (hereafter, "You" or + * "Your") a perpetual, worldwide, non-exclusive, no-charge, + * royalty-free, irrevocable (except as stated in this section) patent + * license to make, have made, use, offer to sell, sell, import, and + * otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such contributor that are necessarily + * infringed by their contribution(s) alone or by combination of their + * contribution(s) with the Work to which such contribution(s) was + * submitted. If You institute patent litigation against any entity + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * the Work or a contribution incorporated within the Work constitutes + * direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of + * the date such litigation is filed. + * + * By using, modifying, or distributing the Work you indicate that you + * have read and understood the terms and conditions of the + * FreeType Project License as well as those provided in this section, + * and you accept them fully. + * + */ + + +#ifndef PSTYPES_H_ +#define PSTYPES_H_ + +#include <freetype/freetype.h> + + +FT_BEGIN_HEADER + + + /* + * The data models that we expect to support are as follows: + * + * name char short int long long-long pointer example + * ----------------------------------------------------- + * ILP32 8 16 32 32 64* 32 32-bit MacOS, x86 + * LLP64 8 16 32 32 64 64 x64 + * LP64 8 16 32 64 64 64 64-bit MacOS + * + * *) type may be supported by emulation on a 32-bit architecture + * + */ + + + /* integers at least 32 bits wide */ +#define CF2_UInt FT_UFast +#define CF2_Int FT_Fast + + + /* fixed-float numbers */ + typedef FT_Int32 CF2_F16Dot16; + + +FT_END_HEADER + + +#endif /* PSTYPES_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/rules.mk b/external/freetype/src/psaux/rules.mk new file mode 100644 index 000000000..d542ab8ee --- /dev/null +++ b/external/freetype/src/psaux/rules.mk @@ -0,0 +1,89 @@ +# +# FreeType 2 PSaux driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSAUX driver directory +# +PSAUX_DIR := $(SRC_DIR)/psaux + + +# compilation flags for the driver +# +PSAUX_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# PSAUX driver sources (i.e., C files) +# +PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c \ + $(PSAUX_DIR)/t1decode.c \ + $(PSAUX_DIR)/t1cmap.c \ + $(PSAUX_DIR)/afmparse.c \ + $(PSAUX_DIR)/psconv.c \ + $(PSAUX_DIR)/psauxmod.c \ + $(PSAUX_DIR)/psarrst.c \ + $(PSAUX_DIR)/psblues.c \ + $(PSAUX_DIR)/pserror.c \ + $(PSAUX_DIR)/psfont.c \ + $(PSAUX_DIR)/psft.c \ + $(PSAUX_DIR)/pshints.c \ + $(PSAUX_DIR)/psintrp.c \ + $(PSAUX_DIR)/psread.c \ + $(PSAUX_DIR)/psstack.c \ + $(PSAUX_DIR)/cffdecode.c + +# PSAUX driver headers +# +PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h) \ + $(PSAUX_DIR)/psauxerr.h \ + $(PSAUX_DIR)/psfixed.h \ + $(PSAUX_DIR)/psglue.h \ + $(PSAUX_DIR)/pstypes.h + + +# PSAUX driver object(s) +# +# PSAUX_DRV_OBJ_M is used during `multi' builds. +# PSAUX_DRV_OBJ_S is used during `single' builds. +# +PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O + +# PSAUX driver source file for single build +# +PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c + + +# PSAUX driver - single object +# +$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \ + $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S)) + + +# PSAUX driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSAUX_DRV_OBJ_S) +DRV_OBJS_M += $(PSAUX_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/psaux/t1cmap.c b/external/freetype/src/psaux/t1cmap.c new file mode 100644 index 000000000..c4bcf599e --- /dev/null +++ b/external/freetype/src/psaux/t1cmap.c @@ -0,0 +1,393 @@ +/**************************************************************************** + * + * t1cmap.c + * + * Type 1 character map support (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "t1cmap.h" + +#include <freetype/internal/ftdebug.h> + +#include "psauxerr.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_cmap_std_init( T1_CMapStd cmap, + FT_Int is_expert ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + cmap->num_glyphs = (FT_UInt)face->type1.num_glyphs; + cmap->glyph_names = (const char* const*)face->type1.glyph_names; + cmap->sid_to_string = psnames->adobe_std_strings; + cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding + : psnames->adobe_std_encoding; + + FT_ASSERT( cmap->code_to_sid ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_std_done( FT_CMap cmap_ ) /* T1_CMapStd */ + { + T1_CMapStd cmap = (T1_CMapStd)cmap_; + + + cmap->num_glyphs = 0; + cmap->glyph_names = NULL; + cmap->sid_to_string = NULL; + cmap->code_to_sid = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_index( FT_CMap cmap, /* T1_CMapStd */ + FT_UInt32 char_code ) + { + T1_CMapStd t1cmap = (T1_CMapStd)cmap; + FT_UInt result = 0; + + + if ( char_code < 256 ) + { + FT_UInt code, n; + const char* glyph_name; + + + /* convert character code to Adobe SID string */ + code = t1cmap->code_to_sid[char_code]; + glyph_name = t1cmap->sid_to_string( code ); + + /* look for the corresponding glyph name */ + for ( n = 0; n < t1cmap->num_glyphs; n++ ) + { + const char* gname = t1cmap->glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + ft_strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_next( FT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + while ( char_code < 256 ) + { + result = t1_cmap_std_char_index( cmap, char_code ); + if ( result != 0 ) + goto Exit; + + char_code++; + } + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_standard_init( FT_CMap cmap, /* T1_CMapStd */ + FT_Pointer pointer ) + { + T1_CMapStd t1cmap = (T1_CMapStd)cmap; + FT_UNUSED( pointer ); + + + t1_cmap_std_init( t1cmap, 0 ); + return 0; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_standard_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_standard_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_std_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_expert_init( FT_CMap cmap, /* T1_CMapStd */ + FT_Pointer pointer ) + { + T1_CMapStd t1cmap = (T1_CMapStd)cmap; + FT_UNUSED( pointer ); + + + t1_cmap_std_init( t1cmap, 1 ); + return 0; + } + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_expert_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_expert_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_std_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_custom_init( FT_CMap cmap, /* T1_CMapCustom */ + FT_Pointer pointer ) + { + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + T1_Encoding encoding = &face->type1.encoding; + + FT_UNUSED( pointer ); + + + t1cmap->first = (FT_UInt)encoding->code_first; + t1cmap->count = (FT_UInt)encoding->code_last - t1cmap->first; + t1cmap->indices = encoding->char_index; + + FT_ASSERT( t1cmap->indices ); + FT_ASSERT( encoding->code_first <= encoding->code_last ); + + return 0; + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_custom_done( FT_CMap cmap ) /* T1_CMapCustom */ + { + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + + + t1cmap->indices = NULL; + t1cmap->first = 0; + t1cmap->count = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_index( FT_CMap cmap, /* T1_CMapCustom */ + FT_UInt32 char_code ) + { + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + FT_UInt result = 0; + + + if ( char_code >= t1cmap->first && + char_code < ( t1cmap->first + t1cmap->count ) ) + result = t1cmap->indices[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_next( FT_CMap cmap, /* T1_CMapCustom */ + FT_UInt32 *pchar_code ) + { + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + char_code++; + + if ( char_code < t1cmap->first ) + char_code = t1cmap->first; + + for ( ; char_code < ( t1cmap->first + t1cmap->count ); char_code++ ) + { + result = t1cmap->indices[char_code]; + if ( result != 0 ) + goto Exit; + } + + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_custom_class_rec = + { + sizeof ( T1_CMapCustomRec ), + + (FT_CMap_InitFunc) t1_cmap_custom_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_custom_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char * ) + psaux_get_glyph_name( void* face_, + FT_UInt idx ) + { + T1_Face face = (T1_Face)face_; + + + return face->type1.glyph_names[idx]; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ + FT_Pointer pointer ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + FT_UNUSED( pointer ); + + + if ( !psnames->unicodes_init ) + return FT_THROW( Unimplemented_Feature ); + + return psnames->unicodes_init( memory, + unicodes, + (FT_UInt)face->type1.num_glyphs, + &psaux_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 char_code ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 *pchar_code ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_unicode_class_rec = + { + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) t1_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + +/* END */ diff --git a/external/freetype/src/psaux/t1cmap.h b/external/freetype/src/psaux/t1cmap.h new file mode 100644 index 000000000..b3702498a --- /dev/null +++ b/external/freetype/src/psaux/t1cmap.h @@ -0,0 +1,104 @@ +/**************************************************************************** + * + * t1cmap.h + * + * Type 1 character map support (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1CMAP_H_ +#define T1CMAP_H_ + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/t1types.h> + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct T1_CMapStdRec_* T1_CMapStd; + + typedef struct T1_CMapStdRec_ + { + FT_CMapRec cmap; + + const FT_UShort* code_to_sid; + PS_Adobe_Std_StringsFunc sid_to_string; + + FT_UInt num_glyphs; + const char* const* glyph_names; + + } T1_CMapStdRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_standard_class_rec; + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_expert_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_CMapCustomRec_* T1_CMapCustom; + + typedef struct T1_CMapCustomRec_ + { + FT_CMapRec cmap; + FT_UInt first; + FT_UInt count; + FT_UShort* indices; + + } T1_CMapCustomRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_custom_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_unicode_class_rec; + + /* */ + + +FT_END_HEADER + +#endif /* T1CMAP_H_ */ + + +/* END */ diff --git a/external/freetype/src/psaux/t1decode.c b/external/freetype/src/psaux/t1decode.c new file mode 100644 index 000000000..4b6b969bc --- /dev/null +++ b/external/freetype/src/psaux/t1decode.c @@ -0,0 +1,2159 @@ +/**************************************************************************** + * + * t1decode.c + * + * PostScript Type 1 decoding routines (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/pshints.h> +#include <freetype/internal/fthash.h> +#include <freetype/ftoutln.h> + +#include "t1decode.h" +#include "psobjs.h" + +#include "psauxerr.h" + + +/* ensure proper sign extension */ +#define Fix2Int( f ) ( (FT_Int) (FT_Short)( (f) >> 16 ) ) +#define Fix2UInt( f ) ( (FT_UInt)(FT_Short)( (f) >> 16 ) ) + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1decode + + + typedef enum T1_Operator_ + { + op_none = 0, + op_endchar, + op_hsbw, + op_seac, + op_sbw, + op_closepath, + op_hlineto, + op_hmoveto, + op_hvcurveto, + op_rlineto, + op_rmoveto, + op_rrcurveto, + op_vhcurveto, + op_vlineto, + op_vmoveto, + op_dotsection, + op_hstem, + op_hstem3, + op_vstem, + op_vstem3, + op_div, + op_callothersubr, + op_callsubr, + op_pop, + op_return, + op_setcurrentpoint, + op_unknown15, + + op_max /* never remove this one */ + + } T1_Operator; + + + static + const FT_Int t1_args_count[op_max] = + { + 0, /* none */ + 0, /* endchar */ + 2, /* hsbw */ + 5, /* seac */ + 4, /* sbw */ + 0, /* closepath */ + 1, /* hlineto */ + 1, /* hmoveto */ + 4, /* hvcurveto */ + 2, /* rlineto */ + 2, /* rmoveto */ + 6, /* rrcurveto */ + 4, /* vhcurveto */ + 1, /* vlineto */ + 1, /* vmoveto */ + 0, /* dotsection */ + 2, /* hstem */ + 6, /* hstem3 */ + 2, /* vstem */ + 6, /* vstem3 */ + 2, /* div */ + -1, /* callothersubr */ + 1, /* callsubr */ + 0, /* pop */ + 0, /* return */ + 2, /* setcurrentpoint */ + 2 /* opcode 15 (undocumented and obsolete) */ + }; + + + /************************************************************************** + * + * @Function: + * t1_lookup_glyph_by_stdcharcode_ps + * + * @Description: + * Looks up a given glyph by its StandardEncoding charcode. Used to + * implement the SEAC Type 1 operator in the Adobe engine + * + * @Input: + * face :: + * The current face object. + * + * charcode :: + * The character code to look for. + * + * @Return: + * A glyph index in the font face. Returns -1 if the corresponding + * glyph wasn't found. + */ + FT_LOCAL_DEF( FT_Int ) + t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder* decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && + name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return (FT_Int)n; + } + + return -1; + } + + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + + /************************************************************************** + * + * @Function: + * t1_lookup_glyph_by_stdcharcode + * + * @Description: + * Looks up a given glyph by its StandardEncoding charcode. Used to + * implement the SEAC Type 1 operator. + * + * @Input: + * face :: + * The current face object. + * + * charcode :: + * The character code to look for. + * + * @Return: + * A glyph index in the font face. Returns -1 if the corresponding + * glyph wasn't found. + */ + static FT_Int + t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && + name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return (FT_Int)n; + } + + return -1; + } + + + /* parse a single Type 1 glyph */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph ) + { + return decoder->parse_callback( decoder, glyph ); + } + + + /************************************************************************** + * + * @Function: + * t1operator_seac + * + * @Description: + * Implements the `seac' Type 1 operator for a Type 1 decoder. + * + * @Input: + * decoder :: + * The current CID decoder. + * + * asb :: + * The accent's side bearing. + * + * adx :: + * The horizontal offset of the accent. + * + * ady :: + * The vertical offset of the accent. + * + * bchar :: + * The base character's StandardEncoding charcode. + * + * achar :: + * The accent character's StandardEncoding charcode. + * + * @Return: + * FreeType error code. 0 means success. + */ + static FT_Error + t1operator_seac( T1_Decoder decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + FT_Int bchar_index, achar_index; +#if 0 + FT_Int n_base_points; + FT_Outline* base = decoder->builder.base; +#endif + FT_Vector left_bearing, advance; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + T1_Face face = (T1_Face)decoder->builder.face; +#endif + + + if ( decoder->seac ) + { + FT_ERROR(( "t1operator_seac: invalid nested seac\n" )); + return FT_THROW( Syntax_Error ); + } + + if ( decoder->builder.metrics_only ) + { + FT_ERROR(( "t1operator_seac: unexpected seac\n" )); + return FT_THROW( Syntax_Error ); + } + + /* seac weirdness */ + adx += decoder->builder.left_bearing.x; + + /* `glyph_names' is set to 0 for CID fonts which do not */ + /* include an encoding. How can we deal with these? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( decoder->glyph_names == 0 && + !face->root.internal->incremental_interface ) +#else + if ( decoder->glyph_names == 0 ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ERROR(( "t1operator_seac:" + " glyph names table not available in this font\n" )); + return FT_THROW( Syntax_Error ); + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + { + /* the caller must handle the font encoding also */ + bchar_index = bchar; + achar_index = achar; + } + else +#endif + { + bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "t1operator_seac:" + " invalid seac character code arguments\n" )); + return FT_THROW( Syntax_Error ); + } + + /* if we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); + subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + goto Exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + + /* save the left bearing and width of the SEAC */ + /* glyph as they will be erased by the next load */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, (FT_UInt)bchar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* If the SEAC glyph doesn't have a (H)SBW of its */ + /* own use the values from the base glyph. */ + + if ( decoder->builder.parse_state != T1_Parse_Have_Width ) + { + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + } + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + decoder->builder.pos_x = adx - asb; + decoder->builder.pos_y = ady; + + /* Now load `achar' on top of */ + /* the base outline */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, (FT_UInt)achar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* restore the left side bearing and advance width */ + /* of the SEAC glyph or base character (saved above) */ + + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; + + decoder->builder.pos_x = 0; + decoder->builder.pos_y = 0; + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * t1_decoder_parse_charstrings + * + * @Description: + * Parses a given Type 1 charstrings program. + * + * @Input: + * decoder :: + * The current Type 1 decoder. + * + * charstring_base :: + * The base address of the charstring stream. + * + * charstring_len :: + * The length in bytes of the charstring stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + FT_Error error; + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + FT_Pos x, y, orig_x, orig_y; + FT_Int known_othersubr_result_cnt = 0; + FT_Int unknown_othersubr_result_cnt = 0; + FT_Bool large_int; + FT_Fixed seed; + + T1_Hints_Funcs hinter; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool bol = TRUE; +#endif + + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&decoder ^ + (FT_Offset)(char*)&charstring_base ) & + FT_ULONG_MAX ); + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + hinter = (T1_Hints_Funcs)builder->hints_funcs; + + /* a font that reads BuildCharArray without setting */ + /* its values first is buggy, but ... */ + FT_ASSERT( ( decoder->len_buildchar == 0 ) == + ( decoder->buildchar == NULL ) ); + + if ( decoder->buildchar && decoder->len_buildchar > 0 ) + FT_ARRAY_ZERO( decoder->buildchar, decoder->len_buildchar ); + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = FT_Err_Ok; + + x = orig_x = builder->pos_x; + y = orig_y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + large_int = FALSE; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Int32 value = 0; + + + FT_ASSERT( known_othersubr_result_cnt == 0 || + unknown_othersubr_result_cnt == 0 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( bol ) + { + FT_TRACE5(( " (%td)", decoder->top - decoder->stack )); + bol = FALSE; + } +#endif + + /********************************************************************** + * + * Decode operator or operand + * + */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + op = op_hstem; + break; + + case 3: + op = op_vstem; + break; + case 4: + op = op_vmoveto; + break; + case 5: + op = op_rlineto; + break; + case 6: + op = op_hlineto; + break; + case 7: + op = op_vlineto; + break; + case 8: + op = op_rrcurveto; + break; + case 9: + op = op_closepath; + break; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + + case 13: + op = op_hsbw; + break; + case 14: + op = op_endchar; + break; + + case 15: /* undocumented, obsolete operator */ + op = op_unknown15; + break; + + case 21: + op = op_rmoveto; + break; + case 22: + op = op_hmoveto; + break; + + case 30: + op = op_vhcurveto; + break; + case 31: + op = op_hvcurveto; + break; + + case 12: + if ( ip >= limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 0: + op = op_dotsection; + break; + case 1: + op = op_vstem3; + break; + case 2: + op = op_hstem3; + break; + case 6: + op = op_seac; + break; + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + case 16: + op = op_callothersubr; + break; + case 17: + op = op_pop; + break; + case 33: + op = op_setcurrentpoint; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | + ( (FT_UInt32)ip[1] << 16 ) | + ( (FT_UInt32)ip[2] << 8 ) | + (FT_UInt32)ip[3] ); + ip += 4; + + /* According to the specification, values > 32000 or < -32000 must */ + /* be followed by a `div' operator to make the result be in the */ + /* range [-32000;32000]. We expect that the second argument of */ + /* `div' is not a large number. Additionally, we don't handle */ + /* stuff like `<large1> <large2> <num> div <num> div' or */ + /* <large1> <large2> <num> div div'. This is probably not allowed */ + /* anyway. */ + if ( value > 32000 || value < -32000 ) + { + if ( large_int ) + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + else + large_int = TRUE; + } + else + { + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Int32)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108; + else + value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 ); + } + + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + if ( unknown_othersubr_result_cnt > 0 ) + { + switch ( op ) + { + case op_callsubr: + case op_return: + case op_none: + case op_pop: + break; + + default: + /* all operands have been transferred by previous pops */ + unknown_othersubr_result_cnt = 0; + break; + } + } + + if ( large_int && !( op == op_none || op == op_div ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + + large_int = FALSE; + } + + /********************************************************************** + * + * Push value on stack, or process operator + * + */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" )); + goto Syntax_Error; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( large_int ) + FT_TRACE4(( " %d", value )); + else + FT_TRACE4(( " %d", value / 65536 )); +#endif + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_Int subr_no; + FT_Int arg_cnt; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " callothersubr\n" )); + bol = TRUE; +#endif + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + + subr_no = Fix2Int( top[1] ); + arg_cnt = Fix2Int( top[0] ); + + /************************************************************ + * + * remove all operands to callothersubr from the stack + * + * for handled othersubrs, where we know the number of + * arguments, we increase the stack by the value of + * known_othersubr_result_cnt + * + * for unhandled othersubrs the following pops adjust the + * stack pointer as necessary + */ + + if ( arg_cnt > top - decoder->stack ) + goto Stack_Underflow; + + top -= arg_cnt; + + known_othersubr_result_cnt = 0; + unknown_othersubr_result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == <whatever>' */ + /* might not be correct; an othersubr expects a certain */ + /* number of operands on the PostScript stack (as opposed */ + /* to the T1 stack) but it doesn't have to put them there */ + /* by itself; previous othersubrs might have left the */ + /* operands there if they were not followed by an */ + /* appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ + /* accept a font that contains charstrings like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray exists. */ + + switch ( subr_no ) + { + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( !decoder->flex_state || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected flex end\n" )); + goto Syntax_Error; + } + + /* the two `results' are popped by the following setcurrentpoint */ + top[0] = x; + top[1] = y; + known_othersubr_result_cnt = 2; + break; + + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 6 ) ) ) + goto Fail; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( !decoder->flex_state ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " missing flex start\n" )); + goto Syntax_Error; + } + + /* note that we should not add a point for index 0; */ + /* this will move our current position to the flex */ + /* point without adding any point to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + { + /* in malformed fonts it is possible to have other */ + /* opcodes in the middle of a flex (which don't */ + /* increase `num_flex_vectors'); we thus have to */ + /* check whether we can add a point */ + if ( FT_SET_ERROR( t1_builder_check_points( builder, 1 ) ) ) + goto Syntax_Error; + + t1_builder_add_point( builder, + x, + y, + (FT_Byte)( idx == 3 || idx == 6 ) ); + } + } + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + known_othersubr_result_cnt = 1; + + if ( hinter ) + hinter->reset( hinter->hints, + (FT_UInt)builder->current->n_points ); + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + top = decoder->stack; + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + FT_Long* delta; + FT_Long* values; + + + if ( !blend ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected multiple masters operator\n" )); + goto Syntax_Error; + } + + num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " incorrect number of multiple masters arguments\n" )); + goto Syntax_Error; + } + + /* We want to compute */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */ + /* */ + /* However, given that w0 + w1 + ... + wk == 1, we can */ + /* rewrite it easily as */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1. */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = top + num_points; + values = top; + for ( nn = 0; nn < num_points; nn++ ) + { + FT_Long tmp = values[0]; + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp = ADD_LONG( tmp, + FT_MulFix( *delta++, + blend->weight_vector[mm] ) ); + + *values++ = tmp; + } + + known_othersubr_result_cnt = (FT_Int)num_points; + break; + } + + case 19: + /* <idx> 1 19 callothersubr */ + /* => replace elements starting from index cvi( <idx> ) */ + /* of BuildCharArray with WeightVector */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = Fix2Int( top[0] ); + + if ( idx < 0 || + (FT_UInt)idx + blend->num_designs > decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof ( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* <arg1> <arg2> 2 20 callothersubr pop */ + /* ==> push <arg1> + <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = ADD_LONG( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 21: + /* <arg1> <arg2> 2 21 callothersubr pop */ + /* ==> push <arg1> - <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = SUB_LONG( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 22: + /* <arg1> <arg2> 2 22 callothersubr pop */ + /* ==> push <arg1> * <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = FT_MulFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 23: + /* <arg1> <arg2> 2 23 callothersubr pop */ + /* ==> push <arg1> / <arg2> onto T1 stack */ + if ( arg_cnt != 2 || top[1] == 0 ) + goto Unexpected_OtherSubr; + + top[0] = FT_DivFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 24: + /* <val> <idx> 2 24 callothersubr */ + /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ + { + FT_UInt idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 2 || !blend ) + goto Unexpected_OtherSubr; + + idx = Fix2UInt( top[1] ); + + if ( idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = top[0]; + } + break; + + case 25: + /* <idx> 1 25 callothersubr pop */ + /* ==> push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + FT_UInt idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = Fix2UInt( top[0] ); + + if ( idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + top[0] = decoder->buildchar[idx]; + } + + known_othersubr_result_cnt = 1; + break; + +#if 0 + case 26: + /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ + /* leave mark on T1 stack */ + /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ + XXX which routine has left its mark on the (PostScript) stack?; + break; +#endif + + case 27: + /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ + /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ + /* otherwise push <res2> */ + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + if ( top[2] > top[3] ) + top[0] = top[1]; + + known_othersubr_result_cnt = 1; + break; + + case 28: + /* 0 28 callothersubr pop */ + /* => push random value from interval [0, 1) onto stack */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + { + FT_Fixed Rand; + + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + top[0] = Rand; + + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + } + + known_othersubr_result_cnt = 1; + break; + + default: + if ( arg_cnt >= 0 && subr_no >= 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unknown othersubr [%d %d], wish me luck\n", + arg_cnt, subr_no )); + unknown_othersubr_result_cnt = arg_cnt; + break; + } + /* fall through */ + + Unexpected_OtherSubr: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid othersubr [%d %d]\n", arg_cnt, subr_no )); + goto Syntax_Error; + } + + top += known_othersubr_result_cnt; + + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + + /* XXX Operators usually take their operands from the */ + /* bottom of the stack, i.e., the operands are */ + /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ + /* only div, callsubr, and callothersubr are different. */ + /* In practice it doesn't matter (?). */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + switch ( op ) + { + case op_callsubr: + case op_div: + case op_callothersubr: + case op_pop: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_charstrings:" + " too much operands on the stack" + " (seen %td, expected %d)\n", + top - decoder->stack, num_args )); + break; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_endchar: + FT_TRACE4(( " endchar\n" )); + + t1_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + (FT_UInt)builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + error = hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + if ( error ) + goto Fail; + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* the compiler should optimize away this empty loop but ... */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( decoder->len_buildchar > 0 ) + { + FT_UInt i; + + + FT_TRACE4(( "BuildCharArray = [ " )); + + for ( i = 0; i < decoder->len_buildchar; i++ ) + FT_TRACE4(( "%ld ", decoder->buildchar[i] )); + + FT_TRACE4(( "]\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + FT_TRACE4(( "\n" )); + + /* return now! */ + return FT_Err_Ok; + + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + + builder->advance.x = top[1]; + builder->advance.y = 0; + + orig_x = x = ADD_LONG( builder->pos_x, top[0] ); + orig_y = y = builder->pos_y; + + FT_UNUSED( orig_y ); + + /* `metrics_only' indicates that we only want to compute the */ + /* glyph's metrics (lsb + advance width) without loading the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + { + FT_TRACE4(( "\n" )); + return FT_Err_Ok; + } + + break; + + case op_seac: + return t1operator_seac( decoder, + top[0], + top[1], + top[2], + Fix2Int( top[3] ), + Fix2Int( top[4] ) ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + builder->left_bearing.y = ADD_LONG( builder->left_bearing.y, + top[1] ); + + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + x = ADD_LONG( builder->pos_x, top[0] ); + y = ADD_LONG( builder->pos_y, top[1] ); + + /* `metrics_only' indicates that we only want to compute the */ + /* glyph's metrics (lsb + advance width) without loading the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + { + FT_TRACE4(( "\n" )); + return FT_Err_Ok; + } + + break; + + case op_closepath: + FT_TRACE4(( " closepath" )); + + /* if there is no path, `closepath' is a no-op */ + if ( builder->parse_state == T1_Parse_Have_Path || + builder->parse_state == T1_Parse_Have_Moveto ) + t1_builder_close_contour( builder ); + + builder->parse_state = T1_Parse_Have_Width; + break; + + case op_hlineto: + FT_TRACE4(( " hlineto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + goto Add_Line; + + case op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + x = ADD_LONG( x, top[0] ); + + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_hvcurveto: + FT_TRACE4(( " hvcurveto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[1] ); + y = ADD_LONG( y, top[2] ); + t1_builder_add_point( builder, x, y, 0 ); + + y = ADD_LONG( y, top[3] ); + t1_builder_add_point( builder, x, y, 1 ); + break; + + case op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + y = ADD_LONG( y, top[1] ); + + Add_Line: + if ( FT_SET_ERROR( t1_builder_add_point1( builder, x, y ) ) ) + goto Fail; + break; + + case op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + x = ADD_LONG( x, top[0] ); + y = ADD_LONG( y, top[1] ); + + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_rrcurveto: + FT_TRACE4(( " rrcurveto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + y = ADD_LONG( y, top[1] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[2] ); + y = ADD_LONG( y, top[3] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[4] ); + y = ADD_LONG( y, top[5] ); + t1_builder_add_point( builder, x, y, 1 ); + break; + + case op_vhcurveto: + FT_TRACE4(( " vhcurveto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) + goto Fail; + + y = ADD_LONG( y, top[0] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[1] ); + y = ADD_LONG( y, top[2] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[3] ); + t1_builder_add_point( builder, x, y, 1 ); + break; + + case op_vlineto: + FT_TRACE4(( " vlineto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) + goto Fail; + + y = ADD_LONG( y, top[0] ); + goto Add_Line; + + case op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + y = ADD_LONG( y, top[0] ); + + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_div: + FT_TRACE4(( " div" )); + + /* if `large_int' is set, we divide unscaled numbers; */ + /* otherwise, we divide numbers in 16.16 format -- */ + /* in both cases, it is the same operation */ + *top = FT_DivFix( top[0], top[1] ); + top++; + + large_int = FALSE; + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = Fix2Int( top[0] ); + + if ( decoder->subrs_hash ) + { + size_t* val = ft_hash_num_lookup( idx, + decoder->subrs_hash ); + + + if ( val ) + idx = *val; + else + idx = -1; + } + + if ( idx < 0 || idx >= decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_pop: + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + break; + } + + if ( unknown_othersubr_result_cnt == 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no more operands for othersubr\n" )); + goto Syntax_Error; + } + + unknown_othersubr_result_cnt--; + top++; /* `push' the operand to callothersubr onto the stack */ + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_dotsection: + FT_TRACE4(( " dotsection" )); + + break; + + case op_hstem: + FT_TRACE4(( " hstem" )); + + /* record horizontal hint */ + if ( hinter ) + { + /* top[0] += builder->left_bearing.y; */ + hinter->stem( hinter->hints, 1, top ); + } + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + /* record horizontal counter-controlled hints */ + if ( hinter ) + hinter->stem3( hinter->hints, 1, top ); + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + /* record vertical hint */ + if ( hinter ) + { + top[0] = ADD_LONG( top[0], orig_x ); + hinter->stem( hinter->hints, 0, top ); + } + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + /* record vertical counter-controlled hints */ + if ( hinter ) + { + FT_Pos dx = orig_x; + + + top[0] = ADD_LONG( top[0], dx ); + top[2] = ADD_LONG( top[2], dx ); + top[4] = ADD_LONG( top[4], dx ); + hinter->stem3( hinter->hints, 0, top ); + } + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + /* From the T1 specification, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled */ + /* above. */ + + /* Note, however, that both Ghostscript and Adobe */ + /* Distiller handle this situation by silently ignoring */ + /* the inappropriate `setcurrentpoint' instruction. So */ + /* we do the same. */ +#if 0 + + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + } + else + ... +#endif + + x = top[0]; + y = top[1]; + decoder->flex_state = 0; + break; + + case op_unknown15: + FT_TRACE4(( " opcode_15" )); + /* nothing to do except to pop the two arguments */ + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + /* XXX Operators usually clear the operand stack; */ + /* only div, callsubr, callothersubr, pop, and */ + /* return are different. */ + /* In practice it doesn't matter (?). */ + + decoder->top = top; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( "\n" )); + bol = TRUE; +#endif + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n" )); + FT_TRACE4(( "\n" )); + + Fail: + return error; + + Syntax_Error: + return FT_THROW( Syntax_Error ); + + Stack_Underflow: + return FT_THROW( Stack_Underflow ); + } + + +#else /* !T1_CONFIG_OPTION_OLD_ENGINE */ + + + /************************************************************************** + * + * @Function: + * t1_decoder_parse_metrics + * + * @Description: + * Parses a given Type 1 charstrings program to extract width + * + * @Input: + * decoder :: + * The current Type 1 decoder. + * + * charstring_base :: + * The base address of the charstring stream. + * + * charstring_len :: + * The length in bytes of the charstring stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_metrics( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + FT_Bool large_int; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool bol = TRUE; +#endif + + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + large_int = FALSE; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Int32 value = 0; + + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( bol ) + { + FT_TRACE5(( " (%ld)", decoder->top - decoder->stack )); + bol = FALSE; + } +#endif + + /********************************************************************** + * + * Decode operator or operand + * + */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 14: + case 15: + case 21: + case 22: + case 30: + case 31: + goto No_Width; + + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + + case 13: + op = op_hsbw; + break; + + case 12: + if ( ip >= limit ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + + default: + goto No_Width; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | + ( (FT_UInt32)ip[1] << 16 ) | + ( (FT_UInt32)ip[2] << 8 ) | + (FT_UInt32)ip[3] ); + ip += 4; + + /* According to the specification, values > 32000 or < -32000 must */ + /* be followed by a `div' operator to make the result be in the */ + /* range [-32000;32000]. We expect that the second argument of */ + /* `div' is not a large number. Additionally, we don't handle */ + /* stuff like `<large1> <large2> <num> div <num> div' or */ + /* <large1> <large2> <num> div div'. This is probably not allowed */ + /* anyway. */ + if ( value > 32000 || value < -32000 ) + { + if ( large_int ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " no `div' after large integer\n" )); + goto Syntax_Error; + } + else + large_int = TRUE; + } + else + { + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Int32)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108; + else + value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 ); + } + + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + else + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + if ( large_int && !( op == op_none || op == op_div ) ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " no `div' after large integer\n" )); + goto Syntax_Error; + } + + /********************************************************************** + * + * Push value on stack, or process operator + * + */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_metrics: stack overflow\n" )); + goto Syntax_Error; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( large_int ) + FT_TRACE4(( " %d", value )); + else + FT_TRACE4(( " %d", value / 65536 )); +#endif + + *top++ = value; + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + +#ifdef FT_DEBUG_LEVEL_TRACE + + switch ( op ) + { + case op_callsubr: + case op_div: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_metrics:" + " too much operands on the stack" + " (seen %ld, expected %d)\n", + top - decoder->stack, num_args )); + break; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + + builder->advance.x = top[1]; + builder->advance.y = 0; + + /* we only want to compute the glyph's metrics */ + /* (lsb + advance width) without loading the */ + /* rest of it; so exit immediately */ + FT_TRACE4(( "\n" )); + return FT_Err_Ok; + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + builder->left_bearing.y = ADD_LONG( builder->left_bearing.y, + top[1] ); + + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + /* we only want to compute the glyph's metrics */ + /* (lsb + advance width), without loading the */ + /* rest of it; so exit immediately */ + FT_TRACE4(( "\n" )); + return FT_Err_Ok; + + case op_div: + FT_TRACE4(( " div" )); + + /* if `large_int' is set, we divide unscaled numbers; */ + /* otherwise, we divide numbers in 16.16 format -- */ + /* in both cases, it is the same operation */ + *top = FT_DivFix( top[0], top[1] ); + top++; + + large_int = FALSE; + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = Fix2Int( top[0] ); + + if ( decoder->subrs_hash ) + { + size_t* val = ft_hash_num_lookup( idx, + decoder->subrs_hash ); + + + if ( val ) + idx = *val; + else + idx = -1; + } + + if ( idx < 0 || idx >= decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + default: + FT_ERROR(( "t1_decoder_parse_metrics:" + " unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + decoder->top = top; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n" )); + FT_TRACE4(( "\n" )); + + No_Width: + FT_ERROR(( "t1_decoder_parse_metrics:" + " no width, found op %d instead\n", + ip[-1] )); + Syntax_Error: + return FT_THROW( Syntax_Error ); + + Stack_Underflow: + return FT_THROW( Stack_Underflow ); + } + +#endif /* !T1_CONFIG_OPTION_OLD_ENGINE */ + + + /* initialize T1 decoder */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_callback ) + { + FT_ZERO( decoder ); + + /* retrieve `psnames' interface from list of current modules */ + { + FT_Service_PsCMaps psnames; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "t1_decoder_init:" + " the `psnames' module is not available\n" )); + return FT_THROW( Unimplemented_Feature ); + } + + decoder->psnames = psnames; + } + + t1_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* decoder->buildchar and decoder->len_buildchar have to be */ + /* initialized by the caller since we cannot know the length */ + /* of the BuildCharArray */ + + decoder->num_glyphs = (FT_UInt)face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->hint_mode = hint_mode; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return FT_Err_Ok; + } + + + /* finalize T1 decoder */ + FT_LOCAL_DEF( void ) + t1_decoder_done( T1_Decoder decoder ) + { + FT_Memory memory = decoder->builder.memory; + + + t1_builder_done( &decoder->builder ); + + if ( decoder->cf2_instance.finalizer ) + { + decoder->cf2_instance.finalizer( decoder->cf2_instance.data ); + FT_FREE( decoder->cf2_instance.data ); + } + } + + +/* END */ diff --git a/external/freetype/src/psaux/t1decode.h b/external/freetype/src/psaux/t1decode.h new file mode 100644 index 000000000..0970def96 --- /dev/null +++ b/external/freetype/src/psaux/t1decode.h @@ -0,0 +1,73 @@ +/**************************************************************************** + * + * t1decode.h + * + * PostScript Type 1 decoding routines (specification). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1DECODE_H_ +#define T1DECODE_H_ + + +#include <freetype/internal/psaux.h> +#include <freetype/internal/t1types.h> + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const T1_Decoder_FuncsRec t1_decoder_funcs; + + FT_LOCAL( FT_Int ) + t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder* decoder, + FT_Int charcode ); + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + FT_LOCAL( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); +#else + FT_LOCAL( FT_Error ) + t1_decoder_parse_metrics( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ); +#endif + + FT_LOCAL( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_glyph ); + + FT_LOCAL( void ) + t1_decoder_done( T1_Decoder decoder ); + + +FT_END_HEADER + +#endif /* T1DECODE_H_ */ + + +/* END */ diff --git a/external/freetype/src/pshinter/module.mk b/external/freetype/src/pshinter/module.mk new file mode 100644 index 000000000..dbc137dca --- /dev/null +++ b/external/freetype/src/pshinter/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSHinter module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSHINTER_MODULE + +define PSHINTER_MODULE +$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/pshinter/pshalgo.c b/external/freetype/src/pshinter/pshalgo.c new file mode 100644 index 000000000..4f622e1e4 --- /dev/null +++ b/external/freetype/src/pshinter/pshalgo.c @@ -0,0 +1,2191 @@ +/**************************************************************************** + * + * pshalgo.c + * + * PostScript hinting algorithm (body). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used + * modified and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include "pshalgo.h" + +#include "pshnterr.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT pshalgo + + +#ifdef DEBUG_HINTER + PSH_Hint_Table ps_debug_hint_table = NULL; + PSH_HintFunc ps_debug_hint_func = NULL; + PSH_Glyph ps_debug_glyph = NULL; +#endif + + +#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ + /* and similar glyphs */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC HINTS RECORDINGS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* return true if two stem hints overlap */ + static FT_Int + psh_hint_overlap( PSH_Hint hint1, + PSH_Hint hint2 ) + { + return ADD_INT( hint1->org_pos, hint1->org_len ) >= hint2->org_pos && + ADD_INT( hint2->org_pos, hint2->org_len ) >= hint1->org_pos; + } + + + /* destroy hints table */ + static void + psh_hint_table_done( PSH_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->zones ); + table->num_zones = 0; + table->zone = NULL; + + FT_FREE( table->sort ); + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + table->sort_global = NULL; + } + + + /* deactivate all hints in a table */ + static void + psh_hint_table_deactivate( PSH_Hint_Table table ) + { + FT_UInt count = table->max_hints; + PSH_Hint hint = table->hints; + + + for ( ; count > 0; count--, hint++ ) + { + psh_hint_deactivate( hint ); + hint->order = -1; + } + } + + + /* internal function to record a new hint */ + static void + psh_hint_table_record( PSH_Hint_Table table, + FT_UInt idx ) + { + PSH_Hint hint = table->hints + idx; + + + if ( idx >= table->max_hints ) + { + FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx )); + return; + } + + /* ignore active hints */ + if ( psh_hint_is_active( hint ) ) + return; + + psh_hint_activate( hint ); + + /* now scan the current active hint set to check */ + /* whether `hint' overlaps with another hint */ + { + PSH_Hint* sorted = table->sort_global; + FT_UInt count = table->num_hints; + PSH_Hint hint2; + + + hint->parent = NULL; + for ( ; count > 0; count--, sorted++ ) + { + hint2 = sorted[0]; + + if ( psh_hint_overlap( hint, hint2 ) ) + { + hint->parent = hint2; + break; + } + } + } + + if ( table->num_hints < table->max_hints ) + table->sort_global[table->num_hints++] = hint; + else + FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); + } + + + static void + psh_hint_table_record_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit; + + + limit = hint_mask->num_bits; + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + psh_hint_table_record( table, idx ); + + mask >>= 1; + } + } + + + /* create hints table */ + static FT_Error + psh_hint_table_init( PSH_Hint_Table table, + PS_Hint_Table hints, + PS_Mask_Table hint_masks, + PS_Mask_Table counter_masks, + FT_Memory memory ) + { + FT_UInt count; + FT_Error error; + + FT_UNUSED( counter_masks ); + + + count = hints->num_hints; + + /* allocate our tables */ + if ( FT_QNEW_ARRAY( table->sort, 2 * count ) || + FT_QNEW_ARRAY( table->hints, count ) || + FT_QNEW_ARRAY( table->zones, 2 * count + 1 ) ) + goto Exit; + + table->max_hints = count; + table->sort_global = FT_OFFSET( table->sort, count ); + table->num_hints = 0; + table->num_zones = 0; + table->zone = NULL; + + /* initialize the `table->hints' array */ + { + PSH_Hint write = table->hints; + PS_Hint read = hints->hints; + + + for ( ; count > 0; count--, write++, read++ ) + { + write->org_pos = read->pos; + write->org_len = read->len; + write->flags = read->flags; + } + } + + /* we now need to determine the initial `parent' stems; first */ + /* activate the hints that are given by the initial hint masks */ + if ( hint_masks ) + { + PS_Mask mask = hint_masks->masks; + + + count = hint_masks->num_masks; + table->hint_masks = hint_masks; + + for ( ; count > 0; count--, mask++ ) + psh_hint_table_record_mask( table, mask ); + } + + /* finally, do a linear parse in case some hints were left alone */ + if ( table->num_hints != table->max_hints ) + { + FT_UInt idx; + + + FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" )); + + count = table->max_hints; + for ( idx = 0; idx < count; idx++ ) + psh_hint_table_record( table, idx ); + } + + Exit: + return error; + } + + + static void + psh_hint_table_activate_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit, count; + + + limit = hint_mask->num_bits; + count = 0; + + psh_hint_table_deactivate( table ); + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + { + PSH_Hint hint = &table->hints[idx]; + + + if ( !psh_hint_is_active( hint ) ) + { + FT_UInt count2; + +#if 0 + PSH_Hint* sort = table->sort; + PSH_Hint hint2; + + + for ( count2 = count; count2 > 0; count2--, sort++ ) + { + hint2 = sort[0]; + if ( psh_hint_overlap( hint, hint2 ) ) + FT_TRACE0(( "psh_hint_table_activate_mask:" + " found overlapping hints\n" )) + } +#else + count2 = 0; +#endif + + if ( count2 == 0 ) + { + psh_hint_activate( hint ); + if ( count < table->max_hints ) + table->sort[count++] = hint; + else + FT_TRACE0(( "psh_hint_tableactivate_mask:" + " too many active hints\n" )); + } + } + } + + mask >>= 1; + } + table->num_hints = count; + + /* now, sort the hints; they are guaranteed to not overlap */ + /* so we can compare their "org_pos" field directly */ + { + FT_UInt i1, i2; + PSH_Hint hint1, hint2; + PSH_Hint* sort = table->sort; + + + /* a simple bubble sort will do, since in 99% of cases, the hints */ + /* will be already sorted -- and the sort will be linear */ + for ( i1 = 1; i1 < count; i1++ ) + { + hint1 = sort[i1]; + /* this loop stops when i2 wraps around after reaching 0 */ + for ( i2 = i1 - 1; i2 < i1; i2-- ) + { + hint2 = sort[i2]; + + if ( hint2->org_pos < hint1->org_pos ) + break; + + sort[i2 + 1] = hint2; + sort[i2] = hint1; + } + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + static FT_Pos + psh_dimension_quantize_len( PSH_Dimension dim, + FT_Pos len, + FT_Bool do_snapping ) + { + if ( len <= 64 ) + len = 64; + else + { + FT_Pos delta = len - dim->stdw.widths[0].cur; + + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + len = dim->stdw.widths[0].cur; + if ( len < 48 ) + len = 48; + } + + if ( len < 3 * 64 ) + { + delta = ( len & 63 ); + len &= -64; + + if ( delta < 10 ) + len += delta; + + else if ( delta < 32 ) + len += 10; + + else if ( delta < 54 ) + len += 54; + + else + len += delta; + } + else + len = FT_PIX_ROUND( len ); + } + + if ( do_snapping ) + len = FT_PIX_ROUND( len ); + + return len; + } +#endif /* 0 */ + + +#ifdef DEBUG_HINTER + + static void + ps_simple_scale( PSH_Hint_Table table, + FT_Fixed scale, + FT_Fixed delta, + FT_Int dimension ) + { + FT_UInt count; + + + for ( count = 0; count < table->max_hints; count++ ) + { + PSH_Hint hint = table->hints + count; + + + hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; + hint->cur_len = FT_MulFix( hint->org_len, scale ); + + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); + } + } + +#endif /* DEBUG_HINTER */ + + + static FT_Fixed + psh_hint_snap_stem_side_delta( FT_Fixed pos, + FT_Fixed len ) + { + FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; + FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; + + + if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) + return delta1; + else + return delta2; + } + + + static void + psh_hint_align( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Int do_snapping; + FT_Pos fit_len; + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + /* perform stem snapping when requested - this is necessary + * for monochrome and LCD hinting modes only + */ + do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || + ( dimension == 1 && glyph->do_vert_snapping ); + + hint->cur_len = fit_len = len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + ADD_INT( hint->org_pos, hint->org_len ), + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align( parent, globals, dimension, glyph ); + + /* keep original relation between hints, that is, use the */ + /* scaled distance between the centers of the hints to */ + /* compute the new position */ + par_org_center = parent->org_pos + ( parent->org_len >> 1 ); + par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); + cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + hint->cur_pos = pos; + hint->cur_len = fit_len; + + /* Stem adjustment tries to snap stem widths to standard + * ones. This is important to prevent unpleasant rounding + * artefacts. + */ + if ( glyph->do_stem_adjust ) + { + if ( len <= 64 ) + { + /* the stem is less than one pixel; we will center it + * around the nearest pixel center + */ + if ( len >= 32 ) + { + /* This is a special case where we also widen the stem + * and align it to the pixel grid. + * + * stem_center = pos + (len/2) + * nearest_pixel_center = FT_ROUND(stem_center-32)+32 + * new_pos = nearest_pixel_center-32 + * = FT_ROUND(stem_center-32) + * = FT_FLOOR(stem_center-32+32) + * = FT_FLOOR(stem_center) + * new_len = 64 + */ + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); + len = 64; + } + else if ( len > 0 ) + { + /* This is a very small stem; we simply align it to the + * pixel grid, trying to find the minimum displacement. + * + * left = pos + * right = pos + len + * left_nearest_edge = ROUND(pos) + * right_nearest_edge = ROUND(right) + * + * if ( ABS(left_nearest_edge - left) <= + * ABS(right_nearest_edge - right) ) + * new_pos = left + * else + * new_pos = right + */ + FT_Pos left_nearest = FT_PIX_ROUND( pos ); + FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); + FT_Pos left_disp = left_nearest - pos; + FT_Pos right_disp = right_nearest - ( pos + len ); + + + if ( left_disp < 0 ) + left_disp = -left_disp; + if ( right_disp < 0 ) + right_disp = -right_disp; + if ( left_disp <= right_disp ) + pos = left_nearest; + else + pos = right_nearest; + } + else + { + /* this is a ghost stem; we simply round it */ + pos = FT_PIX_ROUND( pos ); + } + } + else + { + len = psh_dimension_quantize_len( dim, len, 0 ); + } + } + + /* now that we have a good hinted stem width, try to position */ + /* the stem along a pixel grid integer coordinate */ + hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); + hint->cur_len = len; + } + } + + if ( do_snapping ) + { + pos = hint->cur_pos; + len = hint->cur_len; + + if ( len < 64 ) + len = 64; + else + len = FT_PIX_ROUND( len ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + hint->cur_pos = align.align_top - len; + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT: + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: + /* don't touch */ + break; + + + default: + hint->cur_len = len; + if ( len & 64 ) + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; + else + pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); + + hint->cur_pos = pos - ( len >> 1 ); + hint->cur_len = len; + } + } + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + + +#if 0 /* not used for now, experimental */ + + /* + * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) + * of stems + */ + static void + psh_hint_align_light( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Pos fit_len; + + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + fit_len = len; + + hint->cur_len = fit_len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + ADD_INT( hint->org_pos, hint->org_len ), + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align_light( parent, globals, dimension, glyph ); + + par_org_center = parent->org_pos + ( parent->org_len / 2 ); + par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); + cur_org_center = hint->org_pos + ( hint->org_len / 2 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + /* Stems less than one pixel wide are easy -- we want to + * make them as dark as possible, so they must fall within + * one pixel. If the stem is split between two pixels + * then snap the edge that is nearer to the pixel boundary + * to the pixel boundary. + */ + if ( len <= 64 ) + { + if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + + /* Position stems other to minimize the amount of mid-grays. + * There are, in general, two positions that do this, + * illustrated as A) and B) below. + * + * + + + + + * + * A) |--------------------------------| + * B) |--------------------------------| + * C) |--------------------------------| + * + * Position A) (split the excess stem equally) should be better + * for stems of width N + f where f < 0.5. + * + * Position B) (split the deficiency equally) should be better + * for stems of width N + f where f > 0.5. + * + * It turns out though that minimizing the total number of lit + * pixels is also important, so position C), with one edge + * aligned with a pixel boundary is actually preferable + * to A). There are also more possible positions for C) than + * for A) or B), so it involves less distortion of the overall + * character shape. + */ + else /* len > 64 */ + { + FT_Fixed frac_len = len & 63; + FT_Fixed center = pos + ( len >> 1 ); + FT_Fixed delta_a, delta_b; + + + if ( ( len / 64 ) & 1 ) + { + delta_a = FT_PIX_FLOOR( center ) + 32 - center; + delta_b = FT_PIX_ROUND( center ) - center; + } + else + { + delta_a = FT_PIX_ROUND( center ) - center; + delta_b = FT_PIX_FLOOR( center ) + 32 - center; + } + + /* We choose between B) and C) above based on the amount + * of fractional stem width; for small amounts, choose + * C) always, for large amounts, B) always, and inbetween, + * pick whichever one involves less stem movement. + */ + if ( frac_len < 32 ) + { + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + else if ( frac_len < 48 ) + { + FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, + len ); + + if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) + pos += side_delta; + else + pos += delta_b; + } + else + { + pos += delta_b; + } + } + + hint->cur_pos = pos; + } + } /* switch */ + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + +#endif /* 0 */ + + + static void + psh_hint_table_align_hints( PSH_Hint_Table table, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Hint hint; + FT_UInt count; + +#ifdef DEBUG_HINTER + + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( ps_debug_no_vert_hints && dimension == 0 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + + if ( ps_debug_no_horz_hints && dimension == 1 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + +#endif /* DEBUG_HINTER */ + + hint = table->hints; + count = table->max_hints; + + for ( ; count > 0; count--, hint++ ) + psh_hint_align( hint, globals, dimension, glyph ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** POINTS INTERPOLATION ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define xxDEBUG_ZONES + + +#ifdef DEBUG_ZONES + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static void + psh_print_zone( PSH_Zone zone ) + { + printf( "zone [scale,delta,min,max] = [%.5f,%.2f,%d,%d]\n", + zone->scale / 65536.0, + zone->delta / 64.0, + zone->min, + zone->max ); + } + +#endif /* DEBUG_ZONES */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTER GLYPH MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define psh_corner_is_flat ft_corner_is_flat +#define psh_corner_orientation ft_corner_orientation + + +#ifdef COMPUTE_INFLEXS + + /* compute all inflex points in a given glyph */ + static void + psh_glyph_compute_inflections( PSH_Glyph glyph ) + { + FT_UInt n; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first, start, end, before, after; + FT_Pos in_x, in_y, out_x, out_y; + FT_Int orient_prev, orient_cur; + FT_Int finished = 0; + + + /* we need at least 4 points to create an inflection point */ + if ( glyph->contours[n].count < 4 ) + continue; + + /* compute first segment in contour */ + first = glyph->contours[n].start; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->org_u - start->org_u; + in_y = end->org_v - start->org_v; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->org_u - before->org_u; + out_y = start->org_v - before->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + in_x = out_x; + in_y = out_y; + + /* now, process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->org_u - end->org_u; + out_y = after->org_v - end->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_cur ^ orient_prev ) < 0 ) + { + do + { + psh_point_set_inflex( start ); + start = start->next; + } + while ( start != end ); + + psh_point_set_inflex( start ); + } + + start = end; + end = after; + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + +#endif /* COMPUTE_INFLEXS */ + + + static void + psh_glyph_done( PSH_Glyph glyph ) + { + FT_Memory memory = glyph->memory; + + + psh_hint_table_done( &glyph->hint_tables[1], memory ); + psh_hint_table_done( &glyph->hint_tables[0], memory ); + + FT_FREE( glyph->points ); + FT_FREE( glyph->contours ); + + glyph->num_points = 0; + glyph->num_contours = 0; + + glyph->memory = NULL; + } + + + static PSH_Dir + psh_compute_dir( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ax, ay; + PSH_Dir result = PSH_DIR_NONE; + + + ax = FT_ABS( dx ); + ay = FT_ABS( dy ); + + if ( ay * 12 < ax ) + { + /* |dy| <<< |dx| means a near-horizontal segment */ + result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; + } + else if ( ax * 12 < ay ) + { + /* |dx| <<< |dy| means a near-vertical segment */ + result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; + } + + return result; + } + + + /* load outline point coordinates into hinter glyph */ + static void + psh_glyph_load_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_Vector* vec = glyph->outline->points; + PSH_Point point = glyph->points; + FT_UInt count = glyph->num_points; + + + for ( ; count > 0; count--, point++, vec++ ) + { + point->flags2 = 0; + point->hint = NULL; + if ( dimension == 0 ) + { + point->org_u = vec->x; + point->org_v = vec->y; + } + else + { + point->org_u = vec->y; + point->org_v = vec->x; + } + +#ifdef DEBUG_HINTER + point->org_x = vec->x; + point->org_y = vec->y; +#endif + + } + } + + + /* save hinted point coordinates back to outline */ + static void + psh_glyph_save_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_UInt n; + PSH_Point point = glyph->points; + FT_Vector* vec = glyph->outline->points; + char* tags = glyph->outline->tags; + + + for ( n = 0; n < glyph->num_points; n++ ) + { + if ( dimension == 0 ) + vec[n].x = point->cur_u; + else + vec[n].y = point->cur_u; + + if ( psh_point_is_strong( point ) ) + tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); + +#ifdef DEBUG_HINTER + + if ( dimension == 0 ) + { + point->cur_x = point->cur_u; + point->flags_x = point->flags2 | point->flags; + } + else + { + point->cur_y = point->cur_u; + point->flags_y = point->flags2 | point->flags; + } + +#endif + + point++; + } + } + + + static FT_Error + psh_glyph_init( PSH_Glyph glyph, + FT_Outline* outline, + PS_Hints ps_hints, + PSH_Globals globals ) + { + FT_Error error; + FT_Memory memory; + + + /* clear all fields */ + FT_ZERO( glyph ); + + memory = glyph->memory = globals->memory; + + /* allocate and setup points + contours arrays */ + if ( FT_QNEW_ARRAY( glyph->points, outline->n_points ) || + FT_QNEW_ARRAY( glyph->contours, outline->n_contours ) ) + goto Exit; + + glyph->num_points = (FT_UInt)outline->n_points; + glyph->num_contours = (FT_UInt)outline->n_contours; + + { + FT_UInt first = 0, next, n; + PSH_Point points = glyph->points; + PSH_Contour contour = glyph->contours; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + FT_UInt count; + PSH_Point point; + + + next = (FT_UInt)outline->contours[n] + 1; + count = next - first; + + contour->start = points + first; + contour->count = count; + + if ( count > 0 ) + { + point = points + first; + + point->prev = points + next - 1; + point->contour = contour; + + for ( ; count > 1; count-- ) + { + point[0].next = point + 1; + point[1].prev = point; + point++; + point->contour = contour; + } + point->next = points + first; + } + + contour++; + first = next; + } + } + + { + PSH_Point points = glyph->points; + PSH_Point point = points; + FT_Vector* vec = outline->points; + FT_UInt n; + + + for ( n = 0; n < glyph->num_points; n++, point++ ) + { + FT_Int n_prev = (FT_Int)( point->prev - points ); + FT_Int n_next = (FT_Int)( point->next - points ); + FT_Pos dxi, dyi, dxo, dyo; + + + point->flags = 0; + if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) + psh_point_set_off( point ); + + dxi = vec[n].x - vec[n_prev].x; + dyi = vec[n].y - vec[n_prev].y; + + point->dir_in = psh_compute_dir( dxi, dyi ); + + dxo = vec[n_next].x - vec[n].x; + dyo = vec[n_next].y - vec[n].y; + + point->dir_out = psh_compute_dir( dxo, dyo ); + + /* detect smooth points */ + if ( psh_point_is_off( point ) ) + psh_point_set_smooth( point ); + + else if ( point->dir_in == point->dir_out ) + { + if ( point->dir_out != PSH_DIR_NONE || + psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) + psh_point_set_smooth( point ); + } + } + } + + glyph->outline = outline; + glyph->globals = globals; + +#ifdef COMPUTE_INFLEXS + psh_glyph_load_points( glyph, 0 ); + psh_glyph_compute_inflections( glyph ); +#endif /* COMPUTE_INFLEXS */ + + /* now deal with hints tables */ + error = psh_hint_table_init( &glyph->hint_tables [0], + &ps_hints->dimension[0].hints, + &ps_hints->dimension[0].masks, + &ps_hints->dimension[0].counters, + memory ); + if ( error ) + goto Exit; + + error = psh_hint_table_init( &glyph->hint_tables [1], + &ps_hints->dimension[1].hints, + &ps_hints->dimension[1].masks, + &ps_hints->dimension[1].counters, + memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* compute all extrema in a glyph for a given dimension */ + static void + psh_glyph_compute_extrema( PSH_Glyph glyph ) + { + FT_UInt n; + + + /* first of all, compute all local extrema */ + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first = glyph->contours[n].start; + PSH_Point point, before, after; + + + if ( glyph->contours[n].count == 0 ) + continue; + + point = first; + before = point; + + do + { + before = before->prev; + if ( before == first ) + goto Skip; + + } while ( before->org_u == point->org_u ); + + first = point = before->next; + + for (;;) + { + after = point; + do + { + after = after->next; + if ( after == first ) + goto Next; + + } while ( after->org_u == point->org_u ); + + if ( before->org_u < point->org_u ) + { + if ( after->org_u < point->org_u ) + { + /* local maximum */ + goto Extremum; + } + } + else /* before->org_u > point->org_u */ + { + if ( after->org_u > point->org_u ) + { + /* local minimum */ + Extremum: + do + { + psh_point_set_extremum( point ); + point = point->next; + + } while ( point != after ); + } + } + + before = after->prev; + point = after; + + } /* for */ + + Next: + ; + } + + /* for each extremum, determine its direction along the */ + /* orthogonal axis */ + for ( n = 0; n < glyph->num_points; n++ ) + { + PSH_Point point, before, after; + + + point = &glyph->points[n]; + before = point; + after = point; + + if ( psh_point_is_extremum( point ) ) + { + do + { + before = before->prev; + if ( before == point ) + goto Skip; + + } while ( before->org_v == point->org_v ); + + do + { + after = after->next; + if ( after == point ) + goto Skip; + + } while ( after->org_v == point->org_v ); + } + + if ( before->org_v < point->org_v && + after->org_v > point->org_v ) + { + psh_point_set_positive( point ); + } + else if ( before->org_v > point->org_v && + after->org_v < point->org_v ) + { + psh_point_set_negative( point ); + } + + Skip: + ; + } + } + + + /* the min and max are based on contour orientation and fill rule */ + static void + psh_hint_table_find_strong_points( PSH_Hint_Table table, + PSH_Point point, + FT_UInt count, + FT_Int threshold, + PSH_Dir major_dir ) + { + PSH_Hint* sort = table->sort; + FT_UInt num_hints = table->num_hints; + + + for ( ; count > 0; count--, point++ ) + { + PSH_Dir point_dir; + FT_Pos org_u = point->org_u; + + + if ( psh_point_is_strong( point ) ) + continue; + + point_dir = + (PSH_Dir)( ( point->dir_in | point->dir_out ) & major_dir ); + + if ( point_dir & ( PSH_DIR_DOWN | PSH_DIR_RIGHT ) ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + break; + } + } + } + else if ( point_dir & ( PSH_DIR_UP | PSH_DIR_LEFT ) ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + break; + } + } + } + +#if 1 + else if ( psh_point_is_extremum( point ) ) + { + /* treat extrema as special cases for stem edge alignment */ + FT_UInt nn, min_flag, max_flag; + + + if ( major_dir == PSH_DIR_HORIZONTAL ) + { + min_flag = PSH_POINT_POSITIVE; + max_flag = PSH_POINT_NEGATIVE; + } + else + { + min_flag = PSH_POINT_NEGATIVE; + max_flag = PSH_POINT_POSITIVE; + } + + if ( point->flags2 & min_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + else if ( point->flags2 & max_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + + if ( !point->hint ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + + + if ( org_u >= hint->org_pos && + org_u <= ADD_INT( hint->org_pos, hint->org_len ) ) + { + point->hint = hint; + break; + } + } + } + } + +#endif /* 1 */ + } + } + + + /* the accepted shift for strong points in fractional pixels */ +#define PSH_STRONG_THRESHOLD 32 + + /* the maximum shift value in font units tuned to distinguish */ + /* between stems and serifs in URW+ font collection */ +#define PSH_STRONG_THRESHOLD_MAXIMUM 12 + + + /* find strong points in a glyph */ + static void + psh_glyph_find_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + /* a point is `strong' if it is located on a stem edge and */ + /* has an `in' or `out' tangent parallel to the hint's direction */ + + PSH_Hint_Table table = &glyph->hint_tables[dimension]; + PS_Mask mask = table->hint_masks->masks; + FT_UInt num_masks = table->hint_masks->num_masks; + FT_UInt first = 0; + PSH_Dir major_dir = ( dimension == 0 ) ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Int threshold; + + + threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); + if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) + threshold = PSH_STRONG_THRESHOLD_MAXIMUM; + + /* process secondary hints to `selected' points */ + if ( num_masks > 1 && glyph->num_points > 0 ) + { + /* the `endchar' op can reduce the number of points */ + first = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; + mask++; + for ( ; num_masks > 1; num_masks--, mask++ ) + { + FT_UInt next = FT_MIN( mask->end_point, glyph->num_points ); + + + if ( next > first ) + { + FT_UInt count = next - first; + PSH_Point point = glyph->points + first; + + + psh_hint_table_activate_mask( table, mask ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + first = next; + } + } + + /* process primary hints for all points */ + if ( num_masks == 1 ) + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + psh_hint_table_activate_mask( table, table->hint_masks->masks ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + + /* now, certain points may have been attached to a hint and */ + /* not marked as strong; update their flags then */ + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + if ( point->hint && !psh_point_is_strong( point ) ) + psh_point_set_strong( point ); + } + } + + + /* find points in a glyph which are in a blue zone and have `in' or */ + /* `out' tangents parallel to the horizontal axis */ + static void + psh_glyph_find_blue_points( PSH_Blues blues, + PSH_Glyph glyph ) + { + PSH_Blue_Table table; + PSH_Blue_Zone zone; + FT_UInt glyph_count = glyph->num_points; + FT_UInt blue_count; + PSH_Point point = glyph->points; + + + for ( ; glyph_count > 0; glyph_count--, point++ ) + { + FT_Pos y; + + + /* check tangents */ + if ( !( point->dir_in & PSH_DIR_HORIZONTAL ) && + !( point->dir_out & PSH_DIR_HORIZONTAL ) ) + continue; + + /* skip strong points */ + if ( psh_point_is_strong( point ) ) + continue; + + y = point->org_u; + + /* look up top zones */ + table = &blues->normal_top; + blue_count = table->count; + zone = table->zones; + + for ( ; blue_count > 0; blue_count--, zone++ ) + { + FT_Pos delta = y - zone->org_bottom; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y <= zone->org_top + blues->blue_fuzz ) + if ( blues->no_overshoots || delta <= blues->blue_threshold ) + { + point->cur_u = zone->cur_bottom; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + + /* look up bottom zones */ + table = &blues->normal_bottom; + blue_count = table->count; + zone = table->zones + blue_count - 1; + + for ( ; blue_count > 0; blue_count--, zone-- ) + { + FT_Pos delta = zone->org_top - y; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y >= zone->org_bottom - blues->blue_fuzz ) + if ( blues->no_overshoots || delta < blues->blue_threshold ) + { + point->cur_u = zone->cur_top; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + } + } + + + /* interpolate strong points with the help of hinted coordinates */ + static void + psh_glyph_interpolate_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + { + PSH_Hint hint = point->hint; + + + if ( hint ) + { + FT_Pos delta; + + + if ( psh_point_is_edge_min( point ) ) + point->cur_u = hint->cur_pos; + + else if ( psh_point_is_edge_max( point ) ) + point->cur_u = hint->cur_pos + hint->cur_len; + + else + { + delta = point->org_u - hint->org_pos; + + if ( delta <= 0 ) + point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); + + else if ( delta >= hint->org_len ) + point->cur_u = hint->cur_pos + hint->cur_len + + FT_MulFix( delta - hint->org_len, scale ); + + else /* hint->org_len > 0 */ + point->cur_u = hint->cur_pos + + FT_MulDiv( delta, hint->cur_len, + hint->org_len ); + } + psh_point_set_fitted( point ); + } + } + } + + +#define PSH_MAX_STRONG_INTERNAL 16 + + static void + psh_glyph_interpolate_normal_points( PSH_Glyph glyph, + FT_Int dimension ) + { + +#if 1 + /* first technique: a point is strong if it is a local extremum */ + + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Memory memory = glyph->memory; + + PSH_Point* strongs = NULL; + PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; + FT_UInt num_strongs = 0; + + PSH_Point points = glyph->points; + PSH_Point points_end = points + glyph->num_points; + PSH_Point point; + + + /* first count the number of strong points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + num_strongs++; + } + + if ( num_strongs == 0 ) /* nothing to do here */ + return; + + /* allocate an array to store a list of points, */ + /* stored in increasing org_u order */ + if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) + strongs = strongs_0; + else + { + FT_Error error; + + + if ( FT_QNEW_ARRAY( strongs, num_strongs ) ) + return; + } + + num_strongs = 0; + for ( point = points; point < points_end; point++ ) + { + PSH_Point* insert; + + + if ( !psh_point_is_strong( point ) ) + continue; + + for ( insert = strongs + num_strongs; insert > strongs; insert-- ) + { + if ( insert[-1]->org_u <= point->org_u ) + break; + + insert[0] = insert[-1]; + } + insert[0] = point; + num_strongs++; + } + + /* now try to interpolate all normal points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + continue; + + /* sometimes, some local extrema are smooth points */ + if ( psh_point_is_smooth( point ) ) + { + if ( point->dir_in == PSH_DIR_NONE || + point->dir_in != point->dir_out ) + continue; + + if ( !psh_point_is_extremum( point ) && + !psh_point_is_inflex( point ) ) + continue; + + point->flags &= ~PSH_POINT_SMOOTH; + } + + /* find best enclosing point coordinates then interpolate */ + { + PSH_Point before, after; + FT_UInt nn; + + + for ( nn = 0; nn < num_strongs; nn++ ) + if ( strongs[nn]->org_u > point->org_u ) + break; + + if ( nn == 0 ) /* point before the first strong point */ + { + after = strongs[0]; + + point->cur_u = after->cur_u + + FT_MulFix( point->org_u - after->org_u, + scale ); + } + else + { + before = strongs[nn - 1]; + + for ( nn = num_strongs; nn > 0; nn-- ) + if ( strongs[nn - 1]->org_u < point->org_u ) + break; + + if ( nn == num_strongs ) /* point is after last strong point */ + { + before = strongs[nn - 1]; + + point->cur_u = before->cur_u + + FT_MulFix( point->org_u - before->org_u, + scale ); + } + else + { + FT_Pos u; + + + after = strongs[nn]; + + /* now interpolate point between before and after */ + u = point->org_u; + + if ( u == before->org_u ) + point->cur_u = before->cur_u; + + else if ( u == after->org_u ) + point->cur_u = after->cur_u; + + else + point->cur_u = before->cur_u + + FT_MulDiv( u - before->org_u, + after->cur_u - before->cur_u, + after->org_u - before->org_u ); + } + } + psh_point_set_fitted( point ); + } + } + + if ( strongs != strongs_0 ) + FT_FREE( strongs ); + +#endif /* 1 */ + + } + + + /* interpolate other points */ + static void + psh_glyph_interpolate_other_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + PSH_Contour contour = glyph->contours; + FT_UInt num_contours = glyph->num_contours; + + + for ( ; num_contours > 0; num_contours--, contour++ ) + { + PSH_Point start = contour->start; + PSH_Point first, next, point; + FT_UInt fit_count; + + + /* count the number of strong points in this contour */ + next = start + contour->count; + fit_count = 0; + first = NULL; + + for ( point = start; point < next; point++ ) + if ( psh_point_is_fitted( point ) ) + { + if ( !first ) + first = point; + + fit_count++; + } + + /* if there are less than 2 fitted points in the contour, we */ + /* simply scale and eventually translate the contour points */ + if ( fit_count < 2 ) + { + if ( fit_count == 1 ) + delta = first->cur_u - FT_MulFix( first->org_u, scale ); + + for ( point = start; point < next; point++ ) + if ( point != first ) + point->cur_u = FT_MulFix( point->org_u, scale ) + delta; + + goto Next_Contour; + } + + /* there are more than 2 strong points in this contour; we */ + /* need to interpolate weak points between them */ + start = first; + do + { + /* skip consecutive fitted points */ + for (;;) + { + next = first->next; + if ( next == start ) + goto Next_Contour; + + if ( !psh_point_is_fitted( next ) ) + break; + + first = next; + } + + /* find next fitted point after unfitted one */ + for (;;) + { + next = next->next; + if ( psh_point_is_fitted( next ) ) + break; + } + + /* now interpolate between them */ + { + FT_Pos org_a, org_ab, cur_a, cur_ab; + FT_Pos org_c, org_ac, cur_c; + FT_Fixed scale_ab; + + + if ( first->org_u <= next->org_u ) + { + org_a = first->org_u; + cur_a = first->cur_u; + org_ab = next->org_u - org_a; + cur_ab = next->cur_u - cur_a; + } + else + { + org_a = next->org_u; + cur_a = next->cur_u; + org_ab = first->org_u - org_a; + cur_ab = first->cur_u - cur_a; + } + + scale_ab = 0x10000L; + if ( org_ab > 0 ) + scale_ab = FT_DivFix( cur_ab, org_ab ); + + point = first->next; + do + { + org_c = point->org_u; + org_ac = org_c - org_a; + + if ( org_ac <= 0 ) + { + /* on the left of the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale ); + } + else if ( org_ac >= org_ab ) + { + /* on the right on the interpolation zone */ + cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); + } + else + { + /* within the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); + } + + point->cur_u = cur_c; + + point = point->next; + + } while ( point != next ); + } + + /* keep going until all points in the contours have been processed */ + first = next; + + } while ( first != start ); + + Next_Contour: + ; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HIGH-LEVEL INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + PSH_GlyphRec glyphrec; + PSH_Glyph glyph = &glyphrec; + FT_Error error; +#ifdef DEBUG_HINTER + FT_Memory memory; +#endif + FT_Int dimension; + + + /* something to do? */ + if ( outline->n_points == 0 || outline->n_contours == 0 ) + return FT_Err_Ok; + +#ifdef DEBUG_HINTER + + memory = globals->memory; + + if ( ps_debug_glyph ) + { + psh_glyph_done( ps_debug_glyph ); + FT_FREE( ps_debug_glyph ); + } + + if ( FT_NEW( glyph ) ) + return error; + + ps_debug_glyph = glyph; + +#endif /* DEBUG_HINTER */ + + error = psh_glyph_init( glyph, outline, ps_hints, globals ); + if ( error ) + goto Exit; + + /* try to optimize the y_scale so that the top of non-capital letters + * is aligned on a pixel boundary whenever possible + */ + { + PSH_Dimension dim_x = &glyph->globals->dimension[0]; + PSH_Dimension dim_y = &glyph->globals->dimension[1]; + + FT_Fixed x_scale = dim_x->scale_mult; + FT_Fixed y_scale = dim_y->scale_mult; + + FT_Fixed old_x_scale = x_scale; + FT_Fixed old_y_scale = y_scale; + + FT_Fixed scaled = 0; + FT_Fixed fitted = 0; + + FT_Bool rescale = FALSE; + + + if ( globals->blues.normal_top.count ) + { + scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); + fitted = FT_PIX_ROUND( scaled ); + } + + if ( fitted != 0 && scaled != fitted ) + { + rescale = TRUE; + + y_scale = FT_MulDiv( y_scale, fitted, scaled ); + + if ( fitted < scaled ) + x_scale -= x_scale / 50; + + psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); + } + + glyph->do_horz_hints = 1; + glyph->do_vert_hints = 1; + + glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD ); + + glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD_V ); + + glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); + + for ( dimension = 0; dimension < 2; dimension++ ) + { + /* load outline coordinates into glyph */ + psh_glyph_load_points( glyph, dimension ); + + /* compute local extrema */ + psh_glyph_compute_extrema( glyph ); + + /* compute aligned stem/hints positions */ + psh_hint_table_align_hints( &glyph->hint_tables[dimension], + glyph->globals, + dimension, + glyph ); + + /* find strong points, align them, then interpolate others */ + psh_glyph_find_strong_points( glyph, dimension ); + if ( dimension == 1 ) + psh_glyph_find_blue_points( &globals->blues, glyph ); + psh_glyph_interpolate_strong_points( glyph, dimension ); + psh_glyph_interpolate_normal_points( glyph, dimension ); + psh_glyph_interpolate_other_points( glyph, dimension ); + + /* save hinted coordinates back to outline */ + psh_glyph_save_points( glyph, dimension ); + + if ( rescale ) + psh_globals_set_scale( glyph->globals, + old_x_scale, old_y_scale, 0, 0 ); + } + } + + Exit: + +#ifndef DEBUG_HINTER + psh_glyph_done( glyph ); +#endif + + return error; + } + + +/* END */ diff --git a/external/freetype/src/pshinter/pshalgo.h b/external/freetype/src/pshinter/pshalgo.h new file mode 100644 index 000000000..3f0ba28a6 --- /dev/null +++ b/external/freetype/src/pshinter/pshalgo.h @@ -0,0 +1,233 @@ +/**************************************************************************** + * + * pshalgo.h + * + * PostScript hinting algorithm (specification). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSHALGO_H_ +#define PSHALGO_H_ + + +#include "pshrec.h" +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /* handle to Hint structure */ + typedef struct PSH_HintRec_* PSH_Hint; + + + /* hint bit-flags */ +#define PSH_HINT_GHOST PS_HINT_FLAG_GHOST +#define PSH_HINT_BOTTOM PS_HINT_FLAG_BOTTOM +#define PSH_HINT_ACTIVE 4U +#define PSH_HINT_FITTED 8U + + +#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) +#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) +#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) + +#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE +#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE +#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED + + + /* hint structure */ + typedef struct PSH_HintRec_ + { + FT_Int org_pos; + FT_Int org_len; + FT_Pos cur_pos; + FT_Pos cur_len; + FT_UInt flags; + PSH_Hint parent; + FT_Int order; + + } PSH_HintRec; + + + /* this is an interpolation zone used for strong points; */ + /* weak points are interpolated according to their strong */ + /* neighbours */ + typedef struct PSH_ZoneRec_ + { + FT_Fixed scale; + FT_Fixed delta; + FT_Pos min; + FT_Pos max; + + } PSH_ZoneRec, *PSH_Zone; + + + typedef struct PSH_Hint_TableRec_ + { + FT_UInt max_hints; + FT_UInt num_hints; + PSH_Hint hints; + PSH_Hint* sort; + PSH_Hint* sort_global; + FT_UInt num_zones; + PSH_ZoneRec* zones; + PSH_Zone zone; + PS_Mask_Table hint_masks; + PS_Mask_Table counter_masks; + + } PSH_Hint_TableRec, *PSH_Hint_Table; + + + typedef struct PSH_PointRec_* PSH_Point; + typedef struct PSH_ContourRec_* PSH_Contour; + + typedef enum PSH_Dir_ + { + PSH_DIR_NONE = 0, + PSH_DIR_UP = 1, + PSH_DIR_DOWN = 2, + PSH_DIR_VERTICAL = 1 | 2, + PSH_DIR_LEFT = 4, + PSH_DIR_RIGHT = 8, + PSH_DIR_HORIZONTAL = 4 | 8 + + } PSH_Dir; + + + /* the following bit-flags are computed once by the glyph */ + /* analyzer, for both dimensions */ +#define PSH_POINT_OFF 1U /* point is off the curve */ +#define PSH_POINT_SMOOTH 2U /* point is smooth */ +#define PSH_POINT_INFLEX 4U /* point is inflection */ + + +#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) +#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) +#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) + +#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH +#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF +#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX + + + /* the following bit-flags are re-computed for each dimension */ +#define PSH_POINT_STRONG 16U /* point is strong */ +#define PSH_POINT_FITTED 32U /* point is already fitted */ +#define PSH_POINT_EXTREMUM 64U /* point is local extremum */ +#define PSH_POINT_POSITIVE 128U /* extremum has positive contour flow */ +#define PSH_POINT_NEGATIVE 256U /* extremum has negative contour flow */ +#define PSH_POINT_EDGE_MIN 512U /* point is aligned to left/bottom stem edge */ +#define PSH_POINT_EDGE_MAX 1024U /* point is aligned to top/right stem edge */ + + +#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) +#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) +#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) +#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) +#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) +#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) +#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) + +#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG +#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED +#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM +#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE +#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE +#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN +#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX + + + typedef struct PSH_PointRec_ + { + PSH_Point prev; + PSH_Point next; + PSH_Contour contour; + FT_UInt flags; + FT_UInt flags2; + PSH_Dir dir_in; + PSH_Dir dir_out; + PSH_Hint hint; + FT_Pos org_u; + FT_Pos org_v; + FT_Pos cur_u; +#ifdef DEBUG_HINTER + FT_Pos org_x; + FT_Pos cur_x; + FT_Pos org_y; + FT_Pos cur_y; + FT_UInt flags_x; + FT_UInt flags_y; +#endif + + } PSH_PointRec; + + + typedef struct PSH_ContourRec_ + { + PSH_Point start; + FT_UInt count; + + } PSH_ContourRec; + + + typedef struct PSH_GlyphRec_ + { + FT_UInt num_points; + FT_UInt num_contours; + + PSH_Point points; + PSH_Contour contours; + + FT_Memory memory; + FT_Outline* outline; + PSH_Globals globals; + PSH_Hint_TableRec hint_tables[2]; + + FT_Bool do_horz_hints; + FT_Bool do_vert_hints; + FT_Bool do_horz_snapping; + FT_Bool do_vert_snapping; + FT_Bool do_stem_adjust; + + } PSH_GlyphRec, *PSH_Glyph; + + +#ifdef DEBUG_HINTER + extern PSH_Hint_Table ps_debug_hint_table; + + typedef void + (*PSH_HintFunc)( PSH_Hint hint, + FT_Bool vertical ); + + extern PSH_HintFunc ps_debug_hint_func; + + extern PSH_Glyph ps_debug_glyph; +#endif + + + extern FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + +FT_END_HEADER + + +#endif /* PSHALGO_H_ */ + + +/* END */ diff --git a/external/freetype/src/pshinter/pshglob.c b/external/freetype/src/pshinter/pshglob.c new file mode 100644 index 000000000..d4c5eb32b --- /dev/null +++ b/external/freetype/src/pshinter/pshglob.c @@ -0,0 +1,795 @@ +/**************************************************************************** + * + * pshglob.c + * + * PostScript hinter global hinting management (body). + * Inspired by the new auto-hinter module. + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used + * modified and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftcalc.h> +#include "pshglob.h" + +#ifdef DEBUG_HINTER + PSH_Globals ps_debug_globals = NULL; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STANDARD WIDTHS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* scale the widths/heights table */ + static void + psh_globals_scale_widths( PSH_Globals globals, + FT_UInt direction ) + { + PSH_Dimension dim = &globals->dimension[direction]; + PSH_Widths stdw = &dim->stdw; + FT_UInt count = stdw->count; + PSH_Width width = stdw->widths; + PSH_Width stand = width; /* standard width/height */ + FT_Fixed scale = dim->scale_mult; + + + if ( count > 0 ) + { + width->cur = FT_MulFix( width->org, scale ); + width->fit = FT_PIX_ROUND( width->cur ); + + width++; + count--; + + for ( ; count > 0; count--, width++ ) + { + FT_Pos w, dist; + + + w = FT_MulFix( width->org, scale ); + dist = w - stand->cur; + + if ( dist < 0 ) + dist = -dist; + + if ( dist < 128 ) + w = stand->cur; + + width->cur = w; + width->fit = FT_PIX_ROUND( w ); + } + } + } + + +#if 0 + + /* org_width is in font units, result in device pixels, 26.6 format */ + FT_LOCAL_DEF( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ) + { + FT_UInt n; + FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + + + for ( n = 0; n < dimension->stdw.count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = dimension->stdw.widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + if ( width >= reference ) + { + width -= 0x21; + if ( width < reference ) + width = reference; + } + else + { + width += 0x21; + if ( width > reference ) + width = reference; + } + + return width; + } + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BLUE ZONES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_blues_set_zones_0( PSH_Blues target, + FT_Bool is_others, + FT_UInt read_count, + FT_Short* read, + PSH_Blue_Table top_table, + PSH_Blue_Table bot_table ) + { + FT_UInt count_top = top_table->count; + FT_UInt count_bot = bot_table->count; + FT_Bool first = 1; + + FT_UNUSED( target ); + + + for ( ; read_count > 1; read_count -= 2 ) + { + FT_Int reference, delta; + FT_UInt count; + PSH_Blue_Zone zones, zone; + FT_Bool top; + + + /* read blue zone entry, and select target top/bottom zone */ + top = 0; + if ( first || is_others ) + { + reference = read[1]; + delta = read[0] - reference; + + zones = bot_table->zones; + count = count_bot; + first = 0; + } + else + { + reference = read[0]; + delta = read[1] - reference; + + zones = top_table->zones; + count = count_top; + top = 1; + } + + /* insert into sorted table */ + zone = zones; + for ( ; count > 0; count--, zone++ ) + { + if ( reference < zone->org_ref ) + break; + + if ( reference == zone->org_ref ) + { + FT_Int delta0 = zone->org_delta; + + + /* we have two zones on the same reference position -- */ + /* only keep the largest one */ + if ( delta < 0 ) + { + if ( delta < delta0 ) + zone->org_delta = delta; + } + else + { + if ( delta > delta0 ) + zone->org_delta = delta; + } + goto Skip; + } + } + + for ( ; count > 0; count-- ) + zone[count] = zone[count-1]; + + zone->org_ref = reference; + zone->org_delta = delta; + + if ( top ) + count_top++; + else + count_bot++; + + Skip: + read += 2; + } + + top_table->count = count_top; + bot_table->count = count_bot; + } + + + /* Re-read blue zones from the original fonts and store them into our */ + /* private structure. This function re-orders, sanitizes, and */ + /* fuzz-expands the zones as well. */ + static void + psh_blues_set_zones( PSH_Blues target, + FT_UInt count, + FT_Short* blues, + FT_UInt count_others, + FT_Short* other_blues, + FT_Int fuzz, + FT_Int family ) + { + PSH_Blue_Table top_table, bot_table; + FT_UInt count_top, count_bot; + + + if ( family ) + { + top_table = &target->family_top; + bot_table = &target->family_bottom; + } + else + { + top_table = &target->normal_top; + bot_table = &target->normal_bottom; + } + + /* read the input blue zones, and build two sorted tables */ + /* (one for the top zones, the other for the bottom zones) */ + top_table->count = 0; + bot_table->count = 0; + + /* first, the blues */ + psh_blues_set_zones_0( target, 0, + count, blues, top_table, bot_table ); + psh_blues_set_zones_0( target, 1, + count_others, other_blues, top_table, bot_table ); + + count_top = top_table->count; + count_bot = bot_table->count; + + /* sanitize top table */ + if ( count_top > 0 ) + { + PSH_Blue_Zone zone = top_table->zones; + + + for ( count = count_top; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[1].org_ref - zone[0].org_ref; + if ( zone->org_delta > delta ) + zone->org_delta = delta; + } + + zone->org_bottom = zone->org_ref; + zone->org_top = zone->org_delta + zone->org_ref; + } + } + + /* sanitize bottom table */ + if ( count_bot > 0 ) + { + PSH_Blue_Zone zone = bot_table->zones; + + + for ( count = count_bot; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[0].org_ref - zone[1].org_ref; + if ( zone->org_delta < delta ) + zone->org_delta = delta; + } + + zone->org_top = zone->org_ref; + zone->org_bottom = zone->org_delta + zone->org_ref; + } + } + + /* expand top and bottom tables with blue fuzz */ + { + FT_Int dim, top, bot, delta; + PSH_Blue_Zone zone; + + + zone = top_table->zones; + count = count_top; + + for ( dim = 1; dim >= 0; dim-- ) + { + if ( count > 0 ) + { + /* expand the bottom of the lowest zone normally */ + zone->org_bottom -= fuzz; + + /* expand the top and bottom of intermediate zones; */ + /* checking that the interval is smaller than the fuzz */ + top = zone->org_top; + + for ( count--; count > 0; count-- ) + { + bot = zone[1].org_bottom; + delta = bot - top; + + if ( delta / 2 < fuzz ) + zone[0].org_top = zone[1].org_bottom = top + delta / 2; + else + { + zone[0].org_top = top + fuzz; + zone[1].org_bottom = bot - fuzz; + } + + zone++; + top = zone->org_top; + } + + /* expand the top of the highest zone normally */ + zone->org_top = top + fuzz; + } + zone = bot_table->zones; + count = count_bot; + } + } + } + + + /* reset the blues table when the device transform changes */ + static void + psh_blues_scale_zones( PSH_Blues blues, + FT_Fixed scale, + FT_Pos delta ) + { + FT_UInt count; + FT_UInt num; + PSH_Blue_Table table = NULL; + + /* */ + /* Determine whether we need to suppress overshoots or */ + /* not. We simply need to compare the vertical scale */ + /* parameter to the raw bluescale value. Here is why: */ + /* */ + /* We need to suppress overshoots for all pointsizes. */ + /* At 300dpi that satisfies: */ + /* */ + /* pointsize < 240*bluescale + 0.49 */ + /* */ + /* This corresponds to: */ + /* */ + /* pixelsize < 1000*bluescale + 49/24 */ + /* */ + /* scale*EM_Size < 1000*bluescale + 49/24 */ + /* */ + /* However, for normal Type 1 fonts, EM_Size is 1000! */ + /* We thus only check: */ + /* */ + /* scale < bluescale + 49/24000 */ + /* */ + /* which we shorten to */ + /* */ + /* "scale < bluescale" */ + /* */ + /* Note that `blue_scale' is stored 1000 times its real */ + /* value, and that `scale' converts from font units to */ + /* fractional pixels. */ + /* */ + + /* 1000 / 64 = 125 / 8 */ + if ( scale >= 0x20C49BAL ) + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); + else + blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); + + /* */ + /* The blue threshold is the font units distance under */ + /* which overshoots are suppressed due to the BlueShift */ + /* even if the scale is greater than BlueScale. */ + /* */ + /* It is the smallest distance such that */ + /* */ + /* dist <= BlueShift && dist*scale <= 0.5 pixels */ + /* */ + { + FT_Int threshold = blues->blue_shift; + + + while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) + threshold--; + + blues->blue_threshold = threshold; + } + + for ( num = 0; num < 4; num++ ) + { + PSH_Blue_Zone zone; + + + switch ( num ) + { + case 0: + table = &blues->normal_top; + break; + case 1: + table = &blues->normal_bottom; + break; + case 2: + table = &blues->family_top; + break; + default: + table = &blues->family_bottom; + break; + } + + zone = table->zones; + count = table->count; + for ( ; count > 0; count--, zone++ ) + { + zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; + zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; + zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; + zone->cur_delta = FT_MulFix( zone->org_delta, scale ); + + /* round scaled reference position */ + zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); + +#if 0 + if ( zone->cur_ref > zone->cur_top ) + zone->cur_ref -= 64; + else if ( zone->cur_ref < zone->cur_bottom ) + zone->cur_ref += 64; +#endif + } + } + + /* process the families now */ + + for ( num = 0; num < 2; num++ ) + { + PSH_Blue_Zone zone1, zone2; + FT_UInt count1, count2; + PSH_Blue_Table normal, family; + + + switch ( num ) + { + case 0: + normal = &blues->normal_top; + family = &blues->family_top; + break; + + default: + normal = &blues->normal_bottom; + family = &blues->family_bottom; + } + + zone1 = normal->zones; + count1 = normal->count; + + for ( ; count1 > 0; count1--, zone1++ ) + { + /* try to find a family zone whose reference position is less */ + /* than 1 pixel far from the current zone */ + zone2 = family->zones; + count2 = family->count; + + for ( ; count2 > 0; count2--, zone2++ ) + { + FT_Pos Delta; + + + Delta = zone1->org_ref - zone2->org_ref; + if ( Delta < 0 ) + Delta = -Delta; + + if ( FT_MulFix( Delta, scale ) < 64 ) + { + zone1->cur_top = zone2->cur_top; + zone1->cur_bottom = zone2->cur_bottom; + zone1->cur_ref = zone2->cur_ref; + zone1->cur_delta = zone2->cur_delta; + break; + } + } + } + } + } + + + /* calculate the maximum height of given blue zones */ + static FT_Short + psh_calc_max_height( FT_UInt num, + const FT_Short* values, + FT_Short cur_max ) + { + FT_UInt count; + + + for ( count = 0; count < num; count += 2 ) + { + FT_Short cur_height = values[count + 1] - values[count]; + + + if ( cur_height > cur_max ) + cur_max = cur_height; + } + + return cur_max; + } + + + FT_LOCAL_DEF( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ) + { + PSH_Blue_Table table; + FT_UInt count; + FT_Pos delta; + PSH_Blue_Zone zone; + FT_Int no_shoots; + + + alignment->align = PSH_BLUE_ALIGN_NONE; + + no_shoots = blues->no_overshoots; + + /* look up stem top in top zones table */ + table = &blues->normal_top; + count = table->count; + zone = table->zones; + + for ( ; count > 0; count--, zone++ ) + { + delta = SUB_LONG( stem_top, zone->org_bottom ); + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_top <= zone->org_top + blues->blue_fuzz ) + { + if ( no_shoots || delta <= blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_TOP; + alignment->align_top = zone->cur_ref; + } + break; + } + } + + /* look up stem bottom in bottom zones table */ + table = &blues->normal_bottom; + count = table->count; + zone = table->zones + count-1; + + for ( ; count > 0; count--, zone-- ) + { + delta = SUB_LONG( zone->org_top, stem_bot ); + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) + { + if ( no_shoots || delta < blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_BOT; + alignment->align_bot = zone->cur_ref; + } + break; + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_globals_destroy( PSH_Globals globals ) + { + if ( globals ) + { + FT_Memory memory; + + + memory = globals->memory; + globals->dimension[0].stdw.count = 0; + globals->dimension[1].stdw.count = 0; + + globals->blues.normal_top.count = 0; + globals->blues.normal_bottom.count = 0; + globals->blues.family_top.count = 0; + globals->blues.family_bottom.count = 0; + + FT_FREE( globals ); + +#ifdef DEBUG_HINTER + ps_debug_globals = NULL; +#endif + } + } + + + static FT_Error + psh_globals_new( FT_Memory memory, + T1_Private* priv, + PSH_Globals *aglobals ) + { + PSH_Globals globals = NULL; + FT_Error error; + + + if ( !FT_QNEW( globals ) ) + { + FT_UInt count; + FT_Short* read; + + + globals->memory = memory; + + /* copy standard widths */ + { + PSH_Dimension dim = &globals->dimension[1]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_width[0]; + write++; + + read = priv->snap_widths; + for ( count = priv->num_snap_widths; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_widths + 1; + } + + /* copy standard heights */ + { + PSH_Dimension dim = &globals->dimension[0]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_height[0]; + write++; + read = priv->snap_heights; + for ( count = priv->num_snap_heights; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_heights + 1; + } + + /* copy blue zones */ + psh_blues_set_zones( &globals->blues, priv->num_blue_values, + priv->blue_values, priv->num_other_blues, + priv->other_blues, priv->blue_fuzz, 0 ); + + psh_blues_set_zones( &globals->blues, priv->num_family_blues, + priv->family_blues, priv->num_family_other_blues, + priv->family_other_blues, priv->blue_fuzz, 1 ); + + /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */ + { + FT_Fixed max_scale; + FT_Short max_height = 1; + + + max_height = psh_calc_max_height( priv->num_blue_values, + priv->blue_values, + max_height ); + max_height = psh_calc_max_height( priv->num_other_blues, + priv->other_blues, + max_height ); + max_height = psh_calc_max_height( priv->num_family_blues, + priv->family_blues, + max_height ); + max_height = psh_calc_max_height( priv->num_family_other_blues, + priv->family_other_blues, + max_height ); + + /* BlueScale is scaled 1000 times */ + max_scale = FT_DivFix( 1000, max_height ); + globals->blues.blue_scale = priv->blue_scale < max_scale + ? priv->blue_scale + : max_scale; + } + + globals->blues.blue_shift = priv->blue_shift; + globals->blues.blue_fuzz = priv->blue_fuzz; + + globals->dimension[0].scale_mult = 0; + globals->dimension[0].scale_delta = 0; + globals->dimension[1].scale_mult = 0; + globals->dimension[1].scale_delta = 0; + +#ifdef DEBUG_HINTER + ps_debug_globals = globals; +#endif + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ) + { + PSH_Dimension dim; + + + dim = &globals->dimension[0]; + if ( x_scale != dim->scale_mult || + x_delta != dim->scale_delta ) + { + dim->scale_mult = x_scale; + dim->scale_delta = x_delta; + + psh_globals_scale_widths( globals, 0 ); + } + + dim = &globals->dimension[1]; + if ( y_scale != dim->scale_mult || + y_delta != dim->scale_delta ) + { + dim->scale_mult = y_scale; + dim->scale_delta = y_delta; + + psh_globals_scale_widths( globals, 1 ); + psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); + } + } + + + FT_LOCAL_DEF( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) + { + funcs->create = psh_globals_new; + funcs->set_scale = psh_globals_set_scale; + funcs->destroy = psh_globals_destroy; + } + + +/* END */ diff --git a/external/freetype/src/pshinter/pshglob.h b/external/freetype/src/pshinter/pshglob.h new file mode 100644 index 000000000..579eb2148 --- /dev/null +++ b/external/freetype/src/pshinter/pshglob.h @@ -0,0 +1,196 @@ +/**************************************************************************** + * + * pshglob.h + * + * PostScript hinter global hinting management. + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSHGLOB_H_ +#define PSHGLOB_H_ + + +#include <freetype/freetype.h> +#include <freetype/internal/pshints.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @constant: + * PS_GLOBALS_MAX_BLUE_ZONES + * + * @description: + * The maximum number of blue zones in a font global hints structure. + * See @PS_Globals_BluesRec. + */ +#define PS_GLOBALS_MAX_BLUE_ZONES 16 + + + /************************************************************************** + * + * @constant: + * PS_GLOBALS_MAX_STD_WIDTHS + * + * @description: + * The maximum number of standard and snap widths in either the + * horizontal or vertical direction. See @PS_Globals_WidthsRec. + */ +#define PS_GLOBALS_MAX_STD_WIDTHS 16 + + + /* standard and snap width */ + typedef struct PSH_WidthRec_ + { + FT_Int org; + FT_Pos cur; + FT_Pos fit; + + } PSH_WidthRec, *PSH_Width; + + + /* standard and snap widths table */ + typedef struct PSH_WidthsRec_ + { + FT_UInt count; + PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; + + } PSH_WidthsRec, *PSH_Widths; + + + typedef struct PSH_DimensionRec_ + { + PSH_WidthsRec stdw; + FT_Fixed scale_mult; + FT_Fixed scale_delta; + + } PSH_DimensionRec, *PSH_Dimension; + + + /* blue zone descriptor */ + typedef struct PSH_Blue_ZoneRec_ + { + FT_Int org_ref; + FT_Int org_delta; + FT_Int org_top; + FT_Int org_bottom; + + FT_Pos cur_ref; + FT_Pos cur_delta; + FT_Pos cur_bottom; + FT_Pos cur_top; + + } PSH_Blue_ZoneRec, *PSH_Blue_Zone; + + + typedef struct PSH_Blue_TableRec_ + { + FT_UInt count; + PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; + + } PSH_Blue_TableRec, *PSH_Blue_Table; + + + /* blue zones table */ + typedef struct PSH_BluesRec_ + { + PSH_Blue_TableRec normal_top; + PSH_Blue_TableRec normal_bottom; + PSH_Blue_TableRec family_top; + PSH_Blue_TableRec family_bottom; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_threshold; + FT_Int blue_fuzz; + FT_Bool no_overshoots; + + } PSH_BluesRec, *PSH_Blues; + + + /* font globals. */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PSH_GlobalsRec_ + { + FT_Memory memory; + PSH_DimensionRec dimension[2]; + PSH_BluesRec blues; + + } PSH_GlobalsRec; + + +#define PSH_BLUE_ALIGN_NONE 0 +#define PSH_BLUE_ALIGN_TOP 1 +#define PSH_BLUE_ALIGN_BOT 2 + + + typedef struct PSH_AlignmentRec_ + { + int align; + FT_Pos align_top; + FT_Pos align_bot; + + } PSH_AlignmentRec, *PSH_Alignment; + + + FT_LOCAL( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); + + +#if 0 + /* snap a stem width to fitter coordinates. `org_width' is in font */ + /* units. The result is in device pixels (26.6 format). */ + FT_LOCAL( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ); +#endif + + FT_LOCAL( void ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + /* snap a stem to one or two blue zones */ + FT_LOCAL( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ); + /* */ + +#ifdef DEBUG_HINTER + extern PSH_Globals ps_debug_globals; +#endif + + +FT_END_HEADER + + +#endif /* PSHGLOB_H_ */ + + +/* END */ diff --git a/external/freetype/src/pshinter/pshinter.c b/external/freetype/src/pshinter/pshinter.c new file mode 100644 index 000000000..54ed41096 --- /dev/null +++ b/external/freetype/src/pshinter/pshinter.c @@ -0,0 +1,27 @@ +/**************************************************************************** + * + * pshinter.c + * + * FreeType PostScript Hinting module + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "pshalgo.c" +#include "pshglob.c" +#include "pshmod.c" +#include "pshrec.c" + + +/* END */ diff --git a/external/freetype/src/pshinter/pshmod.c b/external/freetype/src/pshinter/pshmod.c new file mode 100644 index 000000000..974a99e01 --- /dev/null +++ b/external/freetype/src/pshinter/pshmod.c @@ -0,0 +1,125 @@ +/**************************************************************************** + * + * pshmod.c + * + * FreeType PostScript hinter module implementation (body). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftobjs.h> +#include "pshrec.h" +#include "pshalgo.h" +#include "pshmod.h" + + + /* the Postscript Hinter module structure */ + typedef struct PS_Hinter_Module_Rec_ + { + FT_ModuleRec root; + PS_HintsRec ps_hints; + + PSH_Globals_FuncsRec globals_funcs; + T1_Hints_FuncsRec t1_funcs; + T2_Hints_FuncsRec t2_funcs; + + } PS_Hinter_ModuleRec, *PS_Hinter_Module; + + + /* finalize module */ + FT_CALLBACK_DEF( void ) + ps_hinter_done( FT_Module module_ ) /* PS_Hinter_Module */ + { + PS_Hinter_Module module = (PS_Hinter_Module)module_; + + + module->t1_funcs.hints = NULL; + module->t2_funcs.hints = NULL; + + ps_hints_done( &module->ps_hints ); + } + + + /* initialize module, create hints recorder and the interface */ + FT_CALLBACK_DEF( FT_Error ) + ps_hinter_init( FT_Module module_ ) /* PS_Hinter_Module */ + { + PS_Hinter_Module module = (PS_Hinter_Module)module_; + + FT_Memory memory = module->root.memory; + void* ph = &module->ps_hints; + + + ps_hints_init( &module->ps_hints, memory ); + + psh_globals_funcs_init( &module->globals_funcs ); + + t1_hints_funcs_init( &module->t1_funcs ); + module->t1_funcs.hints = (T1_Hints)ph; + + t2_hints_funcs_init( &module->t2_funcs ); + module->t2_funcs.hints = (T2_Hints)ph; + + return 0; + } + + + /* returns global hints interface */ + FT_CALLBACK_DEF( PSH_Globals_Funcs ) + pshinter_get_globals_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->globals_funcs; + } + + + /* return Type 1 hints interface */ + FT_CALLBACK_DEF( T1_Hints_Funcs ) + pshinter_get_t1_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t1_funcs; + } + + + /* return Type 2 hints interface */ + FT_CALLBACK_DEF( T2_Hints_Funcs ) + pshinter_get_t2_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t2_funcs; + } + + + FT_DEFINE_PSHINTER_INTERFACE( + pshinter_interface, + + pshinter_get_globals_funcs, + pshinter_get_t1_funcs, + pshinter_get_t2_funcs + ) + + + FT_DEFINE_MODULE( + pshinter_module_class, + + 0, + sizeof ( PS_Hinter_ModuleRec ), + "pshinter", + 0x10000L, + 0x20000L, + + &pshinter_interface, /* module-specific interface */ + + (FT_Module_Constructor)ps_hinter_init, /* module_init */ + (FT_Module_Destructor) ps_hinter_done, /* module_done */ + (FT_Module_Requester) NULL /* get_interface */ + ) + +/* END */ diff --git a/external/freetype/src/pshinter/pshmod.h b/external/freetype/src/pshinter/pshmod.h new file mode 100644 index 000000000..4bd781a35 --- /dev/null +++ b/external/freetype/src/pshinter/pshmod.h @@ -0,0 +1,38 @@ +/**************************************************************************** + * + * pshmod.h + * + * PostScript hinter module interface (specification). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSHMOD_H_ +#define PSHMOD_H_ + + +#include <freetype/ftmodapi.h> + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( pshinter_module_class ) + + +FT_END_HEADER + + +#endif /* PSHMOD_H_ */ + + +/* END */ diff --git a/external/freetype/src/pshinter/pshnterr.h b/external/freetype/src/pshinter/pshnterr.h new file mode 100644 index 000000000..97624952d --- /dev/null +++ b/external/freetype/src/pshinter/pshnterr.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * pshnterr.h + * + * PS Hinter error codes (specification only). + * + * Copyright (C) 2003-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the PSHinter error enumeration constants. + * + */ + +#ifndef PSHNTERR_H_ +#define PSHNTERR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PSH_Err_ +#define FT_ERR_BASE FT_Mod_Err_PShinter + +#include <freetype/fterrors.h> + +#endif /* PSHNTERR_H_ */ + + +/* END */ diff --git a/external/freetype/src/pshinter/pshrec.c b/external/freetype/src/pshinter/pshrec.c new file mode 100644 index 000000000..680e6d013 --- /dev/null +++ b/external/freetype/src/pshinter/pshrec.c @@ -0,0 +1,1224 @@ +/**************************************************************************** + * + * pshrec.c + * + * FreeType PostScript hints recorder (body). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/freetype.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> + +#include "pshrec.h" +#include "pshalgo.h" + +#include "pshnterr.h" + +#undef FT_COMPONENT +#define FT_COMPONENT pshrec + +#ifdef DEBUG_HINTER + PS_Hints ps_debug_hints = NULL; + int ps_debug_no_horz_hints = 0; + int ps_debug_no_vert_hints = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_HINT MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy hints table */ + static void + ps_hint_table_done( PS_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + } + + + /* ensure that a table can contain "count" elements */ + static FT_Error + ps_hint_table_ensure( PS_Hint_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_hints; + FT_UInt new_max = count; + FT_Error error; + + + /* try to grow the table */ + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_QRENEW_ARRAY( table->hints, old_max, new_max ) ) + table->max_hints = new_max; + + return error; + } + + + static FT_Error + ps_hint_table_alloc( PS_Hint_Table table, + FT_Memory memory, + PS_Hint *ahint ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count; + PS_Hint hint = NULL; + + + count = table->num_hints; + count++; + + if ( count > table->max_hints ) + { + error = ps_hint_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + hint = table->hints + count - 1; /* initialized upstream */ + + table->num_hints = count; + + Exit: + *ahint = hint; + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_MASK MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy mask */ + static void + ps_mask_done( PS_Mask mask, + FT_Memory memory ) + { + FT_FREE( mask->bytes ); + mask->num_bits = 0; + mask->max_bits = 0; + mask->end_point = 0; + } + + + /* ensure that a mask can contain "count" bits */ + static FT_Error + ps_mask_ensure( PS_Mask mask, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = mask->max_bits >> 3; + FT_UInt new_max = ( count + 7 ) >> 3; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + /* added bytes are zeroed here */ + if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) + mask->max_bits = new_max * 8; + } + return error; + } + + + /* test a bit value in a given mask */ + static FT_Int + ps_mask_test_bit( PS_Mask mask, + FT_UInt idx ) + { + if ( idx >= mask->num_bits ) + return 0; + + return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); + } + + + /* set a given bit, possibly grow the mask */ + static FT_Error + ps_mask_set_bit( PS_Mask mask, + FT_UInt idx, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* p; + + + if ( idx >= mask->num_bits ) + { + error = ps_mask_ensure( mask, idx + 1, memory ); + if ( error ) + goto Exit; + + mask->num_bits = idx + 1; + } + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); + + Exit: + return error; + } + + + /* destroy mask table */ + static void + ps_mask_table_done( PS_Mask_Table table, + FT_Memory memory ) + { + FT_UInt count = table->max_masks; + PS_Mask mask = table->masks; + + + for ( ; count > 0; count--, mask++ ) + ps_mask_done( mask, memory ); + + FT_FREE( table->masks ); + table->num_masks = 0; + table->max_masks = 0; + } + + + /* ensure that a mask table can contain "count" masks */ + static FT_Error + ps_mask_table_ensure( PS_Mask_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_masks; + FT_UInt new_max = count; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) + table->max_masks = new_max; + } + return error; + } + + + /* allocate a new mask in a table */ + static FT_Error + ps_mask_table_alloc( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_UInt count; + FT_Error error = FT_Err_Ok; + PS_Mask mask = NULL; + + + count = table->num_masks; + count++; + + if ( count > table->max_masks ) + { + error = ps_mask_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + mask = table->masks + count - 1; + mask->num_bits = 0; + mask->end_point = 0; + /* reused mask must be cleared */ + if ( mask->max_bits ) + FT_MEM_ZERO( mask->bytes, mask->max_bits >> 3 ); + + table->num_masks = count; + + Exit: + *amask = mask; + return error; + } + + + /* return last hint mask in a table, create one if the table is empty */ + static FT_Error + ps_mask_table_last( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count; + PS_Mask mask; + + + count = table->num_masks; + if ( count == 0 ) + { + error = ps_mask_table_alloc( table, memory, &mask ); + if ( error ) + goto Exit; + } + else + mask = table->masks + count - 1; + + Exit: + *amask = mask; + return error; + } + + + /* set a new mask to a given bit range */ + static FT_Error + ps_mask_table_set_bits( PS_Mask_Table table, + const FT_Byte* source, + FT_UInt bit_pos, + FT_UInt bit_count, + FT_Memory memory ) + { + FT_Error error; + PS_Mask mask; + + + error = ps_mask_table_last( table, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_ensure( mask, bit_count, memory ); + if ( error ) + goto Exit; + + mask->num_bits = bit_count; + + /* now, copy bits */ + { + FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); + FT_Int rmask = 0x80 >> ( bit_pos & 7 ); + FT_Byte* write = mask->bytes; + FT_Int wmask = 0x80; + FT_Int val; + + + for ( ; bit_count > 0; bit_count-- ) + { + val = write[0] & ~wmask; + + if ( read[0] & rmask ) + val |= wmask; + + write[0] = (FT_Byte)val; + + rmask >>= 1; + if ( rmask == 0 ) + { + read++; + rmask = 0x80; + } + + wmask >>= 1; + if ( wmask == 0 ) + { + write++; + wmask = 0x80; + } + } + } + + Exit: + return error; + } + + + /* test whether two masks in a table intersect */ + static FT_Int + ps_mask_table_test_intersect( PS_Mask_Table table, + FT_UInt index1, + FT_UInt index2 ) + { + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_Byte* p1 = mask1->bytes; + FT_Byte* p2 = mask2->bytes; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_UInt count; + + + count = FT_MIN( count1, count2 ); + for ( ; count >= 8; count -= 8 ) + { + if ( p1[0] & p2[0] ) + return 1; + + p1++; + p2++; + } + + if ( count == 0 ) + return 0; + + return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); + } + + + /* merge two masks, used by ps_mask_table_merge_all */ + static FT_Error + ps_mask_table_merge( PS_Mask_Table table, + FT_UInt index1, + FT_UInt index2, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + + + /* swap index1 and index2 so that index1 < index2 */ + if ( index1 > index2 ) + { + FT_UInt temp; + + + temp = index1; + index1 = index2; + index2 = temp; + } + + if ( index1 < index2 && index2 < table->num_masks ) + { + /* we need to merge the bitsets of index1 and index2 with a */ + /* simple union */ + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_UInt delta; + + + if ( count2 > 0 ) + { + FT_UInt pos; + FT_Byte* read; + FT_Byte* write; + + + /* if "count2" is greater than "count1", we need to grow the */ + /* first bitset */ + if ( count2 > count1 ) + { + error = ps_mask_ensure( mask1, count2, memory ); + if ( error ) + goto Exit; + + mask1->num_bits = count2; + } + + /* merge (unite) the bitsets */ + read = mask2->bytes; + write = mask1->bytes; + pos = ( count2 + 7 ) >> 3; + + for ( ; pos > 0; pos-- ) + { + write[0] = (FT_Byte)( write[0] | read[0] ); + write++; + read++; + } + } + + /* Now, remove "mask2" from the list. We need to keep the masks */ + /* sorted in order of importance, so move table elements. */ + mask2->num_bits = 0; + mask2->end_point = 0; + + /* number of masks to move */ + delta = table->num_masks - 1 - index2; + if ( delta > 0 ) + { + /* move to end of table for reuse */ + PS_MaskRec dummy = *mask2; + + + ft_memmove( mask2, + mask2 + 1, + delta * sizeof ( PS_MaskRec ) ); + + mask2[delta] = dummy; + } + + table->num_masks--; + } + else + FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", + index1, index2 )); + + Exit: + return error; + } + + + /* Try to merge all masks in a given table. This is used to merge */ + /* all counter masks into independent counter "paths". */ + /* */ + static FT_Error + ps_mask_table_merge_all( PS_Mask_Table table, + FT_Memory memory ) + { + FT_UInt index1, index2; + FT_Error error = FT_Err_Ok; + + + /* the loops stop when unsigned indices wrap around after 0 */ + for ( index1 = table->num_masks - 1; index1 < table->num_masks; index1-- ) + { + for ( index2 = index1 - 1; index2 < index1; index2-- ) + { + if ( ps_mask_table_test_intersect( table, index1, index2 ) ) + { + error = ps_mask_table_merge( table, index2, index1, memory ); + if ( error ) + goto Exit; + + break; + } + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_DIMENSION MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* finalize a given dimension */ + static void + ps_dimension_done( PS_Dimension dimension, + FT_Memory memory ) + { + ps_mask_table_done( &dimension->counters, memory ); + ps_mask_table_done( &dimension->masks, memory ); + ps_hint_table_done( &dimension->hints, memory ); + } + + + /* initialize a given dimension */ + static void + ps_dimension_init( PS_Dimension dimension ) + { + dimension->hints.num_hints = 0; + dimension->masks.num_masks = 0; + dimension->counters.num_masks = 0; + } + + +#if 0 + + /* set a bit at a given index in the current hint mask */ + static FT_Error + ps_dimension_set_mask_bit( PS_Dimension dim, + FT_UInt idx, + FT_Memory memory ) + { + PS_Mask mask; + FT_Error error = FT_Err_Ok; + + + /* get last hint mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + + Exit: + return error; + } + +#endif + + /* set the end point in a mask, called from "End" & "Reset" methods */ + static void + ps_dimension_end_mask( PS_Dimension dim, + FT_UInt end_point ) + { + FT_UInt count = dim->masks.num_masks; + + + if ( count > 0 ) + { + PS_Mask mask = dim->masks.masks + count - 1; + + + mask->end_point = end_point; + } + } + + + /* set the end point in the current mask, then create a new empty one */ + /* (called by "Reset" method) */ + static FT_Error + ps_dimension_reset_mask( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + PS_Mask mask; + + + /* end current mask */ + ps_dimension_end_mask( dim, end_point ); + + /* allocate new one */ + return ps_mask_table_alloc( &dim->masks, memory, &mask ); + } + + + /* set a new mask, called from the "T2Stem" method */ + static FT_Error + ps_dimension_set_mask_bits( PS_Dimension dim, + const FT_Byte* source, + FT_UInt source_pos, + FT_UInt source_bits, + FT_UInt end_point, + FT_Memory memory ) + { + FT_Error error; + + + /* reset current mask, if any */ + error = ps_dimension_reset_mask( dim, end_point, memory ); + if ( error ) + goto Exit; + + /* set bits in new mask */ + error = ps_mask_table_set_bits( &dim->masks, source, + source_pos, source_bits, memory ); + + Exit: + return error; + } + + + /* add a new single stem (called from "T1Stem" method) */ + static FT_Error + ps_dimension_add_t1stem( PS_Dimension dim, + FT_Int pos, + FT_Int len, + FT_Memory memory, + FT_UInt *aindex ) + { + FT_Error error = FT_Err_Ok; + FT_UInt flags = 0; + + + /* detect ghost stem */ + if ( len < 0 ) + { + flags |= PS_HINT_FLAG_GHOST; + if ( len == -21 ) + { + flags |= PS_HINT_FLAG_BOTTOM; + pos = ADD_INT( pos, len ); + } + len = 0; + } + + /* now, lookup stem in the current hints table */ + { + PS_Mask mask; + FT_UInt idx; + FT_UInt max = dim->hints.num_hints; + PS_Hint hint = dim->hints.hints; + + + for ( idx = 0; idx < max; idx++, hint++ ) + { + if ( hint->pos == pos && hint->len == len ) + break; + } + + /* we need to create a new hint in the table */ + if ( idx >= max ) + { + error = ps_hint_table_alloc( &dim->hints, memory, &hint ); + if ( error ) + goto Exit; + + hint->pos = pos; + hint->len = len; + hint->flags = flags; + } + + /* now, store the hint in the current mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + if ( error ) + goto Exit; + + if ( aindex ) + *aindex = idx; + } + + Exit: + return error; + } + + + /* add a "hstem3/vstem3" counter to our dimension table */ + static FT_Error + ps_dimension_add_counter( PS_Dimension dim, + FT_UInt hint1, + FT_UInt hint2, + FT_UInt hint3, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count = dim->counters.num_masks; + PS_Mask counter = dim->counters.masks; + + + /* try to find an existing counter mask that already uses */ + /* one of these stems here */ + for ( ; count > 0; count--, counter++ ) + { + if ( ps_mask_test_bit( counter, hint1 ) || + ps_mask_test_bit( counter, hint2 ) || + ps_mask_test_bit( counter, hint3 ) ) + break; + } + + /* create a new counter when needed */ + if ( count == 0 ) + { + error = ps_mask_table_alloc( &dim->counters, memory, &counter ); + if ( error ) + goto Exit; + } + + /* now, set the bits for our hints in the counter mask */ + error = ps_mask_set_bit( counter, hint1, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint2, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint3, memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* end of recording session for a given dimension */ + static FT_Error + ps_dimension_end( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + /* end hint mask table */ + ps_dimension_end_mask( dim, end_point ); + + /* merge all counter masks into independent "paths" */ + return ps_mask_table_merge_all( &dim->counters, memory ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_RECORDER MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* destroy hints */ + FT_LOCAL_DEF( void ) + ps_hints_done( PS_Hints hints ) + { + FT_Memory memory = hints->memory; + + + ps_dimension_done( &hints->dimension[0], memory ); + ps_dimension_done( &hints->dimension[1], memory ); + + hints->error = FT_Err_Ok; + hints->memory = NULL; + } + + + FT_LOCAL_DEF( void ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ) + { + FT_ZERO( hints ); + hints->memory = memory; + } + + + /* initialize a hints for a new session */ + static void + ps_hints_open( PS_Hints hints, + PS_Hint_Type hint_type ) + { + hints->error = FT_Err_Ok; + hints->hint_type = hint_type; + + ps_dimension_init( &hints->dimension[0] ); + ps_dimension_init( &hints->dimension[1] ); + } + + + /* add one or more stems to the current hints table */ + static void + ps_hints_stem( PS_Hints hints, + FT_UInt dimension, + FT_Int count, + FT_Long* stems ) + { + PS_Dimension dim; + + + if ( hints->error ) + return; + + /* limit "dimension" to 0..1 */ + if ( dimension > 1 ) + { + FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + /* record the stems in the current hints/masks table */ + /* (Type 1 & 2's `hstem' or `vstem' operators) */ + dim = &hints->dimension[dimension]; + + for ( ; count > 0; count--, stems += 2 ) + { + FT_Error error; + FT_Memory memory = hints->memory; + + + error = ps_dimension_add_t1stem( dim, + (FT_Int)stems[0], + (FT_Int)stems[1], + memory, + NULL ); + if ( error ) + { + FT_ERROR(( "ps_hints_stem: could not add stem" + " (%ld,%ld) to hints table\n", stems[0], stems[1] )); + + hints->error = error; + return; + } + } + } + + + /* add one Type1 counter stem to the current hints table */ + static void + ps_hints_t1stem3( T1_Hints hints_, /* PS_Hints */ + FT_UInt dimension, + FT_Fixed* stems ) + { + PS_Hints hints = (PS_Hints)hints_; + FT_Error error = FT_Err_Ok; + + + if ( !hints->error ) + { + PS_Dimension dim; + FT_Memory memory = hints->memory; + FT_Int count; + FT_UInt idx[3]; + + + /* limit "dimension" to 0..1 */ + if ( dimension > 1 ) + { + FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + dim = &hints->dimension[dimension]; + + /* there must be 6 elements in the 'stem' array */ + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + /* add the three stems to our hints/masks table */ + for ( count = 0; count < 3; count++, stems += 2 ) + { + error = ps_dimension_add_t1stem( dim, + (FT_Int)FIXED_TO_INT( stems[0] ), + (FT_Int)FIXED_TO_INT( stems[1] ), + memory, &idx[count] ); + if ( error ) + goto Fail; + } + + /* now, add the hints to the counters table */ + error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], + memory ); + if ( error ) + goto Fail; + } + else + { + FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + } + + return; + + Fail: + FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); + hints->error = error; + } + + + /* reset hints (only with Type 1 hints) */ + static void + ps_hints_t1reset( T1_Hints hints_, /* PS_Hints */ + FT_UInt end_point ) + { + PS_Hints hints = (PS_Hints)hints_; + FT_Error error = FT_Err_Ok; + + + if ( !hints->error ) + { + FT_Memory memory = hints->memory; + + + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + error = ps_dimension_reset_mask( &hints->dimension[0], + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_reset_mask( &hints->dimension[1], + end_point, memory ); + if ( error ) + goto Fail; + } + else + { + /* invalid hint type */ + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + } + return; + + Fail: + hints->error = error; + } + + + /* Type2 "hintmask" operator, add a new hintmask to each direction */ + static void + ps_hints_t2mask( T2_Hints hints_, /* PS_Hints */ + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + PS_Hints hints = (PS_Hints)hints_; + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count; must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2mask:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, + end_point, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + static void + ps_hints_t2counter( T2_Hints hints_, /* PS_Hints */ + FT_UInt bit_count, + const FT_Byte* bytes ) + { + PS_Hints hints = (PS_Hints)hints_; + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count, must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2counter:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, + 0, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, + 0, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + /* end recording session */ + static FT_Error + ps_hints_close( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error; + + + error = hints->error; + if ( !error ) + { + FT_Memory memory = hints->memory; + PS_Dimension dim = hints->dimension; + + + error = ps_dimension_end( &dim[0], end_point, memory ); + if ( !error ) + { + error = ps_dimension_end( &dim[1], end_point, memory ); + } + } + +#ifdef DEBUG_HINTER + if ( !error ) + ps_debug_hints = hints; +#endif + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_hints_open( T1_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); + } + + static FT_Error + t1_hints_close( T1_Hints hints, + FT_UInt end_point ) + { + return ps_hints_close( (PS_Hints)hints, end_point ); + } + + static void + t1_hints_stem( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ) + { + FT_Pos stems[2]; + + + stems[0] = FIXED_TO_INT( coords[0] ); + stems[1] = FIXED_TO_INT( coords[1] ); + + ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); + } + + + static FT_Error + t1_hints_apply( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + return ps_hints_apply( (PS_Hints)hints, outline, globals, hint_mode ); + } + + + FT_LOCAL_DEF( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) + { + FT_ZERO( funcs ); + + funcs->open = (T1_Hints_OpenFunc) t1_hints_open; + funcs->close = (T1_Hints_CloseFunc) t1_hints_close; + funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; + funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; + funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; + funcs->apply = (T1_Hints_ApplyFunc) t1_hints_apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 2 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t2_hints_open( T2_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); + } + + + static FT_Error + t2_hints_close( T2_Hints hints, + FT_UInt end_point ) + { + return ps_hints_close( (PS_Hints)hints, end_point ); + } + + + static void + t2_hints_stems( T2_Hints hints, + FT_UInt dimension, + FT_Int count, + FT_Fixed* coords ) + { + FT_Pos stems[32], y; + FT_Int total = count, n; + + + y = 0; + while ( total > 0 ) + { + /* determine number of stems to write */ + count = total; + if ( count > 16 ) + count = 16; + + /* compute integer stem positions in font units */ + for ( n = 0; n < count * 2; n++ ) + { + y = ADD_LONG( y, coords[n] ); + stems[n] = FIXED_TO_INT( y ); + } + + /* compute lengths */ + for ( n = 0; n < count * 2; n += 2 ) + stems[n + 1] = stems[n + 1] - stems[n]; + + /* add them to the current dimension */ + ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); + + total -= count; + } + } + + + static FT_Error + t2_hints_apply( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + return ps_hints_apply( (PS_Hints)hints, outline, globals, hint_mode ); + } + + + FT_LOCAL_DEF( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) + { + FT_ZERO( funcs ); + + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) t2_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask = (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) t2_hints_apply; + } + + +/* END */ diff --git a/external/freetype/src/pshinter/pshrec.h b/external/freetype/src/pshinter/pshrec.h new file mode 100644 index 000000000..0b2484af1 --- /dev/null +++ b/external/freetype/src/pshinter/pshrec.h @@ -0,0 +1,171 @@ +/**************************************************************************** + * + * pshrec.h + * + * Postscript (Type1/Type2) hints recorder (specification). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /*************************************************************************** + * + * The functions defined here are called from the Type 1, CID and CFF + * font drivers to record the hints of a given character/glyph. + * + * The hints are recorded in a unified format, and are later processed + * by the `optimizer' and `fitter' to adjust the outlines to the pixel + * grid. + * + */ + + +#ifndef PSHREC_H_ +#define PSHREC_H_ + + +#include <freetype/internal/pshints.h> +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH HINTS RECORDER INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to hint record */ + typedef struct PS_HintRec_* PS_Hint; + + /* hint types */ + typedef enum PS_Hint_Type_ + { + PS_HINT_TYPE_1 = 1, + PS_HINT_TYPE_2 = 2 + + } PS_Hint_Type; + + + /* hint flags */ +#define PS_HINT_FLAG_GHOST 1U +#define PS_HINT_FLAG_BOTTOM 2U + + + /* hint descriptor */ + typedef struct PS_HintRec_ + { + FT_Int pos; + FT_Int len; + FT_UInt flags; + + } PS_HintRec; + + +#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) +#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) +#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) + + + /* hints table descriptor */ + typedef struct PS_Hint_TableRec_ + { + FT_UInt num_hints; + FT_UInt max_hints; + PS_Hint hints; + + } PS_Hint_TableRec, *PS_Hint_Table; + + + /* hint and counter mask descriptor */ + typedef struct PS_MaskRec_ + { + FT_UInt num_bits; + FT_UInt max_bits; + FT_Byte* bytes; + FT_UInt end_point; + + } PS_MaskRec, *PS_Mask; + + + /* masks and counters table descriptor */ + typedef struct PS_Mask_TableRec_ + { + FT_UInt num_masks; + FT_UInt max_masks; + PS_Mask masks; + + } PS_Mask_TableRec, *PS_Mask_Table; + + + /* dimension-specific hints descriptor */ + typedef struct PS_DimensionRec_ + { + PS_Hint_TableRec hints; + PS_Mask_TableRec masks; + PS_Mask_TableRec counters; + + } PS_DimensionRec, *PS_Dimension; + + + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PS_HintsRec_ + { + FT_Memory memory; + FT_Error error; + FT_UInt32 magic; + PS_Hint_Type hint_type; + PS_DimensionRec dimension[2]; + + } PS_HintsRec, *PS_Hints; + + /* */ + + /* initialize hints recorder */ + FT_LOCAL( void ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ); + + /* finalize hints recorder */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ); + + /* initialize Type1 hints recorder interface */ + FT_LOCAL( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); + + /* initialize Type2 hints recorder interface */ + FT_LOCAL( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); + + +#ifdef DEBUG_HINTER + extern PS_Hints ps_debug_hints; + extern int ps_debug_no_horz_hints; + extern int ps_debug_no_vert_hints; +#endif + + /* */ + + +FT_END_HEADER + + +#endif /* PSHREC_H_ */ + + +/* END */ diff --git a/external/freetype/src/pshinter/rules.mk b/external/freetype/src/pshinter/rules.mk new file mode 100644 index 000000000..50058e882 --- /dev/null +++ b/external/freetype/src/pshinter/rules.mk @@ -0,0 +1,75 @@ +# +# FreeType 2 PSHinter driver configuration rules +# + + +# Copyright (C) 2001-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSHINTER driver directory +# +PSHINTER_DIR := $(SRC_DIR)/pshinter + + +# compilation flags for the driver +# +PSHINTER_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# PSHINTER driver sources (i.e., C files) +# +PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \ + $(PSHINTER_DIR)/pshglob.c \ + $(PSHINTER_DIR)/pshmod.c \ + $(PSHINTER_DIR)/pshrec.c + + +# PSHINTER driver headers +# +PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \ + $(PSHINTER_DIR)/pshnterr.h + + +# PSHINTER driver object(s) +# +# PSHINTER_DRV_OBJ_M is used during `multi' builds. +# PSHINTER_DRV_OBJ_S is used during `single' builds. +# +PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O + +# PSHINTER driver source file for single build +# +PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c + + +# PSHINTER driver - single object +# +$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \ + $(FREETYPE_H) $(PSHINTER_DRV_H) + $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S)) + + +# PSHINTER driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H) + $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S) +DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/psnames/module.mk b/external/freetype/src/psnames/module.mk new file mode 100644 index 000000000..1ee0ef8f7 --- /dev/null +++ b/external/freetype/src/psnames/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSnames module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSNAMES_MODULE + +define PSNAMES_MODULE +$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/psnames/psmodule.c b/external/freetype/src/psnames/psmodule.c new file mode 100644 index 000000000..8203a0465 --- /dev/null +++ b/external/freetype/src/psnames/psmodule.c @@ -0,0 +1,621 @@ +/**************************************************************************** + * + * psmodule.c + * + * psnames module implementation (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svpscmap.h> + +#include "psmodule.h" + + /* + * The file `pstables.h' with its arrays and its function + * `ft_get_adobe_glyph_index' is useful for other projects also (for + * example, `pdfium' is using it). However, if used as a C++ header, + * including it in two different source files makes it necessary to use + * `extern const' for the declaration of its arrays, otherwise the data + * would be duplicated as mandated by the C++ standard. + * + * For this reason, we use `DEFINE_PS_TABLES' to guard the function + * definitions, and `DEFINE_PS_TABLES_DATA' to provide both proper array + * declarations and definitions. + */ +#include "pstables.h" +#define DEFINE_PS_TABLES +#define DEFINE_PS_TABLES_DATA +#include "pstables.h" + +#include "psnamerr.h" + + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + +#define VARIANT_BIT 0x80000000UL +#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) ) + + + /* Return the Unicode value corresponding to a given glyph. Note that */ + /* we do deal with glyph variants by detecting a non-initial dot in */ + /* the name, as in `A.swash' or `e.final'; in this case, the */ + /* VARIANT_BIT is set in the return value. */ + /* */ + FT_CALLBACK_DEF( FT_UInt32 ) + ps_unicode_value( const char* glyph_name ) + { + /* If the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' && + glyph_name[1] == 'n' && + glyph_name[2] == 'i' ) + { + /* determine whether the next four characters following are */ + /* hexadecimal. */ + + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ + + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 3; + + + for ( count = 4; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + /* there must be exactly four hex digits */ + if ( count == 0 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' ) + { + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 1; + + + for ( count = 6; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + if ( count <= 2 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + FT_UInt32 value = 0; + const char* p = glyph_name; + + + for ( ; *p && *p != '.'; p++ ) + ; + + /* now look up the glyph in the Adobe Glyph List; */ + /* `.notdef', `.null' and the empty name are short cut */ + if ( p > glyph_name ) + { + value = (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p ); + + if ( *p == '.' ) + value |= (FT_UInt32)VARIANT_BIT; + } + + return value; + } + } + + + /* ft_qsort callback to sort the unicode map */ + FT_COMPARE_DEF( int ) + compare_uni_maps( const void* a, + const void* b ) + { + PS_UniMap* map1 = (PS_UniMap*)a; + PS_UniMap* map2 = (PS_UniMap*)b; + FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); + FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); + + + /* sort base glyphs before glyph variants */ + if ( unicode1 == unicode2 ) + { + if ( map1->unicode > map2->unicode ) + return 1; + else if ( map1->unicode < map2->unicode ) + return -1; + else + return 0; + } + else + { + if ( unicode1 > unicode2 ) + return 1; + else if ( unicode1 < unicode2 ) + return -1; + else + return 0; + } + } + + + /* support for extra glyphs not handled (well) in AGL; */ + /* we add extra mappings for them if necessary */ + +#define EXTRA_GLYPH_LIST_SIZE 10 + + static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = + { + /* WGL 4 */ + 0x0394, + 0x03A9, + 0x2215, + 0x00AD, + 0x02C9, + 0x03BC, + 0x2219, + 0x00A0, + /* Romanian */ + 0x021A, + 0x021B + }; + + static const char ft_extra_glyph_names[] = + { + 'D','e','l','t','a',0, + 'O','m','e','g','a',0, + 'f','r','a','c','t','i','o','n',0, + 'h','y','p','h','e','n',0, + 'm','a','c','r','o','n',0, + 'm','u',0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, + 's','p','a','c','e',0, + 'T','c','o','m','m','a','a','c','c','e','n','t',0, + 't','c','o','m','m','a','a','c','c','e','n','t',0 + }; + + static const FT_Int + ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = + { + 0, + 6, + 12, + 21, + 28, + 35, + 38, + 53, + 59, + 72 + }; + + + static void + ps_check_extra_glyph_name( const char* gname, + FT_UInt glyph, + FT_UInt* extra_glyphs, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( ft_strcmp( ft_extra_glyph_names + + ft_extra_glyph_name_offsets[n], gname ) == 0 ) + { + if ( states[n] == 0 ) + { + /* mark this extra glyph as a candidate for the cmap */ + states[n] = 1; + extra_glyphs[n] = glyph; + } + + return; + } + } + } + + + static void + ps_check_extra_glyph_unicode( FT_UInt32 uni_char, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( uni_char == ft_extra_glyph_unicodes[n] ) + { + /* disable this extra glyph from being added to the cmap */ + states[n] = 2; + + return; + } + } + } + + + /* Build a table that maps Unicode values to glyph indices. */ + FT_CALLBACK_DEF( FT_Error ) + ps_unicodes_init( FT_Memory memory, + PS_Unicodes table, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ) + { + FT_Error error; + + FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; + + + /* we first allocate the table */ + table->num_maps = 0; + + if ( !FT_QNEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) + { + FT_UInt n; + FT_UInt count; + PS_UniMap* map; + FT_UInt32 uni_char; + + + map = table->maps; + + for ( n = 0; n < num_glyphs; n++ ) + { + const char* gname = get_glyph_name( glyph_data, n ); + + + if ( gname && *gname ) + { + ps_check_extra_glyph_name( gname, n, + extra_glyphs, extra_glyph_list_states ); + uni_char = ps_unicode_value( gname ); + + if ( BASE_GLYPH( uni_char ) != 0 ) + { + ps_check_extra_glyph_unicode( uni_char, + extra_glyph_list_states ); + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + + if ( free_glyph_name ) + free_glyph_name( glyph_data, gname ); + } + } + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( extra_glyph_list_states[n] == 1 ) + { + /* This glyph name has an additional representation. */ + /* Add it to the cmap. */ + + map->unicode = ft_extra_glyph_unicodes[n]; + map->glyph_index = extra_glyphs[n]; + map++; + } + } + + /* now compress the table a bit */ + count = (FT_UInt)( map - table->maps ); + + if ( count == 0 ) + { + /* No unicode chars here! */ + FT_FREE( table->maps ); + if ( !error ) + error = FT_THROW( No_Unicode_Glyph_Name ); + } + else + { + /* Reallocate if the number of used entries is much smaller. */ + if ( count < num_glyphs / 2 ) + { + FT_MEM_QRENEW_ARRAY( table->maps, + num_glyphs + EXTRA_GLYPH_LIST_SIZE, + count ); + error = FT_Err_Ok; + } + + /* Sort the table in increasing order of unicode values, */ + /* taking care of glyph variants. */ + ft_qsort( table->maps, count, sizeof ( PS_UniMap ), + compare_uni_maps ); + } + + table->num_maps = count; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_UInt ) + ps_unicodes_char_index( PS_Unicodes table, + FT_UInt32 unicode ) + { + PS_UniMap *result = NULL; + PS_UniMap *min = table->maps; + PS_UniMap *max = min + table->num_maps; + PS_UniMap *mid = min + ( ( max - min ) >> 1 ); + + + /* Perform a binary search on the table. */ + while ( min < max ) + { + FT_UInt32 base_glyph; + + + if ( mid->unicode == unicode ) + { + result = mid; + break; + } + + base_glyph = BASE_GLYPH( mid->unicode ); + + if ( base_glyph == unicode ) + result = mid; /* remember match but continue search for base glyph */ + + if ( base_glyph < unicode ) + min = mid + 1; + else + max = mid; + + /* reasonable prediction in a continuous block */ + mid += unicode - base_glyph; + if ( mid >= max || mid < min ) + mid = min + ( ( max - min ) >> 1 ); + } + + if ( result ) + return result->glyph_index; + else + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + ps_unicodes_char_next( PS_Unicodes table, + FT_UInt32 *unicode ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *unicode + 1; + + + { + FT_UInt min = 0; + FT_UInt max = table->num_maps; + FT_UInt mid = min + ( ( max - min ) >> 1 ); + PS_UniMap* map; + FT_UInt32 base_glyph; + + + while ( min < max ) + { + map = table->maps + mid; + + if ( map->unicode == char_code ) + { + result = map->glyph_index; + goto Exit; + } + + base_glyph = BASE_GLYPH( map->unicode ); + + if ( base_glyph == char_code ) + result = map->glyph_index; + + if ( base_glyph < char_code ) + min = mid + 1; + else + max = mid; + + /* reasonable prediction in a continuous block */ + mid += char_code - base_glyph; + if ( mid >= max || mid < min ) + mid = min + ( max - min ) / 2; + } + + if ( result ) + goto Exit; /* we have a variant glyph */ + + /* we didn't find it; check whether we have a map just above it */ + char_code = 0; + + if ( min < table->num_maps ) + { + map = table->maps + min; + result = map->glyph_index; + char_code = BASE_GLYPH( map->unicode ); + } + } + + Exit: + *unicode = char_code; + return result; + } + + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + FT_CALLBACK_DEF( const char* ) + ps_get_macintosh_name( FT_UInt name_index ) + { + if ( name_index >= FT_NUM_MAC_NAMES ) + name_index = 0; + + return ft_standard_glyph_names + ft_mac_names[name_index]; + } + + + FT_CALLBACK_DEF( const char* ) + ps_get_standard_strings( FT_UInt sid ) + { + if ( sid >= FT_NUM_SID_NAMES ) + return 0; + + return ft_standard_glyph_names + ft_sid_names[sid]; + } + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + FT_DEFINE_SERVICE_PSCMAPSREC( + pscmaps_interface, + + ps_unicode_value, /* PS_Unicode_ValueFunc unicode_value */ + ps_unicodes_init, /* PS_Unicodes_InitFunc unicodes_init */ + ps_unicodes_char_index, /* PS_Unicodes_CharIndexFunc unicodes_char_index */ + ps_unicodes_char_next, /* PS_Unicodes_CharNextFunc unicodes_char_next */ + + ps_get_macintosh_name, /* PS_Macintosh_NameFunc macintosh_name */ + ps_get_standard_strings, /* PS_Adobe_Std_StringsFunc adobe_std_strings */ + + t1_standard_encoding, /* adobe_std_encoding */ + t1_expert_encoding /* adobe_expert_encoding */ + ) + +#else + + FT_DEFINE_SERVICE_PSCMAPSREC( + pscmaps_interface, + + NULL, /* PS_Unicode_ValueFunc unicode_value */ + NULL, /* PS_Unicodes_InitFunc unicodes_init */ + NULL, /* PS_Unicodes_CharIndexFunc unicodes_char_index */ + NULL, /* PS_Unicodes_CharNextFunc unicodes_char_next */ + + ps_get_macintosh_name, /* PS_Macintosh_NameFunc macintosh_name */ + ps_get_standard_strings, /* PS_Adobe_Std_StringsFunc adobe_std_strings */ + + t1_standard_encoding, /* adobe_std_encoding */ + t1_expert_encoding /* adobe_expert_encoding */ + ) + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + FT_DEFINE_SERVICEDESCREC1( + pscmaps_services, + + FT_SERVICE_ID_POSTSCRIPT_CMAPS, &pscmaps_interface ) + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pscmaps_services, service_id ); + } + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + +#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES_SERVICE( a ) NULL +#else +#define PUT_PS_NAMES_SERVICE( a ) a +#endif + + FT_DEFINE_MODULE( + psnames_module_class, + + 0, /* this is not a font driver, nor a renderer */ + sizeof ( FT_ModuleRec ), + + "psnames", /* driver name */ + 0x10000L, /* driver version */ + 0x20000L, /* driver requires FreeType 2 or above */ + + PUT_PS_NAMES_SERVICE( + (void*)&pscmaps_interface ), /* module specific interface */ + + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + PUT_PS_NAMES_SERVICE( psnames_get_service ) /* FT_Module_Requester get_interface */ + ) + + +/* END */ diff --git a/external/freetype/src/psnames/psmodule.h b/external/freetype/src/psnames/psmodule.h new file mode 100644 index 000000000..0904700bf --- /dev/null +++ b/external/freetype/src/psnames/psmodule.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * + * psmodule.h + * + * High-level psnames module interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PSMODULE_H_ +#define PSMODULE_H_ + + +#include <freetype/ftmodapi.h> + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( psnames_module_class ) + + +FT_END_HEADER + +#endif /* PSMODULE_H_ */ + + +/* END */ diff --git a/external/freetype/src/psnames/psnamerr.h b/external/freetype/src/psnames/psnamerr.h new file mode 100644 index 000000000..0073f8228 --- /dev/null +++ b/external/freetype/src/psnames/psnamerr.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * psnamerr.h + * + * PS names module error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the PS names module error enumeration + * constants. + * + */ + +#ifndef PSNAMERR_H_ +#define PSNAMERR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PSnames_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSnames + +#include <freetype/fterrors.h> + +#endif /* PSNAMERR_H_ */ + + +/* END */ diff --git a/external/freetype/src/psnames/psnames.c b/external/freetype/src/psnames/psnames.c new file mode 100644 index 000000000..93ed9332f --- /dev/null +++ b/external/freetype/src/psnames/psnames.c @@ -0,0 +1,24 @@ +/**************************************************************************** + * + * psnames.c + * + * FreeType psnames module component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "psmodule.c" + + +/* END */ diff --git a/external/freetype/src/psnames/pstables.h b/external/freetype/src/psnames/pstables.h new file mode 100644 index 000000000..7f92cce60 --- /dev/null +++ b/external/freetype/src/psnames/pstables.h @@ -0,0 +1,4238 @@ +/**************************************************************************** + * + * pstables.h + * + * PostScript glyph names. + * + * Copyright (C) 2005-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /* This file has been generated automatically -- do not edit! */ + + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const char ft_standard_glyph_names[3696] +#ifdef DEFINE_PS_TABLES_DATA + = + { + '.','n','u','l','l', 0, + 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, + 'n','o','t','e','q','u','a','l', 0, + 'i','n','f','i','n','i','t','y', 0, + 'l','e','s','s','e','q','u','a','l', 0, + 'g','r','e','a','t','e','r','e','q','u','a','l', 0, + 'p','a','r','t','i','a','l','d','i','f','f', 0, + 's','u','m','m','a','t','i','o','n', 0, + 'p','r','o','d','u','c','t', 0, + 'p','i', 0, + 'i','n','t','e','g','r','a','l', 0, + 'O','m','e','g','a', 0, + 'r','a','d','i','c','a','l', 0, + 'a','p','p','r','o','x','e','q','u','a','l', 0, + 'D','e','l','t','a', 0, + 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, + 'l','o','z','e','n','g','e', 0, + 'a','p','p','l','e', 0, + 'f','r','a','n','c', 0, + 'G','b','r','e','v','e', 0, + 'g','b','r','e','v','e', 0, + 'I','d','o','t','a','c','c','e','n','t', 0, + 'S','c','e','d','i','l','l','a', 0, + 's','c','e','d','i','l','l','a', 0, + 'C','a','c','u','t','e', 0, + 'c','a','c','u','t','e', 0, + 'C','c','a','r','o','n', 0, + 'c','c','a','r','o','n', 0, + 'd','c','r','o','a','t', 0, + '.','n','o','t','d','e','f', 0, + 's','p','a','c','e', 0, + 'e','x','c','l','a','m', 0, + 'q','u','o','t','e','d','b','l', 0, + 'n','u','m','b','e','r','s','i','g','n', 0, + 'd','o','l','l','a','r', 0, + 'p','e','r','c','e','n','t', 0, + 'a','m','p','e','r','s','a','n','d', 0, + 'q','u','o','t','e','r','i','g','h','t', 0, + 'p','a','r','e','n','l','e','f','t', 0, + 'p','a','r','e','n','r','i','g','h','t', 0, + 'a','s','t','e','r','i','s','k', 0, + 'p','l','u','s', 0, + 'c','o','m','m','a', 0, + 'h','y','p','h','e','n', 0, + 'p','e','r','i','o','d', 0, + 's','l','a','s','h', 0, + 'z','e','r','o', 0, + 'o','n','e', 0, + 't','w','o', 0, + 't','h','r','e','e', 0, + 'f','o','u','r', 0, + 'f','i','v','e', 0, + 's','i','x', 0, + 's','e','v','e','n', 0, + 'e','i','g','h','t', 0, + 'n','i','n','e', 0, + 'c','o','l','o','n', 0, + 's','e','m','i','c','o','l','o','n', 0, + 'l','e','s','s', 0, + 'e','q','u','a','l', 0, + 'g','r','e','a','t','e','r', 0, + 'q','u','e','s','t','i','o','n', 0, + 'a','t', 0, + 'A', 0, + 'B', 0, + 'C', 0, + 'D', 0, + 'E', 0, + 'F', 0, + 'G', 0, + 'H', 0, + 'I', 0, + 'J', 0, + 'K', 0, + 'L', 0, + 'M', 0, + 'N', 0, + 'O', 0, + 'P', 0, + 'Q', 0, + 'R', 0, + 'S', 0, + 'T', 0, + 'U', 0, + 'V', 0, + 'W', 0, + 'X', 0, + 'Y', 0, + 'Z', 0, + 'b','r','a','c','k','e','t','l','e','f','t', 0, + 'b','a','c','k','s','l','a','s','h', 0, + 'b','r','a','c','k','e','t','r','i','g','h','t', 0, + 'a','s','c','i','i','c','i','r','c','u','m', 0, + 'u','n','d','e','r','s','c','o','r','e', 0, + 'q','u','o','t','e','l','e','f','t', 0, + 'a', 0, + 'b', 0, + 'c', 0, + 'd', 0, + 'e', 0, + 'f', 0, + 'g', 0, + 'h', 0, + 'i', 0, + 'j', 0, + 'k', 0, + 'l', 0, + 'm', 0, + 'n', 0, + 'o', 0, + 'p', 0, + 'q', 0, + 'r', 0, + 's', 0, + 't', 0, + 'u', 0, + 'v', 0, + 'w', 0, + 'x', 0, + 'y', 0, + 'z', 0, + 'b','r','a','c','e','l','e','f','t', 0, + 'b','a','r', 0, + 'b','r','a','c','e','r','i','g','h','t', 0, + 'a','s','c','i','i','t','i','l','d','e', 0, + 'e','x','c','l','a','m','d','o','w','n', 0, + 'c','e','n','t', 0, + 's','t','e','r','l','i','n','g', 0, + 'f','r','a','c','t','i','o','n', 0, + 'y','e','n', 0, + 'f','l','o','r','i','n', 0, + 's','e','c','t','i','o','n', 0, + 'c','u','r','r','e','n','c','y', 0, + 'q','u','o','t','e','s','i','n','g','l','e', 0, + 'q','u','o','t','e','d','b','l','l','e','f','t', 0, + 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, + 'f','i', 0, + 'f','l', 0, + 'e','n','d','a','s','h', 0, + 'd','a','g','g','e','r', 0, + 'd','a','g','g','e','r','d','b','l', 0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, + 'p','a','r','a','g','r','a','p','h', 0, + 'b','u','l','l','e','t', 0, + 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, + 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, + 'e','l','l','i','p','s','i','s', 0, + 'p','e','r','t','h','o','u','s','a','n','d', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n', 0, + 'g','r','a','v','e', 0, + 'a','c','u','t','e', 0, + 'c','i','r','c','u','m','f','l','e','x', 0, + 't','i','l','d','e', 0, + 'm','a','c','r','o','n', 0, + 'b','r','e','v','e', 0, + 'd','o','t','a','c','c','e','n','t', 0, + 'd','i','e','r','e','s','i','s', 0, + 'r','i','n','g', 0, + 'c','e','d','i','l','l','a', 0, + 'h','u','n','g','a','r','u','m','l','a','u','t', 0, + 'o','g','o','n','e','k', 0, + 'c','a','r','o','n', 0, + 'e','m','d','a','s','h', 0, + 'A','E', 0, + 'o','r','d','f','e','m','i','n','i','n','e', 0, + 'L','s','l','a','s','h', 0, + 'O','s','l','a','s','h', 0, + 'O','E', 0, + 'o','r','d','m','a','s','c','u','l','i','n','e', 0, + 'a','e', 0, + 'd','o','t','l','e','s','s','i', 0, + 'l','s','l','a','s','h', 0, + 'o','s','l','a','s','h', 0, + 'o','e', 0, + 'g','e','r','m','a','n','d','b','l','s', 0, + 'o','n','e','s','u','p','e','r','i','o','r', 0, + 'l','o','g','i','c','a','l','n','o','t', 0, + 'm','u', 0, + 't','r','a','d','e','m','a','r','k', 0, + 'E','t','h', 0, + 'o','n','e','h','a','l','f', 0, + 'p','l','u','s','m','i','n','u','s', 0, + 'T','h','o','r','n', 0, + 'o','n','e','q','u','a','r','t','e','r', 0, + 'd','i','v','i','d','e', 0, + 'b','r','o','k','e','n','b','a','r', 0, + 'd','e','g','r','e','e', 0, + 't','h','o','r','n', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, + 't','w','o','s','u','p','e','r','i','o','r', 0, + 'r','e','g','i','s','t','e','r','e','d', 0, + 'm','i','n','u','s', 0, + 'e','t','h', 0, + 'm','u','l','t','i','p','l','y', 0, + 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, + 'c','o','p','y','r','i','g','h','t', 0, + 'A','a','c','u','t','e', 0, + 'A','c','i','r','c','u','m','f','l','e','x', 0, + 'A','d','i','e','r','e','s','i','s', 0, + 'A','g','r','a','v','e', 0, + 'A','r','i','n','g', 0, + 'A','t','i','l','d','e', 0, + 'C','c','e','d','i','l','l','a', 0, + 'E','a','c','u','t','e', 0, + 'E','c','i','r','c','u','m','f','l','e','x', 0, + 'E','d','i','e','r','e','s','i','s', 0, + 'E','g','r','a','v','e', 0, + 'I','a','c','u','t','e', 0, + 'I','c','i','r','c','u','m','f','l','e','x', 0, + 'I','d','i','e','r','e','s','i','s', 0, + 'I','g','r','a','v','e', 0, + 'N','t','i','l','d','e', 0, + 'O','a','c','u','t','e', 0, + 'O','c','i','r','c','u','m','f','l','e','x', 0, + 'O','d','i','e','r','e','s','i','s', 0, + 'O','g','r','a','v','e', 0, + 'O','t','i','l','d','e', 0, + 'S','c','a','r','o','n', 0, + 'U','a','c','u','t','e', 0, + 'U','c','i','r','c','u','m','f','l','e','x', 0, + 'U','d','i','e','r','e','s','i','s', 0, + 'U','g','r','a','v','e', 0, + 'Y','a','c','u','t','e', 0, + 'Y','d','i','e','r','e','s','i','s', 0, + 'Z','c','a','r','o','n', 0, + 'a','a','c','u','t','e', 0, + 'a','c','i','r','c','u','m','f','l','e','x', 0, + 'a','d','i','e','r','e','s','i','s', 0, + 'a','g','r','a','v','e', 0, + 'a','r','i','n','g', 0, + 'a','t','i','l','d','e', 0, + 'c','c','e','d','i','l','l','a', 0, + 'e','a','c','u','t','e', 0, + 'e','c','i','r','c','u','m','f','l','e','x', 0, + 'e','d','i','e','r','e','s','i','s', 0, + 'e','g','r','a','v','e', 0, + 'i','a','c','u','t','e', 0, + 'i','c','i','r','c','u','m','f','l','e','x', 0, + 'i','d','i','e','r','e','s','i','s', 0, + 'i','g','r','a','v','e', 0, + 'n','t','i','l','d','e', 0, + 'o','a','c','u','t','e', 0, + 'o','c','i','r','c','u','m','f','l','e','x', 0, + 'o','d','i','e','r','e','s','i','s', 0, + 'o','g','r','a','v','e', 0, + 'o','t','i','l','d','e', 0, + 's','c','a','r','o','n', 0, + 'u','a','c','u','t','e', 0, + 'u','c','i','r','c','u','m','f','l','e','x', 0, + 'u','d','i','e','r','e','s','i','s', 0, + 'u','g','r','a','v','e', 0, + 'y','a','c','u','t','e', 0, + 'y','d','i','e','r','e','s','i','s', 0, + 'z','c','a','r','o','n', 0, + 'e','x','c','l','a','m','s','m','a','l','l', 0, + 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, + 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, + 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, + 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, + 'A','c','u','t','e','s','m','a','l','l', 0, + 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, + 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, + 'z','e','r','o','o','l','d','s','t','y','l','e', 0, + 'o','n','e','o','l','d','s','t','y','l','e', 0, + 't','w','o','o','l','d','s','t','y','l','e', 0, + 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, + 'f','o','u','r','o','l','d','s','t','y','l','e', 0, + 'f','i','v','e','o','l','d','s','t','y','l','e', 0, + 's','i','x','o','l','d','s','t','y','l','e', 0, + 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, + 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, + 'n','i','n','e','o','l','d','s','t','y','l','e', 0, + 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, + 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, + 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, + 'a','s','u','p','e','r','i','o','r', 0, + 'b','s','u','p','e','r','i','o','r', 0, + 'c','e','n','t','s','u','p','e','r','i','o','r', 0, + 'd','s','u','p','e','r','i','o','r', 0, + 'e','s','u','p','e','r','i','o','r', 0, + 'i','s','u','p','e','r','i','o','r', 0, + 'l','s','u','p','e','r','i','o','r', 0, + 'm','s','u','p','e','r','i','o','r', 0, + 'n','s','u','p','e','r','i','o','r', 0, + 'o','s','u','p','e','r','i','o','r', 0, + 'r','s','u','p','e','r','i','o','r', 0, + 's','s','u','p','e','r','i','o','r', 0, + 't','s','u','p','e','r','i','o','r', 0, + 'f','f', 0, + 'f','f','i', 0, + 'f','f','l', 0, + 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, + 'G','r','a','v','e','s','m','a','l','l', 0, + 'A','s','m','a','l','l', 0, + 'B','s','m','a','l','l', 0, + 'C','s','m','a','l','l', 0, + 'D','s','m','a','l','l', 0, + 'E','s','m','a','l','l', 0, + 'F','s','m','a','l','l', 0, + 'G','s','m','a','l','l', 0, + 'H','s','m','a','l','l', 0, + 'I','s','m','a','l','l', 0, + 'J','s','m','a','l','l', 0, + 'K','s','m','a','l','l', 0, + 'L','s','m','a','l','l', 0, + 'M','s','m','a','l','l', 0, + 'N','s','m','a','l','l', 0, + 'O','s','m','a','l','l', 0, + 'P','s','m','a','l','l', 0, + 'Q','s','m','a','l','l', 0, + 'R','s','m','a','l','l', 0, + 'S','s','m','a','l','l', 0, + 'T','s','m','a','l','l', 0, + 'U','s','m','a','l','l', 0, + 'V','s','m','a','l','l', 0, + 'W','s','m','a','l','l', 0, + 'X','s','m','a','l','l', 0, + 'Y','s','m','a','l','l', 0, + 'Z','s','m','a','l','l', 0, + 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, + 'o','n','e','f','i','t','t','e','d', 0, + 'r','u','p','i','a','h', 0, + 'T','i','l','d','e','s','m','a','l','l', 0, + 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, + 'c','e','n','t','o','l','d','s','t','y','l','e', 0, + 'L','s','l','a','s','h','s','m','a','l','l', 0, + 'S','c','a','r','o','n','s','m','a','l','l', 0, + 'Z','c','a','r','o','n','s','m','a','l','l', 0, + 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'B','r','e','v','e','s','m','a','l','l', 0, + 'C','a','r','o','n','s','m','a','l','l', 0, + 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, + 'M','a','c','r','o','n','s','m','a','l','l', 0, + 'f','i','g','u','r','e','d','a','s','h', 0, + 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, + 'O','g','o','n','e','k','s','m','a','l','l', 0, + 'R','i','n','g','s','m','a','l','l', 0, + 'C','e','d','i','l','l','a','s','m','a','l','l', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, + 'o','n','e','e','i','g','h','t','h', 0, + 't','h','r','e','e','e','i','g','h','t','h','s', 0, + 'f','i','v','e','e','i','g','h','t','h','s', 0, + 's','e','v','e','n','e','i','g','h','t','h','s', 0, + 'o','n','e','t','h','i','r','d', 0, + 't','w','o','t','h','i','r','d','s', 0, + 'z','e','r','o','s','u','p','e','r','i','o','r', 0, + 'f','o','u','r','s','u','p','e','r','i','o','r', 0, + 'f','i','v','e','s','u','p','e','r','i','o','r', 0, + 's','i','x','s','u','p','e','r','i','o','r', 0, + 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, + 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 'n','i','n','e','s','u','p','e','r','i','o','r', 0, + 'z','e','r','o','i','n','f','e','r','i','o','r', 0, + 'o','n','e','i','n','f','e','r','i','o','r', 0, + 't','w','o','i','n','f','e','r','i','o','r', 0, + 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, + 'f','o','u','r','i','n','f','e','r','i','o','r', 0, + 'f','i','v','e','i','n','f','e','r','i','o','r', 0, + 's','i','x','i','n','f','e','r','i','o','r', 0, + 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, + 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'n','i','n','e','i','n','f','e','r','i','o','r', 0, + 'c','e','n','t','i','n','f','e','r','i','o','r', 0, + 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, + 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, + 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, + 'A','g','r','a','v','e','s','m','a','l','l', 0, + 'A','a','c','u','t','e','s','m','a','l','l', 0, + 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'A','t','i','l','d','e','s','m','a','l','l', 0, + 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'A','r','i','n','g','s','m','a','l','l', 0, + 'A','E','s','m','a','l','l', 0, + 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, + 'E','g','r','a','v','e','s','m','a','l','l', 0, + 'E','a','c','u','t','e','s','m','a','l','l', 0, + 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'I','g','r','a','v','e','s','m','a','l','l', 0, + 'I','a','c','u','t','e','s','m','a','l','l', 0, + 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'E','t','h','s','m','a','l','l', 0, + 'N','t','i','l','d','e','s','m','a','l','l', 0, + 'O','g','r','a','v','e','s','m','a','l','l', 0, + 'O','a','c','u','t','e','s','m','a','l','l', 0, + 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'O','t','i','l','d','e','s','m','a','l','l', 0, + 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'O','E','s','m','a','l','l', 0, + 'O','s','l','a','s','h','s','m','a','l','l', 0, + 'U','g','r','a','v','e','s','m','a','l','l', 0, + 'U','a','c','u','t','e','s','m','a','l','l', 0, + 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'Y','a','c','u','t','e','s','m','a','l','l', 0, + 'T','h','o','r','n','s','m','a','l','l', 0, + 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + '0','0','1','.','0','0','0', 0, + '0','0','1','.','0','0','1', 0, + '0','0','1','.','0','0','2', 0, + '0','0','1','.','0','0','3', 0, + 'B','l','a','c','k', 0, + 'B','o','l','d', 0, + 'B','o','o','k', 0, + 'L','i','g','h','t', 0, + 'M','e','d','i','u','m', 0, + 'R','e','g','u','l','a','r', 0, + 'R','o','m','a','n', 0, + 'S','e','m','i','b','o','l','d', 0, + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + +#define FT_NUM_MAC_NAMES 258 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const short ft_mac_names[FT_NUM_MAC_NAMES] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, + 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, + 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, + 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, + 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, + 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, + 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, + 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, + 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, + 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, + 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, + 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, + 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, + 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, + 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, + 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, + 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, + 209, 218, 225, 232, 239, 246 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + +#define FT_NUM_SID_NAMES 391 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const short ft_sid_names[FT_NUM_SID_NAMES] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, + 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, + 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, + 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, + 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, + 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, + 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, + 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, + 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, + 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, + 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, + 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, + 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, + 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, + 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, + 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, + 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, + 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, + 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, + 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, + 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, + 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, + 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, + 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, + 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, + 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + + /* the following are indices into the SID name table */ +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned short t1_standard_encoding[256] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, + 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, + 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, + 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + + /* the following are indices into the SID name table */ +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned short t1_expert_encoding[256] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, + 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, + 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, + 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, + 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, + 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, + 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, + 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, + 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, + 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, + 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned char ft_adobe_glyph_list[55997L] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, + 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, + 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, + 32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109, + 88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255, + 135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199, + 202, 25,204,166,208,209,209, 81,215, 26, 65,143, 0, 65, 0,140, + 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, + 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, + 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, + 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, + 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, + 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, + 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, + 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, + 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, + 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, + 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, + 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, + 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, + 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, + 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, + 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, + 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, + 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, + 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, + 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, + 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, + 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, + 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, + 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, + 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, + 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, + 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, + 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, + 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, + 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, + 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, + 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, + 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, + 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, + 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, + 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, + 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, + 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, + 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, + 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, + 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, + 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, + 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, + 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, + 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, + 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, + 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, + 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, + 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, + 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, + 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, + 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, + 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, + 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, + 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, + 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, + 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, + 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, + 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, + 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, + 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, + 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, + 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, + 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, + 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, + 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, + 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, + 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, + 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, + 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, + 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, + 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, + 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, + 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, + 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, + 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, + 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, + 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, + 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, + 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, + 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, + 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, + 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, + 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, + 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, + 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, + 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, + 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, + 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, + 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, + 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, + 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, + 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, + 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, + 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, + 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, + 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, + 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, + 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, + 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, + 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, + 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, + 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, + 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, + 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, + 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, + 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, + 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, + 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, + 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, + 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, + 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, + 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, + 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, + 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, + 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, + 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, + 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, + 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, + 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, + 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, + 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, + 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, + 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, + 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, + 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, + 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, + 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, + 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, + 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, + 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, + 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, + 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, + 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, + 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, + 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, + 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, + 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, + 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, + 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, + 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, + 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, + 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, + 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, + 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, + 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, + 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, + 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, + 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, + 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, + 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, + 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, + 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, + 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, + 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, + 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, + 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, + 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, + 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, + 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, + 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, + 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, + 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, + 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, + 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, + 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, + 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, + 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, + 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, + 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, + 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, + 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, + 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, + 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, + 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, + 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, + 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, + 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, + 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, + 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, + 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, + 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, + 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, + 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, + 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, + 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, + 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, + 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, + 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, + 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, + 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, + 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, + 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, + 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, + 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, + 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, + 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, + 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, + 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, + 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, + 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, + 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, + 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, + 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, + 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, + 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, + 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, + 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, + 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, + 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, + 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, + 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, + 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, + 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, + 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, + 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, + 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, + 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, + 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, + 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, + 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, + 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, + 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, + 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, + 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, + 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, + 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, + 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, + 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, + 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, + 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, + 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, + 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, + 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, + 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, + 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, + 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, + 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, + 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, + 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, + 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, + 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, + 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, + 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, + 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, + 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, + 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, + 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, + 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, + 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, + 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, + 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, + 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, + 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, + 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, + 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, + 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, + 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, + 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, + 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, + 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, + 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, + 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, + 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, + 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, + 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, + 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, + 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, + 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, + 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, + 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, + 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, + 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, + 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, + 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, + 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, + 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, + 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, + 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, + 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, + 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, + 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, + 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, + 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, + 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, + 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, + 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, + 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, + 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, + 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, + 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, + 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, + 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, + 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, + 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, + 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, + 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, + 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, + 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, + 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, + 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, + 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, + 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, + 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, + 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, + 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, + 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, + 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, + 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, + 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, + 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, + 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, + 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, + 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, + 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, + 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, + 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, + 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, + 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, + 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, + 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, + 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, + 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, + 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, + 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, + 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, + 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, + 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, + 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, + 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, + 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, + 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, + 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, + 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, + 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, + 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, + 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, + 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, + 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, + 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, + 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, + 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, + 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, + 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, + 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, + 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, + 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, + 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, + 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, + 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, + 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, + 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, + 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, + 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, + 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, + 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, + 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, + 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, + 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, + 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, + 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, + 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, + 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, + 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, + 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, + 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, + 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, + 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, + 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, + 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, + 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, + 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, + 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, + 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, + 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, + 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, + 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, + 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, + 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, + 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, + 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, + 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, + 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, + 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, + 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, + 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, + 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, + 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, + 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, + 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, + 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, + 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, + 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, + 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, + 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, + 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, + 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, + 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, + 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, + 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, + 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, + 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, + 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, + 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, + 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, + 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, + 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, + 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, + 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, + 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, + 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, + 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, + 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, + 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, + 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, + 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, + 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, + 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, + 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, + 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, + 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, + 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, + 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, + 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, + 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, + 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, + 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, + 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, + 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, + 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, + 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, + 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, + 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, + 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, + 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, + 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, + 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, + 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, + 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, + 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, + 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, + 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, + 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, + 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, + 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, + 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, + 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, + 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, + 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, + 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, + 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, + 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, + 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, + 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, + 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, + 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, + 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, + 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, + 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, + 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, + 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, + 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, + 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, + 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, + 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, + 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, + 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, + 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, + 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, + 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, + 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, + 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, + 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, + 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, + 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, + 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, + 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, + 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, + 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, + 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, + 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, + 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, + 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, + 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, + 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, + 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, + 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, + 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, + 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, + 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, + 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, + 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, + 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, + 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, + 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, + 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, + 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, + 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, + 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, + 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, + 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, + 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, + 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, + 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, + 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, + 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, + 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, + 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, + 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, + 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, + 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, + 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, + 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, + 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, + 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, + 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, + 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, + 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, + 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, + 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, + 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, + 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, + 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, + 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, + 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, + 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, + 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, + 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, + 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, + 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, + 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, + 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, + 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, + 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, + 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, + 247,122,244,242,239,235,101,128, 1,181, 97,158, 0, 97, 36, 26, + 38,154, 39, 4, 39, 68, 39,132, 39,196, 40, 4, 40, 68, 40,126, + 40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229, + 50, 0, 50,225, 51, 7, 52, 96, 52,168, 53,123, 53,132, 54, 5, + 56, 13, 57, 3, 57, 50, 57,201, 57,215, 49,138, 39, 1, 36, 50, + 36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26, + 38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90, + 36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128, + 39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128, + 39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128, + 38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146, + 36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128, + 39, 9, 56,128, 39, 8, 57,128, 39, 7, 50,138, 38, 30, 36,178, + 36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210, + 36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128, + 36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128, + 36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242, + 36,246, 36,250, 36,254, 37, 2, 37, 6, 37, 10, 37, 14, 37, 18, + 37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128, + 39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128, + 39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50, + 37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82, + 37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128, + 39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128, + 39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114, + 37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146, + 37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128, + 39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128, + 39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178, + 37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210, + 37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128, + 33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128, + 39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242, + 37,246, 37,250, 37,254, 38, 2, 38, 6, 38, 10, 38, 14, 38, 18, + 38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128, + 39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128, + 39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50, + 38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82, + 38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128, + 39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128, + 39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114, + 38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146, + 38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128, + 39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128, + 39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39, 2, 38,178, + 38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252, + 39, 0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212, + 38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39, 3, + 51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112, + 49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24, + 53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28, + 57,128, 39, 34, 51,138, 39, 4, 39, 28, 39, 32, 39, 36, 39, 40, + 39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35, + 49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39, + 53,128, 38, 5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43, + 57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104, + 39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45, + 49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49, + 53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53, + 57,128, 39, 54, 53,138, 39, 6, 39,156, 39,160, 39,164, 39,168, + 39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55, + 49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59, + 53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63, + 57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232, + 39,236, 39,240, 39,244, 39,248, 39,252, 40, 0, 48,128, 39, 65, + 49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69, + 53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73, + 57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40, + 40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75, + 49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79, + 53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198, + 57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102, + 40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128, + 39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128, + 39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138, + 39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174, + 40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128, + 39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128, + 39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97, 7, + 40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229, + 238,231,225,236,105,128, 9,134,227,245,244,101,128, 0,225,228, + 229,246, 97,128, 9, 6,231,117, 2, 40,237, 40,246,234,225,242, + 225,244,105,128, 10,134,242,237,245,235,232,105,128, 10, 6,237, + 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242, + 245,243,241,245,225,242,101,128, 51, 3,246,239,247,229,236,243, + 233,231,110, 3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236, + 105,128, 9,190,228,229,246, 97,128, 9, 62,231,245,234,225,242, + 225,244,105,128, 10,190, 98, 4, 41, 80, 41,121, 41,130, 41,140, + 226,242,229,246,233,225,244,233,239,110, 2, 41, 95, 41,110,237, + 225,242,235,225,242,237,229,238,233,225,110,128, 5, 95,243,233, + 231,238,228,229,246, 97,128, 9,112,229,238,231,225,236,105,128, + 9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101, + 134, 1, 3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225, + 227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128, + 4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225, + 246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30, + 179,244,233,236,228,101,128, 30,181, 99, 4, 41,227, 41,234, 42, + 57, 42,127,225,242,239,110,128, 1,206,233,242, 99, 2, 41,242, + 41,247,236,101,128, 36,208,245,237,230,236,229,120,133, 0,226, + 42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128, + 30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225, + 246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30, + 169,244,233,236,228,101,128, 30,171,245,244,101,133, 0,180, 42, + 73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237, + 98,128, 3, 23, 99, 2, 42, 90, 42, 95,237, 98,128, 3, 1,239, + 237, 98,128, 3, 1,228,229,246, 97,128, 9, 84,236,239,247,237, + 239,100,128, 2,207,244,239,238,229,227,237, 98,128, 3, 65,249, + 242,233,236,236,233, 99,128, 4, 48,100, 5, 42,149, 42,159, 42, + 173, 42,179, 42,213,226,236,231,242,225,246,101,128, 2, 1,228, + 225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97, + 128, 9, 5,233,229,242,229,243,233,115,130, 0,228, 42,193, 42, + 204,227,249,242,233,236,236,233, 99,128, 4,211,237,225,227,242, + 239,110,128, 1,223,239,116, 2, 42,220, 42,228,226,229,236,239, + 119,128, 30,161,237,225,227,242,239,110,128, 1,225,101,131, 0, + 230, 42,247, 42,255, 43, 8,225,227,245,244,101,128, 1,253,235, + 239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128, 1, + 227,230,233,105, 6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49, + 111, 48, 2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185, + 180, 49,128, 32,164,177, 48, 3, 43, 62, 45, 86, 45,221, 48, 9, + 43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218, + 45, 24, 49, 3, 43, 90, 43, 94, 43, 98, 55,128, 4, 16, 56,128, + 4, 17, 57,128, 4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136, + 43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128, 4, 19, + 49,128, 4, 20, 50,128, 4, 21, 51,128, 4, 1, 52,128, 4, 22, + 53,128, 4, 23, 54,128, 4, 24, 55,128, 4, 25, 56,128, 4, 26, + 57,128, 4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202, + 43,206, 43,210, 43,214, 43,218, 43,222, 48,128, 4, 28, 49,128, + 4, 29, 50,128, 4, 30, 51,128, 4, 31, 52,128, 4, 32, 53,128, + 4, 33, 54,128, 4, 34, 55,128, 4, 35, 56,128, 4, 36, 57,128, + 4, 37, 52, 10, 43,248, 43,252, 44, 0, 44, 4, 44, 8, 44, 12, + 44, 16, 44, 20, 44, 24, 44, 28, 48,128, 4, 38, 49,128, 4, 39, + 50,128, 4, 40, 51,128, 4, 41, 52,128, 4, 42, 53,128, 4, 43, + 54,128, 4, 44, 55,128, 4, 45, 56,128, 4, 46, 57,128, 4, 47, + 53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78, + 44, 82, 44, 86, 44, 90, 48,128, 4,144, 49,128, 4, 2, 50,128, + 4, 3, 51,128, 4, 4, 52,128, 4, 5, 53,128, 4, 6, 54,128, + 4, 7, 55,128, 4, 8, 56,128, 4, 9, 57,128, 4, 10, 54, 10, + 44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144, + 44,148, 44,152, 48,128, 4, 11, 49,128, 4, 12, 50,128, 4, 14, + 51,128,246,196, 52,128,246,197, 53,128, 4, 48, 54,128, 4, 49, + 55,128, 4, 50, 56,128, 4, 51, 57,128, 4, 52, 55, 10, 44,178, + 44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210, + 44,214, 48,128, 4, 53, 49,128, 4, 81, 50,128, 4, 54, 51,128, + 4, 55, 52,128, 4, 56, 53,128, 4, 57, 54,128, 4, 58, 55,128, + 4, 59, 56,128, 4, 60, 57,128, 4, 61, 56, 10, 44,240, 44,244, + 44,248, 44,252, 45, 0, 45, 4, 45, 8, 45, 12, 45, 16, 45, 20, + 48,128, 4, 62, 49,128, 4, 63, 50,128, 4, 64, 51,128, 4, 65, + 52,128, 4, 66, 53,128, 4, 67, 54,128, 4, 68, 55,128, 4, 69, + 56,128, 4, 70, 57,128, 4, 71, 57, 10, 45, 46, 45, 50, 45, 54, + 45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128, + 4, 72, 49,128, 4, 73, 50,128, 4, 74, 51,128, 4, 75, 52,128, + 4, 76, 53,128, 4, 77, 54,128, 4, 78, 55,128, 4, 79, 56,128, + 4,145, 57,128, 4, 82, 49, 4, 45, 96, 45,158, 45,163, 45,189, + 48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142, + 45,146, 45,150, 45,154, 48,128, 4, 83, 49,128, 4, 84, 50,128, + 4, 85, 51,128, 4, 86, 52,128, 4, 87, 53,128, 4, 88, 54,128, + 4, 89, 55,128, 4, 90, 56,128, 4, 91, 57,128, 4, 92,177, 48, + 128, 4, 94, 52, 4, 45,173, 45,177, 45,181, 45,185, 53,128, 4, + 15, 54,128, 4, 98, 55,128, 4,114, 56,128, 4,116, 57, 5, 45, + 201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128, 4, + 95, 52,128, 4, 99, 53,128, 4,115, 54,128, 4,117, 56, 2, 45, + 227, 45,241, 51, 2, 45,233, 45,237, 49,128,246,199, 50,128,246, + 200,180, 54,128, 4,217,178,185, 57,128, 32, 14,179, 48, 2, 46, + 3, 46, 7, 48,128, 32, 15, 49,128, 32, 13,181, 55, 7, 46, 28, + 46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51, 2, 46, 34, + 46, 48, 56, 2, 46, 40, 46, 44, 49,128, 6,106, 56,128, 6, 12, + 57, 8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90, + 46, 94, 50,128, 6, 96, 51,128, 6, 97, 52,128, 6, 98, 53,128, + 6, 99, 54,128, 6,100, 55,128, 6,101, 56,128, 6,102, 57,128, + 6,103, 52, 7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102, + 47,158, 48, 5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128, + 6,104, 49,128, 6,105, 51,128, 6, 27, 55,128, 6, 31, 57,128, + 6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188, + 46,192, 46,196, 46,200, 46,204, 48,128, 6, 34, 49,128, 6, 35, + 50,128, 6, 36, 51,128, 6, 37, 52,128, 6, 38, 53,128, 6, 39, + 54,128, 6, 40, 55,128, 6, 41, 56,128, 6, 42, 57,128, 6, 43, + 50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254, + 47, 2, 47, 6, 47, 10, 48,128, 6, 44, 49,128, 6, 45, 50,128, + 6, 46, 51,128, 6, 47, 52,128, 6, 48, 53,128, 6, 49, 54,128, + 6, 50, 55,128, 6, 51, 56,128, 6, 52, 57,128, 6, 53, 51, 5, + 47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128, 6, 54, 49,128, + 6, 55, 50,128, 6, 56, 51,128, 6, 57, 52,128, 6, 58, 52, 9, + 47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94, + 47, 98, 48,128, 6, 64, 49,128, 6, 65, 50,128, 6, 66, 51,128, + 6, 67, 52,128, 6, 68, 53,128, 6, 69, 54,128, 6, 70, 56,128, + 6, 72, 57,128, 6, 73, 53, 9, 47,122, 47,126, 47,130, 47,134, + 47,138, 47,142, 47,146, 47,150, 47,154, 48,128, 6, 74, 49,128, + 6, 75, 50,128, 6, 76, 51,128, 6, 77, 52,128, 6, 78, 53,128, + 6, 79, 54,128, 6, 80, 55,128, 6, 81, 56,128, 6, 82,183, 48, + 128, 6, 71, 53, 3, 47,171, 47,203, 47,235, 48, 5, 47,183, 47, + 187, 47,191, 47,195, 47,199, 53,128, 6,164, 54,128, 6,126, 55, + 128, 6,134, 56,128, 6,152, 57,128, 6,175, 49, 5, 47,215, 47, + 219, 47,223, 47,227, 47,231, 49,128, 6,121, 50,128, 6,136, 51, + 128, 6,145, 52,128, 6,186, 57,128, 6,210,179, 52,128, 6,213, + 54, 7, 48, 0, 48, 5, 48, 10, 48, 15, 48, 53, 48,115, 48,177, + 179, 54,128, 32,170,180, 53,128, 5,190,181, 56,128, 5,195, 54, + 6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128, 5, + 208, 53,128, 5,209, 54,128, 5,210, 55,128, 5,211, 56,128, 5, + 212, 57,128, 5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48, + 91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128, 5,214, 49, + 128, 5,215, 50,128, 5,216, 51,128, 5,217, 52,128, 5,218, 53, + 128, 5,219, 54,128, 5,220, 55,128, 5,221, 56,128, 5,222, 57, + 128, 5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48, + 157, 48,161, 48,165, 48,169, 48,173, 48,128, 5,224, 49,128, 5, + 225, 50,128, 5,226, 51,128, 5,227, 52,128, 5,228, 53,128, 5, + 229, 54,128, 5,230, 55,128, 5,231, 56,128, 5,232, 57,128, 5, + 233, 57, 3, 48,185, 48,189, 48,193, 48,128, 5,234, 52,128,251, + 42, 53,128,251, 43, 55, 4, 48,207, 48,221, 48,241, 48,246, 48, + 2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49, 3, 48, + 229, 48,233, 48,237, 54,128, 5,240, 55,128, 5,241, 56,128, 5, + 242,178, 51,128,251, 53, 57, 7, 49, 6, 49, 10, 49, 14, 49, 18, + 49, 22, 49, 26, 49, 30, 51,128, 5,180, 52,128, 5,181, 53,128, + 5,182, 54,128, 5,187, 55,128, 5,184, 56,128, 5,183, 57,128, + 5,176, 56, 3, 49, 42, 49, 86, 49, 91, 48, 7, 49, 58, 49, 62, + 49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128, 5,178, 49,128, + 5,177, 50,128, 5,179, 51,128, 5,194, 52,128, 5,193, 54,128, + 5,185, 55,128, 5,188,179, 57,128, 5,189, 52, 2, 49, 97, 49, + 101, 49,128, 5,191, 50,128, 5,192,185,178, 57,128, 2,188, 54, + 3, 49,119, 49,178, 49,185, 49, 4, 49,129, 49,145, 49,151, 49, + 172, 50, 2, 49,135, 49,140,180, 56,128, 33, 5,184, 57,128, 33, + 19,179,181, 50,128, 33, 22,181, 55, 3, 49,160, 49,164, 49,168, + 51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128, + 32, 12,179,177,182, 55,128, 6,109,180,185,179, 55,128, 2,189, + 103, 2, 49,198, 49,205,242,225,246,101,128, 0,224,117, 2, 49, + 211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235, + 232,105,128, 10, 5,104, 2, 49,235, 49,245,233,242,225,231,225, + 238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163, + 105, 7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181, + 98, 2, 50, 22, 50, 31,229,238,231,225,236,105,128, 9,144,239, + 240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128, 9, 16, + 229,227,249,242,233,236,236,233, 99,128, 4,213,231,117, 2, 50, + 67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235, + 232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235, + 232,105,128, 10, 72,110, 5, 50,113, 50,122, 50,136, 50,152, 50, + 167,225,242,225,226,233, 99,128, 6, 57,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 3,246,239,247,229,236,243,233,231,110, 3, 50, + 197, 50,207, 50,214,226,229,238,231,225,236,105,128, 9,200,228, + 229,246, 97,128, 9, 72,231,245,234,225,242,225,244,105,128, 10, + 200,107, 2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48, + 162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239, + 242,229,225,110,128, 49, 79,108, 3, 51, 15, 52, 71, 52, 80,101, + 2, 51, 21, 52, 66,102,136, 5,208, 51, 41, 51, 50, 51, 65, 51, + 79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128, + 6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251, + 48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104, + 2, 51, 85, 51,160,225,237,250, 97, 2, 51, 94, 51,127,225,226, + 239,246,101, 2, 51,104, 51,113,225,242,225,226,233, 99,128, 6, + 35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226, + 229,236,239,119, 2, 51,137, 51,146,225,242,225,226,233, 99,128, + 6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136, + 229,226,242,229,119,128, 5,208,236,225,237,229,228,232,229,226, + 242,229,119,128,251, 79,237, 97, 2, 51,189, 51,225,228,228,225, + 225,226,239,246,101, 2, 51,202, 51,211,225,242,225,226,233, 99, + 128, 6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 130,235,243,245,242, 97, 4, 51,239, 51,248, 52, 6, 52, 22,225, + 242,225,226,233, 99,128, 6, 73,230,233,238,225,236,225,242,225, + 226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225, + 226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226, + 233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119, + 128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128, + 251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76, + 240,232, 97,129, 3,177, 52, 88,244,239,238,239,115,128, 3,172, + 109, 4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128, + 1, 1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242, + 243,225,238,100,130, 0, 38, 52,139, 52,151,237,239,238,239,243, + 240,225,227,101,128,255, 6,243,237,225,236,108,128,247, 38,243, + 241,245,225,242,101,128, 51,194,110, 4, 52,178, 52,189, 53, 55, + 53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103, 4, 52, + 199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128, + 49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90, + 236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235, + 229,116, 2, 52,247, 53, 11,236,229,230,116,129, 48, 8, 53, 0, + 246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116, + 129, 48, 9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64, + 236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243, + 244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128, 3, + 135,117, 2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97, + 128, 9, 82,243,246,225,242, 97, 3, 53, 95, 53,105, 53,112,226, + 229,238,231,225,236,105,128, 9,130,228,229,246, 97,128, 9, 2, + 231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229, + 107,128, 1, 5,112, 3, 53,140, 53,164, 53,194, 97, 2, 53,146, + 53,158,225,244,239,243,241,245,225,242,101,128, 51, 0,242,229, + 110,128, 36,156,239,243,244,242,239,240,232,101, 2, 53,177, 53, + 188,225,242,237,229,238,233,225,110,128, 5, 90,237,239,100,128, + 2,188,112, 2, 53,200, 53,205,236,101,128,248,255,242,111, 2, + 53,212, 53,220,225,227,232,229,115,128, 34, 80,120, 2, 53,226, + 53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237, + 225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245, + 225,108,128, 34, 69,114, 4, 54, 15, 54, 42, 54, 46, 54, 91,225, + 229, 97, 2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49, + 142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105, 2, + 54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128, + 30,154,238,103,130, 0,229, 54, 75, 54, 83,225,227,245,244,101, + 128, 1,251,226,229,236,239,119,128, 30, 1,242,239,119, 8, 54, + 111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56, 4,226, + 239,244,104,128, 33,148,100, 3, 54,126, 54,165, 54,212,225,243, + 104, 4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33, + 227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226, + 245,112,128, 33,225,226,108, 5, 54,178, 54,185, 54,192, 54,199, + 54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211, + 236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245, + 112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239, + 236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247, + 232,233,244,101,128, 33,233,104, 2, 54,253, 55, 48,229,225,100, + 4, 55, 9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100, + 128, 2,197,236,229,230,244,237,239,100,128, 2,194,242,233,231, + 232,244,237,239,100,128, 2,195,245,240,237,239,100,128, 2,196, + 239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144, + 55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244, + 242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116, + 128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116, + 132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244, + 242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239, + 246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128, + 33,232,244,225, 98, 2, 55,170, 55,177,236,229,230,116,128, 33, + 228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198, + 55,226, 55,244, 55,252,100, 2, 55,204, 55,216,110,129, 33,149, + 55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128, + 33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247, + 110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244, + 101,128, 33,231,246,229,242,244,229,120,128,248,230,115, 5, 56, + 25, 56,101, 56,146, 56,229, 56,239, 99, 2, 56, 31, 56, 83,233, + 105, 2, 56, 38, 56, 61,227,233,242,227,245,109,129, 0, 94, 56, + 49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236, + 228,101,129, 0,126, 56, 71,237,239,238,239,243,240,225,227,101, + 128,255, 94,242,233,240,116,129, 2, 81, 56, 92,244,245,242,238, + 229,100,128, 2, 82,237,225,236,108, 2, 56,110, 56,121,232,233, + 242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238, + 97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128, + 255,103,244,229,242,233,115, 2, 56,156, 56,225,107,131, 0, 42, + 56,166, 56,194, 56,217, 97, 2, 56,172, 56,186,236,244,239,238, + 229,225,242,225,226,233, 99,128, 6,109,242,225,226,233, 99,128, + 6,109,109, 2, 56,200, 56,206,225,244,104,128, 34, 23,239,238, + 239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254, + 97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249, + 237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108, + 128, 34, 67,116,132, 0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233, + 236,228,101,128, 0,227,237,239,238,239,243,240,225,227,101,128, + 255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128, + 2, 80,117, 6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157, + 98, 2, 57, 70, 57, 79,229,238,231,225,236,105,128, 9,148,239, + 240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128, 9, 20, + 231,117, 2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148, + 242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237, + 225,242,235,226,229,238,231,225,236,105,128, 9,215,237,225,244, + 242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247, + 229,236,243,233,231,110, 3, 57,173, 57,183, 57,190,226,229,238, + 231,225,236,105,128, 9,204,228,229,246, 97,128, 9, 76,231,245, + 234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225, + 228,229,246, 97,128, 9, 61,121, 2, 57,221, 57,233,226,225,242, + 237,229,238,233,225,110,128, 5, 97,233,110,130, 5,226, 57,242, + 58, 1,225,236,244,239,238,229,232,229,226,242,229,119,128,251, + 32,232,229,226,242,229,119,128, 5,226, 98,144, 0, 98, 58, 46, + 58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72, + 62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97, 7, + 58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229, + 238,231,225,236,105,128, 9,172,227,235,243,236,225,243,104,129, + 0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60, + 228,229,246, 97,128, 9, 44,231,117, 2, 58,110, 58,119,234,225, + 242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44, + 104, 2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112, + 244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97, + 128, 48,208,114,129, 0,124, 58,169,237,239,238,239,243,240,225, + 227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49, 5, + 227,233,242,227,236,101,128, 36,209,228,239,116, 2, 58,209, 58, + 218,225,227,227,229,238,116,128, 30, 3,226,229,236,239,119,128, + 30, 5,101, 6, 58,240, 59, 5, 59, 28, 59,170, 59,181, 59,193, + 225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244, + 229,115,128, 38,108, 99, 2, 59, 11, 59, 18,225,245,243,101,128, + 34, 53,249,242,233,236,236,233, 99,128, 4, 49,104, 5, 59, 40, + 59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128, 6, + 40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105, + 2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101, 2, + 59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254, + 146,229,237,105, 2, 59,121, 59,136,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 8,238,239,239,238,230,233,238,225, + 236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225, + 238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128, 5, + 98,116,132, 5,209, 59,205, 59,225, 59,245, 59,254, 97,129, 3, + 178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242, + 229,119,128,251, 49,232,229,226,242,229,119,128, 5,209,242,225, + 230,229,232,229,226,242,229,119,128,251, 76,104, 2, 60, 17, 60, + 67, 97, 3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105, + 128, 9,173,228,229,246, 97,128, 9, 45,231,117, 2, 60, 49, 60, + 58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105, + 128, 10, 45,239,239,107,128, 2, 83,105, 5, 60, 85, 60, 96, 60, + 107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115, + 235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225, + 236,227,236,233,227,107,128, 2,152,238,228,233,231,245,242,237, + 245,235,232,105,128, 10, 2,242,245,243,241,245,225,242,101,128, + 51, 49,108, 3, 60,154, 62, 55, 62, 66, 97, 2, 60,160, 62, 50, + 227,107, 6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227, + 233,242,227,236,101,128, 37,207,100, 2, 60,190, 60,199,233,225, + 237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233, + 238,231,244,242,233,225,238,231,236,101,128, 37,188,108, 2, 60, + 227, 61, 74,101, 2, 60,233, 61, 13,230,244,240,239,233,238,244, + 233,238,103, 2, 60,248, 61, 2,240,239,233,238,244,229,114,128, + 37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233, + 227,245,236,225,242,226,242,225,227,235,229,116, 2, 61, 33, 61, + 53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227, + 225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246, + 229,242,244,233,227,225,108,128,254, 60,239,247,229,114, 2, 61, + 83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128, + 37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128, + 37,226,114, 2, 61,120, 61,131,229,227,244,225,238,231,236,101, + 128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103, 2, + 61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242, + 233,225,238,231,236,101,128, 37,182,115, 3, 61,177, 61,207, 61, + 215,109, 2, 61,183, 61,195,225,236,236,243,241,245,225,242,101, + 128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241, + 245,225,242,101,128, 37,160,244,225,114,128, 38, 5,245,240,112, + 2, 61,229, 62, 11,229,114, 2, 61,236, 61,251,236,229,230,244, + 244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244, + 244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233, + 238,103, 2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128, + 37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128, + 30, 7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227, + 101,128,255, 66,111, 3, 62, 92, 62,105, 62,116,226,225,233,237, + 225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238, + 97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240, + 225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51, + 195,114, 4, 62,155, 63,149, 63,222, 64, 5,225, 99, 2, 62,162, + 63, 56,101, 3, 62,170, 62,175, 62,243,229,120,128,248,244,236, + 229,230,116,133, 0,123, 62,192, 62,197, 62,219, 62,227, 62,232, + 226,116,128,248,243,109, 2, 62,203, 62,208,233,100,128,248,242, + 239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108, + 128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108, + 128,254, 55,242,233,231,232,116,133, 0,125, 63, 5, 63, 10, 63, + 32, 63, 40, 63, 45,226,116,128,248,254,109, 2, 63, 16, 63, 21, + 233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93, + 243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242, + 244,233,227,225,108,128,254, 56,235,229,116, 2, 63, 64, 63,106, + 236,229,230,116,132, 0, 91, 63, 79, 63, 84, 63, 89, 63,101,226, + 116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225, + 227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132, + 0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229, + 120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61, + 244,112,128,248,249,229,246,101,131, 2,216, 63,161, 63,172, 63, + 178,226,229,236,239,247,227,237, 98,128, 3, 46,227,237, 98,128, + 3, 6,233,238,246,229,242,244,229,100, 3, 63,193, 63,204, 63, + 210,226,229,236,239,247,227,237, 98,128, 3, 47,227,237, 98,128, + 3, 17,228,239,245,226,236,229,227,237, 98,128, 3, 97,233,228, + 231,101, 2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128, + 3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227, + 237, 98,128, 3, 58,239,235,229,238,226,225,114,128, 0,166,115, + 2, 64, 21, 64, 29,244,242,239,235,101,128, 1,128,245,240,229, + 242,233,239,114,128,246,234,244,239,240,226,225,114,128, 1,131, + 117, 3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97, + 128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108, + 2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238, + 246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114, + 128, 34, 25,243,229,249,101,128, 37,206, 99,143, 0, 99, 64,156, + 65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43, + 69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97, 9, 64,176, + 64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51, + 225,242,237,229,238,233,225,110,128, 5,110,226,229,238,231,225, + 236,105,128, 9,154,227,245,244,101,128, 1, 7,228,229,246, 97, + 128, 9, 26,231,117, 2, 64,218, 64,227,234,225,242,225,244,105, + 128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245, + 225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117, 4, + 65, 8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128, + 9,129,227,237, 98,128, 3, 16,228,229,246, 97,128, 9, 1,231, + 245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107, + 128, 33,234,114, 3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33, + 5,239,110,130, 2,199, 65, 74, 65, 85,226,229,236,239,247,227, + 237, 98,128, 3, 44,227,237, 98,128, 3, 12,242,233,225,231,229, + 242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230, + 111,128, 49, 24, 99, 4, 65,126, 65,133, 65,152, 65,174,225,242, + 239,110,128, 1, 13,229,228,233,236,236, 97,129, 0,231, 65,144, + 225,227,245,244,101,128, 30, 9,233,242, 99, 2, 65,160, 65,165, + 236,101,128, 36,210,245,237,230,236,229,120,128, 1, 9,245,242, + 108,128, 2, 85,100, 2, 65,186, 65,202,239,116,129, 1, 11, 65, + 193,225,227,227,229,238,116,128, 1, 11,243,241,245,225,242,101, + 128, 51,197,101, 2, 65,217, 65,233,228,233,236,236, 97,129, 0, + 184, 65,227,227,237, 98,128, 3, 39,238,116,132, 0,162, 65,246, + 66, 14, 66, 26, 66, 37,105, 2, 65,252, 66, 4,231,242,225,228, + 101,128, 33, 3,238,230,229,242,233,239,114,128,246,223,237,239, + 238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249, + 236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224, + 104, 5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97, 4, 66, 70, + 66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128, 5, + 121,226,229,238,231,225,236,105,128, 9,155,228,229,246, 97,128, + 9, 27,231,117, 2, 66,105, 66,114,234,225,242,225,244,105,128, + 10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237, + 239,230,111,128, 49, 20,101, 6, 66,148, 66,168, 66,192, 67, 4, + 67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,189, 99, 2, 66,174, 66,182,235,237, + 225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128, 4, 71, + 100, 2, 66,198, 66,242,229,243,227,229,238,228,229,114, 2, 66, + 211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233, + 236,236,233, 99,128, 4,191,227,249,242,233,236,236,233, 99,128, + 4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,245,232,225,242,237,229,238,233,225,110,128, 5,115, + 235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,204,246,229,242,244,233,227,225,236,243,244,242, + 239,235,229,227,249,242,233,236,236,233, 99,128, 4,185,105,129, + 3,199, 67, 68,229,245,227,104, 4, 67, 81, 67,116, 67,131, 67, + 140, 97, 2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229, + 238,235,239,242,229,225,110,128, 50, 9,111, 2, 67,160, 67,210, + 227,104, 3, 67,169, 67,191, 67,201,225,110, 2, 67,176, 67,184, + 231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14, 8,233, + 238,231,244,232,225,105,128, 14, 9,239,229,244,232,225,105,128, + 14, 12,239,107,128, 1,136,105, 2, 67,221, 68, 67,229,245, 99, + 5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97, 2, 67,241, 68, + 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242, + 229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 8,245,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 28,242, 99, 2, 68, 74, 68,169,236,101,132, 37,203, 68, + 87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128, + 34,151,239,116,128, 34,153,112, 2, 68,109, 68,115,236,245,115, + 128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247, + 233,244,104, 2, 68,136, 68,152,236,229,230,244,232,225,236,230, + 226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236, + 230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130, + 2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128, 3, + 45,227,237, 98,128, 3, 2,108, 3, 68,207, 68,213, 69, 11,229, + 225,114,128, 35, 39,233,227,107, 4, 68,225, 68,236, 68,245, 68, + 255,225,236,246,229,239,236,225,114,128, 1,194,228,229,238,244, + 225,108,128, 1,192,236,225,244,229,242,225,108,128, 1,193,242, + 229,244,242,239,230,236,229,120,128, 1,195,245, 98,129, 38, 99, + 69, 18,243,245,233,116, 2, 69, 27, 69, 35,226,236,225,227,107, + 128, 38, 99,247,232,233,244,101,128, 38,103,109, 3, 69, 51, 69, + 65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51, + 164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225, + 242,229,228,243,241,245,225,242,101,128, 51,160,111, 8, 69,110, + 69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242, + 237,229,238,233,225,110,128, 5,129,236,239,110,131, 0, 58, 69, + 133, 69,158, 69,177,237,239,110, 2, 69,141, 69,149,229,244,225, + 242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115, 2, + 69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254, + 85,244,242,233,225,238,231,245,236,225,114, 2, 69,192, 69,202, + 232,225,236,230,237,239,100,128, 2,209,237,239,100,128, 2,208, + 109, 2, 69,214, 70,143,237, 97,134, 0, 44, 69,231, 70, 39, 70, + 50, 70, 62, 70, 92, 70,115, 97, 3, 69,239, 70, 9, 70, 17,226, + 239,246,101, 2, 69,248, 69,254,227,237, 98,128, 3, 19,242,233, + 231,232,244,227,237, 98,128, 3, 21,227,227,229,238,116,128,246, + 195,114, 2, 70, 23, 70, 30,225,226,233, 99,128, 6, 12,237,229, + 238,233,225,110,128, 5, 93,233,238,230,229,242,233,239,114,128, + 246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229, + 246,229,242,243,229,100, 2, 70, 75, 70, 86,225,226,239,246,229, + 227,237, 98,128, 3, 20,237,239,100,128, 2,189,115, 2, 70, 98, + 70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114, + 128,246,226,244,245,242,238,229,100, 2, 70,126, 70,137,225,226, + 239,246,229,227,237, 98,128, 3, 18,237,239,100,128, 2,187,240, + 225,243,115,128, 38, 60,110, 2, 70,156, 70,165,231,242,245,229, + 238,116,128, 34, 69,116, 2, 70,171, 70,185,239,245,242,233,238, + 244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35, 3, 70, + 219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71, + 112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128, 0, + 6, 66, 2, 70,231, 70,236,197, 76,128, 0, 7, 83,128, 0, 8, + 67, 2, 70,246, 70,251,193, 78,128, 0, 24, 82,128, 0, 13, 68, + 3, 71, 7, 71, 33, 71, 38, 67, 4, 71, 17, 71, 21, 71, 25, 71, + 29, 49,128, 0, 17, 50,128, 0, 18, 51,128, 0, 19, 52,128, 0, + 20,197, 76,128, 0,127,204, 69,128, 0, 16, 69, 5, 71, 55, 71, + 59, 71, 64, 71, 69, 71, 74, 77,128, 0, 25,206, 81,128, 0, 5, + 207, 84,128, 0, 4,211, 67,128, 0, 27, 84, 2, 71, 80, 71, 84, + 66,128, 0, 23, 88,128, 0, 3, 70, 2, 71, 94, 71, 98, 70,128, + 0, 12, 83,128, 0, 28,199, 83,128, 0, 29,200, 84,128, 0, 9, + 204, 70,128, 0, 10,206,193, 75,128, 0, 21,210, 83,128, 0, 30, + 83, 5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128, 0, 15, + 79,129, 0, 14, 71,150, 84,128, 0, 2,212, 88,128, 0, 1,213, + 66,128, 0, 26,217, 78,128, 0, 22,213, 83,128, 0, 31,214, 84, + 128, 0, 11,240,249,242,233,231,232,116,129, 0,169, 71,191,115, + 2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128, + 246,217,114, 2, 71,216, 72, 44,238,229,242,226,242,225,227,235, + 229,116, 2, 71,231, 72, 9,236,229,230,116,130, 48, 12, 71,242, + 71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229, + 242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48, + 13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255, + 99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225, + 244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245, + 225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242, + 101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229, + 233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128, + 2,151,245,114, 2, 72,121, 72,139,236,121, 2, 72,128, 72,134, + 225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121, + 128, 0,164,249,114, 4, 72,158, 72,166, 72,173, 72,181,194,242, + 229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229, + 246,101,128,246,212,230,236,229,120,128,246,213,100,146, 0,100, + 72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59, + 78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227, + 79,247, 80, 19, 97, 11, 72,252, 73, 7, 73, 17, 73, 89, 73,152, + 73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229, + 238,233,225,110,128, 5,100,226,229,238,231,225,236,105,128, 9, + 166,100, 5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225, + 226,233, 99,128, 6, 54,229,246, 97,128, 9, 38,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225, + 236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236, + 225,242,225,226,233, 99,128,254,192,103, 3, 73, 97, 73,114, 73, + 128,229,243,104,129, 5,188, 73,105,232,229,226,242,229,119,128, + 5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33, + 117, 2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242, + 237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97, + 128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108, 3, + 73,182, 73,191, 73,229,225,242,225,226,233, 99,128, 6, 47,229, + 116,130, 5,211, 73,200, 73,220,228,225,231,229,243,104,129,251, + 51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242, + 229,119,128, 5,211,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,170,237,237, 97, 3, 73,253, 74, 6, 74, 18,225,242,225, + 226,233, 99,128, 6, 79,236,239,247,225,242,225,226,233, 99,128, + 6, 79,244,225,238, 97, 2, 74, 27, 74, 41,236,244,239,238,229, + 225,242,225,226,233, 99,128, 6, 76,242,225,226,233, 99,128, 6, + 76,238,228, 97,128, 9,100,242,231, 97, 2, 74, 63, 74, 72,232, + 229,226,242,229,119,128, 5,167,236,229,230,244,232,229,226,242, + 229,119,128, 5,167,243,233,225,240,238,229,245,237,225,244,225, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,133, 98, 3, + 74,118, 75,115, 75,125,108, 9, 74,138, 74,146, 75, 3, 75, 11, + 75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128, + 246,211, 97, 2, 74,152, 74,209,238,231,236,229,226,242,225,227, + 235,229,116, 2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74, + 177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232, + 116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254, + 62,114, 2, 74,215, 74,236,227,232,233,238,246,229,242,244,229, + 228,226,229,236,239,247,227,237, 98,128, 3, 43,242,239,119, 2, + 74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116, + 128, 33,210,228,225,238,228, 97,128, 9,101,231,242,225,246,101, + 129,246,214, 75, 21,227,237, 98,128, 3, 15,233,238,244,229,231, + 242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23, + 75, 50,227,237, 98,128, 3, 51,239,246,229,242,236,233,238,229, + 227,237, 98,128, 3, 63,240,242,233,237,229,237,239,100,128, 2, + 186,246,229,242,244,233,227,225,108, 2, 75, 94, 75,100,226,225, + 114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98, + 128, 3, 14,239,240,239,237,239,230,111,128, 49, 9,243,241,245, + 225,242,101,128, 51,200, 99, 4, 75,144, 75,151, 75,160, 75,187, + 225,242,239,110,128, 1, 15,229,228,233,236,236, 97,128, 30, 17, + 233,242, 99, 2, 75,168, 75,173,236,101,128, 36,211,245,237,230, + 236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128, + 1, 17,100, 4, 75,204, 76, 29, 76, 39, 76, 90, 97, 4, 75,214, + 75,224, 75,231, 76, 0,226,229,238,231,225,236,105,128, 9,161, + 228,229,246, 97,128, 9, 33,231,117, 2, 75,238, 75,247,234,225, + 242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33, + 108, 2, 76, 6, 76, 15,225,242,225,226,233, 99,128, 6,136,230, + 233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225, + 228,229,246, 97,128, 9, 92,232, 97, 3, 76, 48, 76, 58, 76, 65, + 226,229,238,231,225,236,105,128, 9,162,228,229,246, 97,128, 9, + 34,231,117, 2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10, + 162,242,237,245,235,232,105,128, 10, 34,239,116, 2, 76, 97, 76, + 106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128, + 30, 13,101, 8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238, + 77, 27, 77, 63, 99, 2, 76,138, 76,175,233,237,225,236,243,229, + 240,225,242,225,244,239,114, 2, 76,156, 76,165,225,242,225,226, + 233, 99,128, 6,107,240,229,242,243,233,225,110,128, 6,107,249, + 242,233,236,236,233, 99,128, 4, 52,231,242,229,101,128, 0,176, + 232,105, 2, 76,199, 76,208,232,229,226,242,229,119,128, 5,173, + 242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99, + 128, 3,239,235,225,244,225,235,225,238, 97,128, 48,199,108, 2, + 76,244, 77, 11,229,244,101, 2, 76,252, 77, 3,236,229,230,116, + 128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129, 3,180, + 77, 18,244,245,242,238,229,100,128, 1,141,238,239,237,233,238, + 225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229, + 242,225,244,239,242,226,229,238,231,225,236,105,128, 9,248,250, + 104,128, 2,164,104, 2, 77, 74, 77,124, 97, 3, 77, 82, 77, 92, + 77, 99,226,229,238,231,225,236,105,128, 9,167,228,229,246, 97, + 128, 9, 39,231,117, 2, 77,106, 77,115,234,225,242,225,244,105, + 128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128, + 2, 87,105, 6, 77,144, 77,193, 77,253, 78, 8, 78, 19, 78, 29, + 97, 2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239, + 115,129, 3,133, 77,166,227,237, 98,128, 3, 68,237,239,238,100, + 129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38, + 98,229,242,229,243,233,115,133, 0,168, 77,212, 77,220, 77,231, + 77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239, + 247,227,237, 98,128, 3, 36,227,237, 98,128, 3, 8,231,242,225, + 246,101,128,246,216,244,239,238,239,115,128, 3,133,232,233,242, + 225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97, + 128, 48,194,244,244,239,237,225,242,107,128, 48, 3,246,105, 2, + 78, 36, 78, 47,228,101,129, 0,247, 78, 43,115,128, 34, 35,243, + 233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242, + 233,236,236,233, 99,128, 4, 82,235,243,232,225,228,101,128, 37, + 147,108, 2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128, + 30, 15,243,241,245,225,242,101,128, 51,151,109, 2, 78,113, 78, + 121,225,227,242,239,110,128, 1, 17,239,238,239,243,240,225,227, + 101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78, + 163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79, + 154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228, + 229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238, + 97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236, + 236,225,114,132, 0, 36, 78,222, 78,233, 78,245, 79, 0,233,238, + 230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225, + 227,101,128,255, 4,239,236,228,243,244,249,236,101,128,247, 36, + 115, 2, 79, 6, 79, 13,237,225,236,108,128,254,105,245,240,229, + 242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241, + 245,225,242,101,128, 51, 38,116, 6, 79, 53, 79, 70, 79, 92, 79, + 103, 79,135, 79,142,225,227,227,229,238,116,129, 2,217, 79, 64, + 227,237, 98,128, 3, 7,226,229,236,239,247, 99, 2, 79, 81, 79, + 86,237, 98,128, 3, 35,239,237, 98,128, 3, 35,235,225,244,225, + 235,225,238, 97,128, 48,251,236,229,243,115, 2, 79,112, 79,116, + 105,128, 1, 49,106,129,246,190, 79,122,243,244,242,239,235,229, + 232,239,239,107,128, 2,132,237,225,244,104,128, 34,197,244,229, + 228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239, + 228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229, + 119,128,251, 31,247,238,244,225,227,107, 2, 79,191, 79,202,226, + 229,236,239,247,227,237, 98,128, 3, 30,237,239,100,128, 2,213, + 240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114, + 128,246,235,116, 2, 79,233, 79,239,225,233,108,128, 2, 86,239, + 240,226,225,114,128, 1,140,117, 2, 79,253, 80, 8,232,233,242, + 225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97, + 128, 48,197,122,132, 1,243, 80, 31, 80, 40, 80, 59, 80, 96,225, + 236,244,239,238,101,128, 2,163, 99, 2, 80, 46, 80, 53,225,242, + 239,110,128, 1,198,245,242,108,128, 2,165,101, 2, 80, 65, 80, + 85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,225,227,249,242,233,236,236,233, 99,128, 4, 85, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 95,101,151, 0, + 101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82, + 60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85, + 230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97, + 2, 80,165, 80,172,227,245,244,101,128, 0,233,242,244,104,128, + 38, 65, 98, 3, 80,186, 80,195, 80,205,229,238,231,225,236,105, + 128, 9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246, + 101,128, 1, 21, 99, 5, 80,224, 81, 41, 81, 55, 81, 87, 81,176, + 97, 2, 80,230, 81, 35,238,228,242, 97, 3, 80,241, 80,248, 81, + 3,228,229,246, 97,128, 9, 13,231,245,234,225,242,225,244,105, + 128, 10,141,246,239,247,229,236,243,233,231,110, 2, 81, 17, 81, + 24,228,229,246, 97,128, 9, 69,231,245,234,225,242,225,244,105, + 128, 10,197,242,239,110,128, 1, 27,229,228,233,236,236,225,226, + 242,229,246,101,128, 30, 29,104, 2, 81, 61, 81, 72,225,242,237, + 229,238,233,225,110,128, 5,101,249,233,247,238,225,242,237,229, + 238,233,225,110,128, 5,135,233,242, 99, 2, 81, 95, 81,100,236, + 101,128, 36,212,245,237,230,236,229,120,134, 0,234, 81,121, 81, + 129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30, + 191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239, + 119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235, + 225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197, + 249,242,233,236,236,233, 99,128, 4, 84,100, 4, 81,196, 81,206, + 81,212, 81,222,226,236,231,242,225,246,101,128, 2, 5,229,246, + 97,128, 9, 15,233,229,242,229,243,233,115,128, 0,235,239,116, + 130, 1, 23, 81,231, 81,240,225,227,227,229,238,116,128, 1, 23, + 226,229,236,239,119,128, 30,185,101, 2, 81,254, 82, 9,231,245, + 242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236, + 233, 99,128, 4, 68,103, 2, 82, 43, 82, 50,242,225,246,101,128, + 0,232,245,234,225,242,225,244,105,128, 10,143,104, 4, 82, 70, + 82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128, 5, + 103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231, + 225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30, + 187,105, 4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237, + 239,230,111,128, 49, 31,231,232,116,142, 0, 56, 82,168, 82,177, + 82,187, 82,217, 82,224, 83, 6, 83, 31, 83, 76, 83,110, 83,122, + 83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128, 6, + 104,226,229,238,231,225,236,105,128, 9,238,227,233,242,227,236, + 101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238, + 243,243,229,242,233,102,128, 39,145,228,229,246, 97,128, 9,110, + 229,229,110, 2, 82,232, 82,241,227,233,242,227,236,101,128, 36, + 113,112, 2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242, + 233,239,100,128, 36,153,231,117, 2, 83, 13, 83, 22,234,225,242, + 225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104, + 2, 83, 37, 83, 63, 97, 2, 83, 43, 83, 54,227,235,225,242,225, + 226,233, 99,128, 6,104,238,231,250,232,239,117,128, 48, 40,238, + 239,244,229,226,229,225,237,229,100,128, 38,107,105, 2, 83, 82, + 83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239, + 238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249, + 236,101,128,247, 56,112, 2, 83,139, 83,146,225,242,229,110,128, + 36,123,229,114, 2, 83,153, 83,159,233,239,100,128, 36,143,243, + 233,225,110,128, 6,248,242,239,237,225,110,128, 33,119,243,245, + 240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88, + 238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 7,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 101,107, 2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48, + 168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111, + 2, 84, 5, 84, 20,238,235,225,242,231,245,242,237,245,235,232, + 105,128, 10,116,242,229,225,110,128, 49, 84,108, 3, 84, 35, 84, + 46, 84,107,227,249,242,233,236,236,233, 99,128, 4, 59,101, 2, + 84, 52, 84, 59,237,229,238,116,128, 34, 8,246,229,110, 3, 84, + 69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112, 2, + 84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100, + 128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233, + 115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34, + 238,109, 5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242, + 239,110,130, 1, 19, 84,153, 84,161,225,227,245,244,101,128, 30, + 23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233, + 99,128, 4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242, + 244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101, + 128,255, 69,112, 2, 84,217, 84,237,232,225,243,233,243,237,225, + 242,235,225,242,237,229,238,233,225,110,128, 5, 91,244,249,243, + 229,116,128, 34, 5,110, 6, 85, 3, 85, 14, 85, 25, 85, 69, 85, + 101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249, + 242,233,236,236,233, 99,128, 4, 61,100, 2, 85, 31, 85, 50,225, + 243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128, + 254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236, + 233, 99,128, 4,163,103,130, 1, 75, 85, 77, 85, 88,226,239,240, + 239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236, + 233, 99,128, 4,165,232,239,239,235,227,249,242,233,236,236,233, + 99,128, 4,200,243,240,225,227,101,128, 32, 2,111, 3, 85,132, + 85,140, 85,149,231,239,238,229,107,128, 1, 25,235,239,242,229, + 225,110,128, 49, 83,240,229,110,130, 2, 91, 85,159, 85,168,227, + 236,239,243,229,100,128, 2,154,242,229,246,229,242,243,229,100, + 130, 2, 92, 85,183, 85,192,227,236,239,243,229,100,128, 2, 94, + 232,239,239,107,128, 2, 93,112, 2, 85,205, 85,212,225,242,229, + 110,128, 36,160,243,233,236,239,110,129, 3,181, 85,222,244,239, + 238,239,115,128, 3,173,241,117, 2, 85,237, 86, 25,225,108,130, + 0, 61, 85,246, 86, 2,237,239,238,239,243,240,225,227,101,128, + 255, 29,115, 2, 86, 8, 86, 15,237,225,236,108,128,254,102,245, + 240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227, + 101,128, 34, 97,114, 3, 86, 44, 86, 55, 86, 66,226,239,240,239, + 237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128, + 4, 64,229,246,229,242,243,229,100,129, 2, 88, 86, 78,227,249, + 242,233,236,236,233, 99,128, 4, 77,115, 6, 86,103, 86,114, 86, + 134, 86,215, 87, 4, 87, 14,227,249,242,233,236,236,233, 99,128, + 4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236, + 236,233, 99,128, 4,171,104,132, 2,131, 86,146, 86,153, 86,184, + 86,199,227,245,242,108,128, 2,134,239,242,116, 2, 86,161, 86, + 168,228,229,246, 97,128, 9, 14,246,239,247,229,236,243,233,231, + 238,228,229,246, 97,128, 9, 70,242,229,246,229,242,243,229,228, + 236,239,239,112,128, 1,170,243,241,245,225,244,242,229,246,229, + 242,243,229,100,128, 2,133,237,225,236,108, 2, 86,224, 86,235, + 232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235, + 225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244, + 104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240, + 229,242,233,239,114,128,246,236,116, 5, 87, 36, 87, 62, 87, 66, + 87, 83, 87,149, 97,130, 3,183, 87, 44, 87, 54,242,237,229,238, + 233,225,110,128, 5,104,244,239,238,239,115,128, 3,174,104,128, + 0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119, + 128, 30, 27,238,225,232,244, 97, 3, 87, 95, 87,127, 87,136,230, + 239,245,235,104, 2, 87,105, 87,114,232,229,226,242,229,119,128, + 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,232, + 229,226,242,229,119,128, 5,145,236,229,230,244,232,229,226,242, + 229,119,128, 5,145,245,242,238,229,100,128, 1,221,117, 2, 87, + 163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32, + 172,246,239,247,229,236,243,233,231,110, 3, 87,193, 87,203, 87, + 210,226,229,238,231,225,236,105,128, 9,199,228,229,246, 97,128, + 9, 71,231,245,234,225,242,225,244,105,128, 10,199,120, 2, 87, + 227, 88, 44,227,236,225,109,132, 0, 33, 87,242, 87,253, 88, 24, + 88, 36,225,242,237,229,238,233,225,110,128, 5, 92,100, 2, 88, + 3, 88, 8,226,108,128, 32, 60,239,247,110,129, 0,161, 88, 16, + 243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227, + 101,128,255, 1,243,237,225,236,108,128,247, 33,233,243,244,229, + 238,244,233,225,108,128, 34, 3,250,104,131, 2,146, 88, 67, 88, + 86, 88, 97, 99, 2, 88, 73, 88, 80,225,242,239,110,128, 1,239, + 245,242,108,128, 2,147,242,229,246,229,242,243,229,100,128, 1, + 185,244,225,233,108,128, 1,186,102,140, 0,102, 88,132, 88,214, + 88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156, + 93, 33, 93, 41, 97, 4, 88,142, 88,149, 88,160, 88,171,228,229, + 246, 97,128, 9, 94,231,245,242,237,245,235,232,105,128, 10, 94, + 232,242,229,238,232,229,233,116,128, 33, 9,244,232, 97, 3, 88, + 181, 88,190, 88,202,225,242,225,226,233, 99,128, 6, 78,236,239, + 247,225,242,225,226,233, 99,128, 6, 78,244,225,238,225,242,225, + 226,233, 99,128, 6, 75,226,239,240,239,237,239,230,111,128, 49, + 8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227, + 229,238,116,128, 30, 31,101, 3, 88,254, 89, 76, 89, 86,104, 4, + 89, 8, 89, 31, 89, 45, 89, 61,225,114, 2, 89, 15, 89, 22,225, + 226,233, 99,128, 6, 65,237,229,238,233,225,110,128, 5,134,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240, + 244,233, 99,128, 3,229,237,225,236,101,128, 38, 64,102,130,251, + 0, 89,101, 89,105,105,128,251, 3,108,128,251, 4,105,136,251, + 1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90, + 106,230,244,229,229,110, 2, 89,139, 89,148,227,233,242,227,236, + 101,128, 36,110,112, 2, 89,154, 89,161,225,242,229,110,128, 36, + 130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243, + 104,128, 32, 18,236,236,229,100, 2, 89,189, 89,195,226,239,120, + 128, 37,160,242,229,227,116,128, 37,172,238,225,108, 5, 89,216, + 89,255, 90, 16, 90, 33, 90, 49,235,225,102,130, 5,218, 89,226, + 89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226, + 242,229,119,128,251, 58,232,229,226,242,229,119,128, 5,218,237, + 229,109,129, 5,221, 90, 7,232,229,226,242,229,119,128, 5,221, + 238,245,110,129, 5,223, 90, 24,232,229,226,242,229,119,128, 5, + 223,240,101,129, 5,227, 90, 40,232,229,226,242,229,119,128, 5, + 227,244,243,225,228,105,129, 5,229, 90, 59,232,229,226,242,229, + 119,128, 5,229,242,243,244,244,239,238,229,227,232,233,238,229, + 243,101,128, 2,201,243,232,229,249,101,128, 37,201,244,225,227, + 249,242,233,236,236,233, 99,128, 4,115,246,101,142, 0, 53, 90, + 139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91, 1, 91, + 35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233, + 99,128, 6,101,226,229,238,231,225,236,105,128, 9,235,227,233, + 242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229, + 243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97, + 128, 9,107,229,233,231,232,244,232,115,128, 33, 93,231,117, 2, + 90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245, + 235,232,105,128, 10,107,232, 97, 2, 90,237, 90,248,227,235,225, + 242,225,226,233, 99,128, 6,101,238,231,250,232,239,117,128, 48, + 37,105, 2, 91, 7, 91, 25,228,229,239,231,242,225,240,232,233, + 227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114, + 128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239, + 236,228,243,244,249,236,101,128,247, 53,112, 2, 91, 64, 91, 71, + 225,242,229,110,128, 36,120,229,114, 2, 91, 78, 91, 84,233,239, + 100,128, 36,140,243,233,225,110,128, 6,245,242,239,237,225,110, + 128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232, + 225,105,128, 14, 85,108,129,251, 2, 91,123,239,242,233,110,128, + 1,146,109, 2, 91,136, 91,147,239,238,239,243,240,225,227,101, + 128,255, 70,243,241,245,225,242,101,128, 51,153,111, 4, 91,166, + 91,188, 91,200, 91,207,230, 97, 2, 91,173, 91,181,238,244,232, + 225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225, + 238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34, 0,245, + 114,142, 0, 52, 91,240, 91,249, 92, 3, 92, 33, 92, 40, 92, 65, + 92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220, + 225,242,225,226,233, 99,128, 6,100,226,229,238,231,225,236,105, + 128, 9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238, + 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, + 141,228,229,246, 97,128, 9,106,231,117, 2, 92, 47, 92, 56,234, + 225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10, + 106,232, 97, 2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99, + 128, 6,100,238,231,250,232,239,117,128, 48, 36,105, 2, 92, 98, + 92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239, + 238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225, + 244,239,242,226,229,238,231,225,236,105,128, 9,247,239,236,228, + 243,244,249,236,101,128,247, 52,112, 2, 92,174, 92,181,225,242, + 229,110,128, 36,119,229,114, 2, 92,188, 92,194,233,239,100,128, + 36,139,243,233,225,110,128, 6,244,242,239,237,225,110,128, 33, + 115,243,245,240,229,242,233,239,114,128, 32,116,116, 2, 92,226, + 93, 8,229,229,110, 2, 92,234, 92,243,227,233,242,227,236,101, + 128, 36,109,112, 2, 92,249, 93, 0,225,242,229,110,128, 36,129, + 229,242,233,239,100,128, 36,149,104, 2, 93, 14, 93, 19,225,105, + 128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128, 2, + 203,240,225,242,229,110,128, 36,161,242, 97, 2, 93, 48, 93, 56, + 227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144, 0, + 103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96, + 143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98, + 158, 97, 9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93, + 241, 93,252, 94, 30,226,229,238,231,225,236,105,128, 9,151,227, + 245,244,101,128, 1,245,228,229,246, 97,128, 9, 23,102, 4, 93, + 151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128, 6,175, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117, 2, + 93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245, + 235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48, + 76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130, + 3,179, 94, 6, 94, 19,236,225,244,233,238,243,237,225,236,108, + 128, 2, 99,243,245,240,229,242,233,239,114,128, 2,224,238,231, + 233,225,227,239,240,244,233, 99,128, 3,235, 98, 2, 94, 49, 94, + 59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128, + 1, 31, 99, 4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110, + 128, 1,231,229,228,233,236,236, 97,128, 1, 35,233,242, 99, 2, + 94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128, + 1, 29,239,237,237,225,225,227,227,229,238,116,128, 1, 35,228, + 239,116,129, 1, 33, 94,135,225,227,227,229,238,116,128, 1, 33, + 101, 6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249, + 242,233,236,236,233, 99,128, 4, 51,232,233,242,225,231,225,238, + 97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239, + 237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128, + 34, 81,114, 3, 94,218, 95, 11, 95, 21,229,243,104, 3, 94,228, + 94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119, + 128, 5,156,232,229,226,242,229,119,128, 5,243,237,245,241,228, + 225,237,232,229,226,242,229,119,128, 5,157,237,225,238,228,226, + 236,115,128, 0,223,243,232,225,249,233,109, 2, 95, 32, 95, 47, + 225,227,227,229,238,244,232,229,226,242,229,119,128, 5,158,232, + 229,226,242,229,119,128, 5,244,244,225,237,225,242,107,128, 48, + 19,104, 5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97, 4, 95, + 87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128, 9, + 152,100, 2, 95,103, 95,114,225,242,237,229,238,233,225,110,128, + 5,114,229,246, 97,128, 9, 24,231,117, 2, 95,127, 95,136,234, + 225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10, + 24,233,110, 4, 95,156, 95,165, 95,179, 95,195,225,242,225,226, + 233, 99,128, 6, 58,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,208,101, 3, 95,218, 95,239, 96, 0,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,149,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,147, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 145,232, 97, 2, 96, 24, 96, 31,228,229,246, 97,128, 9, 90,231, + 245,242,237,245,235,232,105,128, 10, 90,239,239,107,128, 2, 96, + 250,243,241,245,225,242,101,128, 51,147,105, 3, 96, 66, 96, 77, + 96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244, + 225,235,225,238, 97,128, 48,174,109, 2, 96, 94, 96,105,225,242, + 237,229,238,233,225,110,128, 5, 99,229,108,130, 5,210, 96,114, + 96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226, + 242,229,119,128,251, 50,232,229,226,242,229,119,128, 5,210,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 83,236,239,244,244, + 225,108, 2, 96,167, 96,184,233,238,246,229,242,244,229,228,243, + 244,242,239,235,101,128, 1,190,243,244,239,112,132, 2,148, 96, + 199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128, + 2,150,237,239,100,128, 2,192,242,229,246,229,242,243,229,100, + 130, 2,149, 96,231, 96,237,237,239,100,128, 2,193,243,245,240, + 229,242,233,239,114,128, 2,228,243,244,242,239,235,101,129, 2, + 161, 97, 3,242,229,246,229,242,243,229,100,128, 2,162,109, 2, + 97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243, + 240,225,227,101,128,255, 71,111, 2, 97, 45, 97, 56,232,233,242, + 225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97, + 128, 48,180,240, 97, 2, 97, 74, 97, 80,242,229,110,128, 36,162, + 243,241,245,225,242,101,128, 51,172,114, 2, 97, 95, 97,192, 97, + 2, 97,101, 97,109,228,233,229,238,116,128, 34, 7,246,101,134, + 0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229, + 236,239,247,227,237, 98,128, 3, 22, 99, 2, 97,143, 97,148,237, + 98,128, 3, 0,239,237, 98,128, 3, 0,228,229,246, 97,128, 9, + 83,236,239,247,237,239,100,128, 2,206,237,239,238,239,243,240, + 225,227,101,128,255, 64,244,239,238,229,227,237, 98,128, 3, 64, + 229,225,244,229,114,132, 0, 62, 97,208, 97,227, 97,239, 98, 26, + 229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115, + 128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111, + 2, 97,245, 98, 15,114, 2, 97,251, 98, 8,229,241,245,233,246, + 225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246, + 229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128, + 254,101,115, 2, 98, 40, 98, 48,227,242,233,240,116,128, 2, 97, + 244,242,239,235,101,128, 1,229,117, 4, 98, 66, 98, 77, 98,134, + 98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108, 2, + 98, 84, 98,109,236,229,237,239,116, 2, 98, 94, 98,101,236,229, + 230,116,128, 0,171,242,233,231,232,116,128, 0,187,243,233,238, + 231,108, 2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233, + 231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48, + 176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243, + 241,245,225,242,101,128, 51,201,104,144, 0,104, 98,204,101, 90, + 101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99, + 105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232, + 99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210, + 99,239, 99,252,100, 54,100, 63, 97, 2, 98,238, 99, 1,226,235, + 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, + 169,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,226, + 229,238,231,225,236,105,128, 9,185,228,101, 2, 99, 32, 99, 50, + 243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, + 4,179,246, 97,128, 9, 57,231,117, 2, 99, 62, 99, 71,234,225, + 242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57, + 104, 4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99, + 128, 6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 162,105, 2, 99,119, 99,134,238,233,244,233,225,236,225,242,225, + 226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244, + 245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225, + 238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104, + 128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128, + 10, 77,237,250, 97, 2, 99,218, 99,227,225,242,225,226,233, 99, + 128, 6, 33,236,239,247,225,242,225,226,233, 99,128, 6, 33,238, + 231,245,236,230,233,236,236,229,114,128, 49,100,114, 2,100, 2, + 100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, + 4, 74,240,239,239,110, 2,100, 27,100, 40,236,229,230,244,226, + 225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242, + 226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244, + 225,102, 3,100, 73,100,165,101, 0,240,225,244,225,104,134, 5, + 178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128, + 5,178, 50, 2,100,104,100,108, 51,128, 5,178,102,128, 5,178, + 232,229,226,242,229,119,128, 5,178,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,178,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,178,247,233,228,229,232,229,226,242, + 229,119,128, 5,178,241,225,237,225,244,115,135, 5,179,100,188, + 100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128, 5, + 179,178, 56,128, 5,179,179, 52,128, 5,179,232,229,226,242,229, + 119,128, 5,179,238,225,242,242,239,247,232,229,226,242,229,119, + 128, 5,179,241,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,179,247,233,228,229,232,229,226,242,229,119,128, 5,179, + 243,229,231,239,108,135, 5,177,101, 22,101, 27,101, 32,101, 37, + 101, 46,101, 61,101, 77,177, 55,128, 5,177,178, 52,128, 5,177, + 179, 48,128, 5,177,232,229,226,242,229,119,128, 5,177,238,225, + 242,242,239,247,232,229,226,242,229,119,128, 5,177,241,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,177,247,233,228, + 229,232,229,226,242,229,119,128, 5,177, 98, 3,101, 98,101,103, + 101,113,225,114,128, 1, 39,239,240,239,237,239,230,111,128, 49, + 15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99, 2,101, + 131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99, 2, + 101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128, + 1, 37,100, 2,101,168,101,178,233,229,242,229,243,233,115,128, + 30, 39,239,116, 2,101,185,101,194,225,227,227,229,238,116,128, + 30, 35,226,229,236,239,119,128, 30, 37,101,136, 5,212,101,222, + 101,255,102, 19,102,248,103, 8,103, 53,103, 62,103, 75,225,242, + 116,129, 38,101,101,230,243,245,233,116, 2,101,239,101,247,226, + 236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228, + 225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119, + 128,251, 52,104, 6,102, 33,102, 61,102, 69,102,119,102,165,102, + 214, 97, 2,102, 39,102, 53,236,244,239,238,229,225,242,225,226, + 233, 99,128, 6,193,242,225,226,233, 99,128, 6, 71,229,226,242, + 229,119,128, 5,212,230,233,238,225,236, 97, 2,102, 80,102,111, + 236,116, 2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99, + 128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242, + 225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246, + 101, 2,102,134,102,148,230,233,238,225,236,225,242,225,226,233, + 99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226, + 233, 99,128,251,164,105, 2,102,171,102,205,238,233,244,233,225, + 236, 97, 2,102,183,102,197,236,244,239,238,229,225,242,225,226, + 233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231, + 225,238, 97,128, 48,120,237,229,228,233,225,236, 97, 2,102,226, + 102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169, + 242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243, + 241,245,225,242,101,128, 51,123,107, 2,103, 14,103, 38,225,244, + 225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233, + 228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225, + 242,101,128, 51, 54,238,231,232,239,239,107,128, 2,103,242,245, + 244,245,243,241,245,225,242,101,128, 51, 57,116,129, 5,215,103, + 81,232,229,226,242,229,119,128, 5,215,232,239,239,107,129, 2, + 102,103, 99,243,245,240,229,242,233,239,114,128, 2,177,105, 4, + 103,120,103,205,103,216,103,241,229,245,104, 4,103,132,103,167, + 103,182,103,191, 97, 2,103,138,103,153,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242, + 225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97, + 129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255, + 139,242,233,113,134, 5,180,104, 3,104, 8,104, 22,104, 31,104, + 46,104, 62,177, 52,128, 5,180, 50, 2,104, 14,104, 18, 49,128, + 5,180,100,128, 5,180,232,229,226,242,229,119,128, 5,180,238, + 225,242,242,239,247,232,229,226,242,229,119,128, 5,180,241,245, + 225,242,244,229,242,232,229,226,242,229,119,128, 5,180,247,233, + 228,229,232,229,226,242,229,119,128, 5,180,236,233,238,229,226, + 229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101, + 128,255, 72,111, 9,104,119,104,130,104,154,104,179,105, 11,105, + 24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128, + 5,112,232,105, 2,104,137,104,145,240,244,232,225,105,128, 14, + 43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225, + 238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104, + 128,255,142,236,225,109,135, 5,185,104,199,104,204,104,209,104, + 214,104,223,104,238,104,254,177, 57,128, 5,185,178, 54,128, 5, + 185,179, 50,128, 5,185,232,229,226,242,229,119,128, 5,185,238, + 225,242,242,239,247,232,229,226,242,229,119,128, 5,185,241,245, + 225,242,244,229,242,232,229,226,242,229,119,128, 5,185,247,233, + 228,229,232,229,226,242,229,119,128, 5,185,238,239,235,232,245, + 235,244,232,225,105,128, 14, 46,111, 2,105, 30,105,100,107, 4, + 105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237, + 98,128, 3, 9,227,237, 98,128, 3, 9,240,225,236,225,244,225, + 236,233,250,229,228,226,229,236,239,247,227,237, 98,128, 3, 33, + 242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237, + 98,128, 3, 34,238,243,241,245,225,242,101,128, 51, 66,114, 2, + 105,116,105,143,105, 2,105,122,105,131,227,239,240,244,233, 99, + 128, 3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238, + 227,237, 98,128, 3, 27,244,243,240,242,233,238,231,115,128, 38, + 104,245,243,101,128, 35, 2,240,225,242,229,110,128, 36,163,243, + 245,240,229,242,233,239,114,128, 2,176,244,245,242,238,229,100, + 128, 2,101,117, 4,105,205,105,216,105,229,105,254,232,233,242, + 225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225, + 242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213, + 105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231, + 225,242,245,237,236,225,245,116,129, 2,221,106, 13,227,237, 98, + 128, 3, 11,118,128, 1,149,249,240,232,229,110,132, 0, 45,106, + 39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128, + 246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115, 2, + 106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233, + 239,114,128,246,230,244,247,111,128, 32, 16,105,149, 0,105,106, + 137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111, + 213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113, + 110,113,197,113,254,114, 26,114, 70,225, 99, 2,106,144,106,150, + 245,244,101,128, 0,237,249,242,233,236,236,233, 99,128, 4, 79, + 98, 3,106,168,106,177,106,187,229,238,231,225,236,105,128, 9, + 135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128, + 1, 45, 99, 3,106,202,106,209,106,231,225,242,239,110,128, 1, + 208,233,242, 99, 2,106,217,106,222,236,101,128, 36,216,245,237, + 230,236,229,120,128, 0,238,249,242,233,236,236,233, 99,128, 4, + 86,100, 4,106,251,107, 5,110, 80,110,113,226,236,231,242,225, + 246,101,128, 2, 9,101, 2,107, 11,110, 75,239,231,242,225,240, + 104, 7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44, + 229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233, + 242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90, + 107,106,107,205,108, 3,108, 69,108, 98,108,114,108,171,108,220, + 108,232,109, 3,109, 70,109,208,109,237,225,236,236,233,225,238, + 227,229,240,225,242,229,110,128, 50, 63, 99, 4,107,116,107,127, + 107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229, + 238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243, + 101,128, 48, 6,111, 3,107,156,107,171,107,191,237,237, 97,129, + 48, 1,107,164,236,229,230,116,128,255,100,238,231,242,225,244, + 245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242, + 242,229,227,244,227,233,242,227,236,101,128, 50,163,101, 3,107, + 213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50, + 47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128, + 50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101, + 128, 50,157,102, 2,108, 9,108, 24,229,243,244,233,246,225,236, + 240,225,242,229,110,128, 50, 64,105, 2,108, 30,108, 59,238,225, + 238,227,233,225,108, 2,108, 42,108, 51,227,233,242,227,236,101, + 128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242, + 229,110,128, 50, 43,104, 2,108, 75,108, 86,225,246,229,240,225, + 242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128, + 50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128, + 48, 5,108, 3,108,122,108,148,108,160,225,226,239,114, 2,108, + 131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229, + 110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167, + 239,247,227,233,242,227,236,101,128, 50,166,109, 2,108,177,108, + 209,101, 2,108,183,108,198,228,233,227,233,238,229,227,233,242, + 227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50, + 46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229, + 240,225,242,229,110,128, 50, 52,112, 2,108,238,108,246,229,242, + 233,239,100,128, 48, 2,242,233,238,244,227,233,242,227,236,101, + 128, 50,158,114, 2,109, 9,109, 57,101, 3,109, 17,109, 28,109, + 43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243, + 229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227, + 229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242, + 227,236,101,128, 50,168,115, 5,109, 82,109,111,109,125,109,150, + 109,178,101, 2,109, 88,109,101,227,242,229,244,227,233,242,227, + 236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239, + 227,233,229,244,249,240,225,242,229,110,128, 50, 51,112, 2,109, + 131,109,137,225,227,101,128, 48, 0,229,227,233,225,236,240,225, + 242,229,110,128, 50, 53,116, 2,109,156,109,167,239,227,235,240, + 225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128, + 50, 59,117, 2,109,184,109,193,238,240,225,242,229,110,128, 50, + 48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60, + 119, 2,109,214,109,226,225,244,229,242,240,225,242,229,110,128, + 50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242, + 111,128, 48, 7,109, 2,109,250,110, 7,229,244,225,236,227,233, + 242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101, + 128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148, + 243,245,238,227,233,242,227,236,101,128, 50,144,119, 2,110, 50, + 110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239, + 239,228,227,233,242,227,236,101,128, 50,141,246, 97,128, 9, 7, + 233,229,242,229,243,233,115,130, 0,239,110, 94,110,102,225,227, + 245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128, 4, + 229,239,244,226,229,236,239,119,128, 30,203,101, 3,110,131,110, + 147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99, + 128, 4,215,227,249,242,233,236,236,233, 99,128, 4, 53,245,238, + 103, 4,110,170,110,205,110,220,110,229, 97, 2,110,176,110,191, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242, + 227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229, + 225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 7,103, 2,110,249,111, 0,242,225,246,101,128, 0,236, + 117, 2,111, 6,111, 15,234,225,242,225,244,105,128, 10,135,242, + 237,245,235,232,105,128, 10, 7,104, 2,111, 30,111, 40,233,242, + 225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101, + 128, 30,201,105, 8,111, 69,111, 79,111, 90,111, 97,111,122,111, + 138,111,153,111,169,226,229,238,231,225,236,105,128, 9,136,227, + 249,242,233,236,236,233, 99,128, 4, 56,228,229,246, 97,128, 9, + 8,231,117, 2,111,104,111,113,234,225,242,225,244,105,128, 10, + 136,242,237,245,235,232,105,128, 10, 8,237,225,244,242,225,231, + 245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229, + 228,226,242,229,246,101,128, 2, 11,243,232,239,242,244,227,249, + 242,233,236,236,233, 99,128, 4, 57,246,239,247,229,236,243,233, + 231,110, 3,111,185,111,195,111,202,226,229,238,231,225,236,105, + 128, 9,192,228,229,246, 97,128, 9, 64,231,245,234,225,242,225, + 244,105,128, 10,192,106,128, 1, 51,107, 2,111,223,111,247,225, + 244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247, + 233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108, + 2,112, 5,112, 10,228,101,128, 2,220,245,249,232,229,226,242, + 229,119,128, 5,172,109, 2,112, 27,112, 94, 97, 3,112, 35,112, + 55,112, 80,227,242,239,110,129, 1, 43,112, 44,227,249,242,233, + 236,236,233, 99,128, 4,227,231,229,239,242,225,240,240,242,239, + 248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83, + 244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238, + 239,243,240,225,227,101,128,255, 73,110, 5,112,117,112,127,112, + 136,112,148,112,232,227,242,229,237,229,238,116,128, 34, 6,230, + 233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225, + 110,128, 5,107,116, 2,112,154,112,222,101, 2,112,160,112,211, + 231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98, 2,112, + 179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229, + 120,128,248,245,116, 2,112,202,112,207,239,112,128, 35, 32,112, + 128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243, + 241,245,225,242,101,128, 51, 5,118, 3,112,240,112,249,113, 2, + 226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128, + 37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111, 3, + 113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128, 4, + 81,231,239,238,229,107,128, 1, 47,244, 97,131, 3,185,113, 52, + 113, 73,113, 81,228,233,229,242,229,243,233,115,129, 3,202,113, + 65,244,239,238,239,115,128, 3,144,236,225,244,233,110,128, 2, + 105,244,239,238,239,115,128, 3,175,240,225,242,229,110,128, 36, + 164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115, 4, + 113,120,113,165,113,179,113,187,237,225,236,108, 2,113,129,113, + 140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225, + 235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228, + 244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105, + 128, 9,250,244,242,239,235,101,128, 2,104,245,240,229,242,233, + 239,114,128,246,237,116, 2,113,203,113,237,229,242,225,244,233, + 239,110, 2,113,215,113,226,232,233,242,225,231,225,238, 97,128, + 48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228, + 101,129, 1, 41,113,246,226,229,236,239,119,128, 30, 45,117, 2, + 114, 4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227, + 249,242,233,236,236,233, 99,128, 4, 78,246,239,247,229,236,243, + 233,231,110, 3,114, 42,114, 52,114, 59,226,229,238,231,225,236, + 105,128, 9,191,228,229,246, 97,128, 9, 63,231,245,234,225,242, + 225,244,105,128, 10,191,250,232,233,244,243, 97, 2,114, 81,114, + 92,227,249,242,233,236,236,233, 99,128, 4,117,228,226,236,231, + 242,225,246,229,227,249,242,233,236,236,233, 99,128, 4,119,106, + 138, 0,106,114,135,114,198,114,209,115, 3,115, 19,115,132,115, + 201,115,206,115,218,115,226, 97, 4,114,145,114,156,114,166,114, + 173,225,242,237,229,238,233,225,110,128, 5,113,226,229,238,231, + 225,236,105,128, 9,156,228,229,246, 97,128, 9, 28,231,117, 2, + 114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245, + 235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49, + 16, 99, 3,114,217,114,224,114,246,225,242,239,110,128, 1,240, + 233,242, 99, 2,114,232,114,237,236,101,128, 36,217,245,237,230, + 236,229,120,128, 1, 53,242,239,243,243,229,228,244,225,233,108, + 128, 2,157,228,239,244,236,229,243,243,243,244,242,239,235,101, + 128, 2, 95,101, 3,115, 27,115, 38,115,103,227,249,242,233,236, + 236,233, 99,128, 4, 88,229,109, 4,115, 49,115, 58,115, 72,115, + 88,225,242,225,226,233, 99,128, 6, 44,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,160,104, 2,115,109,115,118,225,242,225, + 226,233, 99,128, 6,152,230,233,238,225,236,225,242,225,226,233, + 99,128,251,139,104, 2,115,138,115,188, 97, 3,115,146,115,156, + 115,163,226,229,238,231,225,236,105,128, 9,157,228,229,246, 97, + 128, 9, 29,231,117, 2,115,170,115,179,234,225,242,225,244,105, + 128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242, + 237,229,238,233,225,110,128, 5,123,233,115,128, 48, 4,237,239, + 238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128, + 36,165,243,245,240,229,242,233,239,114,128, 2,178,107,146, 0, + 107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120, + 150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122, + 118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116, + 245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98, + 2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236, + 236,233, 99,128, 4,161,229,238,231,225,236,105,128, 9,149, 99, + 2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236, + 233, 99,128, 4, 58,228,101, 2,116,108,116,126,243,227,229,238, + 228,229,242,227,249,242,233,236,236,233, 99,128, 4,155,246, 97, + 128, 9, 21,102,135, 5,219,116,149,116,158,116,178,116,192,116, + 201,116,217,116,232,225,242,225,226,233, 99,128, 6, 67,228,225, + 231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128, + 251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218, + 232,229,226,242,229,119,128, 5,219,233,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225, + 242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242, + 229,119,128,251, 77,231,117, 2,116,252,117, 5,234,225,242,225, + 244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104, 2, + 117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239, + 235,227,249,242,233,236,236,233, 99,128, 4,196,235,225,244,225, + 235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228, + 244,104,128,255,118,112, 2,117, 75,117, 96,240, 97,129, 3,186, + 117, 82,243,249,237,226,239,236,231,242,229,229,107,128, 3,240, + 249,229,239,245,110, 3,117,108,117,122,117,156,237,233,229,245, + 237,235,239,242,229,225,110,128, 49,113,112, 2,117,128,117,143, + 232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233, + 229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238, + 231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242, + 239,242,233,233,243,241,245,225,242,101,128, 51, 13,115, 5,117, + 201,117,245,118, 4,118, 12,118, 40,232,233,228,225,225,245,244, + 111, 2,117,214,117,223,225,242,225,226,233, 99,128, 6, 64,238, + 239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226, + 233, 99,128, 6, 64,237,225,236,236,235,225,244,225,235,225,238, + 97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97, 2,118, + 19,118, 28,225,242,225,226,233, 99,128, 6, 80,244,225,238,225, + 242,225,226,233, 99,128, 6, 77,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,159,244,225,232,233,242,225,240,242, + 239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228, + 244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242, + 239,235,229,227,249,242,233,236,236,233, 99,128, 4,157,226,239, + 240,239,237,239,230,111,128, 49, 14, 99, 4,118,131,118,153,118, + 162,118,170, 97, 2,118,137,118,147,236,243,241,245,225,242,101, + 128, 51,137,242,239,110,128, 1,233,229,228,233,236,236, 97,128, + 1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227, + 227,229,238,116,128, 1, 55,228,239,244,226,229,236,239,119,128, + 30, 51,101, 4,118,204,118,231,119, 0,119, 12,104, 2,118,210, + 118,221,225,242,237,229,238,233,225,110,128, 5,132,233,242,225, + 231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129, + 48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121, + 238,225,242,237,229,238,233,225,110,128, 5,111,243,237,225,236, + 236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229, + 238,236,225,238,228,233, 99,128, 1, 56,104, 6,119, 56,119,185, + 119,196,119,221,120, 52,120,140, 97, 5,119, 68,119, 78,119, 89, + 119, 96,119,121,226,229,238,231,225,236,105,128, 9,150,227,249, + 242,233,236,236,233, 99,128, 4, 69,228,229,246, 97,128, 9, 22, + 231,117, 2,119,103,119,112,234,225,242,225,244,105,128, 10,150, + 242,237,245,235,232,105,128, 10, 22,104, 4,119,131,119,140,119, + 154,119,170,225,242,225,226,233, 99,128, 6, 46,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225, + 236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236, + 225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233, + 99,128, 3,231,232, 97, 2,119,203,119,210,228,229,246, 97,128, + 9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245, + 235,104, 4,119,235,120, 14,120, 29,120, 38, 97, 2,119,241,120, + 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242, + 229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 10,111, 4,120, 62,120,111,120,121,120,126,235,104, + 4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128, + 14, 2,239,238,244,232,225,105,128, 14, 5,245,225,244,244,232, + 225,105,128, 14, 3,247,225,233,244,232,225,105,128, 14, 4,237, + 245,244,244,232,225,105,128, 14, 91,239,107,128, 1,153,242,225, + 235,232,225,238,231,244,232,225,105,128, 14, 6,250,243,241,245, + 225,242,101,128, 51,145,105, 4,120,160,120,171,120,196,120,245, + 232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235, + 225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244, + 104,128,255,119,242,111, 3,120,205,120,220,120,236,231,245,242, + 225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244, + 239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225, + 242,101,128, 51, 20,249,229,239,107, 5,121, 4,121, 39,121, 54, + 121, 63,121, 77, 97, 2,121, 10,121, 25,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 0,243,233,239, + 243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233, + 236,236,233, 99,128, 4, 92,108, 2,121,109,121,120,233,238,229, + 226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51, + 152,109, 3,121,137,121,151,121,162,227,245,226,229,228,243,241, + 245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128, + 255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128, + 51,162,111, 5,121,190,121,216,121,254,122, 10,122, 24,104, 2, + 121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243, + 241,245,225,242,101,128, 51,192,235, 97, 2,121,223,121,231,233, + 244,232,225,105,128, 14, 1,244,225,235,225,238, 97,129, 48,179, + 121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240, + 239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242, + 233,236,236,233, 99,128, 4,129,114, 2,122, 30,122, 50,229,225, + 238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128, + 50,127,239,238,233,243,227,237, 98,128, 3, 67,240, 97, 2,122, + 67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128, + 51,170,243,233,227,249,242,233,236,236,233, 99,128, 4,111,116, + 2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242, + 238,229,100,128, 2,158,117, 2,122,124,122,135,232,233,242,225, + 231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129, + 48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120, + 246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242, + 101,128, 51,190,108,146, 0,108,122,220,124,247,125, 20,125, 86, + 125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246, + 127,125,127,133,127,166,127,175,127,183,127,245, 97, 7,122,236, + 122,246,122,253,123, 4,123, 29,123, 45,124,235,226,229,238,231, + 225,236,105,128, 9,178,227,245,244,101,128, 1, 58,228,229,246, + 97,128, 9, 50,231,117, 2,123, 11,123, 20,234,225,242,225,244, + 105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232, + 225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123, + 67,124, 6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124, + 150,124,173, 97, 2,123, 73,123,254,236,229,102, 4,123, 85,123, + 99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,252,232,225,237,250, 97, 2,123,109,123,150,225,226,239, + 246,101, 2,123,119,123,133,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225, + 226,233, 99,128,254,247,226,229,236,239,119, 2,123,160,123,174, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233, + 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251, + 237,225,228,228,225,225,226,239,246,101, 2,123,223,123,237,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225, + 226,233, 99,128, 6, 68,226,228, 97,129, 3,187,124, 14,243,244, + 242,239,235,101,128, 1,155,229,100,130, 5,220,124, 32,124, 52, + 228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229, + 119,128,251, 60,232,229,226,242,229,119,128, 5,220,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229, + 229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225, + 226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236, + 225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101, 2, + 124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254, + 224,229,109, 2,124,200,124,219,232,225,232,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233, + 242,227,236,101,128, 37,239, 98, 3,124,255,125, 4,125, 10,225, + 114,128, 1,154,229,236,116,128, 2,108,239,240,239,237,239,230, + 111,128, 49, 12, 99, 4,125, 30,125, 37,125, 46,125, 73,225,242, + 239,110,128, 1, 62,229,228,233,236,236, 97,128, 1, 60,233,242, + 99, 2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227, + 229,238,116,128, 1, 60,228,239,116,130, 1, 64,125, 96,125,105, + 225,227,227,229,238,116,128, 1, 64,226,229,236,239,119,129, 30, + 55,125,115,237,225,227,242,239,110,128, 30, 57,101, 3,125,132, + 125,170,126, 15,230,116, 2,125,139,125,155,225,238,231,236,229, + 225,226,239,246,229,227,237, 98,128, 3, 26,244,225,227,235,226, + 229,236,239,247,227,237, 98,128, 3, 24,243,115,132, 0, 60,125, + 183,125,205,125,217,126, 7,229,241,245,225,108,129, 34,100,125, + 193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238, + 239,243,240,225,227,101,128,255, 28,111, 2,125,223,125,252,114, + 2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128, + 34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229, + 241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250, + 104,128, 2,110,230,226,236,239,227,107,128, 37,140,232,239,239, + 235,242,229,244,242,239,230,236,229,120,128, 2,109,105, 2,126, + 51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233, + 225,110,128, 5,108,106,129, 1,201,126, 75,229,227,249,242,233, + 236,236,233, 99,128, 4, 89,108,132,246,192,126, 99,126,123,126, + 134,126,143, 97, 2,126,105,126,112,228,229,246, 97,128, 9, 51, + 231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229, + 236,239,119,128, 30, 59,236,225,228,229,246, 97,128, 9, 52,246, + 239,227,225,236,233, 99, 3,126,157,126,167,126,174,226,229,238, + 231,225,236,105,128, 9,225,228,229,246, 97,128, 9, 97,246,239, + 247,229,236,243,233,231,110, 2,126,188,126,198,226,229,238,231, + 225,236,105,128, 9,227,228,229,246, 97,128, 9, 99,109, 3,126, + 213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128, + 2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245, + 225,242,101,128, 51,208,111, 6,127, 4,127, 16,127, 58,127, 69, + 127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44, + 231,233,227,225,108, 3,127, 28,127, 34,127, 53,225,238,100,128, + 34, 39,238,239,116,129, 0,172,127, 42,242,229,246,229,242,243, + 229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232, + 225,105,128, 14, 37,238,231,115,128, 1,127,247,236,233,238,101, + 2,127, 85,127,108, 99, 2,127, 91,127,103,229,238,244,229,242, + 236,233,238,101,128,254, 78,237, 98,128, 3, 50,228,225,243,232, + 229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242, + 229,110,128, 36,167,115, 3,127,141,127,148,127,156,236,225,243, + 104,128, 1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242, + 233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245, + 244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99, 3,127, + 197,127,207,127,214,226,229,238,231,225,236,105,128, 9,140,228, + 229,246, 97,128, 9, 12,246,239,247,229,236,243,233,231,110, 2, + 127,228,127,238,226,229,238,231,225,236,105,128, 9,226,228,229, + 246, 97,128, 9, 98,248,243,241,245,225,242,101,128, 51,211,109, + 144, 0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132, + 40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135, + 108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128, + 215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238, + 231,225,236,105,128, 9,174, 99, 2,128, 77,128,129,242,239,110, + 132, 0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247, + 227,237, 98,128, 3, 49,227,237, 98,128, 3, 4,236,239,247,237, + 239,100,128, 2,205,237,239,238,239,243,240,225,227,101,128,255, + 227,245,244,101,128, 30, 63,228,229,246, 97,128, 9, 46,231,117, + 2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237, + 245,235,232,105,128, 10, 46,104, 2,128,173,128,205,225,240,225, + 235,104, 2,128,183,128,192,232,229,226,242,229,119,128, 5,164, + 236,229,230,244,232,229,226,242,229,119,128, 5,164,233,242,225, + 231,225,238, 97,128, 48,126,105, 5,128,227,129, 40,129,103,129, + 133,130, 39,227,232,225,244,244,225,247, 97, 3,128,242,129, 17, + 129, 24,236,239,119, 2,128,250,129, 5,236,229,230,244,244,232, + 225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248, + 148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230, + 244,244,232,225,105,128,248,147,229,107, 3,129, 49,129, 80,129, + 87,236,239,119, 2,129, 57,129, 68,236,229,230,244,244,232,225, + 105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139, + 244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244, + 244,232,225,105,128,248,138,232,225,238,225,235,225,116, 2,129, + 115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232, + 225,105,128, 14, 49,116, 3,129,141,129,169,129,232,225,233,235, + 232,117, 2,129,151,129,162,236,229,230,244,244,232,225,105,128, + 248,137,244,232,225,105,128, 14, 71,232,111, 3,129,178,129,209, + 129,216,236,239,119, 2,129,186,129,197,236,229,230,244,244,232, + 225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248, + 142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230, + 244,244,232,225,105,128,248,141,242,105, 3,129,241,130, 16,130, + 23,236,239,119, 2,129,249,130, 4,236,229,230,244,244,232,225, + 105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145, + 244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244, + 244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105, + 128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64, + 232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38, + 66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241, + 225,230,232,229,226,242,229,119,128, 5,190,242,115,128, 38, 66, + 115, 2,130,118,130,136,239,242,225,227,233,242,227,236,229,232, + 229,226,242,229,119,128, 5,175,241,245,225,242,101,128, 51,131, + 98, 2,130,150,130,160,239,240,239,237,239,230,111,128, 49, 7, + 243,241,245,225,242,101,128, 51,212, 99, 2,130,175,130,183,233, + 242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242, + 101,128, 51,165,228,239,116, 2,130,204,130,213,225,227,227,229, + 238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101, 7,130, + 237,131,108,131,119,131,134,131,159,131,196,131,208,101, 2,130, + 243,131, 95,109, 4,130,253,131, 6,131, 20,131, 36,225,242,225, + 226,233, 99,128, 6, 69,230,233,238,225,236,225,242,225,226,233, + 99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,227,237,101, 2,131, 43,131, 56,228,233,225,236,225, + 242,225,226,233, 99,128,254,228,229,237,105, 2,131, 64,131, 79, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244, + 239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225, + 231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245, + 225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48, + 225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109, + 130, 5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62, + 131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229, + 119,128, 5,222,238,225,242,237,229,238,233,225,110,128, 5,116, + 242,235,232, 97, 3,131,219,131,228,132, 5,232,229,226,242,229, + 119,128, 5,165,235,229,230,245,236, 97, 2,131,239,131,248,232, + 229,226,242,229,119,128, 5,166,236,229,230,244,232,229,226,242, + 229,119,128, 5,166,236,229,230,244,232,229,226,242,229,119,128, + 5,165,104, 2,132, 24,132, 30,239,239,107,128, 2,113,250,243, + 241,245,225,242,101,128, 51,146,105, 6,132, 54,132, 91,132,228, + 132,239,133, 8,133, 65,228,100, 2,132, 61,132, 86,236,229,228, + 239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233, + 228,244,104,128,255,101,239,116,128, 0,183,229,245,109, 5,132, + 105,132,140,132,155,132,164,132,215, 97, 2,132,111,132,126,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225, + 110,128, 49, 65,112, 2,132,170,132,202, 97, 2,132,176,132,190, + 238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229, + 238,235,239,242,229,225,110,128, 50, 4,233,229,245,240,235,239, + 242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225, + 110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235, + 225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230, + 247,233,228,244,104,128,255,144,238,117, 2,133, 15,133, 60,115, + 132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247, + 227,237, 98,128, 3, 32,227,233,242,227,236,101,128, 34,150,237, + 239,100,128, 2,215,240,236,245,115,128, 34, 19,244,101,128, 32, + 50,242,105, 2,133, 72,133, 86,226,225,225,242,245,243,241,245, + 225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108, + 2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229, + 100,128, 2,112,243,241,245,225,242,101,128, 51,150,109, 3,133, + 133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101, + 128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241, + 245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111, 5, + 133,186,133,212,133,237,133,247,134, 0,104, 2,133,192,133,202, + 233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242, + 101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133, + 225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241, + 245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33, + 246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228, + 243,241,245,225,242,101,128, 51,168,240, 97, 2,134, 32,134, 38, + 242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115, + 2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240, + 229,242,233,239,114,128,246,239,244,245,242,238,229,100,128, 2, + 111,117,141, 0,181,134,111,134,115,134,125,134,149,134,159,134, + 181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49, + 128, 0,181,225,243,241,245,225,242,101,128, 51,130,227,104, 2, + 134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229, + 243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103, + 2,134,165,134,172,242,229,229,107,128, 3,188,243,241,245,225, + 242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128, + 235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236, + 230,247,233,228,244,104,128,255,145,108, 2,134,223,134,232,243, + 241,245,225,242,101,128, 51,149,244,233,240,236,121,128, 0,215, + 237,243,241,245,225,242,101,128, 51,155,238,225,104, 2,135, 2, + 135, 11,232,229,226,242,229,119,128, 5,163,236,229,230,244,232, + 229,226,242,229,119,128, 5,163,115, 2,135, 30,135, 79,233, 99, + 3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106, + 135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110, + 128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243, + 241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128, + 51,182,247,243,241,245,225,242,101,128, 51,188,118, 2,135,114, + 135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243, + 241,245,225,242,101,128, 51,183,119, 2,135,142,135,155,237,229, + 231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242, + 101,128, 51,189,110,150, 0,110,135,212,136, 90,136,114,136,180, + 136,205,137, 7,137, 17,137, 84,137,127,139,161,139,179,139,204, + 139,235,140, 5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61, + 143, 71,143, 81, 97, 8,135,230,135,250,136, 1,136, 8,136, 33, + 136, 44,136, 69,136, 81, 98, 2,135,236,135,245,229,238,231,225, + 236,105,128, 9,168,236, 97,128, 34, 7,227,245,244,101,128, 1, + 68,228,229,246, 97,128, 9, 40,231,117, 2,136, 15,136, 24,234, + 225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10, + 40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225, + 235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228, + 244,104,128,255,133,240,239,243,244,242,239,240,232,101,128, 1, + 73,243,241,245,225,242,101,128, 51,129, 98, 2,136, 96,136,106, + 239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128, + 0,160, 99, 4,136,124,136,131,136,140,136,167,225,242,239,110, + 128, 1, 72,229,228,233,236,236, 97,128, 1, 70,233,242, 99, 2, + 136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238, + 116,128, 1, 70,228,239,116, 2,136,188,136,197,225,227,227,229, + 238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101, 3,136, + 213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109, + 235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236, + 230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236, + 243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51, + 139,103, 2,137, 23,137, 73, 97, 3,137, 31,137, 41,137, 48,226, + 229,238,231,225,236,105,128, 9,153,228,229,246, 97,128, 9, 25, + 231,117, 2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153, + 242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225, + 105,128, 14, 7,104, 2,137, 90,137,100,233,242,225,231,225,238, + 97,128, 48,147,239,239,107, 2,137,108,137,115,236,229,230,116, + 128, 2,114,242,229,244,242,239,230,236,229,120,128, 2,115,105, + 4,137,137,138, 50,138, 61,138,119,229,245,110, 7,137,155,137, + 190,137,222,137,236,137,245,138, 22,138, 35, 97, 2,137,161,137, + 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105, + 2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49, + 53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233, + 229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229, + 225,110,128, 49, 52,240, 97, 2,137,252,138, 10,238,243,233,239, + 243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242, + 229,225,110,128, 50, 1,243,233,239,243,235,239,242,229,225,110, + 128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128, + 49,102,232,233,242,225,231,225,238, 97,128, 48,107,107, 2,138, + 67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232, + 225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116, + 2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153, + 244,232,225,105,128, 14, 77,238,101,141, 0, 57,138,150,138,159, + 138,169,138,199,138,206,138,231,139, 2,139, 36,139, 48,139, 59, + 139, 92,139,100,139,111,225,242,225,226,233, 99,128, 6,105,226, + 229,238,231,225,236,105,128, 9,239,227,233,242,227,236,101,129, + 36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243, + 229,242,233,102,128, 39,146,228,229,246, 97,128, 9,111,231,117, + 2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237, + 245,235,232,105,128, 10,111,232, 97, 2,138,238,138,249,227,235, + 225,242,225,226,233, 99,128, 6,105,238,231,250,232,239,117,128, + 48, 41,105, 2,139, 8,139, 26,228,229,239,231,242,225,240,232, + 233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239, + 114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25, + 239,236,228,243,244,249,236,101,128,247, 57,112, 2,139, 65,139, + 72,225,242,229,110,128, 36,124,229,114, 2,139, 79,139, 85,233, + 239,100,128, 36,144,243,233,225,110,128, 6,249,242,239,237,225, + 110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116, + 2,139,117,139,155,229,229,110, 2,139,125,139,134,227,233,242, + 227,236,101,128, 36,114,112, 2,139,140,139,147,225,242,229,110, + 128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14, + 89,106,129, 1,204,139,167,229,227,249,242,233,236,236,233, 99, + 128, 4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192, + 232,225,236,230,247,233,228,244,104,128,255,157,108, 2,139,210, + 139,224,229,231,242,233,231,232,244,236,239,238,103,128, 1,158, + 233,238,229,226,229,236,239,119,128, 30, 73,109, 2,139,241,139, + 252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225, + 242,101,128, 51,154,110, 2,140, 11,140, 61, 97, 3,140, 19,140, + 29,140, 36,226,229,238,231,225,236,105,128, 9,163,228,229,246, + 97,128, 9, 35,231,117, 2,140, 43,140, 52,234,225,242,225,244, + 105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228, + 229,246, 97,128, 9, 41,111, 6,140, 84,140, 95,140,120,140,161, + 141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235, + 225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230, + 247,233,228,244,104,128,255,137,110, 3,140,128,140,144,140,153, + 226,242,229,225,235,233,238,231,243,240,225,227,101,128, 0,160, + 229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14, + 25,239,110, 7,140,178,140,187,140,201,140,235,140,251,141, 36, + 141, 95,225,242,225,226,233, 99,128, 6, 70,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97, 2, + 140,212,140,221,225,242,225,226,233, 99,128, 6,186,230,233,238, + 225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105, + 2,141, 5,141, 20,238,233,244,233,225,236,225,242,225,226,233, + 99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233, + 99,128,252, 75,237,101, 2,141, 43,141, 56,228,233,225,236,225, + 242,225,226,233, 99,128,254,232,229,237,105, 2,141, 64,141, 79, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238, + 239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252, + 141,116, 7,141,129,141,140,141,169,141,204,141,216,141,236,142, + 6,227,239,238,244,225,233,238,115,128, 34, 12,101, 2,141,146, + 141,162,236,229,237,229,238,116,129, 34, 9,141,157,239,102,128, + 34, 9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114, + 129, 34,111,141,181,238,239,114, 2,141,189,141,197,229,241,245, + 225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238, + 244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141, + 225,238,239,242,229,241,245,225,108,128, 34,112,112, 2,141,242, + 141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229, + 228,229,115,128, 34,128,243,117, 3,142, 15,142, 22,142, 31,226, + 243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240, + 229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225, + 110,128, 5,118,240,225,242,229,110,128, 36,169,115, 2,142, 66, + 142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233, + 239,114,128, 32,127,244,233,236,228,101,128, 0,241,117,132, 3, + 189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238, + 97,128, 48,108,107, 2,142,122,142,146,225,244,225,235,225,238, + 97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128, + 255,135,244, 97, 3,142,155,142,165,142,172,226,229,238,231,225, + 236,105,128, 9,188,228,229,246, 97,128, 9, 60,231,117, 2,142, + 179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235, + 232,105,128, 10, 60,109, 2,142,203,142,237,226,229,242,243,233, + 231,110,130, 0, 35,142,217,142,229,237,239,238,239,243,240,225, + 227,101,128,255, 3,243,237,225,236,108,128,254, 95,229,114, 2, + 142,244,143, 20,225,236,243,233,231,110, 2,142,255,143, 7,231, + 242,229,229,107,128, 3,116,236,239,247,229,242,231,242,229,229, + 107,128, 3,117,111,128, 33, 22,110,130, 5,224,143, 32,143, 52, + 228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229, + 119,128,251, 64,232,229,226,242,229,119,128, 5,224,246,243,241, + 245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51, + 187,249, 97, 3,143, 90,143,100,143,107,226,229,238,231,225,236, + 105,128, 9,158,228,229,246, 97,128, 9, 30,231,117, 2,143,114, + 143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232, + 105,128, 10, 30,111,147, 0,111,143,174,143,196,144, 18,144,188, + 145, 4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174, + 148, 8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97, 2, + 143,180,143,187,227,245,244,101,128, 0,243,238,231,244,232,225, + 105,128, 14, 45, 98, 4,143,206,143,248,144, 1,144, 11,225,242, + 242,229,100,130, 2,117,143,218,143,229,227,249,242,233,236,236, + 233, 99,128, 4,233,228,233,229,242,229,243,233,243,227,249,242, + 233,236,236,233, 99,128, 4,235,229,238,231,225,236,105,128, 9, + 147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128, + 1, 79, 99, 3,144, 26,144, 99,144,178, 97, 2,144, 32,144, 93, + 238,228,242, 97, 3,144, 43,144, 50,144, 61,228,229,246, 97,128, + 9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247, + 229,236,243,233,231,110, 2,144, 75,144, 82,228,229,246, 97,128, + 9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110, + 128, 1,210,233,242, 99, 2,144,107,144,112,236,101,128, 36,222, + 245,237,230,236,229,120,133, 0,244,144,131,144,139,144,150,144, + 158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229, + 236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239, + 239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128, + 30,215,249,242,233,236,236,233, 99,128, 4, 62,100, 4,144,198, + 144,221,144,227,144,250,226,108, 2,144,205,144,213,225,227,245, + 244,101,128, 1, 81,231,242,225,246,101,128, 2, 13,229,246, 97, + 128, 9, 19,233,229,242,229,243,233,115,129, 0,246,144,239,227, + 249,242,233,236,236,233, 99,128, 4,231,239,244,226,229,236,239, + 119,128, 30,205,101,129, 1, 83,145, 10,235,239,242,229,225,110, + 128, 49, 90,103, 3,145, 27,145, 42,145, 49,239,238,229,107,129, + 2,219,145, 36,227,237, 98,128, 3, 40,242,225,246,101,128, 0, + 242,245,234,225,242,225,244,105,128, 10,147,104, 4,145, 69,145, + 80,145, 90,145,168,225,242,237,229,238,233,225,110,128, 5,133, + 233,242,225,231,225,238, 97,128, 48, 74,111, 2,145, 96,145,106, + 239,235,225,226,239,246,101,128, 30,207,242,110,133, 1,161,145, + 121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30, + 219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246, + 101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223, + 244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236, + 225,245,116,128, 1, 81,105,129, 1,163,145,188,238,246,229,242, + 244,229,228,226,242,229,246,101,128, 2, 15,107, 2,145,209,145, + 233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236, + 230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49, + 87,236,229,232,229,226,242,229,119,128, 5,171,109, 6,146, 10, + 146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130, + 1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242, + 225,246,101,128, 30, 81,228,229,246, 97,128, 9, 80,229,231, 97, + 133, 3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128, 3, + 214,227,249,242,233,236,236,233, 99,128, 4, 97,236,225,244,233, + 238,227,236,239,243,229,100,128, 2,119,242,239,245,238,228,227, + 249,242,233,236,236,233, 99,128, 4,123,116, 2,146,112,146,127, + 233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,125,239, + 238,239,115,128, 3,206,231,245,234,225,242,225,244,105,128, 10, + 208,233,227,242,239,110,129, 3,191,146,155,244,239,238,239,115, + 128, 3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101, + 145, 0, 49,146,213,146,222,146,232,147, 6,147, 31,147, 40,147, + 49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147, + 227,147,235,147,246,225,242,225,226,233, 99,128, 6, 97,226,229, + 238,231,225,236,105,128, 9,231,227,233,242,227,236,101,129, 36, + 96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229, + 242,233,102,128, 39,138,100, 2,147, 12,147, 18,229,246, 97,128, + 9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229, + 233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246, + 220,231,117, 2,147, 56,147, 65,234,225,242,225,244,105,128, 10, + 231,242,237,245,235,232,105,128, 10,103,232, 97, 3,147, 83,147, + 94,147, 99,227,235,225,242,225,226,233, 99,128, 6, 97,236,102, + 128, 0,189,238,231,250,232,239,117,128, 48, 33,105, 2,147,114, + 147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239, + 238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225, + 244,239,242,226,229,238,231,225,236,105,128, 9,244,239,236,228, + 243,244,249,236,101,128,247, 49,112, 2,147,190,147,197,225,242, + 229,110,128, 36,116,229,114, 2,147,204,147,210,233,239,100,128, + 36,136,243,233,225,110,128, 6,241,241,245,225,242,244,229,114, + 128, 0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242, + 233,239,114,128, 0,185,244,104, 2,147,253,148, 2,225,105,128, + 14, 81,233,242,100,128, 33, 83,111, 3,148, 16,148, 50,148, 66, + 103, 2,148, 22,148, 40,239,238,229,107,129, 1,235,148, 31,237, + 225,227,242,239,110,128, 1,237,245,242,237,245,235,232,105,128, + 10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128, + 10, 75,240,229,110,128, 2, 84,112, 3,148, 80,148, 87,148, 98, + 225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128, + 37,230,244,233,239,110,128, 35, 37,114, 2,148,111,148,140,100, + 2,148,117,148,128,230,229,237,233,238,233,238,101,128, 0,170, + 237,225,243,227,245,236,233,238,101,128, 0,186,244,232,239,231, + 239,238,225,108,128, 34, 31,115, 5,148,163,148,195,148,212,149, + 1,149, 14,232,239,242,116, 2,148,172,148,179,228,229,246, 97, + 128, 9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97, + 128, 9, 74,236,225,243,104,129, 0,248,148,204,225,227,245,244, + 101,128, 1,255,237,225,236,108, 2,148,221,148,232,232,233,242, + 225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97, + 129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255, + 107,244,242,239,235,229,225,227,245,244,101,128, 1,255,245,240, + 229,242,233,239,114,128,246,240,116, 2,149, 30,149, 41,227,249, + 242,233,236,236,233, 99,128, 4,127,233,236,228,101,130, 0,245, + 149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242, + 229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111, + 128, 49, 33,118, 2,149, 89,149,170,229,114, 2,149, 96,149,162, + 236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99, 2,149, + 115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237, + 98,128, 3, 5,100, 2,149,138,149,146,225,243,232,229,100,128, + 254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128, + 254, 75,243,227,239,242,101,128, 0,175,239,247,229,236,243,233, + 231,110, 3,149,185,149,195,149,202,226,229,238,231,225,236,105, + 128, 9,203,228,229,246, 97,128, 9, 75,231,245,234,225,242,225, + 244,105,128, 10,203,112,145, 0,112,149,251,152,123,152,134,152, + 143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157, + 92,157,100,158, 2,158, 60,158, 88,158, 98, 97, 14,150, 25,150, + 57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150, + 212,150,226,151,238,152, 21,152,111, 97, 2,150, 31,150, 43,237, + 240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239, + 243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105, + 128, 9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128, 9, + 42,103, 2,150, 87,150,105,101, 2,150, 93,150,100,228,239,247, + 110,128, 33,223,245,112,128, 33,222,117, 2,150,111,150,120,234, + 225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10, + 42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238, + 238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225, + 238, 97,128, 48,209,108, 2,150,171,150,196,225,244,225,236,233, + 250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237, + 98,128, 4,132,239,227,232,235,225,227,249,242,233,236,236,233, + 99,128, 4,192,238,243,233,239,243,235,239,242,229,225,110,128, + 49,127,114, 3,150,234,150,255,151,227, 97, 2,150,240,150,248, + 231,242,225,240,104,128, 0,182,236,236,229,108,128, 34, 37,229, + 110, 2,151, 6,151,116,236,229,230,116,136, 0, 40,151, 29,151, + 44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244, + 239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248, + 237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32, + 141,237,239,238,239,243,240,225,227,101,128,255, 8,115, 2,151, + 83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239, + 114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225, + 108,128,254, 53,242,233,231,232,116,136, 0, 41,151,140,151,155, + 151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239, + 238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248, + 229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142, + 237,239,238,239,243,240,225,227,101,128,255, 9,115, 2,151,194, + 151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114, + 128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108, + 128,254, 54,244,233,225,236,228,233,230,102,128, 34, 2,115, 3, + 151,246,152, 1,152, 13,229,241,232,229,226,242,229,119,128, 5, + 192,232,244,225,232,229,226,242,229,119,128, 5,153,241,245,225, + 242,101,128, 51,169,244,225,104,134, 5,183,152, 39,152, 53,152, + 58,152, 67,152, 82,152, 98, 49, 2,152, 45,152, 49, 49,128, 5, + 183,100,128, 5,183,178, 97,128, 5,183,232,229,226,242,229,119, + 128, 5,183,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,183,247,233,228,229,232,229,226,242,229,119,128, 5,183,250, + 229,242,232,229,226,242,229,119,128, 5,161,226,239,240,239,237, + 239,230,111,128, 49, 6,227,233,242,227,236,101,128, 36,223,228, + 239,244,225,227,227,229,238,116,128, 30, 87,101,137, 5,228,152, + 177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154, + 73,227,249,242,233,236,236,233, 99,128, 4, 63,228,225,231,229, + 243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68, + 229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225, + 236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67, + 104, 5,152,252,153, 19,153, 27,153, 41,153, 71,225,114, 2,153, + 3,153, 10,225,226,233, 99,128, 6,126,237,229,238,233,225,110, + 128, 5,122,229,226,242,229,119,128, 5,228,230,233,238,225,236, + 225,242,225,226,233, 99,128,251, 87,105, 2,153, 47,153, 62,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225, + 231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48, + 218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236, + 236,233, 99,128, 4,167,114, 5,153,130,153,142,153,184,154, 49, + 154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229, + 238,116,131, 0, 37,153,155,153,164,153,176,225,242,225,226,233, + 99,128, 6,106,237,239,238,239,243,240,225,227,101,128,255, 5, + 243,237,225,236,108,128,254,106,105, 2,153,190,154, 31,239,100, + 134, 0, 46,153,207,153,218,153,229,153,241,153,252,154, 8,225, + 242,237,229,238,233,225,110,128, 5,137,227,229,238,244,229,242, + 229,100,128, 0,183,232,225,236,230,247,233,228,244,104,128,255, + 97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239, + 243,240,225,227,101,128,255, 14,115, 2,154, 14,154, 21,237,225, + 236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243, + 240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128, 3, + 66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232, + 239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167, + 230,243,241,245,225,242,101,128, 51,138,104, 3,154, 98,154,148, + 155, 29, 97, 3,154,106,154,116,154,123,226,229,238,231,225,236, + 105,128, 9,171,228,229,246, 97,128, 9, 43,231,117, 2,154,130, + 154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232, + 105,128, 10, 43,105,133, 3,198,154,162,154,166,154,252,155, 4, + 155, 15, 49,128, 3,213,229,245,240,104, 4,154,179,154,214,154, + 229,154,238, 97, 2,154,185,154,200,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233, + 110,128, 2,120,238,244,232,245,244,232,225,105,128, 14, 58,243, + 249,237,226,239,236,231,242,229,229,107,128, 3,213,111, 3,155, + 37,155, 42,155, 68,239,107,128, 1,165,240,104, 2,155, 49,155, + 58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225, + 105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128, + 14, 32,105,133, 3,192,155, 96,156, 52,156, 63,156, 74,156, 88, + 229,245,112, 6,155,112,155,147,155,179,155,207,155,221,156, 17, + 97, 2,155,118,155,133,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 19,227,105, 2,155,154,155,166,229,245,227,235,239,242, + 229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110, + 128, 50,101,107, 2,155,185,155,199,233,249,229,239,235,235,239, + 242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 5,243,233,239, + 115, 2,155,230,156, 2,107, 2,155,236,155,250,233,249,229,239, + 235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128, + 49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49, + 117,116, 2,156, 23,156, 38,232,233,229,245,244,232,235,239,242, + 229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225, + 110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235, + 225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236, + 231,242,229,229,107,128, 3,214,247,242,225,242,237,229,238,233, + 225,110,128, 5,131,236,245,115,132, 0, 43,156,115,156,126,156, + 135,156,168,226,229,236,239,247,227,237, 98,128, 3, 31,227,233, + 242,227,236,101,128, 34,149,109, 2,156,141,156,148,233,238,245, + 115,128, 0,177,111, 2,156,154,156,158,100,128, 2,214,238,239, + 243,240,225,227,101,128,255, 11,115, 2,156,174,156,181,237,225, + 236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109, + 2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80, + 243,241,245,225,242,101,128, 51,216,111, 5,156,229,156,240,157, + 51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125, + 233,238,244,233,238,231,233,238,228,229,120, 4,157, 4,157, 16, + 157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31, + 236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232, + 244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101, + 128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236, + 225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107, + 129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229, + 110,128, 36,171,114, 3,157,108,157,134,157,159,101, 2,157,114, + 157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244, + 233,239,110,128, 33, 30,233,237,101, 2,157,142,157,148,237,239, + 100,128, 2,185,242,229,246,229,242,243,229,100,128, 32, 53,111, + 4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15, + 234,229,227,244,233,246,101,128, 35, 5,236,239,238,231,229,228, + 235,225,238, 97,128, 48,252,112, 2,157,205,157,242,101, 2,157, + 211,157,218,236,236,239,114,128, 35, 24,242,243,117, 2,157,226, + 157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128, + 34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128, + 34, 29,115, 2,158, 8,158, 51,105,130, 3,200,158, 16,158, 27, + 227,249,242,233,236,236,233, 99,128, 4,113,236,233,240,238,229, + 245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98, + 128, 4,134,243,241,245,225,242,101,128, 51,176,117, 2,158, 66, + 158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244, + 225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128, + 51,180,247,243,241,245,225,242,101,128, 51,186,113,136, 0,113, + 158,128,159,177,159,188,159,197,159,204,159,216,159,254,160, 6, + 97, 4,158,138,158,161,158,225,159,160,100, 2,158,144,158,150, + 229,246, 97,128, 9, 88,237,225,232,229,226,242,229,119,128, 5, + 168,102, 4,158,171,158,180,158,194,158,210,225,242,225,226,233, + 99,128, 6, 66,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 216,237,225,244,115,136, 5,184,158,248,159, 12,159, 26,159, 31, + 159, 36,159, 45,159, 60,159,147, 49, 3,159, 0,159, 4,159, 8, + 48,128, 5,184, 97,128, 5,184, 99,128, 5,184, 50, 2,159, 18, + 159, 22, 55,128, 5,184, 57,128, 5,184,179, 51,128, 5,184,228, + 101,128, 5,184,232,229,226,242,229,119,128, 5,184,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,184,113, 2,159, 66, + 159,132,225,244,225,110, 4,159, 79,159, 88,159,103,159,119,232, + 229,226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,184,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,184,247,233,228,229,232,229,226,242,229, + 119,128, 5,184,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,184,247,233,228,229,232,229,226,242,229,119,128, 5,184, + 242,238,229,249,240,225,242,225,232,229,226,242,229,119,128, 5, + 159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227, + 236,101,128, 36,224,232,239,239,107,128, 2,160,237,239,238,239, + 243,240,225,227,101,128,255, 81,239,102,130, 5,231,159,225,159, + 245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242, + 229,119,128,251, 71,232,229,226,242,229,119,128, 5,231,240,225, + 242,229,110,128, 36,172,117, 4,160, 16,160, 28,160,117,160,204, + 225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115, + 135, 5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160, + 104,177, 56,128, 5,187,178, 53,128, 5,187,179, 49,128, 5,187, + 232,229,226,242,229,119,128, 5,187,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,187,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,187,247,233,228,229,232,229,226,242, + 229,119,128, 5,187,229,243,244,233,239,110,133, 0, 63,160,136, + 160,159,160,176,160,184,160,196,225,114, 2,160,143,160,150,225, + 226,233, 99,128, 6, 31,237,229,238,233,225,110,128, 5, 94,228, + 239,247,110,129, 0,191,160,168,243,237,225,236,108,128,247,191, + 231,242,229,229,107,128, 3,126,237,239,238,239,243,240,225,227, + 101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101, 4, + 160,216,161, 31,161, 51,161, 80,228,226,108,133, 0, 34,160,232, + 160,239,160,246,161, 2,161, 23,226,225,243,101,128, 32, 30,236, + 229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128, + 255, 2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229, + 242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236, + 229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100, + 128, 32, 27,114, 2,161, 57,161, 67,229,246,229,242,243,229,100, + 128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128, 1, 73, + 243,233,238,231,108, 2,161, 90,161, 97,226,225,243,101,128, 32, + 26,101,129, 0, 39,161,103,237,239,238,239,243,240,225,227,101, + 128,255, 7,114,145, 0,114,161,153,162,157,162,168,162,215,163, + 10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167, + 35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161, + 198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162, + 151,225,242,237,229,238,233,225,110,128, 5,124,226,229,238,231, + 225,236,105,128, 9,176,227,245,244,101,128, 1, 85,100, 4,161, + 215,161,221,161,235,162, 5,229,246, 97,128, 9, 48,233,227,225, + 108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243, + 243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225, + 242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101, + 129, 5,191,162, 21,232,229,226,242,229,119,128, 5,191,231,117, + 2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237, + 245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128, + 48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232, + 225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242, + 228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128, + 9,241,109, 2,162,120,162,143,233,228,228,236,229,228,233,225, + 231,239,238,225,236,226,229,238,231,225,236,105,128, 9,240,243, + 232,239,242,110,128, 2,100,244,233,111,128, 34, 54,226,239,240, + 239,237,239,230,111,128, 49, 22, 99, 4,162,178,162,185,162,194, + 162,202,225,242,239,110,128, 1, 89,229,228,233,236,236, 97,128, + 1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227, + 227,229,238,116,128, 1, 87,100, 2,162,221,162,231,226,236,231, + 242,225,246,101,128, 2, 17,239,116, 2,162,238,162,247,225,227, + 227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163, + 1,237,225,227,242,239,110,128, 30, 93,101, 6,163, 24,163, 69, + 163,104,163,159,163,184,163,217,102, 2,163, 30,163, 43,229,242, + 229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117, + 2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243, + 229,116,128, 34,135,231,233,243,244,229,114, 2,163, 80,163, 85, + 229,100,128, 0,174,115, 2,163, 91,163, 97,225,238,115,128,248, + 232,229,242,233,102,128,246,218,104, 3,163,112,163,135,163,149, + 225,114, 2,163,119,163,126,225,226,233, 99,128, 6, 49,237,229, + 238,233,225,110,128, 5,128,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235, + 225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230, + 247,233,228,244,104,128,255,154,243,104,130, 5,232,163,193,163, + 208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72, + 232,229,226,242,229,119,128, 5,232,118, 3,163,225,163,238,164, + 14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97, + 2,163,245,163,254,232,229,226,242,229,119,128, 5,151,237,245, + 231,242,225,243,232,232,229,226,242,229,119,128, 5,151,236,239, + 231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232, + 239,239,107,129, 2,126,164, 40,242,229,246,229,242,243,229,100, + 128, 2,127,104, 2,164, 57,164, 80, 97, 2,164, 63,164, 73,226, + 229,238,231,225,236,105,128, 9,221,228,229,246, 97,128, 9, 93, + 111,131, 3,193,164, 90,164,119,164,133,239,107,129, 2,125,164, + 97,244,245,242,238,229,100,129, 2,123,164,108,243,245,240,229, + 242,233,239,114,128, 2,181,243,249,237,226,239,236,231,242,229, + 229,107,128, 3,241,244,233,227,232,239,239,235,237,239,100,128, + 2,222,105, 6,164,160,165,204,165,250,166, 5,166, 30,166,166, + 229,245,108, 9,164,182,164,217,164,232,164,246,165, 36,165, 50, + 165,136,165,149,165,184, 97, 2,164,188,164,203,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238, + 235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242, + 229,225,110,128, 49, 64,107, 2,164,252,165, 28,233,249,229,239, + 107, 2,165, 6,165, 15,235,239,242,229,225,110,128, 49, 58,243, + 233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225, + 110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128, + 49, 59,112, 3,165, 58,165, 90,165,105, 97, 2,165, 64,165, 78, + 238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229, + 238,235,239,242,229,225,110,128, 50, 3,232,233,229,245,240,232, + 235,239,242,229,225,110,128, 49, 63,233,229,245,112, 2,165,114, + 165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235, + 239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229, + 225,110,128, 49, 61,116, 2,165,155,165,170,232,233,229,245,244, + 232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235, + 239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233, + 229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116, 2, + 165,212,165,220,225,238,231,236,101,128, 34, 31,116, 2,165,226, + 165,240,225,227,235,226,229,236,239,247,227,237, 98,128, 3, 25, + 242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225, + 238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234, + 166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110, 2, + 166, 36,166,152,103,131, 2,218,166, 46,166, 57,166, 63,226,229, + 236,239,247,227,237, 98,128, 3, 37,227,237, 98,128, 3, 10,232, + 225,236,102, 2,166, 72,166,118,236,229,230,116,131, 2,191,166, + 85,166, 96,166,107,225,242,237,229,238,233,225,110,128, 5, 89, + 226,229,236,239,247,227,237, 98,128, 3, 28,227,229,238,244,229, + 242,229,100,128, 2,211,242,233,231,232,116,130, 2,190,166,130, + 166,141,226,229,236,239,247,227,237, 98,128, 3, 57,227,229,238, + 244,229,242,229,100,128, 2,210,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 19,244,244,239,242,245,243,241,245,225,242, + 101,128, 51, 81,108, 2,166,186,166,197,233,238,229,226,229,236, + 239,119,128, 30, 95,239,238,231,236,229,103,129, 2,124,166,208, + 244,245,242,238,229,100,128, 2,122,237,239,238,239,243,240,225, + 227,101,128,255, 82,111, 3,166,237,166,248,167, 17,232,233,242, + 225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97, + 129, 48,237,167, 5,232,225,236,230,247,233,228,244,104,128,255, + 155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110, + 128, 36,173,114, 3,167, 43,167, 79,167,109, 97, 3,167, 51,167, + 61,167, 68,226,229,238,231,225,236,105,128, 9,220,228,229,246, + 97,128, 9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229, + 104, 2,167, 86,167, 95,225,242,225,226,233, 99,128, 6,145,230, + 233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227, + 225,236,233, 99, 4,167,125,167,135,167,142,167,153,226,229,238, + 231,225,236,105,128, 9,224,228,229,246, 97,128, 9, 96,231,245, + 234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233, + 231,110, 3,167,169,167,179,167,186,226,229,238,231,225,236,105, + 128, 9,196,228,229,246, 97,128, 9, 68,231,245,234,225,242,225, + 244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241, + 116, 2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242, + 238,229,100,129, 2,121,167,232,243,245,240,229,242,233,239,114, + 128, 2,180,117, 4,167,253,168, 8,168, 33,168, 80,232,233,242, + 225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97, + 129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255, + 153,112, 2,168, 39,168, 74,229,101, 2,168, 46,168, 60,237,225, + 242,235,226,229,238,231,225,236,105,128, 9,242,243,233,231,238, + 226,229,238,231,225,236,105,128, 9,243,233,225,104,128,246,221, + 244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99, 4,168, + 103,168,113,168,120,168,131,226,229,238,231,225,236,105,128, 9, + 139,228,229,246, 97,128, 9, 11,231,245,234,225,242,225,244,105, + 128, 10,139,246,239,247,229,236,243,233,231,110, 3,168,147,168, + 157,168,164,226,229,238,231,225,236,105,128, 9,195,228,229,246, + 97,128, 9, 67,231,245,234,225,242,225,244,105,128, 10,195,115, + 147, 0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174, + 60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181, + 203,182,133,182,206,183,120,183,130, 97, 9,168,237,168,247,169, + 12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238, + 231,225,236,105,128, 9,184,227,245,244,101,129, 1, 91,169, 0, + 228,239,244,225,227,227,229,238,116,128, 30,101,100, 5,169, 24, + 169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128, 6, + 53,229,246, 97,128, 9, 56,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,188,231,117, 2,169, 91,169,100,234,225,242,225,244, + 105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242, + 225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97, + 129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255, + 123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229, + 247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253, + 250,237,229,235,104,130, 5,225,169,188,169,208,228,225,231,229, + 243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65, + 232,229,226,242,229,119,128, 5,225,242, 97, 5,169,230,170, 48, + 170, 56,170,106,170,114, 97, 5,169,242,169,250,170, 2,170, 33, + 170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128, + 14, 65,233,237,225,233,109, 2,170, 12,170, 23,225,236,225,233, + 244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14, + 67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48, + 229,244,232,225,105,128, 14, 64,105, 3,170, 64,170, 88,170, 99, + 105, 2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248, + 134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105, + 128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128, + 14, 66,117, 3,170,122,170,172,170,179,101, 3,170,130,170,154, + 170,165,101, 2,170,136,170,147,236,229,230,244,244,232,225,105, + 128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232, + 225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105, + 128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237, + 239,230,111,128, 49, 25, 99, 5,170,210,170,231,170,240,171, 33, + 171, 55,225,242,239,110,129, 1, 97,170,219,228,239,244,225,227, + 227,229,238,116,128, 30,103,229,228,233,236,236, 97,128, 1, 95, + 232,247, 97,131, 2, 89,170,252,171, 7,171, 26,227,249,242,233, + 236,236,233, 99,128, 4,217,228,233,229,242,229,243,233,243,227, + 249,242,233,236,236,233, 99,128, 4,219,232,239,239,107,128, 2, + 90,233,242, 99, 2,171, 41,171, 46,236,101,128, 36,226,245,237, + 230,236,229,120,128, 1, 93,239,237,237,225,225,227,227,229,238, + 116,128, 2, 25,228,239,116, 2,171, 76,171, 85,225,227,227,229, + 238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228, + 239,244,225,227,227,229,238,116,128, 30,105,101, 9,171,127,171, + 143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225, + 231,245,236,236,226,229,236,239,247,227,237, 98,128, 3, 60, 99, + 2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238, + 229,227,232,233,238,229,243,101,128, 2,202,244,233,239,110,128, + 0,167,229,110, 4,171,189,171,198,171,212,171,228,225,242,225, + 226,233, 99,128, 6, 51,230,233,238,225,236,225,242,225,226,233, + 99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,180,231,239,108,135, 5,182,172, 7,172, 21,172, 26,172, + 35,172, 50,172, 66,172, 77, 49, 2,172, 13,172, 17, 51,128, 5, + 182,102,128, 5,182,178, 99,128, 5,182,232,229,226,242,229,119, + 128, 5,182,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,182,244,225,232,229,226,242,229,119,128, 5,146,247,233,228, + 229,232,229,226,242,229,119,128, 5,182,104, 2,172, 96,172,107, + 225,242,237,229,238,233,225,110,128, 5,125,233,242,225,231,225, + 238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187, + 172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105, + 2,172,149,172,192,227,239,236,239,110,131, 0, 59,172,163,172, + 172,172,184,225,242,225,226,233, 99,128, 6, 27,237,239,238,239, + 243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84, + 246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48, + 156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238, + 116, 2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34, + 239,243,241,245,225,242,101,128, 51, 35,246,229,110,142, 0, 55, + 173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146, + 173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226, + 233, 99,128, 6,103,226,229,238,231,225,236,105,128, 9,237,227, + 233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243, + 229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246, + 97,128, 9,109,229,233,231,232,244,232,115,128, 33, 94,231,117, + 2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237, + 245,235,232,105,128, 10,109,232, 97, 2,173,126,173,137,227,235, + 225,242,225,226,233, 99,128, 6,103,238,231,250,232,239,117,128, + 48, 39,105, 2,173,152,173,170,228,229,239,231,242,225,240,232, + 233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239, + 114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23, + 239,236,228,243,244,249,236,101,128,247, 55,112, 2,173,209,173, + 216,225,242,229,110,128, 36,122,229,114, 2,173,223,173,229,233, + 239,100,128, 36,142,243,233,225,110,128, 6,247,242,239,237,225, + 110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116, + 2,174, 5,174, 43,229,229,110, 2,174, 13,174, 22,227,233,242, + 227,236,101,128, 36,112,112, 2,174, 28,174, 35,225,242,229,110, + 128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14, + 87,230,244,232,249,240,232,229,110,128, 0,173,104, 7,174, 76, + 175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97, 6,174, 90, + 174,101,174,111,174,122,175, 9,175, 34,225,242,237,229,238,233, + 225,110,128, 5,119,226,229,238,231,225,236,105,128, 9,182,227, + 249,242,233,236,236,233, 99,128, 4, 72,100, 2,174,128,174,224, + 228, 97, 4,174,139,174,148,174,179,174,193,225,242,225,226,233, + 99,128, 6, 81,228,225,237,237, 97, 2,174,158,174,167,225,242, + 225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99, + 128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252, + 96,235,225,243,242, 97, 2,174,203,174,212,225,242,225,226,233, + 99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95, + 101,132, 37,146,174,236,174,243,174,251,175, 4,228,225,242,107, + 128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245, + 109,128, 37,146,246, 97,128, 9, 54,231,117, 2,175, 16,175, 25, + 234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128, + 10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128, + 5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225, + 227,249,242,233,236,236,233, 99,128, 4, 73,101, 4,175, 85,175, + 150,175,160,175,177,229,110, 4,175, 96,175,105,175,119,175,135, + 225,242,225,226,233, 99,128, 6, 52,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,254,184,233,227,239,240,244,233, 99,128, 3,227, + 241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32, + 170,246, 97,134, 5,176,175,194,175,209,175,223,175,232,175,247, + 176, 7, 49, 2,175,200,175,205,177, 53,128, 5,176, 53,128, 5, + 176, 50, 2,175,215,175,219, 50,128, 5,176,101,128, 5,176,232, + 229,226,242,229,119,128, 5,176,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,176,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,176,247,233,228,229,232,229,226,242,229, + 119,128, 5,176,232,225,227,249,242,233,236,236,233, 99,128, 4, + 187,105, 2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128, + 3,237,110,131, 5,233,176, 60,176,143,176,152,100, 2,176, 66, + 176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229, + 226,242,229,119,128,251, 73,115, 2,176, 93,176,113,232,233,238, + 228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251, + 44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229, + 119,128,251, 45,239,244,232,229,226,242,229,119,128, 5,193,232, + 229,226,242,229,119,128, 5,233,115, 2,176,158,176,178,232,233, + 238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128, + 251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242, + 229,119,128,251, 43,239,239,107,128, 2,130,105, 8,176,221,177, + 9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97, + 131, 3,195,176,233,176,237,176,245, 49,128, 3,194,230,233,238, + 225,108,128, 3,194,236,245,238,225,244,229,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,242,232,233,242,225,231,225,238, + 97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177, + 33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113, + 2,177, 53,177, 62,232,229,226,242,229,119,128, 5,189,236,229, + 230,244,232,229,226,242,229,119,128, 5,189,237,233,236,225,114, + 128, 34, 60,238,228,239,244,232,229,226,242,229,119,128, 5,194, + 239,115, 6,177,111,177,146,177,178,177,206,177,220,177,252, 97, + 2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225, + 110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 20,227,105, 2,177,153,177,165,229,245,227,235,239,242,229, + 225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128, + 50,102,107, 2,177,184,177,198,233,249,229,239,235,235,239,242, + 229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233, + 229,245,238,235,239,242,229,225,110,128, 49,123,112, 2,177,226, + 177,239,225,242,229,238,235,239,242,229,225,110,128, 50, 6,233, + 229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49,124,120,141, 0, 54,178, + 41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178, + 195,178,206,178,239,178,247,179, 2,225,242,225,226,233, 99,128, + 6,102,226,229,238,231,225,236,105,128, 9,236,227,233,242,227, + 236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225, + 238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128, 9, + 108,231,117, 2,178,104,178,113,234,225,242,225,244,105,128, 10, + 236,242,237,245,235,232,105,128, 10,108,232, 97, 2,178,129,178, + 140,227,235,225,242,225,226,233, 99,128, 6,102,238,231,250,232, + 239,117,128, 48, 38,105, 2,178,155,178,173,228,229,239,231,242, + 225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229, + 242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101, + 128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112, 2, + 178,212,178,219,225,242,229,110,128, 36,121,229,114, 2,178,226, + 178,232,233,239,100,128, 36,141,243,233,225,110,128, 6,246,242, + 239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128, + 32,118,116, 2,179, 8,179, 79,229,229,110, 2,179, 16,179, 58, + 99, 2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242, + 242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242, + 226,229,238,231,225,236,105,128, 9,249,112, 2,179, 64,179, 71, + 225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232, + 225,105,128, 14, 86,108, 2,179, 91,179,111,225,243,104,129, 0, + 47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239, + 238,103,129, 1,127,179,119,228,239,244,225,227,227,229,238,116, + 128, 30,155,109, 2,179,137,179,147,233,236,229,230,225,227,101, + 128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111, 6, + 179,172,179,222,179,233,180, 2,180, 47,180, 58,102, 2,179,178, + 179,192,240,225,243,245,241,232,229,226,242,229,119,128, 5,195, + 116, 2,179,198,179,207,232,249,240,232,229,110,128, 0,173,243, + 233,231,238,227,249,242,233,236,236,233, 99,128, 4, 76,232,233, + 242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238, + 97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128, + 255,127,236,233,228,245,115, 2,180, 12,180, 29,236,239,238,231, + 239,246,229,242,236,225,249,227,237, 98,128, 3, 56,243,232,239, + 242,244,239,246,229,242,236,225,249,227,237, 98,128, 3, 55,242, + 245,243,233,244,232,225,105,128, 14, 41,115, 3,180, 66,180, 76, + 180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225, + 105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97, 3, + 180,102,180,122,180,154,227,101,129, 0, 32,180,109,232,225,227, + 235,225,242,225,226,233, 99,128, 0, 32,228,101,129, 38, 96,180, + 129,243,245,233,116, 2,180,138,180,146,226,236,225,227,107,128, + 38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174, + 241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255, + 181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239, + 247,227,237, 98,128, 3, 59, 99, 2,180,205,180,209, 99,128, 51, + 196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239, + 243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239, + 242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107, + 2,181, 5,181, 9,103,128, 51,143,109,129, 51,158,181, 15,227, + 225,240,233,244,225,108,128, 51,206,108, 2,181, 31,181, 35,110, + 128, 51,209,239,103,128, 51,210,109, 4,181, 50,181, 54,181, 59, + 181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243, + 241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239, + 238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236, + 108,128, 37,166,245,240,240,229,114, 2,181,110,181,133,236,229, + 230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233, + 236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229, + 242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244, + 233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229, + 247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37, + 163,242,243,241,245,225,242,101,128, 51,219,115, 2,181,209,182, + 123, 97, 4,181,219,181,229,181,236,181,247,226,229,238,231,225, + 236,105,128, 9,183,228,229,246, 97,128, 9, 55,231,245,234,225, + 242,225,244,105,128, 10,183,238,103, 8,182, 10,182, 24,182, 38, + 182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235, + 239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225, + 110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110, + 128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49, + 101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243, + 233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233, + 239,114,128,246,242,116, 2,182,139,182,162,229,242,236,233,238, + 103,129, 0,163,182,150,237,239,238,239,243,240,225,227,101,128, + 255,225,242,239,235,101, 2,182,171,182,188,236,239,238,231,239, + 246,229,242,236,225,249,227,237, 98,128, 3, 54,243,232,239,242, + 244,239,246,229,242,236,225,249,227,237, 98,128, 3, 53,117, 7, + 182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243, + 229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225, + 108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99, 2, + 183, 4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225, + 116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107, + 2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183, + 49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225, + 242,225,226,233, 99,128, 6, 82,237,237,225,244,233,239,110,128, + 34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183, + 99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242, + 229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128, + 51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101, + 128, 51,124,116,144, 0,116,183,183,184,192,184,213,185,100,185, + 140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194, + 57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183, + 243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238, + 231,225,236,105,128, 9,164,227,107, 2,183,222,183,229,228,239, + 247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97, + 128, 9, 36,231,117, 2,183,250,184, 3,234,225,242,225,244,105, + 128, 10,164,242,237,245,235,232,105,128, 10, 36,104, 4,184, 22, + 184, 31,184, 45,184, 75,225,242,225,226,233, 99,128, 6, 55,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,194,105, 2,184, + 51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225, + 236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229, + 242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235, + 225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244, + 104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128, + 6, 64,117,128, 3,196,118,130, 5,234,184,158,184,183,228,225, + 231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229, + 226,242,229,119,128,251, 74,232,229,226,242,229,119,128, 5,234, + 98, 2,184,198,184,203,225,114,128, 1,103,239,240,239,237,239, + 230,111,128, 49, 10, 99, 6,184,227,184,234,184,241,184,250,185, + 60,185, 87,225,242,239,110,128, 1,101,227,245,242,108,128, 2, + 168,229,228,233,236,236, 97,128, 1, 99,232,229,104, 4,185, 6, + 185, 15,185, 29,185, 45,225,242,225,226,233, 99,128, 6,134,230, + 233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99, 2, + 185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226, + 229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238, + 116,128, 1, 99,100, 2,185,106,185,116,233,229,242,229,243,233, + 115,128, 30,151,239,116, 2,185,123,185,132,225,227,227,229,238, + 116,128, 30,107,226,229,236,239,119,128, 30,109,101, 9,185,160, + 185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158, + 227,249,242,233,236,236,233, 99,128, 4, 66,228,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,173,104, + 7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225, + 242,225,226,233, 99,128, 6, 42,230,233,238,225,236,225,242,225, + 226,233, 99,128,254,150,232,225,232,105, 2,185,239,185,254,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105, 2, + 186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237, + 105, 2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226, + 233, 99,128,252, 11,109, 2,186, 91,186,125,225,242,226,245,244, + 97, 2,186,102,186,111,225,242,225,226,233, 99,128, 6, 41,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,148,101, 2,186, + 131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152, + 229,237,105, 2,186,152,186,167,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242, + 225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236, + 225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238, + 97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128, + 255,131,108, 2,186,232,186,251,229,240,232,239,238,101,129, 33, + 33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97, 2, + 187, 4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119, + 128, 5,160,241,229,244,225,238,225,232,229,226,242,229,119,128, + 5,169,110, 4,187, 44,187, 53,187, 72,187, 93,227,233,242,227, + 236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227, + 240,225,242,229,110,128, 50, 41,112, 2,187, 78,187, 85,225,242, + 229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237, + 225,110,128, 33,121,243,104,128, 2,167,116,131, 5,216,187,116, + 187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232, + 229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128, 5, + 216,243,229,227,249,242,233,236,236,233, 99,128, 4,181,246,233, + 114, 2,187,166,187,175,232,229,226,242,229,119,128, 5,155,236, + 229,230,244,232,229,226,242,229,119,128, 5,155,104, 6,187,202, + 188, 98,188,220,189, 96,190, 3,191, 60, 97, 5,187,214,187,224, + 187,231,188, 0,188, 29,226,229,238,231,225,236,105,128, 9,165, + 228,229,246, 97,128, 9, 37,231,117, 2,187,238,187,247,234,225, + 242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37, + 108, 2,188, 6,188, 15,225,242,225,226,233, 99,128, 6, 48,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232, + 225,235,232,225,116, 3,188, 44,188, 75,188, 82,236,239,119, 2, + 188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242, + 233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128, + 14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,150,101, 3,188,106,188,170,188,193,104, 4,188,116,188,125, + 188,139,188,155,225,242,225,226,233, 99,128, 6, 43,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225, + 236,225,242,225,226,233, 99,128,254,156,242,101, 2,188,177,188, + 186,229,248,233,243,244,115,128, 34, 3,230,239,242,101,128, 34, + 52,244, 97,130, 3,184,188,202,188,206, 49,128, 3,209,243,249, + 237,226,239,236,231,242,229,229,107,128, 3,209,105, 2,188,226, + 189, 56,229,245,244,104, 4,188,239,189, 18,189, 33,189, 42, 97, + 2,188,245,189, 4,227,233,242,227,236,229,235,239,242,229,225, + 110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, + 107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 11,242,244,229,229,110, 2,189, 66, + 189, 75,227,233,242,227,236,101,128, 36,108,112, 2,189, 81,189, + 88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148, + 111, 6,189,110,189,127,189,132,189,146,189,151,189,204,238,225, + 238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239, + 107,128, 1,173,240,232,245,244,232,225,239,244,232,225,105,128, + 14, 18,242,110,128, 0,254,244,104, 3,189,160,189,184,189,194, + 97, 2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23, + 238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128, + 14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238, + 100, 2,189,214,189,225,227,249,242,233,236,236,233, 99,128, 4, + 130,243,243,229,240,225,242,225,244,239,114, 2,189,240,189,249, + 225,242,225,226,233, 99,128, 6,108,240,229,242,243,233,225,110, + 128, 6,108,242,229,101,144, 0, 51,190, 41,190, 50,190, 60,190, + 90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190, + 235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128, + 6, 99,226,229,238,231,225,236,105,128, 9,233,227,233,242,227, + 236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225, + 238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128, 9, + 105,229,233,231,232,244,232,115,128, 33, 92,231,117, 2,190,114, + 190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232, + 105,128, 10,105,232, 97, 2,190,139,190,150,227,235,225,242,225, + 226,233, 99,128, 6, 99,238,231,250,232,239,117,128, 48, 35,105, + 2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240, + 225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32, + 131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237, + 229,242,225,244,239,242,226,229,238,231,225,236,105,128, 9,246, + 239,236,228,243,244,249,236,101,128,247, 51,112, 2,190,241,190, + 248,225,242,229,110,128, 36,118,229,114, 2,190,255,191, 5,233, + 239,100,128, 36,138,243,233,225,110,128, 6,243,241,245,225,242, + 244,229,242,115,129, 0,190,191, 25,229,237,228,225,243,104,128, + 246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233, + 239,114,128, 0,179,244,232,225,105,128, 14, 83,250,243,241,245, + 225,242,101,128, 51,148,105, 7,191, 86,191, 97,191,212,192, 54, + 192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48, + 97,107, 2,191,103,191,127,225,244,225,235,225,238, 97,129, 48, + 193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229, + 245,116, 4,191,139,191,174,191,189,191,198, 97, 2,191,145,191, + 160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242, + 229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 2,236,228,101,133, 2,220,191,228,191,239,192, 0, + 192, 12,192, 40,226,229,236,239,247,227,237, 98,128, 3, 48, 99, + 2,191,245,191,250,237, 98,128, 3, 3,239,237, 98,128, 3, 3, + 228,239,245,226,236,229,227,237, 98,128, 3, 96,111, 2,192, 18, + 192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236, + 225,249,227,237, 98,128, 3, 52,246,229,242,244,233,227,225,236, + 227,237, 98,128, 3, 62,237,229,243,227,233,242,227,236,101,128, + 34,151,112, 2,192, 72,192,102,229,232, 97, 2,192, 80,192, 89, + 232,229,226,242,229,119,128, 5,150,236,229,230,244,232,229,226, + 242,229,119,128, 5,150,240,233,231,245,242,237,245,235,232,105, + 128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237, + 98,128, 4,131,247,238,225,242,237,229,238,233,225,110,128, 5, + 127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238, + 239,243,240,225,227,101,128,255, 84,111, 7,192,185,192,196,192, + 207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225, + 110,128, 5,105,232,233,242,225,231,225,238, 97,128, 48,104,235, + 225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230, + 247,233,228,244,104,128,255,132,110, 3,192,240,193, 82,193, 87, + 101, 4,192,250,193, 63,193, 70,193, 76,226,225,114, 4,193, 6, + 193, 35,193, 45,193, 54,229,248,244,242, 97, 2,193, 16,193, 26, + 232,233,231,232,237,239,100,128, 2,229,236,239,247,237,239,100, + 128, 2,233,232,233,231,232,237,239,100,128, 2,230,236,239,247, + 237,239,100,128, 2,232,237,233,228,237,239,100,128, 2,231,230, + 233,246,101,128, 1,189,243,233,120,128, 1,133,244,247,111,128, + 1,168,239,115,128, 3,132,243,241,245,225,242,101,128, 51, 39, + 240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233, + 243,229,243,232,229,236,236,226,242,225,227,235,229,116, 2,193, + 131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237, + 225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254, + 57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225, + 236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58, + 244,225,239,244,232,225,105,128, 14, 21,240, 97, 2,193,209,193, + 221,236,225,244,225,236,232,239,239,107,128, 1,171,242,229,110, + 128, 36,175,114, 3,193,235,194, 10,194, 25,225,228,229,237,225, + 242,107,129, 33, 34,193,247,115, 2,193,253,194, 3,225,238,115, + 128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236, + 229,248,232,239,239,107,128, 2,136,233,225,103, 4,194, 37,194, + 42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242, + 116,128, 37,186,245,112,128, 37,178,115,132, 2,166,194, 69,194, + 108,194,214,194,227,225,228,105,130, 5,230,194, 79,194, 99,228, + 225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119, + 128,251, 70,232,229,226,242,229,119,128, 5,230,101, 2,194,114, + 194,125,227,249,242,233,236,236,233, 99,128, 4, 70,242,101,134, + 5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49, 2, + 194,148,194,152, 50,128, 5,181,101,128, 5,181,178, 98,128, 5, + 181,232,229,226,242,229,119,128, 5,181,238,225,242,242,239,247, + 232,229,226,242,229,119,128, 5,181,241,245,225,242,244,229,242, + 232,229,226,242,229,119,128, 5,181,247,233,228,229,232,229,226, + 242,229,119,128, 5,181,232,229,227,249,242,233,236,236,233, 99, + 128, 4, 91,245,240,229,242,233,239,114,128,246,243,116, 4,194, + 247,195, 41,195,106,195,157, 97, 3,194,255,195, 9,195, 16,226, + 229,238,231,225,236,105,128, 9,159,228,229,246, 97,128, 9, 31, + 231,117, 2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159, + 242,237,245,235,232,105,128, 10, 31,229,104, 4,195, 52,195, 61, + 195, 75,195, 91,225,242,225,226,233, 99,128, 6,121,230,233,238, + 225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225, + 236,225,242,225,226,233, 99,128,251,105,232, 97, 3,195,115,195, + 125,195,132,226,229,238,231,225,236,105,128, 9,160,228,229,246, + 97,128, 9, 32,231,117, 2,195,139,195,148,234,225,242,225,244, + 105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238, + 229,100,128, 2,135,117, 3,195,173,195,184,195,209,232,233,242, + 225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97, + 129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255, + 130,243,237,225,236,108, 2,195,219,195,230,232,233,242,225,231, + 225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48, + 195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119, + 2,196, 5,196,110,101, 2,196, 11,196, 59,236,246,101, 3,196, + 21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112, 2, + 196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100, + 128, 36,147,242,239,237,225,110,128, 33,123,238,244,121, 3,196, + 69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225, + 238,231,250,232,239,117,128, 83, 68,112, 2,196, 95,196,102,225, + 242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142, + 0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39, + 197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242, + 225,226,233, 99,128, 6, 98,226,229,238,231,225,236,105,128, 9, + 232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229, + 242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100, + 2,196,197,196,203,229,246, 97,128, 9,104,239,116, 2,196,210, + 196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225, + 228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108, + 128,254, 48,231,117, 2,196,250,197, 3,234,225,242,225,244,105, + 128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97, 2,197, + 19,197, 30,227,235,225,242,225,226,233, 99,128, 6, 98,238,231, + 250,232,239,117,128, 48, 34,105, 2,197, 45,197, 63,228,229,239, + 231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238, + 230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225, + 227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229, + 238,231,225,236,105,128, 9,245,239,236,228,243,244,249,236,101, + 128,247, 50,112, 2,197,121,197,128,225,242,229,110,128, 36,117, + 229,114, 2,197,135,197,141,233,239,100,128, 36,137,243,233,225, + 110,128, 6,242,242,239,237,225,110,128, 33,113,115, 2,197,162, + 197,170,244,242,239,235,101,128, 1,187,245,240,229,242,233,239, + 114,128, 0,178,244,104, 2,197,187,197,192,225,105,128, 14, 82, + 233,242,228,115,128, 33, 84,117,145, 0,117,197,237,197,245,198, + 30,198, 87,198,225,199, 6,199,129,199,145,199,196,200, 10,200, + 91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245, + 244,101,128, 0,250, 98, 4,197,255,198, 4,198, 13,198, 23,225, + 114,128, 2,137,229,238,231,225,236,105,128, 9,137,239,240,239, + 237,239,230,111,128, 49, 40,242,229,246,101,128, 1,109, 99, 3, + 198, 38,198, 45,198, 77,225,242,239,110,128, 1,212,233,242, 99, + 2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120, + 129, 0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233, + 236,236,233, 99,128, 4, 67,100, 5,198, 99,198,110,198,133,198, + 139,198,215,225,244,244,225,228,229,246, 97,128, 9, 81,226,108, + 2,198,117,198,125,225,227,245,244,101,128, 1,113,231,242,225, + 246,101,128, 2, 21,229,246, 97,128, 9, 9,233,229,242,229,243, + 233,115,133, 0,252,198,159,198,167,198,175,198,198,198,206,225, + 227,245,244,101,128, 1,216,226,229,236,239,119,128, 30,115, 99, + 2,198,181,198,188,225,242,239,110,128, 1,218,249,242,233,236, + 236,233, 99,128, 4,241,231,242,225,246,101,128, 1,220,237,225, + 227,242,239,110,128, 1,214,239,244,226,229,236,239,119,128, 30, + 229,103, 2,198,231,198,238,242,225,246,101,128, 0,249,117, 2, + 198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245, + 235,232,105,128, 10, 9,104, 3,199, 14,199, 24,199,102,233,242, + 225,231,225,238, 97,128, 48, 70,111, 2,199, 30,199, 40,239,235, + 225,226,239,246,101,128, 30,231,242,110,133, 1,176,199, 55,199, + 63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228, + 239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128, + 30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233, + 236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245, + 116,129, 1,113,199,118,227,249,242,233,236,236,233, 99,128, 4, + 243,233,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, + 23,107, 3,199,153,199,177,199,188,225,244,225,235,225,238, 97, + 129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255, + 115,227,249,242,233,236,236,233, 99,128, 4,121,239,242,229,225, + 110,128, 49, 92,109, 2,199,202,199,255, 97, 2,199,208,199,241, + 227,242,239,110,130, 1,107,199,219,199,230,227,249,242,233,236, + 236,233, 99,128, 4,239,228,233,229,242,229,243,233,115,128, 30, + 123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239, + 238,239,243,240,225,227,101,128,255, 85,110, 2,200, 16,200, 71, + 228,229,242,243,227,239,242,101,132, 0, 95,200, 35,200, 41,200, + 53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225, + 227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51, + 247,225,246,121,128,254, 79,105, 2,200, 77,200, 82,239,110,128, + 34, 42,246,229,242,243,225,108,128, 34, 0,239,231,239,238,229, + 107,128, 1,115,112, 5,200,112,200,119,200,127,200,142,200,193, + 225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240, + 229,242,228,239,244,232,229,226,242,229,119,128, 5,196,243,233, + 236,239,110,131, 3,197,200,156,200,177,200,185,228,233,229,242, + 229,243,233,115,129, 3,203,200,169,244,239,238,239,115,128, 3, + 176,236,225,244,233,110,128, 2,138,244,239,238,239,115,128, 3, + 205,244,225,227,107, 2,200,202,200,213,226,229,236,239,247,227, + 237, 98,128, 3, 29,237,239,100,128, 2,212,114, 2,200,225,200, + 237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103, + 128, 1,111,115, 3,200,251,201, 10,201, 55,232,239,242,244,227, + 249,242,233,236,236,233, 99,128, 4, 94,237,225,236,108, 2,201, + 19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225, + 244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247, + 233,228,244,104,128,255,105,244,242,225,233,231,232,116, 2,201, + 67,201, 78,227,249,242,233,236,236,233, 99,128, 4,175,243,244, + 242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,177,244, + 233,236,228,101,130, 1,105,201,107,201,115,225,227,245,244,101, + 128, 30,121,226,229,236,239,119,128, 30,117,117, 5,201,135,201, + 145,201,152,201,177,201,193,226,229,238,231,225,236,105,128, 9, + 138,228,229,246, 97,128, 9, 10,231,117, 2,201,159,201,168,234, + 225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10, + 10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10, + 66,246,239,247,229,236,243,233,231,110, 3,201,209,201,219,201, + 226,226,229,238,231,225,236,105,128, 9,194,228,229,246, 97,128, + 9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247, + 229,236,243,233,231,110, 3,201,253,202, 7,202, 14,226,229,238, + 231,225,236,105,128, 9,193,228,229,246, 97,128, 9, 65,231,245, + 234,225,242,225,244,105,128, 10,193,118,139, 0,118,202, 51,202, + 199,202,208,202,219,203,148,203,155,203,253,204, 9,204,109,204, + 117,204,138, 97, 4,202, 61,202, 68,202, 93,202,104,228,229,246, + 97,128, 9, 53,231,117, 2,202, 75,202, 84,234,225,242,225,244, + 105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244, + 225,235,225,238, 97,128, 48,247,118,132, 5,213,202,116,202,143, + 202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202, + 134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104, + 2,202,149,202,157,229,226,242,229,119,128, 5,213,239,236,225, + 109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246, + 225,246,232,229,226,242,229,119,128, 5,240,249,239,228,232,229, + 226,242,229,119,128, 5,241,227,233,242,227,236,101,128, 36,229, + 228,239,244,226,229,236,239,119,128, 30,127,101, 6,202,233,202, + 244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233, + 99,128, 4, 50,104, 4,202,254,203, 7,203, 21,203, 37,225,242, + 225,226,233, 99,128, 6,164,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233, + 99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238, + 245,115,128, 38, 64,242,244,233,227,225,108, 2,203, 80,203, 86, + 226,225,114,128, 0,124,236,233,238,101, 4,203, 99,203,110,203, + 121,203,130,225,226,239,246,229,227,237, 98,128, 3, 13,226,229, + 236,239,247,227,237, 98,128, 3, 41,236,239,247,237,239,100,128, + 2,204,237,239,100,128, 2,200,247,225,242,237,229,238,233,225, + 110,128, 5,126,232,239,239,107,128, 2,139,105, 3,203,163,203, + 174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225, + 237, 97, 3,203,185,203,195,203,202,226,229,238,231,225,236,105, + 128, 9,205,228,229,246, 97,128, 9, 77,231,245,234,225,242,225, + 244,105,128, 10,205,243,225,242,231, 97, 3,203,225,203,235,203, + 242,226,229,238,231,225,236,105,128, 9,131,228,229,246, 97,128, + 9, 3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238, + 239,243,240,225,227,101,128,255, 86,111, 3,204, 17,204, 28,204, + 98,225,242,237,229,238,233,225,110,128, 5,120,233,227,229,100, + 2,204, 37,204, 73,233,244,229,242,225,244,233,239,110, 2,204, + 51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225, + 244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238, + 97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128, + 255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242, + 229,110,128, 36,177,116, 2,204,123,204,130,233,236,228,101,128, + 30,125,245,242,238,229,100,128, 2,140,117, 2,204,144,204,155, + 232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235, + 225,238, 97,128, 48,244,119,143, 0,119,204,200,205,177,205,187, + 205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168, + 208,176,208,183,208,194,208,203, 97, 8,204,218,204,225,204,235, + 204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30, + 131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231, + 225,238, 97,128, 48,143,107, 2,204,252,205, 20,225,244,225,235, + 225,238, 97,129, 48,239,205, 8,232,225,236,230,247,233,228,244, + 104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236, + 108, 2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48, + 142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243, + 241,245,225,242,101,128, 51, 87,118, 2,205, 78,205, 86,229,228, + 225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242, + 229,246,229,242,244,233,227,225,108,128,254, 52,119, 3,205,116, + 205,125,205,139,225,242,225,226,233, 99,128, 6, 72,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225, + 225,226,239,246,101, 2,205,154,205,163,225,242,225,226,233, 99, + 128, 6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99, 2, + 205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128, + 1,117,100, 2,205,216,205,226,233,229,242,229,243,233,115,128, + 30,133,239,116, 2,205,233,205,242,225,227,227,229,238,116,128, + 30,135,226,229,236,239,119,128, 30,137,101, 4,206, 4,206, 15, + 206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233, + 229,242,243,244,242,225,243,115,128, 33, 24,107, 2,206, 33,206, + 43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110, + 128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225, + 246,101,128, 30,129,232,233,244,101, 8,206, 90,206, 99,206,183, + 207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116, + 128, 37,230, 99, 2,206,105,206,125,233,242,227,236,101,129, 37, + 203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238, + 229,242,226,242,225,227,235,229,116, 2,206,142,206,162,236,229, + 230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128, + 254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244, + 233,227,225,108,128,254, 68,100, 2,206,189,206,230,233,225,237, + 239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233, + 238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237, + 239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238, + 103, 2,206,246,207, 6,243,237,225,236,236,244,242,233,225,238, + 231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37, + 189,236,101, 2,207, 24,207, 66,230,244,240,239,233,238,244,233, + 238,103, 2,207, 39,207, 55,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128, + 37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229, + 116, 2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231, + 232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233, + 238,103, 2,207,119,207,135,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128, + 37,183,115, 3,207,154,207,184,207,192,109, 2,207,160,207,172, + 225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238, + 231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161, + 244,225,114,128, 38, 6,116, 2,207,204,207,215,229,236,229,240, + 232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232, + 229,236,236,226,242,225,227,235,229,116, 2,207,239,207,246,236, + 229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240, + 240,239,233,238,244,233,238,103, 2,208, 13,208, 29,243,237,225, + 236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233, + 225,238,231,236,101,128, 37,179,105, 2,208, 46,208, 57,232,233, + 242,225,231,225,238, 97,128, 48,144,107, 2,208, 63,208, 73,225, + 244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49, + 95,237,239,238,239,243,240,225,227,101,128,255, 87,111, 4,208, + 103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128, + 48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232, + 225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208, + 145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229, + 238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178, + 242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128, + 2,183,244,245,242,238,229,100,128, 2,141,249,238,110,128, 1, + 191,120,137, 0,120,208,231,208,242,208,253,209, 6,209, 33,209, + 46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128, + 3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242, + 227,236,101,128, 36,231,100, 2,209, 12,209, 22,233,229,242,229, + 243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30, + 139,229,232,225,242,237,229,238,233,225,110,128, 5,109,105,128, + 3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225, + 242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128, 2, + 227,121,143, 0,121,209,115,210, 74,210, 97,210,137,212,103,212, + 111,212,128,212,192,212,204,213,201,213,241,213,253,214, 8,214, + 29,215, 2, 97, 11,209,139,209,151,209,161,209,168,209,175,209, + 185,209,210,209,221,210, 3,210, 16,210, 62,225,228,239,243,241, + 245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128, 9, + 175,227,245,244,101,128, 0,253,228,229,246, 97,128, 9, 47,229, + 235,239,242,229,225,110,128, 49, 82,231,117, 2,209,192,209,201, + 234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128, + 10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107, 2,209, + 227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232, + 225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110, + 128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78, + 243,237,225,236,108, 2,210, 26,210, 37,232,233,242,225,231,225, + 238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227, + 210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227, + 249,242,233,236,236,233, 99,128, 4, 99,227,233,242, 99, 2,210, + 83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128, 1, + 119,100, 2,210,103,210,113,233,229,242,229,243,233,115,128, 0, + 255,239,116, 2,210,120,210,129,225,227,227,229,238,116,128, 30, + 143,226,229,236,239,119,128, 30,245,101, 7,210,153,211,161,211, + 170,211,188,211,220,212, 40,212, 91,104, 8,210,171,210,180,210, + 214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233, + 99,128, 6, 74,226,225,242,242,229,101, 2,210,191,210,200,225, + 242,225,226,233, 99,128, 6,210,230,233,238,225,236,225,242,225, + 226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233, + 99,128,254,242,232,225,237,250,225,225,226,239,246,101, 4,210, + 247,211, 0,211, 14,211, 30,225,242,225,226,233, 99,128, 6, 38, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101, 2, + 211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254, + 244,229,237,105, 2,211, 89,211,104,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225, + 236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228, + 239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128, 6, + 209,235,239,242,229,225,110,128, 49, 86,110,129, 0,165,211,176, + 237,239,238,239,243,240,225,227,101,128,255,229,111, 2,211,194, + 211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233, + 229,245,232,235,239,242,229,225,110,128, 49,134,114, 3,211,228, + 212, 8,212, 20,225,232,226,229,238,249,239,237,111, 2,211,242, + 211,251,232,229,226,242,229,119,128, 5,170,236,229,230,244,232, + 229,226,242,229,119,128, 5,170,233,227,249,242,233,236,236,233, + 99,128, 4, 75,245,228,233,229,242,229,243,233,243,227,249,242, + 233,236,236,233, 99,128, 4,249,243,233,229,245,238,103, 3,212, + 53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225, + 238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233, + 239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229, + 226,242,229,119,128, 5,154,231,242,225,246,101,128, 30,243,232, + 239,239,107,129, 1,180,212,120,225,226,239,246,101,128, 30,247, + 105, 5,212,140,212,151,212,162,212,171,212,179,225,242,237,229, + 238,233,225,110,128, 5,117,227,249,242,233,236,236,233, 99,128, + 4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103, + 128, 38, 47,247,238,225,242,237,229,238,233,225,110,128, 5,130, + 237,239,238,239,243,240,225,227,101,128,255, 89,111, 7,212,220, + 213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131, 5,217, + 212,230,212,250,213, 3,228,225,231,229,243,104,129,251, 57,212, + 241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119, + 128, 5,217,249,239,100, 2,213, 11,213, 20,232,229,226,242,229, + 119,128, 5,242,240,225,244,225,232,232,229,226,242,229,119,128, + 251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239, + 242,229,225,110,128, 49,137,107, 2,213, 61,213, 85,225,244,225, + 235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228, + 244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225, + 236,108, 2,213,103,213,114,232,233,242,225,231,225,238, 97,128, + 48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232, + 225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229, + 107,128, 3,243,121, 2,213,154,213,191, 97, 2,213,160,213,170, + 229,235,239,242,229,225,110,128, 49,136,107, 2,213,176,213,184, + 239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233, + 238,231,244,232,225,105,128, 14, 13,112, 2,213,207,213,214,225, + 242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238, + 105,129, 3,122,213,230,231,242,229,229,235,227,237, 98,128, 3, + 69,114,129, 1,166,213,247,233,238,103,128, 30,153,243,245,240, + 229,242,233,239,114,128, 2,184,116, 2,214, 14,214, 21,233,236, + 228,101,128, 30,249,245,242,238,229,100,128, 2,142,117, 5,214, + 41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238, + 97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107, 2, + 214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80, + 232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225, + 110,128, 49, 96,115, 3,214,108,214,146,214,187,226,233,103, 2, + 214,116,214,127,227,249,242,233,236,236,233, 99,128, 4,107,233, + 239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, + 4,109,236,233,244,244,236,101, 2,214,157,214,168,227,249,242, + 233,236,236,233, 99,128, 4,103,233,239,244,233,230,233,229,228, + 227,249,242,233,236,236,233, 99,128, 4,105,237,225,236,108, 2, + 214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235, + 225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230, + 247,233,228,244,104,128,255,109,249,101, 2,214,239,214,248,235, + 239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128, + 49,138,249, 97, 2,215, 9,215, 19,226,229,238,231,225,236,105, + 128, 9,223,228,229,246, 97,128, 9, 95,122,142, 0,122,215, 58, + 216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88, + 218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91, + 215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27, + 225,242,237,229,238,233,225,110,128, 5,102,227,245,244,101,128, + 1,122,228,229,246, 97,128, 9, 91,231,245,242,237,245,235,232, + 105,128, 10, 91,104, 4,215,126,215,135,215,149,215,179,225,242, + 225,226,233, 99,128, 6, 56,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,198,105, 2,215,155,215,170,238,233,244,233,225, + 236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97, + 128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,200,233,110, 2,215,201,215,210,225,242,225,226,233, 99,128, + 6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176, + 235,225,244,225,235,225,238, 97,128, 48,182,241,229,102, 2,215, + 243,216, 1,231,225,228,239,236,232,229,226,242,229,119,128, 5, + 149,241,225,244,225,238,232,229,226,242,229,119,128, 5,148,242, + 241,225,232,229,226,242,229,119,128, 5,152,249,233,110,130, 5, + 214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48, + 232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128, + 5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99, 3,216, + 85,216, 92,216,114,225,242,239,110,128, 1,126,233,242, 99, 2, + 216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128, + 30,145,245,242,108,128, 2,145,228,239,116,130, 1,124,216,130, + 216,139,225,227,227,229,238,116,128, 1,124,226,229,236,239,119, + 128, 30,147,101, 6,216,161,216,172,216,215,216,226,216,237,217, + 177,227,249,242,233,236,236,233, 99,128, 4, 55,100, 2,216,178, + 216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236, + 233, 99,128, 4,153,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,223,232,233,242,225,231,225,238, 97,128, + 48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140, + 0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85, + 217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99, + 128, 6, 96,226,229,238,231,225,236,105,128, 9,230,228,229,246, + 97,128, 9,102,231,117, 2,217, 43,217, 52,234,225,242,225,244, + 105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227, + 235,225,242,225,226,233, 99,128, 6, 96,233,238,230,229,242,233, + 239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255, + 16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243, + 233,225,110,128, 6,240,243,245,240,229,242,233,239,114,128, 32, + 112,244,232,225,105,128, 14, 80,247,233,228,244,104, 3,217,148, + 217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238, + 234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32, + 11,244, 97,128, 3,182,104, 2,217,188,217,199,226,239,240,239, + 237,239,230,111,128, 49, 19,101, 4,217,209,217,220,217,236,217, + 247,225,242,237,229,238,233,225,110,128, 5,106,226,242,229,246, + 229,227,249,242,233,236,236,233, 99,128, 4,194,227,249,242,233, + 236,236,233, 99,128, 4, 54,100, 2,217,253,218, 16,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,151, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,221,105, 3,218, 42,218, 53,218, 64,232,233,242,225,231,225, + 238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184, + 238,239,242,232,229,226,242,229,119,128, 5,174,236,233,238,229, + 226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227, + 101,128,255, 90,111, 2,218,106,218,117,232,233,242,225,231,225, + 238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190, + 240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229, + 248,232,239,239,107,128, 2,144,243,244,242,239,235,101,128, 1, + 182,117, 2,218,167,218,178,232,233,242,225,231,225,238, 97,128, + 48, 90,235,225,244,225,235,225,238, 97,128, 48,186 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + +#ifdef DEFINE_PS_TABLES + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } +#endif /* DEFINE_PS_TABLES */ + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + +/* END */ diff --git a/external/freetype/src/psnames/rules.mk b/external/freetype/src/psnames/rules.mk new file mode 100644 index 000000000..8d7c58068 --- /dev/null +++ b/external/freetype/src/psnames/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 psnames driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# psnames driver directory +# +PSNAMES_DIR := $(SRC_DIR)/psnames + + +# compilation flags for the driver +# +PSNAMES_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# psnames driver sources (i.e., C files) +# +PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c + + +# psnames driver headers +# +PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \ + $(PSNAMES_DIR)/psnamerr.h \ + $(PSNAMES_DIR)/pstables.h + + +# psnames driver object(s) +# +# PSNAMES_DRV_OBJ_M is used during `multi' builds +# PSNAMES_DRV_OBJ_S is used during `single' builds +# +PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O + +# psnames driver source file for single build +# +PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psnames.c + + +# psnames driver - single object +# +$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \ + $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S)) + + +# psnames driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S) +DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/raster/ftmisc.h b/external/freetype/src/raster/ftmisc.h new file mode 100644 index 000000000..33dbfd631 --- /dev/null +++ b/external/freetype/src/raster/ftmisc.h @@ -0,0 +1,139 @@ +/**************************************************************************** + * + * ftmisc.h + * + * Miscellaneous macros for stand-alone rasterizer (specification + * only). + * + * Copyright (C) 2005-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used + * modified and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /**************************************************** + * + * This file is *not* portable! You have to adapt + * its definitions to your platform. + * + */ + +#ifndef FTMISC_H_ +#define FTMISC_H_ + + + /* memset */ +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#define FT_LOCAL_DEF( x ) static x + + + /* from include/freetype/fttypes.h */ + + typedef unsigned char FT_Byte; + typedef signed int FT_Int; + typedef unsigned int FT_UInt; + typedef signed long FT_Long; + typedef unsigned long FT_ULong; + typedef signed long FT_F26Dot6; + typedef int FT_Error; + + +#define FT_STATIC_BYTE_CAST( type, var ) (type)(FT_Byte)(var) + + + /* from include/freetype/ftsystem.h */ + + typedef struct FT_MemoryRec_* FT_Memory; + + typedef void* (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + typedef void (*FT_Free_Func)( FT_Memory memory, + void* block ); + + typedef void* (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + typedef struct FT_MemoryRec_ + { + void* user; + + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemoryRec; + + + /* from src/ftcalc.c */ + +#if ( defined _WIN32 || defined _WIN64 ) + + typedef __int64 FT_Int64; + +#else + +#include "inttypes.h" + + typedef int64_t FT_Int64; + +#endif + + + static FT_Long + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + + + static FT_Long + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* FTMISC_H_ */ + + +/* END */ diff --git a/external/freetype/src/raster/ftraster.c b/external/freetype/src/raster/ftraster.c new file mode 100644 index 000000000..192ca0701 --- /dev/null +++ b/external/freetype/src/raster/ftraster.c @@ -0,0 +1,3294 @@ +/**************************************************************************** + * + * ftraster.c + * + * The FreeType glyph rasterizer (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * This file can be compiled without the rest of the FreeType engine, by + * defining the STANDALONE_ macro when compiling it. You also need to + * put the files `ftimage.h' and `ftmisc.h' into the $(incdir) + * directory. Typically, you should do something like + * + * - copy `src/raster/ftraster.c' (this file) to your current directory + * + * - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' to your + * current directory + * + * - compile `ftraster' with the STANDALONE_ macro defined, as in + * + * cc -c -DSTANDALONE_ ftraster.c + * + * The renderer can be initialized with a call to + * `ft_standard_raster.raster_new'; a bitmap can be generated + * with a call to `ft_standard_raster.raster_render'. + * + * See the comments and documentation in the file `ftimage.h' for more + * details on how the raster works. + * + */ + + + /************************************************************************** + * + * This is a rewrite of the FreeType 1.x scan-line converter + * + */ + +#ifdef STANDALONE_ + + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ +#define FT_RENDER_POOL_SIZE 16384L + +#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h> + +#include <string.h> /* for memset */ + +#include "ftmisc.h" +#include "ftimage.h" + +#else /* !STANDALONE_ */ + +#include "ftraster.h" +#include <freetype/internal/ftcalc.h> /* for FT_MulDiv and FT_MulDiv_No_Round */ +#include <freetype/ftoutln.h> /* for FT_Outline_Get_CBox */ + +#endif /* !STANDALONE_ */ + + + /************************************************************************** + * + * A simple technical note on how the raster works + * ----------------------------------------------- + * + * Converting an outline into a bitmap is achieved in several steps: + * + * 1 - Decomposing the outline into successive `profiles'. Each + * profile is simply an array of scanline intersections on a given + * dimension. A profile's main attributes are + * + * o its scanline position boundaries, i.e. `Ymin' and `Ymax' + * + * o an array of intersection coordinates for each scanline + * between `Ymin' and `Ymax' + * + * o a direction, indicating whether it was built going `up' or + * `down', as this is very important for filling rules + * + * o its drop-out mode + * + * 2 - Sweeping the target map's scanlines in order to compute segment + * `spans' which are then filled. Additionally, this pass + * performs drop-out control. + * + * The outline data is parsed during step 1 only. The profiles are + * built from the bottom of the render pool, used as a stack. The + * following graphics shows the profile list under construction: + * + * __________________________________________________________ _ _ + * | | | | | + * | profile | coordinates for | profile | coordinates for |--> + * | 1 | profile 1 | 2 | profile 2 |--> + * |_________|_________________|_________|_________________|__ _ _ + * + * ^ ^ + * | | + * start of render pool top + * + * The top of the profile stack is kept in the `top' variable. + * + * As you can see, a profile record is pushed on top of the render + * pool, which is then followed by its coordinates/intersections. If + * a change of direction is detected in the outline, a new profile is + * generated until the end of the outline. + * + * Note that when all profiles have been generated, the function + * Finalize_Profile_Table() is used to record, for each profile, its + * bottom-most scanline as well as the scanline above its upmost + * boundary. These positions are called `y-turns' because they (sort + * of) correspond to local extrema. They are stored in a sorted list + * built from the top of the render pool as a downwards stack: + * + * _ _ _______________________________________ + * | | + * <--| sorted list of | + * <--| extrema scanlines | + * _ _ __________________|____________________| + * + * ^ ^ + * | | + * maxBuff sizeBuff = end of pool + * + * This list is later used during the sweep phase in order to + * optimize performance (see technical note on the sweep below). + * + * Of course, the raster detects whether the two stacks collide and + * handles the situation properly. + * + */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** CONFIGURATION MACROS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** OTHER MACROS (do not change) **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT raster + + +#ifdef STANDALONE_ + + /* Auxiliary macros for token concatenation. */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + /* Disable the tracing mechanism for simplicity -- developers can */ + /* activate it easily by redefining these macros. */ +#ifndef FT_ERROR +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_TRACE +#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_THROW +#define FT_THROW( e ) FT_ERR_CAT( Raster_Err_, e ) +#endif + +#define Raster_Err_Ok 0 +#define Raster_Err_Invalid_Outline -1 +#define Raster_Err_Cannot_Render_Glyph -2 +#define Raster_Err_Invalid_Argument -3 +#define Raster_Err_Raster_Overflow -4 +#define Raster_Err_Raster_Uninitialized -5 +#define Raster_Err_Raster_Negative_Height -6 + +#define ft_memset memset + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, \ + raster_render_, raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + +#else /* !STANDALONE_ */ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> /* for FT_TRACE, FT_ERROR, and FT_THROW */ + +#include "rasterrs.h" + + +#endif /* !STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + + /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ + /* typically a small value and the result of a*b is known to fit into */ + /* 32 bits. */ +#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) + + /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ + /* for clipping computations. It simply uses the FT_MulDiv() function */ + /* defined in `ftcalc.h'. */ +#define SMulDiv FT_MulDiv +#define SMulDiv_No_Round FT_MulDiv_No_Round + + /* The rasterizer is a very general purpose component; please leave */ + /* the following redefinitions there (you never know your target */ + /* environment). */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + +#ifndef SUCCESS +#define SUCCESS 0 +#endif + +#ifndef FAILURE +#define FAILURE 1 +#endif + + +#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ + /* Setting this constant to more than 32 is a */ + /* pure waste of space. */ + +#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SIMPLE TYPE DECLARATIONS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + typedef int Int; + typedef unsigned int UInt; + typedef short Short; + typedef unsigned short UShort, *PUShort; + typedef long Long, *PLong; + typedef unsigned long ULong; + + typedef unsigned char Byte, *PByte; + typedef char Bool; + + + typedef union Alignment_ + { + Long l; + void* p; + void (*f)(void); + + } Alignment, *PAlignment; + + + typedef struct TPoint_ + { + Long x; + Long y; + + } TPoint; + + + /* values for the `flags' bit field */ +#define Flow_Up 0x08U +#define Overshoot_Top 0x10U +#define Overshoot_Bottom 0x20U + + + /* States of each line, arc, and profile */ + typedef enum TStates_ + { + Unknown_State, + Ascending_State, + Descending_State, + Flat_State + + } TStates; + + + typedef struct TProfile_ TProfile; + typedef TProfile* PProfile; + + struct TProfile_ + { + FT_F26Dot6 X; /* current coordinate during sweep */ + PProfile link; /* link to next profile (various purposes) */ + PLong offset; /* start of profile's data in render pool */ + UShort flags; /* Bit 0-2: drop-out mode */ + /* Bit 3: profile orientation (up/down) */ + /* Bit 4: is top profile? */ + /* Bit 5: is bottom profile? */ + Long height; /* profile's height in scanlines */ + Long start; /* profile's starting scanline */ + + Int countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + typedef PProfile TProfileList; + typedef PProfile* PProfileList; + + +#define AlignProfileSize \ + ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( Long ) ) + + +#undef RAS_ARG +#undef RAS_ARGS +#undef RAS_VAR +#undef RAS_VARS + +#ifdef FT_STATIC_RASTER + + +#define RAS_ARGS /* void */ +#define RAS_ARG void + +#define RAS_VARS /* void */ +#define RAS_VAR /* void */ + +#define FT_UNUSED_RASTER do { } while ( 0 ) + + +#else /* !FT_STATIC_RASTER */ + + +#define RAS_ARGS black_PWorker worker, +#define RAS_ARG black_PWorker worker + +#define RAS_VARS worker, +#define RAS_VAR worker + +#define FT_UNUSED_RASTER FT_UNUSED( worker ) + + +#endif /* !FT_STATIC_RASTER */ + + + typedef struct black_TWorker_ black_TWorker, *black_PWorker; + + + /* prototypes used for sweep function dispatch */ + typedef void + Function_Sweep_Init( RAS_ARGS Short min, + Short max ); + + typedef void + Function_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ); + + typedef void + Function_Sweep_Step( RAS_ARG ); + + + /* NOTE: These operations are only valid on 2's complement processors */ +#undef FLOOR +#undef CEILING +#undef TRUNC +#undef SCALED + +#define FLOOR( x ) ( (x) & -ras.precision ) +#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) +#define TRUNC( x ) ( (Long)(x) >> ras.precision_bits ) +#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) + + /* scale and shift grid to pixel centers */ +#define SCALED( x ) ( (x) * ras.precision_scale - ras.precision_half ) + +#define IS_BOTTOM_OVERSHOOT( x ) \ + (Bool)( CEILING( x ) - x >= ras.precision_half ) +#define IS_TOP_OVERSHOOT( x ) \ + (Bool)( x - FLOOR( x ) >= ras.precision_half ) + + /* Smart dropout rounding to find which pixel is closer to span ends. */ + /* To mimick Windows, symmetric cases break down indepenently of the */ + /* precision. */ +#define SMART( p, q ) FLOOR( ( (p) + (q) + ras.precision * 63 / 64 ) >> 1 ) + +#if FT_RENDER_POOL_SIZE > 2048 +#define FT_MAX_BLACK_POOL ( FT_RENDER_POOL_SIZE / sizeof ( Long ) ) +#else +#define FT_MAX_BLACK_POOL ( 2048 / sizeof ( Long ) ) +#endif + + /* The most used variables are positioned at the top of the structure. */ + /* Thus, their offset can be coded with less opcodes, resulting in a */ + /* smaller executable. */ + + struct black_TWorker_ + { + Int precision_bits; /* precision related variables */ + Int precision; + Int precision_half; + Int precision_scale; + Int precision_step; + Int precision_jitter; + + PLong buff; /* The profiles buffer */ + PLong sizeBuff; /* Render pool size */ + PLong maxBuff; /* Profiles buffer size */ + PLong top; /* Current cursor in buffer */ + + FT_Error error; + + Int numTurns; /* number of Y-turns in outline */ + + Byte dropOutControl; /* current drop_out control method */ + + UShort bWidth; /* target bitmap width */ + PByte bOrigin; /* target bitmap bottom-left origin */ + PByte bLine; /* target bitmap current line */ + + Long lastX, lastY; + Long minY, maxY; + + UShort num_Profs; /* current number of profiles */ + + Bool fresh; /* signals a fresh new profile which */ + /* `start' field must be completed */ + Bool joint; /* signals that the last arc ended */ + /* exactly on a scanline. Allows */ + /* removal of doublets */ + PProfile cProfile; /* current profile */ + PProfile fProfile; /* head of linked list of profiles */ + PProfile gProfile; /* contour's first profile in case */ + /* of impact */ + + TStates state; /* rendering state */ + + FT_Bitmap target; /* description of target bit/pixmap */ + FT_Outline outline; + + /* dispatch variables */ + + Function_Sweep_Init* Proc_Sweep_Init; + Function_Sweep_Span* Proc_Sweep_Span; + Function_Sweep_Span* Proc_Sweep_Drop; + Function_Sweep_Step* Proc_Sweep_Step; + + }; + + + typedef struct black_TRaster_ + { + void* memory; + + } black_TRaster, *black_PRaster; + +#ifdef FT_STATIC_RASTER + + static black_TWorker ras; + +#else /* !FT_STATIC_RASTER */ + +#define ras (*worker) + +#endif /* !FT_STATIC_RASTER */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @Function: + * Set_High_Precision + * + * @Description: + * Set precision variables according to param flag. + * + * @Input: + * High :: + * Set to True for high precision (typically for ppem < 24), + * false otherwise. + */ + static void + Set_High_Precision( RAS_ARGS Int High ) + { + /* + * `precision_step' is used in `Bezier_Up' to decide when to split a + * given y-monotonous Bezier arc that crosses a scanline before + * approximating it as a straight segment. The default value of 32 (for + * low accuracy) corresponds to + * + * 32 / 64 == 0.5 pixels, + * + * while for the high accuracy case we have + * + * 256 / (1 << 12) = 0.0625 pixels. + * + * `precision_jitter' is an epsilon threshold used in + * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier + * decomposition (after all, we are working with approximations only); + * it avoids switching on additional pixels which would cause artifacts + * otherwise. + * + * The value of `precision_jitter' has been determined heuristically. + * + */ + + if ( High ) + { + ras.precision_bits = 12; + ras.precision_step = 256; + ras.precision_jitter = 30; + } + else + { + ras.precision_bits = 6; + ras.precision_step = 32; + ras.precision_jitter = 2; + } + + FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); + + ras.precision = 1 << ras.precision_bits; + ras.precision_half = ras.precision >> 1; + ras.precision_scale = ras.precision >> Pixel_Bits; + } + + + /************************************************************************** + * + * @Function: + * New_Profile + * + * @Description: + * Create a new profile in the render pool. + * + * @Input: + * aState :: + * The state/orientation of the new profile. + * + * overshoot :: + * Whether the profile's unrounded start position + * differs by at least a half pixel. + * + * @Return: + * SUCCESS on success. FAILURE in case of overflow or of incoherent + * profile. + */ + static Bool + New_Profile( RAS_ARGS TStates aState, + Bool overshoot ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = FT_THROW( Raster_Overflow ); + return FAILURE; + } + + ras.cProfile->start = 0; + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + ras.cProfile->link = (PProfile)0; + ras.cProfile->next = (PProfile)0; + ras.cProfile->flags = ras.dropOutControl; + + switch ( aState ) + { + case Ascending_State: + ras.cProfile->flags |= Flow_Up; + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Bottom; + + FT_TRACE6(( " new ascending profile = %p\n", (void *)ras.cProfile )); + break; + + case Descending_State: + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Top; + FT_TRACE6(( " new descending profile = %p\n", (void *)ras.cProfile )); + break; + + default: + FT_ERROR(( "New_Profile: invalid profile direction\n" )); + ras.error = FT_THROW( Invalid_Outline ); + return FAILURE; + } + + if ( !ras.gProfile ) + ras.gProfile = ras.cProfile; + + ras.state = aState; + ras.fresh = TRUE; + ras.joint = FALSE; + + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * End_Profile + * + * @Description: + * Finalize the current profile. + * + * @Input: + * overshoot :: + * Whether the profile's unrounded end position differs + * by at least a half pixel. + * + * @Return: + * SUCCESS on success. FAILURE in case of overflow or incoherency. + */ + static Bool + End_Profile( RAS_ARGS Bool overshoot ) + { + Long h; + + + h = (Long)( ras.top - ras.cProfile->offset ); + + if ( h < 0 ) + { + FT_ERROR(( "End_Profile: negative height encountered\n" )); + ras.error = FT_THROW( Raster_Negative_Height ); + return FAILURE; + } + + if ( h > 0 ) + { + PProfile oldProfile; + + + FT_TRACE6(( " ending profile %p, start = %ld, height = %ld\n", + (void *)ras.cProfile, ras.cProfile->start, h )); + + ras.cProfile->height = h; + if ( overshoot ) + { + if ( ras.cProfile->flags & Flow_Up ) + ras.cProfile->flags |= Overshoot_Top; + else + ras.cProfile->flags |= Overshoot_Bottom; + } + + oldProfile = ras.cProfile; + ras.cProfile = (PProfile)ras.top; + + ras.top += AlignProfileSize; + + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + + oldProfile->next = ras.cProfile; + ras.num_Profs++; + } + + if ( ras.top >= ras.maxBuff ) + { + FT_TRACE1(( "overflow in End_Profile\n" )); + ras.error = FT_THROW( Raster_Overflow ); + return FAILURE; + } + + ras.joint = FALSE; + + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * Insert_Y_Turn + * + * @Description: + * Insert a salient into the sorted list placed on top of the render + * pool. + * + * @Input: + * New y scanline position. + * + * @Return: + * SUCCESS on success. FAILURE in case of overflow. + */ + static Bool + Insert_Y_Turn( RAS_ARGS Int y ) + { + PLong y_turns; + Int n; + + + n = ras.numTurns - 1; + y_turns = ras.sizeBuff - ras.numTurns; + + /* look for first y value that is <= */ + while ( n >= 0 && y < y_turns[n] ) + n--; + + /* if it is <, simply insert it, ignore if == */ + if ( n >= 0 && y > y_turns[n] ) + do + { + Int y2 = (Int)y_turns[n]; + + + y_turns[n] = y; + y = y2; + } while ( --n >= 0 ); + + if ( n < 0 ) + { + ras.maxBuff--; + if ( ras.maxBuff <= ras.top ) + { + ras.error = FT_THROW( Raster_Overflow ); + return FAILURE; + } + ras.numTurns++; + ras.sizeBuff[-ras.numTurns] = y; + } + + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * Finalize_Profile_Table + * + * @Description: + * Adjust all links in the profiles list. + * + * @Return: + * SUCCESS on success. FAILURE in case of overflow. + */ + static Bool + Finalize_Profile_Table( RAS_ARG ) + { + UShort n; + PProfile p; + + + n = ras.num_Profs; + p = ras.fProfile; + + if ( n > 1 && p ) + { + do + { + Int bottom, top; + + + if ( n > 1 ) + p->link = (PProfile)( p->offset + p->height ); + else + p->link = NULL; + + if ( p->flags & Flow_Up ) + { + bottom = (Int)p->start; + top = (Int)( p->start + p->height - 1 ); + } + else + { + bottom = (Int)( p->start - p->height + 1 ); + top = (Int)p->start; + p->start = bottom; + p->offset += p->height - 1; + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + } while ( --n ); + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * Split_Conic + * + * @Description: + * Subdivide one conic Bezier into two joint sub-arcs in the Bezier + * stack. + * + * @Input: + * None (subdivided Bezier is taken from the top of the stack). + * + * @Note: + * This routine is the `beef' of this component. It is _the_ inner + * loop that should be optimized to hell to get the best performance. + */ + static void + Split_Conic( TPoint* base ) + { + Long a, b; + + + base[4].x = base[2].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = ( a + b ) >> 2; + base[1].x = a >> 1; + + base[4].y = base[2].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = ( a + b ) >> 2; + base[1].y = a >> 1; + + /* hand optimized. gcc doesn't seem to be too good at common */ + /* expression substitution and instruction scheduling ;-) */ + } + + + /************************************************************************** + * + * @Function: + * Split_Cubic + * + * @Description: + * Subdivide a third-order Bezier arc into two joint sub-arcs in the + * Bezier stack. + * + * @Note: + * This routine is the `beef' of the component. It is one of _the_ + * inner loops that should be optimized like hell to get the best + * performance. + */ + static void + Split_Cubic( TPoint* base ) + { + Long a, b, c; + + + base[6].x = base[3].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = ( a + c ) >> 3; + + base[6].y = base[3].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = ( a + c ) >> 3; + } + + + /************************************************************************** + * + * @Function: + * Line_Up + * + * @Description: + * Compute the x-coordinates of an ascending line segment and store + * them in the render pool. + * + * @Input: + * x1 :: + * The x-coordinate of the segment's start point. + * + * y1 :: + * The y-coordinate of the segment's start point. + * + * x2 :: + * The x-coordinate of the segment's end point. + * + * y2 :: + * The y-coordinate of the segment's end point. + * + * miny :: + * A lower vertical clipping bound value. + * + * maxy :: + * An upper vertical clipping bound value. + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow. + */ + static Bool + Line_Up( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Long Dx, Dy; + Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ + Long Ix, Rx, Ax; + + PLong top; + + + Dx = x2 - x1; + Dy = y2 - y1; + + if ( Dy <= 0 || y2 < miny || y1 > maxy ) + return SUCCESS; + + if ( y1 < miny ) + { + /* Take care: miny-y1 can be a very large value; we use */ + /* a slow MulDiv function to avoid clipping bugs */ + x1 += SMulDiv( Dx, miny - y1, Dy ); + e1 = (Int)TRUNC( miny ); + f1 = 0; + } + else + { + e1 = (Int)TRUNC( y1 ); + f1 = (Int)FRAC( y1 ); + } + + if ( y2 > maxy ) + { + /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ + e2 = (Int)TRUNC( maxy ); + f2 = 0; + } + else + { + e2 = (Int)TRUNC( y2 ); + f2 = (Int)FRAC( y2 ); + } + + if ( f1 > 0 ) + { + if ( e1 == e2 ) + return SUCCESS; + else + { + x1 += SMulDiv( Dx, ras.precision - f1, Dy ); + e1 += 1; + } + } + else + if ( ras.joint ) + { + ras.top--; + ras.joint = FALSE; + } + + ras.joint = (char)( f2 == 0 ); + + if ( ras.fresh ) + { + ras.cProfile->start = e1; + ras.fresh = FALSE; + } + + size = e2 - e1 + 1; + if ( ras.top + size >= ras.maxBuff ) + { + ras.error = FT_THROW( Raster_Overflow ); + return FAILURE; + } + + if ( Dx > 0 ) + { + Ix = SMulDiv_No_Round( ras.precision, Dx, Dy ); + Rx = ( ras.precision * Dx ) % Dy; + Dx = 1; + } + else + { + Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy ); + Rx = ( ras.precision * -Dx ) % Dy; + Dx = -1; + } + + Ax = -Dy; + top = ras.top; + + while ( size > 0 ) + { + *top++ = x1; + + x1 += Ix; + Ax += Rx; + if ( Ax >= 0 ) + { + Ax -= Dy; + x1 += Dx; + } + size--; + } + + ras.top = top; + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * Line_Down + * + * @Description: + * Compute the x-coordinates of an descending line segment and store + * them in the render pool. + * + * @Input: + * x1 :: + * The x-coordinate of the segment's start point. + * + * y1 :: + * The y-coordinate of the segment's start point. + * + * x2 :: + * The x-coordinate of the segment's end point. + * + * y2 :: + * The y-coordinate of the segment's end point. + * + * miny :: + * A lower vertical clipping bound value. + * + * maxy :: + * An upper vertical clipping bound value. + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow. + */ + static Bool + Line_Down( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Bool result, fresh; + + + fresh = ras.fresh; + + result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + return result; + } + + + /* A function type describing the functions used to split Bezier arcs */ + typedef void (*TSplitter)( TPoint* base ); + + + /************************************************************************** + * + * @Function: + * Bezier_Up + * + * @Description: + * Compute the x-coordinates of an ascending Bezier arc and store + * them in the render pool. + * + * @Input: + * degree :: + * The degree of the Bezier arc (either 2 or 3). + * + * splitter :: + * The function to split Bezier arcs. + * + * miny :: + * A lower vertical clipping bound value. + * + * maxy :: + * An upper vertical clipping bound value. + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow. + */ + static Bool + Bezier_Up( RAS_ARGS Int degree, + TPoint* arc, + TSplitter splitter, + Long miny, + Long maxy ) + { + Long y1, y2, e, e2, e0; + Short f1; + + TPoint* start_arc; + + PLong top; + + + y1 = arc[degree].y; + y2 = arc[0].y; + top = ras.top; + + if ( y2 < miny || y1 > maxy ) + goto Fin; + + e2 = FLOOR( y2 ); + + if ( e2 > maxy ) + e2 = maxy; + + e0 = miny; + + if ( y1 < miny ) + e = miny; + else + { + e = CEILING( y1 ); + f1 = (Short)( FRAC( y1 ) ); + e0 = e; + + if ( f1 == 0 ) + { + if ( ras.joint ) + { + top--; + ras.joint = FALSE; + } + + *top++ = arc[degree].x; + + e += ras.precision; + } + } + + if ( ras.fresh ) + { + ras.cProfile->start = TRUNC( e0 ); + ras.fresh = FALSE; + } + + if ( e2 < e ) + goto Fin; + + if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) + { + ras.top = top; + ras.error = FT_THROW( Raster_Overflow ); + return FAILURE; + } + + start_arc = arc; + + do + { + ras.joint = FALSE; + + y2 = arc[0].y; + + if ( y2 > e ) + { + y1 = arc[degree].y; + if ( y2 - y1 >= ras.precision_step ) + { + splitter( arc ); + arc += degree; + } + else + { + *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x, + e - y1, y2 - y1 ); + arc -= degree; + e += ras.precision; + } + } + else + { + if ( y2 == e ) + { + ras.joint = TRUE; + *top++ = arc[0].x; + + e += ras.precision; + } + arc -= degree; + } + } while ( arc >= start_arc && e <= e2 ); + + Fin: + ras.top = top; + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * Bezier_Down + * + * @Description: + * Compute the x-coordinates of an descending Bezier arc and store + * them in the render pool. + * + * @Input: + * degree :: + * The degree of the Bezier arc (either 2 or 3). + * + * splitter :: + * The function to split Bezier arcs. + * + * miny :: + * A lower vertical clipping bound value. + * + * maxy :: + * An upper vertical clipping bound value. + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow. + */ + static Bool + Bezier_Down( RAS_ARGS Int degree, + TPoint* arc, + TSplitter splitter, + Long miny, + Long maxy ) + { + Bool result, fresh; + + + arc[0].y = -arc[0].y; + arc[1].y = -arc[1].y; + arc[2].y = -arc[2].y; + if ( degree > 2 ) + arc[3].y = -arc[3].y; + + fresh = ras.fresh; + + result = Bezier_Up( RAS_VARS degree, arc, splitter, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + arc[0].y = -arc[0].y; + return result; + } + + + /************************************************************************** + * + * @Function: + * Line_To + * + * @Description: + * Inject a new line segment and adjust the Profiles list. + * + * @Input: + * x :: + * The x-coordinate of the segment's end point (its start point + * is stored in `lastX'). + * + * y :: + * The y-coordinate of the segment's end point (its start point + * is stored in `lastY'). + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow or incorrect + * profile. + */ + static Bool + Line_To( RAS_ARGS Long x, + Long y ) + { + /* First, detect a change of direction */ + + switch ( ras.state ) + { + case Unknown_State: + if ( y > ras.lastY ) + { + if ( New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Ascending_State: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Descending_State: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + default: + ; + } + + /* Then compute the lines */ + + switch ( ras.state ) + { + case Ascending_State: + if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + case Descending_State: + if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + default: + ; + } + + ras.lastX = x; + ras.lastY = y; + + return SUCCESS; + } + + + /************************************************************************** + * + * @Function: + * Conic_To + * + * @Description: + * Inject a new conic arc and adjust the profile list. + * + * @Input: + * cx :: + * The x-coordinate of the arc's new control point. + * + * cy :: + * The y-coordinate of the arc's new control point. + * + * x :: + * The x-coordinate of the arc's end point (its start point is + * stored in `lastX'). + * + * y :: + * The y-coordinate of the arc's end point (its start point is + * stored in `lastY'). + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow or incorrect + * profile. + */ + static Bool + Conic_To( RAS_ARGS Long cx, + Long cy, + Long x, + Long y ) + { + Long y1, y2, y3, x3, ymin, ymax; + TStates state_bez; + TPoint arcs[2 * MaxBezier + 1]; /* The Bezier stack */ + TPoint* arc; /* current Bezier arc pointer */ + + + arc = arcs; + arc[2].x = ras.lastX; + arc[2].y = ras.lastY; + arc[1].x = cx; + arc[1].y = cy; + arc[0].x = x; + arc[0].y = y; + + do + { + y1 = arc[2].y; + y2 = arc[1].y; + y3 = arc[0].y; + x3 = arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y3 ) + { + ymin = y1; + ymax = y3; + } + else + { + ymin = y3; + ymax = y1; + } + + if ( y2 < ymin || y2 > ymax ) + { + /* this arc has no given direction, split it! */ + Split_Conic( arc ); + arc += 2; + } + else if ( y1 == y3 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + arc -= 2; + } + else + { + /* the arc is y-monotonous, either ascending or descending */ + /* detect a change of direction */ + state_bez = y1 < y3 ? Ascending_State : Descending_State; + if ( ras.state != state_bez ) + { + Bool o = ( state_bez == Ascending_State ) + ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + /* create a new profile */ + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* now call the appropriate routine */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 2, arc, Split_Conic, + ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 2, arc, Split_Conic, + ras.minY, ras.maxY ) ) + goto Fail; + arc -= 2; + } + + } while ( arc >= arcs ); + + ras.lastX = x3; + ras.lastY = y3; + + return SUCCESS; + + Fail: + return FAILURE; + } + + + /************************************************************************** + * + * @Function: + * Cubic_To + * + * @Description: + * Inject a new cubic arc and adjust the profile list. + * + * @Input: + * cx1 :: + * The x-coordinate of the arc's first new control point. + * + * cy1 :: + * The y-coordinate of the arc's first new control point. + * + * cx2 :: + * The x-coordinate of the arc's second new control point. + * + * cy2 :: + * The y-coordinate of the arc's second new control point. + * + * x :: + * The x-coordinate of the arc's end point (its start point is + * stored in `lastX'). + * + * y :: + * The y-coordinate of the arc's end point (its start point is + * stored in `lastY'). + * + * @Return: + * SUCCESS on success, FAILURE on render pool overflow or incorrect + * profile. + */ + static Bool + Cubic_To( RAS_ARGS Long cx1, + Long cy1, + Long cx2, + Long cy2, + Long x, + Long y ) + { + Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; + TStates state_bez; + TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ + TPoint* arc; /* current Bezier arc pointer */ + + + arc = arcs; + arc[3].x = ras.lastX; + arc[3].y = ras.lastY; + arc[2].x = cx1; + arc[2].y = cy1; + arc[1].x = cx2; + arc[1].y = cy2; + arc[0].x = x; + arc[0].y = y; + + do + { + y1 = arc[3].y; + y2 = arc[2].y; + y3 = arc[1].y; + y4 = arc[0].y; + x4 = arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y4 ) + { + ymin1 = y1; + ymax1 = y4; + } + else + { + ymin1 = y4; + ymax1 = y1; + } + + if ( y2 <= y3 ) + { + ymin2 = y2; + ymax2 = y3; + } + else + { + ymin2 = y3; + ymax2 = y2; + } + + if ( ymin2 < ymin1 || ymax2 > ymax1 ) + { + /* this arc has no given direction, split it! */ + Split_Cubic( arc ); + arc += 3; + } + else if ( y1 == y4 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + arc -= 3; + } + else + { + state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; + + /* detect a change of direction */ + if ( ras.state != state_bez ) + { + Bool o = ( state_bez == Ascending_State ) + ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* compute intersections */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 3, arc, Split_Cubic, + ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 3, arc, Split_Cubic, + ras.minY, ras.maxY ) ) + goto Fail; + arc -= 3; + } + + } while ( arc >= arcs ); + + ras.lastX = x4; + ras.lastY = y4; + + return SUCCESS; + + Fail: + return FAILURE; + } + + +#undef SWAP_ +#define SWAP_( x, y ) do \ + { \ + Long swap = x; \ + \ + \ + x = y; \ + y = swap; \ + } while ( 0 ) + + + /************************************************************************** + * + * @Function: + * Decompose_Curve + * + * @Description: + * Scan the outline arrays in order to emit individual segments and + * Beziers by calling Line_To() and Bezier_To(). It handles all + * weird cases, like when the first point is off the curve, or when + * there are simply no `on' points in the contour! + * + * @Input: + * first :: + * The index of the first point in the contour. + * + * last :: + * The index of the last point in the contour. + * + * flipped :: + * If set, flip the direction of the curve. + * + * @Return: + * SUCCESS on success, FAILURE on error. + */ + static Bool + Decompose_Curve( RAS_ARGS Int first, + Int last, + Int flipped ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* points; + FT_Vector* point; + FT_Vector* limit; + char* tags; + + UInt tag; /* current point's state */ + + + points = ras.outline.points; + limit = points + last; + + v_start.x = SCALED( points[first].x ); + v_start.y = SCALED( points[first].y ); + v_last.x = SCALED( points[last].x ); + v_last.y = SCALED( points[last].y ); + + if ( flipped ) + { + SWAP_( v_start.x, v_start.y ); + SWAP_( v_last.x, v_last.y ); + } + + v_control = v_start; + + point = points + first; + tags = ras.outline.tags + first; + + /* set scan mode if necessary */ + if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE ) + ras.dropOutControl = (Byte)tags[0] >> 5; + + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + /* v_last = v_start; */ + } + point--; + tags--; + } + + ras.lastX = v_start.x; + ras.lastY = v_start.y; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + Long x, y; + + + x = SCALED( point->x ); + y = SCALED( point->y ); + if ( flipped ) + SWAP_( x, y ); + + if ( Line_To( RAS_VARS x, y ) ) + goto Fail; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point[0].x ); + v_control.y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( v_control.x, v_control.y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector v_middle; + Long x, y; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + x = SCALED( point[0].x ); + y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x, y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) + goto Fail; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + x ) / 2; + v_middle.y = ( v_control.y + y ) / 2; + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_middle.x, v_middle.y ) ) + goto Fail; + + v_control.x = x; + v_control.y = y; + + goto Do_Conic; + } + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_start.x, v_start.y ) ) + goto Fail; + + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + Long x1, y1, x2, y2, x3, y3; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + x1 = SCALED( point[-2].x ); + y1 = SCALED( point[-2].y ); + x2 = SCALED( point[-1].x ); + y2 = SCALED( point[-1].y ); + + if ( flipped ) + { + SWAP_( x1, y1 ); + SWAP_( x2, y2 ); + } + + if ( point <= limit ) + { + x3 = SCALED( point[0].x ); + y3 = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x3, y3 ); + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) + goto Fail; + continue; + } + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) + goto Fail; + goto Close; + } + } + } + + /* close the contour with a line segment */ + if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) + goto Fail; + + Close: + return SUCCESS; + + Invalid_Outline: + ras.error = FT_THROW( Invalid_Outline ); + + Fail: + return FAILURE; + } + + + /************************************************************************** + * + * @Function: + * Convert_Glyph + * + * @Description: + * Convert a glyph into a series of segments and arcs and make a + * profiles list with them. + * + * @Input: + * flipped :: + * If set, flip the direction of curve. + * + * @Return: + * SUCCESS on success, FAILURE if any error was encountered during + * rendering. + */ + static Bool + Convert_Glyph( RAS_ARGS Int flipped ) + { + Int i; + Int first, last; + + + ras.fProfile = NULL; + ras.joint = FALSE; + ras.fresh = FALSE; + + ras.maxBuff = ras.sizeBuff - AlignProfileSize; + + ras.numTurns = 0; + + ras.cProfile = (PProfile)ras.top; + ras.cProfile->offset = ras.top; + ras.num_Profs = 0; + + last = -1; + for ( i = 0; i < ras.outline.n_contours; i++ ) + { + PProfile lastProfile; + Bool o; + + + ras.state = Unknown_State; + ras.gProfile = NULL; + + first = last + 1; + last = ras.outline.contours[i]; + + if ( Decompose_Curve( RAS_VARS first, last, flipped ) ) + return FAILURE; + + /* we must now check whether the extreme arcs join or not */ + if ( FRAC( ras.lastY ) == 0 && + ras.lastY >= ras.minY && + ras.lastY <= ras.maxY ) + if ( ras.gProfile && + ( ras.gProfile->flags & Flow_Up ) == + ( ras.cProfile->flags & Flow_Up ) ) + ras.top--; + /* Note that ras.gProfile can be nil if the contour was too small */ + /* to be drawn. */ + + lastProfile = ras.cProfile; + if ( ras.top != ras.cProfile->offset && + ( ras.cProfile->flags & Flow_Up ) ) + o = IS_TOP_OVERSHOOT( ras.lastY ); + else + o = IS_BOTTOM_OVERSHOOT( ras.lastY ); + if ( End_Profile( RAS_VARS o ) ) + return FAILURE; + + /* close the `next profile in contour' linked list */ + if ( ras.gProfile ) + lastProfile->next = ras.gProfile; + } + + if ( Finalize_Profile_Table( RAS_VAR ) ) + return FAILURE; + + return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SCAN-LINE SWEEPS AND DRAWING **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * Init_Linked + * + * Initializes an empty linked list. + */ + static void + Init_Linked( TProfileList* l ) + { + *l = NULL; + } + + + /************************************************************************** + * + * InsNew + * + * Inserts a new profile in a linked list. + */ + static void + InsNew( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + Long x; + + + old = list; + current = *old; + x = profile->X; + + while ( current ) + { + if ( x < current->X ) + break; + old = &current->link; + current = *old; + } + + profile->link = current; + *old = profile; + } + + + /************************************************************************** + * + * DelOld + * + * Removes an old profile from a linked list. + */ + static void + DelOld( PProfileList list, + const PProfile profile ) + { + PProfile *old, current; + + + old = list; + current = *old; + + while ( current ) + { + if ( current == profile ) + { + *old = current->link; + return; + } + + old = &current->link; + current = *old; + } + + /* we should never get there, unless the profile was not part of */ + /* the list. */ + } + + + /************************************************************************** + * + * Sort + * + * Sorts a trace list. In 95%, the list is already sorted. We need + * an algorithm which is fast in this case. Bubble sort is enough + * and simple. + */ + static void + Sort( PProfileList list ) + { + PProfile *old, current, next; + + + /* First, set the new X coordinate of each profile */ + current = *list; + while ( current ) + { + current->X = *current->offset; + current->offset += ( current->flags & Flow_Up ) ? 1 : -1; + current->height--; + current = current->link; + } + + /* Then sort them */ + old = list; + current = *old; + + if ( !current ) + return; + + next = current->link; + + while ( next ) + { + if ( current->X <= next->X ) + { + old = &current->link; + current = *old; + + if ( !current ) + return; + } + else + { + *old = next; + current->link = next->link; + next->link = current; + + old = list; + current = *old; + } + + next = current->link; + } + } + + + /************************************************************************** + * + * Vertical Sweep Procedure Set + * + * These four routines are used during the vertical black/white sweep + * phase by the generic Draw_Sweep() function. + * + */ + + static void + Vertical_Sweep_Init( RAS_ARGS Short min, + Short max ) + { + FT_UNUSED( max ); + + + ras.bLine = ras.bOrigin - min * ras.target.pitch; + } + + + static void + Vertical_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + + Int dropOutControl = left->flags & 7; + + FT_UNUSED( y ); + FT_UNUSED( left ); + FT_UNUSED( right ); + + + /* in high-precision mode, we need 12 digits after the comma to */ + /* represent multiples of 1/(1<<12) = 1/4096 */ + FT_TRACE7(( " y=%d x=[% .12f;% .12f]", + y, + (double)x1 / (double)ras.precision, + (double)x2 / (double)ras.precision )); + + /* Drop-out control */ + + e1 = CEILING( x1 ); + e2 = FLOOR( x2 ); + + /* take care of the special case where both the left */ + /* and right contour lie exactly on pixel centers */ + if ( dropOutControl != 2 && + x2 - x1 - ras.precision <= ras.precision_jitter && + e1 != x1 && e2 != x2 ) + e2 = e1; + + e1 = TRUNC( e1 ); + e2 = TRUNC( e2 ); + + if ( e2 >= 0 && e1 < ras.bWidth ) + { + Byte* target; + + Int c1, c2; + Byte f1, f2; + + + if ( e1 < 0 ) + e1 = 0; + if ( e2 >= ras.bWidth ) + e2 = ras.bWidth - 1; + + FT_TRACE7(( " -> x=[%ld;%ld]", e1, e2 )); + + c1 = (Short)( e1 >> 3 ); + c2 = (Short)( e2 >> 3 ); + + f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); + f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); + + target = ras.bLine + c1; + c2 -= c1; + + if ( c2 > 0 ) + { + target[0] |= f1; + + /* memset() is slower than the following code on many platforms. */ + /* This is due to the fact that, in the vast majority of cases, */ + /* the span length in bytes is relatively small. */ + while ( --c2 > 0 ) + *( ++target ) = 0xFF; + + target[1] |= f2; + } + else + *target |= ( f1 & f2 ); + } + + FT_TRACE7(( "\n" )); + } + + + static void + Vertical_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + Short c1, f1; + + + FT_TRACE7(( " y=%d x=[% .12f;% .12f]", + y, + (double)x1 / (double)ras.precision, + (double)x2 / (double)ras.precision )); + + /* Drop-out control */ + + /* e2 x2 x1 e1 */ + /* */ + /* ^ | */ + /* | | */ + /* +-------------+---------------------+------------+ */ + /* | | */ + /* | v */ + /* */ + /* pixel contour contour pixel */ + /* center center */ + + /* drop-out mode scan conversion rules (as defined in OpenType) */ + /* --------------------------------------------------------------- */ + /* 0 1, 2, 3 */ + /* 1 1, 2, 4 */ + /* 2 1, 2 */ + /* 3 same as mode 2 */ + /* 4 1, 2, 5 */ + /* 5 1, 2, 6 */ + /* 6, 7 same as mode 2 */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = SMART( x1, x2 ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + + /* Drop-out Control Rules #4 and #6 */ + + /* The specification neither provides an exact definition */ + /* of a `stub' nor gives exact rules to exclude them. */ + /* */ + /* Here the constraints we use to recognize a stub. */ + /* */ + /* upper stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Right is the successor of P_Left in that contour */ + /* - y is the top of P_Left and P_Right */ + /* */ + /* lower stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Left is the successor of P_Right in that contour */ + /* - y is the bottom of P_Left */ + /* */ + /* We draw a stub if the following constraints are met. */ + /* */ + /* - for an upper or lower stub, there is top or bottom */ + /* overshoot, respectively */ + /* - the covered interval is greater or equal to a half */ + /* pixel */ + + /* upper stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + /* lower stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = SMART( x1, x2 ); + break; + + default: /* modes 2, 3, 6, 7 */ + goto Exit; /* no drop-out control */ + } + + /* undocumented but confirmed: If the drop-out would result in a */ + /* pixel outside of the bounding box, use the pixel inside of the */ + /* bounding box instead */ + if ( pxl < 0 ) + pxl = e1; + else if ( TRUNC( pxl ) >= ras.bWidth ) + pxl = e2; + + /* check that the other pixel isn't set */ + e1 = ( pxl == e1 ) ? e2 : e1; + + e1 = TRUNC( e1 ); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( e1 >= 0 && e1 < ras.bWidth && + ras.bLine[c1] & ( 0x80 >> f1 ) ) + goto Exit; + } + else + goto Exit; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.bWidth ) + { + FT_TRACE7(( " -> x=%ld", e1 )); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + ras.bLine[c1] |= (char)( 0x80 >> f1 ); + } + + Exit: + FT_TRACE7(( " dropout=%d\n", left->flags & 7 )); + } + + + static void + Vertical_Sweep_Step( RAS_ARG ) + { + ras.bLine -= ras.target.pitch; + } + + + /************************************************************************ + * + * Horizontal Sweep Procedure Set + * + * These four routines are used during the horizontal black/white + * sweep phase by the generic Draw_Sweep() function. + * + */ + + static void + Horizontal_Sweep_Init( RAS_ARGS Short min, + Short max ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( min ); + FT_UNUSED( max ); + } + + + static void + Horizontal_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + + FT_UNUSED( left ); + FT_UNUSED( right ); + + + FT_TRACE7(( " x=%d y=[% .12f;% .12f]", + y, + (double)x1 / (double)ras.precision, + (double)x2 / (double)ras.precision )); + + /* We should not need this procedure but the vertical sweep */ + /* mishandles horizontal lines through pixel centers. So we */ + /* have to check perfectly aligned span edges here. */ + /* */ + /* XXX: Can we handle horizontal lines better and drop this? */ + + e1 = CEILING( x1 ); + + if ( x1 == e1 ) + { + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) + { + Byte f1; + PByte bits; + + + bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch; + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + FT_TRACE7(( bits[0] & f1 ? " redundant" + : " -> y=%ld edge", e1 )); + + bits[0] |= f1; + } + } + + e2 = FLOOR ( x2 ); + + if ( x2 == e2 ) + { + e2 = TRUNC( e2 ); + + if ( e2 >= 0 && (ULong)e2 < ras.target.rows ) + { + Byte f1; + PByte bits; + + + bits = ras.bOrigin + ( y >> 3 ) - e2 * ras.target.pitch; + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + FT_TRACE7(( bits[0] & f1 ? " redundant" + : " -> y=%ld edge", e2 )); + + bits[0] |= f1; + } + } + + FT_TRACE7(( "\n" )); + } + + + static void + Horizontal_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + PByte bits; + Byte f1; + + + FT_TRACE7(( " x=%d y=[% .12f;% .12f]", + y, + (double)x1 / (double)ras.precision, + (double)x2 / (double)ras.precision )); + + /* During the horizontal sweep, we only take care of drop-outs */ + + /* e1 + <-- pixel center */ + /* | */ + /* x1 ---+--> <-- contour */ + /* | */ + /* | */ + /* x2 <--+--- <-- contour */ + /* | */ + /* | */ + /* e2 + <-- pixel center */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = SMART( x1, x2 ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + /* leftmost stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = SMART( x1, x2 ); + break; + + default: /* modes 2, 3, 6, 7 */ + goto Exit; /* no drop-out control */ + } + + /* undocumented but confirmed: If the drop-out would result in a */ + /* pixel outside of the bounding box, use the pixel inside of the */ + /* bounding box instead */ + if ( pxl < 0 ) + pxl = e1; + else if ( (ULong)( TRUNC( pxl ) ) >= ras.target.rows ) + pxl = e2; + + /* check that the other pixel isn't set */ + e1 = ( pxl == e1 ) ? e2 : e1; + + e1 = TRUNC( e1 ); + + bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch; + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + if ( e1 >= 0 && + (ULong)e1 < ras.target.rows && + *bits & f1 ) + goto Exit; + } + else + goto Exit; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) + { + FT_TRACE7(( " -> y=%ld", e1 )); + + bits = ras.bOrigin + ( y >> 3 ) - e1 * ras.target.pitch; + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + bits[0] |= f1; + } + + Exit: + FT_TRACE7(( " dropout=%d\n", left->flags & 7 )); + } + + + static void + Horizontal_Sweep_Step( RAS_ARG ) + { + /* Nothing, really */ + FT_UNUSED_RASTER; + } + + + /************************************************************************** + * + * Generic Sweep Drawing routine + * + */ + + static Bool + Draw_Sweep( RAS_ARG ) + { + Short y, y_change, y_height; + + PProfile P, Q, P_Left, P_Right; + + Short min_Y, max_Y, top, bottom, dropouts; + + Long x1, x2, xs, e1, e2; + + TProfileList waiting; + TProfileList draw_left, draw_right; + + + /* initialize empty linked lists */ + + Init_Linked( &waiting ); + + Init_Linked( &draw_left ); + Init_Linked( &draw_right ); + + /* first, compute min and max Y */ + + P = ras.fProfile; + max_Y = (Short)TRUNC( ras.minY ); + min_Y = (Short)TRUNC( ras.maxY ); + + while ( P ) + { + Q = P->link; + + bottom = (Short)P->start; + top = (Short)( P->start + P->height - 1 ); + + if ( min_Y > bottom ) + min_Y = bottom; + if ( max_Y < top ) + max_Y = top; + + P->X = 0; + InsNew( &waiting, P ); + + P = Q; + } + + /* check the Y-turns */ + if ( ras.numTurns == 0 ) + { + ras.error = FT_THROW( Invalid_Outline ); + return FAILURE; + } + + /* now initialize the sweep */ + + ras.Proc_Sweep_Init( RAS_VARS min_Y, max_Y ); + + /* then compute the distance of each profile from min_Y */ + + P = waiting; + + while ( P ) + { + P->countL = P->start - min_Y; + P = P->link; + } + + /* let's go */ + + y = min_Y; + y_height = 0; + + if ( ras.numTurns > 0 && + ras.sizeBuff[-ras.numTurns] == min_Y ) + ras.numTurns--; + + while ( ras.numTurns > 0 ) + { + /* check waiting list for new activations */ + + P = waiting; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &waiting, P ); + + if ( P->flags & Flow_Up ) + InsNew( &draw_left, P ); + else + InsNew( &draw_right, P ); + } + + P = Q; + } + + /* sort the drawing lists */ + + Sort( &draw_left ); + Sort( &draw_right ); + + y_change = (Short)ras.sizeBuff[-ras.numTurns--]; + y_height = (Short)( y_change - y ); + + while ( y < y_change ) + { + /* let's trace */ + + dropouts = 0; + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left && P_Right ) + { + x1 = P_Left ->X; + x2 = P_Right->X; + + if ( x1 > x2 ) + { + xs = x1; + x1 = x2; + x2 = xs; + } + + e1 = FLOOR( x1 ); + e2 = CEILING( x2 ); + + if ( x2 - x1 <= ras.precision && + e1 != x1 && e2 != x2 ) + { + if ( e1 > e2 || e2 == e1 + ras.precision ) + { + Int dropOutControl = P_Left->flags & 7; + + + if ( dropOutControl != 2 ) + { + /* a drop-out was detected */ + + P_Left ->X = x1; + P_Right->X = x2; + + /* mark profile for drop-out processing */ + P_Left->countL = 1; + dropouts++; + } + + goto Skip_To_Next; + } + } + + ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); + + Skip_To_Next: + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + /* handle drop-outs _after_ the span drawing -- */ + /* drop-out processing has been moved out of the loop */ + /* for performance tuning */ + if ( dropouts > 0 ) + goto Scan_DropOuts; + + Next_Line: + + ras.Proc_Sweep_Step( RAS_VAR ); + + y++; + + if ( y < y_change ) + { + Sort( &draw_left ); + Sort( &draw_right ); + } + } + + /* now finalize the profiles that need it */ + + P = draw_left; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_left, P ); + P = Q; + } + + P = draw_right; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_right, P ); + P = Q; + } + } + + /* for gray-scaling, flush the bitmap scanline cache */ + while ( y <= max_Y ) + { + ras.Proc_Sweep_Step( RAS_VAR ); + y++; + } + + return SUCCESS; + + Scan_DropOuts: + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left && P_Right ) + { + if ( P_Left->countL ) + { + P_Left->countL = 0; +#if 0 + dropouts--; /* -- this is useful when debugging only */ +#endif + ras.Proc_Sweep_Drop( RAS_VARS y, + P_Left->X, + P_Right->X, + P_Left, + P_Right ); + } + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + goto Next_Line; + } + + +#ifdef STANDALONE_ + + /************************************************************************** + * + * The following functions should only compile in stand-alone mode, + * i.e., when building this component without the rest of FreeType. + * + */ + + /************************************************************************** + * + * @Function: + * FT_Outline_Get_CBox + * + * @Description: + * Return an outline's `control box'. The control box encloses all + * the outline's points, including Bézier control points. Though it + * coincides with the exact bounding box for most glyphs, it can be + * slightly larger in some situations (like when rotating an outline + * that contains Bézier outside arcs). + * + * Computing the control box is very fast, while getting the bounding + * box can take much more time as it needs to walk over all segments + * and arcs in the outline. To get the latter, you can use the + * `ftbbox' component, which is dedicated to this single task. + * + * @Input: + * outline :: + * A pointer to the source outline descriptor. + * + * @Output: + * acbox :: + * The outline's control box. + * + * @Note: + * See @FT_Glyph_Get_CBox for a discussion of tricky fonts. + */ + + static void + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + if ( outline && acbox ) + { + Long xMin, yMin, xMax, yMax; + + + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + Long x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + +#endif /* STANDALONE_ */ + + + /************************************************************************** + * + * @Function: + * Render_Single_Pass + * + * @Description: + * Perform one sweep with sub-banding. + * + * @Input: + * flipped :: + * If set, flip the direction of the outline. + * + * @Return: + * Renderer error code. + */ + static int + Render_Single_Pass( RAS_ARGS Bool flipped, + Int y_min, + Int y_max ) + { + Int y_mid; + Int band_top = 0; + Int band_stack[32]; /* enough to bisect 32-bit int bands */ + + + while ( 1 ) + { + ras.minY = (Long)y_min * ras.precision; + ras.maxY = (Long)y_max * ras.precision; + + ras.top = ras.buff; + + ras.error = Raster_Err_Ok; + + if ( Convert_Glyph( RAS_VARS flipped ) ) + { + if ( ras.error != Raster_Err_Raster_Overflow ) + return ras.error; + + /* sub-banding */ + + if ( y_min == y_max ) + return ras.error; /* still Raster_Overflow */ + + y_mid = ( y_min + y_max ) >> 1; + + band_stack[band_top++] = y_min; + y_min = y_mid + 1; + } + else + { + if ( ras.fProfile ) + if ( Draw_Sweep( RAS_VAR ) ) + return ras.error; + + if ( --band_top < 0 ) + break; + + y_max = y_min - 1; + y_min = band_stack[band_top]; + } + } + + return Raster_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * Render_Glyph + * + * @Description: + * Render a glyph in a bitmap. Sub-banding if needed. + * + * @Return: + * FreeType error code. 0 means success. + */ + static FT_Error + Render_Glyph( RAS_ARG ) + { + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + /* Vertical Sweep */ + FT_TRACE7(( "Vertical pass (ftraster)\n" )); + + ras.Proc_Sweep_Init = Vertical_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Sweep_Step; + + ras.bWidth = (UShort)ras.target.width; + ras.bOrigin = (Byte*)ras.target.buffer; + + if ( ras.target.pitch > 0 ) + ras.bOrigin += (Long)( ras.target.rows - 1 ) * ras.target.pitch; + + error = Render_Single_Pass( RAS_VARS 0, 0, (Int)ras.target.rows - 1 ); + if ( error ) + return error; + + /* Horizontal Sweep */ + if ( !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS ) ) + { + FT_TRACE7(( "Horizontal pass (ftraster)\n" )); + + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + error = Render_Single_Pass( RAS_VARS 1, 0, (Int)ras.target.width - 1 ); + if ( error ) + return error; + } + + return Raster_Err_Ok; + } + + + /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ + /**** a static object. *****/ + + +#ifdef STANDALONE_ + + + static int + ft_black_new( void* memory, + FT_Raster *araster ) + { + static black_TRaster the_raster; + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_ZERO( &the_raster ); + + return 0; + } + + + static void + ft_black_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + + +#else /* !STANDALONE_ */ + + + static int + ft_black_new( void* memory_, /* FT_Memory */ + FT_Raster *araster_ ) /* black_PRaster */ + { + FT_Memory memory = (FT_Memory)memory_; + black_PRaster *araster = (black_PRaster*)araster_; + + FT_Error error; + black_PRaster raster = NULL; + + + if ( !FT_NEW( raster ) ) + raster->memory = memory; + + *araster = raster; + + return error; + } + + + static void + ft_black_done( FT_Raster raster_ ) /* black_PRaster */ + { + black_PRaster raster = (black_PRaster)raster_; + FT_Memory memory = (FT_Memory)raster->memory; + + + FT_FREE( raster ); + } + + +#endif /* !STANDALONE_ */ + + + static void + ft_black_reset( FT_Raster raster, + PByte pool_base, + ULong pool_size ) + { + FT_UNUSED( raster ); + FT_UNUSED( pool_base ); + FT_UNUSED( pool_size ); + } + + + static int + ft_black_set_mode( FT_Raster raster, + ULong mode, + void* args ) + { + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( args ); + + return 0; + } + + + static int + ft_black_render( FT_Raster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + +#ifndef FT_STATIC_RASTER + black_TWorker worker[1]; +#endif + + Long buffer[FT_MAX_BLACK_POOL]; + + + if ( !raster ) + return FT_THROW( Raster_Uninitialized ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Raster_Err_Ok; + + if ( !outline->contours || !outline->points ) + return FT_THROW( Invalid_Outline ); + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return FT_THROW( Invalid_Outline ); + + /* this version of the raster does not support direct rendering, sorry */ + if ( params->flags & FT_RASTER_FLAG_DIRECT || + params->flags & FT_RASTER_FLAG_AA ) + return FT_THROW( Cannot_Render_Glyph ); + + if ( !target_map ) + return FT_THROW( Invalid_Argument ); + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return Raster_Err_Ok; + + if ( !target_map->buffer ) + return FT_THROW( Invalid_Argument ); + + ras.outline = *outline; + ras.target = *target_map; + + ras.buff = buffer; + ras.sizeBuff = (&buffer)[1]; /* Points to right after buffer. */ + + return Render_Glyph( RAS_VAR ); + } + + + FT_DEFINE_RASTER_FUNCS( + ft_standard_raster, + + FT_GLYPH_FORMAT_OUTLINE, + + ft_black_new, /* FT_Raster_New_Func raster_new */ + ft_black_reset, /* FT_Raster_Reset_Func raster_reset */ + ft_black_set_mode, /* FT_Raster_Set_Mode_Func raster_set_mode */ + ft_black_render, /* FT_Raster_Render_Func raster_render */ + ft_black_done /* FT_Raster_Done_Func raster_done */ + ) + + +/* END */ diff --git a/external/freetype/src/raster/ftraster.h b/external/freetype/src/raster/ftraster.h new file mode 100644 index 000000000..b511b3a99 --- /dev/null +++ b/external/freetype/src/raster/ftraster.h @@ -0,0 +1,47 @@ +/**************************************************************************** + * + * ftraster.h + * + * The FreeType glyph rasterizer (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used + * modified and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTRASTER_H_ +#define FTRASTER_H_ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/ftimage.h> + +#include <freetype/internal/compiler-macros.h> + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * Uncomment the following line if you are using ftraster.c as a + * standalone module, fully independent of FreeType. + */ +/* #define STANDALONE_ */ + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; + + +FT_END_HEADER + +#endif /* FTRASTER_H_ */ + + +/* END */ diff --git a/external/freetype/src/raster/ftrend1.c b/external/freetype/src/raster/ftrend1.c new file mode 100644 index 000000000..6d442b1ff --- /dev/null +++ b/external/freetype/src/raster/ftrend1.c @@ -0,0 +1,209 @@ +/**************************************************************************** + * + * ftrend1.c + * + * The FreeType glyph rasterizer interface (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftoutln.h> +#include "ftrend1.h" +#include "ftraster.h" + +#include "rasterrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_raster1_init( FT_Module module ) /* FT_Renderer */ + { + FT_Renderer render = (FT_Renderer)module; + + + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return FT_Err_Ok; + } + + + /* set render-specific mode */ + static FT_Error + ft_raster1_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + + /* transform a given glyph image */ + static FT_Error + ft_raster1_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_raster1_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_ZERO( cbox ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_raster1_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error = FT_Err_Ok; + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Memory memory = render->root.memory; + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* check rendering mode */ + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + return FT_THROW( Cannot_Render_Glyph ); + } + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + if ( ft_glyphslot_preset_bitmap( slot, mode, origin ) ) + { + error = FT_THROW( Raster_Overflow ); + goto Exit; + } + + /* allocate new one */ + if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + x_shift = -slot->bitmap_left * 64; + y_shift = ( (FT_Int)bitmap->rows - slot->bitmap_top ) * 64; + + if ( origin ) + { + x_shift += origin->x; + y_shift += origin->y; + } + + /* translate outline to render it into the bitmap */ + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, x_shift, y_shift ); + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_DEFAULT; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, &params ); + + Exit: + if ( !error ) + /* everything is fine; the glyph is now officially a bitmap */ + slot->format = FT_GLYPH_FORMAT_BITMAP; + else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + return error; + } + + + FT_DEFINE_RENDERER( + ft_raster1_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( FT_RendererRec ), + + "raster1", + 0x10000L, + 0x20000L, + + NULL, /* module specific interface */ + + ft_raster1_init, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + NULL, /* FT_Module_Requester get_interface */ + + FT_GLYPH_FORMAT_OUTLINE, + + ft_raster1_render, /* FT_Renderer_RenderFunc render_glyph */ + ft_raster1_transform, /* FT_Renderer_TransformFunc transform_glyph */ + ft_raster1_get_cbox, /* FT_Renderer_GetCBoxFunc get_glyph_cbox */ + ft_raster1_set_mode, /* FT_Renderer_SetModeFunc set_mode */ + + &ft_standard_raster /* FT_Raster_Funcs* raster_class */ + ) + + +/* END */ diff --git a/external/freetype/src/raster/ftrend1.h b/external/freetype/src/raster/ftrend1.h new file mode 100644 index 000000000..cec35c852 --- /dev/null +++ b/external/freetype/src/raster/ftrend1.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * + * ftrend1.h + * + * The FreeType glyph rasterizer interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTREND1_H_ +#define FTREND1_H_ + + +#include <freetype/ftrender.h> + + +FT_BEGIN_HEADER + + + FT_DECLARE_RENDERER( ft_raster1_renderer_class ) + + +FT_END_HEADER + +#endif /* FTREND1_H_ */ + + +/* END */ diff --git a/external/freetype/src/raster/module.mk b/external/freetype/src/raster/module.mk new file mode 100644 index 000000000..6ad1aa77b --- /dev/null +++ b/external/freetype/src/raster/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 renderer module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += RASTER_MODULE + +define RASTER_MODULE +$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/raster/raster.c b/external/freetype/src/raster/raster.c new file mode 100644 index 000000000..82f474547 --- /dev/null +++ b/external/freetype/src/raster/raster.c @@ -0,0 +1,25 @@ +/**************************************************************************** + * + * raster.c + * + * FreeType monochrome rasterer module component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftraster.c" +#include "ftrend1.c" + + +/* END */ diff --git a/external/freetype/src/raster/rasterrs.h b/external/freetype/src/raster/rasterrs.h new file mode 100644 index 000000000..989d8b44b --- /dev/null +++ b/external/freetype/src/raster/rasterrs.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * rasterrs.h + * + * monochrome renderer error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the monochrome renderer error enumeration + * constants. + * + */ + +#ifndef RASTERRS_H_ +#define RASTERRS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Raster_Err_ +#define FT_ERR_BASE FT_Mod_Err_Raster + +#include <freetype/fterrors.h> + +#endif /* RASTERRS_H_ */ + + +/* END */ diff --git a/external/freetype/src/raster/rules.mk b/external/freetype/src/raster/rules.mk new file mode 100644 index 000000000..031b85fb9 --- /dev/null +++ b/external/freetype/src/raster/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 renderer module build rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# raster driver directory +# +RASTER_DIR := $(SRC_DIR)/raster + +# compilation flags for the driver +# +RASTER_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# raster driver sources (i.e., C files) +# +RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \ + $(RASTER_DIR)/ftrend1.c + + +# raster driver headers +# +RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \ + $(RASTER_DIR)/rasterrs.h + + +# raster driver object(s) +# +# RASTER_DRV_OBJ_M is used during `multi' builds. +# RASTER_DRV_OBJ_S is used during `single' builds. +# +RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O) +RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O + +# raster driver source file for single build +# +RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c + + +# raster driver - single object +# +$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \ + $(FREETYPE_H) $(RASTER_DRV_H) + $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S)) + + +# raster driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H) + $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(RASTER_DRV_OBJ_S) +DRV_OBJS_M += $(RASTER_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/sdf/ftbsdf.c b/external/freetype/src/sdf/ftbsdf.c new file mode 100644 index 000000000..e47273833 --- /dev/null +++ b/external/freetype/src/sdf/ftbsdf.c @@ -0,0 +1,1350 @@ +/**************************************************************************** + * + * ftbsdf.c + * + * Signed Distance Field support for bitmap fonts (body only). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftmemory.h> +#include <freetype/fttrigon.h> + +#include "ftsdf.h" +#include "ftsdferrs.h" +#include "ftsdfcommon.h" + + + /************************************************************************** + * + * A brief technical overview of how the BSDF rasterizer works + * ----------------------------------------------------------- + * + * [Notes]: + * * SDF stands for Signed Distance Field everywhere. + * + * * BSDF stands for Bitmap to Signed Distance Field rasterizer. + * + * * This renderer converts rasterized bitmaps to SDF. There is another + * renderer called 'sdf', which generates SDF directly from outlines; + * see file `ftsdf.c` for more. + * + * * The idea of generating SDF from bitmaps is taken from two research + * papers, where one is dependent on the other: + * + * - Per-Erik Danielsson: Euclidean Distance Mapping + * http://webstaff.itn.liu.se/~stegu/JFA/Danielsson.pdf + * + * From this paper we use the eight-point sequential Euclidean + * distance mapping (8SED). This is the heart of the process used + * in this rasterizer. + * + * - Stefan Gustavson, Robin Strand: Anti-aliased Euclidean distance transform. + * http://weber.itn.liu.se/~stegu/aadist/edtaa_preprint.pdf + * + * The original 8SED algorithm discards the pixels' alpha values, + * which can contain information about the actual outline of the + * glyph. This paper takes advantage of those alpha values and + * approximates outline pretty accurately. + * + * * This rasterizer also works for monochrome bitmaps. However, the + * result is not as accurate since we don't have any way to + * approximate outlines from binary bitmaps. + * + * ======================================================================== + * + * Generating SDF from bitmap is done in several steps. + * + * (1) The only information we have is the bitmap itself. It can + * be monochrome or anti-aliased. If it is anti-aliased, pixel values + * are nothing but coverage values. These coverage values can be used + * to extract information about the outline of the image. For + * example, if the pixel's alpha value is 0.5, then we can safely + * assume that the outline passes through the center of the pixel. + * + * (2) Find edge pixels in the bitmap (see `bsdf_is_edge` for more). For + * all edge pixels we use the Anti-aliased Euclidean distance + * transform algorithm and compute approximate edge distances (see + * `compute_edge_distance` and/or the second paper for more). + * + * (3) Now that we have computed approximate distances for edge pixels we + * use the 8SED algorithm to basically sweep the entire bitmap and + * compute distances for the rest of the pixels. (Since the algorithm + * is pretty convoluted it is only explained briefly in a comment to + * function `edt8`. To see the actual algorithm refer to the first + * paper.) + * + * (4) Finally, compute the sign for each pixel. This is done in function + * `finalize_sdf`. The basic idea is that if a pixel's original + * alpha/coverage value is greater than 0.5 then it is 'inside' (and + * 'outside' otherwise). + * + * Pseudo Code: + * + * ``` + * b = source bitmap; + * t = target bitmap; + * dm = list of distances; // dimension equal to b + * + * foreach grid_point (x, y) in b: + * { + * if (is_edge(x, y)): + * dm = approximate_edge_distance(b, x, y); + * + * // do the 8SED on the distances + * edt8(dm); + * + * // determine the signs + * determine_signs(dm): + * + * // copy SDF data to the target bitmap + * copy(dm to t); + * } + * + */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT bsdf + + + /************************************************************************** + * + * useful macros + * + */ + +#define ONE 65536 /* 1 in 16.16 */ + + + /************************************************************************** + * + * structs + * + */ + + + /************************************************************************** + * + * @Struct: + * BSDF_TRaster + * + * @Description: + * This struct is used in place of @FT_Raster and is stored within the + * internal FreeType renderer struct. While rasterizing this is passed + * to the @FT_Raster_RenderFunc function, which then can be used however + * we want. + * + * @Fields: + * memory :: + * Used internally to allocate intermediate memory while raterizing. + * + */ + typedef struct BSDF_TRaster_ + { + FT_Memory memory; + + } BSDF_TRaster, *BSDF_PRaster; + + + /************************************************************************** + * + * @Struct: + * ED + * + * @Description: + * Euclidean distance. It gets used for Euclidean distance transforms; + * it can also be interpreted as an edge distance. + * + * @Fields: + * dist :: + * Vector length of the `prox` parameter. Can be squared or absolute + * depending on the `USE_SQUARED_DISTANCES` macro defined in file + * `ftsdfcommon.h`. + * + * prox :: + * Vector to the nearest edge. Can also be interpreted as shortest + * distance of a point. + * + * alpha :: + * Alpha value of the original bitmap from which we generate SDF. + * Needed for computing the gradient and determining the proper sign + * of a pixel. + * + */ + typedef struct ED_ + { + FT_16D16 dist; + FT_16D16_Vec prox; + FT_Byte alpha; + + } ED; + + + /************************************************************************** + * + * @Struct: + * BSDF_Worker + * + * @Description: + * A convenience struct that is passed to functions while generating + * SDF; most of those functions require the same parameters. + * + * @Fields: + * distance_map :: + * A one-dimensional array that gets interpreted as two-dimensional + * one. It contains the Euclidean distances of all points of the + * bitmap. + * + * width :: + * Width of the above `distance_map`. + * + * rows :: + * Number of rows in the above `distance_map`. + * + * params :: + * Internal parameters and properties required by the rasterizer. See + * file `ftsdf.h` for more. + * + */ + typedef struct BSDF_Worker_ + { + ED* distance_map; + + FT_Int width; + FT_Int rows; + + SDF_Raster_Params params; + + } BSDF_Worker; + + + /************************************************************************** + * + * initializer + * + */ + + static const ED zero_ed = { 0, { 0, 0 }, 0 }; + + + /************************************************************************** + * + * rasterizer functions + * + */ + + /************************************************************************** + * + * @Function: + * bsdf_is_edge + * + * @Description: + * Check whether a pixel is an edge pixel, i.e., whether it is + * surrounded by a completely black pixel (zero alpha), and the current + * pixel is not a completely black pixel. + * + * @Input: + * dm :: + * Array of distances. The parameter must point to the current + * pixel, i.e., the pixel that is to be checked for being an edge. + * + * x :: + * The x position of the current pixel. + * + * y :: + * The y position of the current pixel. + * + * w :: + * Width of the bitmap. + * + * r :: + * Number of rows in the bitmap. + * + * @Return: + * 1~if the current pixel is an edge pixel, 0~otherwise. + * + */ + +#ifdef CHECK_NEIGHBOR +#undef CHECK_NEIGHBOR +#endif + +#define CHECK_NEIGHBOR( x_offset, y_offset ) \ + do \ + { \ + if ( x + x_offset >= 0 && x + x_offset < w && \ + y + y_offset >= 0 && y + y_offset < r ) \ + { \ + num_neighbors++; \ + \ + to_check = dm + y_offset * w + x_offset; \ + if ( to_check->alpha == 0 ) \ + { \ + is_edge = 1; \ + goto Done; \ + } \ + } \ + } while ( 0 ) + + static FT_Bool + bsdf_is_edge( ED* dm, /* distance map */ + FT_Int x, /* x index of point to check */ + FT_Int y, /* y index of point to check */ + FT_Int w, /* width */ + FT_Int r ) /* rows */ + { + FT_Bool is_edge = 0; + ED* to_check = NULL; + FT_Int num_neighbors = 0; + + + if ( dm->alpha == 0 ) + goto Done; + + if ( dm->alpha > 0 && dm->alpha < 255 ) + { + is_edge = 1; + goto Done; + } + + /* up */ + CHECK_NEIGHBOR( 0, -1 ); + + /* down */ + CHECK_NEIGHBOR( 0, 1 ); + + /* left */ + CHECK_NEIGHBOR( -1, 0 ); + + /* right */ + CHECK_NEIGHBOR( 1, 0 ); + + /* up left */ + CHECK_NEIGHBOR( -1, -1 ); + + /* up right */ + CHECK_NEIGHBOR( 1, -1 ); + + /* down left */ + CHECK_NEIGHBOR( -1, 1 ); + + /* down right */ + CHECK_NEIGHBOR( 1, 1 ); + + if ( num_neighbors != 8 ) + is_edge = 1; + + Done: + return is_edge; + } + +#undef CHECK_NEIGHBOR + + + /************************************************************************** + * + * @Function: + * compute_edge_distance + * + * @Description: + * Approximate the outline and compute the distance from `current` + * to the approximated outline. + * + * @Input: + * current :: + * Array of Euclidean distances. `current` must point to the position + * for which the distance is to be caculated. We treat this array as + * a two-dimensional array mapped to a one-dimensional array. + * + * x :: + * The x coordinate of the `current` parameter in the array. + * + * y :: + * The y coordinate of the `current` parameter in the array. + * + * w :: + * The width of the distances array. + * + * r :: + * Number of rows in the distances array. + * + * @Return: + * A vector pointing to the approximate edge distance. + * + * @Note: + * This is a computationally expensive function. Try to reduce the + * number of calls to this function. Moreover, this must only be used + * for edge pixel positions. + * + */ + static FT_16D16_Vec + compute_edge_distance( ED* current, + FT_Int x, + FT_Int y, + FT_Int w, + FT_Int r ) + { + /* + * This function, based on the paper presented by Stefan Gustavson and + * Robin Strand, gets used to approximate edge distances from + * anti-aliased bitmaps. + * + * The algorithm is as follows. + * + * (1) In anti-aliased images, the pixel's alpha value is the coverage + * of the pixel by the outline. For example, if the alpha value is + * 0.5f we can assume that the outline passes through the center of + * the pixel. + * + * (2) For this reason we can use that alpha value to approximate the real + * distance of the pixel to edge pretty accurately. A simple + * approximation is `(0.5f - alpha)`, assuming that the outline is + * parallel to the x or y~axis. However, in this algorithm we use a + * different approximation which is quite accurate even for + * non-axis-aligned edges. + * + * (3) The only remaining piece of information that we cannot + * approximate directly from the alpha is the direction of the edge. + * This is where we use Sobel's operator to compute the gradient of + * the pixel. The gradient give us a pretty good approximation of + * the edge direction. We use a 3x3 kernel filter to compute the + * gradient. + * + * (4) After the above two steps we have both the direction and the + * distance to the edge which is used to generate the Signed + * Distance Field. + * + * References: + * + * - Anti-Aliased Euclidean Distance Transform: + * http://weber.itn.liu.se/~stegu/aadist/edtaa_preprint.pdf + * - Sobel Operator: + * https://en.wikipedia.org/wiki/Sobel_operator + */ + + FT_16D16_Vec g = { 0, 0 }; + FT_16D16 dist, current_alpha; + FT_16D16 a1, temp; + FT_16D16 gx, gy; + FT_16D16 alphas[9]; + + + /* Since our spread cannot be 0, this condition */ + /* can never be true. */ + if ( x <= 0 || x >= w - 1 || + y <= 0 || y >= r - 1 ) + return g; + + /* initialize the alphas */ + alphas[0] = 256 * (FT_16D16)current[-w - 1].alpha; + alphas[1] = 256 * (FT_16D16)current[-w ].alpha; + alphas[2] = 256 * (FT_16D16)current[-w + 1].alpha; + alphas[3] = 256 * (FT_16D16)current[ -1].alpha; + alphas[4] = 256 * (FT_16D16)current[ 0].alpha; + alphas[5] = 256 * (FT_16D16)current[ 1].alpha; + alphas[6] = 256 * (FT_16D16)current[ w - 1].alpha; + alphas[7] = 256 * (FT_16D16)current[ w ].alpha; + alphas[8] = 256 * (FT_16D16)current[ w + 1].alpha; + + current_alpha = alphas[4]; + + /* Compute the gradient using the Sobel operator. */ + /* In this case we use the following 3x3 filters: */ + /* */ + /* For x: | -1 0 -1 | */ + /* | -root(2) 0 root(2) | */ + /* | -1 0 1 | */ + /* */ + /* For y: | -1 -root(2) -1 | */ + /* | 0 0 0 | */ + /* | 1 root(2) 1 | */ + /* */ + /* [Note]: 92681 is root(2) in 16.16 format. */ + g.x = -alphas[0] - + FT_MulFix( alphas[3], 92681 ) - + alphas[6] + + alphas[2] + + FT_MulFix( alphas[5], 92681 ) + + alphas[8]; + + g.y = -alphas[0] - + FT_MulFix( alphas[1], 92681 ) - + alphas[2] + + alphas[6] + + FT_MulFix( alphas[7], 92681 ) + + alphas[8]; + + FT_Vector_NormLen( &g ); + + /* The gradient gives us the direction of the */ + /* edge for the current pixel. Once we have the */ + /* approximate direction of the edge, we can */ + /* approximate the edge distance much better. */ + + if ( g.x == 0 || g.y == 0 ) + dist = ONE / 2 - alphas[4]; + else + { + gx = g.x; + gy = g.y; + + gx = FT_ABS( gx ); + gy = FT_ABS( gy ); + + if ( gx < gy ) + { + temp = gx; + gx = gy; + gy = temp; + } + + a1 = FT_DivFix( gy, gx ) / 2; + + if ( current_alpha < a1 ) + dist = ( gx + gy ) / 2 - + square_root( 2 * FT_MulFix( gx, + FT_MulFix( gy, + current_alpha ) ) ); + + else if ( current_alpha < ( ONE - a1 ) ) + dist = FT_MulFix( ONE / 2 - current_alpha, gx ); + + else + dist = -( gx + gy ) / 2 + + square_root( 2 * FT_MulFix( gx, + FT_MulFix( gy, + ONE - current_alpha ) ) ); + } + + g.x = FT_MulFix( g.x, dist ); + g.y = FT_MulFix( g.y, dist ); + + return g; + } + + + /************************************************************************** + * + * @Function: + * bsdf_approximate_edge + * + * @Description: + * Loops over all the pixels and call `compute_edge_distance` only for + * edge pixels. This maked the process a lot faster since + * `compute_edge_distance` uses functions such as `FT_Vector_NormLen', + * which are quite slow. + * + * @InOut: + * worker :: + * Contains the distance map as well as all the relevant parameters + * required by the function. + * + * @Return: + * FreeType error, 0 means success. + * + * @Note: + * The function directly manipulates `worker->distance_map`. + * + */ + static FT_Error + bsdf_approximate_edge( BSDF_Worker* worker ) + { + FT_Error error = FT_Err_Ok; + FT_Int i, j; + FT_Int index; + ED* ed; + + + if ( !worker || !worker->distance_map ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + ed = worker->distance_map; + + for ( j = 0; j < worker->rows; j++ ) + { + for ( i = 0; i < worker->width; i++ ) + { + index = j * worker->width + i; + + if ( bsdf_is_edge( worker->distance_map + index, + i, j, + worker->width, + worker->rows ) ) + { + /* approximate the edge distance for edge pixels */ + ed[index].prox = compute_edge_distance( ed + index, + i, j, + worker->width, + worker->rows ); + ed[index].dist = VECTOR_LENGTH_16D16( ed[index].prox ); + } + else + { + /* for non-edge pixels assign far away distances */ + ed[index].dist = 400 * ONE; + ed[index].prox.x = 200 * ONE; + ed[index].prox.y = 200 * ONE; + } + } + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * bsdf_init_distance_map + * + * @Description: + * Initialize the distance map according to the '8-point sequential + * Euclidean distance mapping' (8SED) algorithm. Basically it copies + * the `source` bitmap alpha values to the `distance_map->alpha` + * parameter of `worker`. + * + * @Input: + * source :: + * Source bitmap to copy the data from. + * + * @Output: + * worker :: + * Target distance map to copy the data to. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + bsdf_init_distance_map( const FT_Bitmap* source, + BSDF_Worker* worker ) + { + FT_Error error = FT_Err_Ok; + + FT_Int x_diff, y_diff; + FT_Int t_i, t_j, s_i, s_j; + FT_Byte* s; + ED* t; + + + /* again check the parameters (probably unnecessary) */ + if ( !source || !worker ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* Because of the way we convert a bitmap to SDF, */ + /* i.e., aligning the source to the center of the */ + /* target, the target's width and rows must be */ + /* checked before copying. */ + if ( worker->width < (FT_Int)source->width || + worker->rows < (FT_Int)source->rows ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* check pixel mode */ + if ( source->pixel_mode == FT_PIXEL_MODE_NONE ) + { + FT_ERROR(( "bsdf_copy_source_to_target:" + " Invalid pixel mode of source bitmap" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( source->pixel_mode == FT_PIXEL_MODE_MONO ) + { + FT_TRACE0(( "bsdf_copy_source_to_target:" + " The `bsdf' renderer can convert monochrome\n" )); + FT_TRACE0(( " " + " bitmaps to SDF but the results are not perfect\n" )); + FT_TRACE0(( " " + " because there is no way to approximate actual\n" )); + FT_TRACE0(( " " + " outlines from monochrome bitmaps. Consider\n" )); + FT_TRACE0(( " " + " using an anti-aliased bitmap instead.\n" )); + } +#endif + + /* Calculate the width and row differences */ + /* between target and source. */ + x_diff = worker->width - (int)source->width; + y_diff = worker->rows - (int)source->rows; + + x_diff /= 2; + y_diff /= 2; + + t = (ED*)worker->distance_map; + s = source->buffer; + + /* For now we only support pixel mode `FT_PIXEL_MODE_MONO` */ + /* and `FT_PIXEL_MODE_GRAY`. More will be added later. */ + /* */ + /* [NOTE]: We can also use @FT_Bitmap_Convert to convert */ + /* bitmap to 8bpp. To avoid extra allocation and */ + /* since the target bitmap can be 16bpp we manually */ + /* convert the source bitmap to the desired bpp. */ + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + { + FT_Int t_width = worker->width; + FT_Int t_rows = worker->rows; + FT_Int s_width = (int)source->width; + FT_Int s_rows = (int)source->rows; + + + for ( t_j = 0; t_j < t_rows; t_j++ ) + { + for ( t_i = 0; t_i < t_width; t_i++ ) + { + FT_Int t_index = t_j * t_width + t_i; + FT_Int s_index; + FT_Int div, mod; + FT_Byte pixel, byte; + + + t[t_index] = zero_ed; + + s_i = t_i - x_diff; + s_j = t_j - y_diff; + + /* Assign 0 to padding similar to */ + /* the source bitmap. */ + if ( s_i < 0 || s_i >= s_width || + s_j < 0 || s_j >= s_rows ) + continue; + + if ( worker->params.flip_y ) + s_index = ( s_rows - s_j - 1 ) * source->pitch; + else + s_index = s_j * source->pitch; + + div = s_index + s_i / 8; + mod = 7 - s_i % 8; + + pixel = s[div]; + byte = (FT_Byte)( 1 << mod ); + + t[t_index].alpha = pixel & byte ? 255 : 0; + } + } + } + break; + + case FT_PIXEL_MODE_GRAY: + { + FT_Int t_width = worker->width; + FT_Int t_rows = worker->rows; + FT_Int s_width = (int)source->width; + FT_Int s_rows = (int)source->rows; + + + /* loop over all pixels and assign pixel values from source */ + for ( t_j = 0; t_j < t_rows; t_j++ ) + { + for ( t_i = 0; t_i < t_width; t_i++ ) + { + FT_Int t_index = t_j * t_width + t_i; + FT_Int s_index; + + + t[t_index] = zero_ed; + + s_i = t_i - x_diff; + s_j = t_j - y_diff; + + /* Assign 0 to padding similar to */ + /* the source bitmap. */ + if ( s_i < 0 || s_i >= s_width || + s_j < 0 || s_j >= s_rows ) + continue; + + if ( worker->params.flip_y ) + s_index = ( s_rows - s_j - 1 ) * s_width + s_i; + else + s_index = s_j * s_width + s_i; + + /* simply copy the alpha values */ + t[t_index].alpha = s[s_index]; + } + } + } + break; + + default: + FT_ERROR(( "bsdf_copy_source_to_target:" + " unsopported pixel mode of source bitmap\n" )); + + error = FT_THROW( Unimplemented_Feature ); + break; + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * compare_neighbor + * + * @Description: + * Compare neighbor pixel (which is defined by the offset) and update + * `current` distance if the new distance is shorter than the original. + * + * @Input: + * x_offset :: + * X offset of the neighbor to be checked. The offset is relative to + * the `current`. + * + * y_offset :: + * Y offset of the neighbor to be checked. The offset is relative to + * the `current`. + * + * width :: + * Width of the `current` array. + * + * @InOut: + * current :: + * Pointer into array of distances. This parameter must point to the + * position whose neighbor is to be checked. The array is treated as + * a two-dimensional array. + * + */ + static void + compare_neighbor( ED* current, + FT_Int x_offset, + FT_Int y_offset, + FT_Int width ) + { + ED* to_check; + FT_16D16 dist; + FT_16D16_Vec dist_vec; + + + to_check = current + ( y_offset * width ) + x_offset; + + /* + * While checking for the nearest point we first approximate the + * distance of `current` by adding the deviation (which is sqrt(2) at + * most). Only if the new value is less than the current value we + * calculate the actual distances using `FT_Vector_Length`. This last + * step can be omitted by using squared distances. + */ + + /* + * Approximate the distance. We subtract 1 to avoid precision errors, + * which could happen because the two directions can be opposite. + */ + dist = to_check->dist - ONE; + + if ( dist < current->dist ) + { + dist_vec = to_check->prox; + + dist_vec.x += x_offset * ONE; + dist_vec.y += y_offset * ONE; + dist = VECTOR_LENGTH_16D16( dist_vec ); + + if ( dist < current->dist ) + { + current->dist = dist; + current->prox = dist_vec; + } + } + } + + + /************************************************************************** + * + * @Function: + * first_pass + * + * @Description: + * First pass of the 8SED algorithm. Loop over the bitmap from top to + * bottom and scan each row left to right, updating the distances in + * `worker->distance_map`. + * + * @InOut: + * worker:: + * Contains all the relevant parameters. + * + */ + static void + first_pass( BSDF_Worker* worker ) + { + FT_Int i, j; /* iterators */ + FT_Int w, r; /* width, rows */ + ED* dm; /* distance map */ + + + dm = worker->distance_map; + w = worker->width; + r = worker->rows; + + /* Start scanning from top to bottom and sweep each */ + /* row back and forth comparing the distances of the */ + /* neighborhood. Leave the first row as it has no top */ + /* neighbor; it will be covered in the second scan of */ + /* the image (from bottom to top). */ + for ( j = 1; j < r; j++ ) + { + FT_Int index; + ED* current; + + + /* Forward pass of rows (left -> right). Leave the first */ + /* column, which gets covered in the backward pass. */ + for ( i = 1; i < w - 1; i++ ) + { + index = j * w + i; + current = dm + index; + + /* left-up */ + compare_neighbor( current, -1, -1, w ); + /* up */ + compare_neighbor( current, 0, -1, w ); + /* up-right */ + compare_neighbor( current, 1, -1, w ); + /* left */ + compare_neighbor( current, -1, 0, w ); + } + + /* Backward pass of rows (right -> left). Leave the last */ + /* column, which was already covered in the forward pass. */ + for ( i = w - 2; i >= 0; i-- ) + { + index = j * w + i; + current = dm + index; + + /* right */ + compare_neighbor( current, 1, 0, w ); + } + } + } + + + /************************************************************************** + * + * @Function: + * second_pass + * + * @Description: + * Second pass of the 8SED algorithm. Loop over the bitmap from bottom + * to top and scan each row left to right, updating the distances in + * `worker->distance_map`. + * + * @InOut: + * worker:: + * Contains all the relevant parameters. + * + */ + static void + second_pass( BSDF_Worker* worker ) + { + FT_Int i, j; /* iterators */ + FT_Int w, r; /* width, rows */ + ED* dm; /* distance map */ + + + dm = worker->distance_map; + w = worker->width; + r = worker->rows; + + /* Start scanning from bottom to top and sweep each */ + /* row back and forth comparing the distances of the */ + /* neighborhood. Leave the last row as it has no down */ + /* neighbor; it is already covered in the first scan */ + /* of the image (from top to bottom). */ + for ( j = r - 2; j >= 0; j-- ) + { + FT_Int index; + ED* current; + + + /* Forward pass of rows (left -> right). Leave the first */ + /* column, which gets covered in the backward pass. */ + for ( i = 1; i < w - 1; i++ ) + { + index = j * w + i; + current = dm + index; + + /* left-up */ + compare_neighbor( current, -1, 1, w ); + /* up */ + compare_neighbor( current, 0, 1, w ); + /* up-right */ + compare_neighbor( current, 1, 1, w ); + /* left */ + compare_neighbor( current, -1, 0, w ); + } + + /* Backward pass of rows (right -> left). Leave the last */ + /* column, which was already covered in the forward pass. */ + for ( i = w - 2; i >= 0; i-- ) + { + index = j * w + i; + current = dm + index; + + /* right */ + compare_neighbor( current, 1, 0, w ); + } + } + } + + + /************************************************************************** + * + * @Function: + * edt8 + * + * @Description: + * Compute the distance map of the a bitmap. Execute both first and + * second pass of the 8SED algorithm. + * + * @InOut: + * worker:: + * Contains all the relevant parameters. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + edt8( BSDF_Worker* worker ) + { + FT_Error error = FT_Err_Ok; + + + if ( !worker || !worker->distance_map ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* first scan of the image */ + first_pass( worker ); + + /* second scan of the image */ + second_pass( worker ); + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * finalize_sdf + * + * @Description: + * Copy the SDF data from `worker->distance_map` to the `target` bitmap. + * Also transform the data to output format, (which is 6.10 fixed-point + * format at the moment). + * + * @Input: + * worker :: + * Contains source distance map and other SDF data. + * + * @Output: + * target :: + * Target bitmap to which the SDF data is copied to. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + finalize_sdf( BSDF_Worker* worker, + const FT_Bitmap* target ) + { + FT_Error error = FT_Err_Ok; + + FT_Int w, r; + FT_Int i, j; + + FT_SDFFormat* t_buffer; + FT_16D16 sp_sq, spread; + + + if ( !worker || !target ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + w = (int)target->width; + r = (int)target->rows; + t_buffer = (FT_SDFFormat*)target->buffer; + + if ( w != worker->width || + r != worker->rows ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + spread = (FT_16D16)FT_INT_16D16( worker->params.spread ); + +#if USE_SQUARED_DISTANCES + sp_sq = (FT_16D16)FT_INT_16D16( worker->params.spread * + worker->params.spread ); +#else + sp_sq = (FT_16D16)FT_INT_16D16( worker->params.spread ); +#endif + + for ( j = 0; j < r; j++ ) + { + for ( i = 0; i < w; i++ ) + { + FT_Int index; + FT_16D16 dist; + FT_SDFFormat final_dist; + FT_Char sign; + + + index = j * w + i; + dist = worker->distance_map[index].dist; + + if ( dist < 0 || dist > sp_sq ) + dist = sp_sq; + +#if USE_SQUARED_DISTANCES + dist = square_root( dist ); +#endif + + /* We assume that if the pixel is inside a contour */ + /* its coverage value must be > 127. */ + sign = worker->distance_map[index].alpha < 127 ? -1 : 1; + + /* flip the sign according to the property */ + if ( worker->params.flip_sign ) + sign = -sign; + + /* concatenate from 16.16 to appropriate format */ + final_dist = map_fixed_to_sdf( dist * sign, spread ); + + t_buffer[index] = final_dist; + } + } + + Exit: + return error; + } + + + /************************************************************************** + * + * interface functions + * + */ + + /* called when adding a new module through @FT_Add_Module */ + static FT_Error + bsdf_raster_new( void* memory_, /* FT_Memory */ + FT_Raster* araster_ ) /* BSDF_PRaster* */ + { + FT_Memory memory = (FT_Memory)memory_; + BSDF_PRaster* araster = (BSDF_PRaster*)araster_; + + FT_Error error; + BSDF_PRaster raster = NULL; + + + if ( !FT_NEW( raster ) ) + raster->memory = memory; + + *araster = raster; + + return error; + } + + + /* unused */ + static void + bsdf_raster_reset( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ) + { + FT_UNUSED( raster ); + FT_UNUSED( pool_base ); + FT_UNUSED( pool_size ); + } + + + /* unused */ + static FT_Error + bsdf_raster_set_mode( FT_Raster raster, + unsigned long mode, + void* args ) + { + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( args ); + + return FT_Err_Ok; + } + + + /* called while rendering through @FT_Render_Glyph */ + static FT_Error + bsdf_raster_render( FT_Raster raster, + const FT_Raster_Params* params ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = NULL; + + const FT_Bitmap* source = NULL; + const FT_Bitmap* target = NULL; + + BSDF_TRaster* bsdf_raster = (BSDF_TRaster*)raster; + BSDF_Worker worker; + + const SDF_Raster_Params* sdf_params = (const SDF_Raster_Params*)params; + + + worker.distance_map = NULL; + + /* check for valid parameters */ + if ( !raster || !params ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* check whether the flag is set */ + if ( sdf_params->root.flags != FT_RASTER_FLAG_SDF ) + { + error = FT_THROW( Raster_Corrupted ); + goto Exit; + } + + source = (const FT_Bitmap*)sdf_params->root.source; + target = (const FT_Bitmap*)sdf_params->root.target; + + /* check source and target bitmap */ + if ( !source || !target ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + memory = bsdf_raster->memory; + if ( !memory ) + { + FT_TRACE0(( "bsdf_raster_render: Raster not set up properly,\n" )); + FT_TRACE0(( " unable to find memory handle.\n" )); + + error = FT_THROW( Invalid_Handle ); + goto Exit; + } + + /* check whether spread is set properly */ + if ( sdf_params->spread > MAX_SPREAD || + sdf_params->spread < MIN_SPREAD ) + { + FT_TRACE0(( "bsdf_raster_render:" + " The `spread' field of `SDF_Raster_Params'\n" )); + FT_TRACE0(( " " + " is invalid; the value of this field must be\n" )); + FT_TRACE0(( " " + " within [%d, %d].\n", + MIN_SPREAD, MAX_SPREAD )); + FT_TRACE0(( " " + " Also, you must pass `SDF_Raster_Params'\n" )); + FT_TRACE0(( " " + " instead of the default `FT_Raster_Params'\n" )); + FT_TRACE0(( " " + " while calling this function and set the fields\n" )); + FT_TRACE0(( " " + " accordingly.\n" )); + + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* set up the worker */ + + /* allocate the distance map */ + if ( FT_QALLOC_MULT( worker.distance_map, target->rows, + target->width * sizeof ( *worker.distance_map ) ) ) + goto Exit; + + worker.width = (int)target->width; + worker.rows = (int)target->rows; + worker.params = *sdf_params; + + FT_CALL( bsdf_init_distance_map( source, &worker ) ); + FT_CALL( bsdf_approximate_edge( &worker ) ); + FT_CALL( edt8( &worker ) ); + FT_CALL( finalize_sdf( &worker, target ) ); + + FT_TRACE0(( "bsdf_raster_render: Total memory used = %ld\n", + worker.width * worker.rows * + (long)sizeof ( *worker.distance_map ) )); + + Exit: + if ( worker.distance_map ) + FT_FREE( worker.distance_map ); + + return error; + } + + + /* called while deleting `FT_Library` only if the module is added */ + static void + bsdf_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((BSDF_TRaster*)raster)->memory; + + + FT_FREE( raster ); + } + + + FT_DEFINE_RASTER_FUNCS( + ft_bitmap_sdf_raster, + + FT_GLYPH_FORMAT_BITMAP, + + (FT_Raster_New_Func) bsdf_raster_new, /* raster_new */ + (FT_Raster_Reset_Func) bsdf_raster_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)bsdf_raster_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) bsdf_raster_render, /* raster_render */ + (FT_Raster_Done_Func) bsdf_raster_done /* raster_done */ + ) + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdf.c b/external/freetype/src/sdf/ftsdf.c new file mode 100644 index 000000000..bc4625d98 --- /dev/null +++ b/external/freetype/src/sdf/ftsdf.c @@ -0,0 +1,3932 @@ +/**************************************************************************** + * + * ftsdf.c + * + * Signed Distance Field support for outline fonts (body). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ftoutln.h> +#include <freetype/fttrigon.h> +#include <freetype/ftbitmap.h> +#include "ftsdf.h" + +#include "ftsdferrs.h" + + + /************************************************************************** + * + * A brief technical overview of how the SDF rasterizer works + * ---------------------------------------------------------- + * + * [Notes]: + * * SDF stands for Signed Distance Field everywhere. + * + * * This renderer generates SDF directly from outlines. There is + * another renderer called 'bsdf', which converts bitmaps to SDF; see + * file `ftbsdf.c` for more. + * + * * The basic idea of generating the SDF is taken from Viktor Chlumsky's + * research paper. The paper explains both single and multi-channel + * SDF, however, this implementation only generates single-channel SDF. + * + * Chlumsky, Viktor: Shape Decomposition for Multi-channel Distance + * Fields. Master's thesis. Czech Technical University in Prague, + * Faculty of InformationTechnology, 2015. + * + * For more information: https://github.com/Chlumsky/msdfgen + * + * ======================================================================== + * + * Generating SDF from outlines is pretty straightforward. + * + * (1) We have a set of contours that make the outline of a shape/glyph. + * Each contour comprises of several edges, with three types of edges. + * + * * line segments + * * conic Bezier curves + * * cubic Bezier curves + * + * (2) Apart from the outlines we also have a two-dimensional grid, namely + * the bitmap that is used to represent the final SDF data. + * + * (3) In order to generate SDF, our task is to find shortest signed + * distance from each grid point to the outline. The 'signed + * distance' means that if the grid point is filled by any contour + * then its sign is positive, otherwise it is negative. The pseudo + * code is as follows. + * + * ``` + * foreach grid_point (x, y): + * { + * int min_dist = INT_MAX; + * + * foreach contour in outline: + * { + * foreach edge in contour: + * { + * // get shortest distance from point (x, y) to the edge + * d = get_min_dist(x, y, edge); + * + * if (d < min_dist) + * min_dist = d; + * } + * + * bitmap[x, y] = min_dist; + * } + * } + * ``` + * + * (4) After running this algorithm the bitmap contains information about + * the shortest distance from each point to the outline of the shape. + * Of course, while this is the most straightforward way of generating + * SDF, we use various optimizations in our implementation. See the + * `sdf_generate_*' functions in this file for all details. + * + * The optimization currently used by default is subdivision; see + * function `sdf_generate_subdivision` for more. + * + * Also, to see how we compute the shortest distance from a point to + * each type of edge, check out the `get_min_distance_*' functions. + * + */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sdf + + + /************************************************************************** + * + * definitions + * + */ + + /* + * If set to 1, the rasterizer uses Newton-Raphson's method for finding + * the shortest distance from a point to a conic curve. + * + * If set to 0, an analytical method gets used instead, which computes the + * roots of a cubic polynomial to find the shortest distance. However, + * the analytical method can currently underflow; we thus use Newton's + * method by default. + */ +#ifndef USE_NEWTON_FOR_CONIC +#define USE_NEWTON_FOR_CONIC 1 +#endif + + /* + * The number of intervals a Bezier curve gets sampled and checked to find + * the shortest distance. + */ +#define MAX_NEWTON_DIVISIONS 4 + + /* + * The number of steps of Newton's iterations in each interval of the + * Bezier curve. Basically, we run Newton's approximation + * + * x -= Q(t) / Q'(t) + * + * for each division to get the shortest distance. + */ +#define MAX_NEWTON_STEPS 4 + + /* + * The epsilon distance (in 16.16 fractional units) used for corner + * resolving. If the difference of two distances is less than this value + * they will be checked for a corner if they are ambiguous. + */ +#define CORNER_CHECK_EPSILON 32 + +#if 0 + /* + * Coarse grid dimension. Will probably be removed in the future because + * coarse grid optimization is the slowest algorithm. + */ +#define CG_DIMEN 8 +#endif + + + /************************************************************************** + * + * macros + * + */ + +#define MUL_26D6( a, b ) ( ( ( a ) * ( b ) ) / 64 ) +#define VEC_26D6_DOT( p, q ) ( MUL_26D6( p.x, q.x ) + \ + MUL_26D6( p.y, q.y ) ) + + + /************************************************************************** + * + * structures and enums + * + */ + + /************************************************************************** + * + * @Struct: + * SDF_TRaster + * + * @Description: + * This struct is used in place of @FT_Raster and is stored within the + * internal FreeType renderer struct. While rasterizing it is passed to + * the @FT_Raster_RenderFunc function, which then can be used however we + * want. + * + * @Fields: + * memory :: + * Used internally to allocate intermediate memory while raterizing. + * + */ + typedef struct SDF_TRaster_ + { + FT_Memory memory; + + } SDF_TRaster, *SDF_PRaster; + + + /************************************************************************** + * + * @Enum: + * SDF_Edge_Type + * + * @Description: + * Enumeration of all curve types present in fonts. + * + * @Fields: + * SDF_EDGE_UNDEFINED :: + * Undefined edge, simply used to initialize and detect errors. + * + * SDF_EDGE_LINE :: + * Line segment with start and end point. + * + * SDF_EDGE_CONIC :: + * A conic/quadratic Bezier curve with start, end, and one control + * point. + * + * SDF_EDGE_CUBIC :: + * A cubic Bezier curve with start, end, and two control points. + * + */ + typedef enum SDF_Edge_Type_ + { + SDF_EDGE_UNDEFINED = 0, + SDF_EDGE_LINE = 1, + SDF_EDGE_CONIC = 2, + SDF_EDGE_CUBIC = 3 + + } SDF_Edge_Type; + + + /************************************************************************** + * + * @Enum: + * SDF_Contour_Orientation + * + * @Description: + * Enumeration of all orientation values of a contour. We determine the + * orientation by calculating the area covered by a contour. Contrary + * to values returned by @FT_Outline_Get_Orientation, + * `SDF_Contour_Orientation` is independent of the fill rule, which can + * be different for different font formats. + * + * @Fields: + * SDF_ORIENTATION_NONE :: + * Undefined orientation, used for initialization and error detection. + * + * SDF_ORIENTATION_CW :: + * Clockwise orientation (positive area covered). + * + * SDF_ORIENTATION_CCW :: + * Counter-clockwise orientation (negative area covered). + * + * @Note: + * See @FT_Outline_Get_Orientation for more details. + * + */ + typedef enum SDF_Contour_Orientation_ + { + SDF_ORIENTATION_NONE = 0, + SDF_ORIENTATION_CW = 1, + SDF_ORIENTATION_CCW = 2 + + } SDF_Contour_Orientation; + + + /************************************************************************** + * + * @Struct: + * SDF_Edge + * + * @Description: + * Represent an edge of a contour. + * + * @Fields: + * start_pos :: + * Start position of an edge. Valid for all types of edges. + * + * end_pos :: + * Etart position of an edge. Valid for all types of edges. + * + * control_a :: + * A control point of the edge. Valid only for `SDF_EDGE_CONIC` + * and `SDF_EDGE_CUBIC`. + * + * control_b :: + * Another control point of the edge. Valid only for + * `SDF_EDGE_CONIC`. + * + * edge_type :: + * Type of the edge, see @SDF_Edge_Type for all possible edge types. + * + * next :: + * Used to create a singly linked list, which can be interpreted + * as a contour. + * + */ + typedef struct SDF_Edge_ + { + FT_26D6_Vec start_pos; + FT_26D6_Vec end_pos; + FT_26D6_Vec control_a; + FT_26D6_Vec control_b; + + SDF_Edge_Type edge_type; + + struct SDF_Edge_* next; + + } SDF_Edge; + + + /************************************************************************** + * + * @Struct: + * SDF_Contour + * + * @Description: + * Represent a complete contour, which contains a list of edges. + * + * @Fields: + * last_pos :: + * Contains the value of `end_pos' of the last edge in the list of + * edges. Useful while decomposing the outline with + * @FT_Outline_Decompose. + * + * edges :: + * Linked list of all the edges that make the contour. + * + * next :: + * Used to create a singly linked list, which can be interpreted as a + * complete shape or @FT_Outline. + * + */ + typedef struct SDF_Contour_ + { + FT_26D6_Vec last_pos; + SDF_Edge* edges; + + struct SDF_Contour_* next; + + } SDF_Contour; + + + /************************************************************************** + * + * @Struct: + * SDF_Shape + * + * @Description: + * Represent a complete shape, which is the decomposition of + * @FT_Outline. + * + * @Fields: + * memory :: + * Used internally to allocate memory. + * + * contours :: + * Linked list of all the contours that make the shape. + * + */ + typedef struct SDF_Shape_ + { + FT_Memory memory; + SDF_Contour* contours; + + } SDF_Shape; + + + /************************************************************************** + * + * @Struct: + * SDF_Signed_Distance + * + * @Description: + * Represent signed distance of a point, i.e., the distance of the edge + * nearest to the point. + * + * @Fields: + * distance :: + * Distance of the point from the nearest edge. Can be squared or + * absolute depending on the `USE_SQUARED_DISTANCES` macro defined in + * file `ftsdfcommon.h`. + * + * cross :: + * Cross product of the shortest distance vector (i.e., the vector + * from the point to the nearest edge) and the direction of the edge + * at the nearest point. This is used to resolve ambiguities of + * `sign`. + * + * sign :: + * A value used to indicate whether the distance vector is outside or + * inside the contour corresponding to the edge. + * + * @Note: + * `sign` may or may not be correct, therefore it must be checked + * properly in case there is an ambiguity. + * + */ + typedef struct SDF_Signed_Distance_ + { + FT_16D16 distance; + FT_16D16 cross; + FT_Char sign; + + } SDF_Signed_Distance; + + + /************************************************************************** + * + * @Struct: + * SDF_Params + * + * @Description: + * Yet another internal parameters required by the rasterizer. + * + * @Fields: + * orientation :: + * This is not the @SDF_Contour_Orientation value but @FT_Orientation, + * which determines whether clockwise-oriented outlines are to be + * filled or counter-clockwise-oriented ones. + * + * flip_sign :: + * If set to true, flip the sign. By default the points filled by the + * outline are positive. + * + * flip_y :: + * If set to true the output bitmap is upside-down. Can be useful + * because OpenGL and DirectX use different coordinate systems for + * textures. + * + * overload_sign :: + * In the subdivision and bounding box optimization, the default + * outside sign is taken as -1. This parameter can be used to modify + * that behaviour. For example, while generating SDF for a single + * counter-clockwise contour, the outside sign should be 1. + * + */ + typedef struct SDF_Params_ + { + FT_Orientation orientation; + FT_Bool flip_sign; + FT_Bool flip_y; + + FT_Int overload_sign; + + } SDF_Params; + + + /************************************************************************** + * + * constants, initializer, and destructor + * + */ + + static + const FT_Vector zero_vector = { 0, 0 }; + + static + const SDF_Edge null_edge = { { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, + SDF_EDGE_UNDEFINED, NULL }; + + static + const SDF_Contour null_contour = { { 0, 0 }, NULL, NULL }; + + static + const SDF_Shape null_shape = { NULL, NULL }; + + static + const SDF_Signed_Distance max_sdf = { INT_MAX, 0, 0 }; + + + /* Create a new @SDF_Edge on the heap and assigns the `edge` */ + /* pointer to the newly allocated memory. */ + static FT_Error + sdf_edge_new( FT_Memory memory, + SDF_Edge** edge ) + { + FT_Error error = FT_Err_Ok; + SDF_Edge* ptr = NULL; + + + if ( !memory || !edge ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( !FT_QNEW( ptr ) ) + { + *ptr = null_edge; + *edge = ptr; + } + + Exit: + return error; + } + + + /* Free the allocated `edge` variable. */ + static void + sdf_edge_done( FT_Memory memory, + SDF_Edge** edge ) + { + if ( !memory || !edge || !*edge ) + return; + + FT_FREE( *edge ); + } + + + /* Create a new @SDF_Contour on the heap and assign */ + /* the `contour` pointer to the newly allocated memory. */ + static FT_Error + sdf_contour_new( FT_Memory memory, + SDF_Contour** contour ) + { + FT_Error error = FT_Err_Ok; + SDF_Contour* ptr = NULL; + + + if ( !memory || !contour ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( !FT_QNEW( ptr ) ) + { + *ptr = null_contour; + *contour = ptr; + } + + Exit: + return error; + } + + + /* Free the allocated `contour` variable. */ + /* Also free the list of edges. */ + static void + sdf_contour_done( FT_Memory memory, + SDF_Contour** contour ) + { + SDF_Edge* edges; + SDF_Edge* temp; + + + if ( !memory || !contour || !*contour ) + return; + + edges = (*contour)->edges; + + /* release all edges */ + while ( edges ) + { + temp = edges; + edges = edges->next; + + sdf_edge_done( memory, &temp ); + } + + FT_FREE( *contour ); + } + + + /* Create a new @SDF_Shape on the heap and assign */ + /* the `shape` pointer to the newly allocated memory. */ + static FT_Error + sdf_shape_new( FT_Memory memory, + SDF_Shape** shape ) + { + FT_Error error = FT_Err_Ok; + SDF_Shape* ptr = NULL; + + + if ( !memory || !shape ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( !FT_QNEW( ptr ) ) + { + *ptr = null_shape; + ptr->memory = memory; + *shape = ptr; + } + + Exit: + return error; + } + + + /* Free the allocated `shape` variable. */ + /* Also free the list of contours. */ + static void + sdf_shape_done( SDF_Shape** shape ) + { + FT_Memory memory; + SDF_Contour* contours; + SDF_Contour* temp; + + + if ( !shape || !*shape ) + return; + + memory = (*shape)->memory; + contours = (*shape)->contours; + + if ( !memory ) + return; + + /* release all contours */ + while ( contours ) + { + temp = contours; + contours = contours->next; + + sdf_contour_done( memory, &temp ); + } + + /* release the allocated shape struct */ + FT_FREE( *shape ); + } + + + /************************************************************************** + * + * shape decomposition functions + * + */ + + /* This function is called when starting a new contour at `to`, */ + /* which gets added to the shape's list. */ + static FT_Error + sdf_move_to( const FT_26D6_Vec* to, + void* user ) + { + SDF_Shape* shape = ( SDF_Shape* )user; + SDF_Contour* contour = NULL; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = shape->memory; + + + if ( !to || !user ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_CALL( sdf_contour_new( memory, &contour ) ); + + contour->last_pos = *to; + contour->next = shape->contours; + shape->contours = contour; + + Exit: + return error; + } + + + /* This function is called when there is a line in the */ + /* contour. The line starts at the previous edge point and */ + /* stops at `to`. */ + static FT_Error + sdf_line_to( const FT_26D6_Vec* to, + void* user ) + { + SDF_Shape* shape = ( SDF_Shape* )user; + SDF_Edge* edge = NULL; + SDF_Contour* contour = NULL; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = shape->memory; + + + if ( !to || !user ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + contour = shape->contours; + + if ( contour->last_pos.x == to->x && + contour->last_pos.y == to->y ) + goto Exit; + + FT_CALL( sdf_edge_new( memory, &edge ) ); + + edge->edge_type = SDF_EDGE_LINE; + edge->start_pos = contour->last_pos; + edge->end_pos = *to; + + edge->next = contour->edges; + contour->edges = edge; + contour->last_pos = *to; + + Exit: + return error; + } + + + /* This function is called when there is a conic Bezier curve */ + /* in the contour. The curve starts at the previous edge point */ + /* and stops at `to`, with control point `control_1`. */ + static FT_Error + sdf_conic_to( const FT_26D6_Vec* control_1, + const FT_26D6_Vec* to, + void* user ) + { + SDF_Shape* shape = ( SDF_Shape* )user; + SDF_Edge* edge = NULL; + SDF_Contour* contour = NULL; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = shape->memory; + + + if ( !control_1 || !to || !user ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + contour = shape->contours; + + /* If the control point coincides with any of the end points */ + /* then it is a line and should be treated as one to avoid */ + /* unnecessary complexity later in the algorithm. */ + if ( ( contour->last_pos.x == control_1->x && + contour->last_pos.y == control_1->y ) || + ( control_1->x == to->x && + control_1->y == to->y ) ) + { + sdf_line_to( to, user ); + goto Exit; + } + + FT_CALL( sdf_edge_new( memory, &edge ) ); + + edge->edge_type = SDF_EDGE_CONIC; + edge->start_pos = contour->last_pos; + edge->control_a = *control_1; + edge->end_pos = *to; + + edge->next = contour->edges; + contour->edges = edge; + contour->last_pos = *to; + + Exit: + return error; + } + + + /* This function is called when there is a cubic Bezier curve */ + /* in the contour. The curve starts at the previous edge point */ + /* and stops at `to`, with two control points `control_1` and */ + /* `control_2`. */ + static FT_Error + sdf_cubic_to( const FT_26D6_Vec* control_1, + const FT_26D6_Vec* control_2, + const FT_26D6_Vec* to, + void* user ) + { + SDF_Shape* shape = ( SDF_Shape* )user; + SDF_Edge* edge = NULL; + SDF_Contour* contour = NULL; + + FT_Error error = FT_Err_Ok; + FT_Memory memory = shape->memory; + + + if ( !control_2 || !control_1 || !to || !user ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + contour = shape->contours; + + FT_CALL( sdf_edge_new( memory, &edge ) ); + + edge->edge_type = SDF_EDGE_CUBIC; + edge->start_pos = contour->last_pos; + edge->control_a = *control_1; + edge->control_b = *control_2; + edge->end_pos = *to; + + edge->next = contour->edges; + contour->edges = edge; + contour->last_pos = *to; + + Exit: + return error; + } + + + /* Construct the structure to hold all four outline */ + /* decomposition functions. */ + FT_DEFINE_OUTLINE_FUNCS( + sdf_decompose_funcs, + + (FT_Outline_MoveTo_Func) sdf_move_to, /* move_to */ + (FT_Outline_LineTo_Func) sdf_line_to, /* line_to */ + (FT_Outline_ConicTo_Func)sdf_conic_to, /* conic_to */ + (FT_Outline_CubicTo_Func)sdf_cubic_to, /* cubic_to */ + + 0, /* shift */ + 0 /* delta */ + ) + + + /* Decompose `outline` and put it into the `shape` structure. */ + static FT_Error + sdf_outline_decompose( FT_Outline* outline, + SDF_Shape* shape ) + { + FT_Error error = FT_Err_Ok; + + + if ( !outline || !shape ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = FT_Outline_Decompose( outline, + &sdf_decompose_funcs, + (void*)shape ); + + Exit: + return error; + } + + + /************************************************************************** + * + * utility functions + * + */ + + /* Return the control box of an edge. The control box is a rectangle */ + /* in which all the control points can fit tightly. */ + static FT_CBox + get_control_box( SDF_Edge edge ) + { + FT_CBox cbox = { 0, 0, 0, 0 }; + FT_Bool is_set = 0; + + + switch ( edge.edge_type ) + { + case SDF_EDGE_CUBIC: + cbox.xMin = edge.control_b.x; + cbox.xMax = edge.control_b.x; + cbox.yMin = edge.control_b.y; + cbox.yMax = edge.control_b.y; + + is_set = 1; + FALL_THROUGH; + + case SDF_EDGE_CONIC: + if ( is_set ) + { + cbox.xMin = edge.control_a.x < cbox.xMin + ? edge.control_a.x + : cbox.xMin; + cbox.xMax = edge.control_a.x > cbox.xMax + ? edge.control_a.x + : cbox.xMax; + + cbox.yMin = edge.control_a.y < cbox.yMin + ? edge.control_a.y + : cbox.yMin; + cbox.yMax = edge.control_a.y > cbox.yMax + ? edge.control_a.y + : cbox.yMax; + } + else + { + cbox.xMin = edge.control_a.x; + cbox.xMax = edge.control_a.x; + cbox.yMin = edge.control_a.y; + cbox.yMax = edge.control_a.y; + + is_set = 1; + } + FALL_THROUGH; + + case SDF_EDGE_LINE: + if ( is_set ) + { + cbox.xMin = edge.start_pos.x < cbox.xMin + ? edge.start_pos.x + : cbox.xMin; + cbox.xMax = edge.start_pos.x > cbox.xMax + ? edge.start_pos.x + : cbox.xMax; + + cbox.yMin = edge.start_pos.y < cbox.yMin + ? edge.start_pos.y + : cbox.yMin; + cbox.yMax = edge.start_pos.y > cbox.yMax + ? edge.start_pos.y + : cbox.yMax; + } + else + { + cbox.xMin = edge.start_pos.x; + cbox.xMax = edge.start_pos.x; + cbox.yMin = edge.start_pos.y; + cbox.yMax = edge.start_pos.y; + } + + cbox.xMin = edge.end_pos.x < cbox.xMin + ? edge.end_pos.x + : cbox.xMin; + cbox.xMax = edge.end_pos.x > cbox.xMax + ? edge.end_pos.x + : cbox.xMax; + + cbox.yMin = edge.end_pos.y < cbox.yMin + ? edge.end_pos.y + : cbox.yMin; + cbox.yMax = edge.end_pos.y > cbox.yMax + ? edge.end_pos.y + : cbox.yMax; + + break; + + default: + break; + } + + return cbox; + } + + + /* Return orientation of a single contour. */ + /* Note that the orientation is independent of the fill rule! */ + /* So, for TTF a clockwise-oriented contour has to be filled */ + /* and the opposite for OTF fonts. */ + static SDF_Contour_Orientation + get_contour_orientation ( SDF_Contour* contour ) + { + SDF_Edge* head = NULL; + FT_26D6 area = 0; + + + /* return none if invalid parameters */ + if ( !contour || !contour->edges ) + return SDF_ORIENTATION_NONE; + + head = contour->edges; + + /* Calculate the area of the control box for all edges. */ + while ( head ) + { + switch ( head->edge_type ) + { + case SDF_EDGE_LINE: + area += MUL_26D6( ( head->end_pos.x - head->start_pos.x ), + ( head->end_pos.y + head->start_pos.y ) ); + break; + + case SDF_EDGE_CONIC: + area += MUL_26D6( head->control_a.x - head->start_pos.x, + head->control_a.y + head->start_pos.y ); + area += MUL_26D6( head->end_pos.x - head->control_a.x, + head->end_pos.y + head->control_a.y ); + break; + + case SDF_EDGE_CUBIC: + area += MUL_26D6( head->control_a.x - head->start_pos.x, + head->control_a.y + head->start_pos.y ); + area += MUL_26D6( head->control_b.x - head->control_a.x, + head->control_b.y + head->control_a.y ); + area += MUL_26D6( head->end_pos.x - head->control_b.x, + head->end_pos.y + head->control_b.y ); + break; + + default: + return SDF_ORIENTATION_NONE; + } + + head = head->next; + } + + /* Clockwise contours cover a positive area, and counter-clockwise */ + /* contours cover a negative area. */ + if ( area > 0 ) + return SDF_ORIENTATION_CW; + else + return SDF_ORIENTATION_CCW; + } + + + /* This function is exactly the same as the one */ + /* in the smooth renderer. It splits a conic */ + /* into two conics exactly half way at t = 0.5. */ + static void + split_conic( FT_26D6_Vec* base ) + { + FT_26D6 a, b; + + + base[4].x = base[2].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b / 2; + base[2].x = ( a + b ) / 4; + base[1].x = a / 2; + + base[4].y = base[2].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b / 2; + base[2].y = ( a + b ) / 4; + base[1].y = a / 2; + } + + + /* This function is exactly the same as the one */ + /* in the smooth renderer. It splits a cubic */ + /* into two cubics exactly half way at t = 0.5. */ + static void + split_cubic( FT_26D6_Vec* base ) + { + FT_26D6 a, b, c; + + + base[6].x = base[3].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c / 2; + c += b; + base[4].x = c / 4; + base[1].x = a / 2; + a += b; + base[2].x = a / 4; + base[3].x = ( a + c ) / 8; + + base[6].y = base[3].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c / 2; + c += b; + base[4].y = c / 4; + base[1].y = a / 2; + a += b; + base[2].y = a / 4; + base[3].y = ( a + c ) / 8; + } + + + /* Split a conic Bezier curve into a number of lines */ + /* and add them to `out'. */ + /* */ + /* This function uses recursion; we thus need */ + /* parameter `max_splits' for stopping. */ + static FT_Error + split_sdf_conic( FT_Memory memory, + FT_26D6_Vec* control_points, + FT_UInt max_splits, + SDF_Edge** out ) + { + FT_Error error = FT_Err_Ok; + FT_26D6_Vec cpos[5]; + SDF_Edge* left,* right; + + + if ( !memory || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* split conic outline */ + cpos[0] = control_points[0]; + cpos[1] = control_points[1]; + cpos[2] = control_points[2]; + + split_conic( cpos ); + + /* If max number of splits is done */ + /* then stop and add the lines to */ + /* the list. */ + if ( max_splits <= 2 ) + goto Append; + + /* Otherwise keep splitting. */ + FT_CALL( split_sdf_conic( memory, &cpos[0], max_splits / 2, out ) ); + FT_CALL( split_sdf_conic( memory, &cpos[2], max_splits / 2, out ) ); + + /* [NOTE]: This is not an efficient way of */ + /* splitting the curve. Check the deviation */ + /* instead and stop if the deviation is less */ + /* than a pixel. */ + + goto Exit; + + Append: + /* Do allocation and add the lines to the list. */ + + FT_CALL( sdf_edge_new( memory, &left ) ); + FT_CALL( sdf_edge_new( memory, &right ) ); + + left->start_pos = cpos[0]; + left->end_pos = cpos[2]; + left->edge_type = SDF_EDGE_LINE; + + right->start_pos = cpos[2]; + right->end_pos = cpos[4]; + right->edge_type = SDF_EDGE_LINE; + + left->next = right; + right->next = (*out); + *out = left; + + Exit: + return error; + } + + + /* Split a cubic Bezier curve into a number of lines */ + /* and add them to `out`. */ + /* */ + /* This function uses recursion; we thus need */ + /* parameter `max_splits' for stopping. */ + static FT_Error + split_sdf_cubic( FT_Memory memory, + FT_26D6_Vec* control_points, + FT_UInt max_splits, + SDF_Edge** out ) + { + FT_Error error = FT_Err_Ok; + FT_26D6_Vec cpos[7]; + SDF_Edge* left, *right; + const FT_26D6 threshold = ONE_PIXEL / 4; + + + if ( !memory || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* split the cubic */ + cpos[0] = control_points[0]; + cpos[1] = control_points[1]; + cpos[2] = control_points[2]; + cpos[3] = control_points[3]; + + /* If the segment is flat enough we won't get any benefit by */ + /* splitting it further, so we can just stop splitting. */ + /* */ + /* Check the deviation of the Bezier curve and stop if it is */ + /* smaller than the pre-defined `threshold` value. */ + if ( FT_ABS( 2 * cpos[0].x - 3 * cpos[1].x + cpos[3].x ) < threshold && + FT_ABS( 2 * cpos[0].y - 3 * cpos[1].y + cpos[3].y ) < threshold && + FT_ABS( cpos[0].x - 3 * cpos[2].x + 2 * cpos[3].x ) < threshold && + FT_ABS( cpos[0].y - 3 * cpos[2].y + 2 * cpos[3].y ) < threshold ) + { + split_cubic( cpos ); + goto Append; + } + + split_cubic( cpos ); + + /* If max number of splits is done */ + /* then stop and add the lines to */ + /* the list. */ + if ( max_splits <= 2 ) + goto Append; + + /* Otherwise keep splitting. */ + FT_CALL( split_sdf_cubic( memory, &cpos[0], max_splits / 2, out ) ); + FT_CALL( split_sdf_cubic( memory, &cpos[3], max_splits / 2, out ) ); + + /* [NOTE]: This is not an efficient way of */ + /* splitting the curve. Check the deviation */ + /* instead and stop if the deviation is less */ + /* than a pixel. */ + + goto Exit; + + Append: + /* Do allocation and add the lines to the list. */ + + FT_CALL( sdf_edge_new( memory, &left) ); + FT_CALL( sdf_edge_new( memory, &right) ); + + left->start_pos = cpos[0]; + left->end_pos = cpos[3]; + left->edge_type = SDF_EDGE_LINE; + + right->start_pos = cpos[3]; + right->end_pos = cpos[6]; + right->edge_type = SDF_EDGE_LINE; + + left->next = right; + right->next = (*out); + *out = left; + + Exit: + return error; + } + + + /* Subdivide an entire shape into line segments */ + /* such that it doesn't look visually different */ + /* from the original curve. */ + static FT_Error + split_sdf_shape( SDF_Shape* shape ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + SDF_Contour* contours; + SDF_Contour* new_contours = NULL; + + + if ( !shape || !shape->memory ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + contours = shape->contours; + memory = shape->memory; + + /* for each contour */ + while ( contours ) + { + SDF_Edge* edges = contours->edges; + SDF_Edge* new_edges = NULL; + + SDF_Contour* tempc; + + + /* for each edge */ + while ( edges ) + { + SDF_Edge* edge = edges; + SDF_Edge* temp; + + switch ( edge->edge_type ) + { + case SDF_EDGE_LINE: + /* Just create a duplicate edge in case */ + /* it is a line. We can use the same edge. */ + FT_CALL( sdf_edge_new( memory, &temp ) ); + + ft_memcpy( temp, edge, sizeof ( *edge ) ); + + temp->next = new_edges; + new_edges = temp; + break; + + case SDF_EDGE_CONIC: + /* Subdivide the curve and add it to the list. */ + { + FT_26D6_Vec ctrls[3]; + FT_26D6 dx, dy; + FT_UInt num_splits; + + + ctrls[0] = edge->start_pos; + ctrls[1] = edge->control_a; + ctrls[2] = edge->end_pos; + + dx = FT_ABS( ctrls[2].x + ctrls[0].x - 2 * ctrls[1].x ); + dy = FT_ABS( ctrls[2].y + ctrls[0].y - 2 * ctrls[1].y ); + if ( dx < dy ) + dx = dy; + + /* Calculate the number of necessary bisections. Each */ + /* bisection causes a four-fold reduction of the deviation, */ + /* hence we bisect the Bezier curve until the deviation */ + /* becomes less than 1/8 of a pixel. For more details */ + /* check file `ftgrays.c`. */ + num_splits = 1; + while ( dx > ONE_PIXEL / 8 ) + { + dx >>= 2; + num_splits <<= 1; + } + + error = split_sdf_conic( memory, ctrls, num_splits, &new_edges ); + } + break; + + case SDF_EDGE_CUBIC: + /* Subdivide the curve and add it to the list. */ + { + FT_26D6_Vec ctrls[4]; + + + ctrls[0] = edge->start_pos; + ctrls[1] = edge->control_a; + ctrls[2] = edge->control_b; + ctrls[3] = edge->end_pos; + + error = split_sdf_cubic( memory, ctrls, 32, &new_edges ); + } + break; + + default: + error = FT_THROW( Invalid_Argument ); + } + + if ( error != FT_Err_Ok ) + goto Exit; + + edges = edges->next; + } + + /* add to the contours list */ + FT_CALL( sdf_contour_new( memory, &tempc ) ); + + tempc->next = new_contours; + tempc->edges = new_edges; + new_contours = tempc; + new_edges = NULL; + + /* deallocate the contour */ + tempc = contours; + contours = contours->next; + + sdf_contour_done( memory, &tempc ); + } + + shape->contours = new_contours; + + Exit: + return error; + } + + + /************************************************************************** + * + * for debugging + * + */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + static void + sdf_shape_dump( SDF_Shape* shape ) + { + FT_UInt num_contours = 0; + + FT_UInt total_edges = 0; + FT_UInt total_lines = 0; + FT_UInt total_conic = 0; + FT_UInt total_cubic = 0; + + SDF_Contour* contour_list; + + + if ( !shape ) + { + FT_TRACE5(( "sdf_shape_dump: null shape\n" )); + return; + } + + contour_list = shape->contours; + + FT_TRACE5(( "sdf_shape_dump (values are in 26.6 format):\n" )); + + while ( contour_list ) + { + FT_UInt num_edges = 0; + SDF_Edge* edge_list; + SDF_Contour* contour = contour_list; + + + FT_TRACE5(( " Contour %d\n", num_contours )); + + edge_list = contour->edges; + + while ( edge_list ) + { + SDF_Edge* edge = edge_list; + + + FT_TRACE5(( " %3d: ", num_edges )); + + switch ( edge->edge_type ) + { + case SDF_EDGE_LINE: + FT_TRACE5(( "Line: (%ld, %ld) -- (%ld, %ld)\n", + edge->start_pos.x, edge->start_pos.y, + edge->end_pos.x, edge->end_pos.y )); + total_lines++; + break; + + case SDF_EDGE_CONIC: + FT_TRACE5(( "Conic: (%ld, %ld) .. (%ld, %ld) .. (%ld, %ld)\n", + edge->start_pos.x, edge->start_pos.y, + edge->control_a.x, edge->control_a.y, + edge->end_pos.x, edge->end_pos.y )); + total_conic++; + break; + + case SDF_EDGE_CUBIC: + FT_TRACE5(( "Cubic: (%ld, %ld) .. (%ld, %ld)" + " .. (%ld, %ld) .. (%ld %ld)\n", + edge->start_pos.x, edge->start_pos.y, + edge->control_a.x, edge->control_a.y, + edge->control_b.x, edge->control_b.y, + edge->end_pos.x, edge->end_pos.y )); + total_cubic++; + break; + + default: + break; + } + + num_edges++; + total_edges++; + edge_list = edge_list->next; + } + + num_contours++; + contour_list = contour_list->next; + } + + FT_TRACE5(( "\n" )); + FT_TRACE5(( " total number of contours = %d\n", num_contours )); + FT_TRACE5(( " total number of edges = %d\n", total_edges )); + FT_TRACE5(( " |__lines = %d\n", total_lines )); + FT_TRACE5(( " |__conic = %d\n", total_conic )); + FT_TRACE5(( " |__cubic = %d\n", total_cubic )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * math functions + * + */ + +#if !USE_NEWTON_FOR_CONIC + + /* [NOTE]: All the functions below down until rasterizer */ + /* can be avoided if we decide to subdivide the */ + /* curve into lines. */ + + /* This function uses Newton's iteration to find */ + /* the cube root of a fixed-point integer. */ + static FT_16D16 + cube_root( FT_16D16 val ) + { + /* [IMPORTANT]: This function is not good as it may */ + /* not break, so use a lookup table instead. Or we */ + /* can use an algorithm similar to `square_root`. */ + + FT_Int v, g, c; + + + if ( val == 0 || + val == -FT_INT_16D16( 1 ) || + val == FT_INT_16D16( 1 ) ) + return val; + + v = val < 0 ? -val : val; + g = square_root( v ); + c = 0; + + while ( 1 ) + { + c = FT_MulFix( FT_MulFix( g, g ), g ) - v; + c = FT_DivFix( c, 3 * FT_MulFix( g, g ) ); + + g -= c; + + if ( ( c < 0 ? -c : c ) < 30 ) + break; + } + + return val < 0 ? -g : g; + } + + + /* Calculate the perpendicular by using '1 - base^2'. */ + /* Then use arctan to compute the angle. */ + static FT_16D16 + arc_cos( FT_16D16 val ) + { + FT_16D16 p; + FT_16D16 b = val; + FT_16D16 one = FT_INT_16D16( 1 ); + + + if ( b > one ) + b = one; + if ( b < -one ) + b = -one; + + p = one - FT_MulFix( b, b ); + p = square_root( p ); + + return FT_Atan2( b, p ); + } + + + /* Compute roots of a quadratic polynomial, assign them to `out`, */ + /* and return number of real roots. */ + /* */ + /* The procedure can be found at */ + /* */ + /* https://mathworld.wolfram.com/QuadraticFormula.html */ + static FT_UShort + solve_quadratic_equation( FT_26D6 a, + FT_26D6 b, + FT_26D6 c, + FT_16D16 out[2] ) + { + FT_16D16 discriminant = 0; + + + a = FT_26D6_16D16( a ); + b = FT_26D6_16D16( b ); + c = FT_26D6_16D16( c ); + + if ( a == 0 ) + { + if ( b == 0 ) + return 0; + else + { + out[0] = FT_DivFix( -c, b ); + + return 1; + } + } + + discriminant = FT_MulFix( b, b ) - 4 * FT_MulFix( a, c ); + + if ( discriminant < 0 ) + return 0; + else if ( discriminant == 0 ) + { + out[0] = FT_DivFix( -b, 2 * a ); + + return 1; + } + else + { + discriminant = square_root( discriminant ); + + out[0] = FT_DivFix( -b + discriminant, 2 * a ); + out[1] = FT_DivFix( -b - discriminant, 2 * a ); + + return 2; + } + } + + + /* Compute roots of a cubic polynomial, assign them to `out`, */ + /* and return number of real roots. */ + /* */ + /* The procedure can be found at */ + /* */ + /* https://mathworld.wolfram.com/CubicFormula.html */ + static FT_UShort + solve_cubic_equation( FT_26D6 a, + FT_26D6 b, + FT_26D6 c, + FT_26D6 d, + FT_16D16 out[3] ) + { + FT_16D16 q = 0; /* intermediate */ + FT_16D16 r = 0; /* intermediate */ + + FT_16D16 a2 = b; /* x^2 coefficients */ + FT_16D16 a1 = c; /* x coefficients */ + FT_16D16 a0 = d; /* constant */ + + FT_16D16 q3 = 0; + FT_16D16 r2 = 0; + FT_16D16 a23 = 0; + FT_16D16 a22 = 0; + FT_16D16 a1x2 = 0; + + + /* cutoff value for `a` to be a cubic, otherwise solve quadratic */ + if ( a == 0 || FT_ABS( a ) < 16 ) + return solve_quadratic_equation( b, c, d, out ); + + if ( d == 0 ) + { + out[0] = 0; + + return solve_quadratic_equation( a, b, c, out + 1 ) + 1; + } + + /* normalize the coefficients; this also makes them 16.16 */ + a2 = FT_DivFix( a2, a ); + a1 = FT_DivFix( a1, a ); + a0 = FT_DivFix( a0, a ); + + /* compute intermediates */ + a1x2 = FT_MulFix( a1, a2 ); + a22 = FT_MulFix( a2, a2 ); + a23 = FT_MulFix( a22, a2 ); + + q = ( 3 * a1 - a22 ) / 9; + r = ( 9 * a1x2 - 27 * a0 - 2 * a23 ) / 54; + + /* [BUG]: `q3` and `r2` still cause underflow. */ + + q3 = FT_MulFix( q, q ); + q3 = FT_MulFix( q3, q ); + + r2 = FT_MulFix( r, r ); + + if ( q3 < 0 && r2 < -q3 ) + { + FT_16D16 t = 0; + + + q3 = square_root( -q3 ); + t = FT_DivFix( r, q3 ); + + if ( t > ( 1 << 16 ) ) + t = ( 1 << 16 ); + if ( t < -( 1 << 16 ) ) + t = -( 1 << 16 ); + + t = arc_cos( t ); + a2 /= 3; + q = 2 * square_root( -q ); + + out[0] = FT_MulFix( q, FT_Cos( t / 3 ) ) - a2; + out[1] = FT_MulFix( q, FT_Cos( ( t + FT_ANGLE_PI * 2 ) / 3 ) ) - a2; + out[2] = FT_MulFix( q, FT_Cos( ( t + FT_ANGLE_PI * 4 ) / 3 ) ) - a2; + + return 3; + } + + else if ( r2 == -q3 ) + { + FT_16D16 s = 0; + + + s = cube_root( r ); + a2 /= -3; + + out[0] = a2 + ( 2 * s ); + out[1] = a2 - s; + + return 2; + } + + else + { + FT_16D16 s = 0; + FT_16D16 t = 0; + FT_16D16 dis = 0; + + + if ( q3 == 0 ) + dis = FT_ABS( r ); + else + dis = square_root( q3 + r2 ); + + s = cube_root( r + dis ); + t = cube_root( r - dis ); + a2 /= -3; + out[0] = ( a2 + ( s + t ) ); + + return 1; + } + } + +#endif /* !USE_NEWTON_FOR_CONIC */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** RASTERIZER **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * @Function: + * resolve_corner + * + * @Description: + * At some places on the grid two edges can give opposite directions; + * this happens when the closest point is on one of the endpoint. In + * that case we need to check the proper sign. + * + * This can be visualized by an example: + * + * ``` + * x + * + * o + * ^ \ + * / \ + * / \ + * (a) / \ (b) + * / \ + * / \ + * / v + * ``` + * + * Suppose `x` is the point whose shortest distance from an arbitrary + * contour we want to find out. It is clear that `o` is the nearest + * point on the contour. Now to determine the sign we do a cross + * product of the shortest distance vector and the edge direction, i.e., + * + * ``` + * => sign = cross(x - o, direction(a)) + * ``` + * + * Using the right hand thumb rule we can see that the sign will be + * positive. + * + * If we use `b', however, we have + * + * ``` + * => sign = cross(x - o, direction(b)) + * ``` + * + * In this case the sign will be negative. To determine the correct + * sign we thus divide the plane in two halves and check which plane the + * point lies in. + * + * ``` + * | + * x | + * | + * o + * ^|\ + * / | \ + * / | \ + * (a) / | \ (b) + * / | \ + * / \ + * / v + * ``` + * + * We can see that `x` lies in the plane of `a`, so we take the sign + * determined by `a`. This test can be easily done by calculating the + * orthogonality and taking the greater one. + * + * The orthogonality is simply the sinus of the two vectors (i.e., + * x - o) and the corresponding direction. We efficiently pre-compute + * the orthogonality with the corresponding `get_min_distance_*` + * functions. + * + * @Input: + * sdf1 :: + * First signed distance (can be any of `a` or `b`). + * + * sdf1 :: + * Second signed distance (can be any of `a` or `b`). + * + * @Return: + * The correct signed distance, which is computed by using the above + * algorithm. + * + * @Note: + * The function does not care about the actual distance, it simply + * returns the signed distance which has a larger cross product. As a + * consequence, this function should not be used if the two distances + * are fairly apart. In that case simply use the signed distance with + * a shorter absolute distance. + * + */ + static SDF_Signed_Distance + resolve_corner( SDF_Signed_Distance sdf1, + SDF_Signed_Distance sdf2 ) + { + return FT_ABS( sdf1.cross ) > FT_ABS( sdf2.cross ) ? sdf1 : sdf2; + } + + + /************************************************************************** + * + * @Function: + * get_min_distance_line + * + * @Description: + * Find the shortest distance from the `line` segment to a given `point` + * and assign it to `out`. Use it for line segments only. + * + * @Input: + * line :: + * The line segment to which the shortest distance is to be computed. + * + * point :: + * Point from which the shortest distance is to be computed. + * + * @Output: + * out :: + * Signed distance from `point` to `line`. + * + * @Return: + * FreeType error, 0 means success. + * + * @Note: + * The `line' parameter must have an edge type of `SDF_EDGE_LINE`. + * + */ + static FT_Error + get_min_distance_line( SDF_Edge* line, + FT_26D6_Vec point, + SDF_Signed_Distance* out ) + { + /* + * In order to calculate the shortest distance from a point to + * a line segment, we do the following. Let's assume that + * + * ``` + * a = start point of the line segment + * b = end point of the line segment + * p = point from which shortest distance is to be calculated + * ``` + * + * (1) Write the parametric equation of the line. + * + * ``` + * point_on_line = a + (b - a) * t (t is the factor) + * ``` + * + * (2) Find the projection of point `p` on the line. The projection + * will be perpendicular to the line, which allows us to get the + * solution by making the dot product zero. + * + * ``` + * (point_on_line - a) . (p - point_on_line) = 0 + * + * (point_on_line) + * (a) x-------o----------------x (b) + * |_| + * | + * | + * (p) + * ``` + * + * (3) Simplification of the above equation yields the factor of + * `point_on_line`: + * + * ``` + * t = ((p - a) . (b - a)) / |b - a|^2 + * ``` + * + * (4) We clamp factor `t` between [0.0f, 1.0f] because `point_on_line` + * can be outside of the line segment: + * + * ``` + * (point_on_line) + * (a) x------------------------x (b) -----o--- + * |_| + * | + * | + * (p) + * ``` + * + * (5) Finally, the distance we are interested in is + * + * ``` + * |point_on_line - p| + * ``` + */ + + FT_Error error = FT_Err_Ok; + + FT_Vector a; /* start position */ + FT_Vector b; /* end position */ + FT_Vector p; /* current point */ + + FT_26D6_Vec line_segment; /* `b` - `a` */ + FT_26D6_Vec p_sub_a; /* `p` - `a` */ + + FT_26D6 sq_line_length; /* squared length of `line_segment` */ + FT_16D16 factor; /* factor of the nearest point */ + FT_26D6 cross; /* used to determine sign */ + + FT_16D16_Vec nearest_point; /* `point_on_line` */ + FT_16D16_Vec nearest_vector; /* `p` - `nearest_point` */ + + + if ( !line || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( line->edge_type != SDF_EDGE_LINE ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + a = line->start_pos; + b = line->end_pos; + p = point; + + line_segment.x = b.x - a.x; + line_segment.y = b.y - a.y; + + p_sub_a.x = p.x - a.x; + p_sub_a.y = p.y - a.y; + + sq_line_length = ( line_segment.x * line_segment.x ) / 64 + + ( line_segment.y * line_segment.y ) / 64; + + /* currently factor is 26.6 */ + factor = ( p_sub_a.x * line_segment.x ) / 64 + + ( p_sub_a.y * line_segment.y ) / 64; + + /* now factor is 16.16 */ + factor = FT_DivFix( factor, sq_line_length ); + + /* clamp the factor between 0.0 and 1.0 in fixed-point */ + if ( factor > FT_INT_16D16( 1 ) ) + factor = FT_INT_16D16( 1 ); + if ( factor < 0 ) + factor = 0; + + nearest_point.x = FT_MulFix( FT_26D6_16D16( line_segment.x ), + factor ); + nearest_point.y = FT_MulFix( FT_26D6_16D16( line_segment.y ), + factor ); + + nearest_point.x = FT_26D6_16D16( a.x ) + nearest_point.x; + nearest_point.y = FT_26D6_16D16( a.y ) + nearest_point.y; + + nearest_vector.x = nearest_point.x - FT_26D6_16D16( p.x ); + nearest_vector.y = nearest_point.y - FT_26D6_16D16( p.y ); + + cross = FT_MulFix( nearest_vector.x, line_segment.y ) - + FT_MulFix( nearest_vector.y, line_segment.x ); + + /* assign the output */ + out->sign = cross < 0 ? 1 : -1; + out->distance = VECTOR_LENGTH_16D16( nearest_vector ); + + /* Instead of finding `cross` for checking corner we */ + /* directly set it here. This is more efficient */ + /* because if the distance is perpendicular we can */ + /* directly set it to 1. */ + if ( factor != 0 && factor != FT_INT_16D16( 1 ) ) + out->cross = FT_INT_16D16( 1 ); + else + { + /* [OPTIMIZATION]: Pre-compute this direction. */ + /* If not perpendicular then compute `cross`. */ + FT_Vector_NormLen( &line_segment ); + FT_Vector_NormLen( &nearest_vector ); + + out->cross = FT_MulFix( line_segment.x, nearest_vector.y ) - + FT_MulFix( line_segment.y, nearest_vector.x ); + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * get_min_distance_conic + * + * @Description: + * Find the shortest distance from the `conic` Bezier curve to a given + * `point` and assign it to `out`. Use it for conic/quadratic curves + * only. + * + * @Input: + * conic :: + * The conic Bezier curve to which the shortest distance is to be + * computed. + * + * point :: + * Point from which the shortest distance is to be computed. + * + * @Output: + * out :: + * Signed distance from `point` to `conic`. + * + * @Return: + * FreeType error, 0 means success. + * + * @Note: + * The `conic` parameter must have an edge type of `SDF_EDGE_CONIC`. + * + */ + +#if !USE_NEWTON_FOR_CONIC + + /* + * The function uses an analytical method to find the shortest distance + * which is faster than the Newton-Raphson method, but has underflows at + * the moment. Use Newton's method if you can see artifacts in the SDF. + */ + static FT_Error + get_min_distance_conic( SDF_Edge* conic, + FT_26D6_Vec point, + SDF_Signed_Distance* out ) + { + /* + * The procedure to find the shortest distance from a point to a + * quadratic Bezier curve is similar to the line segment algorithm. The + * shortest distance is perpendicular to the Bezier curve; the only + * difference from line is that there can be more than one + * perpendicular, and we also have to check the endpoints, because the + * perpendicular may not be the shortest. + * + * Let's assume that + * ``` + * p0 = first endpoint + * p1 = control point + * p2 = second endpoint + * p = point from which shortest distance is to be calculated + * ``` + * + * (1) The equation of a quadratic Bezier curve can be written as + * + * ``` + * B(t) = (1 - t)^2 * p0 + 2(1 - t)t * p1 + t^2 * p2 + * ``` + * + * with `t` a factor in the range [0.0f, 1.0f]. This equation can + * be rewritten as + * + * ``` + * B(t) = t^2 * (p0 - 2p1 + p2) + 2t * (p1 - p0) + p0 + * ``` + * + * With + * + * ``` + * A = p0 - 2p1 + p2 + * B = p1 - p0 + * ``` + * + * we have + * + * ``` + * B(t) = t^2 * A + 2t * B + p0 + * ``` + * + * (2) The derivative of the last equation above is + * + * ``` + * B'(t) = 2 *(tA + B) + * ``` + * + * (3) To find the shortest distance from `p` to `B(t)` we find the + * point on the curve at which the shortest distance vector (i.e., + * `B(t) - p`) and the direction (i.e., `B'(t)`) make 90 degrees. + * In other words, we make the dot product zero. + * + * ``` + * (B(t) - p) . (B'(t)) = 0 + * (t^2 * A + 2t * B + p0 - p) . (2 * (tA + B)) = 0 + * ``` + * + * After simplifying we get a cubic equation + * + * ``` + * at^3 + bt^2 + ct + d = 0 + * ``` + * + * with + * + * ``` + * a = A.A + * b = 3A.B + * c = 2B.B + A.p0 - A.p + * d = p0.B - p.B + * ``` + * + * (4) Now the roots of the equation can be computed using 'Cardano's + * Cubic formula'; we clamp the roots in the range [0.0f, 1.0f]. + * + * [note]: `B` and `B(t)` are different in the above equations. + */ + + FT_Error error = FT_Err_Ok; + + FT_26D6_Vec aA, bB; /* A, B in the above comment */ + FT_26D6_Vec nearest_point = { 0, 0 }; + /* point on curve nearest to `point` */ + FT_26D6_Vec direction; /* direction of curve at `nearest_point` */ + + FT_26D6_Vec p0, p1, p2; /* control points of a conic curve */ + FT_26D6_Vec p; /* `point` to which shortest distance */ + + FT_26D6 a, b, c, d; /* cubic coefficients */ + + FT_16D16 roots[3] = { 0, 0, 0 }; /* real roots of the cubic eq. */ + FT_16D16 min_factor; /* factor at `nearest_point` */ + FT_16D16 cross; /* to determine the sign */ + FT_16D16 min = FT_INT_MAX; /* shortest squared distance */ + + FT_UShort num_roots; /* number of real roots of cubic */ + FT_UShort i; + + + if ( !conic || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( conic->edge_type != SDF_EDGE_CONIC ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + p0 = conic->start_pos; + p1 = conic->control_a; + p2 = conic->end_pos; + p = point; + + /* compute substitution coefficients */ + aA.x = p0.x - 2 * p1.x + p2.x; + aA.y = p0.y - 2 * p1.y + p2.y; + + bB.x = p1.x - p0.x; + bB.y = p1.y - p0.y; + + /* compute cubic coefficients */ + a = VEC_26D6_DOT( aA, aA ); + + b = 3 * VEC_26D6_DOT( aA, bB ); + + c = 2 * VEC_26D6_DOT( bB, bB ) + + VEC_26D6_DOT( aA, p0 ) - + VEC_26D6_DOT( aA, p ); + + d = VEC_26D6_DOT( p0, bB ) - + VEC_26D6_DOT( p, bB ); + + /* find the roots */ + num_roots = solve_cubic_equation( a, b, c, d, roots ); + + if ( num_roots == 0 ) + { + roots[0] = 0; + roots[1] = FT_INT_16D16( 1 ); + num_roots = 2; + } + + /* [OPTIMIZATION]: Check the roots, clamp them and discard */ + /* duplicate roots. */ + + /* convert these values to 16.16 for further computation */ + aA.x = FT_26D6_16D16( aA.x ); + aA.y = FT_26D6_16D16( aA.y ); + + bB.x = FT_26D6_16D16( bB.x ); + bB.y = FT_26D6_16D16( bB.y ); + + p0.x = FT_26D6_16D16( p0.x ); + p0.y = FT_26D6_16D16( p0.y ); + + p.x = FT_26D6_16D16( p.x ); + p.y = FT_26D6_16D16( p.y ); + + for ( i = 0; i < num_roots; i++ ) + { + FT_16D16 t = roots[i]; + FT_16D16 t2 = 0; + FT_16D16 dist = 0; + + FT_16D16_Vec curve_point; + FT_16D16_Vec dist_vector; + + /* + * Ideally we should discard the roots which are outside the range + * [0.0, 1.0] and check the endpoints of the Bezier curve, but Behdad + * Esfahbod proved the following lemma. + * + * Lemma: + * + * (1) If the closest point on the curve [0, 1] is to the endpoint at + * `t` = 1 and the cubic has no real roots at `t` = 1 then the + * cubic must have a real root at some `t` > 1. + * + * (2) Similarly, if the closest point on the curve [0, 1] is to the + * endpoint at `t` = 0 and the cubic has no real roots at `t` = 0 + * then the cubic must have a real root at some `t` < 0. + * + * Now because of this lemma we only need to clamp the roots and that + * will take care of the endpoints. + * + * For more details see + * + * https://lists.nongnu.org/archive/html/freetype-devel/2020-06/msg00147.html + */ + + if ( t < 0 ) + t = 0; + if ( t > FT_INT_16D16( 1 ) ) + t = FT_INT_16D16( 1 ); + + t2 = FT_MulFix( t, t ); + + /* B(t) = t^2 * A + 2t * B + p0 - p */ + curve_point.x = FT_MulFix( aA.x, t2 ) + + 2 * FT_MulFix( bB.x, t ) + p0.x; + curve_point.y = FT_MulFix( aA.y, t2 ) + + 2 * FT_MulFix( bB.y, t ) + p0.y; + + /* `curve_point` - `p` */ + dist_vector.x = curve_point.x - p.x; + dist_vector.y = curve_point.y - p.y; + + dist = VECTOR_LENGTH_16D16( dist_vector ); + + if ( dist < min ) + { + min = dist; + nearest_point = curve_point; + min_factor = t; + } + } + + /* B'(t) = 2 * (tA + B) */ + direction.x = 2 * FT_MulFix( aA.x, min_factor ) + 2 * bB.x; + direction.y = 2 * FT_MulFix( aA.y, min_factor ) + 2 * bB.y; + + /* determine the sign */ + cross = FT_MulFix( nearest_point.x - p.x, direction.y ) - + FT_MulFix( nearest_point.y - p.y, direction.x ); + + /* assign the values */ + out->distance = min; + out->sign = cross < 0 ? 1 : -1; + + if ( min_factor != 0 && min_factor != FT_INT_16D16( 1 ) ) + out->cross = FT_INT_16D16( 1 ); /* the two are perpendicular */ + else + { + /* convert to nearest vector */ + nearest_point.x -= FT_26D6_16D16( p.x ); + nearest_point.y -= FT_26D6_16D16( p.y ); + + /* compute `cross` if not perpendicular */ + FT_Vector_NormLen( &direction ); + FT_Vector_NormLen( &nearest_point ); + + out->cross = FT_MulFix( direction.x, nearest_point.y ) - + FT_MulFix( direction.y, nearest_point.x ); + } + + Exit: + return error; + } + +#else /* USE_NEWTON_FOR_CONIC */ + + /* + * The function uses Newton's approximation to find the shortest distance, + * which is a bit slower than the analytical method but doesn't cause + * underflow. + */ + static FT_Error + get_min_distance_conic( SDF_Edge* conic, + FT_26D6_Vec point, + SDF_Signed_Distance* out ) + { + /* + * This method uses Newton-Raphson's approximation to find the shortest + * distance from a point to a conic curve. It does not involve solving + * any cubic equation, that is why there is no risk of underflow. + * + * Let's assume that + * + * ``` + * p0 = first endpoint + * p1 = control point + * p3 = second endpoint + * p = point from which shortest distance is to be calculated + * ``` + * + * (1) The equation of a quadratic Bezier curve can be written as + * + * ``` + * B(t) = (1 - t)^2 * p0 + 2(1 - t)t * p1 + t^2 * p2 + * ``` + * + * with `t` the factor in the range [0.0f, 1.0f]. The above + * equation can be rewritten as + * + * ``` + * B(t) = t^2 * (p0 - 2p1 + p2) + 2t * (p1 - p0) + p0 + * ``` + * + * With + * + * ``` + * A = p0 - 2p1 + p2 + * B = 2 * (p1 - p0) + * ``` + * + * we have + * + * ``` + * B(t) = t^2 * A + t * B + p0 + * ``` + * + * (2) The derivative of the above equation is + * + * ``` + * B'(t) = 2t * A + B + * ``` + * + * (3) The second derivative of the above equation is + * + * ``` + * B''(t) = 2A + * ``` + * + * (4) The equation `P(t)` of the distance from point `p` to the curve + * can be written as + * + * ``` + * P(t) = t^2 * A + t^2 * B + p0 - p + * ``` + * + * With + * + * ``` + * C = p0 - p + * ``` + * + * we have + * + * ``` + * P(t) = t^2 * A + t * B + C + * ``` + * + * (5) Finally, the equation of the angle between `B(t)` and `P(t)` can + * be written as + * + * ``` + * Q(t) = P(t) . B'(t) + * ``` + * + * (6) Our task is to find a value of `t` such that the above equation + * `Q(t)` becomes zero, that is, the point-to-curve vector makes + * 90~degrees with the curve. We solve this with the Newton-Raphson + * method. + * + * (7) We first assume an arbitrary value of factor `t`, which we then + * improve. + * + * ``` + * t := Q(t) / Q'(t) + * ``` + * + * Putting the value of `Q(t)` from the above equation gives + * + * ``` + * t := P(t) . B'(t) / derivative(P(t) . B'(t)) + * t := P(t) . B'(t) / + * (P'(t) . B'(t) + P(t) . B''(t)) + * ``` + * + * Note that `P'(t)` is the same as `B'(t)` because the constant is + * gone due to the derivative. + * + * (8) Finally we get the equation to improve the factor as + * + * ``` + * t := P(t) . B'(t) / + * (B'(t) . B'(t) + P(t) . B''(t)) + * ``` + * + * [note]: `B` and `B(t)` are different in the above equations. + */ + + FT_Error error = FT_Err_Ok; + + FT_26D6_Vec aA, bB, cC; /* A, B, C in the above comment */ + FT_26D6_Vec nearest_point = { 0, 0 }; + /* point on curve nearest to `point` */ + FT_26D6_Vec direction; /* direction of curve at `nearest_point` */ + + FT_26D6_Vec p0, p1, p2; /* control points of a conic curve */ + FT_26D6_Vec p; /* `point` to which shortest distance */ + + FT_16D16 min_factor = 0; /* factor at `nearest_point' */ + FT_16D16 cross; /* to determine the sign */ + FT_16D16 min = FT_INT_MAX; /* shortest squared distance */ + + FT_UShort iterations; + FT_UShort steps; + + + if ( !conic || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( conic->edge_type != SDF_EDGE_CONIC ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + p0 = conic->start_pos; + p1 = conic->control_a; + p2 = conic->end_pos; + p = point; + + /* compute substitution coefficients */ + aA.x = p0.x - 2 * p1.x + p2.x; + aA.y = p0.y - 2 * p1.y + p2.y; + + bB.x = 2 * ( p1.x - p0.x ); + bB.y = 2 * ( p1.y - p0.y ); + + cC.x = p0.x; + cC.y = p0.y; + + /* do Newton's iterations */ + for ( iterations = 0; iterations <= MAX_NEWTON_DIVISIONS; iterations++ ) + { + FT_16D16 factor = FT_INT_16D16( iterations ) / MAX_NEWTON_DIVISIONS; + FT_16D16 factor2; + FT_16D16 length; + + FT_16D16_Vec curve_point; /* point on the curve */ + FT_16D16_Vec dist_vector; /* `curve_point` - `p` */ + + FT_26D6_Vec d1; /* first derivative */ + FT_26D6_Vec d2; /* second derivative */ + + FT_16D16 temp1; + FT_16D16 temp2; + + + for ( steps = 0; steps < MAX_NEWTON_STEPS; steps++ ) + { + factor2 = FT_MulFix( factor, factor ); + + /* B(t) = t^2 * A + t * B + p0 */ + curve_point.x = FT_MulFix( aA.x, factor2 ) + + FT_MulFix( bB.x, factor ) + cC.x; + curve_point.y = FT_MulFix( aA.y, factor2 ) + + FT_MulFix( bB.y, factor ) + cC.y; + + /* convert to 16.16 */ + curve_point.x = FT_26D6_16D16( curve_point.x ); + curve_point.y = FT_26D6_16D16( curve_point.y ); + + /* P(t) in the comment */ + dist_vector.x = curve_point.x - FT_26D6_16D16( p.x ); + dist_vector.y = curve_point.y - FT_26D6_16D16( p.y ); + + length = VECTOR_LENGTH_16D16( dist_vector ); + + if ( length < min ) + { + min = length; + min_factor = factor; + nearest_point = curve_point; + } + + /* This is Newton's approximation. */ + /* */ + /* t := P(t) . B'(t) / */ + /* (B'(t) . B'(t) + P(t) . B''(t)) */ + + /* B'(t) = 2tA + B */ + d1.x = FT_MulFix( aA.x, 2 * factor ) + bB.x; + d1.y = FT_MulFix( aA.y, 2 * factor ) + bB.y; + + /* B''(t) = 2A */ + d2.x = 2 * aA.x; + d2.y = 2 * aA.y; + + dist_vector.x /= 1024; + dist_vector.y /= 1024; + + /* temp1 = P(t) . B'(t) */ + temp1 = VEC_26D6_DOT( dist_vector, d1 ); + + /* temp2 = B'(t) . B'(t) + P(t) . B''(t) */ + temp2 = VEC_26D6_DOT( d1, d1 ) + + VEC_26D6_DOT( dist_vector, d2 ); + + factor -= FT_DivFix( temp1, temp2 ); + + if ( factor < 0 || factor > FT_INT_16D16( 1 ) ) + break; + } + } + + /* B'(t) = 2t * A + B */ + direction.x = 2 * FT_MulFix( aA.x, min_factor ) + bB.x; + direction.y = 2 * FT_MulFix( aA.y, min_factor ) + bB.y; + + /* determine the sign */ + cross = FT_MulFix( nearest_point.x - FT_26D6_16D16( p.x ), + direction.y ) - + FT_MulFix( nearest_point.y - FT_26D6_16D16( p.y ), + direction.x ); + + /* assign the values */ + out->distance = min; + out->sign = cross < 0 ? 1 : -1; + + if ( min_factor != 0 && min_factor != FT_INT_16D16( 1 ) ) + out->cross = FT_INT_16D16( 1 ); /* the two are perpendicular */ + else + { + /* convert to nearest vector */ + nearest_point.x -= FT_26D6_16D16( p.x ); + nearest_point.y -= FT_26D6_16D16( p.y ); + + /* compute `cross` if not perpendicular */ + FT_Vector_NormLen( &direction ); + FT_Vector_NormLen( &nearest_point ); + + out->cross = FT_MulFix( direction.x, nearest_point.y ) - + FT_MulFix( direction.y, nearest_point.x ); + } + + Exit: + return error; + } + + +#endif /* USE_NEWTON_FOR_CONIC */ + + + /************************************************************************** + * + * @Function: + * get_min_distance_cubic + * + * @Description: + * Find the shortest distance from the `cubic` Bezier curve to a given + * `point` and assigns it to `out`. Use it for cubic curves only. + * + * @Input: + * cubic :: + * The cubic Bezier curve to which the shortest distance is to be + * computed. + * + * point :: + * Point from which the shortest distance is to be computed. + * + * @Output: + * out :: + * Signed distance from `point` to `cubic`. + * + * @Return: + * FreeType error, 0 means success. + * + * @Note: + * The function uses Newton's approximation to find the shortest + * distance. Another way would be to divide the cubic into conic or + * subdivide the curve into lines, but that is not implemented. + * + * The `cubic` parameter must have an edge type of `SDF_EDGE_CUBIC`. + * + */ + static FT_Error + get_min_distance_cubic( SDF_Edge* cubic, + FT_26D6_Vec point, + SDF_Signed_Distance* out ) + { + /* + * The procedure to find the shortest distance from a point to a cubic + * Bezier curve is similar to quadratic curve algorithm. The only + * difference is that while calculating factor `t`, instead of a cubic + * polynomial equation we have to find the roots of a 5th degree + * polynomial equation. Solving this would require a significant amount + * of time, and still the results may not be accurate. We are thus + * going to directly approximate the value of `t` using the Newton-Raphson + * method. + * + * Let's assume that + * + * ``` + * p0 = first endpoint + * p1 = first control point + * p2 = second control point + * p3 = second endpoint + * p = point from which shortest distance is to be calculated + * ``` + * + * (1) The equation of a cubic Bezier curve can be written as + * + * ``` + * B(t) = (1 - t)^3 * p0 + 3(1 - t)^2 t * p1 + + * 3(1 - t)t^2 * p2 + t^3 * p3 + * ``` + * + * The equation can be expanded and written as + * + * ``` + * B(t) = t^3 * (-p0 + 3p1 - 3p2 + p3) + + * 3t^2 * (p0 - 2p1 + p2) + 3t * (-p0 + p1) + p0 + * ``` + * + * With + * + * ``` + * A = -p0 + 3p1 - 3p2 + p3 + * B = 3(p0 - 2p1 + p2) + * C = 3(-p0 + p1) + * ``` + * + * we have + * + * ``` + * B(t) = t^3 * A + t^2 * B + t * C + p0 + * ``` + * + * (2) The derivative of the above equation is + * + * ``` + * B'(t) = 3t^2 * A + 2t * B + C + * ``` + * + * (3) The second derivative of the above equation is + * + * ``` + * B''(t) = 6t * A + 2B + * ``` + * + * (4) The equation `P(t)` of the distance from point `p` to the curve + * can be written as + * + * ``` + * P(t) = t^3 * A + t^2 * B + t * C + p0 - p + * ``` + * + * With + * + * ``` + * D = p0 - p + * ``` + * + * we have + * + * ``` + * P(t) = t^3 * A + t^2 * B + t * C + D + * ``` + * + * (5) Finally the equation of the angle between `B(t)` and `P(t)` can + * be written as + * + * ``` + * Q(t) = P(t) . B'(t) + * ``` + * + * (6) Our task is to find a value of `t` such that the above equation + * `Q(t)` becomes zero, that is, the point-to-curve vector makes + * 90~degree with curve. We solve this with the Newton-Raphson + * method. + * + * (7) We first assume an arbitrary value of factor `t`, which we then + * improve. + * + * ``` + * t := Q(t) / Q'(t) + * ``` + * + * Putting the value of `Q(t)` from the above equation gives + * + * ``` + * t := P(t) . B'(t) / derivative(P(t) . B'(t)) + * t := P(t) . B'(t) / + * (P'(t) . B'(t) + P(t) . B''(t)) + * ``` + * + * Note that `P'(t)` is the same as `B'(t)` because the constant is + * gone due to the derivative. + * + * (8) Finally we get the equation to improve the factor as + * + * ``` + * t := P(t) . B'(t) / + * (B'(t) . B'( t ) + P(t) . B''(t)) + * ``` + * + * [note]: `B` and `B(t)` are different in the above equations. + */ + + FT_Error error = FT_Err_Ok; + + FT_26D6_Vec aA, bB, cC, dD; /* A, B, C, D in the above comment */ + FT_16D16_Vec nearest_point = { 0, 0 }; + /* point on curve nearest to `point` */ + FT_16D16_Vec direction; /* direction of curve at `nearest_point` */ + + FT_26D6_Vec p0, p1, p2, p3; /* control points of a cubic curve */ + FT_26D6_Vec p; /* `point` to which shortest distance */ + + FT_16D16 min_factor = 0; /* factor at shortest distance */ + FT_16D16 min_factor_sq = 0; /* factor at shortest distance */ + FT_16D16 cross; /* to determine the sign */ + FT_16D16 min = FT_INT_MAX; /* shortest distance */ + + FT_UShort iterations; + FT_UShort steps; + + + if ( !cubic || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( cubic->edge_type != SDF_EDGE_CUBIC ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + p0 = cubic->start_pos; + p1 = cubic->control_a; + p2 = cubic->control_b; + p3 = cubic->end_pos; + p = point; + + /* compute substitution coefficients */ + aA.x = -p0.x + 3 * ( p1.x - p2.x ) + p3.x; + aA.y = -p0.y + 3 * ( p1.y - p2.y ) + p3.y; + + bB.x = 3 * ( p0.x - 2 * p1.x + p2.x ); + bB.y = 3 * ( p0.y - 2 * p1.y + p2.y ); + + cC.x = 3 * ( p1.x - p0.x ); + cC.y = 3 * ( p1.y - p0.y ); + + dD.x = p0.x; + dD.y = p0.y; + + for ( iterations = 0; iterations <= MAX_NEWTON_DIVISIONS; iterations++ ) + { + FT_16D16 factor = FT_INT_16D16( iterations ) / MAX_NEWTON_DIVISIONS; + + FT_16D16 factor2; /* factor^2 */ + FT_16D16 factor3; /* factor^3 */ + FT_16D16 length; + + FT_16D16_Vec curve_point; /* point on the curve */ + FT_16D16_Vec dist_vector; /* `curve_point' - `p' */ + + FT_26D6_Vec d1; /* first derivative */ + FT_26D6_Vec d2; /* second derivative */ + + FT_16D16 temp1; + FT_16D16 temp2; + + + for ( steps = 0; steps < MAX_NEWTON_STEPS; steps++ ) + { + factor2 = FT_MulFix( factor, factor ); + factor3 = FT_MulFix( factor2, factor ); + + /* B(t) = t^3 * A + t^2 * B + t * C + D */ + curve_point.x = FT_MulFix( aA.x, factor3 ) + + FT_MulFix( bB.x, factor2 ) + + FT_MulFix( cC.x, factor ) + dD.x; + curve_point.y = FT_MulFix( aA.y, factor3 ) + + FT_MulFix( bB.y, factor2 ) + + FT_MulFix( cC.y, factor ) + dD.y; + + /* convert to 16.16 */ + curve_point.x = FT_26D6_16D16( curve_point.x ); + curve_point.y = FT_26D6_16D16( curve_point.y ); + + /* P(t) in the comment */ + dist_vector.x = curve_point.x - FT_26D6_16D16( p.x ); + dist_vector.y = curve_point.y - FT_26D6_16D16( p.y ); + + length = VECTOR_LENGTH_16D16( dist_vector ); + + if ( length < min ) + { + min = length; + min_factor = factor; + min_factor_sq = factor2; + nearest_point = curve_point; + } + + /* This the Newton's approximation. */ + /* */ + /* t := P(t) . B'(t) / */ + /* (B'(t) . B'(t) + P(t) . B''(t)) */ + + /* B'(t) = 3t^2 * A + 2t * B + C */ + d1.x = FT_MulFix( aA.x, 3 * factor2 ) + + FT_MulFix( bB.x, 2 * factor ) + cC.x; + d1.y = FT_MulFix( aA.y, 3 * factor2 ) + + FT_MulFix( bB.y, 2 * factor ) + cC.y; + + /* B''(t) = 6t * A + 2B */ + d2.x = FT_MulFix( aA.x, 6 * factor ) + 2 * bB.x; + d2.y = FT_MulFix( aA.y, 6 * factor ) + 2 * bB.y; + + dist_vector.x /= 1024; + dist_vector.y /= 1024; + + /* temp1 = P(t) . B'(t) */ + temp1 = VEC_26D6_DOT( dist_vector, d1 ); + + /* temp2 = B'(t) . B'(t) + P(t) . B''(t) */ + temp2 = VEC_26D6_DOT( d1, d1 ) + + VEC_26D6_DOT( dist_vector, d2 ); + + factor -= FT_DivFix( temp1, temp2 ); + + if ( factor < 0 || factor > FT_INT_16D16( 1 ) ) + break; + } + } + + /* B'(t) = 3t^2 * A + 2t * B + C */ + direction.x = FT_MulFix( aA.x, 3 * min_factor_sq ) + + FT_MulFix( bB.x, 2 * min_factor ) + cC.x; + direction.y = FT_MulFix( aA.y, 3 * min_factor_sq ) + + FT_MulFix( bB.y, 2 * min_factor ) + cC.y; + + /* determine the sign */ + cross = FT_MulFix( nearest_point.x - FT_26D6_16D16( p.x ), + direction.y ) - + FT_MulFix( nearest_point.y - FT_26D6_16D16( p.y ), + direction.x ); + + /* assign the values */ + out->distance = min; + out->sign = cross < 0 ? 1 : -1; + + if ( min_factor != 0 && min_factor != FT_INT_16D16( 1 ) ) + out->cross = FT_INT_16D16( 1 ); /* the two are perpendicular */ + else + { + /* convert to nearest vector */ + nearest_point.x -= FT_26D6_16D16( p.x ); + nearest_point.y -= FT_26D6_16D16( p.y ); + + /* compute `cross` if not perpendicular */ + FT_Vector_NormLen( &direction ); + FT_Vector_NormLen( &nearest_point ); + + out->cross = FT_MulFix( direction.x, nearest_point.y ) - + FT_MulFix( direction.y, nearest_point.x ); + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * sdf_edge_get_min_distance + * + * @Description: + * Find shortest distance from `point` to any type of `edge`. It checks + * the edge type and then calls the relevant `get_min_distance_*` + * function. + * + * @Input: + * edge :: + * An edge to which the shortest distance is to be computed. + * + * point :: + * Point from which the shortest distance is to be computed. + * + * @Output: + * out :: + * Signed distance from `point` to `edge`. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + sdf_edge_get_min_distance( SDF_Edge* edge, + FT_26D6_Vec point, + SDF_Signed_Distance* out ) + { + FT_Error error = FT_Err_Ok; + + + if ( !edge || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* edge-specific distance calculation */ + switch ( edge->edge_type ) + { + case SDF_EDGE_LINE: + get_min_distance_line( edge, point, out ); + break; + + case SDF_EDGE_CONIC: + get_min_distance_conic( edge, point, out ); + break; + + case SDF_EDGE_CUBIC: + get_min_distance_cubic( edge, point, out ); + break; + + default: + error = FT_THROW( Invalid_Argument ); + } + + Exit: + return error; + } + + + /* `sdf_generate' is not used at the moment */ +#if 0 + + #error "DO NOT USE THIS!" + #error "The function still outputs 16-bit data, which might cause memory" + #error "corruption. If required I will add this later." + + /************************************************************************** + * + * @Function: + * sdf_contour_get_min_distance + * + * @Description: + * Iterate over all edges that make up the contour, find the shortest + * distance from a point to this contour, and assigns result to `out`. + * + * @Input: + * contour :: + * A contour to which the shortest distance is to be computed. + * + * point :: + * Point from which the shortest distance is to be computed. + * + * @Output: + * out :: + * Signed distance from the `point' to the `contour'. + * + * @Return: + * FreeType error, 0 means success. + * + * @Note: + * The function does not return a signed distance for each edge which + * makes up the contour, it simply returns the shortest of all the + * edges. + * + */ + static FT_Error + sdf_contour_get_min_distance( SDF_Contour* contour, + FT_26D6_Vec point, + SDF_Signed_Distance* out ) + { + FT_Error error = FT_Err_Ok; + SDF_Signed_Distance min_dist = max_sdf; + SDF_Edge* edge_list; + + + if ( !contour || !out ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + edge_list = contour->edges; + + /* iterate over all the edges manually */ + while ( edge_list ) + { + SDF_Signed_Distance current_dist = max_sdf; + FT_16D16 diff; + + + FT_CALL( sdf_edge_get_min_distance( edge_list, + point, + &current_dist ) ); + + if ( current_dist.distance >= 0 ) + { + diff = current_dist.distance - min_dist.distance; + + + if ( FT_ABS( diff ) < CORNER_CHECK_EPSILON ) + min_dist = resolve_corner( min_dist, current_dist ); + else if ( diff < 0 ) + min_dist = current_dist; + } + else + FT_TRACE0(( "sdf_contour_get_min_distance: Overflow.\n" )); + + edge_list = edge_list->next; + } + + *out = min_dist; + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * sdf_generate + * + * @Description: + * This is the main function that is responsible for generating signed + * distance fields. The function does not align or compute the size of + * `bitmap`; therefore the calling application must set up `bitmap` + * properly and transform the `shape' appropriately in advance. + * + * Currently we check all pixels against all contours and all edges. + * + * @Input: + * internal_params :: + * Internal parameters and properties required by the rasterizer. See + * @SDF_Params for more. + * + * shape :: + * A complete shape which is used to generate SDF. + * + * spread :: + * Maximum distances to be allowed in the output bitmap. + * + * @Output: + * bitmap :: + * The output bitmap which will contain the SDF information. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + sdf_generate( const SDF_Params internal_params, + const SDF_Shape* shape, + FT_UInt spread, + const FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + + FT_UInt width = 0; + FT_UInt rows = 0; + FT_UInt x = 0; /* used to loop in x direction, i.e., width */ + FT_UInt y = 0; /* used to loop in y direction, i.e., rows */ + FT_UInt sp_sq = 0; /* `spread` [* `spread`] as a 16.16 fixed value */ + + FT_Short* buffer; + + + if ( !shape || !bitmap ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( spread < MIN_SPREAD || spread > MAX_SPREAD ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + width = bitmap->width; + rows = bitmap->rows; + buffer = (FT_Short*)bitmap->buffer; + + if ( USE_SQUARED_DISTANCES ) + sp_sq = FT_INT_16D16( spread * spread ); + else + sp_sq = FT_INT_16D16( spread ); + + if ( width == 0 || rows == 0 ) + { + FT_TRACE0(( "sdf_generate:" + " Cannot render glyph with width/height == 0\n" )); + FT_TRACE0(( " " + " (width, height provided [%d, %d])\n", + width, rows )); + + error = FT_THROW( Cannot_Render_Glyph ); + goto Exit; + } + + /* loop over all rows */ + for ( y = 0; y < rows; y++ ) + { + /* loop over all pixels of a row */ + for ( x = 0; x < width; x++ ) + { + /* `grid_point` is the current pixel position; */ + /* our task is to find the shortest distance */ + /* from this point to the entire shape. */ + FT_26D6_Vec grid_point = zero_vector; + SDF_Signed_Distance min_dist = max_sdf; + SDF_Contour* contour_list; + + FT_UInt index; + FT_Short value; + + + grid_point.x = FT_INT_26D6( x ); + grid_point.y = FT_INT_26D6( y ); + + /* This `grid_point' is at the corner, but we */ + /* use the center of the pixel. */ + grid_point.x += FT_INT_26D6( 1 ) / 2; + grid_point.y += FT_INT_26D6( 1 ) / 2; + + contour_list = shape->contours; + + /* iterate over all contours manually */ + while ( contour_list ) + { + SDF_Signed_Distance current_dist = max_sdf; + + + FT_CALL( sdf_contour_get_min_distance( contour_list, + grid_point, + &current_dist ) ); + + if ( current_dist.distance < min_dist.distance ) + min_dist = current_dist; + + contour_list = contour_list->next; + } + + /* [OPTIMIZATION]: if (min_dist > sp_sq) then simply clamp */ + /* the value to spread to avoid square_root */ + + /* clamp the values to spread */ + if ( min_dist.distance > sp_sq ) + min_dist.distance = sp_sq; + + /* square_root the values and fit in a 6.10 fixed-point */ + if ( USE_SQUARED_DISTANCES ) + min_dist.distance = square_root( min_dist.distance ); + + if ( internal_params.orientation == FT_ORIENTATION_FILL_LEFT ) + min_dist.sign = -min_dist.sign; + if ( internal_params.flip_sign ) + min_dist.sign = -min_dist.sign; + + min_dist.distance /= 64; /* convert from 16.16 to 22.10 */ + + value = min_dist.distance & 0x0000FFFF; /* truncate to 6.10 */ + value *= min_dist.sign; + + if ( internal_params.flip_y ) + index = y * width + x; + else + index = ( rows - y - 1 ) * width + x; + + buffer[index] = value; + } + } + + Exit: + return error; + } + +#endif /* 0 */ + + + /************************************************************************** + * + * @Function: + * sdf_generate_bounding_box + * + * @Description: + * This function does basically the same thing as `sdf_generate` above + * but more efficiently. + * + * Instead of checking all pixels against all edges, we loop over all + * edges and only check pixels around the control box of the edge; the + * control box is increased by the spread in all directions. Anything + * outside of the control box that exceeds `spread` doesn't need to be + * computed. + * + * Lastly, to determine the sign of unchecked pixels, we do a single + * pass of all rows starting with a '+' sign and flipping when we come + * across a '-' sign and continue. This also eliminates the possibility + * of overflow because we only check the proximity of the curve. + * Therefore we can use squared distanced safely. + * + * @Input: + * internal_params :: + * Internal parameters and properties required by the rasterizer. + * See @SDF_Params for more. + * + * shape :: + * A complete shape which is used to generate SDF. + * + * spread :: + * Maximum distances to be allowed in the output bitmap. + * + * @Output: + * bitmap :: + * The output bitmap which will contain the SDF information. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + sdf_generate_bounding_box( const SDF_Params internal_params, + const SDF_Shape* shape, + FT_UInt spread, + const FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = NULL; + + FT_Int width, rows, i, j; + FT_Int sp_sq; /* max value to check */ + + SDF_Contour* contours; /* list of all contours */ + FT_SDFFormat* buffer; /* the bitmap buffer */ + + /* This buffer has the same size in indices as the */ + /* bitmap buffer. When we check a pixel position for */ + /* a shortest distance we keep it in this buffer. */ + /* This way we can find out which pixel is set, */ + /* and also determine the signs properly. */ + SDF_Signed_Distance* dists = NULL; + + const FT_16D16 fixed_spread = (FT_16D16)FT_INT_16D16( spread ); + + + if ( !shape || !bitmap ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( spread < MIN_SPREAD || spread > MAX_SPREAD ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + memory = shape->memory; + if ( !memory ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( FT_ALLOC( dists, + bitmap->width * bitmap->rows * sizeof ( *dists ) ) ) + goto Exit; + + contours = shape->contours; + width = (FT_Int)bitmap->width; + rows = (FT_Int)bitmap->rows; + buffer = (FT_SDFFormat*)bitmap->buffer; + + if ( USE_SQUARED_DISTANCES ) + sp_sq = FT_INT_16D16( (FT_Int)( spread * spread ) ); + else + sp_sq = fixed_spread; + + if ( width == 0 || rows == 0 ) + { + FT_TRACE0(( "sdf_generate:" + " Cannot render glyph with width/height == 0\n" )); + FT_TRACE0(( " " + " (width, height provided [%d, %d])", width, rows )); + + error = FT_THROW( Cannot_Render_Glyph ); + goto Exit; + } + + /* loop over all contours */ + while ( contours ) + { + SDF_Edge* edges = contours->edges; + + + /* loop over all edges */ + while ( edges ) + { + FT_CBox cbox; + FT_Int x, y; + + + /* get the control box and increase it by `spread' */ + cbox = get_control_box( *edges ); + + cbox.xMin = ( cbox.xMin - 63 ) / 64 - ( FT_Pos )spread; + cbox.xMax = ( cbox.xMax + 63 ) / 64 + ( FT_Pos )spread; + cbox.yMin = ( cbox.yMin - 63 ) / 64 - ( FT_Pos )spread; + cbox.yMax = ( cbox.yMax + 63 ) / 64 + ( FT_Pos )spread; + + /* now loop over the pixels in the control box. */ + for ( y = cbox.yMin; y < cbox.yMax; y++ ) + { + for ( x = cbox.xMin; x < cbox.xMax; x++ ) + { + FT_26D6_Vec grid_point = zero_vector; + SDF_Signed_Distance dist = max_sdf; + FT_UInt index = 0; + FT_16D16 diff = 0; + + + if ( x < 0 || x >= width ) + continue; + if ( y < 0 || y >= rows ) + continue; + + grid_point.x = FT_INT_26D6( x ); + grid_point.y = FT_INT_26D6( y ); + + /* This `grid_point` is at the corner, but we */ + /* use the center of the pixel. */ + grid_point.x += FT_INT_26D6( 1 ) / 2; + grid_point.y += FT_INT_26D6( 1 ) / 2; + + FT_CALL( sdf_edge_get_min_distance( edges, + grid_point, + &dist ) ); + + if ( internal_params.orientation == FT_ORIENTATION_FILL_LEFT ) + dist.sign = -dist.sign; + + /* ignore if the distance is greater than spread; */ + /* otherwise it creates artifacts due to the wrong sign */ + if ( dist.distance > sp_sq ) + continue; + + /* take the square root of the distance if required */ + if ( USE_SQUARED_DISTANCES ) + dist.distance = square_root( dist.distance ); + + if ( internal_params.flip_y ) + index = (FT_UInt)( y * width + x ); + else + index = (FT_UInt)( ( rows - y - 1 ) * width + x ); + + /* check whether the pixel is set or not */ + if ( dists[index].sign == 0 ) + dists[index] = dist; + else + { + diff = FT_ABS( dists[index].distance - dist.distance ); + + if ( diff <= CORNER_CHECK_EPSILON ) + dists[index] = resolve_corner( dists[index], dist ); + else if ( dists[index].distance > dist.distance ) + dists[index] = dist; + } + } + } + + edges = edges->next; + } + + contours = contours->next; + } + + /* final pass */ + for ( j = 0; j < rows; j++ ) + { + /* We assume the starting pixel of each row is outside. */ + FT_Char current_sign = -1; + FT_UInt index; + + + if ( internal_params.overload_sign != 0 ) + current_sign = internal_params.overload_sign < 0 ? -1 : 1; + + for ( i = 0; i < width; i++ ) + { + index = (FT_UInt)( j * width + i ); + + /* if the pixel is not set */ + /* its shortest distance is more than `spread` */ + if ( dists[index].sign == 0 ) + dists[index].distance = fixed_spread; + else + current_sign = dists[index].sign; + + /* clamp the values */ + if ( dists[index].distance > fixed_spread ) + dists[index].distance = fixed_spread; + + /* flip sign if required */ + dists[index].distance *= internal_params.flip_sign ? -current_sign + : current_sign; + + /* concatenate to appropriate format */ + buffer[index] = map_fixed_to_sdf( dists[index].distance, + fixed_spread ); + } + } + + Exit: + FT_FREE( dists ); + return error; + } + + + /************************************************************************** + * + * @Function: + * sdf_generate_subdivision + * + * @Description: + * Subdivide the shape into a number of straight lines, then use the + * above `sdf_generate_bounding_box` function to generate the SDF. + * + * Note: After calling this function `shape` no longer has the original + * edges, it only contains lines. + * + * @Input: + * internal_params :: + * Internal parameters and properties required by the rasterizer. + * See @SDF_Params for more. + * + * shape :: + * A complete shape which is used to generate SDF. + * + * spread :: + * Maximum distances to be allowed inthe output bitmap. + * + * @Output: + * bitmap :: + * The output bitmap which will contain the SDF information. + * + * @Return: + * FreeType error, 0 means success. + * + */ + static FT_Error + sdf_generate_subdivision( const SDF_Params internal_params, + SDF_Shape* shape, + FT_UInt spread, + const FT_Bitmap* bitmap ) + { + /* + * Thanks to Alexei for providing the idea of this optimization. + * + * We take advantage of two facts. + * + * (1) Computing the shortest distance from a point to a line segment is + * very fast. + * (2) We don't have to compute the shortest distance for the entire + * two-dimensional grid. + * + * Both ideas lead to the following optimization. + * + * (1) Split the outlines into a number of line segments. + * + * (2) For each line segment, only process its neighborhood. + * + * (3) Compute the closest distance to the line only for neighborhood + * grid points. + * + * This greatly reduces the number of grid points to check. + */ + + FT_Error error = FT_Err_Ok; + + + FT_CALL( split_sdf_shape( shape ) ); + FT_CALL( sdf_generate_bounding_box( internal_params, + shape, spread, bitmap ) ); + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * sdf_generate_with_overlaps + * + * @Description: + * This function can be used to generate SDF for glyphs with overlapping + * contours. The function generates SDF for contours separately on + * separate bitmaps (to generate SDF it uses + * `sdf_generate_subdivision`). At the end it simply combines all the + * SDF into the output bitmap; this fixes all the signs and removes + * overlaps. + * + * @Input: + * internal_params :: + * Internal parameters and properties required by the rasterizer. See + * @SDF_Params for more. + * + * shape :: + * A complete shape which is used to generate SDF. + * + * spread :: + * Maximum distances to be allowed in the output bitmap. + * + * @Output: + * bitmap :: + * The output bitmap which will contain the SDF information. + * + * @Return: + * FreeType error, 0 means success. + * + * @Note: + * The function cannot generate a proper SDF for glyphs with + * self-intersecting contours because we cannot separate them into two + * separate bitmaps. In case of self-intersecting contours it is + * necessary to remove the overlaps before generating the SDF. + * + */ + static FT_Error + sdf_generate_with_overlaps( SDF_Params internal_params, + SDF_Shape* shape, + FT_UInt spread, + const FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + + FT_Int num_contours; /* total number of contours */ + FT_Int i, j; /* iterators */ + FT_Int width, rows; /* width and rows of the bitmap */ + FT_Bitmap* bitmaps; /* separate bitmaps for contours */ + + SDF_Contour* contour; /* temporary variable to iterate */ + SDF_Contour* temp_contour; /* temporary contour */ + SDF_Contour* head; /* head of the contour list */ + SDF_Shape temp_shape; /* temporary shape */ + + FT_Memory memory; /* to allocate memory */ + FT_SDFFormat* t; /* target bitmap buffer */ + FT_Bool flip_sign; /* flip sign? */ + + /* orientation of all the separate contours */ + SDF_Contour_Orientation* orientations; + + + bitmaps = NULL; + orientations = NULL; + head = NULL; + + if ( !shape || !bitmap || !shape->memory ) + return FT_THROW( Invalid_Argument ); + + /* Disable `flip_sign` to avoid extra complication */ + /* during the combination phase. */ + flip_sign = internal_params.flip_sign; + internal_params.flip_sign = 0; + + contour = shape->contours; + memory = shape->memory; + temp_shape.memory = memory; + width = (FT_Int)bitmap->width; + rows = (FT_Int)bitmap->rows; + num_contours = 0; + + /* find the number of contours in the shape */ + while ( contour ) + { + num_contours++; + contour = contour->next; + } + + /* allocate the bitmaps to generate SDF for separate contours */ + if ( FT_ALLOC( bitmaps, + (FT_UInt)num_contours * sizeof ( *bitmaps ) ) ) + goto Exit; + + /* allocate array to hold orientation for all contours */ + if ( FT_ALLOC( orientations, + (FT_UInt)num_contours * sizeof ( *orientations ) ) ) + goto Exit; + + contour = shape->contours; + + /* Iterate over all contours and generate SDF separately. */ + for ( i = 0; i < num_contours; i++ ) + { + /* initialize the corresponding bitmap */ + FT_Bitmap_Init( &bitmaps[i] ); + + bitmaps[i].width = bitmap->width; + bitmaps[i].rows = bitmap->rows; + bitmaps[i].pitch = bitmap->pitch; + bitmaps[i].num_grays = bitmap->num_grays; + bitmaps[i].pixel_mode = bitmap->pixel_mode; + + /* allocate memory for the buffer */ + if ( FT_ALLOC( bitmaps[i].buffer, + bitmap->rows * (FT_UInt)bitmap->pitch ) ) + goto Exit; + + /* determine the orientation */ + orientations[i] = get_contour_orientation( contour ); + + /* The `overload_sign` property is specific to */ + /* `sdf_generate_bounding_box`. This basically */ + /* overloads the default sign of the outside */ + /* pixels, which is necessary for */ + /* counter-clockwise contours. */ + if ( orientations[i] == SDF_ORIENTATION_CCW && + internal_params.orientation == FT_ORIENTATION_FILL_RIGHT ) + internal_params.overload_sign = 1; + else if ( orientations[i] == SDF_ORIENTATION_CW && + internal_params.orientation == FT_ORIENTATION_FILL_LEFT ) + internal_params.overload_sign = 1; + else + internal_params.overload_sign = 0; + + /* Make `contour->next` NULL so that there is */ + /* one contour in the list. Also hold the next */ + /* contour in a temporary variable so as to */ + /* restore the original value. */ + temp_contour = contour->next; + contour->next = NULL; + + /* Use `temp_shape` to hold the new contour. */ + /* Now, `temp_shape` has only one contour. */ + temp_shape.contours = contour; + + /* finally generate the SDF */ + FT_CALL( sdf_generate_subdivision( internal_params, + &temp_shape, + spread, + &bitmaps[i] ) ); + + /* Restore the original `next` variable. */ + contour->next = temp_contour; + + /* Since `split_sdf_shape` deallocated the original */ + /* contours list we need to assign the new value to */ + /* the shape's contour. */ + temp_shape.contours->next = head; + head = temp_shape.contours; + + /* Simply flip the orientation in case of post-script fonts */ + /* so as to avoid modificatons in the combining phase. */ + if ( internal_params.orientation == FT_ORIENTATION_FILL_LEFT ) + { + if ( orientations[i] == SDF_ORIENTATION_CW ) + orientations[i] = SDF_ORIENTATION_CCW; + else if ( orientations[i] == SDF_ORIENTATION_CCW ) + orientations[i] = SDF_ORIENTATION_CW; + } + + contour = contour->next; + } + + /* assign the new contour list to `shape->contours` */ + shape->contours = head; + + /* cast the output bitmap buffer */ + t = (FT_SDFFormat*)bitmap->buffer; + + /* Iterate over all pixels and combine all separate */ + /* contours. These are the rules for combining: */ + /* */ + /* (1) For all clockwise contours, compute the largest */ + /* value. Name this as `val_c`. */ + /* (2) For all counter-clockwise contours, compute the */ + /* smallest value. Name this as `val_ac`. */ + /* (3) Now, finally use the smaller value of `val_c' */ + /* and `val_ac'. */ + for ( j = 0; j < rows; j++ ) + { + for ( i = 0; i < width; i++ ) + { + FT_Int id = j * width + i; /* index of current pixel */ + FT_Int c; /* contour iterator */ + + FT_SDFFormat val_c = 0; /* max clockwise value */ + FT_SDFFormat val_ac = UCHAR_MAX; /* min counter-clockwise val */ + + + /* iterate through all the contours */ + for ( c = 0; c < num_contours; c++ ) + { + /* current contour value */ + FT_SDFFormat temp = ( (FT_SDFFormat*)bitmaps[c].buffer )[id]; + + + if ( orientations[c] == SDF_ORIENTATION_CW ) + val_c = FT_MAX( val_c, temp ); /* clockwise */ + else + val_ac = FT_MIN( val_ac, temp ); /* counter-clockwise */ + } + + /* Finally find the smaller of the two and assign to output. */ + /* Also apply `flip_sign` if set. */ + t[id] = FT_MIN( val_c, val_ac ); + + if ( flip_sign ) + t[id] = invert_sign( t[id] ); + } + } + + Exit: + /* deallocate orientations array */ + if ( orientations ) + FT_FREE( orientations ); + + /* deallocate temporary bitmaps */ + if ( bitmaps ) + { + if ( num_contours == 0 ) + error = FT_THROW( Raster_Corrupted ); + else + { + for ( i = 0; i < num_contours; i++ ) + FT_FREE( bitmaps[i].buffer ); + + FT_FREE( bitmaps ); + } + } + + /* restore the `flip_sign` property */ + internal_params.flip_sign = flip_sign; + + return error; + } + + + /************************************************************************** + * + * interface functions + * + */ + + static FT_Error + sdf_raster_new( void* memory_, /* FT_Memory */ + FT_Raster* araster_ ) /* SDF_PRaster* */ + { + FT_Memory memory = (FT_Memory)memory_; + SDF_PRaster* araster = (SDF_PRaster*)araster_; + + + FT_Error error; + SDF_PRaster raster = NULL; + + + if ( !FT_NEW( raster ) ) + raster->memory = memory; + + *araster = raster; + + return error; + } + + + static void + sdf_raster_reset( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ) + { + FT_UNUSED( raster ); + FT_UNUSED( pool_base ); + FT_UNUSED( pool_size ); + } + + + static FT_Error + sdf_raster_set_mode( FT_Raster raster, + unsigned long mode, + void* args ) + { + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( args ); + + return FT_Err_Ok; + } + + + static FT_Error + sdf_raster_render( FT_Raster raster, + const FT_Raster_Params* params ) + { + FT_Error error = FT_Err_Ok; + SDF_TRaster* sdf_raster = (SDF_TRaster*)raster; + FT_Outline* outline = NULL; + const SDF_Raster_Params* sdf_params = (const SDF_Raster_Params*)params; + + FT_Memory memory = NULL; + SDF_Shape* shape = NULL; + SDF_Params internal_params; + + + /* check for valid arguments */ + if ( !sdf_raster || !sdf_params ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + outline = (FT_Outline*)sdf_params->root.source; + + /* check whether outline is valid */ + if ( !outline ) + { + error = FT_THROW( Invalid_Outline ); + goto Exit; + } + + /* if the outline is empty, return */ + if ( outline->n_points <= 0 || outline->n_contours <= 0 ) + goto Exit; + + /* check whether the outline has valid fields */ + if ( !outline->contours || !outline->points ) + { + error = FT_THROW( Invalid_Outline ); + goto Exit; + } + + /* check whether spread is set properly */ + if ( sdf_params->spread > MAX_SPREAD || + sdf_params->spread < MIN_SPREAD ) + { + FT_TRACE0(( "sdf_raster_render:" + " The `spread' field of `SDF_Raster_Params' is invalid,\n" )); + FT_TRACE0(( " " + " the value of this field must be within [%d, %d].\n", + MIN_SPREAD, MAX_SPREAD )); + FT_TRACE0(( " " + " Also, you must pass `SDF_Raster_Params' instead of\n" )); + FT_TRACE0(( " " + " the default `FT_Raster_Params' while calling\n" )); + FT_TRACE0(( " " + " this function and set the fields properly.\n" )); + + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + memory = sdf_raster->memory; + if ( !memory ) + { + FT_TRACE0(( "sdf_raster_render:" + " Raster not setup properly,\n" )); + FT_TRACE0(( " " + " unable to find memory handle.\n" )); + + error = FT_THROW( Invalid_Handle ); + goto Exit; + } + + /* set up the parameters */ + internal_params.orientation = FT_Outline_Get_Orientation( outline ); + internal_params.flip_sign = sdf_params->flip_sign; + internal_params.flip_y = sdf_params->flip_y; + internal_params.overload_sign = 0; + + FT_CALL( sdf_shape_new( memory, &shape ) ); + + FT_CALL( sdf_outline_decompose( outline, shape ) ); + + if ( sdf_params->overlaps ) + FT_CALL( sdf_generate_with_overlaps( internal_params, + shape, sdf_params->spread, + sdf_params->root.target ) ); + else + FT_CALL( sdf_generate_subdivision( internal_params, + shape, sdf_params->spread, + sdf_params->root.target ) ); + + if ( shape ) + sdf_shape_done( &shape ); + + Exit: + return error; + } + + + static void + sdf_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((SDF_TRaster*)raster)->memory; + + + FT_FREE( raster ); + } + + + FT_DEFINE_RASTER_FUNCS( + ft_sdf_raster, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) sdf_raster_new, /* raster_new */ + (FT_Raster_Reset_Func) sdf_raster_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)sdf_raster_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) sdf_raster_render, /* raster_render */ + (FT_Raster_Done_Func) sdf_raster_done /* raster_done */ + ) + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdf.h b/external/freetype/src/sdf/ftsdf.h new file mode 100644 index 000000000..234c075b0 --- /dev/null +++ b/external/freetype/src/sdf/ftsdf.h @@ -0,0 +1,97 @@ +/**************************************************************************** + * + * ftsdf.h + * + * Signed Distance Field support (specification). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSDF_H_ +#define FTSDF_H_ + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/ftimage.h> + +/* common properties and function */ +#include "ftsdfcommon.h" + +FT_BEGIN_HEADER + + /************************************************************************** + * + * @struct: + * SDF_Raster_Params + * + * @description: + * This struct must be passed to the raster render function + * @FT_Raster_RenderFunc instead of @FT_Raster_Params because the + * rasterizer requires some additional information to render properly. + * + * @fields: + * root :: + * The native raster parameters structure. + * + * spread :: + * This is an essential parameter/property required by the renderer. + * `spread` defines the maximum unsigned value that is present in the + * final SDF output. For the default value check file + * `ftsdfcommon.h`. + * + * flip_sign :: + * By default positive values indicate positions inside of contours, + * i.e., filled by a contour. If this property is true then that + * output will be the opposite of the default, i.e., negative values + * indicate positions inside of contours. + * + * flip_y :: + * Setting this parameter to true maked the output image flipped + * along the y-axis. + * + * overlaps :: + * Set this to true to generate SDF for glyphs having overlapping + * contours. The overlapping support is limited to glyphs that do not + * have self-intersecting contours. Also, removing overlaps require a + * considerable amount of extra memory; additionally, it will not work + * if generating SDF from bitmap. + * + * @note: + * All properties are valid for both the 'sdf' and 'bsdf' renderers; the + * exception is `overlaps`, which gets ignored by the 'bsdf' renderer. + * + */ + typedef struct SDF_Raster_Params_ + { + FT_Raster_Params root; + FT_UInt spread; + FT_Bool flip_sign; + FT_Bool flip_y; + FT_Bool overlaps; + + } SDF_Raster_Params; + + + /* rasterizer to convert outline to SDF */ + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_sdf_raster; + + /* rasterizer to convert bitmap to SDF */ + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_bitmap_sdf_raster; + +FT_END_HEADER + +#endif /* FTSDF_H_ */ + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdfcommon.c b/external/freetype/src/sdf/ftsdfcommon.c new file mode 100644 index 000000000..5052201e2 --- /dev/null +++ b/external/freetype/src/sdf/ftsdfcommon.c @@ -0,0 +1,147 @@ +/**************************************************************************** + * + * ftsdfcommon.c + * + * Auxiliary data for Signed Distance Field support (body). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "ftsdf.h" +#include "ftsdfcommon.h" + + + /************************************************************************** + * + * common functions + * + */ + + /* + * Original algorithm: + * + * https://github.com/chmike/fpsqrt + * + * Use this to compute the square root of a 16.16 fixed-point number. + */ + FT_LOCAL_DEF( FT_16D16 ) + square_root( FT_16D16 val ) + { + FT_ULong t, q, b, r; + + + r = (FT_ULong)val; + b = 0x40000000L; + q = 0; + + while ( b > 0x40L ) + { + t = q + b; + + if ( r >= t ) + { + r -= t; + q = t + b; + } + + r <<= 1; + b >>= 1; + } + + q >>= 8; + + return (FT_16D16)q; + } + + + /************************************************************************** + * + * format and sign manipulating functions + * + */ + + /* + * Convert 16.16 fixed-point values to the desired output format. + * In this case we reduce 16.16 fixed-point values to normalized + * 8-bit values. + * + * The `max_value` in the parameter is the maximum value in the + * distance field map and is equal to the spread. We normalize + * the distances using this value instead of computing the maximum + * value for the entire bitmap. + * + * You can use this function to map the 16.16 signed values to any + * format required. Do note that the output buffer is 8-bit, so only + * use an 8-bit format for `FT_SDFFormat`, or increase the buffer size in + * `ftsdfrend.c`. + */ + FT_LOCAL_DEF( FT_SDFFormat ) + map_fixed_to_sdf( FT_16D16 dist, + FT_16D16 max_value ) + { + FT_SDFFormat out; + FT_16D16 udist; + + + /* normalize the distance values */ + dist = FT_DivFix( dist, max_value ); + + udist = dist < 0 ? -dist : dist; + + /* Reduce the distance values to 8 bits. */ + /* */ + /* Since +1/-1 in 16.16 takes the 16th bit, we right-shift */ + /* the number by 9 to make it fit into the 7-bit range. */ + /* */ + /* One bit is reserved for the sign. */ + udist >>= 9; + + /* Since `char` can only store a maximum positive value */ + /* of 127 we need to make sure it does not wrap around and */ + /* give a negative value. */ + if ( dist > 0 && udist > 127 ) + udist = 127; + if ( dist < 0 && udist > 128 ) + udist = 128; + + /* Output the data; negative values are from [0, 127] and positive */ + /* from [128, 255]. One important thing is that negative values */ + /* are inverted here, that means [0, 128] maps to [-128, 0] linearly. */ + /* More on that in `freetype.h` near the documentation of */ + /* `FT_RENDER_MODE_SDF`. */ + out = dist < 0 ? 128 - (FT_SDFFormat)udist + : (FT_SDFFormat)udist + 128; + + return out; + } + + + /* + * Invert the signed distance packed into the corresponding format. + * So if the values are negative they will become positive in the + * chosen format. + * + * [Note]: This function should only be used after converting the + * 16.16 signed distance values to `FT_SDFFormat`. If that + * conversion has not been done, then simply invert the sign + * and use the above function to pack the values. + */ + FT_LOCAL_DEF( FT_SDFFormat ) + invert_sign( FT_SDFFormat dist ) + { + return 255 - dist; + } + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdfcommon.h b/external/freetype/src/sdf/ftsdfcommon.h new file mode 100644 index 000000000..60ca9773e --- /dev/null +++ b/external/freetype/src/sdf/ftsdfcommon.h @@ -0,0 +1,141 @@ +/**************************************************************************** + * + * ftsdfcommon.h + * + * Auxiliary data for Signed Distance Field support (specification). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /**************************************************** + * + * This file contains common functions and properties + * for both the 'sdf' and 'bsdf' renderers. + * + */ + +#ifndef FTSDFCOMMON_H_ +#define FTSDFCOMMON_H_ + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * default values (cannot be set individually for each renderer) + * + */ + + /* default spread value */ +#define DEFAULT_SPREAD 8 + /* minimum spread supported by the renderer */ +#define MIN_SPREAD 2 + /* maximum spread supported by the renderer */ +#define MAX_SPREAD 32 + /* pixel size in 26.6 */ +#define ONE_PIXEL ( 1 << 6 ) + + + /************************************************************************** + * + * common definitions (cannot be set individually for each renderer) + * + */ + + /* If this macro is set to 1 the rasterizer uses squared distances for */ + /* computation. It can greatly improve the performance but there is a */ + /* chance of overflow and artifacts. You can safely use it up to a */ + /* pixel size of 128. */ +#ifndef USE_SQUARED_DISTANCES +#define USE_SQUARED_DISTANCES 0 +#endif + + + /************************************************************************** + * + * common macros + * + */ + + /* convert int to 26.6 fixed-point */ +#define FT_INT_26D6( x ) ( x * 64 ) + /* convert int to 16.16 fixed-point */ +#define FT_INT_16D16( x ) ( x * 65536 ) + /* convert 26.6 to 16.16 fixed-point */ +#define FT_26D6_16D16( x ) ( x * 1024 ) + + + /* Convenience macro to call a function; it */ + /* jumps to label `Exit` if an error occurs. */ +#define FT_CALL( x ) do \ + { \ + error = ( x ); \ + if ( error != FT_Err_Ok ) \ + goto Exit; \ + } while ( 0 ) + + + /* + * The macro `VECTOR_LENGTH_16D16` computes either squared distances or + * actual distances, depending on the value of `USE_SQUARED_DISTANCES`. + * + * By using squared distances the performance can be greatly improved but + * there is a risk of overflow. + */ +#if USE_SQUARED_DISTANCES +#define VECTOR_LENGTH_16D16( v ) ( FT_MulFix( v.x, v.x ) + \ + FT_MulFix( v.y, v.y ) ) +#else +#define VECTOR_LENGTH_16D16( v ) FT_Vector_Length( &v ) +#endif + + + /************************************************************************** + * + * common typedefs + * + */ + + typedef FT_Vector FT_26D6_Vec; /* with 26.6 fixed-point components */ + typedef FT_Vector FT_16D16_Vec; /* with 16.16 fixed-point components */ + + typedef FT_Int32 FT_16D16; /* 16.16 fixed-point representation */ + typedef FT_Int32 FT_26D6; /* 26.6 fixed-point representation */ + typedef FT_Byte FT_SDFFormat; /* format to represent SDF data */ + + typedef FT_BBox FT_CBox; /* control box of a curve */ + + + FT_LOCAL( FT_16D16 ) + square_root( FT_16D16 val ); + + FT_LOCAL( FT_SDFFormat ) + map_fixed_to_sdf( FT_16D16 dist, + FT_16D16 max_value ); + + FT_LOCAL( FT_SDFFormat ) + invert_sign( FT_SDFFormat dist ); + + +FT_END_HEADER + +#endif /* FTSDFCOMMON_H_ */ + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdferrs.h b/external/freetype/src/sdf/ftsdferrs.h new file mode 100644 index 000000000..519db0fc2 --- /dev/null +++ b/external/freetype/src/sdf/ftsdferrs.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * + * ftsdferrs.h + * + * Signed Distance Field error codes (specification only). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSDFERRS_H_ +#define FTSDFERRS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Sdf_Err_ +#define FT_ERR_BASE FT_Mod_Err_Sdf + +#include <freetype/fterrors.h> + +#endif /* FTSDFERRS_H_ */ + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdfrend.c b/external/freetype/src/sdf/ftsdfrend.c new file mode 100644 index 000000000..5610c119f --- /dev/null +++ b/external/freetype/src/sdf/ftsdfrend.c @@ -0,0 +1,603 @@ +/**************************************************************************** + * + * ftsdfrend.c + * + * Signed Distance Field renderer interface (body). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/ftoutln.h> +#include <freetype/ftbitmap.h> +#include "ftsdfrend.h" +#include "ftsdf.h" + +#include "ftsdferrs.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sdf + + + /************************************************************************** + * + * macros and default property values + * + */ +#define SDF_RENDERER( rend ) ( (SDF_Renderer)rend ) + + + /************************************************************************** + * + * for setting properties + * + */ + + /* property setter function */ + static FT_Error + sdf_property_set( FT_Module module, + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + SDF_Renderer render = SDF_RENDERER( FT_RENDERER( module ) ); + + FT_UNUSED( value_is_string ); + + + if ( ft_strcmp( property_name, "spread" ) == 0 ) + { + FT_Int val = *(const FT_Int*)value; + + + if ( val > MAX_SPREAD || val < MIN_SPREAD ) + { + FT_TRACE0(( "[sdf] sdf_property_set:" + " the `spread' property can have a value\n" )); + FT_TRACE0(( " " + " within range [%d, %d] (value provided: %d)\n", + MIN_SPREAD, MAX_SPREAD, val )); + + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + render->spread = (FT_UInt)val; + FT_TRACE7(( "[sdf] sdf_property_set:" + " updated property `spread' to %d\n", val )); + } + + else if ( ft_strcmp( property_name, "flip_sign" ) == 0 ) + { + FT_Int val = *(const FT_Int*)value; + + + render->flip_sign = val ? 1 : 0; + FT_TRACE7(( "[sdf] sdf_property_set:" + " updated property `flip_sign' to %d\n", val )); + } + + else if ( ft_strcmp( property_name, "flip_y" ) == 0 ) + { + FT_Int val = *(const FT_Int*)value; + + + render->flip_y = val ? 1 : 0; + FT_TRACE7(( "[sdf] sdf_property_set:" + " updated property `flip_y' to %d\n", val )); + } + + else if ( ft_strcmp( property_name, "overlaps" ) == 0 ) + { + FT_Bool val = *(const FT_Bool*)value; + + + render->overlaps = val; + FT_TRACE7(( "[sdf] sdf_property_set:" + " updated property `overlaps' to %d\n", val )); + } + + else + { + FT_TRACE0(( "[sdf] sdf_property_set:" + " missing property `%s'\n", property_name )); + error = FT_THROW( Missing_Property ); + } + + Exit: + return error; + } + + + /* property getter function */ + static FT_Error + sdf_property_get( FT_Module module, + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + SDF_Renderer render = SDF_RENDERER( FT_RENDERER( module ) ); + + + if ( ft_strcmp( property_name, "spread" ) == 0 ) + { + FT_UInt* val = (FT_UInt*)value; + + + *val = render->spread; + } + + else if ( ft_strcmp( property_name, "flip_sign" ) == 0 ) + { + FT_Int* val = (FT_Int*)value; + + + *val = render->flip_sign; + } + + else if ( ft_strcmp( property_name, "flip_y" ) == 0 ) + { + FT_Int* val = (FT_Int*)value; + + + *val = render->flip_y; + } + + else if ( ft_strcmp( property_name, "overlaps" ) == 0 ) + { + FT_Int* val = (FT_Int*)value; + + + *val = render->overlaps; + } + + else + { + FT_TRACE0(( "[sdf] sdf_property_get:" + " missing property `%s'\n", property_name )); + error = FT_THROW( Missing_Property ); + } + + return error; + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + sdf_service_properties, + + (FT_Properties_SetFunc)sdf_property_set, /* set_property */ + (FT_Properties_GetFunc)sdf_property_get ) /* get_property */ + + + FT_DEFINE_SERVICEDESCREC1( + sdf_services, + + FT_SERVICE_ID_PROPERTIES, &sdf_service_properties ) + + + static FT_Module_Interface + ft_sdf_requester( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( sdf_services, module_interface ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** OUTLINE TO SDF CONVERTER **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * interface functions + * + */ + + static FT_Error + ft_sdf_init( FT_Module module ) /* SDF_Renderer */ + { + SDF_Renderer sdf_render = SDF_RENDERER( module ); + + + sdf_render->spread = DEFAULT_SPREAD; + sdf_render->flip_sign = 0; + sdf_render->flip_y = 0; + sdf_render->overlaps = 0; + + return FT_Err_Ok; + } + + + static void + ft_sdf_done( FT_Module module ) + { + FT_UNUSED( module ); + } + + + /* generate signed distance field from a glyph's slot image */ + static FT_Error + ft_sdf_render( FT_Renderer module, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error = FT_Err_Ok; + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Memory memory = NULL; + FT_Renderer render = NULL; + + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + + FT_Pos x_pad = 0; + FT_Pos y_pad = 0; + + SDF_Raster_Params params; + SDF_Renderer sdf_module = SDF_RENDERER( module ); + + + render = &sdf_module->root; + memory = render->root.memory; + + /* check whether slot format is correct before rendering */ + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + /* check whether render mode is correct */ + if ( mode != FT_RENDER_MODE_SDF ) + { + error = FT_THROW( Cannot_Render_Glyph ); + goto Exit; + } + + /* deallocate the previously allocated bitmap */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* preset the bitmap using the glyph's outline; */ + /* the sdf bitmap is similar to an anti-aliased bitmap */ + /* with a slightly bigger size and different pixel mode */ + if ( ft_glyphslot_preset_bitmap( slot, FT_RENDER_MODE_NORMAL, origin ) ) + { + error = FT_THROW( Raster_Overflow ); + goto Exit; + } + + /* nothing to render */ + if ( !bitmap->rows || !bitmap->pitch ) + goto Exit; + + /* the padding will simply be equal to the `spread' */ + x_pad = sdf_module->spread; + y_pad = sdf_module->spread; + + /* apply the padding; will be in all the directions */ + bitmap->rows += y_pad * 2; + bitmap->width += x_pad * 2; + + /* ignore the pitch, pixel mode and set custom */ + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->pitch = (int)( bitmap->width ); + bitmap->num_grays = 255; + + /* allocate new buffer */ + if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + slot->bitmap_top += y_pad; + slot->bitmap_left -= x_pad; + + x_shift = 64 * -slot->bitmap_left; + y_shift = 64 * -slot->bitmap_top; + y_shift += 64 * (FT_Int)bitmap->rows; + + if ( origin ) + { + x_shift += origin->x; + y_shift += origin->y; + } + + /* translate outline to render it into the bitmap */ + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, x_shift, y_shift ); + + /* set up parameters */ + params.root.target = bitmap; + params.root.source = outline; + params.root.flags = FT_RASTER_FLAG_SDF; + params.spread = sdf_module->spread; + params.flip_sign = sdf_module->flip_sign; + params.flip_y = sdf_module->flip_y; + params.overlaps = sdf_module->overlaps; + + /* render the outline */ + error = render->raster_render( render->raster, + (const FT_Raster_Params*)&params ); + + /* transform the outline back to the original state */ + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + Exit: + if ( !error ) + { + /* the glyph is successfully rendered to a bitmap */ + slot->format = FT_GLYPH_FORMAT_BITMAP; + } + else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + return error; + } + + + /* transform the glyph using matrix and/or delta */ + static FT_Error + ft_sdf_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the control box of a glyph's outline */ + static void + ft_sdf_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_ZERO( cbox ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* set render specific modes or attributes */ + static FT_Error + ft_sdf_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* pass it to the rasterizer */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + + FT_DEFINE_RENDERER( + ft_sdf_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( SDF_Renderer_Module ), + + "sdf", + 0x10000L, + 0x20000L, + + NULL, + + (FT_Module_Constructor)ft_sdf_init, + (FT_Module_Destructor) ft_sdf_done, + (FT_Module_Requester) ft_sdf_requester, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_sdf_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_sdf_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_sdf_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_sdf_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&ft_sdf_raster /* raster_class */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** BITMAP TO SDF CONVERTER **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /* generate signed distance field from glyph's bitmap */ + static FT_Error + ft_bsdf_render( FT_Renderer module, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = NULL; + + FT_Bitmap* bitmap = &slot->bitmap; + FT_Renderer render = NULL; + FT_Bitmap target; + + FT_Pos x_pad = 0; + FT_Pos y_pad = 0; + + SDF_Raster_Params params; + SDF_Renderer sdf_module = SDF_RENDERER( module ); + + + /* initialize the bitmap in case any error occurs */ + FT_Bitmap_Init( &target ); + + render = &sdf_module->root; + memory = render->root.memory; + + /* check whether slot format is correct before rendering */ + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + /* check whether render mode is correct */ + if ( mode != FT_RENDER_MODE_SDF ) + { + error = FT_THROW( Cannot_Render_Glyph ); + goto Exit; + } + + if ( origin ) + { + FT_ERROR(( "ft_bsdf_render: can't translate the bitmap\n" )); + + error = FT_THROW( Unimplemented_Feature ); + goto Exit; + } + + /* nothing to render */ + if ( !bitmap->rows || !bitmap->pitch ) + goto Exit; + + /* Do not generate SDF if the bitmap is not owned by the */ + /* glyph: it might be that the source buffer is already freed. */ + if ( !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_ERROR(( "ft_bsdf_render: can't generate SDF from" + " unowned source bitmap\n" )); + + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_Bitmap_New( &target ); + + /* padding will simply be equal to `spread` */ + x_pad = sdf_module->spread; + y_pad = sdf_module->spread; + + /* apply padding, which extends to all directions */ + target.rows = bitmap->rows + y_pad * 2; + target.width = bitmap->width + x_pad * 2; + + /* set up the target bitmap */ + target.pixel_mode = FT_PIXEL_MODE_GRAY; + target.pitch = (int)( target.width ); + target.num_grays = 255; + + if ( FT_ALLOC_MULT( target.buffer, target.rows, target.pitch ) ) + goto Exit; + + /* set up parameters */ + params.root.target = &target; + params.root.source = bitmap; + params.root.flags = FT_RASTER_FLAG_SDF; + params.spread = sdf_module->spread; + params.flip_sign = sdf_module->flip_sign; + params.flip_y = sdf_module->flip_y; + + error = render->raster_render( render->raster, + (const FT_Raster_Params*)&params ); + + Exit: + if ( !error ) + { + /* the glyph is successfully converted to a SDF */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( bitmap->buffer ); + + slot->bitmap = target; + slot->bitmap_top += y_pad; + slot->bitmap_left -= x_pad; + + if ( target.buffer ) + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + else if ( target.buffer ) + FT_FREE( target.buffer ); + + return error; + } + + + FT_DEFINE_RENDERER( + ft_bitmap_sdf_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( SDF_Renderer_Module ), + + "bsdf", + 0x10000L, + 0x20000L, + + NULL, + + (FT_Module_Constructor)ft_sdf_init, + (FT_Module_Destructor) ft_sdf_done, + (FT_Module_Requester) ft_sdf_requester, + + FT_GLYPH_FORMAT_BITMAP, + + (FT_Renderer_RenderFunc) ft_bsdf_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_sdf_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_sdf_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_sdf_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&ft_bitmap_sdf_raster /* raster_class */ + ) + + +/* END */ diff --git a/external/freetype/src/sdf/ftsdfrend.h b/external/freetype/src/sdf/ftsdfrend.h new file mode 100644 index 000000000..571ac833d --- /dev/null +++ b/external/freetype/src/sdf/ftsdfrend.h @@ -0,0 +1,118 @@ +/**************************************************************************** + * + * ftsdfrend.h + * + * Signed Distance Field renderer interface (specification). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSDFREND_H_ +#define FTSDFREND_H_ + +#include <freetype/ftrender.h> +#include <freetype/ftmodapi.h> +#include <freetype/internal/ftobjs.h> + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * SDF_Renderer_Module + * + * @description: + * This struct extends the native renderer struct `FT_RendererRec`. It + * is basically used to store various parameters required by the + * renderer and some additional parameters that can be used to tweak the + * output of the renderer. + * + * @fields: + * root :: + * The native rendere struct. + * + * spread :: + * This is an essential parameter/property required by the renderer. + * `spread` defines the maximum unsigned value that is present in the + * final SDF output. For the default value check file + * `ftsdfcommon.h`. + * + * flip_sign :: + * By default positive values indicate positions inside of contours, + * i.e., filled by a contour. If this property is true then that + * output will be the opposite of the default, i.e., negative values + * indicate positions inside of contours. + * + * flip_y :: + * Setting this parameter to true makes the output image flipped + * along the y-axis. + * + * overlaps :: + * Set this to true to generate SDF for glyphs having overlapping + * contours. The overlapping support is limited to glyphs that do not + * have self-intersecting contours. Also, removing overlaps require a + * considerable amount of extra memory; additionally, it will not work + * if generating SDF from bitmap. + * + * @note: + * All properties except `overlaps` are valid for both the 'sdf' and + * 'bsdf' renderers. + * + */ + typedef struct SDF_Renderer_Module_ + { + FT_RendererRec root; + FT_UInt spread; + FT_Bool flip_sign; + FT_Bool flip_y; + FT_Bool overlaps; + + } SDF_Renderer_Module, *SDF_Renderer; + + + /************************************************************************** + * + * @renderer: + * ft_sdf_renderer_class + * + * @description: + * Renderer to convert @FT_Outline to signed distance fields. + * + */ + FT_DECLARE_RENDERER( ft_sdf_renderer_class ) + + + /************************************************************************** + * + * @renderer: + * ft_bitmap_sdf_renderer_class + * + * @description: + * This is not exactly a renderer; it is just a converter that + * transforms bitmaps to signed distance fields. + * + * @note: + * This is not a separate module, it is part of the 'sdf' module. + * + */ + FT_DECLARE_RENDERER( ft_bitmap_sdf_renderer_class ) + + +FT_END_HEADER + +#endif /* FTSDFREND_H_ */ + + +/* END */ diff --git a/external/freetype/src/sdf/module.mk b/external/freetype/src/sdf/module.mk new file mode 100644 index 000000000..e896d20e6 --- /dev/null +++ b/external/freetype/src/sdf/module.mk @@ -0,0 +1,29 @@ +# +# FreeType 2 Signed Distance Field module definition +# + + +# Copyright (C) 2020-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SDF_RENDERER +FTMODULE_H_COMMANDS += BSDF_RENDERER + +define SDF_RENDERER +$(OPEN_DRIVER) FT_Renderer_Class, ft_sdf_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)sdf $(ECHO_DRIVER_DESC)signed distance field renderer$(ECHO_DRIVER_DONE) +endef + +define BSDF_RENDERER +$(OPEN_DRIVER) FT_Renderer_Class, ft_bitmap_sdf_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)bsdf $(ECHO_DRIVER_DESC)bitmap to signed distance field converter$(ECHO_DRIVER_DONE) +endef + +#EOF diff --git a/external/freetype/src/sdf/rules.mk b/external/freetype/src/sdf/rules.mk new file mode 100644 index 000000000..d7742413c --- /dev/null +++ b/external/freetype/src/sdf/rules.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 Signed Distance Field driver configuration rules +# + + +# Copyright (C) 2020-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# sdf driver directory +# +SDF_DIR := $(SRC_DIR)/sdf + + +# compilation flags for the driver +# +SDF_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(SDF_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# sdf driver sources (i.e., C files) +# +SDF_DRV_SRC := $(SDF_DIR)/ftsdfrend.c \ + $(SDF_DIR)/ftsdf.c \ + $(SDF_DIR)/ftbsdf.c \ + $(SDF_DIR)/ftsdfcommon.c + + +# sdf driver headers +# +SDF_DRV_H := $(SDF_DIR)/ftsdfrend.h \ + $(SDF_DIR)/ftsdf.h \ + $(SDF_DIR)/ftsdferrs.h \ + $(SDF_DIR)/ftsdfcommon.h + + +# sdf driver object(s) +# +# SDF_DRV_OBJ_M is used during `multi' builds. +# SDF_DRV_OBJ_S is used during `single' builds. +# +SDF_DRV_OBJ_M := $(SDF_DRV_SRC:$(SDF_DIR)/%.c=$(OBJ_DIR)/%.$O) +SDF_DRV_OBJ_S := $(OBJ_DIR)/sdf.$O + + +# sdf driver source file for single build +# +SDF_DRV_SRC_S := $(SDF_DIR)/sdf.c + + +# sdf driver - single object +# +$(SDF_DRV_OBJ_S): $(SDF_DRV_SRC_S) $(SDF_DRV_SRC) \ + $(FREETYPE_H) $(SDF_DRV_H) + $(SDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SDF_DRV_SRC_S)) + + +# sdf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SDF_DIR)/%.c $(FREETYPE_H) $(SDF_DRV_H) + $(SDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver list +# +DRV_OBJS_S += $(SDF_DRV_OBJ_S) +DRV_OBJS_M += $(SDF_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/sdf/sdf.c b/external/freetype/src/sdf/sdf.c new file mode 100644 index 000000000..c159b0812 --- /dev/null +++ b/external/freetype/src/sdf/sdf.c @@ -0,0 +1,29 @@ +/**************************************************************************** + * + * sdf.c + * + * FreeType Signed Distance Field renderer module component (body only). + * + * Copyright (C) 2020-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Written by Anuj Verma. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftsdfrend.c" +#include "ftsdfcommon.c" +#include "ftbsdf.c" +#include "ftsdf.c" + + +/* END */ diff --git a/external/freetype/src/sfnt/module.mk b/external/freetype/src/sfnt/module.mk new file mode 100644 index 000000000..4491a1b22 --- /dev/null +++ b/external/freetype/src/sfnt/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 SFNT module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SFNT_MODULE + +define SFNT_MODULE +$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/sfnt/pngshim.c b/external/freetype/src/sfnt/pngshim.c new file mode 100644 index 000000000..33712162e --- /dev/null +++ b/external/freetype/src/sfnt/pngshim.c @@ -0,0 +1,462 @@ +/**************************************************************************** + * + * pngshim.c + * + * PNG Bitmap glyph support. + * + * Copyright (C) 2013-2023 by + * Google, Inc. + * Written by Stuart Gill and Behdad Esfahbod. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#if defined( TT_CONFIG_OPTION_EMBEDDED_BITMAPS ) && \ + defined( FT_CONFIG_OPTION_USE_PNG ) + + /* We always include <setjmp.h>, so make libpng shut up! */ +#define PNG_SKIP_SETJMP_CHECK 1 +#include <png.h> +#include "pngshim.h" + +#include "sferrors.h" + + + /* This code is freely based on cairo-png.c. There's so many ways */ + /* to call libpng, and the way cairo does it is defacto standard. */ + + static unsigned int + multiply_alpha( unsigned int alpha, + unsigned int color ) + { + unsigned int temp = alpha * color + 0x80; + + + return ( temp + ( temp >> 8 ) ) >> 8; + } + + + /* Premultiplies data and converts RGBA bytes => BGRA. */ + static void + premultiply_data( png_structp png, + png_row_infop row_info, + png_bytep data ) + { + unsigned int i = 0, limit; + + /* The `vector_size' attribute was introduced in gcc 3.1, which */ + /* predates clang; the `__BYTE_ORDER__' preprocessor symbol was */ + /* introduced in gcc 4.6 and clang 3.2, respectively. */ + /* `__builtin_shuffle' for gcc was introduced in gcc 4.7.0. */ + /* */ + /* Intel compilers do not currently support __builtin_shuffle; */ + + /* The Intel check must be first. */ +#if !defined( __INTEL_COMPILER ) && \ + ( ( defined( __GNUC__ ) && \ + ( ( __GNUC__ >= 5 ) || \ + ( ( __GNUC__ == 4 ) && ( __GNUC_MINOR__ >= 7 ) ) ) ) || \ + ( defined( __clang__ ) && \ + ( ( __clang_major__ >= 4 ) || \ + ( ( __clang_major__ == 3 ) && ( __clang_minor__ >= 2 ) ) ) ) ) && \ + defined( __OPTIMIZE__ ) && \ + defined( __SSE__ ) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + +#ifdef __clang__ + /* the clang documentation doesn't cover the two-argument case of */ + /* `__builtin_shufflevector'; however, it is is implemented since */ + /* version 2.8 */ +#define vector_shuffle __builtin_shufflevector +#else +#define vector_shuffle __builtin_shuffle +#endif + + typedef unsigned short v82 __attribute__(( vector_size( 16 ) )); + + + if ( row_info->rowbytes > 15 ) + { + /* process blocks of 16 bytes in one rush, which gives a nice speed-up */ + limit = row_info->rowbytes - 16 + 1; + for ( ; i < limit; i += 16 ) + { + unsigned char* base = &data[i]; + + v82 s, s0, s1, a; + + /* clang <= 3.9 can't apply scalar values to vectors */ + /* (or rather, it needs a different syntax) */ + v82 n0x80 = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; + v82 n0xFF = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + v82 n8 = { 8, 8, 8, 8, 8, 8, 8, 8 }; + + v82 ma = { 1, 1, 3, 3, 5, 5, 7, 7 }; + v82 o1 = { 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF }; + v82 m0 = { 1, 0, 3, 2, 5, 4, 7, 6 }; + + + ft_memcpy( &s, base, 16 ); /* RGBA RGBA RGBA RGBA */ + s0 = s & n0xFF; /* R B R B R B R B */ + s1 = s >> n8; /* G A G A G A G A */ + + a = vector_shuffle( s1, ma ); /* A A A A A A A A */ + s1 |= o1; /* G 1 G 1 G 1 G 1 */ + s0 = vector_shuffle( s0, m0 ); /* B R B R B R B R */ + + s0 *= a; + s1 *= a; + s0 += n0x80; + s1 += n0x80; + s0 = ( s0 + ( s0 >> n8 ) ) >> n8; + s1 = ( s1 + ( s1 >> n8 ) ) >> n8; + + s = s0 | ( s1 << n8 ); + ft_memcpy( base, &s, 16 ); + } + } +#endif /* use `vector_size' */ + + FT_UNUSED( png ); + + limit = row_info->rowbytes; + for ( ; i < limit; i += 4 ) + { + unsigned char* base = &data[i]; + unsigned int alpha = base[3]; + + + if ( alpha == 0 ) + base[0] = base[1] = base[2] = base[3] = 0; + + else + { + unsigned int red = base[0]; + unsigned int green = base[1]; + unsigned int blue = base[2]; + + + if ( alpha != 0xFF ) + { + red = multiply_alpha( alpha, red ); + green = multiply_alpha( alpha, green ); + blue = multiply_alpha( alpha, blue ); + } + + base[0] = (unsigned char)blue; + base[1] = (unsigned char)green; + base[2] = (unsigned char)red; + base[3] = (unsigned char)alpha; + } + } + } + + + /* Converts RGBx bytes to BGRA. */ + static void + convert_bytes_to_data( png_structp png, + png_row_infop row_info, + png_bytep data ) + { + unsigned int i; + + FT_UNUSED( png ); + + + for ( i = 0; i < row_info->rowbytes; i += 4 ) + { + unsigned char* base = &data[i]; + unsigned int red = base[0]; + unsigned int green = base[1]; + unsigned int blue = base[2]; + + + base[0] = (unsigned char)blue; + base[1] = (unsigned char)green; + base[2] = (unsigned char)red; + base[3] = 0xFF; + } + } + + + /* Use error callback to avoid png writing to stderr. */ + static void + error_callback( png_structp png, + png_const_charp error_msg ) + { + FT_Error* error = (FT_Error*)png_get_error_ptr( png ); + + FT_UNUSED( error_msg ); + + + *error = FT_THROW( Out_Of_Memory ); +#ifdef PNG_SETJMP_SUPPORTED + ft_longjmp( png_jmpbuf( png ), 1 ); +#endif + /* if we get here, then we have no choice but to abort ... */ + } + + + /* Use warning callback to avoid png writing to stderr. */ + static void + warning_callback( png_structp png, + png_const_charp error_msg ) + { + FT_UNUSED( png ); + FT_UNUSED( error_msg ); + + /* Just ignore warnings. */ + } + + + static void + read_data_from_FT_Stream( png_structp png, + png_bytep data, + png_size_t length ) + { + FT_Error error; + png_voidp p = png_get_io_ptr( png ); + FT_Stream stream = (FT_Stream)p; + + + if ( FT_FRAME_ENTER( length ) ) + { + FT_Error* e = (FT_Error*)png_get_error_ptr( png ); + + + *e = FT_THROW( Invalid_Stream_Read ); + png_error( png, NULL ); + + /* return; (never reached) */ + } + + ft_memcpy( data, stream->cursor, length ); + + FT_FRAME_EXIT(); + } + + + FT_LOCAL_DEF( FT_Error ) + Load_SBit_Png( FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + TT_SBit_Metrics metrics, + FT_Memory memory, + FT_Byte* data, + FT_UInt png_len, + FT_Bool populate_map_and_metrics, + FT_Bool metrics_only ) + { + FT_Bitmap *map = &slot->bitmap; + FT_Error error = FT_Err_Ok; + FT_StreamRec stream; + + png_structp png; + png_infop info; + png_uint_32 imgWidth, imgHeight; + + int bitdepth, color_type, interlace; + FT_Int i; + + /* `rows` gets modified within a 'setjmp' scope; */ + /* we thus need the `volatile` keyword. */ + png_byte* *volatile rows = NULL; + + + if ( x_offset < 0 || + y_offset < 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( !populate_map_and_metrics && + ( (FT_UInt)x_offset + metrics->width > map->width || + (FT_UInt)y_offset + metrics->height > map->rows || + pix_bits != 32 || + map->pixel_mode != FT_PIXEL_MODE_BGRA ) ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_Stream_OpenMemory( &stream, data, png_len ); + + png = png_create_read_struct( PNG_LIBPNG_VER_STRING, + &error, + error_callback, + warning_callback ); + if ( !png ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + + info = png_create_info_struct( png ); + if ( !info ) + { + error = FT_THROW( Out_Of_Memory ); + png_destroy_read_struct( &png, NULL, NULL ); + goto Exit; + } + + if ( ft_setjmp( png_jmpbuf( png ) ) ) + { + error = FT_THROW( Invalid_File_Format ); + goto DestroyExit; + } + + png_set_read_fn( png, &stream, read_data_from_FT_Stream ); + + png_read_info( png, info ); + png_get_IHDR( png, info, + &imgWidth, &imgHeight, + &bitdepth, &color_type, &interlace, + NULL, NULL ); + + if ( error || + ( !populate_map_and_metrics && + ( (FT_Int)imgWidth != metrics->width || + (FT_Int)imgHeight != metrics->height ) ) ) + goto DestroyExit; + + if ( populate_map_and_metrics ) + { + /* reject too large bitmaps similarly to the rasterizer */ + if ( imgHeight > 0x7FFF || imgWidth > 0x7FFF ) + { + error = FT_THROW( Array_Too_Large ); + goto DestroyExit; + } + + metrics->width = (FT_UShort)imgWidth; + metrics->height = (FT_UShort)imgHeight; + + map->width = metrics->width; + map->rows = metrics->height; + map->pixel_mode = FT_PIXEL_MODE_BGRA; + map->pitch = (int)( map->width * 4 ); + map->num_grays = 256; + } + + /* convert palette/gray image to rgb */ + if ( color_type == PNG_COLOR_TYPE_PALETTE ) + png_set_palette_to_rgb( png ); + + /* expand gray bit depth if needed */ + if ( color_type == PNG_COLOR_TYPE_GRAY ) + { +#if PNG_LIBPNG_VER >= 10209 + png_set_expand_gray_1_2_4_to_8( png ); +#else + png_set_gray_1_2_4_to_8( png ); +#endif + } + + /* transform transparency to alpha */ + if ( png_get_valid( png, info, PNG_INFO_tRNS ) ) + png_set_tRNS_to_alpha( png ); + + if ( bitdepth == 16 ) + png_set_strip_16( png ); + + if ( bitdepth < 8 ) + png_set_packing( png ); + + /* convert grayscale to RGB */ + if ( color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA ) + png_set_gray_to_rgb( png ); + + if ( interlace != PNG_INTERLACE_NONE ) + png_set_interlace_handling( png ); + + png_set_filler( png, 0xFF, PNG_FILLER_AFTER ); + + /* recheck header after setting EXPAND options */ + png_read_update_info( png, info ); + png_get_IHDR( png, info, + &imgWidth, &imgHeight, + &bitdepth, &color_type, &interlace, + NULL, NULL ); + + if ( bitdepth != 8 || + !( color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA ) ) + { + error = FT_THROW( Invalid_File_Format ); + goto DestroyExit; + } + + if ( metrics_only ) + goto DestroyExit; + + switch ( color_type ) + { + default: /* Shouldn't happen, but ... */ + case PNG_COLOR_TYPE_RGB_ALPHA: + png_set_read_user_transform_fn( png, premultiply_data ); + break; + + case PNG_COLOR_TYPE_RGB: + /* Humm, this smells. Carry on though. */ + png_set_read_user_transform_fn( png, convert_bytes_to_data ); + break; + } + + if ( populate_map_and_metrics ) + { + /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */ + FT_ULong size = map->rows * (FT_ULong)map->pitch; + + + error = ft_glyphslot_alloc_bitmap( slot, size ); + if ( error ) + goto DestroyExit; + } + + if ( FT_QNEW_ARRAY( rows, imgHeight ) ) + { + error = FT_THROW( Out_Of_Memory ); + goto DestroyExit; + } + + for ( i = 0; i < (FT_Int)imgHeight; i++ ) + rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4; + + png_read_image( png, rows ); + + png_read_end( png, info ); + + DestroyExit: + /* even if reading fails with longjmp, rows must be freed */ + FT_FREE( rows ); + png_destroy_read_struct( &png, &info, NULL ); + FT_Stream_Close( &stream ); + + Exit: + return error; + } + +#else /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ + + /* ANSI C doesn't like empty source files */ + typedef int pngshim_dummy_; + +#endif /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ + + +/* END */ diff --git a/external/freetype/src/sfnt/pngshim.h b/external/freetype/src/sfnt/pngshim.h new file mode 100644 index 000000000..903bd2bc3 --- /dev/null +++ b/external/freetype/src/sfnt/pngshim.h @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * pngshim.h + * + * PNG Bitmap glyph support. + * + * Copyright (C) 2013-2023 by + * Google, Inc. + * Written by Stuart Gill and Behdad Esfahbod. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef PNGSHIM_H_ +#define PNGSHIM_H_ + + +#include "ttload.h" + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_USE_PNG + + FT_LOCAL( FT_Error ) + Load_SBit_Png( FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + TT_SBit_Metrics metrics, + FT_Memory memory, + FT_Byte* data, + FT_UInt png_len, + FT_Bool populate_map_and_metrics, + FT_Bool metrics_only ); + +#endif + +FT_END_HEADER + +#endif /* PNGSHIM_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/rules.mk b/external/freetype/src/sfnt/rules.mk new file mode 100644 index 000000000..4d2d7e8d8 --- /dev/null +++ b/external/freetype/src/sfnt/rules.mk @@ -0,0 +1,86 @@ +# +# FreeType 2 SFNT driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# SFNT driver directory +# +SFNT_DIR := $(SRC_DIR)/sfnt + + +# compilation flags for the driver +# +SFNT_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# SFNT driver sources (i.e., C files) +# +SFNT_DRV_SRC := $(SFNT_DIR)/pngshim.c \ + $(SFNT_DIR)/sfdriver.c \ + $(SFNT_DIR)/sfobjs.c \ + $(SFNT_DIR)/sfwoff.c \ + $(SFNT_DIR)/sfwoff2.c \ + $(SFNT_DIR)/ttbdf.c \ + $(SFNT_DIR)/ttcmap.c \ + $(SFNT_DIR)/ttcolr.c \ + $(SFNT_DIR)/ttsvg.c \ + $(SFNT_DIR)/ttcpal.c \ + $(SFNT_DIR)/ttkern.c \ + $(SFNT_DIR)/ttload.c \ + $(SFNT_DIR)/ttmtx.c \ + $(SFNT_DIR)/ttpost.c \ + $(SFNT_DIR)/ttsbit.c \ + $(SFNT_DIR)/woff2tags.c + +# SFNT driver headers +# +SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \ + $(SFNT_DIR)/sferrors.h + + +# SFNT driver object(s) +# +# SFNT_DRV_OBJ_M is used during `multi' builds. +# SFNT_DRV_OBJ_S is used during `single' builds. +# +SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O + +# SFNT driver source file for single build +# +SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c + + +# SFNT driver - single object +# +$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \ + $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S)) + + +# SFNT driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SFNT_DRV_OBJ_S) +DRV_OBJS_M += $(SFNT_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/sfnt/sfdriver.c b/external/freetype/src/sfnt/sfdriver.c new file mode 100644 index 000000000..0925940b0 --- /dev/null +++ b/external/freetype/src/sfnt/sfdriver.c @@ -0,0 +1,1369 @@ +/**************************************************************************** + * + * sfdriver.c + * + * High-level SFNT driver interface (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/sfnt.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ttnameid.h> + +#include "sfdriver.h" +#include "ttload.h" +#include "sfobjs.h" + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.h" +#endif + +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS +#include "ttcolr.h" +#include "ttcpal.h" +#endif + +#ifdef FT_CONFIG_OPTION_SVG +#include "ttsvg.h" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.h" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include <freetype/internal/services/svbdf.h> +#endif + +#include "ttcmap.h" +#include "ttkern.h" +#include "ttmtx.h" + +#include <freetype/internal/services/svgldict.h> +#include <freetype/internal/services/svpostnm.h> +#include <freetype/internal/services/svsfnt.h> +#include <freetype/internal/services/svttcmap.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/ftmm.h> +#include <freetype/internal/services/svmm.h> +#endif + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sfdriver + + + /* + * SFNT TABLE SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + sfnt_load_table( FT_Face face, /* TT_Face */ + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + TT_Face ttface = (TT_Face)face; + + + return tt_face_load_any( ttface, tag, offset, buffer, length ); + } + + + FT_CALLBACK_DEF( void* ) + get_sfnt_table( FT_Face face, /* TT_Face */ + FT_Sfnt_Tag tag ) + { + TT_Face ttface = (TT_Face)face; + + void* table; + + + switch ( tag ) + { + case FT_SFNT_HEAD: + table = &ttface->header; + break; + + case FT_SFNT_HHEA: + table = &ttface->horizontal; + break; + + case FT_SFNT_VHEA: + table = ttface->vertical_info ? &ttface->vertical : NULL; + break; + + case FT_SFNT_OS2: + table = ( ttface->os2.version == 0xFFFFU ) ? NULL : &ttface->os2; + break; + + case FT_SFNT_POST: + table = &ttface->postscript; + break; + + case FT_SFNT_MAXP: + table = &ttface->max_profile; + break; + + case FT_SFNT_PCLT: + table = ttface->pclt.Version ? &ttface->pclt : NULL; + break; + + default: + table = NULL; + } + + return table; + } + + + FT_CALLBACK_DEF( FT_Error ) + sfnt_table_info( FT_Face face, /* TT_Face */ + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ) + { + TT_Face ttface = (TT_Face)face; + + + if ( !offset || !length ) + return FT_THROW( Invalid_Argument ); + + if ( !tag ) + *length = ttface->num_tables; + else + { + if ( idx >= ttface->num_tables ) + return FT_THROW( Table_Missing ); + + *tag = ttface->dir_tables[idx].Tag; + *offset = ttface->dir_tables[idx].Offset; + *length = ttface->dir_tables[idx].Length; + } + + return FT_Err_Ok; + } + + + FT_DEFINE_SERVICE_SFNT_TABLEREC( + sfnt_service_sfnt_table, + + sfnt_load_table, /* FT_SFNT_TableLoadFunc load_table */ + get_sfnt_table, /* FT_SFNT_TableGetFunc get_table */ + sfnt_table_info /* FT_SFNT_TableInfoFunc table_info */ + ) + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + /* + * GLYPH DICT SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + sfnt_get_glyph_name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + FT_Error error; + + + error = tt_face_get_ps_name( (TT_Face)face, glyph_index, &gname ); + if ( !error ) + FT_STRCPYN( buffer, gname, buffer_max ); + + return error; + } + + + FT_CALLBACK_DEF( FT_UInt ) + sfnt_get_name_index( FT_Face face, + const FT_String* glyph_name ) + { + TT_Face ttface = (TT_Face)face; + + FT_UInt i, max_gid = FT_UINT_MAX; + + + if ( face->num_glyphs < 0 ) + return 0; + else if ( (FT_ULong)face->num_glyphs < FT_UINT_MAX ) + max_gid = (FT_UInt)face->num_glyphs; + else + FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08lx\n", + FT_UINT_MAX, face->num_glyphs )); + + for ( i = 0; i < max_gid; i++ ) + { + FT_String* gname; + FT_Error error = tt_face_get_ps_name( ttface, i, &gname ); + + + if ( error ) + continue; + + if ( !ft_strcmp( glyph_name, gname ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC( + sfnt_service_glyph_dict, + + sfnt_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */ + sfnt_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */ + ) + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + /* an array representing allowed ASCII characters in a PS string */ + static const unsigned char sfnt_ps_map[16] = + { + /* 4 0 C 8 */ + 0x00, 0x00, /* 0x00: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ + 0x00, 0x00, /* 0x10: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ + 0xDE, 0x7C, /* 0x20: 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 */ + 0xFF, 0xAF, /* 0x30: 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 */ + 0xFF, 0xFF, /* 0x40: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 */ + 0xFF, 0xD7, /* 0x50: 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 */ + 0xFF, 0xFF, /* 0x60: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 */ + 0xFF, 0x57 /* 0x70: 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 */ + }; + + + static int + sfnt_is_postscript( int c ) + { + unsigned int cc; + + + if ( c < 0 || c >= 0x80 ) + return 0; + + cc = (unsigned int)c; + + return sfnt_ps_map[cc >> 3] & ( 1 << ( cc & 0x07 ) ); + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* Only ASCII letters and digits are taken for a variation font */ + /* instance's PostScript name. */ + /* */ + /* `ft_isalnum' is a macro, but we need a function here, thus */ + /* this definition. */ + static int + sfnt_is_alphanumeric( int c ) + { + return ft_isalnum( c ); + } + + + /* the implementation of MurmurHash3 is taken and adapted from */ + /* https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp */ + +#define ROTL32( x, r ) ( x << r ) | ( x >> ( 32 - r ) ) + + + static FT_UInt32 + fmix32( FT_UInt32 h ) + { + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; + } + + + static void + murmur_hash_3_128( const void* key, + const unsigned int len, + FT_UInt32 seed, + void* out ) + { + const FT_Byte* data = (const FT_Byte*)key; + const int nblocks = (int)len / 16; + + FT_UInt32 h1 = seed; + FT_UInt32 h2 = seed; + FT_UInt32 h3 = seed; + FT_UInt32 h4 = seed; + + const FT_UInt32 c1 = 0x239b961b; + const FT_UInt32 c2 = 0xab0e9789; + const FT_UInt32 c3 = 0x38b34ae5; + const FT_UInt32 c4 = 0xa1e38b93; + + const FT_UInt32* blocks = (const FT_UInt32*)( data + nblocks * 16 ); + + int i; + + + for( i = -nblocks; i; i++ ) + { + FT_UInt32 k1 = blocks[i * 4 + 0]; + FT_UInt32 k2 = blocks[i * 4 + 1]; + FT_UInt32 k3 = blocks[i * 4 + 2]; + FT_UInt32 k4 = blocks[i * 4 + 3]; + + + k1 *= c1; + k1 = ROTL32( k1, 15 ); + k1 *= c2; + h1 ^= k1; + + h1 = ROTL32( h1, 19 ); + h1 += h2; + h1 = h1 * 5 + 0x561ccd1b; + + k2 *= c2; + k2 = ROTL32( k2, 16 ); + k2 *= c3; + h2 ^= k2; + + h2 = ROTL32( h2, 17 ); + h2 += h3; + h2 = h2 * 5 + 0x0bcaa747; + + k3 *= c3; + k3 = ROTL32( k3, 17 ); + k3 *= c4; + h3 ^= k3; + + h3 = ROTL32( h3, 15 ); + h3 += h4; + h3 = h3 * 5 + 0x96cd1c35; + + k4 *= c4; + k4 = ROTL32( k4, 18 ); + k4 *= c1; + h4 ^= k4; + + h4 = ROTL32( h4, 13 ); + h4 += h1; + h4 = h4 * 5 + 0x32ac3b17; + } + + { + const FT_Byte* tail = (const FT_Byte*)( data + nblocks * 16 ); + + FT_UInt32 k1 = 0; + FT_UInt32 k2 = 0; + FT_UInt32 k3 = 0; + FT_UInt32 k4 = 0; + + + switch ( len & 15 ) + { + case 15: + k4 ^= (FT_UInt32)tail[14] << 16; + FALL_THROUGH; + case 14: + k4 ^= (FT_UInt32)tail[13] << 8; + FALL_THROUGH; + case 13: + k4 ^= (FT_UInt32)tail[12]; + k4 *= c4; + k4 = ROTL32( k4, 18 ); + k4 *= c1; + h4 ^= k4; + FALL_THROUGH; + + case 12: + k3 ^= (FT_UInt32)tail[11] << 24; + FALL_THROUGH; + case 11: + k3 ^= (FT_UInt32)tail[10] << 16; + FALL_THROUGH; + case 10: + k3 ^= (FT_UInt32)tail[9] << 8; + FALL_THROUGH; + case 9: + k3 ^= (FT_UInt32)tail[8]; + k3 *= c3; + k3 = ROTL32( k3, 17 ); + k3 *= c4; + h3 ^= k3; + FALL_THROUGH; + + case 8: + k2 ^= (FT_UInt32)tail[7] << 24; + FALL_THROUGH; + case 7: + k2 ^= (FT_UInt32)tail[6] << 16; + FALL_THROUGH; + case 6: + k2 ^= (FT_UInt32)tail[5] << 8; + FALL_THROUGH; + case 5: + k2 ^= (FT_UInt32)tail[4]; + k2 *= c2; + k2 = ROTL32( k2, 16 ); + k2 *= c3; + h2 ^= k2; + FALL_THROUGH; + + case 4: + k1 ^= (FT_UInt32)tail[3] << 24; + FALL_THROUGH; + case 3: + k1 ^= (FT_UInt32)tail[2] << 16; + FALL_THROUGH; + case 2: + k1 ^= (FT_UInt32)tail[1] << 8; + FALL_THROUGH; + case 1: + k1 ^= (FT_UInt32)tail[0]; + k1 *= c1; + k1 = ROTL32( k1, 15 ); + k1 *= c2; + h1 ^= k1; + } + } + + h1 ^= len; + h2 ^= len; + h3 ^= len; + h4 ^= len; + + h1 += h2; + h1 += h3; + h1 += h4; + + h2 += h1; + h3 += h1; + h4 += h1; + + h1 = fmix32( h1 ); + h2 = fmix32( h2 ); + h3 = fmix32( h3 ); + h4 = fmix32( h4 ); + + h1 += h2; + h1 += h3; + h1 += h4; + + h2 += h1; + h3 += h1; + h4 += h1; + + ((FT_UInt32*)out)[0] = h1; + ((FT_UInt32*)out)[1] = h2; + ((FT_UInt32*)out)[2] = h3; + ((FT_UInt32*)out)[3] = h4; + } + + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + typedef int (*char_type_func)( int c ); + + + /* Handling of PID/EID 3/0 and 3/1 is the same. */ +#define IS_WIN( n ) ( (n)->platformID == 3 && \ + ( (n)->encodingID == 1 || (n)->encodingID == 0 ) ) + +#define IS_APPLE( n ) ( (n)->platformID == 1 && \ + (n)->encodingID == 0 ) + + static char* + get_win_string( FT_Memory memory, + FT_Stream stream, + TT_Name entry, + char_type_func char_type, + FT_Bool report_invalid_characters ) + { + FT_Error error; + + char* result = NULL; + FT_String* r; + FT_Char* p; + FT_UInt len; + + + if ( FT_QALLOC( result, entry->stringLength / 2 + 1 ) ) + return NULL; + + if ( FT_STREAM_SEEK( entry->stringOffset ) || + FT_FRAME_ENTER( entry->stringLength ) ) + goto get_win_string_error; + + r = (FT_String*)result; + p = (FT_Char*)stream->cursor; + + for ( len = entry->stringLength / 2; len > 0; len--, p += 2 ) + { + if ( p[0] == 0 && char_type( p[1] ) ) + *r++ = p[1]; + else + { + if ( report_invalid_characters ) + FT_TRACE0(( "get_win_string:" + " Character 0x%X invalid in PS name string\n", + ((unsigned)p[0])*256 + (unsigned)p[1] )); + continue; + } + } + *r = '\0'; + + FT_FRAME_EXIT(); + + if ( r != result ) + return result; + + get_win_string_error: + FT_FREE( result ); + + entry->stringLength = 0; + entry->stringOffset = 0; + FT_FREE( entry->string ); + + return NULL; + } + + + static char* + get_apple_string( FT_Memory memory, + FT_Stream stream, + TT_Name entry, + char_type_func char_type, + FT_Bool report_invalid_characters ) + { + FT_Error error; + + char* result = NULL; + FT_String* r; + FT_Char* p; + FT_UInt len; + + + if ( FT_QALLOC( result, entry->stringLength + 1 ) ) + return NULL; + + if ( FT_STREAM_SEEK( entry->stringOffset ) || + FT_FRAME_ENTER( entry->stringLength ) ) + goto get_apple_string_error; + + r = (FT_String*)result; + p = (FT_Char*)stream->cursor; + + for ( len = entry->stringLength; len > 0; len--, p++ ) + { + if ( char_type( *p ) ) + *r++ = *p; + else + { + if ( report_invalid_characters ) + FT_TRACE0(( "get_apple_string:" + " Character `%c' (0x%X) invalid in PS name string\n", + *p, *p )); + continue; + } + } + *r = '\0'; + + FT_FRAME_EXIT(); + + if ( r != result ) + return result; + + get_apple_string_error: + FT_FREE( result ); + + entry->stringOffset = 0; + entry->stringLength = 0; + FT_FREE( entry->string ); + + return NULL; + } + + + FT_CALLBACK_DEF( FT_Bool ) + sfnt_get_name_id( TT_Face face, + FT_UShort id, + FT_Int *win, + FT_Int *apple ) + { + FT_Int n; + + + *win = -1; + *apple = -1; + + for ( n = 0; n < face->num_names; n++ ) + { + TT_Name name = face->name_table.names + n; + + + if ( name->nameID == id && name->stringLength > 0 ) + { + if ( IS_WIN( name ) && ( name->languageID == 0x409 || *win == -1 ) ) + *win = n; + + if ( IS_APPLE( name ) && ( name->languageID == 0 || *apple == -1 ) ) + *apple = n; + } + } + + return ( *win >= 0 ) || ( *apple >= 0 ); + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* + The maximum length of an axis value descriptor. + + We need 65536 different values for the decimal fraction; this fits + nicely into five decimal places. Consequently, it consists of + + . the minus sign if the number is negative, + . up to five characters for the digits before the decimal point, + . the decimal point if there is a fractional part, and + . up to five characters for the digits after the decimal point. + + We also need one byte for the leading `_' character and up to four + bytes for the axis tag. + */ +#define MAX_VALUE_DESCRIPTOR_LEN ( 1 + 5 + 1 + 5 + 1 + 4 ) + + + /* the maximum length of PostScript font names */ +#define MAX_PS_NAME_LEN 127 + + + /* + * Find the shortest decimal representation of a 16.16 fixed-point + * number. The function fills `buf' with the result, returning a pointer + * to the position after the representation's last byte. + */ + + static char* + fixed2float( FT_Int fixed, + char* buf ) + { + char* p; + char* q; + char tmp[5]; + + FT_Int int_part; + FT_Int frac_part; + + FT_Int i; + + + p = buf; + + if ( fixed == 0 ) + { + *p++ = '0'; + return p; + } + + if ( fixed < 0 ) + { + *p++ = '-'; + fixed = NEG_INT( fixed ); + } + + int_part = ( fixed >> 16 ) & 0xFFFF; + frac_part = fixed & 0xFFFF; + + /* get digits of integer part (in reverse order) */ + q = tmp; + while ( int_part > 0 ) + { + *q++ = '0' + int_part % 10; + int_part /= 10; + } + + /* copy digits in correct order to buffer */ + while ( q > tmp ) + *p++ = *--q; + + if ( !frac_part ) + return p; + + /* save position of point */ + q = p; + *p++ = '.'; + + /* apply rounding */ + frac_part = frac_part * 10 + 5; + + /* get digits of fractional part */ + for ( i = 0; i < 5; i++ ) + { + *p++ = '0' + (char)( frac_part / 0x10000L ); + + frac_part %= 0x10000L; + if ( !frac_part ) + break; + + frac_part *= 10; + } + + /* + If the remainder stored in `frac_part' (after the last FOR loop) is + smaller than 34480*10, the resulting decimal value minus 0.00001 is + an equivalent representation of `fixed'. + + The above FOR loop always finds the larger of the two values; I + verified this by iterating over all possible fixed-point numbers. + + If the remainder is 17232*10, both values are equally good, and we + take the next even number (following IEEE 754's `round to nearest, + ties to even' rounding rule). + + If the remainder is smaller than 17232*10, the lower of the two + numbers is nearer to the exact result (values 17232 and 34480 were + also found by testing all possible fixed-point values). + + We use this to find a shorter decimal representation. If not ending + with digit zero, we take the representation with less error. + */ + p--; + if ( p - q == 5 ) /* five digits? */ + { + /* take the representation that has zero as the last digit */ + if ( frac_part < 34480 * 10 && + *p == '1' ) + *p = '0'; + + /* otherwise use the one with less error */ + else if ( frac_part == 17232 * 10 && + *p & 1 ) + *p -= 1; + + else if ( frac_part < 17232 * 10 && + *p != '0' ) + *p -= 1; + } + + /* remove trailing zeros */ + while ( *p == '0' ) + *p-- = '\0'; + + return p + 1; + } + + + static const char hexdigits[16] = + { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + + static const char* + sfnt_get_var_ps_name( TT_Face face ) + { + FT_Error error; + FT_Memory memory = face->root.memory; + + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + FT_UInt num_coords; + FT_Fixed* coords; + FT_MM_Var* mm_var; + + FT_Int found, win, apple; + FT_UInt i, j; + + char* result = NULL; + char* p; + + + if ( !face->var_postscript_prefix ) + { + FT_UInt len; + + + /* check whether we have a Variations PostScript Name Prefix */ + found = sfnt_get_name_id( face, + TT_NAME_ID_VARIATIONS_PREFIX, + &win, + &apple ); + if ( !found ) + { + /* otherwise use the typographic family name */ + found = sfnt_get_name_id( face, + TT_NAME_ID_TYPOGRAPHIC_FAMILY, + &win, + &apple ); + } + + if ( !found ) + { + /* according to the 'name' documentation in the OpenType */ + /* specification the font family name is to be used if the */ + /* typographic family name is missing, so let's do that */ + found = sfnt_get_name_id( face, + TT_NAME_ID_FONT_FAMILY, + &win, + &apple ); + } + + if ( !found ) + { + FT_TRACE0(( "sfnt_get_var_ps_name:" + " Can't construct PS name prefix for font instances\n" )); + return NULL; + } + + /* prefer Windows entries over Apple */ + if ( win != -1 ) + result = get_win_string( face->root.memory, + face->name_table.stream, + face->name_table.names + win, + sfnt_is_alphanumeric, + 0 ); + if ( !result && apple != -1 ) + result = get_apple_string( face->root.memory, + face->name_table.stream, + face->name_table.names + apple, + sfnt_is_alphanumeric, + 0 ); + + if ( !result ) + { + FT_TRACE0(( "sfnt_get_var_ps_name:" + " No valid PS name prefix for font instances found\n" )); + /* XXX It probably makes sense to never let this fail */ + /* since an arbitrary prefix should work, too. */ + /* On the other hand, it is very unlikely that */ + /* we ever reach this code at all. */ + return NULL; + } + + len = ft_strlen( result ); + + /* sanitize if necessary; we reserve space for 36 bytes (a 128bit */ + /* checksum as a hex number, preceded by `-' and followed by three */ + /* ASCII dots, to be used if the constructed PS name would be too */ + /* long); this is also sufficient for a single instance */ + if ( len > MAX_PS_NAME_LEN - ( 1 + 32 + 3 ) ) + { + len = MAX_PS_NAME_LEN - ( 1 + 32 + 3 ); + result[len] = '\0'; + + FT_TRACE0(( "sfnt_get_var_ps_name:" + " Shortening variation PS name prefix\n" )); + FT_TRACE0(( " " + " to %d characters\n", len )); + } + + face->var_postscript_prefix = result; + face->var_postscript_prefix_len = len; + } + + mm->get_var_blend( FT_FACE( face ), + &num_coords, + &coords, + NULL, + &mm_var ); + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) && + !FT_IS_VARIATION( FT_FACE( face ) ) ) + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_Long instance = ( ( face->root.face_index & 0x7FFF0000L ) >> 16 ) - 1; + FT_UInt psid = mm_var->namedstyle[instance].psid; + + char* ps_name = NULL; + + + /* try first to load the name string with index `postScriptNameID' */ + if ( psid == 6 || + ( psid > 255 && psid < 32768 ) ) + (void)sfnt->get_name( face, (FT_UShort)psid, &ps_name ); + + if ( ps_name ) + { + result = ps_name; + p = result + ft_strlen( result ) + 1; + + goto check_length; + } + else + { + /* otherwise construct a name using `subfamilyNameID' */ + FT_UInt strid = mm_var->namedstyle[instance].strid; + + char* subfamily_name; + char* s; + + + (void)sfnt->get_name( face, (FT_UShort)strid, &subfamily_name ); + + if ( !subfamily_name ) + { + FT_TRACE1(( "sfnt_get_var_ps_name:" + " can't construct named instance PS name;\n" )); + FT_TRACE1(( " " + " trying to construct normal instance PS name\n" )); + goto construct_instance_name; + } + + /* after the prefix we have character `-' followed by the */ + /* subfamily name (using only characters a-z, A-Z, and 0-9) */ + if ( FT_QALLOC( result, face->var_postscript_prefix_len + + 1 + ft_strlen( subfamily_name ) + 1 ) ) + return NULL; + + ft_strcpy( result, face->var_postscript_prefix ); + + p = result + face->var_postscript_prefix_len; + *p++ = '-'; + + s = subfamily_name; + while ( *s ) + { + if ( ft_isalnum( *s ) ) + *p++ = *s; + s++; + } + *p++ = '\0'; + + FT_FREE( subfamily_name ); + } + } + else + { + FT_Var_Axis* axis; + + + construct_instance_name: + axis = mm_var->axis; + + if ( FT_QALLOC( result, + face->var_postscript_prefix_len + + num_coords * MAX_VALUE_DESCRIPTOR_LEN + 1 ) ) + return NULL; + + p = result; + + ft_strcpy( p, face->var_postscript_prefix ); + p += face->var_postscript_prefix_len; + + for ( i = 0; i < num_coords; i++, coords++, axis++ ) + { + char t; + + + /* omit axis value descriptor if it is identical */ + /* to the default axis value */ + if ( *coords == axis->def ) + continue; + + *p++ = '_'; + p = fixed2float( *coords, p ); + + t = (char)( axis->tag >> 24 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)( axis->tag >> 16 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)( axis->tag >> 8 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)axis->tag; + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + } + *p++ = '\0'; + } + + check_length: + if ( p - result > MAX_PS_NAME_LEN ) + { + /* the PS name is too long; replace the part after the prefix with */ + /* a checksum; we use MurmurHash 3 with a hash length of 128 bit */ + + FT_UInt32 seed = 123456789; + + FT_UInt32 hash[4]; + FT_UInt32* h; + + + murmur_hash_3_128( result, p - result, seed, hash ); + + p = result + face->var_postscript_prefix_len; + *p++ = '-'; + + /* we convert the hash value to hex digits from back to front */ + p += 32 + 3; + h = hash + 3; + + *p-- = '\0'; + *p-- = '.'; + *p-- = '.'; + *p-- = '.'; + + for ( i = 0; i < 4; i++, h-- ) + { + FT_UInt32 v = *h; + + + for ( j = 0; j < 8; j++ ) + { + *p-- = hexdigits[v & 0xF]; + v >>= 4; + } + } + } + + return result; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + FT_CALLBACK_DEF( const char* ) + sfnt_get_ps_name( FT_Face face ) /* TT_Face */ + { + TT_Face ttface = (TT_Face)face; + + FT_Int found, win, apple; + const char* result = NULL; + + + if ( ttface->postscript_name ) + return ttface->postscript_name; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( ttface->blend && + ( FT_IS_NAMED_INSTANCE( face ) || + FT_IS_VARIATION( face ) ) ) + { + ttface->postscript_name = sfnt_get_var_ps_name( ttface ); + return ttface->postscript_name; + } +#endif + + /* scan the name table to see whether we have a Postscript name here, */ + /* either in Macintosh or Windows platform encodings */ + found = sfnt_get_name_id( ttface, TT_NAME_ID_PS_NAME, &win, &apple ); + if ( !found ) + return NULL; + + /* prefer Windows entries over Apple */ + if ( win != -1 ) + result = get_win_string( FT_FACE_MEMORY( face ), + ttface->name_table.stream, + ttface->name_table.names + win, + sfnt_is_postscript, + 1 ); + if ( !result && apple != -1 ) + result = get_apple_string( FT_FACE_MEMORY( face ), + ttface->name_table.stream, + ttface->name_table.names + apple, + sfnt_is_postscript, + 1 ); + + ttface->postscript_name = result; + + return result; + } + + + FT_DEFINE_SERVICE_PSFONTNAMEREC( + sfnt_service_ps_name, + + sfnt_get_ps_name /* FT_PsName_GetFunc get_ps_font_name */ + ) + + + /* + * TT CMAP INFO + */ + FT_DEFINE_SERVICE_TTCMAPSREC( + tt_service_get_cmap_info, + + tt_get_cmap_info /* TT_CMap_Info_GetFunc get_cmap_info */ + ) + + +#ifdef TT_CONFIG_OPTION_BDF + + static FT_Error + sfnt_get_charset_id( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + BDF_PropertyRec encoding, registry; + FT_Error error; + + + /* XXX: I don't know whether this is correct, since + * tt_face_find_bdf_prop only returns something correct if we have + * previously selected a size that is listed in the BDF table. + * Should we change the BDF table format to include single offsets + * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? + */ + error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry ); + if ( !error ) + { + error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); + if ( !error ) + { + if ( registry.type == BDF_PROPERTY_TYPE_ATOM && + encoding.type == BDF_PROPERTY_TYPE_ATOM ) + { + *acharset_encoding = encoding.u.atom; + *acharset_registry = registry.u.atom; + } + else + error = FT_THROW( Invalid_Argument ); + } + } + + return error; + } + + + FT_DEFINE_SERVICE_BDFRec( + sfnt_service_bdf, + + sfnt_get_charset_id, /* FT_BDF_GetCharsetIdFunc get_charset_id */ + tt_face_find_bdf_prop /* FT_BDF_GetPropertyFunc get_property */ + ) + + +#endif /* TT_CONFIG_OPTION_BDF */ + + + /* + * SERVICE LIST + */ + +#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC5( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name, + FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict, + FT_SERVICE_ID_BDF, &sfnt_service_bdf, + FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info ) +#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_DEFINE_SERVICEDESCREC4( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name, + FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict, + FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info ) +#elif defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC4( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name, + FT_SERVICE_ID_BDF, &sfnt_service_bdf, + FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info ) +#else + FT_DEFINE_SERVICEDESCREC3( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name, + FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + sfnt_get_interface( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( sfnt_services, module_interface ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define PUT_EMBEDDED_BITMAPS( a ) a +#else +#define PUT_EMBEDDED_BITMAPS( a ) NULL +#endif + +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS +#define PUT_COLOR_LAYERS( a ) a +#else +#define PUT_COLOR_LAYERS( a ) NULL +#endif + +#ifdef FT_CONFIG_OPTION_SVG +#define PUT_SVG_SUPPORT( a ) a +#else +#define PUT_SVG_SUPPORT( a ) NULL +#endif + +#define PUT_COLOR_LAYERS_V1( a ) PUT_COLOR_LAYERS( a ) + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES( a ) a +#else +#define PUT_PS_NAMES( a ) NULL +#endif + + FT_DEFINE_SFNT_INTERFACE( + sfnt_interface, + + tt_face_goto_table, /* TT_Loader_GotoTableFunc goto_table */ + + sfnt_init_face, /* TT_Init_Face_Func init_face */ + sfnt_load_face, /* TT_Load_Face_Func load_face */ + sfnt_done_face, /* TT_Done_Face_Func done_face */ + sfnt_get_interface, /* FT_Module_Requester get_interface */ + + tt_face_load_any, /* TT_Load_Any_Func load_any */ + + tt_face_load_head, /* TT_Load_Table_Func load_head */ + tt_face_load_hhea, /* TT_Load_Metrics_Func load_hhea */ + tt_face_load_cmap, /* TT_Load_Table_Func load_cmap */ + tt_face_load_maxp, /* TT_Load_Table_Func load_maxp */ + tt_face_load_os2, /* TT_Load_Table_Func load_os2 */ + tt_face_load_post, /* TT_Load_Table_Func load_post */ + + tt_face_load_name, /* TT_Load_Table_Func load_name */ + tt_face_free_name, /* TT_Free_Table_Func free_name */ + + tt_face_load_kern, /* TT_Load_Table_Func load_kern */ + tt_face_load_gasp, /* TT_Load_Table_Func load_gasp */ + tt_face_load_pclt, /* TT_Load_Table_Func load_init */ + + /* see `ttload.h' */ + PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ), + /* TT_Load_Table_Func load_bhed */ + PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ), + /* TT_Load_SBit_Image_Func load_sbit_image */ + + /* see `ttpost.h' */ + PUT_PS_NAMES( tt_face_get_ps_name ), + /* TT_Get_PS_Name_Func get_psname */ + PUT_PS_NAMES( tt_face_free_ps_names ), + /* TT_Free_Table_Func free_psnames */ + + /* since version 2.1.8 */ + tt_face_get_kerning, /* TT_Face_GetKerningFunc get_kerning */ + + /* since version 2.2 */ + tt_face_load_font_dir, /* TT_Load_Table_Func load_font_dir */ + tt_face_load_hmtx, /* TT_Load_Metrics_Func load_hmtx */ + + /* see `ttsbit.h' and `sfnt.h' */ + PUT_EMBEDDED_BITMAPS( tt_face_load_sbit ), + /* TT_Load_Table_Func load_eblc */ + PUT_EMBEDDED_BITMAPS( tt_face_free_sbit ), + /* TT_Free_Table_Func free_eblc */ + + PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ), + /* TT_Set_SBit_Strike_Func set_sbit_strike */ + PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ), + /* TT_Load_Strike_Metrics_Func load_strike_metrics */ + + PUT_COLOR_LAYERS( tt_face_load_cpal ), + /* TT_Load_Table_Func load_cpal */ + PUT_COLOR_LAYERS( tt_face_load_colr ), + /* TT_Load_Table_Func load_colr */ + PUT_COLOR_LAYERS( tt_face_free_cpal ), + /* TT_Free_Table_Func free_cpal */ + PUT_COLOR_LAYERS( tt_face_free_colr ), + /* TT_Free_Table_Func free_colr */ + PUT_COLOR_LAYERS( tt_face_palette_set ), + /* TT_Set_Palette_Func set_palette */ + PUT_COLOR_LAYERS( tt_face_get_colr_layer ), + /* TT_Get_Colr_Layer_Func get_colr_layer */ + + PUT_COLOR_LAYERS_V1( tt_face_get_colr_glyph_paint ), + /* TT_Get_Color_Glyph_Paint_Func get_colr_glyph_paint */ + PUT_COLOR_LAYERS_V1( tt_face_get_color_glyph_clipbox ), + /* TT_Get_Color_Glyph_ClipBox_Func get_clipbox */ + PUT_COLOR_LAYERS_V1( tt_face_get_paint_layers ), + /* TT_Get_Paint_Layers_Func get_paint_layers */ + PUT_COLOR_LAYERS_V1( tt_face_get_colorline_stops ), + /* TT_Get_Paint get_paint */ + PUT_COLOR_LAYERS_V1( tt_face_get_paint ), + /* TT_Get_Colorline_Stops_Func get_colorline_stops */ + + PUT_COLOR_LAYERS( tt_face_colr_blend_layer ), + /* TT_Blend_Colr_Func colr_blend */ + + tt_face_get_metrics, /* TT_Get_Metrics_Func get_metrics */ + + tt_face_get_name, /* TT_Get_Name_Func get_name */ + sfnt_get_name_id, /* TT_Get_Name_ID_Func get_name_id */ + + PUT_SVG_SUPPORT( tt_face_load_svg ), + /* TT_Load_Table_Func load_svg */ + PUT_SVG_SUPPORT( tt_face_free_svg ), + /* TT_Free_Table_Func free_svg */ + PUT_SVG_SUPPORT( tt_face_load_svg_doc ) + /* TT_Load_Svg_Doc_Func load_svg_doc */ + ) + + + FT_DEFINE_MODULE( + sfnt_module_class, + + 0, /* not a font driver or renderer */ + sizeof ( FT_ModuleRec ), + + "sfnt", /* driver name */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or higher */ + + (const void*)&sfnt_interface, /* module specific interface */ + + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + sfnt_get_interface /* FT_Module_Requester get_interface */ + ) + + +/* END */ diff --git a/external/freetype/src/sfnt/sfdriver.h b/external/freetype/src/sfnt/sfdriver.h new file mode 100644 index 000000000..2445958b6 --- /dev/null +++ b/external/freetype/src/sfnt/sfdriver.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * sfdriver.h + * + * High-level SFNT driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFDRIVER_H_ +#define SFDRIVER_H_ + + +#include <freetype/ftmodapi.h> + + +FT_BEGIN_HEADER + + FT_DECLARE_MODULE( sfnt_module_class ) + +FT_END_HEADER + +#endif /* SFDRIVER_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/sferrors.h b/external/freetype/src/sfnt/sferrors.h new file mode 100644 index 000000000..e7a8eb04b --- /dev/null +++ b/external/freetype/src/sfnt/sferrors.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * sferrors.h + * + * SFNT error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the SFNT error enumeration constants. + * + */ + +#ifndef SFERRORS_H_ +#define SFERRORS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX SFNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_SFNT + +#include <freetype/fterrors.h> + +#endif /* SFERRORS_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/sfnt.c b/external/freetype/src/sfnt/sfnt.c new file mode 100644 index 000000000..8e4f08a90 --- /dev/null +++ b/external/freetype/src/sfnt/sfnt.c @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * sfnt.c + * + * Single object library component. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "pngshim.c" +#include "sfdriver.c" +#include "sfobjs.c" +#include "sfwoff.c" +#include "sfwoff2.c" +#include "ttbdf.c" +#include "ttcmap.c" +#include "ttcolr.c" +#include "ttcpal.c" +#include "ttsvg.c" + +#include "ttkern.c" +#include "ttload.c" +#include "ttmtx.c" +#include "ttpost.c" +#include "ttsbit.c" +#include "woff2tags.c" + + +/* END */ diff --git a/external/freetype/src/sfnt/sfobjs.c b/external/freetype/src/sfnt/sfobjs.c new file mode 100644 index 000000000..f5d66ef84 --- /dev/null +++ b/external/freetype/src/sfnt/sfobjs.c @@ -0,0 +1,1535 @@ +/**************************************************************************** + * + * sfobjs.c + * + * SFNT object management (base). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "sfobjs.h" +#include "ttload.h" +#include "ttcmap.h" +#include "ttkern.h" +#include "sfwoff.h" +#include "sfwoff2.h" +#include <freetype/internal/sfnt.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/ttnameid.h> +#include <freetype/tttags.h> +#include <freetype/internal/services/svpscmap.h> +#include <freetype/ftsnames.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/internal/services/svmm.h> +#include <freetype/internal/services/svmetric.h> +#endif + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#endif + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sfobjs + + + + /* convert a UTF-16 name entry to ASCII */ + static FT_String* + tt_name_ascii_from_utf16( TT_Name entry, + FT_Memory memory ) + { + FT_String* string = NULL; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength / 2; + + if ( FT_QNEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = FT_NEXT_USHORT( read ); + + if ( code == 0 ) + break; + + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[n] = 0; + + return string; + } + + + /* convert an Apple Roman or symbol name entry to ASCII */ + static FT_String* + tt_name_ascii_from_other( TT_Name entry, + FT_Memory memory ) + { + FT_String* string = NULL; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength; + + if ( FT_QNEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = *read++; + + if ( code == 0 ) + break; + + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[n] = 0; + + return string; + } + + + typedef FT_String* (*TT_Name_ConvertFunc)( TT_Name entry, + FT_Memory memory ); + + + /* documentation is in sfnt.h */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ) + { + FT_Memory memory = face->root.memory; + FT_Error error = FT_Err_Ok; + FT_String* result = NULL; + FT_UShort n; + TT_Name rec; + + FT_Int found_apple = -1; + FT_Int found_apple_roman = -1; + FT_Int found_apple_english = -1; + FT_Int found_win = -1; + FT_Int found_unicode = -1; + + FT_Bool is_english = 0; + + TT_Name_ConvertFunc convert; + + + FT_ASSERT( name ); + + rec = face->name_table.names; + for ( n = 0; n < face->num_names; n++, rec++ ) + { + /* According to the OpenType 1.3 specification, only Microsoft or */ + /* Apple platform IDs might be used in the `name' table. The */ + /* `Unicode' platform is reserved for the `cmap' table, and the */ + /* `ISO' one is deprecated. */ + /* */ + /* However, the Apple TrueType specification doesn't say the same */ + /* thing and goes to suggest that all Unicode `name' table entries */ + /* should be coded in UTF-16 (in big-endian format I suppose). */ + /* */ + if ( rec->nameID == nameid && rec->stringLength > 0 ) + { + switch ( rec->platformID ) + { + case TT_PLATFORM_APPLE_UNICODE: + case TT_PLATFORM_ISO: + /* there is `languageID' to check there. We should use this */ + /* field only as a last solution when nothing else is */ + /* available. */ + /* */ + found_unicode = n; + break; + + case TT_PLATFORM_MACINTOSH: + /* This is a bit special because some fonts will use either */ + /* an English language id, or a Roman encoding id, to indicate */ + /* the English version of its font name. */ + /* */ + if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) + found_apple_english = n; + else if ( rec->encodingID == TT_MAC_ID_ROMAN ) + found_apple_roman = n; + break; + + case TT_PLATFORM_MICROSOFT: + /* we only take a non-English name when there is nothing */ + /* else available in the font */ + /* */ + if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) + { + switch ( rec->encodingID ) + { + case TT_MS_ID_SYMBOL_CS: + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_UCS_4: + is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); + found_win = n; + break; + + default: + ; + } + } + break; + + default: + ; + } + } + } + + found_apple = found_apple_roman; + if ( found_apple_english >= 0 ) + found_apple = found_apple_english; + + /* some fonts contain invalid Unicode or Macintosh formatted entries; */ + /* we will thus favor names encoded in Windows formats if available */ + /* (provided it is an English name) */ + /* */ + convert = NULL; + if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) + { + rec = face->name_table.names + found_win; + switch ( rec->encodingID ) + { + /* all Unicode strings are encoded using UTF-16BE */ + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_SYMBOL_CS: + convert = tt_name_ascii_from_utf16; + break; + + case TT_MS_ID_UCS_4: + /* Apparently, if this value is found in a name table entry, it is */ + /* documented as `full Unicode repertoire'. Experience with the */ + /* MsGothic font shipped with Windows Vista shows that this really */ + /* means UTF-16 encoded names (UCS-4 values are only used within */ + /* charmaps). */ + convert = tt_name_ascii_from_utf16; + break; + + default: + ; + } + } + else if ( found_apple >= 0 ) + { + rec = face->name_table.names + found_apple; + convert = tt_name_ascii_from_other; + } + else if ( found_unicode >= 0 ) + { + rec = face->name_table.names + found_unicode; + convert = tt_name_ascii_from_utf16; + } + + if ( rec && convert ) + { + if ( !rec->string ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || + FT_STREAM_SEEK( rec->stringOffset ) || + FT_STREAM_READ( rec->string, rec->stringLength ) ) + { + FT_FREE( rec->string ); + rec->stringLength = 0; + result = NULL; + goto Exit; + } + } + + result = convert( rec, memory ); + } + + Exit: + *name = result; + return error; + } + + + static FT_Encoding + sfnt_find_encoding( int platform_id, + int encoding_id ) + { + typedef struct TEncoding_ + { + int platform_id; + int encoding_id; + FT_Encoding encoding; + + } TEncoding; + + static + const TEncoding tt_encodings[] = + { + { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, + + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_PRC, FT_ENCODING_PRC }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } + }; + + const TEncoding *cur, *limit; + + + cur = tt_encodings; + limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); + + for ( ; cur < limit; cur++ ) + { + if ( cur->platform_id == platform_id ) + { + if ( cur->encoding_id == encoding_id || + cur->encoding_id == -1 ) + return cur->encoding; + } + } + + return FT_ENCODING_NONE; + } + + + /* Fill in face->ttc_header. If the font is not a TTC, it is */ + /* synthesized into a TTC with one offset table. */ + static FT_Error + sfnt_open_font( FT_Stream stream, + TT_Face face, + FT_Int* face_instance_index, + FT_Long* woff2_num_faces ) + { + FT_Memory memory = stream->memory; + FT_Error error; + FT_ULong tag, offset; + + static const FT_Frame_Field ttc_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TTC_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_LONG( version ), + FT_FRAME_LONG( count ), /* this is ULong in the specs */ + FT_FRAME_END + }; + +#ifndef FT_CONFIG_OPTION_USE_BROTLI + FT_UNUSED( face_instance_index ); + FT_UNUSED( woff2_num_faces ); +#endif + + + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; + +#if defined( FT_CONFIG_OPTION_USE_ZLIB ) || \ + defined( FT_CONFIG_OPTION_USE_BROTLI ) + retry: +#endif + + offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( tag ) ) + return error; + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + if ( tag == TTAG_wOFF ) + { + FT_TRACE2(( "sfnt_open_font: file is a WOFF; synthesizing SFNT\n" )); + + if ( FT_STREAM_SEEK( offset ) ) + return error; + + error = woff_open_font( stream, face ); + if ( error ) + return error; + + /* Swap out stream and retry! */ + stream = face->root.stream; + goto retry; + } +#endif + +#ifdef FT_CONFIG_OPTION_USE_BROTLI + if ( tag == TTAG_wOF2 ) + { + FT_TRACE2(( "sfnt_open_font: file is a WOFF2; synthesizing SFNT\n" )); + + if ( FT_STREAM_SEEK( offset ) ) + return error; + + error = woff2_open_font( stream, + face, + face_instance_index, + woff2_num_faces ); + if ( error ) + return error; + + /* Swap out stream and retry! */ + stream = face->root.stream; + goto retry; + } +#endif + + if ( tag != 0x00010000UL && + tag != TTAG_ttcf && + tag != TTAG_OTTO && + tag != TTAG_true && + tag != TTAG_typ1 && + tag != TTAG_0xA5kbd && + tag != TTAG_0xA5lst && + tag != 0x00020000UL ) + { + FT_TRACE2(( " not a font using the SFNT container format\n" )); + return FT_THROW( Unknown_File_Format ); + } + + face->ttc_header.tag = TTAG_ttcf; + + if ( tag == TTAG_ttcf ) + { + FT_Int n; + + + FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); + + if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) + return error; + + FT_TRACE3(( " with %ld subfonts\n", + face->ttc_header.count )); + + if ( face->ttc_header.count == 0 ) + return FT_THROW( Invalid_Table ); + + /* a rough size estimate: let's conservatively assume that there */ + /* is just a single table info in each subfont header (12 + 16*1 = */ + /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */ + /* size of the TTC header plus `28*count' bytes for all subfont */ + /* headers */ + if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) ) + return FT_THROW( Array_Too_Large ); + + /* now read the offsets of each font in the file */ + if ( FT_QNEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) + return error; + + if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) + return error; + + for ( n = 0; n < face->ttc_header.count; n++ ) + face->ttc_header.offsets[n] = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + } + else + { + FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); + + face->ttc_header.version = 1 << 16; + face->ttc_header.count = 1; + + if ( FT_QNEW( face->ttc_header.offsets ) ) + return error; + + face->ttc_header.offsets[0] = offset; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library = face->root.driver->root.library; + SFNT_Service sfnt; + FT_Int face_index; + FT_Long woff2_num_faces = 0; + + + /* for now, parameters are unused */ + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + sfnt = (SFNT_Service)face->sfnt; + if ( !sfnt ) + { + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + { + FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" )); + return FT_THROW( Missing_Module ); + } + + face->sfnt = sfnt; + face->goto_table = sfnt->goto_table; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( !face->mm ) + { + /* we want the MM interface from the `truetype' module only */ + FT_Module tt_module = FT_Get_Module( library, "truetype" ); + + + face->mm = ft_module_get_service( tt_module, + FT_SERVICE_ID_MULTI_MASTERS, + 0 ); + } + + if ( !face->tt_var ) + { + /* we want the metrics variations interface */ + /* from the `truetype' module only */ + FT_Module tt_module = FT_Get_Module( library, "truetype" ); + + + face->tt_var = ft_module_get_service( tt_module, + FT_SERVICE_ID_METRICS_VARIATIONS, + 0 ); + } + + if ( !face->face_var ) + face->face_var = ft_module_get_service( + &face->root.driver->root, + FT_SERVICE_ID_METRICS_VARIATIONS, + 0 ); +#endif + + FT_TRACE2(( "SFNT driver\n" )); + + error = sfnt_open_font( stream, + face, + &face_instance_index, + &woff2_num_faces ); + if ( error ) + return error; + + /* Stream may have changed in sfnt_open_font. */ + stream = face->root.stream; + + FT_TRACE2(( "sfnt_init_face: %p (index %d)\n", + (void *)face, + face_instance_index )); + + face_index = FT_ABS( face_instance_index ) & 0xFFFF; + + /* value -(N+1) requests information on index N */ + if ( face_instance_index < 0 && face_index > 0 ) + face_index--; + + if ( face_index >= face->ttc_header.count ) + { + if ( face_instance_index >= 0 ) + return FT_THROW( Invalid_Argument ); + else + face_index = 0; + } + + if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) + return error; + + /* check whether we have a valid TrueType file */ + error = sfnt->load_font_dir( face, stream ); + if ( error ) + return error; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Memory memory = face->root.memory; + + FT_ULong fvar_len; + + FT_ULong version; + FT_ULong offset; + + FT_UShort num_axes; + FT_UShort axis_size; + FT_UShort num_instances; + FT_UShort instance_size; + + FT_Int instance_index; + + FT_Byte* default_values = NULL; + FT_Byte* instance_values = NULL; + + + instance_index = FT_ABS( face_instance_index ) >> 16; + + /* test whether current face is a GX font with named instances */ + if ( face->goto_table( face, TTAG_fvar, stream, &fvar_len ) || + fvar_len < 20 || + FT_READ_ULONG( version ) || + FT_READ_USHORT( offset ) || + FT_STREAM_SKIP( 2 ) /* reserved */ || + FT_READ_USHORT( num_axes ) || + FT_READ_USHORT( axis_size ) || + FT_READ_USHORT( num_instances ) || + FT_READ_USHORT( instance_size ) ) + { + version = 0; + offset = 0; + num_axes = 0; + axis_size = 0; + num_instances = 0; + instance_size = 0; + } + + /* check that the data is bound by the table length */ + if ( version != 0x00010000UL || + axis_size != 20 || + num_axes == 0 || + /* `num_axes' limit implied by 16-bit `instance_size' */ + num_axes > 0x3FFE || + !( instance_size == 4 + 4 * num_axes || + instance_size == 6 + 4 * num_axes ) || + /* `num_instances' limit implied by limited range of name IDs */ + num_instances > 0x7EFF || + offset + + axis_size * num_axes + + instance_size * num_instances > fvar_len ) + num_instances = 0; + else + face->variation_support |= TT_FACE_FLAG_VAR_FVAR; + + /* + * As documented in the OpenType specification, an entry for the + * default instance may be omitted in the named instance table. In + * particular this means that even if there is no named instance + * table in the font we actually do have a named instance, namely the + * default instance. + * + * For consistency, we always want the default instance in our list + * of named instances. If it is missing, we try to synthesize it + * later on. Here, we have to adjust `num_instances' accordingly. + */ + + if ( ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) && + !( FT_QALLOC( default_values, num_axes * 4 ) || + FT_QALLOC( instance_values, num_axes * 4 ) ) ) + { + /* the current stream position is 16 bytes after the table start */ + FT_ULong array_start = FT_STREAM_POS() - 16 + offset; + FT_ULong default_value_offset, instance_offset; + + FT_Byte* p; + FT_UInt i; + + + default_value_offset = array_start + 8; + p = default_values; + + for ( i = 0; i < num_axes; i++ ) + { + (void)FT_STREAM_READ_AT( default_value_offset, p, 4 ); + + default_value_offset += axis_size; + p += 4; + } + + instance_offset = array_start + axis_size * num_axes + 4; + + for ( i = 0; i < num_instances; i++ ) + { + (void)FT_STREAM_READ_AT( instance_offset, + instance_values, + num_axes * 4 ); + + if ( !ft_memcmp( default_values, instance_values, num_axes * 4 ) ) + break; + + instance_offset += instance_size; + } + + /* named instance indices start with value 1 */ + face->var_default_named_instance = i + 1; + + if ( i == num_instances ) + { + /* no default instance in named instance table; */ + /* we thus have to synthesize it */ + num_instances++; + } + } + + FT_FREE( default_values ); + FT_FREE( instance_values ); + + /* we don't support Multiple Master CFFs yet; */ + /* note that `glyf' or `CFF2' have precedence */ + if ( face->goto_table( face, TTAG_glyf, stream, 0 ) && + face->goto_table( face, TTAG_CFF2, stream, 0 ) && + !face->goto_table( face, TTAG_CFF, stream, 0 ) ) + num_instances = 0; + + /* instance indices in `face_instance_index' start with index 1, */ + /* thus `>' and not `>=' */ + if ( instance_index > num_instances ) + { + if ( face_instance_index >= 0 ) + return FT_THROW( Invalid_Argument ); + else + num_instances = 0; + } + + face->root.style_flags = (FT_Long)num_instances << 16; + } +#endif + + face->root.num_faces = face->ttc_header.count; + face->root.face_index = face_instance_index; + + /* `num_faces' for a WOFF2 needs to be handled separately. */ + if ( woff2_num_faces ) + face->root.num_faces = woff2_num_faces; + + return error; + } + + +#define LOAD_( x ) \ + do \ + { \ + FT_TRACE2(( "`" #x "' " )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_ ## x( face, stream ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : FT_ERR_EQ( error, Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define LOADM_( x, vertical ) \ + do \ + { \ + FT_TRACE2(( "`%s" #x "' ", \ + vertical ? "vertical " : "" )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_ ## x( face, stream, vertical ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : FT_ERR_EQ( error, Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define GET_NAME( id, field ) \ + do \ + { \ + error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \ + if ( error ) \ + goto Exit; \ + } while ( 0 ) + + + FT_LOCAL_DEF( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Error psnames_error; +#endif + + FT_Bool has_outline; + FT_Bool is_apple_sbit; + + FT_Bool has_CBLC; + FT_Bool has_CBDT; + FT_Bool has_EBLC; + FT_Bool has_bloc; + FT_Bool has_sbix; + + FT_Bool ignore_typographic_family = FALSE; + FT_Bool ignore_typographic_subfamily = FALSE; + FT_Bool ignore_sbix = FALSE; + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_UNUSED( face_instance_index ); + + + /* Check parameters */ + + { + FT_Int i; + + + for ( i = 0; i < num_params; i++ ) + { + if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY ) + ignore_typographic_family = TRUE; + else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY ) + ignore_typographic_subfamily = TRUE; + else if ( params[i].tag == FT_PARAM_TAG_IGNORE_SBIX ) + ignore_sbix = TRUE; + } + } + + /* Load tables */ + + /* We now support two SFNT-based bitmapped font formats. They */ + /* are recognized easily as they do not include a `glyf' */ + /* table. */ + /* */ + /* The first format comes from Apple, and uses a table named */ + /* `bhed' instead of `head' to store the font header (using */ + /* the same format). It also doesn't include horizontal and */ + /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ + /* missing). */ + /* */ + /* The other format comes from Microsoft, and is used with */ + /* WinCE/PocketPC. It looks like a standard TTF, except that */ + /* it doesn't contain outlines. */ + /* */ + + FT_TRACE2(( "sfnt_load_face: %p\n", (void *)face )); + FT_TRACE2(( "\n" )); + + /* do we have outlines in there? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + has_outline = FT_BOOL( face->root.internal->incremental_interface || + tt_face_lookup_table( face, TTAG_glyf ) || + tt_face_lookup_table( face, TTAG_CFF ) || + tt_face_lookup_table( face, TTAG_CFF2 ) ); +#else + has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) || + tt_face_lookup_table( face, TTAG_CFF ) || + tt_face_lookup_table( face, TTAG_CFF2 ) ); +#endif + + /* check which sbit formats are present */ + has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 ); + has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 ); + has_EBLC = !face->goto_table( face, TTAG_EBLC, stream, 0 ); + has_bloc = !face->goto_table( face, TTAG_bloc, stream, 0 ); + has_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 ); + + is_apple_sbit = FALSE; + + if ( ignore_sbix ) + has_sbix = FALSE; + + /* if this font doesn't contain outlines, we try to load */ + /* a `bhed' table */ + if ( !has_outline && sfnt->load_bhed ) + { + LOAD_( bhed ); + is_apple_sbit = FT_BOOL( !error ); + } + + /* load the font header (`head' table) if this isn't an Apple */ + /* sbit font file */ + if ( !is_apple_sbit || has_sbix ) + { + LOAD_( head ); + if ( error ) + goto Exit; + } + + /* Ignore outlines for CBLC/CBDT fonts. */ + if ( has_CBLC || has_CBDT ) + has_outline = FALSE; + + /* OpenType 1.8.2 introduced limits to this value; */ + /* however, they make sense for older SFNT fonts also */ + if ( face->header.Units_Per_EM < 16 || + face->header.Units_Per_EM > 16384 ) + { + error = FT_THROW( Invalid_Table ); + + goto Exit; + } + + /* the following tables are often not present in embedded TrueType */ + /* fonts within PDF documents, so don't check for them. */ + LOAD_( maxp ); + LOAD_( cmap ); + + /* the following tables are optional in PCL fonts -- */ + /* don't check for errors */ + LOAD_( name ); + LOAD_( post ); + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames_error = error; +#endif + + /* do not load the metrics headers and tables if this is an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + /* load the `hhea' and `hmtx' tables */ + LOADM_( hhea, 0 ); + if ( !error ) + { + LOADM_( hmtx, 0 ); + if ( FT_ERR_EQ( error, Table_Missing ) ) + { + error = FT_THROW( Hmtx_Table_Missing ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hmtx' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = FT_Err_Ok; + } +#endif + } + } + else if ( FT_ERR_EQ( error, Table_Missing ) ) + { + /* No `hhea' table necessary for SFNT Mac fonts. */ + if ( face->format_tag == TTAG_true ) + { + FT_TRACE2(( "This is an SFNT Mac font.\n" )); + + has_outline = 0; + error = FT_Err_Ok; + } + else + { + error = FT_THROW( Horiz_Header_Missing ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hhea' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = FT_Err_Ok; + } +#endif + + } + } + + if ( error ) + goto Exit; + + /* try to load the `vhea' and `vmtx' tables */ + LOADM_( hhea, 1 ); + if ( !error ) + { + LOADM_( hmtx, 1 ); + if ( !error ) + face->vertical_info = 1; + } + + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + LOAD_( os2 ); + if ( error ) + { + /* we treat the table as missing if there are any errors */ + face->os2.version = 0xFFFFU; + } + } + + /* the optional tables */ + + /* embedded bitmap support */ + /* TODO: Replace this clumsy check for all possible sbit tables */ + /* with something better (for example, by passing a parameter */ + /* to suppress 'sbix' loading). */ + if ( sfnt->load_eblc && + ( has_CBLC || has_EBLC || has_bloc || has_sbix ) ) + LOAD_( eblc ); + + /* colored glyph support */ + if ( sfnt->load_cpal ) + { + LOAD_( cpal ); + LOAD_( colr ); + } + + /* OpenType-SVG glyph support */ + if ( sfnt->load_svg ) + LOAD_( svg ); + + /* consider the pclt, kerning, and gasp tables as optional */ + LOAD_( pclt ); + LOAD_( gasp ); + LOAD_( kern ); + + face->root.num_glyphs = face->max_profile.numGlyphs; + + /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ + /* a WWS-only font face. `WWS' stands for `weight', width', and */ + /* `slope', a term used by Microsoft's Windows Presentation */ + /* Foundation (WPF). This flag has been introduced in version */ + /* 1.5 of the OpenType specification (May 2008). */ + + face->root.family_name = NULL; + face->root.style_name = NULL; + if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) + { + if ( !ignore_typographic_family ) + GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + if ( !ignore_typographic_subfamily ) + GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + else + { + GET_NAME( WWS_FAMILY, &face->root.family_name ); + if ( !face->root.family_name && !ignore_typographic_family ) + GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name && !ignore_typographic_subfamily ) + GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Memory memory = face->root.memory; + + + if ( FT_STRDUP( face->non_var_style_name, face->root.style_name ) ) + goto Exit; + } +#endif + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Long flags = root->face_flags; + + + /********************************************************************** + * + * Compute face flags. + */ + if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC || + face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX || + face->colr || + face->svg ) + flags |= FT_FACE_FLAG_COLOR; /* color glyphs */ + + if ( has_outline == TRUE ) + { + /* by default (and for backward compatibility) we handle */ + /* fonts with an 'sbix' table as bitmap-only */ + if ( has_sbix ) + flags |= FT_FACE_FLAG_SBIX; /* with 'sbix' bitmaps */ + else + flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + } + + /* The sfnt driver only supports bitmap fonts natively, thus we */ + /* don't set FT_FACE_FLAG_HINTER. */ + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( !psnames_error && + face->postscript.FormatType != 0x00030000L ) + flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + /* fixed width font? */ + if ( face->postscript.isFixedPitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* vertical information? */ + if ( face->vertical_info ) + flags |= FT_FACE_FLAG_VERTICAL; + + /* kerning available ? */ + if ( TT_FACE_HAS_KERNING( face ) ) + flags |= FT_FACE_FLAG_KERNING; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Don't bother to load the tables unless somebody asks for them. */ + /* No need to do work which will (probably) not be used. */ + if ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; +#endif + + root->face_flags = flags; + + /********************************************************************** + * + * Compute style flags. + */ + + flags = 0; + if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) + { + /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ + /* indicates an oblique font face. This flag has been */ + /* introduced in version 1.5 of the OpenType specification. */ + + if ( face->os2.fsSelection & 512 ) /* bit 9 */ + flags |= FT_STYLE_FLAG_ITALIC; + else if ( face->os2.fsSelection & 1 ) /* bit 0 */ + flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->os2.fsSelection & 32 ) /* bit 5 */ + flags |= FT_STYLE_FLAG_BOLD; + } + else + { + /* this is an old Mac font, use the header field */ + + if ( face->header.Mac_Style & 1 ) + flags |= FT_STYLE_FLAG_BOLD; + + if ( face->header.Mac_Style & 2 ) + flags |= FT_STYLE_FLAG_ITALIC; + } + + root->style_flags |= flags; + + /********************************************************************** + * + * Polish the charmaps. + * + * Try to set the charmap encoding according to the platform & + * encoding ID of each charmap. Emulate Unicode charmap if one + * is missing. + */ + + tt_face_build_cmaps( face ); /* ignore errors */ + + + /* set the encoding fields */ + { + FT_Int m; +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Bool has_unicode = FALSE; +#endif + + + for ( m = 0; m < root->num_charmaps; m++ ) + { + FT_CharMap charmap = root->charmaps[m]; + + + charmap->encoding = sfnt_find_encoding( charmap->platform_id, + charmap->encoding_id ); + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + if ( charmap->encoding == FT_ENCODING_UNICODE || + charmap->encoding == FT_ENCODING_MS_SYMBOL ) /* PUA */ + has_unicode = TRUE; + } + + /* synthesize Unicode charmap if one is missing */ + if ( !has_unicode && + root->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + { + FT_CharMapRec cmaprec; + + + cmaprec.face = root; + cmaprec.platform_id = TT_PLATFORM_MICROSOFT; + cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; + cmaprec.encoding = FT_ENCODING_UNICODE; + + + error = FT_CMap_New( (FT_CMap_Class)&tt_cmap_unicode_class_rec, + NULL, &cmaprec, NULL ); + if ( error && + FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) && + FT_ERR_NEQ( error, Unimplemented_Feature ) ) + goto Exit; + error = FT_Err_Ok; + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + } + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* + * Now allocate the root array of FT_Bitmap_Size records and + * populate them. Unfortunately, it isn't possible to indicate bit + * depths in the FT_Bitmap_Size record. This is a design error. + */ + { + FT_UInt count; + + + count = face->sbit_num_strikes; + + if ( count > 0 ) + { + FT_Memory memory = face->root.memory; + FT_UShort em_size = face->header.Units_Per_EM; + FT_Short avgwidth = face->os2.xAvgCharWidth; + FT_Size_Metrics metrics; + + FT_UInt* sbit_strike_map = NULL; + FT_UInt strike_idx, bsize_idx; + + + if ( em_size == 0 || face->os2.version == 0xFFFFU ) + { + avgwidth = 1; + em_size = 1; + } + + /* to avoid invalid strike data in the `available_sizes' field */ + /* of `FT_Face', we map `available_sizes' indices to strike */ + /* indices */ + if ( FT_NEW_ARRAY( root->available_sizes, count ) || + FT_QNEW_ARRAY( sbit_strike_map, count ) ) + goto Exit; + + bsize_idx = 0; + for ( strike_idx = 0; strike_idx < count; strike_idx++ ) + { + FT_Bitmap_Size* bsize = root->available_sizes + bsize_idx; + + + error = sfnt->load_strike_metrics( face, strike_idx, &metrics ); + if ( error ) + continue; + + bsize->height = (FT_Short)( metrics.height >> 6 ); + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + + bsize->x_ppem = metrics.x_ppem << 6; + bsize->y_ppem = metrics.y_ppem << 6; + + /* assume 72dpi */ + bsize->size = metrics.y_ppem << 6; + + /* only use strikes with valid PPEM values */ + if ( bsize->x_ppem && bsize->y_ppem ) + sbit_strike_map[bsize_idx++] = strike_idx; + } + + /* reduce array size to the actually used elements */ + FT_MEM_QRENEW_ARRAY( sbit_strike_map, count, bsize_idx ); + + /* from now on, all strike indices are mapped */ + /* using `sbit_strike_map' */ + if ( bsize_idx ) + { + face->sbit_strike_map = sbit_strike_map; + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)bsize_idx; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* a font with no bitmaps and no outlines is scalable; */ + /* it has only empty glyphs then */ + if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) + root->face_flags |= FT_FACE_FLAG_SCALABLE; + + + /********************************************************************** + * + * Set up metrics. + */ + if ( FT_IS_SCALABLE( root ) || + FT_HAS_SBIX( root ) ) + { + /* XXX What about if outline header is missing */ + /* (e.g. sfnt wrapped bitmap)? */ + root->bbox.xMin = face->header.xMin; + root->bbox.yMin = face->header.yMin; + root->bbox.xMax = face->header.xMax; + root->bbox.yMax = face->header.yMax; + root->units_per_EM = face->header.Units_Per_EM; + + + /* + * Computing the ascender/descender/height is tricky. + * + * The OpenType specification v1.8.3 says: + * + * [OS/2's] sTypoAscender, sTypoDescender and sTypoLineGap fields + * are intended to allow applications to lay out documents in a + * typographically-correct and portable fashion. + * + * This is somewhat at odds with the decades of backwards + * compatibility, operating systems and applications doing whatever + * they want, not to mention broken fonts. + * + * Not all fonts have an OS/2 table; in this case, we take the values + * in the horizontal header, although there is nothing stopping the + * values from being unreliable. Even with a OS/2 table, certain fonts + * set the sTypoAscender, sTypoDescender and sTypoLineGap fields to 0 + * and instead correctly set usWinAscent and usWinDescent. + * + * As an example, Arial Narrow is shipped as four files ARIALN.TTF, + * ARIALNI.TTF, ARIALNB.TTF and ARIALNBI.TTF. Strangely, all fonts have + * the same values in their sTypo* fields, except ARIALNB.ttf which + * sets them to 0. All of them have different usWinAscent/Descent + * values. The OS/2 table therefore cannot be trusted for computing the + * text height reliably. + * + * As a compromise, do the following: + * + * 1. If the OS/2 table exists and the fsSelection bit 7 is set + * (USE_TYPO_METRICS), trust the font and use the sTypo* metrics. + * 2. Otherwise, use the `hhea' table's metrics. + * 3. If they are zero and the OS/2 table exists, + * 1. use the OS/2 table's sTypo* metrics if they are non-zero. + * 2. Otherwise, use the OS/2 table's usWin* metrics. + */ + + if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 128 ) + { + root->ascender = face->os2.sTypoAscender; + root->descender = face->os2.sTypoDescender; + root->height = root->ascender - root->descender + + face->os2.sTypoLineGap; + } + else + { + root->ascender = face->horizontal.Ascender; + root->descender = face->horizontal.Descender; + root->height = root->ascender - root->descender + + face->horizontal.Line_Gap; + + if ( !( root->ascender || root->descender ) ) + { + if ( face->os2.version != 0xFFFFU ) + { + if ( face->os2.sTypoAscender || face->os2.sTypoDescender ) + { + root->ascender = face->os2.sTypoAscender; + root->descender = face->os2.sTypoDescender; + root->height = root->ascender - root->descender + + face->os2.sTypoLineGap; + } + else + { + root->ascender = (FT_Short)face->os2.usWinAscent; + root->descender = -(FT_Short)face->os2.usWinDescent; + root->height = root->ascender - root->descender; + } + } + } + } + + root->max_advance_width = + (FT_Short)face->horizontal.advance_Width_Max; + root->max_advance_height = + (FT_Short)( face->vertical_info ? face->vertical.advance_Height_Max + : root->height ); + + /* See https://www.microsoft.com/typography/otspec/post.htm -- */ + /* Adjust underline position from top edge to centre of */ + /* stroke to convert TrueType meaning to FreeType meaning. */ + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + } + + } + + Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + + return error; + } + + +#undef LOAD_ +#undef LOADM_ +#undef GET_NAME + + + FT_LOCAL_DEF( void ) + sfnt_done_face( TT_Face face ) + { + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = face->root.memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + { + /* destroy the postscript names table if it is loaded */ + if ( sfnt->free_psnames ) + sfnt->free_psnames( face ); + + /* destroy the embedded bitmaps table if it is loaded */ + if ( sfnt->free_eblc ) + sfnt->free_eblc( face ); + + /* destroy color table data if it is loaded */ + if ( sfnt->free_cpal ) + { + sfnt->free_cpal( face ); + sfnt->free_colr( face ); + } + +#ifdef FT_CONFIG_OPTION_SVG + /* free SVG data */ + if ( sfnt->free_svg ) + sfnt->free_svg( face ); +#endif + } + +#ifdef TT_CONFIG_OPTION_BDF + /* freeing the embedded BDF properties */ + tt_face_free_bdf_props( face ); +#endif + + /* freeing the kerning table */ + tt_face_done_kern( face ); + + /* freeing the collection table */ + FT_FREE( face->ttc_header.offsets ); + face->ttc_header.count = 0; + + /* freeing table directory */ + FT_FREE( face->dir_tables ); + face->num_tables = 0; + + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + /* simply release the 'cmap' table frame */ + FT_FRAME_RELEASE( face->cmap_table ); + face->cmap_size = 0; + } + + face->horz_metrics_size = 0; + face->vert_metrics_size = 0; + + /* freeing vertical metrics, if any */ + if ( face->vertical_info ) + { + FT_FREE( face->vertical.long_metrics ); + FT_FREE( face->vertical.short_metrics ); + face->vertical_info = 0; + } + + /* freeing the gasp table */ + FT_FREE( face->gasp.gaspRanges ); + face->gasp.numRanges = 0; + + /* freeing the name table */ + if ( sfnt ) + sfnt->free_name( face ); + + /* freeing family and style name */ + FT_FREE( face->root.family_name ); + FT_FREE( face->root.style_name ); + + /* freeing sbit size table */ + FT_FREE( face->root.available_sizes ); + FT_FREE( face->sbit_strike_map ); + face->root.num_fixed_sizes = 0; + + FT_FREE( face->postscript_name ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_FREE( face->var_postscript_prefix ); + FT_FREE( face->non_var_style_name ); +#endif + + /* freeing glyph color palette data */ + FT_FREE( face->palette_data.palette_name_ids ); + FT_FREE( face->palette_data.palette_flags ); + FT_FREE( face->palette_data.palette_entry_name_ids ); + FT_FREE( face->palette ); + + face->sfnt = NULL; + } + + +/* END */ diff --git a/external/freetype/src/sfnt/sfobjs.h b/external/freetype/src/sfnt/sfobjs.h new file mode 100644 index 000000000..906aebbf9 --- /dev/null +++ b/external/freetype/src/sfnt/sfobjs.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * + * sfobjs.h + * + * SFNT object management (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFOBJS_H_ +#define SFOBJS_H_ + + +#include <freetype/internal/sfnt.h> +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + sfnt_done_face( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ); + + +FT_END_HEADER + +#endif /* SFOBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/sfwoff.c b/external/freetype/src/sfnt/sfwoff.c new file mode 100644 index 000000000..7c0ce2205 --- /dev/null +++ b/external/freetype/src/sfnt/sfwoff.c @@ -0,0 +1,434 @@ +/**************************************************************************** + * + * sfwoff.c + * + * WOFF format management (base). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "sfwoff.h" +#include <freetype/tttags.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/ftgzip.h> + + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sfwoff + + +#define WRITE_USHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_ULONG( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 24 ); \ + *(p)++ = (FT_Byte)( (v) >> 16 ); \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + + + static void + sfnt_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->close = NULL; + } + + + FT_COMPARE_DEF( int ) + compare_offsets( const void* a, + const void* b ) + { + WOFF_Table table1 = *(WOFF_Table*)a; + WOFF_Table table2 = *(WOFF_Table*)b; + + FT_ULong offset1 = table1->Offset; + FT_ULong offset2 = table2->Offset; + + + if ( offset1 > offset2 ) + return 1; + else if ( offset1 < offset2 ) + return -1; + else + return 0; + } + + + /* Replace `face->root.stream' with a stream containing the extracted */ + /* SFNT of a WOFF font. */ + + FT_LOCAL_DEF( FT_Error ) + woff_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + WOFF_HeaderRec woff; + WOFF_Table tables = NULL; + WOFF_Table* indices = NULL; + + FT_ULong woff_offset; + + FT_Byte* sfnt = NULL; + FT_Stream sfnt_stream = NULL; + + FT_Byte* sfnt_header; + FT_ULong sfnt_offset; + + FT_Int nn; + FT_Tag old_tag = 0; + + static const FT_Frame_Field woff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WOFF_HeaderRec + + FT_FRAME_START( 44 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_ULONG ( flavor ), + FT_FRAME_ULONG ( length ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( reserved ), + FT_FRAME_ULONG ( totalSfntSize ), + FT_FRAME_USHORT( majorVersion ), + FT_FRAME_USHORT( minorVersion ), + FT_FRAME_ULONG ( metaOffset ), + FT_FRAME_ULONG ( metaLength ), + FT_FRAME_ULONG ( metaOrigLength ), + FT_FRAME_ULONG ( privOffset ), + FT_FRAME_ULONG ( privLength ), + FT_FRAME_END + }; + + + FT_ASSERT( stream == face->root.stream ); + FT_ASSERT( FT_STREAM_POS() == 0 ); + + if ( FT_STREAM_READ_FIELDS( woff_header_fields, &woff ) ) + return error; + + /* Make sure we don't recurse back here or hit TTC code. */ + if ( woff.flavor == TTAG_wOFF || woff.flavor == TTAG_ttcf ) + return FT_THROW( Invalid_Table ); + + /* Miscellaneous checks. */ + if ( woff.length != stream->size || + woff.num_tables == 0 || + 44 + woff.num_tables * 20UL >= woff.length || + 12 + woff.num_tables * 16UL >= woff.totalSfntSize || + ( woff.totalSfntSize & 3 ) != 0 || + ( woff.metaOffset == 0 && ( woff.metaLength != 0 || + woff.metaOrigLength != 0 ) ) || + ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) || + ( woff.privOffset == 0 && woff.privLength != 0 ) ) + { + FT_ERROR(( "woff_font_open: invalid WOFF header\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Don't trust `totalSfntSize' before thorough checks. */ + if ( FT_QALLOC( sfnt, 12 ) || FT_NEW( sfnt_stream ) ) + goto Exit; + + sfnt_header = sfnt; + + /* Write sfnt header. */ + { + FT_UInt searchRange, entrySelector, rangeShift, x; + + + x = woff.num_tables; + entrySelector = 0; + while ( x ) + { + x >>= 1; + entrySelector += 1; + } + entrySelector--; + + searchRange = ( 1 << entrySelector ) * 16; + rangeShift = woff.num_tables * 16 - searchRange; + + WRITE_ULONG ( sfnt_header, woff.flavor ); + WRITE_USHORT( sfnt_header, woff.num_tables ); + WRITE_USHORT( sfnt_header, searchRange ); + WRITE_USHORT( sfnt_header, entrySelector ); + WRITE_USHORT( sfnt_header, rangeShift ); + } + + /* While the entries in the sfnt header must be sorted by the */ + /* tag value, the tables themselves are not. We thus have to */ + /* sort them by offset and check that they don't overlap. */ + + if ( FT_QNEW_ARRAY( tables, woff.num_tables ) || + FT_QNEW_ARRAY( indices, woff.num_tables ) ) + goto Exit; + + FT_TRACE2(( "\n" )); + FT_TRACE2(( " tag offset compLen origLen checksum\n" )); + FT_TRACE2(( " -------------------------------------------\n" )); + + if ( FT_FRAME_ENTER( 20L * woff.num_tables ) ) + goto Exit; + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = tables + nn; + + table->Tag = FT_GET_TAG4(); + table->Offset = FT_GET_ULONG(); + table->CompLength = FT_GET_ULONG(); + table->OrigLength = FT_GET_ULONG(); + table->CheckSum = FT_GET_ULONG(); + + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx %08lx\n", + (FT_Char)( table->Tag >> 24 ), + (FT_Char)( table->Tag >> 16 ), + (FT_Char)( table->Tag >> 8 ), + (FT_Char)( table->Tag ), + table->Offset, + table->CompLength, + table->OrigLength, + table->CheckSum )); + + if ( table->Tag <= old_tag ) + { + FT_FRAME_EXIT(); + + FT_ERROR(( "woff_font_open: table tags are not sorted\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + old_tag = table->Tag; + indices[nn] = table; + } + + FT_FRAME_EXIT(); + + /* Sort by offset. */ + + ft_qsort( indices, + woff.num_tables, + sizeof ( WOFF_Table ), + compare_offsets ); + + /* Check offsets and lengths. */ + + woff_offset = 44 + woff.num_tables * 20L; + sfnt_offset = 12 + woff.num_tables * 16L; + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = indices[nn]; + + + if ( table->Offset != woff_offset || + table->CompLength > woff.length || + table->Offset > woff.length - table->CompLength || + table->OrigLength > woff.totalSfntSize || + sfnt_offset > woff.totalSfntSize - table->OrigLength || + table->CompLength > table->OrigLength ) + { + FT_ERROR(( "woff_font_open: invalid table offsets\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + table->OrigOffset = sfnt_offset; + + /* The offsets must be multiples of 4. */ + woff_offset += ( table->CompLength + 3 ) & ~3U; + sfnt_offset += ( table->OrigLength + 3 ) & ~3U; + } + + /* + * Final checks! + * + * We don't decode and check the metadata block. + * We don't check table checksums either. + * But other than those, I think we implement all + * `MUST' checks from the spec. + */ + + if ( woff.metaOffset ) + { + if ( woff.metaOffset != woff_offset || + woff.metaOffset + woff.metaLength > woff.length ) + { + FT_ERROR(( "woff_font_open:" + " invalid `metadata' offset or length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* We have padding only ... */ + woff_offset += woff.metaLength; + } + + if ( woff.privOffset ) + { + /* ... if it isn't the last block. */ + woff_offset = ( woff_offset + 3 ) & ~3U; + + if ( woff.privOffset != woff_offset || + woff.privOffset + woff.privLength > woff.length ) + { + FT_ERROR(( "woff_font_open: invalid `private' offset or length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* No padding for the last block. */ + woff_offset += woff.privLength; + } + + if ( sfnt_offset != woff.totalSfntSize || + woff_offset != woff.length ) + { + FT_ERROR(( "woff_font_open: invalid `sfnt' table structure\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* Now use `totalSfntSize'. */ + if ( FT_QREALLOC( sfnt, 12, woff.totalSfntSize ) ) + goto Exit; + + sfnt_header = sfnt + 12; + + /* Write the tables. */ + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = tables + nn; + + + /* Write SFNT table entry. */ + WRITE_ULONG( sfnt_header, table->Tag ); + WRITE_ULONG( sfnt_header, table->CheckSum ); + WRITE_ULONG( sfnt_header, table->OrigOffset ); + WRITE_ULONG( sfnt_header, table->OrigLength ); + + /* Write table data. */ + if ( FT_STREAM_SEEK( table->Offset ) || + FT_FRAME_ENTER( table->CompLength ) ) + goto Exit; + + if ( table->CompLength == table->OrigLength ) + { + /* Uncompressed data; just copy. */ + ft_memcpy( sfnt + table->OrigOffset, + stream->cursor, + table->OrigLength ); + } + else + { + /* Uncompress with zlib. */ + FT_ULong output_len = table->OrigLength; + + + error = FT_Gzip_Uncompress( memory, + sfnt + table->OrigOffset, &output_len, + stream->cursor, table->CompLength ); + if ( error ) + goto Exit1; + if ( output_len != table->OrigLength ) + { + FT_ERROR(( "woff_font_open: compressed table length mismatch\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit1; + } + } + + FT_FRAME_EXIT(); + + /* We don't check whether the padding bytes in the WOFF file are */ + /* actually '\0'. For the output, however, we do set them properly. */ + sfnt_offset = table->OrigOffset + table->OrigLength; + while ( sfnt_offset & 3 ) + { + sfnt[sfnt_offset] = '\0'; + sfnt_offset++; + } + } + + /* Ok! Finally ready. Swap out stream and return. */ + FT_Stream_OpenMemory( sfnt_stream, sfnt, woff.totalSfntSize ); + sfnt_stream->memory = stream->memory; + sfnt_stream->close = sfnt_stream_close; + + FT_Stream_Free( + face->root.stream, + ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->root.stream = sfnt_stream; + + face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + + Exit: + FT_FREE( tables ); + FT_FREE( indices ); + + if ( error ) + { + FT_FREE( sfnt ); + FT_Stream_Close( sfnt_stream ); + FT_FREE( sfnt_stream ); + } + + return error; + + Exit1: + FT_FRAME_EXIT(); + goto Exit; + } + + +#undef WRITE_USHORT +#undef WRITE_ULONG + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + /* ANSI C doesn't like empty source files */ + typedef int sfwoff_dummy_; + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + + +/* END */ diff --git a/external/freetype/src/sfnt/sfwoff.h b/external/freetype/src/sfnt/sfwoff.h new file mode 100644 index 000000000..d43842273 --- /dev/null +++ b/external/freetype/src/sfnt/sfwoff.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * + * sfwoff.h + * + * WOFFF format management (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFWOFF_H_ +#define SFWOFF_H_ + + +#include <freetype/internal/sfnt.h> +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + + FT_LOCAL( FT_Error ) + woff_open_font( FT_Stream stream, + TT_Face face ); + + +#endif + +FT_END_HEADER + +#endif /* SFWOFF_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/sfwoff2.c b/external/freetype/src/sfnt/sfwoff2.c new file mode 100644 index 000000000..2be44a347 --- /dev/null +++ b/external/freetype/src/sfnt/sfwoff2.c @@ -0,0 +1,2392 @@ +/**************************************************************************** + * + * sfwoff2.c + * + * WOFF2 format management (base). + * + * Copyright (C) 2019-2023 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include "sfwoff2.h" +#include "woff2tags.h" +#include <freetype/tttags.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> + + +#ifdef FT_CONFIG_OPTION_USE_BROTLI + +#include <brotli/decode.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT sfwoff2 + + /* An arbitrary, heuristic size limit (67MByte) for expanded WOFF2 data. */ +#define MAX_SFNT_SIZE ( 1 << 26 ) + +#define READ_255USHORT( var ) FT_SET_ERROR( Read255UShort( stream, &var ) ) + +#define READ_BASE128( var ) FT_SET_ERROR( ReadBase128( stream, &var ) ) + + /* `var' should be FT_ULong */ +#define ROUND4( var ) ( ( var + 3 ) & ~3UL ) + +#define WRITE_USHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_ULONG( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 24 ); \ + *(p)++ = (FT_Byte)( (v) >> 16 ); \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_SHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_SFNT_BUF( buf, s ) \ + write_buf( &sfnt, sfnt_size, &dest_offset, buf, s, memory ) + +#define WRITE_SFNT_BUF_AT( offset, buf, s ) \ + write_buf( &sfnt, sfnt_size, &offset, buf, s, memory ) + +#define N_CONTOUR_STREAM 0 +#define N_POINTS_STREAM 1 +#define FLAG_STREAM 2 +#define GLYPH_STREAM 3 +#define COMPOSITE_STREAM 4 +#define BBOX_STREAM 5 +#define INSTRUCTION_STREAM 6 + +#define HAVE_OVERLAP_SIMPLE_BITMAP 0x1 + + + static void + stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->close = NULL; + } + + + FT_COMPARE_DEF( int ) + compare_tags( const void* a, + const void* b ) + { + WOFF2_Table table1 = *(WOFF2_Table*)a; + WOFF2_Table table2 = *(WOFF2_Table*)b; + + FT_Tag tag1 = table1->Tag; + FT_Tag tag2 = table2->Tag; + + + if ( tag1 > tag2 ) + return 1; + else if ( tag1 < tag2 ) + return -1; + else + return 0; + } + + + static FT_Error + Read255UShort( FT_Stream stream, + FT_UShort* value ) + { + const FT_Byte oneMoreByteCode1 = 255; + const FT_Byte oneMoreByteCode2 = 254; + const FT_Byte wordCode = 253; + const FT_UShort lowestUCode = 253; + + FT_Error error = FT_Err_Ok; + FT_Byte code; + FT_Byte result_byte = 0; + FT_UShort result_short = 0; + + + if ( FT_READ_BYTE( code ) ) + return error; + if ( code == wordCode ) + { + /* Read next two bytes and store `FT_UShort' value. */ + if ( FT_READ_USHORT( result_short ) ) + return error; + *value = result_short; + return FT_Err_Ok; + } + else if ( code == oneMoreByteCode1 ) + { + if ( FT_READ_BYTE( result_byte ) ) + return error; + *value = result_byte + lowestUCode; + return FT_Err_Ok; + } + else if ( code == oneMoreByteCode2 ) + { + if ( FT_READ_BYTE( result_byte ) ) + return error; + *value = result_byte + lowestUCode * 2; + return FT_Err_Ok; + } + else + { + *value = code; + return FT_Err_Ok; + } + } + + + static FT_Error + ReadBase128( FT_Stream stream, + FT_ULong* value ) + { + FT_ULong result = 0; + FT_Int i; + FT_Byte code; + FT_Error error = FT_Err_Ok; + + + for ( i = 0; i < 5; ++i ) + { + code = 0; + if ( FT_READ_BYTE( code ) ) + return error; + + /* Leading zeros are invalid. */ + if ( i == 0 && code == 0x80 ) + return FT_THROW( Invalid_Table ); + + /* If any of top seven bits are set then we're about to overflow. */ + if ( result & 0xfe000000 ) + return FT_THROW( Invalid_Table ); + + result = ( result << 7 ) | ( code & 0x7f ); + + /* Spin until most significant bit of data byte is false. */ + if ( ( code & 0x80 ) == 0 ) + { + *value = result; + return FT_Err_Ok; + } + } + + /* Make sure not to exceed the size bound. */ + return FT_THROW( Invalid_Table ); + } + + + /* Extend memory of `dst_bytes' buffer and copy data from `src'. */ + static FT_Error + write_buf( FT_Byte** dst_bytes, + FT_ULong* dst_size, + FT_ULong* offset, + FT_Byte* src, + FT_ULong size, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + /* We are reallocating memory for `dst', so its pointer may change. */ + FT_Byte* dst = *dst_bytes; + + + /* Check whether we are within limits. */ + if ( ( *offset + size ) > WOFF2_DEFAULT_MAX_SIZE ) + return FT_THROW( Array_Too_Large ); + + /* Reallocate `dst'. */ + if ( ( *offset + size ) > *dst_size ) + { + FT_TRACE6(( "Reallocating %lu to %lu.\n", + *dst_size, (*offset + size) )); + if ( FT_QREALLOC( dst, + (FT_ULong)( *dst_size ), + (FT_ULong)( *offset + size ) ) ) + goto Exit; + + *dst_size = *offset + size; + } + + /* Copy data. */ + ft_memcpy( dst + *offset, src, size ); + + *offset += size; + /* Set pointer of `dst' to its correct value. */ + *dst_bytes = dst; + + Exit: + return error; + } + + + /* Pad buffer to closest multiple of 4. */ + static FT_Error + pad4( FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + FT_Memory memory ) + { + FT_Byte* sfnt = *sfnt_bytes; + FT_ULong dest_offset = *out_offset; + + FT_Byte zeroes[] = { 0, 0, 0 }; + FT_ULong pad_bytes; + + + if ( dest_offset + 3 < dest_offset ) + return FT_THROW( Invalid_Table ); + + pad_bytes = ROUND4( dest_offset ) - dest_offset; + if ( pad_bytes > 0 ) + { + if ( WRITE_SFNT_BUF( &zeroes[0], pad_bytes ) ) + return FT_THROW( Invalid_Table ); + } + + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + return FT_Err_Ok; + } + + + /* Calculate table checksum of `buf'. */ + static FT_ULong + compute_ULong_sum( FT_Byte* buf, + FT_ULong size ) + { + FT_ULong checksum = 0; + FT_ULong aligned_size = size & ~3UL; + FT_ULong i; + FT_ULong v; + + + for ( i = 0; i < aligned_size; i += 4 ) + checksum += ( (FT_ULong)buf[i ] << 24 ) | + ( (FT_ULong)buf[i + 1] << 16 ) | + ( (FT_ULong)buf[i + 2] << 8 ) | + ( (FT_ULong)buf[i + 3] << 0 ); + + /* If size is not aligned to 4, treat as if it is padded with 0s. */ + if ( size != aligned_size ) + { + v = 0; + for ( i = aligned_size ; i < size; ++i ) + v |= (FT_ULong)buf[i] << ( 24 - 8 * ( i & 3 ) ); + checksum += v; + } + + return checksum; + } + + + static FT_Error + woff2_decompress( FT_Byte* dst, + FT_ULong dst_size, + const FT_Byte* src, + FT_ULong src_size ) + { + /* this cast is only of importance on 32bit systems; */ + /* we don't validate it */ + FT_Offset uncompressed_size = (FT_Offset)dst_size; + BrotliDecoderResult result; + + + result = BrotliDecoderDecompress( src_size, + src, + &uncompressed_size, + dst ); + + if ( result != BROTLI_DECODER_RESULT_SUCCESS || + uncompressed_size != dst_size ) + { + FT_ERROR(( "woff2_decompress: Stream length mismatch.\n" )); + return FT_THROW( Invalid_Table ); + } + + FT_TRACE2(( "woff2_decompress: Brotli stream decompressed.\n" )); + return FT_Err_Ok; + } + + + static WOFF2_Table + find_table( WOFF2_Table* tables, + FT_UShort num_tables, + FT_Tag tag ) + { + FT_Int i; + + + for ( i = 0; i < num_tables; i++ ) + { + if ( tables[i]->Tag == tag ) + return tables[i]; + } + return NULL; + } + + + /* Read `numberOfHMetrics' field from `hhea' table. */ + static FT_Error + read_num_hmetrics( FT_Stream stream, + FT_UShort* num_hmetrics ) + { + FT_Error error = FT_Err_Ok; + FT_UShort num_metrics; + + + if ( FT_STREAM_SKIP( 34 ) ) + return FT_THROW( Invalid_Table ); + + if ( FT_READ_USHORT( num_metrics ) ) + return FT_THROW( Invalid_Table ); + + *num_hmetrics = num_metrics; + + return error; + } + + + /* An auxiliary function for overflow-safe addition. */ + static FT_Int + with_sign( FT_Byte flag, + FT_Int base_val ) + { + /* Precondition: 0 <= base_val < 65536 (to avoid overflow). */ + return ( flag & 1 ) ? base_val : -base_val; + } + + + /* An auxiliary function for overflow-safe addition. */ + static FT_Int + safe_int_addition( FT_Int a, + FT_Int b, + FT_Int* result ) + { + if ( ( ( a > 0 ) && ( b > FT_INT_MAX - a ) ) || + ( ( a < 0 ) && ( b < FT_INT_MIN - a ) ) ) + return FT_THROW( Invalid_Table ); + + *result = a + b; + return FT_Err_Ok; + } + + + /* + * Decode variable-length (flag, xCoordinate, yCoordinate) triplet for a + * simple glyph. See + * + * https://www.w3.org/TR/WOFF2/#triplet_decoding + */ + static FT_Error + triplet_decode( const FT_Byte* flags_in, + const FT_Byte* in, + FT_ULong in_size, + FT_ULong n_points, + WOFF2_Point result, + FT_ULong* in_bytes_used ) + { + FT_Int x = 0; + FT_Int y = 0; + FT_Int dx; + FT_Int dy; + FT_Int b0, b1, b2; + + FT_ULong triplet_index = 0; + FT_ULong data_bytes; + + FT_UInt i; + + + if ( n_points > in_size ) + return FT_THROW( Invalid_Table ); + + for ( i = 0; i < n_points; ++i ) + { + FT_Byte flag = flags_in[i]; + FT_Bool on_curve = !( flag >> 7 ); + + + flag &= 0x7f; + if ( flag < 84 ) + data_bytes = 1; + else if ( flag < 120 ) + data_bytes = 2; + else if ( flag < 124 ) + data_bytes = 3; + else + data_bytes = 4; + + /* Overflow checks */ + if ( triplet_index + data_bytes > in_size || + triplet_index + data_bytes < triplet_index ) + return FT_THROW( Invalid_Table ); + + if ( flag < 10 ) + { + dx = 0; + dy = with_sign( flag, + ( ( flag & 14 ) << 7 ) + in[triplet_index] ); + } + else if ( flag < 20 ) + { + dx = with_sign( flag, + ( ( ( flag - 10 ) & 14 ) << 7 ) + + in[triplet_index] ); + dy = 0; + } + else if ( flag < 84 ) + { + b0 = flag - 20; + b1 = in[triplet_index]; + dx = with_sign( flag, + 1 + ( b0 & 0x30 ) + ( b1 >> 4 ) ); + dy = with_sign( flag >> 1, + 1 + ( ( b0 & 0x0c ) << 2 ) + ( b1 & 0x0f ) ); + } + else if ( flag < 120 ) + { + b0 = flag - 84; + dx = with_sign( flag, + 1 + ( ( b0 / 12 ) << 8 ) + in[triplet_index] ); + dy = with_sign( flag >> 1, + 1 + ( ( ( b0 % 12 ) >> 2 ) << 8 ) + + in[triplet_index + 1] ); + } + else if ( flag < 124 ) + { + b2 = in[triplet_index + 1]; + dx = with_sign( flag, + ( in[triplet_index] << 4 ) + ( b2 >> 4 ) ); + dy = with_sign( flag >> 1, + ( ( b2 & 0x0f ) << 8 ) + in[triplet_index + 2] ); + } + else + { + dx = with_sign( flag, + ( in[triplet_index] << 8 ) + + in[triplet_index + 1] ); + dy = with_sign( flag >> 1, + ( in[triplet_index + 2] << 8 ) + + in[triplet_index + 3] ); + } + + triplet_index += data_bytes; + + if ( safe_int_addition( x, dx, &x ) ) + return FT_THROW( Invalid_Table ); + + if ( safe_int_addition( y, dy, &y ) ) + return FT_THROW( Invalid_Table ); + + result[i].x = x; + result[i].y = y; + result[i].on_curve = on_curve; + } + + *in_bytes_used = triplet_index; + return FT_Err_Ok; + } + + + /* Store decoded points in glyph buffer. */ + static FT_Error + store_points( FT_ULong n_points, + const WOFF2_Point points, + FT_UShort n_contours, + FT_UShort instruction_len, + FT_Bool have_overlap, + FT_Byte* dst, + FT_ULong dst_size, + FT_ULong* glyph_size ) + { + FT_UInt flag_offset = 10 + ( 2 * n_contours ) + 2 + instruction_len; + FT_Byte last_flag = 0xFFU; + FT_Byte repeat_count = 0; + FT_Int last_x = 0; + FT_Int last_y = 0; + FT_UInt x_bytes = 0; + FT_UInt y_bytes = 0; + FT_UInt xy_bytes; + FT_UInt i; + FT_UInt x_offset; + FT_UInt y_offset; + FT_Byte* pointer; + + + for ( i = 0; i < n_points; ++i ) + { + const WOFF2_PointRec point = points[i]; + + FT_Byte flag = point.on_curve ? GLYF_ON_CURVE : 0; + FT_Int dx = point.x - last_x; + FT_Int dy = point.y - last_y; + + + if ( i == 0 && have_overlap ) + flag |= GLYF_OVERLAP_SIMPLE; + + if ( dx == 0 ) + flag |= GLYF_THIS_X_IS_SAME; + else if ( dx > -256 && dx < 256 ) + { + flag |= GLYF_X_SHORT | ( dx > 0 ? GLYF_THIS_X_IS_SAME : 0 ); + x_bytes += 1; + } + else + x_bytes += 2; + + if ( dy == 0 ) + flag |= GLYF_THIS_Y_IS_SAME; + else if ( dy > -256 && dy < 256 ) + { + flag |= GLYF_Y_SHORT | ( dy > 0 ? GLYF_THIS_Y_IS_SAME : 0 ); + y_bytes += 1; + } + else + y_bytes += 2; + + if ( flag == last_flag && repeat_count != 255 ) + { + dst[flag_offset - 1] |= GLYF_REPEAT; + repeat_count++; + } + else + { + if ( repeat_count != 0 ) + { + if ( flag_offset >= dst_size ) + return FT_THROW( Invalid_Table ); + + dst[flag_offset++] = repeat_count; + } + if ( flag_offset >= dst_size ) + return FT_THROW( Invalid_Table ); + + dst[flag_offset++] = flag; + repeat_count = 0; + } + + last_x = point.x; + last_y = point.y; + last_flag = flag; + } + + if ( repeat_count != 0 ) + { + if ( flag_offset >= dst_size ) + return FT_THROW( Invalid_Table ); + + dst[flag_offset++] = repeat_count; + } + + xy_bytes = x_bytes + y_bytes; + if ( xy_bytes < x_bytes || + flag_offset + xy_bytes < flag_offset || + flag_offset + xy_bytes > dst_size ) + return FT_THROW( Invalid_Table ); + + x_offset = flag_offset; + y_offset = flag_offset + x_bytes; + last_x = 0; + last_y = 0; + + for ( i = 0; i < n_points; ++i ) + { + FT_Int dx = points[i].x - last_x; + FT_Int dy = points[i].y - last_y; + + + if ( dx == 0 ) + ; + else if ( dx > -256 && dx < 256 ) + dst[x_offset++] = (FT_Byte)FT_ABS( dx ); + else + { + pointer = dst + x_offset; + WRITE_SHORT( pointer, dx ); + x_offset += 2; + } + + last_x += dx; + + if ( dy == 0 ) + ; + else if ( dy > -256 && dy < 256 ) + dst[y_offset++] = (FT_Byte)FT_ABS( dy ); + else + { + pointer = dst + y_offset; + WRITE_SHORT( pointer, dy ); + y_offset += 2; + } + + last_y += dy; + } + + *glyph_size = y_offset; + return FT_Err_Ok; + } + + + static void + compute_bbox( FT_ULong n_points, + const WOFF2_Point points, + FT_Byte* dst, + FT_UShort* src_x_min ) + { + FT_Int x_min = 0; + FT_Int y_min = 0; + FT_Int x_max = 0; + FT_Int y_max = 0; + + FT_UInt i; + + FT_ULong offset; + FT_Byte* pointer; + + + if ( n_points > 0 ) + { + x_min = points[0].x; + y_min = points[0].y; + x_max = points[0].x; + y_max = points[0].y; + } + + for ( i = 1; i < n_points; ++i ) + { + FT_Int x = points[i].x; + FT_Int y = points[i].y; + + + x_min = FT_MIN( x, x_min ); + y_min = FT_MIN( y, y_min ); + x_max = FT_MAX( x, x_max ); + y_max = FT_MAX( y, y_max ); + } + + /* Write values to `glyf' record. */ + offset = 2; + pointer = dst + offset; + + WRITE_SHORT( pointer, x_min ); + WRITE_SHORT( pointer, y_min ); + WRITE_SHORT( pointer, x_max ); + WRITE_SHORT( pointer, y_max ); + + *src_x_min = (FT_UShort)x_min; + } + + + static FT_Error + compositeGlyph_size( FT_Stream stream, + FT_ULong offset, + FT_ULong* size, + FT_Bool* have_instructions ) + { + FT_Error error = FT_Err_Ok; + FT_ULong start_offset = offset; + FT_Bool we_have_inst = FALSE; + FT_UShort flags = FLAG_MORE_COMPONENTS; + + + if ( FT_STREAM_SEEK( start_offset ) ) + goto Exit; + while ( flags & FLAG_MORE_COMPONENTS ) + { + FT_ULong arg_size; + + + if ( FT_READ_USHORT( flags ) ) + goto Exit; + we_have_inst |= ( flags & FLAG_WE_HAVE_INSTRUCTIONS ) != 0; + /* glyph index */ + arg_size = 2; + if ( flags & FLAG_ARG_1_AND_2_ARE_WORDS ) + arg_size += 4; + else + arg_size += 2; + + if ( flags & FLAG_WE_HAVE_A_SCALE ) + arg_size += 2; + else if ( flags & FLAG_WE_HAVE_AN_X_AND_Y_SCALE ) + arg_size += 4; + else if ( flags & FLAG_WE_HAVE_A_TWO_BY_TWO ) + arg_size += 8; + + if ( FT_STREAM_SKIP( arg_size ) ) + goto Exit; + } + + *size = FT_STREAM_POS() - start_offset; + *have_instructions = we_have_inst; + + Exit: + return error; + } + + + /* Store loca values (provided by `reconstruct_glyf') to output stream. */ + static FT_Error + store_loca( FT_ULong* loca_values, + FT_ULong loca_values_size, + FT_UShort index_format, + FT_ULong* checksum, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* sfnt = *sfnt_bytes; + FT_ULong dest_offset = *out_offset; + + FT_Byte* loca_buf = NULL; + FT_Byte* dst = NULL; + + FT_UInt i = 0; + FT_ULong loca_buf_size; + + const FT_ULong offset_size = index_format ? 4 : 2; + + + if ( ( loca_values_size << 2 ) >> 2 != loca_values_size ) + goto Fail; + + loca_buf_size = loca_values_size * offset_size; + if ( FT_QALLOC( loca_buf, loca_buf_size ) ) + goto Fail; + + dst = loca_buf; + for ( i = 0; i < loca_values_size; i++ ) + { + FT_ULong value = loca_values[i]; + + + if ( index_format ) + WRITE_ULONG( dst, value ); + else + WRITE_USHORT( dst, ( value >> 1 ) ); + } + + *checksum = compute_ULong_sum( loca_buf, loca_buf_size ); + /* Write `loca' table to sfnt buffer. */ + if ( WRITE_SFNT_BUF( loca_buf, loca_buf_size ) ) + goto Fail; + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + + FT_FREE( loca_buf ); + return error; + + Fail: + if ( !error ) + error = FT_THROW( Invalid_Table ); + + FT_FREE( loca_buf ); + + return error; + } + + + static FT_Error + reconstruct_glyf( FT_Stream stream, + FT_ULong* glyf_checksum, + FT_ULong* loca_checksum, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + WOFF2_Info info, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* sfnt = *sfnt_bytes; + + /* current position in stream */ + const FT_ULong pos = FT_STREAM_POS(); + + FT_UInt num_substreams = 7; + + FT_UShort option_flags; + FT_UShort num_glyphs; + FT_UShort index_format; + FT_ULong expected_loca_length; + FT_UInt offset; + FT_UInt i; + FT_ULong points_size; + FT_ULong glyph_buf_size; + FT_ULong bbox_bitmap_offset; + FT_ULong bbox_bitmap_length; + FT_ULong overlap_bitmap_offset = 0; + FT_ULong overlap_bitmap_length = 0; + + const FT_ULong glyf_start = *out_offset; + FT_ULong dest_offset = *out_offset; + + WOFF2_Substream substreams = NULL; + + FT_ULong* loca_values = NULL; + FT_UShort* n_points_arr = NULL; + FT_Byte* glyph_buf = NULL; + WOFF2_Point points = NULL; + + + if ( FT_QNEW_ARRAY( substreams, num_substreams ) ) + goto Fail; + + if ( FT_STREAM_SKIP( 2 ) ) + goto Fail; + if ( FT_READ_USHORT( option_flags ) ) + goto Fail; + if ( FT_READ_USHORT( num_glyphs ) ) + goto Fail; + if ( FT_READ_USHORT( index_format ) ) + goto Fail; + + FT_TRACE4(( "option_flags = %u; num_glyphs = %u; index_format = %u\n", + option_flags, num_glyphs, index_format )); + + info->num_glyphs = num_glyphs; + + /* Calculate expected length of loca and compare. */ + /* See https://www.w3.org/TR/WOFF2/#conform-mustRejectLoca */ + /* index_format = 0 => Short version `loca'. */ + /* index_format = 1 => Long version `loca'. */ + expected_loca_length = ( index_format ? 4 : 2 ) * + ( (FT_ULong)num_glyphs + 1 ); + if ( info->loca_table->dst_length != expected_loca_length ) + goto Fail; + + offset = 2 + 2 + 2 + 2 + ( num_substreams * 4 ); + if ( offset > info->glyf_table->TransformLength ) + goto Fail; + + for ( i = 0; i < num_substreams; ++i ) + { + FT_ULong substream_size; + + + if ( FT_READ_ULONG( substream_size ) ) + goto Fail; + if ( substream_size > info->glyf_table->TransformLength - offset ) + goto Fail; + + substreams[i].start = pos + offset; + substreams[i].offset = pos + offset; + substreams[i].size = substream_size; + + FT_TRACE5(( " Substream %d: offset = %lu; size = %lu;\n", + i, substreams[i].offset, substreams[i].size )); + offset += substream_size; + } + + if ( option_flags & HAVE_OVERLAP_SIMPLE_BITMAP ) + { + /* Size of overlapBitmap = floor((numGlyphs + 7) / 8) */ + overlap_bitmap_length = ( num_glyphs + 7U ) >> 3; + if ( overlap_bitmap_length > info->glyf_table->TransformLength - offset ) + goto Fail; + + overlap_bitmap_offset = pos + offset; + + FT_TRACE5(( " Overlap bitmap: offset = %lu; size = %lu;\n", + overlap_bitmap_offset, overlap_bitmap_length )); + offset += overlap_bitmap_length; + } + + if ( FT_QNEW_ARRAY( loca_values, num_glyphs + 1 ) ) + goto Fail; + + points_size = 0; + bbox_bitmap_offset = substreams[BBOX_STREAM].offset; + + /* Size of bboxBitmap = 4 * floor((numGlyphs + 31) / 32) */ + bbox_bitmap_length = ( ( num_glyphs + 31U ) >> 5 ) << 2; + /* bboxStreamSize is the combined size of bboxBitmap and bboxStream. */ + substreams[BBOX_STREAM].offset += bbox_bitmap_length; + + glyph_buf_size = WOFF2_DEFAULT_GLYPH_BUF; + if ( FT_QALLOC( glyph_buf, glyph_buf_size ) ) + goto Fail; + + if ( FT_QNEW_ARRAY( info->x_mins, num_glyphs ) ) + goto Fail; + + for ( i = 0; i < num_glyphs; ++i ) + { + FT_ULong glyph_size = 0; + FT_UShort n_contours = 0; + FT_Bool have_bbox = FALSE; + FT_Byte bbox_bitmap; + FT_ULong bbox_offset; + FT_UShort x_min = 0; + + + /* Set `have_bbox'. */ + bbox_offset = bbox_bitmap_offset + ( i >> 3 ); + if ( FT_STREAM_SEEK( bbox_offset ) || + FT_READ_BYTE( bbox_bitmap ) ) + goto Fail; + if ( bbox_bitmap & ( 0x80 >> ( i & 7 ) ) ) + have_bbox = TRUE; + + /* Read value from `nContourStream'. */ + if ( FT_STREAM_SEEK( substreams[N_CONTOUR_STREAM].offset ) || + FT_READ_USHORT( n_contours ) ) + goto Fail; + substreams[N_CONTOUR_STREAM].offset += 2; + + if ( n_contours == 0xffff ) + { + /* composite glyph */ + FT_Bool have_instructions = FALSE; + FT_UShort instruction_size = 0; + FT_ULong composite_size = 0; + FT_ULong size_needed; + FT_Byte* pointer = NULL; + + + /* Composite glyphs must have explicit bbox. */ + if ( !have_bbox ) + goto Fail; + + if ( compositeGlyph_size( stream, + substreams[COMPOSITE_STREAM].offset, + &composite_size, + &have_instructions) ) + goto Fail; + + if ( have_instructions ) + { + if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) || + READ_255USHORT( instruction_size ) ) + goto Fail; + substreams[GLYPH_STREAM].offset = FT_STREAM_POS(); + } + + size_needed = 12 + composite_size + instruction_size; + if ( glyph_buf_size < size_needed ) + { + if ( FT_QREALLOC( glyph_buf, glyph_buf_size, size_needed ) ) + goto Fail; + glyph_buf_size = size_needed; + } + + pointer = glyph_buf + glyph_size; + WRITE_USHORT( pointer, n_contours ); + glyph_size += 2; + + /* Read x_min for current glyph. */ + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_READ_USHORT( x_min ) ) + goto Fail; + /* No increment here because we read again. */ + + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, 8 ) ) + goto Fail; + + substreams[BBOX_STREAM].offset += 8; + glyph_size += 8; + + if ( FT_STREAM_SEEK( substreams[COMPOSITE_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, composite_size ) ) + goto Fail; + + substreams[COMPOSITE_STREAM].offset += composite_size; + glyph_size += composite_size; + + if ( have_instructions ) + { + pointer = glyph_buf + glyph_size; + WRITE_USHORT( pointer, instruction_size ); + glyph_size += 2; + + if ( FT_STREAM_SEEK( substreams[INSTRUCTION_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, instruction_size ) ) + goto Fail; + + substreams[INSTRUCTION_STREAM].offset += instruction_size; + glyph_size += instruction_size; + } + } + else if ( n_contours > 0 ) + { + /* simple glyph */ + FT_ULong total_n_points = 0; + FT_UShort n_points_contour; + FT_UInt j; + FT_ULong flag_size; + FT_ULong triplet_size; + FT_ULong triplet_bytes_used; + FT_Bool have_overlap = FALSE; + FT_Byte overlap_bitmap; + FT_ULong overlap_offset; + FT_Byte* flags_buf = NULL; + FT_Byte* triplet_buf = NULL; + FT_UShort instruction_size; + FT_ULong size_needed; + FT_Int end_point; + FT_UInt contour_ix; + + FT_Byte* pointer = NULL; + + + /* Set `have_overlap`. */ + if ( overlap_bitmap_offset ) + { + overlap_offset = overlap_bitmap_offset + ( i >> 3 ); + if ( FT_STREAM_SEEK( overlap_offset ) || + FT_READ_BYTE( overlap_bitmap ) ) + goto Fail; + if ( overlap_bitmap & ( 0x80 >> ( i & 7 ) ) ) + have_overlap = TRUE; + } + + if ( FT_QNEW_ARRAY( n_points_arr, n_contours ) ) + goto Fail; + + if ( FT_STREAM_SEEK( substreams[N_POINTS_STREAM].offset ) ) + goto Fail; + + for ( j = 0; j < n_contours; ++j ) + { + if ( READ_255USHORT( n_points_contour ) ) + goto Fail; + n_points_arr[j] = n_points_contour; + /* Prevent negative/overflow. */ + if ( total_n_points + n_points_contour < total_n_points ) + goto Fail; + total_n_points += n_points_contour; + } + substreams[N_POINTS_STREAM].offset = FT_STREAM_POS(); + + flag_size = total_n_points; + if ( flag_size > substreams[FLAG_STREAM].size ) + goto Fail; + + flags_buf = stream->base + substreams[FLAG_STREAM].offset; + triplet_buf = stream->base + substreams[GLYPH_STREAM].offset; + + if ( substreams[GLYPH_STREAM].size < + ( substreams[GLYPH_STREAM].offset - + substreams[GLYPH_STREAM].start ) ) + goto Fail; + + triplet_size = substreams[GLYPH_STREAM].size - + ( substreams[GLYPH_STREAM].offset - + substreams[GLYPH_STREAM].start ); + triplet_bytes_used = 0; + + /* Create array to store point information. */ + points_size = total_n_points; + if ( FT_QNEW_ARRAY( points, points_size ) ) + goto Fail; + + if ( triplet_decode( flags_buf, + triplet_buf, + triplet_size, + total_n_points, + points, + &triplet_bytes_used ) ) + goto Fail; + + substreams[FLAG_STREAM].offset += flag_size; + substreams[GLYPH_STREAM].offset += triplet_bytes_used; + + if ( FT_STREAM_SEEK( substreams[GLYPH_STREAM].offset ) || + READ_255USHORT( instruction_size ) ) + goto Fail; + + substreams[GLYPH_STREAM].offset = FT_STREAM_POS(); + + if ( total_n_points >= ( 1 << 27 ) ) + goto Fail; + + size_needed = 12 + + ( 2 * n_contours ) + + ( 5 * total_n_points ) + + instruction_size; + if ( glyph_buf_size < size_needed ) + { + if ( FT_QREALLOC( glyph_buf, glyph_buf_size, size_needed ) ) + goto Fail; + glyph_buf_size = size_needed; + } + + pointer = glyph_buf + glyph_size; + WRITE_USHORT( pointer, n_contours ); + glyph_size += 2; + + if ( have_bbox ) + { + /* Read x_min for current glyph. */ + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_READ_USHORT( x_min ) ) + goto Fail; + /* No increment here because we read again. */ + + if ( FT_STREAM_SEEK( substreams[BBOX_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, 8 ) ) + goto Fail; + substreams[BBOX_STREAM].offset += 8; + } + else + compute_bbox( total_n_points, points, glyph_buf, &x_min ); + + glyph_size = CONTOUR_OFFSET_END_POINT; + + pointer = glyph_buf + glyph_size; + end_point = -1; + + for ( contour_ix = 0; contour_ix < n_contours; ++contour_ix ) + { + end_point += n_points_arr[contour_ix]; + if ( end_point >= 65536 ) + goto Fail; + + WRITE_SHORT( pointer, end_point ); + glyph_size += 2; + } + + WRITE_USHORT( pointer, instruction_size ); + glyph_size += 2; + + if ( FT_STREAM_SEEK( substreams[INSTRUCTION_STREAM].offset ) || + FT_STREAM_READ( glyph_buf + glyph_size, instruction_size ) ) + goto Fail; + + substreams[INSTRUCTION_STREAM].offset += instruction_size; + glyph_size += instruction_size; + + if ( store_points( total_n_points, + points, + n_contours, + instruction_size, + have_overlap, + glyph_buf, + glyph_buf_size, + &glyph_size ) ) + goto Fail; + + FT_FREE( points ); + FT_FREE( n_points_arr ); + } + else + { + /* Empty glyph. */ + /* Must not have a bbox. */ + if ( have_bbox ) + { + FT_ERROR(( "Empty glyph has a bbox.\n" )); + goto Fail; + } + } + + loca_values[i] = dest_offset - glyf_start; + + if ( WRITE_SFNT_BUF( glyph_buf, glyph_size ) ) + goto Fail; + + if ( pad4( &sfnt, sfnt_size, &dest_offset, memory ) ) + goto Fail; + + *glyf_checksum += compute_ULong_sum( glyph_buf, glyph_size ); + + /* Store x_mins, may be required to reconstruct `hmtx'. */ + info->x_mins[i] = (FT_Short)x_min; + } + + info->glyf_table->dst_length = dest_offset - info->glyf_table->dst_offset; + info->loca_table->dst_offset = dest_offset; + + /* `loca[n]' will be equal to the length of the `glyf' table. */ + loca_values[num_glyphs] = info->glyf_table->dst_length; + + if ( store_loca( loca_values, + num_glyphs + 1, + index_format, + loca_checksum, + &sfnt, + sfnt_size, + &dest_offset, + memory ) ) + goto Fail; + + info->loca_table->dst_length = dest_offset - info->loca_table->dst_offset; + + FT_TRACE4(( " loca table info:\n" )); + FT_TRACE4(( " dst_offset = %lu\n", info->loca_table->dst_offset )); + FT_TRACE4(( " dst_length = %lu\n", info->loca_table->dst_length )); + FT_TRACE4(( " checksum = %09lx\n", *loca_checksum )); + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + + FT_FREE( substreams ); + FT_FREE( loca_values ); + FT_FREE( n_points_arr ); + FT_FREE( glyph_buf ); + FT_FREE( points ); + + return error; + + Fail: + if ( !error ) + error = FT_THROW( Invalid_Table ); + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + + FT_FREE( substreams ); + FT_FREE( loca_values ); + FT_FREE( n_points_arr ); + FT_FREE( glyph_buf ); + FT_FREE( points ); + + return error; + } + + + /* Get `x_mins' for untransformed `glyf' table. */ + static FT_Error + get_x_mins( FT_Stream stream, + WOFF2_Table* tables, + FT_UShort num_tables, + WOFF2_Info info, + FT_Memory memory ) + { + FT_UShort num_glyphs; + FT_UShort index_format; + FT_ULong glyf_offset; + FT_UShort glyf_offset_short; + FT_ULong loca_offset; + FT_Int i; + FT_Error error = FT_Err_Ok; + FT_ULong offset_size; + + /* At this point of time those tables might not have been read yet. */ + const WOFF2_Table maxp_table = find_table( tables, num_tables, + TTAG_maxp ); + const WOFF2_Table head_table = find_table( tables, num_tables, + TTAG_head ); + + + if ( !maxp_table ) + { + FT_ERROR(( "`maxp' table is missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + if ( !head_table ) + { + FT_ERROR(( "`head' table is missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + if ( !info->loca_table ) + { + FT_ERROR(( "`loca' table is missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Read `numGlyphs' field from `maxp' table. */ + if ( FT_STREAM_SEEK( maxp_table->src_offset ) || FT_STREAM_SKIP( 8 ) ) + return error; + + if ( FT_READ_USHORT( num_glyphs ) ) + return error; + + info->num_glyphs = num_glyphs; + + /* Read `indexToLocFormat' field from `head' table. */ + if ( FT_STREAM_SEEK( head_table->src_offset ) || + FT_STREAM_SKIP( 50 ) ) + return error; + + if ( FT_READ_USHORT( index_format ) ) + return error; + + offset_size = index_format ? 4 : 2; + + /* Create `x_mins' array. */ + if ( FT_QNEW_ARRAY( info->x_mins, num_glyphs ) ) + return error; + + loca_offset = info->loca_table->src_offset; + + for ( i = 0; i < num_glyphs; ++i ) + { + if ( FT_STREAM_SEEK( loca_offset ) ) + return error; + + loca_offset += offset_size; + + if ( index_format ) + { + if ( FT_READ_ULONG( glyf_offset ) ) + return error; + } + else + { + if ( FT_READ_USHORT( glyf_offset_short ) ) + return error; + + glyf_offset = (FT_ULong)( glyf_offset_short ); + glyf_offset = glyf_offset << 1; + } + + glyf_offset += info->glyf_table->src_offset; + + if ( FT_STREAM_SEEK( glyf_offset ) || FT_STREAM_SKIP( 2 ) ) + return error; + + if ( FT_READ_SHORT( info->x_mins[i] ) ) + return error; + } + + return error; + } + + + static FT_Error + reconstruct_hmtx( FT_Stream stream, + FT_UShort num_glyphs, + FT_UShort num_hmetrics, + FT_Short* x_mins, + FT_ULong* checksum, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_ULong* out_offset, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* sfnt = *sfnt_bytes; + FT_ULong dest_offset = *out_offset; + + FT_Byte hmtx_flags; + FT_Bool has_proportional_lsbs, has_monospace_lsbs; + FT_ULong hmtx_table_size; + FT_Int i; + + FT_UShort* advance_widths = NULL; + FT_Short* lsbs = NULL; + FT_Byte* hmtx_table = NULL; + FT_Byte* dst = NULL; + + + if ( FT_READ_BYTE( hmtx_flags ) ) + goto Fail; + + has_proportional_lsbs = ( hmtx_flags & 1 ) == 0; + has_monospace_lsbs = ( hmtx_flags & 2 ) == 0; + + /* Bits 2-7 are reserved and MUST be zero. */ + if ( ( hmtx_flags & 0xFC ) != 0 ) + goto Fail; + + /* Are you REALLY transformed? */ + if ( has_proportional_lsbs && has_monospace_lsbs ) + goto Fail; + + /* Cannot have a transformed `hmtx' without `glyf'. */ + if ( ( num_hmetrics > num_glyphs ) || + ( num_hmetrics < 1 ) ) + goto Fail; + + /* Must have at least one entry. */ + if ( num_hmetrics < 1 ) + goto Fail; + + if ( FT_QNEW_ARRAY( advance_widths, num_hmetrics ) || + FT_QNEW_ARRAY( lsbs, num_glyphs ) ) + goto Fail; + + /* Read `advanceWidth' stream. Always present. */ + for ( i = 0; i < num_hmetrics; i++ ) + { + FT_UShort advance_width; + + + if ( FT_READ_USHORT( advance_width ) ) + goto Fail; + + advance_widths[i] = advance_width; + } + + /* lsb values for proportional glyphs. */ + for ( i = 0; i < num_hmetrics; i++ ) + { + FT_Short lsb; + + + if ( has_proportional_lsbs ) + { + if ( FT_READ_SHORT( lsb ) ) + goto Fail; + } + else + lsb = x_mins[i]; + + lsbs[i] = lsb; + } + + /* lsb values for monospaced glyphs. */ + for ( i = num_hmetrics; i < num_glyphs; i++ ) + { + FT_Short lsb; + + + if ( has_monospace_lsbs ) + { + if ( FT_READ_SHORT( lsb ) ) + goto Fail; + } + else + lsb = x_mins[i]; + + lsbs[i] = lsb; + } + + /* Build the hmtx table. */ + hmtx_table_size = 2 * num_hmetrics + 2 * num_glyphs; + if ( FT_QALLOC( hmtx_table, hmtx_table_size ) ) + goto Fail; + + dst = hmtx_table; + FT_TRACE6(( "hmtx values: \n" )); + for ( i = 0; i < num_glyphs; i++ ) + { + if ( i < num_hmetrics ) + { + WRITE_SHORT( dst, advance_widths[i] ); + FT_TRACE6(( "%d ", advance_widths[i] )); + } + + WRITE_SHORT( dst, lsbs[i] ); + FT_TRACE6(( "%d ", lsbs[i] )); + } + FT_TRACE6(( "\n" )); + + *checksum = compute_ULong_sum( hmtx_table, hmtx_table_size ); + /* Write `hmtx' table to sfnt buffer. */ + if ( WRITE_SFNT_BUF( hmtx_table, hmtx_table_size ) ) + goto Fail; + + /* Set pointer `sfnt_bytes' to its correct value. */ + *sfnt_bytes = sfnt; + *out_offset = dest_offset; + + FT_FREE( advance_widths ); + FT_FREE( lsbs ); + FT_FREE( hmtx_table ); + + return error; + + Fail: + FT_FREE( advance_widths ); + FT_FREE( lsbs ); + FT_FREE( hmtx_table ); + + if ( !error ) + error = FT_THROW( Invalid_Table ); + + return error; + } + + + static FT_Error + reconstruct_font( FT_Byte* transformed_buf, + FT_ULong transformed_buf_size, + WOFF2_Table* indices, + WOFF2_Header woff2, + WOFF2_Info info, + FT_Byte** sfnt_bytes, + FT_ULong* sfnt_size, + FT_Memory memory ) + { + /* Memory management of `transformed_buf' is handled by the caller. */ + + FT_Error error = FT_Err_Ok; + FT_Stream stream = NULL; + FT_Byte* buf_cursor = NULL; + FT_Byte table_entry[16]; + + /* We are reallocating memory for `sfnt', so its pointer may change. */ + FT_Byte* sfnt = *sfnt_bytes; + + FT_UShort num_tables = woff2->num_tables; + FT_ULong dest_offset = 12 + num_tables * 16UL; + + FT_ULong checksum = 0; + FT_ULong loca_checksum = 0; + FT_Int nn = 0; + FT_UShort num_hmetrics = 0; + FT_ULong font_checksum = info->header_checksum; + FT_Bool is_glyf_xform = FALSE; + + FT_ULong table_entry_offset = 12; + + + /* A few table checks before reconstruction. */ + /* `glyf' must be present with `loca'. */ + info->glyf_table = find_table( indices, num_tables, TTAG_glyf ); + info->loca_table = find_table( indices, num_tables, TTAG_loca ); + + if ( ( info->glyf_table == NULL ) ^ ( info->loca_table == NULL ) ) + { + FT_ERROR(( "One of `glyf'/`loca' tables missing.\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Both `glyf' and `loca' must have same transformation. */ + if ( info->glyf_table != NULL ) + { + if ( ( info->glyf_table->flags & WOFF2_FLAGS_TRANSFORM ) != + ( info->loca_table->flags & WOFF2_FLAGS_TRANSFORM ) ) + { + FT_ERROR(( "Transformation mismatch" + " between `glyf' and `loca' table." )); + return FT_THROW( Invalid_Table ); + } + } + + /* Create a stream for the uncompressed buffer. */ + if ( FT_NEW( stream ) ) + goto Fail; + FT_Stream_OpenMemory( stream, transformed_buf, transformed_buf_size ); + + FT_ASSERT( FT_STREAM_POS() == 0 ); + + /* Reconstruct/copy tables to output stream. */ + for ( nn = 0; nn < num_tables; nn++ ) + { + WOFF2_TableRec table = *( indices[nn] ); + + + FT_TRACE3(( "Seeking to %ld with table size %ld.\n", + table.src_offset, table.src_length )); + FT_TRACE3(( "Table tag: %c%c%c%c.\n", + (FT_Char)( table.Tag >> 24 ), + (FT_Char)( table.Tag >> 16 ), + (FT_Char)( table.Tag >> 8 ), + (FT_Char)( table.Tag ) )); + + if ( FT_STREAM_SEEK( table.src_offset ) ) + goto Fail; + + if ( table.src_offset + table.src_length > transformed_buf_size ) + goto Fail; + + /* Get stream size for fields of `hmtx' table. */ + if ( table.Tag == TTAG_hhea ) + { + if ( read_num_hmetrics( stream, &num_hmetrics ) ) + goto Fail; + } + + info->num_hmetrics = num_hmetrics; + + checksum = 0; + if ( ( table.flags & WOFF2_FLAGS_TRANSFORM ) != WOFF2_FLAGS_TRANSFORM ) + { + /* Check whether `head' is at least 12 bytes. */ + if ( table.Tag == TTAG_head ) + { + if ( table.src_length < 12 ) + goto Fail; + + buf_cursor = transformed_buf + table.src_offset + 8; + /* Set checkSumAdjustment = 0 */ + WRITE_ULONG( buf_cursor, 0 ); + } + + table.dst_offset = dest_offset; + + checksum = compute_ULong_sum( transformed_buf + table.src_offset, + table.src_length ); + FT_TRACE4(( "Checksum = %09lx.\n", checksum )); + + if ( WRITE_SFNT_BUF( transformed_buf + table.src_offset, + table.src_length ) ) + goto Fail; + } + else + { + FT_TRACE3(( "This table is transformed.\n" )); + + if ( table.Tag == TTAG_glyf ) + { + is_glyf_xform = TRUE; + table.dst_offset = dest_offset; + + if ( reconstruct_glyf( stream, + &checksum, + &loca_checksum, + &sfnt, + sfnt_size, + &dest_offset, + info, + memory ) ) + goto Fail; + + FT_TRACE4(( "Checksum = %09lx.\n", checksum )); + } + + else if ( table.Tag == TTAG_loca ) + checksum = loca_checksum; + + else if ( table.Tag == TTAG_hmtx ) + { + /* If glyf is not transformed and hmtx is, handle separately. */ + if ( !is_glyf_xform ) + { + if ( get_x_mins( stream, indices, num_tables, info, memory ) ) + goto Fail; + } + + table.dst_offset = dest_offset; + + if ( reconstruct_hmtx( stream, + info->num_glyphs, + info->num_hmetrics, + info->x_mins, + &checksum, + &sfnt, + sfnt_size, + &dest_offset, + memory ) ) + goto Fail; + } + else + { + /* Unknown transform. */ + FT_ERROR(( "Unknown table transform.\n" )); + goto Fail; + } + } + + font_checksum += checksum; + + buf_cursor = &table_entry[0]; + WRITE_ULONG( buf_cursor, table.Tag ); + WRITE_ULONG( buf_cursor, checksum ); + WRITE_ULONG( buf_cursor, table.dst_offset ); + WRITE_ULONG( buf_cursor, table.dst_length ); + + WRITE_SFNT_BUF_AT( table_entry_offset, table_entry, 16 ); + + /* Update checksum. */ + font_checksum += compute_ULong_sum( table_entry, 16 ); + + if ( pad4( &sfnt, sfnt_size, &dest_offset, memory ) ) + goto Fail; + + /* Sanity check. */ + if ( (FT_ULong)( table.dst_offset + table.dst_length ) > dest_offset ) + { + FT_ERROR(( "Table was partially written.\n" )); + goto Fail; + } + } + + /* Update `head' checkSumAdjustment. */ + info->head_table = find_table( indices, num_tables, TTAG_head ); + if ( !info->head_table ) + { + FT_ERROR(( "`head' table is missing.\n" )); + goto Fail; + } + + if ( info->head_table->dst_length < 12 ) + goto Fail; + + buf_cursor = sfnt + info->head_table->dst_offset + 8; + font_checksum = 0xB1B0AFBA - font_checksum; + + WRITE_ULONG( buf_cursor, font_checksum ); + + FT_TRACE2(( "Final checksum = %09lx.\n", font_checksum )); + + woff2->actual_sfnt_size = dest_offset; + + /* Set pointer of sfnt stream to its correct value. */ + *sfnt_bytes = sfnt; + + FT_Stream_Close( stream ); + FT_FREE( stream ); + + return error; + + Fail: + if ( !error ) + error = FT_THROW( Invalid_Table ); + + /* Set pointer of sfnt stream to its correct value. */ + *sfnt_bytes = sfnt; + + FT_Stream_Close( stream ); + FT_FREE( stream ); + + return error; + } + + + /* Replace `face->root.stream' with a stream containing the extracted */ + /* SFNT of a WOFF2 font. */ + + FT_LOCAL_DEF( FT_Error ) + woff2_open_font( FT_Stream stream, + TT_Face face, + FT_Int* face_instance_index, + FT_Long* num_faces ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + FT_Int face_index; + + WOFF2_HeaderRec woff2; + WOFF2_InfoRec info = { 0, 0, 0, NULL, NULL, NULL, NULL }; + WOFF2_Table tables = NULL; + WOFF2_Table* indices = NULL; + WOFF2_Table* temp_indices = NULL; + WOFF2_Table last_table; + + FT_Int nn; + FT_ULong j; + FT_ULong flags; + FT_UShort xform_version; + FT_ULong src_offset = 0; + + FT_UInt glyf_index; + FT_UInt loca_index; + FT_UInt32 file_offset; + + FT_Byte* sfnt = NULL; + FT_Stream sfnt_stream = NULL; + FT_Byte* sfnt_header; + FT_ULong sfnt_size; + + FT_Byte* uncompressed_buf = NULL; + + static const FT_Frame_Field woff2_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WOFF2_HeaderRec + + FT_FRAME_START( 48 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_ULONG ( flavor ), + FT_FRAME_ULONG ( length ), + FT_FRAME_USHORT ( num_tables ), + FT_FRAME_SKIP_BYTES( 2 ), + FT_FRAME_ULONG ( totalSfntSize ), + FT_FRAME_ULONG ( totalCompressedSize ), + FT_FRAME_SKIP_BYTES( 2 * 2 ), + FT_FRAME_ULONG ( metaOffset ), + FT_FRAME_ULONG ( metaLength ), + FT_FRAME_ULONG ( metaOrigLength ), + FT_FRAME_ULONG ( privOffset ), + FT_FRAME_ULONG ( privLength ), + FT_FRAME_END + }; + + + FT_ASSERT( stream == face->root.stream ); + FT_ASSERT( FT_STREAM_POS() == 0 ); + + face_index = FT_ABS( *face_instance_index ) & 0xFFFF; + + /* Read WOFF2 Header. */ + if ( FT_STREAM_READ_FIELDS( woff2_header_fields, &woff2 ) ) + return error; + + FT_TRACE4(( "signature -> 0x%lX\n", woff2.signature )); + FT_TRACE2(( "flavor -> 0x%08lx\n", woff2.flavor )); + FT_TRACE4(( "length -> %lu\n", woff2.length )); + FT_TRACE2(( "num_tables -> %hu\n", woff2.num_tables )); + FT_TRACE4(( "totalSfntSize -> %lu\n", woff2.totalSfntSize )); + FT_TRACE4(( "metaOffset -> %lu\n", woff2.metaOffset )); + FT_TRACE4(( "metaLength -> %lu\n", woff2.metaLength )); + FT_TRACE4(( "privOffset -> %lu\n", woff2.privOffset )); + FT_TRACE4(( "privLength -> %lu\n", woff2.privLength )); + + /* Make sure we don't recurse back here. */ + if ( woff2.flavor == TTAG_wOF2 ) + return FT_THROW( Invalid_Table ); + + /* Miscellaneous checks. */ + if ( woff2.length != stream->size || + woff2.num_tables == 0 || + 48 + woff2.num_tables * 20UL >= woff2.length || + ( woff2.metaOffset == 0 && ( woff2.metaLength != 0 || + woff2.metaOrigLength != 0 ) ) || + ( woff2.metaLength != 0 && woff2.metaOrigLength == 0 ) || + ( woff2.metaOffset >= woff2.length ) || + ( woff2.length - woff2.metaOffset < woff2.metaLength ) || + ( woff2.privOffset == 0 && woff2.privLength != 0 ) || + ( woff2.privOffset >= woff2.length ) || + ( woff2.length - woff2.privOffset < woff2.privLength ) ) + { + FT_ERROR(( "woff2_open_font: invalid WOFF2 header\n" )); + return FT_THROW( Invalid_Table ); + } + + FT_TRACE2(( "woff2_open_font: WOFF2 Header is valid.\n" )); + + woff2.ttc_fonts = NULL; + + /* Read table directory. */ + if ( FT_QNEW_ARRAY( tables, woff2.num_tables ) || + FT_QNEW_ARRAY( indices, woff2.num_tables ) ) + goto Exit; + + FT_TRACE2(( "\n" )); + FT_TRACE2(( " tag flags transform origLen transformLen offset\n" )); + FT_TRACE2(( " -----------------------------------------------------------\n" )); + /* " XXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX" */ + + for ( nn = 0; nn < woff2.num_tables; nn++ ) + { + WOFF2_Table table = tables + nn; + + + if ( FT_READ_BYTE( table->FlagByte ) ) + goto Exit; + + if ( ( table->FlagByte & 0x3f ) == 0x3f ) + { + if ( FT_READ_ULONG( table->Tag ) ) + goto Exit; + } + else + { + table->Tag = woff2_known_tags( table->FlagByte & 0x3f ); + if ( !table->Tag ) + { + FT_ERROR(( "woff2_open_font: Unknown table tag." )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + flags = 0; + xform_version = ( table->FlagByte >> 6 ) & 0x03; + + /* 0 means xform for glyph/loca, non-0 for others. */ + if ( table->Tag == TTAG_glyf || table->Tag == TTAG_loca ) + { + if ( xform_version == 0 ) + flags |= WOFF2_FLAGS_TRANSFORM; + } + else if ( xform_version != 0 ) + flags |= WOFF2_FLAGS_TRANSFORM; + + flags |= xform_version; + + if ( READ_BASE128( table->dst_length ) ) + goto Exit; + + table->TransformLength = table->dst_length; + + if ( ( flags & WOFF2_FLAGS_TRANSFORM ) != 0 ) + { + if ( READ_BASE128( table->TransformLength ) ) + goto Exit; + + if ( table->Tag == TTAG_loca && table->TransformLength ) + { + FT_ERROR(( "woff2_open_font: Invalid loca `transformLength'.\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + if ( src_offset + table->TransformLength < src_offset ) + { + FT_ERROR(( "woff2_open_font: invalid WOFF2 table directory.\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + table->flags = flags; + table->src_offset = src_offset; + table->src_length = table->TransformLength; + src_offset += table->TransformLength; + table->dst_offset = 0; + + FT_TRACE2(( " %c%c%c%c %08d %08d %08ld %08ld %08ld\n", + (FT_Char)( table->Tag >> 24 ), + (FT_Char)( table->Tag >> 16 ), + (FT_Char)( table->Tag >> 8 ), + (FT_Char)( table->Tag ), + table->FlagByte & 0x3f, + ( table->FlagByte >> 6 ) & 0x03, + table->dst_length, + table->TransformLength, + table->src_offset )); + + indices[nn] = table; + } + + /* End of last table is uncompressed size. */ + last_table = indices[woff2.num_tables - 1]; + + woff2.uncompressed_size = last_table->src_offset + + last_table->src_length; + if ( woff2.uncompressed_size < last_table->src_offset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE2(( "Table directory parsed.\n" )); + + /* Check for and read collection directory. */ + woff2.num_fonts = 1; + woff2.header_version = 0; + + if ( woff2.flavor == TTAG_ttcf ) + { + FT_TRACE2(( "Font is a TTC, reading collection directory.\n" )); + + if ( FT_READ_ULONG( woff2.header_version ) ) + goto Exit; + + if ( woff2.header_version != 0x00010000 && + woff2.header_version != 0x00020000 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( READ_255USHORT( woff2.num_fonts ) ) + goto Exit; + + if ( !woff2.num_fonts ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE4(( "Number of fonts in TTC: %d\n", woff2.num_fonts )); + + /* pre-zero pointers within in case of failure */ + if ( FT_NEW_ARRAY( woff2.ttc_fonts, woff2.num_fonts ) ) + goto Exit; + + for ( nn = 0; nn < woff2.num_fonts; nn++ ) + { + WOFF2_TtcFont ttc_font = woff2.ttc_fonts + nn; + + + if ( READ_255USHORT( ttc_font->num_tables ) ) + goto Exit; + if ( FT_READ_ULONG( ttc_font->flavor ) ) + goto Exit; + + if ( FT_QNEW_ARRAY( ttc_font->table_indices, ttc_font->num_tables ) ) + goto Exit; + + FT_TRACE5(( "Number of tables in font %d: %d\n", + nn, ttc_font->num_tables )); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ttc_font->num_tables ) + FT_TRACE6(( " Indices: " )); +#endif + + glyf_index = 0; + loca_index = 0; + + for ( j = 0; j < ttc_font->num_tables; j++ ) + { + FT_UShort table_index; + WOFF2_Table table; + + + if ( READ_255USHORT( table_index ) ) + goto Exit; + + FT_TRACE6(( "%hu ", table_index )); + if ( table_index >= woff2.num_tables ) + { + FT_ERROR(( "woff2_open_font: invalid table index\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + ttc_font->table_indices[j] = table_index; + + table = indices[table_index]; + if ( table->Tag == TTAG_loca ) + loca_index = table_index; + if ( table->Tag == TTAG_glyf ) + glyf_index = table_index; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ttc_font->num_tables ) + FT_TRACE6(( "\n" )); +#endif + + /* glyf and loca must be consecutive */ + if ( glyf_index > 0 || loca_index > 0 ) + { + if ( glyf_index > loca_index || + loca_index - glyf_index != 1 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + } + + /* Collection directory reading complete. */ + FT_TRACE2(( "WOFF2 collection directory is valid.\n" )); + } + else + woff2.ttc_fonts = NULL; + + woff2.compressed_offset = FT_STREAM_POS(); + file_offset = ROUND4( woff2.compressed_offset + + woff2.totalCompressedSize ); + + /* Some more checks before we start reading the tables. */ + if ( file_offset > woff2.length ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( woff2.metaOffset ) + { + if ( file_offset != woff2.metaOffset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + file_offset = ROUND4( woff2.metaOffset + woff2.metaLength ); + } + + if ( woff2.privOffset ) + { + if ( file_offset != woff2.privOffset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + file_offset = ROUND4( woff2.privOffset + woff2.privLength ); + } + + if ( file_offset != ( ROUND4( woff2.length ) ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* Validate requested face index. */ + *num_faces = woff2.num_fonts; + /* value -(N+1) requests information on index N */ + if ( *face_instance_index < 0 && face_index > 0 ) + face_index--; + + if ( face_index >= woff2.num_fonts ) + { + if ( *face_instance_index >= 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + else + face_index = 0; + } + + /* Only retain tables of the requested face in a TTC. */ + if ( woff2.header_version ) + { + WOFF2_TtcFont ttc_font = woff2.ttc_fonts + face_index; + + + /* Create a temporary array. */ + if ( FT_QNEW_ARRAY( temp_indices, + ttc_font->num_tables ) ) + goto Exit; + + FT_TRACE4(( "Storing tables for TTC face index %d.\n", face_index )); + for ( nn = 0; nn < ttc_font->num_tables; nn++ ) + temp_indices[nn] = indices[ttc_font->table_indices[nn]]; + + /* Resize array to required size. */ + if ( FT_QRENEW_ARRAY( indices, + woff2.num_tables, + ttc_font->num_tables ) ) + goto Exit; + + for ( nn = 0; nn < ttc_font->num_tables; nn++ ) + indices[nn] = temp_indices[nn]; + + FT_FREE( temp_indices ); + + /* Change header values. */ + woff2.flavor = ttc_font->flavor; + woff2.num_tables = ttc_font->num_tables; + } + + /* We need to allocate this much at the minimum. */ + sfnt_size = 12 + woff2.num_tables * 16UL; + /* This is what we normally expect. */ + /* Initially trust `totalSfntSize' and change later as required. */ + if ( woff2.totalSfntSize > sfnt_size ) + { + /* However, adjust the value to something reasonable. */ + + /* Factor 64 is heuristic. */ + if ( ( woff2.totalSfntSize >> 6 ) > woff2.length ) + sfnt_size = woff2.length << 6; + else + sfnt_size = woff2.totalSfntSize; + + if ( sfnt_size >= MAX_SFNT_SIZE ) + sfnt_size = MAX_SFNT_SIZE; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( sfnt_size != woff2.totalSfntSize ) + FT_TRACE4(( "adjusting estimate of uncompressed font size" + " to %lu bytes\n", + sfnt_size )); +#endif + } + + /* Write sfnt header. */ + if ( FT_QALLOC( sfnt, sfnt_size ) || + FT_NEW( sfnt_stream ) ) + goto Exit; + + sfnt_header = sfnt; + + WRITE_ULONG( sfnt_header, woff2.flavor ); + + if ( woff2.num_tables ) + { + FT_UInt searchRange, entrySelector, rangeShift, x; + + + x = woff2.num_tables; + entrySelector = 0; + while ( x ) + { + x >>= 1; + entrySelector += 1; + } + entrySelector--; + + searchRange = ( 1 << entrySelector ) * 16; + rangeShift = ( woff2.num_tables * 16 ) - searchRange; + + WRITE_USHORT( sfnt_header, woff2.num_tables ); + WRITE_USHORT( sfnt_header, searchRange ); + WRITE_USHORT( sfnt_header, entrySelector ); + WRITE_USHORT( sfnt_header, rangeShift ); + } + + info.header_checksum = compute_ULong_sum( sfnt, 12 ); + + /* Sort tables by tag. */ + ft_qsort( indices, + woff2.num_tables, + sizeof ( WOFF2_Table ), + compare_tags ); + + /* reject fonts that have multiple tables with the same tag */ + for ( nn = 1; nn < woff2.num_tables; nn++ ) + { + FT_Tag tag = indices[nn]->Tag; + + + if ( tag == indices[nn - 1]->Tag ) + { + FT_ERROR(( "woff2_open_font:" + " multiple tables with tag `%c%c%c%c'.\n", + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + if ( woff2.uncompressed_size < 1 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* We must not blindly trust `uncompressed_size` since its */ + /* value might be corrupted. If it is too large, reject the */ + /* font. In other words, we don't accept a WOFF2 font that */ + /* expands to something larger than MAX_SFNT_SIZE. If ever */ + /* necessary, this limit can be easily adjusted. */ + if ( woff2.uncompressed_size > MAX_SFNT_SIZE ) + { + FT_ERROR(( "Uncompressed font too large.\n" )); + error = FT_THROW( Array_Too_Large ); + goto Exit; + } + + /* Allocate memory for uncompressed table data. */ + if ( FT_QALLOC( uncompressed_buf, woff2.uncompressed_size ) || + FT_FRAME_ENTER( woff2.totalCompressedSize ) ) + goto Exit; + + /* Uncompress the stream. */ + error = woff2_decompress( uncompressed_buf, + woff2.uncompressed_size, + stream->cursor, + woff2.totalCompressedSize ); + + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + error = reconstruct_font( uncompressed_buf, + woff2.uncompressed_size, + indices, + &woff2, + &info, + &sfnt, + &sfnt_size, + memory ); + + if ( error ) + goto Exit; + + /* Resize `sfnt' to actual size of sfnt stream. */ + if ( woff2.actual_sfnt_size < sfnt_size ) + { + FT_TRACE5(( "Trimming sfnt stream from %lu to %lu.\n", + sfnt_size, woff2.actual_sfnt_size )); + if ( FT_QREALLOC( sfnt, + (FT_ULong)( sfnt_size ), + (FT_ULong)( woff2.actual_sfnt_size ) ) ) + goto Exit; + } + + /* `reconstruct_font' has done all the work. */ + /* Swap out stream and return. */ + FT_Stream_OpenMemory( sfnt_stream, sfnt, woff2.actual_sfnt_size ); + sfnt_stream->memory = stream->memory; + sfnt_stream->close = stream_close; + + FT_Stream_Free( + face->root.stream, + ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->root.stream = sfnt_stream; + face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + + /* Set face_index to 0 or -1. */ + if ( *face_instance_index >= 0 ) + *face_instance_index = 0; + else + *face_instance_index = -1; + + FT_TRACE2(( "woff2_open_font: SFNT synthesized.\n" )); + + Exit: + FT_FREE( tables ); + FT_FREE( indices ); + FT_FREE( uncompressed_buf ); + FT_FREE( info.x_mins ); + + if ( woff2.ttc_fonts ) + { + WOFF2_TtcFont ttc_font = woff2.ttc_fonts; + + + for ( nn = 0; nn < woff2.num_fonts; nn++ ) + { + FT_FREE( ttc_font->table_indices ); + ttc_font++; + } + + FT_FREE( woff2.ttc_fonts ); + } + + if ( error ) + { + FT_FREE( sfnt ); + if ( sfnt_stream ) + { + FT_Stream_Close( sfnt_stream ); + FT_FREE( sfnt_stream ); + } + } + + return error; + } + + +#undef READ_255USHORT +#undef READ_BASE128 +#undef ROUND4 +#undef WRITE_USHORT +#undef WRITE_ULONG +#undef WRITE_SHORT +#undef WRITE_SFNT_BUF +#undef WRITE_SFNT_BUF_AT + +#undef N_CONTOUR_STREAM +#undef N_POINTS_STREAM +#undef FLAG_STREAM +#undef GLYPH_STREAM +#undef COMPOSITE_STREAM +#undef BBOX_STREAM +#undef INSTRUCTION_STREAM + +#else /* !FT_CONFIG_OPTION_USE_BROTLI */ + + /* ANSI C doesn't like empty source files */ + typedef int sfwoff2_dummy_; + +#endif /* !FT_CONFIG_OPTION_USE_BROTLI */ + + +/* END */ diff --git a/external/freetype/src/sfnt/sfwoff2.h b/external/freetype/src/sfnt/sfwoff2.h new file mode 100644 index 000000000..4901286ee --- /dev/null +++ b/external/freetype/src/sfnt/sfwoff2.h @@ -0,0 +1,78 @@ +/**************************************************************************** + * + * sfwoff2.h + * + * WOFFF2 format management (specification). + * + * Copyright (C) 2019-2023 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef SFWOFF2_H_ +#define SFWOFF2_H_ + + +#include <freetype/internal/sfnt.h> +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_USE_BROTLI + + /* Leave the first byte open to store `flag_byte'. */ +#define WOFF2_FLAGS_TRANSFORM 1 << 8 + +#define WOFF2_SFNT_HEADER_SIZE 12 +#define WOFF2_SFNT_ENTRY_SIZE 16 + + /* Suggested maximum size for output. */ +#define WOFF2_DEFAULT_MAX_SIZE 30 * 1024 * 1024 + + /* 98% of Google Fonts have no glyph above 5k bytes. */ +#define WOFF2_DEFAULT_GLYPH_BUF 5120 + + /* Composite glyph flags. */ + /* See `CompositeGlyph.java' in `sfntly' for full definitions. */ +#define FLAG_ARG_1_AND_2_ARE_WORDS 1 << 0 +#define FLAG_WE_HAVE_A_SCALE 1 << 3 +#define FLAG_MORE_COMPONENTS 1 << 5 +#define FLAG_WE_HAVE_AN_X_AND_Y_SCALE 1 << 6 +#define FLAG_WE_HAVE_A_TWO_BY_TWO 1 << 7 +#define FLAG_WE_HAVE_INSTRUCTIONS 1 << 8 + + /* Simple glyph flags */ +#define GLYF_ON_CURVE 1 << 0 +#define GLYF_X_SHORT 1 << 1 +#define GLYF_Y_SHORT 1 << 2 +#define GLYF_REPEAT 1 << 3 +#define GLYF_THIS_X_IS_SAME 1 << 4 +#define GLYF_THIS_Y_IS_SAME 1 << 5 +#define GLYF_OVERLAP_SIMPLE 1 << 6 + + /* Other constants */ +#define CONTOUR_OFFSET_END_POINT 10 + + + FT_LOCAL( FT_Error ) + woff2_open_font( FT_Stream stream, + TT_Face face, + FT_Int* face_index, + FT_Long* num_faces ); + +#endif /* FT_CONFIG_OPTION_USE_BROTLI */ + +FT_END_HEADER + +#endif /* SFWOFF2_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttbdf.c b/external/freetype/src/sfnt/ttbdf.c new file mode 100644 index 000000000..536fa7467 --- /dev/null +++ b/external/freetype/src/sfnt/ttbdf.c @@ -0,0 +1,257 @@ +/**************************************************************************** + * + * ttbdf.c + * + * TrueType and OpenType embedded BDF properties (body). + * + * Copyright (C) 2005-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include "ttbdf.h" + +#include "sferrors.h" + + +#ifdef TT_CONFIG_OPTION_BDF + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttbdf + + + FT_LOCAL_DEF( void ) + tt_face_free_bdf_props( TT_Face face ) + { + TT_BDF bdf = &face->bdf; + + + if ( bdf->loaded ) + { + FT_Stream stream = FT_FACE( face )->stream; + + + if ( bdf->table ) + FT_FRAME_RELEASE( bdf->table ); + + bdf->table_end = NULL; + bdf->strings = NULL; + bdf->strings_size = 0; + } + } + + + static FT_Error + tt_face_load_bdf_props( TT_Face face, + FT_Stream stream ) + { + TT_BDF bdf = &face->bdf; + FT_ULong length; + FT_Error error; + + + FT_ZERO( bdf ); + + error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); + if ( error || + length < 8 || + FT_FRAME_EXTRACT( length, bdf->table ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + bdf->table_end = bdf->table + length; + + { + FT_Byte* p = bdf->table; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt num_strikes = FT_NEXT_USHORT( p ); + FT_ULong strings = FT_NEXT_ULONG ( p ); + FT_UInt count; + FT_Byte* strike; + + + if ( version != 0x0001 || + strings < 8 || + ( strings - 8 ) / 4 < num_strikes || + strings + 1 > length ) + { + goto BadTable; + } + + bdf->num_strikes = num_strikes; + bdf->strings = bdf->table + strings; + bdf->strings_size = length - strings; + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + count * 4; + + + for ( ; count > 0; count-- ) + { + FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); + + /* + * We don't need to check the value sets themselves, since this + * is done later. + */ + strike += 10 * num_items; + + p += 4; + } + + if ( strike > bdf->strings ) + goto BadTable; + } + + bdf->loaded = 1; + + Exit: + return error; + + BadTable: + FT_FRAME_RELEASE( bdf->table ); + FT_ZERO( bdf ); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_find_bdf_prop( FT_Face face, /* TT_Face */ + const char* property_name, + BDF_PropertyRec *aprop ) + { + TT_Face ttface = (TT_Face)face; + TT_BDF bdf = &ttface->bdf; + FT_Size size = FT_FACE_SIZE( face ); + FT_Error error = FT_Err_Ok; + FT_Byte* p; + FT_UInt count; + FT_Byte* strike; + FT_Offset property_len; + + + aprop->type = BDF_PROPERTY_TYPE_NONE; + + if ( bdf->loaded == 0 ) + { + error = tt_face_load_bdf_props( ttface, FT_FACE_STREAM( face ) ); + if ( error ) + goto Exit; + } + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + 4 * count; + + error = FT_ERR( Invalid_Argument ); + + if ( !size || !property_name ) + goto Exit; + + property_len = ft_strlen( property_name ); + if ( property_len == 0 ) + goto Exit; + + for ( ; count > 0; count-- ) + { + FT_UInt _ppem = FT_NEXT_USHORT( p ); + FT_UInt _count = FT_NEXT_USHORT( p ); + + + if ( _ppem == size->metrics.y_ppem ) + { + count = _count; + goto FoundStrike; + } + + strike += 10 * _count; + } + goto Exit; + + FoundStrike: + p = strike; + for ( ; count > 0; count-- ) + { + FT_UInt type = FT_PEEK_USHORT( p + 4 ); + + + if ( ( type & 0x10 ) != 0 ) + { + FT_UInt32 name_offset = FT_PEEK_ULONG( p ); + FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); + + /* be a bit paranoid for invalid entries here */ + if ( name_offset < bdf->strings_size && + property_len < bdf->strings_size - name_offset && + ft_strncmp( property_name, + (const char*)bdf->strings + name_offset, + bdf->strings_size - name_offset ) == 0 ) + { + switch ( type & 0x0F ) + { + case 0x00: /* string */ + case 0x01: /* atoms */ + /* check that the content is really 0-terminated */ + if ( value < bdf->strings_size && + ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) + { + aprop->type = BDF_PROPERTY_TYPE_ATOM; + aprop->u.atom = (const char*)bdf->strings + value; + error = FT_Err_Ok; + goto Exit; + } + break; + + case 0x02: + aprop->type = BDF_PROPERTY_TYPE_INTEGER; + aprop->u.integer = (FT_Int32)value; + error = FT_Err_Ok; + goto Exit; + + case 0x03: + aprop->type = BDF_PROPERTY_TYPE_CARDINAL; + aprop->u.cardinal = value; + error = FT_Err_Ok; + goto Exit; + + default: + ; + } + } + } + p += 10; + } + + Exit: + return error; + } + +#else /* !TT_CONFIG_OPTION_BDF */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_bdf_dummy_; + +#endif /* !TT_CONFIG_OPTION_BDF */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttbdf.h b/external/freetype/src/sfnt/ttbdf.h new file mode 100644 index 000000000..0d7a0acec --- /dev/null +++ b/external/freetype/src/sfnt/ttbdf.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * + * ttbdf.h + * + * TrueType and OpenType embedded BDF properties (specification). + * + * Copyright (C) 2005-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTBDF_H_ +#define TTBDF_H_ + + +#include "ttload.h" +#include <freetype/ftbdf.h> + + +FT_BEGIN_HEADER + + +#ifdef TT_CONFIG_OPTION_BDF + + FT_LOCAL( void ) + tt_face_free_bdf_props( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_find_bdf_prop( FT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ); + +#endif /* TT_CONFIG_OPTION_BDF */ + + +FT_END_HEADER + +#endif /* TTBDF_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttcmap.c b/external/freetype/src/sfnt/ttcmap.c new file mode 100644 index 000000000..9ba25dcbc --- /dev/null +++ b/external/freetype/src/sfnt/ttcmap.c @@ -0,0 +1,3902 @@ +/**************************************************************************** + * + * ttcmap.c + * + * TrueType character mapping table (cmap) support (body). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> + +#include "sferrors.h" /* must come before `ftvalid.h' */ + +#include <freetype/internal/ftvalid.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/services/svpscmap.h> +#include "ttload.h" +#include "ttcmap.h" +#include "ttpost.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttcmap + + +#define TT_PEEK_SHORT FT_PEEK_SHORT +#define TT_PEEK_USHORT FT_PEEK_USHORT +#define TT_PEEK_UINT24 FT_PEEK_UOFF3 +#define TT_PEEK_LONG FT_PEEK_LONG +#define TT_PEEK_ULONG FT_PEEK_ULONG + +#define TT_NEXT_SHORT FT_NEXT_SHORT +#define TT_NEXT_USHORT FT_NEXT_USHORT +#define TT_NEXT_UINT24 FT_NEXT_UOFF3 +#define TT_NEXT_LONG FT_NEXT_LONG +#define TT_NEXT_ULONG FT_NEXT_ULONG + + + /* Too large glyph index return values are caught in `FT_Get_Char_Index' */ + /* and `FT_Get_Next_Char' (the latter calls the internal `next' function */ + /* again in this case). To mark character code return values as invalid */ + /* it is sufficient to set the corresponding glyph index return value to */ + /* zero. */ + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_init( FT_CMap cmap, /* TT_CMap */ + void* table_ ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = (FT_Byte*)table_; + + + ttcmap->data = table; + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 0 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 0 + * length 2 USHORT table length in bytes + * language 4 USHORT Mac language code + * glyph_ids 6 BYTE[256] array of glyph indices + * 262 + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length; + + + if ( table + 2 + 2 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; /* skip format */ + length = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 262 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices whenever necessary */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt n, idx; + + + p = table + 6; + for ( n = 0; n < 256; n++ ) + { + idx = *p++; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + + + return char_code < 256 ? table[6 + char_code] : 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_next( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 *pchar_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt32 charcode = *pchar_code; + FT_UInt32 result = 0; + FT_UInt gindex = 0; + + + table += 6; /* go to glyph IDs */ + while ( ++charcode < 256 ) + { + gindex = table[charcode]; + if ( gindex != 0 ) + { + result = charcode; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; + + + cmap_info->format = 0; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap0_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap0_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 0, + (TT_CMap_ValidateFunc)tt_cmap0_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap0_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 2 *****/ + /***** *****/ + /***** This is used for certain CJK encodings that encode text in a *****/ + /***** mixed 8/16 bits encoding along the following lines. *****/ + /***** *****/ + /***** * Certain byte values correspond to an 8-bit character code *****/ + /***** (typically in the range 0..127 for ASCII compatibility). *****/ + /***** *****/ + /***** * Certain byte values signal the first byte of a 2-byte *****/ + /***** character code (but these values are also valid as the *****/ + /***** second byte of a 2-byte character). *****/ + /***** *****/ + /***** The following charmap lookup and iteration functions all *****/ + /***** assume that the value `charcode' fulfills the following. *****/ + /***** *****/ + /***** - For one-byte characters, `charcode' is simply the *****/ + /***** character code. *****/ + /***** *****/ + /***** - For two-byte characters, `charcode' is the 2-byte *****/ + /***** character code in big endian format. More precisely: *****/ + /***** *****/ + /***** (charcode >> 8) is the first byte value *****/ + /***** (charcode & 0xFF) is the second byte value *****/ + /***** *****/ + /***** Note that not all values of `charcode' are valid according *****/ + /***** to these rules, and the function moderately checks the *****/ + /***** arguments. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 2 + * length 2 USHORT table length in bytes + * language 4 USHORT Mac language code + * keys 6 USHORT[256] sub-header keys + * subs 518 SUBHEAD[NSUBS] sub-headers array + * glyph_ids 518+NSUB*8 USHORT[] glyph ID array + * + * The `keys' table is used to map charcode high bytes to sub-headers. + * The value of `NSUBS' is the number of sub-headers defined in the + * table and is computed by finding the maximum of the `keys' table. + * + * Note that for any `n', `keys[n]' is a byte offset within the `subs' + * table, i.e., it is the corresponding sub-header index multiplied + * by 8. + * + * Each sub-header has the following format. + * + * NAME OFFSET TYPE DESCRIPTION + * + * first 0 USHORT first valid low-byte + * count 2 USHORT number of valid low-bytes + * delta 4 SHORT see below + * offset 6 USHORT see below + * + * A sub-header defines, for each high byte, the range of valid + * low bytes within the charmap. Note that the range defined by `first' + * and `count' must be completely included in the interval [0..255] + * according to the specification. + * + * If a character code is contained within a given sub-header, then + * mapping it to a glyph index is done as follows. + * + * - The value of `offset' is read. This is a _byte_ distance from the + * location of the `offset' field itself into a slice of the + * `glyph_ids' table. Let's call it `slice' (it is a USHORT[], too). + * + * - The value `slice[char.lo - first]' is read. If it is 0, there is + * no glyph for the charcode. Otherwise, the value of `delta' is + * added to it (modulo 65536) to form a new glyph index. + * + * It is up to the validation routine to check that all offsets fall + * within the glyph IDs table (and not within the `subs' table itself or + * outside of the CMap). + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length; + + FT_UInt n, max_subs; + FT_Byte* keys; /* keys table */ + FT_Byte* subs; /* sub-headers */ + FT_Byte* glyph_ids; /* glyph ID array */ + + + if ( table + 2 + 2 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; /* skip format */ + length = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 6 + 512 ) + FT_INVALID_TOO_SHORT; + + keys = table + 6; + + /* parse keys to compute sub-headers count */ + p = keys; + max_subs = 0; + for ( n = 0; n < 256; n++ ) + { + FT_UInt idx = TT_NEXT_USHORT( p ); + + + /* value must be multiple of 8 */ + if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) + FT_INVALID_DATA; + + idx >>= 3; + + if ( idx > max_subs ) + max_subs = idx; + } + + FT_ASSERT( p == table + 518 ); + + subs = p; + glyph_ids = subs + ( max_subs + 1 ) * 8; + if ( glyph_ids > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* parse sub-headers */ + for ( n = 0; n <= max_subs; n++ ) + { + FT_UInt first_code, code_count, offset; + FT_Int delta; + + + first_code = TT_NEXT_USHORT( p ); + code_count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT( p ); + offset = TT_NEXT_USHORT( p ); + + /* many Dynalab fonts have empty sub-headers */ + if ( code_count == 0 ) + continue; + + /* check range within 0..255 */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + if ( first_code >= 256 || code_count > 256 - first_code ) + FT_INVALID_DATA; + } + + /* check offset */ + if ( offset != 0 ) + { + FT_Byte* ids; + + + ids = p - 2 + offset; + if ( ids < glyph_ids || ids + code_count * 2 > table + length ) + FT_INVALID_OFFSET; + + /* check glyph IDs */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_Byte* limit = p + code_count * 2; + FT_UInt idx; + + + for ( ; p < limit; ) + { + idx = TT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + } + + return FT_Err_Ok; + } + + + /* return sub header corresponding to a given character code */ + /* NULL on invalid charcode */ + static FT_Byte* + tt_cmap2_get_subheader( FT_Byte* table, + FT_UInt32 char_code ) + { + FT_Byte* result = NULL; + + + if ( char_code < 0x10000UL ) + { + FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); + FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); + FT_Byte* p = table + 6; /* keys table */ + FT_Byte* subs = table + 518; /* subheaders table */ + FT_Byte* sub; + + + if ( char_hi == 0 ) + { + /* an 8-bit character code -- we use subHeader 0 in this case */ + /* to test whether the character code is in the charmap */ + /* */ + sub = subs; /* jump to first sub-header */ + + /* check that the sub-header for this byte is 0, which */ + /* indicates that it is really a valid one-byte value; */ + /* otherwise, return 0 */ + /* */ + p += char_lo * 2; + if ( TT_PEEK_USHORT( p ) != 0 ) + goto Exit; + } + else + { + /* a 16-bit character code */ + + /* jump to key entry */ + p += char_hi * 2; + /* jump to sub-header */ + sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); + + /* check that the high byte isn't a valid one-byte value */ + if ( sub == subs ) + goto Exit; + } + + result = sub; + } + + Exit: + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt result = 0; + FT_Byte* subheader; + + + subheader = tt_cmap2_get_subheader( table, char_code ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt idx = (FT_UInt)( char_code & 0xFF ); + FT_UInt start, count; + FT_Int delta; + FT_UInt offset; + + + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT ( p ); + offset = TT_PEEK_USHORT( p ); + + idx -= start; + if ( idx < count && offset != 0 ) + { + p += offset + 2 * idx; + idx = TT_PEEK_USHORT( p ); + + if ( idx != 0 ) + result = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_next( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 *pcharcode ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 charcode = *pcharcode + 1; + FT_Byte* subheader; + + + while ( charcode < 0x10000UL ) + { + subheader = tt_cmap2_get_subheader( table, charcode ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_Int delta = TT_NEXT_SHORT ( p ); + FT_UInt offset = TT_PEEK_USHORT( p ); + FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); + FT_UInt pos, idx; + + + if ( char_lo >= start + count && charcode <= 0xFF ) + { + /* this happens only for a malformed cmap */ + charcode = 0x100; + continue; + } + + if ( offset == 0 ) + { + if ( charcode == 0x100 ) + goto Exit; /* this happens only for a malformed cmap */ + goto Next_SubHeader; + } + + if ( char_lo < start ) + { + char_lo = start; + pos = 0; + } + else + pos = (FT_UInt)( char_lo - start ); + + p += offset + pos * 2; + charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; + + for ( ; pos < count; pos++, charcode++ ) + { + idx = TT_NEXT_USHORT( p ); + + if ( idx != 0 ) + { + gindex = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + if ( gindex != 0 ) + { + result = charcode; + goto Exit; + } + } + } + + /* if unsuccessful, avoid `charcode' leaving */ + /* the current 256-character block */ + if ( count ) + charcode--; + } + + /* If `charcode' is <= 0xFF, retry with `charcode + 1'. */ + /* Otherwise jump to the next 256-character block and retry. */ + Next_SubHeader: + if ( charcode <= 0xFF ) + charcode++; + else + charcode = FT_PAD_FLOOR( charcode, 0x100 ) + 0x100; + } + + Exit: + *pcharcode = result; + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; + + + cmap_info->format = 2; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap2_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap2_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 2, + (TT_CMap_ValidateFunc)tt_cmap2_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap2_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_2 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 4 + * length 2 USHORT table length + * in bytes + * language 4 USHORT Mac language code + * + * segCountX2 6 USHORT 2*NUM_SEGS + * searchRange 8 USHORT 2*(1 << LOG_SEGS) + * entrySelector 10 USHORT LOG_SEGS + * rangeShift 12 USHORT segCountX2 - + * searchRange + * + * endCount 14 USHORT[NUM_SEGS] end charcode for + * each segment; last + * is 0xFFFF + * + * pad 14+NUM_SEGS*2 USHORT padding + * + * startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for + * each segment + * + * idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each + * segment + * idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for + * each segment; can be + * zero + * + * glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID + * ranges + * + * Character codes are modelled by a series of ordered (increasing) + * intervals called segments. Each segment has start and end codes, + * provided by the `startCount' and `endCount' arrays. Segments must + * not overlap, and the last segment should always contain the value + * 0xFFFF for `endCount'. + * + * The fields `searchRange', `entrySelector' and `rangeShift' are better + * ignored (they are traces of over-engineering in the TrueType + * specification). + * + * Each segment also has a signed `delta', as well as an optional offset + * within the `glyphIds' table. + * + * If a segment's idOffset is 0, the glyph index corresponding to any + * charcode within the segment is obtained by adding the value of + * `idDelta' directly to the charcode, modulo 65536. + * + * Otherwise, a glyph index is taken from the glyph IDs sub-array for + * the segment, and the value of `idDelta' is added to it. + * + * + * Finally, note that a lot of fonts contain an invalid last segment, + * where `start' and `end' are correctly set to 0xFFFF but both `delta' + * and `offset' are incorrect (e.g., `opens___.ttf' which comes with + * OpenOffice.org). We need special code to deal with them correctly. + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + + typedef struct TT_CMap4Rec_ + { + TT_CMapRec cmap; + FT_UInt32 cur_charcode; /* current charcode */ + FT_UInt cur_gindex; /* current glyph index */ + + FT_UInt num_ranges; + FT_UInt cur_range; + FT_UInt cur_start; + FT_UInt cur_end; + FT_Int cur_delta; + FT_Byte* cur_values; + + } TT_CMap4Rec, *TT_CMap4; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_init( FT_CMap cmap, /* TT_CMap4 */ + void* table_ ) + { + TT_CMap4 ttcmap = (TT_CMap4)cmap; + FT_Byte* table = (FT_Byte*)table_; + FT_Byte* p; + + + ttcmap->cmap.data = table; + + p = table + 6; + ttcmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; + ttcmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + ttcmap->cur_gindex = 0; + + return FT_Err_Ok; + } + + + static FT_Int + tt_cmap4_set_range( TT_CMap4 cmap, + FT_UInt range_index ) + { + FT_Byte* table = cmap->cmap.data; + FT_Byte* p; + FT_UInt num_ranges = cmap->num_ranges; + + + while ( range_index < num_ranges ) + { + FT_UInt offset; + + + p = table + 14 + range_index * 2; + cmap->cur_end = FT_PEEK_USHORT( p ); + + p += 2 + num_ranges * 2; + cmap->cur_start = FT_PEEK_USHORT( p ); + + p += num_ranges * 2; + cmap->cur_delta = FT_PEEK_SHORT( p ); + + p += num_ranges * 2; + offset = FT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( range_index >= num_ranges - 1 && + cmap->cur_start == 0xFFFFU && + cmap->cur_end == 0xFFFFU ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + cmap->cur_delta = 1; + offset = 0; + } + } + + if ( offset != 0xFFFFU ) + { + cmap->cur_values = offset ? p + offset : NULL; + cmap->cur_range = range_index; + return 0; + } + + /* we skip empty segments */ + range_index++; + } + + return -1; + } + + + /* search the index of the charcode next to cmap->cur_charcode; */ + /* caller should call tt_cmap4_set_range with proper range */ + /* before calling this function */ + /* */ + static void + tt_cmap4_next( TT_CMap4 cmap ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Byte* limit = face->cmap_table + face->cmap_size; + + FT_UInt charcode; + + + charcode = (FT_UInt)cmap->cur_charcode + 1; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + + for (;;) + { + FT_Byte* values = cmap->cur_values; + FT_UInt end = cmap->cur_end; + FT_Int delta = cmap->cur_delta; + + + if ( charcode <= end ) + { + if ( values ) + { + FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); + + + /* if p > limit, the whole segment is invalid */ + if ( p > limit ) + goto Next_Segment; + + do + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex ) + { + gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } + } while ( ++charcode <= end ); + } + else + { + do + { + FT_UInt gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + + + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + + else + goto Next_Segment; + } + + if ( gindex ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } while ( ++charcode <= end ); + } + } + + Next_Segment: + /* we need to find another range */ + if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) + break; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + } + + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length; + + FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; + FT_UInt num_segs; + FT_Error error = FT_Err_Ok; + + + if ( table + 2 + 2 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; /* skip format */ + length = TT_NEXT_USHORT( p ); + + /* in certain fonts, the `length' field is invalid and goes */ + /* out of bound. We try to correct this here... */ + if ( table + length > valid->limit ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_TOO_SHORT; + + length = (FT_UInt)( valid->limit - table ); + } + + /* it also happens that the `length' field is too small; */ + /* this is easy to correct */ + if ( length < (FT_UInt)( valid->limit - table ) ) + { + if ( valid->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + + length = (FT_UInt)( valid->limit - table ); + } + + if ( length < 16 ) + FT_INVALID_TOO_SHORT; + + p = table + 6; + num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ + + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check that we have an even value here */ + if ( num_segs & 1 ) + FT_INVALID_DATA; + } + + num_segs /= 2; + + if ( length < 16 + num_segs * 2 * 4 ) + FT_INVALID_TOO_SHORT; + + /* check the search parameters - even though we never use them */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check the values of `searchRange', `entrySelector', `rangeShift' */ + FT_UInt search_range = TT_NEXT_USHORT( p ); + FT_UInt entry_selector = TT_NEXT_USHORT( p ); + FT_UInt range_shift = TT_NEXT_USHORT( p ); + + + if ( ( search_range | range_shift ) & 1 ) /* must be even values */ + FT_INVALID_DATA; + + search_range /= 2; + range_shift /= 2; + + /* `search range' is the greatest power of 2 that is <= num_segs */ + + if ( search_range > num_segs || + search_range * 2 < num_segs || + search_range + range_shift != num_segs || + search_range != ( 1U << entry_selector ) ) + FT_INVALID_DATA; + } + + ends = table + 14; + starts = table + 16 + num_segs * 2; + deltas = starts + num_segs * 2; + offsets = deltas + num_segs * 2; + glyph_ids = offsets + num_segs * 2; + + /* check last segment; its end count value must be 0xFFFF */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + p = ends + ( num_segs - 1 ) * 2; + if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) + FT_INVALID_DATA; + } + + { + FT_UInt start, end, offset, n; + FT_UInt last_start = 0, last_end = 0; + FT_Int delta; + FT_Byte* p_start = starts; + FT_Byte* p_end = ends; + FT_Byte* p_delta = deltas; + FT_Byte* p_offset = offsets; + + + for ( n = 0; n < num_segs; n++ ) + { + p = p_offset; + start = TT_NEXT_USHORT( p_start ); + end = TT_NEXT_USHORT( p_end ); + delta = TT_NEXT_SHORT( p_delta ); + offset = TT_NEXT_USHORT( p_offset ); + + if ( start > end ) + FT_INVALID_DATA; + + /* this test should be performed at default validation level; */ + /* unfortunately, some popular Asian fonts have overlapping */ + /* ranges in their charmaps */ + /* */ + if ( start <= last_end && n > 0 ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + else + { + /* allow overlapping segments, provided their start points */ + /* and end points, respectively, are in ascending order */ + /* */ + if ( last_start > start || last_end > end ) + error |= TT_CMAP_FLAG_UNSORTED; + else + error |= TT_CMAP_FLAG_OVERLAPPING; + } + } + + if ( offset && offset != 0xFFFFU ) + { + p += offset; /* start of glyph ID array */ + + /* check that we point within the glyph IDs table only */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > table + length ) + FT_INVALID_DATA; + } + /* Some fonts handle the last segment incorrectly. In */ + /* theory, 0xFFFF might point to an ordinary glyph -- */ + /* a cmap 4 is versatile and could be used for any */ + /* encoding, not only Unicode. However, reality shows */ + /* that far too many fonts are sloppy and incorrectly */ + /* set all fields but `start' and `end' for the last */ + /* segment if it contains only a single character. */ + /* */ + /* We thus omit the test here, delaying it to the */ + /* routines that actually access the cmap. */ + else if ( n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > valid->limit ) + FT_INVALID_DATA; + } + + /* check glyph indices within the segment range */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt i, idx; + + + for ( i = start; i < end; i++ ) + { + idx = FT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + else if ( offset == 0xFFFFU ) + { + /* some fonts (erroneously?) use a range offset of 0xFFFF */ + /* to mean missing glyph in cmap table */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID || + n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + FT_INVALID_DATA; + } + + last_start = start; + last_end = end; + } + } + + return error; + } + + + static FT_UInt + tt_cmap4_char_map_linear( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt i, num_segs; + FT_UInt32 charcode = *pcharcode + next; + FT_UInt gindex = 0; + FT_Byte* p; + FT_Byte* q; + + + p = cmap->data + 6; + num_segs = TT_PEEK_USHORT( p ) >> 1; + + if ( !num_segs ) + return 0; + + num_segs2 = num_segs << 1; + + /* linear search */ + p = cmap->data + 14; /* ends table */ + q = cmap->data + 16 + num_segs2; /* starts table */ + + for ( i = 0; i < num_segs; i++ ) + { + end = TT_NEXT_USHORT( p ); + start = TT_NEXT_USHORT( q ); + + if ( charcode < start ) + { + if ( next ) + charcode = start; + else + break; + } + + Again: + if ( charcode <= end ) + { + FT_Byte* r; + + + r = q - 2 + num_segs2; + delta = TT_PEEK_SHORT( r ); + r += num_segs2; + offset = TT_PEEK_USHORT( r ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( i >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + if ( offset && r + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + if ( offset == 0xFFFFU ) + continue; + + if ( offset ) + { + r += offset + ( charcode - start ) * 2; + + /* if r > limit, the whole segment is invalid */ + if ( next && r > limit ) + continue; + + gindex = TT_PEEK_USHORT( r ); + if ( gindex ) + { + gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + gindex = 0; + } + } + else + { + gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + + if ( next && gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + + else + continue; + } + } + + if ( next && !gindex ) + { + if ( charcode >= 0xFFFFU ) + break; + + charcode++; + goto Again; + } + + break; + } + } + + if ( next ) + *pcharcode = charcode; + + return gindex; + } + + + static FT_UInt + tt_cmap4_char_map_binary( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Byte* limit = face->cmap_table + face->cmap_size; + + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt max, min, mid, num_segs; + FT_UInt charcode = (FT_UInt)*pcharcode + next; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs = TT_PEEK_USHORT( p ) >> 1; + + if ( !num_segs ) + return 0; + + num_segs2 = num_segs << 1; + + min = 0; + max = num_segs; + + /* binary search */ + do + { + mid = ( min + max ) >> 1; + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + + if ( charcode < start ) + max = mid; + else if ( charcode > end ) + min = mid + 1; + else + { + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( mid >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + /* search the first segment containing `charcode' */ + if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) + { + FT_UInt i; + + + /* call the current segment `max' */ + max = mid; + + if ( offset == 0xFFFFU ) + mid = max + 1; + + /* search in segments before the current segment */ + for ( i = max; i > 0; i-- ) + { + FT_UInt prev_end; + FT_Byte* old_p; + + + old_p = p; + p = cmap->data + 14 + ( i - 1 ) * 2; + prev_end = TT_PEEK_USHORT( p ); + + if ( charcode > prev_end ) + { + p = old_p; + break; + } + + end = prev_end; + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i - 1; + } + + /* no luck */ + if ( mid == max + 1 ) + { + if ( i != max ) + { + p = cmap->data + 14 + max * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + + mid = max; + + /* search in segments after the current segment */ + for ( i = max + 1; i < num_segs; i++ ) + { + FT_UInt next_end, next_start; + + + p = cmap->data + 14 + i * 2; + next_end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + next_start = TT_PEEK_USHORT( p ); + + if ( charcode < next_start ) + break; + + end = next_end; + start = next_start; + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i; + } + i--; + + /* still no luck */ + if ( mid == max ) + { + mid = i; + + break; + } + } + + /* end, start, delta, and offset are for the i'th segment */ + if ( mid != i ) + { + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + } + else + { + if ( offset == 0xFFFFU ) + break; + } + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + + /* if p > limit, the whole segment is invalid */ + if ( next && p > limit ) + break; + + gindex = TT_PEEK_USHORT( p ); + if ( gindex ) + { + gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + gindex = 0; + } + } + else + { + gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + + if ( next && gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + } + } + + break; + } + } + while ( min < max ); + + if ( next ) + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* if `charcode' is not in any segment, then `mid' is */ + /* the segment nearest to `charcode' */ + + if ( charcode > end && ++mid == num_segs ) + return 0; + + if ( tt_cmap4_set_range( cmap4, mid ) ) + { + if ( gindex ) + *pcharcode = charcode; + } + else + { + cmap4->cur_charcode = charcode; + + if ( gindex ) + cmap4->cur_gindex = gindex; + else + { + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + } + + if ( gindex ) + *pcharcode = cmap4->cur_charcode; + } + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + + + if ( char_code >= 0x10000UL ) + return 0; + + if ( ttcmap->flags & TT_CMAP_FLAG_UNSORTED ) + return tt_cmap4_char_map_linear( ttcmap, &char_code, 0 ); + else + return tt_cmap4_char_map_binary( ttcmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_next( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 *pchar_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFU ) + return 0; + + if ( ttcmap->flags & TT_CMAP_FLAG_UNSORTED ) + gindex = tt_cmap4_char_map_linear( ttcmap, pchar_code, 1 ); + else + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* no need to search */ + if ( *pchar_code == cmap4->cur_charcode ) + { + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + if ( gindex ) + *pchar_code = cmap4->cur_charcode; + } + else + gindex = tt_cmap4_char_map_binary( ttcmap, pchar_code, 1 ); + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; + + + cmap_info->format = 4; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap4_class_rec, + + sizeof ( TT_CMap4Rec ), + + (FT_CMap_InitFunc) tt_cmap4_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap4_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 4, + (TT_CMap_ValidateFunc)tt_cmap4_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap4_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_4 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 6 + * length 2 USHORT table length in bytes + * language 4 USHORT Mac language code + * + * first 6 USHORT first segment code + * count 8 USHORT segment size in chars + * glyphIds 10 USHORT[count] glyph IDs + * + * A very simplified segment mapping. + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length, count; + + + if ( table + 10 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_USHORT( p ); + + p = table + 8; /* skip language and start index */ + count = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 10 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx = (FT_UInt)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_next( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 *pchar_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx; + + + if ( char_code >= 0x10000UL ) + return 0; + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + { + result = char_code; + break; + } + + if ( char_code >= 0xFFFFU ) + return 0; + + char_code++; + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; + + + cmap_info->format = 6; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap6_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap6_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 6, + (TT_CMap_ValidateFunc)tt_cmap6_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap6_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_6 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It is hard to completely understand what the OpenType spec *****/ + /***** says about this format, but here is my conclusion. *****/ + /***** *****/ + /***** The purpose of this format is to easily map UTF-16 text to *****/ + /***** glyph indices. Basically, the `char_code' must be in one of *****/ + /***** the following formats. *****/ + /***** *****/ + /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ + /***** Area (i.e. U+D800-U+DFFF). *****/ + /***** *****/ + /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ + /***** `char_code = (char_hi << 16) | char_lo', then both *****/ + /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ + /***** Area. *****/ + /***** *****/ + /***** The `is32' table embedded in the charmap indicates whether a *****/ + /***** given 16-bit value is in the surrogates area or not. *****/ + /***** *****/ + /***** So, for any given `char_code', we can assert the following. *****/ + /***** *****/ + /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ + /***** *****/ + /***** If `char_hi != 0' then we must have both *****/ + /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 8 + * reserved 2 USHORT reserved + * length 4 ULONG length in bytes + * language 8 ULONG Mac language code + * is32 12 BYTE[8192] 32-bitness bitmap + * count 8204 ULONG number of groups + * + * This header is followed by `count' groups of the following format: + * + * start 0 ULONG first charcode + * end 4 ULONG last charcode + * startId 8 ULONG start glyph ID for the group + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_Byte* is32; + FT_UInt32 length; + FT_UInt32 num_groups; + + + if ( table + 16 + 8192 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 ) + FT_INVALID_TOO_SHORT; + + is32 = table + 12; + p = is32 + 8192; /* skip `is32' array */ + num_groups = TT_NEXT_ULONG( p ); + + /* p + num_groups * 12 > valid->limit ? */ + if ( num_groups > (FT_UInt32)( valid->limit - p ) / 12 ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_UInt32 n, start, end, start_id, count, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + FT_UInt hi, lo; + + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt32 d = end - start; + + + /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */ + if ( d > TT_VALID_GLYPH_COUNT( valid ) || + start_id >= TT_VALID_GLYPH_COUNT( valid ) - d ) + FT_INVALID_GLYPH_ID; + + count = (FT_UInt32)( end - start + 1 ); + + if ( start & ~0xFFFFU ) + { + /* start_hi != 0; check that is32[i] is 1 for each i in */ + /* the `hi' and `lo' of the range [start..end] */ + for ( ; count > 0; count--, start++ ) + { + hi = (FT_UInt)( start >> 16 ); + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + } + } + else + { + /* start_hi == 0; check that is32[i] is 0 for each i in */ + /* the range [start..end] */ + + /* end_hi cannot be != 0! */ + if ( end & ~0xFFFFU ) + FT_INVALID_DATA; + + for ( ; count > 0; count--, start++ ) + { + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) + FT_INVALID_DATA; + } + } + } + + last = end; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + break; + + if ( char_code <= end ) + { + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + return 0; + + result = (FT_UInt)( start_id + ( char_code - start ) ); + break; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_next( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 *pchar_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_UInt32 result = 0; + FT_UInt32 char_code; + FT_UInt gindex = 0; + FT_Byte* table = ttcmap->data; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + + char_code = *pchar_code + 1; + + p = table + 8208; + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + Again: + if ( char_code <= end ) + { + /* ignore invalid group */ + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + continue; + + gindex = (FT_UInt)( start_id + ( char_code - start ) ); + + /* does first element of group point to `.notdef' glyph? */ + if ( gindex == 0 ) + { + if ( char_code >= 0xFFFFFFFFUL ) + break; + + char_code++; + goto Again; + } + + /* if `gindex' is invalid, the remaining values */ + /* in this group are invalid, too */ + if ( gindex >= (FT_UInt)face->num_glyphs ) + { + gindex = 0; + continue; + } + + result = char_code; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; + + + cmap_info->format = 8; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap8_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap8_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 8, + (TT_CMap_ValidateFunc)tt_cmap8_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap8_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_8 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 10 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 10 + * reserved 2 USHORT reserved + * length 4 ULONG length in bytes + * language 8 ULONG Mac language code + * + * start 12 ULONG first char in range + * count 16 ULONG number of chars in range + * glyphIds 20 USHORT[count] glyph indices covered + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_ULong length, count; + + + if ( table + 20 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + p = table + 16; + count = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 20 + count * 2 ? */ + length < 20 || + ( length - 20 ) / 2 < count ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( char_code < start ) + return 0; + + idx = char_code - start; + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_next( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 *pchar_code ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; + FT_UInt32 char_code; + FT_UInt gindex = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + + char_code = *pchar_code + 1; + + if ( char_code < start ) + char_code = start; + + idx = char_code - start; + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + break; + + if ( char_code >= 0xFFFFFFFFUL ) + return 0; + + char_code++; + } + + *pchar_code = char_code; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; + + + cmap_info->format = 10; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap10_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap10_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 10, + (TT_CMap_ValidateFunc)tt_cmap10_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap10_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_10 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 12 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 12 + * reserved 2 USHORT reserved + * length 4 ULONG length in bytes + * language 8 ULONG Mac language code + * count 12 ULONG number of groups + * 16 + * + * This header is followed by `count' groups of the following format: + * + * start 0 ULONG first charcode + * end 4 ULONG last charcode + * startId 8 ULONG start glyph ID for the group + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + + typedef struct TT_CMap12Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap12Rec, *TT_CMap12; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_init( FT_CMap cmap, /* TT_CMap12 */ + void* table_ ) + { + TT_CMap12 ttcmap = (TT_CMap12)cmap; + FT_Byte* table = (FT_Byte*)table_; + + + ttcmap->cmap.data = table; + + table += 12; + ttcmap->num_groups = FT_PEEK_ULONG( table ); + + ttcmap->valid = 0; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 16 + 12 * num_groups ? */ + length < 16 || + ( length - 16 ) / 12 < num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, start_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt32 d = end - start; + + + /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */ + if ( d > TT_VALID_GLYPH_COUNT( valid ) || + start_id >= TT_VALID_GLYPH_COUNT( valid ) - d ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return FT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap12_next( FT_CMap cmap ) /* TT_CMap12 */ + { + TT_CMap12 ttcmap = (TT_CMap12)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Byte* p; + FT_ULong start, end, start_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + char_code = ttcmap->cur_charcode + 1; + + for ( n = ttcmap->cur_group; n < ttcmap->num_groups; n++ ) + { + p = ttcmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + Again: + if ( char_code <= end ) + { + /* ignore invalid group */ + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + continue; + + gindex = (FT_UInt)( start_id + ( char_code - start ) ); + + /* does first element of group point to `.notdef' glyph? */ + if ( gindex == 0 ) + { + if ( char_code >= 0xFFFFFFFFUL ) + goto Fail; + + char_code++; + goto Again; + } + + /* if `gindex' is invalid, the remaining values */ + /* in this group are invalid, too */ + if ( gindex >= (FT_UInt)face->num_glyphs ) + continue; + + ttcmap->cur_charcode = char_code; + ttcmap->cur_gindex = gindex; + ttcmap->cur_group = n; + + return; + } + } + + Fail: + ttcmap->valid = 0; + } + + + static FT_UInt + tt_cmap12_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code + next; + FT_UInt32 start, end, start_id; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + min = 0; + max = num_groups; + + /* binary search */ + do + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + start_id = TT_PEEK_ULONG( p ); + + /* reject invalid glyph index */ + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + gindex = 0; + else + gindex = (FT_UInt)( start_id + ( char_code - start ) ); + break; + } + } + while ( min < max ); + + if ( next ) + { + FT_Face face = FT_CMAP_FACE( cmap ); + TT_CMap12 cmap12 = (TT_CMap12)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + + if ( char_code > end && ++mid == num_groups ) + return 0; + + cmap12->valid = 1; + cmap12->cur_charcode = char_code; + cmap12->cur_group = mid; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + gindex = 0; + + if ( !gindex ) + { + tt_cmap12_next( FT_CMAP( cmap12 ) ); + + if ( cmap12->valid ) + gindex = cmap12->cur_gindex; + } + else + cmap12->cur_gindex = gindex; + + *pchar_code = cmap12->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + return tt_cmap12_char_map_binary( (TT_CMap)cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_next( FT_CMap cmap, /* TT_CMap12 */ + FT_UInt32 *pchar_code ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) + { + tt_cmap12_next( FT_CMAP( cmap12 ) ); + if ( cmap12->valid ) + { + gindex = cmap12->cur_gindex; + *pchar_code = (FT_UInt32)cmap12->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap12_char_map_binary( (TT_CMap)cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; + + + cmap_info->format = 12; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap12_class_rec, + + sizeof ( TT_CMap12Rec ), + + (FT_CMap_InitFunc) tt_cmap12_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap12_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 12, + (TT_CMap_ValidateFunc)tt_cmap12_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap12_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_12 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 13 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 13 + * reserved 2 USHORT reserved + * length 4 ULONG length in bytes + * language 8 ULONG Mac language code + * count 12 ULONG number of groups + * 16 + * + * This header is followed by `count' groups of the following format: + * + * start 0 ULONG first charcode + * end 4 ULONG last charcode + * glyphId 8 ULONG glyph ID for the whole group + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + + typedef struct TT_CMap13Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap13Rec, *TT_CMap13; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_init( FT_CMap cmap, /* TT_CMap13 */ + void* table_ ) + { + TT_CMap13 ttcmap = (TT_CMap13)cmap; + FT_Byte* table = (FT_Byte*)table_; + + + ttcmap->cmap.data = table; + + table += 12; + ttcmap->num_groups = FT_PEEK_ULONG( table ); + + ttcmap->valid = 0; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 16 + 12 * num_groups ? */ + length < 16 || + ( length - 16 ) / 12 < num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, glyph_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return FT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap13_next( FT_CMap cmap ) /* TT_CMap13 */ + { + TT_CMap13 ttcmap = (TT_CMap13)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Byte* p; + FT_ULong start, end, glyph_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + char_code = ttcmap->cur_charcode + 1; + + for ( n = ttcmap->cur_group; n < ttcmap->num_groups; n++ ) + { + p = ttcmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)glyph_id; + + if ( gindex && gindex < (FT_UInt)face->num_glyphs ) + { + ttcmap->cur_charcode = char_code; + ttcmap->cur_gindex = gindex; + ttcmap->cur_group = n; + + return; + } + } + } + + ttcmap->valid = 0; + } + + + static FT_UInt + tt_cmap13_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code + next; + FT_UInt32 start, end; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + min = 0; + max = num_groups; + + /* binary search */ + do + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + gindex = (FT_UInt)TT_PEEK_ULONG( p ); + + break; + } + } + while ( min < max ); + + if ( next ) + { + FT_Face face = cmap->cmap.charmap.face; + TT_CMap13 cmap13 = (TT_CMap13)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + + if ( char_code > end && ++mid == num_groups ) + return 0; + + cmap13->valid = 1; + cmap13->cur_charcode = char_code; + cmap13->cur_group = mid; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + gindex = 0; + + if ( !gindex ) + { + tt_cmap13_next( FT_CMAP( cmap13 ) ); + + if ( cmap13->valid ) + gindex = cmap13->cur_gindex; + } + else + cmap13->cur_gindex = gindex; + + *pchar_code = cmap13->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap13_char_index( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 char_code ) + { + return tt_cmap13_char_map_binary( (TT_CMap)cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap13_char_next( FT_CMap cmap, /* TT_CMap13 */ + FT_UInt32 *pchar_code ) + { + TT_CMap13 cmap13 = (TT_CMap13)cmap; + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) + { + tt_cmap13_next( FT_CMAP( cmap13 ) ); + if ( cmap13->valid ) + { + gindex = cmap13->cur_gindex; + *pchar_code = cmap13->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap13_char_map_binary( (TT_CMap)cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_get_info( FT_CharMap cmap, /* TT_CMap */ + TT_CMapInfo *cmap_info ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; + + + cmap_info->format = 13; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap13_class_rec, + + sizeof ( TT_CMap13Rec ), + + (FT_CMap_InitFunc) tt_cmap13_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap13_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap13_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 13, + (TT_CMap_ValidateFunc)tt_cmap13_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap13_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_13 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 14 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************** + * + * TABLE OVERVIEW + * -------------- + * + * NAME OFFSET TYPE DESCRIPTION + * + * format 0 USHORT must be 14 + * length 2 ULONG table length in bytes + * numSelector 6 ULONG number of variation sel. records + * + * Followed by numSelector records, each of which looks like + * + * varSelector 0 UINT24 Unicode codepoint of sel. + * defaultOff 3 ULONG offset to a default UVS table + * describing any variants to be found in + * the normal Unicode subtable. + * nonDefOff 7 ULONG offset to a non-default UVS table + * describing any variants not in the + * standard cmap, with GIDs here + * (either offset may be 0 NULL) + * + * Selectors are sorted by code point. + * + * A default Unicode Variation Selector (UVS) subtable is just a list of + * ranges of code points which are to be found in the standard cmap. No + * glyph IDs (GIDs) here. + * + * numRanges 0 ULONG number of ranges following + * + * A range looks like + * + * uniStart 0 UINT24 code point of the first character in + * this range + * additionalCnt 3 UBYTE count of additional characters in this + * range (zero means a range of a single + * character) + * + * Ranges are sorted by `uniStart'. + * + * A non-default Unicode Variation Selector (UVS) subtable is a list of + * mappings from codepoint to GID. + * + * numMappings 0 ULONG number of mappings + * + * A range looks like + * + * uniStart 0 UINT24 code point of the first character in + * this range + * GID 3 USHORT and its GID + * + * Ranges are sorted by `uniStart'. + */ + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + + typedef struct TT_CMap14Rec_ + { + TT_CMapRec cmap; + FT_ULong num_selectors; + + /* This array is used to store the results of various + * cmap 14 query functions. The data is overwritten + * on each call to these functions. + */ + FT_UInt32 max_results; + FT_UInt32* results; + FT_Memory memory; + + } TT_CMap14Rec, *TT_CMap14; + + + FT_CALLBACK_DEF( void ) + tt_cmap14_done( FT_CMap cmap ) /* TT_CMap14 */ + { + TT_CMap14 ttcmap = (TT_CMap14)cmap; + FT_Memory memory = ttcmap->memory; + + + ttcmap->max_results = 0; + if ( memory && ttcmap->results ) + FT_FREE( ttcmap->results ); + } + + + static FT_Error + tt_cmap14_ensure( TT_CMap14 cmap, + FT_UInt32 num_results, + FT_Memory memory ) + { + FT_UInt32 old_max = cmap->max_results; + FT_Error error = FT_Err_Ok; + + + if ( num_results > cmap->max_results ) + { + cmap->memory = memory; + + if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) + return error; + + cmap->max_results = num_results; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_init( FT_CMap cmap, /* TT_CMap14 */ + void* table_ ) + { + TT_CMap14 ttcmap = (TT_CMap14)cmap; + FT_Byte* table = (FT_Byte*)table_; + + + ttcmap->cmap.data = table; + + table += 6; + ttcmap->num_selectors = FT_PEEK_ULONG( table ); + ttcmap->max_results = 0; + ttcmap->results = NULL; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_selectors; + + + if ( table + 2 + 4 + 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_ULONG( p ); + num_selectors = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 10 + 11 * num_selectors ? */ + length < 10 || + ( length - 10 ) / 11 < num_selectors ) + FT_INVALID_TOO_SHORT; + + /* check selectors, they must be in increasing order */ + { + /* we start lastVarSel at 1 because a variant selector value of 0 + * isn't valid. + */ + FT_ULong n, lastVarSel = 1; + + + for ( n = 0; n < num_selectors; n++ ) + { + FT_ULong varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( defOff >= length || nondefOff >= length ) + FT_INVALID_TOO_SHORT; + + if ( varSel < lastVarSel ) + FT_INVALID_DATA; + + lastVarSel = varSel + 1; + + /* check the default table (these glyphs should be reached */ + /* through the normal Unicode cmap, no GIDs, just check order) */ + if ( defOff != 0 ) + { + FT_Byte* defp = table + defOff; + FT_ULong numRanges; + FT_ULong i; + FT_ULong lastBase = 0; + + + if ( defp + 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + numRanges = TT_NEXT_ULONG( defp ); + + /* defp + numRanges * 4 > valid->limit ? */ + if ( numRanges > (FT_ULong)( valid->limit - defp ) / 4 ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numRanges; i++ ) + { + FT_ULong base = TT_NEXT_UINT24( defp ); + FT_ULong cnt = FT_NEXT_BYTE( defp ); + + + if ( base + cnt >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( base < lastBase ) + FT_INVALID_DATA; + + lastBase = base + cnt + 1U; + } + } + + /* and the non-default table (these glyphs are specified here) */ + if ( nondefOff != 0 ) + { + FT_Byte* ndp = table + nondefOff; + FT_ULong numMappings; + FT_ULong i, lastUni = 0; + + + if ( ndp + 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + numMappings = TT_NEXT_ULONG( ndp ); + + /* numMappings * 5 > (FT_ULong)( valid->limit - ndp ) ? */ + if ( numMappings > ( (FT_ULong)( valid->limit - ndp ) ) / 5 ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numMappings; i++ ) + { + FT_ULong uni = TT_NEXT_UINT24( ndp ); + FT_ULong gid = TT_NEXT_USHORT( ndp ); + + + if ( uni >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( uni < lastUni ) + FT_INVALID_DATA; + + lastUni = uni + 1U; + + if ( valid->level >= FT_VALIDATE_TIGHT && + gid >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_index( FT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UNUSED( cmap ); + FT_UNUSED( char_code ); + + /* This can't happen */ + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_next( FT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UNUSED( cmap ); + + /* This can't happen */ + *pchar_code = 0; + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_get_info( FT_CharMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_UNUSED( cmap ); + + cmap_info->format = 14; + /* subtable 14 does not define a language field */ + cmap_info->language = 0xFFFFFFFFUL; + + return FT_Err_Ok; + } + + + static FT_UInt + tt_cmap14_char_map_def_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numRanges = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numRanges; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 4 * mid; + FT_ULong start = TT_NEXT_UINT24( p ); + FT_UInt cnt = FT_NEXT_BYTE( p ); + + + if ( char_code < start ) + max = mid; + else if ( char_code > start + cnt ) + min = mid + 1; + else + return TRUE; + } + + return FALSE; + } + + + static FT_UInt + tt_cmap14_char_map_nondef_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numMappings = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numMappings; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 5 * mid; + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + if ( char_code < uni ) + max = mid; + else if ( char_code > uni ) + min = mid + 1; + else + return TT_PEEK_USHORT( p ); + } + + return 0; + } + + + static FT_Byte* + tt_cmap14_find_variant( FT_Byte *base, + FT_UInt32 variantCode ) + { + FT_UInt32 numVar = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numVar; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 11 * mid; + FT_ULong varSel = TT_NEXT_UINT24( p ); + + + if ( variantCode < varSel ) + max = mid; + else if ( variantCode > varSel ) + min = mid + 1; + else + return p; + } + + return NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_var_index( FT_CMap cmap, /* TT_CMap */ + FT_CMap ucmap, /* TT_CMap */ + FT_UInt32 charcode, + FT_UInt32 variantSelector ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + TT_CMap ttucmap = (TT_CMap)ucmap; + + FT_Byte* p = tt_cmap14_find_variant( ttcmap->data + 6, + variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return 0; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_PEEK_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( ttcmap->data + defOff, charcode ) ) + { + /* This is the default variant of this charcode. GID not stored */ + /* here; stored in the normal Unicode charmap instead. */ + return ttucmap->cmap.clazz->char_index( &ttucmap->cmap, charcode ); + } + + if ( nondefOff != 0 ) + return tt_cmap14_char_map_nondef_binary( ttcmap->data + nondefOff, + charcode ); + + return 0; + } + + + FT_CALLBACK_DEF( FT_Int ) + tt_cmap14_char_var_isdefault( FT_CMap cmap, /* TT_CMap */ + FT_UInt32 charcode, + FT_UInt32 variantSelector ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = tt_cmap14_find_variant( ttcmap->data + 6, + variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return -1; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( ttcmap->data + defOff, charcode ) ) + return 1; + + if ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( ttcmap->data + nondefOff, + charcode ) != 0 ) + return 0; + + return -1; + } + + + FT_CALLBACK_DEF( FT_UInt32* ) + tt_cmap14_variants( FT_CMap cmap, /* TT_CMap14 */ + FT_Memory memory ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = ttcmap->data + 10; + FT_UInt32* result; + FT_UInt32 i; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + result = cmap14->results; + for ( i = 0; i < count; i++ ) + { + result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 8; + } + result[i] = 0; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_char_variants( FT_CMap cmap, /* TT_CMap14 */ + FT_Memory memory, + FT_UInt32 charCode ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = ttcmap->data + 10; + FT_UInt32* q; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; count > 0; count-- ) + { + FT_UInt32 varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( ( defOff != 0 && + tt_cmap14_char_map_def_binary( ttcmap->data + defOff, + charCode ) ) || + ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( ttcmap->data + nondefOff, + charCode ) != 0 ) ) + { + q[0] = varSel; + q++; + } + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt + tt_cmap14_def_char_count( FT_Byte *p ) + { + FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + FT_UInt tot = 0; + + + p += 3; /* point to the first `cnt' field */ + for ( ; numRanges > 0; numRanges-- ) + { + tot += 1 + p[0]; + p += 4; + } + + return tot; + } + + + static FT_UInt32* + tt_cmap14_get_def_chars( TT_CMap cmap, + FT_Byte* p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt cnt; + FT_UInt32* q; + + + cnt = tt_cmap14_def_char_count( p ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; numRanges > 0; numRanges-- ) + { + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + cnt = FT_NEXT_BYTE( p ) + 1; + do + { + q[0] = uni; + uni += 1; + q += 1; + + } while ( --cnt != 0 ); + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt32* + tt_cmap14_get_nondef_chars( TT_CMap cmap, + FT_Byte *p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numMappings; + FT_UInt i; + FT_UInt32 *ret; + + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + for ( i = 0; i < numMappings; i++ ) + { + ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + ret[i] = 0; + + return ret; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_variant_chars( FT_CMap cmap, /* TT_CMap */ + FT_Memory memory, + FT_UInt32 variantSelector ) + { + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte *p = tt_cmap14_find_variant( ttcmap->data + 6, + variantSelector ); + FT_Int i; + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return NULL; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff == 0 && nondefOff == 0 ) + return NULL; + + if ( defOff == 0 ) + return tt_cmap14_get_nondef_chars( ttcmap, ttcmap->data + nondefOff, + memory ); + else if ( nondefOff == 0 ) + return tt_cmap14_get_def_chars( ttcmap, ttcmap->data + defOff, + memory ); + else + { + /* Both a default and a non-default glyph set? That's probably not */ + /* good font design, but the spec allows for it... */ + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt32 numRanges; + FT_UInt32 numMappings; + FT_UInt32 duni; + FT_UInt32 dcnt; + FT_UInt32 nuni; + FT_Byte* dp; + FT_UInt di, ni, k; + + FT_UInt32 *ret; + + + p = ttcmap->data + nondefOff; + dp = ttcmap->data + defOff; + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + dcnt = tt_cmap14_def_char_count( dp ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); + + if ( numMappings == 0 ) + return tt_cmap14_get_def_chars( ttcmap, ttcmap->data + defOff, + memory ); + if ( dcnt == 0 ) + return tt_cmap14_get_nondef_chars( ttcmap, ttcmap->data + nondefOff, + memory ); + + if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + di = 1; + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ni = 1; + i = 0; + + for (;;) + { + if ( nuni > duni + dcnt ) + { + for ( k = 0; k <= dcnt; k++ ) + ret[i++] = duni + k; + + di++; + + if ( di > numRanges ) + break; + + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + } + else + { + if ( nuni < duni ) + ret[i++] = nuni; + /* If it is within the default range then ignore it -- */ + /* that should not have happened */ + ni++; + if ( ni > numMappings ) + break; + + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + } + + if ( ni <= numMappings ) + { + /* If we get here then we have run out of all default ranges. */ + /* We have read one non-default mapping which we haven't stored */ + /* and there may be others that need to be read. */ + ret[i++] = nuni; + while ( ni < numMappings ) + { + ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ni++; + } + } + else if ( di <= numRanges ) + { + /* If we get here then we have run out of all non-default */ + /* mappings. We have read one default range which we haven't */ + /* stored and there may be others that need to be read. */ + for ( k = 0; k <= dcnt; k++ ) + ret[i++] = duni + k; + + while ( di < numRanges ) + { + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + + for ( k = 0; k <= dcnt; k++ ) + ret[i++] = duni + k; + di++; + } + } + + ret[i] = 0; + + return ret; + } + } + + + FT_DEFINE_TT_CMAP( + tt_cmap14_class_rec, + + sizeof ( TT_CMap14Rec ), + + (FT_CMap_InitFunc) tt_cmap14_init, /* init */ + (FT_CMap_DoneFunc) tt_cmap14_done, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap14_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap14_char_next, /* char_next */ + + /* Format 14 extension functions */ + (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, + (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, + (FT_CMap_VariantListFunc) tt_cmap14_variants, + (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, + (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars, + + 14, + (TT_CMap_ValidateFunc)tt_cmap14_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap14_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_14 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SYNTHETIC UNICODE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* This charmap is generated using postscript glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + FT_CALLBACK_DEF( const char * ) + tt_get_glyph_name( void* face_, /* TT_Face */ + FT_UInt idx ) + { + TT_Face face = (TT_Face)face_; + FT_String* PSname = NULL; + + + tt_face_get_ps_name( face, idx, &PSname ); + + return PSname; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ + FT_Pointer pointer ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + FT_UNUSED( pointer ); + + + if ( !psnames->unicodes_init ) + return FT_THROW( Unimplemented_Feature ); + + return psnames->unicodes_init( memory, + unicodes, + face->root.num_glyphs, + &tt_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + tt_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 char_code ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 *pchar_code ) + { + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_DEFINE_TT_CMAP( + tt_cmap_unicode_class_rec, + + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) tt_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) tt_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap_unicode_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + ~0U, + (TT_CMap_ValidateFunc)NULL, /* validate */ + (TT_CMap_Info_GetFunc)NULL /* get_cmap_info */ + ) + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + static const TT_CMap_Class tt_cmap_classes[] = + { +#undef TTCMAPCITEM +#define TTCMAPCITEM( a ) &a, +#include "ttcmapc.h" + NULL, + }; + + + /* parse the `cmap' table and build the corresponding TT_CMap objects */ + /* in the current face */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_build_cmaps( TT_Face face ) + { + FT_Byte* const table = face->cmap_table; + FT_Byte* limit; + FT_UInt volatile num_cmaps; + FT_Byte* volatile p = table; + FT_Library library = FT_FACE_LIBRARY( face ); + + FT_UNUSED( library ); + + + if ( !p || face->cmap_size < 4 ) + return FT_THROW( Invalid_Table ); + + /* Version 1.8.3 of the OpenType specification contains the following */ + /* (https://docs.microsoft.com/en-us/typography/opentype/spec/cmap): */ + /* */ + /* The 'cmap' table version number remains at 0x0000 for fonts that */ + /* make use of the newer subtable formats. */ + /* */ + /* This essentially means that a version format test is useless. */ + + /* ignore format */ + p += 2; + + num_cmaps = TT_NEXT_USHORT( p ); + FT_TRACE4(( "tt_face_build_cmaps: %d cmaps\n", num_cmaps )); + + limit = table + face->cmap_size; + for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) + { + FT_CharMapRec charmap; + FT_UInt32 offset; + + + charmap.platform_id = TT_NEXT_USHORT( p ); + charmap.encoding_id = TT_NEXT_USHORT( p ); + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ + offset = TT_NEXT_ULONG( p ); + + if ( offset && offset <= face->cmap_size - 2 ) + { + FT_Byte* volatile cmap = table + offset; + volatile FT_UInt format = TT_PEEK_USHORT( cmap ); + const TT_CMap_Class* volatile pclazz = tt_cmap_classes; + TT_CMap_Class volatile clazz; + + + for ( ; *pclazz; pclazz++ ) + { + clazz = *pclazz; + if ( clazz->format == format ) + { + volatile TT_ValidatorRec valid; + volatile FT_Error error = FT_Err_Ok; + + + ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, + FT_VALIDATE_DEFAULT ); + + valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; + + if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 ) + { + /* validate this cmap sub-table */ + error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); + } + + if ( !valid.validator.error ) + { + FT_CMap ttcmap; + + + /* It might make sense to store the single variation */ + /* selector cmap somewhere special. But it would have to be */ + /* in the public FT_FaceRec, and we can't change that. */ + + if ( !FT_CMap_New( (FT_CMap_Class)clazz, + cmap, &charmap, &ttcmap ) ) + { + /* it is simpler to directly set `flags' than adding */ + /* a parameter to FT_CMap_New */ + ((TT_CMap)ttcmap)->flags = (FT_Int)error; + } + } + else + { + FT_TRACE0(( "tt_face_build_cmaps:" + " broken cmap sub-table ignored\n" )); + } + break; + } + } + + if ( !*pclazz ) + { + FT_TRACE0(( "tt_face_build_cmaps:" + " unsupported cmap sub-table ignored\n" )); + } + } + } + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + + if ( clazz->get_cmap_info ) + return clazz->get_cmap_info( charmap, cmap_info ); + else + return FT_THROW( Invalid_CharMap_Format ); + } + + +/* END */ diff --git a/external/freetype/src/sfnt/ttcmap.h b/external/freetype/src/sfnt/ttcmap.h new file mode 100644 index 000000000..ff52917ed --- /dev/null +++ b/external/freetype/src/sfnt/ttcmap.h @@ -0,0 +1,126 @@ +/**************************************************************************** + * + * ttcmap.h + * + * TrueType character mapping table (cmap) support (specification). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTCMAP_H_ +#define TTCMAP_H_ + + +#include <freetype/internal/tttypes.h> +#include <freetype/internal/ftvalid.h> +#include <freetype/internal/services/svttcmap.h> + +FT_BEGIN_HEADER + + +#define TT_CMAP_FLAG_UNSORTED 1 +#define TT_CMAP_FLAG_OVERLAPPING 2 + + typedef struct TT_CMapRec_ + { + FT_CMapRec cmap; + FT_Byte* data; /* pointer to in-memory cmap table */ + FT_Int flags; /* for format 4 only */ + + } TT_CMapRec, *TT_CMap; + + typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; + + + typedef FT_Error + (*TT_CMap_ValidateFunc)( FT_Byte* data, + FT_Validator valid ); + + typedef struct TT_CMap_ClassRec_ + { + FT_CMap_ClassRec clazz; + FT_UInt format; + TT_CMap_ValidateFunc validate; + TT_CMap_Info_GetFunc get_cmap_info; + + } TT_CMap_ClassRec; + + +#define FT_DEFINE_TT_CMAP( class_, \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_, \ + format_, \ + validate_, \ + get_cmap_info_ ) \ + FT_CALLBACK_TABLE_DEF \ + const TT_CMap_ClassRec class_ = \ + { \ + { size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ \ + }, \ + \ + format_, \ + validate_, \ + get_cmap_info_ \ + }; + + +#undef TTCMAPCITEM +#define TTCMAPCITEM( a ) FT_CALLBACK_TABLE const TT_CMap_ClassRec a; +#include "ttcmapc.h" + + + typedef struct TT_ValidatorRec_ + { + FT_ValidatorRec validator; + FT_UInt num_glyphs; + + } TT_ValidatorRec, *TT_Validator; + + +#define TT_VALIDATOR( x ) ( (TT_Validator)( x ) ) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs + + + FT_CALLBACK_TABLE const TT_CMap_ClassRec tt_cmap_unicode_class_rec; + + FT_LOCAL( FT_Error ) + tt_face_build_cmaps( TT_Face face ); + + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + +FT_END_HEADER + +#endif /* TTCMAP_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttcmapc.h b/external/freetype/src/sfnt/ttcmapc.h new file mode 100644 index 000000000..0af48c247 --- /dev/null +++ b/external/freetype/src/sfnt/ttcmapc.h @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * ttcmapc.h + * + * TT CMAP classes definitions (specification only). + * + * Copyright (C) 2009-2023 by + * Oran Agra and Mickey Gabel. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + TTCMAPCITEM( tt_cmap0_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + TTCMAPCITEM( tt_cmap2_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + TTCMAPCITEM( tt_cmap4_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + TTCMAPCITEM( tt_cmap6_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + TTCMAPCITEM( tt_cmap8_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + TTCMAPCITEM( tt_cmap10_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + TTCMAPCITEM( tt_cmap12_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + TTCMAPCITEM( tt_cmap13_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + TTCMAPCITEM( tt_cmap14_class_rec ) +#endif + + + /* END */ diff --git a/external/freetype/src/sfnt/ttcolr.c b/external/freetype/src/sfnt/ttcolr.c new file mode 100644 index 000000000..281e7135e --- /dev/null +++ b/external/freetype/src/sfnt/ttcolr.c @@ -0,0 +1,1921 @@ +/**************************************************************************** + * + * ttcolr.c + * + * TrueType and OpenType colored glyph layer support (body). + * + * Copyright (C) 2018-2023 by + * David Turner, Robert Wilhelm, Dominik Röttsches, and Werner Lemberg. + * + * Originally written by Shao Yu Zhang <shaozhang@fb.com>. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * `COLR' table specification: + * + * https://www.microsoft.com/typography/otspec/colr.htm + * + */ + + +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include <freetype/ftcolor.h> +#include <freetype/config/integer-types.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/internal/services/svmm.h> +#endif + +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS + +#include "ttcolr.h" + + + /* NOTE: These are the table sizes calculated through the specs. */ +#define BASE_GLYPH_SIZE 6U +#define BASE_GLYPH_PAINT_RECORD_SIZE 6U +#define LAYER_V1_LIST_PAINT_OFFSET_SIZE 4U +#define LAYER_V1_LIST_NUM_LAYERS_SIZE 4U +#define COLOR_STOP_SIZE 6U +#define VAR_IDX_BASE_SIZE 4U +#define LAYER_SIZE 4U +/* https://docs.microsoft.com/en-us/typography/opentype/spec/colr#colr-header */ +/* 3 * uint16 + 2 * Offset32 */ +#define COLRV0_HEADER_SIZE 14U +/* COLRV0_HEADER_SIZE + 5 * Offset32 */ +#define COLRV1_HEADER_SIZE 34U + + +#define ENSURE_READ_BYTES( byte_size ) \ + if ( p < colr->paints_start_v1 || \ + p > (FT_Byte*)colr->table + colr->table_size - byte_size ) \ + return 0 + + + typedef enum FT_PaintFormat_Internal_ + { + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SOLID = 3, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_LINEAR_GRADIENT = 5, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_RADIAL_GRADIENT = 7, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SWEEP_GRADIENT = 9, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSFORM = 13, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSLATE = 15, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE = 17, + FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER = 18, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER = 19, + FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM = 20, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM = 21, + FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER = 22, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER = 23, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE = 25, + FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER = 26, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER = 27, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW = 29, + FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER = 30, + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER = 31, + + } FT_PaintFormat_Internal; + + + typedef struct BaseGlyphRecord_ + { + FT_UShort gid; + FT_UShort first_layer_index; + FT_UShort num_layers; + + } BaseGlyphRecord; + + + typedef struct BaseGlyphV1Record_ + { + FT_UShort gid; + /* Offset from start of BaseGlyphV1List, i.e., from base_glyphs_v1. */ + FT_ULong paint_offset; + + } BaseGlyphV1Record; + + + typedef struct Colr_ + { + FT_UShort version; + FT_UShort num_base_glyphs; + FT_UShort num_layers; + + FT_Byte* base_glyphs; + FT_Byte* layers; + + FT_ULong num_base_glyphs_v1; + /* Points at beginning of BaseGlyphV1List. */ + FT_Byte* base_glyphs_v1; + + FT_ULong num_layers_v1; + FT_Byte* layers_v1; + + FT_Byte* clip_list; + + /* + * Paint tables start at the minimum of the end of the LayerList and the + * end of the BaseGlyphList. Record this location in a field here for + * safety checks when accessing paint tables. + */ + FT_Byte* paints_start_v1; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Item Variation Store for variable 'COLR' v1. */ + GX_ItemVarStoreRec var_store; + GX_DeltaSetIdxMapRec delta_set_idx_map; +#endif + + /* The memory that backs up the `COLR' table. */ + void* table; + FT_ULong table_size; + + } Colr; + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttcolr + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_colr( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = face->root.memory; + + FT_Byte* table = NULL; + FT_Byte* p = NULL; + /* Needed for reading array lengths in referenced tables. */ + FT_Byte* p1 = NULL; + + Colr* colr = NULL; + + FT_ULong base_glyph_offset, layer_offset; + FT_ULong base_glyphs_offset_v1, num_base_glyphs_v1; + FT_ULong layer_offset_v1, num_layers_v1, clip_list_offset; + FT_ULong table_size; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_ULong colr_offset_in_stream; +#endif + + + /* `COLR' always needs `CPAL' */ + if ( !face->cpal ) + return FT_THROW( Invalid_File_Format ); + + error = face->goto_table( face, TTAG_COLR, stream, &table_size ); + if ( error ) + goto NoColr; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + colr_offset_in_stream = FT_STREAM_POS(); +#endif + + if ( table_size < COLRV0_HEADER_SIZE ) + goto NoColr; + + if ( FT_FRAME_EXTRACT( table_size, table ) ) + goto NoColr; + + p = table; + + if ( FT_NEW( colr ) ) + goto NoColr; + + colr->version = FT_NEXT_USHORT( p ); + if ( colr->version != 0 && colr->version != 1 ) + goto InvalidTable; + + colr->num_base_glyphs = FT_NEXT_USHORT( p ); + base_glyph_offset = FT_NEXT_ULONG( p ); + + if ( base_glyph_offset >= table_size ) + goto InvalidTable; + if ( colr->num_base_glyphs * BASE_GLYPH_SIZE > + table_size - base_glyph_offset ) + goto InvalidTable; + + layer_offset = FT_NEXT_ULONG( p ); + colr->num_layers = FT_NEXT_USHORT( p ); + + if ( layer_offset >= table_size ) + goto InvalidTable; + if ( colr->num_layers * LAYER_SIZE > table_size - layer_offset ) + goto InvalidTable; + + if ( colr->version == 1 ) + { + if ( table_size < COLRV1_HEADER_SIZE ) + goto InvalidTable; + + base_glyphs_offset_v1 = FT_NEXT_ULONG( p ); + + if ( base_glyphs_offset_v1 >= table_size - 4 ) + goto InvalidTable; + + p1 = (FT_Byte*)( table + base_glyphs_offset_v1 ); + num_base_glyphs_v1 = FT_PEEK_ULONG( p1 ); + + if ( num_base_glyphs_v1 * BASE_GLYPH_PAINT_RECORD_SIZE > + table_size - base_glyphs_offset_v1 ) + goto InvalidTable; + + colr->num_base_glyphs_v1 = num_base_glyphs_v1; + colr->base_glyphs_v1 = p1; + + layer_offset_v1 = FT_NEXT_ULONG( p ); + + if ( layer_offset_v1 >= table_size ) + goto InvalidTable; + + if ( layer_offset_v1 ) + { + if ( layer_offset_v1 >= table_size - 4 ) + goto InvalidTable; + + p1 = (FT_Byte*)( table + layer_offset_v1 ); + num_layers_v1 = FT_PEEK_ULONG( p1 ); + + if ( num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE > + table_size - layer_offset_v1 ) + goto InvalidTable; + + colr->num_layers_v1 = num_layers_v1; + colr->layers_v1 = p1; + + colr->paints_start_v1 = + FT_MIN( colr->base_glyphs_v1 + + colr->num_base_glyphs_v1 * BASE_GLYPH_PAINT_RECORD_SIZE, + colr->layers_v1 + + colr->num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE ); + } + else + { + colr->num_layers_v1 = 0; + colr->layers_v1 = 0; + colr->paints_start_v1 = + colr->base_glyphs_v1 + + colr->num_base_glyphs_v1 * BASE_GLYPH_PAINT_RECORD_SIZE; + } + + clip_list_offset = FT_NEXT_ULONG( p ); + + if ( clip_list_offset >= table_size ) + goto InvalidTable; + + if ( clip_list_offset ) + colr->clip_list = (FT_Byte*)( table + clip_list_offset ); + else + colr->clip_list = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + colr->var_store.dataCount = 0; + colr->var_store.varData = NULL; + colr->var_store.axisCount = 0; + colr->var_store.regionCount = 0; + colr->var_store.varRegionList = 0; + + colr->delta_set_idx_map.mapCount = 0; + colr->delta_set_idx_map.outerIndex = NULL; + colr->delta_set_idx_map.innerIndex = NULL; + + if ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) + { + FT_ULong var_idx_map_offset, var_store_offset; + + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + var_idx_map_offset = FT_NEXT_ULONG( p ); + + if ( var_idx_map_offset >= table_size ) + goto InvalidTable; + + var_store_offset = FT_NEXT_ULONG( p ); + if ( var_store_offset >= table_size ) + goto InvalidTable; + + if ( var_store_offset ) + { + /* If variation info has not been initialized yet, try doing so, */ + /* otherwise loading the variation store will fail as it */ + /* requires access to `blend` for checking the number of axes. */ + if ( !face->blend ) + if ( mm->get_mm_var( FT_FACE( face ), NULL ) ) + goto InvalidTable; + + /* Try loading `VarIdxMap` and `VarStore`. */ + error = mm->load_item_var_store( + FT_FACE( face ), + colr_offset_in_stream + var_store_offset, + &colr->var_store ); + if ( error != FT_Err_Ok ) + goto InvalidTable; + } + + if ( colr->var_store.axisCount && var_idx_map_offset ) + { + error = mm->load_delta_set_idx_map( + FT_FACE( face ), + colr_offset_in_stream + var_idx_map_offset, + &colr->delta_set_idx_map, + &colr->var_store, + table_size ); + if ( error != FT_Err_Ok ) + goto InvalidTable; + } + } +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + } + + colr->base_glyphs = (FT_Byte*)( table + base_glyph_offset ); + colr->layers = (FT_Byte*)( table + layer_offset ); + colr->table = table; + colr->table_size = table_size; + + face->colr = colr; + + return FT_Err_Ok; + + InvalidTable: +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + mm->done_delta_set_idx_map( FT_FACE( face ), + &colr->delta_set_idx_map ); + mm->done_item_var_store( FT_FACE( face ), + &colr->var_store ); + } +#endif + + error = FT_THROW( Invalid_Table ); + + NoColr: + FT_FRAME_RELEASE( table ); + FT_FREE( colr ); + + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_colr( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = face->root.memory; + + Colr* colr = (Colr*)face->colr; + + + if ( colr ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + mm->done_delta_set_idx_map( FT_FACE( face ), + &colr->delta_set_idx_map ); + mm->done_item_var_store( FT_FACE( face ), + &colr->var_store ); + } +#endif + FT_FRAME_RELEASE( colr->table ); + FT_FREE( colr ); + } + } + + + static FT_Bool + find_base_glyph_record( FT_Byte* base_glyph_begin, + FT_UInt num_base_glyph, + FT_UInt glyph_id, + BaseGlyphRecord* record ) + { + FT_UInt min = 0; + FT_UInt max = num_base_glyph; + + + while ( min < max ) + { + FT_UInt mid = min + ( max - min ) / 2; + FT_Byte* p = base_glyph_begin + mid * BASE_GLYPH_SIZE; + + FT_UShort gid = FT_NEXT_USHORT( p ); + + + if ( gid < glyph_id ) + min = mid + 1; + else if (gid > glyph_id ) + max = mid; + else + { + record->gid = gid; + record->first_layer_index = FT_NEXT_USHORT( p ); + record->num_layers = FT_NEXT_USHORT( p ); + + return 1; + } + } + + return 0; + } + + + FT_LOCAL_DEF( FT_Bool ) + tt_face_get_colr_layer( TT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ) + { + Colr* colr = (Colr*)face->colr; + BaseGlyphRecord glyph_record; + + + if ( !colr ) + return 0; + + if ( !iterator->p ) + { + FT_ULong offset; + + + /* first call to function */ + iterator->layer = 0; + + if ( !find_base_glyph_record( colr->base_glyphs, + colr->num_base_glyphs, + base_glyph, + &glyph_record ) ) + return 0; + + if ( glyph_record.num_layers ) + iterator->num_layers = glyph_record.num_layers; + else + return 0; + + offset = LAYER_SIZE * glyph_record.first_layer_index; + if ( offset + LAYER_SIZE * glyph_record.num_layers > colr->table_size ) + return 0; + + iterator->p = colr->layers + offset; + } + + if ( iterator->layer >= iterator->num_layers || + iterator->p < colr->layers || + iterator->p >= ( (FT_Byte*)colr->table + colr->table_size ) ) + return 0; + + *aglyph_index = FT_NEXT_USHORT( iterator->p ); + *acolor_index = FT_NEXT_USHORT( iterator->p ); + + if ( *aglyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) || + ( *acolor_index != 0xFFFF && + *acolor_index >= face->palette_data.num_palette_entries ) ) + return 0; + + iterator->layer++; + + return 1; + } + + + static FT_Bool + read_color_line( Colr* colr, + FT_Byte* color_line_p, + FT_ColorLine* colorline, + FT_Bool read_variable ) + { + FT_Byte* p = color_line_p; + FT_PaintExtend paint_extend; + + + ENSURE_READ_BYTES( 3 ); + + paint_extend = (FT_PaintExtend)FT_NEXT_BYTE( p ); + if ( paint_extend > FT_COLR_PAINT_EXTEND_REFLECT ) + return 0; + + colorline->extend = paint_extend; + + colorline->color_stop_iterator.num_color_stops = FT_NEXT_USHORT( p ); + colorline->color_stop_iterator.p = p; + colorline->color_stop_iterator.current_color_stop = 0; + colorline->color_stop_iterator.read_variable = read_variable; + + return 1; + } + + + /* + * Read a paint offset for `FT_Paint*` objects that have them and check + * whether it is within reasonable limits within the font and the COLR + * table. + * + * Return 1 on success, 0 on failure. + */ + static FT_Bool + get_child_table_pointer ( Colr* colr, + FT_Byte* paint_base, + FT_Byte** p, + FT_Byte** child_table_pointer ) + { + FT_UInt32 paint_offset; + FT_Byte* child_table_p; + + + if ( !child_table_pointer ) + return 0; + + if ( *p < colr->paints_start_v1 || + *p > (FT_Byte*)colr->table + colr->table_size - 1 - 3 ) + return 0; + + paint_offset = FT_NEXT_UOFF3( *p ); + if ( !paint_offset ) + return 0; + + child_table_p = (FT_Byte*)( paint_base + paint_offset ); + + if ( child_table_p < colr->paints_start_v1 || + child_table_p >= ( (FT_Byte*)colr->table + colr->table_size ) ) + return 0; + + *child_table_pointer = child_table_p; + return 1; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + static FT_Bool + get_deltas_for_var_index_base ( TT_Face face, + Colr* colr, + FT_ULong var_index_base, + FT_UInt num_deltas, + FT_ItemVarDelta* deltas ) + { + FT_UInt outer_index = 0; + FT_UInt inner_index = 0; + FT_ULong loop_var_index = var_index_base; + + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + FT_UInt i = 0; + + + if ( var_index_base == 0xFFFFFFFF ) + { + for ( i = 0; i < num_deltas; ++i ) + deltas[i] = 0; + return 1; + } + + for ( i = 0; i < num_deltas; ++i ) + { + loop_var_index = var_index_base + i; + + if ( colr->delta_set_idx_map.innerIndex ) + { + if ( loop_var_index >= colr->delta_set_idx_map.mapCount ) + loop_var_index = colr->delta_set_idx_map.mapCount - 1; + + outer_index = colr->delta_set_idx_map.outerIndex[loop_var_index]; + inner_index = colr->delta_set_idx_map.innerIndex[loop_var_index]; + } + else + { + outer_index = 0; + inner_index = loop_var_index; + } + + deltas[i] = mm->get_item_delta( FT_FACE( face ), &colr->var_store, + outer_index, inner_index ); + } + + return 1; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static FT_Bool + read_paint( TT_Face face, + Colr* colr, + FT_Byte* p, + FT_COLR_Paint* apaint ) + { + FT_Byte* paint_base = p; + FT_Byte* child_table_p = NULL; + FT_Bool do_read_var = FALSE; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_ULong var_index_base = 0; + /* Longest varIndexBase offset is 5 in the spec. */ + FT_ItemVarDelta item_deltas[6] = { 0, 0, 0, 0, 0, 0 }; +#else + FT_UNUSED( face ); +#endif + + + if ( !p || !colr || !colr->table ) + return 0; + + /* The last byte of the 'COLR' table is at 'size-1'; subtract 1 of */ + /* that to account for the expected format byte we are going to read. */ + if ( p < colr->paints_start_v1 || + p > (FT_Byte*)colr->table + colr->table_size - 2 ) + return 0; + + apaint->format = (FT_PaintFormat)FT_NEXT_BYTE( p ); + + if ( apaint->format >= FT_COLR_PAINT_FORMAT_MAX ) + return 0; + + if ( apaint->format == FT_COLR_PAINTFORMAT_COLR_LAYERS ) + { + /* Initialize layer iterator/ */ + FT_Byte num_layers; + FT_UInt32 first_layer_index; + + + num_layers = FT_NEXT_BYTE( p ); + if ( num_layers > colr->num_layers_v1 ) + return 0; + + first_layer_index = FT_NEXT_ULONG( p ); + if ( first_layer_index + num_layers > colr->num_layers_v1 ) + return 0; + + apaint->u.colr_layers.layer_iterator.num_layers = num_layers; + apaint->u.colr_layers.layer_iterator.layer = 0; + /* TODO: Check whether pointer is outside colr? */ + apaint->u.colr_layers.layer_iterator.p = + colr->layers_v1 + + LAYER_V1_LIST_NUM_LAYERS_SIZE + + LAYER_V1_LIST_PAINT_OFFSET_SIZE * first_layer_index; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_SOLID || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SOLID ) + { + ENSURE_READ_BYTES( 4 ); + apaint->u.solid.color.palette_index = FT_NEXT_USHORT( p ); + apaint->u.solid.color.alpha = FT_NEXT_SHORT( p ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SOLID ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG( p ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 1, + item_deltas ) ) + return 0; + + apaint->u.solid.color.alpha += (FT_F2Dot14)item_deltas[0]; + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_SOLID; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_COLR_GLYPH ) + { + ENSURE_READ_BYTES(2); + apaint->u.colr_glyph.glyphID = FT_NEXT_USHORT( p ); + + return 1; + } + + /* + * Grouped below here are all paint formats that have an offset to a + * child paint table as the first entry (for example, a color line or a + * child paint table). Retrieve that and determine whether that paint + * offset is valid first. + */ + + if ( !get_child_table_pointer( colr, paint_base, &p, &child_table_p ) ) + return 0; + + if ( apaint->format == FT_COLR_PAINTFORMAT_LINEAR_GRADIENT || + ( do_read_var = + ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_LINEAR_GRADIENT ) ) ) + { + if ( !read_color_line( colr, + child_table_p, + &apaint->u.linear_gradient.colorline, + do_read_var ) ) + return 0; + + /* + * In order to support variations expose these as FT_Fixed 16.16 + * values so that we can support fractional values after + * interpolation. + */ + ENSURE_READ_BYTES( 12 ); + apaint->u.linear_gradient.p0.x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.linear_gradient.p0.y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.linear_gradient.p1.x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.linear_gradient.p1.y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.linear_gradient.p2.x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.linear_gradient.p2.y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( do_read_var ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG ( p ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 6, + item_deltas ) ) + return 0; + + apaint->u.linear_gradient.p0.x += INT_TO_FIXED( item_deltas[0] ); + apaint->u.linear_gradient.p0.y += INT_TO_FIXED( item_deltas[1] ); + apaint->u.linear_gradient.p1.x += INT_TO_FIXED( item_deltas[2] ); + apaint->u.linear_gradient.p1.y += INT_TO_FIXED( item_deltas[3] ); + apaint->u.linear_gradient.p2.x += INT_TO_FIXED( item_deltas[4] ); + apaint->u.linear_gradient.p2.y += INT_TO_FIXED( item_deltas[5] ); + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_LINEAR_GRADIENT; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_RADIAL_GRADIENT || + ( do_read_var = + ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_RADIAL_GRADIENT ) ) ) + { + FT_Pos tmp; + + + if ( !read_color_line( colr, + child_table_p, + &apaint->u.radial_gradient.colorline, + do_read_var ) ) + return 0; + + + /* In the OpenType specification, `r0` and `r1` are defined as */ + /* `UFWORD`. Since FreeType doesn't have a corresponding 16.16 */ + /* format we convert to `FWORD` and replace negative values with */ + /* (32bit) `FT_INT_MAX`. */ + + ENSURE_READ_BYTES( 12 ); + + apaint->u.radial_gradient.c0.x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.radial_gradient.c0.y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + + tmp = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.radial_gradient.r0 = tmp < 0 ? FT_INT_MAX : tmp; + + apaint->u.radial_gradient.c1.x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.radial_gradient.c1.y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + + tmp = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.radial_gradient.r1 = tmp < 0 ? FT_INT_MAX : tmp; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( do_read_var ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG ( p ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 6, + item_deltas ) ) + return 0; + + apaint->u.radial_gradient.c0.x += INT_TO_FIXED( item_deltas[0] ); + apaint->u.radial_gradient.c0.y += INT_TO_FIXED( item_deltas[1] ); + + // TODO: Anything to be done about UFWORD deltas here? + apaint->u.radial_gradient.r0 += INT_TO_FIXED( item_deltas[2] ); + + apaint->u.radial_gradient.c1.x += INT_TO_FIXED( item_deltas[3] ); + apaint->u.radial_gradient.c1.y += INT_TO_FIXED( item_deltas[4] ); + + apaint->u.radial_gradient.r1 += INT_TO_FIXED( item_deltas[5] ); + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_RADIAL_GRADIENT; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_SWEEP_GRADIENT || + ( do_read_var = + ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SWEEP_GRADIENT ) ) ) + { + if ( !read_color_line( colr, + child_table_p, + &apaint->u.sweep_gradient.colorline, + do_read_var) ) + return 0; + + ENSURE_READ_BYTES( 8 ); + + apaint->u.sweep_gradient.center.x = + INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.sweep_gradient.center.y = + INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + + apaint->u.sweep_gradient.start_angle = + F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.sweep_gradient.end_angle = + F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( do_read_var ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG ( p ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4, + item_deltas ) ) + return 0; + + // TODO: Handle overflow? + apaint->u.sweep_gradient.center.x += INT_TO_FIXED( item_deltas[0] ); + apaint->u.sweep_gradient.center.y += INT_TO_FIXED( item_deltas[1] ); + + apaint->u.sweep_gradient.start_angle += + F2DOT14_TO_FIXED( item_deltas[2] ); + apaint->u.sweep_gradient.end_angle += + F2DOT14_TO_FIXED( item_deltas[3] ); + } +#endif + apaint->format = FT_COLR_PAINTFORMAT_SWEEP_GRADIENT; + + return 1; + } + + if ( apaint->format == FT_COLR_PAINTFORMAT_GLYPH ) + { + ENSURE_READ_BYTES( 2 ); + apaint->u.glyph.paint.p = child_table_p; + apaint->u.glyph.paint.insert_root_transform = 0; + apaint->u.glyph.glyphID = FT_NEXT_USHORT( p ); + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSFORM || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSFORM ) + { + apaint->u.transform.paint.p = child_table_p; + apaint->u.transform.paint.insert_root_transform = 0; + + if ( !get_child_table_pointer( colr, paint_base, &p, &child_table_p ) ) + return 0; + + p = child_table_p; + + /* + * The following matrix coefficients are encoded as + * OpenType 16.16 fixed-point values. + */ + ENSURE_READ_BYTES( 24 ); + apaint->u.transform.affine.xx = FT_NEXT_LONG( p ); + apaint->u.transform.affine.yx = FT_NEXT_LONG( p ); + apaint->u.transform.affine.xy = FT_NEXT_LONG( p ); + apaint->u.transform.affine.yy = FT_NEXT_LONG( p ); + apaint->u.transform.affine.dx = FT_NEXT_LONG( p ); + apaint->u.transform.affine.dy = FT_NEXT_LONG( p ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSFORM ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG( p ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 6, + item_deltas ) ) + return 0; + + apaint->u.transform.affine.xx += (FT_Fixed)item_deltas[0]; + apaint->u.transform.affine.yx += (FT_Fixed)item_deltas[1]; + apaint->u.transform.affine.xy += (FT_Fixed)item_deltas[2]; + apaint->u.transform.affine.yy += (FT_Fixed)item_deltas[3]; + apaint->u.transform.affine.dx += (FT_Fixed)item_deltas[4]; + apaint->u.transform.affine.dy += (FT_Fixed)item_deltas[5]; + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_TRANSFORM; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_TRANSLATE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSLATE ) + { + apaint->u.translate.paint.p = child_table_p; + apaint->u.translate.paint.insert_root_transform = 0; + + ENSURE_READ_BYTES( 4 ); + apaint->u.translate.dx = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.translate.dy = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_TRANSLATE ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG( p ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 2, + item_deltas ) ) + return 0; + + apaint->u.translate.dx += INT_TO_FIXED( item_deltas[0] ); + apaint->u.translate.dy += INT_TO_FIXED( item_deltas[1] ); + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_TRANSLATE; + + return 1; + } + + else if ( apaint->format >= FT_COLR_PAINTFORMAT_SCALE && + (FT_PaintFormat_Internal)apaint->format <= + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER ) + { + apaint->u.scale.paint.p = child_table_p; + apaint->u.scale.paint.insert_root_transform = 0; + + /* All scale paints get at least one scale value. */ + ENSURE_READ_BYTES( 2 ); + apaint->u.scale.scale_x = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + + /* Non-uniform ones read an extra y value. */ + if ( apaint->format == FT_COLR_PAINTFORMAT_SCALE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER ) + { + ENSURE_READ_BYTES( 2 ); + apaint->u.scale.scale_y = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + } + else + apaint->u.scale.scale_y = apaint->u.scale.scale_x; + + /* Scale paints that have a center read center coordinates, */ + /* otherwise the center is (0,0). */ + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SCALE_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SCALE_UNIFORM_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER ) + { + ENSURE_READ_BYTES( 4 ); + apaint->u.scale.center_x = INT_TO_FIXED( FT_NEXT_SHORT ( p ) ); + apaint->u.scale.center_y = INT_TO_FIXED( FT_NEXT_SHORT ( p ) ); + } + else + { + apaint->u.scale.center_x = 0; + apaint->u.scale.center_y = 0; + } + + /* Base values set, now handle variations. */ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG( p ); + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 2, + item_deltas ) ) + return 0; + + apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[1] ); + } + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_CENTER ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4, + item_deltas ) ) + return 0; + + apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[1] ); + apaint->u.scale.center_x += INT_TO_FIXED( item_deltas[2] ); + apaint->u.scale.center_y += INT_TO_FIXED( item_deltas[3] ); + } + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 1, + item_deltas ) ) + return 0; + + apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[0] ); + } + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SCALE_UNIFORM_CENTER ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 3, + item_deltas ) ) + return 0; + + apaint->u.scale.scale_x += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.scale.scale_y += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.scale.center_x += INT_TO_FIXED( item_deltas[1] ); + apaint->u.scale.center_y += INT_TO_FIXED( item_deltas[2] ); + } + } +#endif + + /* FT 'COLR' v1 API output format always returns fully defined */ + /* structs; we thus set the format to the public API value. */ + apaint->format = FT_COLR_PAINTFORMAT_SCALE; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_ROTATE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER ) + { + apaint->u.rotate.paint.p = child_table_p; + apaint->u.rotate.paint.insert_root_transform = 0; + + ENSURE_READ_BYTES( 2 ); + apaint->u.rotate.angle = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_ROTATE_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER ) + { + ENSURE_READ_BYTES( 4 ); + apaint->u.rotate.center_x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.rotate.center_y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + } + else + { + apaint->u.rotate.center_x = 0; + apaint->u.rotate.center_y = 0; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER ) + { + FT_UInt num_deltas = 0; + + + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG( p ); + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE_CENTER ) + num_deltas = 3; + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_ROTATE ) + num_deltas = 1; + + if ( num_deltas > 0 ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, + num_deltas, item_deltas ) ) + return 0; + + apaint->u.rotate.angle += F2DOT14_TO_FIXED( item_deltas[0] ); + + if ( num_deltas == 3 ) + { + apaint->u.rotate.center_x += INT_TO_FIXED( item_deltas[1] ); + apaint->u.rotate.center_y += INT_TO_FIXED( item_deltas[2] ); + } + } + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_ROTATE; + + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_SKEW || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER ) + { + apaint->u.skew.paint.p = child_table_p; + apaint->u.skew.paint.insert_root_transform = 0; + + ENSURE_READ_BYTES( 4 ); + apaint->u.skew.x_skew_angle = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.skew.y_skew_angle = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_SKEW_CENTER || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER ) + { + ENSURE_READ_BYTES( 4 ); + apaint->u.skew.center_x = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + apaint->u.skew.center_y = INT_TO_FIXED( FT_NEXT_SHORT( p ) ); + } + else + { + apaint->u.skew.center_x = 0; + apaint->u.skew.center_y = 0; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW || + (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER ) + { + ENSURE_READ_BYTES( 4 ); + var_index_base = FT_NEXT_ULONG( p ); + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 2, + item_deltas ) ) + return 0; + + apaint->u.skew.x_skew_angle += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.skew.y_skew_angle += F2DOT14_TO_FIXED( item_deltas[1] ); + } + + if ( (FT_PaintFormat_Internal)apaint->format == + FT_COLR_PAINTFORMAT_INTERNAL_VAR_SKEW_CENTER ) + { + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4, + item_deltas ) ) + return 0; + + apaint->u.skew.x_skew_angle += F2DOT14_TO_FIXED( item_deltas[0] ); + apaint->u.skew.y_skew_angle += F2DOT14_TO_FIXED( item_deltas[1] ); + apaint->u.skew.center_x += INT_TO_FIXED( item_deltas[2] ); + apaint->u.skew.center_y += INT_TO_FIXED( item_deltas[3] ); + } + } +#endif + + apaint->format = FT_COLR_PAINTFORMAT_SKEW; + + return 1; + } + + else if ( apaint->format == FT_COLR_PAINTFORMAT_COMPOSITE ) + { + FT_UInt composite_mode; + + + apaint->u.composite.source_paint.p = child_table_p; + apaint->u.composite.source_paint.insert_root_transform = 0; + + ENSURE_READ_BYTES( 1 ); + composite_mode = FT_NEXT_BYTE( p ); + if ( composite_mode >= FT_COLR_COMPOSITE_MAX ) + return 0; + + apaint->u.composite.composite_mode = (FT_Composite_Mode)composite_mode; + + if ( !get_child_table_pointer( colr, paint_base, &p, &child_table_p ) ) + return 0; + + apaint->u.composite.backdrop_paint.p = + child_table_p; + apaint->u.composite.backdrop_paint.insert_root_transform = + 0; + + return 1; + } + + return 0; + } + + + static FT_Bool + find_base_glyph_v1_record( FT_Byte * base_glyph_begin, + FT_UInt num_base_glyph, + FT_UInt glyph_id, + BaseGlyphV1Record *record ) + { + FT_UInt min = 0; + FT_UInt max = num_base_glyph; + + + while ( min < max ) + { + FT_UInt mid = min + ( max - min ) / 2; + + /* + * `base_glyph_begin` is the beginning of `BaseGlyphV1List`; + * skip `numBaseGlyphV1Records` by adding 4 to start binary search + * in the array of `BaseGlyphV1Record`. + */ + FT_Byte *p = base_glyph_begin + 4 + mid * BASE_GLYPH_PAINT_RECORD_SIZE; + + FT_UShort gid = FT_NEXT_USHORT( p ); + + + if ( gid < glyph_id ) + min = mid + 1; + else if (gid > glyph_id ) + max = mid; + else + { + record->gid = gid; + record->paint_offset = FT_NEXT_ULONG ( p ); + return 1; + } + } + + return 0; + } + + + FT_LOCAL_DEF( FT_Bool ) + tt_face_get_colr_glyph_paint( TT_Face face, + FT_UInt base_glyph, + FT_Color_Root_Transform root_transform, + FT_OpaquePaint* opaque_paint ) + { + Colr* colr = (Colr*)face->colr; + BaseGlyphV1Record base_glyph_v1_record; + FT_Byte* p; + + if ( !colr || !colr->table ) + return 0; + + if ( colr->version < 1 || !colr->num_base_glyphs_v1 || + !colr->base_glyphs_v1 ) + return 0; + + if ( opaque_paint->p ) + return 0; + + if ( !find_base_glyph_v1_record( colr->base_glyphs_v1, + colr->num_base_glyphs_v1, + base_glyph, + &base_glyph_v1_record ) ) + return 0; + + if ( !base_glyph_v1_record.paint_offset || + base_glyph_v1_record.paint_offset > colr->table_size ) + return 0; + + p = (FT_Byte*)( colr->base_glyphs_v1 + + base_glyph_v1_record.paint_offset ); + if ( p >= ( (FT_Byte*)colr->table + colr->table_size ) ) + return 0; + + opaque_paint->p = p; + + if ( root_transform == FT_COLOR_INCLUDE_ROOT_TRANSFORM ) + opaque_paint->insert_root_transform = 1; + else + opaque_paint->insert_root_transform = 0; + + return 1; + } + + + FT_LOCAL_DEF( FT_Bool ) + tt_face_get_color_glyph_clipbox( TT_Face face, + FT_UInt base_glyph, + FT_ClipBox* clip_box ) + { + Colr* colr; + + FT_Byte *p, *p1, *clip_base, *limit; + + FT_Byte clip_list_format; + FT_ULong num_clip_boxes, i; + FT_UShort gid_start, gid_end; + FT_UInt32 clip_box_offset; + FT_Byte format; + + const FT_Byte num_corners = 4; + FT_Vector corners[4]; + FT_Byte j; + FT_BBox font_clip_box; + + + colr = (Colr*)face->colr; + if ( !colr ) + return 0; + + if ( !colr->clip_list ) + return 0; + + p = colr->clip_list; + + /* Limit points to the first byte after the end of the color table. */ + /* Thus, in subsequent limit checks below we need to check whether the */ + /* read pointer is strictly greater than a position offset by certain */ + /* field sizes to the left of that position. */ + limit = (FT_Byte*)colr->table + colr->table_size; + + /* Check whether we can extract one `uint8` and one `uint32`. */ + if ( p > limit - ( 1 + 4 ) ) + return 0; + + clip_base = p; + clip_list_format = FT_NEXT_BYTE ( p ); + + /* Format byte used here to be able to upgrade ClipList for >16bit */ + /* glyph ids; for now we can expect it to be 1. */ + if ( !( clip_list_format == 1 ) ) + return 0; + + num_clip_boxes = FT_NEXT_ULONG( p ); + + /* Check whether we can extract two `uint16` and one `Offset24`, */ + /* `num_clip_boxes` times. */ + if ( colr->table_size / ( 2 + 2 + 3 ) < num_clip_boxes || + p > limit - ( 2 + 2 + 3 ) * num_clip_boxes ) + return 0; + + for ( i = 0; i < num_clip_boxes; ++i ) + { + gid_start = FT_NEXT_USHORT( p ); + gid_end = FT_NEXT_USHORT( p ); + clip_box_offset = FT_NEXT_UOFF3( p ); + + if ( base_glyph >= gid_start && base_glyph <= gid_end ) + { + p1 = (FT_Byte*)( clip_base + clip_box_offset ); + + /* Check whether we can extract one `uint8`. */ + if ( p1 > limit - 1 ) + return 0; + + format = FT_NEXT_BYTE( p1 ); + + if ( format > 2 ) + return 0; + + /* Check whether we can extract four `FWORD`. */ + if ( p1 > limit - ( 2 + 2 + 2 + 2 ) ) + return 0; + + /* `face->root.size->metrics.x_scale` and `y_scale` are factors */ + /* that scale a font unit value in integers to a 26.6 fixed value */ + /* according to the requested size, see for example */ + /* `ft_recompute_scaled_metrics`. */ + font_clip_box.xMin = FT_MulFix( FT_NEXT_SHORT( p1 ), + face->root.size->metrics.x_scale ); + font_clip_box.yMin = FT_MulFix( FT_NEXT_SHORT( p1 ), + face->root.size->metrics.y_scale ); + font_clip_box.xMax = FT_MulFix( FT_NEXT_SHORT( p1 ), + face->root.size->metrics.x_scale ); + font_clip_box.yMax = FT_MulFix( FT_NEXT_SHORT( p1 ), + face->root.size->metrics.y_scale ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( format == 2 ) + { + FT_ULong var_index_base = 0; + /* varIndexBase offset for clipbox is 3 at most. */ + FT_ItemVarDelta item_deltas[4] = { 0, 0, 0, 0 }; + + + /* Check whether we can extract a 32-bit varIndexBase now. */ + if ( p1 > limit - 4 ) + return 0; + + var_index_base = FT_NEXT_ULONG( p1 ); + + if ( !get_deltas_for_var_index_base( face, colr, var_index_base, 4, + item_deltas ) ) + return 0; + + font_clip_box.xMin += + FT_MulFix( item_deltas[0], face->root.size->metrics.x_scale ); + font_clip_box.yMin += + FT_MulFix( item_deltas[1], face->root.size->metrics.y_scale ); + font_clip_box.xMax += + FT_MulFix( item_deltas[2], face->root.size->metrics.x_scale ); + font_clip_box.yMax += + FT_MulFix( item_deltas[3], face->root.size->metrics.y_scale ); + } +#endif + + /* Make 4 corner points (xMin, yMin), (xMax, yMax) and transform */ + /* them. If we we would only transform two corner points and */ + /* span a rectangle based on those, the rectangle may become too */ + /* small to cover the glyph. */ + corners[0].x = font_clip_box.xMin; + corners[1].x = font_clip_box.xMin; + corners[2].x = font_clip_box.xMax; + corners[3].x = font_clip_box.xMax; + + corners[0].y = font_clip_box.yMin; + corners[1].y = font_clip_box.yMax; + corners[2].y = font_clip_box.yMax; + corners[3].y = font_clip_box.yMin; + + for ( j = 0; j < num_corners; ++j ) + { + if ( face->root.internal->transform_flags & 1 ) + FT_Vector_Transform( &corners[j], + &face->root.internal->transform_matrix ); + + if ( face->root.internal->transform_flags & 2 ) + { + corners[j].x += face->root.internal->transform_delta.x; + corners[j].y += face->root.internal->transform_delta.y; + } + } + + clip_box->bottom_left = corners[0]; + clip_box->top_left = corners[1]; + clip_box->top_right = corners[2]; + clip_box->bottom_right = corners[3]; + + return 1; + } + } + + return 0; + } + + + FT_LOCAL_DEF( FT_Bool ) + tt_face_get_paint_layers( TT_Face face, + FT_LayerIterator* iterator, + FT_OpaquePaint* opaque_paint ) + { + FT_Byte* p = NULL; + FT_Byte* p_first_layer = NULL; + FT_Byte* p_paint = NULL; + FT_UInt32 paint_offset; + + Colr* colr; + + + if ( iterator->layer == iterator->num_layers ) + return 0; + + colr = (Colr*)face->colr; + if ( !colr ) + return 0; + + /* + * We have an iterator pointing at a paint offset as part of the + * `paintOffset` array in `LayerV1List`. + */ + p = iterator->p; + + /* + * Do a cursor sanity check of the iterator. Counting backwards from + * where it stands, we need to end up at a position after the beginning + * of the `LayerV1List` table and not after the end of the + * `LayerV1List`. + */ + p_first_layer = p - + iterator->layer * LAYER_V1_LIST_PAINT_OFFSET_SIZE - + LAYER_V1_LIST_NUM_LAYERS_SIZE; + if ( p_first_layer < (FT_Byte*)colr->layers_v1 ) + return 0; + if ( p_first_layer >= (FT_Byte*)( + colr->layers_v1 + LAYER_V1_LIST_NUM_LAYERS_SIZE + + colr->num_layers_v1 * LAYER_V1_LIST_PAINT_OFFSET_SIZE ) ) + return 0; + + /* + * Before reading, ensure that `p` is within 'COLR' v1 and we can read a + * 4-byte ULONG. + */ + if ( p < colr->layers_v1 || + p > (FT_Byte*)colr->table + colr->table_size - 4 ) + return 0; + + paint_offset = + FT_NEXT_ULONG( p ); + opaque_paint->insert_root_transform = + 0; + + p_paint = (FT_Byte*)( colr->layers_v1 + paint_offset ); + + if ( p_paint < colr->paints_start_v1 || + p_paint >= ( (FT_Byte*)colr->table + colr->table_size ) ) + return 0; + + opaque_paint->p = p_paint; + + iterator->p = p; + + iterator->layer++; + + return 1; + } + + + FT_LOCAL_DEF( FT_Bool ) + tt_face_get_colorline_stops( TT_Face face, + FT_ColorStop* color_stop, + FT_ColorStopIterator *iterator ) + { + Colr* colr = (Colr*)face->colr; + + FT_Byte* p; + FT_ULong var_index_base; + FT_Byte* last_entry_p = NULL; + FT_UInt entry_size = COLOR_STOP_SIZE; + + + if ( !colr || !colr->table || !iterator ) + return 0; + + if ( iterator->current_color_stop >= iterator->num_color_stops ) + return 0; + + if ( iterator->read_variable ) + entry_size += VAR_IDX_BASE_SIZE; + + /* Calculate the start pointer for the last to-be-read (Var)ColorStop */ + /* and check whether we can read a full (Var)ColorStop at that */ + /* position by comparing it to the position that is the size of one */ + /* (Var)ColorStop before the end of the 'COLR' table. */ + last_entry_p = + iterator->p + ( iterator->num_color_stops - 1 - + iterator->current_color_stop ) * entry_size; + if ( iterator->p < colr->paints_start_v1 || + last_entry_p > (FT_Byte*)colr->table + + colr->table_size - entry_size ) + return 0; + + /* Iterator points at first `ColorStop` of `ColorLine`. */ + p = iterator->p; + + color_stop->stop_offset = F2DOT14_TO_FIXED( FT_NEXT_SHORT( p ) ); + + color_stop->color.palette_index = FT_NEXT_USHORT( p ); + + color_stop->color.alpha = FT_NEXT_SHORT( p ); + + if ( iterator->read_variable ) + { + /* Pointer p needs to be advanced independently of whether we intend */ + /* to take variable deltas into account or not. Otherwise iteration */ + /* would fail due to wrong offsets. */ + var_index_base = FT_NEXT_ULONG( p ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Int item_deltas[2]; + + + if ( !get_deltas_for_var_index_base( face, colr, + var_index_base, + 2, + item_deltas ) ) + return 0; + + color_stop->stop_offset += F2DOT14_TO_FIXED( item_deltas[0] ); + color_stop->color.alpha += (FT_F2Dot14)item_deltas[1]; + } +#else + FT_UNUSED( var_index_base ); +#endif + } + + iterator->p = p; + iterator->current_color_stop++; + + return 1; + } + + + FT_LOCAL_DEF( FT_Bool ) + tt_face_get_paint( TT_Face face, + FT_OpaquePaint opaque_paint, + FT_COLR_Paint* paint ) + { + Colr* colr = (Colr*)face->colr; + FT_OpaquePaint next_paint; + FT_Matrix ft_root_scale; + + if ( !colr || !colr->base_glyphs_v1 || !colr->table ) + return 0; + + if ( opaque_paint.insert_root_transform ) + { + /* 'COLR' v1 glyph information is returned in unscaled coordinates, + * i.e., `FT_Size` is not applied or multiplied into the values. When + * client applications draw color glyphs, they can request to include + * a top-level transform, which includes the active `x_scale` and + * `y_scale` information for scaling the glyph, as well the additional + * transform and translate configured through `FT_Set_Transform`. + * This allows client applications to apply this top-level transform + * to the graphics context first and only once, then have gradient and + * contour scaling applied correctly when performing the additional + * drawing operations for subsequenct paints. Prepare this initial + * transform here. + */ + paint->format = FT_COLR_PAINTFORMAT_TRANSFORM; + + next_paint.p = opaque_paint.p; + next_paint.insert_root_transform = 0; + paint->u.transform.paint = next_paint; + + /* `x_scale` and `y_scale` are in 26.6 format, representing the scale + * factor to get from font units to requested size. However, expected + * return values are in 16.16, so we shift accordingly with rounding. + */ + ft_root_scale.xx = ( face->root.size->metrics.x_scale + 32 ) >> 6; + ft_root_scale.xy = 0; + ft_root_scale.yx = 0; + ft_root_scale.yy = ( face->root.size->metrics.y_scale + 32 ) >> 6; + + if ( face->root.internal->transform_flags & 1 ) + FT_Matrix_Multiply( &face->root.internal->transform_matrix, + &ft_root_scale ); + + paint->u.transform.affine.xx = ft_root_scale.xx; + paint->u.transform.affine.xy = ft_root_scale.xy; + paint->u.transform.affine.yx = ft_root_scale.yx; + paint->u.transform.affine.yy = ft_root_scale.yy; + + /* The translation is specified in 26.6 format and, according to the + * documentation of `FT_Set_Translate`, is performed on the character + * size given in the last call to `FT_Set_Char_Size`. The + * 'PaintTransform' paint table's `FT_Affine23` format expects + * values in 16.16 format, thus we need to shift by 10 bits. + */ + if ( face->root.internal->transform_flags & 2 ) + { + paint->u.transform.affine.dx = + face->root.internal->transform_delta.x * ( 1 << 10 ); + paint->u.transform.affine.dy = + face->root.internal->transform_delta.y * ( 1 << 10 ); + } + else + { + paint->u.transform.affine.dx = 0; + paint->u.transform.affine.dy = 0; + } + + return 1; + } + + return read_paint( face, colr, opaque_paint.p, paint ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_colr_blend_layer( TT_Face face, + FT_UInt color_index, + FT_GlyphSlot dstSlot, + FT_GlyphSlot srcSlot ) + { + FT_Error error; + + FT_UInt x, y; + FT_Byte b, g, r, alpha; + + FT_ULong size; + FT_Byte* src; + FT_Byte* dst; + + + if ( !dstSlot->bitmap.buffer ) + { + /* Initialize destination of color bitmap */ + /* with the size of first component. */ + dstSlot->bitmap_left = srcSlot->bitmap_left; + dstSlot->bitmap_top = srcSlot->bitmap_top; + + dstSlot->bitmap.width = srcSlot->bitmap.width; + dstSlot->bitmap.rows = srcSlot->bitmap.rows; + dstSlot->bitmap.pixel_mode = FT_PIXEL_MODE_BGRA; + dstSlot->bitmap.pitch = (int)dstSlot->bitmap.width * 4; + dstSlot->bitmap.num_grays = 256; + + size = dstSlot->bitmap.rows * (unsigned int)dstSlot->bitmap.pitch; + + error = ft_glyphslot_alloc_bitmap( dstSlot, size ); + if ( error ) + return error; + + FT_MEM_ZERO( dstSlot->bitmap.buffer, size ); + } + else + { + /* Resize destination if needed such that new component fits. */ + FT_Int x_min, x_max, y_min, y_max; + + + x_min = FT_MIN( dstSlot->bitmap_left, srcSlot->bitmap_left ); + x_max = FT_MAX( dstSlot->bitmap_left + (FT_Int)dstSlot->bitmap.width, + srcSlot->bitmap_left + (FT_Int)srcSlot->bitmap.width ); + + y_min = FT_MIN( dstSlot->bitmap_top - (FT_Int)dstSlot->bitmap.rows, + srcSlot->bitmap_top - (FT_Int)srcSlot->bitmap.rows ); + y_max = FT_MAX( dstSlot->bitmap_top, srcSlot->bitmap_top ); + + if ( x_min != dstSlot->bitmap_left || + x_max != dstSlot->bitmap_left + (FT_Int)dstSlot->bitmap.width || + y_min != dstSlot->bitmap_top - (FT_Int)dstSlot->bitmap.rows || + y_max != dstSlot->bitmap_top ) + { + FT_Memory memory = face->root.memory; + + FT_UInt width = (FT_UInt)( x_max - x_min ); + FT_UInt rows = (FT_UInt)( y_max - y_min ); + FT_UInt pitch = width * 4; + + FT_Byte* buf = NULL; + FT_Byte* p; + FT_Byte* q; + + + size = rows * pitch; + if ( FT_ALLOC( buf, size ) ) + return error; + + p = dstSlot->bitmap.buffer; + q = buf + + (int)pitch * ( y_max - dstSlot->bitmap_top ) + + 4 * ( dstSlot->bitmap_left - x_min ); + + for ( y = 0; y < dstSlot->bitmap.rows; y++ ) + { + FT_MEM_COPY( q, p, dstSlot->bitmap.width * 4 ); + + p += dstSlot->bitmap.pitch; + q += pitch; + } + + ft_glyphslot_set_bitmap( dstSlot, buf ); + + dstSlot->bitmap_top = y_max; + dstSlot->bitmap_left = x_min; + + dstSlot->bitmap.width = width; + dstSlot->bitmap.rows = rows; + dstSlot->bitmap.pitch = (int)pitch; + + dstSlot->internal->flags |= FT_GLYPH_OWN_BITMAP; + dstSlot->format = FT_GLYPH_FORMAT_BITMAP; + } + } + + if ( color_index == 0xFFFF ) + { + if ( face->have_foreground_color ) + { + b = face->foreground_color.blue; + g = face->foreground_color.green; + r = face->foreground_color.red; + alpha = face->foreground_color.alpha; + } + else + { + if ( face->palette_data.palette_flags && + ( face->palette_data.palette_flags[face->palette_index] & + FT_PALETTE_FOR_DARK_BACKGROUND ) ) + { + /* white opaque */ + b = 0xFF; + g = 0xFF; + r = 0xFF; + alpha = 0xFF; + } + else + { + /* black opaque */ + b = 0x00; + g = 0x00; + r = 0x00; + alpha = 0xFF; + } + } + } + else + { + b = face->palette[color_index].blue; + g = face->palette[color_index].green; + r = face->palette[color_index].red; + alpha = face->palette[color_index].alpha; + } + + /* XXX Convert if srcSlot.bitmap is not grey? */ + src = srcSlot->bitmap.buffer; + dst = dstSlot->bitmap.buffer + + dstSlot->bitmap.pitch * ( dstSlot->bitmap_top - srcSlot->bitmap_top ) + + 4 * ( srcSlot->bitmap_left - dstSlot->bitmap_left ); + + for ( y = 0; y < srcSlot->bitmap.rows; y++ ) + { + for ( x = 0; x < srcSlot->bitmap.width; x++ ) + { + int aa = src[x]; + int fa = alpha * aa / 255; + + int fb = b * fa / 255; + int fg = g * fa / 255; + int fr = r * fa / 255; + + int ba2 = 255 - fa; + + int bb = dst[4 * x + 0]; + int bg = dst[4 * x + 1]; + int br = dst[4 * x + 2]; + int ba = dst[4 * x + 3]; + + + dst[4 * x + 0] = (FT_Byte)( bb * ba2 / 255 + fb ); + dst[4 * x + 1] = (FT_Byte)( bg * ba2 / 255 + fg ); + dst[4 * x + 2] = (FT_Byte)( br * ba2 / 255 + fr ); + dst[4 * x + 3] = (FT_Byte)( ba * ba2 / 255 + fa ); + } + + src += srcSlot->bitmap.pitch; + dst += dstSlot->bitmap.pitch; + } + + return FT_Err_Ok; + } + +#else /* !TT_CONFIG_OPTION_COLOR_LAYERS */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_colr_dummy_; + +#endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */ + +/* EOF */ diff --git a/external/freetype/src/sfnt/ttcolr.h b/external/freetype/src/sfnt/ttcolr.h new file mode 100644 index 000000000..20c85f035 --- /dev/null +++ b/external/freetype/src/sfnt/ttcolr.h @@ -0,0 +1,83 @@ +/**************************************************************************** + * + * ttcolr.h + * + * TrueType and OpenType colored glyph layer support (specification). + * + * Copyright (C) 2018-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Originally written by Shao Yu Zhang <shaozhang@fb.com>. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef __TTCOLR_H__ +#define __TTCOLR_H__ + + +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_colr( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_colr( TT_Face face ); + + FT_LOCAL( FT_Bool ) + tt_face_get_colr_layer( TT_Face face, + FT_UInt base_glyph, + FT_UInt *aglyph_index, + FT_UInt *acolor_index, + FT_LayerIterator* iterator ); + + FT_LOCAL( FT_Bool ) + tt_face_get_colr_glyph_paint( TT_Face face, + FT_UInt base_glyph, + FT_Color_Root_Transform root_transform, + FT_OpaquePaint* paint ); + + FT_LOCAL( FT_Bool ) + tt_face_get_color_glyph_clipbox( TT_Face face, + FT_UInt base_glyph, + FT_ClipBox* clip_box ); + + FT_LOCAL( FT_Bool ) + tt_face_get_paint_layers( TT_Face face, + FT_LayerIterator* iterator, + FT_OpaquePaint* paint ); + + FT_LOCAL( FT_Bool ) + tt_face_get_colorline_stops( TT_Face face, + FT_ColorStop* color_stop, + FT_ColorStopIterator* iterator ); + + FT_LOCAL( FT_Bool ) + tt_face_get_paint( TT_Face face, + FT_OpaquePaint opaque_paint, + FT_COLR_Paint* paint ); + + FT_LOCAL( FT_Error ) + tt_face_colr_blend_layer( TT_Face face, + FT_UInt color_index, + FT_GlyphSlot dstSlot, + FT_GlyphSlot srcSlot ); + + +FT_END_HEADER + + +#endif /* __TTCOLR_H__ */ + +/* END */ diff --git a/external/freetype/src/sfnt/ttcpal.c b/external/freetype/src/sfnt/ttcpal.c new file mode 100644 index 000000000..46ae08596 --- /dev/null +++ b/external/freetype/src/sfnt/ttcpal.c @@ -0,0 +1,310 @@ +/**************************************************************************** + * + * ttcpal.c + * + * TrueType and OpenType color palette support (body). + * + * Copyright (C) 2018-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Originally written by Shao Yu Zhang <shaozhang@fb.com>. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * `CPAL' table specification: + * + * https://www.microsoft.com/typography/otspec/cpal.htm + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include <freetype/ftcolor.h> + + +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS + +#include "ttcpal.h" + + + /* NOTE: These are the table sizes calculated through the specs. */ +#define CPAL_V0_HEADER_BASE_SIZE 12U +#define COLOR_SIZE 4U + + + /* all data from `CPAL' not covered in FT_Palette_Data */ + typedef struct Cpal_ + { + FT_UShort version; /* Table version number (0 or 1 supported). */ + FT_UShort num_colors; /* Total number of color records, */ + /* combined for all palettes. */ + FT_Byte* colors; /* RGBA array of colors */ + FT_Byte* color_indices; /* Index of each palette's first color record */ + /* in the combined color record array. */ + + /* The memory which backs up the `CPAL' table. */ + void* table; + FT_ULong table_size; + + } Cpal; + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttcpal + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cpal( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = face->root.memory; + + FT_Byte* table = NULL; + FT_Byte* p = NULL; + + Cpal* cpal = NULL; + + FT_ULong colors_offset; + FT_ULong table_size; + + + error = face->goto_table( face, TTAG_CPAL, stream, &table_size ); + if ( error ) + goto NoCpal; + + if ( table_size < CPAL_V0_HEADER_BASE_SIZE ) + goto InvalidTable; + + if ( FT_FRAME_EXTRACT( table_size, table ) ) + goto NoCpal; + + p = table; + + if ( FT_NEW( cpal ) ) + goto NoCpal; + + cpal->version = FT_NEXT_USHORT( p ); + if ( cpal->version > 1 ) + goto InvalidTable; + + face->palette_data.num_palette_entries = FT_NEXT_USHORT( p ); + face->palette_data.num_palettes = FT_NEXT_USHORT( p ); + + cpal->num_colors = FT_NEXT_USHORT( p ); + colors_offset = FT_NEXT_ULONG( p ); + + if ( CPAL_V0_HEADER_BASE_SIZE + + face->palette_data.num_palettes * 2U > table_size ) + goto InvalidTable; + + if ( colors_offset >= table_size ) + goto InvalidTable; + if ( cpal->num_colors * COLOR_SIZE > table_size - colors_offset ) + goto InvalidTable; + + if ( face->palette_data.num_palette_entries > cpal->num_colors ) + goto InvalidTable; + + cpal->color_indices = p; + cpal->colors = (FT_Byte*)( table + colors_offset ); + + if ( cpal->version == 1 ) + { + FT_ULong type_offset, label_offset, entry_label_offset; + FT_UShort* array = NULL; + FT_UShort* limit; + FT_UShort* q; + + + if ( CPAL_V0_HEADER_BASE_SIZE + + face->palette_data.num_palettes * 2U + + 3U * 4 > table_size ) + goto InvalidTable; + + p += face->palette_data.num_palettes * 2U; + + type_offset = FT_NEXT_ULONG( p ); + label_offset = FT_NEXT_ULONG( p ); + entry_label_offset = FT_NEXT_ULONG( p ); + + if ( type_offset ) + { + if ( type_offset >= table_size ) + goto InvalidTable; + if ( face->palette_data.num_palettes * 2U > + table_size - type_offset ) + goto InvalidTable; + + if ( FT_QNEW_ARRAY( array, face->palette_data.num_palettes ) ) + goto NoCpal; + + p = table + type_offset; + q = array; + limit = q + face->palette_data.num_palettes; + + while ( q < limit ) + *q++ = FT_NEXT_USHORT( p ); + + face->palette_data.palette_flags = array; + } + + if ( label_offset ) + { + if ( label_offset >= table_size ) + goto InvalidTable; + if ( face->palette_data.num_palettes * 2U > + table_size - label_offset ) + goto InvalidTable; + + if ( FT_QNEW_ARRAY( array, face->palette_data.num_palettes ) ) + goto NoCpal; + + p = table + label_offset; + q = array; + limit = q + face->palette_data.num_palettes; + + while ( q < limit ) + *q++ = FT_NEXT_USHORT( p ); + + face->palette_data.palette_name_ids = array; + } + + if ( entry_label_offset ) + { + if ( entry_label_offset >= table_size ) + goto InvalidTable; + if ( face->palette_data.num_palette_entries * 2U > + table_size - entry_label_offset ) + goto InvalidTable; + + if ( FT_QNEW_ARRAY( array, face->palette_data.num_palette_entries ) ) + goto NoCpal; + + p = table + entry_label_offset; + q = array; + limit = q + face->palette_data.num_palette_entries; + + while ( q < limit ) + *q++ = FT_NEXT_USHORT( p ); + + face->palette_data.palette_entry_name_ids = array; + } + } + + cpal->table = table; + cpal->table_size = table_size; + + face->cpal = cpal; + + /* set up default palette */ + if ( FT_NEW_ARRAY( face->palette, + face->palette_data.num_palette_entries ) ) + goto NoCpal; + + if ( tt_face_palette_set( face, 0 ) ) + goto InvalidTable; + + return FT_Err_Ok; + + InvalidTable: + error = FT_THROW( Invalid_Table ); + + NoCpal: + FT_FRAME_RELEASE( table ); + FT_FREE( cpal ); + + face->cpal = NULL; + + /* arrays in `face->palette_data' and `face->palette' */ + /* are freed in `sfnt_done_face' */ + + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_cpal( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = face->root.memory; + + Cpal* cpal = (Cpal*)face->cpal; + + + if ( cpal ) + { + FT_FRAME_RELEASE( cpal->table ); + FT_FREE( cpal ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_palette_set( TT_Face face, + FT_UInt palette_index ) + { + Cpal* cpal = (Cpal*)face->cpal; + + FT_Byte* offset; + FT_Byte* p; + + FT_Color* q; + FT_Color* limit; + + FT_UShort color_index; + + + if ( !cpal || palette_index >= face->palette_data.num_palettes ) + return FT_THROW( Invalid_Argument ); + + offset = cpal->color_indices + 2 * palette_index; + color_index = FT_PEEK_USHORT( offset ); + + if ( color_index + face->palette_data.num_palette_entries > + cpal->num_colors ) + return FT_THROW( Invalid_Table ); + + p = cpal->colors + COLOR_SIZE * color_index; + q = face->palette; + limit = q + face->palette_data.num_palette_entries; + + while ( q < limit ) + { + q->blue = FT_NEXT_BYTE( p ); + q->green = FT_NEXT_BYTE( p ); + q->red = FT_NEXT_BYTE( p ); + q->alpha = FT_NEXT_BYTE( p ); + + q++; + } + + return FT_Err_Ok; + } + + +#else /* !TT_CONFIG_OPTION_COLOR_LAYERS */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_cpal_dummy_; + +#endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */ + +/* EOF */ diff --git a/external/freetype/src/sfnt/ttcpal.h b/external/freetype/src/sfnt/ttcpal.h new file mode 100644 index 000000000..8e9913f0c --- /dev/null +++ b/external/freetype/src/sfnt/ttcpal.h @@ -0,0 +1,48 @@ +/**************************************************************************** + * + * ttcpal.h + * + * TrueType and OpenType color palette support (specification). + * + * Copyright (C) 2018-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Originally written by Shao Yu Zhang <shaozhang@fb.com>. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef __TTCPAL_H__ +#define __TTCPAL_H__ + + +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_cpal( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_cpal( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_palette_set( TT_Face face, + FT_UInt palette_index ); + + +FT_END_HEADER + + +#endif /* __TTCPAL_H__ */ + +/* END */ diff --git a/external/freetype/src/sfnt/ttkern.c b/external/freetype/src/sfnt/ttkern.c new file mode 100644 index 000000000..a47d08bd6 --- /dev/null +++ b/external/freetype/src/sfnt/ttkern.c @@ -0,0 +1,317 @@ +/**************************************************************************** + * + * ttkern.c + * + * Load the basic TrueType kerning table. This doesn't handle + * kerning data within the GPOS table at the moment. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include "ttkern.h" + +#include "sferrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttkern + + +#undef TT_KERN_INDEX +#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt nn, num_tables; + FT_UInt32 avail = 0, ordered = 0; + + + /* the kern table is optional; exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 4 ) /* the case of a malformed table */ + { + FT_ERROR(( "tt_face_load_kern:" + " kerning table is too small - ignored\n" )); + error = FT_THROW( Table_Missing ); + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) + { + FT_ERROR(( "tt_face_load_kern:" + " could not extract kerning table\n" )); + goto Exit; + } + + face->kern_table_size = table_size; + + p = face->kern_table; + p_limit = p + table_size; + + p += 2; /* skip version */ + num_tables = FT_NEXT_USHORT( p ); + + if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ + num_tables = 32; + + for ( nn = 0; nn < num_tables; nn++ ) + { + FT_UInt num_pairs, length, coverage, format; + FT_Byte* p_next; + FT_UInt32 mask = (FT_UInt32)1UL << nn; + + + if ( p + 6 > p_limit ) + break; + + p_next = p; + + p += 2; /* skip version */ + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + + if ( length <= 6 + 8 ) + break; + + p_next += length; + + if ( p_next > p_limit ) /* handle broken table */ + p_next = p_limit; + + format = coverage >> 8; + + /* we currently only support format 0 kerning tables */ + if ( format != 0 ) + goto NextTable; + + /* only use horizontal kerning tables */ + if ( ( coverage & 3U ) != 0x0001 || + p + 8 > p_next ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); + + avail |= mask; + + /* + * Now check whether the pairs in this table are ordered. + * We then can use binary search. + */ + if ( num_pairs > 0 ) + { + FT_ULong count; + FT_ULong old_pair; + + + old_pair = FT_NEXT_ULONG( p ); + p += 2; + + for ( count = num_pairs - 1; count > 0; count-- ) + { + FT_UInt32 cur_pair; + + + cur_pair = FT_NEXT_ULONG( p ); + if ( cur_pair < old_pair ) + break; + + p += 2; + old_pair = cur_pair; + } + + if ( count == 0 ) + ordered |= mask; + } + + NextTable: + p = p_next; + } + + face->num_kern_tables = nn; + face->kern_avail_bits = avail; + face->kern_order_bits = ordered; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_kern( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->kern_table ); + face->kern_table_size = 0; + face->num_kern_tables = 0; + face->kern_avail_bits = 0; + face->kern_order_bits = 0; + } + + + FT_LOCAL_DEF( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ) + { + FT_Int result = 0; + FT_UInt count, mask; + + FT_Byte* p; + FT_Byte* p_limit; + + + if ( !face->kern_table ) + return result; + + p = face->kern_table; + p_limit = p + face->kern_table_size; + + p += 4; + mask = 0x0001; + + for ( count = face->num_kern_tables; + count > 0 && p + 6 <= p_limit; + count--, mask <<= 1 ) + { + FT_Byte* base = p; + FT_Byte* next; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt length = FT_NEXT_USHORT( p ); + FT_UInt coverage = FT_NEXT_USHORT( p ); + FT_UInt num_pairs; + FT_Int value = 0; + + FT_UNUSED( version ); + + + next = base + length; + + if ( next > p_limit ) /* handle broken table */ + next = p_limit; + + if ( ( face->kern_avail_bits & mask ) == 0 ) + goto NextTable; + + FT_ASSERT( p + 8 <= next ); /* tested in tt_face_load_kern */ + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( next - p ) / 6 ); + + switch ( coverage >> 8 ) + { + case 0: + { + FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); + + + if ( face->kern_order_bits & mask ) /* binary search */ + { + FT_UInt min = 0; + FT_UInt max = num_pairs; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + FT_Byte* q = p + 6 * mid; + FT_ULong key; + + + key = FT_NEXT_ULONG( q ); + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( q ); + goto Found; + } + if ( key < key0 ) + min = mid + 1; + else + max = mid; + } + } + else /* linear search */ + { + FT_UInt count2; + + + for ( count2 = num_pairs; count2 > 0; count2-- ) + { + FT_ULong key = FT_NEXT_ULONG( p ); + + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( p ); + goto Found; + } + p += 2; + } + } + } + break; + + /* + * We don't support format 2 because we haven't seen a single font + * using it in real life... + */ + + default: + ; + } + + goto NextTable; + + Found: + if ( coverage & 8 ) /* override or add */ + result = value; + else + result += value; + + NextTable: + p = next; + } + + return result; + } + +#undef TT_KERN_INDEX + +/* END */ diff --git a/external/freetype/src/sfnt/ttkern.h b/external/freetype/src/sfnt/ttkern.h new file mode 100644 index 000000000..960c7da49 --- /dev/null +++ b/external/freetype/src/sfnt/ttkern.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * ttkern.h + * + * Load the basic TrueType kerning table. This doesn't handle + * kerning data within the GPOS table at the moment. + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTKERN_H_ +#define TTKERN_H_ + + +#include <freetype/internal/ftstream.h> +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_done_kern( TT_Face face ); + + FT_LOCAL( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + +#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) + + +FT_END_HEADER + +#endif /* TTKERN_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttload.c b/external/freetype/src/sfnt/ttload.c new file mode 100644 index 000000000..7b44e9cd2 --- /dev/null +++ b/external/freetype/src/sfnt/ttload.c @@ -0,0 +1,1496 @@ +/**************************************************************************** + * + * ttload.c + * + * Load the basic TrueType tables, i.e., tables that can be either in + * TTF or OTF fonts (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include "ttload.h" + +#include "sferrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttload + + + /************************************************************************** + * + * @Function: + * tt_face_lookup_table + * + * @Description: + * Looks for a TrueType table by name. + * + * @Input: + * face :: + * A face object handle. + * + * tag :: + * The searched tag. + * + * @Return: + * A pointer to the table directory entry. 0 if not found. + */ + FT_LOCAL_DEF( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ) + { + TT_Table entry; + TT_Table limit; +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool zero_length = FALSE; +#endif + + + FT_TRACE4(( "tt_face_lookup_table: %p, `%c%c%c%c' -- ", + (void *)face, + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { + /* For compatibility with Windows, we consider */ + /* zero-length tables the same as missing tables. */ + if ( entry->Tag == tag ) + { + if ( entry->Length != 0 ) + { + FT_TRACE4(( "found table.\n" )); + return entry; + } +#ifdef FT_DEBUG_LEVEL_TRACE + zero_length = TRUE; +#endif + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( zero_length ) + FT_TRACE4(( "ignoring empty table\n" )); + else + FT_TRACE4(( "could not find table\n" )); +#endif + + return NULL; + } + + + /************************************************************************** + * + * @Function: + * tt_face_goto_table + * + * @Description: + * Looks for a TrueType table by name, then seek a stream to it. + * + * @Input: + * face :: + * A face object handle. + * + * tag :: + * The searched tag. + * + * stream :: + * The stream to seek when the table is found. + * + * @Output: + * length :: + * The length of the table if found, undefined otherwise. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ) + { + TT_Table table; + FT_Error error; + + + table = tt_face_lookup_table( face, tag ); + if ( table ) + { + if ( length ) + *length = table->Length; + + if ( FT_STREAM_SEEK( table->Offset ) ) + goto Exit; + } + else + error = FT_THROW( Table_Missing ); + + Exit: + return error; + } + + + /* Here, we */ + /* */ + /* - check that `num_tables' is valid (and adjust it if necessary); */ + /* also return the number of valid table entries */ + /* */ + /* - look for a `head' table, check its size, and parse it to check */ + /* whether its `magic' field is correctly set */ + /* */ + /* - errors (except errors returned by stream handling) */ + /* */ + /* SFNT_Err_Unknown_File_Format: */ + /* no table is defined in directory, it is not sfnt-wrapped */ + /* data */ + /* SFNT_Err_Table_Missing: */ + /* table directory is valid, but essential tables */ + /* (head/bhed/SING) are missing */ + /* */ + static FT_Error + check_table_dir( SFNT_Header sfnt, + FT_Stream stream, + FT_UShort* valid ) + { + FT_Error error; + FT_UShort nn, valid_entries = 0; + FT_UInt has_head = 0, has_sing = 0, has_meta = 0; + FT_ULong offset = sfnt->offset + 12; + + static const FT_Frame_Field table_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG( Tag ), + FT_FRAME_ULONG( CheckSum ), + FT_FRAME_ULONG( Offset ), + FT_FRAME_ULONG( Length ), + FT_FRAME_END + }; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + for ( nn = 0; nn < sfnt->num_tables; nn++ ) + { + TT_TableRec table; + + + if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) + { + FT_TRACE2(( "check_table_dir:" + " can read only %hu table%s in font (instead of %hu)\n", + nn, nn == 1 ? "" : "s", sfnt->num_tables )); + sfnt->num_tables = nn; + break; + } + + /* we ignore invalid tables */ + + if ( table.Offset > stream->size ) + { + FT_TRACE2(( "check_table_dir: table entry %hu invalid\n", nn )); + continue; + } + else if ( table.Length > stream->size - table.Offset ) + { + /* Some tables have such a simple structure that clipping its */ + /* contents is harmless. This also makes FreeType less sensitive */ + /* to invalid table lengths (which programs like Acroread seem to */ + /* ignore in general). */ + + if ( table.Tag == TTAG_hmtx || + table.Tag == TTAG_vmtx ) + valid_entries++; + else + { + FT_TRACE2(( "check_table_dir: table entry %hu invalid\n", nn )); + continue; + } + } + else + valid_entries++; + + if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) + { + FT_UInt32 magic; + + +#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + if ( table.Tag == TTAG_head ) +#endif + has_head = 1; + + /* + * The table length should be 0x36, but certain font tools make it + * 0x38, so we will just check that it is greater. + * + * Note that according to the specification, the table must be + * padded to 32-bit lengths, but this doesn't apply to the value of + * its `Length' field! + * + */ + if ( table.Length < 0x36 ) + { + FT_TRACE2(( "check_table_dir:" + " `head' or `bhed' table too small\n" )); + error = FT_THROW( Table_Missing ); + goto Exit; + } + + if ( FT_STREAM_SEEK( table.Offset + 12 ) || + FT_READ_ULONG( magic ) ) + goto Exit; + + if ( magic != 0x5F0F3CF5UL ) + FT_TRACE2(( "check_table_dir:" + " invalid magic number in `head' or `bhed' table\n")); + + if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) + goto Exit; + } + else if ( table.Tag == TTAG_SING ) + has_sing = 1; + else if ( table.Tag == TTAG_META ) + has_meta = 1; + } + + *valid = valid_entries; + + if ( !valid_entries ) + { + FT_TRACE2(( "check_table_dir: no valid tables found\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* if `sing' and `meta' tables are present, there is no `head' table */ + if ( has_head || ( has_sing && has_meta ) ) + { + error = FT_Err_Ok; + goto Exit; + } + else + { + FT_TRACE2(( "check_table_dir:" )); +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); +#else + FT_TRACE2(( " neither `head' nor `sing' table found\n" )); +#endif + error = FT_THROW( Table_Missing ); + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_font_dir + * + * @Description: + * Loads the header of a SFNT font file. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @Output: + * sfnt :: + * The SFNT header. + * + * @Return: + * FreeType error code. 0 means success. + * + * @Note: + * The stream cursor must be at the beginning of the font directory. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ) + { + SFNT_HeaderRec sfnt; + FT_Error error; + FT_Memory memory = stream->memory; + FT_UShort nn, valid_entries = 0; + + static const FT_Frame_Field offset_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE SFNT_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( search_range ), + FT_FRAME_USHORT( entry_selector ), + FT_FRAME_USHORT( range_shift ), + FT_FRAME_END + }; + + + FT_TRACE2(( "tt_face_load_font_dir: %p\n", (void *)face )); + + /* read the offset table */ + + sfnt.offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( sfnt.format_tag ) || + FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) + goto Exit; + + /* many fonts don't have these fields set correctly */ +#if 0 + if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || + sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) + return FT_THROW( Unknown_File_Format ); +#endif + + /* load the table directory */ + + FT_TRACE2(( "-- Number of tables: %10hu\n", sfnt.num_tables )); + FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); + + if ( sfnt.format_tag != TTAG_OTTO ) + { + /* check first */ + error = check_table_dir( &sfnt, stream, &valid_entries ); + if ( error ) + { + FT_TRACE2(( "tt_face_load_font_dir:" + " invalid table directory for TrueType\n" )); + goto Exit; + } + } + else + { + valid_entries = sfnt.num_tables; + if ( !valid_entries ) + { + FT_TRACE2(( "tt_face_load_font_dir: no valid tables found\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + } + + face->num_tables = valid_entries; + face->format_tag = sfnt.format_tag; + + if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) + goto Exit; + + if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || + FT_FRAME_ENTER( sfnt.num_tables * 16L ) ) + goto Exit; + + FT_TRACE2(( "\n" )); + FT_TRACE2(( " tag offset length checksum\n" )); + FT_TRACE2(( " ----------------------------------\n" )); + + valid_entries = 0; + for ( nn = 0; nn < sfnt.num_tables; nn++ ) + { + TT_TableRec entry; + FT_UShort i; + FT_Bool duplicate; + + + entry.Tag = FT_GET_TAG4(); + entry.CheckSum = FT_GET_ULONG(); + entry.Offset = FT_GET_ULONG(); + entry.Length = FT_GET_ULONG(); + + /* ignore invalid tables that can't be sanitized */ + + if ( entry.Offset > stream->size ) + continue; + else if ( entry.Length > stream->size - entry.Offset ) + { + if ( entry.Tag == TTAG_hmtx || + entry.Tag == TTAG_vmtx ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_ULong old_length = entry.Length; +#endif + + + /* make metrics table length a multiple of 4 */ + entry.Length = ( stream->size - entry.Offset ) & ~3U; + + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx" + " (sanitized; original length %08lx)", + (FT_Char)( entry.Tag >> 24 ), + (FT_Char)( entry.Tag >> 16 ), + (FT_Char)( entry.Tag >> 8 ), + (FT_Char)( entry.Tag ), + entry.Offset, + entry.Length, + entry.CheckSum, + old_length )); + } + else + continue; + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx", + (FT_Char)( entry.Tag >> 24 ), + (FT_Char)( entry.Tag >> 16 ), + (FT_Char)( entry.Tag >> 8 ), + (FT_Char)( entry.Tag ), + entry.Offset, + entry.Length, + entry.CheckSum )); +#endif + + /* ignore duplicate tables – the first one wins */ + duplicate = 0; + for ( i = 0; i < valid_entries; i++ ) + { + if ( face->dir_tables[i].Tag == entry.Tag ) + { + duplicate = 1; + break; + } + } + if ( duplicate ) + { + FT_TRACE2(( " (duplicate, ignored)\n" )); + continue; + } + else + { + FT_TRACE2(( "\n" )); + + /* we finally have a valid entry */ + face->dir_tables[valid_entries++] = entry; + } + } + + /* final adjustment to number of tables */ + face->num_tables = valid_entries; + + FT_FRAME_EXIT(); + + if ( !valid_entries ) + { + FT_TRACE2(( "tt_face_load_font_dir: no valid tables found\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + FT_TRACE2(( "table directory loaded\n" )); + FT_TRACE2(( "\n" )); + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_any + * + * @Description: + * Loads any font table into client memory. + * + * @Input: + * face :: + * The face object to look for. + * + * tag :: + * The tag of table to load. Use the value 0 if you want + * to access the whole font file, else set this parameter + * to a valid TrueType table tag that you can forge with + * the MAKE_TT_TAG macro. + * + * offset :: + * The starting offset in the table (or the file if + * tag == 0). + * + * length :: + * The address of the decision variable: + * + * If length == NULL: + * Loads the whole table. Returns an error if + * `offset' == 0! + * + * If *length == 0: + * Exits immediately; returning the length of the given + * table or of the font file, depending on the value of + * `tag'. + * + * If *length != 0: + * Loads the next `length' bytes of table or font, + * starting at offset `offset' (in table or font too). + * + * @Output: + * buffer :: + * The address of target buffer. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Error error; + FT_Stream stream; + TT_Table table; + FT_ULong size; + + + if ( tag != 0 ) + { + /* look for tag in font directory */ + table = tt_face_lookup_table( face, tag ); + if ( !table ) + { + error = FT_THROW( Table_Missing ); + goto Exit; + } + + offset += table->Offset; + size = table->Length; + } + else + /* tag == 0 -- the user wants to access the font file directly */ + size = face->root.stream->size; + + if ( length && *length == 0 ) + { + *length = size; + + return FT_Err_Ok; + } + + if ( length ) + size = *length; + + stream = face->root.stream; + /* the `if' is syntactic sugar for picky compilers */ + if ( FT_STREAM_READ_AT( offset, buffer, size ) ) + goto Exit; + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_generic_header + * + * @Description: + * Loads the TrueType table `head' or `bhed'. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + static FT_Error + tt_face_load_generic_header( TT_Face face, + FT_Stream stream, + FT_ULong tag ) + { + FT_Error error; + TT_Header* header; + + static const FT_Frame_Field header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Header + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Table_Version ), + FT_FRAME_ULONG ( Font_Revision ), + FT_FRAME_LONG ( CheckSum_Adjust ), + FT_FRAME_LONG ( Magic_Number ), + FT_FRAME_USHORT( Flags ), + FT_FRAME_USHORT( Units_Per_EM ), + FT_FRAME_ULONG ( Created[0] ), + FT_FRAME_ULONG ( Created[1] ), + FT_FRAME_ULONG ( Modified[0] ), + FT_FRAME_ULONG ( Modified[1] ), + FT_FRAME_SHORT ( xMin ), + FT_FRAME_SHORT ( yMin ), + FT_FRAME_SHORT ( xMax ), + FT_FRAME_SHORT ( yMax ), + FT_FRAME_USHORT( Mac_Style ), + FT_FRAME_USHORT( Lowest_Rec_PPEM ), + FT_FRAME_SHORT ( Font_Direction ), + FT_FRAME_SHORT ( Index_To_Loc_Format ), + FT_FRAME_SHORT ( Glyph_Data_Format ), + FT_FRAME_END + }; + + + error = face->goto_table( face, tag, stream, 0 ); + if ( error ) + goto Exit; + + header = &face->header; + + if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) + goto Exit; + + FT_TRACE3(( "Units per EM: %4hu\n", header->Units_Per_EM )); + FT_TRACE3(( "IndexToLoc: %4hd\n", header->Index_To_Loc_Format )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_head ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_bhed ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /************************************************************************** + * + * @Function: + * tt_face_load_maxp + * + * @Description: + * Loads the maximum profile into a face object. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_MaxProfile* maxProfile = &face->max_profile; + + static const FT_Frame_Field maxp_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_MaxProfile + + FT_FRAME_START( 6 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( numGlyphs ), + FT_FRAME_END + }; + + static const FT_Frame_Field maxp_fields_extra[] = + { + FT_FRAME_START( 26 ), + FT_FRAME_USHORT( maxPoints ), + FT_FRAME_USHORT( maxContours ), + FT_FRAME_USHORT( maxCompositePoints ), + FT_FRAME_USHORT( maxCompositeContours ), + FT_FRAME_USHORT( maxZones ), + FT_FRAME_USHORT( maxTwilightPoints ), + FT_FRAME_USHORT( maxStorage ), + FT_FRAME_USHORT( maxFunctionDefs ), + FT_FRAME_USHORT( maxInstructionDefs ), + FT_FRAME_USHORT( maxStackElements ), + FT_FRAME_USHORT( maxSizeOfInstructions ), + FT_FRAME_USHORT( maxComponentElements ), + FT_FRAME_USHORT( maxComponentDepth ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_maxp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) + goto Exit; + + maxProfile->maxPoints = 0; + maxProfile->maxContours = 0; + maxProfile->maxCompositePoints = 0; + maxProfile->maxCompositeContours = 0; + maxProfile->maxZones = 0; + maxProfile->maxTwilightPoints = 0; + maxProfile->maxStorage = 0; + maxProfile->maxFunctionDefs = 0; + maxProfile->maxInstructionDefs = 0; + maxProfile->maxStackElements = 0; + maxProfile->maxSizeOfInstructions = 0; + maxProfile->maxComponentElements = 0; + maxProfile->maxComponentDepth = 0; + + if ( maxProfile->version >= 0x10000L ) + { + if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) + goto Exit; + + /* XXX: an adjustment that is necessary to load certain */ + /* broken fonts like `Keystrokes MT' :-( */ + /* */ + /* We allocate 64 function entries by default when */ + /* the maxFunctionDefs value is smaller. */ + + if ( maxProfile->maxFunctionDefs < 64 ) + maxProfile->maxFunctionDefs = 64; + + /* we add 4 phantom points later */ + if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) + { + FT_TRACE0(( "tt_face_load_maxp:" + " too much twilight points in `maxp' table;\n" )); + FT_TRACE0(( " " + " some glyphs might be rendered incorrectly\n" )); + + maxProfile->maxTwilightPoints = 0xFFFFU - 4; + } + } + + FT_TRACE3(( "numGlyphs: %hu\n", maxProfile->numGlyphs )); + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_name + * + * @Description: + * Loads the name records. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_pos, table_len; + FT_ULong storage_start, storage_limit; + TT_NameTable table; + TT_Name names = NULL; + TT_LangTag langTags = NULL; + + static const FT_Frame_Field name_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameTableRec + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( numNameRecords ), + FT_FRAME_USHORT( storageOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field name_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( platformID ), + FT_FRAME_USHORT( encodingID ), + FT_FRAME_USHORT( languageID ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field langTag_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_LangTagRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + + table = &face->name_table; + table->stream = stream; + + error = face->goto_table( face, TTAG_name, stream, &table_len ); + if ( error ) + goto Exit; + + table_pos = FT_STREAM_POS(); + + if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) + goto Exit; + + /* Some popular Asian fonts have an invalid `storageOffset' value (it */ + /* should be at least `6 + 12*numNameRecords'). However, the string */ + /* offsets, computed as `storageOffset + entry->stringOffset', are */ + /* valid pointers within the name table... */ + /* */ + /* We thus can't check `storageOffset' right now. */ + /* */ + storage_start = table_pos + 6 + 12 * table->numNameRecords; + storage_limit = table_pos + table_len; + + if ( storage_start > storage_limit ) + { + FT_ERROR(( "tt_face_load_name: invalid `name' table\n" )); + error = FT_THROW( Name_Table_Missing ); + goto Exit; + } + + /* `name' format 1 contains additional language tag records, */ + /* which we load first */ + if ( table->format == 1 ) + { + if ( FT_STREAM_SEEK( storage_start ) || + FT_READ_USHORT( table->numLangTagRecords ) ) + goto Exit; + + storage_start += 2 + 4 * table->numLangTagRecords; + + /* allocate language tag records array */ + if ( FT_QNEW_ARRAY( langTags, table->numLangTagRecords ) || + FT_FRAME_ENTER( table->numLangTagRecords * 4 ) ) + goto Exit; + + /* load language tags */ + { + TT_LangTag entry = langTags; + TT_LangTag limit = FT_OFFSET( entry, table->numLangTagRecords ); + + + for ( ; entry < limit; entry++ ) + { + (void)FT_STREAM_READ_FIELDS( langTag_record_fields, entry ); + + /* check that the langTag string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry; ignore it */ + entry->stringLength = 0; + } + + /* mark the string as not yet loaded */ + entry->string = NULL; + } + + table->langTags = langTags; + langTags = NULL; + } + + FT_FRAME_EXIT(); + + (void)FT_STREAM_SEEK( table_pos + 6 ); + } + + /* allocate name records array */ + if ( FT_QNEW_ARRAY( names, table->numNameRecords ) || + FT_FRAME_ENTER( table->numNameRecords * 12 ) ) + goto Exit; + + /* load name records */ + { + TT_Name entry = names; + FT_UInt count = table->numNameRecords; + FT_UInt valid = 0; + + + for ( ; count > 0; count-- ) + { + if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) + continue; + + /* check that the name is not empty */ + if ( entry->stringLength == 0 ) + continue; + + /* check that the name string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry; ignore it */ + continue; + } + + /* assure that we have a valid language tag ID, and */ + /* that the corresponding langTag entry is valid, too */ + if ( table->format == 1 && entry->languageID >= 0x8000U ) + { + if ( entry->languageID - 0x8000U >= table->numLangTagRecords || + !table->langTags[entry->languageID - 0x8000U].stringLength ) + { + /* invalid entry; ignore it */ + continue; + } + } + + /* mark the string as not yet converted */ + entry->string = NULL; + + valid++; + entry++; + } + + /* reduce array size to the actually used elements */ + FT_MEM_QRENEW_ARRAY( names, + table->numNameRecords, + valid ); + table->names = names; + names = NULL; + table->numNameRecords = valid; + } + + FT_FRAME_EXIT(); + + /* everything went well, update face->num_names */ + face->num_names = (FT_UShort)table->numNameRecords; + + Exit: + FT_FREE( names ); + FT_FREE( langTags ); + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_free_name + * + * @Description: + * Frees the name records. + * + * @Input: + * face :: + * A handle to the target face object. + */ + FT_LOCAL_DEF( void ) + tt_face_free_name( TT_Face face ) + { + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable table = &face->name_table; + + + if ( table->names ) + { + TT_Name entry = table->names; + TT_Name limit = entry + table->numNameRecords; + + + for ( ; entry < limit; entry++ ) + FT_FREE( entry->string ); + + FT_FREE( table->names ); + } + + if ( table->langTags ) + { + TT_LangTag entry = table->langTags; + TT_LangTag limit = entry + table->numLangTagRecords; + + + for ( ; entry < limit; entry++ ) + FT_FREE( entry->string ); + + FT_FREE( table->langTags ); + } + + table->numNameRecords = 0; + table->numLangTagRecords = 0; + table->format = 0; + table->storageOffset = 0; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_cmap + * + * @Description: + * Loads the cmap directory in a face object. The cmaps themselves + * are loaded on demand in the `ttcmap.c' module. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + + + error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); + if ( error ) + goto Exit; + + if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) + face->cmap_size = 0; + + Exit: + return error; + } + + + + /************************************************************************** + * + * @Function: + * tt_face_load_os2 + * + * @Description: + * Loads the OS2 table. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_OS2* os2; + + static const FT_Frame_Field os2_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_OS2 + + FT_FRAME_START( 78 ), + FT_FRAME_USHORT( version ), + FT_FRAME_SHORT ( xAvgCharWidth ), + FT_FRAME_USHORT( usWeightClass ), + FT_FRAME_USHORT( usWidthClass ), + FT_FRAME_SHORT ( fsType ), + FT_FRAME_SHORT ( ySubscriptXSize ), + FT_FRAME_SHORT ( ySubscriptYSize ), + FT_FRAME_SHORT ( ySubscriptXOffset ), + FT_FRAME_SHORT ( ySubscriptYOffset ), + FT_FRAME_SHORT ( ySuperscriptXSize ), + FT_FRAME_SHORT ( ySuperscriptYSize ), + FT_FRAME_SHORT ( ySuperscriptXOffset ), + FT_FRAME_SHORT ( ySuperscriptYOffset ), + FT_FRAME_SHORT ( yStrikeoutSize ), + FT_FRAME_SHORT ( yStrikeoutPosition ), + FT_FRAME_SHORT ( sFamilyClass ), + FT_FRAME_BYTE ( panose[0] ), + FT_FRAME_BYTE ( panose[1] ), + FT_FRAME_BYTE ( panose[2] ), + FT_FRAME_BYTE ( panose[3] ), + FT_FRAME_BYTE ( panose[4] ), + FT_FRAME_BYTE ( panose[5] ), + FT_FRAME_BYTE ( panose[6] ), + FT_FRAME_BYTE ( panose[7] ), + FT_FRAME_BYTE ( panose[8] ), + FT_FRAME_BYTE ( panose[9] ), + FT_FRAME_ULONG ( ulUnicodeRange1 ), + FT_FRAME_ULONG ( ulUnicodeRange2 ), + FT_FRAME_ULONG ( ulUnicodeRange3 ), + FT_FRAME_ULONG ( ulUnicodeRange4 ), + FT_FRAME_BYTE ( achVendID[0] ), + FT_FRAME_BYTE ( achVendID[1] ), + FT_FRAME_BYTE ( achVendID[2] ), + FT_FRAME_BYTE ( achVendID[3] ), + + FT_FRAME_USHORT( fsSelection ), + FT_FRAME_USHORT( usFirstCharIndex ), + FT_FRAME_USHORT( usLastCharIndex ), + FT_FRAME_SHORT ( sTypoAscender ), + FT_FRAME_SHORT ( sTypoDescender ), + FT_FRAME_SHORT ( sTypoLineGap ), + FT_FRAME_USHORT( usWinAscent ), + FT_FRAME_USHORT( usWinDescent ), + FT_FRAME_END + }; + + /* `OS/2' version 1 and newer */ + static const FT_Frame_Field os2_fields_extra1[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_ULONG( ulCodePageRange1 ), + FT_FRAME_ULONG( ulCodePageRange2 ), + FT_FRAME_END + }; + + /* `OS/2' version 2 and newer */ + static const FT_Frame_Field os2_fields_extra2[] = + { + FT_FRAME_START( 10 ), + FT_FRAME_SHORT ( sxHeight ), + FT_FRAME_SHORT ( sCapHeight ), + FT_FRAME_USHORT( usDefaultChar ), + FT_FRAME_USHORT( usBreakChar ), + FT_FRAME_USHORT( usMaxContext ), + FT_FRAME_END + }; + + /* `OS/2' version 5 and newer */ + static const FT_Frame_Field os2_fields_extra5[] = + { + FT_FRAME_START( 4 ), + FT_FRAME_USHORT( usLowerOpticalPointSize ), + FT_FRAME_USHORT( usUpperOpticalPointSize ), + FT_FRAME_END + }; + + + /* We now support old Mac fonts where the OS/2 table doesn't */ + /* exist. Simply put, we set the `version' field to 0xFFFF */ + /* and test this value each time we need to access the table. */ + error = face->goto_table( face, TTAG_OS2, stream, 0 ); + if ( error ) + goto Exit; + + os2 = &face->os2; + + if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) + goto Exit; + + os2->ulCodePageRange1 = 0; + os2->ulCodePageRange2 = 0; + os2->sxHeight = 0; + os2->sCapHeight = 0; + os2->usDefaultChar = 0; + os2->usBreakChar = 0; + os2->usMaxContext = 0; + os2->usLowerOpticalPointSize = 0; + os2->usUpperOpticalPointSize = 0xFFFF; + + if ( os2->version >= 0x0001 ) + { + /* only version 1 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra1, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0002 ) + { + /* only version 2 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0005 ) + { + /* only version 5 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra5, os2 ) ) + goto Exit; + } + } + } + + FT_TRACE3(( "sTypoAscender: %4hd\n", os2->sTypoAscender )); + FT_TRACE3(( "sTypoDescender: %4hd\n", os2->sTypoDescender )); + FT_TRACE3(( "usWinAscent: %4hu\n", os2->usWinAscent )); + FT_TRACE3(( "usWinDescent: %4hu\n", os2->usWinDescent )); + FT_TRACE3(( "fsSelection: 0x%2hx\n", os2->fsSelection )); + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_postscript + * + * @Description: + * Loads the Postscript table. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_Postscript* post = &face->postscript; + + static const FT_Frame_Field post_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Postscript + + FT_FRAME_START( 32 ), + FT_FRAME_LONG ( FormatType ), + FT_FRAME_LONG ( italicAngle ), + FT_FRAME_SHORT( underlinePosition ), + FT_FRAME_SHORT( underlineThickness ), + FT_FRAME_ULONG( isFixedPitch ), + FT_FRAME_ULONG( minMemType42 ), + FT_FRAME_ULONG( maxMemType42 ), + FT_FRAME_ULONG( minMemType1 ), + FT_FRAME_ULONG( maxMemType1 ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + return error; + + if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) + return error; + + if ( post->FormatType != 0x00030000L && + post->FormatType != 0x00025000L && + post->FormatType != 0x00020000L && + post->FormatType != 0x00010000L ) + return FT_THROW( Invalid_Post_Table_Format ); + + /* we don't load the glyph names, we do that in another */ + /* module (ttpost). */ + + FT_TRACE3(( "FormatType: 0x%lx\n", post->FormatType )); + FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch + ? " yes" : " no" )); + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_pclt + * + * @Description: + * Loads the PCL 5 Table. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ) + { + static const FT_Frame_Field pclt_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_PCLT + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_ULONG ( FontNumber ), + FT_FRAME_USHORT( Pitch ), + FT_FRAME_USHORT( xHeight ), + FT_FRAME_USHORT( Style ), + FT_FRAME_USHORT( TypeFamily ), + FT_FRAME_USHORT( CapHeight ), + FT_FRAME_USHORT( SymbolSet ), + FT_FRAME_BYTES ( TypeFace, 16 ), + FT_FRAME_BYTES ( CharacterComplement, 8 ), + FT_FRAME_BYTES ( FileName, 6 ), + FT_FRAME_CHAR ( StrokeWeight ), + FT_FRAME_CHAR ( WidthType ), + FT_FRAME_BYTE ( SerifStyle ), + FT_FRAME_BYTE ( Reserved ), + FT_FRAME_END + }; + + FT_Error error; + TT_PCLT* pclt = &face->pclt; + + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) + goto Exit; + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_gasp + * + * @Description: + * Loads the `gasp' table into a face object. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UShort j, num_ranges; + TT_GaspRange gasp_ranges = NULL; + + + /* the gasp table is optional */ + error = face->goto_table( face, TTAG_gasp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_FRAME_ENTER( 4L ) ) + goto Exit; + + face->gasp.version = FT_GET_USHORT(); + num_ranges = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + + /* only support versions 0 and 1 of the table */ + if ( face->gasp.version >= 2 ) + { + face->gasp.numRanges = 0; + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE3(( "numRanges: %hu\n", num_ranges )); + + if ( FT_QNEW_ARRAY( gasp_ranges, num_ranges ) || + FT_FRAME_ENTER( num_ranges * 4L ) ) + goto Exit; + + for ( j = 0; j < num_ranges; j++ ) + { + gasp_ranges[j].maxPPEM = FT_GET_USHORT(); + gasp_ranges[j].gaspFlag = FT_GET_USHORT(); + + FT_TRACE3(( "gaspRange %hu: rangeMaxPPEM %5hu, rangeGaspBehavior 0x%hx\n", + j, + gasp_ranges[j].maxPPEM, + gasp_ranges[j].gaspFlag )); + } + + face->gasp.gaspRanges = gasp_ranges; + gasp_ranges = NULL; + face->gasp.numRanges = num_ranges; + + FT_FRAME_EXIT(); + + Exit: + FT_FREE( gasp_ranges ); + return error; + } + + +/* END */ diff --git a/external/freetype/src/sfnt/ttload.h b/external/freetype/src/sfnt/ttload.h new file mode 100644 index 000000000..1499dd573 --- /dev/null +++ b/external/freetype/src/sfnt/ttload.h @@ -0,0 +1,111 @@ +/**************************************************************************** + * + * ttload.h + * + * Load the basic TrueType tables, i.e., tables that can be either in + * TTF or OTF fonts (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTLOAD_H_ +#define TTLOAD_H_ + + +#include <freetype/internal/ftstream.h> +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ); + + FT_LOCAL( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_name( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +FT_END_HEADER + +#endif /* TTLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttmtx.c b/external/freetype/src/sfnt/ttmtx.c new file mode 100644 index 000000000..38ee9ae72 --- /dev/null +++ b/external/freetype/src/sfnt/ttmtx.c @@ -0,0 +1,338 @@ +/**************************************************************************** + * + * ttmtx.c + * + * Load the metrics tables common to TTF and OTF fonts (body). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/internal/services/svmetric.h> +#endif + +#include "ttmtx.h" + +#include "sferrors.h" + + + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields, */ + /* which are different. */ + /* */ + /* This ensures that `tt_face_load_hmtx' is able to read */ + /* both the horizontal and vertical headers. */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttmtx + + + /************************************************************************** + * + * @Function: + * tt_face_load_hmtx + * + * @Description: + * Load the `hmtx' or `vmtx' table into a face object. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * vertical :: + * A boolean flag. If set, load `vmtx'. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_ULong tag, table_size; + FT_ULong* ptable_offset; + FT_ULong* ptable_size; + + + if ( vertical ) + { + tag = TTAG_vmtx; + ptable_offset = &face->vert_metrics_offset; + ptable_size = &face->vert_metrics_size; + } + else + { + tag = TTAG_hmtx; + ptable_offset = &face->horz_metrics_offset; + ptable_size = &face->horz_metrics_size; + } + + error = face->goto_table( face, tag, stream, &table_size ); + if ( error ) + goto Fail; + + *ptable_size = table_size; + *ptable_offset = FT_STREAM_POS(); + + Fail: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_hhea + * + * @Description: + * Load the `hhea' or 'vhea' table into a face object. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * The input stream. + * + * vertical :: + * A boolean flag. If set, load `vhea'. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + TT_HoriHeader* header; + + static const FT_Frame_Field metrics_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_HoriHeader + + FT_FRAME_START( 36 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_SHORT ( Ascender ), + FT_FRAME_SHORT ( Descender ), + FT_FRAME_SHORT ( Line_Gap ), + FT_FRAME_USHORT( advance_Width_Max ), + FT_FRAME_SHORT ( min_Left_Side_Bearing ), + FT_FRAME_SHORT ( min_Right_Side_Bearing ), + FT_FRAME_SHORT ( xMax_Extent ), + FT_FRAME_SHORT ( caret_Slope_Rise ), + FT_FRAME_SHORT ( caret_Slope_Run ), + FT_FRAME_SHORT ( caret_Offset ), + FT_FRAME_SHORT ( Reserved[0] ), + FT_FRAME_SHORT ( Reserved[1] ), + FT_FRAME_SHORT ( Reserved[2] ), + FT_FRAME_SHORT ( Reserved[3] ), + FT_FRAME_SHORT ( metric_Data_Format ), + FT_FRAME_USHORT( number_Of_HMetrics ), + FT_FRAME_END + }; + + + if ( vertical ) + { + void *v = &face->vertical; + + + error = face->goto_table( face, TTAG_vhea, stream, 0 ); + if ( error ) + goto Fail; + + header = (TT_HoriHeader*)v; + } + else + { + error = face->goto_table( face, TTAG_hhea, stream, 0 ); + if ( error ) + goto Fail; + + header = &face->horizontal; + } + + if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) + goto Fail; + + FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); + FT_TRACE3(( "Descender: %5d\n", header->Descender )); + FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); + + header->long_metrics = NULL; + header->short_metrics = NULL; + + Fail: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_face_get_metrics + * + * @Description: + * Return the horizontal or vertical metrics in font units for a + * given glyph. The values are the left side bearing (top side + * bearing for vertical metrics) and advance width (advance height + * for vertical metrics). + * + * @Input: + * face :: + * A pointer to the TrueType face structure. + * + * vertical :: + * If set to TRUE, get vertical metrics. + * + * gindex :: + * The glyph index. + * + * @Output: + * abearing :: + * The bearing, either left side or top side. + * + * aadvance :: + * The advance width or advance height, depending on + * the `vertical' flag. + */ + FT_LOCAL_DEF( void ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short *abearing, + FT_UShort *aadvance ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + TT_HoriHeader* header; + FT_ULong table_pos, table_size, table_end; + FT_UShort k; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_MetricsVariations var = + (FT_Service_MetricsVariations)face->tt_var; +#endif + + + if ( vertical ) + { + void* v = &face->vertical; + + + header = (TT_HoriHeader*)v; + table_pos = face->vert_metrics_offset; + table_size = face->vert_metrics_size; + } + else + { + header = &face->horizontal; + table_pos = face->horz_metrics_offset; + table_size = face->horz_metrics_size; + } + + table_end = table_pos + table_size; + + k = header->number_Of_HMetrics; + + if ( k > 0 ) + { + if ( gindex < (FT_UInt)k ) + { + table_pos += 4 * gindex; + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) || + FT_READ_SHORT( *abearing ) ) + goto NoData; + } + else + { + table_pos += 4 * ( k - 1 ); + if ( table_pos + 2 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) ) + goto NoData; + + table_pos += 4 + 2 * ( gindex - k ); + if ( table_pos + 2 > table_end ) + *abearing = 0; + else + { + if ( FT_STREAM_SEEK( table_pos ) ) + *abearing = 0; + else + (void)FT_READ_SHORT( *abearing ); + } + } + } + else + { + NoData: + *abearing = 0; + *aadvance = 0; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( var && face->blend ) + { + FT_Face f = FT_FACE( face ); + FT_Int a = (FT_Int)*aadvance; + FT_Int b = (FT_Int)*abearing; + + + if ( vertical ) + { + if ( var->vadvance_adjust ) + var->vadvance_adjust( f, gindex, &a ); + if ( var->tsb_adjust ) + var->tsb_adjust( f, gindex, &b ); + } + else + { + if ( var->hadvance_adjust ) + var->hadvance_adjust( f, gindex, &a ); + if ( var->lsb_adjust ) + var->lsb_adjust( f, gindex, &b ); + } + + *aadvance = (FT_UShort)a; + *abearing = (FT_Short)b; + } +#endif + } + + +/* END */ diff --git a/external/freetype/src/sfnt/ttmtx.h b/external/freetype/src/sfnt/ttmtx.h new file mode 100644 index 000000000..56d2b6276 --- /dev/null +++ b/external/freetype/src/sfnt/ttmtx.h @@ -0,0 +1,54 @@ +/**************************************************************************** + * + * ttmtx.h + * + * Load the metrics tables common to TTF and OTF fonts (specification). + * + * Copyright (C) 2006-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTMTX_H_ +#define TTMTX_H_ + + +#include <freetype/internal/ftstream.h> +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( void ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + +FT_END_HEADER + +#endif /* TTMTX_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttpost.c b/external/freetype/src/sfnt/ttpost.c new file mode 100644 index 000000000..1dfad4298 --- /dev/null +++ b/external/freetype/src/sfnt/ttpost.c @@ -0,0 +1,484 @@ +/**************************************************************************** + * + * ttpost.c + * + * PostScript name table processing for TrueType and OpenType fonts + * (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * The post table is not completely loaded by the core engine. This + * file loads the missing PS glyph names and implements an API to access + * them. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + +#include "ttpost.h" + +#include "sferrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttpost + + + /* If this configuration macro is defined, we rely on the `psnames' */ + /* module to grab the glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#include <freetype/internal/services/svpscmap.h> + +#define MAC_NAME( x ) (FT_String*)psnames->macintosh_name( (FT_UInt)(x) ) + + +#else /* !FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* Otherwise, we ignore the `psnames' module, and provide our own */ + /* table of Mac names. Thus, it is possible to build a version of */ + /* FreeType without the Type 1 driver & psnames module. */ + +#define MAC_NAME( x ) (FT_String*)tt_post_default_names[x] + + /* the 258 default Mac PS glyph names; see file `tools/glnames.py' */ + + static const FT_String* const tt_post_default_names[258] = + { + /* 0 */ + ".notdef", ".null", "nonmarkingreturn", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + /* 10 */ + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + /* 20 */ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + /* 30 */ + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + /* 40 */ + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + /* 50 */ + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + /* 60 */ + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + /* 70 */ + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + /* 80 */ + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + /* 90 */ + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + /* 100 */ + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + /* 110 */ + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + /* 120 */ + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + /* 130 */ + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + /* 140 */ + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + /* 150 */ + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + /* 160 */ + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + /* 170 */ + "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + /* 180 */ + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + /* 190 */ + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + /* 200 */ + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + /* 210 */ + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + /* 220 */ + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + /* 230 */ + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + /* 240 */ + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + /* 250 */ + "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dcroat", + }; + + +#endif /* !FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + static FT_Error + load_format_20( TT_Post_Names names, + FT_Stream stream, + FT_UShort num_glyphs, + FT_ULong post_len ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_UShort n; + FT_UShort num_names = 0; + + FT_UShort* glyph_indices = NULL; + FT_Byte** name_strings = NULL; + FT_Byte* q; + + + if ( (FT_ULong)num_glyphs * 2 > post_len ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* load the indices and note their maximum */ + if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * 2 ) ) + goto Fail; + + q = (FT_Byte*)stream->cursor; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_UShort idx = FT_NEXT_USHORT( q ); + + + if ( idx > num_names ) + num_names = idx; + + glyph_indices[n] = idx; + } + + FT_FRAME_EXIT(); + + /* compute number of names stored in the table */ + num_names = num_names > 257 ? num_names - 257 : 0; + + /* now load the name strings */ + if ( num_names ) + { + FT_ULong p; + FT_Byte* strings; + + + post_len -= (FT_ULong)num_glyphs * 2; + + if ( FT_QALLOC( name_strings, num_names * sizeof ( FT_Byte* ) + + post_len + 1 ) ) + goto Fail; + + strings = (FT_Byte*)( name_strings + num_names ); + if ( FT_STREAM_READ( strings, post_len ) ) + goto Fail; + + /* convert from Pascal- to C-strings and set pointers */ + for ( p = 0, n = 0; p < post_len && n < num_names; n++ ) + { + FT_UInt len = strings[p]; + + + if ( len > 63U ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + strings[p] = 0; + name_strings[n] = strings + p + 1; + p += len + 1; + } + strings[post_len] = 0; + + /* deal with missing or insufficient string data */ + if ( n < num_names ) + { + FT_TRACE4(( "load_format_20: %hu PostScript names are truncated\n", + num_names - n )); + + for ( ; n < num_names; n++ ) + name_strings[n] = strings + post_len; + } + } + + /* all right, set table fields and exit successfully */ + names->num_glyphs = num_glyphs; + names->num_names = num_names; + names->glyph_indices = glyph_indices; + names->glyph_names = name_strings; + + return FT_Err_Ok; + + Fail: + FT_FREE( name_strings ); + FT_FREE( glyph_indices ); + + Exit: + return error; + } + + + static FT_Error + load_format_25( TT_Post_Names names, + FT_Stream stream, + FT_UShort num_glyphs, + FT_ULong post_len ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_UShort n; + FT_UShort* glyph_indices = NULL; + FT_Byte* q; + + + /* check the number of glyphs, including the theoretical limit */ + if ( num_glyphs > post_len || + num_glyphs > 258 + 128 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* load the indices and check their Mac range */ + if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs ) ) + goto Fail; + + q = (FT_Byte*)stream->cursor; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Int idx = n + FT_NEXT_CHAR( q ); + + + if ( idx < 0 || idx > 257 ) + idx = 0; + + glyph_indices[n] = (FT_UShort)idx; + } + + FT_FRAME_EXIT(); + + /* OK, set table fields and exit successfully */ + names->num_glyphs = num_glyphs; + names->glyph_indices = glyph_indices; + + return FT_Err_Ok; + + Fail: + FT_FREE( glyph_indices ); + + Exit: + return error; + } + + + static FT_Error + load_post_names( TT_Face face ) + { + FT_Error error = FT_Err_Ok; + FT_Stream stream = face->root.stream; + FT_Fixed format = face->postscript.FormatType; + FT_ULong post_len; + FT_UShort num_glyphs; + + + /* seek to the beginning of the PS names table */ + error = face->goto_table( face, TTAG_post, stream, &post_len ); + if ( error ) + goto Exit; + + /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ + /* than the value in the maxp table (cf. cyberbit.ttf). */ + if ( post_len < 34 || + FT_STREAM_SKIP( 32 ) || + FT_READ_USHORT( num_glyphs ) || + num_glyphs > face->max_profile.numGlyphs || + num_glyphs == 0 ) + goto Exit; + + /* now read postscript names data */ + if ( format == 0x00020000L ) + error = load_format_20( &face->postscript_names, stream, + num_glyphs, post_len - 34 ); + else if ( format == 0x00025000L ) + error = load_format_25( &face->postscript_names, stream, + num_glyphs, post_len - 34 ); + + Exit: + face->postscript_names.loaded = 1; /* even if failed */ + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_ps_names( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_Post_Names names = &face->postscript_names; + + + if ( names->num_glyphs ) + { + FT_FREE( names->glyph_indices ); + names->num_glyphs = 0; + } + + if ( names->num_names ) + { + FT_FREE( names->glyph_names ); + names->num_names = 0; + } + + names->loaded = 0; + } + + + /************************************************************************** + * + * @Function: + * tt_face_get_ps_name + * + * @Description: + * Get the PostScript glyph name of a glyph. + * + * @Input: + * face :: + * A handle to the parent face. + * + * idx :: + * The glyph index. + * + * @InOut: + * PSname :: + * The address of a string pointer. Undefined in case of + * error, otherwise it is a pointer to the glyph name. + * + * You must not modify the returned string! + * + * @Output: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ) + { + FT_Error error; + FT_Fixed format; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Service_PsCMaps psnames; +#endif + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) + return FT_THROW( Invalid_Glyph_Index ); + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (FT_Service_PsCMaps)face->psnames; + if ( !psnames ) + return FT_THROW( Unimplemented_Feature ); +#endif + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + format = face->postscript.FormatType; + + if ( format == 0x00010000L ) + { + if ( idx < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( idx ); + } + else if ( format == 0x00020000L || + format == 0x00025000L ) + { + TT_Post_Names names = &face->postscript_names; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)names->num_glyphs ) + { + FT_UShort name_index = names->glyph_indices[idx]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else /* only for version 2.0 */ + *PSname = (FT_String*)names->glyph_names[name_index - 258]; + } + } + + /* nothing to do for format == 0x00030000L */ + + End: + /* post format errors ignored */ + return FT_Err_Ok; + } + +#else /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_post_dummy_; + +#endif /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttpost.h b/external/freetype/src/sfnt/ttpost.h new file mode 100644 index 000000000..528f1c5f2 --- /dev/null +++ b/external/freetype/src/sfnt/ttpost.h @@ -0,0 +1,46 @@ +/**************************************************************************** + * + * ttpost.h + * + * PostScript name table processing for TrueType and OpenType fonts + * (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTPOST_H_ +#define TTPOST_H_ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + FT_LOCAL( void ) + tt_face_free_ps_names( TT_Face face ); + + +FT_END_HEADER + +#endif /* TTPOST_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttsbit.c b/external/freetype/src/sfnt/ttsbit.c new file mode 100644 index 000000000..03f90a628 --- /dev/null +++ b/external/freetype/src/sfnt/ttsbit.c @@ -0,0 +1,1685 @@ +/**************************************************************************** + * + * ttsbit.c + * + * TrueType and OpenType embedded bitmap support (body). + * + * Copyright (C) 2005-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * Copyright 2013 by Google, Inc. + * Google Author(s): Behdad Esfahbod. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include <freetype/ftbitmap.h> + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + +#include "ttsbit.h" + +#include "sferrors.h" + +#include "ttmtx.h" +#include "pngshim.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttsbit + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_sbit( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_ULong table_start; + + + face->sbit_table = NULL; + face->sbit_table_size = 0; + face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; + face->sbit_num_strikes = 0; + + error = face->goto_table( face, TTAG_CBLC, stream, &table_size ); + if ( !error ) + face->sbit_table_type = TT_SBIT_TABLE_TYPE_CBLC; + else + { + error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, &table_size ); + if ( !error ) + face->sbit_table_type = TT_SBIT_TABLE_TYPE_EBLC; + } + + if ( error ) + { + error = face->goto_table( face, TTAG_sbix, stream, &table_size ); + if ( !error ) + face->sbit_table_type = TT_SBIT_TABLE_TYPE_SBIX; + } + if ( error ) + goto Exit; + + if ( table_size < 8 ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + table_start = FT_STREAM_POS(); + + switch ( (FT_UInt)face->sbit_table_type ) + { + case TT_SBIT_TABLE_TYPE_EBLC: + case TT_SBIT_TABLE_TYPE_CBLC: + { + FT_Byte* p; + FT_Fixed version; + FT_ULong num_strikes; + FT_UInt count; + + + if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_table_size = table_size; + + p = face->sbit_table; + + version = FT_NEXT_LONG( p ); + num_strikes = FT_NEXT_ULONG( p ); + + /* there's at least one font (FZShuSong-Z01, version 3) */ + /* that uses the wrong byte order for the `version' field */ + if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL && + ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000200UL && + ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00030000UL && + ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000300UL ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( num_strikes >= 0x10000UL ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 48UL * count > table_size ) + count = (FT_UInt)( ( table_size - 8 ) / 48 ); + + face->sbit_num_strikes = count; + } + break; + + case TT_SBIT_TABLE_TYPE_SBIX: + { + FT_UShort version; + FT_UShort flags; + FT_ULong num_strikes; + FT_UInt count; + + + if ( FT_FRAME_ENTER( 8 ) ) + goto Exit; + + version = FT_GET_USHORT(); + flags = FT_GET_USHORT(); + num_strikes = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + if ( version < 1 ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* Bit 0 must always be `1'. */ + /* Bit 1 controls the overlay of bitmaps with outlines. */ + /* All other bits should be zero. */ + if ( !( flags == 1 || flags == 3 ) || + num_strikes >= 0x10000UL ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( flags == 3 ) + face->root.face_flags |= FT_FACE_FLAG_SBIX_OVERLAY; + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 4UL * count > table_size ) + count = (FT_UInt)( ( table_size - 8 ) / 4 ); + + if ( FT_STREAM_SEEK( FT_STREAM_POS() - 8 ) ) + goto Exit; + + face->sbit_table_size = 8 + count * 4; + if ( FT_FRAME_EXTRACT( face->sbit_table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_num_strikes = count; + } + break; + + default: + /* we ignore unknown table formats */ + error = FT_THROW( Unknown_File_Format ); + break; + } + + if ( !error ) + FT_TRACE3(( "tt_face_load_sbit_strikes: found %u strikes\n", + face->sbit_num_strikes )); + + face->ebdt_start = 0; + face->ebdt_size = 0; + + if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ) + { + /* the `sbix' table is self-contained; */ + /* it has no associated data table */ + face->ebdt_start = table_start; + face->ebdt_size = table_size; + } + else if ( face->sbit_table_type != TT_SBIT_TABLE_TYPE_NONE ) + { + FT_ULong ebdt_size; + + + error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); + + if ( !error ) + { + face->ebdt_start = FT_STREAM_POS(); + face->ebdt_size = ebdt_size; + } + } + + if ( !face->ebdt_size ) + { + FT_TRACE2(( "tt_face_load_sbit_strikes:" + " no embedded bitmap data table found;\n" )); + FT_TRACE2(( " " + " resetting number of strikes to zero\n" )); + face->sbit_num_strikes = 0; + } + + return FT_Err_Ok; + + Exit: + if ( error ) + { + if ( face->sbit_table ) + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; + } + + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_sbit( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; + face->sbit_num_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + /* we have to test for the existence of `sbit_strike_map' */ + /* because the function gets also used at the very beginning */ + /* to construct `sbit_strike_map' itself */ + if ( face->sbit_strike_map ) + { + if ( strike_index >= (FT_ULong)face->root.num_fixed_sizes ) + return FT_THROW( Invalid_Argument ); + + /* map to real index */ + strike_index = face->sbit_strike_map[strike_index]; + } + else + { + if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) + return FT_THROW( Invalid_Argument ); + } + + switch ( (FT_UInt)face->sbit_table_type ) + { + case TT_SBIT_TABLE_TYPE_EBLC: + case TT_SBIT_TABLE_TYPE_CBLC: + { + FT_Byte* strike; + FT_Char max_before_bl; + FT_Char min_after_bl; + + + strike = face->sbit_table + 8 + strike_index * 48; + + metrics->x_ppem = (FT_UShort)strike[44]; + metrics->y_ppem = (FT_UShort)strike[45]; + + metrics->ascender = (FT_Char)strike[16] * 64; /* hori.ascender */ + metrics->descender = (FT_Char)strike[17] * 64; /* hori.descender */ + + /* Due to fuzzy wording in the EBLC documentation, we find both */ + /* positive and negative values for `descender'. Additionally, */ + /* many fonts have both `ascender' and `descender' set to zero */ + /* (which is definitely wrong). MS Windows simply ignores all */ + /* those values... For these reasons we apply some heuristics */ + /* to get a reasonable, non-zero value for the height. */ + + max_before_bl = (FT_Char)strike[24]; + min_after_bl = (FT_Char)strike[25]; + + if ( metrics->descender > 0 ) + { + /* compare sign of descender with `min_after_bl' */ + if ( min_after_bl < 0 ) + metrics->descender = -metrics->descender; + } + + else if ( metrics->descender == 0 ) + { + if ( metrics->ascender == 0 ) + { + FT_TRACE2(( "tt_face_load_strike_metrics:" + " sanitizing invalid ascender and descender\n" )); + FT_TRACE2(( " " + " values for strike %ld (%dppem, %dppem)\n", + strike_index, + metrics->x_ppem, metrics->y_ppem )); + + /* sanitize buggy ascender and descender values */ + if ( max_before_bl || min_after_bl ) + { + metrics->ascender = max_before_bl * 64; + metrics->descender = min_after_bl * 64; + } + else + { + metrics->ascender = metrics->y_ppem * 64; + metrics->descender = 0; + } + } + } + +#if 0 + else + ; /* if we have a negative descender, simply use it */ +#endif + + metrics->height = metrics->ascender - metrics->descender; + if ( metrics->height == 0 ) + { + FT_TRACE2(( "tt_face_load_strike_metrics:" + " sanitizing invalid height value\n" )); + FT_TRACE2(( " " + " for strike (%d, %d)\n", + metrics->x_ppem, metrics->y_ppem )); + metrics->height = metrics->y_ppem * 64; + metrics->descender = metrics->ascender - metrics->height; + } + + /* Is this correct? */ + metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ + strike[18] + /* max_width */ + (FT_Char)strike[23] /* min_advance_SB */ + ) * 64; + + /* set the scale values (in 16.16 units) so advances */ + /* from the hmtx and vmtx table are scaled correctly */ + metrics->x_scale = FT_DivFix( metrics->x_ppem * 64, + face->header.Units_Per_EM ); + metrics->y_scale = FT_DivFix( metrics->y_ppem * 64, + face->header.Units_Per_EM ); + + return FT_Err_Ok; + } + + case TT_SBIT_TABLE_TYPE_SBIX: + { + FT_Stream stream = face->root.stream; + FT_UInt offset; + FT_UShort ppem, resolution; + TT_HoriHeader *hori; + FT_Fixed scale; + + FT_Error error; + FT_Byte* p; + + + p = face->sbit_table + 8 + 4 * strike_index; + offset = FT_NEXT_ULONG( p ); + + if ( offset + 4 > face->ebdt_size ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_STREAM_SEEK( face->ebdt_start + offset ) || + FT_FRAME_ENTER( 4 ) ) + return error; + + ppem = FT_GET_USHORT(); + resolution = FT_GET_USHORT(); + + FT_UNUSED( resolution ); /* What to do with this? */ + + FT_FRAME_EXIT(); + + metrics->x_ppem = ppem; + metrics->y_ppem = ppem; + + scale = FT_DivFix( ppem * 64, face->header.Units_Per_EM ); + hori = &face->horizontal; + + metrics->ascender = FT_MulFix( hori->Ascender, scale ); + metrics->descender = FT_MulFix( hori->Descender, scale ); + metrics->height = + FT_MulFix( hori->Ascender - hori->Descender + hori->Line_Gap, + scale ); + metrics->max_advance = FT_MulFix( hori->advance_Width_Max, scale ); + + /* set the scale values (in 16.16 units) so advances */ + /* from the hmtx and vmtx table are scaled correctly */ + metrics->x_scale = scale; + metrics->y_scale = scale; + + return error; + } + + default: + return FT_THROW( Unknown_File_Format ); + } + } + + + typedef struct TT_SBitDecoderRec_ + { + TT_Face face; + FT_Stream stream; + FT_Bitmap* bitmap; + TT_SBit_Metrics metrics; + FT_Bool metrics_loaded; + FT_Bool bitmap_allocated; + FT_Byte bit_depth; + + FT_ULong ebdt_start; + FT_ULong ebdt_size; + + FT_ULong strike_index_array; + FT_ULong strike_index_count; + FT_Byte* eblc_base; + FT_Byte* eblc_limit; + + } TT_SBitDecoderRec, *TT_SBitDecoder; + + + static FT_Error + tt_sbit_decoder_init( TT_SBitDecoder decoder, + TT_Face face, + FT_ULong strike_index, + TT_SBit_MetricsRec* metrics ) + { + FT_Error error = FT_ERR( Table_Missing ); + FT_Stream stream = face->root.stream; + + + strike_index = face->sbit_strike_map[strike_index]; + + if ( !face->ebdt_size ) + goto Exit; + if ( FT_STREAM_SEEK( face->ebdt_start ) ) + goto Exit; + + decoder->face = face; + decoder->stream = stream; + decoder->bitmap = &face->root.glyph->bitmap; + decoder->metrics = metrics; + + decoder->metrics_loaded = 0; + decoder->bitmap_allocated = 0; + + decoder->ebdt_start = face->ebdt_start; + decoder->ebdt_size = face->ebdt_size; + + decoder->eblc_base = face->sbit_table; + decoder->eblc_limit = face->sbit_table + face->sbit_table_size; + + /* now find the strike corresponding to the index */ + { + FT_Byte* p; + + + if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + p = decoder->eblc_base + 8 + 48 * strike_index; + + decoder->strike_index_array = FT_NEXT_ULONG( p ); + p += 4; + decoder->strike_index_count = FT_NEXT_ULONG( p ); + p += 34; + decoder->bit_depth = *p; + + /* decoder->strike_index_array + */ + /* 8 * decoder->strike_index_count > face->sbit_table_size ? */ + if ( decoder->strike_index_array > face->sbit_table_size || + decoder->strike_index_count > + ( face->sbit_table_size - decoder->strike_index_array ) / 8 ) + error = FT_THROW( Invalid_File_Format ); + } + + Exit: + return error; + } + + + static void + tt_sbit_decoder_done( TT_SBitDecoder decoder ) + { + FT_UNUSED( decoder ); + } + + + static FT_Error + tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder, + FT_Bool metrics_only ) + { + FT_Error error = FT_Err_Ok; + FT_UInt width, height; + FT_Bitmap* map = decoder->bitmap; + FT_ULong size; + + + if ( !decoder->metrics_loaded ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + width = decoder->metrics->width; + height = decoder->metrics->height; + + map->width = width; + map->rows = height; + + switch ( decoder->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = (int)( ( map->width + 7 ) >> 3 ); + map->num_grays = 2; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = (int)( ( map->width + 3 ) >> 2 ); + map->num_grays = 4; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = (int)( ( map->width + 1 ) >> 1 ); + map->num_grays = 16; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = (int)( map->width ); + map->num_grays = 256; + break; + + case 32: + map->pixel_mode = FT_PIXEL_MODE_BGRA; + map->pitch = (int)( map->width * 4 ); + map->num_grays = 256; + break; + + default: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + size = map->rows * (FT_ULong)map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + if ( metrics_only ) + goto Exit; /* only metrics are requested */ + + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); + if ( error ) + goto Exit; + + decoder->bitmap_allocated = 1; + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, + FT_Byte* *pp, + FT_Byte* limit, + FT_Bool big ) + { + FT_Byte* p = *pp; + TT_SBit_Metrics metrics = decoder->metrics; + + + if ( p + 5 > limit ) + goto Fail; + + metrics->height = p[0]; + metrics->width = p[1]; + metrics->horiBearingX = (FT_Char)p[2]; + metrics->horiBearingY = (FT_Char)p[3]; + metrics->horiAdvance = p[4]; + + p += 5; + if ( big ) + { + if ( p + 3 > limit ) + goto Fail; + + metrics->vertBearingX = (FT_Char)p[0]; + metrics->vertBearingY = (FT_Char)p[1]; + metrics->vertAdvance = p[2]; + + p += 3; + } + else + { + /* avoid uninitialized data in case there is no vertical info -- */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + } + + decoder->metrics_loaded = 1; + *pp = p; + return FT_Err_Ok; + + Fail: + FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table\n" )); + return FT_THROW( Invalid_Argument ); + } + + + /* forward declaration */ + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count, + FT_Bool metrics_only ); + + typedef FT_Error (*TT_SBitDecoder_LoadFunc)( + TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* plimit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ); + + + static FT_Error + tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* line; + FT_Int pitch, width, height, line_bits, h; + FT_UInt bit_height, bit_width; + FT_Bitmap* bitmap; + + FT_UNUSED( recurse_count ); + + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + if ( !line ) + goto Exit; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + line_bits = width * decoder->bit_depth; + + if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width || + y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height ) + { + FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:" + " invalid bitmap dimensions\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit ) + { + FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + if ( x_pos == 0 ) /* the easy one */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* pwrite = line; + FT_Int w; + + + for ( w = line_bits; w >= 8; w -= 8 ) + { + pwrite[0] = (FT_Byte)( pwrite[0] | *p++ ); + pwrite += 1; + } + + if ( w > 0 ) + pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) ); + } + } + else /* x_pos > 0 */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* pwrite = line; + FT_Int w; + FT_UInt wval = 0; + + + for ( w = line_bits; w >= 8; w -= 8 ) + { + wval = (FT_UInt)( wval | *p++ ); + pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); + pwrite += 1; + wval <<= 8; + } + + if ( w > 0 ) + wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); + + /* all bits read and there are `x_pos + w' bits to be written */ + + pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); + + if ( x_pos + w > 8 ) + { + pwrite++; + wval <<= 8; + pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); + } + } + } + + Exit: + if ( !error ) + FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" )); + return error; + } + + + /* + * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap + * (with pointer `pwrite'). In the example below, the width is 3 pixel, + * and `x_pos' is 1 pixel. + * + * p p+1 + * | | | + * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |... + * | | | + * +-------+ +-------+ +-------+ ... + * . . . + * . . . + * v . . + * +-------+ . . + * | | . + * | 7 6 5 4 3 2 1 0 | . + * | | . + * pwrite . . + * . . + * v . + * +-------+ . + * | | + * | 7 6 5 4 3 2 1 0 | + * | | + * pwrite+1 . + * . + * v + * +-------+ + * | | + * | 7 6 5 4 3 2 1 0 | + * | | + * pwrite+2 + * + */ + + static FT_Error + tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* line; + FT_Int pitch, width, height, line_bits, h, nbits; + FT_UInt bit_height, bit_width; + FT_Bitmap* bitmap; + FT_UShort rval; + + FT_UNUSED( recurse_count ); + + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + line_bits = width * decoder->bit_depth; + + if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width || + y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height ) + { + FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:" + " invalid bitmap dimensions\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit ) + { + FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( !line_bits || !height ) + { + /* nothing to do */ + goto Exit; + } + + /* now do the blit */ + + /* adjust `line' to point to the first byte of the bitmap */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + /* the higher byte of `rval' is used as a buffer */ + rval = 0; + nbits = 0; + + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* pwrite = line; + FT_Int w = line_bits; + + + /* handle initial byte (in target bitmap) specially if necessary */ + if ( x_pos ) + { + w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos; + + if ( h == height ) + { + rval = *p++; + nbits = x_pos; + } + else if ( nbits < w ) + { + if ( p < limit ) + rval |= *p++; + nbits += 8 - w; + } + else + { + rval >>= 8; + nbits -= w; + } + + *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) & + ( ~( 0xFFU << w ) << ( 8 - w - x_pos ) ); + rval <<= 8; + + w = line_bits - w; + } + + /* handle medial bytes */ + for ( ; w >= 8; w -= 8 ) + { + rval |= *p++; + *pwrite++ |= ( rval >> nbits ) & 0xFF; + + rval <<= 8; + } + + /* handle final byte if necessary */ + if ( w > 0 ) + { + if ( nbits < w ) + { + if ( p < limit ) + rval |= *p++; + *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits += 8 - w; + + rval <<= 8; + } + else + { + *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits -= w; + } + } + } + + Exit: + if ( !error ) + FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" )); + return error; + } + + + static FT_Error + tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_components, nn; + + FT_Char horiBearingX = (FT_Char)decoder->metrics->horiBearingX; + FT_Char horiBearingY = (FT_Char)decoder->metrics->horiBearingY; + FT_Byte horiAdvance = (FT_Byte)decoder->metrics->horiAdvance; + FT_Char vertBearingX = (FT_Char)decoder->metrics->vertBearingX; + FT_Char vertBearingY = (FT_Char)decoder->metrics->vertBearingY; + FT_Byte vertAdvance = (FT_Byte)decoder->metrics->vertAdvance; + + + if ( p + 2 > limit ) + goto Fail; + + num_components = FT_NEXT_USHORT( p ); + if ( p + 4 * num_components > limit ) + { + FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" )); + goto Fail; + } + + FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d component%s\n", + num_components, + num_components == 1 ? "" : "s" )); + + for ( nn = 0; nn < num_components; nn++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + FT_Char dx = FT_NEXT_CHAR( p ); + FT_Char dy = FT_NEXT_CHAR( p ); + + + /* NB: a recursive call */ + error = tt_sbit_decoder_load_image( decoder, + gindex, + x_pos + dx, + y_pos + dy, + recurse_count + 1, + /* request full bitmap image */ + FALSE ); + if ( error ) + break; + } + + FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" )); + + decoder->metrics->horiBearingX = horiBearingX; + decoder->metrics->horiBearingY = horiBearingY; + decoder->metrics->horiAdvance = horiAdvance; + decoder->metrics->vertBearingX = vertBearingX; + decoder->metrics->vertBearingY = vertBearingY; + decoder->metrics->vertAdvance = vertAdvance; + decoder->metrics->width = (FT_Byte)decoder->bitmap->width; + decoder->metrics->height = (FT_Byte)decoder->bitmap->rows; + + Exit: + return error; + + Fail: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + +#ifdef FT_CONFIG_OPTION_USE_PNG + + static FT_Error + tt_sbit_decoder_load_png( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong png_len; + + FT_UNUSED( recurse_count ); + + + if ( limit - p < 4 ) + { + FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + png_len = FT_NEXT_ULONG( p ); + if ( (FT_ULong)( limit - p ) < png_len ) + { + FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + error = Load_SBit_Png( decoder->face->root.glyph, + x_pos, + y_pos, + decoder->bit_depth, + decoder->metrics, + decoder->stream->memory, + p, + png_len, + FALSE, + FALSE ); + + Exit: + if ( !error ) + FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" )); + return error; + } + +#endif /* FT_CONFIG_OPTION_USE_PNG */ + + + static FT_Error + tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, + FT_UInt glyph_format, + FT_ULong glyph_start, + FT_ULong glyph_size, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count, + FT_Bool metrics_only ) + { + FT_Error error; + FT_Stream stream = decoder->stream; + FT_Byte* p; + FT_Byte* p_limit; + FT_Byte* data; + + + /* seek into the EBDT table now */ + if ( !glyph_size || + glyph_start + glyph_size > decoder->ebdt_size ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || + FT_FRAME_EXTRACT( glyph_size, data ) ) + goto Exit; + + p = data; + p_limit = p + glyph_size; + + /* read the data, depending on the glyph format */ + switch ( glyph_format ) + { + case 1: + case 2: + case 8: + case 17: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); + break; + + case 6: + case 7: + case 9: + case 18: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); + break; + + default: + error = FT_Err_Ok; + } + + if ( error ) + goto Fail; + + { + TT_SBitDecoder_LoadFunc loader; + + + switch ( glyph_format ) + { + case 1: + case 6: + loader = tt_sbit_decoder_load_byte_aligned; + break; + + case 2: + case 7: + { + /* Don't trust `glyph_format'. For example, Apple's main Korean */ + /* system font, `AppleMyungJo.ttf' (version 7.0d2e6), uses glyph */ + /* format 7, but the data is format 6. We check whether we have */ + /* an excessive number of bytes in the image: If it is equal to */ + /* the value for a byte-aligned glyph, use the other loading */ + /* routine. */ + /* */ + /* Note that for some (width,height) combinations, where the */ + /* width is not a multiple of 8, the sizes for bit- and */ + /* byte-aligned data are equal, for example (7,7) or (15,6). We */ + /* then prefer what `glyph_format' specifies. */ + + FT_UInt width = decoder->metrics->width; + FT_UInt height = decoder->metrics->height; + + FT_UInt bit_size = ( width * height + 7 ) >> 3; + FT_UInt byte_size = height * ( ( width + 7 ) >> 3 ); + + + if ( bit_size < byte_size && + byte_size == (FT_UInt)( p_limit - p ) ) + loader = tt_sbit_decoder_load_byte_aligned; + else + loader = tt_sbit_decoder_load_bit_aligned; + } + break; + + case 5: + loader = tt_sbit_decoder_load_bit_aligned; + break; + + case 8: + if ( p + 1 > p_limit ) + goto Fail; + + p += 1; /* skip padding */ + FALL_THROUGH; + + case 9: + loader = tt_sbit_decoder_load_compound; + break; + + case 17: /* small metrics, PNG image data */ + case 18: /* big metrics, PNG image data */ + case 19: /* metrics in EBLC, PNG image data */ +#ifdef FT_CONFIG_OPTION_USE_PNG + loader = tt_sbit_decoder_load_png; + break; +#else + error = FT_THROW( Unimplemented_Feature ); + goto Fail; +#endif /* FT_CONFIG_OPTION_USE_PNG */ + + default: + error = FT_THROW( Invalid_Table ); + goto Fail; + } + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder, metrics_only ); + + if ( error ) + goto Fail; + } + + if ( metrics_only ) + goto Fail; /* this is not an error */ + + error = loader( decoder, p, p_limit, x_pos, y_pos, recurse_count ); + } + + Fail: + FT_FRAME_RELEASE( data ); + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count, + FT_Bool metrics_only ) + { + FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; + FT_Byte* p_limit = decoder->eblc_limit; + FT_ULong num_ranges = decoder->strike_index_count; + FT_UInt start, end, index_format, image_format; + FT_ULong image_start = 0, image_end = 0, image_offset; + + + /* arbitrary recursion limit */ + if ( recurse_count > 100 ) + { + FT_TRACE4(( "tt_sbit_decoder_load_image:" + " recursion depth exceeded\n" )); + goto Failure; + } + + + /* First, we find the correct strike range that applies to this */ + /* glyph index. */ + for ( ; num_ranges > 0; num_ranges-- ) + { + start = FT_NEXT_USHORT( p ); + end = FT_NEXT_USHORT( p ); + + if ( glyph_index >= start && glyph_index <= end ) + goto FoundRange; + + p += 4; /* ignore index offset */ + } + goto NoBitmap; + + FoundRange: + image_offset = FT_NEXT_ULONG( p ); + + /* overflow check */ + p = decoder->eblc_base + decoder->strike_index_array; + if ( image_offset > (FT_ULong)( p_limit - p ) ) + goto Failure; + + p += image_offset; + if ( p + 8 > p_limit ) + goto NoBitmap; + + /* now find the glyph's location and extend within the ebdt table */ + index_format = FT_NEXT_USHORT( p ); + image_format = FT_NEXT_USHORT( p ); + image_offset = FT_NEXT_ULONG ( p ); + + switch ( index_format ) + { + case 1: /* 4-byte offsets relative to `image_offset' */ + p += 4 * ( glyph_index - start ); + if ( p + 8 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_ULONG( p ); + image_end = FT_NEXT_ULONG( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + break; + + case 2: /* big metrics, constant image size */ + { + FT_ULong image_size; + + + if ( p + 12 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + image_start = image_size * ( glyph_index - start ); + image_end = image_start + image_size; + } + break; + + case 3: /* 2-byte offsets relative to 'image_offset' */ + p += 2 * ( glyph_index - start ); + if ( p + 4 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_USHORT( p ); + image_end = FT_NEXT_USHORT( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + break; + + case 4: /* sparse glyph array with (glyph,offset) pairs */ + { + FT_ULong mm, num_glyphs; + + + if ( p + 4 > p_limit ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check for p + ( num_glyphs + 1 ) * 4 */ + if ( p + 4 > p_limit || + num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + { + image_start = FT_NEXT_USHORT( p ); + p += 2; + image_end = FT_PEEK_USHORT( p ); + break; + } + p += 2; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + } + break; + + case 5: /* constant metrics with sparse glyph codes */ + case 19: + { + FT_ULong image_size, mm, num_glyphs; + + + if ( p + 16 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check for p + 2 * num_glyphs */ + if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + break; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + + image_start = image_size * mm; + image_end = image_start + image_size; + } + break; + + default: + goto NoBitmap; + } + + if ( image_start > image_end ) + goto NoBitmap; + + image_end -= image_start; + image_start = image_offset + image_start; + + FT_TRACE3(( "tt_sbit_decoder_load_image:" + " found sbit (format %d) for glyph index %d\n", + image_format, glyph_index )); + + return tt_sbit_decoder_load_bitmap( decoder, + image_format, + image_start, + image_end, + x_pos, + y_pos, + recurse_count, + metrics_only ); + + Failure: + return FT_THROW( Invalid_Table ); + + NoBitmap: + if ( recurse_count ) + { + FT_TRACE4(( "tt_sbit_decoder_load_image:" + " missing subglyph sbit with glyph index %d\n", + glyph_index )); + return FT_THROW( Invalid_Composite ); + } + + FT_TRACE4(( "tt_sbit_decoder_load_image:" + " no sbit found for glyph index %d\n", glyph_index )); + return FT_THROW( Missing_Bitmap ); + } + + + static FT_Error + tt_face_load_sbix_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics, + FT_Bool metrics_only ) + { + FT_UInt strike_offset, glyph_start, glyph_end; + FT_Int originOffsetX, originOffsetY; + FT_Tag graphicType; + FT_Int recurse_depth = 0; + + FT_Error error; + FT_Byte* p; + + FT_UNUSED( map ); +#ifndef FT_CONFIG_OPTION_USE_PNG + FT_UNUSED( metrics_only ); +#endif + + + strike_index = face->sbit_strike_map[strike_index]; + + metrics->width = 0; + metrics->height = 0; + + p = face->sbit_table + 8 + 4 * strike_index; + strike_offset = FT_NEXT_ULONG( p ); + + retry: + if ( glyph_index > (FT_UInt)face->root.num_glyphs ) + return FT_THROW( Invalid_Argument ); + + if ( strike_offset >= face->ebdt_size || + face->ebdt_size - strike_offset < 4 + glyph_index * 4 + 8 ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_STREAM_SEEK( face->ebdt_start + + strike_offset + 4 + + glyph_index * 4 ) || + FT_FRAME_ENTER( 8 ) ) + return error; + + glyph_start = FT_GET_ULONG(); + glyph_end = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + if ( glyph_start == glyph_end ) + return FT_THROW( Missing_Bitmap ); + if ( glyph_start > glyph_end || + glyph_end - glyph_start < 8 || + face->ebdt_size - strike_offset < glyph_end ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_STREAM_SEEK( face->ebdt_start + strike_offset + glyph_start ) || + FT_FRAME_ENTER( glyph_end - glyph_start ) ) + return error; + + originOffsetX = FT_GET_SHORT(); + originOffsetY = FT_GET_SHORT(); + + graphicType = FT_GET_TAG4(); + + switch ( graphicType ) + { + case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ): + if ( recurse_depth < 4 ) + { + glyph_index = FT_GET_USHORT(); + FT_FRAME_EXIT(); + recurse_depth++; + goto retry; + } + error = FT_THROW( Invalid_File_Format ); + break; + + case FT_MAKE_TAG( 'p', 'n', 'g', ' ' ): +#ifdef FT_CONFIG_OPTION_USE_PNG + error = Load_SBit_Png( face->root.glyph, + 0, + 0, + 32, + metrics, + stream->memory, + stream->cursor, + glyph_end - glyph_start - 8, + TRUE, + metrics_only ); +#else + error = FT_THROW( Unimplemented_Feature ); +#endif + break; + + case FT_MAKE_TAG( 'j', 'p', 'g', ' ' ): + case FT_MAKE_TAG( 't', 'i', 'f', 'f' ): + case FT_MAKE_TAG( 'r', 'g', 'b', 'l' ): /* used on iOS 7.1 */ + error = FT_THROW( Unknown_File_Format ); + break; + + default: + error = FT_THROW( Unimplemented_Feature ); + break; + } + + FT_FRAME_EXIT(); + + if ( !error ) + { + FT_Short abearing; /* not used here */ + FT_UShort aadvance; + + + tt_face_get_metrics( face, FALSE, glyph_index, &abearing, &aadvance ); + + metrics->horiBearingX = (FT_Short)originOffsetX; + metrics->vertBearingX = (FT_Short)originOffsetX; + + metrics->horiBearingY = (FT_Short)( originOffsetY + metrics->height ); + metrics->vertBearingY = (FT_Short)originOffsetY; + + metrics->horiAdvance = (FT_UShort)( aadvance * + face->root.size->metrics.x_ppem / + face->header.Units_Per_EM ); + + if ( face->vertical_info ) + tt_face_get_metrics( face, TRUE, glyph_index, &abearing, &aadvance ); + else if ( face->os2.version != 0xFFFFU ) + aadvance = (FT_UShort)FT_ABS( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + aadvance = (FT_UShort)FT_ABS( face->horizontal.Ascender - + face->horizontal.Descender ); + + metrics->vertAdvance = (FT_UShort)( aadvance * + face->root.size->metrics.x_ppem / + face->header.Units_Per_EM ); + } + + return error; + } + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + FT_Error error = FT_Err_Ok; + + + switch ( (FT_UInt)face->sbit_table_type ) + { + case TT_SBIT_TABLE_TYPE_EBLC: + case TT_SBIT_TABLE_TYPE_CBLC: + { + TT_SBitDecoderRec decoder[1]; + + + error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); + if ( !error ) + { + error = tt_sbit_decoder_load_image( + decoder, + glyph_index, + 0, + 0, + 0, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); + tt_sbit_decoder_done( decoder ); + } + } + break; + + case TT_SBIT_TABLE_TYPE_SBIX: + error = tt_face_load_sbix_image( + face, + strike_index, + glyph_index, + stream, + map, + metrics, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); + break; + + default: + error = FT_THROW( Unknown_File_Format ); + break; + } + + /* Flatten color bitmaps if color was not requested. */ + if ( !error && + !( load_flags & FT_LOAD_COLOR ) && + !( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) && + map->pixel_mode == FT_PIXEL_MODE_BGRA ) + { + FT_Bitmap new_map; + FT_Library library = face->root.glyph->library; + + + FT_Bitmap_Init( &new_map ); + + /* Convert to 8bit grayscale. */ + error = FT_Bitmap_Convert( library, map, &new_map, 1 ); + if ( error ) + FT_Bitmap_Done( library, &new_map ); + else + { + map->pixel_mode = new_map.pixel_mode; + map->pitch = new_map.pitch; + map->num_grays = new_map.num_grays; + + ft_glyphslot_set_bitmap( face->root.glyph, new_map.buffer ); + face->root.glyph->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + } + + return error; + } + +#else /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_sbit_dummy_; + +#endif /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttsbit.h b/external/freetype/src/sfnt/ttsbit.h new file mode 100644 index 000000000..07e2db461 --- /dev/null +++ b/external/freetype/src/sfnt/ttsbit.h @@ -0,0 +1,62 @@ +/**************************************************************************** + * + * ttsbit.h + * + * TrueType and OpenType embedded bitmap support (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTSBIT_H_ +#define TTSBIT_H_ + + +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_sbit( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_sbit( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + FT_LOCAL( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ); + + +FT_END_HEADER + +#endif /* TTSBIT_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttsvg.c b/external/freetype/src/sfnt/ttsvg.c new file mode 100644 index 000000000..4461d483b --- /dev/null +++ b/external/freetype/src/sfnt/ttsvg.c @@ -0,0 +1,413 @@ +/**************************************************************************** + * + * ttsvg.c + * + * OpenType SVG Color (specification). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * 'SVG' table specification: + * + * https://docs.microsoft.com/en-us/typography/opentype/spec/svg + * + */ + +#include <ft2build.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/tttags.h> +#include <freetype/ftgzip.h> +#include <freetype/otsvg.h> + + +#ifdef FT_CONFIG_OPTION_SVG + +#include "ttsvg.h" + + + /* NOTE: These table sizes are given by the specification. */ +#define SVG_TABLE_HEADER_SIZE (10U) +#define SVG_DOCUMENT_RECORD_SIZE (12U) +#define SVG_DOCUMENT_LIST_MINIMUM_SIZE (2U + SVG_DOCUMENT_RECORD_SIZE) +#define SVG_MINIMUM_SIZE (SVG_TABLE_HEADER_SIZE + \ + SVG_DOCUMENT_LIST_MINIMUM_SIZE) + + + typedef struct Svg_ + { + FT_UShort version; /* table version (starting at 0) */ + FT_UShort num_entries; /* number of SVG document records */ + + FT_Byte* svg_doc_list; /* pointer to the start of SVG Document List */ + + void* table; /* memory that backs up SVG */ + FT_ULong table_size; + + } Svg; + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, usued to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttsvg + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_svg( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = face->root.memory; + + FT_ULong table_size; + FT_Byte* table = NULL; + FT_Byte* p = NULL; + Svg* svg = NULL; + FT_ULong offsetToSVGDocumentList; + + + error = face->goto_table( face, TTAG_SVG, stream, &table_size ); + if ( error ) + goto NoSVG; + + if ( table_size < SVG_MINIMUM_SIZE ) + goto InvalidTable; + + if ( FT_FRAME_EXTRACT( table_size, table ) ) + goto NoSVG; + + /* Allocate memory for the SVG object */ + if ( FT_NEW( svg ) ) + goto NoSVG; + + p = table; + svg->version = FT_NEXT_USHORT( p ); + offsetToSVGDocumentList = FT_NEXT_ULONG( p ); + + if ( offsetToSVGDocumentList < SVG_TABLE_HEADER_SIZE || + offsetToSVGDocumentList > table_size - + SVG_DOCUMENT_LIST_MINIMUM_SIZE ) + goto InvalidTable; + + svg->svg_doc_list = (FT_Byte*)( table + offsetToSVGDocumentList ); + + p = svg->svg_doc_list; + svg->num_entries = FT_NEXT_USHORT( p ); + + FT_TRACE3(( "version: %d\n", svg->version )); + FT_TRACE3(( "number of entries: %d\n", svg->num_entries )); + + if ( offsetToSVGDocumentList + 2U + + svg->num_entries * SVG_DOCUMENT_RECORD_SIZE > table_size ) + goto InvalidTable; + + svg->table = table; + svg->table_size = table_size; + + face->svg = svg; + face->root.face_flags |= FT_FACE_FLAG_SVG; + + return FT_Err_Ok; + + InvalidTable: + error = FT_THROW( Invalid_Table ); + + NoSVG: + FT_FRAME_RELEASE( table ); + FT_FREE( svg ); + face->svg = NULL; + + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_svg( TT_Face face ) + { + FT_Memory memory = face->root.memory; + FT_Stream stream = face->root.stream; + + Svg* svg = (Svg*)face->svg; + + + if ( svg ) + { + FT_FRAME_RELEASE( svg->table ); + FT_FREE( svg ); + } + } + + + typedef struct Svg_doc_ + { + FT_UShort start_glyph_id; + FT_UShort end_glyph_id; + + FT_ULong offset; + FT_ULong length; + + } Svg_doc; + + + static Svg_doc + extract_svg_doc( FT_Byte* stream ) + { + Svg_doc doc; + + + doc.start_glyph_id = FT_NEXT_USHORT( stream ); + doc.end_glyph_id = FT_NEXT_USHORT( stream ); + + doc.offset = FT_NEXT_ULONG( stream ); + doc.length = FT_NEXT_ULONG( stream ); + + return doc; + } + + + static FT_Int + compare_svg_doc( Svg_doc doc, + FT_UInt glyph_index ) + { + if ( glyph_index < doc.start_glyph_id ) + return -1; + else if ( glyph_index > doc.end_glyph_id ) + return 1; + else + return 0; + } + + + static FT_Error + find_doc( FT_Byte* document_records, + FT_UShort num_entries, + FT_UInt glyph_index, + FT_ULong *doc_offset, + FT_ULong *doc_length, + FT_UShort *start_glyph, + FT_UShort *end_glyph ) + { + FT_Error error; + + Svg_doc start_doc; + Svg_doc mid_doc = { 0, 0, 0, 0 }; /* pacify compiler */ + Svg_doc end_doc; + + FT_Bool found = FALSE; + FT_UInt i = 0; + + FT_UInt start_index = 0; + FT_UInt end_index = num_entries - 1; + FT_Int comp_res; + + + /* search algorithm */ + if ( num_entries == 0 ) + { + error = FT_THROW( Invalid_Table ); + return error; + } + + start_doc = extract_svg_doc( document_records + start_index * 12 ); + end_doc = extract_svg_doc( document_records + end_index * 12 ); + + if ( ( compare_svg_doc( start_doc, glyph_index ) == -1 ) || + ( compare_svg_doc( end_doc, glyph_index ) == 1 ) ) + { + error = FT_THROW( Invalid_Glyph_Index ); + return error; + } + + while ( start_index <= end_index ) + { + i = ( start_index + end_index ) / 2; + mid_doc = extract_svg_doc( document_records + i * 12 ); + comp_res = compare_svg_doc( mid_doc, glyph_index ); + + if ( comp_res == 1 ) + { + start_index = i + 1; + start_doc = extract_svg_doc( document_records + start_index * 4 ); + } + else if ( comp_res == -1 ) + { + end_index = i - 1; + end_doc = extract_svg_doc( document_records + end_index * 4 ); + } + else + { + found = TRUE; + break; + } + } + /* search algorithm end */ + + if ( found != TRUE ) + { + FT_TRACE5(( "SVG glyph not found\n" )); + error = FT_THROW( Invalid_Glyph_Index ); + } + else + { + *doc_offset = mid_doc.offset; + *doc_length = mid_doc.length; + + *start_glyph = mid_doc.start_glyph_id; + *end_glyph = mid_doc.end_glyph_id; + + error = FT_Err_Ok; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_svg_doc( FT_GlyphSlot glyph, + FT_UInt glyph_index ) + { + FT_Error error = FT_Err_Ok; + TT_Face face = (TT_Face)glyph->face; + FT_Memory memory = face->root.memory; + Svg* svg = (Svg*)face->svg; + + FT_Byte* doc_list; + FT_ULong doc_limit; + + FT_Byte* doc; + FT_ULong doc_offset; + FT_ULong doc_length; + FT_UShort doc_start_glyph_id; + FT_UShort doc_end_glyph_id; + + FT_SVG_Document svg_document = (FT_SVG_Document)glyph->other; + + + FT_ASSERT( !( svg == NULL ) ); + + doc_list = svg->svg_doc_list; + + error = find_doc( doc_list + 2, svg->num_entries, glyph_index, + &doc_offset, &doc_length, + &doc_start_glyph_id, &doc_end_glyph_id ); + if ( error != FT_Err_Ok ) + goto Exit; + + doc_limit = svg->table_size - + (FT_ULong)( doc_list - (FT_Byte*)svg->table ); + if ( doc_offset > doc_limit || + doc_length > doc_limit - doc_offset ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + doc = doc_list + doc_offset; + + if ( doc_length > 6 && + doc[0] == 0x1F && + doc[1] == 0x8B && + doc[2] == 0x08 ) + { +#ifdef FT_CONFIG_OPTION_USE_ZLIB + + FT_ULong uncomp_size; + FT_Byte* uncomp_buffer = NULL; + + + /* + * Get the size of the original document. This helps in allotting the + * buffer to accommodate the uncompressed version. The last 4 bytes + * of the compressed document are equal to the original size modulo + * 2^32. Since the size of SVG documents is less than 2^32 bytes we + * can use this accurately. The four bytes are stored in + * little-endian format. + */ + FT_TRACE4(( "SVG document is GZIP compressed\n" )); + uncomp_size = (FT_ULong)doc[doc_length - 1] << 24 | + (FT_ULong)doc[doc_length - 2] << 16 | + (FT_ULong)doc[doc_length - 3] << 8 | + (FT_ULong)doc[doc_length - 4]; + + if ( FT_QALLOC( uncomp_buffer, uncomp_size ) ) + goto Exit; + + error = FT_Gzip_Uncompress( memory, + uncomp_buffer, + &uncomp_size, + doc, + doc_length ); + if ( error ) + { + FT_FREE( uncomp_buffer ); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + glyph->internal->flags |= FT_GLYPH_OWN_GZIP_SVG; + + doc = uncomp_buffer; + doc_length = uncomp_size; + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + error = FT_THROW( Unimplemented_Feature ); + goto Exit; + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + } + + svg_document->svg_document = doc; + svg_document->svg_document_length = doc_length; + + svg_document->metrics = glyph->face->size->metrics; + svg_document->units_per_EM = glyph->face->units_per_EM; + + svg_document->start_glyph_id = doc_start_glyph_id; + svg_document->end_glyph_id = doc_end_glyph_id; + + svg_document->transform.xx = 0x10000; + svg_document->transform.xy = 0; + svg_document->transform.yx = 0; + svg_document->transform.yy = 0x10000; + + svg_document->delta.x = 0; + svg_document->delta.y = 0; + + FT_TRACE5(( "start_glyph_id: %d\n", doc_start_glyph_id )); + FT_TRACE5(( "end_glyph_id: %d\n", doc_end_glyph_id )); + FT_TRACE5(( "svg_document:\n" )); + FT_TRACE5(( " %.*s\n", (FT_UInt)doc_length, doc )); + + glyph->other = svg_document; + + Exit: + return error; + } + +#else /* !FT_CONFIG_OPTION_SVG */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_svg_dummy_; + +#endif /* !FT_CONFIG_OPTION_SVG */ + + +/* END */ diff --git a/external/freetype/src/sfnt/ttsvg.h b/external/freetype/src/sfnt/ttsvg.h new file mode 100644 index 000000000..3f32321de --- /dev/null +++ b/external/freetype/src/sfnt/ttsvg.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * + * ttsvg.h + * + * OpenType SVG Color (specification). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef TTSVG_H_ +#define TTSVG_H_ + +#include <freetype/internal/ftstream.h> +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_Error ) + tt_face_load_svg( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_svg( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_svg_doc( FT_GlyphSlot glyph, + FT_UInt glyph_index ); + +FT_END_HEADER + +#endif /* TTSVG_H_ */ + + +/* END */ diff --git a/external/freetype/src/sfnt/woff2tags.c b/external/freetype/src/sfnt/woff2tags.c new file mode 100644 index 000000000..eeedd9906 --- /dev/null +++ b/external/freetype/src/sfnt/woff2tags.c @@ -0,0 +1,119 @@ +/**************************************************************************** + * + * woff2tags.c + * + * WOFF2 Font table tags (base). + * + * Copyright (C) 2019-2023 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/tttags.h> + +#ifdef FT_CONFIG_OPTION_USE_BROTLI + +#include "woff2tags.h" + + /* + * Return tag from index in the order given in WOFF2 specification. + * + * See + * + * https://www.w3.org/TR/WOFF2/#table_dir_format + * + * for details. + */ + FT_LOCAL_DEF( FT_Tag ) + woff2_known_tags( FT_Byte index ) + { + static const FT_Tag known_tags[63] = + { + FT_MAKE_TAG('c', 'm', 'a', 'p'), /* 0 */ + FT_MAKE_TAG('h', 'e', 'a', 'd'), /* 1 */ + FT_MAKE_TAG('h', 'h', 'e', 'a'), /* 2 */ + FT_MAKE_TAG('h', 'm', 't', 'x'), /* 3 */ + FT_MAKE_TAG('m', 'a', 'x', 'p'), /* 4 */ + FT_MAKE_TAG('n', 'a', 'm', 'e'), /* 5 */ + FT_MAKE_TAG('O', 'S', '/', '2'), /* 6 */ + FT_MAKE_TAG('p', 'o', 's', 't'), /* 7 */ + FT_MAKE_TAG('c', 'v', 't', ' '), /* 8 */ + FT_MAKE_TAG('f', 'p', 'g', 'm'), /* 9 */ + FT_MAKE_TAG('g', 'l', 'y', 'f'), /* 10 */ + FT_MAKE_TAG('l', 'o', 'c', 'a'), /* 11 */ + FT_MAKE_TAG('p', 'r', 'e', 'p'), /* 12 */ + FT_MAKE_TAG('C', 'F', 'F', ' '), /* 13 */ + FT_MAKE_TAG('V', 'O', 'R', 'G'), /* 14 */ + FT_MAKE_TAG('E', 'B', 'D', 'T'), /* 15 */ + FT_MAKE_TAG('E', 'B', 'L', 'C'), /* 16 */ + FT_MAKE_TAG('g', 'a', 's', 'p'), /* 17 */ + FT_MAKE_TAG('h', 'd', 'm', 'x'), /* 18 */ + FT_MAKE_TAG('k', 'e', 'r', 'n'), /* 19 */ + FT_MAKE_TAG('L', 'T', 'S', 'H'), /* 20 */ + FT_MAKE_TAG('P', 'C', 'L', 'T'), /* 21 */ + FT_MAKE_TAG('V', 'D', 'M', 'X'), /* 22 */ + FT_MAKE_TAG('v', 'h', 'e', 'a'), /* 23 */ + FT_MAKE_TAG('v', 'm', 't', 'x'), /* 24 */ + FT_MAKE_TAG('B', 'A', 'S', 'E'), /* 25 */ + FT_MAKE_TAG('G', 'D', 'E', 'F'), /* 26 */ + FT_MAKE_TAG('G', 'P', 'O', 'S'), /* 27 */ + FT_MAKE_TAG('G', 'S', 'U', 'B'), /* 28 */ + FT_MAKE_TAG('E', 'B', 'S', 'C'), /* 29 */ + FT_MAKE_TAG('J', 'S', 'T', 'F'), /* 30 */ + FT_MAKE_TAG('M', 'A', 'T', 'H'), /* 31 */ + FT_MAKE_TAG('C', 'B', 'D', 'T'), /* 32 */ + FT_MAKE_TAG('C', 'B', 'L', 'C'), /* 33 */ + FT_MAKE_TAG('C', 'O', 'L', 'R'), /* 34 */ + FT_MAKE_TAG('C', 'P', 'A', 'L'), /* 35 */ + FT_MAKE_TAG('S', 'V', 'G', ' '), /* 36 */ + FT_MAKE_TAG('s', 'b', 'i', 'x'), /* 37 */ + FT_MAKE_TAG('a', 'c', 'n', 't'), /* 38 */ + FT_MAKE_TAG('a', 'v', 'a', 'r'), /* 39 */ + FT_MAKE_TAG('b', 'd', 'a', 't'), /* 40 */ + FT_MAKE_TAG('b', 'l', 'o', 'c'), /* 41 */ + FT_MAKE_TAG('b', 's', 'l', 'n'), /* 42 */ + FT_MAKE_TAG('c', 'v', 'a', 'r'), /* 43 */ + FT_MAKE_TAG('f', 'd', 's', 'c'), /* 44 */ + FT_MAKE_TAG('f', 'e', 'a', 't'), /* 45 */ + FT_MAKE_TAG('f', 'm', 't', 'x'), /* 46 */ + FT_MAKE_TAG('f', 'v', 'a', 'r'), /* 47 */ + FT_MAKE_TAG('g', 'v', 'a', 'r'), /* 48 */ + FT_MAKE_TAG('h', 's', 't', 'y'), /* 49 */ + FT_MAKE_TAG('j', 'u', 's', 't'), /* 50 */ + FT_MAKE_TAG('l', 'c', 'a', 'r'), /* 51 */ + FT_MAKE_TAG('m', 'o', 'r', 't'), /* 52 */ + FT_MAKE_TAG('m', 'o', 'r', 'x'), /* 53 */ + FT_MAKE_TAG('o', 'p', 'b', 'd'), /* 54 */ + FT_MAKE_TAG('p', 'r', 'o', 'p'), /* 55 */ + FT_MAKE_TAG('t', 'r', 'a', 'k'), /* 56 */ + FT_MAKE_TAG('Z', 'a', 'p', 'f'), /* 57 */ + FT_MAKE_TAG('S', 'i', 'l', 'f'), /* 58 */ + FT_MAKE_TAG('G', 'l', 'a', 't'), /* 59 */ + FT_MAKE_TAG('G', 'l', 'o', 'c'), /* 60 */ + FT_MAKE_TAG('F', 'e', 'a', 't'), /* 61 */ + FT_MAKE_TAG('S', 'i', 'l', 'l'), /* 62 */ + }; + + + if ( index > 62 ) + return 0; + + return known_tags[index]; + } + +#else /* !FT_CONFIG_OPTION_USE_BROTLI */ + + /* ANSI C doesn't like empty source files */ + typedef int woff2tags_dummy_; + +#endif /* !FT_CONFIG_OPTION_USE_BROTLI */ + + +/* END */ diff --git a/external/freetype/src/sfnt/woff2tags.h b/external/freetype/src/sfnt/woff2tags.h new file mode 100644 index 000000000..1201848e5 --- /dev/null +++ b/external/freetype/src/sfnt/woff2tags.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * woff2tags.h + * + * WOFF2 Font table tags (specification). + * + * Copyright (C) 2019-2023 by + * Nikhil Ramakrishnan, David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef WOFF2TAGS_H +#define WOFF2TAGS_H + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/compiler-macros.h> + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_USE_BROTLI + + FT_LOCAL( FT_Tag ) + woff2_known_tags( FT_Byte index ); + +#endif + +FT_END_HEADER + +#endif /* WOFF2TAGS_H */ + + +/* END */ diff --git a/external/freetype/src/smooth/ftgrays.c b/external/freetype/src/smooth/ftgrays.c new file mode 100644 index 000000000..0918272f8 --- /dev/null +++ b/external/freetype/src/smooth/ftgrays.c @@ -0,0 +1,2244 @@ +/**************************************************************************** + * + * ftgrays.c + * + * A new `perfect' anti-aliasing renderer (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + /************************************************************************** + * + * This file can be compiled without the rest of the FreeType engine, by + * defining the STANDALONE_ macro when compiling it. You also need to + * put the files `ftgrays.h' and `ftimage.h' into the current + * compilation directory. Typically, you could do something like + * + * - copy `src/smooth/ftgrays.c' (this file) to your current directory + * + * - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the + * same directory + * + * - compile `ftgrays' with the STANDALONE_ macro defined, as in + * + * cc -c -DSTANDALONE_ ftgrays.c + * + * The renderer can be initialized with a call to + * `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated + * with a call to `ft_gray_raster.raster_render'. + * + * See the comments and documentation in the file `ftimage.h' for more + * details on how the raster works. + * + */ + + /************************************************************************** + * + * This is a new anti-aliasing scan-converter for FreeType 2. The + * algorithm used here is _very_ different from the one in the standard + * `ftraster' module. Actually, `ftgrays' computes the _exact_ + * coverage of the outline on each pixel cell by straight segments. + * + * It is based on ideas that I initially found in Raph Levien's + * excellent LibArt graphics library (see https://www.levien.com/libart + * for more information, though the web pages do not tell anything + * about the renderer; you'll have to dive into the source code to + * understand how it works). + * + * Note, however, that this is a _very_ different implementation + * compared to Raph's. Coverage information is stored in a very + * different way, and I don't use sorted vector paths. Also, it doesn't + * use floating point values. + * + * Bézier segments are flattened by splitting them until their deviation + * from straight line becomes much smaller than a pixel. Therefore, the + * pixel coverage by a Bézier curve is calculated approximately. To + * estimate the deviation, we use the distance from the control point + * to the conic chord centre or the cubic chord trisection. These + * distances vanish fast after each split. In the conic case, they vanish + * predictably and the number of necessary splits can be calculated. + * + * This renderer has the following advantages: + * + * - It doesn't need an intermediate bitmap. Instead, one can supply a + * callback function that will be called by the renderer to draw gray + * spans on any target surface. You can thus do direct composition on + * any kind of bitmap, provided that you give the renderer the right + * callback. + * + * - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on + * each pixel cell by straight segments. + * + * - It performs a single pass on the outline (the `standard' FT2 + * renderer makes two passes). + * + * - It can easily be modified to render to _any_ number of gray levels + * cheaply. + * + * - For small (< 80) pixel sizes, it is faster than the standard + * renderer. + * + */ + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT smooth + + +#ifdef STANDALONE_ + + + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ +#define FT_RENDER_POOL_SIZE 16384L + + + /* Auxiliary macros for token concatenation. */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) + +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + + /* + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' + * algorithm. We use alpha = 1, beta = 3/8, giving us results with a + * largest error less than 7% compared to the exact value. + */ +#define FT_HYPOT( x, y ) \ + ( x = FT_ABS( x ), \ + y = FT_ABS( y ), \ + x > y ? x + ( 3 * y >> 3 ) \ + : y + ( 3 * x >> 3 ) ) + + + /* define this to dump debugging information */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LEVEL_TRACE +#include <stdio.h> +#include <stdarg.h> +#endif + +#include <stddef.h> +#include <string.h> +#include <setjmp.h> +#include <limits.h> +#define FT_CHAR_BIT CHAR_BIT +#define FT_UINT_MAX UINT_MAX +#define FT_INT_MAX INT_MAX +#define FT_ULONG_MAX ULONG_MAX + +#define ADD_INT( a, b ) \ + (int)( (unsigned int)(a) + (unsigned int)(b) ) + +#define FT_STATIC_BYTE_CAST( type, var ) (type)(unsigned char)(var) + + +#define ft_memset memset + +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf + +typedef ptrdiff_t FT_PtrDist; + + +#define Smooth_Err_Ok 0 +#define Smooth_Err_Invalid_Outline -1 +#define Smooth_Err_Cannot_Render_Glyph -2 +#define Smooth_Err_Invalid_Argument -3 +#define Smooth_Err_Raster_Overflow -4 + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#include "ftimage.h" +#include "ftgrays.h" + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + + /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + void + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* empty function useful for setting a breakpoint to catch errors */ + int + FT_Throw( int error, + int line, + const char* file ) + { + FT_UNUSED( error ); + FT_UNUSED( line ); + FT_UNUSED( file ); + + return 0; + } + + + /* we don't handle tracing levels in stand-alone mode; */ +#ifndef FT_TRACE5 +#define FT_TRACE5( varformat ) FT_Message varformat +#endif +#ifndef FT_TRACE7 +#define FT_TRACE7( varformat ) FT_Message varformat +#endif +#ifndef FT_ERROR +#define FT_ERROR( varformat ) FT_Message varformat +#endif + +#define FT_THROW( e ) \ + ( FT_Throw( FT_ERR_CAT( Smooth_Err_, e ), \ + __LINE__, \ + __FILE__ ) | \ + FT_ERR_CAT( Smooth_Err_, e ) ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#define FT_THROW( e ) FT_ERR_CAT( Smooth_Err_, e ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define FT_Trace_Enable() do { } while ( 0 ) /* nothing */ +#define FT_Trace_Disable() do { } while ( 0 ) /* nothing */ + + +#define FT_DEFINE_OUTLINE_FUNCS( class_, \ + move_to_, line_to_, \ + conic_to_, cubic_to_, \ + shift_, delta_ ) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ + raster_new_, raster_reset_, \ + raster_set_mode_, raster_render_, \ + raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + + +#else /* !STANDALONE_ */ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include "ftgrays.h" +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/ftoutln.h> + +#include "ftsmerrs.h" + + +#endif /* !STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + + /* as usual, for the speed hungry :-) */ + +#undef RAS_ARG +#undef RAS_ARG_ +#undef RAS_VAR +#undef RAS_VAR_ + +#ifndef FT_STATIC_RASTER + +#define RAS_ARG gray_PWorker worker +#define RAS_ARG_ gray_PWorker worker, + +#define RAS_VAR worker +#define RAS_VAR_ worker, + +#else /* FT_STATIC_RASTER */ + +#define RAS_ARG void +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + +#endif /* FT_STATIC_RASTER */ + + + /* must be at least 6 bits! */ +#define PIXEL_BITS 8 + +#define ONE_PIXEL ( 1 << PIXEL_BITS ) +#undef TRUNC +#define TRUNC( x ) (TCoord)( (x) >> PIXEL_BITS ) +#undef FRACT +#define FRACT( x ) (TCoord)( (x) & ( ONE_PIXEL - 1 ) ) + +#if PIXEL_BITS >= 6 +#define UPSCALE( x ) ( (x) * ( ONE_PIXEL >> 6 ) ) +#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#else +#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) +#define DOWNSCALE( x ) ( (x) * ( 64 >> PIXEL_BITS ) ) +#endif + + + /* Compute `dividend / divisor' and return both its quotient and */ + /* remainder, cast to a specific type. This macro also ensures that */ + /* the remainder is always positive. We use the remainder to keep */ + /* track of accumulating errors and compensate for them. */ +#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ + FT_BEGIN_STMNT \ + (quotient) = (type)( (dividend) / (divisor) ); \ + (remainder) = (type)( (dividend) % (divisor) ); \ + if ( (remainder) < 0 ) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + FT_END_STMNT + +#if defined( __GNUC__ ) && __GNUC__ < 7 && defined( __arm__ ) + /* Work around a bug specific to GCC which make the compiler fail to */ + /* optimize a division and modulo operation on the same parameters */ + /* into a single call to `__aeabi_idivmod'. See */ + /* */ + /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */ +#undef FT_DIV_MOD +#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ + FT_BEGIN_STMNT \ + (quotient) = (type)( (dividend) / (divisor) ); \ + (remainder) = (type)( (dividend) - (quotient) * (divisor) ); \ + if ( (remainder) < 0 ) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + FT_END_STMNT +#endif /* __arm__ */ + + + /* Calculating coverages for a slanted line requires a division each */ + /* time the line crosses from cell to cell. These macros speed up */ + /* the repetitive divisions by replacing them with multiplications */ + /* and right shifts so that at most two divisions are performed for */ + /* each slanted line. Nevertheless, these divisions are noticeable */ + /* in the overall performance because flattened curves produce a */ + /* very large number of slanted lines. */ + /* */ + /* The division results here are always within ONE_PIXEL. Therefore */ + /* the shift magnitude should be at least PIXEL_BITS wider than the */ + /* divisors to provide sufficient accuracy of the multiply-shift. */ + /* It should not exceed (64 - PIXEL_BITS) to prevent overflowing and */ + /* leave enough room for 64-bit unsigned multiplication however. */ +#define FT_UDIVPREP( c, b ) \ + FT_Int64 b ## _r = c ? (FT_Int64)0xFFFFFFFF / ( b ) : 0 +#define FT_UDIV( a, b ) \ + (TCoord)( ( (FT_UInt64)( a ) * (FT_UInt64)( b ## _r ) ) >> 32 ) + + + /* Scale area and apply fill rule to calculate the coverage byte. */ + /* The top fill bit is used for the non-zero rule. The eighth */ + /* fill bit is used for the even-odd rule. The higher coverage */ + /* bytes are either clamped for the non-zero-rule or discarded */ + /* later for the even-odd rule. */ +#define FT_FILL_RULE( coverage, area, fill ) \ + FT_BEGIN_STMNT \ + coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); \ + if ( coverage & fill ) \ + coverage = ~coverage; \ + if ( coverage > 255 && fill & INT_MIN ) \ + coverage = 255; \ + FT_END_STMNT + + + /* It is faster to write small spans byte-by-byte than calling */ + /* `memset'. This is mainly due to the cost of the function call. */ +#define FT_GRAY_SET( d, s, count ) \ + FT_BEGIN_STMNT \ + unsigned char* q = d; \ + switch ( count ) \ + { \ + case 7: *q++ = (unsigned char)s; FALL_THROUGH; \ + case 6: *q++ = (unsigned char)s; FALL_THROUGH; \ + case 5: *q++ = (unsigned char)s; FALL_THROUGH; \ + case 4: *q++ = (unsigned char)s; FALL_THROUGH; \ + case 3: *q++ = (unsigned char)s; FALL_THROUGH; \ + case 2: *q++ = (unsigned char)s; FALL_THROUGH; \ + case 1: *q = (unsigned char)s; FALL_THROUGH; \ + case 0: break; \ + default: FT_MEM_SET( d, s, count ); \ + } \ + FT_END_STMNT + + + /************************************************************************** + * + * TYPE DEFINITIONS + */ + + /* don't change the following types to FT_Int or FT_Pos, since we might */ + /* need to define them to "float" or "double" when experimenting with */ + /* new algorithms */ + + typedef long TPos; /* subpixel coordinate */ + typedef int TCoord; /* integer scanline/pixel coordinate */ + typedef int TArea; /* cell areas, coordinate products */ + + + typedef struct TCell_* PCell; + + typedef struct TCell_ + { + TCoord x; /* same with gray_TWorker.ex */ + TCoord cover; /* same with gray_TWorker.cover */ + TArea area; + PCell next; + + } TCell; + + typedef struct TPixmap_ + { + unsigned char* origin; /* pixmap origin at the bottom-left */ + int pitch; /* pitch to go down one row */ + + } TPixmap; + + /* maximum number of gray cells in the buffer */ +#if FT_RENDER_POOL_SIZE > 2048 +#define FT_MAX_GRAY_POOL ( FT_RENDER_POOL_SIZE / sizeof ( TCell ) ) +#else +#define FT_MAX_GRAY_POOL ( 2048 / sizeof ( TCell ) ) +#endif + + /* FT_Span buffer size for direct rendering only */ +#define FT_MAX_GRAY_SPANS 16 + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `structure was padded due to */ + /* __declspec(align())' in order to compile cleanly with */ + /* the maximum level of warnings. */ +#pragma warning( push ) +#pragma warning( disable : 4324 ) +#endif /* _MSC_VER */ + + typedef struct gray_TWorker_ + { + ft_jmp_buf jump_buffer; + + TCoord min_ex, max_ex; /* min and max integer pixel coordinates */ + TCoord min_ey, max_ey; + TCoord count_ey; /* same as (max_ey - min_ey) */ + + PCell cell; /* current cell */ + PCell cell_free; /* call allocation next free slot */ + PCell cell_null; /* last cell, used as dumpster and limit */ + + PCell* ycells; /* array of cell linked-lists; one per */ + /* vertical coordinate in the current band */ + + TPos x, y; /* last point position */ + + FT_Outline outline; /* input outline */ + TPixmap target; /* target pixmap */ + + FT_Raster_Span_Func render_span; + void* render_span_data; + + } gray_TWorker, *gray_PWorker; + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + +#ifndef FT_STATIC_RASTER +#define ras (*worker) +#else + static gray_TWorker ras; +#endif + + /* The |x| value of the null cell. Must be the largest possible */ + /* integer value stored in a `TCell.x` field. */ +#define CELL_MAX_X_VALUE INT_MAX + + +#define FT_INTEGRATE( ras, a, b ) \ + ras.cell->cover = ADD_INT( ras.cell->cover, a ), \ + ras.cell->area = ADD_INT( ras.cell->area, (a) * (TArea)(b) ) + + + typedef struct gray_TRaster_ + { + void* memory; + + } gray_TRaster, *gray_PRaster; + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* to be called while in the debugger -- */ + /* this function causes a compiler warning since it is unused otherwise */ + static void + gray_dump_cells( RAS_ARG ) + { + int y; + + + for ( y = ras.min_ey; y < ras.max_ey; y++ ) + { + PCell cell = ras.ycells[y - ras.min_ey]; + + + printf( "%3d:", y ); + + for ( ; cell != ras.cell_null; cell = cell->next ) + printf( " (%3d, c:%4d, a:%6d)", + cell->x, cell->cover, cell->area ); + printf( "\n" ); + } + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /************************************************************************** + * + * Set the current cell to a new position. + */ + static void + gray_set_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + /* Move the cell pointer to a new position in the linked list. We use */ + /* a dumpster null cell for everything outside of the clipping region */ + /* during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + TCoord ey_index = ey - ras.min_ey; + + + if ( ey_index < 0 || ey_index >= ras.count_ey || ex >= ras.max_ex ) + ras.cell = ras.cell_null; + else + { + PCell* pcell = ras.ycells + ey_index; + PCell cell; + + + ex = FT_MAX( ex, ras.min_ex - 1 ); + + while ( 1 ) + { + cell = *pcell; + + if ( cell->x > ex ) + break; + + if ( cell->x == ex ) + goto Found; + + pcell = &cell->next; + } + + /* insert new cell */ + cell = ras.cell_free++; + if ( cell >= ras.cell_null ) + ft_longjmp( ras.jump_buffer, 1 ); + + cell->x = ex; + cell->area = 0; + cell->cover = 0; + + cell->next = *pcell; + *pcell = cell; + + Found: + ras.cell = cell; + } + } + + +#ifndef FT_INT64 + + /************************************************************************** + * + * Render a scanline as one or more cells. + */ + static void + gray_render_scanline( RAS_ARG_ TCoord ey, + TPos x1, + TCoord y1, + TPos x2, + TCoord y2 ) + { + TCoord ex1, ex2, fx1, fx2, first, dy, delta, mod; + TPos p, dx; + int incr; + + + ex1 = TRUNC( x1 ); + ex2 = TRUNC( x2 ); + + /* trivial case. Happens often */ + if ( y1 == y2 ) + { + gray_set_cell( RAS_VAR_ ex2, ey ); + return; + } + + fx1 = FRACT( x1 ); + fx2 = FRACT( x2 ); + + /* everything is located in a single cell. That is easy! */ + /* */ + if ( ex1 == ex2 ) + goto End; + + /* ok, we'll have to render a run of adjacent cells on the same */ + /* scanline... */ + /* */ + dx = x2 - x1; + dy = y2 - y1; + + if ( dx > 0 ) + { + p = ( ONE_PIXEL - fx1 ) * dy; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fx1 * dy; + first = 0; + incr = -1; + dx = -dx; + } + + /* the fractional part of y-delta is mod/dx. It is essential to */ + /* keep track of its accumulation for accurate rendering. */ + /* XXX: y-delta and x-delta below should be related. */ + FT_DIV_MOD( TCoord, p, dx, delta, mod ); + + FT_INTEGRATE( ras, delta, fx1 + first ); + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + + if ( ex1 != ex2 ) + { + TCoord lift, rem; + + + p = ONE_PIXEL * dy; + FT_DIV_MOD( TCoord, p, dx, lift, rem ); + + do + { + delta = lift; + mod += rem; + if ( mod >= (TCoord)dx ) + { + mod -= (TCoord)dx; + delta++; + } + + FT_INTEGRATE( ras, delta, ONE_PIXEL ); + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + } while ( ex1 != ex2 ); + } + + fx1 = ONE_PIXEL - first; + + End: + FT_INTEGRATE( ras, y2 - y1, fx1 + fx2 ); + } + + + /************************************************************************** + * + * Render a given line as a series of scanlines. + */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TCoord ey1, ey2, fy1, fy2, first, delta, mod; + TPos p, dx, dy, x, x2; + int incr; + + + ey1 = TRUNC( ras.y ); + ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ + + /* perform vertical clipping */ + if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) || + ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) + goto End; + + fy1 = FRACT( ras.y ); + fy2 = FRACT( to_y ); + + /* everything is on a single scanline */ + if ( ey1 == ey2 ) + { + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); + goto End; + } + + dx = to_x - ras.x; + dy = to_y - ras.y; + + /* vertical line - avoid calling gray_render_scanline */ + if ( dx == 0 ) + { + TCoord ex = TRUNC( ras.x ); + TCoord two_fx = FRACT( ras.x ) << 1; + + + if ( dy > 0) + { + first = ONE_PIXEL; + incr = 1; + } + else + { + first = 0; + incr = -1; + } + + delta = first - fy1; + FT_INTEGRATE( ras, delta, two_fx); + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + + delta = first + first - ONE_PIXEL; + while ( ey1 != ey2 ) + { + FT_INTEGRATE( ras, delta, two_fx); + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + } + + delta = fy2 - ONE_PIXEL + first; + FT_INTEGRATE( ras, delta, two_fx); + + goto End; + } + + /* ok, we have to render several scanlines */ + if ( dy > 0) + { + p = ( ONE_PIXEL - fy1 ) * dx; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fy1 * dx; + first = 0; + incr = -1; + dy = -dy; + } + + /* the fractional part of x-delta is mod/dy. It is essential to */ + /* keep track of its accumulation for accurate rendering. */ + FT_DIV_MOD( TCoord, p, dy, delta, mod ); + + x = ras.x + delta; + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, first ); + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + + if ( ey1 != ey2 ) + { + TCoord lift, rem; + + + p = ONE_PIXEL * dx; + FT_DIV_MOD( TCoord, p, dy, lift, rem ); + + do + { + delta = lift; + mod += rem; + if ( mod >= (TCoord)dy ) + { + mod -= (TCoord)dy; + delta++; + } + + x2 = x + delta; + gray_render_scanline( RAS_VAR_ ey1, + x, ONE_PIXEL - first, + x2, first ); + x = x2; + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + } while ( ey1 != ey2 ); + } + + gray_render_scanline( RAS_VAR_ ey1, + x, ONE_PIXEL - first, + to_x, fy2 ); + + End: + ras.x = to_x; + ras.y = to_y; + } + +#else + + /************************************************************************** + * + * Render a straight line across multiple cells in any direction. + */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TPos dx, dy; + TCoord fx1, fy1, fx2, fy2; + TCoord ex1, ey1, ex2, ey2; + + + ey1 = TRUNC( ras.y ); + ey2 = TRUNC( to_y ); + + /* perform vertical clipping */ + if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) || + ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) + goto End; + + ex1 = TRUNC( ras.x ); + ex2 = TRUNC( to_x ); + + fx1 = FRACT( ras.x ); + fy1 = FRACT( ras.y ); + + dx = to_x - ras.x; + dy = to_y - ras.y; + + if ( ex1 == ex2 && ey1 == ey2 ) /* inside one cell */ + ; + else if ( dy == 0 ) /* ex1 != ex2 */ /* any horizontal line */ + { + gray_set_cell( RAS_VAR_ ex2, ey2 ); + goto End; + } + else if ( dx == 0 ) + { + if ( dy > 0 ) /* vertical line up */ + do + { + fy2 = ONE_PIXEL; + FT_INTEGRATE( ras, fy2 - fy1, fx1 * 2 ); + fy1 = 0; + ey1++; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ey1 != ey2 ); + else /* vertical line down */ + do + { + fy2 = 0; + FT_INTEGRATE( ras, fy2 - fy1, fx1 * 2 ); + fy1 = ONE_PIXEL; + ey1--; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ey1 != ey2 ); + } + else /* any other line */ + { + FT_Int64 prod = dx * (FT_Int64)fy1 - dy * (FT_Int64)fx1; + FT_UDIVPREP( ex1 != ex2, dx ); + FT_UDIVPREP( ey1 != ey2, dy ); + + + /* The fundamental value `prod' determines which side and the */ + /* exact coordinate where the line exits current cell. It is */ + /* also easily updated when moving from one cell to the next. */ + do + { + if ( prod - dx * ONE_PIXEL > 0 && + prod <= 0 ) /* left */ + { + fx2 = 0; + fy2 = FT_UDIV( -prod, -dx ); + prod -= dy * ONE_PIXEL; + FT_INTEGRATE( ras, fy2 - fy1, fx1 + fx2 ); + fx1 = ONE_PIXEL; + fy1 = fy2; + ex1--; + } + else if ( prod - dx * ONE_PIXEL + dy * ONE_PIXEL > 0 && + prod - dx * ONE_PIXEL <= 0 ) /* up */ + { + prod -= dx * ONE_PIXEL; + fx2 = FT_UDIV( -prod, dy ); + fy2 = ONE_PIXEL; + FT_INTEGRATE( ras, fy2 - fy1, fx1 + fx2 ); + fx1 = fx2; + fy1 = 0; + ey1++; + } + else if ( prod + dy * ONE_PIXEL >= 0 && + prod - dx * ONE_PIXEL + dy * ONE_PIXEL <= 0 ) /* right */ + { + prod += dy * ONE_PIXEL; + fx2 = ONE_PIXEL; + fy2 = FT_UDIV( prod, dx ); + FT_INTEGRATE( ras, fy2 - fy1, fx1 + fx2 ); + fx1 = 0; + fy1 = fy2; + ex1++; + } + else /* ( prod > 0 && + prod + dy * ONE_PIXEL < 0 ) down */ + { + fx2 = FT_UDIV( prod, -dy ); + fy2 = 0; + prod += dx * ONE_PIXEL; + FT_INTEGRATE( ras, fy2 - fy1, fx1 + fx2 ); + fx1 = fx2; + fy1 = ONE_PIXEL; + ey1--; + } + + gray_set_cell( RAS_VAR_ ex1, ey1 ); + + } while ( ex1 != ex2 || ey1 != ey2 ); + } + + fx2 = FRACT( to_x ); + fy2 = FRACT( to_y ); + + FT_INTEGRATE( ras, fy2 - fy1, fx1 + fx2 ); + + End: + ras.x = to_x; + ras.y = to_y; + } + +#endif + + /* + * Benchmarking shows that using DDA to flatten the quadratic Bézier arcs + * is slightly faster in the following cases: + * + * - When the host CPU is 64-bit. + * - When SSE2 SIMD registers and instructions are available (even on + * x86). + * + * For other cases, using binary splits is actually slightly faster. + */ +#if ( defined( __SSE2__ ) || \ + defined( __x86_64__ ) || \ + defined( _M_AMD64 ) || \ + ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 ) ) && \ + !defined( __VMS ) +# define FT_SSE2 1 +#else +# define FT_SSE2 0 +#endif + +#if FT_SSE2 || \ + defined( __aarch64__ ) || \ + defined( _M_ARM64 ) +# define BEZIER_USE_DDA 1 +#else +# define BEZIER_USE_DDA 0 +#endif + + /* + * For now, the code that depends on `BEZIER_USE_DDA` requires `FT_Int64` + * to be defined. If `FT_INT64` is not defined, meaning there is no + * 64-bit type available, disable it to avoid compilation errors. See for + * example https://gitlab.freedesktop.org/freetype/freetype/-/issues/1071. + */ +#if !defined( FT_INT64 ) +# undef BEZIER_USE_DDA +# define BEZIER_USE_DDA 0 +#endif + +#if BEZIER_USE_DDA + +#if FT_SSE2 +# include <emmintrin.h> +#endif + +#define LEFT_SHIFT( a, b ) (FT_Int64)( (FT_UInt64)(a) << (b) ) + + + static void + gray_render_conic( RAS_ARG_ const FT_Vector* control, + const FT_Vector* to ) + { + FT_Vector p0, p1, p2; + TPos ax, ay, bx, by, dx, dy; + int shift; + + FT_Int64 rx, ry; + FT_Int64 qx, qy; + FT_Int64 px, py; + + FT_UInt count; + + + p0.x = ras.x; + p0.y = ras.y; + p1.x = UPSCALE( control->x ); + p1.y = UPSCALE( control->y ); + p2.x = UPSCALE( to->x ); + p2.y = UPSCALE( to->y ); + + /* short-cut the arc that crosses the current band */ + if ( ( TRUNC( p0.y ) >= ras.max_ey && + TRUNC( p1.y ) >= ras.max_ey && + TRUNC( p2.y ) >= ras.max_ey ) || + ( TRUNC( p0.y ) < ras.min_ey && + TRUNC( p1.y ) < ras.min_ey && + TRUNC( p2.y ) < ras.min_ey ) ) + { + ras.x = p2.x; + ras.y = p2.y; + return; + } + + bx = p1.x - p0.x; + by = p1.y - p0.y; + ax = p2.x - p1.x - bx; /* p0.x + p2.x - 2 * p1.x */ + ay = p2.y - p1.y - by; /* p0.y + p2.y - 2 * p1.y */ + + dx = FT_ABS( ax ); + dy = FT_ABS( ay ); + if ( dx < dy ) + dx = dy; + + if ( dx <= ONE_PIXEL / 4 ) + { + gray_render_line( RAS_VAR_ p2.x, p2.y ); + return; + } + + /* We can calculate the number of necessary bisections because */ + /* each bisection predictably reduces deviation exactly 4-fold. */ + /* Even 32-bit deviation would vanish after 16 bisections. */ + shift = 0; + do + { + dx >>= 2; + shift += 1; + + } while ( dx > ONE_PIXEL / 4 ); + + /* + * The (P0,P1,P2) arc equation, for t in [0,1] range: + * + * P(t) = P0*(1-t)^2 + P1*2*t*(1-t) + P2*t^2 + * + * P(t) = P0 + 2*(P1-P0)*t + (P0+P2-2*P1)*t^2 + * = P0 + 2*B*t + A*t^2 + * + * for A = P0 + P2 - 2*P1 + * and B = P1 - P0 + * + * Let's consider the difference when advancing by a small + * parameter h: + * + * Q(h,t) = P(t+h) - P(t) = 2*B*h + A*h^2 + 2*A*h*t + * + * And then its own difference: + * + * R(h,t) = Q(h,t+h) - Q(h,t) = 2*A*h*h = R (constant) + * + * Since R is always a constant, it is possible to compute + * successive positions with: + * + * P = P0 + * Q = Q(h,0) = 2*B*h + A*h*h + * R = 2*A*h*h + * + * loop: + * P += Q + * Q += R + * EMIT(P) + * + * To ensure accurate results, perform computations on 64-bit + * values, after scaling them by 2^32. + * + * h = 1 / 2^N + * + * R << 32 = 2 * A << (32 - N - N) + * = A << (33 - 2*N) + * + * Q << 32 = (2 * B << (32 - N)) + (A << (32 - N - N)) + * = (B << (33 - N)) + (A << (32 - 2*N)) + */ + +#if FT_SSE2 + /* Experience shows that for small shift values, */ + /* SSE2 is actually slower. */ + if ( shift > 2 ) + { + union + { + struct { FT_Int64 ax, ay, bx, by; } i; + struct { __m128i a, b; } vec; + + } u; + + union + { + struct { FT_Int32 px_lo, px_hi, py_lo, py_hi; } i; + __m128i vec; + + } v; + + __m128i a, b; + __m128i r, q, q2; + __m128i p; + + + u.i.ax = ax; + u.i.ay = ay; + u.i.bx = bx; + u.i.by = by; + + a = _mm_load_si128( &u.vec.a ); + b = _mm_load_si128( &u.vec.b ); + + r = _mm_slli_epi64( a, 33 - 2 * shift ); + q = _mm_slli_epi64( b, 33 - shift ); + q2 = _mm_slli_epi64( a, 32 - 2 * shift ); + + q = _mm_add_epi64( q2, q ); + + v.i.px_lo = 0; + v.i.px_hi = p0.x; + v.i.py_lo = 0; + v.i.py_hi = p0.y; + + p = _mm_load_si128( &v.vec ); + + for ( count = 1U << shift; count > 0; count-- ) + { + p = _mm_add_epi64( p, q ); + q = _mm_add_epi64( q, r ); + + _mm_store_si128( &v.vec, p ); + + gray_render_line( RAS_VAR_ v.i.px_hi, v.i.py_hi ); + } + + return; + } +#endif /* FT_SSE2 */ + + rx = LEFT_SHIFT( ax, 33 - 2 * shift ); + ry = LEFT_SHIFT( ay, 33 - 2 * shift ); + + qx = LEFT_SHIFT( bx, 33 - shift ) + LEFT_SHIFT( ax, 32 - 2 * shift ); + qy = LEFT_SHIFT( by, 33 - shift ) + LEFT_SHIFT( ay, 32 - 2 * shift ); + + px = LEFT_SHIFT( p0.x, 32 ); + py = LEFT_SHIFT( p0.y, 32 ); + + for ( count = 1U << shift; count > 0; count-- ) + { + px += qx; + py += qy; + qx += rx; + qy += ry; + + gray_render_line( RAS_VAR_ (FT_Pos)( px >> 32 ), + (FT_Pos)( py >> 32 ) ); + } + } + +#else /* !BEZIER_USE_DDA */ + + /* + * Note that multiple attempts to speed up the function below + * with SSE2 intrinsics, using various data layouts, have turned + * out to be slower than the non-SIMD code below. + */ + static void + gray_split_conic( FT_Vector* base ) + { + TPos a, b; + + + base[4].x = base[2].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = ( a + b ) >> 2; + base[1].x = a >> 1; + + base[4].y = base[2].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = ( a + b ) >> 2; + base[1].y = a >> 1; + } + + + static void + gray_render_conic( RAS_ARG_ const FT_Vector* control, + const FT_Vector* to ) + { + FT_Vector bez_stack[16 * 2 + 1]; /* enough to accommodate bisections */ + FT_Vector* arc = bez_stack; + TPos dx, dy; + int draw; + + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + + /* short-cut the arc that crosses the current band */ + if ( ( TRUNC( arc[0].y ) >= ras.max_ey && + TRUNC( arc[1].y ) >= ras.max_ey && + TRUNC( arc[2].y ) >= ras.max_ey ) || + ( TRUNC( arc[0].y ) < ras.min_ey && + TRUNC( arc[1].y ) < ras.min_ey && + TRUNC( arc[2].y ) < ras.min_ey ) ) + { + ras.x = arc[0].x; + ras.y = arc[0].y; + return; + } + + dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); + dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); + if ( dx < dy ) + dx = dy; + + /* We can calculate the number of necessary bisections because */ + /* each bisection predictably reduces deviation exactly 4-fold. */ + /* Even 32-bit deviation would vanish after 16 bisections. */ + draw = 1; + while ( dx > ONE_PIXEL / 4 ) + { + dx >>= 2; + draw <<= 1; + } + + /* We use decrement counter to count the total number of segments */ + /* to draw starting from 2^level. Before each draw we split as */ + /* many times as there are trailing zeros in the counter. */ + do + { + int split = draw & ( -draw ); /* isolate the rightmost 1-bit */ + + + while ( ( split >>= 1 ) ) + { + gray_split_conic( arc ); + arc += 2; + } + + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + arc -= 2; + + } while ( --draw ); + } + +#endif /* !BEZIER_USE_DDA */ + + + /* + * For cubic Bézier, binary splits are still faster than DDA + * because the splits are adaptive to how quickly each sub-arc + * approaches their chord trisection points. + * + * It might be useful to experiment with SSE2 to speed up + * `gray_split_cubic`, though. + */ + static void + gray_split_cubic( FT_Vector* base ) + { + TPos a, b, c; + + + base[6].x = base[3].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = ( a + c ) >> 3; + + base[6].y = base[3].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = ( a + c ) >> 3; + } + + + static void + gray_render_cubic( RAS_ARG_ const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to ) + { + FT_Vector bez_stack[16 * 3 + 1]; /* enough to accommodate bisections */ + FT_Vector* arc = bez_stack; + + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + /* short-cut the arc that crosses the current band */ + if ( ( TRUNC( arc[0].y ) >= ras.max_ey && + TRUNC( arc[1].y ) >= ras.max_ey && + TRUNC( arc[2].y ) >= ras.max_ey && + TRUNC( arc[3].y ) >= ras.max_ey ) || + ( TRUNC( arc[0].y ) < ras.min_ey && + TRUNC( arc[1].y ) < ras.min_ey && + TRUNC( arc[2].y ) < ras.min_ey && + TRUNC( arc[3].y ) < ras.min_ey ) ) + { + ras.x = arc[0].x; + ras.y = arc[0].y; + return; + } + + for (;;) + { + /* with each split, control points quickly converge towards */ + /* chord trisection points and the vanishing distances below */ + /* indicate when the segment is flat enough to draw */ + if ( FT_ABS( 2 * arc[0].x - 3 * arc[1].x + arc[3].x ) > ONE_PIXEL / 2 || + FT_ABS( 2 * arc[0].y - 3 * arc[1].y + arc[3].y ) > ONE_PIXEL / 2 || + FT_ABS( arc[0].x - 3 * arc[2].x + 2 * arc[3].x ) > ONE_PIXEL / 2 || + FT_ABS( arc[0].y - 3 * arc[2].y + 2 * arc[3].y ) > ONE_PIXEL / 2 ) + goto Split; + + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + + if ( arc == bez_stack ) + return; + + arc -= 3; + continue; + + Split: + gray_split_cubic( arc ); + arc += 3; + } + } + + + static int + gray_move_to( const FT_Vector* to, + void* worker_ ) /* gray_PWorker */ + { + gray_PWorker worker = (gray_PWorker)worker_; + + TPos x, y; + + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_set_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + + ras.x = x; + ras.y = y; + return 0; + } + + + static int + gray_line_to( const FT_Vector* to, + void* worker_ ) /* gray_PWorker */ + { + gray_PWorker worker = (gray_PWorker)worker_; + + + gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); + return 0; + } + + + static int + gray_conic_to( const FT_Vector* control, + const FT_Vector* to, + void* worker_ ) /* gray_PWorker */ + { + gray_PWorker worker = (gray_PWorker)worker_; + + + gray_render_conic( RAS_VAR_ control, to ); + return 0; + } + + + static int + gray_cubic_to( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* worker_ ) /* gray_PWorker */ + { + gray_PWorker worker = (gray_PWorker)worker_; + + + gray_render_cubic( RAS_VAR_ control1, control2, to ); + return 0; + } + + + static void + gray_sweep( RAS_ARG ) + { + int fill = ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) ? 0x100 + : INT_MIN; + int coverage; + int y; + + + for ( y = ras.min_ey; y < ras.max_ey; y++ ) + { + PCell cell = ras.ycells[y - ras.min_ey]; + TCoord x = ras.min_ex; + TArea cover = 0; + + unsigned char* line = ras.target.origin - ras.target.pitch * y; + + + for ( ; cell != ras.cell_null; cell = cell->next ) + { + TArea area; + + + if ( cover != 0 && cell->x > x ) + { + FT_FILL_RULE( coverage, cover, fill ); + FT_GRAY_SET( line + x, coverage, cell->x - x ); + } + + cover += (TArea)cell->cover * ( ONE_PIXEL * 2 ); + area = cover - cell->area; + + if ( area != 0 && cell->x >= ras.min_ex ) + { + FT_FILL_RULE( coverage, area, fill ); + line[cell->x] = (unsigned char)coverage; + } + + x = cell->x + 1; + } + + if ( cover != 0 ) /* only if cropped */ + { + FT_FILL_RULE( coverage, cover, fill ); + FT_GRAY_SET( line + x, coverage, ras.max_ex - x ); + } + } + } + + + static void + gray_sweep_direct( RAS_ARG ) + { + int fill = ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) ? 0x100 + : INT_MIN; + int coverage; + int y; + + FT_Span span[FT_MAX_GRAY_SPANS]; + int n = 0; + + + for ( y = ras.min_ey; y < ras.max_ey; y++ ) + { + PCell cell = ras.ycells[y - ras.min_ey]; + TCoord x = ras.min_ex; + TArea cover = 0; + + + for ( ; cell != ras.cell_null; cell = cell->next ) + { + TArea area; + + + if ( cover != 0 && cell->x > x ) + { + FT_FILL_RULE( coverage, cover, fill ); + + span[n].coverage = (unsigned char)coverage; + span[n].x = (short)x; + span[n].len = (unsigned short)( cell->x - x ); + + if ( ++n == FT_MAX_GRAY_SPANS ) + { + /* flush the span buffer and reset the count */ + ras.render_span( y, n, span, ras.render_span_data ); + n = 0; + } + } + + cover += (TArea)cell->cover * ( ONE_PIXEL * 2 ); + area = cover - cell->area; + + if ( area != 0 && cell->x >= ras.min_ex ) + { + FT_FILL_RULE( coverage, area, fill ); + + span[n].coverage = (unsigned char)coverage; + span[n].x = (short)cell->x; + span[n].len = 1; + + if ( ++n == FT_MAX_GRAY_SPANS ) + { + /* flush the span buffer and reset the count */ + ras.render_span( y, n, span, ras.render_span_data ); + n = 0; + } + } + + x = cell->x + 1; + } + + if ( cover != 0 ) /* only if cropped */ + { + FT_FILL_RULE( coverage, cover, fill ); + + span[n].coverage = (unsigned char)coverage; + span[n].x = (short)x; + span[n].len = (unsigned short)( ras.max_ex - x ); + + ++n; + } + + if ( n ) + { + /* flush the span buffer and reset the count */ + ras.render_span( y, n, span, ras.render_span_data ); + n = 0; + } + } + } + + +#ifdef STANDALONE_ + + /************************************************************************** + * + * The following functions should only compile in stand-alone mode, + * i.e., when building this component without the rest of FreeType. + * + */ + + /************************************************************************** + * + * @Function: + * FT_Outline_Decompose + * + * @Description: + * Walk over an outline's structure to decompose it into individual + * segments and Bézier arcs. This function is also able to emit + * `move to' and `close to' operations to indicate the start and end + * of new contours in the outline. + * + * @Input: + * outline :: + * A pointer to the source target. + * + * func_interface :: + * A table of `emitters', i.e., function pointers + * called during decomposition to indicate path + * operations. + * + * @InOut: + * user :: + * A typeless pointer which is passed to each + * emitter during the decomposition. It can be + * used to store the state during the + * decomposition. + * + * @Return: + * Error code. 0 means success. + */ + static int + FT_Outline_Decompose( const FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( (x) * ( 1L << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int error; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + int last; /* index of last point in contour */ + + char tag; /* current point's state */ + + int shift; + TPos delta; + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !func_interface ) + return FT_THROW( Invalid_Argument ); + + shift = func_interface->shift; + delta = func_interface->delta; + + last = -1; + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_TRACE5(( "FT_Outline_Decompose: Contour %d\n", n )); + + first = last + 1; + last = outline->contours[n]; + if ( last < first ) + goto Invalid_Outline; + + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return Smooth_Err_Ok; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error )); + return error; + + Invalid_Outline: + return FT_THROW( Invalid_Outline ); + } + +#endif /* STANDALONE_ */ + + + FT_DEFINE_OUTLINE_FUNCS( + func_interface, + + (FT_Outline_MoveTo_Func) gray_move_to, /* move_to */ + (FT_Outline_LineTo_Func) gray_line_to, /* line_to */ + (FT_Outline_ConicTo_Func)gray_conic_to, /* conic_to */ + (FT_Outline_CubicTo_Func)gray_cubic_to, /* cubic_to */ + + 0, /* shift */ + 0 /* delta */ + ) + + + static int + gray_convert_glyph_inner( RAS_ARG_ + int continued ) + { + volatile int error; + + + if ( ft_setjmp( ras.jump_buffer ) == 0 ) + { + if ( continued ) + FT_Trace_Disable(); + error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); + if ( continued ) + FT_Trace_Enable(); + + FT_TRACE7(( "band [%d..%d]: %td cell%s remaining/\n", + ras.min_ey, + ras.max_ey, + ras.cell_null - ras.cell_free, + ras.cell_null - ras.cell_free == 1 ? "" : "s" )); + } + else + { + error = FT_THROW( Raster_Overflow ); + + FT_TRACE7(( "band [%d..%d]: to be bisected\n", + ras.min_ey, ras.max_ey )); + } + + return error; + } + + + static int + gray_convert_glyph( RAS_ARG ) + { + const TCoord yMin = ras.min_ey; + const TCoord yMax = ras.max_ey; + + TCell buffer[FT_MAX_GRAY_POOL]; + size_t height = (size_t)( yMax - yMin ); + size_t n = FT_MAX_GRAY_POOL / 8; + TCoord y; + TCoord bands[32]; /* enough to accommodate bisections */ + TCoord* band; + + int continued = 0; + + + /* Initialize the null cell at the end of the poll. */ + ras.cell_null = buffer + FT_MAX_GRAY_POOL - 1; + ras.cell_null->x = CELL_MAX_X_VALUE; + ras.cell_null->area = 0; + ras.cell_null->cover = 0; + ras.cell_null->next = NULL; + + /* set up vertical bands */ + ras.ycells = (PCell*)buffer; + + if ( height > n ) + { + /* two divisions rounded up */ + n = ( height + n - 1 ) / n; + height = ( height + n - 1 ) / n; + } + + for ( y = yMin; y < yMax; ) + { + ras.min_ey = y; + y += height; + ras.max_ey = FT_MIN( y, yMax ); + + band = bands; + band[1] = ras.min_ey; + band[0] = ras.max_ey; + + do + { + TCoord width = band[0] - band[1]; + TCoord w; + int error; + + + for ( w = 0; w < width; ++w ) + ras.ycells[w] = ras.cell_null; + + /* memory management: skip ycells */ + n = ( (size_t)width * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) / + sizeof ( TCell ); + + ras.cell_free = buffer + n; + ras.cell = ras.cell_null; + ras.min_ey = band[1]; + ras.max_ey = band[0]; + ras.count_ey = width; + + error = gray_convert_glyph_inner( RAS_VAR_ continued ); + continued = 1; + + if ( !error ) + { + if ( ras.render_span ) /* for FT_RASTER_FLAG_DIRECT only */ + gray_sweep_direct( RAS_VAR ); + else + gray_sweep( RAS_VAR ); + band--; + continue; + } + else if ( error != Smooth_Err_Raster_Overflow ) + return error; + + /* render pool overflow; we will reduce the render band by half */ + width >>= 1; + + /* this should never happen even with tiny rendering pool */ + if ( width == 0 ) + { + FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); + return FT_THROW( Raster_Overflow ); + } + + band++; + band[1] = band[0]; + band[0] += width; + } while ( band >= bands ); + } + + return Smooth_Err_Ok; + } + + + static int + gray_raster_render( FT_Raster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + +#ifndef FT_STATIC_RASTER + gray_TWorker worker[1]; +#endif + + + if ( !raster ) + return FT_THROW( Invalid_Argument ); + + /* this version does not support monochrome rendering */ + if ( !( params->flags & FT_RASTER_FLAG_AA ) ) + return FT_THROW( Cannot_Render_Glyph ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Smooth_Err_Ok; + + if ( !outline->contours || !outline->points ) + return FT_THROW( Invalid_Outline ); + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return FT_THROW( Invalid_Outline ); + + ras.outline = *outline; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + if ( !params->gray_spans ) + return Smooth_Err_Ok; + + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + + ras.min_ex = params->clip_box.xMin; + ras.min_ey = params->clip_box.yMin; + ras.max_ex = params->clip_box.xMax; + ras.max_ey = params->clip_box.yMax; + } + else + { + /* if direct mode is not set, we must have a target bitmap */ + if ( !target_map ) + return FT_THROW( Invalid_Argument ); + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return Smooth_Err_Ok; + + if ( !target_map->buffer ) + return FT_THROW( Invalid_Argument ); + + if ( target_map->pitch < 0 ) + ras.target.origin = target_map->buffer; + else + ras.target.origin = target_map->buffer + + ( target_map->rows - 1 ) * (unsigned int)target_map->pitch; + + ras.target.pitch = target_map->pitch; + + ras.render_span = (FT_Raster_Span_Func)NULL; + ras.render_span_data = NULL; + + ras.min_ex = 0; + ras.min_ey = 0; + ras.max_ex = (FT_Pos)target_map->width; + ras.max_ey = (FT_Pos)target_map->rows; + } + + /* exit if nothing to do */ + if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey ) + return Smooth_Err_Ok; + + return gray_convert_glyph( RAS_VAR ); + } + + + /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ + /**** a static object. *****/ + +#ifdef STANDALONE_ + + static int + gray_raster_new( void* memory, + FT_Raster* araster ) + { + static gray_TRaster the_raster; + + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_ZERO( &the_raster ); + + return 0; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + +#else /* !STANDALONE_ */ + + static int + gray_raster_new( void* memory_, + FT_Raster* araster_ ) + { + FT_Memory memory = (FT_Memory)memory_; + gray_PRaster* araster = (gray_PRaster*)araster_; + + FT_Error error; + gray_PRaster raster = NULL; + + + if ( !FT_NEW( raster ) ) + raster->memory = memory; + + *araster = raster; + + return error; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((gray_PRaster)raster)->memory; + + + FT_FREE( raster ); + } + +#endif /* !STANDALONE_ */ + + + static void + gray_raster_reset( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ) + { + FT_UNUSED( raster ); + FT_UNUSED( pool_base ); + FT_UNUSED( pool_size ); + } + + + static int + gray_raster_set_mode( FT_Raster raster, + unsigned long mode, + void* args ) + { + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( args ); + + + return 0; /* nothing to do */ + } + + + FT_DEFINE_RASTER_FUNCS( + ft_grays_raster, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) gray_raster_new, /* raster_new */ + (FT_Raster_Reset_Func) gray_raster_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)gray_raster_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) gray_raster_render, /* raster_render */ + (FT_Raster_Done_Func) gray_raster_done /* raster_done */ + ) + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/external/freetype/src/smooth/ftgrays.h b/external/freetype/src/smooth/ftgrays.h new file mode 100644 index 000000000..a5001bf40 --- /dev/null +++ b/external/freetype/src/smooth/ftgrays.h @@ -0,0 +1,57 @@ +/**************************************************************************** + * + * ftgrays.h + * + * FreeType smooth renderer declaration + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTGRAYS_H_ +#define FTGRAYS_H_ + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifdef STANDALONE_ +#include "ftimage.h" +#else +#include <ft2build.h> +#include <freetype/ftimage.h> +#endif + + + /************************************************************************** + * + * To make ftgrays.h independent from configuration files we check + * whether FT_EXPORT_VAR has been defined already. + * + * On some systems and compilers (Win32 mostly), an extra keyword is + * necessary to compile the library as a DLL. + */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; + + +#ifdef __cplusplus + } +#endif + +#endif /* FTGRAYS_H_ */ + + +/* END */ diff --git a/external/freetype/src/smooth/ftsmerrs.h b/external/freetype/src/smooth/ftsmerrs.h new file mode 100644 index 000000000..f4ac93dc4 --- /dev/null +++ b/external/freetype/src/smooth/ftsmerrs.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * ftsmerrs.h + * + * smooth renderer error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the smooth renderer error enumeration + * constants. + * + */ + +#ifndef FTSMERRS_H_ +#define FTSMERRS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Smooth_Err_ +#define FT_ERR_BASE FT_Mod_Err_Smooth + +#include <freetype/fterrors.h> + +#endif /* FTSMERRS_H_ */ + + +/* END */ diff --git a/external/freetype/src/smooth/ftsmooth.c b/external/freetype/src/smooth/ftsmooth.c new file mode 100644 index 000000000..9b0e8886c --- /dev/null +++ b/external/freetype/src/smooth/ftsmooth.c @@ -0,0 +1,605 @@ +/**************************************************************************** + * + * ftsmooth.c + * + * Anti-aliasing renderer interface (body). + * + * Copyright (C) 2000-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftoutln.h> +#include "ftsmooth.h" +#include "ftgrays.h" + +#include "ftsmerrs.h" + + + /* sets render-specific mode */ + static FT_Error + ft_smooth_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + /* transform a given glyph image */ + static FT_Error + ft_smooth_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_smooth_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_ZERO( cbox ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + typedef struct TOrigin_ + { + unsigned char* origin; /* pixmap origin at the bottom-left */ + int pitch; /* pitch to go down one row */ + + } TOrigin; + +#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Module module ) /* FT_Renderer */ + { + FT_Renderer render = (FT_Renderer)module; + + FT_Vector* sub = render->root.library->lcd_geometry; + + + /* set up default subpixel geometry for striped RGB panels. */ + sub[0].x = -21; + sub[0].y = 0; + sub[1].x = 0; + sub[1].y = 0; + sub[2].x = 21; + sub[2].y = 0; + + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return 0; + } + + + /* This function writes every third byte in direct rendering mode */ + static void + ft_smooth_lcd_spans( int y, + int count, + const FT_Span* spans, + void* target_ ) /* TOrigin* */ + { + TOrigin* target = (TOrigin*)target_; + + unsigned char* dst_line = target->origin - y * target->pitch; + unsigned char* dst; + unsigned short w; + + + for ( ; count--; spans++ ) + for ( dst = dst_line + spans->x * 3, w = spans->len; w--; dst += 3 ) + *dst = spans->coverage; + } + + + static FT_Error + ft_smooth_raster_lcd( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* sub = render->root.library->lcd_geometry; + FT_Pos x, y; + + FT_Raster_Params params; + TOrigin target; + + + /* Render 3 separate coverage bitmaps, shifting the outline. */ + /* Set up direct rendering to record them on each third byte. */ + params.source = outline; + params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; + params.gray_spans = ft_smooth_lcd_spans; + params.user = &target; + + params.clip_box.xMin = 0; + params.clip_box.yMin = 0; + params.clip_box.xMax = bitmap->width; + params.clip_box.yMax = bitmap->rows; + + if ( bitmap->pitch < 0 ) + target.origin = bitmap->buffer; + else + target.origin = bitmap->buffer + + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch; + + target.pitch = bitmap->pitch; + + FT_Outline_Translate( outline, + -sub[0].x, + -sub[0].y ); + error = render->raster_render( render->raster, &params ); + x = sub[0].x; + y = sub[0].y; + if ( error ) + goto Exit; + + target.origin++; + FT_Outline_Translate( outline, + sub[0].x - sub[1].x, + sub[0].y - sub[1].y ); + error = render->raster_render( render->raster, &params ); + x = sub[1].x; + y = sub[1].y; + if ( error ) + goto Exit; + + target.origin++; + FT_Outline_Translate( outline, + sub[1].x - sub[2].x, + sub[1].y - sub[2].y ); + error = render->raster_render( render->raster, &params ); + x = sub[2].x; + y = sub[2].y; + + Exit: + FT_Outline_Translate( outline, x, y ); + + return error; + } + + + static FT_Error + ft_smooth_raster_lcdv( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + int pitch = bitmap->pitch; + FT_Vector* sub = render->root.library->lcd_geometry; + FT_Pos x, y; + + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + /* Render 3 separate coverage bitmaps, shifting the outline. */ + /* Notice that the subpixel geometry vectors are rotated. */ + /* Triple the pitch to render on each third row. */ + bitmap->pitch *= 3; + bitmap->rows /= 3; + + FT_Outline_Translate( outline, + -sub[0].y, + sub[0].x ); + error = render->raster_render( render->raster, &params ); + x = sub[0].y; + y = -sub[0].x; + if ( error ) + goto Exit; + + bitmap->buffer += pitch; + FT_Outline_Translate( outline, + sub[0].y - sub[1].y, + sub[1].x - sub[0].x ); + error = render->raster_render( render->raster, &params ); + x = sub[1].y; + y = -sub[1].x; + bitmap->buffer -= pitch; + if ( error ) + goto Exit; + + bitmap->buffer += 2 * pitch; + FT_Outline_Translate( outline, + sub[1].y - sub[2].y, + sub[2].x - sub[1].x ); + error = render->raster_render( render->raster, &params ); + x = sub[2].y; + y = -sub[2].x; + bitmap->buffer -= 2 * pitch; + + Exit: + FT_Outline_Translate( outline, x, y ); + + bitmap->pitch /= 3; + bitmap->rows *= 3; + + return error; + } + +#else /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Module module ) /* FT_Renderer */ + { + FT_Renderer render = (FT_Renderer)module; + + + /* set up default LCD filtering */ + FT_Library_SetLcdFilter( render->root.library, FT_LCD_FILTER_DEFAULT ); + + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return 0; + } + + + static FT_Error + ft_smooth_raster_lcd( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* points = outline->points; + FT_Vector* points_end = FT_OFFSET( points, outline->n_points ); + FT_Vector* vec; + + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + /* implode outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->x *= 3; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, &params ); + + /* deflate outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->x /= 3; + + return error; + } + + + static FT_Error + ft_smooth_raster_lcdv( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* points = outline->points; + FT_Vector* points_end = FT_OFFSET( points, outline->n_points ); + FT_Vector* vec; + + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + /* implode outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->y *= 3; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, &params ); + + /* deflate outline */ + for ( vec = points; vec < points_end; vec++ ) + vec->y /= 3; + + return error; + } + +#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + +/* Oversampling scale to be used in rendering overlaps */ +#define SCALE ( 1 << 2 ) + + /* This function averages inflated spans in direct rendering mode */ + static void + ft_smooth_overlap_spans( int y, + int count, + const FT_Span* spans, + void* target_ ) + { + TOrigin* target = (TOrigin*)target_; + + + unsigned char* dst = target->origin - ( y / SCALE ) * target->pitch; + unsigned short x; + unsigned int cover, sum; + + + /* When accumulating the oversampled spans we need to assure that */ + /* fully covered pixels are equal to 255 and do not overflow. */ + /* It is important that the SCALE is a power of 2, each subpixel */ + /* cover can also reach a power of 2 after rounding, and the total */ + /* is clamped to 255 when it adds up to 256. */ + for ( ; count--; spans++ ) + { + cover = ( spans->coverage + SCALE * SCALE / 2 ) / ( SCALE * SCALE ); + for ( x = 0; x < spans->len; x++ ) + { + sum = dst[( spans->x + x ) / SCALE] + cover; + dst[( spans->x + x ) / SCALE] = (unsigned char)( sum - ( sum >> 8 ) ); + } + } + } + + + static FT_Error + ft_smooth_raster_overlap( FT_Renderer render, + FT_Outline* outline, + FT_Bitmap* bitmap ) + { + FT_Error error = FT_Err_Ok; + FT_Vector* points = outline->points; + FT_Vector* points_end = FT_OFFSET( points, outline->n_points ); + FT_Vector* vec; + + FT_Raster_Params params; + TOrigin target; + + + /* Reject outlines that are too wide for 16-bit FT_Span. */ + /* Other limits are applied upstream with the same error code. */ + if ( bitmap->width * SCALE > 0x7FFF ) + return FT_THROW( Raster_Overflow ); + + /* Set up direct rendering to average oversampled spans. */ + params.source = outline; + params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; + params.gray_spans = ft_smooth_overlap_spans; + params.user = &target; + + params.clip_box.xMin = 0; + params.clip_box.yMin = 0; + params.clip_box.xMax = bitmap->width * SCALE; + params.clip_box.yMax = bitmap->rows * SCALE; + + if ( bitmap->pitch < 0 ) + target.origin = bitmap->buffer; + else + target.origin = bitmap->buffer + + ( bitmap->rows - 1 ) * (unsigned int)bitmap->pitch; + + target.pitch = bitmap->pitch; + + /* inflate outline */ + for ( vec = points; vec < points_end; vec++ ) + { + vec->x *= SCALE; + vec->y *= SCALE; + } + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, &params ); + + /* deflate outline */ + for ( vec = points; vec < points_end; vec++ ) + { + vec->x /= SCALE; + vec->y /= SCALE; + } + + return error; + } + +#undef SCALE + + static FT_Error + ft_smooth_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error = FT_Err_Ok; + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Memory memory = render->root.memory; + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* check mode */ + if ( mode != FT_RENDER_MODE_NORMAL && + mode != FT_RENDER_MODE_LIGHT && + mode != FT_RENDER_MODE_LCD && + mode != FT_RENDER_MODE_LCD_V ) + { + error = FT_THROW( Cannot_Render_Glyph ); + goto Exit; + } + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + if ( ft_glyphslot_preset_bitmap( slot, mode, origin ) ) + { + error = FT_THROW( Raster_Overflow ); + goto Exit; + } + + if ( !bitmap->rows || !bitmap->pitch ) + goto Exit; + + /* allocate new one */ + if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + x_shift = 64 * -slot->bitmap_left; + y_shift = 64 * -slot->bitmap_top; + if ( bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + y_shift += 64 * (FT_Int)bitmap->rows / 3; + else + y_shift += 64 * (FT_Int)bitmap->rows; + + if ( origin ) + { + x_shift += origin->x; + y_shift += origin->y; + } + + /* translate outline to render it into the bitmap */ + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, x_shift, y_shift ); + + if ( mode == FT_RENDER_MODE_NORMAL || + mode == FT_RENDER_MODE_LIGHT ) + { + if ( outline->flags & FT_OUTLINE_OVERLAP ) + error = ft_smooth_raster_overlap( render, outline, bitmap ); + else + { + FT_Raster_Params params; + + + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + + error = render->raster_render( render->raster, &params ); + } + } + else + { + if ( mode == FT_RENDER_MODE_LCD ) + error = ft_smooth_raster_lcd ( render, outline, bitmap ); + else if ( mode == FT_RENDER_MODE_LCD_V ) + error = ft_smooth_raster_lcdv( render, outline, bitmap ); + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* finally apply filtering */ + { + FT_Byte* lcd_weights; + FT_Bitmap_LcdFilterFunc lcd_filter_func; + + + /* Per-face LCD filtering takes priority if set up. */ + if ( slot->face && slot->face->internal->lcd_filter_func ) + { + lcd_weights = slot->face->internal->lcd_weights; + lcd_filter_func = slot->face->internal->lcd_filter_func; + } + else + { + lcd_weights = slot->library->lcd_weights; + lcd_filter_func = slot->library->lcd_filter_func; + } + + if ( lcd_filter_func ) + lcd_filter_func( bitmap, lcd_weights ); + } + +#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + } + + Exit: + if ( !error ) + { + /* everything is fine; the glyph is now officially a bitmap */ + slot->format = FT_GLYPH_FORMAT_BITMAP; + } + else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + return error; + } + + + FT_DEFINE_RENDERER( + ft_smooth_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( FT_RendererRec ), + + "smooth", + 0x10000L, + 0x20000L, + + NULL, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&ft_grays_raster /* raster_class */ + ) + + +/* END */ diff --git a/external/freetype/src/smooth/ftsmooth.h b/external/freetype/src/smooth/ftsmooth.h new file mode 100644 index 000000000..f8bdc9938 --- /dev/null +++ b/external/freetype/src/smooth/ftsmooth.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * + * ftsmooth.h + * + * Anti-aliasing renderer interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef FTSMOOTH_H_ +#define FTSMOOTH_H_ + + +#include <freetype/ftrender.h> + + +FT_BEGIN_HEADER + + + FT_DECLARE_RENDERER( ft_smooth_renderer_class ) + + +FT_END_HEADER + +#endif /* FTSMOOTH_H_ */ + + +/* END */ diff --git a/external/freetype/src/smooth/module.mk b/external/freetype/src/smooth/module.mk new file mode 100644 index 000000000..82ab2fa59 --- /dev/null +++ b/external/freetype/src/smooth/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 smooth renderer module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SMOOTH_RENDERER + +define SMOOTH_RENDERER +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/smooth/rules.mk b/external/freetype/src/smooth/rules.mk new file mode 100644 index 000000000..5d89c7540 --- /dev/null +++ b/external/freetype/src/smooth/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 smooth renderer module build rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# smooth driver directory +# +SMOOTH_DIR := $(SRC_DIR)/smooth + + +# compilation flags for the driver +# +SMOOTH_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# smooth driver sources (i.e., C files) +# +SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c \ + $(SMOOTH_DIR)/ftsmooth.c + + +# smooth driver headers +# +SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h) \ + $(SMOOTH_DIR)/ftsmerrs.h + + +# smooth driver object(s) +# +# SMOOTH_DRV_OBJ_M is used during `multi' builds. +# SMOOTH_DRV_OBJ_S is used during `single' builds. +# +SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O) +SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O + +# smooth driver source file for single build +# +SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c + + +# smooth driver - single object +# +$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \ + $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S)) + + +# smooth driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S) +DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/smooth/smooth.c b/external/freetype/src/smooth/smooth.c new file mode 100644 index 000000000..9a0b824c2 --- /dev/null +++ b/external/freetype/src/smooth/smooth.c @@ -0,0 +1,25 @@ +/**************************************************************************** + * + * smooth.c + * + * FreeType anti-aliasing rasterer module component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ftgrays.c" +#include "ftsmooth.c" + + +/* END */ diff --git a/external/freetype/src/svg/ftsvg.c b/external/freetype/src/svg/ftsvg.c new file mode 100644 index 000000000..ba237f638 --- /dev/null +++ b/external/freetype/src/svg/ftsvg.c @@ -0,0 +1,355 @@ +/**************************************************************************** + * + * ftsvg.c + * + * The FreeType SVG renderer interface (body). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftserv.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/otsvg.h> +#include <freetype/internal/svginterface.h> +#include <freetype/ftbbox.h> + +#include "ftsvg.h" +#include "svgtypes.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, usued to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT otsvg + + +#ifdef FT_CONFIG_OPTION_SVG + + /* ft_svg_init */ + static FT_Error + ft_svg_init( FT_Module module ) + { + SVG_Renderer render = (SVG_Renderer)module; + + FT_Error error = FT_Err_Ok; + + + render->loaded = FALSE; + render->hooks_set = FALSE; + + return error; + } + + + static void + ft_svg_done( FT_Module module ) + { + SVG_Renderer render = (SVG_Renderer)module; + + + if ( render->loaded == TRUE && + render->hooks_set == TRUE ) + render->hooks.free_svg( &render->state ); + + render->loaded = FALSE; + } + + + static FT_Error + ft_svg_preset_slot( FT_Module module, + FT_GlyphSlot slot, + FT_Bool cache ) + { + SVG_Renderer svg_renderer = (SVG_Renderer)module; + SVG_RendererHooks hooks = svg_renderer->hooks; + + + if ( svg_renderer->hooks_set == FALSE ) + { + FT_TRACE1(( "Hooks are NOT set. Can't render OT-SVG glyphs\n" )); + return FT_THROW( Missing_SVG_Hooks ); + } + + if ( svg_renderer->loaded == FALSE ) + { + FT_TRACE3(( "ft_svg_preset_slot: first presetting call," + " calling init hook\n" )); + hooks.init_svg( &svg_renderer->state ); + + svg_renderer->loaded = TRUE; + } + + return hooks.preset_slot( slot, cache, &svg_renderer->state ); + } + + + static FT_Error + ft_svg_render( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + SVG_Renderer svg_renderer = (SVG_Renderer)renderer; + + FT_Library library = renderer->root.library; + FT_Memory memory = library->memory; + FT_Error error; + + FT_ULong size_image_buffer; + + SVG_RendererHooks hooks = svg_renderer->hooks; + + + FT_UNUSED( mode ); + FT_UNUSED( origin ); + + if ( mode != FT_RENDER_MODE_NORMAL ) + return FT_THROW( Bad_Argument ); + + if ( svg_renderer->hooks_set == FALSE ) + { + FT_TRACE1(( "Hooks are NOT set. Can't render OT-SVG glyphs\n" )); + return FT_THROW( Missing_SVG_Hooks ); + } + + if ( svg_renderer->loaded == FALSE ) + { + FT_TRACE3(( "ft_svg_render: first rendering, calling init hook\n" )); + error = hooks.init_svg( &svg_renderer->state ); + + svg_renderer->loaded = TRUE; + } + + ft_svg_preset_slot( (FT_Module)renderer, slot, TRUE ); + + size_image_buffer = (FT_ULong)slot->bitmap.pitch * slot->bitmap.rows; + /* No `FT_QALLOC` here since we need a clean, empty canvas */ + /* to start with. */ + if ( FT_ALLOC( slot->bitmap.buffer, size_image_buffer ) ) + return error; + + error = hooks.render_svg( slot, &svg_renderer->state ); + if ( error ) + FT_FREE( slot->bitmap.buffer ); + else + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + return error; + } + + + static const SVG_Interface svg_interface = + { + ft_svg_preset_slot /* Preset_Bitmap_Func preset_slot */ + }; + + + static FT_Error + ft_svg_property_set( FT_Module module, + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + SVG_Renderer renderer = (SVG_Renderer)module; + + + if ( !ft_strcmp( property_name, "svg-hooks" ) ) + { + SVG_RendererHooks* hooks; + + + if ( value_is_string == TRUE ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + hooks = (SVG_RendererHooks*)value; + + if ( !hooks->init_svg || + !hooks->free_svg || + !hooks->render_svg || + !hooks->preset_slot ) + { + FT_TRACE0(( "ft_svg_property_set:" + " SVG rendering hooks not set because\n" )); + FT_TRACE0(( " " + " at least one function pointer is NULL\n" )); + + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + renderer->hooks = *hooks; + renderer->hooks_set = TRUE; + } + else + error = FT_THROW( Missing_Property ); + + Exit: + return error; + } + + + static FT_Error + ft_svg_property_get( FT_Module module, + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + SVG_Renderer renderer = (SVG_Renderer)module; + + + if ( !ft_strcmp( property_name, "svg-hooks" ) ) + { + SVG_RendererHooks* hooks = (SVG_RendererHooks*)value; + + + *hooks = renderer->hooks; + } + else + error = FT_THROW( Missing_Property ); + + return error; + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + ft_svg_service_properties, + + ft_svg_property_set, /* FT_Properties_SetFunc set_property */ + ft_svg_property_get /* FT_Properties_GetFunc get_property */ + ) + + + FT_DEFINE_SERVICEDESCREC1( + ft_svg_services, + FT_SERVICE_ID_PROPERTIES, &ft_svg_service_properties ) + + + FT_CALLBACK_DEF( FT_Module_Interface ) + ft_svg_get_interface( FT_Module module, + const char* ft_svg_interface ) + { + FT_Module_Interface result; + + + FT_UNUSED( module ); + + result = ft_service_list_lookup( ft_svg_services, ft_svg_interface ); + if ( result ) + return result; + + return 0; + } + + + static FT_Error + ft_svg_transform( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* _matrix, + const FT_Vector* _delta ) + { + FT_SVG_Document doc = (FT_SVG_Document)slot->other; + FT_Matrix* matrix = (FT_Matrix*)_matrix; + FT_Vector* delta = (FT_Vector*)_delta; + + FT_Matrix tmp_matrix; + FT_Vector tmp_delta; + + FT_Matrix a, b; + FT_Pos x, y; + + + FT_UNUSED( renderer ); + + if ( !matrix ) + { + tmp_matrix.xx = 0x10000; + tmp_matrix.xy = 0; + tmp_matrix.yx = 0; + tmp_matrix.yy = 0x10000; + + matrix = &tmp_matrix; + } + + if ( !delta ) + { + tmp_delta.x = 0; + tmp_delta.y = 0; + + delta = &tmp_delta; + } + + a = doc->transform; + b = *matrix; + FT_Matrix_Multiply( &b, &a ); + + + x = ADD_LONG( ADD_LONG( FT_MulFix( matrix->xx, doc->delta.x ), + FT_MulFix( matrix->xy, doc->delta.y ) ), + delta->x ); + y = ADD_LONG( ADD_LONG( FT_MulFix( matrix->yx, doc->delta.x ), + FT_MulFix( matrix->yy, doc->delta.y ) ), + delta->y ); + + doc->delta.x = x; + doc->delta.y = y; + doc->transform = a; + + return FT_Err_Ok; + } + +#endif /* FT_CONFIG_OPTION_SVG */ + + +#ifdef FT_CONFIG_OPTION_SVG +#define PUT_SVG_MODULE( a ) a +#define SVG_GLYPH_FORMAT FT_GLYPH_FORMAT_SVG +#else +#define PUT_SVG_MODULE( a ) NULL +#define SVG_GLYPH_FORMAT FT_GLYPH_FORMAT_NONE +#endif + + + FT_DEFINE_RENDERER( + ft_svg_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( SVG_RendererRec ), + + "ot-svg", + 0x10000L, + 0x20000L, + + (const void*)PUT_SVG_MODULE( &svg_interface ), /* module specific interface */ + + PUT_SVG_MODULE( ft_svg_init ), /* FT_Module_Constructor module_init */ + PUT_SVG_MODULE( ft_svg_done ), /* FT_Module_Destructor module_done */ + PUT_SVG_MODULE( ft_svg_get_interface ), /* FT_Module_Requester get_interface */ + + SVG_GLYPH_FORMAT, + + PUT_SVG_MODULE( ft_svg_render ), /* FT_Renderer_RenderFunc render_glyph */ + PUT_SVG_MODULE( ft_svg_transform ), /* FT_Renderer_TransformFunc transform_glyph */ + NULL, /* FT_Renderer_GetCBoxFunc get_glyph_cbox */ + NULL, /* FT_Renderer_SetModeFunc set_mode */ + NULL /* FT_Raster_Funcs* raster_class */ + ) + + +/* END */ diff --git a/external/freetype/src/svg/ftsvg.h b/external/freetype/src/svg/ftsvg.h new file mode 100644 index 000000000..9c496caa1 --- /dev/null +++ b/external/freetype/src/svg/ftsvg.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * ftsvg.h + * + * The FreeType SVG renderer interface (specification). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTSVG_H_ +#define FTSVG_H_ + +#include <ft2build.h> +#include <freetype/ftrender.h> +#include <freetype/internal/ftobjs.h> + + +FT_BEGIN_HEADER + + FT_DECLARE_RENDERER( ft_svg_renderer_class ) + +FT_END_HEADER + +#endif /* FTSVG_H_ */ + + +/* END */ diff --git a/external/freetype/src/svg/module.mk b/external/freetype/src/svg/module.mk new file mode 100644 index 000000000..00beca60f --- /dev/null +++ b/external/freetype/src/svg/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 SVG renderer module definition +# + + +# Copyright (C) 2022-2023 by +# David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SVG_MODULE + +define SVG_MODULE +$(OPEN_DRIVER) FT_Renderer_Class, ft_svg_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)ot-svg $(ECHO_DRIVER_DESC)OT-SVG glyph renderer module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/svg/rules.mk b/external/freetype/src/svg/rules.mk new file mode 100644 index 000000000..4f4409755 --- /dev/null +++ b/external/freetype/src/svg/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 SVG renderer module build rules +# + + +# Copyright (C) 2022-2023 by +# David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# SVG renderer driver directory +# +SVG_DIR := $(SRC_DIR)/svg + +# compilation flags for the driver +# +SVG_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(SVG_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + +# SVG renderer sources (i.e., C files) +# +SVG_DRV_SRC := $(SVG_DIR)/ftsvg.c + + +# SVG renderer headers +# +SVG_DRV_H := $(SVG_DIR)/ftsvg.h \ + $(SVG_DIR)/svgtypes.h + + +# SVG renderer object(s) +# +# SVG_DRV_OBJ_M is used during `multi' builds. +# SVG_DRV_OBJ_S is used during `single' builds. +# +SVG_DRV_OBJ_M := $(SVG_DRV_SRC:$(SVG_DIR)/%.c=$(OBJ_DIR)/%.$O) +SVG_DRV_OBJ_S := $(OBJ_DIR)/svg.$O + +# SVG renderer source file for single build +# +SVG_DRV_SRC_S := $(SVG_DIR)/svg.c + + +# SVG renderer - single object +# +$(SVG_DRV_OBJ_S): $(SVG_DRV_SRC_S) $(SVG_DRV_SRC) \ + $(FREETYPE_H) $(SVG_DRV_H) + $(SVG_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SVG_DRV_SRC_S)) + + +# SVG renderer - multiple objects +# +$(OBJ_DIR)/%.$O: $(SVG_DIR)/%.c $(FREETYPE_H) $(SVG_DRV_H) + $(SVG_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SVG_DRV_OBJ_S) +DRV_OBJS_M += $(SVG_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/svg/svg.c b/external/freetype/src/svg/svg.c new file mode 100644 index 000000000..373c28ed9 --- /dev/null +++ b/external/freetype/src/svg/svg.c @@ -0,0 +1,24 @@ +/**************************************************************************** + * + * svg.c + * + * FreeType SVG renderer module component (body only). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "svgtypes.h" +#include "ftsvg.c" + + +/* END */ diff --git a/external/freetype/src/svg/svgtypes.h b/external/freetype/src/svg/svgtypes.h new file mode 100644 index 000000000..1d608032c --- /dev/null +++ b/external/freetype/src/svg/svgtypes.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * svgtypes.h + * + * The FreeType SVG renderer internal types (specification). + * + * Copyright (C) 2022-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef SVGTYPES_H_ +#define SVGTYPES_H_ + +#include <ft2build.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ftrender.h> +#include <freetype/otsvg.h> + + + typedef struct SVG_RendererRec_ + { + FT_RendererRec root; /* this inherits FT_RendererRec */ + FT_Bool loaded; + FT_Bool hooks_set; + SVG_RendererHooks hooks; /* this holds hooks for SVG rendering */ + FT_Pointer state; /* a place for hooks to store state, if needed */ + + } SVG_RendererRec; + + typedef struct SVG_RendererRec_* SVG_Renderer; + +#endif /* SVGTYPES_H_ */ + + +/* EOF */ diff --git a/external/freetype/src/tools/afblue.pl b/external/freetype/src/tools/afblue.pl new file mode 100644 index 000000000..1098e30ab --- /dev/null +++ b/external/freetype/src/tools/afblue.pl @@ -0,0 +1,551 @@ +#! /usr/bin/perl -w +# -*- Perl -*- +# +# afblue.pl +# +# Process a blue zone character data file. +# +# Copyright (C) 2013-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, +# modified, and distributed under the terms of the FreeType project +# license, LICENSE.TXT. By continuing to use, modify, or distribute +# this file you indicate that you have read the license and +# understand and accept it fully. + +use strict; +use warnings; +use English '-no_match_vars'; +use open ':std', ':encoding(UTF-8)'; + + +my $prog = $PROGRAM_NAME; +$prog =~ s| .* / ||x; # Remove path. + +die "usage: $prog datafile < infile > outfile\n" if $#ARGV != 0; + + +my $datafile = $ARGV[0]; + +my %diversions; # The extracted and massaged data from `datafile'. +my @else_stack; # Booleans to track else-clauses. +my @name_stack; # Stack of integers used for names of aux. variables. + +my $curr_enum; # Name of the current enumeration. +my $curr_array; # Name of the current array. +my $curr_max; # Name of the current maximum value. + +my $curr_enum_element; # Name of the current enumeration element. +my $curr_offset; # The offset relative to current aux. variable. +my $curr_elem_size; # The number of non-space characters in the current string or + # the number of elements in the current block. + +my $have_sections = 0; # Boolean; set if start of a section has been seen. +my $have_strings; # Boolean; set if current section contains strings. +my $have_blocks; # Boolean; set if current section contains blocks. + +my $have_enum_element; # Boolean; set if we have an enumeration element. +my $in_string; # Boolean; set if a string has been parsed. + +my $num_sections = 0; # Number of sections seen so far. + +my $last_aux; # Name of last auxiliary variable. + + +# Regular expressions. + +# [<ws>] <enum_name> <ws> <array_name> <ws> <max_name> [<ws>] ':' [<ws>] '\n' +my $section_re = qr/ ^ \s* (\S+) \s+ (\S+) \s+ (\S+) \s* : \s* $ /x; + +# [<ws>] <enum_element_name> [<ws>] '\n' +my $enum_element_re = qr/ ^ \s* ( [A-Za-z0-9_]+ ) \s* $ /x; + +# '#' <preprocessor directive> '\n' +my $preprocessor_re = qr/ ^ \# /x; + +# [<ws>] '/' '/' <comment> '\n' +my $comment_re = qr| ^ \s* // |x; + +# empty line +my $whitespace_only_re = qr/ ^ \s* $ /x; + +# [<ws>] '"' <string> '"' [<ws>] '\n' (<string> doesn't contain newlines) +my $string_re = qr/ ^ \s* + " ( (?> (?: (?> [^"\\]+ ) | \\. )* ) ) " + \s* $ /x; + +# [<ws>] '{' <block> '}' [<ws>] '\n' (<block> can contain newlines) +my $block_start_re = qr/ ^ \s* \{ /x; + +# We need the capturing group for `split' to make it return the separator +# tokens (i.e., the opening and closing brace) also. +my $brace_re = qr/ ( [{}] ) /x; + + +sub Warn +{ + my $message = shift; + warn "$datafile:$INPUT_LINE_NUMBER: warning: $message\n"; +} + + +sub Die +{ + my $message = shift; + die "$datafile:$INPUT_LINE_NUMBER: error: $message\n"; +} + + +my $warned_before = 0; + +sub warn_before +{ + Warn("data before first section gets ignored") unless $warned_before; + $warned_before = 1; +} + + +sub strip_newline +{ + chomp; + s/ \x0D $ //x; +} + + +sub end_curr_string +{ + # Append final null byte to string. + if ($have_strings) + { + push @{$diversions{$curr_array}}, " '\\0',\n" if $in_string; + + $curr_offset++; + $in_string = 0; + } +} + + +sub update_max_elem_size +{ + if ($curr_elem_size) + { + my $max = pop @{$diversions{$curr_max}}; + $max = $curr_elem_size if $curr_elem_size > $max; + push @{$diversions{$curr_max}}, $max; + } +} + + +sub convert_non_ascii_char +{ + # A UTF-8 character outside of the printable ASCII range, with possibly a + # leading backslash character. + my $s = shift; + + # Here we count characters, not bytes. + $curr_elem_size += length $s; + + utf8::encode($s); + $s = uc unpack 'H*', $s; + + $curr_offset += $s =~ s/\G(..)/'\\x$1', /sg; + + return $s; +} + + +sub convert_ascii_chars +{ + # A series of ASCII characters in the printable range. + my $s = shift; + + # We reduce multiple space characters to a single one. + $s =~ s/ +/ /g; + + # Count all non-space characters. Note that `()' applies a list context + # to the capture that is used to count the elements. + $curr_elem_size += () = $s =~ /[^ ]/g; + + $curr_offset += $s =~ s/\G(.)/'$1', /g; + + return $s; +} + + +sub convert_literal +{ + my $s = shift; + my $orig = $s; + + # ASCII printables and space + my $safe_re = '\x20-\x7E'; + # ASCII printables and space, no backslash + my $safe_no_backslash_re = '\x20-\x5B\x5D-\x7E'; + + $s =~ s{ + (?: \\? ( [^$safe_re] ) + | ( (?: [$safe_no_backslash_re] + | \\ [$safe_re] )+ ) ) + } + { + defined($1) ? convert_non_ascii_char($1) + : convert_ascii_chars($2) + }egx; + + # We assume that `$orig' doesn't contain `*/' + return $s . " /* $orig */"; +} + + +sub aux_name +{ + return "af_blue_" . $num_sections. "_" . join('_', @name_stack); +} + + +sub aux_name_next +{ + $name_stack[$#name_stack]++; + my $name = aux_name(); + $name_stack[$#name_stack]--; + + return $name; +} + + +sub enum_val_string +{ + # Build string that holds code to save the current offset in an + # enumeration element. + my $aux = shift; + + my $add = ($last_aux eq "af_blue_" . $num_sections . "_0" ) + ? "" + : "$last_aux + "; + + return " $aux = $add$curr_offset,\n"; +} + + + +# Process data file. + +open(DATA, $datafile) || die "$prog: can't open \`$datafile': $OS_ERROR\n"; + +while (<DATA>) +{ + strip_newline(); + + next if /$comment_re/; + next if /$whitespace_only_re/; + + if (/$section_re/) + { + Warn("previous section is empty") if ($have_sections + && !$have_strings + && !$have_blocks); + + end_curr_string(); + update_max_elem_size(); + + # Save captured groups from `section_re'. + $curr_enum = $1; + $curr_array = $2; + $curr_max = $3; + + $curr_enum_element = ""; + $curr_offset = 0; + + Warn("overwriting already defined enumeration \`$curr_enum'") + if exists($diversions{$curr_enum}); + Warn("overwriting already defined array \`$curr_array'") + if exists($diversions{$curr_array}); + Warn("overwriting already defined maximum value \`$curr_max'") + if exists($diversions{$curr_max}); + + $diversions{$curr_enum} = []; + $diversions{$curr_array} = []; + $diversions{$curr_max} = []; + + push @{$diversions{$curr_max}}, 0; + + @name_stack = (); + push @name_stack, 0; + + $have_sections = 1; + $have_strings = 0; + $have_blocks = 0; + + $have_enum_element = 0; + $in_string = 0; + + $num_sections++; + $curr_elem_size = 0; + + $last_aux = aux_name(); + + next; + } + + if (/$preprocessor_re/) + { + if ($have_sections) + { + # Having preprocessor conditionals complicates the computation of + # correct offset values. We have to introduce auxiliary enumeration + # elements with the name `af_blue_<s>_<n1>_<n2>_...' that store + # offsets to be used in conditional clauses. `<s>' is the number of + # sections seen so far, `<n1>' is the number of `#if' and `#endif' + # conditionals seen so far in the topmost level, `<n2>' the number of + # `#if' and `#endif' conditionals seen so far one level deeper, etc. + # As a consequence, uneven values are used within a clause, and even + # values after a clause, since the C standard doesn't allow the + # redefinition of an enumeration value. For example, the name + # `af_blue_5_1_6' is used to construct enumeration values in the fifth + # section after the third (second-level) if-clause within the first + # (top-level) if-clause. After the first top-level clause has + # finished, `af_blue_5_2' is used. The current offset is then + # relative to the value stored in the current auxiliary element. + + if (/ ^ \# \s* if /x) + { + push @else_stack, 0; + + $name_stack[$#name_stack]++; + + push @{$diversions{$curr_enum}}, enum_val_string(aux_name()); + $last_aux = aux_name(); + + push @name_stack, 0; + + $curr_offset = 0; + } + elsif (/ ^ \# \s* elif /x) + { + Die("unbalanced #elif") unless @else_stack; + + pop @name_stack; + + push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next()); + $last_aux = aux_name(); + + push @name_stack, 0; + + $curr_offset = 0; + } + elsif (/ ^ \# \s* else /x) + { + my $prev_else = pop @else_stack; + Die("unbalanced #else") unless defined($prev_else); + Die("#else already seen") if $prev_else; + push @else_stack, 1; + + pop @name_stack; + + push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next()); + $last_aux = aux_name(); + + push @name_stack, 0; + + $curr_offset = 0; + } + elsif (/ ^ (\# \s*) endif /x) + { + my $prev_else = pop @else_stack; + Die("unbalanced #endif") unless defined($prev_else); + + pop @name_stack; + + # If there is no else-clause for an if-clause, we add one. This is + # necessary to have correct offsets. + if (!$prev_else) + { + # Use amount of whitespace from `endif'. + push @{$diversions{$curr_enum}}, enum_val_string(aux_name_next()) + . $1 . "else\n"; + $last_aux = aux_name(); + + $curr_offset = 0; + } + + $name_stack[$#name_stack]++; + + push @{$diversions{$curr_enum}}, enum_val_string(aux_name()); + $last_aux = aux_name(); + + $curr_offset = 0; + } + + # Handle (probably continued) preprocessor lines. + CONTINUED_LOOP: + { + do + { + strip_newline(); + + push @{$diversions{$curr_enum}}, $ARG . "\n"; + push @{$diversions{$curr_array}}, $ARG . "\n"; + + last CONTINUED_LOOP unless / \\ $ /x; + + } while (<DATA>); + } + } + else + { + warn_before(); + } + + next; + } + + if (/$enum_element_re/) + { + end_curr_string(); + update_max_elem_size(); + + $curr_enum_element = $1; + $have_enum_element = 1; + $curr_elem_size = 0; + + next; + } + + if (/$string_re/) + { + if ($have_sections) + { + Die("strings and blocks can't be mixed in a section") if $have_blocks; + + # Save captured group from `string_re'. + my $string = $1; + + if ($have_enum_element) + { + push @{$diversions{$curr_enum}}, enum_val_string($curr_enum_element); + $have_enum_element = 0; + } + + $string = convert_literal($string); + + push @{$diversions{$curr_array}}, " $string\n"; + + $have_strings = 1; + $in_string = 1; + } + else + { + warn_before(); + } + + next; + } + + if (/$block_start_re/) + { + if ($have_sections) + { + Die("strings and blocks can't be mixed in a section") if $have_strings; + + my $depth = 0; + my $block = ""; + my $block_end = 0; + + # Count braces while getting the block. + BRACE_LOOP: + { + do + { + strip_newline(); + + foreach my $substring (split(/$brace_re/)) + { + if ($block_end) + { + Die("invalid data after last matching closing brace") + if $substring !~ /$whitespace_only_re/; + } + + $block .= $substring; + + if ($substring eq '{') + { + $depth++; + } + elsif ($substring eq '}') + { + $depth--; + + $block_end = 1 if $depth == 0; + } + } + + # If we are here, we have run out of substrings, so get next line + # or exit. + last BRACE_LOOP if $block_end; + + $block .= "\n"; + + } while (<DATA>); + } + + if ($have_enum_element) + { + push @{$diversions{$curr_enum}}, enum_val_string($curr_enum_element); + $have_enum_element = 0; + } + + push @{$diversions{$curr_array}}, $block . ",\n"; + + $curr_offset++; + $curr_elem_size++; + + $have_blocks = 1; + } + else + { + warn_before(); + } + + next; + } + + # Garbage. We weren't able to parse the data. + Die("syntax error"); +} + +# Finalize data. +end_curr_string(); +update_max_elem_size(); + + +# Filter stdin to stdout, replacing `@...@' templates. + +sub emit_diversion +{ + my $diversion_name = shift; + return (exists($diversions{$1})) ? "@{$diversions{$1}}" + : "@" . $diversion_name . "@"; +} + + +$LIST_SEPARATOR = ''; + +my $s1 = "This file has been generated by the Perl script \`$prog',"; +my $s1len = length $s1; +my $s2 = "using data from file \`$datafile'."; +my $s2len = length $s2; +my $slen = ($s1len > $s2len) ? $s1len : $s2len; + +print "/* " . $s1 . " " x ($slen - $s1len) . " */\n" + . "/* " . $s2 . " " x ($slen - $s2len) . " */\n" + . "\n"; + +while (<STDIN>) +{ + s/ @ ( [A-Za-z0-9_]+? ) @ / emit_diversion($1) /egx; + print; +} + +# EOF diff --git a/external/freetype/src/tools/apinames.c b/external/freetype/src/tools/apinames.c new file mode 100644 index 000000000..dfa258fd7 --- /dev/null +++ b/external/freetype/src/tools/apinames.c @@ -0,0 +1,556 @@ +/* + * This little program is used to parse the FreeType headers and + * find the declaration of all public APIs. This is easy, because + * they all look like the following: + * + * FT_EXPORT( return_type ) + * function_name( function arguments ); + * + * You must pass the list of header files as arguments. Wildcards are + * accepted if you are using GCC for compilation (and probably by + * other compilers too). + * + * Author: FreeType team, 2005-2019 + * + * This code is explicitly placed into the public domain. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <ctype.h> + +#include "vms_shorten_symbol.c" + +#define PROGRAM_NAME "apinames" +#define PROGRAM_VERSION "0.5" + +#define LINEBUFF_SIZE 1024 + + +typedef enum OutputFormat_ +{ + OUTPUT_LIST = 0, /* output the list of names, one per line */ + OUTPUT_WINDOWS_DEF, /* output a Windows .DEF file for Visual C++ or Mingw */ + OUTPUT_BORLAND_DEF, /* output a Windows .DEF file for Borland C++ */ + OUTPUT_WATCOM_LBC, /* output a Watcom Linker Command File */ + OUTPUT_VMS_OPT, /* output an OpenVMS Linker Option File */ + OUTPUT_NETWARE_IMP, /* output a NetWare ImportFile */ + OUTPUT_GNU_VERMAP /* output a version map for GNU or Solaris linker */ + +} OutputFormat; + + +static void +panic( const char* fmt, + ... ) +{ + va_list ap; + + + fprintf( stderr, "PANIC: " ); + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + fprintf( stderr, "\n" ); + + exit(2); +} + + +typedef struct NameRec_ +{ + char* name; + unsigned int hash; + +} NameRec, *Name; + + +static Name the_names; +static int num_names; +static int max_names; + + +static void +names_add( const char* name, + const char* end ) +{ + unsigned int h; + int nn, len; + Name nm; + + + if ( end <= name ) + return; + + /* compute hash value */ + len = (int)( end - name ); + h = 0; + + for ( nn = 0; nn < len; nn++ ) + h = h * 33 + name[nn]; + + /* check for an pre-existing name */ + for ( nn = 0; nn < num_names; nn++ ) + { + nm = the_names + nn; + + if ( (int)nm->hash == h && + memcmp( name, nm->name, len ) == 0 && + nm->name[len] == 0 ) + return; + } + + /* add new name */ + if ( num_names >= max_names ) + { + max_names += ( max_names >> 1 ) + 4; + the_names = (NameRec*)realloc( the_names, + sizeof ( the_names[0] ) * max_names ); + if ( !the_names ) + panic( "not enough memory" ); + } + nm = &the_names[num_names++]; + + nm->hash = h; + nm->name = (char*)malloc( len + 1 ); + if ( !nm->name ) + panic( "not enough memory" ); + + memcpy( nm->name, name, len ); + nm->name[len] = 0; +} + + +static int +name_compare( const void* name1, + const void* name2 ) +{ + Name n1 = (Name)name1; + Name n2 = (Name)name2; + + return strcmp( n1->name, n2->name ); +} + + +static void +names_sort( void ) +{ + qsort( the_names, (size_t)num_names, + sizeof ( the_names[0] ), name_compare ); +} + + +static void +names_dump( FILE* out, + OutputFormat format, + const char* dll_name ) +{ + int nn; + + + switch ( format ) + { + case OUTPUT_WINDOWS_DEF: + if ( dll_name ) + fprintf( out, "LIBRARY %s\n", dll_name ); + + fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); + fprintf( out, "EXPORTS\n" ); + + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, " %s\n", the_names[nn].name ); + + break; + + case OUTPUT_BORLAND_DEF: + if ( dll_name ) + fprintf( out, "LIBRARY %s\n", dll_name ); + + fprintf( out, "DESCRIPTION FreeType 2 DLL\n" ); + fprintf( out, "EXPORTS\n" ); + + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, " _%s\n", the_names[nn].name ); + + break; + + case OUTPUT_WATCOM_LBC: + { + const char* dot; + + + if ( !dll_name ) + { + fprintf( stderr, + "you must provide a DLL name with the -d option!\n" ); + exit( 4 ); + } + + /* we must omit the `.dll' suffix from the library name */ + dot = strchr( dll_name, '.' ); + if ( dot ) + { + char temp[512]; + int len = dot - dll_name; + + + if ( len > (int)( sizeof ( temp ) - 1 ) ) + len = sizeof ( temp ) - 1; + + memcpy( temp, dll_name, len ); + temp[len] = 0; + + dll_name = (const char*)temp; + } + + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "++_%s.%s.%s\n", + the_names[nn].name, dll_name, the_names[nn].name ); + } + + break; + + case OUTPUT_VMS_OPT: + fprintf( out, "case_sensitive=YES\n" ); + + for ( nn = 0; nn < num_names; nn++ ) + { + char short_symbol[32]; + + + if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 ) + panic( "could not shorten name '%s'", the_names[nn].name ); + fprintf( out, "symbol_vector = ( %s = PROCEDURE)\n", short_symbol ); + + /* Also emit a 64-bit symbol, as created by the `vms_auto64` tool. */ + /* It has the string '64__' appended to its name. */ + strcat( the_names[nn].name , "64__" ); + if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 ) + panic( "could not shorten name '%s'", the_names[nn].name ); + fprintf( out, "symbol_vector = ( %s = PROCEDURE)\n", short_symbol ); + } + + break; + + case OUTPUT_NETWARE_IMP: + if ( dll_name ) + fprintf( out, " (%s)\n", dll_name ); + + for ( nn = 0; nn < num_names - 1; nn++ ) + fprintf( out, " %s,\n", the_names[nn].name ); + fprintf( out, " %s\n", the_names[num_names - 1].name ); + + break; + + case OUTPUT_GNU_VERMAP: + fprintf( out, "{\n\tglobal:\n" ); + + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "\t\t%s;\n", the_names[nn].name ); + + fprintf( out, "\tlocal:\n\t\t*;\n};\n" ); + + break; + + default: /* LIST */ + for ( nn = 0; nn < num_names; nn++ ) + fprintf( out, "%s\n", the_names[nn].name ); + + break; + } +} + + +/* states of the line parser */ + +typedef enum State_ +{ + STATE_START = 0, /* waiting for FT_EXPORT keyword and return type */ + STATE_TYPE /* type was read, waiting for function name */ + +} State; + + +static int +read_header_file( FILE* file, + int verbose ) +{ + static char buff[LINEBUFF_SIZE + 1]; + State state = STATE_START; + + + while ( !feof( file ) ) + { + char* p; + + + if ( !fgets( buff, LINEBUFF_SIZE, file ) ) + break; + + p = buff; + + /* skip leading whitespace */ + while ( *p && ( *p == ' ' || *p == '\\' ) ) + p++; + + /* skip empty lines */ + if ( *p == '\n' || *p == '\r' ) + continue; + + switch ( state ) + { + case STATE_START: + if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 ) + break; + + p += 10; + for (;;) + { + if ( *p == 0 || *p == '\n' || *p == '\r' ) + goto NextLine; + + if ( *p == ')' ) + { + p++; + break; + } + + p++; + } + + state = STATE_TYPE; + + /* + * Sometimes, the name is just after `FT_EXPORT(...)', so skip + * whitespace and fall-through if we find an alphanumeric character. + */ + while ( *p == ' ' || *p == '\t' ) + p++; + + if ( !isalpha( *p ) ) + break; + + /* fall-through */ + + case STATE_TYPE: + { + char* name = p; + + + while ( isalnum( *p ) || *p == '_' ) + p++; + + if ( p > name ) + { + if ( verbose ) + fprintf( stderr, ">>> %.*s\n", (int)( p - name ), name ); + + names_add( name, p ); + } + + state = STATE_START; + } + + break; + + default: + ; + } + +NextLine: + ; + } /* end of while loop */ + + return 0; +} + + +static void +usage( void ) +{ + static const char* const format = + "%s %s: extract FreeType API names from header files\n" + "\n" + "This program extracts the list of public FreeType API functions.\n" + "It receives a list of header files as an argument and\n" + "generates a sorted list of unique identifiers in various formats.\n" + "\n" + "usage: %s header1 [options] [header2 ...]\n" + "\n" + "options: - parse the contents of stdin, ignore arguments\n" + " -v verbose mode, output sent to standard error\n" + " -oFILE write output to FILE instead of standard output\n" + " -dNAME indicate DLL file name, 'freetype.dll' by default\n" + " -w output .DEF file for Visual C++ and Mingw\n" + " -wB output .DEF file for Borland C++\n" + " -wW output Watcom Linker Response File\n" + " -wV output OpenVMS Linker Options File\n" + " -wN output NetWare Import File\n" + " -wL output version map for GNU or Solaris linker\n" + "\n"; + + fprintf( stderr, + format, + PROGRAM_NAME, + PROGRAM_VERSION, + PROGRAM_NAME ); + + exit( 1 ); +} + + +int +main( int argc, + const char* const* argv ) +{ + int from_stdin = 0; + int verbose = 0; + OutputFormat format = OUTPUT_LIST; /* the default */ + FILE* out = stdout; + const char* library_name = NULL; + + + if ( argc < 2 ) + usage(); + + /* `-' used as a single argument means read source file from stdin */ + while ( argc > 1 && argv[1][0] == '-' ) + { + const char* arg = argv[1]; + + + switch ( arg[1] ) + { + case 'v': + verbose = 1; + + break; + + case 'o': + if ( arg[2] == 0 ) + { + if ( argc < 2 ) + usage(); + + arg = argv[2]; + argv++; + argc--; + } + else + arg += 2; + + out = fopen( arg, "wt" ); + if ( !out ) + { + fprintf( stderr, "could not open '%s' for writing\n", arg ); + exit( 3 ); + } + + break; + + case 'd': + if ( arg[2] == 0 ) + { + if ( argc < 2 ) + usage(); + + arg = argv[2]; + argv++; + argc--; + } + else + arg += 2; + + library_name = arg; + + break; + + case 'w': + format = OUTPUT_WINDOWS_DEF; + + switch ( arg[2] ) + { + case 'B': + format = OUTPUT_BORLAND_DEF; + break; + + case 'W': + format = OUTPUT_WATCOM_LBC; + break; + + case 'V': + format = OUTPUT_VMS_OPT; + break; + + case 'N': + format = OUTPUT_NETWARE_IMP; + break; + + case 'L': + format = OUTPUT_GNU_VERMAP; + break; + + case 0: + break; + + default: + usage(); + } + + break; + + case 0: + from_stdin = 1; + + break; + + default: + usage(); + } + + argc--; + argv++; + + } /* end of while loop */ + + if ( from_stdin ) + read_header_file( stdin, verbose ); + else + { + for ( --argc, argv++; argc > 0; argc--, argv++ ) + { + FILE* file = fopen( argv[0], "rb" ); + + + if ( !file ) + fprintf( stderr, "unable to open '%s'\n", argv[0] ); + else + { + if ( verbose ) + fprintf( stderr, "opening '%s'\n", argv[0] ); + + read_header_file( file, verbose ); + fclose( file ); + } + } + } + + if ( num_names == 0 ) + panic( "could not find exported functions\n" ); + + names_sort(); + names_dump( out, format, library_name ); + + if ( out != stdout ) + fclose( out ); + + return 0; +} + + +/* END */ diff --git a/external/freetype/src/tools/chktrcmp.py b/external/freetype/src/tools/chktrcmp.py new file mode 100644 index 000000000..d072a8786 --- /dev/null +++ b/external/freetype/src/tools/chktrcmp.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +# +# Check trace components in FreeType 2 source. +# Author: suzuki toshiya, 2009, 2013, 2020 +# +# This code is explicitly into the public domain. + +import sys +import os +import re + +SRC_FILE_LIST = [] +USED_COMPONENT = {} +KNOWN_COMPONENT = {} + +SRC_FILE_DIRS = ["src"] +TRACE_DEF_FILES = ["include/freetype/internal/fttrace.h"] + + +def usage(): + print("Usage: %s [option]" % sys.argv[0]) + print("Search used-but-defined and defined-but-not-used trace_XXX macros") + print("") + print(" --help:") + print(" Show this help") + print("") + print(" --src-dirs=dir1:dir2:...") + print(" Specify the directories of C source files to be checked") + print(" Default is %s" % ":".join(SRC_FILE_DIRS)) + print("") + print(" --def-files=file1:file2:...") + print(" Specify the header files including FT_TRACE_DEF()") + print(" Default is %s" % ":".join(TRACE_DEF_FILES)) + print("") + + +# -------------------------------------------------------------- +# Parse command line options +# +for i in range(1, len(sys.argv)): + if sys.argv[i].startswith("--help"): + usage() + exit(0) + if sys.argv[i].startswith("--src-dirs="): + SRC_FILE_DIRS = sys.argv[i].replace("--src-dirs=", "", 1).split(":") + elif sys.argv[i].startswith("--def-files="): + TRACE_DEF_FILES = sys.argv[i].replace("--def-files=", "", 1).split(":") + +# -------------------------------------------------------------- +# Scan C source and header files using trace macros. +# + +c_pathname_pat = re.compile('^.*\.[ch]$', re.IGNORECASE) +trace_use_pat = re.compile('^[ \t]*#define[ \t]+FT_COMPONENT[ \t]+') + +for d in SRC_FILE_DIRS: + for (p, dlst, flst) in os.walk(d): + for f in flst: + if c_pathname_pat.match(f) is not None: + src_pathname = os.path.join(p, f) + + line_num = 0 + for src_line in open(src_pathname, 'r'): + line_num = line_num + 1 + src_line = src_line.strip() + if trace_use_pat.match(src_line) is not None: + component_name = trace_use_pat.sub('', src_line) + if component_name in USED_COMPONENT: + USED_COMPONENT[component_name]\ + .append("%s:%d" % (src_pathname, line_num)) + else: + USED_COMPONENT[component_name] =\ + ["%s:%d" % (src_pathname, line_num)] + +# -------------------------------------------------------------- +# Scan header file(s) defining trace macros. +# + +trace_def_pat_opn = re.compile('^.*FT_TRACE_DEF[ \t]*\([ \t]*') +trace_def_pat_cls = re.compile('[ \t\)].*$') + +for f in TRACE_DEF_FILES: + line_num = 0 + for hdr_line in open(f, 'r'): + line_num = line_num + 1 + hdr_line = hdr_line.strip() + if trace_def_pat_opn.match(hdr_line) is not None: + component_name = trace_def_pat_opn.sub('', hdr_line) + component_name = trace_def_pat_cls.sub('', component_name) + if component_name in KNOWN_COMPONENT: + print("trace component %s is defined twice," + " see %s and fttrace.h:%d" % + (component_name, KNOWN_COMPONENT[component_name], + line_num)) + else: + KNOWN_COMPONENT[component_name] =\ + "%s:%d" % (os.path.basename(f), line_num) + +# -------------------------------------------------------------- +# Compare the used and defined trace macros. +# + +print("# Trace component used in the implementations but not defined in " + "fttrace.h.") +cmpnt = list(USED_COMPONENT.keys()) +cmpnt.sort() +for c in cmpnt: + if c not in KNOWN_COMPONENT: + print("Trace component %s (used in %s) is not defined." % + (c, ", ".join(USED_COMPONENT[c]))) + +print("# Trace component is defined but not used in the implementations.") +cmpnt = list(KNOWN_COMPONENT.keys()) +cmpnt.sort() +for c in cmpnt: + if c not in USED_COMPONENT: + if c != "any": + print("Trace component %s (defined in %s) is not used." % + (c, KNOWN_COMPONENT[c])) diff --git a/external/freetype/src/tools/cordic.py b/external/freetype/src/tools/cordic.py new file mode 100644 index 000000000..651142988 --- /dev/null +++ b/external/freetype/src/tools/cordic.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +# compute arctangent table for CORDIC computations in fttrigon.c +import math + +# units = 64*65536.0 # don't change !! +units = 180 * 2 ** 16 +scale = units / math.pi +shrink = 1.0 +angles2 = [] + +print("") +print("table of arctan( 1/2^n ) for PI = " + repr(units / 65536.0) + " units") + +for n in range(1, 32): + + x = 0.5 ** n # tangent value + + angle = math.atan(x) # arctangent + angle2 = round(angle * scale) # arctangent in FT_Angle units + + if angle2 <= 0: + break + + angles2.append(repr(int(angle2))) + shrink /= math.sqrt(1 + x * x) + +print(", ".join(angles2)) +print("shrink factor = " + repr(shrink)) +print("shrink factor 2 = " + repr(int(shrink * (2 ** 32)))) +print("expansion factor = " + repr(1 / shrink)) +print("") diff --git a/external/freetype/src/tools/ftrandom/Makefile b/external/freetype/src/tools/ftrandom/Makefile new file mode 100644 index 000000000..24dc49c56 --- /dev/null +++ b/external/freetype/src/tools/ftrandom/Makefile @@ -0,0 +1,45 @@ +# TOP_DIR and OBJ_DIR should be set by the user to the right directories, +# if necessary. + +TOP_DIR ?= ../../.. +OBJ_DIR ?= $(TOP_DIR)/objs + + +# The setup below is for gcc on a Unix-like platform, +# where FreeType has been set up to create a static library +# (which is the default). + +VPATH = $(OBJ_DIR) \ + $(OBJ_DIR)/.libs + +SRC_DIR = $(TOP_DIR)/src/tools/ftrandom + +CC = gcc +WFLAGS = -Wmissing-prototypes \ + -Wunused \ + -Wimplicit \ + -Wreturn-type \ + -Wparentheses \ + -pedantic \ + -Wformat \ + -Wchar-subscripts \ + -Wsequence-point +CFLAGS = $(WFLAGS) \ + -g +INCLUDES = -I $(TOP_DIR)/include +LDFLAGS = +LIBS = -lm \ + -lz \ + -lpng \ + -lbz2 \ + -lharfbuzz + +all: $(OBJ_DIR)/ftrandom + +$(OBJ_DIR)/ftrandom.o: $(SRC_DIR)/ftrandom.c + $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< + +$(OBJ_DIR)/ftrandom: $(OBJ_DIR)/ftrandom.o libfreetype.a + $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) + +# EOF diff --git a/external/freetype/src/tools/ftrandom/README b/external/freetype/src/tools/ftrandom/README new file mode 100644 index 000000000..7c610864b --- /dev/null +++ b/external/freetype/src/tools/ftrandom/README @@ -0,0 +1,69 @@ +ftrandom +======== + +This program expects a set of directories containing good fonts, and a set +of extensions of fonts to be tested. It will randomly pick a font, copy it, +introduce an error and then test it. + +The FreeType tests are quite basic; for each erroneous font ftrandom + + . forks off a new tester, + . initializes the library, + . opens each font in the file, + . loads each glyph, + . optionally reviews the contours of the glyph, + . optionally rasterizes the glyph, and + . closes the face. + +If a tester takes longer than 20 seconds, ftrandom saves the erroneous font +and continues. If the tester exits normally or with an error, then the +superstructure removes the test font and continues. + + +Command line options +-------------------- + + --all Test every font in the directory(ies) no matter + what its extension. + --check-outlines Call `FT_Outline_Decompose' on each glyph. + --dir <dir> Append <dir> to the list of directories to search + for good fonts. No recursive search. + --error-count <cnt> Introduce <cnt> single-byte errors into the + erroneous fonts (default: 1). + --error-fraction <frac> Multiply the file size of the font by <frac> and + introduce that many errors into the erroneous + font file. <frac> should be in the range [0;1] + (default: 0.0). + --ext <ext> Add <ext> to the set of font types tested. + --help Print out this list of options. + --nohints Specify FT_LOAD_NO_HINTING when loading glyphs. + --rasterize Call `FT_Render_Glyph' as well as loading it. + --result <dir> This is the directory in which test files are + placed. + --test <file> Run a single test on a pre-generated testcase. + This is done in the current process so it can be + debugged more easily. + +The default font extensions tested by ftrandom are + + .ttf .otf .ttc .cid .pfb .pfa .bdf .pcf .pfr .fon .otb .cff + +The default font directory is controlled by the macro `GOOD_FONTS_DIR' in +the source code (and can be thus specified during compilation); its default +value is + + /usr/local/share/fonts + +The default result directory is `results' (in the current directory). + + +Compilation +----------- + +Two possible solutions. + +. Run ftrandom within a debugging tool like `valgrind' to catch various + memory issues. + +. Compile FreeType with sanitizer flags as provided by gcc or clang, for + example, then link it with ftrandom. diff --git a/external/freetype/src/tools/ftrandom/ftrandom.c b/external/freetype/src/tools/ftrandom/ftrandom.c new file mode 100644 index 000000000..0ee765e52 --- /dev/null +++ b/external/freetype/src/tools/ftrandom/ftrandom.c @@ -0,0 +1,720 @@ +/* Copyright (C) 2005, 2007, 2008, 2013 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* modified by Werner Lemberg <wl@gnu.org> */ +/* This file is now part of the FreeType library */ + + +#define _XOPEN_SOURCE 600 /* for `kill', `strdup', `random', and `srandom' */ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <unistd.h> +#include <dirent.h> +#include <signal.h> +#include <time.h> + +#include <ft2build.h> +#include <freetype/freetype.h> +#include <freetype/ftoutln.h> + +#define true 1 +#define false 0 +#define forever for (;;) + + + static int check_outlines = false; + static int nohints = false; + static int rasterize = false; + static char* results_dir = "results"; + +#define GOOD_FONTS_DIR "/usr/local/share/fonts" + + static char* default_dir_list[] = + { + GOOD_FONTS_DIR, + NULL + }; + + static char* default_ext_list[] = + { + "ttf", + "otf", + "ttc", + "cid", + "pfb", + "pfa", + "bdf", + "pcf", + "pfr", + "fon", + "otb", + "cff", + NULL + }; + + static unsigned int error_count = 1; + static double error_fraction = 0.0; + + static FT_F26Dot6 font_size = 12 * 64; + + static struct fontlist + { + char* name; + long len; + unsigned int isbinary: 1; + unsigned int isascii: 1; + unsigned int ishex: 1; + + } *fontlist; + + static unsigned int fcnt; + + + static int + FT_MoveTo( const FT_Vector *to, + void *user ) + { + FT_UNUSED( to ); + FT_UNUSED( user ); + + return 0; + } + + + static int + FT_LineTo( const FT_Vector *to, + void *user ) + { + FT_UNUSED( to ); + FT_UNUSED( user ); + + return 0; + } + + + static int + FT_ConicTo( const FT_Vector *_cp, + const FT_Vector *to, + void *user ) + { + FT_UNUSED( _cp ); + FT_UNUSED( to ); + FT_UNUSED( user ); + + return 0; + } + + + static int + FT_CubicTo( const FT_Vector *cp1, + const FT_Vector *cp2, + const FT_Vector *to, + void *user ) + { + FT_UNUSED( cp1 ); + FT_UNUSED( cp2 ); + FT_UNUSED( to ); + FT_UNUSED( user ); + + return 0; + } + + + static FT_Outline_Funcs outlinefuncs = + { + FT_MoveTo, + FT_LineTo, + FT_ConicTo, + FT_CubicTo, + 0, 0 /* No shift, no delta */ + }; + + + static void + TestFace( FT_Face face ) + { + unsigned int gid; + int load_flags = FT_LOAD_DEFAULT; + + + if ( check_outlines && + FT_IS_SCALABLE( face ) ) + load_flags = FT_LOAD_NO_BITMAP; + + if ( nohints ) + load_flags |= FT_LOAD_NO_HINTING; + + FT_Set_Char_Size( face, 0, font_size, 72, 72 ); + + for ( gid = 0; gid < face->num_glyphs; gid++ ) + { + if ( check_outlines && + FT_IS_SCALABLE( face ) ) + { + if ( !FT_Load_Glyph( face, gid, load_flags ) ) + FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL ); + } + else + FT_Load_Glyph( face, gid, load_flags ); + + if ( rasterize ) + FT_Render_Glyph( face->glyph, ft_render_mode_normal ); + } + + FT_Done_Face( face ); + } + + + static void + ExecuteTest( char* testfont ) + { + FT_Library context; + FT_Face face; + + + if ( FT_Init_FreeType( &context ) ) + { + fprintf( stderr, "Can't initialize FreeType.\n" ); + exit( 1 ); + } + + if ( FT_New_Face( context, testfont, 0, &face ) ) + { + /* The font is erroneous, so if this fails that's ok. */ + exit( 0 ); + } + + if ( face->num_faces == 1 ) + TestFace( face ); + else + { + long i, num; + + + num = face->num_faces; + FT_Done_Face( face ); + + for ( i = 0; i < num; i++ ) + { + if ( !FT_New_Face( context, testfont, i, &face ) ) + TestFace( face ); + } + } + + FT_Done_FreeType( context ); + + exit( 0 ); + } + + + static int + extmatch( char* filename, + char** extensions ) + { + int i; + char* pt; + + + if ( !extensions ) + return true; + + pt = strrchr( filename, '.' ); + if ( !pt ) + return false; + if ( pt < strrchr( filename, '/' ) ) + return false; + + for ( i = 0; extensions[i] != NULL; i++ ) + if ( strcasecmp( pt + 1, extensions[i] ) == 0 || + strcasecmp( pt, extensions[i] ) == 0 ) + return true; + + return false; + } + + + static void + figurefiletype( struct fontlist* item ) + { + FILE* foo; + + + item->isbinary = item->isascii = item->ishex = false; + + foo = fopen( item->name, "rb" ); + if ( foo ) + { + /* Try to guess the file type from the first few characters... */ + int ch1 = getc( foo ); + int ch2 = getc( foo ); + int ch3 = getc( foo ); + int ch4 = getc( foo ); + + + fclose( foo ); + + if ( ( ch1 == 0 && ch2 == 1 && ch3 == 0 && ch4 == 0 ) || + ( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) || + ( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) || + ( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) ) + { + /* ttf, otf, ttc files */ + item->isbinary = true; + } + else if ( ch1 == 0x80 && ch2 == '\01' ) + { + /* PFB header */ + item->isbinary = true; + } + else if ( ch1 == '%' && ch2 == '!' ) + { + /* Random PostScript */ + if ( strstr( item->name, ".pfa" ) || + strstr( item->name, ".PFA" ) ) + item->ishex = true; + else + item->isascii = true; + } + else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 ) + { + /* Bare CFF */ + item->isbinary = true; + } + else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' ) + { + /* BDF */ + item->ishex = true; + } + else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' ) + { + /* PFR */ + item->isbinary = true; + } + else if ( ( ch1 == '\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) || + ( ch1 == 'M' && ch2 == 'Z' ) ) + { + /* Windows FON */ + item->isbinary = true; + } + else + { + fprintf( stderr, + "Can't recognize file type of `%s', assuming binary\n", + item->name ); + item->isbinary = true; + } + } + else + { + fprintf( stderr, "Can't open `%s' for typing the file.\n", + item->name ); + item->isbinary = true; + } + } + + + static void + FindFonts( char** fontdirs, + char** extensions ) + { + int i; + unsigned int max; + char buffer[1025]; + struct stat statb; + + + max = 0; + fcnt = 0; + + for ( i = 0; fontdirs[i] != NULL; i++ ) + { + DIR* examples; + struct dirent* ent; + + + examples = opendir( fontdirs[i] ); + if ( !examples ) + { + fprintf( stderr, + "Can't open example font directory `%s'\n", + fontdirs[i] ); + exit( 1 ); + } + + while ( ( ent = readdir( examples ) ) != NULL ) + { + snprintf( buffer, sizeof ( buffer ), + "%s/%s", fontdirs[i], ent->d_name ); + if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) ) + continue; + if ( !extensions || extmatch( buffer, extensions ) ) + { + if ( fcnt >= max ) + { + max += 100; + fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) ); + if ( !fontlist ) + { + fprintf( stderr, "Can't allocate memory\n" ); + exit( 1 ); + } + } + + fontlist[fcnt].name = strdup( buffer ); + fontlist[fcnt].len = statb.st_size; + + figurefiletype( &fontlist[fcnt] ); + fcnt++; + } + } + + closedir( examples ); + } + + if ( fcnt == 0 ) + { + fprintf( stderr, "Can't find matching font files.\n" ); + exit( 1 ); + } + + fontlist[fcnt].name = NULL; + } + + + static unsigned int + getErrorCnt( struct fontlist* item ) + { + if ( error_count == 0 && error_fraction == 0.0 ) + return 0; + + return error_count + (unsigned int)( error_fraction * item->len ); + } + + + static int + getRandom( int low, + int high ) + { + if ( low - high < 0x10000L ) + return low + ( ( random() >> 8 ) % ( high + 1 - low ) ); + + return low + ( random() % ( high + 1 - low ) ); + } + + + static int + copyfont( struct fontlist* item, + char* newfont ) + { + static char buffer[8096]; + FILE *good, *newf; + size_t len; + unsigned int i, err_cnt; + + + good = fopen( item->name, "r" ); + if ( !good ) + { + fprintf( stderr, "Can't open `%s'\n", item->name ); + return false; + } + + newf = fopen( newfont, "w+" ); + if ( !newf ) + { + fprintf( stderr, "Can't create temporary output file `%s'\n", + newfont ); + exit( 1 ); + } + + while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 ) + fwrite( buffer, 1, len, newf ); + + fclose( good ); + + err_cnt = getErrorCnt( item ); + for ( i = 0; i < err_cnt; i++ ) + { + fseek( newf, getRandom( 0, (int)( item->len - 1 ) ), SEEK_SET ); + + if ( item->isbinary ) + putc( getRandom( 0, 0xFF ), newf ); + else if ( item->isascii ) + putc( getRandom( 0x20, 0x7E ), newf ); + else + { + int hex = getRandom( 0, 15 ); + + + if ( hex < 10 ) + hex += '0'; + else + hex += 'A' - 10; + + putc( hex, newf ); + } + } + + if ( ferror( newf ) ) + { + fclose( newf ); + unlink( newfont ); + return false; + } + + fclose( newf ); + + return true; + } + + + static int child_pid; + + static void + abort_test( int sig ) + { + FT_UNUSED( sig ); + + /* If a time-out happens, then kill the child */ + kill( child_pid, SIGFPE ); + write( 2, "Timeout... ", 11 ); + } + + + static void + do_test( void ) + { + int i = getRandom( 0, (int)( fcnt - 1 ) ); + static int test_num = 0; + char buffer[1024]; + + + snprintf( buffer, 1024, "%s/test%d", results_dir, test_num++ ); + + if ( copyfont ( &fontlist[i], buffer ) ) + { + signal( SIGALRM, abort_test ); + /* Anything that takes more than 20 seconds */ + /* to parse and/or rasterize is an error. */ + alarm( 20 ); + if ( ( child_pid = fork() ) == 0 ) + ExecuteTest( buffer ); + else if ( child_pid != -1 ) + { + int status; + + + waitpid( child_pid, &status, 0 ); + alarm( 0 ); + if ( WIFSIGNALED ( status ) ) + printf( "Error found in file `%s'\n", buffer ); + else + unlink( buffer ); + } + else + { + fprintf( stderr, "Can't fork test case.\n" ); + exit( 1 ); + } + alarm( 0 ); + } + } + + + static void + usage( FILE* out, + char* name ) + { + char** d = default_dir_list; + char** e = default_ext_list; + + + fprintf( out, "%s [options] -- Generate random erroneous fonts\n" + " and attempt to parse them with FreeType.\n\n", name ); + + fprintf( out, " --all All non-directory files are assumed to be fonts.\n" ); + fprintf( out, " --check-outlines Make sure we can parse the outlines of each glyph.\n" ); + fprintf( out, " --dir <path> Append <path> to list of font search directories\n" + " (no recursive search).\n" ); + fprintf( out, " --error-count <cnt> Introduce <cnt> single byte errors into each font\n" + " (default: 1)\n" ); + fprintf( out, " --error-fraction <frac> Introduce <frac>*filesize single byte errors\n" + " into each font (default: 0.0).\n" ); + fprintf( out, " --ext <ext> Add <ext> to list of extensions indicating fonts.\n" ); + fprintf( out, " --help Print this.\n" ); + fprintf( out, " --nohints Turn off hinting.\n" ); + fprintf( out, " --rasterize Attempt to rasterize each glyph.\n" ); + fprintf( out, " --results <path> Place the created test fonts into <path>\n" + " (default: `results')\n" ); + fprintf( out, " --size <float> Use the given font size for the tests.\n" ); + fprintf( out, " --test <file> Run a single test on an already existing file.\n" ); + fprintf( out, "\n" ); + + fprintf( out, "Default font extensions:\n" ); + fprintf( out, " " ); + while ( *e ) + fprintf( out, " .%s", *e++ ); + fprintf( out, "\n" ); + + fprintf( out, "Default font directories:\n" ); + fprintf( out, " " ); + while ( *d ) + fprintf( out, " %s", *d++ ); + fprintf( out, "\n" ); + } + + + int + main( int argc, + char** argv ) + { + char **dirs, **exts; + int dcnt = 0, ecnt = 0, rset = false, allexts = false; + int i; + time_t now; + char* testfile = NULL; + + + dirs = calloc( (size_t)( argc + 1 ), sizeof ( char ** ) ); + exts = calloc( (size_t)( argc + 1 ), sizeof ( char ** ) ); + + for ( i = 1; i < argc; i++ ) + { + char* pt = argv[i]; + char* end; + + + if ( pt[0] == '-' && pt[1] == '-' ) + pt++; + + if ( strcmp( pt, "-all" ) == 0 ) + allexts = true; + else if ( strcmp( pt, "-check-outlines" ) == 0 ) + check_outlines = true; + else if ( strcmp( pt, "-dir" ) == 0 ) + dirs[dcnt++] = argv[++i]; + else if ( strcmp( pt, "-error-count" ) == 0 ) + { + if ( !rset ) + error_fraction = 0.0; + rset = true; + error_count = (unsigned int)strtoul( argv[++i], &end, 10 ); + if ( *end != '\0' ) + { + fprintf( stderr, "Bad value for error-count: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-error-fraction" ) == 0 ) + { + if ( !rset ) + error_count = 0; + rset = true; + error_fraction = strtod( argv[++i], &end ); + if ( *end != '\0' ) + { + fprintf( stderr, "Bad value for error-fraction: %s\n", argv[i] ); + exit( 1 ); + } + if ( error_fraction < 0.0 || error_fraction > 1.0 ) + { + fprintf( stderr, "error-fraction must be in the range [0;1]\n" ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-ext" ) == 0 ) + exts[ecnt++] = argv[++i]; + else if ( strcmp( pt, "-help" ) == 0 ) + { + usage( stdout, argv[0] ); + exit( 0 ); + } + else if ( strcmp( pt, "-nohints" ) == 0 ) + nohints = true; + else if ( strcmp( pt, "-rasterize" ) == 0 ) + rasterize = true; + else if ( strcmp( pt, "-results" ) == 0 ) + results_dir = argv[++i]; + else if ( strcmp( pt, "-size" ) == 0 ) + { + font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 ); + if ( *end != '\0' || font_size < 64 ) + { + fprintf( stderr, "Bad value for size: %s\n", argv[i] ); + exit( 1 ); + } + } + else if ( strcmp( pt, "-test" ) == 0 ) + testfile = argv[++i]; + else + { + usage( stderr, argv[0] ); + exit( 1 ); + } + } + + if ( allexts ) + { + free( exts ); + exts = NULL; + } + else if ( ecnt == 0 ) + { + free( exts ); + exts = default_ext_list; + } + + if ( dcnt == 0 ) + { + free( dirs ); + dirs = default_dir_list; + } + + if ( testfile ) + ExecuteTest( testfile ); /* This should never return */ + + time( &now ); + srandom( (unsigned int)now ); + + FindFonts( dirs, exts ); + mkdir( results_dir, 0755 ); + + forever + do_test(); + + return 0; + } + + +/* EOF */ diff --git a/external/freetype/src/tools/glnames.py b/external/freetype/src/tools/glnames.py new file mode 100644 index 000000000..41509dbc2 --- /dev/null +++ b/external/freetype/src/tools/glnames.py @@ -0,0 +1,5533 @@ +#!/usr/bin/env python3 + +# +# FreeType 2 glyph name builder +# +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +""" +usage: %s <output-file> + + This python script generates the glyph names tables defined in the + `psnames' module. + + Its single argument is the name of the header file to be created. +""" + +import os.path +import struct +import sys + +# This table lists the glyphs according to the Macintosh specification. +# It is used by the TrueType Postscript names table. +# +# See +# +# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6post.html +# +# for the official list. +# +mac_standard_names = [ + # 0 + ".notdef", ".null", "nonmarkingreturn", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + + # 10 + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + + # 20 + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + + # 30 + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + + # 40 + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + + # 50 + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + + # 60 + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + + # 70 + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + + # 80 + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + + # 90 + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + + # 100 + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + + # 110 + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + + # 120 + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + + # 130 + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + + # 140 + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + + # 150 + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + + # 160 + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + + # 170 + "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + + # 180 + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + + # 190 + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", + "Acircumflex", + + # 200 + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + + # 210 + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + + # 220 + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + + # 230 + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + + # 240 + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + + # 250 + "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dcroat" +] + +# The list of standard `SID' glyph names. For the official list, +# see Annex A of document at +# +# https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf +# +sid_standard_names = [ + # 0 + ".notdef", "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", "parenleft", + + # 10 + "parenright", "asterisk", "plus", "comma", "hyphen", + "period", "slash", "zero", "one", "two", + + # 20 + "three", "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", "less", + + # 30 + "equal", "greater", "question", "at", "A", + "B", "C", "D", "E", "F", + + # 40 + "G", "H", "I", "J", "K", + "L", "M", "N", "O", "P", + + # 50 + "Q", "R", "S", "T", "U", + "V", "W", "X", "Y", "Z", + + # 60 + "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", + "quoteleft", "a", "b", "c", "d", + + # 70 + "e", "f", "g", "h", "i", + "j", "k", "l", "m", "n", + + # 80 + "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", + + # 90 + "y", "z", "braceleft", "bar", "braceright", + "asciitilde", "exclamdown", "cent", "sterling", "fraction", + + # 100 + "yen", "florin", "section", "currency", "quotesingle", + "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", + + # 110 + "fl", "endash", "dagger", "daggerdbl", "periodcentered", + "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", + + # 120 + "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", + "acute", "circumflex", "tilde", "macron", "breve", + + # 130 + "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", + "ogonek", "caron", "emdash", "AE", "ordfeminine", + + # 140 + "Lslash", "Oslash", "OE", "ordmasculine", "ae", + "dotlessi", "lslash", "oslash", "oe", "germandbls", + + # 150 + "onesuperior", "logicalnot", "mu", "trademark", "Eth", + "onehalf", "plusminus", "Thorn", "onequarter", "divide", + + # 160 + "brokenbar", "degree", "thorn", "threequarters", "twosuperior", + "registered", "minus", "eth", "multiply", "threesuperior", + + # 170 + "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", + "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", + + # 180 + "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", + "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", + + # 190 + "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", + "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", + + # 200 + "aacute", "acircumflex", "adieresis", "agrave", "aring", + "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", + + # 210 + "egrave", "iacute", "icircumflex", "idieresis", "igrave", + "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", + + # 220 + "otilde", "scaron", "uacute", "ucircumflex", "udieresis", + "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", + + # 230 + "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", + "Acutesmall", + "parenleftsuperior", "parenrightsuperior", "twodotenleader", + "onedotenleader", "zerooldstyle", + + # 240 + "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", + "commasuperior", + + # 250 + "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", + "bsuperior", + "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", + + # 260 + "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", + "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", + + # 270 + "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", + "Asmall", + "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", + + # 280 + "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", + "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", + + # 290 + "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", + "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", + + # 300 + "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", + "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", + "Dieresissmall", + + # 310 + "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", + "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", + "questiondownsmall", + + # 320 + "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", + "twothirds", "zerosuperior", "foursuperior", "fivesuperior", + "sixsuperior", + + # 330 + "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", + "oneinferior", + "twoinferior", "threeinferior", "fourinferior", "fiveinferior", + "sixinferior", + + # 340 + "seveninferior", "eightinferior", "nineinferior", "centinferior", + "dollarinferior", + "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", + "Acircumflexsmall", + + # 350 + "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", + "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", + "Igravesmall", + + # 360 + "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", + "Ntildesmall", + "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", + "Odieresissmall", + + # 370 + "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", + "001.000", + + # 380 + "001.001", "001.002", "001.003", "Black", "Bold", + "Book", "Light", "Medium", "Regular", "Roman", + + # 390 + "Semibold" +] + +# This table maps character codes of the Adobe Standard Type 1 +# encoding to glyph indices in the sid_standard_names table. +# +t1_standard_encoding = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, + 0, 123, 0, 124, 125, 126, 127, 128, 129, 130, + + 131, 0, 132, 133, 0, 134, 135, 136, 137, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 138, 0, 139, 0, 0, + 0, 0, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, + + 148, 149, 0, 0, 0, 0 +] + +# This table maps character codes of the Adobe Expert Type 1 +# encoding to glyph indices in the sid_standard_names table. +# +t1_expert_encoding = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, 239, 240, + + 241, 242, 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 252, 0, 253, 254, 255, 256, 257, + 0, 0, 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, 110, 267, + 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, + + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, 309, 310, + 311, 0, 312, 0, 0, 313, 0, 0, 314, 315, + 0, 0, 316, 317, 318, 0, 0, 0, 158, 155, + 163, 319, 320, 321, 322, 323, 324, 325, 0, 0, + + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + + 373, 374, 375, 376, 377, 378 +] + +# This data has been taken literally from the files `glyphlist.txt' +# and `zapfdingbats.txt' version 2.0, Sept 2002. It is available from +# +# https://github.com/adobe-type-tools/agl-aglfn +# +adobe_glyph_list = """\ +A;0041 +AE;00C6 +AEacute;01FC +AEmacron;01E2 +AEsmall;F7E6 +Aacute;00C1 +Aacutesmall;F7E1 +Abreve;0102 +Abreveacute;1EAE +Abrevecyrillic;04D0 +Abrevedotbelow;1EB6 +Abrevegrave;1EB0 +Abrevehookabove;1EB2 +Abrevetilde;1EB4 +Acaron;01CD +Acircle;24B6 +Acircumflex;00C2 +Acircumflexacute;1EA4 +Acircumflexdotbelow;1EAC +Acircumflexgrave;1EA6 +Acircumflexhookabove;1EA8 +Acircumflexsmall;F7E2 +Acircumflextilde;1EAA +Acute;F6C9 +Acutesmall;F7B4 +Acyrillic;0410 +Adblgrave;0200 +Adieresis;00C4 +Adieresiscyrillic;04D2 +Adieresismacron;01DE +Adieresissmall;F7E4 +Adotbelow;1EA0 +Adotmacron;01E0 +Agrave;00C0 +Agravesmall;F7E0 +Ahookabove;1EA2 +Aiecyrillic;04D4 +Ainvertedbreve;0202 +Alpha;0391 +Alphatonos;0386 +Amacron;0100 +Amonospace;FF21 +Aogonek;0104 +Aring;00C5 +Aringacute;01FA +Aringbelow;1E00 +Aringsmall;F7E5 +Asmall;F761 +Atilde;00C3 +Atildesmall;F7E3 +Aybarmenian;0531 +B;0042 +Bcircle;24B7 +Bdotaccent;1E02 +Bdotbelow;1E04 +Becyrillic;0411 +Benarmenian;0532 +Beta;0392 +Bhook;0181 +Blinebelow;1E06 +Bmonospace;FF22 +Brevesmall;F6F4 +Bsmall;F762 +Btopbar;0182 +C;0043 +Caarmenian;053E +Cacute;0106 +Caron;F6CA +Caronsmall;F6F5 +Ccaron;010C +Ccedilla;00C7 +Ccedillaacute;1E08 +Ccedillasmall;F7E7 +Ccircle;24B8 +Ccircumflex;0108 +Cdot;010A +Cdotaccent;010A +Cedillasmall;F7B8 +Chaarmenian;0549 +Cheabkhasiancyrillic;04BC +Checyrillic;0427 +Chedescenderabkhasiancyrillic;04BE +Chedescendercyrillic;04B6 +Chedieresiscyrillic;04F4 +Cheharmenian;0543 +Chekhakassiancyrillic;04CB +Cheverticalstrokecyrillic;04B8 +Chi;03A7 +Chook;0187 +Circumflexsmall;F6F6 +Cmonospace;FF23 +Coarmenian;0551 +Csmall;F763 +D;0044 +DZ;01F1 +DZcaron;01C4 +Daarmenian;0534 +Dafrican;0189 +Dcaron;010E +Dcedilla;1E10 +Dcircle;24B9 +Dcircumflexbelow;1E12 +Dcroat;0110 +Ddotaccent;1E0A +Ddotbelow;1E0C +Decyrillic;0414 +Deicoptic;03EE +Delta;2206 +Deltagreek;0394 +Dhook;018A +Dieresis;F6CB +DieresisAcute;F6CC +DieresisGrave;F6CD +Dieresissmall;F7A8 +Digammagreek;03DC +Djecyrillic;0402 +Dlinebelow;1E0E +Dmonospace;FF24 +Dotaccentsmall;F6F7 +Dslash;0110 +Dsmall;F764 +Dtopbar;018B +Dz;01F2 +Dzcaron;01C5 +Dzeabkhasiancyrillic;04E0 +Dzecyrillic;0405 +Dzhecyrillic;040F +E;0045 +Eacute;00C9 +Eacutesmall;F7E9 +Ebreve;0114 +Ecaron;011A +Ecedillabreve;1E1C +Echarmenian;0535 +Ecircle;24BA +Ecircumflex;00CA +Ecircumflexacute;1EBE +Ecircumflexbelow;1E18 +Ecircumflexdotbelow;1EC6 +Ecircumflexgrave;1EC0 +Ecircumflexhookabove;1EC2 +Ecircumflexsmall;F7EA +Ecircumflextilde;1EC4 +Ecyrillic;0404 +Edblgrave;0204 +Edieresis;00CB +Edieresissmall;F7EB +Edot;0116 +Edotaccent;0116 +Edotbelow;1EB8 +Efcyrillic;0424 +Egrave;00C8 +Egravesmall;F7E8 +Eharmenian;0537 +Ehookabove;1EBA +Eightroman;2167 +Einvertedbreve;0206 +Eiotifiedcyrillic;0464 +Elcyrillic;041B +Elevenroman;216A +Emacron;0112 +Emacronacute;1E16 +Emacrongrave;1E14 +Emcyrillic;041C +Emonospace;FF25 +Encyrillic;041D +Endescendercyrillic;04A2 +Eng;014A +Enghecyrillic;04A4 +Enhookcyrillic;04C7 +Eogonek;0118 +Eopen;0190 +Epsilon;0395 +Epsilontonos;0388 +Ercyrillic;0420 +Ereversed;018E +Ereversedcyrillic;042D +Escyrillic;0421 +Esdescendercyrillic;04AA +Esh;01A9 +Esmall;F765 +Eta;0397 +Etarmenian;0538 +Etatonos;0389 +Eth;00D0 +Ethsmall;F7F0 +Etilde;1EBC +Etildebelow;1E1A +Euro;20AC +Ezh;01B7 +Ezhcaron;01EE +Ezhreversed;01B8 +F;0046 +Fcircle;24BB +Fdotaccent;1E1E +Feharmenian;0556 +Feicoptic;03E4 +Fhook;0191 +Fitacyrillic;0472 +Fiveroman;2164 +Fmonospace;FF26 +Fourroman;2163 +Fsmall;F766 +G;0047 +GBsquare;3387 +Gacute;01F4 +Gamma;0393 +Gammaafrican;0194 +Gangiacoptic;03EA +Gbreve;011E +Gcaron;01E6 +Gcedilla;0122 +Gcircle;24BC +Gcircumflex;011C +Gcommaaccent;0122 +Gdot;0120 +Gdotaccent;0120 +Gecyrillic;0413 +Ghadarmenian;0542 +Ghemiddlehookcyrillic;0494 +Ghestrokecyrillic;0492 +Gheupturncyrillic;0490 +Ghook;0193 +Gimarmenian;0533 +Gjecyrillic;0403 +Gmacron;1E20 +Gmonospace;FF27 +Grave;F6CE +Gravesmall;F760 +Gsmall;F767 +Gsmallhook;029B +Gstroke;01E4 +H;0048 +H18533;25CF +H18543;25AA +H18551;25AB +H22073;25A1 +HPsquare;33CB +Haabkhasiancyrillic;04A8 +Hadescendercyrillic;04B2 +Hardsigncyrillic;042A +Hbar;0126 +Hbrevebelow;1E2A +Hcedilla;1E28 +Hcircle;24BD +Hcircumflex;0124 +Hdieresis;1E26 +Hdotaccent;1E22 +Hdotbelow;1E24 +Hmonospace;FF28 +Hoarmenian;0540 +Horicoptic;03E8 +Hsmall;F768 +Hungarumlaut;F6CF +Hungarumlautsmall;F6F8 +Hzsquare;3390 +I;0049 +IAcyrillic;042F +IJ;0132 +IUcyrillic;042E +Iacute;00CD +Iacutesmall;F7ED +Ibreve;012C +Icaron;01CF +Icircle;24BE +Icircumflex;00CE +Icircumflexsmall;F7EE +Icyrillic;0406 +Idblgrave;0208 +Idieresis;00CF +Idieresisacute;1E2E +Idieresiscyrillic;04E4 +Idieresissmall;F7EF +Idot;0130 +Idotaccent;0130 +Idotbelow;1ECA +Iebrevecyrillic;04D6 +Iecyrillic;0415 +Ifraktur;2111 +Igrave;00CC +Igravesmall;F7EC +Ihookabove;1EC8 +Iicyrillic;0418 +Iinvertedbreve;020A +Iishortcyrillic;0419 +Imacron;012A +Imacroncyrillic;04E2 +Imonospace;FF29 +Iniarmenian;053B +Iocyrillic;0401 +Iogonek;012E +Iota;0399 +Iotaafrican;0196 +Iotadieresis;03AA +Iotatonos;038A +Ismall;F769 +Istroke;0197 +Itilde;0128 +Itildebelow;1E2C +Izhitsacyrillic;0474 +Izhitsadblgravecyrillic;0476 +J;004A +Jaarmenian;0541 +Jcircle;24BF +Jcircumflex;0134 +Jecyrillic;0408 +Jheharmenian;054B +Jmonospace;FF2A +Jsmall;F76A +K;004B +KBsquare;3385 +KKsquare;33CD +Kabashkircyrillic;04A0 +Kacute;1E30 +Kacyrillic;041A +Kadescendercyrillic;049A +Kahookcyrillic;04C3 +Kappa;039A +Kastrokecyrillic;049E +Kaverticalstrokecyrillic;049C +Kcaron;01E8 +Kcedilla;0136 +Kcircle;24C0 +Kcommaaccent;0136 +Kdotbelow;1E32 +Keharmenian;0554 +Kenarmenian;053F +Khacyrillic;0425 +Kheicoptic;03E6 +Khook;0198 +Kjecyrillic;040C +Klinebelow;1E34 +Kmonospace;FF2B +Koppacyrillic;0480 +Koppagreek;03DE +Ksicyrillic;046E +Ksmall;F76B +L;004C +LJ;01C7 +LL;F6BF +Lacute;0139 +Lambda;039B +Lcaron;013D +Lcedilla;013B +Lcircle;24C1 +Lcircumflexbelow;1E3C +Lcommaaccent;013B +Ldot;013F +Ldotaccent;013F +Ldotbelow;1E36 +Ldotbelowmacron;1E38 +Liwnarmenian;053C +Lj;01C8 +Ljecyrillic;0409 +Llinebelow;1E3A +Lmonospace;FF2C +Lslash;0141 +Lslashsmall;F6F9 +Lsmall;F76C +M;004D +MBsquare;3386 +Macron;F6D0 +Macronsmall;F7AF +Macute;1E3E +Mcircle;24C2 +Mdotaccent;1E40 +Mdotbelow;1E42 +Menarmenian;0544 +Mmonospace;FF2D +Msmall;F76D +Mturned;019C +Mu;039C +N;004E +NJ;01CA +Nacute;0143 +Ncaron;0147 +Ncedilla;0145 +Ncircle;24C3 +Ncircumflexbelow;1E4A +Ncommaaccent;0145 +Ndotaccent;1E44 +Ndotbelow;1E46 +Nhookleft;019D +Nineroman;2168 +Nj;01CB +Njecyrillic;040A +Nlinebelow;1E48 +Nmonospace;FF2E +Nowarmenian;0546 +Nsmall;F76E +Ntilde;00D1 +Ntildesmall;F7F1 +Nu;039D +O;004F +OE;0152 +OEsmall;F6FA +Oacute;00D3 +Oacutesmall;F7F3 +Obarredcyrillic;04E8 +Obarreddieresiscyrillic;04EA +Obreve;014E +Ocaron;01D1 +Ocenteredtilde;019F +Ocircle;24C4 +Ocircumflex;00D4 +Ocircumflexacute;1ED0 +Ocircumflexdotbelow;1ED8 +Ocircumflexgrave;1ED2 +Ocircumflexhookabove;1ED4 +Ocircumflexsmall;F7F4 +Ocircumflextilde;1ED6 +Ocyrillic;041E +Odblacute;0150 +Odblgrave;020C +Odieresis;00D6 +Odieresiscyrillic;04E6 +Odieresissmall;F7F6 +Odotbelow;1ECC +Ogoneksmall;F6FB +Ograve;00D2 +Ogravesmall;F7F2 +Oharmenian;0555 +Ohm;2126 +Ohookabove;1ECE +Ohorn;01A0 +Ohornacute;1EDA +Ohorndotbelow;1EE2 +Ohorngrave;1EDC +Ohornhookabove;1EDE +Ohorntilde;1EE0 +Ohungarumlaut;0150 +Oi;01A2 +Oinvertedbreve;020E +Omacron;014C +Omacronacute;1E52 +Omacrongrave;1E50 +Omega;2126 +Omegacyrillic;0460 +Omegagreek;03A9 +Omegaroundcyrillic;047A +Omegatitlocyrillic;047C +Omegatonos;038F +Omicron;039F +Omicrontonos;038C +Omonospace;FF2F +Oneroman;2160 +Oogonek;01EA +Oogonekmacron;01EC +Oopen;0186 +Oslash;00D8 +Oslashacute;01FE +Oslashsmall;F7F8 +Osmall;F76F +Ostrokeacute;01FE +Otcyrillic;047E +Otilde;00D5 +Otildeacute;1E4C +Otildedieresis;1E4E +Otildesmall;F7F5 +P;0050 +Pacute;1E54 +Pcircle;24C5 +Pdotaccent;1E56 +Pecyrillic;041F +Peharmenian;054A +Pemiddlehookcyrillic;04A6 +Phi;03A6 +Phook;01A4 +Pi;03A0 +Piwrarmenian;0553 +Pmonospace;FF30 +Psi;03A8 +Psicyrillic;0470 +Psmall;F770 +Q;0051 +Qcircle;24C6 +Qmonospace;FF31 +Qsmall;F771 +R;0052 +Raarmenian;054C +Racute;0154 +Rcaron;0158 +Rcedilla;0156 +Rcircle;24C7 +Rcommaaccent;0156 +Rdblgrave;0210 +Rdotaccent;1E58 +Rdotbelow;1E5A +Rdotbelowmacron;1E5C +Reharmenian;0550 +Rfraktur;211C +Rho;03A1 +Ringsmall;F6FC +Rinvertedbreve;0212 +Rlinebelow;1E5E +Rmonospace;FF32 +Rsmall;F772 +Rsmallinverted;0281 +Rsmallinvertedsuperior;02B6 +S;0053 +SF010000;250C +SF020000;2514 +SF030000;2510 +SF040000;2518 +SF050000;253C +SF060000;252C +SF070000;2534 +SF080000;251C +SF090000;2524 +SF100000;2500 +SF110000;2502 +SF190000;2561 +SF200000;2562 +SF210000;2556 +SF220000;2555 +SF230000;2563 +SF240000;2551 +SF250000;2557 +SF260000;255D +SF270000;255C +SF280000;255B +SF360000;255E +SF370000;255F +SF380000;255A +SF390000;2554 +SF400000;2569 +SF410000;2566 +SF420000;2560 +SF430000;2550 +SF440000;256C +SF450000;2567 +SF460000;2568 +SF470000;2564 +SF480000;2565 +SF490000;2559 +SF500000;2558 +SF510000;2552 +SF520000;2553 +SF530000;256B +SF540000;256A +Sacute;015A +Sacutedotaccent;1E64 +Sampigreek;03E0 +Scaron;0160 +Scarondotaccent;1E66 +Scaronsmall;F6FD +Scedilla;015E +Schwa;018F +Schwacyrillic;04D8 +Schwadieresiscyrillic;04DA +Scircle;24C8 +Scircumflex;015C +Scommaaccent;0218 +Sdotaccent;1E60 +Sdotbelow;1E62 +Sdotbelowdotaccent;1E68 +Seharmenian;054D +Sevenroman;2166 +Shaarmenian;0547 +Shacyrillic;0428 +Shchacyrillic;0429 +Sheicoptic;03E2 +Shhacyrillic;04BA +Shimacoptic;03EC +Sigma;03A3 +Sixroman;2165 +Smonospace;FF33 +Softsigncyrillic;042C +Ssmall;F773 +Stigmagreek;03DA +T;0054 +Tau;03A4 +Tbar;0166 +Tcaron;0164 +Tcedilla;0162 +Tcircle;24C9 +Tcircumflexbelow;1E70 +Tcommaaccent;0162 +Tdotaccent;1E6A +Tdotbelow;1E6C +Tecyrillic;0422 +Tedescendercyrillic;04AC +Tenroman;2169 +Tetsecyrillic;04B4 +Theta;0398 +Thook;01AC +Thorn;00DE +Thornsmall;F7FE +Threeroman;2162 +Tildesmall;F6FE +Tiwnarmenian;054F +Tlinebelow;1E6E +Tmonospace;FF34 +Toarmenian;0539 +Tonefive;01BC +Tonesix;0184 +Tonetwo;01A7 +Tretroflexhook;01AE +Tsecyrillic;0426 +Tshecyrillic;040B +Tsmall;F774 +Twelveroman;216B +Tworoman;2161 +U;0055 +Uacute;00DA +Uacutesmall;F7FA +Ubreve;016C +Ucaron;01D3 +Ucircle;24CA +Ucircumflex;00DB +Ucircumflexbelow;1E76 +Ucircumflexsmall;F7FB +Ucyrillic;0423 +Udblacute;0170 +Udblgrave;0214 +Udieresis;00DC +Udieresisacute;01D7 +Udieresisbelow;1E72 +Udieresiscaron;01D9 +Udieresiscyrillic;04F0 +Udieresisgrave;01DB +Udieresismacron;01D5 +Udieresissmall;F7FC +Udotbelow;1EE4 +Ugrave;00D9 +Ugravesmall;F7F9 +Uhookabove;1EE6 +Uhorn;01AF +Uhornacute;1EE8 +Uhorndotbelow;1EF0 +Uhorngrave;1EEA +Uhornhookabove;1EEC +Uhorntilde;1EEE +Uhungarumlaut;0170 +Uhungarumlautcyrillic;04F2 +Uinvertedbreve;0216 +Ukcyrillic;0478 +Umacron;016A +Umacroncyrillic;04EE +Umacrondieresis;1E7A +Umonospace;FF35 +Uogonek;0172 +Upsilon;03A5 +Upsilon1;03D2 +Upsilonacutehooksymbolgreek;03D3 +Upsilonafrican;01B1 +Upsilondieresis;03AB +Upsilondieresishooksymbolgreek;03D4 +Upsilonhooksymbol;03D2 +Upsilontonos;038E +Uring;016E +Ushortcyrillic;040E +Usmall;F775 +Ustraightcyrillic;04AE +Ustraightstrokecyrillic;04B0 +Utilde;0168 +Utildeacute;1E78 +Utildebelow;1E74 +V;0056 +Vcircle;24CB +Vdotbelow;1E7E +Vecyrillic;0412 +Vewarmenian;054E +Vhook;01B2 +Vmonospace;FF36 +Voarmenian;0548 +Vsmall;F776 +Vtilde;1E7C +W;0057 +Wacute;1E82 +Wcircle;24CC +Wcircumflex;0174 +Wdieresis;1E84 +Wdotaccent;1E86 +Wdotbelow;1E88 +Wgrave;1E80 +Wmonospace;FF37 +Wsmall;F777 +X;0058 +Xcircle;24CD +Xdieresis;1E8C +Xdotaccent;1E8A +Xeharmenian;053D +Xi;039E +Xmonospace;FF38 +Xsmall;F778 +Y;0059 +Yacute;00DD +Yacutesmall;F7FD +Yatcyrillic;0462 +Ycircle;24CE +Ycircumflex;0176 +Ydieresis;0178 +Ydieresissmall;F7FF +Ydotaccent;1E8E +Ydotbelow;1EF4 +Yericyrillic;042B +Yerudieresiscyrillic;04F8 +Ygrave;1EF2 +Yhook;01B3 +Yhookabove;1EF6 +Yiarmenian;0545 +Yicyrillic;0407 +Yiwnarmenian;0552 +Ymonospace;FF39 +Ysmall;F779 +Ytilde;1EF8 +Yusbigcyrillic;046A +Yusbigiotifiedcyrillic;046C +Yuslittlecyrillic;0466 +Yuslittleiotifiedcyrillic;0468 +Z;005A +Zaarmenian;0536 +Zacute;0179 +Zcaron;017D +Zcaronsmall;F6FF +Zcircle;24CF +Zcircumflex;1E90 +Zdot;017B +Zdotaccent;017B +Zdotbelow;1E92 +Zecyrillic;0417 +Zedescendercyrillic;0498 +Zedieresiscyrillic;04DE +Zeta;0396 +Zhearmenian;053A +Zhebrevecyrillic;04C1 +Zhecyrillic;0416 +Zhedescendercyrillic;0496 +Zhedieresiscyrillic;04DC +Zlinebelow;1E94 +Zmonospace;FF3A +Zsmall;F77A +Zstroke;01B5 +a;0061 +aabengali;0986 +aacute;00E1 +aadeva;0906 +aagujarati;0A86 +aagurmukhi;0A06 +aamatragurmukhi;0A3E +aarusquare;3303 +aavowelsignbengali;09BE +aavowelsigndeva;093E +aavowelsigngujarati;0ABE +abbreviationmarkarmenian;055F +abbreviationsigndeva;0970 +abengali;0985 +abopomofo;311A +abreve;0103 +abreveacute;1EAF +abrevecyrillic;04D1 +abrevedotbelow;1EB7 +abrevegrave;1EB1 +abrevehookabove;1EB3 +abrevetilde;1EB5 +acaron;01CE +acircle;24D0 +acircumflex;00E2 +acircumflexacute;1EA5 +acircumflexdotbelow;1EAD +acircumflexgrave;1EA7 +acircumflexhookabove;1EA9 +acircumflextilde;1EAB +acute;00B4 +acutebelowcmb;0317 +acutecmb;0301 +acutecomb;0301 +acutedeva;0954 +acutelowmod;02CF +acutetonecmb;0341 +acyrillic;0430 +adblgrave;0201 +addakgurmukhi;0A71 +adeva;0905 +adieresis;00E4 +adieresiscyrillic;04D3 +adieresismacron;01DF +adotbelow;1EA1 +adotmacron;01E1 +ae;00E6 +aeacute;01FD +aekorean;3150 +aemacron;01E3 +afii00208;2015 +afii08941;20A4 +afii10017;0410 +afii10018;0411 +afii10019;0412 +afii10020;0413 +afii10021;0414 +afii10022;0415 +afii10023;0401 +afii10024;0416 +afii10025;0417 +afii10026;0418 +afii10027;0419 +afii10028;041A +afii10029;041B +afii10030;041C +afii10031;041D +afii10032;041E +afii10033;041F +afii10034;0420 +afii10035;0421 +afii10036;0422 +afii10037;0423 +afii10038;0424 +afii10039;0425 +afii10040;0426 +afii10041;0427 +afii10042;0428 +afii10043;0429 +afii10044;042A +afii10045;042B +afii10046;042C +afii10047;042D +afii10048;042E +afii10049;042F +afii10050;0490 +afii10051;0402 +afii10052;0403 +afii10053;0404 +afii10054;0405 +afii10055;0406 +afii10056;0407 +afii10057;0408 +afii10058;0409 +afii10059;040A +afii10060;040B +afii10061;040C +afii10062;040E +afii10063;F6C4 +afii10064;F6C5 +afii10065;0430 +afii10066;0431 +afii10067;0432 +afii10068;0433 +afii10069;0434 +afii10070;0435 +afii10071;0451 +afii10072;0436 +afii10073;0437 +afii10074;0438 +afii10075;0439 +afii10076;043A +afii10077;043B +afii10078;043C +afii10079;043D +afii10080;043E +afii10081;043F +afii10082;0440 +afii10083;0441 +afii10084;0442 +afii10085;0443 +afii10086;0444 +afii10087;0445 +afii10088;0446 +afii10089;0447 +afii10090;0448 +afii10091;0449 +afii10092;044A +afii10093;044B +afii10094;044C +afii10095;044D +afii10096;044E +afii10097;044F +afii10098;0491 +afii10099;0452 +afii10100;0453 +afii10101;0454 +afii10102;0455 +afii10103;0456 +afii10104;0457 +afii10105;0458 +afii10106;0459 +afii10107;045A +afii10108;045B +afii10109;045C +afii10110;045E +afii10145;040F +afii10146;0462 +afii10147;0472 +afii10148;0474 +afii10192;F6C6 +afii10193;045F +afii10194;0463 +afii10195;0473 +afii10196;0475 +afii10831;F6C7 +afii10832;F6C8 +afii10846;04D9 +afii299;200E +afii300;200F +afii301;200D +afii57381;066A +afii57388;060C +afii57392;0660 +afii57393;0661 +afii57394;0662 +afii57395;0663 +afii57396;0664 +afii57397;0665 +afii57398;0666 +afii57399;0667 +afii57400;0668 +afii57401;0669 +afii57403;061B +afii57407;061F +afii57409;0621 +afii57410;0622 +afii57411;0623 +afii57412;0624 +afii57413;0625 +afii57414;0626 +afii57415;0627 +afii57416;0628 +afii57417;0629 +afii57418;062A +afii57419;062B +afii57420;062C +afii57421;062D +afii57422;062E +afii57423;062F +afii57424;0630 +afii57425;0631 +afii57426;0632 +afii57427;0633 +afii57428;0634 +afii57429;0635 +afii57430;0636 +afii57431;0637 +afii57432;0638 +afii57433;0639 +afii57434;063A +afii57440;0640 +afii57441;0641 +afii57442;0642 +afii57443;0643 +afii57444;0644 +afii57445;0645 +afii57446;0646 +afii57448;0648 +afii57449;0649 +afii57450;064A +afii57451;064B +afii57452;064C +afii57453;064D +afii57454;064E +afii57455;064F +afii57456;0650 +afii57457;0651 +afii57458;0652 +afii57470;0647 +afii57505;06A4 +afii57506;067E +afii57507;0686 +afii57508;0698 +afii57509;06AF +afii57511;0679 +afii57512;0688 +afii57513;0691 +afii57514;06BA +afii57519;06D2 +afii57534;06D5 +afii57636;20AA +afii57645;05BE +afii57658;05C3 +afii57664;05D0 +afii57665;05D1 +afii57666;05D2 +afii57667;05D3 +afii57668;05D4 +afii57669;05D5 +afii57670;05D6 +afii57671;05D7 +afii57672;05D8 +afii57673;05D9 +afii57674;05DA +afii57675;05DB +afii57676;05DC +afii57677;05DD +afii57678;05DE +afii57679;05DF +afii57680;05E0 +afii57681;05E1 +afii57682;05E2 +afii57683;05E3 +afii57684;05E4 +afii57685;05E5 +afii57686;05E6 +afii57687;05E7 +afii57688;05E8 +afii57689;05E9 +afii57690;05EA +afii57694;FB2A +afii57695;FB2B +afii57700;FB4B +afii57705;FB1F +afii57716;05F0 +afii57717;05F1 +afii57718;05F2 +afii57723;FB35 +afii57793;05B4 +afii57794;05B5 +afii57795;05B6 +afii57796;05BB +afii57797;05B8 +afii57798;05B7 +afii57799;05B0 +afii57800;05B2 +afii57801;05B1 +afii57802;05B3 +afii57803;05C2 +afii57804;05C1 +afii57806;05B9 +afii57807;05BC +afii57839;05BD +afii57841;05BF +afii57842;05C0 +afii57929;02BC +afii61248;2105 +afii61289;2113 +afii61352;2116 +afii61573;202C +afii61574;202D +afii61575;202E +afii61664;200C +afii63167;066D +afii64937;02BD +agrave;00E0 +agujarati;0A85 +agurmukhi;0A05 +ahiragana;3042 +ahookabove;1EA3 +aibengali;0990 +aibopomofo;311E +aideva;0910 +aiecyrillic;04D5 +aigujarati;0A90 +aigurmukhi;0A10 +aimatragurmukhi;0A48 +ainarabic;0639 +ainfinalarabic;FECA +aininitialarabic;FECB +ainmedialarabic;FECC +ainvertedbreve;0203 +aivowelsignbengali;09C8 +aivowelsigndeva;0948 +aivowelsigngujarati;0AC8 +akatakana;30A2 +akatakanahalfwidth;FF71 +akorean;314F +alef;05D0 +alefarabic;0627 +alefdageshhebrew;FB30 +aleffinalarabic;FE8E +alefhamzaabovearabic;0623 +alefhamzaabovefinalarabic;FE84 +alefhamzabelowarabic;0625 +alefhamzabelowfinalarabic;FE88 +alefhebrew;05D0 +aleflamedhebrew;FB4F +alefmaddaabovearabic;0622 +alefmaddaabovefinalarabic;FE82 +alefmaksuraarabic;0649 +alefmaksurafinalarabic;FEF0 +alefmaksurainitialarabic;FEF3 +alefmaksuramedialarabic;FEF4 +alefpatahhebrew;FB2E +alefqamatshebrew;FB2F +aleph;2135 +allequal;224C +alpha;03B1 +alphatonos;03AC +amacron;0101 +amonospace;FF41 +ampersand;0026 +ampersandmonospace;FF06 +ampersandsmall;F726 +amsquare;33C2 +anbopomofo;3122 +angbopomofo;3124 +angkhankhuthai;0E5A +angle;2220 +anglebracketleft;3008 +anglebracketleftvertical;FE3F +anglebracketright;3009 +anglebracketrightvertical;FE40 +angleleft;2329 +angleright;232A +angstrom;212B +anoteleia;0387 +anudattadeva;0952 +anusvarabengali;0982 +anusvaradeva;0902 +anusvaragujarati;0A82 +aogonek;0105 +apaatosquare;3300 +aparen;249C +apostrophearmenian;055A +apostrophemod;02BC +apple;F8FF +approaches;2250 +approxequal;2248 +approxequalorimage;2252 +approximatelyequal;2245 +araeaekorean;318E +araeakorean;318D +arc;2312 +arighthalfring;1E9A +aring;00E5 +aringacute;01FB +aringbelow;1E01 +arrowboth;2194 +arrowdashdown;21E3 +arrowdashleft;21E0 +arrowdashright;21E2 +arrowdashup;21E1 +arrowdblboth;21D4 +arrowdbldown;21D3 +arrowdblleft;21D0 +arrowdblright;21D2 +arrowdblup;21D1 +arrowdown;2193 +arrowdownleft;2199 +arrowdownright;2198 +arrowdownwhite;21E9 +arrowheaddownmod;02C5 +arrowheadleftmod;02C2 +arrowheadrightmod;02C3 +arrowheadupmod;02C4 +arrowhorizex;F8E7 +arrowleft;2190 +arrowleftdbl;21D0 +arrowleftdblstroke;21CD +arrowleftoverright;21C6 +arrowleftwhite;21E6 +arrowright;2192 +arrowrightdblstroke;21CF +arrowrightheavy;279E +arrowrightoverleft;21C4 +arrowrightwhite;21E8 +arrowtableft;21E4 +arrowtabright;21E5 +arrowup;2191 +arrowupdn;2195 +arrowupdnbse;21A8 +arrowupdownbase;21A8 +arrowupleft;2196 +arrowupleftofdown;21C5 +arrowupright;2197 +arrowupwhite;21E7 +arrowvertex;F8E6 +asciicircum;005E +asciicircummonospace;FF3E +asciitilde;007E +asciitildemonospace;FF5E +ascript;0251 +ascriptturned;0252 +asmallhiragana;3041 +asmallkatakana;30A1 +asmallkatakanahalfwidth;FF67 +asterisk;002A +asteriskaltonearabic;066D +asteriskarabic;066D +asteriskmath;2217 +asteriskmonospace;FF0A +asterisksmall;FE61 +asterism;2042 +asuperior;F6E9 +asymptoticallyequal;2243 +at;0040 +atilde;00E3 +atmonospace;FF20 +atsmall;FE6B +aturned;0250 +aubengali;0994 +aubopomofo;3120 +audeva;0914 +augujarati;0A94 +augurmukhi;0A14 +aulengthmarkbengali;09D7 +aumatragurmukhi;0A4C +auvowelsignbengali;09CC +auvowelsigndeva;094C +auvowelsigngujarati;0ACC +avagrahadeva;093D +aybarmenian;0561 +ayin;05E2 +ayinaltonehebrew;FB20 +ayinhebrew;05E2 +b;0062 +babengali;09AC +backslash;005C +backslashmonospace;FF3C +badeva;092C +bagujarati;0AAC +bagurmukhi;0A2C +bahiragana;3070 +bahtthai;0E3F +bakatakana;30D0 +bar;007C +barmonospace;FF5C +bbopomofo;3105 +bcircle;24D1 +bdotaccent;1E03 +bdotbelow;1E05 +beamedsixteenthnotes;266C +because;2235 +becyrillic;0431 +beharabic;0628 +behfinalarabic;FE90 +behinitialarabic;FE91 +behiragana;3079 +behmedialarabic;FE92 +behmeeminitialarabic;FC9F +behmeemisolatedarabic;FC08 +behnoonfinalarabic;FC6D +bekatakana;30D9 +benarmenian;0562 +bet;05D1 +beta;03B2 +betasymbolgreek;03D0 +betdagesh;FB31 +betdageshhebrew;FB31 +bethebrew;05D1 +betrafehebrew;FB4C +bhabengali;09AD +bhadeva;092D +bhagujarati;0AAD +bhagurmukhi;0A2D +bhook;0253 +bihiragana;3073 +bikatakana;30D3 +bilabialclick;0298 +bindigurmukhi;0A02 +birusquare;3331 +blackcircle;25CF +blackdiamond;25C6 +blackdownpointingtriangle;25BC +blackleftpointingpointer;25C4 +blackleftpointingtriangle;25C0 +blacklenticularbracketleft;3010 +blacklenticularbracketleftvertical;FE3B +blacklenticularbracketright;3011 +blacklenticularbracketrightvertical;FE3C +blacklowerlefttriangle;25E3 +blacklowerrighttriangle;25E2 +blackrectangle;25AC +blackrightpointingpointer;25BA +blackrightpointingtriangle;25B6 +blacksmallsquare;25AA +blacksmilingface;263B +blacksquare;25A0 +blackstar;2605 +blackupperlefttriangle;25E4 +blackupperrighttriangle;25E5 +blackuppointingsmalltriangle;25B4 +blackuppointingtriangle;25B2 +blank;2423 +blinebelow;1E07 +block;2588 +bmonospace;FF42 +bobaimaithai;0E1A +bohiragana;307C +bokatakana;30DC +bparen;249D +bqsquare;33C3 +braceex;F8F4 +braceleft;007B +braceleftbt;F8F3 +braceleftmid;F8F2 +braceleftmonospace;FF5B +braceleftsmall;FE5B +bracelefttp;F8F1 +braceleftvertical;FE37 +braceright;007D +bracerightbt;F8FE +bracerightmid;F8FD +bracerightmonospace;FF5D +bracerightsmall;FE5C +bracerighttp;F8FC +bracerightvertical;FE38 +bracketleft;005B +bracketleftbt;F8F0 +bracketleftex;F8EF +bracketleftmonospace;FF3B +bracketlefttp;F8EE +bracketright;005D +bracketrightbt;F8FB +bracketrightex;F8FA +bracketrightmonospace;FF3D +bracketrighttp;F8F9 +breve;02D8 +brevebelowcmb;032E +brevecmb;0306 +breveinvertedbelowcmb;032F +breveinvertedcmb;0311 +breveinverteddoublecmb;0361 +bridgebelowcmb;032A +bridgeinvertedbelowcmb;033A +brokenbar;00A6 +bstroke;0180 +bsuperior;F6EA +btopbar;0183 +buhiragana;3076 +bukatakana;30D6 +bullet;2022 +bulletinverse;25D8 +bulletoperator;2219 +bullseye;25CE +c;0063 +caarmenian;056E +cabengali;099A +cacute;0107 +cadeva;091A +cagujarati;0A9A +cagurmukhi;0A1A +calsquare;3388 +candrabindubengali;0981 +candrabinducmb;0310 +candrabindudeva;0901 +candrabindugujarati;0A81 +capslock;21EA +careof;2105 +caron;02C7 +caronbelowcmb;032C +caroncmb;030C +carriagereturn;21B5 +cbopomofo;3118 +ccaron;010D +ccedilla;00E7 +ccedillaacute;1E09 +ccircle;24D2 +ccircumflex;0109 +ccurl;0255 +cdot;010B +cdotaccent;010B +cdsquare;33C5 +cedilla;00B8 +cedillacmb;0327 +cent;00A2 +centigrade;2103 +centinferior;F6DF +centmonospace;FFE0 +centoldstyle;F7A2 +centsuperior;F6E0 +chaarmenian;0579 +chabengali;099B +chadeva;091B +chagujarati;0A9B +chagurmukhi;0A1B +chbopomofo;3114 +cheabkhasiancyrillic;04BD +checkmark;2713 +checyrillic;0447 +chedescenderabkhasiancyrillic;04BF +chedescendercyrillic;04B7 +chedieresiscyrillic;04F5 +cheharmenian;0573 +chekhakassiancyrillic;04CC +cheverticalstrokecyrillic;04B9 +chi;03C7 +chieuchacirclekorean;3277 +chieuchaparenkorean;3217 +chieuchcirclekorean;3269 +chieuchkorean;314A +chieuchparenkorean;3209 +chochangthai;0E0A +chochanthai;0E08 +chochingthai;0E09 +chochoethai;0E0C +chook;0188 +cieucacirclekorean;3276 +cieucaparenkorean;3216 +cieuccirclekorean;3268 +cieuckorean;3148 +cieucparenkorean;3208 +cieucuparenkorean;321C +circle;25CB +circlemultiply;2297 +circleot;2299 +circleplus;2295 +circlepostalmark;3036 +circlewithlefthalfblack;25D0 +circlewithrighthalfblack;25D1 +circumflex;02C6 +circumflexbelowcmb;032D +circumflexcmb;0302 +clear;2327 +clickalveolar;01C2 +clickdental;01C0 +clicklateral;01C1 +clickretroflex;01C3 +club;2663 +clubsuitblack;2663 +clubsuitwhite;2667 +cmcubedsquare;33A4 +cmonospace;FF43 +cmsquaredsquare;33A0 +coarmenian;0581 +colon;003A +colonmonetary;20A1 +colonmonospace;FF1A +colonsign;20A1 +colonsmall;FE55 +colontriangularhalfmod;02D1 +colontriangularmod;02D0 +comma;002C +commaabovecmb;0313 +commaaboverightcmb;0315 +commaaccent;F6C3 +commaarabic;060C +commaarmenian;055D +commainferior;F6E1 +commamonospace;FF0C +commareversedabovecmb;0314 +commareversedmod;02BD +commasmall;FE50 +commasuperior;F6E2 +commaturnedabovecmb;0312 +commaturnedmod;02BB +compass;263C +congruent;2245 +contourintegral;222E +control;2303 +controlACK;0006 +controlBEL;0007 +controlBS;0008 +controlCAN;0018 +controlCR;000D +controlDC1;0011 +controlDC2;0012 +controlDC3;0013 +controlDC4;0014 +controlDEL;007F +controlDLE;0010 +controlEM;0019 +controlENQ;0005 +controlEOT;0004 +controlESC;001B +controlETB;0017 +controlETX;0003 +controlFF;000C +controlFS;001C +controlGS;001D +controlHT;0009 +controlLF;000A +controlNAK;0015 +controlRS;001E +controlSI;000F +controlSO;000E +controlSOT;0002 +controlSTX;0001 +controlSUB;001A +controlSYN;0016 +controlUS;001F +controlVT;000B +copyright;00A9 +copyrightsans;F8E9 +copyrightserif;F6D9 +cornerbracketleft;300C +cornerbracketlefthalfwidth;FF62 +cornerbracketleftvertical;FE41 +cornerbracketright;300D +cornerbracketrighthalfwidth;FF63 +cornerbracketrightvertical;FE42 +corporationsquare;337F +cosquare;33C7 +coverkgsquare;33C6 +cparen;249E +cruzeiro;20A2 +cstretched;0297 +curlyand;22CF +curlyor;22CE +currency;00A4 +cyrBreve;F6D1 +cyrFlex;F6D2 +cyrbreve;F6D4 +cyrflex;F6D5 +d;0064 +daarmenian;0564 +dabengali;09A6 +dadarabic;0636 +dadeva;0926 +dadfinalarabic;FEBE +dadinitialarabic;FEBF +dadmedialarabic;FEC0 +dagesh;05BC +dageshhebrew;05BC +dagger;2020 +daggerdbl;2021 +dagujarati;0AA6 +dagurmukhi;0A26 +dahiragana;3060 +dakatakana;30C0 +dalarabic;062F +dalet;05D3 +daletdagesh;FB33 +daletdageshhebrew;FB33 +dalethatafpatah;05D3 05B2 +dalethatafpatahhebrew;05D3 05B2 +dalethatafsegol;05D3 05B1 +dalethatafsegolhebrew;05D3 05B1 +dalethebrew;05D3 +dalethiriq;05D3 05B4 +dalethiriqhebrew;05D3 05B4 +daletholam;05D3 05B9 +daletholamhebrew;05D3 05B9 +daletpatah;05D3 05B7 +daletpatahhebrew;05D3 05B7 +daletqamats;05D3 05B8 +daletqamatshebrew;05D3 05B8 +daletqubuts;05D3 05BB +daletqubutshebrew;05D3 05BB +daletsegol;05D3 05B6 +daletsegolhebrew;05D3 05B6 +daletsheva;05D3 05B0 +daletshevahebrew;05D3 05B0 +dalettsere;05D3 05B5 +dalettserehebrew;05D3 05B5 +dalfinalarabic;FEAA +dammaarabic;064F +dammalowarabic;064F +dammatanaltonearabic;064C +dammatanarabic;064C +danda;0964 +dargahebrew;05A7 +dargalefthebrew;05A7 +dasiapneumatacyrilliccmb;0485 +dblGrave;F6D3 +dblanglebracketleft;300A +dblanglebracketleftvertical;FE3D +dblanglebracketright;300B +dblanglebracketrightvertical;FE3E +dblarchinvertedbelowcmb;032B +dblarrowleft;21D4 +dblarrowright;21D2 +dbldanda;0965 +dblgrave;F6D6 +dblgravecmb;030F +dblintegral;222C +dbllowline;2017 +dbllowlinecmb;0333 +dbloverlinecmb;033F +dblprimemod;02BA +dblverticalbar;2016 +dblverticallineabovecmb;030E +dbopomofo;3109 +dbsquare;33C8 +dcaron;010F +dcedilla;1E11 +dcircle;24D3 +dcircumflexbelow;1E13 +dcroat;0111 +ddabengali;09A1 +ddadeva;0921 +ddagujarati;0AA1 +ddagurmukhi;0A21 +ddalarabic;0688 +ddalfinalarabic;FB89 +dddhadeva;095C +ddhabengali;09A2 +ddhadeva;0922 +ddhagujarati;0AA2 +ddhagurmukhi;0A22 +ddotaccent;1E0B +ddotbelow;1E0D +decimalseparatorarabic;066B +decimalseparatorpersian;066B +decyrillic;0434 +degree;00B0 +dehihebrew;05AD +dehiragana;3067 +deicoptic;03EF +dekatakana;30C7 +deleteleft;232B +deleteright;2326 +delta;03B4 +deltaturned;018D +denominatorminusonenumeratorbengali;09F8 +dezh;02A4 +dhabengali;09A7 +dhadeva;0927 +dhagujarati;0AA7 +dhagurmukhi;0A27 +dhook;0257 +dialytikatonos;0385 +dialytikatonoscmb;0344 +diamond;2666 +diamondsuitwhite;2662 +dieresis;00A8 +dieresisacute;F6D7 +dieresisbelowcmb;0324 +dieresiscmb;0308 +dieresisgrave;F6D8 +dieresistonos;0385 +dihiragana;3062 +dikatakana;30C2 +dittomark;3003 +divide;00F7 +divides;2223 +divisionslash;2215 +djecyrillic;0452 +dkshade;2593 +dlinebelow;1E0F +dlsquare;3397 +dmacron;0111 +dmonospace;FF44 +dnblock;2584 +dochadathai;0E0E +dodekthai;0E14 +dohiragana;3069 +dokatakana;30C9 +dollar;0024 +dollarinferior;F6E3 +dollarmonospace;FF04 +dollaroldstyle;F724 +dollarsmall;FE69 +dollarsuperior;F6E4 +dong;20AB +dorusquare;3326 +dotaccent;02D9 +dotaccentcmb;0307 +dotbelowcmb;0323 +dotbelowcomb;0323 +dotkatakana;30FB +dotlessi;0131 +dotlessj;F6BE +dotlessjstrokehook;0284 +dotmath;22C5 +dottedcircle;25CC +doubleyodpatah;FB1F +doubleyodpatahhebrew;FB1F +downtackbelowcmb;031E +downtackmod;02D5 +dparen;249F +dsuperior;F6EB +dtail;0256 +dtopbar;018C +duhiragana;3065 +dukatakana;30C5 +dz;01F3 +dzaltone;02A3 +dzcaron;01C6 +dzcurl;02A5 +dzeabkhasiancyrillic;04E1 +dzecyrillic;0455 +dzhecyrillic;045F +e;0065 +eacute;00E9 +earth;2641 +ebengali;098F +ebopomofo;311C +ebreve;0115 +ecandradeva;090D +ecandragujarati;0A8D +ecandravowelsigndeva;0945 +ecandravowelsigngujarati;0AC5 +ecaron;011B +ecedillabreve;1E1D +echarmenian;0565 +echyiwnarmenian;0587 +ecircle;24D4 +ecircumflex;00EA +ecircumflexacute;1EBF +ecircumflexbelow;1E19 +ecircumflexdotbelow;1EC7 +ecircumflexgrave;1EC1 +ecircumflexhookabove;1EC3 +ecircumflextilde;1EC5 +ecyrillic;0454 +edblgrave;0205 +edeva;090F +edieresis;00EB +edot;0117 +edotaccent;0117 +edotbelow;1EB9 +eegurmukhi;0A0F +eematragurmukhi;0A47 +efcyrillic;0444 +egrave;00E8 +egujarati;0A8F +eharmenian;0567 +ehbopomofo;311D +ehiragana;3048 +ehookabove;1EBB +eibopomofo;311F +eight;0038 +eightarabic;0668 +eightbengali;09EE +eightcircle;2467 +eightcircleinversesansserif;2791 +eightdeva;096E +eighteencircle;2471 +eighteenparen;2485 +eighteenperiod;2499 +eightgujarati;0AEE +eightgurmukhi;0A6E +eighthackarabic;0668 +eighthangzhou;3028 +eighthnotebeamed;266B +eightideographicparen;3227 +eightinferior;2088 +eightmonospace;FF18 +eightoldstyle;F738 +eightparen;247B +eightperiod;248F +eightpersian;06F8 +eightroman;2177 +eightsuperior;2078 +eightthai;0E58 +einvertedbreve;0207 +eiotifiedcyrillic;0465 +ekatakana;30A8 +ekatakanahalfwidth;FF74 +ekonkargurmukhi;0A74 +ekorean;3154 +elcyrillic;043B +element;2208 +elevencircle;246A +elevenparen;247E +elevenperiod;2492 +elevenroman;217A +ellipsis;2026 +ellipsisvertical;22EE +emacron;0113 +emacronacute;1E17 +emacrongrave;1E15 +emcyrillic;043C +emdash;2014 +emdashvertical;FE31 +emonospace;FF45 +emphasismarkarmenian;055B +emptyset;2205 +enbopomofo;3123 +encyrillic;043D +endash;2013 +endashvertical;FE32 +endescendercyrillic;04A3 +eng;014B +engbopomofo;3125 +enghecyrillic;04A5 +enhookcyrillic;04C8 +enspace;2002 +eogonek;0119 +eokorean;3153 +eopen;025B +eopenclosed;029A +eopenreversed;025C +eopenreversedclosed;025E +eopenreversedhook;025D +eparen;24A0 +epsilon;03B5 +epsilontonos;03AD +equal;003D +equalmonospace;FF1D +equalsmall;FE66 +equalsuperior;207C +equivalence;2261 +erbopomofo;3126 +ercyrillic;0440 +ereversed;0258 +ereversedcyrillic;044D +escyrillic;0441 +esdescendercyrillic;04AB +esh;0283 +eshcurl;0286 +eshortdeva;090E +eshortvowelsigndeva;0946 +eshreversedloop;01AA +eshsquatreversed;0285 +esmallhiragana;3047 +esmallkatakana;30A7 +esmallkatakanahalfwidth;FF6A +estimated;212E +esuperior;F6EC +eta;03B7 +etarmenian;0568 +etatonos;03AE +eth;00F0 +etilde;1EBD +etildebelow;1E1B +etnahtafoukhhebrew;0591 +etnahtafoukhlefthebrew;0591 +etnahtahebrew;0591 +etnahtalefthebrew;0591 +eturned;01DD +eukorean;3161 +euro;20AC +evowelsignbengali;09C7 +evowelsigndeva;0947 +evowelsigngujarati;0AC7 +exclam;0021 +exclamarmenian;055C +exclamdbl;203C +exclamdown;00A1 +exclamdownsmall;F7A1 +exclammonospace;FF01 +exclamsmall;F721 +existential;2203 +ezh;0292 +ezhcaron;01EF +ezhcurl;0293 +ezhreversed;01B9 +ezhtail;01BA +f;0066 +fadeva;095E +fagurmukhi;0A5E +fahrenheit;2109 +fathaarabic;064E +fathalowarabic;064E +fathatanarabic;064B +fbopomofo;3108 +fcircle;24D5 +fdotaccent;1E1F +feharabic;0641 +feharmenian;0586 +fehfinalarabic;FED2 +fehinitialarabic;FED3 +fehmedialarabic;FED4 +feicoptic;03E5 +female;2640 +ff;FB00 +ffi;FB03 +ffl;FB04 +fi;FB01 +fifteencircle;246E +fifteenparen;2482 +fifteenperiod;2496 +figuredash;2012 +filledbox;25A0 +filledrect;25AC +finalkaf;05DA +finalkafdagesh;FB3A +finalkafdageshhebrew;FB3A +finalkafhebrew;05DA +finalkafqamats;05DA 05B8 +finalkafqamatshebrew;05DA 05B8 +finalkafsheva;05DA 05B0 +finalkafshevahebrew;05DA 05B0 +finalmem;05DD +finalmemhebrew;05DD +finalnun;05DF +finalnunhebrew;05DF +finalpe;05E3 +finalpehebrew;05E3 +finaltsadi;05E5 +finaltsadihebrew;05E5 +firsttonechinese;02C9 +fisheye;25C9 +fitacyrillic;0473 +five;0035 +fivearabic;0665 +fivebengali;09EB +fivecircle;2464 +fivecircleinversesansserif;278E +fivedeva;096B +fiveeighths;215D +fivegujarati;0AEB +fivegurmukhi;0A6B +fivehackarabic;0665 +fivehangzhou;3025 +fiveideographicparen;3224 +fiveinferior;2085 +fivemonospace;FF15 +fiveoldstyle;F735 +fiveparen;2478 +fiveperiod;248C +fivepersian;06F5 +fiveroman;2174 +fivesuperior;2075 +fivethai;0E55 +fl;FB02 +florin;0192 +fmonospace;FF46 +fmsquare;3399 +fofanthai;0E1F +fofathai;0E1D +fongmanthai;0E4F +forall;2200 +four;0034 +fourarabic;0664 +fourbengali;09EA +fourcircle;2463 +fourcircleinversesansserif;278D +fourdeva;096A +fourgujarati;0AEA +fourgurmukhi;0A6A +fourhackarabic;0664 +fourhangzhou;3024 +fourideographicparen;3223 +fourinferior;2084 +fourmonospace;FF14 +fournumeratorbengali;09F7 +fouroldstyle;F734 +fourparen;2477 +fourperiod;248B +fourpersian;06F4 +fourroman;2173 +foursuperior;2074 +fourteencircle;246D +fourteenparen;2481 +fourteenperiod;2495 +fourthai;0E54 +fourthtonechinese;02CB +fparen;24A1 +fraction;2044 +franc;20A3 +g;0067 +gabengali;0997 +gacute;01F5 +gadeva;0917 +gafarabic;06AF +gaffinalarabic;FB93 +gafinitialarabic;FB94 +gafmedialarabic;FB95 +gagujarati;0A97 +gagurmukhi;0A17 +gahiragana;304C +gakatakana;30AC +gamma;03B3 +gammalatinsmall;0263 +gammasuperior;02E0 +gangiacoptic;03EB +gbopomofo;310D +gbreve;011F +gcaron;01E7 +gcedilla;0123 +gcircle;24D6 +gcircumflex;011D +gcommaaccent;0123 +gdot;0121 +gdotaccent;0121 +gecyrillic;0433 +gehiragana;3052 +gekatakana;30B2 +geometricallyequal;2251 +gereshaccenthebrew;059C +gereshhebrew;05F3 +gereshmuqdamhebrew;059D +germandbls;00DF +gershayimaccenthebrew;059E +gershayimhebrew;05F4 +getamark;3013 +ghabengali;0998 +ghadarmenian;0572 +ghadeva;0918 +ghagujarati;0A98 +ghagurmukhi;0A18 +ghainarabic;063A +ghainfinalarabic;FECE +ghaininitialarabic;FECF +ghainmedialarabic;FED0 +ghemiddlehookcyrillic;0495 +ghestrokecyrillic;0493 +gheupturncyrillic;0491 +ghhadeva;095A +ghhagurmukhi;0A5A +ghook;0260 +ghzsquare;3393 +gihiragana;304E +gikatakana;30AE +gimarmenian;0563 +gimel;05D2 +gimeldagesh;FB32 +gimeldageshhebrew;FB32 +gimelhebrew;05D2 +gjecyrillic;0453 +glottalinvertedstroke;01BE +glottalstop;0294 +glottalstopinverted;0296 +glottalstopmod;02C0 +glottalstopreversed;0295 +glottalstopreversedmod;02C1 +glottalstopreversedsuperior;02E4 +glottalstopstroke;02A1 +glottalstopstrokereversed;02A2 +gmacron;1E21 +gmonospace;FF47 +gohiragana;3054 +gokatakana;30B4 +gparen;24A2 +gpasquare;33AC +gradient;2207 +grave;0060 +gravebelowcmb;0316 +gravecmb;0300 +gravecomb;0300 +gravedeva;0953 +gravelowmod;02CE +gravemonospace;FF40 +gravetonecmb;0340 +greater;003E +greaterequal;2265 +greaterequalorless;22DB +greatermonospace;FF1E +greaterorequivalent;2273 +greaterorless;2277 +greateroverequal;2267 +greatersmall;FE65 +gscript;0261 +gstroke;01E5 +guhiragana;3050 +guillemotleft;00AB +guillemotright;00BB +guilsinglleft;2039 +guilsinglright;203A +gukatakana;30B0 +guramusquare;3318 +gysquare;33C9 +h;0068 +haabkhasiancyrillic;04A9 +haaltonearabic;06C1 +habengali;09B9 +hadescendercyrillic;04B3 +hadeva;0939 +hagujarati;0AB9 +hagurmukhi;0A39 +haharabic;062D +hahfinalarabic;FEA2 +hahinitialarabic;FEA3 +hahiragana;306F +hahmedialarabic;FEA4 +haitusquare;332A +hakatakana;30CF +hakatakanahalfwidth;FF8A +halantgurmukhi;0A4D +hamzaarabic;0621 +hamzadammaarabic;0621 064F +hamzadammatanarabic;0621 064C +hamzafathaarabic;0621 064E +hamzafathatanarabic;0621 064B +hamzalowarabic;0621 +hamzalowkasraarabic;0621 0650 +hamzalowkasratanarabic;0621 064D +hamzasukunarabic;0621 0652 +hangulfiller;3164 +hardsigncyrillic;044A +harpoonleftbarbup;21BC +harpoonrightbarbup;21C0 +hasquare;33CA +hatafpatah;05B2 +hatafpatah16;05B2 +hatafpatah23;05B2 +hatafpatah2f;05B2 +hatafpatahhebrew;05B2 +hatafpatahnarrowhebrew;05B2 +hatafpatahquarterhebrew;05B2 +hatafpatahwidehebrew;05B2 +hatafqamats;05B3 +hatafqamats1b;05B3 +hatafqamats28;05B3 +hatafqamats34;05B3 +hatafqamatshebrew;05B3 +hatafqamatsnarrowhebrew;05B3 +hatafqamatsquarterhebrew;05B3 +hatafqamatswidehebrew;05B3 +hatafsegol;05B1 +hatafsegol17;05B1 +hatafsegol24;05B1 +hatafsegol30;05B1 +hatafsegolhebrew;05B1 +hatafsegolnarrowhebrew;05B1 +hatafsegolquarterhebrew;05B1 +hatafsegolwidehebrew;05B1 +hbar;0127 +hbopomofo;310F +hbrevebelow;1E2B +hcedilla;1E29 +hcircle;24D7 +hcircumflex;0125 +hdieresis;1E27 +hdotaccent;1E23 +hdotbelow;1E25 +he;05D4 +heart;2665 +heartsuitblack;2665 +heartsuitwhite;2661 +hedagesh;FB34 +hedageshhebrew;FB34 +hehaltonearabic;06C1 +heharabic;0647 +hehebrew;05D4 +hehfinalaltonearabic;FBA7 +hehfinalalttwoarabic;FEEA +hehfinalarabic;FEEA +hehhamzaabovefinalarabic;FBA5 +hehhamzaaboveisolatedarabic;FBA4 +hehinitialaltonearabic;FBA8 +hehinitialarabic;FEEB +hehiragana;3078 +hehmedialaltonearabic;FBA9 +hehmedialarabic;FEEC +heiseierasquare;337B +hekatakana;30D8 +hekatakanahalfwidth;FF8D +hekutaarusquare;3336 +henghook;0267 +herutusquare;3339 +het;05D7 +hethebrew;05D7 +hhook;0266 +hhooksuperior;02B1 +hieuhacirclekorean;327B +hieuhaparenkorean;321B +hieuhcirclekorean;326D +hieuhkorean;314E +hieuhparenkorean;320D +hihiragana;3072 +hikatakana;30D2 +hikatakanahalfwidth;FF8B +hiriq;05B4 +hiriq14;05B4 +hiriq21;05B4 +hiriq2d;05B4 +hiriqhebrew;05B4 +hiriqnarrowhebrew;05B4 +hiriqquarterhebrew;05B4 +hiriqwidehebrew;05B4 +hlinebelow;1E96 +hmonospace;FF48 +hoarmenian;0570 +hohipthai;0E2B +hohiragana;307B +hokatakana;30DB +hokatakanahalfwidth;FF8E +holam;05B9 +holam19;05B9 +holam26;05B9 +holam32;05B9 +holamhebrew;05B9 +holamnarrowhebrew;05B9 +holamquarterhebrew;05B9 +holamwidehebrew;05B9 +honokhukthai;0E2E +hookabovecomb;0309 +hookcmb;0309 +hookpalatalizedbelowcmb;0321 +hookretroflexbelowcmb;0322 +hoonsquare;3342 +horicoptic;03E9 +horizontalbar;2015 +horncmb;031B +hotsprings;2668 +house;2302 +hparen;24A3 +hsuperior;02B0 +hturned;0265 +huhiragana;3075 +huiitosquare;3333 +hukatakana;30D5 +hukatakanahalfwidth;FF8C +hungarumlaut;02DD +hungarumlautcmb;030B +hv;0195 +hyphen;002D +hypheninferior;F6E5 +hyphenmonospace;FF0D +hyphensmall;FE63 +hyphensuperior;F6E6 +hyphentwo;2010 +i;0069 +iacute;00ED +iacyrillic;044F +ibengali;0987 +ibopomofo;3127 +ibreve;012D +icaron;01D0 +icircle;24D8 +icircumflex;00EE +icyrillic;0456 +idblgrave;0209 +ideographearthcircle;328F +ideographfirecircle;328B +ideographicallianceparen;323F +ideographiccallparen;323A +ideographiccentrecircle;32A5 +ideographicclose;3006 +ideographiccomma;3001 +ideographiccommaleft;FF64 +ideographiccongratulationparen;3237 +ideographiccorrectcircle;32A3 +ideographicearthparen;322F +ideographicenterpriseparen;323D +ideographicexcellentcircle;329D +ideographicfestivalparen;3240 +ideographicfinancialcircle;3296 +ideographicfinancialparen;3236 +ideographicfireparen;322B +ideographichaveparen;3232 +ideographichighcircle;32A4 +ideographiciterationmark;3005 +ideographiclaborcircle;3298 +ideographiclaborparen;3238 +ideographicleftcircle;32A7 +ideographiclowcircle;32A6 +ideographicmedicinecircle;32A9 +ideographicmetalparen;322E +ideographicmoonparen;322A +ideographicnameparen;3234 +ideographicperiod;3002 +ideographicprintcircle;329E +ideographicreachparen;3243 +ideographicrepresentparen;3239 +ideographicresourceparen;323E +ideographicrightcircle;32A8 +ideographicsecretcircle;3299 +ideographicselfparen;3242 +ideographicsocietyparen;3233 +ideographicspace;3000 +ideographicspecialparen;3235 +ideographicstockparen;3231 +ideographicstudyparen;323B +ideographicsunparen;3230 +ideographicsuperviseparen;323C +ideographicwaterparen;322C +ideographicwoodparen;322D +ideographiczero;3007 +ideographmetalcircle;328E +ideographmooncircle;328A +ideographnamecircle;3294 +ideographsuncircle;3290 +ideographwatercircle;328C +ideographwoodcircle;328D +ideva;0907 +idieresis;00EF +idieresisacute;1E2F +idieresiscyrillic;04E5 +idotbelow;1ECB +iebrevecyrillic;04D7 +iecyrillic;0435 +ieungacirclekorean;3275 +ieungaparenkorean;3215 +ieungcirclekorean;3267 +ieungkorean;3147 +ieungparenkorean;3207 +igrave;00EC +igujarati;0A87 +igurmukhi;0A07 +ihiragana;3044 +ihookabove;1EC9 +iibengali;0988 +iicyrillic;0438 +iideva;0908 +iigujarati;0A88 +iigurmukhi;0A08 +iimatragurmukhi;0A40 +iinvertedbreve;020B +iishortcyrillic;0439 +iivowelsignbengali;09C0 +iivowelsigndeva;0940 +iivowelsigngujarati;0AC0 +ij;0133 +ikatakana;30A4 +ikatakanahalfwidth;FF72 +ikorean;3163 +ilde;02DC +iluyhebrew;05AC +imacron;012B +imacroncyrillic;04E3 +imageorapproximatelyequal;2253 +imatragurmukhi;0A3F +imonospace;FF49 +increment;2206 +infinity;221E +iniarmenian;056B +integral;222B +integralbottom;2321 +integralbt;2321 +integralex;F8F5 +integraltop;2320 +integraltp;2320 +intersection;2229 +intisquare;3305 +invbullet;25D8 +invcircle;25D9 +invsmileface;263B +iocyrillic;0451 +iogonek;012F +iota;03B9 +iotadieresis;03CA +iotadieresistonos;0390 +iotalatin;0269 +iotatonos;03AF +iparen;24A4 +irigurmukhi;0A72 +ismallhiragana;3043 +ismallkatakana;30A3 +ismallkatakanahalfwidth;FF68 +issharbengali;09FA +istroke;0268 +isuperior;F6ED +iterationhiragana;309D +iterationkatakana;30FD +itilde;0129 +itildebelow;1E2D +iubopomofo;3129 +iucyrillic;044E +ivowelsignbengali;09BF +ivowelsigndeva;093F +ivowelsigngujarati;0ABF +izhitsacyrillic;0475 +izhitsadblgravecyrillic;0477 +j;006A +jaarmenian;0571 +jabengali;099C +jadeva;091C +jagujarati;0A9C +jagurmukhi;0A1C +jbopomofo;3110 +jcaron;01F0 +jcircle;24D9 +jcircumflex;0135 +jcrossedtail;029D +jdotlessstroke;025F +jecyrillic;0458 +jeemarabic;062C +jeemfinalarabic;FE9E +jeeminitialarabic;FE9F +jeemmedialarabic;FEA0 +jeharabic;0698 +jehfinalarabic;FB8B +jhabengali;099D +jhadeva;091D +jhagujarati;0A9D +jhagurmukhi;0A1D +jheharmenian;057B +jis;3004 +jmonospace;FF4A +jparen;24A5 +jsuperior;02B2 +k;006B +kabashkircyrillic;04A1 +kabengali;0995 +kacute;1E31 +kacyrillic;043A +kadescendercyrillic;049B +kadeva;0915 +kaf;05DB +kafarabic;0643 +kafdagesh;FB3B +kafdageshhebrew;FB3B +kaffinalarabic;FEDA +kafhebrew;05DB +kafinitialarabic;FEDB +kafmedialarabic;FEDC +kafrafehebrew;FB4D +kagujarati;0A95 +kagurmukhi;0A15 +kahiragana;304B +kahookcyrillic;04C4 +kakatakana;30AB +kakatakanahalfwidth;FF76 +kappa;03BA +kappasymbolgreek;03F0 +kapyeounmieumkorean;3171 +kapyeounphieuphkorean;3184 +kapyeounpieupkorean;3178 +kapyeounssangpieupkorean;3179 +karoriisquare;330D +kashidaautoarabic;0640 +kashidaautonosidebearingarabic;0640 +kasmallkatakana;30F5 +kasquare;3384 +kasraarabic;0650 +kasratanarabic;064D +kastrokecyrillic;049F +katahiraprolongmarkhalfwidth;FF70 +kaverticalstrokecyrillic;049D +kbopomofo;310E +kcalsquare;3389 +kcaron;01E9 +kcedilla;0137 +kcircle;24DA +kcommaaccent;0137 +kdotbelow;1E33 +keharmenian;0584 +kehiragana;3051 +kekatakana;30B1 +kekatakanahalfwidth;FF79 +kenarmenian;056F +kesmallkatakana;30F6 +kgreenlandic;0138 +khabengali;0996 +khacyrillic;0445 +khadeva;0916 +khagujarati;0A96 +khagurmukhi;0A16 +khaharabic;062E +khahfinalarabic;FEA6 +khahinitialarabic;FEA7 +khahmedialarabic;FEA8 +kheicoptic;03E7 +khhadeva;0959 +khhagurmukhi;0A59 +khieukhacirclekorean;3278 +khieukhaparenkorean;3218 +khieukhcirclekorean;326A +khieukhkorean;314B +khieukhparenkorean;320A +khokhaithai;0E02 +khokhonthai;0E05 +khokhuatthai;0E03 +khokhwaithai;0E04 +khomutthai;0E5B +khook;0199 +khorakhangthai;0E06 +khzsquare;3391 +kihiragana;304D +kikatakana;30AD +kikatakanahalfwidth;FF77 +kiroguramusquare;3315 +kiromeetorusquare;3316 +kirosquare;3314 +kiyeokacirclekorean;326E +kiyeokaparenkorean;320E +kiyeokcirclekorean;3260 +kiyeokkorean;3131 +kiyeokparenkorean;3200 +kiyeoksioskorean;3133 +kjecyrillic;045C +klinebelow;1E35 +klsquare;3398 +kmcubedsquare;33A6 +kmonospace;FF4B +kmsquaredsquare;33A2 +kohiragana;3053 +kohmsquare;33C0 +kokaithai;0E01 +kokatakana;30B3 +kokatakanahalfwidth;FF7A +kooposquare;331E +koppacyrillic;0481 +koreanstandardsymbol;327F +koroniscmb;0343 +kparen;24A6 +kpasquare;33AA +ksicyrillic;046F +ktsquare;33CF +kturned;029E +kuhiragana;304F +kukatakana;30AF +kukatakanahalfwidth;FF78 +kvsquare;33B8 +kwsquare;33BE +l;006C +labengali;09B2 +lacute;013A +ladeva;0932 +lagujarati;0AB2 +lagurmukhi;0A32 +lakkhangyaothai;0E45 +lamaleffinalarabic;FEFC +lamalefhamzaabovefinalarabic;FEF8 +lamalefhamzaaboveisolatedarabic;FEF7 +lamalefhamzabelowfinalarabic;FEFA +lamalefhamzabelowisolatedarabic;FEF9 +lamalefisolatedarabic;FEFB +lamalefmaddaabovefinalarabic;FEF6 +lamalefmaddaaboveisolatedarabic;FEF5 +lamarabic;0644 +lambda;03BB +lambdastroke;019B +lamed;05DC +lameddagesh;FB3C +lameddageshhebrew;FB3C +lamedhebrew;05DC +lamedholam;05DC 05B9 +lamedholamdagesh;05DC 05B9 05BC +lamedholamdageshhebrew;05DC 05B9 05BC +lamedholamhebrew;05DC 05B9 +lamfinalarabic;FEDE +lamhahinitialarabic;FCCA +laminitialarabic;FEDF +lamjeeminitialarabic;FCC9 +lamkhahinitialarabic;FCCB +lamlamhehisolatedarabic;FDF2 +lammedialarabic;FEE0 +lammeemhahinitialarabic;FD88 +lammeeminitialarabic;FCCC +lammeemjeeminitialarabic;FEDF FEE4 FEA0 +lammeemkhahinitialarabic;FEDF FEE4 FEA8 +largecircle;25EF +lbar;019A +lbelt;026C +lbopomofo;310C +lcaron;013E +lcedilla;013C +lcircle;24DB +lcircumflexbelow;1E3D +lcommaaccent;013C +ldot;0140 +ldotaccent;0140 +ldotbelow;1E37 +ldotbelowmacron;1E39 +leftangleabovecmb;031A +lefttackbelowcmb;0318 +less;003C +lessequal;2264 +lessequalorgreater;22DA +lessmonospace;FF1C +lessorequivalent;2272 +lessorgreater;2276 +lessoverequal;2266 +lesssmall;FE64 +lezh;026E +lfblock;258C +lhookretroflex;026D +lira;20A4 +liwnarmenian;056C +lj;01C9 +ljecyrillic;0459 +ll;F6C0 +lladeva;0933 +llagujarati;0AB3 +llinebelow;1E3B +llladeva;0934 +llvocalicbengali;09E1 +llvocalicdeva;0961 +llvocalicvowelsignbengali;09E3 +llvocalicvowelsigndeva;0963 +lmiddletilde;026B +lmonospace;FF4C +lmsquare;33D0 +lochulathai;0E2C +logicaland;2227 +logicalnot;00AC +logicalnotreversed;2310 +logicalor;2228 +lolingthai;0E25 +longs;017F +lowlinecenterline;FE4E +lowlinecmb;0332 +lowlinedashed;FE4D +lozenge;25CA +lparen;24A7 +lslash;0142 +lsquare;2113 +lsuperior;F6EE +ltshade;2591 +luthai;0E26 +lvocalicbengali;098C +lvocalicdeva;090C +lvocalicvowelsignbengali;09E2 +lvocalicvowelsigndeva;0962 +lxsquare;33D3 +m;006D +mabengali;09AE +macron;00AF +macronbelowcmb;0331 +macroncmb;0304 +macronlowmod;02CD +macronmonospace;FFE3 +macute;1E3F +madeva;092E +magujarati;0AAE +magurmukhi;0A2E +mahapakhhebrew;05A4 +mahapakhlefthebrew;05A4 +mahiragana;307E +maichattawalowleftthai;F895 +maichattawalowrightthai;F894 +maichattawathai;0E4B +maichattawaupperleftthai;F893 +maieklowleftthai;F88C +maieklowrightthai;F88B +maiekthai;0E48 +maiekupperleftthai;F88A +maihanakatleftthai;F884 +maihanakatthai;0E31 +maitaikhuleftthai;F889 +maitaikhuthai;0E47 +maitholowleftthai;F88F +maitholowrightthai;F88E +maithothai;0E49 +maithoupperleftthai;F88D +maitrilowleftthai;F892 +maitrilowrightthai;F891 +maitrithai;0E4A +maitriupperleftthai;F890 +maiyamokthai;0E46 +makatakana;30DE +makatakanahalfwidth;FF8F +male;2642 +mansyonsquare;3347 +maqafhebrew;05BE +mars;2642 +masoracirclehebrew;05AF +masquare;3383 +mbopomofo;3107 +mbsquare;33D4 +mcircle;24DC +mcubedsquare;33A5 +mdotaccent;1E41 +mdotbelow;1E43 +meemarabic;0645 +meemfinalarabic;FEE2 +meeminitialarabic;FEE3 +meemmedialarabic;FEE4 +meemmeeminitialarabic;FCD1 +meemmeemisolatedarabic;FC48 +meetorusquare;334D +mehiragana;3081 +meizierasquare;337E +mekatakana;30E1 +mekatakanahalfwidth;FF92 +mem;05DE +memdagesh;FB3E +memdageshhebrew;FB3E +memhebrew;05DE +menarmenian;0574 +merkhahebrew;05A5 +merkhakefulahebrew;05A6 +merkhakefulalefthebrew;05A6 +merkhalefthebrew;05A5 +mhook;0271 +mhzsquare;3392 +middledotkatakanahalfwidth;FF65 +middot;00B7 +mieumacirclekorean;3272 +mieumaparenkorean;3212 +mieumcirclekorean;3264 +mieumkorean;3141 +mieumpansioskorean;3170 +mieumparenkorean;3204 +mieumpieupkorean;316E +mieumsioskorean;316F +mihiragana;307F +mikatakana;30DF +mikatakanahalfwidth;FF90 +minus;2212 +minusbelowcmb;0320 +minuscircle;2296 +minusmod;02D7 +minusplus;2213 +minute;2032 +miribaarusquare;334A +mirisquare;3349 +mlonglegturned;0270 +mlsquare;3396 +mmcubedsquare;33A3 +mmonospace;FF4D +mmsquaredsquare;339F +mohiragana;3082 +mohmsquare;33C1 +mokatakana;30E2 +mokatakanahalfwidth;FF93 +molsquare;33D6 +momathai;0E21 +moverssquare;33A7 +moverssquaredsquare;33A8 +mparen;24A8 +mpasquare;33AB +mssquare;33B3 +msuperior;F6EF +mturned;026F +mu;00B5 +mu1;00B5 +muasquare;3382 +muchgreater;226B +muchless;226A +mufsquare;338C +mugreek;03BC +mugsquare;338D +muhiragana;3080 +mukatakana;30E0 +mukatakanahalfwidth;FF91 +mulsquare;3395 +multiply;00D7 +mumsquare;339B +munahhebrew;05A3 +munahlefthebrew;05A3 +musicalnote;266A +musicalnotedbl;266B +musicflatsign;266D +musicsharpsign;266F +mussquare;33B2 +muvsquare;33B6 +muwsquare;33BC +mvmegasquare;33B9 +mvsquare;33B7 +mwmegasquare;33BF +mwsquare;33BD +n;006E +nabengali;09A8 +nabla;2207 +nacute;0144 +nadeva;0928 +nagujarati;0AA8 +nagurmukhi;0A28 +nahiragana;306A +nakatakana;30CA +nakatakanahalfwidth;FF85 +napostrophe;0149 +nasquare;3381 +nbopomofo;310B +nbspace;00A0 +ncaron;0148 +ncedilla;0146 +ncircle;24DD +ncircumflexbelow;1E4B +ncommaaccent;0146 +ndotaccent;1E45 +ndotbelow;1E47 +nehiragana;306D +nekatakana;30CD +nekatakanahalfwidth;FF88 +newsheqelsign;20AA +nfsquare;338B +ngabengali;0999 +ngadeva;0919 +ngagujarati;0A99 +ngagurmukhi;0A19 +ngonguthai;0E07 +nhiragana;3093 +nhookleft;0272 +nhookretroflex;0273 +nieunacirclekorean;326F +nieunaparenkorean;320F +nieuncieuckorean;3135 +nieuncirclekorean;3261 +nieunhieuhkorean;3136 +nieunkorean;3134 +nieunpansioskorean;3168 +nieunparenkorean;3201 +nieunsioskorean;3167 +nieuntikeutkorean;3166 +nihiragana;306B +nikatakana;30CB +nikatakanahalfwidth;FF86 +nikhahitleftthai;F899 +nikhahitthai;0E4D +nine;0039 +ninearabic;0669 +ninebengali;09EF +ninecircle;2468 +ninecircleinversesansserif;2792 +ninedeva;096F +ninegujarati;0AEF +ninegurmukhi;0A6F +ninehackarabic;0669 +ninehangzhou;3029 +nineideographicparen;3228 +nineinferior;2089 +ninemonospace;FF19 +nineoldstyle;F739 +nineparen;247C +nineperiod;2490 +ninepersian;06F9 +nineroman;2178 +ninesuperior;2079 +nineteencircle;2472 +nineteenparen;2486 +nineteenperiod;249A +ninethai;0E59 +nj;01CC +njecyrillic;045A +nkatakana;30F3 +nkatakanahalfwidth;FF9D +nlegrightlong;019E +nlinebelow;1E49 +nmonospace;FF4E +nmsquare;339A +nnabengali;09A3 +nnadeva;0923 +nnagujarati;0AA3 +nnagurmukhi;0A23 +nnnadeva;0929 +nohiragana;306E +nokatakana;30CE +nokatakanahalfwidth;FF89 +nonbreakingspace;00A0 +nonenthai;0E13 +nonuthai;0E19 +noonarabic;0646 +noonfinalarabic;FEE6 +noonghunnaarabic;06BA +noonghunnafinalarabic;FB9F +noonhehinitialarabic;FEE7 FEEC +nooninitialarabic;FEE7 +noonjeeminitialarabic;FCD2 +noonjeemisolatedarabic;FC4B +noonmedialarabic;FEE8 +noonmeeminitialarabic;FCD5 +noonmeemisolatedarabic;FC4E +noonnoonfinalarabic;FC8D +notcontains;220C +notelement;2209 +notelementof;2209 +notequal;2260 +notgreater;226F +notgreaternorequal;2271 +notgreaternorless;2279 +notidentical;2262 +notless;226E +notlessnorequal;2270 +notparallel;2226 +notprecedes;2280 +notsubset;2284 +notsucceeds;2281 +notsuperset;2285 +nowarmenian;0576 +nparen;24A9 +nssquare;33B1 +nsuperior;207F +ntilde;00F1 +nu;03BD +nuhiragana;306C +nukatakana;30CC +nukatakanahalfwidth;FF87 +nuktabengali;09BC +nuktadeva;093C +nuktagujarati;0ABC +nuktagurmukhi;0A3C +numbersign;0023 +numbersignmonospace;FF03 +numbersignsmall;FE5F +numeralsigngreek;0374 +numeralsignlowergreek;0375 +numero;2116 +nun;05E0 +nundagesh;FB40 +nundageshhebrew;FB40 +nunhebrew;05E0 +nvsquare;33B5 +nwsquare;33BB +nyabengali;099E +nyadeva;091E +nyagujarati;0A9E +nyagurmukhi;0A1E +o;006F +oacute;00F3 +oangthai;0E2D +obarred;0275 +obarredcyrillic;04E9 +obarreddieresiscyrillic;04EB +obengali;0993 +obopomofo;311B +obreve;014F +ocandradeva;0911 +ocandragujarati;0A91 +ocandravowelsigndeva;0949 +ocandravowelsigngujarati;0AC9 +ocaron;01D2 +ocircle;24DE +ocircumflex;00F4 +ocircumflexacute;1ED1 +ocircumflexdotbelow;1ED9 +ocircumflexgrave;1ED3 +ocircumflexhookabove;1ED5 +ocircumflextilde;1ED7 +ocyrillic;043E +odblacute;0151 +odblgrave;020D +odeva;0913 +odieresis;00F6 +odieresiscyrillic;04E7 +odotbelow;1ECD +oe;0153 +oekorean;315A +ogonek;02DB +ogonekcmb;0328 +ograve;00F2 +ogujarati;0A93 +oharmenian;0585 +ohiragana;304A +ohookabove;1ECF +ohorn;01A1 +ohornacute;1EDB +ohorndotbelow;1EE3 +ohorngrave;1EDD +ohornhookabove;1EDF +ohorntilde;1EE1 +ohungarumlaut;0151 +oi;01A3 +oinvertedbreve;020F +okatakana;30AA +okatakanahalfwidth;FF75 +okorean;3157 +olehebrew;05AB +omacron;014D +omacronacute;1E53 +omacrongrave;1E51 +omdeva;0950 +omega;03C9 +omega1;03D6 +omegacyrillic;0461 +omegalatinclosed;0277 +omegaroundcyrillic;047B +omegatitlocyrillic;047D +omegatonos;03CE +omgujarati;0AD0 +omicron;03BF +omicrontonos;03CC +omonospace;FF4F +one;0031 +onearabic;0661 +onebengali;09E7 +onecircle;2460 +onecircleinversesansserif;278A +onedeva;0967 +onedotenleader;2024 +oneeighth;215B +onefitted;F6DC +onegujarati;0AE7 +onegurmukhi;0A67 +onehackarabic;0661 +onehalf;00BD +onehangzhou;3021 +oneideographicparen;3220 +oneinferior;2081 +onemonospace;FF11 +onenumeratorbengali;09F4 +oneoldstyle;F731 +oneparen;2474 +oneperiod;2488 +onepersian;06F1 +onequarter;00BC +oneroman;2170 +onesuperior;00B9 +onethai;0E51 +onethird;2153 +oogonek;01EB +oogonekmacron;01ED +oogurmukhi;0A13 +oomatragurmukhi;0A4B +oopen;0254 +oparen;24AA +openbullet;25E6 +option;2325 +ordfeminine;00AA +ordmasculine;00BA +orthogonal;221F +oshortdeva;0912 +oshortvowelsigndeva;094A +oslash;00F8 +oslashacute;01FF +osmallhiragana;3049 +osmallkatakana;30A9 +osmallkatakanahalfwidth;FF6B +ostrokeacute;01FF +osuperior;F6F0 +otcyrillic;047F +otilde;00F5 +otildeacute;1E4D +otildedieresis;1E4F +oubopomofo;3121 +overline;203E +overlinecenterline;FE4A +overlinecmb;0305 +overlinedashed;FE49 +overlinedblwavy;FE4C +overlinewavy;FE4B +overscore;00AF +ovowelsignbengali;09CB +ovowelsigndeva;094B +ovowelsigngujarati;0ACB +p;0070 +paampssquare;3380 +paasentosquare;332B +pabengali;09AA +pacute;1E55 +padeva;092A +pagedown;21DF +pageup;21DE +pagujarati;0AAA +pagurmukhi;0A2A +pahiragana;3071 +paiyannoithai;0E2F +pakatakana;30D1 +palatalizationcyrilliccmb;0484 +palochkacyrillic;04C0 +pansioskorean;317F +paragraph;00B6 +parallel;2225 +parenleft;0028 +parenleftaltonearabic;FD3E +parenleftbt;F8ED +parenleftex;F8EC +parenleftinferior;208D +parenleftmonospace;FF08 +parenleftsmall;FE59 +parenleftsuperior;207D +parenlefttp;F8EB +parenleftvertical;FE35 +parenright;0029 +parenrightaltonearabic;FD3F +parenrightbt;F8F8 +parenrightex;F8F7 +parenrightinferior;208E +parenrightmonospace;FF09 +parenrightsmall;FE5A +parenrightsuperior;207E +parenrighttp;F8F6 +parenrightvertical;FE36 +partialdiff;2202 +paseqhebrew;05C0 +pashtahebrew;0599 +pasquare;33A9 +patah;05B7 +patah11;05B7 +patah1d;05B7 +patah2a;05B7 +patahhebrew;05B7 +patahnarrowhebrew;05B7 +patahquarterhebrew;05B7 +patahwidehebrew;05B7 +pazerhebrew;05A1 +pbopomofo;3106 +pcircle;24DF +pdotaccent;1E57 +pe;05E4 +pecyrillic;043F +pedagesh;FB44 +pedageshhebrew;FB44 +peezisquare;333B +pefinaldageshhebrew;FB43 +peharabic;067E +peharmenian;057A +pehebrew;05E4 +pehfinalarabic;FB57 +pehinitialarabic;FB58 +pehiragana;307A +pehmedialarabic;FB59 +pekatakana;30DA +pemiddlehookcyrillic;04A7 +perafehebrew;FB4E +percent;0025 +percentarabic;066A +percentmonospace;FF05 +percentsmall;FE6A +period;002E +periodarmenian;0589 +periodcentered;00B7 +periodhalfwidth;FF61 +periodinferior;F6E7 +periodmonospace;FF0E +periodsmall;FE52 +periodsuperior;F6E8 +perispomenigreekcmb;0342 +perpendicular;22A5 +perthousand;2030 +peseta;20A7 +pfsquare;338A +phabengali;09AB +phadeva;092B +phagujarati;0AAB +phagurmukhi;0A2B +phi;03C6 +phi1;03D5 +phieuphacirclekorean;327A +phieuphaparenkorean;321A +phieuphcirclekorean;326C +phieuphkorean;314D +phieuphparenkorean;320C +philatin;0278 +phinthuthai;0E3A +phisymbolgreek;03D5 +phook;01A5 +phophanthai;0E1E +phophungthai;0E1C +phosamphaothai;0E20 +pi;03C0 +pieupacirclekorean;3273 +pieupaparenkorean;3213 +pieupcieuckorean;3176 +pieupcirclekorean;3265 +pieupkiyeokkorean;3172 +pieupkorean;3142 +pieupparenkorean;3205 +pieupsioskiyeokkorean;3174 +pieupsioskorean;3144 +pieupsiostikeutkorean;3175 +pieupthieuthkorean;3177 +pieuptikeutkorean;3173 +pihiragana;3074 +pikatakana;30D4 +pisymbolgreek;03D6 +piwrarmenian;0583 +plus;002B +plusbelowcmb;031F +pluscircle;2295 +plusminus;00B1 +plusmod;02D6 +plusmonospace;FF0B +plussmall;FE62 +plussuperior;207A +pmonospace;FF50 +pmsquare;33D8 +pohiragana;307D +pointingindexdownwhite;261F +pointingindexleftwhite;261C +pointingindexrightwhite;261E +pointingindexupwhite;261D +pokatakana;30DD +poplathai;0E1B +postalmark;3012 +postalmarkface;3020 +pparen;24AB +precedes;227A +prescription;211E +primemod;02B9 +primereversed;2035 +product;220F +projective;2305 +prolongedkana;30FC +propellor;2318 +propersubset;2282 +propersuperset;2283 +proportion;2237 +proportional;221D +psi;03C8 +psicyrillic;0471 +psilipneumatacyrilliccmb;0486 +pssquare;33B0 +puhiragana;3077 +pukatakana;30D7 +pvsquare;33B4 +pwsquare;33BA +q;0071 +qadeva;0958 +qadmahebrew;05A8 +qafarabic;0642 +qaffinalarabic;FED6 +qafinitialarabic;FED7 +qafmedialarabic;FED8 +qamats;05B8 +qamats10;05B8 +qamats1a;05B8 +qamats1c;05B8 +qamats27;05B8 +qamats29;05B8 +qamats33;05B8 +qamatsde;05B8 +qamatshebrew;05B8 +qamatsnarrowhebrew;05B8 +qamatsqatanhebrew;05B8 +qamatsqatannarrowhebrew;05B8 +qamatsqatanquarterhebrew;05B8 +qamatsqatanwidehebrew;05B8 +qamatsquarterhebrew;05B8 +qamatswidehebrew;05B8 +qarneyparahebrew;059F +qbopomofo;3111 +qcircle;24E0 +qhook;02A0 +qmonospace;FF51 +qof;05E7 +qofdagesh;FB47 +qofdageshhebrew;FB47 +qofhatafpatah;05E7 05B2 +qofhatafpatahhebrew;05E7 05B2 +qofhatafsegol;05E7 05B1 +qofhatafsegolhebrew;05E7 05B1 +qofhebrew;05E7 +qofhiriq;05E7 05B4 +qofhiriqhebrew;05E7 05B4 +qofholam;05E7 05B9 +qofholamhebrew;05E7 05B9 +qofpatah;05E7 05B7 +qofpatahhebrew;05E7 05B7 +qofqamats;05E7 05B8 +qofqamatshebrew;05E7 05B8 +qofqubuts;05E7 05BB +qofqubutshebrew;05E7 05BB +qofsegol;05E7 05B6 +qofsegolhebrew;05E7 05B6 +qofsheva;05E7 05B0 +qofshevahebrew;05E7 05B0 +qoftsere;05E7 05B5 +qoftserehebrew;05E7 05B5 +qparen;24AC +quarternote;2669 +qubuts;05BB +qubuts18;05BB +qubuts25;05BB +qubuts31;05BB +qubutshebrew;05BB +qubutsnarrowhebrew;05BB +qubutsquarterhebrew;05BB +qubutswidehebrew;05BB +question;003F +questionarabic;061F +questionarmenian;055E +questiondown;00BF +questiondownsmall;F7BF +questiongreek;037E +questionmonospace;FF1F +questionsmall;F73F +quotedbl;0022 +quotedblbase;201E +quotedblleft;201C +quotedblmonospace;FF02 +quotedblprime;301E +quotedblprimereversed;301D +quotedblright;201D +quoteleft;2018 +quoteleftreversed;201B +quotereversed;201B +quoteright;2019 +quoterightn;0149 +quotesinglbase;201A +quotesingle;0027 +quotesinglemonospace;FF07 +r;0072 +raarmenian;057C +rabengali;09B0 +racute;0155 +radeva;0930 +radical;221A +radicalex;F8E5 +radoverssquare;33AE +radoverssquaredsquare;33AF +radsquare;33AD +rafe;05BF +rafehebrew;05BF +ragujarati;0AB0 +ragurmukhi;0A30 +rahiragana;3089 +rakatakana;30E9 +rakatakanahalfwidth;FF97 +ralowerdiagonalbengali;09F1 +ramiddlediagonalbengali;09F0 +ramshorn;0264 +ratio;2236 +rbopomofo;3116 +rcaron;0159 +rcedilla;0157 +rcircle;24E1 +rcommaaccent;0157 +rdblgrave;0211 +rdotaccent;1E59 +rdotbelow;1E5B +rdotbelowmacron;1E5D +referencemark;203B +reflexsubset;2286 +reflexsuperset;2287 +registered;00AE +registersans;F8E8 +registerserif;F6DA +reharabic;0631 +reharmenian;0580 +rehfinalarabic;FEAE +rehiragana;308C +rehyehaleflamarabic;0631 FEF3 FE8E 0644 +rekatakana;30EC +rekatakanahalfwidth;FF9A +resh;05E8 +reshdageshhebrew;FB48 +reshhatafpatah;05E8 05B2 +reshhatafpatahhebrew;05E8 05B2 +reshhatafsegol;05E8 05B1 +reshhatafsegolhebrew;05E8 05B1 +reshhebrew;05E8 +reshhiriq;05E8 05B4 +reshhiriqhebrew;05E8 05B4 +reshholam;05E8 05B9 +reshholamhebrew;05E8 05B9 +reshpatah;05E8 05B7 +reshpatahhebrew;05E8 05B7 +reshqamats;05E8 05B8 +reshqamatshebrew;05E8 05B8 +reshqubuts;05E8 05BB +reshqubutshebrew;05E8 05BB +reshsegol;05E8 05B6 +reshsegolhebrew;05E8 05B6 +reshsheva;05E8 05B0 +reshshevahebrew;05E8 05B0 +reshtsere;05E8 05B5 +reshtserehebrew;05E8 05B5 +reversedtilde;223D +reviahebrew;0597 +reviamugrashhebrew;0597 +revlogicalnot;2310 +rfishhook;027E +rfishhookreversed;027F +rhabengali;09DD +rhadeva;095D +rho;03C1 +rhook;027D +rhookturned;027B +rhookturnedsuperior;02B5 +rhosymbolgreek;03F1 +rhotichookmod;02DE +rieulacirclekorean;3271 +rieulaparenkorean;3211 +rieulcirclekorean;3263 +rieulhieuhkorean;3140 +rieulkiyeokkorean;313A +rieulkiyeoksioskorean;3169 +rieulkorean;3139 +rieulmieumkorean;313B +rieulpansioskorean;316C +rieulparenkorean;3203 +rieulphieuphkorean;313F +rieulpieupkorean;313C +rieulpieupsioskorean;316B +rieulsioskorean;313D +rieulthieuthkorean;313E +rieultikeutkorean;316A +rieulyeorinhieuhkorean;316D +rightangle;221F +righttackbelowcmb;0319 +righttriangle;22BF +rihiragana;308A +rikatakana;30EA +rikatakanahalfwidth;FF98 +ring;02DA +ringbelowcmb;0325 +ringcmb;030A +ringhalfleft;02BF +ringhalfleftarmenian;0559 +ringhalfleftbelowcmb;031C +ringhalfleftcentered;02D3 +ringhalfright;02BE +ringhalfrightbelowcmb;0339 +ringhalfrightcentered;02D2 +rinvertedbreve;0213 +rittorusquare;3351 +rlinebelow;1E5F +rlongleg;027C +rlonglegturned;027A +rmonospace;FF52 +rohiragana;308D +rokatakana;30ED +rokatakanahalfwidth;FF9B +roruathai;0E23 +rparen;24AD +rrabengali;09DC +rradeva;0931 +rragurmukhi;0A5C +rreharabic;0691 +rrehfinalarabic;FB8D +rrvocalicbengali;09E0 +rrvocalicdeva;0960 +rrvocalicgujarati;0AE0 +rrvocalicvowelsignbengali;09C4 +rrvocalicvowelsigndeva;0944 +rrvocalicvowelsigngujarati;0AC4 +rsuperior;F6F1 +rtblock;2590 +rturned;0279 +rturnedsuperior;02B4 +ruhiragana;308B +rukatakana;30EB +rukatakanahalfwidth;FF99 +rupeemarkbengali;09F2 +rupeesignbengali;09F3 +rupiah;F6DD +ruthai;0E24 +rvocalicbengali;098B +rvocalicdeva;090B +rvocalicgujarati;0A8B +rvocalicvowelsignbengali;09C3 +rvocalicvowelsigndeva;0943 +rvocalicvowelsigngujarati;0AC3 +s;0073 +sabengali;09B8 +sacute;015B +sacutedotaccent;1E65 +sadarabic;0635 +sadeva;0938 +sadfinalarabic;FEBA +sadinitialarabic;FEBB +sadmedialarabic;FEBC +sagujarati;0AB8 +sagurmukhi;0A38 +sahiragana;3055 +sakatakana;30B5 +sakatakanahalfwidth;FF7B +sallallahoualayhewasallamarabic;FDFA +samekh;05E1 +samekhdagesh;FB41 +samekhdageshhebrew;FB41 +samekhhebrew;05E1 +saraaathai;0E32 +saraaethai;0E41 +saraaimaimalaithai;0E44 +saraaimaimuanthai;0E43 +saraamthai;0E33 +saraathai;0E30 +saraethai;0E40 +saraiileftthai;F886 +saraiithai;0E35 +saraileftthai;F885 +saraithai;0E34 +saraothai;0E42 +saraueeleftthai;F888 +saraueethai;0E37 +saraueleftthai;F887 +sarauethai;0E36 +sarauthai;0E38 +sarauuthai;0E39 +sbopomofo;3119 +scaron;0161 +scarondotaccent;1E67 +scedilla;015F +schwa;0259 +schwacyrillic;04D9 +schwadieresiscyrillic;04DB +schwahook;025A +scircle;24E2 +scircumflex;015D +scommaaccent;0219 +sdotaccent;1E61 +sdotbelow;1E63 +sdotbelowdotaccent;1E69 +seagullbelowcmb;033C +second;2033 +secondtonechinese;02CA +section;00A7 +seenarabic;0633 +seenfinalarabic;FEB2 +seeninitialarabic;FEB3 +seenmedialarabic;FEB4 +segol;05B6 +segol13;05B6 +segol1f;05B6 +segol2c;05B6 +segolhebrew;05B6 +segolnarrowhebrew;05B6 +segolquarterhebrew;05B6 +segoltahebrew;0592 +segolwidehebrew;05B6 +seharmenian;057D +sehiragana;305B +sekatakana;30BB +sekatakanahalfwidth;FF7E +semicolon;003B +semicolonarabic;061B +semicolonmonospace;FF1B +semicolonsmall;FE54 +semivoicedmarkkana;309C +semivoicedmarkkanahalfwidth;FF9F +sentisquare;3322 +sentosquare;3323 +seven;0037 +sevenarabic;0667 +sevenbengali;09ED +sevencircle;2466 +sevencircleinversesansserif;2790 +sevendeva;096D +seveneighths;215E +sevengujarati;0AED +sevengurmukhi;0A6D +sevenhackarabic;0667 +sevenhangzhou;3027 +sevenideographicparen;3226 +seveninferior;2087 +sevenmonospace;FF17 +sevenoldstyle;F737 +sevenparen;247A +sevenperiod;248E +sevenpersian;06F7 +sevenroman;2176 +sevensuperior;2077 +seventeencircle;2470 +seventeenparen;2484 +seventeenperiod;2498 +seventhai;0E57 +sfthyphen;00AD +shaarmenian;0577 +shabengali;09B6 +shacyrillic;0448 +shaddaarabic;0651 +shaddadammaarabic;FC61 +shaddadammatanarabic;FC5E +shaddafathaarabic;FC60 +shaddafathatanarabic;0651 064B +shaddakasraarabic;FC62 +shaddakasratanarabic;FC5F +shade;2592 +shadedark;2593 +shadelight;2591 +shademedium;2592 +shadeva;0936 +shagujarati;0AB6 +shagurmukhi;0A36 +shalshelethebrew;0593 +shbopomofo;3115 +shchacyrillic;0449 +sheenarabic;0634 +sheenfinalarabic;FEB6 +sheeninitialarabic;FEB7 +sheenmedialarabic;FEB8 +sheicoptic;03E3 +sheqel;20AA +sheqelhebrew;20AA +sheva;05B0 +sheva115;05B0 +sheva15;05B0 +sheva22;05B0 +sheva2e;05B0 +shevahebrew;05B0 +shevanarrowhebrew;05B0 +shevaquarterhebrew;05B0 +shevawidehebrew;05B0 +shhacyrillic;04BB +shimacoptic;03ED +shin;05E9 +shindagesh;FB49 +shindageshhebrew;FB49 +shindageshshindot;FB2C +shindageshshindothebrew;FB2C +shindageshsindot;FB2D +shindageshsindothebrew;FB2D +shindothebrew;05C1 +shinhebrew;05E9 +shinshindot;FB2A +shinshindothebrew;FB2A +shinsindot;FB2B +shinsindothebrew;FB2B +shook;0282 +sigma;03C3 +sigma1;03C2 +sigmafinal;03C2 +sigmalunatesymbolgreek;03F2 +sihiragana;3057 +sikatakana;30B7 +sikatakanahalfwidth;FF7C +siluqhebrew;05BD +siluqlefthebrew;05BD +similar;223C +sindothebrew;05C2 +siosacirclekorean;3274 +siosaparenkorean;3214 +sioscieuckorean;317E +sioscirclekorean;3266 +sioskiyeokkorean;317A +sioskorean;3145 +siosnieunkorean;317B +siosparenkorean;3206 +siospieupkorean;317D +siostikeutkorean;317C +six;0036 +sixarabic;0666 +sixbengali;09EC +sixcircle;2465 +sixcircleinversesansserif;278F +sixdeva;096C +sixgujarati;0AEC +sixgurmukhi;0A6C +sixhackarabic;0666 +sixhangzhou;3026 +sixideographicparen;3225 +sixinferior;2086 +sixmonospace;FF16 +sixoldstyle;F736 +sixparen;2479 +sixperiod;248D +sixpersian;06F6 +sixroman;2175 +sixsuperior;2076 +sixteencircle;246F +sixteencurrencydenominatorbengali;09F9 +sixteenparen;2483 +sixteenperiod;2497 +sixthai;0E56 +slash;002F +slashmonospace;FF0F +slong;017F +slongdotaccent;1E9B +smileface;263A +smonospace;FF53 +sofpasuqhebrew;05C3 +softhyphen;00AD +softsigncyrillic;044C +sohiragana;305D +sokatakana;30BD +sokatakanahalfwidth;FF7F +soliduslongoverlaycmb;0338 +solidusshortoverlaycmb;0337 +sorusithai;0E29 +sosalathai;0E28 +sosothai;0E0B +sosuathai;0E2A +space;0020 +spacehackarabic;0020 +spade;2660 +spadesuitblack;2660 +spadesuitwhite;2664 +sparen;24AE +squarebelowcmb;033B +squarecc;33C4 +squarecm;339D +squarediagonalcrosshatchfill;25A9 +squarehorizontalfill;25A4 +squarekg;338F +squarekm;339E +squarekmcapital;33CE +squareln;33D1 +squarelog;33D2 +squaremg;338E +squaremil;33D5 +squaremm;339C +squaremsquared;33A1 +squareorthogonalcrosshatchfill;25A6 +squareupperlefttolowerrightfill;25A7 +squareupperrighttolowerleftfill;25A8 +squareverticalfill;25A5 +squarewhitewithsmallblack;25A3 +srsquare;33DB +ssabengali;09B7 +ssadeva;0937 +ssagujarati;0AB7 +ssangcieuckorean;3149 +ssanghieuhkorean;3185 +ssangieungkorean;3180 +ssangkiyeokkorean;3132 +ssangnieunkorean;3165 +ssangpieupkorean;3143 +ssangsioskorean;3146 +ssangtikeutkorean;3138 +ssuperior;F6F2 +sterling;00A3 +sterlingmonospace;FFE1 +strokelongoverlaycmb;0336 +strokeshortoverlaycmb;0335 +subset;2282 +subsetnotequal;228A +subsetorequal;2286 +succeeds;227B +suchthat;220B +suhiragana;3059 +sukatakana;30B9 +sukatakanahalfwidth;FF7D +sukunarabic;0652 +summation;2211 +sun;263C +superset;2283 +supersetnotequal;228B +supersetorequal;2287 +svsquare;33DC +syouwaerasquare;337C +t;0074 +tabengali;09A4 +tackdown;22A4 +tackleft;22A3 +tadeva;0924 +tagujarati;0AA4 +tagurmukhi;0A24 +taharabic;0637 +tahfinalarabic;FEC2 +tahinitialarabic;FEC3 +tahiragana;305F +tahmedialarabic;FEC4 +taisyouerasquare;337D +takatakana;30BF +takatakanahalfwidth;FF80 +tatweelarabic;0640 +tau;03C4 +tav;05EA +tavdages;FB4A +tavdagesh;FB4A +tavdageshhebrew;FB4A +tavhebrew;05EA +tbar;0167 +tbopomofo;310A +tcaron;0165 +tccurl;02A8 +tcedilla;0163 +tcheharabic;0686 +tchehfinalarabic;FB7B +tchehinitialarabic;FB7C +tchehmedialarabic;FB7D +tchehmeeminitialarabic;FB7C FEE4 +tcircle;24E3 +tcircumflexbelow;1E71 +tcommaaccent;0163 +tdieresis;1E97 +tdotaccent;1E6B +tdotbelow;1E6D +tecyrillic;0442 +tedescendercyrillic;04AD +teharabic;062A +tehfinalarabic;FE96 +tehhahinitialarabic;FCA2 +tehhahisolatedarabic;FC0C +tehinitialarabic;FE97 +tehiragana;3066 +tehjeeminitialarabic;FCA1 +tehjeemisolatedarabic;FC0B +tehmarbutaarabic;0629 +tehmarbutafinalarabic;FE94 +tehmedialarabic;FE98 +tehmeeminitialarabic;FCA4 +tehmeemisolatedarabic;FC0E +tehnoonfinalarabic;FC73 +tekatakana;30C6 +tekatakanahalfwidth;FF83 +telephone;2121 +telephoneblack;260E +telishagedolahebrew;05A0 +telishaqetanahebrew;05A9 +tencircle;2469 +tenideographicparen;3229 +tenparen;247D +tenperiod;2491 +tenroman;2179 +tesh;02A7 +tet;05D8 +tetdagesh;FB38 +tetdageshhebrew;FB38 +tethebrew;05D8 +tetsecyrillic;04B5 +tevirhebrew;059B +tevirlefthebrew;059B +thabengali;09A5 +thadeva;0925 +thagujarati;0AA5 +thagurmukhi;0A25 +thalarabic;0630 +thalfinalarabic;FEAC +thanthakhatlowleftthai;F898 +thanthakhatlowrightthai;F897 +thanthakhatthai;0E4C +thanthakhatupperleftthai;F896 +theharabic;062B +thehfinalarabic;FE9A +thehinitialarabic;FE9B +thehmedialarabic;FE9C +thereexists;2203 +therefore;2234 +theta;03B8 +theta1;03D1 +thetasymbolgreek;03D1 +thieuthacirclekorean;3279 +thieuthaparenkorean;3219 +thieuthcirclekorean;326B +thieuthkorean;314C +thieuthparenkorean;320B +thirteencircle;246C +thirteenparen;2480 +thirteenperiod;2494 +thonangmonthothai;0E11 +thook;01AD +thophuthaothai;0E12 +thorn;00FE +thothahanthai;0E17 +thothanthai;0E10 +thothongthai;0E18 +thothungthai;0E16 +thousandcyrillic;0482 +thousandsseparatorarabic;066C +thousandsseparatorpersian;066C +three;0033 +threearabic;0663 +threebengali;09E9 +threecircle;2462 +threecircleinversesansserif;278C +threedeva;0969 +threeeighths;215C +threegujarati;0AE9 +threegurmukhi;0A69 +threehackarabic;0663 +threehangzhou;3023 +threeideographicparen;3222 +threeinferior;2083 +threemonospace;FF13 +threenumeratorbengali;09F6 +threeoldstyle;F733 +threeparen;2476 +threeperiod;248A +threepersian;06F3 +threequarters;00BE +threequartersemdash;F6DE +threeroman;2172 +threesuperior;00B3 +threethai;0E53 +thzsquare;3394 +tihiragana;3061 +tikatakana;30C1 +tikatakanahalfwidth;FF81 +tikeutacirclekorean;3270 +tikeutaparenkorean;3210 +tikeutcirclekorean;3262 +tikeutkorean;3137 +tikeutparenkorean;3202 +tilde;02DC +tildebelowcmb;0330 +tildecmb;0303 +tildecomb;0303 +tildedoublecmb;0360 +tildeoperator;223C +tildeoverlaycmb;0334 +tildeverticalcmb;033E +timescircle;2297 +tipehahebrew;0596 +tipehalefthebrew;0596 +tippigurmukhi;0A70 +titlocyrilliccmb;0483 +tiwnarmenian;057F +tlinebelow;1E6F +tmonospace;FF54 +toarmenian;0569 +tohiragana;3068 +tokatakana;30C8 +tokatakanahalfwidth;FF84 +tonebarextrahighmod;02E5 +tonebarextralowmod;02E9 +tonebarhighmod;02E6 +tonebarlowmod;02E8 +tonebarmidmod;02E7 +tonefive;01BD +tonesix;0185 +tonetwo;01A8 +tonos;0384 +tonsquare;3327 +topatakthai;0E0F +tortoiseshellbracketleft;3014 +tortoiseshellbracketleftsmall;FE5D +tortoiseshellbracketleftvertical;FE39 +tortoiseshellbracketright;3015 +tortoiseshellbracketrightsmall;FE5E +tortoiseshellbracketrightvertical;FE3A +totaothai;0E15 +tpalatalhook;01AB +tparen;24AF +trademark;2122 +trademarksans;F8EA +trademarkserif;F6DB +tretroflexhook;0288 +triagdn;25BC +triaglf;25C4 +triagrt;25BA +triagup;25B2 +ts;02A6 +tsadi;05E6 +tsadidagesh;FB46 +tsadidageshhebrew;FB46 +tsadihebrew;05E6 +tsecyrillic;0446 +tsere;05B5 +tsere12;05B5 +tsere1e;05B5 +tsere2b;05B5 +tserehebrew;05B5 +tserenarrowhebrew;05B5 +tserequarterhebrew;05B5 +tserewidehebrew;05B5 +tshecyrillic;045B +tsuperior;F6F3 +ttabengali;099F +ttadeva;091F +ttagujarati;0A9F +ttagurmukhi;0A1F +tteharabic;0679 +ttehfinalarabic;FB67 +ttehinitialarabic;FB68 +ttehmedialarabic;FB69 +tthabengali;09A0 +tthadeva;0920 +tthagujarati;0AA0 +tthagurmukhi;0A20 +tturned;0287 +tuhiragana;3064 +tukatakana;30C4 +tukatakanahalfwidth;FF82 +tusmallhiragana;3063 +tusmallkatakana;30C3 +tusmallkatakanahalfwidth;FF6F +twelvecircle;246B +twelveparen;247F +twelveperiod;2493 +twelveroman;217B +twentycircle;2473 +twentyhangzhou;5344 +twentyparen;2487 +twentyperiod;249B +two;0032 +twoarabic;0662 +twobengali;09E8 +twocircle;2461 +twocircleinversesansserif;278B +twodeva;0968 +twodotenleader;2025 +twodotleader;2025 +twodotleadervertical;FE30 +twogujarati;0AE8 +twogurmukhi;0A68 +twohackarabic;0662 +twohangzhou;3022 +twoideographicparen;3221 +twoinferior;2082 +twomonospace;FF12 +twonumeratorbengali;09F5 +twooldstyle;F732 +twoparen;2475 +twoperiod;2489 +twopersian;06F2 +tworoman;2171 +twostroke;01BB +twosuperior;00B2 +twothai;0E52 +twothirds;2154 +u;0075 +uacute;00FA +ubar;0289 +ubengali;0989 +ubopomofo;3128 +ubreve;016D +ucaron;01D4 +ucircle;24E4 +ucircumflex;00FB +ucircumflexbelow;1E77 +ucyrillic;0443 +udattadeva;0951 +udblacute;0171 +udblgrave;0215 +udeva;0909 +udieresis;00FC +udieresisacute;01D8 +udieresisbelow;1E73 +udieresiscaron;01DA +udieresiscyrillic;04F1 +udieresisgrave;01DC +udieresismacron;01D6 +udotbelow;1EE5 +ugrave;00F9 +ugujarati;0A89 +ugurmukhi;0A09 +uhiragana;3046 +uhookabove;1EE7 +uhorn;01B0 +uhornacute;1EE9 +uhorndotbelow;1EF1 +uhorngrave;1EEB +uhornhookabove;1EED +uhorntilde;1EEF +uhungarumlaut;0171 +uhungarumlautcyrillic;04F3 +uinvertedbreve;0217 +ukatakana;30A6 +ukatakanahalfwidth;FF73 +ukcyrillic;0479 +ukorean;315C +umacron;016B +umacroncyrillic;04EF +umacrondieresis;1E7B +umatragurmukhi;0A41 +umonospace;FF55 +underscore;005F +underscoredbl;2017 +underscoremonospace;FF3F +underscorevertical;FE33 +underscorewavy;FE4F +union;222A +universal;2200 +uogonek;0173 +uparen;24B0 +upblock;2580 +upperdothebrew;05C4 +upsilon;03C5 +upsilondieresis;03CB +upsilondieresistonos;03B0 +upsilonlatin;028A +upsilontonos;03CD +uptackbelowcmb;031D +uptackmod;02D4 +uragurmukhi;0A73 +uring;016F +ushortcyrillic;045E +usmallhiragana;3045 +usmallkatakana;30A5 +usmallkatakanahalfwidth;FF69 +ustraightcyrillic;04AF +ustraightstrokecyrillic;04B1 +utilde;0169 +utildeacute;1E79 +utildebelow;1E75 +uubengali;098A +uudeva;090A +uugujarati;0A8A +uugurmukhi;0A0A +uumatragurmukhi;0A42 +uuvowelsignbengali;09C2 +uuvowelsigndeva;0942 +uuvowelsigngujarati;0AC2 +uvowelsignbengali;09C1 +uvowelsigndeva;0941 +uvowelsigngujarati;0AC1 +v;0076 +vadeva;0935 +vagujarati;0AB5 +vagurmukhi;0A35 +vakatakana;30F7 +vav;05D5 +vavdagesh;FB35 +vavdagesh65;FB35 +vavdageshhebrew;FB35 +vavhebrew;05D5 +vavholam;FB4B +vavholamhebrew;FB4B +vavvavhebrew;05F0 +vavyodhebrew;05F1 +vcircle;24E5 +vdotbelow;1E7F +vecyrillic;0432 +veharabic;06A4 +vehfinalarabic;FB6B +vehinitialarabic;FB6C +vehmedialarabic;FB6D +vekatakana;30F9 +venus;2640 +verticalbar;007C +verticallineabovecmb;030D +verticallinebelowcmb;0329 +verticallinelowmod;02CC +verticallinemod;02C8 +vewarmenian;057E +vhook;028B +vikatakana;30F8 +viramabengali;09CD +viramadeva;094D +viramagujarati;0ACD +visargabengali;0983 +visargadeva;0903 +visargagujarati;0A83 +vmonospace;FF56 +voarmenian;0578 +voicediterationhiragana;309E +voicediterationkatakana;30FE +voicedmarkkana;309B +voicedmarkkanahalfwidth;FF9E +vokatakana;30FA +vparen;24B1 +vtilde;1E7D +vturned;028C +vuhiragana;3094 +vukatakana;30F4 +w;0077 +wacute;1E83 +waekorean;3159 +wahiragana;308F +wakatakana;30EF +wakatakanahalfwidth;FF9C +wakorean;3158 +wasmallhiragana;308E +wasmallkatakana;30EE +wattosquare;3357 +wavedash;301C +wavyunderscorevertical;FE34 +wawarabic;0648 +wawfinalarabic;FEEE +wawhamzaabovearabic;0624 +wawhamzaabovefinalarabic;FE86 +wbsquare;33DD +wcircle;24E6 +wcircumflex;0175 +wdieresis;1E85 +wdotaccent;1E87 +wdotbelow;1E89 +wehiragana;3091 +weierstrass;2118 +wekatakana;30F1 +wekorean;315E +weokorean;315D +wgrave;1E81 +whitebullet;25E6 +whitecircle;25CB +whitecircleinverse;25D9 +whitecornerbracketleft;300E +whitecornerbracketleftvertical;FE43 +whitecornerbracketright;300F +whitecornerbracketrightvertical;FE44 +whitediamond;25C7 +whitediamondcontainingblacksmalldiamond;25C8 +whitedownpointingsmalltriangle;25BF +whitedownpointingtriangle;25BD +whiteleftpointingsmalltriangle;25C3 +whiteleftpointingtriangle;25C1 +whitelenticularbracketleft;3016 +whitelenticularbracketright;3017 +whiterightpointingsmalltriangle;25B9 +whiterightpointingtriangle;25B7 +whitesmallsquare;25AB +whitesmilingface;263A +whitesquare;25A1 +whitestar;2606 +whitetelephone;260F +whitetortoiseshellbracketleft;3018 +whitetortoiseshellbracketright;3019 +whiteuppointingsmalltriangle;25B5 +whiteuppointingtriangle;25B3 +wihiragana;3090 +wikatakana;30F0 +wikorean;315F +wmonospace;FF57 +wohiragana;3092 +wokatakana;30F2 +wokatakanahalfwidth;FF66 +won;20A9 +wonmonospace;FFE6 +wowaenthai;0E27 +wparen;24B2 +wring;1E98 +wsuperior;02B7 +wturned;028D +wynn;01BF +x;0078 +xabovecmb;033D +xbopomofo;3112 +xcircle;24E7 +xdieresis;1E8D +xdotaccent;1E8B +xeharmenian;056D +xi;03BE +xmonospace;FF58 +xparen;24B3 +xsuperior;02E3 +y;0079 +yaadosquare;334E +yabengali;09AF +yacute;00FD +yadeva;092F +yaekorean;3152 +yagujarati;0AAF +yagurmukhi;0A2F +yahiragana;3084 +yakatakana;30E4 +yakatakanahalfwidth;FF94 +yakorean;3151 +yamakkanthai;0E4E +yasmallhiragana;3083 +yasmallkatakana;30E3 +yasmallkatakanahalfwidth;FF6C +yatcyrillic;0463 +ycircle;24E8 +ycircumflex;0177 +ydieresis;00FF +ydotaccent;1E8F +ydotbelow;1EF5 +yeharabic;064A +yehbarreearabic;06D2 +yehbarreefinalarabic;FBAF +yehfinalarabic;FEF2 +yehhamzaabovearabic;0626 +yehhamzaabovefinalarabic;FE8A +yehhamzaaboveinitialarabic;FE8B +yehhamzaabovemedialarabic;FE8C +yehinitialarabic;FEF3 +yehmedialarabic;FEF4 +yehmeeminitialarabic;FCDD +yehmeemisolatedarabic;FC58 +yehnoonfinalarabic;FC94 +yehthreedotsbelowarabic;06D1 +yekorean;3156 +yen;00A5 +yenmonospace;FFE5 +yeokorean;3155 +yeorinhieuhkorean;3186 +yerahbenyomohebrew;05AA +yerahbenyomolefthebrew;05AA +yericyrillic;044B +yerudieresiscyrillic;04F9 +yesieungkorean;3181 +yesieungpansioskorean;3183 +yesieungsioskorean;3182 +yetivhebrew;059A +ygrave;1EF3 +yhook;01B4 +yhookabove;1EF7 +yiarmenian;0575 +yicyrillic;0457 +yikorean;3162 +yinyang;262F +yiwnarmenian;0582 +ymonospace;FF59 +yod;05D9 +yoddagesh;FB39 +yoddageshhebrew;FB39 +yodhebrew;05D9 +yodyodhebrew;05F2 +yodyodpatahhebrew;FB1F +yohiragana;3088 +yoikorean;3189 +yokatakana;30E8 +yokatakanahalfwidth;FF96 +yokorean;315B +yosmallhiragana;3087 +yosmallkatakana;30E7 +yosmallkatakanahalfwidth;FF6E +yotgreek;03F3 +yoyaekorean;3188 +yoyakorean;3187 +yoyakthai;0E22 +yoyingthai;0E0D +yparen;24B4 +ypogegrammeni;037A +ypogegrammenigreekcmb;0345 +yr;01A6 +yring;1E99 +ysuperior;02B8 +ytilde;1EF9 +yturned;028E +yuhiragana;3086 +yuikorean;318C +yukatakana;30E6 +yukatakanahalfwidth;FF95 +yukorean;3160 +yusbigcyrillic;046B +yusbigiotifiedcyrillic;046D +yuslittlecyrillic;0467 +yuslittleiotifiedcyrillic;0469 +yusmallhiragana;3085 +yusmallkatakana;30E5 +yusmallkatakanahalfwidth;FF6D +yuyekorean;318B +yuyeokorean;318A +yyabengali;09DF +yyadeva;095F +z;007A +zaarmenian;0566 +zacute;017A +zadeva;095B +zagurmukhi;0A5B +zaharabic;0638 +zahfinalarabic;FEC6 +zahinitialarabic;FEC7 +zahiragana;3056 +zahmedialarabic;FEC8 +zainarabic;0632 +zainfinalarabic;FEB0 +zakatakana;30B6 +zaqefgadolhebrew;0595 +zaqefqatanhebrew;0594 +zarqahebrew;0598 +zayin;05D6 +zayindagesh;FB36 +zayindageshhebrew;FB36 +zayinhebrew;05D6 +zbopomofo;3117 +zcaron;017E +zcircle;24E9 +zcircumflex;1E91 +zcurl;0291 +zdot;017C +zdotaccent;017C +zdotbelow;1E93 +zecyrillic;0437 +zedescendercyrillic;0499 +zedieresiscyrillic;04DF +zehiragana;305C +zekatakana;30BC +zero;0030 +zeroarabic;0660 +zerobengali;09E6 +zerodeva;0966 +zerogujarati;0AE6 +zerogurmukhi;0A66 +zerohackarabic;0660 +zeroinferior;2080 +zeromonospace;FF10 +zerooldstyle;F730 +zeropersian;06F0 +zerosuperior;2070 +zerothai;0E50 +zerowidthjoiner;FEFF +zerowidthnonjoiner;200C +zerowidthspace;200B +zeta;03B6 +zhbopomofo;3113 +zhearmenian;056A +zhebrevecyrillic;04C2 +zhecyrillic;0436 +zhedescendercyrillic;0497 +zhedieresiscyrillic;04DD +zihiragana;3058 +zikatakana;30B8 +zinorhebrew;05AE +zlinebelow;1E95 +zmonospace;FF5A +zohiragana;305E +zokatakana;30BE +zparen;24B5 +zretroflexhook;0290 +zstroke;01B6 +zuhiragana;305A +zukatakana;30BA +a100;275E +a101;2761 +a102;2762 +a103;2763 +a104;2764 +a105;2710 +a106;2765 +a107;2766 +a108;2767 +a109;2660 +a10;2721 +a110;2665 +a111;2666 +a112;2663 +a117;2709 +a118;2708 +a119;2707 +a11;261B +a120;2460 +a121;2461 +a122;2462 +a123;2463 +a124;2464 +a125;2465 +a126;2466 +a127;2467 +a128;2468 +a129;2469 +a12;261E +a130;2776 +a131;2777 +a132;2778 +a133;2779 +a134;277A +a135;277B +a136;277C +a137;277D +a138;277E +a139;277F +a13;270C +a140;2780 +a141;2781 +a142;2782 +a143;2783 +a144;2784 +a145;2785 +a146;2786 +a147;2787 +a148;2788 +a149;2789 +a14;270D +a150;278A +a151;278B +a152;278C +a153;278D +a154;278E +a155;278F +a156;2790 +a157;2791 +a158;2792 +a159;2793 +a15;270E +a160;2794 +a161;2192 +a162;27A3 +a163;2194 +a164;2195 +a165;2799 +a166;279B +a167;279C +a168;279D +a169;279E +a16;270F +a170;279F +a171;27A0 +a172;27A1 +a173;27A2 +a174;27A4 +a175;27A5 +a176;27A6 +a177;27A7 +a178;27A8 +a179;27A9 +a17;2711 +a180;27AB +a181;27AD +a182;27AF +a183;27B2 +a184;27B3 +a185;27B5 +a186;27B8 +a187;27BA +a188;27BB +a189;27BC +a18;2712 +a190;27BD +a191;27BE +a192;279A +a193;27AA +a194;27B6 +a195;27B9 +a196;2798 +a197;27B4 +a198;27B7 +a199;27AC +a19;2713 +a1;2701 +a200;27AE +a201;27B1 +a202;2703 +a203;2750 +a204;2752 +a205;276E +a206;2770 +a20;2714 +a21;2715 +a22;2716 +a23;2717 +a24;2718 +a25;2719 +a26;271A +a27;271B +a28;271C +a29;2722 +a2;2702 +a30;2723 +a31;2724 +a32;2725 +a33;2726 +a34;2727 +a35;2605 +a36;2729 +a37;272A +a38;272B +a39;272C +a3;2704 +a40;272D +a41;272E +a42;272F +a43;2730 +a44;2731 +a45;2732 +a46;2733 +a47;2734 +a48;2735 +a49;2736 +a4;260E +a50;2737 +a51;2738 +a52;2739 +a53;273A +a54;273B +a55;273C +a56;273D +a57;273E +a58;273F +a59;2740 +a5;2706 +a60;2741 +a61;2742 +a62;2743 +a63;2744 +a64;2745 +a65;2746 +a66;2747 +a67;2748 +a68;2749 +a69;274A +a6;271D +a70;274B +a71;25CF +a72;274D +a73;25A0 +a74;274F +a75;2751 +a76;25B2 +a77;25BC +a78;25C6 +a79;2756 +a7;271E +a81;25D7 +a82;2758 +a83;2759 +a84;275A +a85;276F +a86;2771 +a87;2772 +a88;2773 +a89;2768 +a8;271F +a90;2769 +a91;276C +a92;276D +a93;276A +a94;276B +a95;2774 +a96;2775 +a97;275B +a98;275C +a99;275D +a9;2720 +""" + + +# string table management +# +class StringTable: + def __init__(self, name_list, master_table_name): + self.names = name_list + self.master_table = master_table_name + self.indices = {} + index = 0 + + for name in name_list: + self.indices[name] = index + index += len(name) + 1 + + self.total = index + + def dump(self, file): + write = file.write + write("#ifndef DEFINE_PS_TABLES_DATA\n") + write("#ifdef __cplusplus\n") + write(' extern "C"\n') + write("#else\n") + write(" extern\n") + write("#endif\n") + write("#endif\n") + write(" const char " + self.master_table + + "[" + repr(self.total) + "]\n") + write("#ifdef DEFINE_PS_TABLES_DATA\n") + write(" =\n") + write(" {\n") + + line = "" + for name in self.names: + line += " '" + line += "','".join(list(name)) + line += "', 0,\n" + + write(line) + write(" }\n") + write("#endif /* DEFINE_PS_TABLES_DATA */\n") + write(" ;\n\n\n") + + def dump_sublist(self, file, table_name, macro_name, sublist): + write = file.write + write("#define " + macro_name + " " + repr(len(sublist)) + "\n\n") + + write(" /* Values are offsets into the `" + + self.master_table + "' table */\n\n") + write("#ifndef DEFINE_PS_TABLES_DATA\n") + write("#ifdef __cplusplus\n") + write(' extern "C"\n') + write("#else\n") + write(" extern\n") + write("#endif\n") + write("#endif\n") + write(" const short " + table_name + + "[" + macro_name + "]\n") + write("#ifdef DEFINE_PS_TABLES_DATA\n") + write(" =\n") + write(" {\n") + + line = " " + comma = "" + col = 0 + + for name in sublist: + line += comma + line += "%4d" % self.indices[name] + col += 1 + comma = "," + if col == 14: + col = 0 + comma = ",\n " + + write(line) + write("\n") + write(" }\n") + write("#endif /* DEFINE_PS_TABLES_DATA */\n") + write(" ;\n\n\n") + + +# We now store the Adobe Glyph List in compressed form. The list is put +# into a data structure called `trie' (because it has a tree-like +# appearance). Consider, for example, that you want to store the +# following name mapping: +# +# A => 1 +# Aacute => 6 +# Abalon => 2 +# Abstract => 4 +# +# It is possible to store the entries as follows. +# +# A => 1 +# | +# +-acute => 6 +# | +# +-b +# | +# +-alon => 2 +# | +# +-stract => 4 +# +# We see that each node in the trie has: +# +# - one or more `letters' +# - an optional value +# - zero or more child nodes +# +# The first step is to call +# +# root = StringNode( "", 0 ) +# for word in map.values(): +# root.add( word, map[word] ) +# +# which creates a large trie where each node has only one children. +# +# Executing +# +# root = root.optimize() +# +# optimizes the trie by merging the letters of successive nodes whenever +# possible. +# +# Each node of the trie is stored as follows. +# +# - First the node's letter, according to the following scheme. We +# use the fact that in the AGL no name contains character codes > 127. +# +# name bitsize description +# ---------------------------------------------------------------- +# notlast 1 Set to 1 if this is not the last letter +# in the word. +# ascii 7 The letter's ASCII value. +# +# - The letter is followed by a children count and the value of the +# current key (if any). Again we can do some optimization because all +# AGL entries are from the BMP; this means that 16 bits are sufficient +# to store its Unicode values. Additionally, no node has more than +# 127 children. +# +# name bitsize description +# ----------------------------------------- +# hasvalue 1 Set to 1 if a 16-bit Unicode value follows. +# num_children 7 Number of children. Can be 0 only if +# `hasvalue' is set to 1. +# value 16 Optional Unicode value. +# +# - A node is finished by a list of 16bit absolute offsets to the +# children, which must be sorted in increasing order of their first +# letter. +# +# For simplicity, all 16bit quantities are stored in big-endian order. +# +# The root node has first letter = 0, and no value. +# +class StringNode: + def __init__(self, letter, value): + self.letter = letter + self.value = value + self.children = {} + + def __cmp__(self, other): + return ord(self.letter[0]) - ord(other.letter[0]) + + def __lt__(self, other): + return self.letter[0] < other.letter[0] + + def add(self, word, value): + if len(word) == 0: + self.value = value + return + + letter = word[0] + word = word[1:] + + if letter in self.children: + child = self.children[letter] + else: + child = StringNode(letter, 0) + self.children[letter] = child + + child.add(word, value) + + def optimize(self): + # optimize all children first + children = list(self.children.values()) + self.children = {} + + for child in children: + self.children[child.letter[0]] = child.optimize() + + # don't optimize if there's a value, + # if we don't have any child or if we + # have more than one child + if (self.value != 0) or (not children) or len(children) > 1: + return self + + child = children[0] + + self.letter += child.letter + self.value = child.value + self.children = child.children + + return self + + def dump_debug(self, write, margin): + # this is used during debugging + line = margin + "+-" + if len(self.letter) == 0: + line += "<NOLETTER>" + else: + line += self.letter + + if self.value: + line += " => " + repr(self.value) + + write(line + "\n") + + if self.children: + margin += "| " + for child in self.children.values(): + child.dump_debug(write, margin) + + def locate(self, index): + self.index = index + if len(self.letter) > 0: + index += len(self.letter) + 1 + else: + index += 2 + + if self.value != 0: + index += 2 + + children = list(self.children.values()) + children.sort() + + index += 2 * len(children) + for child in children: + index = child.locate(index) + + return index + + def store(self, storage): + # write the letters + length = len(self.letter) + if length == 0: + storage += struct.pack("B", 0) + else: + for n in range(length): + val = ord(self.letter[n]) + if n < length - 1: + val += 128 + storage += struct.pack("B", val) + + # write the count + children = list(self.children.values()) + children.sort() + + count = len(children) + + if self.value != 0: + storage += struct.pack("!BH", count + 128, self.value) + else: + storage += struct.pack("B", count) + + for child in children: + storage += struct.pack("!H", child.index) + + for child in children: + storage = child.store(storage) + + return storage + + +def adobe_glyph_values(): + """return the list of glyph names and their unicode values""" + + lines = adobe_glyph_list.split("\n") + glyphs = [] + values = [] + + for line in lines: + if line: + fields = line.split(';') + # print fields[1] + ' - ' + fields[0] + subfields = fields[1].split(' ') + if len(subfields) == 1: + glyphs.append(fields[0]) + values.append(fields[1]) + + return glyphs, values + + +def filter_glyph_names(alist, filter): + """filter `alist' by taking _out_ all glyph names that are in `filter'""" + + count = 0 + extras = [] + + for name in alist: + try: + filtered_index = filter.index(name) + except: + extras.append(name) + + return extras + + +def dump_encoding(file, encoding_name, encoding_list): + """dump a given encoding""" + + write = file.write + write(" /* the following are indices into the SID name table */\n") + write("#ifndef DEFINE_PS_TABLES_DATA\n") + write("#ifdef __cplusplus\n") + write(' extern "C"\n') + write("#else\n") + write(" extern\n") + write("#endif\n") + write("#endif\n") + write(" const unsigned short " + encoding_name + + "[" + repr(len(encoding_list)) + "]\n") + write("#ifdef DEFINE_PS_TABLES_DATA\n") + write(" =\n") + write(" {\n") + + line = " " + comma = "" + col = 0 + for value in encoding_list: + line += comma + line += "%3d" % value + comma = "," + col += 1 + if col == 16: + col = 0 + comma = ",\n " + + write(line) + write("\n") + write(" }\n") + write("#endif /* DEFINE_PS_TABLES_DATA */\n") + write(" ;\n\n\n") + + +def dump_array(the_array, write, array_name): + """dumps a given encoding""" + + write("#ifndef DEFINE_PS_TABLES_DATA\n") + write("#ifdef __cplusplus\n") + write(' extern "C"\n') + write("#else\n") + write(" extern\n") + write("#endif\n") + write("#endif\n") + write(" const unsigned char " + array_name + + "[" + repr(len(the_array)) + "L]\n") + write("#ifdef DEFINE_PS_TABLES_DATA\n") + write(" =\n") + write(" {\n") + + line = "" + comma = " " + col = 0 + + for value in the_array: + line += comma + line += "%3d" % value + comma = "," + col += 1 + + if col == 16: + col = 0 + comma = ",\n " + + if len(line) > 1024: + write(line) + line = "" + + write(line) + write("\n") + write(" }\n") + write("#endif /* DEFINE_PS_TABLES_DATA */\n") + write(" ;\n\n\n") + + +def main(): + """main program body""" + + if len(sys.argv) != 2: + print(__doc__ % sys.argv[0]) + sys.exit(1) + + file = open(sys.argv[1], "w") + write = file.write + + count_sid = len(sid_standard_names) + + # `mac_extras' contains the list of glyph names in the Macintosh standard + # encoding which are not in the SID Standard Names. + # + mac_extras = filter_glyph_names(mac_standard_names, sid_standard_names) + + # `base_list' contains the names of our final glyph names table. + # It consists of the `mac_extras' glyph names, followed by the SID + # standard names. + # + mac_extras_count = len(mac_extras) + base_list = mac_extras + sid_standard_names + + write("/*\n") + write(" *\n") + write(" * %-71s\n" % os.path.basename(sys.argv[1])) + write(" *\n") + write(" * PostScript glyph names.\n") + write(" *\n") + write(" * Copyright 2005-2022 by\n") + write(" * David Turner, Robert Wilhelm, and Werner Lemberg.\n") + write(" *\n") + write(" * This file is part of the FreeType project, and may only be " + "used,\n") + write(" * modified, and distributed under the terms of the FreeType " + "project\n") + write(" * license, LICENSE.TXT. By continuing to use, modify, or " + "distribute\n") + write(" * this file you indicate that you have read the license and\n") + write(" * understand and accept it fully.\n") + write(" *\n") + write(" */\n") + write("\n") + write("\n") + write(" /* This file has been generated automatically -- do not edit! */" + "\n") + write("\n") + write("\n") + + # dump final glyph list (mac extras + sid standard names) + # + st = StringTable(base_list, "ft_standard_glyph_names") + + st.dump(file) + st.dump_sublist(file, "ft_mac_names", + "FT_NUM_MAC_NAMES", mac_standard_names) + st.dump_sublist(file, "ft_sid_names", + "FT_NUM_SID_NAMES", sid_standard_names) + + dump_encoding(file, "t1_standard_encoding", t1_standard_encoding) + dump_encoding(file, "t1_expert_encoding", t1_expert_encoding) + + # dump the AGL in its compressed form + # + agl_glyphs, agl_values = adobe_glyph_values() + dictionary = StringNode("", 0) + + for g in range(len(agl_glyphs)): + dictionary.add(agl_glyphs[g], eval("0x" + agl_values[g])) + + dictionary = dictionary.optimize() + dict_len = dictionary.locate(0) + dict_array = dictionary.store(b"") + + write("""\ + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + +""") + + dump_array(dict_array, write, "ft_adobe_glyph_list") + + # write the lookup routine now + # + write("""\ +#ifdef DEFINE_PS_TABLES + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } +#endif /* DEFINE_PS_TABLES */ + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + +""") + + if 0: # generate unit test, or don't + # + # now write the unit test to check that everything works OK + # + write("#ifdef TEST\n\n") + + write("static const char* const the_names[] = {\n") + for name in agl_glyphs: + write(' "' + name + '",\n') + write(" 0\n};\n") + + write("static const unsigned long the_values[] = {\n") + for val in agl_values: + write(' 0x' + val + ',\n') + write(" 0\n};\n") + + write(""" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +int +main( void ) +{ +int result = 0; +const char* const* names = the_names; +const unsigned long* values = the_values; + + +for ( ; *names; names++, values++ ) +{ + const char* name = *names; + unsigned long reference = *values; + unsigned long value; + + + value = ft_get_adobe_glyph_index( name, name + strlen( name ) ); + if ( value != reference ) + { + result = 1; + fprintf( stderr, "name '%s' => %04x instead of %04x\\n", + name, value, reference ); + } +} + +return result; +} +""") + + write("#endif /* TEST */\n") + + write("\n/* END */\n") + + +# Now run the main routine +# +main() + +# END diff --git a/external/freetype/src/tools/make_distribution_archives.py b/external/freetype/src/tools/make_distribution_archives.py new file mode 100644 index 000000000..f29eb128c --- /dev/null +++ b/external/freetype/src/tools/make_distribution_archives.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python3 +"""Generate distribution archives for a given FreeType 2 release.""" + +from __future__ import print_function + +import argparse +import atexit +import os +import shutil +import subprocess +import sys +import tempfile + +_TOP_DIR = os.path.abspath(os.path.join(__file__, "..", "..", "..")) +_SCRIPT_DIR = os.path.dirname(os.path.join(_TOP_DIR, "builds", "meson", "")) + + +def get_cmd_output(cmd, cwd=None): + """Run a command and return its output as a string.""" + if cwd is not None: + out = subprocess.check_output(cmd, cwd=cwd) + else: + out = subprocess.check_output(cmd) + return out.decode("utf-8").rstrip() + + +def is_git_dir_clean(git_dir): + """Return True iff |git_dir| is a git directory in clean state.""" + out = get_cmd_output(["git", "status", "--porcelain"], cwd=git_dir) + return len(out) == 0 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + + parser.add_argument( + "--source_dir", default=_TOP_DIR, help="Source directory path." + ) + + parser.add_argument( + "--version", + help=( + "Specify alternate FreeType version (it is otherwise extracted" + " from current sources by default)." + ), + ) + + parser.add_argument( + "--gnu-config-dir", + help=( + "Path of input directory containing recent `config.guess` and" + " `config.sub` files from GNU config." + ), + ) + + parser.add_argument( + "--build-dir", + help="Specify build directory. Only used for debugging this script.", + ) + + parser.add_argument( + "--ignore-clean-check", + action="store_true", + help=( + "Do not check for a clean source git repository. Only used for" + " debugging this script." + ), + ) + + parser.add_argument( + "output_dir", help="Output directory for generated archives." + ) + + args = parser.parse_args() + + git_dir = args.source_dir if args.source_dir else _TOP_DIR + if not args.ignore_clean_check and not is_git_dir_clean(git_dir): + sys.stderr.write( + "ERROR: Your git repository is not in a clean state: %s\n" + % git_dir + ) + return 1 + + if args.version: + version = args.version + else: + # Extract FreeType version from sources. + version = get_cmd_output( + [ + sys.executable, + os.path.join(_SCRIPT_DIR, "extract_freetype_version.py"), + os.path.join(_TOP_DIR, "include", "freetype", "freetype.h"), + ] + ) + + # Determine the build directory. This will be a temporary file that is + # cleaned up on script exit by default, unless --build-dir=DIR is used, + # in which case we only create and empty the directory, but never remove + # its content on exit. + if args.build_dir: + build_dir = args.build_dir + if not os.path.exists(build_dir): + os.makedirs(build_dir) + else: + # Remove anything from the build directory, if any. + for item in os.listdir(build_dir): + file_path = os.path.join(build_dir, item) + if os.path.isdir(file_path): + shutil.rmtree(file_path) + else: + os.unlink(file_path) + else: + # Create a temporary directory, and ensure it is removed on exit. + build_dir = tempfile.mkdtemp(prefix="freetype-dist-") + + def clean_build_dir(): + shutil.rmtree(build_dir) + + atexit.register(clean_build_dir) + + # Copy all source files known to git into $BUILD_DIR/freetype-$VERSION + # with the exception of .gitignore and .mailmap files. + source_files = [ + f + for f in get_cmd_output(["git", "ls-files"], cwd=git_dir).split("\n") + if os.path.basename(f) not in (".gitignore", ".mailmap") + ] + + freetype_dir = "freetype-" + version + tmp_src_dir = os.path.join(build_dir, freetype_dir) + os.makedirs(tmp_src_dir) + + for src in source_files: + dst = os.path.join(tmp_src_dir, src) + dst_dir = os.path.dirname(dst) + if not os.path.exists(dst_dir): + os.makedirs(dst_dir) + shutil.copy(os.path.join(git_dir, src), dst) + + # Run autogen.sh in directory. + subprocess.check_call(["/bin/sh", "autogen.sh"], cwd=tmp_src_dir) + shutil.rmtree( + os.path.join(tmp_src_dir, "builds", "unix", "autom4te.cache") + ) + + # Copy config.guess and config.sub if possible! + if args.gnu_config_dir: + for f in ("config.guess", "config.sub"): + shutil.copy( + os.path.join(args.gnu_config_dir, f), + os.path.join(tmp_src_dir, "builds", "unix", f), + ) + + # Generate reference documentation under docs/ + subprocess.check_call( + [ + sys.executable, + os.path.join(_SCRIPT_DIR, "generate_reference_docs.py"), + "--input-dir", + tmp_src_dir, + "--version", + version, + "--output-dir", + os.path.join(tmp_src_dir, "docs"), + ] + ) + + shutil.rmtree(os.path.join(tmp_src_dir, "docs", "markdown")) + os.unlink(os.path.join(tmp_src_dir, "docs", "mkdocs.yml")) + + # Generate our archives + freetype_tar = freetype_dir + ".tar" + + subprocess.check_call( + ["tar", "-H", "ustar", "-chf", freetype_tar, freetype_dir], + cwd=build_dir, + ) + + subprocess.check_call( + ["gzip", "-9", "--keep", freetype_tar], cwd=build_dir + ) + + subprocess.check_call(["xz", "--keep", freetype_tar], cwd=build_dir) + + ftwinversion = "ft" + "".join(version.split(".")) + subprocess.check_call( + ["zip", "-qlr9", ftwinversion + ".zip", freetype_dir], cwd=build_dir + ) + + # Copy file to output directory now. + if not os.path.exists(args.output_dir): + os.makedirs(args.output_dir) + + for f in ( + freetype_tar + ".gz", + freetype_tar + ".xz", + ftwinversion + ".zip", + ): + shutil.copy( + os.path.join(build_dir, f), os.path.join(args.output_dir, f) + ) + + # Done! + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/external/freetype/src/tools/no-copyright b/external/freetype/src/tools/no-copyright new file mode 100644 index 000000000..e171b76f3 --- /dev/null +++ b/external/freetype/src/tools/no-copyright @@ -0,0 +1,66 @@ +# Files that don't get a copyright, or which are taken from elsewhere. +# +# All lines in this file are patterns (relative to the top-level directory), +# including the comment lines; this means that e.g. `FTL.TXT' matches all +# files that have this string in the file name (including the path relative +# to the current directory, always starting with `./'). +# +# Don't put empty lines into this file! +# +builds/unix/pkg.m4 +# +docs/FTL.TXT +docs/GPLv2.TXT +# +include/freetype/internal/fthash.h +# +src/base/fthash.c +src/base/md5.c +src/base/md5.h +# +src/bdf/bdf.c +src/bdf/bdf.h +src/bdf/bdfdrivr.c +src/bdf/bdfdrivr.h +src/bdf/bdferror.h +src/bdf/bdflib.c +src/bdf/module.mk +src/bdf/README +src/bdf/rules.mk +# +src/pcf/module.mk +src/pcf/pcf.c +src/pcf/pcf.h +src/pcf/pcfdrivr.c +src/pcf/pcfdrivr.h +src/pcf/pcferror.h +src/pcf/pcfread.c +src/pcf/pcfread.h +src/pcf/pcfutil.c +src/pcf/pcfutil.h +src/pcf/README +src/pcf/rules.mk +# +src/gzip/adler32.c +src/gzip/ftzconf.c +src/gzip/infblock.c +src/gzip/infblock.h +src/gzip/infcodes.c +src/gzip/infcodes.h +src/gzip/inffixed.h +src/gzip/inflate.c +src/gzip/inftrees.c +src/gzip/inftrees.h +src/gzip/infutil.c +src/gzip/infutil.h +src/gzip/zconf.h +src/gzip/zlib.h +src/gzip/zutil.c +src/gzip/zutil.h +# +src/tools/apinames.c +src/tools/ftrandom/ftrandom.c +# +subprojects/dlg +# +# EOF diff --git a/external/freetype/src/tools/test_afm.c b/external/freetype/src/tools/test_afm.c new file mode 100644 index 000000000..a4b226898 --- /dev/null +++ b/external/freetype/src/tools/test_afm.c @@ -0,0 +1,156 @@ +/* + * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \ + * -L../../objs/.libs -lfreetype -lz -static + */ +#include <freetype/freetype.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/psaux.h> + + void dump_fontinfo( AFM_FontInfo fi ) + { + FT_UInt i; + + + printf( "This AFM is for %sCID font.\n\n", + ( fi->IsCIDFont ) ? "" : "non-" ); + + printf( "FontBBox: %.2f %.2f %.2f %.2f\n", fi->FontBBox.xMin / 65536., + fi->FontBBox.yMin / 65536., + fi->FontBBox.xMax / 65536., + fi->FontBBox.yMax / 65536. ); + printf( "Ascender: %.2f\n", fi->Ascender / 65536. ); + printf( "Descender: %.2f\n\n", fi->Descender / 65536. ); + + if ( fi->NumTrackKern ) + printf( "There are %d sets of track kernings:\n", + fi->NumTrackKern ); + else + printf( "There is no track kerning.\n" ); + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + printf( "\t%2d: %5.2f %5.2f %5.2f %5.2f\n", tk->degree, + tk->min_ptsize / 65536., + tk->min_kern / 65536., + tk->max_ptsize / 65536., + tk->max_kern / 65536. ); + } + + printf( "\n" ); + + if ( fi->NumKernPair ) + printf( "There are %d kerning pairs:\n", + fi->NumKernPair ); + else + printf( "There is no kerning pair.\n" ); + + for ( i = 0; i < fi->NumKernPair; i++ ) + { + AFM_KernPair kp = fi->KernPairs + i; + + + printf( "\t%3d + %3d => (%4d, %4d)\n", kp->index1, + kp->index2, + kp->x, + kp->y ); + } + + } + + int + dummy_get_index( const char* name, + FT_Offset len, + void* user_data ) + { + if ( len ) + return name[0]; + else + return 0; + } + + FT_Error + parse_afm( FT_Library library, + FT_Stream stream, + AFM_FontInfo fi ) + { + PSAux_Service psaux; + AFM_ParserRec parser; + FT_Error error = FT_Err_Ok; + + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); + if ( !psaux || !psaux->afm_parser_funcs ) + return -1; + + error = FT_Stream_EnterFrame( stream, stream->size ); + if ( error ) + return error; + + error = psaux->afm_parser_funcs->init( &parser, + library->memory, + stream->cursor, + stream->limit ); + if ( error ) + return error; + + parser.FontInfo = fi; + parser.get_index = dummy_get_index; + + error = psaux->afm_parser_funcs->parse( &parser ); + + psaux->afm_parser_funcs->done( &parser ); + + return error; + } + + + int main( int argc, + char** argv ) + { + FT_Library library; + FT_StreamRec stream; + FT_Error error = FT_Err_Ok; + AFM_FontInfoRec fi; + + + if ( argc < 2 ) + return FT_ERR( Invalid_Argument ); + + error = FT_Init_FreeType( &library ); + if ( error ) + return error; + + FT_ZERO( &stream ); + error = FT_Stream_Open( &stream, argv[1] ); + if ( error ) + goto Exit; + stream.memory = library->memory; + + FT_ZERO( &fi ); + error = parse_afm( library, &stream, &fi ); + + if ( !error ) + { + FT_Memory memory = library->memory; + + + dump_fontinfo( &fi ); + + if ( fi.KernPairs ) + FT_FREE( fi.KernPairs ); + if ( fi.TrackKerns ) + FT_FREE( fi.TrackKerns ); + } + else + printf( "parse error\n" ); + + FT_Stream_Close( &stream ); + + Exit: + FT_Done_FreeType( library ); + + return error; + } diff --git a/external/freetype/src/tools/test_bbox.c b/external/freetype/src/tools/test_bbox.c new file mode 100644 index 000000000..d9fd93299 --- /dev/null +++ b/external/freetype/src/tools/test_bbox.c @@ -0,0 +1,187 @@ +#include <freetype/freetype.h> +#include <freetype/ftbbox.h> + + +#include <time.h> /* for clock() */ + +/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */ +/* to get the HZ macro which is the equivalent. */ +#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4) +#include <sys/param.h> +#define CLOCKS_PER_SEC HZ +#endif + + static long + get_time( void ) + { + return clock() * 10000L / CLOCKS_PER_SEC; + } + + + + + /* test bbox computations */ + +#define XSCALE 65536 +#define XX(x) ((FT_Pos)(x*XSCALE)) +#define XVEC(x,y) { XX(x), XX(y) } +#define XVAL(x) ((x)/(1.0*XSCALE)) + + /* dummy outline #1 */ + static FT_Vector dummy_vec_1[4] = + { +#if 1 + XVEC( 408.9111, 535.3164 ), + XVEC( 455.8887, 634.396 ), + XVEC( -37.8765, 786.2207 ), + XVEC( 164.6074, 535.3164 ) +#else + { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL }, /* 408.9111, 535.3164 */ + { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L }, /* 455.8887, 634.3960 */ + { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL }, /* -37.8765, 786.2207 */ + { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL } /* 164.6074, 535.3164 */ +#endif + }; + + static char dummy_tag_1[4] = + { + FT_CURVE_TAG_ON, + FT_CURVE_TAG_CUBIC, + FT_CURVE_TAG_CUBIC, + FT_CURVE_TAG_ON + }; + + static short dummy_contour_1[1] = + { + 3 + }; + + static FT_Outline dummy_outline_1 = + { + 1, + 4, + dummy_vec_1, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + /* dummy outline #2 */ + static FT_Vector dummy_vec_2[4] = + { + XVEC( 100.0, 100.0 ), + XVEC( 100.0, 200.0 ), + XVEC( 200.0, 200.0 ), + XVEC( 200.0, 133.0 ) + }; + + static FT_Outline dummy_outline_2 = + { + 1, + 4, + dummy_vec_2, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + /* dummy outline #3 with bbox of [0 100 128 128] precisely */ + static FT_Vector dummy_vec_3[4] = + { + XVEC( 100.0, 127.0 ), + XVEC( 200.0, 127.0 ), + XVEC( 0.0, 136.0 ), + XVEC( 0.0, 100.0 ) + }; + + static FT_Outline dummy_outline_3 = + { + 1, + 4, + dummy_vec_3, + dummy_tag_1, + dummy_contour_1, + 0 + }; + + + static void + dump_outline( FT_Outline* outline ) + { + FT_BBox bbox; + + /* compute and display cbox */ + FT_Outline_Get_CBox( outline, &bbox ); + printf( "cbox = [%.2f %.2f %.2f %.2f]\n", + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + + /* compute and display bbox */ + FT_Outline_Get_BBox( outline, &bbox ); + printf( "bbox = [%.2f %.2f %.2f %.2f]\n", + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + } + + + + static void + profile_outline( FT_Outline* outline, + long repeat ) + { + FT_BBox bbox; + long count; + long time0; + + time0 = get_time(); + for ( count = repeat; count > 0; count-- ) + FT_Outline_Get_CBox( outline, &bbox ); + + time0 = get_time() - time0; + printf( "time = %6.3f cbox = [%8.4f %8.4f %8.4f %8.4f]\n", + ((double)time0/10000.0), + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + printf( "cbox_hex = [%08X %08X %08X %08X]\n", + bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax ); + + + time0 = get_time(); + for ( count = repeat; count > 0; count-- ) + FT_Outline_Get_BBox( outline, &bbox ); + + time0 = get_time() - time0; + printf( "time = %6.3f bbox = [%8.4f %8.4f %8.4f %8.4f]\n", + ((double)time0/10000.0), + XVAL( bbox.xMin ), + XVAL( bbox.yMin ), + XVAL( bbox.xMax ), + XVAL( bbox.yMax ) ); + printf( "bbox_hex = [%08X %08X %08X %08X]\n", + bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax ); + } + +#define REPEAT 1000000L + + int main( int argc, char** argv ) + { + printf( "outline #1\n" ); + profile_outline( &dummy_outline_1, REPEAT ); + + printf( "outline #2\n" ); + profile_outline( &dummy_outline_2, REPEAT ); + + printf( "outline #3\n" ); + profile_outline( &dummy_outline_3, REPEAT ); + + return 0; + } + diff --git a/external/freetype/src/tools/test_trig.c b/external/freetype/src/tools/test_trig.c new file mode 100644 index 000000000..4f3410ab3 --- /dev/null +++ b/external/freetype/src/tools/test_trig.c @@ -0,0 +1,257 @@ +#include <freetype/freetype.h> +#include <freetype/fttrigon.h> + +#include <math.h> +#include <stdio.h> + +#define PI 3.14159265358979323846 +#define SPI (PI/FT_ANGLE_PI) + +/* the precision in 16.16 fixed-point checks. Expect between 2 and 5 */ +/* noise LSB bits during operations, due to rounding errors.. */ +#define THRESHOLD 64 + + static error = 0; + + static void + test_cos( void ) + { + int i; + + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) + { + FT_Fixed f1, f2; + double d2; + + + f1 = FT_Cos(i); + d2 = cos( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Cos[%3d] = %.7f cos[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_sin( void ) + { + int i; + + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) + { + FT_Fixed f1, f2; + double d2; + + + f1 = FT_Sin(i); + d2 = sin( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Sin[%3d] = %.7f sin[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_tan( void ) + { + int i; + + + for ( i = 0; i < FT_ANGLE_PI2 - 0x2000000L; i += 0x10000L ) + { + FT_Fixed f1, f2; + double d2; + + + f1 = FT_Tan(i); + d2 = tan( i*SPI ); + f2 = (FT_Fixed)(d2*65536.0); + + if ( abs( f2-f1 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Tan[%3d] = %.7f tan[%3d] = %.7f\n", + (i >> 16), f1/65536.0, (i >> 16), d2 ); + } + } + } + + + static void + test_atan2( void ) + { + int i; + + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) + { + FT_Fixed c2, s2; + double l, a, c1, s1; + int j; + + + l = 5.0; + a = i*SPI; + + c1 = l * cos(a); + s1 = l * sin(a); + + c2 = (FT_Fixed)(c1*65536.0); + s2 = (FT_Fixed)(s1*65536.0); + + j = FT_Atan2( c2, s2 ); + if ( j < 0 ) + j += FT_ANGLE_2PI; + + if ( abs( i - j ) > 1 ) + { + printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n", + c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 ); + } + } + } + + + static void + test_unit( void ) + { + int i; + + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) + { + FT_Vector v; + double a, c1, s1; + FT_Fixed c2, s2; + + + FT_Vector_Unit( &v, i ); + a = ( i*SPI ); + c1 = cos(a); + s1 = sin(a); + c2 = (FT_Fixed)(c1*65536.0); + s2 = (FT_Fixed)(s1*65536.0); + + if ( abs( v.x-c2 ) > THRESHOLD || + abs( v.y-s2 ) > THRESHOLD ) + { + error = 1; + printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f ) vec = ( %.7f, %.7f )\n", + (i >> 16), + v.x/65536.0, v.y/65536.0, + c1, s1 ); + } + } + } + + + static void + test_length( void ) + { + int i; + + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) + { + FT_Vector v; + FT_Fixed l, l2; + + + l = (FT_Fixed)(500.0*65536.0); + v.x = (FT_Fixed)( l * cos( i*SPI ) ); + v.y = (FT_Fixed)( l * sin( i*SPI ) ); + l2 = FT_Vector_Length( &v ); + + if ( abs( l2-l ) > THRESHOLD ) + { + error = 1; + printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n", + v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 ); + } + } + } + + + static void + test_rotate( void ) + { + int rotate; + + + for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000L ) + { + double ra, cra, sra; + int i; + + + ra = rotate*SPI; + cra = cos( ra ); + sra = sin( ra ); + + for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000L ) + { + FT_Fixed c2, s2, c4, s4; + FT_Vector v; + double l, a, c1, s1, c3, s3; + + + l = 500.0; + a = i*SPI; + + c1 = l * cos(a); + s1 = l * sin(a); + + v.x = c2 = (FT_Fixed)(c1*65536.0); + v.y = s2 = (FT_Fixed)(s1*65536.0); + + FT_Vector_Rotate( &v, rotate ); + + c3 = c1 * cra - s1 * sra; + s3 = c1 * sra + s1 * cra; + + c4 = (FT_Fixed)(c3*65536.0); + s4 = (FT_Fixed)(s3*65536.0); + + if ( abs( c4 - v.x ) > THRESHOLD || + abs( s4 - v.y ) > THRESHOLD ) + { + error = 1; + printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n", + c1, s1, ra, + c2/65536.0, s2/65536.0, + c4/65536.0, s4/65536.0 ); + } + } + } + } + + + int main( void ) + { + test_cos(); + test_sin(); + test_tan(); + test_atan2(); + test_unit(); + test_length(); + test_rotate(); + + if (!error) + printf( "trigonometry test ok !\n" ); + + return !error; + } diff --git a/external/freetype/src/tools/update-copyright b/external/freetype/src/tools/update-copyright new file mode 100644 index 000000000..674823ceb --- /dev/null +++ b/external/freetype/src/tools/update-copyright @@ -0,0 +1,14 @@ +#!/bin/sh + +# Run the `update-copyright-year' script on all files in the git repository, +# taking care of exceptions stored in file `no-copyright'. + +topdir=`git rev-parse --show-toplevel` +toolsdir=`dirname $0` + +git ls-files --full-name $topdir \ +| sed "s|^|$topdir/|" \ +| grep -vFf $toolsdir/no-copyright \ +| xargs $toolsdir/update-copyright-year + +# EOF diff --git a/external/freetype/src/tools/update-copyright-year b/external/freetype/src/tools/update-copyright-year new file mode 100644 index 000000000..b0b60fb88 --- /dev/null +++ b/external/freetype/src/tools/update-copyright-year @@ -0,0 +1,157 @@ +eval '(exit $?0)' && eval 'exec perl -wS -i "$0" ${1+"$@"}' + & eval 'exec perl -wS -i "$0" $argv:q' + if 0; + +# Copyright (C) 2015-2023 by +# Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# [Note: This script is expected to be called by the shell, which in turn +# calls perl automatically. The nifty start-up code above is based on +# gnulib's `update-copyright' script; it is a more portable replacement for +# the shebang, using the first `perl' program in the shell's path instead.] + +# Usage: +# +# update-copyright-year file1 [file2 ...] + + +# This script handles copyright entries like +# +# Copyright 2000 by +# foobar +# +# or +# +# /* Copyright (c) 2000, 2001, 2004-2007 by */ +# /* foobar */ +# +# and replaces them uniformly with +# +# Copyright (C) 2000-2021 +# foobar +# +# and +# +# /* Copyright (C) 2000-2021 by */ +# /* foobar */ +# +# (assuming that the current year is 2021). As can be seen, the line length +# is retained if there is non-whitespace after the word `by' on the same +# line. + +use strict; + + +my (undef, undef, undef, + undef, undef, $year, + undef, undef, undef) = localtime(time); +$year += 1900; + +my $replaced = 0; + + +# Loop over all input files; option `-i' (issued at the very beginning of +# this script) makes perl edit them in-place. +while (<>) +{ + # Only handle the first copyright notice in a file. + if (!$replaced) + { + # First try: Search multiple copyright years. + s { + (?<begin>.*) + Copyright + (?<space1>(\ + + | \ +\(C\)\ +)) + (?<first>[12][0-9][0-9][0-9]) + (?<middle>.+) + (?<last>[12][0-9][0-9][0-9]) + (?<space2>\ +) + by + (?<space3>\ *) + (?<end>.*) + } + { + # Fill line to the same length (if appropriate); we skip the middle + # part but insert `(C)', three spaces, and `-'. + my $space = length($+{space1}) + + length($+{middle}) + + length($+{space2}) + + length($+{space3}) + - (length("(C)") + 3 + 1); + + print "$+{begin}"; + print "Copyright\ (C)\ $+{first}-$year\ by"; + print ' ' x $space if length($+{end}); + print "$+{end}\n"; + $replaced = 1; + }ex + || + # Second try: Search a single copyright year. + s { + (?<begin>.*) + Copyright + (?<space1>(\ + + | \ +\(C\)\ +)) + (?<first>[12][0-9][0-9][0-9]) + (?<space2>\ +) + by + (?<space3>\ *) + (?<end>.*) + } + { + if ($+{first} < $year) + { + # Fill line to the same length (if appropriate); we insert three + # spaces, the string `(C)', a `-', and the current year. + my $space = length($+{space1}) + + length($+{space2}) + + length($+{space3}) + - (length($year) + length("(C)") + 3 + 1); + + print "$+{begin}"; + print "Copyright\ (C)\ $+{first}-$year\ by"; + # If $space is negative this inserts nothing. + print ' ' x $space if length($+{end}); + print "$+{end}\n"; + $replaced = 1; + } + else + { + # Fill line to the same length (if appropriate); we insert three + # spaces and the string `(C)'. + my $space = length($+{space1}) + + length($+{space2}) + + length($+{space3}) + - (length("(C)") + 3); + + print "$+{begin}"; + print "Copyright\ (C)\ $+{first}\ by"; + # If $space is negative this inserts nothing. + print ' ' x $space if length($+{end}); + print "$+{end}\n"; + $replaced = 1; + } + }ex + || + # Otherwise print line unaltered. + print; + } + else + { + print; + } +} +continue +{ + # Reset $replaced before processing the next file. + $replaced = 0 if eof; +} + +# EOF diff --git a/external/freetype/src/tools/vms_shorten_symbol.c b/external/freetype/src/tools/vms_shorten_symbol.c new file mode 100644 index 000000000..81f2a7187 --- /dev/null +++ b/external/freetype/src/tools/vms_shorten_symbol.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2010, 2017 Craig A. Berry + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* vms_shorten_symbol + * + * This program provides shortening of long symbols (> 31 characters) using the + * same mechanism as the OpenVMS C compiler. The basic procedure is to compute + * an AUTODIN II checksum of the entire symbol, encode the checksum in base32, + * and glue together a shortened symbol from the first 23 characters of the + * original symbol plus the encoded checksum appended. The output format is + * the same used in the name mangler database, stored by default in + * [.CXX_REPOSITORY]CXX$DEMANGLER_DB. + * + * To obtain the same result as CC/NAMES=SHORTENED, run like so: + * + * $ mcr []vms_shorten_symbol "Please_forgive_this_absurdly_long_symbol_name" + * PLEASE_FORGIVE_THIS_ABS1ARO4QU$Please_forgive_this_absurdly_long_symbol_name + * + * To obtain the same result as CC/NAMES=(SHORTENED,AS_IS), pass a non-zero + * value as the second argument, like so: + * + * $ mcr []vms_shorten_symbol "Please_forgive_this_absurdly_long_symbol_name" 1 + * Please_forgive_this_abs3rv8rnn$Please_forgive_this_absurdly_long_symbol_name + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef __VMS +#define UINT32 unsigned int +#else +#include <inttypes.h> +#define UINT32 uint32_t +#endif + +extern UINT32 crc32(const char *input_string); +extern int u32_to_base32(UINT32 input, char *output); +extern int vms_shorten_symbol(const char *symbol, char *shortened, char as_is_flag); + +/* + * This routine implements the AUTODIN II polynomial. + */ + +UINT32 +crc32(const char *input_string) +{ + +/* + * CRC code and data based partly on FreeBSD implementation, which + * notes: + * + * The crc32 functions and data was originally written by Spencer + * Garrett <srg@quick.com> and was cleaned from the PostgreSQL source + * tree via the files contrib/ltree/crc32.[ch]. No license was + * included, therefore it is assumed that this code is public + * domain. Attribution still noted. + * + * (I think they mean "gleaned" not "cleaned".) + */ + + static const UINT32 autodin_ii_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, + }; + + UINT32 crc = ~0U; + char *c; + for (c = (char *)input_string; *c; ++c) + crc = (crc >> 8) ^ autodin_ii_table[(crc ^ *c) & 0xff]; + return ~crc; +} + +/* + * This is the RFC2938 variant of base32, not RFC3548, Crockford's, or + * other newer variant. It produces an 8-byte encoded character string + * (plus trailing null) from a 32-bit integer input. + */ + +int +u32_to_base32(UINT32 input, char *output) +{ + static const char base32hex_table[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v' + }; + int i; + + /* + * Grab lowest 5 bits and look up conversion in table. Lather, rinse, + * repeat for a total of 7, 5-bit chunks to accommodate 32 bits of input. + */ + for (i = 0; i < 7; i++) { + output[6 - i] = base32hex_table[input & 0x1f]; + input >>= 5; /* position to look at next 5 */ + } + output[7] = '$'; /* It's DEC, so use '$' not '=' to pad. */ + output[8] = '\0'; + return 0; +} + +/* + * Take an input symbol name of arbitrary length and produce a symbol shortened + * to 31 characters. The shortened symbol consists of the first 23 characters + * of the original symbol plus the 8 characters of the encoded checksum. The + * third argument is a boolean indicating whether to emulate the compiler's + * /NAMES=AS_IS option. When false (the compiler's default), the shortened + * symbol will be upper cased. When the original symbol is 31 characters or + * fewer in length, no checksum will be appended and the original symbol is + * returned verbatim (though upper cased if the as_is_flag is false). + */ + +int +vms_shorten_symbol(const char *input_symbol, char *shortened, char as_is_flag) +{ + char b32str[9]; + UINT32 crc; + char *c, *symbol; + int symlen; + + symlen = strlen(input_symbol); + symbol = (char *)malloc(symlen + 1); + if (symbol == NULL) + return -1; + + strncpy(symbol, input_symbol, symlen); + symbol[symlen] = '\0'; + + if (!as_is_flag) { + for (c = symbol; *c; c++) + *c = toupper(*c); + } + + if (symlen <= 31) { + strncpy(shortened, symbol, symlen); + shortened[symlen] = '\0'; + free(symbol); + return 0; + } + + /* + * Compute the checksum on the whole symbol. + */ + + crc = crc32(symbol); + + /* The compiler does not use the inverted checksum, so we invert it + * back before encoding in base32. + */ + + if (u32_to_base32(~crc, (char *)&b32str) == -1) { + free(symbol); + return -1; + } + + if (!as_is_flag) { + for (c = (char *)&b32str; *c; c++) + *c = toupper(*c); + } + + sprintf(shortened, "%.23s%.8s", symbol, b32str); + shortened[31] = '\0'; + free(symbol); + return 0; +} + +#ifdef TEST_MAIN +int +main(int argc, char **argv) +{ + char short_symbol[32]; + char as_is_flag = 0; + + if (argc < 2) { + fprintf(stderr, "Usage: %s <symbol name> [<AS_IS flag>]\n", argv[0]); + exit(EXIT_FAILURE); + } + if (argc > 2) + as_is_flag = 1; + + if (vms_shorten_symbol(argv[1], (char *)&short_symbol, as_is_flag) == -1) { + fprintf(stderr, "Symbol shortening failed\n"); + exit(EXIT_FAILURE); + } + + printf("%s%s\n", (char *)&short_symbol, argv[1]); +} +#endif diff --git a/external/freetype/src/truetype/module.mk b/external/freetype/src/truetype/module.mk new file mode 100644 index 000000000..5d44ac1f4 --- /dev/null +++ b/external/freetype/src/truetype/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 TrueType module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TRUETYPE_DRIVER + +define TRUETYPE_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/truetype/rules.mk b/external/freetype/src/truetype/rules.mk new file mode 100644 index 000000000..dde26de1c --- /dev/null +++ b/external/freetype/src/truetype/rules.mk @@ -0,0 +1,75 @@ +# +# FreeType 2 TrueType driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# TrueType driver directory +# +TT_DIR := $(SRC_DIR)/truetype + + +# compilation flags for the driver +# +TT_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(TT_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# TrueType driver sources (i.e., C files) +# +TT_DRV_SRC := $(TT_DIR)/ttdriver.c \ + $(TT_DIR)/ttgload.c \ + $(TT_DIR)/ttgxvar.c \ + $(TT_DIR)/ttinterp.c \ + $(TT_DIR)/ttobjs.c \ + $(TT_DIR)/ttpload.c + +# TrueType driver headers +# +TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \ + $(TT_DIR)/tterrors.h + + +# TrueType driver object(s) +# +# TT_DRV_OBJ_M is used during `multi' builds +# TT_DRV_OBJ_S is used during `single' builds +# +TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O) +TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O + +# TrueType driver source file for single build +# +TT_DRV_SRC_S := $(TT_DIR)/truetype.c + + +# TrueType driver - single object +# +$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S)) + + +# driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(TT_DRV_OBJ_S) +DRV_OBJS_M += $(TT_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/truetype/truetype.c b/external/freetype/src/truetype/truetype.c new file mode 100644 index 000000000..fcc0ea334 --- /dev/null +++ b/external/freetype/src/truetype/truetype.c @@ -0,0 +1,29 @@ +/**************************************************************************** + * + * truetype.c + * + * FreeType TrueType driver component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "ttdriver.c" /* driver interface */ +#include "ttgload.c" /* glyph loader */ +#include "ttgxvar.c" /* gx distortable font */ +#include "ttinterp.c" +#include "ttobjs.c" /* object manager */ +#include "ttpload.c" /* tables loader */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttdriver.c b/external/freetype/src/truetype/ttdriver.c new file mode 100644 index 000000000..d1496fec7 --- /dev/null +++ b/external/freetype/src/truetype/ttdriver.c @@ -0,0 +1,691 @@ +/**************************************************************************** + * + * ttdriver.c + * + * TrueType font driver implementation (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/sfnt.h> +#include <freetype/internal/services/svfntfmt.h> + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include <freetype/ftmm.h> +#include <freetype/internal/services/svmm.h> +#include <freetype/internal/services/svmetric.h> +#endif + +#include <freetype/internal/services/svtteng.h> +#include <freetype/internal/services/svttglyf.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/ftdriver.h> + +#include "ttdriver.h" +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttdriver + + + /* + * PROPERTY SERVICE + * + */ + FT_CALLBACK_DEF( FT_Error ) + tt_property_set( FT_Module module, /* TT_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + TT_Driver driver = (TT_Driver)module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "interpreter-version" ) ) + { + FT_UInt interpreter_version; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 ); + } + else +#endif + { + FT_UInt* iv = (FT_UInt*)value; + + + interpreter_version = *iv; + } + + switch ( interpreter_version ) + { + case TT_INTERPRETER_VERSION_35: + driver->interpreter_version = TT_INTERPRETER_VERSION_35; + break; + + case TT_INTERPRETER_VERSION_38: + case TT_INTERPRETER_VERSION_40: +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + driver->interpreter_version = TT_INTERPRETER_VERSION_40; + break; +#endif + + default: + error = FT_ERR( Unimplemented_Feature ); + } + + return error; + } + + FT_TRACE2(( "tt_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_property_get( FT_Module module, /* TT_Driver */ + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + TT_Driver driver = (TT_Driver)module; + + FT_UInt interpreter_version = driver->interpreter_version; + + + if ( !ft_strcmp( property_name, "interpreter-version" ) ) + { + FT_UInt* val = (FT_UInt*)value; + + + *val = interpreter_version; + + return error; + } + + FT_TRACE2(( "tt_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + tt_service_properties, + + tt_property_set, /* FT_Properties_SetFunc set_property */ + tt_property_get /* FT_Properties_GetFunc get_property */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @Function: + * tt_get_kerning + * + * @Description: + * A driver method used to return the kerning vector between two + * glyphs of the same face. + * + * @Input: + * face :: + * A handle to the source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * @Output: + * kerning :: + * The kerning vector. This is in font units for + * scalable formats, and in pixels for fixed-sizes + * formats. + * + * @Return: + * FreeType error code. 0 means success. + * + * @Note: + * Only horizontal layouts (left-to-right & right-to-left) are + * supported by this function. Other layouts, or more sophisticated + * kernings, are out of scope of this method (the basic driver + * interface is meant to be simple). + * + * They can be implemented by format-specific interfaces. + */ + FT_CALLBACK_DEF( FT_Error ) + tt_get_kerning( FT_Face face, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face ttface = (TT_Face)face; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( ttface, left_glyph, right_glyph ); + + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_get_advances( FT_Face face, /* TT_Face */ + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *advances ) + { + FT_UInt nn; + TT_Face ttface = (TT_Face)face; + + + /* XXX: TODO: check for sbits */ + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without VVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + for ( nn = 0; nn < count; nn++ ) + { + FT_Short tsb; + FT_UShort ah; + + + /* since we don't need `tsb', we use zero for `yMax' parameter */ + TT_Get_VMetrics( ttface, start + nn, 0, &tsb, &ah ); + advances[nn] = ah; + } + } + else + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without HVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + for ( nn = 0; nn < count; nn++ ) + { + FT_Short lsb; + FT_UShort aw; + + + TT_Get_HMetrics( ttface, start + nn, &lsb, &aw ); + advances[nn] = aw; + } + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S I Z E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_CALLBACK_DEF( FT_Error ) + tt_size_select( FT_Size size, + FT_ULong strike_index ) + { + TT_Face ttface = (TT_Face)size->face; + TT_Size ttsize = (TT_Size)size; + FT_Error error = FT_Err_Ok; + + + ttsize->strike_index = strike_index; + + if ( FT_IS_SCALABLE( size->face ) ) + { + /* use the scaled metrics, even when tt_size_reset fails */ + FT_Select_Metrics( size->face, strike_index ); + + tt_size_reset( ttsize ); /* ignore return value */ + } + else + { + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + FT_Size_Metrics* size_metrics = &size->metrics; + + + error = sfnt->load_strike_metrics( ttface, + strike_index, + size_metrics ); + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + FT_CALLBACK_DEF( FT_Error ) + tt_size_request( FT_Size size, + FT_Size_Request req ) + { + TT_Size ttsize = (TT_Size)size; + FT_Error error = FT_Err_Ok; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + TT_Face ttface = (TT_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + FT_ULong strike_index; + + + error = sfnt->set_sbit_strike( ttface, req, &strike_index ); + + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + else + return tt_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + { + FT_Error err = FT_Request_Metrics( size->face, req ); + + + if ( err ) + { + error = err; + goto Exit; + } + } + + if ( FT_IS_SCALABLE( size->face ) ) + { + error = tt_size_reset( ttsize ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* for the `MPS' bytecode instruction we need the point size */ + if ( !error ) + { + FT_UInt resolution = + ttsize->metrics->x_ppem > ttsize->metrics->y_ppem + ? req->horiResolution + : req->vertResolution; + + + /* if we don't have a resolution value, assume 72dpi */ + if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES || + !resolution ) + resolution = 72; + + ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem, + 64 * 72, + resolution ); + } +#endif + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_glyph_load + * + * @Description: + * A driver method used to load a glyph within a given glyph slot. + * + * @Input: + * slot :: + * A handle to the target slot object where the glyph + * will be loaded. + * + * size :: + * A handle to the source face size at which the glyph + * must be scaled, loaded, etc. + * + * glyph_index :: + * The index of the glyph in the font file. + * + * load_flags :: + * A flag indicating what to load for this glyph. The + * FT_LOAD_XXX constants can be used to control the + * glyph loading process (e.g., whether the outline + * should be scaled, whether to load bitmaps or not, + * whether to hint the outline, etc). + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_CALLBACK_DEF( FT_Error ) + tt_glyph_load( FT_GlyphSlot slot, /* TT_GlyphSlot */ + FT_Size size, /* TT_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_GlyphSlot ttslot = (TT_GlyphSlot)slot; + TT_Size ttsize = (TT_Size)size; + FT_Face face = ttslot->face; + FT_Error error; + + + if ( !slot ) + return FT_THROW( Invalid_Slot_Handle ); + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_index >= (FT_UInt)face->num_glyphs && + !face->internal->incremental_interface ) +#else + if ( glyph_index >= (FT_UInt)face->num_glyphs ) +#endif + return FT_THROW( Invalid_Argument ); + + if ( load_flags & FT_LOAD_NO_HINTING ) + { + /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ + /* are necessary to disable hinting for tricky fonts */ + + if ( FT_IS_TRICKY( face ) ) + load_flags &= ~FT_LOAD_NO_HINTING; + + if ( load_flags & FT_LOAD_NO_AUTOHINT ) + load_flags |= FT_LOAD_NO_HINTING; + } + + if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) + { + load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; + + if ( !FT_IS_TRICKY( face ) ) + load_flags |= FT_LOAD_NO_HINTING; + } + + /* use hinted metrics only if we load a glyph with hinting */ + ttsize->metrics = ( load_flags & FT_LOAD_NO_HINTING ) + ? &size->metrics + : &ttsize->hinted_metrics; + + /* now fill in the glyph slot with outline/bitmap/layered */ + error = TT_Load_Glyph( ttsize, ttslot, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + FT_DEFINE_SERVICE_MULTIMASTERSREC( + tt_service_gx_multi_masters, + + NULL, /* FT_Get_MM_Func get_mm */ + NULL, /* FT_Set_MM_Design_Func set_mm_design */ + TT_Set_MM_Blend, /* FT_Set_MM_Blend_Func set_mm_blend */ + TT_Get_MM_Blend, /* FT_Get_MM_Blend_Func get_mm_blend */ + TT_Get_MM_Var, /* FT_Get_MM_Var_Func get_mm_var */ + TT_Set_Var_Design, /* FT_Set_Var_Design_Func set_var_design */ + TT_Get_Var_Design, /* FT_Get_Var_Design_Func get_var_design */ + TT_Set_Named_Instance, /* FT_Set_Named_Instance_Func set_named_instance */ + TT_Get_Default_Named_Instance, + /* FT_Get_Default_Named_Instance_Func get_default_named_instance */ + NULL, /* FT_Set_MM_WeightVector_Func set_mm_weightvector */ + NULL, /* FT_Get_MM_WeightVector_Func get_mm_weightvector */ + + tt_construct_ps_name, /* FT_Construct_PS_Name_Func construct_ps_name */ + tt_var_load_delta_set_index_mapping, + /* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */ + tt_var_load_item_variation_store, + /* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */ + tt_var_get_item_delta, /* FT_Var_Get_Item_Delta_Func get_item_delta */ + tt_var_done_item_variation_store, + /* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */ + tt_var_done_delta_set_index_map, + /* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */ + tt_get_var_blend, /* FT_Get_Var_Blend_Func get_var_blend */ + tt_done_blend /* FT_Done_Blend_Func done_blend */ + ) + + FT_DEFINE_SERVICE_METRICSVARIATIONSREC( + tt_service_metrics_variations, + + tt_hadvance_adjust, /* FT_HAdvance_Adjust_Func hadvance_adjust */ + NULL, /* FT_LSB_Adjust_Func lsb_adjust */ + NULL, /* FT_RSB_Adjust_Func rsb_adjust */ + + tt_vadvance_adjust, /* FT_VAdvance_Adjust_Func vadvance_adjust */ + NULL, /* FT_TSB_Adjust_Func tsb_adjust */ + NULL, /* FT_BSB_Adjust_Func bsb_adjust */ + NULL, /* FT_VOrg_Adjust_Func vorg_adjust */ + + tt_apply_mvar, /* FT_Metrics_Adjust_Func metrics_adjust */ + tt_size_reset_height /* FT_Size_Reset_Func size_reset */ + ) + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_TRUETYPE_ENGINE_TYPE_PATENTED + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_TRUETYPE_ENGINE_TYPE_NONE + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + }; + + + FT_DEFINE_SERVICE_TTGLYFREC( + tt_service_truetype_glyf, + + (TT_Glyf_GetLocationFunc)tt_face_get_location /* get_location */ + ) + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC6( + tt_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, + FT_SERVICE_ID_MULTI_MASTERS, &tt_service_gx_multi_masters, + FT_SERVICE_ID_METRICS_VARIATIONS, &tt_service_metrics_variations, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &tt_service_truetype_glyf, + FT_SERVICE_ID_PROPERTIES, &tt_service_properties ) +#else + FT_DEFINE_SERVICEDESCREC4( + tt_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &tt_service_truetype_glyf, + FT_SERVICE_ID_PROPERTIES, &tt_service_properties ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + tt_get_interface( FT_Module driver, /* TT_Driver */ + const char* tt_interface ) + { + FT_Library library; + FT_Module_Interface result; + FT_Module sfntd; + SFNT_Service sfnt; + + + result = ft_service_list_lookup( tt_services, tt_interface ); + if ( result ) + return result; + + if ( !driver ) + return NULL; + library = driver->library; + if ( !library ) + return NULL; + + /* only return the default interface from the SFNT module */ + sfntd = FT_Get_Module( library, "sfnt" ); + if ( sfntd ) + { + sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); + if ( sfnt ) + return sfnt->get_interface( driver, tt_interface ); + } + + return 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER +#else +#define TT_HINTER_FLAG 0 +#endif + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define TT_SIZE_SELECT tt_size_select +#else +#define TT_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER( + tt_driver_class, + + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + TT_HINTER_FLAG, + + sizeof ( TT_DriverRec ), + + "truetype", /* driver name */ + 0x10000L, /* driver version == 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ + + NULL, /* module-specific interface */ + + tt_driver_init, /* FT_Module_Constructor module_init */ + tt_driver_done, /* FT_Module_Destructor module_done */ + tt_get_interface, /* FT_Module_Requester get_interface */ + + sizeof ( TT_FaceRec ), + sizeof ( TT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + tt_face_init, /* FT_Face_InitFunc init_face */ + tt_face_done, /* FT_Face_DoneFunc done_face */ + tt_size_init, /* FT_Size_InitFunc init_size */ + tt_size_done, /* FT_Size_DoneFunc done_size */ + tt_slot_init, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ + + tt_glyph_load, /* FT_Slot_LoadFunc load_glyph */ + + tt_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + tt_get_advances, /* FT_Face_GetAdvancesFunc get_advances */ + + tt_size_request, /* FT_Size_RequestFunc request_size */ + TT_SIZE_SELECT /* FT_Size_SelectFunc select_size */ + ) + + +/* END */ diff --git a/external/freetype/src/truetype/ttdriver.h b/external/freetype/src/truetype/ttdriver.h new file mode 100644 index 000000000..757a66f42 --- /dev/null +++ b/external/freetype/src/truetype/ttdriver.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * ttdriver.h + * + * High-level TrueType driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTDRIVER_H_ +#define TTDRIVER_H_ + + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_DECLARE_DRIVER( tt_driver_class ) + +FT_END_HEADER + +#endif /* TTDRIVER_H_ */ + + +/* END */ diff --git a/external/freetype/src/truetype/tterrors.h b/external/freetype/src/truetype/tterrors.h new file mode 100644 index 000000000..008ee9985 --- /dev/null +++ b/external/freetype/src/truetype/tterrors.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * tterrors.h + * + * TrueType error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the TrueType error enumeration + * constants. + * + */ + +#ifndef TTERRORS_H_ +#define TTERRORS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX TT_Err_ +#define FT_ERR_BASE FT_Mod_Err_TrueType + +#include <freetype/fterrors.h> + +#endif /* TTERRORS_H_ */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttgload.c b/external/freetype/src/truetype/ttgload.c new file mode 100644 index 000000000..dc427e8a1 --- /dev/null +++ b/external/freetype/src/truetype/ttgload.c @@ -0,0 +1,2743 @@ +/**************************************************************************** + * + * ttgload.c + * + * TrueType Glyph Loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <ft2build.h> +#include <freetype/internal/ftdebug.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/sfnt.h> +#include <freetype/tttags.h> +#include <freetype/ftoutln.h> +#include <freetype/ftdriver.h> +#include <freetype/ftlist.h> + +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttgload + + + /************************************************************************** + * + * Simple glyph flags. + */ +#define ON_CURVE_POINT 0x01 /* same value as FT_CURVE_TAG_ON */ +#define X_SHORT_VECTOR 0x02 +#define Y_SHORT_VECTOR 0x04 +#define REPEAT_FLAG 0x08 +#define X_POSITIVE 0x10 /* two meanings depending on X_SHORT_VECTOR */ +#define SAME_X 0x10 +#define Y_POSITIVE 0x20 /* two meanings depending on Y_SHORT_VECTOR */ +#define SAME_Y 0x20 +#define OVERLAP_SIMPLE 0x40 /* retained as FT_OUTLINE_OVERLAP */ + + + /************************************************************************** + * + * Composite glyph flags. + */ +#define ARGS_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define ROUND_XY_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +/* reserved 0x0010 */ +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_XY_SCALE 0x0040 +#define WE_HAVE_A_2X2 0x0080 +#define WE_HAVE_INSTR 0x0100 +#define USE_MY_METRICS 0x0200 +#define OVERLAP_COMPOUND 0x0400 /* retained as FT_OUTLINE_OVERLAP */ +#define SCALED_COMPONENT_OFFSET 0x0800 +#define UNSCALED_COMPONENT_OFFSET 0x1000 + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#define IS_DEFAULT_INSTANCE( _face ) \ + ( !( FT_IS_NAMED_INSTANCE( _face ) || \ + FT_IS_VARIATION( _face ) ) ) +#else +#define IS_DEFAULT_INSTANCE( _face ) 1 +#endif + + + /************************************************************************** + * + * Return the horizontal metrics in font units for a given glyph. + */ + FT_LOCAL_DEF( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Short* lsb, + FT_UShort* aw ) + { + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); + + FT_TRACE5(( " advance width (font units): %d\n", *aw )); + FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); + } + + + /************************************************************************** + * + * Return the vertical metrics in font units for a given glyph. + * See function `tt_loader_set_pp' below for explanations. + */ + FT_LOCAL_DEF( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Pos yMax, + FT_Short* tsb, + FT_UShort* ah ) + { + if ( face->vertical_info ) + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); + + else if ( face->os2.version != 0xFFFFU ) + { + *tsb = (FT_Short)( face->os2.sTypoAscender - yMax ); + *ah = (FT_UShort)FT_ABS( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + } + + else + { + *tsb = (FT_Short)( face->horizontal.Ascender - yMax ); + *ah = (FT_UShort)FT_ABS( face->horizontal.Ascender - + face->horizontal.Descender ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !face->vertical_info ) + FT_TRACE5(( " [vertical metrics missing, computing values]\n" )); +#endif + + FT_TRACE5(( " advance height (font units): %d\n", *ah )); + FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); + } + + + static FT_Error + tt_get_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; + + FT_Error error; + FT_Stream stream = loader->stream; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + /* we must preserve the stream position */ + /* (which gets altered by the metrics functions) */ + FT_ULong pos = FT_STREAM_POS(); + + + TT_Get_HMetrics( face, glyph_index, + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + loader->bbox.yMax, + &top_bearing, + &advance_height ); + + if ( FT_STREAM_SEEK( pos ) ) + return error; + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* With the incremental interface, these values are set by */ + /* a call to `tt_get_metrics_incremental'. */ + if ( face->root.internal->incremental_interface == NULL ) +#endif + { + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + return FT_Err_Ok; + } + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + static void + tt_get_metrics_incremental( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + /* If this is an incrementally loaded font check whether there are */ + /* overriding metrics for this glyph. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec incr_metrics; + FT_Error error; + + + incr_metrics.bearing_x = loader->left_bearing; + incr_metrics.bearing_y = 0; + incr_metrics.advance = loader->advance; + incr_metrics.advance_v = 0; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &incr_metrics ); + if ( error ) + goto Exit; + + left_bearing = (FT_Short)incr_metrics.bearing_x; + advance_width = (FT_UShort)incr_metrics.advance; + +#if 0 + + /* GWW: Do I do the same for vertical metrics? */ + incr_metrics.bearing_x = 0; + incr_metrics.bearing_y = loader->top_bearing; + incr_metrics.advance = loader->vadvance; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &incr_metrics ); + if ( error ) + goto Exit; + + top_bearing = (FT_Short)incr_metrics.bearing_y; + advance_height = (FT_UShort)incr_metrics.advance; + +#endif /* 0 */ + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + Exit: + return; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + + /************************************************************************** + * + * The following functions are used by default with TrueType fonts. + * However, they can be replaced by alternatives if we need to support + * TrueType-compressed formats (like MicroType) in the future. + * + */ + + FT_CALLBACK_DEF( FT_Error ) + TT_Access_Glyph_Frame( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ) + { + FT_Error error; + FT_Stream stream = loader->stream; + + FT_UNUSED( glyph_index ); + + + /* the following line sets the `error' variable through macros! */ + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) + return error; + + loader->cursor = stream->cursor; + loader->limit = stream->limit; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + TT_Forget_Glyph_Frame( TT_Loader loader ) + { + FT_Stream stream = loader->stream; + + + FT_FRAME_EXIT(); + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Glyph_Header( TT_Loader loader ) + { + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + + + if ( p + 10 > limit ) + return FT_THROW( Invalid_Outline ); + + loader->n_contours = FT_NEXT_SHORT( p ); + + loader->bbox.xMin = FT_NEXT_SHORT( p ); + loader->bbox.yMin = FT_NEXT_SHORT( p ); + loader->bbox.xMax = FT_NEXT_SHORT( p ); + loader->bbox.yMax = FT_NEXT_SHORT( p ); + + FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); + FT_TRACE5(( " xMin: %4ld xMax: %4ld\n", loader->bbox.xMin, + loader->bbox.xMax )); + FT_TRACE5(( " yMin: %4ld yMax: %4ld\n", loader->bbox.yMin, + loader->bbox.yMax )); + loader->cursor = p; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Simple_Glyph( TT_Loader load ) + { + FT_Error error; + FT_Byte* p = load->cursor; + FT_Byte* limit = load->limit; + FT_GlyphLoader gloader = load->gloader; + FT_Outline* outline = &gloader->current.outline; + FT_Int n_contours = load->n_contours; + FT_Int n_points; + FT_UShort n_ins; + + FT_Byte *flag, *flag_limit; + FT_Byte c, count; + FT_Vector *vec, *vec_limit; + FT_Pos x, y; + FT_Short *cont, *cont_limit, last; + + + /* check that we can add the contours to the glyph */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); + if ( error ) + goto Fail; + + /* check space for contours array + instructions count */ + if ( n_contours >= 0xFFF || p + 2 * n_contours + 2 > limit ) + goto Invalid_Outline; + + /* reading the contours' endpoints & number of points */ + cont = outline->contours; + cont_limit = cont + n_contours; + + last = -1; + for ( ; cont < cont_limit; cont++ ) + { + *cont = FT_NEXT_SHORT( p ); + + if ( *cont <= last ) + goto Invalid_Outline; + + last = *cont; + } + + n_points = last + 1; + + FT_TRACE5(( " # of points: %d\n", n_points )); + + /* note that we will add four phantom points later */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); + if ( error ) + goto Fail; + + /* space checked above */ + n_ins = FT_NEXT_USHORT( p ); + + FT_TRACE5(( " Instructions size: %u\n", n_ins )); + + /* check instructions size */ + if ( p + n_ins > limit ) + { + FT_TRACE1(( "TT_Load_Simple_Glyph: excessive instruction count\n" )); + error = FT_THROW( Too_Many_Hints ); + goto Fail; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load->load_flags ) ) + { + TT_ExecContext exec = load->exec; + FT_Memory memory = exec->memory; + + + if ( exec->glyphSize ) + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + /* we don't trust `maxSizeOfInstructions' in the `maxp' table */ + /* and thus allocate the bytecode array size by ourselves */ + if ( n_ins ) + { + if ( FT_QNEW_ARRAY( exec->glyphIns, n_ins ) ) + return error; + + FT_MEM_COPY( exec->glyphIns, p, (FT_Long)n_ins ); + + exec->glyphSize = n_ins; + } + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + p += n_ins; + + /* reading the point tags */ + flag = (FT_Byte*)outline->tags; + flag_limit = flag + n_points; + + FT_ASSERT( flag ); + + while ( flag < flag_limit ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + *flag++ = c = FT_NEXT_BYTE( p ); + if ( c & REPEAT_FLAG ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + count = FT_NEXT_BYTE( p ); + if ( flag + (FT_Int)count > flag_limit ) + goto Invalid_Outline; + + for ( ; count > 0; count-- ) + *flag++ = c; + } + } + + /* retain the overlap flag */ + if ( n_points && outline->tags[0] & OVERLAP_SIMPLE ) + gloader->base.outline.flags |= FT_OUTLINE_OVERLAP; + + /* reading the X coordinates */ + + vec = outline->points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos delta = 0; + FT_Byte f = *flag; + + + if ( f & X_SHORT_VECTOR ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + delta = (FT_Pos)FT_NEXT_BYTE( p ); + if ( !( f & X_POSITIVE ) ) + delta = -delta; + } + else if ( !( f & SAME_X ) ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + delta = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += delta; + vec->x = x; + } + + /* reading the Y coordinates */ + + vec = outline->points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + y = 0; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos delta = 0; + FT_Byte f = *flag; + + + if ( f & Y_SHORT_VECTOR ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + delta = (FT_Pos)FT_NEXT_BYTE( p ); + if ( !( f & Y_POSITIVE ) ) + delta = -delta; + } + else if ( !( f & SAME_Y ) ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + delta = (FT_Pos)FT_NEXT_SHORT( p ); + } + + y += delta; + vec->y = y; + + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & ON_CURVE_POINT ); + } + + outline->n_points = (FT_Short)n_points; + outline->n_contours = (FT_Short)n_contours; + + load->cursor = p; + + Fail: + return error; + + Invalid_Outline: + error = FT_THROW( Invalid_Outline ); + goto Fail; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Composite_Glyph( TT_Loader loader ) + { + FT_Error error; + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + FT_GlyphLoader gloader = loader->gloader; + FT_Long num_glyphs = loader->face->root.num_glyphs; + FT_SubGlyph subglyph; + FT_UInt num_subglyphs; + + + num_subglyphs = 0; + + do + { + FT_Fixed xx, xy, yy, yx; + FT_UInt count; + + + /* check that we can load a new subglyph */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); + if ( error ) + goto Fail; + + /* check space */ + if ( p + 4 > limit ) + goto Invalid_Composite; + + subglyph = gloader->current.subglyphs + num_subglyphs; + + subglyph->arg1 = subglyph->arg2 = 0; + + subglyph->flags = FT_NEXT_USHORT( p ); + subglyph->index = FT_NEXT_USHORT( p ); + + /* we reject composites that have components */ + /* with invalid glyph indices */ + if ( subglyph->index >= num_glyphs ) + goto Invalid_Composite; + + /* check space */ + count = 2; + if ( subglyph->flags & ARGS_ARE_WORDS ) + count += 2; + if ( subglyph->flags & WE_HAVE_A_SCALE ) + count += 2; + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + count += 4; + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + count += 8; + + if ( p + count > limit ) + goto Invalid_Composite; + + /* read arguments */ + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = FT_NEXT_SHORT( p ); + subglyph->arg2 = FT_NEXT_SHORT( p ); + } + else + { + subglyph->arg1 = FT_NEXT_CHAR( p ); + subglyph->arg2 = FT_NEXT_CHAR( p ); + } + } + else + { + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = (FT_Int)FT_NEXT_USHORT( p ); + subglyph->arg2 = (FT_Int)FT_NEXT_USHORT( p ); + } + else + { + subglyph->arg1 = (FT_Int)FT_NEXT_BYTE( p ); + subglyph->arg2 = (FT_Int)FT_NEXT_BYTE( p ); + } + } + + /* read transform */ + xx = yy = 0x10000L; + xy = yx = 0; + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yy = xx; + } + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + } + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + xy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + } + + subglyph->transform.xx = xx; + subglyph->transform.xy = xy; + subglyph->transform.yx = yx; + subglyph->transform.yy = yy; + + num_subglyphs++; + + } while ( subglyph->flags & MORE_COMPONENTS ); + + gloader->current.num_subglyphs = num_subglyphs; + FT_TRACE5(( " %d component%s\n", + num_subglyphs, + num_subglyphs > 1 ? "s" : "" )); + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + subglyph = gloader->current.subglyphs; + + for ( i = 0; i < num_subglyphs; i++ ) + { + if ( num_subglyphs > 1 ) + FT_TRACE7(( " subglyph %d:\n", i )); + + FT_TRACE7(( " glyph index: %d\n", subglyph->index )); + + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + FT_TRACE7(( " offset: x=%d, y=%d\n", + subglyph->arg1, + subglyph->arg2 )); + else + FT_TRACE7(( " matching points: base=%d, component=%d\n", + subglyph->arg1, + subglyph->arg2 )); + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + FT_TRACE7(( " scaling: %f\n", + (double)subglyph->transform.xx / 65536 )); + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + FT_TRACE7(( " scaling: x=%f, y=%f\n", + (double)subglyph->transform.xx / 65536, + (double)subglyph->transform.yy / 65536 )); + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + FT_TRACE7(( " scaling: xx=%f, yx=%f\n", + (double)subglyph->transform.xx / 65536, + (double)subglyph->transform.yx / 65536 )); + FT_TRACE7(( " xy=%f, yy=%f\n", + (double)subglyph->transform.xy / 65536, + (double)subglyph->transform.yy / 65536 )); + } + + subglyph++; + } + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + + + /* we must undo the FT_FRAME_ENTER in order to point */ + /* to the composite instructions, if we find some. */ + /* We will process them later. */ + /* */ + loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + + p - limit ); + } + +#endif + + loader->cursor = p; + + Fail: + return error; + + Invalid_Composite: + error = FT_THROW( Invalid_Composite ); + goto Fail; + } + + + FT_LOCAL_DEF( void ) + TT_Init_Glyph_Loading( TT_Face face ) + { + face->access_glyph_frame = TT_Access_Glyph_Frame; + face->read_glyph_header = TT_Load_Glyph_Header; + face->read_simple_glyph = TT_Load_Simple_Glyph; + face->read_composite_glyph = TT_Load_Composite_Glyph; + face->forget_glyph_frame = TT_Forget_Glyph_Frame; + } + + + static void + tt_prepare_zone( TT_GlyphZone zone, + FT_GlyphLoad load, + FT_UInt start_point, + FT_UInt start_contour ) + { + zone->n_points = (FT_UShort)load->outline.n_points + 4 - + (FT_UShort)start_point; + zone->n_contours = load->outline.n_contours - + (FT_Short)start_contour; + zone->org = load->extra_points + start_point; + zone->cur = load->outline.points + start_point; + zone->orus = load->extra_points2 + start_point; + zone->tags = (FT_Byte*)load->outline.tags + start_point; + zone->contours = (FT_UShort*)load->outline.contours + start_contour; + zone->first_point = (FT_UShort)start_point; + } + + + /************************************************************************** + * + * @Function: + * TT_Hint_Glyph + * + * @Description: + * Hint the glyph using the zone prepared by the caller. Note that + * the zone is supposed to include four phantom points. + */ + static FT_Error + TT_Hint_Glyph( TT_Loader loader, + FT_Bool is_composite ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + TT_Face face = loader->face; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); +#endif + + TT_GlyphZone zone = &loader->zone; + +#ifdef TT_USE_BYTECODE_INTERPRETER + TT_ExecContext exec = loader->exec; + FT_Long n_ins = exec->glyphSize; +#else + FT_UNUSED( is_composite ); +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* save original point positions in `org' array */ + if ( n_ins > 0 ) + FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); + + /* Reset graphics state. */ + exec->GS = loader->size->GS; + + /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ + /* completely refer to the (already) hinted subglyphs. */ + if ( is_composite ) + { + exec->metrics.x_scale = 1 << 16; + exec->metrics.y_scale = 1 << 16; + + FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); + } + else + { + exec->metrics.x_scale = loader->size->metrics->x_scale; + exec->metrics.y_scale = loader->size->metrics->y_scale; + } +#endif + + /* round phantom points */ + zone->cur[zone->n_points - 4].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 4].x ); + zone->cur[zone->n_points - 3].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); + zone->cur[zone->n_points - 2].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 2].y ); + zone->cur[zone->n_points - 1].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( n_ins > 0 ) + { + FT_Error error; + + + TT_Set_CodeRange( exec, tt_coderange_glyph, exec->glyphIns, n_ins ); + + exec->is_composite = is_composite; + exec->pts = *zone; + + error = TT_Run_Context( exec ); + if ( error && exec->pedantic_hinting ) + return error; + + /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ + loader->gloader->current.outline.tags[0] |= + ( exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; + } + +#endif + + /* Save possibly modified glyph phantom points unless in v40 backward */ + /* compatibility mode, where no movement on the x axis means no reason */ + /* to change bearings or advance widths. */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + exec->backward_compatibility ) + return FT_Err_Ok; +#endif + + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * TT_Process_Simple_Glyph + * + * @Description: + * Once a simple glyph has been loaded, it needs to be processed. + * Usually, this means scaling and hinting through bytecode + * interpretation. + */ + static FT_Error + TT_Process_Simple_Glyph( TT_Loader loader ) + { + FT_Error error = FT_Err_Ok; + FT_GlyphLoader gloader = loader->gloader; + FT_Outline* outline = &gloader->current.outline; + FT_Int n_points = outline->n_points; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Memory memory = loader->face->root.memory; + FT_Vector* unrounded = NULL; +#endif + + + /* set phantom points */ + outline->points[n_points ] = loader->pp1; + outline->points[n_points + 1] = loader->pp2; + outline->points[n_points + 2] = loader->pp3; + outline->points[n_points + 3] = loader->pp4; + + n_points += 4; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) + { + if ( FT_QNEW_ARRAY( unrounded, n_points ) ) + goto Exit; + + /* Deltas apply to the unscaled data. */ + error = TT_Vary_Apply_Glyph_Deltas( loader, + outline, + unrounded ); + if ( error ) + goto Exit; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( IS_HINTED( loader->load_flags ) ) + { + tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); + + FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, + loader->zone.n_points ); + } + + { + FT_Vector* vec = outline->points; + FT_Vector* limit = outline->points + n_points; + + FT_Fixed x_scale = 0; /* pacify compiler */ + FT_Fixed y_scale = 0; + + FT_Bool do_scale = FALSE; + + + { + /* scale the glyph */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = loader->size->metrics->x_scale; + y_scale = loader->size->metrics->y_scale; + + do_scale = TRUE; + } + } + + if ( do_scale ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) + { + FT_Vector* u = unrounded; + + + for ( ; vec < limit; vec++, u++ ) + { + vec->x = ADD_LONG( FT_MulFix( u->x, x_scale ), 32 ) >> 6; + vec->y = ADD_LONG( FT_MulFix( u->y, y_scale ), 32 ) >> 6; + } + } + else +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + { + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + } + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* if we have a HVAR table, `pp1' and/or `pp2' */ + /* are already adjusted but unscaled */ + if ( ( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) && + IS_HINTED( loader->load_flags ) ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + /* pp1.y and pp2.y are always zero */ + } + else +#endif + { + loader->pp1 = outline->points[n_points - 4]; + loader->pp2 = outline->points[n_points - 3]; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* if we have a VVAR table, `pp3' and/or `pp4' */ + /* are already adjusted but unscaled */ + if ( ( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) && + IS_HINTED( loader->load_flags ) ) + { + loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + else +#endif + { + loader->pp3 = outline->points[n_points - 2]; + loader->pp4 = outline->points[n_points - 1]; + } + } + + if ( IS_HINTED( loader->load_flags ) ) + error = TT_Hint_Glyph( loader, 0 ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + Exit: + FT_FREE( unrounded ); +#endif + + return error; + } + + + /************************************************************************** + * + * @Function: + * TT_Process_Composite_Component + * + * @Description: + * Once a composite component has been loaded, it needs to be + * processed. Usually, this means transforming and translating. + */ + static FT_Error + TT_Process_Composite_Component( TT_Loader loader, + FT_SubGlyph subglyph, + FT_UInt start_point, + FT_UInt num_base_points ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Outline current; + FT_Bool have_scale; + FT_Pos x, y; + + + current.points = gloader->base.outline.points + + num_base_points; + current.n_points = gloader->base.outline.n_points - + (short)num_base_points; + + have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ); + + /* perform the transform required for this subglyph */ + if ( have_scale ) + FT_Outline_Transform( &current, &subglyph->transform ); + + /* get offset */ + if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) + { + FT_UInt num_points = (FT_UInt)gloader->base.outline.n_points; + FT_UInt k = (FT_UInt)subglyph->arg1; + FT_UInt l = (FT_UInt)subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + /* match l-th point of the newly loaded component to the k-th point */ + /* of the previously loaded components. */ + + /* change to the point numbers used by our outline */ + k += start_point; + l += num_base_points; + if ( k >= num_base_points || + l >= num_points ) + return FT_THROW( Invalid_Composite ); + + p1 = gloader->base.outline.points + k; + p2 = gloader->base.outline.points + l; + + x = SUB_LONG( p1->x, p2->x ); + y = SUB_LONG( p1->y, p2->y ); + } + else + { + x = subglyph->arg1; + y = subglyph->arg2; + + if ( !x && !y ) + return FT_Err_Ok; + + /* Use a default value dependent on */ + /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old */ + /* TT fonts which don't set the xxx_COMPONENT_OFFSET bit. */ + + if ( have_scale && +#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) +#else + ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) +#endif + { + +#if 0 + + /******************************************************************** + * + * This algorithm is what Apple documents. But it doesn't work. + */ + int a = subglyph->transform.xx > 0 ? subglyph->transform.xx + : -subglyph->transform.xx; + int b = subglyph->transform.yx > 0 ? subglyph->transform.yx + : -subglyph->transform.yx; + int c = subglyph->transform.xy > 0 ? subglyph->transform.xy + : -subglyph->transform.xy; + int d = subglyph->transform.yy > 0 ? subglyph->transform.yy + : -subglyph->transform.yy; + int m = a > b ? a : b; + int n = c > d ? c : d; + + + if ( a - b <= 33 && a - b >= -33 ) + m *= 2; + if ( c - d <= 33 && c - d >= -33 ) + n *= 2; + x = FT_MulFix( x, m ); + y = FT_MulFix( y, n ); + +#else /* 1 */ + + /******************************************************************** + * + * This algorithm is a guess and works much better than the above. + */ + FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx, + subglyph->transform.xy ); + FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy, + subglyph->transform.yx ); + + + x = FT_MulFix( x, mac_xscale ); + y = FT_MulFix( y, mac_yscale ); + +#endif /* 1 */ + + } + + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + FT_Fixed x_scale = loader->size->metrics->x_scale; + FT_Fixed y_scale = loader->size->metrics->y_scale; + + + x = FT_MulFix( x, x_scale ); + y = FT_MulFix( y, y_scale ); + + if ( subglyph->flags & ROUND_XY_TO_GRID ) + { + TT_Face face = loader->face; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); + + + if ( IS_HINTED( loader->load_flags ) ) + { + /* + * We round the horizontal offset only if there is hinting along + * the x axis; this corresponds to integer advance width values. + * + * Theoretically, a glyph's bytecode can toggle ClearType's + * `backward compatibility' mode, which would allow modification + * of the advance width. In reality, however, applications + * neither allow nor expect modified advance widths if subpixel + * rendering is active. + * + */ + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 ) + x = FT_PIX_ROUND( x ); + + y = FT_PIX_ROUND( y ); + } + } + } + } + + if ( x || y ) + FT_Outline_Translate( &current, x, y ); + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * TT_Process_Composite_Glyph + * + * @Description: + * This is slightly different from TT_Process_Simple_Glyph, in that + * its sole purpose is to hint the glyph. Thus this function is + * only available when bytecode interpreter is enabled. + */ + static FT_Error + TT_Process_Composite_Glyph( TT_Loader loader, + FT_UInt start_point, + FT_UInt start_contour ) + { + FT_Error error; + FT_Outline* outline = &loader->gloader->base.outline; + FT_Stream stream = loader->stream; + FT_UShort n_ins; + FT_UInt i; + + + /* make room for phantom points */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, + outline->n_points + 4, + 0 ); + if ( error ) + return error; + + outline->points[outline->n_points ] = loader->pp1; + outline->points[outline->n_points + 1] = loader->pp2; + outline->points[outline->n_points + 2] = loader->pp3; + outline->points[outline->n_points + 3] = loader->pp4; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + TT_ExecContext exec = loader->exec; + FT_Memory memory = exec->memory; + + + if ( exec->glyphSize ) + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + /* TT_Load_Composite_Glyph only gives us the offset of instructions */ + /* so we read them here */ + if ( FT_STREAM_SEEK( loader->ins_pos ) || + FT_READ_USHORT( n_ins ) ) + return error; + + FT_TRACE5(( " Instructions size = %hu\n", n_ins )); + + if ( !n_ins ) + return FT_Err_Ok; + + /* don't trust `maxSizeOfInstructions'; */ + /* only do a rough safety check */ + if ( n_ins > loader->byte_len ) + { + FT_TRACE1(( "TT_Process_Composite_Glyph:" + " too many instructions (%hu) for glyph with length %u\n", + n_ins, loader->byte_len )); + return FT_THROW( Too_Many_Hints ); + } + + if ( FT_QNEW_ARRAY( exec->glyphIns, n_ins ) || + FT_STREAM_READ( exec->glyphIns, n_ins ) ) + return error; + + exec->glyphSize = n_ins; + } + +#endif + + tt_prepare_zone( &loader->zone, &loader->gloader->base, + start_point, start_contour ); + + /* Some points are likely touched during execution of */ + /* instructions on components. So let's untouch them. */ + for ( i = 0; i < loader->zone.n_points - 4U; i++ ) + loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; + + return TT_Hint_Glyph( loader, 1 ); + } + + + /* + * Calculate the phantom points + * + * Defining the right side bearing (rsb) as + * + * rsb = aw - (lsb + xmax - xmin) + * + * (with `aw' the advance width, `lsb' the left side bearing, and `xmin' + * and `xmax' the glyph's minimum and maximum x value), the OpenType + * specification defines the initial position of horizontal phantom points + * as + * + * pp1 = (round(xmin - lsb), 0) , + * pp2 = (round(pp1 + aw), 0) . + * + * Note that the rounding to the grid (in the device space) is not + * documented currently in the specification. + * + * However, the specification lacks the precise definition of vertical + * phantom points. Greg Hitchcock provided the following explanation. + * + * - a `vmtx' table is present + * + * For any glyph, the minimum and maximum y values (`ymin' and `ymax') + * are given in the `glyf' table, the top side bearing (tsb) and advance + * height (ah) are given in the `vmtx' table. The bottom side bearing + * (bsb) is then calculated as + * + * bsb = ah - (tsb + ymax - ymin) , + * + * and the initial position of vertical phantom points is + * + * pp3 = (x, round(ymax + tsb)) , + * pp4 = (x, round(pp3 - ah)) . + * + * See below for value `x'. + * + * - no `vmtx' table in the font + * + * If there is an `OS/2' table, we set + * + * DefaultAscender = sTypoAscender , + * DefaultDescender = sTypoDescender , + * + * otherwise we use data from the `hhea' table: + * + * DefaultAscender = Ascender , + * DefaultDescender = Descender . + * + * With these two variables we can now set + * + * ah = DefaultAscender - sDefaultDescender , + * tsb = DefaultAscender - yMax , + * + * and proceed as if a `vmtx' table was present. + * + * Usually we have + * + * x = aw / 2 , (1) + * + * but there is one compatibility case where it can be set to + * + * x = -DefaultDescender - + * ((DefaultAscender - DefaultDescender - aw) / 2) . (2) + * + * and another one with + * + * x = 0 . (3) + * + * In Windows, the history of those values is quite complicated, + * depending on the hinting engine (that is, the graphics framework). + * + * framework from to formula + * ---------------------------------------------------------- + * GDI Windows 98 current (1) + * (Windows 2000 for NT) + * GDI+ Windows XP Windows 7 (2) + * GDI+ Windows 8 current (3) + * DWrite Windows 7 current (3) + * + * For simplicity, FreeType uses (1) for grayscale subpixel hinting and + * (3) for everything else. + * + */ + static void + tt_loader_set_pp( TT_Loader loader ) + { + loader->pp1.x = loader->bbox.xMin - loader->left_bearing; + loader->pp1.y = 0; + loader->pp2.x = loader->pp1.x + loader->advance; + loader->pp2.y = 0; + + loader->pp3.x = 0; + loader->pp3.y = loader->bbox.yMax + loader->top_bearing; + loader->pp4.x = 0; + loader->pp4.y = loader->pp3.y - loader->vadvance; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + { + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); + + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + loader->exec && + loader->exec->subpixel_hinting_lean && + loader->exec->grayscale_cleartype ) + { + loader->pp3.x = loader->advance / 2; + loader->pp4.x = loader->advance / 2; + } + } +#endif + } + + + /* a utility function to retrieve i-th node from given FT_List */ + static FT_ListNode + ft_list_get_node_at( FT_List list, + FT_UInt idx ) + { + FT_ListNode cur; + + + if ( !list ) + return NULL; + + for ( cur = list->head; cur; cur = cur->next ) + { + if ( !idx ) + return cur; + + idx--; + } + + return NULL; + } + + + /************************************************************************** + * + * @Function: + * load_truetype_glyph + * + * @Description: + * Loads a given truetype glyph. Handles composites and uses a + * TT_Loader object. + */ + static FT_Error + load_truetype_glyph( TT_Loader loader, + FT_UInt glyph_index, + FT_UInt recurse_count, + FT_Bool header_only ) + { + FT_Error error = FT_Err_Ok; + FT_Fixed x_scale, y_scale; + FT_ULong offset; + TT_Face face = loader->face; + FT_GlyphLoader gloader = loader->gloader; + + FT_Bool opened_frame = 0; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_StreamRec inc_stream; + FT_Data glyph_data; + FT_Bool glyph_data_loaded = 0; +#endif + + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( recurse_count ) + FT_TRACE5(( " nesting level: %d\n", recurse_count )); +#endif + + /* some fonts have an incorrect value of `maxComponentDepth' */ + if ( recurse_count > face->max_profile.maxComponentDepth ) + { + FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n", + recurse_count )); + face->max_profile.maxComponentDepth = (FT_UShort)recurse_count; + } + +#ifndef FT_CONFIG_OPTION_INCREMENTAL + /* check glyph index */ + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = FT_THROW( Invalid_Glyph_Index ); + goto Exit; + } +#endif + + loader->glyph_index = glyph_index; + + if ( loader->load_flags & FT_LOAD_NO_SCALE ) + { + x_scale = 0x10000L; + y_scale = 0x10000L; + } + else + { + x_scale = loader->size->metrics->x_scale; + y_scale = loader->size->metrics->y_scale; + } + + /* Set `offset' to the start of the glyph relative to the start of */ + /* the `glyf' table, and `byte_len' to the length of the glyph in */ + /* bytes. */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If we are loading glyph data via the incremental interface, set */ + /* the loader stream to a memory stream reading the data returned */ + /* by the interface. */ + if ( face->root.internal->incremental_interface ) + { + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &glyph_data ); + if ( error ) + goto Exit; + + glyph_data_loaded = 1; + offset = 0; + loader->byte_len = glyph_data.length; + + FT_ZERO( &inc_stream ); + FT_Stream_OpenMemory( &inc_stream, + glyph_data.pointer, + glyph_data.length ); + + loader->stream = &inc_stream; + } + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ULong len; + + + offset = tt_face_get_location( FT_FACE( face ), glyph_index, &len ); + + loader->byte_len = (FT_UInt)len; + } + + if ( loader->byte_len > 0 ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* for the incremental interface, `glyf_offset' is always zero */ + if ( !face->glyf_offset && + !face->root.internal->incremental_interface ) +#else + if ( !face->glyf_offset ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + error = face->access_glyph_frame( loader, glyph_index, + face->glyf_offset + offset, + loader->byte_len ); + if ( error ) + goto Exit; + + /* read glyph header first */ + error = face->read_glyph_header( loader ); + + face->forget_glyph_frame( loader ); + + if ( error ) + goto Exit; + } + + /* a space glyph */ + if ( loader->byte_len == 0 || loader->n_contours == 0 ) + { + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + } + + /* the metrics must be computed after loading the glyph header */ + /* since we need the glyph's `yMax' value in case the vertical */ + /* metrics must be emulated */ + error = tt_get_metrics( loader, glyph_index ); + if ( error ) + goto Exit; + + if ( header_only ) + goto Exit; + + if ( loader->byte_len == 0 || loader->n_contours == 0 ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incremental( loader, glyph_index ); +#endif + tt_loader_set_pp( loader ); + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) || + FT_IS_VARIATION( FT_FACE( face ) ) ) + { + /* a small outline structure with four elements for */ + /* communication with `TT_Vary_Apply_Glyph_Deltas' */ + FT_Vector points[4]; + FT_Outline outline; + + /* unrounded values */ + FT_Vector unrounded[4] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }; + + + points[0] = loader->pp1; + points[1] = loader->pp2; + points[2] = loader->pp3; + points[3] = loader->pp4; + + outline.n_points = 0; + outline.n_contours = 0; + outline.points = points; + outline.tags = NULL; + outline.contours = NULL; + + /* this must be done before scaling */ + error = TT_Vary_Apply_Glyph_Deltas( loader, + &outline, + unrounded ); + if ( error ) + goto Exit; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* scale phantom points, if necessary; */ + /* they get rounded in `TT_Hint_Glyph' */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + /* pp1.y and pp2.y are always zero */ + + loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + error = FT_Err_Ok; + goto Exit; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incremental( loader, glyph_index ); +#endif + tt_loader_set_pp( loader ); + + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* we now open a frame again, right after the glyph header */ + /* (which consists of 10 bytes) */ + error = face->access_glyph_frame( loader, glyph_index, + face->glyf_offset + offset + 10, + loader->byte_len - 10 ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* if it is a simple glyph, load it */ + + if ( loader->n_contours > 0 ) + { + error = face->read_simple_glyph( loader ); + if ( error ) + goto Exit; + + /* all data have been read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + + error = TT_Process_Simple_Glyph( loader ); + if ( error ) + goto Exit; + + FT_GlyphLoader_Add( gloader ); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* otherwise, load a composite! */ + else if ( loader->n_contours < 0 ) + { + FT_Memory memory = face->root.memory; + + FT_UInt start_point; + FT_UInt start_contour; + FT_ULong ins_pos; /* position of composite instructions, if any */ + + FT_ListNode node, node2; + + + /* normalize the `n_contours' value */ + loader->n_contours = -1; + + /* + * We store the glyph index directly in the `node->data' pointer, + * following the glib solution (cf. macro `GUINT_TO_POINTER') with a + * double cast to make this portable. Note, however, that this needs + * pointers with a width of at least 32 bits. + */ + + /* clear the nodes filled by sibling chains */ + node = ft_list_get_node_at( &loader->composites, recurse_count ); + for ( node2 = node; node2; node2 = node2->next ) + node2->data = (void*)-1; + + /* check whether we already have a composite glyph with this index */ + if ( FT_List_Find( &loader->composites, + FT_UINT_TO_POINTER( glyph_index ) ) ) + { + FT_TRACE1(( "TT_Load_Composite_Glyph:" + " infinite recursion detected\n" )); + error = FT_THROW( Invalid_Composite ); + goto Exit; + } + + else if ( node ) + node->data = FT_UINT_TO_POINTER( glyph_index ); + + else + { + if ( FT_QNEW( node ) ) + goto Exit; + node->data = FT_UINT_TO_POINTER( glyph_index ); + FT_List_Add( &loader->composites, node ); + } + + start_point = (FT_UInt)gloader->base.outline.n_points; + start_contour = (FT_UInt)gloader->base.outline.n_contours; + + /* for each subglyph, read composite header */ + error = face->read_composite_glyph( loader ); + if ( error ) + goto Exit; + + /* store the offset of instructions */ + ins_pos = loader->ins_pos; + + /* all data we need are read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) || + FT_IS_VARIATION( FT_FACE( face ) ) ) + { + short i, limit; + FT_SubGlyph subglyph; + + FT_Outline outline = { 0, 0, NULL, NULL, NULL, 0 }; + FT_Vector* unrounded = NULL; + + + limit = (short)gloader->current.num_subglyphs; + + /* construct an outline structure for */ + /* communication with `TT_Vary_Apply_Glyph_Deltas' */ + if ( FT_QNEW_ARRAY( outline.points, limit + 4 ) || + FT_QNEW_ARRAY( outline.tags, limit ) || + FT_QNEW_ARRAY( outline.contours, limit ) || + FT_QNEW_ARRAY( unrounded, limit + 4 ) ) + goto Exit1; + + outline.n_contours = outline.n_points = limit; + + subglyph = gloader->current.subglyphs; + + for ( i = 0; i < limit; i++, subglyph++ ) + { + /* applying deltas for anchor points doesn't make sense, */ + /* but we don't have to specially check this since */ + /* unused delta values are zero anyways */ + outline.points[i].x = subglyph->arg1; + outline.points[i].y = subglyph->arg2; + outline.tags[i] = ON_CURVE_POINT; + outline.contours[i] = i; + } + + outline.points[i++] = loader->pp1; + outline.points[i++] = loader->pp2; + outline.points[i++] = loader->pp3; + outline.points[i ] = loader->pp4; + + /* this call provides additional offsets */ + /* for each component's translation */ + if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas( loader, + &outline, + unrounded ) ) ) + goto Exit1; + + subglyph = gloader->current.subglyphs; + + for ( i = 0; i < limit; i++, subglyph++ ) + { + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + subglyph->arg1 = (FT_Int16)outline.points[i].x; + subglyph->arg2 = (FT_Int16)outline.points[i].y; + } + } + + Exit1: + FT_FREE( outline.points ); + FT_FREE( outline.tags ); + FT_FREE( outline.contours ); + FT_FREE( unrounded ); + + if ( error ) + goto Exit; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* scale phantom points, if necessary; */ + /* they get rounded in `TT_Hint_Glyph' */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + /* pp1.y and pp2.y are always zero */ + + loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ + /* `as is' in the glyph slot (the client application will be */ + /* responsible for interpreting these data)... */ + if ( loader->load_flags & FT_LOAD_NO_RECURSE ) + { + FT_GlyphLoader_Add( gloader ); + loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + goto Exit; + } + + /*********************************************************************/ + /*********************************************************************/ + /*********************************************************************/ + + { + FT_UInt n, num_base_points; + FT_SubGlyph subglyph = NULL; + + FT_UInt num_points = start_point; + FT_UInt num_subglyphs = gloader->current.num_subglyphs; + FT_UInt num_base_subgs = gloader->base.num_subglyphs; + + FT_Stream old_stream = loader->stream; + FT_UInt old_byte_len = loader->byte_len; + + + FT_GlyphLoader_Add( gloader ); + + /* read each subglyph independently */ + for ( n = 0; n < num_subglyphs; n++ ) + { + FT_Vector pp[4]; + + FT_Int linear_hadvance; + FT_Int linear_vadvance; + + + /* Each time we call `load_truetype_glyph' in this loop, the */ + /* value of `gloader.base.subglyphs' can change due to table */ + /* reallocations. We thus need to recompute the subglyph */ + /* pointer on each iteration. */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + pp[0] = loader->pp1; + pp[1] = loader->pp2; + pp[2] = loader->pp3; + pp[3] = loader->pp4; + + linear_hadvance = loader->linear; + linear_vadvance = loader->vadvance; + + num_base_points = (FT_UInt)gloader->base.outline.n_points; + + error = load_truetype_glyph( loader, + (FT_UInt)subglyph->index, + recurse_count + 1, + FALSE ); + if ( error ) + goto Exit; + + /* restore subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + /* restore phantom points if necessary */ + if ( !( subglyph->flags & USE_MY_METRICS ) ) + { + loader->pp1 = pp[0]; + loader->pp2 = pp[1]; + loader->pp3 = pp[2]; + loader->pp4 = pp[3]; + + loader->linear = linear_hadvance; + loader->vadvance = linear_vadvance; + } + + num_points = (FT_UInt)gloader->base.outline.n_points; + + if ( num_points == num_base_points ) + continue; + + /* gloader->base.outline consists of three parts: */ + /* */ + /* 0 ----> start_point ----> num_base_points ----> n_points */ + /* (1) (2) (3) */ + /* */ + /* (1) points that exist from the beginning */ + /* (2) component points that have been loaded so far */ + /* (3) points of the newly loaded component */ + error = TT_Process_Composite_Component( loader, + subglyph, + start_point, + num_base_points ); + if ( error ) + goto Exit; + } + + loader->stream = old_stream; + loader->byte_len = old_byte_len; + + /* process the glyph */ + loader->ins_pos = ins_pos; + if ( IS_HINTED( loader->load_flags ) && +#ifdef TT_USE_BYTECODE_INTERPRETER + subglyph && + subglyph->flags & WE_HAVE_INSTR && +#endif + num_points > start_point ) + { + error = TT_Process_Composite_Glyph( loader, + start_point, + start_contour ); + if ( error ) + goto Exit; + } + } + + /* retain the overlap flag */ + if ( gloader->base.num_subglyphs && + gloader->base.subglyphs[0].flags & OVERLAP_COMPOUND ) + gloader->base.outline.flags |= FT_OUTLINE_OVERLAP; + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + Exit: + + if ( opened_frame ) + face->forget_glyph_frame( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( glyph_data_loaded ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + +#endif + + return error; + } + + + static FT_Error + compute_glyph_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; + TT_Size size = loader->size; + TT_GlyphSlot glyph = loader->glyph; + FT_BBox bbox; + FT_Fixed y_scale; + + + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + y_scale = size->metrics->y_scale; + + if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) + FT_Outline_Get_CBox( &glyph->outline, &bbox ); + else + bbox = loader->bbox; + + /* get the device-independent horizontal advance; it is scaled later */ + /* by the base layer. */ + glyph->linearHoriAdvance = loader->linear; + + glyph->metrics.horiBearingX = bbox.xMin; + glyph->metrics.horiBearingY = bbox.yMax; + if ( loader->widthp ) + glyph->metrics.horiAdvance = loader->widthp[glyph_index] * 64; + else + glyph->metrics.horiAdvance = SUB_LONG( loader->pp2.x, loader->pp1.x ); + + /* set glyph dimensions */ + glyph->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin ); + glyph->metrics.height = SUB_LONG( bbox.yMax, bbox.yMin ); + + /* Now take care of vertical metrics. In the case where there is */ + /* no vertical information within the font (relatively common), */ + /* create some metrics manually */ + { + FT_Pos top; /* scaled vertical top side bearing */ + FT_Pos advance; /* scaled vertical advance height */ + + + /* Get the unscaled top bearing and advance height. */ + if ( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ) + { + top = (FT_Short)FT_DivFix( SUB_LONG( loader->pp3.y, bbox.yMax ), + y_scale ); + + if ( loader->pp3.y <= loader->pp4.y ) + advance = 0; + else + advance = (FT_UShort)FT_DivFix( SUB_LONG( loader->pp3.y, + loader->pp4.y ), + y_scale ); + } + else + { + FT_Pos height; + + + /* XXX Compute top side bearing and advance height in */ + /* Get_VMetrics instead of here. */ + + /* NOTE: The OS/2 values are the only `portable' ones, */ + /* which is why we use them, if there is an OS/2 */ + /* table in the font. Otherwise, we use the */ + /* values defined in the horizontal header. */ + + height = (FT_Short)FT_DivFix( SUB_LONG( bbox.yMax, + bbox.yMin ), + y_scale ); + if ( face->os2.version != 0xFFFFU ) + advance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + advance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + + top = ( advance - height ) / 2; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + FT_Incremental_InterfaceRec* incr; + FT_Incremental_MetricsRec incr_metrics; + FT_Error error; + + + incr = face->root.internal->incremental_interface; + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( incr && incr->funcs->get_glyph_metrics ) + { + incr_metrics.bearing_x = 0; + incr_metrics.bearing_y = top; + incr_metrics.advance = advance; + + error = incr->funcs->get_glyph_metrics( incr->object, + glyph_index, + TRUE, + &incr_metrics ); + if ( error ) + return error; + + top = incr_metrics.bearing_y; + advance = incr_metrics.advance; + } + } + + /* GWW: Do vertical metrics get loaded incrementally too? */ + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + glyph->linearVertAdvance = advance; + + /* scale the metrics */ + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + top = FT_MulFix( top, y_scale ); + advance = FT_MulFix( advance, y_scale ); + } + + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ + glyph->metrics.vertBearingX = SUB_LONG( glyph->metrics.horiBearingX, + glyph->metrics.horiAdvance / 2 ); + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + return FT_Err_Ok; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + load_sbit_image( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face = (TT_Face)glyph->face; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + FT_Stream stream = face->root.stream; + FT_Error error; + TT_SBit_MetricsRec sbit_metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_UInt)load_flags, + stream, + &glyph->bitmap, + &sbit_metrics ); + if ( !error ) + { + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = (FT_Pos)sbit_metrics.width * 64; + glyph->metrics.height = (FT_Pos)sbit_metrics.height * 64; + + glyph->metrics.horiBearingX = (FT_Pos)sbit_metrics.horiBearingX * 64; + glyph->metrics.horiBearingY = (FT_Pos)sbit_metrics.horiBearingY * 64; + glyph->metrics.horiAdvance = (FT_Pos)sbit_metrics.horiAdvance * 64; + + glyph->metrics.vertBearingX = (FT_Pos)sbit_metrics.vertBearingX * 64; + glyph->metrics.vertBearingY = (FT_Pos)sbit_metrics.vertBearingY * 64; + glyph->metrics.vertAdvance = (FT_Pos)sbit_metrics.vertAdvance * 64; + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->bitmap_left = sbit_metrics.vertBearingX; + glyph->bitmap_top = sbit_metrics.vertBearingY; + } + else + { + glyph->bitmap_left = sbit_metrics.horiBearingX; + glyph->bitmap_top = sbit_metrics.horiBearingY; + } + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_loader_init( TT_Loader loader, + TT_Size size, + TT_GlyphSlot glyph, + FT_Int32 load_flags, + FT_Bool glyf_table_only ) + { + TT_Face face = (TT_Face)glyph->face; + FT_Stream stream = face->root.stream; + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_Error error; + FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( glyph->face ); +#endif +#endif + + + FT_ZERO( loader ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* load execution context */ + if ( IS_HINTED( load_flags ) && !glyf_table_only ) + { + TT_ExecContext exec; + FT_Bool grayscale = TRUE; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + FT_Bool subpixel_hinting_lean; + FT_Bool grayscale_cleartype; +#endif + + FT_Bool reexecute = FALSE; + + + if ( size->bytecode_ready < 0 || size->cvt_ready < 0 ) + { + error = tt_size_ready_bytecode( size, pedantic ); + if ( error ) + return error; + } + else if ( size->bytecode_ready ) + return size->bytecode_ready; + else if ( size->cvt_ready ) + return size->cvt_ready; + + /* query new execution context */ + exec = size->context; + if ( !exec ) + return FT_THROW( Could_Not_Find_Context ); + + grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) + { + subpixel_hinting_lean = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + grayscale_cleartype = + FT_BOOL( subpixel_hinting_lean && + !( ( load_flags & + FT_LOAD_TARGET_LCD ) || + ( load_flags & + FT_LOAD_TARGET_LCD_V ) ) ); + exec->vertical_lcd_lean = + FT_BOOL( subpixel_hinting_lean && + ( load_flags & + FT_LOAD_TARGET_LCD_V ) ); + grayscale = FT_BOOL( grayscale && !subpixel_hinting_lean ); + } + else + { + subpixel_hinting_lean = FALSE; + grayscale_cleartype = FALSE; + exec->vertical_lcd_lean = FALSE; + } +#endif + + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) + { + /* a change from mono to subpixel rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( subpixel_hinting_lean != exec->subpixel_hinting_lean ) + { + FT_TRACE4(( "tt_loader_init: subpixel hinting change," + " re-executing `prep' table\n" )); + + exec->subpixel_hinting_lean = subpixel_hinting_lean; + reexecute = TRUE; + } + + /* a change from colored to grayscale subpixel rendering (and */ + /* vice versa) requires a re-execution of the CVT program */ + if ( grayscale_cleartype != exec->grayscale_cleartype ) + { + FT_TRACE4(( "tt_loader_init: grayscale subpixel hinting change," + " re-executing `prep' table\n" )); + + exec->grayscale_cleartype = grayscale_cleartype; + reexecute = TRUE; + } + } +#endif + + /* a change from mono to grayscale rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( grayscale != exec->grayscale ) + { + FT_TRACE4(( "tt_loader_init: grayscale hinting change," + " re-executing `prep' table\n" )); + + exec->grayscale = grayscale; + reexecute = TRUE; + } + } + + if ( reexecute ) + { + error = tt_size_run_prep( size, pedantic ); + if ( error ) + return error; + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + } + + /* check whether the cvt program has disabled hinting */ + if ( exec->GS.instruct_control & 1 ) + load_flags |= FT_LOAD_NO_HINTING; + + /* load default graphics state -- if needed */ + if ( exec->GS.instruct_control & 2 ) + exec->GS = tt_default_graphics_state; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* + * Toggle backward compatibility according to what font wants, except + * when + * + * 1) we have a `tricky' font that heavily relies on the interpreter to + * render glyphs correctly, for example DFKai-SB, or + * 2) FT_RENDER_MODE_MONO (i.e, monochome rendering) is requested. + * + * In those cases, backward compatibility needs to be turned off to get + * correct rendering. The rendering is then completely up to the + * font's programming. + * + */ + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + subpixel_hinting_lean && + !FT_IS_TRICKY( glyph->face ) ) + exec->backward_compatibility = !( exec->GS.instruct_control & 4 ); + else + exec->backward_compatibility = FALSE; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ + + exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); + loader->exec = exec; + loader->instructions = exec->glyphIns; + + /* Use the hdmx table if any unless FT_LOAD_COMPUTE_METRICS */ + /* is set or backward compatibility mode of the v38 or v40 */ + /* interpreters is active. See `ttinterp.h' for details on */ + /* backward compatibility mode. */ + if ( IS_HINTED( loader->load_flags ) && + !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) && +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + exec->backward_compatibility ) && +#endif + !face->postscript.isFixedPitch ) + { + loader->widthp = size->widthp; + } + else + loader->widthp = NULL; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + /* get face's glyph loader */ + if ( !glyf_table_only ) + { + FT_GlyphLoader gloader = glyph->internal->loader; + + + FT_GlyphLoader_Rewind( gloader ); + loader->gloader = gloader; + } + + loader->load_flags = (FT_ULong)load_flags; + + loader->face = face; + loader->size = size; + loader->glyph = (FT_GlyphSlot)glyph; + loader->stream = stream; + + loader->composites.head = NULL; + loader->composites.tail = NULL; + + return FT_Err_Ok; + } + + + static void + tt_loader_done( TT_Loader loader ) + { + FT_List_Finalize( &loader->composites, + NULL, + loader->face->root.memory, + NULL ); + } + + + /************************************************************************** + * + * @Function: + * TT_Load_Glyph + * + * @Description: + * A function used to load a single glyph within a given glyph slot, + * for a given size. + * + * @InOut: + * glyph :: + * A handle to a target slot object where the glyph + * will be loaded. + * + * @Input: + * size :: + * A handle to the source face size at which the glyph + * must be scaled/loaded. + * + * glyph_index :: + * The index of the glyph in the font file. + * + * load_flags :: + * A flag indicating what to load for this glyph. The + * FT_LOAD_XXX constants can be used to control the + * glyph loading process (e.g., whether the outline + * should be scaled, whether to load bitmaps or not, + * whether to hint the outline, etc). + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face = (TT_Face)glyph->face; + FT_Error error; + TT_LoaderRec loader; + + + FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap (if any) */ + if ( size->strike_index != 0xFFFFFFFFUL && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 && + IS_DEFAULT_INSTANCE( glyph->face ) ) + { + FT_Fixed x_scale = size->root.metrics.x_scale; + FT_Fixed y_scale = size->root.metrics.y_scale; + + + error = load_sbit_image( size, glyph, glyph_index, load_flags ); + if ( FT_ERR_EQ( error, Missing_Bitmap ) ) + { + /* the bitmap strike is incomplete and misses the requested glyph; */ + /* if we have a bitmap-only font, return an empty glyph */ + if ( !FT_IS_SCALABLE( glyph->face ) ) + { + FT_Short left_bearing = 0; + FT_Short top_bearing = 0; + + FT_UShort advance_width = 0; + FT_UShort advance_height = 0; + + + /* to return an empty glyph, however, we need metrics data */ + /* from the `hmtx' (or `vmtx') table; the assumption is that */ + /* empty glyphs are missing intentionally, representing */ + /* whitespace - not having at least horizontal metrics is */ + /* thus considered an error */ + if ( !face->horz_metrics_size ) + return error; + + /* we now construct an empty bitmap glyph */ + TT_Get_HMetrics( face, glyph_index, + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + 0, + &top_bearing, + &advance_height ); + + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = 0; + glyph->metrics.height = 0; + + glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale ); + glyph->metrics.horiBearingY = 0; + glyph->metrics.horiAdvance = FT_MulFix( advance_width, x_scale ); + + glyph->metrics.vertBearingX = 0; + glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale ); + glyph->metrics.vertAdvance = FT_MulFix( advance_height, y_scale ); + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO; + + glyph->bitmap_left = 0; + glyph->bitmap_top = 0; + + return FT_Err_Ok; + } + } + else if ( error ) + { + /* return error if font is not scalable */ + if ( !FT_IS_SCALABLE( glyph->face ) ) + return error; + } + else + { + if ( FT_IS_SCALABLE( glyph->face ) || + FT_HAS_SBIX( glyph->face ) ) + { + /* for the bbox we need the header only */ + (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); + (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); + tt_loader_done( &loader ); + glyph->linearHoriAdvance = loader.linear; + glyph->linearVertAdvance = loader.vadvance; + + /* Bitmaps from the 'sbix' table need special treatment: */ + /* if there is a glyph contour, the bitmap origin must be */ + /* shifted to be relative to the lower left corner of the */ + /* glyph bounding box, also taking the left-side bearing */ + /* (or top bearing) into account. */ + if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX && + loader.n_contours > 0 ) + { + FT_Int bitmap_left; + FT_Int bitmap_top; + + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* This is a guess, since Apple's CoreText engine doesn't */ + /* really do vertical typesetting. */ + bitmap_left = loader.bbox.xMin; + bitmap_top = loader.top_bearing; + } + else + { + bitmap_left = loader.left_bearing; + bitmap_top = loader.bbox.yMin; + } + + glyph->bitmap_left += FT_MulFix( bitmap_left, x_scale ) >> 6; + glyph->bitmap_top += FT_MulFix( bitmap_top, y_scale ) >> 6; + } + + /* sanity checks: if `xxxAdvance' in the sbit metric */ + /* structure isn't set, use `linearXXXAdvance' */ + if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) + glyph->metrics.horiAdvance = FT_MulFix( glyph->linearHoriAdvance, + x_scale ); + if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance ) + glyph->metrics.vertAdvance = FT_MulFix( glyph->linearVertAdvance, + y_scale ); + } + + return FT_Err_Ok; + } + } + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) + { + error = FT_THROW( Invalid_Size_Handle ); + goto Exit; + } + +#ifdef FT_CONFIG_OPTION_SVG + + /* check for OT-SVG */ + if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 && + ( load_flags & FT_LOAD_COLOR ) && + face->svg ) + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + FT_TRACE3(( "Trying to load SVG glyph\n" )); + + error = sfnt->load_svg_doc( glyph, glyph_index ); + if ( !error ) + { + FT_Fixed x_scale = size->root.metrics.x_scale; + FT_Fixed y_scale = size->root.metrics.y_scale; + + FT_Short leftBearing; + FT_Short topBearing; + FT_UShort advanceX; + FT_UShort advanceY; + + + FT_TRACE3(( "Successfully loaded SVG glyph\n" )); + + glyph->format = FT_GLYPH_FORMAT_SVG; + + sfnt->get_metrics( face, + FALSE, + glyph_index, + &leftBearing, + &advanceX ); + sfnt->get_metrics( face, + TRUE, + glyph_index, + &topBearing, + &advanceY ); + + glyph->linearHoriAdvance = advanceX; + glyph->linearVertAdvance = advanceY; + + glyph->metrics.horiAdvance = FT_MulFix( advanceX, x_scale ); + glyph->metrics.vertAdvance = FT_MulFix( advanceY, y_scale ); + + return error; + } + + FT_TRACE3(( "Failed to load SVG glyph\n" )); + } + + /* return immediately if we only want SVG glyphs */ + if ( load_flags & FT_LOAD_SVG_ONLY ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + +#endif /* FT_CONFIG_OPTION_SVG */ + + error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); + if ( error ) + goto Exit; + + /* done if we are only interested in the `hdmx` advance */ + if ( load_flags & FT_LOAD_ADVANCE_ONLY && + !( load_flags & FT_LOAD_VERTICAL_LAYOUT ) && + loader.widthp ) + { + glyph->metrics.horiAdvance = loader.widthp[glyph_index] * 64; + goto Done; + } + + glyph->format = FT_GLYPH_FORMAT_OUTLINE; + glyph->num_subglyphs = 0; + glyph->outline.flags = 0; + + /* main loading loop */ + error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); + if ( !error ) + { + if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) + { + glyph->num_subglyphs = loader.gloader->base.num_subglyphs; + glyph->subglyphs = loader.gloader->base.subglyphs; + } + else + { + glyph->outline = loader.gloader->base.outline; + glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; + + /* Translate array so that (0,0) is the glyph's origin. Note */ + /* that this behaviour is independent on the value of bit 1 of */ + /* the `flags' field in the `head' table -- at least major */ + /* applications like Acroread indicate that. */ + if ( loader.pp1.x ) + FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load_flags ) ) + { + glyph->control_data = loader.exec->glyphIns; + glyph->control_len = loader.exec->glyphSize; + + if ( loader.exec->GS.scan_control ) + { + /* convert scan conversion mode to FT_OUTLINE_XXX flags */ + switch ( loader.exec->GS.scan_type ) + { + case 0: /* simple drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; + break; + case 1: /* simple drop-outs excluding stubs */ + /* nothing; it's the default rendering mode */ + break; + case 4: /* smart drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | + FT_OUTLINE_INCLUDE_STUBS; + break; + case 5: /* smart drop-outs excluding stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; + break; + + default: /* no drop-out control */ + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + break; + } + } + else + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + error = compute_glyph_metrics( &loader, glyph_index ); + } + + /* Set the `high precision' bit flag. */ + /* This is _critical_ to get correct output for monochrome */ + /* TrueType glyphs at all sizes using the bytecode interpreter. */ + /* */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && + size->metrics->y_ppem < 24 ) + glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + FT_TRACE1(( " subglyphs = %u, contours = %hd, points = %hd," + " flags = 0x%.3x\n", + loader.gloader->base.num_subglyphs, + glyph->outline.n_contours, + glyph->outline.n_points, + glyph->outline.flags )); + + Done: + tt_loader_done( &loader ); + + Exit: +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE1(( " failed (error code 0x%x)\n", + error )); +#endif + + return error; + } + + +/* END */ diff --git a/external/freetype/src/truetype/ttgload.h b/external/freetype/src/truetype/ttgload.h new file mode 100644 index 000000000..f18637dce --- /dev/null +++ b/external/freetype/src/truetype/ttgload.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * + * ttgload.h + * + * TrueType Glyph Loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTGLOAD_H_ +#define TTGLOAD_H_ + + +#include "ttobjs.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + TT_Init_Glyph_Loading( TT_Face face ); + + FT_LOCAL( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Short* lsb, + FT_UShort* aw ); + + FT_LOCAL( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Pos yMax, + FT_Short* tsb, + FT_UShort* ah ); + + FT_LOCAL( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* TTGLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttgxvar.c b/external/freetype/src/truetype/ttgxvar.c new file mode 100644 index 000000000..ad4f266b2 --- /dev/null +++ b/external/freetype/src/truetype/ttgxvar.c @@ -0,0 +1,4661 @@ +/**************************************************************************** + * + * ttgxvar.c + * + * TrueType GX Font Variation loader + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * Apple documents the `fvar', `gvar', `cvar', and `avar' tables at + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6[fgca]var.html + * + * The documentation for `gvar' is not intelligible; `cvar' refers you + * to `gvar' and is thus also incomprehensible. + * + * The documentation for `avar' appears correct, but Apple has no fonts + * with an `avar' table, so it is hard to test. + * + * Many thanks to John Jenkins (at Apple) in figuring this out. + * + * + * Apple's `kern' table has some references to tuple indices, but as + * there is no indication where these indices are defined, nor how to + * interpolate the kerning values (different tuples have different + * classes) this issue is ignored. + * + */ + + +#include <ft2build.h> +#include <freetype/internal/ftdebug.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/sfnt.h> +#include <freetype/internal/services/svmetric.h> +#include <freetype/tttags.h> +#include <freetype/ttnameid.h> +#include <freetype/ftmm.h> +#include <freetype/ftlist.h> + +#include "ttpload.h" +#include "ttgxvar.h" + +#include "tterrors.h" + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + +#define FT_Stream_FTell( stream ) \ + (FT_ULong)( (stream)->cursor - (stream)->base ) +#define FT_Stream_SeekSet( stream, off ) \ + (stream)->cursor = \ + ( (off) < (FT_ULong)( (stream)->limit - (stream)->base ) ) \ + ? (stream)->base + (off) \ + : (stream)->limit + + + /* some macros we need */ +#define FT_fdot14ToFixed( x ) \ + ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) +#define FT_intToFixed( i ) \ + ( (FT_Fixed)( (FT_ULong)(i) << 16 ) ) +#define FT_fdot6ToFixed( i ) \ + ( (FT_Fixed)( (FT_ULong)(i) << 10 ) ) +#define FT_fixedToInt( x ) \ + ( (FT_Short)( ( (x) + 0x8000U ) >> 16 ) ) +#define FT_fixedToFdot6( x ) \ + ( (FT_Pos)( ( (x) + 0x200 ) >> 10 ) ) + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttgxvar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Internal Routines *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It + * indicates that there is a delta for every point without needing to + * enumerate all of them. + */ + + /* ensure that value `0' has the same width as a pointer */ +#define ALL_POINTS (FT_UShort*)~(FT_PtrDist)0 + + +#define GX_PT_POINTS_ARE_WORDS 0x80U +#define GX_PT_POINT_RUN_COUNT_MASK 0x7FU + + + /************************************************************************** + * + * @Function: + * ft_var_readpackedpoints + * + * @Description: + * Read a set of points to which the following deltas will apply. + * Points are packed with a run length encoding. + * + * @Input: + * stream :: + * The data stream. + * + * size :: + * The size of the table holding the data. + * + * @Output: + * point_cnt :: + * The number of points read. A zero value means that + * all points in the glyph will be affected, without + * enumerating them individually. + * + * @Return: + * An array of FT_UShort containing the affected points or the + * special value ALL_POINTS. + */ + static FT_UShort* + ft_var_readpackedpoints( FT_Stream stream, + FT_ULong size, + FT_UInt *point_cnt ) + { + FT_UShort *points = NULL; + FT_UInt n; + FT_UInt runcnt; + FT_UInt i, j; + FT_UShort first; + FT_Memory memory = stream->memory; + FT_Error error; + + + *point_cnt = 0; + + n = FT_GET_BYTE(); + if ( n == 0 ) + return ALL_POINTS; + + if ( n & GX_PT_POINTS_ARE_WORDS ) + { + n &= GX_PT_POINT_RUN_COUNT_MASK; + n <<= 8; + n |= FT_GET_BYTE(); + } + + if ( n > size ) + { + FT_TRACE1(( "ft_var_readpackedpoints: number of points too large\n" )); + return NULL; + } + + /* in the nested loops below we increase `i' twice; */ + /* it is faster to simply allocate one more slot */ + /* than to add another test within the loop */ + if ( FT_QNEW_ARRAY( points, n + 1 ) ) + return NULL; + + *point_cnt = n; + + first = 0; + i = 0; + while ( i < n ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_PT_POINTS_ARE_WORDS ) + { + runcnt &= GX_PT_POINT_RUN_COUNT_MASK; + first += FT_GET_USHORT(); + points[i++] = first; + + /* first point not included in run count */ + for ( j = 0; j < runcnt; j++ ) + { + first += FT_GET_USHORT(); + points[i++] = first; + if ( i >= n ) + break; + } + } + else + { + first += FT_GET_BYTE(); + points[i++] = first; + + for ( j = 0; j < runcnt; j++ ) + { + first += FT_GET_BYTE(); + points[i++] = first; + if ( i >= n ) + break; + } + } + } + + return points; + } + + +#define GX_DT_DELTAS_ARE_ZERO 0x80U +#define GX_DT_DELTAS_ARE_WORDS 0x40U +#define GX_DT_DELTA_RUN_COUNT_MASK 0x3FU + + + /************************************************************************** + * + * @Function: + * ft_var_readpackeddeltas + * + * @Description: + * Read a set of deltas. These are packed slightly differently than + * points. In particular there is no overall count. + * + * @Input: + * stream :: + * The data stream. + * + * size :: + * The size of the table holding the data. + * + * delta_cnt :: + * The number of deltas to be read. + * + * @Return: + * An array of FT_Fixed containing the deltas for the affected + * points. (This only gets the deltas for one dimension. It will + * generally be called twice, once for x, once for y. When used in + * cvt table, it will only be called once.) + * + * We use FT_Fixed to avoid accumulation errors while summing up all + * deltas (the rounding to integer values happens as the very last + * step). + */ + static FT_Fixed* + ft_var_readpackeddeltas( FT_Stream stream, + FT_ULong size, + FT_UInt delta_cnt ) + { + FT_Fixed *deltas = NULL; + FT_UInt runcnt, cnt; + FT_UInt i, j; + FT_UInt bytes_used; + FT_Memory memory = stream->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( deltas, delta_cnt ) ) + return NULL; + + i = 0; + bytes_used = 0; + + while ( i < delta_cnt && bytes_used < size ) + { + runcnt = FT_GET_BYTE(); + cnt = runcnt & GX_DT_DELTA_RUN_COUNT_MASK; + + bytes_used++; + + if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) + { + /* `cnt` + 1 zeroes get added */ + for ( j = 0; j <= cnt && i < delta_cnt; j++ ) + deltas[i++] = 0; + } + else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) + { + /* `cnt` + 1 shorts from the stack */ + bytes_used += 2 * ( cnt + 1 ); + if ( bytes_used > size ) + { + FT_TRACE1(( "ft_var_readpackeddeltas:" + " number of short deltas too large\n" )); + goto Fail; + } + + for ( j = 0; j <= cnt && i < delta_cnt; j++ ) + deltas[i++] = FT_intToFixed( FT_GET_SHORT() ); + } + else + { + /* `cnt` + 1 signed bytes from the stack */ + bytes_used += cnt + 1; + if ( bytes_used > size ) + { + FT_TRACE1(( "ft_var_readpackeddeltas:" + " number of byte deltas too large\n" )); + goto Fail; + } + + for ( j = 0; j <= cnt && i < delta_cnt; j++ ) + deltas[i++] = FT_intToFixed( FT_GET_CHAR() ); + } + + if ( j <= cnt ) + { + FT_TRACE1(( "ft_var_readpackeddeltas:" + " number of deltas too large\n" )); + goto Fail; + } + } + + if ( i < delta_cnt ) + { + FT_TRACE1(( "ft_var_readpackeddeltas: not enough deltas\n" )); + goto Fail; + } + + return deltas; + + Fail: + FT_FREE( deltas ); + return NULL; + } + + + /************************************************************************** + * + * @Function: + * ft_var_load_avar + * + * @Description: + * Parse the `avar' table if present. It need not be, so we return + * nothing. + * + * @InOut: + * face :: + * The font face. + */ + static void + ft_var_load_avar( TT_Face face ) + { + FT_Error error; + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + FT_Int i, j; + + GX_Blend blend = face->blend; + GX_AVarSegment segment; + GX_AVarTable table; + + FT_Long version; + FT_Long axisCount; + FT_ULong table_len; + +#ifndef TT_CONFIG_OPTION_NO_BORING_EXPANSION + FT_ULong table_offset; + FT_ULong store_offset; + FT_ULong axisMap_offset; +#endif + + + FT_TRACE2(( "AVAR " )); + + blend->avar_loaded = TRUE; + error = face->goto_table( face, TTAG_avar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + return; + } + +#ifndef TT_CONFIG_OPTION_NO_BORING_EXPANSION + table_offset = FT_STREAM_POS(); +#endif + + if ( FT_FRAME_ENTER( table_len ) ) + return; + + version = FT_GET_LONG(); + axisCount = FT_GET_LONG(); + + if ( version != 0x00010000L +#ifndef TT_CONFIG_OPTION_NO_BORING_EXPANSION + && version != 0x00020000L +#endif + ) + { + FT_TRACE2(( "bad table version\n" )); + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + + if ( axisCount != (FT_Long)blend->mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_load_avar:" + " number of axes in `avar' and `fvar'\n" )); + FT_TRACE2(( " table are different\n" )); + goto Exit; + } + + if ( FT_NEW( blend->avar_table ) ) + goto Exit; + table = blend->avar_table; + + if ( FT_QNEW_ARRAY( table->avar_segment, axisCount ) ) + goto Exit; + + segment = &table->avar_segment[0]; + for ( i = 0; i < axisCount; i++, segment++ ) + { + FT_TRACE5(( " axis %d:\n", i )); + + segment->pairCount = FT_GET_USHORT(); + if ( (FT_ULong)segment->pairCount * 4 > table_len || + FT_QNEW_ARRAY( segment->correspondence, segment->pairCount ) ) + { + /* Failure. Free everything we have done so far. We must do */ + /* it right now since loading the `avar' table is optional. */ + + for ( j = i - 1; j >= 0; j-- ) + FT_FREE( table->avar_segment[j].correspondence ); + + FT_FREE( table->avar_segment ); + goto Exit; + } + + for ( j = 0; j < segment->pairCount; j++ ) + { + segment->correspondence[j].fromCoord = + FT_fdot14ToFixed( FT_GET_SHORT() ); + segment->correspondence[j].toCoord = + FT_fdot14ToFixed( FT_GET_SHORT() ); + + FT_TRACE5(( " mapping %.5f to %.5f\n", + (double)segment->correspondence[j].fromCoord / 65536, + (double)segment->correspondence[j].toCoord / 65536 )); + } + + FT_TRACE5(( "\n" )); + } + +#ifndef TT_CONFIG_OPTION_NO_BORING_EXPANSION + if ( version < 0x00020000L ) + goto Exit; + + axisMap_offset = FT_GET_ULONG(); + store_offset = FT_GET_ULONG(); + + if ( store_offset ) + { + error = tt_var_load_item_variation_store( + FT_FACE( face ), + table_offset + store_offset, + &table->itemStore ); + if ( error ) + goto Exit; + } + + if ( axisMap_offset ) + { + error = tt_var_load_delta_set_index_mapping( + FT_FACE( face ), + table_offset + axisMap_offset, + &table->axisMap, + &table->itemStore, + table_len ); + if ( error ) + goto Exit; + } +#endif + + + Exit: + FT_FRAME_EXIT(); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_var_load_item_variation_store( FT_Face face, /* TT_Face */ + FT_ULong offset, + GX_ItemVarStore itemStore ) + { + TT_Face ttface = (TT_Face)face; + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + FT_Error error; + FT_UShort format; + FT_ULong region_offset; + + FT_UInt data_count; + FT_UShort axis_count; + FT_UInt region_count; + + FT_UInt i, j; + FT_Bool long_words; + + GX_Blend blend = ttface->blend; + FT_ULong* dataOffsetArray = NULL; + + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_USHORT( format ) ) + goto Exit; + + if ( format != 1 ) + { + FT_TRACE2(( "tt_var_load_item_variation_store: bad store format %d\n", + format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* read top level fields */ + if ( FT_READ_ULONG( region_offset ) || + FT_READ_USHORT( data_count ) ) + goto Exit; + + /* we need at least one entry in `itemStore->varData' */ + if ( !data_count ) + { + FT_TRACE2(( "tt_var_load_item_variation_store: missing varData\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* make temporary copy of item variation data offsets; */ + /* we will parse region list first, then come back */ + if ( FT_QNEW_ARRAY( dataOffsetArray, data_count ) ) + goto Exit; + + for ( i = 0; i < data_count; i++ ) + { + if ( FT_READ_ULONG( dataOffsetArray[i] ) ) + goto Exit; + } + + /* parse array of region records (region list) */ + if ( FT_STREAM_SEEK( offset + region_offset ) ) + goto Exit; + + if ( FT_READ_USHORT( axis_count ) || + FT_READ_USHORT( region_count ) ) + goto Exit; + + if ( axis_count != (FT_Long)blend->mmvar->num_axis ) + { + FT_TRACE2(( "tt_var_load_item_variation_store:" + " number of axes in item variation store\n" )); + FT_TRACE2(( " " + " and `fvar' table are different\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + itemStore->axisCount = axis_count; + + /* new constraint in OpenType 1.8.4 */ + if ( region_count >= 32768U ) + { + FT_TRACE2(( "tt_var_load_item_variation_store:" + " too many variation region tables\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_NEW_ARRAY( itemStore->varRegionList, region_count ) ) + goto Exit; + itemStore->regionCount = region_count; + + for ( i = 0; i < itemStore->regionCount; i++ ) + { + GX_AxisCoords axisCoords; + + + if ( FT_NEW_ARRAY( itemStore->varRegionList[i].axisList, axis_count ) ) + goto Exit; + + axisCoords = itemStore->varRegionList[i].axisList; + + for ( j = 0; j < itemStore->axisCount; j++ ) + { + FT_Short start, peak, end; + + + if ( FT_READ_SHORT( start ) || + FT_READ_SHORT( peak ) || + FT_READ_SHORT( end ) ) + goto Exit; + + axisCoords[j].startCoord = FT_fdot14ToFixed( start ); + axisCoords[j].peakCoord = FT_fdot14ToFixed( peak ); + axisCoords[j].endCoord = FT_fdot14ToFixed( end ); + } + } + + /* end of region list parse */ + + /* use dataOffsetArray now to parse varData items */ + if ( FT_NEW_ARRAY( itemStore->varData, data_count ) ) + goto Exit; + itemStore->dataCount = data_count; + + for ( i = 0; i < data_count; i++ ) + { + GX_ItemVarData varData = &itemStore->varData[i]; + + FT_UInt item_count; + FT_UShort word_delta_count; + FT_UInt region_idx_count; + FT_UInt per_region_size; + + + if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) ) + goto Exit; + + if ( FT_READ_USHORT( item_count ) || + FT_READ_USHORT( word_delta_count ) || + FT_READ_USHORT( region_idx_count ) ) + goto Exit; + + long_words = !!( word_delta_count & 0x8000 ); + word_delta_count &= 0x7FFF; + + /* check some data consistency */ + if ( word_delta_count > region_idx_count ) + { + FT_TRACE2(( "bad short count %d or region count %d\n", + word_delta_count, + region_idx_count )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( region_idx_count > itemStore->regionCount ) + { + FT_TRACE2(( "inconsistent regionCount %d in varData[%d]\n", + region_idx_count, + i )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* parse region indices */ + if ( FT_NEW_ARRAY( varData->regionIndices, region_idx_count ) ) + goto Exit; + varData->regionIdxCount = region_idx_count; + varData->wordDeltaCount = word_delta_count; + varData->longWords = long_words; + + for ( j = 0; j < varData->regionIdxCount; j++ ) + { + if ( FT_READ_USHORT( varData->regionIndices[j] ) ) + goto Exit; + + if ( varData->regionIndices[j] >= itemStore->regionCount ) + { + FT_TRACE2(( "bad region index %d\n", + varData->regionIndices[j] )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + per_region_size = word_delta_count + region_idx_count; + if ( long_words ) + per_region_size *= 2; + + if ( FT_NEW_ARRAY( varData->deltaSet, per_region_size * item_count ) ) + goto Exit; + if ( FT_Stream_Read( stream, + varData->deltaSet, + per_region_size * item_count ) ) + { + FT_TRACE2(( "deltaSet read failed." )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + varData->itemCount = item_count; + } + + Exit: + FT_FREE( dataOffsetArray ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_var_load_delta_set_index_mapping( FT_Face face, /* TT_Face */ + FT_ULong offset, + GX_DeltaSetIdxMap map, + GX_ItemVarStore itemStore, + FT_ULong table_len ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + FT_Error error; + + FT_Byte format; + FT_Byte entryFormat; + FT_UInt entrySize; + FT_UInt innerBitCount; + FT_UInt innerIndexMask; + FT_ULong i; + FT_UInt j; + + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_BYTE( format ) || + FT_READ_BYTE( entryFormat ) ) + goto Exit; + + if ( format == 0 ) + { + if ( FT_READ_USHORT( map->mapCount ) ) + goto Exit; + } + else if ( format == 1 ) /* new in OpenType 1.9 */ + { + if ( FT_READ_ULONG( map->mapCount ) ) + goto Exit; + } + else + { + FT_TRACE2(( "bad map format %d\n", format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( entryFormat & 0xC0 ) + { + FT_TRACE2(( "bad entry format %d\n", format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* bytes per entry: 1, 2, 3, or 4 */ + entrySize = ( ( entryFormat & 0x30 ) >> 4 ) + 1; + innerBitCount = ( entryFormat & 0x0F ) + 1; + innerIndexMask = ( 1 << innerBitCount ) - 1; + + /* rough sanity check */ + if ( map->mapCount * entrySize > table_len ) + { + FT_TRACE1(( "tt_var_load_delta_set_index_mapping:" + " invalid number of delta-set index mappings\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_NEW_ARRAY( map->innerIndex, map->mapCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( map->outerIndex, map->mapCount ) ) + goto Exit; + + for ( i = 0; i < map->mapCount; i++ ) + { + FT_UInt mapData = 0; + FT_UInt outerIndex, innerIndex; + + + /* read map data one unsigned byte at a time, big endian */ + for ( j = 0; j < entrySize; j++ ) + { + FT_Byte data; + + + if ( FT_READ_BYTE( data ) ) + goto Exit; + + mapData = ( mapData << 8 ) | data; + } + + /* new in OpenType 1.8.4 */ + if ( mapData == 0xFFFFFFFFUL ) + { + /* no variation data for this item */ + map->outerIndex[i] = 0xFFFFU; + map->innerIndex[i] = 0xFFFFU; + + continue; + } + + outerIndex = mapData >> innerBitCount; + + if ( outerIndex >= itemStore->dataCount ) + { + FT_TRACE2(( "outerIndex[%ld] == %d out of range\n", + i, + outerIndex )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + map->outerIndex[i] = outerIndex; + + innerIndex = mapData & innerIndexMask; + + if ( innerIndex >= itemStore->varData[outerIndex].itemCount ) + { + FT_TRACE2(( "innerIndex[%ld] == %d out of range\n", + i, + innerIndex )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + map->innerIndex[i] = innerIndex; + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * ft_var_load_hvvar + * + * @Description: + * If `vertical' is zero, parse the `HVAR' table and set + * `blend->hvar_loaded' to TRUE. On success, `blend->hvar_checked' + * is set to TRUE. + * + * If `vertical' is not zero, parse the `VVAR' table and set + * `blend->vvar_loaded' to TRUE. On success, `blend->vvar_checked' + * is set to TRUE. + * + * Some memory may remain allocated on error; it is always freed in + * `tt_done_blend', however. + * + * @InOut: + * face :: + * The font face. + * + * @Return: + * FreeType error code. 0 means success. + */ + static FT_Error + ft_var_load_hvvar( TT_Face face, + FT_Bool vertical ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + GX_Blend blend = face->blend; + + GX_HVVarTable table; + + FT_Error error; + FT_UShort majorVersion; + FT_ULong table_len; + FT_ULong table_offset; + FT_ULong store_offset; + FT_ULong widthMap_offset; + + + if ( vertical ) + { + blend->vvar_loaded = TRUE; + + FT_TRACE2(( "VVAR " )); + + error = face->goto_table( face, TTAG_VVAR, stream, &table_len ); + } + else + { + blend->hvar_loaded = TRUE; + + FT_TRACE2(( "HVAR " )); + + error = face->goto_table( face, TTAG_HVAR, stream, &table_len ); + } + + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + goto Exit; + } + + table_offset = FT_STREAM_POS(); + + /* skip minor version */ + if ( FT_READ_USHORT( majorVersion ) || + FT_STREAM_SKIP( 2 ) ) + goto Exit; + + if ( majorVersion != 1 ) + { + FT_TRACE2(( "bad table version %d\n", majorVersion )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_READ_ULONG( store_offset ) || + FT_READ_ULONG( widthMap_offset ) ) + goto Exit; + + if ( vertical ) + { + if ( FT_NEW( blend->vvar_table ) ) + goto Exit; + table = blend->vvar_table; + } + else + { + if ( FT_NEW( blend->hvar_table ) ) + goto Exit; + table = blend->hvar_table; + } + + error = tt_var_load_item_variation_store( + FT_FACE( face ), + table_offset + store_offset, + &table->itemStore ); + if ( error ) + goto Exit; + + if ( widthMap_offset ) + { + error = tt_var_load_delta_set_index_mapping( + FT_FACE( face ), + table_offset + widthMap_offset, + &table->widthMap, + &table->itemStore, + table_len ); + if ( error ) + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + error = FT_Err_Ok; + + Exit: + if ( !error ) + { + if ( vertical ) + { + blend->vvar_checked = TRUE; + + /* FreeType doesn't provide functions to quickly retrieve */ + /* TSB, BSB, or VORG values; we thus don't have to implement */ + /* support for those three item variation stores. */ + + face->variation_support |= TT_FACE_FLAG_VAR_VADVANCE; + } + else + { + blend->hvar_checked = TRUE; + + /* FreeType doesn't provide functions to quickly retrieve */ + /* LSB or RSB values; we thus don't have to implement */ + /* support for those two item variation stores. */ + + face->variation_support |= TT_FACE_FLAG_VAR_HADVANCE; + } + } + + return error; + } + + + FT_LOCAL_DEF( FT_ItemVarDelta ) + tt_var_get_item_delta( FT_Face face, /* TT_Face */ + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ) + { + TT_Face ttface = (TT_Face)face; + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + GX_ItemVarData varData; + FT_ItemVarDelta* deltaSet = NULL; + FT_ItemVarDelta deltaSetStack[16]; + + FT_Fixed* scalars = NULL; + FT_Fixed scalarsStack[16]; + + FT_UInt master, j; + FT_ItemVarDelta returnValue = 0; + FT_UInt per_region_size; + FT_Byte* bytes; + + + if ( !ttface->blend || !ttface->blend->normalizedcoords ) + return 0; + + /* OpenType 1.8.4+: No variation data for this item */ + /* as indices have special value 0xFFFF. */ + if ( outerIndex == 0xFFFF && innerIndex == 0xFFFF ) + return 0; + + /* See pseudo code from `Font Variations Overview' */ + /* in the OpenType specification. */ + + if ( outerIndex >= itemStore->dataCount ) + return 0; /* Out of range. */ + + varData = &itemStore->varData[outerIndex]; + + if ( innerIndex >= varData->itemCount ) + return 0; /* Out of range. */ + + if ( varData->regionIdxCount < 16 ) + { + deltaSet = deltaSetStack; + scalars = scalarsStack; + } + else + { + if ( FT_QNEW_ARRAY( deltaSet, varData->regionIdxCount ) ) + goto Exit; + if ( FT_QNEW_ARRAY( scalars, varData->regionIdxCount ) ) + goto Exit; + } + + /* Parse delta set. */ + /* */ + /* Deltas are (word_delta_count + region_idx_count) bytes each */ + /* if `longWords` isn't set, and twice as much otherwise. */ + per_region_size = varData->wordDeltaCount + varData->regionIdxCount; + if ( varData->longWords ) + per_region_size *= 2; + + bytes = varData->deltaSet + per_region_size * innerIndex; + + if ( varData->longWords ) + { + for ( master = 0; master < varData->wordDeltaCount; master++ ) + deltaSet[master] = FT_NEXT_LONG( bytes ); + for ( ; master < varData->regionIdxCount; master++ ) + deltaSet[master] = FT_NEXT_SHORT( bytes ); + } + else + { + for ( master = 0; master < varData->wordDeltaCount; master++ ) + deltaSet[master] = FT_NEXT_SHORT( bytes ); + for ( ; master < varData->regionIdxCount; master++ ) + deltaSet[master] = FT_NEXT_CHAR( bytes ); + } + + /* outer loop steps through master designs to be blended */ + for ( master = 0; master < varData->regionIdxCount; master++ ) + { + FT_Fixed scalar = 0x10000L; + FT_UInt regionIndex = varData->regionIndices[master]; + + GX_AxisCoords axis = itemStore->varRegionList[regionIndex].axisList; + + + /* inner loop steps through axes in this region */ + for ( j = 0; j < itemStore->axisCount; j++, axis++ ) + { + /* compute the scalar contribution of this axis; */ + /* ignore invalid ranges */ + if ( axis->startCoord > axis->peakCoord || + axis->peakCoord > axis->endCoord ) + continue; + + else if ( axis->startCoord < 0 && + axis->endCoord > 0 && + axis->peakCoord != 0 ) + continue; + + /* peak of 0 means ignore this axis */ + else if ( axis->peakCoord == 0 ) + continue; + + else if ( ttface->blend->normalizedcoords[j] == axis->peakCoord ) + continue; + + /* ignore this region if coords are out of range */ + else if ( ttface->blend->normalizedcoords[j] <= axis->startCoord || + ttface->blend->normalizedcoords[j] >= axis->endCoord ) + { + scalar = 0; + break; + } + + /* cumulative product of all the axis scalars */ + else if ( ttface->blend->normalizedcoords[j] < axis->peakCoord ) + scalar = + FT_MulDiv( scalar, + ttface->blend->normalizedcoords[j] - axis->startCoord, + axis->peakCoord - axis->startCoord ); + else + scalar = + FT_MulDiv( scalar, + axis->endCoord - ttface->blend->normalizedcoords[j], + axis->endCoord - axis->peakCoord ); + + } /* per-axis loop */ + + scalars[master] = scalar; + + } /* per-region loop */ + + + /* Compute the scaled delta for this region. + * + * From: https://docs.microsoft.com/en-us/typography/opentype/spec/otvarcommonformats#item-variation-store-header-and-item-variation-data-subtables: + * + * `Fixed` is a 32-bit (16.16) type and, in the general case, requires + * 32-bit deltas. As described above, the `DeltaSet` record can + * accommodate deltas that are, logically, either 16-bit or 32-bit. + * When scaled deltas are applied to `Fixed` values, the `Fixed` value + * is treated like a 32-bit integer. + * + * `FT_MulAddFix` internally uses 64-bit precision; it thus can handle + * deltas ranging from small 8-bit to large 32-bit values that are + * applied to 16.16 `FT_Fixed` / OpenType `Fixed` values. + */ + returnValue = FT_MulAddFix( scalars, deltaSet, varData->regionIdxCount ); + + Exit: + if ( scalars != scalarsStack ) + FT_FREE( scalars ); + if ( deltaSet != deltaSetStack ) + FT_FREE( deltaSet ); + + return returnValue; + } + + + /************************************************************************** + * + * @Function: + * tt_hvadvance_adjust + * + * @Description: + * Apply `HVAR' advance width or `VVAR' advance height adjustment of + * a given glyph. + * + * @Input: + * gindex :: + * The glyph index. + * + * vertical :: + * If set, handle `VVAR' table. + * + * @InOut: + * face :: + * The font face. + * + * adelta :: + * Points to width or height value that gets modified. + */ + static FT_Error + tt_hvadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue, + FT_Bool vertical ) + { + FT_Error error = FT_Err_Ok; + FT_UInt innerIndex, outerIndex; + FT_Int delta; + + GX_HVVarTable table; + + + if ( !face->doblend || !face->blend ) + goto Exit; + + if ( vertical ) + { + if ( !face->blend->vvar_loaded ) + { + /* initialize vvar table */ + face->blend->vvar_error = ft_var_load_hvvar( face, 1 ); + } + + if ( !face->blend->vvar_checked ) + { + error = face->blend->vvar_error; + goto Exit; + } + + table = face->blend->vvar_table; + } + else + { + if ( !face->blend->hvar_loaded ) + { + /* initialize hvar table */ + face->blend->hvar_error = ft_var_load_hvvar( face, 0 ); + } + + if ( !face->blend->hvar_checked ) + { + error = face->blend->hvar_error; + goto Exit; + } + + table = face->blend->hvar_table; + } + + /* advance width or height adjustments are always present in an */ + /* `HVAR' or `VVAR' table; no need to test for this capability */ + + if ( table->widthMap.innerIndex ) + { + FT_UInt idx = gindex; + + + if ( idx >= table->widthMap.mapCount ) + idx = table->widthMap.mapCount - 1; + + /* trust that HVAR parser has checked indices */ + outerIndex = table->widthMap.outerIndex[idx]; + innerIndex = table->widthMap.innerIndex[idx]; + } + else + { + /* no widthMap data */ + outerIndex = 0; + innerIndex = gindex; + } + + delta = tt_var_get_item_delta( FT_FACE( face ), + &table->itemStore, + outerIndex, + innerIndex ); + + if ( delta ) + { + FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n", + vertical ? "vertical height" : "horizontal width", + *avalue, + delta, + delta == 1 ? "" : "s", + vertical ? "VVAR" : "HVAR" )); + + *avalue = ADD_INT( *avalue, delta ); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_hadvance_adjust( FT_Face face, /* TT_Face */ + FT_UInt gindex, + FT_Int *avalue ) + { + return tt_hvadvance_adjust( (TT_Face)face, gindex, avalue, 0 ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_vadvance_adjust( FT_Face face, /* TT_Face */ + FT_UInt gindex, + FT_Int *avalue ) + { + return tt_hvadvance_adjust( (TT_Face)face, gindex, avalue, 1 ); + } + + +#define GX_VALUE_SIZE 8 + + /* all values are FT_Short or FT_UShort entities; */ + /* we treat them consistently as FT_Short */ +#define GX_VALUE_CASE( tag, dflt ) \ + case MVAR_TAG_ ## tag : \ + p = (FT_Short*)&face->dflt; \ + break + +#define GX_GASP_CASE( idx ) \ + case MVAR_TAG_GASP_ ## idx : \ + if ( idx < face->gasp.numRanges - 1 ) \ + p = (FT_Short*)&face->gasp.gaspRanges[idx].maxPPEM; \ + else \ + p = NULL; \ + break + + + static FT_Short* + ft_var_get_value_pointer( TT_Face face, + FT_ULong mvar_tag ) + { + FT_Short* p; + + + switch ( mvar_tag ) + { + GX_GASP_CASE( 0 ); + GX_GASP_CASE( 1 ); + GX_GASP_CASE( 2 ); + GX_GASP_CASE( 3 ); + GX_GASP_CASE( 4 ); + GX_GASP_CASE( 5 ); + GX_GASP_CASE( 6 ); + GX_GASP_CASE( 7 ); + GX_GASP_CASE( 8 ); + GX_GASP_CASE( 9 ); + + GX_VALUE_CASE( CPHT, os2.sCapHeight ); + GX_VALUE_CASE( HASC, os2.sTypoAscender ); + GX_VALUE_CASE( HCLA, os2.usWinAscent ); + GX_VALUE_CASE( HCLD, os2.usWinDescent ); + GX_VALUE_CASE( HCOF, horizontal.caret_Offset ); + GX_VALUE_CASE( HCRN, horizontal.caret_Slope_Run ); + GX_VALUE_CASE( HCRS, horizontal.caret_Slope_Rise ); + GX_VALUE_CASE( HDSC, os2.sTypoDescender ); + GX_VALUE_CASE( HLGP, os2.sTypoLineGap ); + GX_VALUE_CASE( SBXO, os2.ySubscriptXOffset); + GX_VALUE_CASE( SBXS, os2.ySubscriptXSize ); + GX_VALUE_CASE( SBYO, os2.ySubscriptYOffset ); + GX_VALUE_CASE( SBYS, os2.ySubscriptYSize ); + GX_VALUE_CASE( SPXO, os2.ySuperscriptXOffset ); + GX_VALUE_CASE( SPXS, os2.ySuperscriptXSize ); + GX_VALUE_CASE( SPYO, os2.ySuperscriptYOffset ); + GX_VALUE_CASE( SPYS, os2.ySuperscriptYSize ); + GX_VALUE_CASE( STRO, os2.yStrikeoutPosition ); + GX_VALUE_CASE( STRS, os2.yStrikeoutSize ); + GX_VALUE_CASE( UNDO, postscript.underlinePosition ); + GX_VALUE_CASE( UNDS, postscript.underlineThickness ); + GX_VALUE_CASE( VASC, vertical.Ascender ); + GX_VALUE_CASE( VCOF, vertical.caret_Offset ); + GX_VALUE_CASE( VCRN, vertical.caret_Slope_Run ); + GX_VALUE_CASE( VCRS, vertical.caret_Slope_Rise ); + GX_VALUE_CASE( VDSC, vertical.Descender ); + GX_VALUE_CASE( VLGP, vertical.Line_Gap ); + GX_VALUE_CASE( XHGT, os2.sxHeight ); + + default: + /* ignore unknown tag */ + p = NULL; + } + + return p; + } + + + /************************************************************************** + * + * @Function: + * ft_var_load_mvar + * + * @Description: + * Parse the `MVAR' table. + * + * Some memory may remain allocated on error; it is always freed in + * `tt_done_blend', however. + * + * @InOut: + * face :: + * The font face. + */ + static void + ft_var_load_mvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + GX_Blend blend = face->blend; + GX_ItemVarStore itemStore; + GX_Value value, limit; + + FT_Error error; + FT_UShort majorVersion; + FT_ULong table_len; + FT_ULong table_offset; + FT_UShort store_offset; + FT_ULong records_offset; + + + FT_TRACE2(( "MVAR " )); + + error = face->goto_table( face, TTAG_MVAR, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + return; + } + + table_offset = FT_STREAM_POS(); + + /* skip minor version */ + if ( FT_READ_USHORT( majorVersion ) || + FT_STREAM_SKIP( 2 ) ) + return; + + if ( majorVersion != 1 ) + { + FT_TRACE2(( "bad table version %d\n", majorVersion )); + return; + } + + if ( FT_NEW( blend->mvar_table ) ) + return; + + /* skip reserved entry and value record size */ + if ( FT_STREAM_SKIP( 4 ) || + FT_READ_USHORT( blend->mvar_table->valueCount ) || + FT_READ_USHORT( store_offset ) ) + return; + + records_offset = FT_STREAM_POS(); + + error = tt_var_load_item_variation_store( + FT_FACE( face ), + table_offset + store_offset, + &blend->mvar_table->itemStore ); + if ( error ) + return; + + if ( FT_NEW_ARRAY( blend->mvar_table->values, + blend->mvar_table->valueCount ) ) + return; + + if ( FT_STREAM_SEEK( records_offset ) || + FT_FRAME_ENTER( blend->mvar_table->valueCount * GX_VALUE_SIZE ) ) + return; + + value = blend->mvar_table->values; + limit = FT_OFFSET( value, blend->mvar_table->valueCount ); + itemStore = &blend->mvar_table->itemStore; + + for ( ; value < limit; value++ ) + { + value->tag = FT_GET_ULONG(); + value->outerIndex = FT_GET_USHORT(); + value->innerIndex = FT_GET_USHORT(); + + /* new in OpenType 1.8.4 */ + if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU ) + { + /* no variation data for this item */ + continue; + } + + if ( value->outerIndex >= itemStore->dataCount || + value->innerIndex >= itemStore->varData[value->outerIndex] + .itemCount ) + { + error = FT_THROW( Invalid_Table ); + break; + } + } + + FT_FRAME_EXIT(); + + if ( error ) + return; + + FT_TRACE2(( "loaded\n" )); + + value = blend->mvar_table->values; + limit = FT_OFFSET( value, blend->mvar_table->valueCount ); + + /* save original values of the data MVAR is going to modify */ + for ( ; value < limit; value++ ) + { + FT_Short* p = ft_var_get_value_pointer( face, value->tag ); + + + if ( p ) + value->unmodified = *p; +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE1(( "ft_var_load_mvar: Ignoring unknown tag `%c%c%c%c'\n", + (FT_Char)( value->tag >> 24 ), + (FT_Char)( value->tag >> 16 ), + (FT_Char)( value->tag >> 8 ), + (FT_Char)( value->tag ) )); +#endif + } + + face->variation_support |= TT_FACE_FLAG_VAR_MVAR; + } + + + static FT_Error + ft_size_reset_iterator( FT_ListNode node, + void* user ) + { + FT_Size size = (FT_Size)node->data; + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)user; + + + var->size_reset( size ); + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * tt_apply_mvar + * + * @Description: + * Apply `MVAR' table adjustments. + * + * @InOut: + * face :: + * The font face. + */ + FT_LOCAL_DEF( void ) + tt_apply_mvar( FT_Face face ) /* TT_Face */ + { + TT_Face ttface = (TT_Face)face; + + GX_Blend blend = ttface->blend; + GX_Value value, limit; + + FT_Short mvar_hasc_delta = 0; + FT_Short mvar_hdsc_delta = 0; + FT_Short mvar_hlgp_delta = 0; + + + if ( !( ttface->variation_support & TT_FACE_FLAG_VAR_MVAR ) ) + return; + + value = blend->mvar_table->values; + limit = FT_OFFSET( value, blend->mvar_table->valueCount ); + + for ( ; value < limit; value++ ) + { + FT_Short* p = ft_var_get_value_pointer( ttface, value->tag ); + FT_Int delta; + + + delta = tt_var_get_item_delta( face, + &blend->mvar_table->itemStore, + value->outerIndex, + value->innerIndex ); + + if ( p && delta ) + { + FT_TRACE5(( "value %c%c%c%c (%d unit%s) adjusted by %d unit%s (MVAR)\n", + (FT_Char)( value->tag >> 24 ), + (FT_Char)( value->tag >> 16 ), + (FT_Char)( value->tag >> 8 ), + (FT_Char)( value->tag ), + value->unmodified, + value->unmodified == 1 ? "" : "s", + delta, + delta == 1 ? "" : "s" )); + + /* since we handle both signed and unsigned values as FT_Short, */ + /* ensure proper overflow arithmetic */ + *p = (FT_Short)( value->unmodified + (FT_Short)delta ); + + /* Treat hasc, hdsc and hlgp specially, see below. */ + if ( value->tag == MVAR_TAG_HASC ) + mvar_hasc_delta = (FT_Short)delta; + else if ( value->tag == MVAR_TAG_HDSC ) + mvar_hdsc_delta = (FT_Short)delta; + else if ( value->tag == MVAR_TAG_HLGP ) + mvar_hlgp_delta = (FT_Short)delta; + } + } + + /* adjust all derived values */ + { + FT_Service_MetricsVariations var = + (FT_Service_MetricsVariations)ttface->face_var; + + /* + * Apply the deltas of hasc, hdsc and hlgp to the FT_Face's ascender, + * descender and height attributes, no matter how they were originally + * computed. + * + * (Code that ignores those and accesses the font's metrics values + * directly is already served by the delta application code above.) + * + * The MVAR table supports variations for both typo and win metrics. + * According to Behdad Esfahbod, the thinking of the working group was + * that no one uses win metrics anymore for setting line metrics (the + * specification even calls these metrics "horizontal clipping + * ascent/descent", probably for their role on the Windows platform in + * computing clipping boxes), and new fonts should use typo metrics, so + * typo deltas should be applied to whatever sfnt_load_face decided the + * line metrics should be. + * + * Before, the following led to different line metrics between default + * outline and instances, visible when e.g. the default outlines were + * used as the regular face and instances for everything else: + * + * 1. sfnt_load_face applied the hhea metrics by default. + * 2. This code later applied the typo metrics by default, regardless of + * whether they were actually changed or the font had the OS/2 table's + * fsSelection's bit 7 (USE_TYPO_METRICS) set. + */ + FT_Short current_line_gap = face->height - face->ascender + + face->descender; + + + face->ascender = face->ascender + mvar_hasc_delta; + face->descender = face->descender + mvar_hdsc_delta; + face->height = face->ascender - face->descender + + current_line_gap + mvar_hlgp_delta; + + face->underline_position = ttface->postscript.underlinePosition - + ttface->postscript.underlineThickness / 2; + face->underline_thickness = ttface->postscript.underlineThickness; + + /* iterate over all FT_Size objects and call `var->size_reset' */ + /* to propagate the metrics changes */ + if ( var && var->size_reset ) + FT_List_Iterate( &face->sizes_list, + ft_size_reset_iterator, + (void*)var ); + } + } + + + typedef struct GX_GVar_Head_ + { + FT_Long version; + FT_UShort axisCount; + FT_UShort globalCoordCount; + FT_ULong offsetToCoord; + FT_UShort glyphCount; + FT_UShort flags; + FT_ULong offsetToData; + + } GX_GVar_Head; + + + /************************************************************************** + * + * @Function: + * ft_var_load_gvar + * + * @Description: + * Parse the `gvar' table if present. If `fvar' is there, `gvar' had + * better be there too. + * + * @InOut: + * face :: + * The font face. + * + * @Return: + * FreeType error code. 0 means success. + */ + static FT_Error + ft_var_load_gvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Error error; + FT_UInt i, j; + FT_ULong table_len; + FT_ULong gvar_start; + FT_ULong offsetToData; + FT_ULong offsets_len; + GX_GVar_Head gvar_head; + + static const FT_Frame_Field gvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_GVar_Head + + FT_FRAME_START( 20 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( globalCoordCount ), + FT_FRAME_ULONG ( offsetToCoord ), + FT_FRAME_USHORT( glyphCount ), + FT_FRAME_USHORT( flags ), + FT_FRAME_ULONG ( offsetToData ), + FT_FRAME_END + }; + + + FT_TRACE2(( "GVAR " )); + + if ( FT_SET_ERROR( face->goto_table( face, + TTAG_gvar, + stream, + &table_len ) ) ) + { + FT_TRACE2(( "is missing\n" )); + goto Exit; + } + + gvar_start = FT_STREAM_POS( ); + if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) + goto Exit; + + if ( gvar_head.version != 0x00010000L ) + { + FT_TRACE1(( "bad table version\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) + { + FT_TRACE1(( "ft_var_load_gvar:" + " number of axes in `gvar' and `cvar'\n" )); + FT_TRACE1(( " table are different\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* rough sanity check, ignoring offsets */ + if ( (FT_ULong)gvar_head.globalCoordCount * gvar_head.axisCount > + table_len / 2 ) + { + FT_TRACE1(( "ft_var_load_gvar:" + " invalid number of global coordinates\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* offsets can be either 2 or 4 bytes */ + /* (one more offset than glyphs, to mark size of last) */ + offsets_len = ( gvar_head.glyphCount + 1 ) * + ( ( gvar_head.flags & 1 ) ? 4L : 2L ); + + /* rough sanity check */ + if (offsets_len > table_len ) + { + FT_TRACE1(( "ft_var_load_gvar: invalid number of glyphs\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + + blend->gvar_size = table_len; + offsetToData = gvar_start + gvar_head.offsetToData; + + FT_TRACE5(( "gvar: there %s %d shared coordinate%s:\n", + gvar_head.globalCoordCount == 1 ? "is" : "are", + gvar_head.globalCoordCount, + gvar_head.globalCoordCount == 1 ? "" : "s" )); + + if ( FT_FRAME_ENTER( offsets_len ) ) + goto Exit; + + /* offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_QNEW_ARRAY( blend->glyphoffsets, gvar_head.glyphCount + 1 ) ) + goto Fail2; + + if ( gvar_head.flags & 1 ) + { + FT_ULong limit = gvar_start + table_len; + FT_ULong max_offset = 0; + + + for ( i = 0; i <= gvar_head.glyphCount; i++ ) + { + blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG(); + + if ( max_offset <= blend->glyphoffsets[i] ) + max_offset = blend->glyphoffsets[i]; + else + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation data offset %d not monotonic\n", + i )); + blend->glyphoffsets[i] = max_offset; + } + + /* use `<', not `<=' */ + if ( limit < blend->glyphoffsets[i] ) + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation data offset %d out of range\n", + i )); + blend->glyphoffsets[i] = limit; + } + } + } + else + { + FT_ULong limit = gvar_start + table_len; + FT_ULong max_offset = 0; + + + for ( i = 0; i <= gvar_head.glyphCount; i++ ) + { + blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; + + if ( max_offset <= blend->glyphoffsets[i] ) + max_offset = blend->glyphoffsets[i]; + else + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation data offset %d not monotonic\n", + i )); + blend->glyphoffsets[i] = max_offset; + } + + /* use `<', not `<=' */ + if ( limit < blend->glyphoffsets[i] ) + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation data offset %d out of range\n", + i )); + blend->glyphoffsets[i] = limit; + } + } + } + + blend->gv_glyphcnt = gvar_head.glyphCount; + + FT_FRAME_EXIT(); + + if ( gvar_head.globalCoordCount != 0 ) + { + if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || + FT_FRAME_ENTER( gvar_head.globalCoordCount * + gvar_head.axisCount * 2L ) ) + { + FT_TRACE2(( "ft_var_load_gvar:" + " glyph variation shared tuples missing\n" )); + goto Fail; + } + + if ( FT_QNEW_ARRAY( blend->tuplecoords, + gvar_head.axisCount * gvar_head.globalCoordCount ) ) + goto Fail2; + + for ( i = 0; i < gvar_head.globalCoordCount; i++ ) + { + FT_TRACE5(( " [ " )); + for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ ) + { + blend->tuplecoords[i * gvar_head.axisCount + j] = + FT_fdot14ToFixed( FT_GET_SHORT() ); + FT_TRACE5(( "%.5f ", + (double)blend->tuplecoords[i * gvar_head.axisCount + j] / 65536 )); + } + FT_TRACE5(( "]\n" )); + } + + blend->tuplecount = gvar_head.globalCoordCount; + + FT_TRACE5(( "\n" )); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + + Fail2: + FT_FRAME_EXIT(); + + Fail: + FT_FREE( blend->glyphoffsets ); + blend->gv_glyphcnt = 0; + goto Exit; + } + + + /************************************************************************** + * + * @Function: + * ft_var_apply_tuple + * + * @Description: + * Figure out whether a given tuple (design) applies to the current + * blend, and if so, what is the scaling factor. + * + * @Input: + * blend :: + * The current blend of the font. + * + * tupleIndex :: + * A flag saying whether this is an intermediate + * tuple or not. + * + * tuple_coords :: + * The coordinates of the tuple in normalized axis + * units. + * + * im_start_coords :: + * The initial coordinates where this tuple starts + * to apply (for intermediate coordinates). + * + * im_end_coords :: + * The final coordinates after which this tuple no + * longer applies (for intermediate coordinates). + * + * @Return: + * An FT_Fixed value containing the scaling factor. + */ + static FT_Fixed + ft_var_apply_tuple( GX_Blend blend, + FT_UShort tupleIndex, + FT_Fixed* tuple_coords, + FT_Fixed* im_start_coords, + FT_Fixed* im_end_coords ) + { + FT_UInt i; + FT_Fixed apply = 0x10000L; + + + for ( i = 0; i < blend->num_axis; i++ ) + { + FT_TRACE6(( " axis %d coordinate %.5f:\n", + i, (double)blend->normalizedcoords[i] / 65536 )); + + /* It's not clear why (for intermediate tuples) we don't need */ + /* to check against start/end -- the documentation says we don't. */ + /* Similarly, it's unclear why we don't need to scale along the */ + /* axis. */ + + if ( tuple_coords[i] == 0 ) + { + FT_TRACE6(( " tuple coordinate is zero, ignore\n" )); + continue; + } + + if ( blend->normalizedcoords[i] == 0 ) + { + FT_TRACE6(( " axis coordinate is zero, stop\n" )); + apply = 0; + break; + } + + if ( blend->normalizedcoords[i] == tuple_coords[i] ) + { + FT_TRACE6(( " tuple coordinate %.5f fits perfectly\n", + (double)tuple_coords[i] / 65536 )); + /* `apply' does not change */ + continue; + } + + if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) + { + /* not an intermediate tuple */ + + if ( blend->normalizedcoords[i] < FT_MIN( 0, tuple_coords[i] ) || + blend->normalizedcoords[i] > FT_MAX( 0, tuple_coords[i] ) ) + { + FT_TRACE6(( " tuple coordinate %.5f is exceeded, stop\n", + (double)tuple_coords[i] / 65536 )); + apply = 0; + break; + } + + FT_TRACE6(( " tuple coordinate %.5f fits\n", + (double)tuple_coords[i] / 65536 )); + apply = FT_MulDiv( apply, + blend->normalizedcoords[i], + tuple_coords[i] ); + } + else + { + /* intermediate tuple */ + + if ( blend->normalizedcoords[i] <= im_start_coords[i] || + blend->normalizedcoords[i] >= im_end_coords[i] ) + { + FT_TRACE6(( " intermediate tuple range ]%.5f;%.5f[ is exceeded," + " stop\n", + (double)im_start_coords[i] / 65536, + (double)im_end_coords[i] / 65536 )); + apply = 0; + break; + } + + FT_TRACE6(( " intermediate tuple range ]%.5f;%.5f[ fits\n", + (double)im_start_coords[i] / 65536, + (double)im_end_coords[i] / 65536 )); + if ( blend->normalizedcoords[i] < tuple_coords[i] ) + apply = FT_MulDiv( apply, + blend->normalizedcoords[i] - im_start_coords[i], + tuple_coords[i] - im_start_coords[i] ); + else + apply = FT_MulDiv( apply, + im_end_coords[i] - blend->normalizedcoords[i], + im_end_coords[i] - tuple_coords[i] ); + } + } + + FT_TRACE6(( " apply factor is %.5f\n", (double)apply / 65536 )); + + return apply; + } + + + /* convert from design coordinates to normalized coordinates */ + + static void + ft_var_to_normalized( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Fixed* normalized ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = face->root.memory; + FT_UInt i, j; + + GX_Blend blend; + FT_MM_Var* mmvar; + FT_Var_Axis* a; + GX_AVarSegment av; + + FT_Fixed* new_normalized = NULL; + FT_Fixed* old_normalized; + + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_to_normalized:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + /* Axis normalization is a two-stage process. First we normalize */ + /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ + /* Then, if there's an `avar' table, we renormalize this range. */ + + a = mmvar->axis; + for ( i = 0; i < num_coords; i++, a++ ) + { + FT_Fixed coord = coords[i]; + + + FT_TRACE5(( " %d: %.5f\n", i, (double)coord / 65536 )); + if ( coord > a->maximum || coord < a->minimum ) + { + FT_TRACE1(( "ft_var_to_normalized: design coordinate %.5f\n", + (double)coord / 65536 )); + FT_TRACE1(( " is out of range [%.5f;%.5f];" + " clamping\n", + (double)a->minimum / 65536, + (double)a->maximum / 65536 )); + } + + if ( coord > a->def ) + normalized[i] = coord >= a->maximum ? 0x10000L : + FT_DivFix( SUB_LONG( coord, a->def ), + SUB_LONG( a->maximum, a->def ) ); + else if ( coord < a->def ) + normalized[i] = coord <= a->minimum ? -0x10000L : + FT_DivFix( SUB_LONG( coord, a->def ), + SUB_LONG( a->def, a->minimum ) ); + else + normalized[i] = 0; + } + + FT_TRACE5(( "\n" )); + + for ( ; i < mmvar->num_axis; i++ ) + normalized[i] = 0; + + if ( blend->avar_table ) + { + GX_AVarTable table = blend->avar_table; + + + FT_TRACE5(( "normalized design coordinates" + " before applying `avar' data:\n" )); + + if ( table->avar_segment ) + { + av = table->avar_segment; + + for ( i = 0; i < mmvar->num_axis; i++, av++ ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) + { + if ( normalized[i] < av->correspondence[j].fromCoord ) + { + FT_TRACE5(( " %.5f\n", (double)normalized[i] / 65536 )); + + normalized[i] = + FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord, + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord ) + + av->correspondence[j - 1].toCoord; + break; + } + } + } + } + + if ( table->itemStore.varData ) + { + if ( FT_QNEW_ARRAY( new_normalized, mmvar->num_axis ) ) + return; + + /* Install our half-normalized coordinates for the next */ + /* Item Variation Store to work with. */ + old_normalized = face->blend->normalizedcoords; + face->blend->normalizedcoords = normalized; + + for ( i = 0; i < mmvar->num_axis; i++ ) + { + FT_Fixed v = normalized[i]; + FT_UInt innerIndex = i; + FT_UInt outerIndex = 0; + FT_Int delta; + + + if ( table->axisMap.innerIndex ) + { + FT_UInt idx = i; + + + if ( idx >= table->axisMap.mapCount ) + idx = table->axisMap.mapCount - 1; + + outerIndex = table->axisMap.outerIndex[idx]; + innerIndex = table->axisMap.innerIndex[idx]; + } + + delta = tt_var_get_item_delta( FT_FACE( face ), + &table->itemStore, + outerIndex, + innerIndex ); + + v += delta << 2; + + /* Clamp value range. */ + v = v >= 0x10000L ? 0x10000 : v; + v = v <= -0x10000L ? -0x10000 : v; + + new_normalized[i] = v; + } + + for ( i = 0; i < mmvar->num_axis; i++ ) + { + normalized[i] = new_normalized[i]; + } + + face->blend->normalizedcoords = old_normalized; + + FT_FREE( new_normalized ); + } + } + } + + + /* convert from normalized coordinates to design coordinates */ + + static void + ft_var_to_design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Fixed* design ) + { + GX_Blend blend; + FT_MM_Var* mmvar; + FT_Var_Axis* a; + + FT_UInt i, j, nc; + + + blend = face->blend; + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "ft_var_to_design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + for ( i = 0; i < nc; i++ ) + design[i] = coords[i]; + + for ( ; i < num_coords; i++ ) + design[i] = 0; + + if ( blend->avar_table && blend->avar_table->avar_segment ) + { + GX_AVarSegment av = blend->avar_table->avar_segment; + + + FT_TRACE5(( "design coordinates" + " after removing `avar' distortion:\n" )); + + for ( i = 0; i < nc; i++, av++ ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) + { + if ( design[i] < av->correspondence[j].toCoord ) + { + design[i] = + FT_MulDiv( design[i] - av->correspondence[j - 1].toCoord, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord, + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord ) + + av->correspondence[j - 1].fromCoord; + + FT_TRACE5(( " %.5f\n", (double)design[i] / 65536 )); + break; + } + } + } + } + + mmvar = blend->mmvar; + a = mmvar->axis; + + for ( i = 0; i < nc; i++, a++ ) + { + if ( design[i] < 0 ) + design[i] = a->def + FT_MulFix( design[i], + a->def - a->minimum ); + else if ( design[i] > 0 ) + design[i] = a->def + FT_MulFix( design[i], + a->maximum - a->def ); + else + design[i] = a->def; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct GX_FVar_Head_ + { + FT_Long version; + FT_UShort offsetToData; + FT_UShort axisCount; + FT_UShort axisSize; + FT_UShort instanceCount; + FT_UShort instanceSize; + + } GX_FVar_Head; + + + typedef struct fvar_axis_ + { + FT_ULong axisTag; + FT_Fixed minValue; + FT_Fixed defaultValue; + FT_Fixed maxValue; + FT_UShort flags; + FT_UShort nameID; + + } GX_FVar_Axis; + + + /************************************************************************** + * + * @Function: + * TT_Get_MM_Var + * + * @Description: + * Check that the font's `fvar' table is valid, parse it, and return + * those data. It also loads (and parses) the `MVAR' table, if + * possible. + * + * @InOut: + * face :: + * The font face. + * TT_Get_MM_Var initializes the blend structure. + * + * @Output: + * master :: + * The `fvar' data (must be freed by caller). Can be NULL, + * which makes this function simply load MM support. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Var( FT_Face face, /* TT_Face */ + FT_MM_Var* *master ) + { + TT_Face ttface = (TT_Face)face; + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_ULong table_len; + FT_Error error = FT_Err_Ok; + FT_ULong fvar_start = 0; + FT_UInt i, j; + FT_MM_Var* mmvar = NULL; + FT_Fixed* next_coords; + FT_Fixed* nsc; + FT_String* next_name; + FT_Var_Axis* a; + FT_Fixed* c; + FT_Var_Named_Style* ns; + GX_FVar_Head fvar_head = { 0, 0, 0, 0, 0, 0 }; + FT_Bool usePsName = 0; + FT_UInt num_instances; + FT_UInt num_axes; + FT_UShort* axis_flags; + + FT_Offset mmvar_size; + FT_Offset axis_flags_size; + FT_Offset axis_size; + FT_Offset namedstyle_size; + FT_Offset next_coords_size; + FT_Offset next_name_size; + + FT_Bool need_init; + + static const FT_Frame_Field fvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Head + + FT_FRAME_START( 16 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT ( offsetToData ), + FT_FRAME_SKIP_SHORT, + FT_FRAME_USHORT ( axisCount ), + FT_FRAME_USHORT ( axisSize ), + FT_FRAME_USHORT ( instanceCount ), + FT_FRAME_USHORT ( instanceSize ), + FT_FRAME_END + }; + + static const FT_Frame_Field fvaraxis_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Axis + + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( axisTag ), + FT_FRAME_LONG ( minValue ), + FT_FRAME_LONG ( defaultValue ), + FT_FRAME_LONG ( maxValue ), + FT_FRAME_USHORT( flags ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_END + }; + + /* `num_instances` holds the number of all named instances including */ + /* the default instance, which might be missing in the table of named */ + /* instances (in 'fvar'). This value is validated in `sfobjs.c` and */ + /* may be reset to 0 if consistency checks fail. */ + num_instances = (FT_UInt)face->style_flags >> 16; + + /* read the font data and set up the internal representation */ + /* if not already done */ + + need_init = !ttface->blend; + + if ( need_init ) + { + FT_TRACE2(( "FVAR " )); + + if ( FT_SET_ERROR( ttface->goto_table( ttface, TTAG_fvar, + stream, &table_len ) ) ) + { + FT_TRACE1(( "is missing\n" )); + goto Exit; + } + + fvar_start = FT_STREAM_POS( ); + + /* the validity of the `fvar' header data was already checked */ + /* in function `sfnt_init_face' */ + if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) + goto Exit; + + /* If `num_instances` is larger, synthetization of the default */ + /* instance is required. If `num_instances` is smaller, */ + /* however, the value has been reset to 0 in `sfnt_init_face` */ + /* (in `sfobjs.c`); in this case we have underallocated `mmvar` */ + /* structs. */ + if ( num_instances < fvar_head.instanceCount ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + usePsName = FT_BOOL( fvar_head.instanceSize == + 6 + 4 * fvar_head.axisCount ); + + FT_TRACE2(( "loaded\n" )); + + FT_TRACE5(( "%d variation ax%s\n", + fvar_head.axisCount, + fvar_head.axisCount == 1 ? "is" : "es" )); + + if ( FT_NEW( ttface->blend ) ) + goto Exit; + + num_axes = fvar_head.axisCount; + ttface->blend->num_axis = num_axes; + } + else + num_axes = ttface->blend->num_axis; + + /* prepare storage area for MM data; this cannot overflow */ + /* 32-bit arithmetic because of the size limits used in the */ + /* `fvar' table validity check in `sfnt_init_face' */ + + /* the various `*_size' variables, which we also use as */ + /* offsets into the `mmvar' array, must be multiples of the */ + /* pointer size (except the last one); without such an */ + /* alignment there might be runtime errors due to */ + /* misaligned addresses */ +#undef ALIGN_SIZE +#define ALIGN_SIZE( n ) \ + ( ( (n) + sizeof (void*) - 1 ) & ~( sizeof (void*) - 1 ) ) + + mmvar_size = ALIGN_SIZE( sizeof ( FT_MM_Var ) ); + axis_flags_size = ALIGN_SIZE( num_axes * + sizeof ( FT_UShort ) ); + axis_size = ALIGN_SIZE( num_axes * + sizeof ( FT_Var_Axis ) ); + namedstyle_size = ALIGN_SIZE( num_instances * + sizeof ( FT_Var_Named_Style ) ); + next_coords_size = ALIGN_SIZE( num_instances * + num_axes * + sizeof ( FT_Fixed ) ); + next_name_size = num_axes * 5; + + if ( need_init ) + { + ttface->blend->mmvar_len = mmvar_size + + axis_flags_size + + axis_size + + namedstyle_size + + next_coords_size + + next_name_size; + + if ( FT_ALLOC( mmvar, ttface->blend->mmvar_len ) ) + goto Exit; + ttface->blend->mmvar = mmvar; + + /* set up pointers and offsets into the `mmvar' array; */ + /* the data gets filled in later on */ + + mmvar->num_axis = + num_axes; + mmvar->num_designs = + ~0U; /* meaningless in this context; each glyph */ + /* may have a different number of designs */ + /* (or tuples, as called by Apple) */ + mmvar->num_namedstyles = + num_instances; + + /* alas, no public field in `FT_Var_Axis' for axis flags */ + axis_flags = + (FT_UShort*)( (char*)mmvar + mmvar_size ); + mmvar->axis = + (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); + mmvar->namedstyle = + (FT_Var_Named_Style*)( (char*)mmvar->axis + axis_size ); + + next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle + + namedstyle_size ); + for ( i = 0; i < num_instances; i++ ) + { + mmvar->namedstyle[i].coords = next_coords; + next_coords += num_axes; + } + + next_name = (FT_String*)( (char*)mmvar->namedstyle + + namedstyle_size + next_coords_size ); + for ( i = 0; i < num_axes; i++ ) + { + mmvar->axis[i].name = next_name; + next_name += 5; + } + + /* now fill in the data */ + + if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < num_axes; i++ ) + { + GX_FVar_Axis axis_rec; + +#ifdef FT_DEBUG_LEVEL_TRACE + int invalid = 0; +#endif + + + if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) + goto Exit; + a->tag = axis_rec.axisTag; + a->minimum = axis_rec.minValue; + a->def = axis_rec.defaultValue; + a->maximum = axis_rec.maxValue; + a->strid = axis_rec.nameID; + + a->name[0] = (FT_String)( a->tag >> 24 ); + a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); + a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); + a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); + a->name[4] = '\0'; + + *axis_flags = axis_rec.flags; + + if ( a->minimum > a->def || + a->def > a->maximum ) + { + a->minimum = a->def; + a->maximum = a->def; + +#ifdef FT_DEBUG_LEVEL_TRACE + invalid = 1; +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( i == 0 ) + FT_TRACE5(( " idx tag " + /* " XXX `XXXX'" */ + " minimum default maximum flags\n" )); + /* " XXXX.XXXXX XXXX.XXXXX XXXX.XXXXX 0xXXXX" */ + + FT_TRACE5(( " %3d `%s'" + " %10.5f %10.5f %10.5f 0x%04X%s\n", + i, + a->name, + (double)a->minimum / 65536, + (double)a->def / 65536, + (double)a->maximum / 65536, + *axis_flags, + invalid ? " (invalid, disabled)" : "" )); +#endif + + a++; + axis_flags++; + } + + FT_TRACE5(( "\n" )); + + /* named instance coordinates are stored as design coordinates; */ + /* we have to convert them to normalized coordinates also */ + if ( FT_NEW_ARRAY( ttface->blend->normalized_stylecoords, + num_axes * num_instances ) ) + goto Exit; + + if ( fvar_head.instanceCount && !ttface->blend->avar_loaded ) + { + FT_ULong offset = FT_STREAM_POS(); + + + ft_var_load_avar( ttface ); + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + } + + FT_TRACE5(( "%d named instance%s\n", + fvar_head.instanceCount, + fvar_head.instanceCount == 1 ? "" : "s" )); + + ns = mmvar->namedstyle; + nsc = ttface->blend->normalized_stylecoords; + for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) + { + /* PostScript names add 2 bytes to the instance record size */ + if ( FT_FRAME_ENTER( ( usePsName ? 6L : 4L ) + + 4L * num_axes ) ) + goto Exit; + + ns->strid = FT_GET_USHORT(); + (void) /* flags = */ FT_GET_USHORT(); + + c = ns->coords; + for ( j = 0; j < num_axes; j++, c++ ) + *c = FT_GET_LONG(); + + /* valid psid values are 6, [256;32767], and 0xFFFF */ + if ( usePsName ) + ns->psid = FT_GET_USHORT(); + else + ns->psid = 0xFFFF; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + + FT_String* strname = NULL; + FT_String* psname = NULL; + + FT_ULong pos; + + + pos = FT_STREAM_POS(); + + if ( ns->strid != 0xFFFF ) + { + (void)sfnt->get_name( ttface, + (FT_UShort)ns->strid, + &strname ); + if ( strname && !ft_strcmp( strname, ".notdef" ) ) + strname = NULL; + } + + if ( ns->psid != 0xFFFF ) + { + (void)sfnt->get_name( ttface, + (FT_UShort)ns->psid, + &psname ); + if ( psname && !ft_strcmp( psname, ".notdef" ) ) + psname = NULL; + } + + (void)FT_STREAM_SEEK( pos ); + + FT_TRACE5(( " named instance %d (%s%s%s, %s%s%s)\n", + i, + strname ? "name: `" : "", + strname ? strname : "unnamed", + strname ? "'" : "", + psname ? "PS name: `" : "", + psname ? psname : "no PS name", + psname ? "'" : "" )); + + FT_FREE( strname ); + FT_FREE( psname ); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + ft_var_to_normalized( ttface, num_axes, ns->coords, nsc ); + nsc += num_axes; + + FT_FRAME_EXIT(); + } + + if ( num_instances != fvar_head.instanceCount ) + { + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + + FT_Int found, dummy1, dummy2; + FT_UInt strid = ~0U; + + + /* The default instance is missing in array the */ + /* of named instances; try to synthesize an entry. */ + /* If this fails, `default_named_instance` remains */ + /* at value zero, which doesn't do any harm. */ + found = sfnt->get_name_id( ttface, + TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, + &dummy1, + &dummy2 ); + if ( found ) + strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY; + else + { + found = sfnt->get_name_id( ttface, + TT_NAME_ID_FONT_SUBFAMILY, + &dummy1, + &dummy2 ); + if ( found ) + strid = TT_NAME_ID_FONT_SUBFAMILY; + } + + if ( found ) + { + found = sfnt->get_name_id( ttface, + TT_NAME_ID_PS_NAME, + &dummy1, + &dummy2 ); + if ( found ) + { + FT_TRACE5(( "TT_Get_MM_Var:" + " Adding default instance to named instances\n" )); + + /* named instance indices start with value 1 */ + ttface->var_default_named_instance = num_instances; + + ns = &mmvar->namedstyle[fvar_head.instanceCount]; + + ns->strid = strid; + ns->psid = TT_NAME_ID_PS_NAME; + + a = mmvar->axis; + c = ns->coords; + for ( j = 0; j < num_axes; j++, a++, c++ ) + *c = a->def; + } + } + } + + ft_var_load_mvar( ttface ); + } + + /* fill the output array if requested */ + + if ( master ) + { + FT_UInt n; + + + if ( FT_ALLOC( mmvar, ttface->blend->mmvar_len ) ) + goto Exit; + FT_MEM_COPY( mmvar, ttface->blend->mmvar, ttface->blend->mmvar_len ); + + axis_flags = + (FT_UShort*)( (char*)mmvar + mmvar_size ); + mmvar->axis = + (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); + mmvar->namedstyle = + (FT_Var_Named_Style*)( (char*)mmvar->axis+ axis_size ); + + next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle + + namedstyle_size ); + for ( n = 0; n < mmvar->num_namedstyles; n++ ) + { + mmvar->namedstyle[n].coords = next_coords; + next_coords += num_axes; + } + + a = mmvar->axis; + next_name = (FT_String*)( (char*)mmvar->namedstyle + + namedstyle_size + next_coords_size ); + for ( n = 0; n < num_axes; n++ ) + { + a->name = next_name; + + /* standard PostScript names for some standard apple tags */ + if ( a->tag == TTAG_wght ) + a->name = (char*)"Weight"; + else if ( a->tag == TTAG_wdth ) + a->name = (char*)"Width"; + else if ( a->tag == TTAG_opsz ) + a->name = (char*)"OpticalSize"; + else if ( a->tag == TTAG_slnt ) + a->name = (char*)"Slant"; + else if ( a->tag == TTAG_ital ) + a->name = (char*)"Italic"; + + next_name += 5; + a++; + } + + *master = mmvar; + } + + Exit: + return error; + } + + + static FT_Error + tt_set_mm_blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Bool set_design_coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + + FT_Bool all_design_coords = FALSE; + + FT_Memory memory = face->root.memory; + + enum + { + mcvt_retain, + mcvt_modify, + mcvt_load + + } manageCvt; + + + face->doblend = FALSE; + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( FT_FACE( face ), NULL ) ) ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "TT_Set_MM_Blend:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + FT_TRACE5(( "TT_Set_MM_Blend:\n" )); + FT_TRACE5(( " normalized design coordinates:\n" )); + + for ( i = 0; i < num_coords; i++ ) + { + FT_TRACE5(( " %.5f\n", (double)coords[i] / 65536 )); + if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) + { + FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.5f\n", + (double)coords[i] / 65536 )); + FT_TRACE1(( " is out of range [-1;1]\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + FT_TRACE5(( "\n" )); + + if ( !face->is_cff2 && !blend->glyphoffsets ) + { + /* While a missing 'gvar' table is acceptable, for example for */ + /* fonts that only vary metrics information or 'COLR' v1 */ + /* `PaintVar*` tables, an incorrect SFNT table offset or size */ + /* for 'gvar', or an inconsistent 'gvar' table is not. */ + error = ft_var_load_gvar( face ); + if ( error != FT_Err_Table_Missing && error != FT_Err_Ok ) + goto Exit; + error = FT_Err_Ok; + } + + if ( !blend->coords ) + { + if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) ) + goto Exit; + + /* the first time we have to compute all design coordinates */ + all_design_coords = TRUE; + } + + if ( !blend->normalizedcoords ) + { + if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) ) + goto Exit; + + manageCvt = mcvt_modify; + + /* If we have not set the blend coordinates before this, then the */ + /* cvt table will still be what we read from the `cvt ' table and */ + /* we don't need to reload it. We may need to change it though... */ + } + else + { + FT_Bool have_diff = 0; + FT_UInt j; + FT_Fixed* c; + FT_Fixed* n; + + + manageCvt = mcvt_retain; + + for ( i = 0; i < num_coords; i++ ) + { + if ( blend->normalizedcoords[i] != coords[i] ) + { + manageCvt = mcvt_load; + have_diff = 1; + break; + } + } + + if ( !have_diff ) + { + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + { + FT_UInt instance_index = (FT_UInt)face->root.face_index >> 16; + + + c = blend->normalizedcoords + i; + n = blend->normalized_stylecoords + + ( instance_index - 1 ) * mmvar->num_axis + + i; + + for ( j = i; j < mmvar->num_axis; j++, n++, c++ ) + if ( *c != *n ) + have_diff = 1; + } + else + { + c = blend->normalizedcoords + i; + for ( j = i; j < mmvar->num_axis; j++, c++ ) + if ( *c != 0 ) + have_diff = 1; + } + } + + /* return value -1 indicates `no change' */ + if ( !have_diff ) + { + face->doblend = TRUE; + + return -1; + } + + for ( ; i < mmvar->num_axis; i++ ) + { + if ( blend->normalizedcoords[i] != 0 ) + { + manageCvt = mcvt_load; + break; + } + } + + /* If we don't change the blend coords then we don't need to do */ + /* anything to the cvt table. It will be correct. Otherwise we */ + /* no longer have the original cvt (it was modified when we set */ + /* the blend last time), so we must reload and then modify it. */ + } + + blend->num_axis = mmvar->num_axis; + if ( coords ) + FT_MEM_COPY( blend->normalizedcoords, + coords, + num_coords * sizeof ( FT_Fixed ) ); + + if ( set_design_coords ) + ft_var_to_design( face, + all_design_coords ? blend->num_axis : num_coords, + blend->normalizedcoords, + blend->coords ); + + face->doblend = TRUE; + + if ( face->cvt ) + { + switch ( manageCvt ) + { + case mcvt_load: + /* The cvt table has been loaded already; every time we change the */ + /* blend we may need to reload and remodify the cvt table. */ + FT_FREE( face->cvt ); + + error = tt_face_load_cvt( face, face->root.stream ); + break; + + case mcvt_modify: + /* The original cvt table is in memory. All we need to do is */ + /* apply the `cvar' table (if any). */ + error = tt_face_vary_cvt( face, face->root.stream ); + break; + + case mcvt_retain: + /* The cvt table is correct for this set of coordinates. */ + break; + } + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * TT_Set_MM_Blend + * + * @Description: + * Set the blend (normalized) coordinates for this instance of the + * font. Check that the `gvar' table is reasonable and does some + * initial preparation. + * + * @InOut: + * face :: + * The font. + * Initialize the blend structure with `gvar' data. + * + * @Input: + * num_coords :: + * The number of available coordinates. If it is + * larger than the number of axes, ignore the excess + * values. If it is smaller than the number of axes, + * use the default value (0) for the remaining axes. + * + * coords :: + * An array of `num_coords', each between [-1,1]. + * + * @Return: + * FreeType error code. 0 means success, -1 means success and unchanged + * axis values. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_MM_Blend( FT_Face face, /* TT_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + return tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 ); + } + + + /************************************************************************** + * + * @Function: + * TT_Get_MM_Blend + * + * @Description: + * Get the blend (normalized) coordinates for this instance of the + * font. + * + * @InOut: + * face :: + * The font. + * Initialize the blend structure with `gvar' data. + * + * @Input: + * num_coords :: + * The number of available coordinates. If it is + * larger than the number of axes, set the excess + * values to 0. + * + * coords :: + * An array of `num_coords', each between [-1,1]. + * + * @Return: + * FreeType error code. 0 means success, -1 means success and unchanged + * axis values. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Blend( FT_Face face, /* TT_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + TT_Face ttface = (TT_Face)face; + + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_UInt i, nc; + + + if ( !ttface->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + return error; + } + + blend = ttface->blend; + + if ( !blend->coords ) + { + /* select default instance coordinates */ + /* if no instance is selected yet */ + if ( FT_SET_ERROR( tt_set_mm_blend( ttface, 0, NULL, 1 ) ) ) + return error; + } + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "TT_Get_MM_Blend:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + if ( ttface->doblend ) + { + for ( i = 0; i < nc; i++ ) + coords[i] = blend->normalizedcoords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + coords[i] = 0; + } + + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * TT_Set_Var_Design + * + * @Description: + * Set the coordinates for the instance, measured in the user + * coordinate system. Parse the `avar' table (if present) to convert + * from user to normalized coordinates. + * + * @InOut: + * face :: + * The font face. + * Initialize the blend struct with `gvar' data. + * + * @Input: + * num_coords :: + * The number of available coordinates. If it is + * larger than the number of axes, ignore the excess + * values. If it is smaller than the number of axes, + * use the default values for the remaining axes. + * + * coords :: + * A coordinate array with `num_coords' elements. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Var_Design( FT_Face face, /* TT_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + TT_Face ttface = (TT_Face)face; + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + FT_Memory memory = FT_FACE_MEMORY( face ); + + FT_Fixed* c; + FT_Fixed* n; + FT_Fixed* normalized = NULL; + + FT_Bool have_diff = 0; + + + if ( !ttface->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + blend = ttface->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "TT_Set_Var_Design:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + if ( !blend->coords ) + { + if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) ) + goto Exit; + } + + c = blend->coords; + n = coords; + for ( i = 0; i < num_coords; i++, n++, c++ ) + { + if ( *c != *n ) + { + *c = *n; + have_diff = 1; + } + } + + if ( FT_IS_NAMED_INSTANCE( face ) ) + { + FT_UInt instance_index; + FT_Var_Named_Style* named_style; + + + instance_index = (FT_UInt)face->face_index >> 16; + named_style = mmvar->namedstyle + instance_index - 1; + + n = named_style->coords + num_coords; + for ( ; i < mmvar->num_axis; i++, n++, c++ ) + { + if ( *c != *n ) + { + *c = *n; + have_diff = 1; + } + } + } + else + { + FT_Var_Axis* a; + + + a = mmvar->axis + num_coords; + for ( ; i < mmvar->num_axis; i++, a++, c++ ) + { + if ( *c != a->def ) + { + *c = a->def; + have_diff = 1; + } + } + } + + /* return value -1 indicates `no change'; */ + /* we can exit early if `normalizedcoords' is already computed */ + if ( blend->normalizedcoords && !have_diff ) + return -1; + + if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) + goto Exit; + + if ( !ttface->blend->avar_loaded ) + ft_var_load_avar( ttface ); + + FT_TRACE5(( "TT_Set_Var_Design:\n" )); + FT_TRACE5(( " normalized design coordinates:\n" )); + ft_var_to_normalized( ttface, num_coords, blend->coords, normalized ); + + error = tt_set_mm_blend( ttface, mmvar->num_axis, normalized, 0 ); + if ( error ) + goto Exit; + + Exit: + FT_FREE( normalized ); + return error; + } + + + /************************************************************************** + * + * @Function: + * TT_Get_Var_Design + * + * @Description: + * Get the design coordinates of the currently selected interpolated + * font. + * + * @Input: + * face :: + * A handle to the source face. + * + * num_coords :: + * The number of design coordinates to retrieve. If it + * is larger than the number of axes, set the excess + * values to~0. + * + * @Output: + * coords :: + * The design coordinates array. + * + * @Return: + * FreeType error code. 0~means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_Var_Design( FT_Face face, /* TT_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + TT_Face ttface = (TT_Face)face; + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_UInt i, nc; + + + if ( !ttface->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + return error; + } + + blend = ttface->blend; + + if ( !blend->coords ) + { + /* select default instance coordinates */ + /* if no instance is selected yet */ + if ( FT_SET_ERROR( tt_set_mm_blend( ttface, 0, NULL, 1 ) ) ) + return error; + } + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "TT_Get_Var_Design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + if ( ttface->doblend ) + { + for ( i = 0; i < nc; i++ ) + coords[i] = blend->coords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + coords[i] = 0; + } + + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * TT_Set_Named_Instance + * + * @Description: + * Set the given named instance, also resetting any further + * variation. + * + * @Input: + * face :: + * A handle to the source face. + * + * instance_index :: + * The instance index, starting with value 1. + * Value 0 indicates to not use an instance. + * + * @Return: + * FreeType error code. 0~means success, -1 means success and unchanged + * axis values. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Named_Instance( FT_Face face, /* TT_Face */ + FT_UInt instance_index ) + { + TT_Face ttface = (TT_Face)face; + FT_Error error; + GX_Blend blend; + FT_MM_Var* mmvar; + + FT_Memory memory = FT_FACE_MEMORY( face ); + + FT_UInt num_instances; + + + if ( !ttface->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + blend = ttface->blend; + mmvar = blend->mmvar; + + num_instances = (FT_UInt)face->style_flags >> 16; + + /* `instance_index' starts with value 1, thus `>' */ + if ( instance_index > num_instances ) + { + error = FT_ERR( Invalid_Argument ); + goto Exit; + } + + if ( instance_index > 0 ) + { + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + + FT_Var_Named_Style* named_style; + FT_String* style_name; + + + named_style = mmvar->namedstyle + instance_index - 1; + + error = sfnt->get_name( ttface, + (FT_UShort)named_style->strid, + &style_name ); + if ( error ) + goto Exit; + + /* set (or replace) style name */ + FT_FREE( face->style_name ); + face->style_name = style_name; + + /* finally, select the named instance */ + error = TT_Set_Var_Design( face, + mmvar->num_axis, + named_style->coords ); + } + else + { + /* restore non-VF style name */ + FT_FREE( face->style_name ); + if ( FT_STRDUP( face->style_name, ttface->non_var_style_name ) ) + goto Exit; + error = TT_Set_Var_Design( face, 0, NULL ); + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * TT_Get_Default_Named_Instance + * + * @Description: + * Get the default named instance. + * + * @Input: + * face :: + * A handle to the source face. + * + * @Output: + * instance_index :: + * The default named instance index. + * + * @Return: + * FreeType error code. 0~means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ) + { + TT_Face ttface = (TT_Face)face; + FT_Error error = FT_Err_Ok; + + + if ( !ttface->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + *instance_index = ttface->var_default_named_instance; + + Exit: + return error; + } + + + /* This function triggers (lazy) recomputation of the `postscript_name` */ + /* field in `TT_Face`. */ + + FT_LOCAL_DEF( void ) + tt_construct_ps_name( FT_Face face ) + { + TT_Face ttface = (TT_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( ttface->postscript_name ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GX VAR PARSING ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + static FT_Error + tt_cvt_ready_iterator( FT_ListNode node, + void* user ) + { + TT_Size size = (TT_Size)node->data; + + FT_UNUSED( user ); + + + size->cvt_ready = -1; + + return FT_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + + + /************************************************************************** + * + * @Function: + * tt_face_vary_cvt + * + * @Description: + * Modify the loaded cvt table according to the `cvar' table and the + * font's blend. + * + * @InOut: + * face :: + * A handle to the target face object. + * + * @Input: + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + * + * Most errors are ignored. It is perfectly valid not to have a + * `cvar' table even if there is a `gvar' and `fvar' table. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + FT_Error error; + FT_Memory memory = stream->memory; + + FT_Face root = &face->root; + + FT_ULong table_start; + FT_ULong table_len; + + FT_UInt tupleCount; + FT_ULong offsetToData; + + FT_ULong here; + FT_UInt i, j; + + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + + GX_Blend blend = face->blend; + + FT_UInt point_count; + FT_UInt spoint_count = 0; + + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + + FT_Fixed* deltas = NULL; + FT_Fixed* cvt_deltas = NULL; + + + FT_TRACE2(( "CVAR " )); + + if ( !blend ) + { + FT_TRACE2(( "\n" )); + FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" )); + error = FT_Err_Ok; + goto Exit; + } + + if ( !face->cvt ) + { + FT_TRACE2(( "\n" )); + FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" )); + error = FT_Err_Ok; + goto Exit; + } + + error = face->goto_table( face, TTAG_cvar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + error = FT_Err_Ok; + goto Exit; + } + + if ( FT_FRAME_ENTER( table_len ) ) + { + error = FT_Err_Ok; + goto Exit; + } + + table_start = FT_Stream_FTell( stream ); + if ( FT_GET_LONG() != 0x00010000L ) + { + FT_TRACE2(( "bad table version\n" )); + + error = FT_Err_Ok; + goto FExit; + } + + FT_TRACE2(( "loaded\n" )); + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto FExit; + + tupleCount = FT_GET_USHORT(); + offsetToData = FT_GET_USHORT(); + + /* rough sanity test */ + if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 > + table_len ) + { + FT_TRACE2(( "tt_face_vary_cvt:" + " invalid CVT variation array header\n" )); + + error = FT_THROW( Invalid_Table ); + goto FExit; + } + + offsetToData += table_start; + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, + table_len, + &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "cvar: there %s %d tuple%s:\n", + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are", + tupleCount & GX_TC_TUPLE_COUNT_MASK, + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" )); + + if ( FT_NEW_ARRAY( cvt_deltas, face->cvt_size ) ) + goto FExit; + + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + FT_TRACE6(( " tuple %d:\n", i )); + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; j++ ) + tuple_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + FT_TRACE2(( "tt_face_vary_cvt:" + " invalid tuple index\n" )); + + error = FT_THROW( Invalid_Table ); + goto FExit; + } + else + { + if ( !blend->tuplecoords ) + { + FT_TRACE2(( "tt_face_vary_cvt:" + " no valid tuple coordinates available\n" )); + + error = FT_THROW( Invalid_Table ); + goto FExit; + } + + FT_MEM_COPY( + tuple_coords, + blend->tuplecoords + + ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis, + blend->num_axis * sizeof ( FT_Fixed ) ); + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; j++ ) + im_start_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); + for ( j = 0; j < blend->num_axis; j++ ) + im_end_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + localpoints = ft_var_readpackedpoints( stream, + table_len, + &point_count ); + points = localpoints; + } + else + { + localpoints = NULL; + points = sharedpoints; + point_count = spoint_count; + } + + deltas = ft_var_readpackeddeltas( stream, + table_len, + point_count == 0 ? face->cvt_size + : point_count ); + + if ( !points || !deltas ) + ; /* failure, ignore it */ + + else if ( localpoints == ALL_POINTS ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + FT_TRACE7(( " CVT deltas:\n" )); + + /* this means that there are deltas for every entry in cvt */ + for ( j = 0; j < face->cvt_size; j++ ) + { + FT_Fixed old_cvt_delta; + + + old_cvt_delta = cvt_deltas[j]; + cvt_deltas[j] = old_cvt_delta + FT_MulFix( deltas[j], apply ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( old_cvt_delta != cvt_deltas[j] ) + { + FT_TRACE7(( " %d: %f -> %f\n", + j, + (double)( FT_fdot6ToFixed( face->cvt[j] ) + + old_cvt_delta ) / 65536, + (double)( FT_fdot6ToFixed( face->cvt[j] ) + + cvt_deltas[j] ) / 65536 )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + else + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + FT_TRACE7(( " CVT deltas:\n" )); + + for ( j = 0; j < point_count; j++ ) + { + int pindex; + FT_Fixed old_cvt_delta; + + + pindex = points[j]; + if ( (FT_ULong)pindex >= face->cvt_size ) + continue; + + old_cvt_delta = cvt_deltas[pindex]; + cvt_deltas[pindex] = old_cvt_delta + FT_MulFix( deltas[j], apply ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( old_cvt_delta != cvt_deltas[pindex] ) + { + FT_TRACE7(( " %d: %f -> %f\n", + pindex, + (double)( FT_fdot6ToFixed( face->cvt[pindex] ) + + old_cvt_delta ) / 65536, + (double)( FT_fdot6ToFixed( face->cvt[pindex] ) + + cvt_deltas[pindex] ) / 65536 )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "\n" )); + + for ( i = 0; i < face->cvt_size; i++ ) + face->cvt[i] += FT_fixedToFdot6( cvt_deltas[i] ); + + FExit: + FT_FRAME_EXIT(); + + Exit: + if ( sharedpoints != ALL_POINTS ) + FT_FREE( sharedpoints ); + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + FT_FREE( cvt_deltas ); + + /* iterate over all FT_Size objects and set `cvt_ready' to -1 */ + /* to trigger rescaling of all CVT values */ + FT_List_Iterate( &root->sizes_list, + tt_cvt_ready_iterator, + NULL ); + + return error; + +#else /* !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif /* !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + } + + + /* Shift the original coordinates of all points between indices `p1' */ + /* and `p2', using the same difference as given by index `ref'. */ + + /* modeled after `af_iup_shift' */ + + static void + tt_delta_shift( int p1, + int p2, + int ref, + FT_Vector* in_points, + FT_Vector* out_points ) + { + int p; + FT_Vector delta; + + + delta.x = out_points[ref].x - in_points[ref].x; + delta.y = out_points[ref].y - in_points[ref].y; + + if ( delta.x == 0 && delta.y == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + { + out_points[p].x += delta.x; + out_points[p].y += delta.y; + } + + for ( p = ref + 1; p <= p2; p++ ) + { + out_points[p].x += delta.x; + out_points[p].y += delta.y; + } + } + + + /* Interpolate the original coordinates of all points with indices */ + /* between `p1' and `p2', using `ref1' and `ref2' as the reference */ + /* point indices. */ + + /* modeled after `af_iup_interp', `_iup_worker_interpolate', and */ + /* `Ins_IUP' with spec differences in handling ill-defined cases. */ + static void + tt_delta_interpolate( int p1, + int p2, + int ref1, + int ref2, + FT_Vector* in_points, + FT_Vector* out_points ) + { + int p, i; + + FT_Pos out, in1, in2, out1, out2, d1, d2; + + + if ( p1 > p2 ) + return; + + /* handle both horizontal and vertical coordinates */ + for ( i = 0; i <= 1; i++ ) + { + /* shift array pointers so that we can access `foo.y' as `foo.x' */ + in_points = (FT_Vector*)( (FT_Pos*)in_points + i ); + out_points = (FT_Vector*)( (FT_Pos*)out_points + i ); + + if ( in_points[ref1].x > in_points[ref2].x ) + { + p = ref1; + ref1 = ref2; + ref2 = p; + } + + in1 = in_points[ref1].x; + in2 = in_points[ref2].x; + out1 = out_points[ref1].x; + out2 = out_points[ref2].x; + d1 = out1 - in1; + d2 = out2 - in2; + + /* If the reference points have the same coordinate but different */ + /* delta, inferred delta is zero. Otherwise interpolate. */ + if ( in1 != in2 || out1 == out2 ) + { + FT_Fixed scale = in1 != in2 ? FT_DivFix( out2 - out1, in2 - in1 ) + : 0; + + + for ( p = p1; p <= p2; p++ ) + { + out = in_points[p].x; + + if ( out <= in1 ) + out += d1; + else if ( out >= in2 ) + out += d2; + else + out = out1 + FT_MulFix( out - in1, scale ); + + out_points[p].x = out; + } + } + } + } + + + /* Interpolate points without delta values, similar to */ + /* the `IUP' hinting instruction. */ + + /* modeled after `Ins_IUP */ + + static void + tt_interpolate_deltas( FT_Outline* outline, + FT_Vector* out_points, + FT_Vector* in_points, + FT_Bool* has_delta ) + { + FT_Int first_point; + FT_Int end_point; + + FT_Int first_delta; + FT_Int cur_delta; + + FT_Int point; + FT_Short contour; + + + /* ignore empty outlines */ + if ( !outline->n_contours ) + return; + + contour = 0; + point = 0; + + do + { + end_point = outline->contours[contour]; + first_point = point; + + /* search first point that has a delta */ + while ( point <= end_point && !has_delta[point] ) + point++; + + if ( point <= end_point ) + { + first_delta = point; + cur_delta = point; + + point++; + + while ( point <= end_point ) + { + /* search next point that has a delta */ + /* and interpolate intermediate points */ + if ( has_delta[point] ) + { + tt_delta_interpolate( cur_delta + 1, + point - 1, + cur_delta, + point, + in_points, + out_points ); + cur_delta = point; + } + + point++; + } + + /* shift contour if we only have a single delta */ + if ( cur_delta == first_delta ) + tt_delta_shift( first_point, + end_point, + cur_delta, + in_points, + out_points ); + else + { + /* otherwise handle remaining points */ + /* at the end and beginning of the contour */ + tt_delta_interpolate( cur_delta + 1, + end_point, + cur_delta, + first_delta, + in_points, + out_points ); + + if ( first_delta > 0 ) + tt_delta_interpolate( first_point, + first_delta - 1, + cur_delta, + first_delta, + in_points, + out_points ); + } + } + contour++; + + } while ( contour < outline->n_contours ); + } + + + /************************************************************************** + * + * @Function: + * TT_Vary_Apply_Glyph_Deltas + * + * @Description: + * Apply the appropriate deltas to the current glyph. + * + * @InOut: + * loader :: + * A handle to the loader object. + * + * outline :: + * The outline to change, with appended phantom points. + * + * @Output: + * unrounded :: + * An array with `n_points' elements that is filled with unrounded + * point coordinates (in 26.6 format). + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Vary_Apply_Glyph_Deltas( TT_Loader loader, + FT_Outline* outline, + FT_Vector* unrounded ) + { + FT_Error error; + TT_Face face = loader->face; + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + FT_UInt glyph_index = loader->glyph_index; + FT_UInt n_points = (FT_UInt)outline->n_points + 4; + + FT_Vector* points_org = NULL; /* coordinates in 16.16 format */ + FT_Vector* points_out = NULL; /* coordinates in 16.16 format */ + FT_Bool* has_delta = NULL; + + FT_ULong glyph_start; + + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong dataSize; + + FT_ULong here; + FT_UInt i, j; + + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + + GX_Blend blend = face->blend; + + FT_UInt point_count; + FT_UInt spoint_count = 0; + + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + + FT_Fixed* deltas_x = NULL; + FT_Fixed* deltas_y = NULL; + FT_Fixed* point_deltas_x = NULL; + FT_Fixed* point_deltas_y = NULL; + + + if ( !face->doblend || !blend ) + return FT_THROW( Invalid_Argument ); + + for ( i = 0; i < n_points; i++ ) + { + unrounded[i].x = INT_TO_F26DOT6( outline->points[i].x ); + unrounded[i].y = INT_TO_F26DOT6( outline->points[i].y ); + } + + if ( glyph_index >= blend->gv_glyphcnt || + blend->glyphoffsets[glyph_index] == + blend->glyphoffsets[glyph_index + 1] ) + { + FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" + " no variation data for glyph %d\n", glyph_index )); + return FT_Err_Ok; + } + + if ( FT_NEW_ARRAY( points_org, n_points ) || + FT_NEW_ARRAY( points_out, n_points ) || + FT_NEW_ARRAY( has_delta, n_points ) ) + goto Fail1; + + dataSize = blend->glyphoffsets[glyph_index + 1] - + blend->glyphoffsets[glyph_index]; + + if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || + FT_FRAME_ENTER( dataSize ) ) + goto Fail1; + + glyph_start = FT_Stream_FTell( stream ); + + /* each set of glyph variation data is formatted similarly to `cvar' */ + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto Fail2; + + tupleCount = FT_GET_USHORT(); + offsetToData = FT_GET_USHORT(); + + /* rough sanity test */ + if ( offsetToData > dataSize || + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 > dataSize ) + { + FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" + " invalid glyph variation array header\n" )); + + error = FT_THROW( Invalid_Table ); + goto Fail2; + } + + offsetToData += glyph_start; + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, + blend->gvar_size, + &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "gvar: there %s %d tuple%s:\n", + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are", + tupleCount & GX_TC_TUPLE_COUNT_MASK, + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" )); + + if ( FT_NEW_ARRAY( point_deltas_x, n_points ) || + FT_NEW_ARRAY( point_deltas_y, n_points ) ) + goto Fail3; + + for ( j = 0; j < n_points; j++ ) + { + points_org[j].x = FT_intToFixed( outline->points[j].x ); + points_org[j].y = FT_intToFixed( outline->points[j].y ); + } + + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + FT_TRACE6(( " tuple %d:\n", i )); + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; j++ ) + tuple_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" + " invalid tuple index\n" )); + + error = FT_THROW( Invalid_Table ); + goto Fail3; + } + else + FT_MEM_COPY( + tuple_coords, + blend->tuplecoords + + ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) * blend->num_axis, + blend->num_axis * sizeof ( FT_Fixed ) ); + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; j++ ) + im_start_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); + for ( j = 0; j < blend->num_axis; j++ ) + im_end_coords[j] = FT_fdot14ToFixed( FT_GET_SHORT() ); + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + localpoints = ft_var_readpackedpoints( stream, + blend->gvar_size, + &point_count ); + points = localpoints; + } + else + { + points = sharedpoints; + point_count = spoint_count; + } + + deltas_x = ft_var_readpackeddeltas( stream, + blend->gvar_size, + point_count == 0 ? n_points + : point_count ); + deltas_y = ft_var_readpackeddeltas( stream, + blend->gvar_size, + point_count == 0 ? n_points + : point_count ); + + if ( !points || !deltas_y || !deltas_x ) + ; /* failure, ignore it */ + + else if ( points == ALL_POINTS ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + FT_TRACE7(( " point deltas:\n" )); + + /* this means that there are deltas for every point in the glyph */ + for ( j = 0; j < n_points; j++ ) + { + FT_Fixed old_point_delta_x = point_deltas_x[j]; + FT_Fixed old_point_delta_y = point_deltas_y[j]; + + FT_Fixed point_delta_x = FT_MulFix( deltas_x[j], apply ); + FT_Fixed point_delta_y = FT_MulFix( deltas_y[j], apply ); + + + point_deltas_x[j] = old_point_delta_x + point_delta_x; + point_deltas_y[j] = old_point_delta_y + point_delta_y; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( point_delta_x || point_delta_y ) + { + FT_TRACE7(( " %d: (%f, %f) -> (%f, %f)\n", + j, + (double)( FT_intToFixed( outline->points[j].x ) + + old_point_delta_x ) / 65536, + (double)( FT_intToFixed( outline->points[j].y ) + + old_point_delta_y ) / 65536, + (double)( FT_intToFixed( outline->points[j].x ) + + point_deltas_x[j] ) / 65536, + (double)( FT_intToFixed( outline->points[j].y ) + + point_deltas_y[j] ) / 65536 )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + else + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + /* we have to interpolate the missing deltas similar to the */ + /* IUP bytecode instruction */ + for ( j = 0; j < n_points; j++ ) + { + has_delta[j] = FALSE; + points_out[j] = points_org[j]; + } + + for ( j = 0; j < point_count; j++ ) + { + FT_UShort idx = points[j]; + + + if ( idx >= n_points ) + continue; + + has_delta[idx] = TRUE; + + points_out[idx].x += FT_MulFix( deltas_x[j], apply ); + points_out[idx].y += FT_MulFix( deltas_y[j], apply ); + } + + /* no need to handle phantom points here, */ + /* since solitary points can't be interpolated */ + tt_interpolate_deltas( outline, + points_out, + points_org, + has_delta ); + + FT_TRACE7(( " point deltas:\n" )); + + for ( j = 0; j < n_points; j++ ) + { + FT_Fixed old_point_delta_x = point_deltas_x[j]; + FT_Fixed old_point_delta_y = point_deltas_y[j]; + + FT_Pos point_delta_x = points_out[j].x - points_org[j].x; + FT_Pos point_delta_y = points_out[j].y - points_org[j].y; + + + point_deltas_x[j] = old_point_delta_x + point_delta_x; + point_deltas_y[j] = old_point_delta_y + point_delta_y; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( point_delta_x || point_delta_y ) + { + FT_TRACE7(( " %d: (%f, %f) -> (%f, %f)\n", + j, + (double)( FT_intToFixed( outline->points[j].x ) + + old_point_delta_x ) / 65536, + (double)( FT_intToFixed( outline->points[j].y ) + + old_point_delta_y ) / 65536, + (double)( FT_intToFixed( outline->points[j].x ) + + point_deltas_x[j] ) / 65536, + (double)( FT_intToFixed( outline->points[j].y ) + + point_deltas_y[j] ) / 65536 )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas_x ); + FT_FREE( deltas_y ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "\n" )); + + /* To avoid double adjustment of advance width or height, */ + /* do not move phantom points if there is HVAR or VVAR */ + /* support, respectively. */ + if ( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) + { + point_deltas_x[n_points - 4] = 0; + point_deltas_y[n_points - 4] = 0; + point_deltas_x[n_points - 3] = 0; + point_deltas_y[n_points - 3] = 0; + } + if ( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) + { + point_deltas_x[n_points - 2] = 0; + point_deltas_y[n_points - 2] = 0; + point_deltas_x[n_points - 1] = 0; + point_deltas_y[n_points - 1] = 0; + } + + for ( i = 0; i < n_points; i++ ) + { + unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] ); + unrounded[i].y += FT_fixedToFdot6( point_deltas_y[i] ); + + outline->points[i].x += FT_fixedToInt( point_deltas_x[i] ); + outline->points[i].y += FT_fixedToInt( point_deltas_y[i] ); + } + + /* To avoid double adjustment of advance width or height, */ + /* adjust phantom points only if there is no HVAR or VVAR */ + /* support, respectively. */ + if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + { + loader->pp1 = outline->points[n_points - 4]; + loader->pp2 = outline->points[n_points - 3]; + loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x - + unrounded[n_points - 4].x ) / 64; + } + if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + { + loader->pp3 = outline->points[n_points - 2]; + loader->pp4 = outline->points[n_points - 1]; + loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].y - + unrounded[n_points - 2].y ) / 64; + } + + Fail3: + FT_FREE( point_deltas_x ); + FT_FREE( point_deltas_y ); + + Fail2: + if ( sharedpoints != ALL_POINTS ) + FT_FREE( sharedpoints ); + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + FT_FRAME_EXIT(); + + Fail1: + FT_FREE( points_org ); + FT_FREE( points_out ); + FT_FREE( has_delta ); + + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_get_var_blend + * + * @Description: + * An extended internal version of `TT_Get_MM_Blend' that returns + * pointers instead of copying data, without any initialization of + * the MM machinery in case it isn't loaded yet. + */ + FT_LOCAL_DEF( FT_Error ) + tt_get_var_blend( FT_Face face, /* TT_Face */ + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->blend ) + { + if ( num_coords ) + *num_coords = ttface->blend->num_axis; + if ( coords ) + *coords = ttface->blend->coords; + if ( normalizedcoords ) + *normalizedcoords = ttface->blend->normalizedcoords; + if ( mm_var ) + *mm_var = ttface->blend->mmvar; + } + else + { + if ( num_coords ) + *num_coords = 0; + if ( coords ) + *coords = NULL; + if ( mm_var ) + *mm_var = NULL; + } + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + tt_var_done_item_variation_store( FT_Face face, + GX_ItemVarStore itemStore ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_UInt i; + + + if ( itemStore->varData ) + { + for ( i = 0; i < itemStore->dataCount; i++ ) + { + FT_FREE( itemStore->varData[i].regionIndices ); + FT_FREE( itemStore->varData[i].deltaSet ); + } + + FT_FREE( itemStore->varData ); + } + + if ( itemStore->varRegionList ) + { + for ( i = 0; i < itemStore->regionCount; i++ ) + FT_FREE( itemStore->varRegionList[i].axisList ); + + FT_FREE( itemStore->varRegionList ); + } + } + + + FT_LOCAL_DEF( void ) + tt_var_done_delta_set_index_map( FT_Face face, + GX_DeltaSetIdxMap deltaSetIdxMap ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( deltaSetIdxMap->innerIndex ); + FT_FREE( deltaSetIdxMap->outerIndex ); + } + + + /************************************************************************** + * + * @Function: + * tt_done_blend + * + * @Description: + * Free the blend internal data structure. + */ + FT_LOCAL_DEF( void ) + tt_done_blend( FT_Face face ) + { + TT_Face ttface = (TT_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + GX_Blend blend = ttface->blend; + + + if ( blend ) + { + FT_UInt i, num_axes; + + + /* blend->num_axis might not be set up yet */ + num_axes = blend->mmvar->num_axis; + + FT_FREE( blend->coords ); + FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->normalized_stylecoords ); + FT_FREE( blend->mmvar ); + + if ( blend->avar_table ) + { + if ( blend->avar_table->avar_segment ) + { + for ( i = 0; i < num_axes; i++ ) + FT_FREE( blend->avar_table->avar_segment[i].correspondence ); + FT_FREE( blend->avar_table->avar_segment ); + } + + tt_var_done_item_variation_store( face, + &blend->avar_table->itemStore ); + + tt_var_done_delta_set_index_map( face, + &blend->avar_table->axisMap ); + + FT_FREE( blend->avar_table ); + } + + if ( blend->hvar_table ) + { + tt_var_done_item_variation_store( face, + &blend->hvar_table->itemStore ); + + tt_var_done_delta_set_index_map( face, + &blend->hvar_table->widthMap ); + FT_FREE( blend->hvar_table ); + } + + if ( blend->vvar_table ) + { + tt_var_done_item_variation_store( face, + &blend->vvar_table->itemStore ); + + tt_var_done_delta_set_index_map( face, + &blend->vvar_table->widthMap ); + FT_FREE( blend->vvar_table ); + } + + if ( blend->mvar_table ) + { + tt_var_done_item_variation_store( face, + &blend->mvar_table->itemStore ); + + FT_FREE( blend->mvar_table->values ); + FT_FREE( blend->mvar_table ); + } + + FT_FREE( blend->tuplecoords ); + FT_FREE( blend->glyphoffsets ); + FT_FREE( blend ); + } + } + +#else /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_gxvar_dummy_; + +#endif /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttgxvar.h b/external/freetype/src/truetype/ttgxvar.h new file mode 100644 index 000000000..e3da6d170 --- /dev/null +++ b/external/freetype/src/truetype/ttgxvar.h @@ -0,0 +1,453 @@ +/**************************************************************************** + * + * ttgxvar.h + * + * TrueType GX Font Variation loader (specification) + * + * Copyright (C) 2004-2023 by + * David Turner, Robert Wilhelm, Werner Lemberg and George Williams. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTGXVAR_H_ +#define TTGXVAR_H_ + + +#include <freetype/internal/ftmmtypes.h> +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /************************************************************************** + * + * @Struct: + * GX_AVarCorrespondenceRec + * + * @Description: + * A data structure representing `shortFracCorrespondence' in `avar' + * table according to the specifications from Apple. + */ + typedef struct GX_AVarCorrespondenceRec_ + { + FT_Fixed fromCoord; + FT_Fixed toCoord; + + } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; + + + /************************************************************************** + * + * @Struct: + * GX_AVarRec + * + * @Description: + * Data from the segment field of `avar' table. + * There is one of these for each axis. + */ + typedef struct GX_AVarSegmentRec_ + { + FT_UShort pairCount; + GX_AVarCorrespondence correspondence; /* array with pairCount entries */ + + } GX_AVarSegmentRec, *GX_AVarSegment; + + + /************************************************************************** + * + * @Struct: + * GX_AVarTableRec + * + * @Description: + * Data from the `avar' table. + */ + typedef struct GX_AVarTableRec_ + { + GX_AVarSegment avar_segment; /* avar_segment[num_axis] */ + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_DeltaSetIdxMapRec axisMap; /* Axis Mapping */ + + } GX_AVarTableRec, *GX_AVarTable; + + + /************************************************************************** + * + * @Struct: + * GX_HVVarTableRec + * + * @Description: + * Data from either the `HVAR' or `VVAR' table. + */ + typedef struct GX_HVVarTableRec_ + { + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_DeltaSetIdxMapRec widthMap; /* Advance Width Mapping */ + +#if 0 + GX_DeltaSetIdxMapRec lsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec rsbMap; /* not implemented */ + + GX_DeltaSetIdxMapRec tsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec bsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec vorgMap; /* not implemented */ +#endif + + } GX_HVVarTableRec, *GX_HVVarTable; + + +#define MVAR_TAG_GASP_0 FT_MAKE_TAG( 'g', 's', 'p', '0' ) +#define MVAR_TAG_GASP_1 FT_MAKE_TAG( 'g', 's', 'p', '1' ) +#define MVAR_TAG_GASP_2 FT_MAKE_TAG( 'g', 's', 'p', '2' ) +#define MVAR_TAG_GASP_3 FT_MAKE_TAG( 'g', 's', 'p', '3' ) +#define MVAR_TAG_GASP_4 FT_MAKE_TAG( 'g', 's', 'p', '4' ) +#define MVAR_TAG_GASP_5 FT_MAKE_TAG( 'g', 's', 'p', '5' ) +#define MVAR_TAG_GASP_6 FT_MAKE_TAG( 'g', 's', 'p', '6' ) +#define MVAR_TAG_GASP_7 FT_MAKE_TAG( 'g', 's', 'p', '7' ) +#define MVAR_TAG_GASP_8 FT_MAKE_TAG( 'g', 's', 'p', '8' ) +#define MVAR_TAG_GASP_9 FT_MAKE_TAG( 'g', 's', 'p', '9' ) + +#define MVAR_TAG_CPHT FT_MAKE_TAG( 'c', 'p', 'h', 't' ) +#define MVAR_TAG_HASC FT_MAKE_TAG( 'h', 'a', 's', 'c' ) +#define MVAR_TAG_HCLA FT_MAKE_TAG( 'h', 'c', 'l', 'a' ) +#define MVAR_TAG_HCLD FT_MAKE_TAG( 'h', 'c', 'l', 'd' ) +#define MVAR_TAG_HCOF FT_MAKE_TAG( 'h', 'c', 'o', 'f' ) +#define MVAR_TAG_HCRN FT_MAKE_TAG( 'h', 'c', 'r', 'n' ) +#define MVAR_TAG_HCRS FT_MAKE_TAG( 'h', 'c', 'r', 's' ) +#define MVAR_TAG_HDSC FT_MAKE_TAG( 'h', 'd', 's', 'c' ) +#define MVAR_TAG_HLGP FT_MAKE_TAG( 'h', 'l', 'g', 'p' ) +#define MVAR_TAG_SBXO FT_MAKE_TAG( 's', 'b', 'x', 'o' ) +#define MVAR_TAG_SBXS FT_MAKE_TAG( 's', 'b', 'x', 's' ) +#define MVAR_TAG_SBYO FT_MAKE_TAG( 's', 'b', 'y', 'o' ) +#define MVAR_TAG_SBYS FT_MAKE_TAG( 's', 'b', 'y', 's' ) +#define MVAR_TAG_SPXO FT_MAKE_TAG( 's', 'p', 'x', 'o' ) +#define MVAR_TAG_SPXS FT_MAKE_TAG( 's', 'p', 'x', 's' ) +#define MVAR_TAG_SPYO FT_MAKE_TAG( 's', 'p', 'y', 'o' ) +#define MVAR_TAG_SPYS FT_MAKE_TAG( 's', 'p', 'y', 's' ) +#define MVAR_TAG_STRO FT_MAKE_TAG( 's', 't', 'r', 'o' ) +#define MVAR_TAG_STRS FT_MAKE_TAG( 's', 't', 'r', 's' ) +#define MVAR_TAG_UNDO FT_MAKE_TAG( 'u', 'n', 'd', 'o' ) +#define MVAR_TAG_UNDS FT_MAKE_TAG( 'u', 'n', 'd', 's' ) +#define MVAR_TAG_VASC FT_MAKE_TAG( 'v', 'a', 's', 'c' ) +#define MVAR_TAG_VCOF FT_MAKE_TAG( 'v', 'c', 'o', 'f' ) +#define MVAR_TAG_VCRN FT_MAKE_TAG( 'v', 'c', 'r', 'n' ) +#define MVAR_TAG_VCRS FT_MAKE_TAG( 'v', 'c', 'r', 's' ) +#define MVAR_TAG_VDSC FT_MAKE_TAG( 'v', 'd', 's', 'c' ) +#define MVAR_TAG_VLGP FT_MAKE_TAG( 'v', 'l', 'g', 'p' ) +#define MVAR_TAG_XHGT FT_MAKE_TAG( 'x', 'h', 'g', 't' ) + + + typedef struct GX_ValueRec_ + { + FT_ULong tag; + FT_UShort outerIndex; + FT_UShort innerIndex; + + FT_Short unmodified; /* values are either FT_Short or FT_UShort */ + + } GX_ValueRec, *GX_Value; + + + /************************************************************************** + * + * @Struct: + * GX_MVarTableRec + * + * @Description: + * Data from the `MVAR' table. + */ + typedef struct GX_MVarTableRec_ + { + FT_UShort valueCount; + + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_Value values; /* Value Records */ + + } GX_MVarTableRec, *GX_MVarTable; + + + /************************************************************************** + * + * @Struct: + * GX_BlendRec + * + * @Description: + * Data for interpolating a font from a distortable font specified + * by the GX *var tables ([fgcahvm]var). + * + * @Fields: + * num_axis :: + * The number of axes along which interpolation may happen. + * + * coords :: + * An array of design coordinates (in user space) indicating the + * contribution along each axis to the final interpolated font. + * `normalizedcoords' holds the same values. + * + * normalizedcoords :: + * An array of normalized values (between [-1,1]) indicating the + * contribution along each axis to the final interpolated font. + * `coords' holds the same values. + * + * mmvar :: + * Data from the `fvar' table. + * + * mmvar_len :: + * The length of the `mmvar' structure. + * + * normalized_stylecoords :: + * A two-dimensional array that holds the named instance data from + * `mmvar' as normalized values. + * + * avar_loaded :: + * A Boolean; if set, FreeType tried to load (and parse) the `avar' + * table. + * + * avar_table :: + * Data from the `avar' table. + * + * hvar_loaded :: + * A Boolean; if set, FreeType tried to load (and parse) the `hvar' + * table. + * + * hvar_checked :: + * A Boolean; if set, FreeType successfully loaded and parsed the + * `hvar' table. + * + * hvar_error :: + * If loading and parsing of the `hvar' table failed, this field + * holds the corresponding error code. + * + * hvar_table :: + * Data from the `hvar' table. + * + * vvar_loaded :: + * A Boolean; if set, FreeType tried to load (and parse) the `vvar' + * table. + * + * vvar_checked :: + * A Boolean; if set, FreeType successfully loaded and parsed the + * `vvar' table. + * + * vvar_error :: + * If loading and parsing of the `vvar' table failed, this field + * holds the corresponding error code. + * + * vvar_table :: + * Data from the `vvar' table. + * + * mvar_table :: + * Data from the `mvar' table. + * + * tuplecount :: + * The number of shared tuples in the `gvar' table. + * + * tuplecoords :: + * A two-dimensional array that holds the shared tuple coordinates + * in the `gvar' table. + * + * gv_glyphcnt :: + * The number of glyphs handled in the `gvar' table. + * + * glyphoffsets :: + * Offsets into the glyph variation data array. + * + * gvar_size :: + * The size of the `gvar' table. + */ + typedef struct GX_BlendRec_ + { + FT_UInt num_axis; + FT_Fixed* coords; + FT_Fixed* normalizedcoords; + + FT_MM_Var* mmvar; + FT_Offset mmvar_len; + + FT_Fixed* normalized_stylecoords; + /* normalized_stylecoords[num_namedstyles][num_axis] */ + + FT_Bool avar_loaded; + GX_AVarTable avar_table; + + FT_Bool hvar_loaded; + FT_Bool hvar_checked; + FT_Error hvar_error; + GX_HVVarTable hvar_table; + + FT_Bool vvar_loaded; + FT_Bool vvar_checked; + FT_Error vvar_error; + GX_HVVarTable vvar_table; + + GX_MVarTable mvar_table; + + FT_UInt tuplecount; + FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ + + FT_UInt gv_glyphcnt; + FT_ULong* glyphoffsets; /* glyphoffsets[gv_glyphcnt + 1] */ + + FT_ULong gvar_size; + + } GX_BlendRec; + + + /************************************************************************** + * + * @enum: + * GX_TupleCountFlags + * + * @Description: + * Flags used within the `TupleCount' field of the `gvar' table. + */ + typedef enum GX_TupleCountFlags_ + { + GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, + GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, + GX_TC_TUPLE_COUNT_MASK = 0x0FFF + + } GX_TupleCountFlags; + + + /************************************************************************** + * + * @enum: + * GX_TupleIndexFlags + * + * @Description: + * Flags used within the `TupleIndex' field of the `gvar' and `cvar' + * tables. + */ + typedef enum GX_TupleIndexFlags_ + { + GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, + GX_TI_INTERMEDIATE_TUPLE = 0x4000, + GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, + GX_TI_RESERVED_TUPLE_FLAG = 0x1000, + GX_TI_TUPLE_INDEX_MASK = 0x0FFF + + } GX_TupleIndexFlags; + + +#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) +#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) +#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) +#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) +#define TTAG_ital FT_MAKE_TAG( 'i', 't', 'a', 'l' ) + + + FT_LOCAL( FT_Error ) + TT_Set_MM_Blend( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Blend( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Var_Design( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Var( FT_Face face, + FT_MM_Var* *master ); + + FT_LOCAL( FT_Error ) + TT_Get_Var_Design( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ); + + FT_LOCAL( FT_Error ) + TT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ); + + FT_LOCAL( void ) + tt_construct_ps_name( FT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + TT_Vary_Apply_Glyph_Deltas( TT_Loader loader, + FT_Outline* outline, + FT_Vector* unrounded ); + + FT_LOCAL( FT_Error ) + tt_hadvance_adjust( FT_Face face, + FT_UInt gindex, + FT_Int *adelta ); + + FT_LOCAL( FT_Error ) + tt_vadvance_adjust( FT_Face face, + FT_UInt gindex, + FT_Int *adelta ); + + FT_LOCAL( void ) + tt_apply_mvar( FT_Face face ); + + FT_LOCAL( FT_Error ) + tt_var_load_item_variation_store( FT_Face face, + FT_ULong offset, + GX_ItemVarStore itemStore ); + + FT_LOCAL( FT_Error ) + tt_var_load_delta_set_index_mapping( FT_Face face, + FT_ULong offset, + GX_DeltaSetIdxMap map, + GX_ItemVarStore itemStore, + FT_ULong table_len ); + + FT_LOCAL( FT_ItemVarDelta ) + tt_var_get_item_delta( FT_Face face, + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ); + + FT_LOCAL( void ) + tt_var_done_item_variation_store( FT_Face face, + GX_ItemVarStore itemStore ); + + FT_LOCAL( void ) + tt_var_done_delta_set_index_map( FT_Face face, + GX_DeltaSetIdxMap deltaSetIdxMap ); + + + FT_LOCAL( FT_Error ) + tt_get_var_blend( FT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + FT_LOCAL( void ) + tt_done_blend( FT_Face face ); + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +FT_END_HEADER + + +#endif /* TTGXVAR_H_ */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttinterp.c b/external/freetype/src/truetype/ttinterp.c new file mode 100644 index 000000000..79df4555d --- /dev/null +++ b/external/freetype/src/truetype/ttinterp.c @@ -0,0 +1,7753 @@ +/**************************************************************************** + * + * ttinterp.c + * + * TrueType bytecode interpreter (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */ +/* issues; many thanks! */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/fttrigon.h> +#include <freetype/ftsystem.h> +#include <freetype/ftdriver.h> +#include <freetype/ftmm.h> + +#include "ttinterp.h" +#include "tterrors.h" +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttinterp + + +#define NO_SUBPIXEL_HINTING \ + ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ + TT_INTERPRETER_VERSION_35 ) + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#define SUBPIXEL_HINTING_MINIMAL \ + ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ + TT_INTERPRETER_VERSION_40 ) +#endif + +#define PROJECT( v1, v2 ) \ + exc->func_project( exc, \ + SUB_LONG( (v1)->x, (v2)->x ), \ + SUB_LONG( (v1)->y, (v2)->y ) ) + +#define DUALPROJ( v1, v2 ) \ + exc->func_dualproj( exc, \ + SUB_LONG( (v1)->x, (v2)->x ), \ + SUB_LONG( (v1)->y, (v2)->y ) ) + +#define FAST_PROJECT( v ) \ + exc->func_project( exc, (v)->x, (v)->y ) + +#define FAST_DUALPROJ( v ) \ + exc->func_dualproj( exc, (v)->x, (v)->y ) + + + /************************************************************************** + * + * Two simple bounds-checking macros. + */ +#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) +#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) + + +#undef SUCCESS +#define SUCCESS 0 + +#undef FAILURE +#define FAILURE 1 + + + /************************************************************************** + * + * CODERANGE FUNCTIONS + * + */ + + + /************************************************************************** + * + * @Function: + * TT_Goto_CodeRange + * + * @Description: + * Switches to a new code range (updates the code related elements in + * `exec', and `IP'). + * + * @Input: + * range :: + * The new execution code range. + * + * IP :: + * The new IP in the new code range. + * + * @InOut: + * exec :: + * The target execution context. + */ + FT_LOCAL_DEF( void ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ) + { + TT_CodeRange* coderange; + + + FT_ASSERT( range >= 1 && range <= 3 ); + + coderange = &exec->codeRangeTable[range - 1]; + + FT_ASSERT( coderange->base ); + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for IP <= Size instead of IP < Size. */ + /* */ + FT_ASSERT( IP <= coderange->size ); + + exec->code = coderange->base; + exec->codeSize = coderange->size; + exec->IP = IP; + exec->curRange = range; + } + + + /************************************************************************** + * + * @Function: + * TT_Set_CodeRange + * + * @Description: + * Sets a code range. + * + * @Input: + * range :: + * The code range index. + * + * base :: + * The new code base. + * + * length :: + * The range size in bytes. + * + * @InOut: + * exec :: + * The target execution context. + */ + FT_LOCAL_DEF( void ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = (FT_Byte*)base; + exec->codeRangeTable[range - 1].size = length; + } + + + /************************************************************************** + * + * @Function: + * TT_Clear_CodeRange + * + * @Description: + * Clears a code range. + * + * @Input: + * range :: + * The code range index. + * + * @InOut: + * exec :: + * The target execution context. + */ + FT_LOCAL_DEF( void ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = NULL; + exec->codeRangeTable[range - 1].size = 0; + } + + + /************************************************************************** + * + * EXECUTION CONTEXT ROUTINES + * + */ + + + /************************************************************************** + * + * @Function: + * TT_Done_Context + * + * @Description: + * Destroys a given context. + * + * @Input: + * exec :: + * A handle to the target execution context. + * + * memory :: + * A handle to the parent memory object. + * + * @Note: + * Only the glyph loader and debugger should call this function. + */ + FT_LOCAL_DEF( void ) + TT_Done_Context( TT_ExecContext exec ) + { + FT_Memory memory = exec->memory; + + + /* points zone */ + exec->maxPoints = 0; + exec->maxContours = 0; + + /* free stack */ + FT_FREE( exec->stack ); + exec->stackSize = 0; + + /* free glyf cvt working area */ + FT_FREE( exec->glyfCvt ); + exec->glyfCvtSize = 0; + + /* free glyf storage working area */ + FT_FREE( exec->glyfStorage ); + exec->glyfStoreSize = 0; + + /* free call stack */ + FT_FREE( exec->callStack ); + exec->callSize = 0; + exec->callTop = 0; + + /* free glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->size = NULL; + exec->face = NULL; + + FT_FREE( exec ); + } + + + /************************************************************************** + * + * @Function: + * TT_Load_Context + * + * @Description: + * Prepare an execution context for glyph hinting. + * + * @Input: + * face :: + * A handle to the source face object. + * + * size :: + * A handle to the source size object. + * + * @InOut: + * exec :: + * A handle to the target execution context. + * + * @Return: + * FreeType error code. 0 means success. + * + * @Note: + * Only the glyph loader and debugger should call this function. + * + * Note that not all members of `TT_ExecContext` get initialized. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ) + { + FT_Int i; + TT_MaxProfile* maxp; + FT_Error error; + FT_Memory memory = exec->memory; + + + exec->face = face; + maxp = &face->max_profile; + exec->size = size; + + if ( size ) + { + exec->numFDefs = size->num_function_defs; + exec->maxFDefs = size->max_function_defs; + exec->numIDefs = size->num_instruction_defs; + exec->maxIDefs = size->max_instruction_defs; + exec->FDefs = size->function_defs; + exec->IDefs = size->instruction_defs; + exec->pointSize = size->point_size; + exec->tt_metrics = size->ttmetrics; + exec->metrics = *size->metrics; + + exec->maxFunc = size->max_func; + exec->maxIns = size->max_ins; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + exec->codeRangeTable[i] = size->codeRangeTable[i]; + + /* set graphics state */ + exec->GS = size->GS; + + exec->cvtSize = size->cvt_size; + exec->cvt = size->cvt; + + exec->storeSize = size->storage_size; + exec->storage = size->storage; + + exec->twilight = size->twilight; + + /* In case of multi-threading it can happen that the old size object */ + /* no longer exists, thus we must clear all glyph zone references. */ + FT_ZERO( &exec->zp0 ); + exec->zp1 = exec->zp0; + exec->zp2 = exec->zp0; + } + + /* XXX: We reserve a little more elements on the stack to deal safely */ + /* with broken fonts like arialbs, courbs, timesbs, etc. */ + if ( FT_QRENEW_ARRAY( exec->stack, + exec->stackSize, + maxp->maxStackElements + 32 ) ) + return error; + exec->stackSize = maxp->maxStackElements + 32; + + /* free previous glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->pts.n_points = 0; + exec->pts.n_contours = 0; + + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + exec->zp0 = exec->pts; + + exec->instruction_trap = FALSE; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * TT_Save_Context + * + * @Description: + * Saves the code ranges in a `size' object. + * + * @Input: + * exec :: + * A handle to the source execution context. + * + * @InOut: + * size :: + * A handle to the target size object. + * + * @Note: + * Only the glyph loader and debugger should call this function. + */ + FT_LOCAL_DEF( void ) + TT_Save_Context( TT_ExecContext exec, + TT_Size size ) + { + FT_Int i; + + + /* XXX: Will probably disappear soon with all the code range */ + /* management, which is now rather obsolete. */ + /* */ + size->num_function_defs = exec->numFDefs; + size->num_instruction_defs = exec->numIDefs; + + size->max_func = exec->maxFunc; + size->max_ins = exec->maxIns; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + size->codeRangeTable[i] = exec->codeRangeTable[i]; + } + + + /************************************************************************** + * + * @Function: + * TT_Run_Context + * + * @Description: + * Executes one or more instructions in the execution context. + * + * @Input: + * exec :: + * A handle to the target execution context. + * + * @Return: + * TrueType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Run_Context( TT_ExecContext exec ) + { + TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ); + + exec->zp0 = exec->pts; + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0000; + + exec->GS.freeVector = exec->GS.projVector; + exec->GS.dualVector = exec->GS.projVector; + + exec->GS.round_state = 1; + exec->GS.loop = 1; + + /* some glyphs leave something on the stack. so we clean it */ + /* before a new execution. */ + exec->top = 0; + exec->callTop = 0; + + return exec->face->interpreter( exec ); + } + + + /* The default value for `scan_control' is documented as FALSE in the */ + /* TrueType specification. This is confusing since it implies a */ + /* Boolean value. However, this is not the case, thus both the */ + /* default values of our `scan_type' and `scan_control' fields (which */ + /* the documentation's `scan_control' variable is split into) are */ + /* zero. */ + + const TT_GraphicsState tt_default_graphics_state = + { + 0, 0, 0, + { 0x4000, 0 }, + { 0x4000, 0 }, + { 0x4000, 0 }, + + 1, 64, 1, + TRUE, 68, 0, 0, 9, 3, + 0, FALSE, 0, 1, 1, 1 + }; + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( TT_ExecContext ) + TT_New_Context( TT_Driver driver ) + { + FT_Memory memory; + FT_Error error; + + TT_ExecContext exec = NULL; + + + if ( !driver ) + goto Fail; + + memory = driver->root.root.memory; + + /* allocate object and zero everything inside */ + if ( FT_NEW( exec ) ) + goto Fail; + + /* create callStack here, other allocations delayed */ + exec->memory = memory; + exec->callSize = 32; + + if ( FT_QNEW_ARRAY( exec->callStack, exec->callSize ) ) + FT_FREE( exec ); + + Fail: + return exec; + } + + + /************************************************************************** + * + * Before an opcode is executed, the interpreter verifies that there are + * enough arguments on the stack, with the help of the `Pop_Push_Count' + * table. + * + * For each opcode, the first column gives the number of arguments that + * are popped from the stack; the second one gives the number of those + * that are pushed in result. + * + * Opcodes which have a varying number of parameters in the data stream + * (NPUSHB, NPUSHW) are handled specially; they have a negative value in + * the `opcode_length' table, and the value in `Pop_Push_Count' is set + * to zero. + * + */ + + +#undef PACK +#define PACK( x, y ) ( ( x << 4 ) | y ) + + + static + const FT_Byte Pop_Push_Count[256] = + { + /* opcodes are gathered in groups of 16 */ + /* please keep the spaces as they are */ + + /* 0x00 */ + /* SVTCA[0] */ PACK( 0, 0 ), + /* SVTCA[1] */ PACK( 0, 0 ), + /* SPVTCA[0] */ PACK( 0, 0 ), + /* SPVTCA[1] */ PACK( 0, 0 ), + /* SFVTCA[0] */ PACK( 0, 0 ), + /* SFVTCA[1] */ PACK( 0, 0 ), + /* SPVTL[0] */ PACK( 2, 0 ), + /* SPVTL[1] */ PACK( 2, 0 ), + /* SFVTL[0] */ PACK( 2, 0 ), + /* SFVTL[1] */ PACK( 2, 0 ), + /* SPVFS */ PACK( 2, 0 ), + /* SFVFS */ PACK( 2, 0 ), + /* GPV */ PACK( 0, 2 ), + /* GFV */ PACK( 0, 2 ), + /* SFVTPV */ PACK( 0, 0 ), + /* ISECT */ PACK( 5, 0 ), + + /* 0x10 */ + /* SRP0 */ PACK( 1, 0 ), + /* SRP1 */ PACK( 1, 0 ), + /* SRP2 */ PACK( 1, 0 ), + /* SZP0 */ PACK( 1, 0 ), + /* SZP1 */ PACK( 1, 0 ), + /* SZP2 */ PACK( 1, 0 ), + /* SZPS */ PACK( 1, 0 ), + /* SLOOP */ PACK( 1, 0 ), + /* RTG */ PACK( 0, 0 ), + /* RTHG */ PACK( 0, 0 ), + /* SMD */ PACK( 1, 0 ), + /* ELSE */ PACK( 0, 0 ), + /* JMPR */ PACK( 1, 0 ), + /* SCVTCI */ PACK( 1, 0 ), + /* SSWCI */ PACK( 1, 0 ), + /* SSW */ PACK( 1, 0 ), + + /* 0x20 */ + /* DUP */ PACK( 1, 2 ), + /* POP */ PACK( 1, 0 ), + /* CLEAR */ PACK( 0, 0 ), + /* SWAP */ PACK( 2, 2 ), + /* DEPTH */ PACK( 0, 1 ), + /* CINDEX */ PACK( 1, 1 ), + /* MINDEX */ PACK( 1, 0 ), + /* ALIGNPTS */ PACK( 2, 0 ), + /* INS_$28 */ PACK( 0, 0 ), + /* UTP */ PACK( 1, 0 ), + /* LOOPCALL */ PACK( 2, 0 ), + /* CALL */ PACK( 1, 0 ), + /* FDEF */ PACK( 1, 0 ), + /* ENDF */ PACK( 0, 0 ), + /* MDAP[0] */ PACK( 1, 0 ), + /* MDAP[1] */ PACK( 1, 0 ), + + /* 0x30 */ + /* IUP[0] */ PACK( 0, 0 ), + /* IUP[1] */ PACK( 0, 0 ), + /* SHP[0] */ PACK( 0, 0 ), /* loops */ + /* SHP[1] */ PACK( 0, 0 ), /* loops */ + /* SHC[0] */ PACK( 1, 0 ), + /* SHC[1] */ PACK( 1, 0 ), + /* SHZ[0] */ PACK( 1, 0 ), + /* SHZ[1] */ PACK( 1, 0 ), + /* SHPIX */ PACK( 1, 0 ), /* loops */ + /* IP */ PACK( 0, 0 ), /* loops */ + /* MSIRP[0] */ PACK( 2, 0 ), + /* MSIRP[1] */ PACK( 2, 0 ), + /* ALIGNRP */ PACK( 0, 0 ), /* loops */ + /* RTDG */ PACK( 0, 0 ), + /* MIAP[0] */ PACK( 2, 0 ), + /* MIAP[1] */ PACK( 2, 0 ), + + /* 0x40 */ + /* NPUSHB */ PACK( 0, 0 ), + /* NPUSHW */ PACK( 0, 0 ), + /* WS */ PACK( 2, 0 ), + /* RS */ PACK( 1, 1 ), + /* WCVTP */ PACK( 2, 0 ), + /* RCVT */ PACK( 1, 1 ), + /* GC[0] */ PACK( 1, 1 ), + /* GC[1] */ PACK( 1, 1 ), + /* SCFS */ PACK( 2, 0 ), + /* MD[0] */ PACK( 2, 1 ), + /* MD[1] */ PACK( 2, 1 ), + /* MPPEM */ PACK( 0, 1 ), + /* MPS */ PACK( 0, 1 ), + /* FLIPON */ PACK( 0, 0 ), + /* FLIPOFF */ PACK( 0, 0 ), + /* DEBUG */ PACK( 1, 0 ), + + /* 0x50 */ + /* LT */ PACK( 2, 1 ), + /* LTEQ */ PACK( 2, 1 ), + /* GT */ PACK( 2, 1 ), + /* GTEQ */ PACK( 2, 1 ), + /* EQ */ PACK( 2, 1 ), + /* NEQ */ PACK( 2, 1 ), + /* ODD */ PACK( 1, 1 ), + /* EVEN */ PACK( 1, 1 ), + /* IF */ PACK( 1, 0 ), + /* EIF */ PACK( 0, 0 ), + /* AND */ PACK( 2, 1 ), + /* OR */ PACK( 2, 1 ), + /* NOT */ PACK( 1, 1 ), + /* DELTAP1 */ PACK( 1, 0 ), + /* SDB */ PACK( 1, 0 ), + /* SDS */ PACK( 1, 0 ), + + /* 0x60 */ + /* ADD */ PACK( 2, 1 ), + /* SUB */ PACK( 2, 1 ), + /* DIV */ PACK( 2, 1 ), + /* MUL */ PACK( 2, 1 ), + /* ABS */ PACK( 1, 1 ), + /* NEG */ PACK( 1, 1 ), + /* FLOOR */ PACK( 1, 1 ), + /* CEILING */ PACK( 1, 1 ), + /* ROUND[0] */ PACK( 1, 1 ), + /* ROUND[1] */ PACK( 1, 1 ), + /* ROUND[2] */ PACK( 1, 1 ), + /* ROUND[3] */ PACK( 1, 1 ), + /* NROUND[0] */ PACK( 1, 1 ), + /* NROUND[1] */ PACK( 1, 1 ), + /* NROUND[2] */ PACK( 1, 1 ), + /* NROUND[3] */ PACK( 1, 1 ), + + /* 0x70 */ + /* WCVTF */ PACK( 2, 0 ), + /* DELTAP2 */ PACK( 1, 0 ), + /* DELTAP3 */ PACK( 1, 0 ), + /* DELTAC1 */ PACK( 1, 0 ), + /* DELTAC2 */ PACK( 1, 0 ), + /* DELTAC3 */ PACK( 1, 0 ), + /* SROUND */ PACK( 1, 0 ), + /* S45ROUND */ PACK( 1, 0 ), + /* JROT */ PACK( 2, 0 ), + /* JROF */ PACK( 2, 0 ), + /* ROFF */ PACK( 0, 0 ), + /* INS_$7B */ PACK( 0, 0 ), + /* RUTG */ PACK( 0, 0 ), + /* RDTG */ PACK( 0, 0 ), + /* SANGW */ PACK( 1, 0 ), + /* AA */ PACK( 1, 0 ), + + /* 0x80 */ + /* FLIPPT */ PACK( 0, 0 ), /* loops */ + /* FLIPRGON */ PACK( 2, 0 ), + /* FLIPRGOFF */ PACK( 2, 0 ), + /* INS_$83 */ PACK( 0, 0 ), + /* INS_$84 */ PACK( 0, 0 ), + /* SCANCTRL */ PACK( 1, 0 ), + /* SDPVTL[0] */ PACK( 2, 0 ), + /* SDPVTL[1] */ PACK( 2, 0 ), + /* GETINFO */ PACK( 1, 1 ), + /* IDEF */ PACK( 1, 0 ), + /* ROLL */ PACK( 3, 3 ), + /* MAX */ PACK( 2, 1 ), + /* MIN */ PACK( 2, 1 ), + /* SCANTYPE */ PACK( 1, 0 ), + /* INSTCTRL */ PACK( 2, 0 ), + /* INS_$8F */ PACK( 0, 0 ), + + /* 0x90 */ + /* INS_$90 */ PACK( 0, 0 ), + /* GETVAR */ PACK( 0, 0 ), /* will be handled specially */ + /* GETDATA */ PACK( 0, 1 ), + /* INS_$93 */ PACK( 0, 0 ), + /* INS_$94 */ PACK( 0, 0 ), + /* INS_$95 */ PACK( 0, 0 ), + /* INS_$96 */ PACK( 0, 0 ), + /* INS_$97 */ PACK( 0, 0 ), + /* INS_$98 */ PACK( 0, 0 ), + /* INS_$99 */ PACK( 0, 0 ), + /* INS_$9A */ PACK( 0, 0 ), + /* INS_$9B */ PACK( 0, 0 ), + /* INS_$9C */ PACK( 0, 0 ), + /* INS_$9D */ PACK( 0, 0 ), + /* INS_$9E */ PACK( 0, 0 ), + /* INS_$9F */ PACK( 0, 0 ), + + /* 0xA0 */ + /* INS_$A0 */ PACK( 0, 0 ), + /* INS_$A1 */ PACK( 0, 0 ), + /* INS_$A2 */ PACK( 0, 0 ), + /* INS_$A3 */ PACK( 0, 0 ), + /* INS_$A4 */ PACK( 0, 0 ), + /* INS_$A5 */ PACK( 0, 0 ), + /* INS_$A6 */ PACK( 0, 0 ), + /* INS_$A7 */ PACK( 0, 0 ), + /* INS_$A8 */ PACK( 0, 0 ), + /* INS_$A9 */ PACK( 0, 0 ), + /* INS_$AA */ PACK( 0, 0 ), + /* INS_$AB */ PACK( 0, 0 ), + /* INS_$AC */ PACK( 0, 0 ), + /* INS_$AD */ PACK( 0, 0 ), + /* INS_$AE */ PACK( 0, 0 ), + /* INS_$AF */ PACK( 0, 0 ), + + /* 0xB0 */ + /* PUSHB[0] */ PACK( 0, 1 ), + /* PUSHB[1] */ PACK( 0, 2 ), + /* PUSHB[2] */ PACK( 0, 3 ), + /* PUSHB[3] */ PACK( 0, 4 ), + /* PUSHB[4] */ PACK( 0, 5 ), + /* PUSHB[5] */ PACK( 0, 6 ), + /* PUSHB[6] */ PACK( 0, 7 ), + /* PUSHB[7] */ PACK( 0, 8 ), + /* PUSHW[0] */ PACK( 0, 1 ), + /* PUSHW[1] */ PACK( 0, 2 ), + /* PUSHW[2] */ PACK( 0, 3 ), + /* PUSHW[3] */ PACK( 0, 4 ), + /* PUSHW[4] */ PACK( 0, 5 ), + /* PUSHW[5] */ PACK( 0, 6 ), + /* PUSHW[6] */ PACK( 0, 7 ), + /* PUSHW[7] */ PACK( 0, 8 ), + + /* 0xC0 */ + /* MDRP[00] */ PACK( 1, 0 ), + /* MDRP[01] */ PACK( 1, 0 ), + /* MDRP[02] */ PACK( 1, 0 ), + /* MDRP[03] */ PACK( 1, 0 ), + /* MDRP[04] */ PACK( 1, 0 ), + /* MDRP[05] */ PACK( 1, 0 ), + /* MDRP[06] */ PACK( 1, 0 ), + /* MDRP[07] */ PACK( 1, 0 ), + /* MDRP[08] */ PACK( 1, 0 ), + /* MDRP[09] */ PACK( 1, 0 ), + /* MDRP[10] */ PACK( 1, 0 ), + /* MDRP[11] */ PACK( 1, 0 ), + /* MDRP[12] */ PACK( 1, 0 ), + /* MDRP[13] */ PACK( 1, 0 ), + /* MDRP[14] */ PACK( 1, 0 ), + /* MDRP[15] */ PACK( 1, 0 ), + + /* 0xD0 */ + /* MDRP[16] */ PACK( 1, 0 ), + /* MDRP[17] */ PACK( 1, 0 ), + /* MDRP[18] */ PACK( 1, 0 ), + /* MDRP[19] */ PACK( 1, 0 ), + /* MDRP[20] */ PACK( 1, 0 ), + /* MDRP[21] */ PACK( 1, 0 ), + /* MDRP[22] */ PACK( 1, 0 ), + /* MDRP[23] */ PACK( 1, 0 ), + /* MDRP[24] */ PACK( 1, 0 ), + /* MDRP[25] */ PACK( 1, 0 ), + /* MDRP[26] */ PACK( 1, 0 ), + /* MDRP[27] */ PACK( 1, 0 ), + /* MDRP[28] */ PACK( 1, 0 ), + /* MDRP[29] */ PACK( 1, 0 ), + /* MDRP[30] */ PACK( 1, 0 ), + /* MDRP[31] */ PACK( 1, 0 ), + + /* 0xE0 */ + /* MIRP[00] */ PACK( 2, 0 ), + /* MIRP[01] */ PACK( 2, 0 ), + /* MIRP[02] */ PACK( 2, 0 ), + /* MIRP[03] */ PACK( 2, 0 ), + /* MIRP[04] */ PACK( 2, 0 ), + /* MIRP[05] */ PACK( 2, 0 ), + /* MIRP[06] */ PACK( 2, 0 ), + /* MIRP[07] */ PACK( 2, 0 ), + /* MIRP[08] */ PACK( 2, 0 ), + /* MIRP[09] */ PACK( 2, 0 ), + /* MIRP[10] */ PACK( 2, 0 ), + /* MIRP[11] */ PACK( 2, 0 ), + /* MIRP[12] */ PACK( 2, 0 ), + /* MIRP[13] */ PACK( 2, 0 ), + /* MIRP[14] */ PACK( 2, 0 ), + /* MIRP[15] */ PACK( 2, 0 ), + + /* 0xF0 */ + /* MIRP[16] */ PACK( 2, 0 ), + /* MIRP[17] */ PACK( 2, 0 ), + /* MIRP[18] */ PACK( 2, 0 ), + /* MIRP[19] */ PACK( 2, 0 ), + /* MIRP[20] */ PACK( 2, 0 ), + /* MIRP[21] */ PACK( 2, 0 ), + /* MIRP[22] */ PACK( 2, 0 ), + /* MIRP[23] */ PACK( 2, 0 ), + /* MIRP[24] */ PACK( 2, 0 ), + /* MIRP[25] */ PACK( 2, 0 ), + /* MIRP[26] */ PACK( 2, 0 ), + /* MIRP[27] */ PACK( 2, 0 ), + /* MIRP[28] */ PACK( 2, 0 ), + /* MIRP[29] */ PACK( 2, 0 ), + /* MIRP[30] */ PACK( 2, 0 ), + /* MIRP[31] */ PACK( 2, 0 ) + }; + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* the first hex digit gives the length of the opcode name; the space */ + /* after the digit is here just to increase readability of the source */ + /* code */ + + static + const char* const opcode_name[256] = + { + /* 0x00 */ + "8 SVTCA[y]", + "8 SVTCA[x]", + "9 SPVTCA[y]", + "9 SPVTCA[x]", + "9 SFVTCA[y]", + "9 SFVTCA[x]", + "9 SPVTL[||]", + "8 SPVTL[+]", + "9 SFVTL[||]", + "8 SFVTL[+]", + "5 SPVFS", + "5 SFVFS", + "3 GPV", + "3 GFV", + "6 SFVTPV", + "5 ISECT", + + /* 0x10 */ + "4 SRP0", + "4 SRP1", + "4 SRP2", + "4 SZP0", + "4 SZP1", + "4 SZP2", + "4 SZPS", + "5 SLOOP", + "3 RTG", + "4 RTHG", + "3 SMD", + "4 ELSE", + "4 JMPR", + "6 SCVTCI", + "5 SSWCI", + "3 SSW", + + /* 0x20 */ + "3 DUP", + "3 POP", + "5 CLEAR", + "4 SWAP", + "5 DEPTH", + "6 CINDEX", + "6 MINDEX", + "8 ALIGNPTS", + "7 INS_$28", + "3 UTP", + "8 LOOPCALL", + "4 CALL", + "4 FDEF", + "4 ENDF", + "6 MDAP[]", + "9 MDAP[rnd]", + + /* 0x30 */ + "6 IUP[y]", + "6 IUP[x]", + "8 SHP[rp2]", + "8 SHP[rp1]", + "8 SHC[rp2]", + "8 SHC[rp1]", + "8 SHZ[rp2]", + "8 SHZ[rp1]", + "5 SHPIX", + "2 IP", + "7 MSIRP[]", + "A MSIRP[rp0]", + "7 ALIGNRP", + "4 RTDG", + "6 MIAP[]", + "9 MIAP[rnd]", + + /* 0x40 */ + "6 NPUSHB", + "6 NPUSHW", + "2 WS", + "2 RS", + "5 WCVTP", + "4 RCVT", + "8 GC[curr]", + "8 GC[orig]", + "4 SCFS", + "8 MD[curr]", + "8 MD[orig]", + "5 MPPEM", + "3 MPS", + "6 FLIPON", + "7 FLIPOFF", + "5 DEBUG", + + /* 0x50 */ + "2 LT", + "4 LTEQ", + "2 GT", + "4 GTEQ", + "2 EQ", + "3 NEQ", + "3 ODD", + "4 EVEN", + "2 IF", + "3 EIF", + "3 AND", + "2 OR", + "3 NOT", + "7 DELTAP1", + "3 SDB", + "3 SDS", + + /* 0x60 */ + "3 ADD", + "3 SUB", + "3 DIV", + "3 MUL", + "3 ABS", + "3 NEG", + "5 FLOOR", + "7 CEILING", + "8 ROUND[G]", + "8 ROUND[B]", + "8 ROUND[W]", + "7 ROUND[]", + "9 NROUND[G]", + "9 NROUND[B]", + "9 NROUND[W]", + "8 NROUND[]", + + /* 0x70 */ + "5 WCVTF", + "7 DELTAP2", + "7 DELTAP3", + "7 DELTAC1", + "7 DELTAC2", + "7 DELTAC3", + "6 SROUND", + "8 S45ROUND", + "4 JROT", + "4 JROF", + "4 ROFF", + "7 INS_$7B", + "4 RUTG", + "4 RDTG", + "5 SANGW", + "2 AA", + + /* 0x80 */ + "6 FLIPPT", + "8 FLIPRGON", + "9 FLIPRGOFF", + "7 INS_$83", + "7 INS_$84", + "8 SCANCTRL", + "A SDPVTL[||]", + "9 SDPVTL[+]", + "7 GETINFO", + "4 IDEF", + "4 ROLL", + "3 MAX", + "3 MIN", + "8 SCANTYPE", + "8 INSTCTRL", + "7 INS_$8F", + + /* 0x90 */ + "7 INS_$90", +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + "C GETVARIATION", + "7 GETDATA", +#else + "7 INS_$91", + "7 INS_$92", +#endif + "7 INS_$93", + "7 INS_$94", + "7 INS_$95", + "7 INS_$96", + "7 INS_$97", + "7 INS_$98", + "7 INS_$99", + "7 INS_$9A", + "7 INS_$9B", + "7 INS_$9C", + "7 INS_$9D", + "7 INS_$9E", + "7 INS_$9F", + + /* 0xA0 */ + "7 INS_$A0", + "7 INS_$A1", + "7 INS_$A2", + "7 INS_$A3", + "7 INS_$A4", + "7 INS_$A5", + "7 INS_$A6", + "7 INS_$A7", + "7 INS_$A8", + "7 INS_$A9", + "7 INS_$AA", + "7 INS_$AB", + "7 INS_$AC", + "7 INS_$AD", + "7 INS_$AE", + "7 INS_$AF", + + /* 0xB0 */ + "8 PUSHB[0]", + "8 PUSHB[1]", + "8 PUSHB[2]", + "8 PUSHB[3]", + "8 PUSHB[4]", + "8 PUSHB[5]", + "8 PUSHB[6]", + "8 PUSHB[7]", + "8 PUSHW[0]", + "8 PUSHW[1]", + "8 PUSHW[2]", + "8 PUSHW[3]", + "8 PUSHW[4]", + "8 PUSHW[5]", + "8 PUSHW[6]", + "8 PUSHW[7]", + + /* 0xC0 */ + "7 MDRP[G]", + "7 MDRP[B]", + "7 MDRP[W]", + "6 MDRP[]", + "8 MDRP[rG]", + "8 MDRP[rB]", + "8 MDRP[rW]", + "7 MDRP[r]", + "8 MDRP[mG]", + "8 MDRP[mB]", + "8 MDRP[mW]", + "7 MDRP[m]", + "9 MDRP[mrG]", + "9 MDRP[mrB]", + "9 MDRP[mrW]", + "8 MDRP[mr]", + + /* 0xD0 */ + "8 MDRP[pG]", + "8 MDRP[pB]", + "8 MDRP[pW]", + "7 MDRP[p]", + "9 MDRP[prG]", + "9 MDRP[prB]", + "9 MDRP[prW]", + "8 MDRP[pr]", + "9 MDRP[pmG]", + "9 MDRP[pmB]", + "9 MDRP[pmW]", + "8 MDRP[pm]", + "A MDRP[pmrG]", + "A MDRP[pmrB]", + "A MDRP[pmrW]", + "9 MDRP[pmr]", + + /* 0xE0 */ + "7 MIRP[G]", + "7 MIRP[B]", + "7 MIRP[W]", + "6 MIRP[]", + "8 MIRP[rG]", + "8 MIRP[rB]", + "8 MIRP[rW]", + "7 MIRP[r]", + "8 MIRP[mG]", + "8 MIRP[mB]", + "8 MIRP[mW]", + "7 MIRP[m]", + "9 MIRP[mrG]", + "9 MIRP[mrB]", + "9 MIRP[mrW]", + "8 MIRP[mr]", + + /* 0xF0 */ + "8 MIRP[pG]", + "8 MIRP[pB]", + "8 MIRP[pW]", + "7 MIRP[p]", + "9 MIRP[prG]", + "9 MIRP[prB]", + "9 MIRP[prW]", + "8 MIRP[pr]", + "9 MIRP[pmG]", + "9 MIRP[pmB]", + "9 MIRP[pmW]", + "8 MIRP[pm]", + "A MIRP[pmrG]", + "A MIRP[pmrB]", + "A MIRP[pmrW]", + "9 MIRP[pmr]" + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + static + const FT_Char opcode_length[256] = + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + +#undef PACK + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + +#if defined( __arm__ ) && \ + ( defined( __thumb2__ ) || !defined( __thumb__ ) ) + +#define TT_MulFix14 TT_MulFix14_arm + + static FT_Int32 + TT_MulFix14_arm( FT_Int32 a, + FT_Int b ) + { + FT_Int32 t, t2; + + +#if defined( __CC_ARM ) || defined( __ARMCC__ ) + + __asm + { + smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ + mov a, t, asr #31 /* a = (hi >> 31) */ + add a, a, #0x2000 /* a += 0x2000 */ + adds t2, t2, a /* t2 += a */ + adc t, t, #0 /* t += carry */ + mov a, t2, lsr #14 /* a = t2 >> 14 */ + orr a, a, t, lsl #18 /* a |= t << 18 */ + } + +#elif defined( __GNUC__ ) + + __asm__ __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ +#if defined( __clang__ ) && defined( __thumb2__ ) + "add.w %0, %0, #0x2000\n\t" /* %0 += 0x2000 */ +#else + "add %0, %0, #0x2000\n\t" /* %0 += 0x2000 */ +#endif + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #14\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #18\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) + : "cc" ); + +#endif + + return a; + } + +#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#if defined( __GNUC__ ) && \ + ( defined( __i386__ ) || defined( __x86_64__ ) ) + +#define TT_MulFix14 TT_MulFix14_long_long + + /* Temporarily disable the warning that C90 doesn't support `long long'. */ +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic push +#endif +#pragma GCC diagnostic ignored "-Wlong-long" + + /* This is declared `noinline' because inlining the function results */ + /* in slower code. The `pure' attribute indicates that the result */ + /* only depends on the parameters. */ + static __attribute__(( noinline )) + __attribute__(( pure )) FT_Int32 + TT_MulFix14_long_long( FT_Int32 a, + FT_Int b ) + { + + long long ret = (long long)a * b; + + /* The following line assumes that right shifting of signed values */ + /* will actually preserve the sign bit. The exact behaviour is */ + /* undefined, but this is true on x86 and x86_64. */ + long long tmp = ret >> 63; + + + ret += 0x2000 + tmp; + + return (FT_Int32)( ret >> 14 ); + } + +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic pop +#endif + +#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */ + + +#ifndef TT_MulFix14 + + /* Compute (a*b)/2^14 with maximum accuracy and rounding. */ + /* This is optimized to be faster than calling FT_MulFix() */ + /* for platforms where sizeof(int) == 2. */ + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 sign; + FT_UInt32 ah, al, mid, lo, hi; + + + sign = a ^ b; + + if ( a < 0 ) + a = -a; + if ( b < 0 ) + b = -b; + + ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); + al = (FT_UInt32)( a & 0xFFFFU ); + + lo = al * b; + mid = ah * b; + hi = mid >> 16; + mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ + lo += mid; + if ( lo < mid ) + hi += 1; + + mid = ( lo >> 14 ) | ( hi << 18 ); + + return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; + } + +#endif /* !TT_MulFix14 */ + + +#if defined( __GNUC__ ) && \ + ( defined( __i386__ ) || \ + defined( __x86_64__ ) || \ + defined( __arm__ ) ) + +#define TT_DotFix14 TT_DotFix14_long_long + +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic push +#endif +#pragma GCC diagnostic ignored "-Wlong-long" + + static __attribute__(( pure )) FT_Int32 + TT_DotFix14_long_long( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + /* Temporarily disable the warning that C90 doesn't support */ + /* `long long'. */ + + long long temp1 = (long long)ax * bx; + long long temp2 = (long long)ay * by; + + + temp1 += temp2; + temp2 = temp1 >> 63; + temp1 += 0x2000 + temp2; + + return (FT_Int32)( temp1 >> 14 ); + + } + +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic pop +#endif + +#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */ + + +#ifndef TT_DotFix14 + + /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */ + static FT_Int32 + TT_DotFix14( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + FT_Int32 m, s, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); + m = ( ax >> 16 ) * bx; + + lo1 = l + ( (FT_UInt32)m << 16 ); + hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); + + /* compute ay*by as 64-bit value */ + l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); + m = ( ay >> 16 ) * by; + + lo2 = l + ( (FT_UInt32)m << 16 ); + hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); + + /* add them */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += ( l < lo ); + + return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) ); + } + +#endif /* TT_DotFix14 */ + + + /************************************************************************** + * + * @Function: + * Current_Ratio + * + * @Description: + * Returns the current aspect ratio scaling factor depending on the + * projection vector's state and device resolutions. + * + * @Return: + * The aspect ratio in 16.16 format, always <= 1.0 . + */ + static FT_Long + Current_Ratio( TT_ExecContext exc ) + { + if ( !exc->tt_metrics.ratio ) + { + if ( exc->GS.projVector.y == 0 ) + exc->tt_metrics.ratio = exc->tt_metrics.x_ratio; + + else if ( exc->GS.projVector.x == 0 ) + exc->tt_metrics.ratio = exc->tt_metrics.y_ratio; + + else + { + FT_F26Dot6 x, y; + + + x = TT_MulFix14( exc->tt_metrics.x_ratio, + exc->GS.projVector.x ); + y = TT_MulFix14( exc->tt_metrics.y_ratio, + exc->GS.projVector.y ); + exc->tt_metrics.ratio = FT_Hypot( x, y ); + } + } + return exc->tt_metrics.ratio; + } + + + FT_CALLBACK_DEF( FT_Long ) + Current_Ppem( TT_ExecContext exc ) + { + return exc->tt_metrics.ppem; + } + + + FT_CALLBACK_DEF( FT_Long ) + Current_Ppem_Stretched( TT_ExecContext exc ) + { + return FT_MulFix( exc->tt_metrics.ppem, Current_Ratio( exc ) ); + } + + + /************************************************************************** + * + * Functions related to the control value table (CVT). + * + */ + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT( TT_ExecContext exc, + FT_ULong idx ) + { + return exc->cvt[idx]; + } + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT_Stretched( TT_ExecContext exc, + FT_ULong idx ) + { + return FT_MulFix( exc->cvt[idx], Current_Ratio( exc ) ); + } + + + static void + Modify_CVT_Check( TT_ExecContext exc ) + { + if ( exc->iniRange == tt_coderange_glyph && + exc->cvt != exc->glyfCvt ) + { + FT_Memory memory = exc->memory; + FT_Error error; + + + FT_MEM_QRENEW_ARRAY( exc->glyfCvt, exc->glyfCvtSize, exc->cvtSize ); + exc->error = error; + if ( error ) + return; + + exc->glyfCvtSize = exc->cvtSize; + FT_ARRAY_COPY( exc->glyfCvt, exc->cvt, exc->glyfCvtSize ); + exc->cvt = exc->glyfCvt; + } + } + + + FT_CALLBACK_DEF( void ) + Write_CVT( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + Modify_CVT_Check( exc ); + if ( exc->error ) + return; + + exc->cvt[idx] = value; + } + + + FT_CALLBACK_DEF( void ) + Write_CVT_Stretched( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + Modify_CVT_Check( exc ); + if ( exc->error ) + return; + + exc->cvt[idx] = FT_DivFix( value, Current_Ratio( exc ) ); + } + + + FT_CALLBACK_DEF( void ) + Move_CVT( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + Modify_CVT_Check( exc ); + if ( exc->error ) + return; + + exc->cvt[idx] = ADD_LONG( exc->cvt[idx], value ); + } + + + FT_CALLBACK_DEF( void ) + Move_CVT_Stretched( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + Modify_CVT_Check( exc ); + if ( exc->error ) + return; + + exc->cvt[idx] = ADD_LONG( exc->cvt[idx], + FT_DivFix( value, Current_Ratio( exc ) ) ); + } + + + /************************************************************************** + * + * @Function: + * GetShortIns + * + * @Description: + * Returns a short integer taken from the instruction stream at + * address IP. + * + * @Return: + * Short read at code[IP]. + * + * @Note: + * This one could become a macro. + */ + static FT_Short + GetShortIns( TT_ExecContext exc ) + { + /* Reading a byte stream so there is no endianness (DaveP) */ + exc->IP += 2; + return (FT_Short)( ( exc->code[exc->IP - 2] << 8 ) + + exc->code[exc->IP - 1] ); + } + + + /************************************************************************** + * + * @Function: + * Ins_Goto_CodeRange + * + * @Description: + * Goes to a certain code range in the instruction stream. + * + * @Input: + * aRange :: + * The index of the code range. + * + * aIP :: + * The new IP address in the code range. + * + * @Return: + * SUCCESS or FAILURE. + */ + static FT_Bool + Ins_Goto_CodeRange( TT_ExecContext exc, + FT_Int aRange, + FT_Long aIP ) + { + TT_CodeRange* range; + + + if ( aRange < 1 || aRange > 3 ) + { + exc->error = FT_THROW( Bad_Argument ); + return FAILURE; + } + + range = &exc->codeRangeTable[aRange - 1]; + + if ( !range->base ) /* invalid coderange */ + { + exc->error = FT_THROW( Invalid_CodeRange ); + return FAILURE; + } + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for aIP <= Size, instead of aIP < Size. */ + + if ( aIP > range->size ) + { + exc->error = FT_THROW( Code_Overflow ); + return FAILURE; + } + + exc->code = range->base; + exc->codeSize = range->size; + exc->IP = aIP; + exc->curRange = aRange; + + return SUCCESS; + } + + + /* + * + * Apple's TrueType specification at + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM02/Chap2.html#order + * + * gives the following order of operations in instructions that move + * points. + * + * - check single width cut-in (MIRP, MDRP) + * + * - check control value cut-in (MIRP, MIAP) + * + * - apply engine compensation (MIRP, MDRP) + * + * - round distance (MIRP, MDRP) or value (MIAP, MDAP) + * + * - check minimum distance (MIRP,MDRP) + * + * - move point (MIRP, MDRP, MIAP, MSIRP, MDAP) + * + * For rounding instructions, engine compensation happens before rounding. + * + */ + + + /************************************************************************** + * + * @Function: + * Direct_Move + * + * @Description: + * Moves a point by a given distance along the freedom vector. The + * point will be `touched'. + * + * @Input: + * point :: + * The index of the point to move. + * + * distance :: + * The distance to apply. + * + * @InOut: + * zone :: + * The affected glyph zone. + * + * @Note: + * See `ttinterp.h' for details on backward compatibility mode. + * `Touches' the point. + */ + static void + Direct_Move( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + + v = exc->GS.freeVector.x; + + if ( v != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Exception to the post-IUP curfew: Allow the x component of */ + /* diagonal moves, but only post-IUP. DejaVu tries to adjust */ + /* diagonal stems like on `Z' and `z' post-IUP. */ + if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + else +#endif + + if ( NO_SUBPIXEL_HINTING ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + v = exc->GS.freeVector.y; + + if ( v != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) ) +#endif + zone->cur[point].y = ADD_LONG( zone->cur[point].y, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /************************************************************************** + * + * @Function: + * Direct_Move_Orig + * + * @Description: + * Moves the *original* position of a point by a given distance along + * the freedom vector. Obviously, the point will not be `touched'. + * + * @Input: + * point :: + * The index of the point to move. + * + * distance :: + * The distance to apply. + * + * @InOut: + * zone :: + * The affected glyph zone. + */ + static void + Direct_Move_Orig( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + + v = exc->GS.freeVector.x; + + if ( v != 0 ) + zone->org[point].x = ADD_LONG( zone->org[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + + v = exc->GS.freeVector.y; + + if ( v != 0 ) + zone->org[point].y = ADD_LONG( zone->org[point].y, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + } + + + /************************************************************************** + * + * Special versions of Direct_Move() + * + * The following versions are used whenever both vectors are both + * along one of the coordinate unit vectors, i.e. in 90% of the cases. + * See `ttinterp.h' for details on backward compatibility mode. + * + */ + + + static void + Direct_Move_X( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); + else +#endif + + if ( NO_SUBPIXEL_HINTING ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + + static void + Direct_Move_Y( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED( exc ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && exc->iupy_called ) ) +#endif + zone->cur[point].y = ADD_LONG( zone->cur[point].y, distance ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + + + /************************************************************************** + * + * Special versions of Direct_Move_Orig() + * + * The following versions are used whenever both vectors are both + * along one of the coordinate unit vectors, i.e. in 90% of the cases. + * + */ + + + static void + Direct_Move_Orig_X( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED( exc ); + + zone->org[point].x = ADD_LONG( zone->org[point].x, distance ); + } + + + static void + Direct_Move_Orig_Y( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED( exc ); + + zone->org[point].y = ADD_LONG( zone->org[point].y, distance ); + } + + /************************************************************************** + * + * @Function: + * Round_None + * + * @Description: + * Does not round, but adds engine compensation. + * + * @Input: + * distance :: + * The distance (not) to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * The compensated distance. + */ + static FT_F26Dot6 + Round_None( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ADD_LONG( distance, compensation ); + if ( val < 0 ) + val = 0; + } + else + { + val = SUB_LONG( distance, compensation ); + if ( val > 0 ) + val = 0; + } + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_To_Grid + * + * @Description: + * Rounds value to grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + */ + static FT_F26Dot6 + Round_To_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = FT_PIX_ROUND_LONG( ADD_LONG( distance, compensation ) ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PIX_ROUND_LONG( SUB_LONG( compensation, + distance ) ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_To_Half_Grid + * + * @Description: + * Rounds value to half grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + */ + static FT_F26Dot6 + Round_To_Half_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ADD_LONG( FT_PIX_FLOOR( ADD_LONG( distance, compensation ) ), + 32 ); + if ( val < 0 ) + val = 32; + } + else + { + val = NEG_LONG( ADD_LONG( FT_PIX_FLOOR( SUB_LONG( compensation, + distance ) ), + 32 ) ); + if ( val > 0 ) + val = -32; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_Down_To_Grid + * + * @Description: + * Rounds value down to grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + */ + static FT_F26Dot6 + Round_Down_To_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = FT_PIX_FLOOR( ADD_LONG( distance, compensation ) ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PIX_FLOOR( SUB_LONG( compensation, distance ) ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_Up_To_Grid + * + * @Description: + * Rounds value up to grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + */ + static FT_F26Dot6 + Round_Up_To_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = FT_PIX_CEIL_LONG( ADD_LONG( distance, compensation ) ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PIX_CEIL_LONG( SUB_LONG( compensation, + distance ) ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_To_Double_Grid + * + * @Description: + * Rounds value to double grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + */ + static FT_F26Dot6 + Round_To_Double_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = FT_PAD_ROUND_LONG( ADD_LONG( distance, compensation ), 32 ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PAD_ROUND_LONG( SUB_LONG( compensation, distance ), + 32 ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_Super + * + * @Description: + * Super-rounds value to grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + * + * @Note: + * The TrueType specification says very little about the relationship + * between rounding and engine compensation. However, it seems from + * the description of super round that we should add the compensation + * before rounding. + */ + static FT_F26Dot6 + Round_Super( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ADD_LONG( distance, + exc->threshold - exc->phase + compensation ) & + -exc->period; + val = ADD_LONG( val, exc->phase ); + if ( val < 0 ) + val = exc->phase; + } + else + { + val = NEG_LONG( SUB_LONG( exc->threshold - exc->phase + compensation, + distance ) & + -exc->period ); + val = SUB_LONG( val, exc->phase ); + if ( val > 0 ) + val = -exc->phase; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Round_Super_45 + * + * @Description: + * Super-rounds value to grid after adding engine compensation. + * + * @Input: + * distance :: + * The distance to round. + * + * color :: + * The engine compensation color. + * + * @Return: + * Rounded distance. + * + * @Note: + * There is a separate function for Round_Super_45() as we may need + * greater precision. + */ + static FT_F26Dot6 + Round_Super_45( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ) + { + FT_F26Dot6 compensation = exc->tt_metrics.compensations[color]; + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( ADD_LONG( distance, + exc->threshold - exc->phase + compensation ) / + exc->period ) * exc->period; + val = ADD_LONG( val, exc->phase ); + if ( val < 0 ) + val = exc->phase; + } + else + { + val = NEG_LONG( ( SUB_LONG( exc->threshold - exc->phase + compensation, + distance ) / + exc->period ) * exc->period ); + val = SUB_LONG( val, exc->phase ); + if ( val > 0 ) + val = -exc->phase; + } + + return val; + } + + + /************************************************************************** + * + * @Function: + * Compute_Round + * + * @Description: + * Sets the rounding mode. + * + * @Input: + * round_mode :: + * The rounding mode to be used. + */ + static void + Compute_Round( TT_ExecContext exc, + FT_Byte round_mode ) + { + switch ( round_mode ) + { + case TT_Round_Off: + exc->func_round = (TT_Round_Func)Round_None; + break; + + case TT_Round_To_Grid: + exc->func_round = (TT_Round_Func)Round_To_Grid; + break; + + case TT_Round_Up_To_Grid: + exc->func_round = (TT_Round_Func)Round_Up_To_Grid; + break; + + case TT_Round_Down_To_Grid: + exc->func_round = (TT_Round_Func)Round_Down_To_Grid; + break; + + case TT_Round_To_Half_Grid: + exc->func_round = (TT_Round_Func)Round_To_Half_Grid; + break; + + case TT_Round_To_Double_Grid: + exc->func_round = (TT_Round_Func)Round_To_Double_Grid; + break; + + case TT_Round_Super: + exc->func_round = (TT_Round_Func)Round_Super; + break; + + case TT_Round_Super_45: + exc->func_round = (TT_Round_Func)Round_Super_45; + break; + } + } + + + /************************************************************************** + * + * @Function: + * SetSuperRound + * + * @Description: + * Sets Super Round parameters. + * + * @Input: + * GridPeriod :: + * The grid period. + * + * selector :: + * The SROUND opcode. + */ + static void + SetSuperRound( TT_ExecContext exc, + FT_F2Dot14 GridPeriod, + FT_Long selector ) + { + switch ( (FT_Int)( selector & 0xC0 ) ) + { + case 0: + exc->period = GridPeriod / 2; + break; + + case 0x40: + exc->period = GridPeriod; + break; + + case 0x80: + exc->period = GridPeriod * 2; + break; + + /* This opcode is reserved, but... */ + case 0xC0: + exc->period = GridPeriod; + break; + } + + switch ( (FT_Int)( selector & 0x30 ) ) + { + case 0: + exc->phase = 0; + break; + + case 0x10: + exc->phase = exc->period / 4; + break; + + case 0x20: + exc->phase = exc->period / 2; + break; + + case 0x30: + exc->phase = exc->period * 3 / 4; + break; + } + + if ( ( selector & 0x0F ) == 0 ) + exc->threshold = exc->period - 1; + else + exc->threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * exc->period / 8; + + /* convert to F26Dot6 format */ + exc->period >>= 8; + exc->phase >>= 8; + exc->threshold >>= 8; + } + + + /************************************************************************** + * + * @Function: + * Project + * + * @Description: + * Computes the projection of vector given by (v2-v1) along the + * current projection vector. + * + * @Input: + * v1 :: + * First input vector. + * v2 :: + * Second input vector. + * + * @Return: + * The distance in F26dot6 format. + */ + static FT_F26Dot6 + Project( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( dx, dy, + exc->GS.projVector.x, + exc->GS.projVector.y ); + } + + + /************************************************************************** + * + * @Function: + * Dual_Project + * + * @Description: + * Computes the projection of the vector given by (v2-v1) along the + * current dual vector. + * + * @Input: + * v1 :: + * First input vector. + * v2 :: + * Second input vector. + * + * @Return: + * The distance in F26dot6 format. + */ + static FT_F26Dot6 + Dual_Project( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( dx, dy, + exc->GS.dualVector.x, + exc->GS.dualVector.y ); + } + + + /************************************************************************** + * + * @Function: + * Project_x + * + * @Description: + * Computes the projection of the vector given by (v2-v1) along the + * horizontal axis. + * + * @Input: + * v1 :: + * First input vector. + * v2 :: + * Second input vector. + * + * @Return: + * The distance in F26dot6 format. + */ + static FT_F26Dot6 + Project_x( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED( exc ); + FT_UNUSED( dy ); + + return dx; + } + + + /************************************************************************** + * + * @Function: + * Project_y + * + * @Description: + * Computes the projection of the vector given by (v2-v1) along the + * vertical axis. + * + * @Input: + * v1 :: + * First input vector. + * v2 :: + * Second input vector. + * + * @Return: + * The distance in F26dot6 format. + */ + static FT_F26Dot6 + Project_y( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED( exc ); + FT_UNUSED( dx ); + + return dy; + } + + + /************************************************************************** + * + * @Function: + * Compute_Funcs + * + * @Description: + * Computes the projection and movement function pointers according + * to the current graphics state. + */ + static void + Compute_Funcs( TT_ExecContext exc ) + { + if ( exc->GS.freeVector.x == 0x4000 ) + exc->F_dot_P = exc->GS.projVector.x; + else if ( exc->GS.freeVector.y == 0x4000 ) + exc->F_dot_P = exc->GS.projVector.y; + else + exc->F_dot_P = + ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x + + (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y ) >> 14; + + if ( exc->GS.projVector.x == 0x4000 ) + exc->func_project = (TT_Project_Func)Project_x; + else if ( exc->GS.projVector.y == 0x4000 ) + exc->func_project = (TT_Project_Func)Project_y; + else + exc->func_project = (TT_Project_Func)Project; + + if ( exc->GS.dualVector.x == 0x4000 ) + exc->func_dualproj = (TT_Project_Func)Project_x; + else if ( exc->GS.dualVector.y == 0x4000 ) + exc->func_dualproj = (TT_Project_Func)Project_y; + else + exc->func_dualproj = (TT_Project_Func)Dual_Project; + + exc->func_move = (TT_Move_Func)Direct_Move; + exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig; + + if ( exc->F_dot_P == 0x4000L ) + { + if ( exc->GS.freeVector.x == 0x4000 ) + { + exc->func_move = (TT_Move_Func)Direct_Move_X; + exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; + } + else if ( exc->GS.freeVector.y == 0x4000 ) + { + exc->func_move = (TT_Move_Func)Direct_Move_Y; + exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; + } + } + + /* at small sizes, F_dot_P can become too small, resulting */ + /* in overflows and `spikes' in a number of glyphs like `w'. */ + + if ( FT_ABS( exc->F_dot_P ) < 0x400L ) + exc->F_dot_P = 0x4000L; + + /* Disable cached aspect ratio */ + exc->tt_metrics.ratio = 0; + } + + + /************************************************************************** + * + * @Function: + * Normalize + * + * @Description: + * Norms a vector. + * + * @Input: + * Vx :: + * The horizontal input vector coordinate. + * Vy :: + * The vertical input vector coordinate. + * + * @Output: + * R :: + * The normed unit vector. + * + * @Return: + * Returns FAILURE if a vector parameter is zero. + * + * @Note: + * In case Vx and Vy are both zero, `Normalize' returns SUCCESS, and + * R is undefined. + */ + static FT_Bool + Normalize( FT_F26Dot6 Vx, + FT_F26Dot6 Vy, + FT_UnitVector* R ) + { + FT_Vector V; + + + if ( Vx == 0 && Vy == 0 ) + { + /* XXX: UNDOCUMENTED! It seems that it is possible to try */ + /* to normalize the vector (0,0). Return immediately. */ + return SUCCESS; + } + + V.x = Vx; + V.y = Vy; + + FT_Vector_NormLen( &V ); + + R->x = (FT_F2Dot14)( V.x / 4 ); + R->y = (FT_F2Dot14)( V.y / 4 ); + + return SUCCESS; + } + + + /************************************************************************** + * + * Here we start with the implementation of the various opcodes. + * + */ + + +#define ARRAY_BOUND_ERROR \ + do \ + { \ + exc->error = FT_THROW( Invalid_Reference ); \ + return; \ + } while (0) + + + /************************************************************************** + * + * MPPEM[]: Measure Pixel Per EM + * Opcode range: 0x4B + * Stack: --> Euint16 + */ + static void + Ins_MPPEM( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->func_cur_ppem( exc ); + } + + + /************************************************************************** + * + * MPS[]: Measure Point Size + * Opcode range: 0x4C + * Stack: --> Euint16 + */ + static void + Ins_MPS( TT_ExecContext exc, + FT_Long* args ) + { + if ( NO_SUBPIXEL_HINTING ) + { + /* Microsoft's GDI bytecode interpreter always returns value 12; */ + /* we return the current PPEM value instead. */ + args[0] = exc->func_cur_ppem( exc ); + } + else + { + /* A possible practical application of the MPS instruction is to */ + /* implement optical scaling and similar features, which should be */ + /* based on perceptual attributes, thus independent of the */ + /* resolution. */ + args[0] = exc->pointSize; + } + } + + + /************************************************************************** + * + * DUP[]: DUPlicate the stack's top element + * Opcode range: 0x20 + * Stack: StkElt --> StkElt StkElt + */ + static void + Ins_DUP( FT_Long* args ) + { + args[1] = args[0]; + } + + + /************************************************************************** + * + * POP[]: POP the stack's top element + * Opcode range: 0x21 + * Stack: StkElt --> + */ + static void + Ins_POP( void ) + { + /* nothing to do */ + } + + + /************************************************************************** + * + * CLEAR[]: CLEAR the entire stack + * Opcode range: 0x22 + * Stack: StkElt... --> + */ + static void + Ins_CLEAR( TT_ExecContext exc ) + { + exc->new_top = 0; + } + + + /************************************************************************** + * + * SWAP[]: SWAP the stack's top two elements + * Opcode range: 0x23 + * Stack: 2 * StkElt --> 2 * StkElt + */ + static void + Ins_SWAP( FT_Long* args ) + { + FT_Long L; + + + L = args[0]; + args[0] = args[1]; + args[1] = L; + } + + + /************************************************************************** + * + * DEPTH[]: return the stack DEPTH + * Opcode range: 0x24 + * Stack: --> uint32 + */ + static void + Ins_DEPTH( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->top; + } + + + /************************************************************************** + * + * LT[]: Less Than + * Opcode range: 0x50 + * Stack: int32? int32? --> bool + */ + static void + Ins_LT( FT_Long* args ) + { + args[0] = ( args[0] < args[1] ); + } + + + /************************************************************************** + * + * LTEQ[]: Less Than or EQual + * Opcode range: 0x51 + * Stack: int32? int32? --> bool + */ + static void + Ins_LTEQ( FT_Long* args ) + { + args[0] = ( args[0] <= args[1] ); + } + + + /************************************************************************** + * + * GT[]: Greater Than + * Opcode range: 0x52 + * Stack: int32? int32? --> bool + */ + static void + Ins_GT( FT_Long* args ) + { + args[0] = ( args[0] > args[1] ); + } + + + /************************************************************************** + * + * GTEQ[]: Greater Than or EQual + * Opcode range: 0x53 + * Stack: int32? int32? --> bool + */ + static void + Ins_GTEQ( FT_Long* args ) + { + args[0] = ( args[0] >= args[1] ); + } + + + /************************************************************************** + * + * EQ[]: EQual + * Opcode range: 0x54 + * Stack: StkElt StkElt --> bool + */ + static void + Ins_EQ( FT_Long* args ) + { + args[0] = ( args[0] == args[1] ); + } + + + /************************************************************************** + * + * NEQ[]: Not EQual + * Opcode range: 0x55 + * Stack: StkElt StkElt --> bool + */ + static void + Ins_NEQ( FT_Long* args ) + { + args[0] = ( args[0] != args[1] ); + } + + + /************************************************************************** + * + * ODD[]: Is ODD + * Opcode range: 0x56 + * Stack: f26.6 --> bool + */ + static void + Ins_ODD( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 64 ); + } + + + /************************************************************************** + * + * EVEN[]: Is EVEN + * Opcode range: 0x57 + * Stack: f26.6 --> bool + */ + static void + Ins_EVEN( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = ( ( exc->func_round( exc, args[0], 3 ) & 127 ) == 0 ); + } + + + /************************************************************************** + * + * AND[]: logical AND + * Opcode range: 0x5A + * Stack: uint32 uint32 --> uint32 + */ + static void + Ins_AND( FT_Long* args ) + { + args[0] = ( args[0] && args[1] ); + } + + + /************************************************************************** + * + * OR[]: logical OR + * Opcode range: 0x5B + * Stack: uint32 uint32 --> uint32 + */ + static void + Ins_OR( FT_Long* args ) + { + args[0] = ( args[0] || args[1] ); + } + + + /************************************************************************** + * + * NOT[]: logical NOT + * Opcode range: 0x5C + * Stack: StkElt --> uint32 + */ + static void + Ins_NOT( FT_Long* args ) + { + args[0] = !args[0]; + } + + + /************************************************************************** + * + * ADD[]: ADD + * Opcode range: 0x60 + * Stack: f26.6 f26.6 --> f26.6 + */ + static void + Ins_ADD( FT_Long* args ) + { + args[0] = ADD_LONG( args[0], args[1] ); + } + + + /************************************************************************** + * + * SUB[]: SUBtract + * Opcode range: 0x61 + * Stack: f26.6 f26.6 --> f26.6 + */ + static void + Ins_SUB( FT_Long* args ) + { + args[0] = SUB_LONG( args[0], args[1] ); + } + + + /************************************************************************** + * + * DIV[]: DIVide + * Opcode range: 0x62 + * Stack: f26.6 f26.6 --> f26.6 + */ + static void + Ins_DIV( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[1] == 0 ) + exc->error = FT_THROW( Divide_By_Zero ); + else + args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] ); + } + + + /************************************************************************** + * + * MUL[]: MULtiply + * Opcode range: 0x63 + * Stack: f26.6 f26.6 --> f26.6 + */ + static void + Ins_MUL( FT_Long* args ) + { + args[0] = FT_MulDiv( args[0], args[1], 64L ); + } + + + /************************************************************************** + * + * ABS[]: ABSolute value + * Opcode range: 0x64 + * Stack: f26.6 --> f26.6 + */ + static void + Ins_ABS( FT_Long* args ) + { + if ( args[0] < 0 ) + args[0] = NEG_LONG( args[0] ); + } + + + /************************************************************************** + * + * NEG[]: NEGate + * Opcode range: 0x65 + * Stack: f26.6 --> f26.6 + */ + static void + Ins_NEG( FT_Long* args ) + { + args[0] = NEG_LONG( args[0] ); + } + + + /************************************************************************** + * + * FLOOR[]: FLOOR + * Opcode range: 0x66 + * Stack: f26.6 --> f26.6 + */ + static void + Ins_FLOOR( FT_Long* args ) + { + args[0] = FT_PIX_FLOOR( args[0] ); + } + + + /************************************************************************** + * + * CEILING[]: CEILING + * Opcode range: 0x67 + * Stack: f26.6 --> f26.6 + */ + static void + Ins_CEILING( FT_Long* args ) + { + args[0] = FT_PIX_CEIL_LONG( args[0] ); + } + + + /************************************************************************** + * + * RS[]: Read Store + * Opcode range: 0x43 + * Stack: uint32 --> uint32 + */ + static void + Ins_RS( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->storeSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + else + args[0] = 0; + } + else + args[0] = exc->storage[I]; + } + + + /************************************************************************** + * + * WS[]: Write Store + * Opcode range: 0x42 + * Stack: uint32 uint32 --> + */ + static void + Ins_WS( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->storeSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + } + else + { + if ( exc->iniRange == tt_coderange_glyph && + exc->storage != exc->glyfStorage ) + { + FT_Memory memory = exc->memory; + FT_Error error; + + + FT_MEM_QRENEW_ARRAY( exc->glyfStorage, + exc->glyfStoreSize, + exc->storeSize ); + exc->error = error; + if ( error ) + return; + + exc->glyfStoreSize = exc->storeSize; + FT_ARRAY_COPY( exc->glyfStorage, exc->storage, exc->glyfStoreSize ); + exc->storage = exc->glyfStorage; + } + + exc->storage[I] = args[1]; + } + } + + + /************************************************************************** + * + * WCVTP[]: Write CVT in Pixel units + * Opcode range: 0x44 + * Stack: f26.6 uint32 --> + */ + static void + Ins_WCVTP( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + } + else + exc->func_write_cvt( exc, I, args[1] ); + } + + + /************************************************************************** + * + * WCVTF[]: Write CVT in Funits + * Opcode range: 0x70 + * Stack: uint32 uint32 --> + */ + static void + Ins_WCVTF( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + } + else + exc->cvt[I] = FT_MulFix( args[1], exc->tt_metrics.scale ); + } + + + /************************************************************************** + * + * RCVT[]: Read CVT + * Opcode range: 0x45 + * Stack: uint32 --> f26.6 + */ + static void + Ins_RCVT( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + else + args[0] = 0; + } + else + args[0] = exc->func_read_cvt( exc, I ); + } + + + /************************************************************************** + * + * AA[]: Adjust Angle + * Opcode range: 0x7F + * Stack: uint32 --> + */ + static void + Ins_AA( void ) + { + /* intentionally no longer supported */ + } + + + /************************************************************************** + * + * DEBUG[]: DEBUG. Unsupported. + * Opcode range: 0x4F + * Stack: uint32 --> + * + * Note: The original instruction pops a value from the stack. + */ + static void + Ins_DEBUG( TT_ExecContext exc ) + { + exc->error = FT_THROW( Debug_OpCode ); + } + + + /************************************************************************** + * + * ROUND[ab]: ROUND value + * Opcode range: 0x68-0x6B + * Stack: f26.6 --> f26.6 + */ + static void + Ins_ROUND( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->func_round( exc, args[0], exc->opcode & 3 ); + } + + + /************************************************************************** + * + * NROUND[ab]: No ROUNDing of value + * Opcode range: 0x6C-0x6F + * Stack: f26.6 --> f26.6 + */ + static void + Ins_NROUND( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = Round_None( exc, args[0], exc->opcode & 3 ); + } + + + /************************************************************************** + * + * MAX[]: MAXimum + * Opcode range: 0x8B + * Stack: int32? int32? --> int32 + */ + static void + Ins_MAX( FT_Long* args ) + { + if ( args[1] > args[0] ) + args[0] = args[1]; + } + + + /************************************************************************** + * + * MIN[]: MINimum + * Opcode range: 0x8C + * Stack: int32? int32? --> int32 + */ + static void + Ins_MIN( FT_Long* args ) + { + if ( args[1] < args[0] ) + args[0] = args[1]; + } + + + /************************************************************************** + * + * MINDEX[]: Move INDEXed element + * Opcode range: 0x26 + * Stack: int32? --> StkElt + */ + static void + Ins_MINDEX( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long L, K; + + + L = args[0]; + + if ( L <= 0 || L > exc->args ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + } + else + { + K = exc->stack[exc->args - L]; + + FT_ARRAY_MOVE( &exc->stack[exc->args - L ], + &exc->stack[exc->args - L + 1], + ( L - 1 ) ); + + exc->stack[exc->args - 1] = K; + } + } + + + /************************************************************************** + * + * CINDEX[]: Copy INDEXed element + * Opcode range: 0x25 + * Stack: int32 --> StkElt + */ + static void + Ins_CINDEX( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long L; + + + L = args[0]; + + if ( L <= 0 || L > exc->args ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + args[0] = 0; + } + else + args[0] = exc->stack[exc->args - L]; + } + + + /************************************************************************** + * + * ROLL[]: ROLL top three elements + * Opcode range: 0x8A + * Stack: 3 * StkElt --> 3 * StkElt + */ + static void + Ins_ROLL( FT_Long* args ) + { + FT_Long A, B, C; + + + A = args[2]; + B = args[1]; + C = args[0]; + + args[2] = C; + args[1] = A; + args[0] = B; + } + + + /************************************************************************** + * + * MANAGING THE FLOW OF CONTROL + * + */ + + + /************************************************************************** + * + * SLOOP[]: Set LOOP variable + * Opcode range: 0x17 + * Stack: int32? --> + */ + static void + Ins_SLOOP( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[0] < 0 ) + exc->error = FT_THROW( Bad_Argument ); + else + { + /* we heuristically limit the number of loops to 16 bits */ + exc->GS.loop = args[0] > 0xFFFFL ? 0xFFFFL : args[0]; + } + } + + + static FT_Bool + SkipCode( TT_ExecContext exc ) + { + exc->IP += exc->length; + + if ( exc->IP < exc->codeSize ) + { + exc->opcode = exc->code[exc->IP]; + + exc->length = opcode_length[exc->opcode]; + if ( exc->length < 0 ) + { + if ( exc->IP + 1 >= exc->codeSize ) + goto Fail_Overflow; + exc->length = 2 - exc->length * exc->code[exc->IP + 1]; + } + + if ( exc->IP + exc->length <= exc->codeSize ) + return SUCCESS; + } + + Fail_Overflow: + exc->error = FT_THROW( Code_Overflow ); + return FAILURE; + } + + + /************************************************************************** + * + * IF[]: IF test + * Opcode range: 0x58 + * Stack: StkElt --> + */ + static void + Ins_IF( TT_ExecContext exc, + FT_Long* args ) + { + FT_Int nIfs; + FT_Bool Out; + + + if ( args[0] != 0 ) + return; + + nIfs = 1; + Out = 0; + + do + { + if ( SkipCode( exc ) == FAILURE ) + return; + + switch ( exc->opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x1B: /* ELSE */ + Out = FT_BOOL( nIfs == 1 ); + break; + + case 0x59: /* EIF */ + nIfs--; + Out = FT_BOOL( nIfs == 0 ); + break; + } + } while ( Out == 0 ); + } + + + /************************************************************************** + * + * ELSE[]: ELSE + * Opcode range: 0x1B + * Stack: --> + */ + static void + Ins_ELSE( TT_ExecContext exc ) + { + FT_Int nIfs; + + + nIfs = 1; + + do + { + if ( SkipCode( exc ) == FAILURE ) + return; + + switch ( exc->opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x59: /* EIF */ + nIfs--; + break; + } + } while ( nIfs != 0 ); + } + + + /************************************************************************** + * + * EIF[]: End IF + * Opcode range: 0x59 + * Stack: --> + */ + static void + Ins_EIF( void ) + { + /* nothing to do */ + } + + + /************************************************************************** + * + * JMPR[]: JuMP Relative + * Opcode range: 0x1C + * Stack: int32 --> + */ + static void + Ins_JMPR( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[0] == 0 && exc->args == 0 ) + { + exc->error = FT_THROW( Bad_Argument ); + return; + } + + exc->IP = ADD_LONG( exc->IP, args[0] ); + if ( exc->IP < 0 || + ( exc->callTop > 0 && + exc->IP > exc->callStack[exc->callTop - 1].Def->end ) ) + { + exc->error = FT_THROW( Bad_Argument ); + return; + } + + exc->step_ins = FALSE; + + if ( args[0] < 0 ) + { + if ( ++exc->neg_jump_counter > exc->neg_jump_counter_max ) + exc->error = FT_THROW( Execution_Too_Long ); + } + } + + + /************************************************************************** + * + * JROT[]: Jump Relative On True + * Opcode range: 0x78 + * Stack: StkElt int32 --> + */ + static void + Ins_JROT( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[1] != 0 ) + Ins_JMPR( exc, args ); + } + + + /************************************************************************** + * + * JROF[]: Jump Relative On False + * Opcode range: 0x79 + * Stack: StkElt int32 --> + */ + static void + Ins_JROF( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[1] == 0 ) + Ins_JMPR( exc, args ); + } + + + /************************************************************************** + * + * DEFINING AND USING FUNCTIONS AND INSTRUCTIONS + * + */ + + + /************************************************************************** + * + * FDEF[]: Function DEFinition + * Opcode range: 0x2C + * Stack: uint32 --> + */ + static void + Ins_FDEF( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong n; + TT_DefRecord* rec; + TT_DefRecord* limit; + + + /* FDEF is only allowed in `prep' or `fpgm' */ + if ( exc->iniRange == tt_coderange_glyph ) + { + exc->error = FT_THROW( DEF_In_Glyf_Bytecode ); + return; + } + + /* some font programs are broken enough to redefine functions! */ + /* We will then parse the current table. */ + + rec = exc->FDefs; + limit = FT_OFFSET( rec, exc->numFDefs ); + n = (FT_ULong)args[0]; + + for ( ; rec < limit; rec++ ) + { + if ( rec->opc == n ) + break; + } + + if ( rec == limit ) + { + /* check that there is enough room for new functions */ + if ( exc->numFDefs >= exc->maxFDefs ) + { + exc->error = FT_THROW( Too_Many_Function_Defs ); + return; + } + exc->numFDefs++; + } + + /* Although FDEF takes unsigned 32-bit integer, */ + /* func # must be within unsigned 16-bit integer */ + if ( n > 0xFFFFU ) + { + exc->error = FT_THROW( Too_Many_Function_Defs ); + return; + } + + rec->range = exc->curRange; + rec->opc = (FT_UInt16)n; + rec->start = exc->IP + 1; + rec->active = TRUE; + + if ( n > exc->maxFunc ) + exc->maxFunc = (FT_UInt16)n; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFS & FDEFs. */ + + while ( SkipCode( exc ) == SUCCESS ) + { + switch ( exc->opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + exc->error = FT_THROW( Nested_DEFS ); + return; + + case 0x2D: /* ENDF */ + rec->end = exc->IP; + return; + } + } + } + + + /************************************************************************** + * + * ENDF[]: END Function definition + * Opcode range: 0x2D + * Stack: --> + */ + static void + Ins_ENDF( TT_ExecContext exc ) + { + TT_CallRec* pRec; + + + if ( exc->callTop <= 0 ) /* We encountered an ENDF without a call */ + { + exc->error = FT_THROW( ENDF_In_Exec_Stream ); + return; + } + + exc->callTop--; + + pRec = &exc->callStack[exc->callTop]; + + pRec->Cur_Count--; + + exc->step_ins = FALSE; + + if ( pRec->Cur_Count > 0 ) + { + exc->callTop++; + exc->IP = pRec->Def->start; + } + else + /* Loop through the current function */ + Ins_Goto_CodeRange( exc, pRec->Caller_Range, pRec->Caller_IP ); + + /* Exit the current call frame. */ + + /* NOTE: If the last instruction of a program is a */ + /* CALL or LOOPCALL, the return address is */ + /* always out of the code range. This is a */ + /* valid address, and it is why we do not test */ + /* the result of Ins_Goto_CodeRange() here! */ + } + + + /************************************************************************** + * + * CALL[]: CALL function + * Opcode range: 0x2B + * Stack: uint32? --> + */ + static void + Ins_CALL( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + + F = (FT_ULong)args[0]; + if ( BOUNDSL( F, exc->maxFunc + 1 ) ) + goto Fail; + + if ( !exc->FDefs ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* exc->maxFunc+1 == exc->numFDefs */ + /* exc->FDefs[n].opc == n for n in 0..exc->maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = exc->FDefs + F; + if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = exc->FDefs; + limit = def + exc->numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check the call stack */ + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + pCrec = exc->callStack + exc->callTop; + + pCrec->Caller_Range = exc->curRange; + pCrec->Caller_IP = exc->IP + 1; + pCrec->Cur_Count = 1; + pCrec->Def = def; + + exc->callTop++; + + Ins_Goto_CodeRange( exc, def->range, def->start ); + + exc->step_ins = FALSE; + + return; + + Fail: + exc->error = FT_THROW( Invalid_Reference ); + } + + + /************************************************************************** + * + * LOOPCALL[]: LOOP and CALL function + * Opcode range: 0x2A + * Stack: uint32? Eint16? --> + */ + static void + Ins_LOOPCALL( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + F = (FT_ULong)args[1]; + if ( BOUNDSL( F, exc->maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* exc->maxFunc+1 == exc->numFDefs */ + /* exc->FDefs[n].opc == n for n in 0..exc->maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = FT_OFFSET( exc->FDefs, F ); + if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = exc->FDefs; + limit = FT_OFFSET( def, exc->numFDefs ); + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check stack */ + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + if ( args[0] > 0 ) + { + pCrec = exc->callStack + exc->callTop; + + pCrec->Caller_Range = exc->curRange; + pCrec->Caller_IP = exc->IP + 1; + pCrec->Cur_Count = (FT_Int)args[0]; + pCrec->Def = def; + + exc->callTop++; + + Ins_Goto_CodeRange( exc, def->range, def->start ); + + exc->step_ins = FALSE; + + exc->loopcall_counter += (FT_ULong)args[0]; + if ( exc->loopcall_counter > exc->loopcall_counter_max ) + exc->error = FT_THROW( Execution_Too_Long ); + } + + return; + + Fail: + exc->error = FT_THROW( Invalid_Reference ); + } + + + /************************************************************************** + * + * IDEF[]: Instruction DEFinition + * Opcode range: 0x89 + * Stack: Eint8 --> + */ + static void + Ins_IDEF( TT_ExecContext exc, + FT_Long* args ) + { + TT_DefRecord* def; + TT_DefRecord* limit; + + + /* we enable IDEF only in `prep' or `fpgm' */ + if ( exc->iniRange == tt_coderange_glyph ) + { + exc->error = FT_THROW( DEF_In_Glyf_Bytecode ); + return; + } + + /* First of all, look for the same function in our table */ + + def = exc->IDefs; + limit = FT_OFFSET( def, exc->numIDefs ); + + for ( ; def < limit; def++ ) + if ( def->opc == (FT_ULong)args[0] ) + break; + + if ( def == limit ) + { + /* check that there is enough room for a new instruction */ + if ( exc->numIDefs >= exc->maxIDefs ) + { + exc->error = FT_THROW( Too_Many_Instruction_Defs ); + return; + } + exc->numIDefs++; + } + + /* opcode must be unsigned 8-bit integer */ + if ( 0 > args[0] || args[0] > 0x00FF ) + { + exc->error = FT_THROW( Too_Many_Instruction_Defs ); + return; + } + + def->opc = (FT_Byte)args[0]; + def->start = exc->IP + 1; + def->range = exc->curRange; + def->active = TRUE; + + if ( (FT_ULong)args[0] > exc->maxIns ) + exc->maxIns = (FT_Byte)args[0]; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFs & FDEFs. */ + + while ( SkipCode( exc ) == SUCCESS ) + { + switch ( exc->opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + exc->error = FT_THROW( Nested_DEFS ); + return; + case 0x2D: /* ENDF */ + def->end = exc->IP; + return; + } + } + } + + + /************************************************************************** + * + * PUSHING DATA ONTO THE INTERPRETER STACK + * + */ + + + /************************************************************************** + * + * NPUSHB[]: PUSH N Bytes + * Opcode range: 0x40 + * Stack: --> uint32... + */ + static void + Ins_NPUSHB( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)exc->code[exc->IP + 1]; + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = exc->code[exc->IP + K + 1]; + + exc->new_top += L; + } + + + /************************************************************************** + * + * NPUSHW[]: PUSH N Words + * Opcode range: 0x41 + * Stack: --> int32... + */ + static void + Ins_NPUSHW( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)exc->code[exc->IP + 1]; + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + exc->IP += 2; + + for ( K = 0; K < L; K++ ) + args[K] = GetShortIns( exc ); + + exc->step_ins = FALSE; + exc->new_top += L; + } + + + /************************************************************************** + * + * PUSHB[abc]: PUSH Bytes + * Opcode range: 0xB0-0xB7 + * Stack: --> uint32... + */ + static void + Ins_PUSHB( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)( exc->opcode - 0xB0 + 1 ); + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = exc->code[exc->IP + K]; + } + + + /************************************************************************** + * + * PUSHW[abc]: PUSH Words + * Opcode range: 0xB8-0xBF + * Stack: --> int32... + */ + static void + Ins_PUSHW( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)( exc->opcode - 0xB8 + 1 ); + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + exc->IP++; + + for ( K = 0; K < L; K++ ) + args[K] = GetShortIns( exc ); + + exc->step_ins = FALSE; + } + + + /************************************************************************** + * + * MANAGING THE GRAPHICS STATE + * + */ + + + static FT_Bool + Ins_SxVTL( TT_ExecContext exc, + FT_UShort aIdx1, + FT_UShort aIdx2, + FT_UnitVector* Vec ) + { + FT_Long A, B, C; + FT_Vector* p1; + FT_Vector* p2; + + FT_Byte opcode = exc->opcode; + + + if ( BOUNDS( aIdx1, exc->zp2.n_points ) || + BOUNDS( aIdx2, exc->zp1.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return FAILURE; + } + + p1 = exc->zp1.cur + aIdx2; + p2 = exc->zp2.cur + aIdx1; + + A = SUB_LONG( p1->x, p2->x ); + B = SUB_LONG( p1->y, p2->y ); + + /* If p1 == p2, SPvTL and SFvTL behave the same as */ + /* SPvTCA[X] and SFvTCA[X], respectively. */ + /* */ + /* Confirmed by Greg Hitchcock. */ + + if ( A == 0 && B == 0 ) + { + A = 0x4000; + opcode = 0; + } + + if ( ( opcode & 1 ) != 0 ) + { + C = B; /* counter-clockwise rotation */ + B = A; + A = NEG_LONG( C ); + } + + Normalize( A, B, Vec ); + + return SUCCESS; + } + + + /************************************************************************** + * + * SVTCA[a]: Set (F and P) Vectors to Coordinate Axis + * Opcode range: 0x00-0x01 + * Stack: --> + * + * SPvTCA[a]: Set PVector to Coordinate Axis + * Opcode range: 0x02-0x03 + * Stack: --> + * + * SFvTCA[a]: Set FVector to Coordinate Axis + * Opcode range: 0x04-0x05 + * Stack: --> + */ + static void + Ins_SxyTCA( TT_ExecContext exc ) + { + FT_Short AA, BB; + + FT_Byte opcode = exc->opcode; + + + AA = (FT_Short)( ( opcode & 1 ) << 14 ); + BB = (FT_Short)( AA ^ 0x4000 ); + + if ( opcode < 4 ) + { + exc->GS.projVector.x = AA; + exc->GS.projVector.y = BB; + + exc->GS.dualVector.x = AA; + exc->GS.dualVector.y = BB; + } + + if ( ( opcode & 2 ) == 0 ) + { + exc->GS.freeVector.x = AA; + exc->GS.freeVector.y = BB; + } + + Compute_Funcs( exc ); + } + + + /************************************************************************** + * + * SPvTL[a]: Set PVector To Line + * Opcode range: 0x06-0x07 + * Stack: uint32 uint32 --> + */ + static void + Ins_SPVTL( TT_ExecContext exc, + FT_Long* args ) + { + if ( Ins_SxVTL( exc, + (FT_UShort)args[1], + (FT_UShort)args[0], + &exc->GS.projVector ) == SUCCESS ) + { + exc->GS.dualVector = exc->GS.projVector; + Compute_Funcs( exc ); + } + } + + + /************************************************************************** + * + * SFvTL[a]: Set FVector To Line + * Opcode range: 0x08-0x09 + * Stack: uint32 uint32 --> + */ + static void + Ins_SFVTL( TT_ExecContext exc, + FT_Long* args ) + { + if ( Ins_SxVTL( exc, + (FT_UShort)args[1], + (FT_UShort)args[0], + &exc->GS.freeVector ) == SUCCESS ) + { + Compute_Funcs( exc ); + } + } + + + /************************************************************************** + * + * SFvTPv[]: Set FVector To PVector + * Opcode range: 0x0E + * Stack: --> + */ + static void + Ins_SFVTPV( TT_ExecContext exc ) + { + exc->GS.freeVector = exc->GS.projVector; + Compute_Funcs( exc ); + } + + + /************************************************************************** + * + * SPvFS[]: Set PVector From Stack + * Opcode range: 0x0A + * Stack: f2.14 f2.14 --> + */ + static void + Ins_SPVFS( TT_ExecContext exc, + FT_Long* args ) + { + FT_Short S; + FT_Long X, Y; + + + /* Only use low 16bits, then sign extend */ + S = (FT_Short)args[1]; + Y = (FT_Long)S; + S = (FT_Short)args[0]; + X = (FT_Long)S; + + Normalize( X, Y, &exc->GS.projVector ); + + exc->GS.dualVector = exc->GS.projVector; + Compute_Funcs( exc ); + } + + + /************************************************************************** + * + * SFvFS[]: Set FVector From Stack + * Opcode range: 0x0B + * Stack: f2.14 f2.14 --> + */ + static void + Ins_SFVFS( TT_ExecContext exc, + FT_Long* args ) + { + FT_Short S; + FT_Long X, Y; + + + /* Only use low 16bits, then sign extend */ + S = (FT_Short)args[1]; + Y = (FT_Long)S; + S = (FT_Short)args[0]; + X = S; + + Normalize( X, Y, &exc->GS.freeVector ); + Compute_Funcs( exc ); + } + + + /************************************************************************** + * + * GPv[]: Get Projection Vector + * Opcode range: 0x0C + * Stack: ef2.14 --> ef2.14 + */ + static void + Ins_GPV( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->GS.projVector.x; + args[1] = exc->GS.projVector.y; + } + + + /************************************************************************** + * + * GFv[]: Get Freedom Vector + * Opcode range: 0x0D + * Stack: ef2.14 --> ef2.14 + */ + static void + Ins_GFV( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->GS.freeVector.x; + args[1] = exc->GS.freeVector.y; + } + + + /************************************************************************** + * + * SRP0[]: Set Reference Point 0 + * Opcode range: 0x10 + * Stack: uint32 --> + */ + static void + Ins_SRP0( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.rp0 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SRP1[]: Set Reference Point 1 + * Opcode range: 0x11 + * Stack: uint32 --> + */ + static void + Ins_SRP1( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.rp1 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SRP2[]: Set Reference Point 2 + * Opcode range: 0x12 + * Stack: uint32 --> + */ + static void + Ins_SRP2( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.rp2 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SMD[]: Set Minimum Distance + * Opcode range: 0x1A + * Stack: f26.6 --> + */ + static void + Ins_SMD( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.minimum_distance = args[0]; + } + + + /************************************************************************** + * + * SCVTCI[]: Set Control Value Table Cut In + * Opcode range: 0x1D + * Stack: f26.6 --> + */ + static void + Ins_SCVTCI( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.control_value_cutin = (FT_F26Dot6)args[0]; + } + + + /************************************************************************** + * + * SSWCI[]: Set Single Width Cut In + * Opcode range: 0x1E + * Stack: f26.6 --> + */ + static void + Ins_SSWCI( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.single_width_cutin = (FT_F26Dot6)args[0]; + } + + + /************************************************************************** + * + * SSW[]: Set Single Width + * Opcode range: 0x1F + * Stack: int32? --> + */ + static void + Ins_SSW( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.single_width_value = FT_MulFix( args[0], + exc->tt_metrics.scale ); + } + + + /************************************************************************** + * + * FLIPON[]: Set auto-FLIP to ON + * Opcode range: 0x4D + * Stack: --> + */ + static void + Ins_FLIPON( TT_ExecContext exc ) + { + exc->GS.auto_flip = TRUE; + } + + + /************************************************************************** + * + * FLIPOFF[]: Set auto-FLIP to OFF + * Opcode range: 0x4E + * Stack: --> + */ + static void + Ins_FLIPOFF( TT_ExecContext exc ) + { + exc->GS.auto_flip = FALSE; + } + + + /************************************************************************** + * + * SANGW[]: Set ANGle Weight + * Opcode range: 0x7E + * Stack: uint32 --> + */ + static void + Ins_SANGW( void ) + { + /* instruction not supported anymore */ + } + + + /************************************************************************** + * + * SDB[]: Set Delta Base + * Opcode range: 0x5E + * Stack: uint32 --> + */ + static void + Ins_SDB( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.delta_base = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SDS[]: Set Delta Shift + * Opcode range: 0x5F + * Stack: uint32 --> + */ + static void + Ins_SDS( TT_ExecContext exc, + FT_Long* args ) + { + if ( (FT_ULong)args[0] > 6UL ) + exc->error = FT_THROW( Bad_Argument ); + else + exc->GS.delta_shift = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * RTHG[]: Round To Half Grid + * Opcode range: 0x19 + * Stack: --> + */ + static void + Ins_RTHG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_To_Half_Grid; + exc->func_round = (TT_Round_Func)Round_To_Half_Grid; + } + + + /************************************************************************** + * + * RTG[]: Round To Grid + * Opcode range: 0x18 + * Stack: --> + */ + static void + Ins_RTG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_To_Grid; + exc->func_round = (TT_Round_Func)Round_To_Grid; + } + + + /************************************************************************** + * RTDG[]: Round To Double Grid + * Opcode range: 0x3D + * Stack: --> + */ + static void + Ins_RTDG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_To_Double_Grid; + exc->func_round = (TT_Round_Func)Round_To_Double_Grid; + } + + + /************************************************************************** + * RUTG[]: Round Up To Grid + * Opcode range: 0x7C + * Stack: --> + */ + static void + Ins_RUTG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_Up_To_Grid; + exc->func_round = (TT_Round_Func)Round_Up_To_Grid; + } + + + /************************************************************************** + * + * RDTG[]: Round Down To Grid + * Opcode range: 0x7D + * Stack: --> + */ + static void + Ins_RDTG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_Down_To_Grid; + exc->func_round = (TT_Round_Func)Round_Down_To_Grid; + } + + + /************************************************************************** + * + * ROFF[]: Round OFF + * Opcode range: 0x7A + * Stack: --> + */ + static void + Ins_ROFF( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_Off; + exc->func_round = (TT_Round_Func)Round_None; + } + + + /************************************************************************** + * + * SROUND[]: Super ROUND + * Opcode range: 0x76 + * Stack: Eint8 --> + */ + static void + Ins_SROUND( TT_ExecContext exc, + FT_Long* args ) + { + SetSuperRound( exc, 0x4000, args[0] ); + + exc->GS.round_state = TT_Round_Super; + exc->func_round = (TT_Round_Func)Round_Super; + } + + + /************************************************************************** + * + * S45ROUND[]: Super ROUND 45 degrees + * Opcode range: 0x77 + * Stack: uint32 --> + */ + static void + Ins_S45ROUND( TT_ExecContext exc, + FT_Long* args ) + { + SetSuperRound( exc, 0x2D41, args[0] ); + + exc->GS.round_state = TT_Round_Super_45; + exc->func_round = (TT_Round_Func)Round_Super_45; + } + + + /************************************************************************** + * + * GC[a]: Get Coordinate projected onto + * Opcode range: 0x46-0x47 + * Stack: uint32 --> f26.6 + * + * XXX: UNDOCUMENTED: Measures from the original glyph must be taken + * along the dual projection vector! + */ + static void + Ins_GC( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong L; + FT_F26Dot6 R; + + + L = (FT_ULong)args[0]; + + if ( BOUNDSL( L, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + R = 0; + } + else + { + if ( exc->opcode & 1 ) + R = FAST_DUALPROJ( &exc->zp2.org[L] ); + else + R = FAST_PROJECT( &exc->zp2.cur[L] ); + } + + args[0] = R; + } + + + /************************************************************************** + * + * SCFS[]: Set Coordinate From Stack + * Opcode range: 0x48 + * Stack: f26.6 uint32 --> + * + * Formula: + * + * OA := OA + ( value - OA.p )/( f.p ) * f + */ + static void + Ins_SCFS( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long K; + FT_UShort L; + + + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + K = FAST_PROJECT( &exc->zp2.cur[L] ); + + exc->func_move( exc, &exc->zp2, L, SUB_LONG( args[1], K ) ); + + /* UNDOCUMENTED! The MS rasterizer does that with */ + /* twilight points (confirmed by Greg Hitchcock) */ + if ( exc->GS.gep2 == 0 ) + exc->zp2.org[L] = exc->zp2.cur[L]; + } + + + /************************************************************************** + * + * MD[a]: Measure Distance + * Opcode range: 0x49-0x4A + * Stack: uint32 uint32 --> f26.6 + * + * XXX: UNDOCUMENTED: Measure taken in the original glyph must be along + * the dual projection vector. + * + * XXX: UNDOCUMENTED: Flag attributes are inverted! + * 0 => measure distance in original outline + * 1 => measure distance in grid-fitted outline + * + * XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1! + */ + static void + Ins_MD( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort K, L; + FT_F26Dot6 D; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, exc->zp0.n_points ) || + BOUNDS( K, exc->zp1.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + D = 0; + } + else + { + if ( exc->opcode & 1 ) + D = PROJECT( exc->zp0.cur + L, exc->zp1.cur + K ); + else + { + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 ) + { + FT_Vector* vec1 = exc->zp0.org + L; + FT_Vector* vec2 = exc->zp1.org + K; + + + D = DUALPROJ( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = exc->zp0.orus + L; + FT_Vector* vec2 = exc->zp1.orus + K; + + + if ( exc->metrics.x_scale == exc->metrics.y_scale ) + { + /* this should be faster */ + D = DUALPROJ( vec1, vec2 ); + D = FT_MulFix( D, exc->metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale ); + vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale ); + + D = FAST_DUALPROJ( &vec ); + } + } + } + } + + args[0] = D; + } + + + /************************************************************************** + * + * SDPvTL[a]: Set Dual PVector to Line + * Opcode range: 0x86-0x87 + * Stack: uint32 uint32 --> + */ + static void + Ins_SDPVTL( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long A, B, C; + FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ + + FT_Byte opcode = exc->opcode; + + + p1 = (FT_UShort)args[1]; + p2 = (FT_UShort)args[0]; + + if ( BOUNDS( p2, exc->zp1.n_points ) || + BOUNDS( p1, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + { + FT_Vector* v1 = exc->zp1.org + p2; + FT_Vector* v2 = exc->zp2.org + p1; + + + A = SUB_LONG( v1->x, v2->x ); + B = SUB_LONG( v1->y, v2->y ); + + /* If v1 == v2, SDPvTL behaves the same as */ + /* SVTCA[X], respectively. */ + /* */ + /* Confirmed by Greg Hitchcock. */ + + if ( A == 0 && B == 0 ) + { + A = 0x4000; + opcode = 0; + } + } + + if ( ( opcode & 1 ) != 0 ) + { + C = B; /* counter-clockwise rotation */ + B = A; + A = NEG_LONG( C ); + } + + Normalize( A, B, &exc->GS.dualVector ); + + { + FT_Vector* v1 = exc->zp1.cur + p2; + FT_Vector* v2 = exc->zp2.cur + p1; + + + A = SUB_LONG( v1->x, v2->x ); + B = SUB_LONG( v1->y, v2->y ); + + if ( A == 0 && B == 0 ) + { + A = 0x4000; + opcode = 0; + } + } + + if ( ( opcode & 1 ) != 0 ) + { + C = B; /* counter-clockwise rotation */ + B = A; + A = NEG_LONG( C ); + } + + Normalize( A, B, &exc->GS.projVector ); + Compute_Funcs( exc ); + } + + + /************************************************************************** + * + * SZP0[]: Set Zone Pointer 0 + * Opcode range: 0x13 + * Stack: uint32 --> + */ + static void + Ins_SZP0( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp0 = exc->twilight; + break; + + case 1: + exc->zp0 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->GS.gep0 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SZP1[]: Set Zone Pointer 1 + * Opcode range: 0x14 + * Stack: uint32 --> + */ + static void + Ins_SZP1( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp1 = exc->twilight; + break; + + case 1: + exc->zp1 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->GS.gep1 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SZP2[]: Set Zone Pointer 2 + * Opcode range: 0x15 + * Stack: uint32 --> + */ + static void + Ins_SZP2( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp2 = exc->twilight; + break; + + case 1: + exc->zp2 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->GS.gep2 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * SZPS[]: Set Zone PointerS + * Opcode range: 0x16 + * Stack: uint32 --> + */ + static void + Ins_SZPS( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp0 = exc->twilight; + break; + + case 1: + exc->zp0 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->zp1 = exc->zp0; + exc->zp2 = exc->zp0; + + exc->GS.gep0 = (FT_UShort)args[0]; + exc->GS.gep1 = (FT_UShort)args[0]; + exc->GS.gep2 = (FT_UShort)args[0]; + } + + + /************************************************************************** + * + * INSTCTRL[]: INSTruction ConTRoL + * Opcode range: 0x8E + * Stack: int32 int32 --> + */ + static void + Ins_INSTCTRL( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong K, L, Kf; + + + K = (FT_ULong)args[1]; + L = (FT_ULong)args[0]; + + /* selector values cannot be `OR'ed; */ + /* they are indices starting with index 1, not flags */ + if ( K < 1 || K > 3 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + /* convert index to flag value */ + Kf = 1 << ( K - 1 ); + + if ( L != 0 ) + { + /* arguments to selectors look like flag values */ + if ( L != Kf ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + + /* INSTCTRL should only be used in the CVT program */ + if ( exc->iniRange == tt_coderange_cvt ) + { + exc->GS.instruct_control &= ~(FT_Byte)Kf; + exc->GS.instruct_control |= (FT_Byte)L; + } + + /* except to change the subpixel flags temporarily */ + else if ( exc->iniRange == tt_coderange_glyph && K == 3 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Native ClearType fonts sign a waiver that turns off all backward */ + /* compatibility hacks and lets them program points to the grid like */ + /* it's 1996. They might sign a waiver for just one glyph, though. */ + if ( SUBPIXEL_HINTING_MINIMAL ) + exc->backward_compatibility = !FT_BOOL( L == 4 ); +#endif + } + else if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + } + + + /************************************************************************** + * + * SCANCTRL[]: SCAN ConTRoL + * Opcode range: 0x85 + * Stack: uint32? --> + */ + static void + Ins_SCANCTRL( TT_ExecContext exc, + FT_Long* args ) + { + FT_Int A; + + + /* Get Threshold */ + A = (FT_Int)( args[0] & 0xFF ); + + if ( A == 0xFF ) + { + exc->GS.scan_control = TRUE; + return; + } + else if ( A == 0 ) + { + exc->GS.scan_control = FALSE; + return; + } + + if ( ( args[0] & 0x100 ) != 0 && exc->tt_metrics.ppem <= A ) + exc->GS.scan_control = TRUE; + + if ( ( args[0] & 0x200 ) != 0 && exc->tt_metrics.rotated ) + exc->GS.scan_control = TRUE; + + if ( ( args[0] & 0x400 ) != 0 && exc->tt_metrics.stretched ) + exc->GS.scan_control = TRUE; + + if ( ( args[0] & 0x800 ) != 0 && exc->tt_metrics.ppem > A ) + exc->GS.scan_control = FALSE; + + if ( ( args[0] & 0x1000 ) != 0 && exc->tt_metrics.rotated ) + exc->GS.scan_control = FALSE; + + if ( ( args[0] & 0x2000 ) != 0 && exc->tt_metrics.stretched ) + exc->GS.scan_control = FALSE; + } + + + /************************************************************************** + * + * SCANTYPE[]: SCAN TYPE + * Opcode range: 0x8D + * Stack: uint16 --> + */ + static void + Ins_SCANTYPE( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[0] >= 0 ) + exc->GS.scan_type = (FT_Int)args[0] & 0xFFFF; + } + + + /************************************************************************** + * + * MANAGING OUTLINES + * + */ + + + /************************************************************************** + * + * FLIPPT[]: FLIP PoinT + * Opcode range: 0x80 + * Stack: uint32... --> + */ + static void + Ins_FLIPPT( TT_ExecContext exc ) + { + FT_UShort point; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) + goto Fail; +#endif + + if ( exc->top < exc->GS.loop ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Too_Few_Arguments ); + goto Fail; + } + + while ( exc->GS.loop > 0 ) + { + exc->args--; + + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->pts.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + exc->pts.tags[point] ^= FT_CURVE_TAG_ON; + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * FLIPRGON[]: FLIP RanGe ON + * Opcode range: 0x81 + * Stack: uint32 uint32 --> + */ + static void + Ins_FLIPRGON( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort I, K, L; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) + return; +#endif + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, exc->pts.n_points ) || + BOUNDS( L, exc->pts.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + for ( I = L; I <= K; I++ ) + exc->pts.tags[I] |= FT_CURVE_TAG_ON; + } + + + /************************************************************************** + * + * FLIPRGOFF: FLIP RanGe OFF + * Opcode range: 0x82 + * Stack: uint32 uint32 --> + */ + static void + Ins_FLIPRGOFF( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort I, K, L; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) + return; +#endif + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, exc->pts.n_points ) || + BOUNDS( L, exc->pts.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + for ( I = L; I <= K; I++ ) + exc->pts.tags[I] &= ~FT_CURVE_TAG_ON; + } + + + static FT_Bool + Compute_Point_Displacement( TT_ExecContext exc, + FT_F26Dot6* x, + FT_F26Dot6* y, + TT_GlyphZone zone, + FT_UShort* refp ) + { + TT_GlyphZoneRec zp; + FT_UShort p; + FT_F26Dot6 d; + + + if ( exc->opcode & 1 ) + { + zp = exc->zp0; + p = exc->GS.rp1; + } + else + { + zp = exc->zp1; + p = exc->GS.rp2; + } + + if ( BOUNDS( p, zp.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + *refp = 0; + return FAILURE; + } + + *zone = zp; + *refp = p; + + d = PROJECT( zp.cur + p, zp.org + p ); + + *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P ); + *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P ); + + return SUCCESS; + } + + + /* See `ttinterp.h' for details on backward compatibility mode. */ + static void + Move_Zp2_Point( TT_ExecContext exc, + FT_UShort point, + FT_F26Dot6 dx, + FT_F26Dot6 dy, + FT_Bool touch ) + { + if ( exc->GS.freeVector.x != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) ) +#endif + exc->zp2.cur[point].x = ADD_LONG( exc->zp2.cur[point].x, dx ); + + if ( touch ) + exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + if ( exc->GS.freeVector.y != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) ) +#endif + exc->zp2.cur[point].y = ADD_LONG( exc->zp2.cur[point].y, dy ); + + if ( touch ) + exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /************************************************************************** + * + * SHP[a]: SHift Point by the last point + * Opcode range: 0x32-0x33 + * Stack: uint32... --> + */ + static void + Ins_SHP( TT_ExecContext exc ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + + FT_F26Dot6 dx, dy; + FT_UShort point; + + + if ( exc->top < exc->GS.loop ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) + return; + + while ( exc->GS.loop > 0 ) + { + exc->args--; + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * SHC[a]: SHift Contour + * Opcode range: 0x34-35 + * Stack: uint32 --> + * + * UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual) + * contour in the twilight zone, namely contour number + * zero which includes all points of it. + */ + static void + Ins_SHC( TT_ExecContext exc, + FT_Long* args ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, dy; + + FT_Short contour, bounds; + FT_UShort start, limit, i; + + + contour = (FT_Short)args[0]; + bounds = ( exc->GS.gep2 == 0 ) ? 1 : exc->zp2.n_contours; + + if ( BOUNDS( contour, bounds ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) + return; + + if ( contour == 0 ) + start = 0; + else + start = (FT_UShort)( exc->zp2.contours[contour - 1] + 1 - + exc->zp2.first_point ); + + /* we use the number of points if in the twilight zone */ + if ( exc->GS.gep2 == 0 ) + limit = exc->zp2.n_points; + else + limit = (FT_UShort)( exc->zp2.contours[contour] - + exc->zp2.first_point + 1 ); + + for ( i = start; i < limit; i++ ) + { + if ( zp.cur != exc->zp2.cur || refp != i ) + Move_Zp2_Point( exc, i, dx, dy, TRUE ); + } + } + + + /************************************************************************** + * + * SHZ[a]: SHift Zone + * Opcode range: 0x36-37 + * Stack: uint32 --> + */ + static void + Ins_SHZ( TT_ExecContext exc, + FT_Long* args ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_UShort limit, i; + + + if ( BOUNDS( args[0], 2 ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) + return; + + /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ + /* Twilight zone has no real contours, so use `n_points'. */ + /* Normal zone's `n_points' includes phantoms, so must */ + /* use end of last contour. */ + if ( exc->GS.gep2 == 0 ) + limit = (FT_UShort)exc->zp2.n_points; + else if ( exc->GS.gep2 == 1 && exc->zp2.n_contours > 0 ) + limit = (FT_UShort)( exc->zp2.contours[exc->zp2.n_contours - 1] + 1 ); + else + limit = 0; + + /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ + for ( i = 0; i < limit; i++ ) + { + if ( zp.cur != exc->zp2.cur || refp != i ) + Move_Zp2_Point( exc, i, dx, dy, FALSE ); + } + } + + + /************************************************************************** + * + * SHPIX[]: SHift points by a PIXel amount + * Opcode range: 0x38 + * Stack: f26.6 uint32... --> + */ + static void + Ins_SHPIX( TT_ExecContext exc, + FT_Long* args ) + { + FT_F26Dot6 dx, dy; + FT_UShort point; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + FT_Bool in_twilight = FT_BOOL( exc->GS.gep0 == 0 || + exc->GS.gep1 == 0 || + exc->GS.gep2 == 0 ); +#endif + + + + if ( exc->top < exc->GS.loop + 1 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + dx = TT_MulFix14( args[0], exc->GS.freeVector.x ); + dy = TT_MulFix14( args[0], exc->GS.freeVector.y ); + + while ( exc->GS.loop > 0 ) + { + exc->args--; + + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + /* Special case: allow SHPIX to move points in the twilight zone. */ + /* Otherwise, treat SHPIX the same as DELTAP. Unbreaks various */ + /* fonts such as older versions of Rokkitt and DTL Argo T Light */ + /* that would glitch severely after calling ALIGNRP after a */ + /* blocked SHPIX. */ + if ( in_twilight || + ( !( exc->iupx_called && exc->iupy_called ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ) ) ) + Move_Zp2_Point( exc, point, 0, dy, TRUE ); + } + else +#endif + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * MSIRP[a]: Move Stack Indirect Relative Position + * Opcode range: 0x3A-0x3B + * Stack: f26.6 uint32 --> + */ + static void + Ins_MSIRP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point = 0; + FT_F26Dot6 distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp1.n_points ) || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + /* UNDOCUMENTED! The MS rasterizer does that with */ + /* twilight points (confirmed by Greg Hitchcock) */ + if ( exc->GS.gep1 == 0 ) + { + exc->zp1.org[point] = exc->zp0.org[exc->GS.rp0]; + exc->func_move_orig( exc, &exc->zp1, point, args[1] ); + exc->zp1.cur[point] = exc->zp1.org[point]; + } + + distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); + + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( args[1], distance ) ); + + exc->GS.rp1 = exc->GS.rp0; + exc->GS.rp2 = point; + + if ( ( exc->opcode & 1 ) != 0 ) + exc->GS.rp0 = point; + } + + + /************************************************************************** + * + * MDAP[a]: Move Direct Absolute Point + * Opcode range: 0x2E-0x2F + * Stack: uint32 --> + */ + static void + Ins_MDAP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point; + FT_F26Dot6 cur_dist; + FT_F26Dot6 distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + if ( ( exc->opcode & 1 ) != 0 ) + { + cur_dist = FAST_PROJECT( &exc->zp0.cur[point] ); + distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist ); + } + else + distance = 0; + + exc->func_move( exc, &exc->zp0, point, distance ); + + exc->GS.rp0 = point; + exc->GS.rp1 = point; + } + + + /************************************************************************** + * + * MIAP[a]: Move Indirect Absolute Point + * Opcode range: 0x3E-0x3F + * Stack: uint32 uint32 --> + */ + static void + Ins_MIAP( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong cvtEntry; + FT_UShort point; + FT_F26Dot6 distance; + FT_F26Dot6 org_dist; + + + cvtEntry = (FT_ULong)args[1]; + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp0.n_points ) || + BOUNDSL( cvtEntry, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + /* UNDOCUMENTED! */ + /* */ + /* The behaviour of an MIAP instruction is quite different when used */ + /* in the twilight zone. */ + /* */ + /* First, no control value cut-in test is performed as it would fail */ + /* anyway. Second, the original point, i.e. (org_x,org_y) of */ + /* zp0.point, is set to the absolute, unrounded distance found in the */ + /* CVT. */ + /* */ + /* This is used in the CVT programs of the Microsoft fonts Arial, */ + /* Times, etc., in order to re-adjust some key font heights. It */ + /* allows the use of the IP instruction in the twilight zone, which */ + /* otherwise would be invalid according to the specification. */ + /* */ + /* We implement it with a special sequence for the twilight zone. */ + /* This is a bad hack, but it seems to work. */ + /* */ + /* Confirmed by Greg Hitchcock. */ + + distance = exc->func_read_cvt( exc, cvtEntry ); + + if ( exc->GS.gep0 == 0 ) /* If in twilight zone */ + { + exc->zp0.org[point].x = TT_MulFix14( distance, + exc->GS.freeVector.x ); + exc->zp0.org[point].y = TT_MulFix14( distance, + exc->GS.freeVector.y ); + exc->zp0.cur[point] = exc->zp0.org[point]; + } + + org_dist = FAST_PROJECT( &exc->zp0.cur[point] ); + + if ( ( exc->opcode & 1 ) != 0 ) /* rounding and control cut-in flag */ + { + FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; + FT_F26Dot6 delta; + + + delta = SUB_LONG( distance, org_dist ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta > control_value_cutin ) + distance = org_dist; + + distance = exc->func_round( exc, distance, 3 ); + } + + exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) ); + + Fail: + exc->GS.rp0 = point; + exc->GS.rp1 = point; + } + + + /************************************************************************** + * + * MDRP[abcde]: Move Direct Relative Point + * Opcode range: 0xC0-0xDF + * Stack: uint32 --> + */ + static void + Ins_MDRP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point = 0; + FT_F26Dot6 org_dist, distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp1.n_points ) || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? */ + + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 ) + { + FT_Vector* vec1 = &exc->zp1.org[point]; + FT_Vector* vec2 = &exc->zp0.org[exc->GS.rp0]; + + + org_dist = DUALPROJ( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = &exc->zp1.orus[point]; + FT_Vector* vec2 = &exc->zp0.orus[exc->GS.rp0]; + + + if ( exc->metrics.x_scale == exc->metrics.y_scale ) + { + /* this should be faster */ + org_dist = DUALPROJ( vec1, vec2 ); + org_dist = FT_MulFix( org_dist, exc->metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( SUB_LONG( vec1->x, vec2->x ), + exc->metrics.x_scale ); + vec.y = FT_MulFix( SUB_LONG( vec1->y, vec2->y ), + exc->metrics.y_scale ); + + org_dist = FAST_DUALPROJ( &vec ); + } + } + + /* single width cut-in test */ + + /* |org_dist - single_width_value| < single_width_cutin */ + if ( exc->GS.single_width_cutin > 0 && + org_dist < exc->GS.single_width_value + + exc->GS.single_width_cutin && + org_dist > exc->GS.single_width_value - + exc->GS.single_width_cutin ) + { + if ( org_dist >= 0 ) + org_dist = exc->GS.single_width_value; + else + org_dist = -exc->GS.single_width_value; + } + + /* round flag */ + + if ( ( exc->opcode & 4 ) != 0 ) + { + distance = exc->func_round( exc, org_dist, exc->opcode & 3 ); + } + else + distance = Round_None( exc, org_dist, exc->opcode & 3 ); + + /* minimum distance flag */ + + if ( ( exc->opcode & 8 ) != 0 ) + { + FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; + + + if ( org_dist >= 0 ) + { + if ( distance < minimum_distance ) + distance = minimum_distance; + } + else + { + if ( distance > NEG_LONG( minimum_distance ) ) + distance = NEG_LONG( minimum_distance ); + } + } + + /* now move the point */ + + org_dist = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); + + exc->func_move( exc, &exc->zp1, point, SUB_LONG( distance, org_dist ) ); + + Fail: + exc->GS.rp1 = exc->GS.rp0; + exc->GS.rp2 = point; + + if ( ( exc->opcode & 16 ) != 0 ) + exc->GS.rp0 = point; + } + + + /************************************************************************** + * + * MIRP[abcde]: Move Indirect Relative Point + * Opcode range: 0xE0-0xFF + * Stack: int32? uint32 --> + */ + static void + Ins_MIRP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point; + FT_ULong cvtEntry; + + FT_F26Dot6 cvt_dist, + distance, + cur_dist, + org_dist; + + FT_F26Dot6 delta; + + + point = (FT_UShort)args[0]; + cvtEntry = (FT_ULong)( ADD_LONG( args[1], 1 ) ); + + /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ + + if ( BOUNDS( point, exc->zp1.n_points ) || + BOUNDSL( cvtEntry, exc->cvtSize + 1 ) || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + if ( !cvtEntry ) + cvt_dist = 0; + else + cvt_dist = exc->func_read_cvt( exc, cvtEntry - 1 ); + + /* single width test */ + + delta = SUB_LONG( cvt_dist, exc->GS.single_width_value ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta < exc->GS.single_width_cutin ) + { + if ( cvt_dist >= 0 ) + cvt_dist = exc->GS.single_width_value; + else + cvt_dist = -exc->GS.single_width_value; + } + + /* UNDOCUMENTED! The MS rasterizer does that with */ + /* twilight points (confirmed by Greg Hitchcock) */ + if ( exc->GS.gep1 == 0 ) + { + exc->zp1.org[point].x = ADD_LONG( + exc->zp0.org[exc->GS.rp0].x, + TT_MulFix14( cvt_dist, + exc->GS.freeVector.x ) ); + exc->zp1.org[point].y = ADD_LONG( + exc->zp0.org[exc->GS.rp0].y, + TT_MulFix14( cvt_dist, + exc->GS.freeVector.y ) ); + exc->zp1.cur[point] = exc->zp1.org[point]; + } + + org_dist = DUALPROJ( &exc->zp1.org[point], &exc->zp0.org[exc->GS.rp0] ); + cur_dist = PROJECT ( &exc->zp1.cur[point], &exc->zp0.cur[exc->GS.rp0] ); + + /* auto-flip test */ + + if ( exc->GS.auto_flip ) + { + if ( ( org_dist ^ cvt_dist ) < 0 ) + cvt_dist = NEG_LONG( cvt_dist ); + } + + /* control value cut-in and round */ + + if ( ( exc->opcode & 4 ) != 0 ) + { + /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ + /* refer to the same zone. */ + + if ( exc->GS.gep0 == exc->GS.gep1 ) + { + FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; + + + /* XXX: According to Greg Hitchcock, the following wording is */ + /* the right one: */ + /* */ + /* When the absolute difference between the value in */ + /* the table [CVT] and the measurement directly from */ + /* the outline is _greater_ than the cut_in value, the */ + /* outline measurement is used. */ + /* */ + /* This is from `instgly.doc'. The description in */ + /* `ttinst2.doc', version 1.66, is thus incorrect since */ + /* it implies `>=' instead of `>'. */ + + delta = SUB_LONG( cvt_dist, org_dist ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta > control_value_cutin ) + cvt_dist = org_dist; + } + + distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 ); + } + else + distance = Round_None( exc, cvt_dist, exc->opcode & 3 ); + + /* minimum distance test */ + + if ( ( exc->opcode & 8 ) != 0 ) + { + FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; + + + if ( org_dist >= 0 ) + { + if ( distance < minimum_distance ) + distance = minimum_distance; + } + else + { + if ( distance > NEG_LONG( minimum_distance ) ) + distance = NEG_LONG( minimum_distance ); + } + } + + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( distance, cur_dist ) ); + + Fail: + exc->GS.rp1 = exc->GS.rp0; + + if ( ( exc->opcode & 16 ) != 0 ) + exc->GS.rp0 = point; + + exc->GS.rp2 = point; + } + + + /************************************************************************** + * + * ALIGNRP[]: ALIGN Relative Point + * Opcode range: 0x3C + * Stack: uint32 uint32... --> + */ + static void + Ins_ALIGNRP( TT_ExecContext exc ) + { + FT_UShort point; + FT_F26Dot6 distance; + + + if ( exc->top < exc->GS.loop || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + while ( exc->GS.loop > 0 ) + { + exc->args--; + + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->zp1.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + { + distance = PROJECT( exc->zp1.cur + point, + exc->zp0.cur + exc->GS.rp0 ); + + exc->func_move( exc, &exc->zp1, point, NEG_LONG( distance ) ); + } + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * ISECT[]: moves point to InterSECTion + * Opcode range: 0x0F + * Stack: 5 * uint32 --> + */ + static void + Ins_ISECT( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point, + a0, a1, + b0, b1; + + FT_F26Dot6 discriminant, dotproduct; + + FT_F26Dot6 dx, dy, + dax, day, + dbx, dby; + + FT_F26Dot6 val; + + FT_Vector R; + + + point = (FT_UShort)args[0]; + + a0 = (FT_UShort)args[1]; + a1 = (FT_UShort)args[2]; + b0 = (FT_UShort)args[3]; + b1 = (FT_UShort)args[4]; + + if ( BOUNDS( b0, exc->zp0.n_points ) || + BOUNDS( b1, exc->zp0.n_points ) || + BOUNDS( a0, exc->zp1.n_points ) || + BOUNDS( a1, exc->zp1.n_points ) || + BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + /* Cramer's rule */ + + dbx = SUB_LONG( exc->zp0.cur[b1].x, exc->zp0.cur[b0].x ); + dby = SUB_LONG( exc->zp0.cur[b1].y, exc->zp0.cur[b0].y ); + + dax = SUB_LONG( exc->zp1.cur[a1].x, exc->zp1.cur[a0].x ); + day = SUB_LONG( exc->zp1.cur[a1].y, exc->zp1.cur[a0].y ); + + dx = SUB_LONG( exc->zp0.cur[b0].x, exc->zp1.cur[a0].x ); + dy = SUB_LONG( exc->zp0.cur[b0].y, exc->zp1.cur[a0].y ); + + discriminant = ADD_LONG( FT_MulDiv( dax, NEG_LONG( dby ), 0x40 ), + FT_MulDiv( day, dbx, 0x40 ) ); + dotproduct = ADD_LONG( FT_MulDiv( dax, dbx, 0x40 ), + FT_MulDiv( day, dby, 0x40 ) ); + + /* The discriminant above is actually a cross product of vectors */ + /* da and db. Together with the dot product, they can be used as */ + /* surrogates for sine and cosine of the angle between the vectors. */ + /* Indeed, */ + /* dotproduct = |da||db|cos(angle) */ + /* discriminant = |da||db|sin(angle) . */ + /* We use these equations to reject grazing intersections by */ + /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */ + if ( MUL_LONG( 19, FT_ABS( discriminant ) ) > FT_ABS( dotproduct ) ) + { + val = ADD_LONG( FT_MulDiv( dx, NEG_LONG( dby ), 0x40 ), + FT_MulDiv( dy, dbx, 0x40 ) ); + + R.x = FT_MulDiv( val, dax, discriminant ); + R.y = FT_MulDiv( val, day, discriminant ); + + /* XXX: Block in backward_compatibility and/or post-IUP? */ + exc->zp2.cur[point].x = ADD_LONG( exc->zp1.cur[a0].x, R.x ); + exc->zp2.cur[point].y = ADD_LONG( exc->zp1.cur[a0].y, R.y ); + } + else + { + /* else, take the middle of the middles of A and B */ + + /* XXX: Block in backward_compatibility and/or post-IUP? */ + exc->zp2.cur[point].x = + ADD_LONG( ADD_LONG( exc->zp1.cur[a0].x, exc->zp1.cur[a1].x ), + ADD_LONG( exc->zp0.cur[b0].x, exc->zp0.cur[b1].x ) ) / 4; + exc->zp2.cur[point].y = + ADD_LONG( ADD_LONG( exc->zp1.cur[a0].y, exc->zp1.cur[a1].y ), + ADD_LONG( exc->zp0.cur[b0].y, exc->zp0.cur[b1].y ) ) / 4; + } + + exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; + } + + + /************************************************************************** + * + * ALIGNPTS[]: ALIGN PoinTS + * Opcode range: 0x27 + * Stack: uint32 uint32 --> + */ + static void + Ins_ALIGNPTS( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort p1, p2; + FT_F26Dot6 distance; + + + p1 = (FT_UShort)args[0]; + p2 = (FT_UShort)args[1]; + + if ( BOUNDS( p1, exc->zp1.n_points ) || + BOUNDS( p2, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + distance = PROJECT( exc->zp0.cur + p2, exc->zp1.cur + p1 ) / 2; + + exc->func_move( exc, &exc->zp1, p1, distance ); + exc->func_move( exc, &exc->zp0, p2, NEG_LONG( distance ) ); + } + + + /************************************************************************** + * + * IP[]: Interpolate Point + * Opcode range: 0x39 + * Stack: uint32... --> + */ + + /* SOMETIMES, DUMBER CODE IS BETTER CODE */ + + static void + Ins_IP( TT_ExecContext exc ) + { + FT_F26Dot6 old_range, cur_range; + FT_Vector* orus_base; + FT_Vector* cur_base; + FT_Int twilight; + + + if ( exc->top < exc->GS.loop ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + /* + * We need to deal in a special way with the twilight zone. + * Otherwise, by definition, the value of exc->twilight.orus[n] is (0,0), + * for every n. + */ + twilight = ( exc->GS.gep0 == 0 || + exc->GS.gep1 == 0 || + exc->GS.gep2 == 0 ); + + if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + if ( twilight ) + orus_base = &exc->zp0.org[exc->GS.rp1]; + else + orus_base = &exc->zp0.orus[exc->GS.rp1]; + + cur_base = &exc->zp0.cur[exc->GS.rp1]; + + /* XXX: There are some glyphs in some braindead but popular */ + /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ + /* calling IP[] with bad values of rp[12]. */ + /* Do something sane when this odd thing happens. */ + if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) || + BOUNDS( exc->GS.rp2, exc->zp1.n_points ) ) + { + old_range = 0; + cur_range = 0; + } + else + { + if ( twilight ) + old_range = DUALPROJ( &exc->zp1.org[exc->GS.rp2], orus_base ); + else if ( exc->metrics.x_scale == exc->metrics.y_scale ) + old_range = DUALPROJ( &exc->zp1.orus[exc->GS.rp2], orus_base ); + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].x, + orus_base->x ), + exc->metrics.x_scale ); + vec.y = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].y, + orus_base->y ), + exc->metrics.y_scale ); + + old_range = FAST_DUALPROJ( &vec ); + } + + cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base ); + } + + for ( ; exc->GS.loop > 0; exc->GS.loop-- ) + { + FT_UInt point = (FT_UInt)exc->stack[--exc->args]; + FT_F26Dot6 org_dist, cur_dist, new_dist; + + + /* check point bounds */ + if ( BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + continue; + } + + if ( twilight ) + org_dist = DUALPROJ( &exc->zp2.org[point], orus_base ); + else if ( exc->metrics.x_scale == exc->metrics.y_scale ) + org_dist = DUALPROJ( &exc->zp2.orus[point], orus_base ); + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( SUB_LONG( exc->zp2.orus[point].x, + orus_base->x ), + exc->metrics.x_scale ); + vec.y = FT_MulFix( SUB_LONG( exc->zp2.orus[point].y, + orus_base->y ), + exc->metrics.y_scale ); + + org_dist = FAST_DUALPROJ( &vec ); + } + + cur_dist = PROJECT( &exc->zp2.cur[point], cur_base ); + + if ( org_dist ) + { + if ( old_range ) + new_dist = FT_MulDiv( org_dist, cur_range, old_range ); + else + { + /* This is the same as what MS does for the invalid case: */ + /* */ + /* delta = (Original_Pt - Original_RP1) - */ + /* (Current_Pt - Current_RP1) ; */ + /* */ + /* In FreeType speak: */ + /* */ + /* delta = org_dist - cur_dist . */ + /* */ + /* We move `point' by `new_dist - cur_dist' after leaving */ + /* this block, thus we have */ + /* */ + /* new_dist - cur_dist = delta , */ + /* new_dist - cur_dist = org_dist - cur_dist , */ + /* new_dist = org_dist . */ + + new_dist = org_dist; + } + } + else + new_dist = 0; + + exc->func_move( exc, + &exc->zp2, + (FT_UShort)point, + SUB_LONG( new_dist, cur_dist ) ); + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * UTP[a]: UnTouch Point + * Opcode range: 0x29 + * Stack: uint32 --> + */ + static void + Ins_UTP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point; + FT_Byte mask; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + mask = 0xFF; + + if ( exc->GS.freeVector.x != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_X; + + if ( exc->GS.freeVector.y != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_Y; + + exc->zp0.tags[point] &= mask; + } + + + /* Local variables for Ins_IUP: */ + typedef struct IUP_WorkerRec_ + { + FT_Vector* orgs; /* original and current coordinate */ + FT_Vector* curs; /* arrays */ + FT_Vector* orus; + FT_UInt max_points; + + } IUP_WorkerRec, *IUP_Worker; + + + static void + iup_worker_shift_( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt p ) + { + FT_UInt i; + FT_F26Dot6 dx; + + + dx = SUB_LONG( worker->curs[p].x, worker->orgs[p].x ); + if ( dx != 0 ) + { + for ( i = p1; i < p; i++ ) + worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx ); + + for ( i = p + 1; i <= p2; i++ ) + worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx ); + } + } + + + static void + iup_worker_interpolate_( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt ref1, + FT_UInt ref2 ) + { + FT_UInt i; + FT_F26Dot6 orus1, orus2, org1, org2, cur1, cur2, delta1, delta2; + + + if ( p1 > p2 ) + return; + + if ( BOUNDS( ref1, worker->max_points ) || + BOUNDS( ref2, worker->max_points ) ) + return; + + orus1 = worker->orus[ref1].x; + orus2 = worker->orus[ref2].x; + + if ( orus1 > orus2 ) + { + FT_F26Dot6 tmp_o; + FT_UInt tmp_r; + + + tmp_o = orus1; + orus1 = orus2; + orus2 = tmp_o; + + tmp_r = ref1; + ref1 = ref2; + ref2 = tmp_r; + } + + org1 = worker->orgs[ref1].x; + org2 = worker->orgs[ref2].x; + cur1 = worker->curs[ref1].x; + cur2 = worker->curs[ref2].x; + delta1 = SUB_LONG( cur1, org1 ); + delta2 = SUB_LONG( cur2, org2 ); + + if ( cur1 == cur2 || orus1 == orus2 ) + { + + /* trivial snap or shift of untouched points */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x = ADD_LONG( x, delta1 ); + + else if ( x >= org2 ) + x = ADD_LONG( x, delta2 ); + + else + x = cur1; + + worker->curs[i].x = x; + } + } + else + { + FT_Fixed scale = 0; + FT_Bool scale_valid = 0; + + + /* interpolation */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x = ADD_LONG( x, delta1 ); + + else if ( x >= org2 ) + x = ADD_LONG( x, delta2 ); + + else + { + if ( !scale_valid ) + { + scale_valid = 1; + scale = FT_DivFix( SUB_LONG( cur2, cur1 ), + SUB_LONG( orus2, orus1 ) ); + } + + x = ADD_LONG( cur1, + FT_MulFix( SUB_LONG( worker->orus[i].x, orus1 ), + scale ) ); + } + worker->curs[i].x = x; + } + } + } + + + /************************************************************************** + * + * IUP[a]: Interpolate Untouched Points + * Opcode range: 0x30-0x31 + * Stack: --> + */ + static void + Ins_IUP( TT_ExecContext exc ) + { + IUP_WorkerRec V; + FT_Byte mask; + + FT_UInt first_point; /* first point of contour */ + FT_UInt end_point; /* end point (last+1) of contour */ + + FT_UInt first_touched; /* first touched point in contour */ + FT_UInt cur_touched; /* current touched point in contour */ + + FT_UInt point; /* current point */ + FT_Short contour; /* current contour */ + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + /* Allow IUP until it has been called on both axes. Immediately */ + /* return on subsequent ones. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + if ( exc->iupx_called && exc->iupy_called ) + return; + + if ( exc->opcode & 1 ) + exc->iupx_called = TRUE; + else + exc->iupy_called = TRUE; + } +#endif + + /* ignore empty outlines */ + if ( exc->pts.n_contours == 0 ) + return; + + if ( exc->opcode & 1 ) + { + mask = FT_CURVE_TAG_TOUCH_X; + V.orgs = exc->pts.org; + V.curs = exc->pts.cur; + V.orus = exc->pts.orus; + } + else + { + mask = FT_CURVE_TAG_TOUCH_Y; + V.orgs = (FT_Vector*)( (FT_Pos*)exc->pts.org + 1 ); + V.curs = (FT_Vector*)( (FT_Pos*)exc->pts.cur + 1 ); + V.orus = (FT_Vector*)( (FT_Pos*)exc->pts.orus + 1 ); + } + V.max_points = exc->pts.n_points; + + contour = 0; + point = 0; + + do + { + end_point = exc->pts.contours[contour] - exc->pts.first_point; + first_point = point; + + if ( BOUNDS( end_point, exc->pts.n_points ) ) + end_point = exc->pts.n_points - 1; + + while ( point <= end_point && ( exc->pts.tags[point] & mask ) == 0 ) + point++; + + if ( point <= end_point ) + { + first_touched = point; + cur_touched = point; + + point++; + + while ( point <= end_point ) + { + if ( ( exc->pts.tags[point] & mask ) != 0 ) + { + iup_worker_interpolate_( &V, + cur_touched + 1, + point - 1, + cur_touched, + point ); + cur_touched = point; + } + + point++; + } + + if ( cur_touched == first_touched ) + iup_worker_shift_( &V, first_point, end_point, cur_touched ); + else + { + iup_worker_interpolate_( &V, + (FT_UShort)( cur_touched + 1 ), + end_point, + cur_touched, + first_touched ); + + if ( first_touched > 0 ) + iup_worker_interpolate_( &V, + first_point, + first_touched - 1, + cur_touched, + first_touched ); + } + } + contour++; + } while ( contour < exc->pts.n_contours ); + } + + + /************************************************************************** + * + * DELTAPn[]: DELTA exceptions P1, P2, P3 + * Opcode range: 0x5D,0x71,0x72 + * Stack: uint32 (2 * uint32)... --> + */ + static void + Ins_DELTAP( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong nump, k; + FT_UShort A; + FT_ULong C, P; + FT_Long B; + + + P = (FT_ULong)exc->func_cur_ppem( exc ); + nump = (FT_ULong)args[0]; /* some points theoretically may occur more + than once, thus UShort isn't enough */ + + for ( k = 1; k <= nump; k++ ) + { + if ( exc->args < 2 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Too_Few_Arguments ); + exc->args = 0; + goto Fail; + } + + exc->args -= 2; + + A = (FT_UShort)exc->stack[exc->args + 1]; + B = exc->stack[exc->args]; + + /* XXX: Because some popular fonts contain some invalid DeltaP */ + /* instructions, we simply ignore them when the stacked */ + /* point reference is off limit, rather than returning an */ + /* error. As a delta instruction doesn't change a glyph */ + /* in great ways, this shouldn't be a problem. */ + + if ( !BOUNDS( A, exc->zp0.n_points ) ) + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( exc->opcode ) + { + case 0x5D: + break; + + case 0x71: + C += 16; + break; + + case 0x72: + C += 32; + break; + } + + C += exc->GS.delta_base; + + if ( P == C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B *= 1L << ( 6 - exc->GS.delta_shift ); + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility */ + /* mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + if ( !( exc->iupx_called && exc->iupy_called ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) ) + exc->func_move( exc, &exc->zp0, A, B ); + } + else +#endif + exc->func_move( exc, &exc->zp0, A, B ); + } + } + else + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + } + + Fail: + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * DELTACn[]: DELTA exceptions C1, C2, C3 + * Opcode range: 0x73,0x74,0x75 + * Stack: uint32 (2 * uint32)... --> + */ + static void + Ins_DELTAC( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong nump, k; + FT_ULong A, C, P; + FT_Long B; + + + P = (FT_ULong)exc->func_cur_ppem( exc ); + nump = (FT_ULong)args[0]; + + for ( k = 1; k <= nump; k++ ) + { + if ( exc->args < 2 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Too_Few_Arguments ); + exc->args = 0; + goto Fail; + } + + exc->args -= 2; + + A = (FT_ULong)exc->stack[exc->args + 1]; + B = exc->stack[exc->args]; + + if ( BOUNDSL( A, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( exc->opcode ) + { + case 0x73: + break; + + case 0x74: + C += 16; + break; + + case 0x75: + C += 32; + break; + } + + C += exc->GS.delta_base; + + if ( P == C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B *= 1L << ( 6 - exc->GS.delta_shift ); + + exc->func_move_cvt( exc, A, B ); + } + } + } + + Fail: + exc->new_top = exc->args; + } + + + /************************************************************************** + * + * MISC. INSTRUCTIONS + * + */ + + + /************************************************************************** + * + * GETINFO[]: GET INFOrmation + * Opcode range: 0x88 + * Stack: uint32 --> uint32 + */ + static void + Ins_GETINFO( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long K; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( exc->face ); + + + K = 0; + + if ( ( args[0] & 1 ) != 0 ) + K = driver->interpreter_version; + + /********************************* + * GLYPH ROTATED + * Selector Bit: 1 + * Return Bit(s): 8 + */ + if ( ( args[0] & 2 ) != 0 && exc->tt_metrics.rotated ) + K |= 1 << 8; + + /********************************* + * GLYPH STRETCHED + * Selector Bit: 2 + * Return Bit(s): 9 + */ + if ( ( args[0] & 4 ) != 0 && exc->tt_metrics.stretched ) + K |= 1 << 9; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /********************************* + * VARIATION GLYPH + * Selector Bit: 3 + * Return Bit(s): 10 + */ + if ( (args[0] & 8 ) != 0 && exc->face->blend ) + K |= 1 << 10; +#endif + + /********************************* + * BI-LEVEL HINTING AND + * GRAYSCALE RENDERING + * Selector Bit: 5 + * Return Bit(s): 12 + */ + if ( ( args[0] & 32 ) != 0 && exc->grayscale ) + K |= 1 << 12; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Toggle the following flags only outside of monochrome mode. */ + /* Otherwise, instructions may behave weirdly and rendering results */ + /* may differ between v35 and v40 mode, e.g., in `Times New Roman */ + /* Bold Italic'. */ + if ( SUBPIXEL_HINTING_MINIMAL && exc->subpixel_hinting_lean ) + { + /********************************* + * HINTING FOR SUBPIXEL + * Selector Bit: 6 + * Return Bit(s): 13 + * + * v40 does subpixel hinting by default. + */ + if ( ( args[0] & 64 ) != 0 ) + K |= 1 << 13; + + /********************************* + * VERTICAL LCD SUBPIXELS? + * Selector Bit: 8 + * Return Bit(s): 15 + */ + if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd_lean ) + K |= 1 << 15; + + /********************************* + * SUBPIXEL POSITIONED? + * Selector Bit: 10 + * Return Bit(s): 17 + * + * XXX: FreeType supports it, dependent on what client does? + */ + if ( ( args[0] & 1024 ) != 0 ) + K |= 1 << 17; + + /********************************* + * SYMMETRICAL SMOOTHING + * Selector Bit: 11 + * Return Bit(s): 18 + * + * The only smoothing method FreeType supports unless someone sets + * FT_LOAD_TARGET_MONO. + */ + if ( ( args[0] & 2048 ) != 0 && exc->subpixel_hinting_lean ) + K |= 1 << 18; + + /********************************* + * CLEARTYPE HINTING AND + * GRAYSCALE RENDERING + * Selector Bit: 12 + * Return Bit(s): 19 + * + * Grayscale rendering is what FreeType does anyway unless someone + * sets FT_LOAD_TARGET_MONO or FT_LOAD_TARGET_LCD(_V) + */ + if ( ( args[0] & 4096 ) != 0 && exc->grayscale_cleartype ) + K |= 1 << 19; + } +#endif + + args[0] = K; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /************************************************************************** + * + * GETVARIATION[]: get normalized variation (blend) coordinates + * Opcode range: 0x91 + * Stack: --> f2.14... + * + * XXX: UNDOCUMENTED! There is no official documentation from Apple for + * this bytecode instruction. Active only if a font has GX + * variation axes. + */ + static void + Ins_GETVARIATION( TT_ExecContext exc, + FT_Long* args ) + { + FT_UInt num_axes = exc->face->blend->num_axis; + FT_Fixed* coords = exc->face->blend->normalizedcoords; + + FT_UInt i; + + + if ( BOUNDS( num_axes, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + if ( coords ) + { + for ( i = 0; i < num_axes; i++ ) + args[i] = coords[i] >> 2; /* convert 16.16 to 2.14 format */ + } + else + { + for ( i = 0; i < num_axes; i++ ) + args[i] = 0; + } + } + + + /************************************************************************** + * + * GETDATA[]: no idea what this is good for + * Opcode range: 0x92 + * Stack: --> 17 + * + * XXX: UNDOCUMENTED! There is no documentation from Apple for this + * very weird bytecode instruction. + */ + static void + Ins_GETDATA( FT_Long* args ) + { + args[0] = 17; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static void + Ins_UNKNOWN( TT_ExecContext exc ) + { + TT_DefRecord* def = exc->IDefs; + TT_DefRecord* limit = FT_OFFSET( def, exc->numIDefs ); + + + for ( ; def < limit; def++ ) + { + if ( (FT_Byte)def->opc == exc->opcode && def->active ) + { + TT_CallRec* call; + + + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + call = exc->callStack + exc->callTop++; + + call->Caller_Range = exc->curRange; + call->Caller_IP = exc->IP + 1; + call->Cur_Count = 1; + call->Def = def; + + Ins_Goto_CodeRange( exc, def->range, def->start ); + + exc->step_ins = FALSE; + return; + } + } + + exc->error = FT_THROW( Invalid_Opcode ); + } + + + /************************************************************************** + * + * RUN + * + * This function executes a run of opcodes. It will exit in the + * following cases: + * + * - Errors (in which case it returns FALSE). + * + * - Reaching the end of the main code range (returns TRUE). + * Reaching the end of a code range within a function call is an + * error. + * + * - After executing one single opcode, if the flag `Instruction_Trap' + * is set to TRUE (returns TRUE). + * + * On exit with TRUE, test IP < CodeSize to know whether it comes from + * an instruction trap or a normal termination. + * + * + * Note: The documented DEBUG opcode pops a value from the stack. This + * behaviour is unsupported; here a DEBUG opcode is always an + * error. + * + * + * THIS IS THE INTERPRETER'S MAIN LOOP. + * + */ + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( FT_Error ) + TT_RunIns( void* exec ) + { + TT_ExecContext exc = (TT_ExecContext)exec; + + FT_ULong ins_counter = 0; /* executed instructions counter */ + FT_ULong num_twilight_points; + FT_UShort i; + + + /* We restrict the number of twilight points to a reasonable, */ + /* heuristic value to avoid slow execution of malformed bytecode. */ + num_twilight_points = FT_MAX( 30, + 2 * ( exc->pts.n_points + exc->cvtSize ) ); + if ( exc->twilight.n_points > num_twilight_points ) + { + if ( num_twilight_points > 0xFFFFU ) + num_twilight_points = 0xFFFFU; + + FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" )); + FT_TRACE5(( " from %d to the more reasonable value %ld\n", + exc->twilight.n_points, + num_twilight_points )); + exc->twilight.n_points = (FT_UShort)num_twilight_points; + } + + /* Set up loop detectors. We restrict the number of LOOPCALL loops */ + /* and the number of JMPR, JROT, and JROF calls with a negative */ + /* argument to values that depend on various parameters like the */ + /* size of the CVT table or the number of points in the current */ + /* glyph (if applicable). */ + /* */ + /* The idea is that in real-world bytecode you either iterate over */ + /* all CVT entries (in the `prep' table), or over all points (or */ + /* contours, in the `glyf' table) of a glyph, and such iterations */ + /* don't happen very often. */ + exc->loopcall_counter = 0; + exc->neg_jump_counter = 0; + + /* The maximum values are heuristic. */ + if ( exc->pts.n_points ) + exc->loopcall_counter_max = FT_MAX( 50, + 10 * exc->pts.n_points ) + + FT_MAX( 50, + exc->cvtSize / 10 ); + else + exc->loopcall_counter_max = 300 + 22 * exc->cvtSize; + + /* as a protection against an unreasonable number of CVT entries */ + /* we assume at most 100 control values per glyph for the counter */ + if ( exc->loopcall_counter_max > + 100 * (FT_ULong)exc->face->root.num_glyphs ) + exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs; + + FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL" + " to %ld\n", exc->loopcall_counter_max )); + + exc->neg_jump_counter_max = exc->loopcall_counter_max; + FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps" + " to %ld\n", exc->neg_jump_counter_max )); + + /* set PPEM and CVT functions */ + exc->tt_metrics.ratio = 0; + if ( exc->metrics.x_ppem != exc->metrics.y_ppem ) + { + /* non-square pixels, use the stretched routines */ + exc->func_cur_ppem = Current_Ppem_Stretched; + exc->func_read_cvt = Read_CVT_Stretched; + exc->func_write_cvt = Write_CVT_Stretched; + exc->func_move_cvt = Move_CVT_Stretched; + } + else + { + /* square pixels, use normal routines */ + exc->func_cur_ppem = Current_Ppem; + exc->func_read_cvt = Read_CVT; + exc->func_write_cvt = Write_CVT; + exc->func_move_cvt = Move_CVT; + } + + exc->iniRange = exc->curRange; + + Compute_Funcs( exc ); + Compute_Round( exc, (FT_Byte)exc->GS.round_state ); + + /* These flags cancel execution of some opcodes after IUP is called */ +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + exc->iupx_called = FALSE; + exc->iupy_called = FALSE; +#endif + + do + { + exc->opcode = exc->code[exc->IP]; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ft_trace_levels[trace_ttinterp] >= 6 ) + { + FT_Long cnt = FT_MIN( 8, exc->top ); + FT_Long n; + + + /* if tracing level is 7, show current code position */ + /* and the first few stack elements also */ + FT_TRACE6(( " " )); + FT_TRACE7(( "%06ld ", exc->IP )); + FT_TRACE6(( "%s", opcode_name[exc->opcode] + 2 )); + FT_TRACE7(( "%*s", *opcode_name[exc->opcode] == 'A' + ? 2 + : 12 - ( *opcode_name[exc->opcode] - '0' ), + "#" )); + for ( n = 1; n <= cnt; n++ ) + FT_TRACE7(( " %ld", exc->stack[exc->top - n] )); + FT_TRACE6(( "\n" )); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + if ( ( exc->length = opcode_length[exc->opcode] ) < 0 ) + { + if ( exc->IP + 1 >= exc->codeSize ) + goto LErrorCodeOverflow_; + + exc->length = 2 - exc->length * exc->code[exc->IP + 1]; + } + + if ( exc->IP + exc->length > exc->codeSize ) + goto LErrorCodeOverflow_; + + /* First, let's check for empty stack and overflow */ + exc->args = exc->top - ( Pop_Push_Count[exc->opcode] >> 4 ); + + /* `args' is the top of the stack once arguments have been popped. */ + /* One can also interpret it as the index of the last argument. */ + if ( exc->args < 0 ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Too_Few_Arguments ); + goto LErrorLabel_; + } + + /* push zeroes onto the stack */ + for ( i = 0; i < Pop_Push_Count[exc->opcode] >> 4; i++ ) + exc->stack[i] = 0; + exc->args = 0; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( exc->opcode == 0x91 ) + { + /* this is very special: GETVARIATION returns */ + /* a variable number of arguments */ + + /* it is the job of the application to `activate' GX handling, */ + /* that is, calling any of the GX API functions on the current */ + /* font to select a variation instance */ + if ( exc->face->blend ) + exc->new_top = exc->args + exc->face->blend->num_axis; + } + else +#endif + exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 ); + + /* `new_top' is the new top of the stack, after the instruction's */ + /* execution. `top' will be set to `new_top' after the `switch' */ + /* statement. */ + if ( exc->new_top > exc->stackSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + goto LErrorLabel_; + } + + exc->step_ins = TRUE; + exc->error = FT_Err_Ok; + + { + FT_Long* args = exc->stack + exc->args; + FT_Byte opcode = exc->opcode; + + + switch ( opcode ) + { + case 0x00: /* SVTCA y */ + case 0x01: /* SVTCA x */ + case 0x02: /* SPvTCA y */ + case 0x03: /* SPvTCA x */ + case 0x04: /* SFvTCA y */ + case 0x05: /* SFvTCA x */ + Ins_SxyTCA( exc ); + break; + + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + Ins_SPVTL( exc, args ); + break; + + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + Ins_SFVTL( exc, args ); + break; + + case 0x0A: /* SPvFS */ + Ins_SPVFS( exc, args ); + break; + + case 0x0B: /* SFvFS */ + Ins_SFVFS( exc, args ); + break; + + case 0x0C: /* GPv */ + Ins_GPV( exc, args ); + break; + + case 0x0D: /* GFv */ + Ins_GFV( exc, args ); + break; + + case 0x0E: /* SFvTPv */ + Ins_SFVTPV( exc ); + break; + + case 0x0F: /* ISECT */ + Ins_ISECT( exc, args ); + break; + + case 0x10: /* SRP0 */ + Ins_SRP0( exc, args ); + break; + + case 0x11: /* SRP1 */ + Ins_SRP1( exc, args ); + break; + + case 0x12: /* SRP2 */ + Ins_SRP2( exc, args ); + break; + + case 0x13: /* SZP0 */ + Ins_SZP0( exc, args ); + break; + + case 0x14: /* SZP1 */ + Ins_SZP1( exc, args ); + break; + + case 0x15: /* SZP2 */ + Ins_SZP2( exc, args ); + break; + + case 0x16: /* SZPS */ + Ins_SZPS( exc, args ); + break; + + case 0x17: /* SLOOP */ + Ins_SLOOP( exc, args ); + break; + + case 0x18: /* RTG */ + Ins_RTG( exc ); + break; + + case 0x19: /* RTHG */ + Ins_RTHG( exc ); + break; + + case 0x1A: /* SMD */ + Ins_SMD( exc, args ); + break; + + case 0x1B: /* ELSE */ + Ins_ELSE( exc ); + break; + + case 0x1C: /* JMPR */ + Ins_JMPR( exc, args ); + break; + + case 0x1D: /* SCVTCI */ + Ins_SCVTCI( exc, args ); + break; + + case 0x1E: /* SSWCI */ + Ins_SSWCI( exc, args ); + break; + + case 0x1F: /* SSW */ + Ins_SSW( exc, args ); + break; + + case 0x20: /* DUP */ + Ins_DUP( args ); + break; + + case 0x21: /* POP */ + Ins_POP(); + break; + + case 0x22: /* CLEAR */ + Ins_CLEAR( exc ); + break; + + case 0x23: /* SWAP */ + Ins_SWAP( args ); + break; + + case 0x24: /* DEPTH */ + Ins_DEPTH( exc, args ); + break; + + case 0x25: /* CINDEX */ + Ins_CINDEX( exc, args ); + break; + + case 0x26: /* MINDEX */ + Ins_MINDEX( exc, args ); + break; + + case 0x27: /* ALIGNPTS */ + Ins_ALIGNPTS( exc, args ); + break; + + case 0x28: /* RAW */ + Ins_UNKNOWN( exc ); + break; + + case 0x29: /* UTP */ + Ins_UTP( exc, args ); + break; + + case 0x2A: /* LOOPCALL */ + Ins_LOOPCALL( exc, args ); + break; + + case 0x2B: /* CALL */ + Ins_CALL( exc, args ); + break; + + case 0x2C: /* FDEF */ + Ins_FDEF( exc, args ); + break; + + case 0x2D: /* ENDF */ + Ins_ENDF( exc ); + break; + + case 0x2E: /* MDAP */ + case 0x2F: /* MDAP */ + Ins_MDAP( exc, args ); + break; + + case 0x30: /* IUP */ + case 0x31: /* IUP */ + Ins_IUP( exc ); + break; + + case 0x32: /* SHP */ + case 0x33: /* SHP */ + Ins_SHP( exc ); + break; + + case 0x34: /* SHC */ + case 0x35: /* SHC */ + Ins_SHC( exc, args ); + break; + + case 0x36: /* SHZ */ + case 0x37: /* SHZ */ + Ins_SHZ( exc, args ); + break; + + case 0x38: /* SHPIX */ + Ins_SHPIX( exc, args ); + break; + + case 0x39: /* IP */ + Ins_IP( exc ); + break; + + case 0x3A: /* MSIRP */ + case 0x3B: /* MSIRP */ + Ins_MSIRP( exc, args ); + break; + + case 0x3C: /* AlignRP */ + Ins_ALIGNRP( exc ); + break; + + case 0x3D: /* RTDG */ + Ins_RTDG( exc ); + break; + + case 0x3E: /* MIAP */ + case 0x3F: /* MIAP */ + Ins_MIAP( exc, args ); + break; + + case 0x40: /* NPUSHB */ + Ins_NPUSHB( exc, args ); + break; + + case 0x41: /* NPUSHW */ + Ins_NPUSHW( exc, args ); + break; + + case 0x42: /* WS */ + Ins_WS( exc, args ); + break; + + case 0x43: /* RS */ + Ins_RS( exc, args ); + break; + + case 0x44: /* WCVTP */ + Ins_WCVTP( exc, args ); + break; + + case 0x45: /* RCVT */ + Ins_RCVT( exc, args ); + break; + + case 0x46: /* GC */ + case 0x47: /* GC */ + Ins_GC( exc, args ); + break; + + case 0x48: /* SCFS */ + Ins_SCFS( exc, args ); + break; + + case 0x49: /* MD */ + case 0x4A: /* MD */ + Ins_MD( exc, args ); + break; + + case 0x4B: /* MPPEM */ + Ins_MPPEM( exc, args ); + break; + + case 0x4C: /* MPS */ + Ins_MPS( exc, args ); + break; + + case 0x4D: /* FLIPON */ + Ins_FLIPON( exc ); + break; + + case 0x4E: /* FLIPOFF */ + Ins_FLIPOFF( exc ); + break; + + case 0x4F: /* DEBUG */ + Ins_DEBUG( exc ); + break; + + case 0x50: /* LT */ + Ins_LT( args ); + break; + + case 0x51: /* LTEQ */ + Ins_LTEQ( args ); + break; + + case 0x52: /* GT */ + Ins_GT( args ); + break; + + case 0x53: /* GTEQ */ + Ins_GTEQ( args ); + break; + + case 0x54: /* EQ */ + Ins_EQ( args ); + break; + + case 0x55: /* NEQ */ + Ins_NEQ( args ); + break; + + case 0x56: /* ODD */ + Ins_ODD( exc, args ); + break; + + case 0x57: /* EVEN */ + Ins_EVEN( exc, args ); + break; + + case 0x58: /* IF */ + Ins_IF( exc, args ); + break; + + case 0x59: /* EIF */ + Ins_EIF(); + break; + + case 0x5A: /* AND */ + Ins_AND( args ); + break; + + case 0x5B: /* OR */ + Ins_OR( args ); + break; + + case 0x5C: /* NOT */ + Ins_NOT( args ); + break; + + case 0x5D: /* DELTAP1 */ + Ins_DELTAP( exc, args ); + break; + + case 0x5E: /* SDB */ + Ins_SDB( exc, args ); + break; + + case 0x5F: /* SDS */ + Ins_SDS( exc, args ); + break; + + case 0x60: /* ADD */ + Ins_ADD( args ); + break; + + case 0x61: /* SUB */ + Ins_SUB( args ); + break; + + case 0x62: /* DIV */ + Ins_DIV( exc, args ); + break; + + case 0x63: /* MUL */ + Ins_MUL( args ); + break; + + case 0x64: /* ABS */ + Ins_ABS( args ); + break; + + case 0x65: /* NEG */ + Ins_NEG( args ); + break; + + case 0x66: /* FLOOR */ + Ins_FLOOR( args ); + break; + + case 0x67: /* CEILING */ + Ins_CEILING( args ); + break; + + case 0x68: /* ROUND */ + case 0x69: /* ROUND */ + case 0x6A: /* ROUND */ + case 0x6B: /* ROUND */ + Ins_ROUND( exc, args ); + break; + + case 0x6C: /* NROUND */ + case 0x6D: /* NROUND */ + case 0x6E: /* NRRUND */ + case 0x6F: /* NROUND */ + Ins_NROUND( exc, args ); + break; + + case 0x70: /* WCVTF */ + Ins_WCVTF( exc, args ); + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + Ins_DELTAP( exc, args ); + break; + + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + Ins_DELTAC( exc, args ); + break; + + case 0x76: /* SROUND */ + Ins_SROUND( exc, args ); + break; + + case 0x77: /* S45Round */ + Ins_S45ROUND( exc, args ); + break; + + case 0x78: /* JROT */ + Ins_JROT( exc, args ); + break; + + case 0x79: /* JROF */ + Ins_JROF( exc, args ); + break; + + case 0x7A: /* ROFF */ + Ins_ROFF( exc ); + break; + + case 0x7B: /* ???? */ + Ins_UNKNOWN( exc ); + break; + + case 0x7C: /* RUTG */ + Ins_RUTG( exc ); + break; + + case 0x7D: /* RDTG */ + Ins_RDTG( exc ); + break; + + case 0x7E: /* SANGW */ + Ins_SANGW(); + break; + + case 0x7F: /* AA */ + Ins_AA(); + break; + + case 0x80: /* FLIPPT */ + Ins_FLIPPT( exc ); + break; + + case 0x81: /* FLIPRGON */ + Ins_FLIPRGON( exc, args ); + break; + + case 0x82: /* FLIPRGOFF */ + Ins_FLIPRGOFF( exc, args ); + break; + + case 0x83: /* UNKNOWN */ + case 0x84: /* UNKNOWN */ + Ins_UNKNOWN( exc ); + break; + + case 0x85: /* SCANCTRL */ + Ins_SCANCTRL( exc, args ); + break; + + case 0x86: /* SDPvTL */ + case 0x87: /* SDPvTL */ + Ins_SDPVTL( exc, args ); + break; + + case 0x88: /* GETINFO */ + Ins_GETINFO( exc, args ); + break; + + case 0x89: /* IDEF */ + Ins_IDEF( exc, args ); + break; + + case 0x8A: /* ROLL */ + Ins_ROLL( args ); + break; + + case 0x8B: /* MAX */ + Ins_MAX( args ); + break; + + case 0x8C: /* MIN */ + Ins_MIN( args ); + break; + + case 0x8D: /* SCANTYPE */ + Ins_SCANTYPE( exc, args ); + break; + + case 0x8E: /* INSTCTRL */ + Ins_INSTCTRL( exc, args ); + break; + + case 0x8F: /* ADJUST */ + case 0x90: /* ADJUST */ + Ins_UNKNOWN( exc ); + break; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + case 0x91: + /* it is the job of the application to `activate' GX handling, */ + /* that is, calling any of the GX API functions on the current */ + /* font to select a variation instance */ + if ( exc->face->blend ) + Ins_GETVARIATION( exc, args ); + else + Ins_UNKNOWN( exc ); + break; + + case 0x92: + /* there is at least one MS font (LaoUI.ttf version 5.01) that */ + /* uses IDEFs for 0x91 and 0x92; for this reason we activate */ + /* GETDATA for GX fonts only, similar to GETVARIATION */ + if ( exc->face->blend ) + Ins_GETDATA( args ); + else + Ins_UNKNOWN( exc ); + break; +#endif + + default: + if ( opcode >= 0xE0 ) + Ins_MIRP( exc, args ); + else if ( opcode >= 0xC0 ) + Ins_MDRP( exc, args ); + else if ( opcode >= 0xB8 ) + Ins_PUSHW( exc, args ); + else if ( opcode >= 0xB0 ) + Ins_PUSHB( exc, args ); + else + Ins_UNKNOWN( exc ); + } + } + + if ( exc->error ) + { + switch ( exc->error ) + { + /* looking for redefined instructions */ + case FT_ERR( Invalid_Opcode ): + { + TT_DefRecord* def = exc->IDefs; + TT_DefRecord* limit = FT_OFFSET( def, exc->numIDefs ); + + + for ( ; def < limit; def++ ) + { + if ( def->active && exc->opcode == (FT_Byte)def->opc ) + { + TT_CallRec* callrec; + + + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Invalid_Reference ); + goto LErrorLabel_; + } + + callrec = &exc->callStack[exc->callTop]; + + callrec->Caller_Range = exc->curRange; + callrec->Caller_IP = exc->IP + 1; + callrec->Cur_Count = 1; + callrec->Def = def; + + if ( Ins_Goto_CodeRange( exc, + def->range, + def->start ) == FAILURE ) + goto LErrorLabel_; + + goto LSuiteLabel_; + } + } + } + + exc->error = FT_THROW( Invalid_Opcode ); + goto LErrorLabel_; + +#if 0 + break; /* Unreachable code warning suppression. */ + /* Leave to remind in case a later change the editor */ + /* to consider break; */ +#endif + + default: + goto LErrorLabel_; + +#if 0 + break; +#endif + } + } + + exc->top = exc->new_top; + + if ( exc->step_ins ) + exc->IP += exc->length; + + /* increment instruction counter and check if we didn't */ + /* run this program for too long (e.g. infinite loops). */ + if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES ) + { + exc->error = FT_THROW( Execution_Too_Long ); + goto LErrorLabel_; + } + + LSuiteLabel_: + if ( exc->IP >= exc->codeSize ) + { + if ( exc->callTop > 0 ) + { + exc->error = FT_THROW( Code_Overflow ); + goto LErrorLabel_; + } + else + goto LNo_Error_; + } + } while ( !exc->instruction_trap ); + + LNo_Error_: + FT_TRACE4(( " %ld instruction%s executed\n", + ins_counter, + ins_counter == 1 ? "" : "s" )); + + return FT_Err_Ok; + + LErrorCodeOverflow_: + exc->error = FT_THROW( Code_Overflow ); + + LErrorLabel_: + if ( exc->error && !exc->instruction_trap ) + FT_TRACE1(( " The interpreter returned error 0x%x\n", exc->error )); + + return exc->error; + } + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + /* ANSI C doesn't like empty source files */ + typedef int tt_interp_dummy_; + +#endif /* !TT_USE_BYTECODE_INTERPRETER */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttinterp.h b/external/freetype/src/truetype/ttinterp.h new file mode 100644 index 000000000..e98e258fe --- /dev/null +++ b/external/freetype/src/truetype/ttinterp.h @@ -0,0 +1,465 @@ +/**************************************************************************** + * + * ttinterp.h + * + * TrueType bytecode interpreter (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTINTERP_H_ +#define TTINTERP_H_ + +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * Rounding mode constants. + */ +#define TT_Round_Off 5 +#define TT_Round_To_Half_Grid 0 +#define TT_Round_To_Grid 1 +#define TT_Round_To_Double_Grid 2 +#define TT_Round_Up_To_Grid 4 +#define TT_Round_Down_To_Grid 3 +#define TT_Round_Super 6 +#define TT_Round_Super_45 7 + + + /************************************************************************** + * + * Function types used by the interpreter, depending on various modes + * (e.g. the rounding mode, whether to render a vertical or horizontal + * line etc). + * + */ + + /* Rounding function */ + typedef FT_F26Dot6 + (*TT_Round_Func)( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_Int color ); + + /* Point displacement along the freedom vector routine */ + typedef void + (*TT_Move_Func)( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ); + + /* Distance projection along one of the projection vectors */ + typedef FT_F26Dot6 + (*TT_Project_Func)( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ); + + /* getting current ppem. Take care of non-square pixels if necessary */ + typedef FT_Long + (*TT_Cur_Ppem_Func)( TT_ExecContext exc ); + + /* reading a cvt value. Take care of non-square pixels if necessary */ + typedef FT_F26Dot6 + (*TT_Get_CVT_Func)( TT_ExecContext exc, + FT_ULong idx ); + + /* setting or moving a cvt value. Take care of non-square pixels */ + /* if necessary */ + typedef void + (*TT_Set_CVT_Func)( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ); + + + /************************************************************************** + * + * This structure defines a call record, used to manage function calls. + */ + typedef struct TT_CallRec_ + { + FT_Int Caller_Range; + FT_Long Caller_IP; + FT_Long Cur_Count; + + TT_DefRecord *Def; /* either FDEF or IDEF */ + + } TT_CallRec, *TT_CallStack; + + + /************************************************************************** + * + * The main structure for the interpreter which collects all necessary + * variables and states. + * + * Members that are initialized by `TT_Load_Context` are marked with '!'. + * Members that are initialized by `TT_Run_Context` are marked with '@'. + */ + typedef struct TT_ExecContextRec_ + { + TT_Face face; /* ! */ + TT_Size size; /* ! */ + FT_Memory memory; + + /* instructions state */ + + FT_Error error; /* last execution error */ + + FT_Long top; /* @ top of exec. stack */ + + FT_Long stackSize; /* ! size of exec. stack */ + FT_Long* stack; /* ! current exec. stack */ + + FT_Long args; + FT_Long new_top; /* new top after exec. */ + + TT_GlyphZoneRec zp0, /* @! zone records */ + zp1, /* @! */ + zp2, /* @! */ + pts, /* ! */ + twilight; /* ! */ + + FT_Long pointSize; /* ! in 26.6 format */ + FT_Size_Metrics metrics; /* ! */ + TT_Size_Metrics tt_metrics; /* ! size metrics */ + + TT_GraphicsState GS; /* !@ current graphics state */ + + FT_Int iniRange; /* initial code range number */ + FT_Int curRange; /* current code range number */ + FT_Byte* code; /* current code range */ + FT_Long IP; /* current instruction pointer */ + FT_Long codeSize; /* size of current range */ + + FT_Byte opcode; /* current opcode */ + FT_Int length; /* length of current opcode */ + + FT_Bool step_ins; /* true if the interpreter must */ + /* increment IP after ins. exec */ + FT_ULong cvtSize; /* ! */ + FT_Long* cvt; /* ! */ + FT_ULong glyfCvtSize; + FT_Long* glyfCvt; /* cvt working copy for glyph */ + + FT_UInt glyphSize; /* ! glyph instructions buffer size */ + FT_Byte* glyphIns; /* ! glyph instructions buffer */ + + FT_UInt numFDefs; /* ! number of function defs */ + FT_UInt maxFDefs; /* ! maximum number of function defs */ + TT_DefArray FDefs; /* table of FDefs entries */ + + FT_UInt numIDefs; /* ! number of instruction defs */ + FT_UInt maxIDefs; /* ! maximum number of ins defs */ + TT_DefArray IDefs; /* table of IDefs entries */ + + FT_UInt maxFunc; /* ! maximum function index */ + FT_UInt maxIns; /* ! maximum instruction index */ + + FT_Int callTop, /* @ top of call stack during execution */ + callSize; /* size of call stack */ + TT_CallStack callStack; /* call stack */ + + FT_UShort maxPoints; /* capacity of this context's `pts' */ + FT_Short maxContours; /* record, expressed in points and */ + /* contours. */ + + TT_CodeRangeTable codeRangeTable; /* ! table of valid code ranges */ + /* useful for the debugger */ + + FT_UShort storeSize; /* ! size of current storage */ + FT_Long* storage; /* ! storage area */ + FT_UShort glyfStoreSize; + FT_Long* glyfStorage; /* storage working copy for glyph */ + + FT_F26Dot6 period; /* values used for the */ + FT_F26Dot6 phase; /* `SuperRounding' */ + FT_F26Dot6 threshold; + + FT_Bool instruction_trap; /* ! If `True', the interpreter */ + /* exits after each instruction */ + + TT_GraphicsState default_GS; /* graphics state resulting from */ + /* the prep program */ + FT_Bool is_composite; /* true if the glyph is composite */ + FT_Bool pedantic_hinting; /* true if pedantic interpretation */ + + /* latest interpreter additions */ + + FT_Long F_dot_P; /* dot product of freedom and projection */ + /* vectors */ + TT_Round_Func func_round; /* current rounding function */ + + TT_Project_Func func_project, /* current projection function */ + func_dualproj, /* current dual proj. function */ + func_freeProj; /* current freedom proj. func */ + + TT_Move_Func func_move; /* current point move function */ + TT_Move_Func func_move_orig; /* move original position function */ + + TT_Cur_Ppem_Func func_cur_ppem; /* get current proj. ppem value */ + + TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ + TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ + TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ + + FT_Bool grayscale; /* bi-level hinting and */ + /* grayscale rendering */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* + * FreeType supports ClearType-like hinting of TrueType fonts through + * the version 40 interpreter. This is achieved through several hacks + * in the base (v35) interpreter, as detailed below. + * + * ClearType is an umbrella term for several rendering techniques + * employed by Microsoft's various GUI and rendering toolkit + * implementations, most importantly: subpixel rendering for using the + * RGB subpixels of LCDs to approximately triple the perceived + * resolution on the x-axis and subpixel hinting for positioning stems + * on subpixel borders. TrueType programming is explicit, i.e., fonts + * must be programmed to take advantage of ClearType's possibilities. + * + * When ClearType was introduced, it seemed unlikely that all fonts + * would be reprogrammed, so Microsoft decided to implement a backward + * compatibility mode. It employs several simple to complicated + * assumptions and tricks, many of them font-dependent, that modify the + * interpretation of the bytecode contained in these fonts to retrofit + * them into a ClearType-y look. The quality of the results varies. + * Most (web)fonts that were released since then have come to rely on + * these hacks to render correctly, even some of Microsoft's flagship + * fonts (e.g., Calibri, Cambria, Segoe UI). + * + * FreeType's minimal subpixel hinting code (interpreter version 40) + * employs a small list of font-agnostic hacks loosely based on the + * public information available on Microsoft's compatibility mode[2]. + * The focus is on modern (web)fonts rather than legacy fonts that were + * made for monochrome rendering. It will not match ClearType rendering + * exactly. Unlike the `Infinality' code (interpreter version 38) that + * came before, it will not try to toggle hacks for specific fonts for + * performance and complexity reasons. It will fall back to version 35 + * behavior for tricky fonts[1] or when monochrome rendering is + * requested. + * + * Major hacks + * + * - Any point movement on the x axis is ignored (cf. `Direct_Move' and + * `Direct_Move_X'). This has the smallest code footprint and single + * biggest effect. The ClearType way to increase resolution is + * supersampling the x axis, the FreeType way is ignoring instructions + * on the x axis, which gives the same result in the majority of + * cases. + * + * - Points are not moved post-IUP (neither on the x nor on the y axis), + * except the x component of diagonal moves post-IUP (cf. + * `Direct_Move', `Direct_Move_Y', `Move_Zp2_Point'). Post-IUP + * changes are commonly used to `fix' pixel patterns which has little + * use outside monochrome rendering. + * + * - SHPIX and DELTAP don't execute unless moving a composite on the + * y axis or moving a previously y touched point. SHPIX additionally + * denies movement on the x axis (cf. `Ins_SHPIX' and `Ins_DELTAP'). + * Both instructions are commonly used to `fix' pixel patterns for + * monochrome or Windows's GDI rendering but make little sense for + * FreeType rendering. Both can distort the outline. See [2] for + * details. + * + * - The hdmx table and modifications to phantom points are ignored. + * Bearings and advance widths remain unchanged (except rounding them + * outside the interpreter!), cf. `compute_glyph_metrics' and + * `TT_Hint_Glyph'. Letting non-native-ClearType fonts modify spacing + * might mess up spacing. + * + * Minor hacks + * + * - FLIPRGON, FLIPRGOFF, and FLIPPT don't execute post-IUP. This + * prevents dents in e.g. Arial-Regular's `D' and `G' glyphs at + * various sizes. + * + * (Post-IUP is the state after both IUP[x] and IUP[y] have been + * executed.) + * + * The best results are achieved for fonts that were from the outset + * designed with ClearType in mind, meaning they leave the x axis mostly + * alone and don't mess with the `final' outline to produce more + * pleasing pixel patterns. The harder the designer tried to produce + * very specific patterns (`superhinting') for pre-ClearType-displays, + * the worse the results. + * + * Microsoft defines a way to turn off backward compatibility and + * interpret instructions as before (called `native ClearType')[2][3]. + * The font designer then regains full control and is responsible for + * making the font work correctly with ClearType without any + * hand-holding by the interpreter or rasterizer[4]. The v40 + * interpreter assumes backward compatibility by default, which can be + * turned off the same way by executing the following in the control + * program (cf. `Ins_INSTCTRL'). + * + * #PUSH 4,3 + * INSTCTRL[] + * + * [1] Tricky fonts as FreeType defines them rely on the bytecode + * interpreter to display correctly. Hacks can interfere with them, + * so they get treated like native ClearType fonts (v40 with + * backward compatibility turned off). Cf. `TT_RunIns'. + * + * [2] Proposed by Microsoft's Greg Hitchcock in + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + * + * [3] Beat Stamm describes it in more detail: + * http://rastertragedy.com/RTRCh4.htm#Sec12. + * + * [4] The list of `native ClearType' fonts is small at the time of this + * writing; I found the following on a Windows 10 Update 1511 + * installation: Constantia, Corbel, Sitka, Malgun Gothic, Microsoft + * JhengHei (Bold and UI Bold), Microsoft YaHei (Bold and UI Bold), + * SimSun, NSimSun, and Yu Gothic. + * + */ + + /* Using v40 implies subpixel hinting, unless FT_RENDER_MODE_MONO has been + * requested. Used to detect interpreter */ + /* version switches. `_lean' to differentiate from the Infinality */ + /* `subpixel_hinting', which is managed differently. */ + FT_Bool subpixel_hinting_lean; + + /* Long side of a LCD subpixel is vertical (e.g., screen is rotated). */ + /* `_lean' to differentiate from the Infinality `vertical_lcd', which */ + /* is managed differently. */ + FT_Bool vertical_lcd_lean; + + /* Default to backward compatibility mode in v40 interpreter. If */ + /* this is false, it implies the interpreter is in v35 or in native */ + /* ClearType mode. */ + FT_Bool backward_compatibility; + + /* Useful for detecting and denying post-IUP trickery that is usually */ + /* used to fix pixel patterns (`superhinting'). */ + FT_Bool iupx_called; + FT_Bool iupy_called; + + /* ClearType hinting and grayscale rendering, as used by Universal */ + /* Windows Platform apps (Windows 8 and above). Like the standard */ + /* colorful ClearType mode, it utilizes a vastly increased virtual */ + /* resolution on the x axis. Different from bi-level hinting and */ + /* grayscale rendering, the old mode from Win9x days that roughly */ + /* adheres to the physical pixel grid on both axes. */ + FT_Bool grayscale_cleartype; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ + + /* We maintain two counters (in addition to the instruction counter) */ + /* that act as loop detectors for LOOPCALL and jump opcodes with */ + /* negative arguments. */ + FT_ULong loopcall_counter; + FT_ULong loopcall_counter_max; + FT_ULong neg_jump_counter; + FT_ULong neg_jump_counter_max; + + } TT_ExecContextRec; + + + extern const TT_GraphicsState tt_default_graphics_state; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_LOCAL( void ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ); + + FT_LOCAL( void ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ); + + FT_LOCAL( void ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ); +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /************************************************************************** + * + * @Function: + * TT_New_Context + * + * @Description: + * Create a `TT_ExecContext`. Note that there is now an execution + * context per `TT_Size` that is not shared among faces. + * + * @Input: + * driver :: + * A handle to the driver, used for memory allocation. + * + * @Return: + * A handle to a new empty execution context. + * + * @Note: + * Only the glyph loader and debugger should call this function. + * (And right now only the glyph loader uses it.) + */ + FT_EXPORT( TT_ExecContext ) + TT_New_Context( TT_Driver driver ); + + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_LOCAL( void ) + TT_Done_Context( TT_ExecContext exec ); + + FT_LOCAL( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ); + + FT_LOCAL( void ) + TT_Save_Context( TT_ExecContext exec, + TT_Size ins ); + + FT_LOCAL( FT_Error ) + TT_Run_Context( TT_ExecContext exec ); +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /************************************************************************** + * + * @Function: + * TT_RunIns + * + * @Description: + * Executes one or more instruction in the execution context. This + * is the main function of the TrueType opcode interpreter. + * + * @Input: + * exec :: + * A handle to the target execution context. + * + * @Return: + * FreeType error code. 0 means success. + * + * @Note: + * Only the object manager and debugger should call this function. + * + * This function is publicly exported because it is directly + * invoked by the TrueType debugger. + */ + FT_EXPORT( FT_Error ) + TT_RunIns( void* exec ); + + +FT_END_HEADER + +#endif /* TTINTERP_H_ */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttobjs.c b/external/freetype/src/truetype/ttobjs.c new file mode 100644 index 000000000..5b56af711 --- /dev/null +++ b/external/freetype/src/truetype/ttobjs.c @@ -0,0 +1,1539 @@ +/**************************************************************************** + * + * ttobjs.c + * + * Objects manager (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> +#include <freetype/internal/sfnt.h> +#include <freetype/ftdriver.h> + +#include "ttgload.h" +#include "ttpload.h" + +#include "tterrors.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttobjs + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /************************************************************************** + * + * GLYPH ZONE FUNCTIONS + * + */ + + + /************************************************************************** + * + * @Function: + * tt_glyphzone_done + * + * @Description: + * Deallocate a glyph zone. + * + * @Input: + * zone :: + * A pointer to the target glyph zone. + */ + FT_LOCAL_DEF( void ) + tt_glyphzone_done( TT_GlyphZone zone ) + { + FT_Memory memory = zone->memory; + + + if ( memory ) + { + FT_FREE( zone->contours ); + FT_FREE( zone->tags ); + FT_FREE( zone->cur ); + FT_FREE( zone->org ); + FT_FREE( zone->orus ); + + zone->max_points = zone->n_points = 0; + zone->max_contours = zone->n_contours = 0; + zone->memory = NULL; + } + } + + + /************************************************************************** + * + * @Function: + * tt_glyphzone_new + * + * @Description: + * Allocate a new glyph zone. + * + * @Input: + * memory :: + * A handle to the current memory object. + * + * maxPoints :: + * The capacity of glyph zone in points. + * + * maxContours :: + * The capacity of glyph zone in contours. + * + * @Output: + * zone :: + * A pointer to the target glyph zone record. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ) + { + FT_Error error; + + + FT_ZERO( zone ); + zone->memory = memory; + + if ( FT_NEW_ARRAY( zone->org, maxPoints ) || + FT_NEW_ARRAY( zone->cur, maxPoints ) || + FT_NEW_ARRAY( zone->orus, maxPoints ) || + FT_NEW_ARRAY( zone->tags, maxPoints ) || + FT_NEW_ARRAY( zone->contours, maxContours ) ) + { + tt_glyphzone_done( zone ); + } + else + { + zone->max_points = maxPoints; + zone->max_contours = maxContours; + } + + return error; + } + + + /* + * Fonts embedded in PDFs are made unique by prepending randomization + * prefixes to their names: as defined in Section 5.5.3, 'Font Subsets', + * of the PDF Reference, they consist of 6 uppercase letters followed by + * the `+` sign. For safety, we do not skip prefixes violating this rule. + */ + + static const FT_String* + tt_skip_pdffont_random_tag( const FT_String* name ) + { + unsigned int i; + + + if ( ft_strlen( name ) < 8 || name[6] != '+' ) + return name; + + for ( i = 0; i < 6; i++ ) + if ( !ft_isupper( name[i] ) ) + return name; + + FT_TRACE7(( "name without randomization tag: %s\n", name + 7 )); + return name + 7; + } + + + /* Compare the face with a list of well-known `tricky' fonts. */ + /* This list shall be expanded as we find more of them. */ + + static FT_Bool + tt_check_trickyness_family( const FT_String* name ) + { + +#define TRICK_NAMES_MAX_CHARACTERS 19 +#define TRICK_NAMES_COUNT 20 + + static const char trick_names[TRICK_NAMES_COUNT] + [TRICK_NAMES_MAX_CHARACTERS + 1] = + { + /* + PostScript names are given in brackets if they differ from the + family name. The version numbers, together with the copyright or + release year data, are taken from fonts available to the + developers. + + Note that later versions of the fonts might be no longer tricky; + for example, `MingLiU' version 7.00 (file `mingliu.ttc' from + Windows 7) is an ordinary TTC with non-tricky subfonts. + */ + + "cpop", /* dftt-p7.ttf; version 1.00, 1992 [DLJGyShoMedium] */ + "DFGirl-W6-WIN-BF", /* dftt-h6.ttf; version 1.00, 1993 */ + "DFGothic-EB", /* DynaLab Inc. 1992-1995 */ + "DFGyoSho-Lt", /* DynaLab Inc. 1992-1995 */ + "DFHei", /* DynaLab Inc. 1992-1995 [DFHei-Bd-WIN-HK-BF] */ + /* covers "DFHei-Md-HK-BF", maybe DynaLab Inc. */ + + "DFHSGothic-W5", /* DynaLab Inc. 1992-1995 */ + "DFHSMincho-W3", /* DynaLab Inc. 1992-1995 */ + "DFHSMincho-W7", /* DynaLab Inc. 1992-1995 */ + "DFKaiSho-SB", /* dfkaisb.ttf */ + "DFKaiShu", /* covers "DFKaiShu-Md-HK-BF", maybe DynaLab Inc. */ + "DFKai-SB", /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */ + + "DFMing", /* DynaLab Inc. 1992-1995 [DFMing-Md-WIN-HK-BF] */ + /* covers "DFMing-Bd-HK-BF", maybe DynaLab Inc. */ + + "DLC", /* dftt-m7.ttf; version 1.00, 1993 [DLCMingBold] */ + /* dftt-f5.ttf; version 1.00, 1993 [DLCFongSung] */ + /* covers following */ + /* "DLCHayMedium", dftt-b5.ttf; version 1.00, 1993 */ + /* "DLCHayBold", dftt-b7.ttf; version 1.00, 1993 */ + /* "DLCKaiMedium", dftt-k5.ttf; version 1.00, 1992 */ + /* "DLCLiShu", dftt-l5.ttf; version 1.00, 1992 */ + /* "DLCRoundBold", dftt-r7.ttf; version 1.00, 1993 */ + + "HuaTianKaiTi?", /* htkt2.ttf */ + "HuaTianSongTi?", /* htst3.ttf */ + "Ming(for ISO10646)", /* hkscsiic.ttf; version 0.12, 2007 [Ming] */ + /* iicore.ttf; version 0.07, 2007 [Ming] */ + "MingLiU", /* mingliu.ttf */ + /* mingliu.ttc; version 3.21, 2001 */ + "MingMedium", /* dftt-m5.ttf; version 1.00, 1993 [DLCMingMedium] */ + "PMingLiU", /* mingliu.ttc; version 3.21, 2001 */ + "MingLi43", /* mingli.ttf; version 1.00, 1992 */ + }; + + int nn; + const FT_String* name_without_tag; + + + name_without_tag = tt_skip_pdffont_random_tag( name ); + for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) + if ( ft_strstr( name_without_tag, trick_names[nn] ) ) + return TRUE; + + return FALSE; + } + + + /* XXX: This function should be in the `sfnt' module. */ + + /* Some PDF generators clear the checksums in the TrueType header table. */ + /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */ + /* Printer clears the entries for subsetted subtables. We thus have to */ + /* recalculate the checksums where necessary. */ + + static FT_UInt32 + tt_synth_sfnt_checksum( FT_Stream stream, + FT_ULong length ) + { + FT_Error error; + FT_UInt32 checksum = 0; + FT_UInt i; + + + if ( FT_FRAME_ENTER( length ) ) + return 0; + + for ( ; length > 3; length -= 4 ) + checksum += (FT_UInt32)FT_GET_ULONG(); + + for ( i = 3; length > 0; length--, i-- ) + checksum += (FT_UInt32)FT_GET_BYTE() << ( i * 8 ); + + FT_FRAME_EXIT(); + + return checksum; + } + + + /* XXX: This function should be in the `sfnt' module. */ + + static FT_ULong + tt_get_sfnt_checksum( TT_Face face, + FT_UShort i ) + { +#if 0 /* if we believe the written value, use following part. */ + if ( face->dir_tables[i].CheckSum ) + return face->dir_tables[i].CheckSum; +#endif + + if ( !face->goto_table ) + return 0; + + if ( face->goto_table( face, + face->dir_tables[i].Tag, + face->root.stream, + NULL ) ) + return 0; + + return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream, + face->dir_tables[i].Length ); + } + + + typedef struct tt_sfnt_id_rec_ + { + FT_ULong CheckSum; + FT_ULong Length; + + } tt_sfnt_id_rec; + + + static FT_Bool + tt_check_trickyness_sfnt_ids( TT_Face face ) + { +#define TRICK_SFNT_IDS_PER_FACE 3 +#define TRICK_SFNT_IDS_NUM_FACES 31 + + static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] + [TRICK_SFNT_IDS_PER_FACE] = + { + +#define TRICK_SFNT_ID_cvt 0 +#define TRICK_SFNT_ID_fpgm 1 +#define TRICK_SFNT_ID_prep 2 + + { /* MingLiU 1995 */ + { 0x05BCF058UL, 0x000002E4UL }, /* cvt */ + { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */ + { 0xA344A1EAUL, 0x000001E1UL } /* prep */ + }, + { /* MingLiU 1996- */ + { 0x05BCF058UL, 0x000002E4UL }, /* cvt */ + { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */ + { 0xA344A1EBUL, 0x000001E1UL } /* prep */ + }, + { /* DFGothic-EB */ + { 0x12C3EBB2UL, 0x00000350UL }, /* cvt */ + { 0xB680EE64UL, 0x000087A7UL }, /* fpgm */ + { 0xCE939563UL, 0x00000758UL } /* prep */ + }, + { /* DFGyoSho-Lt */ + { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ + { 0xCE5956E9UL, 0x0000BC85UL }, /* fpgm */ + { 0x8272F416UL, 0x00000045UL } /* prep */ + }, + { /* DFHei-Md-HK-BF */ + { 0x1257EB46UL, 0x00000350UL }, /* cvt */ + { 0xF699D160UL, 0x0000715FUL }, /* fpgm */ + { 0xD222F568UL, 0x000003BCUL } /* prep */ + }, + { /* DFHSGothic-W5 */ + { 0x1262EB4EUL, 0x00000350UL }, /* cvt */ + { 0xE86A5D64UL, 0x00007940UL }, /* fpgm */ + { 0x7850F729UL, 0x000005FFUL } /* prep */ + }, + { /* DFHSMincho-W3 */ + { 0x122DEB0AUL, 0x00000350UL }, /* cvt */ + { 0x3D16328AUL, 0x0000859BUL }, /* fpgm */ + { 0xA93FC33BUL, 0x000002CBUL } /* prep */ + }, + { /* DFHSMincho-W7 */ + { 0x125FEB26UL, 0x00000350UL }, /* cvt */ + { 0xA5ACC982UL, 0x00007EE1UL }, /* fpgm */ + { 0x90999196UL, 0x0000041FUL } /* prep */ + }, + { /* DFKaiShu */ + { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ + { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */ + { 0x13A42602UL, 0x0000007EUL } /* prep */ + }, + { /* DFKaiShu, variant */ + { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ + { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */ + { 0x13A42602UL, 0x0000007EUL } /* prep */ + }, + { /* DFKaiShu-Md-HK-BF */ + { 0x11E5EAD4UL, 0x00000360UL }, /* cvt */ + { 0x9DB282B2UL, 0x0000C06EUL }, /* fpgm */ + { 0x53E6D7CAUL, 0x00000082UL } /* prep */ + }, + { /* DFMing-Bd-HK-BF */ + { 0x1243EB18UL, 0x00000350UL }, /* cvt */ + { 0xBA0A8C30UL, 0x000074ADUL }, /* fpgm */ + { 0xF3D83409UL, 0x0000037BUL } /* prep */ + }, + { /* DLCLiShu */ + { 0x07DCF546UL, 0x00000308UL }, /* cvt */ + { 0x40FE7C90UL, 0x00008E2AUL }, /* fpgm */ + { 0x608174B5UL, 0x0000007AUL } /* prep */ + }, + { /* DLCHayBold */ + { 0xEB891238UL, 0x00000308UL }, /* cvt */ + { 0xD2E4DCD4UL, 0x0000676FUL }, /* fpgm */ + { 0x8EA5F293UL, 0x000003B8UL } /* prep */ + }, + { /* HuaTianKaiTi */ + { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */ + { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */ + { 0x70020112UL, 0x00000008UL } /* prep */ + }, + { /* HuaTianSongTi */ + { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */ + { 0x0A5A0483UL, 0x00017C39UL }, /* fpgm */ + { 0x70020112UL, 0x00000008UL } /* prep */ + }, + { /* NEC fadpop7.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x40C92555UL, 0x000000E5UL }, /* fpgm */ + { 0xA39B58E3UL, 0x0000117CUL } /* prep */ + }, + { /* NEC fadrei5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x33C41652UL, 0x000000E5UL }, /* fpgm */ + { 0x26D6C52AUL, 0x00000F6AUL } /* prep */ + }, + { /* NEC fangot7.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x6DB1651DUL, 0x0000019DUL }, /* fpgm */ + { 0x6C6E4B03UL, 0x00002492UL } /* prep */ + }, + { /* NEC fangyo5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x40C92555UL, 0x000000E5UL }, /* fpgm */ + { 0xDE51FAD0UL, 0x0000117CUL } /* prep */ + }, + { /* NEC fankyo5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x85E47664UL, 0x000000E5UL }, /* fpgm */ + { 0xA6C62831UL, 0x00001CAAUL } /* prep */ + }, + { /* NEC fanrgo5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x2D891CFDUL, 0x0000019DUL }, /* fpgm */ + { 0xA0604633UL, 0x00001DE8UL } /* prep */ + }, + { /* NEC fangot5.ttc */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x40AA774CUL, 0x000001CBUL }, /* fpgm */ + { 0x9B5CAA96UL, 0x00001F9AUL } /* prep */ + }, + { /* NEC fanmin3.ttc */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x0D3DE9CBUL, 0x00000141UL }, /* fpgm */ + { 0xD4127766UL, 0x00002280UL } /* prep */ + }, + { /* NEC FA-Gothic, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x4A692698UL, 0x000001F0UL }, /* fpgm */ + { 0x340D4346UL, 0x00001FCAUL } /* prep */ + }, + { /* NEC FA-Minchou, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0xCD34C604UL, 0x00000166UL }, /* fpgm */ + { 0x6CF31046UL, 0x000022B0UL } /* prep */ + }, + { /* NEC FA-RoundGothicB, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x5DA75315UL, 0x0000019DUL }, /* fpgm */ + { 0x40745A5FUL, 0x000022E0UL } /* prep */ + }, + { /* NEC FA-RoundGothicM, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */ + { 0x3900DED3UL, 0x00001E18UL } /* prep */ + }, + { /* MINGLI.TTF, 1992 */ + { 0x00170003UL, 0x00000060UL }, /* cvt */ + { 0xDBB4306EUL, 0x000058AAUL }, /* fpgm */ + { 0xD643482AUL, 0x00000035UL } /* prep */ + }, + { /* DFHei-Bd-WIN-HK-BF, issue #1087 */ + { 0x1269EB58UL, 0x00000350UL }, /* cvt */ + { 0x5CD5957AUL, 0x00006A4EUL }, /* fpgm */ + { 0xF758323AUL, 0x00000380UL } /* prep */ + }, + { /* DFMing-Md-WIN-HK-BF, issue #1087 */ + { 0x122FEB0BUL, 0x00000350UL }, /* cvt */ + { 0x7F10919AUL, 0x000070A9UL }, /* fpgm */ + { 0x7CD7E7B7UL, 0x0000025CUL } /* prep */ + } + }; + + FT_ULong checksum; + int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES]; + FT_Bool has_cvt, has_fpgm, has_prep; + FT_UShort i; + int j, k; + + + FT_MEM_SET( num_matched_ids, 0, + sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES ); + has_cvt = FALSE; + has_fpgm = FALSE; + has_prep = FALSE; + + for ( i = 0; i < face->num_tables; i++ ) + { + checksum = 0; + + switch( face->dir_tables[i].Tag ) + { + case TTAG_cvt: + k = TRICK_SFNT_ID_cvt; + has_cvt = TRUE; + break; + + case TTAG_fpgm: + k = TRICK_SFNT_ID_fpgm; + has_fpgm = TRUE; + break; + + case TTAG_prep: + k = TRICK_SFNT_ID_prep; + has_prep = TRUE; + break; + + default: + continue; + } + + for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) + if ( face->dir_tables[i].Length == sfnt_id[j][k].Length ) + { + if ( !checksum ) + checksum = tt_get_sfnt_checksum( face, i ); + + if ( sfnt_id[j][k].CheckSum == checksum ) + num_matched_ids[j]++; + + if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) + return TRUE; + } + } + + for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) + { + if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length ) + num_matched_ids[j]++; + if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length ) + num_matched_ids[j]++; + if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length ) + num_matched_ids[j]++; + if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) + return TRUE; + } + + return FALSE; + } + + + static FT_Bool + tt_check_trickyness( FT_Face face ) + { + if ( !face ) + return FALSE; + + /* For first, check the face name for quick check. */ + if ( face->family_name && + tt_check_trickyness_family( face->family_name ) ) + { + FT_TRACE3(( "found as a tricky font" + " by its family name: %s\n", face->family_name )); + return TRUE; + } + + /* Type42 fonts may lack `name' tables, we thus try to identify */ + /* tricky fonts by checking the checksums of Type42-persistent */ + /* sfnt tables (`cvt', `fpgm', and `prep'). */ + if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) ) + { + FT_TRACE3(( "found as a tricky font" + " by its cvt/fpgm/prep table checksum\n" )); + return TRUE; + } + + return FALSE; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* Check whether `.notdef' is the only glyph in the `loca' table. */ + static FT_Bool + tt_check_single_notdef( FT_Face ttface ) + { + FT_Bool result = FALSE; + + TT_Face face = (TT_Face)ttface; + FT_ULong asize; + FT_ULong i; + FT_ULong glyph_index = 0; + FT_UInt count = 0; + + + for( i = 0; i < face->num_locations; i++ ) + { + tt_face_get_location( ttface, i, &asize ); + if ( asize > 0 ) + { + count += 1; + if ( count > 1 ) + break; + glyph_index = i; + } + } + + /* Only have a single outline. */ + if ( count == 1 ) + { + if ( glyph_index == 0 ) + result = TRUE; + else + { + /* FIXME: Need to test glyphname == .notdef ? */ + FT_Error error; + char buf[8]; + + + error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 ); + if ( !error && + buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) ) + result = TRUE; + } + } + + return result; + } + + + /************************************************************************** + * + * @Function: + * tt_face_init + * + * @Description: + * Initialize a given TrueType face object. + * + * @Input: + * stream :: + * The source font stream. + * + * face_index :: + * The index of the TrueType font, if we are opening a + * collection, in bits 0-15. The numbered instance + * index~+~1 of a GX (sub)font, if applicable, in bits + * 16-30. + * + * num_params :: + * Number of additional generic parameters. Ignored. + * + * params :: + * Additional generic parameters. Ignored. + * + * @InOut: + * face :: + * The newly built face object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library; + SFNT_Service sfnt; + TT_Face face = (TT_Face)ttface; + + + FT_TRACE2(( "TTF driver\n" )); + + library = ttface->driver->root.library; + + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + { + FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check that we have a valid TrueType file */ + FT_TRACE2(( " " )); + error = sfnt->init_face( stream, face, face_index, num_params, params ); + + /* Stream may have changed. */ + stream = face->root.stream; + + if ( error ) + goto Exit; + + /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ + /* The 0x00020000 tag is completely undocumented; some fonts from */ + /* Arphic made for Chinese Windows 3.1 have this. */ + if ( face->format_tag != 0x00010000L && /* MS fonts */ + face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ + face->format_tag != TTAG_true && /* Mac fonts */ + face->format_tag != TTAG_0xA5kbd && /* `Keyboard.dfont' (legacy Mac OS X) */ + face->format_tag != TTAG_0xA5lst ) /* `LastResort.dfont' (legacy Mac OS X) */ + { + FT_TRACE2(( " not a TTF font\n" )); + goto Bad_Format; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + ttface->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* If we are performing a simple font format check, exit immediately. */ + if ( face_index < 0 ) + return FT_Err_Ok; + + /* Load font directory */ + error = sfnt->load_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( tt_check_trickyness( ttface ) ) + ttface->face_flags |= FT_FACE_FLAG_TRICKY; +#endif + + error = tt_face_load_hdmx( face, stream ); + if ( error ) + goto Exit; + + if ( FT_IS_SCALABLE( ttface ) || + FT_HAS_SBIX( ttface ) ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !ttface->internal->incremental_interface ) +#endif + { + error = tt_face_load_loca( face, stream ); + + /* having a (non-zero) `glyf' table without */ + /* a `loca' table is not valid */ + if ( face->glyf_len && FT_ERR_EQ( error, Table_Missing ) ) + goto Exit; + if ( error ) + goto Exit; + } + + /* `fpgm', `cvt', and `prep' are optional */ + error = tt_face_load_cvt( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + error = tt_face_load_fpgm( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + error = tt_face_load_prep( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + /* Check the scalable flag based on `loca'. */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !ttface->internal->incremental_interface ) +#endif + { + if ( ttface->num_fixed_sizes && + face->glyph_locations && + tt_check_single_notdef( ttface ) ) + { + FT_TRACE5(( "tt_face_init:" + " Only the `.notdef' glyph has an outline.\n" )); + FT_TRACE5(( " " + " Resetting scalable flag to FALSE.\n" )); + + ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; + } + } + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_UInt instance_index = (FT_UInt)face_index >> 16; + + + if ( FT_HAS_MULTIPLE_MASTERS( ttface ) && + instance_index > 0 ) + { + error = FT_Set_Named_Instance( ttface, instance_index ); + if ( error ) + goto Exit; + } + } +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* initialize standard glyph loading routines */ + TT_Init_Glyph_Loading( face ); + + Exit: + return error; + + Bad_Format: + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + + /************************************************************************** + * + * @Function: + * tt_face_done + * + * @Description: + * Finalize a given face object. + * + * @Input: + * face :: + * A pointer to the face object to destroy. + */ + FT_LOCAL_DEF( void ) + tt_face_done( FT_Face ttface ) /* TT_Face */ + { + TT_Face face = (TT_Face)ttface; + FT_Memory memory; + FT_Stream stream; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = ttface->memory; + stream = ttface->stream; + sfnt = (SFNT_Service)face->sfnt; + + /* for `extended TrueType formats' (i.e. compressed versions) */ + if ( face->extra.finalizer ) + face->extra.finalizer( face->extra.data ); + + if ( sfnt ) + sfnt->done_face( face ); + + /* freeing the locations table */ + tt_face_done_loca( face ); + + tt_face_free_hdmx( face ); + + /* freeing the CVT */ + FT_FREE( face->cvt ); + face->cvt_size = 0; + + /* freeing the programs */ + FT_FRAME_RELEASE( face->font_program ); + FT_FRAME_RELEASE( face->cvt_program ); + face->font_program_size = 0; + face->cvt_program_size = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + tt_done_blend( ttface ); + face->blend = NULL; +#endif + } + + + /************************************************************************** + * + * SIZE FUNCTIONS + * + */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /************************************************************************** + * + * @Function: + * tt_size_run_fpgm + * + * @Description: + * Run the font program. + * + * @Input: + * size :: + * A handle to the size object. + * + * pedantic :: + * Set if bytecode execution should be pedantic. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_fpgm( TT_Size size, + FT_Bool pedantic ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + exec = size->context; + + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + + exec->callTop = 0; + exec->top = 0; + + exec->period = 64; + exec->phase = 0; + exec->threshold = 0; + + exec->instruction_trap = FALSE; + exec->F_dot_P = 0x4000L; + + exec->pedantic_hinting = pedantic; + + { + FT_Size_Metrics* size_metrics = &exec->metrics; + TT_Size_Metrics* tt_metrics = &exec->tt_metrics; + + + size_metrics->x_ppem = 0; + size_metrics->y_ppem = 0; + size_metrics->x_scale = 0; + size_metrics->y_scale = 0; + + tt_metrics->ppem = 0; + tt_metrics->scale = 0; + tt_metrics->ratio = 0x10000L; + } + + /* allow font program execution */ + TT_Set_CodeRange( exec, + tt_coderange_font, + face->font_program, + (FT_Long)face->font_program_size ); + + /* disable CVT and glyph programs coderange */ + TT_Clear_CodeRange( exec, tt_coderange_cvt ); + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->font_program_size > 0 ) + { + TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); + + FT_TRACE4(( "Executing `fpgm' table.\n" )); + error = face->interpreter( exec ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE4(( " interpretation failed with error code 0x%x\n", + error )); +#endif + } + else + error = FT_Err_Ok; + + size->bytecode_ready = error; + + if ( !error ) + TT_Save_Context( exec, size ); + + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_size_run_prep + * + * @Description: + * Run the control value program. + * + * @Input: + * size :: + * A handle to the size object. + * + * pedantic :: + * Set if bytecode execution should be pedantic. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_prep( TT_Size size, + FT_Bool pedantic ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + FT_UInt i; + + /* unscaled CVT values are already stored in 26.6 format */ + FT_Fixed scale = size->ttmetrics.scale >> 6; + + + /* Scale the cvt values to the new ppem. */ + /* By default, we use the y ppem value for scaling. */ + FT_TRACE6(( "CVT values:\n" )); + for ( i = 0; i < size->cvt_size; i++ ) + { + size->cvt[i] = FT_MulFix( face->cvt[i], scale ); + FT_TRACE6(( " %3d: %f (%f)\n", + i, (double)face->cvt[i] / 64, (double)size->cvt[i] / 64 )); + } + FT_TRACE6(( "\n" )); + + exec = size->context; + + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + + exec->callTop = 0; + exec->top = 0; + + exec->instruction_trap = FALSE; + + exec->pedantic_hinting = pedantic; + + TT_Set_CodeRange( exec, + tt_coderange_cvt, + face->cvt_program, + (FT_Long)face->cvt_program_size ); + + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->cvt_program_size > 0 ) + { + TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); + + FT_TRACE4(( "Executing `prep' table.\n" )); + error = face->interpreter( exec ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE4(( " interpretation failed with error code 0x%x\n", + error )); +#endif + } + else + error = FT_Err_Ok; + + size->cvt_ready = error; + + /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */ + /* graphics state variables to be modified by the CVT program. */ + + exec->GS.dualVector.x = 0x4000; + exec->GS.dualVector.y = 0; + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0; + exec->GS.freeVector.x = 0x4000; + exec->GS.freeVector.y = 0x0; + + exec->GS.rp0 = 0; + exec->GS.rp1 = 0; + exec->GS.rp2 = 0; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.loop = 1; + + /* save as default graphics state */ + size->GS = exec->GS; + + TT_Save_Context( exec, size ); + + return error; + } + + + static void + tt_size_done_bytecode( FT_Size ftsize ) + { + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + if ( size->context ) + { + TT_Done_Context( size->context ); + size->context = NULL; + } + + FT_FREE( size->cvt ); + size->cvt_size = 0; + + /* free storage area */ + FT_FREE( size->storage ); + size->storage_size = 0; + + /* twilight zone */ + tt_glyphzone_done( &size->twilight ); + + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + + size->num_function_defs = 0; + size->max_function_defs = 0; + size->num_instruction_defs = 0; + size->max_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->bytecode_ready = -1; + size->cvt_ready = -1; + } + + + /* Initialize bytecode-related fields in the size object. */ + /* We do this only if bytecode interpretation is really needed. */ + static FT_Error + tt_size_init_bytecode( FT_Size ftsize, + FT_Bool pedantic ) + { + FT_Error error; + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + FT_UShort n_twilight; + TT_MaxProfile* maxp = &face->max_profile; + + + /* clean up bytecode related data */ + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + FT_FREE( size->cvt ); + FT_FREE( size->storage ); + + if ( size->context ) + TT_Done_Context( size->context ); + tt_glyphzone_done( &size->twilight ); + + size->bytecode_ready = -1; + size->cvt_ready = -1; + + size->context = TT_New_Context( (TT_Driver)face->root.driver ); + + size->max_function_defs = maxp->maxFunctionDefs; + size->max_instruction_defs = maxp->maxInstructionDefs; + + size->num_function_defs = 0; + size->num_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->cvt_size = face->cvt_size; + size->storage_size = maxp->maxStorage; + + /* Set default metrics */ + { + TT_Size_Metrics* tt_metrics = &size->ttmetrics; + + + tt_metrics->rotated = FALSE; + tt_metrics->stretched = FALSE; + + /* Set default engine compensation. Value 3 is not described */ + /* in the OpenType specification (as of Mai 2019), but Greg */ + /* says that MS handles it the same as `gray'. */ + /* */ + /* The Apple specification says that the compensation for */ + /* `gray' is always zero. FreeType doesn't do any */ + /* compensation at all. */ + tt_metrics->compensations[0] = 0; /* gray */ + tt_metrics->compensations[1] = 0; /* black */ + tt_metrics->compensations[2] = 0; /* white */ + tt_metrics->compensations[3] = 0; /* zero */ + } + + /* allocate function defs, instruction defs, cvt, and storage area */ + if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || + FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || + FT_NEW_ARRAY( size->cvt, size->cvt_size ) || + FT_NEW_ARRAY( size->storage, size->storage_size ) ) + goto Exit; + + /* reserve twilight zone */ + n_twilight = maxp->maxTwilightPoints; + + /* there are 4 phantom points (do we need this?) */ + n_twilight += 4; + + error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); + if ( error ) + goto Exit; + + size->twilight.n_points = n_twilight; + + size->GS = tt_default_graphics_state; + + /* set `face->interpreter' according to the debug hook present */ + { + FT_Library library = face->root.driver->root.library; + + + face->interpreter = (TT_Interpreter) + library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; + if ( !face->interpreter ) + face->interpreter = (TT_Interpreter)TT_RunIns; + } + + /* Fine, now run the font program! */ + + /* In case of an error while executing `fpgm', we intentionally don't */ + /* clean up immediately – bugs in the `fpgm' are so fundamental that */ + /* all following hinting calls should fail. Additionally, `fpgm' is */ + /* to be executed just once; calling it again is completely useless */ + /* and might even lead to extremely slow behaviour if it is malformed */ + /* (containing an infinite loop, for example). */ + error = tt_size_run_fpgm( size, pedantic ); + return error; + + Exit: + if ( error ) + tt_size_done_bytecode( ftsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_size_ready_bytecode( TT_Size size, + FT_Bool pedantic ) + { + FT_Error error = FT_Err_Ok; + + + if ( size->bytecode_ready < 0 ) + error = tt_size_init_bytecode( (FT_Size)size, pedantic ); + else + error = size->bytecode_ready; + + if ( error ) + goto Exit; + + /* rescale CVT when needed */ + if ( size->cvt_ready < 0 ) + { + FT_UShort i; + + + /* all twilight points are originally zero */ + for ( i = 0; i < size->twilight.n_points; i++ ) + { + size->twilight.org[i].x = 0; + size->twilight.org[i].y = 0; + size->twilight.cur[i].x = 0; + size->twilight.cur[i].y = 0; + } + + /* clear storage area */ + for ( i = 0; i < size->storage_size; i++ ) + size->storage[i] = 0; + + size->GS = tt_default_graphics_state; + + error = tt_size_run_prep( size, pedantic ); + } + else + error = size->cvt_ready; + + Exit: + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /************************************************************************** + * + * @Function: + * tt_size_init + * + * @Description: + * Initialize a new TrueType size object. + * + * @InOut: + * size :: + * A handle to the size object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_size_init( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + FT_Error error = FT_Err_Ok; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->bytecode_ready = -1; + size->cvt_ready = -1; +#endif + + size->ttmetrics.valid = FALSE; + size->strike_index = 0xFFFFFFFFUL; + + return error; + } + + + /************************************************************************** + * + * @Function: + * tt_size_done + * + * @Description: + * The TrueType size object finalizer. + * + * @Input: + * size :: + * A handle to the target size object. + */ + FT_LOCAL_DEF( void ) + tt_size_done( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + tt_size_done_bytecode( ttsize ); +#endif + + size->ttmetrics.valid = FALSE; + } + + + /************************************************************************** + * + * @Function: + * tt_size_reset_height + * + * @Description: + * Recompute a TrueType size's ascender, descender, and height + * when resolutions and character dimensions have been changed. + * Used for variation fonts as an iterator function. + * + * @Input: + * ft_size :: + * A handle to the target TT_Size object. This function will be called + * through a `FT_Size_Reset_Func` pointer which takes `FT_Size`. This + * function must take `FT_Size` as a result. The passed `FT_Size` is + * expected to point to a `TT_Size`. + */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset_height( FT_Size ft_size ) + { + TT_Size size = (TT_Size)ft_size; + TT_Face face = (TT_Face)size->root.face; + FT_Size_Metrics* size_metrics = &size->hinted_metrics; + + size->ttmetrics.valid = FALSE; + + /* copy the result from base layer */ + *size_metrics = size->root.metrics; + + if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 ) + return FT_THROW( Invalid_PPem ); + + /* This bit flag, if set, indicates that the ppems must be */ + /* rounded to integers. Nearly all TrueType fonts have this bit */ + /* set, as hinting won't work really well otherwise. */ + /* */ + if ( face->header.Flags & 8 ) + { + /* the TT spec always asks for ROUND, not FLOOR or CEIL */ + size_metrics->ascender = FT_PIX_ROUND( + FT_MulFix( face->root.ascender, + size_metrics->y_scale ) ); + size_metrics->descender = FT_PIX_ROUND( + FT_MulFix( face->root.descender, + size_metrics->y_scale ) ); + size_metrics->height = FT_PIX_ROUND( + FT_MulFix( face->root.height, + size_metrics->y_scale ) ); + } + + size->ttmetrics.valid = TRUE; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * tt_size_reset + * + * @Description: + * Reset a TrueType size when resolutions and character dimensions + * have been changed. + * + * @Input: + * size :: + * A handle to the target size object. + */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset( TT_Size size ) + { + FT_Error error; + TT_Face face = (TT_Face)size->root.face; + FT_Size_Metrics* size_metrics = &size->hinted_metrics; + + + error = tt_size_reset_height( (FT_Size)size ); + if ( error ) + return error; + + if ( face->header.Flags & 8 ) + { + /* base scaling values on integer ppem values, */ + /* as mandated by the TrueType specification */ + size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, + face->root.units_per_EM ); + size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, + face->root.units_per_EM ); + + size_metrics->max_advance = FT_PIX_ROUND( + FT_MulFix( face->root.max_advance_width, + size_metrics->x_scale ) ); + } + + /* compute new transformation */ + if ( size_metrics->x_ppem >= size_metrics->y_ppem ) + { + size->ttmetrics.scale = size_metrics->x_scale; + size->ttmetrics.ppem = size_metrics->x_ppem; + size->ttmetrics.x_ratio = 0x10000L; + size->ttmetrics.y_ratio = FT_DivFix( size_metrics->y_ppem, + size_metrics->x_ppem ); + } + else + { + size->ttmetrics.scale = size_metrics->y_scale; + size->ttmetrics.ppem = size_metrics->y_ppem; + size->ttmetrics.x_ratio = FT_DivFix( size_metrics->x_ppem, + size_metrics->y_ppem ); + size->ttmetrics.y_ratio = 0x10000L; + } + + size->widthp = tt_face_get_device_metrics( face, size_metrics->x_ppem, 0 ); + + size->metrics = size_metrics; + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->cvt_ready = -1; +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * tt_driver_init + * + * @Description: + * Initialize a given TrueType driver object. + * + * @Input: + * driver :: + * A handle to the target driver object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ + { + +#ifdef TT_USE_BYTECODE_INTERPRETER + + TT_Driver driver = (TT_Driver)ttdriver; + + driver->interpreter_version = TT_INTERPRETER_VERSION_35; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + driver->interpreter_version = TT_INTERPRETER_VERSION_40; +#endif + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( ttdriver ); + +#endif /* !TT_USE_BYTECODE_INTERPRETER */ + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * tt_driver_done + * + * @Description: + * Finalize a given TrueType driver. + * + * @Input: + * driver :: + * A handle to the target TrueType driver. + */ + FT_LOCAL_DEF( void ) + tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ + { + FT_UNUSED( ttdriver ); + } + + + /************************************************************************** + * + * @Function: + * tt_slot_init + * + * @Description: + * Initialize a new slot object. + * + * @InOut: + * slot :: + * A handle to the slot object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ) + { + return FT_GlyphLoader_CreateExtra( slot->internal->loader ); + } + + +/* END */ diff --git a/external/freetype/src/truetype/ttobjs.h b/external/freetype/src/truetype/ttobjs.h new file mode 100644 index 000000000..40eb37b4c --- /dev/null +++ b/external/freetype/src/truetype/ttobjs.h @@ -0,0 +1,426 @@ +/**************************************************************************** + * + * ttobjs.h + * + * Objects manager (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTOBJS_H_ +#define TTOBJS_H_ + + +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @Type: + * TT_Driver + * + * @Description: + * A handle to a TrueType driver object. + */ + typedef struct TT_DriverRec_* TT_Driver; + + + /************************************************************************** + * + * @Type: + * TT_GlyphSlot + * + * @Description: + * A handle to a TrueType glyph slot object. + * + * @Note: + * This is a direct typedef of FT_GlyphSlot, as there is nothing + * specific about the TrueType glyph slot. + */ + typedef FT_GlyphSlot TT_GlyphSlot; + + + /************************************************************************** + * + * @Struct: + * TT_GraphicsState + * + * @Description: + * The TrueType graphics state used during bytecode interpretation. + */ + typedef struct TT_GraphicsState_ + { + FT_UShort rp0; + FT_UShort rp1; + FT_UShort rp2; + + FT_UnitVector dualVector; + FT_UnitVector projVector; + FT_UnitVector freeVector; + + FT_Long loop; + FT_F26Dot6 minimum_distance; + FT_Int round_state; + + FT_Bool auto_flip; + FT_F26Dot6 control_value_cutin; + FT_F26Dot6 single_width_cutin; + FT_F26Dot6 single_width_value; + FT_UShort delta_base; + FT_UShort delta_shift; + + FT_Byte instruct_control; + /* According to Greg Hitchcock from Microsoft, the `scan_control' */ + /* variable as documented in the TrueType specification is a 32-bit */ + /* integer; the high-word part holds the SCANTYPE value, the low-word */ + /* part the SCANCTRL value. We separate it into two fields. */ + FT_Bool scan_control; + FT_Int scan_type; + + FT_UShort gep0; + FT_UShort gep1; + FT_UShort gep2; + + } TT_GraphicsState; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( void ) + tt_glyphzone_done( TT_GlyphZone zone ); + + FT_LOCAL( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + + /************************************************************************** + * + * EXECUTION SUBTABLES + * + * These sub-tables relate to instruction execution. + * + */ + + +#define TT_MAX_CODE_RANGES 3 + + + /************************************************************************** + * + * There can only be 3 active code ranges at once: + * - the Font Program + * - the CVT Program + * - a glyph's instructions set + */ + typedef enum TT_CodeRange_Tag_ + { + tt_coderange_none = 0, + tt_coderange_font, + tt_coderange_cvt, + tt_coderange_glyph + + } TT_CodeRange_Tag; + + + typedef struct TT_CodeRange_ + { + FT_Byte* base; + FT_Long size; + + } TT_CodeRange; + + typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; + + + /************************************************************************** + * + * Defines a function/instruction definition record. + */ + typedef struct TT_DefRecord_ + { + FT_Int range; /* in which code range is it located? */ + FT_Long start; /* where does it start? */ + FT_Long end; /* where does it end? */ + FT_UInt opc; /* function #, or instruction code */ + FT_Bool active; /* is it active? */ + + } TT_DefRecord, *TT_DefArray; + + + /************************************************************************** + * + * Subglyph transformation record. + */ + typedef struct TT_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } TT_Transform; + + + /************************************************************************** + * + * A note regarding non-squared pixels: + * + * (This text will probably go into some docs at some time; for now, it + * is kept here to explain some definitions in the TT_Size_Metrics + * record). + * + * The CVT is a one-dimensional array containing values that control + * certain important characteristics in a font, like the height of all + * capitals, all lowercase letter, default spacing or stem width/height. + * + * These values are found in FUnits in the font file, and must be scaled + * to pixel coordinates before being used by the CVT and glyph programs. + * Unfortunately, when using distinct x and y resolutions (or distinct x + * and y pointsizes), there are two possible scalings. + * + * A first try was to implement a `lazy' scheme where all values were + * scaled when first used. However, while some values are always used + * in the same direction, some others are used under many different + * circumstances and orientations. + * + * I have found a simpler way to do the same, and it even seems to work + * in most of the cases: + * + * - All CVT values are scaled to the maximum ppem size. + * + * - When performing a read or write in the CVT, a ratio factor is used + * to perform adequate scaling. Example: + * + * x_ppem = 14 + * y_ppem = 10 + * + * We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt + * entries are scaled to it. + * + * x_ratio = 1.0 + * y_ratio = y_ppem/ppem (< 1.0) + * + * We compute the current ratio like: + * + * - If projVector is horizontal, + * ratio = x_ratio = 1.0 + * + * - if projVector is vertical, + * ratio = y_ratio + * + * - else, + * ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) + * + * Reading a cvt value returns + * ratio * cvt[index] + * + * Writing a cvt value in pixels: + * cvt[index] / ratio + * + * The current ppem is simply + * ratio * ppem + * + */ + + + /************************************************************************** + * + * Metrics used by the TrueType size and context objects. + */ + typedef struct TT_Size_Metrics_ + { + /* for non-square pixels */ + FT_Long x_ratio; + FT_Long y_ratio; + + FT_UShort ppem; /* maximum ppem size */ + FT_Long ratio; /* current ratio */ + FT_Fixed scale; + + FT_F26Dot6 compensations[4]; /* device-specific compensations */ + + FT_Bool valid; + + FT_Bool rotated; /* `is the glyph rotated?'-flag */ + FT_Bool stretched; /* `is the glyph stretched?'-flag */ + + } TT_Size_Metrics; + + + /************************************************************************** + * + * TrueType size class. + */ + typedef struct TT_SizeRec_ + { + FT_SizeRec root; + + /* we have our own copy of metrics so that we can modify */ + /* it without affecting auto-hinting (when used) */ + FT_Size_Metrics* metrics; /* for the current rendering mode */ + FT_Size_Metrics hinted_metrics; /* for the hinted rendering mode */ + + TT_Size_Metrics ttmetrics; + + FT_Byte* widthp; /* glyph widths from the hdmx table */ + + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Long point_size; /* for the `MPS' bytecode instruction */ + + FT_UInt num_function_defs; /* number of function definitions */ + FT_UInt max_function_defs; + TT_DefArray function_defs; /* table of function definitions */ + + FT_UInt num_instruction_defs; /* number of ins. definitions */ + FT_UInt max_instruction_defs; + TT_DefArray instruction_defs; /* table of ins. definitions */ + + FT_UInt max_func; + FT_UInt max_ins; + + TT_CodeRangeTable codeRangeTable; + + TT_GraphicsState GS; + + FT_ULong cvt_size; /* the scaled control value table */ + FT_Long* cvt; + + FT_UShort storage_size; /* The storage area is now part of */ + FT_Long* storage; /* the instance */ + + TT_GlyphZoneRec twilight; /* The instance's twilight zone */ + + TT_ExecContext context; + + /* if negative, `fpgm' (resp. `prep'), wasn't executed yet; */ + /* otherwise it is the returned error code */ + FT_Error bytecode_ready; + FT_Error cvt_ready; + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + } TT_SizeRec; + + + /************************************************************************** + * + * TrueType driver class. + */ + typedef struct TT_DriverRec_ + { + FT_DriverRec root; + + TT_GlyphZoneRec zone; /* glyph loader points zone */ + + FT_UInt interpreter_version; + + } TT_DriverRec; + + + /* Note: All of the functions below (except tt_size_reset()) are used */ + /* as function pointers in a FT_Driver_ClassRec. Therefore their */ + /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ + /* TT_Size, etc., so that the compiler can confirm that the types and */ + /* number of parameters are correct. In all cases the FT_xxx types are */ + /* cast to their TT_xxx counterparts inside the functions since FreeType */ + /* will always use the TT driver to create them. */ + + + /************************************************************************** + * + * Face functions + */ + FT_LOCAL( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + tt_face_done( FT_Face ttface ); /* TT_Face */ + + + /************************************************************************** + * + * Size functions + */ + FT_LOCAL( FT_Error ) + tt_size_init( FT_Size ttsize ); /* TT_Size */ + + FT_LOCAL( void ) + tt_size_done( FT_Size ttsize ); /* TT_Size */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( FT_Error ) + tt_size_run_fpgm( TT_Size size, + FT_Bool pedantic ); + + FT_LOCAL( FT_Error ) + tt_size_run_prep( TT_Size size, + FT_Bool pedantic ); + + FT_LOCAL( FT_Error ) + tt_size_ready_bytecode( TT_Size size, + FT_Bool pedantic ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + FT_LOCAL( FT_Error ) + tt_size_reset_height( FT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_reset( TT_Size size ); + + + /************************************************************************** + * + * Driver functions + */ + FT_LOCAL( FT_Error ) + tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ + + FT_LOCAL( void ) + tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ + + + /************************************************************************** + * + * Slot functions + */ + FT_LOCAL( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ); + + + /* auxiliary */ +#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) + + +FT_END_HEADER + +#endif /* TTOBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/truetype/ttpload.c b/external/freetype/src/truetype/ttpload.c new file mode 100644 index 000000000..54a64c7b4 --- /dev/null +++ b/external/freetype/src/truetype/ttpload.c @@ -0,0 +1,665 @@ +/**************************************************************************** + * + * ttpload.c + * + * TrueType-specific tables loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftstream.h> +#include <freetype/tttags.h> + +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT ttpload + + + /************************************************************************** + * + * @Function: + * tt_face_load_loca + * + * @Description: + * Load the locations table. + * + * @InOut: + * face :: + * A handle to the target face object. + * + * @Input: + * stream :: + * The input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_len; + FT_Int shift; + + + /* we need the size of the `glyf' table for malformed `loca' tables */ + error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); + + /* it is possible that a font doesn't have a glyf table at all */ + /* or its size is zero */ + if ( FT_ERR_EQ( error, Table_Missing ) ) + { + face->glyf_len = 0; + face->glyf_offset = 0; + } + else if ( error ) + goto Exit; + else + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + face->glyf_offset = 0; + else +#endif + face->glyf_offset = FT_STREAM_POS(); + } + + FT_TRACE2(( "Locations " )); + error = face->goto_table( face, TTAG_loca, stream, &table_len ); + if ( error ) + { + error = FT_THROW( Locations_Missing ); + goto Exit; + } + + shift = face->header.Index_To_Loc_Format != 0 ? 2 : 1; + + if ( table_len > 0x10000UL << shift ) + { + FT_TRACE2(( "table too large\n" )); + table_len = 0x10000UL << shift; + } + + face->num_locations = table_len >> shift; + + if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 ) + { + FT_TRACE2(( "glyph count mismatch! loca: %ld, maxp: %ld\n", + face->num_locations - 1, face->root.num_glyphs )); + + /* we only handle the case where `maxp' gives a larger value */ + if ( face->num_locations < (FT_ULong)face->root.num_glyphs + 1 ) + { + FT_ULong new_loca_len = + ( (FT_ULong)face->root.num_glyphs + 1 ) << shift; + + TT_Table entry = face->dir_tables; + TT_Table limit = entry + face->num_tables; + + FT_Long pos = (FT_Long)FT_STREAM_POS(); + FT_Long dist = 0x7FFFFFFFL; + FT_Bool found = 0; + + + /* compute the distance to next table in font file */ + for ( ; entry < limit; entry++ ) + { + FT_Long diff = (FT_Long)entry->Offset - pos; + + + if ( diff > 0 && diff < dist ) + { + dist = diff; + found = 1; + } + } + + if ( !found ) + { + /* `loca' is the last table */ + dist = (FT_Long)stream->size - pos; + } + + if ( new_loca_len <= (FT_ULong)dist ) + { + face->num_locations = (FT_ULong)face->root.num_glyphs + 1; + table_len = new_loca_len; + + FT_TRACE2(( "adjusting num_locations to %ld\n", + face->num_locations )); + } + else + { + face->root.num_glyphs = face->num_locations + ? (FT_Long)face->num_locations - 1 : 0; + + FT_TRACE2(( "adjusting num_glyphs to %ld\n", + face->root.num_glyphs )); + } + } + } + + /* + * Extract the frame. We don't need to decompress it since + * we are able to parse it directly. + */ + if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_ULong ) + tt_face_get_location( FT_Face face, /* TT_Face */ + FT_UInt gindex, + FT_ULong *asize ) + { + TT_Face ttface = (TT_Face)face; + FT_ULong pos1, pos2; + FT_Byte* p; + FT_Byte* p_limit; + + + pos1 = pos2 = 0; + + if ( gindex < ttface->num_locations ) + { + if ( ttface->header.Index_To_Loc_Format != 0 ) + { + p = ttface->glyph_locations + gindex * 4; + p_limit = ttface->glyph_locations + ttface->num_locations * 4; + + pos1 = FT_NEXT_ULONG( p ); + pos2 = pos1; + + if ( p + 4 <= p_limit ) + pos2 = FT_NEXT_ULONG( p ); + } + else + { + p = ttface->glyph_locations + gindex * 2; + p_limit = ttface->glyph_locations + ttface->num_locations * 2; + + pos1 = FT_NEXT_USHORT( p ); + pos2 = pos1; + + if ( p + 2 <= p_limit ) + pos2 = FT_NEXT_USHORT( p ); + + pos1 <<= 1; + pos2 <<= 1; + } + } + + /* Check broken location data. */ + if ( pos1 > ttface->glyf_len ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset (0x%08lx) found for glyph index %d,\n", + pos1, gindex )); + FT_TRACE1(( " " + " exceeding the end of `glyf' table (0x%08lx)\n", + ttface->glyf_len )); + *asize = 0; + return 0; + } + + if ( pos2 > ttface->glyf_len ) + { + /* We try to sanitize the last `loca' entry. */ + if ( gindex == ttface->num_locations - 2 ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large size (%ld bytes) found for glyph index %d,\n", + pos2 - pos1, gindex )); + FT_TRACE1(( " " + " truncating at the end of `glyf' table to %ld bytes\n", + ttface->glyf_len - pos1 )); + pos2 = ttface->glyf_len; + } + else + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset (0x%08lx) found for glyph index %d,\n", + pos2, gindex + 1 )); + FT_TRACE1(( " " + " exceeding the end of `glyf' table (0x%08lx)\n", + ttface->glyf_len )); + *asize = 0; + return 0; + } + } + + /* The `loca' table must be ordered; it refers to the length of */ + /* an entry as the difference between the current and the next */ + /* position. However, there do exist (malformed) fonts which */ + /* don't obey this rule, so we are only able to provide an */ + /* upper bound for the size. */ + /* */ + /* We get (intentionally) a wrong, non-zero result in case the */ + /* `glyf' table is missing. */ + if ( pos2 >= pos1 ) + *asize = (FT_ULong)( pos2 - pos1 ); + else + *asize = (FT_ULong)( ttface->glyf_len - pos1 ); + + return pos1; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_loca( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->glyph_locations ); + face->num_locations = 0; + } + + + + /************************************************************************** + * + * @Function: + * tt_face_load_cvt + * + * @Description: + * Load the control value table into a face object. + * + * @InOut: + * face :: + * A handle to the target face object. + * + * @Input: + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_len; + + + FT_TRACE2(( "CVT " )); + + error = face->goto_table( face, TTAG_cvt, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + face->cvt_size = 0; + face->cvt = NULL; + error = FT_Err_Ok; + + goto Exit; + } + + face->cvt_size = table_len / 2; + + if ( FT_QNEW_ARRAY( face->cvt, face->cvt_size ) ) + goto Exit; + + if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) + goto Exit; + + { + FT_Int32* cur = face->cvt; + FT_Int32* limit = cur + face->cvt_size; + + + for ( ; cur < limit; cur++ ) + *cur = FT_GET_SHORT() * 64; + } + + FT_FRAME_EXIT(); + FT_TRACE2(( "loaded\n" )); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->doblend ) + error = tt_face_vary_cvt( face, stream ); +#endif + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_fpgm + * + * @Description: + * Load the font program. + * + * @InOut: + * face :: + * A handle to the target face object. + * + * @Input: + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Font program " )); + + /* The font program is optional */ + error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); + if ( error ) + { + face->font_program = NULL; + face->font_program_size = 0; + error = FT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->font_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12ld bytes\n", face->font_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_prep + * + * @Description: + * Load the cvt program. + * + * @InOut: + * face :: + * A handle to the target face object. + * + * @Input: + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Prep program " )); + + error = face->goto_table( face, TTAG_prep, stream, &table_len ); + if ( error ) + { + face->cvt_program = NULL; + face->cvt_program_size = 0; + error = FT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->cvt_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12ld bytes\n", face->cvt_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif + } + + + FT_COMPARE_DEF( int ) + compare_ppem( const void* a, + const void* b ) + { + return **(FT_Byte**)a - **(FT_Byte**)b; + } + + + /************************************************************************** + * + * @Function: + * tt_face_load_hdmx + * + * @Description: + * Load the `hdmx' table into the face object. + * + * @Input: + * face :: + * A handle to the target face object. + * + * stream :: + * A handle to the input stream. + * + * @Return: + * FreeType error code. 0 means success. + */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt nn, num_records; + FT_ULong table_size, record_size; + FT_Byte* p; + FT_Byte* limit; + + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); + if ( error || table_size < 8 ) + return FT_Err_Ok; + + if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) + goto Exit; + + p = face->hdmx_table; + limit = p + table_size; + + /* Given that `hdmx' tables are losing its importance (for example, */ + /* variation fonts introduced in OpenType 1.8 must not have this */ + /* table) we no longer test for a correct `version' field. */ + p += 2; + num_records = FT_NEXT_USHORT( p ); + record_size = FT_NEXT_ULONG( p ); + + /* There are at least two fonts, HANNOM-A and HANNOM-B version */ + /* 2.0 (2005), which get this wrong: The upper two bytes of */ + /* the size value are set to 0xFF instead of 0x00. We catch */ + /* and fix this. */ + + if ( record_size >= 0xFFFF0000UL ) + record_size &= 0xFFFFU; + + FT_TRACE2(( "Hdmx " )); + + /* The limit for `num_records' is a heuristic value. */ + if ( num_records > 255 || num_records == 0 ) + { + FT_TRACE2(( "with unreasonable %u records rejected\n", num_records )); + goto Fail; + } + + /* Out-of-spec tables are rejected. The record size must be */ + /* equal to the number of glyphs + 2 + 32-bit padding. */ + if ( (FT_Long)record_size != ( ( face->root.num_glyphs + 2 + 3 ) & ~3 ) ) + { + FT_TRACE2(( "with record size off by %ld bytes rejected\n", + (FT_Long)record_size - + ( ( face->root.num_glyphs + 2 + 3 ) & ~3 ) )); + goto Fail; + } + + if ( FT_QNEW_ARRAY( face->hdmx_records, num_records ) ) + goto Fail; + + for ( nn = 0; nn < num_records; nn++ ) + { + if ( p + record_size > limit ) + break; + face->hdmx_records[nn] = p; + p += record_size; + } + + /* The records must be already sorted by ppem but it does not */ + /* hurt to make sure so that the binary search works later. */ + ft_qsort( face->hdmx_records, nn, sizeof ( FT_Byte* ), compare_ppem ); + + face->hdmx_record_count = nn; + face->hdmx_table_size = table_size; + face->hdmx_record_size = record_size; + + FT_TRACE2(( "%ux%lu loaded\n", num_records, record_size )); + + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->hdmx_table ); + face->hdmx_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_hdmx( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + + + FT_FREE( face->hdmx_records ); + FT_FRAME_RELEASE( face->hdmx_table ); + } + + + /************************************************************************** + * + * Return the advance width table for a given pixel size if it is found + * in the font's `hdmx' table (if any). The records must be sorted for + * the binary search to work properly. + */ + FT_LOCAL_DEF( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ) + { + FT_UInt min = 0; + FT_UInt max = face->hdmx_record_count; + FT_UInt mid; + FT_Byte* result = NULL; + + + while ( min < max ) + { + mid = ( min + max ) >> 1; + + if ( face->hdmx_records[mid][0] > ppem ) + max = mid; + else if ( face->hdmx_records[mid][0] < ppem ) + min = mid + 1; + else + { + result = face->hdmx_records[mid] + 2 + gindex; + break; + } + } + + return result; + } + + +/* END */ diff --git a/external/freetype/src/truetype/ttpload.h b/external/freetype/src/truetype/ttpload.h new file mode 100644 index 000000000..ed229fa46 --- /dev/null +++ b/external/freetype/src/truetype/ttpload.h @@ -0,0 +1,74 @@ +/**************************************************************************** + * + * ttpload.h + * + * TrueType-specific tables loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef TTPLOAD_H_ +#define TTPLOAD_H_ + + +#include <freetype/internal/tttypes.h> + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_ULong ) + tt_face_get_location( FT_Face face, + FT_UInt gindex, + FT_ULong *asize ); + + FT_LOCAL( void ) + tt_face_done_loca( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( void ) + tt_face_free_hdmx( TT_Face face ); + + + FT_LOCAL( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ); + +FT_END_HEADER + +#endif /* TTPLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/module.mk b/external/freetype/src/type1/module.mk new file mode 100644 index 000000000..33bceff8a --- /dev/null +++ b/external/freetype/src/type1/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Type1 module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE1_DRIVER + +define TYPE1_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/type1/rules.mk b/external/freetype/src/type1/rules.mk new file mode 100644 index 000000000..efe744b77 --- /dev/null +++ b/external/freetype/src/type1/rules.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 Type1 driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Type1 driver directory +# +T1_DIR := $(SRC_DIR)/type1 + + +# compilation flags for the driver +# +T1_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(T1_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# Type1 driver sources (i.e., C files) +# +T1_DRV_SRC := $(T1_DIR)/t1parse.c \ + $(T1_DIR)/t1load.c \ + $(T1_DIR)/t1driver.c \ + $(T1_DIR)/t1afm.c \ + $(T1_DIR)/t1gload.c \ + $(T1_DIR)/t1objs.c + +# Type1 driver headers +# +T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \ + $(T1_DIR)/t1tokens.h \ + $(T1_DIR)/t1errors.h + + +# Type1 driver object(s) +# +# T1_DRV_OBJ_M is used during `multi' builds +# T1_DRV_OBJ_S is used during `single' builds +# +T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O) +T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O + +# Type1 driver source file for single build +# +T1_DRV_SRC_S := $(T1_DIR)/type1.c + + +# Type1 driver - single object +# +$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S)) + + +# Type1 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T1_DRV_OBJ_S) +DRV_OBJS_M += $(T1_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/type1/t1afm.c b/external/freetype/src/type1/t1afm.c new file mode 100644 index 000000000..d9b9398b0 --- /dev/null +++ b/external/freetype/src/type1/t1afm.c @@ -0,0 +1,413 @@ +/**************************************************************************** + * + * t1afm.c + * + * AFM support for Type 1 fonts (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "t1afm.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/psaux.h> +#include "t1errors.h" + + +#ifndef T1_CONFIG_OPTION_NO_AFM + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1afm + + + FT_LOCAL_DEF( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ) + { + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi ); + } + + + /* read a glyph name and return the equivalent glyph index */ + static FT_Int + t1_get_index( const char* name, + FT_Offset len, + void* user_data ) + { + T1_Font type1 = (T1_Font)user_data; + FT_Int n; + + + /* PS string/name length must be < 16-bit */ + if ( len > 0xFFFFU ) + return 0; + + for ( n = 0; n < type1->num_glyphs; n++ ) + { + char* gname = (char*)type1->glyph_names[n]; + + + if ( gname && gname[0] == name[0] && + ft_strlen( gname ) == len && + ft_strncmp( gname, name, len ) == 0 ) + return n; + } + + return 0; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + /* compare two kerning pairs */ + FT_COMPARE_DEF( int ) + compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair pair1 = (AFM_KernPair)a; + AFM_KernPair pair2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 ); + FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + /* parse a PFM file -- for now, only read the kerning pairs */ + static FT_Error + T1_Read_PFM( FT_Face t1_face, + FT_Stream stream, + AFM_FontInfo fi ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = stream->memory; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* p; + AFM_KernPair kp; + FT_Int width_table_length; + FT_CharMap oldcharmap; + FT_CharMap charmap; + FT_Int n; + + + start = (FT_Byte*)stream->cursor; + limit = (FT_Byte*)stream->limit; + + /* Figure out how long the width table is. */ + /* This info is a little-endian short at offset 99. */ + p = start + 99; + if ( p + 2 > limit ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + width_table_length = FT_PEEK_USHORT_LE( p ); + + p += 18 + width_table_length; + if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 ) + /* extension table is probably optional */ + goto Exit; + + /* Kerning offset is 14 bytes from start of extensions table. */ + p += 14; + p = start + FT_PEEK_ULONG_LE( p ); + + if ( p == start ) + /* zero offset means no table */ + goto Exit; + + if ( p + 2 > limit ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + fi->NumKernPair = FT_PEEK_USHORT_LE( p ); + p += 2; + if ( p + 4 * fi->NumKernPair > limit ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* Actually, kerning pairs are simply optional! */ + if ( fi->NumKernPair == 0 ) + goto Exit; + + /* allocate the pairs */ + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + goto Exit; + + /* now, read each kern pair */ + kp = fi->KernPairs; + limit = p + 4 * fi->NumKernPair; + + /* PFM kerning data are stored by encoding rather than glyph index, */ + /* so find the PostScript charmap of this font and install it */ + /* temporarily. If we find no PostScript charmap, then just use */ + /* the default and hope it is the right one. */ + oldcharmap = t1_face->charmap; + + for ( n = 0; n < t1_face->num_charmaps; n++ ) + { + charmap = t1_face->charmaps[n]; + /* check against PostScript pseudo platform */ + if ( charmap->platform_id == 7 ) + { + t1_face->charmap = charmap; + break; + } + } + + /* Kerning info is stored as: */ + /* */ + /* encoding of first glyph (1 byte) */ + /* encoding of second glyph (1 byte) */ + /* offset (little-endian short) */ + for ( ; p < limit; p += 4 ) + { + kp->index1 = FT_Get_Char_Index( t1_face, p[0] ); + kp->index2 = FT_Get_Char_Index( t1_face, p[1] ); + + kp->x = (FT_Int)FT_PEEK_SHORT_LE( p + 2 ); + kp->y = 0; + + kp++; + } + + t1_face->charmap = oldcharmap; + + /* now, sort the kern pairs according to their glyph indices */ + ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ), + compare_kern_pairs ); + + Exit: + if ( error ) + { + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + } + + return error; + } + + + /* parse a metrics file -- either AFM or PFM depending on what */ + /* it turns out to be */ + FT_LOCAL_DEF( FT_Error ) + T1_Read_Metrics( FT_Face t1_face, + FT_Stream stream ) + { + PSAux_Service psaux; + FT_Memory memory = stream->memory; + AFM_ParserRec parser; + AFM_FontInfo fi = NULL; + FT_Error error = FT_ERR( Unknown_File_Format ); + T1_Face face = (T1_Face)t1_face; + T1_Font t1_font = &face->type1; + + + if ( face->afm_data ) + { + FT_TRACE1(( "T1_Read_Metrics:" + " Freeing previously attached metrics data.\n" )); + T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data ); + + face->afm_data = NULL; + } + + if ( FT_NEW( fi ) || + FT_FRAME_ENTER( stream->size ) ) + goto Exit; + + fi->FontBBox = t1_font->font_bbox; + fi->Ascender = t1_font->font_bbox.yMax; + fi->Descender = t1_font->font_bbox.yMin; + + psaux = (PSAux_Service)face->psaux; + if ( psaux->afm_parser_funcs ) + { + error = psaux->afm_parser_funcs->init( &parser, + stream->memory, + stream->cursor, + stream->limit ); + + if ( !error ) + { + parser.FontInfo = fi; + parser.get_index = t1_get_index; + parser.user_data = t1_font; + + error = psaux->afm_parser_funcs->parse( &parser ); + psaux->afm_parser_funcs->done( &parser ); + } + } + + if ( FT_ERR_EQ( error, Unknown_File_Format ) ) + { + FT_Byte* start = stream->cursor; + + + /* MS Windows allows versions up to 0x3FF without complaining */ + if ( stream->size > 6 && + start[1] < 4 && + FT_PEEK_ULONG_LE( start + 2 ) == stream->size ) + error = T1_Read_PFM( t1_face, stream, fi ); + } + + if ( !error ) + { + t1_font->font_bbox = fi->FontBBox; + + t1_face->bbox.xMin = fi->FontBBox.xMin >> 16; + t1_face->bbox.yMin = fi->FontBBox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16; + t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16; + + /* ascender and descender are optional and could both be zero */ + /* check if values are meaningful before overriding defaults */ + if ( fi->Ascender > fi->Descender ) + { + /* no `U' suffix here to 0x8000! */ + t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000 ) >> 16 ); + t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 ); + } + + if ( fi->NumKernPair ) + { + t1_face->face_flags |= FT_FACE_FLAG_KERNING; + face->afm_data = fi; + fi = NULL; + } + } + + FT_FRAME_EXIT(); + + Exit: + if ( fi ) + T1_Done_Metrics( memory, fi ); + + return error; + } + + + /* find the kerning for a given glyph pair */ + FT_LOCAL_DEF( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + AFM_KernPair min, mid, max; + FT_ULong idx = KERN_INDEX( glyph1, glyph2 ); + + + /* simple binary search */ + min = fi->KernPairs; + max = min + fi->NumKernPair - 1; + + while ( min <= max ) + { + FT_ULong midi; + + + mid = min + ( max - min ) / 2; + midi = KERN_INDEX( mid->index1, mid->index2 ); + + if ( midi == idx ) + { + kerning->x = mid->x; + kerning->y = mid->y; + + return; + } + + if ( midi < idx ) + min = mid + 1; + else + max = mid - 1; + } + + kerning->x = 0; + kerning->y = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ) + { + AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data; + FT_UInt i; + + + if ( !fi ) + return FT_THROW( Invalid_Argument ); + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + if ( tk->degree != degree ) + continue; + + if ( ptsize < tk->min_ptsize ) + *kerning = tk->min_kern; + else if ( ptsize > tk->max_ptsize ) + *kerning = tk->max_kern; + else + { + *kerning = FT_MulDiv( ptsize - tk->min_ptsize, + tk->max_kern - tk->min_kern, + tk->max_ptsize - tk->min_ptsize ) + + tk->min_kern; + } + } + + return FT_Err_Ok; + } + +#else /* T1_CONFIG_OPTION_NO_AFM */ + + /* ANSI C doesn't like empty source files */ + typedef int t1_afm_dummy_; + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + +/* END */ diff --git a/external/freetype/src/type1/t1afm.h b/external/freetype/src/type1/t1afm.h new file mode 100644 index 000000000..e0d5aa5a8 --- /dev/null +++ b/external/freetype/src/type1/t1afm.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * + * t1afm.h + * + * AFM support for Type 1 fonts (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1AFM_H_ +#define T1AFM_H_ + +#include "t1objs.h" +#include <freetype/internal/t1types.h> + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Read_Metrics( FT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ); + + FT_LOCAL( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + FT_LOCAL( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ); + +FT_END_HEADER + +#endif /* T1AFM_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1driver.c b/external/freetype/src/type1/t1driver.c new file mode 100644 index 000000000..a4cdf372a --- /dev/null +++ b/external/freetype/src/type1/t1driver.c @@ -0,0 +1,813 @@ +/**************************************************************************** + * + * t1driver.c + * + * Type 1 driver interface (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "t1driver.h" +#include "t1gload.h" +#include "t1load.h" + +#include "t1errors.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/fthash.h> +#include <freetype/internal/ftpsprop.h> +#include <freetype/ftdriver.h> + +#include <freetype/internal/services/svmm.h> +#include <freetype/internal/services/svgldict.h> +#include <freetype/internal/services/svfntfmt.h> +#include <freetype/internal/services/svpostnm.h> +#include <freetype/internal/services/svpscmap.h> +#include <freetype/internal/services/svpsinfo.h> +#include <freetype/internal/services/svprop.h> +#include <freetype/internal/services/svkern.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1driver + + /* + * GLYPH DICT SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + t1_get_glyph_name( FT_Face face, /* T1_Face */ + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + T1_Face t1face = (T1_Face)face; + + + FT_STRCPYN( buffer, t1face->type1.glyph_names[glyph_index], buffer_max ); + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_get_name_index( FT_Face face, /* T1_Face */ + const FT_String* glyph_name ) + { + T1_Face t1face = (T1_Face)face; + FT_Int i; + + + for ( i = 0; i < t1face->type1.num_glyphs; i++ ) + { + FT_String* gname = t1face->type1.glyph_names[i]; + + + if ( !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)i; + } + + return 0; + } + + + static const FT_Service_GlyphDictRec t1_service_glyph_dict = + { + t1_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */ + t1_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */ + }; + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + t1_get_ps_name( FT_Face face ) /* T1_Face */ + { + T1_Face t1face = (T1_Face)face; + + + return (const char*) t1face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t1_service_ps_name = + { + (FT_PsName_GetFunc)t1_get_ps_name /* get_ps_font_name */ + }; + + + /* + * MULTIPLE MASTERS SERVICE + * + */ + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + static const FT_Service_MultiMastersRec t1_service_multi_masters = + { + T1_Get_Multi_Master, /* FT_Get_MM_Func get_mm */ + T1_Set_MM_Design, /* FT_Set_MM_Design_Func set_mm_design */ + T1_Set_MM_Blend, /* FT_Set_MM_Blend_Func set_mm_blend */ + T1_Get_MM_Blend, /* FT_Get_MM_Blend_Func get_mm_blend */ + T1_Get_MM_Var, /* FT_Get_MM_Var_Func get_mm_var */ + T1_Set_Var_Design, /* FT_Set_Var_Design_Func set_var_design */ + T1_Get_Var_Design, /* FT_Get_Var_Design_Func get_var_design */ + T1_Reset_MM_Blend, /* FT_Set_Named_Instance_Func set_named_instance */ + NULL, /* FT_Get_Default_Named_Instance_Func get_default_named_instance */ + T1_Set_MM_WeightVector, + /* FT_Set_MM_WeightVector_Func set_mm_weightvector */ + T1_Get_MM_WeightVector, + /* FT_Get_MM_WeightVector_Func get_mm_weightvector */ + + NULL, /* FT_Construct_PS_Name_Func construct_ps_name */ + NULL, /* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */ + NULL, /* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */ + NULL, /* FT_Var_Get_Item_Delta_Func get_item_delta */ + NULL, /* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */ + NULL, /* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */ + NULL, /* FT_Get_Var_Blend_Func get_var_blend */ + T1_Done_Blend /* FT_Done_Blend_Func done_blend */ + }; +#endif + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t1_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T1_Face)face)->type1.font_info; + + return FT_Err_Ok; + } + + + static FT_Error + t1_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((T1_Face)face)->type1.font_extra; + + return FT_Err_Ok; + } + + + static FT_Int + t1_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + + return 1; + } + + + static FT_Error + t1_ps_get_font_private( FT_Face face, + PS_PrivateRec* afont_private ) + { + *afont_private = ((T1_Face)face)->type1.private_dict; + + return FT_Err_Ok; + } + + + static FT_Long + t1_ps_get_font_value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len_ ) + { + FT_ULong retval = 0; /* always >= 1 if valid */ + FT_ULong value_len = value_len_ < 0 ? 0 : (FT_ULong)value_len_; + + T1_Face t1face = (T1_Face)face; + T1_Font type1 = &t1face->type1; + + + switch ( key ) + { + case PS_DICT_FONT_TYPE: + retval = sizeof ( type1->font_type ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->font_type; + break; + + case PS_DICT_FONT_MATRIX: + if ( idx < sizeof ( type1->font_matrix ) / + sizeof ( type1->font_matrix.xx ) ) + { + FT_Fixed val = 0; + + + retval = sizeof ( val ); + if ( value && value_len >= retval ) + { + switch ( idx ) + { + case 0: + val = type1->font_matrix.xx; + break; + case 1: + val = type1->font_matrix.xy; + break; + case 2: + val = type1->font_matrix.yx; + break; + case 3: + val = type1->font_matrix.yy; + break; + } + *((FT_Fixed *)value) = val; + } + } + break; + + case PS_DICT_FONT_BBOX: + if ( idx < sizeof ( type1->font_bbox ) / + sizeof ( type1->font_bbox.xMin ) ) + { + FT_Fixed val = 0; + + + retval = sizeof ( val ); + if ( value && value_len >= retval ) + { + switch ( idx ) + { + case 0: + val = type1->font_bbox.xMin; + break; + case 1: + val = type1->font_bbox.yMin; + break; + case 2: + val = type1->font_bbox.xMax; + break; + case 3: + val = type1->font_bbox.yMax; + break; + } + *((FT_Fixed *)value) = val; + } + } + break; + + case PS_DICT_PAINT_TYPE: + retval = sizeof ( type1->paint_type ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->paint_type; + break; + + case PS_DICT_FONT_NAME: + if ( type1->font_name ) + { + retval = ft_strlen( type1->font_name ) + 1; + if ( value && value_len >= retval ) + ft_memcpy( value, (void *)( type1->font_name ), retval ); + } + break; + + case PS_DICT_UNIQUE_ID: + retval = sizeof ( type1->private_dict.unique_id ); + if ( value && value_len >= retval ) + *((FT_Int *)value) = type1->private_dict.unique_id; + break; + + case PS_DICT_NUM_CHAR_STRINGS: + retval = sizeof ( type1->num_glyphs ); + if ( value && value_len >= retval ) + *((FT_Int *)value) = type1->num_glyphs; + break; + + case PS_DICT_CHAR_STRING_KEY: + if ( idx < (FT_UInt)type1->num_glyphs ) + { + retval = ft_strlen( type1->glyph_names[idx] ) + 1; + if ( value && value_len >= retval ) + { + ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval ); + ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; + } + } + break; + + case PS_DICT_CHAR_STRING: + if ( idx < (FT_UInt)type1->num_glyphs ) + { + retval = type1->charstrings_len[idx] + 1; + if ( value && value_len >= retval ) + { + ft_memcpy( value, (void *)( type1->charstrings[idx] ), + retval - 1 ); + ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; + } + } + break; + + case PS_DICT_ENCODING_TYPE: + retval = sizeof ( type1->encoding_type ); + if ( value && value_len >= retval ) + *((T1_EncodingType *)value) = type1->encoding_type; + break; + + case PS_DICT_ENCODING_ENTRY: + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY && + idx < (FT_UInt)type1->encoding.num_chars ) + { + retval = ft_strlen( type1->encoding.char_name[idx] ) + 1; + if ( value && value_len >= retval ) + { + ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ), + retval - 1 ); + ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; + } + } + break; + + case PS_DICT_NUM_SUBRS: + retval = sizeof ( type1->num_subrs ); + if ( value && value_len >= retval ) + *((FT_Int *)value) = type1->num_subrs; + break; + + case PS_DICT_SUBR: + { + FT_Bool ok = 0; + + + if ( type1->subrs_hash ) + { + /* convert subr index to array index */ + size_t* val = ft_hash_num_lookup( (FT_Int)idx, + type1->subrs_hash ); + + + if ( val ) + { + idx = *val; + ok = 1; + } + } + else + { + if ( idx < (FT_UInt)type1->num_subrs ) + ok = 1; + } + + if ( ok && type1->subrs ) + { + retval = type1->subrs_len[idx] + 1; + if ( value && value_len >= retval ) + { + ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 ); + ((FT_Char *)value)[retval - 1] = (FT_Char)'\0'; + } + } + } + break; + + case PS_DICT_STD_HW: + retval = sizeof ( type1->private_dict.standard_width[0] ); + if ( value && value_len >= retval ) + *((FT_UShort *)value) = type1->private_dict.standard_width[0]; + break; + + case PS_DICT_STD_VW: + retval = sizeof ( type1->private_dict.standard_height[0] ); + if ( value && value_len >= retval ) + *((FT_UShort *)value) = type1->private_dict.standard_height[0]; + break; + + case PS_DICT_NUM_BLUE_VALUES: + retval = sizeof ( type1->private_dict.num_blue_values ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->private_dict.num_blue_values; + break; + + case PS_DICT_BLUE_VALUE: + if ( idx < type1->private_dict.num_blue_values ) + { + retval = sizeof ( type1->private_dict.blue_values[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.blue_values[idx]; + } + break; + + case PS_DICT_BLUE_SCALE: + retval = sizeof ( type1->private_dict.blue_scale ); + if ( value && value_len >= retval ) + *((FT_Fixed *)value) = type1->private_dict.blue_scale; + break; + + case PS_DICT_BLUE_FUZZ: + retval = sizeof ( type1->private_dict.blue_fuzz ); + if ( value && value_len >= retval ) + *((FT_Int *)value) = type1->private_dict.blue_fuzz; + break; + + case PS_DICT_BLUE_SHIFT: + retval = sizeof ( type1->private_dict.blue_shift ); + if ( value && value_len >= retval ) + *((FT_Int *)value) = type1->private_dict.blue_shift; + break; + + case PS_DICT_NUM_OTHER_BLUES: + retval = sizeof ( type1->private_dict.num_other_blues ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->private_dict.num_other_blues; + break; + + case PS_DICT_OTHER_BLUE: + if ( idx < type1->private_dict.num_other_blues ) + { + retval = sizeof ( type1->private_dict.other_blues[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.other_blues[idx]; + } + break; + + case PS_DICT_NUM_FAMILY_BLUES: + retval = sizeof ( type1->private_dict.num_family_blues ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->private_dict.num_family_blues; + break; + + case PS_DICT_FAMILY_BLUE: + if ( idx < type1->private_dict.num_family_blues ) + { + retval = sizeof ( type1->private_dict.family_blues[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.family_blues[idx]; + } + break; + + case PS_DICT_NUM_FAMILY_OTHER_BLUES: + retval = sizeof ( type1->private_dict.num_family_other_blues ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->private_dict.num_family_other_blues; + break; + + case PS_DICT_FAMILY_OTHER_BLUE: + if ( idx < type1->private_dict.num_family_other_blues ) + { + retval = sizeof ( type1->private_dict.family_other_blues[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.family_other_blues[idx]; + } + break; + + case PS_DICT_NUM_STEM_SNAP_H: + retval = sizeof ( type1->private_dict.num_snap_widths ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->private_dict.num_snap_widths; + break; + + case PS_DICT_STEM_SNAP_H: + if ( idx < type1->private_dict.num_snap_widths ) + { + retval = sizeof ( type1->private_dict.snap_widths[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.snap_widths[idx]; + } + break; + + case PS_DICT_NUM_STEM_SNAP_V: + retval = sizeof ( type1->private_dict.num_snap_heights ); + if ( value && value_len >= retval ) + *((FT_Byte *)value) = type1->private_dict.num_snap_heights; + break; + + case PS_DICT_STEM_SNAP_V: + if ( idx < type1->private_dict.num_snap_heights ) + { + retval = sizeof ( type1->private_dict.snap_heights[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.snap_heights[idx]; + } + break; + + case PS_DICT_RND_STEM_UP: + retval = sizeof ( type1->private_dict.round_stem_up ); + if ( value && value_len >= retval ) + *((FT_Bool *)value) = type1->private_dict.round_stem_up; + break; + + case PS_DICT_FORCE_BOLD: + retval = sizeof ( type1->private_dict.force_bold ); + if ( value && value_len >= retval ) + *((FT_Bool *)value) = type1->private_dict.force_bold; + break; + + case PS_DICT_MIN_FEATURE: + if ( idx < sizeof ( type1->private_dict.min_feature ) / + sizeof ( type1->private_dict.min_feature[0] ) ) + { + retval = sizeof ( type1->private_dict.min_feature[idx] ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->private_dict.min_feature[idx]; + } + break; + + case PS_DICT_LEN_IV: + retval = sizeof ( type1->private_dict.lenIV ); + if ( value && value_len >= retval ) + *((FT_Int *)value) = type1->private_dict.lenIV; + break; + + case PS_DICT_PASSWORD: + retval = sizeof ( type1->private_dict.password ); + if ( value && value_len >= retval ) + *((FT_Long *)value) = type1->private_dict.password; + break; + + case PS_DICT_LANGUAGE_GROUP: + retval = sizeof ( type1->private_dict.language_group ); + if ( value && value_len >= retval ) + *((FT_Long *)value) = type1->private_dict.language_group; + break; + + case PS_DICT_IS_FIXED_PITCH: + retval = sizeof ( type1->font_info.is_fixed_pitch ); + if ( value && value_len >= retval ) + *((FT_Bool *)value) = type1->font_info.is_fixed_pitch; + break; + + case PS_DICT_UNDERLINE_POSITION: + retval = sizeof ( type1->font_info.underline_position ); + if ( value && value_len >= retval ) + *((FT_Short *)value) = type1->font_info.underline_position; + break; + + case PS_DICT_UNDERLINE_THICKNESS: + retval = sizeof ( type1->font_info.underline_thickness ); + if ( value && value_len >= retval ) + *((FT_UShort *)value) = type1->font_info.underline_thickness; + break; + + case PS_DICT_FS_TYPE: + retval = sizeof ( type1->font_extra.fs_type ); + if ( value && value_len >= retval ) + *((FT_UShort *)value) = type1->font_extra.fs_type; + break; + + case PS_DICT_VERSION: + if ( type1->font_info.version ) + { + retval = ft_strlen( type1->font_info.version ) + 1; + if ( value && value_len >= retval ) + ft_memcpy( value, (void *)( type1->font_info.version ), retval ); + } + break; + + case PS_DICT_NOTICE: + if ( type1->font_info.notice ) + { + retval = ft_strlen( type1->font_info.notice ) + 1; + if ( value && value_len >= retval ) + ft_memcpy( value, (void *)( type1->font_info.notice ), retval ); + } + break; + + case PS_DICT_FULL_NAME: + if ( type1->font_info.full_name ) + { + retval = ft_strlen( type1->font_info.full_name ) + 1; + if ( value && value_len >= retval ) + ft_memcpy( value, (void *)( type1->font_info.full_name ), retval ); + } + break; + + case PS_DICT_FAMILY_NAME: + if ( type1->font_info.family_name ) + { + retval = ft_strlen( type1->font_info.family_name ) + 1; + if ( value && value_len >= retval ) + ft_memcpy( value, (void *)( type1->font_info.family_name ), + retval ); + } + break; + + case PS_DICT_WEIGHT: + if ( type1->font_info.weight ) + { + retval = ft_strlen( type1->font_info.weight ) + 1; + if ( value && value_len >= retval ) + ft_memcpy( value, (void *)( type1->font_info.weight ), retval ); + } + break; + + case PS_DICT_ITALIC_ANGLE: + retval = sizeof ( type1->font_info.italic_angle ); + if ( value && value_len >= retval ) + *((FT_Long *)value) = type1->font_info.italic_angle; + break; + } + + return retval == 0 ? -1 : (FT_Long)retval; + } + + + static const FT_Service_PsInfoRec t1_service_ps_info = + { + t1_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */ + t1_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */ + t1_ps_has_glyph_names, /* PS_HasGlyphNamesFunc ps_has_glyph_names */ + t1_ps_get_font_private, /* PS_GetFontPrivateFunc ps_get_font_private */ + t1_ps_get_font_value, /* PS_GetFontValueFunc ps_get_font_value */ + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + static const FT_Service_KerningRec t1_service_kerning = + { + T1_Get_Track_Kerning, /* get_track */ + }; +#endif + + + /* + * PROPERTY SERVICE + * + */ + + FT_DEFINE_SERVICE_PROPERTIESREC( + t1_service_properties, + + ps_property_set, /* FT_Properties_SetFunc set_property */ + ps_property_get /* FT_Properties_GetFunc get_property */ + ) + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t1_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, + { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TYPE_1 }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, + { FT_SERVICE_ID_PROPERTIES, &t1_service_properties }, + +#ifndef T1_CONFIG_OPTION_NO_AFM + { FT_SERVICE_ID_KERNING, &t1_service_kerning }, +#endif + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, +#endif + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + Get_Interface( FT_Module module, + const FT_String* t1_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( t1_services, t1_interface ); + } + + +#ifndef T1_CONFIG_OPTION_NO_AFM + + /************************************************************************** + * + * @Function: + * Get_Kerning + * + * @Description: + * A driver method used to return the kerning vector between two + * glyphs of the same face. + * + * @Input: + * face :: + * A handle to the source face object. + * + * left_glyph :: + * The index of the left glyph in the kern pair. + * + * right_glyph :: + * The index of the right glyph in the kern pair. + * + * @Output: + * kerning :: + * The kerning vector. This is in font units for + * scalable formats, and in pixels for fixed-sizes + * formats. + * + * @Return: + * FreeType error code. 0 means success. + * + * @Note: + * Only horizontal layouts (left-to-right & right-to-left) are + * supported by this function. Other layouts, or more sophisticated + * kernings are out of scope of this method (the basic driver + * interface is meant to be simple). + * + * They can be implemented by format-specific interfaces. + */ + static FT_Error + Get_Kerning( FT_Face t1face, /* T1_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + T1_Face face = (T1_Face)t1face; + + + kerning->x = 0; + kerning->y = 0; + + if ( face->afm_data ) + T1_Get_Kerning( (AFM_FontInfo)face->afm_data, + left_glyph, + right_glyph, + kerning ); + + return FT_Err_Ok; + } + + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof ( PS_DriverRec ), + + "type1", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + T1_Driver_Init, /* FT_Module_Constructor module_init */ + T1_Driver_Done, /* FT_Module_Destructor module_done */ + Get_Interface, /* FT_Module_Requester get_interface */ + }, + + sizeof ( T1_FaceRec ), + sizeof ( T1_SizeRec ), + sizeof ( T1_GlyphSlotRec ), + + T1_Face_Init, /* FT_Face_InitFunc init_face */ + T1_Face_Done, /* FT_Face_DoneFunc done_face */ + T1_Size_Init, /* FT_Size_InitFunc init_size */ + T1_Size_Done, /* FT_Size_DoneFunc done_size */ + T1_GlyphSlot_Init, /* FT_Slot_InitFunc init_slot */ + T1_GlyphSlot_Done, /* FT_Slot_DoneFunc done_slot */ + + T1_Load_Glyph, /* FT_Slot_LoadFunc load_glyph */ + +#ifdef T1_CONFIG_OPTION_NO_AFM + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ +#else + Get_Kerning, /* FT_Face_GetKerningFunc get_kerning */ + T1_Read_Metrics, /* FT_Face_AttachFunc attach_file */ +#endif + T1_Get_Advances, /* FT_Face_GetAdvancesFunc get_advances */ + + T1_Size_Request, /* FT_Size_RequestFunc request_size */ + NULL /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/type1/t1driver.h b/external/freetype/src/type1/t1driver.h new file mode 100644 index 000000000..ee7fcf43e --- /dev/null +++ b/external/freetype/src/type1/t1driver.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * t1driver.h + * + * High-level Type 1 driver interface (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1DRIVER_H_ +#define T1DRIVER_H_ + + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class; + +FT_END_HEADER + +#endif /* T1DRIVER_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1errors.h b/external/freetype/src/type1/t1errors.h new file mode 100644 index 000000000..2fbd1e513 --- /dev/null +++ b/external/freetype/src/type1/t1errors.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * t1errors.h + * + * Type 1 error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the Type 1 error enumeration constants. + * + */ + +#ifndef T1ERRORS_H_ +#define T1ERRORS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX T1_Err_ +#define FT_ERR_BASE FT_Mod_Err_Type1 + +#include <freetype/fterrors.h> + +#endif /* T1ERRORS_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1gload.c b/external/freetype/src/type1/t1gload.c new file mode 100644 index 000000000..a32a4649d --- /dev/null +++ b/external/freetype/src/type1/t1gload.c @@ -0,0 +1,606 @@ +/**************************************************************************** + * + * t1gload.c + * + * Type 1 Glyph Loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "t1gload.h" +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/ftoutln.h> +#include <freetype/internal/psaux.h> +#include <freetype/internal/cfftypes.h> +#include <freetype/ftdriver.h> + +#include "t1errors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1gload + + + static FT_Error + T1_Parse_Glyph_And_Get_Char_String( T1_Decoder decoder, + FT_UInt glyph_index, + FT_Data* char_string, + FT_Bool* force_scaling ) + { + T1_Face face = (T1_Face)decoder->builder.face; + T1_Font type1 = &face->type1; + FT_Error error = FT_Err_Ok; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs; + PS_Decoder psdecoder; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec *inc = + face->root.internal->incremental_interface; +#endif + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face ); +#endif + + + decoder->font_matrix = type1->font_matrix; + decoder->font_offset = type1->font_offset; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( inc ) + error = inc->funcs->get_glyph_data( inc->object, + glyph_index, char_string ); + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* For ordinary fonts get the character data stored in the face record. */ + { + char_string->pointer = type1->charstrings[glyph_index]; + char_string->length = type1->charstrings_len[glyph_index]; + } + + if ( !error ) + { + /* choose which renderer to use */ +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + if ( driver->hinting_engine == FT_HINTING_FREETYPE || + decoder->builder.metrics_only ) + error = decoder_funcs->parse_charstrings_old( + decoder, + (FT_Byte*)char_string->pointer, + (FT_UInt)char_string->length ); +#else + if ( decoder->builder.metrics_only ) + error = decoder_funcs->parse_metrics( + decoder, + (FT_Byte*)char_string->pointer, + (FT_UInt)char_string->length ); +#endif + else + { + CFF_SubFontRec subfont; + + + psaux->ps_decoder_init( &psdecoder, decoder, TRUE ); + + psaux->t1_make_subfont( FT_FACE( face ), + &face->type1.private_dict, &subfont ); + psdecoder.current_subfont = &subfont; + + error = decoder_funcs->parse_charstrings( + &psdecoder, + (FT_Byte*)char_string->pointer, + (FT_ULong)char_string->length ); + + /* Adobe's engine uses 16.16 numbers everywhere; */ + /* as a consequence, glyphs larger than 2000ppem get rejected */ + if ( FT_ERR_EQ( error, Glyph_Too_Big ) ) + { + /* this time, we retry unhinted and scale up the glyph later on */ + /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */ + /* 0x400 for both `x_scale' and `y_scale' in this case) */ + ((T1_GlyphSlot)decoder->builder.glyph)->hint = FALSE; + + *force_scaling = TRUE; + + error = decoder_funcs->parse_charstrings( + &psdecoder, + (FT_Byte*)char_string->pointer, + (FT_ULong)char_string->length ); + } + } + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && inc && inc->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); + metrics.bearing_y = 0; + metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); + metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); + + error = inc->funcs->get_glyph_metrics( inc->object, + glyph_index, FALSE, &metrics ); + + decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); + decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); + decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + T1_Parse_Glyph( T1_Decoder decoder, + FT_UInt glyph_index ) + { + FT_Data glyph_data; + FT_Bool force_scaling = FALSE; + FT_Error error = T1_Parse_Glyph_And_Get_Char_String( + decoder, glyph_index, &glyph_data, + &force_scaling ); + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !error ) + { + T1_Face face = (T1_Face)decoder->builder.face; + + + if ( face->root.internal->incremental_interface ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + T1_Compute_Max_Advance( T1_Face face, + FT_Pos* max_advance ) + { + FT_Error error; + T1_DecoderRec decoder; + FT_Int glyph_index; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + *max_advance = 0; + + /* initialize load decoder */ + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + (FT_Byte**)type1->glyph_names, + face->blend, + 0, + FT_RENDER_MODE_NORMAL, + T1_Parse_Glyph ); + if ( error ) + return error; + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + decoder.subrs_hash = type1->subrs_hash; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + *max_advance = 0; + + FT_TRACE6(( "T1_Compute_Max_Advance:\n" )); + + /* for each glyph, parse the glyph charstring and extract */ + /* the advance width */ + for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ ) + { + /* now get load the unscaled outline */ + (void)T1_Parse_Glyph( &decoder, (FT_UInt)glyph_index ); + if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance ) + *max_advance = decoder.builder.advance.x; + + /* ignore the error if one occurred - skip to next glyph */ + } + + FT_TRACE6(( "T1_Compute_Max_Advance: max advance: %f\n", + (double)*max_advance / 65536 )); + + psaux->t1_decoder_funcs->done( &decoder ); + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Advances( FT_Face t1face, /* T1_Face */ + FT_UInt first, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed* advances ) + { + T1_Face face = (T1_Face)t1face; + T1_DecoderRec decoder; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + FT_UInt nn; + FT_Error error; + + + FT_TRACE5(( "T1_Get_Advances:\n" )); + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + for ( nn = 0; nn < count; nn++ ) + { + advances[nn] = 0; + + FT_TRACE5(( " idx %d: advance height 0 font units\n", + first + nn )); + } + + return FT_Err_Ok; + } + + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + (FT_Byte**)type1->glyph_names, + face->blend, + 0, + FT_RENDER_MODE_NORMAL, + T1_Parse_Glyph ); + if ( error ) + return error; + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + decoder.subrs_hash = type1->subrs_hash; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + for ( nn = 0; nn < count; nn++ ) + { + error = T1_Parse_Glyph( &decoder, first + nn ); + if ( !error ) + advances[nn] = FIXED_TO_INT( decoder.builder.advance.x ); + else + advances[nn] = 0; + + FT_TRACE5(( " idx %d: advance width %ld font unit%s\n", + first + nn, + advances[nn], + advances[nn] == 1 ? "" : "s" )); + } + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Load_Glyph( FT_GlyphSlot t1glyph, /* T1_GlyphSlot */ + FT_Size t1size, /* T1_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + T1_GlyphSlot glyph = (T1_GlyphSlot)t1glyph; + FT_Error error; + T1_DecoderRec decoder; + T1_Face face = (T1_Face)t1glyph->face; + FT_Bool hinting; + FT_Bool scaled; + FT_Bool force_scaling = FALSE; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs; + + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_Data glyph_data; + FT_Bool must_finish_decoder = FALSE; +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Bool glyph_data_loaded = 0; +#endif + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_index >= (FT_UInt)face->root.num_glyphs && + !face->root.internal->incremental_interface ) +#else + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_TRACE1(( "T1_Load_Glyph: glyph index %d\n", glyph_index )); + + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + if ( t1size ) + { + glyph->x_scale = t1size->metrics.x_scale; + glyph->y_scale = t1size->metrics.y_scale; + } + else + { + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + } + + t1glyph->outline.n_points = 0; + t1glyph->outline.n_contours = 0; + + hinting = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE ) && + !( load_flags & FT_LOAD_NO_HINTING ) ); + scaled = FT_BOOL( !( load_flags & FT_LOAD_NO_SCALE ) ); + + glyph->hint = hinting; + glyph->scaled = scaled; + t1glyph->format = FT_GLYPH_FORMAT_OUTLINE; + + error = decoder_funcs->init( &decoder, + t1glyph->face, + t1size, + t1glyph, + (FT_Byte**)type1->glyph_names, + face->blend, + hinting, + FT_LOAD_TARGET_MODE( load_flags ), + T1_Parse_Glyph ); + if ( error ) + goto Exit; + + must_finish_decoder = TRUE; + + decoder.builder.no_recurse = FT_BOOL( load_flags & FT_LOAD_NO_RECURSE ); + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + decoder.subrs_hash = type1->subrs_hash; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + /* now load the unscaled outline */ + error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index, + &glyph_data, + &force_scaling ); + if ( error ) + goto Exit; +#ifdef FT_CONFIG_OPTION_INCREMENTAL + glyph_data_loaded = 1; +#endif + + hinting = glyph->hint; + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + decoder_funcs->done( &decoder ); + + must_finish_decoder = FALSE; + + /* now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + if ( !error ) + { + t1glyph->outline.flags &= FT_OUTLINE_OWNER; + t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = t1glyph->internal; + + + t1glyph->metrics.horiBearingX = + FIXED_TO_INT( decoder.builder.left_bearing.x ); + t1glyph->metrics.horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &t1glyph->metrics; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + t1glyph->linearHoriAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + t1glyph->internal->glyph_transformed = 0; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* make up vertical ones */ + metrics->vertAdvance = ( face->type1.font_bbox.yMax - + face->type1.font_bbox.yMin ) >> 16; + t1glyph->linearVertAdvance = metrics->vertAdvance; + } + else + { + metrics->vertAdvance = + FIXED_TO_INT( decoder.builder.advance.y ); + t1glyph->linearVertAdvance = + FIXED_TO_INT( decoder.builder.advance.y ); + } + + t1glyph->format = FT_GLYPH_FORMAT_OUTLINE; + + if ( t1size && t1size->metrics.y_ppem < 24 ) + t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + +#if 1 + /* apply the font matrix, if any */ + if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || + font_matrix.xy != 0 || font_matrix.yx != 0 ) + { + FT_Outline_Transform( &t1glyph->outline, &font_matrix ); + + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, + font_matrix.xx ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, + font_matrix.yy ); + } + + if ( font_offset.x || font_offset.y ) + { + FT_Outline_Translate( &t1glyph->outline, + font_offset.x, + font_offset.y ); + + metrics->horiAdvance += font_offset.x; + metrics->vertAdvance += font_offset.y; + } +#endif + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = decoder.builder.base; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points, if we are not hinting */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &t1glyph->outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + + /* Set control data to the glyph charstrings. Note that this is */ + /* _not_ zero-terminated. */ + t1glyph->control_data = (FT_Byte*)glyph_data.pointer; + t1glyph->control_len = glyph_data.length; + } + + + Exit: + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_data_loaded && face->root.internal->incremental_interface ) + { + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + + /* Set the control data to null - it is no longer available if */ + /* loaded incrementally. */ + t1glyph->control_data = NULL; + t1glyph->control_len = 0; + } +#endif + + if ( must_finish_decoder ) + decoder_funcs->done( &decoder ); + + return error; + } + + +/* END */ diff --git a/external/freetype/src/type1/t1gload.h b/external/freetype/src/type1/t1gload.h new file mode 100644 index 000000000..c06484758 --- /dev/null +++ b/external/freetype/src/type1/t1gload.h @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * t1gload.h + * + * Type 1 Glyph Loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1GLOAD_H_ +#define T1GLOAD_H_ + + +#include "t1objs.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Compute_Max_Advance( T1_Face face, + FT_Pos* max_advance ); + + FT_LOCAL( FT_Error ) + T1_Get_Advances( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed* advances ); + + FT_LOCAL( FT_Error ) + T1_Load_Glyph( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* T1GLOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1load.c b/external/freetype/src/type1/t1load.c new file mode 100644 index 000000000..be7cd0fd5 --- /dev/null +++ b/external/freetype/src/type1/t1load.c @@ -0,0 +1,2761 @@ +/**************************************************************************** + * + * t1load.c + * + * Type 1 font loader (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This is the new and improved Type 1 data loader for FreeType 2. The + * old loader has several problems: it is slow, complex, difficult to + * maintain, and contains incredible hacks to make it accept some + * ill-formed Type 1 fonts without hiccup-ing. Moreover, about 5% of + * the Type 1 fonts on my machine still aren't loaded correctly by it. + * + * This version is much simpler, much faster and also easier to read and + * maintain by a great order of magnitude. The idea behind it is to + * _not_ try to read the Type 1 token stream with a state machine (i.e. + * a Postscript-like interpreter) but rather to perform simple pattern + * matching. + * + * Indeed, nearly all data definitions follow a simple pattern like + * + * ... /Field <data> ... + * + * where <data> can be a number, a boolean, a string, or an array of + * numbers. There are a few exceptions, namely the encoding, font name, + * charstrings, and subrs; they are handled with a special pattern + * matching routine. + * + * All other common cases are handled very simply. The matching rules + * are defined in the file `t1tokens.h' through the use of several + * macros calls PARSE_XXX. This file is included twice here; the first + * time to generate parsing callback functions, the second time to + * generate a table of keywords (with pointers to the associated + * callback functions). + * + * The function `parse_dict' simply scans *linearly* a given dictionary + * (either the top-level or private one) and calls the appropriate + * callback when it encounters an immediate keyword. + * + * This is by far the fastest way one can find to parse and read all + * data. + * + * This led to tremendous code size reduction. Note that later, the + * glyph loader will also be _greatly_ simplified, and the automatic + * hinter will replace the clumsy `t1hinter'. + * + */ + + +#include <ft2build.h> +#include <freetype/internal/ftdebug.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/ftmm.h> +#include <freetype/internal/t1types.h> +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/fthash.h> + +#include "t1load.h" +#include "t1errors.h" + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#define IS_INCREMENTAL \ + FT_BOOL( FT_FACE( face )->internal->incremental_interface ) +#else +#define IS_INCREMENTAL 0 +#endif + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1load + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SUPPORT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + t1_allocate_blend( T1_Face face, + FT_UInt num_designs, + FT_UInt num_axis ) + { + PS_Blend blend; + FT_Memory memory = face->root.memory; + FT_Error error = FT_Err_Ok; + + + blend = face->blend; + if ( !blend ) + { + if ( FT_NEW( blend ) ) + goto Exit; + + blend->num_default_design_vector = 0; + blend->weight_vector = NULL; + blend->default_weight_vector = NULL; + blend->design_pos[0] = NULL; + + face->blend = blend; + } + + /* allocate design data if needed */ + if ( num_designs > 0 ) + { + if ( blend->num_designs == 0 ) + { + FT_UInt nn; + + + /* allocate the blend `private' and `font_info' dictionaries */ + if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) || + FT_NEW_ARRAY( blend->privates [1], num_designs ) || + FT_NEW_ARRAY( blend->bboxes [1], num_designs ) ) + goto Exit; + + blend->font_infos[0] = &face->type1.font_info; + blend->privates [0] = &face->type1.private_dict; + blend->bboxes [0] = &face->type1.font_bbox; + + for ( nn = 2; nn <= num_designs; nn++ ) + { + blend->font_infos[nn] = blend->font_infos[nn - 1] + 1; + blend->privates [nn] = blend->privates [nn - 1] + 1; + blend->bboxes [nn] = blend->bboxes [nn - 1] + 1; + } + + blend->num_designs = num_designs; + } + else if ( blend->num_designs != num_designs ) + goto Fail; + } + + /* allocate axis data if needed */ + if ( num_axis > 0 ) + { + if ( blend->num_axis != 0 && blend->num_axis != num_axis ) + goto Fail; + + blend->num_axis = num_axis; + } + + Exit: + return error; + + Fail: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Multi_Master( FT_Face face, /* T1_Face */ + FT_Multi_Master* master ) + { + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; + FT_UInt n; + FT_Error error; + + + error = FT_THROW( Invalid_Argument ); + + if ( blend ) + { + master->num_axis = blend->num_axis; + master->num_designs = blend->num_designs; + + for ( n = 0; n < blend->num_axis; n++ ) + { + FT_MM_Axis* axis = master->axis + n; + PS_DesignMap map = blend->design_map + n; + + + axis->name = blend->axis_names[n]; + axis->minimum = map->design_points[0]; + axis->maximum = map->design_points[map->num_points - 1]; + } + + error = FT_Err_Ok; + } + + return error; + } + + + /************************************************************************** + * + * Given a normalized (blend) coordinate, figure out the design + * coordinate appropriate for that value. + */ + static FT_Fixed + mm_axis_unmap( PS_DesignMap axismap, + FT_Fixed ncv ) + { + int j; + + + if ( ncv <= axismap->blend_points[0] ) + return INT_TO_FIXED( axismap->design_points[0] ); + + for ( j = 1; j < axismap->num_points; j++ ) + { + if ( ncv <= axismap->blend_points[j] ) + return INT_TO_FIXED( axismap->design_points[j - 1] + + FT_MulDiv( ncv - axismap->blend_points[j - 1], + axismap->design_points[j] - + axismap->design_points[j - 1], + axismap->blend_points[j] - + axismap->blend_points[j - 1] ) ); + } + + return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] ); + } + + + /************************************************************************** + * + * Given a vector of weights, one for each design, figure out the + * normalized axis coordinates which gave rise to those weights. + */ + static void + mm_weights_unmap( FT_Fixed* weights, + FT_Fixed* axiscoords, + FT_UInt axis_count ) + { + FT_ASSERT( axis_count <= T1_MAX_MM_AXIS ); + + if ( axis_count == 1 ) + axiscoords[0] = weights[1]; + + else if ( axis_count == 2 ) + { + axiscoords[0] = weights[3] + weights[1]; + axiscoords[1] = weights[3] + weights[2]; + } + + else if ( axis_count == 3 ) + { + axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1]; + axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2]; + axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4]; + } + + else + { + axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] + + weights[7] + weights[5] + weights[3] + weights[1]; + axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] + + weights[7] + weights[6] + weights[3] + weights[2]; + axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] + + weights[7] + weights[6] + weights[5] + weights[4]; + axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] + + weights[11] + weights[10] + weights[9] + weights[8]; + } + } + + + /************************************************************************** + * + * Just a wrapper around T1_Get_Multi_Master to support the different + * arguments needed by the GX var distortable fonts. + */ + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Var( FT_Face face, /* T1_Face */ + FT_MM_Var* *master ) + { + T1_Face t1face = (T1_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_MM_Var *mmvar = NULL; + FT_Multi_Master mmaster; + FT_Error error; + FT_UInt i; + FT_Fixed axiscoords[T1_MAX_MM_AXIS]; + PS_Blend blend = t1face->blend; + FT_UShort* axis_flags; + + FT_Offset mmvar_size; + FT_Offset axis_flags_size; + FT_Offset axis_size; + + + error = T1_Get_Multi_Master( face, &mmaster ); + if ( error ) + goto Exit; + + /* the various `*_size' variables, which we also use as */ + /* offsets into the `mmvar' array, must be multiples of the */ + /* pointer size (except the last one); without such an */ + /* alignment there might be runtime errors due to */ + /* misaligned addresses */ +#undef ALIGN_SIZE +#define ALIGN_SIZE( n ) \ + ( ( (n) + sizeof (void*) - 1 ) & ~( sizeof (void*) - 1 ) ) + + mmvar_size = ALIGN_SIZE( sizeof ( FT_MM_Var ) ); + axis_flags_size = ALIGN_SIZE( mmaster.num_axis * + sizeof ( FT_UShort ) ); + axis_size = mmaster.num_axis * sizeof ( FT_Var_Axis ); + + if ( FT_QALLOC( mmvar, mmvar_size + + axis_flags_size + + axis_size ) ) + goto Exit; + + mmvar->num_axis = mmaster.num_axis; + mmvar->num_designs = mmaster.num_designs; + mmvar->num_namedstyles = 0; /* Not supported */ + + /* while axis flags are meaningless here, we have to provide the array */ + /* to make `FT_Get_Var_Axis_Flags' work: the function expects that the */ + /* values directly follow the data of `FT_MM_Var' */ + axis_flags = (FT_UShort*)( (char*)mmvar + mmvar_size ); + FT_ARRAY_ZERO( axis_flags, mmaster.num_axis ); + + mmvar->axis = (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); + mmvar->namedstyle = NULL; + + for ( i = 0; i < mmaster.num_axis; i++ ) + { + mmvar->axis[i].name = mmaster.axis[i].name; + mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum ); + mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum ); + mmvar->axis[i].strid = ~0U; /* Does not apply */ + mmvar->axis[i].tag = ~0U; /* Does not apply */ + + if ( !mmvar->axis[i].name ) + continue; + + if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' ); + else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' ); + else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' ); + else if ( ft_strcmp( mmvar->axis[i].name, "Slant" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 's', 'l', 'n', 't' ); + else if ( ft_strcmp( mmvar->axis[i].name, "Italic" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'i', 't', 'a', 'l' ); + } + + mm_weights_unmap( blend->default_weight_vector, + axiscoords, + blend->num_axis ); + + for ( i = 0; i < mmaster.num_axis; i++ ) + mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i], + axiscoords[i] ); + + *master = mmvar; + + Exit: + return error; + } + + + static FT_Error + t1_set_mm_blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + PS_Blend blend = face->blend; + FT_UInt n, m; + + FT_Bool have_diff = 0; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + if ( num_coords > blend->num_axis ) + num_coords = blend->num_axis; + + /* recompute the weight vector from the blend coordinates */ + for ( n = 0; n < blend->num_designs; n++ ) + { + FT_Fixed result = 0x10000L; /* 1.0 fixed */ + FT_Fixed factor; + + + for ( m = 0; m < blend->num_axis; m++ ) + { + /* use a default value if we don't have a coordinate */ + if ( m >= num_coords ) + { + result >>= 1; + continue; + } + + /* get current blend axis position */ + factor = coords[m]; + if ( ( n & ( 1 << m ) ) == 0 ) + factor = 0x10000L - factor; + + if ( factor <= 0 ) + { + result = 0; + break; + } + else if ( factor >= 0x10000L ) + continue; + + result = FT_MulFix( result, factor ); + } + + if ( blend->weight_vector[n] != result ) + { + blend->weight_vector[n] = result; + have_diff = 1; + } + } + + /* return value -1 indicates `no change' */ + return have_diff ? FT_Err_Ok : -1; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_Blend( FT_Face face, /* T1_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + return t1_set_mm_blend( (T1_Face)face, num_coords, coords ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Blend( FT_Face face, /* T1_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; + + FT_Fixed axiscoords[4]; + FT_UInt i, nc; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + mm_weights_unmap( blend->weight_vector, + axiscoords, + blend->num_axis ); + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "T1_Get_MM_Blend: only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + for ( i = 0; i < nc; i++ ) + coords[i] = axiscoords[i]; + for ( ; i < num_coords; i++ ) + coords[i] = 0x8000; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_WeightVector( FT_Face face, /* T1_Face */ + FT_UInt len, + FT_Fixed* weightvector ) + { + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; + FT_UInt i, n; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + if ( !len && !weightvector ) + { + for ( i = 0; i < blend->num_designs; i++ ) + blend->weight_vector[i] = blend->default_weight_vector[i]; + } + else + { + if ( !weightvector ) + return FT_THROW( Invalid_Argument ); + + n = len < blend->num_designs ? len : blend->num_designs; + + for ( i = 0; i < n; i++ ) + blend->weight_vector[i] = weightvector[i]; + + for ( ; i < blend->num_designs; i++ ) + blend->weight_vector[i] = (FT_Fixed)0; + } + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_WeightVector( FT_Face face, /* T1_Face */ + FT_UInt* len, + FT_Fixed* weightvector ) + { + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; + FT_UInt i; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + if ( *len < blend->num_designs ) + { + *len = blend->num_designs; + return FT_THROW( Invalid_Argument ); + } + + for ( i = 0; i < blend->num_designs; i++ ) + weightvector[i] = blend->weight_vector[i]; + for ( ; i < *len; i++ ) + weightvector[i] = (FT_Fixed)0; + + *len = blend->num_designs; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_Design( FT_Face face, /* T1_Face */ + FT_UInt num_coords, + FT_Long* coords ) + { + T1_Face t1face = (T1_Face)face; + FT_Error error; + PS_Blend blend = t1face->blend; + FT_UInt n; + FT_Fixed final_blends[T1_MAX_MM_DESIGNS]; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + if ( num_coords > blend->num_axis ) + num_coords = blend->num_axis; + + /* compute the blend coordinates through the blend design map */ + + for ( n = 0; n < blend->num_axis; n++ ) + { + FT_Long design; + FT_Fixed the_blend; + PS_DesignMap map = blend->design_map + n; + FT_Long* designs = map->design_points; + FT_Fixed* blends = map->blend_points; + FT_Int p, before = -1, after = -1; + + + /* use a default value if we don't have a coordinate */ + if ( n < num_coords ) + design = coords[n]; + else + design = ( designs[map->num_points - 1] - designs[0] ) / 2; + + for ( p = 0; p < (FT_Int)map->num_points; p++ ) + { + FT_Long p_design = designs[p]; + + + /* exact match? */ + if ( design == p_design ) + { + the_blend = blends[p]; + goto Found; + } + + if ( design < p_design ) + { + after = p; + break; + } + + before = p; + } + + /* now interpolate if necessary */ + if ( before < 0 ) + the_blend = blends[0]; + + else if ( after < 0 ) + the_blend = blends[map->num_points - 1]; + + else + the_blend = FT_MulDiv( design - designs[before], + blends [after] - blends [before], + designs[after] - designs[before] ); + + Found: + final_blends[n] = the_blend; + } + + error = t1_set_mm_blend( t1face, blend->num_axis, final_blends ); + if ( error ) + return error; + + return FT_Err_Ok; + } + + + /* MM fonts don't have named instances, so only the design is reset */ + + FT_LOCAL_DEF( FT_Error ) + T1_Reset_MM_Blend( FT_Face face, + FT_UInt instance_index ) + { + FT_UNUSED( instance_index ); + + return T1_Set_MM_Blend( face, 0, NULL ); + } + + + /************************************************************************** + * + * Just a wrapper around T1_Set_MM_Design to support the different + * arguments needed by the GX var distortable fonts. + */ + FT_LOCAL_DEF( FT_Error ) + T1_Set_Var_Design( FT_Face face, /* T1_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Long lcoords[T1_MAX_MM_AXIS]; + FT_UInt i; + + + if ( num_coords > T1_MAX_MM_AXIS ) + num_coords = T1_MAX_MM_AXIS; + + for ( i = 0; i < num_coords; i++ ) + lcoords[i] = FIXED_TO_INT( coords[i] ); + + return T1_Set_MM_Design( face, num_coords, lcoords ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Var_Design( FT_Face face, /* T1_Face */ + FT_UInt num_coords, + FT_Fixed* coords ) + { + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; + + FT_Fixed axiscoords[4]; + FT_UInt i, nc; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + mm_weights_unmap( blend->weight_vector, + axiscoords, + blend->num_axis ); + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "T1_Get_Var_Design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + for ( i = 0; i < nc; i++ ) + coords[i] = mm_axis_unmap( &blend->design_map[i], axiscoords[i] ); + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + T1_Done_Blend( FT_Face face ) /* T1_Face */ + { + T1_Face t1face = (T1_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + PS_Blend blend = t1face->blend; + + + if ( blend ) + { + FT_UInt num_designs = blend->num_designs; + FT_UInt num_axis = blend->num_axis; + FT_UInt n; + + + /* release design pos table */ + FT_FREE( blend->design_pos[0] ); + for ( n = 1; n < num_designs; n++ ) + blend->design_pos[n] = NULL; + + /* release blend `private' and `font info' dictionaries */ + FT_FREE( blend->privates[1] ); + FT_FREE( blend->font_infos[1] ); + FT_FREE( blend->bboxes[1] ); + + for ( n = 0; n < num_designs; n++ ) + { + blend->privates [n] = NULL; + blend->font_infos[n] = NULL; + blend->bboxes [n] = NULL; + } + + /* release weight vectors */ + FT_FREE( blend->weight_vector ); + blend->default_weight_vector = NULL; + + /* release axis names */ + for ( n = 0; n < num_axis; n++ ) + FT_FREE( blend->axis_names[n] ); + + /* release design map */ + for ( n = 0; n < num_axis; n++ ) + { + PS_DesignMap dmap = blend->design_map + n; + + + FT_FREE( dmap->design_points ); + dmap->num_points = 0; + } + + FT_FREE( t1face->blend ); + } + } + + + static void + parse_blend_axis_types( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + FT_Int n, num_axis; + FT_Error error = FT_Err_Ok; + PS_Blend blend; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + /* take an array of objects */ + T1_ToTokenArray( &loader->parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = FT_ERR( Ignore ); + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n", + num_axis )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* allocate blend if necessary */ + error = t1_allocate_blend( t1face, 0, (FT_UInt)num_axis ); + if ( error ) + goto Exit; + + FT_TRACE4(( " [" )); + + blend = t1face->blend; + + /* each token is an immediate containing the name of the axis */ + for ( n = 0; n < num_axis; n++ ) + { + T1_Token token = axis_tokens + n; + FT_Byte* name; + FT_UInt len; + + + /* skip first slash, if any */ + if ( token->start[0] == '/' ) + token->start++; + + len = (FT_UInt)( token->limit - token->start ); + if ( len == 0 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_TRACE4(( " /%.*s", len, token->start )); + + name = (FT_Byte*)blend->axis_names[n]; + if ( name ) + { + FT_TRACE0(( "parse_blend_axis_types:" + " overwriting axis name `%s' with `%.*s'\n", + name, len, token->start )); + FT_FREE( name ); + } + + if ( FT_QALLOC( blend->axis_names[n], len + 1 ) ) + goto Exit; + + name = (FT_Byte*)blend->axis_names[n]; + FT_MEM_COPY( name, token->start, len ); + name[len] = '\0'; + } + + FT_TRACE4(( "]\n" )); + + Exit: + loader->parser.root.error = error; + } + + + static void + parse_blend_design_positions( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Int num_axis = 0; /* make compiler happy */ + T1_Parser parser = &loader->parser; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error = FT_Err_Ok; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + + + design_pos[0] = NULL; + + /* get the array of design tokens -- compute number of designs */ + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = FT_ERR( Ignore ); + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_blend_design_positions:" + " incorrect number of designs: %d\n", + num_designs )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + { + FT_Byte* old_cursor = parser->root.cursor; + FT_Byte* old_limit = parser->root.limit; + FT_Int n, nn; + PS_Blend blend; + + + FT_TRACE4(( " [" )); + + for ( n = 0; n < num_designs; n++ ) + { + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + T1_Token token; + FT_Int axis, n_axis; + + + /* read axis/coordinates tokens */ + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis ); + + if ( n == 0 ) + { + if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_design_positions:" + " invalid number of axes: %d\n", + n_axis )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + num_axis = n_axis; + error = t1_allocate_blend( t1face, + (FT_UInt)num_designs, + (FT_UInt)num_axis ); + if ( error ) + goto Exit; + + /* allocate a blend design pos table */ + if ( FT_QNEW_ARRAY( design_pos[0], num_designs * num_axis ) ) + goto Exit; + + for ( nn = 1; nn < num_designs; nn++ ) + design_pos[nn] = design_pos[0] + num_axis * nn; + } + else if ( n_axis != num_axis ) + { + FT_ERROR(( "parse_blend_design_positions: incorrect table\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* now read each axis token into the design position */ + FT_TRACE4(( " [" )) ; + for ( axis = 0; axis < n_axis; axis++ ) + { + T1_Token token2 = axis_tokens + axis; + + + parser->root.cursor = token2->start; + parser->root.limit = token2->limit; + design_pos[n][axis] = T1_ToFixed( parser, 0 ); + FT_TRACE4(( " %f", (double)design_pos[n][axis] / 65536 )); + } + FT_TRACE4(( "]" )) ; + } + + FT_TRACE4(( "]\n" )); + + loader->parser.root.cursor = old_cursor; + loader->parser.root.limit = old_limit; + + /* a valid BlendDesignPosition has been parsed */ + blend = t1face->blend; + if ( blend->design_pos[0] ) + FT_FREE( blend->design_pos[0] ); + + for ( n = 0; n < num_designs; n++ ) + { + blend->design_pos[n] = design_pos[n]; + design_pos[n] = NULL; + } + } + + Exit: + FT_FREE( design_pos[0] ); + loader->parser.root.error = error; + } + + + static void + parse_blend_design_map( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + FT_Error error = FT_Err_Ok; + T1_Parser parser = &loader->parser; + PS_Blend blend; + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + FT_Int n, num_axis; + FT_Byte* old_cursor; + FT_Byte* old_limit; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + T1_ToTokenArray( parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = FT_ERR( Ignore ); + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n", + num_axis )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + error = t1_allocate_blend( t1face, 0, (FT_UInt)num_axis ); + if ( error ) + goto Exit; + blend = t1face->blend; + + FT_TRACE4(( " [" )); + + /* now read each axis design map */ + for ( n = 0; n < num_axis; n++ ) + { + PS_DesignMap map = blend->design_map + n; + T1_Token axis_token; + T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; + FT_Int p, num_points; + + + axis_token = axis_tokens + n; + + parser->root.cursor = axis_token->start; + parser->root.limit = axis_token->limit; + T1_ToTokenArray( parser, point_tokens, + T1_MAX_MM_MAP_POINTS, &num_points ); + + FT_TRACE4(( " [" )); + + if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) + { + FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( map->design_points ) + { + FT_ERROR(( "parse_blend_design_map: duplicate table\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* allocate design map data */ + if ( FT_QNEW_ARRAY( map->design_points, num_points * 2 ) ) + goto Exit; + map->blend_points = map->design_points + num_points; + map->num_points = (FT_Byte)num_points; + + for ( p = 0; p < num_points; p++ ) + { + T1_Token point_token; + + + point_token = point_tokens + p; + + /* don't include delimiting brackets */ + parser->root.cursor = point_token->start + 1; + parser->root.limit = point_token->limit - 1; + + map->design_points[p] = T1_ToInt( parser ); + map->blend_points [p] = T1_ToFixed( parser, 0 ); + + FT_TRACE4(( " [%ld %f]", + map->design_points[p], + (double)map->blend_points[p] / 65536 )); + } + + FT_TRACE4(( "]" )); + } + + FT_TRACE4(( "]\n" )); + + parser->root.cursor = old_cursor; + parser->root.limit = old_limit; + + Exit: + parser->root.error = error; + } + + + static void + parse_weight_vector( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Error error = FT_Err_Ok; + FT_Memory memory = FT_FACE_MEMORY( face ); + T1_Parser parser = &loader->parser; + PS_Blend blend = t1face->blend; + T1_Token token; + FT_Int n; + FT_Byte* old_cursor; + FT_Byte* old_limit; + + + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = FT_ERR( Ignore ); + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_weight_vector:" + " incorrect number of designs: %d\n", + num_designs )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( !blend || !blend->num_designs ) + { + error = t1_allocate_blend( t1face, (FT_UInt)num_designs, 0 ); + if ( error ) + goto Exit; + blend = t1face->blend; + } + else if ( blend->num_designs != (FT_UInt)num_designs ) + { + FT_ERROR(( "parse_weight_vector:" + " /BlendDesignPosition and /WeightVector have\n" )); + FT_ERROR(( " " + " different number of elements\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( !blend->weight_vector ) + if ( FT_QNEW_ARRAY( blend->weight_vector, num_designs * 2 ) ) + goto Exit; + + blend->default_weight_vector = blend->weight_vector + num_designs; + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + FT_TRACE4(( "[" )); + + for ( n = 0; n < num_designs; n++ ) + { + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + + blend->default_weight_vector[n] = + blend->weight_vector[n] = T1_ToFixed( parser, 0 ); + + FT_TRACE4(( " %f", (double)blend->weight_vector[n] / 65536 )); + } + + FT_TRACE4(( "]\n" )); + + parser->root.cursor = old_cursor; + parser->root.limit = old_limit; + + Exit: + parser->root.error = error; + } + + + /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */ + /* we're only interested in the number of array elements */ + static void + parse_buildchar( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + + + t1face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser, + 0, NULL, 0 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + FT_TRACE4(( " [" )); + for ( i = 0; i < t1face->len_buildchar; i++ ) + FT_TRACE4(( " 0" )); + + FT_TRACE4(( "]\n" )); + } +#endif + + return; + } + + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + t1_load_keyword( T1_Face face, + T1_Loader loader, + const T1_Field field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects; + PS_Blend blend = face->blend; + + + if ( blend && blend->num_designs == 0 ) + blend = NULL; + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { + FT_TRACE4(( " %s", field->ident )); + + field->reader( (FT_Face)face, loader ); + error = loader->parser.root.error; + goto Exit; + } + + /* now, the keyword is either a simple field, or a table of fields; */ + /* we are now going to take care of it */ + switch ( field->location ) + { + case T1_FIELD_LOCATION_FONT_INFO: + dummy_object = &face->type1.font_info; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->font_infos; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + dummy_object = &face->type1.font_extra; + objects = &dummy_object; + max_objects = 0; + break; + + case T1_FIELD_LOCATION_PRIVATE: + dummy_object = &face->type1.private_dict; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->privates; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->bboxes; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_LOADER: + dummy_object = loader; + objects = &dummy_object; + max_objects = 0; + break; + + case T1_FIELD_LOCATION_FACE: + dummy_object = face; + objects = &dummy_object; + max_objects = 0; + break; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + case T1_FIELD_LOCATION_BLEND: + dummy_object = face->blend; + objects = &dummy_object; + max_objects = 0; + break; +#endif + + default: + dummy_object = &face->type1; + objects = &dummy_object; + max_objects = 0; + } + + FT_TRACE4(( " %s", field->ident )); + + if ( *objects ) + { + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + } + else + { + FT_TRACE1(( "t1_load_keyword: ignoring keyword `%s'" + " which is not valid at this point\n", + field->ident )); + FT_TRACE1(( " (probably due to missing keywords)\n" )); + error = FT_Err_Ok; + } + + FT_TRACE4(( "\n" )); + + Exit: + return error; + } + + + static void + parse_private( FT_Face face, + void* loader_ ) + { + T1_Loader loader = (T1_Loader)loader_; + FT_UNUSED( face ); + + loader->keywords_encountered |= T1_PRIVATE; + + FT_TRACE4(( "\n" )); + } + + + /* return 1 in case of success */ + + static int + read_binary_data( T1_Parser parser, + FT_ULong* size, + FT_Byte** base, + FT_Bool incremental ) + { + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + + /* the binary data has one of the following formats */ + /* */ + /* `size' [white*] RD white ....... ND */ + /* `size' [white*] -| white ....... |- */ + /* */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + + if ( cur < limit && ft_isdigit( *cur ) ) + { + FT_Long s = T1_ToInt( parser ); + + + T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ + + /* there is only one whitespace char after the */ + /* `RD' or `-|' token */ + *base = parser->root.cursor + 1; + + if ( s >= 0 && s < limit - *base ) + { + parser->root.cursor += s + 1; + *size = (FT_ULong)s; + return !parser->root.error; + } + } + + if( !incremental ) + { + FT_ERROR(( "read_binary_data: invalid size field\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + } + + return 0; + } + + + /* We now define the routines to handle the `/Encoding', `/Subrs', */ + /* and `/CharStrings' dictionaries. */ + + static void + t1_parse_font_matrix( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_Parser parser = &loader->parser; + FT_Matrix* matrix = &t1face->type1.font_matrix; + FT_Vector* offset = &t1face->type1.font_offset; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + FT_Int result; + + + /* input is scaled by 1000 to accommodate default FontMatrix */ + result = T1_ToFixedArray( parser, 6, temp, 3 ); + + if ( result < 6 ) + { + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + FT_TRACE4(( " [%f %f %f %f %f %f]\n", + (double)temp[0] / 65536 / 1000, + (double)temp[1] / 65536 / 1000, + (double)temp[2] / 65536 / 1000, + (double)temp[3] / 65536 / 1000, + (double)temp[4] / 65536 / 1000, + (double)temp[5] / 65536 / 1000 )); + + temp_scale = FT_ABS( temp[3] ); + + if ( temp_scale == 0 ) + { + FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* atypical case */ + if ( temp_scale != 0x10000L ) + { + /* set units per EM based on FontMatrix values */ + face->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); + + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; + } + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + if ( !FT_Matrix_Check( matrix ) ) + { + FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* note that the offsets must be expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + + static void + parse_encoding( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + PSAux_Service psaux = (PSAux_Service)t1face->psaux; + + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) + { + FT_ERROR(( "parse_encoding: out of bounds\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) + { + T1_Encoding encode = &t1face->type1.encoding; + FT_Int count, array_size, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Bool only_immediates = 0; + + + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_Int)T1_ToInt( parser ); + + array_size = count; + if ( count > 256 ) + { + FT_TRACE2(( "parse_encoding:" + " only using first 256 encoding array entries\n" )); + array_size = 256; + } + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) + return; + + /* PostScript happily allows overwriting of encoding arrays */ + if ( encode->char_index ) + { + FT_FREE( encode->char_index ); + FT_FREE( encode->char_name ); + T1_Release_Table( char_table ); + } + + /* we use a T1_Table to store our charnames */ + loader->num_chars = encode->num_chars = array_size; + if ( FT_QNEW_ARRAY( encode->char_index, array_size ) || + FT_QNEW_ARRAY( encode->char_name, array_size ) || + FT_SET_ERROR( psaux->ps_table_funcs->init( + char_table, array_size, memory ) ) ) + { + parser->root.error = error; + return; + } + + /* We need to `zero' out encoding_table.elements */ + for ( n = 0; n < array_size; n++ ) + (void)T1_Add_Table( char_table, n, ".notdef", 8 ); + + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ + /* */ + /* We simply look for a number followed by an immediate */ + /* name. Note that this ignores correctly the sequence */ + /* that is often seen in type1 fonts: */ + /* */ + /* 0 1 255 { 1 index exch /.notdef put } for dup */ + /* */ + /* used to clean the encoding array before anything else. */ + /* */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ + + n = 0; + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + /* we stop when we encounter a `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + IS_PS_DELIM( cur[3] ) ) + { + FT_TRACE6(( "encoding end\n" )); + cur += 3; + break; + } + } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } + + /* check whether we've found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) + { + FT_Int charcode; + + + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + + /* protect against invalid charcode */ + if ( cur == parser->root.cursor ) + { + parser->root.error = FT_THROW( Unknown_File_Format ); + return; + } + } + + cur = parser->root.cursor; + + if ( cur + 2 < limit && *cur == '/' && n < count ) + { + FT_UInt len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.cursor >= limit ) + return; + if ( parser->root.error ) + return; + + len = (FT_UInt)( parser->root.cursor - cur ); + + if ( n < array_size ) + { + parser->root.error = T1_Add_Table( char_table, charcode, + cur, len + 1 ); + if ( parser->root.error ) + return; + char_table->elements[charcode][len] = '\0'; + } + + n++; + } + else if ( only_immediates ) + { + /* Since the current position is not updated for */ + /* immediates-only mode we would get an infinite loop if */ + /* we don't do anything here. */ + /* */ + /* This encoding array is not valid according to the type1 */ + /* specification (it might be an encoding for a CID type1 */ + /* font, however), so we conclude that this font is NOT a */ + /* type1 font. */ + parser->root.error = FT_THROW( Unknown_File_Format ); + return; + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + } + + T1_Skip_Spaces( parser ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " [" )); + + /* XXX show encoding vector */ + FT_TRACE4(( "..." )); + + FT_TRACE4(( "]\n" )); +#endif + + t1face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; + } + + /* Otherwise, we should have either `StandardEncoding', */ + /* `ExpertEncoding', or `ISOLatin1Encoding' */ + else + { + if ( cur + 17 < limit && + ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + { + t1face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + FT_TRACE4(( " StandardEncoding\n" )); + } + + else if ( cur + 15 < limit && + ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + { + t1face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + FT_TRACE4(( " ExpertEncoding\n" )); + } + + else if ( cur + 18 < limit && + ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + { + t1face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + FT_TRACE4(( " ISOLatin1Encoding\n" )); + } + + else + { + parser->root.error = FT_ERR( Ignore ); + FT_TRACE4(( "<unknown>\n" )); + } + } + } + + + static void + parse_subrs( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_Parser parser = &loader->parser; + PS_Table table = &loader->subrs; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Int num_subrs; + FT_UInt count; + + PSAux_Service psaux = (PSAux_Service)t1face->psaux; + + + T1_Skip_Spaces( parser ); + + /* test for empty array */ + if ( parser->root.cursor < parser->root.limit && + *parser->root.cursor == '[' ) + { + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + if ( parser->root.cursor >= parser->root.limit || + *parser->root.cursor != ']' ) + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + num_subrs = (FT_Int)T1_ToInt( parser ); + if ( num_subrs < 0 ) + { + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* we certainly need more than 8 bytes per subroutine */ + if ( parser->root.limit >= parser->root.cursor && + num_subrs > ( parser->root.limit - parser->root.cursor ) >> 3 ) + { + /* + * There are two possibilities. Either the font contains an invalid + * value for `num_subrs', or we have a subsetted font where the + * subroutine indices are not adjusted, e.g. + * + * /Subrs 812 array + * dup 0 { ... } NP + * dup 51 { ... } NP + * dup 681 { ... } NP + * ND + * + * In both cases, we use a number hash that maps from subr indices to + * actual array elements. + */ + + FT_TRACE0(( "parse_subrs: adjusting number of subroutines" + " (from %d to %zu)\n", + num_subrs, + ( parser->root.limit - parser->root.cursor ) >> 3 )); + num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3; + + if ( !loader->subrs_hash ) + { + if ( FT_QNEW( loader->subrs_hash ) ) + goto Fail; + + error = ft_hash_num_init( loader->subrs_hash, memory ); + if ( error ) + goto Fail; + } + } + + /* position the parser right before the `dup' of the first subr */ + T1_Skip_PS_Token( parser ); /* `array' */ + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + + /* initialize subrs array -- with synthetic fonts it is possible */ + /* we get here twice */ + if ( !loader->num_subrs ) + { + error = psaux->ps_table_funcs->init( table, num_subrs, memory ); + if ( error ) + goto Fail; + } + + /* the format is simple: */ + /* */ + /* `index' + binary data */ + /* */ + for ( count = 0; ; count++ ) + { + FT_Long idx; + FT_ULong size; + FT_Byte* base; + + + /* If we are out of data, or if the next token isn't `dup', */ + /* we are done. */ + if ( parser->root.cursor + 4 >= parser->root.limit || + ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) + break; + + T1_Skip_PS_Token( parser ); /* `dup' */ + + idx = T1_ToInt( parser ); + + if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) ) + return; + + /* The binary string is followed by one token, e.g. `NP' */ + /* (bound to `noaccess put') or by two separate tokens: */ + /* `noaccess' & `put'. We position the parser right */ + /* before the next `dup', if any. */ + T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */ + if ( parser->root.error ) + return; + T1_Skip_Spaces ( parser ); + + if ( parser->root.cursor + 4 < parser->root.limit && + ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) + { + T1_Skip_PS_Token( parser ); /* skip `put' */ + T1_Skip_Spaces ( parser ); + } + + /* if we use a hash, the subrs index is the key, and a running */ + /* counter specified for `T1_Add_Table' acts as the value */ + if ( loader->subrs_hash ) + { + ft_hash_num_insert( idx, count, loader->subrs_hash, memory ); + idx = count; + } + + /* with synthetic fonts it is possible we get here twice */ + if ( loader->num_subrs ) + continue; + + /* some fonts use a value of -1 for lenIV to indicate that */ + /* the charstrings are unencoded */ + /* */ + /* thanks to Tom Kacvinsky for pointing this out */ + /* */ + if ( t1face->type1.private_dict.lenIV >= 0 ) + { + FT_Byte* temp = NULL; + + + /* some fonts define empty subr records -- this is not totally */ + /* compliant to the specification (which says they should at */ + /* least contain a `return'), but we support them anyway */ + if ( size < (FT_ULong)t1face->type1.private_dict.lenIV ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( FT_QALLOC( temp, size ) ) + goto Fail; + FT_MEM_COPY( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); + size -= (FT_ULong)t1face->type1.private_dict.lenIV; + error = T1_Add_Table( table, + (FT_Int)idx, + temp + t1face->type1.private_dict.lenIV, + size ); + FT_FREE( temp ); + } + else + error = T1_Add_Table( table, (FT_Int)idx, base, size ); + if ( error ) + goto Fail; + } + + if ( !loader->num_subrs ) + loader->num_subrs = num_subrs; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " <" )); + + /* XXX show subrs? */ + FT_TRACE4(( "%d elements", num_subrs )); + + FT_TRACE4(( ">\n" )); +#endif + + return; + + Fail: + parser->root.error = error; + } + + +#define TABLE_EXTEND 5 + + + static void + parse_charstrings( FT_Face face, /* T1_Face */ + void* loader_ ) + { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + T1_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)t1face->psaux; + + FT_Byte* cur = parser->root.cursor; + FT_Byte* limit = parser->root.limit; + FT_Int n, num_glyphs; + FT_Int notdef_index = 0; + FT_Byte notdef_found = 0; + + + num_glyphs = (FT_Int)T1_ToInt( parser ); + if ( num_glyphs < 0 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* we certainly need more than 8 bytes per glyph */ + if ( num_glyphs > ( limit - cur ) >> 3 ) + { + FT_TRACE0(( "parse_charstrings: adjusting number of glyphs" + " (from %d to %zu)\n", + num_glyphs, ( limit - cur ) >> 3 )); + num_glyphs = ( limit - cur ) >> 3; + } + + /* some fonts like Optima-Oblique not only define the /CharStrings */ + /* array but access it also */ + if ( num_glyphs == 0 || parser->root.error ) + return; + + /* initialize tables, leaving space for addition of .notdef, */ + /* if necessary, and a few other glyphs to handle buggy */ + /* fonts which have more glyphs than specified. */ + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( !loader->num_glyphs ) + { + error = psaux->ps_table_funcs->init( + code_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( + name_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; + + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + } + + n = 0; + + for (;;) + { + FT_ULong size; + FT_Byte* base; + + + /* the format is simple: */ + /* `/glyphname' + binary data */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* we stop when we find a `def' or `end' keyword */ + if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) ) + { + if ( cur[0] == 'd' && + cur[1] == 'e' && + cur[2] == 'f' ) + { + /* There are fonts which have this: */ + /* */ + /* /CharStrings 118 dict def */ + /* Private begin */ + /* CharStrings begin */ + /* ... */ + /* */ + /* To catch this we ignore `def' if */ + /* no charstring has actually been */ + /* seen. */ + if ( n ) + break; + } + + if ( cur[0] == 'e' && + cur[1] == 'n' && + cur[2] == 'd' ) + break; + } + + T1_Skip_PS_Token( parser ); + if ( parser->root.cursor >= limit ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + if ( parser->root.error ) + return; + + if ( *cur == '/' ) + { + FT_UInt len; + + + if ( cur + 2 >= limit ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + cur++; /* skip `/' */ + len = (FT_UInt)( parser->root.cursor - cur ); + + if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) ) + return; + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( loader->num_glyphs ) + continue; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + /* add a trailing zero to the name table */ + name_table->elements[n][len] = '\0'; + + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)( name_table->elements[n] ) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + if ( t1face->type1.private_dict.lenIV >= 0 && + n < num_glyphs + TABLE_EXTEND ) + { + FT_Byte* temp = NULL; + + + if ( size <= (FT_ULong)t1face->type1.private_dict.lenIV ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( FT_QALLOC( temp, size ) ) + goto Fail; + FT_MEM_COPY( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); + size -= (FT_ULong)t1face->type1.private_dict.lenIV; + error = T1_Add_Table( code_table, + n, + temp + t1face->type1.private_dict.lenIV, + size ); + FT_FREE( temp ); + } + else + error = T1_Add_Table( code_table, n, base, size ); + if ( error ) + goto Fail; + + n++; + } + } + + if ( !n ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + loader->num_glyphs = n; + + /* if /.notdef is found but does not occupy index 0, do our magic. */ + if ( notdef_found && + ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + else if ( !notdef_found ) + { + /* notdef_index is already 0, or /.notdef is undefined in */ + /* charstrings dictionary. Worry about /.notdef undefined. */ + /* We take index 0 and add it to the end of the table(s) */ + /* and add our own /.notdef glyph to index 0. */ + + /* 0 333 hsbw endchar */ + FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E }; + + + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, ".notdef", 8 ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, notdef_glyph, 5 ); + + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, n, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, n, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + /* we added a glyph. */ + loader->num_glyphs += 1; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " <" )); + + /* XXX show charstrings? */ + FT_TRACE4(( "%d elements", loader->num_glyphs )); + + FT_TRACE4(( ">\n" )); +#endif + + return; + + Fail: + parser->root.error = error; + } + + + /************************************************************************** + * + * Define the token field static variables. This is a set of + * T1_FieldRec variables. + * + */ + + + static + const T1_FieldRec t1_keywords[] = + { + +#include "t1tokens.h" + + /* now add the special functions... */ + T1_FIELD_CALLBACK( "FontMatrix", t1_parse_font_matrix, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "Encoding", parse_encoding, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "Subrs", parse_subrs, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_CALLBACK( "CharStrings", parse_charstrings, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_CALLBACK( "Private", parse_private, + T1_FIELD_DICT_FONTDICT ) + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar, + T1_FIELD_DICT_PRIVATE ) +#endif + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + + static FT_Error + parse_dict( T1_Face face, + T1_Loader loader, + FT_Byte* base, + FT_ULong size ) + { + T1_Parser parser = &loader->parser; + FT_Byte *limit, *start_binary = NULL; + FT_Bool have_integer = 0; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = FT_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `eexec' */ + if ( IS_PS_TOKEN( cur, limit, "eexec" ) ) + break; + + /* look for `closefile' which ends the eexec section */ + else if ( IS_PS_TOKEN( cur, limit, "closefile" ) ) + break; + + /* in a synthetic font the base font starts after a */ + /* `FontDictionary' token that is placed after a Private dict */ + else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) ) + { + if ( loader->keywords_encountered & T1_PRIVATE ) + loader->keywords_encountered |= + T1_FONTDIR_AFTER_PRIVATE; + parser->root.cursor += 13; + } + + /* check whether we have an integer */ + else if ( ft_isdigit( *cur ) ) + { + start_binary = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 1; + } + + /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ + /* since those tokens are handled by parse_subrs and */ + /* parse_charstrings */ + else if ( *cur == 'R' && cur + 6 < limit && *( cur + 1 ) == 'D' && + have_integer ) + { + FT_ULong s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) ) + return FT_THROW( Invalid_File_Format ); + have_integer = 0; + } + + else if ( *cur == '-' && cur + 6 < limit && *( cur + 1 ) == '|' && + have_integer ) + { + FT_ULong s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) ) + return FT_THROW( Invalid_File_Format ); + have_integer = 0; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_UInt len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = (FT_UInt)( parser->root.cursor - cur ); + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)t1_keywords; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* We found it -- run the parsing callback! */ + /* We record every instance of every field */ + /* (until we reach the base font of a */ + /* synthetic font) to deal adequately with */ + /* multiple master fonts; this is also */ + /* necessary because later PostScript */ + /* definitions override earlier ones. */ + + /* Once we encounter `FontDirectory' after */ + /* `/Private', we know that this is a synthetic */ + /* font; except for `/CharStrings' we are not */ + /* interested in anything that follows this */ + /* `FontDirectory'. */ + + /* MM fonts have more than one /Private token at */ + /* the top level; let's hope that all the junk */ + /* that follows the first /Private token is not */ + /* interesting to us. */ + + /* According to Adobe Tech Note #5175 (CID-Keyed */ + /* Font Installation for ATM Software) a `begin' */ + /* must be followed by exactly one `end', and */ + /* `begin' -- `end' pairs must be accurately */ + /* paired. We could use this to distinguish */ + /* between the global Private and the Private */ + /* dict that is a member of the Blend dict. */ + + const FT_UInt dict = + ( loader->keywords_encountered & T1_PRIVATE ) + ? T1_FIELD_DICT_PRIVATE + : T1_FIELD_DICT_FONTDICT; + + + if ( !( dict & keyword->dict ) ) + { + FT_TRACE1(( "parse_dict: found `%s' but ignoring it" + " since it is in the wrong dictionary\n", + keyword->ident )); + break; + } + + if ( !( loader->keywords_encountered & + T1_FONTDIR_AFTER_PRIVATE ) || + ft_strcmp( (const char*)name, "CharStrings" ) == 0 ) + { + parser->root.error = t1_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + { + if ( FT_ERR_EQ( parser->root.error, Ignore ) ) + parser->root.error = FT_Err_Ok; + else + return parser->root.error; + } + } + break; + } + + keyword++; + } + } + + have_integer = 0; + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 0; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + static void + t1_init_loader( T1_Loader loader, + T1_Face face ) + { + FT_UNUSED( face ); + + FT_ZERO( loader ); + } + + + static void + t1_done_loader( T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + FT_Memory memory = parser->root.memory; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + T1_Release_Table( &loader->subrs ); + + /* finalize hash */ + ft_hash_num_free( loader->subrs_hash, memory ); + FT_FREE( loader->subrs_hash ); + + /* finalize parser */ + T1_Finalize_Parser( parser ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Open_Face( T1_Face face ) + { + T1_LoaderRec loader; + T1_Parser parser; + T1_Font type1 = &face->type1; + PS_Private priv = &type1->private_dict; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + t1_init_loader( &loader, face ); + + /* default values */ + face->ndv_idx = -1; + face->cdv_idx = -1; + face->len_buildchar = 0; + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = 4; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + parser = &loader.parser; + error = T1_New_Parser( parser, + face->root.stream, + face->root.memory, + psaux ); + if ( error ) + goto Exit; + + FT_TRACE4(( " top dictionary:\n" )); + error = parse_dict( face, &loader, + parser->base_dict, parser->base_len ); + if ( error ) + goto Exit; + + error = T1_Get_Private_Dict( parser, psaux ); + if ( error ) + goto Exit; + + FT_TRACE4(( " private dictionary:\n" )); + error = parse_dict( face, &loader, + parser->private_dict, parser->private_len ); + if ( error ) + goto Exit; + + /* ensure even-ness of `num_blue_values' */ + priv->num_blue_values &= ~1; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + /* we don't support Multiple Master fonts with intermediate designs; */ + /* this implies that `num_designs' must be equal to `2^^num_axis' */ + if ( face->blend && + face->blend->num_designs != ( 1U << face->blend->num_axis ) ) + { + FT_ERROR(( "T1_Open_Face:" + " number-of-designs != 2 ^^ number-of-axes\n" )); + T1_Done_Blend( FT_FACE( face ) ); + } + + if ( face->blend && + face->blend->num_default_design_vector != 0 && + face->blend->num_default_design_vector != face->blend->num_axis ) + { + /* we don't use it currently so just warn, reset, and ignore */ + FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries " + "while there are %u axes.\n", + face->blend->num_default_design_vector, + face->blend->num_axis )); + + face->blend->num_default_design_vector = 0; + } + + /* the following can happen for MM instances; we then treat the */ + /* font as a normal PS font */ + if ( face->blend && + ( !face->blend->num_designs || !face->blend->num_axis ) ) + T1_Done_Blend( FT_FACE( face ) ); + + /* the font may have no valid WeightVector */ + if ( face->blend && !face->blend->weight_vector ) + T1_Done_Blend( FT_FACE( face ) ); + + /* the font may have no valid BlendDesignPositions */ + if ( face->blend && !face->blend->design_pos[0] ) + T1_Done_Blend( FT_FACE( face ) ); + + /* the font may have no valid BlendDesignMap */ + if ( face->blend ) + { + FT_UInt i; + + + for ( i = 0; i < face->blend->num_axis; i++ ) + if ( !face->blend->design_map[i].num_points ) + { + T1_Done_Blend( FT_FACE( face ) ); + break; + } + } + + if ( face->blend ) + { + if ( face->len_buildchar > 0 ) + { + FT_Memory memory = face->root.memory; + + + if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) ) + { + FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" )); + face->len_buildchar = 0; + goto Exit; + } + } + } + else + face->len_buildchar = 0; + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + /* now, propagate the subrs, charstrings, and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( loader.subrs.init ) + { + type1->num_subrs = loader.num_subrs; + type1->subrs_block = loader.subrs.block; + type1->subrs = loader.subrs.elements; + type1->subrs_len = loader.subrs.lengths; + type1->subrs_hash = loader.subrs_hash; + + /* prevent `t1_done_loader' from freeing the propagated data */ + loader.subrs.init = 0; + loader.subrs_hash = NULL; + } + + if ( !IS_INCREMENTAL ) + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" )); + error = FT_THROW( Invalid_File_Format ); + } + + loader.charstrings.init = 0; + type1->charstrings_block = loader.charstrings.block; + type1->charstrings = loader.charstrings.elements; + type1->charstrings_len = loader.charstrings.lengths; + + /* we copy the glyph names `block' and `elements' fields; */ + /* the `lengths' field must be released later */ + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; + loader.glyph_names.block = NULL; + loader.glyph_names.elements = NULL; + + /* we must now build type1.encoding when we have a custom array */ + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) + { + FT_Int charcode, idx, min_char, max_char; + + + /* OK, we do the following: for each element in the encoding */ + /* table, look up the index of the glyph having the same name */ + /* the index is then stored in type1.encoding.char_index, and */ + /* the name to type1.encoding.char_name */ + + min_char = 0; + max_char = 0; + + charcode = 0; + for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) + { + const FT_String* char_name = + (const FT_String*)loader.encoding_table.elements[charcode]; + + + type1->encoding.char_index[charcode] = 0; + type1->encoding.char_name [charcode] = ".notdef"; + + if ( char_name ) + for ( idx = 0; idx < type1->num_glyphs; idx++ ) + { + const FT_String* glyph_name = type1->glyph_names[idx]; + + + if ( ft_strcmp( char_name, glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = (FT_UShort)idx; + type1->encoding.char_name [charcode] = glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( ft_strcmp( ".notdef", glyph_name ) != 0 ) + { + if ( charcode < min_char ) + min_char = charcode; + if ( charcode >= max_char ) + max_char = charcode + 1; + } + break; + } + } + } + + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + /* some sanitizing to avoid overflows later on; */ + /* the upper limits are ad-hoc values */ + if ( priv->blue_shift > 1000 || priv->blue_shift < 0 ) + { + FT_TRACE2(( "T1_Open_Face:" + " setting unlikely BlueShift value %d to default (7)\n", + priv->blue_shift )); + priv->blue_shift = 7; + } + + if ( priv->blue_fuzz > 1000 || priv->blue_fuzz < 0 ) + { + FT_TRACE2(( "T1_Open_Face:" + " setting unlikely BlueFuzz value %d to default (1)\n", + priv->blue_fuzz )); + priv->blue_fuzz = 1; + } + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/external/freetype/src/type1/t1load.h b/external/freetype/src/type1/t1load.h new file mode 100644 index 000000000..d8c9d2d8a --- /dev/null +++ b/external/freetype/src/type1/t1load.h @@ -0,0 +1,126 @@ +/**************************************************************************** + * + * t1load.h + * + * Type 1 font loader (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1LOAD_H_ +#define T1LOAD_H_ + + +#include <freetype/internal/ftstream.h> +#include <freetype/internal/psaux.h> +#include <freetype/ftmm.h> + +#include "t1parse.h" + + +FT_BEGIN_HEADER + + + typedef struct T1_Loader_ + { + T1_ParserRec parser; /* parser used to read the stream */ + + FT_Int num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_Int num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + FT_Int num_subrs; + PS_TableRec subrs; + FT_Hash subrs_hash; + FT_Bool fontdata; + + FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */ + + } T1_LoaderRec, *T1_Loader; + + + /* treatment of some keywords differs depending on whether */ + /* they precede or follow certain other keywords */ + +#define T1_PRIVATE ( 1 << 0 ) +#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 ) + + + FT_LOCAL( FT_Error ) + T1_Open_Face( T1_Face face ); + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + FT_LOCAL( FT_Error ) + T1_Get_Multi_Master( FT_Face face, + FT_Multi_Master* master ); + + FT_LOCAL( FT_Error ) + T1_Get_MM_Var( FT_Face face, + FT_MM_Var* *master ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Blend( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + T1_Get_MM_Blend( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Design( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + FT_LOCAL( FT_Error ) + T1_Reset_MM_Blend( FT_Face face, + FT_UInt instance_index ); + + FT_LOCAL( FT_Error ) + T1_Get_Var_Design( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + T1_Set_Var_Design( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( void ) + T1_Done_Blend( FT_Face face ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_WeightVector( FT_Face face, + FT_UInt len, + FT_Fixed* weightvector ); + + FT_LOCAL( FT_Error ) + T1_Get_MM_WeightVector( FT_Face face, + FT_UInt* len, + FT_Fixed* weightvector ); + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +FT_END_HEADER + +#endif /* T1LOAD_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1objs.c b/external/freetype/src/type1/t1objs.c new file mode 100644 index 000000000..69e4fd506 --- /dev/null +++ b/external/freetype/src/type1/t1objs.c @@ -0,0 +1,655 @@ +/**************************************************************************** + * + * t1objs.c + * + * Type 1 objects manager (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/internal/ftcalc.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/ttnameid.h> +#include <freetype/ftdriver.h> + +#include "t1gload.h" +#include "t1load.h" + +#include "t1errors.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#include <freetype/internal/services/svpscmap.h> +#include <freetype/internal/psaux.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1objs + + + /************************************************************************** + * + * SIZE FUNCTIONS + * + */ + + + static PSH_Globals_Funcs + T1_Size_Get_Globals_Funcs( T1_Size size ) + { + T1_Face face = (T1_Face)size->root.face; + PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + T1_Size_Done( FT_Size t1size ) /* T1_Size */ + { + T1_Size size = (T1_Size)t1size; + + + if ( t1size->internal->module_data ) + { + PSH_Globals_Funcs funcs; + + + funcs = T1_Size_Get_Globals_Funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)t1size->internal->module_data ); + + t1size->internal->module_data = NULL; + } + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Size_Init( FT_Size t1size ) /* T1_Size */ + { + T1_Size size = (T1_Size)t1size; + FT_Error error = FT_Err_Ok; + PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + T1_Face face = (T1_Face)size->root.face; + + + error = funcs->create( size->root.face->memory, + &face->type1.private_dict, &globals ); + if ( !error ) + t1size->internal->module_data = globals; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Size_Request( FT_Size t1size, /* T1_Size */ + FT_Size_Request req ) + { + FT_Error error; + + T1_Size size = (T1_Size)t1size; + PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); + + + error = FT_Request_Metrics( size->root.face, req ); + if ( error ) + goto Exit; + + if ( funcs ) + funcs->set_scale( (PSH_Globals)t1size->internal->module_data, + size->root.metrics.x_scale, + size->root.metrics.y_scale, + 0, 0 ); + + Exit: + return error; + } + + + /************************************************************************** + * + * SLOT FUNCTIONS + * + */ + + FT_LOCAL_DEF( void ) + T1_GlyphSlot_Done( FT_GlyphSlot slot ) + { + /* `slot->internal` might be NULL in out-of-memory situations. */ + if ( slot->internal ) + slot->internal->glyph_hints = NULL; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_GlyphSlot_Init( FT_GlyphSlot slot ) + { + T1_Face face; + PSHinter_Service pshinter; + + + face = (T1_Face)slot->face; + pshinter = (PSHinter_Service)face->pshinter; + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->library, "pshinter" ); + if ( module ) + { + T1_Hints_Funcs funcs; + + + funcs = pshinter->get_t1_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return 0; + } + + + /************************************************************************** + * + * FACE FUNCTIONS + * + */ + + + /************************************************************************** + * + * @Function: + * T1_Face_Done + * + * @Description: + * The face object destructor. + * + * @Input: + * face :: + * A typeless pointer to the face object to destroy. + */ + FT_LOCAL_DEF( void ) + T1_Face_Done( FT_Face t1face ) /* T1_Face */ + { + T1_Face face = (T1_Face)t1face; + FT_Memory memory; + T1_Font type1; + + + if ( !face ) + return; + + memory = face->root.memory; + type1 = &face->type1; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + /* release multiple masters information */ + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + if ( face->buildchar ) + { + FT_FREE( face->buildchar ); + + face->len_buildchar = 0; + } + + T1_Done_Blend( t1face ); + face->blend = NULL; +#endif + + /* release font info strings */ + { + PS_FontInfo info = &type1->font_info; + + + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + } + + /* release top dictionary */ + FT_FREE( type1->charstrings_len ); + FT_FREE( type1->charstrings ); + FT_FREE( type1->glyph_names ); + + FT_FREE( type1->subrs ); + FT_FREE( type1->subrs_len ); + + ft_hash_num_free( type1->subrs_hash, memory ); + FT_FREE( type1->subrs_hash ); + + FT_FREE( type1->subrs_block ); + FT_FREE( type1->charstrings_block ); + FT_FREE( type1->glyph_names_block ); + + FT_FREE( type1->encoding.char_index ); + FT_FREE( type1->encoding.char_name ); + FT_FREE( type1->font_name ); + +#ifndef T1_CONFIG_OPTION_NO_AFM + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data ); +#endif + + /* release unicode map, if any */ +#if 0 + FT_FREE( face->unicode_map_rec.maps ); + face->unicode_map_rec.num_maps = 0; + face->unicode_map = NULL; +#endif + + face->root.family_name = NULL; + face->root.style_name = NULL; + } + + + /************************************************************************** + * + * @Function: + * T1_Face_Init + * + * @Description: + * The face object constructor. + * + * @Input: + * stream :: + * Dummy argument for compatibility with the `FT_Face_InitFunc` API. + * Ignored. The stream should be passed through `face->root.stream`. + * + * face_index :: + * The index of the font face in the resource. + * + * num_params :: + * Number of additional generic parameters. Ignored. + * + * params :: + * Additional generic parameters. Ignored. + * + * @InOut: + * face :: + * The face record to build. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + T1_Face_Init( FT_Stream stream, + FT_Face t1face, /* T1_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + T1_Face face = (T1_Face)t1face; + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + face->root.num_faces = 1; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; + + face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psaux" ); + psaux = (PSAux_Service)face->psaux; + if ( !psaux ) + { + FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "pshinter" ); + + FT_TRACE2(( "Type 1 driver\n" )); + + /* open the tokenizer; this will also check the font format */ + error = T1_Open_Face( face ); + if ( error ) + goto Exit; + + FT_TRACE2(( "T1_Face_Init: %p (index %d)\n", + (void *)face, + face_index )); + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + if ( ( face_index & 0xFFFF ) > 0 ) + { + FT_ERROR(( "T1_Face_Init: invalid face index\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ + { + FT_Face root = (FT_Face)&face->root; + + + root->num_glyphs = type1->num_glyphs; + root->face_index = 0; + + root->face_flags |= FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES | + FT_FACE_FLAG_HINTER; + + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( face->blend ) + root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + + /* The following code to extract the family and the style is very */ + /* simplistic and might get some things wrong. For a full-featured */ + /* algorithm you might have a look at the whitepaper given at */ + /* */ + /* https://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */ + + /* get style name -- be careful, some broken fonts only */ + /* have a `/FontName' dictionary entry! */ + root->family_name = info->family_name; + root->style_name = NULL; + + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; + + + if ( full ) + { + FT_Bool the_same = TRUE; + + + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + the_same = FALSE; + + if ( !*family ) + root->style_name = full; + break; + } + } + } + + if ( the_same ) + root->style_name = (char *)"Regular"; + } + } + else + { + /* do we have a `/FontName'? */ + if ( type1->font_name ) + root->family_name = type1->font_name; + } + + if ( !root->style_name ) + { + if ( info->weight ) + root->style_name = info->weight; + else + /* assume `Regular' style because we don't know better */ + root->style_name = (char *)"Regular"; + } + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = NULL; + + root->bbox.xMin = type1->font_bbox.xMin >> 16; + root->bbox.yMin = type1->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16; + root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16; + + /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */ + if ( !root->units_per_EM ) + root->units_per_EM = 1000; + + root->ascender = (FT_Short)( root->bbox.yMax ); + root->descender = (FT_Short)( root->bbox.yMin ); + + root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 ); + if ( root->height < root->ascender - root->descender ) + root->height = (FT_Short)( root->ascender - root->descender ); + + /* now compute the maximum advance width */ + root->max_advance_width = + (FT_Short)( root->bbox.xMax ); + { + FT_Pos max_advance; + + + error = T1_Compute_Max_Advance( face, &max_advance ); + + /* in case of error, keep the standard width */ + if ( !error ) + root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance ); + else + error = FT_Err_Ok; /* clear error */ + } + + root->max_advance_height = root->height; + + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; + } + + { + FT_Face root = &face->root; + + + if ( psnames ) + { + FT_CharMapRec charmap; + T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; + FT_CMap_Class clazz; + + + charmap.face = root; + + /* first of all, try to synthesize a Unicode charmap */ + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; + charmap.encoding = FT_ENCODING_UNICODE; + + error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + if ( error && + FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) && + FT_ERR_NEQ( error, Unimplemented_Feature ) ) + goto Exit; + error = FT_Err_Ok; + + /* now, generate an Adobe Standard encoding when appropriate */ + charmap.platform_id = TT_PLATFORM_ADOBE; + clazz = NULL; + + switch ( type1->encoding_type ) + { + case T1_ENCODING_TYPE_STANDARD: + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; + clazz = cmap_classes->standard; + break; + + case T1_ENCODING_TYPE_EXPERT: + charmap.encoding = FT_ENCODING_ADOBE_EXPERT; + charmap.encoding_id = TT_ADOBE_ID_EXPERT; + clazz = cmap_classes->expert; + break; + + case T1_ENCODING_TYPE_ARRAY: + charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; + charmap.encoding_id = TT_ADOBE_ID_CUSTOM; + clazz = cmap_classes->custom; + break; + + case T1_ENCODING_TYPE_ISOLATIN1: + charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; + charmap.encoding_id = TT_ADOBE_ID_LATIN_1; + clazz = cmap_classes->unicode; + break; + + default: + ; + } + + if ( clazz ) + error = FT_CMap_New( clazz, NULL, &charmap, NULL ); + } + } + + Exit: + return error; + } + + + /************************************************************************** + * + * @Function: + * T1_Driver_Init + * + * @Description: + * Initializes a given Type 1 driver object. + * + * @Input: + * driver :: + * A handle to the target driver object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + T1_Driver_Init( FT_Module module ) + { + PS_Driver driver = (PS_Driver)module; + + FT_UInt32 seed; + + + /* set default property values, cf. `ftt1drv.h' */ + driver->hinting_engine = FT_HINTING_ADOBE; + + driver->no_stem_darkening = TRUE; + + driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; + driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; + driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; + driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; + driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; + driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; + driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; + driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&module ^ + (FT_Offset)(char*)module->memory ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + + driver->random_seed = (FT_Int32)seed; + if ( driver->random_seed < 0 ) + driver->random_seed = -driver->random_seed; + else if ( driver->random_seed == 0 ) + driver->random_seed = 123456789; + + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * T1_Driver_Done + * + * @Description: + * Finalizes a given Type 1 driver. + * + * @Input: + * driver :: + * A handle to the target Type 1 driver. + */ + FT_LOCAL_DEF( void ) + T1_Driver_Done( FT_Module driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/external/freetype/src/type1/t1objs.h b/external/freetype/src/type1/t1objs.h new file mode 100644 index 000000000..03847b27e --- /dev/null +++ b/external/freetype/src/type1/t1objs.h @@ -0,0 +1,160 @@ +/**************************************************************************** + * + * t1objs.h + * + * Type 1 objects manager (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1OBJS_H_ +#define T1OBJS_H_ + + +#include <ft2build.h> +#include <freetype/internal/ftobjs.h> +#include FT_CONFIG_CONFIG_H +#include <freetype/internal/t1types.h> + + +FT_BEGIN_HEADER + + + /* The following structures must be defined by the hinter */ + typedef struct T1_Size_Hints_ T1_Size_Hints; + typedef struct T1_Glyph_Hints_ T1_Glyph_Hints; + + + /************************************************************************** + * + * @Type: + * T1_Size + * + * @Description: + * A handle to a Type 1 size object. + */ + typedef struct T1_SizeRec_* T1_Size; + + + /************************************************************************** + * + * @Type: + * T1_GlyphSlot + * + * @Description: + * A handle to a Type 1 glyph slot object. + */ + typedef struct T1_GlyphSlotRec_* T1_GlyphSlot; + + + /************************************************************************** + * + * @Type: + * T1_CharMap + * + * @Description: + * A handle to a Type 1 character mapping object. + * + * @Note: + * The Type 1 format doesn't use a charmap but an encoding table. + * The driver is responsible for making up charmap objects + * corresponding to these tables. + */ + typedef struct T1_CharMapRec_* T1_CharMap; + + + /************************************************************************** + * + * HERE BEGINS THE TYPE1 SPECIFIC STUFF + * + */ + + + /************************************************************************** + * + * @Type: + * T1_SizeRec + * + * @Description: + * Type 1 size record. + */ + typedef struct T1_SizeRec_ + { + FT_SizeRec root; + + } T1_SizeRec; + + + FT_LOCAL( void ) + T1_Size_Done( FT_Size size ); + + FT_LOCAL( FT_Error ) + T1_Size_Request( FT_Size size, + FT_Size_Request req ); + + FT_LOCAL( FT_Error ) + T1_Size_Init( FT_Size size ); + + + /************************************************************************** + * + * @Type: + * T1_GlyphSlotRec + * + * @Description: + * Type 1 glyph slot record. + */ + typedef struct T1_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + FT_Int max_points; + FT_Int max_contours; + + } T1_GlyphSlotRec; + + + FT_LOCAL( FT_Error ) + T1_Face_Init( FT_Stream stream, + FT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + T1_Face_Done( FT_Face face ); + + FT_LOCAL( FT_Error ) + T1_GlyphSlot_Init( FT_GlyphSlot slot ); + + FT_LOCAL( void ) + T1_GlyphSlot_Done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + T1_Driver_Init( FT_Module driver ); + + FT_LOCAL( void ) + T1_Driver_Done( FT_Module driver ); + + +FT_END_HEADER + +#endif /* T1OBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1parse.c b/external/freetype/src/type1/t1parse.c new file mode 100644 index 000000000..6dec6c16c --- /dev/null +++ b/external/freetype/src/type1/t1parse.c @@ -0,0 +1,487 @@ +/**************************************************************************** + * + * t1parse.c + * + * Type 1 parser (body). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * The Type 1 parser is in charge of the following: + * + * - provide an implementation of a growing sequence of objects called + * a `T1_Table' (used to build various tables needed by the loader). + * + * - opening .pfb and .pfa files to extract their top-level and private + * dictionaries. + * + * - read numbers, arrays & strings from any dictionary. + * + * See `t1load.c' to see how data is loaded from the font file. + * + */ + + +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/psaux.h> + +#include "t1parse.h" + +#include "t1errors.h" + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t1parse + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INPUT STREAM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* see Adobe Technical Note 5040.Download_Fonts.pdf */ + + static FT_Error + read_pfb_tag( FT_Stream stream, + FT_UShort *atag, + FT_ULong *asize ) + { + FT_Error error; + FT_UShort tag; + FT_ULong size; + + + *atag = 0; + *asize = 0; + + if ( !FT_READ_USHORT( tag ) ) + { + if ( tag == 0x8001U || tag == 0x8002U ) + { + if ( !FT_READ_ULONG_LE( size ) ) + *asize = size; + } + + *atag = tag; + } + + return error; + } + + + static FT_Error + check_type1_format( FT_Stream stream, + const char* header_string, + size_t header_length ) + { + FT_Error error; + FT_UShort tag; + FT_ULong dummy; + + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &dummy ); + if ( error ) + goto Exit; + + /* We assume that the first segment in a PFB is always encoded as */ + /* text. This might be wrong (and the specification doesn't insist */ + /* on that), but we have never seen a counterexample. */ + if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) ) + goto Exit; + + if ( !FT_FRAME_ENTER( header_length ) ) + { + error = FT_Err_Ok; + + if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 ) + error = FT_THROW( Unknown_File_Format ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error; + FT_UShort tag; + FT_ULong size; + + + psaux->ps_parser_funcs->init( &parser->root, NULL, NULL, memory ); + + parser->stream = stream; + parser->base_len = 0; + parser->base_dict = NULL; + parser->private_len = 0; + parser->private_dict = NULL; + parser->in_pfb = 0; + parser->in_memory = 0; + parser->single_block = 0; + + /* check the header format */ + error = check_type1_format( stream, "%!PS-AdobeFont", 14 ); + if ( error ) + { + if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) + goto Exit; + + error = check_type1_format( stream, "%!FontType", 10 ); + if ( error ) + { + FT_TRACE2(( " not a Type 1 font\n" )); + goto Exit; + } + } + + /******************************************************************* + * + * Here a short summary of what is going on: + * + * When creating a new Type 1 parser, we try to locate and load + * the base dictionary if this is possible (i.e., for PFB + * files). Otherwise, we load the whole font into memory. + * + * When `loading' the base dictionary, we only setup pointers + * in the case of a memory-based stream. Otherwise, we + * allocate and load the base dictionary in it. + * + * parser->in_pfb is set if we are in a binary (`.pfb') font. + * parser->in_memory is set if we have a memory stream. + */ + + /* try to compute the size of the base dictionary; */ + /* look for a Postscript binary file tag, i.e., 0x8001 */ + if ( FT_STREAM_SEEK( 0L ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Exit; + + if ( tag != 0x8001U ) + { + /* assume that this is a PFA file for now; an error will */ + /* be produced later when more things are checked */ + if ( FT_STREAM_SEEK( 0L ) ) + goto Exit; + size = stream->size; + } + else + parser->in_pfb = 1; + + /* now, try to load `size' bytes of the `base' dictionary we */ + /* found previously */ + + /* if it is a memory-based resource, set up pointers */ + if ( !stream->read ) + { + parser->base_dict = (FT_Byte*)stream->base + stream->pos; + parser->base_len = size; + parser->in_memory = 1; + + /* check that the `size' field is valid */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + else + { + /* read segment in memory -- this is clumsy, but so does the format */ + if ( FT_QALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) + goto Exit; + parser->base_len = size; + } + + parser->root.base = parser->base_dict; + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->root.cursor + parser->base_len; + + Exit: + if ( error && !parser->in_memory ) + FT_FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF( void ) + T1_Finalize_Parser( T1_Parser parser ) + { + FT_Memory memory = parser->root.memory; + + + /* always free the private dictionary */ + FT_FREE( parser->private_dict ); + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FT_FREE( parser->base_dict ); + + parser->root.funcs.done( &parser->root ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ) + { + FT_Stream stream = parser->stream; + FT_Memory memory = parser->root.memory; + FT_Error error = FT_Err_Ok; + FT_ULong size; + + + if ( parser->in_pfb ) + { + /* in the case of the PFB format, the private dictionary can be */ + /* made of several segments. We thus first read the number of */ + /* segments to compute the total size of the private dictionary */ + /* then re-read them into memory. */ + FT_ULong start_pos = FT_STREAM_POS(); + FT_UShort tag; + + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Fail; + + if ( tag != 0x8002U ) + break; + + parser->private_len += size; + + if ( FT_STREAM_SKIP( size ) ) + goto Fail; + } + + /* Check that we have a private dictionary there */ + /* and allocate private dictionary buffer */ + if ( parser->private_len == 0 ) + { + FT_ERROR(( "T1_Get_Private_Dict:" + " invalid private dictionary section\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + if ( FT_STREAM_SEEK( start_pos ) || + FT_QALLOC( parser->private_dict, parser->private_len ) ) + goto Fail; + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error || tag != 0x8002U ) + { + error = FT_Err_Ok; + break; + } + + if ( FT_STREAM_READ( parser->private_dict + parser->private_len, + size ) ) + goto Fail; + + parser->private_len += size; + } + } + else + { + /* We have already `loaded' the whole PFA font file into memory; */ + /* if this is a memory resource, allocate a new block to hold */ + /* the private dict. Otherwise, simply overwrite into the base */ + /* dictionary block in the heap. */ + + /* First look for the `eexec' keyword. Ensure `eexec' is real -- */ + /* it could be in a comment or string (as e.g. in u003043t.gsf */ + /* from ghostscript). */ + FT_Byte* cur = parser->base_dict; + FT_Byte* limit = cur + parser->base_len; + FT_Pointer pos_lf; + FT_Bool test_cr; + + + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->base_dict + parser->base_len; + + cur = parser->root.cursor; + limit = parser->root.limit; + + while ( cur < limit ) + { + /* 9 = 5 letters for `eexec' + whitespace + 4 chars */ + if ( cur[0] == 'e' && cur + 9 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'x' && + cur[3] == 'e' && + cur[4] == 'c' ) + goto Found; + } + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + break; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + FT_ERROR(( "T1_Get_Private_Dict: could not find `eexec' keyword\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + + /* now determine where to write the _encrypted_ binary private */ + /* dictionary. We overwrite the base dictionary for disk-based */ + /* resources and allocate a new block otherwise */ + + Found: + parser->root.limit = parser->base_dict + parser->base_len; + + T1_Skip_PS_Token( parser ); + cur = parser->root.cursor; + limit = parser->root.limit; + + /* According to the Type 1 spec, the first cipher byte must not be */ + /* an ASCII whitespace character code (blank, tab, carriage return */ + /* or line feed). We have seen Type 1 fonts with two line feed */ + /* characters... So skip now all whitespace character codes. */ + /* */ + /* On the other hand, Adobe's Type 1 parser handles fonts just */ + /* fine that are violating this limitation, so we add a heuristic */ + /* test to stop at \r only if it is not used for EOL. */ + + pos_lf = ft_memchr( cur, '\n', (size_t)( limit - cur ) ); + test_cr = FT_BOOL( !pos_lf || + pos_lf > ft_memchr( cur, + '\r', + (size_t)( limit - cur ) ) ); + + while ( cur < limit && + ( *cur == ' ' || + *cur == '\t' || + (test_cr && *cur == '\r' ) || + *cur == '\n' ) ) + cur++; + if ( cur >= limit ) + { + FT_ERROR(( "T1_Get_Private_Dict:" + " `eexec' not properly terminated\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + size = parser->base_len - (FT_ULong)( cur - parser->base_dict ); + + if ( parser->in_memory ) + { + /* note that we allocate one more byte to put a terminating `0' */ + if ( FT_QALLOC( parser->private_dict, size + 1 ) ) + goto Fail; + parser->private_len = size; + } + else + { + parser->single_block = 1; + parser->private_dict = parser->base_dict; + parser->private_len = size; + parser->base_dict = NULL; + parser->base_len = 0; + } + + /* now determine whether the private dictionary is encoded in binary */ + /* or hexadecimal ASCII format -- decode it accordingly */ + + /* we need to access the next 4 bytes (after the final whitespace */ + /* following the `eexec' keyword); if they all are hexadecimal */ + /* digits, then we have a case of ASCII storage */ + + if ( cur + 3 < limit && + ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) && + ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) ) + { + /* ASCII hexadecimal encoding */ + FT_ULong len; + + + parser->root.cursor = cur; + (void)psaux->ps_parser_funcs->to_bytes( &parser->root, + parser->private_dict, + parser->private_len, + &len, + 0 ); + parser->private_len = len; + + /* put a safeguard */ + parser->private_dict[len] = '\0'; + } + else + /* binary encoding -- copy the private dict */ + FT_MEM_MOVE( parser->private_dict, cur, size ); + } + + /* we now decrypt the encoded binary private dictionary */ + psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U ); + + if ( parser->private_len < 4 ) + { + FT_ERROR(( "T1_Get_Private_Dict:" + " invalid private dictionary section\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* replace the four random bytes at the beginning with whitespace */ + parser->private_dict[0] = ' '; + parser->private_dict[1] = ' '; + parser->private_dict[2] = ' '; + parser->private_dict[3] = ' '; + + parser->root.base = parser->private_dict; + parser->root.cursor = parser->private_dict; + parser->root.limit = parser->root.cursor + parser->private_len; + + Fail: + Exit: + return error; + } + + +/* END */ diff --git a/external/freetype/src/type1/t1parse.h b/external/freetype/src/type1/t1parse.h new file mode 100644 index 000000000..0d9a2865d --- /dev/null +++ b/external/freetype/src/type1/t1parse.h @@ -0,0 +1,137 @@ +/**************************************************************************** + * + * t1parse.h + * + * Type 1 parser (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T1PARSE_H_ +#define T1PARSE_H_ + + +#include <freetype/internal/t1types.h> +#include <freetype/internal/ftstream.h> + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @Struct: + * T1_ParserRec + * + * @Description: + * A PS_ParserRec is an object used to parse a Type 1 fonts very + * quickly. + * + * @Fields: + * root :: + * The root parser. + * + * stream :: + * The current input stream. + * + * base_dict :: + * A pointer to the top-level dictionary. + * + * base_len :: + * The length in bytes of the top dictionary. + * + * private_dict :: + * A pointer to the private dictionary. + * + * private_len :: + * The length in bytes of the private dictionary. + * + * in_pfb :: + * A boolean. Indicates that we are handling a PFB + * file. + * + * in_memory :: + * A boolean. Indicates a memory-based stream. + * + * single_block :: + * A boolean. Indicates that the private dictionary + * is stored in lieu of the base dictionary. + */ + typedef struct T1_ParserRec_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_ULong base_len; + + FT_Byte* private_dict; + FT_ULong private_len; + + FT_Bool in_pfb; + FT_Bool in_memory; + FT_Bool single_block; + + } T1_ParserRec, *T1_Parser; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define T1_ToCoordArray( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define T1_ToTokenArray( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) + +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + FT_LOCAL( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ); + + FT_LOCAL( void ) + T1_Finalize_Parser( T1_Parser parser ); + + +FT_END_HEADER + +#endif /* T1PARSE_H_ */ + + +/* END */ diff --git a/external/freetype/src/type1/t1tokens.h b/external/freetype/src/type1/t1tokens.h new file mode 100644 index 000000000..40f360926 --- /dev/null +++ b/external/freetype/src/type1/t1tokens.h @@ -0,0 +1,143 @@ +/**************************************************************************** + * + * t1tokens.h + * + * Type 1 tokenizer (specification). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "Notice", notice, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "FullName", full_name, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "FamilyName", family_name, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "Weight", weight, + T1_FIELD_DICT_FONTDICT ) + + /* we use pointers to detect modifications made by synthetic fonts */ + T1_FIELD_NUM ( "ItalicAngle", italic_angle, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, + T1_FIELD_DICT_FONTDICT ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, + T1_FIELD_DICT_FONTDICT ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_PrivateRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_PRIVATE + + T1_FIELD_NUM ( "UniqueID", unique_id, + T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "lenIV", lenIV, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "LanguageGroup", language_group, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "password", password, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_FIXED_1000( "BlueScale", blue_scale, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "BlueShift", blue_shift, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_BOOL ( "ForceBold", force_bold, + T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT ) + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FaceRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FACE + + T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_BlendRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BLEND + + T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, + T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT ) + + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +/* END */ diff --git a/external/freetype/src/type1/type1.c b/external/freetype/src/type1/type1.c new file mode 100644 index 000000000..d9bd8cad9 --- /dev/null +++ b/external/freetype/src/type1/type1.c @@ -0,0 +1,29 @@ +/**************************************************************************** + * + * type1.c + * + * FreeType Type 1 driver component (body only). + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "t1afm.c" +#include "t1driver.c" +#include "t1gload.c" +#include "t1load.c" +#include "t1objs.c" +#include "t1parse.c" + + +/* END */ diff --git a/external/freetype/src/type42/module.mk b/external/freetype/src/type42/module.mk new file mode 100644 index 000000000..d98b12319 --- /dev/null +++ b/external/freetype/src/type42/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Type42 module definition +# + + +# Copyright (C) 2002-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE42_DRIVER + +define TYPE42_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t42_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)type42 $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/type42/rules.mk b/external/freetype/src/type42/rules.mk new file mode 100644 index 000000000..41cb358d3 --- /dev/null +++ b/external/freetype/src/type42/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 Type42 driver configuration rules +# + + +# Copyright (C) 2002-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Type42 driver directory +# +T42_DIR := $(SRC_DIR)/type42 + + +# compilation flags for the driver +# +T42_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(T42_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# Type42 driver source +# +T42_DRV_SRC := $(T42_DIR)/t42objs.c \ + $(T42_DIR)/t42parse.c \ + $(T42_DIR)/t42drivr.c + +# Type42 driver headers +# +T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \ + $(T42_DIR)/t42error.h \ + $(T42_DIR)/t42types.h + + +# Type42 driver object(s) +# +# T42_DRV_OBJ_M is used during `multi' builds +# T42_DRV_OBJ_S is used during `single' builds +# +T42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O) +T42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O + +# Type42 driver source file for single build +# +T42_DRV_SRC_S := $(T42_DIR)/type42.c + + +# Type42 driver - single object +# +$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S)) + + +# Type42 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T42_DRV_OBJ_S) +DRV_OBJS_M += $(T42_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/type42/t42drivr.c b/external/freetype/src/type42/t42drivr.c new file mode 100644 index 000000000..ee5fd44a9 --- /dev/null +++ b/external/freetype/src/type42/t42drivr.c @@ -0,0 +1,248 @@ +/**************************************************************************** + * + * t42drivr.c + * + * High-level Type 42 driver interface (body). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This driver implements Type42 fonts as described in the + * Technical Note #5012 from Adobe, with these limitations: + * + * 1) CID Fonts are not currently supported. + * 2) Incremental fonts making use of the GlyphDirectory keyword + * will be loaded, but the rendering will be using the TrueType + * tables. + * 3) As for Type1 fonts, CDevProc is not supported. + * 4) The Metrics dictionary is not supported. + * 5) AFM metrics are not supported. + * + * In other words, this driver supports Type42 fonts derived from + * TrueType fonts in a non-CID manner, as done by usual conversion + * programs. + * + */ + + +#include "t42drivr.h" +#include "t42objs.h" +#include "t42error.h" +#include <freetype/internal/ftdebug.h> + +#include <freetype/internal/services/svfntfmt.h> +#include <freetype/internal/services/svgldict.h> +#include <freetype/internal/services/svpostnm.h> +#include <freetype/internal/services/svpsinfo.h> + +#undef FT_COMPONENT +#define FT_COMPONENT t42 + + + /* + * + * GLYPH DICT SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + t42_get_glyph_name( FT_Face face, /* T42_Face */ + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + T42_Face t42face = (T42_Face)face; + + + FT_STRCPYN( buffer, + t42face->type1.glyph_names[glyph_index], + buffer_max ); + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t42_get_name_index( FT_Face face, /* T42_Face */ + const FT_String* glyph_name ) + { + T42_Face t42face = (T42_Face)face; + FT_Int i; + + + for ( i = 0; i < t42face->type1.num_glyphs; i++ ) + { + FT_String* gname = t42face->type1.glyph_names[i]; + + + if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)ft_strtol( + (const char *)t42face->type1.charstrings[i], + NULL, + 10 ); + } + + return 0; + } + + + static const FT_Service_GlyphDictRec t42_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t42_get_glyph_name, /* get_name */ + (FT_GlyphDict_NameIndexFunc)t42_get_name_index /* name_index */ + }; + + + /* + * + * POSTSCRIPT NAME SERVICE + * + */ + + FT_CALLBACK_DEF( const char* ) + t42_get_ps_font_name( FT_Face face ) /* T42_Face */ + { + T42_Face t42face = (T42_Face)face; + + + return (const char*)t42face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t42_service_ps_font_name = + { + (FT_PsName_GetFunc)t42_get_ps_font_name /* get_ps_font_name */ + }; + + + /* + * + * POSTSCRIPT INFO SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + t42_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T42_Face)face)->type1.font_info; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + t42_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((T42_Face)face)->type1.font_extra; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Int ) + t42_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + + return 1; + } + + + static const FT_Service_PsInfoRec t42_service_ps_info = + { + (PS_GetFontInfoFunc) t42_ps_get_font_info, /* ps_get_font_info */ + (PS_GetFontExtraFunc) t42_ps_get_font_extra, /* ps_get_font_extra */ + (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names, /* ps_has_glyph_names */ + /* Type42 fonts don't have a Private dict */ + (PS_GetFontPrivateFunc)NULL, /* ps_get_font_private */ + /* not implemented */ + (PS_GetFontValueFunc) NULL /* ps_get_font_value */ + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t42_services[] = + { + { FT_SERVICE_ID_GLYPH_DICT, &t42_service_glyph_dict }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t42_service_ps_info }, + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TYPE_42 }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + T42_Get_Interface( FT_Module module, + const FT_String* t42_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( t42_services, t42_interface ); + } + + + const FT_Driver_ClassRec t42_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_MODULE_DRIVER_HAS_HINTER, +#else + 0, +#endif + + sizeof ( T42_DriverRec ), + + "type42", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + T42_Driver_Init, /* FT_Module_Constructor module_init */ + T42_Driver_Done, /* FT_Module_Destructor module_done */ + T42_Get_Interface, /* FT_Module_Requester get_interface */ + }, + + sizeof ( T42_FaceRec ), + sizeof ( T42_SizeRec ), + sizeof ( T42_GlyphSlotRec ), + + T42_Face_Init, /* FT_Face_InitFunc init_face */ + T42_Face_Done, /* FT_Face_DoneFunc done_face */ + T42_Size_Init, /* FT_Size_InitFunc init_size */ + T42_Size_Done, /* FT_Size_DoneFunc done_size */ + T42_GlyphSlot_Init, /* FT_Slot_InitFunc init_slot */ + T42_GlyphSlot_Done, /* FT_Slot_DoneFunc done_slot */ + + T42_GlyphSlot_Load, /* FT_Slot_LoadFunc load_glyph */ + + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ + + T42_Size_Request, /* FT_Size_RequestFunc request_size */ + T42_Size_Select /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/type42/t42drivr.h b/external/freetype/src/type42/t42drivr.h new file mode 100644 index 000000000..ec7da18cc --- /dev/null +++ b/external/freetype/src/type42/t42drivr.h @@ -0,0 +1,36 @@ +/**************************************************************************** + * + * t42drivr.h + * + * High-level Type 42 driver interface (specification). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T42DRIVR_H_ +#define T42DRIVR_H_ + + +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t42_driver_class; + +FT_END_HEADER + + +#endif /* T42DRIVR_H_ */ + + +/* END */ diff --git a/external/freetype/src/type42/t42error.h b/external/freetype/src/type42/t42error.h new file mode 100644 index 000000000..dcea9c4f6 --- /dev/null +++ b/external/freetype/src/type42/t42error.h @@ -0,0 +1,41 @@ +/**************************************************************************** + * + * t42error.h + * + * Type 42 error codes (specification only). + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the Type 42 error enumeration constants. + * + */ + +#ifndef T42ERROR_H_ +#define T42ERROR_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX T42_Err_ +#define FT_ERR_BASE FT_Mod_Err_Type42 + +#include <freetype/fterrors.h> + +#endif /* T42ERROR_H_ */ + + +/* END */ diff --git a/external/freetype/src/type42/t42objs.c b/external/freetype/src/type42/t42objs.c new file mode 100644 index 000000000..bf4028e75 --- /dev/null +++ b/external/freetype/src/type42/t42objs.c @@ -0,0 +1,698 @@ +/**************************************************************************** + * + * t42objs.c + * + * Type 42 objects manager (body). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "t42objs.h" +#include "t42parse.h" +#include "t42error.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/ftlist.h> +#include <freetype/ttnameid.h> + + +#undef FT_COMPONENT +#define FT_COMPONENT t42 + + + static FT_Error + T42_Open_Face( T42_Face face ) + { + T42_LoaderRec loader; + T42_Parser parser; + T1_Font type1 = &face->type1; + FT_Memory memory = face->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + t42_loader_init( &loader, face ); + + parser = &loader.parser; + + face->ttf_data = NULL; + face->ttf_size = 0; + + error = t42_parser_init( parser, + face->root.stream, + memory, + psaux); + if ( error ) + goto Exit; + + error = t42_parse_dict( face, &loader, + parser->base_dict, parser->base_len ); + if ( error ) + goto Exit; + + if ( type1->font_type != 42 ) + { + FT_ERROR(( "T42_Open_Face: cannot handle FontType %d\n", + type1->font_type )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* now, propagate the charstrings and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T42_Open_Face: no charstrings array in face\n" )); + error = FT_THROW( Invalid_File_Format ); + } + + loader.charstrings.init = 0; + type1->charstrings_block = loader.charstrings.block; + type1->charstrings = loader.charstrings.elements; + type1->charstrings_len = loader.charstrings.lengths; + + /* we copy the glyph names `block' and `elements' fields; */ + /* the `lengths' field must be released later */ + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; + loader.glyph_names.block = NULL; + loader.glyph_names.elements = NULL; + + /* we must now build type1.encoding when we have a custom array */ + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) + { + FT_Int charcode, idx, min_char, max_char; + + + /* OK, we do the following: for each element in the encoding */ + /* table, look up the index of the glyph having the same name */ + /* as defined in the CharStrings array. */ + /* The index is then stored in type1.encoding.char_index, and */ + /* the name in type1.encoding.char_name */ + + min_char = 0; + max_char = 0; + + charcode = 0; + for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) + { + const FT_String* char_name = + (const FT_String*)loader.encoding_table.elements[charcode]; + + + type1->encoding.char_index[charcode] = 0; + type1->encoding.char_name [charcode] = ".notdef"; + + if ( char_name ) + for ( idx = 0; idx < type1->num_glyphs; idx++ ) + { + const FT_String* glyph_name = type1->glyph_names[idx]; + + + if ( ft_strcmp( char_name, glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = (FT_UShort)idx; + type1->encoding.char_name [charcode] = glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( ft_strcmp( ".notdef", glyph_name ) != 0 ) + { + if ( charcode < min_char ) + min_char = charcode; + if ( charcode >= max_char ) + max_char = charcode + 1; + } + break; + } + } + } + + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + Exit: + t42_loader_done( &loader ); + if ( error ) + { + FT_FREE( face->ttf_data ); + face->ttf_size = 0; + } + return error; + } + + + /***************** Driver Functions *************/ + + + FT_LOCAL_DEF( FT_Error ) + T42_Face_Init( FT_Stream stream, + FT_Face t42face, /* T42_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + T42_Face face = (T42_Face)t42face; + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + FT_Face root = (FT_Face)&face->root; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + face->ttf_face = NULL; + face->root.num_faces = 1; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; + + face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psaux" ); + psaux = (PSAux_Service)face->psaux; + if ( !psaux ) + { + FT_ERROR(( "T42_Face_Init: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + FT_TRACE2(( "Type 42 driver\n" )); + + /* open the tokenizer, this will also check the font format */ + error = T42_Open_Face( face ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + if ( ( face_index & 0xFFFF ) > 0 ) + { + FT_ERROR(( "T42_Face_Init: invalid face index\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* Now load the font program into the face object */ + + /* Init the face object fields */ + /* Now set up root face fields */ + + root->num_glyphs = type1->num_glyphs; + root->num_charmaps = 0; + root->face_index = 0; + + root->face_flags |= FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES; + + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + root->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* XXX: TODO -- add kerning with .afm support */ + + /* get style name -- be careful, some broken fonts only */ + /* have a `/FontName' dictionary entry! */ + root->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + root->style_name = (char *)"Regular"; + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; + + + if ( full ) + { + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + root->style_name = full; + break; + } + } + } + } + } + else + { + /* do we have a `/FontName'? */ + if ( type1->font_name ) + root->family_name = type1->font_name; + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = NULL; + + /* Load the TTF font embedded in the T42 font */ + { + FT_Open_Args args; + + + args.flags = FT_OPEN_MEMORY | FT_OPEN_DRIVER; + args.driver = FT_Get_Module( FT_FACE_LIBRARY( face ), + "truetype" ); + args.memory_base = face->ttf_data; + args.memory_size = face->ttf_size; + + if ( num_params ) + { + args.flags |= FT_OPEN_PARAMS; + args.num_params = num_params; + args.params = params; + } + + error = FT_Open_Face( FT_FACE_LIBRARY( face ), + &args, 0, &face->ttf_face ); + } + + if ( error ) + goto Exit; + + FT_Done_Size( face->ttf_face->size ); + + /* Ignore info in FontInfo dictionary and use the info from the */ + /* loaded TTF font. The PostScript interpreter also ignores it. */ + root->bbox = face->ttf_face->bbox; + root->units_per_EM = face->ttf_face->units_per_EM; + + root->ascender = face->ttf_face->ascender; + root->descender = face->ttf_face->descender; + root->height = face->ttf_face->height; + + root->max_advance_width = face->ttf_face->max_advance_width; + root->max_advance_height = face->ttf_face->max_advance_height; + + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL ) + root->face_flags |= FT_FACE_FLAG_VERTICAL; + + { + if ( psnames ) + { + FT_CharMapRec charmap; + T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; + FT_CMap_Class clazz; + + + charmap.face = root; + + /* first of all, try to synthesize a Unicode charmap */ + charmap.platform_id = TT_PLATFORM_MICROSOFT; + charmap.encoding_id = TT_MS_ID_UNICODE_CS; + charmap.encoding = FT_ENCODING_UNICODE; + + error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + if ( error && + FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) && + FT_ERR_NEQ( error, Unimplemented_Feature ) ) + goto Exit; + error = FT_Err_Ok; + + /* now, generate an Adobe Standard encoding when appropriate */ + charmap.platform_id = TT_PLATFORM_ADOBE; + clazz = NULL; + + switch ( type1->encoding_type ) + { + case T1_ENCODING_TYPE_STANDARD: + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; + clazz = cmap_classes->standard; + break; + + case T1_ENCODING_TYPE_EXPERT: + charmap.encoding = FT_ENCODING_ADOBE_EXPERT; + charmap.encoding_id = TT_ADOBE_ID_EXPERT; + clazz = cmap_classes->expert; + break; + + case T1_ENCODING_TYPE_ARRAY: + charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; + charmap.encoding_id = TT_ADOBE_ID_CUSTOM; + clazz = cmap_classes->custom; + break; + + case T1_ENCODING_TYPE_ISOLATIN1: + charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; + charmap.encoding_id = TT_ADOBE_ID_LATIN_1; + clazz = cmap_classes->unicode; + break; + + default: + ; + } + + if ( clazz ) + error = FT_CMap_New( clazz, NULL, &charmap, NULL ); + } + } + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + T42_Face_Done( FT_Face t42face ) + { + T42_Face face = (T42_Face)t42face; + T1_Font type1; + PS_FontInfo info; + FT_Memory memory; + + + if ( !face ) + return; + + type1 = &face->type1; + info = &type1->font_info; + memory = face->root.memory; + + /* delete internal ttf face prior to freeing face->ttf_data */ + if ( face->ttf_face ) + FT_Done_Face( face->ttf_face ); + + /* release font info strings */ + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + + /* release top dictionary */ + FT_FREE( type1->charstrings_len ); + FT_FREE( type1->charstrings ); + FT_FREE( type1->glyph_names ); + + FT_FREE( type1->charstrings_block ); + FT_FREE( type1->glyph_names_block ); + + FT_FREE( type1->encoding.char_index ); + FT_FREE( type1->encoding.char_name ); + FT_FREE( type1->font_name ); + + FT_FREE( face->ttf_data ); + +#if 0 + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_AFM( memory, (T1_AFM*)face->afm_data ); +#endif + + /* release unicode map, if any */ + FT_FREE( face->unicode_map.maps ); + face->unicode_map.num_maps = 0; + + face->root.family_name = NULL; + face->root.style_name = NULL; + } + + + /************************************************************************** + * + * @Function: + * T42_Driver_Init + * + * @Description: + * Initializes a given Type 42 driver object. + * + * @Input: + * driver :: + * A handle to the target driver object. + * + * @Return: + * FreeType error code. 0 means success. + */ + FT_LOCAL_DEF( FT_Error ) + T42_Driver_Init( FT_Module module ) /* T42_Driver */ + { + T42_Driver driver = (T42_Driver)module; + FT_Module ttmodule; + + + ttmodule = FT_Get_Module( module->library, "truetype" ); + if ( !ttmodule ) + { + FT_ERROR(( "T42_Driver_Init: cannot access `truetype' module\n" )); + return FT_THROW( Missing_Module ); + } + + driver->ttclazz = (FT_Driver_Class)ttmodule->clazz; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + T42_Driver_Done( FT_Module module ) + { + FT_UNUSED( module ); + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Init( FT_Size size ) /* T42_Size */ + { + T42_Size t42size = (T42_Size)size; + FT_Face face = size->face; + T42_Face t42face = (T42_Face)face; + FT_Size ttsize; + FT_Error error; + + + error = FT_New_Size( t42face->ttf_face, &ttsize ); + if ( !error ) + t42size->ttsize = ttsize; + + FT_Activate_Size( ttsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Request( FT_Size t42size, /* T42_Size */ + FT_Size_Request req ) + { + T42_Size size = (T42_Size)t42size; + T42_Face face = (T42_Face)t42size->face; + FT_Error error; + + + FT_Activate_Size( size->ttsize ); + + error = FT_Request_Size( face->ttf_face, req ); + if ( !error ) + t42size->metrics = face->ttf_face->size->metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Select( FT_Size t42size, /* T42_Size */ + FT_ULong strike_index ) + { + T42_Size size = (T42_Size)t42size; + T42_Face face = (T42_Face)t42size->face; + FT_Error error; + + + FT_Activate_Size( size->ttsize ); + + error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index ); + if ( !error ) + t42size->metrics = face->ttf_face->size->metrics; + + return error; + + } + + + FT_LOCAL_DEF( void ) + T42_Size_Done( FT_Size t42size ) /* T42_Size */ + { + T42_Size size = (T42_Size)t42size; + FT_Face face = t42size->face; + T42_Face t42face = (T42_Face)face; + FT_ListNode node; + + + node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize ); + if ( node ) + { + FT_Done_Size( size->ttsize ); + size->ttsize = NULL; + } + } + + + FT_LOCAL_DEF( FT_Error ) + T42_GlyphSlot_Init( FT_GlyphSlot t42slot ) /* T42_GlyphSlot */ + { + T42_GlyphSlot slot = (T42_GlyphSlot)t42slot; + FT_Face face = t42slot->face; + T42_Face t42face = (T42_Face)face; + FT_GlyphSlot ttslot; + FT_Memory memory = face->memory; + FT_Error error = FT_Err_Ok; + + + if ( !face->glyph ) + { + /* First glyph slot for this face */ + slot->ttslot = t42face->ttf_face->glyph; + } + else + { + error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot ); + if ( !error ) + slot->ttslot = ttslot; + } + + /* share the loader so that the autohinter can see it */ + FT_GlyphLoader_Done( slot->ttslot->internal->loader ); + FT_FREE( slot->ttslot->internal ); + slot->ttslot->internal = t42slot->internal; + + return error; + } + + + FT_LOCAL_DEF( void ) + T42_GlyphSlot_Done( FT_GlyphSlot t42slot ) /* T42_GlyphSlot */ + { + T42_GlyphSlot slot = (T42_GlyphSlot)t42slot; + + + /* do not destroy the inherited internal structure just yet */ + slot->ttslot->internal = NULL; + FT_Done_GlyphSlot( slot->ttslot ); + } + + + static void + t42_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + FT_ZERO( &slot->bitmap ); + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = NULL; + slot->control_data = NULL; + slot->control_len = 0; + slot->other = NULL; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_GlyphSlot_Load( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + T42_GlyphSlot t42slot = (T42_GlyphSlot)glyph; + T42_Size t42size = (T42_Size)size; + T42_Face t42face = (T42_Face)size->face; + FT_Driver_Class ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz; + + + FT_TRACE1(( "T42_GlyphSlot_Load: glyph index %d\n", glyph_index )); + + /* map T42 glyph index to embedded TTF's glyph index */ + glyph_index = (FT_UInt)ft_strtol( + (const char *)t42face->type1.charstrings[glyph_index], + NULL, 10 ); + + t42_glyphslot_clear( t42slot->ttslot ); + error = ttclazz->load_glyph( t42slot->ttslot, + t42size->ttsize, + glyph_index, + load_flags | FT_LOAD_NO_BITMAP ); + + if ( !error ) + { + glyph->metrics = t42slot->ttslot->metrics; + + glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance; + glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance; + + glyph->format = t42slot->ttslot->format; + glyph->outline = t42slot->ttslot->outline; + + glyph->bitmap = t42slot->ttslot->bitmap; + glyph->bitmap_left = t42slot->ttslot->bitmap_left; + glyph->bitmap_top = t42slot->ttslot->bitmap_top; + + glyph->num_subglyphs = t42slot->ttslot->num_subglyphs; + glyph->subglyphs = t42slot->ttslot->subglyphs; + + glyph->control_data = t42slot->ttslot->control_data; + glyph->control_len = t42slot->ttslot->control_len; + } + + return error; + } + + +/* END */ diff --git a/external/freetype/src/type42/t42objs.h b/external/freetype/src/type42/t42objs.h new file mode 100644 index 000000000..33e6215e1 --- /dev/null +++ b/external/freetype/src/type42/t42objs.h @@ -0,0 +1,123 @@ +/**************************************************************************** + * + * t42objs.h + * + * Type 42 objects manager (specification). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T42OBJS_H_ +#define T42OBJS_H_ + +#include <freetype/freetype.h> +#include <freetype/t1tables.h> +#include <freetype/internal/t1types.h> +#include "t42types.h" +#include <freetype/internal/ftobjs.h> +#include <freetype/internal/ftdrv.h> +#include <freetype/internal/services/svpscmap.h> +#include <freetype/internal/pshints.h> + + +FT_BEGIN_HEADER + + + /* Type42 size */ + typedef struct T42_SizeRec_ + { + FT_SizeRec root; + FT_Size ttsize; + + } T42_SizeRec, *T42_Size; + + + /* Type42 slot */ + typedef struct T42_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + FT_GlyphSlot ttslot; + + } T42_GlyphSlotRec, *T42_GlyphSlot; + + + /* Type 42 driver */ + typedef struct T42_DriverRec_ + { + FT_DriverRec root; + FT_Driver_Class ttclazz; + + } T42_DriverRec, *T42_Driver; + + + /* */ + + + FT_LOCAL( FT_Error ) + T42_Face_Init( FT_Stream stream, + FT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + FT_LOCAL( void ) + T42_Face_Done( FT_Face face ); + + + FT_LOCAL( FT_Error ) + T42_Size_Init( FT_Size size ); + + + FT_LOCAL( FT_Error ) + T42_Size_Request( FT_Size size, + FT_Size_Request req ); + + + FT_LOCAL( FT_Error ) + T42_Size_Select( FT_Size size, + FT_ULong strike_index ); + + + FT_LOCAL( void ) + T42_Size_Done( FT_Size size ); + + + FT_LOCAL( FT_Error ) + T42_GlyphSlot_Init( FT_GlyphSlot slot ); + + + FT_LOCAL( FT_Error ) + T42_GlyphSlot_Load( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + FT_LOCAL( void ) + T42_GlyphSlot_Done( FT_GlyphSlot slot ); + + + FT_LOCAL( FT_Error ) + T42_Driver_Init( FT_Module module ); + + FT_LOCAL( void ) + T42_Driver_Done( FT_Module module ); + + /* */ + +FT_END_HEADER + + +#endif /* T42OBJS_H_ */ + + +/* END */ diff --git a/external/freetype/src/type42/t42parse.c b/external/freetype/src/type42/t42parse.c new file mode 100644 index 000000000..f96a43b14 --- /dev/null +++ b/external/freetype/src/type42/t42parse.c @@ -0,0 +1,1355 @@ +/**************************************************************************** + * + * t42parse.c + * + * Type 42 font parser (body). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include "t42parse.h" +#include "t42error.h" +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/psaux.h> + + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT t42 + + + static void + t42_parse_font_matrix( FT_Face face, + void* loader_ ); + static void + t42_parse_encoding( FT_Face face, + void* loader_ ); + + static void + t42_parse_charstrings( FT_Face face, + void* loader_ ); + + static void + t42_parse_sfnts( FT_Face face, + void* loader_ ); + + + /* as Type42 fonts have no Private dict, */ + /* we set the last argument of T1_FIELD_XXX to 0 */ + static const + T1_FieldRec t42_keywords[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontInfo +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, 0 ) + T1_FIELD_STRING( "Notice", notice, 0 ) + T1_FIELD_STRING( "FullName", full_name, 0 ) + T1_FIELD_STRING( "FamilyName", family_name, 0 ) + T1_FIELD_STRING( "Weight", weight, 0 ) + T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, 0 ) + T1_FIELD_NUM ( "PaintType", paint_type, 0 ) + T1_FIELD_NUM ( "FontType", font_type, 0 ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, 0 ) + + T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix, 0 ) + T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding, 0 ) + T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 ) + T1_FIELD_CALLBACK( "sfnts", t42_parse_sfnts, 0 ) + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) \ + (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToBytes( p, b, m, n, d ) \ + (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d ) + +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + /********************* Parsing Functions ******************/ + + FT_LOCAL_DEF( FT_Error ) + t42_parser_init( T42_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error = FT_Err_Ok; + FT_Long size; + + + psaux->ps_parser_funcs->init( &parser->root, NULL, NULL, memory ); + + parser->stream = stream; + parser->base_len = 0; + parser->base_dict = NULL; + parser->in_memory = 0; + + /******************************************************************** + * + * Here a short summary of what is going on: + * + * When creating a new Type 42 parser, we try to locate and load + * the base dictionary, loading the whole font into memory. + * + * When `loading' the base dictionary, we only set up pointers + * in the case of a memory-based stream. Otherwise, we allocate + * and load the base dictionary in it. + * + * parser->in_memory is set if we have a memory stream. + */ + + if ( FT_STREAM_SEEK( 0L ) || + FT_FRAME_ENTER( 17 ) ) + goto Exit; + + if ( ft_memcmp( stream->cursor, "%!PS-TrueTypeFont", 17 ) != 0 ) + { + FT_TRACE2(( " not a Type42 font\n" )); + error = FT_THROW( Unknown_File_Format ); + } + + FT_FRAME_EXIT(); + + if ( error || FT_STREAM_SEEK( 0 ) ) + goto Exit; + + size = (FT_Long)stream->size; + + /* now, try to load `size' bytes of the `base' dictionary we */ + /* found previously */ + + /* if it is a memory-based resource, set up pointers */ + if ( !stream->read ) + { + parser->base_dict = (FT_Byte*)stream->base + stream->pos; + parser->base_len = size; + parser->in_memory = 1; + + /* check that the `size' field is valid */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + else + { + /* read segment in memory */ + if ( FT_QALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) + goto Exit; + + parser->base_len = size; + } + + parser->root.base = parser->base_dict; + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->root.cursor + parser->base_len; + + Exit: + if ( error && !parser->in_memory ) + FT_FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF( void ) + t42_parser_done( T42_Parser parser ) + { + FT_Memory memory = parser->root.memory; + + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FT_FREE( parser->base_dict ); + + if ( parser->root.funcs.done ) + parser->root.funcs.done( &parser->root ); + } + + + static int + t42_is_space( FT_Byte c ) + { + return ( c == ' ' || c == '\t' || + c == '\r' || c == '\n' || c == '\f' || + c == '\0' ); + } + + + static void + t42_parse_font_matrix( FT_Face face, /* T42_Face */ + void* loader_ ) + { + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; + T42_Parser parser = &loader->parser; + FT_Matrix* matrix = &t42face->type1.font_matrix; + FT_Vector* offset = &t42face->type1.font_offset; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + FT_Int result; + + + result = T1_ToFixedArray( parser, 6, temp, 0 ); + + if ( result < 6 ) + { + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + temp_scale = FT_ABS( temp[3] ); + + if ( temp_scale == 0 ) + { + FT_ERROR(( "t42_parse_font_matrix: invalid font matrix\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* atypical case */ + if ( temp_scale != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + if ( !FT_Matrix_Check( matrix ) ) + { + FT_ERROR(( "t42_parse_font_matrix: invalid font matrix\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* note that the offsets must be expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + + static void + t42_parse_encoding( FT_Face face, + void* loader_ ) + { + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; + T42_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + PSAux_Service psaux = (PSAux_Service)t42face->psaux; + + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) + { + FT_ERROR(( "t42_parse_encoding: out of bounds\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) + { + T1_Encoding encode = &t42face->type1.encoding; + FT_Int count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Bool only_immediates = 0; + + + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_Int)T1_ToInt( parser ); + + /* only composite fonts (which we don't support) */ + /* can have larger values */ + if ( count > 256 ) + { + FT_ERROR(( "t42_parse_encoding: invalid encoding array size\n" )); + parser->root.error = FT_THROW( Invalid_File_Format ); + return; + } + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) + return; + + /* PostScript happily allows overwriting of encoding arrays */ + if ( encode->char_index ) + { + FT_FREE( encode->char_index ); + FT_FREE( encode->char_name ); + T1_Release_Table( char_table ); + } + + /* we use a T1_Table to store our charnames */ + loader->num_chars = encode->num_chars = count; + if ( FT_QNEW_ARRAY( encode->char_index, count ) || + FT_QNEW_ARRAY( encode->char_name, count ) || + FT_SET_ERROR( psaux->ps_table_funcs->init( + char_table, count, memory ) ) ) + { + parser->root.error = error; + return; + } + + /* We need to `zero' out encoding_table.elements */ + for ( n = 0; n < count; n++ ) + (void)T1_Add_Table( char_table, n, ".notdef", 8 ); + + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ + /* */ + /* We simply look for a number followed by an immediate */ + /* name. Note that this ignores correctly the sequence */ + /* that is often seen in type42 fonts: */ + /* */ + /* 0 1 255 { 1 index exch /.notdef put } for dup */ + /* */ + /* used to clean the encoding array before anything else. */ + /* */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ + + n = 0; + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + /* we stop when we encounter `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + t42_is_space( cur[3] ) ) + { + FT_TRACE6(( "encoding end\n" )); + cur += 3; + break; + } + } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } + + /* check whether we have found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) + { + FT_Int charcode; + + + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + + /* protect against invalid charcode */ + if ( cur == parser->root.cursor ) + { + parser->root.error = FT_THROW( Unknown_File_Format ); + return; + } + } + + cur = parser->root.cursor; + + if ( cur + 2 < limit && *cur == '/' && n < count ) + { + FT_UInt len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.cursor >= limit ) + return; + if ( parser->root.error ) + return; + + len = (FT_UInt)( parser->root.cursor - cur ); + + parser->root.error = T1_Add_Table( char_table, charcode, + cur, len + 1 ); + if ( parser->root.error ) + return; + char_table->elements[charcode][len] = '\0'; + + n++; + } + else if ( only_immediates ) + { + /* Since the current position is not updated for */ + /* immediates-only mode we would get an infinite loop if */ + /* we don't do anything here. */ + /* */ + /* This encoding array is not valid according to the */ + /* type42 specification (it might be an encoding for a CID */ + /* type42 font, however), so we conclude that this font is */ + /* NOT a type42 font. */ + parser->root.error = FT_THROW( Unknown_File_Format ); + return; + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + } + + T1_Skip_Spaces( parser ); + } + + t42face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; + } + + /* Otherwise, we should have either `StandardEncoding', */ + /* `ExpertEncoding', or `ISOLatin1Encoding' */ + else + { + if ( cur + 17 < limit && + ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + t42face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + + else if ( cur + 15 < limit && + ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + t42face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + + else if ( cur + 18 < limit && + ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + t42face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + + else + parser->root.error = FT_ERR( Ignore ); + } + } + + + typedef enum T42_Load_Status_ + { + BEFORE_START, + BEFORE_TABLE_DIR, + OTHER_TABLES + + } T42_Load_Status; + + + static void + t42_parse_sfnts( FT_Face face, + void* loader_ ) + { + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; + T42_Parser parser = &loader->parser; + FT_Memory memory = parser->root.memory; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Error error; + FT_Int num_tables = 0; + FT_Long ttf_count; + FT_Long ttf_reserved; + + FT_ULong n, string_size, old_string_size, real_size; + FT_Byte* string_buf = NULL; + FT_Bool allocated = 0; + + T42_Load_Status status; + + /** There should only be one sfnts array, but free any previous. */ + FT_FREE( t42face->ttf_data ); + t42face->ttf_size = 0; + + /* The format is */ + /* */ + /* /sfnts [ <hexstring> <hexstring> ... ] def */ + /* */ + /* or */ + /* */ + /* /sfnts [ */ + /* <num_bin_bytes> RD <binary data> */ + /* <num_bin_bytes> RD <binary data> */ + /* ... */ + /* ] def */ + /* */ + /* with exactly one space after the `RD' token. */ + + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' ) + { + FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + T1_Skip_Spaces( parser ); + status = BEFORE_START; + string_size = 0; + old_string_size = 0; + ttf_count = 0; + ttf_reserved = 12; + if ( FT_QALLOC( t42face->ttf_data, ttf_reserved ) ) + goto Fail; + + FT_TRACE2(( "\n" )); + FT_TRACE2(( "t42_parse_sfnts:\n" )); + + while ( parser->root.cursor < limit ) + { + FT_ULong size; + + + cur = parser->root.cursor; + + if ( *cur == ']' ) + { + parser->root.cursor++; + t42face->ttf_size = ttf_count; + goto Exit; + } + + else if ( *cur == '<' ) + { + if ( string_buf && !allocated ) + { + FT_ERROR(( "t42_parse_sfnts: " + "can't handle mixed binary and hex strings\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + /* don't include delimiters */ + string_size = (FT_ULong)( ( parser->root.cursor - cur - 2 + 1 ) / 2 ); + if ( !string_size ) + { + FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + if ( FT_QREALLOC( string_buf, old_string_size, string_size ) ) + goto Fail; + + allocated = 1; + + parser->root.cursor = cur; + (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 ); + old_string_size = string_size; + string_size = real_size; + } + + else if ( ft_isdigit( *cur ) ) + { + FT_Long tmp; + + + if ( allocated ) + { + FT_ERROR(( "t42_parse_sfnts: " + "can't handle mixed binary and hex strings\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + tmp = T1_ToInt( parser ); + if ( tmp < 0 ) + { + FT_ERROR(( "t42_parse_sfnts: invalid string size\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + else + string_size = (FT_ULong)tmp; + + T1_Skip_PS_Token( parser ); /* `RD' */ + if ( parser->root.error ) + return; + + string_buf = parser->root.cursor + 1; /* one space after `RD' */ + + if ( (FT_ULong)( limit - parser->root.cursor ) <= string_size ) + { + FT_ERROR(( "t42_parse_sfnts: too much binary data\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + else + parser->root.cursor += string_size + 1; + } + + if ( !string_buf ) + { + FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* A string can have a trailing zero (odd) byte for padding. */ + /* Ignore it. */ + if ( ( string_size & 1 ) && string_buf[string_size - 1] == 0 ) + string_size--; + + if ( !string_size ) + { + FT_ERROR(( "t42_parse_sfnts: invalid string\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + FT_TRACE2(( " PS string size %5lu bytes, offset 0x%08lx (%lu)\n", + string_size, ttf_count, ttf_count )); + + /* The whole TTF is now loaded into `string_buf'. We are */ + /* checking its contents while copying it to `ttf_data'. */ + + size = (FT_ULong)( limit - parser->root.cursor ); + + for ( n = 0; n < string_size; n++ ) + { + switch ( status ) + { + case BEFORE_START: + /* load offset table, 12 bytes */ + if ( ttf_count < 12 ) + { + t42face->ttf_data[ttf_count++] = string_buf[n]; + continue; + } + else + { + FT_Long ttf_reserved_prev = ttf_reserved; + + + num_tables = 16 * t42face->ttf_data[4] + t42face->ttf_data[5]; + status = BEFORE_TABLE_DIR; + ttf_reserved = 12 + 16 * num_tables; + + FT_TRACE2(( " SFNT directory contains %d tables\n", + num_tables )); + + if ( (FT_Long)size < ttf_reserved ) + { + FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + if ( FT_QREALLOC( t42face->ttf_data, ttf_reserved_prev, + ttf_reserved ) ) + goto Fail; + } + FALL_THROUGH; + + case BEFORE_TABLE_DIR: + /* the offset table is read; read the table directory */ + if ( ttf_count < ttf_reserved ) + { + t42face->ttf_data[ttf_count++] = string_buf[n]; + continue; + } + else + { + int i; + FT_ULong len; + FT_Long ttf_reserved_prev = ttf_reserved; + + + FT_TRACE2(( "\n" )); + FT_TRACE2(( " table length\n" )); + FT_TRACE2(( " ------------------------------\n" )); + + for ( i = 0; i < num_tables; i++ ) + { + FT_Byte* p = t42face->ttf_data + 12 + 16 * i + 12; + + + len = FT_PEEK_ULONG( p ); + FT_TRACE2(( " %4i 0x%08lx (%lu)\n", i, len, len )); + + if ( len > size || + ttf_reserved > (FT_Long)( size - len ) ) + { + FT_ERROR(( "t42_parse_sfnts:" + " invalid data in sfnts array\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* Pad to a 4-byte boundary length */ + ttf_reserved += (FT_Long)( ( len + 3 ) & ~3U ); + } + ttf_reserved += 1; + + status = OTHER_TABLES; + + FT_TRACE2(( "\n" )); + FT_TRACE2(( " allocating %ld bytes\n", ttf_reserved )); + FT_TRACE2(( "\n" )); + + if ( FT_QREALLOC( t42face->ttf_data, ttf_reserved_prev, + ttf_reserved ) ) + goto Fail; + } + FALL_THROUGH; + + case OTHER_TABLES: + /* all other tables are just copied */ + if ( ttf_count >= ttf_reserved ) + { + FT_ERROR(( "t42_parse_sfnts: too much binary data\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + t42face->ttf_data[ttf_count++] = string_buf[n]; + } + } + + T1_Skip_Spaces( parser ); + } + + /* if control reaches this point, the format was not valid */ + error = FT_THROW( Invalid_File_Format ); + + Fail: + parser->root.error = error; + + Exit: + if ( parser->root.error ) + { + FT_FREE( t42face->ttf_data ); + t42face->ttf_size = 0; + } + if ( allocated ) + FT_FREE( string_buf ); + } + + + static void + t42_parse_charstrings( FT_Face face, /* T42_Face */ + void* loader_ ) + { + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; + T42_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)t42face->psaux; + + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Int n; + FT_Int notdef_index = 0; + FT_Byte notdef_found = 0; + + + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + if ( ft_isdigit( *parser->root.cursor ) ) + { + loader->num_glyphs = T1_ToInt( parser ); + if ( parser->root.error ) + return; + if ( loader->num_glyphs < 0 ) + { + FT_ERROR(( "t42_parse_encoding: invalid number of glyphs\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* we certainly need more than 4 bytes per glyph */ + if ( loader->num_glyphs > ( limit - parser->root.cursor ) >> 2 ) + { + FT_TRACE0(( "t42_parse_charstrings: adjusting number of glyphs" + " (from %d to %zu)\n", + loader->num_glyphs, + ( limit - parser->root.cursor ) >> 2 )); + loader->num_glyphs = ( limit - parser->root.cursor ) >> 2; + } + + } + else if ( *parser->root.cursor == '<' ) + { + /* We have `<< ... >>'. Count the number of `/' in the dictionary */ + /* to get its size. */ + FT_Int count = 0; + + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + + while ( parser->root.cursor < limit ) + { + if ( *parser->root.cursor == '/' ) + count++; + else if ( *parser->root.cursor == '>' ) + { + loader->num_glyphs = count; + parser->root.cursor = cur; /* rewind */ + break; + } + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + } + } + else + { + FT_ERROR(( "t42_parse_charstrings: invalid token\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* initialize tables */ + + /* contrary to Type1, we disallow multiple CharStrings arrays */ + if ( swap_table->init ) + { + FT_ERROR(( "t42_parse_charstrings:" + " only one CharStrings array allowed\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + error = psaux->ps_table_funcs->init( code_table, + loader->num_glyphs, + memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( name_table, + loader->num_glyphs, + memory ); + if ( error ) + goto Fail; + + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + + n = 0; + + for (;;) + { + /* We support two formats. */ + /* */ + /* `/glyphname' + index [+ `def'] */ + /* `(glyphname)' [+ `cvn'] + index [+ `def'] */ + /* */ + /* The latter format gets created by the */ + /* LilyPond typesetting program. */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* We stop when we find an `end' keyword or '>' */ + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' && + t42_is_space( cur[3] ) ) + break; + if ( *cur == '>' ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + if ( parser->root.error ) + return; + + if ( *cur == '/' || *cur == '(' ) + { + FT_UInt len; + FT_Bool have_literal = FT_BOOL( *cur == '(' ); + + + if ( cur + ( have_literal ? 3 : 2 ) >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + cur++; /* skip `/' */ + len = (FT_UInt)( parser->root.cursor - cur ); + if ( have_literal ) + len--; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + /* add a trailing zero to the name table */ + name_table->elements[n][len] = '\0'; + + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)( name_table->elements[n] ) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + T1_Skip_Spaces( parser ); + + if ( have_literal ) + T1_Skip_PS_Token( parser ); + + cur = parser->root.cursor; + + (void)T1_ToInt( parser ); + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + len = (FT_UInt)( parser->root.cursor - cur ); + + error = T1_Add_Table( code_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + code_table->elements[n][len] = '\0'; + + n++; + if ( n >= loader->num_glyphs ) + break; + } + } + + loader->num_glyphs = n; + + if ( !notdef_found ) + { + FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* if /.notdef does not occupy index 0, do our magic. */ + if ( ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + + return; + + Fail: + parser->root.error = error; + } + + + static FT_Error + t42_load_keyword( T42_Face face, + T42_Loader loader, + T1_Field field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects = 0; + + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { + field->reader( (FT_Face)face, loader ); + error = loader->parser.root.error; + goto Exit; + } + + /* now the keyword is either a simple field or a table of fields; */ + /* we are now going to take care of it */ + + switch ( field->location ) + { + case T1_FIELD_LOCATION_FONT_INFO: + dummy_object = &face->type1.font_info; + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + dummy_object = &face->type1.font_extra; + break; + + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + break; + + default: + dummy_object = &face->type1; + } + + objects = &dummy_object; + + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ) + { + T42_Parser parser = &loader->parser; + FT_Byte* limit; + FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / + sizeof ( t42_keywords[0] ) ); + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = FT_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `FontDirectory' which causes problems for some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + { + FT_Byte* cur2; + + + /* skip the `FontDirectory' keyword */ + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = cur2 = parser->root.cursor; + + /* look up the `known' keyword */ + while ( cur < limit ) + { + if ( *cur == 'k' && cur + 5 < limit && + ft_strncmp( (char*)cur, "known", 5 ) == 0 ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + if ( cur < limit ) + { + T1_TokenRec token; + + + /* skip the `known' keyword and the token following it */ + T1_Skip_PS_Token( parser ); + T1_ToToken( parser, &token ); + + /* if the last token was an array, skip it! */ + if ( token.type == T1_TOKEN_TYPE_ARRAY ) + cur2 = parser->root.cursor; + } + parser->root.cursor = cur2; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_UInt len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = (FT_UInt)( parser->root.cursor - cur ); + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + int i; + + + /* now compare the immediate name to the keyword table */ + + /* loop through all known keywords */ + for ( i = 0; i < n_keywords; i++ ) + { + T1_Field keyword = (T1_Field)&t42_keywords[i]; + FT_Byte *name = (FT_Byte*)keyword->ident; + + + if ( !name ) + continue; + + if ( cur[0] == name[0] && + len == ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* we found it -- run the parsing callback! */ + parser->root.error = t42_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + FT_LOCAL_DEF( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ) + { + FT_UNUSED( face ); + + FT_ZERO( loader ); + loader->num_glyphs = 0; + loader->num_chars = 0; + + /* initialize the tables -- simply set their `init' field to 0 */ + loader->encoding_table.init = 0; + loader->charstrings.init = 0; + loader->glyph_names.init = 0; + } + + + FT_LOCAL_DEF( void ) + t42_loader_done( T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + + /* finalize parser */ + t42_parser_done( parser ); + } + + +/* END */ diff --git a/external/freetype/src/type42/t42parse.h b/external/freetype/src/type42/t42parse.h new file mode 100644 index 000000000..5741c5413 --- /dev/null +++ b/external/freetype/src/type42/t42parse.h @@ -0,0 +1,91 @@ +/**************************************************************************** + * + * t42parse.h + * + * Type 42 font parser (specification). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T42PARSE_H_ +#define T42PARSE_H_ + + +#include "t42objs.h" +#include <freetype/internal/psaux.h> + + +FT_BEGIN_HEADER + + typedef struct T42_ParserRec_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_Long base_len; + + FT_Bool in_memory; + + } T42_ParserRec, *T42_Parser; + + + typedef struct T42_Loader_ + { + T42_ParserRec parser; /* parser used to read the stream */ + + FT_Int num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_Int num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + } T42_LoaderRec, *T42_Loader; + + + FT_LOCAL( FT_Error ) + t42_parser_init( T42_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( void ) + t42_parser_done( T42_Parser parser ); + + + FT_LOCAL( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ); + + + FT_LOCAL( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ); + + FT_LOCAL( void ) + t42_loader_done( T42_Loader loader ); + + + /* */ + +FT_END_HEADER + + +#endif /* T42PARSE_H_ */ + + +/* END */ diff --git a/external/freetype/src/type42/t42types.h b/external/freetype/src/type42/t42types.h new file mode 100644 index 000000000..0bfe14ee4 --- /dev/null +++ b/external/freetype/src/type42/t42types.h @@ -0,0 +1,56 @@ +/**************************************************************************** + * + * t42types.h + * + * Type 42 font data types (specification only). + * + * Copyright (C) 2002-2023 by + * Roberto Alameda. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef T42TYPES_H_ +#define T42TYPES_H_ + + +#include <freetype/freetype.h> +#include <freetype/t1tables.h> +#include <freetype/internal/t1types.h> +#include <freetype/internal/pshints.h> + + +FT_BEGIN_HEADER + + + typedef struct T42_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; +#if 0 + const void* afm_data; +#endif + FT_Byte* ttf_data; + FT_Long ttf_size; + FT_Face ttf_face; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + PS_UnicodesRec unicode_map; + + } T42_FaceRec, *T42_Face; + + +FT_END_HEADER + +#endif /* T42TYPES_H_ */ + + +/* END */ diff --git a/external/freetype/src/type42/type42.c b/external/freetype/src/type42/type42.c new file mode 100644 index 000000000..8d2302c8e --- /dev/null +++ b/external/freetype/src/type42/type42.c @@ -0,0 +1,26 @@ +/**************************************************************************** + * + * type42.c + * + * FreeType Type 42 driver component. + * + * Copyright (C) 2002-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "t42drivr.c" +#include "t42objs.c" +#include "t42parse.c" + + +/* END */ diff --git a/external/freetype/src/winfonts/fnterrs.h b/external/freetype/src/winfonts/fnterrs.h new file mode 100644 index 000000000..dafdb07b4 --- /dev/null +++ b/external/freetype/src/winfonts/fnterrs.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * + * fnterrs.h + * + * Win FNT/FON error codes (specification only). + * + * Copyright (C) 2001-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + + /************************************************************************** + * + * This file is used to define the Windows FNT/FON error enumeration + * constants. + * + */ + +#ifndef FNTERRS_H_ +#define FNTERRS_H_ + +#include <freetype/ftmoderr.h> + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX FNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_Winfonts + +#include <freetype/fterrors.h> + +#endif /* FNTERRS_H_ */ + + +/* END */ diff --git a/external/freetype/src/winfonts/module.mk b/external/freetype/src/winfonts/module.mk new file mode 100644 index 000000000..78a290065 --- /dev/null +++ b/external/freetype/src/winfonts/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Windows FNT/FON module definition +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += WINDOWS_DRIVER + +define WINDOWS_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, winfnt_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)winfnt $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/external/freetype/src/winfonts/rules.mk b/external/freetype/src/winfonts/rules.mk new file mode 100644 index 000000000..b39c519e0 --- /dev/null +++ b/external/freetype/src/winfonts/rules.mk @@ -0,0 +1,68 @@ +# +# FreeType 2 Windows FNT/FON driver configuration rules +# + + +# Copyright (C) 1996-2023 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Windows driver directory +# +FNT_DIR := $(SRC_DIR)/winfonts + + +FNT_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(FNT_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# Windows driver sources (i.e., C files) +# +FNT_DRV_SRC := $(FNT_DIR)/winfnt.c + +# Windows driver headers +# +FNT_DRV_H := $(FNT_DRV_SRC:%.c=%.h) \ + $(FNT_DIR)/fnterrs.h + + +# Windows driver object(s) +# +# FNT_DRV_OBJ_M is used during `multi' builds +# FNT_DRV_OBJ_S is used during `single' builds +# +FNT_DRV_OBJ_M := $(FNT_DRV_SRC:$(FNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +FNT_DRV_OBJ_S := $(OBJ_DIR)/winfnt.$O + +# Windows driver source file for single build +# +FNT_DRV_SRC_S := $(FNT_DIR)/winfnt.c + + +# Windows driver - single object +# +$(FNT_DRV_OBJ_S): $(FNT_DRV_SRC_S) $(FNT_DRV_SRC) $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(FNT_DRV_SRC_S)) + + +# Windows driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(FNT_DIR)/%.c $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(FNT_DRV_OBJ_S) +DRV_OBJS_M += $(FNT_DRV_OBJ_M) + + +# EOF diff --git a/external/freetype/src/winfonts/winfnt.c b/external/freetype/src/winfonts/winfnt.c new file mode 100644 index 000000000..1160e4ef3 --- /dev/null +++ b/external/freetype/src/winfonts/winfnt.c @@ -0,0 +1,1219 @@ +/**************************************************************************** + * + * winfnt.c + * + * FreeType font driver for Windows FNT/FON files + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * Copyright 2003 Huw D M Davies for Codeweavers + * Copyright 2007 Dmitry Timoshkov for Codeweavers + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#include <freetype/ftwinfnt.h> +#include <freetype/internal/ftdebug.h> +#include <freetype/internal/ftstream.h> +#include <freetype/internal/ftobjs.h> +#include <freetype/ttnameid.h> + +#include "winfnt.h" +#include "fnterrs.h" +#include <freetype/internal/services/svwinfnt.h> +#include <freetype/internal/services/svfntfmt.h> + + /************************************************************************** + * + * The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT winfnt + + + static const FT_Frame_Field winmz_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinMZ_HeaderRec + + FT_FRAME_START( 64 ), + FT_FRAME_USHORT_LE ( magic ), + FT_FRAME_SKIP_BYTES( 29 * 2 ), + FT_FRAME_ULONG_LE ( lfanew ), + FT_FRAME_END + }; + + static const FT_Frame_Field winne_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinNE_HeaderRec + + FT_FRAME_START( 40 ), + FT_FRAME_USHORT_LE ( magic ), + FT_FRAME_SKIP_BYTES( 34 ), + FT_FRAME_USHORT_LE ( resource_tab_offset ), + FT_FRAME_USHORT_LE ( rname_tab_offset ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe32_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE32_HeaderRec + + FT_FRAME_START( 248 ), + FT_FRAME_ULONG_LE ( magic ), /* PE00 */ + FT_FRAME_USHORT_LE ( machine ), /* 0x014C - i386 */ + FT_FRAME_USHORT_LE ( number_of_sections ), + FT_FRAME_SKIP_BYTES( 12 ), + FT_FRAME_USHORT_LE ( size_of_optional_header ), + FT_FRAME_SKIP_BYTES( 2 ), + FT_FRAME_USHORT_LE ( magic32 ), /* 0x10B */ + FT_FRAME_SKIP_BYTES( 110 ), + FT_FRAME_ULONG_LE ( rsrc_virtual_address ), + FT_FRAME_ULONG_LE ( rsrc_size ), + FT_FRAME_SKIP_BYTES( 104 ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe32_section_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE32_SectionRec + + FT_FRAME_START( 40 ), + FT_FRAME_BYTES ( name, 8 ), + FT_FRAME_SKIP_BYTES( 4 ), + FT_FRAME_ULONG_LE ( virtual_address ), + FT_FRAME_ULONG_LE ( size_of_raw_data ), + FT_FRAME_ULONG_LE ( pointer_to_raw_data ), + FT_FRAME_SKIP_BYTES( 16 ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_dir_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDirRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE ( characteristics ), + FT_FRAME_ULONG_LE ( time_date_stamp ), + FT_FRAME_USHORT_LE( major_version ), + FT_FRAME_USHORT_LE( minor_version ), + FT_FRAME_USHORT_LE( number_of_named_entries ), + FT_FRAME_USHORT_LE( number_of_id_entries ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDirEntryRec + + FT_FRAME_START( 8 ), + FT_FRAME_ULONG_LE( name ), + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_data_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDataEntryRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( offset_to_data ), + FT_FRAME_ULONG_LE( size ), + FT_FRAME_ULONG_LE( code_page ), + FT_FRAME_ULONG_LE( reserved ), + FT_FRAME_END + }; + + static const FT_Frame_Field winfnt_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_WinFNT_HeaderRec + + FT_FRAME_START( 148 ), + FT_FRAME_USHORT_LE( version ), + FT_FRAME_ULONG_LE ( file_size ), + FT_FRAME_BYTES ( copyright, 60 ), + FT_FRAME_USHORT_LE( file_type ), + FT_FRAME_USHORT_LE( nominal_point_size ), + FT_FRAME_USHORT_LE( vertical_resolution ), + FT_FRAME_USHORT_LE( horizontal_resolution ), + FT_FRAME_USHORT_LE( ascent ), + FT_FRAME_USHORT_LE( internal_leading ), + FT_FRAME_USHORT_LE( external_leading ), + FT_FRAME_BYTE ( italic ), + FT_FRAME_BYTE ( underline ), + FT_FRAME_BYTE ( strike_out ), + FT_FRAME_USHORT_LE( weight ), + FT_FRAME_BYTE ( charset ), + FT_FRAME_USHORT_LE( pixel_width ), + FT_FRAME_USHORT_LE( pixel_height ), + FT_FRAME_BYTE ( pitch_and_family ), + FT_FRAME_USHORT_LE( avg_width ), + FT_FRAME_USHORT_LE( max_width ), + FT_FRAME_BYTE ( first_char ), + FT_FRAME_BYTE ( last_char ), + FT_FRAME_BYTE ( default_char ), + FT_FRAME_BYTE ( break_char ), + FT_FRAME_USHORT_LE( bytes_per_row ), + FT_FRAME_ULONG_LE ( device_offset ), + FT_FRAME_ULONG_LE ( face_name_offset ), + FT_FRAME_ULONG_LE ( bits_pointer ), + FT_FRAME_ULONG_LE ( bits_offset ), + FT_FRAME_BYTE ( reserved ), + FT_FRAME_ULONG_LE ( flags ), + FT_FRAME_USHORT_LE( A_space ), + FT_FRAME_USHORT_LE( B_space ), + FT_FRAME_USHORT_LE( C_space ), + FT_FRAME_ULONG_LE ( color_table_offset ), + FT_FRAME_BYTES ( reserved1, 16 ), + FT_FRAME_END + }; + + + static void + fnt_font_done( FNT_Face face ) + { + FT_Memory memory = FT_FACE( face )->memory; + FT_Stream stream = FT_FACE( face )->stream; + FNT_Font font = face->font; + + + if ( !font ) + return; + + if ( font->fnt_frame ) + FT_FRAME_RELEASE( font->fnt_frame ); + FT_FREE( font->family_name ); + + FT_FREE( font ); + face->font = NULL; + } + + + static FT_Error + fnt_font_load( FNT_Font font, + FT_Stream stream ) + { + FT_Error error; + FT_WinFNT_Header header = &font->header; + FT_Bool new_format; + FT_UInt size; + + + /* first of all, read the FNT header */ + if ( FT_STREAM_SEEK( font->offset ) || + FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) ) + { + FT_TRACE2(( " not a Windows FNT file\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* check header */ + if ( header->version != 0x200 && + header->version != 0x300 ) + { + FT_TRACE2(( " not a Windows FNT file\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + new_format = FT_BOOL( font->header.version == 0x300 ); + size = new_format ? 148 : 118; + + if ( header->file_size < size ) + { + FT_TRACE2(( " not a Windows FNT file\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* Version 2 doesn't have these fields */ + if ( header->version == 0x200 ) + { + header->flags = 0; + header->A_space = 0; + header->B_space = 0; + header->C_space = 0; + + header->color_table_offset = 0; + } + + if ( header->file_type & 1 ) + { + FT_TRACE2(( "[can't handle vector FNT fonts]\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* this is a FNT file/table; extract its frame */ + if ( FT_STREAM_SEEK( font->offset ) || + FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + fnt_face_get_dll_font( FNT_Face face, + FT_Int face_instance_index ) + { + FT_Error error; + FT_Stream stream = FT_FACE( face )->stream; + FT_Memory memory = FT_FACE( face )->memory; + WinMZ_HeaderRec mz_header; + FT_Long face_index; + + + face->font = NULL; + + face_index = FT_ABS( face_instance_index ) & 0xFFFF; + + /* does it begin with an MZ header? */ + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) ) + { + error = FT_ERR( Unknown_File_Format ); + goto Exit; + } + + error = FT_ERR( Unknown_File_Format ); + if ( mz_header.magic == WINFNT_MZ_MAGIC ) + { + /* yes, now look for an NE header in the file */ + WinNE_HeaderRec ne_header; + + + FT_TRACE2(( "MZ signature found\n" )); + + if ( FT_STREAM_SEEK( mz_header.lfanew ) || + FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) ) + goto Exit; + + error = FT_ERR( Unknown_File_Format ); + if ( ne_header.magic == WINFNT_NE_MAGIC ) + { + /* good, now look into the resource table for each FNT resource */ + FT_ULong res_offset = mz_header.lfanew + + ne_header.resource_tab_offset; + FT_UShort size_shift; + FT_UShort font_count = 0; + FT_ULong font_offset = 0; + + + FT_TRACE2(( "NE signature found\n" )); + + if ( FT_STREAM_SEEK( res_offset ) || + FT_FRAME_ENTER( ne_header.rname_tab_offset - + ne_header.resource_tab_offset ) ) + goto Exit; + + size_shift = FT_GET_USHORT_LE(); + + /* Microsoft's specification of the executable-file header format */ + /* for `New Executable' (NE) doesn't give a limit for the */ + /* alignment shift count; however, in 1985, the year of the */ + /* specification release, only 32bit values were supported, thus */ + /* anything larger than 16 doesn't make sense in general, given */ + /* that file offsets are 16bit values, shifted by the alignment */ + /* shift count */ + if ( size_shift > 16 ) + { + FT_TRACE2(( "invalid alignment shift count for resource data\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit1; + } + + + for (;;) + { + FT_UShort type_id, count; + + + type_id = FT_GET_USHORT_LE(); + if ( !type_id ) + break; + + count = FT_GET_USHORT_LE(); + + FT_TRACE2(( type_id == 0x8007U ? "RT_FONTDIR count %hu\n" : + type_id == 0x8008U ? "RT_FONT count %hu\n" : "", + count )); + + if ( type_id == 0x8008U ) + { + font_count = count; + font_offset = FT_STREAM_POS() + 4 + + (FT_ULong)( stream->cursor - stream->limit ); + break; + } + + stream->cursor += 4 + count * 12; + } + + FT_FRAME_EXIT(); + + if ( !font_count || !font_offset ) + { + FT_TRACE2(( "this file doesn't contain any FNT resources\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* loading `winfnt_header_fields' needs at least 118 bytes; */ + /* use this as a rough measure to check the expected font size */ + if ( font_count * 118UL > stream->size ) + { + FT_TRACE2(( "invalid number of faces\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + face->root.num_faces = font_count; + + if ( face_instance_index < 0 ) + goto Exit; + + if ( face_index >= font_count ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( FT_NEW( face->font ) ) + goto Exit; + + if ( FT_STREAM_SEEK( font_offset + (FT_ULong)face_index * 12 ) || + FT_FRAME_ENTER( 12 ) ) + goto Fail; + + face->font->offset = (FT_ULong)FT_GET_USHORT_LE() << size_shift; + face->font->fnt_size = (FT_ULong)FT_GET_USHORT_LE() << size_shift; + + stream->cursor += 8; + + FT_FRAME_EXIT(); + + error = fnt_font_load( face->font, stream ); + } + else if ( ne_header.magic == WINFNT_PE_MAGIC ) + { + WinPE32_HeaderRec pe32_header; + WinPE32_SectionRec pe32_section; + WinPE_RsrcDirRec root_dir, name_dir, lang_dir; + WinPE_RsrcDirEntryRec dir_entry1, dir_entry2, dir_entry3; + WinPE_RsrcDataEntryRec data_entry; + + FT_ULong root_dir_offset, name_dir_offset, lang_dir_offset; + FT_UShort i, j, k; + + + FT_TRACE2(( "PE signature found\n" )); + + if ( FT_STREAM_SEEK( mz_header.lfanew ) || + FT_STREAM_READ_FIELDS( winpe32_header_fields, &pe32_header ) ) + goto Exit; + + FT_TRACE2(( "magic %04lx, machine %02x, number_of_sections %u, " + "size_of_optional_header %02x\n", + pe32_header.magic, pe32_header.machine, + pe32_header.number_of_sections, + pe32_header.size_of_optional_header )); + FT_TRACE2(( "magic32 %02x, rsrc_virtual_address %04lx, " + "rsrc_size %04lx\n", + pe32_header.magic32, pe32_header.rsrc_virtual_address, + pe32_header.rsrc_size )); + + if ( pe32_header.magic != WINFNT_PE_MAGIC /* check full signature */ || + pe32_header.machine != 0x014C /* i386 */ || + pe32_header.size_of_optional_header != 0xE0 /* FIXME */ || + pe32_header.magic32 != 0x10B ) + { + FT_TRACE2(( "this file has an invalid PE header\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + face->root.num_faces = 0; + + for ( i = 0; i < pe32_header.number_of_sections; i++ ) + { + if ( FT_STREAM_READ_FIELDS( winpe32_section_fields, + &pe32_section ) ) + goto Exit; + + FT_TRACE2(( "name %.8s, va %04lx, size %04lx, offset %04lx\n", + pe32_section.name, pe32_section.virtual_address, + pe32_section.size_of_raw_data, + pe32_section.pointer_to_raw_data )); + + if ( pe32_header.rsrc_virtual_address == + pe32_section.virtual_address ) + goto Found_rsrc_section; + } + + FT_TRACE2(( "this file doesn't contain any resources\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + + Found_rsrc_section: + FT_TRACE2(( "found resources section %.8s\n", pe32_section.name )); + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &root_dir ) ) + goto Exit; + + root_dir_offset = pe32_section.pointer_to_raw_data; + + for ( i = 0; i < root_dir.number_of_named_entries + + root_dir.number_of_id_entries; i++ ) + { + if ( FT_STREAM_SEEK( root_dir_offset + 16 + i * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry1 ) ) + goto Exit; + + if ( !( dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + dir_entry1.offset &= ~0x80000000UL; + + name_dir_offset = pe32_section.pointer_to_raw_data + + dir_entry1.offset; + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + + dir_entry1.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &name_dir ) ) + goto Exit; + + for ( j = 0; j < name_dir.number_of_named_entries + + name_dir.number_of_id_entries; j++ ) + { + if ( FT_STREAM_SEEK( name_dir_offset + 16 + j * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry2 ) ) + goto Exit; + + if ( !( dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + dir_entry2.offset &= ~0x80000000UL; + + lang_dir_offset = pe32_section.pointer_to_raw_data + + dir_entry2.offset; + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + + dir_entry2.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &lang_dir ) ) + goto Exit; + + for ( k = 0; k < lang_dir.number_of_named_entries + + lang_dir.number_of_id_entries; k++ ) + { + if ( FT_STREAM_SEEK( lang_dir_offset + 16 + k * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry3 ) ) + goto Exit; + + if ( dir_entry2.offset & 0x80000000UL /* DataIsDirectory */ ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( dir_entry1.name == 8 /* RT_FONT */ ) + { + if ( FT_STREAM_SEEK( root_dir_offset + dir_entry3.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_data_entry_fields, + &data_entry ) ) + goto Exit; + + FT_TRACE2(( "found font #%lu, offset %04lx, " + "size %04lx, cp %lu\n", + dir_entry2.name, + pe32_section.pointer_to_raw_data + + data_entry.offset_to_data - + pe32_section.virtual_address, + data_entry.size, data_entry.code_page )); + + if ( face_index == face->root.num_faces ) + { + if ( FT_NEW( face->font ) ) + goto Exit; + + face->font->offset = pe32_section.pointer_to_raw_data + + data_entry.offset_to_data - + pe32_section.virtual_address; + face->font->fnt_size = data_entry.size; + + error = fnt_font_load( face->font, stream ); + if ( error ) + { + FT_TRACE2(( "font #%lu load error 0x%x\n", + dir_entry2.name, error )); + goto Fail; + } + else + FT_TRACE2(( "font #%lu successfully loaded\n", + dir_entry2.name )); + } + + face->root.num_faces++; + } + } + } + } + } + + if ( !face->root.num_faces ) + { + FT_TRACE2(( "this file doesn't contain any RT_FONT resources\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( face_index >= face->root.num_faces ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + Fail: + if ( error ) + fnt_font_done( face ); + + Exit: + return error; + + Exit1: + FT_FRAME_EXIT(); + goto Exit; + } + + + typedef struct FNT_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt32 first; + FT_UInt32 count; + + } FNT_CMapRec, *FNT_CMap; + + + static FT_Error + fnt_cmap_init( FT_CMap cmap, /* FNT_CMap */ + FT_Pointer pointer ) + { + FNT_CMap fntcmap = (FNT_CMap)cmap; + FNT_Face face = (FNT_Face)FT_CMAP_FACE( cmap ); + FNT_Font font = face->font; + + FT_UNUSED( pointer ); + + + fntcmap->first = (FT_UInt32)font->header.first_char; + fntcmap->count = (FT_UInt32)( font->header.last_char - + fntcmap->first + 1 ); + + return 0; + } + + + static FT_UInt + fnt_cmap_char_index( FT_CMap cmap, /* FNT_CMap */ + FT_UInt32 char_code ) + { + FNT_CMap fntcmap = (FNT_CMap)cmap; + FT_UInt gindex = 0; + + + char_code -= fntcmap->first; + if ( char_code < fntcmap->count ) + /* we artificially increase the glyph index; */ + /* FNT_Load_Glyph reverts to the right one */ + gindex = (FT_UInt)( char_code + 1 ); + return gindex; + } + + + static FT_UInt + fnt_cmap_char_next( FT_CMap cmap, /* FNT_CMap */ + FT_UInt32 *pchar_code ) + { + FNT_CMap fntcmap = (FNT_CMap)cmap; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + if ( char_code <= fntcmap->first ) + { + result = fntcmap->first; + gindex = 1; + } + else + { + char_code -= fntcmap->first; + if ( char_code < fntcmap->count ) + { + result = fntcmap->first + char_code; + gindex = (FT_UInt)( char_code + 1 ); + } + } + + *pchar_code = result; + return gindex; + } + + + static const FT_CMap_ClassRec fnt_cmap_class_rec = + { + sizeof ( FNT_CMapRec ), + + (FT_CMap_InitFunc) fnt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)fnt_cmap_char_index, + (FT_CMap_CharNextFunc) fnt_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; + + + static void + FNT_Face_Done( FT_Face fntface ) /* FNT_Face */ + { + FNT_Face face = (FNT_Face)fntface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + fnt_font_done( face ); + + FT_FREE( fntface->available_sizes ); + fntface->num_fixed_sizes = 0; + } + + + static FT_Error + FNT_Face_Init( FT_Stream stream, + FT_Face fntface, /* FNT_Face */ + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ) + { + FNT_Face face = (FNT_Face)fntface; + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Int face_index; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + FT_TRACE2(( "Windows FNT driver\n" )); + + face_index = FT_ABS( face_instance_index ) & 0xFFFF; + + /* try to load font from a DLL */ + error = fnt_face_get_dll_font( face, face_instance_index ); + if ( !error && face_instance_index < 0 ) + goto Exit; + + if ( FT_ERR_EQ( error, Unknown_File_Format ) ) + { + /* this didn't work; try to load a single FNT font */ + FNT_Font font; + + if ( FT_NEW( face->font ) ) + goto Exit; + + fntface->num_faces = 1; + + font = face->font; + font->offset = 0; + font->fnt_size = stream->size; + + error = fnt_font_load( font, stream ); + + if ( !error ) + { + if ( face_instance_index < 0 ) + goto Exit; + + if ( face_index > 0 ) + error = FT_THROW( Invalid_Argument ); + } + } + + if ( error ) + goto Fail; + + /* sanity check */ + if ( !face->font->header.pixel_height ) + { + FT_TRACE2(( "invalid pixel height\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* we now need to fill the root FT_Face fields */ + /* with relevant information */ + { + FT_Face root = FT_FACE( face ); + FNT_Font font = face->font; + FT_ULong family_size; + + + root->face_index = face_index; + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; + + if ( font->header.avg_width == font->header.max_width ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( font->header.italic ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( font->header.weight >= 800 ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + /* set up the `fixed_sizes' array */ + if ( FT_QNEW( root->available_sizes ) ) + goto Fail; + + root->num_fixed_sizes = 1; + + { + FT_Bitmap_Size* bsize = root->available_sizes; + FT_UShort x_res, y_res; + + + bsize->width = (FT_Short)font->header.avg_width; + bsize->height = (FT_Short)( font->header.pixel_height + + font->header.external_leading ); + bsize->size = font->header.nominal_point_size << 6; + + x_res = font->header.horizontal_resolution; + if ( !x_res ) + x_res = 72; + + y_res = font->header.vertical_resolution; + if ( !y_res ) + y_res = 72; + + bsize->y_ppem = FT_MulDiv( bsize->size, y_res, 72 ); + bsize->y_ppem = FT_PIX_ROUND( bsize->y_ppem ); + + /* + * this reads: + * + * the nominal height is larger than the bbox's height + * + * => nominal_point_size contains incorrect value; + * use pixel_height as the nominal height + */ + if ( bsize->y_ppem > ( font->header.pixel_height << 6 ) ) + { + FT_TRACE2(( "use pixel_height as the nominal height\n" )); + + bsize->y_ppem = font->header.pixel_height << 6; + bsize->size = FT_MulDiv( bsize->y_ppem, 72, y_res ); + } + + bsize->x_ppem = FT_MulDiv( bsize->size, x_res, 72 ); + bsize->x_ppem = FT_PIX_ROUND( bsize->x_ppem ); + } + + { + FT_CharMapRec charmap; + + + charmap.encoding = FT_ENCODING_NONE; + /* initial platform/encoding should indicate unset status? */ + charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; + charmap.encoding_id = TT_APPLE_ID_DEFAULT; + charmap.face = root; + + if ( font->header.charset == FT_WinFNT_ID_MAC ) + { + charmap.encoding = FT_ENCODING_APPLE_ROMAN; + charmap.platform_id = TT_PLATFORM_MACINTOSH; +/* charmap.encoding_id = TT_MAC_ID_ROMAN; */ + } + + error = FT_CMap_New( fnt_cmap_class, + NULL, + &charmap, + NULL ); + if ( error ) + goto Fail; + } + + /* set up remaining flags */ + + if ( font->header.last_char < font->header.first_char ) + { + FT_TRACE2(( "invalid number of glyphs\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + /* reserve one slot for the .notdef glyph at index 0 */ + root->num_glyphs = font->header.last_char - + font->header.first_char + 1 + 1; + + if ( font->header.face_name_offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid family name offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + family_size = font->header.file_size - font->header.face_name_offset; + /* Some broken fonts don't delimit the face name with a final */ + /* null byte -- the frame is erroneously one byte too small. */ + /* We thus allocate one more byte, setting it explicitly to */ + /* zero. */ + if ( FT_QALLOC( font->family_name, family_size + 1 ) ) + goto Fail; + + FT_MEM_COPY( font->family_name, + font->fnt_frame + font->header.face_name_offset, + family_size ); + + font->family_name[family_size] = '\0'; + + /* shrink it to the actual length */ + if ( FT_QREALLOC( font->family_name, + family_size + 1, + ft_strlen( font->family_name ) + 1 ) ) + goto Fail; + + root->family_name = font->family_name; + root->style_name = (char *)"Regular"; + + if ( root->style_flags & FT_STYLE_FLAG_BOLD ) + { + if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Bold Italic"; + else + root->style_name = (char *)"Bold"; + } + else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Italic"; + } + goto Exit; + + Fail: + FNT_Face_Done( fntface ); + + Exit: + return error; + } + + + static FT_Error + FNT_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + FNT_Face face = (FNT_Face)size->face; + FT_WinFNT_Header header = &face->font->header; + + FT_UNUSED( strike_index ); + + + FT_Select_Metrics( size->face, 0 ); + + size->metrics.ascender = header->ascent * 64; + size->metrics.descender = -( header->pixel_height - + header->ascent ) * 64; + size->metrics.max_advance = header->max_width * 64; + + return FT_Err_Ok; + } + + + static FT_Error + FNT_Size_Request( FT_Size size, + FT_Size_Request req ) + { + FNT_Face face = (FNT_Face)size->face; + FT_WinFNT_Header header = &face->font->header; + FT_Bitmap_Size* bsize = size->face->available_sizes; + FT_Error error = FT_ERR( Invalid_Pixel_Size ); + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = FT_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == header->pixel_height ) + error = FT_Err_Ok; + break; + + default: + error = FT_THROW( Unimplemented_Feature ); + break; + } + + if ( error ) + return error; + else + return FNT_Size_Select( size, 0 ); + } + + + static FT_Error + FNT_Load_Glyph( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FNT_Face face = (FNT_Face)FT_SIZE_FACE( size ); + FNT_Font font; + FT_Error error = FT_Err_Ok; + FT_Byte* p; + FT_UInt len; + FT_Bitmap* bitmap = &slot->bitmap; + FT_ULong offset; + FT_Bool new_format; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + font = face->font; + + if ( !font || + glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_TRACE1(( "FNT_Load_Glyph: glyph index %d\n", glyph_index )); + + if ( glyph_index > 0 ) + glyph_index--; /* revert to real index */ + else + glyph_index = font->header.default_char; /* the `.notdef' glyph */ + + new_format = FT_BOOL( font->header.version == 0x300 ); + len = new_format ? 6 : 4; + + /* get glyph width and offset */ + offset = ( new_format ? 148 : 118 ) + len * glyph_index; + + if ( offset >= font->header.file_size - 2 - ( new_format ? 4 : 2 ) ) + { + FT_TRACE2(( "invalid FNT offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + p = font->fnt_frame + offset; + + bitmap->width = FT_NEXT_USHORT_LE( p ); + + /* jump to glyph entry */ + if ( new_format ) + offset = FT_NEXT_ULONG_LE( p ); + else + offset = FT_NEXT_USHORT_LE( p ); + + if ( offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid FNT offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + bitmap->rows = font->header.pixel_height; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + slot->bitmap_left = 0; + slot->bitmap_top = font->header.ascent; + slot->format = FT_GLYPH_FORMAT_BITMAP; + + /* now set up metrics */ + slot->metrics.width = (FT_Pos)( bitmap->width << 6 ); + slot->metrics.height = (FT_Pos)( bitmap->rows << 6 ); + slot->metrics.horiAdvance = (FT_Pos)( bitmap->width << 6 ); + slot->metrics.horiBearingX = 0; + slot->metrics.horiBearingY = slot->bitmap_top << 6; + + ft_synthesize_vertical_metrics( &slot->metrics, + (FT_Pos)( bitmap->rows << 6 ) ); + + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + goto Exit; + + /* jump to glyph data */ + p = font->fnt_frame + /* font->header.bits_offset */ + offset; + + /* allocate and build bitmap */ + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_UInt pitch = ( bitmap->width + 7 ) >> 3; + FT_Byte* column; + FT_Byte* write; + + + bitmap->pitch = (int)pitch; + if ( !pitch || + offset + pitch * bitmap->rows > font->header.file_size ) + { + FT_TRACE2(( "invalid bitmap width\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* note: since glyphs are stored in columns and not in rows we */ + /* can't use ft_glyphslot_set_bitmap */ + if ( FT_QALLOC_MULT( bitmap->buffer, bitmap->rows, pitch ) ) + goto Exit; + + column = (FT_Byte*)bitmap->buffer; + + for ( ; pitch > 0; pitch--, column++ ) + { + FT_Byte* limit = p + bitmap->rows; + + + for ( write = column; p < limit; p++, write += bitmap->pitch ) + *write = *p; + } + + slot->internal->flags = FT_GLYPH_OWN_BITMAP; + } + + Exit: + return error; + } + + + static FT_Error + winfnt_get_header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ) + { + FNT_Font font = ((FNT_Face)face)->font; + + + *aheader = font->header; + + return 0; + } + + + static const FT_Service_WinFntRec winfnt_service_rec = + { + winfnt_get_header /* get_header */ + }; + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec winfnt_services[] = + { + { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_WINFNT }, + { FT_SERVICE_ID_WINFNT, &winfnt_service_rec }, + { NULL, NULL } + }; + + + static FT_Module_Interface + winfnt_get_service( FT_Module module, + const FT_String* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( winfnt_services, service_id ); + } + + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec winfnt_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "winfonts", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + winfnt_get_service /* FT_Module_Requester get_interface */ + }, + + sizeof ( FNT_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + FNT_Face_Init, /* FT_Face_InitFunc init_face */ + FNT_Face_Done, /* FT_Face_DoneFunc done_face */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ + + FNT_Load_Glyph, /* FT_Slot_LoadFunc load_glyph */ + + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ + + FNT_Size_Request, /* FT_Size_RequestFunc request_size */ + FNT_Size_Select /* FT_Size_SelectFunc select_size */ + }; + + +/* END */ diff --git a/external/freetype/src/winfonts/winfnt.h b/external/freetype/src/winfonts/winfnt.h new file mode 100644 index 000000000..2f75b9e86 --- /dev/null +++ b/external/freetype/src/winfonts/winfnt.h @@ -0,0 +1,164 @@ +/**************************************************************************** + * + * winfnt.h + * + * FreeType font driver for Windows FNT/FON files + * + * Copyright (C) 1996-2023 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * Copyright 2007 Dmitry Timoshkov for Codeweavers + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + + +#ifndef WINFNT_H_ +#define WINFNT_H_ + + +#include <freetype/ftwinfnt.h> +#include <freetype/internal/ftdrv.h> + + +FT_BEGIN_HEADER + + + typedef struct WinMZ_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort lfanew; + + } WinMZ_HeaderRec; + + + typedef struct WinNE_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort resource_tab_offset; + FT_UShort rname_tab_offset; + + } WinNE_HeaderRec; + + + typedef struct WinPE32_HeaderRec_ + { + FT_ULong magic; + FT_UShort machine; + FT_UShort number_of_sections; + /* skipped content */ + FT_UShort size_of_optional_header; + /* skipped content */ + FT_UShort magic32; + /* skipped content */ + FT_ULong rsrc_virtual_address; + FT_ULong rsrc_size; + /* skipped content */ + + } WinPE32_HeaderRec; + + + typedef struct WinPE32_SectionRec_ + { + FT_Byte name[8]; + /* skipped content */ + FT_ULong virtual_address; + FT_ULong size_of_raw_data; + FT_ULong pointer_to_raw_data; + /* skipped content */ + + } WinPE32_SectionRec; + + + typedef struct WinPE_RsrcDirRec_ + { + FT_ULong characteristics; + FT_ULong time_date_stamp; + FT_UShort major_version; + FT_UShort minor_version; + FT_UShort number_of_named_entries; + FT_UShort number_of_id_entries; + + } WinPE_RsrcDirRec; + + + typedef struct WinPE_RsrcDirEntryRec_ + { + FT_ULong name; + FT_ULong offset; + + } WinPE_RsrcDirEntryRec; + + + typedef struct WinPE_RsrcDataEntryRec_ + { + FT_ULong offset_to_data; + FT_ULong size; + FT_ULong code_page; + FT_ULong reserved; + + } WinPE_RsrcDataEntryRec; + + + typedef struct WinNameInfoRec_ + { + FT_UShort offset; + FT_UShort length; + FT_UShort flags; + FT_UShort id; + FT_UShort handle; + FT_UShort usage; + + } WinNameInfoRec; + + + typedef struct WinResourceInfoRec_ + { + FT_UShort type_id; + FT_UShort count; + + } WinResourceInfoRec; + + +#define WINFNT_MZ_MAGIC 0x5A4D +#define WINFNT_NE_MAGIC 0x454E +#define WINFNT_PE_MAGIC 0x4550 + + + typedef struct FNT_FontRec_ + { + FT_ULong offset; + + FT_WinFNT_HeaderRec header; + + FT_Byte* fnt_frame; + FT_ULong fnt_size; + FT_String* family_name; + + } FNT_FontRec, *FNT_Font; + + + typedef struct FNT_FaceRec_ + { + FT_FaceRec root; + FNT_Font font; + + } FNT_FaceRec, *FNT_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) winfnt_driver_class; + + +FT_END_HEADER + + +#endif /* WINFNT_H_ */ + + +/* END */ From 8d9a5710a765b26bfa20f7cd8d9db3126756ab04 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 19:54:35 +0100 Subject: [PATCH 15/38] Reference freetype --- trview.sln | 11 +++++++++++ trview/trview.vcxproj | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/trview.sln b/trview.sln index c544d5696..cff409ff2 100644 --- a/trview.sln +++ b/trview.sln @@ -128,6 +128,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "trview.app.ui.tests", "trvi EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "imgui_test_engine", "external\imgui_test_engine\imgui_test_engine.vcxproj", "{E6FAC6EF-4B54-45C4-9E76-3B063B51D4B9}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "external\freetype\builds\windows\vc2010\freetype.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -326,6 +328,14 @@ Global {E6FAC6EF-4B54-45C4-9E76-3B063B51D4B9}.Release|x64.Build.0 = Release|x64 {E6FAC6EF-4B54-45C4-9E76-3B063B51D4B9}.Release|x86.ActiveCfg = Release|Win32 {E6FAC6EF-4B54-45C4-9E76-3B063B51D4B9}.Release|x86.Build.0 = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x86.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x86.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x86.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -343,6 +353,7 @@ Global {A11566D3-4081-42C9-94C5-F4057EDD9D50} = {14424861-057E-431A-97B1-0F482C6DD4E0} {D6B95B54-7EBF-4D18-AE50-F82BD0B7CA62} = {B3A7F8A1-CC61-4082-BFF5-A072AF85754C} {E6FAC6EF-4B54-45C4-9E76-3B063B51D4B9} = {14424861-057E-431A-97B1-0F482C6DD4E0} + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} = {14424861-057E-431A-97B1-0F482C6DD4E0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E1BD837F-81FB-40A7-879E-E411807799F4} diff --git a/trview/trview.vcxproj b/trview/trview.vcxproj index 2e14624ff..ae19e7ec0 100644 --- a/trview/trview.vcxproj +++ b/trview/trview.vcxproj @@ -89,7 +89,7 @@ <Optimization>Disabled</Optimization> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <LanguageStandard>stdcpplatest</LanguageStandard> <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> @@ -100,7 +100,7 @@ <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -113,7 +113,7 @@ <Optimization>Disabled</Optimization> <PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <LanguageStandard>stdcpplatest</LanguageStandard> <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> @@ -124,7 +124,7 @@ <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -139,7 +139,7 @@ <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <LanguageStandard>stdcpplatest</LanguageStandard> <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -152,7 +152,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -167,7 +167,7 @@ <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <SDLCheck>true</SDLCheck> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir)vcpkg_installed\x64-windows\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <LanguageStandard>stdcpplatest</LanguageStandard> <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -180,7 +180,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(ProjectDir)vcpkg_installed\x64-windows\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -211,6 +211,9 @@ <ProjectReference Include="..\external\DirectXTK\DirectXTK_Desktop.vcxproj"> <Project>{a11566d3-4081-42c9-94c5-f4057edd9d50}</Project> </ProjectReference> + <ProjectReference Include="..\external\freetype\builds\windows\vc2010\freetype.vcxproj"> + <Project>{78b079bd-9fc7-4b9e-b4a6-96da0f00248b}</Project> + </ProjectReference> <ProjectReference Include="..\trlevel\trlevel.vcxproj"> <Project>{8ffb19fa-1c9d-4d9c-ab96-844bf695e79c}</Project> </ProjectReference> From dcff7d17f15c62ab6abb3a07ccdc95ac1afc29d3 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 22:36:05 +0100 Subject: [PATCH 16/38] Load user fonts too #970 --- trview.app/Application.cpp | 15 ++++++++-- trview.app/ApplicationCreate.cpp | 2 +- trview.app/UI/SettingsWindow.cpp | 47 ++++++++++++++------------------ trview.app/UI/SettingsWindow.h | 4 +-- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index 2aee3de8c..1043efa3d 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -674,7 +674,10 @@ namespace trview // Setup Dear ImGui style ImGui::StyleColorsDark(); - _font = io.Fonts->AddFontFromFileTTF(std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename).c_str(), _settings.font.size); + const std::string font_path = _settings.font.filename.contains('\\') ? + _settings.font.filename : + std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename); + _font = io.Fonts->AddFontFromFileTTF(font_path.c_str(), _settings.font.size); _console_manager->initialise_ui(); @@ -696,7 +699,10 @@ namespace trview if (_new_font.has_value()) { ImGuiIO& io = ImGui::GetIO(); - auto new_font = io.Fonts->AddFontFromFileTTF((std::format("{}\\{}", _files->fonts_directory(), _new_font.value().filename)).c_str(), _new_font.value().size); + const std::string font_path = _new_font->filename.contains('\\') ? + _new_font->filename : + std::format("{}\\{}", _files->fonts_directory(), _new_font->filename); + auto new_font = io.Fonts->AddFontFromFileTTF(font_path.c_str(), _new_font.value().size); _imgui_backend->rebuild_fonts(); bool revert = true; @@ -715,7 +721,10 @@ namespace trview if (revert) { io.Fonts->Clear(); - _font = io.Fonts->AddFontFromFileTTF((std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename)).c_str(), _settings.font.size); + const std::string old_font_path = _settings.font.filename.contains('\\') ? + _settings.font.filename : + std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename); + _font = io.Fonts->AddFontFromFileTTF(old_font_path.c_str(), _settings.font.size); } else { diff --git a/trview.app/ApplicationCreate.cpp b/trview.app/ApplicationCreate.cpp index 961eb9e56..b31d5e95d 100644 --- a/trview.app/ApplicationCreate.cpp +++ b/trview.app/ApplicationCreate.cpp @@ -282,7 +282,7 @@ namespace trview texture_storage, shortcuts, map_renderer_source, - std::make_unique<SettingsWindow>(dialogs, shell, files), + std::make_unique<SettingsWindow>(dialogs, shell), std::make_unique<ViewOptions>(), std::make_unique<ContextMenu>(), std::make_unique<CameraControls>(), diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index 9ff53e162..746e10fbb 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -1,24 +1,20 @@ #include "SettingsWindow.h" -// #include <external/imgui/imstb_truetype.h> -#include <trview.common/IFiles.h> -#include <format> namespace trview { namespace { - std::vector<FontSetting> get_ye_fonts(IFiles&) + std::vector<FontSetting> load_for_key(HKEY key_search) { std::vector<FontSetting> available_fonts; - HKEY key = nullptr; - if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_READ, &key)) + if (ERROR_SUCCESS == RegOpenKeyEx(key_search, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_READ, &key)) { DWORD value_count = 0; DWORD max_value_length = 0; std::vector<wchar_t> value(16383, 0); - LRESULT result = RegQueryInfoKey(key, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, &value_count, &max_value_length, nullptr, nullptr, nullptr); + LRESULT result = RegQueryInfoKey(key, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, &value_count, &max_value_length, nullptr, nullptr, nullptr); for (uint32_t i = 0; i < value_count; ++i) { DWORD value_length = 16383; @@ -33,31 +29,28 @@ namespace trview result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, &data_value[0], &data_length); wchar_t* value_string = reinterpret_cast<wchar_t*>(&data_value[0]); - if (value_string && + if (value_string && std::wstring(value_string).ends_with(L".ttf") && std::wstring(&value[0]).ends_with(L" (TrueType)")) { - //if (auto file = files.load_file(std::format(L"{}\\{}", to_utf16(files.fonts_directory()), value_string))) - //{ - // stbtt_fontinfo info{}; - // if (stbtt_InitFont(&info, &file.value()[0], 0)) - // { - // if (info.numGlyphs > 0) - // { - const auto name = to_utf8(&value[0]); - available_fonts.push_back( - { - .name = name.substr(0, name.length() - 11), - .filename = to_utf8(value_string) - }); - // } - // } - // } + const auto name = to_utf8(&value[0]); + available_fonts.push_back( + { + .name = name.substr(0, name.length() - 11), + .filename = to_utf8(value_string) + }); } } } RegCloseKey(key); + return available_fonts; + } + + std::vector<FontSetting> get_ye_fonts() + { + std::vector<FontSetting> available_fonts = load_for_key(HKEY_LOCAL_MACHINE); + available_fonts.append_range(load_for_key(HKEY_CURRENT_USER)); std::ranges::sort(available_fonts, [](auto&& l, auto&& r) { return l.name < r.name; }); return available_fonts; } @@ -67,8 +60,8 @@ namespace trview { } - SettingsWindow::SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell, const std::shared_ptr<IFiles>& files) - : _dialogs(dialogs), _shell(shell), _files(files) + SettingsWindow::SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell) + : _dialogs(dialogs), _shell(shell) { } @@ -335,7 +328,7 @@ namespace trview _visible = !_visible; if (_visible) { - _fonts = get_ye_fonts(*_files); + _fonts = get_ye_fonts(); } } diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index dc3132a96..0fd27f2f8 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -7,7 +7,6 @@ #include <trview.common/Windows/IShell.h> #include <trview.common/Windows/IDialogs.h> -#include <trview.common/IFiles.h> namespace trview { @@ -41,7 +40,7 @@ namespace trview static inline const std::string reset_fov = "Reset##Fov"; }; - explicit SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell, const std::shared_ptr<IFiles>& files); + explicit SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell); virtual ~SettingsWindow() = default; virtual void render() override; virtual void set_vsync(bool value) override; @@ -98,6 +97,5 @@ namespace trview std::vector<std::string> _plugin_directories; FontSetting _selected_font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; std::vector<FontSetting> _fonts; - std::shared_ptr<IFiles> _files; }; } From 26a6ba95e94c1a5c54cf40ef4b535367002e4670 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 22:58:37 +0100 Subject: [PATCH 17/38] License --- README.md | 15 +- external/freetype/FTL.TXT | 169 ++++++++++++++++++ .../builds/windows/vc2010/freetype.vcxproj | 21 --- 3 files changed, 182 insertions(+), 23 deletions(-) create mode 100644 external/freetype/FTL.TXT diff --git a/README.md b/README.md index 4e84ed114..051396b20 100644 --- a/README.md +++ b/README.md @@ -936,7 +936,7 @@ https://github.com/ocornut/imgui The MIT License (MIT) -Copyright (c) 2014-2022 Omar Cornut +Copyright (c) 2014-2024 Omar Cornut Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -954,4 +954,15 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. + +## FreeType + +https://github.com/freetype/freetype + +[The FreeType Project LICENSE](external/freetype/FTL.txt) + + + +Portions of this software are copyright © 2023 The FreeType +Project (www.freetype.org). All rights reserved. \ No newline at end of file diff --git a/external/freetype/FTL.TXT b/external/freetype/FTL.TXT new file mode 100644 index 000000000..c406d150f --- /dev/null +++ b/external/freetype/FTL.TXT @@ -0,0 +1,169 @@ + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © <year> The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace <year> with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + + +--- end of FTL.TXT --- diff --git a/external/freetype/builds/windows/vc2010/freetype.vcxproj b/external/freetype/builds/windows/vc2010/freetype.vcxproj index cdbae5929..969e20110 100644 --- a/external/freetype/builds/windows/vc2010/freetype.vcxproj +++ b/external/freetype/builds/windows/vc2010/freetype.vcxproj @@ -221,25 +221,4 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> - <ItemGroup Condition="Exists('..\..\..\subprojects\dlg\.git')"> - <DlgSrc Include="..\..\..\subprojects\dlg\include\dlg\output.h"> - <DlgDst>..\..\..\include\dlg\output.h</DlgDst> - </DlgSrc> - <DlgSrc Include="..\..\..\subprojects\dlg\include\dlg\dlg.h"> - <DlgDst>..\..\..\include\dlg\dlg.h</DlgDst> - </DlgSrc> - <DlgSrc Include="..\..\..\subprojects\dlg\src\dlg\dlg.c"> - <DlgDst>..\..\..\src\dlg\dlg.c</DlgDst> - </DlgSrc> - </ItemGroup> - <Target Name="DlgCopy" Inputs="@(DlgSrc)" Outputs="@(DlgSrc->'%(DlgDst)')" Condition="Exists('..\..\..\subprojects\dlg\.git')"> - <Copy SourceFiles="@(DlgSrc)" DestinationFiles="@(DlgSrc->'%(DlgDst)')" /> - </Target> - <Target Name="AfterBuild"> - <ItemGroup> - <TargetFiles Include="$(TargetDir)$(TargetName).*" /> - </ItemGroup> - <Copy SourceFiles="@(TargetFiles)" DestinationFolder="..\..\..\objs" /> - <Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\..\..\..\freetype-demos\bin" Condition="'$(TargetExt)'=='.dll'" /> - </Target> </Project> From 363afe19c3cdcbb234a090e641f9ae3b795a6eaa Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 23:11:52 +0100 Subject: [PATCH 18/38] Get ui tests running with freetype --- trview.app.ui.tests/trview.app.ui.tests.vcxproj | 17 +++++++++++++---- .../trview.app.ui.tests.vcxproj.filters | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/trview.app.ui.tests/trview.app.ui.tests.vcxproj b/trview.app.ui.tests/trview.app.ui.tests.vcxproj index 9c07aca50..774b10e99 100644 --- a/trview.app.ui.tests/trview.app.ui.tests.vcxproj +++ b/trview.app.ui.tests/trview.app.ui.tests.vcxproj @@ -76,7 +76,7 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);IMGUI_USER_CONFIG="trview_imconfig.h"</PreprocessorDefinitions> <ConformanceMode>Default</ConformanceMode> - <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> <PrecompiledHeader>Use</PrecompiledHeader> @@ -97,7 +97,7 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);IMGUI_USER_CONFIG="trview_imconfig.h"</PreprocessorDefinitions> <ConformanceMode>Default</ConformanceMode> - <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> <PrecompiledHeader>Use</PrecompiledHeader> @@ -119,7 +119,7 @@ <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions);IMGUI_USER_CONFIG="trview_imconfig.h"</PreprocessorDefinitions> <ConformanceMode>Default</ConformanceMode> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> <PrecompiledHeader>Use</PrecompiledHeader> @@ -140,7 +140,7 @@ <SDLCheck>true</SDLCheck> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions);IMGUI_USER_CONFIG="trview_imconfig.h"</PreprocessorDefinitions> <ConformanceMode>Default</ConformanceMode> - <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir)external\shared;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui\backends;$(ProjectDir);$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\freetype\include</AdditionalIncludeDirectories> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <LanguageStandard>stdcpplatest</LanguageStandard> <PrecompiledHeader>Use</PrecompiledHeader> @@ -218,6 +218,12 @@ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> </ClCompile> + <ClCompile Include="..\external\imgui\misc\freetype\imgui_freetype.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> + </ClCompile> <ClCompile Include="..\external\shared\imgui_app.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> @@ -256,6 +262,9 @@ <ProjectReference Include="..\external\DirectXTK\DirectXTK_Desktop.vcxproj"> <Project>{a11566d3-4081-42c9-94c5-f4057edd9d50}</Project> </ProjectReference> + <ProjectReference Include="..\external\freetype\builds\windows\vc2010\freetype.vcxproj"> + <Project>{78b079bd-9fc7-4b9e-b4a6-96da0f00248b}</Project> + </ProjectReference> <ProjectReference Include="..\external\googlemock\googlemock.vcxproj"> <Project>{6e37091e-954c-4654-9b42-5980410791f4}</Project> </ProjectReference> diff --git a/trview.app.ui.tests/trview.app.ui.tests.vcxproj.filters b/trview.app.ui.tests/trview.app.ui.tests.vcxproj.filters index 85924f54c..7e96dfc65 100644 --- a/trview.app.ui.tests/trview.app.ui.tests.vcxproj.filters +++ b/trview.app.ui.tests/trview.app.ui.tests.vcxproj.filters @@ -108,6 +108,9 @@ <ClCompile Include="RouteWindowTests.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\external\imgui\misc\freetype\imgui_freetype.cpp"> + <Filter>imgui</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\external\shared\imgui_app.h"> From 99fb52290a8a3088258588686a2bb285bc77d84b Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 23:14:11 +0100 Subject: [PATCH 19/38] Output to bin instead of obj --- external/freetype/builds/windows/vc2010/freetype.vcxproj | 4 ++-- trview/trview.vcxproj | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/external/freetype/builds/windows/vc2010/freetype.vcxproj b/external/freetype/builds/windows/vc2010/freetype.vcxproj index 969e20110..088ef72ae 100644 --- a/external/freetype/builds/windows/vc2010/freetype.vcxproj +++ b/external/freetype/builds/windows/vc2010/freetype.vcxproj @@ -58,8 +58,8 @@ <ImportGroup Label="ExtensionSettings"> </ImportGroup> <PropertyGroup> - <OutDir>..\..\..\objs\$(Platform)\$(Configuration)\</OutDir> - <IntDir>..\..\..\objs\$(Platform)\$(Configuration)\</IntDir> + <OutDir>..\..\..\bin\$(Platform)\$(Configuration)\</OutDir> + <IntDir>..\..\..\bin\$(Platform)\$(Configuration)\</IntDir> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRules /> <CodeAnalysisRuleAssemblies /> diff --git a/trview/trview.vcxproj b/trview/trview.vcxproj index ae19e7ec0..197b7350f 100644 --- a/trview/trview.vcxproj +++ b/trview/trview.vcxproj @@ -100,7 +100,7 @@ <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -124,7 +124,7 @@ <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -152,7 +152,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> @@ -180,7 +180,7 @@ <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> <AdditionalDependencies>d3d11.lib;Shlwapi.lib;Crypt32.lib;winhttp.lib;version.lib;$(OutDir)trview.app.res;freetype.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\objs\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>$(SolutionDir)external\freetype\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir);</AdditionalIncludeDirectories> From 9436a37d37a784badc776457ce397baa70204f80 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 23:30:42 +0100 Subject: [PATCH 20/38] Fix other test project build --- trview.app.tests/trview.app.tests.vcxproj | 12 ++++++++---- trview.app.tests/trview.app.tests.vcxproj.filters | 3 +++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/trview.app.tests/trview.app.tests.vcxproj b/trview.app.tests/trview.app.tests.vcxproj index 6789e4fef..2f4459d9a 100644 --- a/trview.app.tests/trview.app.tests.vcxproj +++ b/trview.app.tests/trview.app.tests.vcxproj @@ -25,6 +25,7 @@ <ClCompile Include="..\external\imgui\imgui_tables.cpp" /> <ClCompile Include="..\external\imgui\imgui_widgets.cpp" /> <ClCompile Include="..\external\imgui\misc\cpp\imgui_stdlib.cpp" /> + <ClCompile Include="..\external\imgui\misc\freetype\imgui_freetype.cpp" /> <ClCompile Include="..\external\shared\imgui_app.cpp" /> <ClCompile Include="AlternateGroupTogglerTests.cpp" /> <ClCompile Include="ApplicationTests.cpp" /> @@ -99,6 +100,9 @@ <ProjectReference Include="..\external\DirectXTK\DirectXTK_Desktop.vcxproj"> <Project>{a11566d3-4081-42c9-94c5-f4057edd9d50}</Project> </ProjectReference> + <ProjectReference Include="..\external\freetype\builds\windows\vc2010\freetype.vcxproj"> + <Project>{78b079bd-9fc7-4b9e-b4a6-96da0f00248b}</Project> + </ProjectReference> <ProjectReference Include="..\external\googlemock\googlemock.vcxproj"> <Project>{6e37091e-954c-4654-9b42-5980410791f4}</Project> </ProjectReference> @@ -188,7 +192,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions);IMGUI_DEFINE_MATH_OPERATORS;IMGUI_APP_WIN32_DX11;</PreprocessorDefinitions> <UseFullPaths>true</UseFullPaths> <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> @@ -212,7 +216,7 @@ <PrecompiledHeader>Use</PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions);IMGUI_DEFINE_MATH_OPERATORS;IMGUI_APP_WIN32_DX11;</PreprocessorDefinitions> <UseFullPaths>true</UseFullPaths> <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> @@ -234,7 +238,7 @@ <PrecompiledHeader>Use</PrecompiledHeader> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions);IMGUI_DEFINE_MATH_OPERATORS;IMGUI_APP_WIN32_DX11</PreprocessorDefinitions> <UseFullPaths>true</UseFullPaths> <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> @@ -258,7 +262,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> - <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)external\DirectXTK\Inc;$(ProjectDir);$(SolutionDir)external\googletest\include;$(SolutionDir)external\googlemock\include;$(SolutionDir)external\imgui;$(SolutionDir)external\imgui_test_engine;$(SolutionDir)external\imgui\backends;$(SolutionDir)external\freetype\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions);IMGUI_DEFINE_MATH_OPERATORS;IMGUI_APP_WIN32_DX11</PreprocessorDefinitions> <UseFullPaths>true</UseFullPaths> <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> diff --git a/trview.app.tests/trview.app.tests.vcxproj.filters b/trview.app.tests/trview.app.tests.vcxproj.filters index 3fb23b871..9057b3eed 100644 --- a/trview.app.tests/trview.app.tests.vcxproj.filters +++ b/trview.app.tests/trview.app.tests.vcxproj.filters @@ -197,6 +197,9 @@ <ClCompile Include="..\external\shared\imgui_app.cpp"> <Filter>ImGui</Filter> </ClCompile> + <ClCompile Include="..\external\imgui\misc\freetype\imgui_freetype.cpp"> + <Filter>ImGui</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <Filter Include="Input"> From c49bd6518ddbfb0ee1ca4d986c87d2d821757411 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 23:31:09 +0100 Subject: [PATCH 21/38] Delete accidentally added files --- external/freetype/objs/freetype.dll | Bin 1891328 -> 0 bytes external/freetype/objs/freetype.dll.recipe | 11 ----------- external/freetype/objs/freetype.exp | Bin 29563 -> 0 bytes external/freetype/objs/freetype.lib | Bin 4194882 -> 0 bytes external/freetype/objs/freetype.lib.recipe | 7 ------- .../freetype.vcxproj.FileListAbsolute.txt | 1 - 6 files changed, 19 deletions(-) delete mode 100644 external/freetype/objs/freetype.dll delete mode 100644 external/freetype/objs/freetype.dll.recipe delete mode 100644 external/freetype/objs/freetype.exp delete mode 100644 external/freetype/objs/freetype.lib delete mode 100644 external/freetype/objs/freetype.lib.recipe delete mode 100644 external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt diff --git a/external/freetype/objs/freetype.dll b/external/freetype/objs/freetype.dll deleted file mode 100644 index 93509d657298afe7951d2720c5c45d83e0c3e0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1891328 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%0AZ2rmD6 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 C+udUT diff --git a/external/freetype/objs/freetype.dll.recipe b/external/freetype/objs/freetype.dll.recipe deleted file mode 100644 index f6892eb08..000000000 --- a/external/freetype/objs/freetype.dll.recipe +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project> - <ProjectOutputs> - <ProjectOutput> - <FullPath>C:\Projects\Applications\trview\external\freetype\objs\x64\Debug\freetype.dll</FullPath> - </ProjectOutput> - </ProjectOutputs> - <ContentFiles /> - <SatelliteDlls /> - <NonRecipeFileRefs /> -</Project> \ No newline at end of file diff --git a/external/freetype/objs/freetype.exp b/external/freetype/objs/freetype.exp deleted file mode 100644 index d12b63561184d5e0bc77255ad9ed070ec7a7db4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29563 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 diff --git a/external/freetype/objs/freetype.lib b/external/freetype/objs/freetype.lib deleted file mode 100644 index 146ed3267bbbb25e1979337f9f2762161a820e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4194882 zcmeFa2VfM%7eBs9fP_#3(%S(+nuL&qj*w0QY2*@`!Q*ndOO9L#cbAYLNbjOlL7Jc- zAkq;Fpdbn;MF9&<QBb6J6qNG+yxHBmy}L~UB;W7v`}_Ym*u2>{Z{ECl^QP?V&b-Fm z)D}%vci*-O=U=;y?Ls<*bn4I{#2Ftb+_vk`v12<H9_-6;p6_wo1VG{P@YHc7z7}oe zJk$GfUZ0G%U*(ou=UlH!rmI|~6Gxn`Dm&_PbXEOm)ni{ZHzaU$)jFG0=v60SI7e5# z+9#g+Qml;Q=xUOc#x>oW<97K+uH)!xHo897-21luYBjPy_q5jwp%*#v3aGJw3rLN2 zzLvM*0;JcqeOy2(T!Fo|a`x-ZV_YCzN4K-9UCnjeQ(s$ma_uBnP~`=j(>0(27xWlc zaG3*KaP&SdcuGUZ^+OjfxQHuc=64*sjyL4mzYzEAdZvSCHt+;C(ADxI_w0J6gJ(AI z%m)4oHV~bniZq+Fs(7u@Y$@Pyo1h&gxl`IKTD4J?n4>jOWW3gDRcC4`n4~u8H55>4 zZK_DEPMvG8sp8C;su;B?!=SZ@Q7)*IEQ@&<#idx(8m%f)Z&jxo7(*TrWpcjn3GNZ* zT$9a_hENG=qa=}&2--ZY!9h$>aSWwW8O$2BL1ndN=*_Aei{50@smwVxz1d{tRCzi9 zW8ic)RfaY_H&dlI>1}jpW1<>}i<J`zxjd_hPr?n;n{*~5vgq@)7L~@Jwpuw`NRTr^ zrGh36p&@~tbRmI`A7{tw97u#XTRZ3UDSXvLm`yfqzKz3ea;_<sL>C#icVR%q;HxFm zqRz?EYpf`{+NR}fF0!JC*1SxxF=c2i_7VV_uD2Q0IVx+0PGwPBZKzZiq+1GSQg-J? z18EAZ5{6cz*=);l&E85XHJUSW4O&s9HkAhA1oF3_*HB3a)lLo<BtsW0g9~xT$t0Db z>foNRlRHY4i*{np5DLMhh7x&owsS2s)r1Z0M{UWFC`g@QPS>h34Fx$_Dudq2Y|^OK zs7z=CR;m)KK0|UNGT;;NL^)OlT@>0*rOnULT5Kw<2_ouEnPhc#0qn>et11hv#i~;0 z<QNLL94p<yPMm5-FvDP-iyf<VMpcg5Vg<b}*QBv>8l6s+o~t*&)+Cq=Eh$OFAV+5s zAe@-s-bNjTz#+$~&dqn02PJW40R-6!UqjHF{XW-fGaIE9ClCs{VeOf>HX*{UA@?Zv z%0@OWWz(ULunWQ%=K$r@d*o<z&Isyf9bIwUz<yNihT+3lgH~mr3wJ_@J(rzAZ+42e zXsue-qxKxG&rzkK_Ki8fSy`v;$cJK~Ck@QYNj$1TRs_*RB-*pbxvPSrocKhiM5rR- z)j1JrO_mmehdDbp2O>z37>*bw)`)S(jm{0LL=Vr#o(PpBPGl0VHi3(U4S9^Kh~Tr1 z#)u??R_cd4qg~l0WAMz=QtH@9r}W8!nj=&R)B~iNELt5SP=@PmZiR70O3LDhqP%-x zJZ8g|(q^`xK%qU__2^O5@D>`{IkYpEj&9sZ{q_M2)<uJAKfNhBAw?CVRih<BPKHcU zs-iLGsA5ezvnwtMBOVPXE~I_chFpe>QCn3=-;?!RG-NXaW4B6!*`^B17=p&vPpi+& z;;oSgSxl5M-HaZBO*$O(iRlLYP@c5|sWhnh*#Vyonu$4^7l~!d--nwmLYWeCZ3aDN zJSZ?mPkn|~HVRbEaXcG~DqNeXHz{+|lhn2>Dz}KoxUAQtFb&yJx#_Mbnrlf@MVT^W zctz#sm@P~pA}b!_kW|E@5ImAik;LYU@>{5U?#MWl+*wH8mhHtzqMlk%kyOxREhae` zQVb?mbW3)V6rGH!%u}0K^Rc6PYb_=kQzTUJTAKy)5JFLNQAK2FHQ6baTy080jutA_ zVwAB*B8OB{4nt})Vld<g%xE%7^r~o!mTA+DfZ^#g1cT(KwehOHYP%_mvsALg3>Y-^ z;|`JI<5l4XOja=6gt6#N;KQ3MN{BcKAKdXa+gGbW3ls|&j~TFD70*wUghC^gDlA`b zRYe=rnRa%BEi^BRjMQ57nI>0BXf9irltNsQ30;MzH14_}Y@q^*k@ES3Wn|bN1>)J% zjTM<y1yvT+8fhyQ6Khs`B7)e8wUcBq)0{-lYd?Z!(|QfrlD)pAIBAuOhSamaom7I7 zQZk8He<4<$<A(Jb5#}8BG{pBQWaJUy=6puX;#15jbm17qB`Ay9WYw81Mna)k@!cK` zyTUX&lci*H2Ev+!j>rW~GjS<OFr=PpE1wrciB|IFFEy!%*hmx_^B7*@SWM-4aY=N< z#af|tOxjFpgQ0+7dTR@`tVOfZfg~ASo7HA1P$g1diN>Z<=3>I9HKJ8gnfL<phAX*8 z&xgkzDTSy!A%WQG3AfU&T|kjNNH_|85-SNC4HAc$r0PbI!Xu;6c~EDCk%<Of*6R>f zFdtTXlD=LQF4SL`#>NIMl`yQM=gLs=#!76$OqrNfM(TAmP^-ewLj>^w8|EmgXg&X| z8fIg+=!WrhOz|{}5vLXWjZlaPt=<r=XH^kl=39e4PeAbPf}eEokKy(r6HgW$r%$)2 z`6qLBFG?L{v6wB?Z3~?u>rSc9hf>gb^%xWFHXs*g6`C7mB#pNw>V)Ld7y+f!8d#6V z$|0r_;*gN?wx@D##?c0JszR~J-du(Y;nv<kGId6yEvfB;3`51KO_{lv@kr{NGKFbN z%^et;Upphs2Iz}#91#Y6j@X*1c}Sw-)CG>Ik2E4ljRA-X$65=eV6zC!z;f(TN9!$C zuoJXEgly*ITn=6Y>UKqLF5{%b7KsCY$G2UbU@C+s2F@i+z_Nf-=1wBB8x<>_UEU<K z)n?UL^f^2`QJ!SsiCw%`(vvu8K1FRG%o$Ev2s^^DT0>$obc(p7!!Wt&yb7cfN?QBL zR=FqwNJocCNyW}w6=lLCOsf({4~pyGuAQ5<slSag(`1$!IV+9?#pWJKW>hP$5Z5S7 z%$T6=v1s%*ZB#y%g<N@xT^&m(WG(H@1XPkmi>F!M03_Lpj|;q+3bc-yS4=^UnVF!_ zC(z1UoF)T(60OX@H0AL8n9s`K9NklEHexo$`bjaSuhwG4av0AGrYvYJ4#NVvJ`5fF zlMpiE5lpA-29qga4B&4ekuVQq_xux*oo^}|%BX;LgJm~NZH$VdoNb4HM8hD(FH#Xz zd}MoGEb&GhM<^mSN1O@9t8M7I#f}qq7JWYQ#mtkX<L_hbgP1_TW^=UMK^gHhB1*-c z%vj-pf|7)e4L6bcJeGik@YJVD#@eMwDUi|JfI3eiq%bQrjdLPGs1EU#Uz>GGA{K^b zzV--lw6hn@ju0j@;(a96T8uenE0e&E6dp~)d+9Lkit9gsWD~K}{P=;~6)Vn}q?Cyk zJ?0Z?dVZCX3#~+?<f~aqkc{P54EIu$QwJfYWJrTxd`Vahu-P!4t8HrPxhb`X;|DWm z4E5L+ZKj1PjUN|SJU=5XuyYXa(EuqvS*_7v@q`TxlvAQkhj|HWbJ8gOxmxV@>@m5* zx=XTFht*d+kk~8Kfst4Q-;^XX7G71n6)|a83lWAoan8p_;Mo}sSMm^+tmRRnJuzz) z%#_y;YoNkBSHMWp3m7pu^ug%ujZH+@8PGJJmeymi)<ZH8L6SaSYhX#3$_OQG<#g{< z(~f=t10cUBq0}>D;^$+k2!mkT!hIA?e4{PGkSikd^)`1L`gDyOT71qFQo@eH3;0zJ z2PQSn%s=Y7pyHxfG5Iw$q)g?F!v(3#ay;<U`xYW(IH%-78xeA#w(odtBOo!POIRmk zCCBA9j9IKeP4O;8Ayl+pYshfr<61x>WH=`g8P=_c4C`7(2hxRuL94cEU8_c^)$#_z zYf_nwl}WN6{x-!@K<o&UqGqPRKbrH8L`h}?KQR@MaavO*zj`Ae5-`&Ql9CG;mP8os z1XQw_y*zQyI2oltWXDOy2q7v}c$=g#TTGadU`;@WZi=1+1&mqJGXk4QGXpCvli`ug ztP!3fiQW;T!$Y-f1g++x-K6u+s7`5|@mXqXmdccCw7=|<AlQ(Ow00CG@w7rKqO3No z*V7t|6d^7>vqVIp=cfiz8V4VPCIbum8SLEyD2!SoUs_^GHyM0(6clr!@KB}_k!Yv| zZ`Pn9@!sVYLTGXdOkyl<MXvnYrA#OaMa|P=NJh3fV($(@dI*NT2rW>s7ch8}C@R8Q zV6tUlwPv_hMNh$cdc#QbDq7`2syu#03XdLIdSG)#iK=oCS#nKyz2Xo7qB-4@ENY!f zone4#ba>%vwH4UkkBJc`vnd@dh+aHl2Azp@6fs7a?DI<yBGQ@6qE46ROcC;&DaMU6 zAze5dO@(kqL?N6J<IWjKXU@4cvrdm;o@@<&*<%uwE)Rp9td=N3K1Ygi%aM>yIi{<P zxw4#Dge+$k<I0&KojIdxlIKhj@|-EgjWZ#gIb%&8=0YaT3?f}}Pm>iWEIl_1FM4Fm zibcq0PD$J{C!|y68g;h3!LkTh&Md~2Gef#?Hd$q5*5Kh$USTZ8oioT?I9v3Ea7IKS zG9$*FGmy@lvtX)nde%^cJZFk=<4j0r&O@?Q!z_AQDOXtw@Wx(vuSvD5!M6_bxl)9D zt`y^zD<Pe8&A}^V+44|?JZFk=<4j0r&IJ~ON)x2PHwexhoraIFYGfm1WuX-EvQP|` z{L$CQWRjzyFCb(h+@vQqR=r6lPi-uu5Z2su`Yyw%8)v1n=3*p}i?Hc!^c9PH3MbWN zX!F#vmBJ!q6~SU$i^Y)6oUMgacLqhsbEX(K&V+R4oNF`|6l%a)Tb6u-WD&CYvKZHV z8PX}=OszRvR#z-SmNScS<;;+-oaLK3NDFD|EJlX2OH<Fp>c70q6d^A&#kg@Mq_fQQ zHI7^p%A^Q+&J^RunUKz$E!u3^=A6k#xHo4OAu9`|ke7vG<eD?%CD)u;gq!rlMy@&Y z)H2PPkC183LWFyBW)X7DnMF9OE_X;FhC~tail7*`ViD4XvqgR~lbMT%LO3JFoimV5 zoU`zWpsXRW2wBc7#+5TeI&;>h%WETxBIG$!j2mY{I&s#UGW424yP#}L=VeR8B4qPr zF|PSCq*K1xSw{I1u?Tt2l*ElQAzeAk&yc{mkQow-k>TtzL(0a7YVz8k2zi+)#*H%} zon$ts&9aOMFUyxAT-g%Ng{w{e;Res)g*@D_7<a}Xcjc@%6>2qLVv_Clgb4R;k44CJ zdn}?54ImS_ZjU9A>-JcLOxZ9Gl9|Qu)H2;3A0gB22@&qy9*dCc_E?0gVsi?y1Y1sF zrhpikV&%A0nci54F;IlOiYdm8Ga;R2)?4K}R0Bm6!Wl8{oPl)WjL%l^375<R8jFzS z%wk+QGo&+TLxKDQnvo*pIa7=qXF@u2#=5Ay%oHKdnPS{H6VjP;K_OkHks{<dQ;ZvD zLOO9aWt-*u9~L3YnZ>wrW=Lnw^s&8M4T7mwUS<~K#+k^SIGYW4gDS_FMaas`Vq7^h zq%&trw)}k1OcC;&DaMU6Aze5Z$PXaci%`e_!eZPxgWQ?36(0%6YJ(!=Wu_Q6&V+Q~ zY%D}(D<TTvj2L&$Kss@@n6u<t3X72C%wk+QGo%w|d>t)6xnL2poLP)3XNGj<%zr+> zRuuV#Mr)QDpKoC;2`dg*h{byntUXAO8F&R{F&9X%wEn6w;6qTn#dgp#EIzBH4_sZ) z_zJ}+poYm-GO`;cUllCItyo0vTr9mw-sCYd7Gm-&#*H(PJ9BnCw+s4W2oqjTu{Ag= zy?K-~Toxf;Rg}anXF@vXTwsvz)T|UC&zWM}I1|!|vrTO@$jZzjWI3}KSI!LS!Z}ZV zWyz*SL?N6J<IWjKXU<xK{2*<k2zkyF<Hnhg&YX3H40tw*kmpP>Zk!3}%sERf|MX#_ z2zkyF<Hnhg&Ybn>h3J_g<T+D}8)rf~an4ig<z;3OvYc6rD`$pu;w-n$No|OK8{oVd z<jK!(Xy3lGcz#1`j^lhMaGcK5gWI~ugX^2_$&LQRi@Uz09Cy`Ji92$l5?6mm6>il> zRk?%>HMyj-wYcF4b+{9?>v3@_6<k_Y6E0_OQ*K?PKUeLQW?cQz&A8j%&AI*~TX7dd zU*Hzh2;ibq1GrYp1Gs(H0=TWc0=Z*v26Eev26F3aw&QkgZO1LB9K>}P5X2oQ6U^<4 z4(1w83Ff-|5X^lyGlXk+JcNsTp*{Dbr7M^4Zx8N0PmZg_)hzN~OHRSHwEugalm6rJ zjk(4`yn<`OLX9{N1{>JZ5v6$7oNLZCWB(j{`A{RypQUJO=hKL5#4!Bd`W*eM!~VIZ z74IoUBd)en&SG3$j{ZH5s|o(q!#{%6z|XmqB7ITNQ<4K;YQD@3xrUM$;z0SdaKVY3 zrCdau9P~sjc(Rg-8fnSy<Y+~l2TJBwNWLNs$yV6EmdH{1&r#1}>XuwN{PW~0<8N8~ z^W<7R`}a%(PppB;NKp$`R0IF$Z$-39AN(UbbF`51Zno?P`=);t-C|mTLrboLz@;Kr z9yAqz^OkU|%2mO?%3LK}lv8CEuE_Z^S?EsuR~D%&a?f#P5a<4nZv&p3*VAsda^A<r zf4+z>OrC9SW8Y2`y15PC*T{aNFK!Q!>?^^Smy++`p7P6mVG9D=jzb>+3HSf8T@8=5 zQ{V|Uy*$RQ0{VVU{8pN6BCvmF>$nrYKV=xn=Z5UwvHgj^wI3G1ZpE+vWVa-+k5R=B zw_SI5_59!6uRy!gl!a_Sd&12OkGEF^x={TWHu11*XtRp*u7v*!c2|fU0PQ+(-@PZd zC+hL`V@Nhu+1mwaiQU)_njnnJ{)ED|;t{E%#Rzw<d+!*UeSb!sj^oaKrw9A$++|zg z<Lv%;noXG`M@csPvh>oOGXH<yc7n}MrMJJ6v?sd<`~QK>Ev&V%&3>h_DcohpAbm>9 zn7eEi7k4W1ZJqQlZdu?l%3?N?^Hjxc29-HvAx3s*ynTlcZDe74SjAym+@XUZ>DiVa z+KEKHCT;WiKd|M;aRySU?f#+CJpNW7kvg8u!|dBdh=Dj4vu}x~xgXKn5z=kY|0~;v zp5!0~ai0%0R&h_S6VARZTZ$E%wG{V%<4z>;&@FM7^Rq2Uv?E!%rKwc5B#CoPm&41@ z`xbIc0maA=7dAyCa>U7>q98=N&KL>pKKCW;6K|kG8k)Gs9zj72DY6jRXfH6^&-?%U z-Ye==F+UKG$75$DIiu*9CT9%aV@r_F_G|G|tY-)7*pJ{r10(|x_Obn+J1>!B5KiVP z{y-IBj~hFI<bP<pT@i;S7IhdT4rRkpjc!NT6?W319sig|J4z3m#0L-0c5^vxRC~6Y z%k8y#`m^0!&vtV?+s!2&1WTLQp6%wsX`N8Sv)x>@E6nM`Ahruj?h`r|A^XV@i*fzr zh#_4$%YR1+(n7vCW-&6HUA{PewwvqOZZ2xhna_4}NqYHbySbk2=3=Mmqh&nX&Bexh zwnggMZZ2%`avGTp&vtW34trsnw&Z3&&vtW3Ps@3>n@g&VXS=zawDD{=mt@z~v)x=w z8P9fe6|xtIHh{T4<UZTYg>#bZN3F5VUrtjNwrNXlkbbtCOE|TP?TB>o9wfWH%gwWi zypN%$by?%&n#j$G4Nm!!bI`;ez36n5KPUyPvzsg_QaIjNFdU?K+~XphU6y73R}PPK z_2gwgC{jGxP=fgHA0}ycew0B+8$*?LgeaZ^A?F?mDV)4)(ZQ2W=S+&nNd6ZOr!>nu zjVR>I$|AgsIk|L`_tRF`iI+~!#$<iBL34H=S<Dh;ypuT`%DH;HpwzPN=!!XOlg{qd zssuNEVB$Dd^YPE#boIMMp1F#3)+OVt%-LU>o9{AvePzlV@QDLcit%kG?}1I$$D7s7 zjh@}>)Bmi8G;*2d<V*1}{nW{LDsywgD0mE%a~LRxlko)D?tjCHAUSb-Jok=|>9Nwc zt&5ZUVtw4V4{Xo7yC3Wu5Rk_IH>VG=rsa1CNn_`Hr|E3`F_ZzobA=PJ!K+9b-p6K< zBsO>#3JEHfq+QVz_~eBc6-k8dsp$9&UD5HZ*DRU@?Y2k)zW*$eBnO@~$$w@sM7%f0 zVu;{hv1kgNrRaD~(JIl|Fc=rfL1)W^JHjGKG7Oo+;OewU8me6KXjmi>CV551>uefw zSy&_uCZ$Ej>uir<(>fcIw-`ojU@VS?ZDlBi2*X`*6gbhP7|Ybz%r=a@#V|4&iy@#% zS}`P<`NikM<{!oJ!5*+;NOU-GwU}N3Mp2Ae>1_N|znHv=x198JbJ5KaIpGNKBJ&ZR zq>7}`*>C_)0M3%<eA@={eZBbCJ~{-87#_9@4D8UMgF+D;6c`-DP=kFlCRX6)jq9L0 zWZ^g!PSc=YKn5K6f<1r7ae)XN@DT3==vx(Z<S@ctDaM?Cnd9z*?)SkwCIKLns~RrQ zrHFI}1g>kuJ03DRa-ZyPG>I{<mE*Xy430ZLgvWFTP;g0u1M=ZNMlDitTqJ@iM#nvc zLb<@u0P-^<p&JbRe9+w$Xlsjf7H7H*z@LW{^UVn0=Y=bjO9~BeCgT?2G>@$U4I|{~ zb_Q5%8voe%fg;Wafn?}+ATIhrMO<jr&`?H~;!KwT8iOmHCM(<8A%vx+KmBp#2{d-3 zFLa|&w2h344oi(oiHi;I(gc4Z;!`4<IAaszA``;mqm)e)Wsvv=u35NJI1fMK711RP z8yJS5{;g?Ya50Bd^O-->G#gIg*A7cV4KYu3X>{g4wY#*UrWIYdZhqWgj{A<Qjx$JZ zjpghxUazs3t!AA~(IUB}A`wngjr!p@8(R?p|2J^uM#Ur9*5eB1dNSD%WWP7@7pB3@ zz~xb$q3933ilu!v!iU`TxoTBI?Qt9qCb0iP{i@;+13v{2Uf`4Hk)?&V!0JG?0BTlM zLg9&$yslT~I{Q&p^qY!Ux__R(<@T}rmxcRs+)O0&<P!b3n;^&%hzO9pzakP<#HA4e zzi&Ob(Zu+BKq}l1fYE@*0IA)a0DKAXBw#k+DZp0%e+HZecouL5;O~H>r;)fqT=dig zILfm=E)-AvK~K`X;-n~r7zgO%2t!e%l|W$Jv{FYP%YpQ))Ep}}(TYFHpUO?`$6r8R zg1jWtH9(T<x*-2?GzwSwQ(>TV!cQFF&T0Y!R?m`;`%$`TRY?=#&sqNGxU!^P`uRtz z^#=H_fin^}EN!=97O)hAb0Bk~hm~z0z)>}Reyf12&yYHpCj6de(V<{C%finu22s2b z>5OzVh95P~-&!yR<fMd9p$-~yQdooY5=G+bqS&73M(}F@$_zl#TA~LAYPhSw$Icm8 zX3B+sJ87zXkc{9{)j}$pJ(Yys6HSCJve<DTpx=*>i|&8nZ@Hg^doA@y`28;2?-cI; z6z+c%?ps1`O8+6BH+NZxZ%j3epBR5haxbxs^8y<prMe~C=z=h8oBhIJ3sm1RfE@s1 z0cp^P1AHAY0g&2K65u<4eE_!tCIfyCm<o6vupi)U!2W<f;5`7a5}*pOHlP~NA21!T zC7=edHDCr{FrW^w2Vf>(B;XLh9KdYAd_W`Mct8{26hIr`e8615m4JDGhXD%!scf$R zUIZKgNR>SnurlB{z$Snb0Am3s0rmp~&(Rvdseop{X@EAs*8!>8=K+2W_!i)Pzy*M( z0T%-P4!8vHHsDgg@~Db;0P6#;0BjBj8Ao>qTm_g6_&#7d;0J(H0oMZV0o(xi4d7<L zbAVd`ZvcJ_h@)A!PXMa`ehSzSa64c}z#V`$p#KH9aDJBE*m29ffU7bt>O_C7i$DAi zYeM|`-Ba{N)WkZ04fPOcw$$p#NEJM1dpFJBmt(yVZ<N$e2MSaKNH*903VrfulD8)y z$s7YnW!sM{(4}k<z}3d}BCg+@%0`<O$P3O>l&*$T=`=Vkl9iCqp~#0Xv<c%LL*oD{ zNtcw4JhPcHI)apb`&o;9*^j@MD1&rCN)&%o7SaW(lj()<StvV|PY<X7%m$>gVm`-o zG8N%AE;?xiToqjYxXw7~ggFg*3WZP+Nm9Pobri87aP&KbBFfh<$>LhSV<0=pHx`g& z94C}zGQvGv$`T12ja@VkJ?m5!4Y@VL!Yb<7s7fzT8FNkKSMBji=QP}q<%&b~VWA{c zH!--xAIU-GC<oY0K(2z^B-?608k*MtlD&Qa7zDT$kmOzmNcNkD>qVFH#Q{e=VDsGX zMV9Xg>dvWjj(U-nhw^nT&u5U6WceJhG2kx10KhK*y8!M6BssqXr1I3LKyAU>uMsr} znhN5`8&zU9?2gBIh`0!~$ppt;Y=1SpdYW@B@GaF$plTsf!RI8ohZ1)Y#;8ph7`btr z70aNHNG4^*&q*+hd;6WGhBMl#A7Ujz5+V{KV-tF+l)Yk=FbOeQp-9h^MkgglND{Zt z)Tc{h!()54=M?tDR+D;|G`e3{f-*IsCyv4s*{ie6L!=bF5@W)`F`e@Ey9=}O;Cdy7 zs}jR|MMYrN90f;-VJT6nh{S}H<it3L92O4GZ$SdFXOYD5Vf|I%VF{7_Vk1*x(Ej-h z$`qL<QW=q?N(t+UE|e$tE|R=&SR9;SN5_TrRN~+=Z@=rVC5TOwEkJvL)~Nulw8|6+ z9~PIG5T)vy7?&C!#dQ{vIhDaRS#)A@M3gEuAr^;XMMOj?m8!6~I4(>`>LV>r@ktXC zRLVruRzz45W{lo`*I>ovIR34P-VCFu<Y%MS&VCpxo!+O^L4w=Rh!>Y+9;UUV;^k1h zI$v+hH8Okp3sIh2L}Ie4Z&b1}7ForI^`g5VJXm@A-DJ^`vC5>lumLcD=vY{4L|8&x zEEJNM92u2Nwi}y}5|tbm77-Q6TGS|30VzokI4&+cETXq6DLFPVIW}d0Dj_jBJ}i#4 zD5CP>WT|2kSe>F|K7K@|lB2@F;ln1k&<wm~1_xm%^YLp6CBPRhyt>(NlAMp<G9*t* z?Wash#-Wcs%({!RZQhEAGj+45_MWOFB&{lNPPJod0%OJ81(_%F!?!9r*Q8-WIr3CR zV959JGm{WhhPbG(gw!Ne&*a3^BphMq<ClYaONxjIOU6Tok6$v+knby!wHg)X^*(-U zq*(0k7SQw<p^6Jj?it1O-!m#1k0?HV7l4jSN<?kOg(W4SMo25vM-J1F!)+VO$jGw{ zWBv)5+&G($QT0QmvLvfX<_KPMBwH?@gnxc!vNZ>m+L}b4Znn%CWkV2>393?+QORfz zDY1RY7Lt;ql<5AVm?El?B1pR|b5aYuAmQA78=V^Hr-1z715%<`mHMIoOp0JtDlq|e zh#4cMKAv$R^Et}Yp^S=1W%d`Al9C)7o|+P+L}%#ZH-@B=8dp?8-`Hd{g1*5_^(PPy z%a`g{G%{uiSau=ZxYZDolT1+=J1|O>!ZigEwX|eyjsfpFtr2EROok;P*QkZRL7Z6t zr`T4eh9*c8$?AZNm!2x)k|M}>sVr8KMk;M=0(DQ&AQ96_M3OQlF*yaDgpVI_0<F-h zamK2TUy{_2cxS7u?&~3rnwgZf*kXCpha7O7sDV>n7!Z*k1G!30tJG3xH302GSZW~* z^;p2b$tGU(vKnpzY2%XkqKYbIcTg#rF)bV*1)YMzH!LbZo}d6_Y<yB21|*?-VKU~T zyhxDh=n53TgeN9an`1I(yQ)v9Y$gx2**Kx2poU5F$E3cAv5|~9O;f;J7{p0ldaB0T zX_FZWA^M@X@5dT4-6<$FGuUdlyGqJ(X^~{4F=zl-jbr7dNda<*GHJ}@Q&YvNRP2MG z6S8z_k}wCpO;R>g$IK3y-IGXEUYtbh<5!RJRB7O-OQ<(momA!Iren>H6_{EPn6YN` zJQ7e(UrayG7nF*|Qc=SUB(Y;L8z2iD%IehKFv<Q?F*L9ql;k%e3$ouN5|R>-lH+(S zx58}}$sCcYOi7GaDF-N1qT*FieWSntZMG-+H=2Q90K&M%w_K^cN*XS;Na`G&+pU;i z490WFOM^kjM!Y;u-7>5SEh^4oT$GTCA`B|hv4Qn6B)N`C_85{=rNOW{zL}C8RphII zSsL9}C-o9v)H%BcwWvdqgcPpQoAF&ItMeR0GpnQip$)}J>paKI{AyZpf~t>Syi@Cs zHM6FV<g^xYz81gktnhlR{o*!{ro^Y1yB|98aE|8m^0B=i?b)}t;lVeqUJrP69R?Db zk1M=-dHK{y&#zMN(up!{KiRVG+5la{2j+HHw_krRug#h^HarN<WOU1XZu_2@*x>UH zUHz@KRxYfqsC{wB%R^SwJ9sbgK~$g4e{<Y9M)&>Ed$VtyjBC>5?ZNlG>W;aiY4!7h z;AY7wl|wF1xY&QuRF3QFLHQ0?SSfE&nf1H3ubck;cf+bZSiM3&eQ4`(<NAgSUD&p_ zZ70@!8C}xBj4O#pM}3vzfA`FzEnj@}S;KYR-&*}y&&<f*>&Bezf%^J`(e-Hb>eYXa z<jk5ByKg}&#he4XZ%uBw@z}0;e;u-oyLhAp3ftC`@@+ds|8AGn?KW55aDV)?u6-Zv zGcS2%QC^qGU!yj7Wp00M8pjQ1bTvm_2x|5Hseih>+3ve$JHEW{wSQmxWhdL@e0?C$ zRQ`Ooc6gRybO)Da4EUx~R&DOk%ky)(>6CG{RbKCFTYta3b%^)RQCFflF4T+iZMgcK zv#rcG=dUd&qprBOYKw1HZ?tq?&~MRd-)fcW)xC^vWDTPW3I4O8|LilhcUQ9xZrr11 zpAPNTM(+LMewF&ICx<6wk2#KaFO2S&GozYU`{d6TR!$9#39%}@4riZiyzl)kKYy_D z<Tp)pQ7ti?m!W(W6=J`*b|ic6>VU=nbR9opPqj@QPv6<wvccOk8g$;W;txD*tz~re zw|qCe@#|l9D`>x^-9~lv{VFfE{J!hqSvOh^DBB?Y%jx|%?q5b%?|iPcb=$gqTYuPQ z*{K&c_WHHOg7x(#Og*{u^-im<hUY`J<g%3S-U{UsYkS0~YYa->_HdT<%8^sgFRgL< zr?k0qy6i8Ax(Rz(%;*w+ues?+Le#fk9ZmaVb4>8o-XRYbbe=mx_fu;5zm9%<&w}*? zMmOi$OSNl#|IJ@X+qRE7HguA8?hiM!s~?ztD|zmD?|%osh5Buc7N_v?Pks6H)|)wV znqOc3!Hg@*e~CFV=Xl?)<#unq-}=$Ooo9cAJu|u*c@MT!-qh^$oscOf+x`#`ws)KV zjdP8EU!C^Cs9u(ua~5Gup3ybya^kNl*L;T7i1i56#a^7<>$lGu9z6K|ymOyCYV`a4 zZWTGMsW;_&;A#WSZ~2=~J*wGk%!pRrP5#~VroQjd{eLJMUEM$A!N7%B?_+cx6SDvL zw`L!s=b`kbzt*k#y!YwalNHC_8awx6MZ;Skl)sOB8J+&}jWWR#n|yTR_uiG>ie7MX z?w7{ne@u8|(7xu2y5IU_4%%;+59Ql-So>-xc753=t@{3%)_3+LAKN#6!=Y3CpZoUK z+-zH`szb33$mp{AR_Y#L+4@D+t)}ZA4H&aW`)~bK<qCFsS9w=gu1i*rgXljP-5>KC z{?Kg3wu2+qjvW8znyx)RuHCV^y3>UCU$2g~2HhKk1&4v<S-u}tZ#46dv)sz#H*dsj zeOR!1*r0N|Z+!OrjMuAA-E;5XuQ+ZeqvIx@DLC_b&!HnbmLHP*Zi_wTUcX&8_~W~y z6Qa8}Y&qWJRjd(W0YKr^sA*nM{VK|xhHt9Bo3f(LnMoB!Y&`et&8A<3cdjt=xu0V= z?lnet<kW>ajdmPqzdCW(`s~9Rzs1{6Up)O`m0_>6$=&$EGMdKTV06ig4-NhD&7WSW z+IzwzgZ9{u=Nb&Z(q>8Tj9nhj&3w?;j2<=xYY7Uk@X2TTPRy$ka;N#iQDr}^x2s<M zsZX;De%~H!+!6gCyTWj+t1`Nq<8wdxVf>MOt(Ug1`}@N7zv&vRvz}MKGNH@<RTGwu z9;oKH%ZzUR)>dEr8$R>R`gJbf*|q6h*p`m>$|zE9tT63(Q0dap%geCd1e;NK-D{<L z<-qZ26aF%-e<vvNW`2)#)89DiZSDSW+tOx7jxD)|@-n(NPFY4PK2Xk&xO(u5h_DX1 zue5sE_l1|%Z>n8E->Yg%dh2nM(M7j-Nt=_~f53{Gecq28HsqH-WAbLK%^J7(RqciG z{pRdmg3+fE<vXj@H_HZId@tn8p2%w#dyKE>tz8rLZh4*h!j-?m-tpei743u3jXfQj z_S4EQXKnJC?;mTKaqykrs<k}w`-saEa=*N?XU`+78~wuQR#d8d=i3WLO|P)43+CAt zJvUT)S8F(ZWze0jU&Kv4Sq*w_jfGW(SG5<)9=W+R`!m0bV_%p&;oiI6!Q~>FH~8b7 zGao)`TrO&SEY{{2-464$S?x#m3e3|f2W?o~Sy$)!zHxI7>Azmn_J;oFan?Z?;}~7e zTD+0#nquqr@!`dR=caExb-(xN&zpKZ*S^C>-MLR2&E~icSnyMLCB$!S=NYl^{?5aX zT5Fq5p84rVz8jVQ<iA<&^xlhqdd?clapM`?fW`R%i~Vy{mUW{RUa$GeJddrZ<2H1g zGG$Cid`R7{1rIsyIHNOGTHfeVx!H&6Z`{>>mNj<b#V+&Le>3&1Jso;BJACi2&+|F1 zBg(AsTJ!eB_s4e|x$5x9eU)DxF>cf=zqO3qd!v83s##ax>FV?7F2{{wbQ6wzAGb^K z`rUJxce`$T>Fv)RZm2SAlV#4--;T|mQ-12YYaDl&(cNzqQ$69wvR`jak8Qd+fA}YF zdUtQCIGTO5!$0L;o3-&^I>$AFEhxMWS2j0Tb-n4geZM;P_cwo6JwKvnv&fBoW0p01 z;l=uW4%gg(^;|~h|4P*J5qWP9^ULt+sXjSk<dsH^%tQY8ux9$9q%)s&yVjQDwlKOQ zzj@YL+a$I5HEowepH6O5wR`ovdddBcFWr<fcSg6CH9y3v1I8|e*YT6zNAw=_*ZFQo z^F2SDR_pSbH80-z^~Dx554`=-o=@vFJAwB!jP8@IE3Pyh^XI_mt<_hzd1F}ew;#q< zY9G7e#QKGO#=n$Ne>=x5XLQ;F-{~KQw6C-Ba=G~j)(<p$O}??dc7?eM#}1v*dVaSJ zZ*kleMmP1_U-!P-C4S(UW<7>x-fLaiGX3JjyFpV9UHD<#moL?N$%OjA>|5bAuR$H} z=+65)RPVjTJ8ys6F(Z`wzZ+zmmK^;?zdAwN4#55<FuENpybmV^gnGUh68A~O{^L_` z8qY5u)wPQ11AV-r+0eQ-IPND#_lE6E%9O!#-kqGF&wb#(Ikr=DpHS`Xk<aT+D-T|b z`uHN&$e*Kpr(Pd3sZ}Mf0WVw|d2imH&FilG`KRZNO_NXT?*GTN75lDj!uujdSEugB z-Gh8zo>%Q*Oi;gv-~1N0VORg<eO^hg(&Oii@0)I-UH-!8l;;yaUbyL+vcKuMuXg>m zvr)>S=tU3f%)B;G`B!#!W8))^YgL2teRycdl+6P|dKhl~71(|5trxyOv7&iM^r2cc zx3AH+FZ%$C$72}Xz!S?qeRbQKTQ&YVIL^BKgYoYvK3meNyvLib&&~e($CeTAa@^O9 zPP3=!s^&L5KkwtQVA)?EMXvpR+(F$H|9sC2T?cI+GW;~^qJB-vx1vvUkL?4Su9_Io zPrsyX;Lpz;d~wV2@?O8+U){M?zd3Ez;k^Q*o71Mk=u0DOn=Z7!f4*GY!GjmO#BN@A z!0S%3&qupoZ85I^YuJn~Fs1V5LGKsrU9o?D**SryV=7PlF!rPQo;_PkU-i!Dx<5DI zxW5=((8E(hwzdu3kvy%(B30PZw}w6Harx$y-I)h=jTrw=E6rIvQeke4dC9*MSO1`& zxOw0<zm>n<d9~x>x5p0Me)pxYSueF7@pqH44e{QM(G606x7C_(ecTIy<zl$=-_`3; z?Z{&PeH(XpZ@zr?qgJy6Iqn}ucj!{htfv0+cWixrd80AwzMWWa#_fr#y@MBizjAcj zLsL(GjBy5YXoXjqvh6o682o&K>fF3WBQ|#X-2by$Yp%XO^<d-Q69<iaIK2tp<1xAd z<97pReYmEeQT*szTMplxK5S~;G(SUP>bv)X*M8D62K~@gMz{J~pU=j7FMG3UnEwxJ z&jh}%Na%UAS?hzXj#R4Bxa0U2(I32sI#zg%dau>$Re#;ycy78m_ov$%;#=3N*L&+% zQ$7CZy7%VLEYGQU-^l1<H@29+rS-SUKkojUd+uc2K|TH*{&wetq|?EDejOX%Yg#zw z_l#~yW~OQ9-?Jx%dcJ&W#?J%7yPKEnZ~JjnowWn}d+b`-V=U&o7#kE`HRD%j%<}BB zyGNM?6X&kz^7&W4OxU}!)BEwWn=R3+o}aEjzKrht*^KPdo0@KYb4;(H_a^7p?L2nw z9DVf6jSIV{w_UjK9_Aaz8QqXi^Db_?oc`*GlPlJ=42)mW_V%U4%d`*1tS+B6p;72S zJOc#QqkOMCx~q#{ylHImE%WepBL}2@^MU8?-JQ?mMSZY)PTvB}4vw45==M~u{_3c^ z6UP1>ko3?tBe9<~sZEo&^P48D>ay+m$$y=PoqosY7X5wUx351;8_~Yuq(=kipH1KT z=wzSz!R6O1x}BZA;lv^6rEz`AmmBbbrG{_PmTcvro7>;$Jt*nw)ZpCaS(RE>woZQa z{7=yHFh=)i;nmmw_~`vH7yn++a82deI|B1O&X4RmdSws)`3Z~W*2g?zC!>4o!I*o| zVM%xNn%&#hzd!e0*Ks47)DQ1??(AEuUgj>o-5KvfVEYQMyP+@dD>v!*xvw6a46HVJ zch19{wlx;a-&!MJanR<!UTcHr4-KPxwaQ0jr~4<>pVzJS3|n5A8W)d;#YDAze}Btk zej_IpC@0|kFQZHUdVSW>8Sj04c+2gdKlt;V{--XjUt!)oFzmK>hiw1D{h=2uxFO%> zGZJQ$?_^t4ZTaCp!`A<hQD<tucY6Bo`uV8gXkZin)6e7ilF=Pc?V9)5i_NCLGWvGs z%g_Dt$KTs}{`_LWko5=7=GXOZw-ocb1&prsyq{*+4pypFzE0CRJ-=73Z`<?Jn`PrQ z9;1D}x$*Y94cc(r14dVn-Q@Yv^JaKY8UIP0ls02t`!j6D5x)w4Z_oZ><?hL?2mOI} zxL6HPc-aOd4=n#)%ih!c-##7kRlmU_D^IKZ;vLPh<0(6)UTk)9CdVyebhW=pE>pAL z%yHX0Eb@Ilb-;5c({hJ-zchP5tsZ-}M-50FjP}OpwoNqudvf0HGXWn)pRBbfy7TSe zj`io>U)6bXVEqOw^MmGKz5$z7c-{PU=J@*EAGWPM>QAqwchV1>OZjH(xz|EE%->+z zGiu>d)Z0`>H*Wdh>1n5ScMRL`^WK&ZmR|Zcx@E7;zkJ%D<?^$Sn%#TQ5#tP_%Q`ZC zI=3#kMcYl<$yLVaZhm-b@WJ8FpVay%t=JMDc@<-Hv&NL~o`mW5%w<RYvb~ILM_$_1 zF29XD+pBe>uMf`~U~PQ!@b7rBZDMp^d$-zPzBT9hQTNl*Rc&5;r)Ha7)y|!Ib?N;> zu@(DH-ggP__Zi)dIOC$p=WO@m)K$9$eU+2)QMFAUteknZRr>jt!&IGDqAn^op?o*3 zAC{fi{D$G&{JMVa4clvLrcIpj>WKFbG_1Jkka>0DQhbNO=xTf()ZqKE%dM6MBa&6s z>S$Y>JXN9Z=Xci5{BigTc}Hn}^$DYE{?7hg?{(VP^!1^-ikIgnY|H%q=jxl^=>P7d z2T9{TzcUlh6lI!HzEiJeG@c#Ny?*D1Guyvkrt9%G3qH72ZRe@ASO4-&e^u8S<7E<~ z`z5=e?Tl3o@1C35r&DOd{)b-C?|yOB>*ISHJf3^?@cw>@_>O|nZAdQj*O>SQuZ&pP za!Z4-S>OFWtjUe^og0rfxi{zYH<Q+DIIe;}<y)rzTlK5~GZuLbd|0LCvWsng+dX^B z%s#*9ec}Rh>cqzU#&It*x-;2FYgoO$zVO}AcOs@g*XV8KN1knl@AUJW{bIM9jk5p! z1n+Pe-GH;>$3@LLabeY^Ba;>{JGyzys+McZ`CN~lJ2$rJ^Y7IEmE-<qbPE$N2bZyB zH(eLk=32YT+bZ}}TD>nG&vr34tYz|h%*MPVtQpA{Rkr%2+MlgG@=^VdR(BopW?19q zW2^jlBs#hM9?wVF^*_9d`8}g+`tprWH!1gWLx1Z$#oDAzVAD@xF8|d0QbLu(O$Jo@ zw~HS04MtaP|C%mI)yq9NUTX-qs{2cy1T6n)Vz&o6O{%SZ^Kaj}vWMfEqpd5vzSkYw z-1tFN<NAL-Gv5!K(;}&TW&M}^=8evucqaG=mza)qH%50pa<9b@ZZ-ZL8MRr{=ak2p zg$J&V>~~S|#<0KYF8^X9+U1vwZdrxTqcb<Zf1;Cb_UO|Sdc3{kRJT1dzv<U$Vb{z7 zH|qR>IZ4gtl<({7{@zw+!kzKw15-4y5h3?e-~Yil|Bofs=;qxne{i?%K=gl%Zsl)W zdW2%tuhlxu_==mhzsZ<g&AY8U^wP#7^X^T0@L2)ubQ`0)lpQ+#oB8pVE96Y<k!8MA zx8u*%7wj4M`SjZjPYkJdD&{u6bHFpE!b=si_Kd#jt!9B|v?;me_s_YpX<Usvw}N+F ziW=QoF<u3Geu>eI`|zmc-tS@g>K;-4pKeX~u*=);O|Pdfd-eEwb^Cx1k}l(W9Y*(W zmvz^IdJp0b`40K5mglM6yMEFB<6HHc_qPOR&pW#IHlAm$F}iB|Kj^SFKGLZ9bU=f1 z^-m96yJBqQ*@K_#|F{?T@uHyX+wpxzOOkJde&G3p*N*=7TgQ{9jGMmNIahbDZu7NY zT$$C^Fy^!5S?KFuV|4vz4XE_lYU7Mr**|X2oD(<q-m9-?zE|t)lH>p8A9&FIcRb_$ z%;-)XURCwOuS2`N|MRZrR%frOmtVbgjhan5mRs1po9X<Gm*2;8d@IWLkGq~XTP**5 z{fSLJbK);_>)qv#?~*SyTG{4}!6&?%es$#--s&;Bt$lQ}eyqLn-`)Gx&wjuA=^wqr zUmxOC-7h{opiRNyzy3}`f57N|%Ko#W=dnYv&sQElv2FJyojtEKUO2ht=5Jq1==aHk z#^Zj*^G9pScWaYPaXVIpFSF_=-Fj{DrKG$+>Rzv{@d;nn{IeZ1%XphG4`X!q)Gdu? zUmjHHg|Dk$T)g6)&fAoycXT-M-UmZIT99{P$em!0TgK=f23S5?Qr~0EsIU%|j!jYy z-yb{sL4KK6RJ}KL`(@(HGibkmGrFF)=C!KkcXq`GK^xy#S9fguhDoPJewBVW`NDxU z3tNs_cb(&+ULg5qU!Pa2&ywf98r8AE?a@icK5c)jb&Yyop84%OW-v{>Pu1bL*^KUs z&JhidkB@w~<M~5r$69>qUoUCN7kxJtOr3V;i@8^#>#xUrm(i)de7nM{u@!fEtgZ6# z`F{he9Z*hE_epKvt<jp}hw?t0q(nc2F;n67(wNh>=6x=I7k1*$V?h`H`J!{$o%OS` z=FZS*1{`aAu16=1dymomy>!&HlvOh~*3fM$XPiE_L-1W)IqwnUGKbCjZ2sWwuiWLh zTZ}Hpw_xKK-Gt8DzIeF!oe?iK=y3LzTOkc!KWrN8cVSU-`~$3S1W>;7&vsPYyZpv4 z$9&ezx#9P5@SqCsJZKWVV(pqPYhL&@)$2IEgJX1~jSri3nKr_(<Nn;qN3y1j+8KGx zxS{s7DQzY+@cX;WOI{cU8J%KD!Gmp^%MZ0x9<b>|8^gpiBPuWcuJzSL+Z$WWJN%zt zi*Jwc%&PDjw08Ece=GmcuV(qrFONL5_|nbSDxNe99ld?t7areEOW20~z{u!KinOx@ zt#>cKZhH4jt=|?8J$K#z<I&famj5*BW`5@{KOKbc-56b`SyOg?KJvthGOHIf^;p&G z^NxSjUAg7Tu_luz9sYFF$(J{CTtz$!;CajH`Qxb9bX!x;uRK4!dKcY4Rfjj6vhQx6 z%^^0^p(D*cz`7ZuYms{Fn`;~X?NAV|-yM2;*7lGS|L*@PD`VTau)8Uj?!u8Jw~Eni z{r2pJ<_D)4%lc(`y#4Fv(_cGt?ojy^>+gKpXJN;9Q{V4U9~^7}w8F>S*a~b^MB~d- ztD;4Irw%RC;K(GyJj|--t;a{+?E=$cP4MxXp+zttFrZ!Mz>szUfoX8ZYtd$;+48Wj zH6ZILz6;k2Ty?gf^jy6mqhw6Pugx`PlTM$B&1?8(I|CaaN+g*ZQ=WS%Gd1JmcC)FJ znObcb27S7n>C@G5F5VudffIHsmIf#6hu4Cm468K9=l*^5)?Bqgp|s^@=*?+Cfk8oO z_~aiS%;{|fX?-KoQp{$9H7#C=V7rij;LZWT!R_01P7|#uPh-K?(0ZfxKbngbd!$6m za;UcSN&!2=mz)-@NmC%7)swW;Tw|J53wBT-?JQE~=w)Po5{5$4$5!SXwI;ir47bwL zL>^kP&MK3|(+eD8=k_GqSVRM}?`vT%R^iSDeGR`E#Lm`X5l<o{s!69$*IKM4uOP58 zYVu1i4|X}`;%hM(Mx|H5dZQ7VwCEij;8Utk=&MSh*E6P};MP3Nf3)1gO0(QT&x%7Y z=zFgJsNAL^<Ssp{uojWa6E-UJrB<_ny1k(PsA6nIh+KM#$@#D3qW!PrlK)@H<-d}N zRcjk!%#pFLCp1>tH<pp3&nbmb8iN4ae_IN}33aVv7c;DMW|rt<&BHo`KscyQMsKCp zV$^O1P&&gtZNjGW7i5Hg!b-<zV=|O<jziUr4gNIsEqRTLGdyz+&G76cEFHz+U=g+v z#?IC;;Fn&l4|l6|M=noNJ%T16G4^|8mUxnasW{DbGF|Mxv=mEwt?g<p9i|##zjYfN zsD&NbcJ5E7PFShl>{9rr=0uxq!AoZ`V>6Yb^DR-ibudknbm8EsrNiktdXtU{TXLNV zCABjuVG(h*j8v==ag#g-v0W#28J}8lc<ME%^Gcx?gR!A&rKPNr3Pl58p>yk}=uU)3 zXSoUKQ*c8esTrt^dP6}8ODc4C;7A?6IuplKl^$1XMs`L<HXTdypIkf9=4*0FVNlMs z=?&1Tbaql&?IhD+R%gg5;YsSAH*SkIQ%0Fj#K&cFN25~-Sqes!nX502l|zgeIB>|_ zVxFjw#x!ibwMtf5pSpK)JWkqWDlNO9Qyc9}9Ril#qzF@YwZ&1pC6b$83dg#uO`EB; zw4tM3O4`jjI-gQla5kpVvy>IxSSgGof@D~!q5-AEtKkAWYmQdKPX|j$a}tKM*<7!2 z^n;~Q*Zkh0Qkw{3rH(p6EslLFg(*@N+k#zkR_=8JcNNkqFAYs%F5SkOo0DUfeH-$G zJsV6?eoTE5K0>ki!#kNB*?XcA6<9Jo<WGt$aYv4_TC5hiMb4)vuQel2IIy%7%PhVk zuxrrKmp_S!^sI#5)k24KXiIOx&Yw$I(jJF|Gs52!9wj9Geu+%Qe&DFPiIm<D2yZiZ zt6kEX;omhlO_fSibV)1Gs0}5xZT8w$T(2vwcT?zPGBZltPfI78kW7<Ppek`?7_l}f zF7XGKux5pBFxzG<jR_5_2)0MKbi_g(fSb9*j}FpWzzboECaZ+<p*P?U3$~ea%m#C2 zLCMEqu(V}i(w>on7ybrqrdmTxrH^Az-K+9VLMq~uG+y?xid9@$a2%7YDaki5;+G~m z^!KP>xi(RHeW3jt2{uVA@#7w93WuWOOam)lVWsl|8`U#3S8FM7tdTrPCAqz=$4h#Q zRF)Dq9Wrzi&e151DJ#TbvsQjRxa3Wc*8YdXVL~Yg#}9D$0;l9s3AUj%$vxXX$$Uuc zn{mFV*5Eu{d&;gr+7Hrutr8bk5RpE!u~{8ow3UK*OgbF(NME;=TAh??Z;g6(U8a7@ za<gSylh!uO@#g92I0@A;%w#I@l#0p34rUf-rzPr+Bon?2*+rkHXc%brFgp!wq@*nk zJvtqETMGRMK15<`CQh1ry2^x5nE#ageJgA9>_l*}CZAFsr`|*3#IZ!Sfz$HI1yIRb zx%kx|UXH;iY-*Z4mXNE^qJ;Mso$TC7SYQm-7OmVOZ|O~X(BkAjGAr#Y0t56WxvxW? zq(#HlhnUl)?XQFirlV`*CY4Vjlu-A4H)F5)r))f|F~cfL&Iiv32H~rRQh7Q+Cqu2J z6xOrtwODF%SiKRi<VvnG$AgtiWtPy&44Mo~0qpXXkQ=7QrMB*>v*oC<&4HQ#&iTOQ zgR2}D=Qjj<X7?eC?Grdo>3|UO<(hklI6C>6Vtu)eb{w5V#N&F}alP%h!FF7R9d{j} z$}ErDLdchU(Nn~Q2_avuza5um$8A8U3QN012>Ej75yCb*$b4A{`Em~t!WKB-JhA(Q zLcZK2g!r`6gpe<{!;af!$6c`FuGn$+?6?PZT=_C0ze+;Lm#bsPHL&Aa+Hq~{xXyOm zi*{VB9T#uM4Y1<|*>N^IF5iwDUyj4EZdBgMLdci<#g02;$6dAKZrX7^-eTH{LdcgJ zj1bHL{4#`)FL%j~yJpAzYsWpZ<DP>-@o8%dAz#jh5Vp&KU%n9X<qp|#N9?%scHCt< zF0?$`E{(L2Ldch!Z^tdN<2KlFTkJT6FV6H}`T7eXUv^k7j~j2tZG;JjGrA9jkS_=2 zayqU?jj`p-H6Q#~FKSNx>vjC6_83U`lKXxTmO0>fBb~c>BeY-4xXYoBup<*E;Z2G3 zSHz4P;jiFqb;CYZ02O>BW?G!T!Vw>MseH`dNPpV7#KlZQfD*N!L@hYmi-c*xQp8O0 z;cuo>8wKka*ZbNo@m2ZzabJe2b|0|+Vy49T`;d%^m}x1<4btEb@_m$4HD=tG3Mnlm zikXt)UsXsn=JE{6din_e&`)su2KO-$+*%Ve?KS_U6ftf)gIsRIxannq;69B-zwk*5 zgwE6LxP2`yoJFg%7Z?R^F&YtoI5Pm71B1T~!$Ipvh-)<QU4?){S)rtt&_}u5V|Xnv zt})Z*Ffu7l%pa%Z(~0f&{5>vcDF5jx{{5-sLOo5`ncGa7T8`s|<LHQD#*Faq|LD=9 zQLk2)(qGttxJz|Nxc*$OpHtL3l#I#=Ay_#HvT`CqFb9db#1NAhS0;mq$+YqQOOXU( z_h*&Q-|h{q2qeowK>@Ii3f}oCnKqR$Mo^wuMN>SSusn~Lah*6D%tyGhTUd(=<f=hh z968O1>82&YA_W%HVgiM_5ln;fb!3*?z=^4(GA~$=Bh-~aWf7C092wI>eOm9L0Ew`a zBE5V`uL=aYxao2Jw#aEaW2PN`(rP`2<S>65vG&?GZ5LV}vfxEUo}F=9Wr7uTE+PfV z(EwS)6zfhbov7$(<w1caC@O?EW#Alo-W$q<|CrTP_RexK(^%6U*UiIYL`A8Bf_K6~ zkIB+0#2g|atX%D|v|k4Aykrz9W2Q;Ove%QnG1$rWl4k97us77l`IecT*v{Yuf%~Kn z2w1I;+t(*%+TECG2V$nPeo!!ly)k3Hqz=TXi;;9M)F){o{X4}?+ezId^@Y=X1pAfg znW*zQa3Bu-nIaOkR@<2ql6L~O6LAcUo3<|wh?vJ<EA8(f5GCtWR5EFQ$|R1dDmFQ~ z-5Xk!R~v5ZDr6CaMwjW@<GS%fx6G@;UR96Hmud{h@?iXHfxpyam*F({OY@5|oE3j* zbT32a|Fbc@3|AiY7{ze45uz$CLmozOS}cY12t~6HyntX7C)`Mcda@8ad<eKH2*ofQ zc?jXTY(U75;kF?Z%R)O5;<<c_P%nmqZy*7838CH$NApact{ghTIEJf$5RdDK5DvwG zEWHtmXQ3o}>@0+EL=a+EAyl1(zCs8`b^!MSLJ2H%0wJE?1%whA?y4Q<i&2BuS}TN- zSZrH__!J!wBI7T^b+zMYj*4TTfSZL-G7HVK$G(S<lHur_OP<T`2+?e&40j75UefO9 z8^Rf`H$o{al!OqULT8VigitDrea#-b2_c%PmEm?E#Php>P+x}QFhKJ)Qx&213|9jo z1q;!smAt*IMu-}58SYnvaJUpgWijK#7JY;UA;jn5fvPEI@yzk?_2hhm%H?>p_Ts8} zRO2e-;0#tceyJSfo8wX2ldB!{T#iQ-Pp(Q(1qZE=1}vH1D1!8B!UOh~eCLS27sLQy zge2Tb5{{IF$zsG`Qv|#qIZmo%A!;L(&WmZopM}WU`4H&<8}1QHHq@MjsLk*p1wtJd zj;P5#yjV-)LnI{*6aX#|e<_t0ygi8_is`~|-SC%m=*5NFLy-s(-ix&(vQ;l;_k4)# zuRFt$MUc&SG5=_MC=K_a49C2qAVhB*1&>O&bNp-wmT}xN9;A=|*3Z)=BkHAsad|Mk z1+ma7{3We<JjG1C@VA;^=s5YB`NinMDd2O;kfDI1422n<u@r-wS)1dr!v1^mCxxfZ z-=f93o;FXbpc+(|bqab3Aqr$av748hkJDQfHnUlguFtfK>`FIWYcaPmXib^6ES5$j zbfwd%O-u>ce^3;iR9}OQAa3p?Ws&+F%(iqkSMV>b1wmZo;1ukwv0_*jD?8b6bG%e^ z$waOmsrIxPOkIi=%}}N31vag<rNWx4p%=QkT!Wzid6ss4iiXk{0Ss7@AN6A%+}DBi zyh8Gt8GKrQ)AOZEFa7-d7pL`UW2$@^(V$D}@k#mu-|}%EjTzc_)N4_-2UPr_TGch# z>#w|SUa{`Iz%plM1T+a=pPF-L*_aB$MJQ$vO1oJC^clCtmhpJ>i1i~nt=bk47&ybj zW3+(DGaCYo8634Z9wYU4Nz!_GP%q{D6MR_GK*dsed62hD8ZR9`frdIF^g_hP;D{7L z0TLgV)Zch{ke5s9!SbrCHaW;0eUSqB!5&hwEaqW+JYncZ>pt`=gOQ5IP~W-K2}3>a zcTSkDxD$VTDw-#VKOUnNZvlBsjvHpI8)lXpX1N<?vm0ig8|IW7=B5)ybQTtfQJBh3 zy2d;JRhMJOfQC6K+G)oSO-;~Tcfte$6N(ye@PYR^;U{V}%?$&Oa1t8-xC9#d*pKS1 z90v?_-rQ1LJcjP_k!k^M9hiy0Y_(&MDu`wue0>ogsi#wj4Qq)cM)*yOn9++5(cd|O zJdB2u`aMO_kZLgg(x^RP(6<)>gdhCAu^*#hq0fP#QIF?Cs2_o;2*}d}NIa!_1MB6n zf&St;R^gjA0K)IGz?so7Tv?bAadu!D0;6!kbOL6n6D9?is=zqp$p(f>;*fa^F!h~i zXrAluL_;eNgmLg87lwgOG<$)e*5aV~2^gArIPy9N42{4J8Xpus#)+mSFqFzc6AKJ= z3JyM5q%z^>$w~dnl8(GQ$g?c{Y6Nz*@gaX@&-NWVbR?0P9=$jL6O`nN2_Ec<2^sB* z>F}K^rsJ<Jm`;J@JCVsF<kcyNT8k4Vq`xbs<7ih*rx`Ao&Vd_TG3|D`VuF8l#e`gU z#dN?V+DV?yom#kJI@9wHFSFDyFBVgwXTpQ2@Dr5I(OLEMV>F!9OD_%2g{693NX2Nl z0Ey3DdP4E?=ua%2e#?;pJ$pO`V!ZaDpu~SI?xbE?ajRszYS~N&P9XHg990Bn0yb?l zCIw*vrl;0Mw@S>FqVfe?GNucJ6cdrJI>DhC&n5=n0x(BG0tMYCYh5wqsKt>BoCMPZ zf=C5qygH{ZJOn4|BzdKh8$36xLu{nU!9*sELwAj`FdvBs7UE7%CWiI#s^pXiRYaCn zldZI2S6g4T#mX^UEDjY4$G1BCoiZ!ehRuQ|i6dD5pbo+v`GfNh>d5)$vMnI~&XwWM zJW0DE9i-Bla?nb#&h_UH577zOzJj&xLL%D9M4({g97-l88t=Zek>u=JBEQsL96~u^ zg%UuqyzT`u$Gw9<tR4r69pfNk)#0GvZynKv)T<*wVFZP<aLLh?0gFa)oE)Y(*@nGS zU|7*c?2W!{a7Vb+cKnL<t=>5#gm=46zSZk9-|E(}@R1?3eCb@1P=UDU-Ivo(#<zM5 zW}C}FcR8J>q?u=7zSZw)owx~fPOi|oCK!k_bR0L)$kQSSx}=@b`6<Oz!!R~>C}tRW zJe>kSK|a_e^H_?ZKJI(WPfrVTRO(d~RYB+CBYq$77eKQy9|8PmObo3GAMq~yqJX~w znxF!r;%A|9{B9#I8Z=#oGcq=}lH=D7(dnR>EzlJvAI&`%gQnn>qWO_JmVu_$2%gRp zKu*5rkWp*U^cd;F&&7v5jYOFO4NpmWara?Qb1^gMUJ+<%&|!2k{N8#@e#=0&_A&VF ze@uQyL3jEw_&s<`eq~?9dMPgY6;|HCh-)j*5FPzOId}cd0R9coH5$c8*sPGzNoKYb zvlG{((OAzNg8+WiMA1G%1JbQlh7kUABExt2jiz>l9^OATexMjd^=k&NVFEvx1?nv{ z)ZWnughV$6G*evZB=ZR({T0`2frjqc4^t2HRBa=pqQl^IEG{;@OB4Kwh);=Z;*3p< zi%bZMk5V>KP`Pg4nu$xvdH4~ZCtnSqb1BmDJA|Y~YSVM+bVhzJ7|>YQ>*mJ|riYs9 zSSq|VmX=?6=r|LwMRH3;B2Gy(>W9;^2F?S_!F<I+vXE>!xH`G`wyy>p^&M4l`PIW8 z{)f?&cR{Dr+Ej5^HZtJZfP9TOexzaH2mkiuO_-v2_wELkg1pqy6K9}E2T1uT@Q3Wr zU%)T%<VKSWZvzsKrGO-F2Ch&Sc}dTn!d0yhc_XnKKiBYha*Hyy08jBpd60~hPkjNo z0y5G4N<lUY!bRz_x|3{7i{?xfKV7sGqs!+6U6yT0j=1>^n-)lu2&=k@e2dfP2au8U zxfYQ0xlWL|IDJ0nCbM0Wk1hM->T@$>B7Nfdk=1n?!mj$H=LVvoXWc4JvhlWwNxCY+ zjAJZ|(WfYrRBy!F)ef(6yiC^sDbMSGWQWwnb#$@APQVe5AY4@ok&R}iOf+f6&dsJO zsyY-b=;<`kL!Xh4hUn*~uw#tse7@qT-eYiyKgyrvr+V%tApeHEB-33$MA2MnG}-Tc zKoa30AjyjbJytI2R6Dqoi_($KtKwQ;3xD{Zy+4T5Th-}!1}eHYczjze=fUgT8<6tE zvoe!y0K)BykZqHUY*D7i7VWXxQ58Y9s)B5Of^1(xwm=uzRsh!)*W0+RQ9<}0^d>%* zlEy+sJfOQFBmv9!pE{!rtCD_x)GLvP*F+CI9@gNz&;js2ics;vs$4}suBCwI$lW2{ zn&BI|&VKavj(!h7P50t3_Xzi5o9NGzu)kCWvMC?HH~~KawnF8a0@xXFDj@Nl4oCvb z0;H+nY`{r?ZvxH$oCip4=L=i`F1lI|9PwO@YpT6S^f;EJHo@uU|DLA!es?hB6@OF) z(iOEgT9cw5>YnN9T|m;+azN76N<h-p2Y{rjwSc6n4S=MpO@IpkHv^K+Uc=?8vloD? zjH?x{^;PkQ|53YS3))4uM{#uKyBYQp1aHp${Az;>k2Bz-cZN~`B^V*Cb%=Hn!{^8T zk}R%$&vwX8^6dev3Ah)qA>ckhm>ahrkYqmqNM%g)p!ae;9kmaf1sxCdX9mCn(5>*p zV<(#isq|QeV8$_6i~=NM6@Hk8)D(J8p#-)dKB-gN2?Bd60)CZ29tg;j4`ufxEr0La z<OV@v^rZBoWYhuksxz_sZuWaUN9vBW-}93p!o}EeIt*JGtgjEX<M1BMNlu#8_durj zRY&3^Kwd7JIWv=0O*z)oskyTb_a-Q49Z~#|KB=ClL~#PX1^O`3aZA7|fI)x?!1jQo z6nwiox&t7-+-0`g9T07r1Q|Ua&<OYrAimZZy$#R|_zmDtz#jqet<~t0fHpwVRvsYw zPi`2X0&qAW6>0=v3g9R}`aWw6;4DCV@iCfK;l}~K2{-|86W}DkPXQ+b(w9L~0e1mT z2RsD$I^YSw8Gsi6X9E5W2%e)K0nP=i1bxf{d=78{Ao(j@2p9>t2rwFO3E%+0Wq>aO zE(augTmeXSt3iYJM~_>+C2rWyWmQC_Wus6AzB(?7DuW+KGw_<eqMwgDGro?ki1zj) zkH=+3TlGV%XzuU>o)}54<dwZ*m1qrOv_g@dDUD7_j*uj7pQ%rm#)ilCY|km|iLEB} zFlltZumoi)Jd8KAQ>e4dL!=bF5@W)`xz>ok3-j`jx;9UUf~WVe6nLFZOh`#ijDyHw z;cz4zBoKQRNgN;6Ulk6|!~J3-Q)0L_LYgu~rioNWB&kxudSX=O<?$|(yl+@sY@~{J zVBZQU$fu=K30$4C3k7H|&^i^sm6rUBM~1;Kag?fWVq9u`6xUfu=2QmPWYLMq5mBnt zgxD0geUFGzDphdV&4md`eWc|nJ}KO?D-%&$5n)N_i@cdraWqNhQ(SE-z-Kr-PAA~- zl>(bYSMsw_-@tw@W{r<?yqRlyFD}VEOlwKSAx!b=e7!N($jpp<wtI3BiOHfLbya*= zFS-jtH}B1SW_uRrHCqMu%~8p5VG&W0Xk*^Y)4GSOuXR;IVsd;~9NHL9<t0xQo4~3X zt%P^m?&QGU?zf%%R8vn5g~gg|!9nQGc|X<``cwj5%gLMcGL%nndQJ|p$>@6}hN}|8 zdqqXyeS@pX^Ts9hfX#e+lZW@F$cnilw|o0`@K#0OrJRqSnKC1v-Q<xyHA&SoIWaW} zuMgqu9rcsM+*p&4jlpUdHd$LBB>5Pp`+kYZk*oyd16_21P70u>NwSGttIcdw#Yvv% znj@ClfTTcfHWnAwQ;F`thuMHCRS6&CVG${@ePdGwsFL8F9o<qCldu{|$lQICgd}gC zT4m5%c?lJeka>G2ozjAV;8$Hz2T`=KpB0Cu0E`pmI|c$e)t|(VIWcq8puPT>mf;<o zqDkw@*nv^16nv!R<45M2tj#gt)GKR**%FgsNys&7aS{}scrg>QvZ6FWnn<Qk;y`0B z+`ubSl9@eONxf3P>ahvb^q~b-G|~d^yW9_Hi4$o1MkOm_6BF=R7jKW!<aTppHiEoF zcl0()6MR?`M(yzrzV;F_=}^MDpvV&hQpUz7#i8>>{}CP*(VL~tMgB;g>acGGFyZhn z4+CT3WV;qeP%q1h3^Y!#ezHRHM$bE=r#dFhV@hc<!wM;ODDL|)8>Kr1(XuKhTB_0* zm<yKGFsbojLmLE(!d9{jELo|T@~VSKaO_TYL52*)r}iV&6HC%2t6OFzls%OMAFcWL z)dQ`QV|SeOt5)#`a<QV2&4C%?^*j>XM1sgzWl~(&01Q{ru^3n3);=y4-8ULiR5C_d zzED&QmWmo$Ah<-wVoamD9*U?qK90m??OSw2PY5HjAWKOiAzJ~FMM6fTDpL~URmuU% zl&E-BRNtrs)NXQY&z@*myd>yXd9#<AiHp@!O~hcpfhg21b!^0E<<xP&6kwKd4vP@m zgV4Q^NIH`7F+?Ku)0~|*ZK~1gq!^*L*gay!(o;sHDwW<$&!wcf97HqQpf0Hm#i_7A zShV#VGu!ZOg|BSToyRjirf%^4Q@n4s-i)qz-)svRUGct{&NI5=eYj!X4Ec)p&4&3c z=!*Bvc7)Lt?{lpY=A@6~o6^YWiubv;i_sPDbFGpW<=e~4r%rl)m3o&>lxh3PmUY(# z=o&sSx4XLi`g?h8*0izVu`-#_E%UkUduC#T&pUMWx7J#@u(qQ1#UU>bSyAucy~GDm zeLDY*XJbZJybre<jPCoR_h#QZ8P}xA+k@|W)g5z3)9U91!OfCWDu-O2aIya)EKWq1 zA^D2;^)`di74PfqIHMb|uu|TlGV6D5UpM{x?}k--uzH1l`q0+n#`O&uy0C3;+fF>M zm!*7*_w_c4(G~B@>L8;_I+$@K@#v_pQvC0pd9>w=k3MU-uKQc7KkJzp`Fq`%vpvvg zo1pnAyo&c7m(A#k_Z{~UqbuGwR#|V#w@0H_ul{o+XV#?HeG6JC<{a34YjVqt$9B#8 z>yT~S#Um}^@SM-++D_5G+hujT&6PLYA3v>Y-$(n*OI}%&*Cq1Ts1073+h3c8=P^cC zywAGd7+uYg7lK-Sf9jtuZ?^lc*^V#od+p!Xe%Z-3IbR<LG?hQ!tsUMs`H+0Y`?j0G z=ngK;81PM}tlHe6m*?kn(<$R@tGwRVw*G#5>k#jsqpn0_Ett_2?*lI!&xZ=HhO6H> z+sb@%{@Q{v>WX`-w)kfCMoZ@f{T8kEtyZaC-OCsS*D^Xqh1f5y9m(FiI$-fXUB{2u zQ*Ben(|7i^Z1DDs2A#L8_#*)8u)f5vcwc!sMpwMAye*8bc%OCm8C{LM2U{v{YIgcg z$dr@+AA9cs7S-{EjbA_k*9P|Pim2G>f(=kWP?~@pT`9Y;Qe_te>#EpGu*KdrVv99) zjXhSZNvyFe_HHz`?>%$x-Yt?}{>moL_kW)6>hhj@?wNMxOt~|2XPW=o%;%S#_RsIu zxxF%~$*_*;m8Q=_dBeP&)WU33;$QD8bxt<VkEwgTnoWJHYgNWdFU%e>W1F<r%QYo1 z5HO3${qxy&x0&2OpKaHq6ovcGXWI>Ca{qj`-BBj@&u80}D^214^O<#VOs;xChN^M% zYF!)u)O7KcCL20lcbK!T`l#`j7ftrad(w{9N9|;C;q&wRAN>CJK{lO6jY*PU`0Z}Z zfsdOm=oGiltiqI!T~pCa*23VL)WW_?pKDuQq)l(|Y}uOJ$IJc*I6M7f*H)GXwtQ&( zx#!+n*EueS$(?voGxkQ-rYoN-)f+yzk(J&1jo&M~o;!XgqV|*H{XX_YBlv*HDIYyA z<}%uD>+{>4O3(J6b9u(W<coJkeb@U)gL!RVZl7KUO*;mOq!!HwxRtxK?_lSs^2evB zmK+Jca3p7a{*~?(PQ9FwsBUC~9^V!wH_>f=)6e6ABU9VvpZzpF_S&)$ojxBv@=L9g z-#vNOZ0L{h&kSk78J4qZ{aP<~=gGlqhveK_-KxX3DlN)KdyERc{zRj4e%E_7=J1)^ ztSyZWy>B<=`x;drz23L+uFvKc?}|wypD$0@{jv1J{*M;pt4=1@d~5mIQ|{d2R$P4X zJYdVG?3Dw0TON46r+)6_^5YM`dw&RFqSqp|;Kts}zB#!={~;|(^b23=aM*J4t7<OW z-fBYp+tzBBV}|+c(M+y(-Av~iWh3?`9V@>ya(UI8V@eL*aQFI)y8GLCmYh=IY5>-c zFuAi=?pLk7`>fl_(0%I?&&1l!-*xT5wV%ok7}PXlLzBhyPSqJ@U1~A^-o8q6xe+B) zUi+3EGm|U(oNZ9X`uZyWnB2#)5u;q1W6qPwxw_n|Wk2m^l>_Beed~C2=<M#a*7ukF zAIjEfJhoj(;_!<c_ngW7adTLMa@+4USux%_z*QAtaVGI{og=GSUR|@|@-aJwAKvu5 z(215>)YyD_V4cYaTW7m%cG?i_|DkM~hUZ(Infkn8kK#3B4o>QZ@iQj(OG(SnDrN!E z6?=#8{4`bd`0SPXiz;6GJ!;1EmdCUGUZ9=6z~n-1SK4?s#P8Ihb5VCT1-NYK<oa=r z=ZwLM-@BA}b8g$abbNJEfx?~sv{#kN=a0P!+qrAlh5lnyGk$%MSpLMMm*F!CtlsyX zjdnr7<i5L-u92>ZnAQHt$^Gqp+%pC>>LY2=Yu&~wC6yg*8Wx9+PcS)uhhFlujP5;_ zSL(dVcR;^C?geD#u1y#@f2jO^PPgd?7U0X9iWF|WmY3d?eQMpmVxXC$BJjbqjyLwy zI(c%{%)8q^*S`IsHOhD*lS}AYx^1)cE&CH*)?N3x$MD1Q_cih?v-et+U8=Bbnc#I2 z-yt)(-KkHfx((^*n5l^9y?(x@qUy6FBd6ypkFIY1TzPe*syE6d2D_yeJ?3XMn{S^c zOaF1$+-H>r%{1H6W#szS<Hikl4R)>8iq2kEF}Z&}!~7_d`_L$$e8_Lbk8X(xth*^| z;P&sW+SZkxOFZZPSBZ&JH=K;YdKvVMr54Ghm(_k~IW51&hJ9{RRe_@)w4Al>*!bCp z-8<Af^X|>hSsa(a<j&qOue{c-OM|EKmiarzHnnM6KC^mww~LE5M$X7>-LTS69Cv`p z#U8Gk*WkJN&z;TYEPk`qckTI+Cl!zFv&`?e>b<Mqz-zF*O6c23EiPU@-@a4tHwCTF zWtsmpq4J~EtJ}Q3-o|0diG{rm@2Fny62|bET)VM1yN=E*>-xIE++oFcRNq%U>&lMA z?AyCsl6U)mOe~4XkR43!MNY={UvthLX}rj-+U>b+HxxC0R24)I8rAZ6-l#>Ip3xZp ztV-dIKXv_=r7eSd-mK@<KmJ|gGU<~ZjDG7pF8}_oBM<hf+$#lN5-_>m(WkelLY|Fm z;%FJb6`Zc_RqpJ3`y(56TWxxDYipxvj#xLv<nkX@N~mi;YxkD=%W4n*@zm(*xvxgA zv~rnyeubua{`hO#upX-#h5N3NV$g|;6GpvBS+~U5_eGZ1kCVPTXQgWUY3HJPXD=*x zhjDi%_bI>MxJ^A=y^>zOacn!|Ws~!lmN#(q&#zo**J`C(@s9{|9g~~d=-A?(4}NgH zdD!>q1FxJ?R`S(8OG_xC?>~Oyv&3q5E1Z4H<VIZcj{1GY!KoXqXW0j)=bl`0qg=zY zw+BBOm2vR#;lrOH<6E8Lx4d+j*Qf3$$9D92GH0fGUWNYhxALTGk9)svwLfV5Wm>l} zg~_F@wXM&!id47Wc4ofg-AP-neCTxT=eiaZ+}t-P?(V2P4eO1VTuAU1C-e4mKkPm8 zxv{+N*eN@<N;X9NmG!;lwO=0GGoLzw<C@l>a2LeKr|kW6+Gua{K38(D_Gs5Ob;0rG z+x)7o?P2e=Z-p1+#xS|n3m>e?X+0$G%#b5x`V1a9Y|xE{zP~*0ZfTS7WJxRQ&u=;I z43ism_I%Jj>EyR}<KMR0*=ymRPwUH0-IzXo{EZ9Krk5E1<5P~SQ<K8|<^AZDzbZ#> z>bcW)#r4-iTg+cLqW`Y9y?mzjYCQN)yAhap%4BknKfhH3&)+yA{AKDury)JM99v_4 z;DG1NOusb;rgzPb-OX|NOzupX)S7wE>YnO)=)#}J{<J9=+@YTDhOPmNYc*+8qw|?c z>+v-x{6zaZ$gh6;%!LDN<19KvUmiT<aqZfv{qFo!DJDPc=APD1QIE$mxtOEt63*rR zaP-XPS6A2EThjf?!*$D35A^hTW#yh|f2RA7nEPXL7rV5|+|#Dsq(Pcjo{uX0ap%vS z9j>;??zis5t*mNRPK(gad}4Cjw=92Lclf=Y{#(kgZ2H}R@KZkpmUatVeres@&N;o} zYV5+;9p3z<7V;CPm7iSQs;+osIqSr_o~agNpRcP@a>m>d{c{`7YQ26o=4qMS%$ilL z{5_Amm+!RMD)V^r;e#WNpYE-m5bpn7x2n!NPXuz@4JNmHxz(A_X5Qv)T!Xf^KYnri zi{yf3!&;S<tx*O`>-Dep9CLV53b*mh-*eR`OII#YwQki8=OflN@37-V@!(i9jrFnT z3zybxig{rs_nrD?<hZ`mmyQilW_+~Y6zJjK*<1c<NPWe%h?5Wewmm?*%H*;W?dof0 z=30%**<LlW>F|m7d~(m)mb6_sZU2e`V;lFrgLMn&OQ1e@HhfH@(iT0MJRS0G=HX30 zKE8L){Q1VQmkxBl^K|)<ryDVU#N?_R3ollw+mw;J+~-Lqcj-~#a#Y3ut6tN3RQ5W& z%dbb5zBmJ!$yKekt*x`9&&+b40-U>jI(8#y{l4zYIuD8|>veU*s+1Qfm!5VM?u+YF za%!~w)V#{Ddlrjc$DFtud2GbpiLUOm)~6gEHg}OH+EpfZIAqeh)Z)Yb*i}ruJ2UD@ z%Ns*(b!=Sw=$V;4RCQjQx!nQZg)q5@g3xVqH$IK%o>Jk^z8iaMN9Oy_`&4zx)1DD; z5)<nrf5v-WT?)77rDZ#Y?p*z{;+vBrRm;}o{2<-4piv34?<dbl{PVYl?U!;~KPFeo z+TUwe&$@Y|n{`tzXzqBm!pSz9mzA)%{b8kNqi)li!v3~0x#>+yY90=$l5*eeLxE+` z$&(LS25y>r!s2zf_0|JJ9cE@@#*@iC4@#al_OALvP_#{J=R;|cTgz=+vtr7VMll6_ zd}N+0V51@S6hFtvGMjp@%Kl~f@ma;EJ6;PYGy12%t+UKKI84f0qN#QjW$k+==ltnP zzb(zZcZW~#nkVyFG<(2juSYM&9f&`%Z*b0Ejbd+c+)XC;M`CvK+`L+E?~d>6;a#hH z{vhRnHhGhCIwhG^7<%S-w@|FZs7K*8IWTT<^>J}m<}P0G;aR5VkD;e$zKLwnWy+re z{!ICP*IvB44PtWY9^pMp{Lrw|1p9^8Tn}~YJEY8nGHqVRF1{GKd;EiXm#1KP9h2*E zD`%wN)JymC9-bXDfAP6Z!}A)hwX}ZbKVwE<-TF&vTt~ZKpTb=qUhK{A;F^O5uV}cr zrq9&Vw+GlgkJ-E7oZY+WKYt&#E*9SxF*(cQt6PSZxBPgqaz8GwZLjUkmi<1u^+!c) z7qwf1Q?nl*#+qLyx47ib{_&euUGk75YOam)TDbd4>%&uyb@Q0pD!#|_s&~*Qso#LY zU2%hpX)n#YUd|);5I5nt-SB-4TCd3Owc+f{cVj;8$zH^9Lz!H$;%*z}^sOHvyF0V? z;0>*Rw%=2E^^;ZOPu95|+Iz?+ve9EqE<5>j&#6DH&aNG-dAa$_i%A2<SBtVu3hlD= zoy*$o4Ff*mTOssir4}nsS?|fQTKv6@kNvM}Z#qtvhIBYrukp!7XG@o@(;}x$4EpU% zZrBfvR_48Vwc+lh)QsO>tq*Qoy?UoDhsK-TY4yvC{t4#e(Z6DHfg2oVZEk!j;?CRm z8Fw#N>+SV^;6l%kuxl=zua5}sIH4Whf6<qfT2u;N88_9u^8v47b4Jft-ty-|e~kKN zg~zJkY4sK;W%Vba&gjGB3U0+EUfWoA%lE@O_J21vtD5JC8Pk>iQ#Q<P8`FI5+;@1d zSjpu2?Z|wv^HI#uOP80gZs-`ip!utZ^B2oM;-vVfQMJ8$nsIEQh1BA3nes!2y&W~; z&t_qt)VZPERAEi+7G~8A$!oc@{@6DKC`SQ}D1P()yno~9Pf>&2YK{5abJnexEuSxU zuHjN*^}JV!G3zhoBOSAu+~>JZCg0h*YWRac=hRwVX4-DYOtXR^tu!mV>}Q3{n^7Yg zcF*Kye;oeK-zV&~GWNjEb*pB)Yc+DPU5$1v?%tZ6*N1zs5cNxo#uV<*vRjK!vJa~< zvvrkRb!M@O4=(xy_%&a3yx|4gA!D*5Mxp&>at(4ra!Yuq=apM_=AO^GU*oEd@3y3a z{l2T`lFm8W*<XY0onvx4N2k8OJoCWKW<U8~u6)?v^OZ}B8Z$oRd5(3gQFBF>^K^WX z-h{#(xvcM`s4E9r_^iMBOT&+g9-i`V*m2VzJ8CvucI$J!cOP4DTmq9zIGZzx`_aXr z`9}HJvcnZGe!9~4<iPru<@RCAHwXJZLH~XWlN+q;Sr9Vu+>IM8E?-IBcxdko#k*<^ z*6x2iwQJJwJ>gSPZ%ELFNG<;PO!;n1?x<Cx^{FqX*B|yFDn{0{&5}w@_m#VQW$2<0 z`GKXnjy>`a^Z88fU3A0bTYY+$ZgRBzgZaysc<zk2w%h&E4{Q2uos)UL-)k4F`(bh$ z*9}MvZSXwl?yPFIZb`eU#7-EUJ9O}>6SYch%uihzit^^yjN<ptXU|V#aut7eu6cgM zGF5ub!QrxURpkzsuaxZi^Xs)!ejC^%^Blb|JY;eWmK@*rgU5!tllv=5J(?A=GyeS5 z@|(WvzI4pTu#rE%o>BtsAo?6qi)qhhR_?r@!l7X;YQEBhUD)Avp>f6P2XEdefJNI` zU8#z30VcQKvwf|LIliBE*Uyi-;IPBKdf0;fT{mQppYVGBjK}^p)^XfDCReQc?CPp! zx$`V~ekxmO@q?x}4ourTrSl(3>mbLps(}GF@SOnq&{B(=iRUV+ERNnkeQrtnNfl}@ zjM!@4bl_fF^J#5bzo?z~emmM<CMP?%u;kFdQhUwTmfcqH-m%<?h%wQfySTNkz4~H) z=1*fHIPN8i++)ZJi>AMMx5R&a*Xbf|)<<(LMcrT$`z4xi3u|##^8X8Wp8lJCqKlRX z+RfF9xUH?Iw|{$g=x<7`+L`SXVVXTAvCk*A)5hlr*zMRPXFk#f#RmIUe^VN@hXIJu z;|Vd%-&TqI-@6&Mn9fvu<5A=-VGXvajfLO3-LQ+48w#~4w>K5jY^vjwVZ#5~hTTQf zo4EBV|KZTLnJ+s_1<KOj61E6F3CH6Uu}uAsJ;_bCt+aStM^PjDzji)1U368^x*dRv zo<Xt!hC8e4d^BB*Q5It}(sAx@Y<A(1H(gMfXlE2A=qLS$Tf6Ht{xzG0i+f+2!e~uX zN9ym_Z_2}bjrP#~W_|G+j~7*6?4;BG|7?i<&D#2R_AqD5v{Isz&?o%cgVRh`8(_cs ze%O!d%MQEgg236iNYlT4^1*=rB$Sl@Box*E2<2;PK%pP1&P>hF9mA?KchhCD+C&jH zI5v=uL&5>A|Eg`K{f~&7PCfGfB$TZGB$O`#DPqqYNA<;Hd2%7S{56)2wqDyGp>uxp zk1f&J``36V6dmD|8K)vf&(Js5BKn5JDwHwubkm%2mmHf_^!T9Tkb%!u3h~Hvr6}68 zrYE+u(HZL01l$!8`LD4U{zXicX@YaU@HU`IO(HAS9owQaW7BDL;J>6%g_?HT5cOH4 z8bZt_?T#JVu1b-7RbZns9I34{*dqBR#*y~+q-{Zr4=68^@9f;jqSt7~ZR@{sbTIo6 zPRw|n&3<J;O2PIHacRml6IA3Vmh2N}6Dja--`Y%9D$(tUPS-VvMY0`XjE@X79%gBx zBc%qU4sdscLiG>3DpEAX0z?PTrAEi;%H=nk5RHQ;>FS_w_6J`%$%V7MifGr`PC#l} z8nys5jb|zpxFlt~3C=KsPw0l3GE)WH<G&Cyt`WaEKa{CPar|bV6sW1;mm)nCJ3#7Q zflXz|=nk1^*k4d&a&&A{RYqD`YPt!!DmW`!nW7+F7SRw{XOt;Y^r%Q0RHzLrsUmvD zp9wBT?VF7SBeO}-nWkxvP&Hwb&!W~%+Ui7=K-EcM9mTI{bOqlKH7XL($;zbcLX>8@ zMlK0Esi{q*0z{frfDLN@HsW8S3SpYZpnvpjb|WZN6_*$nmzb&7+x#}~40>??!PuZY zD>kjjRgJ-rw>&vEEn8O9Y-f64pG6m9qF<HM$x#_<Ws<2H6xd<9T-R~?woDdmCO$)H zih0K5D2%=qRZIF=h_RLQSQ8u!jGcK^MV@Cz+oO9`7E@Wo7K3f!q%+a4@$HKfMEE@> zW4~d$N}K?jlo2P7qTPY1L5$MtBF9E2=>{3TCVpRd%3dvzU{QBEn>AfkFHRoI_&#PK zfqhk>C3D0(k}}m49to51G8$|)t&hw@oa005dx{uSUE^$mr3cAT^meU6i)n)1j1V*a zg!Q6FPTOFn$zyq2(Un7;WqysZeCZ)G!q_4=YspcVnxI!zdAdpZ(EL`UMfa+Z1Y<ii zxuS>`$PaE7y$d5mFD_jPzf_dXMUNPKN>`=pYQ&;hN?fMQq_Jc5c2a6=qCBqXxr=O2 zCd*~9$*FOsSn7%nOMILOUI2BCuuBoMQ?QRjb+QTH0`;2CI8(ioD=;Qh^n=ia<RTwf zuR~N`5gYaRr0g^k^wIct=fc+D7BPNEtVyaQ-2#jxd3<ziwy8Su{JWKYaV=tk(eX-` z7uF9qT`vnpUicD=uW2q(zohY}rtqpY%?u+H**`;`o?X}&g{c+b*i4y1i~n%p6H3k+ zKT9siR*7$5kAR+pUrE|2l~EE-itmwlp1nXx*cn)pnH+Y~<cN}R2L-AmcSPjTUYFl7 zIXdHqC<&J)^3)>l2&h~pcS4{fTm=g)uZloPxHwSwOb+p*vzLgHaCstcjmYDQvAuyI zS4^NJT!P3;5_uOu;j?4NT@fe=SEIO=Clx515f2KVA3-ilpd{Qjk+)0a*;rz)PbODE zpd_41<P8vcBS1Z7a-#)G!c7<DW{GmkL|&fA+a>b$ioDiV{5hi~Id6fIaPvjpVv)B7 z)Dsr&dV!K~dqlbYqFlbnJ1g=EMBXEjmj>gR$^26bl!Uu2@(M&=B)%1z#pJpRl!RL+ z@-~UQyCUy_$m=H2y6q)U5^kc%%N2RAN@DM87RFnFl5o{Zv3=B$Z?yzU!ufzAyD!Q4 z36z98UIu%}GTteHl8^~;3a(<s5tgZyKK@qSZ+eYqRqe-n^(21L&sNZW29g#R!@YP; z+hWoyE4*eGo8iIH39OX@hp%lpj_pB=du1y2IG|k(anU?7AzfI+#I{n#n}Iw!8E2&^ z)fl+Pcj0ubk_ww;;!4KfG!^QwG!=(EIqCc-4&N=Q6YwlOTBW8F8&t`usl-TCt1{!k zkBx>8K$U{;_<;n?hpbWzNL46^Lp-9LIkh^5j->&{vhabaN$?k#7M(=M`>R$b%F|Qm zp57A(lhs+wU0N!o4su8Wp)OnsN6pWH5oTpZrvq6B1}UXyI*q8+Y0P7_Q?!B-uXZx> z$BAhgd?9=%-mTgRtKo6t6kPEHd5kMop@@@Xvp~{CnhJfoOhUczoW#dW9&2Nwlj2h$ zlaMY)?vi`fuV+u$Js$zxJ&OqBn5RIa@SS6lGO$6UDDO<mGW737MW|h!xmb*l8HA^d zGYn4|$A_nk<HJ+NiQ%EgrNF+d>`IF@j5qFKU~wFBS@a(?-uIvnMLO&z6Z8DZsmNM( z;hxqU5kDT?8ivSWhN_Gh!hR|><0nVM@Nkd*dj__d<}c)Oj4COG0~+{?dpa4E`2Dc6 zC?PW_pt1X8%n8wRU>0FgEbIoDnidmBNCkorvxSMs_t<`k2s&B;b;Xdy@>jHiS2yfJ zKYEZ$iiQaSk>P3lnI|fgfEfDo|E~Y1f&Zt0Z_<E&q_fP|uU(f8+;#Nr(5!Q2TmdLF z+@PL;D$S_3pwMuGN6mIwMp=WhVU!IhTSip@RgO_oP~{or0IC9`96@1|1Nh<r3R@w8 z@&<*?i9iK_s=}x+Q23}ByzZc|4GyTjps;xjDC%dTD-9|Q6h0mYl?4jhRDjZe!saHR z#)6VEDi>58M$H0c$EZc1>M|-1ls%)?gQ~}<ZJ_EiYA>h;j5-3!fl;SHHDuHUP>mRM z9aLjR6@Y5OsAr&>GU_d;W{jc(Pn$E!8k8fWY(P0NstPD)Mp56`g;5TmTp8sE%8gMT zpxhbd4GJIRBfSBjJQx)Q3Y!Rk*Bw+#M)d`S4NkyI0M(jNX`tFLDhpIwMrlBKF={L* zZ${;U@?q30Q0*AC2vmDU<$>~L)Ot{UjM@gupHX{3bzsyHPyviO4JwdP7eIAn)OApu z7*zl&h*8f#1vBa`s1QcsRf-E`lr^X@M$ubAXGT>470xKym^gw_4xl0#<p`<^qdY)$ zWt2ClZj1^5)tymcpn5Q>JE)$F>I<qDqY^+xF)9sIZ$@Q->cc1vC>f*1g6hktTu{-B zngt3?IC5bTs8~kjfr?|)dQfskZ3CrX)Lu~3Lp0-#fTBL68Fw0#l2I2x^<&g^P}HKL z{DPte73CKc^~%h+x1gx6V8)JHLgyBgwH5jjj0zYRWN+OqV1lo`O~5$(ksUZ;aCvt# z<b18XceiZ{1SERG2RHJOV*$7vLX;wCsi&{K_mBz!v4DU{RPAs96N>G7SnQ#>%ie&I z2OUM{C%n4_OoBl`U>pP86F%Di^qj>%U|giVO%MXF5`_3jy9JDVgm4GjOSfCY=WXQE z%hdrBg6zWrCi&WTC&f5yH^(Cu=^(_|Az(rzo=!NzIG?Fz<3{aOI|RWI{`lI5?ch-E zg~Tu+f#zicet{q4C}6^gfJw|bFEsL?w?UHrZ;S7Cm=Ujre~LMuA56=nZkF+6W@Kf+ zDx`k0J1MDG>ay1$*}P-?MShNa)R)vHW$NOsgVz<g3mA!P<I3jH(J!KJ4i8Hc?GW&J zFUvc2Q+5w>sBBINLC^vBBi~BZuG)tq-<D7}(A_jqSJU0JQu7`%H*GS^A1-3g$a6=n z6tcgDmLB=GrMfIHB1GZg1?{s@dozmP#~~;zx_m5JmK}xDR~W-F0A<0U>}WcZhFrjV zSX4mcBLNfkAvA9&!uK;SV1R&B@pBI)5cc@I7cw4DiHD->q!D0Kk@C<hQWWDbxTQvb zchj1=X${xj2)XqTdvem68GqS5#moX?gXk{O-m&bSQj%8t)aDP(A0E+4XVfs1M%q|B z5K6$q;`fz^p@9~3I#Acs(jyBTA?}Mv`*MS=2&{%$Ym<rF0B&#u|1gN%WjNzu;b|UH zQ9r$iwC}hI!yjIHSf1Dcf*J(&{YxJaIfJ?cHBDdHfq~G>6#R;@QK{#Q`U!uZF=`k7 z_Gi?u`1_PmS43WO<k~34^8q!MQ5`_dW>hq&$Ba^d8qX-ocb=yLHHY!&%=<qWH38II zMqLBN`}`af?=zi(!~1Ltqkh8VDuLpCt|{{Bg5rI42Q`7od4syeC_hkq7#l&oV7#rM zCNk=t1wW!wjQbt+8K2%KB4t)w%d-Z>>qV@AWe33H9x!j<f(;Di0NWWI4pkC7gvSot zs$c_xUEVT&>v&9<VrE>HhS6oULdNfpph73`?~bgL;;g6|IC-b8)*}w*fzzf6st9#z zI-Me}J^0E|l;FF+Ht4e=wX8!(kI?vQC|+pr+2MO=?%6>~l!lV5`$m+6!#D*?Wl4@q zhtexy19H6FJlykgtgT`7A!~nxmQ>pmQi(%LgXW0ZkT7aP0;t@12TZWmHVtS8s|nr} zV?DajxGRQ#ymEg8IvFX~54@`QQNPYXR4ymWR0ta7kN?!yg*8O^i*!jxR(j*M861b2 z$s+jCFX9G(+k@x&r>0|U0bPCmFslYUHz*b3ZgO<{ZEdM@m4=Q8eDFz+52E2UcCghK zr}a^M_u@4|KO=H*k|d>J6p+#}8c4nDG5GNrK@>*GMcxsCl5mCSn<?1a4?PR0*Ms!V zcScbBrLqGJ1gAQ+&H%^w&^9OV=*6Zner2lT4}WR3%Is6B<pRIdDQWymol?DKs8iCO zH@Jmr?+f)&yo}X173!k6P6JYWrwi&E3z}CSQ4%`Dj#Vrr>G(QEk^0CWQ9oBPv{~;0 zh@gSu0!AJ&Clw};={kt*G}&-pvf=Iq9VK|=h)Ud%8zMm^?n({VLu*J;3*ZWLMINC4 zqcieO2xT08y4?5$cg>BAoJt@WNE$tZ?Fm<=Dup+4mL1+&Ht@^r2m`k-oWelcWhfLF zW~wTfExqW9T>el}vh%)h@MTUVfNPXfB<u)w8{VIAxe6!P^43q4Eo;eubWu7e_ozUV zfz!31IB)z5f%H<d6qp8F1|%7(?D<?IO2ScN#PhBTl!P-gH{;C75iY82wbud=7A!QL zBDJh%JhQ6iT-ET3%ncPu?X?gD?}Deu#TLdh!+cZ)XB*~%tWbL`0>QiBDRQxk@mLt? zd>E8+?X?&L?}Deu#eT*!!<nL%2tk{kFYbkOnxT_dBD{E-D5vG)T)3(T(M*eF%(yb- zpCwM(+sJDO>K8A{2krHD{1RFLpnhKJ%j?t2_2k#-(c1hb79H=Wy_SIBwZT)QjU$X# z3V)X}%0{H9oS$I4D)_sMQ8h$L3M!xR?D3akV!?(rc#2|hn(-X*_XkF~iWH^oEaSDt z-xZAV7Aap)=NT^mfAbg>BvN6Zeq+2y{9VbY?jjWh>H_2S#otwoiW8{>P}dkQ34d2J zDov!+pl&l>7XGeb)L@a)fV#_gIrzJlQDa4FBB%n!qiG!d%K<mm`i!rn(JwQ&{%!xO zAhav^VbBMEuQH1Caf4CY@b@O8@JGDnfijHee8xHISlz-kvtH7xrm4RT>-$&n`undb zqlT9~=(YW0{T(gJm5r=YD|PA9!F$zioj&g^8?v^=xg}<!8+55I+1k|Y(YgioPEEKF zwf)4!(Vs%cKk>OeyuyU!brvVe9sO|QV5u32Q?8W_>UM5;mDT%~luxifp>Cc$hqFu0 zA9t|y<BAvB-wp~cGoaS;9+qX|M$~LIrg56H$8Mjcxfhq@+({q&=%=RsZ`!=@v{0AG zX}f)0v!S!x-3tbEeLMQm@-6j-)Lgoz`#9UbBz2~16S%HR+Uv!`OAgecmhVj;Nj6i) zy&O@@?DJ<T0p2vt(ag~?*UU^Ka57VqnkC1flE#tBOr}{J=9tu(a`J_=W?@EU#PDjy zmfPA>CCyw~m<3>5D8xWWkfCCLkjWpiYQw7;oopqriUBRm?5y}9p;q7DYRf;ckLcjm z!p)Ucv`mH*IL>ruz;UrL=D3o*7|6IujXCaA1`K3cP>KyW9<Ih5&(=m9H^%^Dj#HR1 z$C<2F-)A?MzQ!C^(vyLVTbeP)oowDfriI3s<1yBl<C$y3ad(_$%yC*|%yG^$=D2J& z=D6-M=C~a(=D43W=CrtA%<;Hx%<(KR;<RvlX3TMVYs_&b)795c3l|*9ZOCz@BV7$- z+^QIJ+@;2x7LLXo4-aFGr?(Nu!;y}z)ep<Vi4M6n;5hd+=C~vnb6m5GIc^$bjysN* zHT1bft}(}BmNCaO&xqscxY?NFM2FVu$Jx{Qh%v|If-%SSx-rMCz?kFy)|k`68dZ`( zSROXU98X#fq$lI<=;&a~aq=+cI0qPWTq2D*uHB6}ZVAR5_bg*h3ym?yW2`a96YnGj zadvWCWXy3|Z_IJtX3TLpXv}e?MNj(LaB@3s%yGYN%xO_z%<*_;%<+6{#Bp|{DqTM; zXD4f8j<bz1$3<$)adj}}xOo_J+`WxCEdq==9%05D&%Q<+7smu+j#HX3$C-{Z(odI* zi^iDaI@XxumTSy$pJmKxk!Q^DSZ~bn+-t;fbv$CsaXN3zalRmOPz|!!TN8oHoNK0* zXQ}OzQ|PWZeimls08&tU>&U3%i%VYy0~e5?HzyQG?nA(cV7`UdZ}HJYLx$>ilBUa& z`K|8{#lXVM4}W1g+`aZ2c7N#)y-!$}y~1D8I9=9X_#*+=!i*Y!iqCE7>+@gwL$S3m zqh6ubAITT~lwvaU?nUvboBZe0Fa0UaWGV<X5pFO+Ogf{h0uM;3l=;9<W%5id$48JM z{Zc6W^ctZx<A_5h;9x<dAR{LMc4;|7g!@uVMxI4Wm$Vnj#LLy#=2)LY^caCrT=aPk zI8yv{92(qpG~iG!h8b{f;jXU%=MC=C3^>+i{M)n6=c?eGHju&L>}(*Jm%;g{VbLkd z*hS!qoXCXq)B$~=DxE*Bc)rMh(+(W%#cP#qZ7;BR4h<;tmsW>3YTbx~!_)OR_CX;o z+IzBMOHQ9d)@#TiJ7gR;tt+x9Lm9Fa9Y=~gLk_QbeHmW!`kcP{u2@*S=JjRP>&viI zoYv>K;zrQC;EHj0&FlNaYhKH7gezY2#A%kL>zbFr6ALra30+5Hrlj!Yo$i(jT4gd^ zvoxKnvUqA?#>yS2t~L7g*14iy16@qUAS@ejbzvoz-rbe26G-}z;EKr@gk{TIX~P<K zVo0>k6~~(hTe@Lk5EhM9=)x*LVbL?b-k`9`3$B=qL0IJt!nzd^AE<L>FSued24PYC zp$lt5r)Md;y2Vv+#bgY^s%Q{a<yl_+bgujbS4_qrtV+yPU;L%(z158-JVk%I39guo zL0Ggr#lkEXf9>&`=k~fGK)AG{G)#u^Cc+=G2;LuJtpkU0Kqqqs9Lg)5%p-8B7|2+n z?IMm&rXe^K1D!vez>ylrD8O+vkfB!E!9ZpXIP{LD^JkObN*C4%Z~_cuZiC}t;Lite zB1M^I={gIicw3n5#b0W7%8$QK!wSMxUTBJ#4C6U~L)y@B+JX~i!08H(H#oW&D#7Us zjxH601dh(1$>5|xM#otK&Uyn5E%l+4>U=&5PLhGobWAM8M<??DoGb&Gzrg8kAY+3{ zF2_Ko9ynwhbfE_lgO$O;MI+Z1W*+(jv)V^o6jheEm<*#bh=cHSoQcGN*E$ZyhPg%P zNa#4b!MTn+gG0`OA1iS8aIS(*3(skmu8y@24DLxm(C9l~Dut>A_b^d*<x^O=m<-2U zMe?p_66Eh(-4<Li8LnAuLZS*so6}W;xw=lI!SxqhDAY2xpOY*}o+(dK;XG-4#}=Jb z_=KQL7L5;c={RbcA|oXh!rBjDX{oF@-DNQGWh{e*+ce3@>E;c@bJ-*0YFQ9PgAQAd z#L{lLj99+d@&Tjyx<^bdHC`4Fof3zQxJcSS&hQcMQ3rU$&nt+26DtIt$?8J$RjQ(6 zFqtNb_@!v?gR#n-<~5-&HUcGME7@f-WpbJ<P~|I+$%x11OJV79l^ko1d46byIxR!Z zo?%80-{JXivhc|Evi7u?JwlD`EV^QmHqQ%8QL5X~3S%Y_k&vOr_8}>peMSnFF~`~e z&up=0ZQno0Xg$()1!YN`)}1~}5Yw`>GP--MfH>_V_@c{CZJb3d>he{PE$oTlufZe3 zoG;9=k%Z0@V;j*q{^E(DBhg1aD>8IksD#cFV|&v%{^Chtj+jLj=7xV@>_ls_#x6v@ zu>--Rjpe_vbbC}*6r{Z)6$iomi3ywam8)Wnxc=#o^`$XYz3kT(8eL#o4!mTYa>GzW zmR=Yluh0<KQ>~F|J=Ko_>*(tV2={_k3`?^RO+%)a(aHvIFDEar|5Y5ly*<4>Ij@)u zg}0ZpmzPd?Up`>5=h;T}uuRTso;c(BSr*4vQF;&5*jzOUUsSM)LtBlAO^rcyA~q$G z<}F;L`j=A+Csz+w4|jJ%w$#bd(cRr$Ds^*ob8%u0`by$Pm*!@UbXPpXTu;8xpy&_X z6U!058rt?ukl`dYoc_x^v8`oTiwe2OXkJJS@aAmV=?~%46Y4HpkrSo6n4Dgxh@PaO zu?<jQd0{dyX9w`+!o2kd2<VBlKDvylm;j!^%RL|-7uHvQT7aH(N53+R=56&Z__tU8 zC50Yo@XN!jngh+9;i5*}n{)Kme=Q;YJp7y?lP}0M(8^&lL>)t^<S!dQB=l==NgNHj zH1tf@dC*B}IGep<{tImC6ve^6B*9M>KO1jv(IWKZG9fe6SWd4yL81xxjTK}Br!=y_ z!9<$-`uY2G35pB~Y}e8bf7%B}`q~+CLxX%ne1iQV?4;B&dX8T%e&L)My-gMU+cf^e zpJw<V2y3%j+fpy~G}g*D;9icPHS;_MD`V4BRjCTK)FHf~lvXb#D+i*DmbMr6_hj)} zf%v#^{w!V;H@eQ?M=#~a@$;hIAAjLnBbg!<f8tV8<o{za1c&uLwpgw}{oVdB!%#B? zdOC=gt*rxC(~<R|X2SPx#FT<Ll`(~n=*Y1nm@3{ef<(_T)Rrw%p)RxbqIgn7VZyBZ z&@INoG!*weK<X&|3~U123v2^C0Q3VM1a<@-2KE5{0_+bw0;G41W5At2=s-hyI01YP zyn~;yzIK`OuiIOI-i7FkeZWO)&BEYVdy&Bk7xYz@qr<G(W$#C$Qlx{vxYyGG>59zK zK!GGjo!|`opjDh6hW8m>eNx6skq<zwv4vIT@PL?92ZfrkkM+e|DUZH*s2P8L6R&N4 z6`y_qq;!(LYXV;3N7q^Cg@zi=1BrhL*b{ga2xFubh?<4KYrti|TfqImyTAv)dq67` z)&gKD;6q?X;3FWdYJ3751bhah0TJYZW-sss@DT6~@I3G>@D}hLkk&T-1^f(r4=jy% ze*{*i_?uz*5)f-SG!Z}xU>dL(kY2?x{HECmEDfam#M%y)?^p5K)5@rvgd*Ye8te}A zG0J!9+hZ_M7MGO73JohS6p;4P%YQ#x8wuCawlAKBnwdepI$Q8h#l|Nx+8IQKt-)yl zA_jK!9!D#a@aC&yknK1bh=|stf%kgFQ3_+A85G_asDz@&uTn>+Fd|N#g?Ck3+c-ow zhZV!*fil55$iB!Gjo<KP8!pKK8E62Q1_nw-=L#ktj?U<)EEtsfikyYE2yl-}GtEPU z#UckdhQ%U9u8oDhcx*9zT#d}eMUk5Ytb-q49%QNnr9#afOb64BJ-};>4Bx@3<op9_ zwRjh-f{TUL)p+N(wOu5-U=IW*`eAz@+<DL=E=p=1koSrAgw}15-Sa%!4@9P<B>|S~ zr|(fbEW*~3{9$n|fWMPin&Xt|=q;(!vt8H&YXtT^{{X#F{t2wh)|N)dgw)~NV05I? zwMnE!Xa(?h8grH=cX1Z2i4wUDk8*X7glsN@CywxvkGT?GZy_Va`+h7)2QkPL^p5p| zqy>jnkc9Ef-*h2DY!zpK$ksYy>7s#4qXav%2YFvUaAKi15kpUkPKnnKo#N^t#x;=z zn<WOTl@_ysUqs5<7y2?wdr|qO`feuRpuoozhK9;~B_Nq_Wndhz25<nd7H|Ww4)8t@ zJ2J5PqaF}-73To_1jG=&26YREwcZ+cpc60?=mMnr&J8#ch-aGbfu6uMz}CPmz&5~r zKyToEAcpca&5&Y0pbHS|#Wl1hI}8{O3<nMbMgV65BY|YL_(DMQBd`x}2T%t585j+u zLB?2MJnFu9U?xxr91ZLTq)E0U;6`97kfzVlfER)3z*|5y@Es6o)6{_u2LNes4!NOe z4;%vQ4jcy505!n*z~Mj|YRds`24Xe4W)BdP51IqOalkV`tZmoOO7e-om%#6UH8Jdi zX?cwua4IksI31V(gf2C?z?neW6=F8<EO0LH3UEH~9dH5g6L2ArO66*xCvYt=8@LWQ z6u1F+3Wz+>*jl0g0qg`s8>LYJkw=<b;C|o?AlfX=Qs6JZOTeSRPr&0q3)BE7fg!-N zz&^n9z`np=fpXyQz)8Rhz*WGDz;(bYz-z!ifVDAbcO7UCya{v$-UhY>-T`(N?p45h zxZekS06YwQ1pE#71o#s86!;eS0w_UQcm=Erd<#qi{sqhcegF;!egsYz?zaHZ25X9y zM0<<n!X<#kfK`E5E2(h@S^--DCBR@{DWC#q1Kb2G2iyj%06Yk+2>e~Re+R6L`wr*; zRs#kBYXGBwwSd{c+Q6YeJK#hhDoM>nU<2SEz=puqXl<N;VL+4}%|IY(I?XU3zID*7 z1bPAw0b2oY0$T&`1KR>?Vur>WXb1EG+5_7IBY+)%N?;%`1=ta&0(Jss0YiYJfMLM3 zz|O#9K$Ka{31AoC6(A-TH1B}jf$xF6f##^6`T)xUqk$EHalqO@Ij{~;0YsmPEtWOz zxAq4gBJ8Wbc82{I+7yBx0i=Gb6hhhyHm1FVe!e5_%`vbYYR0ybpcc;qEDMy1P_wjD zw%q|+)KBha)h8}qC73MrUdcnfehIN`z|!mZYCpB;3%2&6xKrH>(_~W!ben;+QhG9h zRe%G4^?+GGcOdFNjW=)zkm~NCKqYWEFcCNcNV?jDpQlk@F9JNMoqbK(z7So-CPb$T z-5}B!r9gXqsWB-Y>1m8QS`J|GeR$>*+rfe~NuC($jCxt*B`=L*XQ=BXz8`fb2f{^h zCLNJ<kibKiPebV#2c(IQ@xa=^NkC`dWS|#t3NR2j6&MVh1|;2F$Irt^H_O2zy;DEm z_wRI*g2fW76D)<4_WDvaM#e<lIWndU-k5Z{A)S$u|G(=Dg<X(F=Z_Z8|E(hNZoxji z0kDhGM|!02CNd7%4d{c?JO@a&HWw%bqD|FMUd{))0T%(=0ha(tk4u4FfXjg0fGdFg zfO$abKdb_d2CfF?0x|WcnG0MGB>ipxQa;SUudworXtMI`r^^TbkVu(7_3wSP@9m^y z?PZt+WOCkkG!kiL#gx6eQ<;>4t5-}(d6Z6rF1%hpsxO{tul__JV)|wE5Yj<$Jq)Y> zJO-=*JPxb{JPB+LJO%Uwo&m~$XMt2!&jCpfJ<&%o*28aTPf7PDf&PW)fyNM-DV~Oq z_A=DN7cW`*4E9Pz3b+o(1}{6Lz5*}})km*d&%othfeL%oA~Sz0N~B~Y%dp8ybh3)s zD2MLdCzc-qlcf8K(t>|f3s62e;(=a1(L0H+D64z@qI$w0@AO|qcHyB7Ld8X1CIAhp zV@q_XbuVlE(M>`#sg+Ix!Ka^k{p>AD1C||r^tMQwvdh>w1$mtXuAbNW-cs+@7ClE? zl!&pwQA`Ul%r)`oeXb6Ep=Q}K6lx}yEAp}!k6yL(y&Z(-XVFo_MY)v+yu-Yux`nnv z(!QJV#!PjABOeQL!jWx}Eyn`v1^yM-BH7zjAeHrNK&pFh0;7SqfK&$V0%rpYfaib@ zfn+V1y4Sn|J_gde!BZfq{}r$W@HG(qe(p~ojg7nm_5%I|Q~=)t2LnF>(ck4h1JSSL z%q;jZ6LTQFL=^*~-^vvSo&c5ro&!pN=udK`f$0BnWr65#aW+6FAaX%N8C)5Nehya! z*cn&@*c(_2m<Fr^91XMsqJAX(Xnp|J18xU403HQ80HHIkF%a{}ToWMT#5Ds_jynP2 z2j>QC0dxm;1$qFJfh~bUfvte!fvtfvfo*}b6wnK}8R!k%2W$s?1Z)qqM%D)d>i|Q6 zfxyndzQAzc1Yj5779hgZkg4<rUIog4_kewY&w<gvPrz7UDHH-Zurd%!C^YuKen1~! z3NQee3JeCSf%Hy-_bJT;-~eDAFblXAI2d>WI1Km)a5&Hs4d4i1UEoNd18@}32M8T# zux^N(0HnR_CIOcNrvPa$y6M0guv_RzQwKO3=nlj(4vjx>9<U2=0Wc1@5SR&E3>*zy z0vrom3Y-aC23!IB0k{&l61WA3-TgE>fNOzNH?PCb&8V+13q0z7OvSH*Vci^o!As0@ zCt;k6)y|F((O%YC0=deME_;JBnH5}C9ncU*09bbTvC(B^A`NJ1Yegy8dbOgq_4;zu zlgfJne%g!TOXZ!~swjbp#V)K51sh{y%s&AsvRi>3z#YI2z+J#zz}>*Xz@LG+K-i>) z(!U=_db*9DyOEw6QaJ>_E-;`FJ%!7$8zsJf{oljNRK@m%FM5iy0gDn?!<H14F7MB3 zO^UvL?Me=%;Qf=%s1~Lq^G%zsd1(z^Is9lySs9<e58#t-*W;(XD2=4p@_=Om6N_?L zzv?Kk26)GSPQc^9c0epEV&nFwffI0l21s@4IpAjCZ@?qK-+`xrSiq|}3%m@x0lWgd z55#z`<{|Jp&>Hc$4J-@11FQ_h7wa0*eF2d22=BGnL&tEQg!WURdjDr&pkW>bVY570 z2in1w<<MS8X)kLn!A$v!eg$csB0kZE8FCVuP-0yGOD`8`*zP)58Tf^ou}ugCYp2dZ z0l0jQ(A0wrTc5?N*iafVrOb)mv;cYU2&P_M)A(6;l10k!4#&D7WHj55r=e!To`qD1 z(!k`4oG>(6Sbu{8AS2Oh=*bHEg2l%_NuFZRMxTMQX`=vK6i61(pszxK<bugZZ$P?I zEoWA&0gv}FO{tDeV2;O%a@gQ71FN--I|JpAMqK3QEK!!7?7|s#1=#o?#wEmy@}KON z-j|9A{AaKivWe$FKj2Fs_50rd`vBhq6~K?ck-$$tilSLD-i|GR8*y(5JO#7@o(D>R z7EntmAm%2x(!kolvcTp*TOh{JxN<;@RdE%87~A101Eq*tRbT+H8W3XxTy<bSU@hP< zpcHrjSQmH#Xb(jD%GC!B0%D1sW*o2)a09S0Fdx_ih_c5u2i^iY0;#Qa1|n^o3lMSP zT!Hq$7QmK34`3+J6DS9Qr%?l20ds+EfNO!?z}-L};C`SlkW3>0_!NltTT={eWC*Z4 z5PoXBf#E<J?~4GA0!9MI1A73E0($~!8Cn$Z8n6$LECKxhO%q@&kjDAqfRliTqh=~F z9+(GA1g-&Mr&?A&%tRiwFsdKgfQM4d_Sx#Fs~`B;TQ)l+47F1wUIl{MiyR4;-WZGU zQh_%))^nv2#kXJ4f;Uvo$eCU_6UPO->49)jyvS~mY_=~L-KHZQ6s!s;1!e+WfmuKr zJIMx8Jvbge<M)3@@Tje7gkPsZ(@DpODG~4gJ(xsgo&4H^h=iI6`!{Mw0BSI%;1NHE zf+=BECP@?8i`-M%U>aN#fjI?nr}#|;QuL++DXuewG))7uB4=fr&hh{YRTQ+=2Qw>i zs5E(YF<Pg>voS}8eJU#n53F?$VzN;URTubWbo>le0(Q2<`a`UD<b5lr_b@3HQx|xq z4XKLm8F{D@L#nEKph{GxaZ;|dtv$<cN~T~`{9d0j9P@>hq4o%FVSNlWaWn+rm!2-` zl9HH$Rd+IfoEj$+w%gE3S%^}BDVaErFU~-!j^LN&7gE@XBO{sC1lAWstVEG6DOf$2 zB&Vlxc!v*UGt%W;T|ut0D5niDOqnH5l2JcUjC<WLg#2kJgI^g59h9=&O~VE3f)2!4 zN|{0_Pl{79i7crgKw1)K5VaC^@MDm^1e+h@i<DNTE@TFNAtTJlYK6!nBO!j~mS*CF z=r}-Tu%Smf88*qMm23z}gNS41kj(?rB58isPb*pnqKlBv{3Td|VFGGHWP2s82(9E` zBfQK`@R}S8yDeoKBl=+|fb9@V+19S6bu9#-EsErtw#qqIy>I~)D-(~=b1<VNbzy<s z{eon{p}v0j6B5d-p*zgDm`0^m#z3G$P>-+xnSW?_uur6{U0`IePZ%0!E8E)e0pmHm zA%`YnS+bSwEmR6TFQk2_Z(v9VSx9JzA7;?`NAOeGPeo3&k0Uw;Mj*D@$5Lrby#C{` z@b-F+-Qrn<M91v{JGjB1w2oCN(F61yck>B}=n~Qa+em69q7zd4=}UAB4e)8lOq(KJ zOp}tF9<Be}CoC+;PZk~;>=VM(gD+QD@rFc1U{CP<I(PAlz{24kVSY$waA1f}5G!;f z#&r9oSh$~0kjytQnALAjp+R3x&DI_BnFv*swpF7U<1eE%dU$GW`w*TZ2H|YqX<0j^ znwFRP)8go|c>0uo8j%*AB4grYCKO@5!k2YZrue6*!{xCu=+)ZxzOiSKc!%MAtAxjw z_{X%dPYAYfX3olie^(a@3%QJ8$f#GXZTA>>9gbznY9>qmp5>ph{y6o_;W6^j+IE59 zhMl4;Pp2i>DcCeSJ(;<z2#KkBE@kamty%@_#|D9gv9UTCQ^-&~2N?UZw$0IFun}11 zH-&zTe-g-!RY2LtqV!-nmQly5D1Ox;5p57mIEyB8UJDNw3lFuC?;uyVZ<m_Io>Rap zjh^$duZ$;!#hztPf{_!w5Xltw8AJzm5R6P>;gPS_{8RQ8Pb1CZ0~#rWNw9ibe9#as z+Vc<e6@WyrToM!^CT6EW&>`{x><Q`U7)la+M^vyGHI~w2VOd5j_UJ-`YHeFuh!ftT zbh;;tI>A5CS{f5J<9RHeG(;>0F`R$EA|}HMcnrhpQg@htD3lL!qvA`#5rc@e$JSxm zm{IO66P#&tPhXq#ye40c`0^uzS^}_}w>+K2iBeXGNz0hMHRL^Ji}C|fQxo~pMVk7% zqRA3($vb1YCnlaWmCrvQO|kN516~K77aR?1%|b<NZEL6JoFBqrF|Cb9e*7c-TxMEg zzSW07t1kt#W<cw$nMbyeGmHuPz}B|K(WD{s+XrK|QfJ?^<^+mEEg6o5Q@+Y{Do<2r z9N|N1hhoC&jM{p!76w#UXr!%|eD(>}fIat9qLWyZsoJCWXoMS>qIPj+#eN;{6UA4? zf~pINbQ+nGsqunrZM#)3rda%~j80Lv$AB}bl?6#kq~08S^=13P^XZ|OQ+ChgA2Ab* zfHkw2P?G4S0B$InOpumIA?+c4GTvaAAgL;w_kq<__{cR~hF247+g?1Ew_c``!Xv>a zO3Ej@9d&fe!}URZ6Q`(By)#BHs`w%$Et{o}OsRnom|*iPzRo;PusdGO81S&RZ7z5t z$EiZfSoDIeZB<(L(MkA*hc|3v-I7uT{Tk@@px~Bo#>8rfG!rgFf$d4h^i>Dk|5-cp ztr@Mt(z7$<y&o;pB1KT!v0C3>`l5huA@qz;#*$S?4Z=*Q4zxXh&3MwDc-FSbynjBr z#FJ9C3ZZ1gFyj#OdpDmqyfHB@*%9@$U@m-B#=ii_SX1+p;0@K3Fl(K;Q^*<o!(chK z=BMQGwnOoQUtJ>T^@iEQCOzMo7+H0s;4|MNXiw)<;2CRgChEx>HNIrqY3P__M$3|D zpFfH`EkuOAgL~@RHdU6Jzbss0=95P>*N&J{HNkS`FJ3o#RT3-2LaD}!5}FSx<}@Ov zojql?O{?Tsj$;L#SiYG4a`lsf>Wk_aX8067^;{8t5MK3I&g#_`*dATKI$_ak%KH_h zj7g6c^i96d$QJ1v*@Hf&wQV(CjMY#G(I+mG7H_IpsMOi2VEDWf@)XOz*<;GoFU*rw z<c0Pccsnh`c9@og)cND(EsmK14P7FlVr9k3^K70;v8C*%E?XEML3}!fqfk)arK<R5 zm1+@#Hdkzr$l$;1lF68LNOYO3YwIZ&?F79s^^-*o=EG(2qwb)b8VDIv{Z758^N(1H zj4Mx8ch-e0|1lv|^3-Mw5E4YyzCj_Ps+LADp%uOmF<-N^=7kmREC$rcq9u@em5MUm zpiYV9L*P4R)ajA4Dx{x2TSyLtNj-jq$$yu{w1k!U#Gy6>_81+<%%LtsH|VKPs6^?r zKlWuJ6Czd8N)##(tRzt_O^bZsU6`=Shgj}>2wgFalPa__+L{77adKw`X?+Dg8hoWd zl_MDiIUmETiK0Nom719}-ba6&$ir9qWITmeD}2qQS5nYEQ`JH5zKEx;qd>t?B^}87 zjrSVN{qjQ(WMqXjqs*V#dg{~WFpFb`HZOVm=HrpZTOJG?1&^h>uz2vYw2pu>hTj>L z$~#p@m{Cbdg>_M!zKkkw_%sLzmoOU28opX$ku7NuS)oHqKGQ@3g+&7`R3It~3Z{`2 zA2q()Okg=qj|#2v_;640z6d>U*8P&<+Y@Wsw!C+G)vJv1j+Hlq9-ToyQpPH^|Iu4y zh0egbFfL$i>nfxYiD89^jH7ZPD$yF)Z@j#a<E-2c=Tp*w?`vS(3w=F!m(H49S{*>9 z!y6>|LZKRVPh`vn=%pT#ekoYJg$$Q5d*078h02@-w_4vA;cW<(Mlpp`k)^>;c*1Ly z`Cz3Jr_jk1w(~;zJw;Zdp44|N6S}lW2U+@lEcb%P>?=bg5u;<wA`9y*^S!+^-g+tF zEO~SE3csl7X<%ww#0dTi1@^2YLUg3q1P1xBfdLw%K=7=iCqzsZNz36`<Y;&ZPx%2r zs@7yo%cprq_|BLP&5~iT$lCS;pGJM_VkJ?bEqPQ?(GWOmx#{B}%CDJ1@Ip6<^~wLi zC)T*Z8H+aS<B;kLv3eGOQRcI3s_|u-8UKPFUwG4Hd2ycS^Sv|SfsAGBA9^kX?J+e| z(hOTxUZ1PKs9#y>`uiTMj8z1M=O*9U@rnrLKboM{?(cGxsl(7{dEX1I^ko=bw6^_G zXXC7-p$i{KllQDxPz7Fy%4DqXB=kPQa8?x+AA{1(YQe&k%3RVbn(&53A<X3Migl;N zs-1HD%Yq|g6@&5HkKsE~YHAV-ez{)C#C{B^?{DfTzAB-q2(hq+rtu>Rd3s(^snltR zQl87lpRW^`(Fl#RP(h1@gjFhrC5!2UiYsk>kbyJx;NKVZ9{<wwxBU}7j!nrE8EvA# zwpozNgayDf|7>j=ESNFh;|ok>*-JVuq-)QAV|KkHjcsCn(qch}`*tO{9mS8&{%~*V zo+Du;z1$vGh|MXs@8s#Y^4aa0Va|xjz4h*M#B$8VyN5nrb}TpcK-#CY<`w76+ETIE zeCJJXCN}lQ+Ds<b(ZafFOjg<I4=)vKzJ2qLPkSh8eN1(Fvg_FonN3$WRU-p#GPxOp zwuirW`FTR+>}luDx4%=qR7~!Qqkg^as%tG?pWW2sGyC=e@mp;DN^)~_&7a*{*{dqA zm|I0!<w3tb{gzih`7ZRMUuVxh**6D}JAdxow3nBI?Cciy{a{gT`0Ln4SLe9Y3y&=0 z`e@XH?(;CgMr*L77Cq*c&YV|l-GN;{PC9>jK)H`Amn$drZ#;5jSJ(b?n|D(0WoykL z7j`o4ap<{Wha&CY-u%3I|JFUVer!8?<(>}lzPGCd-12h3HxHQ4m0Eb!9{S|3vuRVu z1Rj~wNILz*ftO<&Zn&^-=9_%=$OmT~ut4}alWRUsxwPd<r%h$nf5@58s_W+?sS5_p z%WUa;-EX}`{H}>ubb)nS@UPO4`_7HdU-_%$_fDtl?LPRy;`kA_#h06=9X;WgQlg-> z6I*`-xs!|HdK~jesKVv<nU&UB5fP-$vsfi>e12DBSF5XjkC7jkD~DXodZ(NQs+Q~- zm#td5zunrLqstr`UD)3(yyD58$IT<JpikEslX_B%S}T{_YLxn7*4pf1(WQQ|aX7Ye zL%QdjZu3@3%9XBO?GfsOT})0|GI0OXvx&c~Y&QR|Ryl(Ym)qFl+Us8$)?Aod({uCk zJFu79m;jYp3|96m2$^{9#*G%2uOx3gw0DN$U9|>l_dlN6HEH;s@ToOXNieyJnIAWo z*;wz|Yu9m?oB!I(=a-%K&+pc`y)vrFu#V}Krq9DVA0}ruD)F!Pl{zPz=f~8&Ud^Vy z)wL>Pr59$8n6XV->*bmfA23&HN#VYWZkT+lPw&!Aj+TEgfB6#6oe|e|yI=ZYO~0*k zGVk|$?Si>!CO7Tb%*ve?R5&!OMa@^5unRlfE;O!K{ou_T1;baCu(P^?xyw~dZog;y zS{HMCKkcrcA9cZDhkf<11^c^h$R0o8_5K-;{cEhlngOiMl3K_PE-X1Tu+(0&wPm*z zymu^jB4SK*=PquoYp=eTpZU`mEL_ZBa^dsy`yc%N_dzzDMvY05U-<2A&4G`bF6b1u z&#c0fk6lwy&Mz>zKNk&~5Sce+Lq)|-%j8Kj++E%(EUgBQj2|#{&#b<?2EE1lKWhrN z!P5n=qSrUfbcp+YQHh;netRlwchq+4c;8PG4-7l_L+6cHC&%PwZE1AqeY+{&*QomF z^}daFeKxmvS4<lDe0j?5kEI{>f3z6ur<mL)mHBVOCMvdcDOgc3seDVtUp514jXUzT z^CnkyO8(h;YoKQ=IF?#$IdyA&gOd}Ii`yocExi8oq=`50=9gH$?)8q&b6W(bbUlsr zeN3);L58Yv^J-li|I~Exl_ncHUU!(YuKK9)mlsX;$a~TbYxB6xOfL3t-Mj|R&42D} zHfQmht-fo|k36Y(Y@cO*zg6#D{RUox{aIoDS!!Y5rO&l3FVdzrc(!a!?&D>D1e~3I zv1=>K16w{c{@io#t?M{hiOHRKQZx2O)}||;E7co5xRI6J`;Ff#yPi9KC!+R~<NZGN zoQt(hOiuaec`=vKc3Yp{?o@iV|D4M+4kll`GwQqEM;gp)`*QnqykmKyu9R9dAK+H* z(!PV8qskwjqFQn!{KAo(_4!x2S2*=@MxwfrO@FNKV{&(9)%vww?#`2g*AB_Kx4Kn_ zZB<&7kM<Z9eEo?=<@~PqYOD_^#r)e^zV?(mx40D-Upx=k@+o`efZmn|p6{ujJGuP$ z!|&c7!deI>*E{<37FEczkxd*e1Gs|I)xFA{oo|0+!)~ihk8W*kG|drv0x&sl?9J?( zlRNYu(xODa@TCriEhoRK=CbXrCd9vOt%f;fL$M|S-_=Mh@*h@8sB1rK_m=w0Y7hVM z)adHDuST!5a+!O6g{FD__-os+9*W7;uAAvxqin?9q+{imMlP><b4<y>8}43zQFnhk z&yrIrTn#`w!sO0gxnH&R?z3(yL-(yqJQHg>f7i7K*M2HHU{KSH4NVq5bHLgVEKEc@ z6Ca<l_s?mgz0Lbv$-Ua6UE9<J$D42StGc#_z1O}KUL){*2$OsK`K=;&{>BmEFH;9P z4e8P4*c$T#2Rv_P`mH%Iy=!*tZfuf|MF&!gn4{|w&gK4a^vvd0SJ&KI(*4TAb<0x^ z^z?aU<(_DNru&chriaO0?9wW8Pn&v^25DY-KC1A?oj-SWxY{PW-?|gGvZ`4*EkZhe zU~=DGN!Li%M9gac<mCSLKJFQV8ugJh>9uZSm6FPiHVx@h;8G}?QVV~FUh=ez?md=Q z>b%N#K)*lk1!U%~O&B?UsQi9Tx9JBKV2ultYdrJ!T=mJ)l}l8uTeZXah;_|7?08W; zIMz&KeeC(dr8S#kjXsmhPPD79nVD-fE@yky$fm<5-t);lYg^KG;k5lL4vcNw`wrH+ zAZ)2cm1E(>Ds`JOa+mu&$>c6QDqN1r7+}?FT93+Jhj;n)=+YPGmod2)*QeyvX#1&o zm0|ZR7QK!+aX0eVh`SSA-Dj;&IXrCcB2Ro%$K=X2DSr0FqQpJ64@NW@JL=t1D;LZ5 z4Qk$5a`UIpbu9gI0#UD_%t<YFr#_wPHl(9trXr&E`uU!Us?Uy$oSv^dy1Myu<<*g@ z-l)f!9M@w_dPPat=ER8n7rVae)I03Sc$bU@38fpCQH>p1@H^VyqfG8_$fS3v#fSZ| ztC)IsX4I3GH-_Bm*tqu5Gc$Xr>by8}8w)(kVc{a$>G@gB=G&*q(tjK__gSSuGtIVi z8M(goxN*Z>gI%k&%Kn5kLrgBY^s?FyEvMzz*s#xSsw!~wgO;<_9UDLUuzQDkXWqT} zISbzgGPw_p0?LQ{R{ZFen83Q5vIcJd-l}a~>AA#n?thh-ICaCx7_9n1=U!@Y_J(=o zwRT+^Je9Z1-!ZnSP22LB)x*18T(mKAMsDkdm43qdWF~j<^7;0idcP@XeJ;!VrwNrG ztzO;c_4PImQ%)@Gb$CbhdY7<nmB~%|T<_F8^Cbs%x7|=CKEF>yr&;YCi#K#Q-}~~9 zn;o5&qHj>VB85Bt)b(GMwhZohvz}M~_;-!Vq)&P<`mOW0{QJL-JlLypuN3sdnB4QA z<auN7sy_rp+q8B*loq+Q+{QI4raWmBQ_#mp=D7l^HWo9v+mAmvXWV_dDsM&qaV2jk ze(-wzj8pEpyjNjcT2t|m<#CR?&*YxY?G$@__R|IP-z}UvXP~7=_K1EBd^;{Q+nn~} z<avwpdtu!;`o~g>KN7Q>=jPRVdv|<i5ARyt^9Lypw8@*C(<#ZU!q79vyM<z1HIwUc zD`%wN)JymC9-bXDfAP6Z!}A)hwX}ZbKVwE<-TF&vpng8d<kp85dow(^=AgkV8g8!X zGxhZC0d~)0_HH<5_ip;n--oS>#o9HzSxYTG<@X!6sfVjq(#toFZD+h}a{kit2Cn}3 zl`HL9t#m8?5$*I8CTDqkb<42wmLD%x?#Jb|?X|txvfoFy{-}uUqIPR=YWCy9*h7KI zEiU=9fBdFZmpmkinroxH7Vf^%`tX!v-8|;Ditq8f>K*8$3Hqo~ixoGxnD)}V>*YLh z4{;NY+YR5>p!JIUUK`HNd^hIfp6o^VhL*|w@_zKnUzMXb_1tN@;`-~ME#@yA(SO(5 zUOrQMH6Hw@-3a8zMJAUbjk=ZH_`tGfDNAowzA?Z5-DmdOG*1_m*x~mg%k$t4l%x7c zi`2rQ%Y|c4*S~kqZl^rp{c7qi*Gun@A4-VZdDrJ{<iod@Q0J<doVrJN&k{d0>@>lC z;WgJo-TDqGGoehI*RhK)M(!T}px)&vSR=`y%t7`WHbzmV#3p6L$)j-Cv7A1xk5Z@y zuv3wnC78rF?IGYr@=fg=lc7wCGfk9~!sJYpu>M9BrOGsAl5u3VLKzP|Ca?)-(?nYI zlqXE=DSw=oi9N-}e>f~#^fVqz0;RNUP9=57@^Eh$g+VWDV5gFHQmR!^PL5F+k7AbS z<k-xynUklZt5Y+_s0_RaN5Q8!xxy4a#ipjq;bS3QMd^0?>8ey^L?=lj)EPMOEXvu@ z**OY3{v>B$MMHK}*Y;777@1H-1xJ8%a&6|~+04bo&B-%LTaq$k)3N!5GFkqwhN6m2 z68-OoVMA4vPg+`%G8SiaW1&Qp8p}oH1EMf4$|fRp#akOovAh>n9I$##k^Jv!33eQt zk)AG3iOtqeiq1+*m?4;;Qm9O<ErmKRJyY~k7wvB`ZW9#~!MJ6~Y<6FaTam0op^m3- zFihnctS?=jEc&KXo9S{J_KeA*{~!p*X37*@8T>brf)#lEa7a#(noeD_P9wG7Rtm5N zD2iH0Oa-W-P&Z&sP3Ms=;a_d~T7w;6)KnDFVv}Oy6iQvr6wx>SlVQ_jf>_ro)cj6u zqPM2eBF&N(;-v`-S90=yP`(EIC!wVLC!whRlTg(ENhoRmNhqicqSOCfGnRjmkRnwQ zLg$=HH+Fb#O0Q9c)sLnthFM?4Usr#aE|f0<F@=)SGGfq6ZJLa2!c%ohGKJ6ZvZ*Q~ zEe&hw#5%A@{wmalIax%{RM{%^zufnUHf@%P%~f=UIyC`zqF(<Eb7NnO>P$ix#8>w# zuui=2hVZL>()LhH-&(`R*fi|pA*!@U)+OeYLXE^@F`($JPK~Ck7zX}JW`=hv+9kh` zxPNuVv1MPPN2by(_6s(3hS4#Y7!*l2X^p6W4Pfy{x@i=E&T490behsMzUi4N`;f{s zzN*!<6{b=*M5wd-ueKed_va$`q^&+w^62!~Z+nS0c=sy8FlAx>#F}J;mtF@`^<D^z zRM?oU!9&q1blNvv{Uwgj;cyazmZC^e*E8(+BrFUrEDc|6i|7n1QwveXS9_#2MS9mZ zt&hw@nJLGm^)yLi^kVXhlsyUz$>MkxQ+Wm()gO~CQq=U)i-UDy5k*|j@w3Lyk_)np z$3`v(LDN1NCE2m#L`i55T7lPHpd_@vDCf=Ou)`>$BwS<6Jz}~QZkr2~ggXd|mpdX* z5{~wr@L_V;g@aKN+HZm#&Qy|imSB{GqobfOZ4Cdg3k0Jiw66o#iSe+r1EVCg=K<G| z@rDQ#w&}(iA3lt>0wv*;A}?9w-4S{BMP4(k)8XAZ3zUT0j5RboZ<|0#xHVWOfvHEt zZ@oZCINF<(=S2#Xgu4I=Q-zSbB2W@ejkO6pk9HR&3OWUasXfTO6(|X}3u_5@-d=%{ zaDy?=PakoYWLrTHCE;j|EYHKTK}Jcq98kzo$c+^!2}d7j1~J~x0wv+-Bg<gMqt%8) zNx1EpTj$;G7AOgKPvkumd2KNl&daqEC<!-1<jod&M?~HUktap6v1|+Rvll1{w@u{j z5_tho0H!@57bH*;t^(#Ed0rKPf?a{C&E%d5l!UX#3iA-ga}X#A=Ltpea%}`k!YvVb zKZv~ZBJYC8D}_L%%s(4}l5i76UarV{1qw@55a+i7CE*efD9=k0C<zw>&#=q~KZQU^ zI7J<-4Pm@~0wv+bf`aitZlXX*xK*HFDB%4lP!cX56buEtvjQdIUV?&ofcK|BNw~^( zv}Yjkstc5a^8tm71<y~QBwP|GWEgm90wv+T0|f<xH%*`<+<H(@FnF5<O2VB4g#f`j zBTy3V2`Kyr?}b1~xE1!;)Qa&|3zUTI3xf5n6-QX6R{Ho`b-(E~o>jFU??n~CH*_bc zM;(>r?i$5Dw-u+Ua41R)_u{#kIqj9Af0^M1%zwD9<GD9}Z}Iytu3`wS45C%FCGyE! z7r$b#D#o{iJ%C@voU}xHtGuOshS+@>b4#u&jH-;eHCGi*%a}{Js{e<*HxG}Z*y6uC zBtQg&1VO=dz@Q*ofB*qe6G&j9fkYA!T$luskVr^k78cjR0D=KUMMV?^S8xLr0T(nN zSHJ~v#~pVN+&A=k<^7yf-80>jpx68Q`#tX;Z$Hn>xBAq6>eQ)IRo&HPat=`|esNYu z9Suw^B)tv{3LS~tHYPS4Mudnf25FLX+s4FbdXiS_Caw61G>X5(G5+R09NtM!1KNKv z)*|AX@EwN4;!fi?oS&cH>HISJjpCQhcOORc%i)*H{TOg8cn-hwaE}M`_)WlFz^{;B z5kFq%Yf?;^O8Hgr<6VQ8>Ci6$gZRzjH;3O`_<EJqA#T3Ac$Uv|_kaIJEnl(?9hzbn zA#_BFeeXIDMJb*S2tWy)?(f96zXf35TA}myZ9?dS27L@6bl*4PzMp*`I`PC#z=l}b z))pP5?52AmUZHDi#J!w>>Gq$_y*s`?;=V(~{ccj`QK`_iKH`2B_YCZzs{j|`8oH7q z?n55`zvKVs!2iGj8Oz<5)1N2uZU}EPS}X8$%Xb?0Zh3Ua{XgNRdwMRXd=BydZF%UP zo=f_6H-1t2b+)eR^7AitWR#W7Kjs#$>HLeG7Nw_rV@Bax#=qE%_>!zxAyHNbD&SLB zS6pI!M_KY!5e!INDY!bQOU}OSqApIF=R_Xy4dOacU2}1DQdcpvk_jdpu6*N*D^FdE zaRt;RXV{Kc*Lqw$a7TKai>c?2M#+hm*11aKY)b1Kb?wJBPF-@o?O1hnz;(8|icv}v z)ioDamAV$=s#I4j^NwnDb;Wgwx{7gKsxJS$%!Jsp{k8j2{B>yw+5WoVV(9*PX$d}u zu*@cObqG6cLZZL+l7vL7rs<xULLoks^%C5w?qF`4%ALP%hrcc}q3dqkcCfmItJR&E z;B!&81cfSBzxvtrHLv^Ya!Hb?cAzcf5c2)l6lY6NiX)f5c5_PL*%!T+e_n1vT&R-N zFD)U@Ut1p|HPi~_)x}8;#aaxhHg)n@HJvgE+10;*$1tVL4FXi3zFxYTe{y}AzfKHn zt9D3KlS^9p7wC<qrj^*4xuB_dKk)&7a!RtLezjYhNM?J)evv|TZL`igMQq3Fap7B9 z{qN`VMWgxL6J_$rYqKsT<`j#RYg)k0WXRUuSaIR7sC%+i-Tb+<gdtITn+jNM*783W z#)~6yc73%(OIhSZOPPv`@~2RnBrQ3-N*d&ksruUt`i_(uGUzL)VUEC{nh|=tB^bm< zu733@T}AU|&hp&N@!ZYz-0>8+lWIy@?XD>5HRA6!s2tbXpuBriq;v-nss#1(H(f^V znROJKcCX8h@roBjAEKPyK$KOmUE(}*pC~5(0{Y<N3rTUk1o+{8f8G29(N2CjdK&1r z**|YqLY`7)**?K#;zN`9{dFOl)A8vfHZ9z@YM)9FJ!f6o7C&+QvXeypIQF)-DfT^g zLhf?l03V@9OQ`Pms#MRfLN79ch$Tt)T9B4d;Obrx0jdv0%J@bL4~KVTa^T#wSx2l> z<WtgZX3ICk{@W&#ctu7FMPyWykhx%1f(Xu^6sGB(MPwE(go$tpC(%)kV)THf-)7zX z1d+Mujj%#GNWc0bT({!dGAm&jAlH9e<hn(gMq|wD)@B`zKw3_Y-8VK`x9X;Q-ou6n zCn3d=R+jjJwfo~P``g`=FHBjFqdy!y7A>v1N4~}5&FC&WBSDmT(>+HL(Hmq1UXAi& zs+3S7p3*!>kB|2o9V&vHEi!jn$UipHf2{boaYYb<NVKAzfJB$fg>CaSNtI7g*llKC zaNxiJZ~8-=@J@S%tD!C#r|3zeQ~Y%q$^P!oFG!1xA*W^Ju=hkK?&SJbGVUxkF``qG zjbmPF@}6h^IB+1Gq(l&*5nW5alT@slzuipJ8f~T*dDYBGe{%g)&Gh8d*r|Uz`Cy~T z%NuV_@{S&w7Zp+-P4{HF0t`YsT+-PY9_u7Qj21_%nyFYFO?XiiNl&cDONyJVE#)Nc zpEq+S9;#Fj_pf+^Z!*cYqE(kckKS6>c-N>o@(Ho7!%PpUCQ`YcRKh-O*40Ztlm7DB zu28;p^CaJSQU7JQnIdhX?-7%fWDJm4jp(QK!ztKe<S691l7rS(S#eRU;q5G_r(~<@ znFOiP{?mvV@>eQwy%aEP?nJ0bxN_~mGV3obUQcvk)6<HJ5}pDnwlA%2TUy;Fl$l8% zHEP#MjiXhKmi`1ua1#O3XvVFIvl2Fgbk|7p>gkzJY0|=wnw}C-ay}&!X{tHaDcC8y zpw+Z-l0Bs*zJK4ak`I<NRD2g<N;?DQ7P4{Fexm51!z4>_6&=vAK%5TA;nv9;+bpOf znv6rc!9Q(;R^-+w&w8Wb_7mIie15`@xYMA0t0^wBQ;uN&V|IW+hP^dS_Gaxl9qrd> z4vol^(|30^%9%WRbE7G>^Dj6^fp#D$Qj2h(2=z-dP|K3dpE77~Q^dq(#jJz`_-#hv z|Ef6>NWIOvMF}T>(a%f6G$lEw!4O7CZ$a9|xJHLtQ$ksU`qL6-m=ZofxGq#R$k-TC zf_#;)5fPJbj!-9w(dLP7k7HyJr%j<$!ZFcwcyy(J4L$y(xUwepr^Q_o<FHW7F(c99 zvL#xa!XSh56J*a%SU3hWEadALp%4^SO86Hn-1=8#YDSr;<%@)Cz`|yv->{dyP9f|V zHVY-PP4Tj@2MILv_!Ab&g2JD&@N6<SQkYEIhK1s?Stw3np~3kHvq(=^$R{yv7V_b{ zPzVYuCHxB(?*6MXJxdy17FLI(kZ&tC!oq8zGLnmY$F`aMK0y3^0;XRae5_RyJC^8w z%B4O8XjEMcB_E0HYNqZ+u|bK$gCz{cnfVE=aHrMPqeF}YMQFP_95r2MiRsa1woKsu zhH=3sN2SV*7o`!yV3sr4+DZSki#KoX3RQ1vFFFCd1HG|jPHvPH9nvr%k`7kE7x%nP z;(L2H8uhS)#d;;omIL)pHReU_8S|e52lll7oxkUP6Z6!Rwl<jwc%vEo$@p+44bz}c z?j7c&Y1-qG<DB7yZ(%kx1^2cyj5*XPqKuWY@{qK*Rd~4A`?bGrzrXH9ThcU)zix}f z(HU^R7Y%9V<_a=tWQy%wFY<}Wmgt`sqcitJf1OU6vE9-V_|ugqnMJdL!~%-Au;#dJ zvo@vJU)L&OUTO#DzC`Z3r*;q)i^tKdTGVd#H7J2=eqXy!)Ajkup1EhN)Yo4ZlTeq^ z0Xw*BchUH=Mx~^q5$Uc~Ey%s=fqKZXxMIm6E+U76)z8TQ6vLQ|s7#%uX;BQ#l`P_> zwYP7`qm@LWQ&@Wkh07IZm&=YM<%+B7X!}QVBN0hF&J@$+lbO(Jo>O8kPeMy~i4ro! zPi$64bcwFX-jPD1jY4adFe9{BsKM*9iRWH=O!03?39li(qls=w>8e$(-JBS~truTR zQ{_Ug9o(Foxo?N?NS9tDu50OKmw3=wM9!qNT5kSAWgLsAT51L)EbG67HTd85EmX1C zc4kFJT)HA7R<f?h2!#~YYBu1k$mF32#8>!|D5VseF%6ccVIqf8ZMtVY<{Lar>%u|~ zD+Nv3%ofX9^krITGB#G@Yf9mn7)Q`I-E$GK9X4!{`f;bs2z45INLoU%F`3mVopcug z>oQ^;HMvL$l74YSN&C4<+M2v5f1Y*OF^&pp%8(m5n>2N#Y_Bx+mWCzKJgl(4JqM1H zO!zrdR#^#2+asq5nYwaY5n1c$La3lZdGq`%{E0gywsvb<sbj^w)L0=+r$7Zlz>!gO z^2VCO!U1)$FdT4g${3aj9RF6eTXjN;KRVGQbj~S0ig<}DNE17+R;DfEv~4mI!fjc> zv@}r#0%qNXt)<!1OPpq;Rw-yjvj`=vJl9S`3S3Y$&rcR6_dKT>xzQV?eI;O#%$kk& z=^J-7bI9{jl^;_1QL@gmkf34~3DP=;uJ>zPLvRwvl#sI4CLskqA>AIS8ehyfQ`|a# zjEYn^dst?BrLa=ttKC)a@v|%BD)FGyR+nAy-}YCh#Cfg+XeOuJ*ey>;1w&=<w~8oU zjKhq-t_f1))Fd{tCb6tVt|lY7j8VEK<XVeM%83A&^)XZEwJGP-?jKpx!Hy|kwOB8r zAiS5z>HW6J<aLFl!)kBX><TFs<mf!cTPHaNLlN$^8O0}Wy!3B(yJ?MfJ3dg}Nc!D3 z*48`n9;exB)~J|4{_4uVoi$%*Y^2A}bh5V7uBJ<Om)Telj?fYU2kN!AnQ270t4&93 zN^3a1Z2(ExF`UF?RcN|D`l@9FLrVO07;MO*zizHXR3UN4@Yl@~`g1W+h8^y3{sZ;& z!64oTHu@LjCZx%j#+WG?)Lkdhgn%u*HLY&r6Vk*|h=Z4Qu7*%8M|;{i`{(&PNC_+K zwHoeydS6Gk+SLSg)h~Q28!zZSZ|J?+QttSBkMl-p7(mTJVTNG{inxIth#5F@^A3Wz z2YHXZl_<HS*jAnvnm;pOIa`JVkWt+)g05j>HAA^!3oj*eay{`g*$zuhaA@ZV0nd!g z?i+vE84dvBO{587TB4eTE;Gb!b=2<5mMD3DTEI{URnZK&7-`9}qb(lAwbSFQ>dxwv zQWYbqZC0hm)z&B6{J5V$zx+z&QpBPrFrIRUGX)$14ndo2+%HSBLrjRU?NEJ)$Z%A( zZ|^|yN|e^tz!-o-YC=1Vdk2WGu<E=BkI>k?OF9|rT+XoCoa~ZGoSn&7;wJBHy|<Ow zRmwBGcW;&*%wDS(4ye7BfXijCi9m?Dlu4S+SYcTjw@O$4+WKN?^<sO&J2X?~D}UDG z#}iTuQoHqd0;TQosqN#nc3AV(8pPYoiDS)e7ZEE%Y008S1CwRX>sS+w3^7rc$b3!` zXs{ys3YL+0SW{)MPFx4JqKm{~I#x2%lM8H$lqQ+Ru(yN{wKuAy>+fyp+O;ChWzekZ z7SEZDnW(+7wu>ENLt>M-S~iKR>C=+X3c|w)laSm{K~Zkvgim?yun$0!(ONT=8+%(h zugxk`bo7>xb(sro;f^bMOOn>Oa>GcY(w;1))$S(U&47ovRs4O8f26cZGzr=*Y;3$! zp~ATe=|jo>=$XqTN9r_I_&Jv4{U&;+qa=?As8KeSGDrQfaaZi)s#qs)ql~!;P%~Tn z(Q+fZ4B8>Ff}FaQJBjJT3S*tbq9vRr_WQ<N9h}4%<m|+L-}q5n%Z(15ti$x!Fg=|4 z?=58-Sz$J=|JSlh3Mxym{C{IKADnE2(QnvRgUD!}VUQY+#m}W2iDOoRbk8lph5XCq zh%<U}zIx4@DN+>*n35+SA(K!jw;0<JlO!;B4b}1x^@)ZCK~uu%C7WDLIqHIvnI{29 zO}dEw+Kq{IJ5-z~zhD>3O2Kf&NctSnIEY-CEd21-HJ4<}HC3stZ@zJNv~6-2q8aGt z`D5w3L2|LGk9T{tSryCP7?Td^QYy#)(>@^I-)yAWj-?*{1?WQQ23`H=Q=gPT^G~ab zP46d*bU~$HI4Cc)ahZ6;Ii}D%P6X;4=S(*C9uLnXqUtnpNL$PmWMzf=i_@uan>i+c zu!wN<8h`XwKeZ*?Vs}*TMS}MBkOGd?l<dA-?4KwMpRfMm*b-VY)>M%9u~qHl){wP# z9x^v}@56ht*h~=*5iy$WTVP9yE}4+gK`fMd0);J<@c2JQp3+jw3Q@IZ(XuWjKZX|n zf{K{OW!w0NyVQp05Evi%ER;MS5>8K&^GSu7$>~^?D~W`Sce6Y-g%pSIi?M3?mj`%b z^tnUhYC$^>R9Yuo^1OeH)g9NV>Kcw~wz}k*fjR0Li>s%)3UOVju4-Jp)b$W96XQu- z(v~q+JuVaDC0z5A_8u-1V-gC&#Hhw~mHN)WWn#$J>Sb>&#<~HQiE#wl+{8%0HD7(Z z;W9A>;98)xbX+C|--Wkp$(PuzlhyZqTra4rgdSjc5X99=X;<MgJa`_L$xXg$d$sz$ zhs)&l11=Ny(5B`+jTlRIdraI*ahbUCW!q~s?lrhf+<S1DxG&=xq`vYl(kbeaHIdos zItrHvW{iGL*~IM$?OLS`!DVVW8kdP%6LQIyaZM^Kab2e|w&A*7UGLz!QC){%u9=jF z;1Z=6V_k!5u(}?@Wm4IM>n5db!DV8+j!XJcjP(gFQ<iqIPK-{tZdTtDaG4nWa4k{V zP+TU)EL^uJ?fMYyQCz*1_9ZUEs~Gn74X=*HW$HUT<eH1ilzBO>6pi~5E>rq<a7hn~ zu|C9Q%JMTVlX4u7DzsMLBXOA)9E{7vt-!TZeQR);xOE}lM{wPyzUxB1&3V1Y#BGP` zcJ=Lu%fvka*D|H`$7OhM11@=oCq_>IHYIolnn~pwT+7w>M_eYAPKc}V?S<<O_3ekt z_@>~xQ)yYaOdfI;u!#}Gb(i|i#${sMipy|gEv`8At;c1`a_XUu?^s;&7Ez2f0hjTe zhwE;oEyiVXlV`k4dd*?2NiQCki7^wG@x29?N$>8E?~AzZ(e&QM)k|H8u*bwW9hXTj z7nezIbIA7tTqeEUA>TFxzgJT^7MDqH3@(#i1+KR0dl4>^-V$7fSMTFmp}rsE>ZvX{ zO}DqYuELd~uDfxW7*FF`skCQtnHal5zCYr+Pknz4`KFS+i8~6{{py>8%f!vY^?=gK zahcLzgX=-1-4>!fiR(0_y@1Q~g?DfjC{0ek9;&YIaSd138||DJyK(hZ+EN~yHD$RE z*F#EMh0Byh9<@$YS_&@1gZpr$DD72TtJL)oE>qGDM>y$q!L?d_Pr_x=8;I*+r47er zVzlbOx5}0FA6z}uHL|0V$~m|mQCa|(N##~tCft^gEB8qAc3O-z4p)-KxCWQ0+pV}B zRoZe~CY6V9tx?(rT&657cr4w-I0DyW>U%UU6QdihwMt9IWnxUjWlFyh*GcNT2UmA> zbvc@|aMd*)*E)60$F*Kvx8ZtRUC-cpLS3)oB0Bx;V_Y@r`U00}%VEb@R)3{keXM0Y zsjj8COj(}6MF8RsI*zmV)#b-!d}rg@ptMCH+G<>;zMFA9t-jlEnfm_jb9@i!WLeLs zZ);q}_b6QTN;?Uc$)m8d6QdH>M)jSB%fy(4Ym?ICtwIxH#_{H>>@n8S2~ON@xSrK; zy>OYhC*#_zw9|3fHNs`MJFAOjU8cVCa1B*g{0Zhg#2D*vT>X?LC(rei&&uXkbFbga z(W688K#krzhtuf|f06e-Us-vzFW+~zedH+dd>j#1$WWlyu)*hLSC;>sceoorPT{Ze zv9tRh-jn?QMt<i`%r85!+E<)kR!~~#o2nlu^C>gsXu$IwcK&1a8+nees$^1`e)Zf} zR9;h7V6qsM-Z;I)e0SZ)$EPNh$w$+DRmCMm)xL>DttNp=Uu9ucc}?ZSLZ5sD{2wpx zXub}WH7YkPW3-)RmtrwSESv5nLa#0^sZv4o6_giN32Qk<p*p{$%$Hv_LmBIow<=Ut zk)eM|ULAgw)l8XCSm`S-^2s-#ym|eT`AJ%G{Zr-7K8PG}&_l^YUzfzB(&;^XoD0U; zRfXL4<<3+!P+k<UKR#dO>r&GLapH@E5Y0)*d`Q|H-mH;YSejnHzIGD&5&5YlmDQXQ z9LO&ypp8hxWTt+Sm?7A$7H;R_{3_bk=P;fMn2bEl`;YNQ&cyL`>6Kj7!#6eGDPp*E zJ!tVF4jB!VHC)cd<gsyC{3qK}yLhONR{88E(ki$)^iRo;3gbU0kN<Rfh95He`Ht^W zikQ0F%LuL0suL@Ggs_<uis6%kXngwGpf7QHm+1}st7<0F;j4;jN=s*G;6hQce=Y}( zHv2y>5C1ej-Q$0Oek9s3<e!o!r(0L>CD&4VcFCmTYRTcBO24M6(5Gpmo+ND_+Js}~ zv2Hk)l_SfY9G!B6^}3$o98&E6RC%0yit?wFAU~>ZjELHTW;ftJmEY*XNj0T>OmS#= zX@M`JnqhvTx+NR?R&)HP^0SNokG0=Fot}K4QNBTIz7#yzr>)H3!gv3CUFgV8`-q9= zZkK<GKmWJVpP(O?^-U`&s4o5|`%_elCRU5eW))FwnpkbFYgy58NVF9nHOgvHVOlD$ z32zRIU*DD$QM^dnx@`*+R_-P4XyW#dwvLWE(rQl}4KvyfLwd%qgYn~Grnt_nDq7}+ z(`15ZrSpr{>|W7-^Y;`vJ69GfB+hlA;{bD9?z>%XcbGR>@pCR&19Yx#QI5;9wl)j9 zPYFA9e(c<yh9jC8s#%GMwpi}7&QuzUPgaV$;zF)=xXw}<O9Q$R0gpm1AFe`v(H0Xy zeJecL>Kby%3c&^HEAw-f8wi&aawX#`RoW2#CG}{{-MG@YFH@SIf0>U*>zPW%mCZek z1Wjg*Ql4mi)7!Yt<9@2r^7xnec(ks`7*{d()0HN<GhxS9(lV}UTo)-#!Y~oX_mYq+ zi0g8t&EnsuuDK!Cd|We?wvd0}L$q$x8rNd(Yn8@E$AMH_!ixbeiQv{6#?RHD+zBV5 ztZj)$MJG+|Qd)KOtur?J*F1m1rVmTbo7rabvSUUD-<qHFV!LZEpL*G<FOT`{tuJnR zpmhJ&-?abqnx{XA-g*A0zK5K@>XZ*&Tk_Gg5iNSjVuxO<&Z_un`OKCVIq1++<P^(Z zB?UiR5fde^rP3xvh56OJ5)&6jMFnlj)bi3^Qwl5*Y(wdV<vg)^s)&M?J~}GVNic-H z^hD4E6?KUj9TgkEJ_-4Y!ww^jO3o5S+Q@tLs+0+zp~V2vQ5E!z&bVq?+{HSBbBUi^ zf|8$+u@#`kQc4g0>phed?sj@8W4Mc>Ny4$FKuPpaq+PQ;l-r@?c_>do35F=Ws`;Qt z!W0p4t0}+eC?94264w{A-drzKbBQL2J50j(lp~h)A(Vw4$`4S!^-!9TkB>@+%iIyl z^ib}SwmhM@terb$d7#SI-c3n^A{{84yS%fq%tMjAsU38la2VO6TGqu)nFFPRr#v@9 zk;lqS344W`R3C$gjvCua%E*}xO$H1$u7sQs{gRUU50pDmbLbpHNsf!84Dy92IINZA z^=+s;Cf2}Ykx-M4Ilxy!%H=~^I83s%P}|0#2tGwR=8`aSJ?EkDk=oqi%JOO6Ft2#R zh~EbdDDrBExtx^c5j`(O-lgzTj%z@X(*eC<PH8}qhYP)7CO4qSuAn!})eR_jG@$4U z{u<4x#f}DHK5szzw@nGl&mnaEU8EDH$Ufw1eql;a?#$)nmD+%k)qrw-14@~Pl8`>V zq&lHrzw4k%uN3)UH<r5q@))Mv2IYQM^}`f7r{ozA<q;_V3Q-b<=a-Zw^zXBcA<D!u zdG+u6W&|ZEd3qNoOt0zTjv>Q;bX1Uk5siJ{{`L%DUmM6vE)8RG<XT8W#zKvbx|RPE z`L&vR%~gPXy=KSKFiMkCROHU2Bcwl|NLLJpIgBp5j5Z7FmVP)_cqsCu!+H;;3d&Xw z<$5SPJ(NeG?DkMzgR<X4`2k8SWddw{co^*L;Gy(`($z!Bfs*W@R73H5C^taK^HA0b z1rZ46^)?jIHevq!0;NNUKfM?kt0$ClZ&_@1!g&cT*Z1FdoMc=9!Z3L1rD4?7j(ieu zg;PGsri3|v8k8QMFy}%MJr)i#6^hsu;dHKrGQ<<+ewz{wvk{8l6Xs1Q75u_=|C+n$ z9!fJ32zn^TNs|1+u?BOO<|$7$6dB;dWiEu0?Fn-!lsr$EMNr0i!aN8?I2}&sUr^%s zg>(OaJD-QLpSwH{MfT4nFNhY+&($5ubTFK9Do)8O9Ohgovpiv{?O5S3*Fah539}N4 zb2ZWNtKXnLNhy$EBe~1i1f_poBqe!8BxTT!2uk0+9Z(GJbo%y7iKGmi8%arC?V%(k z4oKP`K^d4RZw`i2PD&iuziT9AKwczekmv+=tmMS{5T)0Iswyg=m&^mBqsTPk(vdnb zxsQ-Fj2ZD0lLv_2@T5FY-Y;=e1|^P-r1S|!Qj&IfDSZ+XJ0Lu+bowMFB}P&P1S2SY z66+%=eZGyPBqgIM+$r}NSR6@7UKT;=o47lYG9Zpb-0Ae|n-@t*UL8S6>bF0VGAI#2 zb*Iz6kMv9rC8;8k(tmX%WuSBuSFFARll>8t<o<b)ltC*ZD1#E~BPoMoQID>a`_UGW zl>XU~l;p*cltJ|ols<i95hr)beFn-CDIQ9)9H-%?^i52Npd<}Q^iq=g_6<f-`tOLO z4D7%&C9af{`t?nYr1Z;<q$DqnqzqaeK}ky5A4%yS*UHJOS7r6YgbX<kNKS^89tXqK zmJo_%TeR$l3z<v9SQ;zW#3HGK#(LR~rC~JwXEsG{npnLi7Ei7kAS07`b}KrnSl#Zw zUx*?5y=Bz_v!olCSelQTfEGHIGf-4gSX!X8(9xVOn(KJZNUFU9;UNcflSj_n3@2Mr z7^brCSUICHztAb1E>9`9*#dHiLYc_vgMku0IBA9M<V-?HEbT?m%9s<nNK*L#6YB_) zC2NJl+1(4Im6sKU?=mD4@yn4Nu$;nDrsU!K(S;Y*6jm8Rc%jkZ_oPCn><-2Lq^jm` zH;VI>RVRo<vS}7`pOH1CX(dzD#XbZFv|B~h0p?Z#{fMD+bD{T+FPxN?mQzI&RK8^? zZYTHBlB()JX?gkNnhHsH*hrW;s&JaPO$7rZ3px0IVwFakQN|Lw?*C0KtgPk>nx*7# zyd{EuPK9`dlQq7%%`UHU-KEPX@rLt#Q}`N+A(MiJH2LI31M+CNo?lfM8G1xv^;tQ^ ze9kB{-IeZWzA8K1h_lFsZ1n^Rq)9_}vgc#&q`8IP1*N4L&<c#s9Tpf?TsU!ZPIdmo z$z$>>s|-!VU?^oUcR9s1)jVKPW(5Kxa{Rj6U#YPm&?9Op`4Vbiq9nt)|K*cQ3ay0U zvO913fZb;j`XnVmml;f-r2dwfx%5dIU|fA54zv<#$`F%+gizVFCJ8zfi6lk_)oMlt zJ$T&{&}5@%A`Upz+#-1s^6&E({(b+#zu#Z@C;f$g|G)4b@E86A|H41{FZ>7ng@2#F zWZ<805Q$4GtTM_;o;C1@r!;|ff;5?ldSoLqsO4_>hMq2239C|96c;fvs7udAMsRyI z8ckJkqp^&S9m%VT?eJb==uSFjNHi0@dOJk#(~#~kx<Nt>8SDw-FgAkdD!F^0aFyLd zjtuUMBaz`9y5trfUqbaV_4RtVE9UiSyk_Ar?y9+|c46)D$~CCjrESEcVH9UbYZ%Az zVSv&P9tBDZrxun*=-rT=r5f7Nzacxyt#*yVZPB|=VzSS5^%>YFDLE;5z<_=(B2K0! z0|pH6`H}|?9F(YDc`XX&w6boh9Z>W>3(_O)DU^FPUhFGbA^0(JdetJ%S#8g8Y_N9s zvIfD-DtV=$WD+OEiW}-)l@}kG2`8>KVVr*r=UUSi`ZXhX2Apu+|1hDFNzZ3x=ebw# z#U};({9Im-xaBZYNWajm>=gH^u!OsjHSWoWn=o=O7vbvNt7JlxmF=jLqO5N6dIgvK zr&x(8?sYMt%Q|&G!ra@#ggf5}=UT;)aB=)HWWnEkwMaC!v29U{ml(X`2$ye%)qLYp zQbKKS$Cq%E2~!mr&SfJ@&^&&Z+F|5gFJ==oeebmN;i+e3=4NIL9o(6}VIy<XI(w;E znQ5a^N2cd=_AwRJZ_vnE#AqujUefvd`^FL9caRS%CiU$Fl_#Hv#7kj!@K(!-)(=<6 z+bsseUt;e%x|=Vnf)DqUT*L?ce0+snzm=xtx~Pdf9XedgC1sQAC+3+0z`fuNM=DAF za+CTR(^rk%qph}a(%8-=4P{>`@o{aercRP-u~4e`_!NRKB3xFK`MRFf4x%4otrDw~ z`pQ_wW@UVQHq>g8%Zk$B%^2+BF*fAEQyBsCRbfp$505`I9h(?0Ig*4)T)qvU`6WX7 znVrn6sER6i(xQsT;VA{w*`0(cyzRq7_3`mOXz!fpltD?^kZ#jV<U7t9vnwQ1Qgf`h zq?QaVilt@ABfn<4)!vGBxS<P#tMTU&p2)h|)0!e*hpQ<q)HL%TMl(yziV9RusR&q2 zn6kRlco+ZMX*ez^XfY`3g)oZ;kTltfFi9UOX^=!c0rY)Qlf*)9pJMwdD~gZCRy7Fy z2FyLcY6zFqFOJ)$hf8QCi5Fd@eBF)TXIc>%-{si%j)aUQ<gv;LwH0(u3CpEIO{^@K z@;%XHCCIr%_GEQLHgY!G^m{EUDDt=h90ooBjszbBMQ=O=P6AhhHQ>YGZ155A2JkWP zZV+`CB#b<N9{dtyLpJzt@JaA^3c3MI0-pwlfc2n==SHv)+yq_#{tLVg+zKuOw}JP9 z&w~$uFM(^p?V!9L_6qm{_!{^Y_&O+K!W-bP;QOGQ3HAZl0c4jkC}Y7#;2`iba5(rm zI1bzcP659KF9+da@EY(3P{iUV@Imlr@JaAja0^IXgKvTV0r!FjKw06pI3~U+yp95! zgE3$yuql`bvZEP19c&Jc0~s!Yg<wmt3Ty?|fNj8wz<BTyusv7@GHe8wfgG$Gd;mNO z6xr(xN*lxbpzMBh0e=Ti09&ItQ7=JR6J$6Eb^{qMg7O_LhK%3{us0~*#_9(KLE0`j z8)PpvxD*@=ZU9dP-vmzqzX4ALW1I2}2G|Kq1?78MLqXZCVCOYh2&RM6Kx80T3ub^< zgQtVb!Ax)+$k-oz9?SxFfhe!w4<K(72Bp`G0cGXz9Pk+Md{A~6#)AXF05}xP2MfT7 z;5-nS3tkNtfj5FB;GG~c7+eLGf<J@hU=)3(0&EFh2p$Vog2#h3U@vegcrrK*%mSx_ zXMz`l=Yf}iCE%r?>;hZ{UJlL#uL7?CZvtz<`@yTgwO}16Z^vB&?gSTt-yv2{@rxW= z+R(lXqn7M5-q^_4qRT2WwxkfqxndoMWihtMsF4lDJ8Fnt>I(J0(Bg>%b7^r=!=kaT zi<2fa->6mXB)VxoKj)INi*7=nS^I3_4b)ZYb0gReycHDxrC=xUcCZhKo(P@{E(bHg zyTEh7yFsz(R)7mZ_RE9lDeFG)J@9_82|D5dkp5t;0&~IDU=Vy5#Ls#Z+zGA$W9ZXs z!9;K!D7((<!MWfQ;2Q8*a2L24{04ju{2kl^O51D&r43)@7ukk4LG$sumfy|ZHq_}$ z$Uev;fOC1<P=>7vyslQB%d(LUB0fmJpD4|MF%Y6ALNx=iV<JeC`9smGt2L;kDH34h zLQM$~id;zU0XjVH6yxJuQYUF!Y0L9$;xF*PhkHMG5{Rx24g`M#Q^5nEv?0P0oB;5h zt)NsY8oUT>3SI^_1D*abAi~y~i$6TDX7XFo2rr$fopcGQv2#fr`?9-49=C>_4)5Zq zz0~pOc;RSe;e{cy#_-s~HJ7C$Toay0a!vX}9zW-jvJ20cLg=od&>6>qQno`usSc0( z1!+*eJ7op?gYCd9ust{iJRH0fWZVl14?2RvtIhoSNAPM6G<js}a(=fo!Yg~(^?zZN z*eb%R&ivFoEty<sFB6Mc`5^x@Jd-*^@{DImf>JLZ*b(dmo&a_MlfV-}v3J<_3yL&% z11|=7;v^`%=m|RV71>uW!Cz#0DnEG-(7tl9<#S}I`fuo4uW&WO7E#P1H{QP5NVgP{ zXk7U)V^&mIc|l=F-{#o`6p*q<@~SU&mHPAp+ku?tt9rIS*qwXqrC<&?7?i#_1S|o0 z7AGh?I1LnDiT+NGkT21z$3q_lF7@(iMCpu*;+)d*>Oe@jRS?p-VjYL&3{XKR^XUji zlMyl0_vGP3L`+DHGt5zLcJyiu+6Wh=o92;?yPG;wiblt>WdwFEsjKjo7SQJ;g`Ng) zr2grkv?DgB>bVi%8Qf=pq8m>K3&4?}a3LF<4|05J@M<s@Tmha1t^&t^_24<+yWqJX zwxPwi6dVYS2eHwt04QzK7k6aa6f-tSljMWT4%RlZ9L4C|Hf}5-or^|rE;OYuP0DPT zt514s%S?yn8jLy+EC{KFUsjX`v(<r2Lgzv?TrZW!#*0exnKL<!*>L<4QTO%<37Z1- zaSDfoREMWg2nQYAEjLnPA4GREx3&hwe=Q-o<o)dMn6}dp^<Q`<ZQOyo7j61{cr5JW znX+I4$h;xg3tR}E403w1>X=1fE%!Hp4}rIU&w#gr%rC6vphY{~3HrdhL21i-K<Pg# zK<rm*C5U}!-49~RSPy{M78di9;Ah|}unFZ{4Wjp~N5B;DQSf|lEhufi4iwp#%`Z|m zhC&maFofT22a}DEqDv%{bHzH2P`^!q@|XSAuv_P@65hF_9Kvr*ex2qEy?}B{*$P3? zS0$k6sS7|UFVFvJy_VpP9PdP5NnDZFo4oZ()7Ngo%IM&g5{-~T0-i;N_7FwV46$0i zOfPE>64nQKKO=Tll-UP%$yOd-&Lw4w)Xnc<4@r672c@nbfg)QUg9E@%LE#bYuJiWY zU>Wycf>Ou5ptP~jB6-mkS~Gre{1!LLi%<g-B6N8hSn4MUcz6-+JBgua=8OcXUo<r7 zCvtsD`J@crfs)Mkc6piaH;_pguchCO;I|-LUQ9FHt1%iy)}K^gxpVdwS@eDiY1ERT zSqvjtWBfMMO;W#X0-Lp?2{lDUg_XLTHWs1@Zis;?`O{Tl`S9?nrh~|~+8+dV%XSLu z2U5pWurrtjrh|S^>YV{fd$PXKfIpj|iOs`Wi*<EF{s?Dmh5P4|LE(>7*~K4SCWLgf zvdqP4(Yii7ycKQ@Rr-R_uO*&^wi(b*<;Ue1#b%+6x2b8m@G_R_f;<gq{-l1As@pcs zf*(?6%Byx>E-0yw0i}h;f!BlQfa}2V;8S28D16EXg`ZdQ8ysP~h>S|#JC>iE{9s>> zyj4`0E$)!S!JE+4P~v>}xi~6}lh9tqsier9AX)tEOUfbjj^WqCrd3gHDH|LP9tKVW zrJU12sn1pXBJ0x)S}T5H2QT#2hq}n_l5W}SGOS1l!9thoh7n&RM5NSJACV9rB(n&R zA5JN(3*2>*vP9O2GRwg-a%xjh>bwAyvR-Z1X+G|gBicx8tCsva@w@imb>cyk%6wG| zgbQ5_8%e6^s+6b&spp;0S;o~$nWUsvk?ka9iLBEi$}Z)*0Xz<5POP@|V!KYXBV(+0 zuiyx1q7&QmyRJc<cuzYJ?toQ)zfz6LnB*B*_NA0j%5fVgj9CUsnU>pSm-ZMKQT9Y= z(jQOacYV0*GB+B5fMv+@D7uUw0_G!-b9viBw5}xO8C8yiC^BS}kaWY6P;!m6ha?bL zr)Md<ly5UA^TOvqDeD%yPCw#~94B9EVos`g30xkolN5k`5jIgN2ahWKxl(O(_a>X% zK08rl%On)qzVK}62s82s>6w6t?ktAr-V>2-nFLJ+cBVtJ0wlqtFQF$One7y@bY;#V z*RjVKOIKuBY)<ErI#1_D`c*rdPJ0J?b1(gJAb2e}9z?$e%R!O#%RrHJ`mCG}7F+_} z1HJ&R0C#}*f!}}+fJcz_gJ2T48e|<=_ZZFtALTwDd<>idJ_*hMH-M}W>Yl<~AU1T6 zwL5DQxDAvx-VRC|?*O-gM^m5YLHWMPiy-rR>t%2#NST7nr*u!D3VfaWtH3uvY-Q^$ z@Ck4yD7uyUHjojq-CFRg;CDx(GEyK<LWztd62!S;9fumr($FbT8i<4sqNnwx38z4m z>*1sA$%?dLwvx=Blu6pKIlnYR(tQyr=LgiK1Nbr675oIu1wRAxz|TRc%NL;3`5Ee; z6w%i^#|R(HH{Vw_Qs+QH$wbpFmJ!Oiyj5<{EkuS_6V{B2sw#vn>mhxhJw>L6m|zmF z9-<Eol@&EX9uN}}ZS59+iRy#o;i&Wpsk4b%${udDT6BrfOg||LOfH-;t-O*4Gu?ZH z@=DHH0&&SYU@~aZ;JGtTz<8vNogKNPP$^(2U|&zjL3q7tLQ1j5a=VK5WCB}0nK!nK zHRRo?oI`LCTP`Vul(>dpR+PNr<t}a;0zPg6ia|D=K&E<LgKRhScTF%cN`l-zsztDQ zpjDU))l|V{rOAe)`H4I(BZyogk8<y*4d*_=R5Rp%ZN&Y<5%(WP-2Z6b-)E=Kw9k{@ zTeOZ`PJTbS?n7hVE;|tkDDo>zkv4eUrr#f9)>Iz=heCe{JRN)lJO|{Rp5P2{4LBQI z3yMDAoaW%2;1i&T$TQ%x;3iNcVH+sAjx!;HCxS14qU*MUr-M7dE5KL5S>Ws7BJd56 z{SJ%0wxH-bPLd3+0e6BM!M8#78LW3fk)w}5=7!eC;4k23;2+@UU`rUb8<hRfJ>W6m zK2U_|J1`66eI(u6_z^7S{wHu6_%nD3xF2L)!}<*r*=o|1^(Qa}{1t2pwu15O1qS6U zw?n{=U@P!SFb<Uc%EQ2QU^{Rl*dBZq<OIy%R<I-ZJa{zt4tNas8F(!C1;`#_@E5Q% zDEpgTz!=)|1W@$VOn#B$_$AQV@DsgwpI2WQr4k;;eFSl?SjQ34(V{3CC?nAZE~TXs zXZGUr!U^d5tH_*t4%34&OSyW2Vw3a+yMu|~V6YFE0VaWC!T#VRZ~!QE83;<9pB29d z9sM3O(f4oiyT8#o|BZ3UQ|CritMvN;WF^;?m=<zhU~WVA*G1gdyY55%RO;zmQU~Fg zG(@IN973I?UZ;TVz*KN3I25b^hk@9wRvO57Z;b$j2Yyg^^)h`Ta$O(U)VWb}a8a07 zV!LKl6qf0OIy!<cL(rYeD;<pwX9RaihUob`NV7Ysp4Vq%gqb2$pSp)QA&w<rgTbo; zqS55Wpp$^IFzGQ7B%A3F-3Fq2bcn<63VvL&bQQ#D(v)XSCd&SSj4rc6<dOn;=q5g% z)lNGg3m!ab&7mhko*O2YlsV+^BRaF;_cnrX9ZqObA;yfC1OhsyxC@7QVoj!7bIHVV zaVU6r=3_ZyPiVzJ>>sG1OWIS`n@)k^3?A@Y=adQH5a?aN9Iz{R0Z6|Kik|2R&I5ac zw}Lc|uG#hlKjI!C5AFrAgY{@<#t_x(toH`{P*>6p4ggODMZc$jlfa?imEbUNKIjLR zgN!k{mWzA`*Kt1*d<)D5MW3Gu%5yEFL1{V49App6IvYF{q`w5&8_@L*S=&8_`zhf0 zptN!^xBx5xg`1N>)|utm$Dp(e>x041z)G+QjIRO{KrD-3KX5824MIN*UJYIh-Va_1 zZU-*|zXPuT4?z#l0y~1U!4ttbpgd=CB`D9Cz}sL3SO<;*=Yu(*%=P7~+Sh=Wf(yax zz(wG#;0@qC;7uT7o}3;W{0dwGGG@s+z}mknXq!P1y6_ihqBErb-yZJYGLKWSl1(9A z(J4ft|9o~THXQ<CFKX*vk~9CLJfTbS6Zwk+sh?hSUDaEapy;g{5LvUPg2;l!SR2d- zXMj=%o+Z@%$csUlQ!xgsUb_^0i2KXH4dCVAOCa4i_%=wJ2R{RAL8&kOSTPG3id;kK zOS?%Qk#YJiFJE+8YL<mK;j*%1y3v0GcCJ{*!5&vUZ=DT}UkD{DDoV}9)wpY^zrD;V z_T_p=W--+sbT!~us7sGlg;+SH;vnm&qUX92u)#Q#2+^Y@C1f(hIq;b0PfXE;m;zB2 z-m;?1sY9w>MDMlbht*Byfhu0KF$?$8A&RH$^jFoCR_l0%i0QS2;)cd6AAEH#;itsx z#IK!A|Cy!{9wQTKPwofL=KfbOAN&ox5d1ed6NG=kJHTjgCD;^v9&84_3?2d=PTDQO zW57efZeVLr^bNLuP}-VDkb~!g><#L(EyM}l$vw8H+KnB+J=}K$ThafI1pOdssvUSN zcp>-4fpb9W8D!r|pEG0M$x7gUJ=g_&8$1CNd+;Rid$2p$0)F%WMGilP7P;4S1$_j) zYs~=fZcP3P%NUP%%=XWO&t8@MuLMp8HtB4kIho3v2$6R+){&wH@|HqSkG#oXn;lBg zOevlD+`$Im^$bs65{FBsXJ}$u*2;9%rZ{x3XM|Gs`1nQ8eEg8!veFrWk||RP3rg~< zdHPdE$qIaC9wWXws8;7su%CUMg@+O2u)QDx>aiE3vUw1{^GOQI@<Pva@-f6@2`ZLL z2K>dKNmO!EgTXz5zle7hHRKX@%NQD-rMic1F%cO}^m3+d0kV>78C^{LSK0TDKTjy= z<(QaX+4spOnD8T!IJvHZ8xnt#eecAtH`NHGFX!{i<@irE1rOc7Y2Q2Pjc3up9sV-c zy)pd1$J=M;Dj`M2h2{DD+SzpW<kilXXDySVCxPi;e=rLi2%ZlP0vVsJAt2+dK6A;q zsn1;A1g1d06HEm+gG0e>;0RCzECWQpSZ9DO;AAF9zn5n+bf0-N*pvHQki4z4z*E36 zU^aL*NEmAzSOlU^f)yaG6ubn?1DAsN;2mHA_y|}CZUl*=x~2qtmHWvc&wuH&ma-nl z+Fp=nN%R@Zv%xCvWs`6kD9;B@2Zd+k6%^fiDL5Lu9y|wJ1YQ8%2wn;<2Co8d0at;y zf&0PbppTZOjKN+YdN9}zya!AHSAb%BtORSo`@oC9hd>ehM?tYY)_|-7=yQPbjfeHz zzXLuAGOxBafGv=ir@=PhCXjioJ{KrmVjK78fiHk1;EUi4@Fj3A$l7Ia0r)bw7-S7I zxD<qU!8PFP;78z_;6Csz@H=oP7>^{r1Im{l-Ua2^*!RG0;OF4!;1^&PxCcBF+y~}^ zUxB6I*WiWVci>F$dvFf;BX|S&6L<&sGk7ofJNPQdIz#YtkWn!hkGwYlJA*OcNU#|= z9y|oR0AxKv#{_v^InpM12}4bW<jvr{jg1MSba>@~QNe71EF-XUxoi@K1^1jx-ue9R z4HHqSDI{u?s!UP>MyZNM6a5?>K)efVWd|`}<dL|b#N#IqX;l{#7GYiSeyXngcZJ+w ztdU`<!B``z-eewLz7!Q=tAA#1c1b12OYkt7+Ro9u`r(XEkt0Jk!962`u)!ZnylNWn zEQiOIJUk9I!hM3DbZ{=oY!+yb7;@@0V&Yxcyq=)aFSw-GVlw;qWknU|Pc00Tmauh{ zU#g?YT*%(hM6~>BsB$@4yd645E@u=OV2Tp*mo<O6obY15xbI~>%Y83$Dwi|L{19<} zG=1OgKg_;&(*HW*ewy?ZE@xEv!M=CGx1o>7<=pqM@16SGVc$FPZ;v(Mo%^pM?)x3$ z^`8-O|6IiVVe~z@ob<*=+~4E6cjiC4>^e$3>BBPS-OP{mOubHvwt~{HQ$X1dWl25Q z0~`u6r?!TH!@)Fg444iUfx|(OoeXd`m<e7FjsnFX&jRlR85e?&g1O)(a16K|JR95# za*B%1*Utr;BOjcg73>U-2W1T8dq2UxU>=wPP5>D%t%)GxmsJ3kfyE%>jm5YV`~>9O ztzc8+<wB6-H?2xgM1LyS4V(cE0(qAsm<C=9W`MlYq3@qCZUu|DzZ{$a&IIRySAb$~ z*MdCnWz7aRfOEj-LDp1*FM{*H_dv$I;1?k8hy?e6^TFT21z;5N%G^B|4PFb%*m@n< z1H2yW1KtSIHr8Sg9$PnqCEyZ}I$Fy>>SEmiQWonj5Vv(VcrUmDd>&+NAovRS0Qe^O z5cn(jFlZqQkAO`<)_{YZ!S!G_@NrPa<|n}c;1+N=xDAx`0n!czz!$&*kUWAi2EPWr z489J^H<sQ2KLXzZS=+XDf)=`kwd5dc(bl_QH}E~M7x)1<2>cK{75oSkUGypV0Qd#? zCAbIt8T=AFjQ+Y8>;QfZb^*Tu<-1DXf`0Hja4d+f2#S^XBRCuU3A_s256T$&Z&1#t zIskqE!Xq6^qd|Ee1zrW4(BGSZZNXUZIIsoS8*B-l3LXlc4z>m-fo;H2uq{{%wgXp! z?ZMUH;h=n@iFbm6uYyN{?}0~wUxDbf;5Xp0;E$jWj7G1}X2CXK0(cbI1xyA{08ar= z0w;mkSHXKg+A{bc$Qn@a5pXd0BX|n<Z;-Dl24zt^6&wtvfvI3RDBo!EgF)~N@JcWf zoDYry<tt5Rg0F+4!MDL&P`<@<HrNRq3!VU;1IouW&Ie1u@n9L42R;Z+1lNEC;93xS zFt{F^42msM3d%h8QDixCtv$V!na2(R?`h0tsp5DCW37Bk63#{Koh!mxk%Kzeu?WBR z88TliR8GXYN-QMrx{55c%9!Zm$I~lvE(vqR0v$nRkoQ_IK`5OyWSK6}E(+btnI-{! znm{ap70^vgV}1pA{Ous~XUF&ug)fif7IFHDymL+&8l758fn~r5hYwGE=Z1>I3EKfX zYb}(stkb|q8XGEU*hrEw#MmJ6uB)0cRr>VbtWf&yw8d;G2t^6cp4UKY)>Ud%Rn0d* zs<b|Sh#teqJs&;?q3n$!=91;Z^`POl*1;W;>7aCXxx~(V3bYx*!dRrubQpm@7JWe% zC2&0$=AOgtKt*NY)CN&sr8FnUN=#jU*bExZlxR{fa(}R-q+DC^H#LadcOF8S_JtGP zK|mugrufd}UraVx%96`5ahM8v?spoFh5TQl+sW15p4g)X^m0t1`|W!ty*Vw7zubq` z>Q>l+#7p|Dh}?DjWPMq#Bbk@Tdel*1GI%tY4zgdW^K!;@otOK-$<RB4RUqr}x>nm2 zypnsKF;QEj7r2T0Q^8lk6i{r8q2Q_DFz{RuyC9ecjsRtT%{pB0Vh}qaI0rl(luh$9 zz?;ELkU6csGq435#XWOLeRqJln!Y<g*{vMtB6?%NA)vf7AhySOAV2GTa56X^WPMuS z8DL#n-V4w*zlq>d?&W#wmEa`sIj|Uf0VJ-j`IUm7bI-nmz6&dB-G|a(tRL!LFwfQm zkLSJ`6dOa<zSBWj^Tuwmri0gjvgUmgcnOGoVO<K!`^=YtjMKW-y$=j>&-kiq-O^#M z<USt6ZVDa))`5&O)_m|Z@EULoxDZ6&Ti1c;bBlRLa2_bn=U)xp04@Y?0&fFv1|I^K zfRBUNW5K6EcoKXCyd9K1h~?m~;2q%M*a+;e1djsm0@=UT=lJE+Ja`yne^Q^{m-T=L zxGx1C1TO?10hfS}g7<-sfimx32iAkEw+7z_9|u1Mp8{pRzX|LQZU&1$+9-HCh@BX` z2YeCS3BClr4{irVcf10A1-=e;WsH9V><7LHo(9qhgOfqlb%WEv_rY1<2jFt>L+~E( zWAIz>Q&8SH{}Ma^?gRUv5558ifM0{6czytfgFl01;4k2f;C}FF@HbHO$nRhr>hl12 z5olo}Jq|VjKLVSAUxCfR7L3ucU>mR%*cC(ugFV64;6N}A916AtF8~h%Zv<Im3O)@U z4#uK5I)I0Q$AU+IKJa+36PN;a28V(PU^RFGI0Nho&I7xFSA#vk`@!DeI<POe2}}aN z205lb_#bc}cnJC^8SDuT0>#!S;@3A~FH6=1g%z@gaHrSSD5(lmRmh<avWXRkzjMJ# z=fcpC6$>Bt@?*u=3a?uxLUAt1NAx4z%u29{`{;U-_gA3g|1Bux9DvS=d>2!mU6K7Q z(N`<H<<$3loM()rtQCZFE^k@gHjo-cGK2;R>)KWqGhi+x&jN~!-wPp{2b%OyJhfHE zLd$O_73aVY&XqGZKps@HtRP$4j*p}vEHQ(lu>r)g@k28PS3%8`DKqTwy54*)UUCgR z%&b3)mY3^#dp(;K&Cq?A@9Paw|AlYDcgiTwN$ORF?J2yR2KEOp28V&{lj?Jrmw{8b zzZ|RtXM>Bux#0aEIxhGiI3KJB7l4~UbY1Wb@LKRKa1r<=coX;|crzGBd2Rt^ZwZ~K z&nn#k%D8kVDDB_BugFOA_%>Z-u$9Lq(km+iXO&GZ<G{ASaK3667;e6l=Y-;W2X?3o z^L;c=s7`iT%^HMCt(;UNA5r6R4U=8-P>{3AN~Tnl7K(3SL0~v%{nu0$^5Fv$u4O3P z$dalm77qg>&1*VG*a7Yc1<06GR!&SOhdV<aqspmMiEMb7kDCNW$$JZJN#L8dvf*!z zQesz`4tQvMHHy_-k*6#jZ?%el=WxeYcA@R_nC!>9_36nj1p1`WK%UnRd<1(euCcTT zrVsRYBt#qyV=h;2G9hUm{~(e{YxD`^W}T5fDv&!aJ3Wv(dUWbIzE#mY{z`nAQ}qc9 z&q&WqGrps;Mx}>5qar+qW@Tk!MVgq%f+uFisND1s>7zAYNm=uCr93=iY<e2U^qbgC zBVy;|j?Nf0f)^K!H^Sjb{EYN)k&z0I-_W61V^u;W*Fz#a?NZsb?rbODA|jNQ%?=|% zB`G0Po@|DtW@Zje9d?FwJOO5VS(lkLEHyVHYgAxZMp__a)bK1Vj|6hDFce5W*%wI5 z7?#U(DkdoxFTJ7C$L5Ys4JGDcsW+HrDFv4-U91g-QXUEK$Hq&Wb86&>%yHR%z8*Mw zWNL0eTU})RIAmSDrH^M#wtUb&K>}lf6HCf!h?YKTSXLS>6*y~D2Cj5%P!po6<bo=9 zh@8_ia#R|Ox6e0WlG{6b^e|WC{*y{3xP6CajOfpLaVzs^fE3CS=?*=>8!i}U6HRl+ zJUew%&RK|($f?OWzqtGYcZk!o{Ha4Z`^oVinw6I7_D@aA8k!!+$xR)VmO4638_6V; zKD4ob>0`6gN1L`Z!G<*&Y}i>jxmhDs^O#_L_?}e5Y%>w0QGq^e#x{?axhTU;I<2JT zA(xIeIm#jDrVh<aN18^5VledN`qM`T)F%fX9~z&at?n?<b8M|h&D>75poUu4r75J( zNC1^lZ-5Ysq)SK`6;N-OjGQd3QXiEi2^1q8%NxjMp$O<|q^+lwoueHjkdd33nK3Mo zI%-5_I<gcS|0M!WbU*KiRB=dZbq>#V^c!ANHj(*vZ2UeV<D1PppR9?Xy<_8Jk7X)0 ze0V^P@sm>?J4!HjBBNQnsMZw3YXno!+`dlwBwnRnZSeZY6$@s^#>d!6r%o@a8dk2) zl}nCa6D~W)&oELxA)j;ij)m5QWL>lXXHr&Ime0_%55qsAlmUje*!Tn9gtWR7d5A@0 zbs)fwhydbIr8WG{Rn|aiMMbH}>L?;L#z9T-NIZX!NRd-))lVXhbhBod?DcR6t#DrW z_JupcVWs7qE-PL~;I-YPsc-dAhsvoXSg}(4)7=S<%&(fPQG~Pq#>Z|nKEYN}UKY?y zvfUBFwUYdQaOW@SRE;j27|>?Q$4e5+shKdG!)u|l5*8c(lAXu!G;<n;&_%-b(pTt~ zqw}k%UtnlSHBuG`mF#6Z)-c(qEDR;qP!vpwN4rZLE|!$|12<d3Z&0<vt3maZU7xzE zD37jcp`^$$<l>gDa7L0^u9SgJAqD0XUiyWw_zibz8i6&**!WXj1;$K8njvUY<Wyrg z36rFweG4^p_(=P-Vok6?z<`#z1)W4f=5i46<TDB@%d}mD0cozR0%4I6$w+m3g{ms8 z_K;nibo=2UDUb+RGdml}Av?dMQge|CePfz4ry?IAl8V106?b~LskkKEuwet5a3f+8 zz)U$<`vuUqvGIE%Whj^aZiGm@*D=cGa&R-k70BdMvG(cEQWq)8<<wCWV4+x}m4S2Q z6(cG6BN}a3z|V=yh2a`r2zkWVz)%+K3RKygZ<5c{S84(y%B#zB<)I-J7fI)K+dsc- zQf~ev<&?1S216FRSHr7^h`@g+kEaQ>G;>Vw^y!5YhtaL%P;g15+K_Yjgr267%ahQo zD8|Nbkv8oU7+O<ODz!oqE2{(9<){V27*Uf4XG{RID>nXfyY-z!QVR+Kk~yDPHi^U$ zXf-9E0}m@NEw2oyw66DLjX4z?|Fnl>#Lt_Q2+tZ*nGyL_oGmD|i?YQ`6iEgL8!C@l z<FQLdp4>oIPG2Ksbtb02yt2eJSAg*^Hh!}=TPeSb1)}t2T0rS-JsHTZlB}dnL^@=s zxW(pyt;+&dCx{Wu4W)|(D{5F;@n%z^k@?g4^tgPCTsiuwotneZ2F)S@xzc8X9PJ{~ zC`FMZ<>NwBn#0Mft0q>KR2T_pq>BcW=O0Amr6+uw`d689%JBJlxWj7MrOpS4DH7=P zZf%R@;oNnyCK_LL*izeLSY~cO%Q=SVVbPOd(qt~ppq9ck6Kyz)ECdNCZJyDRdj7e@ zlaBwir*ntR2hqe2AqI3^UW%3GvF(sh6Ex_+nqC2=BaYJo5?ZSwdEMhlFJ0bu*3?8e z&!lXknI$JxwKGixRITKQp`g|1LeR79ppHtBmv%=;YX*j~fiwZlto`Iplfcll;Tlso zzt(OuC#IJ8QBSGH<d@bM<szkW_dZSZA(N=P7u;rZ5QSA(i7sGlD68UY=~J|BA_OOT zdBT<nymcp}DyV_{1ys{)^E7v$fszo>?QSx_4&%%1a$dhCc%3Pj&6-mAtb;J&8k2Ka zE6N!4l}8L1UGt|@8KHUI=9%51Dy)rkp@1s;bM3&ktSIA!kC(ZMqT*U>3Xvo4|4RO| zTmkfODrKH1se1{D3du$Ss;fD;N<IUj+UI!_C8KO&r7oqg0q7cfBx)l=Pk`ls*!X-; zZAWX%X@=4=9=TDD%`k-(#W|W`rclM^QoE|Q=1Su|Qmw9N{^fT1jz}P(!-kem4++Fg zCP7;f8q;EBM4VyTU{czHbSYDnl}38~`BmD^lB6;6MJ^VYe8%u)1|zX*iBB+8dqh<o zsc}OrZ%i0eq8c`@HeO@8%V_eCyuzc>>lz}YcDo~jNGVifh;30E!4y|hiGtebX-7<3 zR?1B06-EEUQK~4N&aRe6H|WDmEVtm$K*|DJfRq!$zy`*JDuJ&(39E=i+p{MTXcYr7 zO&Vxw)6!qGHxgYXjiuUEMm165E?ut*d$I{h;})}45YU`z(0-y|#Xt(>)L=L?IX&s& zk2C#|u5n3(NNY;svCeJ|57)#<_R6ddP0Q`D+KWZCd=EiJHt7>$P^kG>=n=Q{vVyR% ziE^w7*HKS|la_15cvD+&k|!zomPa@(Q8T&5UsaoS^qGbM8j6W@A@7QWEyo7E!!Wp~ zBak+SRSQR27LhiIlsZxi!&8=9V&mU+610s)ogH}1GvWMmp2pH{U<|(AHdl4dQ>ivU z1A|Q2bC;chqjuaKLgeumPeR({GIi+&8H2*z;!<>x|G934YXqt2#oi`Ux^%~bb!EfX zh=If?@jo*VP3^sdr>dcD)Dufhr<pu9z|2+)JJ}RAY%!<^ykKe<X^<ETxS8RY2(TWi zr5#_ST^`iPWr@z_xd`fZ6E>62<7kbAwv@!_jLul9Bl`#wZlrmk=LABHjWAe-^TnM= zi$xluv#T^_8n5LMLpt4fxpkIGh?Ye1IJsc}N2$q>sR@Z~z0+9a+9PDlQe!hiK8&P6 zq!<<9=H;^z@*N=c5_yob!WoS9RZ})NFcHMAt8zt<Q|6scChA>Q{5>-Od!nI=)XP$} zAY@GqVRUB1I^mL><@w$0oYb1>&SXNHys4>;ext|?m?EDI*GK}YUbh+^4P_|Sav$g7 zw|(HM)>H(*HCckkTC_$i5v|2lrpUG-prmt*lD4~)%Ha=&5n_-V$t}w-4fULZamgOz zkutH3ogONM49yQ@%MS+A8T$3rS{-9#(nzk(L?o<P!CCIHb)_k^!lFA@8D<#!N(Q6j zNw~5~dPcQQt~Po*Qp5R<7*7GW!cfh*&ecRLTbAUPRm*adbR*4MvYHYWAg#h6vXXHm zq7K%fgbmM4mD6%&ope-lGM+B1$@(xHvCqm=v5+Q|jLtO0lSa_k-T_v}TyN7EHF1kc zQ9DfzZ(u4vCB52kqiWWT8--e@gXke0(<9V~8N8dYUM@BB<|=(*hA9r*!GMr;J=Hts z8md|9)828vEjQY|wan668)uK{AwDBaLuatACIk9rQ$Mo-DNK~^)d)A#47}3CC5E>O zvr4NIAiHSxz@)62Z^Tqpr%OsD*GMg+bB?|y4O>-HYx<A2VQ)Lz!m>iXN~R^Oa`Mv$ z3e9X>R&Cs}C_-q<V@MW-J&lisru%HR(>1H9a`K>xu(Zi&yLkGAGv&2t5!vXMHZ-=j zE^hqkw8e~+vTMMoqU!mK!WnYF3(FJk4CE_N0ky$gI?YVM8ZjfZbs975jQalFW6p*r z(W1UbpvYXdfunhhw4nE_Y4VZ_8bYk~i)m7it{1&*l#j4zim5@WJmhKGM5Jk*U9Xx6 zD(K2O37udIZ%F*LcSg+MRm^vL#%hsL(PzI>E5}aOY0nHJaH$356ZlkLb%8AR%Bwlr zgi;dOpmG{ZR`leVNf{4+q*u6xBr*sUa)ap~M%5@)EIHYhgb!MB`*8xJ$RD%oDlc)X z_2P^HQsEloIkIp{dF2dEOBAZ`n6%8N>{N%fGzwLOR{Q9quG~TelS3Muy6EbvvOu=- zT@9oK3{706=S8d#8L7{;OKmnghUN3=I`Yxx@D6=uxp=;-JQ0f_qB7+m#i{wcDns$5 z+L7kA=>oE64bOF{N^Jm{R<CI|l!UsjB;6$JuU+Oh(>gArNhQM`G1(L@uhgM=p}WLb zO=2K~#wJD#;aO%m@AgV2u5nVwqwx5vtsy5PQSe+j8Y$EoksaD7_*Ib-uHmJx_cR5{ zESXT5Z_9#YU1Q4vqN9Q-kM1~3GGnEdT3B_YNkOd*YLr?qHNR}4Yh^$Vlkf~K+JW17 zW61&~Jwy|grfQ&qv;k$Cl8zQ$^3k$2x}0HFl!{G9v>#A0i&Bw8m8$VZ`jIxE-6X?H zrt4GMvGH<puhZdVeAaQ{W<#`BK$Vna>L+7}NU*5;Y@1}hOc~y|5ry!M@e>&v#lnI% zk1SSsW|eX<cu0jbTyir@aR)pqRud9M(IPCc;YBY|UY+fhR;d#mbcrd7_E<BRXd*J} zT4{?>q;+U=e$vGndlZt69%(`-UuT+zG1F&JKF1T8Pl3wnD=J>bgK1$7dNr5?mj}yf z2BX1r&~C(<H=~q%90<`38}7UxE|Nddq;J-F<iRInhrDO2GrKWO8W*_3+FM9c40*(f zV#pp{p|RiOtZXPE8afnfdr5W5OpRqirmU3}8TFL?nTK7iV_ORuRcVDq`JA$#fkYNg zpdy}miMET3{qo!$nd)*EGgK+rqLAb>FseijFeMwq^L?_vBP?hzoS9MjI^srfOtTXE zssn{^Z3^pnzq*~Nv(egOFc4hxywWt2R7r{<lK!eGMo7FQsEA30q3eWIt1QAP4=Orp zNBdCY1B5-pZaAnKbJeBHn7GIs_YK4E(5NI!W1$8S&SaR<u+cb$HE!v}Dr7esvbL@> zs;Xv^2gWF<>S7s0OvV+aZ<*0wYrinmEV4&w3>IN)gf3UMHfpx&Soob!b8}{{+N17u zl|Z9E?v^Q8;ng-2<r+ESnZn8;n<BZYo^<??@usk{vaFmQDNWaqDTeVaJzTMMl#C*B z+`S|z>=V^;gx$u{TT-j}ux+unwCJaoO;BV0v#lr}N7fdfY&hnuFoas^L?WGP(sPZv zfl&VnEk%fM{b6@%TOFI_9?$AYK$o@tWbH#c%uke(0mxZ&6xo%+zY!+uR+DmCdZDM! zY14Vf1yhhWO*L#`)7}ti?WsnbX?QfkOh2$#u<2lJrSj<@=Cewtd^L@Bu)Cp@TJ(uL z^X7D}OnDhfpBE8nlv9gc)zr){^hz!&*=}f2K=+#n?&pWRb0uSH$@5#3!;xE4`%Q*u zTOcYY^7TBC8>3Lz%T?=Mi*dhOs!=PW*gsbxl5RaMqKs1EPylHUIY5_$jg+Z|Y93Bc z_#$F1pG+W-ds44lya|4Z^`VE{Y7>i0H@*g<Z9P4_)}X;fRATMELc4{>VJX@|cj_vP ze_}#wkC)Fth+!4dPIA5&1y@TfG-DLY<0W^s1NQn8awBc+HQ&u_tHS6lVV_E4q;}&O z&)E1xNi>7U%OsT@ChM%4>QbJ|Fb^I4ZgO?^PSu%3bbsZCM7+u7hdn3Lb)3J5sEyP} zms6&YoQjToj#~pZqFA)V5wfUZ<ugVichWe{XOToAcDm^HzK!;v*9~2V5obrxXsr)i zG3=B=RrXqoW+cA9!4Rs_{=BE*7+I?;Yh?IVt#hcIhnO0n<`z?<$kPpYg3sA!7CDo( zHtLvFRK#Ogn#p?&%No#$kZ8_Gp;z9?S9M6ku~xM-QHG|%7t#&V!rmTc=6Q`;3})hb zkOeujhF|TeS(R$E@QSjifQQ2US$$b|2?vn2Y^cJG%+C%lt!jN5Y4d>2!t5!5d|6&B zg@z-#+Fu@>t_e0KESjLSNR^13c?{$x)8;lK?bRpA={LK-yOsdNMv|94L=8v;)l-ox zY2Nj=^72xBT+d#k7@5xl%GKpn#kxALnp7<PtscSSQ6Z1y-R)v>sI8@l4c9NU>W$cZ z0WHJ|S3;s~!c8TqHJI)hLuH{Un_+|YL)oQ49@7dZ)J*cTjbN61MDy8}v29j_)Q_ru zug=n@5S<n%DVKM6MOimCLTaNo7*Nen<}tcW4SPz8fr&h_WlwG@<jJkVN;#v7M?>wd zXQqT1W{Dhe_>mv#jHlq`J*#Wps|@-c$XPt>>z6hSOC3;i@k!%b^f-6bBOO|noF3Or z-iMx~;Z|n&H!msvz2>dWFBTnAn>^x{4eh&6Ed1@G727*x+;_|FAsnWx;nw^z;FI=O z%)I)YyT+$pd*GB!Etg!eqp;H}l}mG<J~^%SNnX79MZ?`#7rpHF9<@DxyziUX+}F<S z*eCbZh1;%Qn)d$kPj?PDqUm7$z9r@JA2@1dNw-;F7JfQm%?*Plber9J!nJQLyrx;~ z{&CO!@JX*j^(-R7T~cz+?osn!`{<*A@4h$Xk$=_SQ1t7OCqB68tLw&;&U|{b%sRfL z!oKLXJ(|Ay{j$kV$A5W6kGZpdy|a10X2VWA=CeCKe(XS}X6dssSh455N?-J=A2m7R z!Omx$_)X#9?N7|@8F%VoQ;!;b_S?%I$-QCWkZy-RrtdfsZhy-7t<A1{`}2SO=iS7% zbDypFqoQ~FC5zX#@3pk=qd(8@Ib7f2Bix4aZ?5Zq>FJ46i*n9iy>w7f$8WdRF4|tQ z?f%~1mAqeDbv`qnXvz2V=-7@Ernfn2?>jNQA7As(H{*(q{ZDzHub=w%o~b?W?^)e} zcZ@XL^4K3+d_3ovX9k>{P<6z;w{-Az`0|4B7u<c+OTT9QC;iMpF!_BA_xfwUUjM_p znVmb|p7(q7ku!gqc+&ez`gIwd+d66A>@UaOdKK@x@gAiwdfY9CPQ5i|)w54MwBYp} z)7t)L<=rI<F6>@gJ0|JETY8^SUC%q88ZP^#g0He(yZm3d3Hv`jux8V`r;mN;)SFj6 zJz`SYr$_ofIgM$OoC)EJKJB>6zW(jiitDb-*t+B--=Y_v{b6pmhj(tg>F4d$wO_v4 zHIsMvc%RZ2ebvjmw%j>*<T)RAIqkwpzjkk3x!}t=`}@w@zUPhF&F3C*E{AbdXt>_< zO70xIvd^QfSN}e%?&L8CwwB*^@vTz_r|n8#9X;u(`E{IQq2Ug{bWh)tUVrbm!8i8V z(PhKt-=kmH+JE`GJu9}om{@km?je16r;rJ)FZ!ir1>>GiF79A$AHTR_NKsB^^@`~G z3cJ7lRQIIj@27u7yUo;a$F98NlatE7U;N;VnEX~-;<`S+^5M!sOU}M^WsA0l9(CkC z6!tz1=WCg<>6=$4Z&}%E>2D{`y5zaGj|}|qr!C!%xqaa=gVx;rSub9IYcBZ??|N=w zMa|f8cOQP{eQDD!_}~lw)P)Zg*Dk%RaL=r>7d?9$@2+aN6Xv(MzSXz0U+bMR^0B-= ztKa`=@iW7&O>UR_$93u7|Mt^e*YQ$(tfbd|>VMX>ex%EXKPAn3xAz;pQnx&r@ZIN~ zK3#cUkIPT5Jbclun3WoC+|ud2mL^mLDj&N1mTwQg_@=0}XVtDAGH>3@q>)KSo;>3Z z&K1#cQL`ui_V2^boYG|bgyVM|8FxbS4?E2D?Y#Ml8`k@d{o#Q_ey9IxxZh9mA2#aE zrrXv|$T<Gd=@&hIWAjsw_q{gxwE@2!GXJ`VUz))C-n_Wzi~cpg+muhnpMPkNZHIli z^zJ(bJ(=_2h5_%~^S}k`mQ3Aq!B72oH(0~{vh4D@+!fb8+`j0^W>Xg2FreT5qGru6 zshu?Kx~CWCJ$3PZ-hI_@qnB>KaPy6CT^x7D>?=zPcfR@gF&BN+^R_bzHb%9(_CI6F z(TMWCsW1Av`wk!1J#XU4vp@LtraxZp@$vWmYc@T;_qWdjr|w9fJfWtP^I0_9;<YFJ z>)%7Kz47Rd`+nN^$mgkR2L2l3%l+=|vJL+^bnk`xmUBLdhWn$c$(xtYFIs!n?t6DH zIBamyZ*dnLJ8$d$GapT=F5CWU7hW9f&3mQ3=(R6@viiiA>ZUY}FOIr>*E0*|fBgCO zL+)Pn(-UXjGH_(sm>s-BsNojAHGj_9lnp<g`0yF44;lC2p&gpcO=$MS+zZ~XpRoV8 zxb2_vZn1{@bm^@>UVqPXOS%On7Bq{WGj7d++t-|R_?$D(ZhhyY2L^ZHz@N6QB;V?B zqt7|yo^EH<CEWgD(!b8myR>y(>r;N3xcu$h4Oe~H<=t!1;~MVL(uIq@s~G&$QAzR3 z7U!1Kuc*A%zr5e-;OM6+#_#T%i|$*c;f~r}Q`Noqkz=|))^quLJsv)NSJx%0j+%Yd zyUVUlUh(zN>FAbb=w4s+#OID*apHGPo;fpW$?~7qr9Jq1?Mp>pB}{L!=j8LBy5OP@ z=^x`X+=2sLUcR--9nWq!_2Jf&wvW#_WAU)Wrro-}e*U`;tx4>|``gyN8t(l39c!yb zeOucjv6<i6z2m6U+P=CpVe7*inm@YllXWLupU62ZttH>>dk-%@K4I~OwI|$l+{}kw zo^#Z~ALp!W-tU&z?+y0ee$|JJGX)y%`fqPK;>_FH{p<39$NU(~-uXoTo!#3XwfW<Z zcF$aSNayD7b>tmz4Yz5~uw&nzmG;Mm6SkkXv+ENHM`ho(Y0SejuB!WK(+yt@Kbpa< zJ!2+(ez{|lTd#bvc+Z|?H$C*ts=-Ixdf_2CzyEr4LEYQWt$N^uF}&-q;g0F@a-WN; z?s$6MjH){~4SjIdw!6BXv~$zhqual9&I?U)-(%V6DGe9ce0$5wGFsI~J=kXb?tdq? zeKF_C{4>w$KjgUk-`+m;u`6?U&l8#UMc+1QQd#{k*Uw35GXA}V?~faLYWZz1^j@Fd z@xgHkr)|9Vv@3XLU&9q<j~&rHr|8tFS+_J@&||~PzPI}S`?zP`IXPH9WZj3Qoi5^C zbq#mIo$LJb2Jfyr_ucyI_p}|kpu^$m!LQzpd1305d*1l<*j}^H&y4-PXlvX9mF-(( zubG^){rjh`Iph57udnJ?b7JwK-CI}9y=?bej32V5>x=&C!2Y6<OCPyn^bh41^|^H1 zS<gSv<k@EjeLOY&foB(unK5w#@4Rcck8Zec@dbm&zCHi*#q|qzj{Rc%+PCl6c<n1s zoYK9f<wr-pw}f}Pkr`ifQty2qpC0qCl$r6>`%inj^rllEn0;f(uI4*Re%W^0vd)hu z@FKK^o3L$F@oNk3+4jnsAK!oAi#x`?w|CXu<<Fjz`s4pY-J8HiRh|F;HzZ&P*aSq4 ziaKJ@D2Pc2At-7<z(GM$L5&)lge)Wyl9)^&DAvKCB?elwSh3ZL)`hCAxKwcuZlF@P z+7_28txKh`7SSrL3%~dCoO{pQI~i=%*#Gx`UzvQK`#I0qp0l5O=FV;fbF*G3`8D6c zSG||tf8ydh2A%R~<KFjOcj|dBo;P87!M`I_|JZX<^rE4coih9qemj%L5TWFkUw!HL zlg|G5-SNL`>+_q=z2Cd_)?@y;<(TZtHeGwxllSj8{1x6WW%N!xdj7-53}1eJ^rLa_ z4SD_TPaZhoPsc1g=k`r+w(YxH?&>h_Q&PQ;78l(3NqxhpaKELuymZdx*PQg>zYpBB zF!R{y-`o2ioj?B*<+~@#vrzJePcQl9@9QqP>&yoR-Mr<W-yeI;wHKZH;EuB<Tz=Mw zMV}12h;w=8sNRSx|F|OZ+uir>zt6$@obb}j+mAfq{_TCIS0+VMpZ?(5U+jMb`BlAz zbB7%gy>i8F9ZT-pXVwvmm;H6ZiWdhB7<BEAAHDgpr6bOMoA=VPgAhv2eEO7>y-vTZ z{lS8((|&mB8ADzzZC$Y2SwB8w@8h0)aPk?amh&EK)!V-1vL!>0{o=^X3;&wD`k%8m zy)*0Si{4q5U$AOz!;=^OZ1p(a#i)8up1k~DjeReC{lS#TL-R}DKkCmHym{h?1D|@~ z$}?IH+Wx{@C(v&&FApW3_iFX5t@EDQ(f9tp%|2tsajzB?ElWRX($3$!Hvgx;y=n2t zyBuel>fM;N`R+cY3$8w9-HXw8ZvIEVj3E=pE;!`9^AFm5$=g4=X7*gZv#oj`Oq+N0 z(sv@CO{>TlpZ7%5ta}IFdE3pGy?^-ZcfU8GY~0P*?+ev?eeS{|SFAZ;$2*sPx3K7d zl4sAad+eAsKU{KBebSKczwpfIGl+L@N#7Z7E@_{9`72x3bieq6Yp(m<U5nQo_N#uW z+ooJ`#ngijxqj#t-cg}?Up#wG$6aUSA6Nh3$2rGd@!`mqUb*qm{3*}wz1M@c){W`= zIsMBAs<-x(l#drr-~aqYHy?KQ{u3^L{;dVWKA7Eg$M1&yYvm(9DZagucY-jt3ne$F z)b~4N_>`Y-n>uOJU$>T>IC%Ow`=0amnOkN(@x3Siw(?r))WfPbX7E)z=AE|B?vpki z_WHejPJ1l>=xc7+Yun_Z=iK^I$=toCKg_!ph&z<r@0nYVD&C{t=P&Plj<e?2v+f&p z!yhjh|9MU2sgW^<K6lmMpQOK1z3T=%GG)$Px4crAHaGgl#m8Oy&}-wLyzJ@I3x9U> zoHIVy=WWXN*Q$5(pPkvqht_NvT)5&1r}LR%i`O4I{^n=Ty5q$w|Mi2<A6~ec^4(YB z{c!5yD=!+~eAoPAK6-ZM;kTdqz}2+_pPKU5!~Rrs_AQUDI#AZys`uXbS1%9MK9s!T z_R}|&v|RneA?vSief3{mH(#{)`z;TY4mg+hqp9A!-ETOsyWfwW9eT(5F_*VYz2t94 zt-Af`ORsve;Dq5X{OjXK+IY8x>b+arwtw5KpT7U-pU&(zqx_u}2S?5r{ZZB1CmnV9 zsaO5r_wrSdX>0(7lCw_z-W&I9Z(4ciwi|9+@%I~E55Ktb<<pMt_t-t3jo5i+*PE2@ zovOF#{rxNd+;-P%JNFvCc+ugz4g2)YpVXc9yJy~>dEoocob&maKjYmMLnXX%dtdSR zA3r*M$cW1Ot8U$U{yVRJctpRq&wpt|`|$f#m1q8X1n;d=y}I{4NEv;}uzNpv>!jVU zn)1_EuXudk%Wq%&qq8?2diAj%-nWvCf|pe9$OU5tzq0=E@0RZI%w;XtZ#-r5#wBZ? zeXV53b01zYH*$Ceb~y?ghLYc2b-?e3uXy0Mi+**%lE2=1^a<-S$L>*4c=7Zt??+qm z{&n`Pj<Z_zj=Xn|1222~P3Pv9w|@}6=Zl5ETyS>3$3A%YkQG1N<I*Sp_30Co8@8dp zU;3AYfBE4F=Uy<j|2e1pBKygHKm2Il(d%|ZPo8q@0f#L~`abXFQoREYo}V`~eP&nv z(|i14){Xo8<p%>6-SN(r?FT<Paom8*hWv^C??u&n@wKh{9Qe?SV}3bf{q1vKs2p_7 zgKzxpjo+j%IRA*&J4Rl&Et_|7@N&XXazm)}&4nW#yJ1_yFaEOkpRYOhoo!j`qW@Uk z|NhC_+r~Y9|Jl4(UG<*0ZrGncnZ01xOUwJ6zt_vteskF$D=xkNsT;Q6HQ~J0SqC&T zFL^=rvQORo^gq^qTCi|p-D5=`UH)MHE1y2|L~Ydr?@ZV+t9!>Q%r!oAc-MA_f5#tH z%C~Rka0)3TZ%$|_onBYj+}P4s6A7JG*V0;1ADS6yt*UD*&CAKlE9GS1yjJ$77nYuO zeCaH9JkXzsn43Rp^te%@M~}%JS6bIlS>IY!U0N}39t(1gXN;<KW6?KYl*-p6>&&Kj zOKF5JUsf+DWv^Ke1C`eB6feSKp3;`)%2E;X^GYN6c~yLWws}-#FNO2X)6*nd)n6+; zo^@<Sb<=|94W*SeHIm_$uVt=X2U`=VYM$TgVX|vgT`{kBf~}F?u&rpS>!r}#8e~KJ zHtP0y->7ce!iwb0mh<E`sb8gm*g(7%Q`y*1Q#YryCQ_^4#_Z)lP3XNGXk(K+8tdgi zTOw8Ub+c`tvEmP9w-pu~R(g6}LsjE~me5Ick(ScjoYJXof0dgvDrZ#gxSaglQ8}fp zY%G=%5-(2fjgaQ)A;#VasgmzJlePpw^<K|Czp|O{($~$a{#IjYsi^-}!>7jbdwI>( z4V4SO?WpGS_2-)2?zk&jBaO9;4%SHDsCTf#jQjGRmeQ8_O)Zri!m#0gvzFp-bG?(& znh3APidpp=B+qR${B*XQTeTVfM#-#U1e9-!_Eu<f<lC>k6_`BrN@Tg->mzu^dCt68 z-T8*5l#`@3@4Zma3*rWWZ<@TyD!!j?6Zj27WAey1bH7$-!C7&jd3>WpMR@fOFJ$<7 ziRv*Ev3*TVgky(aue}9x`t3}N=jkzRTM)fd@8mqX4f2~6N~D3KjCHZ;VJv~Y*p4Gr z70tbrV0Q*8#XqOI`G{UDw3-N&jIW4W!+sm4Al<#QTGe*>br!3;Zb`mTo0ogn%uCc; z_FknhmdF`Z*U(Fyo?A1TT4%HLKVn{mY%$of{3?wk*e#f4_}5v^|5uitQ(wimE5BAc zcO5?KaXC%VJE6LE#h^#Dv^F(yG^=;QwLN%KOGRs2FNeuSM`N${4ZRqc&3Gj8ZG>7A z;e9EUv31o~sro&tR86F1A+H3Bb&B68G&20{OaY|pvNh=2=(qK)`?2mM7RA?C@CQck zZxE7QarF8WgGoze)55Y|$*-P4w`KEHs*k@P)?M0O-VF7PcTK#^sUcR$d!bNT`03Tk zUR!Hn#Kz`WaeNgkCTP-Zg%aS`Dw7_e+0LvcGN+z*uf>9m8L{^!4R+Va{nd<K&V#>3 z@J8jD#$FDeeN$f1Vgrp?=xg*MJTK{ufV@sbR<peuq6S!IW)C){-?Zk&+UQpa$={RY z=V@c=ofO&HU&-q%c(m30P3E1uZd)v!15a&Y6{q)_7C*pBZv2arZzGlkJ!1JP<+y7L zHMPh#W~_(&HqzeEBkkWtEG_?&SR((ESepJPu~h$0Vrl!I#L^>@Z`3^4(wJ8<r`MJO zmGW}Y-sw1NcoyGm9(*|;a72J3ul$1Mv_UnT&3GJ{qnUg*x>B0_mbf!t?{>OUnzJWo z8japQu9W7SVY#y{ceUkKTTXs&(D>z-V^m6$-#T$Qe&xjFLYx)mxF&a5u9W6HZn=$? zdy5Qk<N>{RT`A33&3RhG-QY@TP7Y^XISz?lzAL3UFIjH0<w{8$#~0BnccnBZm4p~> zpev<0E08#Dh~7$9N^|mw)NqBal;%8$#PLA%x?BmrB*btlT`A2eAp(x`p(m#-MM`td zBrwB$&y~`gh~?U19D#9s3cqcxl;*r;xpyr$jleiUhhDKOr8&=A?j_5W5E#dzBrUF# z=B%~c-IhxwFpi#~H_(;RoG!~fZn<m%<ER*VBV8%YdDL=GT5g-=KC)aJ5pY}yzl&Tc z&3V^y?^!NP1RMuKPfodsgzYWYWx1i8G2{3SdLdV$JS?};a@&wNZiC)Ou9W6X<D8h` zid`wqxee(s)m!UIX-<gqT87JVr8Is>klz7Sy(O-c=G=$0K)HupDb1NgW{qChmC~G2 z%avR12HGn}>qy@kS4wksBin`>;7X*$a`L_waZPhpAyuj0t6hnDfYhd(yarCBH0J^g zW%L%iQkrv<<!-Uu^Ok$ba>*FV_}$Hw(wvc&%dy-{%bjkyD=qgk%iV0bTP=65<sPuy z2FpETxj$O&Rm=U=a^05u#B!fnZnuz^j{&Zf=Im{`{VaE=<wjVp$a0e`7aqp9!yT=s zu9W87ZMk)p8-K9*&87iPkt?M+*IMoumb=|@cUkTc%ROef=PdU-%e`y4_bgYN#c#4{ z`s!VYc##$=_X}4_b50!Y>7DFKY0f&!J!rYVTCUr2p+h{sS+11kgtIx1YwY4m^y8Mh z!E)s^tP!eL<w|MJg@=1wyDL%0EqAr$w%~E3`hCll(wt`?4ELNXr8(yx;c*wbQkwHi z%l*o7FIw&omivq4-m%<v%YAIQKBK%i`ngh?GuU!_S#Fr+4zXOG<q9k}(Q;EPcZ%gs zv)pXU)mX0Ca`P>Bk>xJ2+~t=0iREsy+*-?hlxu#kYk;%EmC_tuA>o{-wjb+CY0j@k zdwO@cQkwIc<+fNZGvCu2>PpNREH~0}g_av{xv=G?S+2x#rIxF;T)pMmEVsyVOD(s| za;q$NwdK}W?l#M<v)qH0+i1B>mfLK(*DUw0<=(U04$FOJxzsV9tp>VMnv-d{p_a?G z+(^q6T5i1M!j_w6xf08jTCUb|^_FY1+#<^@wcIkxt+w0^mRoa_<4~a(-)?iIH0RGq zi<EoYmC~H;Nari}u`4mIj`#dN<VtDIo0j{l<uZ=(^oF=nnsbunW?1e9%dN58GnRYK za<5wM4a;>~?jM%>)N(s5H{e(=E$Ob5=Im#=11&egaz|QjlI6md8*;qkG^$-PT`A3} zvRtj@9z<$Vy)IWub3R78K)HXrQkrx9Bv0=qS4wm4wA?+Gd(?7ITJAN=ZL!=PQyk|_ zjpH}2l;%8#w6Ai%bEP!rBc!3q?QkXRasub7l{?Ut(wt+EIATtHnczz3oyd3BjGil{ zIprsDELyoLS4!h2f@G}SbI*(VHSYEKANHHPa_F{wvMxQ2pLzC<P=A%hpgbThZ7awx z)h|}tL(ij{s%AUeKbX`pEh{vsV^UUTxMNmUMwr{w(@qaBelI(TA8TE{C@XZ|M50}{ ziR;5#!=1~rio~IFNmf`8kD+j<{6i`-Qs2#Zko&OQheawzzXbgb1LD10y}QW028+81 zUP9au<wrsF(r`C8_#kGDF}lKyqh!L`r10`RMJ?PpEvw{Rm58!jG|MIOoY7quceOt0 z`ka=P6Yf~LijV_Ac|n9zO$dZVo)*hO(bH3z@Cw82i?Rxx)=}Z*yGv~9VcPP(BHzEB zfA<aW*!GPB@Q}UroPL;4iZ493>)3FodTSq_)MwE^e;At1&616fhACc&D%*+l-I`4Z z?GI)Ziw!R5yLBIKF`C>C-?@{YMeO>1!sNUp$wAj7vVCJeP0p*NRdQ7%afLfOY6+$z zoT1c)qC(V-^M)cxvynTCQg<Ju)|i%6)G;Adl#A2vDH?fkS7Z<MiAMXz6baIEFM>+H z|J?xrPHu|Bol~iB;Y^bXV@K{o=Dxix(@9_QCpT)8i>R2BvTBWMXAxc}Wi?4L)S`En zt5=);Fm^~^@(bU+MAnr4aQ~y%w+<EGP2rtg#xpmy?oDlXgSd(R_8p<f?y;LATGRE$ zDo)lw{ECE*FIUk9-)&;k6t#XwJgKc~C6C>Gw@%-=b7wb}m*&yFPAhg~Ppd_{=@8Bu zXhTspc{1e?-cXbyHyf5@NgL?z@>tHaiTH|4lUnD~StCUVx60!>qidmHR>M%kq?tOA zBdJ^xeEY@>oJ4|fTW}Y5{uaDZ@1<Gxl?E#&Cp8`7X<FyT$)mf%%U5a;6uN0${)#;# z*<?&IV7xDl;!_)dSR}?%ufoe0mV}o#mB`C|oDXm4;huhPQEg4f1g$6mk2suz!#Rn3 z)Z<W}$e{rTtr_t_HQ~^d$VW2{&Eim`wLJaasiSH-!jS-z12bQl4MhXVh9h!udmGK% zYexgyHzr8{w4;II>c!t#G_ZY3A76t*u}@;f)b=eQpCT=jK-`u|yUC&5{9dXUp%>D= zilk1Yx`f_H0j#5JoEls{k{hWQa`Q1r?b`;(&mvA9{nWJOOR_|N^ovq2Ofcb0Ey7q) zA52u)!|AJ>W2A*f_OSQuJ9eXon?m>-P{GYvw;TVwh{HsdA(3-QdZ{Q91u4k{sIme{ z=}Ruc-M#A*+256t)0aq9ckfand0T(Ot($!L>BG@oUY=rU*A^mCZe1EvmY+Wi*dV4~ zlq%*E58Y?FLCdco>hRSwbm`1o?UAmw{1~D&w%FGfHl3Z(4wDJBL*#%sn=ez|+FK0U zxg*@U$sHKgp>soc@#EPfvFv+~$zbkYI^drkZhx;xtD*FbA?a8{PHW$-?`m__mc3aL zC50(!*&^kL6rwP+D}kUMspoZ?@5mt6eW~1P5`@54hE&8tAG3k5sXQ`Dzvk)`r}j`P zO0`<Acv?M!Dw3YTgk`lDW#S?%%Iv8{R^qinK`rvWB8mlrirGw5gtfXaN$NzmEupTk zJ$0KB>I&Oaw=kiuuswB)66y-uQ#X`QSJ<AqQj>bxLD-(UPC{K_gSwQ!3LT#U1tAkb zVSDQGo9A(95M5#8bT>p(T~dk$B~$+1O-R(k?T;6g`CEo*Ahvy!o5`?LFFP4#ZXsbb znO37xXOC90e3qFAQ}bg@f#x!cRyNBqlLK<jM2zviNCneiQAyN_+aE9Yr86*VZ+|Z= z=_$AADG&S7LnPrMx7p1ylPPLxAWb<sG_)Qnq2T5Y$kC|ShZJIig_(@MnfJ*O=))V( z%E4}7Uzg%vMEtkO>HOAGvuTqpKP<~IYb{gkw@j=*qmWFd`>t{GjMcu2-;Ks_+Rb64 zLMO7H1c<A(si|2-_}f)wqDtBHG@1G|1Z`WNmSsi7Gh?VCkrBRo!&F)lPpSC(UnwN7 z|1DwkEXO|qh)R1~o6~xL$Tm|HApsV(v9Q^JUUy!2SCzAzJeE7HULUTNbE)`oGaWT@ zR3-u8PH)Ym>2;k}7$>_VGsZHG8`K|OO-Jo5&0L?J6*@G8j->+lE>GMTntY7``|e^r z+x}jOq+DC7nh+bfLs*+z6Lk1$!aS+ibcN=ts8F<u60F>k7VXiwGAk-tzD1x8VK3Mc zV>n?RTuk3JVO<)kGCdl&UMmtqx_Tx}Bu6c)Jbss=*}gG#Qs>4=HY81Iagixlqb_pM z&f+$yBotQ2Nx%4P?PoPa*ObyhEnk>Jlg+s=M7U<kES1KTAMTw+#T^r94RPK&i)M99 zn3aGo@0d{DgAOmhZxz9Zm#-DLFFSEmB&C+5)b7gNn7w1MF@Ai4qALltW3l}25r1d2 zOC9BZ4@YvlQTUF<3h_C``FZ245bxX>-HdC;V)>67lcUE=eEpqm&onZb_DgYy#6M%> zSY3DNSYZ=XPO$d+`Uih_-kMG#==63dh>1on+XM91zDnrrM7&LH2<$|3>+*txO_Ms; zpV6j}wOL#m-29LOW~uy(PoK80X}DzCo?d2;zSQD1EO8J~N0_=l34+EqWWA8Z?_x$; zeSEa;Y*g~^?Lx&(O1-5)cN*bk@9fg-BZfMoMZ_`=@`CS&E49|dA`f?_te1S`tdrRW zyDyHUq9py{l%)F%^Ayaiteo_R2d1$}Fjj9=M^nm_G%FBj!q(iq+txX(=rvn$lL%Ws zGEDJzq_BRGPjs`i*7nEaEF8-}yKrPLGu%nzreR6_yRVRcAKoy!D^>wx`l_Ches5IP z2$F-$nvNt?gL9hr@>RR|bo}A9zegEL*CPfL!xZ}K8EFssJh~+~P4*MDegs1*GQ(Xe z8L-10)qzsYf+D>#IFsmF*(8ue7Ea@?oZSQIH8+ZT;ZC)os+F*Z=XDds8=|Wv3@#JQ z1|1UZ{gcrfM3!*8(TEIX(R8w$)_w2iID(qXY#mw`R;0hckQ3Iad#nXgmBVK7!t#1@ zf}tVdrk>X*e??^X$z)b*7pr%PFP1Koro9s;l>`melBGE@NZ~PGvRlGH&tgqWAD;aJ zG8s<R{R5^ui&ts(ur7Rl$I{i_t+7fHrAjb8>_TKWqS<}+wB;nwQ!3X~i@F!GN$?@k z#x*q*&I%J_&mjABpQ_~(mk<+NXNP+02&bAd)HpoS<tnwDjlRv`gbYnXWW4%Izefw3 zW;@ai$0o;1yi~MU4bdU{C6b?&czO}noMZF190|XO=|V`FM@aADV#n3S9&$}5e&S;{ zA+@*VaGJ&qRVzHhyG*YGV??a~^|!CZ?`gT}c72F)vrTMS)>>|561h%LQo4c0EVE9D ziDWO!>Qa}~aOIM$jmo=JGKtVmn;cHigoOeNCwEsi+YLyQ9NJmToJRweQD$6fdixYz zr75KeQ1`<0d)PIdl78`2w@S0A-nCEoXu9w8_A%P-c9*nx?ao`7v%h=sUal7s@5NcP zi!^A2>R2Rs*QiMqQp+OoVv;ep^$5Ko34JvQE&ESc*EezWt$n&D#zkf#mpyA*O$m)V z&fPPJ$^F(gMhekz(=jei+sz6S^O9KpnyBNo$*sCG9dhTZt|ASEyrph^+B2kD_Q>>$ zul5MC)yK8$Qp=fba4%^xQ|(Aim=ZT%(U{RinPugO^;k4Q!Xi%kB}d>a;$G?P!~B}2 z3Zz3(?b<M@qvLm*j^AxqA&0_fOJDwXu{MKu8$&eHRVjNXY$~9gDlf^33M(sGGfS2Y zv87NBg>p+^fTvso1N=(WOTS0Q_zQ_PB4L;TWSP3T&2yO{kKWjNhG<Rd><Tl_mq?`B z@%sJN@zd<oe5Jd+Zd#ff3}ax&giN)k+AmE-9$a)E&+h-HU$FbX|E{gwr(2%|gkt4i zxb^1GOsxsY(~llqRakfTR+G&55!v5MxZ}AlY6>T;%cQEBktWAYHpRhK356w>q>tM* z=FYp_7`&BgA(yM{?f)d68^{#F&WGIo)ApVAImkW|R#CXG>A19o7wudjyG7bpGm49I z`#LS~h^JkPyK67B#Vx2^E(x{TW{Tv6Ep9>W3>l)Wc2^*5ar3k(XJfkdU@vW_vtEAb zprvEb4th0V`#WfHpgOG;bf29r$tw4=-Wq>NR&9{hK&i=XO0P6wEawrYNfl!^leZ;V zrc-jGi0!6%v2M^uK%|Q2HOn+Csoue;R!FL4w2-hgbi!>yrVR>6-*>(C^d`DVo$ge_ z+)i_|K(|K0(^hsJN~s%)Sbzbw1LL>vI6OkHYpmjOozMFxqu%^#A}I;ZuS_bp_Va~G z{Dp+tu~aGz>0b*tOc)X@qNYoDcr{sW-<a&?ntglqg^QOi$<``D3U@4((EYSjN9eXV zTI*HE(r6rAWV99BJWJT+hHerddU2LZWN}j2Rc~J>jW{X&;tXtv`%*wI#APut>WbYN zc#|7CWg~F^8S3NAUHbA%B~GRXq9jRi<X%@+bfUuf+@#o8`Grs!{bEhWkO>JKrJL}E z_6`<?lz{}pGpYS>A(czyj!Tm!H<~mNJhOI2rSM3hkm<|cL|Gy-Di}*uJJeWiLRTrZ zGRq(xJ@;CXWlr&P*T0uTUoO(`U8%u-SzZ_;G+4=uC;Ms>D}`gRsT6~2Q(hWu%!$Q? z=1xk+bzKxF5piJD*v_c2^%VYD6EJe&)UkAkn3E7B(UgwpcPz~elAFn3$I=WTmwWw# zZMr9j@3nZd8}Q4t`I}zEbBlEx+WkG_d5U!(Xf{b2b|iZCv>KQA(aAR+gk*sA4MfaZ zawe<`k!)Q6x=E1^t*@*UCalX&;MCq#o6uo{Zs_5G9O|ehyGU}mw_SSU-ZDSm7<d1? z|9*q+2nnOUQP;$I_Zy1Jt=op8VxK%q<@Ug`**`x2$60(|4Pf-+vB?X?2IsCoVw3!A zNm*=Hn<w*CQo7z0nEQx(U!-}^=ZUN(@0X(@?l79Ov$z%yZA|Oh`dx5{*TeRu3I%#Z zEjMO6TaPA4Z#|scz9^-{xggWtcTP$v`DC-yc4Fur65w5y+9Qs3R@ut-v`z%oyk7j@ z*=76>;IdezqjXQ{OS%cli^X998|j>uVwU*#$)T3;+^2|XV2P(93*nwBNq&_+2~}9Z z$3jU-sFLDW>6=icuV2MA-tN*}lT>=Yo!tZMO_I%4vNU#_JII-r4@!@Ds#v=t$>Ve{ zz;F{%JyOpNxMYe)CdYis$pdf3n|_Zxn>{j7aSY#8adaQ)1)3tMS-*o7q?|vnsp=b` zC#1yn88XhSAami-o3#9SdcB(4_#Py2`^nJ<RQ^epgd`oAAT^9hNUXK6oRPI5w6+HR zne#@)rhRutrRx&s5+QJQCyr*R%e^{=#j#ixm*M7wHFrWHQ*p#2bL(|9JMkTswcEQn z?K{$%^~sCg?>H;{;)iJYCNX{AB@{_Zx!f1J(`4?O<es#c{fM?Fmt<)lXM^2wR_k!q zV6`%KyN=Wg_2S6!CMle7M^g6?m-O-|an;hS)Z_OPW~_Xd8QbWln{;{Msj<12J*07| z&3(7t;OdmKk(J>@=1TnK;m%^MFKwpmmD*60LFt*fw?5k!txO3isFfMi;+$Apu_LFt zyvMaWi;Hyx`?E#`U2E39g(@yxBXwjsa|uCm&jWsTFC@@OqQI8q{nQ7?AF(_dWsigb zRXjPZb^pPCYC`{+*8gFWGHM$Wa(ZBTj9N|oPC1MvF?fm*Q(80?VL4B?^|TaSYS(jX zmfH2Y)UGF-TB>IK1)&M|N$hTSO3?Lw!-Tsxky-UENuZn(ms@&!f1Oaf^#?13Mc-7| zs`QIxh*pAOJXtm$iqqRAi82$GZFudH&`wEe-%;H<&!e?da_O4Z(>z+cCFp@kS{;~9 z9qn~4zSETb5}&4&q)8$qjaz3*OSTC;yY;BA7LM6932z<f55_dujP!d<lanKe_ma)n zePnlHtf%P2D&3`VhLyqGGgkt8JKCeP+VS@xX>3ye)D*GvUzuCaauY=$T5nB>c)LFo zz~9C8HuG!|y#~R(R*dxJ&w9@8X-D->VEXVkH7?cgTK2XX|A}-d=WZDN*1I<Wm<^*P zSyxMx26lGwj8iJOPMJ0GSPLa`J*`IjCLTA;g%T#Sd}A(Eo*H7lErEua=0BN|A^CBu ze0QF&2(10y*`@tt?a>`dm`^wUf4LSS^BYx<-OjCVxjQrLm24pd{)`<w!)<-cWuzJo z(zeiY<b-w7mw9U-F|k{-TeU^IVM#G>m1ZN6iT8BledL67-`RzC9XDL>bOlbgmZJC_ zZ2bnFX!xS``=xa|-An;6KAXPRYZ?OQ$^QHC*f;EA-Po|3EuqIIsoCMavZRxCs$&HA zx?JHNdy8h@F4tZ2#1L-AIvu77*$&g?qAt!E5?B)*+9J{~qh3_db=4ANlB<!SE!Bwu zDd92d(=kV2(o47{TQ_p})(wo-?vC8)?a7i#lL9Xe63ljZ$Kq7a$*oZGi#(#5ZC32g z1qoxXOc?u#p5Jh#?%7EcWTU@4sA~$3cp=>Rba?&0*!f-m{l)~noU<s`OS{SY2ok$K zynaWYX|m}_nmSi#a(#1f9X0RTg*RUow;t-{ldeejqsOOT{5GbSrM(mZmm7*_p(4F^ z&2l~?RGhn4N?Jc^T}M-7>FrBn;hE@;Y#mHRlc>zb0YbOUt|sW%)`KLFY;WjXYKunl zQOj<4_n5dO1d_O!6RL6Ug<GrTSa-rAygXqM{vZ~}m({+j5_&$-_005!Cl3i@y&<8; zL9WMgcYZ<pp>lR!W-P#*pJ@iwn{{7_?CSl+ot*AUy(p-DSG@ZD(hW%z;h^HBDAF|B zaP479*Rrv~rfD)xF<V?gmc+GIOR>83dwN6nrn8KumXp0XgU&F}k{L!r>sXK08HP(& zwT3)eXBg128Aji&!vj$r%X!#6T!v;AthbWAUH2ZZCM<?a-Fa`0Tj?)x?@i8*H0Ni{ zO?LXlKXwOqmuQv6p)8MRXpSxp<wh>1hAKwVyjgyCs<#;M#>1s%VJWw=eq=r+!O5sf zN=<NbBg2n>xUF@c$S|F2O59KWEn!YqQv*yfnfX(!`6B6qB(w7OrAIcvq*d?S7~CAN zbB0=axi&F-k%Y{XQt9e#ogF1H>f<D%p|b?jOPE<gtO|`{n<1bXmZK`ZPLGvu22sdC zt3~b*Lfz5<#;XK8ZnBolh;!5QQDI_r*;jkQuJV`Fp6`&Co@39nSXGqn%5O%`bl&vJ zno9f7!Z=eUOF*6h(CA?*$-Ay0Ft>D=I@rilyG4E2m7M6#ezGxiTZi_dVvHzdhv5?T zO2ZRo=zMD1I{JNkNC(4B4N(|;y(_j0B$MkIqDdG5&FuS)-xqbsR5YEr!KBWCNz*%1 zGR!kBHFY>H^Znw35(5N-D)a|+zce@P%fuG(p-E>VrsUDG*2}5c;mTQAi)4!HC1^1T zdfqM{6Q-%zABv{OhT^5ggd%NqmuVSEC;=l8S6t4*{+!XAykz%mPHzyC7noVO`2$PR zIeenPNIjFeIGbPY3(Tzd{DCq1z_9+nOz}}0;?vcq`$R8MW`XDrCwUj)BuG-9?mlLw zn?tdc$d}R*Z#C&dz2JV+HYoxg>gC**Be@a{^Cd~?mu0T2NY6o=cfT0JjY)%aSSDBA zL{_T<l$p26abET^35ULUjR;(HKx+lX8iZ+&%bVqcVdM7cUs5)<Nw0?VEnwVxvd;9k z<-6{!%%kXfH@k6>D*rAKgN(SGrQ?RIBFU~9H{?bxG*nDHF*%-g7vHB<Z9R!Yvhk@S z?{}LJ{gX#n>CNTxrVujAAIQBNSgP`Bvu75W8FwsRL#)hds$^Cpzj5i+9^W29!oyqt ztzN*A>Fs6i1YK=MVHb-#Uzy}_=Go?WQk+%AUFsnHs633>dIAA#eGDn)k$Lo7salv< zt3>1|>20M-?5ek&lhD*#=q=skZdBZ9P8WMC?M*RvS>fyO65hEnd{ubFqv02JP&1Yg zC#ewF#aChF5kt>Hu91+XjHLc&OS6!S$PFE~*~gM|&r2a=z3saai)@sLu2+OZQ*C?D z0U2xR!L(GoOR}^Vev)vLrY&ElyP@uJ4hh7~bcw4Qn`OwZshhp6Cul2n3r)9q(%VPF z#cZCqdUqzwdA&RDCY_$mB})%VmL61aF7VF2XokH<9y0gqX~_Kvu3H`>N&s$(zpO|b zW6^6<#)~zC6tHxDVO<0sZS1!oVPdXNn3xqz=DYWEjk&W+R**6Tnp1j3>?_+En|Mxe zTf$I}B2+ib_AN<FQ%86)Y?K(5X$EA9uX8ka!6!4u|6DoOC5-SX=HLli`~I@^+a|{x z+t_c?+U1*-=(>1=Yka>YNy<7(hwds0$Ymb3Bk003ir{8R9{qBc-o6KEfRkPi?^^(B zhkz3~$d&lAV;$Adz3Y>{q$P!(;`jWMhjjxl7?1xb9>SF*TJ{4NDlV7aPtJ8np-;eQ z&e9Y)O6|_=bnUuz4?=}oM8sXFd8;Fy&FJ1jhlC;ap4*k-9iQ&&4_{7LCF{8`x8Ei_ zXD;JdMtj#ln)srG#?2sw5&tYt?J0*c7hx4KVB&p|*AtduU(Dd|V056=Z;-j2%(SdU z(!)pw<9is*W^kamhiR6k1XF!2!w!_^_AioD*RY$2H=!94ybGYW^(d9ciC!+Ph;pM9 zQ3TQ#!QLXKFPDc^QlY6iYP-41)FC5W`4q-Y&6J+&c{IH$g7PvYq<XC1lIc|sdghfb zKQL|mpECxm_gt9!`CU?DF3jd)E(6vR(?*FYg?~Ic2#nST%a|dqQlf(RlnnH!P3v)& znnVUgZ9%4|zf9>78#~vtrdgEuEeg9)2YPnEa=_9Jh3$v-EuT?)79|sqRP?Psr`V;$ zb?LOoZ4T6e#QFGd%U+twq8^!hDWPo=g!$jJ3#p&~MZ1s_Gm<}D36Ah5$s4u~N@TU} zI!qSD?^o%Yp8B^r{8$tlISaS`@Z+63y{P0pjXerT`(w(a%6rd*ZnPZj*6Ob_b@q+> z`p{yH<bxR8X(oj%j9l7-y%zsSd-3Dja0@)bUdsDc<eM%$K4PXKub*H>r&9k&jw|gR zImDIHB12tiU}UgL42u0Xq-05)-Mb-3hufKw#R1H?FP6AR5)*tiqsgpbGVtkJ!9=-b zPF)U=N3+?~-ZpRm#{g(!OO;)g74^C9lt;E^=Efma8bQuh-N1J}o9`@C$?UC9WVk?b zq`yGl$jI*F#HR)pdwWdxF)`A65)kgzDWlO`M01ipJuKgB>ft@S92ape5yurIl;ro1 z@G=g2m)3fe+-YXWYX}`W5+3Ht;t_A&Yb%(p8LgcwL|3xb%_8or`HZ?grBh9GLaP1o zrn1L2p!7FBDb5T0FI6dxGL_RTDUJ-!XQ^}?(t9dRLMm73BqVvnm*Sj>RH4#*q&HP+ zM|xkSrAXx}twO3*=~<+IsPsGQ`U;ZN*A!<fQiV!Cz~mnoJ(}Ehm0m-dq0+f@(Y)CR zA6FrrqEabyxHDDS#01nxTaXqj_cqeGD%GYs4sSrh?|De4sdTNCp0HB4l?JgqGI~c@ zsm4n3XvMfbY^A?hX)l(V#&x2V8m#nFD?MqY7GCP}T}{<bkY=iM6Vfu3ZbdTr_`tgE zHqddVt7{a=__zXTnsSG;sWnHX$w<al89dcHTe%aEN>r*sGAX?a=}P6~>7R)$C*3RG zNk|{7>r|w2m0FOds?>>8r;@yq^?NGajP#*Ozd@Rz(o;wusq`#Txk|rB`lm|r5?50X z&K>MHrz^ML9*#3br3pwTw%j4+<yR?A0aCHLZbv#trGa}o&ODV4L;6Ieu}G6tItl4b zl}eCysB|_`xk~3C$y3-AXCabF%cV#S%3XtG;z-+zd8cwmBF$3iY@~XX<Tb6QsWf<R zetue|y^+pU=^P~EdR?aDOiYs4Zbb^KYiJ){!lm5dNQS$Tw}c(3uKjr->Io_xiDYtA zjMSvuLrC|j^eB>vZMUJ0Gg-Nb`<oY{rZ}6Cs+B7^z`TAn#aV<@rQE|vZ>jVcQn^Y` zBfYKC%Sgs9-{Ga9?<ltilF{22>95KihGg^>h0I}s6lW)rDa+D>SWu{51(M-*Ak`>$ zz%b83rAUt&JtUK(6-Z^u{SwLK?Qtvp$x6RInBF2utUEHxasI77jz+3bX*JTPD&2@w zuF`EtpQ-eK)%yq1$;u5L?nz^;RAQy`t#r^Kj&p|kI1=e|mGY6wRXQ5!3zbepGHF?X z^ptW}Aemg=h}5dwnTIloR;diBT%{T$*%V9R%eh`CqqCuuD?~DS$07Am?qnnr+jU5$ z{%x>Q(P55rs)ii3(x*tt>UZto=H+@R&f`dLs@@AoDeC$MBoo`f5uWQlNOF=h#W?`U zxZZ};Pq_z>Dm0Y$Mmo-J%6*DtxabkQrdzp7k;1C?2vUFLp0eDhNHTV%IDJQXdO1ih zsE;v7#*%x|bmaR(DbBt~CM^dcjZ!WLsX~4H80kpmR$0Akk#dy#wbk2>WNg4|j+|U| zJq*c&d|IyK<SBO+lHq0}$-YjCb1qVai47@Vxm8y0S|s^$T8i^)tG5ZMK)DyJ-e#n+ z%Kg>q4Ib^4(M+U5buB?MDJVl4r(6S4g{I(`e13Xfxrs<dZz|H!#xIi5+h>g9j92ae zq$%q6GNfaa`w5cqdkxaD%H4)!{LU_L9GOd`ICGGUUIS8*au*;Oy_=9^Nk~tKWa4;g zoL5h)kK#p#>Us{63FTa*fyzaZOekBBW@-9TkM_!FPo&*dZ(k(iH^;gjgCr+@Q=Ey` z^?4-uMp=sUd&|9sBy+?RryHq4<2Z3VuQgY029gQ+G$i>JZHiNkWb|%EI#qp4I))dQ ztLs!G<D(c!4%nwSWk|-ykCFCNZk5%$7D>LDNZqh{p<{W`xN^ghOn4)aGL<_TsY2tO zkF<|+=UcstkoHyXGOPDjBsry&;=E_|K13R-T%Y5-@D4zFQ$rq)w7<GeKr$&fzsPf4 zhID|51If7FigciIYb|##Qb@Tckt!TXLH`M!)h<FZvHb|?pd@i!iBzt7w^-MEk>tyP zDb9n|^+oIY2GYUm`j&OQXQCJKD@d}oNpaplG9eE+o|hjgw-1uxLP&=wcO+7Urr`TX zZ>rRZBu7(HoE1pM$4y9Ys_VT-+3G4UAvLZqBE6}uZy+6}u5Te3*MlZ`HaHRKaCM!5 zWL!@}8lhY@QiX=H9!Va}r8v)9E@iUUj!v*rCDP04qZa90mA-$1<7`o>9m#Oq{-3;( zNmbvtl%>Yq`)}j*Mfa=dXM9C{rgL8@{Lp`)-v=G<%0@`>ZW5s6mug@y2G_v7b#MjI z_lM8m8MyyX`V4<xsxM*t!<X>l?}hU&Nqax<MiAo5%1iY9;mI0QxLsZG`W^p;zSzjS zWLxsf>@Rh5H&5Bc|D-=4PXEhpCH((O`d^k-zgrRsFY*&wO8$}yINF;`j31V}FDq25 z{mlh_Mz}>nsjRJN=4a&{ewngK?%(AjeSvqaKq&HV{s$OusYpbA9X%GY*yzjJNlY`b z6mMR_uWyXRbbC8|{fV?#@J<%;m$eh0YC^F``Wxp~H~2J5kfm?_x>tPo@=Ju(&9Ts= zAIyv|q?q%6l;Xqh?examdkHD(O?!LcH&<8Gmj$b)=6z*cd{uGxs`M@Xi!Yk0)_L<5 zmhlSn>PoHUy<NX0D|_)t(pJgF50dmB`>7-~aetLU{69dYZ2ljpQW5{NRFYKft5Pxl zhpQwtW2j2y{AaU(kZbuLQmKjmhpN=Ze+e_mS;7AtmAd%P!Vzv8|MOG|QT13F!WARs zs}x0IDF?R}iG>-`7NoH%Wnj!gm5Pv9tl=tO&t(yYv>J(}64LWXEP;?5dT|ynNI6I> zERf2PSUMmzA+a%lB!_T|R9cN><}O`G6O?-%iKRb!+mI%zB$Zg^EJ;oY5*rc{9?}q% z+K~2CDT>6l2Cl1+WCSIpNCQ<`gS5L!YmqWkl1E>IRO&+7L#2&KgH?JL={qWILrPaE zlQHf>m9mk(uhJ@{s7mtUmrGUJfz+u|CR3d&R4PIGiArrqYgJl@bcaftk?vI~lgY(8 zl?su%RBA(7uhLSa4JyeGhiz2pU8Lt!%1(8h=T#~}`lCv+JN^fiHY06TX$R8lDi!v3 zoHtaOQ@^mO_6YeUac;Tf_iS4#o9mh)N7OVnM2={vm{%Rg%g>uS>R8jrSZX}Z;%6p9 z`FW1~+$7-4uWoLsYiw{%Zj97b62g?$`udaIuq3=G74z!q7aHdD>bg0#Zv0buv2k7H zgoZiw8m&{;GNrDqx~jM?QdukhPHmujuCHsTE^ch8i%1OSviz*ty2`l?)h&$nQ)Wu4 zjQbQa<Bz|%f?s`%IXmL+yLDzpni*+Mud9k^wCX-_Vxu%Zy+nU{1;2XfGLsuB8>{LX z=6LSMGtVFlm=>p{h98)89cJa{mCb0XZYZ0=FKr(cs;p>eXpDqvD;lcmt3zHQLc^=l zT>ayZDlKkq{3<`+5d6tf`7sB6{n&|%x1lj4Gocof!cawXbH&0?T|=mbRC!Tr3VJL4 zQDl=}?Q=Zz)w4?GV`?7#Id`9(#6)FN8|os~P8F4vlx(P6H4hE(bHuIn-%fg^E>NFC zRn2u&<utXQFFkb)^Qos*YA@_oRo&)Vt+(uTO7)!9`if>J(%f1dv9*{ZJ#qI^u9Gy4 zi7n;nCo~qe?ydAnI!=(jWG2(gvT4ksjtXhtVyt6p^zeg<XC5(&Oo)M{zPsfe3Q0St z2nmhZYj9DEe$(_dQOT>N0k~Ihg%=^e8g`i^wTy0%uHYy#>(&d%kRb!j=^NYI%g_Iv z_^aKX@2F5?Yb4ZI6Pn%F+ECTfOYNa&eq-@@#`YMu8<Sb8HF|HAx7TmkxT+hpkB-0Z zt@wJozRrv=#8fm_O^zF<Cbu<JH%DUZ)R{A;RYd9<a$}SxC05^bG}9jW&`79;zArSp zdJaPeC9h7Q`AoeV=`!`|Eqizc8lR3`@iMZKK6hZ9Cv%9<?7D`E=7k{)5vr|j3%P@z z7eeo*H$I)VXQ--(RB+?kN(Wwl3VO?4J>vhrY7bKiA+OPXYx$2fHiqW4R@Qp8K*|Bb ze{1o1ozwqU<?Y39>}#u7Z{;@>DxT@KAT7Jl@G<qRq1g)~)h#3G3Tj%aBcYtO;W>r% zZK3Sp^{t1wDF}sTPC0p2sH(16dx?diN=8cN;w{V&LXnEu_0?wN=uv;Y{QQsX=@~3! z5*6aAuWpzVskQky;!CfX|IqOKx=;^W{NKr6MSXo^rF8joLc{CnB&7(``0-qG^+@L~ z+L5c?YwfAG!;9s^x9&+WW$CT<5sS~8A;cz!4XyKLS2xRmsWW76s-#)&t@u6r#nKVT zcSY4Xtu0#S@rem#*EBcI)7ID+8h)PFaCZ@o*D52jEh}}Vx6;3h_<Bq+zwP)M>KBF@ z8>&OT^}IXHly<YA+Ah>xgMZuUiJxNs|1~~uKK<X8vsa(L<@~ZQa-^Fy(>T3;u(#v) z@-Iu^N#0;cBy$@Y7c@9Y1u2}u81C%Vv}buzS|2B^xnEOK2)q-_NOm$V8rU?ToW0KU zWGDTi0ZnNldwK_>_ab`xCOi9HFCn;Yr@)DhAjh`)HNo>}BlDCYO-bo}ob=`a#(gmE zyst=NNaB#r0MYaGMK2G%Bl|e}H18P;Z%i_0N`^Rlims>Q#dSzB=XGY8_=L;r*R;<u z$(*VgqG6M1-N{ZG5#y2u`())0FzM*u$LT+~Z&T6{eVidLW;DHrU)e!m+nDR0?1*|7 zhOyU`R&t!BKKT-#yvQfdVq@F8YT4`dF4>v(uKAt-%FeNOP4@)wai5&!lV!i!yAJjQ zaBrWS<CA~qOM^e&VeC+Qmp}clc_f(8H+J($Omy;m_PNMsx8M3I{AAfgcdxTO0ld~{ zAK7tFb|fK2N<~_toOqTGwbe>Pkfa2X^_iXQ%u{dpZ=?{?a^=KYvJ0QAPdbb=lKUSi zC$^ED`DA^nVWdLtFH>$j|0Tv`r^rf^kbbOOnE$f-pRA{<ja1D2D&=PJUrIAs&r%zy zl>475SI+-ERI0L4Ez;G>)$?ESm#k-ZjTGVj=gP@8u{^Oz)*pa2Qk47E%8AAHQc0|1 zq-99gE4PCGQa6&Fl~$7U-k_YsE>EA5H7p~E%T3Cy;lDhQN_K9u(pn_plbyTye}GEs ztn?t#Ey{KAU!GhgYfU!NM(!n~WM>oqr6woqvj-!+#Qm?8+syyjD!pc<El77M_ZI&v zReIM-?;-t0xo!NfQt2Zr?LfL;xzG47oBC8>>Y<V3+^VEIS<ji)s3d0zjU?y%9#&4y z<<+VrC+dtOXW<@GE`(I4lAIhflAP~)LOD5wHA1BvE6I7!r<IfQnIlz_la)p)LV8iT zNk~Vi6t>bdB(YbrKA#(<lJq=ADnWWhxl*J?mCCJDg(P-Oc50EDRI0a96VjiR<Ml#2 zCCy{_?Bi?k+&ayCQ1o5037_OVm9t-R{`}$fk8Q}geC7U^6&>>E8+E0N(;t87^PPJv z8hvlxVH+oXT+#o$vyWJF)Pd&@O>cSUri)Ym^3u{j<!t)-rQfUU9yq*p_+39Mzv+?N zPi^|=b&Cg_=b;x-QDx)2rcrfOA6}G_B)>#VJFTg%h>Xg~S&@_!b(#5%^`quhInwbN zW>l3d80SlIYpRoza=ZX7j;gAj-8v_0rV!#YIcdnve0w60Nmpl<=!ij*lj=nbT%#h@ zZIP^b4ML{yNlyCF3FZXu^G~H*98(oHxl){vhUJa~seUGedx)+vrX%Is6=05oDIVz8 znE|sUz)1hwL^l}=M@s$q@A#Q^m?FBgn9fgNRs<O76*B19VmkN0<OG<f#Fu48HOrD4 zimNZ5<fNkh=Il<#4VTHIVfT{yD3|J}^dbMt_wdJ+N?BwCbma8sihz!sjqVCCQi9t8 zOeIWaAe;p-MV1*AOR}CiOHTR;{^i>K_xpcsq^y}Ij2=C1tX89bP|1$V<Vp$yOkQ?8 zGrBOI$q!ow!C69jGKP40Hz5~}Ee`1X1fA%?o{sps4W{c5Kl2DoF;ym3UcZOQ;o*FY zc^hU0zK!K2u7ceB!V(*o%Zw|JW5(o24;ag7LGGB`ws<CQNjx)J;tKf6UmeekSsTw3 zY>a2dN{tDGQ}}K?Gj2y5Q;;Kd$nUElSNie*lb0ROjF$d6ppzetXU0gM8_+4JvJA;^ zwsTiZqZd2(apqOet2AfG#4ThPw!P#|E@9Ywi_?K&AIWG~orai_>nqY|yCq@dN;ZJx zF>+qRTpqK34`yT!W_%B3N)KjM4`yx;W<d`|-lZQ*&lNqGU-V$^>cKqHgL$?G^OqjX z_8!a^J(#`h80c9{z6cylGfR^=W=0RDHo#1oRW_@(xp6@-oECJ7Z4V%B?Jzk^<YF!N z$1rOHjQk|V7AA2qojYNghWeRDVa(;_;yIXdrg<@6e}ah)^D`gx@P&F@IO#o@19~u{ zdoU-!L?`>>ngz2hz*P6}wXg^CgC5KkJ(!yUOxEPKx=2?3n3q_=h(kZeFnPI;F^LW^ z`M0T6eLADJA7pi=RMgdH738LBziN5`=8OdJ>LgD`OeN=p{%RQ$SMKO$W(PQE-@%Lz zaR(pM8;h^Mi6gf$rVpa5%wo)bh$}2Jsx3Bvku}C#>CyOeGIyMDKHy#j5&)O#IHQ_k zzEWY6lOlMLnZsVEoLVD#=9=dEQXQo#V3=;W;Rv<BWnwzZU{>?t&z<eai@4VY7<ujZ zwg9u4I~sv6<o97RVPYXC)9F&deL6#7vI08!Fxdf}X)rkfol2PefX+gg@d2G5!bm}p z2sanEa+eWcp5m@Jz-;AC!ZCJ6a8eM%U@R90z)TA0jDwjK(3uHS9MEZiDG%t#SuYv8 z0XK!K5oI`t#dWXiE2i@tqKw@!op)er1K}j$xFn#nA52p~rvPR}K&Kc+LXO2X59aEC zP6tdhpmP(<nt;xuFiQhETVU=E=zI<%vB%;X%3QN6pd;ViUKP-p1+yujGY_UbP=Y^z zX$mmc!>kQ3kHD-Bg#1UC&4G~LhglQQ>Bo-ATLGQ@VY&h#7r;CpV2WWf$Y!h_*2Am~ zgxn6ZEfDfmFb@WF?tu9$ptBL?@qo@27@0L;T(?Gj0uu_vp3aISC%|OGGzFOBVZ_dm zZa8Pa$eKD9as!N5ET(fQOemmpBTOn8kLCRdm}nrbcVM~#On*A4ErE~^g&Ao>9>tn5 zGP@oPzFEpAIVnSB?sBe?3d2=~4$DftR7a&rg!6nLt_q1Oz+4CuBAc-^UkmdQ{!w$S zaX*aAGh^0x3C4km>1>CY6wpa$RhJV8`7oHm0CPNyw8L2J--CHRz?=^=Fc8;|#aAG% zTVQ0i981q5FtWoyP;M@M2eTy*^7}B`0!$j~&KwLFOHVe8lyWTO2{5&Rkk5eeu0Fcj z8dFd(Ms_P`8pJN^6qth5@l4^n@yxgob34DUvAMES8(_xB*<~LyHg8;895Xs+Sv-@s zDxMiF=bioGj2<K3UI{Scvg4TioZ@&UZ&e&KreJlDDa;?cHl7*R6~~Opk;#TH_Hp_7 z;Q&*RJ8rC;m5%Aaj9VIH@^W%k$1$VF$eCxKue{M?3n}6NQ`i*8<mbu>XunQ=p3DJ! z%;=n)LT&?0Zh1UYxF((%w<V6r9g|H3^M{i=PI@grlb2T%&x|XMV@4OOj$`t3<UF-M zocz(!C<07DMv%!bD3r6;KArr6apiH$*t|9IO#a$9rZ8t?Jd>M2`|^iem|qglj9C%S zjN2T?jLQkp*Zad6H(Jgx1ep94@l4_7cxIez@cVp?$;l1JGkMW?X3WNTreIq<Q&>o! z=npw}bW=PtW>q{>@O&JTmzPOD<qsz>KNQat6vi`!<#EjD+_rcoZ*4r2zayS0kOvn2 z*hd#;#xb00jb}y|$20k><Cwy+@5VEQ89emx$2D$rNj#IkBAyw$CCC)yjLBw*^o3K9 zQ&1ew6t0SA#&yLpxw)zAG5W*F%`1*$@^V(iGr3*yOhGEUj{b1+#>&p5pP_W(nfz!x zGiGf(Gj2y5lb@5rj-Wr}{JgdxGd3qb8qXBSUZwFhsyR}bHFf%#GNRE~m~YU8Ww3WI z1`WOHC_TAU$5CIij4v9(E`43-`cfVBe}&7)O&@1eW$oOS0$J_2PuY^nRrde886UGa zr)<xy$L=O^ra|v!a#&VRj>qm!sXn*0x+M}LW>(kBx2Ys3RkxmF2fpQ$zAD5hIRhR? zS&zOG>#E}3tGk>Cm{T1o)3Y&U`u!7+lAAI;ZSM%xQr$eCFPFHQ`W+Tev#G_L%eLM< z-5w4Q5}Tgl)^D~*5Pp(p0nHT}A8c&}>T=9o6V?()2F^ABH@X&M0K%Wz5UFmKZ&#R* z<W#!<<hYOZ&I|b{-_ac(Yra+@$(>uha6w~pl}V2I#zI+TeML))!`77jwu#(`g|$A& zjVV_xQ@M4^-QG{Co6mP|#N`AsFkQcE;nYN|+3V|CB4zcBjdNR@MCs(}1u?G@jnox! zm{1w1n_m%e2?Ai}wCr3xb|%5;oqWBJV`$!eO>=d%C(9mc)4~Q#hge?fRduuGL^$&$ zoU-F<t1IWq{qfT)nj|f%Z`19wzeK5d(Q<bSO0*>dw)zU8#)>g`)S{O!(3VLG%VyU_ z<h#U@3ci+7F~?W9&C~^&gjOag?B=p6X>#_y%vM+PjnkOAd#~z*JWZ@Tg-WkgDOQ*g zQY<-@_0@b?1ofE_OgWFDtyXJzw{z<>neOc=)ilkR@?@!-Q<~-5Sw51THN#0vbuDEr zO<wJl6nb^eDLZA>@y7ZbF|V9^8ksembO{qHTB^<6%-YsSl^ks;D?4FkSikPnY|5;R z3RT(KTo+kbRw;#8R!Nnrt9G(<PcAnn-`&&8%^9O6u)SFp9k6_*i<kDyB8ffu+@3ti zn^fIW+0#L@I!PXMWwkaez}#7ZFr6&jTZ<>-Ri(!CP*qYwvwdw`$^*PVg#m}eDYPp7 zXnmwFh01!JyDvXMKHh`d`N!*fbi8`J1vGGL0o#~#$cZyUPe;Ekdb%byNKnsjm3S9l z(qm52yCn8xToQVU&vYy}<Kpw=ANhPX4bVN+<0J5omtK99W*Rqcx)CIDapUlud?Ra| zC%;RaCk8wnHg%AV^A>dTdBh<&-ugWDblZhTGbZoCr|TH>8b5Fc{q}HmJxi;V!7ny? zyZ(AQh$Z#QN~Y)c)$If>Ud2w})U#H{DS5TC2kp<WZ^-fI)JI$IIua#Hu65{<TI=#9 zi8TXUeB>_cOR78E>1gTG4$wW-t9%`;<iu51dKUL~ob+X^2k+&pheOY71ysBeh$DTe zoFfwzohO)q*_W|+r-)Z?{L?{Ss(0z`rGA$RJ#&#z)yqv{#~AC)OB1He@7Ob8e%CKc zm8aJ;Nii3nmCg4r{gY##oqIaQvZ6ERg!u@%<of1o)}?3mtkaj}O_h3P%%y#~vQsTz zW-KRpkh<<ozv40x@8nNwyj$YL`nCM24e-o_Srf7Hs;{13T^~2!v+H7=8G7?RyYBT* z_sm4^$lUzV^8Fg`${ow;mHfhjf&d!|<>utDISdw#8=F5?w9C_~E=hN;Y%i#pbScYi zHcI949~G1P96t5lYFr4p(lXGC9TyX7CGWkv8oeCZ$L1PFctuXeME{X7;p_P<k#`{a zF4glL8xyBrKhL%~dOvs1X>g|52|2~({sUE_7aGRvd^u3v{9TjC7vPGV;v)YcCef=2 z@!0JQqa*inq1WYqSS;MTsPs9nkMlQq-8C1xKIr8X`5zAppF?`07xZz~MvdMkPtW%t zMfA4uS+msW$h}@^InJorEHHgn&?3em>ST1;3gPO?Hp!}vKF(@Ba*4m9jG`i2MU*v< zByK_H&K`QP$K0YS;XUZ;xL)1xdg?u%NYA&GBL3U>Y>Ly9-5V<0k&`A*nQ-c~S<|LY zJZc#Kj-Nhj(y$;qW7?#XCrqC_b6AMIbba;pkHGIbNo;m~ov+8p3mi(@3i3-QNo_5a zcLC&%g5<3%;|DqAJO$!R@}bU$7s=UVgVXCOn;TmiYa*fSQw|HwXo}R$t2<A=-*r4E zFYD^%^+q3%mWTM{Ia4%Uh<a7=UpA_~$7k3+O3A-jxn}XA^U$Hr;0$R~-X->TucAR2 zdpLsz6><B+3|<kP6v=IoU4TK5A;{AX5mKo=on#yH(KsE<hifpJ+2Hd-MYE>0p|Zv4 z!;af`oN<FrQVl9MCtdnDGsOFLJ|!+KAnBK5l9HxrLU2u`noFKe1c!jrL5b}YFb|vw z$~nea;K|@=pyZ!$qhhDm_>76OQwN;1t9CwFJ?-SJvcy!ysCZY<ROwD%&jfmugaRBi zs2tsZ?J^*1A%~(nBdNLiT(xE)jL({4wjwCM*@TmFitw3{WM1SXW?aO*Tstwbm{Dvf z5qOv6O>8JOD|N~F*h2EV5R~km2WEp8fX9O02PcCUf+v8B!5JX6G72XT{-a_m!d9F9 z8#%u2t%D2kxs%VqJ#DI6jAGDo+`TK+6X-%r-D`pg*e^ld^DGl@Ey<DJTK+nE3U1US zxg<oXbgzfBj>@*k5U4QJ``C0w(wzFn*%ge7Ud6>qdVS_v+|*l1sdq`<#pbfzD|J|| zv$0hOq%KAe2g|@bupFEKR)UhE8jw0G2iDcbbHPiwXPk=u3~U6i1&Pnto^ChZ_AMAv z4vC)wW(RC<w^cZzGdN=lI^Kn<cVYX4m3bQqD>K9-?BcO6r8Rs9WV@1)T-_1f8{^3+ zU`#KRyU8mKa&W;o@J&ToVO7j)(O@!g_(FqmNhyOI!v2_pUNe%KT4Y(;q8&;R?8OHO ztKFyVj(i0uWhw>ua}81ValNj{Un7JoL@i0n*}SmEUrX|FyMhmwH0EOPVGYr2IcjR8 z>d29&8A)Z4c}-<nOZ;IR%D{2785$*3<)|BTH8=9+KELJ{ICaM~Yq^y(F4Aw-*J}cr zVwApcDd7DNILa^7a_vb(ZD5EGR;sNoYmx0hslf8_M|vD8f9LrwS0=uefP?wWNSasC zR#s6pzoLQmkjUc)6xeK%$0hk%1@0nWo6$VqXo|s~N3-u<5(S&u=bfjGZ4KPpYFU~8 z%P#CbXl{f(K#N9RDrEM+sRLeW%%HIyrBrO}T~ha@?a_xhpBZz=tFWWe9(etAbRswr zJOw-+ECnZn=YUf{`a*{ve$zI`>*=FX{v274J_k+*w}3N1smb33<;BgXfCqtm;Ug-q zGCviRSKFTkqU)Ri%8_=CW<=%dR%PI?z;f_zumZdf<RE<XeUO6|(H&qN_&Hb)?oQ2U z0QUhK!2*!O7E!5N3&F|YBCrI!0IUKp1Q&u!z)Qf3!K=U@fNQ{|;Dg}hpd8BmG59KY z1t>M~O7LIcDsVS!`7=<e*fpRWnph3WQHkrp@!$>MRPaXdH1H;{1pFn~4Bi4R25$v_ z2HpnV0^SbZ4&DJi0Nx2c1>OZd1KtBZ53U1W2C-FiEBFA|4L$<?8|(t*(CcI1e&7?J zw7)08qrs=Zlfd7Cr-RRev%%-UR`7XnG58{Q7x)tRBuEX8%0bYV!8gEH!GD6Ufdgnf zuY-qxZ-5iPzknx$Z-S-Z+h7Cu4j2XB1+M|Of)9g#178LI4oYME5R^XUV=xW;1k3{e z1&#zi1CIs20E@w$ptMB}l}8&ve%CfCEv`Sf45aQvuLfDVM1Khm0`CC_gX_T|;G5uH zU@8YE_#SC=caXXk-4h%N4g)!m9vuZ92)2U5z$kbycqy0#UIPvXuLrZiUx9~#_k)Ln z&w?XBIifWRd=+H56qN%TIpAktF8BqQ5B8@$j{)}rsq@jp!DGNN;IZIL@Obcaa1tnU zyx;SQ9}|lxFPQ@!1s>XSOtf?1VsyNVAic|-kCbyC811~t$A1`*WcbL&@8#Ob@sO;s zd10U*eiFxYnmU(sr!p$}1~1d)**S8dQB-Zom-Kg8+>LbkXPFyFUg@)Rj{FixKPq;K z9t8do%mX)r6T#QOTfx`C`@t>XJK$fye}Zp=J3+XpB(fXa2Yer-Z<U`8iqdz<+A`V! zQU+1lw9MzD@&%WV!6f>TPe8uwD?jTJJp*Lk7`+($6ublc9NYjh5=K7+9qRRgwCg1B zB(M*-089aY0rmyuuzWx8Q!ouo!ybIkIT`}@1djms0;Syd2Bm)NMw-UPtpOIpi_OmG zb4Z|m#P<K~q_qeo?+R8DDLkn{%e0{N?YuG?OW8lGLs?TxE$=F1)h3!DXy3HOKQM=J z%H_i)l_v)b%su?NhvF#X8J9Pu`MpLKTX9JZlI23FQFH!?yAGg~QDD6wc8FguTtj(? zZLSA1!C!!ffj5GZ##_J>LF$l>t82k3?(YB>g1-U9uJ?dq{{}ws_8$R97o=Z89li_u z+eV6>y?WXo)BEion<q%C@-B%_@=3MOFL(;SlJrR$egf_ZUI|J*SAml5EBNHc)tif` zOCfm1Ugxkty8TaqzI^HEtrP<VETjaym6Xg#s?xUtYNe4`X)7P5;nmghtxDT3bisO; zq)YNA`MBF9nHxky$h1AP1_2AWuK;BtSP7mAGIxm11*^fuU=4^Z9DYnV`YW&&d<?7u zUk1+s=>wd3V1J1h91b>vxnK)89*ls+U@LeQI3Jt?wt;ovLQw2Hk59av2g6C(Na4y) zFS!?c8UDv-VrS1uFjzUnq~dJs?3&bPzZ{=eiBIfDx8h{EJlm35KRQ7PhvTN2-Y990 z-%~i7iZv3Qncy~QH0C0`^1PlS2E1ahvPG9+YdlBLm-<A@Fj*CKq2`T2WxC{&d~Jjc zEY3uA1?0sCNmYsD>JtgJIn4gU_WgyesnZ&@6g6KrB*95j`9yVe>%Cb!mI$PLy!{7J z%;r8Ys!0zNg51@j>JPXv0gy{nX<JT+f|W&OMRP=F_tH@@htuod!{y}x;|9t2A=hW_ zJ#!VkzTjSpQ2H_Ev-T4EOWH>9k+vz<UunluCR@Q{z;18~_#SvN_;>Jopp0vhPwHay z67WOt*Wf?F4WNu;uYfXs?N8XBfx|!<w<ds$mC@5BPR5&gpp09K!DR3<P{ysNKpC%? zbIL*QsQldC?jUnS`N^9ob3pk?n`kQe90W2K)A3A9C*#<0;85^Q@BlE0ih2+@5Ih*< zJsa}#DA5VvA>ip?HYoG(!@%X>5#Y684k+_(+G_NVU_SU4umF^Cbu1|JYUUl$Opvx5 z9S$A`%J^CYjt3`#Md0zEwBrl;#J3CSN7DIR#^=32yO7>J&@Mu#cvq??5S!T=%7F<~ zJgM4JZEe-omM!(7IObV@LQm?&ZhR)WJbk?GhaC=%fn#ilP5_Sp=YZ6qXbVV`QAu|$ zDET{(GK%k~m~-eCqGX=*K_Gwf==r4T<_3AMu=G<QLh!C&_9Q2gJ)0A+MYcl9h7`{u zb9Gu!1mPp|?A8@~Flf$oqmx}nG@YH=qUY5$(9f_L<729nk@ODZGb5?4s!f@Um`+7o zV8+TIsozEeWGcga!u2|@uBuL(v9<pi+`LQdBleg6^=g-#MtzZ}PX-SKWj&n_&IF}h zo(i4~o(Xn>j2+SIz_Y<y!7@<ht>xg;;B0UcSPe>dQv<#Y)`GNUU03e_=W<V*)b+KL z7j0F`m3GXAd~h$Fx~}Cq4&2_OTxanBZEm1+iwMKJf~D(C5ltU%JMa>;#VBlcnO}{N zLNA9fJ#JO?963fOy?U)^YM1GiuT+>2tgSHLfe<U3x=|M>xQARG@G9EpS}!7VW5uR> z@vBhrF3G=yC>3IvOSWP!F~xjP=1J#)x#0QW4DbR_Qg9(C<#rJ$VYY)m1uq8IfR}*x zfwC_l{VV-=bTilq<`M4-kUmKFDa8Ii=KcfR-{BL#&U+PZ2%q2c`MV^}T#SEmP{kZK zmDX3}xqzuLna;&4pP^)RMv@+fk=9az(!qRYB*|C4_kt<s&TRd)>XAS>Z{``^6k3B0 zaUt~FQCOb$1PWszZm06$lF={+G@E{NG~(F8Z@ajNntMq;r91}ksdBk-^h=WWqrd|| z=5$&vMWBQ{5tPX2_o9tp7~BXlcaJ^`o&^35oDPcpXnSgBaVv~#59h&2KQ0-4KW1ln z9Y{rUHBYpg8`$5i<NV;4_jO`0N!!2-F|9FRp}n82y&O(nx75JPxlPw68Fl+AA@kIJ zQj(^Vlei5B<>PXx<1%56x2NPM-kxWWf63#Spk(nZP@<$S(s?s;h3GWyE5Osh*<cx1 z3D$v>OSBoR0mV*?C2G$IbvQT9o=#sKUz|@;SWn07>CG35r%YEvt{@oilFYi-uI7rX zaql@-Tmu`JD@s4G7BbL(EQOF%(+0HLi6Z|%OUc`$l^y*y%Qn_mc@9#j<v5s$U6b}R zwcMMcncJjgRcsZ^%uniniRJ2f%o*W@MS})4!I^X{kQexu>3c;vtRV02)PVA>f_W?^ z9cLIWFgx((i0mQ8E^MC7odm#Mq+YZOZ7akYErdB2oC+=isR#OuY%aK%duhBEfgRuy z@FwtL@K*2#ptMokq91{mf@6q-zB76h_#-e3t^n@<F9#n2SAvg%46jl4A$9Hf5AZ7P zKLQyuqcR7)1{??e96SqL4YH1Mt^+v+plfs1De~f|=nC+c;7i~w;LG5zz`udN2Gf}1 z-3=Z9-UG@j64rr@;Qe3}d=R`6Wb}w$1wI1)415xlx#LFgP4FpjAa(c|un1%vj!pyV zL!xJb&w*v&3t$WQ68Lj)Gk7ET3itwu?V?-2*TJ{IH$dt0hhu~BacxKTo{z!pU~p$9 zg1Klr@{GKd!|Ky{nlZtBnj!tsmfbw1K<__!P)3?_)S%6{&S29?MuKg~uZQGbM{0RU zvIEMDzy60L;&L}G5khw7Xzp+$W42V{o%@MPRW-jY!Tyg__jTy|M+V`F(KKP0+ALfb zdj9p4EQpx==v6<|ERgz>dAa6uZ@M_`<F*-A|BIcr^fNCQd&}jSAL&|1>^>7t?0ya? zcK-*s1^gU*6Raf4_rx8PwNeX+PL%Op_x>2yb<b}V$UIB;06zks<o=)FpFmkVNj=^H zvOleBsJ+3@xR*7JteMy^(6!PMFopZ;z`o#}U@CYwC~K!3psbl>&BOdH`W;Z#Oj1uu zh$DXOA$x{XaJv-b36pnGPh@WH)(<maNwIrZsweQI$W#!iK2kxXr;*u%*TrfTkpfGF zY{i=_vH4vNE$j@-Rq{^#2rq#fG$<3!6t*78s;RHw7e-{mFoc7tW9~z^7VU%oyK3ak zV0`sfdiaf`+9ayMOibh_+5elW_7iL=msB;cAH~l061z&hIuM5P(u@6JU0d%9O1+Y` zY7MwQcpf+mydKN~?*?U!`e!g3q>jkXX+}pA7JJ&-Z;k?4cj_ATT97_8`b+R=@HgNw z;6tE1<9h;>HR&th1n>iJA}DL=<3XNZ=rh03;1upBgY?Bw_M_w{siQvwPXccQWo@z% zl(ot0U@_Q0erJL5Qkc`gR`7IC>Yccaj_aRt2AJ1N>;)zT>fJOs{ihquI=ZL!Cj|G( z@B~}y<QIRW*7bNeFC9z>uV&LZlB)|ut(@7gf%6m6OUZY=O+8RW-{X1tC7~YG(d(4b z4w2|%VXvq5gh(ViH<cCj>_kd3x-2Q%+_Kb7-23f|uDs{P1i()ZRq~LUV8n++D362u zJ)<<167qlhAe)FXJrE{!UAj?UT@OJ;&^2Mt<JHJz{IWq^OKq9g_e$*2i>GRqT(->Y zmWzd?`JSLL`F;<C<sTaixD>=(%)8Mw#U+>`zA;HJ;_tT)AcR(%GGl$og*owD6<8T` z5Z-xAP`LDYKHjd<i1qP7Lq$DJG59QhD8pnb&5%p1vJ@X1)ko!Qe(FfdVGY!lJ;j3a z-2F%YV+5L*b1E8KGJ#u*XfkBB3)XSpf3SGw3qBg$Mi>Z~HZ8nr-7@HcHQNvTc7*C} zvU&?$J+rPck0fOFAeT3g4K|t9flLOv2hxoD2zQ|S%)O5dblXu_>V_h^(%z&$YCvA( z@@2HoF!$x)sUTyS&e3bYbGc_9I{E{!7GzGPdjxla4cs#a(r4|Dg0kji4AeDle+;&W z`|p6V#-$H(7K1W>V=UD9+Y<0i?k@q~2bY2=^dlYMzTl-G&sUx0pv>!j2p$Dq2A%|7 z4wix|!3RM4Vjb@oWA)kCRbU=@{3$4VeOH6)!5hJi;7#Cf!8PFT!CSz7R21gB`i%Tn zU>^6s2B(6zgXJJ|(&z&4PH-7W9~->`Wd0nLA6>f-d<c91d;)wJ+zdVf%Cqq<urDR~ z7`P`$pB&vEd>WJ=UfTqo0R9%N0bc;6y8jNm4EzIlE4Uea0(=#G6MPN)1pE^yi|^M# zsq}vV<wZm9fCb>YpgbG@8(0ax2c8QumyTWoGA2at0=I*|0sjd;2Yv#|3xYlccYvRR zLukfdfcaoDd;YV*zF-vG4U}iy@~r)FP@c7K26=CC^mA|za9`^G5O6G*2}&cAXX@3U zJX2o?9sqWN@@)MY@L*6{To(8#cnG*3-SeT~F<>@$97vssR)D-3F4_*tGxY1gJn$iq zF)sQFD9_N}1LYa|7hoYckd|~bm<3J*j|Pti<#jeEg7d*?;KSf4;0xeP@J;Y^@E>3a zxDz}ROs3tj7SVA~<^l2JptSTcw4FP_BLd@~d|R_vzt5uMU=$_qBJbXnXq78duoWnb zJVg2-_hE&Qs~`i5Tp?FO29|{~)~tc__tLW4GYRe>K0G<8n4{fk6?emw(G#!YF^gM& zmoL3lC7fIb>>rye(dO+XHfZB+6d(Eyy*iouid`-PtHB?Gi@=rO55X(I>p)o(-UYIU z9(@udi@HxEYs0s=|0&44Ti1qz2wT>Mnc!;h5RfpUBfwvPQ^6ZR<}<oRYy)rR{sK_e zcvpfCgY+j(7kDqY9;BT+kAk#o=W*~kaO3}@?#<(Ltm6Owo3W;3WXn>MEkf2ri)NT% zM$C+vAyVB2gJH~!nX#qik|pg(rBH;TRFtBkC|W3?jiQvIRkrr+`+S{qUH5(6_l!Qj z&-eHH=XX7tp00DweXg^-&-=X3a-9o)3*Uy)aoZs6#*6{~h3|4-9o_XlMBdFl1msPh zG<34y$8Z?b802QCF^FvceQ+i`0A+i92@k-7@HjjK&!9XH!}H-cun+tmj({4gEPzL# z);Tm*IY#+t+}t(FM$_?3t?;`ZwvCWYjSbRSe$`9QiTbpn29W+?)&C%&HGCU`d+KXi z5eA&zi?!nj3MxW~C1F)?^oyqY_2HzlF@M-y+Knx-ZpUqetn0UlIQpei0lVN9A^-mV ze=iR!AOM%9H}zZhIa-+u@{vE&zfZ^gJpOFch&Dn#tHk^v<;$gZq*fS*lQkNYti>T0 zJH?}9sRc@z(|`+#gLxy2)v#It`QtepU=SQu6k#6G76OH~<n<gx(M_yoXZ_~I1}a|H z8rOW#!j}JjWQEB458Ub;-Q13=uR>YsI+Ne~#?>|4Xyhf?QJW6(SHX3!M1LW9stm7y z)TEORu^F6!P~%n=_F3>oSQp*{HC}oGHh^njL-+zb2X2Mu!Z+c05V<#NeE}*?<EV<T z8RVH}jZbZ#_U_<k*7_3Qh1~aq?IE^BfH9V7>leY5+;@RnU{|Q|)1{EU)vWn_1+U<q zzRHZN=%dVdiatZfU^&S!399}zP8tsT!C6q_q(|XZa623X)uyk8YRlKaDwJIiYMx>k zTn2OCN;nF>3Ui_CnbA;tf5yPCVIKSqj)i~20$7!*EriYCIM@oJ=Nuhqc|9Brr@$K_ zy4aZmZ-rYRI@{PMcfsY@8?wV*g7?CA;C)cXA)+UppW%G?2V4N#Aj*qiJX{RN!X>Z> zJ_@J9rEn&E4BiJHhq6ajz^#zFaP&c0*=ygy7og;Q1Dpmo!jB=grt<^b3M(P1Z$J$r z--fNA?5nFGdfFKScfpBJcGf)j0eledfzLyffU^ry_s);-Q&<)G-VbFb$lmG(KZnEM zK{yg38%DRPT}H1J$c-T8Fu)5VbSp<8Fy`aX5?|*pW#(OE%)8uW-+1mL)TH!B9F7rc zO+E2lIO<Zvw+&b01hql$Qo7V`EAyA=I-aDDP+EV6_2BPNet*F%$XuA?z<=RvNZT{{ z#x5(h7IhgBH77_%7#ET6&>O9$GZ})sdRJtQOAYna0TdG4H{6v{J<8K(oM&{USz=P5 z#1mz69?yamvkc5Q%JCZlMiifZEuAH8@9pc*Lo~PcWDU6$()XDWuD1O8J0pMJAyw9$ zX2YeiV;n)p^KTZCjWYHJRlV%9L6stHAdaZJ=pLm8DY;x#WCy}}(ak1Ss|}h<H62Z- zkh7MqHDZ<)u>mzrtH8#&OV~L#-*XPXy)*+IH{Cu>onSnn?Lwd;um{-qGs84#pt-Fx zO;IF=g4@BpZxPS#y*Gj=Ih;*M?~<HoETKZ2?z-=*ir(V>b9fm%042Kz;YfH0PKMt? z?8m@&a1s0-J_BjH4)$AsBQ726ufR`mA3O@NhXThSvK%-8Pb1GKAv!$p8%%}2!%X-m zL`Mexf{X<Nj2#?wP~cy<8J0WE&g+(khq;e|jI{z4A!D8Z2WpyeY!%p_dvuAzSRugJ z!zqC^;aXT5Zi02;yRZRlN?Du>wTB$t<BWrRdd^t|TfrCMh43rb7V1#s4zLN*MVoWl zK@RJ5B$$kCoa-TF?JS1qFy|?F1$+j^Lyd2Hz&BwMl$7>@Ctz>b6aC%?X28C1I824P zupb-)GvSSJ5S$AK!^QAg_&mH0s{aT=jc12I^&8nR7Ck>4Y8;ybTR@I?bFP88a0DC! z)sJw%s52K9K#gY$;aWHjZijrb)A<rIhI4+06JZTxj87Xo4dG<i0^R`Cx@N*;cq`Pw zwzt9S;O$WD;ZC?1a=4tc5zc|1!+YToI1j2J+z(SAhnqSh-~y-vWf#I#a53BhAB8ft zmclRLGI$&=hvn&a9)}g+N>~*>0jtARunBw$YP#}i*cUzr^WgLF5x5>c4PS=u!i_LM zJKF@$gj?X*a4U?1Z$OO=Y9hPQV}lO3orzy-$#;Yv*Vv%%_`H%_R+x&lt5;(Ke-}fJ zyvyBMFogT4tskRs`i{;<Z{3(!yhU-VLi3I0jw6uO`tFNX(%da@{M{@o@vTKh7IN!^ zn_rvz)zx(T7(MEelJ5d*HP?f)C*@k}J|3q!#!0W?SVP)dFJFwGcd1OIvtn_W=Q^&% zN#*oBR54+<nti4(!(QBPgqiSFI23Mz<KSyhsoDachFjrVkUvKX_HFnl+y)!)-0d(9 zYFya@?u4qFT~Ku>J2ram;TziU<@mh^E0wOpzCqruH?`M}AA467?;oK#cs;JnId~Ok zJf2Zin~c*5f7NOlRswP!X`sH{3iphdhzeH!Q;**_A-Jufpc(N=Iw-182dhf|jeEZ! zs57b(`t8`U6X?7`^A_z0tUXM6J|0GDsJjTMF<mom5nZ!l#o!5?heB~vWS6Yuv4_xW z<2(<}ebO0b4e_WEN{6H@XntW6;~P&o1oAG`m1L_84kfO8Q|v6&Uo+SnHiy^2^WjKH z{hK}JouK4V<C%wHXSftH_A&ipcc{XnuX8?tjD?)qJR=3xhg$dH8D`ywF_L-b>vEWZ z`#?ya=rEQrd(vh@jcc&=wchA#hZ@hEfP<mNNgCIrz-wU+ybex<L*PP~4VOTTcix7> zq1NSdU`_h75wIg12?xVbP;=V3a2eD%NS_eUIOsc=2P;v28V6N_8V7ZR#ZY@<DNnP` zJ`q08y~aTsAbq@PJIo=KS~qQt+gbdf76Mfw+D@kQU*BMNqkN?M;t1khzSiUFJ_(+$ zfk<k);N+?~-UxN2M#2}5hg|`69m6)fqVX=JO|nAP15I7WSILXgy9p}I*eND&RjHTg zHDShgflCQPIRvUk<jv@If8Gk+=mlTi+%@4*xO$rg9R3}Z&sjK?na|mHMC7wfU7$9f z6^bI4?#OPIaibh&+Hea3L@NQ6Z>d)4Yj^YU_b!!%%CZIyce;*mQFbbyw_!5e1_!~N zFdJ$-c{6+;s=a*-S3->^wQlkWl)bwT{sT2`Y{+vCK-y^F3n+V&IR>-8;46sin|J1< z%XwEV&^c<ZZVr{5fZrr|dPJSM^2n)hxg+z9IzK=-@2cYcBc#ryvs7uN=jf!*kK!9u zjlbbkW;F&#b3`?&##H!j=u`LM?Fi(rHNE<pj@x;NuJ#WwLJpeV-M;>;N-p8g8?5=e z_go5#&QX^-g-y@~%^o4+L>-FiyC#3ks_|a1wHhRG8$w}+=CB-_V}^0-Lym<e{j2q3 zqx;<i>6i25$e*^hm}1v_++rNUW`tRLR50^f8%+Bg!o#kK_`XOHa%t?g1==_ZS+q5= zdUJX{*^Re9Fu#&aNOqfXM;~A=y<eEXzw~}#D%5+0L8vtl^%)n#8Ibv4M{@zJyE)5Y zH>hINn#ebh`7MX>zj?n<of-QD%zQd}-Rx1&S_%DzSu2?ZQ@K}W(jo04z#O+(0~`SV z=3Z+j<*6#Inbd@=?>TYsTG$v4fvn@0_i|XbG4JDOZw&p16NDq7s(KW>2abWw$bTW! zICvcF3X5SDWSnLC4!w7i&HY3;3{HY-V;Vn}^*&a0+*O`uM6|Jt9KMV6|3d3Gpnk&* zgO7!m=p}P^7lNr>=?jJMu2%d*bxSuDdRNOK?MfegsZ$3|gGwvw1}0C{DCg)rF~??f z{XBSPM4qJUF#v-;#ZgFP-c?$0jKb^xSK3}>s<!W4DvM}czm&3*u3rX|;c_Tl|0K+Y ztDtoK(@?tpStwoq9F(qq9_l&kp>#d#)kfEEfN4B$BgB3QyaI28o8ZlGGn5?e;4iw) zHsdB)c$&ZJ5p^bAA5~{V2;^O*>r6`3t25PZlxm-ZQ<<vW!K0LFPYi|5HLDdZxVQam zUMYJ;5B4tQN9E3c0mY$fHu+Z`?}Jys`(ZCQALhUZ;Y_#yJ_xZJO?hby7Cp|<UQULy zfeNrjM0uI_Yr>YAKT*E2I`t?uj#xkAfAk#oqz`p5?QryWUg{836cNJ)zoLH)ebt=+ zT<Rg?q1Qv2{Walx%)xL^!E|1Pj~TD}<4wl<ZsO)r*R5OI{|pb0V>Jcmjb+tedzZ>g zb<zljldj_%l(EY3O;`)Q1*KoG(aqlPccAjI1NMdQLA8|+;JxrexCVX%w?g*Zn)R7a zU=q*%6wZMA;ZpcHTn`UG=IjGsKy0GGmk^sM@HMPK{tm%7_${QL3NTi1(EEWOq4NI| zTme~AF=slQfTSUC67GS&K*`2$P;Ks8{-XEO-oW!@KTm+CMaYnAUtN`xJ91RX0L~FF zu!H7!LVH(fVUno%8k_8cfjHTE*Ls~yo*}r{RyNVZ&gLP-E+Od@3Ve#G5CxJX+8A?< z@gphpOQz3mSb>*!DX*&gnm8<U9e=<ERsMg3k_pzdoeSY{*cmduGiw1q!(rV23a7*0 z;8XB-_$>SjN-xsqoA+7%h2?o(Im$i`mWSP81;}{O>?vV<7O29#%DyU89qr{Wx{hk% zFS$G&R*R@3cii&-Q5_kJ?SH7FQ;t~v7j-h5ym*)LraIAFlFC&VvTxcU;{o$-3wD#! z7WX>vVptdUhi60S%m%O+HiUP>bKx_Pw&U!A=fUq_V<_9MDbzf8bEq<9J;#*2?7-+g zN$tHJf6~#K+;K1W9V6e&zedC=1Me!`G~)5{H4Ul2WSp!Z+nDS-ODf}ZeC#s$(D5Ti zV9;v-9d1e1G0191*@KOcZKa2Lm-3>`#ucI3nXY(>U)f54jUoM%IS;HSRG#@WW%DWj zjxL)ixT)ThgOjDoM(ZK}tCz5RW#eVmF30#v`IO?<f;5!yr&TC_U(pe_Zv1h1eOQ?< zUCEXiqEPOoys50J!YtQ~@-uUusZh-@11fI(%{u>8a18fUlbP!r1SOY)p~~nQs5b8K z7yT}2Q{2=Cox|VHrOJ}?mCf>!gscW3yo&^Sm)n`gaqlZgm6t+9bmkHc<+qD`+)K|_ zek(xDv*;R2QkABBC>=QtDt$#z`M8b0==t-OxSh^lbN+sb$VaI&qLmp!g)ZNXn;HGy zml;V#98UJMl<e@AAAI`WpC_dyI#0_<yVCa<RGwErrFEs7CykGy-v@1iTQ&a9<L}o~ z=E<I39i6GtHKc6%G9@*jIG5tiJgdo+jVjcJ{drPaqVt5VbCkZ-@Lc#TR9c^N^F)0y z7K(hwwJvUz_^Zv|Z_#;*K2`gFohe%((K4oIMyGu}X;eC1gesYrq0+R$P5V9kJGwvg z%h>PHX&=c@!4#s_vf0OFW`>9)bm=MXRkoOE$9Nne?2@>x5ihbb>!d6>dyVu<&R&O- zGwebmXK%RqI!Qx|ma`2gQ)Nf|<COWDkexT)=Bkje-W4flX9P|+&EEC(PkHr8ZQr45 z#3YzpI+t?kSjwecv`hPoOSyC^<<g;)OR0F;b%_qsu2g#3m5RAtshHcfqdN+p%-JWk z>&4Ly7ezaCjCP2Qqf3{l5M83<=n@@Am*_Yyj*jEv=r}Hpj)TveN9Lt-bR3;KM~CPX z?a(30;i9h54$%d4QFOvCicVOk=*M=7er%`qQBUa@{n(DtadeD+O2_CpklD!cKxCsF zqSJwRMuuqLjv<C$KDwCkqeCn4DP#><X5q9NMWJIACL^47-?92|dt8D{iTT`F3(dAj z^-ha%t7$?RH@&$U3>j!LuXGM<34X@01r8A%vuB~qKzlRvHrsnNkt+pae;tZ8!pM0P z|4;ejQd+yfP$~k^du$Z=-f{|S0$&DC9r#y#3uG_K(z8SOIR2ehu3$_=3iQZnHk?wB z%xx3YdRjT<)jyr9K4CHTzIRF2sZWqSG0$~>4;?A>w-d&}T~M~@`%t#n2XHw27|w;C zz=t43VC?>V5Pcii54XVsP{nf)@@MuEe-96HUxAYN7Pf&uz{}u|up9gd_Jv2G=Cnw= z!<wFX-*E{1nS0jU%=?X+<NA~PTi`!XCCp-jvjFl8Gw!blH*jAWehnFenD--@zjS`# z{tQ^LJd-7`GGzYQVa#LBgsBJ5;-0aJIpgdicsBRUW1D@W-C-l{nQu1xN5{f*xi5l^ z;Z)cZGQVWjRhic_>#EFYnD_ABhpq5uuEMOZ9)*;NQ$EJ-BdrWsBX!P%%te{~Ivt_r zo|%Jpy1|QK2J8y;p4=r+?_W};&hzkcsIwm9;SSgXYKty&B+frj>$7LkFDAq8us0k4 zsRL&)Oozi@KR5|yz`I~3oC~!+tM^p~!B64UP#?y;2A+#>YCX0i%!c|r=5QDfb6|g{ z_1Do*>#q{}F|Y*YLkTx)!DfHYc({Ult*gEOC&8B?>x#}sh%7j};7#x&I29g;(_nR4 z#dN6FF%xFMTcP&*+yTeHyJ0cB2hM`Cq0Vxg1D}S>X`3@0?}OU^b3gn6J^+uwhoJTW zA$v}B+SEdL9$W;Q!^N-*d=$n*=A@kda2Xs2AA=L%N_Z1|0^SRsge%}GsIwlQfzQL$ za2s3$wNL0-_!WE}{s3Qq<!IyUpw4z=?#s~!tY3yrAZ^0Y%XS;#mGBjq4mZQ0@O7y3 zjkmy?;a0c+z6lq@ZBVbfZHF7-J8&m_7k&tL!ozSk{0Y7fwcqFisCOwpg3aJw*am(A zyTeamf4C27U#-?NweRQ)SOUL<x50yO1*A<oPr+}X_Sb$3x54iqd-?+3!>^&{nErrA zA$#e}`$_DDvvW@HB<}2CGjmPsQ8RN*1L5zu=fgi>G5j0Of|_e$ua>sHI_#-3b587e zGVd?F4J+ZU_j%AM&LOBdr@x@)oXRn9I2~4nXTWn{b=V1>3A;kgzx0H)VJg%-%rK~V zm|LLcVQz(*f4K+p-iNacvM0iM0ct+xWvKa=*I^U52WlSXN7xJ=hb`bAuq8Yb<M{&E z6zaXFmheK@9=3%&VLLboYOU`&*a?n+=tgG>><sUL7sGi_YkmvirEm?r3~q&&!)-7g z?uH5QFhr+1e?qMZ2F^e~!D=uWo(of8C#W^Sbg1{I`olDs4g0|fFazEJGvNx@A3g;K z!WW^|26w>0@F2VfVyOhKgB4*mjD^Esb2uDc3UlB<I0{}1wKk}aR-*fzn_xb?7Z$+P zP-}(HLah<L1jobo-~{*uydM4or$F_`xAGUg=Fko|y6nIO{Qap;+FqK741a4$<Hb17 z3)1Giiy@chBos}=5r~==mJwlRe3)J{ufCd>?8_W;DT3&+<T}!=w5^AlpLq!?oiDrj zd4qpPpT$yuo3fG1-(QjW@gLx&$9Y%j+{EK$ElA(N=*c)*i!m?9`vM`4vQvB3qexTh z_G5r%VQC;gv9Hs5r#)$XBMw(<CWebcwut7LLYMNP@=)UXxUS!lZ)HjA292TC4cfpX zuq&jGH*0^#;7IO&fhvbzq3S;g8z4Dq-e58PbT9m7!oS1i#kmS*Tfcq5J(!TstL}(I z4{fC8+lAgaXtU@IysL)ykI)W{LVUGor!54s5sx&`z4s!wicY<cEjs^vseD%B(<N5n z&E{=Rt=BU(l-C>MarB1luZVc{+}NpD2ggVVR(*bWU(Jm3<Z{Xr=M`x@i7)Goa?gS< z!Qb1pA-68vmuo0Dd-S}l`XRVo?YeoH^iN&BjXzzkE|tg-(wc387mpvR84lEa<V)e( z3Av0qbAO;MzS~TZcyEB~2YOwiwv9E=g6MSrh<l&x-fwd6>$vxHaOP^@-lO=<HQc?I zv8l_uZ;o*28jZi53NrHA&W%Q1lA{CEN)!Iw)OEiQySW$lZJ}hFM(2!z?O`G82&ckM z@E%B^I*-EysKV+Fzk;+pbDl{GY((7s;1w_f4uSpQ7&rt@f!R<6JqBWHn0e1bkTzxP z@^O&9Oz)34^g-raAo>WMdFY_?15+V7)tvXE@}I-~D{wA+8{P{K!g=s-$o><j4f%f% z_JE9CoI!8_)Hythq0XCF0*{fOGf7MIeDR04OSiql-#_*EpS>d6p_%(~JU=My;9e+V zN!4s_OSiN6xR!2b8sWCUr_{j=Y7tp@#PJv1%q0E8ard_fzm#8#-$4Gjr0i7R5z5X= z?6W2Srhq3=$8i|qItnTe$x~IRr07C6jQ(E<k*UBF5LpPUfqLX~Fc-c6Z-DFI^Y9hO ze5BdCtn$Br@{eBo7(@NE#4iVyS7&1{Ixh1)T)jYQH(aSN9O8My$SUwpP?*<4{SHZd z$<-8!gx^;v(sz?^vNfcyYxoz>od_SZc<yN>{~D>>5((<B7xm0ta69FS{s~IrC;_-M z9iW1C6XCsx>8-hUA*6SytQ?e4Qyf~m?s+(={PN)?P;IR{EP|P^7!HO+Z}$35fDZTM z+qC`3@Dc8>htI$%Q2qOjka+>qCclK!xL1mAhwN)KZFC2`oBN;OJ&^TAb2b-tq-nF* zX{N2-2=BvxB~+W$82JIX2deF=O{?vG4b^s!!-bIbchiRdfsb-upZqU{4dHUA^I9d7 z?cpkz3ZH`M@M$QSBVDCzuM*N*9e2i~feK-n8#^{=Hd~L+*Y*d=TRefhD^lLn<kRu8 z`z7=<{YG7(8bnS0I0A0i1Ri7U4l5m_trm}Nb4riuwJJaJ+T1>zl*R*4_4@_v1rNfp z@M|~=9)gVP&72G4c=O)2^7Rw$%0J~+YA<MJ1-lO37gmhOzuiVq91Ish9KZLj(nZh? zFaHLFVzay|(YLND7<X%rlwLd@R?ba9+cTZQYaA=^_AaGSWul@)7R>c0PPO>gU$86G z{7^jn7mk9MJm&r27^r+#fFHt&@Do@WQf}sb;!7x_)3|4DAW#i{1zE#3@8s8jx0L7E zumQ4E3$BHApvvrQsIqOvZ=&}`ufXjr{FoC6R1TLd`b;|j5wWl~ll*vBWYJ2255dc) zt5kf-qb)w^D&M~ELOg7NyN(jO7U9s8q7_5G;*#m4`itW)t=y>W2|0Y5bi@cFvaLhE z9UCz{c@%eAye{duPSDDFQBE<h^cY7|`*_fSWt;6NcG?n!Cb_Rdxp<e#N_DKYQ0mlN zw@|h!ziF^3)ZC8b|2Ehj-VW2?olsrgT`(8UhDzC7h>kIHIUC@E+)JNn4reFS9L{dI z7=8(tK;*>C;l#pa+}DGeyNQF3!^V)bns>rAmvbTaPeA7F%p6W4e2V)NsJWb>P;)qw z;j@tWtH4@Fp3K~hWJ7Z|k|F#{t;_w1tX+<u=JaC2GGq?wu<~OSl`L!btWaX{E}tm5 z+w7GejR(r?6J<>LX6>ce)aTe4dHWV@(8$Cx9$?kjDRvY|A|!N8n(J}y3$*HE<8f?d z98I$?DHxNJZ#QOtgO6V(wU2o%ZtioCa{a=H?*}30@QIZY$5ZyP|Bwr6Uzf!HH~4r% zrOZ6v*aHE)<0{F`><W<jmVDYarVTuvq5q(Xh8;4EJVRWvJkZ8&{8VR>Wfedl*PVXL zynpjA?5$8S%qt6UD69x4LyjSI7Q$-qG06EGW*=O2h)or!0k=WkZE^O)TJUdJ8<yu; zXG7WN^pDQ@5S?Y-?P>(GxaWHyW)Ep&s1j)kC3hFV_aObK^9{t7Hs=do2+u<Q@!GJ{ z5z@apT_F3U%{+K#cn|j%!-pVq*Uo;(+ry6b$z1_ukH^C#*c}dqxH;2dBGkE<_&Ez< zFSrHvhVR2Gq1p!f1sRJ(uD9!bf3=N=V9m1IhBe}J_C{_=ZUK^}u6#A|dROTdvI5^z zwvbJDMzxT)aEfdpGTqa8K)dFO$xVVQ>E1+*Rp;*1h8o6K6na?HJ>%2#lw>{MNNYGZ zA?+H`z!dp!#1rv`y4umnh{!|js1`BXXNKDma(?P|RJ|g-9C2}}TanS`rrC7%Z*gzi z5Qo_YIp(aG9f&e&_k{!6qZ1F{;BV~efObaw+MaIWAJvSapqc*GrB1PsTl?@(eiXvr zu2miqGB=G@fvB))ePw7N|HITToJ0T4rC8=i#@xYZ1KXL|!IZ{~x}+5}{BK5P{P#K| zL)S7YQdW+1Mw}Z)?viEcj0FCzYSGmX*_V8?{$q4TCX~+L+h9g#Tm=ib=lyQ8znSr_ zIbZ);_!#a(;CqnvX1+5r9Dc=p4*V95gwh?k5IZN32h|0Pg{tLoFc}uXYv4pU9ZrU- zh^bI^|1D7BI}QE?DRPH-XU%6h%opoyIfwaNog3<03-5v&2iy&1Tg`#9;as>H-Updy z4BQW2g%85IRKP<}_C9*Td?#%Y<k^9Tp{kiPikx|H30w>xg`40~xD`GQe}pTb>h=k! z?;1S?)8W%_6nq9QfanRc*0l!eOtxpC&R}~EHioRfIlbXJcr{!P^$z>X@MgFH&W9VJ zzE8&aE9R`V&9Dvi{TfVwufrbjO?U%*3*G@)*E72BUdkYPzs{A!C)wx#&-zc@=M7+x zhR{`7>mfs@)_Q7cQCe>jPLWzq3gIiB;3<SMHJ$XCy46xzLZM|XmeOYfag5Ms>cEHK z=vN<V(++N>Eek0Y$#(dGR<V>dR5zNESlk?V7Kf51v+0!91%0rmm{bT&xwTQ)QD7Xu z4Zq8!5}@<+J*2RJdHG_qi94R4?VGD6jAPL4H1wMmcv;;RHk=~tarOSR5M3&cWd3Qx z`=Sb|EvcxbCTv(`U5=RP@>JL{8(Cm6Dof$((*$&RD$LmMJ9(;iNhYPkF2-St>&_WN zMu+W$vU_$x>9E}}2<hXE&At~p-0y>r!O!4ocmS@4U%-v<AlwDNhLX0!5OX&04Xgye zhm6evKS0?(N1)~@e}X;XQFtXJb4I6~fYNEdK<TvKAZwQa*3O;dFi^qnA1DXwQ$Xcm zJgf*=BMMZ8H^8cJ7Ca3uhrB!NJOQi27hw&!6~@9ZVNG}#)`8eqfx56GtOwESfwLic zInV&AR^#9cunBwzHich7&So<2DW4BJQ9&)?Lf9HEffvHJVOzKZwuisKj<6E-#c!Ot z@M72mc7d|DwvqSfeW-c-PCCcT8AR(GJ6#ZTUptVQRY>-{tF*!yg6}EKEC<ghg`>ia zR5<@-W~m*@O#M$~bZWCp+Myjk_Zt(QDHhfwu7Pt()fGn!rBs(XM!)Kkf=b3M9Bo)Z zRlwcmAZ(x2!!1G+scCL<%h_wX-H;4jp{8ousv~)JFV&^ms@ASbT=#C&z3TT0sJ0pp z)mD4Jp)e6@jFJRr!k&=1x&ZSa&g(D@z6<-oJun0AhnyE?WQu(!W_&#eHszU|XYaIx zyjO3&`^35SrcDlkBXG}#W8hGDGaLq|!r^cp903<Y`fO(v91Y)rW8f~B4-diusIf~S zlu#7Gp|Aw9UK<z>Z-W!z8aNrMjZT4o!W&>LC5jE_w1hW9Y?;6<5Iq%`2GL7_8Bk{i z+zMr1%z_=@9WW7c4y-AM!<0$%T+#Qqoyp(V{MC+bTSLd^+K)s04>OT6i#70wYC7sd zBb$yyHV)T_QHUHhWR2*8{WkF<c=qIvOYN&2w8LY2NR<S!i}9r+a?M;LcSBr9LHU&2 zRfSn{;F?FdDDU?{W&M8G1U?A$JoK284<Cj1!lh7s!E&hbdICykY5W>puE~_U5-QdS zmn(B{nv~!>E0ZU3(1s~jhhX02(^o9&L~Z@`&z<y1Ew!z(WArxD()%o<cTskT-Xhu| zdgEn>$bF}wWsKRR*w&(1$W|TB$0?!?rOg)OIL!<qN95+@4G%4iXV;P%E*LtR*TssB z;V^`dwpw-Wm*=B6M&aXET}Dgd=2ubLbC8UimAB#J$Bv!s#$jxT^?2#(&b*$H7n+T( zdtDoYp+@LFv`3)|ZP2?^kCLBmIB2Y)>lNx>b^JO^gm1tB@J%QiV;j^w`8#kiq#tx% zhVMbmrR;<nCw&M{C(b?aT(}oXKYaq*L(a2uy28((=J!5_np61#4uW67Joq)701rXU z_Z^0s@B0qk55I@fTR*@R@CaNDkHSsx7~Bp|K-pLH*G7;13V-DOH~2IB1F~N!@E2sC zQQ&W=?%`k92$rwNS{;mmonQsX{+vKX*bP>JSHh~0{WF2npvGs_U=W@Oi(w6@@megL z0c*lrVI8PBAM6K5Yqa&?D%b#i4jC&s?28DnPtbfL<vf^31viB^z~=BK*b=URts!<` zpbf;{3$%mSRRQ)FI%mL6Q0@Fa{-XELjK)nmWH^6y!|mM8lX`C&$SRSbcvoaAm-dXu zD@uEYrP-SS^|WV1BlE4v>lfaobV*(-!OL97OUQ@PdMQ*=FM~~BH>fc2Q29uJ%5OXB zIQk5aUbyME39w!`zeV~u=1|VOD4J}~_y6yuE9E4eSR$+xm4mvB#-!OjBv(#Da4M=P zr=i)!IYw2C!YPhFv(=+0XKYS>30spjbt+eD(de*yDT)>$m(nvkOYl=%Twce*gY@u# zH|yHT_%fI7Dhg>RUEbj2HhUX7t@611TsJ}GrFw|v-}78|#w(`$`@-{a8vr$S83+?0 zV|ufe#5c&zT6PfLiTg09zAy*A4oAXI;V5_ra-N;}j_X)hljpMU)j0<iLXAa=q3Vr& zu%>>sW*7b5%2ecCw%90mcDR1&x2#B;*Kx*Xvn6Me>AW@(*1M{B{|M~@T8)d0ZPnvW z{v9RadvJ<05EO6{u8SycX32BL+5=4Dak9OQJ98-kO2#pwDU>Nya+FlfG#!qcaybsc z(QeRkzXl;gTUBI5K+kr+dZ5tr@hIU>oBqu*lX{VdanKdAI?TRu({8K>b5)e1>R;_l zwx=%688r6pO;GkOb2i4_bznC4Q{gyx3!DmXgDc=2@L6~ld>`HoRfL?oZ`KSSgt9jm zKn<!F!4&u~91S0V>>ms)g${fSE`scTc3y`o;kWP!cqV%ANq7-l1qZ{Y-~;d(_#|8n zHP5vMeh8n1-@&y|YZ2_Hb}Ezqb+83o4=;clU;^9-vB?9kK<OLytd-guqdl{&@Vf-o z56hz!#+-c45%u<?N!Gl}CyDNRVVm%ZlD@Zaij+RHjSSbY22s_w!=;q)b-}Te@Wta8 zq0*#)(s8sAh6h*@$Z|%+?G`e>wfhm$@*VzMQc8u;3Z9+89u>L|e~u_G<d$7jl+DLF zbilZda9f5)9Di6^`FWFrxnsxX49{ghi(Mn1gwNDQ@-_SH%m><x&QvR~&kT?M9NZ$t ze_k6p7N;0YRpdlW484lD>yr*#n&FZJ+eq~^a{z2aw(<VnhE_GK;?`P&-Wr&H)_V%R zx;(8slt=0EwDNlQ-t+H)Wa+w<+^XSLL^^eKX>RYCnKsw$uK&&Mz4v>a<f+SxUpxAB zdHyx2GynY!?!6aZ1y>-w@J)U9;k^f%+w?BUz4V5vmicjWZK0j0Eo_C7zc*kKd=sX@ zx8b#LJJh&k2fPWs2k(G8;RA3tTngWZTi^%qZMYXo@|ZJr{($=-`x646!3OXEYy!W6 zvJDQwF7Pmnhu=Wn-w1pQ`@`>HF8mRWgGZqD=pBVi;c@sR<Q#72W%vu!{LimYV=B&9 zbv}iEK}|{g4cowfp!VvOuf%vAR)F;=BfckMz9&!>w&wl}*c<YmhBF#Ag);P;LCxQv z51I21w1mvr2U<hs!UJvLyo$_mLv&T3Bisf%LCP|4G292cLY^JC1nLafOJN;&1(e_? z!tO8$rom*WcSBO(1lR}8fT{2?NEqiym<iXz{!mTgYN&6TAcamvWa3&_8(s&S!XRu3 zhd_PnBpY^x!(ckhfmg$k@K%@$=fctO0XPP(gZWTjhbn-tLtd_T-h<b}qi_oR8Qutg zg$}HYBu|Ak;VrN(Bu~!ya3*XGZ-ZIzPIv>n8!m%$;B#;;+yw81Tj7K7C|n5tg`AV? zoX^1hVb~fjhC1GVDI5Wp!MovdcrSb$z5<_sIzyH+b$*7c;ID8sjG=w4ft*Ji;QU?F z|7fi@dQbUu%3W=ayayUY_djgjEwW3yI|<@lq}aRYeEfrUvnx<0&H(~M^+w;|6xka| z!N%bl(f6oFQQNnAJFK!t;b!%v?H2Uo7Pyt_quSwEs*lRT(Xa3|IXFDzrky@EtBN%q z_lS-_Nh-wgR2|xP6zfO)aVhW9VPpP$CjJU;Z5L@weCdDnP1X>z=YofioRbxmTLEty z-Fj$$Ypg|oFCm?$%hS5A*xS(kj;MRh+w1bQe6CG&D7@zCbb0Y<%}|%ui?G+hT%La$ z_uh+7x<;4h|9sT_A5r(G*<6OgpNY=VrB7O@7aQu{d%X<ynYncDt@X}!(<l$gvicPD z71Le!m(&Khe;G=yHozpf5h~m(FbH3Tn#<S%)u+4(wbyAITm#>Qo8b<)3%&<W!d<X7 z<+>ZzhaW=iUHS-K1o>8iGXU;|gW-NSAN~YChbQ2l@Mm}$Y5o;zZzuZDtnvN<)4Bf> zUIqVxymJ#MSD85xSRPJ<F;MFz72ut)3e+6JY48PD4Q_;|!`I+hP(sU@+fFs=<s4W8 z#=$t)7-~5U{p(DF&EPE93eJbE;ZoQJu7DT9^{^e(T5w1BH$-2XIR^B#(~$bU6kY}| zgNZO6GM^ntfLB3Y1aKt%y&?0*0rb0b8_a-@LCyeoo`hFH=9dBkA@fUtLGUD`A8?pQ z2@Hm9;WaQ94uOm-0@?5$I1FOP2ZqC!VGi5`M?mb4z$l3Q5XgmJ!aR5y@>KxU_wnwb zL;n;gfkWU#m<K08+4@(Imgs%h*HpJ-&mOR0w62xWXx{|+zuj&Y(!R1?qO`Bfm`Lqw zmR(4wRkY>+9II`mog6%@($O@7%=Fo~SPgoLooU|a(hY=4HLtzc_1A@pk3Tkn6_gCm z8NsO+`ry$2PKnP_Bos0G-pogs^~7*jA%oj~gPHjo|9IAYqCKuix_mhC_&WooA|1B~ zrLV}7akRx#JTbe_ja)HEd7r8`xSSL&pkZ;TH&_N6^XKag-s0Bg!}JFJL4xddNgbD} z;R6^RB=`eLm5)Kyap@_0pp7!3lTc^j|J81OwX2%>mCEQV{&hujU#*xL3r!74jCFbH zy|&F&s5{WqrY^60xGCy>g?sOH2a{~ZLh2q>Yc5Z{$5yfTp86l@-h2MfN8R6rsiVvD z|1|3Ud`us|zg|Q2-@hJpf0iwoP<+=#-LH(g*Xy1B_->B6e=_QRPt<*jGa`RK$#)-` zqj%6F-X;B^{_QRtN?iA;=$p&AzXkS&)1cNCr^9SG1CE0;;Z%ryZ1ytEf{$>22V4#B zf}7yoQ2pC%xDU>Ok`vB5FlXK02ifZ#cmOtr^Pz-sAxwo2!-wD!s4>rDP;>2%!w=zV zco;ql8z3NSVPnX<+2*`}b#O5EFG8&)z63|YSE2g!P4Eu58LIE!0@d8G<DDnrF8DIs z4c~?D!`+Zs2j^wVY%i>eARdBe!NZXG^}zRV1pE<>fk)vKcnqrFI02bA3Y>(`z+d1? z@K^XM{2i+0{sS2w(g8DkK)`vI+^Gf`Av@>5im(f0T;bdbt3bvLfivJkusVDM)_~g~ zjl#jU2r&L|K8Cd+HbS5tqz?`>gqOfZuse){QVdNXeUd%`<50(e7H|b@37>*(AY~M| z5Pl5XLh=-72W!#L+C%;V9bi7}4Cg|=73s`_UEv0J349%13iaL9%i$h)1>6r4;9=MU z>OJ;EsPAU<g8FV`Z>aay89$ltK3xSDa6b?(hJ)dk@H)shWdcFSw_^glYwz%ll|T-> z2=Yx2M{{VoP~XbSgHz#HI1?7YZLkRH{qkb?5gZTe)37JO^B~{6beh8{FbCcQ^C0i? zJLBL~xEfA}>);Hy0p1EX!&y)&b~gMS-V3|X@b8CLzz1L=d=Sor3*lXG5u6JjfzQIl z@I|-;z5<uR&*5@-2tEeChbv%P6vvaWGvr$)&ZY2acr#oBXToQp-s?t*I!ob;a66<9 zoqymfQ15GRhArS0*a>ch>Ik%7uwB$X;a|z$Mfe?ojiT+D;r|z(Bve-xKsneEVQAr1 z8`~nrc?wqpM_(^0r+PRwCOvLnt1hk`w>A{VIrFhVyM$v5k2t(a4HR31!dn|damdC{ zVD|+Mz3e@bLk|5NYb+(8l}|49+wssoRpygF;ADKZ(#*JIRb@dp#pYgyg_|kU4f}t3 zGk!>!F8y>K^#61{_ow>lC{-SfhD*uY0?Rfl4pM@vZ9u)G@D>4|Gt;=<dcHqFn!<Y3 z23G0sB(P0@+34>Nsfrm&W8+dtSu0x@{IZ8zLgEc+{nYSpx%okOIEhJaF3+CuzJTc6 zKTaj+^6uaE-G}<qLW;t>B){rUuf$=v>;4<^E}8xvc87mJ`Tq%JB>n@3z<;5}iEOxV zZU=lD$e9n(an1@@2}&ZWK@}t42y%Avj5FaUuqOPH{^%^odUc>KJc(XE8&)Mv^<fLx z5HeN@G=d2*4)%kMA!D3C6DWP(6i$Gg4dP6J&7tzfypn?r5MW-(k>GWN()*oY1ElF9 z*cEn$-QdL#T^;BOC2jFg`aS_3gq$_vl%vvnK=K$!gyb>M3rfWLKz#=|750W{Q0I}P z!yMQTj)s|VDn$1?lDL6T!ZZZ#hS_jG916dL{ML~OO@oUdXPG$b;2rQg$o!c3?(baK zkb1ojCcycy4}1s?f%Gj-K3oJR!Nu@;xD?(Em%)4C<8VIYtQ6-V_#}J+u7b})&Q3A< z|7j@wzXrYopM}!@&%?d&1t|UL@E84FbbH*iUfqhnbHe(QwMae-Ut&MLZqG4}BZPNR z3Esu@n+7jZa;5ZR7aV<h)SEAnvv=wFk`cr&bdKf*(yKIWgh~>1;wXKa+<YA7-_iNF zn&wRv1hi-4+=zS(FUZgF=R+y=uG0C4$15Tq%3K_d5o+2SG)4^9q%RT)smoggDYCbr z`^8cBJEHFY^4*8@#U$5JP(D>&bh~EVLT+0r7v=p8SPQ-h8^i5T`r;iZJ;6M!vkLBj zdQb8_sD2GuH*47M!`|F~1XYe7L&?on{;r7Xckjkc&z!~IdExTTY9GwhH!F3RMX$Vq zq1k!G!JgyuhuQgrcmjJ@WYJ3{E2#sThq_L!XSKj-hf)58#iPs#Cq{Y4;p~$uPyQkf zNKtK!Bb=_?L}5zPt{o>^SMz`6qY&EzwHLU|b?-_MD{q&;y6{q{lw1M(zyvr8QrV__ zw)5`}QRTB4w+r}_{%sX5AG3#}aKums@*@NP&-QObe7soYG>|CIBfXq{s#r7`Fa)Q@ z*2%0(s)y~QVEnPfPbmFR?M`yx+9vv8Q*KL)lU;=j$=oO$y-RtK46017aUCf`b5=kq z)RUOUH0Sg8gI9B(2_^jf;hm5@TV`Es5M0JR@t8h}wKP+PCvl7ZHmc?@+u*M4@vXyU zIBZnTurWb%+z4|xMQk@PC0R&F@2cYcgU%yzdBAM0lfXCxi6~laIaaOO6Lm(h*(QhY zf`!jTnT=l){xHF;AB(0VOGX)MCbFzmuvvt(Wo`D!nOcg&t;EC-F6`snD`xLfo>kV; zf74yZ;gpfeVKnRo$3V&9SU3{qL;lQ}0L74Jm~SCqUpWi7p9o)qli_P{3X~4L0aoC7 z=msYi-U2m`JPoSd|I`g#8mJsQ>paGg0h)GFYLB$Ul+<3qtU>8X!Gw&Agh6D|1}I-T zKxS4#YGOi0BE@FI#FP$`l9|>gAuA=deIU*aRH1aBq=D&48Cjf8Q#p2Z4H6be&kQD} z^vDYKOiRr&i9rIaU%5!Xz6n_wDFZ{lEFbCHy?ffgKm+%eF(JS7gcL7Y?~xTkp5~FM z34N17kyZ@(^-oRd*FPzkl1Rg|$*C0bOYPq`*dsY1BbZ5wQhQ~Z{3<t<LqUAr!7Gyn zh4NITtPs3SZ68rJ<Qq{vrsfp?X{G&>QnNA!h0<Rw6hLXr?B6{jlktL${Pd8Y+<6hu zI-e1C&Pog>UlsDG9^o<Is!%S^40-4w-TP2X0}}XuW~lsYghGUULurhS^z7OH>Z?Oh z*9`e7>a?unqzv<baMWjoLWF%oRa7hFsh{^u=$q1Kko$X2sA`9T_`Cz>yM<9F<m-zd z{Gd$JL{t-XLjm1r!hu4iP%jk5ltN~Ygg!|j&$FXElT&(Tg^Hnm$WzJ4%u3>asR`-9 z<d7US2!-(bs@*Ad4MV<>zaJ3#eWOr_@b3qN5_e9>w`W>LkECGtv_6TUpPn1?%t%eN ziR+&p@{J4m_Dx9*_Do91>YtGmlBx4TzI~EXgDC@;Tem509P&s{$jrPd4NW6;rOY%5 zdG$$1?bSb_S5mN7MjDT-=LTpR3NRokBQqr}HT1Y<A)nN=tdt(%cHTVX(X)S_K0%`c zJPA2J>}LhY_<GHyMacK6q?BICS)pXM40)tv279IqOiB!<r)2d=HX2j;xF8gue`;b< zMxT__q+ohlW=fV)+|<oWt1<#*C8zYbGBqhPGnC`jp-??Dt<G%Z{=QAfCnYPPPfCv< zMTXSX!uzM1OxFcUin52Xu+cty#8^I*W?fr_Tt{l}tkD<>-8$qR;oK(V%&zm|P%IaQ zoXu`CB;t(N64_$r;utvl=)9Z>IeEoK)NXAkFFK>1DM@`2ZBLY%mTDV`JWWsK^X#6M z*2gGId756z=ZT_E>XnpXBvJmRhw}NGIx(t3zNTx6_6@dg*RCDk$Eh5vAQhvMX0^T1 zWAd&P<t;U@4oH5Lqx?+oq&k*o)hJIl;l55-p-zhmWkt$%)M^?EQ!OeC8m3S8gdSHK znVUfXU+MNq>p|z7mKyAlk{C=$?U`m|PJw)-913K*M)k{qW;{!we8n9ZDrsO=MnWhu zU#Uk1Gmn&op~!rt9}1P8kuo45E6Fq{h4B@CD2ypbb;t_ftAJ2|K4}TGtxz1kdI$yS znSdgYrc@kN!X+3A&>h`m4V|&g-Fzn%6$Sg}kI65Xm>=w!o0k*pX^mA`LkeWAAp)i3 zbLw;M@Q6TqmI9gdDkd*bLea?a+Kg?=SRqVu?Xz;n7Ur3q+Brm)lU*{tD91>?f|+Vp zu)ev)#q8${_AMAbJ}<|#MEO6eOqmCb%-1&#RfTe2>ba*Dkeghy#Mvuva^a|8DjzH{ za<5>^ykOQZtDqp*J$Iz3;eoN#os(BGzMyATuvec!>B-n_8CYh)wEkJrXr|RSC6v8N z+6Ra8Eds3XVR_lbIu)dH?73(bUQo(1DNGw<s^TE}v4S%!H-Eg`J<}8$3?ntkB+P~= z&K+Is50TkBCDSx`>m3(2bfn)qJ)?*3#}|#v9qRY(p3>_g-_wipvnTq!uS!VG?4R1p zl)8;RdsM+_e~8{`$qC&t2~Lmwq>jxm2D?rTDw>dsk~Pbp9MHp@<hg`7SXLPC>n6<z zP%AVp@<lS%e0JM@Ke^c0DK;(L(-IT>X-P;->z+h!?3(GSavLzIdszWpGdvuuN14HT z^v}#n>l<huimg3w4wQbZG5dq<O;HUql~0%qS`p@3UurOzDk14(is5;x+Frg~QVhBI zBMMA_N6IQE?@&+`_D{9SilL~WFsG;_m%Y062vdL@M?a<5RQ7qE_@!l}U_4u$n3d5# zNdqBc-zh{n38+5=J#|)QkBpS`EE9jeKYn*MTN5KyV!tQ<%Dwr-ISr>o9~0BO3ARp^ z*i7oU*T7&3>*{>eFOgAyM$WJxQC5lVZ@m&YJ*S8Hs<iQ`iBFYtm>})hQ=b9UFBni( ziT%kwCbKY`WA^LfkY;~Qn2el}oS|ZV-3X6wqZ5>sQ|zWl-s{M1R#q^Rlm`3c=I8Xy zVVpdyn4g;jt1XkAMB9pcs1?hrHou%{f0;BXXIKx;<mAgO#<_x<+HgkbbgRVbtHVU3 zPZ^pMb14D7Lz!2SZ40L{LEdB|R#y99cfCf5%E&ZJEa`gf-iA5nKa(4z*Q*kHh&WVM zUL*;_hX<9qg7HN*l2`(*k9d%&HXTeu@{}|s(R@JA{-7y8cqQTo!5(=9#W|7Do=Yfc z0piGX+rLqti8Oyx6)FR@a9@DFYTJE{pqN5Eiy%>T9YkiU#BPavyz=BL7S-a>dJ)M_ zG#`_-=~v36dwdU0FYZZ^Na?FCm9nU!4?O|fOrqP8Ao`Rjaj106Hx_N>NxD;pPYU*B zM~exnO86?O5=zyiFUg9)#OX_N9pYGNrOOoJ)y(^PQukvxr+kt-l)9L3>iX!7(Nm;O zEz~V5J(w8$MWw3#EGq3i%oLR=Zae=;H%nF9X3;0NxFnUGLZ*h*R1bxlrAb<K+<Z+H z;}KzsXprVRvnFgU{Q8m&^n<VMD8)~sGnpqrI8|@y_Uk_8H_h?Yx1s$NBjsX>G?On2 zVydVD75B5IM0*62&77CYQ>l3@BJQL~Sn1{$Qb|*Nx*>B|cAm|rghAgP;+bkLi8&*( z5oBXS49B){KXe;PUZrsIOwE*)JQe9~TP&u+6;KIOV_j+!(LJ%JDP@WChgO_J4NU2f zG@EBiHT~&UB7$YLp*}@YCH4i^IWb4JPf^emz;h7=FhHLeGVw^uuIAZfvqwQ5CnPB` zPus-UA`BXR*UMI!Po<kSs~x!JrxZxh_+ceMDo|;(^&wTZ$mYU5Yde_5$ZU+NSoNh= z|FA13Ir*fO)Dj@SShJ)iM2+aw7<KJFHT)4&`#6=!lQ!w;1;r)B!-{eXOM>)vRbqAW zw_B662LI<2?N1fvZOYB3m`mwYm2HYGhER!{vb{2*Y>YgbN>qC0`sy2vD)UhB++&lO zmCdP(CaeVUN4F?!r<$H!ls&dMh&5Ry_JhdgYP!NQR7cQsnm73#$*Omi*lG4*TIVo* zu#OX^`5EPben7FI*No3}-%pMHGnJr@_i^H&0Mlt6B^-UL9y-WCuu5!pM4~fHHHNA# zLaI&1C)>32$}TR<$j%>`W8(1Xb!x}gD@lNsxDW6I1mWq?y<n1ghRWsv8>6e|t(CDd z>NmFFmE4uK9VBNLn|7sN6`QD}JMOYk4Zy^*vTwBDyKdq4Ow7#5<IQxh$yT<K-GjoD zlbY;M8-W_O*R`9+go?4ODmLxwJ@+9!w4*i0JVPR}#6~D_HtkA1XwdX!Uqp&TFw~h@ zfmU9>i3*}rm@Zfy)2OH-^3|O56z$As!Wo%17R2U=>PC7Pm03+9DdBgL60@SF)@kxB z-7a%i9<I^gY6BIUs`x)l3M1-nd+(`9olvx@ut(hTMv}6!M=Clst{B%gQ!-3>sSzx4 zOR`5F*|t?;57)K=U2N2qr;*fTAG9I+W=~2lDj1=0u=&Bu5jjuInP@VnvMOy0T4VJF z8&OEsO<Gh;>)eX*G_-ntqj)1_*|g>*ZdlWLRdG3Po~?`}<qr=_m=bfJ^;WJt?PB`H zQk{iqdE00X)QcTj%Std>oNhqLJj1QcyaM_^uQpX*BO{WKK~Eb_gPP<!_J^L`U?MAL z-Ao;(uu^YIPrXl;jm#w0q-m-RX`&3K7v(U~7Vh&(HPN8ST^6N;?nY-8=U|7G<QT0V zZJ~wQh->hvytKYW33wfwY;~p*s>FU8)p*LVhE+yy*u=U6A=AQakMrMFuub(HHtWd+ zMY*oNQGs+*UOEJm%|TphJa0u*5_W#5medB0xCtHLbv&j?EpyZ5Y0c=CT815BJNi=5 zSv4PNPWn`|64=8ki^vYeNV^g^%P%d)RlRLwgr$3AjU)AaQR;@qDH~Syb4a0_O1A}# zmim#wGe4yLy2E8-Rm$X$eu(N#gT|&v^p(0D`j}_QMES3AMbNa{dHfj5hv_Db5R5`^ zNd++COkv1aRLD2s*!-r#7-I{=3`C8wX>?11|KVwcIr-+<(&5|X6CN!Z0SoDoO16@X zx(&4{HNYL#Lk-XbmfIqm#*k8wY1PYy>uX=#mzh0~=|YVxJ=N5+D2L4vX8NoL2j36H zdNak<*!O7LEt({&6HKyRDfz>^Qy5IO*{(~^xU_Tts@Ob4c7=&Z!!>=1m0Cn}%QU+c zWKXn>EWMY4DQWEk2~nX{^z`_nf_(}K#*8mC4^Z2Gnj%qVliXLvDJ#?CYj%eR+b&Vc zkuE@^h+<z<JqpH#6q71SGd?D<c3LdGIEASmMJR(hvOdf+v_?(EdXLWH$YdiRdPO2V zGhzHBud_7Tvl3leLeIWIb)4zhx!C)d0g|VRVI#yfFXj4g0~5JhiC(s{-MY;jKU5>E zP#nKf42s-nPepC4#<y%CbjQ{*nLpRw8)3`H88@E3!W5+Px7JFv>FL}uEW=<lMRB{$ zx0?XdR6ZeHp2D-DVnXWEDOxwT!x+;woUn!Lb|SQ?{OmlF4OR3Hil)8Qo75dvlu4fy z)Tt^bXsV*L?PYb|N>@BWZNamjq@}%nBfq3$2c}>D!^E+&)5tbITgJWyq2g=KJR2!@ z%|_F{mXOo%U|6zbGNUIyV=Ka%;4*Er$)l)PyO>Ihu#{o2+BAG-N>m*S)~V4<+AeIT zls1z-pQ0%}As~Gb^s92y#jf+o9|}4*JHJFGtTc~Fu+ld++-!^_b&Zg>P+9N=t}3wy z$Tw;;Ewh6uhF(gQ+ZQrbmNV8G>x#9XO^al~h|8GpQ}j(w1<{r(@??TY1x8AgHPRN? z(lpv96HCX4la#~Fw!*y1H#V9gofeislf)YdCne%av^y1M1iRE+gsp~C=yYT5jU!i# z%}fVtI;$wPZCm|hn`ndyb*IW?Q%{xH!PeE<B1Str>88zSM3XZK&=<ajVk)HU=}(=m zUL}?ylwRvT8JkL-=N6lNYcWb!sI1B;MANU`>MLC47YZjEnNU@n@21tYPfSVPX-nMn zP$8)Z8gu4azu*OX6_ga1P$oKMUAwJFrL_`FBj{is;P#DHRTw#G>!v9uKZhw`Q%|La z5mql0ducRZd@(69QI}z2Tbs|{7}N^f1`%ou>O)$RNo3M5R;FU4w*SUYir7q&NY$HS z+2SU{P78z#as42}&14DN^v0TK)G6wlP!xv00}ju3+c_dF)l0WBZ%dytx!4rLlm6Hk z3(&==a<yAhWoy=G>_n~+RbK~T1D0V68!0GjxMLe%iLKVmp}8fdK20yEQu-^R0}F;s z4~foIR$HoOO_t?$#A-Hg3#aKUdRZ~|N?NjFZ4ikyy-;AHULQqgN_$VC=*grvKus^! zu-*n&L65aXlaQBJFw6>qN@kr~VB?1x^%1JarbH%{5K<~;5+`b2&NNy7)SH#`^87YE zGug|D9g`K<hNG0UwYd-V)ppKDC*e__R&B@#n{1+CR-j;L4vKTQ`;j)QKGj>Ew7Su= zKS+Bh`5SE$x2qw>RU;j(ic&%*PwvXF?IxdhOF_d#)2Vo!vXVRAdiKp3TTnFF#HHq{ z(kHI|nWGAdN{lf1EC?&1&-oq~O2g@8RH@NQw^@&#I!@4pRu;3|gxN`l9@*@}#Lv`4 zq!ki0B5<egiBZ##k{AxY2u#Qh=Fzhm-P*>jWK-tmnNpA1u%IqS2{F>F@$%Zzon%NS zDC+WIf1_Z^xz?V#6xWQjgNi?F&G=fj(b3^f(*`RwuCzkpnk=lDGr*US{7Yi}vWBH? z#w13qDmM$<Jci6gS-P|R<%Hob3(@>SS)oCzX8RQ6k2Fd187roL51UP<-k!0=m8CCl zm@-uVMEr^aS!&<eD3F~|=`>B*w4ZP3^rgql!ky8U$83yd^c+kmEX)fxooJ<J=XIWO z^B8KZCLK~j{jB2CxKqOlwV}zH4U$}!nj|tBw2dvAKDk4SIP}g$q!RnipC%PDhD@l$ z#=C8S?3xVdG)hl`tVwQyN{;H==#BYH!6yu#kexrwoxfBQEkjdV(XJKwLwEYk#H-Ad zQv4>1KiEFPU5FtwCV6E}t=cjvHTQ0Wxr{+p&`6(FxT)rl$_)+H^(ZOzQC5e!n>dP% z{J5pXY@d;zXamP|SY>D`qhnmz?3p_$N3YRWiM`V{r%=rsiPesN%3s}!u@@e+fmG;9 znC$gVwm97$$e2*+u9NABee(yVGm8>mZ|=}6KH1+{tr{A`t8*#6a$p;Gsj;2yN>2;x zknm)kgs(597&4)IaD)K1kg0h!HSPG8A~x++Me;A9{R2%?=QsEgX$L7rv^BCi)fma9 z^<`fH+aDT{C~H>R)R1qI*7gF?hOP-U)yjpj7)*Sp+bRpyqe-3mnI=4+S824UM?Wu7 zAE43*&8MhBRYnuT6&l%vsYp(XirvWOL~FUYQeo|Hy<9_K+P=<&it3h3V#^r#Tl480 zt0iQ3*r7bTJTxC&dN#sH`DmMFJ4umaX9U#i9ri05GizyTTg9R6jwDd#C2Gvr%{Fh= znlQ<$;TDB@b5)u7vC1glmbxZ{OhHQ}8c&J%aO>&qN07T&Y0x_P8lPmkR&h$PyPj$y zP&;UD+K6x3!_=Wfv>!g+_{y|C9mzp1%wjdOYMQL=?}qVgJ<S-}CKa+AmD`AEIuloC zo7({_>lC;vrE{%>_^Tl#PoCXkyC&(VdhV0mITh1gt&UJ^GNdJEQXIEh2~jCf%SHzk z+7y_1Hd7i><a&jOjycy1)LjK>L|-qKdYyyOJ7wEAwsL(v3v(1I<=)DhH=M?lA7h>< zsY&<ygu6}2Uy4m3TW7{1nMN-vjSu<+h4L_SF-GXmkCX+YLCWq*jR+Q66_jaTT#@FR zZ6omXzA1e*#Ds8vtgQofX*9}$Fxf0~AZgNeEY6glXZ4ygecYC*u|dqwU-S#CyBEmz zaM9MCb!}zSYxh{F^_qO?T^+=fd@(jN4^IjWQf=~OFUcOtDJse@KtCz(r3>4t_i7QP z?Jl1vg1g<vsJl`{)^+7cO+2Bb1fw@3RqxrL?qZKw6SWf(V{8VzN!U=!KA-ry+4y`W zXE3A!LbJ7!?TEQ#TQ>)7X@``g(s#m^wzbccG&{(WdGj9=$3_wUO!_hQd{(h3vcaTY z3L<Q%*dqHd9NcX92({vfMsI2+vO~9X`XAYhyJBzJYV^R!E?3!7?Pcc^u>2YRP#Hz0 zdG@lo_4JaLU(*$RZGY%01E~l#QSI0DT6iCNE`2G?mgd9Z{Af@R(9*<z4)sm)#zi(J zx;IyNRA*1xDBY4X`oD~6FWZ-wo;@~Y5;1qFOh_w6&av38TpKlM4_?!=h5VXzbPZ-x zWM$8%**2vYT`3&bl#n?6!oXLp%w1S^$L%KPPx_lN8aI`_d!{X@H#<d#Wi8W*QDvqo z3jJCgiC)~~skS8<*(@!DMmArx0sR{bP2GR*AGa96lyUL^b&r7i#`el$BbyrQ8k!d~ z<vfXKNQc%oLef3kABjoCiO9(mGn1)K`(1x7m@zkV`UtMJKJ_Tw>^=41&Lx?mlo09b z(o~8o<3=q1%e1%CiiK9|t7J|2m9opM&^%>ZgVD`qI9-hgwo|%Oc;Q2$7CG%}e>L6~ zL3m`YfIDrD(#DtMu>sUhdjDlhz^~j)S2n^L`?lRZV1GytZ%hiipXk4TXo|fI{bP)P z$Zo)NK|H}ov6&80H&BMEHVd0SSkuC{u*q=J)P%Aa)x=CH8oH@RC3#hB-1qq0-5NFh zM+VXsG7&s|WgBb6B&$0&Xf4XLqFf!fZgrKk*atRtYlFGbyK4}>=ei<iL|2kt_WFdW z=EzZ))ksg4va^gvI!+EWgz@?b^ZW7PmXgnUo>34ZBAPkt%ig9q85?y_HJVv48#ZOE zwa0N5Z&x#qU6j+Kh#isnnK>L)l9QRk$;G2GnaT34392ZJ8KA`(nrPaH5iCfV$L=d# z0zo6&dTg``Fnz*TwiVbuGqgOc;a3Hdh45@)xWXh4kvo*^I(M1Ish!9>#k!2$om&!7 zSj9oL-0(uHW|N+d(znc;gab&ZOZVTlxkk^VnPK=0Y;E;}Oo5qxsSJ6wA{cFbsSnah zk~`XG>y)X7i0<6PSeA^MU#iNA)n4qAAFyp*R!nGcXc}@`SJ2$ilWgS={WWDO!!+Bn zCV)DcW-GNHy`&Pk@KR8aXX0>Ybo*xW0!c{$i`gMFP1g8wU*U(kc%`V+;;wDWN8Pl$ z=BYxSj58(fb<iqDHOjIVEKHJC_#PT54~nnU{E_X$XWQa*r|hIGv{iy8l9)4e{K#Zh z=<Ni%dMJ0O=US{G)oc{ll*krsl!&^cNIh>Ff7HOiRGw0Ye0ipi(s7zQ?HXEsF>y+k z)Z+wm3x<v#VSXDq!ZE^Bmf2=Hwo+D}-J#M(F$RZmx{^CRQK&ZnayU6ywb|EI5q35y z#jgEIJw(s`bG917dVt8v!MK<f{r7D9Y4x9-CwI?%J^tj}4V^yubNkj&!(Tp>@LSgR zzkR~F5uAHKxZP>3$A2@oQ^kP?X3yEPWkq0D(z-i3v@JjD<9$~ypD}gSI?muS;XePR z_ItUDw`Z=rXx*%;pVt_$=&rl2+>(CU=d*7(`>Tf8Gx~Doh6#7<&8`_A@8~qP_kB}7 z>e?!??OT8C?Qmhj#ka3tw|?VIe@=d$vv^2gT+Dmde180w@`oxt|Id^i`w#v8aE~t@ z%vy8iO*dbdkpAQSw`6c=fKF|Xi`lxQ@fW`io!Iz;yDCkov$xOlb3V?#{iU~;9e*z2 z`te!k=)CS{Ot{`LRn8td>C6V-e^R0Ci))|$Y0!vs{w`>LWW&+NCbW67O$i%FPMUB_ zs+>IS%bAT{?R;s|;<}G7s25l7yV2K;Uf$r{-_!n1>euyG&fhMt=T6<(dcuwg`DeCh z-@e7A&Fk)ZVDOH2Hs&5#H@W6b?-$;A|LL54V8RVrH0i=cO$&oXPv5-YXq_n!lzXB7 zwAGj0cH7iWeLK~^bn-uZcgKYL>w@I7Qa`Hr_6tK(nmjk@`WNr7+^tF6`(xhk{72P0 z=dO8oC}#_im$;a&b?@8q@yV-dwHo%)@F(j|IP~d>HkH1f@<FR<&0d^8q~6mUCUct! zxBH9ob)Rb7|NNhFF4^(YtTr{eoi(9B##MV4Kbv*m?8{o#p`1T9;eLz1?yX9<?me{i z?@!y+ob`I)KZR{;KQ#Y^+7~YB@Z2wVw&}^4M-}wk<bNBi%xyXSyPU6vuD!48(3Uf* z51sSz?0YIz`EAe}Ck|eSyxd^IeenM8_n!E)Pvgdq4EZaj{?wm`U9kV5j?FT%s(1Qf z#&-i3-p(0<CfuL}XG~aF;hEPrJbl*(J15rsd*$-nyT-MeHf=zsaSPgBS+dD|XNTve zzdQWLwD)h`n$`5TFaKTp+PYWHdAi$!D_`j~GV!bW$p^1!!I=-72N)M~#kn^f`D1tC z+*?!Ldgy|<dGEY_VphvFdp1At%Z`$1-|cR}p%OZGHZG>^ZMjP?S=s)%>Z|{ne#fN) z{(Y<9;VBCzT#|SoX?4uV4R_wb8D7j9#l_UQ@!Jj;e6a72OYU#Kv)RTif5mKn>!Kx} zwkdr3op$+EzqzbEOFSlAgKx$cw`yB|K&$85EZNt3P45FO9(tz1jN3n5e0P@>N4ig< zj5*tw_}*PSe9*Qoqv{2ATsOb)vJshmN>;=?k<;pf4Xrv=-k<a%<=lp|Z{lLcp0VuQ z?<?KAqv4v(7tJkBnfcu%^Pkyv`-5+E?$vD9@4vh{$($)kxN}xMdhmjR<MW@ITp|1P zH*2)mwsK8T*N3iJxbn1`XEdn)1AUs#8;pyItCsTGPrJvwx$?qAe_T5KhBs<Hd-3N# zzuB_UBeNTIUAz423pv}DBSqq3n)bi$^B0a6&O86;vQ@KxT=rS=?s<C$Tw3Y%7yfGX z@70?Q9^kAZ6YiZOjfQ<O>A8LX)@e5Nh6^e;{`1-Ua|gV?{p-wgk8B_P_tgu`8Ck@a z`@^vc9cMOPckHVx&v>xsL!aKaW$fOsXWVn`TjwwAcH+f(=b5vm2-kMvMKwR!yrthY zXKkNT{ODU5d)}J9ddI$jwca~%-<XmMYK#j6j&VL!T+G+=&-t*~?3drY;i(&^AAa)E zUhC^!d{%as8GR2Naf&<qe(jT-S<E3WaWS<g{JpmNv&}yLxzlZ*w*BzJgg0MqdhF17 zU#+~R_07GD>dafnnSUl++jVE1JLl_zfyehAKbHK$Ka*EZytdNo$6jeZ`|h)Df8+N* zIT)yNHN{tM#+X0;tkZ97`5i->9H?KTdF9XR&5GOe;4Sy9k2~kYs;YlcekR;oM-OaV z-sr$D7u7htZON|K&C54uHg5aqd5IUroZa*Ap@+ZV<Tn#8Fzd_7U*6qo+>IAk9i6eX z#T%9GK3Tux`rn+?p54xAIlbIXe4h&45f^iAlL;Lfo|(BRZ`)Z*vzDLz<*n6jSaayW z@g}cz?^<n6t^LWgHxq96zHiSycjNAhR;F!!X3VZ(v5Pi*{@v%#pE+?#oAGN}FF8v4 z_`-y1e&?C@o_=)3`)%X<K0l=W>is{@f3?S)F151$nVWR{kDr&##S*3s$HinU+A(g+ z{U1-MapjC#^K$llbg0qwKel=J%Hf;K)tdA7fCBoDWhUGg2|xU{?x~|=K7MXp(U>Rd z-+I$8aan28r=MurzgF#K2cOx+c|<1MJ^PBBxK)|+dmMT9wH^tb$4|N7y3<+@e&*SF z)pC2+Xjzf&YhZOfw`YsNIfdf~4q9HP-xG-wM}KxWdBW_cMon9EQ_i>3ubTJz!{~7n zZvG1wZ2hzQockM|{lm|jpFNbY_Tt|w#AO{@p1<+$Grk}9!xG+5=75>Fm|fFaPrf?v z-I4Mae7pbULEle)>z?{MRz0xgk;{u~om0Ex$9HfRwh7no>8zhVEI4cbOV_nN*{<ct zOD|iwHgjvycTSZL6Bc}PS>yhkb!Ni-ykzgZ?&&Q)D3_D;`^KHkFZj6b#|`GkG_HNx zXYVZhDQ5l~$f*gpvEZk<7v0#q-GmXD*REdFb;Q|6-<mdWNABBCwmp`+e_HXi$SGwQ z7gK5PABzX9-P8G{GY<vs`enze(;j%O!t|-{6~%p>Fy+scWB%ssN)vAG#=?Hn??1HR zvXxhU*nj)5&(@5JpSx??O|j>!s-N~!cIyY}w@kR^OV=gecF8w)4E}V}z2DaCdsn?W zNzRX-R@gpa>|-DPe$Iu{v0*6dxR~4DJMiYxOZr~@WwR^Bjr_e;^`g7JoB3OZ+je~W z;j}G->kj6y9ld807xVF+du}*;UA=i1boyh^wVSHnaN8R%Hyd^P<qNi^&wKTr$2K>n z-!kEjq<{Qa{{27qfA-Q_^17@#x!6hQJmEn6(d~75Ratq#Z5K4-*aUP@T+BZ^M&I__ zpiWoho%p3)xBE`C{@|14=XdJ4qi&rIPv%}!@oy$P_3}wv%=L8|UUK=Ni@FWoy{CJ} z3lsb7|LMZj^P6RT_vr8IwjEEZh77!I!Zm94Ui<5dAARMv$;C@w>;BaAx0kiJV9#q; zWz>H6>h0yT_KoLo2bM?UVwN}Ev$p&-6Bk~-ez$Yz@t-QysMY=AiOqkQa^9YqU*EH6 z=otD-6K>cWO;((Lto*C}%00B?mvxCxeK76a5kEGaRQ}sbuiY^E`p<dhJ`?WEKWDD| zFn8v2SHB$l_<^5qx_Hqew~X8H+u($`gInG3YvWrm4BIo<jEgC%kXNaBvz`whO-X#` z@VCL<HT#aPKl<yd4`gk<?v3x}JwjY_Ot^1GO=>hL>!BmB?Z3KG+K@xDo0JUdcyjpH zS6(u=|AV)FsP+BBCfv2zJ6|YHJvyy*yGqG{Z+14gqUP>JP2XCxvGQ|299(z7z3n*b zwYHx7)uM$b?|tlzhgt@Q4X+eCbI{s<A6eVK&dh#SRbTqtzn3&aUgn!{JHD?os!7xN z8((O??A)nOzc;hN?2|KBR_?gqgU6k=J8u7cJ?+<o+xx@qT}Ef0{@#^s_rKcYxsUqg z)*f6d^V6^X?SJji_~WsgX>S)}+sDOBd|}jIUAiv3KWleZvp1jl^Nae|7hXHO!|Gnk zk4=34=JeIG`R<1a_wdM(`I~;dcV>L~>-NpwKd5`Rf`_-aU7vLJQ-hjbvH9^UZow`w z;eP!0w-J38J$p;WiGu6f-#DoMwpHa{f4%FM6OvZFK5xL}VH-J9mmzjs%+R-=8TJ0` z$KKwx_T>ImhaVld@B3$#7rcIT!pX{=$28qF@M-j<3AeZZr4wGcyxCn-oReLDsP);` zzrNgS|K*cMKl9GPN%bqYUyMH8X2O*W%DB4fV=b?|qv<1`ciMW@kQ=MtQT_6thb`Hg zwej}vnteKlbEB{o<6>Gp@bT=Dch9I>_3S2R_xd37nYO)NI$p8wuyRh7ZO0y2+Ncd@ zPML6D-1o%%(U%O|d*`9~o9@~(@bGmn?0t0eoLw(n-fDccFY51mh%@O-xK3?<__B9} zt?^T1OMbgzZ{7plR?WCS_dw;Hxxc>s@Z!cVHsvf~+DKf?<S~t#I}gmReB1OF&(3Ny z_0Gcyvv<c<i+$wY*B*a;R;z2j=8P>9Ztsz;GuFgryjD>6#U=f(-+g^T-_C!O4F9Qi zqH{~bIT_7na{8PJS8rQJg*sQwnYN+x!qe{VKd9EH*NmT7dGNi1>R$22hNMCLhw#k$ zdhW@ootOWbmw#b$rCCpWFnaEyD^L7!?mLs~b?bXw-JkAwcz-5mb(wI-56qd~u-iXv z>)m`fX7SHM-#L`E?UqA#cIrHTb^aSSFIe1_@5h^PZ=~M!dqKsUKig2DWaETuj$HD^ zjR$+TI`{2e4-6_k@A$5-dU31+vxRXnAKr1%N1JQ*+rQxZ7D=6dX!Yf?rRnt+o;J1f z(b4q}bj@m>&N#({8@zqN!{aYLJ@EOgK|j}8*|FiyjeSn5*|T1}bJL04TaQiN!kLmL z+_64m7tT6V@>iei8kcq0T9~!2=Ci9FpL67bq2FAW5bXLm?M=((aWS8bncQ~vigSKD zbbG%p@#hTOF(vo)%U9ez{mQ&@wQkzA{i-y+AIu0oE@sfd>C=+te)8>#?|0w2XvzD} zO<mFQsY+Fj_Pp=DlqSs|ZHV2pz=Yd8{`k~I4`uhv@AJ$1*G}u`-1*KQEiaAlGH3iN z3y+-HapGRaW+vR~j0(R@?b~R|4Ue~6+bCh~&aWmmJ~s6KQ1>qIaaGm+_)a@1=`=6_ z3j`@JK#*Vy1X?hq1t$>TRDuR5P^CzqrKHf(*i0Zu3kj1##z~}Hs}xbG2-hNbDOVmT z@<^bNf)xu?Esv{3Q8P@vRs{`Lu)ptj?Z=#%IaB)5&;Oqfbk_Oqwbx#I?Y-B2pVR-) ztB1Y6?CEbbJ~#{MVnQAr*}L_KpM7h@-OoOG%0qiy@zNL1J8SuAHKj*YZ@Bo4|9ZIQ zxbI<3!6P~7XMS@3NsS*H_2Fy#U#V7}a?$Ez?)l}-Q$L(D>-_i$NB-=NKce4yTll^^ z=IJx8_|XquuMJ<-@#`g@zU#?1r#^q%ix<}3IpvDa|M`I5!55qe+eAn1GokdAzpS|G zslDI1X+rms_rJHt#8IamdC>3f{>>v>4;^)S*EGEAT=*8v{ld^^dtQC(txvu2=KTMD zuK(+E-v9WKKYZqo|8c>*&Zo}h*6CZq_x-ojWv4|~ZrZ1I>2oUelfya(j-2}amo9qf zmD}IH<-@10TY-0_9>R3h=O0+OZ@BT{tIm7rFHhWh*2Rtg`<01pM>g*{ey`T<8-{*~ zdBv^5_u3m9PCM)3zYR@&wSB}Rsr@(KfB(tvZ92L7wsm)1^!(!o9`QQ*E#W(1pF4)< zUvR*l^=ps%)ng+rcy`j1Z{M@umea>wdH;qPSM7iHQ+P*Wl<8)=*4=l<BL^J)^H(<Q z|LX&e*)Zw7cYb(Z&5?&cc=Og(;|{)V2>w*~-oNyy`M>?*#d}V8;bZT7``)`J|M<LL zKY8No|M|d`kA3r+^p)>TM7qNF*J+)%-!ygMkFGiS-Ivb$<b&t`_*>28FP!m*qy8s$ z@eiI^ehBPxEXKyskzd<#`~K&AXY6w~e(IoiI~q4We!|A_`yROFH*XDf-Z%QNJ>Epy zT`YXhOg`=4*ShNe`Q#^Fnz^z1@u~wGzw^um4_)__)O*i-{f}pidl2<X_%2y<*O(io zmG_tYFw!^lkD7hfop;Nn=bV4S)I;un?WJoTxdrXlL!TZU`S%q!rlzmF?V)|={CL#- z-mjlHad^(CJr*Udxb{DuTHf@;^}`qs3Eyikys>c9f@jXZVAAB*zxBZjAAI=L&!2Y5 zEpsP6TJgCT{&CoQXdiD1-#=SN{Nl!*Igg${^!=gUkDWB<|0=$GaB}VNIX{{dzxt(D zj(7ksf;yb(KKirYt~&CksrjXQH<#SC>FM5{-~9fi(f2<1-s9)o`Khz7zF<B4n($p6 zo%!4A#y@+{maD(_oBiMV_LqLYrK+#vPb)@0e)?b9C$D+@V!TUUVXg;Wb=pZYvHUHc z2%gD}>bbLI-MMvU95*j6zjh{ed1Nno<{X?<h~rwt%(++3n%6e_@+>e191HP9jboa3 zLR#y>Su-j2xS8^PsbgmC1{u4mM+@)0?Xo6((bZ0wB*4J4c$s|HgvF1)jPJ<UH6gYR z%vx~uoVi!boD*-B_X6ycP=Cpz0xej$o2(@Zf7msKcDu6(7RuTBoyuuJfjSlSYi)N^ z#^=Q6FPMF4%iP_gqiyfIN1Ds=tT}Vo+;>x!T|Lyq?$Ol=UC_dPr`;^HH9mXZ+{>KM zD{$u|%GZOnMyuOvPdsYog>$c-z2Mr`=vi~)tuv3SnTg$0akt0S98+`5ag%E%9d}I4 z%r-1_&x9nu*WCq4v#<vTi2+K@JbUh}g$r62%!x-YnA_TR>AdK9@wVA>7tB1q=J?}h zVux;i8%{u6H}itiX5yV+^IB(~eICf;CLJ?z@-Y)9o^ae`*IisQYatFx&Ygd`OJ$cj z9ao`H>*X}O6PvZe?o+<?(s@q)?ooRdE<B>t7al$TQX1Gv|5s>_3XPprIIvmQ`7`pb zNa`BAs$tH*HaGafE((9)+-$@AS7hYce@iM?|65XN{kNnN-$p7s<J*G0<nC+JExS`+ z<3TT(FPGa~Yu-J+VotoJwFT$-o!Eaxg};0o=Gc8kZ~wQXQjo~*DTh{lEUtBC>oqN{ zvv7R(Us@nI;Bw{sY!bVag*oxra;N8Cs_>=%BC}uG7GKZ|mmi?~4*M0`POr@yhV6)T z{Sy~?`SDIo6$>T>n6BV3UA9--5tRyrx#5wo&d#47V8Pwjw7<Md#qT%jJY1C6JvMb_ zz$kJ4Zk%^Gxjyq=F^{ip4KVQzSJGYRMEqtnO@3EbRPsE>?x~h@;?i<<ZcW3VN!<W< zX2oZ_+RU7*<8$U`3w8Ho-dAZ_@G7#agWBZ|R~nyZ!`S!=R}XiO%5&mWdN&L8+X3&S zp0i*#%a0$I+vNWh!zT12moD5*)`q@(gJE|1v`b}YmNDq6@U6h3b4{@$lKst1T=UMf zHop+PzPd9~3fip6WJ}v+Sh>!hOYcY~i%G`x{OH!UmKK~x-aWN*PJHJ}qCiPB%j;Tk z{dxDO=6ba`aoq8o<%Iq#+KqhMayQj<r*}*1rETp_?OiH<Cld>n3vx>=YmOau(s<R} z?)S~{yc)F&`q@q-Z%J*JED7~;z1r^4Z&u57mt^bDF36Pof;&}dd_IjkSi5=1>hB$c zC;vNK{cQ2J${mZH%5#7V+MSy>vWEeIJEfbiJdTsCA3OBT){fmb-Er&L<|A=CrE!5Z z<MFF;5qxfTn=Y&R4wp8DCUdhxs$CFds|_d3K8d^J6`X%X7bfTOcaQyiVrTottGgld zlJ`sWcw_hL%F7zNU22?fCfMy#n{hpIHw*Q-x~p*7VE0Jp6cgX6*<HeXt0%iu@#n<R z=<zB~r&qRa?mp*)X7I1xAkj(G95eUo-Ly3ZM}S*m*)DxYtnByvalZX%=fo7a<2mtp zvu5L^)vmC1M5zF2nEBu>^t(&i-1(PY!S;>6KjZ&0{69)H?A?qrayZI|Pd@SgwT22S zep^&y#~UiF&T-iJ4x8t&7Kd#Hg(LEazr|2tbp+1OY3WB9Dy)`+(tO`CR9LNY*uxHs zja0ZCNO|>!3aeKf_6vuFLzZtZLxok9!>S$j1SlMPhP-}5h1Fj`y&%}%3>8+xxZk4r zJ}^{RO&w*in4!XIj>E2W*u4(B&tY#k?AHz(i#sJcjY>m>)hP};)nO|fc8|l>qkwQk z9{Jc{sIZy^gKF#wLxt5+hb?p178tZb;=XIBu!=(wjkOyptX4Se9)}G&>?aP}<gm9L z)&fOvq#gRj4HZ^v9k$M4)kqY_!NE7dP+_&wVGlTLDTIAY_?8(etcD!6*<mpV!x3-D zt2b0w@#6<C3bxo#VRbfyX})s|6;>?{i#x2tVO<Ve>ab-FTj{U|95w^zJijgJ&NNh5 z^*d~h!)kFx`#Zun)lgxzFV0VE>;OZBRm@@a4y(X<X9z-m#~LcEUUJwg4jXnDzsbQE zVbzCok3W#OPZ%n!F2Z?Yja_1>u<CYLkHexk*L%Ojtuj<tZFJb14r_src|iE$h6<~D zLH$Iq`wSIU>u^?6^Q|{jSUrHVr9TwDRfY<y+oBfxx}n1AyAHe8VNW=$-(edLRk&J9 zTWvH{SbcDq#qfnE2@R{Uh8m+P9oA5#@R|(9Z8TI^-3n@*U|%y-Shan^@?B@Bu=>8k z?swQ99F}p|7ml=Xzi6niy3%1+JM7C2yTM^!aoATKc8|kWI&AuQrT$BFo?)o4N`d;R zV7D47tg0tiz6pjx{c~8o!?qlayF?QAT|<S{(Z?vYUa;c~1-}OBCBaTL6uvhM>SuyY zH&j^t0hE@PF;rMhIM!k{h6<}?4qNW9)ed{oVJ|rBrw)6~VgKW>w8Q@Bu=gGIp~J@3 zSY0X&6;=%saUV_c(P*f!`frCl>acYVTko*?NlHB=aXmwY)t5oNEZ7Z(3ai6UuzW`v zDy%;1uyY-DgTroe*k*@qaoB+;T6u>U3f}~E*bIl2pQP~i1lIcsLxt6g4tvRAWm7C) zxuL>pJt#DA#NA-1u=?0krCt$ie?x`U?2|2Dv!TMO{L{F*tkX3V`Z9+tbJ!3l9DPR` zn++9KZ^kUP$xvbStvY_AoO~+`6;{6i^{QaMH&j^NcdF(4p`p;Po@TKt42AKF!@lJ( zbvn*oi@cDb(62hI-C-L*9V&bq4TZk(42!KZ6#VX)`rGhhRF9$120e?_8w!3L)ZrrU z2}7Yy;_iUP8Vwaz_c&~&!!|f<qr*P<jKT*wX)AS>rcjoKLRmU&MFZ}q3g113LRp?| zv1UVs)ws_pRV{o`LqVRyHaM*IbNq-f)17K4@HuRQ!#;4BYSb~psteS3iQ8?cu-fdf zEe>lq2X}vjuhCHGlO49kVbODOcR={63<aO#u;mVW7gUY#4I7HzQMcH1Lt$(S>Nw$h z*ii7X(=9f^P$+Xy#|vMNq0rtyZ4m4wLxt7PL5(P(tzI(}d?%<9!7_#ltM@@E!9Fxp zSdBR!_i{vD#86>%5U76&cBrAk>R3=83O3PDVO0m}1Hn!=R9Kw{>K}q#XsEEd9Mt~_ zHrG&LbuFm(1-sr*VU+|mELg9h!s<>?e;4d7Lxt53LH$jzhYS@~PlI|-uxAa0`U2`* z!8RBwtlk3kSHXT~D2(|*{Y9|987izsUZCekW7Hmo!dL**7U8Qj6y`Ia{v_B@h6<|_ zLH(~_CmAZN&II*G!Ok*NSj_;nS+JRg3ah!GGJ?%F6#4*A?+A8-q0mo*N(*+Yq2Sj* z4GFfwP_PxKKM3}ap~C7ZP`?-K8AFBD&p`c7uvZNgR+~V*E!f+J3adYZ`mJE^87izs zT&UD<1RG^2_;yfl3AVqXFb4y*Nw8`|h1Ch5el6H!Lxt5DpnfITXABiq7lQg9!7egX zST%!sQ?Pl4!uTH48-gu1R9Jll)a!zM)ljHcpk5Q~E<<6A32LKYs|*!ZPlEcTU;~E2 zm>SeC1bf9$VfAZJKNsw`h6<}kX4v+-+ED0c9QJ#MMLuu&K4z$}`jo?_IBd4VnjJRb zQrs_>bZZQSdf>1X4*LKUIx+h3%QS`j8fuJM<**5}lzK$VGZgCDY>VA$sIYp%Vf_w! z%VEEB*q<Htp2JEmxAIC26;^vYY+r{R>aZgmcAUdba9EwgPIuT$hc!9u;W<h@DtYTO zR9JoK3X8QFDy+Wdu-hH>fWuZfY*MpQkBPimLxt4>P@xjqxz$i%)d6axU|og^tApp- zxQ7`ktUQM`IBeyWO7%$^4;U(}qE}h0%21dmgIcZm3>8+B=2@)PP+=9CuhiqhS7xZN z`h~+@cUa}smT#P)px*+e>LqT2q0kS4DwVt~H&j^N)MEK=HWd0ThrQ&mw;eX*u-OY0 zhfc6xv!TN3QBb2KjmHfId99Z3B}2i-#w~W1p~C86hxIvZlf&M2*cOMq>oC=3<%J9t zR+SDL=dh-0@$w|mdA6a@wm|J6I<GPm{As)8d)rW0GrG=VR~icS&tbPa?0XLTzQcax zu*V$stiuK!_NK!&Ic&rA_{fRqywOnT_ZMM3P;@@jP+|4O#g^|fLxt7V4qNE3Zin?a ztma1CeUvmN846=thplti9~_o(nCh@`Lx#e52-J@i>qd{E!s<CtqebTz426ClRE1z0 z426ClR79}f84CSAsJ#UHo1xI}cVg{OussZgejil1V3meKzYl7RU`H7W{XVF$U?&+0 zbrRIxf}Lfku-fA$n~yPu3akAccA&$Kbl7-@#T-`eu$C^oJ4w+laYKdG7Kgp-u%;zS zJt2Iv4HZ_0-fS`6TxTfe6%MO+Sfj(HJFLlJvmMs%utg4w-GX;0NV@fg3ag8|Eq1A) z!m8b2iyXE-DH9LmZG)lU558it#|;%$H>NC>Fcii<4tvO9zi`;=4*R{s-f`I99QJ<> z8`Wde2pcM__H)?B9rg)_ebQkkI_xBeo#C+0IP3z4eZgUK9CoF{u5s9x9d@(BzT&WN zIP9AaTjj8a9oD#1sRk*d>4plcC7||^x|=jqSlx1)<x3d~{fEO|ci0CGQ~#l3U><KM ztRFaRoWr6Ho8Yh-hfQ@@%wY`<YjoI5hc!8Dp2J!kw#Z=}4(oB)QipxZVJjT=fWuZf z><NeUJ8Yf9);sJ?hi!7$W`}KYSm<lk&Si$enCt6!M}d@4zoFo-zJaxHDWg3M6;@xr z-SXXGDD0Cs>=zFEhr_ly?6~DN?g@s%I<UhoaoAN3Ti~$k9d@I`QVzS-VRt(0E{EOk zum>IXV~0KMu%9^WXAXPAVZU}*#$kVQ*gqV$)nQ}qu=$M`Dy$B4*dY!Z@33PXHpO9| zcGy`C`<%lra@ZvfyUJk;9Cp3KZgg16VYfQ$PKVv)u=^eMpu>Lbu%{jN6NmlGVQ)KZ z$YDL-QR+#lYfBA<wGmKbrLL_p6y{cUS-!6tDy)9wu*V$szYhD0!;V^E;~s6OusYXa z7dY%jhb0_#pTmCWus0m`YlmeV_9ut^!(m$;Hs-rlmx!TI4;*%g!zMYb)?w?ur_@u5 z{qK51VeEa6#cB<Ou`;Nqg>Si`u>Nwd#Uh46x(++UVdEWktiz@_?9&cA%VD2$*ldS2 zJ1q2{O7)8_Wrhl?I~?|Hhdu1DK8IC(U#S6!TWu)p_c-iLhc&OnJ86V(o}sYr2x{LF z+G?et!m9p0%jX#i>qx7VsvSYT3k?-k(;ilM7ca514HZ^X9>IGq1pBn1!s-%G69k)O zD9ph?9W7Xwp)mHwWN@NjR~ica8>mTwr3{6+6{r&gd%#fGqXKoJVCxNqy@|(^`mA6z zhQfRc&vVqi``$Ea!G0h9;=t3FjoWfS)mJ|K1>!sY8Vw#$o7sNiq?z)fR`)iIV_Ifk zrtr4CWJ6Wig<fKFjhCvgih0TUs;H(?v05)ttKw6<R6|vC2x%*ZR(pv>Rn;m!Hp`VN zBVE0<u_B8Nl3#g=H8qz!yUzFLC8t+axI`Nnp^0K^nM$ooCFZ53S2Z&f0c8S%sRl{c zsQ8EsG+R^^Q*lwc$%Cqc(3>fqKJf*SRG+FtJ|Hr6&NxUA#kMw<L0}D(YII6DRhqos zMO9J0_+9l;-@o3^=q-%cB33~P)l7kK)*O%~I-N^Kq$oC;!G{@MDIK4%d#TY4z4cX| zms;<olITbPLzAr)G^p6KZEu|tt&RjdFIfhT>eR58TIcod%Y?-WsX?gU<kVkRkMfJw zLrkULvYneZF%8L44JenRo~kVjNOe^W^B3`;Gyf^wXr5zyjxmH>oZ2Pz4<9*0^6)Ib zcot!J)<Pj?kZZ+~Imqo;YGgLnttv5@VCEWKF&jf6v6_kfOZwZM*UEsW#!GhdjE4cV zC~XHX<>?xsO`Ggo;o}n;@}!2;s<vai-aVm(HeN$-De1>~1ZDLYize2NL4@jbXpikn zPK|^?*%rO4`j7TfB0e#-WW=I!e_E2CjiREhzPhC2rRi^uDk9;4dKi@^Wc800i2F(6 z2?<q;OVbxXhG9Np>sF<f^xqJe*9FWgc(nx*Yez|5D}iX!;<1So{%NR+rIO9yPkI#s z4aS&FVQfmp%J$ql%!h`mrevM8C@=D8Y{HWM_{W4B9Er6de|XeO^ld`n7;ixtk;jJ+ zH7i1rMZ1`W`s-C{MFwM0m#mj)uT+sPZ4+rhF}RO<?Hdp|hInkDXhhB6`voFCUtiT; zLP^b$r(l*y*Gho)nQ6B~o*F%6pbdV3F}L<>35;MKnlr7IKQSDQ@0oo#x-B9Pj`1@h z1PM7tNXLU=bmB9IQY}$~45;gSF{Wg{8Cj2JO4Hufty?3Hf(<6s1z>7`grhyOVJ7;d ziN*JI(PMBaVjpL~M0-@V)sVr1{i4?V%sWjT6?p|Ih`_;ExwSo_!q3~XEl;e4QKjI@ zeUeXi?OF=Qi%Mlj1`a3^(B>03!Y{CCFjj4oZt@0WHTEHv>bM7$a$p!5OZwt9fUe9z zXHqMm4*)G?i^xWRl_h9ZVbE;Jb>y*FGmE5e2yI(ZnUkz*mLPeGJT`6ioTPVU4l)zS zJQw|{{_;CkqkX8qzi$OxtplHqfq>$Xr>8-{bQ0&z8~@^zfyD<|2H=`u-uQvs*gD{` zX-!D1#p_*G)rBMoYD2Rz>;B{8sU8Uv``fG|7cH5xY|mvXTodwhH3Tkn`SE}p10<e< z)Bw4L2x?4Mm2_Lu+eNxI!jcTAMGK5EaIL6inDD$3&wVhanu7<7yi^}z$ODExYOt$n z6@Kta{5Evh4ZWIw;w$W9v?Q-mGUD<VKOCu5AAw?3Cu6{jdg-1M!+XG|o&otbqkZt? zE@2Oet;aL}s4}XE>DAcf!K3o0B+_+L_Gv`?AcK#LbTQlJDHK0Gjgg>L|J2Xb*G=qa z2AQX<?urIslIiX&^XaG7*X7tC%O5MV5i(yemN|{w^qhs#>HoC&%ml-Y>wNQ^v2%5y zf7IL_G9h+|ADn0N9>JZxY1p7~N9USNP$)a}kWrl*KQ-!_g93xs$4E-Gm8K6s_o1s# zszYiIi&Fz`ydiEXn&{iY+_r^LgfZ3>skJc>MnIx(*fG>QhI%qU-}=dj7O%AZ`<smB z>-VKEzFjA51aVkPRZ~kTmkp{~44~1$4oMASB<co12RlSZ%4TcLVV7P`LO8%gHqkKT zAMsgP(Y2l)7>n394NqfPZu($~l|h(J{B_G!C@NM_$b~-CpBKuiEaXDQ^SPqATqu{N z9WZn*V~sc1LDcbzX~^3i$V;@4w<VC5Xd!Q7ATQBE-Wh?sME$(ebsdD#-AxE`<;YwR zD9kZYzXX<XYH3X%FVRBY+CW~Sg}kvqUZRD((Li3Jg}l{)yhICmRUj|XTwadwR<dEn z_megPv+yz3gi%`uHH#hI`KMuShUolBjLePbUf>+1p~^oU9DEb7(@@Vh%mBBU7=Xb} z%#NfkC@w_7{LeK_@OEs0-VCk9c&K_}KPFbOJnyz{ozVx;E09&jFr%poE5Hm}3S#Ok zx%@Qh*%(JxZZ-xlLdBZ0IUI~hoe)DkADdcY=NY1Bbg;f8#t&myR0d>%F7=@@suGl= z8OuA8ITe&kzZR9@x}XW)oTN06ca%d98l9D}heK%_ueZKxlGn?OP1GY9Z(<#1xs#C3 zNdrS+C^2c`+SCAl2hw9F4lqozOC;%uL86KFCbf91hGR{C-zaG$>zXqA3&!9!8HGj% zV@>=1^rAf`_6PM?0X58Do=CbPzu2;~=nF3NIybMBJaJ**Fn_`IRP{5!jaFjf^Q%4d zUd;$l_>HqwkfWc!=!3h>v;3Owud8aQAGK|1x-FigveV0w;OV86ThQ!Gz+i_oPo%;H zi1_0%NzeIyn4lTGbzHR_ZgZ1jchn=pupuxju*8K0gRGHkeJDu`jeE4}z3m~d_aTnY zW$EOv_v8eplB*Ds^rR?Vq*Rh4cbTnN^*ijmJt_r^sfUNzoHm&>{FrBzYDi6sW$8L} zv|3p&bxw_knpZ2UDq7{XX<8lR0ggf@|7>e${KoQln4wclAq9!u$m$x;2g{J_xC}oN z!y_U~IM1{O<MI;=SVlOeN+jCLMn!I31+G41l`92kt3ARJc{Eg#7!E~xv2Wu-(K>Bt zeaVP{O_i&4v=`8rmzih{;SmFGRg4+1L6DdeRF(~bZoZ%~Xo=cJQ|ijv4sOr|xXg^S zbzROa>c|rAT{|nGX*PSkeJo|K_e&vvNvC2VnQUk&$vUxSGrV>VDswZS<=KgujnE_| zl!{dp2FctEwFaqUePFUT_68I-Dqku#wp4YP37(dNiH=Op5LOuwCeyU$L_3x<Ph_t8 zVS4D8SR12d_#`VDwl*@m$!_V$Y>T!Q6g%nFhB%f2WRcRgCRULkH`KXiB~rNLi#ZFS zrpL?r8!o~|nLlK*5gitKEuEM^W<D(AMm-`#R{^OgBpm}$^J7FAo)e>*2(?BUjvHAN zNy7OX^ny{JQ*3bSi#ZFoQKmYusbUPq-DobA)B-xw4~DAbfsNv-e)N*%RbFp>$riRd zJn^5&p{mF&cZw!tZU8iXt(O|`28Ki49p3n7yqAYv+>sK3$YqRNmQqNSamvQjg@BF& zSc%d9xVA$X?nzK;T3J%q?PGb;3uR8TtgW(!Q|2Y0UNTgbk(C%c4&f2{r7yrbj0iJ} z*pzFR!g8&%Ze0=k#2CL3Lj<WrkZLDI2irNy^=M2v>vHLLU=fsslu;&(_|;qc5wn`2 zqN!Lla#<ZoJOeI<!9eh;=+eEBby4bFL%tdyO_R&8ME<mXjD-+w#$s7rZYF<?7$<X` z2`*>w4LQLT$+FBBB-rqW&~Wv-1k#ue3Fnrjrd5o8(L99ek?@TA@z2zy)}xZt)~EVY zF9WJgtu+-GsgC4|A=*{4Bz+jnTV%9Fd*&@=CpL>M%^0b3QPm8t?OcN%KYi~u4c5^N z3)5zcZ}4V`8ELFkvV~qO6&lbsll6@Fh1N?W1j<I93YAzd3uJm#W8|swFqRCDm0+E# zDaf>TrZa>k8-$glQ7od&9_cH#l~=lefcEd&5PB7<_Ms|M>&vTjrLSP=6f}jg0LLQ3 z71xZG>}2-O>}#Rc(S6WlYbKN#A*OdtyujX_n`KCXt%I7?l`yaytoBr`(Dvq57p$V! zY;>EKhUWm$yV1uHV@6;lHi<<4EIu{ysR>UbJR0(v!)&|Y`qt_Z_(!aqSUUpDlhS|X zNEQWWdQwz!cB2EE%5sVcV0n1VK;$vDn-(O{lIY*ZTh5Yc@|+`aN$(>`Uwhn+2u=*| zgT?pRW*o!}>?PT;GGv%-l=FAuT=s)<`5m}}b31PXj~PhyQ~Aa`<r_T|a}yR=-h`ow z8Ir@1LPP!lF|4i_KzyVj+3#@}ljK0lmY6O-y@m%rKd@<p*3%j}w?tP2Dsrf(u4S-e zMsD^Z)XVt*5|F`k6j6~u%~hZBYEPfo|9FL9SjsluMJwnf>$p8QNnx1!oHTJA%T`c0 zzv2obJyg#wso`+i-An;kJJ#1o^Dk3@a6Z5(+i`-901Hgk$l?ZXmJQR*1*`2bPn=Cx zRR<z75&mMqxg6`3Z3kpi?U4YCJD5mjL}sb(msrI@QpITh8B+3*#694##R#FM7`eNs z(;Y&%;BdH>FI(J!e08CGMj43~v@i@q#|%iDYBt+I&Av^8W~eLOXmk1$IGk+u8mih& z-iWbE!EOzDk*=<fWlF7VnR$BbqYD&Ebr#nHBU|zY9n^aTGJe@$dCl+$Hk%YYCR>Um zeFL3<@fdbdxg`i!*tq&_R4Jb;+`@pAo={9&!_ognL9i9dUpKwuN;Ean{AQMe@uv^A zOP_mkof<g3TxN`U0G*9**Fed+!OzJD{vjcfsErhqT@U>g!t&QcBTKF~<ueT4L5WXI zwQ5*4)<whla?Fkpv4vFwb+CzyDCkPL>PZF+QF^L$R(1EvK_eEK(ONkX5$;~>yUEO~ z5rx{Q;-gVAjp;j)+vmHgUPAIE_+3Xes0D?kIy{8Jv~SC1r3TSD8-dc|L%Hw_18>QN zn+!Z`V6D2W?^4K8$%!r?tOy}P0GAsuYZ*HsAD^9&j|!TQqhuaNWd4c6;Da~}64{K& z&_uH?u7ianlopb9i-md-!o4?a)FWn!Wy&_gk(z;wUoOim4^$3iq8a}Z`K0<w<cm^Q zBh_o?c##`k%&!b>PmnuX^en5!GM3(O-uVMBHORu=$m~p9r`-%T2Jl$eme{1S=M#MM zhtAEqO0Z!Kp?rJ|OO?@1{)R=_)J{U+lrga2KY2||@SOG)V3pFKB7^8kB%0V%!M);c z7#W4Q7K!pt3Xu;|h$O&X0d|xJpIWEmnFNgz1wI(+WW2z{qlOo(Wndl2Ww7-HMX@H+ zgR$*o(>-R(M9vumHAjvQwzDl_B<r!7p&_ENL2Xnu{-}64bR(7SM|u1^Tcj>H*@SV; z5m-)J+<^j#BtArTf(>okS6<%R4o88oaSh>r?i%A!7wIx7(q!l>nf-R4m|OCA6H_}& zaJ;8iS862A#*>NU0a=x$mMzm&<mJ?h4Nym#8~g-oSbZvVQ|jgXY7<$~0(YMN^*?29 zRjk=cTgo<Dw!*w-n{BVznTf1~mSN3TcZJ8GYWiAilmR&{b{JZ+#Y%{7vF1Tm^R**K z9oxW~N5(!7*#<qtCyS<Bo7RrocBSZ`V98;yLQotD^0$q@HY%2s&`4{b-9ijqUGK4; zEQ$6;)#j!g1ygYj2h*qe7P)<Hzhu$JP!JTGUj%J0+hqJ*`bOx4CZ)S{KJd>nVoO0b z8r#^Vzv<`X1OK2nN#ulavt4>8WacZNyL7~;g?2~q7$MGK>}{SCYe&Lh4B<v_HGWn6 z80|_?!T6k-HZIxy0q{IDn(Sr{G6xGj*g+QN$vjH#@DF<n_&^AnlkEH^IC22aMyw{A zN-#q{&^?X76Z5~xpMO5^54s8&52JkFCP${sP%84MhPrjv<pfeZ1rGTI^1%ocQUq>x z0!fKL5)e2bl@N|7@+cMv@zC8p3=YXNA%=H%zb}xk+}Mej7jIi&w168)Y(g8)dTmsy zT52r9WVy!GNj;8|H411gDR;;+1>!{6{%O?)NM<py?&vm$h5BCjGy-f0GP;_9(bWvj zfw-SznnsDy$yN!P@{ca(q$KAgkn^9KJW-E=A(&Ave+Xva{2`cun^;%bT60HcxjtVT zBggGG^!A94;Q5dlP|meG=g84cZGOK7_lkVc1z@5h1=qn6GnK=G40gI6WGb;RMmB$T zE7|DO39^L<li#e3tZ?FDB(2DjY9wV#A=S}`L=u~jrY@#rCxN_R9*gq_=N3q$>#M#f zc3%;?v@_E^a+YQY9Qs6)kyBTT5Pz@bQmBhDb;f08b*9@Za&s%85Fok5=`$PS`B-^L zdK^55%>brzSdYTej#ec<LBh#8_L%u0tfI*}j7)58mF-r@&$<B&xZ?F>5dRMu{7of0 z(7#{~j(^7wm|X;&%($#D7=;SKV|mjvlMt0hjD~zRGBE-|v|`h(EYobWPVqQ~u%Tg& z{_(_c<zg`oW9hQiCm8*u+4+Q6nLe@YP&|x<YVt4^-m9DsZDCLxHmdk#Hes)HIi9^< z-P3z!u@rT@418pg9C{T);KH-cF>Sp}63B9l%i|b_v{<e>)v2W7m*l3(W2Ov%EU5u* zrPibxs~BloLN;BOU~C)$89S@gILKqyf_A{Oi*$4B+&Q4;%itJwDRY5})F%<`uRi+J zFPMz_*tvjfZ5Cnw0%RQ!>pqc2#2sgfEV+fEkpx9Yo{o(G_bQN?DqtkGt~CgmB&|fh z9JwM5W06PQP!D71WHpmLO8^UyFIj?cDq)4BywDKhi4}yQE|mGIPe$?Lvr;riLGdvG zaqzB!bW5^&H64L`gjP%OGahpYR}A#?JvwYzepnqmkZZ*hko2%1?-24QJx&62F|uh^ zy6{G{JYD~WbdGJC?h(I?b)EHM2n~a^iQ>990%VcVC$lOf43lo|9TJBlvG{zZ<VRC6 zI1aa@poLEZG}=pI@d4u4Y-aEmXTcen7>{>=6w?igbicBL9aM*ZREh4KHP!3Q_4MdC zW)uvb^^|v*$z{jRWvK1}TY9n|6tJk?frRx5kV;U#;j^?0sI7msv&X6->L*sr*!Qmh zKNeDWIC3pJw)U;?<yn4lBFS#Qn86Ol;h$q1l=F9fXs~0Iu;ehU%!8iqpkH-jp687i z|0B;Ds=B_t2-?H>dLMg;AsD_?q0g*R@ynrjmEAta=!C1kb$vW8yX|;K+le%Wsxp)+ zcF;ckGq?%bC@}fb^eP1N1jKBwcX|~%og!>Wutgrjfx?qZI^Z^IwjuG0V5NOo0GQVx zud^|!GbN)9he3fk79c0G=h{c?r&$fWkuq|S;!Ac)VHy!w)SaE|UO^K%p)`L9_M>Lo z=y_%?O|Jz<W*&1|W%(#V_!!BTkd#c@1n%BJo~=<!wGM&y8Ii$8x@IiY&Pg{HT#SR! z71JbagQTG{1k*eG>!SLNQCFd>j%SmMJSx=>gZmRKgyUvbUCJ@JG+D{kd083$39DdG z+wNS`fw+0|V6z;Yvp<JrD=@MZ*Q~Aq<!i<4q^Oksbr)Z1vREw2MSR{<sz+4Ej7+hK z(LMf3WY}$aFyj!4mY8j;rV3||f$Md0FxSIc^&I&BP=+pDav1#N5gn+-BQh~7DJ89b zq?9-Y!bmaMxeDp)y5dXQiTfhNWx8$rL?5|}T&p=6;#Om4OqT;EoKP#x!(tGR%oK=k zo5=j2HR^1pmQpzR%tbKNS21X^b0q?725tArpzXIzTO{(B-zZ^Q5*exd6sC>C$|$Lh zlvGXgSRbH1j2$b>7G*KprZ45n%&*MkM?~A>(Ah&nI{g)rf8F-%o}b;7vX#qdm(!GT zV;k*l%aBJ59Ict<l3H%c*d)WIO*SRb18WWx5lOs<f9>87ibt!bk1<^ySz>#2NiNYp z+MA-~w9dD2#KVawIr?;Y+j%wwr<?rJ+S?}E5Z{3)9+$ej?GPIh%8fG%8;3WE*{p%k zOKNg!qpSD4MTB;MUL=4^mWRYjDH)<t)%1H<N%JqT*!^kF%L^-ct*>;mKJ6n5B1qNk zC>}92EVqLBmZLKbss6{MH#PRuo)9I<hQpyUe^vZc=07+#dsk~&9UJA(Sl7yS6Qko# zHl{X!fE74&CaGj8Wg|gZn;|8GEE1T0>qc!Vm#I{(ms(9CkIL1lsX5Q1;}bYaV@w&P z8LfqPPu`6(Rg-bUZMX_$a>ct`n#}YPTmb=|NpfM}^|;#ui*v4-0qaVk?=Be2nxjg1 zVqhxCBsdC(uXB#X^;GdQ*tu@)7dOZK&5v+xf0lCvx{B%^mL|x0sOLL4;*w#7RxQsN zbW3p~<D#1kAguL;KiehJI)rk^ic&Qa{UdD~jwC`DsM(h1>W8%bp&HnJ;VDG|FHH=O zT6k!Yz&Zp*689l_%aH3L@<ita=8Db>)S^G@6P@d0@<ita=8Db>)S~~20<c==I;lL- zd4aj2^8&SKvA!u6+Z1sR*cMe@_k^it8M5i&G?tfKR<#LwVShG?QEpGw8a&__mW|0% z`9SzcwyoSnH+4kwCc9ZpfH5MI*0n3iSkH$_RED>&W{X69uGGfI9SZUc;eQb?^-jhZ zbL#rO^qSt%*TP)gq}E#-qgI3-QiNIqo9C<GE%df8A~jnEh3b|?ZJ5-JoUCNSq;QLb zN$KQ;S#|TQgR29sfC_?KNM6zDVXh>=1sx25g2$y>kk7nvDW`@0`}!$8u7ovl64RA) zLsiri2~nH@XZhgI9+3d*d{o;68&}uA{J2E<=ZkA*qA^yaMD7iLqhIIdCb}{iDsxlc zH&kvhK2Cn!E-rW8X=3?J^iQQ9mjz;AI)>W_suTgsG~A2h39j~$aj;_uqA=o;vnLwa zT!3V6a_M9SV=Y*(5)GK@U@VS`=X(sHL&!eLkbP#vhs5To6-Oe!G&eM-3Y@!ZRdo&; z%%IO@Xz2=(*(2PN2gD2^3+Pw*!@>L$Ww4#3eN{io$xeYoK^xgL9}})mxmlyuL-${p z_r_R5X_6wTeHN+lz=l?Pn~EL2bBfvC$SAgw7T6BO9zo$Sdn_B=IWJ3W`X{r($8H`h zHFd<^Hb2uLsSep&G1)fT<f&<)$636u{wDPz&dTDZve;FOl4Bt!#t6<X)SD_v;r2oy zF3P&98l33lZYmr<d)tilI8vXwjhwl9<p|GSP;|m<=H-C9Uq2jrml2X5YY(Y5Tx<8$ zh5|XCaELKtqK}^YBjX*N7jHFc3XW~QfMMvOvg(hFz5p9{QPzI^$>|F|$mt6bd9q<D zjP4lF`l<XNtk5&URWDRxC|SmuhLr;>(D?F<Q+D5R(Oend16GTgo!rRHy*>~-G~z1J zT&tNxuWq)S-{+oMq{Y!1>1=p#QTq^VwgS$nY+kaH<?Y)2;Xx&zy?&bhPe{t_V|C01 z5Mg4-;|vs4vb!1oLTWcKWv|mXmS&*IZVxOro)`xx7IbU!;H4UtjX#qLxtD90sriMh z)o>GF6sIIl`+;T%|E%(`<$6BKIxsgT8(|zhk02%U2ofl}6Oohkkf_jO`C6=<n9ald zCwHiziv@{FER!hhL(MrxKt5~pG~cM<_B?o#hCA|LW)MPRd9bi0yITk&d2;cOG=qdT zM%0a}B(kIedLg`)nZ_T;sadkdkkTOdAPs^9#EgSTv;sawdcVRnaR`-9%x09&<^XDp zm@iD5B1x8sugpn~tqTaOW_+`>n;bj9sU*dqHXVo%XgP^b_!HImAgYnD6(Xfi;%nAO z?{C4(gft75^QAz1$MU<XJc+%`{PswS(qOPmw&Xh|zRjU87m>%7iP&xB1>Kv7XJ#zz zt4)}0o&uY)7>rF9?}cY3hUQKfPb?V|x`@Yu87kRk0AA$r7pxtm&*cIF0;wMgf>D#* z`i(#iB!9BIQp(7I!^mK=yTX8U44v&QL*Tp-7gcm0m}qZNi%$(07>rni8<LtQ)!5>1 zCNg~csSO;=9q)9u$MX}2Z$|?0Z6%;bP`!412CX=#2_EP+AtZ008*m;svAK~$)h0UH zC@K7-`*(U?>j(I@*PM$r2%N+lTh*wvKWF7Z%w|r-t1%GJ_k_&jXj~J*vS1CEl-$6n zL8;=IF{;_ufQ}@R2nA51uPDjYxcU;z!LYh(VC<Yhy4TxP!fuBlF$n>RwI+T4{29c^ zz1|y>Z65^Jrb1=OQ!%WOVLG-iz2y|>5ARH#TAscLgIuUPiRywEne@HbD!_i7n`@*s z^Ezui;`j#TF{y2(l;r92%+l~tXcB@Pz}Du$_I{?f6KhddaG26S1*9Mh>`-86z7Q_W z7cGd3-S8p&;rMnR^kj64WnhT{f*71otXF$@iA}>CNwXOUcvXLt&$g}T=7Hl42sbOG z*p+4|Pm55zUT&$@9W6`Im+YOWZ&aDrr5be=AUPf7FYqAOb;+VNqxEaD>#@q}^ztUG zyXh?=Vmc|rvC0uN(L{nQ!m{QJ#wsZv8DGO+{E7SIgZL2=%r%@0$w(qbCt{}OxK#(E z635^MM#qgTECN(O@z4w}84COO=GKRr(4Er%6!0hO!)3Xwv$w%YH>X9Q93(Ti0*3qO zm7Hl62^(81%)>4oFMNzH64!P(sqzxBDLVf{i=`27zT(<6yTBlZ9TC(VpM7omRT@4Z zr#m9(%dIU7(qGwrK?esV2-A*@Up=oi!=oAnh7VAOM=%QbC}rNI@ww@{KGdBN+a)I$ z+&|w4nl)V7YDzjBvG(@XO1vXWCz-8XaD2;5+wTdlqzRUFF&UAYWy@AtRKoJiofPD; zt>{+5YAG#vIPdVe-iQ~^l--D@Ps{clvi0seYK}X#yzd;NTNUx53Or>r8^`YT@wYHO zdQm#evB-wcVRqorf9h4b6b$bOYj5dyh;)_G1L4A8uXx$VUxwN_-BkMbA`+~+fJ9+N zOm)-AX%k{F4K5@wgMLc-Bn@3tA2=Eq$Lhl<n!OPPpPlQ<kYKG9M4{+Srh{2`e$%D% zn~rp5pyQj~dH|^DC?Oo3S|<C*srs&39*%xh`bx{L(~}syeh6;8`OA~>9T2^t=(PfN zrM6rXYgz&eD8GC@@=b^SKF!wnEi_0_DVdjsWJ~E&@VmLC^eZ4VS&g21vhiGlS)~Th zK@or%Yw@GaSSw~k<uh>*7D-%9e+~*`h)P}S-C!Ya7tS1+UI}q*CM)Du@7ApXjmG)} ze&}gI_8St6)B}Z3+gd5<pb*#_r9z$1aT&rgCtGpYRpAh0bqJ`;(^0%kt^rc`TbC*? z!<qB(19yyn=H+1%9f|cJjDON~@j<#S5<bc3!H6tg#38>9(`Q_?CiGZHhCkq>UTuf? zIhjSxxg1pbaAqNgeK9*G%7tG2_{n@M`%J^6n_wCA{G`?5sBI)rQ6E`Mg-Q@pgg*}s zaP|wQtbVKjX{?jwrvZik8wjPY{qox*Nw8_;*{)k`=grdZ8SrK;6Gj@Bnd2%Uf9q0X zZ-b$`ajV+Lq0K*bDO)j(V=h@QlNWaBd)E5pUgiLwQH>=IxzsY*(AAi}2Hu}rP#BG| z62c3h8Apc@OjlAZo++-cEc1GB!5H0M`T@Udpn-1#TemLP^->X}z-yZvCfNf3#oh0} z&;LF!BEMzJXbl?wf7Sm^gl^jZVogg=BYI6QJH1PvnDBdNdgj&J?U_-uJLQ@4{c&P* zlkP7oAkp=ga>y?0iBS_#=h{Qp@YRG^iWHAok00$Z>&0X8;6*z;SbgiEpz7HGJHU}D z@05zmdpZqO^~w64>da4AxvSB|x3iAvOLRqQF)vGH`<SMJKE~~@NLy)gy+o5+^g~K) zMo~B0L6c(VUW4i7GpJO$jj>@lpAUK}52wPt_9L8=iPZEGh`}sTGLsjGVOur0^_I)? zuu%+tPunIYwuwQ3TG%Gm%1i$-Epo7aKw@P!T5;I_lC+kUtbl;R<V^TrmxQ|%`wQdi zX;;3w+4v0KR{R<<O!4>(&&Fqt`6RVBKgV^x9Cr;cWBkhjtu{HJO(KIAJG01AOJ(lp z%0Q!o@^VN@%<gybrFWdt@vn$#Q>8GD&nB3fK2Vl5cos(?u_9>c>obpUQ{HDJUf~cy zUbi6s@W`vRDl_0=YMGTUFN*QduVwCLU=(@QI}`pWQRI%O(`ti%9igy&qqeapL7j%Y z+;&hf$o(s<mOFep3<w&_4AqAB-7KnVQf;4u32K;l;ff0fFg2}5Ar%xCbjJP-%Yidq z4(hAV*01u!0HH1!TAJxkKLasFtQ%;5SfGQfATmC#)nahl%6F~IV0+DsVU7Uv0TlbL zNkQr%Y?A197$~kBut8J5|6rY>ZcTNmPzPP`i^a0V;k3&ZqnWFtnf2&`69KQHlWB^S zNA_wSUmCO{1+qU1I=4XZ)_KKT&kzfzMo%tl#aqX+&&e`7V;PqpH*-UfZHx)C=CMV` zJldjbvSl`yZ=M-aC^fD7So1VlyZka&tzaw3{l&sc3q#XSveJU^s1j;#(nFTy?KNJC z%faXzhFB9tbl!{W%_Om?>0t`(eGA^))4|0Xn4@~}2{|vKVd9>95e+Rv4Q7Z2Sn<%~ zu~24Ja7LXz<~%?Ja~SoKp(@D4{~a4)Zq%c^H{50Q$E{Apz(4}CTd#N3M&x^SE&loI zJrn!02ivp!!d?-1Ok5!~t(=oA0c-ACtxW$3$?_J6iau!Jo1Xj5)8?hmmGRY_2jr$- z<o!x5Fn1Kp9I&t8@8U3!MpBtE7%Z;<fx>Qt9*y{gJ-VtofUyRknev}f=9tel2<rw7 zaynen^rIuUT!9nqEUW2ex}56j1OwLc2DWZu%Fq?IeL_aqD$XhuMFCeW#7i*s<bd|6 zi9DL*dGhYE^!|{Ckfjn0?|w_%4GMy2Z~jI(266)RO$jITIujH6ncHsr(}R}859QB@ z_;~(|jGvG>l^Lr^b@U)nFxO^ql}Ui57C@aBV3`HX%(Y{=0j&N|zcyKxz66T}L3&T! zLA_@}#hEHjy=Q8@XKKA?`t|1f<)HUer}s(=SiSjfZ{e_duQGs7@2SxH`*_Xf4wX|k z<e;1uAfA}Wy=EPo^{^P$U=%o{Y2wxIP$B9{EB;Av=;D`(Ag81x&QiwVxOF+qC2`Yx z8O3tSJI<GwX$i8aOLnP1scFp2>-bVZK^=)7;^JhFKeE!9H~5#OzlUh1xSOE|rq`@~ zt=HP}Br{xKi|ANB5S+JZE|pJ{LSCc}YiIQzj4Rn4i+6$fvPsshYkB@mgFHf({#dX+ z@jQJxAQPQKzLC#%itsgVB0W!;_8n2?W^5Mkh)vmdp(s9wXkt^hZF{Sfl{Bgf@K`Hf zpO>p@gn6lAR{rSBG5&U2`aYbv-;vCDI&%vV4JQa=I)`WhO~6(BB+~-q-N?q~y0V}d zcpPnc<|_d>xr_w}RuGCQ$>8NiVi?M|hAEXGe&ryRy%NUOlIUxc<nrso44^wzA1H3S zO?FM0HW|9)tRIe#ca`qYJ_(WOo37Iw@YUc-!H9<u1wCPU;?9fUp<asMD-H_X)<I4S zc^{1P4v|Nv)x&4~Sk6Ylgg6*gZ_PZJVsbO{2`7eI1-cpMWTpO8k4ju+l*n~a#of(H zD37KwX$PaN($PK~wPSVl0Uhmm6OC0S>xs8vsncPp+Ym{rBrJ9Mu2~9SgD6SY?WhuG zK#6jn5@+n1675vt2`sDZP@OpwO5B1-))Hr0C8ieE8BV=)$8<<=o#{H2%aYV%QlK8& z7#j5<B2@VR^~|UuSLt_68!q!w8=jCVw8}QLS*^9X+NTYnUDM_lMw`kV)rMynV4F?Y zrrx1kJg(!d<UtEJ+#J!mb0zzM(f$iY3uMCA){2i=V(<o^2#izQi3~$FqWuXjiy6*M zs(7?_bu>EXLOX548%%(46DCrwmps_j__20OsmJp2eU!5F**h8w-%!E$e@A20GS*x0 zZqhX5J8Y+G(q2o?A0YYNJ1m$Tg<@jp8=9p#IWR)o%T)YKBh`LVD_`u9&K_dUtXTb) zaCSyA7)Vd@$*u6oHSaIjez|%2zR6k#B``wZ9WJM@{yt2>V7$1#nCbfM(B+dG^~u%S zB0C^Anj<%JY+?N^-c+iSWf(t2^><IWQ?)fyMuTHy)r8+B%-^vM3Qhli`Dd0Wa(?{l z3Fdv*c)tjX7vrf~|L!#M9<WDWWIX`U?fMR>8G~XlO~&X=qz*+f%3R6z9zUc3)1Mh! z`e{VESPz2HG09_~ROg~AK-v5KZl_CLkJZglm>d*%9Sy;4eBh2A19D!E#hV87EjlFU z`xb6Zq8hcRCabo63l=8zR2Bd5{a4JfR$QN<<y#Xl0QZpJtb8t;_Vz91sH68GHh%Zc z8(9hI_?EO=qi3>n1sSojK_T*jC@W94gI7Uy?r=&DdQ3{w%H+*MHF&``HjE`muhnu! z#tl)%@?@cFL>>nxdzJ%(d>nd1bHGN*lF<^NZG_R<7jY~TMT{*|h{ExRGD~|YaTnT@ zum`?D$;y;|0owDUgGgP%die%mT2Aghv9RUij65sWB<5OAFCR55sD}oJIlIx7+2rz* zwqlWPCDTO;HToM>_dtQRGqS}Ht9V{sM<k;7s*C6KHNKz><x4d-*#eQSXd+#2@ewA` z#f^~m3hY4r#GuSI-j^$t8Czwn7C^9T-+&+fS=CZr%*WJ-&}>M(FJ!t2G0E|k86{$8 zH>g7BVwkH_<*_n4N$Q062m@s@xo8Y1lgLHcKx+!Nqf>*F)&g#~mDjnZ8;{v#OXqW3 zE9KWbIv`#*(n?UiM#|X`CZ^MIco64X^lqZP=%$xE#1bgt*(i+Js_kMLiLuZU<>+TK zs}BD0oo1h$1Ia5*c)}%>Trcs=`%Jhs+ADhpyhv6rFW$t@?4VqCuIWJ3oE2AWfL2xd zGHLc-YgS{SDVsyte}!z{CZ_LA1Uf)=hFFO?rLR$Ki)e=W$CXrncW;#p2$wev+z)R_ zm23RBQ79n0i6+6m?K8Wxh<IFnvKyU}aSbKAsR)v2SCO0du_@p~w2>w6(J4?Vy1wj9 zi+YG^=lzOWWSK&At+)41-~_m|p6m)&BEIMzSt2jo+J>k#A0cXm71eg;wlu2v2r=A~ zwAQ?sxnl*;E7MkeU_SK?gDjSpQ8@3_SOzL(7#2Zrp#&y}j%7N2^lqCyv!!?1r$=sC zf)MC1U9aBB3Srj(?S}V&)xxwm&84+@kzfI*Xi!Sy<?s?N;H5HrS#%C3!SpPQgP0F) zthM7~1ZJ@p5AtP$lhHkOAPIF1t{SmA;sk;IOl1w+0z)QyAzb#yx+rC62q$~-RG&G- z?q+czA@{lngWm`~Hjwata@YA55;;vT<~v>_Z)KfUfur2m8JKb7!39BObFnI_urPWg ze(dZ;cEh4(undLq`ay;G(Ma#_pf9&1qO9SKI4Ta&ofI9p^*IEA7mK1eC@xLIu)s61 z2xsA2vfPtwJR7fhU~7riZGGYFSuZr8EP<U{ab~LgD>#6(v~K*%4NQWABLqw<s|N>| zUp#x(D-Efc#4aj3Gd1>WXCm#>$3H{ogU>w#3uN3Gr;mU6^wf*>sb}y|TbFu4+^DWY zh*phsN8;}M+<qD&b7*?2+?mkXw#VL?SJ<jkdWJ;)zNq-Wyg?;eR4jCj`x+qUvHpRj zZ0x^5rjoX5TP!8M<8M%v=BmLKuEKfh^zYyT$v&d(D$737vTN^>3gJ328pg;_*ak?m z#PP^*K@`mz5JhA$O1jmgI5M(?mBfnJ!wSa-x{z9c2;5xGRYU8yExnx3QQIxFAhS;M z0!@nw)miW<7Rpy$QW0~^hF7qXBi06c7E>3S__;P1oe%7h4-_b~6Lxfp;g(Kt;S?wq z&ex+rF>OAdl?oL5=(6}|#k47Xso?cgxhDK*#R^PVygUnvvZ%#ATCtC|X+h~@n3bD3 zu_-HBz?8G_C;|KtXXf^<3*03}j(9CTJOn24?$`-0;^m&SI1dQp;#)qvNz{A|tgN5l zMw`(CRKro}ez{tDfNCAi4geqi;ahmXG>Lu?zY`qu1Ywq2{6_SINTL_Pklu{A6Bd?( znuMdf_&4(sXz*f0$O#wxH=pGzD(EYwMjl;@=c%u5qIW(Vt{Ddr_UvPl<H1UHWV2S? zSgtjJx<_Ur_$UvCUL|T#X?i}oZdjK?g-LeEJSlx4QJHS)V;5zx1h^(m9@{B<pU7x# zKyqv+jfx!+bO_ums=)-1JNz-pHIEI(Ad^C4D741xkl5c9bZ(B)<T5K~MBjkFM#`d; z(mZ|NNd`F>)Jq65ihj1Ms+MecsK&%;1DWwhTt|1efVT(?HqMG3#zUR1;uzP*%)1is z@yT|KTNtPoR~T`3;~~8leZ9RA#rK4gCv-zCrd6c;J(nH3j75~(v5QtO&GUymE6j-c zz^z`+!t`$gAPDCVFJAHDu5E{?4to;Dt(+n+77%l|%Uvv3<bYFL{>k}oKA;|I)M$Xk zbHb6{kw}aurTHW$-h1mqF)mdM1L%W|&A~|A=qH^TtzRy6to}TT#uS$1IPH_CBsv^> zam7WFso3}dh-LjkUiqWij<8naEzLlyaaAPH7I@>ePNgBmWe>{p7l#Zao_868a<mK@ zEsp*{3$zG$g(u`!#jgxVK`lBmn*s(~_O{tF9XJ1~#*<vm5UEItbxv9sug?+WpJ?=& zk;B&x>2l{)IDZVBMVF$0IMFy+|6-Y|8zV9|ZZk_px~v4-GN_<@Dj^!Vd}vH||6juq z^Z*MKt#8#3$hs<DiCkyyJL&u)L>j9-#@o3jij=c1AZL7@>kn3;3eX?atlk9KK7Y{9 zfSgr2?xC=7Bm^#?h7W5A(hI`o?;4xaN!Lnc2H;}YOOhxXRDQ6J#Sj0oGvL9lP|Sc* z3lN?D<8A!v58`lL0KLsx8>(Fh!?g>c$h+~7{sJ5s%1=V#bRncF#D$RZ*IC;b<{>Bf zje+vgdqI{>(7cLlE$}R)@1Cp&w!P(v+;0Rs|HN1DL3{-XSd}`$SMVv)JD(<oui%sQ z6|$_^YzkzUIYJ%K&v+v&`g7F79CR8QpodDSaay$tv8`7|BNAD8hGmLaW#GG`U_wSv zH_(`*v_B>lWXxXRfyNv_0F+=nI0V)hHgf)==}FO`<1?>t)KvuONlk%^W-M@%E%Km_ z<sl~w=Dg0o0J4_LA0a3#?GOyoQnCvG$*yu%HJ|V!Aspqx4~Rj&E*CyXxsWg^qg?p3 zc(SXvFg-I6d9X)9yjd^6&Qg=T-cUF1xiA76#5yLK`F^I(WErBErTB3{CcGOVfhN2G zLUy2{wLlL4q@wXbGDHGeFnMUfr%3NF!NrQkCtcCHLQ*eKQp<@Uf~{5hIlr!HG`Fs? z*Y(w_M%qKFGH&%qN~s>POEPp@V6G;+x{ruDLf0A^5})x2b${e{eC|)<GpgI|XwwTm z*nVd1=TQ3M4)mpIY((@_(G}?CCSKAF6E?Br%4p@Q`lVtLz%Uti8{(%G2Iw0R=rX`1 z)whtvE*DBS_v8+^mBmy1W|i_l0~CEy+Pv`UFIGFIK@Cbpy4R=2GF{J+=>RQ#{#+Cs z6pMkEEjG9xlTIevkF7$r%j?H-`>!U}OX<JXK{sFjrE7|RJUhcwVF|JQS35!Jzp&WF z+?mb`%Sf#5T8bOiN-vAvZ3Z3ayWq|`&<=@<ijGj-Eiqgz-V-D9`ny4;zW{dxe<QH; zNu)wIoB+F%3i1JefOfe)0K(FHLy)9ndLtQyF<p%JD%kH<z#EBMg;@VBGvw2~#de)o z!(Tr!hYM_g<$lei95<q(y$#v?6Su+#aVsR~-0%ap!ly{@0Za*Qg-_yE;NhD*-|bEg zR&p46yFwjgMpmjBrt{Wg9<<Yu>{`fr98)rUkxE_PSc>RfCRc^boP#B^y?I1YQI78M zNR7QA@P&NgP*54oXUm2qByafkHFpkuqgOlVU{MwpFxPw$mx;c-$?L_Xu5EU2td(vc zC<)>-gqW4emW1@Fus(&+H%U0(rrsOsbkF8pxD4Z`T*%v9hC;3a!9OWvK1d;xFzTU@ z`4s8h!;~SPY~K+hhBEYsA%gzZ(-!PC<82>V6njQk-bBp+%op=Y@!HnpvCk06Xe&Ac z=a%6riLjae1rfG3O6QWtSOLbsGM7(NYG!Aa3U(@;wo_rH%ws5vRIi^iEpo&9)Ywjc zfl9krp8h#z=Yfd@G@|sgJJ{EteVf;N=)Ojt+171eGXwUk5B96#{IY(PZZprX+DSsL ze{Eqs7XP{w^}y#}JEVg9{cDq{@)BbGYd1mhuXx)HX#TO(b@Z%bmAGcw5H$~&V7RWc zS}?RH{1%@RFf@Noz*O%>s_FBQXEbUy2)v-zP}`mpe7>N0>RhBpvr0n*)lzXR%E42C z#HL(ZOm6@ejAf|@Vu%qimL0?+>u-K0GmTal3Y$W(!*jB~ruk{>My@QT=cSU0Rt`r! z^!)#PXiLfTEj^;pw%rS4IQJsuknE%&UuOOfkK)1k3%zw|C8c9Be#S(U>WcJr8H;;} z867pGdoT~!_O>JVsamk}Py7@g#7~hhS%shCQ>3@VXv!z;r|Ls8nWE37<+T<)Rr=Wu zaC1@H-Dqw%z$FuW5Io)t3WM{IRC4VB55`ce=LIm(I$4H51JnjYqn&dcSJAIpK9GK6 z2RxMD9x-N#ekW@p7LuJ+GVjPJYj>~%Y9e#i0nx7nJ0QRRDY(jq-T{k>Y&X^VYpTxs zV>z)|7EP0#TOd2ob^%Tpqq7>RIlQFid%0Cqe|HOu#Wk&;++JasA8#)wmS|(a*)ROw zd-jw@P5wJq=#yC@`qwy1p1MHq-)y#ko9UEB<6r?0!@dH)iT3g_ZI=b=D=$nV56=?$ z1})OZ{gg{?%O%iWebJZ8aL|aVFbHR{=>O9vnU0^ba4G~?3#{Cd7~&_)TcBghsK_l} zlNO0*la&8vnai6y2IhIa^*Eh|_<S`>69jVt#mpYaTG8y4${3yD@+>!3o6>rx!5FGk z_nDMaAS`_p)v+d(BT-B&fHN=I6^xgktUjt~lU>9nuwBB$`Q!`J7i-LIx?nMxtDWja z7|wPKwr>s0T;>SJw=L7}RP|xe@bpTTt-UKyh^UUE<Jk4mbqP=5He9nYnMFxQ!Gk#s zW)9qlM%m&R8xXU!z)H7uX*d2wwreuAI~udY#+((9qZ0iF!4=>MY!HD_w&7|5_yZSx z>5#T{<|%RrG%EfVG@eUr#&E;5pD3vq>tl=*9Nse2&%{~`%CYs7?Bvt-stR}JE(h0l zBYN>m*)l~nJ{&_G8R9o?ZA6jbkb_KUp$i|X`C<2HB=HEcC<^jh2l7VwNaDK&^9f)^ zBy&DYGA2T~Q^HwivINeeMlG7fgCk&<Ly)o`TJ4R;*GgaXrVK1T1F54cz|j$eH_G>j z_{-@EsvfW!J^pUw`Rg`r!c9WsR~c@?O=5w7ZBhoGwuC>zZsE~>A8JQzEf_iHO#CFR zWL;&!-DZD(*txkM;yE6Vt&W27jmOtBAZNXPl_2_UIHs7fh)hs?1C$g$3j44Ml+HHZ z32jTB<L0@E&y97WEDyl7KaK;jNXnL6GsZh?e;5w(XVl_P*gW<Y%VW9|9YavviuC*u zB5X)0#x(Vzb~_uhzcx68;06hny*dQTuMHlF;OP>)FJ$tA-|}mNM<95n1RrFA<<|z6 zAb7R}A7O&!*9LRAHBW+%Ho@k1Z&aPXME1sFH2%d=A<h+Fi&SrrIb)>yr-2_Ek1Y9< zZ&Wriu_)B87FXJ|M&dPw?SJ10Gp|HinXx&zLE$MGh^J-vK~eBWwH+T+^}bWISl&T3 z#@8Apt}20t-X8!wErHcTD6=6-<p7_xZBDYT+3I4sQYa8%vS(7@kjveY3qKf0Sp{4r zey$P4xG-wS$_f?Z3i-K8i*c3uxs1j6Sr;CHLtnC0KI@_%N?e5;iJTKlB9|`bY`8O6 zMA?^@iVM|PU72OXu@uW#7qTD@S~w7gA3%%sB9HdNaU2^|dXE(=z09#zD9-hT+T}Z; zaBo?yN^@X-{%~FXE~2=M>>#}#c`X>F=K3RvA?pKCF#G%w<FXr;U+tT*TSyQO;_b0T zX!@R*UbvJFK-_Z2id<);oej>EOGL0|eOM#A32$LwO@B4WRxvo)^kul&OTXs1PG#ZV z?s@p4$dWgBmKqE-Ug;1T0ab0{bFEiubJWgf=)&(!bX9dAYj|1rJ^0B=9=@pU2y_a~ zXiPRxIuXRO%V06|D;eCZ5>et)kxeGo45%5u^Kh6%1l&+#3)pu&VMNe(50K<MCYdMI z8jqdX<g$gO>6vAkr%8^=$G=4WCNIT-d{0#eG9r~xql2*u0D3=N-aA6Z%0R}-T*h|& zDswE7;Jhk@wPTVjbBVV^G~ju<L**fvdCBfR#P@o&E2Aa+`+8vD&K{}<a+jl|bno~? zp7nhTK0*ZY9xS5LiGZDDtSL7=I>3)3I`bqOxZjcMYU8>Hp%NV&roic~=q6DREqK&N zm|CzXfoF)Ehbr5$I9ey$k*2qV=oY_)yv#Zqn_9$7hwEztx)>vg+p+j#ShCGRD)#W~ z$dYkvNf3a0>HLZj+E^q}2CNVDgDW87tH3Sa6pJkRBVZdO9?JyHi7a`=7bJem1VtlV zi;4v88R@#TNKiP^bw-h((UGq4MS{vBU7WmG4YO+S>ipl3qr#BH@UfAuH;M#RN4olp z1RWLWy0=Ks)JPZKW*d~&De=}I_@emCAo$|==|S-I@neGE#qs@v;3L|m1UQCKL5?9? z5l|Do^u@Mr&<hS<+;-BA$>F!fC}uyu82!yB`QR~qA<Ja|CB~1J>F4;KsEsXV+>)7@ zSGnm*S0Y{>Y+V<=U4|6f+z|7#Xk@FAy!KRywNhop!*|HqgESmpt3V?dVH&~TO)9#j z92;5kdjL?42LxLpy&G*XPgyaWMxzFfn#=OkL+g~3oM#<jQ<p26c>ldI5f~`|-d~Po zaWH|H+8<nu-jcx9{`%Bf&T=`))wakwPQ=A~&(VcRibgu8YFrldF;9ykGNpOAX7+rj zg2@;MlsVp47|xPkE^5gWAw3ff%&|#-Y&Lgmg%2Hd`htIK|5ivqy$hTYZ!aH}z#W`T zsCf7fHZY~bqD#*KM1&r3Z>bEe7uw@RGDVOw8bUnO-Zp%O&&fhI-B{4q2M4N}-f9wN zG7*<d&WC|f6@rq1Ki~djIOnpt*+(Zcy{>O>qW1g4zGUPEmaz<~=yoTQnItwGj8)#f z1F`Z)n4N1lT+AC$=8h-Vi{gB}^aLivMU21R&z^o01JFX`7ws|12U?Gfvzppflfs;y zRH<D-6UPCNgEXlG64Q+@(d9}UskSv{d<k}562XNM43k=~Gc0`XZ2|+jxp`4ydCxXQ zpNNVa5f{e~wKL?G+2~jfQVsBZSV@@!)N?U(%@fQF=*xE5DfY&q0`|@d5KTsVlf8<_ zP4CcRSo@f5@`!WaUJCD6LSFHr-GTQpL>P#Cbq%-z+L~H4-sogRaxrK8fHyEa60iNo z2nOGh-V;%Ec4UaRx>y8ehGEs%mg;81YCD&!3)3I322JH+ViQs**iN!w>1H}l>V6Up zgeTU;@+kUl1`0QX$_vZL#SfI_Sx_S2b`);Sm!`MC?s?%-bk&KzYSBk3RSSGIeQ`{3 z2W4vIYOhP>JCGtHd}u9Km6~Og*K8zXak?K9Et+deT}A7`b$u*t*D|H<m5J&&&Rv>* z1PSNqq;)o<Kh#jxf_B#s{I@Ilt)PBL*WU^vrRuqxPm1SWSK^oFA-ecWl}x($?7-W_ z(lxePQy6Zmd0q}r*;WqQq92htT>!R5#H(TW<_4$=BcK{Iq@)_8*5g61GB8}*0~N`X z8_d{-)fA=_P4rdL|3`X0L7$K5J*O7@lh9NLL$NhTi?kkQ8|Ar}`sFlA)~fU)V3i7r ze$`sgR8b6BDA!ic6gc6V$RtOCZ6}T|ECCXun_zqq@|_BO6q!L(szts73Dvc7aD0?A z9`_EAicXgvY?i1_zbFw$!ha3a8)n@UQAbc&DY8~q8eCLdrnzZQQNwQ$X{~Q&j>t;U zH3s#*P?XK;3h0*JL%yVtEdYK}3{OY}Uu$Pm3h*R>U1lI(g*3c;x3VFSH(=2{Q%+@g zZxWv}sVwY}*x%%KNV)w{lobc-8`0G<aQgbA8V2O7x3V&^VM++<Oq36`1o0rwB&UaJ zHz86+=&>XvaK^-XUg>%h?nwr057x*hNOnCK3P-#MQqhYLmc4>NH<U)TUydLC!9#qD zzlI03260(EawoHkU0b+4pe@W!m%zz$yveDqorSY@F*UP{u6vRj<_DCMT7)jg>e^!> zu>#wEL@yE+bR`cLkCmr?9Cx6QG2^^0Dc2c>gJ2QiK=Xb07aCCgL_aQ+$?zIm{rYr1 z-F>6}Ru0NWUnLNyuRCA(ml8+}j?bNVUwo9MzQK?if55!>4`rvh%}Hep)N&b@gAv8I z6pHdMuh^vKz?QzE*CoymJa>Q}OFUyRKyY@G6#&f=N!-YmNqb-s0OJn5mZH}IFr$A6 zAw@zlspp<;kx<O*+lq%`YJXwz(DF#v<YJ+mNb;jLMUurF|DVW9kx)$YHx&=XO#hkU zp_uI7Q#|yPNY~B9LobTYE27cG@pFrWTpzD360$gcaFLKBB1<^3wxO<3>f)T;cA5>r zYLCC5FK;`_hG6FG51G>z!7`XsJXHASFlw=kdBQKxexW{3_|@4j)aMDGjUmTEh|H_c zG4pJE0+uM9ANp&cAG)s0$S^IvO`dh#m(e<A^`(-IaW^vi*9{;mTOn3{e?L2YkWZE@ z0a%YE-d3B+&Eq$~_-tjmQ}Dg<f@87@)LK0zBc;b=q&Oy9%ZM10v4+tP`Nm}Wy)n|Q zRx%!n;R8&mkqT2Yiv(IJxL%eN1&9sJ3bON8=WsC_{@TYR>jPSCy*^-_gxKwvHaQ-i z!|(Bh(7t{cbL0J>40+&w*~6IL1=Rpuly$Z}F(?l{?QBconHVF|E9WfW+cx5fe-g=! z$Y_siUFlZ`meBQZZ5)x!M)s}!8izy{6rx-VQ)bg{=YSI`kjae5#O|o@<dP^R*f%0$ z5S7Aeb=0REB2kVRk?C}EM`RMwjmXHs5m~l~#BG~F8Kyw?vr||*(#rdcVg_aS{)SGq z0cuk9V$y7en@T0aw6vUrBawdUefjPSY1QUzds<mg?LPzpnCWUH%n16Ej9fS3_<_Fo z8|*$1m)!?grRGh8p~jZvR+329Jl_z|aaKRB<G!M2S9lLYv>qQfJ3AGs&?nYq*yHJ; ztE<S}AtZ|bU81n%v|LfOeo^vKV=5OY?IcKIvsg}nCI`6jppQ4P7mpcPoltAN*>fl& z>woEHe6mC_zbvblmIZD}GEgtx{K?5Bxbkx8`E!Zd;L8Hk&a>LNK6!e%-!HF(IV~nH zr>@%C#l=mlpWY+z%NtQ3PZwy6^(kMq$9#1|FXsD2VO1edH7zPoD^|1gZ{TcvwN&;j z;FjKoxl{Q49e)3g-{0f+E&TogzkA|$2)}#TEM@D$PSsJKtj!U%OLg=cke0Jgv<+ik zDZFU8(zP(p+c4M3`D%W2C8HxK+Q<A6fi~OQS;?%tz~cP2Bt{P;Q(b+4r#jimzR;%g zQERY)d^p`msY@xy@2bSt{xmSkHs_VI1Ll?Rnj${CmCo5+?mW|;&&qzEA$R7vg$9tB z=OmgoyArCXI64A3T`luWEI`$OhcE1^MUYGodt}^!^=@#AF3^dij_lVru_CH(T12s| z%jhO1Phi7B=4q|`nw8NgiysHG$|8yV%p3-gOmJg;5bpePEb>&SMBbqw?_<&{(UGUh z!&qHhqL0RNrpwtEwj?n;zh5$ygC(8-W~Jg~8t7u&^u)j6=nu-<aP$Y|Z8-XaFe~wI zIQoMyC85;{)yUs)^he6uaP$Y|Z8-XaFb%mECM--UF`T#I=#S;waP-5z4M#uh+i>*5 zz70n|?Avhk!$-6oQP)Q|<JK|lf)d7r;q(XS+0(zlKQ<?*SS-8ktP$aW8ey=U8i7-L z#cG5<D6dBNgYs&GKPaz8_=EClL^deDMr1<@wxIn%c{RcxlvgACL3uU8ALOeMe%Mzd z{IIV^_+ej-@WZ|u;fJM0;7Co88u1Rs-|6-EXZvf!k?76odFUhd3aAkVOKkNuPB~!` z>?8a^c{RcxlvgACL3uU8ACy-kvO)PZA{$arBm6;mHNqd1S0nsEc{Rcx<f{>W*jFR` zu&+k=VPB2#!@e5fhmUA$uIt;gNR2q#c3<Yq@um{&ejJhqaxY(BchhH)O@GAw21y9r zS4sMM4&hl%IBk`q2d#Ril3f^<#-uB>U06(>&04_)h{^u4B>gGBjNx-5OMXbTP2Ds7 zQ{oPb;oYkxiQ)Rll3RfAh;J=)zrm!$eI9*BMt9PAD*?O?pjQG&>6HLdoW-_#z0>(J zK^&guXp~#e?#)RjplRi-P^4F22rj*S`Z`detW4aGjx4dCuk!V-iSI$6VWRenB1>)q zVziHRb(!EOliy|z{s){o2c&ckNHz58JrJ&CaHb!ek5dcsu@TK&=i?#U;O)W<Uvpqf zLC$R8jZarPOdraKIlITqp$udpu(+=<F%gbl!!6vbfv#BR;tyV~$=gfjX}?I~Z)Qj$ zQS_kaw}g1C89!KKSj%5CB{$2k>j^;yfB8Xg|2isoO^=lw8DZ{5*2trJXfziIKp^#D z0-N}YRzMc16?_nI%G$`1saa;TtRbm05mSXCODZK3da&qkZ9MBrCgd33hcXY~W$MJu z3X08LD#n!nu528RttiyZ+JJ$wxhSy~T!9xQ()UP6t}-Lgd@9{Q!k1MfGSjYiaFs-c zyHJ8HOR^_*%$$UYN~^|v01Y0ukMtXd??!TMxKjemjBqn}zntdCT*{BJm?BK{qta_S zJpp@%QX?~mnaUMVpGIUpE<AZ0wdr5JYjz&_I_iSU8~kc)=b9~0%QqG9kNVB~zvX0X zZC&4Tl#ZUl>2*O|vxxd)>KO#@ZkF+@cjE5Q4v;~kmp=4R%_n$+K3RT@Bino|?U%xk z%*D1YWthx>@U{-ky_U7Xakt~i9YI{muw3qz9B$5bvfK>I<>qa{tnBqU+ziX*?#SVm zlO6Uz@KT0ZZh2=gmG_+p(78!1<q-i^82xoojShAY<)28{AQehitwi=di?c7}$_Zt( z%&dt!)JO=n^QA_5fmFv*h;&ujen&t$BrKuSsQ4#%cMR|Rz}vJq(Mr_HRXw_1K5v!z zS8Yb_?A1~|!nMV&3^qV;Wo{*k>3L%rqPlq_mKSlg1QwWquYpit(;!7d&*@cF#P#aq z97vl4?W$DUXCjY*KDnd=MOCip5un?S$cus)d<Pz4$hKP(WZ_F`OkzglF}(E-A8r6$ zRnQvH7!m=uAOrGK{Dbps9X(ahO1lK85``*JF8V$PkR2<&Scezu6=mb6FMSyuS5)GN z%r)>rQnZ0dwq1y6cofpGqG^}f&6X&hJAixk_2Y1P2iemGix7}=f{}U1(H6#w1{)7w zLO2T1`|*EB@p_=9{u9*gg4LpBY3%!;*eXMcUyOTJLb+o03;Z8a*Wh1%ygQ^G1ocb7 z`ta}91>@-ucGMx2#=mz7#yhsJ3APpgepj%A(G*@6jPFv?aZdwPD_A3_H-zFvd@bd2 zP!CDmC64bdP<&rfNZsT3)`R*V!G7+rH$m~!^C6W1r8W3&sZzfdY~(1VHVIV^>Mfzp z1$C38b}^{m2zHgj_|+(m{6gv#P(0roQg@;WaX1rFW5Sj?1Qd^xgj5x%XC-t!s0||T zO;A4<>Mc+!B(xk$C9F3gH3ih+LS5mo9!LGRqc%F~pN={bo6cIwd5*f#QTIFQmyQ~V z@%J|+wF5xuxTibnOOE=sqh4^-dyYC3M;3M5nV`5V7gB3Ly(+nU8B|KJmn)PyPVDjv zP}(kc;~b(c{Rcr!l^73$(xv|@C@t^*K=p`}gZEMDKZW`us2>P5daP0p2z4CJXMSHO z50s8O0~B|SL+WBsI^FMp(mJnq)IS{+-(RVdMVAC9U2`tM3fL_o`Gf;72o$OjRF_aa zA4eJz<4#aI#?KE_>LkJ52Bontj#FxiVDmv~>`72;n<2IFAf;{=N*!#ePEhv?_DxVr zgnA5=)_yZ6uY_^`3`*ziltYyIK+@O*>J*_igZi{ke+IQeq>PIy#m}gP)Wkz=Da1g< zgzt1vcS-0{P?~SO<9i3xKZNgnP<2B66O@i|<Y7vkT|&tdKxwT$4Qf#2-406Y_j^#f z^#2O#)Des^3`$Fxb+`@f0(F{%CPC@Y`$1`~wp3Ya&m(NR{0t~9c^;@UB<^BRXA1RW zP@YizptQVSfjVDw{w=6yMbp25(mGH3gw=T~sA&>+uOn><eiD>U?G#X-k<imXX~{nV zb(UaHgK7|J4X728#-(u3Iv=Y)snjEa-8bIm<5@>dnqaZdI_js6`h%l-j#lbnk@7uI z-9kO*sL{tL^&`O!I@X4s;;73U)#a!kg8FZXQB$MTa-j}9PN^obRTPxA)$yPPCA8sq zrPw2c)aOAxBUl%x-wAe`!yW*ot+pD}?<MppP}*u6LESBJw}KiF>XQ>K)(`4?f(?P{ z73z>lO5H2eOQ3Z7_&ca((ewjQTGOwepcE$>A@vL>EqU(~t-L9q{vf)<Kxtjh1T`es z1)#nwaa%xX{g#8$8oUWg%RBZ{R+s2xENw~LBS2|+6F|Kq*c4D&-bPT1Me=?pS?W)q zGQ#&RC>{47pf(E@o?_#+g3=nCd5TgUBIT=~{wRE31Eu4B6V(3-b{{C6?ya9zisSE) zS_Vp6=yg!qe*48N^&F_DL~^oDss9q{K~TB`p8z!|k_SNP)cy|YN#Q%}RHYsi$^)fi zoDXWP#P|Xz9b+jd9b=EvlzKrz%R%YT13(=vQtkrvqJ-Y#LQCsy=*f;+<f!)@b=~Po zeO08~0qQ3r<vXBs8mrGxYMo$DfzsG>pnfXY22kIXxJP<Qy(HKVK;0zR9@CWinPBCh zG`1F$&hI8r>m~GeptR(pK4U}wAA4^CUqyBI|4$4m;uaJY_ltsJRlGOrjkPr>B36(H zsHkWXk{c2UNl0#3EVb7i*CKAzt+-XJ8}77jaV@qk)JH3At;MC4s;#(HthW8Xzuz;< zIWwW^Q~JF6{D059a`XAj=X}qZ?>Tek%$YN1W=6t(p`oK;CNu|oL{pvvlk2N~-gjV+ ztM)AH2#xUy%y_lM*r1hag>lj$#_KRsH^z<Q;a$}h9pQOLYTRpKr>XWDY=UZUhuYW1 zd)`FV%3#K>8#YO`d7<`W*iouI7HV78(rwk0r@@vfy8(8p=Hq6V$;SgQ({6kK`-$2e zcw~@|JnR@v`E;1c<&R({<zK=~>3#^CtafW*ru<Hsz$k@o?R1#g+Ql%lwbx<hEVRQ! z&yxq8`gwc7%r<^@RB*Qc9A>=Q>1fW=n%)qYNv|Ac(whm}S-pP*W>WqLcA}<Sd`yt? z*I>r`qhZGTZdje#&4C&3e+Dz9Hh40<b=~gHFtgo#VP?B+FtfFLVdts`FTr+I_B!lp zjr$hN#Qg+j;+}SFaCE;PvdnRTHZx=!9Uo{@L-x~<{WWCAPVu~BH6JZ7Q<A@h9jDs6 zq4xF(o_D-zpTdmY9w&O<6xAwVMjKe?c^7FuE{2_^Y_|r_`&jMvg1v}V?2Tv)dSoZT zzN>ZvngZ=en9*JhS!XT?eE?=ctC~IUDvkSRn9=T;5!k&8Guo!@fi?<ew8l`oD%2hb zwU0t=>y9AqSeS`>1MDTu#}e2tmE8(^S=mz9N@e%Jex+;~?AOX3g#AWYFYFa%Pr!bw zY&q;zWzWEVr)&jmm9iIMuPIvzdtKQpus4*gg1xEiP1x_1t%kj&>|NL&m92rjt?VP% zJIdC=-c|NF>`%(PPR>2b`oaF7tUqkEvdv)cDJy}kQ8oznzOuov50vc$`$$;|_MtL) zg7#x&!(o3>wh!zRWog)2W#zEHDa*qCuIvEVKa|zLydtShqhLkK#=t(+(6O+;DyxNk zrfd@Ib7hlZ8)%G+V3lb7yvtw<m2ExK^R7|W0yD?zs_x)e-7p`pT|;&Y>=DxI=PiYq zqxLbFIcoRn3HpiG!k$vQAHs~?-m`)$rC-7>)a?$L9k7;=eKdzYx*kWxbA#h;d)Uu4 zy<K1?z0Q+^mhe^Bc#ZKktXA23u*JHKNmS;eRcnM@tJ;)8(8v5c%;fxrQ|UXZ-OaEc zsNGVSyoj!!_XzA-)n13)udM%RK|8q(Y^vJr05fs_0Bcn3W0;9M==2~)8LUY|voI55 zRv3B>ET^H@hoKL{7U*`@z%Ec$dq!}q&ViXW`%GA~#yuBiQob3svPklAJM3|d`!LMx zw=K>L%HS>7G>!W%%*6c=)}q=5X9f8f12bDY3f8Kj$H7dD^0PhfB-N^6Myr8MS8Y7Z zl!n}hG9|eZ_C57#HWvnMYBvvN;+_thq1r;2iF+r^c<?Z+T|*y-nHXoE6NKIcGuMNU z!aCIMDVVW)EwuYHtW!fj3`4izq-D0TBW$LIreG%S<uJ29zHwf_X2Rr73*%BSQ_g3> zeyVwU4rc1wx6fyayQWuw`98zCRl5vka``gMuWRgZ<I6U%yxQ#mGjZPyLqCP}Xz1U= z&|Nv$WSop~ADD@;H*B_Q`@_uEroiT?))3mYz~-tpJG8qWX7<)9z<9MWMPbT$U)aeS zqZDSgHV$U&j)Q$$L+irOlf%%nVe>Tf{4n%sm^|Cx&wCDL%Jfy3Dbo?0hE17%2K$c2 zmFCTCcVpNos%;B1xjYhP%Jg#BcQy1Xn2B*ctf1PGP`d+ms%j6zOe))69F)POFq60I zV5h0wO)!(*WtRk@y)aWk&%@-4#r?b&VaD#g(C%~C85&x2X%PA?*vDE1<6))@>R_e} zUVs@7eg`{K<Gu+qDern&5V{ZSEDg=TOz2@@=+UsVHT3u}^wThO;N`TK8oDja#GMB- zJ)YBHo8Vuum;HXQwOZIY8sjLKi80`cAapm_xf;4B%!Ga;4E+}DJPjQmhRz5>PllbZ zq2CQdFNOV0OXv!iDWO|oo2pk!VFQ%i1KUj5GT7$I9)xY7tQWSWvL|3A$_8H<_&f}D zfo}I}Fyr%4bj&VP?Kqgx8erd3trK>wX>DPqo*r^Ft%Zh8f|<}f%<RESVWyT`4O^>r z_k`Mmq4r;)_M1@qAk_XEY6CgJoAkDane@`3mJPLL*hRXv=`fRz6|jY>y%cJ%z%Ewp z9hmWcXUu6dsm}+6tR-X@hU}h@{W@fY#iXZkFN9s9DPIi3fb_0_U8>s6FtfGyU>m9S z5zOrAegv6g;U}=mH1rXeN#!Zn<*K~|<BybYx-Ka3dti$+^v5t0WAp2S7QHfLcfm}n z_i@O&Z}7bDYuw%+2I)NuyF#@WU?#o(HwB^Fz^>HL9bhJO3G6D>?uQxwK3Kx_k!nRZ z2ijzqsU<nsH5z&n%%oBXLoX0bLl=gjOTy55VT(2NCt>K{Vb`kG|3|^d@!l}AwJhv9 z4gChpY%K@7UbPMwT?xu`A<V@10qh11y#Z!oJOjH?wO_(aj89=E#zwa=daj|H!c2_) zU?%hc*i9NbG7LQuwwY>2!yZ=;rrqj!OH`W$GbOnMcC%{thuWaqf|P4uKhn@cU}n4L z!Y<JCmceMe$XoO6jCQMCH_Ukd4(ve<9difc{2F=`%!Dq1(M%BcbJ%Sfy6Muut9@Z+ z8}+d7s@+?#1<FpmGw^RZ>~@XY2{Znk6^338yF){-3PbM-Lmz=H)zBxx(AQyGtM(Sm zl-h{9g0`vu-Q3mE(CuKR{EmZ}y>K4vE)87(GrlaipK)8&egHEu-i6(x+GnBm-DN>p z?fPS`5;Sxu>@>~qg|PcnyBcOvc?4!k=mVH3p?N<EO6YCa{Tky_n29m!0Y)ZNI}B!0 zzVcynlal*`j|BO65cU(bdldEq_2A_&^gY-E8v0QfI-oa*yB+L74c!T5;_eUIQMChM zrcB4fe(K5IKl)L|4mETHK@Tg-!b~k`fjy#H&6C{mRQ4^H2|XG1sA>~P>@j6iU?%kR z<w2QV2zy*ZuZEe@IQ;1#^k~=<8k&Qd(A|H=D4qKEec0*Bo`RjCtnBAOeh-H|sc~yz zCcm>`PpKxKs6I_&+z6x4$?t?`Ja4Fm9s?tLXqUrIRra%IgFAbxV5YWv&rwe`^jokO zH10&$d8+*tMq@}S`##T+tgIfkpW5YMW*f_3*J<eQU=%tr2CN9Qy<s%RXmv1?%adSl zXex7Ird%$7(FkLAHLOBIuY;Lw6m7`05TVgh1jXnJmj1<_SA&i8DE@Ex|9=UvyFIFk zv-G#t;?*E-FScLBzT_*~5B`ewsV`w~9|gm)@5e7#`pU1Z?SrAcZgWXP%EwNBL~Q+w z?9*RhFKOH9v+AtJ)0e!(?d|-EzxEQhmv!5|ue5B9ljm2mH@%X`13N8I<J)ihis^TL zMf?1hu-^omVA%{JK5xNKj)T7Zx9z3AiOm3hqJNS70ltl-FLA!eezI>Pwwrzl`#HW% zP;b5{{gc0<eXnmHq#GczF0y~^@+q(`Hd3zhd=7+5-2Mte0{idyJT!)gy<Nxe@wLFF zFMoov5F0uF+Us$93EM~vg9YKAwTEJFr!gNvv|zEhXmNYF8)w_tJg~R(y9@&<gJ6l< zOWVJ35a{DSvlm<2|JAJ6_I8*g7q@@+3+$!r?D}AO$@E9i*Ah4Gzt~GXU)S>QwvXrc zi~RYj_Wy4G|I^Zsm(RNPYh0h!)-koAt=sGN1IB=|FaEnryj*59%&BW=n$^(WnA0R1 zTN=7%G<14X{S7PurH%&684&xp2=sp!#>=fcmus@ORsJvf6EBa>hOX{h7x#X;x;g+a ze%{QY4YwWmH}iP@1HXdJuJ8Oe<r+JhqyYRy`WZFxhBOHL5*RPv|EctwJGvTkb={2( zZLRIo@Uyw2JzqDYA>Y+1Jp+Heqq(^|CwrKCZf$crTk4t`@(tWGoZ4ZG(C2fo+4X;N zY(2|5f8o+U7XBh-XP3dhTAtyC{vRPuAA~#y^*`S*&FgMG*)&>KSxDnxw@;&3w~wKr zv2ZKue+0GrIO0%{-ypA&@3vff=<5?OJHKbJZs)ft7CtJr&g%c_#m>8Aq^+Yto3EhU z`ca^^O$|1S>;jTV|HdW0sTngGy7RQJfqxBiTDu!NI=Y(t6Z}eivD=$_ShxMJWqr)Q z(cgbH>3IE(=TFX`cK*KV_UyJ);x@OoH?-AF<&ZEXDCJWl0sqY<p8mhv|2BK)<MVKS z>$7}1yWKNxch6Kg6?!vroC+Jey)m4h?CsT4*;ZJUwjO_0#dj*&f65Yf%|4HdkMVxM zBs6;;|EuNwRm;IDT8$dC13@~YAolSd=wBA?yh$9XzjgVJ>A7~(z_j<ws1r@X;@cMO zMSk}7<Lyrk;r0CfQ<r#sXv%fBPHT@!K=N<2ZYTe~U1x{i4%_9{9+nvQeb|6qJ~9YX zZxu!jJGfx24`SW6m-pA$>(X8o;ycZX|9{jifpzr<?foS&?0PQiogJ-Q07M6ZgsbN7 zZ?Ta@K3{F`pBnbfDr^6IgpD0uV7;DSu#AG(;er1D3dZlbeA(kKD4%}+%a0eTkFzxO z%$PB^u4C#+xyHN%NZ+l$WAW8itg5IH^SK$Fb_#OgI@lJzB9EsZKSx|bdjCrOURV0T z_080VZs(eA3EQ*F>x|g;C&kuT{f}DW^&u$Fcz)YE@=dwsI_<vL8F-Tw`<PnJx?LVO zux{^<rr0{G|Em`}Z;}yduBTc#S_ZevBVIq{c(B9&)9Z_swJ$~E<rCDeAo5U1+$IS7 zG8jKzW&A<gG(U2@Jj>B(!vDvX__kzUAIz`FOYwgzWyATuwX!t-M=Be`f4TQq<Vg=~ zOJ$S!zqzt{{>$B$BAsheqD-3Efy$&#?Vzl{|AUmx=l>vO3;4givPJxt`+Y?^dq%t{ z(pffpDO<+>y_NOye@A7@`M;~O75v{>*-HNJqHGoacT%>R|GOz$!~Y@5*7854tbY;n zf0W5=mto3kVY@4v3>%@W9=4w{c@8$MtP_?|CQlWXDl5RYQ6_iw_E5F}wx_biuxe#X zVEZUr3fo_q+^74RvR>HNl`V(K{of*Q1?(HjR>I1Zt%7}1*=ksYvNf;+m92$I9Rt|) zHOl(K_EnaGjaOC+t5sHj9jQ!a;!RMt3N}$$2@SN=;UcdFc9gPC*wM-s!;Vq50ybHh z98Sk7OT&&+Ru4N~*#g)UWxcQyl&yiCs4PWOUZ<=UR<Eo8Yf!cnHdWawSfjEMI=oHF zYG65Kov>zQi(xXlO-aI9l*z5hR%L0}Ny_SB)0HiNwJGa`%}}-mCL@X*GyQo&Ls>1X zQ&|BvQ`u6O+!-kHR>7ntF7npEzNM^$+naf1DcIr4YG6IeYGGrQb;4#TE5ODnTMV16 zY$@z8Wh-EFl&yjtqD-a=%vDwb8?7u2J6Tx`Y?QKk*teB+!VXoo048_di@e3KG0OUL zknciOD)Pp_c2zb9HdNVs*zU^K!iFgu%mKZhvdOTtvN^CSW%FT`%GScN$_CS<j8--o zcBryBu)~$fd+x?6TM3g-%@=utX_zJ%JJ^ZJ=EF`<wg@&w*%H|C%9g>7Q??v-tg^K< zYIVwnmr!4nWnnpGV_;3nR>P(#8%*=ou537LhO#WIP1zXObYn-e+F?RrvrH&VzTLnF zZ(*~Qt%iM9*;?2s%KFm~e@EF8SV7rx*x4qOCREy(B5yeC0%a|*3zf}>U8-z3Ox|u> z<gJEXscbk+)K$vltsW04Yk@teY!2)JWrMe64ydv*uqTvFhCQxqIqXSgt6@(o8@?US zlq+k2{ZiQ+*h|Xh!(KFYgLyL3Xt39mErP95wgmP&Wy@f%Dq9Zwt+JJ{SCsYV)FQ8< z=G+5&N7)?M+sfv{{-|sbOj=0JF0i)@<23TFvemE;m92$+psYV9kN1ro>?38%VV{{$ zPB)(`8xE7}Fg$>5sBAuLfU@PVO_i;M4OG^j6I6+^!LTirErV@k>|om)J5FwcjU8+| zWy4|H8avnyCN#zQ&4j{+D9gg6edkz(?P~0XaD<vr*uKi<z(y!r1S?av1XikS@NS$x zlrhwk?{4gB?ac2hBcl7ZH_VXc)!Yf(x2e@!ugM4^fea&Z^U#|#w=*a2wUEV%-`d{X z;dOR(bmqG9tvP8JS*GW@+U4HkjGnf9>%L~#UxM<aAxX^2b#=FPw0lQ%<Xaor^5~wn zwj+EWB>w1z8Le$|jdDz`by`baR9eS8_cR+vwohwQcfHo`(XDfGO|`B0#uf=bs+}7k z-1W@Wc67JqWea8r^+_$Qjnmt6-8eIPqU0zDZ=KnbJ4_l-xx;kW(MI;hHndOcX_%Hf zw5y}16RoqMyL&b_Ec{^apthdeMDDZt$(Z$))@I*bT_4?Z^2xUS(G5iM%V~VRCD$d1 z`0FO$kzm$ctBLuhF~^V~D38kPGOo3Kbgm)a)8#udkxS!=?G2sM(#sO82l+Z=PG>{A z?19k@jd||%kCr>e2X(Xs85_-hxA#YF10zULabfSQl71J%tjDxA<#jh`_(2DmJIP0k zI@&v!pDd$vMDl3H19XCc+Kr2DOnZm4a|hnswDu<UOzrZE#XFdp8Ek_Pqtte_&T7c# zC|~Y<m_&m;t_GGqjtL#cZX`p$k_RkIor?T8sHe59Nj5UFtE+*N?7{m_sqN~Jaf|LL zBRe~(a}83Px~Js3X0_&KPsz>UJ{C7$rZjiua#E?MbaypQ5t5mb&ong8;L-cQcggqq zNbdwm$Y0h+dXm(nOx=WBLsQ*2b4O(V)M)ZUDW^KSa<f`Hdb-=@rW*43hQ^j$Q_8<> zl9Gu6BL-;yZhiW5e2^IUujP+<Lk&&x@&k{<Rhp%a_Ed92Ya4lhN%N2z25n9?qosy* z50G*=xMN0VPd-;Sj!8iy&7`3H=_{FK9pNcv5T*PXMEj?PHQV-w=JG*0-C;thRBO{5 zHokulE7hW{TPmHBrZ&~n-kQf9FKIVhj;++Nwx-BX9QT*?RbJ$CEM-@BsLTl2Kcyow zsa6_QaXQ@E|NQ>>*YX!uhoHFr#rpN{OYh6p*WjEOw7BCtIgd89O_WI?6WbcN#~GX} zO_u*t%a8gd$H};Hb=qR@&+$o%)6*?YP;+ZnciulxIb8K#F*m&PIja4CYJP$W_J96; zmGfnEJo)wE=!UL3b5{S-HNup<&R{e%BJ{pxot%=p_ooSK?C9#^be`hg*VJ5>H2w{9 zB*Zjp>uZ0d{FB&vOK-nnBfdsQVqN*_pd&rIi=HmWi`)fFNk=|aKdgJt)a+Ky7xfZ- zPtMhT+ij=g-<_f>uRY~;l#;Ou3(BwH>n(qNd3}*zv*`9Wtz+MbOY6&@FY+U(MfnD1 z-K@9sVO0O6{?L#3XZwo@%Kx+VS$yiFTw;E>CGv0FAG+P99@8h!rQGfM)pNboht%=X z;~Lg1eQ!C2OgYTfK3m-^y^QI5XT%Ph^;I50{`&M|KkKR|xEe||v^S;pvoCj2Ee*56 zs+;O-X=-h5&UNMJjz*1Tt}QnMCFpUkulxjcUF&_?lyQn4x#TlI;rUFR93*wqb93eL zn=+r)-XWKRDPQs1Jg)9rQql}|<Wr{2XvnAXEhswQAv|Ie*&faa##9dKxv8ceDpf~n zMr*hBLj3f*_tLoXPkvo;(KMCbNY`AQH!YRGY)|fO(sjwT+1=&!Rv)D-WLa<JfBdj! z_JRGUrwYp3R57_K@u!YQdDKf4GoRcq(e>reSKY2DjrCU^Cet~86oSr2PhPqTQ#*Q? zV(I5~eU^V>d-3jXX+>o!a3|FugA=SW5F(vmmJ#OGxfhx+93lbn_4T!XWSg?Auk_@& zA2DJ?c)pvMr@d<EYC6Ok2a@fj;sO4?U>u9<`^Y-w3gI3*Y~uK_^hnz?k*Or>r4j)q z$^kv?)7v{{w|~=5VSVLSH_E^Dm7b|T%xmqUht|+^Qct&b1*3Lbf~dp{d32|SH+OZ+ zkP9lBw_zvuNQ=gK)MM0Rz4?<mz~qpP1ZNCS%5Z(<Hz+@oZ+Tv;+l&hKoqHX>=quyv z+n@E7UT{3Guk?cQT3_h}{sp+M{hiCr$;tRzfQ@Y(-8mU;^Bsz>kLENps#Pw~I=bW@ zXMBBq`M<u)BS_EGN4amZKjU+pEKGl7DyNUIr_!2F(W7Y0r66=jTHEQE<WjS{I_Skn zOhzf`PM8KKKHkkC+i4j^<B6SSAUqz%b@ceoTzehE`?>x7Zrr{d&HMV@($tV|q)JmK zo@j;0)v({#ktsX=@V)j=?KjFAxMwJ)J<kn+?$ofJ;B1td-6CVDayui(d5Tfh9=*V3 zoLCk+z5P>-4eioFYiMihU|c<ya!21KhHKy6k*eR%Dv~|@Ga*ITOa_UtzUoI%uLD%) z6aMhroHnyP?QN~obMzVYHjv!*kxnQ5N7KeKr>%keU#a0$rt=si_T|!(+eUpSmx+?= z>~7)4O!UZNd_CCYzg9lX;Oy4n^e;W0&Y(hYf3cAZHto-Mb~p6Q@f~9SO4Y18jPdTM zJ~TFRV=h&%hI^)FbTst@7uoB}|9JVx?Vwa9)x=Sh>!KdHehuqP4G#vtO_{slL7!hL zp&2DNwf$eMk5PF~$W7~MYv}R<3~tdK)Yi~AJ=nS6zg9lldg%@xHl%jqz9XADrskvt zX5PmTK`AA(v6Nm}HKhD<YbH>$Ou5K7u76vuZj?5JLGdKps8lyCJ?&jkT<gvMKK*Fy z=;0z>S{xpjqGi^T(w@PUqx!JE%CFDu2OAU*%#CuI3=Y~EI-0Hh^?&R3zrub9s?_@N zr-(@t114<LS;VA>Ef;RuS;Q2E0e7)pQS9whw3D|DcV^XQA)45Bfg2Th8;LHqq6h2y z^z*hZ+Q!?gbJKcFuaxwdPBFN2kijmH2Tlfcm6+{Gc)Hlzu4pSy-krVuH;TQjiaz%? zh0C&%d0*R)F7|dT`nxA@)RtwHXk+?$I~NTp+O~6>dePSQ#}{72wbKXNbQbL`Y3!nD zgn8SenD=<L8K3=pnr-b7ZfkfEY4F;+txLD;-2Us}3tQ?I<zD&rBa6LlDGQ^RcbXS% zv4OWm>42ndmbiBr%Ua@wWhZHOZ5icX%4GuOA^vnx4pO#TQI@>0P|J_kl1e#*WgF-c z?*%_zP`;$I{h|HXU+=TO2Gz4!uaj~r`q~EGzz+s=7VTwxQlGn6mwiymJ`kT4l3y+N zp<!7JrYwv$E7X=02U=UGO%AmqLakort^|2XZ{ThBfxoXOkVhujY~QtwzrDd>oTXAu zy5F`{&F~$R_vM?Zo4c60Dch2A2<mZAN6EX^GbY^(dZDCq5!-l*U$K5|$*|r~>qm}_ zwo}Mt?wrxagluxiWJZ+<m3c*m$vf=~qZ0URY{&{ByESAuptC0hWjV)y{$FPCZfbb2 z)btCOd1GF%ws%0l)9@}>nA#RDCs=VW4^?K*TJ{H8{5O_OI6+3V4Wobqs0G1ty~Wea zNeq?;EdBKGjAFja7T6qM>7|wrt1X}R35-FReHSbjS?Sy5aFb>8XkZKuu<YkqHd|SI zoMr!Qix0K<UKZco;@er=wt0{_kHL}-2q<$}gGJ`_2FptU0jFDf-tu#zRX$5B{WHt{ z?v0{^4!8DQn-%w+$i$<84VRNbW@d*5tEXBv2V48@3~O8RRkdLG#HtVe6g3T!d7;5_ zVL-q~Ek44skz|TJ*|=eHXh@4ytaI6!)(R`(zhQ%5a!eQNQ%6i;g)ya2=g}8?DcBGV z9SRd?i}eX-!=$$DsiCs3WY-nz+-}3Ntna0vGN2+`EcR+bHVU@4hK_+THI>k@A*+S$ ztD%!%a)cJ^>}|uQur5bHu~!e<T0@&cCTFB_4Q+!-{)%-bv|)MH_t#MA$6u|X^FmgD z9iX9Sz^>s}tl!x(?0nY0si6yCOh_g4l8{LYTBD&?!G5Hni$it;>>v$Y0=tEuX=x2x z%K9h`y$5!yhD!Tp*n_acG_)6X8^2=jiI6Ra9igGmz_!=W6(M^OcC?1BgfY>SxUYn4 z6|6x+--O-HuUNm@Vc5H@w`%Ab*c}@BQOMT9W@_l?Fv$T26zhh`8KYZ6`}6-!4VAZs z8&(3FtD%GVzoUjq9W_kq<F_?5#s8f&bZE$=CnD{4v9}NZnZgQ_bCF@P=g-v8EdQCf zN~r8n!({)QtD#cbOjjjT&R&L%g)Pv~TK=arbW+IV+;%a)Vx7G`L__OYH>?S^h+naO zlWaE)ZDZZAPS`aXn&<!S8agLr^I+F%Xo3GjHS~;-&4*pDq382|n1+g%hFt=?QA1_x z!!`7(kS&Hu8(-|*z<+6Ji@hZwyA^h`hA!p*-WqyO$d<uw(a;C^KSD!$L-qvhHVs|Q z|NS)dnUJl3-Jzi`@;|MiD?|1Q>`o0`#eZq*ioG{Owi<S~hQ7=HQVm@bvX5Z*YUo=2 zkJQl5L*~(QxL-qM{_{Z^Do>XfMi<fhv4%>Y<X#Px=erG~<LF8LX#ZgMX=o~B(s%i( zh7O0_uc7;djE<Zqxu^Yu$&t%@{6lsC>^Tjsf&ExRM}=$*Ov;P)5B3uctqs{E*b5pu z88%8or-ZB?_A3o-f*qovEg@@zNx9Pg!A5InK4f!Xf7Z}>FnPwJSijp~*coVl(a`y@ zF&cV)$QHmp)zC{|4`}G3kX;4)yM``?9j2i-glq}S<460)e`(u_^&Q)W-GjD)hA!j( zw>0#@koCeg*3c*Tf4GJ&57{%Y%{6od|Ho?Riy>PH8>FGH@Lzf_#rl<4!`?*ONkdoj z{~-;1H)LyI!!-0G{y(gtYeV)qY)=g(N&T)H=iiXYn~S-?AZRmKuf~<9mJAyN+gn2i z!yeVpokEs^r8RUY>@f`;9<qI4l^XgF7Rg5izk@kB%es`Ethe+t>#|>EUHU^3F7-jy zOX=^(y3`(7zhWb^E_F@TUuP>4elPq$erNgXyTQx&$+<$phk%v*q(zc-X;Z8D&GGG} z1(xuW{cvg5CH?1pf8^X$!*AP7O?)|%eUsn0etbFaiT&=Z+shNIkfgOd87Vd2t1$s< zYMxH-SX@49Slj8ltjgYZ$Oo_O@!0QLr<}Uw6KfVOtoYH*57({g`NJk{x1ImP<KLRO zL-$o9k1u(zr2F>+AK(7f8K0hb)>XG;M!)d8B@<5j(+k0d?l`LR<7-dd^yC1yzG&mW zHLmFQ$IJG<a?H4gw~)%IOHCuQa!0f_eRx{GqJR8D>OoC2^V~<I(+i4<3cfO{qiw{D zCOIr9JFywjBzF>K<s=EoU2&1LqV6)HDL1ue+R%xjO3dP-OLi{uc5}+dx0xh15>U)_ zeta2`XD;~A8SSF8GqAaR1-&lJ=WV{}oXA?jWa;OnG%eF_>vWVMVt~Vujhs28U5%8l zqsX&fks|HO0_ts~9EXykBN-{;cfF&08)Z$2ZF4S437yF())go<Ty7X;M3;F(9HL&L z6&Izb#=l^#zN1wdb$^k*jw~D+TC(P-uE#b?`FX-h_OO-TqAcdHi)`LUSw&5V6n3t+ zqSjXAYbhm1+RCmdODEV$8m0DVTamux0!NvIQZw1MX+|kI)>iT;sVTN{9?H@aY~?x> zv!wjI-<41vLs@a69qUDube*mI0c8mZNg0|dDd*{4$3~t*lCx!GvkOYEqg0`+abg{g zlB&12RgY5ZD6>#H9pwU)#g1|v%4B?swk}^)C^(9oU8DyV*}N+0gvyAhLU}Zt96QY^ zfMr<Gh`$&%bmF09m1Sk+vZgkkuT%_<E0xlNb8M<4nxkZE;z~6Y%CRX=*T<DiOQ=Bf z8?~Jrx>3!P^V!l+F&<Wy%HeOeF0tgSwxVFi+7V^d8Mcx|S$v+Yj7O1=Jx1GVL@8Wq zE8Qq7I9MZ_Q&ARNWh<AVq^`A<8&NuMv6VYf<fFz>I*&^%@@Dp+<SU!5C?^wEiJ?@? zk1Lf6;!4%xxRSj!u2f5Xj`mkJU721US28Q(O6i)oQr3?;=A=_z5?3mAiYt}F<4RRF zu4Ko=m1;Q(>}^%0TjEM)PFyLK<HCtmwkWQYFNrG^55|?sC*n$#^oO04v#a7t^_rNH zO-plS$I50(;!3I11jnXK`d5xpUK3X;YU4^}eO#$(i!0gAxKceQrc|fr$Cb>YxKb*8 zXWPT-vZZmQyf>~?NXzBKs$3OUs@BAntTfe5tZM128f8XqMq^7C6;&5GJBSj!za~&R z=f-SiFvr`C6}+|;Rbnv%CYBD0^_ooIradweWoCCrS3cO3rXwrQOADZj*vRr)LU|{l ze4J4Jkx(`bIzZvJwofQ~B$V=ma&SV4#wY`y>k>BY3FXX$a%n=jHlh4Dp-2zhEWy@a zPbfvweCiU|Y?V-UPbifM<uH`OHg@}bEJ|uyTWN7(jh<9j+tA+H7;PP8QcG9I>_`#T z?Zgu0w1jd|Lis^Lxjmsgo={#+DDNhe4LE2PaDtD{L|dX1xU7kk-Q>X9!B$3~l<aCN zhoIDEY-J)!ic6s=ooOgb544q&C032CoQ-0ZU=LoIP?jc?CsEQf?Q~Y7tm3eXw*Co9 zZ;!2Pva#pY&<aF0+oANHY%9Z2Qs1?eEK1=rTamY0)?8^T$D(xh+Dels&)7;g%2G!; z4W;Bc+vX~<ag>`;3UultpC3eVOKe3#c{QQDn^6AdC_@jK)0!Vzq2EN7!)znZSE{zw zYobWWWGnPYiImdPYq*SdVrA;nu2Ncl6<tPSBi?V*pOKR4Kp8rkhe(H(SDdc3B}%!x zGOkoq*XgxPWK){Cv^GdbQr?x6UpgvKhK@ZVQ&!1W>pF~5?4e}EuC&3n!CmhpN2x;D zZK`EcN(Q`NI|>PVThRvic^`X3DOvKmZKaHZ#JkB+%1~Z)6iKJO$x5e8()r9*$|arB zoMlrk{;YHqNoUJu%cerMwdpil;SlwXa1_buMUEm{f67)WOHsCMvC^rOt&ejQ+4>od zA_e_`tyD=luW=Odu%^{Yxk^0jaTH1CNn4>?#rLrtMba5}l9f(Y(mB&nB%R;bO0}f3 z^>iy%wWQPPD3Z>#jv^)YD_hB=NoY?71Hzh+NmFFUy9!0N&{Zh1r(FdX|L!OmQZAoi zr<@_>lU#+A7rP2Be(Wfvq%*GFPN$Tt-smd$^EX$aDopT?ouEy~RK7DOOh=F0Ox635 zqAf{T*(GO$Hl}SU-TgdQDXY4Ffvc2eOD_$Tu}754zPMGdzvOD2BezuQ;rW+aHhNV4 z%28y06)&=FWPjB<iq!C{ZKaIj@g8;*IpTg7DVmG&@^gHDC=JbfMP|jF;kHz%DjVJ# zDkkrhBcE}Vtas6hKp8P7x?JCwZ59{FXz!M=?PfR10JOjC)!z`c@kVq;u_S=8xMIfp zVN1^Z@lX9Iz&HI^YNPT5sH~ZEL^_Gp&A`a!ROp%k!S$)wERw)YZAISPRO2W=Ln*;5 zO8IvvgHa?h?y-Cbt#x7z*u?Yd9c2hgr=wJ(tZ|fyD3WrttrnD_DABg&`ATGS5sK{T z$mT|reVlY2K{>#&S&1U;U6jrTC}SL(O(`uYMCo#woDM}PaTJ-cU+XBxp~$wPlxLz$ za#B7UWt3xc4NARZbB`!a%Fm&+ILd02PDd%GMAtY<3T3Rbtt?8Lv#s$clO3CBD03W} zQ&8$1n@dq>60DNH1*OHYS&p*6v3V1v)3Ny!g#j2Voz2OCY&|N&;V4TSn}bkf`araI z<V{;8j?#fr>nQT(t%8&CRVep3Dc^xo@5EYx(&;E4pe%KiZCN|tNx1^0H%xg1WAFK? zZLFIwJQWwMQO=B#HF~3-wK{AVp7&M-Hfk|Z(s8ymgS8coGM}}QE$q^`5oIy)qcVI5 z<rx%nqy*bqfkM^yObve#o0OBzyC}mQr5|fqN7;$BF^*Es+GIx=%UYA8$XchPe229) zG?URjmA9D5-idN?JIcyLE_zX-Ts)4AG+R+Rzd`BmC?BG1<|v!8<&>igMOo!22cj$| z@yMT}P~Jo_r3&#*LXrCg(bngqtaX$hqR4cV$mR)@eva}wiri(0Y>G&uWGh?Q4P^yM zMgDvfWerN?&#@@4I5v5d&mEf!QBqFIH=+!8lm}7Lj`AYPQb+kSij+p=Pcb>@Uu65U z9m*QVrVM3}V{-&buaj~!%5q0J1!aY!T!ymBQSLxlytQ3oKSNpTY<(3<D%^T-Tr9;V zs!<<fvl%u~zBXq&`-HJD_J*P?b++|QlwL<U7DXltMf-FXisU^?`9c&KO?8jc#YBw! zxe=QZCmkuRl%u?YQtv2#MH%XBYiqn4mDtt-XIpz?BmP7l9)eOE#=_V;5v9}F*2yRZ zN4XrO*HP|6sc}+XfifjbIoKBk$Dco9v%*PdL)KO~%5JQswz123B#QVP<>Gi08Gm-m zxzpKJ9-De6*10Hhe=9n^e&DAQrTj2T!LfM-rPE30GnDfko9*#eM!%zU%1~siJKEM* z6iGR<X-2uhvH32FjG0F^m!T|mY;Hwa;MgojkumdVTW_Gq)}wU1Z8-)Vo1IV=J2v~H z$X&W9onugzI5x9TRyj78pooXjw(dlE*RgpPWtn612FhB;W-UsuW3$<Iw5#;KBY$>9 zNt3te7#xdI<0x}c#yH9kQEDCKMU)b@7p2p0uqmG?7yF@<gj)~lbG=i?j>SesCZlw^ zP|}Wa9!ia)+=$ZaD37AN;^bZ47Adn$qP+hZWrY)K!1nA5N7)l4McyKRMx(sxq+E|O z+(~&ZitMi_@83fycWiDz`N*+(2&Klcc?son$L3EcV;!4*jAf=B4~L=1{ddb}6xpwl zG7Y8PQO-e0Q6iDeZ75P(qFg+KGCACOum@|MJ@_^@X(ye5JK~R{WKqUCN*&5%M>z|n z#ZhiU$veu6C<RCP97RTVqg?E<lX-t;l#9brni9FFadOdtO^K7v0!hbF?nD{xC@-L7 z9pyumF^)2bNt5-CQi-w{zayWIL)phE`MD@^Z_Cu)pybnz&zEDf)Jf-FlwL>qFO+8- z<$aV@j#9#S=VJVh{K=q5&5X)$9Ll_eKPktb7HlRtu?i@1_boaGFGpGGZ0k;xUPpNb zMW&iY{`?VTij#5?<M)?1DGx@Gy&U;G0%fsdb1;hBLyT;upxo-%<WWkTtzV3ia+JGK z>K)}Jl)RJj2Pn(Jl!HB3;*{7H6kw;5&Yma*M;VFI>nJCnNU27-$fG<FZp&ji7iEPL zYca}7N4XDWm7_d^vc^%~Kv_!ZNBiP)6e;;=>m@_jmb3NUQF@(N2cj%@l;b6qqs&HG z=_nVYtZ|g3qENDtKhLAcUXJ|vBg!kGKS9ZREKwhFgWWiLGJ+7LvmHtcSL2bg4~j=_ zBV{B?KSwzlrNmL%M8Sh7))^@GY+!qMIf{&mMaRX>D7}tNFUm)b%`Z`wJ2rnp@wj-6 z(kb5E?2D*0hM~x;$jD|iO3Lx@1eCO+^q_P)%J)!KI$OU1MP^h+DKA4QII&(rIm1yt zKw01@B||AOauStT8fBHUt;11derB|-97?ckptF4{D$A=<*l??iLXlZ06_pjGopGhS zH>Olq^zY}ysw%6hb(G5T>e9t=rA(d*infJKWeHiZl!|mZ9aGB6>f=h~oKP7tRo*yk z7AhyBphdxIh&pSiLT{kxJBCb7D=W%No1A>1lr0WZHnFNJR>YO6!8mODTwPt`DwXN< z{FqXamAjZ$tjelVIRI^?y0SK|R4sCqs_IN{Tq$23SE}TWpp|kqoqi>*l)f2LN;7L> zN=11MmB&t}qDsD8Yb#aR-k6dtEuqn{ZK|v5U8OpmkvH;NHq{Kjv-@nNs-iZoWEVL~ zRXSU>GOlDxXpy3Hs?yb&$#JDzMw=a*$|Z57da0{$KS#!&tyr0=3VDOSqg2)~(&s2y z8AG&{Y}taiQZ6Hgj!kwj<7kdjEhCe*Qk_{8SIVx6D;4)RHM}ZQUA5S?DXl155?9Js z#g!@<)3df-T2Z}EOsOnQ$Ca}BxKgnsu2imyE7ijp$+EXql^Nx<8&#!MW#z6-S*AQ2 zS1LMVN@=Dyu9V6spS7*B(z2SkQgw;D^|I3H`7xWa%=s~;qH;l8$zBpuD$|Q%N_Ev$ zu2P;!-w;=-md2H885^{6QC^ynFD%$fS?K{WrM#*pu4Fr7N>zDpT&e8OsF0m<RaQm< z9i_T9resSO#g#G{i?d=?R8|dUq{dOQH8G{Ca(+z7mdbY?>{!{Xj0)LGb!Jsu$*ysg z%5-H7BP>>|%5=4S8NyaFne*dH*@C!IxhSq=m&TORjC^UrPPw#fWn8IT6IZhR8Befd zm8E6O%2u*fGE(6v)iSTiR;o*7?8Z{6(wY8T(K|}TW-%p`k+BQgCQ~Wjw{VnfeM~7$ zx5bofx-+hn$+(1_PIcDfy4zB+>C)P`Qne_iWHO86O2wMElFf20Y^Pk7mg{ausT>nm zvb8a#JUzuxvYGO#`j}FYk!$lP<!q*+yfdz3<=Wh~sm#diEJvwW98;>wmd2GTdBoC= zm94CeE7gl#r8HZ)G^SLim&cW|RdJ;v#kIM$t+I4wXH3bY7sr*%invlXm}_b~olI3K zrj(YY<4RQ_rj%uu$CPaON>?ebs#p_ODzjWcTU)1pSRYqP^KqrT5LYVX+T2N}a&276 z_U8)GwyDSrjw|KaxKbh4%XX})%#yfLxiqF^Gt1&isay+N=~R|i$aSu*RF%mWRve{r zcwDK@x=K}LrZ%pWE{G{r8M!{SQm(2hm6?Q&QaL%UR4s@p+3d==Qk_Z#>5S;gHx4~) z+;P(7r%T3FfL!%NR{~rZ>C!XQpxSsEYm$jY2W*|O&hulbjV5rdugJ;<q!Z1=pyTAH zBVjL&IpHT_VV2wcSYqSGq6=ij+IMmN)F{@Iek`#uDgD;jdR=o{zNb6aWVWFxH?~ag z*7;ff^Y2A-g1`{pBMsiEBk#4Z8`aUC3s)xO_+CplAEogF<wa7?+nd6bAew&CU}9TG zUSB#T!I2W!jMDc&g$Dj=5NdxZL*w(tqe)%7h^g*y|8qC_Or3d^R9#~muksI!{Le|~ z`q=RE3PI>N`9=<(o#>YLc!^u)h4{P!UDhUAugAAS^;N%CxOqRD2orM54-em{A4G}X zs2)Ue70IJ{2Y(RGJNfO`1_uen<<9Op|KmS%>ttfOy*`a~iUcs<_N<e)lLw0MI(@sA zD14@47GDDL?eqggeoPV!q6J2MNcy26UQ{cE*ewZSBiofXRIwF4Q54g7YOkxo7h4)I zmM>oDmJ-qZ_gBSJ&{w^QXt@<^DUgEiAlX*Yr;;MI+mpS1n7qnOUM8k%L8UV97UX^7 z?M>D@?fZHqclavzz5;m-TVJoQ4ou|(IPyMCf8EYAFWJnQf;8{^^-Y3z%=)YP5>lUA zFXog23f`gYG5K8bDX;P)vwT%V6zcz|)>%H|b56n#d^SPers#8tJ5JvU=QZ<I;v8Rd zmsbb|D>I!nUeW9X#@6M-JwZfyf}(S7yQ~H~uC28@&nu@prt^YS@ln4~gyXr!>9T(C zxQ5QUBXYBaM_ySwQ2bL*wHErRinZTx1z+6JZO(1yy@~STXkIDK*J>IY+Q=O5HEryc zU}`57lTUWHN*fml_*@s{!LndWk&Q(1^Drr+?Ps`I*2V9jj!71I_a0xm5+5h#DXbYZ zJvq&6usXd}%fesf4da%rw2jv4AySh^cgf)%r6+R?<C?@fYGR8#ixL^CIF|Qfjy*)G z&omr04TU@n%*!RIP+jf3pqdYaNV6p7b+x0%3Gd@8J|eTLco2em9Ja9btLnsJG%sUo zlU)#*g>TRl*T(nc<-<Xy{>qoFERB;udv}|Bk18(8r_&^LP1Kxl>PB)LOWEsDKw<J0 z^O%WbI(Rvz`Iv<_gSyW59qM}8<v3=|yn{Xvh#;*#y0#ONfc?Jo#QVzq<1}bzrDkaa z%7>^;ax#$krnvO%D;^)(#yis6y6Z;wv{N;^q}V%~r`E}5arr<L=Rx_}Muw(BzZX|G zVba0oh~eeUjng^bbbG4Fx%wda)U~cnZ0X52@v3F7uI|u@V|e{@TdvC-XLaPMv4^i) z%&jxY^9h*gtvM#NN}Dj0iRC_H&hXHl_Sw{tp_A;+!cd)i8q;EiK}RBH8^}R=;`30t zZ%0t2ho)tJX{iJ<nd1!Hn9#MlkK%h-2?r&n7u%?6BptpQ)7@fH&d3HG*>c3u`*b9< zupF_psH9ZXZcya0rA3BOmnxROctBrKVjGB}XaG62x@T_5!~(2Bh=uf743>>m5RMwT z>&r1;Z52ngMe@I?=6c#^i0;OCh?R+WP@lQ5jjU|AvXu`x#(ftpbIDgEN9Oj)BB}$9 z>KeNpV>e1H%#WD2TY5i&tNDg~oCSRIK0<=M!TF(&J>jeIvi9Y5m$RI0qC9CCi^RtI zI03oaU5A0?!a6Ma^rjD6%dx&f@lkeLa82Sm7Z0(#iU;-Sj%{T5;m9};T?DzC??cyP zqYu4Q3cC-zY#n;}I`oR9Ze`ltK%ZHTOsouBB5p>#4>!Ag=$hR=bj_}-TW-1meYzQ$ zSZ-RPUoGrzk?XAN!#+dR<#mRt<LeC7z13H!mASrx`^;k8(8_2sC~B?ZJ-_I<j)zc2 zVV}?~oTRL!;>cE(9KFxHgcepNEG_b0a^{R6MD8bo{C&(NJifRYP+M0I_iM~P+@q0h zWz9{f&%8w@R_1Im%AGU%5#`L0qg?5rNT2x%Lz13`LI2EGHA;GGWE}7vGNUlA2Z<od zg+y4NJ~&pE6EQt1wb&3)RBo{VzvOVp|Jt7Gx$F`*%yK;$*r)HVndN*ez%N60b5>{j zpSdFC;707z71zviB_0qJr1pm5``#8KQ-5bTLuOII_Zb>Rmcob+tVNOg4D}=D6T@qM zygmZlDAxF!8^sQAqXgq_u6?LR#)-kVC`K}<?`URxuJ3q$m=iHRhUdgg1UgZtQTjSg z7z}zjag(8aM>fNOeMj}f{D`tYqoF=OMohF!gE1P*FpxNEzF=g*J)*y?u{Ql*)>zL6 zU&7dGJidf=pNH@l#Iug+FS2w?Zk?qR2E<E50{YI7gnW_neLI>Q_6awi?mH~-fP>u~ zFY4QggjwK69|3*^bjO|iDi{+ZQ+H4*vX1F~1h(4Ep%4yQ`Sx+SQ^%jD#>T&`qWJ=Y zj6c}5&J;@ji9t}p>)u9kU-xYrl=V77ZMjK5wo?}l=dUBL>ojw7yiPMW-|I9hbBbr3 zX60Ybtl|sJ`YQ6iw))QtJ|3g5;!oK0u@e|>{pZDR8}wQ5wn3joZX5Jj*tS8R#q1mW zlali-zEqiE`%g+sLQOfDquT!rYNC+(4h>4E@6e!l5}|I+62a@rmSgDVDHh~6Nqz+g zZ-)6zQe38qYO_8^YURC;kihpof|7p6i~^q%vg2>8-(tKCMc=ebhU=|QmIg^Dbhc$u z&_0p5<>%(G&tNN?eTMg$*Mw!@RbNi{)h@X2X!&H4u>%5ck|9YyT${jym}*w_CTC*9 zt{PNvR}HFmsJb48^19qp1J^er8ON+Ut_k=03JaX<D=cueudtwfiiNqEi3P4JOO~0N zF+0FyPi|Bt^5uv@h8!`-i6aJC2t?QSKwX#967G6yl&DYBYTZnWx-^a&88=zC+9G2| z^^GU_x18ic!MzdZ$6L379^(F;I;#}pa!?R)Jy{gCMNk-ymb@KkZTFu9X8O31C@}-q z`i`1(FliUK*+&Ss)R_yy<de4CtXx~{CS^Eh%eh$@&dI8)J8TAb&CTu1I?AA}raYZ( zF6RM}VByB5uQvyhB6@Ux)7;q{uwSOCDrGI1DrStAXDchqED_3!oGL3TQ>pUu%JOun zgw+pdI%`Ys^3yAuyWZT;+d(FlvDk0Imi070c}~t*29#hIy$xH!-W;`ocNKPpLyhrj zp1G*;N)EE$h%I(){1#m1Ca8ASTr;t&ui*Jt?4~?pY*#Spt%i5(*>BGlyA5~Rz?;WQ zf=~TxKUwt_l8+Q`C$`@dEc)eBc%OMKkGxn5>Gj(0D3YK8&u=_)>xSOg`;0A*VX)nF zjr~?4vAc&!b4#&l@?TfDFV7>Wo%Mbbv0Kb<k2l=ydIQp){d|wu$t<||Qt(Q8!`kEr z%5Hj!^q%w6l(~R4B{el+{j%&<VzVk?7tQGtQ%Ub_-^P#Xr<b(*pf5XXPM*Y<8F_z= z*~t?yRJi>{9Wr|4QDY~KJ?x<UcjMo|<0g&T%~i*b9d*RWafeLYEhT&NeSQo1P4bGE zt^eQoW}$o+amt*^@+qUFwob`+_2gv6!3cD3e~%{z>Ul=a+uGaH`|vdRwvEAYt&LqB z-5q?KbNGb4QsX=GtutCrmQTma-7!8|+J!IT+v)tOywU0#R2O-hxYU{L!DE>j>@RtL zLfgsGdP`&N?c{A$A_rHn_{X2D)(qr*Cj$r8Kp)$~^TroREW8^yFom>`rzFM~F_%d` ze7k`+exUaOsy!1@d}!e(^E%~tljTsVw)iy$Wb(Lt&7rV6I1W4vJOb<h$Ag!GwcrEb zk>G3KMDP=E61X{O9|cMtj{&7Dmh-EOmBq7!OBUrz9>=YtEZUh8B}KvZ!o@8L$#*?r zPQJHAY(X5tkHTn}Q`^C3O}o9p=$&Y?PgFmc>3khMOeB#Kl|r&gbStECq`VsEy1F{L zv_PdiCGlX9d`Njp`O%E%LQ)0E+dS|f@H-%7=TVIc^RYb>TnL^8UILy2%Ddjr1?3G7 z7l8MG7lKlLm%~eA<@Y@f0w$?@=YUh4@@tlpk8}{U?CP-z7PsuS@ivr_kY(sW^yWvK zi8fnWvdpp4x+TRXPx6c}>eks@DoTl+u3|nf8|49pfddPOrp$alWL};G%nt)(A{iaA zh8f+O%mM=buF3e~Agr^9kEz(!I<<>08S6f(LET^*b)%UNipp*qgLLFpBB=|q+tNt( zZrjF_7wnj2B;da)ct=cYS?%FBzK9PH^R;*_Iq`S{CTnluRS(>WqL*buwkqp<hcH|Z zk1wplMfQu-hi{<BdmLoBd;@*ital|S$JI3;$Cx~iT&M?m`+Z>+cs+Oucq2$%@O}v1 z1l|PR3f=-f4)P>=VL5mQxCUGb?#{OE2FpR-onQDmcpq2;J`7$8J_<erJ_gEn1D*nZ z3H}UR1^yg-3w#dTfjm7A4gq;;yRZlNUtksZA}DYEe;GUx<aysh4*V5(68IbNLhyIs zwczWZJlXsQ@CEQKkht<}bAi*d_ebyz@K4}hz(0eV7kl1&pnUt{eQ+4~0Vv<_`w$!n zehf|miBpho&V2&PbG)B{XM_I$?*ljBb2_hr{lJabKO2Km3AO<D1P6i#f`h;#!EM0F z;I`m#AYXwgG=aN<CxLv|qi{CJ_fHCP{0#-=IQ<R3_;EUx@|3n=G}xFtPQ&KD2Ag1U zk5g&mq@Fs5npAx`Mq)=p3duSeB&r+@i9>fdqSIzd-IilUmQzbiT|eKfdh!TXSl6ZA z1&icO>N<}y>DPlq=VPpTE~x|uvCjUI$45Lq+*ud`9tf6#HQ>P@`>`+y90fLlhkz%8 zhk~bpW5Dl$hlAe-$AQ;_wczvMk>IN!^`P(<@F;K#d^#HB6D-~_;6C7SU?q4wDEs0B zQ1;nEe(`;F9GdJi@vGI@XF9DmY+EU(a7pg76k+ntu<=Ftyu{PyO6*V9=1L`Lt|X=u z{rIBjEJIyKspl6g;**p$T~PH)^vyOjWxYAbqkY~MAdmcbybrvv7q~T81#Sx-1a1e` zg4=_Vw;ez!18H;OWspXbGWZ(5lagf+)?2X)mSh>!5R@o`6rxoITD3I4VjV1!uH;vG z$K}4bH~xxG`+$Q$o|>0ehj?Y6_*o80eq_JL`x|3uSEL_(5ZIK=PghTSU32HO8DG%f zki)K?R4n(mL25xt@f%;%nQLljXVSIq?BPgf>CVp0$r(wktON9mPFJ0n|CArg_H0Lv z_!e@`X;>x~2h+Oc^jbqu)1Icbg#p1?>;(!$mc0i0N3yA3wZ1GtQa)1NB%yCR6YV=3 zBT{CkfKsnc2loNb1V@2<e@f3|w6$8F&H?2Z<~vc^Upya_x^)3apT@foyb4?ZE&(qB z?*}giC6||hFN2qZZ-G~UvOli`KL@V@`{U!);2`h^p!8=KgYpH-Yr!h;M({-N7H|f5 zD>x6l9lQ`+3N8lk0+)k#gYs6Wd%-ur`#?U{>-`uU2tEMvL16D8a5(q~xF6UHeiM8Q zlzR0zDE`W^8?S%Y6`SXh$cvZjyZ&`{<vO+gjUj%plmvt(({%moQT|)?Zwso497=wN zN2_Rx^;mtBN=BuXO2)GTIe4;5C8vvTkz-k+N+tO&P=3K8d6qi0FGAkee?u8<$@(jx zoEKgP_XghrxsLEwgY&?*!COGS4^bFG+&_VPfPV&$0M~$Z;0NGr@I&wv@FVbS@GszH z;3uH;tv>~C2R{QJ2LA^B9^9axSCD>MKX4;*ME{^L801|ag&J@Za1zKDCkn@dn}KJ8 zTY~3+1Hp^Ht-;0MVDL_m{zc&ta0gJ{db1-aeVv^^`ZeCp;NQSq!A&Wr6u3P&1l$wc z9hC3)3<VDZhk=~KJo+nzR`6@!e2@>B7dT$L5untq{XnUMzvg#9?3zKow<%?RI@r=j z9b`;@Zr#+m`CMa1leq|$x)3aGO-x)SNYhx0ZLDfeMoRIsnntNmBIQ*!Cq285zA^4i zBaB6=>`-tBKl<pNG-%QJV!4?3i{wq}n%x(9j<S&aJ`ZjOz5osb{|nq7d<m56+m}Ic zeI<Al_#03hcnw?#z5)ISd=q>e{5>dry+42-fp3AIf^UQJ?#Oq*Z-RdUj|bla+rc$p zC-?#QUGQU2_QhX7*=P6i+dsC?q|R@OF74d(zV?~i^lr(uPHQpOd+TmH<g%)sl+5{< zVal*ml0vn1o9xNqNLITbC!aJ@A15EPJG9MPfJLx~-?BfX{Lk>kZ*hK>yzpITc|hMA z3+@Jv110tG-~r$S@JMhHC}R{yfzla09{d4#BKRcO0KNk@fdkoAD=6pw>7bNX8z|*^ zE5EW>xyp5r^d;^WyLFVSHpVp=1xx>cctK+<)#krlbbTENQk>F`u8KD0iLX+Ya=rhe zub)ER#Qy>)b^BCM>h>968F(frb^I*wU~oQoG<ZHZ7rYR>8ss}HTBk1uSF-+na5Z=Z zD0TWua6`6z6*vsM2HX?87L;@Cb)b9^`Fc>kP<$iU11<sO&6qy|e+b?N%GY9-f>P#p zg0gR<Zj{INO$JT!wl}{S&c10fkJNsN9=LSNQpA6_L|Tq~-o(@a2UPDm9Xs>Ipv>)K zM|_YnmuI%6PRjBmK8s&ZgVNvrIVk<lXF=(2{}L3R`6i9#tpgs<+g50jCT@A{edR6e zSz{0`ZpD+lN&Hye^hlJtlMdsVGr8o0Q-i)IUV>KRpZM@cP||tZ_qP=uzYdVrSMn_R z>~Q?;mZzV?J&__jSX^(VIT4TKZ87vIh~+oo+Gg0k%C_RZ{vF?B`~LvN2MSNi_7-S- zeD!Z=vR^*ocZVD-W|_oOl^yvG9;Rr@O=xJJ_GQOct**NqsZu-4DT@d6NMuX2S~S_C z<BJZf<<w)U+;Mw~Am>nH819!A<B$FqUl*}cByUrE{o5SQ;{SKS1Hn_l6Ts8Kv%qt} zyTJ3nr$E}o!mmIXFI)}Ec%kI|d!QU!H}i}4L*;lI%uo8|@+J&_p^Ri!sar&;AQbF- zpT>$vx(jv@$*!+KE2g%MFPbV(>B*3Ul%y#&reRIXx7hVT%!5UIl`^ug0dFI3;{Wa7 zC~zq_6}%IaJW)QHcgoDm#@dy+XmUN%&F@Yp?+3T#n6|v0b06;a8nzcK;zK-7%kf$K zdK#2A`{&>>;4`53`Yb5>^C$euy+a2A;UaBwinV|6yU)p!JdPnF+{|y)6IneL!Q$>s zyDujn^U$5tiLKL0%FdjO7~AKv6U;t0J-J}a$r)bKqR`{LfO)Wp?@|_<BS;dm@DANV z3S15D1-=7jK;D~Ms09BE$|m0jo4^miX7FQB()bG~`<{0m>oq0c#xDGxb>5d-cpLm1 zC}nvnzlvD>xEg=tc)T3E%PGrIa%;veOuN}~3p1$mRxwGDq)4}qBGEFT4u^~QAY~%$ zzzx3o4*OsHdKZ+szXsd`Bp-!x@FVaz@MBQQVlB83{1m(v{2ZhXd9*p&Z}lhx>0}py z+kzW_a&BjT6pjQp0_(y4pj<z10?q|D1*L2@1EmaK<rgo*-hSo__3~}IyPY!Br<m+A zoI~_rDG5l}vs!>+m7x^tA|$I*D$-&ktN$g}3uz>&339z4CRzADhRQm(f;#nbc2sB* z)!E5tee9qQkfkhwMe-;6N9yJzUmrnvj9|SKly<uUoB%T3Sjd6&leEuO4bEqsvH8Lc z-~nJS_zmzCkZXp*TJS(n_Dc;|4vqw6tmYuF3p^N<{cs3)H#i!69vlO{4bmUe@d?If z_1g6au#;=e@t};$vyThhL+~bmjQvYK^qO=sDA%ILf?orV1IL1O;0@qZ@HVg!d;)9+ zxz6^cf%0xl`hPmEeiF#_sn-UM1*t=YnIP9dg^NM1feP1w<fU)}*bPd3;=GlpPd`SJ z%0avC-Q(1!i4C*dV{$Mi!IG>`QY~WjNoq!{@<{xk@`UZTRE=N}e`Np5K|j_P&&Pk+ z;KiUEmzRLjXS@uQdceLaw1D3SIk$UPfRdjpLCH7g{X{>JeXG}favgcElkW)(RoaKq zaAF5bGTSu-S=p9>n=DDn5)Ryaz{(Pp%s<(-<Z&xjuk!Uf@O4x8QgCPRF0dM;{^>RI zJ)jiaec+kk{orNbGVmtwC*U&h0q`mCAyDc(V=)EUelJLS<UI<OfKP%uflq-lwznLV zvUnPlGMl*>V;!+`p}a3m&Lx7AqrNJA8_Mjk_HI25F2*2OWGDIygKL|6n+*(B!4m66 zsC<O0I-yi1l!}B>o>0mXN@+sLB$RYq$t3*AWD_=32_@lkCgF1?;d3V8b0*<)CgF1? z;d46Sb2{O3I^lCV;d46Sb2{O3I^lCV;d46Sb2{#GraJC(hFA5ub%Pg-CX~3(nd-RD znd-RD8NS08PdV;$raJC(hVS{sVr3IPXA?eW6Fz4XKJzufc*+T%vk9NG37@kGpZS(y zEaj?%&s7PZs}ep}C4A;fit&^aK364t=EcPESP7r`j$_QGGU0P&!sp6_&y@+ED-%BR zCbRgq5<c^N%D7F!=gNf76$zg!5<XWXe6C3NT#@j(BH=S%;*5D%k?^@9;d4d8=kkQl z<q4n56F!$Gd@fJ;%xhm_9`gOgxRUUh*J{UY5<c@a)0j<J!soJt&wREu9xLH<S;FVC zgwJIOpZO+hJmrMXiE~`0G~sh;!spV2&!q{U`C?^k>wJhat|WXeP54}z@HufF%p}f( znM}gxOv2~Hc`%bW4`veQ!A#;jm`R)mGl}zHCUG9jB+i4G#Cb52I1gqL=fO<kJeWzG z2jwHJv64@m2j$bQ_Nc(vBRCDlglt@>iVKx-p&~An$Az-EP#PC9aUt$0CqLIy&V4Z< z?kQ)!m_^*vY}`{$d$A~SPdVw?Q|!hb(NTAZOe3sgI$SjKZtTRK)_iVk!_-_`EI^I@ zfL-hu8X#j;<9Webb6dykI=#+aN}tsXwCQYv5-xpHNI~bn(MzH1gR&dH@kKHVFF(7r zP3|1=aG=hR3@)FCs70&Jn3T&46N4#ob&b3%OWrJL->+Lmw_K)Iu}A`PRV7yrY=U}b zZaJIvM&|6v9Xvbo37gQ<HvRBm<YcRjByvO7G&4VN3~8k_y^c;9R81r?o9$n1dhW8l zT5NCQGHiTNQ?6Mr_vQM{C~eHv%{$wFj<Av9o_up|;J|wD0gcSP@3t;xZJ1k*!EHw~ zh9wt5{vy{Ja;+reBza%odPnB35k3f%%aCnBDZ-sWxhJqIDA!0sK)L4K4ZIv23O)i3 z1OEyR2N`qmD!?7UN^mc*8f47C+aG)kJP>>pJQ(~0JOtc=>-s~%k>Iz$W5C0~bHVZ8 z_rY3_xq{wAa5*>$WbU4K6v!Mr?`W`yyd47;gU5s0f>Xe~z!N~`cX=m*<G}_n2R4Eo zU=zq(5w8Vgu7}qOGIzsk2W9+VCMXrB8{C+2fVm*|uf3DOso=N4CEz@;bVCNOK$)h0 zDtH-q8u&2CH=zpef%Cyls66L@TY%?*M}ilEdGLGSTyP<H6L=YTAGip73cLdRBX}kF zXYdE$o*Og21pFp=E%+_)M(_lXFHaRZz}vxv;2q#4;9cOu;QgR{mEy<Xhu}}ZwctZw zKkEF$pw#_G!M(x9z^{W(g5BV=;CI01z|+7Nz>C2D0xtt!25$s;^K;=x;BUYmgRg)O zgTDix1y_MDfNy}Wfp3C;0N(;X23LcB1>XVtaXh{YZUVjs4hDITbYW-kLvSDPBQOJg z0@i?Q!9&2$z)2uq+bSFj{sWZn6LZ~Nm;n}p@^#{V;Hluo-~zBecqzCkcmuc@cr&;q zxC|@-9|E@qe+mu)p8>Z6e+do-e*^9az76gKz6b6KehQ|*zk|Djn=_C)6x<5j6C45# z2loK?1}ngQ!2QAfz{9{acm!AmP6o@t6Tm8PD#%;43)8@_gYqTg1Hf6}fuIcB)_`Y% z2ZNV@qrmTjhk{GMG2m?=Umz<y2#y6G1;>Lcz*_Jna3c6Sa1!_?cntU<I2n|$6dez4 zOdB)>+zhM(cLeLf6xayv2R4D_;56`?U<-IK*al7jXMo3mGr<P13v32wft}!Num}7$ zcm_BRJO?a*i@;OCtHCqCTfsBIJHh$j1K>GeFL(j?Ja{4aB6tz_D!34Q1H2Uc6L=Z; z0eA&i#JJCu;6~sz;5Oh7z#YKrz`elh!4cpO!Eb;!f$}ZnAAv`Lw}3~3w}UzG4)7%K zE^sb*H+TwoKX?JS3|t640A33|2>uZ41@8qP1%CoQ0X_{r2|fod2Y(Ab4ZaRO1HKDB z3%(Do06znN0m{JDi{Jq8C2&h{CAdBKD{vR^6>vECTX0`+6<7tn1|9&u362JT4;~J# z29E;&2p$K%3pRm&0$af~;2iLM@H^l~;Q8Rk;6>nCa54BPDBnu{9Q+aZH}DS7+nM$T zECL?}`+>{B4Z&wY-T+^C8QcVX1>6jL2izQ71D1gQ00)BoxB<pD@CsXl+kk^X-WOlk z4cs2w6Wj^RfIEYgU<y1090Gm|912bXhk?g}!@)*yFR%sN2kZj(1!se4@Ki7Zo&}bJ z3&0BSQt<2G4d4Ob&EP@cGVoyVA#gPK40tH`3-EAo6*w0BJ$NMe5jX+-6g&#-za{5Y zaC7ija3_%O`W1$NCxB`2M6d#E07rpS!Nb5DI1y|HCxflvRPZEl8aM--3ATf?z?onH z>;lgOd%$zSS>X3Tz8+Y(1Uwo1KKLE*dhir*33w`aKX@AWAb2MDbMP#11$Zv_Yw$eq zci@HKpTX~eAA%Qy8!#k&3Ai!Hmk0~nf{VZ%!7IV9fmeb1fj<DN!Ns6_qxpJp40r=L z4!j9G2IPwXg(=`I;B@d-uoJuk{4U7%0Sae;_kc3n>0a<+@Ig?%+58ZAANUB^3-*Ff zf=_`jgFgk|0G|f`1pW+s4}1>%416Axp<=!$P#6sU0+hk@7r+XTuPGMf$*&i|3E)d$ zBlt2n1N;p*5Bx1C9oN^v+rc-$55YfxThk|94NBkiPoR7i`8{wRxCT5G{1Chj{206k z{0sOr_zCzDxE6c^{2bhn8;XAe2Y~+ow*-rJVID2m53B??1iub$0oH)qg0&#uNhs8V z+k>ZqJA;>kyMoKW6!;K06nqKX1AGJIYYK&p266m>n}S~hHwX6tw**IkyMug3vTzDm z0iFi(&4t2^;Mc)k@BnZP_)Tyvcp&&b%}*D<ugC7;PD7*X=H>X!bMBiQCQnl9Yhd+F zkMg2qdAJO_aG?(rEdFF$3AS!IM)$F614B@@IfwdA*UlT|>+-CN_#w}_h#RZHeL#8E zMeY&44Nd^x0mavMLCMpd{Nndi??4;O?`D48PM+lP?J>c7SHIj-gH~?jYH18<_VD9w zY116NUXz>+#P#t-ZQWD3$TfHUhp5spn@havfsz4P4rdmhDH6Rds!`GW6Q89_=$3PD z%Ph@w5hNd!SK$z_6`T#81WMkfgHi@h@QathE?kdDT$!7jPn5yYb{W)Q7A(m<D%p#b zfm|O(WgwTK^(Y)Tl)>C_4W?LHST)6x_lu<y#V?i?Etc^JvINEQ0erqH=AYz2%7jya zH_zASl4r@+$>4BM<^UZBeg~Wha=)-}4p`vtBk(lvQ}8TM<~*Ja&I8W}xeuvxfw&jv zEnxi*;6<R6*+NjtmgjF0b0J@*Z#9Onhrn~3vbEkkDz%FTy~3p=WZoeIO9puR50p#D z@!Z3+$3<k~gd^x9g;K<8u(oc#$_%TuNM@GUH2Ho4`+ML(nYd>5jcWd@+vSOe{)FUl zf_f@%PibyzV8B39P9s`-SY}_;BF$%q8e7IMWOG?WlYp58U=K?i(T_uya26RBxPg*1 z^<hq(nH4YUl2GMq6^s|;oRJ0D3*0f6MIJRAMCOLT8QEx>rB53AvvzkN@FVQpz}c-$ zOpKCwx0234jo6lB*6vhhDoNWVh4W$<l<(*aL*hd$w-T9Y?XpOup*Ui)J+(E@`*(Oz zL33Uo(UfN!oDfnC$3N`S>1DgWmm^y|qri!0J&0yorm-AH)4?L!9))F;mxKJQNLgkH zaZ6bCaZ_lID}lL8e>{VLAtV}>=49PZ2ZX6adxX6gH$FDZmEI3G{&|yV&1C&We_ak^ zS>H(7b(Y|;*0xUOI|PdyKXP2l{Ik!gm9m_?34Isv+u*Sv?+(zpA7_D5vCaYII6fDY zF`f&+a_~Zsc^uwCP-@R5AoD0Zu8#||z{|k`xCoRv?~B1j;I-hjAlJ`2CUg_{4(qpq z%zg5112?A}?f`i$g2%Tg3wwiifn&kDL3zI69&jFbA9x;kKPYoWxDGEo3;qOr1$+SH z+~sjyuFo+%3~ou@dqEi^dJNnVd>q^jd<x8hT)*qHo6Et`tp6OG13nM(Jdd{mybt^Z z*bBY@z5xCg_$K&kP%86l;2`k#;BMd_z%=+4SPC)@P^bal0p(!+Ggtr_7bx5XegyJ- zfcG)TynOEya5Jj(T5tsTIanc8d;sSva075ESPV`BHvySb?QIG&=h@o~WUjNfH7JM1 zw&17W_Mn_3b_5RscLL>r*afTucLisHdxGBw_X3xIdxO6Q)8J-Qz)EmeunH^%tHFsN z;}nHFcmVhv@IdfJ@L=#>@DT6?a5VTbcsRI0f38u$O~7&B7T}R!6*vi;3?2oZ05aZD zXakQ0PXUhu7l4d^6m9`e1n&du!JmSRhZKGbHi9y?)C7J4GCoq+b`!=Lz)G+kl(C}@ za4MJw^C06U1?s*x8@wHy3qA?X1N$+?@m+9tka3m5Fz|Gcvhx^UDUe6+Y;X*C4#+mW zbHP^d0&qUK07UZ^f;WSggAaq(fUkjz!6J_5>%eK?kHDGW?cf~n4)6x>Zcx6TdJib) z)gN<=#pfeGOugEhuzNxITAaV|z6X6aUQb(mai&50p@kqAq`ZQKeyDvu4Nsq(-{U8_ zMM%z*zH*Wqg=pIJ?v_^Cd6}eKj<y>==EXPg9z#w5?Rr8?g|^8P;_c*5#*A6yq%;OJ zN$`>eUSHPOpsC2&pot*Uk~i_$8%<bFzmxRzn`_VWEWbD=oi3x9L3z<y&{F((m|s51 zq21AX)=hG}!O%Iu%6WbWO#+K-w+#%o+uZE5@X`RwasuJfqF0icVBPA!%K1E4WZz9D zzoiIQ`T9tzo$OCCug^J-1-n^40z4C>|EJ^lWLKY6J`!AvJ^{Q5<oS!jL*OysFF^Wv zg?GUdz(H)|M6d>|0}lloK<3zaQ^DzA4wSZj8YsPjR`3<@B=9fb3{aj|>;Ox_ncy6d z{*#XP)7LI6WnKE3Pk_?b<oZPWn$q{;{8f<tmh?F{1WyO0fXQ2-44e;+0?!3yUf_8k z&tGewb0YXX)~A3A!I|Kt;I~2UZ4@p8si1{xz$?HPLFSefehK~nl(zgj@KBHrOCb;5 z2F?QS0Ivb>0<Qz_2IZLhj9>hDsd~b>^z`Jp{h7&QZW<R%Qd{$_9qoG9)nFSe{R84T zkN1>lg_IXuNLNzoEd@#)on}5GBo((FVK-W9x+CFJRl`M7Ln>}Y<EB_OJyZXU8Nm&= zl*aAUK1>!Pf4$Be8dAIWK@C$YrFQ%8cA3n64;IP$|Hs^!!1+}D|NoK@6^c@+KK6+g zYoTN;*|LnHRBC3-3^SO;EDUW|h<1u1stJ{}P*EzCEoo7RRux}F+N6|9^?$z3x%bY! zpBevezu)8We?0!@;d;(J_kQkj&ilO2`<(MW=SpUE=RRKiE2Ndu<5eiXy;blWxCVBC zZ$ixrdJE>k^>8|T2mTG;g_XJ126z&DA5MfHz^QOEl-=<mTm`qn3OvI{@EG_B)ZE!m z;Z^W+m<I9vbF<+NcoW<S7sIdNf8aNe^&p&m@E7<!JO)|W4<(Zapk(bJ)cnUo@NtMu z<t~JW;TP~9Sd(<Ah~MC8@F>WfOQ!}r3*u|&UJOrwS3t_4S@WR|l#ESei`VNtiL1ue zg)P6VjA;gs5i%oSEjY;!RsBB#0ZSw%uB{RyDx$`Nyw=Hn&@(8nkA~9c3XBm_En;iH z)8HAfHDoTF$?F)@J2fVs;^&2o=33HinXsVjJDIvFZH%2s;BuZHqObJ7uBucm4dj{) z*y5`ty<VY-x7CtLp<X}YtsQQ34CA0|V}iOkGNFe5n3GdvTYeIB8)FNYT1=`JZq-i+ zswYDA!gdpB|5G|C-A`e6ix=O4bXD5npKAPmyTEkzyTNG?e_B&7pwrFxuKcq%5#Jl` zf|o+o1AU?LCkY<Q^UFW`3V1oZ1`dLgA#uj`m!I~->|YIEf!D&1;B|06Ooe|z+7WJJ zo;d@ygVZVR04P80L9h_&z8l%%Wu0en8WYd6I)z7&i+{0jLb-yG!gb?>UwIV~{{M-+ zqAXP2EBIN6o={&%5cEFEzZ%3$@?!7e{q>GBU|%SIZHWkVt?8e75KduV{@U_s#vX7V zhNQjmWqt&%XMZ027|w^%o%9;G4)=Q;wuXz~1(3S?U!`}^5z;$YC?JWO_@S!*htVzn zU#Is5-e2jx1uDIfS(Dx$Lu?f1Q>gU*3@W`phf41+;5zsvRC@1#O7H(brT0##^xh4X z-rqo__s>xBox<Po@_kGttM?o@_6X^nnVwy2ba_~ij-1|R3RSroP{KpR3H(B$A_A{& z5@|wfW5`PfFO=N;bi00;^k4(F{uOMjoy09OqL^6Uj4)j%!I{>`57wJ;gA=Xt^XD;o zH?&QGHk_n;`HRw&t8-P}uHz(yaCuW1^Mle?<*g|Z=tC3e3N!lhBzO@q^oyGL5of|N z?8hMepH2g~2sVV+fDSs$T?1K*%KZ$|e_`f5o(&VY_Bn7SYy&BiPFwgiyZ|C=P6vo= zIP?-3JGmp|8MG#h%Ws`-Fc0>CMUWLPjDO6f@D=v^!cSm-_!CTmtVQLZOHJR$Ww0SO z$K|jw#OKD?$=E&ab?jda^C0~!?k(_I$l4=L3S_Mj2fN7q7^cH-AZu#5tbgGQgOcA_ zZ1M72K%DCQY_{UE@~e+}CI|A{f|L9Zm0y{di5!ZP&KOY<>69EK5E-d^RaHvQ_GI&e zo=f>oz3V8C6-M$Nde%`;_DME83zFt$4heOutM|x<df$C)iE-mQdx$%cZ3o-9vhOSV zK0U*H{MTO{M;+HO&h|su7gw@`UR-I>jwo9o^71mWjq#osM0tk4YzyMN^Rlz7yPGa= zf0><STd<S>KZdacrC?2BY+23EDBy$5jx{#o>ngo#d|h=jX`}adp<aIiR2oi%t>CS& z6PyZ@ApTxPr``c4uzx392=9U~z-e$RoDQW+?}OOp&P=E@z8@+t9%PFjlR1w#J&W%D zunZy_yt%}Dg2sOA=HF$&L=weY#82w0Gy|jp`BtYipwcdpn^+G)FS0c4l#hPUvu&@A zy$>6Ck!z~kv|9`H%x^-y+ab32ccacX?}km_JQ8`g9*9`v-4gk^AIb`sG9m8W1{39J z+vvNca3Jz-zCWcsJIf?MjFYUidW}daa1}A{l4+)UMQJhm1SP5YQiX|2ATF%b{c`&W z@qW;IE8Xf6@tzmC$4j@pP;JP4Q1$nZP!+{b@KT76j#&rlAk1L@H#i#p3Gar7;REm= zNSmKdQ}i>a2)Dzd;kU3V{1aA#r|>-0VLNy%>;P*(wR>wqY*^<+=)&6YUU(8zzMTw} zzswabqc<O;R7ytX!jee-Y92f*M0+2xGWGrvPV_@Ghs&+zS8{G#maiwO+$`V7fk>81 z_@@SuIa-ucUlLBIfnrzJv}fm-{mkI9S!TaD_+grn6-hxvR{Wl~uxQA{p2mqWw*D0| zHLWr|iykzc+l{!e$oQQd2apdY)Mk%K%{Mp7<Ge_n5N?mX#=)bg3kb4qX2E78IS#^n z|293jpl}>RXBs1$!4Xf?%Pz+mzTy;4eA8Z0$x^~@g1KTUsx;!OyOO;3gYsOm-Ij=@ zUVH~+L~?K;R3W+u>ZKFmVAu_&!|ret>;<ofm%^E_50q}~51)cb@MU-zd>amg4)?ke z9uKdEr@|rdN_Z_C0#l%5ITenFL*Z*M9d3lfAoi{^9AeixSy1CUBcalk`H*IuHy^fV zzYxmjw+P+~$HK=T{%!7ya6Eh+-T+s^8=+EkBHRHd!FnjqTVV@06?TEQ!QSu=s6N1H zFda^ZIq*KX2+n|u;r)<x(VPe11~?lYgb%{g$&WcuYi~XTli@r#5zdEG-~y;JeD=|0 z$E{DVW7k=&1m{M|u&1Lb#@24<h5QgIzuvetRVA_*9k&kp*-MlrHFbhnUsg5HLZW`Q z@}F8@o#AWMQhU9KdsxT%)Zz@yHf3m(=!Q00vTj7(+U%!uR7%Y|$|?<BEoTqcWio2p zrv5_@qnsrV%gPu<C8**mYuEnJe8=0^_9_S}TJ|ZdKA0Qqk1+Z{YRJ<z<~lvOPK-F7 zI)jpER&((y*@)h#$K#CGnI`CQ%#A~jw45V(SbMq@@1mk@29;H&8?cdpdI?t9&9|cv zdx`AC8+r#aS$)hrQ>EaUiV8B43i|0n8Y8btd}#{%>-82G50#Bv%Tp-@Mw29RawuiZ zSLjSC>Fs)QcEqYxlBN@BpR;sOMA~X0@t(>p%_H+>b%T2tJ!tby3UU%ZiC3B>#KkMk zB;q1UQ(3r@NMDz!E~v>}JTDV{vfa8l$n;#oiQa=1q#0q01rKC1M;;OOslvMRFyi}_ z%yJwpxr{2(E+!kyk2K{$<MD+=+jq#y;e&ISvhi*OUAVvmne#G~Xn*npn|`^&hOsDF zne*{@GArYAzAS8)^FvMpy5}sStO&8nv=Ja(czF<;S70Lb@@s>;X;diw(W-K*3KUxJ z(JHZP-zB{$J9}I!Q?tn*!-^9(<Ms4R>!Z)4yYC_@^xKx^w^GP9(vDNb-+w*VZh-Mc zP?pvWZk1ymRqf^?E}`HLNi{sq?)R%>hp29k+wW{&#~I)qzb$V6i_pGr*R4lq`a!x< zb>E9btnlLhsfvHJPGGFNH>d#Bp05b=A#(vtJN#%kmHjGk20R{af;Hf$unYVF_JECe zuU@bXycDW#>kIFMNl^9f0I2cOf$$wT82$p8GvNLXQ(!gHjB#PN8BBv(Z*v%=-Qr}y zWpE@^9hD1v!93Ux=EG}Y0nCStE4zho47?3ahBM)<Q0rMth3lbwF?PZ`q5M1Ufvn%? zOoz?jeJ~F`2<O8&Q1esf!j<q*xCzdO+u;-N0DKD8B+cc6p?NHeA#2<j--{f$lzrA& zGd>rZ&my0TPoaD+K8NzTVErp+1w5OQD_@KL@C}#-<#Uk%*TR{Q@pAV;_!fK?%GW|A zegoVG<y%p^iuJ8H1<JRgIotv}!mY4B{0OGPkD+`FK83TPd@$BP=3Kbn!)>s3Rr=@P z+3+ja3GRToa2K2mcf&bwFMJ$+50^msW_$vFhA$k$YVeR}cm9Fg!}wrqhw{OwipHr7 zhd};zQ(-kIO(Y)-#`T>Va4xI`HMY-O4|ff$1DjC><ddO!52wN_pnNmt!ZY9xFb02y z4Ipg~2Y&-I&j5b|H-Y^o5c|vcY}^c+v5!4ud^R3~=diyNwuI|pYq$lrf!m>cH{}0+ zA*@I_?+DL=iLejs3<tw*P=5OOHMrAYFZcrN4c~zB-H?BMe|SX=$`Kq7<*V^9l#j-0 zcpdx#rocUrG;_a$X;5l11J;3=Fb3t5F#s08YoL5HGNF7jX2a{@d?=rcXQ6yDRzUK= z_)E(dLw?fo#b{UyTM^1HT0R(q;5~3SlrP2@C|``*;eAm4&@<oxI1?U&8hsGTANmm} zwYmTff{($g;p1=$TnHb7^4WL`J`MN4#qcOPDxQOFpnNy3g!0|Uhs$6gd<jm4%i+`T z75D{Q0r$f<V1?S0H&_?0f@i_iup>mq+<tH^917or1#lgl0^fqO;Ci?Sz5`!}@50US zJ@_$vAMS&j;ZN{Gkz()%TYUeY+Uq=;#x9&k%h<pez~OdmA}9KR^5zH6*Exy(kf|%< zLoFa%NyhcUq;SA9ByHD>>bZ8o+5azkD$JO##*>4fcaQI@SWA0B>G391U&T7u7`_YJ zzzy(H$ow4BSFs6Zu>T<(4L^qJtM~+}ui|s4zKU(|Y4|1F4tKzB;V!7Yim##iD)zv3 za4+ltzlDP#^L|YG?nfxoXFpV5#Q~_i`xz>a@8j=ypLY7Yon{<69nOp7vHB`xAgA*Q zVEg?F)7~lJWIsgnx!nGWC7c_|c(uf3&D)Ik4Q<c!RyI+LgOS#O%=47s7ZMf!R|Upi z>dCQikAsY4Wkw;JKf<6mNnpH@ED?+t$zfY|B?mXN5oEt*!jMfV^F5EKvYicnCyQ@w z(g9&xEVATep4B586l9K>4#orQ95PY%Kjn#JuO7SKdGW^|NBzRz%-wP?fVH7yjX7M# zr~5RhSFQ)g!876QFa~GA25=E<3}1px;Tw=SU+!Ai9O`YE`{nM0ts(7Jr!8y(+re{S zd)NvxC(Nva-Vx@rp9m#$U7=*I2V4nz!XIESxF7b0m3hB@P<B{<DB0Y^)-|p_US)@> zL_SN-{D^F-4c;wdSStP7<;iFZe&C0HA)|?$8z-ZZsv^vpG9Pa#S4JgY3H%}~bGGYP zz9dcxn;-N}%3GNp1HH&h(m?M?eeCKrN5J|p8|qbZVGo!Gd%*&D4IBfNHe;dEa1L9% z&(f8|Rbv~#wxBc(@e@qTrC8?|r7=UlzzXQUo8%Ensd5uTkxGn6!3yL&kt2T4vnef( zhHbpan|T*KuM2C#39vDo1oaM+q26^jwsgFoN#|O2ytN&CJo2u_Cz39Laml`)NglH3 zhp32z*RSYq`fAEmY*MsVQ3ahhQ;CYS{pHQLm%G?Dc0p!penz^t9D-DeRFX~2{9IP9 zRl-RP*t5O!q-Uh28nF4!E4H6QdPe;gUR60pgHxjlQwvQ0fh5uD*utW`Q5jvew1R0b zy1@b4i!&+MA7Pv?r?PLaXnyFAj_7f3;E;Wc%#8dD)1Q(aM3r`I=%tH;c-vqfnA<J2 zFx7OmNEz81WMwC3<fQv|P#G%WSXh_qQd@|#Z&F~Ag!A<->HwP-zLZH6|6)qD{T#JP zDW|+qUV4^SJt*OwASJz2RAf&s5fNiucWLlI;pYk09GdTb2g-w>OsdVLLwV6FM<0Pw zwWjWu&;cdU<@%V5p0Tc;hYR5KmzOtcT*NtbE62W2A<-$dOnsvK*1Et-n((8@RiP(E zjG#Nlf~)3^BISLVF+B(I9Sv2`&M(oDAm}b?d>`p9qc}zdq+m*aaB7})W7MtB{x7%o zYsc-Jr{E9z^QUxZF>PHxsGLi0+)2bJFP=7w8TVfU)z|(el&;(e2f<A+6>f&va0`^| z)5bCDWPA#xKR<&{z%Sqn@JpzAatGW4cS1eSZg?t>`ZdHS%h>~a!@ZETFdgP1yQ%Pd zcpLlyJ_mn<>YreaviVlT&u}06zd(&8{R-vNcnH>qzeCvrhatWM&fl;%{0HJI;8Z-` z`Z^v3C$N7sd=gfH&%vrtee%`em+*L~Z#mS2CGZ5e6f!s3^i!M!wQj~KP;(*b!G`d3 zm;ht29c1pb+Y2^=!(kJ+9wxwVU~^an#eNRVge_oA%0yduIb@EtI~cZuDl47fE3h-% z1iQe!up2xCyTgPk*cGrZ><KS}z2HcADZCH%gG*q4s5uHr@D+GDd>ameKf%FJa}$`$ z?VbpS!0RA$y4`%30q4PCP;(E4L(Mf{uD4r{%6lXn1V_VUSODo8ath&C$Q*F9?!-9w zEBn{O%9Pm~VN>YB3m|jEUE1u<BzOs&44EI{+zM$!JGVjFl+NAoZFmo)4d+aU(g8Ez zUN{TZq)g0#D)1#R6+Q~p|F8gReT2v1NJ{n7@Oroyy6|~;JA45?50^oe{#W2?_&VGN zS3(u_br9Roc?+svVLimAbKZg2GtRqk0el~>g&U#f#eW2+z)#_wa2vcIegV0Mvje^j z{{z2=J7F!1Bj&ujjo==r`R03}=9}+>&%^KF*O1@1?P^lK;3e>9m;{+C?-s&?a2EU( zs$bzZxE&sXmC!4PVSR|<={APd;ZN*7jts~9i*&)pXu+}ea8aqffsX=h<8jHIrMSIW z!QE`tEDLKTrQ8n)lpkm)M=TH4%8ssLCfBd%>RO7i&fn@ZPNupD<{+xe`x7G7#nHb) zZc*W=EGA28EJFHKz9s!D6y@Y=CIrL3s@76?5L+3ACqt?iKRq~-<1gl<=sSsSz{Xlg ze#NEwy3~S+*gI<Y#kjSt`fbf=Yue;ubALCuoV~v_a#Wqj$cflQs#GU&dZ_L!HE?DG z2dsf3d&8b+4V)78%Q0~DMyikPq2S46_w?i!Axlq*DElUcR??7mfwj9#Ri8(^O<Zek zB$M){^*D_KHnEKDq}NI!s*JTbH8`(~;k1N9M>3q2b1dF)+C`jw@iK<f!tkZa7*0-* z-eJQ@iJr;tqOX@f+!zOKIAD!~Qa9?s#6^rJC9yGUOu~6dJkDhPTF$l48n&q<GYLVS zL}Vsv5S@TxI-x4pum)EfeiM?7QiH2S^gzVmYNs1<f$|J4Ris_H2SKLLMVxvhQ%H3; z<H`zWaB8>Usxr7juaG>>7-T(z<Kbi0JnU2Mv2o_QiNUe>>)P*&#v5~8D`85YP6>L0 zBz}IRH`vBG)6t{^jfM^6)cX8wC-KK$S0>7?n&xD^u0~{RBE~<KechDcc-hxYFZY;z z-NC`J`0JLwt{%-cx)1O?;qfWyY1xb6@u{EC>n%8swM5)R_zN5W4??x6e}y^lH#h<Q z4sVBl!295za4xJ|)B3!z28p|r{i<*!<WuGD7I+-|3f6$%LX^Duj>d_Q`65nj$b1op zK60126%K2dm~Y^m0%cd83YBX0;O+1X_yRl=;;Zb?r*6Kl+5k2pGnznrN1X&HAC0r& z@9<psH*5hlSGG008McL!-~~`~WG{k45Ej-*aZ_O;EP|ckZLk}B4)%bb!rqW?OgWdr zKVd&uo4S%Z*G+(z!LD#1)Hu`?a1Fc)ehC=^aL-2}TnG2SG<X&ESq8ig4u?}=7L;8# z0)7Tro5kG*v!RMUb-UXcj)8;VSeOOJ!Ex|<_$0gmz6)=J8{tjx8|cDX*lD!K-E-k2 z*cwiTZQ&H?!n@!Mcn@Su%$Ww6AM8wr%*&O=bKAk0a5S6)8Pjkcf{Z;l55w8;QOFp9 zGaqU_t;b+J_yp_*7r}w>DX4KI#zM?GS&O080(>5>f-l13(KoNc^B^{j+XlW4rLtDR ze(+5=2Cj$FPw&9j;Jff6xB>nN--q-WI-6iOxEacx+Y0HEaahB~eFjCc18SWj3ctG= z?t$;Yy-@2C?SoP{tZm~~LYo|f=fdCM#qbck4*m{P;Ga-h=P&p)q}Fs_ffb<E2RaIF zfUIumQWl)bki2)Qz<gL8-VOPJxmkbb1SrK+8*)vj4m=67=VW*>WNjTc6P^a|g!SMO zcqUvAu>swKsIulz>)V_QwZ2VDsC8{x!HeMeum`*Vj)e3*x%a^K@CA4wd=GYnjcQY_ zpvH9);Q)9EOoKh(^{^+r5B7pj!QOBU>;t#Le(-z96g^iTj!uI0-~iYf4uq-j3OEm5 z33tP*V5^hx5rY%pHSkuL0_Vb^a1~60U&D0R{A9`>><qJD790Vm!IAJ&m<RuYqhbBJ zltXwnEP_dpF*vsnj)k*eF<b%1!*%dRxC`C{E25`whA}t+HiEanpAd)HZ1LaRIgdD! z);WvqUe5IbeVdv7IvA<xBZ`<P{6BURmVwre>lLvDvoRH!NQ9l<m5S?1kyZ>PD{LP{ z3+M+uo9Y}?YTzUMOC>vgbP(#9{crRAw|BcQ@@`}PzkIj9ym$NCd$)g}@~wnAD*pR; znvaVr(RVMM2O{rg`nr;h=cj2Zagra<(SGp86gRSOyHA52*d(H?sqXnNtD7*7NM#W| zrScNPVo&o-c9}w%9BI~6M@#354<;^bPU|X#aaTzXuA-yGaYsiD&kNlng`@T!R%XII zbbCplO&lj^oYRGNDIohfnW^mS)>?6v-d)5ky2dT@`t%KU1zBs;;K?Lu{|daSBR{}d z#MrlIhGIT*<eB)(9Ma*b{_-n!enpJy_(Az2*{x56IxiIt9<45UWEN^}z#-Ti{s~*b z!>~R43noGy(~N;ufLF20>cQ?vSP4F-!%(kX74Cz_!iL<7cQ^CYPlUaAuQTCr$P8$= z5H^I&M{pWJ<`+1P;UlmK)LJ4<;mhzWsB}38Zic;KMG9j-SRdl!;wHi*I2O_;W%|Je z!S~p|3Vsc*hLY3k;7>fK=H7IV8>i|@J+AWJ0p1mnXUUtH-pV@6*~#o>nc3lZD(2FI zE)kay`yndg<&HXR=iE4%-%C^jHk$d?IZh4K{Y228Po(aAxw)NsVI}SM<ot}`%u`SH zek0M73|oC?Th8k5xBDYZw{8peBZW&%!coCV>ILvR=hY7&p|!vE?qoZseZ?AS`KlaB z(8Fa;C#Dl8A;gVSzUp?thk-=c5@Fk#{z!nGBd@3EZ_=T2etzmW^Wcg6;@+CNOm;?g zE^9>S!Sjf;*EYV1_UUxM<v@&0eJMG^lgFCbA>k5xIbwPUF(BxC6|lZ0sdb^Q)@31l z{;QmD2O>mJcftZgT|X})b);#Il>||?*Fz<FVGze4i7EE+MPJ>pt1+PoN`tk~CU{;( zJ`?*)_8Pxbbp|crXb<z0NTC|O=Gm7AzcB)86G2*I1qW>E=>4rK^D<Y5R|dcH?!y9a z-r>?_nCZ8df43i0PNY}Th-l=+|IGYJm7QPUMera@g1<uf3*vun{RQDo>@zCiE`!Yf zcVB_kq2ByB_%o~l)sIsX)`6N2sD?Ci@yz$fXrCLOiPNA<d_DLO#Q(v3%USaRnG<T} z1#X9p+5a0hg$>ao36RY>3(9{`^8?l1ItLDd_!1gF!j@3J@vY$#ur2%mYQErausy6z z8ff02zRj$8gZeI3C)fsdhFXK5D;x*A!JA+Y_$urPS3-28`vKHELJ1|$V%8=a053s6 zG+!_k@@%ezQ1b(KL(LD|2a{n{geV0zg{iPR918iCu9-Keb+I$qzYAu;d*KLJ0yW=G zLYM>9o*M&e(2g4mYs2v{AKn1R!kge?sJUiq;Vp10oCIsoo|^*ChErinsJUgAK+P!| z2hsWN{ct**182g|;r(zsd;lJRvtZ?_W?dQg6gY?dF7P3k10RM3ums)*=fU^k0{AUt zK7+d-l6PjUp(kN=+IfrM$?z%I6g~q-!)GBrpw41A55553flJ{YxD0*+m%~3Gb(D(_ zqO$@vq+C!}nQ?(Ppz4_`k&#|;^~?|CR~wEg|L!ioo-sy3GA`2Ar6!p**cgMet5LfA z)DOIwAO3Hv0L4``Qgsd3f~rP}s)UHY>l*EfO`*zXAu;ilkK(0+?9WR_i&ZHNA>L}P ztel*T{4QCAwmVn-e<{&prZ2B=YQacjETsn*v^7>{aPkP#tvHDN7#n^-S{taltwdC_ zv>-N81u0TBi#<J5-E<=|T;2E;SfoPH+YRPK`xfSAW+XRU4Lpw)IhhhlP_?0JhF;os zQc6>o)~IA&psDkM)9F&q$hW75FW-_AI@-&tmMLa8#%6oxgZd-z!;o(CgXBtjxjhkE zy!iFVVH@_}hCSgs@Cx_|d>noTpMu-qQurnO7=8t}!R>Gd+yTFZJ7IOMy$eb|?}jJ9 zy|6R<23`mE!8G_i91VYjC2&8~oTZ=OYIqQS2!Dk;AUf5oNAU-&L)keDJHo%=)$kvf z46y-S%DQtDlwM{nBA0tQl_B?XSozUaE>(kPLe`ygm8|G$_exj?N-uMcnUho(YTh;L z(HT4P40t#D{MLO8Vr!Z?OVoEpZ#RMO5}yDM!{+c5(*JCD20Rb8g)O1<H)|uA?-jI# z`o1B3ckU9{9zG8*f^S2f(X2U#P3vxEzcZ8`k<A?M^Y<hAu?NRKg44?Ak>OGvGFNSb zLq=*I3G9cE=J4h?Wpeb0bDUfbhO~$Z%2Zv=m?EXNsY=8&;%$itiMX+_f&)fBSlO4! zlNcO`H+fV_+XP3m?OZCErTe*e{U&-~t*V)tUvPP0YT8JnElRuf^D_#I@^h{*?RynT z>6NJQWL#2%>mR{BmTsG-`!zM?Q0+IID(wwr@~ZPcM%~9e+Hr+U>e8(~;e0#F<2|3T zVA~NJQCAvEkxH;#5hka&v@s?JDw@rAepFH<vL8`cVa@R%B62?>L(sWNJQW>ZK?)h8 zRUPo9My^S&fx+ur8_;HpZ~h(N3W;3U50W|Qm`jLg<Hdi0j7kpiH!y9*ub`58I~)Ud zK-qk|;1swA-UnH?z^vJ^AFgEoC-@d*?w`>)zrwxj{|Wzulry&?Py07K13L6goC_<! zw(uw@Q92r`JzW`I3#-7Puo|2TX$PA1sE&o|dp{2DgtV94KVcnMm3KP{YF<uV*a0%n z!^J*x>cN{Ja}(X;DEpLmGyjn_queR%$Kai?A(V~R2%bR3G=|a%O<+1~29;rF!$;vc z@Ktyo{0z2+jj+WofS1Ge@M?GwoCsNy%Gh$9q59;zK&>;`4Za7_J1*awcX~qF+s>u% zT-XP;hJ9f>m;|-X<N&xFUI9-apRa)@!)sv+$lOb}EzE;g!UC8D3*lX`2+oCLpnNs( z^>J6haZox;c7A-D`+m~92JuoFPnXeQW|=Ib#L8=Px8Qev2&pr#TPcx4aT=?q&W_Vq z(f|oWdv&-eIx+Sm#jJEZ%H@zB^z14N>Q7NgRaizpr{3p97=y1sJ?9EI2)+(y!Z+Yn zxDtK_S3`&Ey$Nf=w_qzsAGYxce+Md!-h)cZXW1@^vn%t7)4gSRJX3yJmSb0%?u-9X zQp%oFQd(=#S6aQ&i~C|YO7+Azc!cyz<d7fqyh=YrH1HeU%=_sbK7=v&5$p~>hI+40 zpx%EMTfE=s55(!U_p&_|d4JV~>cg??9H=U+$vJ+g>i>bNtHr>BeSwhdsPZy0LgBEJ zcSDO!DCrK@(g82h%-RhiOK0bYev`;yZ+fulPBN)RT(n<CQYZbpTt~d1cT}3yhEIEO zGf5M@?)|U<oDKC<bD(ORxv&pp-i*=D55tk{KLQJ23A`OX3h#yU;FEAZd<s4eUw}`* z*Wp6A4n7Gt!$nXs{1p5e@|^;sw--a@)jqcPzT>CSi!_&<$KkV)yfS6JG@}wZ$q!{S zDv3j(jPivq(!HfBTFDXLE2SKbNNKn-P3O6~*!!xER+om=5SqDQrfwV4A&Aa${2J4a zAtX>%{h)VMo+)qYdGWhR8@>P6P<gorHimoQ`S4q)`~L(7K)(54)@b<!KE(b(xCZ_T zzk!F~@9+<JEcZYn-DdDFm=FJk55o#4pyOdBxEWS~hhQ~WsUrQi@Kjg>s(!BpWp~$x z!{AAfJ^<$wNL$@G4bt{?&VaNvoEZEMYzS-e-i_e-uql+iodBo8v!L?6Ih2fy;~C=D zSJ7M<iN=X=WJE^t@^i5i3t7M$V@btXa^Q!klt?5}IK)6IMKn7%y@-V*{4P|DK+=Eb zU(HM%mbm2cgJaDx+tKe24aA67mplVT$xO7?tY8}Dx`l*kUK1Tn&(GqUd&Y#*>0uKt zEMT{BtQ#94#_wA|D`0$OFC(Aj+xS133l(S;((n&soY|L+;ESMrjk0r`>u^r4Ig@(9 zT94jjh%uhH`mPqHk1woel=gb3u%7A6@Vc_03#<>j!sf6y)T<;xJ=taON;n8+L)x3> zn|4>jaqM3UC&3grAEv>@FdaSzv*2rR1eDKi4txuah8rMBYQBAkZRtuj#zM)^N&Foz zL#ikB4hz{vl`lh74n~F&ImHiUWr&w6D?@{cJdzBhaE#FsUta#bl>E=c;WTd3gN>kG z9O-+T$4F_MPRcW9+5eO-%3suy(%l4Xbfb%IhV_VX`G-h5x4>3#GSsc6zya`fs6L-N z;ZS%FWHaBBP<r3XzVhWewl;CL%6Q`HvZ;7vNAg8=^~j9;9KX9uCBqNVY*9^}$e~aL zpqjcTQMM?Vk0F$PCqh|h59FIKTG}IOttlUC)ly#hch<F)J{2iLv@wU_k6&)(qKRM` zoTs4id%w<3F){W(y{oQu4BJ2(W!A#g`)?tQ8o;fvHT(o#3_pdGE3+0Z<;kptn-9Mv zUTKCel1bata%5ifwAyfv*0IYeleXTlv;ETjN>1}b*~Hz*p-|#VGxB_18rmTa#cdDb z?7)NK_7bP(WXQ*SbVHTse)esfICuu7X*;4L6}EJha^2=tPE`GM=D>Sw1j&0hNXBs= z|C1|{=K3ZkHPaM;u<}H8g_nJu#IF6d{~enJrN15<Dn3R(F65XWl*Y=_6WHc@k-W3% zYug9)m_NeH;m`0cco52-It29!|G?iNcE5WZ*Q)^KLq;3dto2<5_GAATm<6fVjqe!! zZSFGm(S7cFur_=jo(wm_x=`irbpDPnchaNBv#nywjmU<En5a)jWu*PLDph48h2P6h zhq9rmF6xrWBub)86!qdrYDhCf#;+aihg=E^&H3e)CCQEQ-O5eb_2pF#MzRs~2$Gvn z@zf(E5|vrof2w4Ec|VzEDyTA?6dHI1l|K)#%~G5fls?K=Ud_x)Q8e=<U8UK%Q0n$P zC|j)sJO{RhG7#y5aQne_Fc~tp*QG9VE`)mSi{TBh6GV49UEmY&5-5G#9je~z1(iR{ zLoxX{g?x;!*B&KK&oBq(mCeWejL}6Ip2JKEr}?3(|A(WdPPs$Vd7Ki;SrxKkqUss- z$aMof7|BrOozm?{c{iM6z1Rrl<ekJpIUi92%1{;Wa%4&w8ZOq&IBf|VLC-r71`kq3 z2i(Zfqe(V`s*AzUY8n<=%pFx^mVNgn=6Z7)-N3%YNM1I2k%IC;?|m}cT15~pBj1!a zm&5ZQJ#1#K?^RG~a1F#Ja`3Wsl`bi8GNg~nr7m^oH#atZ2Gm=zuD@w-<v`g#d2lPF zU){93ir{|s$HKqi^-wQ(BkTqz!9nm=sQxfIZrxiT{Ru8{&U7e!f&MAePJ4|wiPuYT zbVSaqd%wIQ{)+|fs|)+trh-vSkyKPBR}IOT<}TzBWwXLw+$s=dk|faPsBy!vb&9V< z?1j-Rx^%hfM)zyMCE_ZxcEMGxva#JfMkj3NkROx=%45C$7B7<YFt#vlDYqeUFGJ~q zSKx*4b=VcY0aM{BC|$4`PJwHoY^68hGjKh8A8vrMmp*{M!7Z>V_umR->wXMl@Dtb^ zeh$$$X5Hhi@GJJ!qq`j@!(CAQRNufC;15uF`6E=G>t6BwD0-e6Y|>5n(L6T;lC(^W zr<NLCiJaqys{S8FxhNx&h_MYXuT`WntpaC_W<2~%YsXwoc36x<t7}SskIEXF&*Yo( zl!aeS*bB=vOAm708r<HBsZ#kRTu}kPSQLTnPnl(-%>Q~<<t>K;eScj=+Xs~aRgP)* zn!Ftj+pw>(bLsmLFcFS~()$`iSGmrHv~|pywRvzf`x4*+cpGFa$9zAb2tLMsF;rTQ zgUS=-V|=}>w!5_4OjuMVPyC8bIkJ(n{7^PWwsR;l!${?BFOg--ox1s!a-=?6@C~ix z&=<*OlsRa>NamL|tIbX3D&GfkI+chrH~f(@$w?y7k#P|{Rbg;`_{(L={rGY#oiF8U zYYMyCm-p?9<wW~IX{c{-)h6O;FA`ZW>oLrR9f-r0GwU%t46kDU5tt2Wr<yU0$06r9 zPr`R0^|qN$x)|<f|2c>~XTC$C^7;b%P2f_ffvJ~af4Bmwe7+9R@6H?WCb$N=kk>J? za0h?K&sSSVTzl@d1dcg{KWv~hsqN&+0wpUgKO>tlY}$d63)epnhUCH<{F8i^JNT#U zna05~LPN?OL1@}=q`tYH@8TK~nigdamI_UbV{t;GvRRJMNIuRE4u$0-Y!+ZZn?;E^ zQ3BW#(vQx2DsB9PGCeiv94ch<2iyGmU#eGOL_MoMOx>{F#+m<>7m}%y*dtF(c#phO z{%nA%?>~U*520k5b!4c!&3d5QAadk<0g)Tiwp$6mVqf>z0c&vmT~K`+yWweY4{Qwg z!t>x^*a`jxC0p14X1wbkh;3ln6_epn=zQvWrxJV=R`coru3KhoS-D%6?OwLAr835x z$j)hL83hI2e8}$kT6$69rF`{6RsWBmB1j~rj0E*0vaH(i>kV6&J-^1Np{8M0&rMBd zCvcsJ_K=Q<5gE<Vz`r|%Lw?YED*ujw1HDN4XkESg8BqNnF?cR)1XCbs?+$}ap$x<X zI1SR@>MFgcmrdEdjlbi^?DeeG*z|VAk#xnYMa8#=K5Lo$zfM=BM~rJn(j#QowBwi` z^elS!N>GJKL2Vj6UrVSoXan`EZM}DTfWPC{CK+1MzS9smF7i%&^wmxKMm<@(lWx)f zg{Y{PGsbQ05W97!)}z~f|LZKCzE^(wLC>Z4t4YM2UZmP&dcO;y+H&Y*^UYn#kEzoW zq3Uk6&E~>x@Jo0JL=H?F4LjZG!TtiMwi-5>X{*)be)uRFf9HNs{pLwf=`sNR#C5jw zcYOMNfbdDq*1_>*)9>=EY?l78$!OAVKj-?Ps{e;6YNu*mjSY=@*)=(n`+Jjy!;L-j z`3Y6i4v$`1E@@L)za?96f@#7keM`8kb!cb789AS4XIVSGm;*K|WR+97S__YfOlZ^L zGS|s=<>6GF$i_gK*)QSm6U=_G(ZMP%F|%*Gk@S4a+1DFkGvNDSE}p_}bUL&y-ji5g zK=in7u&<}`9#<zW;DEiW{l;8UaH4%B{Wz02KMC}<xkdSQk*Yin)MsN5kovX2G&ZNP zZ~G3%WTY8;b)jM^n-}HB=H1#5Wv^&k8uFi!s0Kguo-kZ{$$Xf66elSOtgr5^JULZV zF*i~{U(cb)2v&T%_!utnJWoQ<yKjLpHag|ZQ*GpLn-<nbDE{XtLg%8YoMeAaeHHon zC+x@n+_$l(*$3B8_1#WW4s-c?k{5pk<v}t(7|QNa+gLXA)i4=e17&v&foia4!ksV+ z?t>%Xk1!k3ALgiSd@>vj(Z^0c><kMbWznG?G~Y%Y3u&Wiyvf}J$HR}{4UjgHX*1JC za&Bh-Fq{ArD6^B`Oh`TI&V{s_-ACbV5MMb5JIy_wce@)lhH6{)h11~(crVO_4?tz= zY&aJ_2$#Tz;3|lX>f-m}JOZntnCC<MQJlvh{ut&vLFsTI`;*}!I16G6y3at`c*cih zDg2QA7vb+v?Noicly`SegRjCEq;2aChOfhsa3vfMSHYX%8YthAwQxCn6TSxDg4^JF z_y>FkYW-2QUmGHE??cT8-3)uc4`B-20(0P2I1ZvaT}kMt@HO}ud=GvBKZjpItw*{Y z{s{jAt5>n#@i`UlV!s*O4drkAHM|h+g_lC|)J=ll!s(E_br-=O;j3^zTnT@Ho8UpX z5B>@d!QbFf6oKENio&0;2Shg9E8ssc16H8zRtPIX%~NG8)tw2Ch6^BTrMXLC75E~= zzsP+PR)bq%b@&-P4xUDNp)PUTz*?|7tPNQM*TE;!y%wGfS=(0MI(Lg9W4119(i;DF zeH%5#K5NK2_2F}{0aX3N^_`A!V==7tYJ6B&1J=2|Z2i+UH=8CEUO1sD$mLRg;HmvU zpJKgos-WNsbSsorP^J=+8j}Vst%Rs8REM-9GFpd7Gba*jRgT8tO)pV_8O=@NfVCxc zprB}|cT8$8fn$E%;CCL_{nDvoG0q7qXw`&0iF<(BhYoG;dXY}Yb%=Wkrx0}2bZDQz zR$m&$7-){^3dO}{2zE#iF>aiR7#u_t+lZ7PVw{~5AFdMcHh1Pw3J7|!OlWUu-4DX2 zsuOA;8A?zZ=fOCeFf#TlyTlKY2iZ+m5wXRKZ;JdJ$NpKcK5Pct!sf6$)cgs(OG}sn zJHRpULMZ)x5xfO<g7?BiC|j}%Tmrkn^{_jvhTiP~`$GKf+^b<9m<;>F;V=oJ%guL{ zZh@DvkB&9-B+#ACK=v2IL2w1U0-}@5_m<E#&Q<KA1I+i9DEnp}g?#?-EjHi2PKERX znfVhXFpd3rP<=sfK=lP}gX#;~0oC_&5NiGeKD|yZyb<QXo1yxCr0>=D^D<Ol&)aZ3 z{1n~*^*ty23e7swH^WxwZ5QJI=S+b3?>Q6Uop2J|04KxE@K(4NPK9S7n76?Z@OJnV zyaRp*?}p6zbMAqakfdo)>p4w__27MwIe2D1MhB>Q7`@;uD9L*iJ`Lx?_u*qu^FAJj z70{Opp?n1w!9@5JydExwOQGgdtc6Qq^{UiQ@HF@ml-_&=-UC;_y^yqaJ0p*4VSo50 zlvuw9GvJ5t9{4F_O>N`H{v`a0ec997q4XMgWc1%MWGsFx<zwRNux(|#u~h%jpQ5km zvDjbocs|!@OmEHz0#D}$&uy$G`>UI%xSJoyYO70B3K!Qbv{bu7PmHJ{HjR_<p#!^` zh*4q*aYsDc(+RcTGC9Q$dTy0dwP&PQ6n^17^)ASw+Y-v3z8Cx*rolg;%Hy9<<?k?j z2L1)#f`3D$!#_~<MP159yzkbN$SJpV=1E>l(~G`=o^<DiY6&R>KPYXyKx+9aDWdk( zM^nr>F*f>W3TWbcHIFfX+YucyfR(yBGt^<Es1`(p@<5t7ktnayFjl*6uB4u4vdZh3 z4(rYp96X1@OwjMU!EoImGugLu)%WfPrHk^T5fNv5@z{i}(h6TFw;rqo&w-kU&=G3> zf$Uz*Ke!ggU^=W1?|_XUeT-(F!Ap?2Wo9f$^9__w=fK18Tu8r<nQw3k_in|08+ZZC zg_>u8t>|0`_dv}vz$S3IK)q@Y*cbMK%qeqv!y?!RqH`Q<S@%KM4^sA>0q`4$PnTPX z_r4BRhpCXc56)1i?>(o%@h}~hz+q5wGaO33ut&?-Bg{=U?cwj?%@O%Z%Fi{OPi30K zC0xo6(Q+BKILs=b%Kasr8xcKK_mWnd%|XLghDcAMqlSoLlZcJBLe->G>9kF{(nYx> zL2ZId+vcC1A%(a|<1H+K6G);HNM3^O=0YpM#mSmaVAqyZS+RGsc8t2g^MW|FM)liC z!EbSwGr!f#P9-+RhQC^F5Y6HoUYG)R+xyGVn8vR6UP!*A-!~o(=m+*h{iS*3rVL27 zRj(?HA+ITF&RD2^v|`u^j)Q$6@?rX1s4v~o?B4{(!-;SfoCIHiw42=R@K#uvYvV`g z)`IxjoBq$cA?-Zp9ylJ}3ui*U<6!*$?}v}FKL^rIavp-R1s;J)>;*6eAA=XbCm{BT zvk<CmEP~h*&SFUY?>q;om!0P!^Aeq<P-SB|q@Hu|{dbj!ufYRwC2T;(u7;PuHBfEC zwQv-C6Xw9T;qCBU$TK<bL4NCOfc)0k0>6VF!{aM476@Cw&!B7uGY<o59tOVnT4UFI zgJLh-$o@C*5ZnjV2Gl%^o{($0z2SbC3pF3(KB)N^npZ%()U*NrfSOnE7yJxrK8DIN zwu{p(u5H0PQr}X}p&2mcZvu6NUzUT$L9+QPhY<@?)vh!r+W(?OTBT<r2g;P-Pl${& z*fmhFo#-OAXoV}E&b`4AwHk(|7G(G<<EiAtI2tYazR~TKMPr1I;w-ywC#0vduU~qf zNwY;xmupAlMoO6Z#<W&&h_oht;OI^^f?5tLpSHy1wKBI+VYe?a%ADYqp3u_xF{tF* z6Z9@-U9JN2OX)OwV5BLyVLhXV$Ani<^J)gP?~<LGmORcryADVJlpZLy2jaVnwsO)l z_F{Tp6<sf(JPo7Rxj}5HIx5vW!#G+GQ6Z=@FM*-@T^YZSs7S?KRv)>PX+KE*R41#> zE%f4RFdwBY`!!*AcoI~fljix1g{Q$qFa{aFbLzwQU?Zq3()^wMuqkAW#Yuq2bM2O} zKBNqqy0<mFlzry>82>HJ<563s9h?I@z-914sJ<x8>rr1+CrE#WlL)0lyTFR1Ygc#- zWW82bnWlL-(o6Y}_J)~vqq=%5``GQyjZpb<GkgoW5IfkJ2-Q}Z1dkzoZiPzpsZez{ z>w~%7A?*xzFq{pkx19%JA)E_uf%BmH`R2p<@G*$)bRLJ&2ZQtuar&SQdgnZjHHQ<* zt=miWff+b3y1?ZZekiL8B%Bdlph7R{vr->#WtYSq@vUqX?jgakEK_;*WItNXt2!S{ zY<)Jr8(4Cg#D1iKU0%H(E_z>*Iy2Y^67>`qvTk+BOrjzdLTR;Y#vyCkUvn1YG^D5G z{7n9?<i)>4J}9kUhTY&Ra1dMxcfmFATeuef0@uNl`R!ZqVz?gC-|8?g)qD%!eMrBf z^8ut^(V^Yxu7&h7nr{MZf%JztpFqvoWe%H5d*0awWlMeuRY!aUC&Qgka=IIChO}SZ z{qS3O6>{`F914Gg`bN_)@JUF2rn?pX0ju!dhaqLy(b`3lyGPjKeOlyGp>|S7cuT3= z(Z;hQ6lSh{UY?P*nw;l{veFjgP(<3onR+`1r7{T0L9rZV<&9NM)nPB_`ILXhvwwpZ zcg4|mtm;bGh&cLb&Agtgpahe-fM!0=5SYgPwQvHw4w^Cn^)P909n6HsaUc45&G_*s zsPxE#N;hf$_HpG^1wzjxzm|!m={8IwKn2#}ASX9HBRSPp+DA@0zqwYOk#f2BFq$KK zHG%8eV#?AZCWZ*ja<kPW6_)kc$yBr#^h`>taJzRb@1W<r9&!ig26!sG392j1g<aqT zsI+7Lq<a~h1P8)fq26%{R9f7LT@#-cf1gPI6vuYMNu_Ba0ZQfz3>k&v@>q~b<F`hP zB+7oM>i@w=Vy&9hoDQ}2a#Ri%;l+a0K50qqUfM?*v{)SEJtB3|aaD=5iD&Lg<2G25 zJ~+b1`WU_Phs*V=x*Ut~JQyfuOg1?;hlS}?H+LhpY>h2#7d3-q5$q*)vB@TTZ!Oqk z6qyuZsLs~8E>V}6b8)=TteK3|>_ENR8~Vn8N=+Y5Z@?BTPf?yKRcAp8C&lcEc^Nr; z;bxd|N6-qU(t-9+>Eqd=o*pr~q#t|RjFLFk=4bZSqcZG=_`;?8LXM6?(Gc{UYWuH6 z;WC3LmyQoR@w=EvYvnQfJy@-Id2niJ!!X`_T34OnAG*c}%8Wz&#6Aimjo5PqCUq$g zUg=P=GmpVgN3@zyCNr*agz8Tgg%uiGG5Xb?5?MW<w(RNZts*J)Dlg7g>J(H{*5p*O zl$W<PWdi$U-+QpmGC5!R-nvok;Mcb4swOEz8S&P8d=kw=bSF{ry=O?_7xq<h%ojb2 zOZR<qUOo4Agn*t`|K!LBfe}!S*~(k%(s}|a37Z=HNC%AHi3CG!hxFi3eA_`+%!?fL z<U?<n$$_{wN?63M;c(1qQQd@YPp?lxqGVRROCOV(lcwHC#((3F`fCcB76M(izIgg; z#Mzd+{36vCu8>eq+1b8U0x7F7l;WuUOTGQ!-oEN#g$!?BYxyhq=c~_G!9V|UZ{I(^ zi<O+<_;_#MKRzCvs^IUx>+Lt^`TROyrFT!ACta*MU@Lzw_2OrtyQQCJ!+vlsybeAD zbKxVf5H5f>z$f9Ya1mSvpM~$hCGdCnJXC%8Iy@7uge@WKB)RS38rT`Gg{r^bf*Pw> z4@bi-a4Mv&>~4Xd!p|XXX0z5W<EO3)?-x+zm35bloxdHPOy=!?ZQyR$6MhY)tA2p$ zf7lNhM{s_I^zS>r!KdM0a0~n!{sbA9by;7<saTo*0rK%^NPnPNyYFIn4Euv%b(jf{ zgSqf{D0`ndJ1%`G4(mX<kHR`oW7a3ZH{i+eeRw+j8lC~ahg$RR0IUz`BQR_K9fcNY z#C~I_HU8Q|t?}0#vNnM$^?CtZ3mJcKcfbqb-|!-M2K91Bcrok*)o+mq^{vd#a475o z_07z#a6Ie|HHOVNhC2^x4Z$bi0Qefznt|knGZ6j>uY@sVYB0P6Y7M~=P-_U@1FwY- zK&>S>7Y>C>U^>(ob~dbt{O7@A;AnU}EPyA%v9KXz{M+pS$HUI>de|M_1hsbZ%}{G6 zPk_1b7B~h@gc?(s3@5`|;qCA)s0xH<bf1T_p}xU6AMS+<pw`fO3^s=gVPE(ZEP~I# zd*QS20m%AZ?riuR)EGA7^zO^>Mfeqb3GRZd8DYMu@iMGKxn2PqL(;;mxlFlr`>?+X zUJh47jb*<Hv*CKEHJRUrli>!an&v~ucR!siP-|^{43Ed?`vNwiviu631$V$+a3{PL z?uH8>egp0r_$}NCzk`S1_pr{flp}a5+z++3@=x#<cmTc(e}-Sc-{8^5(cXa7;9+<M z{2OLKrwU{6kUV#1!K2{I@M!ottO|ESWWhZaBefcA4e?`euZG9LREUhY!(bhF17z(D zm+yc$bs^vHa883?!FsR~y6<#&7CZy?gN@)&*aVJ(P2tV(ET~$u6`Tg!Kz;j@wLIJ< z@O=0NYzIGt?cr{C5&RK$f~u47r!e2(=nJ)Gb3b@H><?Mz+QHAlWj$)=GPn&=2e?1M zL9hZw0BeT0ti$YF16g<383HeW$#6Iv3SF2ES*yUwfUKY441=G+;gI?54r`9M%u{zp z!1^#7wuF=sw=>Lx-Qjqc3vYsB;LY%Q=t39X0%yR9@Nsx6d=*lb+`r)6@O0`K{6^eH z@Lt#iJ^%;6*)Sc>gV}ICbm0^5PPh=h51)mb;bQm`;(~8W8Nbjf=r{G5OK(mtZChvr zjCI0nt0M4NmJ{WAPWA(7><6!Pv4nlKE@Y-|=kGF2hrL8v(<$6^kZIO}BX&lOIby8N z1mf&;FEe{jZMmLAu{a5L89Fq#*qjw3DrEV~h)pMol;kYmzz-Wc{iu{wK@xQGC}>ai z{KidtFf)k7%{yX|-og?54HWdAdC>mcb2pE-9v5+f`sE46wu9xkgX`srIV8!op5k29 z`VGo>2z!X@1~QhKl4%Nom$)~t(7u{Er2Lh=Vp7+OUxqv=&tHUn;Y(2V%5s<sUxVt8 zd>!5f-+;3rYwDQ!BCFvl_SeE~a6SAHz61Y+@4_nF>piG3!3{7GegIS8W>^S6gvy35 z;S#t5%3j$855V0}zHocs*`(h-sC36a%Je_}31x~OhA#XEJ`5{Xwc{YiLYb;H;ZAr0 z`~jW_8JBiy!%8IKNw6h66*5lg;1}TbfTzRD;2H2**aT+5v*7iRy3DM%#CN4##&n!k z@O9V*z60CBk6=5<Sc%gfsvOFOi}wZ4d-dR$8Y8!smP6CVFBqD|gr)4%;no+Rgwy;` z)&C=C-%le(B~aqDgug?@N8+@csBkG$n{6d=Wy_>m6YDu*h0i>Qo&M&R!q6O8MI~}> zs1&MXBoP(qo0RygT+OJfhcxfyPa)F7sl^|bb;<Z!#3`Iq#~S4Pd4O#@n;(>Rl5r*5 z7B8|ZX|43^26fp>U>58SHO6--+ypO!lHq~ydpHPcJo`$hF}}gD5xg2+0Iz|);ShK& z<eOh^9!!Q4VG6t-4u$wmI_Xeje#788I2>y1FB8fp9|`ddbVk7nyhk298jgmNm8$$5 zKPQWNm8H3{bK#UySt;#P%*w$>TFQDBXZfL~{|APvb%c<3L=?2LaXFE3GP9DXu*@7$ zGSoKQ$jLD_`CyM5mTXt*G(A1Kx{kyNNdi$3A(7;?BXV97T_v=vNed#w;-O}38{%SY zS`9fpHK#BuEuyOBg7gB12@N>A7mTqP&$_&<;*3$rne?Er<U{hPjMN-cXc9Rd>JX3d zv))9-*mx(_gf@dv$!Yw6m0<GhSFw7QJ;N+zdT9`!pCR{Y>QpDbdT7NtGV=+ljgnxr z+e<(2+oC1NgC8UZlKTNf%<$rGKyD-(H^Ot_O|TQZ1*%e<1l0z;4Nix5LnY93sI15S zHgmxrgkP~g7aoKU!Nc%jcytBYv`{*}1lEO*!gJs}s6PDpZ~%N9X22(4He3krf{Wk= z_$=H8m%w_w!wawgV(+`F;A^lNy7P5-EL;U^!PW32xCS<WZ^4dmJ?sYGhWL&+8z8<S z&L%h-eh6p7kD&VWKZei3ZBS!&UqZ&EogMH`_#fy{hw_aV;}88U?8yEPkag^wAK_*2 zXDC1EgK#wb6&Aza-~@OGGJfU!4(G!^;M4GL_y+t3YK*+%G1OJ?DCi)(wc*+DBuKxx zQx_IPe0AMtAm0*nSHaVv+LEj(>^4W3nnT*1&e`x%$Tw+R+Kmpry{1ihKBRr;w1;=V z4p42%j*xbk(+R!~6X9lvFP!@|q(8-_UE*|u)sVkSAngIC2b4bQ38lBP+2Zw9TjFR& znQ^$O<>@Ug!DaMTjI;bu)&GNsv3g5-AfmTaIEYidpksc}{Zu~4MyHV%*;mia-~Hfu z@G|dt+aZJT{>c^jq0W)5aC_<VG6tbF-RMkC&tvV+;FG*kxGtyrq3nZC<4{D^NhL~0 zH(*02X+;aU^OUe_7t^tyxk~d^fziv=C-H-hUv-E|RTi-^C}=uJ6N7!bsByPoe}pk8 zrK;+)F&QH(pV1Iiyy@(RHLG8FM@9h^c~Nk&{GuE^mamso2l_$jrgg`f6Or!4&!qXI zw7ehciRVCRW5&$P9K}cBNcQK!d^jK81RsNUz$YNT)p|-U=Q>Zq*WlCe9r!F%{x62V z!)35F_kIy}fao^2C&Zt}?GImtSHcxg`ssBz4!!|zhpV7`cveHz-)rCpa2@;}u7}l; zi??A@$TJw*^j+AR{r6y7xB+&68{uHM393i<LwGOT3YWl-Aikx}$M7Tg3H$_p3O|FN zLwrlkoXuVEOZHXHl6aPQxt0D?TFaKb<NqSJX7Y_)kH_V7KSbp=JSr6Nod4H?%yp^8 zwR&x`Bu3VQWYEg2S-Cd3s30T#zY4F$NlN7}Tqfu!^lxG3OZ{tkE-gH9@;sPy^@Gw= z@|-{f^XyEZ?lbaS73w0#LdkPYcnidKG;OC7;dJ(E!`bj8i0qlQaz22xkIY&cr@>w9 zpAMC;F<6g#)rZne4WPzM8$vxp6F3Amg&HeA3r>fc11kITT(}CJ2lv4i@JHANYOK61 zJQg{^rZs)Nv`O6d>|X@aA@_3e)pio$Y}f^=KJEtB!0u3OE6S9+6=D;+`0_gVow)e$ zI{jc}(hVEHZ3HiaP2lBF@3)3$h#xE8O#Rh_V{gMd%gC*1fuy2&O$|}Pd44#uz?xx9 zDcL2Q8?rmq4w*$%12%bQ@ii6yOD594HxPY-Ib=V{p|4`gG%F6`{RQ%*fCm$6m8Vs> zLxO#)aP!!&+Eh0(#<00kCULb)TtUWgO_n!32`UzmVkO<2LgZ+kh7J#gfYMC`F^M?) z?4>K=>z!uA#e1`ub(uCC3afanvM@I|UGK>%s(vDrtN+y+L%o_1d|g{Q_Y?Bc56VN8 z6_ttiym<7ht9%^}JHSk+R~-qJSolo3dZQcQUGPTuGQ0_{gf83*CqT8)CPTH+rovOX z$8AvKBzM4b;GIxIrqiHw{R}u3qR(CK;mm>y;Dc}(oD08z4@0%R9)Z>1Ja{gg52e%j zjoTSM4#&eM;LY$!I1?^{Z^EbHPw-iI6f(aUUIV$8TMY4Gapjk|9DWI3hCAU3cuXbg zBA5VI!k&<_;x2{jAU-u_?%NLdHv3;g(%Ib)v8UaG@B>(xeAoz2hMEgkAJVsC#w*A# z7heuD_w5?Ejr|PxC1ecB%vpN{e#gGbD(~-H5a*w9nCETAv7g~R<(JjWF@9m4#)*EY z>i=QPxp3_g6xI?>2^Cf~^A-{nV`C9a*5Ay+o!E4xr4v=(L}#at$j!gPTei~gWouv# zMT)nIf@H5+s6eXOdM9!Abh9i(Tv=$r(J}=yk;wRhsS;){6D^pN;^IREb0CMp1=DZ- zMr<#Yy%n6Opt7g^x@3#LZ!BPy#f4s^4k(XQ7F+Q*GHychQFh&t6nHT)@|*7i(_ji@ z{LQR)Ok2rS4P5{qf<<s090S)w`A~0y^n)3D>qbZ&g}^g50B?b6|4oEfz*`~Z-?<Iy zS?++3!n@#8@E-UX#IMi&4NixL;S6{_W$Av%oGxb;>;WHyBjFsVG4HuhK3??0nZCdh zxPX1e4bAuL=fRiQ$4}6e{Y2Z({T42Q`{C2@4@g_k)!5`xcnMqv)fc!NYHadlh(Ecr z0^S7a?=wErE8%_YuY=FSw;<PW=m&IPgB#&CxCL&9_>q~ibuI50@9(4e4RuLd^;u3Y zEnD>OWcmZ`$)OJus($gqzbIWU=Y~p`#BC~3)*KsNx^|ulZDC~<IVxR!sZix`7LhTw zP&t%6*M=y2fzTHgbU@XBJrMdPgUVnc2f}4gaTgJ1OM;yit~iyvaOntl<M-!SF6l>* zZKz`HJp?XYey0hMDi<+(9)Ho6CtX!8>hm{tnF+Hh*>xvo!x%9o@Dlha><#C`tKnmC zG+YSpg-=1+BF;0AwuAF5TnnFr+u-wX2V4dZ!Q~K}&%vw3#U^uJgV<8e>k!+?Sq0PJ zTTt)zHl%)Z-h<S4&ITy^j=lmjuVxdZzA!$KE8$1%uZJJQ521V^e}(dWtiXHkfbz-R z3)P<Z4oc3xhtl<3Irri?UEipR6pk6^b7qvvqt_1B;vsfrV$)d7u=ZI^&i6x9D35cF zt>qtq;ToV%zt&MVv_Ab>wTnBWRonQ8R&fz6+s8+oA0N>=KB5ILSnB=Or{4wT4J@eu zB=E=$*u0NH7N!n2?H0XIEmK(J^5Xef=8=|uP#Q|+niG-k#Zx!CO4rk1AM)UIcqhcy zz}*1P)Nyo04EBfA;l}T|0o=rXLwEx9eIs}|Yz$|>CU7fEfZssoWxDvNI?Z4$>h<Q3 za~=AX-1hJs*cYA)Q{j2A2)2N?!ItnL*a|)eTf;YD8;Ea-(-wXY&xaLAgbN_P8csWi zkA=fM+>WpV8~`tb8So-F26lu~AifpuEZ7M?2@~NfurquYc7fYqSIAhp(*qua%pGxm zhnGUhu*yMv+v0VeuL;MN!I@=b*t9MF2cHcM=}*}jQc(5T5Q=y+L<-X$ikKl$>l<H5 zeI?MhzSRVgGSh$tBZ0vO7^M#f6Wz?%F4lof>RUSUUs)%UIME7k)H<0F7ay`t(m52? zzvWsddaxu;v=8Rj7NxT*p63|O+X`whmB7-%Vuvyx*Fl2cu#nD{9`l3pPvz%)B35|u z$>g{4GzF?%f$W-gMH*DQg1JPlUU@WJ0`uWZun?+m8yPokZu(PAANTdJ8P~oMo(FG+ zw2O`JZYI2i{cJcHs;w>GUFqW6;eLqku6q#P4J%WAr@@Qh4A>RUgz~3)08WFmq1p{| z;Kz_MX6AN30yR!q0^3l|ABElFd^ij~24#ah4sVC}6q)fy`IE`kcm~Qp3R~Vi2$w?X z31r``4PSz%z?We|_$uU^FwP2i9we>ZE8$9*1y{kvQ2u7h#&r;1d9~Bcx7*)=$C5uA z-~{*~ByF6nkY_Z0XeyWL_qZsoZc&|IgH8E*f23ThH<V6R^DR17eoUp2Zd(45c0WXG z7B%z}IaKONYP7hD(ov{~{uStE$~UHhw0P-fZvBC&(5j%auUm4GLMw_}pwmscwDG)) zl}WB`{#G=7@UGtH3#f6JFCo9TK6P*>`+C=1P-$`{`5dpS&Z%bG&$Z#KNSdhM+32d_ ze$#3{*YHCqHGF4p4#lsoXFBo1-rtId)}cX5%t4w%x=xBo3ay<{Kzat2WlXiR%S#(j zR(ljMqLyPi`zG;=2IfJ`FYNl=(gW#4dIp=(3z@;bKEHQtt+q-y6U+~XWo3*?FEAY? zl7WAv@ua%!y`vg$Y7lRqc3`ggQl1pqKo0#^jTbgU2a-stb_p_hmqUBY?9^gkrR%~= zg9BD|$BzT5nWSozpzExJ<z8n+aG>-$lGkO#EBGqZ*uCmQ_Jia~I#hLt`kED7e979u z2~h1o`TEJuod|Q_!|;As0@p$L@cjTEhd)E=X}1y&z6d73r=a>^<kQyy%9n2_#81(^ z89oOm!KF~`K>75oh4SU2zrm3&pXQoT@4LrC#-Q9pxC&;%HE=Rq3vY*S!*`&3_oPEV zfa-tT2<xHyHo^K(zI?slM{qEdPoKsEKZTmZ^CfHr<=b}w{13bV?t~MdeEXEid*C9t z7h=;JAHUC`eEW_f^L~V9LizS#=NMnU;qX`Xr5okThn_dSeCp@?hkbN{Qvu(Vy|5yb z5F8Dqv?{~n;W4lctPZb(^4%K`<-2!3tOfCJbZSG{Nb=n~1X-)dmF+2?y^A4ZbZ%GJ z0OBWSeD|(}^4-Iq%}Ic(A!{0$^@z@eKeFEvc0j?jhMk~%__Y4e1@JB?AHEkLex=4Y zQ$BoJKZARkb%Z*>9QG4o0qg=N!fsGLm)+qq*c-kI`@%P&eEWWa1K?j!K7RV{DbH^7 zXGLVDU0j`_zA&lHeQ<Ue{b|1uUs%N2cK@Y5QK3!bI^j+pmCT;R)n}taS6As}X1~Y| zOd`^bMVJGuBVj)Nto|jHIeRFJWrEE58{ScU6DB2mlulm%m(r3kj`><rPt-`~ve7Qj z%VPqKshUh#SNZdU(m-Xs0TK1Q_!~$wCC5!r&p!cnhw?+50q=nG;a%`uC_luFP=1Iz z;eD_=*O~zt*KlS+bwbU8j3YP?Li%o<hu|%+1k(5FEP$HlF8@T0fjtRR;3Aj-pMg(7 z`6+5F;d!VrFZrd_rHsA;>2EUrXcOQY?9-p*AgAsg_$I8(`>ummz;__+b?1FZJKfm` zzlQQVlT3UFRrk8wBYsW9L}a)P$1Z>mmXV#p+~m^lY8mNS$+>>uCw}l2W>M;e>Q4#J zCq&uo)bx$ex4E`+z)FZ0sk8S6k)ivl@!$prG(jYEP$DBa^hHMd1B3k$7+c<A4NZ** zjj<D0f~)0Zj16B+0w>W87Xig7i3-_#uSCVAuz#Sg;<8OsN==2H#Km=FS`V-U(iRDh zIO{YfKWZT_1YK{cp-wXif}lqi-=9KO(!J-OK8-)Z!z|${I-jeyM;j89s&k>2KKfv= zEx<ZZ5*&!@u3EqW`@XhoN~t=FI9m|ML|#L#59&B0s9S0w^llb(OO>u<ae$*S-rEn7 zKb70gMAY`;zd&A<;PR7{&G{8n7RxX4D)=qbO}~TJ!yn)sa6eoPe}<C8KOp1Aj{GK- z&VRwCO7E)l`N9hDUdXz0rtj!zcs9>a9co^!{3)M=HQ*~yew7W$fZFhUSO;p%`D93c zvU3W&0iFu!&voiSW!M=|eWdl_XRr~}x)M#`VVD5b4rvAlLHSo+56^{bVGF3blrrj0 zgz~GL3aOvWcPTqU+D;Djl<A)!P0hE(<qP;b@$v<%O$POVl8RoiKkN;!hVl(m|3rVN zj2r-&6JdM=?}LNbe*#_!u|tfH;0`F?K<Z!P1E@6t)7T#h<pYS0G(Lb&!Qt#Lfmv`9 zln>zdP(FaFYja>V<RA}{7ES?_zPg0GiEk^YFPSo@H8`9(<>{;RjDoD;nmKkt%@oe_ z1DExKr>pYVkJDAfL|M^|(^W19BD%`&MYfUNJyl5B1(&dcqmo~HNvnzygZ-Q|Q|e<x z#A}-b;=-Cm7j8jZc}iq8iBye^AXV2B)@o{WjsNYjz*nfIJ<Xh}bX2)JlReq93i6>- z+D?XN!6{IU!l_VWC%40Vi2Y;Mwwea#urFUa8R_@I&2R?X1Mi1=v{{hxerFC;f9u1r z0G7bna2`}2)&e+|a`v?L;WKbGTnyERy9COPe*vn#TnhKX7oqCS<**r)FWpG^DrB6- zSpgZhaNdB7LpUp;<YyI>oOR+F@&3uDAeYiXHQ__0a>kg18tB<9VqylTC1xd@=7*@5 zh5LGgHs%t}jg!0OM3pOdD>)F6J59M=Ph^aZfqWjt%AQ}b)^@7Y>PGhCkd`*4knV)S z)T|scgq}&9j;PNr2iNMZV>HHZ&#qw4=A(UC!^WAW>0r*bPn6~8o<rD=u~CJM8Wnd> z)m;+1s1(~PSF~4F8{SB}lGN5Kc7Z1SHi@{fw5x2T5ErRO!?m0Go?asV2r3yaw25RL z!c?&BvyU*xi-Y57CM8C(A7k?tj^Uk$Md~x<hFl&AvOK0jFDY^`WSJA{&HuI|F4k4m z*rO%Lksl;KDqjPL@O@Q3uV(ADZBTk)2kZ=Y!a?u{m=5>DG4KGK27iV#;ji#X_#0He z-tX`&_$QQqz~As#(xyUn?gJ~rA+Qph04u|HU=?@>9s@h`%++BQJQm&xkAru>8c_Xq zwcv7iB2>9M1!^quRLHt^&S|g$`B4uZ1J8tYV120h1P$PourVA06QJflHiL{$I?W;D zlFm6$^<*ok{A~+YzzgA8*b(lAonRF*s57hqyFm5xb%ko%UIOdF9<VWF&YJOIy%b)? zem|HA`$NXToXerwv;*M}a1cBQuYkY7tKf0eqgO-v@SSU5cQ^$0g{hD=B%Cyu0W+Z1 zb;^XQr$<2gJe^T+KFo&nX*#)3^CQPX`YN4bxDt+o^p`m|!u{|jsPTk}un(LJhr%h4 zehcSLxD4J6x59fM?R{qkl<(@p@K5*%l)jtA7QbG;<k9b!d@Q2xtR6{CAE&R}mv&3m z<OhDJ>i^-$W!3LqjO&(6;3T#1y>3aJrJsd-@71!CeJEw(2R)a{5kCz29PdBQ_BlQP z>k&U2Hi2`Y6wJd=eU6Vnz3&dTc;DPY<o|5qbKnz^_qCpT1({jH{@eH2RNtm>4Xe=d zG?ZtJeJ`Swv4^FOY(##>Fr$E^knCjrtY8H^S>tXHk2M}%St`Z>@0v!7wqyT%QqOZU zbZnE@=pbn;Kj<Bmb{ccL!HYbl1~x8#p8=ELnNYf>KAZ#_z}sLW_ylYM--S(~(lP<6 zAFLTvoA_*~w(vPnWBcdAWOyFb`3v|vzRf8gqmy+lxUihGH{UAC%N><kXnQR5oPLOk z+JDahiCH8ETADs`WkHZBtxT@CM3t8-N>Ljh$`xH!xo`p-%V!i7szcfKp4g~#oB1t* zbFy;m`eKcUv3Jfg;-Sp2Kgr5zY3i$3a7JFxc^}-zJbjzsH{98Zoyv)K=a!M$>>CcK zW6~TCFFjJawwPb;9DABMS9v7aQJ?-VCI-Dro+{rif%Rc`sB+f}UIP2T>tJ6v7WRh^ z!U1p|ybLaam&51b6>uHA5`G2;L-n;@1uOC_SHlzFHLw9phI*A$I1XmOIdC{!471?N za0Gl8j)Yqwb9BvGoH<Z_Zh7zwI2tyD1yHhB2qm+9_)WZiTtl2h^)>ipL}o+MieZG; zuk|oKve3%2GKEV;*SnGe$RxImsA&*F5*#m^ikBG2P>nKW3hdo!9a+(|LS}s4y(7AD zH(iNMoebuK3r6-OJ@$MSvGLB9X_gqo8(#-=u7uB?tByMxuX{?=!}qjDeA(L1Q9mdx zC0nNvvCE5`K-w!=?}Clt-LM&C9<^zMOo#2+p9z(;_rt+(Hq>1ogf5&5?}p5~HvRaI zz=zp?6fT7Gp=9p~xE4MM55mRpFZevH!t=cV{||HL0Ut%R{_jLuL_ngb*q5SWyHXXD zs|o26l8}UETb5)~AY?<bq1bK|MeNwS*Df|}*cH2i*Dm&6uDxA*_y2s)nc1D0-3a>E zdw=J{@MO=l_kGWM-gD;6nVEIr%}{af7Pu?C2WtNO!%$-gE1`VwNw^d~4do*|-)(&9 zHI6wfFkbsHdA(WQWw|BkOT4RbLVHtT<NRSG&E;!|)o${KJ@<Ohnmb~mhN6-EJ;Q{e ze*A7{!8IC9M&Cq6Q_N)On05<h7i#3DS0ZC}W334^WH<*k7u5=JT@xEc^x0QkTz)~8 zZ0jcJcP9O`4dA&><`-S<d(G)jnKt`-IEZz6x7g0`M>rDd9b<b!-a}#DE%Gbem*1J( zKWu>OKncyg2UFf%;Szp#gBQT=P%)+lTn^WTE8%)j_U68=DVGtHQLtPTD-_?JfVcX} zB|jEVmP-zsxJfp25<MT;N6u->A!1)eFE4d6l5d{388hq_(#y$MU<yJ<wHXbK!%WT= z<k+%mirJ<{#p!Ni9H3uv6Z2aIWjC<jPwAgrAG2*n$dhAs;kUEP?1V$O=NN7aTV;Kn zwsVqfrn26U-<LRfx!72CEP@(GD28%R&0E<UYTn91SO!mn<xu-hgg3)V_!*o8e}(j| z&HRLEQ1O2sxHsGv9t!t^i{Jt96sUO;cf$x&S<Zl_FT$~c@7R8Yyq+x2vD}s{^St&} zy*V^o8R0XfrZx^`12_3gT~#NCRqjKS{wFf`V@=HNsA?PHPt^;)RA5X#IPqI|Hj>Xh zwvg{8$tW8WGBawO%yx8=+;gFvLvuRRl~@3a;6ZQ-JQ(Wqj2oKgGLD2d^7|;Lex2rW zNcUr*Y$RVC9*9@+EE*Xj_wA`Rs%VMMHYQ?|L`pSLU)Ci}<hBc5v+6w3lYbeqi<0J) z=-ekk+3jRU&Q|^o&aF@!kxjN^xg))t;VNE=7O!cD)*6XJZ0V*{i6xs~VjJtcGV7c{ znKj=<a-0bz%UO=h>SzBgU|Ws9X<PNP?o7&D$uxs--sI}vZC5#?YWhGH=2DpvcsE9S z<<@zFax-_u$jvpWnai=%k-LL!gZCWAk*Dj5u`G9`${nz?_spqw&fyqIJ4=INa{L-7 z?s$))^9SW$hP;yLS}3_RA4ooZ9ZPT=S@AzazV6+xNXkFK41vk=;k<@u%`9X8>1^kw zROwq-m6YB)PW3ozD(sHxOy%>Zji$+$lS?JvI9F#eK=MjoZwz3}pd-WqZiYI~ZBYI1 zyWrJO^O|mjcf-3OV+$Sk!u#O!@P62x<30elf)7F2>sXdu0)DEPq8Ojca(B{RQ(E=C z8rM-ntaMYVp`>flP%36M3dv%2JDfH=+F5m`gQ2pQN4QC{$QFtVDrcp~kX`aU4po<) zfJ5Mua0mD_l<b<TB^}l71m~eoB~QnwWVt7ejsd3*v6-9xL~U)1@#-tNg8IIM9+LHC zD19{#OZsXamh^ocN{=_7^gV_p7<)ADMaQUSxi_irgxK7_yhu%-(W|3m3F`PBvP-`A zp>+HJO2-eObo>}fcIJ;59Z%)&V4V5~c{;`dmitn53>2wc)J<9L9~m0dN^Rs*<CHs? z9dzKJ|4OEyu3w>p<op^+*KeS7{T52s@1b<~5vn}vS%Ur7I`UK})JM2KscTU*Ueyq5 zjhFBtJ>9QhZ6c*Asny9^ny7!Os&3MGB!5?^K8Mo!-EBL~Jl77jEeyz;v25-;8hJHt z9W0wIi8<1F6Zk+<UgQiH#h7}K$Gb5rBhB?|nzxc#Htwx>8*U@^Alj@#qOouvqojhr zY=>+gTIur4R&y$QNn^+J+0adrRXS&rAwN^v8QmoRFgO5?fC};>;dr<kY=qo%?T{pT zzup;eEYy9oJSe*qz(-*rd=i$xci`UeTgdwiOq^!yw__vZD1)*Y_i&AEZ(^IEFX-9U z&B)htd=DmVo8QRX>v&jI{C78P8uOaZA@AE()-qq-kpVl%lJ?F+`V2mKr!v&?0%G$X zO@HTC_a+nfB^R@|n<TgFtakihC-Z3ZlrG0Z)rAw`D0muF++aSKxz;-muHv`m@D0E| z7sClqbNBX#dJmuGHEYh^HBfW(dT>6*&du|Vw?Ngc+gXDBg-^+o4DYi%l-8c%^47+B zV^lern^G&-bXFxRn2g#$PQa)wWDQ{P8dbKpzPkpaD&DBgaFb-0O(jdIlc{(9NgwVL z7@KNd;4pr_1UsPS1ulWy=Qlp9`GL~?T__t}&Jw(qdWgJ@Ssq|{IK7Rg{_Y4Q1NG;C z0Rx4|3L0n#c>x0@;+MBfB&Y1r1FF6%eUDy}o%<x_J=Q<L8m(Z?hzzg!iW*1i0;OM9 z*qI$vA9bu7SyraE!?gdE9g303O_Eb~=nma}R4??B?7d+Ka{s#{3N_F2c(^f?UYkJa zuYP7QuIn5+Mj^|p^!lr=g#Q=Lpt>=d#Z8h`Hs}i7wrqQJll(itkn*8)+4(ng-kbH> zN5^~QH+24A6ns!;$r{vI^IIjq-ccEXn%^p2#yC2!;P0V<Yl6Atsr^&1`d3ot%2+!C z!)5NfZThm-O<C?Ai9S_`oMbd~pEwKDVl^{E+0ZuUHL)fhjZkZ@LbIE4wZQPahREF< zz0on++@|pxy<ptE23B2mljN5jdch_qQ}b@6ljhyhE6A7({|2YRzr$%zF=HQC3iXc7 zGI#*oABJHqoDOwN=0kPJJ~dGF<zALx+&q#zom2h7M}u~(j)jX_8ID!Y?f;G`P5;Pi zOX(1_rRLvCuS1}0c^H%}HUBmT9s!Hsk+2*tf)nA<P`1<j+%|X|JP4i$Wuqlfwp1Js z#-7FG>70kNJeJ0m#gV4E|BD7y9rfB%dIasMdBoC9^N3~7Wl;9K4(374BUatM5mv(G zuo`M!vBm&3uUI~R2Rsz6fU=Y37k6e)t=Bo#7kfNt&-~cD=J5Yb2MyX&dIatH0(wig z7oqH_d8e|c=9}igH=z9UO(_3-3(7zL4b`uI7piV+UaHFOLnu3GeyZ&G086kR>8<Ne z1noJg<^QBLgSJdp*Sj*8PPXg@Wy^J;Y^k}lIZ$(HWy{`Bw(J9C%WSB+z9DRbnp>;7 zt~s@;>;0i@xsoL~kHBloCxf=cE%RgT%+mY6SKHUdp2N^v_8bmn&t0MHIU43b%>kA@ zH3wMs+yly<dqUY$bAV;fTqt{LF0kxb0A<g+S%TM$T{CT6|Alo=1?^eY-V$BYqwZ>x zL+t!tYS3jz#Ys0we%0|lWVqLkwdgB5MxpGeImoi3<{+z`*4$&+Ck7QGGza-4I0v2r z<52fW=E1k%eE0!e0Dpi7L)lAnXJyy>Sb}qnHg@c)`L|D}wQG3fsQ+UPe9*SiA!ysP z(OI_Dyk6P%pHQ~F5YC2|z$4(LP-DuM!L#Az@LYH$d=+Y*?^kdc{1IxtujVn{0A(}H z_myoo<nLhLDT_RnxA;ubw)(i4-sf%lqH8eiZ@!>mSnvf6!-B6)7{mF!uTmHt_`O@; z_pX88qXNH2nyzgKos!i^lS77(qg)26Ob46Ux_Y-N9b1*vQWiJK7AmU^$dH|t9>j*S z(?f7KxC*MT@Ca1=cnr>fk3-dqr{FyJG+Y3mg~!3?;0f?Wcp-cVUJPG_H^bN9t?*5# zdh-^14E`Iw0pEuz%d=R5W%(d-_ak5TZdWJEvWoFb1)sGk%hU+unl76ImuIRgT@h_< zjMbWPs-a}cN}5XD#K0KW6`paa7g*ya$tIijC*x5k^A~iHyuZR6sCSu8f_j(f6xbcs z!yZumg`QBcW<7WaTp#M1dP6AN>7Az!!cE}Aa5MNW)VojLhg-oe$gwr-1_#1z;I?om z)Vol1UwnIL<~PFQ`Moo|4C<Yzvh6NVWuW$R=fE{xK6$Fsd$K&6ECW6wIurYtniOJ{ zo3h+LXmRWyxlEdLT+N6WO^!7(cOwI{<lM*kj1Oy9H%SiJn}3OW!Ft!KWGjJ^k8fQV zJ&xh;;5}=v9?vE9$ZwA{>5Hg;sWPgMYtkj^=u+qC(&*@N6#EA6y=_O{`YhY9JfGCX zQ6oIxlnUz-DYaDkvd&*Ba%5krgpwIfsYs6;7B@)_l}R@^(#bp=xh2~|DAA691K=Vk zd5?nfwKeJWLaJU1{+D`PfZWpSLMYKLg3{{}D7`L)(o6L^7{~O!)1Krv!xxi!xouJ* zZ<4ilVpJ+_N-eVxtCD5riA##_Zqm6_CR>s5laqNPvg!QG;g*o+jLm%Ln_&sRZ-F!5 zZEz{P3*G@&z$f9|@NIYx{0`m+^&IR2Q1^)+gt{O75G;fb!+qf@sQJ|Yf``FJ;i>R( zcqx1m-U^?FnxFX$d=0LKZ@_2am+*P0_ldj!H-)dm3it*L!?&Sq`wmnYoW>HYGv|;e zf7QB|l4Vd9Yn>fw(tC$Bo|3~#H~H=F&g8N+WO8yQmy=<il9|rVGdW9nW+jcdZKCbG z?8)ACq`^H0lw2w=mCt@oepjB`kgQp76zm1Z!1ZA+<U59@+%|w!{N_CwW-i=D@KAnl z0y|)TD0?hs3EE><^5oBoOD`wwp?hr;Dk=&l{O-t}m;v2g`bS#%`kP+L;2wJAwzP+I zP836QPB%%8U|b)8+>&i1)V8A>Jr?nIuzgZ})3!A%uec|pNicd;{aIS57pvrIk$O*F za!3!fPmG=CI(m$QgUK(11+WMf!7?bhE1=4$mL;g)j^yc>+q1mt*Drrk#Tp`_%A_wl z+NYsRnWQTNog-KV`y!LhyC2lK_jhER$lpO3yOKxsGs|m!87s=yB%>#e4dEDW(lI5I zj=P1E*?<iCJ=2jT%HKi1R{u+Kt6skDmnE;XAh&W27E^yw7E2pvy?(3n1Z~!iTsrq$ zsPoTr<ZS2f;9QG+$y1%5#PWt;&Z;T7)@TyMP5yACf(^0CQ?QCR+Smr9QVf^4pPHk5 zC+WPByBkcj*~lqb7D2TeM?uAz#ZdAc4dtKnS%UW7mb~>?<lk@l^~f)%s4o89_IB^@ zc~nd1vpR3k{-+_QWH}v5o--V|RmXM;^lPV)C!G~P-}1{{YG>K~F6$d>2V<Mg5tQ*F zWYT#rhC25pj*Rl<ppSTEd^;#(!9-))-!EnAoW*o<UhBwtog?S<j+|?<<vV^ki~dSm z-s#AAmm}i}N5(bT^4~!j|6*INa^!r(k@H`UoNKb>yM8(Uu#{`#m(MveKJUo*f+J%s zei@AS@)x)6yyus(?2ih$HZtnDSe^GBN5+3UGA>FZ<1F&jFOV<1@0YPWKi^cHp{#O~ zKfJ0H$YE8o6;M<vCdU(%)VpyHv4U`918z_c$q|eJ|3PlarssJjpPuJcd_9UK7z1XK zr)^aZANchsm|Rfymnjm|LvjT5_|?&a2EdFF={aNRk<Mq-w^i9qX8F*sM{b!dkKY~2 zf->qHK^gT7v(Bq$n04+xj*RK*o>#_?{4$o?j>GR3F=ZShos4>ZS~BYSY00SPr#rKw zoKV}2WBJ%GV_Eqh47Nc#>Ks8kZtKXn9n`t?%ywro?!o%*EMr(c@ynR&)IHWDlE3b) zWuH~&2+BADnRMQfQ0Lb3;+@H;@gi+ImgQ5wj8&7yt)bVlmNM!bK^b!#8TG8X&aG$F zCF5L{V4T(Xs_OnCme2e$=9f%1GKN^?CchmO!xWzUG0cp;p|^8|mW)|B?opu5E4jNt zw~wf2<Ry!qkskyrp!}o~N<KX^-<hq;STCQ|_MiLpm@uhy4SLAd(!&#Z)Aa{+j-ag% zKqj3x?8rL(H)NDg%O7%B{^OT1cbvVBWKAOZZT%bmAcMO}=a7tD;Z9EGEM(Go^)3L- zztg(_a$xgs$f~PR?W1FS;g_|npy<!>U7aInPrZjg=RFYW+y^-_*70}nx?pGWwC#>8 zU;1S%EG>7!DeDqxtt^__chz}<axQY@)cX*0{>6@*4g4Lv$0^s6oYMCzznpmmC8Z^0 zf08|Qo}iqkICAQ}3_Aa5j+{sGckp`UCh}DOu4Vb!FK4B7Po2R{eq*j>cg9{)4&)f+ znI+!q$La22q2!Pr>%wX$|3c)JY!|`7@KU%dyc`z7rLYZN2^Yhw;4$zTD1DYe#g0`h zLA{@0{BIlbAA{fc^`2t&p3Yh~rRv?nDt`#nRjenN=(<^^bM^K<u=5i6x-m}Dl(T#o zXK`Qprdj2x-)SG%Az$t41uSloF0x%V8K*j#x1+oCy94eHSHMzu4^&^_UMO4L2Tz0# zLW#5z>OR_|Z~(`B0`3f-gd^coQ15Pj2I@N$tD(kVpM`qI(hG0}d<n|-XR-wA@cHDa zT($1ofbDt2#|~2b$!@1!^~s!1>G5rCuUdATYI5v<l1p|}Y0Fkh@1lofeGke9KZK*; z$FKl?0_6*z!dCb>lwSXV(qDcV)c<Pobj-_GzDw1=&_volS%0@}^Xe-(g8Kf9+>-4V zD19?~S$(@e>Dv`b-)>O)_JGnO3rgQJSc2CY%gNI*m$7{B*SFGrr0Y*sSH&$+l>X%u zx2ZSNO_u#nas^{fKlG5Sd{5r!-yf>H`L4Xte{(3kw}iT`+6o>GLs0q+fU-jcOEBhi zC2t*P`N408+}t%ZuWtDbVShL2c#>bo+``G+iSz6C-yAuj{2lba5#*`=qBibFza04m z<0jdbDa1-QrG`HhS2FzB?q13@iOwVW_?IDHQrZK#bndZG=l{DSXS#YajrA&vDwd!8 za#og4DzjI2Ay&F+O>(L~HJXimVS0@DK8g<EUTrHbc>Pgw1obFEZppSclzihIJr<aK z3$sBYX}z|c!1A+SkFq~akxt4$=MKs~#gTm~luXkc*=zYbc&#8m?#@!i@{3>g3At;U zSihG2SDiyL%Aa>)QL05Ioi_^A*Q$e(p?)o8{WTzKi5=452#MtPmj4e~TOC>399iRz ztnH4hXK~8loOV4|C7&?wWmN~=CUbwOq%6O{n%3)uesR~j@1=^j0ZV!2cysSCl=$r% z%WojtO_ELJp?a#mg3@8=B6*L5I^<Ds3_Kc^z++$&JQmJ@C%}{768JSd6-w9Bq2i-r zX3!?Lkf(E8&ywl4N#37olMpAcHu2eDI@xZLEV9A6u-eJI2-zjyWl%O)3T1;Up=@v! zlnt(ihrw&$LU=8dPS-){ei}=#jXaJ#*?SSoI)2?N%S-LWY+u&7$?pwv-Vm#Nfi0Uk zudbeXrtGz|)jQYxR)w>_$9enZ-adllk{xuYQWm8<&_lA`4Yz{#z!C6XSPbundPd;^ zI0rrmrPo7H`p;(xwn?XuC)*y+(#5ZT71wotN}teeLvuKXn{;03*A0$zGG9ba$?_5$ z1Yd^I>vbsk-h|TQP?lghmgD2HO$qFp)T3%vV~ZX$HLZMz^=^_~oy5eZ{+=0r`g}yV zoX_&rHO1zcxq6BQ!AAEB@)o;CfI7eQ>BHX#JNfS-uVi`;Dwci#b)Wbn*bF~`OW>za zec;dGt?)nacK8MS8Ga2z9RC|Q82$i@;Ez!H{sd*0vsr?DAI<BKO*NmaThcCycO|yN zo5NZ+`K_W@SHY^J?(%nesmI^7kt$_~r988|J#Jnsq+fB9(_B*5<~X@*b|#CPB%5s3 zmkjy4QWo#@lf1p5e4q~;0{cRhLpD^ua3d&NZVXjF`a_MmZ4Nu&7VvPmHB?Lq!Q0>< zct0Erzk}OB*=7io4d<~0eXEf?m17M{cfSn_N~;R~&}Bo2V+9Q)`!uk)N#~V)bZ)mj z7=fJny&F^r*#pY_W8t=NPgn?Zp~`L?tb_$n$0&x<qXbIdi7dgshr*NFU+xjm*Kr!Q zNF=}0c=|&sH#g~+(#6|nu0{s^p6tky&i0ybB!6gtS$<jeo={;&@#Pn8@(Z(8t+kO@ zw(oEc0(D-=+nc{tPD(S7Q?k^+zriS!{pz5``5U3;;Ln6lz-Fl9#^6`56=rbUIP3@K z!U8xCO1}lLGanqy{yO(?mURPmsB~@=gjnaMR6EE@{+g^~dTMgQ4$60v{+1n7emgmt zM<S<WSp)~cqoCwkyq5C!Op)J4q7cV$(_bn7sgC@oIr8g$qmp0m8<qX9VF|_neeX&- z>%H;o`Q<OnFR=2fzPTw?{^_jp+rNPvkNw>z=m(Nrp4m(f!H#5IL%lA~wBN>&Ll0rS z&Er{rC$yStK(!HWlDsOn0c6P6l&*C2z8-4c;EgZ`E{7UpxE;!m?|>)6JK^PU1-u{L z1D}HT!e`)p@LBi(d=owlzlW=!zR~dr)L7P|P-9n5!94g3tb?oJEciS;1ik=|fiJ>; z!k6Gu_zKi}A76#5;9Kw|_zuiO&-dYA_yOD&ehl@Vflr{mvHBTQxqS{ht6yItx8mw2 zEWP~YTTqt&$A*SN9P18KcrBG~Nqs@yViq^)yecPezu`yZlq|o({xGwTeP(?fn8WXG za4PHp7r=Glv2Z<j2J8(lg6qTEVPB|n%Z4hqeo%UD31tuc9rSn2%ap%w2z&eOk(cZA zi*s1-CcnRXUySa2pKC3<5{gpRxoe|!rn4L(XCO;?W}&GPa(~CFd8z>30p3}xJBfv) z+N0p*tv&9`m&jH*c<0$lUzLOU)jzQ)ZI69qgJEzm91eGbBj8v#3XX@nLe>3Ts5W~X zloZAAB3J_Nh2!DNuoQj-%iy=L9O|4^Q17IyhJD}^xGkIp)z8}pmcjjD42Ge`fTzRL zVFX?TXTa-VEnErf;9IZ(ehO#8&*5yS@@<Cl11-UM_Rp|hHqiGw`}qApmj?-7=sfnN z^@Zsi@;8H_0^R?gFQ}GX%0gNTUvNJ@t<9ygd?Cc&dQM5{Kx`yC90uhJheP?oLMUH2 z0je&Z2zA!e;LY%KC|^4h>R4w%#l~~s5O^-sIR6Du?>@W`?gcM_Q{ZLrKzKR)2fPxV z0k4LdYrPEWo$uGe*Wq<g?|#1?YL4}dQ18OM366%hz<hWcoDFY>N5VVcQn&(M3Gam} z^ZTIu;yjjMj9AEe+2jz>?;9m<o0!9TH~C|PN?2awcLT*WPn)QXLS!XFg33}Mz+bNu zb0hUUnVTe^%5iHl^z5M0<LD!qS3|Xd&%qq{JX9O_3RD~TDpVWzI$Q?dfUDq}@G<x{ zd=b72WuNz<+Sw1_rtl*;41Nanj{g5ZmERZe2>3NTAASRGgx|sk;dk(H_yhbH{s{H` zI1Jsf8C(bE!tSsZ_JDP8UAO@Dga^T1Q03AaO1`sLg5y4)nZqJ8?CUSTvWiJn#dg|+ zYN4A_OE8C3{t_%E$5Vpp)u_S@VDXNH+25Ux14%ZO-MX-vMJa?XDm%Tqd<4|H%gdnN zSw07D58I&LS$;OuJIhx?y{lY04uzfBLiswj;&OHxTTJ;wS9yQj7A?r(CdnpStOskI z%(3Vqd2^s_F%HTW`B1jdJG^C!VyJ8Dz2S9mJbVP|9p2BuGANz(E^l)l{tk{2JxZR= z^$^Pje%t(4-9&Lz@xe`!OLmc0mO7bwm$+oryTrGF5tsvOU=6H=QCJUUmj)=k^ltIa z^jCe?F&}2xFjfEmnrle^1{OC-F6pnn;(ktMJ9<dg1yK4Q1asgaQ2HMVrT<~@5V#Ot z2#<hwz(r7c9tCBO?!=&=KWOYpX2^y8{Pw7tKe^ftnpUuZn^Ztfa-Jfb&d+4nP)wI% z16cItw%Yl_Oq;Drkj%4h+@DXLeI{ozoj*mFA>?de_Ozp|p~UZ8ip}-{?aS3$?5mZB zvVoH^jE5oZ+)(YsoBmsBG+O8eEqhpZkXH7;mBmf6gY4grjH{hYy|-K@IS1|l^`3IY zuM45-?nUq@criQyUIv%K%i(=c?<-fmyb^v4uZKTCy{~*7&bJ))fO=o~hVVA1Z!g^r z2f;g_`V%Xl`Vsd)mD9aY<*9Z&*bY2Eo_uHp%SOTSTu_~7?~%%CZb~iC99AU@RAyJu z&t@sl95>EbS>+Tm8IF~;l``yB+=}&#9W5r`O_EP`?gI~YGFPLIWPTn><d>lA{W2U4 zUxnk~>#z#G0cHQUU^{#pE`smEli~aDV)y}E4nKyn$0tyBliLOBf%<!@Yl^cQ2kchi z)`Ji$-IQuJ88vA(4X;XgPxC30$nSDk+@$l$9^K$bC-Zyclq^3(>H8~e)VjX59asl; zrbi8%Y2W=>HVNoa_$TWj_1vWMN{_B^CnvKHa!M9nV`=p02PN0Wj{J4}9rRxrQNEz^ z@1H7v#qXb5X&q5^_sXmD1mzuoTsrqa7=nYK<QVM8yOh6!ezSx;>39swrU7{?CKvu` z)4x;$H()8xoN6Lkh`()Js|p0pX{PE)-{~xFlAO}l+XowpUXp!RxGmfb?gB@{LO2GN z!#&_k_;=U=_k_}SFDO4uXO{!X*RkU)n+5Dr_&>JGRAh3K<dj`holBj}@#rPlCqmh! z63Q-BP<E+?vdd&ByG()7b1IZQ=CTCG;fu&qpRa&rbH6=`9H(YYBBe%`zO3^{m;U4g zqKh31@%p*W8}##9<diH?I0V)~$yL9W@^2B4ztC1nj*v)ysr+q@{BcMAc1QlXj{Nfw zBY1tgBYDz!dzLNz@>f+>3^i8-tV*Oms(|X9VvCz}UfG|28LGodhdc5wgp%iowUm3S z6uF1}SLI&f$bFI{H*+hEzpu&OTc^l9{J$#q`HtNGbmYFkkvm;IRe8uywqpqe<ep$> zOR*-A{-~RnF-xzX=)6Hcx!RHY8Yp>|IdZGd5NtQSat{c|&HTW;l0VJjHpZ+;_S+rV z?{H+l(~*5XvIpBxuj~T@vR6&{^F$BU&2%<j>Bzmxk^2!x?sUGAi!N#>^t{WU6uFJT zL#%RBs;|h1{+O=Noi?U>?XB|$edRgilq}Cf$@8KkcO8EReWf3H-C5M180?q3u(YJ2 zd`;85G?3SqeUqXm`&eE%b)KM{?;w}X{couAzw5|Z&)>oM|6Vz_Nh4>Wy_LhBiIi&N zG=c{GAf255ape5Mk@HJOPW8uw{;NLkI?l4KU(TxBvLZXCkPwkS{8Ad@Nv0v5ZFEf8 zPRHHC$^Qiz^qY=fr~M3XJGWgxmi#q6JC$0nx{B$vpW!X*bnRR(<Wwx}4OQ3r{D$03 zte5}FUxx(cw!P>OtK8(bpyZY?Nr&v@>dVHi9QP<t=arqk*I%0<r)1e24uV_2Vz?EQ zd|N~H^J-aw{fr&RlYgr$xA*H&SzWxQ2Ub!Gz`bVl_UUvE$t)jnueEkSCY^UjxRLUq zWZ2n}wMKsjp0oGLx<gRbKPIYa*VZKKXh+sDj;y;ovhLx?x+c5s7?d^tj|r<fw<cK& z99fx-Z0uU($XdLXvhEa+byD?TCu^l6Yn3BwwIl1KwUl+|fUNm{p{&y#StE|DGaOlK z)>78L1!OJ%gN?!3_&~EGYs`_g#gTQ6BWt?;*c5zAF=QgkE`C|7{)+kPIh@B$I(IOp z9fGWq=TNu{?0|d1!=Pk594e+A#1g!3?A2vxK$nrD{#<QT9yu&-N~g;S$SPe<gwo|C zC|yp5(&ZE=U2b9t&Y>KhY0G6NILxn0QJ(3t<*=8VQk$6yR{5KmspNRNZ2p-)rGepR zy?bg*_Jhvx@7-1dp<}XpBaD)M+pd&}qw{U9`CoFYOndQ5ZI;qS=qWo~4hO?4;I8m0 zSO~9%jqn;c2QGu^$6gPQhBv^c;Bu(>>bF4I<yI*B-NF)V-*jJF=hSm-!~OQF%KP(% zyF#2|0~Yr#qtqK<e#@d`vajcFCD(#q*`FB?x)zilwK$oA<d*%^A5r_Fv=Tj~%VUuJ zGM<3yJ3j@-!>3_0d<JS<_&In7d;$IdUx7V2?yFGtcn!*Kr}B5u@9H_X+T#cu;kTP} zS?QHF)$cmk*Y9_W$w}jP1ITu*rW0B#<|q8nt}pdXwUMKpg3u&&oYa-d&emb(Mr($d zEH#sfEPY<GyYB!yuybG2H8or3c(=9(DE4Lz_w787RrlMS)&Eg_vM*-i?B+~5n+p8^ zD`KM1HD650b%JvPzlUOLcfH$>df#T5|5YaP2^GgHPX3paq0IIj90$LLx*zu=RGs++ zo(q44_d)Dy?!jilC-~VFegM0{*~r@y%Cx=UHLy3-9FM+mJ><=XvRps71KbD}!TvA` zH;0$OE#SRyODJOvf*-@da1(Uc7VZvrf|YP*C|}%%a|N&eMzEj!erGt+?~7IWiJKkM z*}_d(?jHo_?7k``d8^+a<wOC0lp(GErN5geM;pMxmvijhJoRRs40|_kBpD&IMJIRj zyfens4qwYc^4}|*YrmnI!wScVQ(ag)H)1T3b}oj_wsz-=WQN_@25Q9_&HZtcY%8A{ zNQUMHDUG2lWbeO2&0ooZiqpAp0?dP|1cmS@SOl+x#ZdZ`!c}krd>dB4Z{b9!reiA9 zeZzgA?i=n4B~utGE=Ay2I0NRx8mPHvbx<ld!i8`qJP*!>*TZJ`Fl>SPc5Ewr6}Cam zL7N9P2W<iT1|A51fd|1X>~JU?1pfi$YaLKNDP4o@%D>3#%klursDMxI<BZQL2)Rky zI?3@!6_DQ}6-hiEX$maZF6g|$cHubW)bWppqu>%a5uOBf{eLQq!PDRzcqTjyo&_&~ zXT!_jc~JVC57$QTT~qY7<GcSYy{|-0>3tQH-pio$z7|UF8=&;Q5lZiyq4d55O7B~t z^u7a1?>k{<dOyW_o$C>n-BR?n<HLW2-a2ovyjLQpWLX8J_oJ{HJ_aYlCt*8$3d(m^ zL)Ft~q3Y>#@M`!Xls+%P&h*xOe4T4F9G#-K9q9P8^j^Yw+@$kLZ^fY_oXmHTQ?k4V zrT2$$BK!!dyg!91@6X^I_ytsXe+gCIU%@Njx9~pr9efS`0Dpo%!p%7EPf+^)3}qMD zDtL|YHR~nYXK;+)E+u7E)p^yGb}C8^+qfyURjOdsZ^i(B?|i%o^=hRCve0X?vy=xX zGVGK##f%qN+$33L%l>3M>SV6Fp^fpqq4w_s$G{C>5$p%2z>VO6aAT<FOE!b&z%AfK zaBC?041jmSf$()W2)+Y{K*_TM?1vmXLdE!<pyuW80u|dw!5X+Lyd92)cfv97QMfyl zt@nT`lVe$eWpX*|RVEi|dw-c!<>i(o%0xcorqnVCvC3a2GPox$t4y?eoTWU|nK>dI zS1Q*@l0`P(nBTICQW3ICzEY@Tmce1L0{$INgyUc(%!gHQZ#W66UQdSm!f9|3+y|Zv z_k%je{!lW6q2!qke}OaL_Q+EMN5Loz!#b#EAR6Fluo233GofsJ5KGX;l5ahh9F{#& zZCpLA!akG6>O{&){N?t>R04h*%QrnXPPBdA*rIdGrd{DqEJ|~cRr1V(>Z{C$IdFla zgZw1epFA5Kdy=o~p0R!%bU&fOzWQt^Te!)uLE2g6Ic%F$NwdmA<P2bOzq6Ro=^irO zBw3`>Mr15^GLJ=e$#)7Yho?cs_cLK5JR7R}cMd!ko(nI8|AaTf3!yIAFNSZxOX1h> za@dXYT>;hKx)SP2=xV6z=w)y!ybiX&>tQ=w4v&C0LD}qPDF3*MCFmcyte21P0so$A z+sY#6ZcXRbRc}3qBP5NfYrJA|JpSQMk{dv_d-WLNZ~ME%Ts;m+{B~ygs!q&jag$_~ z?R$~Y<YeB5Zj%2ID4RbDr@<#+3w#o)EqxkZ51)ni!snpk-ShBW_!3lK_hl$syaHu2 z#meA2-Mu#3Gp)^>!NUK6(bmRh@1vV+_BoWzzJRjX*HAY52FhmNLD}p_D4YERWwW25 zY{q0pW3x;so2>(7v!7XV0`~&?tV3Htepk3x(q`^^@GD}C&GB%4V_Qp8q$WB$+8j4y zWsBLvO?}-z64!_qkdyQ}x!6*2tk=yqE_Gev_X0C;a4Ww(9}ktI-b2=a?()jkXkClh zOFp*&OL=Ck`5o6L=64Hq#g1QG!3KQzRy&Nz)&pru8Yr-rZ5b*Do!w2+U%tB`8J9Sj z>tQe1Bpa5(4Pia(2NlaVf``EV@JzTVls|3(Z--k!&FkG7ehEV`15pM*&HEe-w}RWi zzrpR`QE+>xHhTy73ET;)t=<``{Fbu>zgsk$^@@3Fe{z!LXTA@<Ps{MIDL_+ZY?Me@ ziNDgfBnrFz*=7KX8+P59o=yqa*X=7dI2jB0!<IqF>=lo-*EATj%jPOOH%aDTyx0vL zrN?NvJ=_CoF8rSGK$rs;!d!SQ%!l{GBACVTO5v`s464st4rP;xP_}!VC3qi9&rjhQ z8SlZ|r0w)veO0l2Yr^NOc9Y*|X&Wz<a?<l<F_l@uV)E-#$r!-m__elKo!rJ6QI*+l z)1vxkoI8iSgmYVGmR;{*ag+23wt@ShzjUmHxv&ma!+I#YHbC`9XTh6b6TBTZ!zW-1 zd=Jin>v8-xsOQ<*q57Tkp!z`bVFVrs)&D#g9uE(NSHXY4>)_$=KDZFR0FQtwpRM^j zSU&Tpn>$JtI4)Q|cF<l1cay(-%q>;cCW}MX?@x}W`CFS3>c?&>kZhLn%$is;j@@b| zL%*NMouRKi>EjC7*<X=4z--!RD#XW$-+W}dHE#0cRdyTuL~x1|C?kiB`~|M^zLmvI zvX9EU9~p{2N~dB^+3Y-649|xrzzg6-@FJ*kz8Jm?FM)5s%b~s>wiIei=}NdAyb6wh z*Fe?V>tP4H0iFey!zbY_P|rBs1~nFTJKP`M0rfqQJE6*1=L(kdN9-?|HMW!&Ea!bp z@anuCs+|4RPUWnS@H@*{g{Kl7z*3%R3ols_e@{WFoGxH-lk`(L$%9UHGFM^`>HHKN z2cLnH;A*Hg=2_SQUw}8m7vUZ7b*NbO22{O#6ZYZwZ^0b+4%{2Q2i5$20569h!l&Rz z@EQ0qRC&C}5}em^4dtbN$mK9USRNH6_Vr2?Y~Ut;%}W~@r?aiUDmIW4D59atVxfVz z&CAGShK-D)$rxa^u#vGpg*KMoA(PkG9FEUxY-+4;h<n?6m8zSho616Jz2ankhb^S< zPjEKuvXT8JUN@-n>JD##J)o`+dqR1}daxI^><!hPuMda9Y&afn2&co1U<=#?>YhM< zcqZHoYTR{8sCxt3z+I4UdpI8M04Knm;Vifd)bo%-;bJ%fo&iTfmDMPyGJS?6Sf+Y* zUOMgu3;bm|p{k_vPkBdBx{Eb^EqXBLb&9o-AlO`^hjYeccR^((-MiE8OPt^CZJl>K z>l4>}OYJ`9f9a&M)UkE_rj&~fq~|!eF)V~T!(zBE91mx~QmD8%0iFUY;pMOzJ_{$o zbrE1PRQ#I;m%)AEhj2Pvhx13^hOh>13u~cl9EB>24_Ja@-m0gPad%i4D2x1DTNF90 zcay(*Dd4H{`D@cuay+%kZ}yt@)^IJRH;qq-EeEi;{kl%R=dBV^z)^BbM8QHyFZ<K_ z4NyQSarf2Evsz+v&HvI>Wh8x%aPsG18~vUqo52N875gAq3=f7XqeEZ|q+@9MeuqO{ zk1vFZeMdmqcM+7W7eh7h$3TtK91CUR<DB)a{2eTdT*^wa=p7S9fwCxBV_BpPb!$~P zA<j9Fg&xJ+ctLZ#bphS@?ChP$vQ;J4TAwU4)t~`pYa8}DDKqa)vFU8S7==k84m=dv z1FHwq8fyykIrjEwxTZbcXkSy}iM7$Dc!U6I@4jAQj$vN~szRS-51Md_*PP$3Q>Zp5 zC7t36e!ZbAC&}jWiB0*v+Q~bUGEzDG6H40);2!WIcmTW<Hp9!{N$_%bI$Qyl!F%8e zcprQhJ^<H8vWKAR?<%M<n14Z;<uRyd@SlQeAD@P*-_O8X;j>Wv)aRgL^9%5O_%hUc zCSHTOZ~How@4Nx!gVH|eW23s+IRLxB;((9kJE2#8?k0bIPwQhHZ0ipIi^=IU0Qj6K z#FhhC)(`-^&U84Nzt2Ka?@G?(+$3Ggi2@p`j<Glg$Pu$8LSm+YDt;m>b)vvd*p;N< zr%;zVQNSy19$PHO!AM)OLoKwvKfAHHad!J`Q?X1t<T|;UX(cz(b+e~S{5~u2yTKkk z5eYlG`uAVq{7zH?)q(lWNwleaLUlkDzRAh|7#|wK?@!<^@ISBwehE9^H&AWWx9~Rj z9hA>AIBvc@x(?L1WEZIT*B#D;J)n%=6CMZGgSr;$10RRkaD5cq0LrH~gtGUha1z`c zcEGLR#c(_L1Kbg2N(Z<R{2SaJj(~f?QLq*63gd7zJRgpQDxN*zLogRU2J_(aFdx1S z3*eiu7=8jv;J2_G9)p1=!UteAd<#y3-@qxb7xtYBLvR{Y-Bi0BteY3HUUBDKSQ4n4 zZnx;Ks+$8jZy^3BgK(nCD%N|Vx3?)*qiG$x)`aZNI$+6GMZEyy`2H4zHpn(M-da?^ z(bvVCq!2Qwn{7{)t_2Cs49a8c`|ZxEf;owuJFSA>vWb#jIjwf43ni`OR>{)?zvtPb zC#vA?l%P_g%Gt3#%G^yVYt^|CWVoHpD88Zcp93}S)Cwj0Jh%iN2rq^Q!By~JsOztP zK=l*pWSaYQhr>+HwFv6^`6xILE{3`%a12ym=r~vekB9rh6QSznsc;cI9li(8hI>=T z&W8uW3t?|$zX)CcFM~J2rSN`u1ymhc2H%4>LKWUkaC7(o+z~zqhr@^9Shx}v!d0*g zJ_-+mkHLlT33v^B2C6)th0nql;4APY_%3`IehOcKpTpPTPw)-c9lO5+bKr;Y0QfPC z!%yI1_!(3k{2Z#T-p>+zF60C3qWd{-!@d1=HMg{+sLW|fRaxAW<^I74Vs_uOO=%9B zB%9LCs?cDza;lnJh2*5_QYyJldZF_>;e?9&x0+4tf6_rd*pHv?n9YyqEWI)|vHjpK zP|aaisD5xas2G$54~ISBsjwHk7WRP;z`juZsSTiN(}wUTxDk|Z_J;?<&7t}{Tfw{G z*6;y15Nd2-5R{DvLzTr6{tjMGHd0m^znBik`^%!Fsvyta`cnmRlfNX?j$gp4q~X=C zSW1qk52H~q73Khz^2`~-=rCqykJL6MgIHG6+DJT!I76f=BfD*6C_&x!rk$N_Mlyym zz~Ej;IY*nZz~spAPEN$;lqPd#%%_Z;=liV;v3N^sthT+z4$=-uN|2m-<{Zr)tU7Tp z`rn)=_4cO3%1>-n8?kpx8pyGoo=P*c@ddv#C>J-WJmgnflJS+3Ih68K8RftNI1Ywk z9$WzPq52aA@EW)`)Hv(}sCma_a4IZ^`@?Fe{=+1A7n}mWfK%c2#HfAXzHnc7BHSOY zf?@b8oCzl&V-q|c#^A-U1>OeR;72eHx9-XqGaL*Lg8zhvDjz);!in$*DF1wiC3yd| z4!IQ9)v+t}`=^N&71e*rBl_~P!JK9Q3;k(3n=zEk7-p{O<Q9$>c!S5UWGlJBV;5vq zQt(i4*~jx+10X7M#Q`@-N0s?{WYjvDOR$ObJ`L*H`gEu{5obbea}JEdbKx2AJgBjg z3!ugkFM^uea50qaE`hSK=B5VcHecVv-alCiC-`k#Vn;DL4*+RH@dcbH84)&iY-=s2 zF^twobA8lUR6QT5QJ$F?@N@e~_98-?&xo`|=^NWBW{(nUs&$T{e3gscJl5LYX1DkD zfUaVF2m_N;D~qB3!o$1q*H~y?SF^E1(N&6bPWMV)+5083eS<Oz3+*i4YqIHyO`D_h zQoCoTu{yIm|5@SYL%(qDwT*5QD7kKyZ8b{#zBllDv{fRpzL~1#-T#Zg@8hfxiS0iL z{I0`2l>BWXzU3zQk^Fch8CN^`H{f^j-`ij=yaUQecfteVT~PO}9)vH$RqzM+FW8%7 zJPLK){}>z%pM-nCr(hI51CNH!!fW8m@Kg92)STAWq2{!{0lQ$pw_#8C4qOEP4KIQ3 zLb=Gtum*kxm%=aMzu-4;90vU!&VxU~TV>$>^w;1z@D11%s-M&it_OR-zOX0U1g-}U zfxX~4us2lcZwSZ0jbR(y44w|Rgx|ug;V*Ci?1r5O!Y$z_xDDJ5ZU@J}UEm(D3GM~w zz;SRP%!6mae5iPE9!u~(&P(Je_N-<p^T&fp)qlzevpNZbIeLhtJacxWZC2VQ)N`-D zgDu@8`Q&H4Vcf~AKp)9G32qCgKn0g+Q1yKuI1BCzb#LGR*b1k^!(jw!9JvOb4{PC- zunx)&^-%V@pJlhe+zVY#^mo>kC+*eP-V&Y{Yn>Hs4YxHk*2Tl-4p?6{bW@i5hw0Vo z?N=dkPTEdJv3pVuHoQ4O#r8&qvXzrDoEFA*WSk7MhaA%eE&4~=fZxs@ji%dSuBjB- z+$0@jQ;DRGlG1_bEWQ2#_k{c~{g1<;`X3A7LU<(nCtL(&pT$tNDx+TgJz%Rh$kQ=j zf)#0P#f|c4YfG#t5|3JoO=ojArCO|oRVfymPo~de9m$O0X6S2iB7<ou!%Wr^Z`N>g zXV}xv)P?ylW6MxtJ9~3+2*2GHqP@)?K6$0i^}jv53eDZD-flHIkwqh7&zO_QGD88w zO}$W6ad&NRvxgg*$YWo1Pr8^wCf9s-^Jx8{y}X^!`0SQ&%;Xib&KgL0t@wohfuMTU zJHuRZpJdm0e#)j_vFW=+Sd#AIRl^WVd1hNpq$#T5>Bd@f&I)p^7G{l4<hxkcAD1BM zd{d#_)Sge`CFe>w!{KIY`IG$iZ~W3Vk<v-{pM30exD7l5?f}n%(&QXC5uOJd;Q3H( z&;?L-y9}NLFNbHrrSL*{CA=D51#gE}!w2EDP;J+BP=0?s%tDqMp!(rALiGukL$zHu z!zu7~C?nqqkA-(b%{#pZ>bmYesOLEDhxfyW;J@HX_&Qt#--M4qmB3?AZQtYYOZYUD zQCGtq;q!15d;zK-_!685UxqdCb=U;ogmd6q@KpFNycd25pM@Vm)!$E`^zF~Nf^Eng z%0zKk1FRF1_1t{xVv=n`I#}(dEccHLcOsK&W3msa$r}fglg*NxyrE{KmYk5uHO+`z zFwRfw-0GW|`Abpjf}XfwCgiB|*p%2h+FTp9_hsCedWs3flex=mpO~^ot!r#;izkk& zGs=s+>+Dh7zP{IAWtX78euo`ptDc)$zw8a?@w*R{(tY8{FdJSBH-tC9{!sq6DSQNO z4&Q)V!hgf9;P-HAsJ>JP4uAvTAUGHff!n|wxGkItw}ZORy**qAcZA2lo#4rED7*&_ zgDc?(_$nL;bsf1Y)O(J1gBph(1NFY+Jzx$T3ya~NuoC9L{opuwD9nd?X08M-gQf6R zI04=c%i#mC0=@>TU^nbK4fcZjKs`Gcfq#cH;51kR<*!>JV{i`i7aT|Z2R)Nl>G#+C zg3{{0=nkU%Y$wh-kfl5`&oo1!#P8<z*>=L@5V8iCP3$*|)Rfp=DonUk`(S_1GQX2; z!#IAA!EbC@iI?ej8%ip<7pU%omx-Rez5hEJJGn{rk>Bc68V6O1VNcm?E*u2sK{aUy z!hPVuFbWTasvZA;XTlD62|Ns50gr%p!bR{Ucoh5+o(R|FTqi-j$N3bfxoW3F&4)b; z7Q(Y(F+2}e!3&}8Ze9!*z)Rs#@G^J;yd0hhm%>NkGWb2b9?Bn=L%qNGCaCu}-wH2+ zx5G=|op3q43qB85z*peCQ2uitl%J{21^sL|>t!?Dm#IqQXKQ+fJ?-_jTGnK&R8*Ww zj%Nh!clg;r_S91x+U5V(&$3Zc$^F<Ue}2Id!Y*!-J>*vd$mr+fKaTxmqt#G;^(>TM zJrCtqFGBg%%TRvx3Y1^H3guU?LHX62P=56`d;z`#RW9$sbvW1ia0B=u)L04Mr8n~o z_^!HXr}>_CM>+X?2ilD7^KIacIsE2(rDpu~dw3|ne}cLOrI|3#i>w2$;&)eg8|(%Z zFZo`Pxd+_?>Y9{q$8>Ch{(R%2V++W8+s*wt-v4dnRG&IHcCPp-+w2aj{r*!_P+d}1 zSiXj<3=M#UIDp?@6k!7XLXOi18*lo;YN9V9fH0}6wUJM9Wta|`%JY3~>Lkgh@|0+= zIC+E6M>1~%Ri3;b$n?i}XN{RN$NON+bF{pVz?3J?*PH$r&n%g_JUmxp=E*as(DbvI z%Vyd)#;Q!a#x<&W|G^}fk6jOd`@t~O*jgRb*mpfV8@9mZa1LAn4}$N*gQ425qoB%T zG1Oe3<Dl$)Je2=vI?b+u>l*cfrQ@e8$l)gScPN+1xs@fk)g{ie9y#t>D62YYZJ&eH z@KcC=Y=?tJA{?0?Z8K$*EXJBxtks#xs#<Kf^<4XPkm)ALt}^ppPyZ8LrOyRWG5<n1 z7G4Ic;ZmqR$`w#!&{xC5;4&z`y%wtOT?ch<`$i~#SPo^Qo1tvkz!LOvjeU1#*_>r^ ziY@bVtJn0QSVh3T?CkMqw=X7RxJl=c-uyG|n(`k&E}i>9sPjMM$f+_9$|)bx{hnoT zieJu2W#h}rr`Q*<<*<pH)>PbX?fmU;EO;;W-r~@g+QUn2>1V&l!qrz3b=0|VQa!!S zZf5?M?9zQheko=uJ%+B*=W$2(C*Tx*KMhsZtD#QyBGd)j%kT~O3j8;G9d5;O--JWq zTd)AW4JX2PU>Lp&)h@pekAxpUwa*_x-Iw?T%BG(}`N&Z$!RK9;lV@xX_f6V99uK$i znZa;NZCxGnqclcb8=D=DN9s*j^p?KAC}g`Fj<rQ!MY!h3Z2RKz5Lqd8XF8c~k{k`l zx-L|`P&%6~j$~sTsbd(VKA86FLRiJ`i=h1eVmJq4Q)Ac5;4*$+4yE_KEJ3|zlBZ+W zvh3&6yQU#pGb<c#ZLFEKpgG#s7OsoTZfsic`}OXh(JTAX?Kr+k=73=tq>TV)BTt+) z7^&IJ${E6sq}9Un8siPIb}o-FxxHjJZGMG4n)zQk$YwoYzLS3~I!mvQpt`Fc!;$b4 zxE~~Dbj*OCL+OrvjEx@T@3Dbcd^dT0SZ-t4-)Ez?1<mn>a9bUoVa(OmK6?%JabHP) zs_~1qcxyB=+l1O;4nB~DuYpCI>*Eck!z5d{?xHX~IPp7iI*rJL$hJ0&wzkHcmelr* zT3F>K=^;CL?+g8c-qI~2)6R?S3U}dWH>hWwdceJ57L>huLe-!3pl*ZEC+)Zit`B9O zzEHk)63gxZJ1S3Yz_Bc}scxc<)kmpkDOL=*TfnU3-?VFPWa5n%7_5#*(2Tj%sT;te zY5KY@QRPtDpUpb)9my2*9mXF_TSe?K-(qFVr9(x-wXS(z`8F`Z@9m&;*&a$~^%cei zbY4PClvwj1{RcOpb4vX(256*_-GVoy<Clr#(Y+wMZ_kX~&GQK5nVIJLj*`=xKU_P= zO&(&`5KDPxL!>R-(i*jweJjZtV6tVN?CeMR+q%t6<{k9PzBW-w9Z`_PMzO0{Lj|R4 zFgp@Q@Y=BCbUO~#Z4(};LqC}~^enTPs#S=^N>tZUKbtdVXFuS}X10+jCbcaZH*k|| zs4`M*D0T9Arpv@Y#;J^dz7H!|{{h?wGN;S<>&Nf{elw0`zQyo4{D$9*XLVq}jIW@s z3BQK;bjEj3&%1E_X4;+~V2Iy8!yO_0Y;*tUSExQdbG=O;pNWCy{!w>$HTk^n#C-dQ zXJ5=UA@BAv_m6r(z2ArD3p=)k%&#+jLh{U*8kaa7L&;~psJUmp5nRIWjp3D${(Z;m zka4(<?;&$eJN|}!HiN}*b2tUk-|W~IZV9JD&ebskhM;^^abZlrSC^Bgn5i~n`fvKG zanTT)xyj?Ap6a=<Z^A9z{*un?CY?{^>WxR+AfIHQpWJ~{XKV)*zZv)G*d6lT7<1o+ z=ON6yC>Ve2=pcVLxD<|oSHrPTdhjfO(RVE83C8tl<f(4vz(^W>+Zvne8F6lo#r3^9 z)ygGo?Iw@PPOa=<m1?D8{001N)sM$beA2L9F_{C+M)ge#S{lNQ&9zZ`KP5l0#@+)c z<+ly|H9SIQzq>nxJWoY;Z|{W2)<c7B?M-$f|41_ISt4zX2kO3fawuO_<8c;}x`qvq zx6`oyjP^RN&g>HeadOKu-KNBL_*5tFVR4ger?T6K43(o&0k)Ps3*p}(V{)c$^2~~< zo25_!l*4~O#)>;mgN%`wxdzpcK1;?VcnzEkX~#3Bz+2!ns5WLlcn>@PJ`BT9O4Y+p zVI$Od<V-jO@|>XgZb}Tw_jSxY0=|C_+sW^4hg{#eN&P=;7_N;qN5eA~#G~dDGIE6+ zcN6Gw1-xGcQ$g+t*8Ah85Y%FY$XsZwoyba4rbF3^H>pzsv!k<PtqW|+CHp_g;wH%} z`)@*qqNviyuD0%sg8lftD;xlKgTvt%m<#uSm5_OUCPwZBPvCbBJP+o<RWKhu4~yW3 zummbL?hVJmQmB6T1UMZsPtc5Ol*2>$JrN!cE8)4Y8fqM45|o`MLzRc_vjofInXYyo z*(%6&wwv7YV7_+TUmlCyO(52D6XoF@;wqTm7*EtsUjeBxTgqM`7G_&SYneUPSc84D zv!|0az+`)#BU6DElNl(`3bH(vR9iKW_3L0$ppp44rk1ISdTW_nW-58Ua`)ET`K+V~ zP?AI~u-3H67-V)-eQJG(+kek(8XIkg`ABMOb%^`0j6OFzqcvh2D_OTMpbXq3+sn6x zk#VY%e*k5*BfqCZ)$s_F`ZJ(T6orkj5voqlg!jT(kUn=t6Wo+zHAB_O7#sszpxX3S zsCln#a3*Yrx`tzJM8`RBKD-tl2v@*^;A8L*_zFA}egr#UCWbl;%3w#r!EiC8?Z`M9 z?g~$a#G{N;;0$;woDWZfC%|*y6||S<!Da9QcqhCVu7a1sPvB+nD|k8l9$o=^V!x}P zjDIcEeA*izHq2NKXTzHyvS!=^PlxxybKwJ!b7VXSuY(Um_Q_ZYRafS+1n0DEL!R2u zL0X@zD>bp%Es@q}xTPg(uS!^*NLh)$bc0M?HdUHl#y=vaci2Didxi}`=DKTWa=#3n zcPh3*?To=r{`Z;oeKG1cNuD2}<nF`8#6}rCvRif73??tswQ>m<<`x+aZL_;3v+X0% zn>#CdC0De!HN;w}`B4T0?Owf;D^u3>O|ENiiZ$13zfGO}vXkrFRa>&^IxMhrMnzRP zza+0ZTvE-Xz`QUoZ7(gz2(dc8fz++84p)sUsSa1?jw>w)>zzFMt><5RXAjPnf=X0P zJF*$BX^OP98HpdK(q?Ln+7UBtEv#_`BbC;z<6oy9v8<p~UHq#|4}x2wy|Z7~)}GIv zF<KX)BM`1{jkGin6~dS@9%V{ykL*Wu{0?r_P7PP*g{vo3lonL+LWA7Of^bE7Nm+Hc zY|?~r1(j8NQ`2tz>-wHe!+GVC*k(d*)p!cNNA{DRqm_gU*fT%BAm1LAZObe3iJ5k@ zj2s=OB+NMqDkl`=Gjxg7bbj2%*(78)si-WOthK2E>3mk866Yi(W%&hDtw4h~%%c)W zMN`n)8lKcVt2s8WIb7IC2d*&I%4LfwKW)_A-KeD5OeP5Dw$`_sSC~jIZPCNsViJ!9 zwKSRcn{drj7>&f+TceCp*v+!s&D;Z3M`kod`OL6gy`H;zLSvh{lHmzV2xh(fNN4F4 zTwl=|Yl*hT7nlOj7X92U+!K_y$D10PqsFq@V58s$dOu67t&tLUrP$crq&gN0Plz-x z2p2OWrj1}>r5NO{ch6DC)pWR+aV|u4HyRw=s7jrpz((7oY}6EsyBoRUbObjlw_oLx zuSlcA-1QQ-kok>n;j|?*I^5l)Djs2ks+@ZVbxpB(iDFskuFs>6C0B3ZoZ$#}^|(lF z;^>KkAL*{mZ=Bo6?&B7O_ldT~5*A<Nu6NB<8Lf-9M)mBndxE3fP4c5N+UvvREs`T) z%Ej(leR@1x(i|?BAFT;j*?}O{by?wPccZdsTO7~hi@Q|`5sq<Jx+3WKm1YX;KxhAB z-A#0Gp5%-*hh@)FVjv;Ip5r)on}lN&wl~+9ZS$jbZ5i7;+Z~^>9XBE3txRp#Va=v) zg*YLxsVYL)@%x0}OWf6^v6_hXZcA+9+U^W@6IZv23K}n0<g?thd9ijT?3UqPg<M00 z^9Z5Q`Ee6XWWICV?Xa6nT-3Cnj*@hG@2)GJ=WgZJ&vA|M*^w5moqA<|rv9@@>TyO} z=QdI)n9;BL*~rM{5Vq;3>(byh_4C8CiNB2ulu&Z5ZG5<{S2hzUQnz%vZA@rtZM4?l zBSXEii`1hx$#Z7R9gQz&QF~dh`o9euu13+$H>7!}WBydH>}S(#)@EYR0NOGx)~dth zl_dpb)#iRuxVmyufqBWCTuEDG2Dhjvud1%ft1RI)ZgSU8+--OPL_ukILV11x|CN=S zLYqos*tMf&cC3ce6qQb^C=M5vS5C;SriGZmfl8_iOvSL<wZ$7}1h=D^oxo%XwG(!u zrg(cSxKa6}>e7-j+d|u|LPe9Sf?HKhE~4|@BYSICZ#5L<vrODj-U-rFc_xe}TvN{d zHobzb9c_&>+q6kpUU_~=Sy8xZ?-D&M;I0mZX4HFES5)SiW80la)f?p!JC7?V8fA*X zId*eoo_FUdxn)(8%8E=}vRgzNVl%y4>|I`*JI)w}_l{?DmGD(1`xJyL3noq~sG@UX zx+Q$Xy}$}t!&d8Pt4bnIL8YgpRE%2NCAhXUFW+dOmF5KAU0E5PY&vhe50p}jx2oZY z$DO;m8*@;t7@Sy9-xQ0~GVk8zZ<EZQPZdZUXxl`-ow#XwjXKbFi50OKGusl!8Is6u zF~?UQEZ$w7twcxD%GDH|8*Q>dZ7*t=F@)>ulxPv|V=Y!e_k(^)KF-}M`?*Brsfe|N zE9iX^Ycw9Cn)Q5QrF|E*xv4=fuUGa9!8Oj1{uUWo*&ks`6@m#5VM0z7W8aFr42@@H ze`eQKwM3f3m_94}gW%@Xv<P<lL9AA^P{BJ9s+u@aO`Iq&VWKixLln=-UZ3#8Mw270 z;e3r_<ZJFJ`^3Y1jh8+_i#?uB_c`5jbG*3SJlfV+PcKU1ZNlmS_DB;<gqvVhpn$Tn znYyR_ia6$k33hv(xl8iQr4)W=XO>-5DjdPDfpnoagk6ZoMlKtPot_erSUPHVkKhQ9 z?~!{0*1nrGtI?&84w=lO(6X{u_$*x+ZHvauw%f9<S5gmS!IF4%wlPpuJjNB4*-rX? zpELsvqv?p3ahX#~BV?biwVUdY-IIqjrb&0m5Zh_&4$W!eY@-|I+C;~+N75GOJA!j9 zMNfqA#dSqn9erLS)~3m07}3Y!i*#jGq61m=Q&M8=HYKWe<nZxj)Uw;idIe6YPYCDE zZ)^*j0_WQrrohcOW}dme>CdL0_>5Q);UbS6<k^RMcA)xXWgp?mFn(!d+MG2J-$5#k zUWt`XK|7x2(Pk_5ywKUxH3eJcjf>4UJL{Z$5kpejLt-i`xI8<Z;6~ANt$`{cgrkD_ zagJ>2WkcXd9x3IH_xe<zs?qn48ZlI2zvazgW1KsD`<F%MnSHa_*IyXM_jzZNv`SVA z)$N4A4zq`%55$Ob1^0p&6EG{K_Cvn&D4XJvU#N5Asc@#o+X}BL7bZGpnI4E|o9b%y zv)l@)?n%0pVVbn8>`R>Ux&`I6kPhvy&Yn`1JI6gmk{4@gwW=Ah{rjc5vz#F9?p%Rq zWq;$V42qY=P!hPsbI!_0ZDXXVs1@+yOFdM8|D==wzL(hhLoU&|GL?N4Bi;V5Suc?a z7)IB6!l!XGdtOB)=HSYVlgoKnEVp)MyBqvfc-^fL&9ztw1ES_|s<4mS6{S2>m?$h> zV5C!+SW`8(o*GwU&(fD2itG*(B8()?H>McqId)aFiHKm1u2{?`uq0ARb4{zcGLAHv z16jXNXydzG!41&Nlu~{q9x(@!ZrfOqD0{SSipF_B!>k*?x^Jz$wJu!*Rgvt(?#O`$ z5UeU=Tnr>4AH9Pt)1_g(t(m&`=J^lRAis4??APFe1|ZtG*e}sdnZl+>JvBjAF0~C) zc}rvt@5QmjV~(SzL`o)Agr}Hiau_qq%H|6)5@{SU#~hb0!|Asvp~@)xw^=hvjOFxc zROXSk7S$O^d^uTc?ixeJG8K)F4JzMUnV0BsmgY#4DcFAOv_E2SoWw<7*c^&y73`r1 zTa_`50fiY($ja6X^rX-_v5Is|(Emy!3%Gc(#i8gOr!R#BoP5M^bDYuEVnwPX#Zj7e zW2<t!6+4ny8Lj66&j_jgueFAdMs`aLT1k6nn2Jkz#w=t)4H~xU{zy2^IDS?(AFXix zmN|mzqwskF<y6sk3YT&<G{KI4OPAiPegk8%y1Z(*ab#ZbrJpv0C|X#hRNXaHhf?`w z`k`$LbP!3QA$<0d#kpOOm93e~{5G#oH9jiOILGd99J`9K4x_F1UYIN|(}vt&j+SQ( z6~#2fPZ?zn*;vbnW{kSP9?&$KQHnWiG&q%_<lIJIkFGM#zIF%OnKTVYH><9x=Eh$V zwJp82)+=hP57B2qI41gqjS)h&&~@Q#jPQU}%MN47QVLy1d5nM)wk$9wR216I5zdM6 zChlt{2D(T*)GLa`W9DMZ>?4JEBtS(%R|Fq2ft82Dm1Al-y{#7dNv#oePt5T)_NZ$N zR5CkK?}QN*(Qqq+6C!QRF_m{0N9<^Gl$$4}l>X_+#z;zaq~4U0DrK9i2J_$Cn5jea zwGXMH=wx&-J4kQMwPOXw%x!Ir=>1(;+1a+b<f2towB8IhDqE9g*;J!6?ihv~^8x3S zwu7y1n=z2;Z>6J<880%YRJ44==6XYN(o<~I<4m$+;qYDaWAR;$P<$6mS$6D+E;DW^ zh0}EMjk|h+o82%?=fPB2&FYl_?6h9lO2g*lRLy9N8(W!vy#!y^Y2Jt;YWz$m*j}C( zjaBvfSkswWViZ;;k60zVLNUPj>i|@oSJS|;;-)&yw)*8J%T4O>RWqY?`wUZY%^~H; zJe8<?6X25#iEMtRXH8X1kDsae={yXDjTNp#XV-D<wcOdB<4EX8tJ{Y#;`X$P7Ei`W zjFn8KYY6zi+4L@36Rm}f2HPQ#hM82J&c&eP0UXU4Uoso2v$BERP!?yc6B~`eRahE9 z;V{NJ&e*x_@7?5BPQ$t>%}}sJZ2jz9WgB?f?I9<aJKaV;MFABg5=^Sn%^u@>p2pI~ zCf-%0P1MCPX1dWMv^maTj<cq#V=F@wcGubHLD?%G6W2Dkb~g=SGUlju@)=ES@0d9+ z!o(-eXlhi7r`Uo&&Ldp1lVS|6O7Po#ZR6T4-MO_F2{%byIq|)=iqYktN!QFaX{r~y zSRb0Kcla4ID9Rk>@jF|prm^11ZacwsH?zGO*v|X9rakg@JI!UXJ-zxg<2Yp9TwE$* zE)-RHc&Jy_GS#YzImDWel9l~~bzo1xGKY40yOmYre4SmjsmW&Dwu(zU$2HZ}KH#f^ zA8VscajdmbT@$sVo<0mCd`yw_40gEHz&mIl8}o|KjH<#i)9c|DgGRSZZ)}OTG}&3b zJyVuCcWS@Ol%ErQ%>cZ7D9g56g{{%3Gu&v7AVoc0B~#Z=wu<J~)e$nn!$*WoFDKa{ zGrA#?tW2#OwyW7o_c3)Bvk~tYA6-CSRz2>C$#83X)m8BY4AdKkKfz<r<ZUDsA>Xl5 z^qvrzkH6J%N6nZak7Ln$G0~cCIzvf}B)Jt~XKSNUJJY~;mX5TSb-6-C9ouVE<h|B9 zbD{@pgP&~C?gRq#GH$Q;UL%Qd;(cfqbvngjzR)c7O^1gP$*rBMmzlL0o2sPy`PYx9 z2h9yRvsz-MG=wIktmBryQ`3!yrX4}B9_cu5X~22S39Q@|v9`G0P1IszR?r%zR`T*- zsc1TIx!kQYLaOX|L#@%BpzTC<yH0&x$4+!xjG59zaN{M87Zx_o=lNBIi{orHH1<>v zmO=Zh>|K*5ve#BNX5=+Bw&3aZq*6*R_C(T3z2iI?0?x9BR8gpORFUc^bv87eFh_LL z2ODWiMfuuPN>(^orh7w|Jl1BrKB`)&_0b&tCA*7Sf->C*Q}0?{<s0`%TpmlF)Uhku zSUCk)?6{9F1WCBLz8cch>Rcq5Si(D*-O@1^8D?Fw@Y46;!;Fq+We@Z1O3&8X+cOZL z=rz!(3MPc8o9T-S!$%nJJlNX89KiOm6XtL(3}gsfPmE*9P-!EnaSvX^kc{24qVr7X zzQf})_8i7<FHE|)=@XlgSqaWp?_`;Zywd8hIco4K$Mlv4anvyVYdzv`>$=|e$9{^= zd6TKz8nM*S(7dGA_<JGJ<v1&GB7T|6eq)-n;mwX^UXOq3W}7CUH}W1Jd{G9TX9agW z*>>tQL5o0R`zxm45A@n-UNqX`_UY_(t{#y^i##42uV5Zdvi9)svBIZDRP*e!RjQD| z3o&DH-G1Suo`DQw@pL^DQzK@2w|A~L)veN96plk{sisU_JtopCM^)cMoJ2%Sxnea{ zD&0kU*u;#r=z7{pX>DpQ)l6@|_@}xKUAh}lD)byZ7y8Q5Ym1Q18ICs1+QDx5GUj6j zYK-%^{YBgS$q%lx!*NdJ*0l{MG6y}%mS7&23A9(nA*WLTIZvY27$ZJyPoBus{wkps zn{QffV=hU0u~lnaexcDv(JE!2#kRodJCD}6+LNsvqbxc|i9MOUF>L~<iR0c&3nQ!^ zh*gC3))mRc7aNuD_JVZCBI|d$(xMeMLrn674Q<P;3)JM*tX7<5MKCUcea+aDDT-il zusZn8XewU%K8Go{7OOB9ptQ!uy1B^?ioMsM2(p8f&2(ywS@<BO)Jis|_Ifn69$T68 ztc|?feb@%OS|gyW9j7vF&v>6@%$*%mn(D7PO~bfA+pa!}dScPm*5(*-OAd0P6)tH- zbx@rBC#P##)Fh=Av<*!uy=Pl**Yg#MGx958G^JIl(xe*WZ{m2XYJ6^-`7#a0XH~FI z*iG$djvf69bCWeIdr!NMr*9sXx0{-f7{8Tw`9_VcU}-vNVG~TJ+de=ZgDA$R+Mo9a zN?503VVo-EQpI%deq+Shn0&D{d7{NL&gF|9Mh1U>!(K;f`mSn@3?`YLv&uU)&cv)= zh&d@8U2|T2nu?u`Wz-!tnZavw(`X%Lja_7in>1^M*Vr6LoYTFQfwlu+x_qh&vzR(# z$24toq0&k-G;GIp{Dw7!o^~W7%w&T#3=|n{(+$;FUrdR;ws!eqpRu#QT%AVW+S!bD zo2g1_Vf}+})`QY?7VRCDP8(Wdb<L5$mkOF|VzruUXEOERD&-@mV}QA4mMLM)fo4nR z(!>aSh80eiM8-MQyX9lQ+IKP&er)(OPPM{YY0No-19E0OeTLoHIwXOI5BwM>Npxa5 z8`U(?{5E?M@3^$_lbk?DQBwgqc&x=4s8{p}-VHEinyznVuUXP}X^j-PlHA^DC`>ps z-u0w4s%Om7*i0wa<v+Wa%R7Z{)5pkiVioS5yv-|@E=#H-%O`!^x#exH<`RRSYSo>q zW^*6gtTpyjeCCxc9$^)wj8N*eKjtkmI#K2>3^h;dHcg7)yREK!`FW{fkiMuXMyGa~ zv&&afMvjeF-QYCJC~kyN>wBLKd4*>3b75n&$zF$L1zKMdGqOEl!50q{=v!>lscww1 zGVd$2Ud;_cceu)oJb1d_OcKw^9x8K`F!fdgftoqwG#9RA!Wx^k6<$-jSX;s6Vv}?K zOttn&yOT2)HO$l>rV&^pd)o}tS*Wv@f%bSQ;|R8CIKvUb8IU!uzJ}wOp10#Bu4#gI zM-R4jFcEP~8K^tK>5S55a8Xv+IBEU7SSwFbwZymws41Oln$xtCrg#Gp$HW$YAThgd zk!oU-|AHsqQNbL-cL&57khkSf-m2TpW~!jQ!d-0-VO%oNVwj+$>w33gGS~HT_SZaT zbgF@|iOSS})ozQ6Pkb3W+2LgMp^e$2zSvgKT$_w+GFO`0BF38^u^!@dH#nM^Ldr;- zLP2jwG+l=zYP@9DoOL3KxiM>IUO6{r)u*cW2~x>OUs94`tY1u(;J#67G_RGBf#xb^ z!nQ`M7<I2{sA61M*NDzk2+c(`;axW$@%Zw(y0)mjhY%cow?lxP)f?j&k6LBi0STjE zrp+@!D=`)!XRNkL*dZ^)l1psV@C@xMzNNjMvBi|qP}%G%8xYJWf-?bLA#{=rl*!9Z z;{qy!G!AKp8j;Y1fmoZdk*|kjluPG_#>d@3O6OX`e2YNZ@PP>(Q5MovE!Pt?lBE)8 zQ&SN)hd#r4jbk_G>O+OUwGEEC;;|Q#w%?R!5c+t6r!lT=UgV*vG1yioJ!GNYf;*d< zfm!+yDwC7}Wm6Hhu%|Gx(J}-F6@zz6{r6O3u_ja9@e7%va5#76hK)2qd8MzWBqn}2 zgVvqSle41M+G5WuFRip=?j|1SsT-ZeG&|)jwx^Zm3fH<$$}wz5Z;6%5xvi(b+1U`V z?S1vKbvJQ;!I(1GRkx<!-c}DYVZJyPn`H}20l*m+aKc8SO)<9fH$<lH1+E|Mptmh2 z4J4U<MoGRsyxOfzs16vW(_3c7dcnC4W&mF8Xt*(^=Vm<@h}D4$M78<<wsvzy987)F z9_cSPjR)+kV~1;a(8(DQGw=V?Y;qk>#==jHEqJzHqb17r%~LVe-qfH8*0lEGH(U}k zHAI&Jn|Idg83`3DwzgX&Z%CRost~hm)JhKH7#s9Y9?`kUZFZ1wDfigI`2ANb{ZTa& zhPq5#R{hztu?=6n{eYdm8oGV`9%HXqUiDz>haFkZ=AQHZ*nyLHzSL}YN#ku-zOZ`R z>Tk#1opIv)r|#<6{KKK^%|2(JP4m7kczL5Szw#a$v)yasOMl2Y{n;-ktoMEH9uE~h zzNqJBO-ruWqpim}AC5TVKe1DIpN!cqW7^fN8}+PMKC9~SFYY{X{Qec69y6kSyN2F7 z_Gw#u==;wf!!zOt80xZjm#j@^%wK==k6!A!%Wcb-eKxIbtDj@TKE3nv%jWKU)y|q! zc8J;T!mO`)zO`t}yLa7VaN8!ApVL3o|HGLF%)E5-$G$KBxnSa$Z+ZWX*>3eS-=Fg3 z%cTPc{&V_IT{b)H>zW;2J$uA9mDPPlethJIQ_tnRJp0ahr=8P#?zvsBz5mW-$FF{J z-UdHkacSf6b9P*~aPr7G=j<{*eh<&jn(ZnctNo<>nSVT3J@~t~eqDawEi1NKw&z(_ ztSG9_e`mAexAz*tJFd-k$NY5rsDsOQI6nKH<NEbnvQ6Z{y&t^%(pOI3{>h3x>z;a~ za2W3t=%VxPwe_K&{_u3m$w!r}JbQ=GsgK_O<>KwHf8pLUzIi;p@WZEv@PxYFYaQyc z%h8P&?|#Lw8~a@M(-Ft+G5Ob(vGWf)ckb@_ZxmeDrT)(2ctM7qpA2=`_>d2V@38un zA9g=|*pu7b^}tVE{<U({g)i^ivg*;H&Fj8Dmh<-GImb|!$1bRy_Q>dl{uz%SaAwQc zx~kIn(k@p<cU*nvjw5@#TJT9BW3^_xt**G}?HyuYoO#WHu9033_Z{-c71y_pIeW^v zSM=PV_vV{@jEBB%w!7q$vHd=q@#Qm*UR(Iy8IxKT?z8R_Q-59b^PB~He|P<fgF*-M zUWslxZ)m-e`#yVm*27o)?YtlMIO5=kHn?H8|Ht0Dz(rNH?f+{86}Jb_JWy$lii*cj zNih$NN;Vc2DJB{w3L+>f$)IScgP?(Ep;?iqsI;gwF-_5|Fj1(?$f(GysLU{|@K9lC z{;qZJdoPA@>dB<%ec%7T`6%<<*S^<buk%`a?LA-oRM@4>lbLP$@7VNBPrSE;?5;0Q zi0^jeb@z08rN>jpx^KI^%y-S!>z6G1H2a}|oF9fJ;#$8VJD)N4eX;XQ-0IGi8#iZu zzwvYHk=38vGoar7ofo=Y8lV4l8J>@?C&NATLz{>%6Sp6`)Uso8QrG(Je|!0{n0r2W z=bO=Oe|Trw#qn#Aeq`5T&cz)~UheqCPyXqj-uPk9A%(B{oIcU+`14`i7u`O)<?3~K zcLmwSoI35^XKDLgr;p#!_=(|bK7F)c#wXt_d3Zum=XHb6?q1yv&&}7D;hL6A|Mj<) zch9JEcyfob>%2PE|H3=XT>8Y~NAt`#oZZ~u0^aXLcFPXjw0-sX<pUq`s^_uIG;;c} zch-$9^B(ke?$O`Ax;WteG$DQ^yBp`;)a>ZKg1f`6d1qz((?z37i&AqB9}8{%-q}Z| z+q!z)FGM&VIyJimAAP4qRN2=PzV9MTFO45K?#;($kKXiRr>vP>xA{HgUUC}OOLpI6 z-SA<@%vaw{+Oi<^+ZPAimgn8?nn?jmMwb0xkMDhc!iy*`cu5k<->z%guKea}@!Th8 zPFr{WKJWRt6YA|h{d%X&hpt(6@ceHF@XRpTiL|fgef7|7_b=$zVA`l>d=J)p=-hRE z@~Z524j+6&msHb2ywjcR+IE=JyS3-&{Mfgzc_w7jwO>8hFlpO~vNIjt9NNF(%I2S0 z(P7|40cN)&$4*|`_O&B7J%87}t<&F+Xu5vy7vFvHis#%1dL(S?{#2zeo&hGiQR@%i zU+~z+4|v_N<iXe}r5~MWGynS@8}5kQXKKFk;yts_{x!kFyJoklXI9_y@Z5`*&cA#$ z%I(!b<4vzU+r0Pm8Lcb#-FWc$(|4m?8%uUsJG&nEZRpC!T3>tWr+qJ<7_y_^d3STj z=}j|VyV$tm{!>rky~1SIrsI3P=Epz%diuQhXWksTCH1Y1zFkY-96PGTyW`)f6LKs8 z?>lHD!~N;0PgV~N_AN0@x%K>O#hto--0I`&v)tOZ&^|x3?nk$*gSewlcB@{CyF2x< z6MF|ff5(So-ii2pTeM}>`zZ^X-mv+)yY@`#{si7zNp=q(n{7959-TGphj-r`Hl%OD z16}Xay5GC?W$%VDw|jM|+Z2z4;Kguex8c6`PKiqh9k;3F-7f^ro%Z>+);XD5qEpr{ zoN_XC?CSk^+0_GNx3tt};(?Rf8XdVUZ~YrxPaVH$;Kh(eOD@{aWWVYj)?psf`BSp% zFnEjQr*rMTyZOeUUw@v^p?&F+?eTkVTD!CR^fvKN&#QME-YeTghTE)r-6LnRr@!9x zyT#qpmYjd4exG{7I=A`e>91b7)UMvGsUz^4Ol0@ktRGk1wBUBXIZ>l0<gV`@b!}x) z%Id>0Z@qZq>6p(_;wRwUQDir6ePYk`K6vT%ON-W4wtV1m)6Ov|xdYSFll@2fUpHVL zUa)j4UV3D9o6&e<+lqRR9B#dB-%YFHM=bsB=B%x6FMHx(-`hIAfBxq;67g&~*<I*r zz2?r3>b|ve@`w)G6X)-Ktp4B*<`1TS(D&B{%U5lCcd`(t$?nLPby{s{Kc@4KQ*J)I zC#{Fq;A`ewKWgkJ*)NAYnmMpb%UAHOev~b<+b5rv47+2(&*cL@NUZZpMypdVzBuTo zvO&Hp4?TJB!9CY^Jc?)D$?k^@^Iz$`VR_E>xh>vrdah*8_Bs#5-uc@TBfp(FW{OXF z*zI_~8rdy-udMKyn@5iSs^cy9Pd(qQ$?O&1Ev@REe)!~vDFyeox_2g?Pe&dj+#e1s z+17N_o3mQ&ernA8BlCxh?E9-N^2Zi|_QkDNj_SA+&*YQcx#Yf^eu<sg(^@a>g_3Ej z*57gV*S3e|c@G|WU#lN8HhhM6ILR4@*=^MeEyr~Wj~KAz^Yf4Y{$BU5&R8FQb9cqB zCngRqzIFQKgjl@v1Z}?A?f1je(zlQEza{qU&whg+J=?wH=%&v8!w<J=x%b7Go9bS~ zfNvhzMI7vq)A@9rH|{pAdFtm~fm=#a-i`X+C$Y}S0TcF4oBsuD4w2o>-Vgrp_@GS> z`yFZE-MYoX_uDR+)9L7KJL1ECoZ921-_s-U6z(-L+``|MKL26N((U74ZTei<PYe64 ze{%8td#mmpvg+P$Nx!sTd;{KzKz0)*74M9{vofW-Up=cRFTVbkW=Gch6m5I0{`ON} z@9O%9AKsfsc84okMtAVZdTnQ?jct=(dT;6Vndg>1U%$`VlIQF<9$xlE9>xclpqt&! zj!1rd@xa;J=L|Y`cy!mTV_sbs-RQ01-*)-TGU0_cv)Z=7dnw88`1*C{9(nfQnl2L~ zBI`9>I&R0MCwGi#x%BR_O`h3)>E@28zi*J;hN)9$=Ku1@QcIotj%9u}Zs_1y8{WAw z@78O#jPto=-*dMt#`pjOYO|Zqbsi^sZofY2qui4Ve+(UTb5N&FCsyt~HLYUqhBe>4 zjNhb^zkLh4?=MwFja>io;!$U3&F{5f+?cmF*V(_n|5tNv-MoMGJ@X=7!}|rvuF7&> zQN0I0IdS0Pr+&@S_Q(AmcVmk+Svy<wT;F^9&&zuZ$2;*bZ8W=0ers#=2bs^l_5O}? zpKbp3>Cj^pTQ|+xKYqx$`hBPSydU}!-YY_OpNttW=k-AyS3F=p*Z)-W&%gQQ)!RNB zG;iA0LtiIeSHD*_+VPEK*X{9-Gi~oSZq?x04%gmRGJ5Ncx9vGocVvXg?(z2NC!cB4 z1CN8_TFh>?aihjJc(%(O89q;b;eTLk_<|-GO$PlG@zf_FuPyto<EJa}UK+BSH@$r) z`{SAQ(^Gd}8`2|r`L{zdk2G!A^vOrwd~SbQw+Y|ioe^ZWH}Q1c&OL0ozqs$Z<aO(M zuU1VbWbMtkuwu{V0oegLsTK5_9|+g`?NRP6$F5A-+jpJz(3o+}KMhNmTmRli#<jZT z;NDxujR~jUrhwg<vX!Z=2mgMf_o8pzvVWR<=tRidi%%@~@0*o7^WdVj+5PD~^RPR3 z=Zf>Q>Mr_xue<HFIblEC{N;kLZ|~Ojt@j@v7vJv8`^V8vp2Juc?PSw7K9lNfDlA#r z<j9$wKYl%P<*Q#bx#`7Dt1eAjF(P~VAxuJ0m&|UbgJ!HtJ7K#JG|6jV?*nlmyPCbc z`MH%pbe&v&-;jy@pF_FFdy--I<9O@HI&rV|xOdmE>r3zK^zuC4mxuVz>ppA5-K)p- zSd;W7ej|nKsw~-U>aV^pyWxu5UguAgpUrt`-nnny+LO0u<>Kqc)|KhpAMdy@yREp? z@x66*p5Fi3;B8H&9=>n%9a+Qt>UQxhnegdLJN$Y*gRw5&y9&DlPqqK@m&tS6m#nDw zK+8{pURn9^q-A^F+IVLBkogHAH^|?i#Cs@V_xbdBH)iJCP<3M2-2s*xLJvO>vwu*| zL#cPfnwl?s|DCaSp?$#%JTV^sIyL3iRYy<eR2+G5{Zk)oPtNJGrJhIS@JAmV(V^4R ztud~PBfH#D?ms7wZ1X_Ub6s|{8M3PQ_}uoVC+Bbbp#AyPZ#)*fH3IJ!CcAszS-T;j zUnB8F+PI&ZKi{Wy@oPa^v*F$r`@*wF4xFA>fOq4xmf_ZW=f#_Yuc>$OlUCD2&ft4@ z_uTmL(t#JFBF5Nm>ipgl-=m*SCA+5@zA=32_7{!@Xw&UqEV<>$*NzQ5xbp3>0c!_L z9e4WLZ&24hBD?3l6qARUbIO_pWF8P1@3c?e*LmP`hwt5X<ni+lUVMFCHhu#EZHL({ zDQ0~6oy$M?^2>go9-Hy<f&53K&R^Gg%bVY?x+gaI^--%}vzYA8PwFz`>-#1&?*7&_ z->u*DbpKaJfAL!1qt9-hwrkCtlhc0cgWn7!yDx{Fs@k=sa{9;Hcg>#u!gUWW{Mj6G zS8D26pE1o_Z2Wrb`*>#=%8c3Vk;=zg-Myjtfkpk=oU;d)?zyS7TZ`)pzWTB}`S}Lz z>*F2GVmjHq*?-s#pQHx<{#vKQVWqx%e6A1P@a8?+<}J(k>CH#KAKrQ^UU)@z6APYf zxNt<HeA5=syz<}tnjISb;H109+%&N5i=P~x^U8yx@xG+CGTdLX7iEOxtlZWj>eYHP zRy^9bPgPXC`bjBM=dOA^D}3(*Re0qO+4=VR;jtm_zB{3Hw=s`|Zm^BZTzy^dHx3Ow zeaBbFJl{XN|7o=2WH-|s_Vv7O`!`n3eCDfGU#`FZM5Rxj{m1MEdu~0G*uP-U1iZV= zEW>?a&(Hh!k39FRNAmFzKV7#fWqm@>!{t9*I9B=Lxy)f3N9{v<N_M};*ZFAC@~E9- z%AYG=am~$9zk1ETA-$;T?(P1znTL;b+>G~*lb!FF(zk!i{jKl3p)va{=T`0YKl<A{ z2cjciJu##zq@wC5#!Q#UuHyBvediY@tvkOcWBil*gGz$8^uBgy*9+~7X1>_y!RBAR zf_Vz&3}&}CKYDz@j-rd7)j3qBUry6omlglAAoIaT%GWnKv|w!e`%j}y%Oty<?|q%y z`Q3~eb(=<;o-BJ~#qzIC9B!~_>rZ>`UfXZv%zKLQK5eq=a^h#N_wL^K$Txcqto*ds zgZ(;O^T^iggZFqe?v(fR_#d}L;T?Sf?|o~JKf`Vg<DIVYVMF5LVq+ro2j;_UcpP-f z+%P=*Px}(WqHv$uhWi&`F*74#6C$Tn3sLyl1{+2h(SO6U_}LK%Nq+)A%y_`LXT;U} z6eIUj#Qm)}U3P)w7w#&DMd59Ac<;p3`D*JuIUy!C^6ES>G9zNv%&3^Dh*&i3#;s*f zb>C~*(^+xyo<J>o8gGlltGE7^r%pvsJ^`-^;8d*Yn&pdb;?2H^0e!oKjm0}LX3dQ^ z-w|Vr59{R@hP!f98G8Bk^y}HHzn_1vo_=8oSY8Z6j3TE*sTf^_Pk3r*3Vd|oRoKXw zh}pB^XGPh}_r$~}Oo}y+wk1Ty%nIx6*SmKZ?!wGSz@Ef;VfPFR!<$HA<HJUd2KMsr z*{6TcK7DTL)n8TSIT5q*?0w9PDgS6F@snczQU6h1aU*Ir?k~=B3`*|f|EsN=Q)!?V zAGjzEwV3kQMIRNflI2R``ezN5{(?j0ZFTXhy_m<$zz@O7{bm1XD0BZLl)qCc9h-@N zB2{MAW_-Eo<Bd1+K`WKcS5iov3N-hNMi2W>q(J;-DR3q6y{u42*-*x&I`kO-M4WAx z#rdBICGNix%9Q^~D2e}-Q2r}{U_-*R8GmoA=v2G(?!p)dR~MlxZm5ikKldsIHkZ{T zHI9wf_npLt#m~XU{HPh#V~eY*sjmE=G2?HwT7Mk(C{$HB52@}ltCP9*`nE}z6};L> znMnz@S<y(RT22&)44pySTWi_>xwE38Y9@N^BuA7DJ5=y94Jx|-L|)GShw>8hUO87V zYJ2UZNCdV{VZJfD$BapGXkR<NM<J2r8;okpw;8h{C&k6oj&G{bko`QiG}f}O^2sCR zWp(Mg;s*IDMqq#3mf38zSgGKdd^KdP6&d+Jv`V?!Dcn&udQn|<IlPJtap)oCBQAd{ zrcS;0RQa~Nzva;%XE9nhbhgUV>I<&Dz6wKxNwfc60$dhvUQd#haw;03S}dNj-&V<R zRmI8Ht2PTdUvXT*WUPH&O{?ovnDE@vtl70x899#V5_-fZ#KmEUZSAC_v8G!~zSU-H zhI%s(Z+WdQGXF%)iH(_ob-dcSdWU`tPuf<`)vM!u#eELOMt`?uyR2fX=s64(@m4U0 zhVv>SYP7|Fxaf4nm+s(WMBKcI)p>Lkv7{#nYdN!Pq~=t-gHHK>6%jQqKAtwzD<7|< z(R6Bz^q$RF^!fW9@tqpAAbKS}T~;J*wwZV~DW;b0ghbgQ<lE~0R%%@qwJ6*?s=ekL zT^}~S&#sPJb=j!BQGi;($IlY{v&}{v-qo#=x%yJBxQ=7o5;LndJTmHwTr8<wAIU@f zpoF~1reb<kg<iG8xR>ZKF1#u~<**uWAg!GU%6Q4&46ZHTP`B_dOXXX2d8xgkk2L+K z??UK7`1OpLS$zlVD)US}ic{UMU5RH-je9NUmwd~g%C4)37ESg3mPam{<JgEuyd9~w zd_!C8cyIQqFY@X;)>>Rjin8I^JG>jZb`ndjDomArVQ(z{d*FXP5!7@F_Bj=S7n$Vm zBVofDktY0ctZVYg4oR9Q!CyQ6Hx#8znn=YSGF?k!(nNFY7sIw+*m*N);&zby?Wl(0 zP9{xE0?j3D3X>-AJ8SF~zpzH6$=}Cf4Zn!R8h+b~wM9x>t+Xtq?X9Q(o@zsp&!ma5 z*o%+t!HCPfOq!UgwCPH-D=k%NaY#69@r7F(lO|3ntx{<=?2~Uwc8N@yIHokYi(a19 zL?HIRCsUeQnKbc((#|NY7xt^`b~iC;B1mb$N-JoDy=LTJ5tAmCVjq*PEo0I|w$e5# z&5A@xA-6$Hnn(l9qdZ#9q=~PU-M7k4{wkL4){99K@&RRR4@O$ai<P8_bxaLKw$kMD zov9RVD3d12l_sB3k!Lkgi9Nsg2mj77X(9~!adj=6NfU=a_y@aUCQbNYPoJ*&GHD_S zgnzKJGijn&X(dYY#U9ut6u<6Fn%Jwfe5J{!%a)Q|Fq0<Aly+QcR_q;>zuVSO1Tkr1 zhtl$t)*Acw(#X!tq|tuT`IH}_&?IRhU)dEXyJ+m!OeeRoOsKy~D^=QN?5|u#cDYQN zu%S)RwL~W5CH5s|kR9GOLIgXeh9XgE=RnKJu8IkD8hiY7Z5Wd#LX{S#G+(n2^0yEh zitbFBm<W>3ZZ)KxeUdaW4VoufjD}(+6Y>(&gfu&oCLRJcCT$fH$~~wNX&ad|@iM3( zX*-!TQ2^3ND`L{bN1z6z9c4l}1$mHmib)f{g6fm@JCi0FwL^PLnirEMZUEIKtv!<_ z{6Oxc`7>!^D9DYp;Y=t8pgN?5GHD_TWFl=ElO_^D_|X!iRT7gXmVqu&nm)vYdI|cS zv}`6#yac*P+RIERYoH6H6)<Vy2<SJ`K4Q|uanP@%l{0DLXV7`ler3{xM|(VzMOq^! zO<V{1g|r)(G|?UOGiiQInivfFiL{|ing|A+BQ1nU6O%z_NsD4a*#(^;Es+WBB<M70 z%a}Bg1*#-%9g`+r0R2eXOH61FKtGU{&!maNpzldL!i4q!bc(d&Oqw_YsvzxWCQZ0^ z!0$7Y=E0<imY|cQUB{#eUr;$|-I?&)*Pw4n8_a~h0(643U?xr62l|Gz$xNDv105&L z#-xeGpsz_=%A|?apsz^FV$#I3pf5>#fk_j2pfb|-GHK#%&=;f~W<uWx`kb^fCiH`# z&qzDNgznHsh-0L=Gijn3=u^^KGNHW(9VN||NfUiRpOAJllP0X7QqqE$G%+6ZF=_WP zX(AT%5ovKunpg<>khH~2n#cr|khYph6HkLaAnjQuwD+JRq~$Sb;vh&qf7(#I&7_G^ zP%&x8m^ASn=snVYU_$#0I!qdV_=-pqO+fFG){IFLX3!zhe3&%R8}troeVH&W0liI{ zl}Qu#fZif)Jd-A(K}Dp+GHGHysF1XUOqy5@I!Ib3lO{HR4v_XVlO}RO1*Gj@(!`sf z{iGdaLSF`YleAJMO`HJjBkemTO;myMNxQ(L39S>J;~}jHlO|e&UMJ1Wq=}xO*GTKl zqzMaXFKK~HnivIom9%@9G!Y5fLs~SGCgy;4lQy3T<10`eY0H^3u?Dn@v<*y}*bLf9 zS}v0&<jX~0Ax*wyOA^K}pdF-@Flpi|(00;JFlpi(=w;HXm^4wZGxo)kCSS8HNfYvU z^<2_gGigG;Yi=uPJ()By5cCph7A8&H3ED#1C?-wFS8;77P5w5oBu&f)y-3;|Cd?~9 zFOZhTq>0Bs&y%)>NfSAs9MU#3X<`rPInrKd!k7^BENSw0EF@{-bI>NzzGA`{6SR@E zb4;43<BR7GNvp?%IS%M)(!7~8(FybvX<eB#5dg|2Z6FioLZBx}yORmySkMO2!kIKN z6SSVR*-RRK7#Kg@M_MYACRTyglJ*#rCN_fBke0)wiJhP)NZZ4ti6T%IX@{6JaTN48 zX`eG;jstp(H2Ku7Bu)GddX%&}U3Aif7icwU&6zaO9`p!lotQAc1g#=1fJqa>K`TkS zoeASaP$p?%Oc?)x9wu!jlO`SjJw)0fCbT)A6{KY{X<|KSIcZNZVVncXAnj!)O}qhG zM%sQR)GbgtX(ddW_!1;%z754UOz6)+50dsXlP27{Vs1cMeI}G4&=S(TnKaQ6B<Iu( zMHeRYTc8xuZf4TNZJ@=Z-NA&k0wt3c#-xcDke##{OlY4$i%46@q=^jBLed^)!k7@W zfV6BTO>6-*b(8Vi#)Ppl$cwZhCQW<>x`wnbnK1qXH6!g;CQUrj%^34P&V+PUT8YxG z>2BDyV!~KYX(38WRa%<Tx(A?am}H#&n9%MjZMo7!f0Qe-b7#^-veK3)ZJpBO6NAzP z#%njDoRV7)CX5}GwoYleO535d@Bt|I<TjE?6VHHJP+C35gfRoCC24s~ShpBxxSh^~ z@u|{YQd*xuhFw1<O)ODby3)2PZM)L$8f>^7&4hWG(jt^LOKI^+OH<l%rR5Dp-KXo_ z%cP03pjLEkzc69$GR&|`V$wvzKtuCn(nK$%-K4Z3O2f|-QfO#nl@_kF?!)D;#Z%c} zLK}9Qp*3g1xXy|;jN-hS31cp$i4po)^!uRIWEahZaSlkXgf$dTGhuvsyJ6?cq=|7# zo1iqC(h`-HbO%~n3d7E%iCrN1PLhV=RVIvSf($z|6WU#+1t{$l=rQuIl1UStN8*_~ z@~;~c+Eb8jm&t^FMrk=p3%e8j2l*Gyq>0Btt;xT&Oz68o*ORuH31Qr2xXolj7)r}g zTI;*fZ&4U#CbU;d%T`*WQRwr?&Wj0iFr^(=TGnXf5tV~=Oh~^FLo+jB-Uzyu>=KzU z7awD2p-j;3!L^ZHD3c~02DPE<eS`^hdaPlW$AocMsG(_0SQk*5ztX(NBTXrc)=ZkX z7jy%KF_8&<H|SQft7Jldc`x44LE0iFtTRk7{2R`MwF0F*q%`?FrXKF=O6z!^p><)> z#3rRZue1WC6)CMmX{Aa#uC#Kcol{zs(%dH+;d(HkUsam7(z+|nPid{EAU`M#%uE_y z<Y8#;OwgtxP07xk32R!Qwv^7pm@wapHtd=)X(B>tQ<avaG`rH)#lSxbBby29tRORm z@hubj_-Te+7!%4f$V_gJGoc-tZfMa=7z2aWP+cfyLRpIyq8){yF=5OPYEN2gCd`v( z8g7G_P=A%SS!o|A?PH}inPs?b#-xe<N*koKWTh=p+B&6WD{Y_+<6XKA3lql0pbix0 zR3?mzK|Z8C#)P&6)RD9tCQa;~YxwsXlP0cBG_*EMm=i0_s<cm)_Jz{w%`@C;Oq%GU zw0=rEq_kqC?OlZYpuEgy!kp7?Xn{-^TY%aN+1{^XLVJ~LXl5p~SD+4Lm&l}vgvEw7 zj|uIN((;scL1`jIcY!oWr6m}IYh}VZE2tBt=_)4lA4?6pZcMoEqO^OJwpD4{l@{`# z;Wm^B^WS9%gRUc&NfYNmohjUlOjy%eZrDv`(!^^@+o!ZsN~=`bxrgL0D9bdhVnRKC z81KHKForQ{;+IUr?l&fkMOPYH2ou)69)Vl(Z!Z(ZAgc{6oC#ycM+JU^ScdDtguYB^ z*-CSN49|M&c1##6E3HInxsMCcjqG+XA>XnL&B}y1w$jp+R`P@p-N|h!6WZ}LhW0!Y z=FUp{N@)$&8g`ADF#lEBK&5%F6QT!&(V9sU-z)93(!AFzJ0`3Tfo{~VjR|XW8w@Ru z3D>5yG^I6qQV2hC>&1k5iqgJR+V$CnU0Wu!yGjdFn(tFW^b#`Px-((DPHD%K*5YZy z?ph}F=SuTeS|zAA`FD;<6J4G`*`V^*g9&S|Al)vD33E=R{j9XM8x6Y-Oqe$+?GB}d zD=kuKp_}k7D2huM6UxxDhGu2Ly7F^E3?;i@Came_7+NDHtUD^rM`>lCXG}8vjx*st z$qR<&#f0$-Xd~HGGGV>xMbrg1>DI!ei3XbuyT(koUZvfkv~Z<GDlK>m)`BRE5GKU= zB}4OJLZ1hEmh3h&q21kTXl5qdj{-eMc6KJr7nCM)^|QEd0Lme|d?wsK0(GZr`<)4E z|JzW1NxP0o6NN7uZr@?T+U9mcYr>?75lS1Wv{a>~DQ(~`tglgAEKHhM0P0EMCNpVb zEvN@+PcmU1nrFD3&V+R&rG2iny1Na#227ZfC@nx~1NUP6Pmc=|?hz=hOlh&NVeOFY z;+Qls<aI;4l?iQx(&ChM=nbqulG|b?O*GC&TSC{?lt~l&LAqTblO~4kGql^7aPLHE zHl=0l#~P?fmeX}ins}wa&~`IvqT2yOyO9a=U!^4}?Nz0{p)_&OaO=*5a$1P>SPFMD z6YkFx8QKd>xPPg%Q%W<xjrCn}>%)Zkg3=Z#Ek|jal@|IA){Dt)7!%g&l~$^>$U|6R zCc9`RtSy23DDAf~VI2<Ci?sbrxEFZXaO=l}xwFzHC~cS0URByX?-_2#GohR+?Q^B= zEjH}(nb01*Z)iSDXvdZ2uQZF&0+kl5v=F6*D=kuKaZ0l(&91amrDZB@wbHVcwoz%h zO535de5DmAtyF2pl$KwLdjyn61x%WF{u4vn!h|xUv{Op+K5E#tX41qArQNTzG^H(9 zn)Mj&S5UY?Oq#g+GeaB0ggULXIHlP>$Ndj-o5+MU#xD%*aVAalD>JkKOqeq%Em~>a zzs8*v^3RV6V+*CFDeV|&C)t%Tp}jwDXyO~4(08A}y&ba4V$#Hipx$n>jrfEKbG2^` zyJ9BvwI^|}h};G<;hr_954l~&q=_%SGwi-*!hJBMU8vSh;eHhPcYz7>l<$S`C;$2} zVNKx&!)_uI_GBq-meNv{mZr3jO56vdFhZF$u@ZC>h4Cm8+RoF4os9`&V5Ma%?f4no zYa{>4nQ%YqEZ$2+{`F+i#7&@ENbApp`wO7Kq}|ShISFVGY4<YWo+fA@X|YV2m<Jj_ z+5#r5jeu?@?I9-gjiCOdJ;{W*3n+lJTqev(K>bMD$AopqbH=qbXF@yv6Ye+C^=@Xu z-1HYiYr}+bw$cVFEm&zGO0%5DJx%g2kVzBoDD6F^9ambp(n5a4JyJa{nQ*TXG?cDm z1Cu6R1Pvi=D-*64WYMpe33I03ga{O}+=nn>ZUxfA_>Bp3unUGZj0ydb(iSOgwbHVx zwM)3yOL5L(!dihav6jk&d6dZ{^2x4*3G;3@Lkncm#4M%7D{YO^HYlyWyWzGW6Y@xD z1C?g4XA=7;+*Bs4%hxxwbSBJul(s`@<sK&SCb>Puq=|M7Okx<Nb4MnOBQ(P<iAfV5 zEA3OIc{McbnloWO)7T{TQy9mXFc)fKXkkpaj|eItyF*N9>pTrDiwScGFOxVxc2*|L zFPj?L^GwJOrIjeHs+ma~B)1osFcxTTXnsrxqlHNn>R~WpUeVIfyqGYa1Qn58857#c zR)%(g332f@iMPnEgbDZQt~InSOqkm%EnI2mKyQ=VDkjA5IzzKEp{)bGLw4Crh>OxL zC@uJUlQ=|nAxtP6O533{kJcvfF4;9=LK~|zo6?Fvhso{`lP1h<49$lL_wAJyskAE4 zd*t>46Z+&E3@wfc=?p3+yD}!ERa-*~XF{I`dY|lynNSDKh8D<#>jfPlyB$m@2ki{a zj|piC`he`RnJ|}BTBXv0+M8%^b3^PN(@E~rGPL7L%jsYeACiBYndJT<LknU;zJWd> zy9-Q+OGiV?X2QI&lSzC`c4j8I&%@AimFCmgL_4k<3STCy*C{PeX+FLt@d^3o%Y-#3 zrR`OkcNdd5N_MT85U$d4mDZ@MNqkCnUQ7sAX?aQu>1Gng$S#yg!vxmQ+?lZV67(6_ zZDc|p(8JI|n6L)}^f}p`V}jeBhPIIjW#dMZ_=4;LnUKFqt5n)@Ka(gUyG$mmAM`Rb z3lqvI=u5IIW5QUkx1psmVZPeOB)%fM049_dr5#sVroTyiO?Io9(AR<jseOKr3HwSx zL8KjJ(!{r*J4mZwLb(FnPTB<~thL-^5+g`!#Dw*Gkd?I7OxPy~x{b8%Oz4k5!$}*+ zgz^l!m9!ux+>-<8*OAGD`rFqej?=Y;Ga(I>cD!2aXA<9#-Ek)5d4QpXFkzenIze`u znNUCa8=9F3>)D`h$u5xzdrg&AuC$<=O`@Faf|;<^qO^Ra`3x|LlVs=1g#J=#NlMEZ zXcFJ)@nb@o4l=avOsH?53bNbFgmK+qLu<|iw@T}-G&|@NxlLt4*-+Y1rBy2JoYKN? zF^TWVZ6p)ww9;~w=58^GAIQ#w3H3;6flA8+{YZAJnUKFqJFc{VAtq5tb_1DkZ$fG7 zlqQCn#A&i~XF{K%v`D4pfzFWKUM8%M4>L3mCX_$WS+Waf!u2XGS848nCUK7JJeW}a zloq129MDf>x0wm`O=%aD7JREo{7iNsOlaGcmaVjNpkK(YiV5jF+|UA<kXE27vRlW5 zeXmM8qco4(47)~5NI%edavRBneE>>(RcXaaD^Z%S)g*o;x80dgx0IHsv_qiZ$gY?P z?aK&5Yt4kQ1?U3V*_cq@l$Niw=C_-~MY8i|!gVMuQfYah-^p$-6UxCIhUUS9asawS zcHvA2S84f5^9h1c9XZ$VWkQ^lW>Z=b$V7IBm~cONq@j5;A+11l$S#oyd*hW>pfvA0 zO~Q@rS~FpOskB(7<%8VGu7C;c#$ATioC$70b;&N431f7n9aCC(uu0S-yGSNYysxwm zmDc=j!_J!t{UE45xh-SDn01t)S(%XbN()!oF_4GumI><?qYW*X31dA_1F|b-!rDWK zq4i^eTcrgntpucz+fpWs@5dOL7Zc(KYDjkBOlTvNma8=PdrYDc*?BO*t<u7kW>Z?C z(hh+d>({}AHNmll=Ff!vW}qfyx10&<qDm`Ont!NCc#>TJ6XvT*OI2DK$cyZbGhzK| zoS{WCVV^IkDcMyqp$v^Tv{)vLxj@ax?i>^9$GwJTV}c#%8r_Zw?P-{yg)pHX1T`nS zy-e7*4jM^giyxRYVV+>v`7mL=1!_TVOPH{q<~~CUWs>_mOrj;(c{8D2DlJiI?%^iU zitId?&=xB#P-&SUZ?ap>gzHt>Ii+PyGKp)+ZXFZ)3Z-38TIghxxQ^_?n2;_?+p9G1 z2$Q&;>{>Hnj-#|4N~?-AiPmIyfeCZ*DTWrtgfU^1NwgumMof4n1SFrlY$ygZ;khSe zw^P}bDebt@yrNCw2J){t6V}o|caeX$GhsivvU^k6ol;t*(z;JGiMHgQ9~0&kO3PE) zsp%$RCc8=|l*w2_voRs<LG8%y0u%1P%`h}O6Uxg>lW0$N-b`4dP+FGKn$I$c4!Ru^ z?39+JG@m$=@F6>2CWLXnp?Nc*4uU$8T@@4JH`~zcOqj#Qn?xtF^JBu;TWOg}I|u5l z`^SX(VKcN)CZs9Im+bPG(1#`%ng<iw4Nw=di)KQcl~$#+q&X(hmF(<HXm{rtnimt| z4C+R9nM|0MDXmgzL5U{Oo$P{{&^{|IS80vrnM4n=^J2m}gVN%ZRsiZrc129sXF1={ ze3_8;pc~1~&V)WsX=O_Df50UC$S!~h<v?j!N;?JWMRt`;XcLnRErbbk98hnv+suTz zy1>vHF=0Fe>O*#sOc+}ztw3qs3r)hG>{>ISZC6^X((*w!kzD~3#ukeVtvM6ig8GtO zEED!iDJ@57=Rp0)u8Ile&u(a;Ovp=60NLd-p}Zs;nimt=Y*2r)OJu_JDy=|i=EWv) zGuintp&TeJPHBfg1IVtJ31ik2Lu<{1c^+sW*(EVyFT2u;l;)Fa5`)OjmkI5V(rijA z1`Q^=5+=-Hml&Fv3FQxT3)$J3Ft<|Laiv+8nuLYyf|!t|O3PJR^9N002-$fvX(C-| zE0p$x($*_&htl$t7LsNXL&?8TCaha1?LDP^s<bbZc1~$kN?V?eHEHrMlSvb8mKj<* zChXl(+GM4zRoatE%U4=~(u$Q<qO>xl9ambV(#|Q(Bg2SGBPNuW<yfboIJaiPI)l>6 zmDX;BVb_rfV@IWhD{b>bSXUwca+y#U9yT;DCe%03aI(u`LYtjwXdX<MbAoOoyKE-h zZ&aFmoIsvMdj+zRT^1ACcBNG*ZSyLuBavM$6UIo77+N3`wAEOHBD+8)^fOA!Q`*Ky zv3^B%IZSBl9y7E?OlWgJL1Y)pglhu@)7T=L3GK78D^qp_k7GPZZi|>O9?CMbFeZ!- zKzEYe1t#=SPZ(Mz6Z+pZ7}JoQ9~1T%D(#}uny)qNyqVCyfr80xB@@Q{>kMr<6V`p! zo5bB@*PRJ_7bMa3PGCZNpzMw-yP^#yF^b$CV!~MYNkc1P!q_p}Bu10n4kom9PZ?Sg z6Y}zDlL#TZKqgJZgGNzY<}#uDJ!9B;Fkzgt(Im!@TW==p@mJbfr9G##7nQb4X|F1+ zSZO6n%id%X_fQxcnXqs8SwkDdg#ArQ8>zH$N}HfGo6-`M*8Mq?7)xRJF`*p-jixl1 z%!G2F>@F(1!8wN8p-gz@QE8);cAwHFD{ZFIW-BdCY0H(C`MgPlQv6mk;dxk42*vLp z6UO5&7<RWaY2rbpWhkvcX+=u=NonVm*5O6Nzs^jUpDV4O(uOJRHl>YL+E}GUC~d0J z;*~a6Y0H(CskH7}Ok$j#M@+~g&=@_Bm^3lqCByC(CX{=nB`NJ$rM;lEol4uIw1Y}} zTWKFD?WodDDD69?$qiI`oZXqQPLpdA<LNq%F=4;iHk4<&j;2i5ZvoQnCNg2ah0<mz zEmdi0N{f8iB<`g!qM6WkZa1_tCe-OyOd^czJeaT+skC)U%Td~9rR6DYuhNQ@R-&}% zohC7X!iZ%;7@)Cqz3Z4XF=&@zH-rh#cq(nC(vB+abEREUnp>XkizYmo8j5R_)>dg9 zly;-i`Y7!dr43WsT}m6Rw24ZKP}(e|#Vc)*(o&R`rL=WQOWb1;_fc9UG2tHCtA^&z zggFFgBH3+b!q|JSp@lMGZ3z@kcBM?{-(EK~KPK#FP+Gjw)+lX*(!NmI*Gg;jhT)$V z6V_hyO=1#-o6iJopVF8xZr^VblgTcQ3HSIwp;R_DGNHXMFzf~~p}kkyNTrQa+61N9 zl$NNpk^?3Yp{ENI#w7<)S1H^^OqzHKq}y#`(!@5Uy`r>3N-I`c^CFXoq%gdhFs4yj zw$e7gWfD`!E|&@O#<vYEgbCvpP!!o+V8VU6cML6v3F!x#N_HEWuvh4ip|xScTCUQp zN^AYDNko%dGZV&0O3PGQ^TQ?)Lw4RwC_|v@Xdh2J6XtKqu0YuZyk`>A$n8KT>>X6v zDW%zqO=3FPr840;Yo&dov<pg;+Xkcy%q2mw<TjBBW0fOVYoYjgGa;=&y4^-5O_)ne zVg|YOVM70*v?Qf@eP|Lh$*wsQ_AM#xH>LT1WY`5TVLte=Nz5X*W+sfEm6oTp&7~$0 zM|QbPny3Jcr*irulP0!)V%TkG!gFIv`&MaQM-98?Oz4k3HHrHvjAKl=Cw$D%1~OrM z`We>IDg7oeVLk|IN!oi%nrQnq)>=sGz=VC$Ab-+sW5PaA&`qS>&!mYbKz&JD&xCOf zs2^zunKW?{6hPYdOn8Rl1X})ja&7ZVCcKN`Tg-sSt}7Gb0<w~J8<Qp`fJV^$qe)EY z8(|YATC`YPZ&u5TA6<Xz>eiLl`YgL;ywtD!XBOpeON1r%^$!b_KRKv=ZLw!u<YaN? zw5cwh&xgO&A4EppsQM3|Dnup+rd9vJuC`7)#mEAGjsHT%SRTl4`9Bc<jZXvl@+tn{ zE*hOTj^%em+^jgqW66QTZ;P27+hc6s9%Dz`*<<K%)@IqF@nZK|hbnW}&6_nkdRC7h zn}cSZ5~GfE2pn!5eVgujtSoo(BejuuKP6m`?W0RIG+FNCCvf;3lVW5TqaDK~EkU=? z|B{`f5xGSOQys0~U(m3c0*<T+lR{!9&4i~RF}Ltp)<(~oIaP_$H{YmPv&|z$-_^^n zuYcbzLP#wrW=st~r8aU(WK6=0YB|`2p)UCwmrur_m3!+RuY>ns4d~!o@F3nn^;F<9 zUm{bT^$ONsuGrs9&ebD-u<v{h_7RUhayYa;-huSpH%+B}@}6;rm+ZxR3(n16d@Dj2 zUNM&J!{2}6=ZW_V5&cv9BYR<YXT@aQp9#~-E%Wfq(=Wk^mrysfiXNmd>)mqD+9lY7 zyZ@Hw-$DF3RZJv(@mrfWeYp_NrLTM<vn}d`5$=Gu{l-URq9%3PcnwY~-L(AMXS334 z>fs3g<;5?rpP7$$9({ab^kUe1R}3Tn{g!KcwxD=5@Gm|40PKeUbgaI7-&<zV@0P9) zVQ;uCIeb3s1Dd5*NWJ9P@guX4=Z~D(^iUp-FI@WVk_XP`SvRbE`gOej!c<4TLQ?4| z?&G!oNx09(I!@7NOvkq@-+;ajUHeQ@Qx@?xs%1eRsdqi_QKxC1)q0yL+h(jsKDpg7 zGj^3vwQl%R{OjGHJNgqj=lBxoPcPqt&%V&Q+Wune^d8cmKEuPa%iC1zL33ZQU{E0* zdm(J?nzq&YJ0}M<9s)gTZnF}5`)WO_Q_Ss^(1#Ce?Ekidz57A`ccY~4bv8EF!M?@l z=j7stm^j{MDRa=R7sgb+3H^i5MSt%b<g4sjiEson({IP8FN7i;tiwK%bvm>nhVpCv zqaTLdISu==dx!pFNBTFcxRLZVE4>yykCtZFw;w0TdC$L}|CtnU$6Gj?qMkOY<BtFJ zgqOPqz8m3x6R?+xlsn$CYS=Y~Ds3Cpk+xVjg}w2S{&~T_rta?e?}7i)FE9LWW|-jH zOdssm2=?NSe2c5ZW?rJbsi~J)c$x9yQu*#uoRJ^6k?!!nskv#>rsj6-Oelt4?da3A zsh4Qit|`pqAx^6ge4&qYDSaX@yv*jNUVYlNLonj99#Gm<e@u1U-0Rk>?_qqicYpY0 z{tusOpZ}$QQ{dke_%{XqO@V(?;NKMZ|4Ry(uJUu~_p9{a3Z3)tr-57D`VAU3_H25E z&Mz~kpZ{^lY`GSN;o{%^U<_E}<LrMR&i-HWKXw*=wtlt{u~VXK6DQ+$s(8i1HY?8Y zP)v%PGiheTl!<d=B5l#QM&meoO3c(~%#Wq}q1Da>+&dl`_L#BhA9g>^I5xgFVs7R* zJxg^umh0+{=L4ON<(^Z=^XHIZj>lNUt#Q1=={Oh>u{vk65xIZA|JSEL1E(0$FHBC1 zoida4f2#gFhhsz|1mM^nTy6M<zkl`HvFuAX&hfn3_&8UUf7*Yez172!KfP2lB_eV7 zzbU<q_!_Ycbc&y$|JCn5OK-=pqVNm26Qie0lIbBolM-X%C(fP{p&to>-<Fd<+9%@T z=?i;+XUv$_3+uS@ySHJ5v_t`NOwZ$pfa7r<j^%o$@yT*J4#jbE<0QVz@xOYN2k$z@ zv7>*HPRBU>_wzrP0*-krqhXY>c-y?#DHHXw;~2d(95}kU+V;iK@4v#%?VS-{=XNP> z7Jdm1KM0sG(?;ILI}03G3BDc6=MJZ1=kogBzFv;zKlbH#?J^J}J)M*5kJ9fr+&KDC z;B@@IJ-u)Xp~lC!enSiaI9{Kj|J83ak2OBd{s-dhKjDAmlvvxO(Nk=rZIdFVBaC?b z*72m-@y4NwQzgivj&R@0>G*1|-@)sD1fBEG7C%``ipG3Je$U1G0uicXn~~~t9O-l% z=yZ(3|I;6Lr`XHioSi;pV$96QDT(rwyk2J;CntY;=v=<9cAmKdp*iN)YNunH)3Gd{ zj`leGKmBpe3;C<86K708u0_Pl3$x<C<M`@IFV;D~oZBORc<3C5D+%Mj?SDkV?AcSe zkC*Wbz<=K>iLjIHe>?t0`Xis^??F$Q#CtmEhk_?YPO?psYcDee^~Wdyvl48vF*B!# zgqgE3wuzh)$?-SzxVV}Zl!eM+c97)rf{y7U$M=rs6LIW#KEUaGa~wOCk8=3!SRU;- zw&K6>x!Uq%`19}g|4a%vueVH|Jd64b=XS}6T^hi#Jjk-(cx>4HQ{T>gLHy(xn`8SK zeU<S+@vreQ>aQWn`si3c4E?Wu|4;evJbyCco9c8u|LywhoS#N||51ExPVo(KIySEB zpZdPi_&TTW)s~+ty{^9+->FXPO-49bfab;lzW=Aw-ytf037zK;M)@)v`vd;T`dr)o z)4b1!Jig_4$iw0IO7TCnM}hFLHq+-GrwIDu`2SM;=TtAj(v^hPa{T8zjqm*6zlB2j zdw-nsSNcDDN)&|>iJm?ZdvzT@B{*=*?;TFZt8whurdV(+|NnpG<9O}zn*L3%KhN2J z)9cUE$N8*tdi~Sw$tb4?$nkM)wzo3=j@N)DrH21jr(>t+)cT=g+ax`A?r&s&X_hDc z=Eu1`otZFW;*3eQi0CPi6JsLdsVz+Un|@1Y&i+s0Tcnc{qR3b0{JYxm#g#_YIeq`> z@sup9!zf+M_<IeJFa9<slD*?lB3aIw5C!9}e6Rw~qT;U?Q8@m}hcNJrB>uJ_k|k9> zI%5)c{JoJV6Mv<jCXt1|@;0hTWaBSxtb!8j>c5W!7oZ;cS&%nT4(M8<T#$Su!zA)R z*AwM~<l`84J2eOoLV$`v^3e*s=@eupsswc+ssi~C2|OFunaBequO9D-1L5%@kT<9+ zkr~vD$Pd(x$O>vt6b<S?6bEWXln81?WCsl(N&^if$^;D}$^yxfhSUHJCdvWHCpSzY z7bKs1!u5jWQ-FAPI><s)1d>l<;d((sh)O~7Nkcq;>>=cjZ-Syhw-d<+Z0;aR1O*Y< zK_iLMKz9;lg6<;90?B+w{6KdT<$z@Chxma;6Xk(Ii1I=5sVn3MNVXD)A80I5DM*$c zyki(7H#s4XK;wxjLH80>fx?Ic7E&e<d4TRC@&ZjH@&<(ynL(3?d_j|m{6G;z0iZ}C z3up?F6%<7j48o&Hh)XCankXC;Llh0dgEKfA2a@-MP+~!`M0Su|dNheNklamU5}BY` zL|LFXqHNIpL^+_@M7ba=O~OSU$VQY8N+2o%%^@lV;g$^SN<p%IA^kvdh>7$A$tSJw zzFE)%L{%W!TAJjezhVKA2WTOY7ibZYH^@$81|<{uf)*3`fl`P9K&eC)&=MjmXem)J z=s}`TP#RG<D4i%8w2UYYltGjTT25pKtsqJRJw%iVdYC8+B-;*@KhR2|9MCGFT+ky# zd7#xq`JhLMia?JM6@wlpDh0_F2<ZoUf~Xv{hNu#>mZ%D}jz~V>yPn7cw1LPA^dylt zD4WO(dWy&w^fZwl=oz8_&_*H)XcLhY^ej;@=sBWLP!3Tz=y{@O&<jLypcjb}L7R!} zpe;mcpqGd;L0gHkK)FQOplw7spqGhqLEDM)Ks$)?L9Y-Mfp!uVgLV;>g7S#UK)Z>` zL3@ZQL9Y^3f%X!KM)+L~A`j5(L|&jbh`d4hL}t)FB45y(M1G+CL;;`zA`9pMkri~1 zC>T^o6bdRL3J1MK6b*WtC=T=vQ6lINksb6dQ5xtlQ6}g;qAXA`Q8ws(q8!i>qFm4i zM0ubRqI}SYL`9&Fh>AfU6P1EWiON8q5S4?D5><jeC8`1)BNB~;_>9N{^f{3i=nEom zP#KXK^d*rm=qn;W(APu(pyNaq&^JU@&<Ubo(6>aPpmL&c&`F|b(04>}pbDZy&?zE2 z=zF3x&<{kJpdX2{K$S$<pwmP-pfg0dptD4IpmRj|pr43}KtB@|gMJ|@1yvE1fzA_^ zgMKBd1pP)-1-d{a2QL?iJV3t_d4Vnwd4pslX%c3TiO3gJhsY1)Mic;YC$fO*5?Mj@ zh=M`&i9$ghMB$(YMA0CPC=S$+C=t|%$PQ{ulm==-lnL@A$^v;2WrLa$<$#(I<$|su z$^*$eOc)=4S`Zb1S`rn5S`n3kyot&{*AkV3t|O`hT~Aa6YE2}Ed~Jw4KsOM1f!Y#z zgUm!`P&*=DP<tXjPzRy_kPnds)RD*v>O>R_>P!?0@+Arfbs>rdbtQ@ebt6gybtkfe zdJv_7dJ<)VZY0VA`4MG<dJ*M-dK2Y>`Vi%T{E6~GHxU(q`Vtj``Vp0a<efeAAE5q3 z<)E91DnSE?sz3vY<Un~4kq2lnk$jr+79wwug~$vVLgWh?O5_I`Mic-FB(i{RC9;Bs z69t2ABMJq{UD_C-G{tzxO;R3cGEpfgmB_mpdU2uvPzF&VXt{p&8uV5~zMyAxJJ8ca zR?t&Kp`dJ{XwZ{HiJ%QcX`uB)S)g@9p)Jt+>2{#aM0ubsMCG8JL{*?yh@xAf?;%P9 zy-HLBlF!Ct>;uXt@@<9wgD4bqkSH2-fT$EyNK^&-fGEHlZ8lL3=nJAe(C0)&pwEa( zLC1*7L7x&;fsPV+T#I&`$Qx8jlye<gWuj70IZ-+2TcXhG(X#4xpmRidptD3ppfg0J zpwqftYqW_(<)Gh)szARId9*=GsM~=q5EX&yxyuytxB+bwkuRtrQ8cI#Q4XjXQ65M> zSB!BxNIp4?nL}H&FGOjeE<{-%U!ojPXQDh%C*97Bx~iWA`4N?adJzS*L#-gPf(8(U zf^H^?2KCqN+M~|sXF)@VvOq(L@<1brsz7%Vd3V6Pf+!R;jwlf{fhZ4jA5kf2GLg3r z<_1J*pm?Gz&}^a{(EUVtpg5u;&@7@-&`hFo&<vs~P%M#0N6Zq4iaKFbub&0Y*Uxsw zxSc2w^Z-#7$WBxWN+zlTEh7r>MGYki1wBlZ1<E8U0zFDp3R+EM?ShdnQ6gw9Q5t9s zQ59$%k#ASjMxp@FMxq?hvqa^fmx!uBTZlZmq1Nhlpshqjpq={J?x?FozM$8LqCu|{ zrGW~Fia-a5%0ZtJ`Sw69BeH^8)|KTi4b+M#2Xr@4IcOA-M^B8`h^(OZh@wF!iE=>S z5tV|@5|x9_5LJOr6M5W-5sGdHI;U%XsAWXnpkIl6LFb7AKynQMb*mTZo34S}>PgKC z!Xx>hP>_iz8YGAUdSe`+p9OglWr3O!<$<mxssdd{<lP7TDv>Y9Oq2y`Pm~AhPE-Zz zLFDa^9)c(oG@K|AbSF_7Xe3b;=q@7fn=n%+3I&ZNvZe?5c#O5Cobt0~1o~L48N!+# z=wr5~B>9+yXX?+mB0doeiy$9!ITV%(El47Ct@%sx6OI~IzL#5}z&cxbUv7n_*4fJI zax1UPt<0BOnX9e(<jd2RsPrL?s?nnwn^dEwUqhjEEUYO7eiQc}a{dG%z06U8NF(p4 z^bj8}m43n26-hpRyFK7EPdYmLq6{~DNS*~spCj@hQKelXowKHUc<u`HiMFl?^6{4* z`C1E+_OKU$8AZ4D$=@S=BU5$>Kdk9PypTEm!gEO#&i*YAyxD_Yf7b&ud5|#wKZI^_ z8GT>f@gUDP0)68C_}c5ZbnHitZH=nav!b=kwnWceK|aw@=~fSQ6o(@Xr~EUjtQm)_ zD=^m3XFVdL5V;%dB6klR3Y7Uv*=wzlz2W4otQ*!mG+)9xJ-@Rxqp|cdWuU1}QX}gM zI-rcA8d0jd$gpQh^9+lJbR59ZkkJp&GZm^uRyT`C=;`Q5&<Zp;m~uahgxK8>MCK_) z4dKA=q<puIUaI0qmm)mz6Slf1<rwU*M>5riA_x!6ff>tv(hyQ$Myih;-`0!}AFGUN zoV*sxrC<*kjAW?xY-s@@&Is2B;nK<Eyh@ytjic@U8bTdmqlC2T7E=;t+iZ6^SVT^q zzR5P&L9oTgZnE|Gs~2-J2Wcf;CnC8$_mnrJQj$KzBW16TT}Eg@{XY38pC+R#xoj`T z)Rk{IuP%L_JJI^tnmYvA*a%dn9uh9d$9h=~{fe4lI7ulpq5W)O9CnoVhnM7gre+v6 zNa|w5-I|gZEE0yg@KrjsrsUCmXIl##_;tJl2ZJ8MpM<(6SHL49i;~IHKZuu;Q<S7p zS7t6JfiB{w2Y$Kl=j2t%+;Y4^&n2r2IVI5-T~G=iT5*Y1S@mo-=j4xYQ9$ats*-=z z&d7|Evfqu|<SMbRTo#64!=NL|IC9I@9@iKw=3I{~$2p^^uP!!qD$uzYB|+v;MO&kO zw@0nnjWT7_?>f>|#iwYY!d<jbs=u+wC<M#;$DK8DT28oiIm4bMlMQFlA5(l)b*1`i zmPsxPGAsh51w6^CL`;OOm429!CMPt+monuU*+vBj8x?Ojhr3I`-twZ1Awe}s?=mvw zBuSq4rQ)yqT4<N5{7@TNLTaJCm_^;Fu58?_8O74EpM&GNMK1M1d#<DNLc5$P%8zs( z?BKr8F6TRRCZ)jQB5~1etMv8K<C5;~gFe}V9A$v**+}C{_*m&^qr=fbds?-bOnzyG zbn-w}dKsZ9|0x?Rdj27vmg;yK{-n4XfTYzNbHMv>HD=Qf>{+rD$ea(-g%Ft=Mm9j_ zexd=+`knlNi;Qof-7X6uKJvnS3oV#<8f-7eDNFU?sT!8{O2@;4_H*)3_rz|ISpk=H z=(!VJbXuDHxoJAK*2Rn8s*9knwXP9$i#{j|h)Opp8d66(3MjNt9x_wLRFB}O^S2br z#S=XYa3dP7!zsGAG+9!lQ*%&;U6!&vhyVm5b@u2{SBEn8)o00JN*<Lq&!s6iC&y?t zeQ?pjxVvhJ$XD|4Ql?x(sLq$}F1_$V%i`xaJkaY;g$GKfA7VmR6^;w>OHY$Ul-k?` zPuUuWS6>0H+^^=)N0q00<Rk#yx^scbu-Nuh)kE|GT*RxMt4l+SFy+7!G7Y{i<-@H% z`I}*vYi0d$=$Y~Y3=kGhpxLlyq|0UjaSh05luR`NGR{%tS6SdH-F=zM@W&gT;40Il z;Tg}a?#X97@2e}LV4O5Uz{y7PBn{O(eM_T8crN_J)AxP(U5wEDFH7NNC;OomyA1jd zhJ1*~l~qCc$_AM}e^vz@Yn4+qlEqrKcvP5BtYstlm&!3Ulhx(8X3=+X#sBqkEF0H6 zz4btij7m>F2tlvx@~Fu9G+qwva2l_6uIU=@VRkrOT;nLe#?hNKjtX#;hyO@nJsKCB zh2Nb84B?C{Ex|e6G1V;iU|o?XXKvON+hnM_1HorEx~{0!iT628L2K660As!=Ge0;b zFI$GRpoQno5T8&PTfO%~1vFQnDS!z^?J$u78VIwTEXXByb}iFec&?DQGy3F5!N{kg zv7F)gL|xJk>45z8+?5^)vjO`SOsy7C1EV1py6=NOG&A)fV?z(zM@@GP2XTMkfOK|n zaxSXiUx<-h5l4)!s}Vpj1&}ObR8c?|%5~hxhK$pk1%H-mGHGP0Aq_E7DhN>dLjAd8 z+bOMNF!-bQ!uml<zE$?g`rymx;dL|2+N>+$ym!kER~7_VdF~P^Ri>mSd|;`AqXlMT z#5e|R+wR9<O)X_(Nhcq{A8GCDxy$Z_$flHeU|2d^m)@{UlNsTcakocC5jjf9H>Z^4 zlZb^8!z%XAtY|>w>-mOd=AT(LmwuV`3zU6#N<qystj0eUX&CI7NWs?XL~<;;dP$YT z74u0OE=`ZE<7LiZ$r4Rb^W4>7-<S0=is?%E8r_{uM%1~?hDHza3gh?+-Cd;?#=LqC zaabej4A_@MlUQ7hOym*n=~kOG(vJ}vEJPq_Arx97jnRnAW95TGT!YhxL|5Ed?L1?I zhm&_B>KOjP4+};`2o!<T^dpkPi*^hT!xep0Z4Akg%+~beOfEZme68tLJ#Px_vee5# zEaju?0kg_aFBzcOn(ppHBV&tPmd6ER$ZWwhj#^%aVX#_OWA|{2r8N98#>s|(^4~1| z_e0-WN&b51nVV8zuIYl7ZfdOD$l<QllvH1Sxh?cID$ye8jq{pK3Bs^mDzau_c?TDS zVYzihs!2X0C?iKvK=lt03Cf!kSKfR~X@NBejCF#mgG_g2TOw_d;4}<sU`<c+;=V)I zWcH`YAH5_qSOur2c{?1!frmUyaWz>$BGP(R5F+ngBT;1YAD|~nfJ36Z<T8ecV1Q$y zAQwUq<@D8*GMAmjNqH_?kCs#Z{FPX|^%rANsAmnV<v_1y6md>QKz@)m)sax;DO_K# z#q7Xwy*5s+z=rCsl6>Oi^2t`|1^kc08XlEVzn~R?K7o7msRZhtUJ{YSp-9v~VXITI zNZL~e?1$Qff`p?&dn)2%mYzxHvOHBU_mTz1aneN2DZD96<u|fD6!kO>XZ0X%kU5|S zpoeb6nq~!Gaqv}6%bwN@x$YTWqr#~4K&DbT)UVO3=2Xd<2(|iX6^__4*q2JJ9szP( zXz@kFVXbZm6k5zuVHcSea_zWKV6hh3r7AzwO9GZcdjN}u(=wM%rCRN@I+~?qO&63Y zlkKvY+NE0Ul0wn5NQ!)DXB#69!7hE0s{GW5zO{zaLW_sA(EZ{23si?>wO2W4kv5!z ze^j5TDpxN})5s%HFUrl}THShBuCMB1)k<&O^=w6vF@)tla)|=BAf!ZCSB|-4xeRc$ z$|fr;t78pSGFIdYC>g3fl5$46{F|N@>hj!1Iw#*d?(B6&dM=%dc6n|Gos+*);_MD% z${d_T^B3;=Y@U8L&c)e`^mXKKqP$**1j&|8R^-tl#ESbPcgw;o2V|*q;i&!=D;CHp zJy-0erHhP8HEMHCj(j*yPfK(ed;y(H!a3AiKOE?DWj~rL)AEelf?KT-vcHr4Py`wR z>-4wKj;!X~)U(2xo`lK$ioIGEg@U_H))hNUMeuI77yg{xSn-03%afB1%sr~4Ss<A? z8)c-+d3t(UcNdZ8SvJz$&&63x3*;a?Dm|^p#aXzOqj9(`c6D||UVt98P<-vS)Qnn6 zen9oDG<^)~7;QaM5>XTG4{&y>@+^<agrfz@I)+f*7!Aw&P-v9p^vtl&7~v}g%&&`# zpaL^2<~{C+nQTu&^@?klrw@@gw$T2|k!s+{U&zWK0JcjXVm5rk8mVkM9R1=_RA`qc z<cFGr!-k7OyV0)5rcN)5m<hWh!D<L{znbC3u(Pg^$)o4H1wQK~n-b2rgcY1Ze{PhB zn^>+ac#T3v#C6Y;sAf&Z=uWP;8Vj1#lzGc0673I4d`7x#OR$=SxH_t`rASZ9by8(T zOHa#pQe_oOPm|TH(A@`rMTJL(yAP_FyHCnMAGZa4tPvQmQXOlAZ&}5#1|`=`F(uop z$*MGB#SS6smr<qOKo{y=eIe9;Qq+BA$BnfYMAmUR*FuL#{L4~}hkX`T8B=}EMV90t zclA(^_cazHaGN{1#$tpN1Y(~jEY(h`*Gc4QxlTeIQ-)ohpy;M2%f*t*Rk;8|YN7oY z5dVxr$7K#Ix~j!v^yE&xs2+m8>WQ@Utxii>DtJ7Sd@7s#PW7RTMyF&(Qz;u{3eb#M zt}OI2vSznr*-*V-mQr;?yap?|?MYO$k@0kC2hXB$E*jt64WmGKHUP(-OP9iNa*|K? zOSpwLN3O0C8Ovdvs_*&!=?$hDc5NL)2}ID{F$;5^dK_S*AfN7NK4pAJzzqjkrtsmz z9LGaW26?-1iDAOp^n5L)s`mn!AhFnGA}X#iVj&X_XL0$l@(wamDZ?&PaJL4tUrxgn zC1V`9@^)ncr*Uu>ht!XCE6UhM*^r*R5mD3c#+#>;k1gxU&6^HqDKyOar(3)*K}Fv6 zCr5LPdrs9Sbl+SiyKbD3DTBK#8Q<j~;CDv4v`9~r+YkTLBWdsl9_e#nq>G;XNL#(% zhxh2~7Rpky&qlL#^dPjVjNUC#`X|%1TC!g*rCly%LaGRIa(Y$1Ii`jO@;E)s9e*k5 zx%ZNlWM`(V%}(k;yWB^hU&ukb+~LU=6=C-_{6LTHMT~n)o;%%5X^YJ`bdlKgJeQYI z5C|?Mv9-rSSuSlJ@Ux;3#WBOu8l}pHRI}mR-<21x?lriutDj^P5Q?UAJ$u)MlX^*A zDH5JL?K1vGwq>~Q!;%yhST3)vdtCTZKMAXBl$_4Kc)pJ1ydeqlniJu_sQ9Dcq+z+= zZaFFKhI)mRNaXbj^h@ZyYi=>|TrvlXGw@W7oAe=M01Y7n5DkB<Jp?Qo?lPVj;~<`> ze*sALZu_v@A?u<Q1D=fL$<Co9?5%j#g)c5|{kXV(&)3~exQ-+v$fWc%AEW_>N=ahD zWL>2Kbt#`>F(6s4b|lq3X=}m-F2gu&M3c&#EN<i=BVGFExfSU}x6x(7(TVhAdBPzC zQr%d^1?xdAtb4M75me0rAcNRf<*tV^qII>$Luj&$g6xOo^3_Ot<GSUoO)R_m8jDP8 zu(x-2G7PA)HI}4DZHV{DUC2y*QQJ>nX7}S|b}Z(}@rTS3&z<Rdfuy}lo;w?9`_8*# ziMv&`iOjV^cj>dJ*iG@^ZFxqVqz8jm;&ehklH`(WN*>(_w{=iT2HhLyOZ9W}Fw$^{ zzstfZlP0CilkDAOav-wlLvY6q<%&Hq_qX~lR4K7rro>{zLQe@v?8y7%7L<2#dC=~Q z$Rb<eOQFRZHo9(&u;@X^i?yzBPnNS(3z>0_rD5I9b0_|!r~268ELq?1Be#-xKKMA= z8Eb@of=hQsDy5j!ZQrFbiU&pOWQDY>IWa%^u?ua#3vH_lZLJIKK^Iy)X-LCzL|B}R zbYT+gLL2Bp^L3#$ccBRv+Nt`NUw)|zt-ytrOPacbr)nOqa^YfOO_NzJOzw4|-R45; z<3ejonlThV>4n2`O5J*Vf)o1}?1Pm>z@ncmr$f2EDa*93mAKIIU1*zKX!6lt2d~my zm?XH+Cb`f?y3qQQrefOFg-OerCiQC`$}P^$MgF)8O+IYxY`2#*75EkxCQsBfSyuD# z0T(W&y3j_u&~9;|b#tM~o#oCEcXOfrh<UxUo!qnTtQES@w!6@tbfL-p{SJj8spg@4 z!ocCIe3U^Ra>2Z-=AqmM<8W3!dEs!_zUHBPy2IhDI~~?6<CW;ToG(>A4&$uJ?FD+R zc%9Cw_-(CuD5otBL9V33nn5mbp~bk+<nP=&cs0D{VLulxI@C02Uh}YS&BLG3=Qw!( zZOy|{I;<J-0vB4Y3vHbXEzN~ybD@R1(1KiO0WLIs+@tDc3o=oM^=cmeV$v_4+q!Zb z>iPS*B00I2Da0lR=&)vzY;&Qluj%X|7bf#vXi+XSV<W1?AsU0(dy5`j`6Qr2HkxZ5 z%4aH_i}FQu2hQ3_($u9Mr9&FjRF9gPIyut!c5>q6xN?Cxj!{n>jVl(?m}O8I+$3G* z>m>bTzRQz=`boK>dAZBZ`boKTa`{QEItgh6m6GT!*YqiU<gCErjWJXzoMH?mzwG#r zeIgqS1Kfg*lO+g4Fx;`1+g@$B<tts<<<cBh)366X-dJ|SvgtlKAWMS}nC2Dggaf3y z&eD_6iYC&zy!+o=_Y_B=R(b2xGethCOJ_ZITD;^kM+Lb?XvR=o2IaYPM56)wJeM3c zPSPc2q^BZ2{nPCDo1_M!KjM+O-AiFerKYhYvQEd4T+J7(5wvQBYr%pf3WL>+ZobLr zh0EyR57dlwno@i4)ywIoK8XoWAA(r}%y8ca7eH4)PH?wfza1Eim1Hsr&hR3?C^pzk zj*T9;=eQQGPQC<}C%^pt(j{Xy;f{r^-FB$D@t*SfD(2IqgDIR?W<7Qz{L`)UY=lfJ zIk3jeq@6=t$;x3ml%6cF0MYiPNu)1U!F(-4J;fZAc5P(@GK>f`mZV}J<3yh8fv3w^ zTz|S%opdwlDS0v@#KNw|<@ie9Qj~9!ly7TrP*JA>B}va}xu;ZS|NI}TH{&_1vAHMR zf|BTKN@!|bfvz1Mq1ef#ZESn0DFpHT9t`p^lc+hLPT15ZzhaINy?{TCo_;;3H#SSn z2qyTsm?@i*^vlS=c4_Aji^)CeoHe;18}XgE-xCj6{`>hi1!^e;s_(Su#Ov#*R$g2f zv0#~l+9eC3gOqo<lz+KYbh#wQK@K|%=y|!z_n%-oPcwM^Ap|t0*x!H_HAuGRa)sQg zKig!vlxabuW>hNlGgM>o#8us-mePw*?4ok9Ja_nyT?Bi+;nIaQ#pMnfihm&5{hIq{ zsNSRBv1cNBXjgm7$ONNnET$BZPfQut6D_YN^kuAS;M(--IVs<pKrXPLEc=i_@@|7? zY8o<Km*2483Ar2hG<dF!7DW(u(#b2&H`0Tp&Aui13)(xns(JR8QbgXb0y{=zhw93` zJTK42$w%n?qS8H1>P@k3KM+xM6%VN!A<2<g&3IgXmg3=G9goW`5D!{FqImct9(t6G zG*0k!nW-*zVY{@W;sUQ-X8s?$i2mc^VsR+us+zfaeh{|@lTVe(f<cdn%B}AX`!p)$ zi448h>Qf*)F1=Qz`c%;w{lP)iu{hKLQ_?lq5g_Dj#<^d4UyiV(&nbCX2=0<+Y8K{v z&^%yGdqX{!EQKP?j9@S#=?K$B=x3KqyX+hucehg?yhJ{VZ+I`4?Nfa=Qd!Ug#2s=d zIZ))&gfck!G$BP2k=4UmPEn&#3^HA=RtM-$tgS~}J(qmI-c?7;gC3IeT(Sda<eF)! zPc_NOiLRYfWNfMTOUVmBY(;{+Cm(RKKJIV@tyu0O4TDzbo){^J+Q~b)aDv<;YS?nS z+(!l=cTRFrD?|N`yNo36qRIhF4M8Tmk-BO{R!{6g3q2p<`Ty8^8}LYv>dsdhwd}Sn zXki8zjKK|PKw(S}@g$MsA+$h-9vCOWQ5+?i5E(1B5)Yt^T4ROCc8k^oi5`K%&OU3h zBvBII#G6fmlV$Dkz+!1)Ji;-_7)aufJa;E7do!K(-RpcZn-Avx{->(mkM39VW!UH0 z`&>Qt^!rwwI(6#QsZ*y;ovQcIhypRt$C_%pUO1PA*ai>qyFf-j^@33jA(`-{7=GB` z!7ti@S9i4GFAJesx)}gFQGtN*>B>*ytaq=ES3d}TG?LG?6RxT;PLWewe;l{`SRT{# zDyqRk<NO%%>x$_}EdROVkFJ025a|B{t(h>`vZ;~?t2-(A5G5X`vpR#s$;flUbJ!%U zyo~BKaU1&G&O}#6$uU5vgI-vL{-rWX-611oFBL77N2QmLEO~Fb3I{&}n7VR-Uxv;{ zev4m<xPiu+rSb~i7KLk}PYVp*6yU;JKX1*ed6%rjxrf}Fazj@ivXa&U4&ww7>GF}g zUSRAk^yMML-d@7(R)iAn&9$#K%L!yAg7C(=?p412kXSD}E(QXYh9a4(&F)E+9(AQ9 zcyZ}bqbDxC2l1H39Z8*H*Y=K*O{T93CioV{>m%g51y60mjv+NJk4re=`A*d!WygFh zMiYG)p}0aQ`eGD)QaFv{sN1MgL|H2DuOKx}>$T;E(?psdIUPxNGe@ski)_mDCny*C z2B<q@3hBz)v4o{g8M;0Y=_-C^Wl}-`aW+f}2M0Xo)GnuG2YCuDby{}U1=JgQ;dp7h z`1V_Vpp2H&@>ok+({jVS1WoOXFOvmFn~X4(xIbB9B2mJbH!UTkU#t#>j#FtPN-`u- z(rAE!F=}C(nkt1d0I0!j01DR`Z0w+W&btqSymeG%yhXxtW2U_Q0-`DP5>05EtCy(% zaG2aiu}Gfa9~HgXzt>Kp7iQk5kV@H)9hKLR5u`#X+FrYJjlmTdS87}ix<nuDtIWJV zdabU3M1OIL97FoM@w(4vDZGf#!a>=eq1^oJ_|$vfe_N~uWZ_NLcN28J2C@KVsqDpJ zv@dRu-n=uNLky*$mw$R&B8E~Dz@bYr3P+#4ENa@kQeeab{77eDJMi%JrvpHFeqG4a zh!dv-6Y+41My>AfiYq^4Tj7c`RHKM91im%5zEmc2Y4K^Fr_FN|$3O4`!iCQzlIzve zq@tO%^nphGbX1D|sk8Fk{wY^^gMaF-ysh~Yp+?u*+D0+7Wyu=bysdd_D+nVe=w$Ju zS!xC7Z2=&r$WKeg(%J^ratgz_0D>M`4pXB<BH}F?aVAo$ihR{cliKNRchi<+y<D=; zQgOx@?3{Z?D8&LqmQtXVHH<n}fvqMUA5-Ir2rLqFIjk*c!nEomBW>pGFO(y)omCMX znoXI<Iy6hzU5l4Thdi*YPG>~N!@><o&UH_ksNs}(n%886S{$z^qrNKQG3twtY~v|m z)XVpzHrsD^2fArbeM5Rf%{_Yi&+NNHEJ#9~Sy`njX=BJMCN6Nm&E@bMuL_U;;uP)V z=&$($@S)gIxwP>=(G$%Z1B6zjWZT^lx}_puipsrAbciU|U{4ewr63Mn*&i>vGcP*X zv&>=LsByR6_WpgFH_nmS7iRcdsreDH!K#0rp2UL2bza*k0h!S~e&|mH&`fCz+Og*; z66LO(qJ-Ai!;dH;k!5$K@X!YDl`oydiM;c`Th6x~NgT5d$LyC*f_<lQT*A&ToeGUx znlHhmz*7!~$ocC!^?J)HENJH?vvvZ2TvybqLc-}9UvjuU)SKbZI2yrcR8#vMIFSNC zYY!Xc<&caZoQ7TA!S3qD`SABjQ~WC>B9Fb??~oHo1soWM^AiLc-OEHc*%5o}?Lf?k z#;NnzPdi5l*v7H#cPN5sA6>q$<DQoQGeLjsyZd=O?IUACxH_Ak(q_dZ`i3h|-1tbA zp76!Wcl~H+N{Z92697`nqOh@)#9kE@T(J&o)dx>BxunK%q;^CQ9Tl7f>FxpfoC)0= z*)gy8^v&VW&+K7>&^(Hf;8rskw}5V<6kTSyTUVOwsjs1_aDJqju0vXk=`GF3^O0&- zhUWu56x$RVr+(%it3q~`zoOkWS5j}XQ2{DC{aVUtkX_3=wF|#VEIm0^sO><$EioFS zg$0dO;KtTZZmF+HuC#liRthEaT!bPM0L3h*+FH)Qk7$e|pwz<p97*Z?m-Um|9&xFk zX9>!!2%Lw%{9o4pviFMhkiI3Eo{!VJ;`A#dn*G$(&+oNyr33*F-eu=W|5p)lZR5W? z7LPr3^6U)D%8&T9WfOjVWBp`4@FnKgH?CMOJiM00f-PlZfk}Z_aFKYg6>Fc8@)VP= zwI^dU^3#DZAV2*F4rGj+&bb$v!!&b)=8rN9gm_QkZJX^aAb9+^#8}=4x4CRG=*b}F zTi54G1iWn5PHi#qKKLQZWY&0%T8BhltC&DX?uoXVKbKw9Rm4FP$A}&48S4IXo*I!T z`E1^miR-11F?MEc*wn|hZ3O&5W}yq<R`Uk66JA`qU$-|!E!JQhU+QdbYio<o5ikz* z3=gT_f2ciUngA)QuEJ!=Zc)feP9gfse~R8HA)Ql#@IrrSM}4+EHt@(+AT#VS&1smk z1FA5($n9KORrbwjWZx7k2W|_qbx`Ax@wO9{y|bh8BN?2}G@Sy1<P}JMW{9s!LJjX! z%Nyg!>2+U(O`{g+`t`pFbS%xEkioPJpjwtZSn9BGwp0+TqN3wV<&?!&UYgexEROu{ zhP(ICPhfUE6UygA>jdRn+uhLc3QeI)g-LWwhBT~DB_TFkcId)4r<@Tn8B{&6m~z_o zpPXjKPRxY&*-DtANZgaDoD1bL%e>2wA}q<5YRTb*!C7p^3`mx#mw92}CR1oq{%X&# zQqf|7c-C0>7%JyWr#GZw!O{2LF?G8QCb4Bak}q!(yvtHKI(r1R>d)Tei?EQGqLR<I zVlCjQhW^>f(JJdIZ9UmVT#<1?4+JhnmdSOQHJFMSudf)UR&(nM)RbwY)UvK*{8sUI z>L>P3od<t6()?ZXug{6ULgM<*E;M@%{54G9JpRr<qve*{q}nFw(XN*6F?GIh4dw>~ z5cH?SbwYYksYhquJHZ%^L03tP<ko458C}9Kk)PHrjPElp_@lMmBMeK&hza2k!XRsr zlF21Y)T=5YB{PdWQAk&#c5V2GqblXa;@M!p%%<N`W+h9#;m$TQiPSxpM`n`w{DsZT z(%JU%ZDy&J&oE0vdaGIL(#<Tb5P4I9d1v-(sZ`mn&0!i^$sB7Ls{o3RQl#T9v3s;* z=8c&J<s2Dpvl+hJ_%$<zT*t7~s;za`PW}sOnQIp_@w`@Yu}XCjFnv*xVU%Im{FlbC z(6>)i!xS3T^pv-*3s)sZ0<|<hNq>jwNv&fHj_~8oy^L7M(g^Gth18Mho5Z-JP~5Q4 zR|WXMmgaYmH4@?F$|A`Tyx?Ztt?RADBwx*6R*5}soDCfjftm`v=++m7z=SoV(G(n} zdkwE=4FiR<@#&NbXV*!|WUAS~mCPRcBdFQgWS#8^u(4wXQ)1kN+~ZYMs=p><<8+40 zYyL3}`e<o*4*RSa27kW>REZPJj(wQ3o&`!hURA385_ck$V?tRII_O$k%*8MqPls9* z{n1@jI8d*Ot-$1TQAe+;AUSt^uCGwj=CNMtJ$+qB-&3am%af3o91P$T7E$iHzB|82 zm*>`Tv-fJXb3ixM<%P9*%Xt-;zCvJjj=0&^T0)qqu~c3j&fDs#x7ppe1?P!c(2Mz6 zjJW;elkMy8B72nD(kRjUtnQ+1>2$deaL`_!PLY7qn)H#`aOh{I=(cy<RvutFw%+fK zt@k%<rw0Udv^x<50KBs``E0&p<~42y)uC{`*oxv`T|bPGzROD1wb~my@a7=t+mrsp zZMJ-JaP5u~>^=3mdfad+l+l}TZ$<zHB>;BMV0`dx7nKc8YlY^x$3BJmfyLADdTxGb zDYw%6LUZ7(#jgy-$HUpGue4M%X4PcC5d~0-S3a%%GylwkknHBzB2S4qc1;<KYWo%2 zp>UYAI5ED}m3wO9Xxhh}oerFJlRMirbB+4wkYTgI2F77}nhOfL8=vzg2t6D1@|cSA z53z`Vj_Yllo+BIu5)Ry$*?BM1j-m1$bbJ4O-lJg;C4i0Lj7E^&!tltt24{S@o=+}Q zri^%v19qFZ$=SD{%eO!T+s)duV%-UmLS0pU;oc-a9Zk6+CT)J06ik&gH<9~ivg4WE zw};N1oc?wZ58gvorheJ=d952#NlSUp{LbdbL*FIhXcmsCGH|Z(OS*0kUg$fl7xxo< zudsVJ(V@eg&x(94Ogtf~-K|qDb1NrD^o2Fbcf!Rqsv#dppyf{P$)F>~%UwggqH~qJ zR!Woxdy668F)SEPNlHwu7<*NwzPkthvhwr%^=SzP|2ySLdU|ot79Mg!kKg$6Bk0yM zjhA}EVp!svTmd7;*)l~77O6RilnqR(2!n!<^8ulcb#TTQIO{C{2}PF)w};LZ1=g@V ziibJuhe^=-Y~RYj4nX5BT72LXg`^XQwTyL{gdAFGQZd-<`xi6`xYL<)zuKIbjgt3q zXn$*E3&gRcEj=QcP3S7^Ri%U07A*yt&@ZHwB=!!hx=LZCl@n<u)TE7|$QH=gACIa> ze`?06Jz26fjaL`w^-T2iKcc5+qo==(p8lRE#%B)6fLcdRz0~7IVP5hAZ%Wa`_&n<D zhkSuIukbHCvpwuG78kfl&b{ha+r=f|GsGg(+2hws@ZsqGTMyXs9xg$FUnV(5u#;^3 zh_Ag*h*4)&NJ-<3FH}>4&FnSIp5=u;u`Th%0q61|Ulm04bT|IyN*YCEhB$}97iXro zhb_AIT*ek%o*e4~Hky6;#;1KLak=pDp+5D+a?i5jb#7Rn5i@nGM8r(J=#P5sv2r<G zqwtc>rj)3jjL~|4(dxAGWo!mq_uM<xBGIHH70Gh}iZV%^3s6D;)@ajv#@glM;;1-x zbcKJ!Z)Za3sf7PbN2(J{{lp7mtgx(y_Be5KQ!YbaNlW>rUHy+B*i4M6<6+_7HUNs$ z1x;3bdAQ@!a_!`4>DD57Azga8wiadeyDW91%`b^8MHNv>S%ptJtn4`~=MG+~CVA9@ z<lgBryUC@plHeHxWqu{~4Yt%ZphSdbC=u#c-(3t9d!tMJuke*g7Z%4Xu8n|M%;&`< zO9FrEBP2)MrTSHfOK|ory~3lB>#Y|k5D15Bw%IV}Ibv@}I9|$Wnh3AtiwX9<5XWe> z!>~kNgkAuWt+aQS8({euOTdUB(yLZl>*M^0BD1W>H?GjA2cVKZmLAk!vlo8q1xqEe z07N1KQpwXLpYKctPphm3rU2n$`PvDHlQXvzq+>ZM@2YC9CJ5aoLQ~xX)De)Jiy&bS z1YI8!RE(I1u`PmxO9ZJ-d&Z3*O7z_P4GlKwaJVFWuhp7X)CmRFqM$~e?|NbtXyY@e z)_A@Eayd(e$w+|;P0*jDZA?AvJ`8iV>YwuBzD6-<R;i`3MN{|`7Z}Py(_4Cn`o;~W zCy_E?DZOgDPHTx{D$TjG2&lAm{ZzEM3B+N8DA%uC%)KB5)NAn}iEX`2A@eCnHbysr zOo6danglxnxzZ%LKy$f%+2gr91TOSxOi1}p@@pace*NNGC#$ZUzc*@Pz<`)sU+%f* zyF;tu^d3JX#hX-WukSk%gEF{}pN{xUKw^%}G_|s(h{7R#00~?s5|!i}p=mueM<^j~ zZ$udv$`AF1+vWqgB<}7Bx6CIJ-<2oPZt_r~VI*2*5F=>dZwoIN?(64YTqA}4uh_lx zfj4{ViUU@ATfKFKgZKtbrL8Hq=B#de_FY37E(q66jX(dF`0(7h_(ge*bxjgdLgnQ{ zHucFp6x-HBX(g9x$>}iC@cjwJy+nMa<X?6Mn=rQ|mAJRI-;x@Kv#MIttJxlKAtY>O z$-I^tvbx$?1FE;x8c;A`s;89@h?F&;_bh8b-Lncp)9bMKggqx`r4siCx(m#bda93d z>dZ*b3y~GB5r^Xu1p>UTE!5=g)(kAO2-eBE8i6nwTV|^21rSZ{dPKg|eapGUvn$rG z=N*F`KM4ttWQrJ;+Hp@r6zWQIx00v+PXMMrJYep{TBKCLZ|Jusf4O@m$xj}Fm?pv| zsC!i@XtwtrN;HwBV1P)`)kANAOhoc=5BbJ}7@eTus;(-j5zG12pPo&J={Z6Q;9~;x zxaMc`!d1CN^MXo-jKaes#)^^>g!;@%S=rJ-{OUwQm_b;olVY;U!qHAV8;I5GNS>cH zl3g`NgvZxUHOv;WB-^SHSh^aeq^dCxpco>qQGs=|Qgdn6m?#|jQPod7Tm?z}HwG(H zqe2NW=#?T;rNr*>R#+v(ut~I&t)NPXIhh2VY6Vq73~ChI=P8(Ng;hcfn?ze}1yzDt zV+}+V59-BQAib;?qmh?>y%-g|a8&V-UFIbfAsm~k=y^_XYd$q%>0qxV6Y}Yn>4Gtq zreKt!KL?{qALLDxXaKmWLF39q$3%iGm*7FY4d{vmv1r`&&u7jgl#FzIVIgn4a4IYe zrVVnSRp*3cKkGnLj%SUMuaR~8(HFS7MUr68tc(cPL$YE|@Pv5jhYv@2EG&yUnr~~z zv*kSTXkjjD_%A|USh$Hg+HqcTemDyY&!>3S7|B|0o4TPR#4|3*m16dDTFNx<!mtw$ zATx9qg+#fxaFl}vlL{BWs{OKtpwOC6bA>aNu41*NNmEMK%C(pQQmtoE#O&33Wes&I zkIBZO^jBhm(m;AZ+%7C^@DsGHR&eLLVq0k`=M|l;0`Yql%k_6*BDyt=39*RU27g0h zytONXQ@KT-YwzFeMcFnrmp@yS>BYFLhtN|v>zJFBVhc0NvN+lcUzmL&;7qP;5@}~! ztf}5?LSd1gZv|7R{S#n9x@NzJ{0c2vvdqtJtxVo=*NlmS!MOcSE(mXYEKwA=$;!lC zGtuhD+oZrX37d5I0s6r7)cZ4m$_b##`}R#|0&y>0glXTcm7kn3b)P0nAX-i$+tJc8 z6eFz|#!=&|rhr)m!-q(omhu$W%-H4_C0rIsToiD83_t>$@{|7m`)?Pp|CZNQ<{msY z|LgbPqU)vQ&R&(cScF!Qr-VD(O^%7nh9yWYG5V0=m=s?zau)mTH36B%!X}6!RhCUR z2|C_hL+)|>y2XO_XMF|U9WB=IKPp8cec*X)UhUMx(0B`|WTElgQTVxI{OibwKi@bR z#z7RuA8#cQQ709>=!<du-Py7bradt;WRrw{*#JY+of|G(bM8}*mx=&I8~Xv)Z)7Z$ z4fPa;iK?*MZJZqvF{!yfw7u*deP^p-&oZ3wO<oyb%F)yj3U~_#HzIpDgk5fFzL@o> z+xJX$45Vxl)VE4ok^?&(Z-)IRYe@DUJ<_j+J6ik&nlmp|Wnp~^nBPm^(nMidce9?a zFUdwg;mCxnwM0C$##^W=S82T2+wbbEubj3`&t$Ackys0*>d(hoq-#jFXa1Qf2_^$z z;E@puBnE&jnGmE!lUyGktA4T!h#E=mE9rT~>I5CnTF&Y(DiFlpSv5dNu=FQrlLY_# ztfjj24(isQU}RhAFT*Cw+**;1vZ?|zKX$%F&KFKYQJ5S5=$(+plG+gkxqd6F`w-Rn z9V6E-+BCAr<Iq|9ZHcg}eCGu>>l*4oKNCX77zSfBP~Dh%Ufh1~1$8pwfbj&P(gw?R z(gzKhK=CGab~-MCo)1#Z`8J|#+Ck$^;Xp-olVos}-<B<3=irb{ut=sgZRVbfDK5Ep z#ov4}#WhqMW4jyo5ht8tnLCm}+**Q-E=@s>1OgW5Dgqr@(h;^aao`>2%croHcQt*T z-pfO{8@<p0{xPAJFCKon`Z}s^yXP9jLVVq{=jXC>OUMO52eZ>Us4yFvRqpCkKMa6W z7kmY@d|kz-#%YKAZb^Ai)0mV<o206cL^fH-(V37;>JHT;<<`?TXY|nqpXcZs%%o4L zNo4lERE|E5n)Is{4w-=&dal*;SW*Sa`^l6L^>Zt9xfNOo5wsiwD$Y?5`4N=Y?kpaY zvv^taY1@dYTG`Fc2*Bbz06}g~vLlR+MmX%x7D;-sMUoyOvao0LUZ|bPXAbI1>;@Zw zv{F0sROk-VM;Zmri=C0Y724=u{rF32Dn9~!V!r;2KD`)ydQb<h@@wHuN|>hG5@YT@ z9ZmBNZ@4Lq!S`pIM;cmDg_<-NRZ56%7@FMw{TDhIzb|tz*5Fj*esBgN33%Z<WEVWt z$1<^R2YWz_iRRiV#?AkwYtLb8PvMi7*9qNnFXj5pQ|0BJ4-=nVuDfo5JnNRgi;j|0 z6u(KvH<R;Hw#NByCQ_+jLn=n-#q2wcAXO)So;tkn@L`jv(8bnXWKdoSj1B$p89;#L zfJkc2#{XcOMW`3a2x66*Coe`@j)1IPTPihKmA#{lsNIc*qU{!3C++zu2+q`=vcZJJ zere%p-nsN0mMcYn%2oTNYn98ZbTMy23ODrA;d}?uB<{Em*<+&m`G5<+zbj-=>6x^2 zs6il9Egh9B^r$3#hwoV#zr2g6Glhd+AsG^{RxW=TgYVKT=iNC4DW)IgCEZY{4N?b0 zJI&$ze#DW|oMN28SdmDmzeRBL8S6s^WINokLXk2>0^4y?rEqe~%qC4L96Cf!qM*nn zv{}X|G_9Y!JfXK#O;_&2Y)7tzEy}Z%BqTtU1HKV9FWWwmeb{lK<;+Rp;0RL-xYZk` zW%bbbMI0}5m~~O+PHkonH7>>1LO1n+LVw?so`p7vVAQ2Q4e|spByNR=b3^oLKRJ?j zG1kd3g_O8|OY=YID*_H6DF)ZZ$Tk-P0Z9zXw;l2*4m%HW?!y^asZ#|C3%|b!2MUKi zN=~w5n<TW>)FKLJEsHFu{&UEJv7${DZgR4q{xez7L*q^-3)ZRUFALFl*R^5X<)tR0 zYrQd_&`|LfN(Z&2VU(gj2SeAkYV4#2U9{pd9nWeUjsw=Nj+L53X78xu#-IP=`R}~b zs;bE4uidh0lguh$(>F_Ad64$08Vyb%9JW-=Xn9hH>RVUlk7?gz{hu!H+B#o9CU7eT zpcVU=^oZuh4~2=#rag6o9?rOKu&E%`4F&~3+zpF{H`!H6(O(R+!dtqll%l^F=04ui zFiO#145P-SVU&`Dk^iFm0a9=eMZ2{dMm4tTCa$3=kR)A0=JK_8{<KqNP1T!IWr7+K zPL&fzm)i#OAG!`+!0IZXvO91D+CR?a!V21f*Gqk5j_dVlu<%XlEw!~ANfTP=PEr^* z3EsW%FzX(iSsR|!;PCulc&0jt@KOKH-H60}EoAd7WvD+{03B2wo;7U3v*x<+TueOo zhi6q2pVhF5{D=z7ydtbcuj*wjDj%nH1DCrs9(#!?{=<Uf&!k^3rbYAs(g`%99;a`C zHF}VsibVv_=kLs|mw0u_hx<;Fyp($)3y?3%w?Pg+k!voC<07<Pnq}oWK7Ac^(hYvU zq`p*D-Y6$>kJZ1ZfhE|R>QyCcd|khFekM8-n^+5OnbR4R@wQdYmpKXfg%?Bpa@(>@ zC*md)UXus6#M^s45rRqQfY^6orKVh|?>bv4bzi!!*|6%{AaY5}IJ2g8KpR6cn1MmE z;}}z_nJgJ><XclT%k78LDt|`wY81UnWaM#j<t<R*hYUp%X0_LV?R*S9+Tsuj+;l_6 zv1T)ekUDwO;u>YH_+}2FvliFD3@l#raomn2Zq4hg&cG&@wn!OdPh4U+=<P18L<DL+ zB9?WWcU1O;yNKSQVJVS2#s3`&_oinWuYodZsFFn2t44DaxynP;9b_vySexma^wA0> zTeEDUb(nC(xCiTe?<krCU6c4nrzg!zq$Ho<LJtZ3H5bv>48I@3E21+Nqp*5ut>3(t zp<1gXk}OY}s5a6Z`O0=aB25u3q$w#P&0aS34lRQ=@J_4mR+rDLuqPcvN;q4AYHI-{ zBnxPfD<s}cr0iCeR5<wk*>0jpALTq(;}KK@j~fElpG~>67u0kSg#Tv|JZ7Bxz^*^j z{(3R(uLrOF^*B9BtMri6{v5kpKiNwQUB)OEMws$%gG2eZ0!sIPl-f0Q=r3dLNsKQ) z2Nh~B>B(H5IJcHfLoL>^+*;|eJfJ>kN!v*p4b)F?X#LPxSrc@eIkb#HuZnScZ<b?& zbLq&$`*h<$8XBqz-mD{}$(yw&W7(Ct^Ae`>8r|2fH+~&2RP&uNdEVosmc<??)fsu5 z^wREeS|!yKQlK|@obD&%o5q?4KxVA@rePF|4Wn3~m&n(ox-@65@+)7HSQ4gHYbg`w zAZeK1`oVAlSi;h-e;XtJDvwiIb$P9}LebW&b1B?KYH87GN{Y0ay*MwE6Val1nZ8F} zrpK(l%@uHmA##SL6mnj5aXGy+J3|VuUjq^O!UqfV(=ns#5GF`mQ6agNl<eQ-R#JK- zYZ=<Vm;5$lhg*>8UC8u%He}nB4>q+xH^%X(B=5CSRq|TpIam{*@LE0Od>gxz%U{MI z%k+tyRUQ+1u~2&j6+pZj?9Tb*d{rf?Ol0)y)tp$vaR!!`WKCiy`hyb-4wo~5)ZPTp z9tUKwZac#Jy&N@%&Ar5EfD8jY)Tg>zU_=-&a8r0XW}eTJpz(#giJvTv6%JiSPNH#7 z^Q!egy+zX>HqT3oA0(?>dM0s%yJC@REUTES4&RB|h417<i1*I|wmN`S#{l~@urHTP za0uWN7A%@|Cg5)iy>u=m3jHT^NZ<rrX54L=XShTkhYQt8(rgCRLt`C90Y6Rr&fg2u zcx%p-><B3IcfQg%{T)%e*;#x%*BSQ_cL|ksO+q|bPnDUio4<Q@+-}4({i@A{+F$Z- zRE6`%$&07&1B^ne!ZP)%y;8h)zZ>2)HHw_hD1id20D5x#FpzfEFc_-$ESg4ExhdNf zA+;;_l+L{ff0?D-6x1itJ&=h`1Ew9FV7rE&%BAsPk~IFAPTV7E_b|xe81)2;$0*7g z4V!qq#WDSz)vhYkUbC707*m5{#iC*A^vB*fBiWrsF>T$b=Z+B_uwW;mJc10kJsY|D z@UfghPB@I?`f;bNT69E_9H&PN)LqQq0wV&Q9uXd=M+E)9l^zjq&sUGAgWB}SgO=ES zw#f8|GS63!XzZIF(L>`Ar$_XheFiIY7SlY~Aw15Fs7DPczm8z!D@A{?Yp=HrMk#3+ z4XQLArNl4@-2e%Q(jtix6Qog(o7hD%nKD;<N5Ilz7bz*Si|j@2-nG9we|N7+<B!{h zimjdGO7qIN=JVRAob$32slZ=Bl1i6&r_#GNf%oYN_*9MhK*hTqX1lJ{nG7k+K0Sd! z@MktMD-6jAXgc;R%PLSs%c<=&irx}5y=Chsbg@`a@A>fjy1B0ZC-*Tp*Irl8G0u&~ za3_I_-F=A+(UOT^&#_!P2K26{A*fn2B@P=sniE8i_oY|yrT=wr;n6R4adnj3>4D~_ zfngPskLlS2nP_W6HoBh6#-=&pD04!p3+*0!?FOX;#8I$2uW43wpAbb$Lt_reOT{KY zUIYPRcuv$BITs8d28#jujWm00tynv`_VL<R-`sV~f15;AEe)AxJCbbVtZ-0sP)gRa z>z~&cPs-RPVA~R4j?gVxgho@#W~9#dfJjoMo=s~KrRXo#Nb0aOj8YOXD7n+TdL^gF zG`Ldq7o%L|Ee)d-{lzd3@Ro*AivD64TVJLWs#5e9V1nyGmIUTRtb6^Qg28>&+ZoB+ zsR)bZ5>J)PosDzpHo|pJXI?h42BTUxR9f#xsy$P*J5LC^g~mbEGjK}iiJUFA7G_5# zqx=QkpXK9k=bu?q9SHXc{o?a9@#UZRek9#J!j_Bsskk2)0jN{o+dF6<=l;4Izo$?I zGRD|O9Or+|fy(`jr)#{U!mfbN;bUZ+7_w7;T&c5Bc3(?fg#h=pR6XfWWUcBKER*iq zRFF~7u!3z;*QSmaYX3I`2)n-~#-B7}wyUbNGWd+cCE_U$yE)E1DiUu7*|B{1;(|N= zX)F)ZBoZwISWX|J0^Szg+t2WpVS#oR4*hokJY4$j4GC?^rKto**`s_5s^z8*iEj#8 z2@$kw$7k8AWoM;+<@#Ue3!i0AhF0EK?-=5emm3S8U6b|9`(;DxjcvStet604T<l@E ztL{A<5GW1vqBafl!a0S*=BZK6037b;$a8VHu5F|vz_cF)E*$*2SIOh-)8z|~dPBq1 zZj~bb>wV+%gSSoJIyqC&IziQ$I5oe^8l=35mb^;Su0x{S)E)aKXP%cVH{1A!*y&S! z7OP#plNGQAA%>Rsnc^p{@aXQJ+To@F_qMNVU8|(~((pf3c$5`RR|I(b($G&O(Ct%p zC6&D|kqxL59%|dSV_kd@{w|(a!K8{o7{i83<7XipIzD4`pq=<2$Op6nS^xNsV^5t1 zpK^4UWWWtc#K(qXbt>_&mAHMWd_eZ4IM7i+1$k!Zt5zCvzC^e6dB_ascHK@ex8$!; zIIUz_^~?M-CxCI=z5P5TwtG)11Jw45;0#1B@g>(NG&^GIwtGu@11#E&l~ick)mp(b zqIk-%a!r69IzT&$8sSpUmz9@we<$MYawJR>mc=gFjYMb`9#+EX&dR$o#^{#07g~P1 zG|xO0Jh}xsqSd22+W70dnxCqgnzbVdQ7>=Faly;_0tDX!>u&rGWqICr5#fyboNzla zKW4<h6RE;D23%Ve`;s>kl#F>{gamS~p){N5HhbCaezUA_T<r5c3tQ$&^;APai^4x_ z-J`XoZ`PmU<7=+bm6HgpYO<y1iMVe->Us?x{H7d&X|$#X4A~|Otc050OJVifl!n8i zNyhGNH*{9^XLfPM)v)Ia7i8f2Ot$}DY}-q?pM?T_G<1s5*K3#7R*93k;84}KW>zw< zN|rPGwvyZy_k9aPL=GnIw!p17C&;AhD%{zU)!m^b_0m@LdZ9MPyym#P%%!xMS6;C1 z0|&yvpCA`TK>cRU{pOwsL>%olTNb(T1lpB7*yLXQLeU(^+%1-KCV&<n>Udk~g`~Mc zZB6yHN{zD$oZ#%r$i1IJF837~xetU~gz`lYsc#srlBSqozH3sx^Yd6H&bzpjyIi@# zmz6twc~03vn4O((6xma3ENPm|?ok`9MG(YHjTq)`eKZB~URKFbcQMA7@>w0qNVM@= zsJ#hz-exhgiV?mpuC{>r4^o@u(J?D}&du|5uHoC1X_xK@w<j;#z%l!KTk<v0Y8rF7 z#g<%GdM)JB8H-e*sa|Em_MZ;VZ}5&}y8Ax#qCZ`jp=WMPtLinBJ9Dq>3x^~m5)-fn z%z?d`THqA{Oq(Bq%a|J;4|?H4nM3vuNsYRP(d6s9C9^)e_;nTuQ(djQ&@)elnsoBE zUGeMNgPEe_&ah|be)?8D?(YyaX}ZRfYm(q^V=7}6JK2yoR$YK@+ZLrg<Ra!4%U5kS zZVg!}=Z5WnvZl4pA&hTlV#-6H{*R}ULv%1gX=hQ4Ty`-8{Va&;H*Y1pXn*zrH{Exe zDpe=Cre#xL=5v9m`UGP;Qwvny_;yBWkOX!o)~FaUdW;{5T9scsM!Ks^NqpADJ@|KB z7o>quUfxV`N`TX2+?vTfYBoF&|0N(=&{?=bIBCk~l+aJk=z)~CX9`!w)EC<RsjRj) z?Tb&=cW!;avG@PT6&d3FN}A+^dFGbYaDKFH#mg!3`NvLBGHp(>US&1WZd6uPhs6+X z<tbrQy2^uPUtJX(<^)Eg{p0M&L8z3eEylRjG9d1<-<h4#H^XtxqO(PYJ7%tG&-p<* z!7d1XHHuT;<r-x@`}!6*Bv!gqq%3uY0)LCrYJ89+E2V|pYg>x7m-#GZnwwdtsyssj zMb>E}qZ@}CcS?6s^ar=EK?~w>vFNp;Y8@fNjh=wMc5-0-bk1h$F{`h3vS4p}>6g8B zF&iB{=e`*?_ob6(Ht3OYsgYIasuS*j4*-2EiOY=9%Dm_^i10TuiF-e((ur*s;JQj% z0@&OD3Y~&l)Bv=;f9-R_lMi_QD`OokIYAShbu(ccnuxi8lAI{i9(Hj11PA<N1n)0x zhNHS{dvf}^7KuWX6`g2A?*|Eh`}o=wA8zQIy}~{{*L;NheP?DA#Yw$RXywku!L8e# zT9SKxazi0d<n49+x9>}*=sj$1XXDs)=2QEBAXD+!#r;!wBqrLl?;nNk+kq6d%a%l; zg`PZkrk04*mP-e7=hfP~;5Z@gQ^BNpfMVvL&UM11%Knkf$<p@(&O+8;7Fm3sI?X!8 zu~wj|u>)(4yy0xsSB0z=)o1b3!{$w)5g5s%+=kC<URN_r(SK(-nT~x*{&kPZaGMk; zeNojfn9zm(Wz%&wVl`?Qc$jhz1Xk;TKNPxci1X;Qsz2Ocd0}dKu6w6v^yQL&Vp%co zzT7Jrn%T<Beb8br0{An(?pP$zBC=L^*sq*N$$?nChyD`~_i5W5=D1|Fh_o9vLy<#< zjO5yEu6O!X<z+t?m_+jOtjLBdYE5HaFUvGme2Le?hIY7K&Sls|!owgjgXkgHe4)i% z%>hG27}N+HjaW@=^LGv9psu7=TKYq!tGofBG&3Od09W)Q146vi-jZSj{6*tsk`l!W z3qvH(Z#((XpKWUE1r6g;BO)+Dl~JhKc^RrPTm;jLX?i{)9P|bi9I^!TdFxjO5BrRa z4-KZW(jRq6WL=?+D$!xSbqv17J5e#4kj+K$p6clzl5Bg5?IOobDQ@|IO<XtMu<>=@ z7b<TqHY6?=#K3PADIYpF6W#z19PfMwIiK&;QqKn?_VDdh-=EC~&)u$=!-d)}Gu=^Q zL}JikAu6se3sE74$bzIs$%P92NK6*(S9kBag}gil;27jbe|96HUQ8VIAUXx)-1h#N zG$CTB^wQq~E7blj2~15YRNtMu-ru2WIHKhI_2t|>mo`7vIFcw;8|=9IHK9IzYT+JR zzNjQBq@!|q<Hr%b#=&F}(q}Gjyj|(<we;96No9kU#LZ-wnL<;)Id}cmMGCxF1*AJQ z+EByh$IL2lCGhvW_FPam=K-60QPdeIw6DR<##i{~oMlDQ-9H@KtxhshFQcpF`NlBj zn56D3qY<t_yL+{nDJb>}>ODU{v}1#XM*S&@N*GS5Cy^;VH-DrJ@$Q^`;PxDtg|<GD z-|<xaiOp~~PT<IgkRah2nb4?eHO=nwZvM$(T4DoOZ4*!+&^jQ@1PGGyDt+oKJ&8c? zB7?C?(VyQCq|^#;+CG}95QS;+MKQdeEZwdkB)YCXow2zGNs|zqxG`&r*9-$7IqTP+ zp-<T8LvZdB6--4%C6w(8A%%q#Br;+5^WzN2elsBZ4aTgn{zB~_nUv{w^C<_;WDL=g zPX1x3WlU<%KR(=<7g}rDT6;d_5%;r}?~Thh#u*5XaymOM=aP<>;;Oz9+P96}v?>@j zZ=ZQ1`=<wuI7m^$7|B~rm=o=avX1B0Ba)tIJ{ahsOlU`-XIljKmDUT1&aZ#!ZV~RN z2v}o=_*R~i7qynlkZeCUtdG-_&>NDDr5u9I|G`B2S#7HF@uIDk>NiqoZ$J0wcPek7 zqr#PTD&;m=$V2G#$r#HXY|kDf8@tr9**j`2jkM|uIi1ZLeAQQovi{>@DeB#7#BnNp z7^i{9(n>zfz7f=$F+8612662f>S2p48WSUlLDH`*MvC7yQdL%OVPOIj-qj6}@mG^* zu@lRF8xEejR<RURuY@HH)zYnkf`C@2{)9+b<Le_PcxhZo!854Z>>vXHD>@>3uv}A; z?i^%n3<_<_mzUfJo)```=adGaWe{&Qq=RHMpKm3O`-zeu$A|Orcs$y?Kf+UXA6H3I ztgDS&FPftGatvErqn;D0%I~rVYM9|+PkYV?a@EQ-Yn@@X5koi5mbrmA)It;6@s!Yx za%Q*Zi~!$SLs|Sw*D#i-VJr(ziEr#|QUma<HH@{_Fy2wI4c-BUiUJj~IW?XoNGfo= z6blo#t649P0Nq;icx%n|k*Rj5sWzyUDoJgCRi)}L^fbHw2_R%~Aj<tJTC<cjdY^o9 zcrjaljewvi1ZvQ@hIM~*5E)DJl(G~eCGV#kO0z7IIK#sXEZD)JBV26Gw|_;E^W2a+ z;65E<5GBEuY{(CYWn@b!lwVzuU#I+<%1iXqU+HaLEy(`krP)`5QGQSNCZ5|D?u+a( zYDO(K-xgd6T*vu55<6<UI=9Sm5>LTHt-j?i1@FcI0PPF7)~4D<56l{gm}Rcdv}!LU zSz{WH0R&MT!Bry@Y#Q@yV)GjS<07L9_P~{arTn>w9^0JgpU)sVvxm)pI}Bavj}#&* zGGs_E>WP1<C*(#W!5TB>=K}J^j+d}P$)iJ<xd<&m&%;t1y;i#a%*q1-pjBf_oi<kt z1O~?bla%{pP4MPF?&B%pKR#iI;;<%N4I?hrPAVdAK^B8dTY+I;ZfD7IFD_rE(~y=A zTTs@-!4RoR>G&x3KT!G+iH+~_OB>s<{=$$k^*vyw+W=@!0*AdhF#T2<KHzQHE`@k3 z6KtsYuc&M9hVfN6CFkT_z}jn`kYW2QI9UBPf4y;(r<mBYHsJM6RN_$EnU@8b)%lTB z1Dbc7i+Xiil6qY}eLuwL5Yz&{?X<i6B>DdbecR?fE7!Gkum+0I=jJ%`|0H@{pPPn= zaeuWy(Y;9G0_{raM~Wtw7ViUJfX4i(o$N%xyxc~z!;!bXi#1;JW`Tn=5@Z`{(&v~z z2)iP!6r(q(GFJKEnU$xhhRgwE8_SD}`bCXd_gKhs7c$2sv_blNW3^|-CBwx>dchLO zu${T^day{#`pLAWOwn*_ilV0PP*qA1Z6>Px6O+DYS$=V-ofWl~54Dnd@ym@wJ7Qdn zscpUxcnU#)@uu-7R<Yr*x*W?u;DbAKJZ)6?8V|IR2)CV0W6UyiQN=TNdrp^1iU@Sv z+|BduEjO&+^L%B_a!oAodx;BlZ@qfsaWB72%5sDc<|_K$?^wr-HpR!vo`fRqg?$p% zv7;SVB9<Fgxz(~X{|SJ|LPed<Sk%=X8*dZASpTGz_=t!wjclSY8EHOV-3J=YNF7gH z0P&~>9U3QSjqQzFNRe8cOh6qIl$4s$UEAnu40x!41k~pQr3uYLy}EI^prC00YhKIS z{cp542?bzSS|f?#Ur=!zt)ciOjX&Up(z7lmf2YTUGA!D*lD_{+-oL_rU6nW+l%z}F z*b=38<_!L|2ETEc(pzxNw3cyI_6lq=8f`A@llx=W$~O9xOSiFB=jb~DjBI(Rlcyx( zusqmG)Tad`Ms;e`#Tq5uizO9LO_Q!4-2l1NDs4`yi{M`Fy0xYaJNn*raZx!%mvd8M z-Yz<sgBZV3shBPvFpFKQDWh->YhMdF3rfYVR&9f4MvBcXHU(x*$4@5o;rWK<MLNQV z>iPKGl8fjaO~m)QqX<fH*GCz@tt})xhJ;AzE9775Wt4eIc>;2qu;pc6jP}`_R?$p# z5*U0riaAY#lOUXlN@za}g)5hd6^#{g3y)HhJU~LTG*s4By(oy2_6UTUJji?=*%s8N zl2AV6-Be{_K)fLk$k%wZ^?OZtf4nqmr{&UBjch)DX^^!k55z9jUsaK08h;y4k;ZrN zILXgT+NcSe;HKh>uABPZ&$aGn!2Rr$<P?)5y|5sIB$Zq*Az;!2y{tAbwOm(0oe_oc zj1JucQ4|WvGF@fHkGkYU6^6?u!6j2J_1)mUOr{LiZ{xX<DHC?+%XyJ8b!J2=TmhRC zij4d@a4O`itXRN)J&ovTKz+$DcO0?qwk`|r*4NiY`M$4*6@u?Ud`G)B_+DiN;ND%Y zrZ7VIlYZp7K`YIYaO+heG}*85e30nb*s)jYHw8kAjj4=nDo7}&qEi?z4THYljV^d= z8I?=alTBJE>skeIf(@3J7K^?+qeMDwv7f}WwJiI>HW*teDhiobOSPmIstvwsRnZp| zF(Rs}##-g%skU}`nG>e{2cnyew2}45Rv2ZCscmd+Y|&akO+kO#C&7zHfbqLd5TY%o zmJJ-#I2+lQvwLF-fw*Tc))#@{K0~oIG<eZ81Pr^LGX{F>BKZ(#7!J$QzIa*MJ%^u; z?jh)XCzf~X;`9rdMP6=2(8Wemsg8@Lwczoy7sNW05j;Zlr7e)H!_9$k+;U9HytuYX zrkjJkyv;xJtmMH~a05IgbRm0E$c{T4iB1dRSWct`iDYaAI5(?~i3+)M#wD=hAzNJH zee$|B#fR@=s7-cM7+S!RwM|s>uzQ?QIoWlheyqy^@JYO3sOK()BA$dq{WUF!Z_@cC z-0GZ}@gzAAq91D63HqJVale>n-<+y+)yUnt5qk2elV$7Fa+xn*Z_y|kIndqsS>Qwq z<f;`e=%Rd^tRb}817IyL=Z2K=AkX&kXHC#YcyU+q8HoSzojpU0K+9~7=zV%t=;cSV zu~<%xMQ$z27>lI(vFIqUBOMM~;ZY`K7c_Rm`n}za&#({{qg503d?2my9u`0flNFt| z7~YpDTZ*sP*CtM1hTwf{TC>t&Z_oA9RiU5W)3r{I?OPts=Pc=lq5NH2UEiv+zD9-m zYrfngiB{H8j|l{l^^@$erjI?iC{|fidu9{u=)qLRFy%zOnXuaI=-Mdb5-^d70?HEu z{;cs)KQ9H$t!hC5zgUfGyxdyj1_<9AGBdky@P+B&b&66Ftu_6^68G!A%CwP4s~st$ z)4AV123i?0Eq}=3afK&FaJ;HK{h4z3gHY&r)v%CmE!QHk7GBC&4&2nOIS-?wNHS)l zeQ(jG4u*p0@%6aq)$-E3>Tv^3Hsj95P2C>1#Za1;DKu(PuvXr)-G{)=i>9`ofQ6_W zH!6FjO=dMD_etPp<HKuJNYWx;mb;OIbLAm%xK%&m@LuRMXclM0-2a^lg1%g4C*LcA z{W+gjcu4WhiymaQKoqWC7V|1Gs}e>}C@xYJtSXq=$-KDgf<MyeUzkQO&uc_MK;aVO zCK9q&1r9Cs$6bu57pNM+d}9Lwo$uED9$dSJ{ZutAo7m>(8vjH96|CCVQ5i^SpmA)R z-oj^dowbuC#=Au!jj<C^+bG%a_VYMkT6H-~&i944oR{O{1)@QauFKE{t5B=I<}1|$ zD?FhGV?1ew`V(U4O#v2ay4ejJCxn1M-#~TFmw6R4^y?O|?~0h|yYtr&D@&t0AzMfy zkic(OT+T&>7z^a<PkY$rPsI2IVA~{4Gx-YM5-PYD&3>P+##hVmTBUZ)d}Qb`u*>HV zApGfY?C;`w;(n0o@1lC*m98h`Z_{6*C;oz0aZ10nlbSKwdg7%NPV|J3wDp85Ui3X7 z5bFs&xSogs+I!+igz+NgSoMUep(pIe`AvOKh-rzQ(Cbn;7q_?56w+d6<AKmQavJX= zh<}TkIIg!z|Dj@MS!uFy3kvdgHm?b4tB5qEtaxN}XY<dqU1jr+Jqsntg^_o$MD|@Z zL3qN9>ko|~EtqiwahfyZ2IB-go?19+&twFQ@==X&Bj*V<+d0a~^^2$O#w#y#JuAOa zPHJ@k&2=S-Di$Ip2FqRZtD;VW(B$BFN#~oKOdNOH#7Y+yvzYo*`l>(EVj?wKy|Ahs z!Zf)^3>I%rFR>*L3N^HJeSWUH@s7OhG3Y3Wm*$5{Ip^4xOKk#TY0-og!U;+iQ$fY< z5c65h?@44z*ZRzy$~A3yfP;l?kt$V??a}6ytr|p2e{89Ux&PU$KTSYZqwZ!{__H<w z3kzECUo=OY(QKdSy-1!03_Xqo{e{m$jd)BTs`ZnbQ;|+8h%?Ro-0vscehVT@aIjO2 z{qS>XSk%>ljEfMs7)R8&htAfxC^OwS2H0MU2Xs#MQQpUCnnunz{Xdpyx5VoE9NR8} zUR}=!!ch=w^I&h|KS$cxL<qU$;Qe#qYN+A4lDM~VRgyG6DhdlZpL$XH;hRO=_;YQY z_2_eH!d?>zM$sszVZ-wnhfc%uxSb?(Ds1mkS&{YVZu*>cd!#X#aSI1u^G`0GOdH!H zZu2g4CG}m{k0YH2o?l+Z%y$}mmOY}xn|A4D&F$7|f&Y#w9c0>B^(D2;m=qe@u$?r@ zCPgC_`edQ@bLd%D-L)CCTxu6ww}%CMITO}wTE*M667^Jq6WZ3hA+xyC%s6gr$Xaky zE287g>o2-!f(8xk=!6+_PY8p!bk3IHWiH$*^@fjY6#6%AFBk54qODb*ZG2a9;5fVf z-I?^g$toAxs{`7QQdUJqK)AFkySCqGY^X<rNJYc+_eecQo!c(D&T}AcZ_L*7Y>c%7 z!=q^CN#i{h4(k^#e&=RNQ<vMLb>{}coV+9H+MYjcTnR-rb4O-hF*f`DtIR$w84tdL z7coAIn0@n)RY`2K@M8aWawiSmZ^Ho4o&7R6i!K7W7c<BtcANQ(pde0vK1GUZ$2L}f zga+x-rad|zGt`^R$tQERC3A?AiOUq@9G#%>nEFX&Mt5~=1AZvv42a9UMk<!_V4{_a z;gHTPKUA(gV>%Lco2>}BMssxq#;AA9T9|SlTF|>;1-g351E6hCIdyY-kY7TblsbG| zIPB`-cHl1i%9NE=0HHmUdxgLx8f+|jX#%d=N7gi`mLF8VJ~GTde|LX~oO-)ebi7&x zLX)_ET}ZqVOtN`}MXS(V&El(+lbC7=l3AJ;TA^&s$}i2U3L{(Sxy8*nI0qEF%UJ=$ zn9H(+i0XIu)Ec?+ZG30TLd|a8#;pN~qFv`G+O>JnEy<!>O4?TKmQ-186^rUUvvKya zXFlIr)H<>7k<Y+rZ9~H*`gl*>JYGj}lE99zG_fo@p0~KTi!6IDFCTFuv%+UdOTho# z{c#DT#GPZUywn%2zKMcpWx2P88zFL3J+aM>T@ncj-VzDi<x~IIY5HURtKGFHa(Gno zR~!>+@^)`KDp@Gs`9*+tPc7!SRSp5J&Cd4gGgh>Kk5~MASCbBI{X1(1(%9auWt{;r ztlX}qq8=vMe@U3}1WdA{5-@fFS_GErk|fkNnqa#MV?X}x-)~)Su8LyYPq><=#D2nq zyfV}8<cGG0Q`K&vSyrWGwC#8q&X4GgD|t$?Pib0!rC1cOPq?PH8sdBcNN;1aKs^A8 zn{h5lutVvRjxvs&;X_C!`56$^UK%E#+IkSwEGRYKL4~0ZK|%Kzy0?YwM1UK89OzLD z(e{q23DtYb%Wy_*PdZ(p1ebaA9gcCQjR2ZN_HAq9dvnA9Q0b&^bIT`>1K3Ld3l#?s z^vsXPJjb=9-YL(oKfn+7piwOmx?cM^f(s8<KP8x;Dnm0?)|48xYH@>CU(kBeMQBXP zQAp2Ncm?Mq%u|Skh*Pgh0sZl~;GQ}jcRthzt<lUXZ-#BaP_NW+sU)@NP_*ad$q`16 zty9jLMc%cp(Uk*n3A!S;-G?9&;u)$)^iW|zPF8VjvJ6_yJWU@aYhFy#$$pBrgfQL9 zPpmMY>36UbUo{*qtL~z>P?2_fA=+W76A%$B3RD9JCykRyn4w&Au{r9Za;6wC2)WfA z)uS`{RYO9$uf)_u0=;rPZkGjC%<{P1ajaq`8h?@Cye+E16{wfpevWp@Bu2XIG0+eo zyzE90<4p?<izX^YP<&;i$)dY5a;$dB>$5C~@eG<Ry!41Mz*in^x%?`rt&}Zl%zJtD z<hyGi<E{`n^~J62a7t>!C+*OJ&lE;0zN_2el+@g9I^>ks&>5``w^WV={hS4(Dg$$( zj(cIo7s{nL&>mb?=ZFqk)%J_N3N4#_q-qtWB+RuZv+YrTy`hEL^iv`+9h~4*6uMtG z4HS778KS3%L==ObC~4#snGvqimZv~=aF5(@AAU6FtYv!4ZQmfB8TxVty!x!OnfFiT zmsS!d_a|hlO#sHk?#eQXdUYOQIW`w!q<*(9Y!ev`Zp3*naVgJhCE#-LlCxkwNp&=% zV*X>Dop((mDgM^6OF}(VrZ1;~Q`(Z+ABA&#Ct5qTB53SljQ||ArTF6%AQ`i58H-RM z+N$>Jwy)}!)nOl0)9)=gI$Wr`u-Ra1{FWD?rzy%*72w^gqC$1O8WEGv=ZBlsWUYLH zBA&g4g?Xzo=H&K{ymimMh*u+cC_ERvsqIy3lq^#`KwPbE*9OjE5#+8%fe(`|nbweI zS-9Opn$;x<3o}UJ;2-lQq+ae4v&em!IhsX2;c65>YmJuGTBCR*iFDf_x5w47Tv_N_ zC09xA*RNuHw1Foq8nUkw-~$xELVWd%7HgBt2H5iI4&K<C_iw&86pG8v-V3E(_u1Hv z#9DLu>9#PdO@h9MsUUgOVE&n^$Tq`nD^H1$yrK-qbia&bAE{kVB(mo9c3oL^9X1jp zu#^B`X<8z%z;7gCCld!ke1Qa-61%s!AcHttu?8=2u?Cl;v!<Y-qv?Djz5*X@5a=pz z3qmmkYo;K_2Z*@+>Q~vaAOK@Ys$#2I8j_~O=A>`uctl%dQ)YmfO&LMPhGiD0Q`)}4 zwe?_KW`U|LVktz}KW?9O(%x!5MBrMV=i>vyP;sd(kpW+})Hp04^h|x_wDoQ{ZWgi4 z-2=H(EgLb$N*#|mgVS;J1j-=8JJaoMfE?Q_3}Xy4Pr5|06bc5QCtR=JFf?%Bhcgg% z&Rvs&8?FxxWFU|3pgJYBnhertye6uOv2wQ1hnR)Tm&u@qnQt=^EY`vLBjUMZPQ*4_ zKJIMDlJ-P{X~`lV0?W0cv>_A*gR{zqd0nNLZb@^R%Gu`#|6Y=v^K`E{PjLu4LH0H~ zRu(hMUOtP#zk!{cN<Trd!b95c|0}wYoN(vV$CSg`wE0`V*BRiglQ&Z!Rp67>KqCH; zsnxtS%vkl^v~AG&o{E0aT0CAd@(rr)#$B;%XpaO77?W>cCa9ppV2;~}ie3q5Hqb7M zL3O3(Wte$jjj0IOvg=E_cDr5`P@rXArk5v_U$2vMI9_vowl;sS%d8zSHdNm2VXJy& z#r|=(VmJ3s(L0_<{w0?@V9@o_9=lxD(<r+$E8Ubp?XlKFx~VAF-bB1ROCsYh>LAyr za~h&ri!Od^yZSmRFJ(~ncg$R(96nye64Ne)>TmK5$Z~r{em!sJ3EL-uXR$!sB=8_D zPfP+Gra!xl)z>|yY3>xD2<J}6eZrp%!n76^Yj}5t-`L}f8ZFecrK201djamKydh(_ zqd$;S<+r)J&51vP(0>Fh#EuB)z*{qLbe<arUm~LP?MsWo706`>=1E;D!(!KfU{_SG zq^ZMl`SDxUZ}Zy&jCF@!tJ-OxsO@>OO3t=I$=d`O2gMf_j=_UevXA$Med%~_?qz`4 zIsqnmggv6NTvy09))QH0w09o`L@vC*7RBOqC*(%q=ISAu_$)Y<$^%13Xorq|E+6Wv z@+8!zeUvX<p@dXs)L>tN6C(Z1H;631QgUR483U3S=AMs-42Eh$N^N$aqwsSLs|(K5 zj^xnW9Wy_cVu+ol$qLgu>nG#Bfta@5gSE5qzFyDmdR0|*8FhSB9i|M|cMs?qjlfu! zYLswf68<K+`x?WO0y*MAq)Xi}phag^9wgb#n0#fP;M8Q(E4|?jb7p67eW>v9(jbh8 zfRC3->DOK9SA;Sl60Uyh$|TMEsa@`oZQ#c+>u%iIN{*T8s@{=PICvMtw=l%ehBo>a z8k%sfyvTSKJH84FHz0&~eva^?KOR35Kd!}(kHwE0@#B;6qs$GD;miIpaF9_pX8mnG z+NFh_K>!k&;~}#Xz15OwvrWh+2&FAw`a0xyg?ya{S?K!!S?+086*3O2Vsff_r>%?p z>d)@p_RktGM-2Y3eKRw~&}66m7xv^rD}o*>9Q-2auvnQD{m4pqXVic4tE961!rzM~ zQ*J6d?H@4&&H>>=I+fDm9C1K4<dYRGic={OS(;apGp{|di<*dAfRq#_lEwxRLgyiN z9$jgmb_x$W8mGRbK}}s8jCsN3?xO=Ocs3c&w@{;|CoCa{)s29A?g$;@%dPoA9!B&l zDAxj_0dF&1NVk?I`?PU|3gP&*oW@t|HCb(8`Eg5glZ6?AnrmT^1*8YW?%0MaSneJW zoBgC24q{SD-?gzu>6iCBzb=wpPtJ;PsrDs7(mE<vs(@u5FZJqdZS#+mfE0wP@giG& z-hGTZiN5K{v>7(C&l*Sl+eA#KJRf3F;|p9x(44c6IT<N0N>(g_*|Ti!)seWJN4IHE zA<|-u6DQx^&^uL-Wt0zn?0BYG&M|4j%OvX&y8kMWJqu>_yxzC*{`dBt((fA(mF(Oe z>I@astEVB6a;MwNCB)=h>hseGwNo+uROX&uCtjdj2Kd#Vo(B`pCI3uvIgvaTo~=<2 z+fIwL*jCbYen7vh+sn(Ft&#GotCi;>!gyXd_yzI<qRp|uj&>{}-(yik(z&q!-;PBM zH!L$Z1`HS8Ah9V3(ZA(cM;yf(u}YlRyMFbqJ~0_#Nw6x4NZUr5>!)6xny(eSo^C&5 zbA}!zBLZU;SPVr(u=3>pRCPD3-+ci0gi93H2dv;>D~PjViTj#1&+b{`Q%|XUaaf-w zOeKn8`bMnLx3qQ0?k5crtXUOk3}s)lQNWhlCN0vmK$-CiFXMbD7hF|UvrA@edtk8o zvAoQeIgR>F>>{nxzjYmGx5lZXov%=FM;xqe>C?ia+U7lE{i-O*_Ix(lV}PE<K9sT) zmlKGj3QXt(bMOC|z|`?79&5^kx`@Ff3T<FPlf+=g)mCgu)Sm+jgXbHlt{_YQUpHS8 z?cCl$yXk3m55qJcav2@H$4lc=?|uJmjguNJ^u(m+9TKY<2L&=^J;B7|Hp5A&L@A{a zUT5vq&;1svgu$6etCt3VTC|iv0yT}3pg+48Q!n_ETq<>|3RcugF4XidX;#mjy0Hl? z?ADCAh-7+S0NC2aG7emDs11oWrfu>2(wS*nJe}EYi?`%!z^82SWIl^$Xn8DAUA-z# z5Q!U>7|-nr?WTe90GwH4JKX$wt{u9oYZGPhdRJ;z$S#B}Vvp@#b?~4l%wM4wj@WE^ z=b9LobItI!1qOV`lu6o}IUX`OchH(?mV3zW%E&j3Nz2WuKV-~WD&ua5QpBmHMX@c| zKC*=*lE8><2#MbK7}-Na%*kn~R5>l3!F1S5!zMh`dcQH}W9{6GamWcTzJvrFiy%!n z3#dkR)Y77istC+){LcKaY({apL*de{A05Lf!%)25Q|D<v@NFVj_8jWbQJqQcmge^w z6Xb-bTz90Xs;$HPaKORaNmzj!?pdd)v{g1v{p9(+#q{!i0j<X6pdtG$s)bH)uA$9+ zKqqOTW;B_q!TF=KGb4ErWbWfq?<tkK?n!6ga-4+Mv?td&1S9_=@p$vkY^Vy`)qNdL z2{+(Ls~i7{keVCtK}&J_p>Y6Tcz4ku*0U!K&~0Q4u-==H7fs!zj4(mWF#HrG6Zy?1 z^gb{@Yg)6y4iazWZd(^E+Y;4T?oB>hg=0>PcJ-VtFaPwQUHGH0FBS4x+@WA1PZD|! z7uKL<^GtX(&Q?!(?MR8<>8QMx1jq1zc}W>^tKYd+l4=}S8Y(r5QNgGhj@FIuU}|>| zkf6sA_sua&(|v0CjNE7<jSUxVgg;bWG1(|A{9A}{X%ANwT894k$h@U_#!)`_x>@~B z_~qYytV<@_Xj;-z`+5s?xL3Ps`#{vugf*eNTpQ~Kmw}Zd5a8X{_#nlS#J5yD6$s8F zY;V%_<rVm&c0F4CK8YiZ=6Pv^XSW&Mv@?y$-vxys|9g3M`4pa_&^~d>ob0Z7<`|EM z4T-bvkZ2svGaD}BsC<Aqa8V8B4}6p8wL|W4ACD_Miblcf_7y=6J*bEs*ZVrENeGLs z*Ki*!Lgm~K3>R?1Jv}va*Bj45D)M*~QZY=3C2jkb%A<kVk;K2sxEHpbtfcxez2~g* zrBbxNFu-jU38@(l6-+Lb83R#edp6q=Mo4Yk#(H4`QsZbp?i<v7X|_L*j6a@#W)(PT zhSDQif+sYC(*sG(;8^MorZb=|lBp!>_$RtS%g9xNA*S^sV$c!QQd=YJAHL|Q+kiGh z`&D>EPen~UA~}3hNQFc}eZ^D*+_Rd>XI4Z7CA4)p)=@aP9hnkW+`;<Wm*#(g{8WMv zXz%W)Y<&B#whR$`NuQ>YcIpz9eW|2DCA}||v`Yo2Qb{F2?N22QE2)x7;-uGb-+@$; zxzoj)<E8QG%1^$BMvDn{=U%1Xu!fc`&8y*tHBLHAQu8%RL?nI7BDnX(NrHpbV{PFC z_2UAvj*UfU73j7p#pI{uQbwCvT>pf#;!Y}x>RA4XgrMKIY<m^lOp%x3RU7MUcIyY- z%fCeWpeqw-!loV}w(M-Em$}r^iMd9wMyBJHj?NwYG=i!r_=Mpv9Q=>GgS_0yKkw`a zB3L`J3Zf2OP3dH^cI18~+|41xQPuBwX!wyae><JF#|Ii$;p1w)BQ9u|Dmcg;CfW+7 z#@|zKlbIofUIs&eQhkj-1S%xKrTa+JC@4wUl{#j)0}6nSj-wCcv5!B_lTq|MJvBZ? z7TDDG_0zq4PNsHxOGV0muUcX^bJ_+isP=XkqsJYi$BohBFxtlGp!P`%2L~vXiEbi7 z$HZ<f6fPiAzfC%HlZI{*bi37oyXn=}c|_aUjiHxku8QAtdbcSmLTi&1R1*Cnv{Mf4 zl%bsh?K=Y67Btq_N`$83sjE0NvkuKH{Dq-DhWr;;7zkTg#+yfL)XYU_<~*7?F1}}9 zv&yTBN7EC9U6PpBd@<DSmUO+tRq}XM`0b0=8q115DQe0qWy;YPffa3@|C(uxA}djN zXh~bsH>_9Ql(7w(o6GoIRn*Sii;F4?UGF4x7U}{<?P^~X#&;|(s%(T2xuI3ic;Cfh zEH5sqY=rThbjZ8TJ@$SH!$Llw^I-3^*(28VRV@kJIo}s}Nvv_>o*O%!Z5~Fh96Kyl z@|)BgHdv!{x&Al)#7NX-Gq-vHa*?)c*5jqT?U5Cw+-6E?+&PkTy~+ZRCT>^w7v4=0 z;OHUCU0l>j0(W;~>2W(&5XR>AD!>pa*<9q&$)=uS6na}+)UgNYmIp0M^XAf`1Tmdf zH)D;gXA@aw!oUh`+D5Us4CbO*MJ$LHT4&QkwLkbU!_GPCzIJ2|-lM%j;h;|0{k9oq zX|Y86o2Cqny5m(P=r2~?GvA@&YowtV9dV``F(bl0bc~-A4E}8)0rkB>!KHG71gxI& zQa(ULBrUnUb|ZsgR-c{5j2TA=oLj<rTBRxV7vVZy9rQ`q8}pB8B8)9Af1aPul#4l- z<dl=y<2GCD)8*!|zwV3b9E_uuua?_X8!h6rhN}u}(|A56fB{1U_f`an*GO}UnP00U z99J&MZo0Qh3lGWscUK3_^puaUX@973JH4o`-d+VBky8}XVD03+0@Wj5&eCHmCR#Um zg>JzRm<xHjp2q`GOvv_gY$g#y)`Xv`f<xuY{*K?|`3k$#MlzO=1*+3Dt+@#VzX<~M z&niG7Xelq(JxUw)lt?q|kX0(wwAtI*1|WA)|E}#-Ky~auU9SY!d{&c5?mfJwgK#*} z>K5B<qux5X@GvXc+ws3sv}6%pCF&mrmy7xuwlqb2>Wcc|Y4qyF;swW`+OvO4b4&C7 z#wt~$kv;S+BJx7;wh%e%Z`@!|oX!kyt<s8C1GGJ~Nl+Iv9+q)cXk;WM%Z2Lc@J>!x zV^xzDuU|y?f+X=<2387sl^-Wmuh7_uguh&<J&%Oe4gsePq}s_hdx7Jk1fER6deN)w zIh(}X^=*k-r*%HOWP-<M>5QaE?3%ydxVh6weNC4H6&8L?B&)7HeY=*2%Q~^80VCx_ z6Uql(AMB2E4cEpLh|fyocO{AZwiFjQ%-;(IP|cA>zH+4&xPj7q$b>j1G2eOdBx(oq ztRzZPt-7X{rgx-BEPQrtb0R+leKvOQdfoZ*tNGT(Q}{`f6`p_DOKlR7SIUlnMl&Ie zGp%nsHDBG#JCJoGIl6B~&3D7-YM$C00AW6?8l1X9r0`E-dXbi7w$?|JG_b}qSdtmv zB~0Uwmj*iJppki`qjBY<`)@sPtGdFWbp)JQS!E=F+y}*FiD_mXjW38QWUXvd9@d{N zhQsNeC_Td5-T3$E66Qlnz|C<t;jB!#%6Ge`EghBfCub+fFNi;InlH34Hs>loc)kVC z7q0Q^7>h0dqhx&;2^I_+Cq6^AfgN1D+pJ2u3v#$umE~G_Su1v)l6sU+nM#TFwjrD1 zR-S<Cjo><BAl~~vRqi5^i<KqfJVsHji$oB{Od*U(NG9<e^%?{(bMRuUu>4BoA)}q$ zcE7|}Tde7qV;RsBS39v817>bs<X#o7Ym@xlH5}5)%V&?8NHPkC)==IWS6EmCi_yM8 zd-mD|8G9{!cP{{YJLcY^bCrA9cIXuqQ@Z^(e1ghFp10?xKS9;}ZIMVpL*UC;iZk#` z6Z}Qv3r;zkC%{voDTbJF*JgOQx3KI+SdeYqu%ZLG0NEL{oAY)a_bk~Q2+!<-5!VXw zSx#1NsbJ4Lx-!BzkjU#<Kffy;4mWmUpJrB=u`X^rg0>9<^zQD)r|Fqk2G9eaXid-@ zh!<Et9TmIr$qsCyiIjxrSem1YFSK#>K%Lm-gfj}(dd0M*`GepP?vBbkU02oC@~*RM z>-}I+p4^<mHr#b=sD46k5<l5E#Xa?nJ$1GjTCm5Yx0+1zkF8R+)m~Z*_c3VcumXV7 z@!NPx=y;V3_Hx2qHz30K$LV-XeK$)cbUdp+cg~3gf(cdW@zO|VM&D#AWnFe%k+L5+ zdh^gNTnp#yuTW2<>__!IJxqhgOQnm%%|x{sZU*G&g=lUm9QDFLm`K!RWj3wY0tl&E zYv``-QNEge6!>HTu5EHvb~pZn(J626gs#=y?90>2&o~zoeb{;hHENsZMo(=cPu-)9 zp9OUbQOLT~k|XQo?U~x(2$X5NCegLmYjPMpI_O(6XjQ4XC3K!#@NlrZ;ci7YBa{#$ z$S60z`)mc}=Cp!;Xn0-0vK3T!tII?%V?``Zjkr}3j0iP0pizh!gHG+}sN7^IY`Bzb z>qU?#JsM(uz~P*48EvaTwP4=T95`QzX670NfoJl&6D;IJph@t%m~Z^T)ScGeK!ZEk zT$<mOW76yQkV9>dga#xbLAc3><TcP+HG$g?j=wjRa4OWEnF<!9h^tZ>ug+x<!?3o< zQ6+_s=n*4e0d$OfDMYO%#Q9LtYX|O*AHiMpN_P@T<-O1l7r=}ExaQIjqsG-3mwOlG z>^Q#zbYBTA>9Vtd#>;H<rAnZmOxj9~4;tcBCS<VQnR%t#H4wsVGMMpO%ME3cA#oXK z9M<qkmw*hD-I8@59}3`uHtzytkvcUNEE(6DmRI|qAKuI;&<pvt5Zc|ZFUY#3VU#xD z(snjqNIz*5YIW%mvt5B;=_-|-awVXpPe@Fv09jMPr5n3<brcr<Ptr0Zxw~-aSILpE zx(=-*F9;h+T@W@RRGl+PfUy(+pSRCMGoFGP7ttdc>L%^he?_$c-->fw4a-wDilNzZ zQ&-{O_gJ8ugR1Mi2W6b!gsT!XU)3I)iiAHU<+>WFpE~o{1NryQzGu4dp?{>|(c8ig zb-TBLsp&iJdZp6!R9Mh`{CcZQPTf{mxSN5|SYaPXNw-bkI(gTd!c$?PLMGMZU;jo* zsxBCo&lf&44!qKRd+H1G)XbN>*Uy|(;rH#o&7;wit3&Cx?$g_KAl2K1y<P9$Zhyb> z-YjaicxtAt@Tdp4ZF&NLAMtNfckJVBT;N~w?R@{l`(_FsS`9qV+rrCy-t_F$^j+^% zt$Hdf{IW+gExs)b`M3A~jNaZJ^6c%VkZ0w7fVakbLWMsgRFe_7-rg6$_g8om|EyAb z`+y2>4;1ac?SQ9<r^3SL1E|q`mw%%}$WuX~fk(Wl$Mgnod8_i)I1zzQkn~ai29J3A zn18F>F*!@9hQNP?e<ZU-j;U>7#yzvajm@tNgNZCTnCnXxP~Wvt#&TQY*j~PTJlCgw zZv13hdFK2W0jmBS2>LS+Y>5#tHJk&%U-_k5+=ANat{4GfW#>SkMPix-wbQv6LGGLg zej)=wcZ{I>oCx|d5L^-?;Hcy|n(*Hk$E{7cG)91X<s1lpH3LCDMvy-zf?G2XToxl> z8F&r~iUC2n`#pL@%o;s$n#JKLO>uSB)N=P|fcsjUc1uV*5vP5h9#!@;aoV1c_CTEW zj*#YNK?X&+TQNUYwi?6T9Mbm1X)g|GV{zJ*A#FHL+ZNKa-QwG^HKbh~r^(Z5_2%QW zt3uk}GxB^{W1HG`GETcXz&#nK^@X$}aoVdw+Wm2wMT-ibt*Pq9gAaJP=DohsPlzUf zn#5oj#P5UzI}Qokek&vp0%8!hbD<(P_=H~y5N1G9WHlt%4QC{bhiW5jQ?BPYM69#O zqVAl3{^+p%ME<}vin+C-6j)-dctROW((bpqs#oT@jJ2YN2>!rQ(3T08@+Ql|*bQha zLu~m&zCKrPv@-M`L^^-J+c8t4VV&mPfLaSpXymyyomOuZrtOK$)m!upCQUe6y;Zb& z+nL!o`*KAkYxUO9B(BBL#L)p`Xncu{TUCu40j#RTzGyqbFFM`o68cIlq^l7nd@bYn zwOk8c(E_3KEwb_g`rkF38k!#YL)>C)9EV%J@bKoI4|Q>{G9$*k+pB2^DUItBh0B|5 z;`L-S9pYJ3_6Pc205TSD!AsN10J}OQRKy);GJd1R1UA9NCp1VHVg?Fb?CQz@r51vK z5lEjSYVTa@5ss1gD-{nwCgv;q^?K5u27sQ0#axpPFWgc}+1>L6dQe$C;2+a{Vk3px zf3o6%Myp9a$W(&6|GYJc`ArzOpvHnPXIPoJ_e<RSmgZ7OvB|i6L+5l~NU_P0!n<=8 z;g4y}>f+}74Y|wrM_1T?3PY>al`zrlZoI)P?m$lHnY&O#nNpwOg%cGQ#rg-~mSer1 z^e5Kq*;s!zMn7!8aLC2}N202u4Xet-SD@dHihb00L`p{Qg@-TWQqz2MCZlnka~%E= z)7|~&BlXMH8~MU#Kd+_ANd3z7zve?6UzA5{<i>i((E6!uH?n^;Oof_GkObB^oJu%G z6O@pl80w83et9E$-PdyqM^9l`I1T801ns`RHK3zKPeP$5qdXHIH8U@IQBAQmYro{r zUi;6Cl-NJ2CBJc&Ko`D`cFyllAxUufI(MUl9%(XrCH$Uk#_$jqF=IrIM0Snt5VIUA zS7|g|cvsN{Oc!~P93-E9T%avF=`9tS_+n+GmLg}=A|>a&7a3YA(QOBb+3&1}X&+=s z*E$$S8*c=y4(bJcSVGxzb?{{bcJ0rU*Nnk<zHlM@P+vN2r{p&-b(H)PoX`{@iVC09 z*H0w5*L@M$syu?$?fClNc-g&S<G=-T;rBD^-r?*1b<n%WE=5*-nKvfOj;123^rG6u zto!*rvsU<|ONBzY0!82T?(xFOI+01%VNx@gn`z{jMntkION)!5#?2>iN)o1663A3W z20r{X^W>;yVm{`_%nPDB+}*Wn%|c7UX22&wkOEdh0Nw*RPxEf)s1EljtKA**qv$K| zT}_OXgj@C=bV1w;G6qIvWhVCvEuu$VCk!d?@_dz4W*qYqe~-r$b$emqhtVnO$u#3W zMImHBI#z!;%_j6~J75#GpEwaHVp5(ceCT<mn!-2-nOLu0fF3NvQB7VStCHq|6wFv8 zX-P@==8z-Rb(cagTJz{f<u%`y(UV(jmvW+&sWbX~TN=+{L$b7WzAeXUSA(aYYYjp| z4UIn~Fvq^F+|Jm~00Lvz_|f0F8S5@=4UFZWiRUesiJv!X*QjYT)++BgvsOqpWv!b0 zoLMU*V(lNp+8}w7_0rPNY&>ehxRXo0jPgP$tWq!`+b!m;n{8&U4FwZ=_^Febuon=b z;C83nR3pTu=s&rBfdhDGDvaJa#@J>8BiuF;?UP{{Bc(el<{5006ij`9LafkK1U5cG z@o#vF`Kz7nz#_)<MB$U{;&!n+T{i=c0e$ln13a_(p@3LoTlgfZ0nhWK`+figcTcgq zotqDv+navc;ny1PLSJUqkTFv?{>00R_~Yee@_Y-&?PeU0HizSPZ;h{1J=UOcWutQm zKB@Y%5CY;QNIhPfRZ8=r>`*-f^c302<A}UwnWInc(fOl2Si;+GPr2rGa<EU)H2fAR z?E185y1MA*N_A<mP<s#aL<S2knNxr&pl$)ow=YuNapLyfg?moW>BTl>`+K3>NNv}A z$4r)ScuAJ@HEiZf)@kLxGn2TC&UG!uH>@4pK!Zd{pY&w^pGCw_ee25gTjyuqnThjt zq0mT6V>kJ%$kE1sFmb}@-`-KOox6i?bMvS1&Dwv@<<Qk{J)rFpm*KXb`onu5vLD*! z-W*b`_}wagZD#Rn17IkAEyeHofp1RJB4)l7z4^^SDRPk}IAGKN&AonIm#fydewYlC zc`fSt8lO*aF|^KlaLo7MJ=e50-m=Gi_T2k2Nxm@@8c%g_NF5`!M=Ixe;`iA<^76|O zgI)!#-}2f5i793TalU&**@3kqVk>;=S*+(ixI+e4%yDgK!YB@Aza0^*_k4J0$A&I+ zdn(2L=1oa_<9_5M@P+YIx`~?_gwFU*l}kIGXh+wm{d1;<zGUuIFr4l_r;<MgJ#xSf zw5z~a|0UF4eBJiIBPhXEZ!2B5Q$3vUy56T(M6axfcGJy?%&>em#}xm#yBf!(MaKyt zbSs1dH)aUImbsTHLgHzwOwjFLTw<m)G?=v!7*)8iJct<)r53oC_*Rty_llx-(ql)J z;|kM#J76=<%Snn!&1}Bvnfo@_@3P|_i1hkMn_mC4D4m2fS}b$^Uc1GPguG8EEbEYH z1{*r(wr5neiB^3y6TzFTa<IgodkQIK0^!bQ$o__>zsHk%4~IKb4Vu%U_qS+*=FR4H zmaF-1vc9{AX1hb`_Hx)5umfwye;oogt6*ThW^dMTN|Kej%x_EOcmJeM2+X@zl|Kj| zOY1Y~%JbZ&evZmju%&V(QF-%)$#fsd-uP{T_%isMX%*TkFCl!Ad4z2GMHz^jX5a9| z^Vvb-BR+&_p=N5#5Z&rR49>S&4Zs!JP_7Bpub^e46!-lj#n_Ah&^9_0UTEWIN|k$Z z3$=HHf+C~*IBRIstRVts2>irRO`}E&wd=@M!{~Q%MimlzbAAuBSfBPhF?4-TwXm$+ zvCM|NUS;Jk6FA~}9wzL=6rn2jU7S2sj-Gj<ZcfiB^lP3e?F65=*>NmIku>?}(3y=J z>uXZLK<>`Jy-ql2ea{m)v^r=;vS9WgmLd)PzYgY)4edCwbhu9|Rj0TY?AhOrpc>D7 z-Wl`8hb|&hNu+@e3&uU}?BCV;_GkDf>Y&<eFMYO%Iw~)>g)>{H4A=9?V<9ezTpDeb z<;_k-zr91H;rj__3lWm07Z>`fmei8vZDvlJMRK8!3A77tp(amzvY(uu)EuBx<WvhD zhT|$f`b)HHu%q%`5A;AHhYb+4ic<D(4bY?!jpY4MetQGKFq!5eRafaMMQEhM6=e>( zOpy_=Y3E3%`IV+QMFo9mk~pM3)fGPX^Fyw+#eKMUIk!l<5)$rHQ*}pFMyl@lz65Ye z<4r%UrOuo&9rYO%l8#E0QW~Z7<4ZaAavKDaqPnF9--n2tqi?2Pp@K;fll3t>RL@l< zYxd#xlt8$^ERGcRYOvbc-^&s;%~G*jc764HJ^Y#WMD3YzQxZW85!0f`;<u!XqG`n0 z18>ey30vm2X&geC;M(W^Cp`k;g5*JwY#Nu-dZg(@Qwhy9IQ>eV^gYT!4ZcO7q?D@s zM$Bm`HfzPCr77Y(a9;g4|I{k=TKbO}4eni9+O+MlRFYG-<&4H<&KFTDblSkTLiqJv zD^tsQu{ITIayJ6MiyznOUDj$M(13S3c~_zK?PLoVttZFtw5j=GgDE^y%3B;5AjH<Q z?vpOv6?AFY>C({?IcZ7LrZFz{(5_gU0xNBrTd$+<O_vU4K}eU10@J%enVQ~}MJ+kr zuwf~(gBrC>!mivC$&TF2MWVSR>bmosOHjuTNgdCdI!5G}dbdfhvL$8zILlJ*0VirL zokX;svn&Sy_nmZ1TuzXpW%=Dh!Z#pRbIFRcP}C+l$$Y=`EL!Ugq-&_BrNzykYDIZZ z3Z=8SE)3;Mk|-r81NEDGq<OY!53u&wc>DSxGk!O|zGdK%t7&{9TH`@p;hn7?IBvg} zkrN%|lAaT*$3xoVRmJ?qAhjb}N_5Oz({kqqWp;*X?>+2!gz^b}gWPBY`OahlmUwCH zaRh{CTYD(qLAUE3TYG@U>;3Z`;O7empT?-&4Qzkx2yTfYRMS|YCTDggGD-fJl-3%s z=PCKgBJ)TnQ`Fo`+Y&oF3LlXZGo#whxr?bb6H$hDDs2AsaBZ<R0NspT+qguX-`Iy- zm~%1%U8a%^B0^kwp0b2i+a+x1*dtYtcg(y&?31+GAXFs;Z0`IB36-88YyXI&EC{oc zui9+BW9IGUWx$=%AiGEzCqgYo+jum-+4S~DwJ_XP!K$G_5QZszY{8lDzbKTwfzX>A zp_9l<N8?%k1^+&gJ}KJHA!pOqIVo_Hf}DY4nmg7g>D@(@f>2>^8s1Khd_SbiDE6^$ zaIl}+0<+^A+zSgwflj2apVEa_izKEhD=+8f&8nqBW%8{uRN6@4lbz1f&4{+I&CZj` z;kw*n87x(gg-)AlUJJe{n-r&1o$^r8xd0~~bD5VCypbWbK#^&?18!DQpfdH#uFqF= zFVMcu=5IG|*@Q?&omHwyA*yt<3b^fuEbN7V_X*Fm86xSNQgjNi)2`%h9D<W(q9jfr zI%3DB<<4Wk`!3Q1W7pAGpU@poI8hSo>X&it1d%3dG^(T0M@6RL*om+&*B-VE5AMIF zr3m^BpgDYTlStglL$86D>N`Z18M8tJ`}J<Qd+f^*$nYN49nAGEBQdI4ni*ahgHI!{ ztblYY9W9##>k5yMt)I@yxPRJG+0v{;#p)|6CN6}L<)@b8Rl`S7+e7%nM2S@r+eW&( zW>15^TwlqAfT*3>dk-zg-qP_d#<e1|5O!RyPfY4}YNDR&J6_ctOiZ+AEZ(K{!!17O z#q8^0gv>sw#pXp`-!;bBG}l*rqz8)qTq`E%v?CwPw1x5EzABl1G0?M7&mFTH?*=!8 z*|UM6cg%gnP3JWRJ7%Q!cIisaKLHiAk3&Y$B+~DTkfv|X74P07w6xQYot*ZjsLEWa zjuIW=Ou=AO0<<d)#B#a0Dy%kuTkD!sUH5)d>uO!*)E*m2+dT1ob@G=+{D($SGk#BZ zLuWHkhkfwK4c9&+z7OX0brwGQ-=q&|Ilb@KUZ&!_W(pb7b*M9RpVNC$H=&S1SGpp2 zjW@3EId+e!9CZk!Xkj(QZ;{_wS2XSl(ymontlDzxqzy!Hri3kRX9O3g4TAStq-!U3 zy~^og65Tmy_XP4@(mSlU*1j^QOF(uO4(dAAkY3sDF$@TUFfpSHCVhcu47)F^EEWQ+ zA)@s|mb{q^6h3PFqEShiqg21Df`tBiujFYLmGxUF3n@+Q6N%9NIpvj7d9PMEr5K5P zeIj0o><kFR8>`NEGs;1pt?P|(hHoRUwL_caxB(omkJFmLEYfkltBxho-S{^MiMt_Y z7*Q&T4_w%7AN|p|w$Iw-hG^hUk<PDH8#`%C>E2g}u9B4CtS%1)U5{W)220JS16<*w z3Ni7e)u+OuzVwg*?%p42#m6<bg4&>lU3{^Q&YM(I`t>xWr=reHm2AQ1y}Rw`o4-t& zgk#sttEC1(0XNMP=L&M|9avl#Tk|J?U}3990jN+No~R3bqPpDTlInN*ZZdUs&l^<5 z|4ZGOfJaqi@&0zwK!9i>f<#1ZHEI;p2vLKeHba0$gJu9VDrf{j6qE=Fpaw`x(8LA> zMa5A^+;PW^#f=0}5I0oZx40AA1$SI||MNe$s_*S|A~-YeeUER({JKunsZ&*_>Q>dQ zd#_FyT1mCuW+P{(3;6nc{EgRk#!4J!%a~J<yivWQKu9tab-kr);EP`scnii1*+k3z z`Aumg+Qoo;21vc<;%#|*%ezYv0V8g9uKAIMA88r)LnS1c_z^Teq(ReV!c>smnb?@w z#tBgaMKB@L^-@Wfj%v>2he12j3nWcu!^Z6qt#iYNojOV{POru%zAD7jbo|QVpq@?} zvk;aAZw~p#L30K(`FI#cq9PVVY?gj2nHHg_`a75%4QA_WOgg)kN<N)oY1WhuGJ3)} z^`(IvM<w>=Od9;l?r7-j)b-I-ZbGT2Vw=}^H?Lwhukm$B@{(gwl2>=;B{NjbD+k~t z=9S~gORBd!%*b-{mKM)~q7W7Jw2FFC5h@dL(<E*x#uHd3&5_x#d3T_+wd@6lTvbv* zA*kw1Rq~XH+LY_6k})<Yaq-vNx}Bj*%m^75@GHu*in!!PMCn&v1(^+voe+e<Yx|B3 zXy~x7q21>%%u(HHeKBRm?E7JsbX>e+wDNi6q0gq`w{*>Lv~D57>S|?1(^TV$x=y2J zF{v9>o=VZEv5`il#FMQMD2&#Mu8mR+QdAQ|GPN;8g^7_Z{sALG3}7C0Rbq&0<17os zOmZ(&eA+E9GS0-4b&HV9R~<&q_otchN%F|eSXL*o&DYMWTj(${UT7Z30@Z-Fz_Gnt z%o(s{?azu`EFK@zyj+%s<w8QNee@ilq~^e@^%26YYb|?{Qrh+`(T8a~Q$|r<DwR}< zkEB6mYR2p@-KIk@Wp!c6s!y%tm{DUMlZVvZ6^qQ3YZRIZBQ*42|Ah%myOkD1YkP_Y z5f(%%^T7#^l4wSCRZJ(*kZ}RtrH7%jz`<;v4=SlS(K^vpS1VemQ5E9L^176v0rOZn zYD}#tb-jW@PnqgirsmVX#4Rs7^|loWkBmD4#_#IsSz@TWmj;n(Uo;l>(h`Q!t=7kD zo?Z{5a?J`GH^>(^Kqgm6NwF2`&tR+d?~giyDv!OvDvVk(FKR7^=K5iZu})eg?AFI| z;0Uksl)IH8waAjW#gUQ~xlP15g$$5*4_AV>YcZ2`VYgY3StcG<K#f$_^HJ1HJgDIM zi4mA@qi4dFOvq%qgqH}4d705ViM{37$QYi)LzF8tN_vOX25&b_QhvB<Bv2tAP>!U| z+~4e5^~Rpn3K<Gny6tpOL`Bv0&sq{_dL9C)AbyM8eG5-GGPfqMP>eSHCnR?l%J(%Y z`-;j-tx6%*Emh(RS5O#|(*?Nl&a{aJN}_6;NXV0DFq=#Q;MVQ&9!@EBJPbS4b+vp< z5xT`Sit1`jwaQN<NJD~NEkCfq`NBBXntuXZBDs{}YVsmRQ7JI$FXUv@WVs`EDPL8| zFRJoOs%L9_`?AlI<ve7iltzaieUUo0?&;B(nifPa3S)Z!oh5|DP%UD*e&$BVNe#X% zhcT%Gv8Ln3brzPXF@CevpZ#9t#op}LZxDY7vkP-3++ubdv(c$=6C+u6RxhekRN@uT z__FR=KK14`EeGG#HB~0h%zCQqIh2i}geuGRS6Nxe{JtLbV)k@Ou_Jl|f0z5JG$Kx6 z%UJYRWkdwHgWT_KUPuPIjpZ*TuDSjOU@5CTHy&E_A7qG`W}^R;9VfGTEERZ3()T{` z`ir{2%N)FogwiE*2wo%fy;GTd@08}^t8%<6*yKW27>{;iE_8(!bD=apwcusckuMum z5JvHYod=z9w@`kRJu{)TVTnv)YzN5^8`0#Ly^5#e?i_}91hT7-kU({JKIrRLwpaN+ zTbI}uEAF|TETlpG<0pj8#{-rJjRrfKmke#^Et&eUl+^3T^4s;}#FFb)Q)1ESm7W@M z&4)|2V!nRApcVUlHIkXE(#5OdHPTx9N_`~gOI8%D3)cmW#^%?jOj*#Q3Q;P&^y3~G zI=EELaVkPlESBPXBtZ<pL1#u9)?+~oDNbxRSMF~8sC=fCqgBLjGfm#&vD=itY`f${ z)3fImq=l**>rvijCdf2JqKFB&(~4NVpWOy?w#}Y>JoSN`kY9pHA*mIgNsN`$q(*EF zHLsy<te<%Mv`|0$dh2IfE9XCGucKP9$5%P^5-Vxth<i1!od3X{%<9I*gvOFQ{EbyF zvHpkljFo|kLvAQq_a!Dqcy&1b+oK^h-j3Q4>oy|%=ePEfy_g_VMJt)WUG&F`lHrj` zXza{ZGU?%7_K>~FAYNRLB6RwozZdc5R7j2BJ`ndS5_|VH_HXyK6C8S4s*h_~AwRDW zdx;tMR|#)>#gzU<#k7>uf3=2c?Rp>UcU+UuAaxjS`(?MwxTGEq85tAIc25d>U%{lN z>#L?Psg7Vm#_#?l33n&@t`ax0@d}@Y*sx^Dc``VZkQ{3=@mzm$ydl3?pnAkOxh>b~ zKe-mjKaO|)M{Q(NEO+mEB-fg8%DSO`!eu?G`ej!lv@8!$FK|?BsO-z;*zXgC>gXG> zLm5nWaYM2h@^Yg$EHg2dWL({tYdcq2SGnS4mhB;bLS=pBPj1;iW0P3$HSCeF!-<{B zfM}&S=C#!yrKYZG*sO0ns;iQ28`Da4BlKAH@@Cf#3Na#}9w#t$YO>^NR|fXfcoQ1k zP%_f3Y!q3>5DsK8KBIag#tU4_-EIPP?Zg^=eUirY7~8O!>sz<pT!9!B7sxMHAQ{C4 z@~hbZ(ER$v(&f6_f?^uDPWJO~6Quy#mstNG(0#<KI&qt<6@6==!{~eF@9IO<VrGv2 zNE6_12!FFY6PCpMz45aUU$&{eTjB101Nt`W%w2yR;e>I71h?@K89`Ed*8yY+8k=kc zvWiHEEBl(>xPwews|3|4Yh*mz&UpB#X|S-(Sb2r0%(#DDYD2?jywnelfxR^3>D8h+ z^63Ll7cUaa^esPb<FyhmaVU_)CJSks<VlNtSx9@f5-%|eNz5$bqtf{1L8T_BYPl4f z?SK;k+741}nq%Vl)`F&3AColRQhdXUr`}pf%7pm3pBOQNZ$?2kmS4D<;&n=B8*x5{ z;5SA%c~!s+y}IKAB(Cj@r6&WRr+N3o^Na9F?@g$%9tB84?D$atc}rrEQ{EAOik<Rc zulg9yTw?P^=F)m*rDtR=CjMLiBP7Q+D#^=x5ZE&@uzw0RdXj!Cp*rC%f{y+2U;n00 zNIaCwx!f)DrlZU&WTAl<!l0#bQ@9RW9M%32qFH*bWf0x$4DBU16#qhLth+fThJ<E+ zGkV2zxJO;*fG<n!-!{6j4`;J*VJ}3jWcH5+apCeUYU9OyK768QaAEm*WJ40J3G<dr zQaQ#Gn<sm5G#IE0W}C2pv4i!5`=;<E*A5#+lXcG468RQo9{W7?X;QLIupNK`Mu&Ar za<7H)@y<p!wy;i&E$L}}(o<%%$Lj`BsZOk&``$sDs3q&RN&l?>vHqF=WBnEXWBuj- zWBp}+N56MMY~N$-^j|I`o_IwhiY|!1VHx|vTjt5!7vH(5-W=wq(L(em*>eaXfjx)n zCdD;S{XN;e0daeezsn6Z>yLk#KPF=xB-3roK8Zim^{a7Yzid~NJqsLS*tS=xr#IXC zm(9ix(OsS-Ke~uiB)g~-&e+5n4MqQA0BNm!f5ZLU`>WOl-`IlfGfcAKKdHeEMgS`j z(DL}J_O+nT9lz7lptwiFR;l#+Psk`{1Lm`m_cpg@isYp7Y}6>Ps@n-k)8jk7S+OH+ zLSL>p$r4O?G|ZTCmLxrmY5j4MTovOkVA~^ZnoZq*xoVbk{hd*hxO67XA-9zr66#Y5 zlqtoYv5zSc3z^ybl^&e~(N#9@mYOM<zO7BG{aLQ3{=9Lm#6HtsX3a`VmcOLuR@GLh z@cTo2Jduit$VD4N1_v^nCRmFFlpGeBJVHa3Rvv+|4L4p6FfOxLT;^glzq*W&D3Y6m zu>zi5eJ$3-S6IBzS30c|lT&rbiQ{J7dgP=x)+fBeL!U6Es()QD6LTB?$mqAfB>ABL zUyjqYRGhVy#!Hnud4QCv6x;4@sSY%yYDiwHQk1Ica9GcRz0!0LkSgr)gUu|z=T?0q z%7x<xQoM|sx8qVhevq#QXhlm^z`VLQCCOYI;ggbL+RrCaub?6X;QW{@O6?&8^X3t` z9aC4uSW+nHiXTE~)1+P5*o91_WyjUkGA~xbvP!c5D1w+x6C=@DQO!nn19<<ZPR(NZ zOq~aiH|ko=77a3J$pd|ubYA+`=N0_z+lqfiD|<pY-IJRa;dn##Fb(-t@`j{)9_YHK z9S1lhMlhfSV7&26UeRme_01g79m4*r_6BjfrKRrF&$ZXSC{-sN(fNz%hSGb}18gBQ z0L+gcwQ2eA0m|@q>~C>6*rgTw|8h7;sPsxyx^Fy-=qT?W4q95T;JlM@f_`F@d|*Mx zDE-ueUe<goCv8xFeV`t3(Sc`$;A_>5sn#IA(M_&+ow+|{mV`3*vvH&ink@<crheMq zx@Kd)_xj>rcbWAc*E%!zvOU(P*F<Vzk?6nvw4#5;-_@UdzU{p}VOJpJ%;b(l7~j^B zF<>UgQqLH$mudb>TlUGOMec|!8+<r<l8cuvEOakPLvrMiY#i)_1B7_W1!E&+GCJUK z?jGxKm{?ESgmEi6Co(r3!y9^Cfux8I%f*xSkuiL%UtXJ%Gh}Y(dD8efd~5}uJ;JU< z#6ABjKcpng2ev>V^2f12J%8nOdB6W8A0Ly|&(X{yK1SO5xx3~1F%IIe^38?&K(#hW zjcv^pT>VGxEg0>(4=opI&whdA7}5*3{WKQMa0Am4Qjf?^!#c_Y>heUF0w&B&Jt8~U z>IOrr^~;H)oiD#5H7DnybYKypgUIB^z8psDuBu-^j!g62P$8kjS&<esWUIEWc7qJ- ziL)QidWms!^~{)Lo10q2cdrY^&yHbW!tZFEoPp}YqfZ%g-*delPf+m08Kbyo%EW^) z-US1-7s-$(_L$+%-Nwv#GRW#hCYm2&R4*5FW}L?OYLgy+&+S_!Sy!aQ&i2dL&tRQB z$>tg=iuiUozWP+|@loK(EP0VNpINe1XdCEPX`pJ`Ktifaj<6*e`(*_6w}05@J;l=g zc;Hbg&@8R-gk3hZ>M1~c3Rqqz+NNm*GsB*xd-1>*&vPm(vU7GR+g<(?m!->}lgc9e z=nksceIzM1ReEoLYxkaT0X<aR6CiK#?5Q7T&()8!=i&$;Y9Fez`E&@zDVe^r`%^)} zVQL8QrVaT>e7-8ci&mf@Ula&r%X<@ZaoZnt<3Clc*A}fG?gwHkVhyqq1EosC>;i7# zQ}k|<494O^q8(+;E-q^?e@-gfKDLvmydB6M!|(Tbee?auR;~|R&+<J!IK`Rkl;@a> zz}W3t?5a(jPzYZ$<21OQ5yXoJQqxn^1H<t?6|P<`a`^}$Y{#!k`8D$-{)$%0FZWnv z7V8F1UW+h@1DOnvGmbpnIn%o8xh)$g4-6ukXDV|f8=s{S4oEs3i&iei<U^l3Q%f*{ z*40X&YuG(NxmHfKWB)YCH43ddf(g+;j9|V-h&O*i|A;TzB^~z@%5X~n^B(!Fr+@t& z&ELP0q%Yr=^hHv%5_kO-Z|;YrT-V!j35h)=vVhwx<Eo^>7JP{`i`-O@_t@t+WqVK% ztt^)C3H6;NQBEXvZ3I4mX!)`B5qNz*)KLXqafI&YYmxEpK(6;opchJ*0dmZZp!Rd7 z@ZL%eG>7^`(#z$0(;FmPm6jK~w!zwH-ALHcr&g?)Y+d<TDcc-dHX&QK?xt*71Ra7) z>Z(Koo(AWYXR6ioYAc#vaf^s43N1;4hPpI+m@B8QKi=_=O7xEP2*j;j6!DpGCN2?_ zPL~ph&&3ad!5#^vVl!-DvvLem#K(*<28(ddvP}7NK-q!vrw+%|4>w(UqgY>O>p{rW zL#!*!a81t=)A2g`l-L}&Vv+ae0LObXo=F<hnP=Hb3T%&TYHc<`qF0uXP51H#QrS*V zNtKKM)P@Tzc|yHA5~NmfB!EYRBm(A~Y343@e=H>8-JDW+IDh8B40dy<*Su{G(1NW5 z$rX>P>j)LoTkr)4&@5EWnoiQG{rxfQbLL{ttfVMfDXq4pURrZ<o2G|dSHm|NmP<F1 z$87mLi4@K4I`{%amFZ%+VvJQHCKvUkU*c0}kmMpj`a{_S#`E+|ldxDS)m5D9>5~#a zUwT&Vl-+!qP;Ti}ZV$|jy&jJVTYqrd4zrtZCfu)0(?@Pd5si!1)gZ$@wbFhS)*DU| zZ@35%S)JPnF}8Ta(>A@o)uk3ptD`%~Xd|V^x2~WX&$c53^&(!X{nd7(HQ_W=GBR+J z<my|G7+uWL=tXtb8*)vf=O%vDw#dDD#O%<2j+CVN&RvlX{qd{6-#?0se{c$D20O73 zBZ1F9&V_*tH~vw!3u0N<DDk*PSclax%E}~R4y!(;Qe!2qzi|9C{-R$B){NrgIa*yF zWlTDrdweIN8AnXUeB1+9uD|6_Gu#dlcc=+wG^X{*9qRVv4#g|gu}E*~n{GB<F83Li z?O^r#9Zl-AxufAS5_hy_<F!ve91{n}v7?Wddq^$NQLWb@ZQScHh|3R&mFRUPI@CZ? zl5EZbdlqp{f~@T93hFcviQL+{Rc0%-5*nYcJSMf(e7+*J75D6h<en{&l8*o0`D9oM zRMc!f@w%vNKA(`z(v<I31BQ*tQeh76oP(?Xp>vOyaChtq#mBB(^*=r_$(oe3Iqp#l zGjN5pC1lv0vb(RjAi=9m&|H1`>pWsjJgUwk%uqHF`S+<6E8_ErjZ&t$aD5%hgg7oq zna*%M%r)H(G@`+00#`&8UHxIQ*oC&4cGUc~m8^b2On-7&eTpR^caGs391*COHQMTR z?U2km{F<bGilSFkNa;HVrrNuSEGWLSsrg_4l^9gWy1+8V%tt({w|vY%@^wCvuk(?7 z-+ZKP2I{l<d_;Ui=Obt?4*N3F$LAyQkya<!{_!?fS`^a@_v)}vRD?Z?X8F=q$j-{b z(IFvy!adyM=<a<RCfnsjju>~5ZEPW`662;WM{DD50G4U7?L=3$`%HN@fADdFz74Yu z=P#zx_0imdK)`O7=`wy9wyd_`JsGc<x{cHY=g01j8<^TZ&&@Y4$y`L&m)`#P-ztAW zE9IZ=spD#W_%5tdDSe|sYqc^1lP$aY#d8<gXd$c`vEweUE{sp-w!Q|EwZA(lKHz@0 zowlaM$Fx%7)Bk3Rr^;@O-v?W0@fI4F^X=yCYsx1doZ4ECp3zGAMtfRR$FBc+gSJ>e zzAr<cukoK6##oGtn`eC^J~3Y0rvx|TR-@>B8>V!Tz)}+^JBsMVhntk{eM&oryIJa> z`5aEJba+HlzLOSLhe1QmJmVcLT*~IgbBAQTN0KkOq2FOSA8jAS*?(To;$cIASXnSM zn-{tA&iIq<ly8TXamWetm0Dr$D~0vTLfw!y8%lEUS5B~I_pa}OU!s<`2GL>SkH7Ot zOz#@a?icG&5U)Qx?gTB!qM>nnbsC(s4rM&LnZLN7m4olA&M1)bggJ`gj;9_<bpx^y zphr<XG2}F;O(HSm*r%IU3a$%#T44x6IiYC-B(|KpjE@P;-NfI&Ly|T((nid(cVWyn zdY~}6R^<5w8Ows4kmYAA>zpatb!SB{RH`Ft5A9-OR?A?b!HD<?;N<yBG5&7;9pVQ0 zax&L5cYU42Os%}6W@_T*<Au4vbA}K>y#(TIFFt1EY=h?VY_^rwH}1p0^>R>~`XK^} z;?;;D!&GBfXSCG`M-gbFzdr3|(0^#3)J${x%$3ILRi6BPWyiAvJj5>7qpZ606eFZz zA~a{PMd;ZRX-%KDR}1>o@m07r`e+y$FlAg_RXvL9Nn;z|-~OfuY+G~#<mIN9*Vq0h z=~w^V^s-i}defV_#rmVYjQ`0t#^2aNeB49}`RXJ$ei#5pvGgziJ0~9UfQ}@+)80?Q zFq8RAWg}wwPR}NhCscGR`}02AeC@T#TOx03C*FVYmrwSW+fKEU+U`4G&}x4FEmtPB zyZJK5wF6tyuCsjCQdPM9nd6nz$C}D_5mo-l&|u!C>OQb!+|9i{#p6qoZHbT7z&6DX zZex5bptnhXo4<<hoxdftj~t#E_ox&0ToF()xmuBJUB$Wa=ON^{M1og(`cE_emeYpN z-~WK5`teCa7Ia(mhkb71+wa6lF`1NcyAuV%wgBcHi8HW!#08trz+};f=}<P(J54va zcA2%L&Wc21NXk)!`PW)RfroNFR5UbNDZk}Gi5#3IXyAG`2OkA+W5bdy^W@<YnM=h6 zdG*LV&Z|d$iymyzxO#Aq(x*qBgAqLm^?)gv-X#wkKR3P9-#+$whnmL;By&C1m7@e< z;^oe5Cv##cHw6<b@s;G27)B*FHJ}7CRmFu{SH4oD3|V!^+z|&WDoq)i*A-h02eREV zT3^*`v(yvZsmChST-6|N1C`TtZgx1K!5opxmU-jFQ6)oog@Yc8dEoxd%!=S?d6{Rz zRy}+r%@~n)FnDGT{`xD`hhI7)qUW8{mGYDQd_p~p)t7&my0yiCL4Jv;^*Pz10ADID zz={HwNIIGctgC?xiwZoZRip82gY08&t!zowAgVweI|n+PrU|GBkCqUA(zi2eBoDWG zG#Spb6iKVW!!=hl+&o0;AGPmicWX{x7KsBjMQjKpPz^(M{StpkJ3n7x-%07JwT+$A z^a2KAYu&QS-|-VCSMiXRTkK_(e=?|iMxvz=-y$g#&!esuCL5u5o#d{G#AEbQ6YUgj z?|vF7o?J7weK)6Re;AOMxx5sZD>S&8r{OS2Ec9d^F~u<2vAYaqxLtw&mh)-Puvmk7 z*X5e)%-EaQD$|Vm=sZyfMf#+b3`wzR><Frz3q)(fd`4co5r)d3QtXLn&Cu42&KGmt z(@%&xQVvaxM7Kd2<1vZVWqJf!Rs9~(b7Yi?KJR`=m>Hw9m3js(e}5|xlS<=@NdIBV z>86kM^yG!tte9Xfn$f^|P**#WF4=pUz||-^dKaBT@<|-)26sw&!6=onZYHWk8eMZh zi~HP7B$|zT!LW`ZWkQA+t^5miH*9Mb?0H<_=KbY@oz)j<BMT#4p2Sz~KFg(V8~boo z@K`RxwUHEwI=HfIi~6=2+_3+F<+9LDw47~ce5b_YJ95p7`_BpT;^KUtXP60t?)JBr zKY_AP4Bwf+MVjS`%$=SenfpLKvRx5I(Z9bnHoTcsj*T1XA(STZoNJSN4)>S+vt8tj zjs&NbrIn0(=o0y-o%)oyg!}&f=jEH;YWYOERpndu_sS=O_<y&2d&PLJ$F$#anHMA! z@dR%Znh0A}%Gds0DP_))yp;cW`z89PuW<BUZ^<~aC7TL=-*U;CE|)6w_6c~!dHJr( zdj)P?TA8o6HS_D1rQ#JWOIxl@Z-1BW9yUriXEfd21fooMi@zR{;AUuGvb;qvlsdJ= zTI#Z6((zw<aZ@RbMkV1C-wKd}7s2(+Sh^M=Jzs5<D=+t1%l?6Y9IQ&R%UaB2&sH+& zDE&p6LT_@Wln>_K=FjUnTxBe+`vDR5a*tgW)mF(*o(=TMJNo5KOHKQlJE!HWhVpaW zwndKSap#=!6QvwMo=?n`a`M&Lxd1ufh@19uJ~2<vC%Ts<%(gqM!8Ojt&X?HKov{@A z)U~zOVScXP&`ai;hqqiG=v4kCPP{)!`)B%^ItNX?x7^yS3(5oVLgo6@|1*_8!ni=w zY4~rftGt^SUzA5Jhg9G+4T7M#E(f8Ql<vx?SXwN?@4mt8Sv*_iruE;`qzSqLDeJDu zmR3HYYW^x!keS(3Pi|eRw4^4^^k$Z<WSRcVl9-q*Rmh(ziHR}{W_qsCp7!$9Z<d^u zsMy0F#`Z(Ai7#i?Rc%HMcvSJam~g)#;T?6nI?EbX91bnFw={wLcHiX2cT~vl8&uw= zX%FPVNRlT`mTtiBK9TM-*m)&p;tcURan>rh7H1^e2{EaR5F7XdIaV(hJva-p%7p0C z1CmEw|6I**Oc=m5EMCgEELfFrYYi*&Ae3OXdYCDNYm41syEA#mk(GJu>=?e9&J_x? zs0%@t-1e>B6yVJkvj~=O_tlTMku7HHi8t)8%a5j>a^6^KaSeqC^48ao+`5SGR<WnO z(Lddi;)7+L0cP79=_6!nJVkd0%#`21F=973P@iT`!d9cM1aesAHgK{vCb6AgZ>4UJ z7xg)8FTEuna&O6pSmj(Q<Cgq^$s1s8(guhvL(j=gba&7ER>r&kkL&aI|5<%D{+Z07 zTd2=u-%G&Cq3TOr%wcx0qMLY|3^w22Elb%&^!OV7#du)1QOXXE%;jRxMA__{G`R_u zRm#l|ah0;zK}ix!x3espV6{mg?o%dZ>xV&LsI2+LmiU-tH-vV_2350dPBjZd0Y3kN zV$>rk-n)Vu&oXeimOQQ>>xpjiSRoN5)3R}TpqLhv$#8*XUj@d<!k2>jB^Sn$Z6iqW za^gs|4ARc8N7G;O?5!-4++5S`_Rn+^;=bR=)N?_UFBjqqsm<F{=kQ~kb?EnQ`Bzrz zy(}$Y@+3=;Yh9qF*U40^mex+X<l_4>3(#Cy-s1rn|8P%^uM(DLFl0wr#>C8o%MX4_ zM05Em=Lno7BMv0Ii?1*2#4y3Prpi`*^a@#WV;53pak;o=`4crl$YERF*y~9o;qI_4 zmPw6>Ws4D<%(7g+Wq<jKQx08z%RR3Kg}`IFyy)~VY{%*H=C(H*>!i=Q*Y~O~H%UqG z6{6e~xgbw}lu4QRg8rSuzwzrfzPhHOB;Dl9<lRIR$<_N{Q9QRMdx7K(55N<uxO5gG zgxB@C`dMCaRY@Ve2rW~O7HiYAo5v=5?f+2pxYoFre@)66fLj1g0yJ12D%5#EP4*|E z950}jzb41{Ry`i5PAsH7%r~voLdK@W_Q(7^6p&BXO0neAwGT711-{H!Jd;g)Uf>o$ zrv@E3HBd{uvjewiZbji)OqnAj>;hJ;mIiL_0^a#U)t78zIzb*{dz>H>6>eq(te`9e z=%m0@T1~b@ir)~B?|I8g8G%l0Cn*}`D=VKtK%L5@$|cS?{FWNXSm`#!$~pXvahMLq zly+`t$KhL&*S*9R2b+bzTjyYs!slQG2r$NAxs@(Q-)geIl%gDN!u9FYIV={28`{4t z*k4XqX&@X(D!oU8Noy-%nYn9%SIpUZlf6=jDQRMd;d?=*W}9WvEQ2jHPZCOvikYJ5 z2T`=6ga~oUq-cWVZQYWnZ^I1ia;PDgIj%>LJV8)g-dSQUz)y)OO8PdGwd~Il!I;L{ zj8!*xL-7ZX8~XiEjA?NY^7)@U3V<a|iu#8rO)>y&=$!OAEwRNvhU4$n`G=(N`G>f_ z)EG1Nx279pT2n@p7#`;F#g%6w2ih?060_@P_DTpc9wsV%9wx0z#U0c!g_XogZF3>F z%>|_;_3s=eHEpiCTWWJjVcHyHSMxDUBA5YF*h$vr(yX2~m+OxC=WT!a4jwM(B^X28 z+f)0S-?D*)k)O}<h}>QB%Qi@uxylQr!iXfBCSlz)DbP)m0(b_#YJ$fuxetwF`&@L@ z%QT^+Pk(pmSrT_2d!Ddumn80kMB+Q<oLq@JO|hrN^cybY&5L<(UE^Fp;;n~$t;EBa zjl$c@+1YG#gxIAlGFDv?cPU#Ezl32sNT#p(ES2xdrKc?2<(9o{b#0|=@>$xZ7g3iq z$Uo=Gn0<{A*m+k*O*O)#miu9>9I0()_W&}@?;E%W;6BlZ#Qk(nz?GXhReAS#IpFh+ z)GRLq!c$3Q-Q8;`J~}tBcfCx7wZQ6myTzq){|vXMd~(_mzqCq2>UFio{Z@2|_o9kw zV_mwJ)9PkV%BctY{Wn*SNQXQ_mFE~hD84>L3)P@xxFOA#jE3RT^=xm<fb>pv%jW|M zlQ&&h-11h}X+)v+nT*-`NF=(4Hxqac77%)aK4kVLYGG0YQ)6R3*Z$#1b;EQnM+&0p zDS8(=67?Mike7DG%Z65?qD1ZUT<yM?48-gf#$6#b;2vWL7bV;Zw>C-wMjGfAM?N}- zgAYTBn%xWMMhwbrmqB*-LN_&#ZMNsg1Bz+RJ0Le-0quDQaS51OC#K?btNBhmg7AO_ z0%R>Ieinv*$5*c0`?PV`(A7!y9>k;k{uDMX0j1blH@h$)TZK49AjcZiS(5GbRwQ>8 zZm_SD27$4XE^h3&xN<lNGKe3<2^VeM=^1?)pH#1yUBo=}MSwl9O@tvahnw6v$X^Y> z!#z06gxl)Iz1DjZn%ajgTFcs1#Beu&?NFVtb<GaiLVeN!lHb2Dm28fWpaAaK5jG<p zzp*b`!r-H|m$;dAdn>hG4HrSxguErJL<f>;QGMp}S6;5abs@|}x}H0bV)IlDs&-gJ zPSns29YR}<=YAo>G)jB`u)2ywnY6!+!}jOlA{@lh_D4&(r>F3`A74YcCyQ`fKGCU4 z7!<Ai1cjGNA|lxDbK<vt{e1>zGd=J_0uVu7WRo{DO`=NOSf@fQ`JGCnUWF>JZh)cw z<4eX9eGVn3)O`*m0WCU|-=A7OuhjfP;6I#Xy0D(^h+htNmnmQ+`h^{=O$_#Pu7)UX zz8d;DnbT=%xiqv5N@ugm-5C}h4Yxt&f+4Sjat8r(_{4YiBG;2fYtBT2OS#8&*fkJQ z9-FX-UAE;oP<B%ud?nG0g)q%z5pLOxViO0~I4z#cQKjCZ|J8#*=q9S(9t_g6^YF;* z|5pcttWDL+<)pMT6QhW0WF?P1yETzoC1Uik>=`(MkyuM2!`CD5-yRJTXXZh2o6@Q1 zY@(`=1x*O!=O(Nb_SzD}{0+PRnvo4nm2+#nP#7Q52zt4Yo*ly?;4cz!`X_Ol#Y{t{ zc(0+Rk5;~k@*v(BZdovBoPomS%#cCm3}&_yhaiT|)ZvKXiGHZlmIZVvJ9E)oWSDF| zdC{oYebo7jMvYHlwD3u1F^TnJj;O+9e(Xoz3FO9VHit<}twWz?Z~8>yd`6|_+Nx6; zH_S{FWHN4>-Ne+fptaLyiSwIM&-^A~d^8eVsompk!GL~<+t(KHk<<E?UZDAAhU_W- z!FYP%PDz%3TAwnWPR4jjKjO`J&SheIN~7S@%D5^fR($*tuT`o2N9H`zfbhM1D9gv^ zhUtL$5)k)Wx2NXMkY0!nJ=v<ay)Y-15XN2@?-23jfbP<mHr8baa>GbzOvWgV!xp$$ zy8gZL3VG5+Ol3!twE%=z*zgm0n39>8aPL}-IGm6)%b++h1I!6*2C_8vWdI>2y!!pQ zBss)C_GOGtTyyw3T*RH$z|w^Ht_5cCp;n^{M_TE^Qbu!dH%S+cG+T(6JXO0r@tWuJ zWGtKh-;XM|V!I8uluy5)o6GZxIcSW$-tg1e^{#{F$Y|+_tm_Ai@fkJxdLi5XJaOk% zJ9?{3GWs^??pGx$(#{Fx<K^;g<CgmaBJ{&>ozFR;%o3X$;9gE3NUZaSPO*Eod^xd+ z=;ct4d91ArEno7>Nf@0n51kVBg<)S$UQWWIAf}fShPsy%h9joDv7_hzZ0z2OaoRMH zXW{BUD(tSGeD4F2UKu~NQL*it7s0Mc236>k5p@JyBO;Y(_rU&PLhK$GBEm-z$LxWH zy?bD0R;`P4-C>!W_&Qv>2iB<-TRw+tHr<Z@xP25FZ3q3owOhd}0as$&gE6Za3}VSQ zC%k)G<~Yec?%vi`9w+hbKU96m0SWhmLMytXDm?dt7RgUs0Od6vXfwTMY*x;8`-|7^ z#fW7jb^|6QF^zpvH8oLU51$7UCArcz=%jjM+FhiNl0dkKFAxV+aAA%In$0(AV853F z#pe=PZmSz5=9wKXzZkXo^6S`S-lPh|xqoo?$gF8*bET(TN<^nl96PVazFCh|7(EJo zC21kLeO?3!uvX`osF}L%D*HEBznd)F$4uh6aL2_~L92<pd9g-q-5cXt%c!4Nw-qV8 zxrEsTiuA?z+}J2EgL9c1I0AWMD#BnuS*p&a@_b^OYPt<B@}`>Zrjj{Wo--pI156$# zP!%y*8pyS#LZ@dL_?Zupj-IiO^3(k>0g-m>>kg}zy@3{OW_>@kz9w6SCTj|JFtq@4 zC~>VBA-mXlm~F|{*a%bb@g`KpVjDV9YS((W+l+epVLa#OGT9O@^BjOkmO@V*K$|=1 z@+QHgtLZnWNS2kj8D8b<b2DV$KQ*{sbfMi%_U@BRx$-2FXqQD#G=1HG)bxhb2K$Mk zqz2f%sb(JDENhgbe`>+{;MQbbxGp##wXh-hSJ`_fomwyP+Y@UsWcaJB5oP0v5&wdy zYPAfi_HLMeKdFW12fYKT=Y9frC~-CLUhSrIa$ARi@x5W$kWSpCygu28g>*7pt%i|t zO{RZ`-0k@m9#-RHe(@*OpsJ<E)F9$jT({==JwWs^3`25dudc^NeBx%Xi7yLS_A5jd zElIZdyipSm`PuU>tzOz>;<pGjV6GSm=Uqe;uTOg%;qhek8NUL2*H#p&V(jj@8*sfn zLGE47kSEB&lMa}K%V7!`Gvr^aqx&O(AJ8Y^s5~wg7lEN$?@MUb?j3^GE?v*JZg?LU z&e5+7-%hjkd-H&Q*qy(e7>1#iV%d#3v|dYbip=I67b7i}XbRpuVpZrSg(<Lmd7s>6 z4UXQRM&#|p+48sPC{(8wrJ{w@7&>baQx>^7(P2T^>h6JOVy$Y;$qZ&(?@Fi085ngi ziuLcY);@^2h-%bCyXFfu4Mek<yp7(dcUQ6%%eeiym6l1|ZL{odkHK&vZ=Ir6;(2%C z48_`>@R(!76s|QDi4_}7cmT3cE^>t^DYR+T8?Eu0G$GCN(RH+ZCMPi;Oz{#LP~u88 z<^ELzntiv}ZYJaSd|OS_+sQ_17csxW=S(2iF_<r?i>Ys*fbz30f)|h*i7E3CJm4U& z-5+5TNMR8f%ghn-!4|gz*s<My>LZwyWS!-jiQ)Y+*wmDV^JLl?#-Rd`g~_#UEj_{8 z17xldzlL8S5w^v-iko)+E4NRy;myCYK_YCM4ObyWLP_JfwC>f@TTGYeVu`L?A+B5j zSDqfP;DkY;I6?V(x9D;IO{ji}uq{qI63txfl<kK<A*U=$EDFIQ**`Ac2wighDB)DM zSP27WiG(BKNJJ_z8x@NX7V*Cu0B(WhsBs-rGPz7Qz52U6%b-EtvlSX*618+-QF^AG zCvh{P+5PdB=1Vej!BrIV1NZ8O&0)+e;@50@#^>Z@{RHVS2a27E^Ca0QfTT2sk;~HM zoJ)3f<InOQcO#SSOI)Rm>>Iv8-r9hxV@bwRRJR-~-fNXRQPjy&iA)iz<A(v_=b`a! zj7)d7f(Nf)1TOHLVGc<{)8$L^hlWP+%7FM<E{OIGI%P8<%Bc%xqd|k&*fS4iBOt#| zFndZi0^(YN4XOA5c{CkCydOO*4cnx#=Oi*y`O@bi{j{x0kK)9iNNS-xCGd($v@gc7 z=~LS@E#VM}N719<tUfvhPT}2lH$YqgFIlcbG$fSKQc6*Zip4kOWb-^5!4fGUI0t3n z!+|qpcQG3g#r0+HQmUi?e{)=YK=D-3;SSG;5CKYvKhO4>Wlw*WZfLGQF4~Ir<@qC< z;Cy5v_rderdjMjkYz*eRzr*;Qk2=aL+aAP{WXzVQNAYVqOb*5La{=|j$f6P=L=R0n z3lZ1>P)Dw1;xIiSES%K|)DO87y6eosnAC>cZZE7586G+C$kGrZ3t&2&sb6uy!n)24 zu}Z!<dJQ%okhOyjGvcpo%eZ6}VnS(xeKH7&eZ|(kV%NUn*aeV@eZ|(kxa?HvkRx#L zEJt#e58c|^Vp6lxS9-i0T^C(%2D&0o-tZq824%+uP~^UWLDHGLy^*EV#VB>tUiwjp zl4iqG{5*Xn3aLj~aR}ABb*64=+!Y=he-yOLxF7~9_ldgGJwfh6by=PuJyR#&;9w6@ ztw<d|&Vz2Gq0jK4yg)1?9w4c)N9U$mS=pAu7~cJTc}v;`ppMT-Gf7~3nq1c59bA2A z(JJLMwS<K|@pxbsVUgHSQIY8pQAKrqFsT|hyqPLDoRdw-7W1MYvPBL>di0_KJ~<r% z2M4Kf{gsQ2npc;Dc-WBaZ-Ou<%ta92;W!b^EgfsTvCq{D-<vqOOF|$&FCr->LOgxi zfs)oJ#e_K|`C!DCXL8Tj3%5?n(<KIPVor~(HR&=g*$gX1f_zKezh&{5Cf>ADC9F05 zWpb=$I&ME=8*EDhe092hArC)wQ8E`J3wwdYLvEg2Vha&gigJ{dcaz08QlMPWF+O5b z#fBlQY)gH{vU<cQ#XZ81C+hlmL|leSovAXYl+qe+RJq&l(J5Ez3ioNg3SUd%oqXbt zeH$|7^x-CU;yy|xs;yZE^zWy@ZQ@6T<onbpw13V}tdFaQ;4Rt6&EbG57fl&PFh-$9 zvNJBZi2VV+h0my@=qogn9k!dbGbY_t(85Z#&#KB{y9ksOtqJEs=rr{<>aZNB-iW<$ z80p^ED3TRIy}nhp2-i3F2^9?f)L`y<P^3!(-bI8II&`v=QGFdsg8cIK-h|v5HU?1` zY{0<)cVxiygs*QtudJiI#d&hs4zX^rEJWy8U7snDxvz;Ip?Jz=m77E>w({JOv8TjG z_2g#E-p|dix-p}AV;a)vd9Dh%IOVY}^ECTqmER%i3hXC1a)mR`_4m`~`un}w2>p5d z+>t2J68j!z&6s^P(weg97@1LXktfU@Br(8fd3A&=FEPKpr;dy4lU(IHiz8|+>U7N< zIo?;Ta1SWvneFoRUeA)rZfvU~V#h~KOWcopLfq$KlttY~$aRgZrg4AhW5H;6G_*aG z98T;2{~Q0;y&hQIy8pksmHs~kPQXgo3jbFpZ`u1*k2#Z>qj&o}ozvd!`=XWF{SH;# zBuhbY*uUyEW!h`X|Fd3GE*B2GVd%fwV`R{l8IN&fwAhw;^JFQuk9!|*+x&;UC=`DJ zKrYc~$vy?2gJHC~F@QBtM`@6>Xn1;E{PT5mV~v7W2J2HCA&f=tTM#-#gV`C6V&F)c zLe7opH(Ze7Nq7!^yD8cyPa${dyNemLyn1<N5G`xcbV!~i<jrLvYAl{hI#O6|@!49& z?4Q^{kqr#HmPs;dK0=u1#wd2NSu^3dy6ut~u(zWHvjzQ^&xDNRX;7}X-W`(1Nn;$V zSM4;F(J6VFOn;hx`)t{<d74(fG2U!Ef=jADNvlNVf{a%31@ap{2-iLz4Ts$CE%fN$ z9haL>{4M^A@#J`txA@EDHdgL_!s-ZI*m=?Ag&mhxD3)oGT-bA`><Y@25f!ae)v!4Q zgr73W#~bTkipe+KT23rWB_=Lj6RbkBJF&O1^i3F%bp`M9h)jGr5^of2K6jBl4!hzH zyS1{dAJItqQLa`#qLESE#T|{|#^H2cUhvu*SwLXwHT!!QO6S+_0;z+$rpbjU>1To7 zX}MvVo^=%#C43CZ`&l5=Dm)_U`M!$xt3G-K^nAqyG2IVBNc*{8#K>I}|6CATDP%qu zgh{LKTTuF?LS|_`3$$<33m7lW`yaoO;#9(JUY9XawWA3#t81aX_0<vBMq-Lc_2#t6 zU6-Sp<+wy!NgS5XMpkd`Q3h35D8;72(?XEz{1YB8{X%x@+D_RG5zs|UnvMOdH+P%t zCOazjvT?0_Bhl?d0UnBMSHbC~+(<(_%*!dDDg0>i^URad>iEu+?yy<^W1YG7OJ{7! zz|J!cjEoTr<$Ergllw&%IR%NHrB#4&D!3#N3&tAwN_+d_4c{)8^tWs&1iD~^MP_1C z7kI3%cYRYe<eZ;IsyVZjjvh&!iXxl(24tt|F@WsY>(H5l0nCZX`K$=nY*PLllDtGJ zf~874F&;4&s~bK{<!m&rs39H)$+Nwic3O4(ulFqmcptUogs(3xUxe=Dlm~m)$Ig<8 zW<F{wQ}m&h>ty*iu=lev?%<~QMT_t=Dz9;*6v?;DlhjgyNY2-+HcK8I5kSx7a8xVl zUAObR=iZp;wr~7-|Ims&B=8*Vkt<Oo+6IA6r1xss0uychmsjAwy<d?<o_fVIHQB2r z68=8z{(VON>T{@TLHZo3koz2}pge~ve`O&nSz+}pCsHxi%$<jyXsr-_#-p*KG^$%y zvSO>rZbYQ2$N48zHg!x{clXCRXO@mD%XWX1j-6au)-!e#ZkVnYt@!7f9f%#|21>Vd z%Mgfla|5Nh5GV!0Q>4680?G6EDgR=b*fWtI=%)(RkMsBL8FM9xEn{=zBV!gYW@N%E zS?>5!n7V36bbTT2{fLeKh>lnl?1T0!zd-uGBP){yz8c$zSbE(=60ri#l;!VwW9Cp7 zJSx<u^V;%ma$`wiMhj}fxSB#Nzv>F+;251-fQp)MYI!@nuB0C-q^UbLxSEc{7`T<C zZX+$ZR6PP49RrNoW~Qx3qruPOE^J!RY0WZGCyupM>H=G(PTFRx)TR8TI#a-E)|(7% z?V8?0eYNxo6nML|Tcr2%Y`#d#?_;pvhd}e=o2~77)i=p~D|aNBp5>Gs?RND@7Io=M zF%C&`AxN#jmK8^ZBI6)T!K=Vau=yyCG9E4Vu$|{}l3J18>=N=O5~pw^5BXQ1c6^y9 zHn((i&_BLZA}TfoLnxzrXUM(aL?Dn6q0s$XAb&ZLE8rEfKuVVrtqfx-iTPZ?6nqU+ z7eJ8c9VwO#HJRs3l@IO}GF>483IkJ9R24Fd#O`KL`FQ+^pwh*hK<woHbXQS2UN1== zrAStU*hNlxZ*ysPGM+35j<4Q)V0ozj@-*1$zKB-_&GEDZ-q(h@Wz#wo-JI}#gy<Tv zyHZld9Yt!=R<gZ5ho$UzUJq)Nuume@#wx+a>_Sn309;`tO7-%EGSKNK*pQ-De$phB zuc@S55;1;sUKkPL?qOm{sQjY~ZD8n{N*OZbpGjJjG^vEjKTRrcNx}vqUdb9^Y%#J; zF>$TOuIRkQNYdO636*~yJ0j6}%MsE%u7t`zPuw+?ix}kEyr%M2|Ia1<pAY+g*86|* zGKe6zHWr}}7(RL9Fa*u!XS2DYT$5|fT|VDSv2s`7*%R+Yc@fpedk1Dm?hkGDBFP*7 zvCUqr0c}d9M&SnI<u_8<>eTzb8oH*kd38!$Q=R^}&8t)58h7!>ZSF1-*Z7A&uHQe@ zGUK+q8Hl8Qw~aLSm<U?dRJfGbQ~z2+wbGqj2g6yqNL`gUzT}2;lHtzcJqQzbFkyIi z4a39<XqDf2kcHP<@UtEf<)0hb>mDcqS550NBdx2Ie#1x-itLAU!lS3AJ47%+KSP?X zRHBqV6W*I~0sHuO7)sX^1UgH8<_f^MW3y0hGdByxacgYl8x0W|K6Mx|6EWIX5UrIO z!8;com7FAvX*;b$@gEF^ctPpxS0zHrdZZRx)+4^<>fzV7Th=3WCwhXCT{C;c@2IDI zFbja&IILF;#3&!;_wwQD5Ry7LRo}82aY?Gd9k#ETk-AByykM?GX7VMt5yc<cjvT@8 zohqo56R{<6%aA~K#i8mJS5-ug0+gW5&#;c*uAt^F-^@7Qt|-9Y?{5|D(!Irbu|JX~ zZ8TjkF%#-pen@%5q$VX_l+{%=!o@UM^>ShN-K;oW$K@ct+ajSEOBe8cZ(?YK-9ijS zZh5gRE%|o7OQ}dA&8}M!T)2|I<juSPgS460`^i{JgRx+1pRu%kkA~Bp>ILiMRk1;* z*wRc(;(02S7Zxa;i`a!su^9gyMQXCNKc?>*cBZ9UEj<a6S3?DzFF|8a2|?#u&}95S z=p2RLquL4;g5GZ@^iR-<Ofd!Y0mEj1CNOM1sF7h;+jw%<;X{Vq13HQER)Z#yJ^^VS z--143yq`dt#{+O_l|Bjjn9`>}D(%<Can7No<3QI?-{YVwNPmJBkPbi@t|E;DT}^rn zBp)IUI<J5<j}JhfFpp0_n#ZqJ+76OWDNV<JReBO=CiRtqE+fqVeTM%BojLfgmUm#9 z<6KGUaUdCGgU(oxw&2a6sSJD6(np{kXyc%BX?xTaE&UR7DdTnM=r|XXb_QKS%CS@k zn$570AT8TjpwDU5xgfRvMk`$c+DPdmR{8}fN-c+_8!ZK(CdL~AQY{NW$1~nC8}DsU zCzK%Q{A{Tc`q~#v+ZCi~dx6xxqd+lA3#@b!NXz>nNXxqkq~-0ry(wijNVOac`jT1> z1!*2<TIqDqSCr1M(kt<yL@i|_NWRh=bbiWo9GP?kot>~bc@fKYKj>?weG;Ut`aMWX zzBAr%u5^^8>p=J)w7iEuCs0dZM?-snG)0{ad%@CX(6vk<7n##ZKY%9C0;h}POeD1d z$wV>e^aY*6u)&~nN%D3am7WQj#IPwK@ztO+-Adb|u;($X3urQ_8%Wb$4w}NS>p*3s zMOIpX^U|l#f<>THNvlBW*&l;0MsE%}8$mj%49GH4Ea2RD4_W%k(qXtsrCMq%EyJ@{ zI@TSrtI4enr13`W<~Vbi+h~yHcGB*~OM35Nyd(@-&2kI`sh6B$r5A#prnJ&Z@7mL( zT?KlE(lsDW`@NNR+zX2|N;5$!9SV9bAazgzdVw?rw4QV^=oQj+Ao&JG(76xvJgEWn z5@`eIWzugT8Q+7>4%rwJNhKid0k>FM0$NL39s#K>&spimpl2!FXr+HzY1h4R!KCl* z2U^E?2ZB^f0Z4NjW#e6J=~mElOmRQxdD6omP5UKC({|YhwLxh&kV<=jRC*NXMM?{- zbQEX^%bT^Y;|!*KCxKpKyzwCImy1DzDeawOXbfmQ<4p#+{TGyxCN=phNWS!(>a^d_ zarOoUon1lukPZgzOBx8;k8~19uB}1m98eEZ6-Zu)6LjW*a!9v=P9ZG^9YA^>bRek_ zbP(wW&_Gh!{*E(<)EzXKlnaWG3P3xOhJy|#jRy50O$FtWW`lMjT?>+X0zv0q(7~hz zP%qMJAUT5(bUp!n#oGNE^fl=Z&^M&?9*(n#6asxq$^-4dv=LAyX(VVQX#z;*96@Im z=v2~`pxsD!fOaK42HJ(R4%D6WKIjC}SD@2Lzk~is%IxVl!${en;iP=f2-0BCDAFmQ z<4I?OP9~iX>PwmnI+1h}NN(~3oku`>ke&s#CA|k~L;4ofj@0G=$7xU68PuP20O%j2 z{-6P*<3Taj)mb2Ug$Tx7P#&e1fDR#D4eCg`4I~Fcg3iOB?@3RAejvR9`jPY@=qJ)9 z(9fjcfsV78lm+^Q)DzT&nhynaB@G1qO6dsDZ=^Ax-$~OzqZuy>I*fE9D4%p6=nuww z0whoA1f7>bTS$!{hw;7v1xSB_Qb^k!gdRrf4hoWTLFuFd&~~I^P#S3>NNuSEjbYdV zkUYB*bQXicq{l%!lh%W}kv;$&N%|V3p7;l-AH&jf9p?zrPM||cAy5a>L7+m?0MJm< ziJ)Ui<3OtK0?^S6y9`u7x*2o^X(?!T($k<$qz$0$NgsnUNI!#)A$2?$BOIw4Nb?AT z#xktXhMfZ%$FTEl*wvtu81@jTn6w_W7wId|o}^zus`<-axTbJS{0*dIVqI^?*}%5E z1M~`|OF=5l$#a}n8Fm;*!={2ZFl@FBTM5!}{8i9vlzswwowNn?1}S)m8Tq?_-eg!d zNHvcHsh0CVZ&5lGq}PfCpcyDps<RL@lXN|37HJWvl5{JminJJX5$PUKHE9W`hV(FK zHfcHNV$$QFOGx#gTGDEeoW4$V)`Bi2Jr9bK)`RAdHh|`m-UMAndKYv#sSz}f^a*G_ zX(Q+g(wCqsNt-|mNI!tCB5ej;P5K>l4aqqa>k3j3bS)_j^e<96=sHp+=z3CT&<&(4 z(7#FDK{t{@phcu?&`qQq(9NWtpj$|}pj%0Kpxa3Kpxa6PKzESBpv9yD(4C|R=q^$r z=x$OG=pNDt(7mK$(0!zlp!-QBpe3X;Ko5|{gB~PJ1U*D51wBkE13f~T4q8g804*a` zf|iqNKr2YKphrn_K#!5;fgUF<06jrk2zruqJ!mCq5vZPYE2x3A7_^FX59le<63}YW z!=R^0%R$eO9tW)<)q~cOR)d};tp%+kJr8=0v>x<4X#?m5(wm?cN$-MQA~k~6lRg2x zOxg%~h4dxpRnjKV2GS3p*GQW|uakZUy+LvgL;ocOL2r@LKyQ=MLGO?<LGO|}gWe-$ zf!-%|2Yo;aff`BKpbtqoppQsBK_8QHL7$NFK%bKGL7$QOfj%dNK^sX0pe9lT^aZI9 z6eAUZz9fwReMKq;eN7q(`i4{j+C(}7^et&T=sVIx(D$TL&<~_C(2u0)pr1$;pr1*V zpv|Nj&@ZG~(66L9px;RIK);g~fc_vY1pP_69<+tD2!tUD|GO0wAT0)^knRDcl9qsi zq=!LmNXtQONsoitk?KKdq}8DIq_v<9q~}2$N$WxBqz$0$NN<9+C%p^GApHrtjn|nS z@-aq`@XjYk_OOD^VW2xnM}uxBJpj_H!CKISwi53JkX{Www$fig6Di$drOOXDX`cq2 zL+Lt@rfsy+pF!tR`n#2O>TA;O2bx6bfgnv=2il2ih(~O^XF=C6-itO~ML&#4EXVdo z;2NN%1kEGO1?g_U6PCWRwEdAr8UsDd6e&kx)FY*X9wFTeQY{}?Iyh{?CRthtT1flu z0O_^%9niH5`@)7D-`|vcH0WQHo(a;DzhI?rgRZ0W11nwd50mdBmfiws3w{Q=o+)A= z)t5E^*CU2?1*ug>gS5QggS5Q&6(C+fTEFcejQ6BbAl1AW^lxgp7o?h>0BH?v0BO8W zK{vJ)Enk2%USKeMEtQ%<lT(Ct22CY(h+vn5x#fUV%ORj|I4?OIq*^WjZDLp*NXxMa zq$&OYeM@P|5R>9ukV>xweMjlPtu%DB$@guL#`_WUJ>&ff(tL}KG1Bp%A1FNsq|&QE z<+T1m8*e4(N5)%i<Gl^Kk9F_?NbBIzV~yrTpr4rHHjrw5%t~Jc{Y>ebR(im3Chbtr zW=e;FH0^jRtp)u;>0B#)*h*gn{YvSpR@!8xfg+5Kl(q$_<{Lq}r<(RpV?h_t?~K<C zr18dBX({LrO3SVEcaZLB9XbrVV649zLDNYqKxL$7LE18}gZ`wJcR-p)`{C$4jJGRj zIcs-Mkk;;bAWb_Hw1sJ_L7MgpEBzVdq=`@dZlwo}Fs)h$QY~kI0*rSSNVUuYJ;8iy zK$`E%AWiW;D1|9L25E|;k2lg2L8+9E1gZ3Lkb2WSHr{Gbknx_i@jd{pV!oe%G~eq^ zFlm>cX!3X()P`x-fi#bAtu&<=*CR^XfmGTDq}HDfYDeifE4>b+?bh=o^d9!#2<V?| zh08#i_Eu0D)7}YE&98#gbAAA=rS-pn)cRviHoJ}IgEZc4r=XP7{5wcq4~2UtBTd+J zkmfcYl+X6P8l<^>Hp-+p<Wv*ypP)XBcLGS`-6B%v@pFlx{Z5BBF{}?r^B4p=oN12% zY1-4R^juJ1N~c)qb)foy*t`s+<#++4d#am2udxn(1Zf={Ioe$FipH3HM}fAd=FuR{ zcd?Z|0?MHDQ7e53q~qzQpn<HlZ$L8wV#}^)U`L55dV+Kmy%VIRTngHO(#JrW+sjrO z19hVGchHWcUB^03XVRV^O>q=R_pWakXK3Ddb7!i}S=fi8RT&_)>iM&c1#f}6P~ZC? z)%SyyW=ud0Q5phuB}G78=xd`aO}4ZIl*M?DfK=b_AT4kEiP+zubbF9Wj|HhmTm#aY zTnti=SOJ>En*2cG@k;j#s2jC(I0t)fq#mH|q+F0{ZUX68*Zy2H*6m?w7U+CxzR8CD z1X2qIPr|+)^^E`>%Xs&Jc4OFMHtb!H+V?$3?aL^|ehK4+Kp|2gXb;jj(4M4epuI@* zLD{66L3@*41nooG2-=tQ3n+&){5<U7l8QlE-ZGGS`$9`Eg0xqB57JS->l9;YHfVop z*$<>zb}z%qkmWrNq<(cJ=xBy@pNd^#rYHdQB%K91fOHw?K+;2?gGlYCVcnA|ePMf$ z_Ph{CXCoD$?)1);AnmoAL0XeLOvgSKwd@2^`v#tGQe<CX%6m3w7iziKhAjh?(B}88 z^gGZOwB=`z+7h|Y=vxNT`n$WrSRiL)kDvulfYgHbtuzKYlG069+IEIXyCdi*O0z(k zcBqw}3<^_vnw6GY=|!OalwM+`?^)>=pnp*Mjg{^=(|G#{Aoc8XKw6U*fCezdERfoA zvz6WtDxmaXEB!*GtiSzc85(b?4y3b(8!W98DSPM}pn=r)E=Y500u5r=W{{4APgG(D zgL#aoGHIuP1~Xm_C_=gkG=%gZ=xEY=pkqiMfi#cMMaI%;LbN3cDrCHQAdPnmNUeX= z(hk)o>_m{JJp(k9Y0m;_+Nq#p88#cF<#+_7DOQ1wqjU{OQ)~bgG3;ZIrZ~LD^r$FE zZE3W$|7`5P1f<XW2GSb3<YMgcFl+-zbNdkVPip=Qq`94PiCMAS0n&IekdE2iY7OOs zhB56CAh&EFO;HURPHC-`-e;wcfkseTZ>6K_OukD%s^uq;=DW|Oh6+H(Gwl$N=6exH zQ(O)@fzkz5x(uZK@*PW4qb5Z)=tQ+th&8mw95dD(3DUHqEnRHsE=w<3`VsULwfq6P ziL~8ZtQS(HJvxDO+$g^cyVK0K2BfW8a=EeUJkUv$P6eq|_llJIKDM;;JQG#}(ksa# zkY2Zbv(m%on|SA2x(1}4bGN0hMA}v?{S|aFE!YB53(~K^h|aKGKx*^nAoZ}xSDLg7 zKqDFNHVGp=4LX(dI_NY~Z~?|xQhSi*aRf+9In~m!R~gNtL8mjtnIKIu4W#9WTKd4! z-dCHny+EUx_Arp9EdY&S*l>`R=pK+>t$qcm=E7?XT@BK{HGZKf`KO>|Y?)ry8oCsu zHF*u_4CZk?Nb?Q-%Xs@hOOJyz#h)Pc`$MiXG}_W-mezsBQu9k7)tq*{(b5Gpj?!)* zmFC=F@||YsQP4BAejP|Hcms4M)4mJRw80yVbP!1Gn_=lLORrn%w8(MBQ%hHnYAFI~ z9-}~KQ99a6XM?oA-D&9sOJi>`X(xluX4+{W)!g+qleVv=vn^d_=|M}cTlx;9vzx%} zM$7J&j<7Te^ap$LXpr{g+dz-9{yw$z{vFsUXIR!^%)T7yQH3Ba`I(@1+e+AU(0in- zK<|@o2gw<%pmXS**!?B-1!*a_+=VqPHMhIlj4yYCwC_I+x{%UMAk8g!5B4&sr9DWs z>;$@>VS9tr@57)9rac*?T53S5Wj<&LQ(O&FEw_LkVAz8o)v^(!YtH@dHTq5mseP3o z)qI_$S3#ObBj`cu`xK;k{AQ(T_hIjl((OPh?FM?7Vf%s9f)bGGI|uX#rISILVissA z!!849iq#+;bNb(JXemf7-C*fEOII&3@j?%nvK<A|6sK95VJYySu_^>wMho@^sa3r| z%Nf=mq*k2=(sEo1l2;@Ioy$R*;(E}d47(eoDLw&dInH^=*s>C&T0Q{Dc|V+S0I8O5 zL60-cdDv*V0Hj(T1x=<$yeMIe_YUX@QX@#Ud<A-vVZVdamIEF!{pdIlp6o%sBS6|` zUInQ~d<D8d{duXOgFsr7<3Q?@mx0uRn?Wm?+Z`aa;9*cb!=3`E1z&+QMPM23JyF^g zq$zd;tzy`oAWbnJq$&OldWzCpK$>C+Xf?xDf;7c%Ag!wb%MC3DX^94}F#1M;o@Uz7 zAk{Ys^bEshf>hu8AhqBJ&>BjA0cnc1k76f=VO>C);%Lxztli^4TDyxux*PxdW2QIu zecaG44VZng#-~|&95kL`pM!J+?z+m*;h@gU<0z2kF$|<@un%p#J)SZtPO`MZQj?{l zR-1TZEp2+*gzfZ<p?;P|TYAe<=QSo?0Vs!K?5UvrNatDU?N(ZErLS6P+FFx#PmrcP z1f+Fvu9eQVVfR~l&C;Ki_IlQ&oe4U%t@wQ{NcR990S#k4@3+phbYIYEj28xJOAiH= zFl;19TlzN8=?uFcr25_mslRLjji&TRkZMVJ4znAE?Eq3O;pZ_MVc2mXS2IZOzyw~v zjDpfkkV;PnT~3?pKt1ROmx0s|I=+beOq6y3)sXgm2`8-B3P*y@Vc1lVO1}rG|7EPl z`77${3{rhlLE~t_Y>--TJ?Kn^-EG5GfyOiJWg8ZF88ZsC9;9jC0nMicU0=bzBdzKV z8pp6vptG6cOwh>;>;0<P#VH19$u9wE4J`!e$TegGR`0a_SddzO14w&b*VnOPrnEaq zrTc-j&rAoYmiZu^t^WzqImmHu;B+djIu)elsDIP6^qZjbD18s4E&aWf?(i0JqjV>b zN_&FTOO6Ijq4YQ_9r`xBge9+i$Hco9RK|G!2C0@UAdNTST@!B>sGRX?KpO7>D}53) zmC~oIbUkPq!#)6M*-m=T^qB^b&K?5qn_2j&py^C;Ht2lPBv3JJ?(#84TZUzWRNvvC z<5>4cfwb;l1j$1cINjD{tbZ1CA=ADAno0T+G>h~tNK4fJ3zK3PsFKnXK`K4RN~=Is zlwNG5_gLvV&_$HKWTl^5X`2|%;!xTFq?&U<+HMh$&bUtm)iB;j8}AYu??xN%0ZUJV zW;4Y)kZS%7q?&j9(rDh>QXkO8OmQSgQ;Yy<iitMfOiNdQE@6smK$_w?knV=2e}z*+ zl<or3HoD_$)4o~X7&>bc@?{%c2bx1V<a^^0qd?a&>^9I{r1wF(Rtx@URyH}7&azZv z=_O0wTDt5flXj`4_bs*k*+?rvcQfBBL3)LF5OgwqZ5c>?ZQ*9zePz7ee!(dzmiz#a zmb}xi7;`Aivvdqd?^&N_=?P0OTblHnx$8R<bQ<%m25G)!zndO9^$%m;Lm(Y#UI6K= z>N}9OW!pb-c8m6P1Zles0I75gC`##gD=i1jVOR}FOSA%{z4i-`&KL)7F>Ul9NNa5+ z=nUGt8l*PA5eT>=X0Mcho9`gdT;_2MNUfS`rI&&(qx5nseJC~Ho`_!$I+wM(1=N+} zeR0re9t*mhY0n0!=4qgL47(VlC7RhL;M_tjuYqnQeFVCn)Vp24^~7^P+HP|!-Dl}l zOPek2nr2cIf>iTKAl2NieZaYgdF%liOR4}ZA$<b6k@O45ZNUx!XFjd(2+|T|fv#ZK zz922pM9@g4eE_tG)YviLw%b1Gh9+8iz|z&*oAOS|2)KTKwWTL4ePXF+rYYqymd>$s zg{5Vd-nEprgDH8`(o>xR?zx9{odeFjwEhv$eWVMz1n?>i8QW)p)UW1)^jiBqNUzBg zb_zJxGsT5n1MagZFI)P-Qr^zS`hk|_gDRNE)gaB|PLSrY8Kil<uuH(Xi1A(lX}nKB z8gFiQ<ELMNs%cB<t^wytw$?1rNenw=_kjD%&kT^Z^rfH$jCVOmTlys{eHU~Ur5{@9 z9wC$VK+x5c_6BL%vp^Ryw*{a}Nion)>@%0_8E{53?3BF%&dsFtplPIT*@gyz)V|@M zMa-iZq<LHk(vjhPkfz;!?|{3jHqO#RAeDC9$IvLy9M<G$kk;gPAk|l}uZi~~NG(Xo z2{<>=f_5Oa;AoKU;VlGdyxTxGGu~Y`-d7;CVDJ4*yk4MN81FEU>O0*^&jsB|=@cuS z4?2xCbU$c5t$!G#*5~hUG!F#b#<WL+RP*&#dMD_1O7FAMr$Bl&eFvm7#veiFGq=<p zhI)Xsl=+}LsO1Qd=22{=V?m24J=;p>Tj{?+cT#$bm9DVTXFzvR`ka-10Xl`Y9M;pc z(M=$=<w4NhOtB24wyXhZ%j|f7NpS{9>u;f@4?r64PfOVc8qI@1Ix{-mQaR`z=5_%{ zbGr(pw%iQ5m(n||^f{2$<hz!-9Tae~*%zjR_90yi(mDD(&^2t|t3cYm2j`kRjs!i+ zJO+T&g1J`uFVH$lZ?w`+t@Jz4bCmvUrRfKo*54C!A?x`FP$}t5ke2O2(DO`N33BrV zy}+>RK{~!H1645X221UFnHCINngh~0_zbiU>maqa$t@G~A~kmbX>JQaH?UrA0BODS z%L_OwnA=m9?mHyl?u)(vQtQ6}y+nPRLF-8!4-GgklXeElQ>sDdV9=|iqd*%-WuVtc z=Y!Oig2MvtlTF8f4o#JFpi7PjIERrQ2IZ5MgZhvj2OUnT2lXYb2FW`@anc=h1nGIu zk)-t?c|thVi5zLlaXjdC+Hx{TZMnrtmw?`&^bspv2Re^6)Ckh{{SBn;yZ2E>b05%~ zOnW3qHID*m&#MAyit9kC<q1pgfHaTJVbiL`pi#{CBG4q#V$c*)VSm#rMuD^smRfof z^cHRT9Hf4=1*H9Bmwy<Wb3ku1-T@%Bc_rvE=CRqv8#W-|yu)}Wf;8S7&>i%q`5^VC z{R+&r_5zT4&LyA^nRX6H)4pP*AAmlh^b;%n1*El+F)-j1(6e_2&7f6-K&p8-=wqfW z2C3$;pidZ92GWu*25E{%K%Y|jC`ePRx6=1OpHcdem3{;IoMC^0RA1pBqwgfpMoLcw zslExICWc)A(i9(q)PhZ*FDU&Hq$yGc2b>tgb^vLL13;SMaL|{O9tF}AGpzJF&{ve+ z1Nxe@7W572Ezl-XY9!!%OG*Q&mc2mgO=Cf)vUWcNolhD(#8^-a`i^Nwfi&%%R{ALD zdrDVY>ETBkpS&5Q<#-761LG|Rsg~d|M%o4RBc<IyDm@9L9(xH$d%!~=wfRMmYJLaw z6Vo<=H0?fxrbOp~G~P_m&x}_M(s(OC+Iu$HczX>s*R5Wl%}j9^NK*_0slL-dzfgLH zm0oV8*Mokg^d>8P0Hh^qu=ED#G}d_9u~<#8M{Nhv9u)%V{PYTt=KCN>ud7dkeq$c% zKx*GNHs0@`-zg0oXQT&#R7*e5AC&gD(rPQc5u|zC2l|uo9<uRHEizgz0BO8B&=$tK z45YR^VB@`D<Gl-V+R3%zLmO|qe+Jxr$1^}`UnNL2Uv23wP=IOg2WcL!fHcL|HePU; zNt*>qVTxTrnqm%U1Z(^qOFw{AOWJUgwks%=X}g0o?HeGC_dO^`>1HdP0<|i=6r|SQ z0BXZ{H-l8m`!?Q>HeT@ffYX-o+JiLS?jY577)bREu`~+QjwwciG{sY(6Iiw|{wQ67 zKdNN`D2*wu1!;;ut+XQo+EbbdQt2A}(X^j|)Pf&D9T@Ld5dMd@ytdfXX?qM{I+hH< zrtQ8Qy^qI5P<{Mdki7aP=u82rkG~DlJiZ5Yq~^^a)x2z^k*)@%Q~E4OrH!~mq6(pJ zM`Ws6dV$o^{-EucVh~7EybnSpA;rNkNhwegaL=j@2dS1xpj@Uc18LfYR(c!gU`p?@ z(t0a>0o04qSFCiq(~ahyAhoYAs5j$<L7GR6jdzQU_aG>b@s`<mFW7i*gASqe11tR! zbST4q1L-xT`)FgqexSoBJrJb%jsZQ%dU;afk#-nksAO!w-OXD8YM?Z0oN3jepal$@ z1o{`L2DFkbT?f*ZK7M?_d4^#pgEZ`=vy7jfeYR<jn<fODr>Uh8w3@WTL=!gHQq!b> zvxd@+rG~nLpa|_-33`@vB}iNP2OE}ko(X#%1gAiXUXx8JM}Xd=r6+;Z(mK$KjQ5tM zO(4zVHxRlKwDg%`;$3TL9Z2K72GV%9mSJy%t?&>?+vsP|RED)JH(@<N(-_v*h8;20 z`29VW=1ntU$KsMUg0?(tX-%b>alZ&E;Jo+)&^wIxGw5AXdR4&rfV2nbebS+z_ejTp z8c8Lf4@u>qk4UwkA=EqvG>9}0bTnxJC_-8Y8cez#G?26ibPVZMP$B8j>VUJBnmg1O z8Za9(GKNh6Z6sBKJ|*35r7v3P$Dq$B{R#9Msr|)R2av*`H%P-lZ;>tpy-B(Z^fu|Z zO9BpD742IG%4#EY8AyHO>dP>XU>n^A(zg5%bS6^_xZJeIv-2>&V!Ss&8t=yW0p|jS z-3QXJe_mmH@(B<oOvo*GWxyHEeA|OG-|?UenRXgT(`GHe3X);_f;8+j(DBsrCTIqw zpIhlUR|TAz466WXiu|jMZ%n)<;LM`*LXb*#Scul5zB!;uO0NT{^qFe|P8Gvm18LY3 z7#4;w#hKS(cZ<@gAeFuY>YO5_eDiuk=iPvPIL504X}nJV4mdRo+XJLwwV>GyyT*on z4a%av18+1`0=k&-CV@0<zeNG(5{4ZE(y)s`wG6w;hGpDjtSSK2Q92x?DeeYc%CJXm z*!eeO{mb&MxFz63DP0TF6zAS*q}8A~lwJW+X@}df%g(T!K^pc6NcH94fn9b=2ZK~P z3UoQcCfcwipm_{iX~Sw3WABS$SAsO{H=rvR_NNWI@lI3T4WKJ2{TQSv&btfaJ;N$N zZrI(}<<u~chP@7Ym31)Y9_(^bIvJ$W0rz5`hGD}%8g>UrQw+W@;4Gx{1dvL1xgV=1 z>iYuJM2alIikU4v38Z0bZP;5jY^Mi|^lFf5S!%-$eb9u3L8@iq!=}#+dL-anOIwZy zsVz@{bWHpTq+{o<OU>vw6r`i*4AA?u^j?sTwlUBr3~Rg0jH1VYG;AD5$J1v)|6;yx zf;8XlS767VVY`Af?8Zm2d(N=?KpM8<abx`_mNK3&Va1^J97{%lbS(K5bOW`tf6{1q z4WxB-`AS3Ag0zP6>I2TdnPLD)^X=S#J0T3)3#4Jcf)=UfRVHi$=q84JY{Pzi3cJ4= zZ?%bc8t4{=oomA;J&pZchRp<N9^Kbs-<DxLKpM6fbUVYA*|6X`>{~EwN07!F@f>zs z88!x_VN0IJJ}bjkf;4Q-3uYW&Y3WT+j5YZlNNe(qm#_=Vw4Z@A?f&Zn&T;h9$3b^f z`W#55?OzT!MU<Wj`jPs^fK*@pE7&z<ioqaF5e2Efx6olU?WdqWnDz^hrY**xaWB)J z3DUH8gEZ|6ubH%Of!c8W_C83{Uh_Kc<1p>*AWi!&XbpWg_=ce=p!*r`B9O)#j0>n* zb*7~Q-@*!)@s0p#yi?F69$?tnAPsvN-RVJwHG(wk;P*^!Cs`VVF7^=P9S_oYuQVDT z|HD$whbC+gI+pgq*FO$8omk#?Kw93b(E%T(zS}^m@BU9szL}pHx@x1*5<^FLgeiUn zX^Ls+FiRPBF-XIn{xaY!W7r0ehV}Z|c+(I|<1Njyw8>J3Z%m3Fmik-zd{e;Lg(dnD zq$Qg6E!JCV3rO=_^Bwkl8TL9z!z#ZIIFB;ya*&2S_oJz`%%2Pm{~5c3j5ivj@ow5| zr0-a&{>50D@oT`@i&k|8sZ|$(9;cQ|L8@iqpJrY>A9OrDY;qvQDPgZz3_6YUvJLy) z(m^RH&VkG$52Sgl1wFw$-T-MH?b@U`Pcm#LkcO=Vt<-onY;4;Ur=DSDAdPoehZLuQ zVS_*#w!UMEvx;FKfHZ7&dWw6Uz7g~krT2kU+6X$1WgEI(io4Pr2YQ?FCV)<)bP;Gg z%ex-bjjQO7K|?7GZJ*-qf)#<zXV_fOG|~g0GSZ0|DbCr{axF;jf-VIWQo1EG#o3#h z^L9vaCNSPHAPxJ>(jlEpSdFE3K!aK1jiAX)`#nhas*c(*#W{;%CxCQ4JrVQ{OL-nh zOF0`fk@2p#@$Lk@tF>n1{Q^?!Psb!tPYx^v4QDw%1ii-;F;Ef1+H?WYz78O@uRBQX zn+d98yjwx1kv_1r(@rVwJ4bthR9bB5!mcLl4ok0E+G6PtOg}Y`2xu1bm<FmPJ+?FI zg_PRO&@q;-u=FXYlJPq2f;wPpm4oIo>@rXl=^oG|*5nhQVwQXrNJ~C$(z#^^jGHw1 zoYTvo0cZRsmyaEBe(6~Lz<<supICO*0q2}PrEKivDe`-4+2pgvOgUic>66boz3i+> z=Sm>{l_6aj(j74N+%wNQcdS!ZcEFhv&mZTMPM(CXH<X<<HX)v-!r8vi@DoN1=zq%j zqcp_)p6>qc6B=IRjbMMf5%7CZf?R*c<w#$6N=1b#gns_+5!a9SJ~@9I`5_X2&~OKT z2g%>wp}|Ebz*PJlB!3TO{tRLP4hanzK5)PYCoeR7SWzzCmL`93tdf6w@$boQ_{nbg z$wel7INqri8eVwZaYfKSY{Xz_%){RZpm%8a&;tG*SU7y3gdaV$Xc+S!fbtJv=J*fN z4?ht<5r6oJ_}x2HaC{N}7D21X2NVwMKTPa7u|EP12^9=18WBM`1`Ij2U|=z#@ZX`K zp}ybwq5g$K1|M5A0yfIO!$L!j9e!GNuY7Rt(D5TgxBSZwiTMNi7Z!?*=I@|_frI4t zz+(&WSN=hNLI0vt+*ZId<NAB@xo2q5p`jti7g?{6`10F$1^p&cbjsw?UakhTD}NvC z`8^;(F2B9<lN03f+sILmk)k2RPOs1q7VZDA_df7(Rb~GFEh!M7Kqv(Z6d0j}0;Syf zKU0b%Bu!FC(;-R!V2eqbnKT2FWSC6a6uUZN*X?R$16H?6bt7A~YSoBUt5ytb#UfRM zR4HrK=vJv(C1O{rR{4IO=iYnnc}_rGt^57{UcU}B^SSTmIp;j*+;h)8_wU35i<%cU z`2knC%Z0qnCB~ihX(DG@XEn6)@S%1z>PgF5JsVR?n(J?Iyvd)JY1N_ZW!&1KK$F|* zw7!;MeW$1ld{aBrRj=siFBDY0vD{n8uEsLfaW%Rue-db4>4#<4j~t?bMXA(+MOc@M zQj{bXsBKu7THMHq@h9#q*Sf2Z`^_y&>JTHny@ASVXjyPO#a!nu*SX6?sgE?W2nQC| zxczwP0_2YN<t)R21uVjWsz$Ph0*leRIo)E)FphrO&{9R44DxEOp$4OGiWO-%Pb@ES zc+Em*8(p*n-H`0JIDU-_+|`2kYtd1gkZ<*Zg$)ZEJ)Q_OEnd=Cv!YJ5r?Y&EvAoP( zj=TQuBKmQo$UrT-8K`A9gM{brX5g&fT2)^R4gB%yAC}A2)E@M4?bU{Vwdap<isN#; zdHab(U4pTsi5i)|c{^=d?5${bJC9SlqR%a%K?&bAJUD@2JE>}{TZZ*jRYiF_{U*hI zfR+>7Z<^}7o|N>K-2&YF6JDI&a)c7&gYCMys<FDIiB=>&RaocxfR6FsS#}5Pc%W`U z%fiOm#qf;;7P{k3(_$Kr(6_5-fW!AfuVXv;x7?A!m`a}njcYA_d0sqTzjv3Dw&QM9 zQ+Z3Pnif{IETlSe`88E7+!*lj{Ehl0z503fsGFa+95a^V#xjk&^zr<Y&Z1g2%cu26 zAJ4zqSyaok&C$oRyUn4Njrv!4^>_WN{C>#$g(|-vI?G1=tBm?r8TGF+>R)Blzsjh8 zl~I4EGy3(ZGU{Jt)W6E8f0a@HDzE;D01wwIoKc_pi?i(QH@szkzvS4%YW#4PBgS&n zSdJOXak0G2D1X@sS^lyWvixN$WckZh$nux1kmWC1A<JL3!Yd#9!5Zuaz2Oo4gO|PG z(OdS0N8109zZ*TZ7cUpQ47_D818>>Oz|G&=y?N=ojr83{`fekAw-*4-GZ0U=7l2w; z<FjjbGjQYS_5yI1^G5l3qx`&4e%>fQZ<L=e$nx_AS$^It-;Fo#HGo<+(t8cy#p^Wy z<}FnJyw?E!vXg<o>;$0lcLTusplOg-eOlkN>{Z`e_Nq_oU!OM7`lDs9`fAzBz_WW9 zxcPh4_x!!;t7Rj-SA8!Yulh94r1HJ$`^#<y%I>$n<FB?qPOq<jvg_-gmyP)K_0M*% z0o?NR_3zka`TF{2yVn3-dT#?z%SL*y0kD3Z^lkwDveN+mvXg<z4{M+g<7u`B2ZH%R z27j+#gF`|b0a|B*7mKa#q29XIzD#jmpgY^wm+e^{@MxfIR^QcUTGjJbrV71xWjcy| zE35MPT(-kGid<PNtjT89uFMP|=brZ5%FaTD4=7jm6*^#ajxJXgi|IlZ<<9Lune=(N zc!=xqto~n&=S0`<WPX2J|2UED*Voxoq`pO;K%hOnroE>l6Ih!~7rO$p=|oDPzb9Ml zyJlWsR+_d6`UC>GOlL9BmrZ8^t1>ugf=%M(d;@_M=+;GS4!MAPj>X%A<^(!=yYu}; zO1h>!*PrRT^GvP$u1t1ySMg;t<?@TY`9EJg$4Y<x=Jr~h>upb~%@c868R+dq4SI^b z{e?c&G=adtqHGTqBe^u`_5nxx?Y2&{uX`Cg=bP`v0O03J?Y*$455q+VpPNF(@690N zelJ_ArKPn20k$@0yYsnBYh7+#zH43}GtiO2aJ42A$oi=fbbn7#rF5F;M7Ph0&ab_% zkGfHBPoT3so6DpFP&u5CLzkrW&<Pfp)#q30M3*0+f~ddt_GEgBen|m*`ubPloM65S zF7vzyhz9}=&i14;)D39kVT_17d1o?k)2#HIz&iYu>2TJvql@=4Za-Mn-j`ut6@r__ z$*&Ka7u-=sr<;+%QBWrr^h$Qufxb8gC%yVRfEXzQ`eOTuZr>A~-^*+-ftv!ey1Xq0 z+Y9#Bv~{#r(^~Dz7S&c$?ClM7xA&~mH=4e{Y$U!WfK$ruT3wsP@R-ACVSH&DqC4W8 z`1<r@`go|!W!7YJZg0ZV?zGW+(}-5?Z<wRB4{)WZtJY-l2oSw3Q0#TOAV=8K8)$=f z=hcB?`zmZZtNM$9p5C78@68lo$@O-$UmZZ|!aBD<o#^^_<JE-5&-Qd?vA4+t3K^XK zqj^{$jagYoF{8E-s=$ek=S1g+c^a*nOre!(GmplIe0Cs{3t+S6)!5P1-m^M02i3ej zGk~fxY{LvR@2(QJ;obgZ=C``gzK*u~%wL)FE9dt=3(#ASb<Pe)8}PKw_WyzP)lyhT z<1MxkT5Y&^Q|D~v-dbqx@1Vh=vp<(x$1d0f=}xuIUg;InpXmPO?{)fUT<fRFlrt6K zVGes0XA0phb>`Yvlczl}Yi@Xe=2`B3batjtz?jz2i-{bJ1J^h;?ku*hX)m-EGVSSn zd&k|Gv^OK^>F-{ZDbPOGEr3SLTzg@4h7(Rmm(Jvh?U>2<>H4~Q3q@?y#L?h-YP<=< zEO%o1RqHT1yh8H7B>l@KedTg{ix>!d`&W0lWu9qO;k;<T-7d3z-gMS!w^iso&WP$B zMY<h`2Lp^?ZaF+`x1)vihG`$j^kJV9Xd}bbf%cwspskZ6@=$wXC7e>)3uudMXJ@8> z(VG3*2N08*iI97Ddp=K{d)C}&C+`LD?S@6ileC^W9*nx(wB%d>ZS5=e7BI=A8nL8( zA0{TwcKx^a=K+-D&!_)<9NvL9lGU^q+r0|7>*0St9=}6->y6qEM>1~vIgRFpsaD%7 z3V(IG9mrg@ZcUx9|NZ)^S&?7ELS{AXpSdS$b8m|9M90UykOvMvdO;@)VAOI0@Q~No ze~0q3Js4m6vbbFUhr>>>)pQs|fnbw$JLQU5X&l4;z3T7QmJcVKt&ofQyOhU+WHV-s zv<Gna6?6UK{x0hm<CGX<wBr6Q<?;OX6-qqO{Z}8~xNYfdBIbrTGHi9n=XvNzI1iFd zYx_!ey`E<8&RTa}jg1Wrb)w_#?Z^4bg%sY3S-JF`ftxVNz$S;I1nl_>G<DTBw!cI9 z*`A*NYvnI>_wV)pll{E0L7wRK;msc?Hrg&IHu|P>*Yr^**__j67KX~~y_gZ=v>Ttu zbG-0A_CDua8?DXu^j-ZJ(9(fb>u8Zq^1(cNRv+eoi`=^Z+4+rI@4r`l_4!gaM%j6R zg{yl|H%w>xd+zS(T}!*4)i?>?;rvH)C2AAZE_7ls;8{^Qub$VuQuV3k&Lp_bZ3Ak% zKidv+b2#DKquvgyxg93XKibIP&Ko;OBBqJcjhCM{p6K;AG2V%T8&0XNLjUaO?JcCU zJ?+JeHmv>Mi3ca~+!#)D`QG+R{W6O`nA}mfvYd5U?85vV=Pzk9?CXM!&NX_iGOG_~ z6(_c*bEu8g>`d1KX-taU6N{8h4~|>9d-1ooC)@E?q&J58|M$yx+pXA-^WXBI4A&q6 z)Yg3bgKwImd7CS3AMO#8*5rJs#OHFI?T0hf?HCT|Oxc`3mPRA&3mres$zO8;<%R>O zJQw*2`Eh8SxX2Q~U8S8k+m&-qy!|PE<W48}GwBQt_uUfylt1OK*E@ho1@`jYnKZgk zCg4<(_w9i@DWDta&kCx<gkmhGoWCf&UM#1>;V4d`bhdZk0F!d3V!XKAepc*lMZ0!m zHgs<$Jr5`Qk)WTiyLM&^eLU;NJOtg`Z)~S(6c-MDRh}=OUpmu=6{jUu{!YEjzX(#_ z9s(;=^W1r3pd;7bO~=<<1+N}{^f+x`6xN3;W;mA41h^q+SLPn^(<ba*K|n3IRs8s! zZ2l*0L4E#Z3UBYkO2@puyLXLVHjZs@UIxc=ZohZRuYHAiz~5_pq_L6ism7}Hhqm?s zb-@LFHa&pVLpy!`bmRPLcYinQbf&W%_jNlQ+oHqy)R(tj0<+!y&>WmL>7!HM>1(K+ z(B5HOu%nClkU<-bKk*yq$Lz>*j)n50v7AQQc5Fe|l=_Nv-PDbAE=FF2V|m|KQz7`^ zynCvdlQ_%n!n{D6^Jez`9?s69zXStD_SEMwL!<xZV245f@ni+(Ve4=}v1n22Qko=H zrLjj{jjrc3h!-54{gL6)R<n$+wBnnt_&Q-(i}QTVwi(->)tqbR3&aaCo6Nd5D4;wX z9a4F>;2OwZzKNRY)Ox`V%iG>xW{YvR3THl}j~8Zse=-}jmA}lqXu>9beelMhdoYhS zIg$OH>g=ztzpDMPl3QzdT=^dk2yT06>76xze)bo&zZ<uf{x2V#tKG4LO2qLnb^sYV z-MFr`V-2p5V9UVPh;yEO`AkQ)GwWRM@%qQh`nMrrKwd7vYIIK&Iw}9$`Phm1dh=A= zhOQ4m1zd0mbm3%3ra(EL$o@d%h&LysdHcM8J|E=WGS30whVj7JO?xMJUpaoqk53yQ z;1d}y#WAs5tUu@Mg;TJ$V-Dbab~Z<2t+zH$d^|Mf(;9P5?yKPf?L{A+5p)Kwe~r38 z?r>c3bYr6Bzc&4e?hn+y*v_zxt!t%w$<{fyb6|saFQrgRi)p`qRoc6g;7_IZdboK6 z(Qfo{io^Sy$o`}E_ld_pf4aZ_CH0a$->JcgjGuC({=yf)j2=ha>2I^?hKX67*HEwX zw0E2!``zD~&k5;&JeAL@3o`%f_uHH-AG7k4?eE?H`ZsT{Mt?e)-~aG_)06G@x82Wu zvi(lBAFdex#rOZ8>@O$#%gO%o%FoA~+&)fjA1AkuliP>$@LUnMON-;Blk@wN^ZP&f zeC5gha&rH1a{qC1|8a8v!6(E|?k`X7FHi0-y$2`p{)LnCga2R64{#l^slNx$)Xxhv zWpIBzKYr=oQd?Y`&GG98oQK@J>vnu`ud~qGO}F9TUK(7d$4!>FlM7Et^!4`eleGLQ zg8*)t=ZoE1IStwFEEiMkrQ5Ro!g9U6d4BNAd&M9>q~&Drm!w~X2lUpq7t(>d`n!=4 z;&Mt41aN<n9m9(V@QsVES7PL!b#0$TX4(n(SL08>_4t$9&;PUA4_$A^HEHw%?JW?v z+1PpR*tyT<M9&8Tffj5VPN(3v>R=No_7{3^r=0V^DLre74oG*S;R%Ie7u{cpdr#B7 z-PwD2*G#wg;XY3Hj@3>)Y=tKl`U33%dQt1$xPO#hOoAsD=%(4u_U<h15Or>v<0OCD zANLL2(3xM|eFHsj?L5C0=;+FH+}+pT?Q9j^eS0k}wE^eVJZD<^ds4jnU!14AJKB5b ze(QFAMmW$$j#pz~NcXE-UjF9x?Ok<OAFj^RHccP8Uke2WC_ZWlZ(EjeEvEZsX^?7j z>vOgH@`5gE$sW3?m0qGTSB!5M<oqF#o-yZPjqakPp{2G8?`cH><8z|wx4?fEo>q{1 zbC+M9d(SexsmbXj?qkgSHU{HSW(v}|i;G?^<J=R3?I29I2Y1pv8Mt%OtB6*v_6+{t zQ10LQJ}7s6H{eYS&MRMJga6I#ou?-f)a@RY^HhlWG&Y`3;1`=X4_M;HI({+9tMT$5 zgoRej;l^{kY$DH+o6>ovi0(bb{tb^6d(nG4C28l}wLO;eJ_{O=ync*#T&Y}eU!3=} zxc8vLY`P^kksF{FbI<_c-w5SAFNfEwIBOW4`ei=OeeD!2Z6tK_A?_*{@5N9Bcpb%E z4Sy~^dO;7m7{*+BT)pqFj1TkE9%?}ZhzGA<DMqJlor1hD|6F{|8)yQmdjA{kN86&; zi_QBqz2{?UX;jY_dhvdXZgPHkKipUq40&zKRZh`B{#T@{Pj?ScIXr&!_h|FDS^d~$ zb>JbKK77-Q-FQdIeh%lCFi}V3=jXg=bZ6u{tAAituHSuQ#F^G4yh#7drqlA1Y`o(B z!3*<~@KW@P9=RaTyZ}!2sqQ!V;l=jnJa}e)(z#{Ux%ZuwKeNrUSg&&RS!LE)_nn?U zjX0&%^EeGZua|du2zlX^^5-|5o1cVNvQH09bMg)$?*P(0qLn$f%(~!*=jAIX&x$gu z;)*Hxvq)1}x431UU1ps<X_}M2R}SUdgna3{FfD&k{bcLXNh_=i^A{ksW$ir$d0cmj zHT6aObQ#4`KrCK+czo6=*0~SD?tNcZW=)+m)jG?o2ek>M4I!=mO?ll=W?eYxLhD@k zUW8x9ojR$B(^1(Qscf&zYs;+j5c`>wCw>~>+$NN#;-GYMo$~B5>s6ByRt5R#Wl`B& z|LIQsx!jAn+)0sBtV>=*-SJyrGmy^(NK2otNm^N6nY8YwYU`esAH*_V=|8Pd;j|;Q zXQa%!WYTnN8pYxD2Wp>35Vx0x@+@GP>vl2M?V{u<)_E^dEiG#R|9HJneqLR@@2hBC zUgp#VKe%xAi)iBu@PmC+9`(D2-M+?t?mCZB{iZuUH{dn>FS_e;D$-JnQ_sv_R7-Kc zj^m~n4r3i$bkk(C??q@|>dBThjDJpBO;c?(2sY_b>O1Fi-{E*e$k!{!`_|*(dQWxM zDfPc^y8Rn*OkzKGT~Rw>eP4v%TK4KpaU7;HsV$q({(5^;UXOU|V4AZID37UV>pA#g zh6m5jPr?r%@VB=vs0~ABIJ^M6*UsK{Ld#U2Gx4L6)W+0aP1<&7_BDOE3GM9VL!6fJ zg9#Tug0Y0YX-v5gKS@mazS1|Pn~HRQ?YFyrxt~r&Kh@(4A>VWHvwKv&_f7SsesMLn z{lYo0qy0i?KkwVC&nfufQcCA7d+E-?Ph=AJmjBXkcU_BZoZ>Lkd*ylGUR>ly>&fG< z^zD`7ZIj-z`R&!u%hxN%`!@48(|d7yT+fHLeOhipyk0q;pO?S>{h;PgoYK=baecYT zU4FT5ufKWa>iLJ<{Hgtj>*>Aq`PY7X<(Tc|)!WPWmHf<f=CYSg|1N0lFdOyxrn~$I zzG)x1%H2o)C7SZ}@|%kEUc7ocHfiO>Xe>O>84JB}na4DD%;tS$z}ZGvU*>2k=RqwW zy<93^ug5pB?3J(Yb14nQ!sShM_7NVVv2iNKMsJL~%H4OE<<Rm}Hx4S-Yi}yA;BJr9 zZ@u!p@sQGmUSX^zU-T_!9CzZPalAz1xR>vBw68gj_cdM{AA`Lg`=K)axgbX!#lG2P zusG_NQd7!27Eo%lQk7?T)|E=32<vj>>3#4UY3lPYla=J3B=VMC>j`|@nyyD2-sfSI z>V4j-<$0B+@q2da<Gs3`z*I#oYo@0Epy>^oUZ?3(wLIUe=@G3ipVRyoXg;Y|`G(cL zv_7Hf%d|Q^dzNo_RLj3j)AhcKb&r;oeg?_===uyTEu9MUKF@ms-#2LbJz72=(9&Ld zf$yaIpxdjD^H9IDxJ*&}yu*3^!Yvp1S}#}E)3kD{y<<8g`-R3|INi_ZU0TcqA6viB z^bW26T%`GbT=ThC)A$WG_4$fYmi2y(>;3Ixn$P<*pC>fEMe~`h=~Y@Aegj*Q_jy{= z&w3EwAJ*#f>r;Khe`q|SwN<qi!%E-X`s4Zj!s(iSP>bgpt)0D}bD&hGXl2ol3wxh$ zYVjP`_)oMvXKHyqs`=0NGQs!t+Ik<?Vyi6ooyN5MFVgbV^PwL`^FDL682&@!M?437 ze@o*BH9k$#*K7K6P2ZyFu$E7q#+PeaANSs<@lH)&s^x=28uiip_7jR))~7YCj}^CS ze2u36QPUeWeV?XvA6-w@V#9P>eabccWlh&856jZ^)f(4zQLFDmnveH0B80LUzfRLy zm$CG9w?gx|O4E0oAbq!%&t00<w>w?y>*z+!|23N4r0GUY>-}x6#`XTG?@#r<@r<@! z-lwJAq3NBP*4s0zalPG|HJ*9}{VJ{8&uTt;9p9mG`td~XgQ=qW=<8jNtw-}oC~y2k ziKeTye)TJj;}BMTp3(H1HT{C}u&iHddY`7hrs+B@o;@00r|Aw&>+5S!<NCfyA5V0x z_y1SY*JydZlCIKx^leAidYkKI<+QZdo*=EyC3GFq+IF6%S8Mx)u(s}=(&Ewe(;B~7 z%jdr}jbGGOpIel&EPXCirTOR@Q+oC3)_m}*t?IK@^ZA*^Kc?}UG+n9rRB1e_?N1-p zG=8mCeX<(w)HwYtulM;+PvHAWO^<11-J`Yhiy9AUx>D0ewR|qs^iC}Xeaz9v&o62I z4`_N&i$PCIKfmgIMl}75)^TTf4)~@Y>@2g$=qQ?I+=;x)tSL|>wpJ)bTSA(x)1l76 zKb#R%Dgf2V)|pV};$N9HTd6rvU2LUoo$@TRB1+LXbr)ObL(#;!%&JtX1}eu^+Hbsx zqiRqp1=YjW7O4B!x?CyR>*U$m2K8pPrj_b~DzKHdU^-$dv+_z6p^9uBfZD)m*DF<m zTEo^2Q0L=cnYB@=O;7`D9fYEmE3-B$wFT;4wr+)@gN!n3NU3d5>)E;;>L0n>9ZC&D zy@9Peq29vQT}thSDzSA0>Yv!UN2$F~_px;!)a%hp%dAnQ_LCo54?xk+x|Uf7l^P?( z)<aNqG+M^zP#tvy?0&Y6L%ofyN0mATMSZr+Iu5motrq?|ie^*~vX$mg(^ySWssf6R zzRRp>Q1|0snKfOh8Bp(HYXItB*g8|G*-%^9ItOZyt+rATsQ0in0rdb|=POkS^&z&_ zKt0ITdZikmKEc)$)T>adGOI<Y<xrnw>q@A1;9r^5rc@g0Q*7;m+RWCRQhBJ)v9$>G zPPPsxwI1qGww9pi7_f|crlU4unU06bxMly9tyF7AQAtm-bqf^zE3>vLH3an(Tem^I zo2}cG+5z=7whlv0=lbqcY8TWu*t#2v4tC3|5vBG(J<Zm=P?xZEpHibx-)8H6s2OZM zpwvOAAF_1}ipI|}>yT21p?<{HBT$#IbzG^VP(NeqF(^7_LH|?ALht`MTPH&W*jla> ze!<#$fvx!cXx`tU|0#vjU)FEfIs@t<<XL9nlA5b#Lj94gINfHwnsdg516ScPphZJ2 z#y_Yl*qTskKGZ2}rG3biY^_m>&J9gwYXj6wwx*P7fub`XW!7>in&+2UE0t=4I)|-k zC_3UO;~(F4R1WL{w&tN`vz3lS95nznovrJkXa-egm6X~5bun8vLecyO{ZFYus2ObC z3`Mi1GHZ)cTcIvv>k!l&wr*2uJ5+$JJD_NWUuF#}wG-+Jw(f$Wb17xkZly+`X0mk; zl+D(?O6`N1!`4x#AY1n<bpUEETMt5o*gB@vA*e8050hf+5v9hVqHH}1bqiaMDRmqw z&Q=6#{X6%Z$x4+&-ON@x2T9u@&NC}TBV!F)r$c>!tuvGgK-IBzCe#PnI$NnZPz%{= zL(#kr{ZA=e8nbR=>wGBM>aqV-iq3ST*jf+uVYW6Xm4a$wYYWsz*t%S)l~65gZG-wK zTWJpAD4G#0Wh?F9X^g@CSE(Y@3bqbFeT=QNUvyLns*SB1pgzvljY@5T%CL11>Jx0; ztkf2$)ok4gMI##aze;U`%CdDk)F;`xL#bh?HEi7p^$1&cDYYBwAJ{qq^(nUQQED&L zo7uV#ipEduf0fz~^%k}sfci9B4=ObVwUModpgzOa!%7{2dOKUkp+3vjqe>lvdXTNh zp=h+m7nU7GBgz)GmgDc|*g8e23aIz7mCjIpo~<+%IEuFHA-2+X`USSqR_CbMP!F?} zwl&%}lv%b?bhd6gTNC(8=M~GW`AStneT1#l=O1Njy;2QOpJXfb%rCK(`kAAaL+xbi zO8lig5%#}IrJ+8@)-L>gjIBAP@=#x3YY~4RXX}7c>!C*2TEbsCpN9RfQX8QjXX_^X zrTt!+HK^2PsIRbf3;xnMBJ6*a8iIO~t=sUI&Y+fY>o{r$*i&pB#^0~7m1^jyT~J?R z>u&s|y)5>>O6`IA23z;y?~`oZr_?Ca(`?<3zh7nR0i_N?(a}ShHHN=WvGtHrhoQd3 z)+6{!`}8tvT&bf_&$9Ix{?auO?0=QAa6I-LTPH((ovr0cO@aCzTPvWx!PaR?O^2d* zaQp#9GYIT|m6{3lL$=O_dYY|sl(M0y1{nXKzRA{vQuCpH%+^XMI$u;~)hJaDMRhK- z8lY&tQf8%;YJvJGTbD!8IaTa`m1={cRw}d7P~T>2mr^+>I@6Ew59(RA7L^)+qINB_ z)<e<k2>V~9HbA||){Rilv2~MDgHW_4aQp%FpKRTt)K;ipvvmmSJ8a#i)OILZcV*TN zD4L65|EttasNb=57u0vzx?8CcC|cWP)*h(uv30Lf`=I{F)={YMvvt2x2cRtc!|@0H z(##M2PpLytr?B-f{{DciN0b_en#|Ut`1?b)9#iT#)M;$BPP454V(Vn3%Av~HIt7a6 znb`j-H4W-awoZro5nE>{6@Z$;)|pU0X6tOF=0KgpRvYShwnmgnKvl4HJ`~MrvHw-7 z25Kr>>!IkJ2Kt{;DX3{|ZGrkJTbC=f66zwhwn6=jt!bsYpe|u+4vOZ`=zmHTp)O_X z0MyUfx?ZUg)a7j50QC#DZd7U$)T`M#2=xM6H!HOT>Poh5g`ycd_P<JPgPO(G?NGmD z>kg%cp{{1@PN)~zx=X3uP}i_^1nO68-J{fAsO#9e4~mWtu>VzRKh*VXJpe`L!O;Jd z8iTrlt%sm~&DO(89f1n6bsXw9Y(1*fF{m(Gk3-SX2=>1?@8qb-P;>^X%qoZaEnBB3 zRRI-e>olm}v30sqGoX@e4M6>#t#qZyQL~|LWa}I#I`+Z-SE&fpO>9j-{ei9Xm8yig znXNTYe`IUDQVmd5Y)wJE#MTz2mP1vubtROAIWP9VN~NI|u(b<n5?gah<)P}>T7)`< ztpiG}hg!(i5>y#mHz>6c>Nd7+f||_ML8UfBEn@2ys8iXxRjDDU#cbUMbsAf@E42fv zg{{L-r?YjZQoEp*vUN99Ia^1R+5@$mt$U%)VCz1mMxkEI*8NbpkpXRWK&gXJE7>{* zbrxF>DRmg?b!<HXHHEF?N*#r2W9u;}+@gk@k1J)BTh=PJPKKhhwdj9JO@T_YwE_ya zWxzU3sp(LiY@GpB!PbCMGoiZJIveUdw$4$?hPsQb5vZwbO(-=VD#up3=84<PP;QM< z^-w)*ZGf7_)|65$P<gg4hq{2RE0t=4DzG&Tbs<~3l*&OB*_wyK?R_Y>sMG+|8n&*7 zn$FgeQX8NK*t!vluBYJmSE)g$d)c}f3O7)}x<#q2Q0v(`1a%2pw<)z9>J4n&0X2iI z!%FRhDzSAJ)TM0Qt<(tAeQezWMR#13S$mb*2epB%qfnQ#b-z*vpx(mPgHQpsjwy8r zY9m_@L%o`<N0b_edMjIxLS4buV@e%|+Qe4t4D18gI$5c5sQcME1!^W+E0mfBHOSWK zP`LFDHJYJR0O~=u&V-^nG;sb|sX0)a*=j@KwnSJXN+qD)#n$;yv)M}b`8cWuY71NI zp{`+TgHkD|_pr4E>RPrgSBmZt+RD~8DBSXla??t6LA{TyIjA{o%_~)e8e;1J)b(s# zuT%+&u65w}1B$Nl<NUKyo1nI_br9+Xwr*Bx3)BbMx)sW1>yT30ptiGhI~3g)f%%_O z!%!b#>rN=T>QQFxQffEU4z`X!(RC=y|CHJb^>McDgNm?qRH^+?!)!eO6=mx|rN*Eh zVe28N7+Vi3bp&cBTgRc|Y(1*fF{sb5^*B_5t@Ip_qb5V`Vrw}R-EV;FA4*j~eV(n; zpysi4x>7TscC$4Abt7A6Dm5F5?)50M=$VxHY_*k&K#j090Y%rjaQv%OCDh|=t$}(C zTkDl-fZD^>6x7XZZBc4D)Dvu73029~Hl^^ajkTApT~Kr#t<1_PML$~cRkqR-X1B1F z9@}%&dZ>MDEkRYYb%RnHp`K>zCa4;=4l1=7>KV3ffm*=Utx63+eT%KzplaE=U8x;V z&$4wGs*bHYmD&aM99wro)w6X(sXb8NVe4L~g>2oY)F{+<*}5O<R<<5c>LAqj**XSw z8(R-4br|XgY&`<iz}9i4jzawxTaQ64V(W3Gtg~<o!Pd!8jchGfY6{fzY^{J=%+_g2 zO@}(d))`PKwg!}%3H1xM&W5_3t#g#Jp?=NQ2vieW6H3j8`XgH_p_<uRqf|ZAX_&#{ z_yekittq8ipvu|09BK($S1Q#8btYTWP)pg`rBn`T3S09~%h*~}Y5?jSwyuX-&eoDr z8=%f->qe+M*t$unL8uGZx*6)VY~7;NR;X98bqHz&Tem5-9cl(!cR;OV>#$Ngp)O<V zE~q=%x?8CcsF`ft1NAz#?p10Z)KzR9g=%H%ex(jT&1UOCs5Z8aDRl_yTDBgBYG>;a zrN*IdVCzw+Rct+`)N!aFTj>&S2U{mARSp$q>lCOoTPu{B1{G!Nbf^qlXDAhbinDbl zR3}?!D>Vly$yOU`HCrP}C7^C(>wKs#wpJ=t19cNy>!Gr2ZBQx&bu(LApzdPpa-~*6 zRk5`V>Tb5CmFj}3W@`>A$JV@3MW}kV4nTFYb-hw0sN2}O0jh_s8<pAwbvs)Jp?cZ6 zS*a~hEo|Kim1paaQrn>JVC#0Md)T@|sbQ!UY<&qIDwnQpRN@GXmZ=W3ycP$Tv`pts zX?YsP9a^R{(l=w7=CHI(=dbAwN4gS5%XGGz?!x*JE@;y-U4w{Vna+{Z^3~9k{@XZ? zpk=yVN9iZyA~r2Q0KZBse-Zsm|Ma0en6yt(BdJQqFkbnjeMwnl&8*zocV8PFnDU3> zRgZr^yYfxv?wPmg_`ORXKls`^9=-SX7r)>B^0af_73)6my7nLK9$B~boX?;AwSyOY z^SY%^-EeOC-cL@R{7l9x=o3rw|NZ_qoprDG{jnc^^!EF^u7C5pu6w9{(WB?w=J{22 z;3whdX4AjAZ}Oy<UZN4MvNO|OoNL>IlO~m1vZgmTw>xbiaMYE2=BDvnU~vtXMzt%O zL~SiUbJLks{i|m-6Qz`8lMZ3WNJnn|$MtC;f)xRuoNsj1+yebpkh6djXYgr5!_&FX zEk9aZa-Hx+Hu})_Dc0O#W}rB;yN3vdb)-5KhY=5A7JhicukRx2e5T>60!5!{1vmod zY9$@(`h@PbtHAupCv@*#UXXf_O5DKV``k$c+53d*Rubg(AVY#|1R2IZrxp;_!}O;? z&xh`$E3MGUS3pJtd6rV4jkv`~Tjf}4Lr{J^7lTx+(#dR)%C$O~2QoIGlN6;w;C?<m zASFTGOyq;Q4_&7p5rnR%Ss&7U=;}@2qdK88zJusIel6$>ME=vd4;@?NKd%#-+2tSC z3GEFk_UPn3kU>G-LFCK2&-+1APwM28Ao;KA<S`IB2KFO-7Q}u^_xUl%upqxCf*S|@ zHar!5u=I7ETmWK^>f}lgIu7*9x|w`1Ci;Z#V%m;|^~nIpfbe+$q@>7PfAg{cv8DX$ zN_^pS-}|>_9W}GLE*y=9_*Pu@v0M_bfP)~3fJu@xHt0TKo3<7~g3C=3YEuNldM{$O zzUj4wQ+hO>7d{_{51obd>;5f}>DZQi@>`HfL0%1Gn;<rkaxWFiirC?xT~cMaBsgf2 z(2z;O!zPK0m?S!ClGvC@;^QVs(AKTmkRnW07$jr|OcJCmTu&7W*(M1mOcJRyNt8wb zkxy*7N#boLNpzVcnKww-9xzF;WRlQElY|FN64_#s=#WWb+f5Q5Hc4WaNs=Q5iP)ni z2_7&>Xv`$x!zPK0n<RS7BrywPhu-p$c)3XuG|Le_NjjsWlc-JS00arrajPI9I>Hhp zOveI(L}<1wNR;Mcg2V<)65nW&#1@kzw;Lp8?=nenuSr4&OcFk9lE^WWM9VQQ=rPA) z(@hc&m?SaVB*}z9;&#1Bf-NQqwV5QGH%X*qlIWmGVsuxBUW<5~?&%ODF>I3LE`ucO z5t9T*O%kFzH1wPkVY(|rkjOEUM9VR@3ZGboN#fH@l9+9hWWpdxyV4}VdXt1wCJ8S$ zNu<pr(Jqt3@+OH7m?Tj$Nphnk5zMho65L{v(2z;O+f5RoJ0i4Jjo4ATA3~5A-3=i~ zobH7XBtdsV2$H1xAaoM6=^g?>f^>CXkkB!cgfZ2TK9LHOL<1&?*(Qlsnk11jNwUo# zAv<r9V96w*L6d~(+_zq@P=wA73lgRCr-H=j45J|N113ovHc9fBLBjTAWTNL24$^rd zK|<3^5)POoGRGv*h)H6VCW+JWKmNDMXr>pjBjH5KB*`{|MC`mtf+drL22BzkGD&3E zB+(I*#70dLr)$>uU&S0r&=qSzl61XVCsCWORtpleFdGykRAG{Ez$6jdBvG1YihN=z zlf-G}DSQ%nlO#(9iP?iD2@aVgG;EUah)E)&CW(%jBsOl6xP`f~9&;>FVUlFPAaUC^ zNwCr+p_EC&G!NIyibwJ$iIz+f8#GCL$RvqjlO#tBlCVcj5*#y0Xxt=W3ugxOm=h5? zdmu<OV3L?^l6a*_5-F1;+YFMl>AZwqRx(&JNodd{;USYmhD{P3F-dIHB=IqmB*smW zv~W&Ni!f^26($J=OcJt960S5!BxRCln@M7Mlf+9VNer4KIb@KaJ#3QTh)F`DCJB$3 zBr<N2sCAZXpJ1%QB=LYr61GW_l?DmfDU$@-OcKhQBwR8{WY8qhA(O<0O%fk5Nn+F_ z$uWb3?QxR?Eu0C~`%gGjVUlpbBoW&r(MprVQYMMFnIw@nNwQ>+h&^bM;E+i|!zKxj zm?Sc4lIWO8V&f)>TW8Dmi6kmak_;FG8=*;pl_m+LOcHK0NhEKQXvrk8L6gLXOp+Kj zNpi#>F?-Y`!7-DB#!V8YNBH#q6N^-sBpOfz6AHdNyRE`IBh;Pg?#Qc0dILBh2f<Iw zXUG*Fm*7>)&ay-LiUs^{kdE%WLGZiK2I=vgDCc|n@Z0sC3zvm#i@iAykq>=t#T?xE zcx2@S(m8?9k&R4suOPK8t*Q2&Y=`dy($ZDv#aUzecxC;gNJW-+Odxb*<9xhSAD=+J zIDydp-ZB;4O)bgu6UZr;UrV3q6A0a@D1C09K<M5u>GS#tgzn^#J`V|k7OP*E?{!zA zSND$zA4>n_354zha6VqDpH3hzO(1jyS*E&l0=aGinKywfo<KS#kb5VP2PTkzpFlo4 zfqZoW`R)Yr;skOU=Bl!$mrNi*m-y%2t3hm>XY)x52+e<dlA%->X??PWeDJuhPu>oa zpQ@9GKt`wO<YORXxMt|5dX!RKsFSBb#$DoU%QP#ehY$T!G%Fv*1BX7bFb^%^Q9z$m zfK*<tlgmK{0}gR=z6NAGuKU~!(w5N4Vvs;mC#@i<8+FnRV%O>9jUf4yP96Xm5#(Wz zN?alIW2SrihFWy;1c<d%Cv=xy1zxA(r}`<#pdhDW?Tv|RQWt{QZ`V@=L7b1bH7%Gx zUOR#GP9W<i5V{{t=1g~<N%CQk5p_j_Y;-qSe!m{!Ga!}U*2zym#sql@q~clKhpu^- zp3@25{%p1VmrklcDu1q%+d%@q&`B%E=r47$mdI~(@-C2}-|OU)AY-^n?5~~2LF`GB zH1cgqCCE=fhA+^4EX?~xF49Q_2wugh<#RcReWgz3g5(9M1u0#n`@9Zh^ctP?f(+lF zlQ)5kgmv;x@`>r>;~--<>Euh~Q>~M4gIF~>c^;&)Q76A6(yWtnG13gK&`AKK)T$F3 zWT;aowIJhyECI>mqKm&S?gAOUOD83eQcfpy4@aq6Cv@LNTdz(&2$IU{<WnGdMVd10 z=~lc2c~}wZ;a`Q%m>}N;vG39I`32=u(8)275k(eZqD46e`gETunB|oOxg4aTsQX+; zK7zakWVm1VxfNu5txi@D8PG`<WMrLA)`FDo)yZ2yMg@5<NZ|Fl&vuX@K|TXwuh)H^ z1Q`+JAV}&Tbf2Gtj0tiIX0Q1-=sxFwl-{V5OF@Q8I=K#H_)Q*hf8)U_;bOkuf0FPS z6{Hp<utE1pfusa^El5d_E)aT6gP(H&WLOdWTuJMqRI@cMNX?Rz)rO0IPAc+AElycO ziclY0Px&Z9KF!OjQlpBH&s*SA`OkVj4cO=84YJ_&Q9<h9W4~2TRoAlM_CY}w+>YKN zNFz|{ZF;K3H8s|-APbf*XtX!!K2?o1){r2Jo6w)%uKP4DZm~*&R3Yb4L7JD`Vg>Hk zQ`Ib7YUKr4w4}kR_!r%$>Xv3JFG%BpI%`A`YQsTVgM(fwBJZJARfJl;3H$bvAj?21 zakG@a-am*`fp_R+7-Uot&IjB3;AYQ<NL3a3*gHK!rGFl&+637HG9<{?LFnZXe*ali zwcKixWMQK<q6p>u98v}T)k{U>5J=?~k8p&G8ye{45q`a1pwbm-zB`+*?oDSZ-{bjE zs)e=ic}OP<@RJiGTLpoW{a&5ix+v9DDM{1fmXY@fpQgpN*1zebwq`+Xr63C$YibAI zulrP2H8c!9>=CNzZ&8ckZ64v6k<Z|VJVHLFVHO<th)&KU@==}4AhJUzSAozY?S6~d zAY+2e1F=7$`z)YT!#Y_EQWE42ka0oMln-w4^ULZ18C8VpRhL?7rEpuI-#6-Nms&%D zG&iN}agzk?PwA=P6Us}n2-~|N)M5iDeN2!ygH-Gk`7|%HDixtrZ->vIAX`9&1=$8N zstDDqx#kvY%plEH;M00pO)d3xLk6j{Mh#L^M~~n8?bEcRrOuY5rlqb;lEt;PgNjfs zK8^@S1o<3D05^a6IoDNVoeI)iUE4geOZP#e^27N4I(-89<iDu<G`}`w4}ZxZ!NC!O zgz}FWq&bBL;QgGRM$SY3p_A_s`La%a29o-UPL7d}AZ0j*RQaUtQvovgRh?W0GWL{C zk|6Y;xZgg_^(m|L4N0o4($kXQfM~x*sO9S^pKt4=31sAeN2s?fs;Np<d`FOlRjIav zg48snhQBAs!lu;te|dz;T8W&8exj2ukinnnq(Jff(jz>!q_75G)X9>Tlx6?UBb4(S zk*ebNI(YzOOcBlp^Muhq>OLQaPwJFY+%}|qb`m*NCtm^?#0`f2dVh*?#)FGKIY{J8 zog4<KI7=r-K}M(O<lOU+Gaf|r^SKs;9zOI5y*GDMkfk7bJc8)^^np~IuakeGRD!$@ z#KuE_eyW`y^k|<?z6vsihwgmxEcx)qI~M-g1oGPn<aC_vkg28%GIPN|wm35qF5+wj zotAP=*x2y7R}sf27`XwtJ3cdO+q1cuLHk>;Qly~~=N~Yt^H~wfXJ$iVC~o7~HrxwL zsc@aTp)nC8b&ZxP5t=~46G&tNL8eANu?YkxO{}S+ESxkk2nBtW?!)&&N<uNu6FwAk zqaYOXDnTgbHG)vgZxw`MezzbL^T!0Cm>&~_V*Zv+f;QUuCz2rOKS+Y0&%0J@`Jj!U zXGwyflae6lMUo)sm69OnyCp%;Z<GW<-!DiIF+VH`V*ZRIi219MAm;B$f|!3U31a?@ zB#8O6>-4$@5%UF-Am(c%LCiM^5<<+kOM;j)k|5@yB#3#VB#3#dB#3!f62!bm62$zB zB#7A{i1~Tp6GqGiLCn9FK8V>Mi22kxdW(e-vq2E^MbZZ`8w4?5FMSYml_ZEcB}fD@ z8w4?@r4M56lLRr}CkbLU2x5Mh^g+xYkpwY6DhXo#rX+~@$AUx=^Y0`<%;#LMw_y}9 z8w4?5A$<^YOcKOw5X5||^g+z8lLRprBtgt?5+sJ02PHww|0W4y{<tKF`HPYu=6#YN z=I=;?n13n>V*afpi23ZfdW*#n^Q#4+eM(dk#C)?Ph`CV`#C)eDh&d+-VlGL7m^Vv; zn72!Um_I8CVtzu91Y-VANf7f-Btgu_Btgul-=Mcf0x@4G31Xfl31T(~Vm1h3HV9%) zihO8CXb{9~5X5W{#Jou6gP7YTLCgk0%>B{_F&hLi8w4@`vz{tM`@#20f|x%k31a@T zB#8MrNf7g4Nf7gIBtgulp*(j+gxQXbm@kk7F<&kTV!lQY+7D9y@bd{G<_1X+bDJcH z*&v9ySNb64H%o$;4T6~eRr(<2k4l1=za$9l2fr=}V*aiqi1~;lh?!n!=+`uan5RjC zm<@uMuarKBXNe-n)4F*odL8m|awc*+$fpEp2bqf8eV=<lqKfc*6}b)uJfE30y*-(k zvFK-U4#<s}XUnnJV+M&NzkZwa35CvUmL!<yYca_)OC$*gKXr#9JjV`)KIao>t{(hS zyXQkS-Go~FZjDFWxq9r!_ev7A?&fQ4-VFa;NHu+v=R^6tA7qvw9|bw%1G>*=KyDZ0 zF_2#?;*_39T>fb<m3w><ea+`3iAKNjm?XjQDWj6atn<FD2)9NoIfbv0d9~Pw(x)oo z9F@dlWk2^)QN6~f7K%9WgyI{2qx<|CKCe5Mjz%eG$0r$`e1RfddL;CgYZP&MLcDZ? zB$43NVM#*Ke~T&7&=^M-vxaYS2p<z+3&i~^NzI3b1nVCJp-tyeL9kg^FA0Lp!m6C7 z<r4~lyh#vrck6LMu(?}hH)^TE6k&}bSm2jPe|nMUL*UHw@h(C^E&%zmB2F8|lWX~E z7q@CdV~}dGk*{C4$Aj2H@%Dt0mov6O3eb8%Csa{uvYU#JE4jrk(g{_<nyV9P469lv z+^Wk3p_+CpLMbjsEz%FEc%0+hP>Ij4axEMZe=VP1)kyFHK5L{Co6q+6Boy4pXL5WJ zwAb-j8lQwhMLtWTk(kYAX?zk4rui(5Pr|_;{8q*sip=3NC%#WGk>fKbOt|-kf?N3v z1ChA{{zHa1@W(TTr8BUWp?>fWyS`2><9uwi4}I9jnw$4i(M<qllXgzQe7_81c-fD> z&yM`(RyP&<FzEnkJI}jci_jZD@`AhvWLS`0Ae4twI;DCV1Vu7MvH1K1qypc*5B;vr zbP&JvsnZ<d`&<n&Q~2Bn5)k>MKxoVK^GSou7C!4h<_n*<yQ%!LJ_u4Td>#d%F6{d} z3(_KdUI3vJs=m)T7oZJ=&m54H@L33w6FwObdVJK+=k*{1!e<a9Eqp!%vO)NK5rlH~ z^VttFD13ejQWQQffov5%=U<2`g2Lx|knO^!7KBRo%W4JLDSXy~Y!W^Xf{X~C9YjQr z`ZCC<Am0b6!2Vz|QaU~A_aK`^&Qo87;~kOnY!IrKA7LfP0pYU@Bp`CW2ZYYG`DJYa zp*xg(@?nr|BIn0I4vCx(fD8+tagcH0b2>JG-NNTGkmJH90<u^5)Pj^x();`}kp04^ zA7q;Fc@X5F@c9TxK=?ccLbdQ)>^YD*!e<<$BwC~VBJ4o~34m-7BmuHrkQB%+LApTp z3Q__&AjlSw!-CNLT*n023sQmc#a~}P07;>j`{X#t5mD2r7h`)@HJyvMHxyUVwuG4q z{*_G{B8kt|?|<&Qj%tMuUhu%%7yB^28u_$|vZ_Jyg0z7Q3-U$~3#I!l|89^P6%S?o z2nelr-{%`3DdF=okP6{*>LnOkgwJIlBck*q$X-EOK<JJ;zs2$(ZP@C3azDs)QPzh* zx<pxD0-^i#{8ZloDG726WJHix&2W0AU(+B+QRI9p$f!uw2{I<gn<*b`b$;m&gUl8& z?*=J}oWBKPi&Vb^NeFT_eq4ZlyU@@1T98pe7J}HKtPT*|o}lfm)`QF!KJNnAB78mp zLOsE6jc<Zr`lID@6r@4;Ou=1^xSXr`TnW-5d~O8UEqt0l#zZZ8KxpLhYx*`28>4_v zJ_160%#Uyn$X=22cR?yes{aOQ5aev!cez}USs-14+ypWp$P$o}Al)Dv1^GviK|$UN zG9<`nh+zBi>-97U^=H3c&x7Fdpxdh62vEY->5l-%;j><(x-fuNRjJ@?-2gHy%32Jv zOORfWQ9%YlQrKGj2tNg~L6r40$PrQ2FF*!`&$L%NZ<8&zy!~ksgnFG{)1@Gjal5PU zQvhibrN14dOOWj#1A_bq$VNfF2Qnnc?}%U<^XoPJ3Xn;9JVB5O5zj)9VUel_WS1cC z0NE?ZE|4)nz6Uad?Z+?uv@4z87w}u-8W6k+M{AASKz4};J3(d(pAyK3@OcP?-el;v z>Zd_yOYzHk3Zzo_jDZY`2+x{{oCS%4(2tt<wa9=_U-fgoAEZI#{27o6k?IggK#=oi zVZ94d148}T&p8jWT;%)^NM5A+0?2?M-vQYu$nQah1etLaO2-y8S@qSMK@N-3?*ySY zDmbm`ZIyYX@VCl);d5N1`gf4LN(E=@DG=)Oe!YGLvR?RHe6{oLT;C@QvQhZl1~N_L z(+;v(_^bh;9(B5^*Zm+v!si1ZGlkC=L3RkA{UCFM&(A>UoezE=n=~6W6>WG4NKud| z$bcY=LDmbB1t|%#fk;4KJMRaf9)7y2*XKa?h<HXpsE7ML&x4E#pFe=mc;~P8S6zel z5hMgMCdgutdXe*Lkb@%UH-Mys&t{Or!so*v)Svwb9|t)qeEt(;T$KJR5bM=?%u{g9 zvqBKMx*HJWH6XSi%ZXf}=Tih}6Y;za#46L*^7}z5MXD!2Qi2=-85Cq1t~%yK&T)__ zDrawNYC~~nI7Q;`9q^&;!f&6oAk$SUxLBJ(HVB_bKxPV`Z-8tPK1V=o;Zr^b>-`G7 zHLeC37NibjT#zgXZE=2tZvmMva()<ONccPsLhl|aS2g_s$adlLTM&91iSJW^D`vyO z=PHmk;d3Jh{X~=BpYH^z5Tpc>666CQyG71l2FZz>4}r9aRCK*AFGw6@Sdb2oy&~tg zf((e9he1X}s&9de3i5l93hXoddR>WYGW$i&wICZr&Rrn1Rr+h^O(289=iMNOgwLlz z=xr^2%a4KtMCrc(nJvf^8?$#ot_7(Pq#mSRkWP@4AR9oI3-T~Xmmnh`c|pDhQWE43 zAS1M=QGM*PAm(hMrt?6ytD1V-U<xVxZIG_FjEa2vK@JG=PLOdyJ_C}!S}*-M5E@DR zb@3aJofAs06s1oKp<W`NxgdjrECd-9q!VPCDC-R%BNNI(6KOSlCwyj$R69WESCRal z@Hj|B_&f)4K=`}>GA80VFO2pPBm!d3*4yU}5E?g5cbW-**MZRQD*2^v0jU(JJ`a)- z<hvk)f}9dTKNLA%0WvOft^yensaAq)7i2BSh#>C(sl?vM?_-|?X%J<7738=m>xUpI zk?M~i%LTbOivA-=9AsROr69{iS$U9h1XHfs@Sj1_!si1Z(}d3m2#s}q%l`l*Abcjp zkR|qNeobe9lnW9E2?){*G9<`7AVpEuTS4ZCvK|I037^M662j;EAj2Z(-+}BB<bpWH zUP0(O^_U<HAVb&}`t`aCWTPnk%^)?ZbZ?Xhph3=1?fejYXw3B6@G~GOl?sm5C<xu@ z<d^jV$cP~4Cg6xYpYIa{*(P#s1fl1p{k41-$guEvGYGvK%J+E)q(bEUX^?;*qaba9 z{2XML$obSH)}Y9F2FM=aGY_OBe3pUaMb3Hh5#+5PBZ7PogvKAgRlf+bN#y(t$bR87 z4nps$^6Nfj9`=L6=UR|$!lw@8knmXnGAw+0K#mBX`#|V@R(@IU1UV{vJ_@o|_>6$i znBdpzTOjm?D?gu~fJ_GQeadgN_!qW(pQ}Ko2%k8}5s^<F2yO3vKC3|JEm(d&>p@0E z%l|9Lm>{1531AL{gtQyO=V_1`BIloiOg>f5`IPyXiwd7<AQi%A76^?1euPyZGlb7d zkcjZ<2AM5<{sCmZ@YzDCgwG=&v@QE(JpocFe4Ybo5I#qV2%mFq!t7M|TmiCN_(VZy zJN3(I1fi$&{g&?}B7D|^&^y6=p9es4!skOE^a~}v&u);S@Oc(wqwx79r4l|<UW3`Y z@VN?PgYZd$3<;mxKsE`Vc90#yXAQ_^;qw5<F5&Z0kgdY!36MR)XAESU@cAvssPH-O zW|S^`=7Jm)KDUDG6h5y5p?976ZFmpJZsD^L<f!m@AIKizvlGNRP0!~^kbT1E`ylj& zG{3B)Ap3>S<Vqab37_*p4ho;yAoTuvKcD#^hlEcfh%J0tL5>KYdqCz3pZh?L3ZE?? z^rkhxtdD`%Vgz^$q*9P?gV6C6vT{d>pMxA1Illx#Z(8?ruBdXx4S!3y0;Em&gh8fY zUHCrLAUWaF1TszdtOB7o4Etr>143hqpU;~>HVB_VkeR~gVGw#doS)C9K;{UaJs?|! z&wdaZfBdq346<GL{03yc@Hy=k^i|<A4Wvf+%mNt^K2Z=Fqx`b)aFw-B_%wmE2%ip+ z1Hz{dWTo)A4}{)U=huA@gvK$ytRawb;qwWQobdS)$Z_HGb&#U)`94TFvh~Y)0c5@K zc?o2i@HwX%Yf$)H3K9@L*MV#jJ~x8Q5k9wqY!*JR1xW~>EXY>jvks(2_-q8(CVaMl zq=e6hKz0b9&w{KJK2Lz`6h7Yu=@LFa0@*Em{u_jzYVq4}a*Z>t0=iq}g&-y2b2Z35 zk<X1Fn}kmz$bR8-C&(7zb2kXxSv^^mwH{<hko!T#1bG<bpvd`?AlpRFUjjKKe4Yjw z7Ct`&IU;<Hg6tMPr!H_tbwIB*K=ulst3Zy6e4-%xg-<oeWb|i0pCuq;!lx62Mt<LC z0EB)S&R;wK3^GmlYz3j;hx2_t4l+adJPI-y4!+OVKxpsam-Sr`dee&Ua|C3L@OcSj zhVVJB7NeH%nF%sm_{2bH58{_q2NDrJ%Rp*`PZp$7_}mN9Abj3NMEE=e(jt650<v8A z>;hRSe4YeJ3!mqR2%n#T<b}^Mkeu*2qYmSb@VN-2D15F3*(iMGQ7Ykc8^~tivjSv; z@X3J;37_>Kn}pBXLFkv~@W0!8-wU!?_<S5>m+*NMWUKIb284cv&d=w0kZr=}7|5vb zDX&NA!sil@gTm)}ke$M(5`=!24*$C`H-YRHK53An!lxf(kMQ{?5IX3Fo14!TkbT1E zBOp_R&lf=U3!krpOcy?5AP0rdiy$+FPuW6eKX|$-{Q?kM_*?~YMC6kMnJ;{9134;u z?gXh9K0P4Eg-;2jMff}bG8w`6@w^|TP52ChOc6dKAUWal4G`L&`uU833<#fbkQu^f z(yi#d!sk4YnZoA^kU`-S0+}OxZUNaUd~OGc2%j{_cHy%IWWMm(2(nZ7yc>k}%lO~z zEguFM5k9*>8idbNAp3;RcR^Z&&o4m^2%pKfIs0zEtP4TtSMkbK=~siKMLuy5dIzcR zQwx$4K1)H43!e-~QTVI@DL+%s=Pe-Xh0nV{=<Q2>Sswt|AbdUp5)eL5fNT;z&w|Vm zKF@<}7Cy&762hmv0c%<KTm(`he69i6CVb|Dq=Zi+$PVGt0kTr~tOeOAeBJ`mC44r6 z>=r&B04WNePlJq$S;`Y27OuohR_pWtNTnc0K=z27e-Ba;IiIlzeN6bw0NEsb=7Q`O zJ~xAG5k8AS#)MBB$Ts1V2RR~q-UKo%d>#Oy`3C-Xx0HuL=y&`4-tq_t%{P3XuYl06 z_xV2G0huCv#zFQApUI8rhr;I~kTKzNJqXQ7{IV)RjtHM7keR|~H3<ExAD~-{*MrOv zJ`aFQK1=ucAV_MizD}P4X%pm^AVY#&wAh*L_z}(rp|^nfrN0iOQk32gGDG;h4TP@$ z`912rAUg&51jued9s?N><Qb4rL4Hi+20iEBgVc+7&cdax*&?2cLB>R?IUt7wc@4-B zK~f;&f~*3eTgLr*^%KDrFQ2>>q(#K@9*~HL=ffZsBGnf_=s77rpRa+;5ajzH0YQEV zVhb|)b`V^t^7FX}q)o(g4M?SkCjpWZKDUB22%i-oMd8y8vRwGQ0fc6ie*gIwkhJjm zH;@g&XBZ?ed`3VjMJ=8INeS{i$e<v90NEsRKBo!sh@3A2*(`i+0NE&fZU)&Ze3~hh z@aY5@3hC{9FUYVU{{k{D$Ol2TiJW(V42hhd1Q`}S-vikpd|m{xa7EBx%Vo`25@Z@k zg&<df3<@$2gl5$K`dUatltu54+9P~c6A?aZK=uirL6A}5^I?$v!skhlgTm)9$WU0X z*Y7}v1v$F~tt!YBAT(F^YY_sWU#tXl$IL2_L&B#8<f!oJ1UVvn)`8IDD1JU~qg2A@ z-$14apGQEB3!kSzrVF3{0-22Yk00}IKxPV`GnXJ|;d2=Xy@k+^CkQf4__Tn`7d~r1 zW(c2mgVYP3FM!MxKK}_qzjNuAbqr*V@VQ_q#unid1fidC^n2!VkP1OcASppU0um89 ze*+|^a`vuHRv>e@x$E>-@S)=izYWh_h8ey}1xM>zkTy})Z6IBO<UsO*+z&D?$Ri*r zQP$HS8&p|dgjA*<;S2Cdi&SSX$2O=^afBfB!<K%F-3n46$lV|*LGA~k;~l^5J3#0+ zKK=FeBnTbv_&(nQp<nv+eO?6dKBqXpF&B=<>~r|!KiV0;MG}sN6Onq8MDvnF?BIw= z!Us$evCb7aM<T(LNg_iANyf)blB`5mz=5O}Vbl%|nj}1CkVt&ac_LLTnoJlZ7Nn=x zw47s!#72W8?Oi4bjY$$ugz1?hEuVNI+GdjYfJu^DBuNJCT_y>Snj|)Ek~lrrr<I-z zg-a%hj2a{ovZm>&VnI7PN3FrRtNQx9o`UHpo@#-~_)u>_su*GR;r;^>r)TZ_cw)hz z-DQ$c$t1BYCQ0lvNGNpJBr)p(Sym_+Fi1F9X_8QzB%xT8p0d$m4&$DM3ndAK0wxKU zB#FdrdeTJ8ClU`IHb^2wPnzgHi7-7OqLHW_9WqIbp0?0@VzHP#U6Od1o^H^6;;~Va zB<Yze%_km-(eqR~iG>GE5*;&1!oFChiU(6B3Fl1`9W+QXG-i@$;1ZE@B4SrclC)#= z?0^<?(oXI&NH9dt3+X<=s69g`aXT1XX_82nNfHAF3E6`t32!k;bkrotV+IL_%P*Dj zgrhZT8>H<k9*o9kOP^pg(PofXnC|)aYZ?#6BI5>$hbk|VKJmz)NupyWN!XVgsgiVG zw_aA#9yLkO3K%|-lu4o`N$~!UQIiD6O%khowa6Lo?PxPd+#WVbaMUD`z!fr|c$Dsl z*6J0CC+PlXL6UUmuuc-O$}0^Lr~7GjpQKH9#tIS~mn0mu=g$;A;b@5NJJnL*7h>ry zQ=P=@Hj@PD4pQAG9vYP-8jKt;Np#F4c<X^as>h?j_+is0F>aEiHA|Ep4cXHLN!Y=7 zr9nb=y-A|W4HAygb0dDe5_UK_VvtC9uOz`>@Dx#tL@*dSZu*4FOrMB#l_)D1jFw9h zN<?c+l1LdO8EP|0xMY$T-IseBB5-D3iBK|8ezif8wj^OYMEBEbsls-6#3Zqb*@jP? z?mHE!l604;PJ+S7vNgiN&=%7tywxNTy6;rv6Q%o3brK4Xnj}_njr0lIbWf?CDjXg( zNn+F>ksv)gp{I(3r<o)=!z6LK&r?s8jL((?zaUv}l5pN6u`LD(hUkt>E$2uua?B)& zz;)6mWVe|lvPF_;FuKbm@nZ%F1?edWt@LOpoG?jpz#!oe-N&e>3diU^Mx7)=drcB8 zzuxdk(7iNTD(si*4H68cOcHG~NqpEO$z28s*}F{=95F~Zc)%p#>2qa-;mE17&nGb) zn?7+mo2u6<5~8Iu{Vg{c38zh;NS8sPcF82+jV6f>nk06*QC2j*#q>$go6YnHqsek3 zRm`Tdvbs+!c!uc{+GYBL={&7S6`^|Tb&o~&8b0yxxJeRoZjkvT@LE!XL@G@ZZ!k%+ zMUbQ&54M>kyu~EZVUxrU7$gy-_lEg3P1=cYz&1!EWs=xdNrI8^kU^5k1CoS-!RbMf zb0`?5v%6a9p-6POB>0W^%_d21HApx(WRl2Ulf*_%l00URNVq&C;)zD00fR*C*(M3L znS@S<YrQ2IjYjFI46UZoXpGLL3KHLGlEf~9#DWJ*5<hH`1f3Vvb4G75Nr=uv>OP4u zoplr>Rvs}(GGGuKz?&pmZ;}L^q0(}W*}<G7$w-9GP-#BNNMghw(FC1G(tV;yI%}kp zSZIoD`D84-)%1xBnIyW+B(d!ViQ9Wk5<6g$ctuRclSs4~BpDhoNpy=z65Dlxy|Nt| zF-dgHB#9%EgzVtBNkWxzEy9Q$vLktuL`O^#A2&&&G9mN9Zz7u{IAV}+aNH!J%B09A zmWa|b25Ox~>{uc`Vv=OVJl!W4jK$g{!BNt%K|%@ZMv)4m4gKbnUsf;_vxf{4kBu87 z5w4ssQenn8Xpm57%plmq-Xv2+A|-<)VxuNW23{jmB|~{hBB9WTNn#baQ(3E5B$Q|~ zNH{cXlB88BQ^mq5lSGCLl1PplBpIr#lKCXVbZ@Q}Pc#@FGfCXOMf!y7l1U<?1_>tv z)iPByoHs};K4OqWu%bq!!YRBqN#dc%utDNMYk^1=Pb5;3B*ONPLE_1AgCt{>wIUzP z7zYi4{$r4EoPG^WYeVc*N+wB;8YC7A)a$8m$|0OLNqod0VY_0XOcf2c86=*dyOjKR zLP5M`^HzgIQwE77hYW)4OOlWsuDng;gKc@xAmPNAL839cL8eM1N|J;liBU-+;b>ry zNEJy0>D~*iUXes}M3N}Zem4pqobYWkNHRQZl9;tvq>9^#ltDs?AxY3T#tjmRRHj5e z$*4VOlE|1rl5zWXJr$;2v64yRqXtRF15GkjGMSPDGk}dIiS0EAj<TCYKEYtP+$7No zlf>yNufHzB!C+##K|=NnlZ0lPBw-sQ94<+Mvk;?_gl#*}B1#WqUulxWh(Ut(*_Jl< zi-ZyMlqE8sV5q_*VcR6Jl0o8$?UF>2u~CyG>6Z<)7K?_0l?I6?>kX2yTTBvaGf8;R zB(VbqN!nwQ#O&BHlO*hAB0_9Cd4ojlT_y=1Fi0X+zFg*$NK7|K(w=RSsBMx&N|J<~ zEJ>2I?Y$-mjhQ5B-y!0`p;Wy=g3$q!#J3nEWbZOaA~s@@1pQj2ww9C0aGOb@!zPJa zD~wdhlpqm165MQ($dE}A!v=}RcNruR+-s7^0ZDLXa@-^_dex&}uShVMtT0F-Iolw~ zux*mqa!Ih;+o;IgLa}4!!bNBui+&OkSNiCz0iFGIKBsu!Xm$FqkHx84oK$p-@k*(t zyQ$cR)6aDYEu4aU{CAMjNa5r|wmmae?;{WAGtW&$J~GugAbzUrhuT*8shZqW<m2RY zmnglpGgs{I%cPw$IOmS8yZd4|)WYXn{41L@z*_&a9(fdtt?5E`O{UP=k!#1LQY?42 zcVt?#J=vmKNaGFEw9uEm*SGM3uoN=*DeKm*Om=k_r*$*-vT_$yl3Z_56_d_%w)f|X zt*Z;|`L1k7Uu$2ny~t&9G^>$suD7GTnC<PcT3TA0vAk$e>n->Z>@+Rc>B~143)zml zTYK8OGkuje2XDR^k#}@ufY`9EC)3x5N_J;+>nbagI8bpjT-sh}t;zIdS91|=mVjOX z(oP{XqKI@Wen_a;-qVrs{A%2~7*>j+7p{f=j$&)RkK?08?P^c2q2#UY>AU*-xZ&1J zMD6)}Ze45l8ia#1_(FT&mou})OgAlMxoOa9y@iZ*b6;l<nl}B4m3QrZPWAQt(wSVb zy_HsDwkMq#XzfP1*`C#2nY13bNcQt6t<jf{#Lb!=UM6eGfU>0Otm1VEz|LwZU+B$e z3dMC46S=Epq@(4&OkqtHjpy=ghPyCjdUvMK<AzR)Zj-W^yKY}5m+5fwpl)5r+|!?N zntyd}UA~LkS1(~TS_54)i#F*iW(rP5Zt2|_>RNsNnh;j3@=S4EKGT}%S)FyaBsZZl zq0COLG*ydi56Yr#z`A)gHB)CclS@0@x>M^1WOLT$&7Fpuzj-VbKJ5cpYzBUIFXNZ$ z&9|od`?^}Id;5EeR&Txozf9<KTvubItuA(1_@(kXv~e9b9QAu5i~4gl*)^`J%?^+P zaMdDgh3%`^k&-UzP50+A7V6ZE9^Ib9*6uCbBbEvov3QTM+*!z|T(GUB`|}(e1=fHK z2IE{cQWP@_28xAt)6|q%i*9eyY8pFIy;u`{FKcS<U&R%lV6950sSaKj&1L&&6zjd) ziOFf6*2dn}CbTY>3WPLn11&}G>@C1v=x)gLaLKBjFy?sO0*%_tJ-Ky}(+SD5$?42G zYA&MQ-K~rBnVv<N?%u*W@^fKxCUdvGh~J>p7E`@kGuO8XKiI1o7f>Lz1$ULZKJ;Gi zi3|<iF#$Ir_V&Jv>5VRN%R1};{1`!&G<WqDiUw=w#qi|2QFum5LKBiQe3`Vhyg_h= zXzhtZIFAkY(tzjf$9&S0S<9O+4=4RSt)2PR-2&tbnY<4W*1FbJs3mPx8m5tsHpbp! zFE+e%rm4LL+ljlA5}+DwhYqd#G-lQUV5JOjCN&hPwoKcAzTDhSKa%YGHz91fh`k$? zy%6&Ocl)M1Xkc{*jC!x%xywtnWiF044yqsT%5xL}?aLM60bdaI=~%;qv!BRoPM>(~ z>65N>_khZn#)4KsR%4x}GrYrahiv7HQFC1@m5FL#pj_8l#d};19@7Hs7I`aJ++WOL z4Cmpl`j%cE)I8QwXz%IE(YyuyQNT`Y!~`2?2&i?(7+#<;!ZR$yrsSsf9NTl~OcWzU zu7#{EVo%*s$aH6VitRZHzN({xCOA&u&UOV_+gqSC2KCoZYdyMShUYpAo3q{d9I8nJ zC*{hpy0<&u+lL8&%XxpC$+s6Wt+YvyUp<CNKNWr(nu9TO^SGZOs~%K>GMQ+0;y`)S zH86<N3?-kZ(UnJ4s#*{2o7#&Od0?jJ?s8Xi1v(ITKf>lE)sF1hw+bCQ+fBP7KYMS= z>Xycvy1TnApq=vV9d~Ead1sd}f%8PCk7A=eF&EMfB|z62A}FxSoa?#Cs77nrbN!gv zP%&6DdVV|)1mKB`GwsG&LFeg}el#uc5;`-;Vn0@^hcLkOpl5O?<6RX6448Ii!3dAq zxx3q+oM8jOOo;|ARUW+Dsa;pLlQ&ssk)zJ{^7a59ZPD@PVFi0U?CydQTI)5vMMqcn z7YgVJtxYtkwY;TNKGQ80c<)uj%sy?=XimTNt|3e)vYqP~@($cuR-ldxCtnG7=hxyj zRF^684u?iS`ms=BK(5Iau!qLPWlhG?bnD_mcC`S@#nK&OiJV)d1EV`Eo)lp3kIl-F zExoOEg)HhyvxQbH)wkz5byU;4wuiXpwIpu<m}`3bF}v2in)@-ucJpQ38i`u8LDDAU zOir577UbnD)%3ULXd}IgCeZG8>wr@0RN~tHo{m0?rZCPxM$Nb=m0GZf8??G%K~)p0 zngywrdRDa!ix)erdcnemg^hJgmtnP~l&W>p+_J>6HZ5L)mmyHzjlNv8u(4*ra;DY3 zY)1A@MkMHGteteJCC&A>_;MLbAChud^T5&;Cr$Ifx)!|kgo<rWDOjtk)Kbq}+w7>? zrJh2Ksuw!2d6}zf8y2P(H!@^d>(sQls<F;3-LGGBB&sdcs0bD|Hn&u_G`TTWS2c=- zmOF51gF>eKQ!Pq1)oJBo0VR7KfM>p#xcB9AI1Hivj75FE^|kp>E8Cn()Tb6Yt-Yuj zKl010s$pSWqpKG-FQ|5kW14DdwzB>C*0sF_9H+JR(a_PV6MeYg%xV@iv{X6yvaDuW zx1eQVW9?#3FRf}?Sk<!7tqY9*hr9QHud3L>zIO-$Vu6SvO+8{1RKU=STn!K)C{3E6 zXb33~S|SM;tOvn@h!+tRJ6;=Hd&iE7ii(IGJ9g|~#s2=EncdF`mdm~G`+fVDlV|TW zYi7@^S+l0@nY>;jY!;0ieE8rYM-G<Bt)zKdP*Gf3O0%bcD!aIRYC%<@>EqTgOkjM? znpQQj!1SCASLF=Twv(MsA*KZ5b+{E!+%ce4(yF3lPAjisIK;eDElJZnN@*slh6);w zs^3%#SI9;d3>(p>ppQB&!>g#MMitUmH8i#1dehjpPs1n9s4B)}I0Xg$hvy@PDJ9d5 zF9?+-MKds$G>FW&NfDivvJxk|H&&L0#MDC0>g~iqy2EE+QU?}}FPT!1-Jxp-9j#kl z(0BTDx-C3+<k>u^fjWdCrqU_p$IC%pjf3yCvwPZA`;Oh6?0)80p!QvJJR&o6=1{GU z+3mY_wYMF(?PhP=bBnJ5)2J@XioJGMw!C{Zsj_LeWXr#TZ=c<rSlAb}@8XBq-VHvR z83{`)@FJd#(~N2AA7+z@rXdk@1G3EtL}?r%tn?4E8KhLFB0ER<8-(IIkyngB6{U4E zO}V_ns>1Z~Q0F6EGz>k6xM?bz=1ssHqQw|Z!zadQX#ry}C>St?XfeiEh=wt3h||3e zR4mkh9t&9xrbCd%gQdqkn0Aa`vf|!it|^|?G;+r}Q@n=V(s>N!RM3PA=WBTAGzdLH z4Z;l%tfnxh2-hEW4OlA!nj0$3u~>7*<xb-ec%hX*@6qeA20mi+z(c$P8+eJk@ZP~e z*EUp)QXRZPl<JaNgrYoNw#2DHg!97v=^(ZdGQJ0@590Qtqj8P9gd!VvN*miSQz*Jo zauDB0|2~LslpL^!yZ-@qgc@O{B@v1Qe1;IPsK&9qK_e248U(?na}2!F`Y!N?76MOE za+KX4d5E(6WG`d-t529FTcY&#ez!MD?@$B1V-0lEw=ww>4X1Mr{9S6GcddcmEtMWu zD*webtCV30Wlj)bRYt)8i^gd}qD$-My*{mDY7|n~ylA9xa5LO<QR_=FGV?-iuBUg4 zd6ZSOqfjwlfrA&$6qRNAy)~se?9@IgEY~TmJY2Uw5C>dor6GDGf*KsFDTba~+IV=5 ze-IHf_!g6uk&JPOL`9WtO;PdO(niH|{DY|2%G_^p1-fY*B2m%cUrkYoxWzKgb4wdd z&+!kUDYmqEXB}b+8H`oNgdB2+d6DwR1~X%R({Z?gU<*|%`;(}y&lGaNF3X#SJwkT9 zBQ|#?H6;ABZk~YCI;ILZh0POissj`^YP=&FjWl#)?9<SVu}?!c#y$<*82dDIW9-w= zjj>NdH^x3n4~Z)3kXB3qOGrdvVl-oe9E-7s99$Vk=R~5Cl}gp%ZX}%EJ(RNa3~5uC z${LD#I>%^=YnY`E%7KJc6O$Vhwx%d$N<S!rscxQen(0n9grrxaQ(&4>e0A{afE1^W zX`MVtr+ZndkmFpQd{gLX1|g@LG6^N{PcRuB`J<3bk=zQCm&UEXFEzC_^Ly#u8b_cJ z@%0>mKBTw=p5n6rfu|Igz*A^VNWdQ=l20?e83+byQWlDYGUv~*dV>8kys6^-BVV47 z|Bx@t;7&YHQX|V%YDm~txYMO=E9_fOUJV}8rLZPeH<1&RGUc4%OHEb{?#5&&>uYc~ zb|bxeOc1F7)R^=rYb>#G$3Te{4b$jOr=hV>w!)Vtz%;T=7hYPnAUMTbakMLvf^rt4 z2Odl$<J@6lz*-Sr+!O>IC8uHM-Jz8D?1mh$D~8@8s37n#6)n@Fw=^oMUuj*8W~Fs8 zI+fPNR7G)@ke<bz(rQ?kDU|joIY_%1RdZK(1!)gcNxM7rX4ZX0(;jyT#WwDgHnw4= zP;8^*Ahr`UAYo>TL(E}fh*cKBU;Gm!O@avMZpOL`2BK*bXWYTh*0_V8t8oWEQ$r3R zDaBrrR!AY9aI%BwsR<KeB7OcshZ>U<XG$NZIM*M=FU+4lu2Bv*zi2R|S&iXlS`ChY z*ECBu0<Y;D1Fym8jkm5N@R{mHObju+N+TrTnw&k+*5sZl)O4JlIMchulH^b1xJyi8 zsY-Eny`x7O8}QeuxZYC8!P`R1Sb}$ih{Tq8@07JIQK{9$5fWTYENNwzjyWX0w9cW3 z2GTKiT5OX(zBMqWiFOT~TaA4hKWP$?jw@|i{IN}UT5ao0TTO!>)SryM;ooZ9U5-Ev zHDnenUkdavMt40hC!Vsr$@P=YNrA*xK7}%PYp(6nt(x-vcG#+G$E~_{+Nx{kt-5yE zs%zJ+x^}C{)zg3)#F3iyX&AjcPv=yWZmF3s${c6w?(J)K_aa_n0I5+=%j!iwy`xD| zuqG}P@iZ=8l+rk*MkdDOMI(irQdnZM)$%|QveXo2HMG5;vF|Rkp;BaK(vXiY;0q;j zD;!=@x5AQ|<Qka0_|@c`LN{HM%B@8-;HWX80n49=sAaA(qOP+WQImyQ;+Pu4RHydd z;=_njEY=aX8l&rT#o`&z!x1z~E^CNk)GZoC-z{AneaEdw(y*nArRxx=amsqoppHm& z3aSZ&Z<@-{C8I%Ik={Kl9xW-YK{^qqsBk=|bh7c>wk{fRrIU=M2Pt&>PL=BCcuQS_ z^rdqRr%nrDYe-$hDVn;7Q-_G+dQRyQ?zwF};o?e{a7zyo4qHKZ?QW3hxQm<Ms_?4b z)I_H^$C8lZUSl#MoUx?D+@i_B(OqI3O-w+?bStO5rN^OEq;c^Qkj5!B?lC4W+9_l= z#?YB-jjwrjqn+Lns<DrDRbw>jF^5phV=ieU9^whbJ3<YjZONf^lqp^!Zh^-T*(Sta z<3Y;OIl5kHdHc(`T>(W%0h_<lJ75b)E}OUPdze`S?lQ)RF;=reJjQ8hX&6Hbz0-IJ zySkpeHRhfegXb7S*sq<X_E<wM@#X0uHA&~>DM~uGR8@&{c~MTKyHO9;#=Eiz5#lVN zM8uiHPOdkzR9K7dUEbh1#t`;vrRK4QU0hH7Lre4BfFmTAO$(jVFJnvR;(7|L<@X{T zA*Hg}CI4<bLcA_Ljfc@`Lgq67Z-Hqzj4|n0A*Kn{{g|MJh}00i`?*0)o`N^o?+(ld z2`+P(;zq}kMz|j#MEHDSoHh84A<iFiiFk^9=@9W0b%}TieG3us5~fEy5aIB*5)n^v zw}?mkJw=4yC8e_IQ;SqiLv@+^L_WlDd1FMEm09o5R~jyBjOem5SY*E5aGCr^*E#Zq zhszVCMZ@9ik7!6D#8_s<Ss=J9UUKaBB5p`gqW=*|$WlgVo{5YQQ*EQ~?8PQTaAPCm zV82pvV-g}nScZFHSOy+L&Uqt;hMmo0$ayH=p@f1rk0EFKZA^&4C4^XpAIbL+ArAW- zVz6J;gg9J6h-IK}n3V)QMI8Gc5q`nI5qb_W^pE(~Q^YaqyMNqw)HxRP;Hay43<W+U zFE1Q3^B8jOJF4&Cu)BQ@G4$etp^#wAW5}6LkV39{3ONoQ5=pjs3_16TM$J5ioQIF> z9S++(hMe;Tj0!uO$B^@&kpsid<}u{lt9L{t&11-UaNqu6-{vvoY`?t<CEO*1SiFz2 zLQFm>#5ODv4W6W3M-C4a-GJbg+klc<Xsuf~?ws!v&J+8ASSVI5ArvQ3`bC1Ugb>TH zP(wwpw9g@iUcJHr=qcow*H<5;h2r26LM--+tq_Y#2(h@Iu!VR$N{DGtFTVw$c$&ws z^MHu<^C?^;qVA`0p;vg6P#Eq<b0H>=5@H%Qgb(OKEcQ9XV86EuakvDRWjLQ=>4O0; zjNmyG#(+q!=_%ycci`~8o^Of5K8G2i-uuS<A2x`6&qDFD&msSZ4T~0c`y6G6L=c8( z6#M1%jWF2fPzZeo=S3LobBMuwrx=Q)eGW1BA2WuS0$PZ1KrAlyIm9s7e)Jd$$D_oV zjtq;<FhL11r3B;>Vl0th?01&oQ0(`Xq3F1TP$=$)m=PZHX=WrG^MPcT#}dNfm~S`3 zES3;s;iJwNk0@cLq58-(%wq{*7V{lwn8gx8Ed8VJF^^&AevxSO*JH?e_%Jqi4u@}^ zqYQjiXFFOdH+bMV%FrRkz;l>kP^1bSuE(%5wv^9W!>@2DVJ7qGYnaCpqAZa>hDWu` z{bV*2ghvU5;eAXS=i)2ZNR-WYwjn0_;cbK^FIs!+G4!J0dC`p5W5{{fi2O(eVV@%m zF?Sv#&UrC+J%<@aj)*dt=P*NFjKMsI8T9FINCX(On2=KHu;HndnE!EdD5QWEdR_lM z;g{(t<T$)ftQ_gt)OUHYmc$@K2)86GC4EaGs<?5zwVzUlBkoedF*_<&yv%cyAzHkS ziWje=hDM8*d5(q<)up3`MwQ9`&^r{>fEEtP`v^S5INYbj7|jRbF-A)ZF}fd*huAzy zjLCdf9%Hk#RK}>@DZoGa4n3p<USBcwV|6ikim`RBRAs4|-_zQyakxp0eJt-vBStkQ zIDcp;MR7`dqxr)_JRMRf9m5na(V>7+Q|LN+$?+a7_DP9OK=GmzP`u~_6fZi45{-@_ z)fAnGO&FeUzw{rTe^g3z0*V)%fZ|0bpm@<SlxTDesix>06_pN;A>}1Q*!Li$;w~Y? zVmCwxvABdVOJ1}qKgc|X83x1{^sHPOls7D{H6AIPM30s}jdBgA!9GV`A7juK4`DHQ zTRntQ>5&vmv-?9V`+QnBo<1>sMC~pTp_jOXP*nZxB|=<2&BP@xuK@wUs*xo`qGecW zh*Ly#1EO*n$+jh-h?qw=vZ>o&xQuBWQoV%dVZ1klJVu;Nsz(N?%rTlXz)~W~w4@r+ z86D5Udqe}={W(I3^(djtad+;BGexU?Z%>a9mrn|X1ufX_Bgz}1M?IMBK%%^s6k_vs z3JJ0KB$thOu$ndzaeZx#BM2nE6^Oelsh6JwQX@wYNM)LhNkXwm=Nfp{^4jS3C4tve zw{#Kmwl)cs?muGlRPK-XQuT0aKDH(`FOt5-rU_^({<RR<=0s$RmUKx@&tTS9*APOA zG*W`tiX0-mDJh7#2H9?wOW1D`y!{7*d{5&@`VCc!uKZnRqRCJ19!gw#hO}u*Wep`Q zouiwwqVP62Zh|5-R!C?UN<RHAnOQO=wk?jofpmd3(DAm%@i&MrC>Wq!;_L=GS`aWL zw^L4M&Tt7XcFu9>r2&z<$c{R8FP(!rwC|J%UG2NJ@6@eRw=P{ehKSs@&&lC@)I_2~ zS587OPUGqqpRuEJ(VQ-&7Zh+Nw7a2myJGD|##UtR#UV}3x54JumRi4|)2_H={EP|O zN#9;M{Ww9JEv4Ch%UnJ9pX)U2?eeh;zP+XZOE}RXd>OvbzSnZwKv=ao!{GzYR?yX$ zU#>GWx1DyR%$_>U5c&5Yn{%(^B!!dN|6NxXehFvjxOTxd+J=5RhZ<fS+Ur_G!duy{ zI?Bj4;LhR4IL`I_bSde%PEKw+GsIy?=HEE}-v&?Cv6j{ZFnlx1r&NtsD(%$}$Uwf4 ztA38%FWlW_TyEN9JPW?2F0XlS!`xh7ZQKCFw+}oA#`!|~bc=Nyzs@d?p3PMs*(4GN zF?QE$<iHUF2lVdIl7D>$jmT>mr4AXGH@MfJzQbE4YU6P;zXkk;I2l<Ar%#Wu?mS=R z*k0^zS!Op*s2p3x9?B)hk0poLGr4feSbcM@4U5N?kDpXIwz^BFv3b&(v6V9?w1edI zaC&Abrt6$WPAlh|(;OcMl@(1duPiUEO0*ufe_}{QRoT?C6WI16p^j476t<b;QoPRR z*WT%8;w74{&iqKKa}d8e${2f5XnC<+@Y%xIrJ=IMyChck%FSxn$jQn|@c0lcLo%k? zErmrC%bIKv*;r89T<!u<eyjKm$tcm5RZcBuNS5<8grWSrOL4lDqvdpN9S6sltBvC% z70<R{Barwen}Z#|eZY?3fgpa9N(;K3RGR<EFP>(O8!&0+U=62kN}A2ORi!xxXYWc) zb1qIPX-+_lq<LqjdsZKax?VsSetPpQ&HPt<lwR%D-_xZZO#GEzo^{x@b10|?^#VC8 z#v#z8;*WexIzQ&VTP$yN3~M{+2Z8lc(#h8uTJEKNh#V!i8cy#bFTKmn;)Og%lAA?t zE`fLsyhAcfD9YfakP`fcWE2%r`I=1c#`8Ny6DDGaE1jnBiN{JxdS*2Q9g(~~!%5ex zc+qoXqOa?%u>8WYRXQcV9bxjU3Fc6TB{~B^Wa(fUlN_HRJxdmW$Sye_#3(11fw(2_ z0!M>yfgEX&{0hXzCAWZ>hh#I}GY*tq9m##in7qqsS({n_Zr=nZd%0!FEd>&_Ug%wj z&$|%yZir?j&#fpvUco^u6837yAz_QO4pNcfq}-KY5VEq?Ln<+(a<;iFo965ZQ8h|S ze&myOw=+Ah7L1=!TI!a{iMWL`XjlBShW03t8<H`lZ2WY-G~ZgbDd*9|NYPeoa-c0T zfw054_P<tsj&<|X%is6h=hwseyAhw>CAlhpn?ZQfB@*SN>aQ|T1#B{?WRm~MLhv~7 zB(MrR8=L`N0v-=u16G5pz!SjdL3ootf+vGbiBOWi{lL?}!QdRQ7(5-E3Z4a?4ia{9 zDTvKaJ^`K!t^pT<pMvLso54lkUZi6&*blrAJPf=@?!5Ovc)G{*N$*pdj{)na=u<`b zLsn^3KCIq_%)JY(YT#^_<vyDI_l%~DgAysx&B!ps>a;K!<_AAb`;04tD{$M<xS18t z7>%qf#ONgW4au;ppxNHOl5P3fb4otsLI&V!t-Z9nHP2xai3;xKWO~tazQdVAzH}*s z9PnlIVn~KH9kno$z74(Au-Si-m2^aPgYs9`wa8ZTyAEs#UJteb{|)LLw}3;y+d$ck z+ri^N>_GBF@LmvJ=K=5q@FDOg@DXr#-uEadU3naA4?Y3*0G|YVf=_{Cz%`)q@L6y( z{(s>Y&ujDvIXKR2emm5h*YppKv939<RqVzQ$Y0LdOsXF@8~<+RNyt6<acwR0zQ$dO z=3Pp=@~%EO)+N4#tR#<@!9BoNz*gXEpkDC?*bjUgRI~COa2)t9NEvqC2PMl7K*^lE zrwJ8p`^bL-e!2X1Op&>|;$}!kn;jXUOBubZo_B+H+X%{q5)t|y<b?9cmM6bOMSIVL zsEkVBY~@a6%t04{ZV$!9yA)5!r!JW15`Q3Fiu=!CQ}9>tAn-S^EBHHj2$+%KBy+)9 zpyV(CJ?s*b!ydI9M-j~gcS?~1owsR~rP@qgMy3h=y{n;jLy^sDSl{W9<={GmSE``r zaNjCR&wlN$I;$JxP&KBiCKu8?!^t@xSdVIBpYoyFn#`_<b{e_@TZ>){$tdQqik+d5 z!6=(3)z0obD<S<&U{zBqyzs=h(Py0HYo}VN1f`wk%{yDebH=Wsxe<}a)qaTM=~`Kv z*TsK>^(?+6K3`#wj~gI*m*lK`RDPk~=BiJ=D9Ss4()}I5GH@qwCP?Eac?O8wlhiE^ zZIC2&htnLq0&D?Z2krsh4DJQ409%49!E8_o*cV&}wgO)V4*<UdsdtjR(`f_l4boOj zP69iCcY(C6lB>Y3;EN#Hm;4gM&Lua22ZNgl=OPU6u1?*ougHr=j_vT5SJAdZYj(=2 zssoF;;-djAab1oueb;bv&^;finX_Zo8!`swvi%aT6zzxGSLB$z+(PD^{^8bPI-sTn zd>d=vt8@~?d^EABolNu}HJq~n`VSm4G{2zVkYR&*v1!++{%B0yti7aXIyr!ibPI+| zHoiow<I%jmZ+lIjFvD!xtZ>D#qsK9*tWpC+`jFWiu|vEp$6Sv?`~CX<_jX;c@LWCr zM5!R(G^Y1}<$X$G?PO)yq)J6@aGxQ0Y~o!o{ICJTP59P1kr+QA>^yW>A1CnKc|zIv zuxsxD{X3fkx?xW%JU;AvWUs-)N3v1)p8nelCzekNa~w7#zgKVLt`@2h+b|Z{^c_|( zXh>e)g258)K;BR<>uKEaIUv|+z&k@_SV@tyKOB8hIr^7WnGbyj*#lU#h}CHh>zkH! zxZ1hii7X@NRy%v)*f%vCv-*|y6gd0AaBwPv_af~AY~IoUzFRDxXa&yR5Vo3z0!n<n ztPyU^>?uTj)H_o8<n$WKJ=Au`dY4sk{!@W@({4EZMAk-ygVl>f0ApLv6c6dd0B@U$ z0!m{VG8s}YtC@{SKMl%}yk7P!tV;9FJ#gPO>VCLA)X6wE#`$&Ytm85UYvWl7uMzZF zmOivlC(}?qX}i|TddL!one&^-5xSfvpxtq6Xx)ZuC)|O2Vd}r(1?ylkSPqht0!uH# z0_=XhtQ|suX_r$In1s8#bug*zRmJYy6OB_VoDQ*0Va@BuFpPPxpWl+$RuqR8M7^w2 zLJ@YFK$sgMu%dlhiJ!K6ZHDIA1K|3Y1K?WV<1_2S6%=Z~8gi=!a(yJ?iW8re*f5p$ zde+q_z5g;fs9lZrn6&#2DswWKI1G1>#B$9MhSKDwG_1mw**+8bVs0Ove@RiqK-r9^ zmVeA-M00;6DQqxoM59E0ZX*>$M%yJC*IjUxAtK6srxkI^1RV^iVvA71-O_Fp<?U3u ziK8sU(>5Fg$l+JoGSQq4$5@mEwv+2oD(MSMZ(m~_Jf%0x8sYP#>#LkzG21#AJ;KzR zT`){K^oon@`%Rvh;>zfs3GNB&%hdq!R~BHu>t(Hu#F#CP{U}Q}uW`MZK{h_pjw?r+ z!c;(8s$SMY8?4nt^P(?OG63^nA}$;Aq2-rG3@WTJ@>F^T+4sB0Pz@;e6I#c0kSX@X zBU!Gs4w9t_MFmE~4>DlG++^6wP0>_i4k-_^Ekl*)mZ5;{Ib7zQQV7*GFxyacz*$KF zgD3G<nlk&98%jmtv;t#OS6f1FoiHS8vsdUfu5y|8D2KmElZhrRvIbSQ=#aS`JD8C7 zfiT?+y;M=<*30_Djioh;l=Ts4p)Kr^=%v=#sE>@J30P%vPViP^^(VRExH5y!SpB#m zw%L7j_@yR+*_IMEMgFT2HVx)jFB$h$_SLr3=tau3GeZ$&>+OnJMn1~oR?(Ol{qA6C z#!C5$ugp2f4W?vT2`BoQkTq5+br@JSzCb3~3P(9y>4j{Lq_cD>#VVI>W$Kq*)q=y^ z7n{@AObVsWH-xD=0ieLBMMw(@jEzZCEKR2Fjf9RbqA(Ox8L3aT;q}rndO>vWao^&e zS7+X?I6Y|PX=QJy%6YXxQD18~?5Ph0rde~B8;tCdCp$l^8P?GrF=wbMH;Nx&xu>ux z5AO(tZrG%Y=Y)s_<}@w!^-M;ZYJise%tEsziV=^i+q8hOm?{Yi!~QWBDn7n%HJFKm zIrD8Nn1hmG6i_36UM{;u)_7I+w6)=)02+KW(N%nAxT!)2M(QcKXc|=NQTS#6n`o-p z0@DWETFqzjJ53&#l)Gu+xFilgk~r0i^)gGv)c98C6rxg<S6*a$0Wu~-ZH!zi*=I^Q z=kKY_s$vwWE__QVWnUB)uA2xIuaDf&uw5n;S)G=yWQ?#?B2Ef<Rx65=gw#}%aPJRA z-8z{XVIRn5hi)pyDwDg%yDzdf+)h>bc@eUp#=Ay(NxOU0q27~fj*XB~?UprB>O2wv zT1d;(*o^05)q;7qY=%ZnU^QzGX=;k3J~<@!3`Zl`TWy8rHgi<S3BWL)Y2)fvW+p!? ztpC8=s1$|t4P&k}4X|u(LtWO)#PniUQsEM6x;Ix?2d`p_l`&;h+Pcq5q{3z@YNIBP zBDB~>+$xfZP^yv``=qkQu<NvPvQk?1g&PlRAWbWs_Jy=8HAS{UJlB1dm&E7nv)giV z)lrg<RM9r#k<6g?TraDWD<DGibMX~Rb7g5XZnk|%e_I*o;68JVl{Genku+G5ngXB~ zM5__oCy6y0ZDT;w8YqfuT1=PdDmP%S5rrYsNrQe7O>0n0erU*#z^qV=CZrRz$pKAx zc;-&U+}08@!V_b!52Z}T<Js^#yl$=A!CIGUaEy3&z+aC14H($h7(Pv(d2e?+o2KXG z%Ws{Hgm;Ld$+U|s%{y+@7(z%&u{{`6`jbX4j9#sGJ<E8w{d6OTmn_}Za;`&xdELb} zp=ukOM5w&okWz+?iBDU!t<gyH-U3I}k88qpxT=a$MEgwErHh&IsTQ2ufK%-qZw=Y< zlCXm5U0y!Lq;r3pPBV|M_N>isWvFYt+>&G}^iqv7t1v~g!Mt7hSWs5ZjGbwwx7A}o z(R6zb1Gc)t9#>dt%$O!ul+T{QVNDA0+OUINpOMJSZQnLO<Ad|E%kvMOv+=q1^*hYp z;hLsPu6p<BCoeg1w-a}H#>|yEiOjMGPr3fFb3YxEvqSwkd$#^(b^CAL&EI2M-krPO z^jwP_yUtu@=Ct5DEVEwI@zo8QfA)IqgYLca=C8(-?)htZ`!65ZbluFhH?*x{Jo#1L zpUAwb-naGNJ7bTByBwTdx%>5(Hc2%3bkebtu5JG8k3)X#dqj5zv>AhhZ_MS@?Jm!* zD42fpsh4hQeBwnJcaNNNYtMP}W_KFYsoBA^7~r05_%3|sse2n=f7sZGyXEHod~N@- z<Ox$R`gLs6_Y#$#o^Z?_JMQT?j~TvS4#;mb_?7LRx_kV9eeS3};ob}D9<op3#mO&r z`Dy!e7Txyjc-E3IE}O`F;oVxh-_&wstFKCWtiA87wha$yG_(1zBVSv3`-lq`_T0bm zUC7+<ZOJ`$b)7R``{?ms-^khJtj8*Tt2k)4OP1WdTf56U-0}T6ZTmUSO@{BK7k@ne zn>PlwY<cClUoxA`{;ueNw=U_p@30X&cl!MFPe)(I#9^&Wlio{rnt566TONDh<^?aU zJARj6mtR}9;J5?l%o)|`xJwT@ylN$L&4zF2v&CNwdGXZ8M`Uk#@Ao?&z2~7lZ$9MW z<q!3rkoQ5e{Pz!S?Kn3YzC-sq<;$O5s91F7fYp~AkXXFtv2V`W|F-pyT=f0gsyUy& z(0ZWbd~f&;npbvpkLB&}*!k99=FUHO)bFdyuQ>6tnLYA0^u0B6!UN|pIo_+b;@9}( zPdXg%(wjf^xUl`YeIH!)OXf4HJ74ui+lr^w<V@RsW6$=?tr))M8)sA=cu=!Z2j128 zsyEx*cG!m2m)z3)^t0bsdTzI6U-qu%oxd5rXO|X_dAi%gCeGSpmsIpD9X_yXS?0e> z4t(i>13T4ytM3=c@7V41-l;oXv)5;J&R^T&wnsWIsvK~}r#+V3^7PpkKhdTCzR&;o z{lnGF%Nf2sm;dYi1IoW%a?`BZg*!gku=Uf+Z=2rzk|Qr$UVoRJnm7BLGT(}}LLxJ< z!+=M>dSUXD%iCT4)4_93dSaK`yT0??ll$*+<-$F>-+AqaEEYK1@MVuY_MN-Gu2|e^ z(=|6P{NkFo^Iur}+Ngu;Ja+dl2mXH4%J(-o&L+dR=F2^b-mSjl&EFgEJNu*q>bCs( z_6y5Kz4*+B!}t2~nMuDMbt!8Kn6RN7eZIMN$1_^qv-yL=ce=RWC2w4?YU*nrp8n5c zR=2wBkZ<l?yf^7Ed<Pxhd6(B8S#`wNM$epA`LET()~}v>>)JO*@A}*~7fh}?py6?h z>DN<uA1>MR<$V|4|LjROojmvB8xHQjqDj|Ah22gcwBgHSWrrV+xq-Q9!?)YaU+>)c z_I=;^uG73X4tlv=uP5)%-u%(tA1oi+=G4QcH(q=h3sMZ<LH9J;>%0%&cdmc!>&^Lh z|2Av+@yFD8Z1Y3=Ej+i;*-!lVGn1R$n6pS^W}H6xr=J@iF}2p(@%wCO)^NYN?=(3p zvHs%IE?AM+^P3yD{{{IOKIg3WX1#ZA|Km>Xy8WbKSGRtm&bi+<>$qY|a&W&x_S}DN z#wp0p@a?tF%nmIY3|~3r=|)$NxVGtgXYO#)Z69s;dY?yoci-W>UEj(_eoP2bF5mp5 z>0S@M(0TcgM{b$?d{Nfr54`i~J9jlW{=~L3ZfkSZrq+&gzu_Bp`P$=FUHIyW4G%y4 z%qb=7U-@W{6TWDB#o@(|WbAt0ucOMbnR{Xb6Pf>fb9ypy<M1VYzI^u4KE1lkIPrjE z>$f@jmfM@`P<B|u{kOwr&ozAgS|43fF=O<YYa1W&@4VwDz5Q|i%!M~ioOAgpC7;Ya za`9tKzPw@hmfU^7<3IO4@4^;MKmYEL+dt}cXV)KVCq`_(cG`o#?)2GlpI^lqoE`Pv z2g|=&)cNGYa%PqeKjzlUyO%cIw0h3swPjD;aM0$mx8_tH!`cADclL7|p1iupprhW~ z_t4`e{CMEb(-(Yt#+DBA)_(HxoK;8fe)KfvJPqG(YbVXSV@#(*r+o8$&LJ0k)8?hu zuWi+--`d?9KX5}?=k0!FlBx4fdT-Ga`z&j<xz@u+WL$F9_xI%8^wOMXOTWmjuJy^m z$2>6Ugm)+(XBoaHe?DXR%VlTWan$`;*Khdll&+UwdD?LgY&p8uqN5Ky>4%o5VNc&O zd^_!ZX0yeYE^7LE!&b-CeLer7fA{)*`pXRut-j#yHt#q1_bH^K_0D?lF@@{yt{l8+ zPMe%M`Oe05%@5t>h0C*7-}YeLJ3fE^o&(O$ah&;vZ|!G|C+?HI<iWf5yJoN1H$Qhq z^M&7@vAk}_OJBM^dC=Ok-(fQAL&JB)gbCAD{&4;oxwVdcbKzTKdLL4L#WM%3=-c$B zG1-Sca{ZyFu||ps(M0AKzi%lWbouS44g042g!U(o8Ts^$wH|w{`+GC{-uT$!QL~C3 zWUk8ajeqKvi7zg^?y2YR{PwLIKmOO~H$S`O+VaPa>h*2iE|asLAAK`($A<5<kq6Iw z=pXwoI5GKc_s@5I`@<jZ@Bh|6W=*<f&HL5O>b75so_0XD5}8$Fh8?y2b^9MaKl{pe zIz4{mxRZCDzw<x7E4u2n5f7gI>Ar8A=Q!$fBr*@Y=+%W)&+fGQ_D%O`+W)2Dw;a^} zzOT0%RFsjd_w?o~uim4r<9urPW=(FnU-F`bb?42!x9Nzsv(Nds*TNSV<-YR#N3VbE ztOJkv&~enFPGmNDdRXnoN1iw5fi9QTKX>GqUEdfx<M_HqpFd{zL!Wq{@0gL}n9($R zUvD^XZi_>HJE+O2A7?K8Zv2{$Mm&AmN9T0vvgFojPn>$`((aC<f&E106N4B0Siaq< zZ$D7G>cN>~zwGhu$?qR_;9gHXf6<uAy}y3`gZ`|kL}wD2jSgw{>6ORL?lpRLt;KKM z|J3AX*H1d?<u9*my2qyO*W5lj|9zGw8NST}r(Sl}M^(QJENs}b!{Zer?%Cz`8?Qg_ z%LB%5JhoRs_v_KCyA0pklV=^YaM_+)K05n|Zn=AoUVCEMWB*uo?%cztWbAs%^UoYP zg!yUa7-=88KX*>wMX!Id?6Viny!@&c@0h)8|C{R6+tlxZ3kK}7-@jU5pN}wnw+^fQ z{p>+|oOsgp``@`ouSM%VIKJiP@hfk8vE`48AHHztEk(@M8@@Wv+|XlaqdLF7w)-S! z*&#>Y+wPiI&*=GUY0=24&aIxi_=_i)cc%qP`(=lR`%Spx->-M8KRNl%>4#qV;F~?4 zIPd8ryIp$lgfW|&en>NXjNv<}?5K@{&w26Pce}pv=G5CCUwJ|4kIh=$^yn9hMopRh z(6B{&&^|DH*T3tG?~_=zVV7<TA9v<I({lDBt$JR+_UPMQxah|-e|>1yQpeejFcX=Z zcRu}->lU>6z2)|=^n1D0Q4N0Sx8R+5lOKI(%j~<C?R>|6ZJ6#hd`CZX=@m1&?&!R8 z)|l^hUEZ<9x(5f=-=$xZ+~g_WyzuzuS*utNWB8mgH%{NJ{?I!o4`2KB1OGhyn4w>u z-El^%i8~#*bLCm5Y<!h=$<K!GwKrbsbNDgeZ|wPEb*;PR@BaA>H~izf4gY9;-kK|q ze&W97`!b1qL}SJ8$HM)mzJKg7JGFVL(WjSR`>*cz4}a&uF0WsA<D`2onfb}2?>aip z6^8HpO&9Hc#1*?ferne}zD*8Ye_!YI2kzE<)qC%5oV|SemUZ96UVU!(9_`*|&)4SW z{r2E~Ysao{eP4F-p;tUQ>b6;D&;Rbx3%=;r;udD-ch`FhR$aNnDFb#~nQ>Et6&ruf z*=5b}GYgLx*}3OlH@voX=3QqFcbt0+-w#Vqoj+pPdAIFWdVig%3ohu=aZ72Px+l$< zaQvc&mW+Gg#4Svn(nd{W*1K`=A*}{KU9aBv4JMs`(;df-pLRfD(~P$dd1d90`u$J8 zlJZty_<pOb^~$N|l-@mZ<MkUCH0n|MQ^OPXoVR+*5qET|nzr_ZeQzXx4d30*y?<+~ zXXj7dE^A`Ol^Y&jaL#)lt=<0GTfV#Rh)cT;nl@@3ayER^5@X+=b>L&yY?^lUd%M4T z`Eeg@%3hKDYU%d(_5HfK`>Ok}r}@Yxk=c6W`lr9T_2(|LdY3(x`|Y9!I=%k$GmlR! zzW<|MTSk1g<#lZHHxBE{;Qbqmj@jmY%8cTYU=?y{)%fw{)$Jz!jj$@G7irb9ep=96 z`L_b`BUII4{EV_G#s66#-r8zT2P!R_Ft)U6A}5WOOy4$vmTAt_Ea9%w+U>s;s3)^h zEt&XRA@~CG(pt)Jx7J;6tI(#F7Z+BPZKKfKNN$_Z{9Ls++c?m27Sxwd+s1)bRu!|X z)(><7Q|5_&tkthfw65;fW&g29a<)$S@s)|g%c?5Jw$B;M6tyXz?Q`1Yv}@lzr&IfO zIb&xq1TdD6IJtUTgj7^My@U|c1T{AJ#9&leB?r+bhF8rfE-N3~A*Vx!v3zDQbq2#( zv&N3<Gj;@nAC+SV4d=Ffr*<8?x9ixkbNlXNJ?)%X#F4>#pitt!MLVMX*-s<9Q2cKt zLPgImF!qBDB)aV)Us*WC4}aT4TOUg43yro@3-t|$ANqeI_7n~d7{?|Q%?c;vzws*0 z&nhYX@1~|~>QpkHQStw(%#Qz`yk*+|<Smu|lebiD<t=~5wxzd{+pbJkY|Hq%7L-+| zngsr@YG%n+;=S#pQ~f`A%m3shl_gb^rdIq{^Q15(A={>wD4bDMJ`rn|Ch~u|NO>xH ze2p!TZKpjaq{t(vZ2oe@V`XaFNVc?U!W3r4gEsPi5W$dSHCgLt*0zeN7Bz31K+U>r zKd2zd+b-u(uEOctNCa-{UQN9Tw3N0%m(uGYxgl4~7|&<9@g~@Rlx=RvwCdVc&Zwv; z54EcQqi{>Bwqf$=YtE|Vpi5s9{-dacn&L%;Q~tY^-xR)Zu1eRw{L5CQ(k!g-B@mQ_ zzZ{ZR{A=uo{3jt6Rm>{bCh0W`Lj2_Zl??YrC^SA%<c<n$194TB6izRi__tz|(i<#g z9EN3SfuR0M`qG5Phz9}saSKwr?F^;gA9g>RO!Kn8tT!0nvhr;akf+jWD}+M)kE9wh z6UCwWERgMAPOcYA6G@#7&Iq5M`o9uaPs8mPoTuY|C4>|m@>A=6kyOc`s6I;iTk)$o z^wKJ`!^k!d)qKXaZ9-K`ivw4;Rba?sdZ^|K)MwijP4e!)J-lFFk<+eh+BO<kLUmbe zwT%p5pu98LNC4ZaB}&^W1E&-fmzHg_RCCN|;nZ!E>{5m&*>h-HC6pS(j?X&IW~OFX za>4h41G9=+I1W>CtkmS&PiM7zSKrBH&61_%xp(!Q72Giu4c`OqU43VF))-k@bN8;k zljGAm`Lw0nF`bOxYuvl~PJh<oSlZ$4U4660$kLAXX%#+Sl}~HP8Xl&J32#^TuD;WX zbvTxGpnF%}>FU!C_Gv?X+6bREj<qyQ!xCPxdspANoVx=I?JD=KzLU=y8Ot}&y{qq3 z`Lt@EHV^?by-IjP-MjkEcC0tCwC&wHWaZO3`LvbXX}^FSoK@~!eP<|ZODt`Kdsp9C z&0TZDx5mAz?=)dehNZP|@9H~yGAGBhHQ}{%@9H}}xntP~zg+jOzB7(Hrof>UyLa`S zlel9V7FyE1tM6RH9aE&xmbrKJ9Wucwb#~kBv^wRDe|@ES-^DF9HO)Tz(4$2EkM|z( z#@X4>X}t6GW)#R-#xJ-~M?Q7_qf6h^{t?f%aJO4T1R-_fHW57j<vXP=e3{lI1n)f) zxle=`^0=4W|5sOB@}UpjO%(KOKTmg@LMY>75nIi(%Di_i;U@fC%`=6_zw)^YyZa9R zAH9j^mC}k?b~0GKYfEH?$zR#y45u~!WpOi{9RABDWH`C}m*vYa`zNUUXPBKWB&7_e zg8#Bv8QN{eSRg)@=T1}f8QMX{l<*8^1$P|{Z43W9nLEDsXO9r^wdSsyxm&_r4|BJk zyZ+{GBX|AG-4^cpn!9=^hIBE*S<jtvjrh$Qm|gG4{5hXD%%7i^oyeb8JNwDJY^B)A zpI<xsiQH-zXF0gn%b&BVVZmc-g3I@xBmcSi^Aw0eYH)XM^_(pkGg^61v-H%|Jmqh< z)P%p<JpH~<NjA6Ub#qqb1h2?DD=)iA{=5;{4b7WIDXP`^3r@;T+$)o}LNWQ~hWz>G zWG^&<%(ZBuu^=zITmJlkiqMw)1-B((xHrMSZ?5s<bo$B}eOD;I^Cz!tls_Ny$(BAn zGcr!vF@J%1*eFWJmGG?}xPaQpaqg4Nx|d~sj&a*bcb`r7Lac_fPnr-j(}id}`NH^p zgrbY+kU~btY2f^o4enl?y_EMTol8JihbmF?*W@oyZD6C4KmSScr@G+SPzDVoe-n9# zBPzt%pD$BzMvg7H3(0Y%9Olo>HfXcceVCtHPx;$gapNDllb4;7kCZ2-mokB@Bd~cE z6y|z`&9iXM1IE><N_c{;hI;Q@{#n85?vpdnULy<iX%@20Pb1r{=GMsyG@4tVXj2|9 zP-R&EG=cuP44a4u@=Q?5v|hK8Z;P{6^GfB^O3)-lN%x4t`MDJhZs{ezBL*VAy!j)t zM@WP@F84W>dtR^VIVWZ3IaPHKc;08HnD^vwx0Dd_=daTn6d1ZttyoyrcEP)bR)@oM zWAG#en#*YPOP^6Vy_h98K_-XitR@X^1m@2ZabB-_dVhL-o4sloEP=}9orS&)BtB7n zoAY@-W+efu5&Sr-M^<+g%ZVoCr>|^qI_v$N26yLW8{^T^Q;pl8-b<s;%5%=@I=mtA zi9AUt6;>0u%gLY9&8f;3k=yEePE`}{zM)gKqj%rLnNgl5&z*FI^w08nQGFy`R6onr zt6S$USdlbwuFB52H^H4XMXjI6ot5#~9$pAf;czdlMK7^CDzSJ^P`dL2Q5z%t_eDL! zNGT8<CHf>4=UbC{eS&}AToc6UT@n98oB~rVOC3}Sq<=(qe%Pog&qxuLoCdq3llZJw z$CV^8Wc}ByG4?Apk+VNnMQH8UAw(@?zqG$l{(NJq^E<ARwV|4WGB>-M!KBd|^Kxjp zqVYiL=VohbAy<{=W}9&EZIEcTc4i!a4(F@Z1PAg~;ZPSxnA&s!3^q7?<Tx{$!C?v< zc#=5t;i$InSTNVv^1yZ;m!nM}q!T!;7PCxzRd#Eiyx96!V9Tcx0*{nqXs*$(`SlEq zSZ^^-l*Rc+P;v)mx1K+swsE6u%Pn*D{6~y=$jpHIgOq^s{g8f14QWR&B)J74^{P!! za<Xwc#{@es-$X6Jd*w7QpXey#Ny8GcE~rLHHoGb8xH6?uqfW!C$-<6n%zN`^uTthy z5E=mLNY&PMM~-r$wxi98_Az(uxI4n!{e!z~b63cn^)ZdRVTM-8o%Nv)gE|}9YVP(m zcW2U6QjK5RxsW>>%7fh5P@d+FoX7P!?rbP;ayQb@KI6{%*oBU=^|2Rsql{}dch*NC zcgp$N&Of<Jn7jA6+uPiAtj%^x=B^ueHdd!{cch`s<Bqk%`281mqs`rI++~})I+O$Z z-bUPwF|;P!+4r{dUDX*s%DCqGu7kKc+R(;wXT$p^cVi9h3ZM2VcdSMw2H$dL<FXI7 z`dCBjz@7Db9CvE7)pllb*V5d*#$AcIdyuaBUgqw3?)EfyU-);;>v^=U{@oJp1{l7} zx!c#=-NN1e=1#+@CDW_4$CFcD)t2cA$XsRviA3S_k_3kZCYb$imq_#}oYtx;VV6ZF zhKy*-XL1QMELllE-o5^Mr#U`uYy)z)q6+P@+9Od~HodYcVM$fY5hs`_o6^So*Hamb z=o0E&2C?}&o%r<e`F}(nR`{MM>=S9PSqNlkTd%_{$!_!fu^Vye=<^;4DTE&<lNFVT zY2{T?pTzi*qQV)KC0^bn(p`mBi76#~V4YycpF}C&_iO2B!u>omQC684JaXVbF9fS6 z+bTUav~4G!xZJm0_!;$UIrVp`Q(<rz*e=uA?Y*puhU2JOyVPbYyWO0|6}yegXqM?T zJ56`ccZ26Nm#0B3r@^otDw^htcOS!RVuvl4jc&~kqsk>4?_IK(-o>VN{-w=jy{kAx zKg%P6{X+NJ#Lv4lFp!CzvqQF-X0W8Kp{WJcz}(5++q+%4Yj0>x_%C{<8E&w537)$c znyjb>6*5gq>|Gn4dm35}{~MXRPX1jt?$kQUG(37wrjyHmdzZ(Zo-&<${%hbOQ`;iD zcSE`BZD=F-uOW;~Q@hwZ)d7bY+V5PV<?5*x|3cS(+=oQRQ!7JxDyMm7r<wasS$g`s zD=I&DrvHAAzEd`Kc7s(thhILp(Y0SLS$^cAJ9E1K_(g~PPrqyO_ovqTvBL+~-~9di zzy7po@HJ&Sw{E-qjMWYH{eHrSw~Va#?yA{4oZzAN>Rhd#ZC6(O&1tnWerLx^Qe9e7 zSk*2kXJJN0(xtG;e7mW|W|-1a!rS&M)|nZSY4i$j*{{UHgA!=)CAh-d^-JF}Go}QN z?p?dkR{heG%!~~Lr`oaNsJXoYcDd;i)^gf~HtwgY#h143H`>wo<hR6UFXg4K?VJQ@ z*QK1u<rh#o@U%2S>C4jw5+3lV-7}G&i6Q8i;liOj20SyMt|T%6Wge6Yeu1y6c}n_} z@Ua4Qpk`+1U;$lajmo81T-n3>ckI|HN2<)U2t2xR?%+3+$KYM7p)B<&)>o%)DrMFe z>o|(0Dl+CunA|p-#l|S_yU%KUStb5Hg_4PE?B(&O{TZd~7oo5l!ib5}%a4!pX!IdU z>6=0so<dQ}HR@}6gkm;u&TijjxycKqKYT0$4JqU-;mXs$KHBu74NL#ecEd3|PWX@p zlnY<u_%F+J#T}==47k@7t}nx5XtzPplMP3t$Dt@M0-p6ymO=@1<2xv~MktNQfK3rf zM<@-U1R)QGqBsR1PlTex1tBM))QeD-D4Yo8HYf`tlr>OVMBeotl<dg6et^<C!qW%^ z&57_(d6^;GAkK$D=^5cEfsz{u=QJq!5uPicERDqQUMROlC@(?L6kw3{ub`}qQ0n8j zE<)K)6jBoS%HvjV58`|b6xn|(=XRlkIktzInW0?K)j4ncD0^1`4`$U|hR58^&`aE_ zmMz^K+qYK^+Hz`2ZpZc=hQ=wKm&7QYI&O$ly0j);;cz;29T%f?&RG_tbnUz$PU*TS zM(NhR8}bQ<+^u7EoYHA!oYJ`=(hvLU-feW8(p{6Nmd8KqhIFY7n3*AI6BYL&cypcZ z%FyuG!%s#GQm2iHznXnr>iRM~CLHw+y^A^}bm)o7sx9xHyT!-w;r3f>E10dbip&m` zE>%4gkE572u6G~m<#;3;fI~Afw2QXiDGD0h9>3d<n^iD@EzVs&chyWmsE-$Qsq{GU zl=>Q$uedu`YlEH{Q`ox8Y}I3S5)`4TtYXS61;L`d0<&h{d(h0M3ESNua|(MEvNKls z<QWwvh?2@m)(AM})S^BUONu5BXJgUHoV*k}-^g-!=NhqVOaI~dh0}`p<j44m98#oU zSie+0xs0>9-P4ua<QloVhbu)$Q8tq$QMMX#DRhpM8(t_2<>(zEmEJY=1gTU$@A#-R zE-uNcNNQAK^!8pR2lQC%0*4wSW?5o!@`zC>`kF|uFXkcYRD(Aua5NKqZ^kL=EvmUu ze^EDAYQ9#d3NF>jmtCq;2T!c2P94)a#e^R5R-@c~u9!#yI?3XJ4d4FO`CyeLeALFb zhhD)ss6(eN;hy;)o$=Ma1I^FQ@)4ZzRd{)Zvz=>=!<_{gNmc%T=8Uhov|)9|*Rs2; zX*~rypIgHjUyD~+9`C>53w0bs-=In3$HBKP*V#a>lX}M2fu}I{`vF5?<88&F!&MS# z&iMKleTP0XERPM*gqL#0R|RSK@ShpZ$VHY{l~TGhzE;3@FFeOxVEJzL_(Dwyy=N)E ze_R%QuT#SrUvI(pq01{Dxiy^e^%Xon#Q8$i9bTPr{4&Vb$VFnv`2Ppa_$n^lR%d)& zPXgoTU8$p{CfXc+>(~>)y(*8J!SHCo^m6wAD6fqtXSGb+i{mZ4lNYKWnIl42qL!7V zRzyof(Ya0bz%Tn;WuDdiu+PVtXN75>$2<NRE(;-gm*UxkwvvWR=DNhzj+0c}+khGh zVR$8}qR<Z98>BoY;W6icbp`23CUZeL%SjE0Lo?@t&~;Bv<oRH5I!FUOspK$hk~|g6 z1tp(e;AZd!e(`fMRzTBYf!p~#AIMSrwU=sF(1NP+g34m;(YCe2!*mEnE+JT97Spg` zJiwk?VM$X9s|)N2J32%q+h^sAYk0l9NI)NwQ9dJdW=I7j?^0YPOEm|JT_W8=Ehclu zgL_(flJuH0lLmsvL03By`6S_SDnWkc45br6e#x6aOiWTTKyF4>l51S&c7sL_)eKd= z5Xh=*+Dr!PIoNW-G$STB{HvaSrz2G)CTV1XA4ha3=~9}nc_h#MOYc!SX=R(vn;gz1 zUV8UG!A9UhH=Z|Sq~@t6cBD_Mz$b!ul8s)glP@o*(3Ph{;q$I&WdCm*u%z>2S`(cf zXoz>l3d;!7ow}rL;O+G)Fv#9Ykt9j0bSND1t;33>fLW70hafX9F?RyD&U{zE+-<AO z`M9=0;#>+@z2yWyYg-~`JSA+9I698<O4r`}c6I40zskQuLD6%;1Hs;)BHR~Lg8PG` z!Nb5wAo`wM1P%tD28V$kgTukkL3+97+_xh^&QQ^mT5^BzXizdiHpv0tIItWn1TO`P zz@=abC~-^xSAx7V`4Ko7+=X;Z1+|8^9F!zf_S6YQz{$Sg46q739-IlP>|G6>46X!c zgVNd4K-sI42s>`C`as(iH%*H^S%Yq?MY?s}-X;f1{Vioxz8=hv%Tv}F6!kz$!pcf} z#+hb#4YSd|tup^BV9w=MN7U3D@{0kpbT`WE*`;-s$^4h>bxG{2%$+?ePWdsPJZk}- z1MUaPPAQ$|f#|C_BW?tE0ng~2IU`O<yO`%{@G|f$@N#egcqORRTm{|;UIRV=UJE`1 z(k4hM0n5R+KzNd0fH#3(fwzGzi0>U>ckpgdI&%*w-NK%x=$0%;1AYhaTOH_@`Y4#r z=_SX_U`u<psFiLd;PI|{-VH_7o|~nRQqIj%_Sti@_y|kqH25DNV5Np+Ip)kzF?p9l z(N&vY8*_)fApVNuGoW<oSy1s^3o2cz@8k6r_QVX%DD0<F(q;PLN>W3dy(=|I37jHH z(!o?>x3=0!$efAlw}VE@*}W78T?%-hxwGe*)#v^_;@$}S5Zn{|2$T+CyUcl)8$sGW z&ZnT#@ENGIPU06&>n_mHddds3N=d63IZ#@0^{>>l$~ltOAb)avZ+11U9>ewYCgP^| z6ThT_p>8*EeHh(~pRJj-on7&|g$#ZsC9ZBq-sB9Py(<)3_kc2u6YGGov=z4MnpWhK ze~hi#AR2QFomVDO4x}QF&mOy}B}XNO<Q}`}Sxp<B8$S^j61hXO^%DEh3KlvmYYIf= z#*hqJ8xzY)wYR-JjL}l7L)3iuwufvQe^bgBgj29Xp{_90@#X{}(-NrggRL&8C@eO# zPSC3Od1o@J#h_>J_2N^2QpiQ*3c|2QcS?u1Kn!%)7ERjr-LtfIMOPs*@O3&-%M$fp z`KPNFzg=DW&*XQ1o__&{fWLy{!Qa42@OSVe(8=JeO`sMid&dM#65Hr(2Vw)AI^eb7 z_TXJ0=b0rR1$BnnI<O)5A-D@j7)~RwF31^<$t;jF9Ftl^q_fpJf_s7kLG&T1$(Oys zi$R^8b`MB9Ao&ugGt^!K@oUaRI|%%S=MG>k(nwfI?JcY`)b;~)hT1<sot>sLKy`N7 zD6l733?2$z1LlIu!QP+-?)efZxd~+YD5(WT{lWdgd@vWJ9g-XY9u5|OgTNW!VDKDp z7<dUd9J~n}1>Of92|fvq244WjfFFQIfj@vpgPKkl3+@3HfIYw>khyn<>GEU|I02jl za&BC57C0F^5u5@p23dlYybq+ElzbONrpXV%N^mpzqCASXU8u86yZkC}O-gwWMvqkF zbKvo=P?4v8Nn6Zw;f)kam1&i#P%-z4)I3|v?b$ObDk>JXpxZAi(lxkM0KSH=f}eLO zJ-T+_S8VP~o6XcqCnJZwp(VkN;A!Aca1J;OJOfm}>`ZVvI1fAlWJ1sA{{m2QIv12Y z7xU{JJL8e|tZ54>+-Fndse#5K_WS#j)pd&WRMUi{CxPZdT41DS0`_DgvUe#?x?~z; zmULZ68g>OQ0#&b3?o2&)38=W!#x`kO#(g}EYD1}R?96X%N*d|K73hoZzmrCtXQ?!{ z<Y#IJ&c`U6z$y)!PHpE-AC=SKj4|v0m#&ZZvBprkkYgzJpWCL5)P+}*F2(&?Q1NFP z%cS#s>`A9sUhYoWk-q*)8GSC2&heq9g-V91CGTqJ-T0?<s%opTG8~Gd&1culE3sIL zcs`GV6srs;LQ1I&Rd6DDqat=I#7Jc*;zWqrntw<}6`P3AKk*7<O8q89--RD%e{QvY zTjKN0GJFb90!*pjnh^7}_1hbmUtN*<Z3Eoir99EqouBFkU0_nLc^Q=Mz5=Q}zaCV3 zjJm_rb8mvD@cb62F)+eS($;rA0Ivq=Hzp;ikHLq)Pr(<#&%sUL7vOi`W{^75`36*b z{#%f`%lQFp1O5m~BYp-)g1>;+dMT;t!)Ab0JTvy4#HKiPLCT-QdadN$;11yZ;LhOV zAaz^vRgnH{@)K}3@HenAs5-tW*aB<@W`lgGnrsiUgeqAI?g?r-e{XOG*b+Pq+y`6$ z;wO0}xG#7+NFADd9Bd7~2hwj&egPf?)}buqfNj7IpuTZsIYDv~$k(t*Ex7FhUIcap z9|GxbCs%^q!PQ_7@FTD%_$f$TZOS0+MaCEVp_0M%0PanAyc>KmD1)W|atL-wF|&gz zfr-FNY)~~^H|1$AwE<e01ADJ*V@;--K~q_sDt<cNR)eg${<98K4-Xq2Z=R)RmVdfw zL-Ob(_zlVMVkKKv4~l&aLzWywSu~l|V0OICdY(38YQeOUvI!H%v!8}-(b+!NN_={k zWU#KT{fg~Qmv}HbCAstjTY&T<lly{<nIzkSy}%xz+BS^Yn6}MWupiIkK(%d3K(%G) zubDPXN92D5&(s0V2oOCrZI`K_+A6Ps$AD@JVUCj5gX6)QLA6!1?5Gq}Ua76JnQ)IL ztb=2DI)sX-A8uX1mx4UiBC{D)B_>Y`G!R)ht;lBXN|?P%B6Tmfuc0C<^Qxx&I_|B& z?H-JFgnT{JaOQ6CpKa!D^q+0!Zt|a}8*PzsvHmB_@+%`tU|*jKza2lmv0_p<rD9@X zrO}esc+?3!Lo#e7*2xdZ475rY0>yJ<%mg|9&3k+L?1k+OA<rjFsJ7aoIxiO)dzWM@ zUD+2xCzr0eUh;krR9oOlP-6|N!6o1`;8Wlla0~b>NZZ?43(}@_o&!$=*MZl7&x0?5 zFMz*;+$Y<i8?wKLg71URfU=)DQ$zMrOY*mX<)G}N+RL(wi@{&P%Rs_1_Ca>?Tb^m# zCw~KLgLSa`vX?u9b->2p_Fx-O_LB9i&W>Obl)d~XD0{gal)d~3lwI5b`Cu!PEkN1D zy}`Xe>FV43;<_sPtMPz`!IuMFHTI{lf(hqpb}?|3))*og2JZ^#YE6ygaq#xfmWCW( zK7BF+IWjhZnv|L6Ku0E-zGa{nY+qYaZB!$dfUM@1*bZn81goR=d+K1kU<EGTrSwT( zc7?!rmAMW^9!j(9v#R~xp!6vZ><#t>`-A!52=Fja?c{;rQjo=D$$P+|pz2HdUP<hb za}-D)#W@<R06FI+c{(@_yc8@1Zv%@!)q}<0{on*p@}~|n`Sc6A)iY*O8qhRUyKX!1 zl~_J$G|4w8Y#Lc%GHMyz-qp~%p)l3Zn^_6V22+$P%V$i-FsX5~8e$~(qT~0K1vdZk zVRNei<E=H%Hfv@PuhLSJ$+-{{#C}MIPE88W8B`Ta3dUODf&)sr9+CWMRL%y@QXTU; z)XSw*+t-E1b7{m#@VaC`NBg{$1;>{aS4}ijDYX}-r7HExdymShOdX4qm8D9?5-XYV zgcyDqJy&OgeVL+P0dImIV>Ha`O);-34*9p*t!Rz&sak&|omWydoMYcb+u0cA<Dew? z4apcktE$8>P4t<H%VuI)>X=_RRwomyG1vz#z3U|3Ls$fQkC)g$1l1v`FM^~`Od|pr znm2-%ofYB@k~`O@ddc<T?e*^{TmB{8R~c5Bq>P&Dbjpg#!x><6@Sk9N@H}uZxCk5$ zUJRZFUIsG0?OYCC16~E*2{IRwTnSzaYE1h&@ICO~;1A%9;9kh@W{@_8b1SHM8rqRb z`j*a}pvvz3;2Yor;P>D|U?y>W7;FeW0w%ymLA71ifKtnKU<LR*cq;e;crN%NNSvKl zK*G`&_(^Hj>)>XP`{b_F9q)nJ;QL@Fa3eSh`~=hvEPPUyoD6;r&Ii8)uL3uL8oME^ z<SXDe;70IUupZg>J$M+%($(Y;a0@sB{0WpU{RU11e+Q2TolGZr2ABa}1a1f33)Tgt z4%>rYfjfb_Q71J3_XSz{nCuMlT}JXKurXKwHUZ1Qrr;v5Id~noC%6XWv$*8*U;=yv zYzeLh_XR%yTZ0+sO<PblljXI>wthoY<6}g!;qCZo4&&9pwyM3Rg$-W&^$)5)uNX(0 zXKEz}CA7MrytGu)z#_{!*b+C(Bg<$6Ma~vOZ_L29v(&CCm}w55w9~dW1k>CSXM#Xo zQ|z_KO~t5oltT6{rCDWaM^I))*Dz!xIk5QD^e;=nGM*=bGeP=5$+_SZa0xgSyb+uR z-UqToHTfhs9ee?-1UG;)L74^hDRW}=8e@2-{lOTYvp$f$`NEApc4g%sNL?m*9N|W4 zDYY@$K(w;4ZH}N$vTfjm?{4d`Z2x(ZX>a84Yz0|7HDco%6VoGb<WhEZ1MPbP^Og%O zss@p{=oL77m(m|^pPY@n)IM1VN+joj`+$qUgTRYH#ej00oB>`9o&jD1%Er-eN!|-C z2iJi&fS-bl*(TKor9YFb1Ja){bJBN$oq4_s91N}iOF$NmC+X)n*oma_=YCN6=x`sO z0}AKkYe7D;tgd`o@&6AqQswE7^6@$3rF?uDlt{3%CLdn~m5*<O%16cuOg>_NO+J1C zDjz=wm5*P7%EwKh^6_g>`S=Z}d}NH><l~Q^^6@87`N+7Q$w&GaCLezXm5)wsn~$oS z4~Uh=@z4}!HFI7M^0B12s+%c^Di+>V&%1GIY*psM5-FPLT6JEXKQ0K*Q9M*Gwg*SJ zboxX_o{W*1c6&2$U))-Ny+P&{l6m0XpxOZ0;ApTFsPwc3rN8GRgZMZMeL9N089Q^{ z2-02Z9vkbg#~KHZcm0X<SHK%dzwA{tMBCJM2PS2&0{b-Gv@?|uYgZ~+Qe9YV+R%ZK zvPLX0a@L3`cdVyLri$stvu$%%6>#cjDgCc>86aA&@3pd`pz^qg$$J<#CckuP^mZU< z-(spA`Of!A)(UEpZz!|`zabe$il&ER{7dI07~1(-zZJ2KTcCTF@<ck&0>bAmF^@b{ zKJ^8aO@qN!ARn2TygvdQz%y-?<VbKNI1U^IP6J1SXM;zB*Mnoh8^Hqb0k8yI1Jbrh zehD%kl~mHFgL{LOV0VxYRFa2*Gr?itDd1V)Z14i`G;k?+I>@+$b0)|*gL4-663A!x zX3p;%@GYJffYQy^`NiiWG=?iZKcC;5fo|GCdV37>w36fhprZ7eCw7j(&c*5wZ`(Xs zk)`Zl_d_kVC@|dwDdbob&L<nSR7M|dsFv60QzwX4A#7J%N}hlg85a-w=i_klE~PDA z&M!e0O7Eqh?Br!&ckoJ3<@{fu?8DVyIe0C263F?X$t1W8lq{F>>l(9fYTq>E*M{F) z>18>+#9OEbkAKzk@4N*k3g&1dH&+x|e%S<~EpZi`U{f%@u(HG~%S=FT$&ap}=-OTr z#kcc&xzN2!@sm8Z10_~nw~`*cj1O^=&A{71S%N!2rQ=Re>6I*d#L_GIsk~^+^zHQN zjZA34=3jpz$ub8@vQ3(q785A}$toH%FOhLy>5q3QZb~c7bMv8_=ns$<#rHw5Dfke$ zH~27kAovKVv^)wb&00g(EtclDYn%1B&MNSo^l1()^w3<5cS*|b^=B4(<lr@;0aAR; zj2vs!!d;jlVv<k?kZ1ldn24hxM(Tkk5XV8Z1uRs)P0<_bv%4cSGQ9Dk=dG?7XI^HO zpPD^Q{lZ&AnUt;aF3C^%(jLNMm;My;K7{9|!G7Q~;1KXxQ0Z6;7J}<Q+1VFC%|*Qe z%HF;PE(PfeCLaXf1Rn)Afa}2bz%Rh}LA9+u0yBB{$6zDyQ*a;fb1)bD0_+QJ0%d<U zgPMc-24vpb`4;>)_&vyYu=4}R_^<Ob_&N9+sJSHyTCyit3oHk>11|#Wg7n>;?ZJ;h z##NK_S)H9h%?&jG+k^CFlk{(#-N6&VrXcNirx~~eY!1@ScJ=^Y2loUu-?|s5wGaug zH`o$91#AUsi<Z{lP2d5bKEPu~RHN^6iE_OEs(E0w**f#vkY3;YMOZoTcvouq&c!K3 zp%V~Ov_^T<jh}ZZ4$>K->aUw?Pn;F64xpk%Ki|wrGcRJ&a+lm<W%o&F`|(@J@7*9R zQe@4A(HXZDUD%F<N^MP}o8t&Bk_K6+i4ZHYRVd9gn?~G}q{)U<QDxgoJVfd?TaB4@ zgB3V=m*QQI^oQ4FFqdi89%!CGcKtK3EBGbYAKU~MgPK1m1-}K)02x0@UIuEubvgJm zcoV4k1lhb(`Nh|@Y2HJ2b11*}(#XwMfCLQQm8t+zj}$pcC?Po+2`K+_`FWS#uk?rO zEyll$Ew2q8fV<{5R9|U6Sn;d}Dn0k}i??|sPfritkEVwnWfeoz+e{VIGLkCHH2Lm^ zZiZHs@X9~d2Fc=&bb&EIqYGJ}bU|}B(gn@kNEcYcZFHdtC|%H8j&wnD+|mWj<wzG= zg3^V3K*{b#esOys`?@c`d-#2jUUt4ZC?C8lRUO9R6j6utvQl9RN{*Q_^tu_gFsXdm zW<Xq4ifg>w97x&}{~RzEY!CJZH4m>bUCqBA4Qk%K1k}8HC8&9w(?INbaxQoXxC}fL zl&mC=c)58An)K{heji3<RXMS+V%r%U2}D|Us?jGCwy$F+{W%@0#=CbZ-jdsn;1rkG zpL8lMnzxdU4FJ1>nzxdUY2K<B90E$mhJn(t5ukKzBq$xzeAeBd=Cd@er}-?&?*@MH zHAIqIf}hIkN9pAECp1l>8HfL{Xgrm&#m}ge`YNqqvn02i+DVxN<cOa7HtH-~yi0MF z%ytIVU(hw4v?V~zy>$f3K%>fFKF?FYG2k??5TuQeECQ#4lff!*2FSXT<Q(vLa1mGy zE(T8oSAZvhlA-1p;$vr@L6g3J$nWE*45yaQWQkb$AN1|QOF;To^J%@7fQ%zFyLt-$ zUUg?1<!nD?S9K_*5pnv%16C!inks+t;H={3E%#OXRq{!dx?SH9mb=mym;2esLusB5 zsvmF;sMs*~VamMba|ZFe2s{Q{44wd904nd6fLDN*fH#Aef-6DhOp<HCE5R4QrJ&@# ziC<jqqi6>z4nx6>QMqe9v?up*uy|KJ?}pkh%|xo?u9_es_i6|+xl3|?PVTbLak-C% z7LmJGSOR0~_bpe#>s?B(@?kd!ce=#o$VW2Je3$a!22lBMBiIYP8Ps^nEuiZ7+d<im zJ3;CDU7+%M1$ZHNAGiX10F>=u?kf2vxDwn5Y94G0_$atN@mU2n2OkHuCgTZE<10^r z{{Wu`m4D)mw-q&)u6D%@;3v`i!#b1|{f!J%7e2^9*_i3{*6reyYF-t|*d&DiD;djs zzvj1&pLa<X%3FzHl}mgH*-1VxgIz(*CFX*!g343YJDKt4*TG|XehZuhz5^;RH-MLd z?}MrrJ^{Y~Su1DO2Yw0G=DnIj+z-?oVh8YBQ0pPS1BZi}ODqPrfHT1#!MWg1p!%1; zf=fWnDJriu&KA$>BsA&g3E-!(yq+<Bo94B2AjoS^2Ray|nj{Jl9gyz--_(JXyx+Sd zqj>qQpJ~hW4q#6hcLe)_nui?>Y93bQTJx}~*VvfItR2;S>~%bAK34U<=3(yzH4pnX zxCi(tsQK8RK+VVQ!22~H+XCDh)bPkYpmZS{l%3W5Y!RsWS<Nl+{ej7I+3@(<q)E`! zr%{{bvuK|4y|OXU#mp~Ftte-Z?Jq9iS3@?JaHC(qsHT%`j@Nz(XkjaCJAo>LqxpH4 z;w$;r0|&aqLrI^~kP9jaeZW>=Ur=>wKd>J-02~Jn29@3+pvuBhe(}E1Znf?B*3X%Y zhXisli|<{F<*mVAf_Lv~=-u%4tcLZS9$8Xett?div4Z>ZY*WE&&8bMOA+635$t=BB zm9Ho#_?cy(8YYz_BnORpd6(iRIS`uD#-)!XJ%{jo3@BT3EGT^|1Q&wEpys?vK<R?! zp4B&)0ImVcz~@2DIZOY_!G?rA9h81)j=2h)1zrc91TF(l1@8fq;1l3%kac_x8)qdy z0Ox}A)17%B{ceXf66PD5b3xj{X3q62@B*Hx+Z@JplGJU^r66^a!@9oYdhl{k<3v}0 z*gG>fi;kN)*`vT^(9Z!i7yBfrxmM==wC>mB^W~)JAF;6zEnTV)opssH7peKIJ}_U2 zl}xKD)b^mJ1cdT9woF(GpCGVkvqRY|b+yXPYKKCT^HAJjkcpalvg&T?ob_^YFU3#! z+=OT4k*<eHkK()%+y#6DYz96KwgaC4HBPk}><vBxs-5>NI1^k4%HF&H-U@2&^g~c{ zrfMg=1}4Ba!I9wG;Cyfc_z3tO_!#&hsByoI;EUiV;Ck>2@EuTdsvAMgsY<?^L6tWZ ziFiBlTHKYUE9Ec9hsug6th+NUjX#jRq?{lCeZ0xaEzJpN%8z2=3VytK=F!Utzg#Ik z-lcd*-aA9^`Y)RERooa;G~?pGfx~$I9jul|#yJ-O8Q?u&EpVO4;CJA5pzL)WFb}K? z7U(_T>EQOD(p?{ve3tNw%jbIZU2(Vy{3=C0s-6Fyd;-NR`qT0X>!;!s*Uw!@hvM28 zYzt~GS@LQEN?uLDD?rUHuK=5atHBoFM<8RirtPyQxD#^O3p@Z!fJ4BRpzP2-;H6+T zD1F=)Wc<(B53EDHT7iwh)?jCFe~^B;a{zb@cpymM(P8~>QgUqzO8%V)BVHf8hkJkA zXfr#T;_}zXX`rJkVe>AD*S%sZ&9j{C&{T6}_o}EUnO00a9FR;GQ?-E<Dbf*X4pBK^ z72Rt(nSF~ZX_{tbZNO38Wj=mlcM?;A>}t@B5bYSFwjxo1=?3Lost{@)DtOZ|T>{DW zai;T0L6zTG4Oh+bTJ7^qDd8Jfua4RT*}Eh&=|*!1AGpLG$XIeb7#srTf+b*Y@HDUw zcqZ5%{5O~nJ_`;2753qv+CrL(u1!820jl4kx#-cL=Ay3$$AUM4h2Trzc<^_y7~G9` zm4I!)Qm`915j+Ac11E!%z!ShJApK`&D)=vO8c6@lIS#xVoDNE71`>8$XFl7`>dXt^ z=CnHFm)i{l;a#aZBOS19h(JNMrZW;$iq33-SfkE3L_e+0)WacFXMP|{U7b-&ULD<k zG!&_7A~U-a%ct1o<IAA`8C^Qd=Zol46W;AzlBIMh0bxg%ek!t;E+s+f(j4$8@C>j5 zJPTX^&I4ti7l3zx=Ys3Oe}X@Q3qigkb}km3_QGW#b)0iK_%XN?r0z0v;A#(E$FoDl zvK$-&{u{gkybZh>yc=Y$&bbHt5xf`Nh4|kGwgK-4wYmR;pib9&2%H9L{`F+=5%4_l zQE(af7<fPU1o$xcBq*J0hW^EMt{C@jxE&6DolfWMaFbf{xgqhU>YO?jX+Jnr`(3?^ zaQnR}G`-a}e3(CyIn)G#mTuc+=#e&&H8lx*gw2Y~U2A9&)eSGQrVu)}!N8?h<bqbc z?AW(dakNiUEG%8T)zEDeG|pKRS$ade$ax8OE?KrEpbgdxiHZ~`sF}qI$4M1R(n?bA zS%K#RG3=C%s_9cIO@~%t+jJIJ8w;($8e7`*?UrkyHLkTj;GBg?jc)O?7{`~0Dwp20 z5nQ!b@TOpOw^pZn`);T`=3UYam7#7B*0}WN&?P-<PB|BR3Dmg7tKfL>HBfV5uY+^J zx4;X)x4~<{cR^*z`{2Xi2jFV(Q&8#FT=Ki%S70;VsX1fyB{XMz49Ff4=6epxiTOV0 zCs5+7&HUwMpyrD21vxY$`3hJMybzIV&Uh5Us1MSQF>}XNAmuDcf5hQvjU@dIGk1Im z*qG;kgPKFW5!4*=bD-vqCDeUD+Nn-9xD#r|y6NNr;C>)=k(n!|jxck@lfbsn&jfQo z?1`g!*z>`T;8kEJ5Ido>HIu8s?%*q65AXw!@}K+?><Rt=9tviVKe-_D-cE0jd2FW- zNZg#hAYnTBU^j38C>wAJzxaHC`Z>Gt)A-UifepYimrr4+n?snVF*Yp|&;$<e!hU-f z!>(TI;Jj>U7!92ErflTG;*&ar^eo5o3+nySGsNlO-CT9+QtxsH-Hdx}4=Vnblc(`9 z3H99+-b3KGLHyPCo?137_zK5ts9`?bBoOba=iMO7G^58#mrR>2;3fnWrf!hz;&0QC zGP6dqkBdz5)m&2FZUtexTm_Xg#upTtFEQ8q)M*@$&Q>}FHVie?R^euge&ulmW;A6= z$+QW45u=x?KW80_rkAq{Tm6-4Kd=h(JlcOAPdm!)>S3ecy^MwGRpsf|94f$WegK7L zeToXFeJMu-%cE@f5}(P$v9e^sRJy!w_L@Fven`a1ALZ|U`0DA>4<tX8XC<IsITIWV za@wnz!<hwE@O%;|ojnEAxaX<hQt&kJR&WmZ2sjs93!VYK3!Vvn3(f=U^3JnC*^_g? z5^y1SE4UbZ8oUV9_s&be_rQz6&%sMT=KP(@K<0y;E5NScRp21-Utke<4R|tmEqD=l zJ@^WE1IRd^b0f(25YFvjckmAIFmMH^?-lO_8E<j!2d@WLf{aTzkATv9#{5&hKig2p z>iw(WcU#f>psT@*w}1VC;!EKYuv^8qL5S8GT3qv)6b@;=`V{K6TCGtDbTvmcR!F^i znaZx32-)z8`k3Mo=$5Ckws^?5T6pfuJD4Id0>a*efXS&Usi-u|`d0WM7MD#&*)<L$ z&s%(YMSJ5}IvOrdT5O_rxgT*;qC!R81T)$XW_)iGOag-SVpm#v6|)=B98-m>1!N;y z#%fM8I28R%Z4jCL3`|@m0B&sn#WtlMK(KF7E2F)!FJpb0m2d}BV#oPZ*LG+L+mawW z_iGiEWwoG2`|P1?S`n~YS!rA*czp-Pm#{rP6Q2=NQP_O)mkt{{5Y{;9tL(s`q_MWE ziQm_=cA#{7YX{0e*?|gBbG*~RVz3%K0XzY`2s{zI3_Jx?zmJVX&37)dLD|W<;5*>y z;5XnIpzOez;O^krU>9&cs4=Sr;8gHjP-83$!G+*?pvDXqgUX%@L5)pb12!cM*MY2o zaF&A=;0@qS;4Prms@)1c58eSXH{;w1${ySe?gg#@4+8H4{{h|)9u7VL9t}PYo&Y`p zUJO13UI#u6-T|%w)gFBoRNrGA*r7IS{lJ&OS3ufG&U!G5cED?(juCqu)FEPTfUJXa z-Uijjcn2H<z6Y)VH-b-rpMbxCpMkrPkDr74gPXv9;AXH0{1&VLzXMMOe*jm4zksX2 zUqRWkTEsQ}J?)j4B-IHQg5Ph=p84HiN!+{sggr~b?%FdGgzT9HlHHP8&PH^mCSM3G zsL53v1EW-&XUg+jbilV0f6c%J_9@lCbtBk_fm;G$Z;}``aO?jMd+!2QWtIJnKU~z~ z5d+ke)bymM#Jq$_hDCK$)MKHNVqsB$ih`mL925(0p@ktc);ML8O*Pe|)5UIMSk~Yr zwKCJP8A>a=j)axn>0<uB-?jJioaY=4mTA4e_y7LRM_KDxd+oi~UVH7eug`w)tbId( zgNyS=9w4r?5`<tO`5pnwz03+zg9$o68ob4?oSi?(foi<rC;W16*k}n{q`ct@q;i^+ zsu^!M0495ds$8l+&Z;Es4c#F4-I4N!cOy|nvwOqU7FByg4$SVeh>CTf__I1tO}(l& z`b;0mnT0)RDSD%yUHM3Mjeen&kF2qnn)i_&RZ!>y>)9}4`pDtH6E(e;Q~Aid0Fyxf z8z6n;8bJEUe*jJad<d`*@NvK;fKLMc4e+0U4*=Ex{uA(Nz*hmE0sIf(bATTM{tNIY zz*@j|kb5KG8GxGr=_{WHoCdfRa3$b&z^4IU0Ne-o65!W>I{;6D>^lLw0=@!xCg5&B zR_bejWq|Jkt_J)Na1-E1fcpUJ0WXAqI0$$*;OBrmulohy7Qn9o-v#^z5Nqp3BVaoi z%=ds;>otA^OaMF#cp>0VfT@5-0I|+zINBgxKqnyQRwn^s-e^PvV*X~t0%Bfev;*Y( zuO|cE4;TmNg%9fjI1}(xz{P;w0B->74p;@~0$dK*6L1gU>40&l)82q{0M7!f1WW+r zClk*G+ygie@BrYsfGuDLNq{{7&j&mUFc~lz@It@^fWrVQ08;?zQ#a!OMM3*jZ-UkV z|M%ekw|<{$o!t$dB*`?7PT2e*ee>7c{Kx}_8E*P0S?!>A@q!fWRntK8dsT9|Kv50G zeqDr&8<r!;{ILvd6Wp_1tcg=lW|k`#uq$95U|+!LfLxE50mwE|2zU)(G2jxw62Kb) zX9IFRF$a+I&ual61H2CK3BdV)y8y2Tr0yyJspCVi&tM(zg^pO@jew1TI-Zt`sWb2D zm{eFgYYIMw2t?h)M!#hKVob!^1*Rtsxti7$YO6)y1EO!aIdxV}0bb@T&Y7uJ$+jc( zRtZ&0cd{t}S}8I?FQQ&tBa!ZIe=LdmT1gVK!R3O@f~ek2<D8I%Q}v`?X-l=9)hlfo zcn(^x<GeY=Vv}nMSmTf@pvFn_STz3~2Xu1*%X(x?vl!LuaHQptQA*4A-b!S4S_GO} zURGDP>oVI{;pRok5lb*iXIKX4x8T5mc^X(}q1N$Zp(+7w8}L-meIP0IsC%4NThDU? z)(tuC!yYw%OsUagllwS0ZK?rDHJfS0`FKTFMkM5|Lx5UGv0m@{3M5sh>h(VRdY-+g ze?&DmqDJwf!VJq4R5VWKe?%CShDFHIV!Vc<FL5_V@?RjRQE31e#*7Zt9y5U-)bxj= z)Y;5O09j9K0ogZg0GtH)93b1_MnJZ|&4AR~7C@e3+6MS6;0u6k?=J#!{QffFXMj5a zzXjX{*a1b@4R{LR9zecp@^8S)0qX$s0N((d1NbH&$MbsuZv}h{kiGfafKLJL2mBY{ zdw?$kegMcm>?6Q4P_}x&VSpb4dI3KLOb0v!I0^78Kw8HSfH;q590uG4_!A(`U>QdM z+p*5uVx9mP0XPk?1t4vq6(H9c9e~(}H(CSk26O^qKiy~x_$A;;fL{Yf14h9jV*q0T z+X1=&+XJ2j*a^@B7zcPMU}wNZfZYJO?${mhF2J6E4*|LXu@7PN0(=TE9`HrLGXb%N zYxDuc+N;qI5bw_z34mC$GzI`(4VVbXyB-DsegJqb;1pO}65v9>!GM1UJRk5uz+}Kj z0WSo64)7wt&45DycLNRu{5RlmKw7OA(17nx1w09GG~h76v4B`RGA;$gT9GjU@D{+! z0I}v`WB_ghyb^FfU?$+VfLVZ-!+s|NUJsZHcq8Ccz-55>fd2rT4)_S*3_$w*_woP2 zpuY7c&^qIP1^$26jNiwyAFhDOFEI~;c)@G_Vobycx%5a^pADAgU40%x?b|AJ;B3cD zTs{3;fUBn`aDk}YmaX??Ter)|GP3VQRaox>-U6Ml+-m@P06qlBIsL<c3jiMjq)r|O zr0#H!i{S~<9oEzEjs$!+;P=hwZce^0FAImQiwknFw8Mp4x=i!;3$z!5hTOdN;t(3F zJr`(Av=<LzfcEJ0?}i+zqf~3XX?PCk1I5Q@TU0r;V=k~NwX4oF87%5~x-9BY`}W%~ z)uPsFP+j<s7q<)Y@iI7H(x&Tv6tqX&q}z@il}O$x2vP}4_e<^!kd%;IL^3zsq+dW9 z0oFhZ@mMs~Gc$=qi^jbuYuk>dw-P}Coi@8Pn%;a7P_k5G5_|u2KeWr03jC;^4S-7O z$ui5Tv7Ym%h@iC~xbR;t^v{|sYgiitXgPt~b=we#SNQm2SGoz%h5y)m<~@4;Zj)PJ zGWO)0#Qf1tY5(IuSf%OvVb`?XcL6U1{2Fj1;5UHd0lx)g-}oKiLcs3<{|fjM;A4PC z0NK}tout;R!vWvLa|Gb0fRTWQ0b2mJ2}9chY!BEPkms%10G<vQ1vn6}E#NtTF@W47 zYX>+9@MOShz)pa-0G<MPFJM=|=K;F|z6*F7An*3<0mwD2o`8b@-GCDSPX{akj0b!Q z@Jv9Sx9bPUHSR>fZvY1Ywn86uE?_Uf!GKAC=L3!e90E82a46s;z!88rGiZzg#2GVV zEa2OK>42XBP5}H7a3Wx9Sjd%tIP+s<0-g<c72t5ds{tnh<^WCuoCH_^m<z~(ULN4h zfF*!W0G0yM;^qL>16~XGIpB4G*jF?b0McNt2TTK80yq`$2EYdaD*-<RTnhLlU^U=S zILJQ&jsaW_crD<~fC~U`0pvXKR=__3-Uhf1@GpRy09OIN0C*?h0l>QfTf*k<0UQo^ zFW^+b)qw2l{sA}-@IgTO*EjG#cu((k&`!tyKjHrmf&NurC}6&|NylaW93~<?5?4yH zK~ZO^f8q56&$!vN^sNQbIO))y7V59No<Q0p<uHFN8{1@Sz;sP~3c6r<YXHvzTn{)H z@L9m2fVF^=05<}1jbt-mIpFhv3jwzRQkQq(fAG6|{Xt`I!};ZpA$9q?UQZzU@IV&x zNBO7^n4)z*!OJKQW!?$MzWNnF)Pb=JkmcA7$nw%>4-V>^slRCa=UKeNA<O&wTu%@@ z7NK0hW05+PgR;H>cnaW~fTscO1?&U(79h*<HXzG89DXkN{t28V!`M#F{TV-nEU)cq zf;upoKPp)N^l80XJcgXNvwu8<z$R~UH-Z>&H32)`3=r)@6Sl+z&;n1!vwMvPRW&Xy z>DU^W3jwMhRiisHCxMnNEs@N&s}MX02<W*v_ACQ2^ytZU_P7%IG=J11>xcGOuIV2@ z@6_#wfFl4u0%RZgUqJSe2LST{KL#uYYyi9t@DN}X;1_@#`+N!bFyJ?U&j5Z0xEb&V z!2N(f0)7Yx!<9A6Fu(}N5DCaWvn5~>U@Jhr!_)?l^Tm?@7XadO0t+7pY!CP*;K_jD z=+im@a_zD+Al~IPx&WpEb_1LU*c~tj@HD`sfIR^p13Uw8CtxqY*8uwfz6;nF@KeBk zfIk5C2W*KxE&;F);Mss_fQf)Omv5W{xE63QAkGgP7XY@Ry#mGp4gowFa3~<{y8{1% z&v=~=np5Z)dxW%a>xEDnnfVLs3~0a}1T`^W7l;A2Bi6yTOLH@Sl!3MZQN@pvJ`yrh zE-xU(x&-hXz*Jq9Eojg#qgCu_?Lg$GdB=_$HGE9^kn~Yw$7H3Cn=m|mV%l({hvo<i z=13bmK7IVKaih}GEuJQ+j2M-gnl*0JNN+m!BUDaJ(h;82;Ukz#+t@X+6ox<Rdr17+ zkM%X>-oZR-aZP_ZDS)*zShqGwPOkfbG(lnZWK5P;u`jwgH5-rCJiNF#Yt$@!>J95g zLyD)B%7KhCP$sgpvREd}%AZ+Okjqef)Nn*@j<2*hSISPlD2s1&en|<JE7OYA=bSN^ zP)W73Sj^l;7R)Wm%NkKwj7y1een+vjx7dc|%$il`%NmCh%TSUqORX}$4i=Z0*jV)v zk<neJ<7&d8zOihHoMSPJQx_!-D=aQ9Ekfz6TqXsxjK!RCYC+)~qo)xS`&kE7ofscN zjUhfueF~Tkgkmaz{86#PP!9FGHn+GCM+kB5rd8}rp^i@(ku^MJ<nXKsV^W5X7&T^i z3Qj1fz%auKOho`T6%{?)PaigR%&1{jK!hz|!cYX9iWoOp+1T60n6XHZQZQI$WDg#8 zIVRI8P~{d7h|o9`i_4I<V(C*u9T8G!6?j%@L4ll^#8fmYwlt8gr-qO}DwY#K^^+)S z5=iB7O;i2k>^VNL=>oNjG<eckCD!|7SyM}AO)imwePX(Vv{4zuQ?o{oO&OkLm70Ol zifw_T$Br3m#SEvbumz4BH)JAgp;c@K3LUwy#Fsw_3?ow~rg^hQj2$<6NP5=LQR$<H zq=|VerUGASVKCF!3F%Uo?T}P=Q$jY(u`{H$-p7Ce$>&cmLCoP}hK)@bHD+Yi_=`u4 zmkLqAF4v@K_TaQ}s;X7!InzWoEAr4$BhL{-*J;nnnPZQ9`H(T=CyW_sbb~~SBPXwL zx}D?VvECs=C7fUS5C=JKIIMM?sZ<m{RW!%&7Sx<Q97c>;d8^pZP~0ho`q(on4Fi8g z%hfbqoP<KQjpgU{)Gzqs&@RIf`y%o{4x?sGE*2k!t&P#SzT*7JCF61@8@<6XtSQIH zT%WiV%{c;A0)ZW|`xNVV-0KDRBVVn{N}pSl3+Lj99o{q@Mr1x&IH~4{J-;b~nNdoP zFGq5T2H#r6M_LxV($AD33r)olo315OU!WhBgU>Xud?zF5d)P>z2Cys=kP9ly5!+d% zFoGY~hFC+U%;uL1N<^wt5#Av%{F2<_S#akP+!4WVs^C=YnT)}AbEMGiL7%JWY1~fA z<v0F1fr!JM6lr_`+<0nX&J-(^S5<&0p8+gGXG92HyevtqjV-ZJxFlT?qfR=h04dQB zpAR~bpk4^NPzBkoVnlInuH<Xg1+{XNO2xp?5j)=|Fua^2cCn3+m4YvISY=zU>LH~# zADu<kumWCtOJz7z3^6Jz0s|scfXHtJ(5BhJP<^Vh%^o#BSD9K*aQxV$&d~y(eH>0u zRnz0=nb5c#u?JOFy3<A$$W>{$9YW~<Ajt4plMA^OiLS^I+tpSa-A067XQS(OB~|;j zjjs8{c-Y=vROydaUv*5u$=2dhIWkK1wAB%5M3#Ce)eaS4nxZH<OwmM_mXR=vMJhmQ z9-7R>97a_cvj`!xvbo!oU^+P{7F(vGuk8U64=bD%AaV%v&cZ@~BX+rprffs(sJD_U zC3jNkG;d+yj4ZJuR>>z#sszndLfP6sR4EP1%PAh6QzV*XNk*&W#{2N{=gh28g~HE( zmO6kg%~A}txKjmCi;@b(9I0rd)fdj##(LPIkIyZ@;Ydl@i69PRhNomn<<rx{Q1p-u z^_iO`rDVShx*nrR8B4OTs2ZHTw6)K4UPU>xvc!dP*A%gb4#f^Qy+n7LFxr$v8rJid zA!<y@#a8T7-4vS0z_TUgo*)$S`o=7NP|6`A5st1<p>it~I$uX@y)Kj*B@WH^rSs^u z<k%X)s{GP5aMWavKGy$2Z<Z8I3ou|%%78&)uXm`l#VqM2MO3=&3V%7oyHD3b$Y40P z7<?E*Hg&to%sACzHK^e}RpwR{yHm2Vaw)A0<u?eZge@v-)f$-*{oRc=L7|?axl(=_ zP_IDAq*!Mwn)o_#NNhK(?z40<Jl%jdN$E&R%=kG41%;E9UTJb$G+n9PYWXbnIGwy$ zxs-!V;z2tVP6XXCE8S*2%1AkLvb3XYQQCC-KqF1Xtug7U0kJ|(gO=t@MstIyP==W* zl_7qiS(vA^45gE#N<}v6^gL}Ds%4;iWD?IRMXO2?R<=}*5+R=QRBCdRC8Lsm>a^(y zO{GdKrd6r}N6Tk9h02CZp^?^v@p*;C%EF(pr7mo=@MSh)R(f&Htdgmilt~S<=scD= zI|pwSl<+bls~KT@ij%->bj$7W;icG8t=JsSLWa~rbR4vo4O$iH+B}&6NAqkr<FPx1 z*<}iH;;1A`B8)=dP=;QvK04FZF9Osct)rh3AT@tdaZd4EDHnV7qqIk9{@k#mdYBAF z<3z;Pex;I{Se1;!IGIOGvpQ8buc|3oCt`)^ZcRMI(YkbL4Iye@bgs2H0-qk4BCV8P zR)hqW=Mc}Bro__je^>$T(vW&!3l8W3tuBB@dyBpLWWb^n|B+4&j#yG*-S^Nclj>wM zEw@GHP)>Xk?;>`@K4TM61xY8^6XYy3^&EV`*(dfhM`xruC)LeLCDQtA-GM~sk`W57 zEL}?doQkfe@#A>ougFUon)XOit5=&grL9nThNezd`BTnOkR@6MZIXVB^HMQbxmHd{ zT=67HhQNHs#&SKw*l{ry_d}3Q8c*lI2av?sGDw%nyEUq_d{lM(de}!t23-jAjjHIn z(-$)+Qt>&eRj!lG-e%Y6=;(if+K}p3b#HX`pp-#UU!zo7=;83$A+*J7bH$n8uE;Wq zH~kJ~j*i&BssPK-13d=?DN@z~d*rZ@9Z@qaU21lPDxR`lk*KL<ie4#rZgKIfLf8*Y z`x7mQ>MB$Ps2Xirq%7&vI|llC^!NFbZO;A=S`t$Quc&9;l64bd^#zQSl+|<55jAS- z`=xLJ6)oN-QR@|%h_N%he=C}<0;xJ3QN|3k6KOGvlt3d@Kbkc{-)zqpGaRult@V@< zdTos^HYY$ws?Ma9(D4O!%UP02(4b%0{U(*KcC<2~yhkUjM<$$9(%>z>6Vg?RO8A9v zXi8~SOf6JJO5fZNAU)KB>4~y;_Fs8HBG^jDk@UuZ$cTv?m0zTX;DQ_5?Qq^m%UQl^ z^8qbfO!sBGxaPV5nlZBo8as@};S-xV6{!kgyTzTdj@SgIG%9tt*f<xR=oI)-De6M^ zdb^a+=8#$J{30!?_H^3QumW#W+~f7QL%5#_DE64#IhGSg0JBu10`>qQ>|1Q$N@OTq zZ<_9`$=uYymEYQ<@>2sBJ@r!^$?ZyWoJNVI%V@2Mmy;ZW9kUv11y_;u!6E&mYTl;= zHE+JOq3eU%(oKqvPg)d*U7@BZID6-aMN(2fxVC~WEue*p(S|Cw#N_NkPcE24h;gSH zp>kc+v_L6u@CaPFYnKvaD6X8BhIgN?U$f!a4V$G5?2uGVaK}$NDP5m*$+}n4&P_Z# z*AJw}3A92{fL&U(C>7EyvqS~7^sM|s90``%4I2ApN!#g1o~+5mK66kYr&n`}ON_5j zVw~H=nk@EnBJLWU+L(FLp3QGvR+yJQJM;Rxha_CzW<$lZj&b=rpBuGmuet-n6=6(# zsQ6@O+LJTJ@BCuJA1}Eo?bDkEmiEeP+vlW`%J~QWgM(>2x9y6!IKpwtq_XHP4R1!C zwf@ORKASkT+u_0ipKdtx_u2g(?B|Qa*-qiR$MKc(y&F#b*P!#=C7m9)BhD4~@${>w z-{0ls@5UY;e(B(Eu`dh(T@ia;`|eL)?oI8{<F4!<BRVhodh(fX{bk_k<I+z`Jh<fJ zj8({&ug<t4Cf?C@_NvIWn>RdCy=T{)c8Ay8pI?1VpNfjh60f=AtV?{gI3FZ@X)jOt zWbA7To=<l-zIWuwO;0`7?U4&_U-R6^X(=Cc_P&1+HgI{?#ud@-k-;}!9)0<a2?xL0 zblc4PDq7y<{c_(0Jr7U5tFB9B;@;&r`!0MJb)Wy~_pcV+a^tA&e>u~&V#nq$D|<gy zxAC@bcKRwlel;Fvv$^l+ig^B>9`AlTX-<zl)h(~<_(tkKZ~jltO;5jY-xp5|xwbUD z8}8`hy>Z|>Yia(y=dBs=#7U3-xVY;4%Z_X>{OfhAW}la`fB2&j(>5%_ChSz<>o~9e z>@)Z5`~JLJ2kbii*)2atytMtCd-nD#dSOSxtkwsT2jIOA;d}Y+DHC5z%8N60UcIs? zdFuF7-|C2e<o4OKp-*C~w}yX$P2j$f%(vT`zrBBE;TJ0(o*S7HwJj$8#Wjx=5B|&L ztJXN%we8aRAlmC~!slu;YSU-0&e*o5|DE5TzqovByT{Lc=j&~~PrYmTse_-q|3hpx z^ZhngM3)1lC4J87d|97=_Pb|a-^VWAAODxNU6$Om_wGL=t^Raq8DzT@2P9k(?g>}F zv+j$c6}=AK_t5fB?t9z&>WVimJHO@TbwBnwaz*X?`*9D4@a_2Y)XDFbJ+bdd$I};; zpV_L%50BrPf7xp<eK@}Rr!P%Ee8nAj{{!PdS4957&m#xk(BrAkKe(jr?IZrO_s?5q zzVYFbKVG%H*QyJ@T)*Np?8yq>$+HhXdD7#jzw>qC(!FQB-harpXWXBEblL}NGW#yL zxVYnrRXFP`e7U#0a(Bwi>Hi-3c=4LA&bjBAPbc@gtzZ84XU!P!!KZog6SiQF8vCfI zw>jsudvoKKOEcTQbaTnywvVgZzWC9d`!YJb^5vgr_|A;E2KTNBU)Yiv-~Z6@(wX5q zC-vOlIp&O3@5EKQ>TbXO&o!=YUq00ON4&Qqd>^jt_WJ3|pLx0b;dzVy`{4N_YvRsr zpOds?^!`s5mYn_FRk#3b0Ct3t?^Er&-~8eG#shDB@ws>1PjlDIxvJ&n&!0PE`5)Tf zwDr3mo=3e2pHcbV-1q)4@|t<)ww^xj-uSI8|L|4kfi;Z_$BekJTkpkT^KrIB_`3I; zeRkLA@wEjnw!b(1{!`w&u}%47AMO95=cb{9+uYpYEicaM;-HT!;?;fir*wbz)pOR2 z-MDtf?#Z!tZg}V8cm5eY=emBSkM+IhP&|(13*WdqcV4sQ*8f}=bIFn$3v%oJ{n4q{ ze$wx+mrU6h*5T&EmleWG^}(jID`IU*S<6Eo@9p{W_p#UBdTp1>M}B_6y$dd!JZ#Li z(_(I_oIekD_z2(V`R%gqzJ2O9dEX3v=<l80AKrgj<oPADdQ4q-@bh_pyM8Zh1@BiO zy_M_EeEx@_H{aUzl!ISyeEg#!PoDc-q$~aN`)56SxNXBV2k*iDcN_BkabNL5*F)o1 z4*T@wO~Zx^D!uN^tDSwXT>E%joBWGodbdDtFiZGG#9x_PRGKmI{*IUaBW2F?xBu&% zz5L<4iaY1$)-S$%#bz8Rd|vpTE&S}3bLL%~Fnj9ws~){`@YGWdZLe6dGyjDL&-y(7 zt%{PXP+s_6_^Uh1`rqj;$|`<j!5xP>UUysAx(OAJCNEvOC~<UR=kw?OWZ+;q`F=dp z+kVWyTfDGt(x{$KlwG_2)>aqxbiFp?wL#yvUUti4FHe%Q_~4t__P*{7E&sH$>th?w zxus;(4IiJka_x&Z-M)3u$kTU!_szd>dZce#ruXW*;hi4tF`?IIx##VCy0Tx)h3#i| z8F%>`cR!x~=jF-0JN^^r?}Tqn!G!L&3~Rgor@i-n_}$>;$@5=dy>vkCg7jOi?K*MB zlF#ACHwoVxd-n{x<f?BDB)?V`{?DpT2OoU!g0J^q5P$QIyRO{&beGfd@<7~4%=e~O z_HVoQywO*@clt%wO#80SNyXJ4-_UsW(w+6MS8Tbm)0MO2oFMpq+Btpc6B83JD){o7 zgbV-tW#2t--rp;6#Li9~H$0esPK(1hgMhPS;2XKAtk157Pfx8J6Mg2P8_&C9<o%Pc zx*#?F*}pxwG3DTHzMODG_$F`dxw_Zq;s3fc>@W9x^Hj>idn#U@`iZ+Ny#D;FHcY?v z9r(3zIIsl&eAO4u7Eg8EzN9*>$3F_*9^*KC_D}s*KX7p4=buIPa`eZcm=(ge?S~uI zyq<r<6IVPF`@sIM=bwA$UDsc;q4CNgw_Mq${M#Pacf&gh!gp29u5~424psC`Xz4W$ z?CNq+yI1dYZ-4CBR!<y!|EV+olz?*;uzgp=&W4V8J>4sxU3bQP-4{Lb$_-tXe|5u} zRs-+Y^T5KhcHZ<(4c=)MzAIn4<FBRXMj7u^PW-yVnt@$+J)7!mHzLlnaQ>ICKL7b# z_@PMHsw?8d)rV`k{p;+}4P)<GHTLyMJzjaK?%uft3u``pvEyA^Kg7F!24`2Uh_p9f zI(h2;_pkb-w-NTp70DAf-C8{U{s+%kIqS^F67GrI^EvKw6u!Ssn>MTV+dtjl3BP*Z z^0y`qy|D1FFP&90{FH|$x-Z)Jz(v>NZW!VF<VfSx(RV(6{kSg+uN^RN;)E9;3g5hW z@O!g|KeTzpWpgJ#i+rJLS45-d>g_FWeB-0%5ARKASGl?9r=qh?{>#dBC-=Ye>?gii z)(`#BpM`JI3v2UUTmJVKc0c*mTMzyBZyEa<*4|&Z`HCT5wHh?Ty*uL(j3b2ajS1(^ ze(r+PtFK%5)!>62-v030XGXqt!QAO<cf4QLxz&KX;ja?fGhg4taaXkdd+$rC+;_c` z`26MB^G>Qd>4L8(-}6TLvp0Qw`reyyu2lH?-1eX4zL(o}YJE!2Q%3F?zxJ$=Pk+&3 z^yILGju$__>)uoQ;f$2<UHVA+XRjBwf9vV1`+k+sd)oQQYn~kceDTK%9j_0$<3Mtc z2{`wIvA8Q@?u;I1EWB-btEG$ApOW5h(X#&zS^jElo7lVlwCRD(m3^-I5a(NkFYd*0 zksU9;xnjehRn9+5nAl-&X6c+(SN>^Yr;E037(Q`AHqHnN-xvFDUflJ<pU#R~@ZX5L zzn-+?qx2WA|7cm_pp}o#+PdJ5yK%_!^plzI)-l!J6}DLL_J&B`v$HclJ@4Il?_b=f z`wP2on^<z%7rQ?g3BM+MpQp}TRr!(c$JCsd<g=eIN`I=|;}1P>^QUJ{I&k%nticb! zo@<4#^wU{6v%;Ua{;M^G^;tbu@9O9t9CpfCYtoAzf4%1ypDuV9gSw8)_w5;T&sx5^ zTjNJJU7F<Sma+4?{LL4v{=?!+3c@<f-~H0%V{w10@J)PwamDak-mG8U@am0s-t*cM zi&po3xTWLJh(G^%RL?X1))oE!D&c!{T;w;4MxT0J`2)S5Jaxz|yFQrH<MT<ikG<C8 zyA}VsHEr!=oWjFlC09htmmWMXt$oYGZ*-b&tiJHd_5JVr&kf0kr%s;WJEzwxw|}w~ z?OgcoY4fiU)1LUpn@P?Y3*T9C(Ou8(OWu0(i<c+easIT4pP%v}%6gyhJ@BqEX_#yE z{&q>rpEs&r>al2JujB`IUisLow|#fx;pgVwt<IjhBFgixI51|}Ywx~$?%sVfAAi2~ z&r`qa-0R^@pWJd;!J_BJ-Eu1Kx`VHDMSPdjd*=IBU)8qn3++F?^ZvgLerEhT&klO? z?+;CX>MyhFr++;V<7eUf)1lisUHaD!&o4Ol)UOt%)jfSqU7wS?Y<ch91B=$Q?$K%= z{9l9cZ5lkR+Z&5hetPzdotbs<PrJLM{dLo2kIlWQ>g!E^{$xbgwa_!qYei&jxvS0m zQBk#F4@cJ=_#vU)j`26<Tsq;L<n9l?v2*r6Zyb-i4}|aAyBAcYufF-Qlczq@a%T0P z2MuhT+Ok!7#k4uMJhw7?!*z`~cZ`Fpu83K#%=hQ^*?ixjS@*uz>D@c8`RI_lX5nXd zw|;u~7iELDJdOS>P56E)3IF$kWmDHpIPk!M>h|YN{XXW}ZcDc}Uiw6$Z`RINPk#t^ zw+P?5SKfcL*UMEiTg2vt-L?N;)yv-dXlLvD*M9x<rFWb=de&vT@J^fX#ZRbv@v}#N z7&Lci{$|ftw`@p!^M{w7&zthhM?)IZ8yeq4U-TtR@VqYgGwi%fY`IRy;$KN7?%6BI zpR6wU$n+J@&d;5bnOmk7Lo=sheb0xriOiDX$(cA2kvY|ezr~pP^`HDJQpuk+xuA4P zu0L5>ki;ep(w)Ms$o_f9ldA9RNu~J(Q;shYv&1+KG&O%31mlY^xy2_qQI+}$PPDLy zcgLLIL`!^A3i2nNm_(=gCdneNmD)5M+i;D@FUT!%#g`=w>YaHxUh>2T(OsA1!!!pZ zWa0>gSj>Qg{t5jD3{FTK&_5xw6qEK$$TcN*s+H2Q7;_Udoa&ogSWxJ%<KqwumyhK_ zJWDQrQkkRkd2>bKRG;gz{F2g~0@rw7>6HA!%(D~DK09+*;mnz(I9@V0^Ri)?=~!zi z$s9c%=zzrj0|)mXIPjbSgELLJXHPCJo#o4)nfsgOQj$~fo2HK@px)k{JomTGYBpN% z)Do*S$7L%vm!;k?v6B5Qsycrr?xW&1#&4R-oZlsvSx3p`*EIiM>z11KWoEDQThw65 zi7d7DE?G0>(86zO6TYL!ed1hM(eIK=?(dRI+3%9e?~)0&vZv21vh3?v9A-f4I{p;! zX^xq;F^#{49<#?V+s>Sz5sg2|6KB>rO={^_RA~0|*67>nb8<?3g?V_g^!i%}f9-E1 z{8V4zr0FN97oLhUSbRUjQpAbTFFyo>(P(kMnK>M*otV_8`eqhR$tlYJRjCCuC*2rM z^wi78116Sqev>-pCKl8!otQeA>YG-813tg5ssq%Avm5>@J&t19JP8k&SeiSQ@&*WY z!Y9*wE65VdU(yrj;NU~?Rc<SbV<~wP@1|$kbaK<s^tj&OucqTl+47tEEvb^slG#Og zLF`w_?XNMu8**Z*Y^o1q`)RiR?YN4o6<Jg|2`f4$)P?Dk;T8Lplol1?ROhc!VUwyi zd$<#nn(qYK4pzG6;*Q>#Cq^{O60y{fQ!v>|^tWi61^F|vdSYd9TqcD+8!tG9ntdK~ z=TIW2@hq|YB|qkrO#j>L{QG!PoLn?F%dfoSkWx+xp2*^s;P&;&c~*+YQm>}(I)RQ0 z#VfRRr^g~qQ#Zg75)!n^=2!cP>$0p>v#b+miRcFN3qwf#s|}EolM|bwB*=S@u$pa2 zdR(<-^JP<P!;IrflY>0Gm3?9aoa%#x;eAXiwco;=poQOhSx#k<&_92ce<k)fwajyY ze(!diiRI7CndYB29A{z$lc!A0KVjv>dv>^A)G~nMlnt&)?KKz%w*BR!h%JrO*zB(A zJGrAlYh!H3Ut&&!m;5VQhQ^#m6wbJf5xy9WIr&{_O}o#c@%|}n0VBO+jX8}<i^i`% zGSta$72>2M`99E?li!<@%i!7=-8AOpx0N*CHjO!rLlzBRtC3Kr!8_GedZ%g3X<Tg4 z##l6;MJuyt8*mN`M-3oLt;U>25zc5Snona+<4%i)uTe;-(|FOM?X+mT_fW<C!J@ew zCe5uerxAzqQ`qW7zFjru<URPBh8yq&LwSK=3m1I2?OiaZk%@C2ik7W0r?C$hwo<{j zUt><*d8}!P8bf^m<2Gs=W0}UB#!J9v3+)w+IeE9G=If#{q-W7^6QzVYjk0LmaVBxg zHRd!P2R27&>okVAIOn4H5;f*D_(mwU&>_nXjX8}JRHUMLHRd!P0*0ds;CobKPQwi) zD_Xq9oJO)m^H{VMz+4h{rN*2_9k4Q??bDdk_?G8Bg!Y5RoJI`KWC*Q;#!zoKw{WS@ zx@ycRXCCGXZ5(LCoJJ(h87Mx7#+>r4+Hu0iuM`r4UQm&WmZ&kOu@V)Dt$UPrmByUL ze}G*pw7nX08ri5w#WzJ`PQwEwrwd<-#+-6#^L0X73>q<~F%wEweAj5qX}oFC-nM8( zP_p9lY0PQ7WzpWXXzuPNU%bYg#;VhBubkw2x5i*EJxp4;#-P)lxJy*{x@yd6JZI51 zSv1@Tq4^>;244c~a*6wa#+=5Dr<=4YjltF|+764h`V95`;x@)Z8gm-|239WVy{R$C z*URMVsxkOKU=xM!K8+zRuz4!3#+=4u@h0CtHRd$B_BLrQjlp)$#C=8**P}5s<31)W zQe$Ypz)(=OUyZ>|`<k>48iSsJp`hR^*O=4z(W3FXF@`#g0$?a8_=+^<G@b-DUuZQN za~do9n|v!Z20xU5JC}qnTVv3(McZM~;s@XZ1H#u=V@~60V7$MyjWJ1Mh->lfu=uji z#x+R7hp!O`20n|n!=fb&#9f8Lm#8tPkq>O4&}M4PY3#B1>MXv3MBHyEd_@|A?$0r4 zks3q01a`IXt<sp&cm>!Zp}nRtr;#+s<V)5Vd=9WI;oGM%=>A-jR-`f5Mv}S<u8rZ+ znA5lv*!2>3g2tT22NvG}i*LnXbstz8W2MHN#tXnIB<{-^L%!#kd_@{VzkfdN$``&2 zjX8~*fGrl<A2jAPyvZhCs>a}RF2FfF;Y-n&)0hoxiO{aqnA1qT(Bw<gnA1qS2-l<u zUy{b0MhUPRgf>TGPGg6~x69&7_23>#;Y-sP>er&xS+vBVIDaa9Ng8t+8!TF_pEeBV zpM|ehV@{)Qib+e*82VaZQ-p87#?Tgqo3w0=fi?o~+zDT{#+=4Iz-|=U{Tf4i16C=t z8jYd-jx^(zYYgK9FWwIjz7-mC8m|LeDzrB=<}?lfyGdvVHRd$7j56bH*BJV!OYnVh z;d5xrX^a9^CA85RLmoP`jq!%YpqErLZi2?p-YnWoi}spD`;SF)j5gy&X$+SljK$rd zl5dp8Fb=b5K8v;;SibP>(3sO`m4^33gw{r5P9yD7lP_IkPNQ}l?wS_9EgC~RACEgl zg%+tXr?Chfp5j}gF{hC+!K7ts4E2GIXNJUGp)sei3)mlownt-5<Bt<fzCUTqX_Uhu zs<`|tDlxQaIIseVdq87Oqt{iq>r`lcG=_YEDZUjNL%W1ynkjs#8gm-A0b4G#J2d7r zKFc!szSJ1T-q|Lto5q~R6pNN;(cZLZZ(B4M8lcM8tugomG>%yYeS3<=oW}LQZWh`N z8pFH-jYILpXbgG*Rw#T6HHLZvc8k!qXv}F`3&T}>^EKu)_FA-eELs$dO7X>L4DA<{ zd$y#vUt{RcQ3Z;2pT?X<Jd})10_EtdF{kmUMSIes#X$k+IKbCcW9Ta^+A53YKw;5I zfG<j8PGc;vKM8HT#?XI2V8xfLF|_F-b%%Ew<Dkaiv#&8}85(mMy^EPX|M%0F(-;jb zN@$mA4E_aJTcMR}41GMXlZ3WXV@~7y61)Q=w4XHQG`joLcTU<EJvHVu&I8s%_%76# z)8I?h@j^RUV@{(Fu--yDOJh!B7_c*iHd1349{}qkv`HFs8gqd4720(ga~jpa1_<qD zjlmDi!Ck9i)WJ-R!PkLjs&Vqk*S9R}c=+F4hOg*)=oI%&7hOU6u^%brW^iWNpu|kM zgvL4(+P`SZB;yNyiojTi|Nb9@!R6OK_v1BZKgSa){MY8kyVpXc*BtFw<vZ5&o6GnA zH2uhtBMW|w46@9Oh-yK{p8|byhW}A~2kr3p`UP8}DW?zHqPb|j!SX%|!R+#~pJux@ ze~CbTPx;M!e<_RzVnpX)<P;R;<-nuy$FjKvQ-4@Chwb^dMuY2vpPk9VC6H#m7~mh5 zJoG;HpIP4~?Re|2x%B6#%V)$F(q_!x@#bfy^Gji{euK-;x<4NKZLa*Ld?z}6`Ids2 zIN)z>AOE+>j}0SUMP_N}gzE>_URa6$7W)6cJpIX&aCwjIM}Hb)dp=e)xP477!o?E! z735AuZ-wjV@~7nq!Uz0T;=kR0QyBX*?SV4=PyGe=S3g(Y)hLL)e3e1ZEHD56PyGd# z7hlVen~qt@^mXhAO`kW}S6o2430bBC`0pa3e>H${<^$kL{I~0;Ea*8S=oydyPyJd1 zl{N>@oETuDDZha4&Xb;nFKuPz7=fSE#ateTJb2HezQ0<>#`o-i+4Wx+^js74yfWyy zEa*8S=s79q8IS+_JAoQ#6_i%a5ZK31w83F2z^r%m2}P`fT3<?rtt8+-Cg??H<G)VF z{&ilG%<(S206Yb}T<N#}>d*n$?WZQ_nR9)6cv;YMQqXf;&~qa)v&XLsdaen2UK#XU z7WAAE^qds*jK}}|{jUaoHw|!|&;GNw-zh16zx}iAcc5y+$J&1RMR9xkY7A<BbwSTH zLC<AD&ly3_NkPwXLC=jSygmQApy!&P=aoUvWkJswLC;A+&v^Xb-~Vdh|2G<l4l0Sc zeqzq^Y~N3ozC4KCr~`rf59Y51h`l{l;@LhwJl^#NGoSw{FfvFGQ-7S(WU2471aOq$ z>HnlYer~<&c-QaXo&$cS3e3Z~=GW3pChEg(KN)zo+mFfjTfty`Fz@d8A7;4l_Y}e6 z@wc;J81TyMGtBS+>moES{&p2C4S!D+jHT!%ST_E$j}DVlX{QOc9Dh~HD}kw$?*<l! z|6#_X`0Em^27gt`wZK%$+kvT+cLC#$UYM~Te>toUli4yla$tw>mvtE?GqiIA!-IS) zILzP&eR~Rx{VCfd$_wmt!T6otGXzTj)=Mz<!?A*SfVC6M3#^l1X~5bGwjWqO!43fH zFW4bqX9?B_EJ3h%D1MD#Nx)VM#_z@cL$Eqv>jgUijCw#hfITJHN-QcoEm#e(O@eI) zwo$MoG|A0^WdPeD*h*k83swW{4Z#|Ly(w56Cduy$77y$_!BztMK(HEM4T3cSJ1AIO zOZA1@Fe3xlmqIH8_N|HmtWmH!U_YuDm}ngqED2Z`^Z<(h7B1LIU@Zl!1J+8gMqvDE zZJ3edKpPP(0~qTr%vcF5R<IgiCkxgHtfOE&f!bBD3}B}URtfA(!Bzt6E!b*ctnDzv z>%^X{U}eD07OWE30KrxQqb)!dY(Vo{xsV=Mvf=}FzTyLRo?xqi4Hm2h7_BGFs6j*L zHv_}?RdwTH!SJ1QW0YX{(z!v4f-JyB3Wl$b8zThE1IBMoB41!Bg5jH$#wCgm-Po0i z57-ro57<P(DuHDPwh|b>Rv2ci26mZXHNYkawjCJHNQW79z{U%90N6Oe8i8FZm?H*v zB?%S>Y^-2BftsmkXb7_eiw8DSuq0pwf_Z_>5G(`Obiwj~<qK8@EKjgXVABL!32drh ztAXVTRs(E`VB3LB7OV~!zg7${04ztaMqt@0v?I<+2o{GXTP9dMusMPy0h=wD7g(v{ zgFBk5XuuW;mH}*`VB3LRFW3QKHwYFFr*@;_1GZeSJYatmtPa@Cf-OyTJ1+ND9E_<- zal4kLxTChE@bI+Z0Ysz3p|*0j!!tV-!H%j_cVxu&s*Ot{-Bpq9!C)@#1_b1&J|u%6 zY*B9ELIQY<+P&Wl*nI$)qv2stBR3v!;DHR0-ij?TS(|sL-_mq<j44w>Rl3`Y)IA3% z2-rOk#$(K5E}n1eK!|T}5GMv059kJTZ)|K$RJi9y1GpE=cc4ISZZE4e+ARWgAs$r# zF%{4udL0<olb{RLx8WqAwIB`Y_T^LGO6ZG-3*skO;_s-WK1q*Re?%wY4@41Dz~D+n zDsf&G)oYeD4dS^F!SJF0*<LWjGnF!AQ|7HcS%sv!^F$R(YNMCz)4WAhlqmtiC%6{0 zAqbDIz8-<}u7-C;?G$enS}BSL2T>m7t(FH#W?=1-+S0m^d|gwZ_k<xeE<}79&faJe zZ+mJrTrfh%;m>;bR_XAJitQ~Sj;nqTtcyj7XF5y0Wg&8DRUU&1PH2+yp8DGuxoM$G zCox4;;6#)((eOE;HV?Rs2G*|!h{`p39n7ZETi$H8i6OFe{d~4b$Tmr3OTVYGO$o?0 zrP4dE*=&<SWV?n!hbZmEQrhTs25cZ%bjeaBS9<4%OujwsCAn%>lN@$8TpS{TQ6B4s z`tzEwzh+kKJjk`4<3TZ&itSOXSX2NlKFu`hUuMdoiq}nwM@vs2hCivWmQiI(9rgR0 z(MWeIN|M%xr<~D}mWI_o)J&YNRveERXP!8frC|-%g_6r3!D~jC&j?;b_;reW0;2t_ zBDMbu^a?IYkf3#x?hddX)Pl>b1sxf{awsv3>hdm)gbR&yZ}XHns34$QJ>?qC({R2q zuokKLov=SSGd-jQUxh!xIi|vaxl#}k;LjEv<jBZd4R5qQ3HjDA#V;T9RxNW&BdZeE z;T^ceyL7SJ0ai3#j*ubHVmAjt-WDtQgmh5}np9DnM?#tx%o)NAB%26eo`wY)7HKH^ zl}tkNMQ)7<;Ilv^mrXt4k4MUvVdaJz&#oHf8tl#X^)OpRJ4m*k<89p{+97^oeI|yx z6&u_fleO^ko<d%9`6h3B;Y|RqKZ}Kj5MJeRRO}C1QtKN{Nz%MkX{fqXcZTGlNZULZ z+hD9mfBj~t=s!`jqPME0OmpcFM=Hw5q29n(%`izYdL0t+OUa?<`bmhPOEgKOya^s( za;|`{YojpOPic$#A_-C2tMZhAyU0|gdh`i*m4OoYsv}W(sqVC;VT$O9#8Z()9TF+z zt)9-|f(UQbsK}*WM-BT<d7ip-NSwDCYG&2Pv+7+4QqrYVIflb>skN#!hh1sN)Vp*@ zjOrs=)IW_<hEUsf$Q7(MldWpu3S<+J;zofK&(cMtSm7v1)xzbV^x5d=;IqXcq2Jcc zsO9)1&rfDDCb>YQpJ8~QnF2j(D)7RZSapW4A7c>}h307nNlU1rQ7aybn`e}^0w^$i z?Ngwa0`c%j+iSBXGy)|j8y6nf(zY#j-woive`d+X!TMb6-fyEsuk(~wE_QP&W-@^^ z52OzRN%KMah@|QjR#w^GDlh({tsP0rqm>0n+l9h@TL($=zI`L5s<vu3t5ZoWwOESY zO8J3po@^d?Y?x{iyj8ztJAz<|RgK=N9lEa&MOJNNozro72kua+U9^QRFW5cq5dRpW zlT5H%vNRKq_BP#3Z^I#dlYv#kC0^(w&G5xhmtO5BQO$51+m$2;&oF#F1H$1?QmWYC zfK)-1iWMmY4PPN|kSnh^=o(TJgUX~MF~{Oe8(lDlc1q|{ktWG6jmOLa{YpSDCFuu@ zd|gZ|0S*{xc(OUs@Sr#<b#K)um`hx6BDVf1RR43?<=#aH**;VUG!(+yI-oQL1av@j zoT!dO@EP<lUO`}P8DwqJ?Vzo&3G)Y(t%pBaqa=++6DN6_qjiP|1**+pVev=xHmG-< ziPTF_Z*vf-H0^CZ0Tuos8^G4vd`aFWz0F2Y=}htf4PSrzP|q~79~cp<8)gU4icPb= zk`W<kT9XcdvuVH70S&J-WCl+37{OMYSl^4uR0nHFxg68YQfG=n9g8?{gUdwY=tLkW z93g!_yx=ma5=AZ8y4Za^VuT~G09-}Vn@mN$EMz*>C}3b`!nsZ!dJ>o&dNb4Qkf%(1 zk1xF8T1Lb0W3l^Dron9aP=g29KrMhn=&Gib)P`0S%b{IoWFU#Ivjs`;lV-Xw4&^5^ z{C+agh+guVPCrAE2vEH53?+~rIoN%DlaYf&r{cZUWl-Pe>*JB`m-m@fs=Ga9*7R}Y z_xF5!(z>>Heu_yt6)3FC@bxm&v-xJ#+e-e{Af@39dNV}8WFQ?AUBB|t49g&y8uPpd zeK+TX*?4VEI0=tgSDUK|m~UI-(?F-Q6|c6kt+U$L`03%KUK3DNQ5a{ns4tPR8hn$Y z%s+)%mWK;CJek)TX@u2}=ID=;!tyH-?8T}`(!5K7d5&yfQd>S!VdukM=A92b=148f zDrN>ak9b#Nb{->M)ElwgTeXoE=U^rdErZIT0WC;|ek)Zz6TzYK84JvF1OvMA;R=&{ z1_RgmcqfDPm*uj=%;hhLo+QFwt}rC(op%ZH_88?HRHUJdo_Xi_bD04K!(N)|l(0k1 z6sDV*&FzvnWmnnM{;F(b&>li(Pr(dCXDS<3MW$r9U9w37t}1AR!bEXFMGB~(qZEnD zo|4xJt4Jy@Ris~)S99fh2Zm?Mi{%QaB`FP+Iz(You5*BgHi(d=YDv3pD6^@rNi7|F zHcbnpvWZpMz`9}_zDVXAy)M$-e1{*hJuf;~%hrqOrc3;pt+(IBfPmhfjus7`evhy( zA^ONV!ukEtAs+y8Wc%R7LYmhVVf!Vl9l{QoVI-A1*;wQ2mtv(&$NRSK$ab?OEORq+ ztjdH%<=3(^Sg%&(UciD~RE8DdXW7F7*pJlyY=m$|kTDyY{t<fdW(0|_GeS+xGDg}N zW!BV8iY;ui{sK*4tuQLXJ6Y*m`Ke}Qz{teX+AmOoLqt{@uf;lZWCpxzlDQCOkbos* zH5D=|CgSPV*afIcjZ%|u=wmr*kjua(N6S7C!h8sizyp%tfW@S>Xp#g&IdL;N91;t5 z(^M9Yb4<3dCJ8arE=#ywmX=zURkkErHA#Y@p=9aHu~<9}pM6=p;o~H-uTgrcDP!b% zV<B=+jm(gB{=|BY18MwFD*J@Kfb7asjCs*`OcB-IjpQ2I@DWPl18kmvalq?Uyk6nG z4|L(>u!;}hC1AQpf&E>|yf{e<uA3B{vqw16A%!_`yS>k*-Ho6ogDYA3<BQ3U@D!F^ z1uu55W+s?uSn;ZMkwuiSd%rnDS|)sYCm^xm+8S=^^f43eTqA0MVIidy9S2z_HgE`F zW%+HLnJHH(*Gm#uwXE9xb9s}UGBZi!kO+QNOCZE+LSK;>gudd9yj6`slU1*ptv-sh zYy+iQJT{rF+SU)bA&~$cOd!g!%BGfqvb~rPlv?XyDd^0D$My;JK9~kY$@W&s3Z4fk zB{8K2C#Xp>0!k8wDo+&aC%SqFqJS&W;z|^*M9t*@S7LNE_fr)G%8Op>byRJ{0!<={ zp3H$xvN_Pn_C~-*$@*Oshkt^nRE=`bQdv_-S51J`YS?uFu|0Y)_KOnmPR5G7cg71C z#-+PGut{fRP-5s}BhBmrxtB&d8-@gOZ{q}Ec~}q;Dd0nJMiZ)o)cT!29XV2eFaDr# z3FtVjrFoep``43YR!pOZqFq!pXNI*zP`5z06ZO~a%^~X6RsTo}R>5LnW`9wOI9Re9 z>~)lPYC>;4*c&y^GL}^#6TC_%$b>NJ?TnFk$Z6#LA!BzBie1qd7QKW8G5uEVFWmh4 zpUT%nr=udVUfhQc0q!NJ9$KS4Nl-jY!EL%hHy+~6hj@P^|LQt*Z!SrA$Up)s1Jl!G zKo@Qh5aw&IvGC}{hheDob7Y33q<~luD$PtEqTn&zObv5%JYsIE5|=&8Oc<hg81V}U z(&7^!Y&u$dLUi@5$|uP9OgQ=qM_+Jo2GTdWntSMYN{C(y5<CGrp=`F2Y||5X%?+OF zWO#%x*2kbUU*3l}ZnW;crdP*vJf0KuGxzusjdCtYX3+7>iv<DmJ9@875R%GU)X&7b z%4Siasa&k7yAaIIB$LTt?4w&p^x7d*%#?<XR^cu0MLJ?7-d^!utB6e-8zT^XiuU(; z{(y@8t@><|MH($(0SlQ&x8}iUISl)QMc^)24}BO*)u1JM-FE1DIS8-qNBA||94zAg z;Wa%sLfE!?5sMSqhBmeptw8lfuUjFbo67XCsQS5dG~@VZH8L_wuj(DE<fa+0-Z7Kc z6)p9SO**UI7rPfC&t|H=OjSJ($$%qN)%#S{e}gnoWT|?eRQ+Q2V$e926sTv`$72B9 zkU_Z^KnG<2ZBdGa$VA(~l%_V&6H$^-@#IowK-(;bfQcB^RD#;jfh@sPip@~(<YiiX z)uVX5RhV|8j$2ixIHT&npz>eBpN8I{*7D-f9D~>LXq7JSqAjbDx_w>5TtW>wpQ<>R zrY2KSh-FQt*rC#hP@*z(4g#9)F3}O@Nk<qV>liL})UGO?KMUg^4vq)yvWmKkpEq3s z;c{dZFDW0!Og7kalD2-*iZm@*(~>zzO*#OPnj|PoGuenAztkZav27%ImwM6l1}xl% z=pXd~7<exKkR?G$D=tk-F8-`9tkTU^CJxCh4vGG?FN)=kuI{4j)@5<HgoAYuj~OKt z5?y^WV&mCOHO9j*Tu@FDTV0arv=aQQK^~53<A>D1(vCdMKhow!1-20T%Dj!tT`x3K zbIo2tu*w;fPW=QVO93kmVBY9<Ny%JCwiAchyNvQ-$0#oI2+X?Sq579$wM~={BeeFb zf0_OvN?#?YTUP-E<w+m65xwj;(?5$7q&KZ-hJ?_+L<m&E|5^R-`Z@jkH>99Uj~?%P zWV~<fNOi?HG<dx4YUtp%F+YZia-qHxf~Oe%@hDH7Wp4u;G>EZiIoi9=p_YUFqtLWa zIo2<SX4yi^)UX00A>x)-K<}gWS7eq^gdU2`v-Bjg;fZsOc>fmol_9g}r?V)^_hf4q zmLl=}&mIULYWxz9^f7*EK(W9PsuSbcIgDSnfCC~)C+3z;40A@h0&B^($XnIADiRAo z?o=o!RgFPBh@Cp$ftVf!G>IT9P8E#{<~fmlI=zM*j^b%bjOswbc;Heg3q~$eFc@eP z{TwLY){!nKd`4>YS`1?_sWE4@2uxF1(X~de!;WKRhp>7#lCM7u<AOM>@a&)p53KKI zx)lnO?WM;dCZ{}PtKSQWjnr!No=-b~(YjpX{K!jFNi<5^G79=h&hwP>hr`BF03Hw! za@U~3Hb-i5bOn)Qtult`;!q3z0HK!-*vB;c&r~wlwic}DjLk461Ih4bU~Q0Yn1)|J zGCzx>*~zh)^H5-`>s=<NO9Iz19biQT%beN2YY9pkwMI&YAQ-eHFja_<&2boaNVv$- zC|qhpBaD~>l2K0w$!41l?hVmO66-hU2>{coD8mY_HQRfS{5c>?eN}AFLH3FDyqlOZ zNZx3d6bg>tB#4k1tXOPti!aEqiEuEa2!ka_f7k70bgxlbe4?j-=8ow%6vO2&8BHUx z{&CDt&4N^vrMc#`vpt1JR}6<bPqaiK)9ZA!Lz^#$jB=Dip}+UM*i`aKEt>W;iS?tQ zM7F04jvP6{$AA!fxfmkR+*v0GmZJ`>xt+U99D#Ni%FxAU_*&FQ*izCXbCs}xr)5m1 z+B_xG=&gEE40e46=-4W)Ug2Iy4&;<3iPHegg#UpM+0v-<R;zhH6P6oImbaQ=32&Gt zN$lsMQbw~(LxpK?$SQTAO;sYF=(VaiP*#YOp<B4_vk+{C4}GY=Sb7H;(?SVExMZ~t zst@T<G2@{(vaK%CkA<3U_{Vz*)VD`35xUg!88oW>JF3%zY*oJRg&Ig`2OQu(D-L45 z$4wx-BH?$Qn4=&$H<P28Bng80%GN#xXQr$X&LPMhJi>7|3}YYUewv*<Ydu?=6w*R6 zZlkoPw;J}!Kr9q^s}8LvCpXpEnIQsZA`am0CQGwenXTC3wJXYB9*&RDqv8l94s#Kj zXYrC`P!`@G!yaUZo(hW>N+#rz<lRPDbd@3ffPTxLKKh&E*H@<y%W{^!;vmH@(-%2U zgua>^U#Qv^E#~Q=ZJyR5j*&?%K~mKpiOyYyuQvmv=Z21nRe9p2ANN-4<4MX68eY*U zNIhuVkTe78;b-Qd=6K=+*Uy-c^^>OTIi|V#NeH%Qa;o})E;#2`BdudKZW-@b^KEIV z!7B_jbTmvkbeb(y)S`Z&$f>({wWomEFrQVe#WSMIC=G9zKnz=0Qh!ooQhyi~s!2h- zRe#FYsQSy+?MTs7>c>}qY+lXTqnHP}4VUGR;FwZSOjx0qnv8^GC=<#{tq4)8DGlSS zf+_!v^tsKJV&MGJAaUSt`?V%c32UPC7pPI_a}-8nUf8hYuU1bSct{EDv;ub-OzX9e zXJvk;+%e6^8q4C~EHf!nZOL-TK)h4{U>czo#6KhqH9dSXgd)=FAM;07#^GgR_`@^1 ztp__wF=Mr!xp@%@vsqwiPi_7}duh-f2BP5&ll|ID+UAkv9i0Ni^lK93GM|Sy$RMgk zzM|TAD^o5^Nw^uoi+2mao)%iw0aGfOZ}^?WQI)K^?_Z&3ag;cfCHq1PSsVTt`8y$1 z{@u^19K+#2mHT>-0u7{M>ds1$_Nt#%rC>+NKPD-Y4z7MVGcp};)0*-H))ZtFLqZ*x zH6u1}Djqd4B!+U7`5As$)tM2Fq3WcOG<P02ySbL47ls3z1--`68;cyNgZZM-bo3AM zq&_R56I*?rjQLaWh$pSSMk~%`_KFx->0U2b=`HH3z$|*-OI5OkAkAafdmLv>3nivm zS-+$%0^%HNb=c<LY)Zk4U=H>rm`qyZ!{H&c<!b26Q_I#?11#Dj#>zTF0GCCqbufR^ zmHGZk7FRk#zDREQ$YuICXbTWAtd`egSZ}EJc#;5RT?sHjKg&A6R`w!PBkQlq!>Oq_ zv9RdHeC3t?EZjGmAOe%1b7ksmGIO;8KFa=>;D79jP#iEYL;0A<+;ChAfAK=%;un#n z#egZ<U~kMkIkc~2i9w8Xd0jJ}81#}3=+6*CSj3ng6eB}oB!DvmF?fW>FB5j~275c$ z^XP!^Oo_p*Kpw)&1oVrI*&<@t^I(i@iNRw8*@%%1n23FOtEd#*FQ$i&ei=MWz@LFU z2I*yMuwESV;BvGg4Md+}X@#4CQv$N1RvhyK`SUED<bgjgKpxRaq+KW6cP+4VQh*o* zp!h`=okZGo!Wc!CPPnsJ1WIDVc>z-URl+jZG{Wfq<YoUa(TXW{;jqi+0K3o9fDgI( zK=G$8cHywg#~5Xn4$2Ut3>3cvqJt=V9#IG{w{%dB80Db&g%lk`&Bw67wC^Y^11v<v z$&n=P-SGjT1c-{aM@7aBx}6@<JIhSqQLr?72#1Z>Hce*px6l4;`ynyjZ8)NgAKJKs zPz`W>QS`BJDSRKR)xg^N8cw{0B=eU@tcxaNFJy6*(D8P*c!4Oi`KT~oCxUR_#RL)2 zi`ODqy{LkCRZ(uNHuH3Wprepe2Y1B9k<n{6VuSi3Zcw*`Z*%DFI7fXaorM`Q#*7I? z9yO-7N@q7JrfGg1n$7P4YQc;ONq=2_ai)}b(UVd(o1c}{sJNz5c5P0|hRA`nIMyy= za>5wtuAh$OacJCO%x}%wG8$Snw5XAxNkx;FF1ebeUdXRutz(rde7!<mh~y%Pi(QRt zNL8eP<3lEkVX|Ow1D2{tyif-i5$QzsCR3Qnqyp_s`bB&>Bw}(!ND{~d`9;DsSnDu@ z2%3Q<l1hq9k?OpO8CwZr6VZwiP>K`--ohDaiWppulyJoz0iL6jB!KNGWkD*xpfKbL zT^fX-D~}0S#cx_)5vC4W{+9J+s?5@>s;|IWb)dM8fLd)4P^-4aES$mBtF(W#>b2=} zDSQp|7MzCPL?Dabj?{S<Q&pC+nZ*jN#NWnT%shit8Dv(?D$_KpU#QKa+Sf1Er^@u_ z6x!5cL%lD@*X3&IY-AuB56m_Y-Nk@V2k2c0K&P}p4wvh>;sMh9bH$<DDrpIl(9NqM z`oQ&>I!DsW<eWVmrsbeG=Z{J<S>Q^VvV;Y&z{Z-ggbNF|2$EFx>KuRgoEG)>LZpGO zqOaZ$WIa9cx1XD)2rZ;WC8Z)k#=@(pUcQT}PNhpaOW}Xv&9Oq*qCOk$TxLFxHJ4oY zu_VV!gj90%yn%>QF3dBV$@>F{C(PJsSRpUPHOq<<$BOlJQ>oB<N@S8uzOnXTQlUpb zRn5K1^m<1yi+T;u78kxk;+g@BuHP;8ub4<_WX`kHD?>cNwXU((jfD{*Q_)&DHal0S zg%QM(p_cyz+*-s6aL$-<H)rqrnS<CnCr~zfKg56lduI#4Aj}28m;Iguh{1oFKAE-Y za|6U?`jsI~zjuou({E%#M>qXomJp^N%%V)+tTH&)WqQZe-^L;W8W4^lL?-RtZ?=K3 z8E66#eKwlU5qP;EX-Vz8bIl}w3BMfcuSNM91|CZ^jI|jFwnIhZEgU}KXqDY*K-%O$ zX_JGbO%9g!=lDh1EyyZR+MkOCX&K2cEuW&RdDE0tXj6;fqE%|zrdhmfl7!b*A+F`{ ztWnU>B8a@(DR1I2Wdwm4%P%mWqN_LHZ^(3#BdF{^fs>CWaB~qv;2q5i+*~{e%vgSb z`7|#YZdLpBddlv9M61M6LL<P<lhCZ2XT$ZodA4YJAI|bDH(v}Eo0|`jTm%GAy~Zy{ zuBVk;J@-lJzAIS<G}DmTe~CcJ{&ljhJ{l`)Q?XjLY58Tz!|&|j7PP}w0m@+$4|4f_ z#?{Q)p8^KBIt3M=QXp<ElIzt=luWTG_bxbSvT5x1`s#6+Qikl9Hs|<vQ4qi5-;c*& z$FH{}^!R+yL62yfo5Nmk+Z=ux0|FdAPr;ZD-`b#|yC<vR!#T3W>Q(=Mmto!r>G2;0 z)#8^Kx?ZYK*~<2Y>|G^b&R#6c!k{)TJj^}=nWDGhsl4dLugaPoch1o;Dj5J_2szJR zEVtZ1P!|LZ^PQ@(aNk^wVb1?AIMVtwrecj6uqbnYdDu<95gclCF{CCzvhf?~N<2#h zvxjF_oniLf3`OVS&ZuuCvYKLAZVjP}qiQ5gGt3iXI!W|yO#&TeAo?{GXd1UQWQTu< zWRejo+>8)bwM=r_{cazedY^aEuZbs)i-&$2&i^&hQ7Md!S|Y&H9*7w-A^I`MPhgjy z&qtO2XX1(c@y*NsGtnV2BSU@yJk>!SJQ1LGW@+Y~q@Q)^Fi6@5GT8ZIEjb+XdxC`+ z77sKR2;{=`fC_2A#ba`IM?KO!m66!Zv;GN0F-;zOHm0J)rf8G?uppZX3XC&jicJLt zS_X$v(&8uvifHO&6$MlLcEK7>HIFX!!x*p0q{o~v+#@2&!50q}hk(@g_z@?g)kxo- zpo$URP%N!bc5X3xR{OG850)(})#@<N<`WXb(GSyIfRsQI;wXP2hZ?c5udi89Ex!Kx zAJls+${VTF9f;AK<E3k~IbJ%|K*t-jKPiVy;wVE>MOh^KZK6271*?p7H^??WAMwBt zk1$E`Jc<d+ISsPp$!C;DR&WMKy5|cK`*&DXXpr}?;SquJ2o9EleQt-`xTX#*@U^(O zz;#x0$2v$}PKD__)zrX)+OqW&EIbtK0#!!;eAc6XD#AAU=WVi0Y{1%YVZ4emSD62_ z<ouBQrvDVBt8))Yv~TsSdWZ}Xl8~TOwkQ`?A@2#P*%wI3FdKO*2`z0E<kVbcnv1PW zbCqineFD;53BVI%gw_%;5{X29=)Rd&^jZaFaZs-jFB1k?Cbovh%p_D&?DLTnGYp*+ z8FW(H!Bn+E4Y-%dFqZ9*K8YcV^ec?;JM;NQ6KQlpa6y93^AmB!t16U%4i_mh+<bXg zc{YTzbRom{fu0X5W?+P3hX{3wnyjg00#);tNkVFkLaVq@@t5lmGU|{YfkLQN1Zv`T z04P)A#lr|;bs&U%5(1ndIy%S4C^LaEkMDWKAPoQ1dtQ9tk#L#~jW&ASGGVC1iG*rf zZXAp<d})}eKVLVShJCV6M}}=4s3FW~xQfv!nTQmS7DSdZ*}_qn4v35p>H&GNv}R!# z!opZG3}LGe>5>+0ae>+9f<m<C7>sySdoD*Nw)X5ofZ3j*CkoFWP)fre&=jPv(Nv&N z-2x5;8CSRc1fu>$uWNCSbJMo(#xfXn&Uk41;r_P2FeLw1=tWF^o=wme<|pwmlX-4h zC9AgT7puFbkQJ}>CJ(&>9;s-&*X}n$*e<6Z@R~^oW(`U3J|NUSf_ZH<f|C(k2P)z+ z5eCYozP!VN+@LeIMbFgyh+3vufR+!e<sD3ENVB1R^iv9(dc-1{q>9GK=s%9b(9tB| z@(dW5wXlpdGLVK!jW0E*)QIWSh%z!EQ>#7#O~BL`4YCrLEsEDfBSe5Xp+p7;6<H#{ zohrlRL6sE}6!BujMsSq{L{2u-JQNT)(~Mk>$PChv%Yo*rH0T0!a-c9kQ#4PKra*RP zNj-yorAi>#A4ql`xC*E=NI+ArY~ZL4S}_K0e45u6&qR<M$#}|8Pqcd48uOzKv2Ey3 z7zr;*P>ZT~YlSyp)c7OoV5JQNXCin5gJEVe)~izwSXn{HJ{55#!0n6PJAzv0{*se9 zst^_=D1;=)LI(CIHRLe&ClT>02E(C9FnSg~+BPtk34`uYK473qB2-e1Dk&zx&Z%iq zWY9_dsCboBXk>i!XA8Lu8lhjVeSr)JAp;Ww%EWZK2grvJC&4l|1y%;7>{wTK2FP$q z1V(vV_-Vn=YUYPGw5WdzBh31n@CWIzVy)T(l2IKw1j5y@eyvbdc?iu^p&JmIuN;Z) zu4oU;8*v!u?>r+>i2P;lWJ;ns*HvWQUG*YZnTshs8MX9YFw@xRNKr;w;!+2SL%Qn1 z90=iqysFFxvkPMsc44HU3qvFp(D0oG9SDYKKH1kNr|zrjZv#u{@<0_V8Un2nsJ_W; zR|sUgvPu%r>!FA&Ey`epBf%)-j1Z=a5UR`60YjKDJ37j@^k^Mj3>a)3ogTo3=<kZa zsQSAV$jjE>EkuB=zoU%&p_8Lf`~h7|{VBB4k1hvlc704ncYVu=`n$d-aqhlp*T>H& zuzDE}U0;O1>w7vR|7sh*?)n;$jhTcx$LsIrm@H^<W>;t9bCAZSKw2gF@LYyxJTggK zIJ!)Ak1M1rq?yimAp(`fND;fLHc2D&caRc+mI0Qo0R9M>ff3kc#(^X~DzjoWqeo2w zZALBbUBY=L)xQeIkA4oOt~l6@GAd+bQcOVwuv29W1c(q;K)H^AQm$mUV#CuaJgE+I z1yWKSCNbS%5@m-;DBbTMG+mR>wEJBJHkH~+U@A3YIyIt<Oeo#&`*7=Q8hD1t1ZJ0X zH%V3qpUjZ^REPkxvq3@nq7o57;#nQ@G9hb!$#!HWi5}Z*YNC%7(#muPToaIk)q5uf z<e+=+Wp0vn4*W=pKZkNN2kIDPhUy$PAcuU_yXX#`d4j?KP0>7MngachM|+z(#a`|Y zB)bmW2bA82Os3XW14pg1wW5pX6Yl9#2$V-Mo>l?ii47f3R3)C+*4av!J6lN&B%Gl_ zBW(RWLXug0RgJsfl`D(_#zzd+<!?k<0cluD_B2UDD>~K9VG@IN8b7KuD054j9IEG{ zpmE?uCVmE$iR!$_(3N>%0E-lY1`;G8WM9(|l5`x73s?~Q5QFy~K?UUExZp=}`}=x? zkU?9ETV>BALM7!@Nim7gNs&P(m8y6tHhEccTec`_nqn~Jl9C6=MFu7Y5t*1yH=fZ} z$b10-6xgz9WTnk*6;O1q1Zs#On4yOl-(el8{_psMs-P(a*-Scfz||HA31u@3*7aSd z?9QKtWiuH~(g?5_2J1BTA&q?h&>9)jnpqB%l7ar=N+x1qxKhqiso}~7vZ~<<Wid5D zMy-iuU}jTc=ZCb}s${rAx*D!zBZLn!T;YQ`TwxRrS4dOC6{<uHR|G>eHC!QQ&~T-U ztQ68;9@IIDhQeAUP$LX2Dhne%0#Hg4Fm{19$bj^$k|Mz=$QdC_7a>%asRM>EVGdU) z-%*DvMPO(;TnTl*bjU;3X|`d-bbPg_>9FE@NG5BB>V%`*0TJfoo$u~&Uw48CU;l=o zJTI5#t-_aNyzmJgDNDnskko-8sn){o{7_<WVZwgCJJfjtIq6MjtVU&%Ah>N*R?C2Z z{U=%!#%XTw+1^+LC65$T_AXiiOa;S;A}&U3=d*fSgU-RGy3J8dRp+jMA0sS8V>02z zPK~){TQ6_F5Hi-odR)fbWL$=E5x1r6H^S`-8M8#kq;NDILM-P-uMNZTni;iG@;aJ& zT~|#jxtN*9D&!%Xa{}_UEqm%@!0Taqlt=0$#e7mjMV#s88oI9wcvxh*VL~;q0e_kt z4dx+d9+vm0+YeKW((BAuYp49eTf_qRPELVsq`>ez_PcsyHUAZJub`gl3c9x2U7y0W zB1n>f{l4qb;A!Pp=T#*yV@Mf7CNQMhTn%pIns=G`;wiQ$5~yno4`KkVre6u;@K$}t zS5#ww;wmh)16Oh2BCCJvqqGB0KyENB2dJp^Ghi4?^?`vQU|2?mkSQ<(44j9APJtmh z1*EqcPYp46CW5PT6rvO0fCl8~>QNj{D(S#+pBaaU#36!k3Wqp+imr}99J7%j5}g}$ zN57|QM~-ZNt~U)Z5Bds0`~huL7@G`JL-&UY@#wV6!yB$g07X*)DOyn65;hfne})pl zqjSY0S@|fwSIJUQ>(b#6oODGXmTHQreKNh68r8yH)x|exBe9WsyLK0CpDv{$DXcU$ z`Z;yR4R?De1cIkQK9+lai~6lNm@G}BeNZ1DdeI5tl8_c?JzeoA`d^E(!vv@a$V@dg zxOEsrOJN6bWIJy+3gQ9}nc3c1hCJLf66U~le|>@jxWT3>MqS#5HUdkn_o7h2tk4NL zae%7NChYI_I$F5wgDylO4cv<i5XGJh%0wox5a6j18K8m*T+x4A2tdmzLLi%$2+HGW zrs>$zMtC;)-~{s6?5Y#PwSlo#RT3){3s_xXJ%Hrd?JDtJfTrXVP085dI;5jE47F!L zO=|H6cL<w*MsQd&%G|*vp+9lw5f)Jf-y)llW%YN-exPzUvSXN0UknoZo>WREcP^#M zrB>`KQ+N|ibTy}qxO4wUFvz|_EuQ&)g6|y581W=~5gg=jFeD=*KHwilL~1qy8)X{E z%nP70^GarvlGomNqpN!$2A*&~4J`~LR1s4_!3mm}*D1jP&}h-p4q**6=)f4bso9}r z2o7T;>bFy<0HkIX6pbYkjio&s9?K#|R|&ZqqD>OyC80?|kzwqZBnWGPQWRbPJb>+& zm7+)ks)`CT%|+M|kX;$+lvZ7z&ikG~f!&$YXKoJXQL)ko@lO4a7ZPxA$K3tLYgXei z^zLcs^Ofpm0p#XlZX&A)3WueSRE0N;5Fy_8R?F_R^j_I!+knJn>^xCSv3|S))FggO ziC+sY4!`_YC^S3%V*6F&uR*|U<F6Q$4zjvMRv=!5s26!mVzwY~199Lse5Y{K6)&iq z1|n5nR_|u^?BBNy8hF*eqj!LqAI$`owi;>Ca!A_hi4<It(tSO~t>!wHwF*ztO2&gW z(Qx(Y4A~p^SdTIaLRk`(*zy{4XXwgytuE45@584xyv-0aoOo*-X4|P_J{)q$P^?D_ zX?%&^jr+qxGb^>3{9mA3@|QskV0f``66F$SqOSv{1Zdy53ituc8+gwYufvO{?Rd@m zc(;oY1ckx(u^y_%MJ`RpMZ19!&A@hSp`nAuIS|hgIxzaFadA@-9M??nx^bOxF=l5| z>m1pNEEr+p`&-qpDUNCFy2K@kDAx-p7w02*^+l#D9OUwwxh$=^QHB=<CwU?MqtMgR z$eWY^NQ%!D$&12E@xcsbHx(Fu%Vw<DvBv>r7!97_2x0aJ7#Ntbx9JGcHUbiWC^BnO z7LuW!ws~UwLGWS=$rq^Ai0xiX53ALQbs1<rDaLKJ?CmKK+XWfbK@`ntwr*=U!%t31 z1HVfPg0((%JAuv?n#v9!z)G{tGH~c4ca=efmde6PI|e9aTjU~SVl?y$po(rg1dzZ; zod#$mt$xU1wTG^ntCGe+0cZiLX<_vY@nG%A0Lt2vr8ncn<m@_=qpNp=yP5XD{toTo zAK(Cgvf1AyLGv|84;^kT(*@iJaKyHXFGJ`JB-VnNh%_&SMpy3ufftT4KpGh?9c7Bj zD63M!V{qXpJHkzNM!P15v&XJQDAzK`b^gZru_g^!?gt4S9+()Y34CM#60QYk7)Am` z_a`z>5+Mz7J|L4l5fT`O5Q&hjzCFegq}58;G9jM7QKdr~(xGvwbacWbu>7jb%iMS4 znHSxXjw|h$+-jic#``v9(|s;4YE|*E7|nR-cP~VjTi=QOE;<J`RQV2$`DGuw8$ex2 zI9SBW-=Kr_VorA-C_r(oo%P1~o%pbF@I`9whWX7HjX2SH7byd_9B5T~SWJ*33UIL7 zQo^KZi!hrT9@dr+AhPZlh2<TyrLpR$t4c3VXy6D}WAJ^eRoig+Y$I5j89;b#cjq1T zz7#Zf_VvgnkJ$gC_XE~JlWG*h&$-)1F^3osu!>X*3arEhfDrZR5=(OlCY4n~svI5k z2o;es1c4>u9v!&@!M?`x1uYVT88ulk-|Cto9T*d`PB|lff^9A82gd8*kH=T%UG;r+ zyoBg~dBT^}s&jpKK>J(JqW&Z^6fZo-8S3R{oaV!H!oTa-GCEYcd%{_4$RoG$p?_0o zcyz_r5aGC1c7E9vdjX3<N4a9}MDdv;&(2gwlj?asOsNAy52<etU5>|gP2!0b;|z-7 z^4GRYYWqSF!#1EVlZwH3n75MRo^aF>9wy*n9=zm2#OIHrg$xdlJap0=-CFNv9K^FY zC0stDnSy5vE$X+~m{bmz!M)?cB-KZIt1;sUSO5}1QmfFTgFU6ngV8b*$9Uy#Bo!n? zc*As&;L!%$_oOcXIEED26*NgPPNm3N%E0%gDWTqGL)n|SS$J9W&$UR%Hf^J?XySFP z_mvY^G>^6h*Z;@fd4NYzt#N-sLNSOY6s3r+5Co~|B!C)vhX?^dz)jnbKuDHk1Bs%p zf{Gmx6%jNj3MeYYf(1oI#fI3fs3_PFJ1SmLQNQ1N&dlu0W<l?jd%x%Vo;y!A|9Af9 zJ^ejpX3m_E>~X?IP%0&IshEX#^HOohT-m_nF3x-Ni!oMGi#PL&G1l=vQ*nEc7AsD^ zMYu#s2ly|OpBUp9TBCNAw?A)Du8Bz6^)w`ToD^foQ>oLGj{uVPaS75g<tpE$)jpOY z-Kw~|kaP;<J89a-L8RN1YZU#5_R$QfR&i~Sw2yow?L)rxwp_VZBWWL3Al<IGMM&Dm zQ%Ks!TS#{(*LRV$kMC{Qm>9!Yp<Itb(yqrL-Kn?^NII7#NOvi&5=qCg6iG@r#<<Jo zwj-@l+`BdxRo^gHE3Pq;_S+jtr*9;Z%pGHlF-STEUZi^zSB9ihuntK&<rw23r2a~( zru(Qz8O9i$xc9zB`RIwHedHkBtGEK2y9KGA^7|FiKqdWxbf3~Ys*&Y)J5rW%{hVcw zLzHwIt3b5$F_I3Y8_!zqQLf2IekBb+3MlDDr2AFKcOvOjZ9^KWTz^K=;U#nHFhg;Z zkp^p5B%L=em*~TFct~q?ct|?Dr;)_EV~p2q?pvhwirbH*%k)>I4T_6peA9ljkseUo zI3%q%8R<dAO}F(fLK>k`a2&m5mXh8=(q(XcoF%PCdQ7=KjHFBB1teV>pHY1}M=g&x z4B0n0#+YPFD{SdATWZphSKgG~t4O*{H*973ZE8zxkVY!K(Ka{Nmaeg-n{2%eHn+u= z-bLD?LfM6+Q~y1ZPJKpe!+1!Q%U~p3e!n1{seJTqV;EzURDzVPq~<3WhJ4>I#%PbE zefW?zDlTAiHzCO<F=C9RNPU#wJCI~^`WRz9lJ@&Cl5R8mkRDU6KO*%}J{q^RTw5YN zu3Xz9Y1b6nH4ABzavf;9PO@E#k)BYlGi=wnw(A0<Czb0Bw(Cc12-Qxd;A4*^J$ABT zY*u=kk#q{4M|w(e|3ErT`B;xfT~>RLwkhsQBwh9owl|D%ihJ3X_Sn*Iwv?A(>7{kB zq!G4MWJ~AU(ucOx=@i3wTBWKdl1|kyr12`=9Hg_9v;^rHrMKGF`weM};*RcU`R&lj zFh(gK>yb`Z(q5$Zl=L-{&fEQ`T5X|yXTy+5PmGa_q*E{!={d#a+uU79&nxaho7;n= zE#e2Ht;+QPk}mOMx>&AlkX}%(9whDB4e3S2^+D3{RwL=~E<t)pxn6;!ebm~n_aeQl zT-V#KTW#0fNUtc@Pi@y<ZP!L!scGff1WAY79!bZWi1ey*O|xBx+pZIkwky{uwri#B z8bp%&6fwpnw(CNq*A=%MN$2uoq`s;?vbq^Yj*<$H#wzJjqzOv82Wg^`wjt^CeT(#l z3U5D>PW|!St^O|)=~Lz7bR=EV*+{wvS!nCU_Arb$RVb~HbgI&k&QN}bB4HlnqYCM3 zC7p|;!+Q~_pW=EY8pc~Hl%YsElp-V@N(~aGKqz-2?N`#>NPZ=qo@5x4lr#oOhgXL5 zv*Id|wBEZ&|4?y!j-=ygkZi@#3W<s(jxk8TE9opG?e}-2DT-^FV#U!NN%pjkF;bAU z-dd!$755~Pj^k~l$;xl%R9?$du04>nk4KPpC~hl~_R%8EFwRy!Za`|HT$dneA6>bb z{*K~$BWWM^AW<cx<w+#%H@l}{G*x=zkhI@}Nbf4HF@v=Bn~J1;>_U<arecgwkhG7^ znY4JtWg=-GqmU><^d=w;QqpZmdPMZ1bfWT6h@?ZAjTBINofrhQ-UOtbN^dHX4tWn! zfzs<f&@g;TI^UM=M$##L%a-mV`mQRJ4M;k+XOVPlEt!Dm*v2Bguk`YfbZk!yGmJtN z$1AqfVmON`6<26Wi;#4@PukMT5r&bf!dru+<9z~2$9vRBE8c-fA1J*XBpq*~QC4`F zNK^?WxiZ_zZ`PSs3PvLBQhp~RX}{MYX>0lgX^Qge8AJc9^g1BvwDd&MX*qMOVeD3} zxkx&ci;zB4+ya|>GRK;i9L-SGONHFkmhQ5p&9>Bhyfx;HMWX7+N3JbZBI!`Bwxtb7 zBUHQ_k#tH&o@E#xDQ+^7PT%=RA1m%En>#SU3h&s7mUN0Ojj*KxTlxfvVkK3*sXm>S zvu)`CI*s1S^=BmQdOSs|rJ=S|VM~1|Zk@}awlo<@`<P`*OOd9i)GtTUxg2tiVSJ*v zvye_x@m3>!s<_K+Zg#E}-gUOL%9ftAr4MZ>HqY{LvMu$urRR}!8Fb0F^aj~dxh-8` zOB-zIO<OviW}?f=i=^{=t}WeROHbI+0b4qmW~_aDi8R2F`Z!=qjcIJ!wSz4UNAgFB zUbaZe$8AV*y&GfPhosBzJERij+Hk62OjA-@r0GgJ1?e;8BMnLWxEx9M2k#>7Rj!}g zu5rcO-d5a6NZQ9Rq%RaV(dHH+ovz|ImFV?onvV3P((8@XN4cJ9yG}*=O1YNWt~E$s zD{elLj%^Q8p7Q$*+3BRD`ecV;o}537RH~$70lE{o1v3nT<RCp+Zq3&|L+Yov1{B`8 zDvriTx+L2Ix@RaxBJ=oNg+xF|V`m!1H_Asol1^3I3M;?EZ0TO4;mSuzrRBO136mj| zONpRNNhz}pW3-a|NIF$Zk-k-N+=Ha!_}+GHUv24)N1ChjCL!t6zmBBKzEKS~!If(h zB<=btlCIzG=NiU7<$4;Dj-v?aJH=Jm+!ILOEAADWi$2e))i@-%w-RHtK+?6^#dhtF zv|qUnv0cxxU8f`cs9gQF>!r5q^+^9zu8VEg`)t?8kbY9Gn{C%ukPawrCz8%llQ~vO zTO<9fTu(yMDNVCo`yu_JTnF2(IY_@Mt^i4gSA)b*NPgEL(J3MQ11VQY>E{~;rUf@2 zN!RbaNM6NlLRzT8dm2gC$D2sn)|y^m)vCXu-0!Ohl=!fg%EBTeU;c4a`YU{S^cs^m zpW@-4*VL@>R{8?HJb_}LCs!+V^jJ=wg1j<Mao#MSC(ko0ue8b+Yj_TE%q|HOmy~%b z^2(<AJd-*UcJ*{9oZ{)Ed`Wn-N(z02y&zAGHHu10{9bHHj{dzSXIGR@^A!XtC-?RH zOG^s!0wv{Tm6HP%vr2rkC;O@czKXKE(#b^?K3|~5@0(m%Q81bGPc91Zzrt5m*j?r{ zhssx#zc4T0D-31H&SapR)WoVp@K2?wvSg~1yBvQ#JlkhSk0Z!`(SME0Gx3+t@>P`P z`Kd*H{PplGpY9M3<$p#=Wo1d(R7d%AsO)H$%8{!d%l_=rB3n*7uu^@P{7w}+{cok$ zO2?71&;Nz@_uBW7F2ACHSGq>8bRfQpUeeQb40r<cUzMeF7^*+aFA2=Z^E(;?i8xaB z5IO#-zA|5hL_c=GAWu<6`3z50S^4ZT`mf6Js)_=ir%sZNRC<m?`AUJR&e#g<Z<g18 zBRpjU1?7H*K~=)uK)E-NSE2fvp=AtTC5#;<)xJ{CjPgRCr@Y8r6MxGdBIWOJ>B*5X zS`<2ZwAuP9)CgTrUdCt<AcbY+1;tnm<Fs`gVz^ecHl|7$w#44@t7rg3QQ@nsDh*V6 z@+y3uvhsk3`9u-pvkvpH;rR;ksw!36!D~q+zCE+^Y9#zTKXZWUk{M##c?E&0yizlX zhYPQ~Do|Qd=Bv~#A(T6_6;yWjc=|I{U}jNaXZUd8RjHAVDNSBkprjjBn^#H8(xu=j zDXR=HL+Wmaq)YH{^-)z;S?>3jSE%{Lp>4z!;@@enk?iGv;r;db;{QwKr|hmG51Xv8 z$EY#tRJBRw?4ByWIcqDe>1x|pB>S%_%gZmNS(bZ>O3Dg7Gki13D{7e6mlc-!!tMP? z*;AzStNzQn#waTBl@>~WnoHl~)migq=T+p*aLqp><%gc7M0d@-RfnZ7G6;%G5IPGL z@QkX;fG0oH5k?Bfyk@bkR#Z_$((7AVS>DxCQ(om!q5AVGD-W6KNdC>PMKUY>YoV_w zj}F$8J1D1az9adcU0g!-737uD8%{MdSyfgb*GY6`%ndLG30UR4Qkz1gaPkTY$}0*9 zqqN4Z_Wx*omk06~H?_GjFcf-D^K>W;U2{nf`*-4xFx~iHc>mh<bNF=af93bT@;lu9 zmjBty-@9M+zw-NE`TZ;RH*I^7dllB*fnJ{ed1Z2Crmq4$jOYGhkIZKHR~RVnQS2+3 zS{(44cA6*Ani#t01D%v!SC6S^-Ji8@+@5M(KK^e!`2T!75W5Py%=pXGbh*SgC*t-6 zh}+K8nM_R&GeuX1%cBF=G~Bko2;u$3>9}=8&$QcW1cVwPyu;7QJ+9fe9a6+_<m%(l z6Lb4&&7OQ8!TE25dURhdhFvX2NdI5DO#J)v^{Auj8Amm(?~iIy&uB8{D1TJ_D5E|P zw4z$oGg>Wd;g4!w&uG3d&L4GbJ>%Hq#{Q_-dPZ#12L7l9QHDHmZ8bRBI3cQ?(Lx@A zambn<<#&wfHyOXp>KV<FkM*}25@WQD>S!G2Z;>myokW*yhFT^!_qQ4pZM2DMX*4&( zS&O@hYawwpi!qu-wJ?tMH_nafj{d^tIvwIB>9KGO=aSC#q_YFK5R8j5;s`V9*eK&z zu+`}jR(lneq(P-u!VtfwL>qAzODv*q=GVztVLCaF8NcNwDDiiu+}4x#9+cyH%0j{$ z)7Y=$Z)V3o-^yoGGcOL*W!us&TPYLGonUj@h0BO$<y0qCADkMAQm%Y>wMDyle_Sqd zVl-==5_CBzxt~KGrDdt-F>z)crP+0~K*DMrZM42v*IE>Nx3!HrNx2`sjN90G+)SEO zJyFIi8#3fETC~B#ZBtrgO9yR9HXPD=t87VD$7*i7EuB!$;&N??K#a@fpLuMw1h9oe zei0wm(Vq~lBheB-dH!x4O)UY8uOB*D84}eBRO__2C4k4rgiaoh4#}e(;mCSY>o~T7 zCGliEBpMYC9jBb{(2><d)^W2XfZZK(4~P7LBW=z!Kkv|C36p&|`As&<+DM1|ibMX= zA&+;YP1e6#N6;Zpvq-RoBW<!e!8-1A$ns9Nb$sNIzjTysp+jC~DTB{D>SDK}%x`NH zQhGNe8t*yyD;)gNhM|+cQs(^}`Er)ItaOQH)q!5~5^YFyH!ALE{*O{poGmp+TB5j? z{Fk*S^v1U2L0YP~1pdb>sgo^rMY>gSV(((x(MGB*Wgyimt`Gku^k^f?mIff*uDBum zZ>1z@*;>j*TA{cc{<l`r1Y4SnbeH0C`QJuKg|<|Tv_^5I{Fl5$tMwIH3UIzoan<~9 ztE4%$6hzvfxOx0PQAzV{=_;fL6}N!@9wjZZrNu~(D{d+O&s0*aElF;kRNN~5k5Q7O zQcG)*o>klf{2!~NjkYAAZdKf7{!58OtM?VOBrY#1?q&Y7+z{98w)7^_tBTvfe`$l! z#!g$>jr5x0KH>jaO4@5nUm?ArxPAPeprrk_bO7ls#U14TL?s!tDJ{hyy{$MIAKNSG zXj@`PRjG(Jnj<AB*Os<)0@4SH^B{FlQi3hXn7><bvXb=_CCPZDC0S*<M{yZQ9hKC_ zma>pOSKI)kvz0W&mSnBvH;T(fnxv#0Tbh6*<q&O5Mw+aoTw5wcl3q62C`Ov1q*7b* zBmJVd0Ma>1s<x#$NPj3Uh$QQSqK$dBG#@F3U$k)*|GO#I1-7&Z=_uv8nE%p0N2@p0 zv{VasjB;JUf9bKK)mvIxS_9Wixvu4ZqH=w}mNp`_RIZQnKUcYKwxumdt(EIm{^u#z zmu+b~(n<WH)oS;A<+_7&E$u{Vr(AdQzd*TuVoQ6G5|ry#{4Z3l`)p}H(kaUI0RMf; z^`I>o^(Z0b8iQ1%TpQWa(MV~^H4bU2a%IwDO0rw!8Ol{=1jWjgshKIsrjz}Yt87Ne z!b9@b)t2N<!I8=}6-h>)Xd}ax`XHU7T(gi^mWb;BTN;8iQ@P5!g{8_h+m>>WDwV73 zA1SL2u|Hdq8OwRfRkl7XQ?A9fREl(ga`hvXE7yQ6RU^$)u5*x*m21$J<{@3KT<0UD zDA%iOX#tXazd71igp{gW7u(WOq^p%{EmE3tU13YBkgiv*Ymm~F>sniS0O>~MD!VX= zU(x6kqjzPJ{Aclds*ygIIuyGdUSFR}ji15qb@N>8L(X3yR0%H+S;G63F<Z{1&ye#i zX86(@pDvu~--DdR?>AFl#u^Fl0Q$~jCMP7?aa1Vgg~T?|sk1tiRum?EG2r>%H=OeH zu9C?Y9lK?C>`%X*@$Sh3uNg6T^c}&+-fr9N$2U4Bj{C#^t@rt_uXu7vS&JE6dM?lX z>EQHvTfX|eWaj<j{68+gsPVZLS`lRxl+W;YFDd-t;+UvE{*d~}D)Qw8x+f+sh>8lD z%&hX#?lTGvihw+ePWQqJp8wC1!cnP?j*>ETAKeRm`BhUBWGGTTqod|+(AE^vGj(Jb zB2<1+V!iI8dj;$Dq}Vy6(4wPuGsMfh=j!HXNGEC@R)GpiO7*Dk2SZFx&SVq|F#|bk zM8RvOdw|u22{WV_7*rr}b-6&VmfzJ#-Vw46>G%Eks&9Byx^<h(B9IU>2b~NvWXT&g z%WsIybPr|AXn;#})a^1&;kf&o^{cd$Fm`ZCO3zGb9$H7ywftW|@<MURd}O<ekvXx4 zU_&}Dz+|}?8C`Q5J9T8_jyu}P$QbRn8I_)l%v1<RdZhd|yLB?t(&B8LbA1)%USFXa z*QA_vX~>%|xt*MGb%c@EmqKaIgvoL-qhNwACJ)BXU={Ku*CfRR6^cvxuxfrGW<F=D zT+9ueZMK;idDUL-pqTHBS!u4tJ)5p96qk&E+0;*n*$A_iZYRV%3**Q1Ld@$hyZMFE zBWvx0)lMB*%j~IfG7T{6To=<Crq;!Dh1qw$<%=h+1%BN1;h|l?@Nn44R0b*vW=Jzp zhv>*5BaS{SW>6hQ#+Z-}&#rS=YBW2<h&0KiBaDnL`mjQtRfoBx4s$~tW_cZEV;v@R zb#2A<X&s$k>M*h+hdYJs>oDBz2-6u`hmm*h^<l;CH<^$n%z;^eQi!=4CY!nsF*nx< z=WdwYG_a7)!!T=`JDFEt;^<LAI<iUqZU&$b^9zi;f*WEQi%GV3GV)G;Fu`Jcg@Fu} zCkDQduXgD8T}%&{&8}A22WA1&#*nXJF#BB0+2SkFsWV-CB{`WI7(bJZP&o1-V%Z!Z z#M~-6F6KT7=QO9zbHXqbhkU&blhxPB$X$tj{hiD=FuMmincsyO;be}XC(dRf5DK}i z3?__(AtnW8`*<fa3}!Ra{*X={jK9dqoClN5lqIBd156gJH^kfrv)#qK0HY7f4&SfC zgzi&VIzQLZiEZEvCt+Z9NgyFLEs^|-Y6C+v$*Fh5x|ww2H#N#QbdqjA*47zNUgk?k zO<$<2H>8u4@{+RE5R;bv;mNiy6?>X7L0Mf$Cn;m78dE|{&*a~^<Z-4j-6&C37t%>L zZdO+3WCkf43o)6-iK?FuF-eJ+tA5_WBo9#ie2B?3-k`lWV^1@3m1T;K9PNOm1Km2w zDYp-@7}4p5&fMV^qsuuZ`4(k$p}10#nk%adF-gfQm5n)=%mvEEoXi<T?vRs`vXqU5 zbkZ|+mWS&+scbByla`r7-|x(6dg3}Y5{XXt>d<tjAvubUk}C=f#YpVX_D#v7J~GIu z97@ONF7ImOX{Hen9VLDIeMp68J}6T_^B7_JQaXzB!pNBpM=06xL*^|Zodqy)E}a!H zEnPYfn@lL2?Jx;0oxLy~S2$6qV^EH`TETR3=_JGSap?>*eF5ei=^Vr%E}fY$(gBBb zE<wz3=`4n6L^;tg&2ZMj#JQNQFdi54Axy1{IS7;GimNGwmkXoIushcUf&5a=xr4wj zI;vJgj?PP(ysRZJI$S!aF;3|yx+4Kdnu)+nVHS*pq(c^^35YVi59#<}s$Dvl!4SAZ zNA8)<bLl(;BUgtpurl0nHw#AWD8%fA+3aGXNbGhO(*|Y%0fc<@gpo9dQaDO<U<i)5 zth@&~!@-Qb5K)+ruNs)8FxnS_aWzb>E3SKCR=Ai~VAi^rZ(yW14y7=j1~%UnR}Yv~ zc3f5pY08cijzCA!6H4JUm<McM2*zbFD_lBv!EA;J<zfp=mMcBGV6t7zuP_T-Oe@BU zwXTq5e;hHVP{_kzHoA1C!0d48l*4Rx>CA=s#HAy<>}+-E+yS%CrE@>bc9+f;n1e2z z9Wb@7Tzn6+*2OeAnvh*gXBbIysGR%3$kkLRrxRgzyL2jHn!9wag4yfRSq<ZH={yS~ zoihnA?eHU*MlR+Lm^c^Hwh6W4VormR@(HDR0!&vsF3X~F(ZL+exGK<zK_}$vN*K91 z4(0R?m|9m{kHV~VF|Whyb1`4R9PJ7@>KNX7c7@ymrlm`#3yjRML$PPUFibhh=WLib z7gHs^T+BikDd$kW?uMD{3i&CRT$it%Fn$+v0A{U=k=>G{R6`;6fGKu`JQ!xP%a<2s zyNjuYi6f9uy<ZQL>I!)^Ou!ZL6EGf^ueV_mUCehdeizduj`r>fIRPf<3b~gsE??O& z3tY@pnC&hm2s6YL@*<e4Tp_Q7+3oVR31***c@rj)N)MIB*DzuUsF}7J6|dj%4cSI> zm@JpCE-=|Hra#OA7c&KBf-B?-m=&%xUkX#}^0f?Rt&4dOW}l0B6(-je@+acU74iWX zv6fK2j%%v-b|NS<rztSfNJFJD5+=^Y6vJe@m`h;%u8^0(Y_(&zdVp*lxEa?2=*Yd| zP<q~kdDHfVvhf3q)M-ekVKYPBCkdswHOwNHPIs8ET;cSE$#tc95=^m+se<vlm}_Bz zF6M5SEXJo$`8*G^)D`<Km;-j~R^GE*dH*Lm*{*QnnqwO-rZY^gix~hTuNsD8_rfGH zu7sF5FjDWK5?cfl!@Nb8n3bMHS9<P2C(9MivoIrE%r2N57xOdBWEaz{1+y;~(+$S& zVurx1Wn2lR*$1=5mFDwdWOnLKv&WU@Md<8s`ML+@1lt$N##1nIA2JlzhcH`QOw@7M zs*5=pM!xA2^3@k+w~NVx+3R91f;r$~mczs`8im4n8fH5^dx-fI<`Y*gqL1ggz?BOR z%x;&jzA&G-n0%PME@m#wJ{Kdq;u-YOq1c~=IoieSfr)c54O=q1a50@=TDq8_Fdi2( z4JOgWTm{p|#oPyz<zlwOWV@K}VHVH}gwlLmEAr(ku{4-eSBZ^<sdf1Zz^rgFH^8iN zF%QA4aWQYhtaUL5U^cs$R@_m0*~RpN+3sQ{!AS2G%EcU*9WG`W%uW~cB+PCX^C8SW z7Zc4Lk%KO#gFH~8e+k7k7$(le$i9NxvAmGZ)e?@YRM)^{xk~j#7`ciJ^(|k)jBx2R zIe|30LQaC&>te>i>~k?SFb7@CGMG4QF_glmg~1v^%;&<m(j)s8PO#Hs^>qyBj+tjy zbP`;?M#2=@zECz~ze0~Iu7xmS_o3JyhRJd<@55|%G4)TR6}aN+1mkzbH4H}VJ`{2R z%x)KRK8y#;3+dbpBX{IOb+Hy^jw|HnU<SB!cEQYd>HGvEH5dw~*-4D2E}iZ$iLTg( z!DP6YBA9F!GZ$vNi@6;p#}(J(Ftv7ER((kgFzlN1gtyQscKP}mMxOJA<^VAs@uQD= zhJHqtoJJ8EOnnK*WHLQrOiEI2IFr0KoJl<p&h*Tnr8q-Q$&|UMlSxfp5#}p3b$+-` zPnjdRd}Ydr=48^6T9Q*2lbjvK^h{eE&SXfbI(=m%Nr}0bRJr5fV$!#UGd-me96A}P zDcRvnT5UL!u`i5C&&<Mf9pPjqXUH|alSxV39nK_o;>ymYlad?G^jsCrWXSbk$X9Ao zN^%yb4kkG<eL*;rxjT$WN=l?rIDI80`@@;E&EZVXILy-JD>FBYNludayi+GRMGW4_ zq@>9l+r^~UhB28b``k=Qa;nTu9llbMdoFM@smU3;!<dvrnL|2!rKY3=!<qE0;Y^0y zJazfX%nD;tQ|5;=X)?2N`bzEDk~xx#$;=94(vpJVOv>hPCan>(9cMUc>4{-XdP=pM zNlQ&z8^)w($Q;QLPFiM~%t;(fdU8f>7?YZ@FO2D#n8m>3^p%;mz|HhbN|I-G4xOGE zsfk>tIhc&3p209CJ!yM5li^_w;P921k>U?$(q!He(n(89&X8GwlSxU;4P$y{tPNu_ z5@qXbr?1SO*={B&F}XI3>DhB%7?Y8h#a!GGPEtnlf^a5tM;Mct)RK9E(^qD4wwp;w zOsNfHl2c^9;qaB3n3%=v!o?&n2xofk4rAyO7*w3Tl2U@<Oqz`5E}fn-cDtC&;xHyT zacwx0B6CfrujI5&%>P_WdaliMuLu+*3>|qk!;V1%=ia-Fj|?Z~LD#O1<{pho$56g< zv@aU?A$@f=eJLFkK$gkKNj;-`LGkp;^i<_S11FqZB|HC(@vwd_Ad4u>?F!hpprDjD z<%QK-Y#hQd^yW&qs@m>Ab}@79Rputxs6`Q#KK2VM@L8I&|Cx9+X_X3{wwYBv*;K(w zY)M&3z>*7jG-=8D)jI1;?F&>?UNOTWh}K(>UtVpUv&zCN8^p-D-ugi8E2Oqxv)->N z^UZdhv(E~NcW#tmhvFp7lsGAsP_@ox77Me=D~z(L(o)vkO!aAr4PgT8W}{Cki}U<G zRTwkaWQ+Z6lq?&oSTgD*1@=i*e(0poCkw{PD}7#huSplF`L>wkCRBA)x@5*d*m-eq zW>y@G$_Z;pMpl&$DycS*29(S)rIEhM$~>|}k+P1(%k~H51=h(-*BM*exg5jJW$QRq zQKpTQmQ)73rRC+*tNaq<cvXhpQB>~;UzsSX7b+`D%LAB`<jXW*Q68=Lr11{0O2$bJ zMzw!Gtiqv~V{Iu_hgA0D&=lXJD@uH20kx%x==W1QP<e-nk%mr3Nzu=&Vt*cQMR|F^ zV3R6u5&O>+Qip086EEelACOmVXNNa4gJf=MpjaDRNu@Rysotu9Pn~!RDVMym0-siK zY}uoAl?6(Bu@$|<Y)BB2lrnkgG#_IuDyg7+WtR-2l2R%w)G~XIu;tFVK9xc-0kKzn zX){tM${NJUG+^7+I=2;+QQOY?%yu;Q4f5L7YpCW*qo^n^^-8O?&S@mxaz~L@vH>9t zTiOFVCMsE)gDIOSbDxK~>(++Vl$X-j*l&Xky;O8FO3FgzCate7tK*flxs(fZ6jq6a zyQ@ZLy&6pJs>)=G50y<xu<cS=m0wsgtE7@$L)>2E#bK|#|DJbDPJeIzVqd}Zv4OmT z>ErV%Dh<Vn5%y!pBz-ovxGGS{)?|j)J9z96wUtbT@&!SyS5=e*YP<y!424iWy~JlE zu)QOlVnTAVEv6(H2~}mY*_0;1Y0n929e|rM)#{kKsauyfJvf_!sq3Pw=qV}Qf|ji_ z)rOdcm4-TeBo9<cL=TELJ<zR4byWDQ0mzJ@F7NiB1}L|#rrc`E_}yxXvV)gx?h=?r zjLMtgOGs4Rp-PU6PpZpf00VrLs^it^w>%7Ds~+C~S+HT%p(`${K*C6Oszc+dJLwMI z?LmxRjk|9B5bajC2O+n*O_Ml1uBy@6T|AK-RQW`5NS1;Nb8wVgm`lW>bLcqA&c&LU zQ=HX<n>llF5qot<?hfysq`LGvqk{OivUJD*>gFt>s+GY*I6CuLXBcv3xUQqqYu&NR z>9?+{q{catg_T&ild~|w-6EHRQ_EQdZr(EC&@gIQuY)m_oCB<><)TbAwT{zt*Rman zV^FrEad6uH^gd*a)s7;G;9`|X1gE+M5~gI8M;+Qssgu`}O*6R>93ptJn|uUcwwpUB ztD`e}%)>Y)xn}Wtmg{UTk-Z+iNX)r%gydQ-5pwAq1)P!EQzL86<)}yL)t$6eiQ#<R z<T^F1>T`2u5^d6%J~t_6)-2C$XAxYSNeuH8Ih772XF{E{Ga5-|SP5CGmQ$o8SZ;?; zLwFfDLsk<rdu|(+1Q+j&-{lZFa$Cij{SYac*JoB9Orx*sP&Z=B%i&@U&vYm<m1XnF zG%Ujo))}jVjvS?Rooluo$%93SY+m|?Mdo0gkvZtdk(mn4a<wRljM`O~(_yhWX=ij! zK5~4PhBHE&Q!$zs@Zm8!XjhC5{tz*m8m<^^&e6o{UUxZapsu5uw1qCp9O;eVVkJ3( zQ{7aDDOm}xLz`*0`0%SiGxdjbwzBTHXtXlyq}*y!a8`m2bBXCF4XtGxlkJieepza} zBu8?wN-#ojbxSZz$(>+3Db8plUv>f#59#7cw9Ahx(UwbuL|aaWO|&RQNVK9uc~iYm z#6-JYoQZb3I1}x5NpTc`+a)!UOWlmxo(`8$rBpYgCT&_?*xd-zM#EUKa@TDK>BSsn zb9ncpx_2{N{*(X2J>^f_Q~$(0?N8j(5AAN1{2?<~xBMfjTD1__u@0;H?8B9>TOmRL zyA>jouv;NQ5xW&4l(AbOLLs{qB9yXQp=aG{a4Tf|nL_5DDI_KSsm7m{Wzyja^N{vp z=j1OKjM6=%#c0>MCS!Gd=H%>86e4BQ6+)z3x)dUrj7uSs$+#3EnT$&zlF7IfBAJX! zA(F|s6e5|7OCh4kxHbN?EF+qXJB&Xq&7{K>=b_Ecisi4Eo#-Cg?6j*jUt#vDt_#D> z%<?bOfXE8sV&8Xm-jR0ncYm(KsQahkF#i6j4kPj5bgY6stWw>wJ*2v`cp?^peZSNd zg!A^iHH&m6+v)D|=(>G>r~;0x6js7@lp+>Q9j!kp8<&2>!f|Uz=0eXH!!qP{aHh}g z5;;vF9cMb6ti$$A+I6qVkv5aB>%qR8<fuh6EZfNyPS|~>L%ZqfveRYxi%<%oTTq8B z2<uLg`Mf1m@Rmc}+=XAro2gMWx4^k^&qMf9-z;Bg*kdDm34?l=WIaBzmnb-&8tLan zu|1M|W;nO0OzN4Gnvt53o}S`lJ)We*#PsxZk0(7fv1g`o%8f0&w25)k-1MTK-s8i8 z<~jxEHYP$P@{=Xyt|K;%?M^~lnTXp2zg|YUqC#uF3uGB_{Y<?a&FYr}JDq2pX;gZS zZAOG`GKfW(=q-Or>ns91Ms}`q>l1O2Wo#wS^WnKyv|d*r%gD}hZY3fvJ6Kw`?p3X0 z{YP)J^Cev2N3dSx@;BLp>n*Lt`ZB^x%yPbVD=yjS_4tQjT==%ulME_7#|xn1vV!09 zQW(x7Hqq#w&y!!rL2z}Bpb@v(wg}Tzmb6T#zAE|2A^x)Bva)O&QLJ7XdOkXrgzGt$ zsfcPZziUk$)2muNgNgJQFmO=caU*g@4DHve9sl}|%o)(m&5j;1U{v3c1IM=WP`t)> z{1)&VW5^3b|ITL%%JZjHPOeT*ojgFSYjWibp4=CAhvfsEed3K=7Syt`yQA^L#j?U% z<H(YNit@_xqJXE<m{UEY{ehAhCFjaFAo}y9f^R}psC4~IdQyx*DqWH`Iqs+MSleZ+ z2CrwKlX*<7$WxCuy#>C~QuexQ8kc1`fl>kHkrf{oXVkZXOc*3jl?gCDJ{yIv+OzXt z)a>$#>7?LT$O(`Eexsv&)r!as5jAXp86WR)5MG}5qSwNRw!$}L=NDR;98J;g1b(X` z@vDT!!zIFfqc}y?W35y@W3+_uJ-;3NtV8l%%LyyB)QhCTXVo);QXa#>&fq9;EI1mJ zh{u3efaAf<APdcdG(F>NkR~HrXazq6r+^=WUT`0n3;qb^gVDrW0M-YKz+`YLI1pr! zbMP#18ki4G2g|@xP(C4A2FeCm<=|ql0+hN7fZq}RJ;>={b(~LqvGUEB2rde%W8HzP zTb-(!gXmd@yPA)2RP#Wyk{6)rs${8v#gHsAq>@=>QqAU$@$t1zs)o1g<KqWFnWj*a ztZcz!D-~8Nl|BxYB*kQem}<?W+Ds9_NWfV(<Ez#IC&1_g73#R9gVb>s)#zZvkW9u5 zSj@;`l3h0VBJKRudN|9*mD;AoVn#<5)_5xvHH1@5u~eW?QQ0<CSdEr#m12`Y9T*b! zL7~@zBl%IM>X;U71f~A`U>9&Em<a~J%fVUTHDEP(2Ur8H1J47uf@~%e+y!0$9t1B0 zTVW>`fwHOH#h}>WTu>U=CE#fAQZNU+44eqg2MfU~z;ci+X@axCYe0E@=~_@;xmy6r zM^&!_k0uWb!IQun!H(cfpuAkL7+eankxlR}a0&Q0cnc_7^ehFXpl<_z09j%lOpaze z1Stb!HHfaU2D}5j7km=D4}1r_9~@0(tp(2l*MVMeJy-&60L#D!z>OfA<pgE3myO_F z@DWg6&3+UtVmbL^U>V3JxxrcBCNKy-0bT+Uckos4Y4CIK8Sp!B3mC%~{VaGc_#AjK z$Of;$E5NPbBJc(9X7Cm8L2w(m349fN8{7_#WU2XU;5hJga0>VaI2HT{cs{rTycv8C zTn+979|1oAdthH5f&;*hK<N|M07&&6^hJCI-90|sM!fy7nM=VNBKIBoCWMR;yQy^R zAYAJh7#|mF^ork(>*%N`H9E+<Tdt0yIW6e`q>qkzbQD3#5-im%&{j;A6^Sy4%pqLe zob&Y{GS4RHI7DL=gl>N`YZMW*HS%lJz;P9XZrzo|B}D<HR1BA{qGul=31%&X*^G6# zLqZx!N~6}+m|3mD-3(F1PqI)|ro*k~T&Firr)IuQ&>u-e8zIbyG$Bbdz37;wPt_U~ zTB8$$nb<@XhIGZIhI`1A&tWg53^|S=uH9hs1W93)I?u(qfjX~H=YIQqrV2M0I!{&# z3v9x#&a>_Fe0A>O{1_GBEOnk`yXS?vJvA1~Yg^VKc2>*D8T{l$RXJM67{PwvDPRuR z5iA1Pv@tjvJQbAwuQRv=>;kR<6Tx(1O#|hX9QFkdo(=W{y<jg;`mf&L#UNWy1!Zf< z)4+SdGr*l7ud4(bla{_<8?YaEDmVa40SAFY!NDN&1Y;yP5zGb|zl}4&bHTCTJa8T; zHE}a|8@L3N7jkX^9|4zwvY{l~R0ZDyZv(#umxFET&u#|?gLi<l!8<|vR%0c&3|s}S z0#}3dZN}XoeUq^Ur0+1;>?+tahW-%j2Cf5#fEz&BV(US07WfcY4bmqD&j%j|NsF-w zd<uLLY(~Gf87u~$25Z1)z$?IK!R_Gl;5Xn_@M!Ay1+X*702&+uz6@4?+rZi2tDwwb zmhlUp!_1}}WU=~8@W!xyNI$31s~@EsibKyj8d(C>86PL(wFf3%HS>H~q$q7dlyq|| zQ0L^)Jl7`8snr}Y;fQldNnb5$E&097PmVtIji97C3+x8=1;>E>K<O0vgSUbMzz4yB z;IrT$@O^MF_yafuq~A1#f-OO|1Pk^AM}V@a#7J;1I0}^c9~-v^-vF~gY5iw{@`>>= zU~|$r7VHA%fSKSp@Jw(#DCK(=DE06Yzwq&(m~mt<{Alo|uzE1(lA(%_Ufwz!6=9AC zdvTTVz<K>JR-T8_k5NG+#5F?5)j=aj*9eiME*hjGanZW}mY3!<&B!5BLwVCqSAAYZ z0aIdqvCtwx(vj~w*UPHrg6X=3zbD<ht+a!Z?^=+zF^o6)$#D+lBxR8cO8-;<O6Sjp z?m_9Wec&S?bBEwga4Ps4NSg^tFIfW0*1yw0ALs|yk!I!=!8gF!;6K4?@K^9+P&S^L z2R;H`3ho2vgMWaRgR;fcm0%0-DzG(pE!YuU0QLs21GB(|pw#nve#v3uehnP&GO3Rm zEDoz@YmJ1owM2BR!%@YwH5u5laI$MahWH^6(InNnD)g$l_Q1O8S{h|1NZlx_Ril(i zyFRZm8==%uE<fv#G}rQz`xR0jax5l~l8>7~sk__2j$kdA4&Dxq1y_Li;GN)1@Gh_t zTnS1UE#wzoMg!p_Y#Fm|4l5&TX~%!AjC4mNWst?sIwVcC{Oa>d<tN9z<U!KO7J#Y@ z)`6#Sz8;jcZvZ8atNDfBALs?woS%fXBrK0=;wP_z96pm$?^$?vwNMI9TZ79yvQhgB z=HcjrC1C52wAS)-=KWFfCh30+<Sl382{0La5|lh`1|{!L@e9xU064Lk)A`*Jo_Bc! z^5=P%PAd!VuDt6`OPYd<)}59VfvZd=K>Yh<B6+Cg=PZ-0<XQ6d0@xmW8I)`7S3t?@ zHc-msQTm+3uzsNv0m+yqxHPOxDrftAeq{`PG_1qjD>N~Vj<;OEu+w85_ZUWuN|O?) zZ>c9h$gJB%$lTXSq-KT_8R10Fa3VdNNDCuU!o8$~dr7I|B{e*ZlyD+EbG+l=&Pz(7 z>Kua<ldE&ICNTjVMn@HuaDz_Fj8V+Iq$!YhG~|USs~gpta)T{&Crx%xEyoLo+)0!A z*J{eQ@|t0D`Yw+2^^QAhl8!7WkLu5*!*fM&I@Z&aQH?`1#oToSEMm@cY08|YT5C#* zr3L6PXVTHj-Ma=Zb=jr=Zl<#wqAu+tTs_n`ZdZExpV(|IqL}R#O&M=s>tfGuf|=mE zpcKna@HUVwQG@Hi55Pyj-QZsEV^DIp7wisx0ZJa&Fg3V@oHOqYt_Qybp98rM5c~xE z0qjoV_k;bxpTKPJ05}f(1<VBxf|AMKz;~&tKfqleWue-pY@r`MH~SQKsWax)#<ECl zllO{bgLc(KccW+>jwWhdtK(!}t0VuJ0ZK)zKu_0j8TIv-4AL^8wh0nlr9V%6hHSJU z8Ii*05F32}47bs>Hm7ZL73U5cb%s_$@yoQCL*m^CIt<dXv}26S_&#XLv4_4#&aa{( zoabC{+2@Y2NUnsfL+YZI6ParaF!}n_ozzbQ&<}D=6g&^)gG$QA;=xZiZwmelHUneu zdmJbUZv)DFzbz>Dd`|+O0I~ky+u+Hd%=6oWEy%(tU_Y=UI1=mva{t)q3SJ3z2OkC# z!5Ffb47LJOz%(!w91f;~J}?uM>&;%ETyLHZa&OHz1AGwd3v$oP=nuw`|AAl!a1eMp zI2bGfhk|mQ$@Z+lAUGPl7t99bKHM0PYfWP;_#NeN2fx$9#-Yo|C-3YV7lF5i**fzQ z^;)BPJClb9@@Ab(QL@mtj*!XMW3C$UfrVTjNatdiTv?!`tjbrYOfeDu?iOOSzKRN7 zWmHxmbFm;l>yR|oa>5=3DiGn>mNh8pz8pLSyb_da!>d4<ms|~w1Fr!mgV%z2;B}yU z_~b_LWRUxN!PCK8!1KY|Kq-q_P|EB=<czQ~OQ!#m@x2vz+u_Pgm6oS3s^$?YEyL^} z;&8P(h(u&p2O-6oh1Y}xQOd6>DxwCYi^zg)kHhGwGSvogH%^O_^O}))dYV536<y*r z>I!Y2eJ(czbqz@K^*Fqi=+O3xsv3;)dCyP{o*7U&Lj46(Re8CPBigB?p;zhZa^!yW zaDE(;-~*`Y)XY|1_lM5q1FDKUXmge=m`|L<9yU`C)*<Cz%Sjr)2TcA>sYlN50<*!D zU_N*^SPk9-&I8wi*Mbj#cYzOrkAV+?uYnJPpMe{}-@(T~8J{+R3E*aMIQSG;0d4`W z0iOf!0G|gR1=#>N_!Iad*pPB~36y(YFN0Dp+rjg}x4^r>e}Ml0-vJMRJHZz80q=t; z;0K_LYr8<XXSExY?(`#YCHOJO{dnV3ko)S!XCU{zjlJOe;1}Q*;FsX<;8$RDjA48Y z)(5`<j|IO4+koGL+y^v%1iAlb`~*$`4}j-^zk=6-Y+|hXn%}_BIR72|4g3SFM?JA` zLNErb2TFVT2fy(4Gz@*IyF{=ytUb9FU#RwUfKs&%Ox`-o_Ou&Ut3Ao>j7jlwu0v6l zEH^XGQ6#UP<;|#6WEP=xP7qD=A*)<#c_1sB3u!K;XTqZ|r*|v=fxHT}Qj1rzL-VBh zj?_uMY6+w}zd0t~h;op;9tDmDV?i&-y|dsnkS(Bt^T8J267V=sM%b3%X0R3b0eAxV z6WA6MJ3R?JjyODED%cL30w#d+0isjD#b77!KCm;m3G4!H0lR@8g5AO2!9=hXMU@1m zg2^DyZjBUB?#ZTtJUcZqK)Gj^3Cc$#`ha53r-5=0<_vHXm<7tc*nZ$1us>K2I~)im zf<wR|;4p9sI2^11M}j;*Ge&_t*D^+fV&~Z)&v}d-unFZn4vYuS0>ysW-dfq)yOd2@ zSpR)9TnB#F^IIO--sCNL8S11fu?|P)%}^&6l8ckRq-4K@@`@U-ny(eZZd4Y6fyvev zUatJL;dDz7b24dVc|%a{s#w!TWrCIpse4P^6UsQ?fm?{ZkB-uDIczQ$C+m>B)$()R zyO~2-NPf=;dw>^!ncziWKX4wH4_*SwoSkjIgLA;k!60}A_#HTpU-<px-f%MSm%jM+ z$YrUPDjojThBeUDX{{cDt&?jR4`lvl9g>Dxelh&y?v@<al4eQQ0#K55Jt%2hWagz7 zIegwP?UWK$VcZcpFM1K0WClI^a9f6CMx0%lkx5WXNamPSp}$=AMUdO(!h7J`@iX~K z_H0nKEBVagXC0EhT7LEUiHXRujQmJsw}P!fHfRrGPO|N-`l8ZuQ0h+XqE}cu5L-Bw zpUj)oc9tNATC-wWuDyWn-^jAeE+or3YihF=Yr>%$4gF`OX~ya~mb3-ykhInEqqx*I z{(!NHyhwUigRQ{3!IQyzKzW{jA1HabACx@b!!LZS5nE}-Pi*1NP#w!l^J;+*dnuS3 z%SetrXjw<yN>0S7W4zRxxqMHq*2FMFIrawfrm7iQ7PQW_`s9LK4JAX#@mYJ>^M|J) zQr{A$bx2yJana2gQm1l|-=L%)Kgym@0VS_*@XHLV-<5DuPRse-6)CTwxBd^`Je~Jb z<ijBLnCZ&BRIXIvRoEjJq3q_O^s=EYSEV!~FHpgrGt$FNfb=P{&{rDBQ=A9R+3VS5 z;>W={Bu`Q%je$awq+KX`z-E*^P_V%i+-M_eE=XOg=S5Ua@N9VczF-AN`3BDgxn~oU zXJy>O4N6&Mfl{V7@e8+~@o>%gNv>8#DpQ#fs0|bT4f~N26#H?Mpio&*SF6HO0o&yw zymd&rq+FbR1C^of*$xG<6Jt0i!H)nX{Ubri=L&wQVYc%sob;bB@LLrrpK4Ex!<&uO zt3MGZ20;f<Rq9hF;UQ3$>BvK+PLTSc5-YE{XvmD;0wc$#W&@G-QLPyLPtqufJQ^s~ zlzbF4DCy>!Pv!j_P(scJ<z9UOI2Ocqg2kW@yZ|f$uLq}sa{s;rd>)(*N*NHoDyyH7 z!`s=%a8g9?^IILMtV#<Cy>e5gQq3t6QL~OlmVnj8$Eiy@7~Kl=3X383xn2n&tw$>F zV`UIJRGD5(fYTj}IWJWu4QV7MNbze{U5vGalzx-hu6mqD^_b&QVP!x~VI*04q=M0l z+Vm7x^-&VNbx7W&4jKXjOtOlyl46(zdO+$-%`?siDNlp)4n7B72uhg+`4c;w6jgVO zx-wd?n~}NT-I2=H9H=N_Rk-^I$2uH^Yh4}SBv%I!J2ZpnT~;Z@+6eNfrsB)G2vEa2 z>_)}vo!0D*?rT*mjw_3e#F*@?fJmmUpPv#Q(despx-R-eIoDR;LDp8GXN1x`E+P?f z<PoQw53A=sZ$^>HA?|jckzslg2Ps>rJCdh9h9KN!)I~pVJ~#}#9Lxh3f@L6WBuKp) zi@=M)8$jHouT*{LVsI7bH-nFYOTd@FrQkc@GVoiFd&0rCq~&(72e<+(23LY|4MiBi zWgu-axB<Kyl<Vqyz$d|b!Pmk2z$7xh4m=ZF56b$h4d5K`0dOw(AUGd<7`z3fUV^`X zkAbZzhsVJl;3jY&xEY)TJ`H-oXTa}Bx7cX!u)dP@Zbm=cZUyf-yp7IMMoQrJQP)V< z;&w<Q-Hu}&Bi#X6*GPB6{<)DJ8GDpoNz6#wsJ|poP^@gSImIQ1Wuu>moy)C!%iXro zPNtGLNZE>wwgXNu`4_1RDR1mb+33sQM9yCU{oorQeT}RyP-~3e0>wt(1+gdNJy7}| z`kvsg;BK%DVSflFfggcGz>h&$zxfF$>o@m+@*&{Q!0q4{pe)V!5^O+5z5?5VUxQiT zH{f6pdk>BPv7aF8kEIU{z6AaVehK~)j3S>ufi1xU;OQV~3+8~ofztnRogcgmq@xN- z+odB@HhDB@I4#U3Wj(5xVn=XIB%3t%AN#*BE{Ux)CuvpuWPKm^m=8Tx#i4YvQq*gi zTiPBgt7fRtOB#?pR;iAT^0gMXBXNC08Hf!v1`37XVEvjJqjEtH=LO(Ua0V#-8|&KC zeL_F@Fz4Ls3w{Lhsb|%11;BQMTLnrP&jO`?=z|=7kNsxqxF2po@ZLyuVUA&DmHdTq zY%if%ce(x}!&WCE(33HLc}ZD7-zB5ZtUH!v*qUsO8F3yjcg+%QEghbh{l8QPAuEyO zum&lqJIRrCNZCo<wFUN@<oT4flqa8^Rqda9^ubA-2SLUe`7E}24s-=5bHuB`ognvV zgS2JiT5un@0F<~Ef{j5wdadrEEdsl6&L?YwXMi_>BSG$;1+f!j33wgI_@wUn)`Bl^ zemnRs$bI18*We29TW}?KEcv(_Oas?|(jVLl`atf-1*d{*!Rg>SP;BWk{D$9ek>@#s zaa#f27txl~&T4<bhISLmA%__$mX7hFU|!nFbx0$~uuGFTr~;*@uJ2`T)DlWx+Og5& zR30hFG^&uunyLtS9Y(Db7B<&r`5Lgz4uP#Znq|YfMl<O~QXvEUtj9+Z{{+rmw~U<6 zE+uSvOw1v=LC`g2lc$$5m%2{t*k-Bby*tR6bx1vkU5fd?Z1T)c)H=4uz|ruJgZbbl zuoC1Mqk0Cx{3Uo5=bOPrAopL@dfVr~7dU?&+y=e^GB(IZl7r2N<26u9_bo69<XNS9 z$AxqSX$!`C;BxSNkhqKwz-Pb@K}q{ZAa2H|po~*{z;@tXP}bjm0p^0NbyW9sc?TgV zp9;p7gLi<~vU<+>9r!foKY%;H{ouFY0q{5QXE2Te{1r?9e+T6m#vh;*e*Jp-9xr2N za2n?g!7A`5karo3#-QBmJqBC>(sqJRf!xmzz68dDd%#5SYmha>!Gj?8snxR$+F0;- z>Zd1o8khkVg1x~CkjK)&t3g&)1g`_n0HwXX*qr<BM#K1TvDBu9ezQ{F6{0yciI+!W z`UrpT(u1dy#k|#)vtx!19F@~IXXxlr-kdSx2Ifr69?0}XYea=>WRD)3Gq(Sjq1idy z3TznPGeJTbt8YaOtf=sgo^B+Vd;=#xv}_ieyB2!;R!ps$!49@OAlJT|Iko!dm6frn z?ikf4cn6o(_=~x7q!pVx6|LY#>)m#3rF^H-7=1T;Gy`@~DPN*)!y2SED%+B1*|3<0 z#N6*L;+0fxus4ZcP0yf@(ET;tpV*sKpFnE9CX5DBFxf*V3>@JdIeNfA?}+{byyI0e zCJ;zWurg4RkH+8;6SIeS2aO&xvM-zU4$T?aH(QmDRw@ltm4_>h9>+_EqXw!Pe9oC3 zxy@N=zW7XaH;g~YszI~d+roX!{Da6#rd1N|z)}524;VUXuy^dRp<@Zqa`t%gr#hXp z$Mk2svRu=qs+8NF`wbnOW{Aa@VVC92c6vUm@2IikMh!Mjv^DaI%cnUthK(N5x1VyC zo>$r2n1Q1P3>>3NZj=<x2$cYFR~F}VA2D?BkR0l+VZ1m;OS!w8`wy`F#zb(WRy;<d z_!seu&!J@n6+W@Qyi)H-AGh}kD#tJlI2Dclbu|Y20?GzW%|TcU3279+Q>%`Z&5Fn9 z{aU>_HGZFQ5{?7wh9e#&9<Ol<3cc$pSP{u?sVbIZ(Ys&k3FoDgZxrv*h1ahp;A4*Y zCwcO6E45L4j+s)uv337EHr$o`w!rBZOvPOyDiTMm)LEnW);fei^4d1Z>{~cXc7U!_ zsceh8d<~CaEcfBQiZWh6RnEuZ{H}H$!Oqd6*#2A<LNoXp&1cIqO`mMHemo@W^d+pZ zva$Av^1MPjl-IR`stj?EJha9`<m`D>V2vGt4P|R$6_}LC@!CP9xNm@^-^I$QBTlDl zC#RJRVsCI2uU$7%Du=0LZq_u4zrc}T-VJCJKhHsU2e5showrAHJq)NQp`Y^hS6kvs zVKmY{l#$sU#35QcsPx+oVjq5OAN`B-D(HzC#UHFw!`Q#s->Hgd_vcFVG>uftr(On@ z6_m@?(e(U{;!kiS&ujyV-{IiRcB8850|#&Ft29V^dQm5Iq`KqE&gqqbiYm2jy=1qE z=~0Zr&aR~DW$j>@ma6n9&8f1nD_x?vNIR&S^k!H1WFJ>m1rkMsG;15WNhiz<j-q4Z zQ##T{@mpOf?q6Q!N^%5q^>XdkD1L$Vrt4Z2i`)XGXw9tK)uUSIr&?R;b7Y=hm6oJ- zq*)*V)>F>#4lTE{(ZF<&ZpqHPl+-ruASI<jk)#aP+(`Y5L)t|<hxf6*QWgx_HYz<Y zsWiuB66^CStCrCe-W-L!qF?Fd`B8Y3s!e=rhR=;<uQHYOEtonC%o#Q^+dF8)=)O5g z$r-8(+Nu@%$wv9o%1?46%rqU9GO5=eBGiz|qqIVqYLh%lHAUWGYZTueqC%cmdIJm^ zjp9Ey^Q9*WY^I-s?Wt@q-EI{BJ^JeDV$NCmUG^rBKSJj8=k<7PBDd%ulwnE7r6QNO z=7v(H0+XlaDzI!lFX1|)Za1jSM4rS-ajRshB1q7Tvy)H}9ZeXL%bdQlxK`4<MMtX* z3LRBXmpKyY?O*P%QROG5As0<{&6?eCvgTCJqbyRaUMjVR8H|sWbtUp5O{4fq%fI@- zf-X8SrY$C~OV)0;lIJmI@XCHwF2t(E7`)-uAmh|MPIcL7+^ej~VI<m`WU^!znl?q% zRGYbNbOh^_b99>#6Um@fa<WURWq){OA}3RtvkPc)n24lyh7Pu`d_O{GPqO{6nW(CK zRq=MEHy}8#cLtVRqI}CYXGxT<H#@H~`-9b;(I7r6kr(i)iG_UJ6$do{S|zW1NlL1; z<4Co1L$T71CB1kVH@3LELLOi?ir?S}-S*twvc4R1R;=v*Du=2!M?OR$-<(j!p#~H> zr&)PCPvJ3(qdhU-Wa*={z6DPI%nqc<+P-CaO3Fr*Gh#@?3AIMmyLHokN0j7O<W<zD zgi4%pmre3R_EibiseU!Dk(oMLx<j&tO>G$R^dg7PWN<034I@HntK69B<6|N$?v#R) zdj$k)H)UlH$}WfXQ&&aO8D;C3$Lij<e<|NSQ8|`D-ZjYBJ+RozLT5p#G2W|2);(ru z^oc4IDdl!%38;dTwlv4#S!O@J3RPOtI39B(Sv#q5rad$tFe%6@m7Y#&YPK1X9vk#X zW|z66XI9?jb_4~XEsfidjpC)Oa<a?izFMPrS@WrTGP7Hha(O~WU|QE0`6`Oak)*Qj z@S*ySX{Hx-wP$8ZOj@pIi5`1o&Z(-ZnJyA+g0Bo&wv^Mqyu3noSzt<}N6~D#_eUot zl)NNOAm*n{6m^--mN}lP+I1L<%9>yMl1ZO#?2;abNivQ|hK6c2^Xn_pQL5R;&6;*K zUv>3yt9G!>)!o!24!_PJW+f9WVdRt6WI!95inXp0sXR!#;wf8MIaMuI__Z0C?t0Y> zn?YHEl;MvcrEO7;VwZI@;^pzQV~|tbgnTO+f7US1bf=`i>_er=USp=zDu!3}xjCmX ztzGKGHRsUX?Q**PX*2v@77MH99zNvigu5zJHJntlsEJdVu>}7Q&6%~L%>E*sl)-w$ z@(waTF(a#zU46e&mV3Hn(>7t*KTFxL43zG%Pu^dwGcVRNpQm+{X1}Jcp_ZEgn}#me zQSucayWfb|o2eR;r3fTR7p1BhdC4JLrXR}UBGt7T^}clFg(4ZtIu8}0%zKK%5~K}N zIm_(!DVJw_%8XCBN=tvmnI`M{msTe}!v@=tJR&d+MS77$@i}zFKxNHx7lo`b_WHOM zS5rzU=j}Rf%hpt7-=w**=4h*|{4rM=NBL%}^hy7Tg9NMxL^1LR_Na_sZh@ib_@t7a z)xN2N*2A-T4Wqm3n|0RZdO%s7qfw16Dx%9%&81aXbCFjD%~Ft=PNYe*>eTS2N`!7! z0(P0Rs_jS#Q$D3(o6}l}A;MHh)^ygL9J=o-u*grD>k6}IEpv4mfOIgYYIn6y)e!b# z({?2-&|P^dX;SCjl5%O^Vj$h*)LX#Er_A9=Jzw!v$o=O1{5JB?D+=^PPh3{reOZFv zTXElox9mIayqlsP8aH=spUW@5D0O6N>)tgyTpX|T4t5^WY}7yMzwl80(Doau&wb>^ zhNrjpyfOWa^k0s;YT>$9^7VQlPjshoJ6`;D?XT%I{Ysw6+Q0De)OUY<>Dl7K$M*C+ zkn`n%cbn*aqCC;Be^~GMd)tlc_^q$kwnyi8i#xs9tTtoLdZ%`M&J7FtoO;}YhLJ@A zJ<&URMGadse9dV8sP-=o{A1>s-b-tTO?d6Z_uB88THB!UHOut#5Kr`htaG+Dxa^%h z&;IsaV$=E0_<#5JXt8ARLoK>5OWyF$tGW$R_s0n@|AqUD-&k<h3$Hz}|NS+e-9BOG zm-pXU{><5Z_cu(Rp77cP77ob0Z%_2F=tiybtB-B-<-0LG9(mxtZzmR=_*;3>H;?bT zYgV^=x&>M?HY>e%#`T`{#AzL_J}<aG^Q-0`eEQR4gWo@`X4?HPe_Y+VVNxwm79Lc3 z%Ny;F{pixRPp0=ys62k<EiFAQznFH;v^(3p^7H852A-Mu6ORp|CEhpR`1$%D-W$=b z-EFxCqg!9}V?pQlm!xzUlXFb!SC@P-Vd)jrtJ0fzOOshkWA1<E@%yfRbNlS3zpcKr z<m#DS=FT0TI`ftu!vmXH<Dm4iUn%^0^cxpGo0D+hqdy*a`r#)|yzlgzS3fa$>VQvL z5Bc~Ep6DGFBk`Vb(golA^16TFWka_v>Finb@-sioKXu)Xr*8V^w!qvkUhg!5Ye=Qn z<MNU_daX{{aLn3+^RDbY{*SHYx1P6jR<8lO2d<5t`uJ5>s{J(x@3`|nPwxEY&R=@n zn6$marY#4fU)q|s{Jn1e7hX;*J8EyAByOOxD9sc7N^Rl97c+`m8r#lU?C(=Fc0^!R z^xeKLZ$927wc+~%zoy;_mEMV~Z~wS+`S*+Ot%=Dy`uVs{FRor!k-6lorK@9`HfhuP zD;o8yO3%}H=+oc6KK=RC-Ix8+d)}Pqny&A;>&NF$ZF}2-wwVvy`Du6c9v1Po*;`fF zrAO=WT^{VVd}r5n!*+LCa(|mku6VEZnv7N7^sA=qE@!smiJsA9#YtZ_xPIFS>z+zm zSUL34FM2J$|HUhAelC4*hu41o=abbu_g8u?X8rcSG3z_*`Z4wL_j<h5z3=mnC49H% z<WE*l?t0;{isKgX05Ykegco(m^k05G?#vnWw&l0q-8$}+hPztM_w2a&;u|)4PW)lb zQ3u&4O6etxJ7?EJ-}@JJ+_z%Qg0EM6Fy!?`?~L!=;F*UGcKPG%%^&YJjL((c%ipvu z_^^7z&OeUpaM7I34cq;?{>GB=Z@l#B*pt3_Y1(gR-@;R{MiOtySKq~?T-xs8?>-sc z<mN$3-n(JTjCVf0<k~4)J1#x_hesB1ee<Bw>oGg6>AO#DIdgKem#(Y4ee0MVTj#Ca zwsS)BSAV!+dZ2UMOx}|_O2Yee@riGBSn${@bM8HV-e>pp9=x$-&t`cUmyF!~O|UZg z=PCEFj$G;Wc(~a~*M0i2vGSeozZ>$<?=`DuPigSXcTb$M;F@MvJoodj&r*I$&zS#F z%}3V^o_T)Hqo$3yqtkN@uG!x@W#fV1s6nTnc<Q_;7Ke@Gxtb^Xr1rCtPdIk$=F%6N z-H~%=tB)>gJZIgW-QTx=x?g7F>zcn$d)uJ&Uf=n7tCKdpp0;}QQ}<7Qtss8c<Ga4t z_299y&+AsTuIuuB*nLa-Ku`3TW!q+Mx$*7u;)Y*xS*dTwKlZde_v>!A4ljHvs`+)l zjW4GkJx}Q^eyH=azxKQC#uHk7_2X0P_w;?B=g%>oobT=|+w@zLFK2$WocFqw-nBa` zf}S;F7x(|>m8bjnO|Lqy^Et6yC*8lkW#f`zai`X&PftBs;vLj!lFwf?Vd9;~oq6|w z+0#DwY{;wy_ZH7xc7gBnd1ozp=2q5WDZNeQ-!4o$e^}zIqOnufF3T)xwQuX(McYbV zxTnW=CGXFzoMIT?DZMLR-TnL>y+)q>QHL{TPW`#dF%?&Tap{5N%eQ_0*4!<Vj-OP< zb1wQ`PxSBGrd_^aV(J;CKm0TC^c#NY`sTZLc1#_#?fBy!zo#Uv{%@^#N~-h<o@>9V z<9GF*JTq#^@_#-&;NCaqzEbpcLUp~*drx_M+PS-EZ=Wi?DS6u;svNa%Zr8*HLyW!K z+nmw#^<@cL*KKOJ;j51y?tFbB?{FL=@oxL_xZ?H+i#I)V%8HXNy6@FX+br0B>FS0l zx4gMB*kjujyEgKiT<Jak>!qvTD!FvS*^kAq-2LMPJ(t~f@yy2$OzOLEQkOYDwY&I4 z*25^hGw;j!_O0?}?>~A@*Zqm7PVL=i^#fy{t@t9?=&ioD?CsNT9P18`m3WPbYbsjA zW<M}}?6&V8zjpYP>~F3}sp?qVq{}gt^Do%@HvQ=mrT5NzZ}uNP<)3@|yir~6!7Gpd z>YjT}`*HVaovwTNwn@)D+NJ}GgyiGHp6FYrPA%K~)Ag5T)jMbBg7+u(JH7nYmwId* z*y`Si31>XD@{EglR|T8#M1TFqfufPi)?Ym4hw^ii&Yw8$#WnSwc_#CtSp(NRvuJ!x z!6x#n^cw8gdi0AodOcsgz446f_xpc&ZP`)tE=(<HeQ@=V+4=80TS7ZmdS#x;AJ=qw zX2rg;J3c!8!(}t~>`T}f{I>R}M+bgiow?;v>_BGkp6D(&y}cmtN|WP{YSq5g;5WzK z-(&Ej-`5{m5EX3n;&->*(Y70F@RVN7^meBNZ(7js@_CQ6%IS8|RiE`;@OpgX_}i|3 zdgU|oyG;31FD3Ovw|sF-%yDO3H}~=MrLotHo7nul$yKu(PP%^L@n<~u_`r$da#=Hv zEqJ28-+kS@6HfoVN6QO8i?01K|K&Y7FJ8Ros?_wwYs;Ry@Rr(4`ctJBm^kL_qwYF& z_>~E_?Mi+2tlaaDx$>CPek@r2PR^z)zUc7Ybv&O|de4oz`secc7k=<~OkmTj$=~$) z@cfU5bvfyU*KV3vdGhzKeZpdgj$E#KqQ4t4W9j@ofrBIR;`$^%>(6<(>H0M*uluHR z{@!!?dNWsIFEvW<vcb*Xs(E8&x2qqkI47lE+Vux}y?^;5$4}cIm+?f-_#P`MzbBR6 z+A%Tzyl7<G^X9BP^?|m17jFM#cDwKLH?Mo6-Or1jyfOR!0@g$}mv|ezbWgABW(|IO z=lE&Hs?#Su(tX9-m-hLss9;<mt>ddVfBhV5fRx?`(`$MxSasroJy)EWk#*vPZReFd zbK0tF<_#~6YJS0MFP+7LfM=B6^2SdNn!4fccQazA2X|d^#%-H+_Id8Q7thMLrT5f{ z-?jRb>$evCn6G_2Z|=Z_?|#1O%hxYkw)~9^7p*$=-Uf~K4Z7imq3ut({RGB^0;RX| zLnFVxXVvbe84I2@u6(K8MNf6?vvS*{b+6y_^JTw1QB%trN2Pb`x$853`sKx?-D_(n zZTsY<#oZ6Is*P)U-d7Lyx$wfDwl3Suv%upd-n^L|_MdZ+cjm4|7fk<R|Fh#KUBCaA z!dI_5KI4j(BPR5C`83v%E4?`-XYU<#)f*pv*z>)eGuA)5`G%sOTX($o>8}@#FTLoA zF$>$W##8D2oOkMskI$LXr0WaKzF2nW?U|2_-L)zG-MiLIdw9vL&!_#E!n!%7cm2Mb zjz9C(=FeW(v+e$1_Kru>c64dcX3Iw(?!9RBQSBP;q`&ILdKXXh)0zEGd}rQ(-#4AI zZSsyzk0!LqzV+$x>uRpJ^2eud_<GO@_v?4|J<;ARw>7?C=+T>_?mc$n-d_`&zC8A_ zyfeq8^*QODcec%X@UpS2Ltt*_iT<hf!YgxDUAL}9(PIr}Tzx}&%7LN=4d=|AI(y+0 zi*p}8?*Q*nE4^lK4Y}^z9^YK_&Z%#&i#}<|I~PtKb^Pytl)U`V@&V1)K2WxY{zd8i zURm!S7hYBL(73%T_g>wsSJ5wV=bm`^)&pm5NDY*2d%eRN)>|mOhhF`7ZO2!xoKZi% zIO?|DPhNf1M|-v%b?5y*K6>UYJx7*}-_H69gSJk-jsCqRXIGR@;|W6LWIpOyT2i1s zSX((cz&DtEvnTti^$n=W^5NY84^AhSloga#75bcnr4o>hal02Ei9n0EX(t!;M=CV# zx)l0~j#Owf$_w-SCI41vl@$f%hQX7I0&1Z^_ktr*U}pXNTZyVur$qs&>%Uo-f#m$E zlG4H>m7>ZT-gumGWJ2Rb^`erg)IhOMZqgp%Ky~OxIM8yoj4m%b!hu!>3QJ4!?Le`| z8J<DxMqTOYRGpE2>g2Q7-?@BtrDu2v{X<gXWFEJx#-EhfJ+XUIW@2hm_r%Fn+#{Gw zNX`cKH$vh=%RWMkkf_O_O|-|CR95Acdd3E-3QNi-CnqK+Pi7<S8C9$vsF^&z|KuF* zkW@|{ITkS~wR=it_mq^hq)fZ>npIH2-k&8ieE-o{D)UPJqv2y`e4Uw&vY_Ta9n~zF zNzvcz4?-h|Jz(e;j_pD^GUJeZ`&D*S?=~Y(_FT6^{~I=W<l2d8-F$9c9#ck0+mSQ! zk{NsiOrBEwM`M}&Ux}sczY<I3e<hZ{e<c?Ge<c>*e<hac|4J<Xl}LE<z(ceME%IL; zajl+Y_8~i`BiEJW)hU}J(^cnH1<H%*q#~5ZkxTr!brSzKMuM<@`^XdnR|2K176{El z|3(5GW+4x#|Dz>~<+0O(9mU@&40B2@%L1k{b{~Q3j|lUPN><k%ndBA)%307J8e0EW z-X+trV37+F^}(VelSD_T>WzaV6RKHH{;GU#7KBf+{#GfNAv0_1R$1luvq<XSN^yiM z>?3qbqGSeJcG_tQwb3KjRh9BppuiEDu^yuJ|J&nC*jzo7{l61pfuFaw>>~YJ=HoDT zR#QcqTK~%lRcm$Z)E$8wSNho2yx0!$U&*h-tj!NjS@(@X={j<TXkQ?+<NA>@Bu0yp z@_#Gu5$;b>HRTl{%L$dizg)?V0rLo^k6VN!(a!A=NS`V``3OCCuIzCCO$#atgxS#F z4d;mTu#Og7c;v?Esq${xzg1un%npjTlI+kz)q3Qb9;NV~zGl}^Bz7+;3*DglS1cex z!N{7XP;>lO0&{e1VwSX;e=nQ}iDK&(Hs7{u>t9J#gwXWfD}=`La(*mz;N8Lz@%bm{ zy{da~-q_g6f01Hkj|F3Z;{GtDSYs;dk+j})Q;IcK*&J_gn|@cZ-X~G{m9Ni;6l;8h zG*EGSOexm*k~Jn;?^{!fm2c&kT$U-t8lSMfBuV+*Yf7=k5;CAUc6d`#tdYt(3e9Dh zQmj$RnuKKK*KbO(#(tYS5aL)vz#})x;D9N`s`Ubc6n6$s`bCO0-bB)RJ4`9o*va#F z0^+yZlwytQV=ZouDX}OcPVdRo*oZNuSYwXO1#RvVBmyVAy{1HX@fIhmw8b^n*o{Pl z=zU^JvBp(AJJ#F+QzE}esY>sFDa9IHo9Vr}8XJkGM1GNYtW0=km{P1U2x)@ihM7{V zaTd~9ikoCgu|_e{c*T{PQmlIJJWg@v!-*7YT!ECMxNA%)*0=>}tm1AnrC4JP(ip|9 zHKkZ%6VjQAd&-nzjcrJy75BO+#TvViMk(%NQ;IeAA&perep8AyqIm8+LUHv?Db{F; zG+c4VnNqCL9%-23I+_x;hBQ=h8Kx9#3`82DxS^&LYpg>`RosK7L>xSK*4%NXgx%X* zmd#DKxpJFZY;#L(ZUN7U(^MRbOexkF$1`EgO*ExgL-uaeob1phQmpZU&AnoC@7Ub? zHut&BeQk3wJg?Q^H8Lgandh?UDlM}0oJg@oqt+I8v?;|JYms^?y$4Jw*4Wy{;$AkT zSfeHVlh!-IlxRn+X~2-N(->2VH8$Ja7Mt^X^qz)|jesdpZzo$^hAG7wk0Vhzgtyt0 zVvSDiEUv35#TxUGS}47%OexlgYj1JQO^LROL`4wZ98-!l4%!^=Wh+<uCL{_DJ-;c% z8lTzRmo_JxvTD5;Q;IbvAju=}#>Qk*iZyOPny9#&O)1uBeu|~n(v)ahNEAAL*P0Uj zK}U;AG^JQ$5fT-F-eOatE<0J=(WVq@cx*1g<~Ac`D8E}wDb`qVs>Q7`rC8&H&T8L5 z;_#SKtWkt?w(>j8lwysJT`avW|A)Odfsd-X|Nd`Cz=&uPMa6x<pivM5L=1{LNYKGX ziHb@sHVH|9NFXtpU{ugcK_v#1Ds8n|i#u)=TdUw2EDBn+xTAH6OBIT(sI_2Sc;26L z?!9yGBv9Mh-|zXqp8tJi@;>K#_I<rGo~oyFcpy76kR2b$z8A<U0$Ft+YagiZR8!hk zda9nz4u|kPRz{ZNsd_rUM`i8(!Bh2g{us#K4rChw*~ft_Ymo0Y+f(&)#xZ~%X~G!q zsd_qzLSI(usp#8LjWG7!_f$Qdj|Tg)jh?EflQqPbWqT^hawy*kW!x5es-8|GstHCm z!&CKi%ISoxy(&-D)0q><E)8VY1+v9~>{^=k?~Q-I^i;HI8fu=A-RG%#I?tlo-N>Hz zR6U)us2DLLtMpW)1N|g!`246x{cc~sve)QEdvDw$|FUEBvvL2%1%tHTIQFl9@B`Bm zolie0X)Vd`(>g9cH_=*}pM6GR&PVY?TS<Odo2zefX)DdI7_ho+1(srSX6DD7nf*Ld zeW}ZEq_groL6#MapSh0_Byd`mXlpG%oM@e=uOwNo-#blI;m9{Elwd*DiUj@_c>XxZ zwyehM@fY?aBI7YC-rxsf4JE>;7>*y>K4)`A@@P562ZAceFO;T`@W&6&zOdT{6Jt-? z+<pB`WTLT<nA1+8akk+h6Lg}@{7_in1F^S)IqiLHgj;9F6k&XqnMoP(ENtA_i1f{K z7_MFiYzT@%Yqkk&72j>`i&tqj=SKoN#C!WhYa&+`QJ0bc>xxi}#^hdN&dPZC@19A2 z(#vo5N3QXEZvH~p=IXnqR&35Dog>=j<}XHObtMV3)=Dp|kd6^Edv}tR%pyX*Jyi(V zo3%$LS;?&K>u=ajY4R->2jLbYyE+Ir9<|b6Gint=N~{?B;(;l#JZzh9eDZ5#%1~}F zRPsE-d@?gmY>S(7P?ad&6#nEM+^C+(PbD<RN+fO@mrsP|n~X5!w*HUUSRc36VouJ* zn%x^0IhQZR_f;kNMXH2;(9{D}ZOUmNeiaRPzU}GEL{{4h-&0zE%v(ohZNmjF3!Z;B z=N_D9ci}XfK<SqWg+y#=S5YeRBXCyihhrk|Cp72c)3$8cvi?p#zHl3%|Ci#cTv2>i zf9v@2Q<Yx#P(^koa_(7?K#`xQB74w1ofu#`3N;f`vdMn7Ga-PA<s^6ud3TMPOhsbT z7iz{+Hf*0D@1`j4<Z6n9WqvMM=lPN~M4UHx&ReYW7T<Y`td6gx|1ve;Y6X=@3|O5Y z+>6_DE`M9WP*)O8&J{1BCTNB$8+0PEX|3#+B{scgQnq4U4Bv|IEx)sGm?XaI5-U`l zDJaQ&d}Q02ZC14c#Rt1Z#9|;UHbq#x{)=vW<84=ouceSo8mgX3WZJCQK(f2EtBkth z*{zz|ge&!ASI#|Tcfw{=A({DKX?Wi*TgZk&;#NQ`(putrzA#Hkjg(@hUnl1OeQQbW zoM~4)ZS8j9ld^@N3r#K)mxRfiGB0n6{uiqXQI1p<^-jg>pF^w$H{PrDim%C%aA9_l zGdACp+W(y-MT+^`bzr6^%DMQ1FX?`~aVF>DwbI#9&mYMO(Jv;+zW#ry(ENP$M$*=K z8dgI>MX`0BhSS9Cl`fj}DMu-#(<c#{FwXv{L$((%J6zs?gJqhbe0HY>rj5q$?g*X4 z(3OeSx%q3n&}7o)Dr~$fQ217&fRUJCf3xg3D>}OQ^}z_@SyoaiM-E+*Z)Hj#@U7HQ zAOo50_)$4>wq`mr2O%!)EZ!Y)T_^FZ(VaZeG-%ctojft(cqdPc_@E$#rTJ4*d2Z5N znqOx#e0?8s3ikyXR=iovOofiV)ad8tyJRIIjU-bf8c>oylk7<%D@9gkWY!wu76zlF zGfNYo<fgS`{}Q6UVFzhF4S6UTy1Dp_^%iTr#aP!arm^0F1!=G@pqr<NSPZw0d3D3; zea{{?e#S4_O9M|GlNCzH)(Jb);upo8Rde&_<C7j-D-J6*ck?_zATuUBRx!u-@MTmo z>6UXj-$H1n3`te44rH1UFiy|SR~XXFlxCyR*nE+GGx|w6_14LxoQvk>$MMKWWYtK@ zY<d;Y^Bv3k0%h)`oayb@o9{XJY&9B$_)vlUWyYF~ZeUX$P09(`Y(U^84xeNH)MwXt zKy0nzrMda?!2~J=c^CtF$mjx+mv5y7Dd|9@1JRl!%C>R65QP_!<+9s4KYuCAxqmfM zsb1{BT{|Wla*;^ET)-+Q1L>U^lZ>D8YEn)(YF0w58+@Y*qadrS1S4w)iK0|O5Q<~l zB9nkfW!d1a{|81Y&?J?}6v{gf_9cAHxDzjSs8koCHRZom8(M~#N@2^>dL-A(GpR!J z^OxE1jsNeCTo%KA$pABBy8r0}5tDi1#di~g$xMeZ7aJdK&FaEas^a|o_J883%p;yI zF`lYpT+tCzC`&!TKwq#7L0ZYJ#ur<1Qhke(%emw>d5brT4Jmxl8-u+-F*UIvOBH6y z)aWoZnU1OPBXDbUn3@d7)c6sYS|8_HA6IOSsi;lZE52Y^*53Afr0mxp$<#j4_Do`d z_8Xmb`X>u(NM>T_Ggd!)We3{y!HSV6*w)BhmMw=<+cTG2#Zx^JbV{*O8cl3uTb9$B z)zi1)_*OEEmA0&IhM8GCTeI?gOBuc;YZ$gvlAq<<>gL<Z?BrERel}reKfl?x(%o1g z9*DE(&a*S=aauiVbd0_|){;bA_OkL*u5Da>*S+$M<E(t_gq+&AT1(k&*3yd2L6+D^ zV(dphFo|SViIde@(lbb7dUlm`voXxX&NebEVr?5)mS(T(Oe3gomus@vMYj3wx1Dd+ z*48r)bM|R+L-nw<wUjzWA*M~5HmdfTNmG()8JaX{PLtqQ<yBejq-mY8%Jg4dff~2k ztbU@-Onv-Hfpn2ErSt*|W-8R#hN6id`t7@jA5@`;AI3t&kCYA14}CXx#1Cp%#1CU3 z;z!B`egqXwP1+`Ik)79FSxiz}duMFJhM6vo%LqI%{enDcE6K?6=5oqUZ{|1C_li{5 zz`C|K&bLQQw`FgjZ;xiP4SP8YmZ*rm?q}<9%qHSF3!V(w-FiH&-Jgf-ZauEDJFC$T zf9r8I_D=BanRwdDXv>ohu64G`Wa~C)sjahBDC<Wvxr^9ajkGN*g9(q<`vx^>YOkJ| z16KHAqGyAnv%R=|R_TB2iJ8f+CG-u6|JX0upM0AAuz^eN=Unju^{cbT)W5EhTG}(K z%e2xENbK0}!XJ~~H<aG*eHY%5WO+uC1)JozQ3Zbc1sAkxm8V~b)R``dwyjss1zGF_ z%{uWv_r)YvWB-OR|G8%*R$h@<!6x=oN_iVTt3-p;QvbV3E_Q5s%f1tjOp@PMl2fgt zb18iLh>>dfMyds+np2a?PEid87}j$d;O$t{*4wPF)lsa&C1aWfD%ON*@Xg&e9OGL| z%vr|}XyxnQVS~i)Gp#evI}T-1wjMIJI!*l6;d5x>r;#)@;D)y*=6qDBU8sciZDUf! z{mp^`tMhjXw9ToV0_I!=E569~=AaDRUfgglBY)*?wFB+4eP}x)eqj)Se-ge4QOoyu z+x9Eo>6R8!nqS&U=`?ll5>;jrrO9hTv%$Fhw9$=v()Ikq^JKi|3H#Fj+$Y5*G@ouz z!Mc=qn_EE%%<1TMaeJ~SyOb3U+6_9isKC@Eh7~sded`)$kQ8jtJh#9cXiy%$X)jEN zBhOjTz!;K}%asa2tMCMS@ALCryytwS5Q9XUJw&9ueSZ`SLMbL5Iy(;e)PRZhmJ1@@ zOp!NsGaqO14Lhld;9uMv5(XZJ5B_rIj-uMLYcj&gnLEow11ChXczAZs<#h<~V#JEg z+v8zAN>!r#{fWPF3Vr^jH8Ppafs~HHF5Fdi`lE8OpbRwPq3sv9H{Y*iE2lkF9DfaF zP9eSU+MEGeC{z=d>g{qaeOT$mL3Lumjwo3w&K6j+Zs}06%5v@}Ci7^y@?=Z9szKTR zH3l07n5<VmDqWNk%X8AMTAs<;@aa<4h~x6j7LTLc$+`HgZ`7ZV8MW~&bw#)x;Vqs< zSkK~W+#^(ZNUJ@iNzO1vepPB~Rh1c@J+mB-65mm&DNczhDjx-xb3c)u*PDrtN=+ME z+AIIb*ITxDRp|WxdW{($v=3#jn?-=8;!Gh1Q$iJI%2q1Q_)x_e?^PW9WT*fC27?Vl zx=P-+sXuF|KkKJ!xS6xEq5O9_`>DD7N003-gZ`3Ta=fz(zCu)?1>Z&)L>7E&jKpqR zhI`i?+3H)3ndxA6@HOgVt(^K4Lwd8U@F+9nxxLDPVW%F~nx=Z(US5xzaz(uj^|+Ep zdR%{Z$PdVLx_0Y`h}@@G@N6&_3znd=-D%WS(4$&$&fE*tsXlC7=gd{Vuaw9+o&Hjw z-t`k{Z4lo{Q~gb%%H|w9L_KU}F3l>52p_PaPiigAil@cM^ix&yP1Yx-KGkDVYe}zT ziJpqWY+y@4nuOeD`ZAkgrET+El2^JwQ<Fu;R2l9YZ&}!aX<CUYAN*c!zR4uh(b=pB zqD6OS4NZ?{x7r9_yLOCKYWKcXb$_P3z3wk({s-70g0lNRl(mY3(v|bT_BMAzWnp%v zCH*hvr|FDswOxO*`s1MX{l?~nYV!Y3UgV@#GgCOW>iIo(;#*cVC;4wzwe>G_J^5Zk zPJ|}k9cY8Oull^u$)JCgj5|?@wwKmn)6rP{C1ki6?<Bh$nTC(DMEAHFf>GLiUjHT) z{Z?Vv`ZD?`ZR2w3%FJ!%jL6t7XTEkqtVc8;rZTNDQ^oBiE#?r{Ebk*5+za8lSo2Pa z1>Mn_+hWBVdWCi0&JzMD*3L4!$E1z;m$bR+Mvb~{q3N^i)XOB%PEw9#AA7@uQXBMx z*KFrF%O?^EV`I+hiArc!iJQ6qw+x|q1u-dP1dE4C#O{ADi;eWxX9GIyC=}0)j6#K2 zh>k+JMlv^FCczLAQ@3FyN-uE^Cbr(hoF!gy9KYzc;_x(5h;k!JJ&6TuUB(sEeB(`` zb#?*%_`Z5$!77KWx+q=fU!k)R@U1f8lfPcH{J~_Ek{1#$(8RfQo?R>0m}!x!n9ev! zj!m42l;WINP?Ei6=nIKW_gO7TGU9)3O}<bFF<d09GM`YS%vq4kOvQ(QBy62$Y6`ub zbcswGjn0l|>G;h!n46zXahOBdeC$c%CmlbfZJlQ-BKce)Ke4n9`W4IUC`zC`3sa6) zDhk?W_1YCC^No{~4O7w~8_TWLr_2_fJS!!7;>fmM*=Ea!Q2&OWg5M1Em=i>4%y1|L zZe)l2k#5#NjkQt*Rl{G}*@!0Et~52JwfBk*_sOmtCl+Kqp&PYBU+~)ZCrYp>tf`iL zC`=94L3OhogI|X{apaz=pA#mplt;=5CC}`DD!Y6ep}2-@*p9$!Ci6`^Tj%BC3~$s9 z{K%MwPjtUR<~0#4X__F3(>%s6*~FY>ng}?_oQTs6J4Up!ZAx~|x-7rg*T0Xm4ZC?> zPE7W~jyzw#9=TTl&u{ih3tP%lr};QPec?WKCf%gzaDyJLd9B}<ZBFmY*0<tMDnji+ zgnXZ!ZPX!q6qjBd**vCwD1yGzpj>p~;n#PnlQJP^&Pj~p>o53f%NF)S+BSDOKU}4} z%N<E9Q%8vEBtu=NnZl>`b51`aG5e#<l!NU*XOP0sEM7+?(f+eTR>@<X)G+VOHhV28 zff;-X5@foZI?em~nYnW|N#p{mKQQ!If0fsBm@}Vv?wpPcb_4?ZyUG48Df_#uuabSn z%vi|RJ!GqQ%2x07M;Tw~ta2WUYwxC)h8Z*r(id$vw0-?PzIkF!OCQHGMx7n<HP*@3 z4^3)4U(Kde&STqec`Cu(K-TQBMB6ESavtk-!j=_Bu1E$+$nWIMV!T<lP&qiYoeY0C z%Qd-~<dRVViTLbhKO@<nF<VbLb5|hur6$VFO2ruwk0^6n9AnsJoS(G}Pg9|!3>n+! zXSH`_*fu7PQM_xT5{wdE8_C0xu8m4DD#d91nfz0+6@)T)xN;^^87`46N~&N^OO})5 zs87mb$0YV_-;DI<hJ4Y;8TCae@O;U3X6+ry1hf7a!=~5#tR-05FvwVAhRj3<vz&WI zX1BE)Wg>HA?s8j3Pidg(CHqmI+Qww#&(er|)m)SBlvc<xLgjZvh)mH;mnnxMG837$ zF<G6nnE1AB?`3Zgu^`HA^Lxqv;kINh?AN6Yg@z3k&_!88+c(hDFqK%R2yC@m>A-TR zTT!1;{zLETeyTswyB1}(FX@GEL0_W#%M@yb*I#(omJ4(NG@)R%S}b~y5+wrup0Dhx z>J&N63<{`?k@p%wfi!G_XJb&*sVi(-#f-5m==SV<k*KlbS;CyjzETlO+hbN_;);yf zoO~A_Qaj-O&WB|QF{7=eUNFH|v!j|T|1seoiWrOqkqCKV_P@JwF4x9yxi)z<w7m-t z(%sMbh_sZLjom)<$`x92#Oaw>DCu2`wlNi3%KDI=E+a#{wz{8Aj>MEB^4(;AylqTu zc%mY?pWm?;VH#<LO7n*Asoct(B(agh?)J*eI4xqlS4l8uv1C>OfjMuMl(gxk0u*h$ z9b>KHLoBT<x;Q_Gja;V5F%w)|`&GHb%K;ndW)qv@RBWgSer%#ylU`qxCZ&Xb40+wh zt0^EW2#%8!Xu+zij15fj(}WzFDhGWj^Dk?)3t^g74j-*mT@mu#dqU5uA1PDnqldQJ z<P%Mmcy9F2BvSvh%2P#CC1lBG-jOnmV|=1DD?ic36&tcK=N|L!#?=Wf)#!bm;3Og2 zo+OlUveiR5q4y8Oy+w1iUKL<(eo9y|EMxrTiV}O4c$%Hs>Nl;WEa!oEH@24Y`&d77 z@iS9?<>owqP$n^}+OpbMlP1Q{&OA=74lmjHAComNdqeyB$+}h5x!rcEFS9?|NS@k$ zN;Np>r{>#>>XDtx4lJY^0vB{u{LzY_Av)Wu72~m6!88N!gY`ID&)&^2rls@bpS@&; zO3FndkGwH+>Ub9RY@_icx}SPo$cm;cvv%_x5FPp-8-xZo-;u^QW`xAdAL6V|qnvL) zupQ6Fhjzm7>l*Q)0_r-+rnUZAEHd6);jnwtYr(BHrQ8l43rrLDvnWv^zm;8E%BH9s z(>%_~Kv<Y2Bs8Q&RG%1|DeLXbz{@-x>R4sq$d4E8ig>BxD;U{Un$5kb@UgXHhnA@? zWEdN|R*bdYd0N{Ic>3Q@h;7Zx;=>8?glP$R#49}QK$=5_XhNbF@3xwd3_l^=zT1S@ zZY3=tp3qAOC*+K@<20VIDEEsTVXUj+7dstFX=)*&7T3jCrf#W=_Sr7S<|<hMs!;n} zBZEl$T#6*zK0DCUJSh@7Ew1Mq2a$eTV%btRQzp$?Ph;9HNh1VnV`@B`n-DfFts}G5 zzgmMfXSv$=rcVOX;7(U?bI@xmTw37$C{@oA7TfkBr~-^O85>R8WTfu8$=I?;Z!=jL zT%QOvnm>~S9hH)PuNc(ceRb=|;M!<V>uglL=Hu;m_)V+p#xpK2%QUo5^ZAz(6=^9! zqJl<c6BSKJ8?$&j426>8cNV(VLWRtKzC&Zpwv!%QJSDhP&ykk&uAAF;k@QI03X&c) zL!0zYY3VZck%pNn1HYoiv#+sL^$R~ssK|abp6aBkcg8l_vf5avEw`f$wdK_OvFrH+ z9>=el^KNG5<J{WSWJ05nis;{*R^-gRSMkAHhW>cgoc3&d&ynvMJ9-ao*F+(A!;YFN z<WAaRwMJv73lEIxcI1j#Q>_P&aY9p?pPRWN6+=5w$+@518N9<U&F1^8SeMPX(Z@S( zk6EuC+dk(3=1`eWw{>z)wTf{vzJ3OilJ)sr&rIy3tc(6{qY`NPzkfPEQ9lyy|I9>0 z^AjS@UX0e>Nn-2GP_!{(#`T1GN8R>j92YPR>A)jBe&vt{^!DCl!rbyXYRg4zE(d!Y zm(kHg_WRdgr>@5j3-{m6Y)G$1rB8^g?0;%bq`Fd|3@NtL)MBQoCWnh<!sRebnhubf z`yE70SzO#o-y%V9L8`cQWY&iE#6OuPeXFpBcwwb#Z8XF*IpN+%T&M?|6X~xVm~BJV zqEHK0{R>*SY2Td|y{Sob;qpSPhX!doMYhvld*8bQ3sh27=2ZQ#>q0V>wWU`*=d@1= zMrCiJZC2K%9?3DDR7X6apO-~%VcO4Mm_Dhh8Qx?fn4<N47__xJiJ_B>d#a4&Fi(}4 z9O$XCl7UZa<WqPr()je8*%S0)-R3I4XmfM4jhQ@AWy8dxj6s*RtR3i$$UDL@I}EP} zi4HmcMxC^6!L9O>zFG$neU!pQCf>dU<7>|STop=1^-V=}BF>DVJ%1}&zrTqpF=9(C zxr2$D+41bYetVfLAY*J_k?KXTT+)`!iqhC_D`UV&B}9jjOd{x6iZn%ENuXUMWi^#Q zJt@AmHg_SB+_ZLTdz{RyNQt!)^2OCAY&!To=WOoLysyzsb>jYLMue&}?bWAhUB)2F zn1-d=hgQZp$wL%^$wS?us_>kdaE&ysH&X)NNLU4XkD%H~?xNwfn!X&{>^Rws^=nX1 zzXmm%Yga78Vskp;l*m4sN>KyGscPE_YFw)7Y(OMKdNh~FNt2Lf9vW|5s7NOkEXsF9 zqHbG4`g*EpL#bbHo3|NYf4@>U@3oD1neuFA-^EtyRq=|ZWbMQalY9ZkkpIP69?A5* zl;@k)s;q)_rl0v3b-Ce3Hg_ny(pMa(l9~N5$Z~d|@$;QLs8$Cm_M1J~@a=t7RZrW1 zvYci%F$;|g{dAjEU7zc#?nX7$nEo0SzYm4a`qAEFjp}N;43&A7Q@W?`Vh*YyMs_Qz zW}~_jm38|ND(iMXzLm+wv=vpMvG*J*z7+`n^p#mdjp`kKZ0bX!T8HX*RGH4hd_7iQ zBil3PoAyOjhAh+h3Y9hO1I8NJ-l$G8su-#hjVd2isZkZ6`kqk@M0J8u6`~qrRQkHD zgi#fv8gEo1P@Q2^aa5-pRS7B`n`b%+RO5`Q6xFFlRfg&mqZ)_mWTR?DW%F<U1Gr>? zEXyfCW%H^SmCdWOQH?UD7os}QsD6Sf&!~QZYJgGQjjF(?9zpecqxu4s-s{hDw!`5c zjA{a^HAYp5>L8;^qI%w_=Ab&*sD6&h`tm5M7mVz8sH}^RP>nRQ90IlJm`Oy28QBA< z4l}AJQE5=ja{3PR{TqbpMI#%E%K8^a^^%c|MP*~~7gSdm*{7&%zH~pt&zG^NY`6<h zy=?4VhswHr1l21>_Dmpq57n#Izd$y8kmG1gk>w;%S+_2#*Np6nK=yO0>+42#J1T3h z1Jxgm?BhUoI8~VMiNe1UR6jAQF{o_pC!n&W`Z%injp=4o*BaH=fxRI#qW(rUiH7io zQ8lBo;a-o5h!Mt9s7MN`Ze%hQ3e`YVWEZMY6o$>AR#e4CmLzi4#Zd^Xs>g6&H91h7 zi|StEVkRmZ`^!<;*uRI$`h43FzT25c`l@qB_$oQHVT?lcfblPZ%KCRE@ccX4_pkaG z$9dD(YeHqy`!iH{PKxrWa_vTS5Gw1-2vpXWd8llxwxD{;*xLys>&qBaZyVY8K(-K- z&F2qL(O3xMZ>TzqDwAes-F_cczL8BR@l*6uR3sD^+l}V9$*2aQB14ePKxKV?4VBG< z^{7@E)4!s!vDde95+E-A)u$T{S|W}z&`G-Or!LuCzik^)(|^@|1KoK8HMxO0+>BQ< zJnv#eFE`|M2kKZzKLvGmNS{d47o_P!R{x(+c27&?#G3Q@cJRuosh*r{cjl=I{F_g@ z)24>X>0z(pXez>je^H(8KR<Lnsix6!CRR?bZj#?|$8ke`qIEXX^8crv^p<mOedAQc z&wt`57N#e{H~bb%cWS;uJ><@gk|Dvrs7&|YeqS<+1AZf<Cdu*@|HAFB481=8Q%`#S z`tkF_|4-xd|F!h{<?rW%OGbpt<3Ftre!hNNrk9W0?Z79)^vb=ADwqE|8dV?u?_^X= zBb@z=O0nO|s2cdsBp$aKq4qE;m;WpPkj>-2+-Eoo`5!Z?#r)sJsFv`5SEE|W|J{sg z8UJ@Ss&@YOHmY^}uQjU8{GVb}+E|!uR9f~<GO7YpHC9Cu&o-(AD)l+U1r?10)e=;5 zjA|XKxki<p={O6FN*gQljcOjM%Z+LYs;i7@9jZk}mCZnYjZq~~{oJUgpt{GXv>N-B zQLRIz^pU%C?7uat1giUuY6_}Hjj9FJBSy6j)ni7L-NSL7FseSNRvOhjR8Ja}{b>Q4 zJ_M$Jjs2j1^`JrhtIs+j)<0PttE#E1>)#aPtMn^tr}HaChxU|3@A=n%lQ!}d@_Z-% zc};_=I)$68k4>zJO{{I=$8Kw?2~ZaGdkQmZ8k6PbR|1ZRHP$DSHPd58=f~;0iqChQ zzW?99Z~L3YUDuEQNAfTDrH}6@z5mbpm$6GXXP3sDhK$|1IlFzD)3C>}na=JRBb;0f zHayzK&gj|A>A7={hCPnYboS0T+S%1JTPL%eZcffAJ2V9B-OcHJN^V2O9^IThPT94= zxP1Y)#hK2I8GAcDe1GvfW2bJ;PK`Yq_BcAz*(D=C+c(o)<UNkgLUxSPt6_%<#iK)E z^(U+=2}|)grAI>s8}f>0Moxy4BPuOJNQ)n~;xdG|`1W`2=InmTE?ye<4bs?w|2Exy z0@+ez8C$WhG1BJ6zCm8d4~@-nKAC1$z^XI~TGhfpb#tI%pz=(62dctArCYMrEe@P} z(D~2AY+uFC#xq9w&$-=v6=U~yDfM|NrTMuHU#nHM|CIO&Siq?0KYwCO^`A>aaTpS^ zb3(|D#%cf2{(}Du@)eMco!|-Exh;^|9YA0E2VVi-3#r?fA^6V&A@w1lcwQ6AlSe}F zR2(wR4uMrEOUsQ+v$8^?$_-SS9WngkLUSw@;;2;KRuw~4XJq;OXNit!L7*Cl>Kr4J zuS1QhC{Pun(rP}_`(k&g;^;L?%rrl?qS9jrl>drZrrBY&sxtH!7}+@fYYv%dc2lit z0{U4-R>6PGD>I$yKs5!`MMkEWD?XV{L!e5cnr&n){6Ea7W(F!3)g?wYm;b|zYF?n4 zkE+$k7V=;Fc9~`#XH{3Dmps$Cj{ll}W;%-l)y=4WYGh0Jueoccb622Rib}3Bo%{IT z+o+ZWs)tcsZ)ENK*K9Y_%;T(THTuOy_6+}bGpaR#>LpY+8rfR@_c5wB0#yep#Vpf# zpZ|Lp)w)3S5vp5_Y$N|Q8_#t97N|C(Qd-zW=f7t1R8;DxRb`>N!^kwtE;cH?HDgtD za3=Mcj{1k;##D1~tJ)jYuZ=8*N^LpQ$q!VTp)WJCfvD8VG9C3TR#k-RAtNhBHNvPy z1gbcy6-K5$Xm6uR1S;JCS8itN-Lx$-J%-QCSzJHjkzb07OS_X^YJILJ+0rZS(l>f~ z)d1C?LeITwiS&EWzsSDoULl`nJae@lg*TS|P3CHW^6wJ*LFwi8WXXu-EI#3f4N+x% z=#ftu&QpbZWfsloUw76izrASMu?yP|c>L|!3A1xnKDXUf6M9@%bl~UrU-s*sOUFJt z^se2X*yF7^e_nh1AzwFKux9^x2jBYlgO~p9#8)cb?Y+l)AMfsae9vhOpWiThhx2{< z^0<D+dr)olXFtly*s?`A7@t&AnH*GDxG*Eb^&~Uu>jq7$cGPWI$)IX}JU%(2M!qQa znHkED=rhRt#%BJhlFDUf#`p%ix1O@+*%>DZnU9^il%b~@l&on<=1-e0Eg6oT9gnlC zuvd!SyVtYinXTDVc4Edadva1nrA|rq#opqGWFV4`Kr*PYx-wa5{iLu7YawMQJAW*j zHQUPdU!|+Z*fFXx{Er<H4r>Au?T@BHSK4yvic=Exg%uIW6-X9GBsU{b?kX(hqg^L< zMC`0Vs-MtE`TRbTj)-Ivl6X<rP7jK%Y@{z4lu9~3xTUnORd)0IXi(KZtSbN1<A)Xv zDO82Fc8qv;{J9#HjUhi^$*(UP1OCN`b6x%P$^06#Cz3?Zfw;1dFHsK=m5k~n8QV#s z_iCc9F6bm_i%5<eS3Yh^WBs{NS3ix|k=dP{B#(8Hywpju-jk%tViS^fJ}F5ySy0Hr zHznB<Nk?v2G5|@%E@8=0az*Esa+Q#szG2CkNXiZfOPY{$92k~df+R*Kmh$K4NOCFF zl;j>HOX(O>k|&TfaF~&jyeT_$U@6Jpk=VyC)1GS9=J6%kVTno(h)BxItENnCN_yMf zzN^EdcI@war};A$J6D^0R_)9mJ-s@AXp!^r_KKmcul(!~cFs4wgt1e4(qS6cbcQTD zj8>&54OMIVWFOy^B<j(7(s@{aB%%2^`$r@+HfKacLSu7Ii%2wbOpi#^lrD`(G}>Gh zmK-LDPNjnw7RjH3W1;vI$)8aXiCj&HNR-m%h(sgb<zdNTO8adQiPGL4ktprYq$HzT zYLofHoM%mMV{=}T!=2Mi{Ygm<bN<Ru?B$_xHMD5hXkRj@CDj3Gp^%xOQJunb?mGVN z6M*;V1xh`}j>9kI1U+^((#(u9T#Z9@-Pa$*fcKo|xiWT)>~bX1S$`zD4M{JUvhx^{ z)ksqP{2!4#6On8}vL+(gg(SWdksOL-ZA9`tBpnfnb`N8;pHx_vBB4tN#qb6seUR7~ z4q{wRPSmJk^C>gqW}_x0cOCs>t1QP3L$~Alc8vHz{K-d^O8bkRB$f6JND3qI*^a2i zBa(b1ZbUK)$-s!uXCYCovOfFqX+WZ~CG&V@$Y+>}k8Z|m-j<5bFOei7cJA{eDLbo? zltt{kg+#R>W#=;_<0E#qXSl0~*xA>Uq~bFeiE=vS&nP4dBWW*3vN$4{iKHVUxfaQk zNa(*s(h~UW=T8NaRQ^1NotY6=A0wID$<@M$s~n=gF%tSfB%33WF<uhM6t65MBXKE~ zl;lz*3d^&K>PD0b%jSk3XXSh<&JW8@#GluYERIMvA?b)ncE`)BBVi3ea$Tpe;*qdQ zv9mGa&m={S8k|bSY$WlBL_f%R7uJY`m-hRSEI|i6$+IZ$i`e<Vlcel?gYw~sojznk zJCc;0!AMp{?3{$;nTVaUJxMA)7b964vGYqL>RVEF9zybd#Lg>7-iX-w1j)vTogJ8c z$W_Xpen`HG*eOQxQN+$TBw7`w(p8V7ERw62BN-o&+>N9nB6$``M?~^5lD|d5>cw`0 z)|fUdzm64Rhs1cLQ-Ga~5q}a$ROqR4uSF7%NaiC^DpF~`14*n?Sg}Z0tFWW>ZOYY$ zNVJko<wlQQ<VGZ{gOH4mNJ^1ZL?jJJIwF#vBFT@0^#BsBi=(-b8;Rko*x4BI=Tjt` zBa$7p5kudB(96Svkhl@a@kkU_Dy0=jN;-v(7ooCfk<Z@K%^5VYsma$-w2aF*PkXeQ z7+QR|CL#Rzrs88I#f3^GQA$Y$E2R<1ka)VJXkJt@d}!g4bjjc~X_BI1m3zqN;fEDA zq)Udhr%Mjk_d-Nm4X;R(3@ciiE-6-)r(6{k4k<2+N(K)dwm3~P>~QsLAy<Qk4Oc%F zmK;80VIUdQn5@blbK;pK)b7}2C^u8NPo&H<&nqt~G0`%v##vWX8p^9{SJ!*4j2+|8 zeUWmPs68SXr0M*yB4bwunHf`zI{fbi49q#<wE7t}<;i-hsjHoy(r|)UTNM~pHBYp< zNzK!%%FQpDPpYh{vF;ixo02t+<&8Dd`EmG&XnM`L5q)+2^mI2`yPBwYzMwDHugp7> zlI8YH#`BmEs_H7K<tc+M>?Rv4r#DTiZ=4pg#x;%ds)_Y2ArZ&3$&l8IIzF3Y)^Zyc zSzvWtURhUHU*&5WYa&|xf~1Vh(P~p&eX_ivu}1NlSeu+y+2CmH+el88m((^@POPg* z2}V!%^(WReHC0YFMq`_krW8tQv`<vu6cHYex1)|F9eC<n#PjJ*b(P78MI$tsU~*Q` zsp4qb%V$$e<q9SuFa>TUO$~LmI8m8Lt)wJP=hoCTc($c1uddY=m6b$JpQ$a={b~_0 z2<1P&XkM;+QQ^Y%>H|h0iz(rZkd#W?SXbGwH7`74r~H(0qsm83si~TJs_u84UfI}W zWn-uf$5xWr#>S~rnv>P_=T3LZ%a1=b!7Zw~nnvRa0jKQEjkQS**yRn!?DbP?Yn=S! z>YG{o4jxK}s;tW&Qt0G2Pd~R7VYCGD&GIQ-7`AGwqAi}V?XcXo7h8^|*z)OvPO6+% z!>^)k-E8nS%!X{kZ0I)3in=x<YfEaH(khQS6h-v7Mq*l`Rb(WOyad{6*hR`cgK%Dj z>uK0USRTm_)!(h<m2cK%+<n7;5_i)+!ZGm^Wevh{_j}&3?LZc`==aKDi-9a`(PWT% z?6A$0Fk)5l>0~t!hOOF$9`<r8O+P(fjWw@ZkXa;O(+#(huVHJEWJL|a@g>2jn=fA9 z6OMgX=BAEB4AK+RwV~IdIvGZi+R1b)X^q&6BsOYdD|C3sO^>YCN!q&CDeF6#ZY4eu zdy)7=O~UbEyx&S>Jd;Syc>Z`s+m42265(P@xlQXuY{r<0Mi=(2JX~Lb#4t*B6@nSf zy9^_keRL5{%FGL^i%E;;tSggFj#AT_POd^moty<TpH8k)CY>CaxltzvR@%vOYUJ+Z zB4w0HqL<qkh3d&RjR%Lu`KW8ZE^W<u=L*%8O~1^$H0w$@<DbObm~Sg?#=^IY+>C9- z4#Q5x5uFKjDw3#ir__1I+e%=%l`e`WWM!+_5VG?va>BE{)y(kCLkTjIqplMYHHsu4 zFzO=Wf!Q`AY;1KAQ7b2cG*?ywbu}|;>e6PP!9p@J3k?>E<>h0hu}ZM>)X+rKPC<Jf zI&|>RSm+si_~4@AqT*r0BGOoFaAD!FVZ&mvp~D9cIlM>?DtcC5vZM2}Im0H68QtBf z*G>gb_{drMLOy%@Ygq~O^vuOx&BW%(_SjjXK3usf#a=bn$@DD6zqpfoZ20I|@;W{x zW1}7#d!Zv?*(*F4Kd{$vp0%6D$~x|p#ly$cvUeCe1eeY2<~+8Dl{wFqtk+{sSw;Am zRq~Z%xWfC2wIjVA{A&*%he)O?z=y}WJ7W*98KMPv+$oHQ4?tw^C3bCAVdvUG*52nP ze%K2g7RcU0qJPM-Ugk=mr)Obg<3^%r%p_sE$jNOFYKIk>jj2aUx;szs(W4EAcy2r% z)E6VQ8(4q9&a3J6LfZtgs!f7-JUgCKvr9w;IkaT-aU)MF9alQ$*dzM!Z`6t7O8P~m zV@pd;8hPUAQ~Sjf|4;Z_&Zo@D$dh0H`c>oliDx%WXc<;Cp+vQ7Ler$_$wA1t2rweg zsn7w?F1)h&*^hKV$nwP6s>b@J`bo)H!6^sD#x^8tr`4X%9qiaB7SgpW;fROg^#q?I zoa0QqP@1Qn%+uwlTDYu_C*=NmvRs=S<#jZ%=7#d5S+DQy?3`N`Sh4x*Y2$ghc}`wl z1=^E$=6Xto*&@kBq|EKdXKY5Yaxy1Md3kYkF(Wy@rm>#>VEW|b6z)Rh<*A{KGtO(K zCmYW*vf@BiN3xPmH)pI8@F}0geEdi0SWI=0*&<JPB-KZ0<C=@R3mgT{fhRz+Pp{~@ zH^LL)qwr+-dw42*1)c`Kfv3an`2T&_6Hb7=U^(0sR={K6L^v7NK;`Eo_zCXc=Tn@P z?~0?cTXn^JXEEgQ^L=uCvObjS${7FAW|{Yp>p4z$C0S3t&N;~do5N|vkibH!7<R#u zN^()I3Z^N^&dxNdQ(oS9S)=)n%?K4s452L+TMtxJ1;~<o#%9=;PE;%^lLkKiqco~a zwCz{z2`?p2l<xU(09*ivLN24Yl$VZrT*}9}5>AF!!CHu4?o{|wcp1C~D(`*{mB$Z~ z-$$n9@!#m5j>hbD_>cm%kDteN^_A7-lj^4@wNm4r*Uq`RHReC$jQ@<z%kAkLk*E7; zV>7sI+hvwx7|L?xrS6PHGFU~U41T!3$#ohwe&yvYM%0(j*o^7ZotV=ruO)`gJoS?% zX*zAPy?jz_O&zbbDfj1M8qR$McQvvrO?k3$S5NEN6XAUbt=}^$>uRgZ)vju5nz$dB z=~o*^cNuQv!?P1k{uVf?HDRqqe?_QK?uMPs$YOlPW>hz`>r<soxUiRR%1qs%<Lr)g zo%PttS6^4{H~4OBE8CA6wCYa0n;h6jWv99`8f}p$AD`j4D$gIlQ{V(hTXgCm^~qr~ z-Teh@gnx!f_%XZ)?wdhHfhWKp!Ex|n*bFa$*wL$w?rrcgco&=xe+93A55a|S6}%FD z46lOR0CyHahJIZLadnmE8mJ32*TSpdb?|C<J=FIiFNPn%8)0uU{w6pA-VCeZt#CRd zF0KlOIJo!2d*IV>DSQjw3qOUwg+0ja`(ZA801k%Bp-SNqcouvdUI16Zf#mITP($|` zI21k)i{VS~4fr;EA9ldq=@j0DN5l8waqv$t0Y8K%z;*C+_-A+_<X5@fIq)NRF(l92 zyWyws6ZkjycgUqBcSp+m3%Doz5*`4*h9|*q;B>eJHo$J($WNFF+hGs53T_A07wkvb z3`^?^)Q|V!qni7$6!wYq1(nm!Gu=SkH-+D#w=Kh3sOf9a8;__TA3Nx&bylFG5h1Z{ z+Vr+l5X8uUu^HZ*tFqaEFwzC9+bEXMIB%*wzs9u7LbTytS#H%UN4gw!7BPh3&cckK zYHv&V_>b~O?M>t4&7P1tZ2IaFxF53P;Sk7GF!u;}0%S~dz6XB@PlAn*DXV)SEQ2mQ z71ED8r@>p`8Bk$=AF6|z03U{D!Bwyvu7#CQy-^L^3@1UA?;Jjdr<L!)$a47P^Lexn z|LhYf-zhbf)uw=BzA=mzu<}|N8!AubtFk|muR$Klvi~R!%0rr@iHGF(5og8gw@`7r z-%G<X)ahwxLngZy^ZDIY(om(76^&KlfTL;XdVIpqv_vHkMH1CjW!cFYo;Mhadd{K( z`{Vq0D>DBTZ>3w&DD~v0X4!O~0X433Oz$2GzYj~`51{JG1UMU(L#4X{s*HD_4X5W1 z?cd}N{e;uLmHe4j+45h@pM4pd59?3l%%hOJF}a*;!;O_@s4Kv13k5wk1M{-R`bo^c zO>>Q55N?Hi@NA}p<_USmAUr%zckJ}|S#HM1KBU`!lo!hL7=m7&{B^Icy#du;zlL%6 z4LlxhfhwPjOvjxDyFryf7MumU!+Ed=RD0bHUJrR?)x8~V57l0|Xz4x%`EnrlY1j+C z40nVba3{C{=D@$hT*$o1*%|H(8S~tsa960qe|}-WJr3>*H7@ss)o_2v80_?i_rU_l z80HLwT5BE(RTm1O>Wr?Rrq>x=f*OFC*2F8eQfH=fC}Y}GI~M&%mDzi?HqBmxd0LxV zizw2j`cceJ26d*ca{A<Pm6JKvt*UQi@@Z#uny9tl(Cgrn^^I(Ha15s9j_TYa`+5;^ z6w~Nza6in?jYZ6(o@=^R7I<!FlANxZ*`exVG*G_%p)qOdtBcu6BCa7!hqvk+R5^Z3 zC%{aVh&1sYNnT!c;D_~_b%U{6ggji|cg5~PWLFvYUPd&TVK9L>GII@2C6A?m52Ijt z6ospy^&+)ITpY;!C1Q`rY?S$evwaqptQSjRGoP^;Rh(Vg)Gk49Q<m~pRo&V%b7wPI zRoh&QTu-EJ7TPEp1JyaT%~9y`J$ZsUs(N?=905;)N;i{lcN}biXG1QJnz8c&cnA8K z@Lo6z-VZN=8Y5@Jzrr8E&mb>@x#~0L!@VF^PTl@+Ash^U49nn^@HF@{s5R;}@Gf{Q zWIpNq0<MOOq0+?s(^dB03P(dOu9`XR9q=*qcfq&eJ&=CFSqcw>_rYV~GI$DH4$puO z!Kv_JcrN7Ht2-C2fO<*h37AD$t%54E-@`rNGjITW77l}J;OX!MI19cAFM_YYE8wf} z$MAKiE2vzib@hV$+wd>&eV9ubeE`1?{|tW!KZeucC-6e}DZCPX27d<s4qt;`z`wwM zz%SsJa0kl$8>s!W492mckhHjG!0zw@$UNP>2yO?}XQ_Ip&sAOWQ}clH;mWP_S@lgr z{#(-kbvdb#iGU)b++n6m+Pe8*hQVHWtNIgv^Q7E!!Pw4F-^f+tQwqA8aVYpykCt+7 z2iYNJcs#)KJZOTQ#z*C$+F%Tu{`hzvd9Hlr0<v2OUxK>2{xVdXd=+YZd<|-Rd>v|h zd;@Ae`zE{$z6E~*--e4}2fP!$1Jy>~g)88D@EQ0%d>wuOH7>4)iqoHA9{dPueflvx z26D~NErFlHli}x(HLde^crN@B-T}XYZ^Ex(F6sRSj)Gg@4A`x^<Ejp2Le;gG_@s}I zXW(9WqHvzrN?l{PNSewP$D;pa`wGYLHvh_yqz#AT5k-bW&94g(ex0u>U_9=s4rp?; zI;cXj=8u(KO^!arLzj>LC`~H+9T6lw;a=o{(zy@R+=v%=-8f|3Yvx8pPze|Y&w+=- z^Wl;3SMVtK9Aq2Y{Tg!l+#O3e$3f-Y@lbjECqC(Uth%JIC-Zr7Yk6E%XY*JU(|@9Q z{BO_e{Y=jwN6B=Bqzry4mBEPo4DPBpy2^CosC-um`;XG8d{?ynbwD}!qO_j}mG84) z9MZR%e7^{CEaA+CRq$e{e7XcGKldST)ALg=OZCL;7WjDQ{M5a)@?cJ<LiL|$ekxlk zFbdUKC0^AtJn_-`FNSQZGn7Rb9>a%6?p1*4Q;Fh0*7XcUUcASLM_$BX`Xnb2$WmUI zRj4h8Wf=R9@<-*+8^K+kun&EL@{F<6l*69zQ1tsiMSeecB8)-px9$%whWYSrcmRA6 z9t0Ir#$r=G1L2N@cPKmv7DBa$Ay9qQVQ>y)%yzGUhr?@NF;w{thbre>nWe4iZ=~;1 z9lZ{&>Rird|8{a^lU?ssV9|e~<=kbvX~1r%;8n;ih$5Yp4lBkZJa1>U8->K}$mx@r z_-db26{|0wu^DHZmEX8PKfQUHZ&9ULghA3+v|Hs0OQjj9P-<eQBGluLYHDBE<ct3( zKUA(-4t(Vaucw_TkC2;v^qZi@vfJQUa0#r2w?mcdop27k3(kYTf?DI<169uV!UrHP zytu33{qPm|0MtBl8QcsXf(H_}N8m;9F*p~lfSOPK4z7eNp~k2u;UUETX*dKv12tAX z3w37t9Ay8;Spz4-7vaV5CD;mIhN>rudwM-N7@7JQ#uVqVt<;l=Q)>Rl_kJE_y{&jL zPd0l$?NDjxo~5rGh@QjEpm83C*)(`kDh)dQ<0cnZQq6&yHhvs((|@8BT@_31C{l^l z%W2~vRM}&QVu);|l*a_Y%5S<+RM)iFos7VS>a+KiVhW-VgKu)pP*TZ##wKH16*}Ud zyy=bYVhkQPw(DvqHdb;jp%}%HcH32cD1}Te^76(ZqM;!=mo3sE<qB1CvnL)Z+i)Wa zFA+z|Ga|*K_)US2nh?26-Rv!08xUqP?;e{`o}AWD?&#zp?8k7-e_;L4s<tKYgB?WA zn{+4YHrcAzBPTAj!EVC|F<^zFN9$pA&VBi?o+h!CEu>XBp>}7tg@a;Y1=@_MGW2Fl z`x!@E_G_xGpKd~5io|+V*;3n7Zgz?H!gf1y>sNKnq{?Q-dC#lp>5#(r1G9Sr%K{I5 zx%E`>UWA#A!lW6MjXKaV8NVbDdwbl9z{3b_!3F+sH<-$yqMC<cq#Fzu$<yTRKHFhK zJNJ2cYoHCZvQgjjWw$ES6R*Rhna|jaTGKOkptfn&(2$q67QJ;DM8S(-Urb*LOd~l| z?pg7VsnkKUXf@AH)LiLnXvlihVM~A7_EG&sY5Lnk`q0?DwwraP|LO<k?PBLu&v^2U z8LX)>)47SpX!gF`)1b~vs^C9h6V!RhrBLT3S3oMc*>BH)>f3c*vK(f?SE0^Jv>xFV zaaZkU2RH`u%|x!+LLNK^a<=6zf_$@(s|vpld<@1QXFyJWxCtHr4<yb5p{}<Kg3XZr z-kk}DLiOpxpvLrK_!1le*)w#Gf&0NYJO~~OkAfxec*y>PI~nR6q8{q}L3;)|f4B|m z{NYKc^9S|`%=v>_+c@-pffFI?cBcxe57v1?95%pn7+2XpbZ5dOyc805_s5X6lzT1Y z3x?cVU<+itbmqclTJ$_P8(sz%L(ckKRoq{|5%6YsBD@8j1#g3G@OF4Fyc7N&-UZ)= zcf)t!J+MbMV=^p)zkw6s1F#J)gA3q;@HY4mybEgF`5kPBFTs`YL%165L=}7r9tNL- zzkzGuBapIipM$T!weVH=IeZOnfp5TFsh=J25cm!}2EGrEgMWg0ZSO-k9<GBL?+zwU z(#N~nf%ePS%i!2PSh9~9@9e=mUB6j$=2Bw*Ln8dgJCxU+Q<sPG>Rw_Pb{Y)XMNS_K z3lZ5qYHNcbU*P50NE-~}7(@m`^^a<#F+O86rc^eSPt+?k8uZ2^3JrR)c|yeIsAEe< znStS?h`4EDZHwsw6A^K}ePM=gJGYb37^ZZAlc(1=vPpbiLp|4%8>VpCy{UQPq{?Zv zb>|tszZdaj)UhSw_?GItys?3}3m-h^8Z*YE>@}5FHZ;`LloP+C@wzlHQ@TehHR`!f z4#b|<CP7_IjTJx%wrycFG?{JYayxAf4-Ip%)53>G13(4z#uz7klvWO3*_VH*$w6eq zNw<F(755EmUoliDc2+W}u5xmdDM!sE=Hx1~8|&+p^3+`leT&Gx`3lUW+=Vedwjwn1 z7KmQ&Qj}*RwNaiH@nAagg!Mp!{XDdnnxLwtR5t4DFFn4qvC)xoa5dULSqIqWD8M*K zcQk-nTiGA0cD;EYv;(N!5f7(G4Q#Hps<Bk-5%qaY+$ePh;l|pjHRXz!s`E-b%HuOO zqjJXNb8D-)*QKdZZ#gpJiJF*{*H+sprY5Ua?)f7FCA%HVeT@U&K{In1HRokWB4sD5 zYZ0y`Ob*;?h)h-VZp#otc>Vya*o0~#e6h(L6OkZqlt21t5YJ&m(&G>6T9t(L^wtsm z7ioHpRC;{(J7!tEKWSjaWFB8Xlb&9WuYbnt<b3_!RLHP--40RxAA4DS-mZ2M65lDR z|BUqN@y*ApI*0UcGTYGOhc^d*!us{QMfD^4MD;iB5!HXbXH=iqJF35WpQwKO1FgOv z;o3>jrwICZxgs--6`B)upzh_#_hO&@c=QKDbvx8(SN+UDcsd*e&xUmEZVMa^uYpIx z-$3r$xDP_+7w${&X!u8X4E!9@ue<+%BjH!@G&qpjb2`)+<(ZKCEKUtPiW)Epwn646 zF5{&$1s+IEsD;gtGY|KCI1SE$)8RbW2$#SlWM9|8uB)rE*md<Xx6Xf-(B5?Za}T@_ z-UoH=^CZMC_xJEp_&K}`?o1xdhr2_a`%I=rT?rpx4F4(IjvA!%pEIaAKZoV;m#_}% zyywXsxswE+hqu5%EMjkkM?>Q3o(1oQ3*o)+2KZ}uJG>wM3O)cIhY!M6pw4@~fsevW zYUE>Z2iOjGgujCW;c8e8b>7nena8>OhPm?+ya>Jw=fbt{Et>sna6Q!d&T-U{H{glz zO*lby1~$QWU<-T?uI_EmfBpbJME@StdC$JoK%MiPLyiACoC`O@S9iDPJqJ_Mzeax) z{01(hrf0B!_1<38TsV}PoeAf#LBssg{RO1;yLZE#pw4k~;Ab!oeg$`iL)aMI1&)Nh z;kj@(sExYa;r&qicTYg=-+c+Sf9J&P{@pORFZz?9_VMOI?c-eq`@*N-{%{M-hr9P> z&JIt6+Si)^4}=;fwV!t@)PCNpQ2Tir4z+)`9%}#YbI82eJ+dEjba*^0fhWTRJQI$A zQy^bH<2J!Ecp)4IuYsq-Ti}`SeyIB(E8q{|ORyZi4JX2lunK+&`RW=scYoRy+#A-x z0@wr#VG@?X^WhYD0c?gdVH@PE(ETaA2;K!<_yC*@m%~foAK<0%b=V3w!pq>7Z~@HA zXO0gw(Ek!10B?dCw{L+H;Sx9>-VJ{R?}7KjrSKv68>nG>Is6NJ5dH%`1h?x?dx1N{ z$KavxaX1dHgx`lxK#kz9!Wr;2sA2k#@LKo={58~>l{Wf2;LGrRxCwp$vksvC!#wyG zxDb8}^;1Bfz{OB!P#Qr02LA##!CeldUBErz7jSR*B^(UDf-~V3cqMeY(|<voLFq?- zdcfD=b}+MmwI|GmJHRn82c8P^;Ms5&I1BcM^Wi@54!AFT1onsTz=PptH~{7xL_LNF zz(e3sa1cBVo(AW@GvKw5KGyvW<P6w-2mSzl0DlO-fjYm~?O;b=qv4joDmV$&Ko?Gi zx58TZC_Ed!0;j^P0rdB<2W)`*Le`mXF>HjV!4^0To)4Epor8P<=fJ#y)IT^Jw!x#| zeE133x_?IJHPz%SdoEH5%e+w<t7c85xBpUmh;hXJlkF>L)b<vC8IsU;p_VS>Y<THn z7FUQOv$623u^7WMi6W2e7Q)Cv%%5!i&{&}w(DiEaH7iYjU7G%`H2v?>^epAgBmc}~ zLUW0$ZA6TL@<?+D#b~}K|0#Le6FqBuSCgabAYHzry>%u0mvA_|0gi?@!*TEySPiwu z-UPMBJ_l-V{Yt34^&6q~)_)DPr@jLI7CsNPhpst?_RjwVABTCwNqgrps6F#ixC$yW zwRb)hYOh>pDt~}i!WZBTP<!S};VZBmu7w{#?kl)`$e7n*K70$7!MEWL;k%H%5a&Ip zJ5(RQYv6~Fy=&*skhQ(D0p?|LUJdtwe}!Y<Cs1>oPvH&l?~rlZ*#x!UvKjU#-?=B@ zo(#W)s-s^))#dK^oqh-6dCXNttKs)jb=kkqIhkAW!4cn5?D<c$Hg|dS(~jLx^;Z2{ zji@gld$Fmu+AQ<dAQ+zO3!NDDG?Ppkdz19F2j2RZ7g*|Qo2Hl*Uqe?m%$jB%CcWu- zb?wN!r)}1O6-d31&6O+{eK-Vv&8Tbib1{qYVUgd&O@14w)>o;;q>UEezQ7?-UY<M( zduEsGjrG&`86N-LoF7x;S;(?b)N;2ZaFIHz8jq}@hqcwj4sy_<x7zyO!NnaEJdbjB zA?&jC|AfNTqihN7hjwIGvHq(bsJ*KFz2wO+W!Nr6Pma2Za4Rf@m%-EE<xpo|SHK!b z_~t&xk6|-<+NSHmMNp-34ZIg#3!i{=I_7<!+u)&uc{^0Q!;U%Aq%FHM(JzOskadLF zAAJa_9X<?oKjRU25Bwc`7UH+d9<B2<Je4|6=jBd-YhfjP9o9nn1Xmr|8?Xhw3+KZ3 zpw0mQ1l2A-fFHvR@EiCMbjbF<!5ql?#kAKiVITBg!^7Y=umo;_$3Z89{s6KE>^8tm zcoFOYSs&;O(p7Qxgxu3|c7kIm7y2r<8SV^SxC>;yq_5I)+aRlL_XfyUS-JPZec*2) zcU?@ouOQCpXL%=O+xwcM;hN6v-fRt;{U#lSsbcvL_WfsT_ca$|A+6yrK@_Q)+OH}> z*pH8Q_0c<NPzx+dH}Nmy$1t!ht@CEpR}}e<B$Y=S7G;n&hwuLRjlvv<#D=L2M!Owi zPrlUrRBQd~irPI&ppTg**?B|g0fJ+-p+_yc0`}#@D|u!EOHr5*$ih*mM%r~0reG3| zLi%>nlbA0eIy~x*lo8gWnu*oy5h;`W0sp7QR%&<T%{0BXg!K5kClk{2_uF6s^Yv-^ zy|+ubSC{fBTGf63QT<wjoeBiKJo!-C0aGsZG3NcEBcMv@NH`IWfJ)QRa4|dv(l<D9 zNSk*?!4Dzz#@xvq4fiD8$HBhvc&Pi%C%_{heU&>2vQ6wxgY5R2GjzgqFF}7YY=fsl zjqmhn?)8v;4f7t-8L%Dwnecf?ak{Etli?AN;&M4l(GL^3C&M~e1KC@2Ux4*8C+!re zY3D8QI`rp3jo&ljo$x})dR$+WZ^rXWAnR}EQph^m^uL>+`rYlRar2>S9%XFqYW@te zel-2-vGC{US^t@Swg&zJeIxuOWPRq`0Iz{J!t3D@$U4Zm6SBV1T^9E(cn@3$m%?t{ z*>iwB;RA3lxC|Z&AB4>7^;PfYZm0U=bJ0HvnVadSkKEtD74Ql8JIGv1Kd5Nlds6?* zoJU`s==P<a{Q>Gu=NdQ~z5w;U(<^Wad=;J#*FxR#d=08uyan6g+i(@^fS<v4;6LEI zQ13gv4-bJKzy$mdo(a{zPlbPhSHX|rL+}&$Ec_dM9&Unb;TQ1F@E<Un`mX+ePxuua z2)DpOsD2+my1Y{{33*RG6?~rW!$14@^DlG9D(Hs`ePbwpy~kTl#L=d8yD>zOZa0{# z(*}Y^aZp?3Pi@OQ-HEf}rLk!*xILu(nz89vxC46HkM4ZB6_C40CXLi7ejYP==VCCj z-h9;dU+A1hy?Ghh<Ti&<F|7Je=aecRLMhc0s~FMVdFp-}YtAt<yf_m3eiz@@Vs_8% zdAOYbslN(mr{btQpqV-OeDr91RlIkFiu-O}8lRyr7@3yF52;^FpPYB#i=ESG$5U?; z-`hXe$l8Dt|LL4g7o$)*_aL3~5cT6@-X_+OfK8M}n}vv{5Z|tM=r1N^G!Q*H{V9M7 z+`K<iKCy<ca;xD4jh~&!%VRn2o7GM)ubiZB-owaWjM@Rw=BXKP!V6OMf9xUY(EvIg z`U7Z}3seoAWmwvo4{55ZtgA5rsXXma=-m&{v>=YKud&Ei=G50UCv_`BK8!<{GzNBB zprv#I{bq`iGokv%TC>t%fbrZnG}KHpaSz5W;_W{wOVx!qf?l3nb1IcD<BYin#=d}A ztLDQqkaI`NJr@>0`gdmlRDleHzk<wfU1k4pm_hwH66!AU2*}4d8fpyYUb30<CZNV7 z?g_X{;P)W!ojNB$-3b^AUxj7x4R{LtD;x(&m~%QTfa4+O?9LD2C9nc&%~=UK2X`jI zU%?v4xwXT1>2e-z-tqkh<X(cS@w*8Y!DiS3TOfPg&Ux^+a290G*5PiN%igBL`07r8 z%-dbnhs)u)kUawTI>_BbcYFH$Yhest2akq~zb<<-=H1=P;Em|7fj2?c|GJCn{u<r} zABMNXXCUhU_f2>g+yd{0J5!FV3tWBCGwXG?4BiX%j_iH#X1EOg1}=w>!-wE%NFKXt z%PZg~l$+)W>HXU0<WCW1AHlb_*5-A3SF3MTv4`w<<3F9-dkoXG_D+53s=aF}TZoZu zBIcVRy`Dhrq&P6KNBm|&s^%BRATl1P>!hkV%V>Y<3L5Ox8ObiY8j06esgcErc({>; zn>|ZG|Daf1Q3cw+^p^+Kyn&^!>`b4^GREpXW<7GS89tsX2mb9fNmnC%#dPX?H<vm5 zlsCZ`wpOmaM`fWlt72dtVV;s6)LB%_A<SJ(-k~;URMZ1=7xQFz3+AUn#%$+I$av?R z1sUI*3OE}w=P>&~Q{iItjZkr)0k^>Op!x~E8r&TUXF<&mc{khTPK+}fPKG~%=Rw}p zb{9bEp?fRjM`hfX;bl-~T5V8uj<dB+>$Vv?*l~0k{KZ!4TvdIY{hoymJn^4sZQI>R zeVxUa>E^wwapv{2ypX|3^`qpII@67K6RMf2ODeKRUDC0&y1agTD96h47&dI@T|Q&5 zvk#_M2c}hZwGF&^$NL6e_pS;y9%DOL*jM57r40>%j2~Xn;50YzBOC&O+Am?Sfh!06 zuo=P_tMtVi8jz->{4)t_L9Y&7t3J{yZ{`IdOymnYy{}#MeIq6NVTUQWmrgAs!}hSC zCU|pT!M?6%7H8Tkasz{ut8gZ$!iHO!2J1zE8--@l-K0EKF(feC>IRX{*fkU7QLL9i zn?brx$Rz-^DL-%((8Cc6O}rsl;~T3m+A;pHk1}hT9X-QcfJ*NkO&N7b*tXq>U2Qun z0($&a=LOqa{ULkUZE2mH>M7XQ>IYc=oP$06yPm$#(`V5N^bA6un%B*v-T05%%Q|v^ zHJQ$M&2s}qJ^<BC@EAxRVBQhD6`qWK31rQupUiTrpw>O=Xdi%A!R7FAsCCa%Q0t!O z;G^(exB`9zv18itO2{12>`Q6Ax(Yq>1_!t1{iCNL<Gfk_Tn3*-&v@tHry2X#z(1pZ z9-i5a`6WCXz69&x%kanWRrpi*8tg$@Uxx|!1{@FB18~oRZ$a%lX`M6|z5{;(--Ew| z@57tn2e5Y*`3Db#>!HT>4R91Bjb`8JuaNUIeI32K5;C`TUxc5*ci`vn<nDIeR0%hu zp9HmTN<#Wxa}V%qI3K;%O*cV@u{VP;So>vtVHP|9(nq_8!R_EExIKIfYQJm+)PC8s zQ2S-CL+zJsf_>m*#t6#5Js0i;bt^=3yGtPRG501IgG-_2cn?F$%6$s<hx#tA17HW# zobNC2AovA580sFO=6<`tL!esUU^ogE!Qa4PQ1=E8hpVCHgvHc+_AJ~4)ZFkycoaMX z9t&&XDEK2-0xyNf!$+a!hEKp!_%zhq@Ev$E972mZ0}hAd;gL{t!P8+mJO@_5A3@Ct z7r`pH1ZqyG7JW8+60(Qlu7mY(JK9we=EHO0FxUde!SmsGcmdQnwuw*r{^KfSc%`=D zTu+zcJ&|>9FpkB2V@Q7a&(@F83b7LE)zweN5JiS72@4Qzwevg<!_j<r)S(r_P90jE zF=i?0bx89(eb6D%7R*}8ldJ8U{)p^xsy(4gJ}EDlYnZk6kKjP`bKz0&QmBY92Q_zY zG?#8fzYw;;Merv06R7<B8C1Sgzt~fYuElkCW)Nl<!^NHRUFSV!@HB&rnX;B)+kZM| zeg#IMiGhZ`DTvfv@@*@@_-Tgj1{u%}xwRIav1(LrNf{A*J%f|EyRN%#E=C9LDp$2E zL@ODS%)lK(94caYqM`G${<3Mkw=d{NuKnGLl}bK5D*qDLk5BMzF<YHqD&I7YD9fJV zqh}@gth{^zY8-hA9uJ>}CqecJTm|+5RN7yHKZk4K4e)h%2mB*s3~}CskHfd&bFc$` z2;YH!h3`T7Jo7z3XTtU9X|v}0f7;<k==UR@tOMOs;3x2O_!*oIKZiQ+_&Zen$i>aE zY4t<?Dox|yt=p&{HisMd5pw%F<#$s{^df_DYM?1^-TKs*S$f~L@7I$-#<0Gj@|@-x z-j`7f^nO7x?tW=XKUM9RBzfNfVJ3eGtoXYTn$^b8hw6~O7toH_f0Q38cfvG38Y6i> z&Qp~~`$Lucf$(%#0MCL4!`W~koCgO%%^TP&HRV4Tu0Vend;%U08JnHq@Ev$0Wb8EW z!ZMaQtc%V3ArAYYKNd3Pn0I4~;Ar%W73SU8V_*Wk%2#L1qtnV)<IYIT?tr&#wR~xS zwtzKH*UuW5Z^FTA|G~BYco)QDnCgPK@->b+ty9n<vl%CmPC?DP41=MjM9rGO29}qn zj@8=t#r{N8bz}mj{fuv#5c@WGaYs}9ionpmrg9(p7$3brsM+*t)T{HPH(yHUyEdJC z95b(m3^wP?=ODPtST-TmH}XRRHW<~naAhh)AF51R(5O*ZEB0Md9oneV@5_fyitmZD zFV{$(2<+Mj>9+#ZMX5Q&jD7vuLS@n{m!}{|dBPXJn&s8_z^d`WEU!Y2=3%^YKZVSf zqL^far|)z=&LSpjJlb5?4Bs@C>2;@-SJ%`fE1MkU{ri~Myf=#o_0whnWS02B+B`ws z^B>hYwIL0tyn|w%vDDF#sLq6vSHLr2C7cK+!dh4jRS#<5OgI@{26f*@ow@G&Fh4i< zeI9{L=rzVNuXH=0?*053o(I(?E`ZE`oQvR(;cR#{oC6<(7sJi)5;%;wUJBLs>weHZ zQ1^p=2QP;@<GBKA&HiKfDZC1P1sB0g=FmTbyTGgAp746u3>U*S@J6Wb+qfBC0(Hkl z#c&7Y&YQX8@_V=xJ$KH`d!z3{&Qsh|y4yQ0#MQhvx&SUm{v><|Y9CDRjTZN?cVEtd ztI^McPr+Zpr=iaJeh)QgeiptDpMzh*KS14cT>}q-x&!ll_!4Y{FT-n~?!f#S>h8<C z@Q-k3%A7qpcXy~eFhgMnEQ9aBY4BZm8GIjJ4nKfb!FBK_a6MGH?M|5-oz|BzuF)FU zX@X0-?#s;Z;H{W#Cx(6h!F&Jd`Upk+Qvxe#(+>?qYT8{4L^4uLY}aK&_jWk6p_Pk~ z*JpSmmpUwjzO<{UjruG_)pt0lwvl}kJ3$ND+eUffJ<1ogH=WzO@5wfjkIF0EA=(@2 z4pD#j8Pr(z1=Lvf4|p8ZouM<}*RULZ11G^O_NJO(FQ_ps2i^p8q2@AqQ1heS@I|;M z%pyK}L+z>YGkoSdHb{)i`oP&AE`a^vL-0WO7(56ve{u%E*We*=13VO}ybGb~1#29} zv*;Z62ehj~%ua!~cU>>cB-8xF1)CfVdL4A<To)())46Ia#3*e{yBg7vcIYy5R(WM! z&sdDXQN|#cvT9;nhS*jN^W{hOz+M%g7z3|#O$AWoRXX0LlzQDbqJDh1&7iHDRIjTV zr#fog*KyWmzI^n&az!Qe!i<ZRE9sYb)V)uEJICZ*xO)#~zh(_@eqK%v^e9i$>(t?t zfuc(P;+DV>kh6B@D0mu-!*k(Ccp+r1Zobb&`?A-e=esT4yWsKg0eB+(0BV1>fO6Ho z?4gjeUpEfNL)JoOpH_8a0{T4C^h4MmRzaolY}gK`!<DcB@{XKC|L5*ZI$GfVQ2Vw= zLcTA^y#J{ETh%Fj($}lyxF3alG`yqhI+dCXFTtY!<oXKS+V8hrh{T^MwWAKzDi!8x zM5VjSN@R+w`NSHGjy3hlhNYfCC3!qu2(y`FxtTHBL$ogDx8`Ud@O?U8rss7+cI(W1 z&&X!X{YPn5nXA9}$P>;XkCYE{q522L67&5nt#CGa?Op!_UITA}d`Fjg59B(y4E-;l z`h}Yy=j+bRa1*=*Zh^PLy(rryP;=Ycp{9s;LG~-0yWw>BD>w`Cu7>&Ux(DDb=$FGM z;Y094_y}a3<g`PL>+BD?+mWu7a0j>w7Q)p~<z7sENFQfjW-p}(vuEI)oy*>=m-*^8 z?kT2L%_=JYAq)M-8)rJuhl*V-avdVuIfNI$8Z<UyGCx-(T-}sBmEZpgPE4${sj<pP z)sq~J-54K^!OdJ)+Xq%Z+0M+-_cP{ZLt0LhG8=G<xvZE#Z#xq_Hl7p*HqJBp5wgLD zxx6`j%}1RydVBh+s;aRhW@MFh4O1$O&t;M^r!WbL^iIQ>(Hxh7vAs)G4Xuagu|wSw z+^-5`+`CjD;{$u_WP7p+VHs}2o#3t%^w|_Jk5ax6+W4Gf^z#CJgUKufXLE*M7H=|1 za04rRldOqDLtx3iho?FF6l9TYB}KL+u-H(WteWCYm!sc~@CWkXW@b-3I+;`FXwy8g za)?=<EKNx!8o|RUL8TE~9SAC|;JQFC$qJUF1dYbYvOqA=3T_SrlO`J*i&Fv{?0tb? z;^biBuf47gve<vrZq$E#9|7+?n`aH}tO(T~;qmZoSOq)aMetpy{^LD(Cww112>%4t zZ+rkhgzI28a_i4fbHfdg{afcFcp&^M90@;$s#$-B*FyGz-F=A*_kmpA3wOSPy3^@w z$DTS>BNOuOm(v|y4tv1s;dbzLxINT)_fGI}$Pe<m@55a97sy=M&7d~#0#Ady8|Lzk zjI#&45$*-GN6!5@bH|GJ*WLHf?+1C;!|4lqGH>q(_lEg!0PGKsfCs=aumH05ahQ|4 ztYsYTGr0@lp-_A0gW>&f2xPAB425sNBKR>p3^EsVis3-o<WX=iJQ@yz$G{_D9LC{D zcq|+Z8Lyq=U@1Hvo(#E1W$tKw4>C?We4n&C1CE71fo1SMcrttuo(3sf=X7`qHJ<xd z?gelHR15eaTn5Xb_S`GsMmQ1nqE1!80$2l&gp=VoI0c>qYoXQ?XTv+;H26B?`>ov_ zsh9OI4jW(-JO{SGCb$SD;ZoQPe+xM;Fz@xXK#db$Q<u``2zpn40A~5{u0AO2<L_yk zv-qlp$~rUKZ1;^J@$w%Ah;Mr~E1xvVufc6-Fi{7z7Exrg+wU!HcV~}R<yO7dZT;0H zn~14boPx+&YcMC7bJ6$X6Wr3(HB-$zS^@(zVm0|2Gzv>i-1c0l`|Sy2kzO&}HM5S? zJED3t3A!5EK<g?e*3|i4D}L$%bs97_;~X=UT@+a5UHss<QpcU@`K%{)z8&#Ov0M^( zW%p+!TO7zL_4OyFbJNkKIww6kx(v;i92;k2r1DQ-tUbWLsZZf4WhSpWaT3&+SO%35 zCqq8w?y2@Y=p)@$h}zs6`T<lwh+pn6;Sb@>umY}zm5_5nrwYCbYoO*)li*iy3e=up zEj$694LKJwcT_naaHgSWpV{0|?Mqy#2=3*u3ElxIJhR_113rxYT(|;K=&t(s^WdN0 z1u%m=m<e^}$UNVC*FM?h4n#j2s$8i><{cK!E8H6N^P&3N%i#jJ5bFNWkKr`>!7Cx} z)R}h&Ho%{v=iN8wXV9UpP(fVwUCmur_F2ul1dZ?)$aVLWJagHjaTY`NT$~%=3V0KI z5#9`0Q#!Z85_mg21v2Ki6Cp#dI~m>$FNeAddlkGFz6O5{--7o+y$}3b$e3Zyis_rp z-Pj}Ga^#C3`}^*l@KLxNw!^333iup+9DWX0!hgUgVLaQO73+@vQ|Kqar(qrZJ-h-^ z2izOrbMQ;J2JXDQJsXa}m(d>zsUz+v_&Qt&-+))bx8N=CZFn1e2mT-O-UGghqWj}s z5D`(4reeQDP*jxAH1;daC{>E0s7WA!L`q^31O;^|Dk3ThDk^Fe3s$gW$KHGI*buv7 zuh0Aao!Q;HcXI*%&-*XW`+4WX^3Bff-JLyi=FFMdnb{lQC-6!58GIYAg1^EqpguIN zv9X)N@8I|78*-~>577a8$A_+XH?`qE7eaezV_PG8m<|s^o+Auvf5#UyT{3$qewAhR z6xo5uEVC2!nG6qa0+m*kUEP{8YvCuJjYsr;hU!b9eA#=s-=G|8%9-CA{tYRw_TF00 zN-wy{ME=QMiM|Q-F*f6z+u_aiWr9sFtF2|JkFtN`wMy6=oXGWAe=@j~dy^J62V)YG zF)iTKN*-IrRQvhthsIylFdZFt7E&#hLgL!8S?@&jsxB0@`*qOg<qYL&PF}_q2FXCO zZcPN`%)$o9Omb-gw}*OXzZYx`4~LsWY?k@~{Y&7MkTPZO@ZW;lvM)W<JABD~d$<j3 z3p>Icpx!~WgJrNioDO${mqYp+{F@-}Rs37wu26ZzZ|%Ax_&YgwPIGm3<(?YLzodR% zx-q}UkFn~0F6V_ITfNs<-8at~iZ$f0gRHi%<0^^Telby5YTu4rnnh$DTli{oXeC$Z zRXJ+ncq+qwjJ&eeOF3t_9CJQ_bYOB6=Ny1u(UoFDnbbV-IdDUJ-J*u4l)AJdhMI$z zOtmi+%PN04Yg6e+8X1Q{vaO@=ae0lKu+W!sCVBUV2f#tF5FQHIyuna)?_ux^h~8LT zIvk$QzUtP6kh1Du0adqRcdc%H0+z7<1sn<0H&F^H>sGg_E*;IjbOfQ<_i4sL^+TbT zHa@2k{=t3~OgChlAe;zQr``Znmp%h0!RH{h!hav02)~A^LmTnjC&BF?Hp$O})1l^( zoC*(xr$N0#I2~%N6VK|;fwQ5?z;$d%U6p;4E#scv()zmU<{1RKn&zA^GztG8dveZN z4$FO(0!lk%N;29Jn&&J{i1|_EQ52L`<-P75+TwF~Hl?3(WVZNR*pdBtP_|h9fo$;t zC|i6H)U#qMOeRf{Z}OXLYBx!rCc@k6%OotnMWvOatPB^Bw_#`={$X;dH~&?ILEToa zhsNHenzK5bIA@;S`_;@a2b3l#iQLYHMkYEOlnV9W&F92CHhNJwF)*}pcV8v4ZFIoi zECz3JnP@Ag8r$kUzgbXT^;BjH%&JKIF{`4nfIntkPQ6<}l1nXN6oOdx>J8>(VloNK zc+|2VNuy9qT$U>6$!^cSfcsuuypeDL572;&B&e>#W(OjhI6>dCFABcyqe_Z;BS=he zESepcsgvqBCk)aB>0D<b<_GbrQ=}iNQ@TRcDSDU`90palU=ys4pv>AB|3$Df@wdRP zurb%tc&|<1o{%wVHr|Uk8|S5ZWq;x)!vo++um_ZnPQQh($L$9-@9c2c9il|$qaO`l zVE-7X{*_|5K6Zfm&BpAHfvn5pmBaq90_vT}ICui2AJsntYCIR~)Yw>l+1(S_XB`=D zDqIOkli#or_6V|G3W@UkT_E+Rub#UZun^9Khr?6hXm~o*ywzE7CY%lLgl9s{E1LtG zBlol5LGT=S3_K5xg!7>6*$K!Z=||m2Tq}-U17E0Lb~TQvswOjaJ<X|M$Tn%sVzq2< zUZl%W8pNrw(jaT50^$m;*3ObOD<;NGTOTyUrpT+WwgZtrZ>=I0EUIRwwj;JBn?@Yi zJA9dk6cO=a5m)rfI3~>@=+u1pOnd#_7HZ4t(>#h}h3?d_f4?nJ?$lrym3yz_mfgCR zg9`1olOwuU3mO0x!u{jjwd{DzK7SXSCP?<nc^;lq?F0*#l2<`~n0>yM{k=GH9qbFQ zhZT_e)7}@{45zcd1lGaZ;H~fu_z=7cJ_GNDuR(l9|8saR{080!C7}o5=I~*d2Oov` z@G(ev^B#wL!Ka|a^bDlD*f-gZg)gv={@OR$u7Yo|e+_&aO82Ng>V5C<4&qc7En$1U zzV2CF8YrK8v#9(FL$>xw+tM70X`3=!Y821#HP@c2IkSo_3`(2wW+PY{M2_WIlwOs4 z<=J>ByH*7YU^P4j)<ESED&XU**mzF)OO!ufY9o7~XO=yXY;>>W_`+$#>0VRVhOR+2 zBTGjYRaJ+tUH?nMQBh2B>AkEpaG|WSFq9)Zu@Q2*C5iW&<?dAbU+G?j+>~||DTSRe zb=uzrZUuLPx_l=nxpjd(A$5b*2i@UF_V<95a8D>XP!3F9nva$Ib|&jEQLED*3J=R6 zFC2uTP+sPQ_?#SuY+c$sX36?!*^D7J-;fUc%v_J?)1`B{#*F4>lC%J*s?!BTZDUc& zoU-cL6P*2&Le_C?SH#26O&v53KuVg)2WfIXF=yKqthSZUF`TF!*f5CUMZ;x`Q$#zx zudUU3pl0d{iJWNXyCo9UAW5_D8YxwluY;ofU=pHIs0>+?IbEtBP^bwywHUg46xlpL z>59rq5a(_zU5T4yP4Jd;Ptc=Ecij2vb<8@mA!i1|oaBj&i_Vns4jne7qbfRLYejpZ znU>jI&9Nul?f8p29{rGhqFb_k7S2Ymq&w%pc5p822G50(<9SfBk}s_CjV-fpyIu-s zv40ulx7JrSA706R9b5!&fmgw&;WhAOxEOv4uY+H}8{nUiHoT4TxCw4Z+Ll0xn``*R z@K#s{?||5Qn@53tw>~oLyY-E|2=C+gYw&)E{q>f^PvApPqJISLhHxK;67ZAoLiiN? z89oO!PJy)gXTmq&{ZM^g&%k$}-qpMdzk=_<Z{P>;JNOY~y*Zl)u?h12g#FDR&+Kmj zSHbr1bJz_c1AkxmCEOpbhW+3VQ0wpf3{|dwfwGrdkjA7RGl%0+-5PjF8~$)1>?0dF zv4StT>SKhiCP{ILFf<AO@EV3+&gE!0vOq7jW3`GL^n89W!3?L3WweXRX-N~GJ^4=B znIiVVmbzf3Yd|R-Z&#?YlGK5HS2CTuA1^Q;k${Qh8bLQ14ub_#gB4a)>{Mc1F$x+o z@hd#QuQgYdpah}b-ekM^sBtAHo@l0E7ID=sL77OONcWt9yQKm<nMjv(`?O>HKIn(n zgM26GK1*RAyQa;HvpA{Y^_xi;u45zq^X{B~ulu<k=~qr|xVg!#)^3$4)|tgmuW{#l zQ@D?LS?G@Z_b5m&UgX)SgKR9e4m{S()jN+vwTqvEhry@e1o$k}W4-|A!55**@jLKA z_#XThd>_)k<*k4R!w;cy>NAKR=B<L?!_VR0@C(?Ow0sFQrub{9eEAmM1iynT;P>!b z_!HcM2mA%@0)K^)?;lX@kiX#=*kDuIJ8(UCE^G{!!VRGW+7iAGw}2|2Tf)_F8@Ltn z*&c2K+rqYR2iOU=hiZrH3^fONS19}05vm+Y7RmmRV~N|8t(0wH8~$^Fa%fW`G*7N# z!stq?f>n;fkST=f9|=oS_EN&(@ZLX6E2I<dT2eNZpp#=tEmchs=QPOlM_zi5;C>CT z_mRE~3L*uiU;45E?4<}o7oJzo)D><CyFvLcd%~`;03HnYhI;OOpyZ=ItK_@Q!`63w zCH>(YS@N-^ysfWfY+3aL6Hpx&2}4pq8DC@o1CWN=q|=-pii%;(fT?ILBPy$(NfIn3 z(wUHw<4Y>WnX%E+1ZJh0*~ew2*126sZ0JWQrzF2%KlloyT2QJ%^VqW9cWMIAa3bAB z`F^<0l%E(xFbdtQq+3cT#Q|BiT-M@96!;1X6+wDY4l~zaSXZ_CR^w#i!?bCn79K|2 zVHj1(ib9%HF0o`h3|y-*wdLlZ_|b*Om(+~4^D@RZu#0gkMkB#HjkFPTt69)VL7x&= zy37vFjH2tWV2wNBb#BCe?h13Dd$LgztKAjimQY%Kw4Gf4ohtel2I<{`O?Wp<#E(vF z=7+2Of)3j^Z})^_*e`&xgYvg);69MPRsGgK4ITimhG}>`><RG^yx#C*co19#4}rf! zY^>jmd-jKFTMmS3TcS5UZ71t*o&<-mPv3|)3@U4nfR94-!+#a>m^OyB2!70d36y;u z2|M$wqu_C{3~C*+(eNaQZrHp|%C^rp4!p7OS~wow3ajAV@HqGYB!B(4;qmYThz{9z z9!`L}k+rl%{6pYWSPoByQy`h@E9+-N*5mcggpJ6^v!F8cJa`412erP~e0UqY06qjS zgfGAa@Kty*d>_i+{2pEo_3pL~dh0tsvn5=_emi&-+yh<<HO6HzlpUJEmb63CsHSX{ zY<ITdKNmuO$(G-Y>`;Dq7&giL9du-;iAflk6j50QCbG4|IT8k?K{}~RsvcIji8L!+ zH^Z&rEfD=Q-?s<6jr~L6?XVc$0qq%}p7kg4E9o2Vk1VJ%G*8I8tNyd9V$!2lOjy?| zrudsAYZ+oBbJ<~4K6TtMCKcH^@*^n8<H{Ihn(5768Xc&v7*ie|kx_0J9mzD~lpAsL zTaeig%&+d>A^K%xw^Br*+n7_9ebK^*al2KDVm--0g6wIwO?LJ)wDroj%xZA5a>`W~ zn`KakM$s{YnkLdEU-Qe%#ui3VW}?H|$feb_>EcP<pFF;wji4tjg?VfP8;mVGAwTP( zw#7Pp<IYr%M>%J?WNMV7VlpOQ<0IoYk>T2yLQK$!K8$W+wcuo8+;bdfXJAF5i<jbD zI43oJN!mAFbHq$gbu$x&LgTx>U9xU}F9-K==j!&e*v;HNym*EKTX2GW-|u+hFi7uJ zzV;zPj<>@7loOSO2jF(_F(`#nTM&D1ZNdIfZ9(j$jgP?Y*_`@m@Ok3ThcCkG;0sV{ z^D<<!x%BFre~taY@O4N(w5>6AF?^f-E8%<aPWS<&&(T`}pM@VmrS)U@Is6o=z4sYB z9Ik?8@C!H{B2&K(ehsA)*Z`YP^dnTx{|wcp{RL`#BH3zv`hP;b8~h7)hYcD~r@{5$ zt#Ey~0@63?e+rvG`OLJ-t!=vzY)t-a3^#(jm++Oht)TL4Gk61R1DC<A;7YhPRG&SX z>HiG3gR<!z;a{*5Y(l<KKl-xmU0@#U4mCb!56HYnuK>!P(I;zmuP3rf+W6CmYfYZ` z@TvNC&wS1D^0E^1HPf6Jh9==3)bTBv$Gyrv@(fkz260Nvyh)#B1hS02EJHDoDK@hg zwH2dE#-Ya>w|KfeaTbEFU=)!KJj}Iy)l>KAz;A-ZsO<c#GK1g2{5=cd7>xBA+pVoQ z%2Vp)4o3@ToD|!S>Zs*Gq#zk8UpM3L+k^O-h*WZ21a-fw;cjp-8~`a7){l8TJd*tz zVJW-`;*;1qfTzP-*gqTI3h@c7PUD)^uk$EeMm*)v*2h3!t$zpou>PHqP-VChJ_zYk zwy{sj>qppET__(bsS{rjzYE(+wkOx56XR>$Ox0pe3d29p30c5|PE01Mo=*5grr2US zAsg3@s630VEg54ysfCKM9ISFfCW6k5H8w9)bENoDtzE`-F{tlQ+M0EtVAOv7kE5^V z%mr*=ki3-t&EcFNvM=(L3<twK;83_f90ryDhrwgu;jkE@1AaLi0VNRXR_iyEAB&E7 z#SmREe-{77{8;i<ZD=3+>WzV~K(1l=sy@4<kMsO`Zf?b6@ag*bDjz5O-i+pGE#-1y z$j;g9g^PNX)RtIzU(VUFyj9VDlBg70EE`osUnFXxMUTn6m4A~6rnGS`!%$1A<!b2? zD~NVuP)kZmkJkqsttuT(^cGv%l}oD49VsLx)D5PH6!D2=YdZEz#9O{96$Ko~Qam{| zrUo1co1~iXD@#EJdTlL!thLUhiE$Ou1=GZ>(efO~L2^ey*DHo`%M*73sEG7|O$D8* zUj^?EY=1uc?$#r1Uw^y(lE{c{O&%+B+0MOs?3viFNbJvz?aRnX$Co#-OW1$X9qD*? z_HGa2KS$TPv9J17!dJa2pHTIw()=r&0{?)gLe;0VU#vcrU+_2kH$c^^(&dIwnxXpj zBdB^+=}^7uanGiZI@IdZ?IG<&pZEXXrf`4Q9IB2}{dyTx{kjP9&eGQQ*%GP`T=neZ zQ1$FHQ1$Hkh?{HLe5JN<2ln%zx^{Pf2f!WSaJUm319yhgpz7rrQ1$U#s4)p@L#jSj zHu7%Ne-^4feg~>P))=IH;ct+%+gO4Fp!|(ARA1hKun+73wYE@iI0W{Ae0#^%q?rVH z*XqxMec>Y55Aw|#RM^>qmyu!j#MsC~h-<^vi>*L^xRCi)o$H8}9Y}`<VUx_?u^~#a zms>K@!#OFBO+{#oxv|CUwX~SPI;*ruMFJ;(;^@(3)plkTk<JPS%>kX6Poy&}!P_gV zhRv5P;7}O!OtUs*-Yo1GM3NR?k9P!Anq*h?%tu4jf8;6i&9djT78BQuW8z-=u?w<~ zCZCLGl&~;li)IrXnD7XU`$zo-bk67cnMPs10edC(3ljT#CieG8>~~M>cQbpO=EjMv zDJ1HR=3&;TDpaza9deH)c@woJc`wtkAV@xvcWd@<4B|#1SIMpvZUHM`4>%4U3dck0 zKI=~@gU7LdEX02KmqKa<|4KL+z6ohp__PPCALVn1Gv;G&JfDB~>E1MmU9o<Z-AE61 z#^$lkf|NJwU)c}NVgGy1Q(c)X3)mYg3x9EJ?@WGY^7@~2N6X<&bAcQJcQu{HvZ!<n z;v}cxVd)qi#l%WSaTFOV2q_}#7X;ZzpDhe}9_7m>M5ta+IG<DWXcs`0gNtAncrjFp z7DA<iJn*Yv9h?rYfb=PuAA3K%iv4%t)eyUG{;cG79s82+3bv%*aT0O6vrS^#Cm~-I zDmT_G`t(Jb)54HlsKQ1?Ovduulx`>E_&`4?axq7oatFiJ<Q0}jr@P2#+G7U}Fn<}l zHO3O7;-UIYG7P(y!@9AMxG?DXByWDIb=56Aggo@jkHg;Z3D^%l35(&=kTPOzXUS~? z@+>Jg>N6XYOTFiXU#R0$(@V+C-f=tsNp@P<7=|X{AJ#gP+=_{b$t@Iw8-x(c0XZBJ zM4+^0lvC_yshxUxIz}haEmFh+D_QNVy*RpzjUX`=z@%t<5tl96*m|RN91MfxAo;c+ zVtx?$67p-$-!H>X@Kv}cd;`kfyb1BaZGAr38*GTl8{M^afz+p<^nC<n6F!Bn!<CTV zS|5V!%;)SYf4+b}z^~v>@arI6d0&vIKL!#<a=nAu_G`m`E?B<tl@t8Z+L}?-6;*E9 zLG$o9%+5AtMT%G_q)}8N&NREM8Kuu)MtwSkv8(9*Nqv-Wq%^gLTS56oxP~^yUviXh zr1Z)+((_JWOOD~~L!7RWX4}91bJ^r$-gcMq#Y*cg_~%cSsn7Gdb{KR&JqNCg*Di>Z z52iH82TQ{aL3)e%yJI3Bjv{V-wj<dN$fS4l_=?G0yI2Z25QX}(SNff-HG|ms#KWWW z-Pk3iPrp>zR_IE4bkA;3x0Da4w5v}>`YB(qCzLNJz1$lrefvPk{V*Oj*&d(84YuZ( zn9e-M_=(m0E8?@X<waeKI(I3sN1DrtVaR@@wYnr-IwyRTF8PUw&U+;z3X&0fCL{Jp zMs!a`bW28bO-5)kcHCF$oJ{Gz;Z3O?u0u*2lf~90Y&G*@VjgX&7^+<Jpq3KjG@z!8 z7n}OoGNN3S!ncZXeVn!2&n`4UpG6*9LxSDR9e1%&dPe8O2HNE2m#3rKjdBqgi(1|p zht5@OuJF4x)l>Z9rWQ(IsoLDSYB!>St4eat(gqRkzB02xLfjduqJjvwtnDBo9<%2T z(jRY&rW(=^<OG5)Ukcsj$GWSjkOdLSn0WO%)+L}gb4C}+QT9+TjXn63TM+bPA4Zo~ zwN*ugd*oVmE9#udnRDD7XJ#VY9j9g@+#NIaMeC`DLFGy1cN`Jpg7}`4LzT5&ume<^ zO9DFx9t73a8VniBVe?-Of#vM0&84*Vhf3f8=tH%^X2C<D{HVj=ayT5m29JQ>z$2l2 zfDteSkAd=Miy-Yl8*k1vZQW3g*}9?Cu$1G|VHunY$G}TrIlKi{zy~1XZ~f=tIQS79 z4_CtpkW8`hsT%iw9Q$n{*Y<aZHBj$TCc?q+csLSHf>rPYcoIAjo(reI%b>=u-V9HM z55rU7%g~1_;54Xwp9%kjr@=<#!Rb)1RAxbqYdHhv!8uTE-gDr2@H}`oJRiOXFMt}i zav{`svIQ^&FM?emGVzaub#NM71Q)|=;Ir^r_yJrD|Ag1UO)=!xL-noS40}Rk>X$<L zKz!COv$4~Q;4=1?!n@(4@E-UQycd25AA}7XyRp+dz{l9vT-Yb!Nca@2gipg6kbVh& zE_@c&!586e@Fn;-d>LwP>?@FU7`)dY>nnJ#Lw!&94am9&HpaRme4G7!;XAM&d=F}E zvG?I<_yJ@-zO94lLv+NS3qOW+@DsQcu7u0sXYfV13a)@(z+d5)usP-GE2uRCzJ_V| z4OIO$5}ix7x2KT*^5HZV=D<w-CKs2lzS)PPg4eFaoD~Kx8V0%|wvW{j**^?EwXWuX z3g~&wRVc@ojjyae!JJ!_)~sGY`KvyW=bA~h>Fn0OIE%R6?euGXw_IPNFZ1-3`MJcW z*!0S@s<N6-5V%F&i*#DaC>Bz6ix{Rk$N9i+y_mvi-wp8N(pmnnQd|(76TFTMTaeC3 zs-Ds-3%m{sN?yj+t#Fa{zho?1w<UY82Jwv=I^TH%s2frK&6YKTmFzc%x5Ae2F4!7A z1UG{(K;F687}PD{{-j_lI2vvXu^--c5dHSBC-$v4`qX^%)@ujRM{h@nUU`hw_P>KW z!(U)W$UQvlkM+ZKf?e3BFV4R0$lrc3`>g+OI;DFi$C&NLap}}fut&B|xi1E4IP*HS zs%=86;y?ZWgI+a3vI=X~E6F*jSG;?$HW_`UrdPe;D6Y~6s;`IjDt+E_d51vhS3h_k z><?)ddjlbT!yd!H{Z^!4FzgJ6LG|UZ&aO{=;~fF1SG*CBdc->lQcrltK<Wbz9kKVw zB@lb=mBJ_BXo#Kk=)*PrD~IU1$2#vmy6%mIvQ;0kCG~1Bzf&3N2YY7pD$yn{HCH^v zd11)5R`P7}IpiAEHXvV~jS68~Hdcyr&SsjOTCDoO2KxM^43mt8i!og^H<75oa7@T* zgFiw1FdcMbAe01W)2w&H4Gd5Nay18hwlL@!m8bFkBgUfIxW-9PhKjLMmd7VT-D4_L zoADHQKAZ+=i+j`Ihj1or$#qYK+rZOdTX+VPEN4T>{8zTliFTac*>@rSde|!?^U)QP z%SyY9<`uPTNEdTT7-HfM#%mAfkj86Eh^hyiUv1YgzkV`t&N|a8WG|k2MQ5?>F@x%= zYopgp!H==-E?&;MT7WLzErr`5x}clxpNjU~l#XufPi>_{)sEK}4_*7R7+Hit&#ipe znTVl5{7uM7vRDS?m)-+=!uy~ek>B_u;c{33@x5$4z(?RL_8*4};1lp__%vJsnJaB; zyFLfsVgGrk{txCn`t)^pFT>y9E3h4Dc@6FgUx&1Dy|>^2kTG$-()u3Mv#fylgx*K+ zYWNAfAL9GjxV@F|arRfi7vSd*AIJL};+uH?f<MBB>$x@L@DZ(U*Z@*LcpJh4;YLvJ zW;THpkZ=0>$HSKJEZ7>J4>yC-GmYO!_HT69SbaG(L}2eW{NX}WwzV2$e4-;hSrqCk zoN7KPTwbgW;VZe+I}=CAM_|%0?=s!ApZK~2qsq%hjV%f~ePt+CaG{u?kXxXf)EAeu zEJS5>sT;<+n8?*6TVD(*BCV$CpAhM^GGi}(B+mH{PE&u4_K!7tBCGF;g45JTqicj# zNV@B;>fWErcnu=%v*7mj-nBHktXt065~|{Nd-QAjw6A$#UUbjE(a~cTa$=Uh7H^o& zB{!#Y0zpnub1vW>N={L-nc0c#u4W@hq-{94;bsz*GS^Cbil~+x#`XqTV`oa&-DRt4 zFv@E07Z4SQCz$mbPZpJ*SJuexq-X6F{ay}-dzD-sUBIpKJUp{MapdTd@fG8O*<j(= zt@!o(@)XyQ^#p4l^V<$oNW3(kTv3x{{&APQ%W%mFvQLwB7yicHn0S&R`jF!-nntHD zX4ic{z>RU9#eSo9`nfus?A{tr;$&mJBk@$8!gVHW6kTj-bmsBVz2&#=>$1d~OIM`! z+c?2_1IQcgtA(bZ{fu9$@w8!3nU#%{UvX3r-<C37!2S+UR=GVahP%UYunUytu>Pd^ zA*90mTh@K>KO(+2{0cID*Velm1XWiJh6lr;a1i7>FZK=dBj6JDkAaWEB8X4ymBDt9 z`4>JujyE0-fmLt}JRWK+GJO(0^{2-?asM31IAQ-T$b1bS`{+%Bf5GXnCC_*&>;cb& zQtGpz=9cpg-^Qmgzr((9$~$5IRpOa%?*9reg4-d{OW@A%Qm8rQm%$OR4i-b!Sn;L8 zSHoHG26!{P3EmBtzz^Xqa6{U*x4~v`85{}kffbN>?bb$q0A9!bgYXIX5PSnZ3|GQO z;r6KXWAGsOIOO|a-V?A0J_-5Gm-jTh0zL~>1YUvnz}MjS@J;wDd>b}F@!y5*ApHaO z?a>dQ3dBly2mB1)1wV(c!7t#C@GH0>2K{T;2Yv&`!f&Au>1Xiohu_1G;A;2_`~h}D z7k`9Dz@Oka$T)BRI`|8G9+DUSEATh?J^Tx*<TY%BZv>mbLt#@m5i)krp9h=4YvHEw zF4zLT23x`(U@O>yLf0C0f~+6ls}NGE{8Ql8@EW)+d>f(*{+Doj_%)=z#9s|}fWO0b zP<7=?Y)L=(5%hdV;_2t``e5~g5Y?6OdeRS%Lc|n?U;x2f_G2%mWHd{Oa@C8gv{V=5 z6X$BdU<`naey`}nux3)ZcR$V4Et83J@414y#hDWGdlz#o40<Nn5>*2WgUDTxfu6G? z><T+U`CVOLUr67Qjd|Gv&SQUXcpYSXr>&)VAbgAc9&iQh2|t5<p!)p|f_rk`ey|Vh z59#CbhQK<=oJRAT4ui^z)ojW4gr5>8@x04+P>#G%KZHK~O7-*4*4~a~hd!gWfa~sv zP^e?VOO>$*NU7S-I$l@*cy-wrmOY|}B^>!(V873b?!eDnbaXXkzH-mypz|#<c3=4z z20gR#3iEIMw~DVqMv}u6*dI=XL*dErICu)wHKxJS;7rK-aPL%j4Ll7>AFz4;V~}}) zHn#FCDA`L>lkfU;zfIY8VJplbdzubq)z-k1=u?~(hU}6Ms`vxVCFk*#r4z@M*@q?y zINvF+i^OvbuNbx&bV?YM9?1ps9F2i_jPxswk3+RxpM*;9Q^9lL8`tZTQ&HQGbCf|t zGS4-M5eh|2Sf5a&?|GOyRiUL}h&@x#>?-D{yx{n>2u+O7eu-mK<s|~2)3Z9`<m1To zh&jOK6LZH@V_n)DI6I4|g7%71A{o%(R&&mr6$~G?BfoNT9-I4pI8j``c{4iVo^|wS ztq&)^&m$Sm-O)5H4c?I3`zPl+b!Dbnw()ZMtH&C|Nm-7puJ<C5oh`w<!><@sR%0n! zMQk7eT+{G#irX`ss5|GnU@6NU46VC7$<chfpbh28_6BKqduOu|^zMJ-=wbNg&zQ0y z<rSlA%}vbs(UUDbjiM847?e4xe6UWpk+)5vBi2Vcq-<Q-D19+1mt)B?@d}cUeD7E) z>z&T1IPX2DNIE^Wj?)*Q=}lz?+|@fIPLDgK>T_D4g5X5ZjZ>Wt@FuTnBA<B(8V=6w zcJ1-B3Q`cHgUfi3Q`y&?bcGVnt%)@f4q$&2)O+30kT@HctA3HO?4JnnKh5@3!*kg` z6Dr^4z+d3ma61xq4%`Wz2M>hQEw(26rEo*Cu@0(_^a@BnsEx-t0baxY$#5}Lb}xaK z!liIAyanD0Z-aU-b33GMZ*!!yuF;+B(?+*(<+P=3P0bzQy~N{x*|>822b&{O2^qI( z^U@xKt=4zrUCxC(lYaqx8a@D@f%5g9h0T!R^RO#?0T#fQpp@hlI0wE47s1yd>&x4? z4y|QO@$^}L+QxOPhp$Fog}sOP6n@M;b*rsi{5kxS{V(8_Xw#Q)JNOOk1iyuS;dgKl zTn&$gKf`J8FL(i@AJWz|rttgH%7*YaxFMXU`UhSPH-Y!TX7C}{0?Nm04S$B4!7ZD* zv8dZY+7o^UxC0ylcZ5X{{q?89o#8adJ3#+pm=E=xKzjQ9`yhQT{%4TJsQG?-!R8ye z@dTSe`s4lGA-dxafV4yXBVlhi3F2$`Q{f@-L8!5#kHY@&O?W6&u^Iw9!o%UakhZEn zmyW?BV6SHGy(M$by`$ORe^d9qvL`HIe*`Rr^WYe$vNsl95B1*h7kC`}8&<>hn!ERn zTfm9z?*Na7X*db?hI+p^7}D?SS3)121gFEfa0aY{GvSr+RCq0<4)Gs_XTW#iZ1^pl z1NUe_-46T1^WYeGK0FiBkL)jj3*epbV)!<^1bzk=!i}&Cm%|qDO1K?d1b2W}!S5;8 zswR@(Iw+!CcOV{FdIx9fSmsyS$gYx_Q56+MqpK^&7fq}k-FXjJ+j4#wP{T0bOUqdL z?4QeB8Lc)!-j`~HS;S@4J?acd6Y1)*3D%S^WZ%`4e7)B#%q1_^ouaQwo9UJ_<?6aj z)s|13>kSFssK_rbh<@vAs<Wka#D+o7KC6}bFfwDh_8~hZ5AN)DhWo=Fkj>T^>;)IF z-y7;(`a$r1crc{AdVOIduG<ebh65nw&*l=V&-qaHDNo*D*ah-9)@O;mwr|584%d`d zlt;@e%By$CTJx&1ww$rd^7g7oQyBigoL74GWL_PEtdv(pP<d4Xl~-jD`C7eq4lHMX z9y}J_0>{Cp;RN^+tc2Kn8wdO$tY-gnh??2>UNq3g_fCQvl8zG~HrCehR9<1P>-prz z6NicNB>#Syyt20GXf5&-wKtSY7=b8c=aSsP6vv#(SB)#F)m(lxqjW@19~6e5F{C3c zye2KSY>#gB4kN91Qg_&bXgX{sRuhvr$x4@Q?#^)wyljcjw++8>0jm%uyC&Wj79NLs zZsilzg2uU9XovlgEP6tTq8Ho=%KoQeA*8%mJ%I0G<5<We8^1yxd4o7EIjTO8yvHN^ z<okPlbD<N*YGMC`ytCU1#hev}Y+1+K2i0Yv?b4m=H3udW8EX!t$P1q+_g2hS$OwCI zX)E!?Jj!Cc$6U^Hmm+mZ>s<G#5iCLA3d*hD4#7`N5oMvac2r{Gp{(j~j^(k1Oa598 zVxU5msIJBn)`|JVWtrc&N4gwoZqSf3)ZOVOR6CV&J=n2+3hJLINZ!h4U7GsK!U*z5 zd2kfm4~~QVA^BzFlvK|uUscaefi-Y8<UOj{)T!`R_D_QNdRDJK1y!#q-)F+6+)MST z-pQU0@mZ{1l}%N>x(8H!dJsGd_JcRVt04WOHg|U^WUPp-LHHZIgMCSWek7mw{I=F0 z?{z)i5!pDS2ch2EJPa4XN8m&7Y4`zr2C8rLd3YfHDesVM-G!H6CHpVK$?#Q3f2WO; zxgWm4KK+aKeOUSvZCnifb~Y|%J><)~C!c;b8xNyC(hu1`0DcVBSGp1w!Ox)Nb1GYM z+~x@4R2GM^9hxW?RF-8W`kZDZ^V?;Hl$l}3E*jFJG>5VZf+AByW~o+8UkW)E2Bkyo z7XGPjwV*myX+u}cE~KH3^?>?qPpEYFf_lCe*pl-m#uK+G+ZeXNndj5;uqDyQ?1Qzm zI3*0(Pba<Cv%8^~B~}g!qWzKX<q-R^CZij*sLRA6yI32&HIaF2VX<_v%@eVmodI1< zbQN0|^gNOi?ypxGL>|KP>lx)+Yz?uMR`1ET=*s>;cmSl%v+>hIAb*>0AsdVg{W2)u zLUO`xm^|-9_mk^6mY{zfIA;VLmXT+;-iFP^4%a7iVvVOhTdb{OZykG-ln!0<+CM&b zjG0p@)-0m3v`s!;ipb0oggUJoF;3XQ+e*2hC`^_OjGMbQ6jXJF64U`Q2u@_ntP`PF zBotiLIh3wjL>AheE6c4TW3k=3p``4NWR|}uB+j|BZWY7gXy5%Z>pdA+<DEvz2=!M9 z(kJ^=-@26=GJTQiX9$DxP3r|p7V<L{&<WF%G~9>%-ca^fKC5y~KI@fG`t%^=nExn5 zCe~jpJzB{=&uw;AdNi7A%U68`9u3zc(Z#R{90eJlCB5}`hUlEXA4KQ;gJC&55>`OQ za=3m7C_jv`1j;g7-xwdle~*3nTe7e6x4wn+UHIR_li=^r*FT<n2IQT(Hxupzv4egu zcpB8)#nYke$F*!-65~4dBu-_kGuz==`aa67+f}iy84~LEOY!T5n@fxIE3+3Jh+2<= ztO<yk2^_gsPA9S_x*gEoP7K$NV?d1Tf;1=$O6Q9_Ggpl4XPW0y+7E<EdJmWfmCv1E zAE@V2e(U)^WlPo%v|a7_se`@Y^`1YUclhHf80hWlhcp)mLzD0iPirrz5U41{A5L*9 zNSAMB#Y-28B;yK8P-JC(Q_+vJzhg;WYwoUsPU{HWZ{4~m`O&_nwuPN$L`r@O*utRa zl>C|#F(-&DLoSlvv2bTN7GhIvexORU^l~Arf{(-F;FnN(sx(P2)gF*u?gXd8G?aeg ztJ-=?^c~o`{*&Q!;w9%9Q2B8STk<`M1lEjA_WOt&`C-F8Lzi-Go%vErNhhY3vMdEe zIRV<0qGq+SGoE>}tweeCHPgv9t%E^OnkC!yVYeXe44zTXF&l0H&xGyZ*-+1R4wMX( zPs#Tgmk_6XIiKywHOatM;92|oj2t3Rx3h`BN@i6?26{&%-N?vht)giiof;b|LR_}I zBt)g(T{Ku`AY;E5=m$a2Gbi<v=QsVl0O~Rq!uF8g**m6-U;+CV!!*1U4uF@zk+2Td zz$>8oeHTG=(7Os^E3KdQG`N`kbK!MRGQS=wZ*E{q+6&5p<qc)V8=*wGfPWy%mv5^l zMhhoOpkc_i7opJ%7EYAWly-LD?BuG6D)t%ebjDQ|t*@EVr9nCr1f^9n-2nCq;+FDk z(yd#dl7A~y*}nsJhj+qqxD4tU?}m~E<B03a0)=nMu`%$dda~$}Z99EV3`4doWGClx zC|>*&w}7~~?Uah<6E~5K*K<sGteH5{4eO4ZMJb)+=uQhvtb|)gq`OBjMU^pI%7=m| zo^`3*^-@t(m7S7~_U)E&e+s2i171NM+92re92(^K$#)_}ji4l`Bo2*EcHg+RBBukx zqXUX6a!!?GQp^F&FVAmZsJHqg<9r2Em*aQrPtsa7;ukJ?%33Fb3Z6cG;$s}S#GR-c zRYfPdju1WDWa6@)t-eoI=S0Do)Enr9^sh62&ky1|(N>ersIR;W+#4PV_l49y-hNQ! z?g01>OvCl~Z4an^MD?BP-HiH9)b^#F>r4Cx!&#8$we{==K-#0$ck&h-%s%Z#>r4L< z4rTv4co^J)G^$U1H%LFQe+WDh7DKh^XTf8ja;_A90n6Yn_*VFXwzl9HxS0K8A!Bo_ zkNtKyfqk`ctKbT#J^;p+Sl_zxh5FFn5vosJYqzQoU?w~TDm$jZ+o0O~kHFL6ddQV$ zweM!mhTF4$ChQ8;_8$SyhQ;t)SO(`ol~eM;%Jc3#d$R4*nK;#1yTYT}@P`Y5ZR=vT z4gGg7J=f7-j?WjgH_KA0G#8AQ@~~7orOH%BVdd-24QiOUvPvV`xzvTtB6lvyvu4f4 z9E@GH+zqm99^Ky+YdvH1yBhnUOjGQK<0@lL)oP9{V+(`iCH+=qcw-Q`5cx`mmqHw3 zo9m>MUdg`7!6LXXq(8<#1YQlL|JT71cr#QvxE;=b>YKR@(pL5FfOo;Wp!#NBfa;rR zPCC>#qjt|DQ03!sD4$GyG|JCspzQcK{!aQ_D~VH@SHNR(<a@&BD(2KMNL)b(h7!qe zBz&&PM8#xkRxb3#BJl@WB{k{5`7S=wO306{5py_FL}pckaUIbJ9<}xey67MnB!X`R zxcBU7;@pkg?4N$oIrcRn`<-lb+~P{#3ZwJFkE0BaVgef+y5dQlk*t$C^AdR@`KzBy z;-_tC<DFiGyR-i$JP=~Xto`~9Je>V^VJZ9wUIjmfpTJLG9{2eaV)v|nY$RO8ehvHr z&V^sX<?w6x1pEeaO>Z@nF8lzcGn`k?M{S5LlOORX`d_pror!!@DMc8vRc6arAISiH zp?%22k%ex_xOyf;m9@`h66!UJC^t&h{Mkso(!?j#OFl$_&S!IT$n5krX<fJI)U|1y z%vDA|qt&$5Yr(HA^g&3I+@HFWR4S>8QmMEqX4EyKic+$;DypZZICCvch{Ik<LCd4q zP(kZC2|7*6;}W8Ex<Zw;Hi_!eFetC3v(m+>LHuv%hVuV+xDEUR?gIaWs@MO5d&9q> z>|Dc!Zf-;)DEqcPlt}1z_NPJmPyB}<<0||H+@mSP2k<t6m2hLIdpC#bhi?VzpytD2 zLv0=${oEd7er>(Vt>C@vZw;42{8t}a=%pa#%;v+r4fEKS&bNbK!5yK-cI*VXhRuiD z8}7>fi4Y&bp9bkC_b-6?P-8o~z^ftSKy1z8J>ZS(^IQKmxDUJ^9tfX+J>V;_7yK0V zhVm;4;ji!zsIt`;stn2}T3cJBI7b=O9L)dZwut7INrwhQC4UH1TjVg<9kPz7wMBRr zVQrBkp=7a)t!ttmYc6rR)@-(tda~$-9D<Il6eols+Z5$!E~{i0aP~SoveZax&WT|W z4n3H@?PX_peWezjTE40eR64_;bgOJNg({;8FY%mu7RCg*`T*v!{|4*?--7$Ww_!DW z2dbawT{sKA4<!fs4ozMK=ykG>0X?%iA3gL&=8%`hs@kZub@+J_TAF*g2err4i`hb= zoMo|#1TO(){5TLu$yM&j=B=7PlBD~!I-2bY*^L$Tx=KR`l5}h6&d<>TI)a0E%?e7a zo;B9ht|X<1avA5^I`LMG@@o}a7$i64*H%Ql8$?omt^Q`7fW4ns1$W}umr$wv4)%rg z-TJ4%A0T}f`ewF$)B0!lDf_>`ElBBakam*yJ1l~lf2AkD4*U4;-g<B;Yz&`;O&~sk z&BIy&88c?@_cn!Uw>O8oK+VU}d@aqtDuA0q^-s5f(t|Cb%GZ@#BU!#Qe@i-gIvkZl zU!tnMn3KZLB>cluA8CAom8<H@#^~d$mMvAB8q=Zdw!R!ttEZKLDb7q}U<ab&85nm1 zHzmO%I8IPr_k!^{RMlXbIHx{ZXfiDG?t-?eb++<7$LZ>>B1n0q>S3{u-`FSqMK*#i zIS9I&MEzj(SDs$NN#l_|LBGj33W?uj`p_o3v+XC!Bk87kL*(Zx<dLV!H_gM@0=9!) z;m+_txGNk8J3@&mA6CH5P|58Ar@`*<9JnXc!|w(4&SXFM4BQ{;X?sAmM|wl)@<Fg8 zEQDR*AyD-?Q>gsDupb-*2f}hV2ucFO;B+_~%2z!as@~VUo@J2tJvPs06vUskc|Q0g zUOD^tBHmco5Lt|e&EN#M736)izYRPNc7v1P0Lc4ke-Jzo9s@Q1=U6xuR>G6v6nF|$ z8StUX%IEx@te1-scuS5Q4oh>Cm8^FP%Q-O&+2uv*Dv>(na@JCDZxR>p7n7!_1UT)A zb$ChT+>bLIUh)~!QM@ykQtx=5lfB(58<V>$EI;}&g~d&J%#;A@l*+skbOkLlPOTvN ztvR*X#Y*k9XOJdAA5trZ?up!(=b$#)nnM}4)kfIy@$g{Ovud95=y$H>sj*SjGU@Tc z`FA5!jP4ME%JAgqN1DCuS{Z>jOKLRe$IUuiz-d8IFLM2F66dT~taH|NiMm*9P%A0( z=EkCRS;dVbE_l>h&2U!SOyZJuswz4!v{O36{W7?PYR{=r<TxchOj4#f@*XE>t`tEJ zzZklUR9NFdT^YfC^iC;Q70$h{c+=&Qe(y=wWpjq}_p?F#X_O7={~V}#@*JqPz+5;I zo(F57=EmIyH8<`psJU@p!HZ#Qv|%AsJ$MD|2NyxrhgU(>hu1*WRo6lKPrU0PZE5dD z_z}Db=8>i)usggJrlID_mBTyX32+&l1Mh~nL&m1qcdM7fjcEHk1hH2(SME%xIdaU` zvpI5)!zbB)13m>;!51KNlf0Lp*1LHXj)kv5=DB#U!%HE*@$Z0d!sp;Sa0Pr1{tn-V zyP>3-Gbd&J1eU{<a3cH+PKVsnKL=_K-9q>kd;n_B+%xc7xCJkKzJsIS_i!oHoH?ym z!<ZYtF)s;zg1f^%U=R2g90vb}r@%&yX!F4J;Uc&Jycue4+!JsU_zq-^V*eY+*d2d& z^h|T%4uhM)5ikX(z#ZT+*dDHc%!jl&e7nQ;8&Vg+a>zGX{A$=0&V}9KwNUfDUVsJg zRk$~N9qt2Hzyo0`^s^`22ljzIq2_xHfQ3-wzWYMiYR&(WO@ANVNsbfFBR^VmY#UhC zhCf^g`bN9iIx{R{S;dz<CNM|Cyk^<oFz|R`z!i#*v^#K23F}J8vnl2b*PUg4w7SU3 ziAwfu=v0}46dRwt)yI-_YIB|HqBJ@K`>iik#9tXlZj?%WyXbVct{J;=w@Sb45S@}$ zBczFTR?sb~P!R3AUNk+bJMP?RnKOybB`(vQks>Z>;v`vjUTEUfx!_^~6Q}AfKZ?xJ z+d}hE-Kh$C&_d{v<EF)Ae5dc+Np`04S9WY4_UJ#eFa&*2!iT~X90p~_7<*=Y8uZuO zyWA33O8iL3yGpMV@-9+S(EY367<e;07A}X_0$Z13Jp7G)=5W|Ido_3N1nyl8XF$es z`g7n!cmbRQFM(5_9?*yP!D&!F&~!+Di#G$x&(|C}`8Knmd>PH9tA=O66XCgVCOi+G z0q4W{@B(-@ya+xIFNW%?SO{r*c-St#DZCtR59?q@cm?bR7eV|(?;1D&E{3J>CO8f* zfpg$3Z~^4~hW`M(13m|r!I$BE@FVyD#HM)<LTsA%5d0NB46#w(WAI<_3D}5y)SNnO zk@qxY-mUj6RJnZ)TKk4)NtW-EDF5=0YvJg%mG6-i6G|A>uQ%^=IX?_i`XB@y;dSgL zO7mi(a+T(##HZL|r8%SFVcBz~d8jU7r$(hYyGL4I%*oMAQh6Q}{WiR&6_8@01Fyzh zj}Fm(ru=q`ewr!2Y2uRQw_kMLct*P@WwH+0C3@c|CMeN5tydJO5B#W%507GUl<}*m z*3Kmx2`b~|(YX~_Zr(AJhQKS46{_Mi_oVibH#3hJ=c}r^?09qalFs4)uA+HVglzvx zwm0&xvb;zgkOd3765_t+a;~$K>WQF4`7qP+?H2qbToZ`8G78dB*{Es6P^VgW6`hve zz6N)Kufv}39jKm<cVP)!0gs0tLaE`$P_4~RAn*LWm2f#+1)qeU!x!N<@FVyw^pL}M zFdu#o4~DCuY}SuZHtQ#-_S(<zV)zS`t-_zNHD~^SdY|wo{1^NS(wFKrT%UF*Yy`)` z#;^u%0M+i=7%Id0){cFPvo&1A{$}td*aj-6w}Y=k-ig}xgi>%vY(pNTZR@pzd&Bnd z0N4T2M)h`v#c&shpX%)j@iRTX<zu!8Kg`GP@^*)tBl~=)yy*;gfn8uH*d1z&@}96i z+zZP0<2!HmK6f8@JNx^>PvCy=SGYgi5gj`K>YH$Bcr5G*t6?7~9qbElhyCCukndCa zf58E8H+;E4a8GzB+!qdkz2H#T58_Aq#qcnAHar|&35Ua%;gRrN$U9{J6L=K-93BmS zfW`1HI1;Xpk5>wtLe`q_+rY7K4>%5LO~dg}zT*VA1XjXFAY%jk@8NN9{U+3Tusf`U zd%{WZKsXs{{f8;=P<RqN9{TWXI1SE&GvFg|CVU#620wtO!>{2i_!FEBe}`wmO(}%< z&Hm1CKI{yUv41FB0FQ<j!x<32+I-JCcpm$UU>&>~sxV&*m&2Rj`|xJ?DO?JFhquB8 zl;7LnrjR_e^(O9uDfaJ%JHdNk0lXjfh7Z7@@F6$?J`Ahi<4|?g6Hs-U{Eg&$-BHBp zz2ebqW7brsWyaE}$_WD!3PVtxrP)uscq=3-Qx`ExrPO_&Gex|s`C=X4#I0tNRS$#G zCwr!wsp3$0j^|ODpNC5FOE3?<40nXD!tU@js6N#<pq}qdC^>w{mh9`kpSVrg?qVxn zlN_QB%rs|(p}rVYhsMMZ4c4JZ@X2?3Q@&<7WcSqMsMd<Ox@vfWss`mq?y8~Q_)a~e zWZ4|fVN-Y?ndrGcfLp?kp=5~Nu<u~4gsO}`gSzV%kU3@EH?R_Z2Ty?C!&BjEsB8ZK z)d%<^ycGTn)sFuSO2)rK<;A+*Sykl7i~sa@R$gN#(*{t<XFXYaXSF_*UN(m1un9aC zZU`lduh^3Pgr8CWDSw#P;vHL07JFompG$LM7_!w;nj*Dyo=v8oa5!=6>?hQZJ91)B zj-#Owspx{)<B`uM{!r3O$k`Bc4p05Lrg~QCXA6Ef-+oTrhHUiwg>YwhFdP8;!lNMd zm5o0h0Iz3%Ap8Oz3fpkK!I1G{-Y}>%v0jm13Xg(U!J{GLXS`#e-u1GMk^cc?tzTa< zr!U0vra6BnZRd`}$quF9*c^FdCH=qIb}BEFwaJWZM_e+0lq7eaYjmfgbDV=NpSnX7 z7mfmub#PaTjb|XPzPXmI_H`r(l85qd6ZYlwD^wsq$%r)r%m*C{mDX`kIyD}uy*vS) z2w7X%*5hHSvdurOfv*xzlgRr0j)&WDpA(?uej-%aQ6494`YpsscW!{=)|5a0%{Dz( z{;21rwVr{^4JdK-;6Eu>IwzAynS7Jkch~!`<(mqmMB#oLy)sf$!s?6fU>GDn<>%H! zd=f<Z$Xha<26dh3usxgscY`yb^7B;K1D+0LcxJ)5@C^7OJPW=J@h|-k;avD7JQw}| z=fU;3|9rSLya0BF3*d3^BB=LTmp~sbgnAcrIaGg09aI|wzt!3pi{L``uZGt`)+O_$ z7uQ1R&${ZN@j3M8KfNBhiDy$@-3*odB~Ui>R@fch2Fu|cQ1#HAP_lRixg_hMRkR;; zt&iY@da@|Uu7`>_F$^+RLBLCtI#;oqG+&d6i`PTyosinQ^D1ii4v5^SZbUiFRqw=@ z>dJ{#?)6fBbl@M%mr*~EY&$_+9=)R9TJh5CaP=1yMA4ZQecip?P-`WzUv!RMqnJOI z>AA=h)^v25+WYZ#{);4KBZ?RyT$|I~gVCsp7#jVOQCsmJHsMFl@MD4!J3Kls)1MGl zvsSKE7Q&#sRJra%#LOU`wdhS(Hi6p`-wN&pTSNJKo5N?|7Epc)?Kr;$zugLM54VPT z55rpaR?fDE>UT^*$+{i<9PR}5z^rv|-*w*&YHSnl6#T(FPd+>fc81enS9l)m2JeEj z8+|=@0pwkX$6ERRdW~os!wxVF>Eri!H{sJ~@AZM>U?HS$)H@i?gni+SkTv%Gm*4>S z8ypC?Lq3Dx4)9P&``;T5X}5c<#qZPp^+rJ2pWe}s_M}$?Z-m8=_J~&kUx8)t9Y{OZ zUjZwi%FwY;WlitBlYT`R@=%>w1S@ltwf_mfLZvIkJ?oXO?AHTP3CUH@NfDJ?S7<Yf z<-2QUibJM83p?<eM|b`wKF2c74ufPRT~_^iV-Q(|Y$d<rp!&V4VLQlo6U^tRg;q@A zb;O?lm%}M=H}YdDRKL_oa09MQ--O=+`mhz84!4Cfp~lFZ3ipMl!=Z2%)C-2$a0EOP zDlg|i<@w26JL#)1j>qilkFaV@dHxT4mE3QQ265Ma(jt`>WK3zy#!3qkmQ8kYZJtev zd&bSY?4>G$8D#dr2Da3m6eeTkox)^Hd`4jk_?c6p|C++A#o3YXT0lO8LGqU#Nl#QJ z70x5SROiiu%98o8Jv<-E*SQdOhYMg2co7^7FNPZT!WyQwF5%_yMfR_N??K*++FIRL z!$#ceS}31pG1Pm->tJ8faswO&Z-hrf`o?TM+FRjt_HTn4XTln({^f8PyawI_)!%t9 zTmtWhdROxRycg29=061=gD=6yq54Cgf{Y9Fo`x&nvrxAAdH5ZC0ZKplp2!+~Cbjt` zv-8=G%b~~rNj{U(sywHQ(d)&g@H)??^uGa>{5PR|rgxz7`dv5=z7O?`A3&Aqui27i z`XH{YYcZbJtF9-D&i`W*hx53neH&{`ZMpd*YG}F0%+&i7aiO7(I~HdXe~T*sYi+!9 zn#xceTNw1bl4lDd<_D2&nmBo~www7C+rm9L#u{(deow)t*l!EpfO)VNx8D)UzvtUD z_MN0%p^}vkABA0DBkt7|YJI(KaBoQeuzdr#07~wALFJEpmE=0|XA`G-LgUzLa^=te zL`9pc;#8ar&qOvFh*1ZN(iG;A&Phe*WNc%mGX1YL1l=oc=Nod_Fi0lKL+S0zAo2iY zC^@B}>QnmMtv>AmrCL3q+I+p>wXiqT*qnpmcJL6G2m8S;Z~)vF4uV4=efGZm(4kOy zF$^ltcINM-Z}cm1N*nV}yxKM9SyWM~G7Ez$pCIJ!uU73>$QiNMubGCrejTsQvWHV- zI(7eh^HS-}>Lyp2l&|AdrGEQ;g?<qP$x3;te%)7tIL6kPeLD(De5|Etby^WromLF@ zfhBM;90@n$I-{Zd{4r4dJQYx5HCb=l`q#$6-t13+!(b)U7|r9L-uczQM_?_~9E*wY zSvU#40w+V(`teSLYA-PM$L3<51etT>oeY)dr$Fh3e7&T-jn_RBbLqzaVdW!RIfyL` zx$2%%c{b_xX;8^O9jfk`4ORD?303!;1y%R(Zp&mLA2zwxm-;hwt*hCNuP=)(naK{# zIU@}9i%5z?G0#!z*MX?@>|KWSBd>kcj^Q{=S(6+1v1C!q76zqNdb%MT8brRqvnl;= zLM8t#m<Qj5o#6X$Kgjz#d(ZG8T*UszP|y4cl%8n3a8geg!)CH!%$qkUmu#{I-^Oz- zTRtl4#oQxq78F-bT)Z<wb|q5<$GqxLntHIP!j@B<imsa7vpxtZUCI*?LXX`2HfopY z*ZCZF(GzT#M>^V%dMUa^QJI>gAc{-&QXI{Z83>D@>&sVi_9x!i;QI4d*;(#C$yxcj z6}#^S@n4WH%Gd9pbo+Za0R8}vf<MBi;LlM0z%Nk#z#mZlz+X@jXt1H1)71z*!G2@d zjeBhXuYgTpGw$CMwt*YL{op20<BgiZ8rU4_(ON>rntGeVdtn>60&Wd8UUM7xHQXLb zZ&FbDmFC{bvRBOgn{w<(I60So{e$W$KC!WnzNneIVVCAMvEnJEND-CC#**0@DI9iZ zsnojY3D#_rzv1>Xb=Ml2Xw5k_?uO`*Vt241JljNZVH1rAFRS!R+f@weRb8?N9&!wW z<R`sRKh%#wWC!FeneraqZv}UODaiYHtGBwsVeEH@6W|{39k?ef<k|&r5!@Tz1owe@ z@3TKty>uW{+p7os81{miBXAIGNLmhtn)7!ERR2{!D8I8m+yV}U?corpc{IbI#uFa~ z)9`SpHXYxa@cY9NkU4GMF;IF^1f@?mbI$`3^VT#Tt~JL-!xM7pljWcWmc|C274w5I zWScGJautW1Utz;YWuYb$RnPO$xjqL{Y{AI0we}IDInU*9q<nIeWNut^M%n5QNt11n zn#OglAo^v-Q1y%A!U1HNt_f*h?y+L2=vO&js^7!G#bg6Pk30y*`YEKj!-;b0EQxha zey>*bOc<13(%)T(I4X!AP5vqm$3T@8#w^>s?Fx7X`^UnCuo5nURq%Sqm}Xn=u?8xU zli{=Q1h^7TfkU{*RJa_T4CP;)0_9KnQ2x|3_#K=HrH7}((Qp>5g0tZ)cqW_;&xQ-& zTqwaXp2fcd&Vvuai{N|kV)zMM2)~AxLguD<m%;UsLmg}duYg;_MUeSM-qo-pycTL4 z=wjF#UI#VS>IOIj-ULTN#?ScD|68ESiDZ^+&uQF(+9@fv6W3TyGB0FxUKr{Zk$eut zOsmv5ql_6fj<uuoi!dlH(gBieeM*YIi?l0!%U}xL9X!iz{GDv)EFw<z<fUv=*7z*{ zpdyhvr@2V%QP$Ybk)EeGH%re$C&iWDc#A`JdoEiTlx97%(jB%PALJRezZ|L^@+jN^ zJ_dJ!Pr}~tX*du*1CN5w!E(rVcx(<hWB6^H$xCn=@h`&}kTLx>Pm(eHHqPV?DE+vR zE$R2g+Xqu~$@D+GeefR7CRx4@mHZE&e5j9Lcla?>`+zZJ);?GXC5!9Wl0HhjeQ;8J zS#<s1Y9Ac+Z?+FQHFdJchf02Dn5XB2o!}l&?Snm`@_jET{bY`ZwGZ}%l1;901JAGL zbeK6i-pRRS^B>zj*qPFovwaXw?lb>gc1p6MLjU*M2hrO_*PdI!^}-<e$qvN(9eN;d z>24vE&K?Zq_xFV=@BQFYkU2Nz_YZ{f`<Z)Ve*ZA2Cp!XaEr+9^{QhI0{C>X4V17Sy z&CKr~3FY^Xg7W*zp#1*PP=0?ol;3|WoDauB=5~1#Aal9AO87XehSGx?D1F(MdnU_L zOYSe<bYpl*E`9m;%yhOhpOu61lJeM;gQ}SRSDg8*qPj+Bo>Zw`Sk4v($w&II84<S! zkyDVTWX3l%%%5l6x}RcyCR9JvX>b^v1?A750p-unhVtjng!1Rlg7W9jhVtj<!Uy4b zQ2H?+z6&papTP^E`jHmEzaZc2urcPBLiHzK4wa8}Q2Bi!=Oq1c=0%%7z5_Jl!+C^Y zo>%9tnTcNir~dfb9PdmMUUNbIspDP9Q#v<b&5n0Eb51ZxBNfH0!SU8RTtet&J3TWm zyK63QJhD8}vq9uf7?dy4Gx-&=9SYZykMg_uCX4yq*TLP{zaE|eZ-DZ<m%>Hx7AU{_ zHh3$%9m?;%8_Ms#2g>i}+b-sJ-w)+?KM3V_FNd$fhoIV%4@1qndJOg^ZBIbGCwUqU zgU>=e|MO7uu3mssA>Rx1FNUwfE8v^(diWN+6TS@}hVMc>^LtQpZa;t@zz^Z)@MHKh z`~)^cKA*xy@H5yPehxK1>nkXI{u)Z}C7ZSR*VA&@IrEDD@BHf@NW1*&A7Kjq6g<ni z{Ojp!e3pODaIe$9&eHJzcmDMsJfrH>KcVVd7DYGzx&c%<Xawb7H--b@22l0whEV=> zQ#c831W$mQz-h1<oB{b(k@?pxq1qy?p!8#1{`HJpGW`$tueapcB+IR!lD{>Sud*GK zf4x1Ff87?I5A&d8p}&(pf$A*PZ<6uM`m*R&R9ZP<T^|(4(R7otq_|{J+-(ju=)C6g z2*#I<uVnIJtX(>YAA~{alD*gfsuEB*hv!gQ=R(=ab73Bw4`nOQhdtm0P|tHA)N?=1 zmi*r6OT<ZL8Y^~cuIDbBP&2XGJ$W(bgrQ0Jho@y=^yF2<xW}|EDy`cvnJ8EPs1w}{ z6>{VMe2!#2z7}1`k51QAKFt|a@4TM6mW^*O*~dRJbA9z}VbF6(PLhkti^63*x1Q~C zD1E4dYGW*dec{zm=Uxlz;9__UydJ79xe00>-OW()yN)fXH>zu-gYuJ3%O$^Pkt#Af z3iYLz;#jQ7AF9Ydes7bdU@={a%SdTW%IJ2UP3gY_D*1Op>C)Y>6TBBnX7@q0%kGDg z(F0I2S`PK>4?)RDeND-BJntaMNqm2JdM+7dwa?~qW*D;NByFhUP^z)CAu}mrF>&$t zH=*$K9MNl<t@v?AB3z{OF<fG#{+cN9@f8fV^{&MsAgG?`7F|N`W)3T<=JSm88fo$0 zpT_TBa=%x)_KkjDS~hy%=+Wjy6-1GIUS1cJE0~TVCsgve9XmOGVa*0ti-@3>$MEQM zC9FqDO_?QYXcS#xR~;1XBZ9&D=46feY=y)-xpJ%QmsnqN=%GgZ=lWVzVw@01>L%*E zEsml_vGkMk_p;Y!xrD^tw?3!I6L*HeT|<c-Ho-0BS{q%)Em~5}zDv`D(kf2|r7Aju z)c5Bj#(XL_d&QaIi28R#PEg9GMn9OyO%&rtF=Hy?uft*=qFBu-D_oZGm%T%`a<dnI z%U4u*0)3ZGKL@+O=i!m?MK~6|1mA=&L%nBz9i9UD2B3{+{{Svw|05{%_yn>}q4z1A z2UkLMMt%-k!!O{z@GIB{@?B|v0{j+EhCe`Q!%vX4R=i)~mGBSvAp8@uwutvP97<+3 z*w~G)Z3vn3?=^zT<i>DwGHL_Z3G%H%zX#k1YVPVLuogCh%%Aj{Lye<t0dIkuL1pw7 zP~&O0gc?t~4g3{u3zetaL*^8Cc~I+?>;T_{?V<8-C&<`dkMGd?jO+7ug$p6yO!Oax zyF<pgd7a?Turt)8!>(`_*c}drd%(kC0b~q?w-1yZ+84@Roxzs$n^VN89@&m<RxW#$ z@S8a;3S2r2LA@xuAG7Q#+PbEz7jyPYr^7426q{@|qNDC{p$BPK`g+3Fuov709t4%< zLKr?<vY)yg$2VeA={sYM&ldU7oE3$2KAP;KJsSC!HE}XlAEl$qxqkNKvkf5aO5Z@Z z85|5#a0pbIheAEu>1@e*CZ9O{RzA?|T+f!}&vH@}az9#PA%9&lxsbm-ne0VjbS=ib z@wc7}F|Z!D3rCV}rELV%a~%!a!Xl_@sRSzBBcYzJGd7`T;=N)uam_e34xX9o`AnPi zUJ)A}f47+8M`5V{s7kIgvu4nxpan!F6;#GkKX&ozhENP9BaFdc({G6gVlp*Myxw}5 z<MPT0>c>#=aCdj(iS=B{=-_p@-DG3-!`r&og;Mt*fl-YU&52sf!7xZ>$_v@*g+XLF zGL{@GU^yHQtKbBvwpA5871ltdbRxVO9uFUYlVB^ZI~i*1@f5fRoC?$MBsdtJ43B|6 zEQ8bFv2X@d9?pcyYmK$*lgR7iiBlS@;GDJQwet@CPqJH8GHJ|Ycg`yLb<S8rhD(F$ zXRaRCWv(jisQaki_*KbBd8;(cXH%GsOeME7q4M?|sJxvEmAB_X<?Z=UiMkLfZx_J( z;6+elPZvVXW4jc#hnGRkm$@A71FwJ;@JcuVUImp`S3~7#8~#qN#XpcZrR`vNR<1m? zk7(ioR+OOB|Li+3v4X4IDB$u=birkMY65@#qAORFQ!_b-C!3=@$II;!P7ktCzgGHP zISqW)WMQtKw_#4oUe>XNL2^mv;|<7Bvbqr}AD2qL@D`|iybUTJ?}SR#GN^pK8!8{~ zfy&4Gq4MzosC;}7Dj%0a<>SM!2Ydt`1RsOSpU0u{QRO<huF!nq)OVw?w`b?dN3+9- zC0HU?IXQ^)!_XxBBWgPr6BF|h!a->+YNEBL<>N~Lfz=CFPt`X#Cr8mirqhIQpNv;V zNhMrH1&s(9>3yTfOyfcsm`{9Yjpe9!VBd{9sjYSC&?Qr`SW8?pZ?6`za0(A?&a<#8 zvU{&E%SGD%lAH2b`8qX-e;zqYmM_2^;EPc26JCaW;hS&>d<)9Ieg{4Q--WW9@54Uu zV<_9Y5*`OXgLB{)Q2F#FRDOE=-6LUZPbIDuhvc81v-bR~L53w0$GOs(*7br=KTnn8 zu{;giXgTt)m@~5qZC3s%OX}sHTtOF^oqx)&F#mGqlyXMp&u0sRo?rR02@$nH<Z9$4 znfw5^g+Ic5;P0>}`~&ufe?j#t{0(>FI$XrofNcm>2R4GT(;L7O;f7FhZVHtjzpy3! zxUD#@K8e<FZm#?Y)ZBfmQF0DL{ah&KP%IZDlX9Z6`koXi!DV`{I(I`!<11cQSXY#? zBFMjJ%)g3PT;ge+V-9d^YFvuQuozi^iTuX790`M-Tlt`8pBY3pM^4&r0aZ>~LY0$N zuoG+z4}@F7qu^F>6x;?L2e*ai!0q8zFa>{yZQ;LQ9^91swu6#)d#HRF!QcBO%8BO4 zsl71>o|`LQLc6E>%Vkb6r-z|_=2USgkvWrz%E}y-8=uHbxv?rOXP(J!=E|eAes6hF ze|5v0r6gYO)gg(qxBx-t_JetB`dU-efm29CRD#0}oI%l<nKBwyf#%CB=7cavw#xgs zpW0D*!U?-Uwd;0=($h{*1|T2yf!$yU><-J}o=_>?3w{LmhN@%tftur+hE2IwZ@4|| z19yXkunRmG>YZ0#sJ!k6r4tL;l6B#$#HlU%JllD>bV5y$pp~mnw5Tp@&beV|68>Rz zp$c7!n6N-)w=ile-Kv=SiIaAwg%R2{J%1RKHpw*JCwwT+qW!_}csK-}3=e~I;Neiu zc?6VQI}$z#N5H4y(NNEN43tbX*CJU??jlb4b_<-BOD1ZEhH`P`B+cnz$QDUBywRDD zptg10eW8@3mc{%!tK5WoUC*dl0SO9&<lB*728E0Kk#o=?ipj_~ULtPh_zE_HE>Hm7 z1+v}sdj7iPqWoyV59aIFgfiqPS&fF$@o`Wo8V@gmmGE|01@DE`a0RS|-MQW*sCUXI zLU|xlU?rRiPl6{y)&Hl!dC-T8;dH3{nE{oLU$dnX_O6uUN}Jkn^VgJ*LGw#0{=b@) zl6)pB`Lw&$SeeYMunyC#tc+S`&ONjI@p-;5=y{btn-EbOM9xM&lEIl!`ExEj6V8Lz z!1?edcmY)YTnOKS7eV>X7sFog5-7iVAv^+J1|`?aq2#Z1-jn4>>kn_iG3LQ~=jW1t z;0Ks}al-dGJq-2B(OeEC>YD{bWtAH_)OAEg=3JFomP6K!qj_vm4G=oclG(rpuAg0n z!kv^c{yI+?5-+zY_Om>LctP8YVtO5dA*eW~VODXLZ5U2uXbgic?#YU>5-zpSNkgNP zO4UQJl`6_JQEusqVj^71=xkR~tD-Z;npr4}_A_QdR~nazcgqeBiXuv75!5d27e(>g zm>y=WL9V(c49a`y;z3083gWLpSELWuLiJ-VhP~ku*dH#1deU3rL-01ZJL0<oYX0J# zuqRvw4}o_>`KI?m*^2w1#QiY56Fv{0gfGCi;Y(2U;>%EDL0*9x)A1VA{Os4^ckoTf zcR#$h;CAcLR)Ia>d+=cR0X!V8fH%Sq;bZV4sI_uGhIw?XeFF30r;zoqy_GNxzkr9q zuV5|w8nUjh_bp_dUhjK&6I=~%g+Ia#*5};-Ou?UFd-xkvAOG+05cn4y3jc=3z<<GF z*q|9>wO~W|2y6tOgpJ|ra3jcia^A-9U$7Y*gZ^y_rH9SoDX;}(y&<n9WL+Vz6}%9( zfp@?y;oER)xC(9y_d^f1gNMNsWGx7<EoAP#mj|_G`3{h|_}-52ZrB0JX6yoGTlC&G zxjxRZ#I<89WxJpa|GB`JFjdZO@ZN-y@$SX96gmvqRz)6XF^AlHS}l@LWOZVubZM5a zieQSf4#m3*mQql8mW^QDETRStv3tervI<)mlvb4mPL2ALhw*Gm|6y=<csSe>9tjVD zN5O&cXeb$c#g=@}aXWEpTc|$2FiQq<Gm0p?TJ|tAvUts6&;u58m6&l=?}4P?BvVyc zF`>4s+TK*=6I)K3a$tkt4(=<Bdg7nAR&-U3q)}sHlZ+B#OB0o4veo-=1Ca__P)X(T z1@)|wVN<AflENrtqvtP$YFm}T9pPvwS&o59RRtUj$H8OZcz6P=gp%DvC>bwhOUhVz zr+Z4z7OYvu(dd#i=Y^q3_=ow%lCg3iCS$dYQbZ-BsWUqeotP0Lxo62Ol#{L+2BlYW zqWDDPO-|(b^bAvAYd96Qg(tx-(1*j}G^ppC4keEd*pfb#>~u4>gV-)wvplTDkQtel z=Ik)6Qz~*{m7Kt-)hG09`OY;+ONuJd)Ym=9Fs6G_vtB_ewhGkDe5k@8Qqc1y%jzuT zp=Uk=>XB!|_V7%&2Rs`}9_PSNZpksMD$CN<gV`=#huosKcWF)z!#c&Lw|6Esvq-UJ zPyajQ)+b2DHfxfbo-Zl4^O1+1`2wi&c_CE!TmV%*FM*QBLMXYZKR4OuK7}}mYa+Zn zBRA`5*Xypp)K`~{s;n+uN1yw)fu=YwDfa7;WsH<%*}ZsM2tTJNbBY<hw9>&gut799 zT-AWoXBPS}utAUtx%R{b=jMLX7Izc(=GnUG2P#_GZ`5=t<-EIXI0{&DXv;=IqA?J3 z*sdmOF<TfUyH)(UB@t>9D_q{d>2Mv~p8YG}PVg$IG+YDKU(1jgTcZwt%GM>g5#B~T zW53NeyBR*q{t~G6!mV&6ybX5XzPCg5=i-Oi`;}#|hW&e>^73A&JlAi!C)#a45+{B6 zhV6<>o>%h;QY^u^N<OK{2R+u&6%p3iDydrIV_Y@YjQj7ID;2p9y~~K49iClTZTHZq zqXObnY|39!V2zfM<I3!E%A18GkxGv*hOoZ;<XX*$R5o%XYAHC!K>6b<ItY4B<<BOt zHi-Khx#-#d1@j<Z)w6!{^<fqJjo~D?0h|JvBkP|AnIr2z4jD`DzXCUbvfs_1e23;x z@?>2tll#y7oouglB42dxo#B-kxyzv%RbIi6KDYir=nJg9D=3HjWuZE7{h<A10<%}v z5|^Z3jiw?=r0t~c_H*4^S;-HAa^Ykje7QhbrfhL{$@;N*7WLn2=(&{-vhh=ORYD3m zNfzy4TgccR>$~d!OW0@5vGvt;gwL=~|C|33WK@^`8q9~QApLRv=3JjSGrszV_kikW z-xEsCtY>EVaU_2y#|vmIl+vJn_(j?I;XdkBG@7!2KDzf*X0EJMr1?=8B#Iye16l^L z8><$TQNxLf6%<**Vxpvg0~;i6pj<5HfHO%llff6pWDBLDwT<<wAW~Ud5S?9NMz#a{ z?$YBbE2}aOU@gs5baLfHJkH=1oZ6|<kk1eULvF|0sqLauD<({cPE|Fp)}lhku(~qa z_@;}r|0P@HIoI=K#}s;!7m_#aRm*ec57_wAKCm<Kg|G)a1RetW!$Tq8NU*iJ2f=CV z9|~u|q40W0->~&X4u>kE%s;m^c3G>=`gd7t%vX8j8+U$F(p3aEh9jZ+^hd#M;Aq$v zmP7TK9Sfx!W8wGwUf-3>PuS8YcXz(p5_pv!)&;X<R%}dRmWS~Wp@gA#i{?$ey<03} ze_(?K=Fh*#-wEZBSYyhg9A80HP|B_6V-@>7Hq%u~+)Y(T3!{^=3#s}WhUyp_dQ{24 zV`p}40H?H|o&nKM$~n*<wW0^7wk%Rgsq%1+IDJc~a=a3j$`r8?w&ORmpwsZt71eyP zZCuF-k%p-R%;b2AjTvE-06Xfw)*QbkAK1{qeg#$JbD-*C#=ef%muItwSU&ataQ7b2 zRTbU;_kmEtrG_FMLhq2!JETG&jU+&j;3YkQG?N=h1o6@lL8*##5Tthmq)U^o0@8aI z=}i!j|99`1Gq)t_BjWE}>%D8iXR^<nIaBxSDQ6BIzNtF-<#dh%votaLd#KjTtw*<T z!<qz&dm@t)@%d<EgfWpe5U6DfZU>I}_zwP$>Ib!h3V8ZUkbdc?Ph`*b1F0bTgT25E zFajI^(m3Noa4I+y+yM>)_kp9p{0MI}SQH!sl8y5zNNe<;f&Solkg|LVI1Ky}{1U`_ zIQ$*y>0srY*uw$3gEK)Na5fkQ&H+*PwXeWQ;6ji#sxAWIM_U4J1#u>yIWOjAR)V46 zDsU0F7TgG~2OUsU8^9spMsN+d8QcgW4E`?24iMi~(RP7!cIj@AK3e!aSU5M%^8-V{ z{ooStAc${FXvaZ(3xU5CjC23_Tfw!VB+rw7@G^*V(CNFC=7r!b@HO}=Nb@GQ!DZkb zFc-?`E{Jobw0q!c@FBPjd<;_AJ^^vw0Drp{@4oZ5Yw=#V_5yOeqfFn2Hy6Z!@D+&n zceOu2`i{kGa0rNft7g2nrQy9L^Lj83xD`Ymns<WvK&sYGU~8}h=mC}o$AEah$$SNL z23r<D+XKgfc;Csq3#<l~h0#+T#Cm{M6Wk5reKPY)5a$$_^Pw}Y4+en^z@I=@Fee5S zjp#bq1atwLg55!!YhWG(wgTsa*l%k-2(|?uftbTH=O_aG4myHfU_lV)ADBZyUvLB% z2#y7DKCbyV7y{OFf*uElfjz*JU{A0v8nh8?0fvJ^zz8r$G0Yi&4Z#??4#tDM!9L(f zFacZ!Vjr;iD3}Uf0!`peus`@5%mm$wV~qq11_yvfa3HuE90Yy~egtj>2ZLw9;ou!` z1o#{r1y+O>{urzd;=76FM&NjGAc%8+%``hP5gY~LJzaC5l9;;(CxM@XWzdIw0nP@o zPuaW*oB{q0&IB{jfzAdOgLCORI1fAy&IezBUxUtNFvbAAz=dERa1r<!NZ*K@0j>b& zfh)m9;A-%Da2<FO#QDVLt03MZHrK<<6WX$Q7`O>M18xOxgWrKo%3)p@Tnp|3uYr5$ zI*9j;&BZXGwGV6wVh-2b5&QuR0C8xvIRrcc_5+WDBf%5kMDR3t7CZyGz~Z<J#(~$t zRp1RUHwIfb!Mxxtusrw(><az{&IF%<Pr&D(uQTR#L4WWS*bDpvOaSxcLcV|n!8>3f zFrgCq81O@|7`PlP0e%CP1kZr@?wUDAWpou_QLqB&0Xl=7z{+3>SOxqXtO{-ctASU+ zn&1<#4p_YkY+kS)h;J;JgF(!7n=`>i;ApTZxCzAEw|NJMbE3^R!B$|Qs%W2J6R-^! z26}>hKyUDUumji+^aGcJUBGQ%5O@H@K6rESYB>7`i~~c#5nvej1K10!ULAH7_#tQn zKLR7bPr*oV1{eoY&zk`50h7VP7!;>~pMt62G!S$3=C8qYa1Ds_t<77(Oz<E$0DKL8 z2<EAY_6XJm2ZK$)p<pj?7&r_Z4Nd^Zf?tB4f-}KM;BjyYcmu@RfcX(P4QyQt15R)p zI0L*2&IWVVMmqyLgY&_;;Md@DZ~^!NTnrlOpkD+_gR8)1;5VQdTnD}eH-JUzq8)*5 z;1;kWxD8AKw}X?wo#1?M4|p8h3!Ve_gAVoZP8wJXJO~DYhrs^e5pXzo3>*Xg42}m+ zfMm^_1=oP*z-{0K&=GdZMX(-t32X*l23vtwK|k<1m<HYe`-8uLqrhLmN#I>@3itq= z3ZgG(ySZ(StnZx1LI#zlg@g0SA%6DrPW@bAo&JA2^)v%D{f(!dsv~)gMbgM_M`x!S z*KDym;_r0)!;mXpY}}@-sKgSRsVBB8XG5<4DF4W=L^rAS3cwsT)BP_%s5$=L9GZ*v z8h=wHa^M?9!Js1;4;sJ)U_o#-SP0w>!q(z3cM<R;{w@Yy1B-**@Z1t0ji*b3WM7sB zsT|9I58!VM{@Kqt70pTe*q~$KkNPzE!+cI^cqBe3*e@1ukVf)gDNer#QijQ&94rOm zPZ})IXm}LdVyu#8!XPG*^Ry;}E4j=l!0hJmDK4`OwsZJPG^`=w&K2Mg3IRL_B42n+ zxCY#hxPJrw0<Hrot;6xpKCNvaL-71v)zy}?(wHGUHQFYv@TGnzP5p<N1RBs#>Mcp3 zK^TQ5DvX>W#hY&#oJd@Fh<}tl`j6sapU%yQH^prWNP%qyD}mcU7jQe+0^9+%0(XLx z&eKS9eY>&mYX|XO$2D+`C7s-cRbk>j{YS}>KfN$<l?sz)j?Hk3!o<DliTKR9Z2D<X z6ew$4u7tbAfRH|d9*-q3x-t$|vgQd5BB$U=<ver`f;7tcE4nb-=7Rjh28BgiUn=n( z;=DJ`WnSH1sjgrGQp}38ygA||%1GQn38$vM0df&5vEgC6`kU?-OE<J~unTe%{?Qz2 zVhX(kj6F4oIz%E^@=k$L^iX;-P<b337e6hsI^&86M!W?~vbB(r980R$jv2+_QsWZg zLgR3_mbp`!v(bN4wp4ehHTg>UVbq0=`1=SL1O5yqfycp2@FX}4JOxe$&x3Qoiy-Qm zb_x6*yb7YwHRu#G^$j<`1>h}k7x*i92)qkk0`G$kXtSt?<~AVeIiD@@7#xVdpMn?z z(_UHgUho-+F{1VyJO;i1uYxZ@jFGfgU^P&~9B@4laWP{Iq&a|%!91WF=m^Gx`M?n% z=8nv;@wI{=Y;~;=2-{mL0<HzIpWY1HSHrt6=7S*SCC#vHwUQvUp&yYJdtEUz7wxx( z9sxI&f<ycw<Dw(`%K6}^c=2iNar#BjN>|9HGzwB`O4bK$dS%3m{VlU`aU<)*v>5Df zA>FwUqDg3x^d1rGPO330Ar#f0Upcm0m5B>aGp6B<QanSv=vxWi(H@i7Uu*m!Dm?j% z!<-U}J#EB^(WY>IJk_Jhe7kIx^!Ta}SXW|wbwE6aql7Qaik4qRE8vvjj2rkTX3mjQ zd_B_`6Ca%rW&7sq8q|QD!Z$rD6wc3zQvAh>($@1zR5>yENI&vQQ4%Rj43CYcKE?7f zEa}|6@UH);JZI;IZ4SX^DPN8HMrDll$m?<6fZ_O?`j9km5BM2~wqc$G?gJ^N)ZWk* zv>(Bq2<s@A03HKr4?nfDA>bL1_UfGlu^yzI12=%w{(b<dom~N`ojnApomE2esGU^@ z?|?PIdteig+8HIE+7IpH$%XnG22#7g92B<;%n5P3z?_hVxm5FYklF+0RJc80j)dC- z<}7HRI`8YjUQj->irNL{0JvSe3zov)QDAA1-q|e!_5;g;7>m;xRc4H(wTd9d%vvRI zGl=&a%%{LA;CZkHh%q0nub5wewLy&Sv^pT^v-)5Sl#dG-05%4bz~&&vAX*EM+G%d& zk(*s#cLnm|_=mjJwpiLJ_QUX|mV{(Xp~gmImOMU^>pu2!(E5!Fyz4)!HjDl}+jiO> zeywJI_0><Cc1ngpApBLvKdQX3Tt}Vpmx(1p|I@8C@%PiJ<cnG(VpIlgW;@h?_z9uj zRA^eiw!G2{?Lu@5Y*VD@cYu@+RKN3sQBwX<PO<M{HrN<4nl~idVJ_GnoCi{jzXsn2 z7l2gnX&&)wa50FwtStj6f0u()4tY?A?9Y=JhjOB}H4;2vDF@Dftkxukn~V)zIP1s3 zm;U?ntmm_cvy=t3`q{Yo05S^-j(6K+t2D`&SP74n@K0DKY%!4L5hj2rCCn9LiaT1I zOci4Bj}j3pK|<*&n=U>QW&l|cl=Z?WdY_Bg6Mx$mvkPQ4`&RS~9+pUn6wsnx96XC< zKa$}?-l<uR2%w=sLo@;WsIFyzA|%?Xm1Tw;9v=wLWVV>$S;SWlnNl$jQkfCR7zZc( z$-m+Fe-{cFKYG$AQ0Q68Dr+q(Y}?u5IqaY6!FE(rSNt_e%D;lXqPj5;>;NtV{lUdx zcW?>V8zdW_>fb7mY6<D*$sp<DC*TI~cW@&}^X!{J$`G=ZQ^4=QLEsLM%+g)pG;lXa zaU?yCb$o3<cojSZQXY~1E{Np*47LJKfbBuj<5<JePJ@F$(&w1-XZ=mta}j@^0nzsO z`!(0VoDRIU&-3oT;O~<7oAi29ko39_cpLNwNxx(6l<lZw@FD)jT%m@vnlWd`_7mpN z*iIt7`4aL1$X~LP%7cG^^+65#u^~uyQXokE0_o4ZAn8xCm#E#+K6Cqa`zvIPaP1m+ z@K4%p6K=Ou<@Mj2v|BT7wr{sovuu<owOcCsO8A$h-A;k9GGF-1b{k6f^H?EkyX}o@ z|G3>+Hw|9|fc}eq)HLEi(eCv|Xr-U`vN!P`<ukR5ckn0bE&s?qrM!0nJwfV+{Xptx z6G7@<M}rkWvO}m}MV-;Af~YGRCNaz?bFC&waiV^;6Ic%<yM+4HNRax~exNIu0X71M zgH1tNcWMSM2C1K24q{1=znRev{1Jb*2dVzRUe97D561N>kPiS4+0`E|C86S|&;8#j zkg|=<2-T|3CB;n|+O7gng^7Z=68_m#80r?9LugaINZ1}i6a;*Weu?#WRS2y0H}$%D zd{wVYc}{gu|54hhOp8E3b1U@oLS9jRc!PDo4q!X5BiIG>2R{G<z`<Z3I0EbrUIBZ6 z&?9u7w;6Vy)(b@W(-JN3FX|0;#otjN{!yDY$AK{*l@aPpmc5+!p`%LU8rIjeW0o?4 zjg%G<PjB?lHbdHRfKdq*RD1Z<e}CT6xuB?T354IDs!@_;NW5Sk3aM4`Q6JYEB2j$Q z3H7BNx-?5dVNg3NR)WI7NCdW;IBlyYq&DS8{l7DW)<tFAI=@BgQTypf{hJFYTDw?w zwrZPbd+JB|gKv##G&h$^%FiP|DbFr|mB5Q&L+}dd143VN-*p`f!{0Z+f#6MWFnA06 z6hyn{_p)w-tMT_8a65Pp#CSrx4;}$w|8u!N0-xdUCtyLu<ta!hdIh?JuR+uWvIDvN zG5+R0FE@xV$u{HjMrof^64K=e(pWqnNMmvIbG+xj2zVWT7YC_clmMyzP|n)#1uhC1 z^eNZ#pZ~o6sJ+1Os(!Zhhl-k7i*0qGVtEKD6_@^_XHuD<+ta9V(yt8SNbx8OQYhtQ zoDE2~{kze%k)}fMQx!b^=Wz~CNWcsfS^+kWzn!{I6`kt7GybXCY)no{$W;5nEAyqa z_z%Ph2bAm$NH2UN64_O8l2In4^Ns!EqfBu;Sf}<OWO32)v2k>SmHz%Z>3RJ}c|mzu z7Xlim(yub|j`F7pNPSW@kRDMBbOq~xWTVvugTV%16zBp{9ijbQX0Q?X35fA2zi-$a z{0V=z0B?XTLD(}I>?*e1+Je+)wF66o?LmwW>DzUDCW$B51b=&hKA<-U-Kcc{p&NM* zQUur;f2V@Jpc%xtn8)0K;3xQ-_9D#$gTSR=Fi3qH?MXTSb_WlE?}C@WULe{o??pn} z)q3M^v_&l(L|f#&NQID(QTQ8eMT-VYg0Y}8*axJ#))%C91e-5QoxF^2NT-|yPyBhE z<S~=32LJcLDvy|`fwjjYY#SKO3w4B4?lTmXED!>r924Rbq4~+2u~giM_*hn<&dOH` zD{888wu;(P=bqu3{-d-~oht_c>|Oq)A#W)CCa^k~4mJj9e~l-Y36gFd07in)Tl|je zhu~EF4I7-#HKcJZ)v>|g1#k#>6C4Io9EO9ik+qQ^)v-|^)v1p`^tak4;CmqSp}99W z4(tokz8tcXCV<qpPX<SWpMzh3Uw|~8m<sL$r-4+K(?Kfp@1d;h-y0}ZKrA#7&;CuB z$732xZ0}u((Da|9?m*y9MG9i7z#_1jRrK|5+|*vs#7@wtg}uQ3mPU>2eYil^<klZr z)j!!?Xv-2-LT{SK=2Q8gzbt;KO41>mR4cb5*0!~hCeHUlDm0j~)nO5kzWWhZL^q#d zgdxeYlS-D!G8&~{R3TtNGCdVL<HdIkNe@${aK=A7JxmX#peyqw&UFm9@eL!iPV3hP z#T98K(k1HPt#6W3q-1Jz#3kL-pyY;H{>H9tYF}ij_ErJV?zvQPj3K3#RIA7b5fPdy z$WWd|M6lq%jWkaAB?-kVK}p!6qV2JmaIqQEV+>2{;`F14m_h55aA#ychd_F;3w5~S zo>A%^ioBdpA=NTWUBCuaYjcbYS$sH~eq?!%0cBwe%TJ$5u)gOR9@^fK@1clJflEZx z>Y;RDoVp+jkh)Wf%_McfE;e0p;p=?(PsC<Am~CuWp^-h(oQx0oqxMVsj0&o*l+*e= z>930*Y12z!ICvRM0k48)@Fqy(xLe?A@HV&}d<Y%}AA^OE>?a_`2ik8S+4RrAJ|L|h zQ-4nD#~*?(!66{6ACt|O6YIPAbHY{vD}lMd>R=ua{jZi6>;%&KasZeg{0uAr{s7WC zGo8^$>&w_nr4<Fg0%?7D4M^+D8$g_|Xs(7jMC;2FKw4kMo(x`Jo&%P}-&DscgV<A{ z;k)K$?4{7~&ZfCeZp;INJ|MnxZuSRjgNY!nnayB5a5(4!E(Be{4PZlX3)mQZ1>*bY z<~FF8&A<*|bI=!T0aAT!4~BzoU<~L19tXX_JSfACV1BR@NY&F9#J9J#01)3`*1CX4 z!65Jw7!1<Zdc0$5E(Uf3D}mj?>R=DBDTwd2n_GclAXVWgFc6FeyMnRcZZICa0`>uE zuRsDAii(*Gn!pqg-(AvDL8`DO@E5Q@_#DgtUx1n5D{ufv`x*y=MZrN}HSi;_IXD<> z2@V6>fg?d5a1@B|U}&R3eBVO*1jKhKw6Wk^a6EVqoCe~&Zfz!562v^S*&F-{3<tjk zai+6|GBYm$7lG6t8d0}8*v;3Y?yyaOJq_B)Qt%{x_G3}Dfg&=ok2gFaJ~k;@yy9fm zy@SX%{g>UWJ?UUl5w=|pX=>6ax~3-8J6ruN^fbv9LPkAAKn_divr@?{ozDiygbuOo zeCRptmH#+iknX7b(x6)y@ucQkD}VIn4UI*_;FmOt7#7Ik328k~n?R)1ufI2`TXRX# ze>#dFbtMueB0!0CQL>bHQ=}MKG*>eD3~LpA85d#S(~s18C@3?ue=4?Kv)$MmLir%g zzF#37)&u$kKe|5-%yNGUg!=uIK5~nk?vM3G4pQmq9}%AZqxwa9x)}t!q@4CQlO6gk zSQXp`HUxKq9^?-U0C$7$f_uOi@OzM+yAPzUe?K@FJP1w(4}nxuphL~yfk(jCAl9~d zOhfyhJrRc!AdO{CgEVG23r+>kf$PEZ;AZeLi1`HV3ium%4a|*vz5!Bx{{nh|cR*@e z_rST}eQ*W%09*w=0+D9k7hM+l`~-hvPqOwDr1kaZAm#rHFcN$P_60H6Hje}`hizU3 zI)Jo?Bp3J)%nj1IT^=we^tvO6J(;{O+8r#2zx#oO!O<Y?ll}rM3eE+KfyY7GH+=>y z4PFMzfCiKs;%X+nP!1&hfiY&5^Cdr^>$vtlc&Zc};+MVtKs)>Yjr#CKLPZ1kd-b8e z+EfYmV2d0z7;0$QY7|?w^ma6gC!Q-BZxXAsH_|ewr8GN0KZ<;BFpHKT)uC$%VNB}t zAEm^dxQ_kfs4Jus+QVHy%CQc^I-wI-74j}1>4dJJ2iOfHozNX5oe&C=PC&b1ozN2; zg}=kVY2bU{S`h0wJU5Sa#qYgEgU!&EW5CuR_O0-FKWJ~}vG_XyTnr|HE5H<R3z!D( z05d_%9r7M{%mHd2;_qBY!yu5-Vg@OfhJa+_4Fxghp`jg{dxIZ?lR&J~n`eS!!SBFN zLFh5<Gw?7t4m=4?0B?a4!FSNsX)k;okoLmUo}4LQEAUIOGdLYw0?q`#1!sf%z<J;~ z@N1BC!~(DdxCrb3E(U$TWnc)n0*nBmcld0O)!=OW4g1r41jIfb^9^tv2s@egz{5`F zz3;V9zMCM2{l|OX+k)TWZ!d5MNH*q9kaWf_kaP>?qcr>X4tpcMG(SOmA5Q;`Zs8Y= zX!90L(DcSl`p;2!puT0Zo4|TWTg})|XP4Db$$(VWc<#^5>TipoLRC;S0E?kAPRT5W z$`r`5GgRm`vBv5e4Y4?3N!ZOJHu1UPqBH*Cb;#&clUr23@T5rb3NYC%6mjfgNKTD+ zkH+z@NwJ|k9&MA|r5-#wYmQ4IBG{fpV^>-n5y8*{R4}$GL+qWPaeG^Mcg8>QRO|S( zhcrt-J#5CKd*Ov91@Y6T#Kav~Kqr9@E=WNpD;-Y=L~PafDCNmN4{@cr2nsGuqq;*n zrYhWZrTj4J8r7#Cz)Ii|kaWyZ&;vXMhJZhV(cp2gA4u<4j08`EH1Bl=oCTsi@q8Ed z)bRY)MX(y4bqTBuUIhn&^u7fplis&D5B>_0J#iZ>f_i@+#C#{ee-Q;f!{0IBa}e{F z+6!<Zh`!$ZHTVYz+eyP-9rFQD!?+VRi<Sd~&7tK4VJm13V0kbX*aXZAlCCg-(4Sg< zklGg3u(=JQ&1?4ic}N#fg(RN&n>HxzVrqf2af|-5ZGm<ZW_EvCH%DLpMh#I7EYnvI zxY`R`>;w(%C)64?v-e>?!`9G#hOMFfV;kB(7F%a*Bj#%V6j%GFxY|$s;cQU5Fzn-j zj}6=Tu#bnUZ9KByq(eiml_(5bjYe&K1EjJ!C1j?=>GM?7uD9b-W&G36m=M!oG~}U1 zYjcGrdPqI|hzs_*@1&Ahbl*kD#8YhtX%wTIxaN$1b~A)zK*iA|%o<=>Gu#x;gPM*? zBqqZ{Eq}{NKC)DrLz-pP(gi{hS)t3U$5SuRHb2Kd{OJA+@LV-|FpYw-J<QtgQe3<v z{L<jjGNs0YWuC^PmGV*WCelpSB8w@@%t~xoL>i`KY7t3nqog%(m=FA;_^9#LZ1H@) zK<$+Do-6*+_xp54`=&PR2YP|<!~2oDgP-7UdS7WA*b}6A$zCAM;~T+Wz}}#SXGDVT zU_96x>;p!CDWDmA9~=Ujz|mlTa6Fg+Qhp8sX?}hPNNYPoLCU*HAlXop!7?DmDCVZ% z6tEjO4a6D)zh^WSoQ1!?1m}R5^XK=C7J&2d_abm1NaL+V;1+NRh_Rx!0>l_lTM3eF z^(~08n1*+2&A)?NLE0a*4J-}r0BeD}KzDEt=mUNalC8BLggwgd7xe%S;qUR_PvC6u z7zn$I-zy>;r!}5of7Znl)MzT3+u*rUaEPDHeo5>K$T0G(DqA<Rbx)w9#SQDGh?TO$ zk$w0Y7&RPf`*th;8z8ETf4r&LvhuGtd~2N`W`?O9?8OZ>?TA*WsL@*%OG(w7gv545 ziW>GsNS*P|u3_u%-;1WG>w~E16s)LHY$$82V`G_(Z*F&m=H4l^_K=IvU<JWS2#ASE zi#GM(&^#^oq=u)&#Ycu@rbP2yWIScPE0ncNAg<|lA3ecEg(A02SnbTFQK1MYt6HHc z0yGW!kxCc_R>D7=MG!8{I1)!e<Rruq!iGab7e)@*I499w^dHq7YU`902c>*1=K3hp zFi&fyL}8xROp)3K_5^o=1Hj$j$KW3Db8s)X3ET(PL|6ww8Xp}3-vxgFNuT@#t_FVw z^B_Sdz{21u&>1`px`JoHw%~cNBZ&9S&2iu*a0Yk<+yq_&F)yLr05R{N{Q}Z_{w=UA zcpD4=?}7`#2O!xgkH9_PV-WV6_5`Hy%~S9)_za}I%+EpCMVezC?Arkipfgw)Yy%bn z+kwTvFt8*D{ic-$sjw=7GeB%$GcO16nv5CxL8}U$2djbiz#1UUsn-E%yi*s%JhD~~ z90Aq`olst`Ae~j%7(5EL08fA|LDCW4Zd5z+I;EDvA6g8yO{dcSQ>xu1r8t*GtTzYY z-_de`dLMN|K8rk!4n)Hl4dR9ZmJ8`=7&VxT5!4*S#e$ZLS*{haTuV<#PKu@bO3VA4 zEZ6i)ddy2%E>Q$&_itXO6GbSc-XX?dZ~qWuM=v)|CC;J5er}<GShf_tb1HE_a6{$U zK}kCz5GBr~#NDjLxs^CDAUH(%&SMdK_=e!Ep1e-MC22z^;^z_I8)OW0^YIVy4hZsd zlLBA29$rDg(5AvC$1RJ`-~eAAPwe*)emF{5{P_C#d$|P}I|R9T`gr+=DBm2VEWXK? zo3F)p9T~P`wlNLv?&TF|@vKMIkgewqzC8jv;$ylZviY<1!|@Rwt4ogsvh^4e<mMkt z`K9Up3jMi1U$+o1m6JuX^%v~n=If<Zk<ToZt)HNP5DKW0^i(cePr;qNx~n)jXY0iy zzz>zf$112ww*HK=BA|9^)$lYrfy=G}7`;M6y!<_lL0;azULGMh(<QGHeTT;qDfJX1 z1w%EiZVA~Ukjnu<Mjw9<->#ls#-M<J5ThkO%fshNw4HidV6f5C$0Nk(6XNFU<6(63 z?|>|F#${7c3Md3k%iRaJy1Dy$8AEymdKvu#{4G9mWaq=n-Pc2fkuy6V9@ah_vh#tb zh9bcQoqpgZPH~~vs^}<~^aSh+z&HESINu&tqkQA`@0FTr?3&a!DY<`=(K{Z#yv5o% zWiNSiuz2%H5^p+Ld!w37-tuJi=9U`EZ%cB`CO>&Ce!3>bC#EDs)6106QAY3Ra1(8l zs3-$-w0P8?84^w>uTdUTNcpmQ5M~G0LGod+_;5>24bL=&Bqtkv!&74|f#kP%@rzHR z_s5KWoKY%^idcN;@#w(gHXq)%NsWS@RU)f55B(S(6;_q3p1kSQ*^c2!QAnAd^iM6` zILSsCHEucdu+J<WI>O-kz}S&rp;7*-%1Dj3`17X@%{DaM*F=l2j)|rWJ73f`=$W5e zeChe%fo=`QLF=`Jv?2MNn$>3@y<#GsE~}PaiZd*p^#X7gTWd%cQgB~ceE27$nu>F6 zMHx`4INKU?qjUH4HU<U-1bPL9^ss7kl&|C=hnCfYTS$N(Yd`XkGaC=+dAvG!1+n%c zKMvXW@o)?B^znD|g@VcJ^p&nix<N5`LMIwMy}aGJqGO{@p00Aormlwgbm$m@myE?V z)@15hpc^!K0D7^CXwdzU8RCb53LWz6B3d)OiJZNMhJWXw@!xr9`gb0hTX}HKE|RX+ zvCQ6wbu_d0(dciVVx5xe*~LShh|C(0^Q<bik==hs&s5fuY0;_u@P3n#|1hz>Az!Dn z_a(M#Ma4&&Fw!aD^hgyD-=30&&mhz3k_DU|t1EHQ8BrJ^VPcu=!8=?lVdez-gnIcJ z{Q}VA_yza}sEb@3tS-V(>A|&(?quW3?qWlAl?@)dtBqB_d8t#iy6TRQp*RaTUCBPF zNDRHi09A&qcQDRWMbvYQ4~j&3v7bFA8P&OflMA9Kel}Sf5fy`$P{65m`Rp!Jz7%lk z#%+kM^R0aRG`-5mtuPcLwOr;jQ+x!Hz~+!{5}?ENa|^`0SYD@!{BU@nzAd0H8_HL7 zqu0ydBLEGygXof}`=U#^%n^y1X>^Nz*)P}_+{4d3z?VB6;U_XaDc#ynSAQP_=EV(I z_(+TIV-renC!b(06>-_wIU?3NfWRORtDBp|a<Wtu+<iJUv3fcV*Y0n9b9WeeUHv<- zg(HFwk4x@j?W0pbM>luO$m?lLN=yy6zU~$n2m>W3z|YN}$1eAfaV0c5_<~wNRBAj{ zB-m1?3-724$q{|TNP@&AmAF5K<;r&%DK?o%Tk%MOe3w^Z9IT-{S5#7(@Kc_hl^9)< z@?1$t>Gc{VuB^oLP6zV5pc9=(DSjB%iBu&-_lr)TFHRJ2x~tlyRH;JGV35=R8Fn96 zxs7ER2vDaG1ch(xhQWgvXS9$v@EGT>Z?GS9=(lp4{OeooM<C7RQ}fx{$kIf%ji&8z zq>;R{;NRbAF@N=&3jdEc@z_GoN~gcSNena^%BU6n>l@g!(F4Oabk9xYJ;na|9xg8$ z&FJ?vllPVQU++VE=aE%QdE+~OeWQq^yh(p(TX}EEzrNQJS-bmP<o%`p{(d<u(+jT5 zU*92o>(SKnrtDweMA5XpvA&F7`M<xBM})4@e}%vHPk!~dHIcVe{Oemd3$1P|r#U+P ziv9x{FbE$n#|vMuHiL1-v3Gh>Bo=-go$iUN!71TMMyM)Br(f*7heX4eW&d=UIzxmO zEDeW{5D&lbl(eAeNF$W8qf;#?JX|KjvqQ9rEM`oM`b6>V6q!H09lF-h>9lyZZ+x1` zAFrozs6`>aZiys^R0uMwh@*dXblPeY@1STrm;F+>N5nNYqJ5!m5imL#N2i(c9?X12 zry_Ggusb`AHd6DQ^kgrr<sv<Penz*9_%tI_ucOlhtI&)dJisgk@g1881cqZy4L8sg zvJ9;944Fd_pxhs16%>1=BNyRSnERf|NzojWvhW&i6MPUynJ-ed&yg4PgizkQCui_= zioqhg>mt@AaV5K0b3LeUQ<8zH$thT>&*TuP9>m#&XcZwU=kIJ{iyDVvrbr7t6!m~J z1gm;Rl}Jhl8J<=-#o6Eqdz12uZlu@Mah*qz>PAZ7CY$H^NB8H5I^l|K3BufRblMN= z2cd|OuhA3rJ2gGhl$^?sC@ABWkZiKVjVcS7&Q@{bnFJo=scL#q+^Sb!4lajPjD7I3 zCC7^*F<4v>B^{U=O~+C3MM~!$aZ$Ee5~C_{W0sMiX-s}NRcF49uI{x-m`8GwN*QJD zJQ=87N$g7{n^t1vW<oZyRmua?ypxkmG#2HQQ}%nofW;ILs+}>Ak2>clQL`*78c?@@ z)L5fiRG)NRmryG6hzJE!HBfm|92XA25<zf0jHc(%n;?!(hlO{_UVbp;Vu*M!<$^I7 z=azZm%|3p15nSvbZtx4o+oc&Wi5;CPTRl;HCyPB-#3e6r$tNi?mFH-}6F4BD+N#4t ztE?W7UQtD{SgcZ9O+*Q~i@ZpPHeo+AU#o;Le#5LB=cLI<>54+KF};r6HNp#(5>3p( ziwB?mAC!z*sI(FWERIemMPaC>!2$8)3_pdk?_H67q?uhCa#m48u+2WMoW4St2c(3* zpB^ns4%0}EPRkGivJ+;hqf>72KnhK2J1Pt}%QN^11tDu8WYBM{%~vBO!CoPq`~r>M zz5#9_t__=GtqZkOWTZP36l?B^R)rE2jhLi~Rzi_p3oS$yD?BX)kKte!2*sr5ttTzi zQvs6sij3p>CuUucyXf+gP?9(zMJ39}Ngoa0?)at#=Oco~7d4Em93F`_#41L=pHoO3 z34MJ@e@0NUDI8_X&u$^g+*1F2=?LvKQL3cqX}u0NB0%gnp}HS{cF`f!*eyIY2p{A~ zPU1(9&lMs!C|RP(-?eY@J{WOwSyN_KLBOfB)^DV@`5c{$BEzUbU?5W&lJ!>QhsV(; z;;3JyX2hY8HeWC93WjxH^u>;JKk-5~WjPh>MdS%efmTAO6?GJ;b;rpdQB+Y=MLH>2 z^F{6LhAp_*L6MBa!7!kB(&8|Jpls#zPZP=H><@;nRUU_0@}GO#)qJCeobyxJ^ghJM zKaK;J?jjVZM+$bmQk~5dp>ro3O=b_rdlE_yao|*1rI50%r?^2VT<(c;i$t<!;mW|7 zMJlbTEFm5%iYB3A?<~sMotDOm!S60>jSOEL^hm3;BmYuFuS%_|hKz<((QH!DQ3Qy! zC{bgFWK%LLevS@By{<A*P`X+HNQO{WP_b~A(ML3LRw%)y<P;y|2NjJl*xs>9CTENf zy^v@r(1s#LQb&vCgtcQwrv@?+;+!Qes#!9oc*QLwJeKo>8cmv>DDmPoN1W=)WZ|6@ zp`{<Sud!5BWvx{;mI|Rb(uiE4n~{Y{w2zPjCIfAR2-qtlIue&mIM<Skf0vAhFoc!) zK=ma^rjk!z<A_rPNr4&dH5lpO{ldF-Uty_F!bn_V9U@E&Gy}?uO0ux<S?+kFAIF3Z zK`WgoJZ577uzETzDwM_gfX-1lY7z+##%uuRC~rNW2<MZ%Fg~9_Ito=F5q3`kR1Dus zHFc&?ZCp)A1#qjagzDTs5=8**LV98VCb6K#bn8Db&0_siHYSQhyYUP595O3rsleor z!4h?950okEWnQI6=-OD=%^z85TT3TM52CM=>3TRg8M=mB%Aad7`p})D(@JCy?&2hh z!Om2xa46B?sU1?oqvEkd!)iSf$;HB#TU2sHv@zHO6GI%)#7QH&=cuTK)Nnk-i5iq9 z%FZ~uR>x{-izqx#)*M{TYQSrGQ8;?0%9_NL-h`e(SRiEH6%`(-1aVd9K1)lbc|xR) zvrw*4h#u`5nZ0Du+Vp6YllH|fw8Ed~i;)wOE`s!nPE1bC<b+VW^QwydTU=SN<;567 zLrltcsziub*I-)x=h|-7s~b7D)>y@zgQI%$7lQ%OMw+8Md5J>~PAKoGRLY9H=RVk? z?WpGpky#<CqDMH6cBGpq@>!~ss3BvlVrH?#xB^hOMxR9N7mkg9JS_*S-l{^0lHhie zVkHhj1q)A5^^E%bm8eE!y+*-$WmT2!h*1>H+N|BVQj8QMI@F#jIm|T<%G${0QL(5o zRQ5xyVig<-Ta`27cTq{LlpBX54f&v8cN;sN9%(TTMC`{|h0E<Wfej_f<xhl$qGdd} zh{qK|nn#$t#wd*Hj8QZ!Henlc7Ty<u>XjcV74Ha&w2%&=DRkB>T*G5%I+vU9UyWT@ z`Owx2<d?PC$clEHb;0AQWUg|tQ!=vJfvhf(I10-byHz;P97X5qof@q#MyiTqW#(~< znjn(r7K0Oeqm2z48QJi%n2nrGh!Ta5Bx36?l_0In)5<)C$i~jmnHVHe-`K^X?Zqe~ z*p!J?Zf+Z&T9u7u#g@YQQWT9}cm@XhF<2JoZ16x>u(P<cz>vl#DgzZuZ!`5o9{I*c zq=rj9PzxaywmhGDS=rOjfC#sv*TWJj=?1Dg=~6c!N!F!Ieo4jIm+~SJM{Zf~B4~;T z4Vub`h_Ic8vXZX|r14{@C(owa70tW2?Twu=T)?6@-$!|pr59&yl~b>4Qe|^lXFJ6r zY~Oa4%52?~eC?VNKTsr)M!sp0sqrZ^*^fyYOWnszluA{8QN7qibxX<=7pMRnECs+9 zMOUAt0H{xq&5EueXzTo@n$%f5ff}9cmc&EIR;3SlqVCBR>NKvevN&P=aoftKOX7Mg z+lhC4MsyVC=oq1MxLj#8fTe#&r>2&Ni!NIzRF8!C6tqPV5wb+T6gN}h>pj3M<hUB$ zb#sN7zL-cAj%~V5?zBUNqe$Cn^ycryAG8yF%V9hm^5AYAXih<F>YyA66cq-B0M0mv z@t>R~W^JgLX!E-qUr1|!OE0Tx;+AML0i>osNS9@uU=*tVhKQ>&6v&7aHe?#N0;!@q z%Ia^Urz!6JtkQ}cO_hUGZg{nAGCLLfM(7(*s;U_*y^3X4jKa)*Ol8ChoTHPgO_&&Q zhyt{lA)?N&vQz=AHK}54L^iT27d-^e{n)5Syi7rz`9M(=9H<x_p`3-5lY=+PRWVt} z38BhjJ8!`Sk!^Ry)pEF1h6VSH?$5=!$*Qi3$MS%7j-}=DsD#WmuIw}91?=?`#*Y2q zlsmjC2-S#lsn83<)~4Fj9NEx4z}wq0@@0kGUsgadX(k3_D&4f}3$<1$cADd)U6YPZ z+3I~G=WTxxLD_zUsZ3{>A|PSlaRvFnIxqT1N2ll(jA$?3qV8J{{JDqn6a5Fxo_i#t z5z;EEqf?|vgqSoIk)#%1z@oRf<KS@$^#d5U;;?>I8?!U;xHb2&4mVoNK9D&<>##@; zj1jU6s7J`gb`%$i$owU1nTnSmN~$@_L<AQ{lF)+G#dAfZ4wrAKf?HNuwHi5)^-1%L zjtNK0Wlv<S4i?$ZgKxINxHPG*(&wlV>p=NEYD&l?rF6-@BTr35e7i-{47O1t_5WNH z6=`kxuxw`=DNzIU3WG0=iXC3o7P~MsD3U9Sb5x}2q46wLZ+iYnQBx>+6eTLgJeFeQ z?kBrqq%l&8h&r1`oE;S2S0X#aB8eDngp0Z*j6u#F(mdJQ^1=e8ZAZvCSsO8k@})&^ zZfNNiivv?}G|u>0loA&oTT;k4Rg6?uzO^n!TJNE>Q#JMx3Bc$t5k?Kok#LK*9%phM zEf;ChEnd2{gJ>6&HK^b`iAjqLa)Col-5b%v@*D@}4@KrntNO{dF6KA6rP(Vh(U5H( z&6*&4>yYy%MdXbb<#KmvH8SA_Hcr()IzLhjO{pl|EJZFB%1GzP#Bfs<lZBiLO8yd& zBNjVHSgzTZn`oHXXc!|;aK5xucbG8U`BXgF98@FAt_Vd2(c31dDxyPYt?wg>2E`(# zW?7gE!vys0R0nDPRYbS5O(C+9;_69>mz}Y@osma22wC;fsi{fH(DamfpNY({OoEX~ zt1p~n*O`-%khSiKiKi@sI?;v(S=x}C#iz=Y-=;Fj)hUYNr!rTlN>ge|%BD*C)6HbU zz*$vD+IWi$l&fjHvM6$=uc#|%O}3hm<~-Vp@T>-zMx{cjF>vUl4s6zNL`BGE5MbnH z79i(bgn`KQcMcRmAAHIqB0Yv1NtW?B8%}?*_QRb8ZAFxYujYH%bja?4s8%*=nY-D> zGOv-PTuDgv{KaCA7&;6URfAOvWyf(5h}1Y7hd)sLvy9NVZyGF0rh_~R-#Z?v0#8rn zoVX?~O1(`Qjiz2J3zLo2HmLy|*lJ_=Q>Dpf0Y+%uZ0GC565?OZm~v#_x792d<jU$u z-A{HCo1(gB>A*zx+w>xw{kD}uT4Ex1d3A}-W#fogO*BBASm`aYO>Jkr#RU7GT1MQs zX`33FhgT95ChfQ8nz};><-nO+*weB?56M|lIkn1B|3XBQ`T?#vwD7sax=%vi>yKG( zZZuS_`rG9t6|(X`-Tqh+VmHj1OCy`Q{jDNaq9t=Y^ID!lHH5;B5Vs1;7itqn=yCJr zhf~b{Y`uZ|k8GCRSpKbew3r!{3X1xPtiv;|rtL*FB@2g#hJ1<=EpEsqH>xw)8RVj# zW<L(%c%Ue#G0AS3H99x4#z?jGR3pu-3vJ|YiHfD8rsvDaAMX8lVuEvslxeWdLrC3m zu~Jts3!zyI7fgncrE|!-T#Ryw6wR2fm9{+I##A6X&?Bpo)s?Yq)Ep(!_v0;9jI~3S zr5v_*b_fOQ&994j(`Q|H=}lj6;vCFo1(4gpE}=sykGP}bw&o;a&+5iT&rs5S6nSAi z1m}FB_@)R;g(^1dd8<Jdm)8w(Z(tgi2~y1|rBz@T%1j@;yh7EBwiP4012GYiz{3zR zBKlEeTtK>sD;BolIy$`+g<#!dvH2AvrX7Sf$})#0!uvw1e!0LQtd_qHkF)0wG(WxH zVXH$=2(86P>q^fy>&+F^#Cuu#EZ0VyZ=|~iigH#Ok1x<D95JMv5OefoUu4s*vof;N zXRIb{6%<#4ax%&2Z}b|=a{87mJ%{8n>Kug4DyA639}`|#yXby}WpUmr5ZN3!A*7*g zXM=>gohVZ6D;6fX<d<X_(C{cXTKeSWb13a7i*BP#$!5ut4TxBq+k)_Vise4ii7_?` znZ_mQVw6bgAlpH^kymo{MQx+z3Xh}E{GjhrqdiiwKQ1Yl&OVI}#-deZTrieaXw)w^ z5z)Glm{t(QD&G{MdSSmXCDw?}X3bF}uO3p}2ob3h&6e`mwp$QNHQN!Q=#0axt0M0x zGTG!unvvSEWe*E=Gs`VK4_}2fZt*~Iurr#uP_uMvqE%*{;^(SJFObXWI=y<a?&vDi zvt`PH>lPJ%)+rg$2V_&J#r!=oj`a(lW$Wl<H;CX8va#sc+RU!rbA<KP06Au)^;<R_ zvR#D~5uoiMY1G!}ELumWFND(J?nn(DX|zF~N~XL(hbkr_gzcxgtZXM#g>s{JYpF%k zTX!_^OI5m%2#)nSR~s>RLwT6B4-tj58I{Cp)(?5kYO**AgF=^Pk)PF^r_x=WE%mE0 z_g-06nYeA26OrP?Ly_9g_1kaN5C*ujC_(q+<OJ4JXeSgO?}nbqCfCNCsoB{Eyz@dX zANz&lB??n=S{#q$IZLS_M#<3%zwt|(=2(-^p&PPN$~k1qEEJXCe5-b$Ol0cH8sSEs zF0>3I$)KQjyeYoiWe22)yw37yp(b5yg5V@9w0fLvBPF$FyLez_D$|qg>V;4R<3wc< zb{;?B&lZ@(uyvHRV&wuS)2f!xR-Vxj>9HM?llzL=MJ8;hr7F0J%}OSb0X*qUlis2` zVcSX0ugQ_C>dm>FZA}2KingiEI?q5_$!;Em^+~od5H`Qf%mqz!a_yjIlC?RAHGmYW z<k+qxi>|SYsN|^MV&2HdQ-nz-Oi8=8BsO{BvGL)&(SVn5$UZX0C)0qLia6bpq55>1 zrRS1!6d`tV98?{%3@=45k^PJb=eW((rWje(qqrC&ab|#=8BY;Yp<)u5Y5|%Gms<*s zB7sFr_0G={<HlTLC^|Mf9l0)W)Af_xo><NC5!>pharPDU&N3;>L3@gz)g(7`!DIY` z&cRELn&#~A&6eperqn2Qtw!1FPo59TQ`CFWf@|j=?r!GPEvB>k!JEU;7TI5qpy)4` zm+|^8u${}kxTVz>wc0*o_3klMSKR$<<DT8W4#R;zbY_mTL-jF*Cl<Ir{Ah#re&6(V zU3u=wlx-g4n->rHV}jSi-=EBzz~7gGKdr~o)DnikwS9vRKivFT=U#z#M>k5Z5m&HI zp|nwhZk`y8Gq(^yXNOJ>j-?|q3YY!$bgl;9u3dhwM@)rR$*y-d-~YN_y(RUiqK;sH za~vNVE{`a`t!b;OX(bm-E9G43R-gC!%rATBdB7{LE-ik;IbH1U*wN<`AD!{7TzOXS zmkwnHKZ&e;Zfc`yK_P`2-yVJ|bUL2vg7Y_=9SZcR)4hw~%JKm(Lx&Bx|2*~U=@$Z; zA6~n@VV|4vtDkPGj{{iPUyo@8`%TZaV&~@NV~_pVzv!z)^W(?9UuWphZjIlc)}XU# zJD<mj@B$A--3d7Q(e99{&n~}SyJP*<3d`GmxoB&LSkJ3vI$mj46K87RTn=Z4b`=NR z{ryPFgpodbr`C3!ba3aRQMFc`{O*gVhfPCo9jS>!OXAsIgOB6CYPraDO`(-9hkeqj z+v~l_GY3rX*V6N%*Gh-j&0|m)IExVBt@`wbkGuZbr2p|kyUY0BS<<FrqbW}-W?ZOK z^-A-Jd%i4vkk3_vzjr?TrD5%3XMb<`x$BSBw(NT8aA0qfIcMsn>^ta^l<#J1SN={r z{2iJd)nkA2xKi5T_ok$@jtTZPEp%8MUFX>5I*s$5^SXn|g7bplufn3aS869eoU$x4 zS9pQ%i`3k|XjN*9soke9G88RXw#;o*Ryq&S*}*x#&yIUX`hLHt{*2#S4I8+p=;~${ zo_t@c{H$^1TdbXb4f#BV{gu6$o>r$pnQnEysW<0r-Bq0~)||Sc?C{ZNW`Ejz;a&F( zq!nkUAiOytai@3f+H@#y{yO#A=Zb$(JMpDU^V#l^ZMIH7IqFDKZ9bC({;GC;@4~u= zDU)j4pSN_}oq6Xw9+`BiTdO=f*S)Os`rYkUF5(PItYtVm9K2gT@>0f{v#;N&Hh5s| zyp><9{ye_h(F50lE8acO=heH@aOMj8E79-O+Cr<VU3k*?<1-C@uJ88!rm7FFSGu|= ztnNphQs0?09cLWjOd4m0`JM^2TaLWbDCpoB<Cji7zG~C6Xve-!x^Jzw>x`lNr=Os4 zn%Q6c?FYFUji|i-!PU+Mzx1AZX7aAYQ`d%n)@yH#>1`i<JE;=B-^TuO4Db8<i+8#t z<~$rx<zks4)$?8`HOl$qmqR9RaIWxZX}*^@2M4DiIXg7y-=yg2?{;+wD|TRf+T6WC zC-)9pdH8H-@gE*d?rW-D<b51D$o@j^waM4Yt?av}o4ky2JpbA+JYe~pPu4$JvA5ps z#oZ@N!y%)W*x$7&6@IQZZquQG%RU@-V@azH8%i}R7T$cg-^IJ;w1&@nEy1J&&iux6 z*B7fe{@N97!KsH2I<EU8b5Z|Zd3HY7T7BH7#YXRW{$e-I)?|O$sLPp`Kke}Tht2Z! z3Hqw$o;;sEF4JhkGqb;U+X}UY<rsvsXmG~2vqQxy{Th}l9K1bYf3dGZ=9j)aGXKC; z*DpS-vctVa{_(}nb;Mbu?C;3gUrJZpa-_+kfbUlH{VCFE#^wvRE__qC|A2bwtLo0V zUlV8Wu)oS>YyH|ZcaI+5bt~U*+oCc*E!*Pw$Bu-)dFHm5f1^^KMh|heO@4ZArK@#L zOt1Dw$M0$+rafGCAg;({=T$Ar{V{rQsfZI5qAH;d#IV1h8HeBB_4$bbMLG{3nGk*Q z`1SH1+^ILSbJTY^ijRNQEg9XzKK3_dUG3d3+{b@juJr9E->tsxwzk>xT+Sg6<|l1= zRq)sMZ_mM57zH@JL8FF5)$U%qaGeDezisw%Z?`j^2@iAh8gVrC*@TmaZcNd%-t5nz z==KYp!Upfzvf^q=;j=R)tf;ZF)3w8ix9;AmwRLf~YZdXDKKtvCT;-7Kbf2Z|){j5c z-&`x<f|mAE`zKBMcs+0*ylcq1COA`w{e5;e)$F`9c#6l}Lpwa&nx+q^{hpz2&lRgn z<&W=Fq!yh%7*dep=UuaBbV_<?kNNL(S?t-r&-oi2`;A)`H+06J=wF6)pR{u(&KYBW zM@HtYdF^`NkwqStjjH64&vpF9BZUVqkEzspTHLU}V+%*&x$JN3>uNtt&pCJJmbR-3 z#U6eyxbqYbm)x~#9_w{x`C1p(ub^{V7oz8uKi6oOYuWn`>NR`xvhtXNlbe@qw|M;1 zvp43}oLTtD@uLUOj@aMWuJP~It`Hdf<o<}yzJGP8Ztj<Z<2_!vZh3F7U(V}Q%8b#p zJ?yXXoi4*ZTb3jF(9pA0Pkp<)(~E&E^Obydqu;J=6Hd=>asl~Qv@kvQ%I)7ae)4>B zo@I+WJ~`UwtZQuB7jw>58us<z>B|<bn^EB@&g5l(RoX6V|KxF{TP+*7Upb#%rSi$) zYtlA0nYONO-|}g5GxK!7cS_k`(Ym>hJe=KktJAF^bw>?<{#D*ac|2;Azc%;sH?J$@ z@fzlX^Q=*4oE^3#-<#0n!%i;!VuE|EoY5kt^!>d<CmoL8x1_;?_;W+kdf}Ts>~HX= z86gi$0VBTrIH&WZ1JlQx{<TP*c~iVb@5tL>S*@AjZE)Tj`|B|yqyCJl_+t3-kEY#! zXTTRZ)^#1avh~Lw4{q$&xJ;`|e6%qa%GlW<vEaOlzvh{ExZJAmnoLOZ8F8!Slok6& zf4Qe=hiX4Pf4VJ0(<0bk(d8{hb}!uhVAtD^cYKjJZ)l!b9Uq--Q{`3UtdnI&H9j*A z=gYCbm$f?<^FN+@-?|8&Dr+)6`1bR>ZL2sR?R&K8@A<||Sam1@=XkQeBbRcPTvoYj zjeF584{sb*uSnZs{mKS)KQ()G$mDUYYrXRgzK4K5#M$B0nPVQEdp*6``e;VZZ$2q` zd&!bEPcF8pIsV|Ro_jWyt%ig9=CZ#j1x~g9{`|b-p&!=zec83<=2zjfi<n-zG%GXU z{)8JP3_n7jvcFo_pBDL{%e;x#HtrsO#&u+~D#a$QC>yxZv0(KLbKkwUDhB6$7o+En z{^8>HU$yjm_j0v%@5er`Qz&)ptr5=}eth_spNH=1S+ZvmzH`9-B8P@=y4quV&vGZ{ zH|*W~JyW4WIdjf+ud(9F%GH-9`qae!)BWu4Z0?suUN4T=cs%yzI8*%gM~nQ+dW6;e z^_TwPo&RVMQ>r=6<buuS>~MGH2j4WDIcDLS{w02LdVFl-nw$d?{9k<OcO$85bk&<- zov@#k{Z;>JeaDYm-u$HJne7vQDe5=2)H`10J7;no=$H8Q&(AB=ABHo}*x#wUyN9oG z3fhre^4mFGKREJ%n_tu4O;Ptsc$$Zl8y{3{1kU_|eeUe=cyQDCza=Eq@0e%Q;$wX# z%;@~+_lgHIOSScTujIW?W}XYicO%%}ABX#VyrxIvb_tK3y0o4AsP3`T^J_HrK3wvh z%}e5&<bDNvek=Qn+*4&?jR!fmb;&Vx&eQdt%Z?2_6mzF)M$TVa_1fI$g9|7NCk*7A z9ZIBcIC<hw+N|GS*DjfJyz7Hsx1TuJZqVR~bskOs>O1ZFaOffSSFqB^GLxoFD1Ev} zjb3?Acig(z?RDzUMcQRdURU=@;l+c{K4!7M?_Z2q^mF`(HScb6T5$2npk^~>4S9d_ zvz~4fde#~ETje1YU>~!;Ug1BkOY^@!w605@j@r#1%eE_eWJcA!tG47_bNkBr+7n$c zbj4`c+2Qc7@5EK9I%Uhc>hmfNUjD;~vg00)Sd_QXv||g*4GxdKumNX9v%mROPp-`w z)_;1N4M)t^7u?HJq_}&t{?%^}sC06~wa;cm^hJ70QF!_0&-f_E#v-}WMi<K8J1yXs zUCpOm@4vWht|Zga;z#}aj@7gz_BY~WRpahoRuwqXVZ)4VwQpZ-()v|Mf#I*r4`*-6 z6;>q^{o7&oH`HU$ez%ulJ^LK4zw_2twHDtRI(0_5qW21fG=G2L$dbF!&S@Ug*}<=0 zztlf`j{cM{X3&f6n?EXh(7p4{Q5}YlO7An#vD%bx;V+H-&5Vsr+Wy<b5$$uncXr&l z9`0?EXC7#<!K?JL9#z|Yx1ik+oQ=o+w0#>t{Pe_&Z&G%8Pc4!7cvx7MPLt9nq_%!M zw%E;nb4Q{57A-^1z4Q86jNgpaLxLV9f8hFIkFNWd=G?in#pQlpOLtD{mKnJPi=piA zk<Z{ShO|yy)343r!@;#zblo&PuE0L;8@0~0@3nZxl#1nH@3OyV?cdv*XXL5tyI-Ag zDLQIr${#5WN=%)yu0;JA4c9y!Q_mY`$Y9yZ*<tWr=bate{ZggNwVo%B`9*d=didG) z^5+6-jXDuB<kKOEc&<15yE<d~<B4DInOe&j8I{LrM31$vXRYn}&WJAE3w^cbb<1jB z;_yfI7qM?e+|hAg@B3-(<8w=I%nd#J>x%iwJKuGCoVRJ;sy~G;huy^fPIYb7Z)=-s zV+WWYx42#W{I%aUbvV~1v(JiyS2D`vb)60Sr9nB0pWCksrYwHH?k<=2x?TSG<+x)f zzwMin=yj`cneQVnemf}L73IPH9v1H6wdMQwM}{uF^sw~&w3+@zIut5bdDE-)pZmm) zo8SEz&LC%hb-p+;&UC0?$$X`&l<sgWctwK_8z1KOi_Bqm-2Y(KSLN&B`v%BEXNL>J zT@&J3%`0+q*!a>LyN|u&9=h@O3oF-V{&fE5p$^MO?83RG?9bFA=-qr@*XsO9)maxB z@9y6F!$O}FYV#y=&Z&?sqi<C^GahFtvcJr}m8+Y-7?=0sVc(VxsW*7c4YzSeu!uiv z;*JG7N7d<d4QCFb%{e=i+8>nbo$lj@Zf-i=@M+f`#m|JL_s`pNVvmyT_H6d*(X}_u ztY?1@FODBpuI(QUN_}+0VfK@VgV#g$54k?3anmU)llFWxZFUPy`-c7P@gMs<Irm5B zH|H{K=@)jl<)sg=bgENv-%nrkNUQYlr>p3H|6qS1*JGDxyXLN3I(qK)U-kt)-52vq z;JK8Mr)t&lJ{Pfe$O9~*q3?Hgc;K5jebjZ+OW*J!tsCx630Yrs_0k37@79jE`JS7x z#R7yiiT#y*_R6#^^z%*YzjKIidp&pOhTj7`=7i+Fo-z1w`DfGJVf!6tf9LyVHW;_C z!n5n6yEJcKA@uNo_?>MQembmkLXP5temc+{hx%7_rswv!GHj^Vgwww){PoDl8FP-V z8N9I8vOJFWy(drhsZxDzIgC?M+26{bTu%r4l^-y0L9Mmr-6s5awSVOY5!+WCt^9n_ zw$B4sMB=PT_V;AYsY&jEHIL<p_IkeM$Lh6Dlsr*(ibLfRhVuuf-*cF<2WQS>Y~k!M zVM|JvVV_^$+<H;xpSvE2JijWg{e+)}4sxonv`oOp@Vcn?6WQPHIh8N{7SX@*v9Wmu zymQL;oAD>YM{nFW@8KG^57I*_q+(olk^SX4u%u;Ru{^I%mF%M}Y}@nO`tweVX#FZC zva6{{jUT?egXh+&OwXN@f17vgn#HG^8~U0r3~x7U%h}d@#_#Xmd|Ip69uG=iL*Frg z{gtjha{cDH)2bHpJ8-R4@u)!`T-njO(dPNyw?++4`f>I2_Bh*<{VlkpMR+(byjZmP zxZT<(2PzN#u14zxhkLF%^2PI!ueN5+#@Q%U=(z*q-@WNS=IEtM&CZ-nT)lhy<e2AW zYAoAvXF|7x!CQkSpf2}ie<zQ&`Y}Au-Tlp8JT+BoR$}wd>lYjRk^{CL7~)&Gt#94N zIQN$QO>PxgHQ~~owG*~H=so7**;!@FhdtRDI3;n(dkK{{xP_6vN8j)4@I1U$;+6M$ z6|B3j*sU4!=eF1sd|^w|(_b&`vwmv7U-~?0gmE|fn|S|=l3ivN-~Cau@{i4dCpR`Z zS*JwVU6(K29K0xB<-BL1bC<He9W6X6oEql&$Cm1c!%o)RShZ~6%pKiUWsd&j$&Sf) zyvwaXd#gszt$1$g?H;qXlq#N5d03y{Z=KH5q<v(;S^+<e-v1!&zQ@61=vUdFao4Q; zgM12X&#|oVhMO;3iXIFe8Q!I9lhzfNoI2d^n~~`EY2MG-p?={C^;0W8yzq3xqWOVe zyYwHr`rgBdO)Is{)&6?s4~5oL*YF`|^0&D7_2lN~`kb#{yJYAGIaZvS@ZpmQ0b6h9 z-;<K-e5_#?@~#8>`)&3|pM)$Nzp6ycraXybCpT^MEGAFhfkR{aPuM!8_vQi6Ym?aD z;c9aaT?kE#`?>l0(3<;RJ}S}Zoy6Zt`p#>&Zfvb1-@ms6XT!3;?xz~8pPD~ng=eRC zFBTs7q_0<wuQzH7TAKG=Js%%&;@n<**QEx<FUdLVN@ks%^X?~ob-CoF8Sh`eUv-1| z-t2rEy&h(?*tM~jrp2+pKhkm@|7c9ix~?}D+#Fl1Wz6qIKB(~V-e+CbG&Ut2K2mKd zz5&7hYIZ%j|K7?MO*7r&ceZ~#VRPftFAnUEi`sPE?ODjL&rV~^lM8*dvqP&1X~%{o z{oK0P^BZNaUF`qOZS%6=y(0!sIoDvoloOp&&f<Gu>~Gx<S60?I^hsiFr??!mE^Zq; z=JNH!`R1>9va!pwW`0TCV8?#W{$jc$6n=kQ_adj$JLQ}nG;~PuHQP1~-Lh}8`-{bg z7mWU3G3G5$B&Xq5^Jp1{_b2*bJ7!v#TS`hoe59CM4Kv}Wt?2$?*r&noB!|Ud%cu$4 z2*T1*Bg5$2C;Ug}2{o)A_iqA8Ns3L2i%+Z{`38Z+Cq*WtM@3trhE)j>*)*~Kk`|WM zFC~qRH+rK;{(1N@rYM@s|97F98b+kYCq(_bK=e|HOiqf4j}414#qnW-Z#hsA`WpqR zs*5;hD)Nm2$x;$3xydQC7Vwq>O*2I$#7C$=W3d|LOh;;_IoHf+-n3R&_xPl!<o;>S zopDlJn5#<|c3E&mbakokQs1?OOJmpiE@A0d2na(+QPDAPBP6^M5{(d5P;b;^Q3iPD zT!mptSeRdYWNLC+a*WBjTYOr2c!G1VDLpDaIjo^e!-ip4s!vSE2Di+xZXRJcrZXWe z%r6*D*T(f5wW!~yQ4`k|VR{kui%d;VGQ}rG|EEt$`;SwB`i0#JsnJQ1ng8{p`r+t< zm^77J|D;^?JXg9|DZm(0BERhVM#0)OS*4r*i|P`en21Q@yF4nU|HV`K|HV_@q)l6E zhksIFRym8)_5RZ&C%w%iOXY(TGwEIV|1{odS>pYM8H^JN|I?al$`aB4qUNUjpFAb{ z|Kuqd|0hq$@{l*IKYd|Js+#_WVbJ-PDvbZ4dZb00@V-DckNC%0O>g4;?Tnu{OnCyf zB&z23hGF0=T9vYY5=546F~(#a)PGS9;s2`EWr?ur$HUW2$#MAWjq<^&w;^TtCgZd$ zF*BKxuq8VF%|<OMLSpFn@9Kws{O#LGSBxq4gLq3r`X|**rOIUDTK`t^S=9g<W7D|% z?OTXxyp2d@-+$38KKNJ7!YX6w#NaooE?FwD%Gekaosz7Q|4&N%&jXFbre+KjQ|l#$ z(|GFbgbww^uWY`p&@imQX=`sQw8Z47@Razs6Pi`wnCRu_Hwx9N+C*Xp<=d$?CcH%$ zYbj4lWBJD&t(^`1uj*Zl2}h3Oz{!7?PfC-%<w-b9624Ky{=9iv&FjS`(8>O9Iee7z z+f%hvWg;+X^p@j@o{G8|OZ)v7b<xV`qfg_$QB19x8;xn-N*zizSr3o@RTHsNDO7t@ z5-qv*_U67|I^+8_>Jk4c-g1VMq92R?<So`ql_OTIi3Tc3iEk(7*@bUyfB&m&$u96j z-WmSiMV?kW-Y9g{G<czeJCL{1JY?NSNsqvK&A%}<R0Q>9n73lP%ILuas+X3Yl7e@= z-YEC7bOV^wd`neSpD=x+c&SV?nb<6SD|u#eeVd&{%-ih8U}R+CF#b2odaKOh36(dg z|5jnxtmXX|DxAMt|Mt7=essd{8`ZWftw3qO7!!_P%5F0DADg5Y30n95mVEukA?XH% z-Ri^J2{AGy(`YH0e-S31X7Wa*p{gRjyI?(f{1=hYvn-9@jQzK<LQnN3O)N_-i@{1d zPPepV_rL13p}BGXPHJ{G>)W%w)XJmLu0H>(sH^5?Wi7p}Zb*eqJ=<Hf@Sqv!JbqP| z{zdJCNgJR1HUiSCIn6Iyh4@d(Mm0VxW7EK1?|A=3^7L47q>RFFQQ`iRxMgWTR%IJy zHSBmhVOrHiv902b;;iyBE#~bu_E`D^=Nm;SOE$)sAi^guRA`pMetVh&Wo5kr{ZGos zDi6hOC|&#hcky(oAD?8|!|_IumHR;SxV}*smNAXq4*y9o*%UOr`2S}8jVc6_iC5hI zRk}>PSo9`AWRs?N`aFTEyZ<tS5+b8;(DB;}4Ncy9Ytlc7o62u#1-+%r!f_z@2-O>< z&niY#FA;{OVf(h`h<|xBU#BSSgU9xD?KuAB*Y--6K{MshWf{_C&|2rjK3VqHUb+lg z23!^4BfmCKy71i@2i;!*=`v`u;VQ!S&XX>K_A6Y@eD6K!GHAZJ=sS)SUZ8Xtv`uh{ zd$&oKK`WG7mlc&RgXXDZ9hGcpUhFC6@K#Eff!`6W#LvA28MzGFT4aduw?VoL+8Dfp ziC1nAmvPc%(4HyTOC<}$JCnuOUx;)Wv`^rw%+L5tx(wP$<?pQWcVEdKD_IKm!{aq1 zJl7;$25kvkRXDsA(q+(Y!sX5WZcCRzYl8O_Jy_O4x(r%pxI}mX(q+)1lq^ok=3(D0 zUh~0o7fP2wy8u^Je(n|NGHB)SZlE9gbCxcH76w;mmi3k{gEkN@UzX8ZhvYJ7Jy3zf zGkQsvL7T2*vz6?IlKrY=R0+hrxunaWg`$A)DiPuwCS3+?0$kNN&Yw${LHhx&p6u_a zbQv@{O*WKekEF|>6-GgJV_7ljGHCvA^<Y_$bQ!chaEa$8NtZzzrevd(Y!@;fuN)zM zd!@^u1)+k6v5bzCCYM2rgG=~JkS>E}R<dDARudV3ZS4rJu5=l+NVuwVdSj)_psj)H zJ@!Z64I-C8I|rAz_mXs>J}cQvCCfm<@Y)cbF;Kb;+6yIntz>NxVd2kRx)5h28>VEv z@ld?xgYcrH%b-nzs|Lq;mUJ1k_6SV)^OP=>uabo+*(i8|+Cq3^q|2Z^R<dVG<_k}F zMFIW-r3-Zu0wFU?mqFXEWV@8?k&^wUWYsI^_tus!e5xJqt-u4G(OtR>+9f5UH;n13 zL3^NNPn0Z&vwm-G=`v_eN>)P2Dk)htC2Or@?Jcq@8qS`fxU`oplm}cjIiH6~mqAOa zru$2kE`#=^lFd-EeM)vn$@1d80r8Cd(q+&(Dw(g6Wh&W+O150dRx8;lB|E2NU*H`9 z@r-HGWzhC0*?uKEu4Jc`?7EWOQnIH?_Pdhhsi{B1AYBIS9VIKHWYv|dwvshfvX)Bb ztz?~)tecX(t7I`s)<?<uDcJ`~HbTipE7|8tHdV>KR<gxPwob`5D%l<-+plEDmF%>V zU01SOO7>LAepj+QwN(B|7xGWZ$|zZNC9ADuO_i*rk_9SRh?0$Sfo;L{d6INNKfCI( zV$x;M8Yx*bCG$|S4oViRWZji4QpsYKEKSM!E7?#b8>wW|m29?>g*Adr!*T8{T?XxQ zxN315oGM)gtzZ+~pObVMG*=~SqGY~G7N}$)&0w|gGeV`ypnV2cZGOf?=`v_#o9q56 zN|!+!tz@4n*()W>(L&r|(5gyTeyygGHCD3bO6I9#9hEFZ$wHMZO3C7s%%o%)N;XW% zMk(2JC8IYPDdh(3Y-`w8oCg=B3wo%HF7uTx=ytfE_@EPaNf&I)wz@1(x(wPpxT><h zh0<lvTC~$;ZKMl!tdh-Bve5RrzcA@CXj9x_gK&7$rOTjw;i1c>NtZ#}t7He2tbnKP zuZVORv;toIsu<EyM7j)G2e|5RnRk{hgVr0ax-5&5E`wITgMM#A=`v_jm29SxZB(+Y zO159g4lCJdB|EQVx0LLzlKrk^e<+!uqaK$+(uKOFWHpuS7>vmpoPQ^!%b@jz2`OaB z(gizP$v#uEX-YOr$<`{_1|{=_5nGd=5hz^-t)0Iv^N=osmY`%Q7Fht=G~b&dU9hPG zby=Krp{{j7yA;omF4(}qx~!LU8MK8;wp7VVbwl~`z2&6Kpq1*bWYT5OTtZRi?60wO z8MNj-bXjZZLOPTzMahP}t7-N4-cizpI@D8_MM)Rzh%im7&;Eu<mq9z;OP8INE`!$Q zJzeG|T?XyEl3iA^*+$*pJn2FnMBtn$e#TPiGH6%es>k*DhIARUmvGf*nHDKr7+b+5 z?ma7A1}!~Gmt{(qK^v!Jlay>jtcG(rNk?p!E|goGE(??{gLV+EhV1W0=`v^=;&s_( z=|bD@qiK!U-*o9RXh+~`z;Qk<T^Rqu<-)Ri(q+(g_SNtGUb>*`l<cCCc_wOFV}3?Q z=|UbT*;yqEP0}=U97tQ3bfG_j%axxyRk{q?t7P3@juhcS9!MALXC*71s^O#c6kaLm zGH6}kYRKVrl`f32mA_lcpHrHCZwcu_eNi$uCG%6VE=tx*$-<Q^L&*jz**KG?p#wzx zCP|k;E1s^)N=cVNTME|+_P0{H3|jeqx~!6PArF)+P|421g)S4%xF}udYx|?zI1egH z7wi(a8ndjKbYXm+q2Jp=x(r&Tl6|OTUn$uFCA+O;_m%AI2Y6pq#6`Lc+TsDaY`Jt9 zwA)H{U&%rS>i$Bd%b-nEvM-cur;>fIWM`G^qLM`o(lk$wOPq8Wv`0$zo01jyNcUGn zx-fQz3mq2nbd+=%v~6%T;r!bvT?XxExSF!;lyn)i@67tWyQK>{cCaq%C0!VED%mV0 z+oxoQl<caK-Bhvy!*Es}$FGQVVeU)G1}fPzxH_=Em(qnYACCH$gVNSQy3lvS)tqIW zr3+)f5&FF)q|2afR<i9%c3sJCDOshF`n}bp3v+l%mZ4;`m294pom8^3N_PKayj#ub zcr0B8t<GpoYr%1DAYBISBe<YMkhY=HWzdenCGI^bU8o02_M4J9e4_iyD_xjdQZi>H z%QZ&ReE1oT(uIB+u9h4Z59u;!xyCAg(uMGp%vs6K!qthxyC_`-t@Nij<AK8~FI|}T z`Aqj0Bwc8$O7@|WZBVk!O14+Y4l3D6B|EERH<j$Rl4;}g=jM_w%=L}eG=GlsZRvu| zIzg8$lrH4KL`@42c_m$#SAnZFr_EEkFeeC?2g?Ga3v+mIxwEXdbirnT%Z+6z(uFw` zxZ1PKEM1r@g{vLQ#z`0E_26pDvf0uFy$e?xmaUX7=;uj#oJ&a;=5yc*<a9ifF5Ej= zm#vg8gBJ3+rUkLTQ0YRMf1%5qr3>+cE13O_lP=6>Ptj%Vr3-0OGP9C-eyM3^`QDDw zg}5l$N+l~dRnyL~KWFJe8&t9kB|8Y$dG`0CbRiF>>9SJNWzZ(Ub%Fg&kuHOF6fRHB zzZ230`wFgLmR*)E%x%II#Ii@yWze+gn%0G7xugp^2d+Stm5?rjRvE4UmQ|N7^ks1Q zv#gnPVZI$MKbCcrE`!z;E?<`QkS>E316OC3^^q=v)*r4;EE^zQ25l5vJ}es}U6_}G zt0T*1NEiAyxH_<GxpWz{jc|FhY^!t`wEb{-vFxyP8MNFp^*qfdU9j7gEKbReDcMOS zGtI@hEnFTM(uH~eR|r32rF0pzufNj$EtW2fLzQfolI@*`^N%>ZgVJTta?aPZt{h$- z=`v`4z$N_U{93p$4v?<=S~(?iUV!trIJ~OTh36{SE+xCIWcQV9(n3wU%=b=_F4Wyc zx-3JwV0$mdnWF4ZTOwQr%^R+69Oq8bh52!~y0a`vx(wRPrTV>drOTilP_iGCtjRLn zUkm9nXp@!fOC{T;WIL7Yu97`evR2FW@Y+e2L3>ZhB9tsi$x@YUkdh5ivMEY7UCC;$ z)-())&=1y?E`xSe$!;py+BG<{iT!PmE{sXm>at1Fg)!YXI9rGPHI^=nkCbewk~yx^ zw5#l|fONrTg{ueWeV}w9y>NxHEJC_4XS80^-sgKKN|!-91eXZ!C+UK%vO$-1mM(+V zPsu(|viVB3NXdRwvSUh?>sviMN9jU8vqjUc{Xh2J2foguy7PXnEIBudovS1!h!Dyp zC?FC;MPfi9|E`088)|||y`ZHA%ZU>d>?Epv6-4W#QY3?fENZ}|rkia|3Dhl6+>(tQ zzu81?Q><ju)}d)JEN|CP`qmevt@*PrW*hMP{hj%9pZiCSlQ`b?^X~mvetvW2%*>fH zGiUxj^O!7y9<?UD4+h#wkEr(#aVMeio$nEKGSZS6=i8b*4EjgooAszQ8QYg6w;Amt z9?^$_9N$ilT9ajenk0vfuiGQ!1HC7s@*VVubU{pvpe29iP-}8M$c4ShBl@05+Zt&r z{ya&(XJLCiVyqWwGm*CRtL|>-Gm<Wks8^A8IMO!lPm(7sz7daz546f;p7E$Pc^vf1 zM*AC&n7_@2u>ZlM*5n@}Z7$Nze<bkbJwh*!a@UrnJLnO5iL~UuIbZld8y%lVtx57& zpf!6$pB!n0NP7xYvarctIK&*=qcf7bBQ5z$?w>ZkW{;RVN7|uCyZf*B*thZR@QC(y zAkdb1M0*2$(D=USQET#<#{=zi9<?Ta8EIdOw8GZ{Uynzv$<2{=OQh|Jw0k3M_=zO> zCrfveN31h|-fQLdfJdyi|4raK&m(L}q-~3|!M{zCVT-TiQET$XuLs&y9?@nZZ8p;G zImq3?7Ivpct;r$K`%ISadc^)9XtmLfdDNQx`8Pt?M?7NA^vyuq<WXzV`K=`RRZC;3 zN7UU&n~Ah#46c67__{q}t`TVmBW>;9ac{2i4S0mE7)UwVc^<VU*F@S|B5gd<CL(Ry zp(Obii*LI}^jn~Q%kN)#)S4{+cHn!nN6e=q?YAOrZ=^jKY5yE)KZvyacS3v}9?_rw zJ$I;@EDw9sntTs~?P&k(QET$<e+aZ+_K30a{}X6^9x=v@wCxpIIZ2LK8rwZ$tq-&& zBU|@Pj~Elq1->_U#2g~h`XjAGW&Xa!H|$Ys@<J5qXfO7tHMuI%u8FkqNSlbXzmBx8 zN16n7@ilwIe!!2C<PJ-Bg-5N)fk=BI(t7`AlH6&0D?MsW{yEZq5NYTCzkx6B5%vZ2 z>lXHqN3F@=j{~jb5%V|Di19t?5pDHopl$PrdLL;skv9I5BpJ1^6CN>7`CoxH;t}iU z|C%Is8DFPIj0K(wv|f)G@BTDN#*A;kBhCRt+EbA>__HJ#H@=cb*vVsow#*~W=S12= zk@llVI~r*nNyf+5=@I(NWRlI6#vzYdlOs)m_9Krdw*{Hx!^Zc7N9>6-XOio!PPTc( zx_3+9yTT*-iiMfvBNp~<k6M$Zrv+M<M~nqP6UMjGqt@i@*+Bb6kI;RjjYL|{>6v8G z!WKPZ-rX8#JszQF&_|8$DUZm<qCji&i22~+jD0(Tbykn)k0R}hk(NI*lWej0Iy~Ym zQ>5*Qv@3F%WZL)&9$_~k?VlrUO<Ul*(Idt$k+wC`?mjD%{J`Sd;SshNwARYwphvCA zKY(s9TG=D|nX^OKS&vwsJSSs!@12nx@u)R<(+dLatsb#X7-<ucw&aDG<YOjFyGP6= zBW+8h9RmG^@qO1L%CbGsMm%Et_o9rJV6b)F9<fgsX^%x(;k-=papUXp2pvS)!AM*6 z;!N@h<LmdRHEBIR(9ZOTyhYkXq-}Xg#=cF$88nZu**_O(+dU#59Kyp;A@hhw*phsp z&3MGvEYfuFO(B@)U64sWX<>&w!d^w%laW?<c_!Ird_5k~ek1Krq;2cSB)@5V+dZO> zzcA32dc<BT=u^gbk4LRZ{uP1N;Suc@gmEQrcYB0we`TPp@QD2n&~F*vw>)Cp*%@eq z9-#x!cH`5wyijZMC6CTX{y5V9Dbl_lX>YkGgngSwt;v@o?JJS?!$|vaq^)AJ)}`C; z5jH2%c1GG4U!6%lZSw8%s5QyICeS)OqK<=p+xWJ4MBXAz+fDMt-h)^KLVp7uQBNc7 zV5IeQWfD3k_=+B}_7G`JuXVoc4|>FTu1M=*1Becbu**DR4Jy)p7-?6qN#ghl9<gT0 zCJ7xIVY42!Cig|!-bibHUF7qKJvq?b7WRNg?6t8$;AnsA5%wk0jzrqsZ^$J7*~0Gd zh&ITgyrWHcL|<`PCixxX>+%Sj{l-9R^9Z{J`d#Cj^{6%ZBNmk%?N2=7eC!p0w#Xyu zE{KjC9em3p#!^=XTE9o+14QQz-w}@(6SBzaXb*b?U!)z0w0l{gWe`BvJsx4(3xT%P zBkbSuOtQoHx;<)5UUf~Nz1kz@;%^GH^F3lr^X5##0D?5OdBnKnErHhQ5jG6;8ROgT z5%c}G2HHxGI2Rdd>m%(b==Ut_Qy!6SG0?Vogr2X>B%d|DMIN;#yCd!YinIff_C%x= z-j+%3v9LWJQJ*92hmn^3g}}GSBjz|D22AK+lSkx@MNvmv=@IMWk+vh!*1tWIFkm9= zphwJ!uM4z-N2~#W66;qFdqn+vN1)Amgl+H5Bn+&GZ`dQ&;eIjDe$ON3myz~Bh4#)& z(qv&D@QD4lUkbEuctqV;8ECKes5N<4q`fE7J{oBsi?o?YdpOdLyf>39uylXq5%aD0 z1=?SEMEzSGXy<#x+!VxMko<nvBj!E*f!5~{b_3L6d<Q&2&uap$;1Odf&_d(e;}PY1 zL!fQ)h;bbQpVN%*DUaCOzA=;V4_TIbgsyJN;1=!G9-%9c3;Q0AT9eU8+Z<`TBJJKt z+cA(yvX;g@9x>(u!9W^ik6M%W-keE(-qKy;5$7X7F6@Uqq8&xrwn*#zKqfie;#=ww zeE{hFMqBGqYw{}~5+vOrkJukv7s8Ht#F}}e?TWN=r2SK*wXY9h&-aM(y(N>hS{mQ= zh<b2qCP7%zJ>Mhr3_=L$*(3Uy+d|l^N6cp;ZCRw{2Pq>9+u;%W$shzHzV~{>`Hjf; zFOjeLS3=mVN3=^&&ce=m#5(_mOhTrJZ=px6$?t(2-{(D|o<`b%NNX--k~RyQ^@#F_ zw6&482XvP4J>U`jIS9p(ZqtxMln2Q1?ed6u;|DXz*~ZuF5$EbbD3h?C@~Ab*4+p*u zkC^v-D3hFHd_5j9Rso?T!fx@1wGq(mM*A&~7!QFE0=}IdwI=@sgxJvT_lWbrpp8a* z)T7qq>mZZ_-+%XraV!X>LwnMr*5oH3goXA~k9eQtS2GC}0NU9ewI&yW$SAZ|dBm9d z*FxTAJYv2YX+Mgz*KP`Yuk)xixiQjij<km&?aw0ZNTmHJ(t1ZS$r6)grAM4+03jIi z{jNv!d3OcAMIJF$j<gk#wms7Bj<l`gndAi)-!_k0lW&5^6lwgON1Px3aNyhE5p^ii zc17Bg6Pe^(3wy*P){G`I37I0kH+aN8BIpjI6+Pli$45ihKli9LX`2ePB_6TXvL%ze z(888HYEAA3eZ*-0)g$I_pgWEBm`CiTf<A7vuX{wl3fgM4!ydIJ{}c2ZM*E3Jt;xb^ z=A1@r^@ues5dX;Ai#=lA10oQ#r5<sv6hsD~UFlJ4@-`3|g?61st;sKgPzbcu9x<N* zp-gCl9<?TSfKWQLQIA@akAXHD?GqlgCcg`!5aIi*N3F>&(3sKg^$6XAs1)%1xkrqt zL8C_dTaP%K2cqJ^_m3X2Zx8x)qaF2#Jy#U<38S6v5$my_Pa5q!k9gMuCA+d*<q_lY zNSlbXe~GjoMp~9ab72>G#F`O>+iqz*;Su}Y2=XbTy}%>pZwTV}zTy%2h_s`T_6NV6 z;cMQ?@0UDkO@8%vGRb8|yVE1uCFqSt`(2N)8=%XLHscZR<AAO(+P6KzK7+0_TGQ`3 z)SA2$bd}Lw?h$LvpsS7cW{-Fe2vjiI`#ow+HiMQMZPKIG<o7|>80`xl@qQHO7mfDU z9#QW>D~<LOk2vSHBa{3GqrKE4&NqSHW3<aWqMrt>HrjVRYE2e=CX@6V?KF>ClZ!yt z8|^h7wI<hsZZO*0J;HW^)*J0+k0`g#W|9XMs64*n5&M^*&l%t29?|dPzA1UZ3+`HY z+qpme+ZVri+xbUc)bY`)-y`}n|ICA~w^%j&`em!^v&Hcn3$GbmdwueQ?>F<3S{o6! zHG`V7{HeycUwZ)dq!K1gRg^}KX5Q3X)YQ!1LjHu=H%tARIgJ_8JB#$rBE3aTZTy`L zeF=Z<{GHEVK3Uw<!QU(R>*Vhuc$V__8gLhXm+-eN6|;k#b(H6qaI({TIt}-p<m{+U z9q)It^SAJLiQ#v$)61UX^r~xned2|B(sQCzT5IEIPIh{W8z&Q~Cp*0}W6X`g$*wQQ z_%%wYnYYi+qOr)f>DSDgq-h(ss7ZG0O#YlLThz1!d@g_O{E7E`{(de-t@swv*cV}U z7hwm(&uC3e_@!)U$|i>}f&ZC2|8CQ<FO$8m^Y`u$u9;JsigR%)&BfU5#n|n|<Y_T^ zT1=i6W1kn3r^V!HF?m`{o)(j*#pEfQ$@BLz{x0B;FTQ6w_`8t5SMc{r{yO=46*he- ze_i}7<F6aq75rVv-&OowjT{C3uHmnTc;CWbk-xX$UcujWCbIgMw&q^`)YGdRBxfIg z?}29(fA8b3-~9An*K04iblK}(|Ay|%mS6Lxo;SaxnGlPbuIF#9@iZrSE7!9qhmdde zfo;69o$il9gz5e(^l!Cg-_A!q+p`@>`@*HHLtMh&rQ~lJf3FMC{GaFlPc+cXTY4Jr zET%m#W=y0yrZLfpwyniYdH64g+S2$yHtL3(ZygdbV2#f7yY-e0YZzkM@A_Llv{6`n zlK6$i7qH^mc=HF0M}GPI_3zhH7VdTLzxjIM7XG-J_=CdgyVnfd_5mL7XzbR^pR--f zywMfLbs9&8HlcPDY+-tA*VZh(oNVhY$*O<4@>3MM7m26c-?#ck-4k@9&UXoYNDTgW zkY`(P@Vu8l=_&li0n$(S^#RiSf&TCHna-Q?5cFo3TCQGy<E=FrTZ=m#MkDgHyN3Ow zJJV&O$b-Bgq30@3XjdV=5WiiTwEEVeTUOu1_2wIsn{HpTp@DjA|2eIXl|+<wchtB; zI{#LlYWL}1$iMFI<U3}GyRug;$^F!R&JPZr+xbhkkLOw*si>b9IA4B4Vm*L#`33rk zK5OffYgf84%f)cx^=nJ3D^5E{nojRj>#w$bt-bLET>zQfdgBNAh}59nz?8P){bZwf zqRKc4e6{k0`e}M4{#yOs11+sj*>Bf_Iblw<eqE|3{(o)#v>W<X(-LpnuvW21{->K` zA1}4q`g#4DjW@1#iQN9$R5~G!Za`XpfqtUT+VsfBtv7DKp5AtAY4r{3ZysEI{cXcU zb~E=DuU>oO`jTF!P5q97)AnVy#yx>M&)>h*Uu}8T=5qkSPo{ov<vXye2iI^>qSMGt zrPUj5yA6}W6~r<@N-wQXm2cYZLOp-~&)1$qiXDJ-`wjFHeb&~ur?VI1HR<)?PM62O zH+xZ)U*FLLTPYpZ*0-LT{6AOyD~;##SKFRKe%Ic1!)opm<TGn7b-5YMzQ3dl^OJjH zY0ZX`H+DC#t<d?(P7Rg!Hg44yg3>*;<JX>NvxD~kkN7`br=O^C--|oVzpcjIQ{%?@ ze}2c&KyBZ5!@!yi8mHL2k8tjm-AV*UDX(;U-i23J%1EfapGx~zk?h1!ZGEpD?<^yl zbp1N9SSws9RT%O4jz6^5HKcYuf3@wQ1TCGPjv6=4e^bBO@_D~L^OTaX6P&JpDX$ZP zwdGSAzxwZ!8Gk6BAl!4+f35t_cl@PW27~DKRQu2x*R%c2C%;w(Zn%v>Im6ZPyyceF ztP=2^-OaZqYX%2xyfwISwbh7?L)YK5=9Zh+f5<tLfi)WkB$Ligr0q{1?sR!}*SNn+ zm~{JixW>H`cRKt;jeBhk|8un;ME8Gw{~I-MdQIBtx+kyN^6r7wTodN`bf(8fN{0`% z-?o--n1nPp-1z>R`3gi_qOI+ZJ7G+>j}Y$pde+ISk86;a)&rI1Z9}EOp;Bcfa2f40 ztxvVLrDF8ITKxz5zm;cg|5a<BS0ZRSf6r8I)Km34)$#X``pJ|(J*QB{o~!+QI{ln% z`Fnq<dVq4W#}79Q+`NA6YB!2hPuys|qg{&gzar0UaGZi?ZTn_kSe2^m&C{K^s0vWy zs4Y)7=d7f1%gt+7%cVJ|p4)5E8>n%se4dLuHR7Fg=X~}ftU2_NV%mOp;C?Rc@tJ0z zw!CZY&&h6Irz(DZKBLkLRkTuTum5-JTQ(s5d#>%hwtXr7wQEXiLK<p6+2G*$T+>TM zbwaSVzOA{QuZ5+?J8Ragy?xECH^eF8II*U~tgUgMP@>O)DV?^W$@6y$e;K>IbiE<z zaGfD(_q~P=^1sGK8M|GkWatS0>(D~RZg|%^KCw_>w;L*gTnNo^hK<$_($J6hP(dFw zv;*|3hW3Dd&Co394nqe(cN)qf`X)ndpkFuC336$4gGP;30NrIs-v${mGy)nkv>oI^ z>;!E#+Ah$C4IKulgfiR#kk~u>yrG22b0OM6ddEJK<Ut=b)CZa{)DN06Gz{8eXab}+ z!#UFr(!1Z8WEP}1;WOMRkl1_P=oF+kxp_Ag^hrZ9o7)U^gFa!X0QyZseIUJS%!y`@ z-eTt6C(x%24T65#&@kw3LnEO7Y-j@XJBGG`e%H`;&<;a8LE8=O0{tgLv!KryIsp1T zLkB^hHFOAckD(c+-a6MsE<x`wbO6+A=pg8wh7N&#$<Xj=?k-MF@`KhGZ35J7Xe&s= zaOw+4=fip96ZC#VJ3%_*ok{d<71h;DvIiuam`P?pHyfG-U2o_BNXK0=$w5%Rp(CK2 zp`)Oe7?MfR**;1i^io4@AlE9|L1!5)4?5dWC#Yzs3v`a5ZqO1#1<(r(6+!KWdO_zJ z>I0o;s2}uZLj#}}8yW<?$j~rId-3QBbfKXM(CZCt1--%0cF<c5?EtkI+6lVW&@Rx+ z4DA73U}y&PaznGA4nqe(U4{;VUSa4E=(UCpgI;Oq2<Q?+M?sy25~iuIGL!{fWT*{v zv7vU*QbT#rs||I6USp^W^fp7?puC|1=-q~jpi2$)f|eQT1L-6lt*n(BLJe&Pz0uGP zkluXABs)P@7}^E8($F5zRfc9jR~woI6$~8!EjQGD2K7FpSUN$x0s!g;?J!gX@rnYp zb_Q=8{09|5Uoq4N`V&L5pnDA+2F)1i<OuFQLj#~k3=M;119{g5wBPZanIw-I>I2Cx z(&9mXWoQ`mmxkJ@%#R!D1|4+1pl=x33Hm!jdqDrUp-!sE|1eYpea}!IsBCB!G-v22 z==+AURR1G}+Cl$fXb<QIh7N*`I$s*cPYe}7KQ%M~`kA3wP;-;=aS*h?&|wfqSCw-b zQH!CSAf0K&PJ$L2YNuhHZKxA;mZ9ySa}4bPwHrDLdXeLM0WH~3H|XaK6+tgCbQqL3 z)J~(k$dJBu^D0B#AoVp!3cA=(9}W8Th6X^dGc*iZW@rL*siEzlOAPG<z1Gk{Ou!oq zWog=PHq;L4G1Liqlc8DATMQirz1{g@Dy}nB1oau30R2ZpJ3*@r?E$^d&@AY^h6XSx z{f6`nn-4f&&^kkhLAM#|#LNsDDuVQ7Ey@FQhoPOIQA3A8cNxlJI42AhL6eRT^eIDo zK)-2d7PQUKLC_}+9R_{E&{5FG4P`OETMe~?e#1~F=wpTsW0HT%@#X2&93SXzLldCi zF|-HtSwpj+-!s(xGI}dR1E4P&8U}sA&;;lY4Rv0SBwsRA1pSGj3D8#z?F8*MbQrY9 zP!<#VprIn@AwvV8{f2geW)01Px)w;M94by;Yp4_SE<*#LcN^LcT5o74Xq};U%>FHg zx<MsF!yp|7#lnH^G_(hFhoM=}CPM=l@n1JI0orV6J80Zc7IXe#L!F>$Lj$0X8JYln z!q6<}lZK9hwj0V~_J7OJFzC~Uwu3%r=pg9xhK_>%*iiOWNwUk(Fz8PV?F8*Mv<Gyb zq0WoYuA#}59c{(Q6&=}k7ssCL{c2A~A=%TM(Ce<7d1-M9GszI|icIsSYjO|vbPP<b z=or{n&gLF`WNIbodu_P~zt%H_$MSuL+uxjfaAvZnqm$V3JyVYsVd*bUTNH;C&!sb) zXNG>S2z!5VYUC)CBJ5p8$n75akqGN%+KMF7Ra`JzoZ2V<?zuC?(N!G7EAV$0FN3u4 zI`ffGmt}{pHpkfTqNMcm4YRPQPMCuhWNxjpotfL7yN~DQnbJik8hozvL^&^=DULnd zyZX-_tNpEzwpNg@_NtQTLU~1LqF}01#`DFoO&$59)U9V<Qp!pAKJnzIu3a>ll`}up z%X39XuZ1E|C%m0WscG(Ib1z*n-J)XH`zijr|6}}TOpArYN$^gD?5Y;B7{z+myNjbw zc4jD~=}jHI_rIQCdz70WexW$E1^wYMWeF57eYiL|-qB{1@ea*cic^Iy(Y6!l(wUn; z_bPaOMQhr$q&T(B#a3H&4k#VP7BaWCIK8c7oQP^Y`o<nGdNOp;ifJinntrI3ZQNJ_ zXQ`$9_`-QaIw!Zgr(@OBfx7zhc*7jDQFbI*Q}Le|rPSWBa^*Wp?^!YJ@~@nlcBWT! z^tnvc2=(fQ2{fq4<s}F|casSk)SKJwlA+bT{Y2vlb%eKLllw8NPS<0zO%$0lUH&3P zT$~!W63Xq~V&!<#<b*X|Pp1C$O->v!g$G90x~I3e;-b!X7WY$K;YoU?X5W12%w9%8 zR*tG7ri)msCP!r}QU%qC4Aj=OV>62=l&VTmt-qm8QwT=o_<R)p6V$~MRnp1ktF#D* zc97jUD&2U8&`rmz!3YLYZug3gRhRF}O|Qg;*DBy3jJ33HHJ}}8K>M!IT$`OLWG@@< z5ZCRk<=c3JqWqY(WbeDhykNR`A8ZPk`>?J%8GWEb5)7Aa87Q4qaonEU{68R5MZ`*N zdWwfCk{SR-cu1a#Z0yie_=>5KnsZyG@yR_nZix_1Y55*$n{)V1$#H~!sfReTq|`$Y zrQAamEXX0v$k8o_QkA1ijziwjDcjpK^+?aupCYazska2V&F?@#b1mh!{tP|cL&(O$ zkKps{gkR)^f2Q&(TqAi`A@5hmJJhngMOG7bwNA*_IziPs_jJwu@_lz)8fdP=4(5MS z(P7k7D3>kC47K_cGILFHpU>UrlB0ud)IT?EYGl@a{1j?k-$<E_*d^7yq}@O&brlk; zIDJK?IQ4`3Wo~|WPYB?1tFYy9lAPDVr8=Mx7W4YH6BRI+SIyKKnb*1A6OHLa`KYqv z<Z9|@aq2PO4VrbG+AkYnee|V|IeR<$a3^A|eqYrf#l|N+G=b{zNx_Xl)>u~;2OMsE zhF4cI)DiOfHoB4e;YPl!VTg^tX!gX=zhHK1AL;aa+9GiG+&OafGF;rDOcb&rYWy>p zlwKsS!LjaS$VNhg#L+#Oy>w=-$1|K^3{x81bf=?{l$||dUqK85WPvp4kz5a~K@@+C zgbLLoAvbcXjE6K}&M)7ycFm0g8tRe+hQn!c?BRR}Tg~4kISR!Vt(UHtnpOJ6y@P9R zxj}&o=6P)E4m=StPc|9uHO*b=18L&6Vrs@*Q(F~<LKUOfj^C6~*gqnF{d{I>hIMfm z+E~6pDuSu$&6hsng&baU%ltyNl>dMb;_QrLt$NW~%42Xb6qdGcnq0oH0x7pZZLPpX z6?kR^wpHNS6}Y4V&#l1r3Oug@&#%CrlR7&`yEV_tZP|swo<0}<6)p>w+g(^PcC>KE znR^OGa@k@8OO*JvUHPxa=sn-ppsgm2%-0F?DcYc}wg#aVY<gjkp}F4p5B<e)>O{Ie zj6OM|Y%$#Ly1xUI8txyk{JK8Y4eqJQ#r@+Q6L{z+ywyQO9q+IJEm}9zJYYl|P~Fq@ z;>F2g=ZfhS9cx$MAyd8g##`3hDk~Kd(=#@YWmNZN2_v^VS`?RyBeaEH#bJ?GM*fO2 z_{YEn3+#B;6`B`OGkd3dG7D*cCA73wZf}@|aSt=?EZyFf9^3~r_wfaoxsQi577G!{ zvhv?GSF)Phos1pL<Th(r3zJc*72An5^vdG&%8q4Kp1IvKa*rt1<?SKscctQ<DzqbP zX}V{$Nx~PWN!*%n9B2oH_e>SrD<kgEOjRr@FpGPrGcXhFzC%rJ_}ox~KO^5_R@gAb zD>7K$jyoy6G8IqgmE{xW_v0OVaLp}JbrI4}L4+0C4xV!~C^vO<YXBZYlW&pHr((>F z>3@~Gp3w?b*9(;D%G&igR<zQqf-G3x9N?s&i%2@Xtk}Ha{6L@#0~;YOr%v3ySmwk< za?>QE3opX{LY8Qg@>LAALb~E}nkwe2n@CDfDq8Q@%)$mrFHRq?RGU?*?aDn;yM94B zRFib2`idZiRdt&>9mKP)RcN7BtO}_Zc3PZ4bInk8L7~VrVA5}{4Q|nn&3aF2fZR+9 zmeb}{EEdUen`6`5{Yq7gSkEj2tERc%4<gr;n3xtUUnG4BP71o9uEZ8?cu62AuE0kS zE3%gIFQiJvwacM3sSwRqCL`=nvcePvYJRmyiit;Z`SSLS7uWgHJ=+qN<0(#Eo6qfT z&XALq@;8|p1peawLK|^tIwTbyn?Y+faP_HC(c6RK%b!ue=~(cvOb|wGn`wy~k}KX3 zh&@w<=6PyBV3GVTe6g*{VEZV1jFUxc4Y7JC_yHyBv!C02Z8P)!12X80_$|gttxI(T zw(9pS@ocr=v1X<^2**RUU)E@xI{NSoA;W+wj$9gz$GYNp<&vNOrFW<q6x0zGVz1!` zRW0Q=S{1j!SXK~ic0PU2uYDEkS@#!uktyJn!j&;aUj@FW0#{Yw`zo-%0<YhrOI1R@ zzSj5P)?;khLIO`O-i=loHuxY|)29FU^g%AE3evLa6;B@oAsbC^<DlcA!dn^*I*vC^ zd5B`FUtar*;|1AWSn<q*T=&d_6dDDgPHBeFU{IYNKaD*}wlsZd(XLN=Jl(gqwDGn< z6*Y4kIBM(X=}MrSG0RDD#@;Nh6UOO*<NP{BV)bRT8?%^{-WnXeO-bpE!I9v2b#!q1 zW<CsFu54lO^4mmmn7?GPP<f318Ww=f$vUUn(xV`2!Ht$f7i@aHrD*H&XBOQOv{cbW zr=N0Z3RN|(vKaq})=@nXtJZIrPqk?fq9z>M|H>6_Lbda?|E9U~=C9}T7cM5JvR9&P z^)oYdX02eG6M0AU<6M;-OsuL8w<WppZ79^aryRFQ--*el&uEvhjki7M2~d|p`fU%3 z6+&;D0_CmD<lPmz71P}}=N|N_)$+0S>bf7t=eWj(^EEQ&m2Sa&83nq2O$uEw>$hf# zZfm9xwq}gCsI8g8Mw1bO+mEQoSRm~ziojgbE2d=3SLa1C<|}+A#r^{0U9ZFa1r2m6 zMwek1n)Y#1XBzFbsK=<TKmBfU!>NJF<Yq<3pyC=%O>5XfP-4Dv4euS?xaR#5*BA$5 z<BhWlE${4=tYR9r@<El+Tc-jlJ{HkUlcTiT6!j(otV}bp*1;y3m}J?zT(>buxF$%U z9q(2<mU=DCvDvJWE#F3Zja#yo$5%EmaF3fuae9U35X@@h9KtWwhrESBCJJ&R%$Hg~ zKVxW=_rFItt#V`Z<`#>&*Vf*6nnNqwE48xy;VSKk+$$5&chh9^M=NSc(|bPJ)G(9F zEMkS}1C2IS!sK=@`e<(V%8p)g)x&OM?Uv21@-N#U5!GAp;^c&mtw|YHA5={!6eMOO zq++NDX0poZH57tat^W?;8jf_v9`3Il=2X{LtvB5`aQ$)Co3wnLxAnSo$k8WR-msZ` z{(gFhN@e#;fDG>1tx^VSmQ~yDMrs?{;H{-W2B~^zDA=VZZhKZjAMpJgCSemh$wM1c zJy*BYNoP}>??q{ihbpWg*8Lp(303%v^62R<O(&r&5aUi8hy|(5%%2WfOJ@=<of$GR zuzXi0CCNaPgmMkcYR!`q2Z_MS$YvrI&Dfqp5R;+HQZZEWGR&MS<>4B;2FVt7a#Ues zB4c|FTU1x4LWHQ?06ra?n?pERD-kM&RD?$?!mdbh{ZTra+1eNsB(#)sD|`G67vQxZ zvvS4sct_p}ew){<t2P!f>g}L7JCc%yA|2(wJ}o7mTenq3X(N2YM9=S`2&!VQZHBYV zCB=~3akgju@j+sI63X0}p5ooOM7~f1X#~?cgbR5VA{LW7TM@Cy994@|@T!caMh+2z zKC8ItlEA(x4vch&=zg|VLv37G{-HKnv$TvN)TDTWMdgcoYEmkhS~98%pd2^U&>s_n z=0jqLH3h+#rR*YjtwQfI_E1enwkuV#JE13Ys2QI63C}vHz0w8>JA!XoVREAcJ@y@K zBgzLrE2g(}XrQ7Qy9C_3Va@F~Rit!cxE^owOm6efU?nw$SdzO-QEBa}qdNcN9ruV$ zl_a<Mv4%XXZy~_W3ft#^dsVlqqY9NRw|Tr_JlgyIVu)qvhI(Pduq!fL)0pAj$ndhp z40{4Y=_=H&-025Y4)k*yxst>oCFzjjc1V%1LFz)Y`n>tSK+vv|$#--~ZnL~ZP&{bc zMv%dM<<G9h^EXC4iz3s0yjZ6fO*iwnd|&Cs;;!*hZN7Zp&@aeK!d!XmP7W|#A*T`! zk>tL-k4mikEMQ|sR2R=S3zYlvqYL(3K5hknJInOp%)#7CEA6TsA;xAIn7P(5IVwVp z_aW9sa^tU|phLbGJFJ+dm>HE2aDwy?^Ji6lhNrJZPf;~bAjE7XgbsOD)g_<1>7MKn z>cjy!sq%V^&14}w0g|vYdg4CBlL9tjfVSc#hppWR1aVl8lyl>|mfx>ZP(wPzlLqgi ztg#G1?}#IRDLa+ALNdH=4id~w2L9@DlH9CYYiaHv@M#5A!3RNygXE~5k&pzQ#T$VY zRh7<Un^N4x?Y1Aa&G^MQLjYx-+REA;gF#pO@KIDgZ-V9bGqNHfF&~>zP}$<i(WR(N zp;Gb<*+~cyQoFQ8q?>`HkP|#D(X=_VPW&5Un{C7<qJECe2KL_G-SnaLjO~L#ueNuk z_oX>6dCObgG%x3}G-v)eoI~t)h1QeGxoq*BuMLKL(@Vne=<76<st#%H#<>PD>^syJ zMDt6dHXiZ$nwmUB^g1%;`@k*MU$Ev!^IDmdIC1Aa==~?N>eq{PD|5xE{l(FT6N)W8 zW}R>RX)|=&N!mlwshy;}jhmUbP?+xEn8w(g$a{zW>(zh1XbrK`7)Qbovkwt<+>;uw z$9^W`iepY)d_Rqn|KaGyi@v@8jvLfd_lL#V0_4#vGB*vr|K_37lvZZ0(1>AUVCc<Y z*&4(!eEr6ohgu|KX70lc$2V+VZ0j)DYsWPQ8uB+d1)<UixtE&8hI^BtckT@}RbH<C z)9NnY8!B5BxnpmrtySd37zz#P^_x4xJLIO~8NH+<97~~O=CU3oI>;f?1VbNR%T<Vb z-?ZWyYY$FTCvq4m3@N29#S>DJLqEkPOl)sU$F{QPX=2km<1sclLTtjs_6zCQknPQC z5cA5`osLb85SuWutw_gq!)@!CgB>TfE7Gya5n>Z2wzsEa8@~DajmM3xkd94`5SuWu zT}S=97DZAEIb5UKc%8Y58lim&9!*sHieq~wEZ{hwxoA8VZ&3Fd)X@cv_O4aST~iKf zA<1J~l_E`XS%YYra$9ut6pOPgvFg!-Sp0JpQ4am6hz3h%#nr-bJ2N&{AXCdO)ME6N zif1Uz&`apKTq=YJYDV_NWE9OEj$bZTO4fwbALKS)N9WW);)WS_A-=>OO(iFN#LhpL z6FKxFCkCxatrCYdDIseF0u<)8D#vRn$HfBIX?P@`2I4fFur=UoD0buW>g_tw!s=HB zkld_>9Qu((gH?q!fah@wYfud7!V*D+WlsuAF-Tr})>zSJQ&_t~VR3rky%$RR*dA=> z=>ostn^4h2kiB5p?QA3%JKDC1>9VtHo_1wYpqsuRbj}}zyMFoYe|4O);?wHN3AMFh zGQ>Yud~)bV@foZtz7af+TYM8@NEe?7(vv+YKE<Hov*$@Fz6RC&`DhM>6V>Nd^2k4@ zPdW5Mp9ZV+xgF2r>T`z}()tuZ`m`tdR1DImJ^y{_v;Rc(xsyEd&*@VR{m`euDt+$4 z^SJulBZjm-MUX!2i9QvB^l8t3U;6AjQGL#kNB%i|%Ap_nG+3q2Sv-%c&jVse>r({j z)1K&4F-V{GJW2XgUr%0peCL?k{K4!zM)jPqwpx?&P~4qNt$8-=8nt+e`1PZi-tH4s z_d!&^Kc{Xv^h4bStJHl6&*Q55uo%+n7D4K^C+b!VlGmO!nSM6C<L5)~nA@xuSsPl~ z=TXU9H9tI2Js&|p{y9C%p&xoSSf%Hqcpg{JY>rp!Sp@0Xp6FRINYC~>33~o4dafD5 zt_uT+of=4dlDycUbg__BB5~XdW<(1<HW4hbzg|t9D)bho<k`j{Y1L&nB4?}cJ!FB2 z@-o6E<wyCiI{n<{`xL8>ZgkHPTsIDFC=I=#VI^oVTVU!@j48~;?EIOs^BctGvLke| zvtxsA#&grWZQD@V=U!!(vx)Q^?ShUPsg~NPSq}ZEuLi5?Yn!U$@uoQKVo2Ks5ma{e zq`oQ!$!pJ(P+wDaVIz4s)k=Owb|FvRqn_pPdNx?4=T1D2tLH8;r1dO<^lVS`tQe$c zd!7V6%PzR7BuDvO%l_)fR&tYZb^Ha@jg~t9>GpYwqd^O8P;3o5!Fg(W?}=LGZnP3h zKn`C52CGV-fah^bpeTlP35X!o*pm`a43gKLC!qu?^TQ?nNM5v{Sxd^Trpzcyxp93* zH_RYkDzJj7<hcTG2UKS9zXV?c?LQCGmaUTPL<_2y9L0i?LqANC!K#Al!}GWW)h~v0 zL5ZM(vL^+l7*tU9JP8G*RhO`~bx3mO#y?LIr%206@kF&efLKw>a_EPa4OVG+5YOXk zc~}f-EsG#6+Y>D-25H%zCrQhvNTnJdoTy4i$YxZj9QvVBgH<Y>!1K5&-71E(N=1-L z?TJbigH&qIlcds6ar=~s-1sRp4@&VwwY;62M=i^tA6hn8rR5!X9#_jd#gNvr2-31W z(XwKYmhE|xw0w#x?g&~rQI+l@n^C25=!Z%TR;hFkp2t<`j2O}?6+tSsCn{A8QmH-v zU8%Hp_(b(NOCF;><?#A6Sf$Sccpg`u2gQ)qrwG!gJ<+FPkUs5s67;E|#;K{Iy@MyJ z&qL%f>QfG{PlHwZJdEdY^?5`LX?=<yecBU!DhBD(o+nA4ir=r>m&iw$|4uGvOWe<t z{psP9JFiRzH>>+u1iMnl$a3SavPfc_MSL!lg0wZWn5Tw%?_j7`nTYfD4hJJ{;!cZ@ zxJ`Uj0AZf`4~zWa1MbQ3LX8c#Ck-Ou&NDxQuZv_yj6^c@*2s`I8P1wN_?j3zB}2Yi z1{X=w{E?g=BPo9(r6|3@Wa+<P{-EFHn5P}UsL{dI&q|}8oF}&WVmXdRuWJy=jMKrn z^JhfY*wtkOMOsFlaj`tg^>~e9OK0S1i)C|tBvbzEAm?Fq!YZ|z)SK5)Wq&L->}yYs zc5xUd)YsP$U#ulm<UtKz2HhL^9F=!fcx=xmf;5$0S4~(@;`m6Y<a-Xok_?@lq8t&W zw1^0Yb9)b;N$kU_0mZSSnV}1W*aa<}>AlaA_uLtBakxwl2ipaawkH`PH!ii&J%cn> z4jxrvKV59WA9>|p^076i{c`u&q??qzZ$9liwr7V4?fnXAzp0US{Kj;&EoLg~7^E^z z#ZMM>fOJ@*#f<)X5GrkaN;jvd&hQ{G@h(o~f9_>9OfKoPis~5hm3--S;o-S!QY<>$ zQ5A==)G;(w;;?dXHG=F-6&9VbPc>@L&K|kRvl%arkc=qT<bIQ$c3NkXoz~gpD^xef zbvE6xQHO0H**g~37K&5NTn6S3y;8UngypqP&MCR$U%ZXTRX~<RAWbf}<4xim9nR`w zzI0taC<J}=cSuKCMqtR4huHDgNffzs0w7#Yp&EW+Vmi-_kK$=kN|fz5bcI@?!&~>r zf!56Nd7hkh*}+4}>Zr%G<G=K4=@akh-FF8sr!@UhhR+hJbWU`S9X*W&o;{q|4C}U` z7^X%>sAZ(BlW~k5_26yWEFuLKUQUvfl6H@tzE$|WYso!RO>QNlB0nrLS;#6&{B$mD zh9?DnZYq}8M-H7AGq0f0p)kd1nHut%eu>1rwaP|Iy!J@~`tq}r_{+P@@^Gu$@x!A7 zGUg7ay70&^xr5=_)MBNv#Ak(EwRvbqIOVV-oB}9FYUE&~T)D9~IGVzS*PjN93zpke zX6+DFt_KOg07d~qKdm~#*%$d#%D8Fn<3#@?w0%bxic=Brx_Is(r*EC-R0z)9l7pj^ zgeWsmruKdM;y-=-C_zLGr*Y-;=^y{364P?tY;of3I}{V36^Qyxn5(FZ8d958xRPsZ zIGdE-P;qgm-mCC3MIeXt>+?LhWYl|@7R6EioR(##W3l6}0ICD_!m@aD=wGV#Z%H*O zzXvS2gtzbEb-NxeWnR<JUCZ8HWVxKo+Zr0Y4D1#Q$ZZml;}E85=z@w9%RFRnF{*jn z5oNPgK0GAZ?x7ci02k_VagFwL&@f1oduXIXxpHQ%FGYSug}f?7?yQjeQ{;;(<h7Py zs71NmlR9>C(`0cVvZuzSrC&=?t!o%TpR`c!lCkdDnO$PhwWh@Kfm(X6qpvr5?x6w< zs3G^zwd*g&di&rHO}<l=&Y5%WY`N9mCaaC=3MXh?5?49;(<M=WEtNzRNS0V5?Lb&B z!oQHsRMw*r%8ma`+UKDW<=Yjst3Q;OvW$w*|MRJ$Io>?4j(??7HTsF7ybIEg51PtR z>pU8wJf!p5=&o^UWenz{i({4cNZLK3i<L1YPm$0ZQy(OvkZ<)A=f=Xwo7%A<27G8_ z7!qs@n^1JD2fqrnVv6K>F=y3721>Ouik*0GKhfDO@-=)XPUc2}RBox#QQ~;yIKGct z&?{%0i)|^t%^Qc_*#BX8B%TNd5X<#Ouy-=M+hUcbM{nuw*#S;U=*qvB-O2G)C<-g@ z*?Mo0g15Fyd8axZTBNl5Xo|g`;;BhYBx8>~p}WY_3%^xl`RBdAvb2B19QfFr;R)m2 zZ!a}LgWdAI)umh;R8;+3Q0*0yb2f^91kHyW*&&SW?s9~dt<s?0&WP7tDT&I3Q(k~> z^~?(De6L75D`RUjd6di68K3p)tcj{$Dr@l0HslqxhS%+zg`8}4W20Ifh*}9((Sg0t zX_ch3*z}^DbRO%)8k<UcX=^ocg?Ey%I^PUj`FgH=OfGVv+}gOh>bSPLZm))MMAXRZ z%fHYmikD&QQ8l321V%*FuUffzYdy7Th+5C931WS`qSo^cH<Urtdft(SyrS0gZf(db zYCZ3chP<NI^6oc7A!^P219nyKP4QA(-HE$PT=r^19+Y~uVMZR9X!ne>?=FV&J$O}K zB!)1^1mqacl79~S=O%l)iHRUHmT?QqkpF<dP<uEu@@Yj`vxYYG^^^dI)oy6X1A60x zw;|?uJ&cEc0lQzdWx(A$128X{{~4lX6mfvSdNEsvk&To2*Fp_ZXYt2lv-<kr!QDN% zkG;A=P<OH&K5ZQENJ=mFC{wz~qoz{MqXngF%io8|Bp~1jxO|BJLhQ}7uQQylrmjp$ zOx}V<d8Y?@sr)5^(0(@^E7@&m<fzbm;V}w(?C9ya%{qh<1Cq+!;(ov$N$FgVGNnZx zwQ>>P>cAhPv2*J?2uW7mp$<9pBiIf-?X>qj0C(D3h&jKTF;2L$3=(fD-@?F|yp$-M zK_nkeHf3>YA$(BNu?Yp{r%Z8K-CYh2a+jQ9RJCAibDNtv+l>;g@QMpYW66gc=sw?_ z3eS;B9xlg1F2_QxrE});sU!3g(5lvQjc_Z%Ai-;t>Y%&FqCu+DEd-|Sxjf8WMzSNK zZ2I})4X%JsFsM5D0ebCoRkw&mGT_w3vz9e?)yC#;LrqnDP2iRIRwKL0k}XcJ=;&#9 zy8)3Ay3)O|G*)Ewn50=;db_1F)ysWT?kcataBH5|<NWP{71gzDkGrdp{z4aUG-57Y z;e_@#d30G+j#PC+hwGFE7z$?N<pZkrx-tbh2afp*n2^FIA~Fo}=quXGTRnB}ZcXXc zE!nL&j&iptRo{;>`lKlg)0V&ge3(<FZHJ}c7C9J#3^wCVk@k-a*HN@ISj{uyDSF9# znO-~GiGO^JXa^3Jp`P)IjXX+bVRcFH*gs+`j<C!P*F|G*{3v+fu8F3!v^q$5t>-vF z+`6S0T*|5{CQ|9m)p3QFdY(aC>V{lgE#<ec;saim-T0ccNe`y}U9jFSeycHKvkNHs zeEBQ_siH}Z=Al{{@;+snq7jTM8FxQ=rt}hzno8$*v>-RWkmgd}OY|Wu7Z_1gEay|> zmer=<iiB0FPteFi2rA#Q$q7}0Kw<2yNYwunRmF?$wN`*F7t#J<<-QCSL^DtAJJf!^ zwZe6eWK_+eu4sK~-?!V&*ca$b`YZHog}$IdKSTG)GPpc-iLE59-V3R($F9_xLFt|5 z);7|WvO%S5(*6sQ(j_T>^j(T?k_@YW2@widE3o;pMpj%Szf%3phRDn7+YKs1GrYvU zl7M~d`0E;*$#V7GvfGzHT{d<&d+FEi?;_-nzb}qZN-`Rg6Ka^{zoh{7X5pB(z&~SE zBvs!us$j{ZhSFa}frUYTibdVuDwg{1h#C5fGE|rOOG(YTN_b1H9xWJZMImde74n6K z3i%;1#!%<Q3>UKOIj|eCrDF%du&}6SEkX|P9GGt2EDhA^4fQy^VcSzVL8<Po^>hP_ z&0{0!r{at$j#jmj(9)uOTb*|*8H9_G>VrFxm7c(r-CTTKct4WXsnXfd*Y8m_Xm>1( z*$Z%d=VQU9iek2^7Nm`j%@ZCCsqG&*sPKxy8|nQc->RXw{h$RyuL>+wuO2R0QN%uw zGZYF~{_m-{Tu6HMuR@e%EyeyJycoJ8#oo}cR|Pq-zMvAMv}Wz~p@@R4HK`2I)u)Oj za8Hib<gYY2q5Oqd#`c(+hOTd*|KlD8OqEkZzL3Cv+ZjMR%<Se?yB=j_@MIaoI_nY_ zAN%gxs+`T}t8(LfkJpn^oAdL%7p{>*-QXg9e;OkfyIpK#2b}5^h)RTtH0e2LAuR`N zuJ<J*YBgsVOE6ulx|Pr7Yw4?yxU_o(m9AiKdCYrlcNh*mR{v?1K`CxTDf2?DDtyV5 zE6P-%lf8op(1xE2U9}d8t6tbIf0S;TD8!~ZGh)w4MK#qt8ivTWg(@$%&r=tz_UNjk zz0`VtCz|i<ncPwQ{h87W^=K+-2-{BwulE$o-)m9&J}a(sUgvhxx~3i}axI440hJHE z^HTNB`P_ZYbjWTj%jQM!q$SjOE^i9HZO-?>=FGa8LI};)VDM*OPN8f4+k(GaXi?I< zAKMwIFN$eGH4CFUr?(#Ne1$$%^s3D>cM#Hz`nhpWi>*#@#`5KVHLW{OyPj`zxr(wV z$!*rHiqEN$Qpa5iOa~aRxYTpIPj~l?v4diDpmxfBucYs^xva}ZsnaOc%Cjt1k=o{> z7L;C<AF~xF$$oe9UvLJYrmk&c*Ve83OO2DuZHVnOx&&SP!E@C`XGpS67c*0j*L5=w zq`9kd66LChzNAL<SaFyl`HB@rjdb)YRf`w3E{G#ZRtH3TP_(L~toDqMald04Qltde zJ;J@9hw-u|>@?OanMWYiv0vNNh@U&}%Xj+zTfrD1@6ZEVXcfoPWUi??sw(@w-IQvY zeKLK#*00-P0HIwFkFL6FG>nGYa2OrvwZmvfw_$WQX>}_pM3G>ZkE$2DJ({_@Wsfi` zVZgeetnW1jjZE2KVF6L37mks7B^GIAGIU<NEz!+^qmNxGwzB+gi!02?HOyq@oOTv8 zvMb1=Q1PhLp%ooh+~lr1QBmp2KHNo`WL1F~y;4#{)*CpAE!`3UlAFA+lhRDB>7A<F zuI4HM4GkW=7dG_96gqDdsmabm*Dh3}b1=JLU&BCDc?H^CXl>|SF>);4+r7=MsS_*C zEMZs9y(n}?52>7}bfKJ@=r9LU9d+gYmZ~*Q+umj&pm6^(!lo7i^2EooWdW*{w%l>5 zsbw*ym3p|TrjVOz3egj3HL!dJcm?&Um!~#{J9+9*U|!E@J`G|GO=U}MDI`N{;8Ag0 zm?Q-)dFgJEX59R9i*R!2r)4o=bsGqo7mec>bp6EMg-3Pl6<7H;;cSpfmN1Ijy}u>I zPpQa*RIJ@98>%U0@rvHTpks@DG)oy&(n#R)xyAAsvsf9sucJe+Dypb~+-B_>SLAC$ z3%Si&6RXgqncU_kB@a<z<nAk+$9a<6=6^zH5lz2Sg<-ud$hhOE$kT2?*Th+FR#S%@ zW-WxjE`yASHA-xSQaZ0Vy)E9g6#dJiJ}oD}mX7b>o+#QZLnPul0EKEArDRF@5G2|s z6+7HP6@)E@3l;-G(vKX0KkVc?b#n7M9+UELQ@TRqHLx~hNY(z@^)CtHmiCu|Qq^7& zOJetoOZ&yRJSQ*!lP&TO1~6<OgyUvOjUR`i5#5ce+KB!+$L@3`-#z$f1|-GqedmgI z*hM>OA>!O5o-lovo!Cp4RXi)C*v{P8Qoht;r|&?|qRF_&qNBFOxLPeP^)^u5>A}5Q zEkL~C6b~K0vrlsTce}9@PCBP13sTiN4XAVa*}g;B&@0;-57ZT{KRd&$;jn#2ff%`& zp9W5^?Xaf)E#=crLiEcq{!T#aJqPLqtXqUK0UInr1$u4o>FD&Hu9Knkq+>?%BRn>= zlnYsD+%l%o+Cr2sA72(1KR)&7<@;`LDZj|GNtvfY)^TJAx_P#Rx4gNMTg69i-+5Xk zx6Rx%M{ea)o7;;kZ0ytUt(4DW1?fYix(leXXL$cprHu*6=t^$vaC4Z3@g*a~f-Y}$ z-+h%^u?MTF(x9d-wab|h7q!-}W_ogMJu<RYBb`-PH{PL#YKzI{T5hZ@b1h!Y_>0f1 zD0NIia=|TM9XW;7UM8Ya5#*vGT#JMhs9db?yj`6@TECv_<#0il>(uFY8>x|~9<GKe z`Pv#f*<8`EIQ>DhsA0wc=zCqEeWCV$I1bB+LA0)OvDbFG5j?{<sBh~kUcPUmeSoTt z9h-50xaXWN>k5)5MrQ{Q<!?#JYMW!SSeSdgk@gol@%7&O3tiFCNG$fY3a7GGY)6_( zt&odaq19b#g<MJLC3p*^OWrg&xx9OBvCH)SLbrH*c8d{nZ+x#DZqJO4WO<+GS(WDL zkB<F?frtq_n05?1hwJB4=el#_IX`hb0tX|ILvm7RGv+*X9m^iltLRcLbor08sZ&{? z4^#;u7eZW*5EQ6fNs0UI{8(vhPaExrF%M^<skcsjPH)G0^YryCWj8FA%^I5#k45jU zon1husBNgn>%$JD$1DFp5?1O=n)--zEs{t%N$EXCR?Mz#j_n(ufy*x(N$pwir^}}f z$fZ7~hiDnQb1NzXlUjNED`_^(l?X9Hhz6B5i`RH#FPjjW?O<#*;lh)3l2YoNbhTh% zpebuIIdK>bvUZ>)nW)!F6`VD)Q{RAJ)(vWw-?6PDDGt<dAe}Me=w&Yz`^!+XL@CzY zXjYuo2aXZ(C@hD?rxg^-MA11J{0@t5TLyOB{e0`hhu}&Nz*Fb>Fr&SxHIckZPK50Q z@$)N3kUm7<8{zu&WNB02bghzA2NCoIai<UF#UgZ9G$B8yiRjl$eiW!>M9H~ji+s#% zmrA)aX0{6+pV_+eLaad5FCzD9R*}Dd5y9fDf{Ct@<iC-Sqr7s&e)nmY%#<(i7H5Po z9COIBDEE0mU+wl6(1M)QS1qyGcC>w)U9v+gP8G8zaPGbt78e!eUs1YRIO(Q|oMk|z zIzlv)nK?21k!N^4-46=xF&=W>Gu=EY4dgE$oq+px@!kb5>GT+#KCdmrMgNiwQU==8 z>3mdeBa1kdHiLlIwiPccW;a}D@=lE?Y9HIEgbIO+mo3k3P?9;4tVF?AzBJwNIjByx z5a$|9gL|@?d_=~nYqNWah^?@%WtfAU#T>*wx2H4V%uIrWCqMdOMXzHsXtJNoUzXi? zfe6E+-P$sCUpVb&HF1K@QB1>^Wi~WlGBan>XK93Q$GF>*<(ORFtQ%^M)_mzz_w<g< z`#qF-zVG_X>Zkh_J(YEj<Z#vXI{+(3_i;7%MasP1aV*&y8Qgqv#;T#Fy_WCdSa(uV z!F~>kDllJVR$t10eA&L;o>XJk3|%#rI)0T#az&!od&FnehL?!0xLtnlgJx@mc^igN ziD~DNt*UkrrfBNDNE|eO=C&N5A@adw$UY`J{MAA>Gk3aq1CtX_cWu)jebTKv>6@Ab zav58{TOBG+wLlCvA!~t#E0uo5R+bA^*`sOj#?BPDH0u-yZJ6)jN`qn6h@mQU%Q$vR z>aI$o;#)(mQQ_Aszuw~5;TC<or`wwIK|j&5z^1eA+<jW(>JxK!k$R_CX-$0lg=x7G zy(fn8Q`PROxsaIa&vrm<xF{XywbLO-w?*ky8brig-B0Rl%d=U(YQu}x@&9RV#N1oF zc(zFQ9kcdR=5F**{nB*RebI!0sXsUN4LDpj{Q^dVjMOb)m|z$WtwOJTPNA*F^PS_F z1*YSACH|EAy{i^aEbX7}`*uoMSVFcprQDyIvewIZuVn^nOL2F7pNb~RK%ji&e?UQ- z>s`fPU^*i!1!bj|uV&bXovdy=0H>%0S0gZBVskYD8YYcz6y2#B;m!oP%9X7|@M|Fg zv)C??aa$gx^BbX9Lgq+jrIKM~h|EPZy+R2t&)v7O?Pq5^ntSMxsowLgYhwgHOK2yL zFFNFZZc#gPL)4F*^r)lM2Tpp_QR*j%I+TgK(vRix??TiMs6m{5z^5D%v}JBb4Xf#{ z9<T~hDaWr^$E3pd4ZcuSS5+748@v@~gLSk(Pt{>N%;o5|03xxA(|)O%YLj>0SkPeI zyr?V~JZDO+LR7{&?(lzgO=wnh>mEs{K2uv3#nCJgs22Ip6}Sr3Fkoh?H(wJ_b;JjB z)umy;rur0B1AIVN85#y$P@kg8*9R2bljT31rt`U&+|oReB4-+twH&8pYq%FQCM#~` z4(=^AaZ7|6vf^$)R@|vbIM{wKVUxMDw4WmQvzZA80s%A7@hdum{vf`oRxQE#LY;eM z`IR*ux%>PlQm3~(CPgrmKg^?Hcn*-4`a^1=9<hyJ35-9i;EZcSjFaOQ;r#s4&4T4i zQv9Nn&*vC_EG4A1@=<DT<0upSH1@3VTb>P`Sob>5w%|##sq<{##gM+7`^m9mm&`OC zBqD+B2vy#+(oiKmIpb7JgYz_ecCfjFjM-L4Hh?w**lETN45VzpZzGf6w{c95`jt4C zVK5lyIUn)<gk#7(*-Tg>VWjJqz!r7*{#=#_8<3TM9)>R2rR+v^J8$xFI5O$y<Jubs zTg-sD8N_*2jF&ZcY_JiyA4R(1;nd`aGRNmto+`p&J)j%iBAeO0X1hz+T3vB!QAY!- zw*+E?QBEXR+dNOUZret^y<aV4)i>iHFYXoOo{qMV^MZ2Tw!sz)t3>xhJoD9P_%#Z_ zXm15!wI6P!gF<cp&1qTl3Chb&CdR4{Q#C68(I=gDG@xCAo>Bwatx_AN**#-nQ(s65 zKMlfq8EGYc-p;f}Gj2bND4n4L{yW5H_2wZz{}n~8MNg|$HWmC#%9oAKHd?YSK;S#t z&D0UH?2fZd@rCLT_~PZwxi90VQKE|u#oD1Ks-8a^hbrh$xPU<OQa<+_2b)q7KCWum zSP23nO&ewwt&W_T63NwNKML2#&URLw$*6KW)n9UI^~22@pH(y=3f4uNm7V7r32&M^ zRXL^S#{bER$3<-Ivq2{7w$|L3zJ5m}(5st=AJ#r)?W0hf))dhV2GBU`cxGGtNI-S( zFn>v9y7-}Rri&KUJP;Hzb-Jx-1O*2k-p@}l>AZ&e+7JjWMg^!wFj;at**i!vPR`{x z&g6Xb;Sm^W>})uISYvPBr5Db2!tU0OE&!z(+>AV`W{{x?I-l4Cy}d2HSXBTAGx0`q z_%EAvbYp7DS8sKV-|lG#NNazx$WnA1c8q|6XU1Bvb}yFVw6rokjIsIt{cR9_c#mq# zjD;H+;W1S>e{3etr3e(^02X0AG+Bm0J?nV$k++ocQ%Z3JaDI)4mMbada8k$ZtWa13 zwl@}?>nDpA(&EzEPmx|H`j%{)Ckh@D)R3X4Cc&FIW5>`^l|+1#%ky;%OR5=`YNN-c zwZD)jOw`~0!csZuyf4%V62&LZS)MC6w!wgx$hVk2t(wo<wQp6(O4qJBwEBI27OGi% z+Imp^qJ^bvOO_HRRpkyTS_C?x=h*NttCIR8OC%wi#?@1kN`G>~qzLTMZ=3n)|GIG3 zQY_3!!veUE?OMu?B6ZZSj@(7a(}HuVu-=<W$uzlqaF6CPQj*-f+&sb~FbDEfVIcSA z<+>uRpb2Lnn@S;8ec^Izmi)lT`(0Xp2%`C;Ddo$o=mRyK{mU%-cW~a&`MPg)`dy<r zuA6WZn<_H28RSI<)?L!Uf`|)rcR)H79h#BK7rbr#<@@erI5STu(tQ{<-tntSH$+Cf zo&#?&BEqT=Sx9{9+JUJNl^gw@7a}A-_0EB*N%P_u!yVR?r2hsXNoH1pn5dFGM3su& z^B{^?5v4yZimPEt?6L{{e`iX?aufP79%&V)$V4h%B3&CIbw$9isc&e0wd1{tufh_1 zo{YiJKg5tN6o3gxD!K6&G`T8xh;$hSZ`XtL2dGwkSf*9FSpoMT?ta{By}N{a&@IIe z>xIw}!s!ROq@j%76fNj(uMSs<v2j*|wKF*aAA{`poz_Qf2`0$SF)DZ_;HefjB+hd< z_ht2b+f_P>%%6Dh?TQ5ZTqD2uQ8u}YH#}10Mi1iL3M<yUn}=I$>$dBjx??(p0rb?p z@#YFa?RRR%UZ3<wq)9~axXc8F-%uEoEGD#Ht#VmF9mDcbkZ>-;2~yVU)T*H)^75ir z#i|TXS|y6|*eg*MS13vA9imkt2)#ozM^e>f5z&HfYmTQKv82P%w7|B%(7&;C^YwfW zRN~mhgPUiKbKH)@ab?0z7F+0Tu2YahctQFDNG!>+z#U0{=tx(lNMCTIt5T#dI?~m1 zHwL1H-4K(~)q%ps!*(cAlakY57iVsF^YSrWs8c$Zj{b^c{CB1PyGs9EeQa)ts9LqY zQvY40|DgUF0xDyv$n@Ghhhs)1|9rkZqdM|`<^0}FcwaTY_X4~vKhCVEmfMsk6iu+3 zYME(6rZSqkb}&`rU8!-X(A6|_;-cJUjeqJBsviyNKhul(D!;<h?WpqS#@>iQfN>c# z*GiUID_N$paE$9=T$USqg1(IUjR%u7oh_n?Z6}ac_^!@<**QLazxv=G{{+9gz26n` zlOyG~!~0#?!0#UKcU1$wo%roh3KzR5N#={VB$l;Y$=2&-+vPoYlMcxfzasBF@2z-} z{~FId6;EnPjpqZR_z%{SF(n@|wqU$thkSVhHJ-NVooH@_UFj)5HSEf(*!ga*$@qwd zRX&KMXb?my@Ig%SbP&nbAc&OjgIIoIkn&=?#@w%JnpLB0gW*coSMS$b@#`)B{!fn` z(^;3J4YvJ8A3i{$RWpn9t5Bm)&fx9Nw|0P1!#agi-E+^_K^^aWtB$FT6HLcc5Axi* zVtKC}Q%%QJe@yjK4s$ZkSI9-2@6*{%^<X-ZDw+(2Vw3Su7afnJ{%cmA8WutIM^Za2 z0Ln9NdFUDiJCgdCXMfg5QV0E!)IqnOd1p&`)pLu|4dxk-y4_t(V*Ro}gTttGn@x7O z)K1IBcm}Cf(#W%nhfa;@ENcud2AjJ#kfd(z9*)1(zMCEBwR3kzx4ApLw5wutHIjb1 zCt1WtrB&`6e0_?gA^hdS_6>8U=zD%!jxs1T$<)x*`g#%%Kz`MDVzgoFoFLaWF&=Iy ze=bBKGsVI|v5g!fN#zhHkfV}1v_J)N#hu&yHyST7=GuWc`qhixUJ-qHwGhhN<A<E> z8>lp1h76}l*X~f`sZ4LX>FCtuPv#XnqMn>%rT-B_9_o(EJJsh4&2_~_skram*H)un zujegJ(?>MCFhpH|b;#cCxLOiS&o2@cvPiOYEtA<&CE6i6UFa_Jj}_Oo<}Hpq-Mm~Z zJ3Wg%*|$}Yjdr5#S+;o>y;(LdfSDkN=eC79E+f1{X>&r2s*IXdx^-$65jFRi9jeNR zsaf8&YHqLReYR@;9;JXfUA?O`=6|1R*1cG$S(Um@%_5>^eVi>6kUt}2YPNBP>pY`T z{NsAwXRGEhqC(9|<r&mwXNLdH)#j~M{jl;bEB>&&t`JqPW2fa^J(fRx!o;C!vtZep z*DS!BHVedRL!rr0O?{koXqtPyI|wTuvmQ*Wn&z5$bAN3(gZW*&=0AgZFa*?~)$-v- zKTIbE@e9WiDKkr*s{th!KRO?#5sk-<Gx%4H8^Z$OvpJt>N~0b6BTFSxHOEZ*vp-iE z<Vn4yIQC?(BJO8FC8QYEx$OlaourdhWiT;Nc|Tvb(N@1m|6bK_ctVe@{WiACc%iTA za6_jiF|{u-L0r`8jsWq(rj6Y>+sE~3swpgpP>u3_Bog2Hda)$PqHrt!vDvKMgkhoM zbV@SV)>K!>qUw-@>NbKm0E(a0b`EFaQ;?5s4Kl&}F!9R`I~!NI`%a&*;Z2u6wPVp% z{EF;7tBBl@o?1^EBhKf^-g8|@+ax9J@&{OcVX`t-IgVI8AK5A?pZ30~%7R&U)oXUc zgtjr-hyXtwA?(q7L>=bd{9E7kOR*<|xC3IGkN6edmhvCcjnFoG+L?@uf;AZ#plPwl zpSm6c^~MmoE>&C|d-KF-MPMbV9(x1|v9apbQr6|OQjTp_4GRs25&v*i%^KDQa@~j@ zs((Mut-pm=<lGiCk=4ghH&(Ye8XUa|^xCnyqcc`_3v2X96J)4$gNDpKV~5XV3?c%9 z^>?Y!gcU@MtK&L}R8V^uSJm@mXn;E=%*d{rc}e;b8?J_Ms%P-d>F3%D7XDkqK=Dwm zCKnAt+08e~jQrQlETTFn?;Hzg;>cmo?M-w4Atb9hU^9zAz}@3_n|2UJRcS=e$%!M# zFRmRpIq$$-L~WstG6SI-_(13e?t-JrOsEd}y{%NutgLQg3S2!*trXjV{BMN>xw%d0 z>qmjIMt`*7B7$0F=nU%ZzYVyMC9fLYi}Bq7yP3;Cusp(1XaC9S0qLsK$w@2gk~8nc zCInH14s7h<LJ%Stf1c6)+s<e=wNUn>aQ{^VOs!|=Xw7~~N%1N7cGSksmuLk6!TB$) za`Xp65ZuP;F35;vQ_IdODVp{`>ITlAx8xTq5zB&U`<sf57<8D$MjHB0!|drT9Y3<j zbdmta6W-A&$GzT>*RqPH4m#u3r}(F+Te;o8h!LK(M2OT~J&1`}VYSI6hjKM$ac5r@ zXzJQ_zmH&_%%JTm-Ve4Du>dT?@`tX(Z;#h;>0-~?iq}*AHvNwe=@N=d@FRrAQYeyz zxexz<&?(F0D!#hTv7;}|ZPs#T@TJeG_+B|h@Z9EmQ~u<*;y-pY%U2rk)tp>!4C&XP zT{mxP@DWVpmUPEv-O-N`u<Oj*NkKkiWnHwvWW{;;mo=m3f?7}PX7p^X_B7+EL58}B z9-<VM#`;|?rz%N&bvf!JK1wIy#Z#Nop08xkOZYBexHcd}P$~YmNMOa4ian(q*Ytxm z8Gx_8P#0Mj6`Dt7<HA($8bEsE!V>en970P#TvDLgSk^>w^4n=6NAimD2PI-dbmx9m z#1?M)LzLTKyWKnKjto>d9SdeyH)3{%q;wbU6C};W0UY3WX^HkDM_U?b`}I1cJ^|!d z_7|4HkaBicJFlo_E>!!PL1|F!S~i`lFDyu&23^Tt&L2Y3o^Xf;Rl8x#FV+}nL@~S9 z=<0ez>Ut>j_>BcsPb}9wmxs#IHa<VVDYa;n-(4JgvLGwT#q4pss{?@dzns{u0gTPQ zynKt*6nYPau_Z7g^uEdn{SU?8R^e|eUm5r@+6Pr-X#|~0rZbg{4zJiN0X~`2$_t@f zN>*X!T|;XnMR$~{m;0}XhiE#uPOw8oKJ;=>pYG4txP;bfokTiVS>MWb%v|(%rXfan zxy`==U1{_dTl)MMonDQ;jKlK0cg5B;yCWu(8aP68_NHlWonv8Wq0DbwMF5g?r_Zw5 zbJJS|-I^41Un!yPc#+|$+1l*Pz05pbEhcT&x+v%jR%&LX&*(JS2)t2eN`D&rcayo0 z>J?F#rV}w!G&~fk!4Ol{*P4TyZnH`;Z`pIC{e>(Fah>=#-AlQhVVzl_o717K&#Dfs zg0BnRY;k{;9FEnTP^^`|Wv9ACX<9+@oMOt8;7U1^xgA9AYL9&F{Ue(z!hJwF2_qAE z`kYuiI7~2e>@T!S$U0dxOsP4)rQ=&8;-$T9)iX*~jFOr~Gf!_5;nAJp(J<{G;C}uT zjf%kX<Stos!TeVXLP4nJP|tX`s-^s2RV5XQV^`3NhV66lGd4ac;8%>(&O&9e+V(M7 z)+U?wlBJ!_)Ywm-TzJ35>dwx&vM267arVi(h_}6H!&@Xu6nc?w75x{VgF=`FHF$fV zZW>hZ(;!~aBdUJM{~W?|;zKQSci}vmUH?!kuC<bI?q%yht$w>QrG@hAnZlMoX#J$x zILw6xS<}}&!ng)~bKjumbR1!h?;$eU@o%;?+xvz@G(hSDV~04qnj3Fw5JCM#62#i* zA_-5foy{59HeS}(%eJugk_xz2v@WbalNsm@Vu#<NAGBJ<fjpGDJ~#GynIiJmi5}KN zy?7sbm6^+pY3-xdOI%V;Cs!o2*(nfv-CK3d>Xz;``g<HsTR9Y0qC%CD($DGPE;}qW zm4@Wvim8voTK<Z!YE*j(HMo(vnl*xUQbXKIYL|Y^RbXe9+{A3ZPLL@*II#(~9>hRp zhazQ`7TV_A4RdxlL-hT+@0YCknH`BR;E9ZH3?BOvn#R0r_KhOd?pCX3<=<ql7b&{A zynBRT4W>iEevdwxR~5CT6tSkJLS6ExIwaa=lyUb(dyYQIiB|JcQC_H9;<|7n&ce9K zOhFt4lTE0*h|+iq)A5e&*-k{w8)LtJ;LMsKXZcHJHWV-%h<4Fbx#Fu}v>^ZDE;HNs zDj2oYzp;y;U19jcWPUN(PPo&yc~cw3%M8m1R=744ej*6U#LpCfxvVtwPHWU%X0N)) zTNkzN!~bf0PTp*hS$}8lBmbD9xkKHShZB>!!K;GLF!W6!7b=B5Dp<d=9n|O!VAn^f zg&|etYBjorp(=Wl)C--)UPWJEbZhLc@#V(9VNKbUy;JGfVGU+VxsN=E7dk8{ij<Cr zCD?FEQ_Wd>FPn*Is(2Tj<?N#y!Pb6|V2ScSp)8N71M@i2y4gKx^@16fyXwqUV%G)x z8P;XR-rQz=Cygo7cL|}NKHZ0ibjZ5iVA^e8IP>5uxgW5S?g6FZS&CCn7#G96mr6cM zZhD*F;v;*<diw~XWbl2M2b^!vO#diY6U9E4B(f=Ni0o{*6-curadNVFuCqav=Zg?^ z)&1aHOZk95Xkwb+UF)F}4qX11r{+Iqf;47ADyNHOd>UD&>igBkp6pT$FazR^4fnLF zBBOErH#XeQmnozQ#wqlnMm^TsKlhTk7l(=L8*^9{eXh}zwAen}I93@HR<AGbfX^Al zJSb%pci{|;hv!<Hlmq*{nmO&kvG>*uH!?=|J6I4EBCa0$VSG#Z&lqje?<{NHSY>d6 zuvZi4{*UpW6IO`a=F3|&NcE8xTejj#UAC{}jbE%p&V1plbn%w2ONB;FT)e+MMPZby z2&Go(Z<#b%tQfjp5sSe9+jy|zsv0H~8!k&jwPk5H9$STctMa$2r(2arZk~NS+~}{* z&b0NBo?f%2_g{_u$JJ*hVA5ZYd*3XIP_6&#L$r|*K#*{uOl~iW&9C(RMp2nED^d|T zFq<tdKI059@<^-W8Hd+_qxENgkPE_S0z^f8wD*d-P1;_Keui&vRa!QL)PmgLzQb9v z<Hs`Gh~y#|96Pjt_v?q+f?(G145Nj!ea}<L`!kkyAVj**s)uu#z_x6-j#a~jI?Brl zZhN`Rn&GftQ~b1Tn-w``sG+MXD#G@k;SMkNqX|CM^5J!6u$)q@KWb1YbsH5{s~T)n z1bXe@)6s3M&5T=BA>tUIBX>uM?5m&S)T&5ftx|48{cNhToeEL6kRFPY#H_l?wXsQG z^G(-4{N;i4Vk=+G^dks7bWTO<YrWQOLgS9PmM5{<!KzR&eAwaclwD9!O-}5nrf~N8 z9w<nVuiFfm(nn)<AVk`-*Uq;qQ);v5tQVN^akJ^XnK9+B!1v-vM?deBXep=UN;xHz zIa8)x)9c52sC?=5Cil%6%ue3eQP2(mhnpovGIY9fR(=XB#h6#cJklHa;kpT@mdh;} zvqet5lS;P)WedYy!l((kmOo=WQzOa&d>wQ8!bXRU96Larj~{~CNo(k!irryJyNJx5 zb>}{EbELso2+5cM>#AzfEFm@67=)U#z-G@S=CcgH@;Rm-$Dm}rm;ChdBu@3-QI*!q zbjt`9oe}Kz<|odUI;lr!<>mVr7`2oy^Y&iZGV@owJ%07<A5;dlV|!l9aVmb6O5jD8 zP();bdSU;m-wbwfRh3<YBYGCocG1@HWY}FRrsb+JYa!+;nRmA{&1D{ExB&%;(SXxh zP{o%Pa^n|J+o*H{3XeRi;9bvC=fVeaV>*s47jg{f4aLU~<3G5LKYtBjswP_>q`hae zanJL<@rV;l7mo-IU0PM6*<h|eL;+EUD7KS>{&G9nCSxJ|#zi;=Z6Gl)mlc*C%0Fae zTb^@CtvUfqKLcwhW79%|hE~@pSwm~kDFu3Mr{w6dQ}Vfx86T=ku3ig-j#|*0OX&(- zzJP9E?m}pNV~2Pxv!sQqel(G%djnAm@~Q=*D5MRPy2@++)z%O4*l`W8(sta8sq86l zOthy5%`D(!bvpV<<XT0=vi5e0L=Cpf&yV`{uDNmGb~OPrKE3tBV%1%j1A=wVU6~HZ z7-ar{WnWID+U-;AbW^hF7vM#t^lR3uD68052FES7+7qTl<UgzgEO3`lb=u|a^~VDK z;`l)pHrSRqZjjxD3mOHH9{3h|<%Ui<x|A6_@+=}3(&f^iJo?=Xri~DB2E+Q2?x7fg zMnPSKo#+@Y-9nkrK#DC-sDnX4W_NL4;oZG+ot~3IFwO%toZW%bPlgz_G8<zeVXJ0p ziCcGI$STTjnmb=n^}?`BHw-ZN^_@Njax$YVHX2xrJ=~wpb*PP6Kc^~NCqJ=Lmlmw( z$fm!!nZLgytp@iZtSsmZ<kb2;op+=i*0>po`=qg1r!ihs@cyxO_bVU$Vk`vDsS#<? zDble|jYyYJR?NL2a8;^mDxefw9Z;%OKvG$On&=&^y;>70up)hd7Kc`9GiN2{|6_XZ z+8h|t0|=cPo8*52Yf>u0bn}D~5CzNbXG#S^h3T_94FZolxioZ*4v$z-`g0;gbcl#J zSY(5hp_esaIGAFfrHQ}%4gNFHl#S`0(WfeM=xB^)Y?{N)Cr6`X6mO7&-LXwBdY4fh zQgA6PZ>~)#ryVBu#t6aZu9+vzQVk!M*Vn1S=XCD8swkbqi{~~ta^s85y!i^`Z#d13 z|Cl_)I)R|HG5?m{ZWVk<P9>6iNTd60LX`^n4izLjD7r6?k2k>1-mQvRP0Ctp-!XS1 zo|v$D=dYOd=Q!&5@^io7qhk+<kyFFi+Cqxi<3~oL4%y(vNB>z3%Lkk7%7u|0D>?)1 z8vi^Wo1~dn+IP*SG1<4NF+(d^CKSeD2(qs09r`KOJ}JU|EhKF-t75URh2mth#^H)W zA3$nbnEObJ3XCt7w)v6c)c7cZC%m$H>`-y4xue*k6@P`umcL_47cKNa+45g{TIEC5 zEPIP3bdBxY5{PMSw^&J>E>&^a>J*GD8^-U}bG0Cxd2#Z2Rf|P_3XoUc^A>dOea>sp zdu8X|?g>HAIo<+o?x6NDShmX$C662m-|6J(R4R(JQ^c$zW&<(nb}+ZfJ>RclnH_3) zUqJQ39y;$!N<_}br&9a#zfBU=2XDUwMO+*fXt$iBCY^^+N%v1?$~qF1rfdGNA%5!a zGm5WzZOv|fEOHqZbz3XXQ<Fz63VpbRHz%7^D;oK-M3u?T@7<60BEOAZ^|3KjV&6}x zy+1*RAZ#l}s!sLUy=sb`p)$uq0qz~Qp(U#7G<EGwNdwlDAT4X$fmRJ0Vlh<@<$9eM zi>k%wms0yxBl6V5r3@`uHh`k<V%>2%Hw}Lg{yDQqq8;0Krg^hgOOT~=@k4?PQo~Ry z(T4<yq6enE7Gdoa?NO4l>S!A+oi?KHB*;=qwR7X;(oA>Ax?49OF@MmlY3?zpg-#uV zU}|BSxRAh|bIo&qEE9dS!9m8c%Bkb1p2ysPV(dv-hJ3O~Uz5y_kljr>f`2hl<|nZp z%^mv=FJRNsWkPcnu6Y{!_Gz|F@z>v(di3S{Xgh5UhA=UHMKyM~YwT$2hL<_KeC+6X z8(!e>8sXFZJz8_80ch3<>DEST@e!tN-{CfL-*%}RHMHFfY2Bl9n^BTx0C+F1^?uzS z{mGwJysJVhL<8YbQ$zdgKMYJiumdTr;(&L8KRx!H+=4&dcT^p7C$wGAfJ-Z|s{)r* zU^lhliWh(CKfRo1Ve+@m`~uIOe|XzhL@$1F>hC|Zj`-S&+g&@33kh0W==||PQs}d4 z<X4!@;^f9J#8$%4$8iQ1l2$(ouT9GR3&~X;H0+K(JP7B{&iD{(y@yO|RfqvRR_W@6 zD}21G_8rQh_*MJLY+D7I7z)9G?^0iCO9{Pn-=T9v+E-p|0YvK(!H)-*u7jtg<;8z- z{=0}lzWpIOiQCWO0o?uj%DjIGgVDsGF|#@F?egh$DeirT&Jt-~IcEVxTPA`}uWKDV zEiG^T{YTFr2KlZH(MbzyUGTLbxY5L*T3`<1TISPRrnsF#mIZ}~)-4{N-m-P@w6whL z{J;1VG02yjSX^{c?!dl7XTv?PuY9J7Ycw%P;pV`%+o#v9xc41W&F|h<KF0!xwp0Y4 zUiUh9T3TLs`4=xChVJrL*;9wqpmGgT_l7BOt-5Tor<-7TIIbr@DzR$**rD8{Tcd?A z0m0Un1z7aa<ILPg-a-BGz6}N*d(`CVj<Bvaozs#)8-rOTWEmVc7})p@LS)O%&$cMC z)$<^WB6s?B*psAnm$FlQm8VmG6-f#Xg%AWhBc{x5GqH_S@*x=5*aeCCP<G|#vnv?b zPEWBZyYg$m#^}_?R?kD;6iVXvP*%d8q)P3gboIK*GpHxUPa3g~2LVruDJ#1xIyQNI zYzhqA6qd?p1BR9qL$*;2&5<GPO9kH~8D(KM$>B`GreG3`<}&RW2pvsAkdF6uqI42} z*oz;R2RQ>A8Dw(m7&y@s8M2KS7`%Cgv@a5KwTx@f!*V!-F&qqr(L(;rLFkGFb*-;4 zDQ1#lRvU#Y7F&fBD=vvwSzg?-jL{O~mgP#jWm%%-#9!`c*}OYi9)&&p|FQQi@Nreu z`X|YRPM;GXK!5@Rq!MX?KqID7U;+WA8X-u;ARtjn3ASixCT+a7m@+Lirp2m7i_iK% zx%dE;3#A~WfNgmx1@YpO;PugQs)#SD7wG@{*4lfYb7oE+ZPUWN_un66zO$ceuf6u# zYrjE;_K1jRKbUKs{a}`Es9ujW_9#tu&I@(3LKeDVS551!EV1sWROenBaF-q7>&R0) z2_JBW7`gEEaCcLUi6dC@UH)e+Hh;VkwrmHP6ywmUo|$sc+Jj$Ati*4g`rwxBJNjv2 zR_nr4hcKUA7&l7dwAL6{y)Qx^+h~2wqDOTu3&G43%F))J$!bysK`=+cIhZtMhv}z? zx^WuBU-Af%g&@uODuij41*B#M_ZN6&aFn?I5fsF>TO^HH7e1Z~8~7aSDs53*`!?^; zOO!A#=ngQ7H%P(83K+Ac%kfRp%njc8D>)ItVIbmMXeA+J-M__V<Y#|XKgY~=HxE)| z;_|3!#4PA-xq~q($W@x5Mv7Z`Q4VFEG7IB?R0c{FjLTo;%zaZ+wpwK;*ROR_hJ3`% zVws;H-jw1v2kC0fV{@_$15FCnbyKQ>p>#{w;6sN&rYF@tF52Xq-L^CGIJ_v{I!dCb zQ&Pi=qDbLEg;J>Ep(FIf_4Y(5D%lGPnQRn*Y*8xhF;ic(&JBpxsga^}q=-BcHG+-T zlA~S-ekgY-C8%|DB*+Shk(p?L+7lAw>$5qbsjH;4$W6EjOb6p>g?5A(?~7Gq$Q+aT zUhH4);r6o`m{?l*I7R+)c+BPTYIHJq=V2?w2X%_3fj`hy`|zpTdR(QwY>l)Kb>;n@ zH{Reo-~qm}E?l3bzNLKSK_1^?3fT1DC7JUhcIwy|=A2|dODbExqe~IS$a={z!tgP_ zuH#)=h%NOjv7u!o0=D0qsA-9sJIGcp_NpzeWMuBpUpx-2Um9&bPK3f?<`e*9<z(R~ zR(c5;G~*~raiau-I)a;FIp>OOy2&jrC*kD}?BE05=+(-v(UDR;N!g<#p%&Xv$Av;o z@1KgvOQh9-G&(kHub9G{-SFMWZ~Ku>qbI`6A{d1ru}1IOH^aB_=6mqyCNA;ndobIN zys__C)pU&^p(YrJN#-BabU1;sU@GZA(9M#p62&xJlT6x@<R3w%X;14cnQIeOgA)4@ zH+oWWF2-Ec!?<jJIWlGc+5|FngIANx;xr+>rt-xXf`IhROMcA~b4s8haeu!lNm5JV z5)6eDu1w`j1vL!_E6tCW9O;t3+3;7&CAA=vV@b0oDZ9PAs|#~D>47uKJ>Im5f<TpI zx1VUrhkDGnFhCMFMt2?M0t}%0%*cLghUX>Gm@r&klCQC0bpw<pR%_mx35IkjZLjUp ze5Fq#BefEed7QhI&;IE7DdgDdZfMO8vLNPGz;wSUZ{2PO``x4>mT;s3%ULPu=?`;D z>}GMnq`myQW3Fi`J>xcDrj?s{oYF%$iEjO~>yl{SINQXn;Y}-7$YTplEA?K`IqMJh zX!J29F{5zPGBUjr5is)QkJmM|I8w!~MB=f%p>sMRvQLTF4hsYCHZ(Ah_%JBkk$GqO zaxIT4PQyplow&m=iE>Y5S+FtF=i4fee6wuoTTX3iOi5)UuP_&Oc3lSa8$Tz)J(SbV zu;A;sZjCG@jY2qTjtUjT^5^0OU62PspcmyNwBa|#O5BOtkZ~Bn?Z{f$A4^)2VBy>_ z&U;wNRMK!zo)T!CK``U>F0Y{@<nUH<6Z#>^jRp8#&TlN~&9>sgmWO=_;%?H$_1sfX z@gL#dnkFujIQRGzuZOm8Vp(0l9jnPtN-J4fT_s#l5^XY2a5CeQq#r~{er4rB59i|+ zd6@NBH&|NDxm~uidi?Sqm`$gBGKb*$Pa<ySSuovvke1Fjuv846xO=t6H|>B_lbju^ z()deplT<TU4AKZx0IXeGYf{VhBaPb&N*E%J5V?;-Y2;?IjDyq9olK1gOnO@JOM3Y2 zGrEu-hVr`J86g2BQQOo<8ZNg+ay6CELrK`tkG2W=`VBqI*%enDSzHeL>U6A@R$s#* z^ftIEkR!j3<D8onhjia66}><sv3`A$tz)K{mR4>u47s||gGpeVXh8eEB#+<iLazRz zM?pXIA;zFHyDnWbctgmkfy)KxtpcIm3#U%>g*N>ant)p1k@-u$N)lnNTdXY&Dt%W( ztkv!g0>e9qu~abXSPz)z-e%g&t#HCP7kf6AR(Bx%xtJfuDyb^gzFt<?2&<zMa>;^; z7zY?QAdGX>6UV2i?x0jKOM2PuhgvGo&80>D%hw}qe!zNBz|5AzLAS^m3^x`7Zb@4t zC>8EYW86gcO{Oc5h{%(H`({m;5r+Zu1zRs0y~`{V`^&Hxicm;2`S!)N9D%Y*YN^T% zTdS5Yt?owBiTm|8yFHnCr~6Q0ft6xBw~C~|^s?U~CQ~d8e42)d@iL%@+SU^HG24pQ zCfoR4&laa?EB9Kax$Cg{U|By{oAdRz$cSF(k=_20#Es9R>LAFA@N>Wu7h|p@Dkx2_ z<p{wGL>Q8)Z`5^}P?qgK+UYlR537+Gzi;KQ5wB1gVZ&Sb*IyZESUDUO-(WMZ1`S2c zT!@pGgp^QppbQgBWS3F_APPhDafi+w07!2;-1$!q67WOR1_9#oC*FAuqA@hqgxsQW z+O%;l9xuo2X;CpvoDExJCa?S#b8j^&Su|hY_J~DoROM#!*FSspBtHF7up2M*fHJQB z5B*9HY$$o2ryHSBdVXcsZHGoT&ud~J+QZM>EM{u_E1=4~4E6`;q@lHlFviE2-MU$$ zDszm?N*G1W`H9{oOi>dvsdFbUcO2plJPd5-tltOTcD|g$3(R1lx8_rq=&ku07`_^J zV1p|5^fVUEe9(GFukTy$ELEQ~-8s*h4w>$a82=-|Zm+8uKeJ7`vqvReVHwJT8HVMy z*q9EEs@ljyzC}}w<~{-0UQ&gk1V(}^85!7W_F}Q!(@l5}9_mq}u4@<umkyZ?wUJ@o z4o0+=biENjH6<K2`xkAZ0;Ts@i<DVQZTQZ+T{+7k8=+l3%oj|^6ct&Hm-HYJUwAR; zAD-n;s+5S7VtyG{-AS#gFlCEpf5P#XY-2CVM$mju8W{yx)g$5zI|KeYXl@girPb<# z$HkB-??9L>VW0;#6W|{$`6m?$9tdC|4BrUCCd_|i-Ev90XDvTrKQIe!%aiQa%Pyxt zxx}n`gmuSok|In*7kmX1DGa{F9|XBtb+J*9*_3N9!_zRcb1zrmA`?BBaQ4~fEzC?b zA9F6xWc*uOK8bun7Y5}XMm&~=3FCGv6okT+SoR72#pO4v@yo&0b%F1>{gv7NX}Bnv zK|AN#U>GN5`+4>A8alTa>B7l3=#aCaR@cJW>#79$s-TmAZWUBx-7@2>TZZAjDZX_; zcMxTc4f4pc`b+Q$m+8+qP0Hpld;J9XQJkBF<Ls#h;39nMI$DFIi-It$vbH>zo22Yv zG)Dh3er<X2Splv=EaLd#KM+b6FLM+MPlN*;3h>Q9(#sI!e{5YgBLrQ{w>?GK45x&g zq9l5H0L(?e7+p=Rz-6ksz+-}@KskbSNjW2>oS`$XB<K)<j&RXn6(b7<y)Z;-HUk== zOjeCh=3`7_LP~#P*(K-)E%6(+k33n5;GoHNeGBCwTW~&S#Dp^Z;3<9^DY8a(CPjuH zIz`sd&ZNljL!@XKnO=zwmi7S-AfSr`t6(E;K5KgadiEn>+20HomHpF)j~*|I{-lkL z<<KqTp?PUBpg+Y#sVHz<(@;9pWWZ>Jv$R7EsTmxh6w7lbfI>9Qmq8={iJ`|2X@Uec z8K^w@T=_e2oRcQ}QZoT&8L^uZsA7nq4(A6Qc>z^GwL51%&ll+~vg+ve!()LuGJHi8 zvlA=+o#a7WNdu-CY&v~oH{{}p`_bR57O%ejHv9p@$ETW1(6joy2B?X%FqzLiG%bkD zJL;IqS$M*p+h0=whY5734>-i>P#bWF(V+%?QnIn{k;c9Ukq;9sUNcTCn{KROW`;aH z{LF|iJSAN2Kv!th{2x%%keX)?n42Y2pUMES@0p&fM5IrlwQNZDR&L1sT?T6bCR;f$ z#$|)Nzp8@8$m|WAtZ2^%mOUGCWWNW;?Qq;Vk!y&gmiK!t)wxG7GO3JWjx*A+#4`58 ztaIbOO5EcMKj7T3i9yZ3sn}LZzB1&DhS)-!A8^suNVEwH-|XB{6A+ZnjD|+R(kw(* zVkyydI2n?TFE~D`C*}!?;wt*um=L{8wl^(f3MoM<p6xHo4!n%apM_T$x56raZPtCM z2`&g@n;?X_&)~=)dfm0aUS>XMWf~x!4qb=ho2CYm<~QRRqa~XDnn?P8hj~Olp#mDM zk&;+?Ju}k$m0D8@pQdjjgwS*cgRT(kW>}hLMAGyQrO6~zKofFYgB(m1c2(e8ghYwU zL{{Bdk=f*7%%)eOotb4sHJ@aTzR?Iv!@3E`OK*CKHnh-Ne1++Ni~$72)Y}AWN$p%? z`8@g?*R*9}yih;00+|ng`-U}yf+2^tg@PeRW@WJ1kqWa?TV#Z(MbvC`q0pPccJHAr zH%A78j*wyo-C2@nRSar)B$hRWXy#ld%lc>3Y^1g6)6DtDkq6yrnkz?4^MsMpjG!Z> z89{fN<_ROExjAe{xWQkS>|GP_;iZj%Ud;tT^Q$(K+6-p}Q}uY4yfCNYC#HwMS<ud_ zwXv3A74K2GzD<XS*gd1$8gt)bTefX2#qO^z*!ogP1FHlKq~?=p5Ph@aFcp%P)~3E$ z^&IAE+$Vi|HAugGgW1pt#m3;#ii{^Li~FF*P04%kD;>H|xzNd!%NlGSj#6z0;WBc~ zOfg@!I9xC_PHxUH|3vOIoXY0pEH$s=9?HzzT#f{`<XB3?bVRzAl!&|9JaDR^({fOR z@%R)EN)Iyy6QL?w;e`LZ{CM*L%*$ZuZlhohY%N?}j!cF*N)El^XM-a3#QHyD&yLP4 z%bvT{YVi7s964=fHu$G2LoC~q`0{HiICY|7bnyI6pABvRj^qZI7XI1fLM&Qs-WLo; zkg~W4ob1TscF%yQ=Nd&NZI7N<Z6gQ#iPa8#hUTWYCpA1j)uA)2705F<xr9#+v1;)v z?Cz0Yz3M7WrqY31NT)w_4;q~J(u<H`ZvDkundy~HxIcq7a^WZq<VXcA$FG!>y=yHv z*rKbLx4<2_rtqWNb5f8xd^25cuI%jMY?{Bhbe$wPw_hp<d-o!)8i8xzs*#z<YbN*S zOe09nAH$!I$mLHnPe-OmJ;ln#O$II1GnZGE<Q9V6&Xvu<%=$)EK=$E|B5sd1zjv3- zJS6tvA$cqZZ^1Th`ofw#`OWzh-P|P1<DBY9n3w<3u5gZ<3L!i=G><cG?()1Cw(jBo z@};OH5);oug~LG%EPBEzjqQY;*!YFxZ_v6}#!MPqgRulR?8U0H-LV~AIGBMTsW^__ z-HUyb+3+zqe}7}RrL<{Fp#|t#itNQ}<c2(*ZWRUBBP41Q5&dJnDfOhYds7dMSpGAg zztAuHIp98#zO<8GnG%;LJpxWGs0UoZ&N<P>+*ixwa_1IKh$fb0k%S#Z<2t&DOmVO& z3rtJ5Qs`Y)=FFm|s~b&to8X{9-iWNFB!TM-I&!C><zOpX3-x$n=_(MwFHX_w1S`MJ zYiT(z(@k_m*ZfT814Jiwd?=HdO*H#`b8pGKn<&#c@0Lt6k%#?DnX^Y)G&`QY1BycQ zlyEb<xir@$W`e5>lEvhOyk$Q?@Q5tRq9%N_;N`4QZnUy%5`(exmBEsh9eCY+s|Juz zaJ(s9#}krEb{#zf2a+FRvEpzt#fs;?02e;b1et_@-;;#jOE0qKx@RmIz{di2x9MYy z%l(=r?zr6h;F4a+<tT`oue&Ad#=hl@&Z#!^(Wq^^wk2t&dzUbkpg11D#3<}|+6Z2} zpIHo^Xd(MOf<P%<f*)1<mx$uOB#;91|0Ro)z7VD_$C*WLvWH-Pg1Ps`KAQi5@1Oe^ z+;*xGH}z;cR2`32I)D^V44GbU9Jbs%&D)qy+AM`fpskm*v5ECo#u*}d<t(sy(yV{F z6X`~^py<*$Rj`OjsWf%jg!Fw217S9$;&d^-sT%pn`WH;vgDK`WtmPyds4*y6)vEP^ zsa-{B#vmIY0pD0O1+E0FMBP*@7%RPT{-8V$2#Zta*mckWJD_Iu0{5b=&O$*rf3ZiB z_f&#tr)6RO;L}<i{<Y)DhIK3)<=wKR3ATsafVmtV>yu|Uo*~u~KDOe2*~ctW+BFqF zb@BPqaU=s*S2A8WXvRG&(geRyb3^$Xb0<TSpu}}TM7j)<qcr)&!fd4NFWnVvrpDbd zT$*<?ev6GCW8>bV_ZgzA0&kmj>9sXJ|0tBaHM^CTB2~vrFXDogmiZItx}zVs4wtQL zhX*N4f_E*w>B;mg<YxsP;a{gSePD8LLzPC7i{V9C2*0y>F+BZnxET+#GpWD@qHS{W z`Vu*=B-ej>3oa@)CGlKq`08^pB}?7a=W`pY+s$?BZFbfi2bjZ*&VNcMlwD<LC2e?f zDIqQ!Q%PPe)R;fp1b9-$CRX~QB)c4*-uh+uQzV4>I|oxM#TIF}y-8b!xN2jsp>#+~ zC(Gg(pH&qZNa6S?lHUw7EXEk9wB9&1|0x?5OtGEs+(L@ACuo&sW~0lscc?u!8FLe0 zGE^tYNb?@90rS2F(Q8PDeQ!EU(n8*qP{TJhIvsJ>3`bmRUrz;MWVe?rT5O4xyGP~b z3B=Y8YnpUe(~!Y5_8Fb$OHtH{uGM0x6)j~%qDh2;MAXiAq+Cl<I1m%YWH(m?`IP^x zR79$HfKhx12SaUEC;v}XNsWT6dLfJF^y;(y=7zmExAvgMEA&_j3j_axQz_y47V?WT zU<vE7CV|-K$Em&9pI7mhUbsr7UziqW`ogLT&{QEbRZE_fH$zSp^am~x;tg>XNU<_s zn%}G$G*wsjGKne}?a{qS;dm=3--aQSRU`{BhqP=;Q7L&LQ4=}}TR$9mxg9PIrhwJ- zmJ~INi2l@Ub-{R<_OG@QU3UmHlp5Pm-U5*bHEms(S%avit+;eXv$^Q{i9d72{Cx6E zqd_Ov=?G1YoKUHC*bop8GM$Y^CKd2I4f#Yio<#OmAz`<4K{M?I7R9#T(nZrjMRRsw z45pY|QO+HvD2#%eR6u$&U@cl~^8!j>GhAwODVR6RM{2ixAC4&yBI)mSxe&=mTl3Jl zu+^C6%GeL$q*DYd<##1%TLKKLM5!X_^a4lu#luh@#bHx~X^9)|HRGS%(6(Yz>_&Wa z7Q0x(a?j>2$M*02mZx5RWv-YH%Sr>(Q;Vpl#5(>=h0y~3xBC3QW*GiMiCuz$@7oa! z<%D%Yvk?2oUuDI&llnA;rG5UffUWlF)^@Fbsu)fwieSmSG`mz+_uLhG4_1S1S1~q1 zQv}OXl34KridZ0{q%UY4B&I_oH<A53!tEw&yHWIRFLORp<-MNWT=%ml2fM9MyB@H6 zzAM%W7OTQ9mh^zCFGT_7E<k(B9fw72DBmRy_aNjj{UNr7#;OsFa}Q~miO7~|g`}tO z%nGU^4l>hN&j7@f631Akuad3<*Fj6OhA+FN30~KQ3?$uZ5+H6XuEOVMMW{EaV6Rr# zo50cZCQwGD`T6-Pk=BIWO)ERFUGMs-@`*_*xl~J-_r%l}+gvZZLj0eN7!`)>i8hAs zpu|c#_@fp@jn(5i0Ee_n1u<YfccStYi;scPj4q0wny%Zj9GXq}EZtZt#I97Nod?%| zo!7LR@zFQzV*b=TErs+JS1-sl)r;`0$gBzN00%y?+z(;HcQbW)X9qZii{`F^14lOL zm9cbDFHpptVRF+Ws2L8zTbO3B@$qgXY>y5f)C}8q&;@4Z5|j>7=cxNSwkZZ(j^94+ zGeSL!l?i2;$bN!jVsqV@FBxcAc<2<8aklAvQj`}FhTWLcm&)9Y_-<${!Wc0$E_%=_ zZG@4+&>9j3_!L(U9DQNnO<wi39kiKBYGx%tBHHF3L>^KxEu080i_M<9h1)*ZnRHbO zhtaHX!}tmK$-P4Et2DKB?neZY+7NR#Jh%-EE)aq?BYC{->Jog<c7hfd6;mwhr||fG z8PY&H^>QuzY^htu#L^C3f!Gty?wrpUyTSN&6sq0JyaB0D`rAX23cp$%0@NeZy8M~B z4p0VHEEREJP%oo*5jkNO=MxNpc``yvQqHcMMCaPfu@#Y5Od`lIf^DH_fE;cQ(h2wq zlj^T<`~YFzQ{#v1Hfe%pyoGYG!Nk*jF(?r;K4&Gk;nhy{JX^M>`*7buLoL(Wl&S%L zVayVWWiI2Jh(T7Ue?VMnQt1^)6h1It2_h+a6;yJGEbj)zS6X|w3A}K(WResl)OIky zDsDS)42-%`y$v&&?#f2b%<9DbjxN3nsZp3KY_GdZX{}*JfG+lLyO)xhrJPU2v0QR) zzN~hpmUP$iLV~U<g}Y0-XUf+_hVdR5S;dbk|5Y$_|4VrAoqkEQnMyD7MuezTp#l3# z`7TXz0US_an^GyX5{}np+zuUsOKz~`fXhILd7vM&Y;zi$?2u^T<*bkZ8mzr(?b-1G zT!*Db76;3Rh?36z0ZmXQgu`Zso9}KTH63QcROCMC7YXL7D^iUF?1RKIVG%*Bc5sEb zwo^<vemNfqXPPwEn^?St5A-6dzEldB7h9wlH*v!);DfbZo&rluC|;peOBHG*rQVl1 zDR2#K=QQRqXEOm78A@WOyAu@v9^h&AGBc1$Bl4B5!5YuT4==})dJrZ1ClojLrl;lJ zjQrtOtBe8Cf?eN^rk&$Lfk{;^0JEv;I1cAtQHYlLb0G&U2pI~xtbZ}*WJyqpYI<4! zA}ZWQxyZ6MFSmb?9{Qb1GkY;-eO+*IT7-cVe5S&kb%RNr8LH0Z-qph5U>0~<el8Lz zD$5K}Q&N3(I6wU)MNe0iKxJwE2wQ2z;*i@WodBXbZ6{dNU7=azR!M^W!IEwL;0!n< zD^;|Ap2WAE*LjxMp8$2knpIdIjhNSAaJ8EKbVhexM~Kr#i#;R-<Y646n<VW7Ny#Ed z@n=Rru_mW86H}EDs8_U2P1R0X7%$XDO=nS-rGA!NzaEZBgJcOYs;Tg2r*0cTN~YR$ zB9{`Av@JFn>P9fX9I>ecu7S}=t1Yr+q|P+qor{v-Ow;#<A#3_mAfwgaO~YYBYgs=o zcjbs!_~+{9o?+4|qA0P#j>dMQpl!R!sM)(2za1QDM{Ae&x(c|vaTtyWciVjKwuwW# z@4&=c!R5Av?8@7=44{W>onL3Oq-LW_7ZuxVdvNIv)QlcnB6@m&@%_2QEyK{nS~7wt z_7I0>sBsPf&0c<V)fLir`93(D5a@k^?g3k#MKCFao-t}J5{yM%3<`tlRULT-9^ENw z3B~3a8iFy;P8E~E3Fvdf6dfvb5je&Z1U>x4KMDuzTOCsJ16Hq@S;YssaJ%1--8Vkg zA`X)2W?Wg&>y}=xo8>`0bSJVmVQQZRW=JuG_`v~ywspmU=8nCA@Qi5jdL3b?(a&RA zs{&~ehti@$WLoMGP#~~*OxeV0P#j8Y&0uM%horRzJXuPDY>7=`YvC43j1G~6sYigY z40zcAUe5Dp9{)Z}#Uk?_q|ZnTJE54ny#>N5s&1<vOBNk#mpon_Cb|3xAb}4?Em}BH zh|%O1@Z*x~W-eY`k{_=hrTjpa8O$&o2J07wY=%;qSenogNQS0DVBRxHR)q<>nt~^f z9VVsi&!cfc)6XArm;~T~zRv6qEuNvRgzOE~o#mF1ArMuu^}A(gKTj-sE>dEw3j_R$ z05K;b?BK*uVXz=k*2k1#C@Eq>V#P0&wt0}KTLI-b837uYx`3Dt>`bOxB6~ajlG0u7 zS(eJ_5PP~Lb17<tf{ZeK6F=0vYN~2DpWY;_T~NV5{v7hjEN%syw&H)!tfDG+#3fe? z`!Roo6^^cp{q%I5w{&rGn0j$q?#y9W%Q}NlE+V_YxgHRdyFg#Gx&-sr{rE1Pzm9l6 z32GZ1i`$fg&5Py%Xbh(PVG+j4$cHlCUdDzo4cf65SxDs|woF~<dR#yspg)Nkc*D_X z_AT3yRt;?|y}Y0sO%~+nBY_o$GD%xHF&Sn_ZXg8vHyh*9gQY-BHHi^b&6^<c&1BHF zs}tGrNR&xo@>mB>^@Suxm|>tXpsZvNoU-v#q4=o?eP`aXf7Nd2;82y@mZo)92_s>< zaiXb`oWx7SSE&xEVu-{I7wQ*^&;He}>J&{L7WbHDGLTb;6f;R6&~cAE1syGNR8}J@ zq<VhJj@-LW2C5Qe!hOz@J?!gmte#9-d2yqT{^JX{QqLyDUUV|62C*hftnyr|&N)to z^1KB;<O5<)qb9`f<dv}oH5Y=UTdv{CBu+_zQ5+IaLQ0{!00#zTix!GI!ZG>Bbun%T z3Jq3k(|z2#%du+h{5U8V3D4cEL^8Nsc5TPD*vO4GfvWs)Fy04jJd=Y&F=JdNQ56{D zCS{B}E&rBaSbvP`f)|W&lSXV37;;(~j*@b99ST0<$r327(mW?u%+`_I7Z4PJ_Dj5h zYGaHiE8AHpH(%LYs4<H4#gc8bFsRnn%CEJ3$j#ux@&0@YZ@9ff!s^X$qCQ%{q*gcv zQt~xOTc}FgqN)^*K@FmF7kd2(RxVMlW_f0`7TKhk4PC%APRDTK07kBP6B4UEwkWA8 z_%v;KzV8vpaa{DxPEmsNIptRiC8P4&=G)Rcn-GTvbr8drP8uV;<)krJ8kcf#Dyn5c zg3hAo(z)Ci@qqO5x)B|cBgV+{q{2v%^j%It+ZN|fn?+$XiNdIp22X{dvy5^uLKVhL z&B`i_8c`T2qcCO$C8IBu%nsmw-Ne$bl}kB=8%R^<Dyc>rg%M3eC`r5Y0({~a7_EY@ zE?<t6wKsudM?sypuWTCo>TcBfJY-BW61BoSIyf9?%l%o!j(zl~ip8#1(x_FlWxn)b z%IK!ta_C~M3$UUovFtJJ#TxO|4x3pjAk@?vUq4Olb-+_2yduOR&Q^?R%(TO|Ss0nU zpqP>EyTwS3X-7q8(Gp$6X3$wKXBzR@ZG?XjeyP%42Yhz28wWk@psOi&lS;197;vV{ zHg!?+YJg9vD7Vu&Qj}juy~gW+#rcF~GM19x4S9tUo(W@*cWi*Ce9@!D7<)6Fu@~&P ztjPe=O6)yZ0%?Q2$9oZW#yCLra=$pXLGbOe6f$o0M||+3x=yOW*D3~|*d+2Up$Xp- z3LhX$*3VqrE3G{fjAo2JW?LUH`ch)_wdA>DkbaVd8huIQB*E3_o4C#_Y;ZZLB|ixv zD4yxWb+s?imQ&-3-D5x4>v}dbB1CAl7Y+q7_mKlpmo$mF#Dgr@OaU`U4?@T=7JNTQ z**1v@-pVlCJ0H(q#_t~co#x05%ta+R*H*5rU^oy+&iSUM`4w`2P1y$Rn^hxrXsdf8 z#jTR~AZmRWX(l0Xu=7g1`8<M%n>eIeVK;D+{6HKmO0UH88#FnRQowv=e!pVZ@Y11V z8eE^@vxVdxyZ0nf>k=_*=JVFQkAf%RY^xgXz;O+8{7th(#2T{DB!Z?YGKf(K3Xda& zI9>=W6w<4<PZ*}d<BZrAkXQ|kx;QX814OJrNm7NTd_;LFgyM8>42$dhKVts@CLzKt z4if>zBP=)uR?<hff7$Uf+mGXugY560h5I>*rn(T;F^R_mMrUD*%wTFbnP4h-mnWSt z?viRisRlVMz;-+h^M2#d5^MYu1H6u8$m04Z1`;dyx~JH>)5O-Lbv?~nfWauqw_FLS z%Ou8rB}H3~;2N0fP^ok~C<A8*-b3Olkf|`g;0!?y)1lls8J4`r_8Jg3aGK+6CMwOx zZ8nh!7jB1<x~&S8f>S8PrGRUo6w*L<BR;2(lBhnrudW8))lyevFXpFoh!@xkSwv%T zGXaUFnV{UViKS5GMC+R&7}jd`$5n!hRYhDBF6@RZU=n(_WQj*su<rwUnL6@O&`0Kh zjg_5oBCvroV>MuOB`pGcbDgTzve!(9OM?_i_ZRH>Flue*+}$KFa2kYjaTWPPNU_YH zuqR=!St-_dWqt{>;$E@}>82oC5jr+pe<RSZXi|GlzqXO&4m2V;lOn=^=k6<#Y-_x8 z)!$Cw&IwgwE+Ikz`7cpXnl!mkn-tCRGM@Siy?7;><>d{}<1tR_j=O$a@CXUoD%|6~ zJ6=k&?($Hjs3DMO_5h$9tZ+FnQp*zfI<smxlF0$wlms~=KWgxrH93H9*F5${f$Erf zus}&1TAYCDf9XY(tj<5umK>@)Xy#3b!)eue{z|LxH&1fTs6LT>#>{x{t;)h|j_QfM z!N}C!%*<}!n(5cii9^*7`rvwR0T&jVP!%&5x`tIZR4fq<w}P2iVRkjnL@P}hz1V8P za8ey9w=Ohi`e6%cUp<wZd>j1}f2T3S;@(<YGU#)O>ntK&reGCr2Zs{Bq-0Sur^T{h z)-xp-?>I?gKJ9J<pd)T|LOW`f$kdwnXu$_hHE9P~Lvs<uXy)_KJ&5)6zxX^fF0yr; zX&Q<%NUWtOv6jITJ8!7Oa>sJ3+BcN;lqqe-5pvN`afe{Xf=dd^KLV2dY}<y+wiju0 z=+~6nA9MF&V72+C{m$E0<r9*s{Hj>1w2-9D7FjQiB}Lj?EUXA^ZruyDxw?xsPl}#O ziZpT4Xc98?SxEBUq(OEN@2vt$SF^V=<6wivX}YsCPma>UN-yLt&uTP1F=6k4<nN#= zf!DMJv~7+KdLx*9$F%~>M9n%QR#9l47ToV7ni%6@+NT^l>2(Cophq8NOi~8G;L`7M zofMib*+^kc$fkhqh>$|KitSKnQ&{&xDO7jgrf9{pdSZ_1Wp1?T^oWUUSWX)I2&C2+ zi*qxut{Nt;=MxjcVcTx@FvVgtU^uUhbPs1%zc)+9wIW(8IufV@kJ;aFvZ`|7hv)~9 zlrce2a%W-=uw7--`6Jv+&aNQ^wdT7HfP$&qfd$Z$k&ZRrzs$nLb*`^!{zNOAxq~%1 zwf@U<<M7FlgBbcFu<vF1ATF%jl#0dC*@T2TuJb2hI~k4>#ub~%#<@_U#d$m~q{S|w z!H<eZ%=eh~YNRPi8ad$s!5?Jy<#3Q6F&gk^U-p)PDQbeW%6<=_d~anvO~fHE5aHx$ z&BDVVWHpuZxyD|T-CF6cs>43cY5v%xW;h1Emh(AvB(B&()Y=`r`5YN~?OkhwRkpV} zUzsU_NTfU2tIk2rufe>LogokFCmBOyKP$UmzYAvnEQfK(B~G~gZ?7PhlaJ|2um3m{ zvN)JtpVM$jR9}V6NF~vWhzm4gg&BF(AVlPZpV$X_PKaT2da#X&Q}%Xo;<A#Rmxp89 zT!E?BAqyIuhB6nM<X0&1b{eWOY@&thKXU#l+&}S>w%1Mn6r>kCr@e@dl#*L;9#JGV zzQ^e1!9^HDvFeSu;7o>G75<RRHnoWU6&5hJQnHr<#qCk^YcEE32<=-@4<eV0uCpji zY;SdP(!Vlm;q2b;U%@Lk(bwkpuNAg`t#ET?;r{iNq1XvMmm*v7TgzW#&-X*DILj<E z$cgM5u(-cBSuH00-l|tI>GxJ<H0f!;2j()zV>e!e0jc5+1y`$cWhut;=gKAx6^nJ% z?&iuCU5ZbR1?r8qZZ!U8o~%*l$=VU3F)&Xy)1N1+VrIowkdnv}L0nR~2eE%rG(mWa zq&r_)%WO?oOJIh=R3cc#mANzNg!@t)>gdqYbR8OojH^jxd4;E{yj0a(*!L53Uz(V` zq8>3OSN%|Q96MsHjGI6r$I8~daAcwGGFBFYZEs~ZIi$)#1=r5PLnJsx4Uvp<L_xUH z23B)RMHP5kE&Y2HTxhUOrc2@muG-Td(os$M363?B7;C;u2Zzod;gV*osjICr)~x1O z^BkmOcAoQnQ#aO}HorVqA%jXt0<yvO2&r&xyXBqb;#z|P&H0JBtq?N0u-ggu>$cM= z+K-#v*0u?Sq<Ukf9cB?<)OgW!K`~crqPc3E3%M%JI+MbUCq0rW@8IEyfI4Z;vZ>@g zs8mpuhCkWMBm103FWPx)=!Kj&1?5~iqyM#&9-<)w+j_sJOqxj*7~0nR8F+-+1=v4& zHJCz$)I%WU#>=4GrxuK}5|ytC20~ytpN-l~2KONy1?jfpz{P|0pxelztg<!h2coqi zIW1>+J5nvmuG^8WGjUtd1h9KX=V9uk%_wd{OQCzS&g3Lz*H#j-xXCQ(bxo1E3};QX z;{Dnh>;amfY02#oN#5?QsU@We%Ca2SQD*5*c=VUyTWoCWd;Iaxd^?_3myJc}WZkx% zZ20QHusx3EE}aAzNF-wt4jLEm3u~f6>Ur|PB-4FkXQZcfokpx1h=SqdpguOBv2{s{ zNlQ2>gj~5;L$0`8LgJee#xMdhL<=jrp(#vng_6=s3!MMU{-E&qfeV-+A&o}~DIBAe zw{b31Gvd4}^IJiBSw0jru9W|;89&UzfNfBNiq+L-?E?|9y=D4|05a?UVdIB)4#iHW z!4%sNeuo%8>@Z6LdyCcor^XML4^=;djvwX>6^o4|Fn&1Me4Ft?U|=wpsSG<X$VCqf zOqVh0<AdA(|M;MKZ;cP+vIfows;!?nk)mRjkfwFw!KmRa`jd_2KbS@TKf|8?klOQ& zREA&yEe@KG+`Qh%;Se6@g*8L&bkInc3)AKQnmx~BXtXy{`A#4;awpJDhW?HDOG8Fd zO_Y%Y$0#GoI2Rg8;;bWFF~&KC(wMmJid{6ul}=V6jq$V$<AycHc@Gz(>^)=r|J&cX zJsoB(3|y=)PehXpiB>#HwBQ&eTE@9hw8VL&_BSkRKBiPKw1M%NlKTY3Fie_T|I+BO zYrM=!Bp&8cH_l<dL2+L*62Nqq8@MIYn^IzQ$rCj{ix{d%56iQlRUx5h8{#D;Jx{?y z!J^8THSTHSJaG4dE9J``MuBA4r&l5z+q9H{nyr>!c$gPc9-PmpHP5z$j=JDV54_L8 z{UUfhNuO=0(2NiZ16jmt9PB-Xz{W0TKj6VCXGBOs$#icFW3eH}H+miZ9+L~MkANxe zHb+9gzED?gxg<EAEI2wYr#|#ZcwnK#U4QXIygFSp(9z&VNX%hUd(eR_*;_WaO0^ql zg%~~RJE1XOsAsU;8i|%1Vr#Y`jI+xm<FHHuzUezC)BIb@o*jmnXc2q}a+r}$A2zF7 zE|*DDC@%Ob8wM)uR&P1}BwM{-32pWEw}8JQ9oXJoq_8E>MYiG+6m5I7o7D?9oLTom z^{MVsGFnO8j5o8B_5o4Kzf9&2!&C}l$aZeO8vi(a4BZOOxmcdKJRXJ{lEL<DeYn}b z93YJ<Z$*tug{DQ45$0BLaIdVm#`y9u8Iz})2oz*G#M5--CO)`EE=*YWLY}I-@U*$8 zIUq~OJx{91R{CcDLa9<rPYtC+zy!IDQdS0A#8i{*%c!W9ME1`C_K3Vkl&nbJh0+Ll zS9dAFCBiO!zNJlBXC6TW8{5#kTtcH7$3OQCTs<^?n4%zRE6BdYmzGJx$KZX<ZMf`$ z^Y^W}?XVpoI4KCuXH{@g#e&lgo^^vUA~@~C3C>}|(7@7bBA}o>BslGnf&<q`!Ljaz zf}`%jcJ$x{dK6hgaLTRVbohdE^e}XT2^lg$1ScbclR;5<MkSNTUTUU<STYfuh>{fv zj!+sQIO;AXSY+8HdrKk`EjrpKk<Becx?qFzO}HE{C|T2nDJ#m=jdCsWCF_LYV=NM$ zbX%7D>$Ru*PBP`9RQX!*O-#FR)+NyI=lUR}xl8|Po@rQxN(k)D2$+H(TUSj1xa^0= zrUC&Y>?;?6T&~*0>c!@daGan$QxHBCn}i4^E_YiO#$}cP`f&YrNZxCs40kw28Scip zP}s#8k^;jF6BVStFIJ7B$4FJJHCMRzA%+T#C$j&^AozkBh`WJ2hpiLb(`JD?8^!$O zlCa2h#QJlQOjoeAM#!|fi%jb}vns>Mq_YA;Q5qNAhQ)>3dg(hSuo!u{Y6`^49ZK|D zAjFES#q(o?pZPJlLxuaWLzCg!d)@K>=aKxM3;vhu@tHl&{Rk#=Xd{ddG57e8u%ZHs zkGI0n9B)M(928jxuQU0-b5Q<|f9?2xSS0_)NZSBoPm5%%(Pxc(621{_1&1wyBS#ob zTpEH$lBk`?3}SRuZy%h#gtp$SV=MSVU2uDjOa$qh@<A065{BByo*J%^J+*a@P+kZx zIw5>NA0iYld&6-T6eCPwl&ap#G=K>hc7R#wvW6;@9mau{9gD?gbPZpyXqF7WQzi(R zm)g->m9G{HJHvHsSl1Ehm}g1D+l3yNstMH$Of2rgw>5+6kyTdKN1LTdYYREzmc(&# z%YE)7V`9`;tzHwVlA6dWfoo)ySogvzQFp15T9Uc9GSjUj8E(`;zCLqXEkjUAM%f<+ zuGD#%BM}r+k<mf9#9l6JLzj>WbqPbZ5@|2eN^0;PfV2r@V{2#}YejDM+R@(x_jbK4 zUZ=1~AWpo02l_=BXC{wQ=$O-RRKu}g(zO#pNU<~>Y`7KFvqp<LShz-Zu<AaZ_bH}% zusVeYjBVnwfM1_m1U-W6;EjD9n_^2y6@#R}Bqy~IssvKWd44Off=0}w?g%Drb)syU zWHxGUCd*O3wKyzziwQKU+(G&%zOr1V10q;nG#wzUjW`8q-3uF$x=SN!+MAj2PQ)fJ zlSKKDuWcEtt9zuLt+MMn2Ep(o#F+@zJb19o(V?fOsSeY<m9j$z@}e6OQ@OKYnuo(} zilN?uZJ=OhP2tq0-TNF;W|&Zk*xP8QUv_$0MyzAb7KpfW%24dtWIo;(tHue{Sao)0 zwYMN_@E|ui#~j0rg&Zx5N$pQJ<{t+CV!@eD?T}@DI;><;6auU8?M*gF5z~Aagj;5| zhB(j~$pN@Vs&ngJD2eJWl30Vhuq%~%t4*7vZZI->>mQCerb*UHldO^RyLul{;(Bge zvos3_BWNyCSVBX@h(O)7_m@O5A`r9QutmoNts&{Eg%s993Q-7i0|H})#yP>8ak?JN z;l8G@fYt^CG$}Lu;T~eR`rErTRx@~w*`7uV0de9g$21DL)ST`>o(A@C5^|dMG!(W` zt2k&FR8<QWhqb3+;xbLqYI_=ZW1C!{r$J2>bjNBR1>4J#Z9O7p=01EB3?=kC;eBvP z`dSI#TduHD+<nsT$Ju&@-)ol3-ps5X<*f6%CgG=E4fPLWhF%?6)xLq-gqg23!loxh z$BUJpdpkns(i#N`Fp6(OMMpV=Q4YW#&f;+Hg?2zHlowrULP^o3ZErHBiG^&FLL%!H zX5D5LYg<UMwnZvdxJD{g>t3i>)m@YqWv|KWIwr(`XkPvheGo#oXz1Z8Yb`<}(H4}f zi8Hn~P1WAIvD0YpE(B$nQ+CO++j2l!djtoH)U=c+LQSi?loZwi*s2pZhQ+F++n{;c z+3hm`8=mAEF+M5ERmK|;xvIP5iXng|D!QcxS<Pcs_^ri{<&ZpV1x44Ixc*1#+d*GZ zg&oqZbRd})gy>kvIVC<2C2`W1Lq$=IbwiE8!`wHO-vrz)5!->%h}e$f0S6*$;esvX z9%pUt3tC8?L2m6lG<`YyI}qOul3RN#m-r+D%@cy>0r4)Hc?(MO?Us9cuu5{>umWwK zi5tX97?MmOE|Fb^l8rifgVd+ZM}^2|RqkpS2)QFrt#FfCPTa6Bz93$sAV8X6w%-(# zDrv7Z$Wb8Q$bar6@W>auK!4s{{A_Y)s-u}(Gm>)W)jFETfBlB&X>CDJ)Y$WZP7B=e zpy4pIZs8G13|vH!GZb{>_H^Il>6HgCka6A=9IpmVhwL_0QS5%uNTd&v{tC%RT0PPw z!WW8C9iGLq7lX^FP$tQw#iX%UCGK?{Y9E%l8Z-U(z_L&hvYW@`-=rxZY7GmKBz;XQ zxj9E<y1o&|6~sDXfh4>1j^=ofavd+Y@sNbEqXZe631KzN2Y(#tQm|yYuNnWlLkI}N z{WD2sZ}!j7X;Z3-E<vj+R6oPzX}LqY8+w>SN+esmqZw-gg@&9K=kaiTj5q_bDwIRj zAUQO-`OZ*DlICG<kjLYDG5p46#PAfz>1^7vZ8OI6UReD@jbqsuZ<TWW17YKH@&7)9 z&;E+ah*<k5T6(LX5rL(*IY_iBaX0?p=xVBy7k|c~m}Av)Nw)KlSBK&xHg^*%3Bl5d zyRp<Ur#H?I@L28XoynV(l%CVufE^dRnL_N263ji{3Dtg5KkA}rVa3#U<8nwv#Gnbn zPr2=l$=oXBCY4H~LgpVucf1_2T#76b)!RdiVfHHwv0%(e{khfRi~76EV-2PIkPK}N zjMNuZ$4jq`oz$Q2WJ<LtZ=C!>0AW|GI$-WiKmtV<hgQPT-Ww`SsJB7*jfOP=a~x@* zymnIx%aU3voWHKFU!JbQ^}bnur;{>3<T0}Rpp-^BN>c(E6k<&ingv$G=j%qeXimH= zgr#Sc2sbuZLU_oOT?iX~x>qJ+K(%ML-*_l(oHmvQ=o`Bp8GGruPnDnq`>L5$=v69S zu(ZHhOoDWgvn}K%@~H85j|hiMEuuo^A6`_AWlMUP8SIYud?u1$2q<1Th!c-uoiK2) z^$X6MCXpa};%fdPwKm8?4U=t#J{&Nbo5Nn|Lcs5~9bIp>pJMv?_awH1uzGpaT4?Gp zy;%Ndca+FAr9(waWWS~a@c3MtQ5!-C#=PC#Ugm5P)!LV0CN=YMg|>d_<Ox0yR_@!G z)zKGQf<h#NZr$ouov#25NmJAsgp!uSQFWRd5amE6YT!wx1qO&7rWuR!U^N5QYwis6 z)57S$ly|gz>dT|LagyA1y|Z~Ku&<nSq^Cd3r}5SiV)Qq_U(i*{4lj)lZzD`<R!}QH z@Y`;F=b2xzLEtVsC-B>C+~u*pG@j@hphM;`!e<5U$BYQm*>yd1kp{HoIHf>5M3X2r z^D)C<-&|9L;vOzzWa^Yx(|FTs03XtlmYam=0NujPE?WWFluY@kWekK9J+t*kE@CTg zGI7<dB(bbPnzaT-V#}Ah2lJS`=qu}Ky_CFD8ft`^e_^`DWh@h+8a|-GRtW78W7gHi zBVyPZ@(Pb!172wI`eY$baxMkI;01X|@g`r$YfI?)Ak+qPJfqfB4mn+E-)c?On#49d zU#iF1F?*`4##Y%1G`Ss9F|Dv)nU-HUTB^6o>ql8)S&9wZRIhd)%AFBZ`pcn8|0MDX zuo?aN5Ns~!)qRGcW4C2M|0-o40E@KO+5H4@A-WYel>JyETDu_d;j(}F*ihNA<}n1R z1uGwZ*^3rGLS93O7<5B=B@_eoMzTRVD(*IbskhoZF{m1cwGI*M$2FmBYXfhDPQs)H zI<I~&@jzp&-SR&1z^rjrL>UQn;aIoHqiqN2`Vyk&xYX}6b$nvkSB%3hFg2`2&Oq{` zB2ail$(9Qu1;V%1a1;R(u4$##lNmw;UL5q9bT0z?1&n2IY}krWdDld|g}N36rUj56 zZ$5yf9k0dja_Da8mFgCr;Jz8Wwy`16@kW|FElo6v<r#&@{7*6Y?*c#n7HXh>IcAjj zx#p^Vme}VhI$py^F%E~2{h``@QL@tQ41kHd)%uH)t=%)!Vv2W9FadVQo=A446Usk~ zmJ<BLl#qPA)=ChQ>E1|`;Ll;1IVE@%bYM`n%Xl8cST7AVHdsk<FvzM6Hq8brEe;0R zv%zX@u(IM{kR=<e&IXGW2ZL<bVD&awd2ujoq_M#OjWOX-??V^<;%F%GDY&c0`ef_( z3F^2pqT{}bz)r{Uga2r&5QlW!4y0?78nKRh7l>e_-PUoFOhN-7Yjm~7{{$Tet78QU z4l|!W-eUGnw*p|m@(~<nR9^(5o2?^=20!J(jy<7h{wJu#D879&f^T#S@Qt6n={=xH z(@D)|fcd=!BbEYla-^E{<4648)THDOH0dV}hbH}bnJ*&Q`gl;2julOM2Ld}y$`Agd zCM6DO(p7<^MyyFEf{0zzq}xN*;=_l9WN_Dqb4B*o>symzgTCKgj*_VuO0&*cUY{8) z%d2W~sIFdX%L^93h%B%79=gZ$MPFbn+c&FrWo${HQmv^}77kSx3MKv4R+MCu7sp?; z@9!QGY}(@z%YFd&U2JRNk#1`sWzIXMF+U!+9nHp6h2%28+;(St6&eO(mOc0U!BAK~ z!ylVfwthlzc4%T^*%O$dw7!v)jd&QHk$f<tY3D|Ek#k!^TIz5^y<yJYmV95Rs#u)Y zoC?fkzYeIF{JNkb*v-6la*=#p@Iq!%sLZnUXw<(Nt$t@M_6xj*<-=rWXxek6c51FN z(C^qL+&8PLtSQ#s=cb=~8>(zaQQ`-xE(}y{139yyZ`S0(K$C4CEGp_y91oKg26EF2 zZWh09R<bZq(xz1Ir!=iFkgM)Z-UL)SRQ*5phpK-8e^^~A2$O=UK9N|q(kukfH&WFz z>Mjh>!!zYq8ybwN97VG-sDVc@Sy5)nF)-=e(P}zZ?Dx8AI-JoT$z<8L_YE|i;+ZDY zft_jc8&7dC@YDu#?A_$?m@h>2ZO9_mh(ErlRwP#JD;tij>>iZ(m=|yuO>qrdX7^Ww zs%bamDl`TVSyiE`$V~MMx^D(6{<e_&1smx8iDh4uhPg{^FkGlyVviJRa{fR|yscj- z)!wwL;%xnX!NTqzEbM{7!XA`Z_Rn1}Y*^vE46!0v159vt%;%zUY;w;eTb*|@V78iB zu5L<IqY#01vG1VlJfMJ`>&#rjZtL%FO$@PfZyQ$9<+~QLZ(`X}GGwK{^f^*R_FHs} zwkyS^7k}jwA{!b9`g$xJYH}!4K*rHhpDG|~qyysSQ6|b3Fk&GB!fREqGbth#A~2w^ z!DMWqI_rR9zH>@zBpt}rxbeo4H8Q>zgc_9ZP#T4NhtQ9RsAq8_>1YyV(~4LpisE}j z^+fS~lZVcTJ>(lfZtf`jv5FyEUlr5@hXfVt!9h)MXkyu)jV2gvGcVl5TyGYX20-!d zY2Cs4%|i;xHEJEkWATuN+l?;2aG6|`#O`yXFxh0V!@x|SFBb*<N4CCD7#=~h#TwBn zM#4YJ({A?=ea0{wV1lpF;)UxW4(;Nm43>|&z;7=HJ9jEBESL!k64$R|DA%1dLiy2S zB#Lb{MxVCb7pSa)4#nhF)^)B8AE758D^~Hk!DED;2&xlXx=mgcXoj9B0ZF-k1!nNF z^^=2o;;^8eI6T;%jz}!K7oC<(aWw7guyytxL)`%RzFXE=v7Q*^Gy`3HA+JVF_nc># zzWbyXDGAo)=qI}q#_C}O0yb(J4-YXtnkn6DYmy#TY#NQ!Bz*@0T8%KY2C<=VLOW=< z4r&^qITxBnBQ;6C5B+Gf8x5jtTEplv8*GFo=_Zf;9#q~WkeeHWKUQ^R>ywFPdhA}u z)uXA)c7)a<J^>PJE8~fZrPX@A!n8Yo%QHFv`b?G${Fhluq3`M1o30wsnhH1n<Er#< zq0k+u1Mfx0$&ykWDv3PWh0LU@oBlZMKo1AZ`tjpm;j**mf2M-veLHdf2V2I`PI-0) z+f;Yy2+rWgfB3#n)bXF|SWskFbo@st32X<)Bajh$!Ex^s_G^wS+NJBehqvfj_wkrg z#+qJlgP!%-9Cg;mKhJd`Z+&jp6Mg%E;=q}K9w`8NOq7FX2IPc>?k=}|=W_T33Zi?> zS(c)Wmki0`n3GhpT0*zoPU%?6ph*dwRUAoE(MD)XQxS_-OM-^`VJ-)}<RG)meZO|u z*QQs>L6rNdd&tbbKg+SqzkZcWQJ3uzCoScyiEWG7hubfE&qL<mm-z{t!efI;-0k5E zOjYMtxqT@=Ie&<>qr}~*Qo1h~EBwyKcv+U;r~^s*?R$<(8j`nU8xNSP@Vx`{2Zc|R zsxN#?tDE66y`Sx{U4Pz>vnTTqi)U0i_`7jw^_}vqr&|oXkH7erxEr#8G;n@rX?1_V z0lU-RV2^|jz&&)+EV4_21<Bl4bo+CcRx`B;+(Esfx`!l|ZBF;0!9AH?8QAikUMUB7 z{^{2TV)hRaa{zu@@jrO6!rbr>h@4)zv^vSmG+ET>i>8{f-+q;NtdIbbM0Wd*%*l*W zYkbx)U8?1XSPWxgmH1rv17d_O?{r)!D~00Kvfu;`nUT2R0;FNwz!kc2E5AFF32syO zg9H2-jCX&ApW%Q!xmr;Cl$1q$q6@+R5+B(;jI_|{@u#HgT#&|$aaL0a#y4q%0Y6AJ zdN!%zYRq3@(%sQ@zD?JP6TbV0Ot->MH=>gB<Ba&0<jZq6Luqr97R5Qcy(DvvHBj(c z7-mG_IJ2aD(S)=fO_p-Y0pVw@9FIj_MKzdjq*_=5FDQU{JYR{^1p3vXU$^3mr&ZhK zv??}<neX@G8?7wKtl1g{?d6*hA#F9wl84#6i<ArWLebGmbE&)>ET4=_0-9hgKGUJ2 zYs=xHDxe-j&BPZ~K+60!@>hz6-@ep@Z2ts^uRHQ^D_m7j8moEkwA#y*=YEF9ttsOD zMt0_Pb9RWTsgn=3_O*zYxO-OYlnsfM>(B~#wjImCa)h1!#px!NUXM7o=8o`du5?k0 zB#WBu+BdyYl^mqA2f=Z|GVEYW0%aRx)zmfiZRVvR4BWS+NCH;*;SqLDZ#tG62Wsg` z3j0!VXzaEHCr6UCzmP>`CPF4`61m!v`#mHwzt|;%6O%}4>INh>d%;DxjJUNsb9H-W zoIwk^5=^SzaIrq`wv~t2FhqU}nV(dJON439e(x3SnMs1KXn$W~Ss4V3GJqdm!ZQ2h z&Zfwc4bfEMh<neCh%d#RNCbJQ&TWJ{WW5dY!{eDzHQaSrdSy$sOr8d-KV!uzizGm6 z=I=8Tmu1{~dx!-Qgh?gr=%3qPfo6&hrf<Vw`9pG($Rhs+GUS|dXI;=Wjtv1$UVcBi zHME@d_Aa*EM!MyWl7~rk?<Zxc9?e?n30>e@cb0EQAxSxQFMP{xE)}kE{tCsPsrMPB zyv+Xi!V?-3KtwhCy!<u!4~{gek%qHcj~ARqR3&P$x@cI^w~2MS925og6{(LhU>Z@j zf~#0-&zk;76H=yPX{N=UqD_?Av1%=v8-gcM?j&`~&CG&c>2mfgw4-YnvBoJ6)Uxo< zk5!tV6H)fEMF%mV8mNN(A{yxvLq&NYby8FmB$veT_u7I&%lYj&MWyz&bnQJ=C{~e{ zwtM~ciIrMasjWO&+=k#DK|29$u{-d)W#AO;ofjNs>yS5~-2-*3%`v;V3|wi<{S+=X zQhFuctKtnC{v93AiFm|wJva|myZbW`vrVM0tJ=ohGEm%>8dXBebM?r?YB-!tm4|OS zv<xk(i&~6A6a9@pE2I>sY*_pOR!oNuW&i@?4?H9jF(AU(?!aiMn~e~EaGd;<4cCs7 zFB-b7L@g{)TjFk9W;Ca_vLTn@y)8j?#6Yd5@;ZWRMWMDHM~wbt1=t~{1PS<$Tp)I7 zxAK_aKM*>=A04XmS`8#Y%SqBlhQ#TWjT=hX^)-@@K~A?@F8)Q5W9JBej4WdtI4bKw z<VJKtk_gOJeuqlIYPL!6bv%g5B7`yBav}dsO6YzTC9<DGFyWNpU}EJ*;erZT#2k9) zi(4N-1Y0`{IR2dOOWbeqSuAlf#SlnhBd)*<CJ9cIlrTfo4{x~XjXg?lWXR;rV+@OO zXQQ@Uv6UF66eM?Xw{5sb`Zhvr(ILWj$zdvcfWkic(P)tr8CpE0AWt2qgvrhKQ`pyn zS}Vvf7qG3&x*;Xn57t4%(C!pwEUjN$t$}-aQ_2KiB5X?+^WoR@Z41bYRS4<}zBNW$ zluI6t*2shCr|h;4z5Sp9<OP&dk5Fr-3G7vvR7S1vK<RbK2C8TcJ{Q7tQHN8ngB)J# zG}B@DDwdN|;c6r7jAm+8&2*HFt9psDvz0^zo5OwhW-ZXu>ZP_}^b+|7y>zY!np9ol z{;_4e8K<49s!c93Q2p5MEu!7lE*gZ!LObHBgfb$O5agSxC%>BQ$&pBsdL*PSTUqI$ zn?$6rKsJtI?Ta?3m7+Pu4_EuyhdT=TB|D|y?pKofPTo_AEDP!z<q&(rQi;n&){-!A zpx(Om^>k=wo#GrQPDaCTeWvq+9aeAHfUZ|}BZeO#E!1GkQS&ccpJck=RJ{}r8EB}k znZ`P_K2*E25eXNv9Lai_ZL>+--J5|JowDI0W5pfjSZTfkb&~RM_`T}{(AARN3O=d= zNiW&ZimnQsUZY6{7pS_t^KX`j&4_s1PDQkZ-Pps_c^zw{)f81L{``(Vv&f0X6lx(! zi<&YA5pY#dgYPyKlD^*MF=%VKLIq9;mtFS@xOiRVxsS@w1x|gdo`n-5=*8UNq%*Lt zFoDDhYfbAtOY%{p>PoUsb)$EN?DLux+*ZMiBn&inx=Ow_rjkNu^TyPX3WUJEUS{2! zhNWkswD$Fqz}|F??}WF{I!GZOoMRdKdb$n4t?9BQ;$^Z<%|+2`v;A+D)K6K$aDHdR zXNU`xOfpABWb#VY&xJWqs~2#@DbBU@sYU59{Rt4VJ!&H-mf;#Xv25MLQ=YgCR>JGV za&vD3<~)NLhQIcF_O84~xzbBbg37VW(`Y4rHIcV?dwro)6yy(;kB8N@Zl-dIDh@e& z=|%CF(NMeKFl&WYK&FbS0SVJs4&1|2ppOusf;3eWs;%Y0M;xS4AYWIb5=TnajK|}X zX#K9wnMyjau5PX2eJJ?3Cj#P7#aURmTJcQ5fxU+mnHOnQOCOF31FkWR1KAvf!+$e- zFj6bYypcbpnHK)UG9TejJhAjk$dxdeSo#29?stab+Ks70utS{*refLtF&nn()m6Cb zg7YFM70g0h;8B%(IuHY4Y>cuETT3MnW1xZpF_@<WL>@64V@Lm%tu8!!c9%mwV*?{W ziX^k{n-xR9vrfiZmX!S4Y``%#RawACa1s#?dxRB&3!{V}e?cHCFL8TA9L(kwzPJ{w zG=DPMTQ#ieOlcnbY()?~^nTC@>29l`jp8cJkChP6Hq^Bt$r|kbH4&0DFASp`FnS6G z0Y;{#zL7|Oc^VhgHRD>-cR)%)tuaY6m^`YP(_3PF#3AU@P-?xTmXdQ4_q$jPG3zIF z9`@VE`l05UszXV}NvaY@!Yz}!t#g^BnfIdFWTc+MS&XxON_B{|3D!@^4wSV)?(Smt za!+S6f8_Lj!-j@&KAhk~iI75vAc78tqde$XV9YeA#Ln$M%D2@^hMI}x6KtUt95LL+ zec8xBhTCp=gsUTWP}ngin!0B)`9f{O%Qjb3_tOLB7k}~csdFl8kU=X5RzJC62^@#& zvw`{Qa~rzl45D(7)y-cFiU#mAd%<xL#fwE1FISHZfpQyLn_P&-fp!}nc(@(OuvT%` zrrvXyw$&olnT{L_!`0s12kK_;X8d+!KO3tPn?cI_1U}l$$HLNll}%gv%5-ifhG)4x z**&N<t9voc1&fEcKWC6W)Vde;q3SMch8ULG+K8$;5(0s1O;6p7wIvR5(U>1WPlci& zD$i@`suOsHkV<!)EvOX%??*uEh|PrXEiO#K>Z~b@d0!5TYP%V~!^Yn$%mf4GVQjw^ zwGFoNM^^X<AlCfZFLA>&=tGUK8A$gnT>>vG;BDA3fFx$4RZ(C#?_rjPhGFzOW#gf8 ze{U32`Z_kNy^&crSi;u=GcdyEfp@u^%YCt$U}fzc@Y#EHt)tC`@8HgKYBbEeL;6)0 zZe>-X*DcRI06Gh*(~O!Dw{uDhMS>jkAUGOQhLh`X>dx^A=z?gND(oMuwZ$w4ngeXv z#n$HPbr<6Yt7-#^k^7TOV_Ly9YT@hf*_&0h931xZBM}Re`t7T>^oH%F=^dM)of#Us zs}w|H|LjtH@n60IRmBfkyCuLkgCYjM5?L-(+gx^ueL5eCWH)QFoE=Rp>)G98A!S38 zRs8B6`Umss9tASLe>i^bFIW!?mwtYE?kU(7IgS`@;0i03w8X9Bp4S&TT{cY1oU)fm z;#{7xARuvDwnKL418G|g#zERv<BR`9+V~;TMgV>@C}Qxd^IevqyC`X#ruHR`Ul=fy z=6l20pj!W119A#4al2-2^cJ0hdJ9_xen=;ytWhWq)$o}?sBW3VhnM+YWVBr-!p19G zRK?kOwgL=SFsoLu0Q@+2BW#5)Mve6dH~<KmY5|{BSOfT^!X$6D?dC4_j3gFR(m76M z+5y&Qp*=&pZRA}9V~lzkw<H;`wPTC+$Lay;ETVCXP4+8HmJ9PF*voD{Ait|A-O7|c zZ&R8`G}uHnZS~6@O5jeSQT%7;7i4@8v1y_Qd2x!3S%UxT@B>qbKQu8ZEf@jF^g=U* zw;3aL)S4KL&3!V*Y@9iWmBA&#X@nZ{{7!l9-LX(|cEX`9kcF9Zz%W;H<@^F<pw9NW zGf}6vf*Nm89muGIK=6z5h@K(6@CbO5f8L@4;9U=Iei`q^1yQv(<e2LxP&GxfH@Q!s zUqtdVIcKrGEO9$>O0S^>!A5ROYODdQ#n;Yf`OC;Gk6@N&y&d`S0$mn-!#~T)HZX6l zVLDr$Er`C^fib8=L56FIWl88NvIf<Z${zugl2KPGZJ*=_rh}na%1hk%d!)tc#Vjbg zUzQxdZTay)ZP~4?aT&D57ri4iLckMV9PcYzFr_wrgS&}bCi0iZ<Z4!7nr<={h*Vq6 zqC#u_b21vd_VOVU#+aAyowPNq^L9Yf-Sucg-;+=Oq3=<+bsxQ@@6nNEoO=O1WA3h9 z;E$bD75=o_A+h08hw!OG`P6~pbi@~ZnBvXCV!Jh}E;HU3l-Ai?4$Tmug13{Srs`3+ z3=3IMxOU+x7iY*){DO?kh5=SmCfA8UDk<=;onf<53Od%4b4>1NJ`p+E1c8PQLpIxD zc6<EVCJIy(k-JjhTnnlW1xtEeZgWgP)t5!hJ0SaH@%tpBs~@G1svnK2OtB&g^`p^s zoPaZPu%o6Dn}$}2>7Cb4S3naLt3(>y;OI<IhN>4wPbJQa%<^M!MV-&|GGp+ANz?M& zqTSPyW|s*Xa3fmYPOHgRja@2gppD#M`?DQZV(C>-E$iY)c&aL8jEZM29%sVM%U1;b z5OW@U<}n5Q)+21H3v%PshU~ns-vNDr5LEbx*O*_7n0#}faq&ADaxL6>@Plfl6Z1tb zE!pir9W+>?N*PJPh8bi0HRccJnqljl4O`<9kD1Zm7>lx^*h+_|w@-m`p`vSFPw@1w z`yPF13zT-pdf^5Zg{Q6-s-e1R=P|(18`!C}vD*M)f|tu2s#|b2xetVLpJ{S$7p>c_ zT9-RY+T)8b8#VGGOX>mYcaEC;b<7f7=WkhXQwxceH{omdYNC)VVXCjYBdCn5yD;za zXY72kg|(e~_T|w~!O{9RyNwggwcwuEAswPA?@GnE^2C0`I_v|7Q-cn1IN;uMKg2jV zoE~(T0Ebl2VG<k~=)h&((lqS29%PFF(dSI_R(CY8?oe0N9XTNl*T96d*sN|+u-i8k zC5xyj^GNG7w=YPE9DAJ%v8yZTn&h_r!c@;=XJ|Q!AWJ>XobqZ$BdaSK^?VyFu4lM{ zr%~#lLFyCPCzyg`%PtkaQR4G03^R1-HbzQ!z+;wXqSi~dX|X%{6Zbb&&%%I>Ly<Dr zbcy>hYsZo1ayT@WJqVKz&yCbj@nO{XNMqlFC?qn3mf4CBGR6dRYCSBdmFEtHAr#5L zh+VX#M+6LuL`~H*bthBM=~OuF<3gdrt51VV+_^}+)8PbjHyAGkrwPu9@fzSFD@M$( zLWswM^HmrG#q6U^g+ADV$3?%|yjyG>hpxD=gRag09IHibg{#Sr54K*k797(JPzCEn z98OV#>2FH54b-EH+YEOva|C>dVC(hchdl-De+K4TA#O4HT_h1xzII&A#pv2x1$u9r zc3-Nx%q(p@Nj|t;Df<3**OA;h*lq{##Q`vZyTP>AcACLVmy|KBz^X?poY%n_!z2n8 zzW5{4{sbr(fA(GYZsQX%<!^TH`qRjFAchmUd`;10R@k50q-qg^rVNA=b2c1+II7I- zk<2FXd<X%k;tv)h>NPCCA}9+q`|jK{1hvd{hNkMaurqnF6bXWc9{h0Lh@ZMX55ML3 zFn;QW3T6Nup}T2N&VRzzVCc?cDC97J{iP@k7SdDQAwAWdzcxsI9%9cVpcTwC^pBCS zb7KXEf;ZS1oO>u~SYNS{Hbx}v({QjM?q`U&A3_ZDJT#ISZQqqTlKUtUcdeFbD=W{g zhOJUL+fHoBntfnus|G1Oi}aB*G?O0g(uD_TC~!sF#|}O*3Q^!{M7uBXY}!#f&X+vA z7D-<A5dOUG{@J-E{`&j5LhI3MLG+;d1uY`YLa_>-<S(R-zhv+LewXVHeA#p@1F>() zZvRpbF2d`>B-EY3FW8Y*gY|Gj6@oD(_ZpFCwPs3Jvt1=?4)yieUDH@nw2%we$jwmJ zy>KB{-DM%S)=~tuk5<zUY8D)BCG-jO-XU$7TMQQ$qla6_&_~yH;>kEI7g}0vpSWYg zuj=BJ6IM<@s;6w|bm?wky3o0{ZItDvgwlN$>6TIcObU(5W4gC=vyB6RZG!ycedEK# zlqbWBJu_p$$)?<9Bv%*!<J@qJ`j7+SapY6im9)Hgjx>koQF9+;6`GI>rvlZnKj1(B z6Aklm!nBwvP$Km{BmS$15tD^h6R*cI0?eozlml-FW;|FZ!;0@qPZucp8gLSpY=KKE z<boia32!vLz!L2RuIT8RooO&1$tyeFpICY;s>eBepd+)$e9U{_mGcuzxue}U%$ajl zCbKw4ZHQV-#}-cyWr%y1kyk%_L(ZT9dKlECb7$iikgb{Rg-oPy<S(|~adh{Einu91 z(|RZ9jSkz&A~&Kn<=rm2{i9-ss1h+uEW3=I{z~n#*zZGdnyP2hPGmWzKgBq%1Eyq9 zGjsfF?7Fan%ui|v4qsE&prI3#3XDEKyjXMGgS`}<HXA6V9?1Yk-0jX5!Y<wY&>i3W z63(VN4F!8q<t=en&noz$8##XPl6)6BEKrgh4;i=w?(T_$4X5tlWa!d9A;%>BK+m~k zkcpajpck8ay{Q|P^)JRIv!TPh^elv74HC<vJ0Ciz2}ouz!W?{)DY@&zr0}d=fRxkl zSwu=?7$JqrULjH<gCc7NBq{v0r0hmL@x4~e>urxX4R1T;BaqX5XyP&NeL!2GOJd%Y zK;OmxG4I#T_XVJw`2NlL9tkdJ+~a}%AimRqH16A+Z!1t<d@psrUk3V#<nb&J6>-e_ z6VNsZ_X^OR;&vV?eIA-?%v%nmxqTk!UlQ)iK$_cs06i)(eh5U1E9Pwl;)+<z`#aDx zf(}JlHI);9{##P11JYF9>U=K-dRctiobN}0c<)Kf`-Th0OCMj6a8#6<%3qx?f_krt zZ#n*|?|wjhz$fM%iN9LPPXVnL`W^*RZu|v^1KF5Yh4L%S?DRb0#<BRT>7|_S+kr~N z_Z`l+-T8I_m5T4bIp4>Co{~J+St<IfLt~)H)a~m)O2G^msAUKd^G*X&3T6YTZw@FX zzJGGQ*Tt>x$AHSkcQug4{f_hH9<F`F_aWzdGB&AktvBYq14#3@3}}pmn+>F?Tmuvr zw;mwn>F0nn#=irN72j_IX^e-R?-rnO;`<Zl`vTBcrKbM|bg-a(u=npUL9>8Vb}t1Q zFLCDqX}%M1`{Lt5b2AVR+Qz(xfOvQ!=C#1GIaAPkfK(<A!MgL=;#Li$ZXG~M{bHa= zlE-yGO8pw=dkauPd~b8UKXkso1F8_;yz~9hB->Jc4fHn2_XQx$w?2U}q{KKCNONlh z+E3gr0Mb%k542h0eg%k|o?~8lg_YtHfu0bzp8>sH(C>jXk5#yMSZnobK$^<WfwTpb z?`Pv)1JopOuLaV$zr@|v8m_w1rgA>ey%Mg=p-%(-hw%P$Kw5*92YB9v67FyyP49a^ zt>X55=k`0Gi^T2E&h6j>J?~<1I~wR2L1zMK9bF8xzi_AxNV&Ga`Q8XrDZZa{zW?rg zHvk<Vz8jtIFP!h+fDRPje>&g9K{nrGfDRJhX+WCqtw5IuecuIAN=vFd(IPRg0_aZh zJr+o*KMm+$N##r+P30ozdkxSb;`<SxLj|n@nk?uhAdOLSu;;x;QXUVa`92J!HM7m3 z_Cu`ODu-qtYU})3pe>ThYKOi8r1J6z&|#AAvp`yozX54E;*&k^aPgf8q*SGVR9@PE zR3^U+q<O4&=%+xM%A~_Q?+8g{e;`fe0wAT}eL(jLeM^8I6bZW?NF}TvNL&2-@J7%x z=m%onJfMDw(F61oaa#tYDX#$fPjUM!kd|m0(6i$951<Va_jq*FKNYunp#KoJbAWh> zL(DrLNW*;yi0>oCysQg%6VNZj?aMCQFMxh2ZohGEWl76}3ZP$!?*Twc>8U_lJ*M0Z zq`bNb=s5}Z86XXJ$dR5mAZ~92(h^+;r0x8&qipY-1ya3n8_*+?@?*|zn?n<iw&9L< z=&RM3RF)V&ap)gFkBZxerdSPp>>Dh)0O;%DyBSDp@CApyag66ZFEp<QQkqY!@w~@M zSl*L?w0@TZsWsC2M$3b%fqpG<=L0DZmOI~@fc{H-KjVBi1N}s3dCsAKI24;^Q{ETo zHxl<iAWeCi^PK_oTk$>3`F1+rZvp*Ie18b^dqK|uZ56c7aj@nDjR(?{rvPcKo&@v< z@qM%Nz0>(_0LqK+M(6tr=bHoCCcb}izRBZl%I^mHqxgOph<i3;-U^@>1bq*PSLepO zbwEnhQ$R}9b3iYO?{A!M`UKDWi@3cDNb9W=NMrN>(H4t&%YZb!&pO{*f&M1G-*Uds zIp2e8J@4=0`xc;o2zndPOM>PDZ5Ol<NK^hekmmaZpnr<*SDf!d&i6^6e~Iri&NuIT zw*&pR_`c$NPdL%0d==2k;`>pcR|I_)=v6@v0__mA2}r4W9!RPB6A)N||NiQH_dm({ zCV@)CcM6ckJ;nK^fw*iQ^WN@!KjM7v0V)&Up8>@L<$-AP#=QNe!>$u_5YTsph!cU7 zs?&hRi0_%s_j2dk0TdVCF6Z0leAfVt72nT0-yb>Ov30QP#P?XB@q$hPnjq+XKobRB z38Yjl0aB`N1ezqipLD*Po$oV1`-<-`fN0OhyysoGmt45mn_v})?^qzs<1`@6qZ_DF zd~XIiK+tVK2MXE(bdaE*0BPJm18Lk>fU3l|^knOM9FY3H1?XV$Z2&q%(Ah5BB`(}m zK!=L&2b}NMobLb-=ayn#$(zyZ3fd3oa6vPGju3PjkkZ!*q!e5Mloa3hJKv83al{kz z)&kura&S_;jd42AQR3SOr0KN*9W8Dj1kxA-K$^!NfvUy#Z$MK7{S!#zCT7@hlY!nK zzDEM7?}g5H70@x_`yHSfK@S4GQBV%(SV4aR(zx-r*pv?dnkv4B0IBa;&i5Ta)5P~8 zpyLF+$A!zda7%!W7vJlh@BPkqJJ1Q@d+;fqS1agPpc4h14|I~C3xSk^4j|>wVxZ~b zd!6(BvGaW%s7`!;=X_swzGG*4-kZdC5|E~x0@9TK4d`U?{VdR%1$`5!UeMD(GXy;g zq;dZOq;Youy+wRur&`~C15)1`fKCzL70&m|&i8hpnc{n=^UXQmqff(3lK3_PohIm= zK&J~@1e6lA1W2j+ERg1VD^P>@e#`j|INv`4oguz|alY}>ZQKKZ&J^E6fHdXvoNq5s zqxjwibe5odfzB56YoK!k{T@i;mZWUTlYr9VyFZZnPIta3pjqO3mh-*X`L+YSReY~@ zzF&5}zW{oh_`U+vBxq6t#%hAz1az*Tw*YCrEkMev_X6=2<(N0e`QGe&zXsGSzTa@Z z8=UVCfzB7-r=4&744d*9K<^OW%YiNslmTiH^jV;H3R(-KRILY6sx|>#D87$7-)+wK zpFr;t-&dV)<(W3_kwC5D`vxFQ`C{jL6VOHCdlwLQ2FJWjKo<-86VN4s{tBdVCpOxY z4*|MVe2)N9-_xCM6VQ9a_k8DjrSr`IT_(OCa=zbizP|-(6W@K#^1Sy7Itb`}f=&av zT+o?7n(w7R%B%MS%@*GeI^T~u-_HSEA--R7zIQv{hk@pZ?<3Clzn$-!&i1@3#rHy> zc0pGHT_xy7p!W;<B#=_|Eg+?8J<we7eZcv)pM##nBgenx&^CuoOk3Z14y|`+heL0g zWy571+U(H8w}Jx6<NZw-Q3-ki==Xx=za4E~&_bXG1g$(5O8^=UXuY~MTXc1cEz!RL z&65&+1W3z!6VOv7EYW9xbX@UGAe~$K^gA&gl=Qv?^m9RX1Klg=FAkl4q31m*Zl3^B z-}@c<heKz)%lfuEbfZIeJM@A>hql@n=Qz~q&=(zg%%PVY+ISJhOl2(FQ$UXk`cI(m z38hC}f)R_L=?=96{Z8Dz;@l3u)N=Anpv~gj0rZ%l8-cXEe+2rOaPlue%E?<ULyuif z3T^{Zj(-Pes<`z7-6^U36i7#lr?lC*xlg<oJ+_4V5|D<wALux7d&0R*d!L<2m<6;& z(!1E9tAU;pw`+lZDClEA$4e?-0Me9y1ayM9{mQweFSk^^8%RrjJJ63Lm7f9CN{k$k zrZQ%>m9?XQP88o`fVAXiUt!a`0Z3cfYM_%O+|585?sn&UAJBC1-QavH=U7>r1vF4X z?w$*z9RH&89djjSM1;~yfa)Zbxj;(k_ki9cZVx)QX;)dQW&oWmzNY~xRV~hU8PJ=> z_oL3Y{{1%YSwQvT`&J;0+va?Gfo6#Bjn4Pfxwy$(D81UDGv~oBk#O$-QkuJgv=%-A z^n}E?14!%q0f(Li(waW#YMb&IK(|Yb_d4_`hyKH%JkTkU@4tXF->-cDv%13P*atC& z5VRi<Z&QtVy+BohJ_R&e;@$$JajQBo#u49BfF=sM7>L)l$Gq<XJuFnc2((Sy{sCm> zH?BcBVhs0bAWiT0K#xj{1Ls>wYy`Sn+zwd;H;M5^AdPVb(39eOK9IK6Yk>YLxh(+F z+)h|*!<`1C;a&iGRpS2iBN!)3j9&q1jJtX;(iFG!5{z{Py&Xt>KLMn(GmkE{yq~hn zq8^8S?xX85>XlR~Zm{8IIdq*v_d4|V<(~H)q3_jRjB88DtFn(;3JwHPJ^tGpZORKi z2Hs1!4+ANsKL%1tx2^KLyCl8GKaMfB(DGBDN{R6+AdT@NkfwaZCq3^WiSc%ze;4%p zO}0M1{VC78Ror5qwl)3aXE6$t^qv9I^#1*Gwl4n@NbB;vFIl~N*Ox6i?5h^dxyAN* zD}hduJiY+*q}2YmfVB2E(oKAy0n%EHe+^?lp<p7AQg8#1hWiwdhI<)ki=;RH>o&b> zfu0h#mCkKCiv1(W<6S^X{o}V;eegS=rzJ)n=(`fG<Qvv^GSH93_edc1y#?qQak~>p z%kcz|()S#Y(s#f&(L+c%4goUd05atO(s1c-p=XlxT7Z5o=prEP2k!^kM{4@;Z)0Xw ze2)Xte18h0n)-J@zZBm*kW#wnc02R=eW09_?Poxm?_Ys_B{53xu<12_$EJ5B&~xHD z4@lFy&iUR9G$6iTaK3js-wi;|i|<C~`wQp09q8BM`-<~D78%qFuTB6`UVQ-Qm~yt6 z#Xwr#F96ku+qazCGeB<?x8FFoZZL1WaP3`)sO7!Mp(Fpp*1`bLHsQ+!XjrHc<aYZy z&jZteDq*%k$bkL{q-}5x47f*x`Ys@)>gPaO3)_Gm72g+uKn~)5?>^6ia05;MKIZBL zT?BNv(DyZ<2gL1%K$^<WfgY1o27ok`@%LNbDxk;3_b?#!eKXKG!oQh7%D?k~R14e( z^n}EC3`l9d6q){)xV;ZZQ@IN0H{#X}q~UG_`jODL9_Y8?`v8!}IO<`H?j+x1fHdC^ z0;!DOw-NT5#Mlh<dqGbCsbt^#sONn^QvLzZGlG5#q&#>9C@HmC`k2kF3P^oxfsPd4 zH#y(8Ip52HjuPK?=R5mx+cSL_=-ond50KLQ$0uyxJ?4jY1);{FE+FmMKjz$ctXSRl z1ACqp>MudD-zzD<7f4g?2ijMBOSfReB2<k9;;xP|uktC(LI|n?Iz!N8pp>8_5O<H1 zdDTFt3#tKX5Ht<wOhH{h+))tomI7(L{Q&5Gar?1zTM05x7Fxau1kpl_`+(*N%^QG} z=H?$;KF<YuKvL-d`mV(II*_LF5YTPn_A8)kB$fXH(o||urSBBq5C7Db{5qgUq4}C$ zLi>pCwGQ<;w8o)%2*msI%e)RC-q=*;Wq{5X)D6TN)yup^K<5eS0XkREQlPgBS`O4C zXax{=o0NI0fZi%-HP9?UYk<;%J_mG;ptV3}3;HV1S%TuvS<PAtq;hZp5X1;PJ$}IQ z?<$~v;ok><lz*#$AUp{7T_Dv>e{<;I=W(N^aPn{<<>V)Upp+2fULeiwS3sIu@2_oc z-vHVmx!nPzxjhA>x%~}Db36IJEV>vdTgsH%fHb##ert8zwZHc~UNDIDK_Ej5kZP5m z0;x_sZ!6|YgubN?-Q&<Nfwa~B0q8-Y?*$;G?>KZzsBGkM0T9>#^l9hzeIOJRZUaD? z${&Fql2rZzq^V5!gVo+|1JZD<Ko3i}OMx_8r}Mo5=m+Av!ukFsZ&T^oW>dKiXrqL? z0Z3E%yz{*cXp{Kf?tGsI`lisl14!%b#6No8H^l9fKUv=22&BGG0;%ts7tl9KxL008 z|10Q<zd~OL`X104sgHF)S|5)AX?=X?Z_wxx?%P0GA9<i(h})#UTkf6-q;7M7l)E<q zeNj^WB#@@O6=<`R?e9SKlFEdCp!XBEgMrlTVxULG?fpP^O1LFJw@7-|18I62fG!u` zjX?J+RWDf?S_yQu^bj`#eL&C`fW9Z;z612Ap!<M6sC^0$cR9zrCtSE+16?EGUI2PV zQ1y1WNx11iO5Zl1`Qr8>kk;yUpiXfc^G_S@XrOhH%Gp473p(OuYvsPjq3eKD>OKaP zkyKU#Y09@b-@Adj#P>eu`;_y24rqb+{>J&nUa{@G3+O4KV1+|pb?82ae(cZ-KuXo; zU&Xb(lJb{<l&Z&pR5Lsc)GfZxI^XAjJ|u2`0#dHc_<!uZ3!L23{r~@&Y!GqVL=dDk z*bth;+%IXcat{$J34-YCWOp_@%<hbt+1Ny|2#pGsFBO;8wv9?j*^;&?!D`bsZKKvb zRNHl{RFy?ks#^co`+Yv2^Ev0t%u?d}|Nb5ilgysiJm2qgKcDlt%=vugBPYfTC~Pcf z`?H|#X0_PzSW7v^`A{N{OQ6nYb}f`hC4!TvWz4<`CHy8qUBK*QDB<^8s0*1rCjFj) zx`^4U($9|*p$=vdD3RXLP!}_s1trp335A0)l=+RFJoYTQ7Y?n(ESiN{!`8>3FtNbz z1E@<lm5-oA$~$9G-=)m<ff6Z?hY~H>1%(3~#QilCCKjmSSmg0bR;NIT8F-0QtEKt{ z)UVm^X~{l-5-IP#tH-*Vx2R!IVvDMQ65IYJC{eeohN4vLcO8`QI|_%w!uo3{T8=!} z+6*PE{ZLuXw;z`R#8y^?O94+Y3qy%9Gzsca-p;2(iPkt1Y7_fi2=xl9YFs=JF}?)# zdya7kl!$Q@)MLz!ffDUkfD$n}pnBPQ8I*|81(oBJ?}QTD^zWfWjK4rV&N2Q5W%m&- zhdjY-A1IN>B&a8uoh;cmphUa$K#6fsh07*SaBhb}iMEeHiQJ|_J;kXU4<&ND1WL>i zo1l8QbsvQit-JFur_cAt+UOr}$}y<DST#W5@Dcsd2DO~W)p96N<`+kxHQ4$tl!*HQ z)Mf0q>pqU(K~TTpd~2XYzH6Z_XTJxe-*2IC0EXOV?(4C>&er)*BDY0Q!uk}{3bwv1 zt?x+d)3}^;1zTT%5^?_lCE{L)?7zX*tDuDSHYhva1MrM^kuQ|6o((0eYoJ!Lbsf}I ztbPV1_5oD~daSFN4TlnOYoJ8jOGkOEYuI`nl(4Rb64sBPI@!7>HW*>`LJ8|LP}j2c zRcU=+T2~$9v9S9_tKECBqxL=0W4+1jhfvpX+zn77<=;bzloMa^SpUP;Rw!ZZfD+ax zpsr`@i_-e8w2m6<v2I}NSD-}PqoG9H`=Gwb)}Kr3Q_}ho)QxQ2bDR^`3nk(X8}G4J zvDFJDQVu`~>+MiCv2~ra{z_WAj`CPHv-KV*5%&=&5qF8-W8K2m6;Q%@GnBAyg1VKh z&r0iGrS&@jkM%9Kc0-A{KZg==zk<c$-)8FsC}EuiC9DU8Jl1V&JpxKtzX~O+mqT^2 z^#*CZLs|#nBuez<$xt`|Lr=d9)z9jmP&gC=I|C;!f?WnB{2qW3)|EIh_zvfB3zR6q zolv3#=TGxk-(~AJpoH}%C}ABr-D7=^t%pMiYXnMIKRn)Jt!C?PCpgvvpoH}vsN324 zkhDH3tryMmSl?&s)leekZ$XK;2hH|acd&Ill&~HRC9J1Ftzm1Uv=*fGS5QA->(kQu zinL}=@>qAW^+G6-@>NhG<qc4GvGsS-`n<Gmhg!?lUFw{;`$CDhS*Rb1l%@45X&rhR z_L6MfA4=pq21>*|VZO(@hplHo32PckShqrTv-N#x-T8FKy5MUb>ql%o2TH_U3MJy+ zmB8MBt@lF->u;d!e3O{NM7~gVzEHw?F)_AwO6zUX`X<zm+4^s3-F=}Gche$|^$w5D ziOn7hrvezKw?GN@qGY$8?XiBssoVu6N^n1vD8b*(@mN1)>jzN6x@*R<UfF{E8(VLN z64oC;iMWqI{fw=>()wp<-K7<KShns9CE|{T5^+x{c&u$)<_%Cd$w283EIKR+CD_Gn z&OUVFVrP$?g$nSVxCn(E4B}pP9{f1B>!Cz$--i;pJ<*Q6I9p$Y64rO2gmuwUkM$s1 z7efi_3MgT{3F;xXu94RJrFHoE9_wMY9t<Vo2BAdU-$M1U^*L$%o3!4r%ws*m*40oV z?oXgZ++RceoUPAD>sDz!;R28K3$~sCCE{kFMBJ(iJ=R9H4u=xf8Yp3X3+k6_{g1R( zU*uR1hWZs-eNZCqBx$_>>ep;tDXrg@)<KtftbcM}{s#)DVd$A@mwPOnUO`<4C9L23 zx?}x4l(0@&;jwUX2*30dj{4g-9KYdLI)25K9_s`4`w&XRxch2HZMeqCV{50!!l@L} zJMdbM^)FVBLW#JGu5;K8P{QwiD3RVbZ}iyLxz<3@FFs&h0hAbP2d~1BuV^7C(LyId z;gk!0k3fkd{gJnM?5iXzzUQ&OKl<Tn3|Ahp<8JrRLrxImsx^*v*qsi0_J<BT^B#xo za<9X--RGoo(Rzp7|A3<|?Qzt|M;!GpsXBk|u%~|IsC|FusJo<^@u-u>rBJQh1}mUM z8{7hg!z7e`)?-dBhd=JI7PH@eP{QwUDB<@TC~?gw^n}NHhTCs4lxV;6p$2n$KbC4c z)K1LCKk29mP|tGQnNT9`PoYHI_od&YryO>(RDXmL$MUa3ZQ)ejf)dB_A3{CHY`3SK zl+#chT%%SfQKO5YM2((=5;gKZ<D3hf1GO9XYCDuTW4RGZ<a;;N-#L$mq26Tm2Gm=u z-i8uo8UL&kV-i$9Tc<+_>$j!#UZ}U(`cr8gvc-wJ57awsJpf9?Jsj#?W)UdSerG_5 zGr9Aip5oGf2g)up)HaTBACyStc_<O1_BqGzM5y=JZw{33OF;dDSu2#t?Jg*h@_MNE z+4>-qi1DPf_CalD>#NfG4%9!Hd7gLDI{@nI+(!pN?a$-I4<-6&4b)LwqkEx5e>?^y zO7I%g?tEST4Jc89L4R<p2SDw?)`Osg^(Rn=GW#WzsFCLdXU}vPlsK3CE0j2cJm-(j zIpRG~zvHru`IE=0;Z&kfB9#ZAM5&&EqC5BoTYrEO`Cjm6XI8mIst2I1;hOhAiJI5- zd91@YZURcAd<&E~*L?^|lrQ<BQ@)#^#C-KLsOveshoD4y?Jwc{lFNJ@)RU~XLE)kU z$~W$1k2RE49n{Sn_Y^1*_m5Cwl>GP=k2R4?wGm2`YT{o!*3ryPfD&vY)G^GSl<c^z z9_v_Ubx^|Zn^3>tvMhStX|*C0-QzgeS^_0n?Q*E&nB4#+;!gXU6JsvaDQuk&C1M=( zrpNxK<}j!n>Q-gF{g%fX&b7SqT}K`Ho|DRCs8czW8BijXZ$j<IF}@3R8e4w^B}(ul zls*2S=Ckz;C=vIcP^U8+@((A*m!L!pKhzm)jX;SQlcCOJHU~=N(Fk=1_eUB^^v5!& zbGb$xP<dAL19t^hE1-(3RzkJ0>V#Ut>UybGNp-7KT~e)<YK>HDrRtVyomA_k+8|Yr zR2!ida|!<NzS9O<p(b&C{|+VE-~*`1%y!-Gw83mB(Q0QxO<`+2l!(y+HI>;iDA8&U z{mY5*JE&=F?S&FC-u%$9{tIe4TdjXP);*wRFdGFW(n~^#60}0iWNQIRq}Ks;JhN+{ zM2zD+gX|cyp-y1yTqqG^$sosiIn*q+UI`_v-<Q_=p-yD$CaBr0{s?svtCyfej9=m> ztM^9h4#u57PRiS$=*jK)<{L`*-931abuzODp+ref-f56U_YdRyBPhYX0VTHhyP(9? zt>IYwBEI|FAL>Hx%NUf{qUKArR{Grsg~LK@c@IO4;PNfp#Zft^eVAP+)eoWeW%dBn zTrSmbp+u?v2sMw{8<HJ>#|aGM7|Wo<m9~{o_whD!EtJ@1x}YwCUzN2Qs)N-UsOwp+ zm8x5+bx@bGbv@K_RvVx$X4M0QLt~`35lW=8Nvh3K^-A@WR9mEaL8?BeOE|q(pe|>% z6>0^mH=w@3svqhGR@<c74uwN#l;uMx9CSljyAHChWHlJ-Dpo_FaDWZ#?oc9?YN<v@ zHBzckQhBASk!lPS4%3m|SSTE(L;0YtWp&ZeLDmB9t*fC#4?YWZ7PG%dcEE1VSc^i5 zz1n=JCwRY*mTD=K*b`p~^)*iAW+;(zA5?<bTau01-AQ>8lt{S&>TyoFO{%X$iQKkJ zw$~m`Zlj^<Ipq+P$ZZN#lG$9z8lV<3%S(0%R0FeXCA%F;)Z;m*<GC!~!-6rPy!cVB zpYhlo4JF2Ip{cbvu9#eyNx>PfT((dwH00B{;<%<POs&Zlwk*ml$u*B_Og9v<D!j4D zDi+5zv?Ox{ibH8oNUzBg7S!dlXQvv9g$2jua+!2PvY5`c78Vrqi_@v|7NpvXseEfP zv!E%TN)?ynQVR<Ch6R)Y{xs&(i&OdW4I-%>n%>Mst=W9a%hm8wr3&7rY~Gu0U7XCM z8@<zKPVxHMNBd&!-f==?+J{mB7Nv@b^U|$}LNT9iT{OWvxjC6nHlPmVHDAV0w|eX5 za=KpO$&u~&Nwh<%ObYd*8xHr5p>&S;_=LDML|Z4QP>YlKM6Qsas-RTK*29b52DEcA z-_}r+Wy$4JP3d;7DfK3DDHM~f4XJ`tJnp;F^k!$hqFtOyRZIwJx3xA7t&q;#=4`&0 zYDLQ-y?mO7f>AiTB;K;GV%9sl(c9p(If_jqrL?>aM*XQ(8f9&r9KVXZ%4Xv&=9f?z zk)7Ly7%wf!Oi3bkc_+^}ZqD4P^AdBWPM<k<-kj6z?y(#`b@t?wrp%l@-QiC7e`@>4 zE<C$nZ*9p!A(f{s)!URzXV7?1nRIK4+CSUmZ36R-cG^FiOSL9wKur*abiteSo_5l- zX<zjgmb4a|Q-$<WYR|dTX3vxT+nO!Hi-%!bfm^#d#U9k=#U%2|(?D%W7VRk9WS^<M zl=|_wDO>J_Y$k*03RS0k&GB(wy4dU;ooVzI+7?pT-7QD-=#DDi4jCT<)K~UP$~$k~ zWU(Dlp4=|!)^st^lx)CEf-Q+VssWQk!COz}!@Vup#<om~yJbh!SJ}_V{Rou@^B3<H zNYksOEmKU7Ye^O`<<ick#Gb;$+)x-Nrx)HMAzlSeL((huGh83D{-bl=G3nOER67R# z5%Abi_2tUo&yGru%bm$48|{7@of~RVh3XeJry39UTI0qY!}TMVR3q9WU7(H5vbS!` zbY#K3t{Bi9uQ`?cH1T#+ed=41?YU1=ZW=wGCLZk~K21CtxSuB8=t47^7%_1VkkL0l zAKyQS-%@P<)bS|~dhMwGn%9g;pXU8mF^8X+Y~Z<lJdZk&*N)5&$Av{4OJ=-w()FLQ zJ<Fx{S=zTgTL@6+n0@=P+g)m521kMaeY}QTGV`h8Wi$Ct6R)s%(Wk0kt|9ZOwwFc8 z!l&A<&%x=%r>LJfpEhP&d58CzwwLp=O-=vh@zwvU`B7E*kT5|9Srg>>3>_7EY2T8{ z^USa#>PHEAy~X4rI#@%#g;bGLL$)P1E7b~=PcLH8(41;Gr_k1d2wv~FPyS;6(GB9C z*NfA_Oncd2sAblhPo=4Bm>O}uNykzJItRij62Ept{V5?cU*|+t<S!b9j#WSJ{OWO_ zm26BFv1hY;0%z5kRO_N*GuQZY&p(H22FW6J<z=(~{Od1{kVUhLv+uUNI8^>z`<n)P z9*5{SQxkcMHuqwGgEOcG(fBCAj%t6d%x6olSj2@R?c&b=we;v%(kS3(Xuo3di}XIr z`1@Sj?~`8d_@e(m@%7u!wZC@A{PV^3_<weL{GxyV>+egx*xo+t@xvGM!58zvC;xu( zi|y@;?d`w$KKqOD^2K=hV!Tvd@A1X<@x}J>#rE;V_TjAm`eHuVf%8F8Ea*rqY)fYv z6Lg|en80hPNa4zSS^L6#_8feHLf*9AMXU?-rg`a{{RKwZcx|nPwp@<C<`^*Y4y+%N z;@4-pK8No@cj)!r9i1M&<K3a<`~1?w_vr;Jp`tOy-}|(-wJgMfE-W2OwPJ-%ibvmP z`#!2z#COm}b9}b**UvG%xu;Hd7MtQLKzorSM(k%Aub*Ri|5vVuE9Iy5Y0NgXwP1MA zI+E#U%&g;YaK)EeJceik-%;&_b+36W9HmvviFBhJrdF!8QK9&f*PiE4)Pz&M2`G(s z^!Ovyd6So3(OQEEUi!=H8EF+Y)uoutdhsn>CWE!a+T{6J>q9x&8-OzpE9Gd&wqczj zedCNp*0e}jFPUi4&(xku{-1QbxaG{A)0Ru{ca>=U+*mJGKZ}2d<Ewcu^)<bCOA%jb z@=_vhKWg1nORl&?7^o(0Wt*^E&*h(~e$<#~Uwa85mxq@Sh+-!i(|KMX>CIz30~W|; zmUu@uw~4$*V>J}k&e9@ltRKW`Me=AOJFOx_d1)zvnvVF^mL^A$iv0z?=%pRtUoRH) z;oEq7NubD3j!iqG9noIgQ1+jadO8aeT9S*>4PJY<fTk*6KBxMn?bYfmN#}ad>U~~! zzN5--mfNY5w>5<oz}S<C@?zNX0?V=3&cJ9%<>6ugI0bSd+To5WpSvB=l1~gXF&b&v zC%>=>&6c}d(L~tH{J!Qk;Q;$IUR>>!dup$GqeF%Co!%3J2O9uZN@p=*>E4NXSgJb@ zcW`h972;RuHMfy=MEg(y%B%;nS43c8kh=`%6RiWXo0JQQJ;H$NfW{P(SUjCxnri$i zuRBWP-WGfPi&!^wgsAJsq=RyeX>1d>%cRCSdkst-PFeo{Y+tH@IRI#?q(x0m`9v*0 z<Nn&7e<`g~(5eM*4jbOo6EToO&N!Y)YqRHNXJs2Ec+sYzX5+ks_lLBWcmnT+TiP0$ zy~Xp=ne?LOqBoaKV+B7=)b?^?t`*%Dg7z<Y6|yb%4MPPitD*P{Q<(ZufIQz^(vZ#5 z=8#!J@iDPYr-KVR&ZV+y{UvVFakiy;vGkbpHk<FW9q%aZSHPB;J+9Ee#YIy&Eya9F zN*WyARyZx)%Ko^i123n=nG1h5IJ~JaH)Y>8!Tz|5DbS2trgp^kO#Lq=E1F&?d8BUN zkLC3)Nzwipur-S?U6__`Pc_!1vF3?9X+698+EL{}|ISIaF5>eT>R(!(%7D6if;UgL z6O-+AbyH9Djt)1sjTLA*+$N=(lZ(@sFi{I?B7P}dgHrQrbQoh<=^BlT9cSXCro@Tj z&IXLLFv{_n>PKtY?c+(O&306Jyd8?$c@hC1Zxr4-WH*=ZEwt~zqZN|4p`#Vw!8r>g zcU1m6x<3Ec)6?dg!b057L-!$`L*rFU-F)Cjx8v==?St~!k>lr!^gi46thC<%<3XHa zjc(&RRWU-e0Wm;49LuF}QKu36eJ?tmE)vqhU-j^pccspz!l5&Xl?idCpDGsV+)hkx zbiQN{TDlW+X)2%njPsk)9!{Y?)BI8<J-xknlS|n5o=x!D$A(lzXXl@^_q@1qrqSEz z?1$YhDAP_Z!accd_KnM;q4>_kF{2xExm3$oT)Uu9oNxZO<!Vmx5f0}-rExPYqv+`0 zE&wv8j76r1x1-zli}e1B^_OMF=Z<PWj3-Jx(U@w;;s7`yj<cOZ5&MgSGKaLEYyJzD z6jKS@zrUz8g-d$QCg#jdX<S>RYtq^T_rF*kyHP}OoGtu+F@NeJ=dg;-M@svTI`qG5 zz8$uGe|&k$HsAkZ{#x^uZ$G*TgDyi&@Rn=<&Nalc^>pJ=CbWCNUG@xHaY2wzVLm3F zb9>qjYmd)s|G1;Z`;IPO+4fE2A|=i@aaP~P-)3P4ox|<_srH6c%HEU)iYE@NXfyMU z5vM-1XXI;T;<+Qvjpfc{@Hy-+2P&U^FDiYtE6T$~<tH3`?&TY(TsW}gl8E-BgNusA z`C`2PH|tfYRlhht`?Sv^!uQSpZ?vBWPk7q%x}iDG$U)Y~IU{oWA2S$FY#VLup4+XS z=FMt6GmCBc5joFZgRH#*yNPg)5`Lu$Pg@&l?UsWt`8c+`;)CaE4ZUvXoM$xb_u4#w zFkEGg@_4O%5O@FSq!+TLyoca<Qyz+!M?7B@o_M&gRZV$te#1q6WS;{&eyDInpgQN- z8&8~jVy~PhRAn9LIm8+v{YSa}l-_vM_d3+c4);H<3Qu@D%-Re7^zu@@Da|=Z(>KW4 z@15%0{*wpe_b&IbhUKd3$)^)<k<S52K6X1e<#yWFEHjniEBFNu&*3Q7(0VR+9_4oG z<AnR!dB>{o8=6zBo$d1BAzW@-bJ`=^`cZrAOZ6Gf_2GKtQI8{0pL-E<+w3dKO#M!M zOXZy7jstEN;?!T)p`Y;lv|Weq<c4@~?oQOU2U0r^7ik@ZCxhL)PtN0n`{Q$9pWOZd zq<!yDF8O@4+5TLY39>GmsI3nhWbN?|%5Ar`GuHM$n#R_6t{b&^J^7A7nVvwIoDk0| z+hh2yZoW?2IpfvwqtC<bv6n|kbq=7;j-O*6j;9B{W80}s$PeXbKg!qfbK*H|NBQ21 zIt*8~2O2}yq0RTB@jG0MU&o)~Q#sW1oN`gV<?Qz=<tk@4<IgeDA8voX4x!UdR7M&X zYJ2R6cux99V4J)bW80}Gw~w>^;t8)bj&{Ryjn&X8iy6|Gx(;KEwsYEEC{3!1QwPd( zIQoD-)0lTcdpq*fpf9hp+tz7=Jp3u2ywc{hT?8=xDZk;!PYv@J(>zy=lyepRN(;}E zh(qJM`sdCJieHf<+fY%@{bvlulY_@u`{wqk2j*Xx+kcWfHi)gjo69{1<&RXse>nWX zf`hCBp4d0%ITUq#0%fK$p)8)AJ-jW+IuM@&u5Ra}23e!t0dqp~x!3U-A+}%k7kU)R zFbdmRm9<JLdQzrfF{#!`mBEZ8tQ}IVm5QE@Dy;O(LZOyP)hQJ+v$9Cjd0p=agxhv; zKj4R><m*VOEbB@|f25>y%g(NW%ICaJQ+!$+i103je^>EW^IEJNi>JrBkr&|!($4E~ zMb94MP^?vPrR7)jYf3raQ}SI*5B;`Z^h-|8>q^Dv45iG!Q1Ze<h2`r^>{FdrLW%qI zt`5a>Xq0+g<YMc7C7nB!bX1><(38$<t>XV<2O_*!(O*;Ahkl>Od7bSDg!J@d=hfy2 zg!Ck5=S5E@bzb;sJo%#Eh;m-XI|3o?N1RucqAzeDLOS+wUMD#M;WR}rQ1l9=&Cgfb zcATQ;C}}>Z@G-l)3H?IxdDX?1Pthk2cRwT)|05K=*mdDwPjfz==?H}Cm`^Hg6;*sX zlr(Ao?YwSr1VT(t@|9Ei#jnKui=qc9d8u(bWh(f!Or?FUQgppCJ`YjG%moT>P||r& z(Q00=Ddjm#(LYkO>c3T~S4t_*2Z~nPWV*uX`L@mrkAs#k)&DL@E$cm{ed?8TG73LT z@&BHpE2XJ!3pm7)uOt4;G+Sj%@eB0MM|uXl^ID{A3tk5ztWmU2(e$)%=S9!sc3vkb znx1CtyyzLn&g%e0pQ_aBDaQffPZgg=MgLmar>JwzIwh{kPgJ-%C!DXOxlQpoO5yVr zy=lDbv`FD<zZ~tlSRW~UM88$#yk2$$Li!al=Y<E(%h$z<?pNAJnL?~16^_U6%hyO{ zUfNF?|4S8Juas?`Qik`Gec3Zeu?o-fwk)A&c-(}1@XTkZz1UhU)d;9>v2`RAahw@S z<%PPPtu;`?@UF7PNHrGfPPWqcqB>StA*o_ev|p;SCPMAa)>^5iK;6yO8BkP;Dr=Th zbx_@God>lqTWLNNiuMFQVQW3qet1_|jZ!s3t!HZnifV;l9hRyHMSIsOs~u{8wl0&Z z18M_XmqQ(ZcNHHa3bhiSA7X1K)PZchUaD14v_Gk`ZiO1f)-I`5L;aGiYoNY_cNPD> ztWe$fyqT@*puWu3^-^tsdXlX@PzT|SXO2s?3F;ZPZie#WUByp97wRc|{sUXLKpo81 z7o_TgdXcTKKpld2m9<r>H=tf-Yd_SXY~3c+cBog``XN*eTP=JRYA_Vd`c>8t{2k5K z-KC=a{omP2N4hk-R^fc#QFP3@jjdk%J)EsIQjLN72V2MD?-;iFqzXa(i>)#IrDc5> ze^S*#S=j!n`1h-iWa|ttp=LqhvGTCiL4Ad-^Q59V1*bf)E`S=#)_SREro#ymtj$p4 z*qV_l2el7di%>KnVf;z84C+9(c0l>qx?HLiP=~N}B@`XO;#aSwx*iHAT41Z70&Kli zsxBy;?!&qoD#+F~QmuueBc>|e)<SGu2PV{dsH51r0V>Sa9;r4$#o4+ED#F&yQuRW8 zm90-f(GgCSwMD8IppIs1AJnsKeMPFRP{*?M4X7Af`=#0jbsSr_Lp{&d52d2MrDGY) zfA~9vtwW^3qus3&*h<%Qrm__$t+v8xs8z>SoVZzkV5?UuYU4R<#U&1FI$Os|g-a>c zJhq1LcLrNyQcZ-Sy=9eEi@!73Iz=if@0o0!g}=wMmC7L$rMi%<^YM2!TNg-G57o$4 z`b&FBj6bO|P)%&j;cp#Vi&C{ikuQFA9e?MrwL_}qP%Ug-fxmOvx>Bl6s61P*$6uOH zF#e>v6^inyvbym1k8E8n)f%Y9Y+Z}Le`0I5RO_IqWL4IB{QWaqH%Qe3wUn(J@wbny zo21$dbrD;8@%KfxJ|)!_D5_PJ^#cB$#@0TmUV*xtty}T;CAPjHRX-G+|5aJr@RyDR zs;uo&eF$|ETY;^!*g9A$y0%K~fc-C2lC9NJjez<-TSr2j!`4w!d7-Gis;n9)nxnD* zm1->1J#57#TkBP};=+QhaB0N)F<U1>{e`WyQcZ!npRF^XUSsPlsp_Dp)vK&|P_##= z;@?gaY5~|IY^{fSovn>hHADS^t#kzaH@4=aDnk8|t?f{>hr#%hssrk`Y+VkOXX^^7 zRzgu9WB!9Gu=RSWRzdxqt+zrI+1e%5YN*HAx(15QZL$BAsvGJ_wyuL(%+~c%ZGd{3 ztvyiZv2~+Vo1mU$>t?9Gv$a>Mr=Xr^>lUbXw!R=$9~6zoD(e-fC2ZX))f-TMVrxIt zQnqfBYC9B-U;O3=)cI_s!#<$~L%qb-Ay99!b$6+%p=iWcStFp{V(Un$MnV0BtzM{Q zY^{-M3>0l6_{|R}Ix@g-en=I9`WstgP;aw!qExj|e`o6ys0-MN%XGGy1@#tN>!2=V zD;?zuH6QA2wl098D<M@@y;O}*@3OTSs)MZ=sd7+sji-u#)%{|&wu1?^42rhqD*grX zOW3*`OsEx5blzFTziNCbTRXvox*m$Qf6RYS%h`IXR9#U2Ve4wB%h<X`s<lua^d0uU zP?xiHomA_gs@S>#>g#Onk!mB<PHf!-wSujirRs&+g{@CPUBT8ZQoR5*l&yVG-(c%2 zQf-CWovm*`UCGvdskTAw$=2;qE7|&?RMt*7hhXbqsH@mIL@N4yHe8TKeXF6~Ve1H~ zMndhw)=^OJvehe94HPcyBkmZetJykMDj(GTYz;wO!`7Ho^m}Fa@&s{fp*q=0S4oAU zUwZlyTj^Jru4QYTRP<{@2eFlY-RnBG(r?-bRS$JATN|P1*ckg?sWMPCY^Cco@3FNg zRXfySY^AHS|HIY}sg^^HVe1O0>)E<es!pgQ*?K+H4QyQ{)vZut+1ds5O}4I<Y7NwQ zwyuTx2V1+PS_c(m>w2gg*}6fh9w>Z`h+1xhTE*5)Qf-Ecvb7iLCbm8$)fT7;Y<&Uh zX14Z8^$OHPwr+*Gg{^N$)em(HTem^I&(`fyeF#;{Rtx9BbY6nvKdFX5;j%y2?oj_^ zYqeA(pr){OB-E{J9VL|)Y8qQ>puWY{F;b0%n!#2d)VJ9hk}3vuJX<G1-Nx2hsir{9 zV(Sd357;_Osye9IY@G-7FSgE?Y5`OoTkE0d><j0=QZ+-(VQU7ei>*1Sics^|+79(^ zwl0&Z1L}0PE{FOKTUSW65{j;BWB&{FUAA5?)hej7*m^6}_t@Gc)oQ2&Th~CXX6st1 zx}oTrXqB}N>OX8<FVzO92DbJ<eZ<y{Qf-1tv2`<)<)Ku1rFsf#5nH!FdD!}bRDDos zw!Q*2h^<?tdIKuU)_$lewr-PZJ5-*nA3_agtF?=x21A|4)*(<kv2}N;s-c#$bp#Z? zR6?0YN;L}VVzzprc42FcRAZo4uyrid5VrcH3PD}T))*B1wj<7erK*MMWa|_td{GAL z45?;8-N4p5D11!_>pZFEL*2sG1yFmjwO*=5sBf{g8LFDC8L4tmx3RSdMZeaD^Ixf! zL4Aj<9Z>XZa#hxHsa8OJkF6`A=r`^#{-nAdY7JXgL5*PRtx|PC(f21f|AnI8nya$b zNVOJfEnB;x_GRljsn$c?&DIT2`?0l0s*O-|tXO4jf*Q%z%~JJ3-OtvK@S+}^fT4LA z_LKCP`nwjNUxf#Krm+*m=l>w2&omB?#pio)p@2TW0!`=NvEkzL%g{c&_u5^2ehHec zINXUN4e}@bRlKL#pO1u&lYNM=e;Jz6ufs(Q@~?)bGx+CGYWht3wlCp56Xj^P%Siij zlhIKJT_qvE@7iVWu>EKoo@6sRQm44xc=zK?c`Qdr<?O}#JMg1pY~plueHh-q#G9^i z&^b5RR@!Yx`y8^L2-|(&3&3eVaRau&A$I-fh!su8zxVbc!cp*z;yn-VYw)Hkuyl6w zG~ynQI=_tfTEyK-Z+tsP<#-<Pe0ZOXHyySA2=Dvxei-jfct48w%Xrh=OylYVyidma z6ugsox8Y5{ka#KHboKQ<yy-g1BX~cH_s+<lt{08Ko60i@?=$eGv%MeU{d2sZ!}~S7 z>8SVLc+>G79RnSLH|_lcc+;Nk6ujxzny<y1wxb{5-HrDqydTB;Pk0}Ux)$(OUvxDe z|CQH)On&1#uqw28bmppqN58fCng4m|u%G`qz2M@#HZIwA=j!wyZ(sG!UGKhj#oe1` zjsEh~yC1%zaKtqeJcGXV^e&T+_}ZC0Kc0QZ)z3`2?yW=X-r2)R_?}a8?|tXu-Ih9` z!)s|V?f7)#yO#|1e1vHo$7fBcWO2OD*Xi+e*ko}wGrpzKLiN!v<TJjJ?&n;bqEx8# zRUYam{WZQZwXkhb&0L}sv&u6P4NXTm?#uR>M+6N7pNwm?)%ZN!J0m_&;~_6>Of-K@ zfBAzwU3aHp*@rQ0uOsm$GRPWV#KRtHT3X3Og{bm`s|Q)vVay)7vi1i=#cMi(4y3-5 z<>fMAOn`W)?<L6*8LE<tL43QZgpMZbHF7%$eF5O6^HYF2yxlVY4WFt}E7ymP4|+zZ zWKWc?Za<ZHLAp^@H&y_|x4%lJfb<`rl2bvtFe$jPnn8Lsavn(C7}e);kRJ4y8|wxT z-{~s(K1lV~R6<uWb4@DwEl8h6UIOthQhjJPu11f!dF_jSs6JOEV?a7F-MBszK<Y10 z$;lvAhe}$>=VFyy4dTOzn48WWL{_SVuBmk4)W-FpYZBF%tX=XZ2#pW7Pid~`$KkZ= z69VylUnO*e+oO>)Kswf_KIc%ZwJKRgu{1*SPu;z$&+Q=9>s0apNd1ph@;FGZU1k&? zFS-^|i`Ez04w3gkx-~KsM%pf1pD#gnYQ#rI#B_b8K;|?uAEZws8IU@>@gG|*y*eO! zG;%XOjlqUYK8TFh&mnUUsr7miq)#KSg2c2~d*f5jMm5&qAl1KBNgSl>cPgRZ67Jfp z68hcKcD#{+U7oA(sZ%3#7DqFn>+>c)b)f0pvGE^}UXARrGy38Q)#pnfJz6?pkh&*T zpP3+i8aWGu&H&xq+d$}C&m|XwSa`eS4t(l(SxuSF3g~RX^?4PadNeW|`}01Hi~^x! zcsJHe5DRaYoJ+CZRr9(8#Hab(iBHXl=*D^&gpOogvIU>I-&50h1EfRq`8Ph%F|3F+ z-rdPi^|5!@NM91*wWz&F2X1)P%$*(#N1{H`?BfuBwMhb)GIgI|$RwedBoNkaLolLn zDZm{GUk2%yB^0^GLQ}L@<KR<|<0ZH536O4$Tmcfp-pch^2Qot=eIT_sh;noPJ4lB{ zJ_4!UPxaXw`Q$Wm7>E~#;%+)IkS>iJ4^n@S>hm>_x`S16F8S1`<Wi76ja&<oJ5u%e z9!S?@mHZT>8oNHXJin!MH1YyS{Z!TGO^~|jDj9^<>X@ODeL!lDSIOZZJsOFFbl0gq zCxUqAs)W|}c(E&XOGv-})T@!p$mev`=Vp+eGgNXnkp(Jw1SEHsN_s(jUsK7;AYSbD z-Q2f>)M;dQ9K~2^)#o6PZjFow$(^nG90$@>P|2wvy&5?iq@$?%Tma(3fxBCtl^~sq zRdNeR9S%%fpSwYN@WbLR`2|S7MxF)ncBnqDQ>^7GsoEVQ0S7p4I$n_eud5^oQhkL= zP5|k^NsSw;0i@?fm9&%3DwSLX(yx&<AayuVant!ZNGJM3Y`HC|mWJj$%@y?WV$VpV zB_}?+B)7yMxO-eBxFOkyMMRGUf~Nu*v0B||l>52#dtHtTmxn$)fijC1`Oxcy67rW4 z@_|OC%}dnbX+aHcIw13!^I1AI#mh-~CwYG3kiARDVI?G3LXImTbtR;}gk(y{(h_n- z3F#^!YfH$+67qZr*;+yd;k-e-oYpv?gd9;qjwvCtOUPLzBvV3`mXIq-$jv3>o)Yql z67qZrdAo${w3k`;ktJkY2|2EWoN5zy8$1W3S37>bq$Jk$CFBl@^)q#E{s2hrMwL8D zv7S~*A4t6<O)cs6U;s0%Bvi-u;NyKpjkOC7Kf3><l6^sHUsTEAAbqc>BuKGdQ^^eS z(T+e)qjYvvXQUj(8mf{jC>AbMx-E7qNd4|AxeG+RoRRqu#lj^@H&!o59Zu_A(g)J3 zk@rEoUsiqg9EN#yv`P*J={;N}M}hQ(R5AmkI<Ar=h;N}vav)ueD)|OTU8_oN0?Fl6 zavw;yw*T4)Qs1HayadvBu}Z3j!v~kC+`1nClDkqRL6EwYDmek98cS{6SWV=k?{`4D zwSCGpAhoxsv2G)Bt4e+f(t#z3Zpu%C^nF_;eIVVBs^kL@?_(+%x;IjO+#&S*NqSUh zrzA8c4uDVB(~b|3BSGq(SIIO=2TSPO@|*(F_h*$f5_wT2MG*0FM%|?)<c1Qm8YK6! zn$FLN{6!_d2kF$v-#~h{sy;(TpnYCf$)O;<|4_+PkbW$cbL-UvlJg8w$a0Xr!7Awj zsl^>?ZmjhndQCT%kmpOt))MkhjU;f~aJD?Wpf;?T+MX`fM0pJ!P8+SAZ4!(3;fPr! zaccyQu2d4XUNlI+{~q>Xs!uR7870t&Kf+hK+`Pip-uvr5fxu~e%}Shc;o9InmX(~R z`-Fp!pJkB1iz$at+Z~8l51+4+u^=J7vgD*31-a#R)n^9CdX3Bl`R-k+Pb0{~l8818 zM!tNn<5M%WwXwz@v9{gk5GqeAVoksWLbWvlkst9s#VOB)@Ok_fhEHf;-pe>XE8+9t zZyX;=`I{gwNm4T{na<P%d@FzF_y`iQvYQ=3u~sA2p^rJFX4Y(f9CXAJf?##jtl1&* z8~(WB6DD$)O6W@tYl2FmMDi-36JzU6l~7jJ11j<RKsKu+5CqBaevq!fpgf%NmCq^V z;gs)H38(y=N;u`Y`0~MSdDPU8l$UBG0P-D;Q0|*FLd`Mh4{AEp91R+w=2)%~D)j9d zp+b9JP}8A8AEJ@~wZ>$PP?;Mg!3XOe^xz$RPC7(3f&BF)mAnjc>YFP02;@6&tE75g zTzelvvz9Z)4gh&uBcnlH=VJi!5o6x(|1G{8bYmR_pI%9XPt2OmR|cGvC&Fis8Yh<U z3HT>SLbW&vK7)^Re2CP8oF7ri*&r93qLL!Ws|^kjW8NRUg!lMvnIoY+c~9gLfA9$2 z6EWd!Cm780p2+nHhVFI=`}o6G^S;UT@kiDgByNRyzvKGEtW$X};}U<koA)wIM9Tg% zc`rkRUKgTX0W8~<qc=>WWf|{x?Cl~*qvfbK6`vrD-c#RFNdzR^uM$ef^R_}lVUYfJ zR6?;_f)CbJD9>&0IX*;g0(nppY^Pz`nqJ@L_}DXK^e)~rx^)l6$Mc@iC4u1Wyk~S< zBM`dFC9`G+smxtNXkTg9owx2o@YSDeAKtokLgmp3wU17C>(<ht)|jLbY7L#x)~%5s zZQWbd67sgZK}{z>+p<omgpX=IR6?Cl?&o7My{u_~a=$_&)IN8rgvZ8ujZp47q1+Y1 z<1pkq*RF-Ly@&iAF2O8HHC?EdnMd98GB22|?_+E<4|U2szTLeniwmK+DmxN`oGujv z->sfO{^He*SoC5aYkba)g-e!*^%M*kaMsY9lH=Hs|2%5PVjm`d1))zO9YTZm6ZyG5 zUk2%u*JQ}&7?7<R`5H*SMlJ-gaQq{#<WQ_{gH&teVIruU>+=#3_`2nxFEsI=ONsAc z@y%>;VTO{kZ~%sy(zh@4x?u13u`i-m0zUZi*6M<0AA;7GkVp+eH|2;;+?vh?8LRm; zgV5aJ`dkb`TY{U;Eg%y$pLI5IeSQxzL-TnJgs!!@b+6hV-|uMTAdp&(Oa$rC$eAEh zwDPop%+vC^8l+D1xdWtL^LZF#zUK2BNJjH{$ByOJYxe`hN(HxlMuRkK=^P8PTuWy@ zNUv6lB1oS`t_AVpXxVL_ZjhXo@^3*pwUl25Y1e%I4RWjIv+sfEQ!VAAKw=u10Ww1) zNf5ds=9cGt5HGIFxa3BV4lVb)LDp!wZv^pavHl1W)5t$SYBjRgDD<F4jsU5~l@T}h zsUR!0+!uhXles(F1+|#FUF6}@rNz1eqzA<9)7wD2T3+{q_%!kiNKPZ$K&bBSXxRg2 zEt|EJM}u@|v5o`j)W}&NT^d;m;;mNeeiI1Q)XnQYkS$tXn?ZUspTB^-qWOFTvPttf z=*yVdG@oNYdNrSgARlTzmx1`S65at4)5vc?YBll(NRLK_9VBYu*2@oq15c%Q>Ogw6 zSQ(0?krg0)8d(j}uaQSUx`(N)+6O}I<L3SW2o7MC-1qj1_Hlj2fp|5aX&^mX%8NjH zHF5<=^>8)!AA)SR)Z90NjMY+p9mK1}8g?*RRU>hb4vjQ`SV+e$^9qm{h&$%jf^=%J zo&i~<5$h0)aE%-Z(xZ`6KsxqT>vahT^`M*kogh<W?#_1FfkL|5>ErOBHDzwBcR=c7 zEI3=k4@H@^yka0-8cBfkX=DWmPA`;{*Mi`SHKjEk1L@ad{SAa}p>^k<U24#S8mR&4 z)W~EI>Or>_XMr@!yqvn{w7M^b4_yNq3|fUZj;KMpHS!=xzeZjLsnzltJR0}t$h;_> z8W0QTdv40LAVV~=0Hj(Y?I2!_+yK(2k#!)mwA_CW(xK)48pwRj$8#9waLwlckb2E0 z0)ns6l-@ZRq+iQD1F~HsUk4eCqdm8#-vyyFTbDcp(yNgdK&W@z{(28&wU+xHhl^Hq zeGUWZ)_jfu>C;j^3uLQCmVs>7$Soj4a75^q@O}`lMxFzSX=FPHtrl}*jU0n|ja115 zkY!rEP6OGXmAL@2Li4!>WRvD|CrGE}vkBxW&F57R>aSfe)Wql=d<0rU^Em{hOY^A( zc|-F#i(+ZDI3HxIMs5P>*T_#n=$3Q0HJ$<K(a8HCYqZ?=J`#N)b9c7Nbs)RST8xJe zwU}G4=^!{6RYqn4q*u%9e2_kktOD`kD9tV5PeC?nDL)Q^#fwVHuY>ezK7+r48B+84 z637<KCk`@3^O*<oissV_64HFW4&u{F_&tzXjr4$YXynfz)PrvO{F7p7DGwiu@uS7^ zfvnQVY>-<uk^$+`$dw@VIBIm;a4pC-E%!|zv$Wh_2C+cg68;NhzUDK099muTIRd0n z^EnoTddE%YG?1L;(@I1u;YyGWjoby&qmj)ZBej&bf-KWgt{RV#pv5{Eq)#KYAYL4g zy6uxBqNRKR$O<jxRUkB4+<M&ya=qsBD2Pw<c^#xn^V#_*%u$-pJ|Jr~pF=@vHJ_tF z)@weeg7~yrWGR+Lt^n!K$n7B1?`|zNfNa!KegdRZi}iPqE{*K!L#t}!aFBUg%C#W9 zTFUc57HB@_g1n&lTmjOrrF<I*E#G(h>n9+!8hH$a#-UrUmqE75l$}|t9!a^g)<57= zr=_zGF89pWNC>1+BXdDA8p(qcHF7OTyGFV}IyCYa$O?_T39?Efdj!z(8W{&d$Kq~l zoCH$T>Yf4FR#Nvmt?nz})32rTJ&L7~hd?Z^n%DCn9U9pVLR*U4^236Ng`L|F5#a9; zAe~yQ=^$MiNr7~0WI2fMU^VyKDIG1ZM?mOaQ8%v_Kvro!?}Loge1?TEezcU21eu|c z$slzaSpZV6k;Ne1L(~#p2hyeG{sR!Y2UC>L8Hcr&Iu0L(k55bIC6HQ;>>NhRYh*0Q zIxVjgL3}bVWMQ>{bZW6WLAo@u4x~>b&x35xQvMeR-5u$+^MMgDZ@B#)0inAQU7tFT zel6uRh;^viVwZx{YUDN$y35{8`6nQB&!C&~W{{^epTB_AYd#-=(A?stvtJZjuI4iy zq)yBIB#?TIoD0&WksCl>(NbOqLU$^;C42(p4bA5@kmZ`szd&d^bxXKU4E-g2oY7)= z)X_2?J|Akajt99_#-e^tfeZ$5Q|<tv`_$YL-V8$9j_b1ygzhPGeI5lFq4~T9(j$GG z5{}hMNH=?p(qbJ1vRTHW5*`gg+l8C^=^$G)A6k1nR`a<A<Q2{52OxAuft$`RK>9VG z7eHwAx<2oKe5m>CGC|yj>-ro5G6d7C+Zq!=W@+in0U4qBECQji>ZWrsh*$bJEtb<- z>}L4T=yhW~05Vp_q89rDNVDeiAxKQ~8TD1{3pAe?2;Fty)?zNmGR>zIgzh+SeO7?b zSar+uT@bq0&GmTzWTocwG)S}baccSo%I@xS--OTgTCAZHQDzy7YC0O^R?Vjtq(k#L z17x-4Qv{*A^xP6&1+rH2xdUXC^l?f!LhFkj_^i`ny#TUW#-b9w53)h?8GbbOUz*QY zkd2zpG>{FNPXc7K=Cc%po~R&d;goO-@^stqdiXr0#rhEu8H-BzD98(%&tF0MG@rr8 zh^@)(<%2-p(0t-Vv~=n~wrf63Alo#bi$MnOWY%J%R*PHU^Pv{&UXW@Ti)yin(m`Hs z310^prTOf3EaoxIXAB749pjFKDIm0+y6Mz|gfyS?K}Kml-vp`Ee7ZquG@oCC%+h@R z2tr$~o7Z-b`O?Sf({8ObhS#DzTC5{L8f7dvTgQS-)O?a4InC!15Zd0|+;0O}rujSo zGE4J$7G#Cy^A5;7&1a9}u;pq#hl9|Z;O2D<NSEd_52X80b&sC~>CwoQAoPVClCm%$ z@cIErqn7f|LDp(1KM#`8eBK6GulejUNz5&72@e6GXGiGU*DQ~^eNBW9%{FeV(?NP= zEGl6e$O_HpT96kspS2*Jn$NF6=$<2YWWESOGm@LvE|ak}X+C2?x-_3tK&+kBbS?l{ zqxswlvb*MUKM2iHZeD)?p>LJl^85>Az2@Vcg3i%=rhxQlJ_!(?=CcHZ<}o*~n?NRN zKI=hxHJ|4|W@tYD1lgkb>^~JFQ}c;|^l3h4g4An17l3Tle7*&e(R?<5RM)8Ea0`f6 zBkzIKYh=VU9B*hTj|XYjQl1V%bEexGjUdZ4pAHafC)MX$Af1}e&p?J~J}-dWs`>l} zgl17UFYk1W4bA5`kdc~CJ;*xE=Ry##=JQRE9?j>6AT-nNf}&U9jr|VDX3ggf5TE8V zd<Obd^NE7wv{s!3(xH(gNT){51F0UZ_SZEaF)gp}g3z-yhHwd;xz~qJ?*4Qgd}t1L zYw-*S-LEHNQN7*=@oISun~8d9WGqNdBQrtfX(=Z`=y@F?Wv4t|tvv1UY1U$Of($|N z-16K3(xK&bKS-xW9tByYkv@<vjcfy{KTK`Ip~s7TirX3of{c*4J7uoc%KR0IrKK|! zq+KHkkPeM31)&FQV$-n4&y66<cT)S}9uRLy?uelD;IH7bN{jV6$XFSRy!SW(qeaW> zFc7asYC-BXvH+w@OSu3N(^9?yB&WstE=Y$)Hh}bKWD5xG(U6o~_qRZ%;G^5iJI%rj zsl_@7WQ#`PApIJd2a+43w(7Yc>$JSC0IAdR>H?vAbOG)1JP5Kt^LY-0_MWcKKR}u_ zpW!EB2GD$>AVtmROpvEEpAL`?&1W?ctroul>D0(uAiWydZ?@PAyCs|evQkTV0SN7d zU7yQAR%t%>fb?rVTR`Y3E<<Gd&;u{GYd(j8bZb5*fb?l4JQw5@job**uaSp9a!05= z_!@|{vs&ie>d;?WUgJSJv{-c@of^r5bZO)U5bu#{UiX90kpmL9N5b<U^qd*D?*9aF zURWDXcL)390fLB#ST>1t=_C*gZPiII7WU%kONkW<#Orkuj>YLaM8zi@4_Si@5}jd^ zI9-`kVnuwhZiD!J{RRogW7w6cu_FFDlZ10RiTffwCW#KgwC1LR%mY4?M4L?#>oQ0@ zK*ud=I`J^=-!&4gHA%cvCw^aWi%tUm7>!;fodA|!;-g0VbX=#A03F+CBt%Ck8VPrq zB-(9~SdT%1J~}GEe|!8y0>J?7g*6hUVX2ak&ufryB&U;TD7fAv;mszA_ZlSZ-(r$r zpGiVnO%m=mNrW~WrOeTAY_LHh0eX6n>Jtf7n<O&QBvG$PVq;7aj~OKDpJ<Y3tx4i5 z3=;Eqnk2Z&B%v;ogx8oPvfd=I4F-w(dQ1}7WRg&?Ny1x966rHZwBIE0Z90kh{M$_u zq=OBmcVfQq5R*izO%fexlGqr7_<dtd67ZQMM9&dWbN5GTO%k19l31Nd;`Igz_!}h| zzpzlirpK?L_*><{v}3$zR*%F2_;v#8iSZWmJV>}%repg=izbOLGf2?4!X*AqlLWd< z5?XDN7<LX?d4lmZhEK@9&LqJNCJAjaNx0V}kv@~eUNK16*Kd*tJ%d8+!EltGeV~$v ze~n23>rE2cXp+cglSH?eBt~ntwY=iALR%$K|2C6^wwok8WH%#Ll<suX(ut2UNX$3J zBz}5Ylo~4*s5MDwib-NK3=;R%nItgZBtd!(m6}&P)NGP)yGf$UbQ1RkI!qE;VUkFv zNusMv66-QayxSmt|2mU|)|({KW0Ke=lf-)s67X#?iGQm}f^V24+;5WTc9X=d-L-a( z2Yo|K;-?k<N?*i-0k26yH71GDN_Z_++-H!GKW36Ztx1A2OcI)JlE?y+#Oe(a_BER% zkTXe;o_V2`IUMRRNx0J_(d$hTUuBSpzsn@SH6{sln<Tv6B#})fiETDW)Yog0z!sB) z`b-kuYLZC5Nut&sdizA<gEbQMg#tr#5{!rFE&#VxqrrH%*(A|Ulf<^@B;*TNdur)~ ze9;*uiRBF953MsvWW7mZTMZKM)3X?qGKT`eT9brmwY=sNU2l?DpFx6wG1YpkV6fgK z(KRNC(b{h{uaJMtFoOi@4HEXPF^RuVC*eTYH(X069Ej6eYbCEpFxqPn9KG+Y`-Fly zokSzy9+SkXM`*F4QD41Dg54$wZ8u4T*6u1LjK=&qlZ1Or5~sDYZmgI;=BK+ZH4>ux zvNRH<p9<1QoYtnQBp&E8NvPi>(b|z(tN@-@X_6qV4pmYP_`>u=M2*Bd4C0T|`b^a) z5cVEmka*4@!BCG*BECTNfm*DHFH9>Em6YjBTqn_3#2TgfL}T$fgT(!`4oyiX8V}NH zF^z<2ZJ0*lojQs6f_)|l`@XEjius})CW-fIB<}Ntya%bVK%zN=_<cP(3HYPcUM&{R zyX#F7=r&2nI@pL6qZLYSP2*vozsn?{ev?FKWsw#uMr(vr;`h^vAce%j0pFnp33r$z z)@zW6kG?%o(}@J>I=@E3Jtm3LRejATUT=_SpxY!NdN8jVD;lXYNvz8tF<-w*LcWmS zS9`dUPRJJy#ybrX^3yd~nHPLQaawDx613PDokRjTokSzC9)rZ=)kmnYu;Iq)4H6G^ zn<PR%A?4;C@W<mbbQ19S=bI#$Ge|7bW0H9FSG1G^@#uV$#Bw?bhJ&;QS}9L392zp# zATe6stolU!?IsCznIy8+Br$rBvzkuSH_{}5F**r_!#<Nlawdtb*GV`M>o-X}HeSm; z;`h~?B-Ck=SeHQpzV!wPhI(}p4To^4(ml@&1)|~bh@-UJqv43xAQ4})NusL^5)E!L zNr-NCRa!L~jn^3@7FlJIXpceSfgyf99UR4(BwVkPcp$vSB=JoK3HrC1Br*i6QI#^s zgYg*#3Hdrq65eQ%=q8iI`wbF~d4qahXlIjzSC}N)Wss<EjY<4{CJBxS>3K!NwFZd? z>ogMd`~9m-671GVAQawYlIW1InpZFoiqFtVFdCk3k_fFUbz44&E3R8i67DxibO_dH zYO&&8gM|G!E>L}90Y9xPRbs^g!Br*+cbg=#-Xzf;oy5bjK7&MjW1?DK@kl79k&r(S zYBx!w(<HGqIthd#Jq8Jfs$*(ip+Gn~-ypGAr%o`__L(H?i)-lw!_f|%goD0KCh^lx z1h}ml3I`)~CW&<!Boyp7NwgL#{M2;9!A_GzwiqN5uAZpJibU&m5($R8OcL!kNGMW! zw3ZIKtJ5Ii&=!+KMq*W&QsziFPOIEh5(#$cB<c_Jn<QL|m0n7$XfW1kkWjeKAW`3# zT0K_OU$2u`D73~T;eM0EV#jIe#6t0$LBi4XI*I%ITTK%1P14ed`@-!eiF6wz;NNbL zXnf3MJ)M}p%2M}Vp?EAX-}DLAn<TQzB+(v?gnfZP^%OO)urCy=H%QpmtrL8^wA~=s zc~8~S2}A-NCJFbNB;uWB#ELbWB;Ku)U?f04<LHhSY;fT^lf=6W5)Jg5Bw9N|PbV7h zG)OGiXOggQrWPyY_jgD#K3{C8nR((F=q_tFysJDz@Yh2h`8CK6cRg7M_OUqDJP~Vm z7%Ig&$d1K6oIuzn^g*P3oJPhsG@nz5U{{6L9(Y%InpvxV<|4+i#pJ?FD$$tECsM7& z{E|ddI+bZG)E?_U_SlBzRKqz5=}=o6uZ>%Urq*JjCEM7BSPhvZz5yu~6HUp6RAN!K zm=)d<WwOb}L{k<qkbzE<txI&!oJuz8q@g95(@9IRJ!c)8ZEC`^=Inwg<#h_8<tj?8 znOc)ADLvh6A)td?woo)kL&had`BW-Vn#`hP!6@*;=2W9-vUF=&w3GNK%7|tY9~-l+ zDQ-oX=_1syG>5{%v{4F;P_qz7;DNm9bBsy~mS{=A*5Gy<mxLpwTat^6I1Sm1+izTJ zjZh&8Br?e*Dc4crMVTeJ=0q-;Zgop-8?*U@ur_4UxrNzwt>PR*B<dDaM$DwqScPIX zr`z;wxL6q4c!;DZ+_5ykQh9ZNYolUOsx^g%NeH(x!=@pZ%*axTwonOls#rw9@c3jc z;lkoY5^yvXh}K`ch@NyQy{M+Sg5Lcc(}r%n`5~DL8=Dfje3pkEZ8JWxVJ7gaE0iRm zKq(59qDU!<l_Gzc^!;Tr@CVDpEt6}a4bN`QHrmq(m-<-R&@1*78D;<Qs6Y)9>DH#K zY(Z|;b5i+MOHC?)-*m|*d2Z8sNJ~)6W#|Elo^Eyfj?-+$@X&K<ZYk=6*V(|1rOo$a zW+`$JRT19kvTPnxraK911y$TL$<{^ll8dOhK3NQ&xVa8Iqg&K)%*01mik9Thg;aiV z8dJM#6w?*O6<aS)QEVp0HO6yWQ|-dfi7$K`(+x$zF^*|&KNj<D#k#^KTE<AdQH>^g z)L+`AGPaV3a1IRM+?;A}OfO0o3#EDBNEN$8tvB2}Xm?SuB4jjb;%wZ<=CD_(91%t( zqSKg8WR%50`bHodtf4uXr(HtY-Um7Em@u^dDY(6gnL3rHO+X;`<FWRzw&%x+g{BR} z9?>XZsuf!{HX?CA!3E<f%i+?~nRnH6**%*}welf^?Rp;e{$<L**ziUEH1}aVi=C#J z8y6=tX*}_bcXak_iDrTmjaoYjW;kN4m@iyJjqFS^Voo)a!X#Ldl+Dzn0tqvzkXFV} z!b}*mW=X;}QxguABpfM83Uho(QZ`eQij*W3D@h9bhLWUgrY03DNeX)qvxc-&DM`$M zYHDC+>tW}kb}>Gdq+YIPXrDz{YN?m@4R&K%>cP^~v7;+3yA8F}gQaB;Vb9+x2cusf z3HVr2m2zVNex+3@9Sx4#VspG}hC*YiDcL5Dc4?e*A@b>DE2c$z`%wH%j<gAJd8EJG z#j7nTq1pfvmbR#FQrlG=XQT=ie)r+Tw#>A2JE<w@#kM*XKR<`#&3XA`YoRHdZ(+Yw zp+JYbaGZ_}`$RsYVM7wf$L*9(F`dgSv6^tYlWIvMGZ`GA*&oi;KIK!|$8(L(bmZnl z#4&hdTTc0eAJS;0kIvMbNf(NVOg4KCyil~sCu07ZojOl1W@4tCrKv#TWQ?{7I~BVc z4b6$U>7|@E?|=)LY*ExBfpY}f0VB3+p*@Aok@MUls?m~|Mum4jo`l)>#8gW*zeItP zGueXbG&hwxM={SmC(U)SQ>@E!KiQw=&{?0GK7Bl{sDP<d(`k7+V{^Uex#Fb^hjtAm zcup#lN)}S4H@f_kxy|&0ByOt2W@T}}=OQXji66r<j??&{O*uHEPBc!4`6%8wUN2Dl z+uJvWCvO`XN#*ld_pEARTRPLodo=g>pU)flIG1;p=|X~zHVO^-bk0810!n6b&B@lb z7CODLTH5mXpJ+}NniIi<KM>;s!Sm9se9nm4(>O}zayY%mV5Q^VrgVF%G0=oVM>|RK zpee*T5YhL&)Bt=Om@G7;(}|{hwk6S4Z1P9S8M4J@oHv#p7YHQx=hP+Bm!@-xQ*b=d zlFMV;6&@%ejnW1lfn-YNQwec>z-=Tx=ye<2p2NgUUueTAI-M6fQ(K5m;1ZZA#Hlb% zfFW%cVNbQ-2|5u?DlvJ^BE!OTYZ9A?Gg}6<1f2a&8ONaRXzxPGIEHX!RcOnr`wf{n zrf;(VN|{@;IM6BMz=vh_<Sh%1ofCXH<%VpVIElA+2{Z^CqnzilUm$MhLGjo`OgUW; zC#~2jZ75D*Ec7IXcQ%7fff|+vVnZ{Hd2tCUm*t~T=8dULF<HQIVV*}KAG{?NB1w^o zxD;UKv)FH+Em?dX*ns)cKJj)&j{K}&`J(pV(?T9e`h^0E8SPb)#RTpK&_0I6M?O8E zZGvaMNj&#r4#!a`#<l%%a<+AGO3X(#nPMLo@U@vnoaWKh3ugzaL1zc5LEa}h6FMrO z8M&0siE3G+yckp(Z{ZSL=D<<(qE=koDjONQk%1kk!7-pJN5`1gTOGw{Pl!S#=FFR% zm`q(Xx0q}==TsVH%&18x(IDVYbDP_WjoI^Btwdt_+!@K%#!M>Du>cCGhPHgVxCCRH zu5mVChnr5>51x<U0opY)TX|xhM^{H{@Lcek+1bgs&{Y%inYJj~aP_AK59ik7Q9`q` zb5EUK69`x})2PDO?cu^)O&|;lMxjU_zeOOdH9?9Yc@VK?XQ$u?ZEFG%tA;isccM=4 z-l2x#l0lua6;ngD6?0@8#(Eke*@}~S8i+Mf6hPD+m&g_sn`@%TfPb&U??<kr{55_* z63^p$;Sz3wNy$c0Uh<$)Cg!#+oWZjvei6b!sYNZgl3atQhu0jp2v`0TMac<9DR6tt zp^3I8g4py}aLi~m5pFcG4b<S0zf%C<wpLWXvBupRl|5_?KgPR)&4{R6sWzf17B?5= z8g>mX^UtRC^Xa40xyCK+{*SQ-KE@ubY{z(?k}9}Y3+)+4Tx6#L@WBp^nlde>)WtID zuBB5xDqXZM7mK;k$ebMQTg%1}hH_D8|57%JFqDhJUkj8g7aO#W<iTH|6E&OBfsU<g z<2%NWX?SugTQgxOS2J8<DjS1&xd^nYDH}r=%0{7YHp;agU7RWz2Yduut|qQQYjFBb zL~a$vR^!;pHmYO%m`3IAT*{SR7|K<czmzE#rOdZAO3}p;w(~WPH29q>W%l<w(hw+P zaB5nbR%tbLAE$>5${)p+i;H$LZ=cA!)L@sk)L@rZGiasNEEP&CeYDal)b0*0HJ`ii zrAE6i4C)LcKBA;Kw{){rO-^CUMJp|?>E#r-ggbyMLB~R6icxAaW)CNxSw<~l<w8m~ zvy_U#80fq;QnqFk#b89C^B#)fe0gYWAth!bx+n`D-pKD5jU>vsl(ern$Q!7Y4UaNy z?Rr#fao6P&w7YONn^LyEZPuzn-#=EWgl02}ui1>F1jkmkQjYOsszYvND<TX=r}Ahi z7sWL=wWe*6JjK_oWvX84VAiA5qjF_*U$aJrwWN&VY?MzE2P&!IR<XQ>-zO-w5~E_- zRUe}UIPVo!``h!%m8j_Hjyt=tDtfx3Z~)H=ZBs7Mk8K_^QiT>Obu&gU6<1qIV9ZA) z_L5e1ml_Pz!n#+*meAckK`XcsDz<>)q85Ijk*(YGVIXbgDj|&n7oFY86<8RYV)9&} zEYK*^z~x-bf|c{BTt3s=EM|$_DJ{?Sv;w3|F-vW3qn6s-tx2<)_0o)$D<s{_nkWWi zs}NH+EnP7-2gP7SQP;K@kyMk`Sh$u}sjXC#(NwC*XerxNwxMj>$Fvi?%sO*3F*mBr zjZr3o<Yr}Q1<wE#*36}q*36|9*UZMX0Tfa*hxAJara4^ET&ZQ9)IYv;$+J=m3!Bl( zJOkS+os5B{nT%-M3HH|y1v5j#ST3sjWq^?>$5pImWL$nqIOdXkHKQ{;ly7ayjE-_v zcW{)mx?{tzn!RV3D|epaXjVxxxotsRLsw&PO%ZFZ+$Pky(*nGS(RWm3>aW?%8feDK z<(F<sN!+XT{N<Q=<<R}w%q=`eQ4DT%*+O-5R)iUmG?NjH3&)Gbj7Y9QYbRPwR;isF zTiJGUj33iZyjrbnQ7SBBD^nP%ul?PDw7P?~oYft)hSjW!VXj;m#nJ3`&183ndzpm4 zOLC%=VB4LNV4LP`QZ;RM)V2pVzQFvMk`M>(&Nai?;%agQtJ6Le%%$y9#!;)RUI1~G zh!_<I<-{5&*`@Y1q*7~1q4dZD6v}lhDU@nb8&>~H+a9@GOT%JB(!TUIqUkm}VpB`H zoxX4p-y=AmY-8!S=C)s{f!fRcmPTpKQiIcwrIyk*)P0;{8k9b&Uj!Msn<h1X(^kF& zs+U>@ovU3zMG}20zX*_H)Zxks1Es_UbqZ_X(sC*eP7zfkb6@N(VNh}%&}?5lr8<?1 zZC^vJWDdHUTe;Ywfz9E8&5?o4(Sgmeie{(TE452$`<L@{I-;yiLi>oWTyK~rr6&|q zNnsV+00p(ZN($+4SwLRVfX+`hmMdc!t5QteT2fNoJV0Sx$CC1@CUYBfSMsWpAq`d6 zqA%o8s#w9`w<;I{WeiS@OQV!lR`+r0X;2(D@dRS7Gg8Vukc(5EfqY6!R>|8bV?}!z z1229WxU|w`fYM5zPgGj5;>sQal?o-l_2ZGRt=M)dTE@aiuGvy5R%&pnQ)(%#gzlr| zFEi5%tgQ-Dhr4dDHxXy?kF#vdj$mT6m3vm<oC6k=T2^*&YFpW(wAST)o!VEj+Es$t zK0njG08*IlsI13!M+SMT1~UrHHsX*`DV2z%n#xAw)w^a^97|ZtNMfGSPBukOu0fBY ztO3`vQ4MAkO3YmlXvQ<FW@NR_axDrKQd@hjoQW#7GR>hbPA`e%*4oI)HR#2&mzC>P za-iwzE`T)s6^j|EOcg?6HKS2_Wl6i4yj<&E5``O=t~k*3ZY;SpW0u&>;z<X4X=cR) z9DCUW_ynnZ=C-M9w6bl(B`P=C#TrWE(h3b0)u892+~%QIOf{HMxB%s9q}?K7bcK4W zh?!Nz8YwrEm~ko%SmkaLJ&J13Yoy(dVn$LcTQ*vmK2q;xF`7ZSr^U>vQjOG`Ui3Jc zMK7Fl2TZwcGHm4|mZ_E#uiV&!%`Lw+w`dk4FZ=!*qgD<radtOzJ%`FuGnP!3tB6BO za^T*k>B8BX&5TMM$|q5_*$0}>oweQNOIvXRL9|NEu3C&j+BYT{&F;_==St14+|Xo< za@_h<t|AUC$)TiG^=2<!&R&`yCsDT9wVSLeL@Zz0%FV9ak5$r&Zig84wC~t5B9z?6 zB^K!G$A>hFV~xCPQjQEuY-NuLH7{dNBvY10!}f6?47_f<q{xDn)UVP=QFq-Xkt+9` zefNRgtK}n>>p44~FqK4e`$r#TmG_cp2022Ndmu_$rL0p){?bdoqoQ(ZhF?j7+8r1r z$>`RS$XuGm6%NRqiYxX35|H=*m6XBF#Pumj2$_g`0!yO1mXb(L$`xW7=91{njVM@v zM0cr_<ZRkY5}?84IH_MK+MAnUE*o9D>7}Ful!ES2l8D_r_MMX@Dd=Ww*_342?-I(| zPIXs}mqsi*)#z?YqnZZ2Ch|7TGE<IWs}PZIXVL2~BMMuEh&)Wn?L1_3)nlMU%1lRk z8rq~}-e_ds&}3JklGV=NyzR-3Rf27IYW#9{McL6Rnw994Z=O;TsqDlhlWT!yi|?<> zK)-S?7VQR|5vaSC4n5cIj5(Fq^)MUNy|=4EtGf=y&0oqMx{SpsbQx1=$qgr`_$An` zgL8$+UZLT*o0zMrFD@xTe%z&rr3tE6KtoPFRJYO!I98`9^0T;ANPNkOM>#2NR>|VG z%2=FIlrfbS#&B}VRD$i+#H{CDpEK^!v&Y0hF8qDGyp2z(V5z~WMX9B<61tC52ZL%K z!<F)8L)pC9@-cbielKyHq-SQ{plD|9-nu9){&I1&a_NyO6wGzfN~U7BXL((^b`PZ6 zrDbdtA{sjuEuy(&(Tv)?lofK;eJYfI8{fI_vO+?d4~DE(5;pQ}kg`AcrkVkqoUR!- zsnTAm?C*5gKpq1%fOZ4vK&_xV4w$5J$LWA6s(u3{NV72Cp*m1%(y44q;9d%x?|oc9 z8D6}QrnEO*uK~N$b^C<<DIyHmp|%UE=+3VwpnW&4UcCW5+%-ZxiuE*<YE??4Y?aD6 zE7d7$#zPk9VG*fBCbc+~F>W4~Pjb|5B9>2TOeAK~WAemp#>#!f;tt}Yf}x04dHJLM zP%IRSM1l&0^!t2~2t1>)a4^KC`k{@N?{3|AX{70_VIHg6esbjaMjT5P7pI)ZHsV>) z);9O4k^&E{w#GN67Pc*_nd|t)zJZ@0#&aPTtQ2Ht#HqEaC)s}U9KQ_2s&6`<M96+c z9JJK5v^thir{m`iZ^X|Y_6zb10<Tq9KR%B~DJ2~*{B+_@`04EJ_%X!)2zDrfTC1*h zyzXY*fv01h{gE4w6#RO|x9g58QSM<wJl3~%g}@8R!_QYcp7&*p_|F?KKL(!%b`yT* zJAR9^nc_mKrFhjLxWZ{%2M+a#2XWeu?<7nQ?|cq^FWSD8YHf9GtsDmAgcte!4L<Lh ze#+xF$*&&of7?FvnO{TEhF<ScQ>IQk?vz>cX3d;5;Sl_peB!(*hv@XASyN^ocjDB! zhj<4g;@fz4;yuUm45M@=Pgqcw&z_BOQdn>t9^8>`NEXw$?R!BH4{uAIw*Wnf#h1y< z0$SW!T#`#I$Syp)u%JB>S}=u1&4PTg0FUvYc%t#dVN}>&Yj5jt>)lH%8J?JK$Y%@L zrlNPuoFlv^<%;Q+^in(?#5)-iWg55EbGeqIJTYq;my60qulMoZ6K^W_>HFc2c+JI$ z%#8G+=0qKac)EZR<JT;PSJMc0Uevnwt9DrR-qx^TwfJ}~2GvQP^Rjs?$Fzn4&Hyap zeUgXLvj$lw4SNS4SK#fus0^F%rgAK^;SqzZ4*Fb+a36$|5PA_#MmQGX6ohzEv^5nW zp4n{S$1>^3w$@C9CnG!_;aLbzM0gj%lMrr3ScmXW2v0^xb)I8~*nBL%(KfAvsD<%^ zun5m^+XhekL9=9=(5|1RQK+S;QEuRtO5!OAc-+~(fHeGbc%S6S;$aho=4`ge&1F%0 zjS-s;lx0!5sJ#xsdz8&Hs0Wp`1>r#mvk3hNa|kCRJQpFR39E>(1>s_ZS0g+R;SC6v zBD@{p`3QfEa2dkiA-n+L3kWYn_;-XCA*@247bE;K!sQ6RitsXoQxIN`Fo_U9RoZbK z!YdHoh;SvsE`(Phd=TN)2;W3_4Z?ne*CG56;r}4~66$w7!h;dsh|q^{6+-m2bu+?w z2ya1n7Q$N*HX-~rLh7g65K_PX3U9MN_lKRv)ZPfsbo+BE&dokUe^S>`f0|vlC%6}U zINm4W0l)iLRl^|pbrfpaF64f28w2@2JRGu_MyDu)@GxcCS}gAWe&Nl3sUFn-2jcyT z&DWvcRJZjA0|@U&h-ac(8xYcV@gTw`gbyL4{(l4^mEczhA3*pUgw)@^MfeoL%?P(5 zd=%j>DD7hiYY;wxFo5t$gw)?pBRm7)vk1>dxCLPc!siiE|NjBu9SHw~@BxH<2wz6{ zBErF_$4dx@Abb_!Fodrmr2g58koxiWcn6K`lJcdx9)oa!+mAC_@r12n;`GG4HauGN zQ%qOXW7Lykx>|xfMAwMVt=0&qNAZ;FlRQfjMdVY^`t?Y}z5s8$_JT7_RCZzk^rhOL z-Rva(P<^OBY5QGm^AAyfs-vgM>KKJ^5JEiX-P#G^X$W^l*nn_Xgp}j%2(L!C7sA^R zRwKLv;V^{j5$=ufVTAi2d>Y}t2>*(3B*LM{e}9B~B0LbG7vU&`6A>PSklNXckox0U zyeAs{aW3rGU0UZLJj?BmX?V_329G#%Hm<}xdR_~6Of9^f*APcomc1XT1JU*)&ZcxQ z3@3S7WygqZCZ~0Qg+kPdB&*Q{AxO~$cqB1ec-SzXBnz{}Vz$NY7@B8$MO6Mv^`d^E zDs8m65A8s84I><hFoN(fg!qx=j#`ArB0L^pEy8mUPC`iA*%X8;5KcpQJ;Lb-*CL#O z@NR@BAf!2K7Q!bGo`{h4Q?n6Ll}<)D9^qVswEdleuomH|2x<E}4dDWWrz1=wJQE@H z#{z`ZZ<Mz=A6^AJ)#d95zvlMaTpXno6L{ni9!N%8Q8iqgm)=>lfA_-l1D?D12~X5j zgMq}Xw~)JvB8$&SG<NC!pUOe)Oyk|z|DTI;Q`y=OjzhQ@;T(kLA*A+fM|cgwB?zhg zmLjA+T85Cu^#us&knTc+^n0ooA*@5#fiQ>gVuV!h%Meogtis!DAM6{seX#Ge5+&`^ zw(!%o4>h7_j|Og^Ptsmn5XX5@xv0HH;!Vdi^jh`*G502LSykKr|3Og+H6XRrET0q; zXH+y$s|Q7WC{$83EejA(Q51p)g>t})m4tS+tSlS!Hrc36W@UzDNt0RDy;fFMRuWd) zXrsUP+Iye#3_N;oH}CiVKQHmK&pLZpd+oK>9?yBGhsf(zP~>$RDDt`;6nWhN-VUw- zrGH-wz6kyU`~bWY{0_Ve3_~t=gKfckz_Y-0py=0qU?q4z_yG6-xC?v`tOp+ge+3@~ zTf^sium`vSOadPP8GBief+E+)K#~8or0EspSKv+6kvdsfKKZA~7skgIDc#H>seJ|N zrkHvWj{+QtIAxKBmVQ}Z<)teeLb)a^aR_DoRE*^gp}e0O)UI*}v-0`sj@ZE(A1S-6 zTqTQjNGY0-;t-O{R1B9xNGVgfBtp>cszg2xDf|v`;-u<CaZa4PzLxknkHk=YlK41D z6YoTss;iXXBj_r*B@KUL!p7=ceSKA)^i}q_V=wJuU(z16+{n1%ZA0Hf`?ckMAJ_x@ z3`_>U0H=fd!9ws$a3T0L_z?IFDE4{~6dgVU?f}0BKLdXNWtw^zlz!<~unYJb*bDp} zlu?uwZdHr``E}=tOfVdr3N{7B&YOYdU?g}a*c^NaYzeLhqrlA|POIWA@Fehkunj1B zd<rPzlXhTRustZ_($m2H;OQW93X92~(&sb4GVWtR#>&>2;LTuH@DVT$d<yIaJ_Ggy z86#P}z@Ne1Abq~o7i<pp1L>Qs1keQz1e3r-FcnM!@%h#uFbf<47J+Aj72vtxHJ}?@ z3JwKt0f&KNS1F*_->>}j39`R?ph?@V;V(PL{!--IZPGiW^U%H`>;UEIDPb0r1{NrK z5nzF0r<!0au*@MC3#@Pm#sZf(1jhn>R?3&9%2i+QCYEGACXBCA%2#tw!Z?y0B6IE% zJtb9RZ2ziA-D~-4#-Et2T(gjs$m24w3s?e5A72VC0_T9M!7^|SSPqJ8uRxE2W!orR z%NBjMrubw#H1G0!J|y^Wz1xXalNfTAE0%GVs;pErK-S^{MUvW~<mOG2&&7(vsDP;Z z?CjzkMo%#@BF+t+MNlQu`?KPp+>xJ1Z9lh)n7XZ$lx=ULNqO-qf49VO9Fk0s5~1i4 z`OY1KbSYPoieHk7j0wY0+2d`KSCEG^su3%Bs}yL0WFd~rq>vxNO^R8B8ObH}QI70e zZZ^>d_9e2Hww1ykH1s=YD{0$xp!A>jfg`~C!3>E9&ITU>OThJD75E4!OLUKdYr)6C z2f>ZtQ{a=}%iz<Xj7y#YWjwbTWa-S>0<xrN)qpaeeje-zz5osYUjk)(R}0PtUjs#- zc7QUkegj+sz6IV7?gGWHy#tCL`xjUT?gk?f%)4L=xCcBP+zWOEKLOp~K5#VnIhX@} z0hWVx;1cjla4lF5-UEIO_CSXZg6DyUz)QjJK=DUEf-}IwU<vp$D1PTxa0B=|_y%|c zJODOoVpaSCHU`Bu!a=d2pZE(NpN*$p(q?18oCY@Jcqlhf>?^_!I37xjzJb+DgxJ7p zvLFUp&2%UstVRq`Yoz0w%6uf-H^oDem;t`2uR{#-O%*(_FR8caZ%h7!OS#TOP9lr$ z;5lFqFc<6zUIX?5SAf02C&74d8`uy09!vmb9ykDu1<wM{0~0}!ZxSf&a20>S<Fv)J zlgwQiYg@U#c2MKAjKcq>mk>`N!qrkNQ=Y*m)pBjt4c0}350Q)ix=03m3vU;KDd0um zSa32Zc6urJ7?=slxOfWq0+<7yLcQ}qvCC;-XK)56c3A-a3oHab1TO<+UBe6h0L}sL z#6HTw`@u?(H5KbBkh!?E1Uv<-0;PXn3W~j43+941fJNYq;5={@DDu4-ly+D}8NGx0 z>+#{tFL}loz{>NrgPO@@nugc_5B3#d2UtdpiH@`e#jN4!7>55*{@n|o{#5--4G#k> zMZ9k<MBPd`dK|gaN6;%MtOy0P<6h^!TrGQg;6ks3(lzky+9`RLtG>q#UFTem8L56n z239@`l;VAZ<Ffv$H%RoQ>aVhqMz^!c)+~zU8Io^wYzTUMpGAzPJBuvnr~;RGq7Zyv z_}~&PtstnaxX`j!c)sOX1<~wF+C}tI`W3ICZ>AlktzH1ff!n}h@I~-C@Fh^j$=gBc zKWf2!;LD)&AFqS$z#X8h2fP8E5AFnWz_-C!;6K4q@L%A3a5uORd>@qg?;h~);76d0 zk3Ru7fS-cfz<uD$;Af!B^Y(*ZfOVkk>wFEiLk8b~B9=oSYj@U9U>o%HXRtl^8#oyJ z9dv_XO|1&nK&-~#GO!7F9oQ6H2}XeLfsx=IusL`TJP~Y+JflIz>Q)TMnA>Uvb^%WY z8EadofMO><!(*_WyvcKs{U&g#pPk5z-nNq(%CfJ9cCvw|N41lkJPfcC8FKB0s8uY7 zX{S*3`X~%-gtFg9Vc07asj*4LXh-yo`H-P#uV_&R9Yb4_j8%fIDbP^L6I9kq$jE0) zGA>RdsmTh1(}Sx3bCP`APNcE~V(VQCJ5@Gp3oXToB&Mrv?AS&psl*ZZa_XzBS4``f z&PO%GhtM=G5zKPx6Kse)`j)?1bilr(?Zp=PWmHS%eR2&&S41CDL9xa2z+&)x@H#LJ z6k8kxiY<-?_km+TvBh-oRPX{&)=I{Mveq;Kl(o1E!M}kM!PVd-@G<ZbQ1(JH!56_S z@O3a7d;`n{rH{!2KLV$NGM1YG9s*~AqTdDJuV5kA7>N{t&A}3|BRB`_3C;!GU>PWT zDdiyhV%9uR#(ML?>0kwT16T=)gs%jpPpSr2fXl!e!M}q~g3H0p;7afX@J8?i<h%+z z5xg0U23La<z}vuy;O$@mxE5Rp-U(g{-UZ$U-UF@$?*s1y?+3-EI}sib)c2jo;#UIC zlEG;{n@-`&>>L&0YxcuRi`l7Hy8?*HzWhv^8Edp(x2JzMqm>^erO+&jHs~GO`^7Tf zCeIvG>Xp~wRL|+A!~l<=)E%OX-kAF27xP_USws@8(KLR%(W^EbCOV|4{1#tPUaq1p zA>qInNj!%yf-<90HoXaIsmjuuJx!Ioin|yUPko@jM3u4uB0551qLrw4VtaOes%V+C zP4^@6sd8^|VSzI5bxx)Q>@(|0^%{q!3JO?~@6NNnR70YW?PgHhdC6S9CM~_D|K8Z? zJeD0qE{R<O9wW9?S#*(0yudb4$JXw#*10baC`4E~q?1V@uQ|~imO`<`WKJ$gv9n<c z|4MA30!)SElIit+&=&8k{9HbEuekjlvOl+no%@E|-qVDKy6oSaXh-Gt8_c$jCgu{a zEi+A1koN1*K7t-MwRQ;QnjntNB+(8$+##5mcncq)UjyNu7NH6kQOPp0&dFidUsTc* zqkOSD{QKCAPH^&eHH>YK!nE&?(~YbWh>sA3n8IHNLw_5eB7Wmz@O<zSa2mJ|6yx~} zd<Fa*l;-&Y>`I{sw?cHf9u#do0A2}x1IoVVA@E`FTTp!Z51{z&AHfzh&S6m2#eW3{ zfWLu*z$2gsY}AakC9nx7!``OgQm`4w-nrEhybnAP+y<Tm%1FBvSPz~I{tli3vL|S@ z1G|8yg0g<t0c5YqIvtz|x<Ij`uHY6h4rC42>IRCTbO&Xe)e}qsdx5E7Z*Vl&51bG7 z2U#Pr27qEN1Ht#fBv1_ET(AkM>;~I{$slu0YZ#ahrhvDCBS2C4ksxDOD;3-eo)1Q& z*lA!Ja1_`cOb27Z3&3vRI4}jw0O?<?2_XHIH4&trvMvJe051mVSFB6G^<WnG5jX`z z2drFB3~45a%&b}98DJqu9jzh|-mGHq3a|ux81#aB!BVgl+C3K(n<xiG+b;*_gY&`b z!G++9U<G&>{2M5GUJ3RCuLKu>SAmt_)!-8F8t`qf8vG}?6x<E|9sB^i4wOx->%m6g zjbKyoX0SVWE7%jf4V1oB*4%^l+rLAPWN+>(aJsK=WnL*iijp}}en(dItZpLN7j>|& zqiyTTe)>crnO@LzZ{o&X4mDqS+c@W5bxzWK#yTY3efql;IfVB(&$%SGM9>}@w&gya zd%blmxrIJ&A&$kqr2e(soWY;?Nx2?FULuoCpsY7M1qw?~gEG(C3=RXgfMdWKFdN(o z&IO+b{|0UYuK`~Kh2>Yl7r@uRUEmH-_UGOJe+1tI+rYzHpt#C^g0eoi8(a>)58eZQ z1U?R;gB5$hPr%O9V;?vJ{0yuBKL;0sb>Q{jm*6_E9+a`)S0HCbtgpf6!Goaa!68ue zC6B-0b-C8iFd60a^L_dvKLC@-qR`B|T%|3<aIQdYkw%N=+1k!BNGV{5Alp%DEH7<m zUs8^=3+~Ah*~`@=LWZxD4@#%g3=}>e;jd@Vm~j!bDE_YCZ-zggCGw+gGE{W&#J&Pq zl#We!F)Z@KaB5s8s%B0lm=j_$jgu^NM9%jpm6Y0<-c_ZO%yl|``lgtlXz{Oe1rO~@ zc$PZ1<j-q}_?HT)M_aHh*bWqVv<Lfu9l*1|)4>$5BRB$dfimAY1Iz?Ff!SazSO|6j zMK))GBEz-(1<O$OKcsBYgPA@VrsNfjp{oDc@qr*2#*tO6YWbq0%1~U#F=bXnCiW#f zip-kxmuraqsFUzL5EPl61&Yj)z@Fe>P#W`W&;y<Wo(Cp_7lK2<9B>#Ybsq_ejBe$x zdyt-89H!3^j0X#RG8!kpaQCORtf4-MDvCa7{Za3}9bG)%67ev9_9eWDY&!6Fzz{R2 z3tfUW2^4lO0y~0}!M@-npzMWQ3RZxb;I&{DxE#y@Zw7P0yTPfT%%7)$kAnGN4LB2& zk@qZc4_FA+fkogCU@`bRSOOjay&#K|)?Bb9SO#_k%fVjY72rT{9yk<S2+EAA0u<RV z0;P>)za}ZDjiilZ_!GOB<!hq}bZ{KmEyx@<H!rV9|16j^8L^xz!U@^Cp7J<gz9)?) zS|%lo3A2|oT|NpclfFH7(L4JRzNCG^`4hdAYdQ6hoK}F+_pAhk?;A}07EssV`kjH3 zY)70^!P!Tx-?*ae|7urP9QJf_*Y(qf9g4U&E>2G%%6x==#MIl6rXS9ms;7}lh@(lx zoEG-tTJ&H*XT*7jQz66=Nqpa!uv~svoryLh5j8oL*kZ&ccHpc;P61rbAD3*5#)Gb= zdJ<gBi<zpZArN)WIlf~OE{JM>QnF8$WSZbxAu~z((uV$L{9L*;V&h|xyR_pO{MloO z+i5RpleM6<?VX^kOWg%Zd)^IB0PhE%1s?%rEbu7!9k>aUy~3x!1n?Qq18xQ<gIhqU z@k`($a64E9)`GHs@G^KW_$s&?d>z~e?f?&hJHeLp^>2c*ezXfb7knF(b)$cR6TsbI z1^5BD0{jq^F~nYw^P<+r;M?G*pp2zH2SpFR01r`*8I%>Qubf{{`g#^vcvO8&q5YK$ zO(z@sim(Hg*rWeqjr?$$YWyss1Q_W5Oo7GnMPIc_7L^q=RB2Hw(MD}NQ?;=KsIkNl z1<^5b`UcFlOOU8|Q7$o#1Tds=1nTB=WNu#~YthZ_{E6Pkb&$3Z-TVQp0Ao&IpBX#} z+z7S;w}5RxDg6}iBd|UAGuQ#_L|z@i?w||o19k>yfw5pQI2?Qq^nkM8kOsD)Mq|MC z;02(Zw;2n{d^rQm2gidlKb{B{ftP}EE-n+40{~gz?O--2`_#E0XPd35AZL-S>EM@O zKKLUz6YP&p&H@v~M}mXEB9JqkRtY!`ECnwE=YpKEv&uov#95bvPk{5lKfnr5baxRb zI$q3Qu#QWU;(?Uhi;k+}<GguV$BF4&fjTb!EShHlD(&k}M7ius%9OT-MQ6->6+8+b zSA(Jh%qtbos|XJc>L>d`6E&1^<z+seJ%z>jm*a*1&w9#lDc{YXeF<MuuO|G73CML5 z^$=cf2Bn|81?&Q@28I7y!9$?vV{kpMML?qevQ1KajCwjfW)YF?t6}R@@F<{l#NjM~ zDEx7jTzQ4%gtebACljRs3_<spYaj&mnCl$UQF_c{c8c|+?o9Q$>=}*j6nU?(L@^b| zBNu<F2Mk^mmE@&Z50@l&gF(q<EaT$ON$xk7tA%b~B5%1rnZM13csK1MZLkjP2HpoI zfe(V~!6(7p;8UQC8=nC!D)THTm3jf30&W8<!Iwbk-(Ch!gzMMA?%*5XVDL?l_kpZk zpw#MJkoPLA_rQ0+J>Wq2{0PhfKLtfU_JN{Day}<mk2pW1^yn_I<QRJ7^ki9NWM2_> z;OIS>s9giaDud{+SQXp{DAp1mK`WN1UXWsm^7#+N{)3+EC@K`71IJXyCy=tVD3|nQ zzTsHVK=0^%naEr8$iFZ9iuMsb`VPDb43ETTgH6EaLDs|68gB$BrALCI*)72)v}qLB z8$1b=`9&*mFnBU3d+Dcui@}bd?ALVy_kd@D{i#tmFcItl%J_-(wu)4+H@FP!1O6TC z2d)GY!PQ_AcsDo*l(m<^p!8wqfM0`duo3z<6qG(|7&rkO0WJbP;8kEMD0+H6D0}Ur z!L?vIxD^}=eg$TLosr*oFd4iMoC#hGivCUpMbBk;5v=E;Uebp|%kyLC`CsYHz9sK? z{_IQ2l(vR-r!UKfN8uv}6kc)-&o3gc_@KUQFzd5t5{I>GtJKGHN^$mFJ>OG9OYtc7 z6=;yH{kHu^^CG7#Zsl2R{ix$|vS(+CX){SF;XM-Hq0MnK`N8yz!c0l0hNQA16JW@) zZzMgLF=YAjko@eqOznN9IX64sD?bA-R#ir1W99uQi!%ohv<2r%m303g8+)4q9~8*! zOLC}iaxf>$r$f-?%gJ)-vqb*3Yms|5_qvR9_1xp!U!Zor5`FPAr{}3Tos3q}ooMNq zX?F4RAesu45QvG%auPFT&YYy`KG84bSe2i|%=N|0E+eMYM%2_~CnIM4I)LU~+)1G{ ziNss%#N*_<FjwGYX5J9;Ut1o{!&@*0E^$%&Kq;ufTvS|?oJM`fsL!g-vKXBdbE=F` zxK^9{EOURmxxZMnm&?9qBS~En->>gn(^!+`f6-&HgUk4nvomrPqW7ZP3&8#$3py2U za1l5Pyb`<=yb4?fUJXjWTLns9)!;wDWuVmYT2R(vmV?bjRY6&Yz7CYW_Igm(U~T{t z!5cw2Ke!6a0B;5-fwzLwz}vxU@D5P+%kBc@OvE~{2D~4Xa~ltWAA=8p-+&K;a`xd- zP|iF&1~$UBp8yAdPlBVsr@&0`S+D?n4wQYgt>9JQ^WYue3*i0Wiy-exTHC?bz*=xG z_zL(f_&UftdDadv3>m)#o(S#&WiI;;$U9ipKf&qXZt!w&4=BF)Lr}&zAAzgEkHN>l zPeIvl+Xuc3eh%&e_k-_)b>OGqmtZ~k71#{*`x=Y~4}s#NzXL@re*k6w?Jy|&Z@+=h zgTI5XgDiqpa0b{413w4D!Tn$acm}H20_+2}1kVOf1c!pH!1KY@U^>_qoC>xFOTZ4` zBJgyOGmKV8a5Z=axCZP3J_Mc#J^{voFM!=Z&aheCLD}Ey0e%Vg1P_3{LC%m_eZVkG zp)VK(_5)?#uRqumOaKRh1HeRZAb2*I1agkY8VqKGL%`YK*`S<(I2Ytxj5Q2g45ol9 zz!BhD&;vdQo(FCMM}t3s<3aXjtqEW&@ItUHI0-xrya+smxMkfk_?`P7(AyEvWsES# z*YAwY;}>3vGsof23wUWVyQD<*KYNL3UlDe|IkCADikw6fzjcssKo=r?#bJm=Dw2JE zMEs?6YT9j;XUcM<(BzPSLt{ZwTxKjOHEl{ZuSrWUAU%s4a#|-TS&=z`k~34~;d0_j zzPZ|CeG73vfA%Hy7a!A}zdeRni@Zc8uYlrWcYu??onSfmCU`Tr3w#882dn}A1%3#= z3myR91AhZQ1m%FjM_>o=V^G$}J_SdE`#@Ry{tUbX+z%FjbzlYfCAbVc0NxIM1+D?V z0XKjLLGe@Hf^v52dvH7W11RmjkiULG<Bd!4AF{4K5uDqg-F@4r@x-w&zZN&!sBRtw zw6e6F3!-kPyyD`*VxQdQ@P&Oz`6720e<B;XnzYbs{U?BDa^C`!KD#A242%ZHgE3$h z*b2-C+kmn+bTTMw|Ls9p7wQ1M44wu`+nx@719k)(QRW%oDPSj1)-GegL0}h9`h~9G zHDDaL0_+Cf0`>$S1$%?<f$`v1U|*2hTK&LQV1MvTZ~!P{?17-XpLG@}Yn6jQk^f*& z+UZ~X1-FyvSr`7U=daAyPJEbVN&$+_XLt4PU^>t3E3lo!@UnQs=~irHR^F__;_^&o zP}8AqiV<qI{<24=8r8%>-qYEStPI)%^?gOvag~WBK=f~Fv3wV_>!N*S`Px5=C-x=v zs^#wl{xS@43UZLT=76#$k_#q*)4-wN3~&lK6D$O0f%CvZumUUsMUFS|7kqADI5g4s zbNMR|AxHI9FWF6rCxU%N*a1scZ$*%9C>JY{*%Gs>93UGZiWo!7K{Bx~;Y;Mugg=p{ zT&2`Qc%1{b2IqojfR}^9{}rIr^EUnxg6z6CG=#7AXD$y>Pu?<Pf8jsdHuA5iIv(Ga zjP;sIQDI?0rh3U*#_%rao%kCQrs(Q*QNQt_n@9E~`~}zdO6ns#Uj>REz8Vx~zXX&u z!YWYedn12m1=UydB#OUY{9O^EzVbr^vkG(dX-ncbS76&pg9!@(RhA_Lsj{w`%0);n zNZOdPi#f9BTif*Tz`lepsV7FqHwyH%oO%eaE5LT(b)dBC^<WS122kp8BPjLV&tLG_ z(z_bzcL1*e=Y^;*`}K6(s)3gzliplXH*=ZSD~fn(ch+kN2h?1|u@2&;O4W;S53}^y zOgEYAQ(nM)R!3rHh0&KO;*`><Qz>06#YM~#w3jc)nA4~B*G2ZKOgSjZPFE)1JyQ~t ze)%AO_9gWc`N>-8K0~|}xug)j4U~T1b}$dT7c2tTf#Uz~2SryN03Qb*244r)gKvY6 zfYLud3P!^F<6wVqBX|M$6j%yA16~h43$6yYfKP#2!5!f9;5*<pQ04_Mg1>>=L3t0M z790q^0;Yklg0fHWIw)&;J3wh?@$JFwEZ-3lACSP`{D5}Wj;F8wQ1`JtmNbr=47Skx zxc<W2QVx3x(FL)qY6hb(G8+_?mFqK_QYp2xiCZY<5}ufg1o*0sYC5O-apkK>tG@Zt z1r*-t$5kC4BpkfwFc?}Z{s!>3AY>f_tk*>}`--pwaH!wzjfWCYB^ffx=%EvTs`7c6 zauV5I8`c)AJ|ZTS?`Jan!c<=BE?L@_@G5n042o}(3tv_t{1dN2>d@cRRdj4nke|92 zn%MkW{uYL;D<7JhT_WEVRmSUIc3@>gZX&wLHlX%WO%KGS(Ng=80>0lQ4WACFN;Ukf zY;SRXnd-$SLd;V{^)26^!Lx4=Co(DG&%UHiB9rD|t|8*<ly5s5JOi2=L@w4)PzoOg zjs-`67l9+eVlWlF96S${er*&evKkGFjjZA?Sbru!Yt5hJs}6^NT#Suu8xaqaGo`Rh ziPWW@>i+^oDw2ukK?4bj{`g7I)}3WaSSn*N6p@RYKl>8Cg6#yFvX2WvY{HrZO76%& z$>m~D>NyMl5!}bg`wYlQzKdZk3aLAOUjHBw?aQy0#_R9pQSi$`&Q7#N*$qS>GqE5M z$ns#05`pRyMS3!{*DA#3+cfhMcm;)hrQ(?$MEV6$l#>(}<(VbZ^I7e)2dJ7_=0_C; zJ^`|?53zN4lcJgrPRgW1e2rIStMyePie3kdz{Jq^G=j>N4P$;|6zRk4OXMx>*A0TK z7s&<N719RuH|h-KRB#IS)4&pNI=C3j2bY2~z?EPTD88>4d>JIJ`nJSea5wkpygEy{ z0F0un3jPfM7lD&O@>J{kSAn;3e>J!ktOljep{$C}LHa#)K4Li-OBGjuL&57oS%bO( z%mL{aD=r6b0hfTQL0R9w9h7qtcYw0<u?DOG?*u;u?*YFA*MYx+_kpdE(*xijkUCam zgX_UUa04jcdUzC+wWi0wL)5n#gKc9qi}{8IjIs2`HO+*ggVi#|+mtx!3jXxw$t3!+ zvpgEBzCxHeytp`X%uJlIrZ@Gc+b_N(7f&mlB_|lWnpmy;V-3rmJ-g7GY1TUQoVT-y z*xEm$ogFLZ>OGn`6Di9-l3{E7Z26phzWUl!u4QL8B}B|IoLHV(P&n7>ZnDb>5ovVZ zG(OTeCoj{Z7pz4L@=hJAKC@@e=EE16<J3p{+8TP8m0Xg;7?6b<^Q4`5(#T553wm@W z62A{S(3hXz)c%A8pd3ymm#A7yBwlz$i8p`Bh>XmUX_L}DnIp!G9hIDsIW#q6RC2m% z2py@wTUr<#Y0P-OTRD2T)sZ4!@-LG0n%TM8#kt03;~SdAbVNDmA~NhYJ`LKZ(W?CX z86`p=J#0)$>gbV~<IYPRhjX_dyIfPI`9Dq{JIwMW9xzQY?<5|YI&y&JauS!!&YtU^ z_`>AT<HnC3X`SxG$evy}!#~D(V?4=2Rq^5u8wtl_hmTGfJ~ngIn3UoCH+qc9{|vi6 zW5%WqADxk$kve8{X2#g@!!stO4`+bVEJk94NqYYn>0`!aj2kvKH9dn|B4S>l3}U3t z&MD3lrRIFYs60CHoRYD5IXJ6`m|+cLjLh>Y#WpcVl+Mm!OdS!kM@Jne-$WamcUfs( zi8nKYPkz!s5i!FX<|7HEoJ>Y^5ix@sMz9M?;WMwQlqlk@*YSjw$&N!rj7zuc&~k5{ zbq4pxtWzc<rihpf!)YELDb2|nmd$6~rM_)=^b0x>C=peNU#T=+L`-{~!wC71FKi~~ z&dHvglUJg+JdNkA1D~JIM^G^z_4s5Szo#FkajtqaGf5?cR?y2eJw2P*QJ#FI<P?a} znmCRDS7usacCM4lTl#@&40#}RXitLB)yq_wHTTO*POPiUL?)-`2dYNNURFG(t4CdV zbdG-HuO%b+)`}|EX&aHsF&dc}bwtbpKZe;zjEGt6N61VmoSo;??J3<3DaAOd;>=;n zXNWK&bPA<pP6Bz*SU*twI}b!ZinM+V;};|GIuS9yHE3b<A6ZYOEmcEw`uCA=DG|zj zpen;>=M;)>WH}=urh^}Q#s(C9w;$cujcTe7{pcpX;z8``70u`<HOI=t(|U_bbG)p6 zN_AVBgrXEqb%m?f^aES9ROB#CQ?hXyU5Z$wAE=g;Z{aei(oG;mgy320&`p{#lO3Yt zLx{Mnh?v>{jybj(z;Xz6&17LIB4)WxrrTQSMK{ft`b4mYuUls-y%61&ITk`ULU9^S z+3sgLA8F}P*+oi@QjbwOvvFR2%41e$YN5)jB@gbW)5}ON<Tr?wl$x4&;=ddziAZ<o z2O?6Hsqj2f(?;njj~GxVzvScc3iu?lqs-#UVcLue;5{#skxFpJ%0#{~xo}chySG|R z7&??GhX|mfUol2wR5{X|--T!x#c^{UN{5kFs5a9h)aJ2rb6$RSUaUm=|6*BX%k=W{ zMMTUQ+>akOUC!`}KdUn}(Bq_``Q8li?y6u(?USU|kkvZ6(kt;>iV2BW>En<=dP9e& z6+#w{L|&>iRqI$y@plI*PjQ;tbe>uzpehZz+K&U?Yc48Ryh>}zbi`>4<6`@1n(``2 zr$nQrh5DFm@@D7JD=JeivD51xT~PT-`)@OJEh5JzrIuq&_DTa4-;%d92#k#AH!!8p zJ5Xux1O5?ZY?Y~$!cPY>6%R7paRj8Ap+vQ!wAx%wQWVpQQt&JtFS($gFh{qRIH@O1 zDWy|X11W|i_On`$TF8nj<|6|z%F;e!1d9pT-b~fsKVh;F7i0^~$*WX99HsUK6jiK7 z_#-c)Skicp`Q@&nNhiDpZPa@a85gQgZD+C|pnH1N&5K4Z^-GwUVJ~zz8Y!EfbF%r# z))KE$pj*gN9?I9r&D##@Y@>8bGRcE0M*lchv7_bwdDFd%@i{r0W>cmlT$Pe~JoQ&* zW3rN4sYoxKQCj|#;_TvbRX?!;Ng`s9Xd?Iq&8|i%GK?mc_8N94sM|k8n<z!GRVu%X zm(WDKGR-Cr#}HL<4aBRw@CNaQ>f@*~@Mu9|%D1!&5XY0Q*)eWZeLq0SMEdc7e#G&e zqHEXbR9bsfH=e0F&(BS6_&Jq}h(Y!{bhD=$)0fuiWQ3&zE`~PGFH0Hr<P|%L^Ne40 z^&_P?MPxCQ?FCiO&cw;Y9<tem_NwNdYk1L)U-xHDTlqO;m0V{3NK`AfQmrjIxtXku zmE90kB~gHeo?qGT43k8ytQ-EtK4c0@=BP8{O4U}f6>4OnO+mRO(+jG;i^dXfBJbam zbOQZOVR5EvKlw&ox)Pg2xLPxAdPk)lMLLZP=6t?frh*x21}Nu;B4XtDQ@Z^YsW9oM zy>uQ@%T%2Y-2!Xx?C@VMpZ1JUlS-45?iOy=@zhAx_84j&a=U)usCuA1OQF()R1fWw zp_Wiq>iTGXRBSZVHRTk=CRxFmT}X3_vVLU>(~eq=wM(>FHLQp3gReD3NyWq^zM=2U zAjD|3$T(nBpc_Hdcf4u@VLG6dlp!P-nUJ^AImzaqnr7swnrf|IE66}ZDefZ8$4K2f zW!hh))=o@TqmY=Rma>VX^iuqSG-`%vRF$3djDek9rYcwF$mC)Va`m|7c}+BKO-+c_ zn$nC$%cN+S?KMT{A)T3ON7+fB1T9P@-cSvs#+UU0RYE-DSd3M5k{)4t5DQwH)MFW( zZVgCGN*RZ#r{djS_vgZ%zG7P9;p635YT9tsUORO*X5B_Rvzs(+oas=NmOT?t9B<sJ zqQoqCpj256uEa-%P$%UjWCo99#uVqv)LivkD(km(*4n3<*+eE=JGv*6PDNVtW?ds0 zr7OjfTHZvn3m<;Hpm=L#Js<MSbh<`oRP)^Frzx4Lk29T2dSQu*5TLB8{X+4lQj(Qr z#+V`q|EyKQ5W^bn1%ropfir*c?9yM!K61JmAjo9&F4F+EM*6q77+GLLDo=h}L-D8s zy)qycCCJP#WIIx+VlTPP%;Eb0rYlk3h2eKCI4eUfH?e^c2D%!*`~KU*&cEcx{X=$@ zHF~1@lmibuaP|*-&yHL1+8r0a^z^A+-s5bQiWfJ2_bcCQ_;q0U(EJzN-(R;m;k{p9 zeQ|p3GoL3P&Zs~9UQ6DWQ}Mi$#$I&7J>AZ)j=kffgcmQ&ntx*TiD&<iv-aJLXRrCP z%lj)V>lYR8?|X_XTn~<0HSFuxpC6Vyu=I-Vmqzxyc>SYoo9CYw-K`12k@aa;<HPPt zYnxvE?&mN5{(k&POI|4Yqo_}tTUKps)BCo5kNvo`*9i7HRlIwyJNK)7Swn|6e&)2W zKc4u)8r{!IDjw4Bin__O+dOo|1^f8+hl)4l<@M8dEx+gGHy{80g9pF($HYDL>+ddn z;iBa4n+=>9`{u-l*{@-(7rBfdJZH<<U6x%@@qN;P)*pWM(=#JKIJ<nt`qw@!Yu~Kz z8rJFMT{~CfR%O+fyz*JfmZeEU9_W6_=U2zyux(%e>)*~ueI#<lg1fTc<ZP6RH|e&r z-nYdTWfniYaP`5Hued2}<M_%AL#nD4C5%dFKe+r4_SPCpe&;ogXg8%S>eTx8!uve+ z_`}~!ntJ;0g?+!?eDIz*y&mZ0ZHtDgc)xY`v>N@-CNFQClG^#Pvdf>kvDrDDUAt!P z8u-fzORsz6^(pMxs(5Q7zK{Ims?(kuI5@WClzUgVb+!F+#-%gvKK1pV$NWD0f~21~ zLliFMzV&gVQy%IxzUw!6gLXW<q*wGgt>&CM_QH49JeqOC@*&+$euDh~74Pj`KVSdd z`)Qpz-I4WM<MxYw$m#yUE&aQU%{VdPz?EN4y!9IPl2yEC3%|K;!2I*#=S&@U$%fmK zrnWm+Te)&a{>u;aIh6lFWyvL+NopeHPFme^&aL6=U)cQcvbT56J?Z!R?#^F!S&z!f z2?>|2?sLAkhCL1yFa7o0ug2_J_+m!v;ZKe{{``|$PJj5EoA28)a$3s1_MT7AjZ@#| zBfoPyF8KPFw~DU2I<@we?yi-uz3|<VZjbEVdee_Pyp><R6_>{TD`x0w+@~u4&O!I} zeeA>yzb&pFJmE-f;q6!4I%iPI-r*Y>Puskd&4x==yp!kG_3Qrjo?iyt*mq}_XSe;< z_|@70Yv1ox^zv)*vrpJRq%V8nD&FgBawol#IK8d4<I+_{L#B>P^R8=re_oHbH}^<r z_QCM4(9_svQtmZx?A?Cnpivin(&gOCrv2RG#NuUNUUj%%)sDJ%Dz{yH%EhyJk442h z{l0&E+P(1GRS%ViXSdiM9rwz8j}#}}a^bD_MV{31)b<B(a__2muI8!FfAiMN?f3P* z?U%ue=e=~&qi22e!}e~c-Ld?%q{r|6tT$&dBBb0ucFd@HY*NCx1>gM`f6fix^?dui zySpZg*m26qn;*y@(ByYEYOh!E+RXX=@e?2I^3e|oRqywCr+4!9XJQY1e#XB0Cih%; zUh&B*Z&mM^l3&=BGk^K@<O^ms+A*c`-uBUFHv6dU64&mV|8~PB*XiFqc*1X%)#n5$ zcl)nb-S<xZRgYctOw7G|e^_wVZFl_bvdxDtPQLEq9`k<c^taR5?@{r_-nQeiZ8!ew zis<vNyt*K7_dh>B?eedB-F|-V*09zqexFc?JNrV#TeY$Ki@y$Cabt&e2Y%T4=;z6g zpY?ONE921Jv!DIFW&LFb)~fe4DEIn<H=T09?X6#2c-Cp(SETQLdcf`;ZBE_x$;bN_ z-FHH#W_zgb685`XjdNb=ysqn^M$cUkcFWoypG<k^?aJ4ueid8RsBZ8jn`d195psTC z#haIZ(f-j(cYXZvS?}+e_2`Q=H%$Gxeb<Mc|LVF41&g+fz3w#Xi%)emz9f6+#*)zo zD|^N_^;r9No_g*{Z`~GK`^dA+9y{>qlijb6XMaw`+fje=^v<!Xp51unT^$!a{Ki$M zF8}_j`<nG%{r0^TeRf>)(I$2Fk^Fwn?l$YwOD}2J^W|1w-gfstlAam&(X#{JyXV0f zPu?=8ZpIJ&*&}Wt<^Hs0VRgp36_2!;`b^VV%WfFh|M1kN&E{23n|s}sRau*_IIPYZ z5%2bC(`MKFbp2KCMwjkc{=uZ7=M>)lYM)KR+dVWX_S~)ap8Gf68&>&!b>#5WQMWz% zx3S+9Ufy^9r17sj*yx29l0KO;{J|GiPAJcLmUFfEd{^TO9?tmYox)ZhJbh`;@8i2o z8$9H`$H%=`{AESNJISl}59u_Xv+gS1^GU-_e|K@pAJ3k-WAg5}r(;h|zy0|MkCb0i z{loJ&d^Ms2n`rx0yxFeFpO*J{;jV+T@BHMHk8iu|^MkRQD!y5B!qdaQElb+=G=5{i ziBfLnwmX_HNNrIQ_E6NO{lCVa^xC+qvo9DwU`WRY-rX_hiL1wPW=6&9anrw+dtYyP z$_ec{w;TEPxb=NTKK*TzQ8{515w9G&<IdB1(HU_-$<?@gW~VbNZd%@~YVlL;GI}jq z`bF~cw_=*d+;RQ$_r9>C$0eV!Pp{(rQPSw23ztsaIDY@V`<JyEH1(J0%TKSWJ$%7q z3EtT|-s-}p;3^fb?JHx$Prh(P<>rC6MqWF9QtS68m(Fc=@%58VIrpW_!zYc;;*6_` zxABcnH*|fydRCK|>0x*5eQw#(Pd?vq!rkkCc>03XXN{UYVJC7%_g#&@-MeCOhjaeu z({|w(jo17z<+aZ<UisVSOA`jJ+A#a2g{#*j=`Cwl<CjJ+`?;{m!Vfoxd!L;%`RhR+ z&;Rti9vxqP^QK89XMFqSzLA{WRrwuCn|14w&%M8;Wk(O`_hM1TlP5j;;Jqup?mlJz zrOBB|_hOf_5anuoY1-SJ{!#yAaY9+fgk`JG+EsXE>n?xHuie-4=PBpk-TYDfnk?eD z8gCdI{^O!ir(H4c-foYdmVDjLeRDe<no{$~u1-I%eD22d^*NjkR`EWZS>9*)y3-GT ze$54m?$amkxFY|Bv)5g_`22#f)(hTz^};cnJ;mne7d~BFIsCf!>eki2b@gp)cRjXf zUAKptMjRY*!wspO&-_P+y)2)ocuik@U{HFiroX>?$_#7WITt_G`>uaoHRSiHIpe(p zy1sGqS1<AIfr_`b`Ew(tJ$C<liIFoaKDzSUJD%M$<fRp_T$s3e@U%&X+I`lBz1db$ z?!6ydQ--<L?L8@R`HNQdtDP2Y?K<S%9Tz|H)=fWO{ri^kHSBk*c&F|!E$Pvx{e&J* z^jf>8=OgFsjk{(2saIa}{+eqO*L^*-jJ~%<#fu$(=|>yCEn3<2;9U<c|LU#}J#Vdi zcf#PNFKqm+$B~O_KBXRKww7{V`}(w;kINq0bL8YMi{^E2*6G(rZ_J;t>($T3b^Q9( z8NXk|ru9-4FaN-y@cvhIdh*b|^IP6L;+FSs*f#6k&#wIYCAD2|J?FcpR-VC`Xce!| z+yN)Ow{_bElUu#IqU0a7V|Ujs-mqiO#MW<ocf(9?_vp(w2Th$_jXzs;`a4~gKlA#$ zhvqN-;(@^<H?=*hRd(W)qxODXQPS_{OCI1Tm5SHr$yOa#eD<kz@4Md~@@)L0{Jy!D zG=1UFmNS=M+v=K^e*X1E`nQuMKWoV+<)2(T^0N77oiJnUopCQUz4rU|{Wl%17(L>g z)4MGWTfjH7RJ@Lz=k)6kHLj-Ml~#9V+}-YztDDbz<nz7Xc7A?nQu7t9KVW=yP{n&| zPhGo?&%QO_zA;<Z&wMi{=C;irefiN7QFE{8Rr*NJwFl|<$8$c!)j0a03*YT~X5R2V zBX`uU{P3OPFVCId^5H8>&KxoK;T0Jl*FM3!FDl-u>a>nSA3V1_q5bNJ0~=2nbKU%( zAIY%(adOXrM`rFz95bA=cPd`(IeA~c9CKUDV+)45-YvSk|M&&JT>s7ekH5HS^hxFY z2KPb_dN3BFzLOp-ZWEdQ_{?!TzTN!y^DjyN`kMZwU8lF~abn4m1^fTScxaJ|HzMxh zyrR;HlkPtGg8NhE&iL>P&z$8CO|QIdL0;YB3s=5yJMXNhc(YpG)v><m^*cH|vUR|9 zC8<|^IcU}TSFXAFrGX>6y!rEw&z146iN(2U`mg`u#|`sm=M<FY=J|f@Fkg0-)bAg9 z)xm_`(~n24Q^~YAH*f0k$<2>P7R7R$OsBC4=^DY$0G3Sl{Q%>H{F2h_0@pZiX>NYu z<bLt}`c39X7-y9-i!7f!Vc6shCS$}ON3d@~@BT@>`}ZHvH)*mhnCw}+jv;F}PAPxp zw<GOb_;|ejF-be{U*%R(oMV1|a`IFfrv#z)&N)8KBfoT6@?SC4u!`Q2a#)-7U*#66 zipNC*{d7it(DT1y&Z(-m-;~n)g51BBiK7y1vdB``@yU(v!cNVfhJH-XlZEEvlj&6N ztis&vqWt5No5P|GIGO%0%=hx+YrYQah5V#z;c@Z_PNpT^+=BcmA>`qTD@z>MZSsZr zvvUjQmblL6TM(1`#!pT)&bx1X@A%$*lj0Nl_Ku%i$`a3Ha`N}KKFR*+oN@|_^T;s- zQ^(K8&dDh*oy||==KW7gDakGfk^i3-$Sk#s8X~9TCl3@te|0dYJT%kCuc$dViK&0l z8`_S{&&5tFV4KV5eEx#|9Y32en#|i4vbpRu;9u&_{i@7woz8JG^;P)zH5I#bGiDWq zDB@46uq}zXLBjn@qL|8e59CnZab{3<&zvm(5`%timHWSLDlexwj}zObcM$HU<rVij zt^>7c@}=P8Bi*T9*(W(pp2XC-sB{Xy&)#cRw)~j-@nO^COqRV$N{fm(Ep&YHo$8f0 zynF+K|AhlU1&-f5gzh$b+W)r0)%?cy&YvBs<2`<kQT^zFPd|L3|I?1KL~Yg|FO4Y3 z$>lfco!tHcU$(>6FD^Sd{v~%f)yvsQUTJi4J3jp76!A*S@yJshfH)o**}^Ny<F}*! zJ8$PVD-D`<`-FD<^w}8>^GhPfulrL=Fongww)u<N!;Fw7Ivx$gC?vn|cw}U^w2W(x zZ;mR%Ox<}noc<*N`i(|{tonbUQuz(0!T*a==Ki0QGW-9el#>6GQoR2sr4;?2l#=&< zQcBtXNhu8q`7^fe*ITem%i3Pw|7w-iFB{$I{FlDlFCUwo<GrGqn>VHOI8ApPznER> zEu7BXadx-z^JDA~6#HfsmUW1&6OKCYor<)W%nqF2Aj~!rN9k%!DAJ1OtdOS3SBoSR zY3(J{O~sS1m`W(p%HnK~rsbMYq_u&)zwRpD<0cd-zbkHN{Y;3o4oyzhNQy|SjI%C1 zRN8qa6e+*SXlRip1b+@K!J$QP9;ByA+roq*ttyAM%%RmfG=AkorHHg@BJ}q}np@jU zh%z{DA=~54tppQ7281|L0*$Y(su1<ye1xX)wMU!A8HYY9Uakp6TDv({plN$di2T^2 z=SYO)XF`$IHul9et=5Dhts(4L_f_%SCKPGOnUGP6R$@Yt*46AW>v+{B6ltw-XmaFE zp7Jp^_GbI3w2MuMda!S*X}KoEkwx}C`>S{@Oo%peX!9J}a`q|{RJ@fY6lv`sG+NQ# zGNDMTj=e=4?<*6Ew4&Mf)3nwm6lrZ@e{X<FyV-;ytse=EQM6x7DAFoE)s8pEgd(k5 z9oia)wv_WJ16A7PCKPGCNazAZd)b5{t$z_pSG4y{DAGDWXq=)QG@(fAcS2(oEsT=_ z5{k4s@L>#HhRcK^t@9k(Xoptj(B?U`^$zVZhxV~U`^=$5x$H7pnNXy4i9^eFXn%KT z*E_TpXV__@O^Dyzb!g`}wCN75z@e>jXtz4F{ju`h0@2+ACKPEc>tfSZm{6p()1kfX z(AsvD@6t)y4ki?7O?PMo4y}ezl8U#@gd(lUxFb!=GNDK-yqkP~L-LC-p-5}FLtE+4 z;&3yARlJ@i6lp!^&^9=<*Kk5ZRJ@%g6lta5Tr@4+gh)&1Y!z>V2}N4}z-egOJth=s zweD@x+L{pcz!{vQ(q@@Zq;)f)3`M)mgd(lW<L!70Ob8$A&>nYa?tc1PSIw;y6T%i8 z+8T%UJt4O$<FE-uT3(D?)A%7{6^gX>5K30@_L@+n^(2O>Y0sDtcInW5acBt`ua1{! zLXlQ1#xYdo7iU6|Rt}-@iZ;!JBCQc9m5z6w2}N4-99o4#Yk?9BQ)#132pw{01rDu- zP>PDT&4ePY?+IO~XopQG(uzcZCMw#ACIrufCMa5*3E{&~Af4Y=CKPG4K`}I~oe4!+ zT^w3Bhc>{WB{{U=4lUK8jdy6199oe>^E$LdH=klu{0%XoNXv!bH7(YJ=*tl32o*2E zgd(j~4((Qlwi|)cVez-egosDQH0@Rsq6`XXq2k4w5dDlpyUU?PP-sgPuZ0O=mkw>E zLpx09L>2Eh6QZ9PY18JJP^7h=P?U;yz=Y^4JT`5!3E^{6^>>DvTW_0Cq}BgCn|787 zVbcyR-Jv~BsI@9%lL;Ze^KDv!2}N2ShnD8h)(~o=(%xl4k=BQVCMnt{CWP&$+3~VW z2%RK!vWj=ugs@9GcugxaA?%XSDJtGx6N<Dtk5=E6p`E&#P^8svj2-VZ6N<DF99p77 zdnR3fhp@TzoC!r*y~gTKwluf;nh@<vhz^x9?lK|#F85QdHf{dawD9EL|9R^0l^qVY zi@oODi-bOG&}80V`7=`qIjS(ZY+%A<^<uGeN~d>G?iB0WLsc2E(VnWb*oX@~l?UQ0 z=f!#~Zx>H>O00Xk(nTF)d=$oaQx)0Wn$Fp(?`$G9<;ITW@`YPBA}l|~ZFy$a#CWP( z60$0Xgf*SlPZx5cXIT@Wd8$%kUG**e?>yBRu`bUtm1Muf>0fhYP3fbmlxj=99A?3B zT-3%|7>e7q*HfJq>#j-;*Ad*|Zyq+32%EC?a8pBS;i=pfpZUUT_LZ_ECAMv#5L6;h zWm%b3I!K2le@}I4yr;@j6hJA0Qf4Ubcu!?bf-1&Sl^h=sFV2(Xi7$>z(^Y<Y4#IhA z3e`}xtE`=3m`mIcR=3L*w5Qr#wB79@mX@!+?+|dWOVgZ1+k6yxw!0$&qiuJ`1rnr2 zQ5#d;Q>#2}5u$1Y+Qk*-Z6VOeyP)nZ|AM2QbhoXnMV?v`MN_Mi+eU3kiA}$<#(SDm zu#V*lh!s)?+L$EiMGczyjk;?n_-J`kNk0z$bl&xS{mZkP<9cZhaZaW=TB|~;l4*|m zk($%WO%*)1N^Qms6P~IiLRWEMjN2vl?Mv<%VT%5ed#2T|CP?jU^?Pkefc+V<xY06I zf}8rHc0Fo6)muGV4>uB9k@m6XCxoiVvr>^9I4~8-@l~Wwen3(sjk>lE!H}Zs>Xe^C z`L2{|H*JY4@KlFrsArwX61U3JLE6lNKBPMjls@c@fYvdPRvXxk^~Y8rC#|SyoVn92 z;BS(l4N#2e-xv*9I_>Gv`NR42sYhzm19W|QK%v^2M}-h!*gPCrkl)&EtJ%j#xBB|# zs(=ux62diAyN4X9^+_VfJ;bwhZzH=7E~70*RpP999X&ZpY_w8!_@X2lX?_cFoH~>G z_s|MrjcyQY!QcQA8TRxeWT5S>7m-g-9tig)Kb7137d6Z`a&yOdD)-}`Ma)&n!A+Rt ziJRNSmQvfsNA->M@hUs1ziyeT<RLcYr`?`ajtJ;Kgt<^w=k#?bHSSBbvxrLF;bO~_ zjzv8whITkC>e@JQ$Eq?>i{+cs_LBu?NQyX5j=O^tOO;ZiJ<Gxu>6@zLi29Z~f}byr z^V!3h>LK<;*{W7?%GSuJI<>>Hl!znH6Y9t6EF^!(#OSg0NR59AiKTN&i;b`Hs9KOy zha<IG8V%TrMl_U{7MreIMAR1PS=&*Qgd;W8JA)p0!*PH~h6i_qPcl=F)J~;nmlDR6 zHBnc7{>PCcy29ynK4o|y?eg4yJ*{?mj{Kwfr8`7Bv!)S0bti$B(GU9lG?;NESBG0w z;gNO}`87Nh1&>OU>Tt9jY#bh06&`Cx3bP~WhyIaLV#CRmae*DBu}V(~LauHR+qkxR zEAG{PtaFgZ;jz9%x^O?XocIBpr&!@tDUsneTfw}iG}5sf6XzJ*2Shs>|73B@3dr*i zHGoWa6y2b0q=g!`Ph(pu459va?PH6}k*RK?z*dZ)wh_JtX%f(ijA5l2(MuK0uQ|2A zkJ_AmBBVhOm|s$#CP=onqBtUP^vGu4c@iM3|BXu6Wd@5ZNOeLB%~qX%E48ER(0?E| zUCPk~*H9Bv7}>j0XvDxlc@~A0RWFTQf*<IiTiI2;IJSaYsLOrSSbTM?wLl)Of||5g zJ)9TK{Th8=0W4_NucodSJ&iA#kmrx_<teG9q!dbyt=@^tbnS;^5hycyrbhln)s{>| zbaA^5!+G3xe7Z!{{go4;0+Nm(F14uI9e$)1=7ro@S1I1drBq4xF;4n5kW~7f6u_cT zg90Rtju23QkWB#zNGIM}kV^SI83@Fco`4*>FfOTA-AECYi-)fs$E-Dp<5V{kSKm_= z6t%@Y(;nj$(T6e-(w#liBRvr+l93H%Cs?J;UZUF#t8XG;>Es*fj+S_4+Ih_&uXgH& zyo9AV)3cGw3`<If)>GO>agiv4l0@mcD4W5u>4b|sgOlTYQ!W=%(FRklA~nXZi=|(O zIhVCyh;D7%oGQQC6Rz5vMpXk1X|t&H^iMbcgqBr558X{$xJYl+kAO4RPrHr21f>6I zx8$IoD@LnR$%hIA<#U9KSg|U8iY)@hxQwu1Fwt62AVkTctSUkUnRAA#=g@};-PTR+ z-Q1^``xMfrSo2(xy^xI&3Ae7GWQl5Em{`BeFu=TqX>Pn4O=Sgl8b`6$bV-{Pwb4C; z`E@dCEr$EkZey!Iy<5F9wn8ZH2?IsRs>1Oysb{>)yn}ks*G!j+W~mk+7q`qWlF^N> zI`1uR6s5Gix>1VaM*1oRYCy}nqBhFZrE*)kKhJ66U(yh0kbe;+!k)D`R;O&G507=( z9u_^dAB4#RS^%z<rgP_}dSYW3RP4N##uISkTF|7f93P`1qd8PREjG5ZHuavqcs&<1 zH#cM^bjggMcmtEKYrZ%zLyxPwn+SHU<mp<L5_ZJatDoNOEPWs&KgY)qLrRq)TLRQL z$vf&fZjj$4DxR_6Q{)DbVZFq0t4CtFMmTDcq#Ld}{P`-zLn^jbKpmTE!cd%1I?V)` zi%F|hCF9IsVAo;Av1uz)ls0c<*K>Z8y0h_1!Y&yqYu7bAfrP6h==Lm2Swz<^b}yzr zQ01YYpsx0OV)ro&zaGQ&AlM3#CpAuVYJAj|7lx#vqpm$k5{J?nqKHYwiis)q1}8_) z>t(CZk(J680#f3$wtA{GA9b6A8I>;_dF;U#q>R|IG{bC~(Z}TK)^8?Pw}|NRiVV%f zmf})+JfB>>Gitp<!PbR>VWs16U@ZNopKWGj0Oe^M{-%;zg9cShY~9NsM{B=5vor#u zG;xUJ=(Klzp)H@%5w<MD{A3xRL5&&|7$Qe4iDNR6=%JUFCM-UY3{<}sb!|UpB!LPM z+J7CzAGiaUX7mw;`TE)dv1R!W@-YQGRbVVNT?mN9V6s6hHNaG{aL^MQEjZII7^ydi ztcIH^vQ#bIxYxcSHsxH(etH+3iBm3))YD}yl?AU8B`-bW!;!{|BkgND(sXT}+L7Y6 z>2YmG%AIngHcQw_1D2o}S%|x(=ie4M=W95W(_KS#h4cvGWvI8?@}4RX7Pa^rs1j@x zwfHU!tZph!Kq{M6?VgO?6)niI?=&;1;WAsc!{Yo@xJUA2g@cnL=E;a7MUOaAtQ280 z<!R}$RRq<$sA;gb8LO|a%2+7hE<y^Nf3dkk0ZcKI#hcn;+sd=-qK50DhU=n+KTVDy zi;`0wbyq77<f~rPvinqYMfp!l9HC1b!9X-47Q3U7eAOz=_>=sP)VYn+{Es{;|7)aq zw)?nM%@cL)6MhsUqyMalJi1(us)Z-G78luV@~84l)p@4sx}+Yp+23}Uw$(BXB}~(+ z;c1P$W9wu(U|7gSYvWBAW2A#ZO+YnnVa!6?v2u$3Nh78!+w*G=wWu<!{(O_camY*$ zfyCacJd`G-(kE7VCM%B@F#37zwUFbrMF%#BnJr^-@YEVAx=B_7zI#CYevLe+ZUWKr z^xr0()EX6)QshQ{e$jRhxU!{+;9+zp>8i(0tZMDJ{}7KSS7n4b3nlnVot)IQr1ned z|7fQ?@=FGHPO{yB$^0Mf4NB&4BTicy)UJiEEd3zCe&EYZKS*r&AUuqmWSpOf=ZIf; z5}|k~ZlQoF_0c9I6nP>&wwt&K^JFC|MM4YCv@4`+ScWGeWXAc?w!rJULXe!Klv1Wj zc9i|TDB*rl=C|C=;1Pm&z53?nhI^U*3LQ=`xW&5B815&jZH%bJ@<R&PfhVkVg7a8) z`0;wgsnvtYjQHIiFe9u>%Zo3Jd}(p4{PJ;FeS`_ItD{LM&MKaW5tu^F=r~?HE7}{c zy=q`)w>p_gNM$AglUdY8o#_(B0#NOoD>q3$V|mYr+Q`UNJ<z%OJfycto&5SKJ%dh4 zhlVsl#QKbkv^YlD*;l*8fa83(;t*VEdJjNGYtnYcg@(xSdUCAyiT<x-)~G&JxX`-d zQv}a4u~Y^~@*t}6_uph#<h1k<<uRPwMCCN<8*RV{4tuI!^DJv4!ZV7vU4*hmMA-i| zO<J@~{D%MZ>S+F@M&?1vzw9GJKmW2*O_2Qki=1>6u30=_+Q^M<XKEZO1o1DDF3`V( zcpTtgl*LPOQtt-*{EPpiz4FM<zbJoTlI;&n=KttmP%`B$OtQm)$^0M5UcY~7P9=if zl8?n8x8!3Ylv`39=m$e=Ir_?1{z`n&kN|%rUTKK<1m&+JBoy&i(z}S)Nl?Bm0g4PU z#kZw9zD+3dBpnowmZp50hfuoqZNigLDc!*MwzhU-+rCY4q<x#jXHM#iVtkusT726Y zVmQ7{ZqQ2cZ4!hNMnH?T!lcD!1o^fM<J*)z1^PBc3iNG4vVGfKQmFE65>oC+0x0b| zK>Ie6s~Vg)@NNE?J?La6A(fc~OlIPlBvX9ba=@-mfN#?ema2M&_H7aa--a|o#4^4O zaVXy=y!rVyeH-lCq+y=sPbri{2`Ja++x~K9#<vA4g7y;lHhB<Lxykr8RU9)-<J-(F zu8slGF@4(xvhnk6HQWaHHW?KiW&9*ZyT!k`pBjQZ{QR3+9-w|2D{4eq(qjqcEM_HC z9xv7RW))zadFJtdhSQQPs>8QNtsmM#lE`h3<Op$+$4bCbR>KraLluAYB4l_F%&Z+d zME=-(<>uIl@Mn25sJrk7o0|ddq-?`9cS7V&i0YKjPP~Q)s0IQ-S*a88$t}S&6=#o7 zRHY$J7tR7iWyH9KB>vA-3p8F-D`X1T0B#Z%*@9F}AcUwb;bE0~!<id*Zuo3tc-Yp% z>^W)CFG+ScjG~e^CU;rHK?VYiN}JTlnRs(+MO}HPl<Fr>ts7OsnP#9dThFDP#o4m* zYN|?=*Gam{{cObQaQ#4u0Y4&(#*Cb9?(zJahfM+z9*;z@{*P44lh+!*yi^#PNWjC^ zF*&FpB&Bn@0Ao&uqFT|zB*(CY6-qW(AqT>QsxqytQOv5aQ$USfz`v0n2}FKyqZa5l zE3l##%bXKo3Neha+c>dWyFk-8?8&T84ziMMBx?{)*7JiSN;^3ED~qs_5-wf?xRb}+ z36VP?awkNszbPgP_MuDE>aw2*v@YB2u>3LOow}{8Pz7|!YltC38ztfJuwbi2)sG&X zF1}&>0;d+SXv1{a+({7x3&d{VQ*H?s_^fK3@ZhxN7DVib>@T(D(K&Be(Z#Xf!^P24 zgsAJ{*ux}osw<5qc~Ilu0Pf^5cS7V&h};QLHySBL)xt^#*>Tl$eyK_zgP#IA&gr)4 z2ef6IaN6<*x*n4UUzV-=0F^W>$h6$w{v@p_gGUAaj}GWZ0yGM%2}@%o_OXk<(N~md zR8>_tuIq_{QPfhu{FeON{6>&pT|0l1l6D`gt$gljw#lkdr#K16VKt)OpE2(8(-$=x zT|*?HDUVWF)5tOY2zfBG<`0poj&xMjUmR<piMB>GOc7Ee!u^sk=lKr`k)LR^3u%}l zWFhjC>yFxGQB7eK)oKfHCp>T`MDB#hoe;I!L6b6}$<ZS2Bs=be$ej?m6QYhUa$F~3 zvn}-MAGotwM$G>~C8Nph=qW;0vNcJZN{Ves9x&ztxRb}+36VP?awkNmk}3u>2s^2) znVHHOMVA_j=M>rC0!3gUt?gdwTX*%({)#QRie97s|6Q()>ND!Q*YzV);Xup<4kX7A z95kwrV-R_!y}5KV{d&;JQSI*4#&YOM^rCI?)XpAQ2AuD6OPBAQpi(z#`%S2__pKkx zNwLcPY}m7=Z=a@1-|ij)$94>P;&)z|8-1kIrbhR#QOV_K<96gG8_%FivZ$A(D3{t= zcc}uSo~sb&$OO(6wd`lrGVrrqt&~av!*oT3+;EXxpAU$Y%^UJi+*C<t6ZKqpvb2-z z@J<xR7KdMD2xIR~_!i>dw98?Ki6M!^s7_T2?`&EY89^vwR+4A(yi5Hlxlk6SX^J_x z>pj~<P+XdGc!smoqNpcR+g5%YF?eg~$tIfb41<U`-lno9p;o!1m3$)Qlx|XTy!S#U zmhYV3Fhx_Fzy5Ww!}jJuy1jXjq!+A{SOiarO=7bqQJ+9gR}0FjzRqeo0#OTZDl@a; z;bb&OXEaD<G)OX%&4EM}cfYif7PXx4Q`;Ts9$QlCh%+^&Fi&+=1yR}kkE{FQcUd`t z7?iq)skMrps*c8%M50Sd9qS_`L{lm@hBVk6a?YEf3eg@J*!e6&W?S;y|A4eo$aqgx zI65PLu*SJ8;UKYE96+=jlZddq-GvlUEjk-Lzft|E>Xu~&Mx%jA>vyQcQZb%+$V#54 zAt=sQRBm(GW~!NKz)!TKb_Hi@m@p?N;US{*Bs*hDNTsBRWAXGHC5Jwp=g6z_fDwf) z0$uORgdd7PBc(>jgpL}DPa&mgq#v?W)3g=C7b|V6CE$066(*Ba^&<3nQpv9>xr1E* zkIA?GYPoONAc`C2J$F)2Knm4B(G23Nd{5G1qpMFyidd))2q5)_t)vB7+Ngd)eX=dc zXlWr`TQbm6mG%=Q@U><r=5!*rszG$!Op!pSmex%^HHCV%o$Av<b>>x{etpi!Ejnub zqE%9#RZ_C>;xSw0>b5G`Zx6<|e&ClUuim6f-(Eo`x~ZB`D#wKxrb|)N?T0dWl1Or| zdMNG%LmWkKHt+mzqq?Wap%zwv33|f6jk<Iz0d-JH)6#|Zikt<R9u>EHYHHMiccbFo z6x_*a;NX+&H><4lmVc3b<|NB_A=p$Z$wsX{=~C9287Wjbkr&s<I|w%9FjtxF^Rjx# z8$0Y(4o+^pu!B669>y!1CS`<Ty%B_5l7TK37g8$}b;8XQWoWUArjPzbEnRB5jx0nu zRPu~kRt^a^cyB@+k_(9`wX|cz&WloINCI{EDK?})+enWUOONGhAeuLXv#p04uY%u1 ziDkm-&{yT&W=|cVNcQE~WROav>^dwbnk1q;T&N#<^h3|C!$0lhak3bu^4M9P#>weo zaPg!_L}o)oh};jMQbVi-3+!Pz@<@|&I~?+k+8Exb`BwF^6lbfcF0>`;z_WgPz$8^i ze&RhGsF&<T3h^&lN9uRmIfhA&7+r%LaV$E=`i|<Lm5Qf#-zocq<}fI&8^0thq%1?c zCxI3E8H(|^N41xbx&Hq}<q@N3Zk#l*(!gs=%+#oYruLaQgE$OPTa-G4t|DKVOk^I& zDtaO<oM?I53xs)d1j4=T1e$oq*QKJ@QihaOm#lBfka|&LqaVt^W~PRp%i>VwC+9YP zo;Tq{f8@D-P0r7L<Ldr^JIB{Bn@~Q6*E33o*wo6h4%Win_MNUtG>aN1!$zQaGo;}V z*C11Gl@mEi{dpNKuGFo(jtsGdl$7i$4a(JZj9m9=drk-|mBFg2e*HOw{OgVx;9MHk z-5t8_^-b!o)w#x5^VJYogj%mUr7V5MmwSC`4Zo2(bnw=B5q9CAi>8Zn*h#6EXQBh* zGo%l3>81|!ViE^WAwIsRgmDHEmiI7S*1W+giS5Pa_w<O!da7#C$8h|IwUg&Cv8P3X zyMC#DrSn#`yz~;cROdM$pisCMMpWieOV`+s?E<2fErS%&uH?0mhEDJ8qp=^vsJv4E z33rjase&S+Hon4vG+{Vu%gf?MaD3vdh{I7oA!K=~$EM@0LNde4V!9VJb`+wg+8)xE zh)WS(c-Ixqqdhqls@FzMq|Z)2YM*Ufk%9)}0i6|cjh613kplnu#t03@k4N)oMN+9X z2uHejh1{<*_ktlsaS`3Q*-S7p@$cyM!FXF*Jh8ibJ!tq3di-nb#NwiKcJ|JH1w8q6 z{h|u2N-T#Ob!8U}$w?Wg@kaR?`^Tt|RLb*J)=T>5G=CU|jHryykU>@BT95Q9nj$J0 zwSI*(Vf8DXoR>X4I75l;*vX}1t>B?jKGo~evC^%^g_PuQyTgNVOiI}nJztzMDgSqs z(*xdBPFIFO3Oy}SD;{?^SxKK57ozW^4BdA+LQ-QUy$#e^yY5&d8jD1wexW5AIO+*0 z(b%XzDbd&v62(*N2Jw^VL_JiQs3e;BA4t?~OEj^8M6&`UnuTc86fA2$HP>rMff8j% zlp${~HyGczkLEE#4>pP#7$+8fH2cg7S;q^M{pr4q{x8t@Dqvr{gOF{@ql@|v%<g)X zOxv8~Vvn_p{0z>Hq7Kyy2Yz}JH1>GH^ufwF<wfqjGQFTnmo8iFdHan$D)rbycKzKL zD@QYB?BNdc<_qYthr5aQ;<{{1Sag(#adngAMr(;NPw8cOlp^L-)UX#;?<MFFh+nPZ z>SPsBtU`DdOIIFR#tTDjsv3bXa5BzD)kj7k9gGJgk%+^dW)$gh$lr|&w8uA|QSu!j zohp+gO_Fg)P~I{QId<Ot$s6Ge@gI%IQlhXCC=Jh1q=9F%$7BA|pcDTW@*wYqV-n{i zy&01f4PGQND~_<+1PmOLq&Z^}Iievut1hhqfgW1P!}wk`RrEPtZpGh)@Db{Lf-*k` z!RVxxQqr}9pazU*y6NH^cVE(02>4nUV9CXdUOuB1RQy9AfW5%ci#@n0s&=xAs=S{x zA?@@i<Co)8)eK$L4C4!FFtw+w>U1pUACglwxbZX8qYQ4cY~STSo}on>EE}2Uiw>wI zb#($OL8K&u8GXW2S==&hY5RG^IfkWbH_W-&4N>2q)Y?Gxd(v*PLLsmUg`%rRRZG>b z6*7^BlC0XDwd=5qi*iFpKS&%CU4k4t(b2PH*~e`~EnWdtRDt63stsnu9m7ADWLu!_ zWK|qj<2LV4%Y*6CzF9J;EEv3XL8Oez3WN>`W`sU{@YeZ?KHcy~wt5v(^)Vs|aTuoZ zDY6|;jJh0IGcr}LEE{5#_OLeuZjTJHAs}+mZ<@(L+7#g<H|j|>$~8hWc^z54S5?&v z>7*<z18+A~6;nZ%?c4b1iCP?S1mmuMLvqiO+Qj#-5umr!Z6u5?U>V%Bn0ttRW!~l> z)g>eJtfbb9N-;|(lB~V!DC%W<Ush4qerR?Hl}q*U>Ra1$*i!QW7*WmRycgqeUs)Dw zmC~m4>J20=txSg%ffH`+#MorFN&QI<%}+_4c2aA5|5ls%o<IXpJQ==7gr~X!rQq_- z1wTnhb0nzAR}b}GRiY4Zf@!e{gSSR4JChzki(ifFg<sK}bP=pDDmN3QY12{f)u@Mr zClda<gvD>F<!rA6C#ql>Az2plE|BlFcu7A`D4-Xd2bTF-O)tQC)rde(mHeL33T5^n zUR6!+A~5Y(3}=$L#Lz0HTYhkIc+}rln}<m{!>GmbnHFIIf+Y0Lr*0B35f*mzFH;ZM zrI$0&OGm3}nkgKG?;|Oji~^0keY6bHsAz<i0W9etJ6*8|iA5AfFMOgynyE;CrC_3n zHBKd!5Ig9klKHn+tS#PdKAW#2%f+sBbmLfPAZZwLH?eLKTj<iVMOW7FGGABKIJUuP zQ#i8xuwf?NFr&IcTNUQF7mb$o*FJ<BX@7N7SF5&E^eGo%*f#dFgbSbXs5=?;$S#7h z5nql()n2KdnUPPs{zP65LsF2PS6wtm8XTq09lTYR=l^Zh>tE-6;(L@-ebox3_1=YA z<GpjG&~)(tUiC_ZG%x8@vjn%NL}k}dX+(MoYcio*RXP!stKE*lty+%zuIsN}5IY>= zl=Gr((pTCYteW-v{`1WbmiRWN79H3tWzxI4o{A^r*Sl(FaQi&h?@#O`xSesckownf z(kp6lfl{o+u@V^}OYu?bJ>hz;E5xegENNWxTsF&tpR2xAo=YofOy$I^2d&rXw!0H~ z%C?_A_aYzr&=Hj`>fOMFcI3*k#3|lr`>xuZSobPv$w`XFf`!A<faeeRo|_uzA+6Y< ztYgO-YE{}|H_aHU_LpUjD?80P!}=V%K=tu0?-?ODY-vY<r+V2^h}G-$xX)ONoxU#c zD9l0C%<8gJ7Q0O$byc*x?0$!8d3fAOJ^apq?&UT>6U=yuZ>5QfxvMM0db&uFB2hXx zZRfscy6<YPV!z~eH_~tZn1q#kW#-~M46i@Ij;A!(iNzeGw3T|qJAZET^&2^X7%uDv zd|<6vs80~7q-N8Ck5oymf=I%45J_v1cp|+KM8d;PEU9YLlT|Ar@C`90XUbziWY2hw z#H#Xm6tQyCDsHU>ya21@wVWHhq3;gZHgmJbK?=#CN&<e7Q>tr+_pj;ymQTK-RW!NF z@}59MSKSsVQ76&uLH{e?rMV0G|7S9)t`O-QsnzU18WxKErow)GBNVbS;Inj&!wKB~ zPS-xBg;YzT$OxWAZmD{f>hdHsU3Y`qapuIc(v~q)c{+lS#C2)?M1bOe`5prnC0<`1 znH|+QxuGA3;6XwIJE;y_TMe=YhY6S2oF_9`Iwr?BT{3LBge|pH_DO?kr@$G0%ja8R zf~{Wpj}TAzkASRjG~Ap=BEhfrJIN)r%3D$^Hv88EShg0qujmOEZd#IT_uD=8YRO*| z?I(FoTM;4f?YJUEVd++(o~}@Rn_x-Fd<<)|N@|s!ZciN6(WXyjAr~d3%G#{DFT%)M zDY-A!0}`vXFIMZitrAPB6!o0D5x%5_xk3FGHtSzgx7L1+Pi<?N$AlyN%6_y#t~2da zlB?2<sOL^N^0KV5>gF8VHtM++=N;KPc&pc`!o~*K$Ux1mJ7*Fq_rjqJVze|AB@CXO z9G;OJTKTHis_qkRL<n(y>~4`*O?|PN)@_zp2qCVrEZp)&>R=+@8bJVS>}OOu+A2NO z7Wj+7xzv|$5;v}ngD=}0u3ep%9zBj6zPl^nq3R{7y|Hl(A1;l}l3c3N!Y6LB+$z5? z&$7kgLVZdXz;0|+N{cMdGGBLbl-@{blkaUS(Z|e7eIKtxWshNh?zRkovK-He7N%w$ zNtdHve!eEyUVH~jbaGiLa?|FCq6PGMl0{oG2x)xE{%|BJQ=cWNPm9`iFO8$z4KsCD zk|)dC(Qc8U$T^^0#m4C_Y5sJ}OJyWs6X{Jv3DZ5*wc4Zbe4^zw$K}m)b-YZUFPK=( z=SOu^a&Y-q-u4%Pth$mnVda*8e<NjU323HeiYyd|8@F9VuxQlx1sXWDMF$Q_HPmuU zJR!%K>%m{3OW8{Vq$kTZ)Z7efbje5vSsGGhjq>~mMvsALedRePk~m8egSmoE3Nt1% z4bjPNh+^UdH$*~R8~RlImP{EN`Aqh5i5p<DtBB_-p+YLke5!J<SUT?(sabG3-kc`V z?WaiF-6C_{E4&vfxjOYL!%qenk|&?ollLpzLgBcka3#Y<iJ)?g+E_z*PL-}A#Zy!G zPd(&|t4J=PZm6VMMo4>Qe-&kZ5rOF_eyh_X{MnV0Zk&xm?Gog$_wVEyg5g^Fd(DrJ zVLO^$v;1lI%o;a*WEr98*wz1!y*B}mqUhR&yJseoWU}vJA0Qw**;qvhB<wp02m*#l zW|9mfnPFzaCh7zb5K$3OQB+Vwzzt9YR8SC61Vse&K}01$fUpyGMg8tm)!QWDd0v(0 zz5eg|{=Skqr|&woojP@@y1KfX&8Z$2T5jW^RvIj*mVyUUD5=5%v^SO}*gU#~vZZ{h z1Y1$Qv2cMPR>2cRm%&za8)SyTU88u+i@mG{WJ)-hgA;l}7=(`APvEgxqKZ-VMiSB_ zdvF1%ktw1Cos8Sz7inYN9(&H2JQ?Wy_<z#~e5zT8YRR6q8+-kSjK{Y=&faXotBW8k z=iI2_f)DL<gsP}IS~9Tg?RNbB3;zb;A^g(B(twptLHL1jFXHzQ<6gmUQ^q;bPCqj4 z5pZ`gt_b~sr$V<@4l`^HI3D9mCG;0?Ke5o`O6X;9v=D9(ZYbEF;C^9PC>G#&9-F}( zVc0fsJmsC>${6-9Mb3ch1zwg`;EuA;Byc=NFI=Yb&@6DrSm;P_JTwp7afX$E<N3}r z3PL%<mVo2ful~6C!my|SnQI*)2=y4&7%wE}+%a$`7*+|6$88uU2=y6eQMl!B3~d>9 zI8qQ!GVTmG9^)*YP^PbM7z8nne>KG*6e`?7a4lG9t9Uu|WpEt3p<o5I<UHO7m&jt= zRU2<(M=KiGw=Y^V?AN+-Tr(=soM9ut@lY2yUX~RK_6fLTCTB*)rZBDvxL%Cw2(CZl zW`pCoO*ZrIofw4g8_K!e0>^VpZ6t>d1jlnLRj?)Ccy71Am9mt@#&T}a;COC!C@+PD zwnMTsvKWN*3TJ?NIJUeM{}PBnxT$bWP+1<g6FBlD2B9}N-X1n^v@&QA#)0FtoZE(f zBf}tEMMHAkr$EU_5_0>H7`M9m$h3lCjlprNYuru_?F8;L3%wT{4|U-C20ZRGaA#O( zDL5XwLkW%OAP8q!Xe>A$TCcMlw+*;+EHnii4}C)k-3jhI3;kLNegAGbZg>|#xWGc` zYXv;+pWt|@n%^S`<Vy@f2XL1d*B2a@8*;BK_aL}R7Wx>t%Zz&w9G5$+$W?&5!a~n0 zq3ycLsmum<m4(g&$K(FgT@F1D?ivfd433A+PM1ShfV<8@-vGx$!!r2yL<~Y*g=?;G zO?zM|h{fm&?gryVg5!3uxF`R1h(Y)e9GBapaHqjRh0x1&g&WsL#wID;W^hnC<O2H2 zoUxxEyveX2aNNT3!SUXs@6W%LVh~n<Ltzn@KIpTSaem-<jCgPmK<H3#%^0@}9B;RO zfxF2t`Yu3I#+?U;hD8i<Aph=&L5K#2h5$xi2!PVTy$cR%0Cyf7PwzKyzcP$Iw!_nl z1eeCJCg8d;j=mp&#zEYE;Ls4@CV=DVRf228ux5iXXJlM!aJ)u^;1U?tXow&{A&A=p z9M{VXaKABZ0XW`9tHIr3*d_)06Ws3%3mq!U^#u0^!-gr?9B_X!>^TK{2OM4D7=$ef zb_JZsFny++UMV;<JLH}O_Zj0Bg5&jg9UO0&Sy`BBvbfKH<7NIBTtgP40-Tv~jfM$A zUB>kX*MM=0!SR}h4aXC(ES37;cq(^;Gcc^Lf;|k5>+b-#CM=bs;QW}}B}K0Feb{Tk zLa&1}Gj7HRIqnH?9J>x~KMTDDj@K=0q+B;0LMG#1J&+B1Z-I)`#1(o<95vy$!~Uu~ zzHjQLw8r8;fC~9H52}s!kkgehCzt@eeD>FA)$}K37h2pNL6}Hi*z~v@g;J6e@c~qe z%LBZ~ZnYNL<eX^S!t_Kr=2ST^sB+%B%DEEp|565C(dU?CvE$?G`GVDDnUq~<%Y!P} z!OmUw`~n$}@PnXQ{cWmpzPQS{6z%^rq^jxVSc<J=D!Jo%5z|1toc&wBRqYesxplZS zDW!t1+6J27|HxKNf0DyB-i8cvO7ilEjwOLKH5tZMjid(OajvTCkn7Js7|nHy0ZTdl zsXmm1{)bG}@{ujq#=j_-@f*dsH2lUfj(UF#<EYHBj2nU9XvU4jZym;wR|{g?Wc-FO z&Wqnr#?8TR7~|&SH<)p&@H>fdr|?U$M1dAD9${Q>a9+mE0Y~vgVKKPbj9Ue67UO8g z>7!f@6?=?v^bWPvj5`R9@)3no;8t=ubbvP)w+h@lJQUm-#s$DMH!!X@xQ&b}0QV{5 zu*fQGW85il+Zh+&CkWp%E*{)o#?1k@k8%9tqe+6tRbm4m<XH;c#AMn$*}dUhvIo0t zxpueRQQWMFySeFaeC5dZ3#AweY%Y8;)od=dO)^{Dx%h%AyqnqSa^Q37HuF8^CQcLb z=iye{?F0teCZT97PG_^dc%r4yZdDSo+EHi^%6#X_+XGHW$*<U!Z}HeC+ROzu^1o(V zajv7J7!|Y8Coz4Fzy4LI+v%%{qMA5cnb`nJDl4?MlFP!*@U_f|HdkJuV-j>@)|9<! z@$OiA%9XxT_5FV>J+pbrJx#3U$@h$EVs4X^oOd@TV`M#;Ti?q93$1sfwa4K5oBa5n z#X}TX-s*BV9VH%Q#*#22RpdM6w)w)QONy<QVriB^<v>Xbt!A4wACAKOAHvmg{)c?z zbZ=8m3BF_YI^5>+*mEs~W~asNHaEk!lbL6NhvP?Yhs!<{^VQo+aJm2A-r)%y#qQA_ z*F?K*(rDXcxWQseq4G7m(KY+CJKdiDucU`jfIc{`9RJk*{x3;S4AlvtLrqRGN+(1O z4Rb2zGH%idCYRAE5{=Z*c%2acZnRS*x<I1xxeMo%-hwb^ExcW)jyPP1rg<WcWtfg} zY_fvUOX$Q@l55H^Rt6W!WE2G>;)!88AuKt_$!H`fl_eQvi4cVd3a_OTYAuLyDpZcA z4c{k)zY8jdH`NOvqM7Bv%T!k>6PwOaK0}dD6Xd@@%9qY@>n)s>OBBLDYh@UOT4GW_ zurp{Z)sb#tvoew_=^+_<r7{jh-uOynbaJ?}RxiC!7vFr2L3}!n;GZtw`{G|OcomM` zBg3)53O7^XAjXz3iPBLF?aBu-RE`Y9kdFx({s|2~NhAL%T0}lxml;qUCcpAAOcQse zMt+z^=35QlR~`Y70Nvz~54xa`k5ZWdm99z|GD?$IZ;ebtO}_VN@@l1#Nz(97YUJP0 z$VX~q?)Fztu4?jqKvU-DRS~vODWA5H8PK*G{xwZpTHKWnS`d~Gx=4`^th^})-RP2! zW?=N}BARmnIH#G6o?TisXIwabIY*kcFf1OwEf`0OhMY5l%Vk&sep@n*Qso?JkS<sB z?A8#S>Ddhu&UM6jKEr5vxHaR_6fOgtongK4OFGfB<xS2F#yPdEo_(O2w4`UBOXl2Y zoEI@{EPfLiXH~cYa1MqQ;+I-hFHi^K9L=OAFpMrLlNmQn;k@8zolh^!#BU1Y<|y1e za3u_zkKa_rEmF9};HEO{Mf|p7+%koG4cv5wt-^16#=WI*Yr#Fvu=V)uz_?8cw;9|M z4BLud(yN{=4|8rO&Yxn~SNNq{3VL>-$+-hKf0|(j@k@54XE$3pcLe7P8Fn1MWNCVK z>xy${asCX$F5<Tf<E|*&4RFsf>=u4;_XcrsEiG}hj7&X1&o0~PW&rFD80TnT!V-p& z@1h$7dVy}{bB<o{^%BF(;L;eEpm5E=EoE3MaNQV}sBo#^USU{AaNQY4Z`$Ep8o1>Q zBX5_^I9g2LTz_yY7)E|HgK=33Hv$~Bm|hqSt_S1BDx4MEI))X1qh)-(P^fTDaMZGT z!2>Rcag!Bp8n_P_<^>nbxS0w!2i!*tn+Gn0aq|^!5x6Z3TMRCgaW5*|GH{<T>@{#< zj9aB}Z-Lvvu(jZ5aYrw#SGY~!$hP#tW^mDr+p2J%f!oEfo#1E@NH2V)aC^a#HR^=} z;Amk;FC0|3!{GKX><G9x#vNC<Q{c#I^#b;z|4E@_70Y2<bWU|3OPs6Y=hO~lQ<Nr! zQ@^8g+TKd%snU5DoNJHXI6)N6(T5>lCf3oXPHa+m@Yu>*{>goRZTjgi_R*zbpFO(9 zul~w+cRpG0v3+0b%p1+tc0H7o@$B={Yc27v>$|(*`B4Eyb=!qK*y;L}#62xyYCG2q zb6$O=G-#?!<&4sD9YxMIcI)No2Jz27sg`MZHjAfCV&Z&J^h(G?M`4>HE4%H%kv3LZ zQ<-R^RH)Q?F;PxXp>3?ToRa*6Oah=B$aI`52$;rb4oN19ASe_vg_=;#w(;OHBB7|5 z&PZu`vF=Dg_#Rx-L&<{)<p+f=8$>c@mX;ty07-*{iZlQ+-v=T8zSjpy0}?(&j@8Cx zwRkLmaQNY0FU|*P3~u9NH#Kc27ldS}wt_GY|65UeHFxsHG=QkclK=+$Aj?T+m{w*Z zfUyeFMlFtDM2KEo89-44VaVHCX%!DgLT0a&)YMKX#4{OUgfH=5fPY@XB3qH$<{_L8 zvsC88{8WRSsD|9EhJ+|>DyP$^8q%Q}l2HxGtcGM)L#Fy5J+rd23S5p!yhw8Hk4iGC zp2-)Hp{mGhIP=2fRD^uaGAKty=)I~Jp+FV+4u})_R*^Cw;U*dBZ!flG4|59h;WSm5 zbC98Zb1HJ3QuaYaG8(uoF2mBvatLGLsyLGFD7NQjXE`p`Qjn4yh77JRBcz28q>~8q zRP(9_#Ea>UinJsoQAYX{yRm+Xx+_SAt#A;n5hW(cGMNtCo5QhILFlXl(lNuz)Rg-H zarz+HK$c;8p~|>{T*Pp%BC~-cVu)9fmna<{<UJtaaJ;GvZOPi2u0?2T))61%G?2u8 zTAAMo8K6Z>umXO__EWza(yAKL*$2ta&Mg@4_Rtg&hn!A7ADM)n_Tq%(WZ`f$<xV{_ zp{K=On2_8thP9xIq$FNyB+F2Gxkx9dnHF&ZNoH-zdpKr#K-wz^Pq}@{{VLL9vfY!A z((z@cd6t)iJeaOcnXWcO3_ZMrl>1U3i9X2NK<?`+%OtRL+6(8HA5&9KPEH>o%e0xS zx-Gg?(Tg;9AWt;<5ko2E!jDgoG964tXya64k(1MlXA$c`a0xSiAm=U}hoo3chGAEL z&>2sMAi7mTGZ|H;4iI!fjZ9l0@jf!$B}7eU1ds$DnIa%&pLFH{L1)tBMb~Z3d}KZb zLh}Z-JapYjvDCcEf%Nu~xdEi3j||<=f#Nmk!~se3k!cQOtdC4*Ae6G2SAQTh_NwI> z17xs|%mg5lePm_=K_hF@Sp;OJkIZr)i-CYh<MIZu%Y2YsK#uqzM}Uk4qL%OykoiD( z3EN;!;>qE&g+QQsk;+O(cF)LoiGvKLEle9shQT5{`bBU^PAX3{4U&>Qa#LysB+Uo8 z7YMmPwLF7>ya<GsCtJ!Z5r~>sHe?3-q%#G`2p?o2kOCj%Z6Hn`<O?8PALJ+@@MUT( z{sc0|r-X4R>?);%V1zb67Wv3z09o%NGZF~Z3q;aS5!kIhGF~9B`N%v4<SQSUmw>$G zBl8xJgFZ4J0-@YNq`bZWd)!B6KakBnG8ceQ3v$ha5lmn|^O0!^<d%<2Hy~6(HLo#1 z0-#k8DR(??!{+*`%pxGsJ~C^79QH})YanJHnbSb17HT>HFp5?_GEIP-^^r*j($Pm| zERZWcG7kgE@R3;pguV`?TEbc&i+zwCKvwx6hk$JLK`sLE!u-{A0x+*39jdjc1BC1u z)sr;V8pwQ~ShQxg%m*m|a>NIj1B5iMro0@;XeDL2H<^(SiY4W>1u}JgV(kM$eMc?N z2_P4J^7<VJ4QFb-VsOEm=7Y2alHika1`v-=$|HbK3#w%<21313&3y)tR3DiafY4Z{ z%B%&_#Ybir5SpQ?GRJ@n_9@}-KxphyYY`VL2xEPaWFSX;kU>DmTGTS<19?r!OV)F^ zkDecf4EZQE*0Vrpeyo=8Z6ITPWWEHl*+=F$5NaJY9Weyg@IEs2fRL|KWjX<&t8_K5 zEFc$s>g5DNW1*^zc|hn?MOFjx`XD=jO!mp^D3BvcUa~fjlE&(Oqm-pX$F8kXQahwj z>ELi-nRK-UB$agNgS4YzNQ-ppM5BWSX_uHXxhm3OaaE+#rYcBM;*lyyN>Ve_LYs0* zGPRBm(r#51BsJ+^RU}z}Pte9{*J-dX(mpkLSrw#H%0*wKQ*u%o`k<OlYGO*#oT^9% z+R~zxNln^R1?iZy)fY)hOg>T-Nu~a-NhhgYq5#|QK~l|Ck#>nykxpq<koJkx2es+6 zPaf-wBqt`*h8vAca&pR?sz|%VRgjJy*7_nTsVQX7nsic9JJJ>%Ez+r7T2-V2twv~M zQlX!!NNOSkd}KO!t0JBDRzZ?d%;=KZSScNxRgey;TdN}N!_hIcu{v}bs~~M$p4@~! z1MY|MvMmdGk$MqKP&!~l><9|wlpMESV6n1zEI2{T^lFaPP>RK5SOOg+gidrqb{;m_ zx@}e##E>?0(bhhd0dQ4Fc`W0#KYfr!o+mq}5L*tju}euku{w%v>Y2+%%PEQ^PO^&} zRv&?4D|Y-rLfU1O?ZWL=>=JTi=VDK+TN`38wzITkNo{H}hCK?!?mUO9NE<O9+2-ar zCTlUC4I$Vegv}c+t5gC3t0x0W3N!2zRW5s=BYP;eFIfp1RN^V51&v-vHN87h)nHka zeWAr;s|Lzt!U|KirLfSEOIg#2%jR>M=dv;N<QGnH7Pt!?o@^&mVs?(*Q)F?nGTGd2 z3pSQyR@;9jXtsO_nk`KNRx_}fBYR|aR*9=vz$G{Kf=#u_yS1{jEIHU*oarpIqe`@- zBJ;GEBCutb49BEmp}TFW9W8^U9EoFShK*KB9d288dWj3GpGW~at327gs0zp$i6V*d zurYZ@Np|KWo6VU`K~=F#r=_?mmVx~^Rk2Ku%_*omP_!vlLs^>DP?l;nl%<<N`-oW? zg`vzGvoo;)uMi3&lawG{z3ib`>DlQ8w%qZVwEuRv#pM<lMwRPs!A3!LmRV5Zv62e2 zvwLOshQSruTr3s<w=K8CW%o?MY6+6T7I4RSyG=;QaPYQBXrCw~q!&WJ3GI`Fgg$&D zpKOK+?UOOqj<-9p3YI;P)`U|bP7EpCmXL}lnYotYY^p9y*PW1x2qndn?8VlE8Z0P* ztuE9UB1O{Lm?Z53Nn%>_lf--=NzB(WCBZ77BzhaOmEznkREn%MZYhQj<SWMP-dBu6 zk{Ig}=mwIAa;gnxeM2k20ZBydN|J~M@D<UfqwRKbBeKk~Dyq#2r}ENh0*04?mLgk1 zq7MW^&A`r4AFQVfav8L+FQ+XhA}6k#r%TJM+SE0WlDY<~A$2KKNnJj#;!!l2+%6<Z zxLru{Z9`IO3Xw}*LvqzCP(?_tM>SY#P+!L=wO18T64iQ5NzeyU#MmmeBEiq3Kxx5R z3Y5>JK(=-*1#w;qsL4l5ay16k9F4i$nxpZcnxiqFTyr!YRC6@uv}=yWgQRHHygeI% zq=>f(yj@gn4XZ`<sbjTJZ7pvTc-vfQ*t=bUtBhURZlern3Wy$49YkmG0hQk1gVxXy zlyJFlYC7_GsTo3*LL}ZMP|mmd=u1(n=U-h;E=Nrvl5%~<aY?5>m@;q03|CX+s<2$x zs(AHcY9-_X`eIVi6p&4)rLt84tBUfuc2!vkttza{ovX?#0ZMKzHUp}u{#8PfXiCd3 z3Dl5k%29*<jefXLH5JLQS{r%ZZ>OoGS{Glqy0}uy>QU67>e1Azi|X+-VbvolS0L5n zDM3)4Tx?ZG(#U=LFsAhC@ic0$9$2H|eZ^|frKEfm1y#+p;W@jBw!$itUFBNVXVR-& zt7_-Ee3sibrDKv=b0l?0O6{21v3>g#4G1<VF|mF7_GWXZ<W5P6ENHCBIxARsZbtjO zhzCTr{f#bAwOcUgoR*fZsMpd2;VL^Ea_Tk=g4PbiQYWso4-BR=T-@S6O$hI<-HJhY zA^!Jf5vLwZPO~9`LY85Dx(l`^9Hx();Gp|*X~N(%?Y0fV6R}ffR$o!rK<^;OQ4jxS zVenY(h6cjz_&<2RZ$*&aR_!fBlB4VRZrEeFLfU6ZG17#@H0@18lADSDHIPZ6)nyzF z@z3NmH;@RY<-3Q*_~t8^68Z9jv}i$cwD|A@<ergaS-#<EX-d<R5Dt=C3YnEv<ur>9 zBsUiS>m(UEX9re3(DZFHdi3lztbbPjKHWPv!cY2utc*s!=%D@?1G^3Ak=cmWx7eEt z7Jz06BD+2M*Y|@va>ltwPi~(&I)kicw9}16jFLiI8{pWi*Cm3AyBAxt?h-Cfr!88X z4zTCC9BxOR$J}gabMqjl$6jQgN)K|S<8m1fa=E0ky$NOAEA-Udy2TURSiGZ6R1HAG zX~mQu=zQcaELKO3Et@S7WaB!{HW^QlM~0`#QlO+~=}3zRj}rXk)Y+wBA3T77rd7e7 zY;nU!%;Di+gb)!youV#GVUSpiD+D1D&<F)8M72EF(-y(9@Bkkq<}w*lzI0B{ej&$* z2r3xIitNQK7Ma-Fh&xDhG6`C9k|ZpXvH3$U7hQN4A<y6+M;MZ71}Y_=%u+G~;3-XD zDUsgfyl9`6(I>TW2wkbe4{gYch)4vLBS+!970!8NM_wKV1r}c?42odyx>%;^64X}9 zV4F#Zu}H#`!UZq2Uot3dtiw9Ew-IOuQ0)5<I)Y*+htL@myP<@;L8*^-0i}IA_kunG z+7)y*Xg5%*dOGMz&<xN|KzoDI&8WVhG03|gXnoKDptSfs5VQs8V9*rMA)sABGeLWS zW`Xtx9R@lCbTlY+y9YoQf{q2<2ATu<Ij9x%XHXmHP0)N$Ba~PGY6i7~VvoHr9<&8$ zF(_?_ae&g2xf66e=mgLypl;Avpe3Nx7?VH`fZ}a;-ZP+6LH(fLX`o@C4}nI2J^~sG z>IIDloe5eGbT%mUnK_`BpqD);WBV$7>jk7si>Ql0Bh<d-bZ3`f=?lw~*?3eEk9ty{ z8Vfo3@a<D^un{MMc)#F%k@XI(#eN5YQ9M3%8Z%hQVp)eEyCW;+X*gM@Nx*pt{s)P? z6x!snfj^Ib927Mbl#5yw6Q&|j|08R!YVqG9tREDDgG$p8v}$S6fN4w91?T^+G;?@z zRGR*ZC@)QKod3JhOs1^R1UM-A2s#btZh%TR80XrYd4<sZSpTEjZt_9xN!!n`!;0O+ zBOIGcz0}6tL8$>yIBzcK0MH4bNZm`C916MubU5fb(EC6)fsO?I3>2&K-rb-`!}}fR z7|<i2NXvT?)CyVwiur=~253I$ub^-)UJ+$11f`9DMWC^u#h{Hr9iWMzsG*md1j_Kz zM!zYbV?n2Zl5QUcC7&`Klzh$%(3PN%g1!ej3-m+K*`S|+J_h;?=seKxL7xDn+gVS6 z(mOflgI0hp0KEvh2=o@{GoXIZ<FlZVpwEF)<Gc(?^P;7oZ9rcI9S*u2bOh*1P%G$a zP<rg-P0*R3Z-LV7_cfr@&!Ai0AEBG7{qb#J<SUVuAa7CuON+`DmyJ4QHdemftUsC& zARoT{k!&atLBZi<Ll$OJ9hLJOxc-QUXq<DKl6rbFgAv0QPQrYR4`)weLN-W5_8g)t z6^QN%%J#Sl0rElhA$yDjeNh5oQ*1o=05l%hhoFr>KLVvvZwBoOx)rn!=%=6~K(~Wh zKw*nsC+H4P*og22=tH18K_3Byje61cw3Wk)wiUhxrM&lml6~(5CH?LLy#z`&-L;Be zd>$B;Z6W@nh~WqPB43!snzG9x%{rK;BL_)^mk-j8bYRj!oj47rl7m!c4!wc#Mqo}; zs0F#fgc(WInoQi7NpZixgK(q9V{@~HH7jWp^G2uyFc$yvL3N=v2n5ZNK=ebVdpt|# zC0`K@Iu;cD(u@9x2fw&3YlEV{2=zdp25kUJIx&Ni?q0=z_bR#@0u1-W*qe)@|AX!% z+hg_|jyUq+t3I+<GlCR*MJrfbOeM_-X4=xIgi_(Ml1iALB*n@Hm63Gf51Ju?O;IN* zH|7Z5CZO2L;q3_87PJ>=5-8at<__L|psApw1A4no)qZR;@HYir(qqrAj}D|7yD?eC zRFTX^fX|T+O}%?WVApWxh>Hjs1ouhp9}dX{P!oEgt;pe;!iKJRfCa2;df2Ti8jR6A zvI0tqxS6`~W($n42pG?VY3{5Usp}$;oNzG<q&sigP)f5SLiJ43JQ~}1Nd~(ZB|Mu@ z&0rG{G@_=U>_WSn-D)HYrk;@sDG#eAf4PWun5P$AkU`@huZF%aSB$x<gUUI%MrIY1 z;!Xu-Z(3k8;Jv^Uf8{g#J&zD+_c=vAf>Uirm8TD(LZ^tHPy!vKLpraI;?Y5BBM(SL zO_O8@Cp#cJBYT3qumf{WW>4KgF}4VpdwO37#pSV=;$!aVrH3Fe270MjcqGw_f7)>4 zodk+YU+-d2T&{ZG0>vf2_ao4;pkIOJfc^xU3wi<63aUpr^Fi_aD{Z)8^U`skG%qa# z9RgYmN}I9Wpi@CTpbJ4uK-qj0bT!VWg6;vG26_<m5m0~Fxfhh)WLXN@8gx2nGUzN& z+USfi-1|J}<DjpA&IjEIx(Jju=spKZpQ1tCSicHH*}GKnExmzJABFCO*qZwl8G+_X zFcH%7q3K;3r>yNf(P;nP5LY}6&4HQuP+ZA;aIr?0Z<M`^SQ&z@DI>UCqaF)DLa_K) zQt0uqI}Cj6xjzurX+e3uIk;EKyB~~-=B_lfvTi^|EFYu`vaL7()Gz3G8M-6=ECr1P zT?UG-DZB#O8T3_9nmNA?N`4;K+g{ACgttK-1$_r}F6cT?8aFVn@-7Em4~lt=umN-f z=tj`bK|cVcGHnJu3%Ui=fO35d+8p!~&^DmkK-+<S3QGM0^D{5C;SNypq3Pi7uF}@9 z7d97~4jT7w+PWCyBy*&<Z|X43^*wDyXKp7A`PSI>%*n|kQ!H8$omgraW?alB<ksaa zRzvHe8?&c?5Ldp~=dyIMPY79yjBxwWSQNH5+}0*2a<Cd1rlwd4`41W;<b!lbHqrn9 zwF@1)p>vvJ!dEaG`5Lq_&c6k13Azuo1L%IxA)p6A$z~3LQh5)9P6x%cuNQM_;TO;a zphrPp0X+`-CTKY**$U>`-mRdgKrts1PJ<o*JqJoQa~@Pc+2E_Z4M8u0HU+H&Z3TK6 zlx*l4XnW8bpc$aQg2ERHzk%97Z-K&R33yP(3!fzDK*@IC`<RVQMqX8ItUWM4{L>H= z?_*;$J{DPW?ZqC4yC7Sc<3Ub2$R$Vz+zB<8+N2ag@<PhEAPa+1zSJ&q-V_vsa?*J) zD76nB)bUc^#(M(1RK9Rf>ML&i-&3WpBm<+k)CFo)tB10!$L(=p(T!g|KvFq;YvOC1 zZab|PNozf6N)-Mma@9KE-Quhcv7l6kIM66iJhso~_O(H&4v*u%Q<XYU*(pv7{MXjj zfpqC+i+$L+Gtr*Qmm|y&lMmnWQ`e-#K1Oq3s>IeOS#RnHkdN$ALfP87QK)=SbgCQm z{8kc(N0(Tg`h(U2HV~A`I!LP1AJMdS91`&jvgL=<&5O>9AnoExfJi0zWOiT`Q)wM_ zI_AceKuE-8trTpLSs@R)strO5NkNqTA9z-XAD$#NZF=Vvy*Ue>po)lXvXgcwDFS8) zT+k-3U16oE8yd(z;u0j53xhLx1$($$v@dL!v}V+cb~|Mcr1jARAvofkHZ{#fjl9O> zhT4K7uG~(FWr2rdf+NoVJCSU@HtEKDr-LIN#C(h&PIoR{F{3YHp*IgVYj9s7IN}uA z$~RoH2%3@lM>L3}Kx}5CiVYf%DE<-0(5wcp+dj@s_`vi*8GQ!!%FgWDCliB@9Bek{ z<ZFWm4^7uZZkKP*(S~;K)2p3eRwBb%CTWB3>ozcR*uY+>kes}wz%foM(RWbqZrw4l z4~RG%!OELSTiJ%%CY0DP#m<`Iv<a~Y+{Xi1v-EdZtV3<N$TlEi7svY)=ele~HhOze z_5d4PM6R18>O$fSml(?4c9h-S?#YB(>{(Kri~bZ45unL51DhR{09vO;IeXH*F(sfm zVx(8kv6s!m3MS>u(x5`u)g&&}h*jpG2AAUCg?|ANKWlJF9<|731r3qHXb+)M9;yM| z1(6F%8z7V#)Q}5Lss>&1fB{k-9_(T)%I@P(k}_%vrsPoznK#k|WZDYxyfll`06{%? zkhWzgjM^m|uN@AExVyT5tVr6m#1aaF+yyBQY$eQQYHFa#R8o^7yoQHS0@*OzfQSkX zsLh{6cE#kQ5j=$l54O-|DReKMLxPlw3$MI$WvA2DRaWd!#4z)2)qM)Kg_8c0xhyl= zKGZ|88xv3N2Sf~&0+=>g^oBtHt-)qvavc!yrZysN>&j;7Z9(rvLuar;vGk|~vLs<X ztfX78xPvg3&aXUzrUh`}5fGtK5&C67L~Wh|vvf2-H|s=8ajwnHR74t#_6_fc8o~=J z8mv}Y)<%Q1b$|x3-;u?jZgGf*^@k%Kh-(v8l}O+xq&R43CQH?u#xbSe+gwbX)btUr zo+b#_E7e<+`Ibpi(&Ss@Mq&w(LNo@(%KkAImP}?SZF*+qq1FzU5~6NMeuxD`AON>2 zsCCkD={5i}U+T^^Hw|y&K0F<`Be-_#N1e)z>3L1^ayglwds!+I+r0ss%#wFTvjT)8 zw?(`Fnatc+`!C>en1Z+wV?i(=;+&KecZkgL-Pz19RWB6x3qd}ml3WaF?nx<6Dn7MV z92aD!)Xjq(v<0kqcOmFr9;7kG?4DSnVTDt=J1Mdk7aU-L7oVKXEcD;F5=^%OA|B>Z zSXvnT0wPj5Kx$>JOzD2lF-hZ06EijORHsT~QK@8GwqhH`l5BZ5s*4$ug-28DgLb&H zdQ#SHr8K3Oto*M?5#+{0FQcvIEDq)NW-PZI7!ETa+V9H(skv5HiOjqa^E@>*Bx}bH zc<H&PkXoL4azT}(hOz>&oM@!nCIxfDz%V%gy_1DfTRXYmBLinT-pi%s{qwj`42ZbJ zGuAdTvtpXGDBb)y9x<~dhc{TG{~VFE)<-_Y!zN``G-`hYP~XcepeOjL5on?VpoctT zBt0JB(Rpu>M%`>C{XCZ@t7V0xCdtF>YjCDA9UM-#5Lted{8v0F*@3YR>hX!-X6@LA zZsxOCG$6iHrIoR%M-^a3r!67gLQD5cSnLqQrs*82G}z(Bm3I|uX4X(s{aC<rYV{P~ z#{xd*`AK$6Il&K5Q=55S-5q#!IT^+jUbg|twIt1pS;;7LCr=;7f=v{($sLzyCAl8F zVwxQ03Qet*sRIo=uSvPfokDAGl<X=^L^3*6S5*J`JX3Ds%siU&^w^$`-q?=B$9VF? zwB!rbNd;645_g3HB7Ciwxy^E(wB*SZv)#kfr$%QOmBPnYvGjbU*tqSdtq6MxhIG7> zC)b@GIibeC%yVU~Q}+BUA2M(cZxG-qv^OFkf)+bmZW_%z0`;Gbnmk}vcD%im%1?!5 z?L;lHgy+aQKqkg7mO3RiL(Q7m)+jE>?ShS|pK%GULBwMUpRGv`&F-ASa-#lmmz03i zv`jI+ev!E;w=BjUnc?kKwK7x-sX|I+Xr%c}TSnD)ld?3L<-=MHcFvU85K5esiwvMd za*uSyMQ(&orLqUR)8UZ$#E<54MLf%H^tcZ%EKO!Ma#Z$aOsUk{r9RV*?d{3*ShF!O z)4~N)5;geyQbd|b_%t}>Rl)-YuzMsdO)@tsFbX(~J35-|yvOBOn=&z~$2<*KWuidM z?L>E&XkoW7*yyyry6q^cCV8D2&PH3w7;#;RE>1O>ugwo*8`(6gCdHQgR(}UB+{urr zrp!89YaX}1J;!BnO<`4_ShPq-HHBi>#G=MQkb7@h|5QD-n_1QfZHao~`7w)!6<sP! zPy1v%zC`+)#|>NQ6U?wnwXqeSMU7p3M#U#cCRIhgw%ACj2dh3cVPj;N4Fj^kRnitJ zq$%|+emjgNwz)iiK01@z;+MeVw6HV}CiT;e8z?}TO)1WqM&xyxl1Y83k2}MbXTeH7 zYa?=kl7k%Vu+#MmE7c-Jt2CP>q4qrc;kd?g;4+DZ)U{ZGP&*7=sh|OwUY%T+%EY@0 z)l}1{aASlxxq5ilU@bRa$(NR>dFP|7KG4>~=X#6`%I0zvJD^W;bF_AaLdnAs$?}Uj zy5R*q$=8^Qny4T?m1ADJ+9<$GeS&ZC*fVcTjbuz!W*yl~ZJ+YuNCu9ztAL0}RT80g zQKo!U8d~*Js=!k5SF2Adrcv!{t&qH6g4PQ{SR#e>>EDB?v<8K+QT?{=j&;m8tF<jt zz%HL$(d6=2pM-4ZV67J;fy<We!j)ZdCOrvf%e3KpD+TmW3T>2>rZn^hWj6Qntynhe z>@}KIHuD}d?n%QQxyh>I5*MP{XWJe4`~=gTk11!fs<$SI>|CrFN?p;(O`q1Kui(ER zh(EGx)(a!wa>bYiuOFYer*iXC{l*MFKR2c1u7Z%3q3$^kpZXVWG~EYzv%arBpjOW0 zusUZB8QOlZ{+$aW^XmWZNIJjy;_DMzzuDS@wP4!6Vb;GAaK&_VR=rQ!-<{x&Te&3O z9DjP;1LIcI`TFLd-+K({bX^cGF}VZ#Z!Wz2WB*2tmX5upuU&dIx5ZB{q%;|t6`FeX z(bFSdM7}*mN^j(nkclrE)@<MW&JzdrPKx|}^$PnF6I#xgF+6p`lD7RkTk*<ACO7zN z>$ySuAK8(WaO3Eo>p$K2as7AheSY=Fz49}T*Y16+YcqDw0_k;a@bLLx_c<5L?z8iS z7Uo4?ZNEIH`MQJKp1ZckGvoBWX8p0p5%){Y`nHeRmv>&B^j_%NTQeWOd-$I_9WOul z;>6AwM|!N)=Wm{e#qmd(T<k*?$t?~X{<ZV7Nqd`Y`RtZ{_s({&{Mg$0<yVQtfv378 z;Y(>u?(1dNk-It;#0z^KSnTYQm)YO5O8<tf<$=vDQ~iJHajqx!V(2N~`m0|(*1}P_ z`0XhMOYj%r&33I`=j!yreJ`#yMTXR=eHIRW1Cuic_4)L|zVTnIZu8Qwch8*mdE~nt ze!2QZ^Lk6?*Xy)?MR^;n=Nl-!I;Tq9E!)-}-tzs{uN-c*uJ4g%FRZEa=-eNdJ=t;9 z`R<dEmXpaP413_04VBJCcU^q#t@-C(`?>eNML!I`+qiwht(Je@zxCJ=ysVGOeRaNG zZrSAb4*wb3q;y&f|3<&P`>cKV{@vx74bJZ#_xt@za6cF~Im~+d*-M6$S&cScI^Hkj z`JONQ_{?WTKa@ZE)R>)jy?F2C4;Ephf0fC_O#FR)=(|mRxtjXek8Qte)9s6o5-y!+ zczpHfR*&>`#V&$Ton>-uC$)<_wC%GYqoZ~|?S6IV(1SZ?uHAEZMD#b8pBe9I5k3KX z<1p--_2Q%BfBh|XNRe(&PU9oB!<+j55<ka$@cHS_Y%<rs{8r#C?73rd<%{co*JS=j zUr&4cp_wP&yt~(?_zqE)j*kvFa^CAszBvXr$4uCG0z23k)!^y!W5UWGDlhfk@W+(Z zlg1dgU;4P|{3oO4etz?}9nc?>6XqP9a`eew6CUaiIBw|jW}h3Myiz-5(+%&yp7+*o zK2yZTxbK-<gT@n+>xN}+E!-8gJZnX*qqBpitvhj~vhk<gI|V%*{Znt~5BD_8`hABh zYBkuhuiffF+t!T#HaFs>&A*)f<^8Zp54J8@*Xosvu;*8p+|ZZyO!(~Ce?1u9@6p+X zwu9fFs5kXo>zDgkw~5hD|2`c1SOo(%6`A#mH?-LCTlc4*ty}Bt)ot&d=(fJYO@le> z(u(3OzlWTeaP}4Sb0)WAT#w;5F2=VVFnamo9dY%`E;`nqcw*-pNnyLsT6-teZYv1O znA}r`U0(BBnTylUfBk8CxAr9uws^qQYSfx{<Adyd!<+kIcr=<Q-=57z*_<UKMy`k* z@<zs_aX+8zJ#qfq1v6fH*j6#~zD3)yVQ&nR+v2#epxr}#6DQ_nj#>Lsr@UGhcg|R} z$NuG;Z7<n>n&BRUy=6>p<V%y=yp-U~cD?h+l8dnqJ|}J%He+p<#~v$99gtf4?kRuZ z9wB_2S%0fV@2G*_`+d0~r%&VeCQtp~S^s+*oA;03-~QLYc?;Hkor67)Os**8wFYO5 z3-{Drx2@d*cb{3OJ1<_dYwq)(x9`>D+nd)unT-43Om1J9F7E9{!|u9Z>%8Z~IjzI* zjha|z=zTvddpGNu`CXdFzK{KL!IbY0KORW$H|E-@F8e3z-hVvq?3-`ibM?qQ&7S^h z>8Q^?tkdKWd@qxm`^}LrmUkX-|IsF0C*<F38R~lC^sF1nkL{`WZpLS$;zkt<0(~jm ztp8)rxX0cbncB7R^0mZ!pSj%Xz@Zg)rS{wt7rXgQdpp11ag!@BgyeERZ@lWROS(^n zh%dZyZDYpU2WEVocP?SFuHx=7o5xN41%6{Rll$VgS*yRZ&wB6vk0Mqcx%zO2mzGYS zu=&QQZVN`WoOZp@bljL)$K=LX_HJ+wyf~v(qOrGdYHyvck^5ds*tu?t|9fYTZEUeH z5&O}wiNUPjb0)T+al+y)8=Ah>p!A(@X4RR0W!7r{lqCmNdfV=q`^zTmSz&Tb=Y=f{ zzWC_=wrK<2ADguHr>l!UNq@Rybk-jWdQ|>;^|b}q`^V&7&d)F2dVS%nG~EM-=l?Xa z`@N2rcemZtqt@Fa6S{6&*>yTz!G;@<X8pN8Z{!Vl>D}o=FFU3tJv4IIuD5jCw|6=^ zvBz867Y(11y9Ik)nB0xD2X-1~|8Qc*?>{C+&e`t#!`U|Gg~c0U+Pswf-nDtH;dl2i zxtuT86zre>`j_9Xzw*;tCtn?L_{^FWj_vn%yW-z|e8RUQ-oaOg(3jA@!|tB=@jXqR zc+h*L)7j{s%ddab>!*9Bj9c^7vB|alla`_XVoy2bJR^tRANYFnevc<C{UvqBePbUA zeLVD@tGTcIkhNv*=_Wru&2N30^(~+K*L=^{A#s7V8rSM|AahOIULRKa4agO}0lO|O zU0$y>?pLBOne|h~H)`sAZodCxGe4-6)w*=v$!_!aMFd4GUHIwB?Q>d=DaU>%CKtbJ zs3G>gr)O+#|Dx&1VI!k|99=TWf7HT}aa}*(++*ahvDp8?<SLImJ+tn;f3%H%<fMMt z)ts+RWbK-MVqR+d#cPW{e`LwBPS|S>n=$J@ANa&ghu<SVZ#H<gOdNf_bJ;`3`nGKF z<+sm`bT_R0_Bb}(-OuDM^)GsH&I!-0{+94A$vd1`8zbL+Yvt4DTjZR2pj&pQm9VR~ zm|Re}DQ}f`W!?8*{#V_-f4(rR@y1^}PfFf>HaK_0jAf>~n&7LNOz!9LQ`*j7RsY6` zxkEap)gQ6vLHqW5Ry{ehU!fTN@VC3~8-)ERxM_{~!LgY$dMr3pvFgme*)P4a|Gm;x z&EGZ#T<rPGGkqF2eYGyet*4pX+M$MPr330cIBjL~_4T?f*n50Zqf0qk*X?g~bI~Wy z4qlUsuP!n<<L);*4~{ba{zKe2Vb#5(K4|mWzh-s$Jui2dr`=uOJb&(U>;=Qb5%Zj& zPkQFR_r{@)rt#ii9__kx%i%7cKfUX|j!W*&A9<-(c?@>GGr5&zLQcAQ)se`K^LGf3 z?`~AO?XE5>_l#P%@41_^fB$&OGR%jV+%)_Brv}d3Usl%P$HPVM?%4WF-p$%~z5VIA z1;YzVKOVXOGwL2l)2zQ~X<l^ffiWSizKlBk(u!9*eU$mjmiC8Ue{0;v7baGWyPAUC zhfHqa#pmLNyd1sbkq-5)cn2T+u-(CyF?BvWT6U^*bzmd^!|)qNnB1qG((C^)Gvkjf zP4|pG*zCiEI)h*Sboja{b05F@=`-hg)?EWVV`^^JXMeUd=;1!WTgA7-Hl6w{G4iX- z*_I*0+I4C0<_~)&zCSw?`;?ems}EMRT-vMup2%8Xx18Ca$urM2T<u={;sc)gA6@>j zYwhu0V*bhGt}lD!@vK!(uZzk1$XN8mGwoAu<Qe^^&B&j$;N!((H$Qj-&yZlUZPrJB zxcJAdyMCKGBJP8`xAc1H%TebBg#>Th{>}L5hu2ihG(CrxHZ!?m^XOw!T5f;sV)62$ zab+(}IB_vyllQ{1zz=&=PVV&ChZsNp#pM2Q>%M<vUfzabr&gYNBC2!Vui;bcKeqG6 zkoQtO#e4QOc?<ghF_$&#H+*w!?Ok6#UgQ^1ATB-f$rJOAp4bz(V$IbLhb-wZpm_LR zOw*ZMvtb8!U0C~D`zhV++taQr*qnOkx7|AmtRJ1|b|dS|jYIIImj&#tg6!Y;(2cz~ zx3I)&Q@^~zu3y==SUl{Bz%~W{BvnsxPKmwH`p*)<6|e_4u}9}Riu3IGqw_okHVf_- z+~Gud>UTI%2cB_r6yM=Q-5zV9Jx572ANO6&J@NP)K1npWWBcZ#@52*tj!ABFKfA|0 zIw^59?j^7`PD*T(*e0n{Vro*G#L*?VbQ_J7thT&6ky0)$S&?E5NsU&Y`WtR{m*Cq- znVu4>-7y;P#7Z8G3)&)Vvhz$CJv@DM7FNsMqX%SyO-gN((y2{KO1q>^qh%YNnCrqr zbM_+Je>E4krSQL+KI{zF^mukScglY|tBL3)d2XdP<FM}J9^K7}w;JXCrw=g6I;TD0 ztn+F70^fG7B&*urooi})5%x#YYVUtFmr4ICxfK7KT>egvt-0^tIo-SOWO*gOfK8ON z=Ko)9P0zn6_np&@^M555+y6=~lmAz8`CrKd8%)OG0~PXQMfFL4xrfOXJE_Vr`&Yat zeZEfG_9;=9I$crAcIT|pQccN!rMS0u_LdTlqX3?`2F2dF!cYA#6+X{HuPIQ9{*N?* zZ#}YGv3DjlWiX{jI_bp+t+BBeuSU2tspol$99E0derHls%9`h4uQ^dtRqgmM_pvIY z!9QvlP5JT*v7M}@j`o)esBr>x%UP-Oohm8qGgcB+6?y0S6r7jEb%)9=U3Zb9^I@tq z9lS%9s<fTF?|QU*BHya5DCZw(Tq?P<BnMO8JKD#jl+kTlyGxu-+?u;HC6?#gcPKT_ z9c-*Tk9&&SV=KBdMN^tS&x1Sp|J|7(dm)QzvTA?(%YFg(YPIg*AEYFEnA=`V{pGT0 zQp|Nu$-X1?WxE2D2EPN<b+cR9N{WA_cl%DNFvQUdhw#46&ZF^-^}mu(wdqbCwrpT0 zj;gVLm>SB41eHpvYP)m(U0Dmk!##J(Br#^#9W|8tZ(AZwq3>*pEJ3^wm=*$+lK!LC z()b~(W=#G^Y36zI>Di|{Q@}hA>=jSuD5?E7%n4ffZ!fm+EE3z;i`DhDzoO+DyT5$B z_g50Cq5IQ*n7`NieM`mOz3}%Es-aZ&BD~aGY4(3u#ll=`p8fA>zJ{V<6OyIqj#U)S zk}pH!7RDv~W7`29c<&!!smnj**#hT5?4vxynFJH|<D@byRN_qZP7?OMqadNN#F^+_ z9qfa)K>|H>-j2n^^Udtp(jehGi9=lMpW%5lmN=6zTEWIDSOWH^;8q&S(oEt^!VCqQ ztzi2UjCQn843iLnJtjPEjKrCQu?l8Yu%!w{AH?Eu4=dOa1zV539xYi}Hc6aGD1_oT zMo+C0XA-(#FGVXRmnLy0fj;5Gu`3ET8G9daD;RZ~CUGXgfPD!Z3y?UIFby2tY6=p( z5@!-Vz&-+wZIL*WKp$-3SVM_32^k93Tfyj~EnIGdf)y$leZYl6O~L`(yQk-EgM@<; zXA+*leRYmKFL5Ser-FT@U|Vs&yf%wVyWNO034elX&oFvSkvNk;yQ#SxJ?zBg&MMeN z1xvtv+&V07Gl??^GZk!(f}I5i6GoXYN}NgPjV9$-e~B{*v|FzclUpxwCLsa$PC3?0 z;?Ta}pmh8@CC(%~1rACFwou|s!u#N$IA9-0oJrUV4vGVIK;lfo8E{Y%unQ7r5<+qB z6siFhDRCyDEjUyjSc=4%gonT(60lN<GYQMV;SbnKi8BeGgTrl6V7nv^_6H8Pn}N}t zTH;Iso}9;4YQmx=4)%xhJRv4#y3rB)`}cKvEUJ64R>It__Y?ltr+ro4S*cuUIjuQD z<s~G^ER85X;2!YE`~UQ4Q(RJ5C=@%2i!843xJGc<JoIIWVuuIM;o@;dJEkmjpG&}f zIyZ+PgZDSN_z66!$8IUK+Vk=RcS#YpThsndrwh~ET#w+iBLQ4~yO7eLB3r&ia9OOl zi&H3AoRFE!)4&_eJr*iM4pOE<xSjN<bD?9ZtvKICqWGvq9v*wk6?#DgU#7_Cq>t5s zC(Uy4@UM`WYqQ!53oU|MX3{OWC3sLXmy`5diwgzI<;03rD{KsJgKENq3p_vDWPGWl zNSIK9x?Az>z2cIh92*|B$S)SG4kYao@T@t@%u)o-jgLQYVV6C>0CmL%*WyB3p2TsG zJy2zLj~ASUC2o2XT9HL4z#Pj49pU*hhgHB=M%)F$RGZ5o&=*%clN^Gl0C%s1JVyz> zr-H{&vF&xT;6}BJ1slr=4`HHSjzZMOZ7af?4vC}o5qug5g~KLYY7SJj8{Tx4E@a?C z+C7C{_&8!8p)cNX)gSNC8z>AC1`9**2E9zYVQU!Ppm(1z0`JYcU%<xv-0?OKt5XhG zUQ`K{>z8Y{=h|JlB}D>0s{*ai<s4TFi)RsX@QytzK3t!Ncj^`3{kP-rsrf>@N3R&K zk8uhU1Q*^3;laB^CJK}A_Pi<hs5|9=CyJrT94MWgX>#-6#=K47jfMNgXj5u`T;aP4 zVLD_dxvbJtps&0_2j+*+5{Kj)n7n*$h{Let_GTI8<F<bx_T%$P(;1Ue!q^!vOr9Od z3s_yH_On{@vBo43G9KQ#R5bJyD;b9cy#Sw4$w7a^OGsI+EH!#xj#3Dp6P}M!Bz|fu zEVMh_b~okVDR7iXX2@Hb=>z$|Xe8@rO_NuMH_LLpu?5>=D3!XA+I_6}9E^=prHe9X zl=r2AlHz=etE8w9>*<0cANDyO{fYXKt%y~-TMxnEvgW}EnN9ZR7BWa8EU?Jp&MiU9 zphPS~vQxWI$VD6yL65fKQH^3~&Q09_Yg5!aT<`(;<Sx)pg`yGx3%OPsIVz!tr-0-N zEQNWjYoP$>Us-qz5N1_O-M|IK3s(C?JB%gA<rr@(CS$U~7ol%KaS&wvOcI3+PI4&O zx@`G)eu}jmPuYh2ityls-B~z=$5Ui;@%$5Snr>X@-FSasO7Es9wi|DjZcM@5cw?l? zitfQ<_Rz%ap~URLWA@=PeKazC6q!C;W*|>@5EmV!5gnw64&tJNxF|j;L+v??#~7xG zF-(aujK>(sWkxFa{XDLP<9I}n+yJXKoV;XDWc6f?tlAhHsPDpKbNjOKm^MvJgh(-I z)Idx-myw(dOWm%>*traLS5UeRF6z)Ehu4Nk$vL>FgNwR((Mx!Y5={*3@sMJa@EB9L z%oGKmDs=%iT)63;fY4jhQ8>a!3`e2W?U@26!%r2PQ3en$+>J&m&MKpbBFhkFU<w3N zMc1X#hBg$D!D~-xEKxE>n8G8P%F`I5oY7dLo?y&TPB8YUJdHuh85@g~GwT1!2^;6s z(o$A(H<KI(caMsQJW_ETSQI=*;mDIJCsu`1Jq7mY$UZ~iiWII`;WV9G!Q2X`=7IT4 z9=Uk<c%@A+8RBk9Z4(7bSFE2`f{*e_!oA3trPk)8J16O!WN^}hlb)RP;-ohxeK_gM zNk2~db25OFft(EDWH2W~I2p=GCMQ{(4C7=tC--qOf|HS)+|LP{WfZ}jJa}4<OfJvv z!8}QDl{oE|0wIffAeU5!W+^6`PB9HWMDPIadpOU13FkAU9>~wS(@@3Pbn;b_j6Cz> zr+7eF3Bnp19zJ5@6K@2ijRvtHjK>&C^Gw!x)44a|C$c5dNXijZm6>`0_xqg3_w3M1 zWS&jV<P%a+f!$@L0fjMcHoH?Sf%=+yf>e|f^fi^IzNVb9w3RdJYsv}rcBO*ITj7zt z%2O9q&Zq?H2}+=xpad#UB~Z>-36wJ`fpS7!Q#s*|PC4cMTsdWqK{?|?BG)n>J0)Iq z#}dGtw#3VRSURPFMPjASBaf;a<)f#>GgmJ0RWnfrTprFxREgKb(~Q4Tpl^XNGvPQN zi#gB7T#45trWv87Kut}RAzKQPs>f$n9OEOi#B0*kjN?+EZz1_m&V$&biL=Vk&QB8) zvEwo^QQ$O5qRA3X5xUb?BZcnh+xT&e$M*&4I%oj86Rrk^+VV^2nrWy5^E!Ouu*jZ6 zg1_U!)F}9gL1Ls>M{Fv#7Tbx}bbZAvF<UGUi$u3LRV)=}i}S?!;v(?{ajE#4xJrCS zTrYkgej<J;?hy}&hsAR7lz3V^E1nlGik0FO@tSx;{8hXq{vqPUc{+p6s0+}Ubiuk% zUAQh%7p;rc#p`P8>gt;5l675m{dD{FV|6(?t1eGhpc|(v)D`QTI+xC)o2Z+to2r|p zdsyeyP1nuT&C<=$&DG7*J*k_oTcBH{ds+9Y?rmMRpVRLlzgd2J{7(7RHl`cL8v7cD z8;gwjMvw6!;|s=_#`(rqj2|0U8P^+k7{4-B821~0F<vzOVXWit=O5wUOMk(zUAI$L zuA89G*UvG;`gQkv+wg<l-w-F<YsfN~h3$ssSQR{^d&7{1Yqa6Q1A;~9W_ZAWYbV3Q zhR^kzbW06R;b+}seE%a%|EhkSey(8mo9K7bZ<OItLz=#WL8o7&AFk^v{%lwxH1|(7 zeycmDtEX?N@2tN^KTtnHKUqIp|Dit9?+L&De$V?Y_j|){o!=I}FZ{mqJM6bysPywU zh8h!$#fD$>r}Y>0*Y&^a!woTpdWIH;B*Os1B!ghQZtP-A@h>-QG~DIa(%8uVYr{1| zL%)`O3k@c}RKJf5`wh1YtMT6O4Z;?@-TGVMkWeO^5-teWe3mADuVM>b#s6(v7_R## zwy;S@E%~kPknU%+=Q-UqolYO7mo=TH@5Qv8ub;p)zKFHehx*U;`}IHQRo(g<RPA;! z+-v9t9cLLvp~c4=ilOa?(W-L{3k^#RZy4T&#y>J_H+&5Z|7<8XT!7whLFci44gJs( z(0zBbX{KMcpB;8Oky+{!K5e{*wel&yO4y5Fq?WFYwr*)mMvJC1TOJErE@IY9w)_ID znQZxEX3b>F6|m;(uxGO7I{uCPoBOBuclPh;Kf*uXf1>}R{`37`^?%?0GynbmNBqzF z-|#mEL<N`wS_O0t=p8UDAU9xAz^s5p0WSxv3V1)@lYlP+_6PhFa5CUhz;6M5fnkBQ z0_z5v0}}$<2lfdZ8CVeL4xAcT8aOBLslaCgUkZFJ@Xf$?13w7d8u&%vp1|({4+kC# zJRNu`@J8UDfksn^DcV%W)X3D_)WOuv)Z3J4$~8Gn(@b+ri%hSY-ZpJAePP;f`q^~O zbkn2{3J+=&)GDY`P>-OYL8F3fL9U=jg60J+4thOkebBa`Jwb<pP6S;E5`#m7YX>(A zZXcW;JUBQzxHx!P@SNa9!7GB-1#b=B9lSrdEcjgT&0teVt&k=mNg>@shJ@T7k{99% zc{t>$kR>5+guEN_amcQa??X<8Tno{KhJ@A)O$cojni|?Aw0mf;(Eg!ALq~>MLi1^% z^B*2?fPx+?kZ4%EA3Ol>O*dg}G8pTsp;$A;%Q5lnbrja;W3b{Ghn2%xSTC-FmEC$+ z#cUv$@iN0kc%M%K-uc`VU%zQ4G{+r=mRNOfEwmBZ;ticiLNYv4D(*_O7di+X@gB_1 zcrR%eywmeuyoWyRZ>=+p5=P^D3=atOp4NYUjD@ef{hAZKw3x3t(Yr`}*PR66L1aHo zcnDu>ctr3DrNVUjP6K@GqxhYLZ!^rH?=t*{V=lrUS7hel%MDM`R~wXLzQjGv=mKFO zzTNPQ68cXWQ79KqAd!>swH3l?;f!!rI47K!+CLZm_ag39RpQy3E5cRy;_Jc<*8Vqz zUxnX<TZs9)@Q3gx9)cHXAsL5`QN3so{X`?<{lx&0-fwLZX%!FML&O{Tg-|g}3>PCX zu1AT{VvHCo#)<J_EwMJn`MP2~vA)<qG>Z+zMq*<zL2QDt|1Pna*j#KOwiH`o9?(W? z%TnjL{{7!XF-c5jDW!<1m|e6NJK(G%LprhF&f?vSb`kFp?`0f)A7cq#3EEXm6T6As z#dI-4?7>2Miq8tK;j0+E#NJ{bj7|N-{^9^}pg2ezEDjNeikX<X3=@Zo_lYCKk>dU0 zC~>qnMtlIXnX#fp%n@@%t7sGR#C*(d?BY0ayjX}?PO<0^o#F)1h53$0ED<M)lf=p5 z6wH0lwZ`dI>bn{a8y^aM$`lv$SnwC2*TU`#uZZ|DvLI?iY;l}9u2=kkIxp7i)8M*! zy!q#b9U8sR_)uq4+SJ~g2N#Vf7;{g~s&S*REA!mc^^g2H`?aTLKJ(qng|E0*t=YJ6 z#}~V5ef9d@Z@(S#uiD+7LT8<a0eTx6ZlPEq{-*QC1gVp5sBRRdKXY_1^q3)hjt_~v zEUYX$cJ+$QE8aR+cC7M3u~$5L`CQrALhtnxETB}_CVU_vWk)N^ui0jaI^jFvC)nU+ zyy4iNN3Z|Rv740@XU|sTdJTJzU$}C#{OpBE-ufF(R+e3}dF!t|b>YI9vZEJ>fA>no z+2f$=a}BT{Gc@y98O!+VippFa%%=5On>S&@)pIA#mQS9A7jt(<(+q>+?cxL}v)9xd z-jZ^7U6aEqsk}#}oZdhMORs$?mP+_~rKsUny|_eNA%1)GEKf%#RFqeiU#@V^z?;C| z7q^OEs`c6@Yv^Ywo#PigI`N=*M5^pEIs6Dqt5n!3UX~<}XiE30U8f7t)hbsLK5+h8 zdF7Sz<4nC?o$l<#Q<hTw)4HT97tUXBd-b!5beP%plG;ZAc==-4F`M_#h8Ip=IA1>A zD;g>*&gah%c3{fu)J>LJ^jE1|f>eldiCUOiN`>vZ1rl=X=FzgsbLHnN%8I>yN!=e4 zy6d*+KG*%C*XvFCSbZaX8-4p@6_v-RVK!2&b$fLGDm!+p{Jh6oUngZ_u<3Otb(Ok5 z)QUx%SCdV?V)5!1Ko2Nx>Dh|&<x(``Iki5GU|&)xuU(PKmUHF8#iL~|uQ)yZF(F+) zO#g^}n|`1Eh~Z7cX2VXy0gGNgMqi+Js5#xs4cZ8!D!sN#KZz%F?P{(b^WrD<Z*pr3 zE<X-?wM-Yj&@a(1mkcXF%Jd|eqW(SoCaUo!Zi-$p097v)P5LjTs*5I;Mwt|8Q-J{! z>T8Bq3@ggi()6(z4F*HJp|K&~;5N)DJ9_3++2x9|^Qx9MtL$A?ouRp5SovkB_ISBV zXJ~KeTSJVG)fgMNy<S$4E2q@V(~;Skvdg~t?IvrhI97J{@|DU9XEb)W$?ny!WDPVM zjm>I(LsH%~O)E9Npk^>cs(Wt6lR}2!mY>Nl!EdbJ6u;N~-u64`cf}|egN=2KiN;R% zmx`DCbjP^vKeOok!u{%~$)ujBM1kOZ9?LcOwef4`cdy?_E*i?4$y-01n#8ZCUq5P+ z4|w4u6N;?7Q0DQ9;bfV91%B`n+%ip4c(6_HSL!#<?^#tz(G|xoT)YBrr9Xf6ilwxX z(eLGxmF4J4`bFGC=h}6C@A(~)oWZr-exLg7^4qtKnbx(hzF=<c+SgL;SDh?7cdkrI z;P7dUN_84b57p=};ldSGO3BKvU3cq@jf~CDmR&ADMYsdD%9j85)EQzWX7BxsPDz0~ zY&zo*qpb$hIHK0k@06w>VLcWIJ&Y@i8;zg%kMw`ue}(@>|NQ~}0SN&Q1gs9&60kSm zMqsPJqChw638li9#x+vqD!5w`qjUX?yN&ydM~r9v2l2+K&F!BH)UT^Cymr)D#w*5~ z)LI|%4m4ZX<sa@J?{D^RiA##E{%~kC^3?xWYNmMAtA8$e^{pDe`KeT%(~?*JO!49d ztKQ$@Ki>Zl#fuvxFJ3C__Lutq^)nYd)5Tc-IsQ+}-8WXsc+&}0X$g|=-svyb|5Sm_ ze~bT4)mS^IW7&sxz5kE?C;YFTJcYh=4i?-n-`ANNFI=fOQBi(e&B0oz3kV5_SAjZk zdgrCs<BIgSl<FOj$(;RkF*2ZIK$@hdSV<|-YSg-_?`%?R2q*|}2h0w5K@G2WTyiCq zD)wrAsn|E*39WIwMru|izHsOQ)&y*n#+LYt<>;96FJ7)V3x}$ICSa#DEX{H00=^F@ zQ{$OYk;=>E)>84wfO9I`+HDBb1%?DR3~Zu;4QnXb8?gP=-1coAePC+fz`)U#>H6ma zy9D-BhNq5F?vE9e3VQ>yB%`=UbBfaXn*(i9o7TQs>A<U6el3_TZVa3jI8*94=V^qY zGJ3^LJ?98L1D6NB6}TzzK;VyoH%taom^{jT1Y4BdNPU|w@Z-Q;8tWdec#q@UTRd&o z1(pS#M-;^<UC4)9gjLh;n_jqDDZ#l?(erxE6MC6aO!t_^o7|?grfsILgYF7S4eAzj zf6(|(FJHP^R%!F5%(m!FJxu*g5Aeb5%DHoxA}lmzmC2rS(fN}VWwKK{E%n*@xdzii zrkSQEOv`zXJt4VMu@QAp(=(<QsDo~nN4UBd;K$_d(TELqX457aFl+otRDs^~o#|*$ z!?NRQ&**N`n@*el3<^J2as2q%a$l=jRCTynaP{JqtCgC8a6TJ*7FL{7Q%uo1Q+<&x zs8`S+J`bvIR&D<-a>u3D_5{f~9qZNwO$aI_TPnStA2gM<l5Po&cbMuP?>$fG9ke3o z<Dk!j_6A4b>VH6RNpNZKOStOavTjp5eb5@L5q$7oinqx(>+$o(`$^s=Z@&BP+Ko7Q zWv|>MyDj>lgF$D5g&N%Osv6Au-OA&aD^6<a+agC792Z=dCO1vVE+x}#k*f=C6Wl=_ z_?l5m1$Pb3pqAPqw^V{v7n~V9M)Gss`b{zR1zUrQWTR~)C6=HuzGe<x@a*6Ps&>;b z>Po}lDajfOuAV<xR(bW@*|Mvi(re!Yzt8b&H-43?J-^Qap-=FI;NOD(3<(OUhgFdW zLf*&v$B~fAkUv5bLx+dvhQ1#9QRvs()XvbhuUAa|PCaiUjWS<{#7Oy`lPtDXu0Eu7 zNNPwHx7Tl|@*!P9x>4mn=9MoM_Js78qMcXzo6)MrvWzoii82TTC{y`wLcAe!LKaGX zw2fMh<5DsgXlzIfc`f8^+13*!{q3^pLOu%FO{LRV|MzMVF()d^&Rn_b@-~c+hK{d7 zPD{z2r5+$%_UyFlLye&kp=LE|yzfw9x_s(F<rOu!R*^2WeP};s?xkXj&@?sZsA~Jo zF>6<x<J}H@==jiyp%1H~qU6TgT(Qj1KOg#7=)%yK6{qp+aoK?MZ%BT1u3H!SR_J@& z4cnz2^Bliq5SxYWko3~(*HaZ&E?ab=2SbmknR$+L?Q2vuvF|LQZ<sMGGOT%6yRh`I zL7KU7H@MqeU09tkGd1rgvTdhoq6eHR*ErsO8f$JLDS2GKc|yN1ci2N=v%@39yM^}; z9~b^q_>1AI!q<oIRs83pyJh?R+TtJfT-fTcPr~+x9Su7bhHIb8r_Nx)tC-R<lxa=a z`)qQOsGzlL=+ZCvy14BZFXAHSg{qG3<=aiTU(7Xx*9~tR-YPtmoBJu*J-3&xwzg^= za(i`xlx)+54-J1nqna$uwN}>xeYh+9;qb>a<581xrLUi0es;0ewFYbEsi_(zx4eKV z>B6^!?^M;}l_t7ByLI8;haas_LyEc8jPE}eJEg@4zlgwydJ)+Xk47wvSP`)<Vhg;$ z7yZ50KC$Q`!Xje%NY?4x(c@6sl3W8`Fx)1hL&Q+7ihE>L+)XwT(KUkkzirG$Zb(Mh zMXQ~=F<ea-yGGa}TyiJw%H&Gxw~v@6U7OeMSaDsWs4nA5#hnq)YwRshqlnHLMYMA3 zBDO~ypb2`Z*e&8KZhY5n@){QocuW`&aVg@r$oR;Hk)0!ZMP^2hinJ=$H>)fc_o^as zp@K`&y^$u#bk{HwyH}ocd`cHEk<BBMWhb5{)w6rKrpy_dQni*6Dx!guCN(dXc=az1 zd_ou)IV*B*<bucpk>?_BMCqeqq8diEj_MrMJt_;0u#0;_F+JB1`C{bq$hRWD;7ac$ zE4>FPJ#u~I2h=gQ`zXDyR_Q%hkq<|f%SFzRirkZW#@X@{xGsAM7yHtjrvUoi9Tlk2 zw@IV#-kO@Vxo}-|YdxiE7E3D^-$u#){}Sr^(x4}VK~WQ<W=1_5wL5xX^y27`ViIF| z#C#X?OUxg!?Ru1oL!+ii?e(iP@a&IzQcCl3jxOrOsL#qOE6c6AsMn*`spfo2@{XE| z>(dwqFoPJFYl!+T>TuMV=nSs7Z_CeL!L{OXer+NyCG|yJj=DkW`;7awS;B$nkm#6b zb9A%l)aWkKV5C_rJ1EWX_i09r15zokNEbcdEAFViRUbV(x+wa|qlLQYG0`@uNeA;p zbitBipDuhK{b2MgwNfXf6t5|ZbYJD`qF;`F11m{qBrW~M=2ODH==UVy$^t|5j_AG7 z2Vxqjtun00+pwua7kw!DxH8J^sVsg}To!#f`nMQkOlVAPsg{RS&vjI)<zY=Nf0k-@ zL^JvDii7Q?;;S+3eFw?VB16oenDH^2VqnDRPSeHyF{5H~rF@1;i4QJ6X_?uuY0Q+E znKAQXUQ}y8R`Ok|D=%C<uem6j>e0o#8ndqA%GnF5@HC9FSblq|f-)-AFOB(B8YAba z!*5%~w#PbjG37Bg*l=4ao{qufpD(DMWfxGh-1=B!Y{S@Q<U*zk2V)~*Ye{YPhot2j z+?hDovWy(&(Z${!+fyyn!*r!HL-;N>Gj>#Lo>cGt$~azspp@9v!E=PcvD0Jc#x9Iq z8oNLCSnRbpog|(mdz>Ab%bejheeBBEcVjh+OAR#ROW&I2^sg7_Vt<JJ3F}6$voYm0 zd#Qd|Y{m6T)k-ooojTF2iwlUW1))`Op=y<!yxz_sGlU^=E#gw*y2|DIToXA-s@Q~~ zbA_RC*>RKNUXS}B?nK<hxU2C|@eSfzT6A%?IH#I(e?Guu<r?Bj<L1OY9rrx%t0QD5 zH(VNIztDQL;Z|MTTX7qdS!6hTa@>}<&t(TULK;)<kJ~GcDWkPhl)=h;u<j{`SN}>y zu`cdbyx&P)`fImnE}$&+Mryp@1Dd)fGwIUnuK0Ep-2Sbly3+XWm#<zdudKM>^6EBZ zJ}zX&=hu#?-J$k|+CSC)wN6$Yd!3Rxv+F$7(->b8|84xGS_5iLs`XQ1VEkk8PscwW z|4RJo_;v9g#BYoLa^2dsYZJXqg5Tvd`aMp=*K->GKBrwaaN24kr>UDbt@{C|2}%0+ zAL7g6D{xBb2~xT`Dcq7A_<z_s&VZ(_Zn#Nswc5H-_6jl+_7d4sK$a*V5+IPUWhkJ+ z3rj>qwu+;+);em3t5$1UJJb%X*3nj5+ag4uvSc}Hzw^e;OZ5BE8s59-j&tul`<$o6 z*Lq!Rj+Ty=iI$a?gVtg#Kc;Om({?#ChZtrKDa;%qm^s8Ub6Ca9A%U4gyd6&~R%^9Z zx>hdJB9UpanrRWo%p%%;s@7JmHmyBc2edxWI;Hiw)&;FATDO>a$e4MgG4n`b=CO>K zM;0@WbY>JOGfFBmii8<ur2}89PwS!9lLZ<JrZ9c4VET?^`i^4y&Sd(|5Tgb27Fd$U zRIU-XKwsrDrVb4EF{JA66#fFA1<4CC7ql!mOrGEhjid!(3*uB-r!j}?UwpC?dmo7_ zG`1}$T0pSZ?6+6h*&UKkE!eeSAIYb_!}526%6&j!l`BLGzF2SxUw|a$0wgc^S!D`R z30ly#U`T~vgtAtxG%0_f=0d}T!i8=N1I1|JYYXSG*EE2gp;=e2ip08zm00hoK0gZv z0<5<7%h1BOg-JaFAVThc%t#p$m78QYbbm};>$YU*NWoZNkJ4y+CweO<dg0lHUoO0$ zJxN<%J4w4m`<V9U+TUwW=xFL#cY>JlF6D(tOW`fNy6~5Ue=U4UQ<GGT^JEg23wsv! zleqj|O=QYbL8wMDiBRns+Ve3&GZ>L6OTyDO*LKhj(vD<NV)%cwj-%LGC>tA95v5K_ zx!O|g9PL^K>1x@Li?j>1OGtOi(UBZE=TB{dS@;VubTgPrmLct(+VA$mAQTOrc%dpC zhpSMh92K0}L)TZe@333wGAQ9{cWM8lJ$%296pzl0_7xKvRb!8G35|mz3gBnp%X<tA zA13o*0as_b&H^2Q%FInwjgix6Zcw-m>DcRdD*Banw9Fx9*5a53PK=IBXT46P&P826 z-B{g=y1(e&)0?BGtJk2{ruRF==H#3^It9#<pEA~ktQ4-!7M*6DbM)TbAh%4XL+34W z%YLAbe+B1voufJ@nLSy{bnr|mcNwK}b$-%O=(>U2rE^Q?F2kqu7`baUBX`ws{?K`* z%hjExYp83kYsa+umFYG=1?j%2JD;A#ZDrrXbSE0WW6|LjGyHR<u+~jAk#lbAhBNP; zNRjR;-S=~mZi;TUQV_dO3SuAWZqTjL-KM);7dyCm;mR^|U<T9uM@10pX9Tf96+uj{ zk*E6^dmzEnsK&zPsu+%ovypDE-c&{~%g`Ou{f`A4WM!06R(^88F3fz|z+BBepeNFE z(2LV6(W?;=-0Nbb=cX3{G?FqWjy@T<Hw3;~%2jg%+dhxsuI1eK_0q}psI|MPe3Atn zGBR8P=`tlWatgS5d-RU#olv*EOs5ZF(b!05Ur%o#()&{H2X-kRzO3PYOyR9UL#o%K zH^c~8#SEScm)CNZ>rd04t*@u=uJ5BCt{<<Tf(4u(+5IS!Abk^kAv?-U6%8nizC6cO zZlR-!8!nJJ3u~GE+YnpBiPc}PU#Z`r|F!-P`oA!9s(^7*kbb>>6M5n<V}f6piuCvC zAHlXD-726^`p5LoVhUBmETxtauL+fDI59)7TT#PVp+Bhq$Y7>{o`I2p4PN3E==@)U zNy^UaS<8Bzs^GL3q{zK09Xm4}7q8sHS!obqP-w8l;B$j+gMNd54b2Sg4c!fW#mFGm zKuYmX&Rv5f2H;;68(K28V1tbY736|{!V6xTiVT_z4lr|)YZM#oVSxXGr5hYIIE9zq zz$|?Xys-w~8eCJcc36zR%1|FO7#bn>ORjOkV4N}kO~|;0e8V>kRh*uF>{d@wCA*O- zNN{1MRl;oS<M9Gy7-G2QUSB#gj517QyU6H!#nY74-#0eaFF}SI3^%b2(_U>TjjQFv z8GdMZ(Qwpgx>1DD2S#U%E{KugNy9H$BJW6x(<Ld$@Ur1ul61*6HX1S%YT`fgU>Pb5 z{~_^wmBF)aBk;NkjrE5A8fh{J)mYCUv{}M6nrmcWw3MCMyi{Z)Fmip>WwnFeC>1^Y zPm;y8_eyw12}bEg>x?ScdAh!2t5q>W&xHYMjdr~{K>I5L{Gr18T2(g0wE!9YXau1k zWQa^DV;(&v-pdgiFEH&8@C3esD#5pAJTqUjGP5rh`7gR{zS(@h;!V+ck;0Z^+i5q+ zKFR)&!+M7*N51pxE?gH|m+xJE71aqejBSncjXR9*m@F`fGwCq7W4gdJPFN=}Fb*~j zGmbP~ZX9QvXq;@EW}IQ1BP0ZgB0?axB?QTKgdoM95TrT~f;Suqfy9Xrq&X9UbQi)j zNmOIH(73|5#<<S7!MNGDT}YTpM1*OYEn%7h?WRDx$u5Lol5L%-uJLi>PmIqRe_{N! z@kQewjDIq|Zv2aoFisK?#xRaCjAIPr7{fTm5=X)~&51BhcP5ObE`+hnu1@fp@rdz+ z@l)d$Cdfq7WU9$@lbI%SVV-MYp6g(q#W2qjm}e=>b3M#+1B|~B#xH~M%kAp~ubbGK zIGVVcc$j#b_?rZqgqcK|EC+Z3;N<{c0q~UoUj^{h0AB;}n*hER;5R$e38tImo2)e{ zH7PTxFsU)AGifksHi7jD>HvNVz}Ex(R)B8+_-z2+2=Gk+-wg0Aj&*_=CdW-aF*$4U zg~`_@7fpUJ`N`zE39MhxDk2P;0e-(7VbE$%7_<TWPJrJ9@Vfzi55VtrsuR3vGGa1e z^3>#oDKgbGooYJWbfzh}{<mQKeE|P9jQ<Xd|1Q8E0QmO+{vf~~0{Fwub%L3uwx*7z zuBINQ-lqPh!KPuRk*4JO-v{^)0RAI@KMwFG0R9xfe+uwt0sb?9Kj%^>m}Q!8y4JMR zw9K@^w8pf~w86C5lwAMk0RIKRcL4kmfd2&G&j9=mfIkWFrvd(`ZJhv_9yk5lwA-}T zwBK~tbj<Xz>2m=`xJfYE^jp*KOfQ>WGrej0o9Q3W<A>1WG3b#CJuZVDBcaC}=rIqT z&w=N2;rTpxJ|CWI!Se+$(n1(X8%8pOlfn~d3-krX0yBZ7Kq#;mI1Ahbp3tumz#9X+ z3Ba2Iyug7l<pca8fHwzt3xKz@uQQ!4NDw3mQUy{$mLN}1C@2<e5D)-w1@P7YZv*f` zfEU5|wg7Jj@b&=j0Pv1*QZxm-1^Wc=3JwX53O*K`6nrW;CpZuAP5|!=@Gb!F3h-_K z?+);b0p0`PmjJvcoD?0wAA-LH-GW|0zhGD}CU`7(ZpHz4FM#(3cprfG1$aMz_Xqd@ zfDZ)tAb<~slcH;;ZKiK#Y-VO=X(lwYH*+>~HzU^{0$#?e03Qlo#(e-E4)76<gvoIy z!sMJYVR8}RmpgA3=$XZtC7LChrI}@z<(TE0tu-qJ$X@|+1&q8BAmacs7e-zKBj>}& z1pq09Goo+SZq{M8*X$j$_sou%eQ0*v>=U!IFtQA0o(1sP0G|QynE+o1@I?S05AX>9 zze+sG>?gC|%>FXFZ}#7!8H*O&Q-G(iUq(!+p%??Fvs*DCCZ=fi6d|(#vx$E?M>@x3 z#MGLRf$;~u@I!N;6Qrr0as0Q($T)V%a3_WyDf&T8%i%6EUu3_?P1*Msbf+FY<G8;s zl6i}kEh<@5v8bLT^nIOUeM32D(dtFud>DDavVqm4)<;9<;h9zs4G#?r-OnXN3rIU| zjRtqoTZ;}ZI=<-hMHd$R%*aR|u?&e+a2a-Wnqln6NLiBM=_eSbd@6;vsB6(b<}T*t zv_$_C$qW~bEP6yT!)r7%tmfP^pK3nST*utRT*M4@fbIVSrvHN~{U2ufe;*74)tr;& zLFUos67wwcB63cTx(1R7?z|La9%sIq{HZZS{hwZPG&C3(N+r-$5O)<+Q!k~OAx!0) zx0%0X{(<=k^IJ+omqvHz19o@TP@BnTB%}&XxA|A*ms!l*z#7V5ATOE!VcyN4>23VH z6Ks_C%^#WnX8{o+q?<$I-v>h@3W$&qEyHcP?)S+wEetFitR}3UTTc_^3Xz4t!usRm zA3GEJb3Q$DQbg##drZi+@UU8L1%@n(NQ*R!cP;K&>RTpS?zX&RHDAQFh_gtvNOmH4 zZ#WaYH(dzcOxvjz8!QNmDvMf+dW%MjR*M}LyDjz!3EnIb!JBPM@aEVNJPmt-H`jsS z&2uDp^8s25pcer2Lc6IJXDz<4_}b#4#Sa!gSzNdH#o~^|p8%~5&^iFE3($H1tq;%! z0Bs1+MgVOL&?fd%EgoAux8zvzEGJvOX8DHYY|HtU+5l||&;o!q1L#EnZ4S^D0Bs4- zRsd}c&^8WJEgdagEj=u~E&VNnEyFA$Etgxy0dylkBY*~q%i{qwAD}e>dJ;fS2IwgO zJ=JllWuaxU<pxW_vdXg7vfi@Mvej}2Ku-hc*8qCD9Wn8(Juz_spoIV}0%%)+wgYH; zr>U05EkCh5Yx#xc*OnJ8f3W<?^13DPKb`|XM*y@VjO_$tI|H-}K)V988$i1Q^kV0! zmcy1~mX9r;TXC#-R+Ft>vwFj7Hb8p-^b&yf1ZXdS_6BGlfc6DwKY;cJ=m3|gR@PRw zR*qJ#RvuQ~R{mDOR$*3=038U>K>!^L&>;Z56re)^It-x00lEpGBSk!`B&)qv`>j3~ zPPJNVRccjcRbf?QRcF;;)oj&n)dBrPK|j&ZPYm?49QuicepWy~E1{n_=qDcfNjL@# z6YY6cA6Ol;I%RbRn#_PE<k12W$}4o?TYYbJ#p-9PTUNJiiHVEQ)oSP}1=<xryCP>~ z)n)b24q5eC4Ty+|OVH-Klknp9@iQ)j{`3<<WX-jnBqa1_z^Q)yl+z?@ZR=#4{WinG z3nD|2%nn%_S__?#wVAc0h|tV%CNy7jnQZNC?Qb1y9cCSAz1%v^I?<NUOtK?1#rA|| zvIC)+;z($wIuV)@Xr1OlXr|jwvd*_|w!UUF-NxD`&1SEVZ(U|xVO?WgXWbwqG^Nn9 z4B!_6j2^T%5KXl{WPQ~7W9yUFpIV=@K5zZ4^>@~np`{_TG=kBLp|uH&W(uPTU^Fv; zTm++;1GI(hRO|cJ|5y)Nk62GwKec{ggKRWyrUEp%0xN*F251|A76P;gplt!#4xsG; z+QE)*v%p5z#?Z#p#vEWA0mcbnoB_rKU|j8|*m&Fc+XUN$*+kkbw~4b!v`L0`p3u$< z+Id4eA86+befvS*{?KnA^c&<b#irDz%%;Mo#-`4u!KT@!-3HEpW-!2o0Nhf53kA3^ zfC~q>WiY1*fQ>v2jRG9FHt*Z~X!AhGw>fR|na!6r-`HG&hVMedGH6%>4R^pGABp%j zzuNq6^OsGRO%HTj0v*>v$4$`jS$Kc_1pK(=I0^DA`NFBf8A1nPf$-P~M?(L|Ne6=e z#VKck|Ba)jP)BGWG!ZTmS_wt=1pgYm`q`1-Uw0z-H=xB$7lMDwX{s<p7%q$w#tP$w ztA#1TbYZ42S4i-G5fOY~`uyMQ2>xw=z5~#|1N0vNeHWnr1n9q<rwTU<w+fqtZNi<x zJ;Jwz2ZV=(9{}{<0Nn}D_W-&Jpt}KD0nqmWx(A?p0lLqHD?B6oT=*5V|Hqzq21M(b zg%eMBRd`qUP&gq(!dt@ILgHBnJl7L(g$iMxZ~*!khCUubA0x-@h-VHilSG=LsiNtk znWDL(1tOrI{F5-?DH!k*X#5#8{uCO69LoRLnJY3EEf>WLCy87|9wKj%zbIG~CIVW( zKMoTHsgn;;S^Td7{wshz1F+{#0O05LNF)}4YQz5$nw&p#+=W2r9J!)(qT`}7BA!St zY7%W19koTGO`>{`dJXuWx)27lPMoqO4CbD4;)?c(-W46PBlIop34JRELf`t6PvF;U zCyspryPkdW%n2s~eV&d)7e!a7&|l8qMM!i*^aqwos<BkVmm<*v(Rd$7I-P@JLg>wk z3;Si0Y~Qe51m75Ow~eut*q%y8wsURuuyE3-6i#$$9{z@kh4dCkRkl91OYwM(csz&| zR+Fj%bNIGvY)frxZFkrn1QF~W#5ilZ-0vIg>}URZ@k8HW-&h~}_m2Z$!e;-xtY+R* z5zTBb*j}~$MJbwnN6#{l70tfOM7BM)|8<T*%=w^LE_}y!w70YW{-eI`F)8ui8ixIc zXL0Rj*az4zlOVe}_TFi={A+fL>}>74?85C1*?nSfVsD4%E$Hs-QH=KXDnQa(M?4d% zEu%q->|*Tpbq+igBfCVqa!M#ec2c`F7~Dv$eHA65AiK?W5CKQy#YC+^Ej<kXT7M^C z1P>ZM0NsCX*V*0O$&B!W-3{D<p;`wO4@SpF#5}tpyT|sL_H%KgAhkxrFJXUF9s6U$ zfIj7ltsi#6{*L0g*bGYv1BZSE#Dr!MhD)h5kz@8N7>nl7Y@U6FeZKuh`?na+vj%Ht z^#aG?Xy;&R1;^BWi~V*Li-sm+Vlu_j_}4i+`{VYXJ2*Lb-BX@P!*rhgCHw34e>>Q) z4~-$cVDLfjIHVlNi0N_tl1f8;`v(sC4uX3lom~$Ug~<Mq!!$AqL@u1{z#$J7g!yL? zFP4muR#mxhio+cCp(hnCVzh{QM;MutMpg(huoxOs^eg(n-m|F)IRrRFb$5=9G0H~d z=tSp;nCr0GLFSOBJed{r$wchQtiV=gejeAM-r-$`uf@or*<o+z*brVdX9U8Wjdu@` zqYn2<ki#(t@Dkvpm^ez9K9`3azH_(&QvKuqMsktEO@}`^yLuG`gyFJc<Z#bng4!9m zVW30*&<J>`dL)ElB>W2tc*1O&Up~)qhNHQowPSpzLW~^eIT|RiVBCOzY)v7IX3CJG zy`wh-mXmjgGFIz$45n9b6pkT|5FSp+)Xx~PTVrHs-DJmH$F+`+oLrnTo!)Ue<IKA^ z1lP`>HI?gF=6JyICWIaE9P1pL9CtYG>mGUpq3T@}!VUhW5pHmAJdZHwyqCpyJnneL z@x0?D$E$P~H|gd#=;qg$=GV#QKSM{A1}%<%JN7sZ(eHOM?{_?c2tf&9&?iNX|2hd3 zovA#hDNeJTbeznfzd;J27XW08`t>ylMgRO}e3*LlE#UB}qL_HxLv~zg(CFmv6zi1I zeJ@LHaLp-<vcW_DSBBsSF=Jk2#sqx9`KmH#c3SVW$!VKY2gD`f_E&oqof9Qsv?1Z> zDSyj=^^SEWBc~%y$LPo1Os|UZyefkxr;ASaoW`7<ry{4zPQT^I4ceTp-y4Mq9D>zA z3?cc8gp(VzJ3Sb>Pvh(Y)5UgXgdXy^lWV$Pz<1VimN+*%E1ZW?kh7k1RG$nvn>sHh z?dIdza!#VNNadD#P`aR;Q|26?@-%UzZ@5s7BAgSL05B9uS|*Wmj&n(`k_UM`P?F@g zooiG`ayrB;^%WrJ-Oinvl^k>D_ng0WzAZ-1N1f01lX@ejVA%}4%+5y6-#P!(3Fpdi z9!p!8aJCoXY(n3AoQY7F=zB6SJO(ytNHkKOexJfBj;G5Em$@#6F6LAkAg4=ZIr=my zdXY&-v!P{0nl7F$D_xRYN?f+O>`6v0{x0E|U$!b~lRkalX9JIPNq5P^JhBz@$l3h> zGuBJm2b478*O&O_Qq~0F@`1}~7f4EB%o~^K-j}k}<njdM`gHa(G-z=Na=Gi$r;<S@ z?#rp*-*Xvp)##+qh{?A;^Mijcxsj9XYVCT;^}Or%uJ_!hxd*v7djxt!dz5=@@@Vp$ z;RyyY@g!Fd*Fe`K*K}9Hb%*PI<%EuQJs73p5IG61(JI(;rzdI&XmHJOU5C+d6r;gX zid<`48<oc*Z;YnfOYrd^gxB)roDHsrRXR;zsXZTibigc9h+Kbmy@Q=3T!swsC7Q0o zZhSXww<B(++`b~&=xE>LF$Dz2^$r3VFCa{_Qjps;x0#*ea9<1^lqLz0l<#KdCURTi zw#sb>K6YkmjI&XO-2B|4)n%6^EN7JrNRV5q+Zt6#rdcrnFePraYB0~=8Xf8fk_>qZ zloarM^5D?Wpz2W1vssMXR*Ae!F0A7J>~_Vi({0@C1*Bgbce|nHXS_y<D^mG0ky}6B za}nP2pGP|HEAZ2$Qsn-oyN{UbuH|mzZm!(g59lqlf-Q6xxx3;m`~YvE73o4pQ8K=J zjC+!MrhAF|Cia>au(Q6=4@>Lp@9OXCg7!PW^~zdy5Nmf6WpUj*Je)kd#mIf1hizA; zru#?kpSs^&oWJ<+;=9atn_Nvr?q9fH>g$AKkqTx=Aa}z<eS>3taH&Qhld%W*p~<-{ z<leP7Sc2U97QcRfjA@XL+#fGS)E|m`!sJ`F{ds`z8V8vaOA3n(7K3C%N(yf*HfMzb zH;RDDg>Noi!aj5db74MO9JM$ZAja5EyU4~Wf8T>f#fvKyU1Q8FkCN||b6ecHc&~D9 zXW4E(Dc~+Xw)pDeU$fET(~G|W`o#zdCP(_fE!1<LOujXBqcd|%_KiUThbe!2I1epW zcuXTF*1!0f`ot(sqB1cBjlXo{G0#Il61{$Q^pot*<Aa%mu@RdqJ81~E)1+4AdV1$_ zJrX=*9)<ThLC)x-FZ2TTOl)A!#2>?*l!&wEAr^VQ$>(|OTGF=UPftF?CwsiJ#96}i zIO6e<$0*66#>m~M=B)QP?{UH7caJWQ-g||_<I!y7@uSDJzElFDZIp?~@eJXPAIl>i zKV&z`iQ2tt&c-GDB~zE^FELwUMRxKc8!dTb$sDqif7wn}F`XokoltRdw6N&>00hY; zo=Y;w2~~08mxM2gUb1qDgzRaUoGI9Jl{0Z8fd{E!t2nEclrAY>QnjR!Z2F9B`c$Rq zVzTKIume}3-<G_+<mi&)BpIXas@9arR1*i^ahH6x<nog1?0XyP{hQrG<M;Y$^QyS7 zyGMeS^eh=+TbV0kC6pbzLdGpf3;6`+y#nMp$5V%KAreZy`43L}tSsVsI(zzfhOyhZ zmfg-@fX#cxcorxMEA$OL6FsHWSU^=xej5T743cd=VW>5#cmhv;O4-Iq@!aht^D6W@ z>2<?f=<}=ZB|i(lguv*)gut}G{J<9R6wi-6Kl8lcdD-)ZXTRr!m$?_HVOadlQBtT5 zTJW4i6RHJ3s66j@c40!*feF<Dd}Zuv2fIl+JJ?;s^P226(`&w$p0YDJg~d1MzBE_{ zD<2+(INVIa;GcZ1mz$TDSG-~<4U~3>eM6VLg1ur`6kAeVyasfr2jZ_m3Ie(I6w9;b zr|`VWysEu+czsBl=3l47wd5T5lr&?7pF&#ez4mz>Ag%S+afrZ_@sTV7#iSyyvtB=t zdEe8#zQR82Y4`>~9<JAIuRbc1T+aE_tBabAU=WV!J6;ps)4dmXo5+yYb8j993{dpI zfIE1f4&a>lOXVc~J=EVlI!5NoK6*zP;yLlRl<)2Cz23XV$HS*X%=7m5j_{86PG)zd zM2W~<Gzu5Oc6iIY^YM1<!rQTs#mH=lrgy9NA@B1(JfAmwO#V;q+UF_A`$O+f9)P@* zNeE^sd2~Q3^1kQ|)e)HFbnhG9J^u&%OV&$p`W3hOxJrOv!T(E6r>qa8%t(prDi)A4 z5H)<s$5%1lCFS`<_!Rn7`qYb&PpnTG#iy_mWxI|fbAyZ~Wjjy(r3`CW!D_9h<RYJa zKG(aXT%W@}U;2FCnS*>j_W2ZKMpCbxO8+yN<agAADMJeS$7^IjTdfTF-1YTQjHmE@ z9{5i8)$uj;wTGEK^yR1zzE*9_x#};acxHiWttOAF{izKn)i>DpaKEI=<VW9F-(=r( z-|~TR2-_O&FCh%K4;2!IJM)llwr@fIIH;v<pw4#oQyVFCeAG84MZUGZJ4oI{Y6189 zJ4t>*DRin2ex~n01-j__iSJkJU9+N2H_GDrUiH1@H%$Rl%t!zd2G6(Cx8HZ%_rFdE z)&toJ@)^JG2AK~ueU0;^s5L_V`U(dELTKPO<H>T<6u+6H<9&t5Z=s(NJr&awT1_%d z&*u8s`FZ(42=_gZA(<T5cUdy;Lp@_(?aQ6)m*ZFBcg?>&;6%Xnz{P?7>^+e~;&LU& z)vwxbuivo&@D}=Q^=ng%b&iw}`fuY}8Vd@L-@ATCzy}Ersql^$F*GLzDJ38Io%e$b z;QsrRX8JSr|7+RE?-&1V1L7KvrC*P~z~9#2!#}~lK+N?U@}J`WCRy$T`91b~L7{CH zC7Vz`=g{>DCceo>{`35GX<O85nAWc9Q_=`h;==QLjm$tKGnbKni2riZ6h-r$+0<M< zFF^ju{xW*r%apw29<3H4|1$s0EXYg><g?+<Q4q-8bCCaT{{uZE<771tL%%}g|Gxhj zNK*z0PXSa53{BP}Ls<<*T>szwJN<|K{|m4PSP_sGkQtB{P!zB}fCxAo@ZneAgb*A} zZ{*+O-+y5#!I>0Aa3=d8{|WzRUxg8z`H=+Ybzg44qyU2eQy*Tyn*nnIv;uTQ1m{g# zf-}>O;LNfoII~H}^2>e%=M6u8fKz~5fM<YTKyWC*(fTQZ;P9_T6CB<RAA++m8U-v1 zi1sEp^HvZXu0IM$3`q7TIIqE|+Lz#eI^RLlDVO2V)SteBna#Nl4|SvX0rdfm0UZHv z1-u(XaAt(dInx8$p(VNr-Duo`{ubPZ+0MNMt@VC^7t@A;`jM6@&f$PB3sAs?fFC;t z3y8-+*ZR_kiQD-o;I}|aNCCl8Y(P)o6jDs75WW^L67WJr*G^`oA}^}X3gPR4a{>)i znxwEzyoZN?h4&2&;<I0le_Vn_4|?!l7fJE}cB{Q3<4+ZRWXk(HKsXg+V3h*r@AmP0 z6j&0trN0CP5`i^f{v!;pl5)XMKq9+J2+q4t@_B)K1K$h$An?@JRBF@2&ljQW4l!|^ zbgoN?iJN2<9%ABFYBMJ_usb*>q$cF+rTL-0p%r0nVS!;0VVPl7VOztmh5r`b75-@1 zEb+9!=RuQ#-V9n9v?FML(1$^z!J=TN;28EcrYgDCd#U^&ogmX7%OKaFV65~xQjTX+ zRekKm7cbdNzf`xGo=@iniG%Wk2n8hP@y`Xxu+DX^N0Ber*AFTMn-QUJP=tbNg0^Ai z_#S4CrmTFG#L8Fav$#Q@1brE#G=kWGq{Y7x^j**&Sk1Ewx`7osJ3QnKwTT~rG<|N+ zzrmWpGx7SuLBv%42E9a#f)@raQZu(KWy~#02O%?ZO6o`tv{@1yh=({x(Qn3BeGqE9 z3=b;C!JL6Z=P4nCSDnlaUK>&nvN3B)a9wb72sdO}$ifiQ5a$s8kcdlk{gNBd@s8l1 zL4$+dXoGF=q2P1m0hSA=1|MV3<6`<62&V;KWFLCuqu^hI`@4Ey6>}}XAc=y<f=NB7 zkTAGOffEMTyE~~hNr14B8T-G4%%Lda43^kf0)9ZrlF0Svh1gOr?I=SXXhGCpONPO+ zs-P&?Sv(aKk{FUo3f1~^$*?_^(oI*|h^F8h^IZxrq%mZB$i9%zXo+wJ6Tq+gCMgGo z918h>lml;2JP;?E&Y~;KyqU@ixx7?osbFcGm>2R($loD7OF7Ep{5CCw8GsNLG8pm* zpR>2|IWx#YOEs6yz?)yIdQzTk?#A|{gkCXssc@<5QZHrC@6bIPLeEPBmqy^8-@!c_ zf<0!bcxeVBpXyE{c{Y^adR;PkY1Ps*OV2O8y|ioTVCcfoB`IiW-O`UhSL`2E0PP^v z1hjPb(gS!_nWUe9tOKQ)sTBO|A>LX-a6aypp{19WUc=|`18jRqS7sJNXbkQAA%vG; zwPT^v6k`&!^m!<kItNA;^f@pxg_=9ulc6(l+UnN9p#gAFjSY>!KjWiddK?@dpp+QU zrWiZi<EK&ry(>kb!J!+(+|bC-gwPb_%Y!tA1c0H?jL-s%p@SGh0?Kd_E7J^Z4E-wf z->}JHv%+-5D6~EFX#bP3KA1Le+5$PZI`lp2l#xlcsdCe_&{H6yj4@J4GH4i38myXg zDD-CNAE7;=1EJ%z4lzLm_S34PG1b9j>Vy*$zcJ34YL>_(vq<`SYz)!_LCh9%CuAth zILrpBm~bA2S%B<jG)j_x($Gg3&QZ<Pj(h-aHBcr@TCz}BY*;dDADDp;`SxrSwkE8E zaRa@{N)f(;_bAQEq$+o6*#5AO!p?+!8+J8(UbuF+AiN{|BqZQ~dxes6r*|tJ(7$H0 zbC<Dm|GppOqAHGY*q>p2VdLQ(R%}r<>GD|B#<&25Ylgp0%P2CXjM5EZ`1<d&Mk&)m z&2Wcs|L}zH^zcpL4fL6oqub%06k;b)@@NVQj|g8*20R&2VNXWvyny74!bo}W5d=a* zlp&w^BD|DVCa4&CR0X6GP<jC@fRqRhh`dZ{@lS@jN#7fo@ASgo$8=rq5n0qF6NP^n z{sSur>r&+B7Q=hrVpX;Wg($o)e5kVzRLA8^-Lm>36#nnB$t(^f>|8IDR%whb(_3b? z%xzf`Wh|BuXnzV?X1&aTrcM_rHS~Z4E%RCy^MAB0O!T4dUW{rM&1%VZj%3+e%Z@L* z8F4n^aimtHNu+z^nyAj`h0*fp@t6%UmtyWOH(tInc7E)h*kiGGS2&B&vIEPG(!qRv zBY-1QuVn7Bv&+6&b_L(TZAyBoO^F8@b5i)r{*G7_;S>=Y@iBC8Kf(y~eKB|0!)1>n zxb&rbomK3&Dy{4&;?0Qp^m{+{{RN0BCo~pP6q&9zNa*TFQN-eiKvsZ|JW<QxhgxMR zC}MR)DoM6)(yB`h=bwm@2zkWjh}MYR5r-H>|4W7}YO!H=m*{J%`;|)A-8W3w-3289 zj85f6d>ipo#Lb95mEm%HN=})<1jrE_s=U;^h@J>2%}13V)0oE$cSeFDUPMk|EwD3Q z@;wCHXH{n3bQEb3X-fwg^eUqsw@G=C{*e)p36W_mBGOr{UPo!w4`c%lK9lhx*GJYw zosR-X9*%s}197&2;~aS?@>t|&k+&oNj?#?Mi&`3$6IB{j9ra$+hf!xRFOVw9>mYqo z<i_cd7il|_0-VXCqm&pdXrlKqN1@0;k-d=*nQLXdCJ#kEihMy!sMVz1Bb6}T2_!n| z^{Ba+L=R#Tog+n2CQ(boD9R$ru?r$OX}w4~*z>e^sE81nksgG53UDf<5~i6l6crhj z+N~IZ4IJ+6>!R<XtpMvz`l?pa`79A~&O=dKq96i*l$zIru{LUF)LYcVw$W@4ClRhw z-fI0~nhdT`Pkfs6O1_086GinzvGEUwqEzD_3Ug63KYI2ctc*Phg>*<{bQU+-DB3zY zlRXG-5)^G8?FL#QXl0Wp6gk{zzv!@NW#&*u9*T~Rj;9w=#vr$u$&f4U?}K!z0=d3v z^ja(=5r%`={OGOGhoetMe;0j&Nz$4Xy)*i4=6=j$F2fvl7Vh0-!3+J_(Vr{3c_Cui zi62bjcJu&Q(GZNcs^PcsV^2mEFmry6W(+rGdW=?#UyLNCkUfV+>>!I%QH)-UEj7}t z7y&zy?W>s@`_n5lLSjN=R<J#psM5Uy<V9w?{*JDcsgH8GF;y}3F>OpW94%~aiGt+( z3KSpnR?MNU{von380x^9b_Gg^IUREzKTo9j$ErLOb0y{`jre^`RkTwve=>~zgNH>Z zW?;EiXI2Ggam>VWq@u&?6rkmkm&5gk<dGL?m;>r>=$q&S7bQ3q48{4}<(A8xmV2|y zGi6uf$(R7-XvOj{_Hk%|=JNFA`O9mT{~F7SRY|P(`aj8|?@Oyt<?`m`JC}dD{8AUi zU229#3eobnmqXDiGJ<<LCelp!v_FH7?*5^nJVN6LDP(|-3EM=WtD0O6TK@O)2P}&V zz${KKJh=R^ii(>tMukJ95(d_I`4jzx{8-~yk67>6sMt2B_jWqgGS*RPdX_SH{ZLA9 zm@03d$A&PZb>U!V@0geyyE?W!w)Xze_yZ}5mBr>`3AIU8Q)>GEPnp6gcZ*Q${@A1V zScs|WaTpOf+}N*Te~bnDKO>7?qA?Y~a;{6oD7I^bWmkV^b`{4Ub|m)S74ugZv$Q%P z6|LZ|m`v)S;Jt!;+_zV}LHj!%y{&RWG?-@weWPPwLF*&UFWjfnO4Pi<XT|ar;uN$Z zXvH#GGyoe7h#4))ozOTlMhYGpXVdCAX)CH${Ia5R#Xl=1R<2r^9bXh*5x;wt!Ky`K z-in45Z7cSzc%NQEB1?-Bd%-HutLOuLZORxZAuCR;_+rHmm=1@j=&fO(x8mm^>`9%B z3I8o%uviz-lW<qOSh;lNaw%`+<du3WtyV4ubK1%oE9cVm-3!~jYE<>17uR1>`ERJJ z{5O><hXRftc;h_NDxPsxN><8b#4~Od@r);{eWtNezVh(OlPiCS^Nov%TNRgaA6(Hn zXyulbt$3z6d1z(F%D3suT)|M$cEAa^he7bxpV{9J7Ppn3ul(lTP%&Y$Z$!~mNSGWQ z?9Ae?{B7lbac{&K#EBksrd9Coth~2!0$T=LR}Nqa(iI=OI|GVrIsb0lB>dp+;CPOl z|5x06{NS%)iJadRXNLdo8XN8GmdW{wI5+$V?i{ELpbCS|tpH~a`W}MANEgrdO7$Nk z!GZ}%1IHn5OI&N*-nesd-^5*syC1I+ZxnA6?;0N;pAw&gcTb``(ho3;PmMeLDvNKR zPfMnPbfESY5C*G&jmO=LyNlWQ1I)%Vd&MYjAnq~C!6lf3gDWI{QoPnHOxsw=w5wIF z!W@=qJLI8w&-eg(mx_UD$A`s7Q%t*_X4>Nn-z#L9b`j0AW3uGWQ2crbB?7^+IUB{- z#<#Hi%O5LDJ9ByQ@5P^s|1SROeKCsvApR7DERe>3J^CM=L8ukLJPIEn>9-+gJimcs zA3q%bB!Qb?kYJYJm5`87mQa_lC*e@S_X$5I{DG0oTD<<jNKQ$Z{wk8U(n!t#)F#*@ zIAhfQgHf9Ss7(k=h+<KjicxDULkY<Vg|DF2NQv4i71YjtRl9z~V%t6sC4880ipKUj zz;?p9gs&-VZ=tabF3SP3)M){W?ZQHoaBtOQ@_HrwlQ4>}S2lF@WEF?*O3qxbHYr*) zebp=yyU}WA`A0^fdV55SRtZ-*caf<*gud@!3ZcJ0y^)i?N}Ons=$%-e*tps&$u((P z(r)o|u|Vu2UYTr|?3}z;JY`kUs`6DetG2GXvg-b-hpV0^>M9TTcG`0}P9u3<8gJG1 zRr^+bxateMO&_Tepl2=W1n60-8UcFN2Aj0%<|^g+-;OtF9?J!nVlGGskAfkvf_oxS zGjSF;MEVA4GLKS}7({=o*6)0fj1onOZc3s3bs+MPLZg?$OI(^5m6(v2PqTm?#&)G) zL@GgvsfjXD3Hk;5Fm+VxP8dPdj$FeaaTC^03?!O~dlL^Qo=p5Q@%n0KR-Uk9mk`M= z;rP%1RB})Y=ZeVZCf->+ZS@>5ymAw}6Gs!DQ=N}ta<v=(7#$dY*xiYVB7YBDCJ4zZ zAUJ=4i2S548?Dw~ZKDpm7sEodCv78{CFQRUU41?2%_Q?Ap_sQicC~nQ@#-e!4(~`s ztJ7BlYA{R5r{tOWuvM$eSJ&eEv;%L|{JtFC>fNgktUj^&8+-^{RS&_7pVSY*i>qpf z;KelwclDjsLrI+fR~xDAWe;Y{%k@s1;65kKPtv1LWE{(h<0xxYlCtDxi;SD(ofMk1 zg58)fc4I!wMoEcDGIrT1imVF$^`!iy8qAMulQuHgd}fQ$dR^6~6xBZjXwE`O2a`U< z)?8}-aO%Do9UIE4Laj-clCCHHmh_l;50Y{_Wd}KrC6Ef#mei9pKt245J=x&eChM-s z(c5A!Zc3ncvXOYUSerIc=^C&!IUpB_t;EjkQlr_Wo`hnA;$ZPIN_%?;6Yrz>NW5Bn z9$rbr*^rY@YD|+Ly^oV5E)#DScZlB>9}$1Tns4T&An`VFD``FAP}U<3y#s&*I%)1F z6<X;@ktnjQrvhA=VDa)0UlVtUhmsdC(Y_M#ogoM$1!tP!?<#=0u#WNM88EkJ$&;Ze zE#$-03h1`$K!9d~g41bo@Iq36lFgEZ5XLlINFXs28louTC3`1_Cf6i4u}E3gmxYp} zle7E56kdpu6O$#Bg_ZL@ZDHknHVW=)XtFN3jC!H(Lch>=WwH73Nauhu2Xp=tjLz?+ zjT~w6Wl5Z5qvRdQ59x8~InoemtTaV-Q1+4Rtn8bNSsC-huP67W%t+BnaY|X1vNz>O z$~P(3Q-)HWr#hyB3ZFcfqVZ~>`@?Ep4sa|p()5{b2};pVv84kGR0?sPAk`5UxV|YK zDFOKUp264GMaoNwOG!ytld=upUMscR3tw7DS(j3y7X9~PKek%us^8^z`^J>GFvmEO z3$Lb}R#9K-`auX_?`bHRdysM`1&T}4!mNRckZds6Gv0q6zA*riZ=%$E_##>A%$EuP z2M-T{H#&7;su`)MKm;ijf_;wMDdk`1@wWUh)|tjl4N5&A;ZSzU8vgOrRjJ9Td8s9- zwW&LfK|aiJTa+qI&4LV><7x08zUjw7SRWaBr2La~r-M^o`8OnJ;K)S&aVq1WU=#mD z>bcafQZJ_dn0hm{D|Pf(GNj%dhdiAVklMsQfniUmcYWfeu1~0TePUG6GnBQ7e@rr0 zvQVNgF_BnH7E3~pK@!g~$ZY2yI{|4v$8gWb)O$YmQqRX!dp?%Tl_X2jC2Ppg1A&rj z&LF7`qbXXXAW5a99{YM0k^EB9D%nZ$%U?0SG)YC0Lz3gzrl%`_t0g%j`5NmoMoecW zl3M;v$)A${(q^SSPM@6aknWKl(m7HnH<d{4Q!x#aA;}{qra{7Z55$-l+ow%s7WvFx zs+nexwm8i%ZC%=dv|q$1O_1iGeoL5>6~OrWZc-;48ZJxA?Jq=Wv1uu6p!TzaV~?OJ z40RS?{Dc4Pg%lYkcO|VRtyT4kJUh^*9t`{JT^UMyKkW*AXJDAqX%|%I^Xw4Q>jQj^ zis@?vP4A@*t2I5$H0|#jRRBsm@j+gniPER1n<`_{e@kDWa>cfek3ofC<yCYX?4ivr z=_BLp1$8Nu^M6f`z-Q%GvWXm}rK`wO$7H<p;`A%&zokD^j7xdxRp|%QKS_tuv*~r| zJ1O~888Wn<lslCnLkrbkW@D2;m|CmXSyG(OQj6>9P|-%2@w8>6Z%qv!%5q63OXo`U zq}Ec8V{pz-+9K(6=}bsgJDCdq;YFNOKkz4CI`Ah|5By2e&B+`_V8Y5Ek-*$3(sj}b zX@~TLY?^F7e7U<_2Ffj#hw{LKC*3S<8m5&R3%rNx*%kaQJ*cvR1~6xA;-8UTl3ten zEd53Lmvm72;us{{ojFdX-<^PDyEAzHXVm9^=B4?cQJw#p!68T+V%$sCxk#ofOU>lT z%w+a5SJ^V!e@k)ZDU{D=$}ps-K_C;PgHVa)w4==c2NY3WTKbuxGGM|xAIS=3+hj;q zDyzih;`*Krfj_68auv@Rr21YsHVPi)!5#>Ok&;2_Mu^cu_OlYq$2hw}QpA&8k^Lr9 z$X>AfU)0yfrV-h(sJtZ`Q9)%rFgsjV9o@}%of>@FT0*1k$#AbCr;1~hA;_@J@W_Z^ z9cjSZm0SCI0m|^r2%&9<DN5tneX_`!{u{D3jx1wy#=eZNGalxw&l$~~pKF(UEBAKp ze|dBAWNW6cS-D2MCTGosH81iP<oiRkZ$@KA`#7ZMa0ZlKj__n|#-WU38J}Ukyh%w( z1wctb60}O;X8e%xa|W!0^wV4;iD<^{j6X>t`Wr(;Ic!Px<*B@kXPNw*WjSk<Zj&hz zlsPRYgfiPpCuQnqT4%atkLAqD(a*7jP>Zo%Ms>8^cE1mdEp&xW+bw-5(=+2TGcvDa zakKoglC$!&-p~3Yt2djQ?Vo)u8<5gZeo}|@XoFqfc1a2^voNzfb8BWRykQ=?f<2Ax z@c<ZmC4^8jmz%je^Zm>($?qu$H8S6&gr)yLuLjpR1b&erI1IcKR0!@G!!z11;bz{- z?93b?=ghRQA!`7`VWK?i<UAHX?ot5%A5=o^NkdsvvgRvB$4F_A0rQlhEZr=(L0ACT z`%sp7mK`3YooV7Yf|q6?MOh(P%R49V16vRlaC4AhfX<S0rWGbWV5>B%HESQ-sC<-F znN^Ql?qE802Dt-2I|#AQ48GsXMp?(QewLuD(^(h0`?`SI;8%y?{xHDSkT=2nG#>=N z4D%c82U&wzAl;HS10f;<$uRKVe3U&U+eO07eluG;+X9m37#N>naIFKPm_J=c!MLg1 zP7hKZ!d)CH;Acl>=VourZqGh0LD?&^C0%5|6EpLj{r8zZyob8_6k|`AzwGi*c4amc zM2Ai1z+#k(a41CCyR#1tbv<BOipIM!kXsST{xth5yhtI$Moh4~>%I<U|B`)=jBjK> zEr&=SGIa#4o+`kEES!{$vY+Nmf?&gbJi`XS8vb2Jq7DDiIy$a=(YOxf*yb!D`^K;9 zp>zCuD=8S`l4=#4p`65=G{%Wz!|L%0W%ZIDCET3KoR*xuWK@?*Q0=d5V~6p<bY9Mp zoGUqh<UnF#&c``lQllxkWD&VCC6}C|{xThN$pE!hlhRSnlUxq%&Fn8ixth5%upGY$ z%kh(>C|5VvOzFY&Wj&bR%O>ag<%Z|R<%)AlbL(<<<{nmR4YlmtooW4TGH439(%dz8 zgjzhp<d+<-p6Z^wX)k?v!G*Q^=bp*^CKo*ajHYs)9>|lm`=8GsH0&}_?q9i&lmgAW zxe(c`lmhaZyyuiGl*iAT3V|EwkMSp%YaY!;c?<Ir#oRojJg2;6RHbPRi#$tqaa}zM zhy@%T9vON}`A(F{bWv)F-%D6l5tPHvE6OX+tIcc8>xIh!>>t!lO%VM0#vn>qSLK5d znT05?BkxZM%G;NB1881WrJ+UM2YFxSeVdH(PUL+CRsqPtH8LoK|H%A_acKWT-c|4e z8R?V%feVPX(itx5!}1+}EjMpC@5vf;Zybmpn9F}-j;+b<(Sbf7uyp!NE_cn`H3n-I zu`7*WoO3qhrz*~@v0oFkCW5W(_`@16#ud~^(&Zci$(X-CqVJsXyP!BJ%M0Zf@YWQs zIk4u$n$IW))f)MldX{JVuxxt&nw=`UB?WsF8*}uOR>6@}$!`Y=(V8FEP_ap5-JvzV zuDQqdx(D}42>+!%NTji7%>*N+SrwstUj7W$TcWb?F!sRZo9El-v-OX@qz~K@_P~9~ ze0U>2B0qseUD2x_-dLAW$H~awlz%b*=K^lQtb(e7?+bn^xKnUX%*$`e-<|(n{s*jN zxJG%zche(k!(GZhng2PyOS|!1(q>oiMhZ9ocK+Y_kb_N%1H+^^kl&j>K#Bvmu}<YM zG6Zn~-IQwz?E%LSSU*M?(-K-O;T9|`FfB-DSF%Ep%_|TUxE2H!tiWourK-;IV(&{v zxwq66`F&DUkX^7A!|qUpeYOQ&))kx+a|@aab{DWYm3!z_>%giDjuf20tKNfGt)p70 za(!O`A>^sZW>hu-#1kA~MaJWq&791_Icsy)maIL!_Um=p>&%PWOX5n>OXMZTOWjK& zOIMe!E!|goMEqKzO<{PUq_DDZyl8rnWszUeM@65nbzU2jj0znJ{a^k#$=jF~wWXlK zn8J8ch|?7*g*aERr4(irmc3$2*+sI9Icb~tzZbR@?kzlCc)sxa!rO&#+G*2;4^~gz z3J){H>6x1<?q1x%H0$@5HsE*l4fsPf(=ik<TKK$(k1^VYF*-+zie?w-Dye>mn&19g ze3RtD_lsOq?&sP(R1{K_Gz{^BXNw}$(l3XfD2B#!xJ6k-rA503`XDA2GbIQ_DI$ut z^}@5^Ui`3%{0sk4JPPqFJ;SPxN=CqGq$Fyu7x0U|FB)IVTl?Btv)(=^1~ERCi;8|J z`U@k_6GU||q(FoUsZJ=LlCmjY3?UpRwIcYOR~5K8*3Me1jhih~@u-H9L`Q{5zXb&$ z08PLE`iDq2)QBo~$z!4=Udfl)!`{>BDZI6nYj>`FXYCOfb@SR5WpdVL>f*xZ>BvuE z5*kjl5M_Kv)o<X$MoZaAcxx}O?ODfJ_nH)~y}lNzfMV6MO1Y5{c(rojv9+LRDj8u3 zD2TXuE@|;p!OH}Mm?{Rry4DT#N;I6Mn(Lg`omuzoy1T{p#r0zTI^T6+>sGEyTF0h5 zseH`QkG{Nf;i#=kU#HCfZpTM$u9UZ~a$Wtpj&(;czOB_x_IocK=!5D9`Vd=)ya!D7 z>wa8!ogQ%|%WhV}(Rl#lJSd)CtW#_XtsWM?l>bw#CK}CG7oalmNeoeIH8q!4>`|Os zTvA*Hy%z@+M;6ByOK_qm0&SM^Qt}}pgZ{;RgkSOo#+hgFWSY`W_)Ha4>tIrtG?l)E zCK<1IU-A3J-xiOvj4YJh!w-r-RoTOJBe~q-E5&~l_ruavtjBW(6bgvmRhn()Vqsu5 zT*^#-39m#@;#jhzBvgz_rj}@_uRTX?$<x(eCSk;g)LL;MI(8JlQu|6=LKZ5?E-7XW zBo25kJF>YYn@hHryrY&?^d2iXg-|WotfF^v`6XYJ{8sX!bZY5*DJuE41S<P6g?*w1 zaJT0lz@q*t>0z>OHE{Wx6D6wpe<>)_7(#a#f&`T$Tb_?fbxUm(5KsqH0MgRCDYBMD z*p?3s_Ki}80v~XEl=_qgQI3!Ia6d;zRmu_P7NSx~X%2pOm8qeyw+NMPC{;-l4`=uG zqtaHDy)B-=u%AA{zrM(7=46%rvEk9i*&CN{+)y^VOsCAM%&#oA>`K{0`Ns0<^7qO= zDnDI5E}m4{Upi6x?|R;Po%L25*g^}(X}7B@ePe9lj;^1!el}(Y$MGGteL$VgC!Is| zIrht*y547l=7xD27H<gIkhmddL&b*n4IhZn`k?hM`W0!s^)c&H)_=MFn%YHvPTD%5 zP4@bB(ugEM>({NXR%`M2C4=XSN0fYq*6&;Yp<2VIFE@Ph@`GmsY*C=~f2|)-0|z}( zt;)a)xGq#JCSUm6m7M$8hUwV7wo8#(!T)1}{sw!@f!#M)U=Hk#dF~%-z5m$@EJ4k$ z@%-hgPJjKQP(U!fYNe;=-vf?chWin!9l<x&UYhQ|BT!Fa!^sU_sn%2YTak@6e7E8E zS33E(_N9R?kMv-*)?_G|yWzi$yp2;y<9vsrA3R%GO2g7?DZGuk8%;J^Zw#V^NDs`5 z+(~J2qvJ+5Qkwjok|uFB#$r|W<W7~C_S~4XQHCAc^k=i=x=tGlm{OCvU~<@4wed*V zjQfRX<CcxPfDrbp<cTbR=ovV&;Ju-4+x*djDvtZc(;KgByj?blar32a{Ay?f*c9mm zBn<DUh=1C-XyacSpXZ~EijAa8PwDB)S2ic3Fd1hb^RbQ>sboGw4kTexN&WR?+#)t; z78592hRW>9oJYh^0#mg(couv?>-(}074cwYR@KD$vXrv*Wi@5n#HdVGmPg+;J635p z!BRuFex`1T{lpNY+4iMy%l4EVEc;NY05Gq`N}U9ioh!SjeBDKNo|4TiyH$3tjP`uf z5z{D>C8bL-1-X{1S<WkequjOJuRNr@sH>N>s!>eKvWLv?=ay@i8<smzxoLty2vOi1 zEjL%XiH+VM)78w#stYub32CX-D5p|{P<c!_)DtO>FHZ;45ft-*v?1a}80o9Eh43vh z1@1-YQ;?S-KI#XOdw__3uz*{>wY;@_H<ehS;Z4h92D6k3-XN6QqOvQRn6g%;7*FLF z%CDBQ_0Q^QM7+l0sl2;<P>H8|^y}ou7!fzJ8#$m#S2R`}uK2d%Zq>{xv+C8=8>>I8 z(W<ej39O0Ol(nf={2H;C2p~2Q4a7m>*9yCer4<nst1B`q*y>gvrXV7ekb~q_#rcSc zC(?*4LZu?Ch&sVM?8?5Pa!x5qth<Dsm^DyhqK(*#De;Gx5?f0V@d0tAbGQ?tDT&j> zc}#*x+o&?K<6R{qER*qxF1eXJU0z)wfcz1NBX}g{5+m|A<?|s62@y}_d=iq{zsGHq zbCdqvN^fb%_%ImO*d{HCOs-rcUnY+w!R0P;U-n(S3iuWpJn$v(I*@Xp09_%H7syH9 zH#2Y*-C9)0m2Z_FmiKn{J?Je$^6m0>*fyK#HUYi4T={YN&+^}>37nNvWvZxmkGH8z zpn+~4^wI>jj>x$3hZS#B%%i}cRPfjlnpMD?Xz<{dz#E@H+Arf8@n?DUpB0`eym}i@ zMN{v=(I;$%Xu!kH`*^Fq7y);NcLAzcTTu(fBU+-uFF#^*kji9K(O$7nNsA}plX^1+ zReV%&no$P+P))&xip7Pf;&R0;>=K0}HCQE~>m!*|F;JORxvsLN@~z5mE3ZjV#c1W~ zY+l8`m70~aD<Kq?=6`-_j0_4xsB$Psm6o7Ni%Mrzw$n|P@u~Ez3|DLV{AYCr`#exp z{tRVhS$W@6RqtaNi_*@@78R5>XIJq5tUOrx8D_&CmDq#+%md@@PZb@e5EL;nxAOPO z?kYZhf8c@Q{&>F_RSs1?#?Rg(xBvhCaX^Zy=2z)b(LQUG5_z*sv&yk5zN))wsCsg> zS9dC^T3offUjcd;Gk2&xrPQh<kn_(utr*YdSIMgCt9DhrTlK3LRpnNdsmsy%YU1-u z^_QtwlJ?3&RY$6RfDS&c`eIO3#?DhQ{_<4y<Q&yjxh&qxSw#O;1%jD!#*KqTsCq`V zdqI`q%<6^Jrqwpp4lM80r)CDB@N{s|uftR!gIQqZ(6=3tq3Xcu<@Zz_#KHK~24$gY zNp&Hp$o+~Q?6AwjZ`-rE)z#H4)qB-s|NSh(3Z+`Ivj1DT{OYsSH>(G#AJuTAsQP^M z4@#0(p_Ki<Vi$R@T6J4k9s3tBK2!Y80AzqsdOmWygEcdhbqx-Ia9^We1K)rK26YI} z`27M@<51&)|2(1OP(yfexkXz!r)qL*3TigiwAH*-bE@Wi&Fz}unx~uQZ(6Y_8M5n7 zDV^>WT~bt2Rnwr9NHXatq>TG`fckV)bD-uZ{b`+Z_~}-5LkV`Rf7e`5+0dpeRP$F& zF9vC&t5I-%Rbpw^V5byqLYt=HTd-gCO6)H{n{+pYgCw#EzUZ*Yr?Ve2eI#<zj7_#= z-nMDxeUKQ);_!rNHff!O%og%@E*|f=Qg8W0skfY4i#FwNDj!hvC^2vbw?DlOZED!G zOZDBC_}%9@?VOxVH*4c+^J`DmUfDcp^P8KaH<xdDd&`L}m$y8q=hyo;*f+R0#5Anh zws>2>wg~a$P4_oFt<|WVTx(EkS?gCDk&HI=Z-Qb9baDJcU{^7mMC(AlH0Lz~&RaX9 zc0T63hcM>_yAsweGgw^zP^)VHss=3*>_bqYlF$gkvz8~L+N9bHB_*FmXT5OtrSNJu z)K=Ek*B+#$>p(1B`;*djZEGzR|8iGNx(-p5uKh`RUwf|h0;czV480GKaBFYX{$2Zo zowKrPnp}9L7IK1=7ryop$YKxa0{>6}S$X2Nq@&IAHV28hoAov?+6-UZW^lHX#*-G{ zX|vO2PmHIX7*ASo#~I-ad`Fw(Hm54_)&jH?ZO+;ZF?Nu5j`CF`>H-;W^X59+y2W+t z6yrIQHt*W}#pXXZ_irArn_FijMw{Q>{INPw%vGb9GrDAG^M%bnLjf90EFDImf+q8a zt(defDvgVdxQ#vB?aj~YrmE3WsR}LCP$i$~kczArAH%?DEOIk5QJqg+ywb<?V_mok zhM}lqFH};glhoz0vc^uD?1T<VwsKtR+Uwq`J6w0E?x(t*Eoh7J7U34REeTsvx8!2R zEK}ki9H+1{iQHIPck<OJ^=5i^a$$GsZq@yXcL!3p>F+$`f{Cndu<i*Pr7pu!>WgG( z%j7NaA?=s4_RN$~>YG)>RV_9o-6aog@!A48pd^Ld03qpH!nedwA?b~DNcs~dB)wQ^ zf!8l7L|cls>>@+bw`|-}!>|?OeCVovOAFmq4HJ^yK@sScpj%zua!^ILies<g=$7*; z2;Y;1wp`!xHxx)AebZo<g-?lrUjoPE1ZATw54SvLxl0(nsvS9~ep>xvF}HqJy-vNc z66gDAtQrAU>n-Z-F;@3utQrk6dfB2}&HCv2)%C^oZ*N`Gph7Zo*tz~xpQSR_%{kn9 zqQ0?yCpdpQAAlx>sRJlY)VgOemq}|VXHxy~`p@dWuYXYgY^(9s)%a}qs|juQdwRzQ zp>Re0&3do^(_-CO)fUg*dP%J7A&n6-w3WYgwz?2^{UsqT1mwT17F*Tizg`N|bL&g; z->sKG!(J)lxV3Q7R{7TYt%tW>-um0t{szr1GWw?v3b+`)2E#OO1<{}MjmizDY~2F| z#tf%`WDJ=d<VS)@EnjY!yY<u{L{4n|eCq{9dtXDd%@VNmlNAif=E>wExna)M&OvbX z(p}``p{*lZp96Nl1qy9|w|6PJ$x6Y*Xc4zzM#J0&y?a!GWEEr!E4tx@oUFV+rc72t zeGqIXr)oyQnLk{B8oV25`y{vzj$vUyznoURIS-4fxSu!38VVaOY@5%LjjT-6P}<O} zBpa6-RO`QPg50@=T@42sjw;XLIr<#B!#Qj?(Qpo*!*lo?x@V(?9~%bl!CZk0S8$9P zZa1igDRG%l=GAaX8^*THhB_0_4mJF@Z4zKrkx6h1K{Zv7h7|ITqFgAz4%Jfs-lo4z zY5(%vrnG-~Vu|5zC6hm;Wb&Uq5p%c2ZA;yjshs{^diuIB{cZW%*5m2##nac#ZQ<l@ z`*7R0jWZk1HSwBeHMuo?()44~!=~rWAGS_z4Q!RQZf~347SI+YM%zwq`;6k;oKb9k zuuA4_`)S+bMvca4)EC1mP|>zK+f*n9)Pe&`52VAg_FX9WN6P{&N(Q}<j;9Jw;WjR4 zOldqWMveN7tEkNRMvF$<#>Mn9-efH}O{|%rF{Ck)ejmiX|DN*XTqoIjV`gI>X*Bzj zcEMJ2#u_Udw=}jl?rl861c|78*yc8P{UNqX_XcTzqKu}5?ky$*{#T`q+9Q?Mc(L(r zV^`x-`0i!nl}1niNzbE31PzW}r&29uF`=_^&P1cihqQZ?fhboba*e2_shGjVrE{AW zHkmg;O0fb0IDc=Vi)Wb80V5;I^!FAiugR}zSyNooA@*)mE4hAfE^10@%23Y#D*5rt zx0_0u<W2QWtxfxwRsYU<vbva6-&I-lU(BjIRX%<R3xuzb?{7M%9x*Z_6E*$Z1m7M4 zLjzgq{z%hZ6@pvDM0~{dE5oYa&(>_7+HBfv)m+ou)C^zagzc)(2yLF*tjkO;ikVRa zy|v^Q%&WQIH!p7XYF^qL*PH?0!u*9jQ(`g%Vi0F0uY2ih=IaYlb6#_~`q#`i0yl!M zng7I|8TgnXOheB7vUwL1NpYFwSmA?`CXT52R`Z|Dy)Bw8dM#!xqL$#6td@qBj+PHv zK5e<(($(^y1$_TB0}w0kU=J1_lA0k2fmC`_iv`rBqL$ZMW>Uu`9Wwd{!4BIE7FB&? zDz^|SmdD?R&lZC1ZsHHP#VyV)UicRG;9HyydUs1yOJYk3D`bfK(+JMzSkf?%p_crX zs#hcpeWj!!SCKT{d^I0#j1@jad8p-!mJ77RPzZFb<#Nk)O8BUyg^!1%L4~vmbIvhh zNS;y*;hce@doBOAA~M}AqHhE;pQCcQt#7p2wtA<d*14@_)X~>?(5i<&i!`8&VVU(( z+)@bnC3zH`$8BBK8ruq$AW3oP2-Fj00&VV733Em!`KUFwwLTTK7PS)hDK7vRMma|Y zI!B@8E@>p?oE_^WOX8F4ORs?6y1(_C)|+h_ZPVc^sD-HYXzL036wbs{he-twrt3~W zZoSN0|Np4in%29my)4fOVg-@Itx)h$sRv|Ij%^HyS=hvIA!^fYQwfJDCu3(SIOA>h zZSKtN2*q(ggl_ma>)AF~i`rJU9f3V*OKN+ETw0~RM_YDVRoku<)K<_|u3{GsChfxf zRMb}2*31}(gYNY|B5T3FSW5pBGTJo+-g(YP%FmItooV}~jg9~Mkw!}hdxw6^YvSa! zJ=?K<N6n6HJ9c#}>xkPGxm&XP%iXv4B<xAui}t$jU9mS=JiT43-KE{9J-9uhUEW^b z-qC)b{bu{U?Snh!?8p_PcD;6sfnmlvK-dvvETqz1Xra7XM`#mn3_T6=bkrW(E|Z}4 zRqd&Cz4^b$qWpgrq4wPNVtj3m;A>;f?$MgQC!K?XLyXJP2JaXl{5cD?zu*2XP&SCR zrb0;>qC-~|s~YO+eW2pIJg=tLl;?BX|7rhkdlxKdxSjkKDtxel^9d~inSda^U2}UO zshQPs%(m-nx7;q;?zr7+d+7Gm?J~MlIzvtV^&l(u4v-ONu&GSRRQ;_gS9Wp%+8(t% zjy!(Ei<S5+>2D-!`aWP{BH)b!DWAh|i?-Kq-?e?;_5<5L-hOWTjqSgw54VII?lC#s zBX+n3mEoqqa9?l#o*phvIb0bz+ypzEBl%sG?!NmVOQHhq_K6)DJ6=~j#4^lz_`U%C zy_2LFAjv^Et+a-JdWT?#!w%OSK06|JB#Y1vs~sXp4>%3!0jH0P;eQzFw0eyFX`1jT zGkH#{#@L^R2viLBHhX0>u_E*ra6_!s$4WNyyLTMhac;-89e?Z?-no3Ic<0)VAeP@O z!A4Qv9haC+pZO}lN6IXNjufIADL-D~BjxXSzH`>jg*zAR41k>fo!p&MX<ku=#oJOQ ztEF2_dx({xoi;l?)HH=>E3j##R4q8;*-G~8-uZuNm<RLuJ1cfJ?EJJt)Zw90f<25Z z(o@MX*|}@yyE{L|Tr5Ln&-sifn*r1LqC;;ewT5H8^Xkq!I~6-0?tI=cnUzE~Lto&3 z0-nWD%@z|Y&(cJXO25+!P{;I+IrLeI#Aj)ucN9wWC<gmT$@l@~#PJ?hKs*dtB^`WV z2Y_OalV5Nl^o64e`24N@L8T$3PRi{_?r7bmBj$EwbQE^1R}u`S%7X=P(vFIbEtn*{ zk4b`steShV<DHK8I-c+1?SfB}ac@CXl$6(TqT`niMF%K(9cMbeqmGQy(ow2r7g?bG zG7F1#p=zyOV?s8ILFHt$O;@$xty{U=T_(HCclnaBDhGz8XqRZ0E6%vr1&NGSRkcSu z2ZnobkbpkS{`{__-S)ee><-?&0>0Csxhrp1%dQi<uI{?K`%N+0wRTsv`uqyirZo$U zI=eb{y{BT-S*vQ)fr>u6&g{C>2SF?k@WOCBueVxHd@$n_pk4QOBLL~&^;8X{kP!%d z)y+Fag=qJ@-B5lKOg>7>(K<B?PytJ_3)zEyQw?>$Jc1+ye4{GCTwcYo*j=!@Z1<+! zhgiG19&_&v+p^K_t-D*H&K{&+AIn9%J9h7dT;5-lnI_W;(C!a+pQ6uaGCrUBr2uzf z_cc~RT!t_IZ@K*4irvF|?Dlx<31la{k^V*il>Sx}^Y-xeys<}n&m!{EFHAz59%-s# zerr>96y^`z@nPnd4!h>N!`N@U5Z5%83uo?$p`wX}`s8MSF!X*tcTd)ynmunx(4PD~ zrHsy9I!dP0Qo@meZXcK!_B8BirP7qoC_T;k4!OKNhxdHE=j@(K-Q!T@!*B*9NJE|m zqy+KFz&k}ZDeDu$=Xq$)l|3WS$&EdC`uo8@Z8U%6f6ToHcox;xusxY1NK=A>V8e(( z@u(O&C~7ETP!vQ^R5XO-fke_wp{VE+KmlXJiVZ@C&_WMA2?0Xy)pA4yiB#!|!gsH| zr#%7BdH?snzU%tt%9DF$&7M8GuDy1dnNwNjH$Qz-rn~fm?VkLQ<9zT43%hRfZ~hij zi}(MGt~k1J;^5%Y(P5)+a@FfAyszm>FY$caPU8G5b99^0o>{H_Zp!R-y2kUIuJPhm zh8wSp_K%r8X6cw!V>XQ0Gv;D$h1ihM?~EQhdjFW*cysiJqd!wNc=w}Dn>3|&$mnUK z=Z!8Nz0KB#ZM=&4;;wSTI=cf@@x?uus~N*X3r3$GQ+3RZV{RQ2G3MSet;T%ZFnEkH zCS*)S9`7umH7khY*T@`m?U?K3+iyHgRv;gBD_~`OXo1~g6$G|)1+SQ6+Kd^BS&|Ym zrqh`2WBQEg|4&ZKHHrn^MzJ99(bvFpCyyPFCqJC@7~{5@)vekS@gp5ZKB<xG(dSPc z=k+hYj@duvjNM2+I>!0_$D?*Af3-^J^sJEFu-uz-vvN16r*LJi!+%HOPiIc^(Cw1k zhPlmhAIOc$?U36&H(@r<+b)^Ihw_%p#T-~-d$lAmZI+aa@Dgu?m&mh5$5Y-i9?l(} zJ0>?jw;;EKwmA2LTvkZQx8ZKJHOEV0L1r5(a;NBa@7xM&jOGnbTyM3`Jxr)Wa`%kA zb!_9YotdS1%cz@sDED~o*|Fx>TIyp+;dRsyeE7|tt4(=#t1mmU&RFMd*8a#_l!@jK zzeU_<hu0ok->s83rJG}0j%{ndYbyLEvF5VFZy4K=_2wP)Bkp6L9~-Ohcq8x5ymM?H z&ke6iA8DkI{bJlV<ED(;J-+gUn<g}#@X@4sllD$JF!`p*w@+R*dCTNeQ=W~jGIsXZ zrDIo*-8k-=adpNuAJ=Bw3**wqeeSB&*PRwMUyplqiw_yQd+hgP50BF?0*sWg!0fs= zjy)(=<N<kQtuxm*bL<6Yu5XrIqh}oSWrwa9SJTea6*SS~>Wyn)H_`ca6CLSl)Dd>2 z&yFk`=N<q5T#czQX)b-bBTiU<Pd3L5823ThFTXH*T>j(<dFqAkWc=x}RDa!OZdt!R zE@a%Caf`+kk6Wi_jh?e-jh?lZ1nl=t5j`7kj{APxug(*G)tNCGcWm4_+qQg8%@}3Z zd0~8zy&CI9Uxo3t$3HSYVf>i!1>^VjHpkZ)e>e6MPw=S+*TNq-a^O5Fb$rwDt+Yyg z+g7Q=ew8<4rJLhBkMAb-*31lZ{0rk_)mym_F`Ca?x%VXmk53yvZ2YH`^YQ)1zoE-{ zL%W>&160~fXAtRKH*t@QpYG|let9ZkaOk1&MdS7NeH{DNc_H(me!=7Sk3Tly8X4;N zMUNuYeXuOn9Dio~MLT~#KYE7#kn=IaP_j(cKQY(Ivo&D{%Q%B($u{4Z;Ff>$%>;8o z%L$!h%?S@r=-_1Q_qzM{V(O6Kq6yDW=s)2txp2^gSUoYEZN4@k$r*q!=LZ-IzcXkp zV_vHD`ysKygxrZ6CjL1obW)v3SV2jZCM=k+cfz3wXD3EXY&3EB#7`#{aPy@T)(2Wq zuLRgWS~)uQVO+pWSX5tg!e0|_7JI0#IkCdTYPKD9zjxv*(Xx<Q2CUnEAT4;}{S%*` zm>6qLjGFjlKwmS-Glv!&xU&CY45~D9V*13_?0dEH-m9<o;K59D;#U*%0&TE|0&K9C z2|7#q17eko9x^BHnE0J6BxJF|tsMO{kyX8(RfIR#A4jUY!mYyZxTWm3N!NNx*{BqA zQpBWDeTJC(CN-GUa?-=D=~hqm1}fvYw>c?#Qa@3YL(CPEx=rdisjsV}R7KMZ7;knu zB<6OdUI&}YCk>wTp6h2z*TpvJzw%(U8k07!<B2bK9rsg7=A^}wR=G1<F=~B9pKSB> zNn7l72(NlHZkN>HNk=E0pIqII@_TNSk4_HtMER?eEL&GIP`6u+<Bas+$#+lgG&wmo zcyi;(4^D39l=<&;nQ!Q>xbJZw!JPceWM__Qq_<vQ;7zk?bz{inL6e6~et+^8j!!>o zpL)7uI6vB>Tq(hmr%s+bd9mZRM7wS0x-D@k*4f`P&B?na^F~;;fb&DO-a6YHIQfv{ z#GIEEGWqW*6{p-brL&tJIc|C!o>J439(=iD%AHdlJK!^?G?>y#9`tYmBC{>-+CqjM z6Z~ht*J&4F$8<`cDX&Z!FlC5yQH~CM6*u%bZcL|qJms4y6CAfIwcEC?+m#s~8yQpf z<}JxvJ+0lezB3!nY?Z%$ZnwEZ=8m5C;=J7XMf2A$cx%C?g##82j;%E1=#+C)t4{4Y zHF@fQsUxS(p1RlZxj-7s?4TE>8lC|MUwr7)+EZ_vdgs)pQy;O7&8EsAZQ;$wi;K&d zoJ#^t&ZV@PQ(u@GZ?~EScB|=me^56!z2{GT%ah)(@dj)D=vVW40iMV_xBrwJlklp^ z`1{YJ2M(k9_fK6q)%mnr>#5H8M{8TP^9j<>sR#2S^IGJ+oR`l2$*F(lnR&P6-DMT; zM%MRYTJr!W@4CvXnpcZET7z%x&e+}Dwnuf2Hr9x=u8K+w&Wp<Ho)?#B=C#jzN_tJo z!TGnfJNayyC3#CrnplhI+hhgjy_z>YZ>}#mZ*bn1dAvqCZ+PCvuKVHIeREebOiP++ zw6OZ>EnVy2hPcqYZF#@uotSppwB}+TWCz9O$;^t~-uJPsg_uL<VuzT|<^477s%ba6 zeVx6R&yanqjq2xR_G;Q)(;CR^)lc>VgfDuG4U<<lXPVPGPU~jhjcEtgA7<Byn-=2< zL!z(Jv^S@HFm2AXQ`4WHo;Cgb>HnVo=YHPDgKcCl@@~bwKAkpA-t!*bc-lA2fVgi} zT&Mbq#^eJjA=8#kTRm;ZG#<;)c0}WV;yI^W@thl2Jm;ww-Yl4Y)%2RvZ=8Pn^hVR$ zOn;)GIsNMC)#>pp;3Yi^=Fl5jV3(u?ftLM(a+du9cl_`puaUnX!JOW6x~C}^<XAN? zxP^bo^ueCO{|58%(?6YF_%lzH@pYUBrjMUKeR_c%%bPqZ{U&Q1tn1n1Wpt=TFX>sY zucvSKcsS-*raArK^b^jQU|nYb`*vPm{JznA#?3S8&A4yI6EnKbcxgue86VA<H=}UI z`WZ)NoSt#XzHuK%ZyeQKuIz~3Gw#298tFr=uacb?Qoe*HnBkj|Vrzn<wkAksJ<5zX zW{hyBiu%~IM0X~dGe*tGyKI)|4rj=Dm?s@-xl=;T)65xLXYA2q4zFU4&iMC?18Pd> zeLW>~&YB47=d=ak{WHy(p)>E6^(Zs1o~b|oL^)@rz|5Ox-mbkGYOO~ZrCP;jSvIO( z4&pavBwRJK<E%!r9-Q@fevSOw@>j)HnECun-^|pRug<D8tFCJV^mo#4fm`LG<IS1= znLqv#8!|Iz<|i}f&MdN%`zc<^#|N%wj-JU1F;&3-igh1F{OhHIqQUGld>!Q!&n?be zKXZpI>g919!$+w;nt5dAshJmMg-~DkwA9B(q{HT~H&Uv_nPh*xkK`%TW@Oc@uvs_Q zS+&5<s%A%6D0T$3XAKK~?5drbtSomU)WH`rtJ|#4X64SBO%<Khb5`Q4{<DVJk!li9 zMHiH-q6-77Xo2%4*`I$ukdz&sH*1P@`|!N8v2Taw&nlj^b=JRU9h!A6|Eh-OtkPK< zXVW9kmtP}u*6vx~@)DeUhA#5$Q0E6$;{0-zINw`y^S!ZJl4$1Nncs+B(s2f>;{3r! zQ-*|=<+sZJAfHzo=C{co%17?#j9loD|78BN*6l8I$T0I?%zuUFdeDv87w*YVu+Q9M ziSEsR%@*BD%U~sLk-ftgfb&P^&#^uDSHAQ7FW)aze%_tG)b`+RHT*F+v10!Bvn$Q6 zG5g-xkI#O3cF#Fgem%-V`z!Oy@{i`9VHmks@*oKwIm3574g~Z;PP(?xv#xqtIQuq_ zHhKNXnODr&O=mkRua`+1We0f~?-7te@m7S-5f&fMs4zQq_D8el%-%HnyV-xmnzOTJ z4-M?NWCnCxYB2me`-|BVJ;T3mc!z&`_cdo1%w8QZmiwyJQ+ebVy$t(x7!6-bGiU!a zn|E)yZ^)>?dFT1!L4hN`uMc?7Xg24rIgRGDn)Cde*g3Dx`E<_0IV<OEnsa>4xw)oY zkb66o*?N0Oc7$)vqn9hg5418&qF&8OnB%<v;)q?Zl2Czjvgf?(s=(g13cMrHob%Nj zzB^lPNnSli1-|W3f!Dh#uvwZpXUCjxwcZ+t3Y_y3MTj@PM7*a};8{xrX1OY`U#2;? z;@nQ60_TR!y+6*Jd;MIV0B5bCKO*%E@7Fo@^B=6MvcCo6#Qu*ob8gh!NA<miSUU1^ zr6Zq7GUvW9H&xypZ`?OG&J)&ZEXvCcdUI}nk6rLpvN?Ce+>f1?P~7j1W<Q-;Vea&~ zKg=zgXU@BC-u=DJxpU?g@`<!F&h*_%Lce<MW=AE9N$#qoj&7lT(Jj===AQKw>Nk&+ z{c<M5oL6<;Ei$64zH7Aq57oPCq258_l{BXpW|@e0WdzS_Gq2;ku2_xQFspA_cvb8k z)W1%|2G8p~@6~x<{>&&?_`GBk%VDb=8R2|Y=8m58vem2U=DjoTBkR?4J*{E(cr|uD zQxui2%DkoX*38>E@7TOc^KY16e}0Gg@$<i)Kh3q99*8sNZJf6?&fmBs+28mZdt8a7 zB&S%N&6me`=V6k+-c&}Htk-R6!Gyl%{LuN8`uH1vkeuCk^!#c+?>|u{-w15HDao9F z>-^hO{EfFB=k&JZkok?~H=F;!{D(PupI4eU-pQT5RwHMO`7|EOu)1EpaHRZQC&|M! z>E`^D`EMzk7UPD+W@>UlhhnnYXLX0j#fcVAvF32)g^dJ$q9n`#KA3n&Y@Z|6hZ4u1 zv<L6L%`oS0UGQ3L$oy~TADDk+J`a&vYrGcfs@UA^M=d<or{aRj3u-U8V?mPzZ5KSX zAZ9@lZzgh=5qAg}S$Ip-%CGjoh5vAX@@W*HbbJBtD`@K-)@UE7Z(7*1IA>Yju^?x` zIQ6hxpKN3N0`KeNFy{~Z%mvdHEG=I=n_X5sn`T|L;D-el7uHyK>%!=TT^2qg19gMz z4qi~U;Iw?HgTlm&$2(|Cz4vyUxiDm5Rco>1YrI8#KXWWq+*<QoUvpu-g%2{sudT~P z3mbZ>&LEl*%L4Cmlz9euGj!eRJO<E8j|>j3J7i(p!W8$;InJGjIrAgm{c-%vx%~&+ zR}sFR`Js`yaA84V!OlhTi{4$bbVd8Zk%iwBPAytj^mB2`;-f1kuDldmdEv%|yB8i= zc&eak!Se-u3x*baRPdRT;}iHi(83=U@_5cUf;53LMZB!#yb);Rg?|<V+m_A*TO&s# zgcMv~aBIQ61&`a&Y93&<6epSmjSJcY%z<BAY0rVj1llkqWjqLW#uKkWt_E6BFu;?H z{?q3U9N??lx-S!z<qt0DH#qdSg3$#FW%42;`@&-dQ}_hZV+Awq7XLB3(fzHLS+Kfb zy*$R-$63i(Ij%y%&jr5~{9f?qqE?HZ)dR*p{auMEc26+w(1C=IMHLoRTXf5!d+nRQ z?Tzn+*8;7y3$F*n@B$s0ICD|EMIEH6_&MNtg;zZN!=Si$bJ5F-GOcBZ{yKaS)m-%2 zqM>$ov9Ibb`s*b7DlN)gG;Ps}#cLP;w50A5-;$S?jCPfIn=5=c0~37F=0$rJ9bA0P z;(Hc%TfESY$iKW1x%e4N@e|EO#}{1;$h*JBm0PY{HPKvLWAW_)jxK&~XK-)5V0v-0 z#n>6LsKmP2Ut`O8QzhA4{KDcv^6J>rvF765i=FlScLfCN6Q8+w$l?#Z&()2Rb=8YU zEuI{BhY98GaLr}ws+|wbXGgAHyvtL%h9sGb4=uiM;KZThe8BIv+ZLa)8k%bu-i|ew zge<v^X;hwzw~JKn@4Oj}Z+KWH>C}{vCHE|8x+HqZi}rk5A`7j{nI?ConM<Br(oI_f zgDh)cq-AXk<f{$l<jf(VdzNG_8NOtsJtfy-$(we8ZeibU4==BBR=CbTTb6DvnY3h< zefBG_!TD7}g(d5j_FDSgvYyL>SG0-^U9xM*k4t`CYAn6QQ3MmU>aRzgUvg}T^Zmbx zcAc-6WG=0+w3=OPA_MYgx~#?L@%+r-rS~j-d}$YXbaZKxr4OrCOe~%Aqjbxq_CMEF zK*w^Aj(+9~Ui$LVyro46Axkrt4qBSC^eg*rcL&_<%fQ-pk%ytYCF5&mx0lXdy7&NZ zOE}Ha^x%WCEUs>o)4apJVClN0n=tUV2AK3)6V0VREo;F-25x<P*|p1VTlTM5bLp97 zA%XVyzySNZ+<QR!+O1y409REQoyKBZ)@Iq`cBx28GnYNJjQ2yyoWI{H0-vN-SeCNv z&1FNEeYEWJWgB>(qO7{XQqYN2T~?ONIH8uGSfXp0|1vI~P6%F>yR2YYajdy)(lUBv zk`=7htYt9_Q%y^1JL^!cS4(lsWxJMndZmMT(G?-*TY~B4vJ=bxu+u(Cnke;6MJ6qL z9~zC9-?hBa@>a{AUmm->@A9F`$1E>ezH#}F%MY)px}xrif30Y0Ul`|<EndN>AIa&p z{0jEJ^(cCxGZ@l?GPpc_xwHPg%r1k8RKw*t%Rh5$!wPYBPvG`MbNR&O*e~U(TV1Co zFvMeBUw8SE*|TovfVV9!|9$y+oj?6B$d+GP5vn=|@92b3h7?PtGO~^3D{eS&RDEsb z><?BYPItNt#$289PdiV?ev)|Aif2~DuGmr7tguaCM&VG`f{5*FuIRJkO~-;LT9M&V zPT2>}WQMHBSuu0PvK6ai%@re8<OY__w183<7I?CkT{fEsxH4I(`j+|KieFY7FEk3P z7S?y|<j6R4#hDd<%Bs^~^)B1sUyjRn29>$rGu14-w(w>OhLjdMve=)DL9263Y+F<v zJ#>_hVCg<m-Otm^!sx=@2gt<2&V|p}n(8yJruyuJ=OuV)Jep*wIK6&zi1%F*bVr;g zmQp==+cov7!bOE8g_{cx74<AiDk^k`mlEC7PH=6E(!%dN2|Y9=xbQ?#m!fBVA%%Yy zJzUhjs3R}j4JoQnbbHagMa>SJKg}RgQCQK9hZr1E^N=zot9Hs9(Lq~uh(&$s+^+{^ zEl$v~Q)PTW{4IIyZO{~1&_2{Q%I}odqFWEnS37z7IB)8d;iMz>r)`Ud6pa<@Y;a_a zqW6nFvqm*vv{IYJqAm4QS!B(k8AbE0(=WNF?>}v?JFCe<eMMV~zNa^~|A-p94w|M^ z(X8~~qQk|Ni*H~_JL9B%vu~?gbS}dz`nxz-%~1b_s$z!vTRx<5oDVCX*W=#9%l7vP zDXv%iuj2cPoBWdEueX%7?Da}cGH|w-^}O}wWDGSY6+cp(RJ^PBXTAtDIP_p~r{Xxf zX=`8nyxp|5w~NF<pIMw<JjiX{+Mo2j9Xh}G{o=2S#}?-mFDhQ!&@BF>coc(I^BKIF zKc^S}?5pPoj$q9%H-a_aJA%bU?p<DR`WdG(LyFI>yldslE5C^iF21y~(#kMLnT^p6 z<*g{Gm9<ue+s5%2TS?uDwYaj$$_H0IzLM|TX;XEexBa@%C$RmxkPy&*T|mnPugq9E zXys7np1Jy-;d0NMm7m!6%(d?sZoMvPSXS`L87m7`ZgmTKyj##qR<80C^uel(m@B_s zdC+wo=el0Gk`A%6`aQM3SrS^3;xkLClss_ctS`8vW=WkA`&GXYebda6h?2Xt%6!vm z(mu8n;%moF4-77Oq~ytx=PX?ifoiif_tWjTG^T_PLrQBn%)0ce)c1`>CGVGfUNW|1 zMaijERaf1)s>7;os}fdatomft*Q@5)Dcj3QBkMiF*%7fN(=Q)n%855iR+X$*b94!q z)g{|XzIUJAsHY#}$PTYpa>%VRktBD?pR1hy&mlXx6HsBRu3J^dZHIc<?NHrBbJe}8 zcuPsScIY;z9UAP>Ro7nL4xMq^p+;%us)4KgI%TqGhgJ<+^`2^nM(B2k?;;$PPZ_<E zVXhjtDo-9zK*ubxi?K0>r#DtDSyd?ZK$o(UJg0YC*Q}97)~chc&aAGp`q|a{*Hl=O zy=LT^lG4hhFO<fYep`BKZOq!&SSha72^oL(3R!h&b;#<gSJ$HBWR9@M2}U?QC|T~o zJ(J^tSKqPv-qla&F4PX`@T_jS`hMx~{G#W=vW*L??dPxiJBDl9_|VmHt5a6LwK`|@ zZh8BPF6mG4oYv~B)q||ZEnd-&7nwCx{#CL%NN*W`tsb*_^6FWuSFhe=x!hxQkutdd z{MAc!aP~R3`(1k!^qu{<$}Z>Ot^<9{)xWMjrXSw=Bg<TUdiCFSMH^w~e5HioHP@`E zy{5M_Mb$plTvKOFedp<|U*+ko{58$jJiO+yHC@)cWIX~>#yFl8G%E~s4$Ddw>zTEq z*3(<ZJx_0C2febUpR1kp(@5@8hgyAu*L<;N_L`-R#V~2jL{E*)a4#Kbjr#UTHrK3M zb1Bwbvt`Zi`XR2qYrb9M`GD(j_equ40$$MD+8t}`mSUEMl|K3lW}!TAGSrAEy}k6V z(x#<R>O=LlJmvdgw=y->52<uYG)tc-?IPnJ|Kj8+8D=r$VIH2R49Z9gEln%!U;1Y0 z`=w0sh(gG>7AW{JHaw%{CF;wSLxNY8eqB1dbdeqE?BMmKQ>~}L@~uVN?^wqhnd9wi zmaZ$^=~_9rsJ3}Wx>>rv^e8i|b~a~}$s^IJ8NsC&)>dBIoWa1;Zfd?HYm3db*R8GN z>di-7y*Y91-JV=XBo$>A$z0oZt>>ecv()?3JZ;ZxRR9JDC9dteHp4121FZs+l@+>n z*xHe6N3ET`*8T3xJG!P+MoFz5vv!JIRNt}VP`TXWS8d$Y6Kl7w{dVn7j^-@ZKDBX2 z{fa$q|6X_1x@#P_McQp^*KJY19HZa5#_QIs+p_N4^`ET&YW?3EDs4#KkhS5R*pPJ( zu4}jM#dQh#s-}c>-Q(-J+F_k<hqbAleE!ID{f36_T$j1-gLSjkSue90e4**O>~(K1 zXzIVv)V39xCYb9!UH6UE_1;OZJURQq<Lf5b=N~`2|Ez5goZ#cw_P+CZUwI*omA-HK zDy%D8cY1x3^$)LqWWDFj+>H`K)?HkG)%u$2>)Gwign*X3Z@HE{DX=AX-YMaa{6iM3 z-x0-%YF1jB>pQRKJup0S_c}(bFJyh(`jqtp*AEtDpe^jH-7<QYZA)%Yg|+mYYtO!+ zEwG%#;PvCz&s@LLO~v!P-ZD0L{i5|N*SpVuZPdB&gqwF8Pw_cl-0fd~c)k1H=pou& zu<Op-cX}o@ctiCKH*eqpK6_E(0A|+X%?<T7bg*CHpJHxkyx}3YevEd5cF~=J|7ycC zo~q(;^QUxEsQt4u%?+<@7%WfJ`Rfd_j2u2mzTv|SU%8%t;(C6%{|83@4W%1rZ(Oo* z+r~dPJ-F$SE%moNwdKVvQ?}%9S-7Qm%lg=g8}@D3zv1wPvm0;T*lJ_+#w7h%+7NpQ zV8iEJuRrK(Zuo0s4M)Wu-&oNT;;${e+FhGc8}HcI(7p71H&n-1m1f)d&-ODnKDqH3 z{e{lRoBue&0|rWw$}(a7O#a0t{ew4VZXC2R$1Ziz-con*nCF`~8^7E*-gXrc;Ogz4 z>|1`1)fH!MEZMkLn&X4^(v+-tbK{<kKRKg~Z($Z~EZfKnx8&g>f1P1g^%&s`*%Y#= z+NPT}c|NT-lFQIx`}uCzZMFNFn{L~5x0Oi#$ltAGdFi;_?R-%;yLGaenDABH^!%o{ zO$#?y-|XA`(dN~gFFFr^#+jQEH!)Z$ukWb0eiK?)nh4&1xA!=!+fUkEp-t~^;@t-< zw~oAK)8}rgwN)LU?8s`Hrn|y+@#dywn+}%oRx*~#)LXNu)Ow8qZ<3JVy~C1qJoKi{ z`|FkRfX9jB>d}ur=BBfoE2z_aI8d*Ythd75U3SE0Zmzw#&B4>o1)J~O+`QZcE8Po< z<dq9N4&}sS^D~=Ylz8|fuUA3$N7hoKWUhbxHxDc4-y+w)g&Dz{zua7~xiHz>oV$5C z(XcYS-n25*%CGuO_4liJF@L?Wr_nceRLC?pZ`iz>WeRGP(|<=bnzqaOnwyVrKC1&( z+X~nXjMdr6vgPV6x0DOjd^c2c6U{9RwzPEX!H0d#Ee~($;FOLNR_TcG*a^?3hHUAx zC4EcImT%k(Ke8)OcI3$|Z+fa-@09HDsar;Ru0P1Uh&A3tKU%4dIV^hZ<F7Ny8H_O( z+ABWa`{Ni3@K+2NVGP*v>z0#S{@z+)>up;bY;Cmlp{?y*9sHoXenY=-jLP$Cyt%dN z*6W=*^PanMEa$)>S0g4T`h%By0@&RO)m%3?KM(xC7`QcK+hf~ew~g4*XGiJ||Bk{P z8+NYU`TNelcU9bV%WgBa%GR8%pKl$zb;{ORTNiEJw)OjM!P~;NJ+%K9N1Z(Bw9K=# z$^N%i-uF4$tP73q*21l8?M8Q&-RR!uCiT$1=GLFLUU1ahFI$g$()$xD$DTU6U)E0P zF|8-12qc-?ZroPS^=F8iWj}9g<nbcOV?W79;N#3~PjBlk>gbTIj{3)&+xl#K#ZFq| z66$E%fNj~fI{Ls;M`wIjZTn*T*zI}Smu~-VNBtcyBvjlsZQHzUySDwZ{od^lZXdAy z9a|wj_LIEk!e?$<v8~jWZSyM03jtqEy~rDn?T?LxY&*Bz*nZ9SI`(yUc(1$oPGG}- zF(;tmzxZys)2Dc9YkRxxd=J8z3%Ph&CNQ=?w>=?n0^|E~6Bykuo50}3lRRXJ`Ep7b z33dRt+RFABo`adVJ>OIM4y2mfi?^@09ds+d9{la};O)QcsJNrX{zDX}KaL;8{mJbY zY?~<$UEr)!$@9Fl`SCNCuZH~NluQBl3Et6k$3r`wv~QVxg7-sv-g!O5doY;i)a-kG zX|)v0*z#CF(7YW3tRB+2#Lyk@?)ZGixE<4W%ylbTmTQ+kYu~KbF&+=^<G<rR?{J~F z+x=YXRXe`hS$F5XJDcx(ac9oXPvVD!?%i>4$Dccc?O~~wJM5Jc7h2k3+xy4ycyni! zoi%I$U(R7oqjhxQR<|AuFSElkqOZC0!JXZlnssPr2T!&5%&J*0=*qOS&(3t$lVNUU z`gNyQ|D~L^o^3ic(A@duPQD7aGk0g6Q{jhm%lw@Mme<yj*t#?by5e4)X71d)bC=eV z^N#<@TcB7)ci>oJcJQk^54z9qK9ZgtG-)SKl%qwzaMe~prn&2yT{X2y_J?JXy`L4j z>#ki*c0IH!ewXK63U52f@NQpoSG!$3oMbq-tFtE=KDENyGb4Cc(yotoE%~XekGU&z z*PCwU_ANVpy6hnD`gcXiM|jf)jqt8-c1>}meJ*#Hs5I5Cl3knK#C^+6+ylG3<G;y& z;N$UK=j{y4ag3OE{)jbqSK57@qjCSORc*|x?;Ee~zJE`fJx}Zzu;=5w3-;CB*KuF> zeewJJ`-bluwQp=}<=vfkzp%U4?!?`hyNh@Kxcl&)YI|;S%W!X{xr1KS-o4;<LtjV; z+5N`uVY@%wO^MediGl0OS0|dgzuKJ_pg}IKv8Q352~<j@Whv(FwY#0CBO3*1w0t{3 z{E-WOKhWFUeQHn8uQW9Fvw)$W{!Z>4vy1*GCx3S)K1cmg#!HZP?Wwn?rCoiR?TNIj zMKk-7U2c0?D=v6Xw>>@fr0emSH>5$>6Tc@>8iX>dL8vqG%*iCbIg&MegM(h*Gk8yq z)e;2pIGcKF>&Lzdd&cgWzGwHIpY|NxJKHS-&Ew5IbM~xa>VZel`399U{PTrwT|BQh z`nOvodblaD^knM0M&#bgd#~Gj%if5+5AJ<zZ@0a%dz1F|+nc?2xSbb0osw`+XI*ca z+P!!0b>4q=&~9pbd)6~m=;=IIAMW=k=`eTTPd?S9NBB-S6)!wZSKrPIUo+>o_mjQf z?49}>HW_bjxp?W=@nhD0cvby^wD2lCWgpDi>b*<%u5nZTI$y}%t$V-Qdt|StANg{* z4{H^>Db_6B-23;wu*;M3^UIR*`^4aV|Jv7dUzD4q-Q6TD;Pqm5NtlUwYQJpmQ%@2+ zpK9)Vd0&=${Y&ok%Pk9PzWq`}Yx?0s`%Ux<vdn#x_pyr4F8<Ez@BERA4a4{(*f6H@ zt6A4DW^laLG>oMj-@tJ$$2W3(6F+-v=S#|rH995x`otQ&(_`Z@6H`-+gn?-Zz7!)l zHZGl`<SZl2m!6m!ALmQS^ridajf}L|IG@oqE;TthHa1SgMyB_`^1K49%C9EBoB7?& z?+$)V`8~idn&1EJ&6l2@n$Asp12WTNWBMc!vzVmBjLevf%-Bp{hF6{;VHw4*zU)|A zcj!HC!f}Xw^8Z1S)d5>YjwIcKjN1IaMeRlMpW=Wl>Xc#BP<zqriHjhkGkZ6vz3%MY zsP=lYcaz#nU{CTg$Vg+an%Wz{UYOeRvv-@?8_u4-+aC5FRkB0uwO4!R*?UCojXJH% zL68wWqH9E0^oWiT6`zeBawKX^NCXay==VYuMzrJPkk=zR8<|z3bJ|68k8as6qH}s^ z*-sQ^5p=G$+!zrOp?0G$6-IMG=Yk;dp>JVObWX>JuxblJf{=!Y6Z|SP#ZB0nb`g?B z2Eq`ItHP>yU9sAG3$?T=*H#QJ%_-V?p7XUiUwiA1(W8`?(ZQwBIYr`6xP31I(=j4k z?p5?-#YH**YY9MC5mv2SrHD)4yISt}A1@yA<D2+eKPM!Dz|_xDaSm4jK76Mo93)|_ zeW?(46%SXGefFxBJ#gvLrLqm&SmJ3VQ({2qR7%wI6NI-4vpU$P+(fcYWj3%+nNIq7 z;uI`#!YheW*-PB7>{;uk|0yd}@^}M~*-+<)&ayE3maaQeqGd=#W@y=Y0$g?{vHR~A zkPso4`((%K8ts8y0s_1{EEybfsZ@LjbVlI|G2TeM+*?nYsC>541Rw5+j+1}ovpX`t zk4PyiI+8k@BXu@kRhCX%4~LdDxp?VP<HG16B~dXeH@KTqReA<^msV{#-kr~?_Er_L z!#<@l*E*F_?X43erF}|eu5~K0+FLt0MV-)<kF-dmrUXlf>LU#o)pxiS;&7Ej;gUr4 zt?E{v6bd)qh*h#`3yk6IB8VIRh8&9I`X-!iQaQc8C2DPpDx_D&=O&^+4p+guCPNA< z+vmd4&BN7^MHKxQ63i*&5r?zYeX{P;_gOB5xRSUjd&4S!^-%>w&Ns-qTBOw$AG)<H z-jfunWVxxdRmZm#;Ecpqm&B+w?IK!83#OvmLPfWQIEb<x5R4X9bfa{1qa|+9I=US> z-O-9JB8jdN>F9QJqT5kNSDmw?+e$~bBiFQ2(QRSAd5^j`F|(rEs_X+R#8FmsD-*a@ z65YcC2zzHYLU_~t@YQmCcPs4O)q(OXvzon6l4Y8Q_sC(IXxHxjxMx?cL7}A`67TS+ zv&VIoD4@=AM>!$;6w;n{Aq~{$s-#e|wT5mX1*&3nPDn(KQEl-FxjsxhuIL=r;HU<H z2+L|F&Lj*Kb1Jp0*sqc*w}+z--y9&%s8m30xpX-4a7g3A!~Z&5-@e|ypw{7<w#arH za@bV$D%=jTTe;ZlNK+IpSx`HmVTvSe!zD2eOL~VZ^&2iFvT{aG5!kgoE+pID)r|y6 z85NyVsuGesY^WR)t?olwWgA)H&f%JnY)Y%NN2FOt(zR<u^oSbSht0zuki3yjSXKJk z&1IO?T+$ANL=dKsh#{>aDrejwNvG9MPDnP%8J<<$O3nJ*N9;iS-GIMgj=y#ysQ9;& z_<M6Q`v^@xt@7&;k&DC@DiG(VrbXwx8xf|epKh)jmqd>k8X;<i<PsZ7*u!E^i}4l{ zEGAh@vzTddfW_B^(K$mSYICPGQDUwb9EEd4C5nEpV?+~CiuI%IENYii`bgu##nQgp z0aVE^2jWNch}M#IO^j-99a3h5_BuKzil%mG#1^hwGc=+^?!$ICjGM^;>8p3Fo43?Q z)rMfz7&)IPH*$*>+~U$F5%txbhDQ9z+2|ol6^&{`i{ua=M67CJwV^ZF?MO7bcYJSX z#3&9to{2Lj@Xi4N*(2^Wq$<5tm>C`Y9@Ulr$SLa@9UDtFf~w~TBt|2mY3#HFbzjkr zyo5HA&>NYxq6x~6?0MoPXUfWGoc?1P;f36xaz=M<AbUezAKE=AOKvAeb{)ZcNp4E% z2-7}AXq9Z}P)Umst*;oy!|#h%DmNwDtZSn0R)$&8`CwA0RPMS|!N_{vb>3MymtyNA zlJaLwR5(`{jSH!!TUGhUy0xRWLl;ZkTr{4u>XNHvk1Eon>@&Gw8zGU>xJWA2x!)-l za_fv|EOB5VC8Rpk9Vl$5nsx}pdApqdQer9HQu8F!#eGLzzgrhn6xkLxdePyB#F;Iy zydM!Q7EY6#^U*mQqTiFQnT|@%8cDkoazWz_`oioIsq4042-JenwtbFgQM$q?jm}X{ zRBffMqu&crrm@!SA_{Y}C3-6XK&RV|xJ23jR8+-kLsqC@qj_)<-LhhqGT2Z<ArWO0 zoKtqgA(~UJ3(u+~ekf<QC_~-5wl33neYmpagnQv8T>QTq(>|wA0#p0)z|_uAmUl(D zLG6rsay515KgXo3q1dSCUn8@MYT}|o4%<zQtG+jQwd#-~k)HI7&Jh)Z0ZL9wrjms^ zS&>PTTaf@%m0)i@#GdM#a7H4edoDxPa1BR9zN2Ig1<c9{mCBN;A*8BKo1CbS5v1!+ zS4`Ism9E4>@<KUePYE+5AYm$)y7Lic1y0g5M5QUIB;6)Y(84mL&8&#0VHvl{9&S}c z8gH|z3<4)UWp|T~DjChg?MaFdZ&Kh##f(Vt<DVj_f~!Mr7ZqjEi~Eof(oP06ryEpL zn*Dl2m`R~eugDF<<c1PWTS--05z^Y;SB<(|H>44Ct{*1XixqOq|M*(DKCnE5OUPAE zAX1F57S?Tb#T-(C$s&F9>ij~Cqt4!UC>|{vLp%I0b#@&_Y%R67lfCQJ-XZoP)ZPnM z>G7Emqm;d#O4f%$cc<EmsAL%TsJ({l)lhrg*}GTm{lT6nkPu@~Wj#s~VvJ?)IVH<y z?+&$hLlxV<2iUt?$-1&vPwn+%uY=lqjlBkH?>+V!slCzH7>4wgLySE3WHc$n*vB4! z>>YGuw=on^N6GGB?=H2MmYR{75tp8rmU(Yna%@@#Lbau3q{JpO_S5$M9-Y%uU-rdi zX7p&CmX?$l7c0YG89g%7`z8AN_h8J(m!1-v)T4L0&zCtc&DSF%J+6m!HB3&8&r0$& zh%<t!nMSqrDrrHLO{4Oh3Tf)N5y!Pnqjr}XX+hVR#x>VgPP^gJVB_YXaHD3L4v1)5 zb*@WgeN7jx2@NtrIqy*X#xGI%4fzGDOY3Q<{V%1pv9=lZ4*bHi|CDFHvZ_d05KURN zx8a`sX0{MYM%Y`Vy#u9q1(ON(o~WvpN+#JPg(X-G3+X-i|Dcl9=KtMl?`CH&oV|yY zOp2uxxnMQyruXE3YbBHWOW_MPBt7(A3-;P7Su6gF@4-ftv)7Kj$CNCZ|59m!jgHP< zXZAWNSy%qcU{|ow-P!BGo}^r`su(f=7Hq`xU+*Qb_q38F@n7N+Y>;u*UM73plxzV1 z>#DuiojpH$&nlVpS|rR8``<me%As)|KToD`B=HY2)<)hG+@xQ<r1yOFZXGtY;kY}B z|DD()yIRS~I{QPPD9zpc!v5Q*CY-uqdQOEewp^IF|Ay?PJAZGvA?ehYFSWREEN1Dw z*Cn-F)pq2&7iM)!J2N)B%Bwc<Ty0Sd=B71Bj6XFvB<Rv5iC0u_Uu<TB$jA?ag8Y`G zUusf=<ak30pO!R;Pp2yN^NAM{>fj&=ZQ#}*-q$OuPlP0!x-vK@|4GB>9pK1vBN@V- z#UDxEz^y@gd@SSEYLgNe9F%)ntG?E&CT(}!$~oDDx|&D{hzgKMt;$D{xNaUoQW)ly zJdR|`bzVtNk)ZwDt1?7_rqz-LnW&G5<P?O4^od9f6q5{zhCdnon@IIG3`7#mP$OK$ zRu4gccvAbL3q(F{3Iimokkmfqb+aGIhp2GZA1*L*QKYV<64`R1s#kI=5<hWw-84l~ z7$A89i3}7=ymWYC<SIwfz|9JSc7>QG@?W+t58Okp$QJSRqm3Iki)<qM%8l$8Y4{^! z$olTuO~b}g8?>8@%=EbAG;t|gI63%AMrwMdKC~q5yT)`)NKfsrh2loGq2jaJY{@5= zNpdffEVLwUYHUHWh3s=B`;mM|@Lb6SB#{9rkJ>MH_j@jr+<%!Q`ZCFLmq}hh@)Y-z z5+!M57_T9zt;&xr8II%@M-uVKfW*v*hK=J@o{F0W1KbQF*yL9{|MAo~mAaxiu(nUF zyDK+FgEaRl(e%MVL-~IjzYDGRR<|wz3#_Y@8ztU_M2@sSB07$QVyL9LL|p}_a2_|| zNTejV{<N?pu0PKsi3o7>8j|n;e{zvT2Dm9flIxUSP8t73G9^IrCz8SdNll9XmH<gZ zBp*_~fmJU$v0I-bH-rgDq*c<fXn@Yl?4`9Cwi9V6ahC0;v9}G>doj2{t*TAAQG0&N zAJ^wGNTNCCrq41Y?U1-`zD3eCz|DCi9Ru84Pf_X_;HEJWxytqDX(SSA_g?8pq;+)N zypKd$I_*Z)<)%%Vh9l8+xj}knTttT_o=0F{84`DKDWy(tR<SXr;*V^~jiIjUs;@$o z{o_?DtgDn8b^T6DA_u0?ATFVAMzbdBjFi0Kpq^^q`|nq-u#CGHZQ8}eCB<fB7`@eO zVM=^#db~A*sO?AOOp(So2N{X+)<I@NnP1db_)_9h;}cW*7zlj>m`TlyaYXnK8=u<C z=b4x!2r*eHiCp80=@*-n<&)ccXD_XjDp+2*6O8i0nAG0AGklpD9-lK}5>pa00|api zvFS+TeFH8Rr{JYX`}kCh6H_u%GZIu(ZK)GmR5o#ydnuC}AF-i(%XG0V$?#!a$6<ck zX)V55LWyg#FFEFwbYE;zQfi!iEC#sB27Rrb!A(j{?VFV*V)4P7jyf7*#KfliBsIw= z%zt7Km*9)*8<3omY*#*GCA1OKrEA-mwsPUqnXz$wpNUP+(6SDsVVl?tpFVmzAuBUJ zwSS5c6Z7cP(PVy-FI`=QAj21zm7bV6(7JydAy4!f5$#j6QsN^TH8LWeB!xSWQW1?B zbC8;8ooQl3WTo^cIuZXE%Lt{H|HFC9gUgDQb>Zc5>w?RY&${4pxqF9yNM83=|K#95 zd12?nfAYn4<Hkl8@d&ieljLwjq~x*Xs@$oD|9q;^6;DwD+W9i#u6V9}I(KU)wyB+S z<?m~_@dyad6)*7A$}3#vJ?o~R<EuKY>h3>Xt53R@UZH}!mtN^);H8&ofxwF|KkZzu zl$WZ<wkB{cz5JA_kap#B+7%_WE1}bFc<Y|7b@w%C*dpAsHEiCnNsA^enl)?e5whDb zGO}5-X0T!NMlIC2o|WU@u4;Tfq*?Fk?*$p}TWy!O+at}17#pYEc1^c1mBS2g*GGgK zc455G>Ydo5om|U)lo8g(+x?L<((q0=s@>TCl{-%tNaVS+#bL+j%AC=zq;ni)bdK_N zMC8n<ehg2Yqk&D)fvf<+jm|y2X1uubVFI-u5Ev2sEA*O=;_e9Hp7vUh@wrUDvPrue zWkg1K4Mvgg!N0Y*89P|JJ8Qf17)9c)GrtGl4ZN>WIZ~SfmH{E|#C&)Ucb{5r<%+1V zs3<4v#Sxph8-tt4<=uHq0&&-q-)zf`9IFj0graa?yGPo$?$)tu#|~}ougkx-Pjqcp zH&EKCW4k9?Kk>-Zb;Gf+jNkcv#ILInq)g-g?;}mAy<X1fF`!wK9_^&V%wSW3YDpU) zH|{rDRhQsyF|K2r?$ltz;S-6h*vd%lof%%g%U$7}(lQg16JMo04sT0am`H<Ug)I}d zGTM90cEb?MUre>8{OZ)=pWe7L)=6rw*rbe@-dQPemg#V_ajk8;DtD5~))rMg>{_FG zbveC-QISqT>N3MLI#ri0X_VzmAotuuf=QXt#u)=g!G>SLQ4`X?Hm-;DU@a(NqqF0e z^!+!#2g=1EltLh#2F5ImTdo`jETNc;xY#5g<22WXNoBRSz$nxp3Q?RorlMe_0Ha#f zt4AZfmS3l!0hUi9m13)<13l92j&wjwyjp4}ZhJb?ftEB3X*kkxb;aNK#AKCRhNPFD zpS?-^B)zUiAbBX;In(e<oG(C$&R?(#yaZz*eG`8gFyZSk6n+9Lzy+`pTm>t`9k43= z8D0$~9jie}?>gMOWx4d;Wu>=tlWz=6?_QX$88M8sreO;El2vMl<Bh!qrnVFq3H%}z ze|0TG%hjv5Kqe9G6eOO+WTvJmaa5qVS865$+d5~KC?8^z68oei%fdwQ8P~=sCC`lQ zMb3*%?w`f4Q&1dMSSG{fy2$>a+`XEbqMb=+L1(MZKDmvgwhmNEYD`8#YAUw1lx{=i zS4Gmo-Xwh_zhq?kFH2b8%CAUxJF-TwF>DH3!Dg^MY!07>E#Uz80DKp=f@9!=a4dWn z%F55ya2sq3CI8w%`m08Jcm^`O;Qtdo4rL&yBfJhi0q=sH;FItv*b{bv8SrVC1-roy z;j?fGWN^YS>)W1(Yhe$#9=-&nJj6gLH-3JN%axlZ$Qbugqy4SC<t9edoJYlk<H+8w zTw;Dv`K2yH4eAo}QJCZ_9f{QRfsWphqGWG!{{)l_S)&G<MP8k9E@8SB-UhFO4WQ_w ze~O0`AnB;4@_XP4@rajV^q=*Nl*K46FCUL^WLJzwXHM9g++X4$-SBpnQ0lqrJVObR z)br+$Ar}9$Q0jXel=?2=t^y@~ukb5hzXyvuexf&`-T2Xy)%jGeK?uj0y<IuC8c^cB z4Fax3$Mv+Yf^tuZlMH@zwd4$=s5m9Uo00W}_rN45btV~hgekBGOod4>4NBNwf&Y^@ zKH-UDqyKFj8~^X(xRfwTS~HBJ;<y4z91Eeuu?R{Wi=o7EC6qXpK#AijC~;&CinjF8 z>g+mORT|hwIXXpwui?g#u8GdaSZ2Qls)FjL=GvPl3m>T-R@u0}x|oBVf`X{Kp|<~O zd{HT7Q4YEk+y1KNauni9sL)P9sacsxiBt$_0&|fDHm#yrMX$u+bEhB)myE(_Ei4Nq zW~+*>R&Xn2AAwA3VVX-{N`@?4mnI{M;1{@VnUhfZKHPDxmxR|eg6$|6GPXBg$68cK zG)}e7SB65ox;_%2(>litRFP=mIJ7MRsm=8RTn@k>AyAIX)TH<r+qK-RqjRQrVrC|b z>&1CHM<~v{21P69j91zjX*dz+6qHWKRE!%FTh48hBx~$V%7Se7@w11?ud8VIrF_(c zQs?Tx40tPi6*hvCU}KmMn?Omh`{8c*0Q>_!2(RH@55e1E6l@4v!-rv8_!w*lyTSJG zMc4sKcjR&S0qh9J!%lD&d<t%aPs8J|8@vRcf#H<*?vQrPcmdKL89iVkd<m|Bu~4Q= z<KaNq8%}_UumC2(RWKEr6oxE#J?sa=VSo4#900q(fv`7x6}}1w!S~^t@Jr~2)JJ15 zTnC54-7p9K0N;hblU{@QH7nOPc1I@dP#1oGUC%$gi5;#gMQT4^dQxnfs;#th&gQAD zmIWTpxs1AYZEC2Bas2>UBTpHLbbKN`t$mV24Y12$GomHoY7QlAEuqBWZM7fRmncCd zZkO}>`wDSTW>}2VI)>xS-Y$=Z1gyV`hPK}Rv6a_tNrLSYlyJx<dR26$Y*AJ`TEnIs zw}I@-6te$G_y`oe(jI;ZsTZp3N5k11cYqSF$DqW2G{1+-<zXLWa?e<P7ymi_K6&1z zAJ3uu4>Qx73btJ<CV<z5mGpBn-IKp|o^sxh@X02QrA?8oGx3oyKLu+*^4L$R%Otix z3O);;hWO);fzLsS-}6w?;RL_({jpbr^h%9Pc<CS00TrE^9<S0M3Qz1!0%vVjfhLFn zB|&;k5-ptuiSYxJ6(5eolLB5vKa^7=__0a)Ny+l2pU7GubFXfsY|8q`29Or?LYRI; zN88%<Bqs{_*_*^ywwnCrsXbK&WQNt~MLI=5A8ZK81OJOK0dh{pdHk=yWY`a;LJ2En z(f>Ilp#JfYc_O8Q(aZj=9Mksu55YI!1?cBb?E7pej{ppTS3~NlU;1#vpfo!8?U#Ic z2io};RjwS*#6PLWQ~0SxL_(P*v2>BH$2$KQW6$XOzsN*s_azgDs|42VzW5~7ToOLK zf-2xy>7>1rzfwW5@Wq{ES`!X+MkX=hk;znI_3Dz=+8NU*O5$d>6cu|s!jC(9llaQ! z?O%UL`bZj#gtx+vpp3132Bol!g3my7h04#bq2%8;kUTMR;rnnb<eWhsDt$5mO1e&j zlKvCPi}LojOnElt+<h>p7CU+?m;P!lM|v54+X1ZT?o)d%GuR~6h*>~&5*e{EMmjl> zL8fD?A$#4CseI00tqkUxb3*l@ed*RY$+~>b1@vFUcQ*%gr(0z0aH#X?a>Fc}bCXCH zHtC=DgdeMbFh8WtGATK_y7p&+McX~z8lS-VMkfEX4|1prnkqX|kG-x%FV5Dkr3j^Q zsEd^@Ft$l`SwCO$Nwzxt{!)8}F^hbayqgPYQ;Y>r^ygxD8*y3+?|{o;6SxA3eO(A; z31JcZ3>HI4gVj(LD6D~{a2-4cH^5NByb;!fn_xY-8QuwZKuLjJkg)+{FQkue?1Mh| z9ef*p55I)_p`^h<xECIRzrr#YN<4pqjKLYl;LY$jl=Ax>VQEuNe>CAbsXGmz`H$t- zZUtQpA_;GA7403GZauQ-N8)V?MS~1S_CL}fQskuC>U?#_e!`LIV)*|{t9VP(WW1cs zk4;K%6x2mklw3f$dy`Y-i)>PNqM;{zVx>vZ3oNSzIO<25vsL37X~wOx+E58PyMjha zN%lnG-oKFwQvx!#WmC@F8YRJOXx&?n-AdQS-Xw2jtIO|ZOMZs3Ao+b3imp5drOwkX z`5%JR4K=oP5lUS!f*4x@EV)&E*bw+B$Dt7YX;g%gf|ViV-Jl)wOFGex`S(NWk!t(s zYpAv_0!o`#4@!saPS_pZ3wyx^un)WsO4>Dp!{7sODtr(wf%H}U-@?}LC~OP=hV7vA zJK963YmY*yW6|&~*a1pee;i7k*vhYbn|cG+Ux!@A-hu<`gwv6Yc_k}0B{T6=UrZ9u zVT)=H;|hBVtPz(F9gCzsj<4m{DM);fKBeSCxRS&(YRR~4nk-82mRAYwo&4COmS~C> zdg#+OdXS6Vb4boxo5V@B8~LG6)b;{tAo1)0MNU7@FTVGLqVwb6V=x|efxV%Wy#$y7 z6QPuim*F6o42Qu~I1;A8uVFeI2N|pM&xMRt`WHd+*N@IL(5ZfOq%jam*?ApG*aty$ zneiq(51E$oGqhn0fz{w!Q1a+)_&ew4^J`m9ze#w+R><ZT5}23Dka32;V^|yFv&Q=W zXW6MUk0s2?bP3E((GlFy%3zf{4VB^u2^8AhJC$Fe5A03CE!$Q6Brjx}LOdld)C0e? zV|lP8oB_q2nF%Ey@}b0cHk5RkOL=cnE?pk2pvRjUz|bqCiyEF+<vJf9?5(1`Lnlm+ zH%&nz<4vMI3)y$oml}U5MRfTf(iWszlRNcEmFGRky@N<n#_vI<Q(BjCk-2HDhf*%D zVBShIB-AjZ7_!N@Rx7AIWH?9FUhy&-X<=Q7i;lU}#}>$}V0!AK+)Qd}VD>k0BvPBb zx0gkOU-M&=Qjq|4BFWO1a;;1rCl_hAH{o^whx#@wPKilP?-Qe6@SsN5UJp2_6Gtve zbL8B>dy$-!=vV>gr1)z2SibFAh{N65W)eGcsB>L<VxNS}m=qs@&(L!^!<}<UJ{G~m zCuXE6qx4-zuCGxiZoo6Yb3$EU`(-zwjutzKyD2&~*rU8sR%PqL&q`5)`3*HLwirs% z(l+?}!=><TxB^P%7eR?rF~sgN*1<~Xj*YN3+yrThj4dz<ZiSD)-EbV-2f3H=J;X2L z2Z$TvM=0&ket11$JqVfSF@A&H;bHh9WK7JT1W&+MAnOnOes~6c4$ne~)1Pn#q%HGH zNeD5qB_Z~s|2N3kv7dQEqY7mH)u;+(aWc;@_#cNni{Oug*TQso9n6L|z)_Gli}=UG zaF_@0g)1O!qJIs%4{m@m_a*rs1rI^u<i7~pz#1qq>{NdvD05e>;G?i3lsT+tU<WAU zZ;!!#Q0BCTK$**uakwYphp-DA4ZFfzD05fyA!+8{31zP87uX9Phw<<t#4h$<O~vj5 zYrq6p2fhsNfuyznS(pk_U>Y0*Nqhfbm<dP1Ech`T2tS2`-~{*voCV*6YhgD00S<xZ z;80kB@;Dsc3O|6NYxnajZ%;_2yMdpynH6gBPjBV=h)VD1(SD_OMaS4%MSBO&wS^sp z#A{)TW{XC4xw7qy)Y4+kD7<LA?#Rn4+xp0)MfVO@g>&rD>UzjpwO4XKdy_lJCRJ24 ztZZGFw~~1Gg?GXv*a)UTu`N@fq)8f-w3|acD&KxDkTTD?e0Wu0+UZxt$YQswOdrb_ zdnfU5gFGFil26p2y#*$px2OGd-^4T&qSi^?)VKy&IM?gc2-N5U2uow_x7~Eit*e@j z-YgJQO<`9~YdxEo!c>Ix(c=;6d`L}CMDdIERc2q$@+Z>Lef?Bh5yctpb1z@-)O0=5 z(gUIPn%NrsmKl`<$BW(!HDn|(045=mBBZZpVHd0NMJ8FSWxW&A(csdYNkgY)z7)69 z?%qU?+DSoj;v}Opc4zw}CvwR<dy_nqts%cpEO{<@EcwWozM4zt4M_e6IGzEYfis~h zkx<fnE|jsg1@LpY5RQiha0*-u>6aTz;10M9{sar*5x5G{$1zsJV8VcIQ#NBMtika* z_%FB~ioV|npM;wscCE1$X2R|84Y&hhXBs=<`|w*h3jPSCeb^7NyNsV8ZIAIYEP)3g zZHI9XqWcYWssAGU4Wg5cBQOFUgVJ9+3DKp-Dad@jaR$c1a}b?nu<YHBZZa-FbdT{D z{1E;PM?rM7KNlLzHBN&eQ0h)7lscBpue>d|37O<gDZh$Ws$<SHfD|Zut7z{8=p=6) z5_2aUR{?`e9{rKv`XFN>YLjqC374%ZVV2{oVQm-&rKnbiQdX{mZ$R23{{+Z<kbf4e z1((1Zpv37$sPqf_P0QKAOOc69y?|e(z_{C*B|b4-X_RoB*jr%arFSn$qiY8vmm-jm zT7rQ}K&xd5Vzod#(=K8MsQNCxZmBDp1mh|zDU&*8uUSbG$JQocmQ9w@i&l{>oH$B6 z>cX0^9&8TpfX~DFP~6@P--7o*>0{grN5V)r2R4S17EPd}*(!eJ=M1E;b`8JP{3-{g znf3av)Y$l#v{YFr@?TQU)>7VLBZEbfcv@Ko_7K95dmAXxUWnBHPC@;wnPf>vt<O{- ztYlPe)`#NS+9V#b$#}?6wMSfux5N#bMvad=2=C>XxkXj>T0<YlZQ(1h9h5To2$Xbv z6n+e&;W*d<PJq}(s_***EaJEul=Q<^Qt2!@tb973Kqg`NjbD{3rE^AXKc6?9BXMYN zfhAPZIf_%|(>WSh`E-`1PkgbPKIz)k<~WVEy;D$TEYA*zcjXgVvO=;)F4kFbrSW@- zlWbB}<;JqTNE%2yW8lrOCu{&?VHAvqu@HMw+4y~+^mApc$w(+`O>$up+zki81Mm$f zY4;}l9g2NjUiWP!QcXEm3aefzjh&(UEx59`z{K?$6!I*WN}eBa>rHJj&<-IBTxcPU zw<O6gs@4ar$~ccW(3+D}Z-P{3m>!F_2O|S?thf954vkGDKQ_tO?$FLyxwa?Ao~n|e zy2uF#=c^FKrSc>Rc8ZjNuI{Dsw26eKvm?^Rg!jgcxG5twvWe3)$EiE9FaVk7=G4>6 z2T{Kv(-!k%lkobX=aLK+sZj{+NXfm12Rc$V&WFg{qUjB2ZG69<t__=%;VID8+lfk& z?~$acP<)L<=R!)1vex86spi&&1N4Q{JraFkuIECvwBL@hU02TQ6vG)d2xU^XR{V}w z@?n%^DX;Ir$KVGr9exBa!B1caZa;%J!q1^(KWiTRE#OzM1N<634|zz<FS#@kegh{# z#*>UGuoO;(JK!|<Z#V<WoW?9zorKGWx57EF5u69<+ZpuX)ZE1an8EQvNFT~5fb^k^ zMQ{w1HC58zl{HoK;c_V1T?{wDmGB2x0#CwHD4E5Y4gU*pJsbo#!*}5pDE->4a3$Oh zv8jw5@b(bqSRguF)_nTY;9fWu@*tj{^<2gekZX;9!y|A%3<<@agDv3!*aiLyrGNPw z><bUWH{mfT58BaJ^?wCV!Eo~NJiHVB0q=nq;B1KB{`oKzijHE8^Rl%H^N6?DK{Mgi zSJF|or6SLj`I2K*n;XRi_Eyo}QKs5;hIeV0T#=Pb8|Vt<QKtZb(@T>2?p12#n+k8W zk{RrK^o^xXhO?_HZmjAhNoB6>$UOZU39NRgb&6aZ=E&>@J#eN)W)w#AV-x2s9Ov%6 zA|09MUiBTJ>#u8bdHXby2eLKfXZLBUkY|!FVNhavEqny>z@}RNR|~$x@eMEm-Uy|x zGEU)_`J`K64h)AM!n$xAjDU+_eOLnThT9<H8vY;Pz3^vvA3Osa!mEfqkA?bWoWB{o z3ATW@zy~1nDMoA92DX8nVLQm!zYz_k&(i_Qdg9070N4o*f;?R6m(=YJ=fdaUGWa}P z1AD+-uqXT(#zMxsj9&0GjE5CSzXVtVCc<#|GOP!aAZw|ORQLkq(N#a=Hbw@Nv9e6~ zDeMoY!q=hH1;%q!ow<$r{b)J69=)f=Tt>oc0_%(#_t)zp=q<;y_?>s?_VL<LX(Xz> z1=bxYU4Bk^hh9WB9GNb(x*&;6vQ)Q9y2TT_R$40EaAYQ6<0r6qPz~nhBG;CGa_q~g z=?tQ#t2P(0clJ-bkN|0KQ?in+@gi@%qbH!ANWz&ouL`x#DrCxM30)X+-CD`Ga#p~Q z^$gAx@ne&oObuw=F>oN{ZB9r*WV6Rhw3qQJ@KU`q>WVd}rc>>v&KubII1!b{CU=T} zSG?2voS2~9$(<rO^xmmH$N%L{_fufH@ME(dThMn(W`w49Qfwa;fF_*w1VGOgSngs6 zXm{T5OA5#^Et`ZZ8hXPO#c{cCd9RjO4W;n1$<^JV_v+3Z|A(vFbGjXw%_inqPgu^i zo#I-hss2x-4y;@xwt?E(@?XXvWE)1Ek}<pC@Gdw4iaLE4CczKjYw#oZ9%Ss){{dv| zRP`T6K`A=lKq(r$<;Z^;=0ed?<KgXaB5VaG!DrxP*auF5qKooi3Y-Q-CryV^P-a6Z z2y@|lI1g@t3!&IZi(n{mSq#N4Spp@_OJO6p9Ez^taddwxSPZ+sQrH8ogYj@Zl=1ov zFa>Ug{UEQJP~$J#p^V$}5W5<u-woGsya#>{zlDFm?;+1A7>phJBjCT`gYZZAF#HL& zgFnL#@E6z%9)waf4#7`h8O(=App4HSgN!K|$01`w#t9fke*O-xg{NRGcos4SV4R0i zSpJ0cJ&nI%e~88H9}a`yJ1`i&3oAm=ot2>2C6adK*N#ZMs&lR~tQM$a^*F#ksMlPs zu{Y6X)@F@t=X2<_F+_<KAk%8o9S#tA6mqM&q6=kNNQP2+QV+|kQ*qzJ@yAuaq6|f! zcvZU8Cn@!My^6Ekq#YuCJJ&REE3G>hDHV5IT~T}lH$bya=gi9#Q#QNKTHzO)%c~on z!-*7dHVI)o)GpobQv$NN>NZ~MCD1Z@7B_XtJ2vqq4VL$20J8GlctbLh^GuJ(CSLeq zc`t?|EANGCN7dKSzzuyk%8G0R+gX!Rn=&Tl=w^5yyal#~b)Y0A^DAn+4?Eib7RPmA z9=shcg4osm^{_tN2JeFVAa=GI1HKP7Ck&0C%;`0Tk_k=WG{{SYl`gp-uHyIs_yc?h z9)(fx8WNx_ydJiL%%d66P}24>C_3hG*cv_wW$v#tl!SX0z5~0%(eMSh3HE@;;fqk} zPz;p1CjGJUb4bi<(LkyBFC*+9>zX{4=QU)cT-)2_H7$x$i|R@-)sOQ@?n=$^);^iJ zaNB?7zgqys>r=`Dz3y9zwA|(oC3Bw8tBuH8I%IA=44E!P_B4(>;^!@P*An9=aK#pA zT*#D%`((%$oZqZmsnQw2uGNOBhdHGQEbm<AZ<RCeN&@c+8f#+XB#vZmz}_SeWUI%o zi6!qto=LvE3}p>X608qXp@cpQ_J#dnGJF-j4qt;ZZa4_O1N~6O4YQ%Fs~QZYj1Pqp zy|>}da0HZjjd$RA_%5tYSl)v&;_?9$8=n^-spmIFLe}dTAH!t$8GIdn4rM-L6#N=~ z2_;>=hTGv7co62oLvS1nCjR50*a{P26F3RVe8pt=Je&$+U>=lqbQ+X0-3~uGl(W$b zkjc28%==ZpQkiA|*_WP{n#B71D_H5G8tm=z!rhZo-hwRZKLJ_!W<(0Tbl%FVG|5C= zkhESGcT%0a1zARY!jWBB*Ec3wuX2{nZcj4mI@YkaP)eum6YWxN6UA=%GOSHGy~eLl zJ5~QB4P~pzZ=TvCJxOy(*SYXskwY0nS^yt~3t>077)k(_!r^cQlwg#=iEtHM4A(%> zuZ)qZby*wW-yCm(A>4m66q}CmD)lVUHkiioF8C$f2W3p@J1BYmJ(M!R8iC8oL?&Y) z5>|AiaqWLA6Dg_b$+1aZg(uxwd-IeDYq3%^XJxUHByvyoFDoC&%9jrrr#OU{o_yCf zMo)x)tNhd*$c&gsHFz40e3MtMZr1{7`Qjw?*W;}kYm_497AMh^zaY_tQ~G<>y`1Uc zfN@_@)+Yiz&EQo=@c|l8j2M~eWRrA|4AgPf1IpzU=2qP8)y~zB4ZAvai7C7YM5d?$ z73?@N^)=ndi}%v@>o~eYG2xEP8j4Z#X9%rm26i$p5`YS!5?s{|h~m`=nWgS+R}4;{ z<X4~D+nban+1l{C*^(ci>`D3h4aUO5Fby7o+3*+?eS89b3QxkR@D$t#&%;oH@F%PV zFTgwDU+^w?5lY3s1ZBK6_$sZBL!hL3W%wSf0zZP+KpA(f1|^wmK-LTyHKEuZwcx)9 z`wg%Yyb(SHZ-%eITOeyzj5_d3cq`0<;cynb9Ug}D;NS2LcnRJGd7j$18#agc!j|wp z_#$iwr61B5N_Mt_Q{aP;IdtP8DE*KqxC^#{Cty2xR|w-VumOAwJ_b9&O!x#G1)qeB zK^vXnbl3$lwrg~SLFD$cP;&i6$atC26Gp;bkZ~&`4#q$q%z(XN4ork0<a;W_jx=6@ z*o#I6l(mkTup=A*MF&Y+6<w}fDk2`$ImcQ9<GTN*gHkgSc&b7f;Ciz2L$0(pj|!r9 zQ_Bb(V~uHR&8|pA$>o~z`e+KW^7=^Tkwi(%uPeIDo}UpPq!sfv8>;#_GPidUj?7gt zvLH{CldEDZKQjWf#*L(fm|ASolJ<o93Ry(yT7*%^b#>P(PNd=M?8wxNhXhM>q;?kA zk@9LoZv#1uns6;S#U@HfDy)vFtYD1or4*SYloqOml1e6)mg_K%80r3tmZ>C>%f-(G z$EjRy`6(kF?)9<C;Q&Xb9O`G6;{%0(n&~7by?RN?muzkL*?Q?s%A=GyKWqlG;UjP` z><WiK9~=rLro*7*#|StHegKOhFBnzp@JGV!9DfY|fS<sMq~d2V41Nw}e&`Dr0l$QI zz|rttm<vVKj)mRec=#He03|mj!bxy4ls?pSDBaaLa3!1zH^X^w2V4Muh6~{VxCqJ^ z@nZNpTmfa>ej${;RuK$?#ZYp7JruihBaDQbU@N#8J_)zLo^UJd1$V#{xD&n#cfohz zZYX`QeNe`dzlHhmJ6HmLfZO1HDDzG~!DH|jcn1CouOa^q!7x|`rEVO7Pr;+`Y4|&2 zeVcI_ivBzcN5J#&3-}k5b(k07TxeF*&p8J}(MxSfi-*eTC22pzt`jq+W_i7&-~XeF zbpOQo%ml5Cdg9*R0=1DS5~)ambIek?rG)Fs%`miHQ>QH0`pB=kUDQrSW_*8D!J-gN zuB%17P*2H3JL$_^y&x6dQ|Xkc6OPQ)L!uT$4{6_23<4C8be?wcW0US+N2opQufiru zMjx}xSX(7(07B~C7Jl|7X~^84dQ`H+65dU<lXOLas=gaGvs$Ov06vKPKKM8!V#;oA z2&KX|fvJ%C>X)@N&7t(&TEc1YemEauZ}=tXt>JI54HT=U9TZ!Fdal-{VVkS@8xqT3 z5BX!TA>`hEDG$WiFM0nYlrj=Tc`UzXMEYbmaE^7o#`S?^M0N6c(P3tc^vuOvmFFBJ z&FwAB-l1I&d?HcJ0E(KFbk<`AtSIc`(<{KcBMj%)DJU@`Mm31~vBaLpbV-n>0j*|2 znuG*SRHqe|g-)@01|$v9sk$QK6+$t3Ji#uETFyI!JaU|SOPPA{khmvr1LX4NAt_rG zk%#l+-6m??qqlikPNH_>9GiGi6^f3P(DmkXiYal{J1&s9LmPS(Obuk-!Y*CH`pClh zsi>&ZDM#*=Dm;?b`X+kh!5f~ooO_Hgu}PX!F1=1816vnu_xiPSb&Zq(DdW=j%e3Sp zDKk<oK7v$XgRus+#^w{)nB&i&l=Uy5B*i%RJRA>`;6ykW($=W;^i!aWPhcCXaewyJ z`g+Q}8k3s|W!z#GEQ7P*IXDMO*`Eu83EM(=H7tM)ApK4M1CaH5{s-YQC`qvb$~-{{ zd=ajOGGDL;%KShn%!2D7&kLz%E_2`}j>X>I0zZJ;;5bOzsMhcAgx_&Y{Z!)|d!V#O zd*KE6EtL6$A0TV#<(+2!+HgOt3x9%A*M5dlCr7Yf{u$v%$%~sf#~L!D)_<&%sz!c@ zQ+tzAYi-m>DGa$B22?;P+~h_;DHK^gGF`{?=$;sQq_WqYU00=>S?D;|7OlQWDl18A z6~EqDufD2EB&lhOVv`ejF^yE4D1@G>;MB+#$gfm`+m&-~zauQtaqnsZZ|$IH$m52x zN${efr*3&&W^n2W?NU;tGl$+Pr@M}U-B<Bk=9AdO^X~9JcrGP^O+4=j|C{G?@i<3c zB6>pVmA*uxE|LUCBJWX?01QCl34q)w&2gkPhg=x%%G8_b?4{YNPh6_wgA=trQRxQS zEO|yoZIoNTl+UxU9y|{v)Bb?8J;tB#3HUb@ok0CnW0}-n_1-gv5d1@sUj-MyN>J*2 zRd^awzt!3#>`uRA+_kVatO+H1utWXN!keM!v0LE#unv^*qubzASQi$;+u<sBCzQOR z->t^$?}3sdw3+@}ApLNEdx#zD?+Tkju@UK)tMvsf;oBVF4<%b@WBp&ic5ni04_89k zT>n=1IQ$KEf@k4V@Qz^CN5EFFE9?l-Q~sAAaZ-Ke=iyq8Ux2LpHeQ0~VGImGC-j7s zU>ppGJ}7<X-moP^&#8CYBtp?Ke-Y>M?Y^vSx}I~abv9~WQOCsb(jndQ{}(MIWh@u3 zw3g9&KxCq1uH}dMCw{3?pYO=rvKWC(>j4I=l&ktkthU{GyI;8DN?VEEdfSn6-}7S= z#Uctp*AsWvuKci**hTVVlWL=iZ(RwinuRFuIu@7n$U!!VSrl|DnSM}Hl!Zr|X<>JS zIwE@LQ7OZoj<B~@hT>(QR?;si=^E%|qX7F>x~d;gDA?qB(F8iN+d1<X_E6VJ&Ux#! z<h``_-a7pXWkt#Z?Y~;b{3#SW;xjlLj)IcJ6X0<;8CD@xra&3j%7fG^^=zr6E917R zy`2xmrdR;`!2&n}E`rkDE`g&Vy2YOhF|E{^p<*cW3oHK*dv70CRk8h#Zv+*O7FbkR zRwu<GHAO|mhw7kc$3i7V!=eBI1)m@|D3%WxXb@UfR#sYe%d6g=v<FkO!Zf8auUWTi zWjA`f64te{vRmE0@AsP7bM`qvW!dNT`{TD?;#zynnl)?ItXcE0XYT{J8*m38$Jw2L zQD})>fP5~GdX-H8d>OC=5WLbi-vnHW`+orPED-j}%GiQ+fUg361h^mYV?geAeFFG7 z;6XqOW~~S0v&Tb#JTLS)V0S>QL1o?cHDCtrj{r^q{1%YSfjNMz)6nPST;WfEPl1lL zs`P2h!OPypeG9;Pz)-;N0mA^<r!jXZYYW&Kkk9AC0Z##J1IWJW0%V{55P!k*hFPFR z;qO}fbqMU!=z!UH-d&oJm&^AtrAJ4C&A!5IL}v0FA>5$&dnIQQv7pR^SRB^oSM1f% zU-q^3_`}u`wpLJrcq0hT&Jf_ZgOJvf3|v&H`L|zyR?qfaHCJUXvM<(=zDtGK?RlL9 zo3P$^)+*0~qXEa@p6@PZ0%FgkYziP^yv$8;&O^@Py8&s-2k{qdOUy&%3?=t+&j_@o z{q5WwywF-ypgyukGuT(4ExBy=ASrO!?2KNwBb8kb7tQPj4A`YN#$Z1##GidpN7|w- zV2&p8Jw_Ms>3|ek1lSo6XKKp^0Qvw&1I`4z25=T2m&&Dp3@Ld2EN2X{S1kM33jk@O zedv3^@502klr=8TC0ZSuw$Y5-S>kIo5Mf_|_F<LxA}OHC49WXJd^nPxRalfiQ?}yj zK>EHTNm<U%_j*7MG%q6}qo)slqeB{hg=RUdmWec6EGm!Czr18_+S3uv13dU;r0I5G zPazt(FHs7L-j`_d6E^=wIwljmD4+~5P(URpza$_Ynd3vjqz1gDfGYU2i>uL=eQO!$ zs&6^EzH%pf!bhJfRjL4!Go<2EjQ!Iz9q*0FH$Sje5g%Ftn2Ge;0a<yRYf@tb;GMX? z7w}2I6@c3Sv41A-+}#iO9qu0hYz5hW0gM8C5D;@U3v(#hTl^~^&GRr|D&Ql4d4PC6 zQC10v{Wp0Ay#erX+&=+G|3rK*Lp-;h20RM55wI0v`ZIutqda&g=SZIe<TH<LfV5&Q zU?L#K1$hU04<Ps2Fo!F{dwkZLfGy!MZv%3^^$uVj;QN4hXT+)l#5sEFLqME&w>|>g z3HUJ}&V^f_03HQA1Q?FKf^nv-9U%4zrEitPCc*ESa30NmJPdzlJNuTL;KUPz-|&u| z9eSRRWG~P^fMR0IS)Kh<%j|u5QJ#HKhrO^9dWJk>CH;KN<*8R!K*n6|eZ>HB?<*cK z4v;$c0%Y7^{0y!eX_WCG{@hK~&Adb70f&7Bh7Hy&1xbN*lLv#K;#3;rMqbmEwFk3+ zkmES>$nI-j)Ri`92RKa=`=f5uKLL<77zo%25F?xPlZya{<K6=}0dNQ)^9}`^3kdtj z`EBr&J%D@Iyo|OO0Z5z8#$WJxo|8diJFq*S<Fpx%%EBG6wHEkMcL}>-HdmniXal%K zfc=ygs4*AqXfBpb8-xO~t$AS#DWg7UgEH!Lxz^nWJb10))V)(Py5j@H>Z9`9V}uNI z{YJGJ$9_%cE40pOT4%J4*!$OX?%bTtz5jfjGqlc`TIVdS^Fq`&A!xsU3}_MfOU7S} zQ)l&=QFVmf#0@vN>?_d79RFy`TRX8AsjXG|3;aEBn0E9Tk1Yz2dgQ@5S^_dA@ahA- zsT=O)eWbpC9^Cf>q`v(D>HF{EZ(vZpHi33N{+_^Jm*(n)?**6Ojd!|FCiv{Dam@;m z<g6KMTMC+Uv}bM0KnsWv3^_E5V&rFhIo&0dl~h#Bcg!R>2~@h4JpnN>7XD{0){VBJ zp0oq6i(w1a*8|uWFcI)Vz~O+5$=vt91<(t4FW{ws_X8qLZ1^eg;Q8!o(4z21zH^(i zq56d;n$X#m0!`?A@yEQp=z&zHO=&-97id2kIt9c##jUdBj6Z1%Dav|kWzQK|ENHh2 zpJ8)@)X1E&UsZ_|`(iz5&l3STpXCLAlsG*W5VJ>a-OIie+Ckzq;{al~brm4Bz8Vny z&cgh-Y!V=Fc^_vYU^(t{0B;7I3`qOu0n)Ddfb`*c`0E|y!<=i=|JnBE1=ydbh5e(s z8|n5HZX<Ao_K`FTo263BB4><$p;LYZPS(Y~SU&B7e`YK%g}&4Y<Bj;)b$}k+Uk^xM zg#F|kEygUV*PEaPkL7QHMqk~Fzu3n0`c1u(H7i7ZN6r3EJ0)#}HZ&LOL|bu;PuEn$ zTj`UF024sF5pXzQCEzH)YCyK_62M7-=%4buV=3Tf+}{TH9N_JM^pW}a3;s^@Fwj^g z<_XsMjcw_}dNX4pUKjr5A(GaNgan5*xyXnHN%b=OQ>oH-JRsW_%V)h?0>*3NJ<yjr z!OzR6(h9&c0Ph2&p749APc87^_2J{7os7SA`0LuZK76uhS0@fE_7!d;;`WW=4eRFt zOHlp1Ao=UZo{<7dKmg}+;8+mds3T^FvQy#4eQ;EvKNRB6zE}_1r7a-(zFcciZ`N(C zw#OrYl>HbW?See=zU_KI_N6BP5oh?#IaxDp1YC`K_=c>rw*b;FAg9r|4qHp?SPs~& zu^ofP_2x~<PUV4&ITAtq<2p?jU??)WK~(k(jLHtPb3mi5GVy0$)Rnes1DL9b+fcU% z;4cEwceVpEX6yvS*d@>8t^#}+_X_}D0bC6DDj@5;8?d>#0eB_;>;UZEoNazn6k?^> z>Q3wYpN1jnk9p9*zF4>5ID{B1w)+QQU!)^e$=u+dfb75T0FDMc0Elr+z5)9H;J<MH zC}17n2EY#hY12>f7d%(^H)v6c$GV_7oBpA>g44#oI9Iq^Ts6zQQR9YMzv7i_GfpXj zd$n5Epud`n^`w1I0z_Pss~&b?-5UTq0v-bF0{9<5_N>Ez0|DXpGFLbPi1~r_4d5ie zZvokc-vgEd{uhvQg&zR#0sIM&{r-P|F9BNE7v2jH3iuvi7$DllY6-~p`2>H#^L)mL zuK4>a{(3amKGU*rtc4>*3b^bm+(w!Xtu$RGSc02}6>1b93PB8R9@;&)c@jW#1Pzwq z2B~rLi2s)&$-Y=mwog02X`0AqgRJ|BfV}}v2D}gu`$%O;fTsec1LB!PSvFuaU@l+> zz{!AT0Nwz|XN9)_o(*_Apc|0(E(_uODDbxr-UN+h?E&oBoW1pEb}SzgGt=iX2oJV- zC1{Vf=Rj4A4{G2<2^ShmK~(m|z==bo>SQ@%q@Sw7HG9=6&;y!{L+5X34(H}{4C+k# z;9_nspc+2S_qyp{sxfi6UVptk)6ixKjT4X@L*v)m=>}<_C}I9DecNNoQKZ=y?N2|@ z{ZYtW(Oztmo`BRK4)6*<KFekM^I7g}z<9tiKt9V|2-qKx^%(^C1mIx6eSkPSQdS3e z5#T|<A%Nj1Hwo}uz~O)%z)JvA07n2$0^~E^LcnCeS%9MeD**Y-cQN1?z&io?%y%W= zI6yorlV`qoMrNhq{u#h@Ks*bRZ|c$yy8{n?e-b*&d<u23;+peAnI+1e5PqUoMSwWS zv#)R)kqE$6@PHERd~9arQS!sP!B04asGd=}4X5~>`biQN;_vdkF?mt*Pd)Kcgh()H zg8zq1oWX<2fyW_9=@ArU)F*Mj0^?e8>x;Guj_rI-elpV0ZZcP!40sXlv9~Pi>U==X z(WU@0c1#7F0ayTd8z9<Q&dwGA?!|pE;6DLN06zxA^G%5%@B{gsw%LG)|JHSYi1+fH zVz%8}&4*`vjmF+Bp!Egsdca=Iwej>^9Ho=s&aQ7?G^oCUPUD$CvmWWeZM_M!Mr~aa zNK|cI3t~V#X)2Zn1P^2wi9cKn9{z^IFaH%<d=TN}-T~9BP~7&y*5MAyN8*s~^eo$f z6{9*+Kw4}7pYof*pg9BvK2FD6lVdoqCgL39R}zv`cE(*6k^)L_{Bl-k9MZo*rErlw z5Adc=3=KIY)2H)i?9|tb%)Sugi+#}#=)YY+Kn#;>5&Whvup0q6=HdCdoU>U9$XI$S z;3UA?0IvnS1CR#28<4GxvoZ1<=3c<}alZoaGr(1Vtou5^p8+2R#CT~v0_X;O6tD{* zp0&ugfu00JoV1<-MBL+R$MS6;#4&kia5LaTpl<=(0EoC&hUfb7jK2mD&-LYZ1^JBs zpSXVs@C(45fV9`kfNfC!-GE&I_X1uD_y%AmAjShZv;7v}-MD`Ta3$cofQ+4Q<L|<t zF?=0pT!TD_zuv#tuQD*RmA*w^v#)R)k+9ilO=`PgaNqJGTR@MYW4l3Aj^qfg{=T7u ztL??j%#+F>#J*TJ`pOA_WasrUY{B||3drhy21uVd1b8(d>|I9Q!+=WxakfIfoB0*s z-MBvjcrW0$fGYvN1H@WizBf!8{(yVhx)Oi=gKRw(G?vY--zUJ<=574nvf*VP<!R_7 zea3u@)(#E<hPCGn9+YWc)Pr_u2^g=5ZSl;Fy0rsj-#P(s5a5Y`)Hec<^(w|+aJ{;L z263|9jBlo1=Ft`S%oXT8tXCw`g6rjv112NZ`@n<ia0+y!9z5^R9`H24GXZ(-;e5aj zfUE;!TJW=&%RoC3f5Y(Cx0yQN4M1#S>!1FiruG$B4+cdyl1x41@Kr1*%DXAX|8*P6 zP;@mxbq30Fk#;s2RPbdn{vfa8BtC4(G2TlieX%aI4Q;{T&T9bb&iV}m>;QNnAVpsc zH~?@6AnTq4NE<zgzu;Ig9W>gJ>xF*J*a#ov!S<E0k_W8z)!0fYND8zP!*#Hg=+~K` z2lzDyBbqe89@-WOpxYO9rY*t%yKCY|)RFZV1K1yM9N-wh@w)Djh_%7b8Lve;?KTyE z{hO(~U32c<sr8Nr-1Ze%{YIgZUK3~!)|>VSSncrmLMDjHNNNcr3m%?5&I?WuMcA(j zO^V<9D8Cf+0J}20#(@|dUg=|0&%S66+O;(xX8^piU_aVu5+G$v2BdxS0O?~>0qHvh zfV5*FAbkzzHyimH;<J1stPU`t8GC2t<Yf4IncrMy9qsEk7`qI-e&?h4D?w59wttLb zsiE-K2xze7pad9<#8n{T0|l7DWXUKc(;ENC#jhf%nUNcePRlww`#{w67Np~%bJK|( z&P@`X!SV1XaPr07Yf`*mQqIArZ~<qeu;w=x?aTIagVIjZuS0wE!adJ8vAyO1CIXfL zGN#-BI3BPZFcWYgAlq>fU<Dx0!>|Uo0CH?x3iucx&%?X}i1UW>+ckFr{)Bs;kKw%P z9>6xxf#+hdezh=Xk@t0YKBgb;R{<sg@_Y=|i*i1OKJ!=HR{*X7#GH@6aUky~{0(po z?jHtx43Ot!)&o8Uh&h*>m%&_$zvm&pwaN1_^us97g5MRp60{yjO9dS83w|iUJ6C<+ z*x65hgCk}_yx$S+8L?_ZKIKz0e0sN^rhey$z1L6cBMw>yT7ZL6px+nOAVZoPj80$V zK8oMz?E2XAhZ=C(7i~h{IR%8LH1T=Zkal_jupeLz;1EEbC89lc0y1X247djHRY1<q zb^|^P_;<i30Of2E;6B{H3-|`$dw~B0{0?wGAlHmMb7Vn}cL7faJOGIE?bdsModJ0U z340fE)+iB>XN}m#cjGVk`O<};os2)ms)5b4G2i~@uAv(|_7&K+?0j)Z@;4;|FD<H? zC@}DPKo4jpndPXxSmv=W>J~hH@thR({SV+dfL{Sp_pfyw%Yg^~4*5jTIR2;O@4|pO z(#7z$Ss?=4FIUhW8a|eJr(~0v4b}bB&@z0p3;E-8P0UNE1M7l+W?phesG67H_toUP zFJ}Uti}bSr69L_T)EQ@urTs$CmceynOo#>#-+{QOiMp8)f{tikfsMzyWg;oKZh4@o z<}*`t3GRiUtIp%^P^F-qgu3yy&fMwh*Ng%k!Wr(Df_oGGaItV2(b*e0tav~R@)7%Z zqRjc0Bi+7e1KKtcgvFZJ6*h|o-UF~RU{AnUz}|p80ddB!>?**1fO7x`0p1RX@2bhV z*aP?y?uP<~LB1ETE#Req9IZwI4hI|s=mksxWE<f9U1=-Qg8LfA7Ap}lCjwsFL|dux zypOozdhpqoqq%~9G08cT8lIIuO`>28@_o>eZK2#-9JLn2rW$iE=+1^~sy&)=erI!H z?QP{k4n?8qQUIO)!Qen&x)$w#w>$M%?E%FfF4*K=P?~IV&c6=g&%S6!w)g2E9MHrG zusdygCEzH)s{lD(;~g5=>(2r#!u@1Gws$@tV=sSKgt2x8;5UHR0<yh*fc*hy0zL(J z9U#X~yoW8{Eu91SBJSq{hC-hOfG)rr0I`m=$^o%{v=#xL4tOJAf51vWtVgWHfP(<> zet>-YXer=W+}{ewSbZ3O!T$3v&=|+|<ImHi|HukN{Ko?x`wF)aWD9&H*Z2(EtdY;8 zffyXW*}$=&JNqkXZqS?o#OWXRB8`0x7uz`wu-SHAD{SgN)|c&k65t9=$L|lxS`P2O zOaHzH(2cZ}fGp#Fz`=lj0lWn8A;1E_zXHw#Tmx7NxDId?;KP6%lOF-(n9Sc2p<iqO ztOa}mkk4G72HXwE-wvVuHv_Vru7D2&pK-Vjv}mOH027;Pr`~3bm<cxf`VGxg2;Pg% z4C>mfPH;1E_$@PZJ{a=H>Ppbnx@zKVJQ-**1piu>?~AJSf*f3IQo4^)L5k@mvvCiI zztY2*H#IP?{WF+)3|)^@`=VXx4;=p=(!>|h4z%@lz)pa>0I3+>l`Fd#@D;#hK>kKc z7T|6``oUhnYQTMfF9ZG)a1Y?SfG44x_W-%y`7gjT0P6s+2K*2(2k;}nNr0aK;#q<G zCJWme@9&6T3;`bej26!fME88aAx-*)J@e#bBoo@$*B^I{Ko=;3;6LgDJy8q2tMKQ! zfQ<D{AD|6`ec&)`PM`P^5S>GQ?}nQ3_ihFP;yp=;1$d`Q=2QO#ycTr+&JE{_*dUSL z0m6CyvhBFVJ6G~e1-x@r#`R%4z!L#a1RMhx2{-`|-w7zY3h-n=`o^h%Y+HOYReXT! zzTmTQ_k+e5&bj!|CVU`!T0yaTjN<`^eFe6^J;*xaEjxS~*n<Os9h;r;+8LWkKSveQ zcoNTcjYVRU(OS*d^Hg5>pLJu~xB$~N{Vdpm_3Z@6@wzi0%j*Kz1Mplx#%p}<Nyh1} zfYWf_9q<moctF~!FCgRXRQv_cfzJkwWp=<{lHaB{K7P#ed&d~)pU1~Ru6?mA)-e>2 zD@$HOpc~5{3Me{gT`NEfZhyuo+M^@>hBcw9zy00du&>7LPo12~Hn-lg*RakyP>0|; zjDXJ63*Xr)qi&b!Iy?eA*xnC<#y!N9_#56t9n6};0|xtQT!j=Q1y{lE!u~Y}y)YBJ zYMPo|P*9Yk1}(bgyw3hbhh0|>==McjS=W|;@tSx!>PG$X4P!YMH6D=tCJpdrzzKl# zwe|Q5ZodT3*v7r_cS#d<#}Dq}QwG0nG3l(ly#o>W(=McXP*UKVY;0>UsM+o9nLq|! z<WURHuRwRUHT4Z{>nzldb(jdqdSvVR{#xG};izx#WA9sziOX;ATX>gB`qq4{bD7rl z*ZS6_P3U?oeaorrAMIO<pfmf{jezW1mAVdG&j<V0F3^U9hkJLIHBkq(yrzHc1($s} zI+tD{)*{LNOl2ML;QAZ{O^p@)j>fU#Fz9NmP!mRWzN4T8bUq%M-D((TAfUBx{}h?< zH#%gt%qZ!EPsvnOsZ8OUOdel>4+nl6`#!6XWM8xaeHQL*f6~-i3Y*a`w*jUC-T{~a zcqbsAbKDJhJs^LhW+5Pdqh=}KeSj|jt^)iR@BzS|0sjI>`>zJX`5^htnoPiTxL*MH zFyK9a_^x2t{eXCf?>EJS<R;qeSYm>+o&GOl!qcc9W5Py2#)M~deHUQRKGka7{y%8j zc*|Fmm5q->7w2V7n_PfBP(|<Sr{hy!2!1EDw?CVS2O{|3lH{6}J2Q7$v2`Xgt&ikO zf+=G&l12<o%@~oIm^@-=M&hVTl80HRA(<O$Ax!p;7?qllIw56PMlX}lA~1m`Hd?pe z%OMR3UPv61F>3UvVVGzuG6gB}xD>-nA&QtZ`ifBq=!!SgkjD=jlR9E(VzS8*W|ESJ z4Nn!5u+VTr9y8(+Zz?{~qa?L6bnoafBd#1h3U##3LE<eKuUbjsu%e=j5i@Y^Ek7qC zv1oG1bpDWYC)n=qu#UQ5X!Rzaeor$S2RMuIRJ2|De=&~8Wq5>h650pduXX#g*%z(h zsTnM0^i(nXM-UuVR-8YjnDkLYM<<OKbxFq9OGk`Fo3(DQlHKl!lby*aV}?31_nn+S z(V04A#3g+#x5<oOLZ9VKz9Mnd*m0vSvCc9aS$PFhoE(>q_9hOI0yvt5P~$PfMkNg! zlQD91(y)wVu`0D=a*N>Pk)ubA7Mn9QG&nVRXp)f})<j~)c;pRle*k$=?AZM4ax=!{ zUW>07_%c$tk$Wl<_o>87rp+$QOU6$Uj)8-_L4QTjN6g5^Zy%xM@Co6OxxS+O>|%0s z1V@A77=tsnco%a>zHclZ4i7JxkquW4Zy)X`Gzp(lGYO$8VK_UQNjM)lhBhwol3brC zrb`wXRJx->xUP{@X1{~3^I#J#y#2o%bj^=iWQd|C=(K70a+=YHH3(4&qUeYj`94#F zCQ4DFny{rx7^%y^??`1$&lpi)M744#X3FS*!aF$<#^&-zdnM1=NE)V+oGrsNwo8U} zE*J(iX0Q#Jl;z73K@s5lk1nGyYet5c>1;=#+DwM|ag{~^8F0Gr_VtS3Z~j#JmGDO) zdA3SU$tud4o=XRj5@NIzeB1z}q3rIaA$qGcanliezjp>kP>LF(6U2JLeh#R==%5*h zYvJu5c4kb<Erxw4?>U4C^oJx-LgdlnshT;rXl8zP?$E64yj-M-od2o}4vS+(5Z>Nl z5(I$o_NOZe;xI6HV$RGgd=;-)OhSuA1*Tty8s^WKY%JDDTd`P*vktHrR?m`y-QXRS zmW+=%j>7y{s&W$OpXxklSm9;$<|vx!=eb3~PBT5Ls^>_;;L^ASC6>(6q8Ur<MiN0Z zh{K^o_vaO}c9AhWJtF$Bcj47O2}<mCj60Ih9tk%pZHDG$6^+a)6gf>djcVf&N)E!$ z^sGXOanh^rc8It2l(=@E)(KDS@YTYijMSp68O8YB=;@+BBotVt6c{V+ChdQl$|D9+ zPK)i&@b;f;Q7Qn6rx#~P9BQnTiUVx}w9+Akmb+P(3A19b4sU;&ViZ?O^!eb7qTYE( zx=1BCoH1i~QEsj%XSz2Hd5K~inT4obnjs$g3!wvt*TUP+Q&~h7M%nQ8@ruAcDXmPo zZz-C#xLBgXk<TAQIrc2jzLh&87h^}p@O*S?2rCk2%2L^kf3QiUo-DejmZ@`!{txI3 zcH^O!4INTYDtXu<>w?lHz=%II)mG9}o0Wnp80f}jXUz)|HAc#mk~sKn)5)ssG4hQ> z2b5GcXQ7&!(1)$gxc^ZV;%qZ<%1IamO|QL6i5y!pQQ5!KuV)nFKO3ORsN7k`gq-kj zE;1v#AP12~xZhOV%9r&RnIS&MDHmpq`SNK6qn^0I-AWMMQPgG2zM^QTcL~0khUn@m zD#`X06iJ5NsuVjiNoy}~mYh<QTbNa(EXGb3;8fCLO(`k~clnhuAxIK-1{i`?KzC$g z)dr}F4~iRI8MYtN*=(nBHYQbDs&Xq25gVSbawO$WESc;rD4427Jx(-2v8sc`wNd;= zWSIR#$<cw$H2WSUjHVJA{rC>dytzC;TV$m2YjBc6Wdb@io<fATe^Pk887cfJX>n=J z6`_RkSn86Sfu&}6`@oW92&+}BL(qvN(!B#8NbM~J7fY>*rRlzI!sMb7W7Q$%>811d zgFH*TN!4Q{&Q*e4LJZg5P!6W)(_2))dci6x=6K?hVBfSGW=LH(=(?&7LQ9Ro3OrC@ z7DTl!ai)yrLwnONmix^swcvPkud;+l9*aRq64;l^{dJew!w#*(5Pl9!xHwn_Q^lHX zQ8%u`u8>bn3ol#jD&0O3JH#m5D6>r{MsX`E4Z-s(8H;x)C6r%5khtNE4wdnl{KDC$ zg6HWHv`b5u3~USK5rHvQoTu2%D(^Zf&!#zdIF<Itc-DQBvsG;6esq{A<4P<5r1~6W z96qN;%O?7*^yj8TNL9F7NV{G#O+M%?ww|TS^Y<As<T)_ptZc+#co*k>(^WMRr%fxs zXvD<|CsNNSsvUYoRdNT{OpT%~;8~91RqQKJ)~74oBC2H2>rL+!y`R=P+COQ)F#5DE zn)4uu7Z@N-`6ViGWbX8WqS->F|FBNzLgU8f6%_fzJ)Ts2;=CsF_rWb7)Aq#<)}YA` z8;5It)-5R?Gj<uu5Yc94WlZA-!`b0#G(+OF{K+%8FqHC`vf5+?xj4UIhNMua?(<lw zV|bulpA8m*HGg>fp97mU1A%yKHa?;$%|u%*b?T0>pJ7W9sVMgYV3lP2OsUv}PiDCT zV~)_D049I*k;?21Dv`p9C3<}6=#d$T-19bCgatLfWI|n~X59IaQnP&-m*vjJ0L0LL zfl@p<e_~OVZb;VWGiM>JEuxgE4>vE_%5Vzl4QEL(kuZyCtBM4Y@I_EXjRPD~x};#8 zgCB>YhU~~q&XH7j-K?8MLYq|QRwdifsn}i8ob522zc0j}LN-k>JijzIN7`Vq3R@<q zN`U_{$msTrg+3H8M=%Rwmf3g?u5@0bb(R<_gVji9;2&CmpG?!UN~#EMv8uQUJ5y(< zn1Nux55Fo8pQk1ID^1g}V>dM{%echnhiEI+Po?JE;xi*S_gd)ojm86s3ZMB|Wp9NJ z(|8D%I5kBXUXAQ}1;<Ko^AhD_ErU%JY2|-AUCX~}<e;qQC^BEbM4Y64O73`UGvIf1 zMZi&Q1^R-CVrn|&Zo(5W+ra9Yqd}pP#WjfvuvF0D%oz6B(w910iJ?*)pH}*dF4^C6 z>9#3Oet(B#vosZWq*)48V`C-9*)M|xPgv__k&3qt7@>uQAtJY^Xhs3tflcvsBSQ$A zBT$O(7i%_pjW`Q;Iq4H>ek>~yW!bNtO=Aa-3^7WRMwhAtw2%~doi31Lt9aKwO^}8) z%@MQ)P~-lKN;e&kB=_HRZs|voo9)Ig&6!F_y?JaM7G#Tw_bza#VfT}!#t89^;6fxG zyyh&!-k^kI(wTy!XGqO?EI>D6F}_a{-ad{JMqqQD>&Csx|3;VirsdB-Z(#6vO)IGf zUa20V0a#f*HIS0AiAIy&(Bw2z?Is2HbQPB1SCl+@(xhVi{sSHUV`sCE#)({Ucvdnf z0H{vZ+$fWQH{ML7O~Ff<yk%*63e8$HF(Qa7|HG+*c%D?Q$$+O!&8Ic?^jeluO$}Ln zOxF#brYZ}~@w<$QB;rVJWuYMj1=GYnO?C@WyU{qNoH($dr8|=o^JqQdNz*^3n_kZq zrRmumO-<5N|4ee!*|Fh9JJZoJ@(U)GOcL)b(X!d+MKBke7mz0-yU1scD)Ks5Zc(w+ zGSMmAcmYgt1b=1i_=Ld1x#;so)!(vu{fd;!QlFcB?i)k8B$iLT?xYbl^B25Q^1{Sv zHF(f>sqjr$S=wV|OkqaRWApDleCqXgg=`#GzJ733)q?nu@uv@(jl=Z!3*V1jy(f=) ztL4iZCywa+Wa)LA?`(ZhXZIUZ-{|+>Hj8iD@Y+OtpHukuebC~xM>~x>??1T%_iU-W zAo8M<XPz<Uinmuik$T6{!RMd)w0uJV`W^LLQ`_psw?BR9r+4E{s@z`qzrvoU+_QY+ zDLq#9e)8MJ7vMo=6)NHmy)-nu!^F~vGaB9r>$&-<$Nn>6(pf(h^!j4!;lIwj;Nc5= z(dzpW?$8IqkGMWubmj~F2E`Pgw&vbwcl2jdu9>p>jMu&&{nN0^2YiQfH7zLb%{RWk z{p)v=J9WB0^T*KB7krc5^}T!gbQzO+V*H_npQWw1Nxta|z6tl9FmpxN<J-4Bw&cyd zvrhVH-Rk@$*LEu}A0L11y*)4U)!;XhL|)2kIiHVyWByC2F-JfA`KcG5dH$@&F1mZ& z^OsCc`uKG3M;FK9Tu&&=z4+{TU;KAp;cYjLsJ*AFd)e;oUss;LVgI(fzTM+1|7>4u zGQQOzd_Al39~`)@*OMo%|FNQa(D<Kg3+}sq#ms?8b;H(&PTsm02lAc~zEkJc_wM@U zf&UJ?v)A4(&+Ygz^wrwF54?Lp;mf<@X0$mtxEH?L9L93bI9O8Lt>@|EyFGou0|&Zq zxU??zp2yEvc+<P9ZcbSH#gJ0S;_t<|Ltk5!GvSqlyl89BHOmVJPa2!-TO0bf+-`4f z?H1qqy<wlDJ>C?)=_fpNc0;S%_jKH_t?zBcBNlx&aQWk}+;sQOewTE4{rhiUD8;!C z93*jvp0(~TA9XGGYWbtH!?N1#ii~|_-G-t8_gt}Jo$I6%&N%%LrW^R}a`3s^j(G7u z`=;(%*JI^>2UX13dD0X8-~VRU`Dfn0^vnTIt^TA3oC@m)cj%`6J0}+3`}ki^|2pyK z<SQ#XFYCBriRY~SvtOOCY4q~AG&sLk_+rLg^Zv%K3YVRC_@PIZe*VzEy!)2DJ$_KD z?HhmW_VblBAJyU9fbczje*Z5YNZFoMGv&1l9-sME==9N*cfOUmW7Y>>?>yn<m)|^q zcX)+w_ZMeoe^C15fuB$9vS3cv)}4NM;?Df>Z@l`+*t5TQb;?gy;^1z2YwDMO=*zG^ zi#k2?<;RzuaQE<g-o0bT^tV4*c+1tb=dHNt>&?rs;(Af|dd}*5(mUIBT%LaNtG5>a zrFP8z+KTmi4x~l>{p&lX`npD5i|@hVsDeB6ljUdqqs!7~Uz_vj+=_ocJm`{5(fv=( zN?16u?u)YG-rrySuw~sWe5cI(>8TT+=<@zI@m25k{6~+(UC+jR`RO?yuS@Sf|I(sU zm#x5AXyNPm%*kip`pHMunzz6D(!240v)9eKy4ChCpFel$%_rZq^ZOrO!uf|bEH`A~ z)c^i)>gCg0?3viP?)1oWTfZM&>E3_$4R>sEpY`=4ZGOaiTf%2memMKXn=iR`ZvQq@ z#yl9iv(?Q<PVcknXxXUY7oBx}MaVqZPx#L6JhOMlh_N-(UOD-})YTn6ys_<^4WHJ1 z)%nFC1KQpi^_~~@!@)3j=)ME>9nOAkU*C13w>>`f_3ZX5x4!?``%g#Ay8eQa4c#9& z9E*2_gfH{*tG}Lm|I-B<f4t$e$7{cT?3>m%UAk^%)y<dp++DG6_a+=%aJ8kpF)R06 zyW`G(ULSec!W*aM?tkmkGq3yng8MGZ*%lIY>rdkg5Mrkb-z^7<%G{5PT|V@S*Ipc& z*stXJuGhG_U-kGC(QWfDjXb|4#`iabZ+PrgxrHTZ6IP#k`QMUeP5IZqy)&0SnpeJZ zUT%HG70b5Yhi?lZ_PRrtZ|wTg4?}Lfvtx%t-)wv0)5NFxe;?*f{c`n;=YBe&;o3tF z;5!z=_guk$ZtFYu(zuzE#$LUC<$y^Y4%e11+mrwD!#%&uf3LjwYMh@HzMKADx9h=y zBd`3h%f;7D{=VCZMN2+gbhLNXp89{3@3`u;t7hPszzHn3@ZE2JcsO#^rttb(dbw&h zFFU`}fv4~4x1#FiH7DkTKJ?>IY+?xC|MpC&dU8Vi#nZn2HtwQ3zV80!JFCx&AHL_b zQ@1{x-?!yYIN-2H__B9)UVGk`Enc`h<emq<eJ1JAH_Km}^m$Bai~2!VZ=G`8`{=*t z;J}VMbn)|VJoV_0@7{WL!<rlFw!F7`-}4{0O6u5k(%*aR?7e*KBOCA@f$;76VbQvO z<S%;i%4gfJsrzPL|CRUOaP8KkS0&zdRku0cb-Lj!d{bBWHaxT2=blr1`-e4CJ3hK` z=)3Rtd8+uzf0o34^FYtTqc2*03f?J=V7YTwPyOcIIhSv~$yZYU$>rw^xPHy^*Y<to zie>lxSY7e%v$40~n2qpR6CNo##g+2Z)UkWM+Iq`nSEqb&Q=gLa@=oY>VsYiXga1Ul zUoCuBXYJisJnC?H_qbMG>)_rqE<S1B%9z>>&$WK?&_~a7y*&;G8Q?SS&;h62vE!dd zu88WEy(Q=2(`J79?$;Nz`sDgIyOnp@ygW1dv2J*uLiqMHoSN4;X8Cg)&wc3Z1&{rG z(HTpRELzvP&%JN1DeJlCruT8qXOr-KymG~n+yA=rp7S%Zb6T}uG~ubA?|*9Csf#YZ z;=~7^{CQxPyAl52gYM9`-+goFWmkWDaPS+YEuOAE?a;#yU-(Vkg|WBpzW=J7Th8c$ zgS6?wci-g6GituOeUYcdH3ycyH(|&{1^2z$bJMU6k4}iWc-xwbZ@~E#;rsmOqmxFi zeBy>NUl&~0Ywm<`uRPLX`}P4J&K&m0_GRN|XFrECm}p~n=){*F&wFF(UtfOxsUz<_ z^6$T-9cXxbb;0&46OXj+H#O$<w8!usiSWHWZqUr<FYL19`m!Sf4n_Uzlkc9r<h=`L zPkDUzN2RB??zIa2e4X(5CXBhV&0o*ItUBiY_v2r>B6IGE)hAx~P4)wCr#^SnXI<XC z6=#lxuiIV!T<Ux6gwxt|=-lCwH^)BS^O7xJwH%opQWpNom-jz-<^_147zdi&p|huU zI=AeurLC(fHg`z9V8P;lCobLBzHR&aZ+~&k_R4Noe}Z#L!WaF@n6Oi?xV3z1zZI^V z$4!WOH@#$5>#J^`aN5N?w+@>yE)(Av6TYwNZmsBe(f@iz&;NJms&6Ll{xtQK8$Mke z-*5T)89V3SyJ`U5Uy5S6J4Y?~zM$p&e{Bu(JvTG`i-8}^{piweXTSXVT@#AW`RetL z@nXe2!Z+ZJ6TF+pp8o9Pcg|Ydv-S5^Uiw_l;Iwv+&%5dV@wfkX&X#?6Cq($ZOrE}? z@>AcB$yt$ud%ske`pijBJhJB2FS<@Vcuiu)fHmkJ{owoV(0@&x-E-;MvyOgx)8z@C zv(ollpTGUWwKrE>HZ3G--s`VkF&e*JDSQ(?swf|J+dK7Z8}{9}@_{#=T(I{1M_Yv- z9)8CiBRZe^myQ?*_X*$nF=5{>7<uOPbJm>y)R~F5?frOGr!ObgY<Q#7_sd?mGv)DY zyoYrv%Wd`Q!vj-JZuQgKr%kceUUb#w9uNI<(cqsZWsmdqJ@4;#f4&oE_Jr?&wl55y z{N&%>NpMXqdw=1@_dj=F@XlLbxgz1-L6awZ+2IqE`Ht|-$-na8sKsx5@In7~4@`gJ zrJ6e?eSi9SkG}Z%ZR4jccz(=nnB?*sZSK%DA6OHIy4Tj7l(6(AtNPVW3$~p%c+H-x zHtf6W`x}3He)cN7KO}r969*2Sng9BYMPH`X-Pir%Iipg`F5dahtmTVWZGUP-@}re_ zhgA5!&pLnlN7r0^Lid+X{%qyyzYKVG?EBC4d*`o@OnK&>ne|h?>4S5}m{Yn#Z$Et3 zX_wy@_0s(QXC5g_*}tXl{%)t7vE#!J4lY>Nrc>(!h?7%<@5KQ_&w9He>3`3iyC;2r z?3S1_Qto?k{D#>#Re$s19iI>H_&DZ?!k4k*{<iZ*w5thuG-A`iAL35hJ@&?|%g6N{ zeD=d{@0t1Zjbm|s8#3LY->sToox1kc4W~?cw$=0{cl7IXbW*F<bIK>ry6ySpnOm<v ziub34?|;QD-kQI7(#CNI*Bo4O^1w;|jlAxxs@kKMKN;_vv1ebGNAUiJ@NNA2N9)gf zt$KRP_IV-q*S)Z0@rR%8X|wwAZ?;^1Z~u`q#_z>9-Ee-*9Xi9E{?Y7i+aEeS<G~M4 z`(Wj@pB|3cRQ8`$ZMF>is&v4PEf|lc3SaEF{jdCI{SW<S56R!|Ida?9_;-GI^`*R= zXFp9mn%Z#m9gH1cTX^>eyw=cx=_y48Q?MmeoX-80{Ol|rHg${BeK;VIJ1af6R2|Vs zpM;$rz89KaT$G(|pVlJ6Gju(&e}|y_8QIfHa&rBWvA&YyAnB8Q1rw(f_sBaQLMPz? zKc6@sFKN>Ya<U5ZkCQZQ(?2H7*Lz|~{<NGwCd6)C{NnMX{K;s6Jp3Bv@v@o`s*vNX zX+a@9_Bad0&$>>_pJ;?m#`z}q@ce1H#qQYBgns9zUxBYg6wE4iUxx35r1y$T$3uT{ z=3a3<;(GKN5EtL8M_hUd_6O1-DJOT*@sN~VP?QUaO^8Y#nV(%$P+Ty{=N_M5T#_}- zJ=Rx}lV6bDJFa){^q~dQr<dSp+wAo5L(@~S6H}Z%axBnZ@jdzs=+UQ7-(CaK?anwe zy9it9c$#8LIhNR9OEJO1(WR%$<1HiBZ_(qYd~wz^BmelQon0`!5UpNx!SpN|*hv2~ zv`6Q_4^1IjWzTk2<j*K-Ci?aye{GJ%R>9#P@z6y7KSS00>C@pv*xEO?|D)R4!^)qb z?W{)H{u!mr_&+J7`2VC7-!GK%dtz<VQTzDCn8M?!ua4;W*cMMJ7!Ut5d?xo7^ge#p zDg8ewrBNY&BqZ?X*8bE8hDSqFrWgLHjhpp{EYkd_omJv1$V2#TLiuCvo3^jdYIbUM z{M_)mM)vS`sbf|=sB``iU*iJjIITn+Gb?y-R*qlnAE>IMjrcI#H2WW^Gv=(OdmW3M z=Dl)~uNcSokBf4$c(o@4$D&>EG>EnQJ#v1jmN`6mYNYy`_4xG@bj7S9e-X!GfaVof zn*+aZcG*a(UOLj-Cu17U9f;#3+1E>cCgeCtb96^}PtY{mAF`>gePPK&Y|I3&L5_!H zENd<(E-5U;5yRu7@g(1IY$9~@*?jHx_^9S+BAf&Bch^6oV@=DSj*S7Mx4(#E9({0# z-5H7hfFwJ(H@gr&X5AbTvkPZu9GCjap)6y#WAX9ekSy(OhMwbKxZ>QbqU^lirCX!8 zHi<KVf+D}kj-{qeNW(JRIkoWD_V^7JW@{+p`1vFTp!@=3QNPx|+Z8#xbV&R|R&@l7 z9LId)IA|$K;#*eSYc;h$7F~mVT^2FNW&SbAH<>R9|1PbX@Jo>JX0egxx83pcOEi;n zd+5(ABCbdNjN`Pyh>;EN!W_5WKP@|FQvPvM4X<ovO+RkB<xkI=e4KWZC1|S6bUeEH z5`W?NYh@+3zosL8>l%0${I%t;stM+@VsJi9(PA~`vK9k7SNN7{%w?tGoS34eY0PE) z2<$xJ<7bkHxvVgpuTr#djk&D&mN*Y2d<hzJSt|@}m7)CzjNj|QQ5Bq8BIdGkG}czW z6ryMcK<g@ebsBS739W6~V2!z~8elle0C_t!=CV4%Ad2SJn9F(ySa;!Dt1*{#5ZElC z9nzS~dIo2K6yLKNb6LxAo=4GEXv}4$w3FY)M!BgPb6Hyrt;W!z@SL%Slo72lmsMeC zm4+6DGbKG0pT=N6LtABN9dQOEPWap!b6Kkl?IA-uVrWMV?Eubk^pd=F8gp4s;f#f% zZPJ*_O2@f|-olruF_(2Wu-QUesWI39=MWTMs>WQ_ZH9KIq171L4nsR+Xon50Bc8eU zQFYUp%Q_Ly;1%s8jlmBLZLpzDGqgfOt24BZ4J{7OxZ|aac#XNN=MC*eLpx+>hYjsV zJg4p}d2yIqFtm}z+FGj&E$R$@?~^_mtudGNwV{1yXhrC+if^XIT-JSt_7_8o#Tf&| z*Ii>SYrUcI!#qrN$;UJMOSu(p^%ZEBm3)rE+FB_ZgP#IR5WX6XxvbDm_%5o@T5HT@ zB>_`>UX8h|w9YmyU1KiG-G#q%#QMf)4DrR#mKs{ebLF?x!ROYP%i3gUTMaGcJpQf) z<)vy2-7eOqg=q|VfejYEtr~M#K7<cNE7cg{0RqW|!spf)VjZySg_fo<m-VIL`^NB1 zK_F3iXK2i2Z7{T_4ejLaHs5I)L%%e%hYYQz2hJ}_xjQrl+xNsb>V?)?V=gNi*j%A? z)R@aUAJ{yhU7#_SH3gWGH$!7C>n%fj$I!YXXehoojk&BN==c|lyrUX(Ss$W9E83?T zb6H)`0Tu0hjk&CmhIYB3-C}6B8`?95_N<|OZ)iUm+Guo2RmND2xvV9IcB`SiYG{8q zG<HRmH%w#jQ*;E6)Gb|OE^9uVS<%Wh=Calq+M|Yc*wBs`S|2#L%G+OK@HIm#HMAWA z)pw!WTD2N;S$~5wCyFkQY0PE4ZfO57G&-*03)7g(iZir$Lt74q93t{oXv}3zMdK=3 zfyP|c9fo$dq3tlVT0?sT#v3Z~)@#gVwSXdu)=Fb8tCykmHMA^4%Qdto3~i&K)fw8y zh8CBkesiO(6|XUuH3!&y(WOjdi1)*6zQG!ESsM*)i=mYcxB2F1%w^Sj)o<ZoKBO_1 zwRwb1dro8M3x;;o&<<US7h6P^!y0p0-7dqs3qtFuF_(2pvdz~)V=im8p{+Bt{f2hH z(D;GtOGI9U#$49+(Kc<D#$49thW4eQxl?Su7>&8COAT$5q0Ke41%`IS(2g3~$79s* z@3gfJY7F%lYtz<g%w_F2v;&6LD%Iw5X$*4)LtANRwT8Ca&^C?7?=6ZAwrb2}jk&_6 zjn^3FO@>x!XklsU{Sdqxr7@S4ZD^AXZK<IxGql(V_%5H6+g)Rbord;~p+#M3^F?dS zWsNhm35Is3q1|I>9~;_1L#s$v-wkbRRcg#-9X7NhhL(A?`kk$|R*uHtr-pXa(3V}J zzL($DTCOpdb=1&)G_;fq^&LKps~U4zj~Lo|Lkr7PpZ|kRHRiH14K2seHUWbpW1QZq zF_#saWz)KA%w;VFHd6SOX$<4<M4OhTF_-lwFmwXQ+pjT~)jk{FV;9;f8pB*3nBrTj zG04loIcnic(-`JChE`)}-E;9mo$$qJ4C??xJ7j33lW=}k_~vNLWz`wl$A;#ejNe}p zzGRKLtOdYs5ZXeGp*;-WkA`n)9)34e_?Br5Yqflv7OOF|5ioQX*k!%OTvp)}o95G) zOFpPOPWZy6;)|%jT-Jra%7vDwF_*Phr?$1;G<>V3;di5i?;(x3tOLL*gjT09lsnz# z^J&awMb5yt(}gceV^|viTPU<tjX}Qxn=edbF00hg<`~-YLVUkf@~+SrY;dhjTdy&U z6-D^ItMKvX0Ei*B16w4t=QIWz6x)1>8pC*LXn3zs=RIg>hYW47&(7=7n9G`GXoZIM zW(j_;K+4^(F^mf{@tshib<h~rlE4(-3XQoe&n%ox7rrEoVSaCDPZ?TtDbCIdUq_8$ z4q|AfhIRlLf&=`ePGc@BceYK-*BJVxp)E5sE&>oRkT*<YSmPMlDnt7b7y<_PIE^NT zdH|~wT9U>PuXJi#>!{(IHpj9ug|AR!F6&WXRYKdKF^mCoZNBju!+O=wHW}KHc{pP) zd5>z$W%ZknALA6-K#d{B0#kfPG={OP4ByTbz5^P=`WFF5(K0oLSON^e2KBAc7-Ahd zxuSK~7}^&Yf(`gqXv}3Lq5~@0FpXg>Gqg%WOG0Nu0771`#$47-z^a9Iv&PWh(6JO> zl*Zr(hE{5573c^ERFGGxF|2igEf(5~8p9kDPOA9gH3l0PTBf0ON8?VGym1<XUjbVp zw0w<WJ%ff+e62NxK4WNwhL(f|%9FfajbRN7>}H`=Xv}4`f&mntOJj&bhUPOgFDjNV zd6PBfvUVHVUPEgKg%w|<#^B??rbymZ8iT(W+7UzZLb<7`42{7j4Q-R5wYx?Arg>W{ zQe#*T8rnmK7QPhkcZs}q8Uvr9J!EJ{fz1%UA2o)x{jD}FMPnEnffWefT8+V9ZnJ4o z8gp5BzzT(Ln#M4O-fq*<G={bFGW?E;@VPaH`Wo6ML+gBp{5~>#?L3XStc*M9d;H7R zn9C{$cCyfJ)EM>?aX-mA<&+y*6`cChTW1Vg*70zMn42!XlJsLgn$J`7>81VR)8(60 z=3sq~!kmfLS6@OTe>2{3@ur32{@74?PJnX{b}kQ)TKndAzyQ^dUmlP-<Rk&7U4HKs zEFYh!n@qp5FE5aG_Ra5r!SaLkkB7|TsXv~=;VU@B8F7#sTo%<2gF?>oGC?cD-~ZJW z>{-D&ra}>?e#ffUuh~24|Cb+N(&_w|hvP~B9`3k5Ry5fDf3|$})8c+DIW9)~Z;u)K zHT`2D@z1ai4^&dwv>^F^v^^;ESgzpyY5!`EE#r^s6Kr4pWSaA0`yJ1C%acM_yqN2F zw_mV)#@#Yg+OZ?S_MxwxioX!?YR(iwEI0m-5RA1sQ82bkq+lNW-(D~;{y#~uJpBKF zU~BRJUj(bg|4#}QjzXUjjL$=#7mUCA^nzfO!1fAO3+#2ljsmL_EF2E=zF?)mJ`ij< zup@%)2lkC%M}f6Ot`I9B6puOuO9RH=9tyFR1B(!B6EOZZRS19C$U0rHXbcE$!SE|4 z);WTe0_!5!CSd0ZwjWq`!J=E@X{2C$`Z_?cQeXoGTMjHyu(iNEf<?E&ez9N)z=jJ} z3hWZWmIJ$7u>HXJJ4w(FShiq%4x1xb8n79HEeFQma|*G%Rmm~oS9q(FVj{guPJl5$ z2@kyW2H!_!Y~O8PNyzU`s!EE9u1bXnC9V8W+@{?WHMPd_Rwu`Jyi1Zo!oA>fQ?$Ff zYzI;YB*l13+G_&a8-z4pS4BvU@m5um%f3yksw7XJeIoE6P|GeO<QL0G2`(ekH^LU0 z5?Ds2Dq{;Qqx6<y$n5d9Tm@<p(9G)8m=teytx7B35$CYR?%l~v+e7N@-9@dXMsX1v z%lNpPhNJvAZ&g@~w>m7Qnj{z;cjYx<G+AUrG#J8vu2l(asPY=Oq?FHz3AZ8^-Jpd= zR(smP+6moitG9u<od~Wj;{*2Z_QSaC=C){<Kq44XL~=}A=mI7pDPjH~2#dCqt>UW7 zq7}W}{BxMWTWyusikZDt03a}XWc7&1DsNar%lfN+{`qGq&D$~zUCCSJtPI%0;R!H7 zyBIpc$IaF1U^BIX13}?#&DQBE79A-Ss;**%V25toP%F=zW@<IpU#k|(*SJ>UcCE^H zxSb8`4RCXJ;wBCd$|>Uxn%1Sv1a_pL+`D)CdkB^Gz_7H2dlMsbKzD&#q_VpxKeN-N z4Wv5-ri-v$9@Jg=m&f+CVE;7bLv=>w#;V&<Ky~{#6BWF$FdfyTYsWSBP&ObvHt0UC zu{9j_`2UDL63>#+B+<^6UT~-kz2CcJPE6cpt^qbN{C)kfw|a3559D~O5vc+C?C@4q z#FPpv8y7cRy?U!FVwM9&yx?iEu*MhRzqc0Fl(g<sQ=fyeAsNCLW0JwGgf5d@EQC_T zyCBgGynL$w%h$606lA49RgfokvkJT~L))Zq#N3J)4x3GJgcy!E%|T8Tn~^O+6Paj; zgL$LUz~WJNB;qa!U{^(q7l0SgWR32uh)E$zEm+0!P5j^T^{rkO!^}3ly7D31*%hTA zWFSDmE3d0T8I*|1i{OZgdmscHyc?hxBe;uZ>GDF7baoU&9vG6P+46N=C?C1WF!vl} zV7>3&+#6!P`yM%XD*;ud>_TTnk~OT)%akrMmKj^AM)1Z;5w^{Dmen8wdai1uon_m2 zi(0IO=oY@yG#2VR0Vc}?jaNfkeZzZj2;JvG&15WZ2-lct*@%scC8@IVMU^8^dYDMh zb4urpmM(OWK8-|?PAot=36+)G{nA53W+8KcC>ryI7c>@BWb)TJl}us*GD)bEaURu; z(U}_}VJhDI%qAxSaRe<QmT)eG=Hy*K#|XU1R@o3xF;J=Q<Hg7m$3Dh3V$(TAc&jf* zv{IqADe1cWkdm`(SM|1BB`Pe_9k2PkP09PMw1|zW=OAiy+ZE_}Ny-o&(ZcTj+VkqS z{*U9aBW|F+Zs9!Yt={cjathl>JLxVmmNK!=Zbe$KqYSssQO}<3F<v{Tc`_upF@|Bh zbB88|5ylP*nIpq%tfI$ix*PO1yTWL8tD!Xz>QIe|LirBIgfdXRTMZ%ADQF#xs9Ix= zGP^vn%-^R55%eA5+U0SRqH^r=a6r{J)hRML2+Ypqh%>vlIwibuA>lz>yF3WDTCQU@ z2X&%_ULH7GaEx!Zsj5(8jFYGt=3p3S!W&M75iq+`bW9m)VufBlIL4YOh77OvM3&e6 zK<&b-5=BrrYKuA7&kfrH&9^(Cc|0g64V^%&m*Ndg^v}Uls%5%e)Qbxg&OGA1)iV7r zM@X9!iMdCb9_hvCV&^yO`TM-0y=W8$w`^JeKWz^;X|>`4ZmnesDv5D4DFzB8#iUew z!hpxA>T8S1<Tg$ww~`Qx`iqvan2*L;GY4;C6F@(d3*YiqhlNmJ0%u3~4{j&=K@+hH z%qlZ4Z*)V8hSgFkDJj)$26)4Yd)R6S&09SJQy5ONs-m{pDL>apT2*3LLu`|#Y1has z`_Tj*ySD`TugC7Rfa32gCe3bou}YfE_~XGK9^2poM;rnl{s$J1S!`VK7}&yXm8f17 zv5`vzaiUl+)WuCKa=Xi5C**LWx-p%x0)R<QMD1Wz)L)Fm)Yp%K-`#MJQ)hqg*6Ww1 z=09u&ng2uqbIyO5fbg=G5aC)N?w8|Us>W)>h1PhNB*!Fi_8IG?wn#-3t{v8=W=l9w z#-R0pq9<>bk_b0K&6BK%g&frp!6|{><d=X&3}wXrf{bvHQ8Ju*EJ?yZ+^i;y3C(Fj ze@x<p>nrI4n4^Iirj6rrS>1WdOCv4c87#+C0ZSzBlCW)5yR@MV73YFMEGAWigi>#n z7mlc8m;htnx&zovT+=1$AOe?C7Pnn1v*BE-;qO;zc3c4~*08v1N1ZZJEA%qydPqse z>b8wq|LeOEVOZg5uVw0p@G5U)!-HOoh^wfXFONkNwTm_c)%teDXc1wn@+Jg#`aGy3 zaUxHt6UA-`Im!*hCmLRJ3KHA1OZz7O=1!^&th7Qq6hdc9x?7=iw?Y~W-L0_rWRzYQ zSo+&YOsYN_G<a6;@?xxn7`yiekB^16qXO#wUlCJ@47RaiSt}Au6yTyvoUjZ~s*b#I zBsLWqBFeu)3as`!!b3#G8sufI)ex~brVRJ?DB)qFW8ICB2XVe+KD6*6nPqvc5|~G) zs)+BAh+h#?1`Zin5{kQkBY{>V4Y4+ojp|{nWrCPI;kU<F<k7LK{#%*c=&}&)#X;3A z%!)mzq?kNt%L%=*S+W$C%wo~L$r0rXk%GHqIy~G=b<Z?Xq{F0$rBf76DsrV1j{=qw zkRwxdB?w8w_!5rYm9FIZxu&{C^QEGvsS4XUIj(}za9@2k_e{!n6#9LKaX6_mDQGK= zAu!f6{{&Pi)&s@sxyiYSyU_Ni=&r`@8nlR&bxK$aXAX12tHWZx+g~Mjv2(jL&Hytp zrp3n14X0?j*aF<v0M5-uJz~r2E=G2RaXgBJT-V(8kjt_{)h1JHLtl{Hb59Vy8W;H* zI)T*BCiN3iL~ynfRR&qtAy33c_@NA0EJ!W)fRQO+hQs-dy~!AfRJY>o2CPby<@gti zr7s1OioaNB5C)a3xox2ZjKW!0YoJ76f-rnLwHhpv(yk$#IFd+fho%poPu_-B4Pi_O z(8jsn=N$PL99qxz!FcK3%zp0}FKOSv{ercmV8ybRFuz9D@8~wQylraV6sjR?pla1+ z<iTxsMv)re(p|$B)<i5UZ;889GU}A@gGjeR!Hf)X0ZHC4Ndr9|VV!DNB_}iEeqh+B ztN}pNoT(E-N=7>pw@G5jU{er>MD88wa+71?tGw8X^eb44#Kod6f=2y2VY0kyTq>8b z2s~X)sZN!+3PmDU%$#WOlJzHV*zZvsQB)}bmWl^-DmWM#+3}2#0-O>Lz?Nc)8)S4w zdntWoC8Jwr!M0T>D0vAs54~8<)j&j2b&Kk~VoH?BxzGv_A&(%$cdEu(_+m8{>g(Nb z6<7zuWs})=?Q*IT!|QKsK|e7@Oo2`7iyPCBJ*9E>cJ*EdE25$rUA=JjJS(E&Z%~LH zlxO=(Nhhw1+1y+iizA{=^ezcxQYW1u>~)NS2%DiHu$Bx1kkZa3CWeFRGkSZ3TN{rV zN>OSdvX`>DbV9x8M$#N4%|Vinkp(dR_3vfNH_k|F<XLP-rc!bE=?(z+e#Mz+7}PZ0 z6LHH=AQ5%X=>+lduOEfrI2OR|B=iHce!K@f_4_oV6>;-spkR*EQAiIo>@-kHM;0`0 zg=T}{%79Aj)nhq?+T|dXj5>8OP&9refHjx99K;ZI6oM2os1#z7LIj)y*rsBJ`6uAM z3<zt`&=xl=LT(sUZN-^*3MR)eGZuIDN(pT7q)<U=S6fqu^EoWe&I<!3z-vx}Sxt(E z4ef6lPdmyLqtA8OMs1)r@g|tZ<Bq*z6_iC)2~@8j*233c(?We0HC)7uP%OAtnBrAb zsb{@|Xbr^;*9MV9i#iWN*y%(AoB-O1;ZE_VAm-{(NmgKrJ*ayIm0)hU1a^kEpa~;w zyp}rqw_4WY)-eU}KR<GgCwQR7?&m>I_AlW*GG~mH$#kqtR$^sXuxI*iG)Js8^NeH| zGL28JQaA%cw6a~HVJ8N&z{gkq=M!e?Dw83%OrhMYXBia6N*)8FJED9p!VH=_4>a}} zH>M<!tYjJPIp-^%6A~U)+@fJ?Q;A-^m>0EW(*yHGP8yYK5!3Y*daM^^CX}?S50%&^ z$#CN85pmU?I0+S~pr0CF?THs^D(sMAm9z#(wR~&HgU4-RP5x&W2IFGIsmW572W8zQ zPA{&`$58&V(v%z+6I4@HItocsWu;rb`;w5HPSdBs@~OB{3vrZ^3C2uxs#5dh48&M+ z0;T|_1E#9_07I+sKVV`C+$u*9x+v={;WSP*auqL1O9<8%>_Tlu-+P+ZHwXIWKwls9 zg({hllhX%rbYab07!LNq7^8Q8;;Is(g=8x!zMH_-iz|7f8D@W@t6D;24r-eT7+?{o z!4d2utO4qCerh~}HqW=DP^hMcKKCXsJ#uPI2rc08ax<8{!ENvQ+UZs^=~Nri)E=Q* z0;eMF@`OXOV<(YZk^W9*b43Pm`F9UJX3ftccA1^Tpq{CAX`J(4HyT_Dhf(6x95&7| zhmC{%WDZ+}MF2y%%yJWiBT{C$3E<!)IubB!D*oCH3X7TBS;Wm@7>}a(20B($7%;F# zfi=9L+tjd_c7u>%?l~e^n7Og8n4{4_$sA2)Kx}FT?~B@dP67LsXbtIU9w7AZFxllo zLn&tumt={0kqum!L`u|yv89L_>C0e3w(=Uu4&@^8BZ0!O%hM5BS&CV2AB*xOXDb>W zPh<1Li{dDbcijAlZ#XlM;7A8|d_8-_Z>*nWg?~7z!#iDD)Q2V66j{hd>wR)G7dDA& zs+2_#`3Ho>M3m!fHfJ|jkDtOy!?PhF6(%2(z%^!6BVy_{*~<y9_H-<-i^PD~Uu9=o zyWNl`ZSD2|L*9tzF;Y-qbj0&vE!u8_N#w3F%%x0Hu1#K_p={8E$I5ut#D1d8F=an7 z7KJ(1M|HSO+*FJI`Dl7^4DS!(&*Ip_8xoHSY-4YnDYEM62yqoL%)qCu-X)kQG`Z>M z5eb;QYuTzG>^O2k7;lvf_lv<QtT`#{)HHh|DO|M2bGPtOti$}GppmW;k5SlqN|ov$ z3cJo|h!kLwha}rsGRdw9W{V>Y3~GxbO~z-8Ns390&uJ0m{n01kQ%G1WM&X`!#0z1G z!k&s0E*?^4cFKu4=Ll2Ls32x~Lu<WUl5mSe9s0-vUWj!F>Q;zjCp9R%sT@^mnxE>I zglJnsL8V$ysg{bJL~eH%N;fW~*pQi*)3r*`fjyf&D8M@vPqN{H$eQE|-=s(?ibIOf zqhLy%g##qW@}KC967IuoQ?-IbJP$!4cOR8Wagz!ODfNHTTTFG-K)S1%_t3s&r0E&E z-G(;LQlvSTq%q)M4jRm@5N4>P0O>j!w;PS~dvZsVpD8mOJK3I2S>A5jyxWepf-Ej6 zjV!cnncO3;7>-p!Q6lu1qLp#@LL@qNNO@fdmeL(;aWas@q>DvSjOBK=?8Um+WwQ4z z=M+##Vs*RP>aZ6v)vAbj2=~9ro?MHKlo!J!!&+uoCUasG$n2&+(o9u}Ztje%BG+QE z4cFSVa#N*00{XAAJ4;_rxy$6i1H?0XQ0a(w%7Qcs&Ez}7NvW0YtQ3uIm}Do}wyPcy zGr;RE8D-PUOJl5(^O8^$3+76jMK)1=loQw-&T{J4a@vE;b;xYmvdZgr(j-7ud1D*J zP)9(u&lHJ}!xV;ony@*JnDn}3F^Zb(iru29`^4^~j#!c!8J#Gzrjb)?<nT%z$fG&2 zN`@zF!VMQ5UNrzz*CsQTD7ro8LRXU|Bje;k@Y@QB^Qod83W3^$LLqd7#tMO~YHAd! zX+|N^oeCia#5cXszZaa2m71EtnE9rs$&s4RJY}fn`OIpJ(Xu|mIzVlRtB08!+XE7~ zYO+dNG(64lgo%uv8K@ZnY0-ME0!RkTtfR43>7ds|pvvLAxB=cc-(JnH<{UD^5IGY1 z1cT#n<)&vPawj6)5Q(>gU>!;Ji~PG5X()3~4d%gKcvQp1!PI#dkP^w+N3BPctV--C zB)fFc&&>)&s-*(dkyV-0)Gel{AA;FN{hbKW&6r$Gjv|f4r6}|GJC+5;Qc|435(JZ3 z5w{7lc#BjiS#!zirDgro+904}pBXE^0p56JW5`f8R>JJXYK6`Ksy~BR&?#cBXyxRY zCpL|RP7zxUwwBB=R)Yw4=A3sfm38Kvi^peNOG-{OGm1sd`u!Z!%KcBOmH+zB?*{HS z6tc6HiSB%)!r7&|R}b;SG5=PNATf5^&m#4B<rvzqrLz<=Fj?q=^#esPSYo-ZT-v_X zlhGCpI8mpCp!*8zh#1U|+ivTu1_5M~6-{}aiyM7UKp591EJ9`yQ8KTILiNMZUQrR{ z)hrGer}JL@peLH<iLU0u+ekh0aids{yvXF9I}XY2@AeN;q`5K^RBFR*BkkZWo@*+A zHfqyE3XLC)S!yg!lU_})?GP&Zv@5S`$qH;inW#VvfT{rJ__)^<z!d*>q~H$9`zxS4 z*k1u@;%<pybZLJ@;-n&25FTqqFuAwKesoT|J>W&UBI8(*6vqt3?l%z?13}f>c<o9~ zLd_D&pg-VX?#eerl0u9Wrr6?PrUXdoyv@<7@km!ji5H`A`;e^~Z(0?*ntr38lVk1V zHwuhF>AF?DVhnH7#`uNC^RUiFOU5my1K6#)C$K7mO;s2zP}g6mif-S4s-&<gIG|%Y zDBCwhwQrigN@-H1v}UW+Tr;NpT9w$oc9n6YA=WCH^h<RprnUk4XOfaBkAWlSh_m8` zmB_>c6trOEe0h|^J|$G~s}>Cp)vx<OLX`87sAGR%!J$>mk*y~Y`fT5N(qub_?$46( zp9k^K5sZZ*`vxA=Bndg_rJSNz@(77B3LR5DLgGz3{K3*h=|{ANlvC}A^<o;#oZkGG zcN3^nwp?OJqsc=E<l%;2+GaO64&skexHXvGZXP#N(kUOeo{)$|{m>n3`Q_MVU(`hi z64KQ~k!P18XNt+F1nN-{vkXW>1dBw!iPQvWNjl0(k`yd55PZNQTf`n&WqATqv=SST zO(p2bsgzkPFK6fi*pV7QP?iuSNWwh<O38#WNod{7nG=Yyxpj2S;k{Z7sv6m64Dz^w zlc7sLih!*l$!)eFbI1TL^Q;2mS-tx1@KMpd1n;gGmE?hxX)2jGm9kpeBh=<yGes4u z)ubuPA=VxUosv~plu@t@^_NkQ2(yV}2abYF!eKUlD!P@gn|&(*6x%V*MObjCxf4fC zRzXP63^Z`mMnxI+*c_39+T9>pT)?qk7OhsG7zkm;NVwf;_T&-cZFyZgC?l;OUG0fc zw=Ei;qeu|UaQ%oTa5#4pN4N|_`FIdd6)@`Ju3Wvw5-u7<i4!7$)7EnJ8VmOmqM*Tj zsGTIJ*I3-zdmxX2-TxX(3?`Q)nlYTd;W4kVxaZ5OOdkDqja>=k*6*{#%<spXm;&G| zCH6va7)kC~DTa0o*Lq4S^{hp$6si7ViHfXZ<5yfb;fR8RgBt@9g3-rx<ECnSP^Per zYmALH1T1-65gT0JSk!lx)K@AS_=<~r&ac!sc5Xn8J04q&>vyU>cC)kRh{xrJQm9oX zd<;>M+buyM5$1qj=ywP7p#_WtFbxhYsEpD_<HR+(i)%;<-V{+gi*ay`?r@C+9TVZ- zC<_7-yh!0gNxqFoVR-(~u?xQpfa&`wLZGqm03;k0uCLRsrMNH^1($5=BDjeQC4?s8 zNixDrRboOtr<D#7ZS2QO9+c^^=AVt26boLDM0P2LCu?<X)l`tnk<K$m)<DiupnQ_# z!R|5ydAhw`{R#z&Fvv&>#Zwg{Ox}h|NP;vflu(_*7rdG-*tSBsa$3}+WBqD1=TGqm z4M+PeIFv%;$tJ89Rd#H`W{Oo?f@r_g;uT7TyoaC~e6c)i3T|_>5F5iD2GP4r9vO@9 zfCCYVg0WBbF(EDo6C6Tqi`q2I9ArmwvD&{>o08x;tn<-s%ySg50f9wf%7HWvns8%# zja<cuC<-&7jE~}}jO^19Y1oJff~bc@a1;!oZzE^n{4ZS>&FF1N@-C@}38Q6j>pYdZ zSn~Q0x0*I%Hi%*#?s{wqYh;IGuTMnzTaXr9Cu|?QsB1-U@_OYIYK6S6pzOrwHQw@r zVsXLIa$YZt#G9F8?St2t3#u0hynI{>oHoRRMQkq2Z_&`*ux$>f7JB1|BDga{IHEcX z1`2aE++_1YSzF{XwU=KN6%yP8^_HH8{vM0;$8;{(B0gBePs4s5U&fkZQ_4%-mJj2C z?K5^gxrK+Em3E5w3^oZ$PV-YBi)SQTs^=hDglrl9WE%|osBri=n1h$R;ldknI3l|C zus-jKxw<BznvM(C0K?B~f#dC4;Yj4MO41yLWmC&@^$PRi7aNTEV_A-Vf{l=qpwHge zNui18t*Y9Lf^U&qY4LNdI?+hUILcfh?~-VZaYrTmHLBGVTf3RDO-c!<4@S5a4bN+d z+6E<8HknVCZX2H(yPK~UlY;8S_Z75czjYy%*0H5>hoT}TUQ<NACk}d%QX*TxwoO&p zID?u{zgo<!1VMn!9^g}|3CP|sn}w-D1FK-S2lqQg{1^;l3Ef`t-^X$9n7Sl&doi(k zZ`Cq+6ECT{ruuaxc#z;|T8aoXfxniR^tk<P-m(7vAF%*i!uW>4%j?72PWr%z9&+s1 zEw6)o*u>!$FA8%UZb`wdf9&CoQ^5GMR9kG7K()47OZ+!XB!W&qY7w%bi7`k&GmsZf z)bb}mrWf$=BrFH?10PN=xa2xpq6HJwmY+urVwf7}hhZN5Fbv^41vbcpj+Pn7$n4<= zkk)V_aUQi-_q<D?DbtE&=QB-$hZ|w1Bj+!8Zi_`aGjLb{k|`S<nGKtfnAxIu9zjUS zIh-Ca*<0;Zix=@*`UIv5$SQNDU)2Ds4T<k4&v&LRGR+prgP|0ghOXc6Y&}1mp!gwQ z%z?hIR@5n^dswR!M7;Oe;2>b58_NPz4dV`GQmi*C)v!b1&b)>dVYNlW`(%J{Y;ov8 z<szY|O~M?F^Q6Kw5e3E^dqS3HQ>J0XFO%oO2CT6}8?H$tH;Oa4SxjJVQvA6QqRZH} zRtT5pdDgrr7%C4eg&c&q@Gb)ooosWY@eU2k@_ayZ!0powQwkxa*8DSQZIDYv2n*yK z5Bzf)GLRz=rYxN^02oh3sx*DP5R+=;Ee)I_suP7qL`Q@PYSm-`O1b2iIeOX;ZB;9Z z+R8U077oyB8`WmaBkk*rSl9v+$ol6Q6&CDZZw>6sf&IDs5VrtI%@Jl;4Y4Fdruc3O zb<-uplVfESAag|=?^X*$>6!^-5r6Zq8`xFi&`aNDB_$qlCalggv-uM6*qq`y=f;u} zCp$GYT&R#Que$IcaGV4IwcgNpAdeI^vnaS2D3we`4~jsEax4+F6tJgQbNLKAMUK^^ zEC7LxF<1Hk+3l<e%!gMMz?&SXWqkq7U%n%=k#S*P|9QYl`^C%gS9r@0iM8-qy{fPn zDpo264cm!TC+29n_od)$D1u7)!4^;=6S`(%ziB%<EZAakU>3~iuWg8=AtsI7gig=d zHYC9Da7=(FcH7xhxV@%!0~INeQn1~8(I|?QjiL@#!=;V0IfeO)a0)B*3zNh7loc!W zk+p+6cniS|esL-{Di@^>`nYA|k>9!)Lk0D1$xwA84bmO#k=9(Q+#Q`SQni*F^^@;e zoNCkONh=z9X+xQQ%23OSsxo_m8M_*oAYuIv3D^gC8QzYgWyvhvyJWCy1U`+v*$vx% z{ZIpZlR72Cg5sXGa5h3L8o^bq&-qA6VKN|yck`4&7<)%v{dru~K};cb8<dn%2n+*S zz9S*y8vn;x;6MKF88jMsF+tl4r7R!1q#7^1E%_56ECgNCCbes&NC^$7mL>*rs84>N z15&9t|G~Bd2TGyR_2Y=aHvWg;9P!n2>Q%rbMpBT3f}kulVBp+m6W|kY4E0Kx$r2~M zz$3W@O+p)a5IUX(zbI!LkvATMbC%t379<iuaIoKB<dCF&i|aL}S~E*E7BX|_CN~J| zD$=g@Ar&v1+=~Md;niU+WIU3=k{u@nFRLkck~{rUotHP>YMdhzPeX7<TZ0lR{euTo z>N61>Pz$^SX=;JZ59JDJC@$$2Yr(mQ^pLb)s)h1S)B?p~+nTjVbJil0=1PNNnW%;8 zEOO_3H4v{r$!i}n7)mYDR4p*0XeYG@Xn;~kv>O03svJZm^{^*LLbN_^y7+p~ZOtPV zjn<QmQZ#%mGRSvcXs}Y0LGh&+-QZq%!3`>_lYl1n3;hU!Omm7byiUdVHVp#vAbgr0 z&3Qbk@a}FezJ3%>)L8u7OAQ5Vd7-sc>L5;#G&MX|rG~V#6X1)`S&!RD2yYkyjip8+ zr+Qm}Tb1(Ylb=EKu^FVr$e`+PH+QMi8udRTVEFSxQMJPatA&%#_!Aq&_NV$nMwv#V zei97h{M6HeLo$g+6UM?K)&kX6wv1@kVotgpE~?8S!!2uDUFhAL@fBcvRs&0;wX`3P z9m;1W<k;af3V^FmvwW=)_zOcCS`xrmD(XaR#Ehb{(hXS+<ECm6b_}Slk}^IB9kflv z^1~A9G^0<8^(nEXN^EI>*it3dE~&bV2VYTBE)e3ZdFP<1s4!YhO~A{Ky63fnvF!Q8 zev^}1h?UXEjjF}4WQpVYu`Z;=ghiB(gl@<jg97G&G{^Eq5`_4;7eA+k@7#s~wmb=& z4HueQz4r`jHy||XXl$Z(Y=b-{T7_c0E$z4sK89ZBEK5zl)NtyS{^qv*K!QaA^l&5K z+z&yz>XKgVRkN;8`$>pQzBmD;bu>%6gTSpomgoSMri4TWaOgME*iA6Ilg9;^-9;jn z`Db^L^%o&D*53y=ZO+y$BFZP(wpLSjbo(-@howg+V?VS*nz=E?#4FT(qCLbp_-y-T zvfhldGCF(YP6nS8nXaUWePtZ**uB#O`=-FYJD>^qGws}7xs%+fk~>v$r;_X#koY1) z#G(Z{H;R-&q}q}pClA8&)TA^|CZ&1WwBX8<wkbdAnLC6cb<PoZD1ayZ{(C$YiFV#& zRwR=>n?I_`8--`z>9l_b{<pBnSb^!s?nx3b<SA8^d}*%yP~@&K)ic^u<6wGCiz@Zr zCXPuJUkHl*`fM!EsmcR>tezrXXm@G1ZIjSaVG%FLf9Pm~w#{=zJcB#Z;~F*)=SQX@ z9TRD<T`Ce}E>OWI?z(a^)p6UOkpmU`w7alk0S9)&$!EVXU{fXIuCi5(E=;G<c9lKE zhsXX~ez(tY`$%j1mhV5K47aob_YXWw(VHpd!LQ=be3<_u-Z~%hEjUzzJlwVS$Qa<* zwdZWkNKIaX!>n6s+fd2HGSO3|LLS`@4zzGNCwr>d6$idp7Fcbsy?!espP8PQIwtq( zwLzFZq?C0lRY!$O;nA|{0#Uu6=WSU=^-z4CO^Vp)nS=Wr36aimf2Qn~U<Cs8niNSP z@Enn*Hg)$yIOVDDcNA8I*cA~G9$gW8{jQ<(S@pcO$r@cp(^W#UI;~Ai)yqB<^Z%H8 z7x+HM`~Uw=Q&g2E6h-l&VR5P?J*px!2&#=9=qO2=q)jwUB1tQZ`A~;aht6v2#;gp( zu<~_2OzSXZY;~BK!<3mX%2sDH=Kp-XulxM@q}Xr&|NnPCa_9NJ-`C;3uJ?7gulu^M z`~C!3(}$?iSvx&{*6eAV%i8+mPUP{Pn9WXC9^FX8rAv7yU3Bz*VcdBbi;<StYmwCp z9vYyDc=<UP1NGDOeJKZ8oLPC8{}w9)mu2Xvk!1ik7x>^sle??9Z?H#hJe7ZZ!XiCW zQ1C^om7--x!Q#mvg`|XDGEB)Pv6PI9r=)){(nzOdIgu(QYGYrMlI!u}QldaXO72$3 zS>#izA!5m5h!iHPU)8|70uQULW#kEvu;@1lz~obShW_6qK*CbJ1{nCDOX{N4_q;_{ zW633Zi(}d2ygJ;cx>d{nTzN05Y{l2zsCg69U(FJ%z@--;h}_O!xZFAkG(qYY9oBLF z!rODT-RCd7A8oQ}J$811x=L+14y&C$bg<i+$~+-LhaiOVu!hjqC(|#{{Y=fjEO!OI zq7FaS-&@Z{Bh0Ap%2Yp=Rc+B09IvsX;8=@gf@$;oeX;uEFn)~XPqX;(Gd{7=nu}er zaqhC{h&wCl(<&=Gr`^C6U_zxdCVkOPxo2MJ9F&m_l<vHK<S={%SHQ~9AbxsDYf-hG zFLY6E!u&XQonw9Oia*Can3mG4l$nA&f1^)n5t*}n*<+PliI5lMz9nYYzu43TlZ@_( zwU$tY*FH@(l7$X8-&TgmEfMRu*%z$XXu+D#bX0wj9=#(`47!;4GoiNHXhapNvU?S& z8bKEN1*NFnTR~OcJiE!#EG@4^YbG!6Ct(sZc{$f_Ugf28%Wwj_R+pMURFyXBD?##a z7L-U$ATmK!GM@<(Mu1cy{sj+{$%*E@cx>6nzV@Rv<RlPh7MJ%Uw*?=CxvfO)&lT0k z3q5*2V$5LjaA}8MAO4Hw$r&iyBFkc)vegN{b@{G*tB{Oa5mU78NMFyY(phvu>@{M3 zJ<_);dR;TtSM&oFBlobfUI#PI9DaT2C!Ti^qR8eZ2Y2=zzG7`D$Ad{fGlxW3q%s?L zXWs(k!3$p7=-w>pdG_-~PYhj|XmPprimDS4Qj5rcb!Ry;9|u#dsnG>8U!Bo1J$*n- zj^`KXAWRL<yO<hKQ?Y9)6${%?Yy1RO#}l~8%6rUq{)<|ryd6kfxi!nG7yW0vew784 zTy@#xpjEop+G97Tx`VYYwbbhTd{(FV&n8Q)rLHBH<Ui<ps{Q6G)nk?YFlPJ}-DqMm zeEBxr5L|M<ef<n7C(NyuCy>N%S1kvV@by*8Z`&jF(jVCkneH7@{ZU3mX_L^dcwB#! ziTWedvAU)Aj7!uXHCq*!qf2V6KYA<dk4mEwC=GfDf|M@k>FagdsY*GO)khv{Yj)VW zZGZm3N}7l>ZuYyz>Za?_SYDIp(emWC#(kG3bpfd(^BGkWMPBDRW6RCFp}LhCqw3bI z6V+MGQiTmV-|g4xn{VoVExUC=_iNcDpj~X3$?*H!e8ZRpkHpq!`Bl%*`}-O8aiKvZ zIJ^qF>z1F|B_+!&GqH<VlxDuzO`FwdT%H*1Ye=umxo>2~JyzgRSs24*QNFltxS^!q zS-6{+==rz?ZW`AtShLYRS^3vPqdQj-L-Vt`3{zNUP5&_@R<Dyco1s<wOnA6E45n&y z%tXhp`Jd>Aru+R+-KS3v)pOLwgln~2hjJz!rxbCrI`Y-HiF@Lj^hrEZOBxprQs-A= zUq*CK^yb+L!fOBPifR`2P)~80uR2P;j+d^LmFd2(=|N839?pyi4w?Mr+>z+cc|Mbz zPi1&O*y^Az`5m#%kmw~=zdiZAbHD0EeHjoqQx+*TXxtGV{Z+Ub(?_EVt`C_m>!LaJ zp7tF8%|z}==sjVnJv1z3U6>BYXlcLBBNO&5l6@0>{@{Uk4(P9!H@Y`6pKDLhIg5PD zSi%PT2ZPsMr8vELx&)5?X7N&frT2bCCD8RyMV@No@%9ouFAXm=JTE=-U8~^MWOh(( zQV{q3?&Ta(bQz#!K`Q{$(|3dUT7)G5Lr9d9e?LX;N)V+<h8eiv6>BfSl60byr-2K8 zi`tLQ6=QNGe5oHzKDRO%(@oi0XX2i6jl+!NXdJ&&8fZ}z>$v&lYSOEunW_(7VYgIg zwZYq(7<Um)C>iJaPfp+}O|>}$M>Rw{E*xW3*(^<!%}467T9uXv5|`%4tm~-BsTMTE z0sT|MgBt(i0X2SosL?6ImbUf^9mXCZhQmklrIK1i|FDN&6kOU#N2ND^8e?7c&7V~- z>gEIOgYoy_HN;aHG#KXoRt}z^f!5P9ikrhvdbmiv`$glp5B<Q8Kpk0dN?m~^pI<<o z)x8QakBomXcRM|mT!909sj5uQM`9o6ba{J(Gap%s|M018YJ5b^j9-z>`WY*U*wDxg z`Z8TJbq@1V;y-m*WmOj~wWFk~vI-9+R1La>;G#{N{f@n-E4K`8$r}vo0CYj$kfk~| ztvwG<48&qr*kpQ%nBrrkhG1`YMEADR(i7xp6Pg7%H-NGG*J#L46dN)iXE0#;zBK3) z!d^hPr<`Az<b@gck;M7CE~5YRdsULm_kg);vdcCdDZQy$kmkOVbIL*7V(xgHxki2V zuODd&yBRHR(w85Juf|%WVy}@!bhR#(S?Z!Ydg^h`H@X+Z?&;&_?`?cgsiA)l@peQf zr82k&T9l{z6tXK5rdVZWyAf_yJs>TXT331shLQrzlZHI~tt`#T9~mLf@Pry|<ppif z$z^`A%I|cmoC{WI%}I%`TsyCX6PGMlr3EbNg5{H@xDeR-CpQnvsx6BGtr~3>+U1V! z%pC<iny%4RxO(<%rOL*&RVoTSzOm_QJyF-vwyLgOOz)p;pMLrvBK|nmsdx;|I=4P+ z?+Ltj9vz%Z1xi5&L#oh({%CQ7w}a;oic1-BeQ*$S@JOASQsRF`F^i|5s*LG9=00m} zdR4s%rAM}MM{|AFZWDdDm$i!i@Q;@c+-$%%7_mh4Ezz>R(U`h2qhgdDsbH0*)f~CC znfm;>@1keXcAKYXkbD4rEP0`85Awo#C3Rp{sohu=&E{x&;(n;#eb)ZcBAB;_J0D$= zO2+JG2K8s+IBz(PuhZ32j>&Vzz3dnB5=%tf%eFBuu~f+mInR3ySP+f=bNdr@$|O6u zY$-eHOEYStm0_o`AgAYay+opv2t#21cGzSYmJTlX@`7jQsiqSg9K;+r*$i!2!if$c zlN`;)*Q+JYTw|rMpr@bSdf0_w1BKIEF#pKB7gK$Go{RCOl!Tjwb6=lV5U;yGZCI;} z-NXHA`5{xPOU<yE-n>kiV3tssK<!rhbyyXn$mkWZUO%~Lc_tsSx%e{Tu=EAXe}hyN z+~cnGkK0sTM(47J6*7HK6>EGfx<!MySOmpGw5qvdyzc$-#F7&(mPt#2D-ZqnP&IcE z7&v`fn64kumuAcEQ3AtDj{E3lo-fT($5-IdOoJ`QAY1OsR5}CCc@EnuDOl0`sKZ!= zmxB4VL530|pDpO><epPrPx}Eq`;`#&npSH1U6Y`<CMgmbNh=19EF!-I{kn!hD=j^I zT)kl6IsJ)*RM+5N3%8K07pH#t-z~MWbu#5pQ#kM<eFLDn0iRTfvzzt$g8ImyXsOpr z?D6QL0sY@ntSdj$`?SkqUa&`w7mWxNja@ix0EI$<s`z;6YSo8Ii!G`Teb#>e?FkfW zV8uRR3iK8bBT9W-g_^7q)}^?wF2w_y7fl^x{a<c$d#~LiZuAKkZ9p{Mz31_S=pNSW zxu&yV)rLv}{UKwUs70AY{mPaz+W5L}RK~|2iB@g}Rim1fp^QqE9GxiRYS!h!p<lD8 zVdhp;Ft0J_W$@2H#M-Wmq3;w=4|*b^4Tqysg8<eoeS-i)*X|e?=+-<2D#buHm8SKW z4Eg%y9qib6PXi^A5?=(RhZ3Zg2L;w{_~&vwlFDk94lZhy?#ORhK^`pAmAte=@R~qr z8S|A>iQK*(sX-67lvym<JwB*NiRP%!+=gEDMu=N|7B742O&@yuIwA>9=2GBK;$VSl zRqIlOo?u*9qv09rP?p%3B~~PUZ`Wt-kwIiG<?D-VDsRTEFDkz*^ub-OPAZGK;5w7; z|9Uh1-v6(do@+*TWnR1Qn6|ryB(Vl(Mt}4h7@dZbp=9VsxL5G)l;t>|$tSJf<ngGc zs{H6B{pt{ne!}uwkI`cdK2LjR@_>r#Mp5&+Rl_-tT{}wMfj^=v3sP&ft;|&rwer$b zEBB+?E%0v@YJL8RL(dy3gGv%huYdo@qsj1B9o_9e{&NN|giGWvJ@m>GB)2|R=D+_7 zYK>*SZqa~(;9?V82AF0V5dP$hWjUWO`iKFg`s#S;fj0Z%Oc&i&CT|>bZ4#{qPu;nz zzS;WaN{w#f1I|RQWA^N0wK5p^{MYQ6r++>3-PJmm-BRv}6dUBMu|(LFuX^|+y11`G z!(d<?;OK6^h~svkjWLNd4Ei*$jW-?PO}=pxioUNQib)(H-Ve0d6txZ*aX77iny1&$ zC(D6Vb$p#fl7<JL!9{(~MAF&)`&Eg)Ca3`VqKLwrUv**G+AHEGEan7q(IUBC&bYVl zh39xngNPPQxR4w6v-u`6XHxjDR#rDWZqeVOs$;JYDueU}N`w--23msrJfV_lZ0WPJ z(%UPv$S*xJ;TB@YUin*1s8~DvPwSh0H~0wlzTWoy-_@kO_<y)bO4`9D?MN{?X<zmD zraO`g{9u!QfpnZn4~LRoad58srtOL5T7opkq!CE1CRHIdnKTt?mPw6Bb4^-`<YKu7 zsm*k^Bek3K2vUbh&mqk==?$c2lRiQ^$)sv3?jq9N*ZURHex_T(*lk<q4`~~dj@c-% z!6W@VZ(q|rjkLc>o3SQmv`IT7Rho1-(t#$OfOL>aok-(NIv1(Rq@N;<GwEq0XXn2n z?PI!6k$z#)7f78Z4eZa<xJkDlWlVZ6l(yI;&~3^Cw)vK~9gt2oX(-ZA3-K_L%CoOm z%Ba-&8;R6o{>CCXe{Ug`nZLzUi5*RPE|j+Aho+tGnj+6DH`k|-TzoGgonrC5isa(k zxj2Y#1kxQAVjm=zx1S^JZMq9L4`TTV(y129l}Ij@o-KoNTZ`mMYa@OL+ewqR_Pp;{ zEW1)gMwzq#$+^Bqk&ZCkzmZ0o)U=)FtuX0CB$t*`k(`}BLvpd4L}S>={O!bJ3@7!) z0K-gI5=x_yGNwB|l&;%3sIh&>1Zr$w9ZHu{^kYp|MADt~10(|B?;WIlP5KmRj7faK z#;Y)C<J|&jd!%Pfw=<H<M?<;ikpW^kAMe9Wx)JFBlRgS{TjJz&`%#&ltu6?qJCR&l z*q+n7Hgh7C)aBzV66ZqviOTGx7imr|#BMZ`jGgTuq}NS46v?IU7$j%sTRFW8+qW{1 zb~`XgeH)T<y(N_X5K8ya#GLES;{)l^L-?(3JKLk7R6(ca{FP4#q^Y4aKa_qFO6!gc z{LP;f<l|i=^^1MILniYp;3lmOr46U>(FN0u4yEQ$`bj9=f#gc&_NkutiG|S5+d8`x zPxCwqk#lq+QP@c5Anjt(Ql#BYx*ur|lTJ7~NZ)qH1SNAQ(nbXeI|0eXd>0a#LN{!B z5MrzEdfpDEI~b|RLL83dLaarqG1o_r<s+jey@-@C>E`2tuzyC{&cgl$$%Q?1hUbwf z&UPyj%@AqC@t#Mrk-mqtvxUeaxe#w5kriBvPYBN2P)nOOf6YkF-)r@O>nAfkZ)*#& ze?!o39E+sam->3ONJGta9?~$=or>gQ`2q<u;BRoF=aEsQdL#-5>Euv4ABjqVu8YeO zNkqCB$>rm6BwYdfddrafd?1klbUV)SJdBPsbGGMAH0gdMm&;d?CYx@{X08wx%eF`^ zmR}(qWv&l|(jP+U3nZ6<9b1A}4hp5FP&x%k({_Em?<2XGZ$@(Yco>P|#C7`<J&$5S z8WT#3kX(;`1=492%T-9urW3eu*I9@&kxn<)bCI0u>qxG*7}FZWG6CuP=I<yZ=WnyQ zo;So|DG#L?NG|4IA=R7fN~AL^>~E1=*r$-Prh6Hw#Qgmo=}gmo82a0|jZ!t;W=PHk zJ0Q)s5WhrnrS(E6{T=Bn3-KkAi}|tkARq4_Eil)AAi1=R?O^z2@tqS&2b>gys6{&4 zLNp?|5H};a5TA$AMI??YO({GON*^ONn69+T^C&P}zlY?kc2y`nfkais^*N*_JKLX; z{QP!%-k#=qFp`U}2g$|v7?LZk)8+*+Z;E+bd?S%MEWWWwF22K&_~UFB0~d2gS942S zcauEW#&NAQwcYhITbpV-n;P0X8^>l^+UD1{wlrqs#6e?IPiB|K{)Fhoe|LL(W^R4k zDVeVJ&h91`u4|`E=AdbZ?xbMpa4l^u-D5LzTe`Yh+Gg+F(#Baib+<d;-1@FLT^1@G zuD+qWWqy5kQ?0y=&4gz)eUpXu19o(oA3s}jn>uGVk*nEl?VX%3%pN&wX=v)ol<v~F z=Pr%AaZbW1&t0`$-A!{NJ2bY;ZEEXkX>XI)-7@pKn#>wG{u|oowKitj+PgFLjg1+_ zL4Z~wZzWWByGvolZ0#}_p0B%HzK4I^DRccd)VH=`@snG+o5Orrv2~x)(d1jvirW5- zA3LL_v;9PD-8JLDj*ixrhWc)@)itBLbAC(H$upXIs2pwetutnIHZ>`R8C{(XGlE(p zfpQww5ZNhAcQWf7shXJyx|DN2&;PCS2RVxDQQ_)DK6A`$>9+Jxhcl%uZ5X<~G1ESa zLlt>qi^b<>VQl7GM_I68fwv)DOu^tj-r&iDI*b)?U>|Q_#U>pE{rh<RCvWIj5pkPC z3%wx)W!{#A)usWzh1r}i@vxf{X0txtW}W?=z7zM6eY_zbZ0U}l;dqNa-WHn=>?qi@ zkGJXO8+W+4w+iFFp7;y+D)u&$38VBp<EKOEQkaU3-8m{aht4$_j#T=#wKyzHCw>*j zGsIC`=oJ?X^7<>^O6z3Opm3M=@7QLX+;%rN<x3Yk=YMnOU;b_*em()b&CD%32G!xd zT_MAj&Ama2Z>vIYE98Na2lep=ZC(`Fu&mJAx?r$ZB)7O-mA0T9(hO|58#cNP8!67o z#F^IfM8)zWTTaGbkgs&O-3fmw;VXPw1pY_%#a>%ruR(lX!na9qjv!6S`{v|badvVJ z*|QUSmQ#10q0S70mqNu^fxG-y;9qqM{Wb^6Hd~o(WLqm&`RVli+~$W>J_Eh%RDpeh zxZ>xo@asd&eVap67Ta1`=p3uqEuHwSLgsqp6?)4;X$a-(bUl3n>E%$uo86L&+BU#< zust7>M+8c!*n;h>K!9<1zy^_n293e?NFYE)bK#~N*I>IP5a5`?=wJk?4mN#GG1$%v z1bFC%(E-=!aJw@W_V=OI^X`wyPsZeRG5P6OoVUl~`ElRK(-yIGo*46EbDzGq?pQo4 zWBw<`@)FPEp|SXf#^jTu(|W&-$)z!y9}&~v5R<p~2J+;XpSxr7wJ})(z+ihm5a7Wv zIi9vFWBMmz^8d!<n_{w_?gpD~7lQ5Hm~G?vni6<`d&K0p9T?w+8zabYdovdQu`zkS z(1#mj28S9N2ix~z>G?~bgz@^^9`pb6n4cYE^3E~&7cqHEOzzG9W3l+-{&yj4Ap=f# zD_rRHL;8W~2JnAZlZrxV5YlC)8_fUjn4}@IlQKv@HeCt-OHI;$CuunQ6VsLPe>aoV zV>n4^y4-Z*_`kbJm7!FH^fS{{^Iv6GXt$3}s^M5RE3{kV9+Rf?-$^r&t}$I5|MxPf zF_fB-R7VPJqI8%^9sGBadWT<`PI2vR(rKZTMY`E^XY*gVD)bhH(uGK>-G$y_{+FAy zB$SpS-D<ik_+MetvQScb?=;=@{2y+TYQB?}Bi(Jf+xagW7TU3s?&tVk)2-nDNRu83 zrBz7sQRqF%|4}Bb4yEUiR+{bw{*N~4<xpCKq?ii5H~2rsq_;xpU8LWdZXN&kG3ldF z`V2|uF7&?O|5%ee>ZFtO2~o9p>L1d+CJhKBO`s^Xh29{faV8B8C0)DJTNip6B(=vv zuOyU8k)Ac(o=E$fq?d7>Gy>_5rW=EFfJx&*sS@c=rmI4#G)W^NCrv>5v*~J(4m4?M zC{0It$#gT24l=1Olp2v<F<mp#c#~Q~Nw<Z6HC;DSl}SCJbQ;o|rpqF!FD<m&U?(j^ zr!pz@E<`%Sq{X4M1nC{qEk!!iq$@&c8Inq|(7Ohy+NA44=_aJVn{GMMVJ6)kN_Qiv z+zY+?kq$R$MJPRj^nvMCA*sKm{)N(Nq)$!v9MWbcy%0(-BmL8KYmf$-^hPMXh4e4e zy^B<2(z;Ok2<c1HeTGzQ(ifqmFD!p$I(-pibCdL~Kqn1AD!^}{SA;adTp4!y5`#If z&|HTg9ciwaP%1&{XRf746U}wcP%1;x(w{<4SMo{bIwq9HAq_CsN~9WdtqP@Tq+)ZO zfOM3(>gOw*G!<zJbDfSf*<5FYQXSHk=Gus)t6`zn97?T7`c>RQuLEhSxps$=#)U)7 z^)#eu=9&$qvypZ%*M&$&o9l(4v>0iqxh_FE#$1<%(iKRh=DG}Ny18BxO4lRpZmu^W zeb-!<htlmxS{y<Dhonh2>R%|WKq@!aN05#)*HxkPB+_tmU5zxuT%QZ27m&2#rO<mB z>3DNp6H0F&>DTBAy|<7~FxPiOX&urybNvXZ)?7aer7w{7H&=ptb>`YPl=>l6nd<<g zdUGubr9nuCnd@MrndUkqlrl(1m}?1AgSnQ5(w<2ASWltH4VX<rQU5|oV`zPms?g)s z&mI*PdX=G6g*4S%tC40|%o9SX2I&}cor*NuT&IW945aUxYaLRvxi*GUGtzP9+KSX- zt{tJ&jdZ-Z_8^^TuBU}k7OB=;&qkVKt_wryLZo_gU5wOfu1i8`Dbg%+y#h(2KJJG? z=^CVFbG;s^&0KE^rR7K`n(OUI?dE!SDBX|LYOX7gI?VNvP+Em_lDR%9$y`^5(sM}N z=E~Z-uM}3-saw$KxCvR;)tS^F9gj!WHUGE`-LbCbx`qw&kN5PCKkSPT+q#g6GPZS_ z=JB%a3P;S}rFH6*Rhj1BpLgx9553wl<II7Ne0h7zJ2$;_!2Orb|L#K<o%7Cbk34t& z&r5F3R{iMniw4b`=pA)><E}6M{GcCPc+#;~Zg}03FO~m#TF1v%ow>=W0fQ4&Hnh*} z7}nDG;aPnPzM|u$hRtfK?;ciGwz!}m>uct>w+@@z=#fS8C_lp*HPJX<nYUCIGT)Nk zhBY?LoHx5fU7Cd~EO_#H`f)`PZoVINY{bf5pgNJ<hIKa9ch@_ej8<5%Y$G>j{Oe(Z z9*_J61{M2w!@8M-E19cm;%&fQSg>@y=P_O2m9<~1L4dz)3s-ag4ZMt{z>R&&=u9Jx zMpbJP8p{-2YUD?)B$Lpbfkq)M%~&kVghy2%Jx$6m+pXX0xYJ1`Qw|+IV$7%t9ho0* zZqwYk?as{TGUN+QSCguSZPIAF)c)&Vpt&MPb6t*Rd5-4(9F0bRZVO`8_$sM+J5YpY z|2RjpNkO0r;@Li-Ib>?>)aK6ilan#)8l)|<^8sio6PjsgYS<$`EgY3$-AHpXnvR6# z95m|^nxCM_Qdm)_o6!_ed8Bc6z8_6l|G1y0&@4`9UPDv2N!-uB(5y~qiixgf)3~2K z(G)Sviq2jsKMao|&GBd!ZxPq@pjkdBuK5v~$}QuXYZYp{xMl^Kq9Jk3U(l@HA+C83 z&GH@NnlI60GjWaPPU?1wYj%@n=eTAJn#$ecn#pMN93{$^t|-gsKqAc#(5x69*Qlp2 z8x_~6hh8^2uK5T}2c2^i&(@S@<w0>x8JcC|<C;UztT{NYITlUX;c-m|nmUGzQOsv6 zR6?T#JIfe2Mt-hGQ<>-!?vtN{W;L2RhF?)AE#oO-$Q5bcN0UuxaP;aJctw7S(JW7B zc0$v^@GJ5&0!@Y?SEM-%&ANo<cr<Gmctw6X&@5xH6=}{xldX+wu0gZ9F0Q#7&Ekf* zW;L41#<=EnG|Lj2kI<}1X!_F;RyM^$?TltcLbIRz%!>P&hNg^RO_b&~G>hq^Bh49T z)+96+p{Y4B?&oqe%NfK(p>9G`$yFuNJb<Q*0Y{{HN}(7iM4C17(;3(N1I?O*=1Vk1 zU2#7HxXx83G~1$Cm(c8nri|-Bbgt28>Jpkm&@4`9rpeFzc&J7+ZVURlo*d1&IhrLo znrjo9l7o9%x=SiXzqql^rK?)Wgozb2W4~WDjq_7cYJHt)rp#&SC>cKTKI@TUeufuY zPa=)B2RK*z?qSRmb;Tc1es`p?ct%vby+`0jp`IYrQ0o(-b5#t#_Ta#eOY=zY@75}# zvyb$qS!;?kqr4T?QsSDK)>0x(dHFHcQev9XE!Hk#n)1D^&PSRN-gjmt(^EcTW2?`R zpYq{zt@fJckouO^lJYTY88rKLHq97sfYr>HpYo+vGvk^~tsY7<tS1_#s2~dqbO)sv z4_|Wc3gB-q`K4@rykQ+tsDAh;EO>#Q_!FdC-rZ}zAdKgI?uRlzrq*{%b>!laY7~b9 zVB}{CVo}0RJDR}>KNt9#D4u0#N)mqVK$A(t^E)(Lc4FsRgQhg$=L<CB5`MO(E-O@Y zuHk5^6MiP5sX^119aFH)MpFkP&6#MHB{V-nqY+~ivp$hF6%C0Xo?(o`yJxx)G7i{T z=g@Xr!;RDzZMFDesP0uFn;$8?ClDvVDCWPSsYBypM)3ZHM(2wBY~A18qeXry&`{-L zex{=7K@<6zhlT{i{QMBj*$F?((I_9$xt>L{IN|4GG|SOM7Sqzt6$woR8jsOc<Yx*R zy1H1*?P#t*6Q%G1G^Zu}{2I;m2|v%GQJSL^euC!qgrC7w)C&`S_D8cK;imyjQ6hz> zp~)mPKSEQN(A<V*Nh0RQ(L5Q(9F%eyny8dt#gB3krMVAd%ooB?2wn*qSvB%=IGQ&S ze%jI8o$zxmnso_3SD;yu@N+wwFA{!!hh|m6&)aA;2N#vahKzYvC;XJ48I<sIAexSZ zeU3$wO=!B&tVn3IoL6~|a{5a&nMBMFpi$l<Kd++MGvP<mo9`z4?2cwk!p{^mA0_<s zpwXOBl+!EFcxa+?J%~nkE|H(t(8xZKpG}KsaS1<T(5yxi)%jUyUQTG1pjnsDJdCD; zzB~%`5t<_WMCZzI1=b9UOHWY8G9){yV@KepBoS&p8qJSHxmbp#Ea7J*nry<)YiMM{ z=<HvixiH~p$mY(5k)JVWmL~j6K~s~6=Oi@OB>Y^AMmCJ%xe?9sgr7&zG$#DKhDP^$ zQNF%FlTFxgt1alY5}I-}n!AkbJQ0oNo}#nQLbECn^XX`M5`LDTc`o7SMl`Zv6wgXD zYZ89`gl1vF&*x~~P52oyh%_hsj79TV!p|{iWasEy^U(AqUy(H~MYAm7=VmlT2|tga zS(C8Fn`qW0G#hfas=M{bVx?%VPsDsMnjwjp>(QtLqZFQwrZnMaDVn<zer`rHBH?Ex zn##o4Uqn-r(0qhuaY9qHmFsPyvwsIoWg_PN(5RFnKS!gPknq!nW_7~PxoD;*{QL~f z3kg4WqiIa|c?Qk0L<-+Wvpk_G-Wtm%G{e!T{zNIPLDP|lxfRV@2|o+boR;wO3p6Ue zs03G_DN1Pmf~F>+`8S$%iI}$;Ozlm?JRD73BGgngx*O-uBQtFC(JW7Beu_r*Im(y5 zxU(b?^PkXoXd*vfpjnpili7w+PQ<)Fn$-!-@n|$h6s70;X!<2${wbQ95;5O_W>CV< zAJN>M@beKG)%hren=x6brzTMw{0^Fugr5V^sQ-!l9E(P?OHn*MXkJeExeQGvk&C;~ zlqEDTqS0JHl+&-!s5M0~@5nrpp1wq9-yhAmgr9meA0_-OK$A_xd@Y)V3C&|@7AG|C zpefogo}Ph2xLzdAwKp17lPEnC(PR>#PC`?b&|HS5BcZtujaqJ$)0fc<NW}aFnyCpt zTW-&NO2W@xXl5k*j7L+F@G~8aT6c7=HZ)}kKMT-g6DhnB&EkaSUNox{nitTtCSrac z&A2e;;EK<{Aa=#yn7i<7BGk@ks>4ut_Qs-7%Z<`J8O_v$pB6NW6MoJ{Q<v~_C7PuP zKX;&MP5Aj88nx5tT(6<&N%;8$&GiXCn=+TFCsI*O7>Z_1!an<=S(ngEMN`I!qB`G> zW_cp!bI|DO5XJmcG-}IH3U5WDXIhb;$Iz@u_<045o@_;aK0vc7;b-Fv_aF&BJEEyf zq;L$HnuKODn#BoC8yfWzQ3}sNvm%T+s0kihH1@k3KW`*L-G)Zb%%U`}LKAF#JU!7E z&JzvQC=5$e^fhBDlbU@hDtc0yk^3x9XhxQev=8z`@r*3rXLyEwKA{;|lhjmH@FXkY zr=nuyinL~wN4{e5R8)+vPH9F|WK)_^!)3#Gs4*imSi@<Cb#^zD9CqZfWWwWCmb-OX zi4*%9L2Y{><7j?73pLe+;)b)=P=EJBnIDUw?@lfr{pa~tL-U-jQ6o&nZ6Wd0nH>MO z6(NE}>9up)8|U%vLPKkPS68qwy{WUdvAwM+cBoelqA;_Yx@%{*w$H3@?W&zMudP7= zwQ8Pla_TP6tF1_DEyS$)h9-}vKu6ANt!kO?ONX@dNJ8ODlUWhpD0x<QEsw%#Ph#DE zdqZ&4*_1duDRr#X`0~no5^W@rw-}n*x^3ltOxr?MTI;(l0Zm<9^|O`z=43W&12cqb zp2^jAHPp8{&of)+HSzL8TYZPU0TI}*D+uSm9bvY`NbX$;GobU)U6HE`*VNbZ!oew) zCWWiz@nC0beMh8l@1XeQmUu6vvB_TX;MI?`Z}-MZeyzO%l6DFWU}<ot3?h#LgfD#5 zo;0t%t-IyarrOq~wkWR9LbY8jjZL+UO|3lWm9;Ha-kq5p^X#8QN@pGOIlJ|gj%G@9 zZpS>{XlZGi)yjiuy^9fZ4Q&y4Yi#L^Ik&dgH`aEv>xGq=wyS=AQ?545ck;Z<Ja;zD zjiucsb{4P3Py;&K+h*rR_4SUbM!DgvwRE&oN1J+$JMM?Kb>`N$u0Njk?q(W9!UnEY zTb-^wxuvnY*%`;L+En*b=^46e%gkgcZCs~D;ryDG!v-oyPi=Ek%j{<BOTtFf*d$xI zx*c>YZA~W=&Q*v+&5o;ht7u+l*iHGbE4i+KuzIB>?8odN@^6RToVS+OTXZ5*s5Qrr zlP7jz>`kw9M5auh*oCE6jiPrd|0FW2JF8P$VyyhSsL3fudj%_>u9lNZAGNrk<Bl|b z-HrKaqIxPf$&j5*N?NWy(8@HH>L_a7)1tT6yI0Amr1#$dN;+_6DO}Ij-eH}Be-y;x z-26AABG29BmcE$6-dTzt$Ij>?X=rWlYVyLK*3K6mr5x?_p`+_;!~WQX40>ljWN@gE zU0&$d1+AStb$spk=B9=@Q@ZOL<{Vw$+2xt;Fs`Hr)srkcn$kS4yRrS`Hm|n!&?(jR zZH=u>ofZlO^<Z9SOZO?Y4T=VPw$Ev4@_0<8K4;$Ck`ZNIiJpDcj&E=4ZlBj#GJGGe zWM13JbUr1$T)Il^iA}Grc>=5O-32aB*qCE1X!<G`3z*{+2J<U{)zvUSLYekz6+P|M zDSfYDX~r(Get^7AL9n1;^90M|6jo;|_!35c6YJ+T@q0(P4%C9Grmooge_@bAItf#y zr9x2&`nh-YDV<SY8ydyGb_Sz@(0f{+4iM|&(qZCGy#$K}7QF<HdB`7yKLW`gJaAlJ zP}gCtFMQCYCB{UmXo<4Q>lzhUUgvzJmgCXOpEg(1^XDu%qRJmW<tG+V)IBFgU$JO< z^AU^0Mq+u#X|Z^E_mmvW<ukO6^5l?X<IrV2=5=GlbW(h6IvcJco1<$}y%b5pM=X-$ zm@huoj3r<_o^ql}c3ry3&|o&vcgcY9VQcJ633X1~@lkCokUK@fF(+tz=$jKX?&z*A zN^_oO<jxd0#7j5nlD~8#Kk-6}Yjctv*drK>=OjJHLo5ob!mfhk8JNeS`Wlb1C|zRL zA6xH!@<*f#XE08WB`Ow8!beUd@f(BWjY&>yy?c!pJNNqjy-4CdBh}J_a{D^p<y<U- zW)MGrPTcvb(|RIbe;w;3V7`jitJn2fI&pioUPC8+CL+yqLzajtpL;9<f5;WPaf^k{ z<Jf!9xLr~KW22VlTHh^p1DJcpxMS>$>AS>Oz#OMou;8XKxRHznOFOxG=4{42W=?%g zxFl;^!l}2K6?%$WD@cTHYE$F8V5%)lvR$D<ZJ5bG?S>7(Fg~dbJ*%%Giri_s@GQOi z$QKEtWjD>2FMQ;fH)t^Hmp5qW7zVW*`FHZk%Vds=Kfd-oyIb-^dB#IT&QYP}ch6U{ zxjv)f&F7XkJ8pg;v_m|c?-T{IxrS8!BON)ngD6wcEl0{BmfMs|-h9UV#B!L>rV<%W zqC^=p?~y(gKsSw=WJ&oC)hX}syO6NjyEE9Viy0{}i1Xa5S<=pF<D}htH&NVYIwwiD zyxB=tg;;)^Q!+!EMM~D}Sb)GWe`W&Lugi)}RHcf<WyD;P>G8{|tJgHeJ>*YU+{f3Y zE%2M)(2;9iQ>W(D@@6sRCz)BBd+Rl)p=<tZhR$D?M>oTlH+8;K-rSj+O#=2F)Hz4N zqr1OU2a|Tl7bJE4iGnzXd_lt5#wdwVu+R~sN7`sAGHLkUe8i03o0q%=kk50hmgRTO zmq%4XYm+udnlGbCABo&Xv#7o0HjfVtnPV19`p9dKq?fO;N8~xLJz~x|$?&IP*O!-= zmtK<^^YabT8qEFXGrbZUy5}oB%}VDBX!<CC22EYHHWwWEjw{n%ZB9AuHSauk(pWA| ze+pbqF(c);<uy*iS1fNSeLBIxBzro|p*|;on}pBt@2hjYhvg7n%l#x(gf8hoZn`~v z3SaAc4(D^@rIS*oy(Z!f{rZ#p!P8llR;+MBZ-G82nH-1QVo7)j$|R*sr!g`48~RO7 z{)SH;5_u11s+}^3H_#^Yp45i%DUb1Me6B;7`yhreNS^E`{Dk>WY10W!8X)lOv^>)9 z?qvA@50~dRwWgl0gv&4z&soA{7V*a`?!ij`y+@23nTc)XqsvE(;l12Z!(&Rs^0Kl~ zqef*i!$*xMW8nu|UH`^&i@YB%7&YsW2m5+I)H)Eh_{-8dE@NL3tp1QfTmK^bMK4TC zRrzUwE%)pDxmz@HIPq0_MF+)SnwGy-_P53)BQ$@p7pLWK-JUGT+NY0KHOu+c=b0+K zn#%aA((+fqCr&Tz?BhN157x4<ZNj>hj8{_^e}!54S<~=asijfTMtm#cFA>S5gjGgM zFYD{we}(hQI{=)wtTO)Eko>i>(rEvm_4RJN&iOlzWSYO&YcKM*ntjY~lIQjMmwCfx zvT`N1Y2i|O%X&pC!W!W_YFSP{%BzT7o2*?~R9P9;5!1RwPTS&V=Ny00>re8k`1bVu z_(A>na{Z0?hW^Io^A}s<qw{3ht5W{7@`#GLch$j%95`*l)Cq?jG<IkHjX!c~)y_%n zqzP3M4?ObVDLZFmh4<MnVLysb3<B@le{r&X=80W1dPa?yQKeeVH!thw^$bJF*M-Iv zdvz+tE%-*&hiCD16rV@7G<3Fiwa@C#luq6)GpVDyWp2x<`qJolmUp!9MAW706w*`f z9b)NH+O!?Q&YC~!i|1XX)n;zfdZH-@)wZw(jnBw#UQ`)4KoyhQGL^-=dR<&x!{I#k zNd-N8Z>G4o1bJsWKAGhaO<o^wl1};o`xy3M)44xmjg{<16SHl3ftOW!Zil<UJK<jN zE-2eR%RVxdhrglQoBdVxEm*$oZ}qe0)^_mNn28)4TPq(*X|P54@W{s&q`MBMy;<2g zslbK9z{SPQC@;k_lL}Zj)!umuU*0J$?m(HLTbWcaQ;(vRX)VKZs#eV3ZDBL$)>(wi z88_9>HIG_b*3CYtpsBO7z0+Aow#l*woARU>)#l|{+m3y_tn!(GvLg$a^>(wj3p@dS z2da!q;dyWm_(QlCTn2~1Tj1XCK3E1<LB1QAeF6@Lvhf1;w2jB3(?Yxb*azjcvE2*F z#$|X3wp<%m;*?|K49bL!t;VG5i_##Q#On*)cUI}5d(LV#JxivuO5=WhUN-5Y4}&G^ z{3k>p`-$7-&5ISkRs14%3Bh-~;(G@d7xnkX7Wcz-Qb7TwG$7upQilV*4FXr*;vHVj zi&1e!#Xf1psI+24T2YZ!l%*8qW73L|35DKrbybusB+8?Rx-9ExA@`($IZdbVt^VTT zMl`O{&TZ=MY-wPXUK5L12I5qT(+5_`XSG-bR|SYyaJ8Zgx<m=<G}S1FvQH||>b5Pt z!oW<nT6QaE`oVZyjHhce^4Qf}-`Uhy%lDzX5&@>-<J?02>6=@{#cx2Dgf`mOhW<`3 zq&ihZod`D70oADk*!%kWCkkEr`W;jfS*V-+E_@2s!_}|_J_}ER&q4M1&%^8CpP>4w zKg0LoOHi3v1N8x*zrrr~2JC@v!gJwU@E7nMsMmPjh5D2R!-?!lxDLJs--mC)58=Nd zpKr((lJ-yG*6=e(+xPwn4}hP;Dezyg3w{B6;J@Kw_!ZQmZyHv11uTFsz&`L5xB+}0 zZV36#uD227o4DS_a2V_lhr>-F-w^gTgR|j4*b0lGmXL1_RYqGueW+p^cq7~v-UNq0 zZ13#=pN2ca7vWCuWmp2=gS$ZT?ClCafqOvm=#@e8;thxR@kYRMI0_yEN5clV51a${ zh3#-0R5|?-TaHcj6?*+d^;y)*Oa2zSw$QKp^--N)Ht+%aMKTwd^>zy7qZ6%j!o>1) zA5flbzxYUZ3gziep}gE$xEfEQh3f*g6y@0&wJ2*!YBS4F1#KqT32^bUR#g@HXvu$h zi#OqqvF6DHU{h>0Fg&4YdT;#=3PW%<U0EBUOPIT0sy~^IF43O^t$Z_YpJG*ZZ6DJs z#l{}$t%FVFsdlfi#uvUa%NRpteI`5*(k8P<!1Lf_cs^8)c-hjftCzr^am+G#yRKde zAK-Wid=y>=bzS{2d>!(koUF2SCCtF9p+11dOPAStcr8@FK-;%|;a6}O$MgYN-1ORB z_6c|!`~$oLG6t}*(XQ}bj`<F^cOR^S4?w-PvI3q2AA<AX!%+48H|+bQ>iZbt-2%OS zgsV7jeQ(o>Ib9Zd9~TDWDV2Fn%~Q!`*y;3JSR${wQODs>yWHqHAWbQn=mHd6KoUbK zSFq~O*Rcni(ywym9VdH1S$b@iRi1tacY;sC-61y24u?;}vG6%~Fr**IPJ(}e$H5oi ziI7)?vkT#0;016Eyb#hSXD^1Y!^QA#@W=2icr|<*YTUIJ-V1rHH2XMQ2mcp-0N;im z!L^W<lYI|<20w=XgnN;%FQCfhOQ`bGXOu^z%I|+D-$A(D42MMJS2IP69Ou_g>F(@q zZ~dC0+blLbIjFwTn!1Xzb90p%YbyDf1#6gAl&;)t$g7T}4v+Z5qm7KWMWyk3##GH( z8?GgGvs(FLRZ!5*d)vIZ*2&1H8%KALlj7nL9CujghFUkW-U@9QnlPNN*Xea1kul$0 zS_B{Oke)(48I!T8yBi7pc%$KgjSp&^C-W(LuIleT3S8yuk7lSY8y^FAf{YF9UWGSS zvcov0&RD&whZ<MRgz7r!$E+Wj1yAL8Hartjx3ZVRR`@(@gMWqX@E?#=W<P>ma5K`- z4Y!2!McJW{`kvLtABi)o44wh?nY}E3^cmh+kUH<34XLx<Igq;QagUJIn1?!@)i{|t zo#h^bpJ;de%0-ax!0UcCI~M)`9t1Ci`sDXzP~(Xo!PDVVxB!xu?62SzQ1y^L((3CS z<Y9QKzN+5u!mj*opIcw2wjb8kZPm2~55d+i5WJwLsY8=fJ)2R+@5of&D$#}Y#_B<7 z=&QqS?Z$-1)bx({^<yzE!KQSpUJQiT)wXNMr}A<wtbo6Q<KRtj8l(@f@#C*y6UVp0 z@5BFr*j&GPmc^#}SaSAecsINUvfFj#e)t5(^xN6r!v~@I0s4!a`!&6kx;t*$!X5J2 zm3M)f8qKnGcnh|qW#jiL`q&WdF}iV?*4F5^<1J#^NkQYz*NLdP<&+Y&H&IGz-C1<5 zlsei^=Kj5#%Yu56BjuNUQbDpOQG1S;<Cck%)?$v?o%OBOom7WWH@3{@<(W<^^a)|a z)@`UKN!0^&MO9JQriK<?4&gFWTs$!hYl-4LE8i~h&gXSJ-9S09DY28FtU-5bolo5B zJoFFHY}k|!ReWcQrk)O79ictAu}(Or@|p8&Ayn?Fmoqqe*Vq4+dZN1U7#t0$L)I_- z4j#(!lTZnwPGzUUKS15@tcEARXW@zPIoJ-Lhv&l=;3M!w_%wV8z5-u{%I~Z23%CXr zlJ_@Y5quMF3;!4Dx<*^d?gQU}mGE77ID8Kt1^)r{8Hx`fQ>@;{@B;WLlubEDb_4SI zCFHjy^cm!=#zO^MCz%)U`oMkR25=JOSI@GwaAVj3`@^%~0JsR!$J%|-=1>K(HGBeY z1D}JWJ^R0K2>cLk4?l+)*q8f{o!};LXSgM#kIoK(yTA%q3J-w0L;WJ=9&jqe7TM$B zFgO$L4d=iz*a5lrXHSJApzfze!t>!McqwG;lhw<zW8p6#^VC_r7&{K$4flihLOunV zeHb1Hxrg-*f`5cu-?Fd5L!hRx4~5)A>IYM@ef#n$D>w*FfIGt@;dkI9$i0<5Cz9pf zN*CE|C7cS6g2%vmcpN+tQkL0ncmg~f*28PzOn3uqg15q1@Xv5Id<mWi3#s38;0CZ2 zs{h-LIxsGEUHK8ZZE#x*cg*eo4xBRnu*0gGdaC%vsm3Pj1~d2$wq!S`;b$36IbB!O zMMP76m3VX)otg7y&7ylzb62M`lzmb`n;k2DHS<XY&V4|5>_$aJ;c*A!FU5c&92Lbo zi|f%}D@WI_41z9V*RO>0XdZS5HrYmf#P%pY@|7C<%3jaIouJ0PyFrb8%i&9KfA}gq z9KHsp!PlYsnm1rK)Y$g|sIjlo^$xrPz6a?KyuZWO;5xV#z7J{V-iMI(X=7m8p^brQ zhu){?X<s%LroDKdb9^xT7o`5#SXg78uQ>iLq;Jg5hkf9Mknv4cb%5WPvARNA%em(n zgid+a`7*h6<>02CriT9?DvB;b>il=I5q4J-muuC8-s?`+dTYv5qFT((rh!mY#h3uF zfKlC<8C_vM!22?V@i*B@bw?F)iLcZAvFyjar;UFYD_Wh=T<kdX`@!*$xhT7zs)Q$T z%vjRym#W}0jt_>6g*;v$xB0Wf;2Rtt4!LINLlRl~c<)HqpLCo6Rc7?%R<`HjmhK0h zK}T}!6JVQ0WvlrcHzi-&#WxdcyE=Fb+GYKK3=?d!wZHj~2r?WdZbLN#Dle-1T+N#? zoi5C2yD1$S>BQ~Utm_rJ7ASoy90KRUT_M+6d-ib>?Bci+o&k~VzJXI_7jQfuUIKML z@H5DHvcG_*z+0j23m$;qgO9`0A=iA5v8UN>IdXa);9uyJwvX92%WF5A_tH!5-)zo5 zVKi013^BV~d`&OK`?MQzIgp(#m|u=rSChGuie=x`=EeO}dS&0O*&lH#yWdeB7Lw0F z@O-!<ya39+7s65SVyN>ihWPb<2!8~Zz@Ng);Pvpw@OHQq-U)vK?}qrvJ_xUXjH&E? z=P7t4$A5r7hp)h^;M?$OsJ`zSxDH+iW#?bQ_o3Rr`s(q(-pd11^4#ygUnFOeq^~QI zZ&c@RCXXr;>ZO&*ZBS)Go~=x{R#=%}S1Xfyp~{5%Yh{9+ZBAtc#D3mNi2b~Wpvs1_ z&*J7i3enk^_c2Jlw>tj>l#Qta{7_Buxe#&L{oH+U^Q4Wt+vha3@f!ZuST?xB98#pt zK$B$BR1=@O`fGYieRu{<H@n6IQGcQO8*EC8jx{o%U$Bii{_H@cjo>i2F+37-@1CuL zo5C|7zpIu#7xJ7VdjsU7+1X#i&7t~(K~VK~E2zBk%)o3y{m$tJXd8Bat}@s%X%qk1 zs`UfhVwq`b@D^<S0>O*lrRU5CHseh{6gH`#Ua`nvrKm2*NTq92IEI-XMW{Aw_R&cu z`1<kWV;AH@;a*VJk3-=Ra5B_&<7hY$Dy|wxU+NtNRVSG5&6)rIdtdjg@Q-k-Jo&c; zG;^2_?QC-fAdX;*8Nh#D$Vi$@6;R8f`{?jVTpf-H>jZTtng~_hX(alf?x=e#<2Zc$ zCPgKRFSpl;y64#3-53-(-LIl>(R9!4FssWXQ8kTs$g^<aW<Z<f<Cj1eG@6fJh%RS7 zJ|4&Kxj}ly#i1v9EAan|j1n1tq8HuRs()YZydyDg#Qr^SIQuoe{%Fcgc{>Ik2B*Vg z;qh=LtcMCS6LQVd$Dy)k!&z`KoDJ#QJ?65qSHU^3FL5(hp4B+98;*waA@@+;DNttM zC(yFT!ZYAiFbi*n%zb5*#f6Y(>>l@$cK>-1q)vL5z$uVtZduam{Sdap%OGJrK0%-T zF=V&-v!(Dsj(-B5g+GP5-@F1A7IIyI{ovJbNB9dk8eRh@!E2$O!(9i@fIQ=~`^KB$ z#T?%Pm%-(5Z|r+J<e8Xv2iy<d1@&?Ed!d#faW9;`60U&D;6qUNZI8kg@V8Ly==bdD z>({C1)OV@gY@KXJdb^N^y4HqRu+hSc{u)wb@EL5emgFxvQLP_Pr212DJ*w(~JDzEk zSs}l&Mlh$tJqE+GzbJ+G`<r^o&6^?)yj56Z8I<%^;kqBYwsqhXY|4-7)+X$YzVd1E zuRJ~j2Sds%yEFVF90i|;>Z|??)epT0YvD_<1-=YBAwMdRm7QLNvgfgsdHT8J?Hjm$ zNgSNCr}fKeYgSS(gDqxFzh7eJ!1|@sGs@Iqyw_qKL;8W_@bnsl+=UJ4MF|zd6I~&n zI8Q&rtVphw2s_IfQvBcQEQ1R0e@|z*FRjw=EY;y&L&;s1u^wIHki=m55)3hh3c{wV z!}U;gM>7jSKYMLP$GQEi8%eu+74GxHO?66jTW#t|U;hSmQOAFS>TBPG>TBPDGvVK% z!u$iOuYDh$4e76}ul)$Bul*EW1wVu8Yrlf(Yx}SUL47UrXV%wl1l8AW4As|e3f0$c z2G!TH4#E1`Eg*9Z9_taZG6SCxvu6}LL$2@oL|}FX+y!zy@JeA1+#OyB_khdbo{;{} z+Y7FOtZT@UH*ar9+P!i}+Vmq+S<<ARY0c`BW&1#6Z!A0rj)N27esC7tA2!1SVHV;i z`xra~J_(P2tQ+wrz_%b_vnTgu4h=4VQ{Xvp8e9Xv3pMvO18xj!;U;h<+!Qv#%_04M zb}z`etq(aF8>R2@u1A-lEW~Yk?L%zsr8?vqyarpW3&~yDu-<Ot8?0kUcM9cYRPAWM zG-2XCspI5YiLj5TBegkwL@CN>K&AQnDm1Ri*!;a#M9;DDoE)o@j?%kJl-gw`baVqD z4cOF3hO)agP2t#e9jaiHz13E>V}HX}&ZV3($emD0?1E)*KGfK?2VM@p2d{>w!&@NN z_3UzZ7W@rd03U^CL*0wA-p1xq&VzsCcoBRVUIgEQm%w)*^T*lG;1A(fa0%Ribp8l# z3V#d-!pq?n@Jgs>kXOO2A@j{y=EJ?~pxW^-p{`wO<NKxVv;K*GH}((Nx6M=UI{i5r z_d&9+xvz*{lzK0Db&buO&XseUb&VYyyIxiAQ0b#leE!Tv1sPnTI+9ze@o}vRi-`bj zsuHS9E>gQ?Wb_ctS7hbM-(&;Tflb+!C~dc3Guh>T;BoK{*beW6C&RnoDUiAR?DrsZ z`B|O%es~jn5Iz7`z?E<%d>B3g{{kO{DwDg})Azo|Q%<|1KN{{7l?m@AxtAFA=CwM3 z>G%n@qCoI;gBLFddsrxQ$i`>dFwCMc6DixS9PEu1yXt1qC2k)Sctq$iS}3dgf`#nC zrgXoxxvqWgrwOEIjAhTeYT&*c9|f6L(2qoB?}F2y>~b{x13U)41j(DViSNRXIi?J( z&Yu9c;yjGivicdVdN>}=gh3ro+w)o62NTCraA+QT@=BH2vl2hS)-Mpup0WTrNSIGm zQ6=Ea*V5Qy#;Zf)#=a~Q*SF8~z(Tcs9=r8Jv%8xUgN9W&bg{GP5o0NIeHO*cCk2`3 z(AhJn-I<*IgLM~Mpr2IG(pK9(YZj|O6LtIr+=5LuP}#^1Px{Jhv6+sqgStn*9_|Bg zfRuxNg4piKm%}qTz8$KLQ+_sgaVNZ&<GZ2mGwz3PLh8LeYorg%{+r_!u$c3&goEKj za3}Z(+zrx4X7`1U!|y}Q3;ht%XJ+q!Pr=_o&XH9aQctX`=MZ;#4TDVApPhQ{mE<Yw zaAkA`55d+i5W>PPLlbW+;k82!!KQP`riHM?SH4EtbpF3WrGaaTrF8*vdhIjzwzTRR zvP+({b~d#(X+`_`Cv{ajDv2SU++dMbq8W#In2zsYQyP>9nLzhL+TQl_@D5b{cn|Ih z{{at&>tF|@z1ckA2T*zV2&xULp6;8v&M3U>l40L7kyn4}Dn0ctkHMBKpWqSTV&><= zw*!<p(qZdEgJ3#mx_l01jH`4U0y9waQ%dtn_Vl%pae$?l@te0tuW4pEm%F^Ie_WQ+ zB`X_soHdaRbt<JOGaD*zEPAoVKPJ?;XPZHh$2$ZoU3dSWXKcZyJje!nqd42w|CQ%+ z8IBpNTf2W7s&Cfw!SV1tI2r2sApNcP57+=dfTzQc;02JiF7~WL&jFclw>5FUhF@|_ zUt!PxRtnhoIamn)3^#;t!hW!jH1&r?P;;kxzBmBx2seWjun1}#vjwbzTSBcx*b1Hq z2SYt)+!m_e*bXj*+rw+&4)8{}6TA!V3?G5JK%TYQ^T_-9aLwhIc@=$V-qslG1^>Wt z8PxrUo~@~|kAwpt_c&SoSm3^JB-Asu1K|FUdkK5SHXT-StUC4}`<PU_SWUdUpnn4H zm9LI<w|}GRmA5vjo-`BrFRi7xTAIIxRpQI9O><}Ra8n`EwJz*G;&XvYzv|a;BDe-y zYO5i?%G1%X93BJrgVUk<kK^D}sJX#<sAq@munv9?a&MT;!UlLF)ZE~muo*rKPlV4y z%@NYS>T~e+ET;o%te`o=KBT1!YFyk6hr)TV6rKi0z|*1T62A{M);be5z_Z|7xB#9C z&w)RI=fmsZ1@JbgImHK|<`f@?7sJ(XF<c9O0BK7$r$`&IImN!%Ybko_w#_9{S8Xma z120EU-L$#Hz2P#BHQ#g<WWLnq7Rj5<Es_VDTO=*sFL7tS(z^j(4R3_EK+P@Q2a&D* z%_9x_r|O@|Y!o*8DIB)G`d3@u*;(%v8efn9U@Hm)FL<!90!^Y%Q`KCBGFA(_cs5vE zyc(q&7U^5MRz15IpcEIsfP;Gs(ZNd8z(w(>Z~V2@W<F5BXMqwUsolv#Js#MC!I?X! z`ca**8W-2Iwzu*YeYAMC4hQEoTGd*U@a**Qn+=VS-eG4`Yw3Y5W$~MhU|PrKEM<gX zlik&BWb*rc<vo;>%7Q*9TLo9Zqv1nP`FaGN1RsTG!QaA5;A2qj<ah7^_#}K9{vIlY zn*00$J_k4CyqW{;2mb`s&%OYML(PF62w#HZ;VV%6tL8q{4%Wa$@O7yE>^psP=R&JC z<(i6{Sdp(j*;o5!wKTQ5F}K=Fu=NWBmLIrxx>n$t=bf(jwUil%^gQL5^h;c$lamq? zCXP<emySvY8I^tsWK>R&<kX1WW(|%_jZEooXCj>?vrV(Do<@@<hbZ?4T62o$B)nr@ zL#`7oNcD@0wYR`(zB8WIK(0eqKS(BWHyf_?e1<k^R)LFJk4I;qUmj)D#OL8>cUd!O z#_GAljd)eo>9hE9k-8hjpvt?Du63x<ogMnq9g%!3LE~Rq>=jEbrMU*(d6t>(Q#zUw zjrb~@G>BkR7S$CbnylSW-HkSu!U~#Eaq*gjSC=H+^2ZzPEB)=&1AN*H?OS1xlgt+D zIHplzAU*7i2iz6YO`^WD$&#PJ#Nb*=wW)9wg&zIOAYND+df=Q+kA@?sQX*`!i|&qY z&*=Pot)RnHV^CdGEY-}J?d~445|y(kpO%@|>TdetiESgH`VC4y)*Ae8ZpCh~YW{^~ ze|~Ygw}+;uqf~yXQ6@4OKgR_){uXQc=cwZ_mP|L*qTbK%0YAWBk+YwLQU9R+?+lLm z`g*-<r@rH3$bG-}39N&9m#zuw9l8$qIn+2o@6eqCzkuoo^$y)tu%NGd#!kH1hdAB< zJ`eSd9QQW%j@*}U0LPn?ZoMnF3)H)ETKh^mt^d<IauYe;0?LM4!pTtY%xQhwU^pA< zUAdFs_E6(cy(@Pn+!<aBhr-L@u2A=}rI0bSw<lyw><xp5L*9?GcZDk8y&MmR4??{& zM;~qP%x%MXaty~iK)o}^T(`Y5$6TYwbHeO7uo5yi=p6|44&TA>OIQsDV(Y_TF`NKP z;E|BD>8Gu1?I`O+ZSCk(csTl_q3Zr|umR41r^4gmxv&mi3hUvIVH4D|$!2&9Y=QSd z)|+M@fV}UQeFUBapN5_Ab=U>pfb-!x*aN){m}iArOMM#L1)d3q!v$~_WKKT&L%0w= z3eSg6z(w#)cp>~JyaZAoy~VHslIHA8$Y&k0^B`%@sxk6>HG2VE2JeJd!xiuv_$0gz zz6*Z|--kECqK$aR0P2T!Zi4#pnwwz<{5346Io<))EboDb!+YV;kk1`tm%$bATKEuL z4IhD9ZA>$RBj74nK$H6e+!SKF>|XF$sGl%>4t^K@2{ywQ;9U43ybQhs)ns3Rufa92 z4-ZXWgXNGi$kxKY!b{-aV9fwVIdB?W3r~md!E4|@;C1jrcs=|W-VFZ*AAtXct6;$f zlr!uL--kRi$$kho)G_Vw2egIC)VP#qQ}%PTj6uBN>mNtBSy7uM(NmjXD++{gG{L*V zbfd`?A9mTcYa<md=c3yWW%{B^?~v!BOJC5-MK^;>;-afpxV6OGb>SM|GS4%YcL}=e zdRdK=8;iPuqz0}$IZ9py_12eW3m4*Wel#lJ8{?*~B=2`*l-n?BT_Lq_Jwt_MyukR^ zT_JUeZbToyM91b5bVUj_m5KUnBG&qR+jzcZ?`3ZVr=Zye&V@suhQ!;$C2&XhbGQ@K zeeh8DIHWz>+`z6-a|5ODJ-8eE3hn{bNAC%Dg=O#{SPpfMHUeG-N5iY(82CIK3*UwN zLfv!i2ls&o!SQfBWG=`%7}ml=pzg7%;e~J_yaFBte+?(Yhv78%1Uwq5?&`iZJ+D`W zj^<@^_#^VwUGC|FMOqpB1shF1*!&f)iYZYk!+Y>Cflnx3Di<nR`0bA4NT1R$0}g`6 z!`<Nte!6uZke-WZMYlJ8X2FrYq<iKmd|%MoS`9vfEt&H8pf+q@b@)wWMHR0ZrK^xG zUaO?&hO+aG5AF(`UTr|N$!|w$Gm%3UhYb6q0)Bf(?>;uMYDGgY*~rBnOr*(MZbjGF zWEFd`$qwmzvli?o+nfkT!!~#zY=;x!Nl<fTov;CRL)DG>@HE&17s6BEweVDUBRn16 z1+(xacn*9Eo(DgI=R?h%FM^sIyAY0r7eUQkEQY-E;Vpqv;AK$t@_hDm`R;>G&t^1N zGpd*JofW={mcduB^$P?#YWI1ToSLbklfj*NqgTaZeM!8|DlO?cdpT)W`mTV3;m@Gb zdZnKy*)2VPF&^C(?3!O1-AkVMv60Tk*!)EXzrpqma;C}`<xG{*BJ8pofl4AOwl39I z_L5(vGo9aS$(Pc89o!!N5-J}z`1ySRIh|j%I@#uM_A$NW*UB)KUzJs`<>t2%r$oaH zW=dR1D!<$e@mpY)U!C9GOZZBa`*f7wu-p|sZHHUQukv&o+!_84RQ~Sp?QjEf`rYdJ z=#>2~_I>i%A^gk`9>T3Cl!AJ!^Cohy+pr8uzgr5vC{!A%++|ZkhB9=C`=eOd%Ot_3 zv?|ZC{RCh62lA$5ulDo&G*o=g!2RK~@Cf)E)V<Ijq4N4XRQuL7Hf<A5;ZYUo`?&t) zvq|{y3lHIzTO$-cVUt+Cl*VAw`IN6hSmG;RB7I83%TV#W;-~i?$m#DGHPc^hi@qN2 z8>N>o1J0b+(#o5g(YK<;;4Rn`t-sM3X_BCZ!@Frg+#|bycIT`jSb*nA1@^OiD%d(y z7n>@4u-c63LQ~oI{cX~r16_ulS6jJG>rOs?=eq=#IqYnz1sQmsMWCrIrg{?hyf4U` zzbU`6*I<sH^mQ9;$orSb{ot-}W2o!QCQyCB0H}JfDXfJ9p-xVpW9!QY!HYQF5^8+4 z6}%O04ex{7z}0YD_zD~X--O#kjjyQY*-c2-PH=0;ryp#tyaeve@h(u$W_N{J16B%E zUb{in!v*Z=a;-wQ3A@riE^oPp6;Y-LHf$Jdez}%$oGe!j8ssTnVpcmpKv^jle^VM{ zYi|2!CvF=@nk`*WC$5A$!ULhwdJt5e7O|(F1)h#h*QS%@mN!rChpqgdpIiSUTh-Z0 zBFfEMHCoq`x@opBZ!$%&DJ|)CcNl3``uM)0txq|^&x@Xeq}QuHhd<^2_w4)U&5J%V zYdQIvbrJa+pC*{56F26k3H4yN_@^k`N88lwGUl$CNNaUE+?X)joy_aD?~%k?-C4M5 z;Kio1${y5RJU8%zVV!(OLsg>`ttto;ocbxms43d~yUrPGvVm;aAI|WVQ?Z%sG7YLN zPKP?>v2Y4J4yx^)0KX4w;ia$+-UFFSuyqg(Q1wXHt@Ly7BhhWaekl6^>$iRR*F5;o zUyEdH)uOoZYr^AG%uE@MT`h|i^Pu{GT|t9QX_bvIGi%7*Hix_^{q0aTV!qS87Y8-Q z>4M4|k8jKd%aGIS&-b8C%I=zTtL)VVDp!68?mseuOq1aZ$?6o;kaX6S@5SuFrt~S_ z15upqE14Iv`>F3i)sZaBz_Z|<Z~@eq<y?3STnJBu=fjiWh46WJ5qt$+0^f#<q28P1 zJFB)P=0{L=`7u--x{*C?zfN>2gI4wf^V+YgyS}qK)`Hbqf~{X5V0?G^tVEOSivIIT zBwNPYnbMkWXFn%zO8+vr9lRE*E?oze(i@=a+l^2*{S`b4-UJo*uc7k39Lh!?v!}<& zKf;Fn(JzJv<+YK0HJG9N|5+{L6nScyZ0u^;EMB4LP7EI|#!XjhwxF73Xkk%DruT+a z#r%#;Pq*AF!oH$B)~)3{S5&@bZ)N#@or8@zOsl(h!L2#I5AFc(heP3SU@d$Y_P|G> z?jL^(mD=AyrT8g$2mC!;4gUbw!sp<oocE7#TlhTO3;r4E@x?1p&k|mRnm1nqb&vfT zY=eJ=DyKK0%2R7S(sL?Tpwl=>b3Nmu@@$wjD|fJ1jlW<k3WTt>*P;32_A+>Uu&8=< z6n2XZ7CTT~Wgf%9qO4P5s%Ws7MVDdEKUn-7E{dBi?_e>0iBo_3rg=5LrHF2@I;-1K zpb0;<k0&WSt@&f3qm9Q@(X$r+n~I;gIPAadrus01qj!CM@kVaUxj9t%ZvoYZZ3)N1 zt)OhUHJkyrfy%>n@HDssya4V9uYehN3)~6b4Tr)<VF`Q&?h2K!Qn(K82APKS_JDl% z!`ln0-VB3!4m})dZRZGh1RMpAfuo_;XN-aEa3A<RxGz+_7zb5<)MuybPkc;TmB0Rc zi$Q6!{se>4c+Jqj?E}(L$sTO^#-x)-^Co!Ud4XM5ra+BJr^5Z<G}v37PRD&S_LJEU zPUh)97>wrTNp-;WV$on!c~Tt=Hl;!Js}Pp>${D0t={g=NZ72A7C{$Uc=J_AQeK5Pm zPlqJ)5ZnYN2csE023x;C2phMOmduDQWn<8iMjDM9j8=xnZZN8hX4q-`!C;i5RKFf? zsj^CiytqER2qyb*RSBgo?_g9mY-SHO*&uz5oQ=(7mu9#NoC9^nxo`q(gEQgjumgS{ zo&mG)I=BGJre{OdpM2wp_*nGNud)3%9gOB0U&f6aza~6h-(XZWQpjM-Hx|8+ylEV< z814#x0QZ8ILXAb2K#fH&gR;S|*wgoQv(YJzdiKNe+u+*|rv6JtkPYhCgH35wJ=qve z^_BOKH>LkxsIk;<U@2Sy%i&6R0DK4@0w0FQ!{0*X`7tQle8PS}s%^%{P>1KY&3`h8 zN?J!_AkLj?Y(e|^|6~v)JFik2{4L)Y>M87`@#OEJ#!$~djiH`}x`zG{*1{KI4}2MF z4D|}s80vNSbNB|-80v3uHGC6l47C<&4D~M5weUTtG1NM!G1Ny;W2jG{#!#O^jiEk+ z8bf^!HHP{Usywe^PuKN-qEj9|WUtO&p6=IWzRi$0w=^?E|IKc^@F?5MUcsg`s*VqU zt-kVd@}zWM0o5ligX$BnhGXC_pz8Q_@EZ6_sJ4CsybIn4UxqhB%|kASvcauTw$gPe zJ%_cR591-+w9fK~$X2|A6I_<U31%fB*mNcEH*T&pldkS=#`e0lL}6{<KOKj{4doDw zLsjYP&}P^f-|@OndE(BYKj|ES8=Gd`Gtk|(b(aTGXe=1NQ0dX>cy=}=Mm>WoFb2-? zFyTCt*0}_mY@o9E4vH#Yze_*X)N;Hll)e-yO}oSW;a+ee90u#)-mnvv!LuRjAncui z3V1!oBjCMoBzzK%hJS%$;5s-KY7T2(sCmk9a0uKFs(l;)_lK2G866Lggoi-Ak8~*1 zSg{(O2@iu>BhLB@TN{1^)FP}Sq1NzDgfGDw_#Qk8eg&t%V(c*$YK`tRI2^KmBU=Th z!)fq1I1|o*syoL+)v*Qa={lzIpvHdtu}{cb$G*jo)YY+|OnV!WT6?SHe8HwPsEp(D zq#dML={gCjy>-JK;XJ6c&WFm=BKCA2b2_?UOnPMAJpBhl)7-pOa~gMTh=!(?w=x`p zO=(fy3So(_Je{;Fecy)~o1Wq4CEq;hgSadI8b?jco0o4pG)-pY|H7fE*|3@X2Agak z8>;`+y`Z***i3dgAF3a|5LUp8p~j|{z?tw@umj!%&w#f;jZK$B+4NSZdUOMO`o17O zHl4J7+kexcX|C~Ai^v<Dt-CL%36Iw|G&LJ3Xt3oQo8Cj-G%kApYHa!&sIlpTa6DWI z4}}jw*<cxadY&&nPg>Kf4ZhtBR?-N;1k^XXTz^0s7qbUjzIoDB<VSVoai}`-dzgW% z;hykmcsP6x9s{3;C&E9$li-W+dH5211-=5`hJS&YCw&d>1mA#~C;c0g{cdDW+fU<V zl|eoGQF-n6?T7YB`~9EIlh%>0U{hMv&f;VH_sE;l|97ad{RglVegw<m$M6973DnsB zQ+Pc594gQMg0juW?CYB!ot)P;|H;rkX`TNIhW6H0SCRi<%Qv<!*x1$CK2T%(4WY*N z8^NJ)V^|9}gFUbaYHVK&HMVDsrj6|fLyhgXfve%Ra4p;sZc1IvK#lEpf*QM&K#lE7 zp~m*RLyhhCfEwHH2{pDK1~s-Xhbqqvkkey{e=^n>gxiO3N}@a)?X#+}XX#~l3$}iN zU^6HhB37c=Vu(Lp^~2hDRXv^?uLfETGSp>e*z=87wJvEmZfuG<1OHAvW^sFYZ4gI# zz^Z(o$IhlVfmGdpzP-X|rZ*nQMy&4sK{gCF*+K0{*ZVzv{WR<*+Z+wm7f**u*RgOv zcs!g2>!I#BX2P>!Bm60Bg15n0P<3fGTmxI+C-6k5zG)8B8by8s&c>u|@Mw<Pq4ISS zJPUS0<#8U=+SeX<13V3`gr~z-;rHREFbg*&UuQzzS@h0=`@#kAD0nt(f#<+8;CWE* zgDr%-1Lj=-ABGn~-tF-&f~qH%K-H&zv8U_Pq`q$b;$d)VRG%ohx%G3JYP;smoW+w9 zdpM^m5Nyf%6fC(&t-@%=_pgeqigmWkx60LlYOvM1AZB%~D*buv`ZS*^n=T;kIC=>s zgRX(rN)72yZ1KCFDY*TwMt`(bg6lrT1-B2lx_NVd&b$XZ2b=P)I;7L7+_WvlR=dNW zK+Tc=3{HSo!V};!cq+UKE`?XaJK#0&S$Hj!t*?WsE7wES&l}+3@J6V232uVtz?<PO z;4ScBxEwwYZ-sBe+u#@QcF23L-W_lZybI2Ncf(WRJ@9AnKDZLz4|$)<djR&qG!Me9 z;0maBSyw{6!}<{9J2&1Va28wz`R<ALB-Hn<pMuxGr{QDpIrwMzCn%G@0zK@w2J(J{ z_Zs9q2=8^c2YdsLg>ORH<p=C#srjc_=(c39W1p6&gLDL)r*ydLSBYz|C99tvxTtcv zsagLM&{9rEIg~y89z#%3cQU14JHl_em!S<drAc*zEQa?K?~w<k^Y5?@e(2|^5jmZw zDs;NnI*9$~C{OC$I_ujS+vi%7!ZF;Ec~Y~W>G<{7{b1b(99M__xmQP48aIUFeEnyn zN$33>YFzd&xCi_K?hpSBm8P$t%419F)}g8L(A<gcoirYs6{Vd%p_N}9o!3!o55-uS z%jbL>8~AZBeb2kL!z~xCBv7y=v!r2yipgDdf<9gkyHrm8U7jBs=XVzp*N)q)^HBMG zVi%T<uD1HQtW*r<I^4HEU9#ko=pAMfEX&TO@*e};+gs*Sy@UOJk$Ir7>0@HooE~2- z$S!=(FEMAu_`vQnFN8bdz8ET<)N|`Ueh81__(w1cm%^XGE8xrUO87ebIeY_N1!ecE zp~~lWDqwm{_u;0x&{F^4>_qwaMs+{ISnL04oYgea6>iC5Nqspgbr@gc&HI$;kI9Wr zz8r~<^h=tflOL1ANBWa>x$k7A&yxF+X8J|X+_yH<ztlA<ozhY1l#WWLbW}Q}Bhzn> zj!dU?Wcqc|k)wE=9la7drJE03)kZ(#v31<-l(udb;T~*nPsV@WV`6*lF)fYV&DIE( zQH*YM6||rsRO;)|y6#Wy(S4D))_x2~AJkfot7}LxSG}gFCaLz2Tos~8$4W)WPS;uA zIlIZ;V^Hgn?n7&Xr|LV@TCz}z%ALEV!!F;d|4!l7&}xnTfzq)v3(6X<_{IC5{oS1l zj*6`Yeu__4hq+IrR-^FWYDA;q!BjM^yRfy%iP%`fr8V-}l0A#wB_JosUofnsHGk%s zgAzF-j94$V#uKTbz!4iOR(s>14i4o^!N+og7a#+=XTo~7E!fmn)puNu;tgMaHR~YM zj<p`91Zo}3Zcyu94uM+t(g1IT^Wp!%v)~<&e#O>%JOs7gV-36q{tarq$H!3XJ@nlD zL8x~NR={oGBXDP^bsydEF?b4m20jB{hkt^9gBqV|y~Z2xE%+{c8@>;DH!k~6_#XT> zTnGD;#}6Ri?C?H<+rdxa1o%0e3jYQ9W`y@8<eL!QzhNCLV4l7S7Qz$ZhEQXhe(+q_ zAMz~*Z&Uat)cOW}CvaQXkA89p<Qs*yZee?v;dp1b6D)y4p~gNXkZ%xr-+_Ev(AFzx zETnY`RZ!~_YGE1FSm^&@?oHsd8vp<Q(;iw0S-Yo_h|Dw-MVR)YWzr&~S?_74W^0z3 z2uCW}LkL9?vL_*XD6(dkJs%{5>>>P~uj@MJ-1mL%8GQXe-|ypp9-W?Z-sd{keO>Qs z-_zhisCf$aK+RKl6l#9LlTh;#-i3W&JHqxD$XZLMFJw)n(+}pt{!r^G2SL^}Iz!+* zI1FA7M?lsVnmGb1;CP<3p7Lb42~L1pp~l<4g}Lxom<L%;<rKg?s4?Z!p~jRifyGd1 zq6D(`z$u3>z^U+iSP8eoX;88Hba(*NSo1J=7Q7nHgDc_ruyHfm7w`~x2}BoWT=o>G z@z`pp@mLpL1D8XM@7xWqgKt5N?|ckzfK5q-%iuv!<2wBy-?;R%oAI1;;9WeQ4>g{% z65bCt!3Q9HCyvHQzlRS&rRpbOghcxk><!mJCE{mb5qut2z!xBGF*D{z+sb)`XX^Q8 z%#V7y8S|q)?rcQ<4txhvpEYBDU&0T0rrzaz1e=nZX{_%+xCQoxpTh$9HM|FY1K)t( z!Oc)(e&0cj`TYU6!$x$>{|5JjJKzCOV}9xI57-Mfq~9k8Hik729lB@3=5Q|LEOd7P zYyp?Tmhf)a3O)r}!*y_1_y%kT-+_C=ui-xMd$=Fmrv>Q>_J=7jA8L%qg<avbkgzj# z7WKV^+nJm@W9D^feos-Ib(Ub9Z9G|*f3@-dF#Q%Pt}2iumVYXiR80%DK3zm{YXD?w z9wIxVysD(U+H^e3M`X{KiPawM`b=tS&M&5<%cH0)2nyc_^4J_Om6gkp<hS*u*`+$& z#xHhv7#r;N!1=i)C3%$p2_?%Je0&Hum%Nt>6YIF~#gJOIo?*3bRCGUvidaHdUQknF zcaY0OX!~!n*=0PN%51Duvi&IXnSUu<R4!qQ&So%IZ^ChJ{?eG7eyuMogrrHg3=V*5 z18eL}b`6EM!eQ_&cmn(aYAo#!I0m-icQlsP8EPy|eK}?<4W7)i;st5l#GeIx6OKPK zk&!fX?uJubXZ#7q(4<2DA{X$lxJj^y@yDO9m$1Y~O@aa5r)Q%af1X#CZyl7Iq&u=O z(-zaKT>Kz+=0TP1QP>$yg6Xgr9tS5w`K1J^o_{8Hct68~kjbtCxo5=uoL|^O2SM9< zq81?VI=B)&tlE-ZGfSIDVkd!1)?PAhQ-7)P4~tj(Qc=pk^!uzWclhVWI;T7B61nLx zxGzkFa$g#hKUQ)d5o%A~fNU@BMcieH{$R5q`sS$;2dO`TA^%GBj6W^1af%%7e@V~3 zO$Z6WCr@T#O}xkT{SaiGxY?SS9T$hPPlgFun=XoY;a_s|Ch|V{b%H1CgCFG&`Vvil zd?p;mb6<Ee><48>f2is<@yFEH2Et2t9t5R>!BD!ofIB=MHXoUO^L*~|dURD-%yiJd zKNv&)&BU5I^c6vzps!$Fz<A#Hm)s&9C>Z2VUC@O8aH#m51=Y8D0z3|mh9|-?umJM6 znL~=b#?P`d?B}V-T60g~o?4HeiSYf)YrLMw2nPL2j`J>3cs+4MUCfHvHt1;z4D?sx z*Ojj29{D>yU0;Oz<wnK<+@27Bm~(3{ho|sNo@K^lu7dK%LZ~pV;tsFRC4QJNmfkAs z@ozp`LfSPE5ls2lKk{r4mh!QG={M!4__VCP2gNn@J*2{=P;Mgb8@E^TcQ`E{i%j42 z=B}#8?Pe0QGNuTI{Ht!Kw@ggS#_47(C*JM)&9K{-dv2%PF>b#d%1w88ZlBKI;c>!v zw^!HW_DRv|e)bHxfA4{CK3bRi@A2GEerepl%5(pHp8K!I{oy$m%aAD!5^hdS{qE1w zk|@?E{`J~4KX(X)fSSQWu-~Q>f4AER5?iNWv)U|<jtb(~c;5Jz+!xL-9>G6y^BSmh z^CTocbk@NN_%xgWpM_V$=b`-f0#y1zo)iZqmz`g7Ppd}{6*W~w|4;*={L$Ayi#94I zDnjRE$-ks|T`G9G!UV<ml?kiA&}O|DR@{)k{Y!q4&iLmjztr^xewY8=gwokYI267M zr@#+kDf}49Et}!(@H6-r`~vc=^kc>)zk>Rm67KMP`I*R+o~Lm?lc-BN(zA8YP(QYU z_#0J9XPMYgXp%D@)>~gnZIPI-j>2vF{S)B+@Kksl%!b2Y9#l;wAIgnUD8CeQhxY_N z9+~V?{92#vm*T2{RO6K@2-)CD%$MYm2=5X-f<WPx%I#nJE%~Jp?Cc4r;5Pj}dNy&K zFfwlK+E8_Z#B;CqZ)(Q|n!ve<ZcXgOjrG{s{`H&&-mif;w|g7ujpwblzA-H&{!Z*` zS5Kh^z#{x8<7jpC6uP|ah|LLa)l;Yn)c{^7Ec}|J;<|K_P?M0s9E1^Wf3R3>FD0DT zDUz81#rRf@&SdC}j<{r{w(N}XH+3{xOwj`Ry4$w>0fGH((@wMfp$G7ymKWA^Svlho z(bDXK+)5oBRyHZSfPq3XLRqSK9_RKRMngpi6Q?q$Ikz5Zf8$b)B`B*ZEUzpjJ8aul z*;EBLqm)U%Wc;Mxk%7;5mm%-R6{F@MEHXAKX~<Z+2EMDc@*F?<gOrMA+j!|;iYHrI zs?J2ep(pRzz>eV@0hLycgsOiY4V8Ch!UthLNIq-Mm?f{!aZ+YJEaQ;oEJx-~nl<2z z-@ANk&XAo9$M8H4GN$cb4~bOn9q?p$A3O!Be~`AL8Jo<9Z3w>tsBkQXX%M^IL9hgl zhRktr*~`_bgjMhixB{L9*FhJ43THv}&&`IJa4zJG2IoR}I=l$Zg^a1YoQdEt&(pmf zvNp(NzkY}Q2Xof$Rq#!o7eeieb}iJdPK#kLcpc1v_|f#kErIHHTME_gxdCbrkMUX4 zzqSl!@w^;Pfw#fw5Z#!4$?k;L@O&3s0`GxO!<FzwcrRq12L~OxU&9CBHuxY^o~E{S zc&`WYN0X;1zd1KCpP;HTI&OGAf(ieM%NV?7uhMB^W>9xsOTVZ1hWCRu-{ZJX`Pv$& zy3CVM?qR&zxSM<~DKAzVK;Ou|c}eabXEx0=d2s{-{`JqDom5BE?}gp{tmp3MJa@kU z<(?NkcbD^bxSt{3-RC8_dw6cGX|Dczmn(hu;`Xn)-2Iy8?$<qcGataXn>1(iy@8Lz zb;B=^wd4MT`}`z#k01{-O~!(8oK?V{Vk!kQG3sB*n$O}@VuVpnrd+(nlpZP+B*{Ut zqpdQ$X>3ZSoL*5aZi%G^b>!pE+RIRBsTpnk0D-Rgl=*emCFLK5ryQnwfUb}6zx=ob z4uYRU<>_BQ)t9%zJK<OGG58IXKFCjv-YA!o`dB1WJT2tDAW3go717d@{&ir7!&<); zj-x;0HvRr~I1)B#X#3il!Ebr4%gxH`_01UW3zOVDy1HQ8iT^b>>$k#gZjIaY`{em1 zKhPPMa!b2^=;n*+a`TY?T{rLLxtTdM#?AYBZr<N>v&zeGJN<5CdvV{&eQ}bT`>|Kj z@F-`$=KtN<d49icVscVdL+QeHQRQLVXjOO2l8?+pc~Nnp)|T6rS<L*Pn$u3RsmIn& zhwznu$?Xa^(rPd_<Usr?|4<(_Yc~#tQ+YlVUIf{T-1Os8cAL1j5LvkWKO33S;F;W) z)Txtkb`z<;Za&wo64f20l1?Uvv2(waqhunpd5k$2OBsgJmc;%gcgepLr~cX*=Sch^ zw=##$w4aWK1w0=E<^D{lH1>D?oS)>+k<~@fN=1Nw7xe#Se-6eU^5+n!cH(hR{yZMa zpTnX2c{O)9j>m`RrAhuAlv`R{GUNZmqqyy#gel|4#;>fwF@DvV1M=&5D8HTz<=5-D z!)0W=UoWf2um5);`_KHFi+>chtTi(JEr9ZG6w1Gop!{3S9p3*ZzAkfll7ENgmQAY3 zofI8hSzc4|Un?)_s?X@$29+13Q1!=hI0{yHZePXUnW6UapU8IO{)Kx%qT4l8Fu0^V zFSq1`=p>F0i|emb)x*D%t2CLsO3Z_m4Jp@@_GoU_<W-KSDK*s^Rexfg0DiYXjWMTQ zF+UHgK;mC=v+|%_pu$Mk4E!j6oB?}7=Ixrg^Vu+u=UK1{o&!&VbKouTT=*u`Srk7* z<~_L51$&m7@cxy*!{Mzt8HXVM5?+z0Gqn|>x%vG$_LXTnUN?HY+mp5BVpF2F{2^4U zElv6}s+y0%n5xuRR~{bjV=z4k(u)1sjz#%;wX#XY1;)ZLnCi%FkMq+=+yVGV*Vuji z$$82vmK&M<Pkxu~cja-BC%*z+Ngs>gSjhZX_Z)aVRGz;Ku7o$i$Dz*E_yFDpKZUo$ zM%b%!H4cOK!o%Szcr1JXR>21$ZB=t-?<4SGo~gT=^Bt(WJCE_KG<p?xc<e*@RBLXz z=gPz|E3Ax0lLIY+LH|k)v{YUt2AWi?@Q8(w6ndFw#du$#(r2b86y&aOdAb&V$gS(3 z`X!%+IdDCc`=5vM=e^wFHRjaaO?rMGUY+PqrRQPg)P0hYb0!w~SF&HTc$Mf^CFk)- zZFGuH&N)b98t|iCVsbX+&uR?%m)tBJv_o)*C+yJ3rsqyj=~-u-sx5pVRC?|Tm7bYr zWX@2cAH(ebdMJDbxz0A-2$^@}(qHRvo{))KI?J?_-#ZFk43B}=K>9z-Sv372{SM{~ zQ`)u8P@c7Z^>`?q>MYax%7OUy!ZnGyCtny4EzIR`0n?*4{=ZfZ)YWbng&S24oB&l0 zusODAH;ns-Zof9k?IX%dH5U4R;Pz8Ix9bd8xqYJN_8iac^lc@LH(i8G`OmrVswB6M zNlQ-L|I-{<<C^pM1sjp=3>I_Jb{!eBBE1sFw{4WO7MJCle$}o>?rtlI{n}KpRX<hg znv<dzI=UmxwCsl<`ye8j*=bY81|YJ@&F1Lw{kjWzr?}3g=`cmmX6tc1&+0}{w{#9K z!$pRj!0J!Xz62Axy82m`Nw3ST(EKlbhsyw+3$8GD9cDnCi8Bzs2~{S%4JSj^N|^QQ zo1pS(<`=rk$3BBE!Y`owvK9UZeg(gP+u;8E?sqU9vfjoW3x9+aa67Dqzd)r=l{4Xb z=|{*8;AVWsS(q44R0h-)QF1WqU(NkL$SvBMeNq*T5_3icel5~i9;m{+7ZMxzCfFs4 zAc_lOl@-q-($&pZyvmC4Mr8k!`=xg|WSA%a6aUIjO-UchADN$N_P5;`PU3kN=)#up za@Y#K0NX?9>0It`+jAl^<sbU(MTvUyc9LYgN{3_q^~k46iA<~*m7<vJ??EYP1Zkq) zg1)ICyz(!(L;j6#TSsxX+{PLjv+kl89>en#cpT(>K3DE8gZ23@oA<KgB<{s^`_C-a z{NMJU+!6Ml&PJBos$qLL9m;<*pu(4ac@w@fq5Kyi&WFbuRhQa}cfWI&#QQH;@fVv0 zl!+PtN{-;loa}Nze-ganuJjw%@hDLaqNV#OoXw;JiHZ=}9lXpWK!v-~ON2XdT3;=a z@U%Xi>EI$)MU*TvTAfY3#ZKzmn^*IAr79H}Bndb6PRTEoccaWZ76Cba`$0eAU((Nd zDp)NLlz769tkaRsI>CeCfv^wM8q!>ND6E89JE~tl3@(AG@M*|-BIXS0!{O&V9|5KR zUQpr07zlGY62~U#BQtd#`tzL9y2GiWGRmArJ1m@oHU5<tRPl>P%mD$uvXjG3dWZ`s z6>Kh|<buslz3=WXHKR)H#%zi^DL7bLhzD$XPTaRf0nrt6v4HUVV(Kfzc1A%OnBnq! z;3E7@2p14r3!;hZ1k!mmkT1A2%%^yow6&k2X+2x}DZ5oD>S~Y@-`3e;h30>SkK)PR zJiX`1`x2h2r}l$r#_12`m;taq90-+82g3=FdC+Dq=WwW!brf6*M?+=!W8h|}HML*D z@lb1;wU#ywPJr_0M5y(@*)Rv@Lk%%cf~v<d&)U>qwT6~)4W|^+Z|`W$?4OYN*JkXn z3M#%;L&eKY+yg`LawW1>+;?zKNsO0&u`um#a!bXCOe~DW2tSx@j8I+0G<EA*k*27W z7!lR0+ZkyJw_m5KqFt+yRlcrkM<h0%)Rn-y<UfTgMT@CZNqh_A0`l|SkbKNp0S|=t z!d`F{JQl8nifzxp9H_CcS@3yyJ=ECOP4Go{3)}#u$Csh>y%S*(&aWpSlMi!Y$C$o@ z^U0YUQc_Z$ZxmdCIsa<z|6wX5N?<OMvrRT^k0h6h=OOFF&2YMZ0Jg;Pl&uKr>>9I# zsjhmaQkN2Z!rX)S%I9=mKF-ah?{lD?=N;SEUkTC5>Yk@FpZESHU1+T(!Q;&KghdQl zOFzZ1H=GQI!g9C}q7##*s-T=gW@h#am<GS#c?Q(^ET_Y^a3;)vXF&BcxcoZ~5{~XL zcn(xpDZPg03TGpe+Z4yT#KOv)wwzyHs$+*tIJM!ue<g;KU;DEf$@Py?kq2#f#1?bO z0<W^p#?3(;DMxbel6$1Do!}Tx)`YkwH{xfr&joSLtkd5GsxHw2X2O<Gc~vVo9JYb- z7dkTjznH(%LV3f7$W-5aoBP0!|Enr;^Sz$>OkVp}viGxi74p8~NZ9)^l}Jg(`=%{I zcn6o<BmeIL3q0wbxL<B;4|~9Up!~fbya0B9iZ?0nR@e#N4iA8<A$ty(b3ePn=XgE{ zDn49K+z6N9uOO4I#jYWJl<4T3+!AKXRO-xwzaFUxtp^P~#+UHJMx=$;N2Z0>N2Z0> zN2Y~Wa;AmP-%Jay<V*{%<V@=kj5~)yuNN8!haRH1$eXy%y4d6uiWpvXAUGshbuv$8 z)@R0NHO<lSk+N3B6LWiDgqzw4kwc3wyuAlx&c75ciXSSgcX+~{gr~xcv~SYK5l}f~ zFW3$Cf%=_e;6T_HD$4eU6CrtoOJ3xRfU2@&LB$`<*SQ}~fQm;s@B^3!e}egNJB-3c zxT_G7R-Gc)3>HJuo|(@>Ty>`Kd>|}^X^_4Tv!0^@X7W50_Jg#0%~=xD;Aozy7npS( ztTi<8b_u^3PRIIQX@ogV&OxDg8y8<QG2&nUrF5){Kn8XOp=<)~J0#2fUxIR<!i|4H zKl9o6M{b@4d%$y`!f7rX4bOvl@O-Fnxd1A!pufV*Q=p#YuHpF-xDH+l6+V|kl@kk~ z!a?(!$TOX*;2!X5*a^~4Xu?DDo0K0s%N?FaGzW8X<5}?FkX|b)%k!fJHC}Z-6I1?` zsM=O>i<Pw^N+rg>$}&|T$Ei9<WJ<1q`kAF-vsRP0ZuFf5<rjrPd;WgGlP|~b^51Rn zP<T7+3GagWa0R>uYA)9EP;;=}fcL|<pyptG1RsK1ApQ7e4eg`wXPzI2zd+4>qMR~w zpIX7Ec_zO$^)7|Qb3FHes%MdYP5p}Ws(jcb9Xiy3UDB2F1}uSZLWS7~{tnMY;v33& zQ-^a7i-no$U*+Z$D%QZ{+M~MTi=M<li_f7=8%&|*VrwX?oQEhrtJFBod}KB}LZ@LZ z<VC`1Sbn?8+Mr@lIibQc!mXSzG0bE8y7Ugr5T%%`8K1F!#=F(rTx!mZhxP}&W4(=~ z1CX}mX2xYrY3U3ijhE$`c$10_{Y&~(yiuOo*^_@wKb3U+4eSTipLZPm0jkcSemv!^ z>c5)|e}(062b=+ahc5gBo)6XUbqQ=hKZvx{5Z(lvKzXGFd=9GL>usohFQxT1@Ef=* zRC%x)Y=9ftv&E%;WctMvzc?4x?1#qsW|w)CP6VC_J3{gsN8=LnU}s2v<8*=KA7)%) zG1Rz(>I(<MW$;kA3U-I9p~fc^A1MQp;v;d^#7Ei=PHHGVnzP9MZ{uU!X=T#1-6J6G zw6Y}#ZS0MmQun_TPru}s6u4Y}9Z!jT{~(@9&*6Bg@gT)h)~TC#s&OI3(*aQNbRbkb z)wq!2>2Xl;RO3R5r^BHOM?l5Xkx=neV=~g7#$*&v*$c?TQ;l;do}LO7Pc`15c$xzh zPxGMSX+BguRlld=X%SRBRsUyKsD4k%e}^MU?Vear@lySX7ee(XQvNy9;6liHdv_^R zzv7MXG)Ug=oB<U-&x9IdJqs$HF6BNf)D}?Pqcw8sOHNuSp5~Ra{e)_~Z7|?pi8<!K zZV0JODyt&gBO3%~b_e?lxyb!XZd4e@xAmXGPjdHKxDQ+hBk%=yF5Cbwgq&|{!t52e zm}llVo4y(LWpX=U?>n#?d>^U|`T$B7A42KuF79w!Uv-97+)r_z7}FVh{^XbDR%oN2 zf6_PW*9hK;NCW!POlKR9r8Xt9*>SYCB3fB(5=vL(iHn_m-G5*#Fr!Sd_EiqX{Y&oM zL<js%aEvFU{5O3iU7++wKZzOpIT#+xGj(V)-gpQs<e7ScS#y*M<?l2o{hZAm*3S@R zJ9Ddy7+<%3f(6L+M=ceC5o~CP4OTzdrWS?BiPKqJy(deryi0D7pPNCIdb$qB&2rZf za5qT3)Aaux1@X7${<)Z8%*o~($3Xe<c;Z8NecY$W6$jLIJ*jR#syEE*_EaK@cb#Is zcQFj5fXv}B=2H_BiV)EaBG1bv)3K&x6G3JbP@QI?jf7nT!(Lj7uN&OS%kJD<s%oS{ zYjK$w*X+e}(ymZ)6oK!%KoeNvtyDd68aI~$DieBE1Up6fgOS5zh-(I&T0#46o|T#Z zrAvjC^f}X$6J{oU4utKI4T2Fk6v``T)9nvOLB(lqv*u|WRJtdhcQ?QZP<7T*q4MTz z_%5W4;VSI#hY4e)k??$zN@U7oO1Mw{i!d&W*8bf%TAek^Oze#dbJZe;AhL7DD`J7} z_mkEa8La%T^HBLkI*!jni}AbsHyQ2;r@+pz3`)lpFcVINgCTa9K0C4}(^lhm&A2e} zz^vz`>@;h-PlM9g=}_rM`EFRZq(P(GG<Zr~x@F_HTu!JB*19Xw`d4%R589YE`D7xA zQ>AJaQl(vPXwJR!);2|uCM2G?{6k;(m)s|P@lW}Jxyb8`zGlI_kemZM!MX4-NV((6 zKl7mceJyvmuSsoP={$pbLbAVYhW~%$>+f(wyr1Q^u%DOU7rA#Sl%H>a^7Bow2fP`| zFSkJXc^!Ay&#DW_j*Z->Ci^+RrmDKUH0I|_jQLk{|BoP~N%-NAR*_kENPiVk_UUDl z>M>U=`ql`eWn`%8(o;s)74Zi~99N8*Hc>5a{7e3jep*1qZ(YyeZ~1LKlzzxZOh4^& z@Nk}AfSGUul+#~^q&MdksJ!kqhz_0C;hT`#%$*?5GWwi@EUeF?knPOflY3&l`uqn) ztY3qOOF1e_u+~Y?Ts>(-?g+=1_i(q|_C8b@y9suHAHjp+f1up`F;sk6%^jZqHW8W1 z0)=aKz5WXouWc~wU&*m1!mBu6Do0hA+nh6&)7I&G31y=-9GA^1{U}WROYW9FnnAzL z@j3pKU%r6KV`=^veS8fwdEN%cK<qMe9=?at3;J@xdl}w}OmXc-?wr5YOHd@$ua-KC zqzG2W=}ASB(G$L6efQreN?KLgs7tGLDiE{M;X-czk{_i*x%)y-_zOCbzkh}8;cqYk zcR=c?&Yw_minf($?=^(Od2S3#VN-ZEq+igC`!|Q@^GyGssVmSHa~JSTAC(#ZYYnC2 zHc(-46?b_4aH`C6D^BOe!lI%ox285*a~)z^B>hbj%CG0z98CF7wi%+2#ZS$lR#N4s zl5#2Oua{nUm)s@&HHL@yGW;R8ra{HQ3@CT^^!&G#zr+4}0GV`t4|iV7e|{UMrmR@? z(O9OPg*pFHSbJC9wObX>MVLs;wEg_Kh<f742Hr1Jna0l$3@0~!<nOp#Tj?|tQNl2% z#**(ssB6#tiQL|L82!9|$*<Dc&TxV!JPO^&|Fi{7zJ4_9!n4K`j)2EPxvDQb0S<sl z{{!I+I2cNI!=d8P3huCuCnM8u7I5d+uj3#i&%~U6HTVChuV9omBNz&4(=YALX(J_@ z(oT9y#bkosd_85wen<7hr2Op!{3ky!X5qGjV_*s#3wyxva6CK-%AY4g>ElE0@Hz&i zS;f=A+y(XPBb4!HV%op{Rx8S)<eYF8Rgbn5QKg#XxYreFT-;MM^RxWDy=Z3gHpLPD zlK&LX_!rbEbI^zUoD18-Ja_=ihlfM@7ERrI67=;JE-y!7PH}Z8cl2-c78DGb81}Ef zRh!BIqc)tLP!9Yz^ft(I#=iCGP5uk(P2*|ua~V{<s~mQL8dp>Ltb)=<HI&|#bBFsW zMk8y<t#Fwf(;M@oXl$2O)Ko{a^NMrrvNe)Ra3!j%1G<Uuu9{nOg|ihuy<KHB9oV$x zyYkY;Iqj{g+4fat(i39u!%)4VNN>DL?$lftr87T&(s-BLuJJ9UJNg67oEMFA9muoB zxfF9X&ZT<&BG?~Z2akhGp!~fQN<R%6Xm75>xo!6#Q(U|qR>bS42fM@KMeRk#6jGJ} z1zSX^qa%k;{3}sa@l}p!ZLwXaS%KNcWEpYWlxap=E#gkxOnHg3KfVhhg0qgdKcsY; z75gAMeYCdxN*qS9bFP)y4Z&n6v-5{ROqyL`Ej9m32ikLHH=dSx@*L_L(n~Is1IX7* zdpHVt=S+grA^D{_3u6kroaZw5AjHRJufIyD@v$nnHzb0%2SdDW=0#JEn6q6^gQR~m z*JTPkhvx-w4!jc1g$l#V8zzrsmQx|?#=Al|JuwWmjJ7IPf|GKBD>2xlN0+yIq$oJd zXQn=)v6I$D=AC<BGfSHg@~g(OR;4N{TA5W`8!cf1o>hDhrdlcKt$+2anf6O<mOLa{ zJgKPKe56{8eZj!m$+344EL_gJz(TtKGj36$VnqZKiPMzjkfQkS;=YhWw(!o5kCew& zu9^`#yla1~*mRq%4-85ro>vrgGcjmg94+lvUfZv{n)a=;A8*vlZ|yELt3~5}TC@J= z#XBp0J*l!;Y8dghj$wmm{TP+m1S_T1#EqL7zR)(jy7VKI(4IXU>{@MqWnjUisHtdW z1ut1FGN72rx2iBuh<l$DNF>)x2t=~Qd@mghL2Pw2nW|RYe2(!r!oL(J+mogg3XHj! zi^9{?<tYqI|1){FDfe=r^1M7a6)LUW1dHJ#P-*Nns5JH!EP>SXo%7(X@O-Fw7#G2f za0%QBm%<3?<!0Cu-U0`}+hGyB6S5Xgdo;TDz<c2uNL|r=0g{g0SKwo?DSlW3kAP1? z#&gsU;@%92B<`K?Irs*A9x~?OyaYdiufnbHP52w!2>UfQbF<v@pxV(3AoV4)-^xeu zGoC+&pTo_tNfX9LU>~>@j)CaHJqdmTFNWj~?&I)#_$~Yic5iCdjJiFc+Ek~)9WW36 z2}@uj$_K5YS6gX5R9lHXuuWTuv&$W|l|F%c!X1!&%vEF~b9PUFonQq#2(nkQ(+%DW zyF>O4c2XhdAv(+haM=^pv`vbj+9uN=V=}G_d%;=oNO&$(ef&yDT60%H#)#Zqce3?x z=5?ETxb`nrJv<AJgr~q!@N%en>I!%w+yGTSJ#=R~|K~V(D$j**BCLiv@Jy(Bnku}i zpUr_$cs^u)f_o`cedG?vc(c0>s+@igUIDj2mB;%M_Ze4q4}~|tKJXSe5-x`m;hk_H zyc@2BD_}#?jpksS03U`Y!bhO;e!?Yb4al>^r*^z!tjwvcEAP+Gt*HL{sVvI=Rk$9M z63hOTk*Gr0-O5Z3H-z1pOh%w=DJOVYU0xBqkyV{}V{^xXsu9uYrW({WPBy%JT9jsh zElX^jsn}#WhhQke&3K4)cY*m<B5PlMRcx1s?~p1p@-OK^c}^DuwCT+CI=Yj7G_NEA z--B|=2k=n%F)W3j!OP+2ko0Z#OxYPbzUP^E@B9F1TRT6)aqu_zDEt#X4jVJi;SJaf zVu#Zlehqhq*x|H-9mz}D!pU$?I32c!mqPZ1cUQv>kTsPKX5AEcAXJ`nFl23`(+y@p z?NPxPwUY`@ggqc*(GK~XI~5)Q=fK|Z64(bWf!ga~6+9L`2Kz(B9r8sJ$E1sJ9a{P# zTARgcOB3UmcI(P6uA*RMPWL|>Mm{)2!K)7`J%X{|RP6UJ{oZQw8Jy)PCh2;Yyh?6( z4|asgGnFQ$aEIr1DH6%7;=!^y-K&E2-?>(CF5a#Bt*~3Sd2UsHEI06taVvGhr1Tr_ z)|={dt5>!7cg{6+-M@41&z^g?d+z<kbMIu_8{SiJFJuG_l_T=8I^4_r_bEoTybrGC z!C(GZP8%dPUx|wdVcqJt!n&m{?dtbiLb;(8R6JPE9gerusU6v&oa5GHw`v?e7<!6e z#=jDs>-P^_5yV>!<EzTliw{~Gsi_;QVws7^8kEh&xh2Cfs}6}Fys#}Gd06?M-Bmpc zxy{+k=6)tgNDs<*{Y(Ck9^|fJo{&7rw29lpZpik5$HIN#@sRqE>66(X7V;c{`kfRg zeX%w@DK0kV2jtE#D6{XbTVLj!T@$_wvB19+n%?E@yXf-P-*<5Ze<vzWC5tjUPa&h( zrEmyZ>1(F%>E)W><+Q|?s+O|6-dPz0#_-&#DW<CaGGePqX?SF1@uXrq^u3W65uB%n zdk`ine3l^WWM2?ZY+<+BSd4>Afo3e%Z!X7J#278*_skBU5-&t#ZOAM3_G4Cb$wV9> zz}Vgk)7l?a(M76_i!Sla+|j(++<^b=Nc(D-Y8(=q!WVCxNbg*RuehYG?Sb*U<U*QC zm1kFcA+36Qyp3b9;s~mmT=Kx`;G^O)W{{D$%LBE6G^(~l*pBP@c)PX3xGFGRm#c8S z_2FN+YB4tMPh{khwpC|;HAQOGzLs9b5!e1ur1LMuWu=+n2&z4KMkCvwOL=P2hUSjV z<b8j5DI5Twftn*mUEItG>wqsb7c3o)ftir<)}@Z=(B3g;ZJ!M3({r-nR7g4Ox-cJJ z1q<NKa1x|W=S+sLK&^$PUSih3D)co6Omzj#{nB|cn(IaR?VJs3;W<#jeja=c&WG(N zB(H{r@Op?DXDL)!e-m5@m&3>5t?(Im8&qBC4ybktZ5Q`LxDI{;Ux11Xv}N1@@GYpb z0WoXNZFvut@vQk&7eKys=R?{$=G>Oe@B^N=Kt+hJU~k$ZKfu%A4tN#(6W$6NHfBCP zYy=;Jjo}*D6uttR!8hS9@ISC6+?lX#4ST>gFaz!iC&1ldF-(EeU?+GT><n**UE#y< zVE7|E1S*=P!lAGyEQ5!``H;Oa-4&2?``m|NAGii)Le5HY`onkO0I0n6M8Yt<uhhBd zRb>%j>8wc1Tg@m^MQ(LbtTf8Oq<;~S{fm(nl_eECzm=kN5PWLWC-S%qMn+vkrx>I8 z-nv}dCpizf%`8o^bCStN<|C{(OIB8AU)GT&FX3e<OI8D6IpT1Ze3I$1Tfv+7wnj%x zE7yy*mA48jbMvd&$tbsEjCP!*^MMEQ8*kmnHVpcg^s02e4}woT;b_7^x*h{nHge{W zSsQpF9Ln=aP|lhNpMd#LS!xj+4~g6E6j%<=gca~oSP5ynIkk{BnKJ{v3{Qifz|-MR za3-YQ@0<Zs;F*y6xN{a{?=cPwqWzD%=RoG0I_E;>l{)iaF{Dqxt%2u5#TU|;iC49_ zH9SYH6Ef9x8BcTWsV`n79FP#fq<<yHtyErx<CZ^8q<8+M-woHz$OB9r{Zc6RT;{p^ zO8yRyi#112?U1Wa`hoh~T}m}+Ou4CU^unxvwekNT3EC8qg(U21mGI+{+X!e6I?oB7 zH7{O`57o6K^)I<g{-V1;^Uch)l=Hac)*B$>7tSrP4_ppUhB~LL5Z(#pSDja;@<Zp4 z$$!{q!tZxvVLhnh?l9zo;OhGHP*Pmx>tPLM{VO^2UglL@df13OUJsjs=NYEFFNi&l zEG*QP5vt6tLK@*VD^gWKQ)O1$mn!!-+@#d3RP+4+1fKog_cEsB?-@(;)NS;=1-XC8 z|I+u~2x!}xOXssmCojO+@FPecobv^I3hJD-cIcJ7+ngu;6CA{|&Q+TLw?q17%=v0_ zpw3mh2L1_eg-$a&ce)|mz;hG$AJ_~YMEcaZYV4cm><V?h@NV#Q*bb`v-5s(wmeU^I z2ls+4@ka!9gej0ZhSL$MJU9cp!*k=*517Hb@8E;=g*)p;f&`$7hkqppy!v#*0k0rX zcIE|)PIIKsCJ@Z9f}%iBs{<e@T>`-jD^Ru1vqLKl?KpuI%t$vCv!v*gX2eOc!v3O? zm=`VV53I*uL3C0@Pl4|JqK!`WXO;!x8NOJ~=^C@ox=-<|u6Wl5gZ?G`E8cZL(Abk7 zN_b`PoDS!}BO!gb=A1g!1BdY33sOfg^}plbB%Y6l3ghAMN~m+|=+kpX!u2o<egx?& zb$@_k;ZDSx6JdKe9@5Wa&b6a|#++w23T7i;2=m~xa57Y5W(xcQ>ioI}_@flEPmDvI z#XSs`L**xxFc((A2jOY(B}gBw`!SpeP5i`<;c>yIk*Qo+!~Iab@w247Dmt<vT9!ra z#bnd*MMQEe&BU^BERE{}s^GPM>Gu^ryFf)RU1#H7xoH+uK71ZL7+wI?=B2J?&Yrmx z&gXd{Tm-L%%i%R}6}%R%fs3L1-<>cC&%b*fSx??Q31^1<A7#7685Kn%YpRto8-MHP z{43GlN#mhvNiD%_Tun`xtsGdGqRcinwrqM1R`6n=c@f)wUmvVSZuh=5wLp6UfNEVz zJrQnY+tGp(*_1<5AeF9^rgSq5TQJRjph{w9ATG(R^3KtcMJhdQIx@c;Ukx+)_%`1A zm-Mxsx_Nv(><juDq{A=a(U7){S*QCe9K*BvQ1js*uokK>buOf=Fzde?!E1PI3Z(`0 zsXh#Mfv-UIsnYLZ`cfHtFny`rAp3!sbsp+d?alN4@HnWx)nTv`JOv&A>En00KxKmm zLDl!vw|XH|-|8}`zE!2?bg1|uH-`6O%0R~Oy_tglaAJH>Lsk6%vFd#UgZ`BmTNFyE zyoyz(^`)sY_d;yL+m3R_>MwfZUvftg>83GM-=eMoR5|6gfiMLQhTY*1DF3JfK3p$p ziwtXwpB|~tKXLuO7!9suFSX&_BmA`O_cdOMOZW1yf9ZGSezGU0vnQkt@5(JBp!_k? zb9WVghuc~4?tZjhcWX>S9je|B82ocrhx;k(ax?MUxOuGS=5d~z=ki<Oyhd#m<!kEC ze5@WfYYxUgc62EAXpvug?2d5zC-nMt-+0~29bw&1z}<4&sZj2l==nqGHN0<IyzU>b z#~)0a9Pagr{j&fF`9;y@pXk33cPh?If{HUmp1bej@38*W_LCV^OrEUA-RQq>iCrld zud?JwlZizkH!D#OLEMR(xfOm-p&BTWKwNB^@LhRUa<n~%acvabA6%xbisuwAgpaxI z_WXGdlmqXBq<iOns5b9vsPyt6TnrzD>mc=NvsUIwDE~hNzeV1Gicz?&xrE3}8g#^` z6ZJ$E7p<%q)1yE0qDIHI(b!Uqaqnv5|3OC7w$0AYk!@e*tvZQAduaTBd2AE6B!Ae5 z!+Z2(nr-Z~aU^WG5tbaDB<T^Br1naZBz={d8Zy(fcScy!EBxy{dxh=k$r192F6?=D zk{M2751HZQ^{^x@EXnAdBuR2lM%eE?Gm?HQJ?Xd7lU$gd<cstqdwL|<(<8~vX-PJ- z|4GQFX-PJxCViEf<et><Z)Nlj>nEdkSU(xPlfLQ|_C-cgC}$*vaz?Lk%*^N&_E$!) zu$wb_g+nLfh$J^3k>tX|lYDV_lFdDn%=AohVb3I+Gm^f_Nct)x>9^98+?<}|FSfl& z4CM^Axd}^>+>@GQb83>!N#UNJ6z=K0!!atoSJ>wCq;OA93itG+a8FMP_w=MtPVW`= zS9($?rymj4eEJdLIG>)Blce`d@<md<k=`?`=k%UQ+DOVt(v!kHJtG{S)06U+^rU<v zJt>z+?~&x@9!W0j5f0__r1+DbluM*1<?89FNm?Z*=@3_fjAd?h1xE%&3$o3;J`S9! zr0x(aV$76RHSsiSEv|{DI#_c=C#RS?0LPxG<<$mBxO-kLulC4oS9pBOOJ78I6QLw! zcMp!WoTM$2ZN&k3wUN_lG~S3(<3+aHy_ZDP97Z;nUR+?B>^PL31n<jWQu9!=k)v9f z%dpeFwUd{#^O?7y7u%^UB(+yH?x!A&rpA{=iDS2VsUbZ3GBk>yIlC3XZ+U|f8j2i` zFmZCH)IfE{t0$Q$%4RCC<XM3gv8JphgUSom8)XSwWUFen8aLTtU$xX!J7uN3ot$hx znNn6hy)4_z6xFP5ZK}%#;YJhs&6(I8;bwdO+{#H>FJo8puRzwgqvYikqcxG5{Htx- zM*`F36=`O|=xj7;>wLv!%qg!iLm$J6OPM>pKOdYCeBcdVXKUhu4x+SuxAS;E!u*VN zSCxrbYR?Wg(!!Extvy~$F>5)dt*_)+J4$ZjMvmT?xDlI0ty<@0RNSbJMoY^pXV^$f z+w5Hvz^3ED^!+HLUdHe+^OLOgtmGsOV|pPDu^}$qSv^Q=pCFI$1x>=-X;Ir55kDfG z&b!l9gV%001RxV1th+TfPn=C0zrGLK?zN_6c`c@`N|{*RPsi0)C4I65o8M9Qk{xq* zgHP;UJPNCsfy^Fpk@%ZT-*cX6VJwj03o#twNrya+H!b#g!RIk6X9qG_8SmlS_;z(m zW1U(C^D$^WJk2;g>|+gT&uC?gYsTGzz~0zzEevGg-x`P0Td2vSh7XB6_${vw_>P#s zcB!ri1a$f8lSP4`*7oWy2?Sop^75FVN1Z;n79Z5A&1mNwtP0F4qKx3&k$CN>4RiLc z#;}yV8pEATWMz6nowmQ&g^9oIf)Cd4L4+qI#vTba)1q~D+1(i2+iB5uBr(`tN@9a5 z%S&yX4eMW@mHoTVUio*QW!NUy|HP4{sJKac;~fRs`as3gY@odm6Q~3w4F_ssQlAOv zwJ{^9Noi<4R!`T^jZLH*1G8j=JxscNJzk_ypu{vJ3tFhp&|0u5-n6ygy?9Zw1(kfc z)LJ0-e-dvx>DL~mgED(x^J~hmy3(;^`#0$h%`MB1n#uNC11s{>6H9ikO^sDPZ3*6( z9MWoR36>~cs!z4nOe1O@SX&Y;tj^Bk;BtQrdM{pm5RqZCDo-w66!-lMQ?kxRVpG1E z{S)h_9m0#E6n(9wOZMCvrTvA$2gb!FAeY6gt;#dG(SpEKuKZ>Ex-IaLk$HZNPj_dL zQ>@tEs7yb#97`@V1%k=@japV9d)Uad^)!1hD8F8f@G25Fb9HL+Ce@ijGqAeIrZ$Df zdcH_Jd{#fW7O7Q6NmX9<4C9kE2{N5Mlo+Y5#kot>*`g)J#Oc5|u`<c<R7~}?J&mdi zydD^?V)ryQsIWs>8^dCorNwJX7Cm4sQvGOC+!uM&;)=9Gp#1q>@Pg$RHIjzi{}47E zdI0~~X-}U79~2Z%D=zTu*^(fxGTQ?t>Om#oR%?&+ur>IgE<Id`;X?9EE`{F@@rHXC z(YAO|a!Op-g4x9f8Vlsj?SW}iXDTZ<L8tyBIZIKv#;Ygo2u$KGQ>#+IHx5jeR}2jm zm6~9E{6XfY<kl7#wQ+=U&Zf%d@uDOJSCK8=p_w7J=<gi-R6(?)I@dU~4YFUzSF{#N z8dvtYZ(y#>&Ma&n6R_gXY(Y|GOh$qiobRcuqiZ0byb3Sg(HfSw4l&MAI30pn>z!(^ zrW1}JpJBE`ck_W%)r$|}-6~5`gCA7cuPSh6Ai+b~W+JD_2f~);VDB!68OxO*2Jo46 zO+tbg5*8;X2w7BNEmDHWiu)oVK@1CC)R!P~vFQzKlcLs`-~)0|s+wsgU5yV(lO0rn zHAkiLpG{X2f)5hXRZfDqu5@)K7Ob%LNc}~85LSNyG8@mO{;-PYVnKSE++pHcZ5<X= z{G|oA^5tVO3+7?ihEaaGax5i^*@4WI#d7F{fk?)B7-McA!&q{nmaQc{<WRF*V}4+| zGRad5G1EY`c58G&V6@m64eOvBbB%f$<BG2f1LLaDNwNq@{VG(Hm>&Cl$zK{)hWfrW zEIr&2{8mg|%L7@Ut`&hOrmkgytWI^!;fEF-Zak$r{Hnlovbt1p>2icIsyMwmFd84H z9|=j5<MglCu-IB7rL74*z<mkT+)FU{nKh{Bu@-~2+EQ6wZWrmU4@BC4-iQ@w;eac^ zqD8%o!}W_VB>ZC7a4qJV^frd|tFOl!wh{2<cu{f$e35Tw#VmLa(>79=^GoD_je!M9 zYVjqq#yj4#-zpE@6ns00TAi0H!wxRtn=wZk2P>*<2`rB_t3C;2^;z;Z-#>nou|#3J zjSrG*Hd_O0RI^FWByOWrxcL}kiCjNsq@TvU%BS+w0f8`7Rcy|Sx~hshf*-Y2Mfq`i zAhQ+2uu2}p4R`f54p9%nYKGKocZpF+w9@pLsB@=+A6=Ld6z<VVf6iFg#tD?amk%&D z$^k!MqYc!UlD7x4aHy*7dhS5;u?pqJ^ikNn&uhE3hzV>{wM`)K+O9jW+xx^egETs5 z1zy{=c}!rFT-XP@;e#Ir8Am8^+G9S>2Wci-Z<i=EncBXAEbJ{!9G^Wn@K)Er1)jH3 zV*=}~j6mRdD-sC2CVA&T;Cbtin4o@dwNO)=J~zD82lGkZ>Xj%o-pUMQb$M%%wNarp zEO3G6tuZly_15@6;CX96An?33BoKJs%8Ci<_SO^hSasG6A?vLi%qMwkLZZ-iq9Kd$ z5pBB?#y87ytL+J&1%cVHch#rSYnXn>)B`Ipm=HPXbM*z*yKW%xyjv0oJnz;90?)fM zV}iQ9JDXqsf<(=wQfPKyewvAw^MdER8P%L*rzCh`g3MYQpOv17U9(8uo|W?h<F<1u z-smlu`8H;B!Cx3vHD*PYEHw^Y_!mZVNFEbM8KZLV9T>GiC_iKvKP*p>r5h_3#aXHE zmL!<5eqWX#vwqiJFHDm&SDzF)uXo!Iz2|Nn?G{634%BMfonQ=VTwL=f77*R;@Z=vd zr%6G<{6BXbq}$V_6JD!*+|%J_@B&Da#>{onoT=qJe+5^-ui<_08>ni`_i!Ej3BCsD zhBtGKDW=Wd_)XwX$h8iYp>>Ch%IuBLSwdzH+}&X&a(d~_+Le9bX*@@u)~aYO)U8l+ zp!Op&9}maCVNjj-<KQwl9zF$`C+ofh$<o~~;i+&NEPxHsLm}J~7Q+-c8Fqms@MuU6 zl{*Ahz|pW0=0loj?qzTqycsh8)?EQ-!iV6Q@JV<UTnlHxjc_h(*qFKWaA$Y{+#g;9 zuZ7pZryvQ{eHku-Z@}x}ZcQk0;r{Se*caXohr_$z3GiMx0j`3%@P0TIJ^)XL55k4; zA-EVm3g3X}%56s6SPNUgXJ7_=77l>V!J&|S2i%k32B@_wFGF>MzYZ^fZ^5hKMtB!| z2dd-yBls@-7=8&qf!p9`ka^F}=Wt&lF!M%T<|jK}!#VJKxEcNozk=K0cW?)6+T8Bv zz6bo1=XA)#EVmbI1Sh~IP;2>{!BVJm44;GA$Ne3+EBqR=PRZS4C%b?9K5!qN=fO^J zA?yqnL*j;e1Jr)(f5Jmy>z&!x40eL)@Oao0X2B!jBd{NQ0rrQlz=7~hNZfM&fZG4N zE4}@!p>{K%_WeEqGXLByhr~U1Ivfknh2!9bP;0zyhbO}a;VJM9$a)P|qX&8LYZ!%l z&;v3F4uGuVa3@2p@mc`O;0jm{?}Mz-cAtb=^QA!q?eG0AJRNpxY4`O$7rH!aRA3f- z4bFid!nyEQI1ldDinSte5WEoP!HeJ|cnPeAmqHB}TnR6NSHXqw8u%kz3^gKf1MCiO zgk#_`csjfZ-T+C9?z8X~xD9GeS<g146WAYWP1z`TC(MI)!AX#`>sCY7qq*0>Rd6kQ z0B(Y$Y4<Dm2>cGRUd?UT)^XNA_0c{BC&H)U6u2H%!RKHtd=<U{wPtN68aCSdy9;~= zc7xjUdj!-PwLG{PYCK^JTne|sJK$IFarg~<4t@u<FZqu!V>cT5a1{I<mcc(@6?9nZ zQVScywXiw-2)2NKK&@G8)Q-M2xEtIJwugJb!LU6X1^0nva9>yjBXB9~3^kmgwQCQ- zL!m}3v=%KL9s`TvK&W8}t$n%@YVFet@KmUAhZ6V;)EXz9p-}@hurM2HuiClrGI$ZZ z3SJ4Hg;&9sAbF_!C0qnM?n%6XL*WuQ1}=ps!JFZw@OJnhyc0eKAA~Q#hoD9#9*1M$ zlkgt64t@lmfj`6bu+3iNlkgz;JgkNr;Ny_I+dXw}n)k32egG@sM^GaZ?4ROZ55I)> z!maQb_%&=s|K2vJ0SMM9x*70SI0XI%C&1s~BKRlNI78DW=mR!~@57y;hNoLV9k$pS z>O|f)P(uyvVFla|&W4mN?m`%Wsw1SpHLxRm9UcI8zyo3P{g{&s+rfij8teuShuvX+ zm<mV2G*|+Az^Rb+mhP4CSa<`>gm=My@OjuDz6=M$ui$a85&is>b#7ZY0(O8SVG0}# zd&9AC6lC8SHwsUIQz2!ddj^~cuYuX{dKiToKbQocfJIOz1eU@dU>W=aR=}N@b4Xe0 zwu06005}~U4r}3H$of%t9Hgvuqi`mi0ndWxLl<5P&xTLJS@1nL2YwCb!kr?tAYprW z9y}Oc01tzg!K2{<cq(L_syhi@4J+X_a5`K9FMvzo_3%cx8Qu=J!xd1=C0D}s@LqTb zWSy&f6np?44<CV3Ap7>XHSh_jN!m}sIdCm}AHD#;fvksh8+9bVgL}f);l7adv2F@{ z8>Yc`U=jQX&W9hv#qd-3AlwXJhg;wl_&MAGzl0q+kq^QFa2p&3e}WU>&oCGM0w=@Y z;5l#yTm=7wOJP&iT0IM!!}lTUb=@!EF7OZ7687m#dVzi6p0F711<!zc!%N}5a3zdD zjjnWsAHsv-_plpmb^!Sy><Uw%#!h;{vG7P(2K&HS@Mw4?JQiLHGvQ*`AKnA0i@EFI zVE7q49&Uvvz;<28S7BE;4)%m6!l95lo0|(yff`21hZn;rya5)%`yuTE_d7Tl{tQcD zvja&7P@^Zzz;K7c>2NBX0q4Ne;MH&*yc3=WAB7jdXW>O~GrSmn2``1MyVA`9_k;^z zN4OlG1aF7=@D5l6sY|*S!Iki8xC-76?}HD+hu{YIF#H%k0>6Zh!fkL3{1rX{|AbG$ z<_8gfVN3Wl>;#{IUE#Cv2>2Wv1fPc*(s>Pzg|EYt;hQiYz6Fcm+i)7BuItW%@5Afi z2XGnu6utyE!!O`hP#gGC7k2l9-@=YiYX?t-Kf~!zYX;}TU*U528_eiNdCnT4-cV}; z`@`mN2-F(EQLq)92wTG`uq`|TYVF`0sI`L^!9Cy=a8Gy*q%Q8>0{4R&iaG$Uf!*Nq z@KE>`OoczdH24e5fEkA{ZVgAl-tbh|2c8CxhG#*oIa>%v!JDDho@tC}4Ezpi%~_X2 ziMQ}>m<>ONIq++k3tM-m9S8S@QP=@$ZCN_3fCHh{mYoc%VK$rwt6(i$2DRqwRyY$r z2hV^_4<lcO8fCf=?hY@4d&5g$cQ_yRgO|a4cm<pSuYwv>S_)5tH^8&tGI%+>3El#4 zf$QOI@MU-h)DY7B@I&|j`~*G-x5I~Ei&Ww@><%A;%(8Y^=kIFF=s7qLJ`azBFT#oN zC0GexhBM(S@ND=Ryb-<$Z-*P9#*FAhaM!~Bz_;PY@B{cM{0@Ewo2HR3!(HGPusft} z=4#03M>rU6hZEp0Fc<y?YvAwjJopE^7_w=Mdk<^~AB60S;cDb)Ke!(54_|~4_z_Hj zKf;c1ryjJ=;C}D`m<<nvOzm(Ef*Kg2P3TU88Sr#S+t9rh9tGFJW8g-3EZhY9!cXA< zsL`UKa9=nIc7Z2AX8Jm#;jwTmEP><TRq!NuHJk`n!Cd$X%!6;jD0~;vCUw7r#js-r z^<H=!EQ6z91v~{-!W>uwC&TG*8k_+yho`}X@C>*do(b1N7d{Kmf#1S8@DDf_YFO)H z*bUBy$HGhDXm~k16)u34kp1mkjbkl_*Td`Ky>Kaf6y5+g!evlHSa-oDhf}|Rd%=6) zp>QSa3-5(v;eGHbxEg9i>T$RhJ_SF4Ps5f+kPpKY_&n5b)N61Ad;{jeH{mq65iW%9 zLX9{52d;ykz_;P2P{T`~!w$X3Z{Z;LEgT2GgX7`%un_(Li{OuN8vF^?!tL-J_$#~$ z?tmI?YP1vXhfUx{*bHuk%^?eVoSmTtn%E!EJruTsec|qKEZh?o!}jnDxHr_eQb%|j z><k}+2f$b1fly;dI!Asp)H(9oq0W(SekA!Z+#ROFLtsxh5*`UPe$)@nggS40J{$;_ z!NG71917RLVek#8bH{f&ihLWU!4u$-a5U@#bv}3&EQbYfDy)L1!&-PIoCnW>8hV-w zKZEqKxIe)2Ve3BB7hp$t5j-4T0#AaM!CZJ1oC@iaai_s+;92lmxDe7u<1U6v;5v8% z+zgk&R!396fCt0d;9>Ai*azMPheGyabWefzz<jt8PJydo4SWbLgO9>j;S=z6_$1s4 z*TQe%GjR7~$d_RXd>$SHUxtI=t8g5A4W0tughlWjs8O}ea3$OVH^9%~>u@XF0>6Sg z;5V?%vBYQC8GZ)`!0+J*_#-?C{sbq&?eKQU;w<-3*bu%C8^O<D6Zjo$3V(*p;W3%C z7hx9M6^@1N;Yzp<+z9uFEYfy5z$UOWJQj9?BjF)%4D1ebVH&&@_JkU|8w%frBj8t% zzB9LHKk5T;5<CT#z=?1H%z=-=T=*O;fLmY`HtA2k3R}V{a6ecAJHj&97nZ{uI2D$` zN_akGpH24?I2}F!XTXo(Y49s}2Ha%;@fmi7vtTNm4KpG8ak>NHxv&792P+}_bGjG9 z3!#P<=fhjzrEn!&0N;UE!f)Y1xaUCPH|z@+!&BjPunb-gtKd?2F1#7u3U7fM;BxpA zycO;@i1-c%z}w*zcqd!|?}m@T74QXk4}2f4g#Ur7;5YDo_yc?hHXlqq8}0_5fSuu! za0pxrE8x>m!-dbo#qdS=INSg?z?b1G@KyLBd>u9zLcR_Ug!GNNBj8(b0^A7Cf$zZe zko`>EH{tv66ZirA5q=1Ng&)CYL#e+&jTn9gBar=1-EQz}*av<CbKtjd9{e6^Ja9X_ z5B>_@f;-@6@OSt*{1g5R8|*?kcO2;m9t#`6Lf9By1e?HXVKcZ1?gYPvJHs7t7ufQ6 z`e)#-uodh8+dvHo?hbpwJz#&x{-N&WumfBMBXB+J2s;lW-9ZiT9R!EKZg4U@1lB_K zdv&ja-QhZT7}Si?G}vf3<pn$#_Jl{m!(kuT3mylLgeSnG;EC`U7=_2eb73aD6ZVCg ztJn|z1_!`hN3f3!><x#&p>QZX9v%-*g2Q1h%z`&V`oLXHQyC4Pgk#`qa4gi!iWA|d z@Fb`)#ccQo%z?X(q@4@9!9sX4EP`clGOU91t-BgHtcF*@X>c8!0pEtF!4Kd}s8PeS zp_4_rhr7XZ-~n(p902FQv5-D`cQ!m9E`%4r#qc7iA;rt!<M49$DqH|RfmgsrqsRx~ z9&jNX2(N`F!9`Hxj5okacq5z(m%(e`P4F(b9DV>FfnUSNVDl4bFTl3&3D^Oyg`MFu za5Q`tPJ++DV)!Dw4Q_ys!PnqZ@GbZ<d>g(2--ExykKit&Nq2B}_z4^UKZB#-7B~@p z4yV8`U@iO-&VgUSJK;9?tz*VflGgq=Xl(c6+1`lo*#krN$}jBUpP4Wqw{l9fOtYG` zh}-o|z~-^P&ABkKl~H4>qS-Stm~<8sjj5cGU0a7J-Aw44k5$#&BO63ZPtX=%X2ROS zKw41|Ej7dRO9GMh1+?>}wV&g1$(zaoj+w)~eM`-pQ@vUde3Hl6$qBDk^D4q^cNw%k zjTV@h-D?oXTbPwwnOj<A7V+o{>)5~zY>S_knwo0nba#%uW+S#}fmTK_SBZ(C!Hbge zN&RxGqKS(W7#?z>7~#_N2^tvQuXxiZ$ca4xs+9?<V!jDG!5}jb`12_O0jk$0hr|SS zI!tOH@MauP&-Q;M(Rp)tv9SUF(b0iT<a7Ry+nKbQelR8`G=@lozGc=>cy5g>W%yT@ zEFBN6W@}@X=EQ`?(1hT5M*WsDCaFu776j(wEG>x%jiI98InGkKHg4~V<<|F@q^u&{ zXb+Sg{JqGNQ?+;Z=6NbqSXV)+mGY5Gb;p?wrIA`V7M=zb;4|SFklVcio(b=SXTf#Q z<=^}8Z1^Lb1zYl)=fDHt1#l?57M8*5U=3UXXTclbmGEYGBfJGZ18;>2(c9q`cn4&T zf!Qm6F9PKro+EH2)PB~hAY=Y!pMg9`>Twl#kHB-_qwsS07-Y=cc@jPhpMs2yJNU(A z%-LBFe}~UOh0{xLf4Bj5hcCmC@O8-8tn&tBY}R=TUJl=ZSHKS;V~frwQ1bz{K;>hf zL*;jJb9ldK_VY4(rR)MvPt5PMv9HcQsj>S-V_R^w3I6goHFnTb+>%c%MAMcE15=cl z#5V8Il)zYgwfWC@GeuibJ;JRuaqO*9S!^~ww8vxRAh*fDesPjnz_A?Zt|p5sE3YhN zr`FS=1>;QanaP{Pb(5N+Hw0;f+wKiCuohR1Honu#*}SMRFPR}eB4l3?FEqeq7IX|k zEhdR5>Yls5q|>zMFKV*r3WV0FCX0@r9Ml<oq;hjf4a62lqd_bOC@j?K5t3Ho8iv+{ z9b>Y(G=FC;v{rKh^N<rw-nu@Jah{ktjbvb{v3*VO!Y@E%yQcE2uugFNsXgohZ?0of zys15AZciq0#lI9sl(q*V$nfOf6Q`7UlK$LG_%qb|Um;ab=Xa=p{sWf5MhzINf{o!E z*bFX!yTBV^3-};x1z&`%;j57K0q$nFJ5*ZV19rm2?V*&(9!TzB*a4Qnj!<)YFym_d z4*7xm5M*y8SNqH!2ET+Xz;PSlmm^?ncqHr!kA_FXW8fG#5Grl6$DT>sL*Oi)$zR-a z;c)l_91S%Gi2YC9ri9se*cqM*kA)NAsW1mJ&%vCp;KEX#m%?)RF06u^U@cVG&w&ja z)0Y7mPj}9Pd%_Fg36Ob9ZXsL<&xF^&OW?KeF1Q#n?rhFMYEBq3zsa1NK`d|?zjRi@ zhu~WHJbW5{4apB(#;2U;VR!fvWSqr$6W$Hqf@|R0a07f7G7e$R7T5tb=Sz9cGVbs` zMZ?g4E9B_ZIU_O8$uElLPZ^_)PYX$driPV@N&jl@|Ka$%UuGf+XEK@{ti)~;OI*TG zr6Ur&;JBU9s*sTG?7liKul!4H+|rV<Is~#uSAXKN+&vg}g8YWt7ZTsyLP%4|%wwY} z;F5<sBj83z)!xM2QIL4<Pz7}lgk#_UI1Wk|Cqn6raw}<%E#)iv?aAC{ChCkV+U&_@ zD}Sn#)~_;UJegQADn%Jjxwng(a+jFGrkmyQG8w^SVm@k0|L+jXxPQrQ(iOqZzB%?f z6~D;66CpXLlMDO7e26}r0w}*kq5QmpJG`&h*~oV0KArolL_Zf+Mzz?S1@KzB_}6~c zMEOjtXoUMX+|ApOJc1;yz>3ePvw0;qbE&@66(%eM_p3qDLzYZ=m)t8okX<?hJlPcd zCqGcXa@)ajD7&Y^gCKFs=!3Gy%!yQ;Ncy;sJDhG5FIsb7!R;pM!z^ivR%XZT8k>qK z|7!04k&tdqF_C~IP?E<AeY-ib!ZpXpD{KW{@jx0#oW$?Pj>LErS2t8~?q71Z^deV~ zHq12}FUT)*;a>1UNcu777%9D7!t*S68RVUFIh4N_K<VdM?y!FLZD9378R48=w|?Sw zlg-2i|4P=6!nH2_$X`kNk*bsRBdsOsN9inrR34;dS6OKmE^0e6Q|2y&{w2RiXKfJ3 z|GKWh@6y?IP&&H-N@q7hS$Pwb&TfI|&(ve@gm>}03a)@p!h7H=a3y>VJ^&S$AA-NY zM<C_1slQ5>Yk00t=agF}P8P#ib?ZF8CePo&Hxt|a>;E4*U+p^w$}iG+JN~}IlRu5$ zrSs>Ybp8^Q&No2m96cJHqer9jx1e;cI=OWI9+b{$uNa+w0N>>KV@SQ+)YZ4a%{)_A zaz2A<%WQ$I;g|4G_%%Ep5)Q6({R32(T+JOm`-42h_+ctMCoxRC9G|R{9X6D0Mlj=F zi6NpSp31AlD69;z7t(|bQSmwxq3s_?iq}dr{w24C^Mc>-i*&vNc7f=@>_z)0?8kEh z>Jp=1LzoL2LHSK}$#3C{+~NKB&?DUz)I+#uC+c8QwAz&Weai~8NM}$<uI<W+VAQ|r zRz+f2C<RFs*4MS!X5$tVAFqoUo>XcZg4sw@rF?BaLbr;9S%J`eu0}wRA5{3Rf%1>^ zwhN@}G?(hi@+0xY#7Wha^LXA3&VZ^j&w+bF@&r?7R=&9x&(A~EnH3i!P<m3`S^AW2 z!)5VEWGcsoa?eT9r+*Y8jgNm8sS-6A=VvL@zx12(b7OdjCp-u@${h#8K9WPZi8Nx| zzKp-ad-n}Pwj1|x+}9<!-P<H~czJ2Gth&Z}0E5Am7!}lM)P{FT`y(58%T(G20<Y63 z5(vD$s;+^6jiu#X<+n;*{v|hR&)-I{vnRw~uG~Ew%I)aG_>pi*I-4l1p^fj|;Pr`q zRBVeS`1l`9^qLkaX7V%LQ~Wq;8s>_&EsaRMdrC3(tQxJW&f;AsZXGYfP7&(alL6Bb zR;s_;d>5P$l!M4BPHys!sZr)p6uhvBNGYQNS%jNa==Oj~zsqobf@4h6Smvz7w(@Et zlypoxD!8O0=~!{8#FOWuQ>CFo*bU+mbCysE9LsYVRDG}#dagA4_15rw4)SSGX{;8` zhon1GPod6g&RRbUE=TV2?>@*krVnd2e3|FD@C`T*QdT&N;HOY!{EzT@=-}2Rko?b- z^`vvPtIWBNH$&2~>8t7rRo3@{cf<a01*8pY&UYLOSMi(!ABI|X_XxZMJ_c`ukHfp+ z8u%!D3cd!{!B61R@F%z)HbtM$!8VZm#N8E=7rTmsDkqhfpueQNq$4t=;eEN6)Du@v zj#k>k4<Z=yujc+ArW&jGnu;VYzQ)2`FZ@ft7fxHR<370o-JAOOo1S|KclN#>)Yku2 zRD6-yF5EZN<=(2S+~P`;^R>Z<e<iy%!mEQ*g49)4KA_(UyY)YwTR(<!!zZ3w%lSK8 z2ab2^jrF?qfA<Wy&pr2k;koxq&%JfUg?RVgT&H`7ajF`HrOK86v36~}IzBGcrC-%I z6uy6Y?j^ki<zRSk=y><uQm1=I&nV+u-Rk1}f9qt^7Wg|iH^Gf^b5p1|L4Do0xr)ET zd;BUgH|1{4eOt1dwWV78F@~55uEaR3x{bnMQ4oju*49|U<(Ymn9FM!;M!DlaD7TPb z88?$>CDmc+KQetU8{zGByP0L*wrASqd;dyy@O)lfk>FsB%w!?0;ilwDSU0b6f{E5L z<u5A467m;+07U+k9sVWv%D>GJ4Df`ilTdvzXTSD@>T{IcheOH>r#DpI+7HT~^Z^-t ztl(WZ4?3Ust&q=#chs#9g~ea@g!pySM0H3y1gmWUnqSqwyu7j?K`AOo`eK4hx{E+x zckz883uVB&<X-8c4bK;Pvf=noei#9}z)`RdJORr3age%>IjdIn*9kmR&Y8Yb=_Hru zmtY>GedQFu&9D%X9vs?5F1j>*ssms(&(havP-W3l%B65S;nJOyhf;pSJL}eKZo%Z5 zs%q71s*HX&VcfssqMN_5Gq3#9|F-dWqON`Qbuy-kjXJyXw|$<Rp!Ji9OKL80sXmkn zBi!0!&y+WcpBV^jxT)vIj0j7kR#aevGJCR-%a@7r#F)QNBYM5j5SIo-a-e6N9UzAn zm-W{Ga<tNn+!paN!p(pP8yK2HaplDE!8dZv*a});@xzTZ6(MUf1M@odY5>1u1~rBS zV!ptl;6+yOqCjr4zo8#iinETDMf|YpiemzywZ;=q2*h%vv0KiJr2yY<^D4eyFr6<y zYRrEOL-0i{ye-97LV=t^UT8NB5#v8)7{F;}Ba582kWZJJPgN0)`!Z<zwYMRm-*Oa3 zm6kI3yM-seh&Zhfy%Y|G>hD)%QGfrHa0$E)-U45Pw?f*@&TUZ1`F3~?yaR59)cM?o z*u4Vkw^u^NhWp@Xct6w{=m#O|l%0p*O!zQlov`y5WIe9)6l_LJS_d=WGq4X_4+p?! z;ZXP<ya<wSnlpGeL)IIbHQ_(N&w1voJm(A80G)pgkAUC7W8n|*0{A0jy`J+cyaN6P zuYrvl(x!zw!!IFvbN_&?V7n%aD?!$anKj}^!FD{euFIUC@d4Di8K<K2&afDEfmgx< zVH*-=ceo!+g~vhK7VcVj1Y{n(IeVD-?+#;0t^)p8*bVlF%nx@4!E!hhGJn|_0Y8GH zAoG14bnYGm8G~{Q;CNUJPlC$JRuN|5c5XY|w>$4z!n^9u%jhzXR+_xbWMxH|_OCYn zAEt7xLcv9nn0+Z@n1|FBiFKT9IX`$Af3~HPXlLF;xP$CV`>9Cal_Y9E4mGYb*-t8O z?5|WswFQx~Uz5+M+1WLCSy)_Yvu5)yKE+*tncIkvTuQ95T(Ky(q|gqPC?zTl*_@-a zxWMdUX3}uHO$T5LOJ#NW10~kYcE=XK+3fjabfw*tcmT#d(SRx)_iSqpsy8&Z&XR?W z!c1xV82;WtnCi+UjCY4oxHl|>2f|4(18V<((_jU>7&7O;RUdmbTmoz04N&_B+z)3! z+I!9!@I9z~13rR`W12ol<|?>N`RzHdGn@;%K*l#+wJFboXTuAj%6080@G)EjNr%o7 zsJ0*FtGg#$29<Z*42kb%KLOmX;Baxf*-v0GyoYB65$A}xo8Tj`C5nC$rog9QPq-H9 zOtGh-<~@7}v*CZ>+3;gH7jA~E?KbQEmq5m2%{kv&A#13eui!ek4So#2g$h`$|7UHp zS^s|sdBm?g_l3X1<Du67S3x>wT+Tmq8o^6pW4IBL-?_iQ=CCb!$IfsvWG;t09kzvw z;I42LYzLJ__k~K!uX2a$CHtV)!;tR|S0<)qv-_kuGgE~}7F%K4uG~zF`xiNhfBnTV zflB1#F_)OgHC~p3l<l!etrZp3rk0|t!X^}ZoM1)pJcEXXO_O#*Q9g*Z!-rtZzvL&y zb^eie*=s3li{;Oo;3RkpRNe1ZNMD4*7`BO<_d@Ba4|WU=wa>prr#*ScdQRuw`gEmj zLu;y|Lsf?%OEITvs<ym@5B)1yYb$v5R*LixXx;dBHS(y@4-1dv{WUQ`>|i%*!rO25 z<-i1MhE(I&h`{QY5R5rWRm85mvdXLply9G>o99~I+rX$YQ(^SCeP%wN+2orEDaNGq zZ@<)THMZYz6Egpj?i42K1AE;Qu0_|<=O=J1{1mEgu^C<kKZ6g#E%0slIs6S$&YJmG zU%^8NC#^G2hudHo{0`m-e}I(#PJ<?tX{7tcki5xh0!brgeR)@?_2u`$mhf5F3Qi=Q zk;dF=xI26i_iLT`D{yc48r%meuBh&x8Hy`E^W9+HeE?V07gs83s*18IqtgbKL~Vbt zqJe+KMG~*dznoX9@~fO#!{6Zuqhz)od15kCp{O`vqX2vBS7)V~ioW874KgFN8})2L z7~y8NkPe<R27B>5ImIMWJ60<zix7G#7aw?5RwN43O#GXN(Ed(B{M(n$7w{^=J+eVf zRbrCS459^um9Bh#ThGdS<DaiaxBjyq=i>We6$XlP>PzwaVX1?;3YWf+xdUdceiRPm z`6f67sw~r5{b%9vP-WRL_yN>feT8`zY}|mhBvc$c8R|E3pxjUZ=fNVl2$D~`FTqmy zCY%cY1FK;d{5b<^UeHXK4`;*aa4x(G&V#D|o)1^Ri{NTFAAS$7fSSX14P;*wvv&SG zcmvOi;Vtk%co$UJq&4#m(T~>1H-^m3aeG0njn9GWU=e&8&V<iG_M>o^yW_5a8{i{Q zYvkD{!mN>(ULNHR*B6=N#QbN|598eTS82gCP?TA^nD(#c{vQOAJ<~|B%ufgN`8%8r zRC`*8+(tU)ZdBTdbV>18k!q`Fy&{<{PE5a;qPKs^{fbBG2b<st-^1VX(<aytY7c;M z@KZPyYOTNOO3ZO`H^3j^*HCNw8)Dyf$oQC9<1f86;_vYJkS7vO?Rhr}-d~^Iyz<67 z685kAWt4GbVqsWeDp-afw^_S4*pw9ryuqgNfxsJV$_WGvHmNv~(!5bh^Q?ff&$jH2 z1Rt<7q<*w>OyC_Bta|Gvbm3ppfpp&+!Rwy9Ra4rIJTq_1%=c{r6}G#><KdoA<w<*( z4flaHa6dQ){y+BK1kT5*{U1ML#JEw0v6I0l`@WXSn8i$t8M9bIA7d6X%w`r$lo3f% zA+khKJP27sq7;>oB#Nj=q(VfcBLDYwo$EfIdp<Kg-zW6_{a(NS^XaAYp7*)#vtH*q z>wWIq;ZBBI7w&ercfh6fo`!I#pJ@vBB-|Eo&%>qr4yfO01@|i4)^N)pE$!gaSff2$ ztih=ca9hB=8*X>F_rM(jw+mdd4Iywx!VQD_DBN(km|v^=;XVVG?m>7FZcn(F535MH znAfT(xR}rKy$C1a_Qu~{X!8%iEd>|z#{yrt@o?+HO@!MNF5QdJ1#U9ju5gFIjetw{ zBDmlVgF75<8eEL+RTkW5;AX=mTayQuYz^Iu@D|*M;qHR_2;48>j)i*+ZUNjM;f{xU z3+ihE+^TRNgIgW$6L4vK{Ult{<*9IOTj6<5_%`IPG0K?Am+r)oUjp8XKtoP&eBhDv z)BZVZ1css1Jq?0ap|b;p^;0ilk$#e5&}#??o4;^E#-lAb-4^s21A97FvYwH3+KK{* z+doSGY%IpodMpJ&Kj>xw<q7tpfYx^Ifg1xCb20w5br-laCJls3$q9zL3T`Oe58<M} z;xirh!~Ft(L&pn#go`!If=h6F!lm+@hku^snF`LrzXbf-Ra|+}3Ag`YIhV5E1<yOP z@0_^yf?q}a!;gyIA8w(dcg{)4%-BCl8<iEBw;89STzJ1B7A}Pen_5r@Za=soaAAK7 zC@&Afr97wOpXVBOU2qg8J-55KJnIQH*-A*5UtuMpOp~`W(~kb3rFjf?1eo#x)mCKD z=!Z0-S@0POPJfc5cN{p+GY`*!yA}VY;@_U)(o5q+OenaT{2^rjil&&7<xDZnvB)%P zZPwrMFl&E(?Qq~y8YmAGB(00mZy3@{=}Lp!9Bu|&)B~R_><>2^e-DM51DDnb5DD*1 zLx;I;#)I?RBXZ{T!@tUFXzHjWy%Xn;Anf0D=k_Or@IU2sG}26Y9Rrv0`UqUg>sYvy z*GJ(}UXdrx>jbz|U+7ObuPB=$drMouQQO;qe{`>x{M@!I3)k*nSG8(Iq<p2=p~9v3 zs17Mkv=jbed5YW96u7s8c^Ymw+-KlMz?}v+8Sb-if%)9yOt_eT6)cB42QH<5E?jDF zS@`F<7kmsH#rZk@ee@UkbXO^<sQoKirCs3VRA75t@66{h$av;+A<{=_cnL1$a}iw1 z=VG`~aF@cRe7*vABHWd5pMwiK%j2^(a4G%k;8H$|Yp1kELOMb=eqV9<#EGxyBwVfj z??++9nNw<~VF+6HMs(w?!`3+SPHFJW`x{6zr3>|6&;{<Ba4FB*;6ks}+i;=3Y6sjU zaNmbZy7B?sYjAhNr96EIm+}r>C}N|~4q)8*+==?QxV+<ZxXHUe1nr-X4HO-vr@WH_ zIIGyUQSQ7G(*;r<R*UqV@@4-hO;i@8;RXwN5P6_<ehRlf+(U4C!aWR^o;?aT5ia^s zUjO+LF6H@Q{A=SehaV1($`y7{?Jq9RXumgLlXZUa@hoRulM>iJil6dV3T|g1Pa?gP zrc-c9&ric8J^v1Fcep>mrSxK2!}+=u_3Ak$*bS}`WUzOlJ}E9=*_rYg-a(MEe?==Y z3trBOq{<xyPFI`mWQi*<Tuw@AvR>w+{AfA%M|peKqv2H=zK@RWTxY*U?SbYlZOubG zspAXgodc0I@K?wbes+V>VY)x^L7gAzk%$qZcTc#SYXe_m2Jg_L{HTn6hT945?{K@o z{R3_Y+^cZo;G+E$6u?DzJh#C5HlNQe4HveC#<9G<SQhRF_`4k3y>Rb@3mxUN3D7~+ z2!B(Wn!~l=wuI{kw-wx4a9hKrHLiAWL*cfE8wIxm+`(`=!cB!sd;R%v?}j@SF4i#% zmcYFS?i#q5%NA^admr2jh&LVoJjYKpz>&^X!@mQ?=|@5uzPH4h4+--tsvs5M=Ts1f zO>1c$)9*o(o_m7}5Iz{`qcnuTrF0<AoZhE_J=YhAyAA&);or8x>7|ux`V>07U&tHF zdTZSulJ>7~vT3h|(zdoP>7xBO@AGy9O(w<hdFkT&VM<R55>Nfn0Q{q02K0o|m<hKk z+-$h_!Oeji1a}17UT{ak9S%1i?n7|#uV6gfF>on=uv1(PYk@t-k<bx7k4@`QZ~sL( z&<EH4hyIC*pbLWcC<6O!r(`Y}`m7B;q)4x)lYA89J<7)O2!gw;vLI~#D9uz>WkHZ# zrr$*5(GTu)xDDYx3%42EnQ;5SrLhUw{<(0eKbr@42i*B^OCY=#;L_UM0=QHb%ixl( zj|Xn$VdLAD(0vE?Vb%7+WtNyp=S;Q26yS0D=TI1r1*u{`QaTmSJzJO5hR>(cBJFHY zx?R{`t)$(?1;nyo;RCQ_LYKl%ucYXMr(_LRgY!qxIlt~mm9&Xu@lUI-EDTX4H8mbt znK`MvGhtU!9?Peq$?Hu4fBk%X4)0(FW)I;lNot&0QX6-t?Ir$U6fk}i7d4jYCNtEI z(96l8CbGYjNc%^1KsrEmzCuVkGad|F7j7KfdT=R<25<}DlKtEWm(F%=huZ`$`aV9V z9e`xCz~8iPM|Ly_F4<2?9@)v4;F5hLyH9p-AKWf*kHLj(!B23>{`?A;>`qCf?|!)S z{$_W$q)SWT*V03ma4#sY`EP@}!&8?+@rh7wc<1r7{VS?U$KYij>!JRju$s^wun$<R z3g#=c6`WK*?kcN+axC-l2SiE9{K2pEr8o+Ida)i=JpBAQ{>026?1i(6#HaN@hm4_J zBE~}aWG4Kza_K`wGtA#Z`IUr8_}d@<X!|{k^GrQ4W*_ntw(GfXo&ZLx5_RsBuP`uv z_2@}VQ*)q1-bkkYQHKTfp`YD+{DJjYAsk-<B^Fjd;-C>kZw$k2g(H1~9+)516X_cn zEYcPF#i3ri!5skiLAV3qQu-c*TL9Mu_bA*!aA{11KDPk6!)L?rj7q}axp0%=?u45H z_d~ct;U0!N4DNZj>2N74nQ&`+qaT3V5pEvbV7OQxEJ%WjJ%oZWaM70+JOXzNTzdB& zI$W>;?pU~Qz<m_%0l2Vj1@%h8cEarhcM@EBZ}$nf)8S5mi@i?u4BP{7r@|e9a+n2o zJlr{Ov3J1l^{#>YJpLv<zYA&hw3*T1sIB&Z`>v;+^Os;*(W4+@{~U@gvw%VHs?61` zKmJBlm;$b_!jqlL0;^TU{h?V>#fFC0sz~Nd%ME2~<!}Dh*Hw^`1sHBH?g3$Q*V0f3 zJ~Ar_F9qXEwodii0SOvY<45aTWZE`YB=sAalsY6u4_3Q?)a?SFa5I{x$C?H3vwu`} zq<a|dusrdLQPxzR%i!J#cLiJ;bFPFN4tEt?iXY=Qp2w|+i#|?mgu4yyCb$(5?wfF7 z_taZ(+roVZF4fU?xKx+%_hSuQmG)g-0q?P>s2Eppcu=e>JT|aLc#tcwXSW_9I1*FZ zcV#Wes@PVp*vRf7JzcT=qC#9fBYTG6Ee-AI<>49Fvmb{`50>!oi;0a6@7WFdpda=2 z@D7ZQ4(w+FF6rUhJ)|F}=y3$hk%oqc^a$1|>KYl@L*0&G$&+Jsc!u|k4e1sV&C!xS zN9*tp4euKgjCDKxG)L>{>*9N5sJJMATPS4?5y=*n2zi(C@OCD=w1;2Uu91CB!hJkE zBO+YvUrz$IJp4J~E?sI>Arnh;7Lvg=Ik@{LhWEOtu*rjqOnZdk_@qmpMxrVvUoI1e zFLx1CpcDNm%)rnHSMR_caUr_69rZ~5UY`Cv10zCM3COpEr>`#WIuf|Ir?<1Z==qYK z0$kZt7vy`3r*C-A;E=xR4tTp@P)b0v<MT$jLb9`6aT)r%;-RT&Nv=@3Z6g;}U(1zp z$c1O1&q+;mVW5*ouV<--B2?NTgqP3Kv#?VSe|(xgG$}qeFFOf~%sRLQ4oNziAI~Yk z=?K!Yen^)tQj}vzV1z3sHZV3W2F)ruB2cR_iRe--ED{nK#M(msx?DZ|-OuZS_4E(r zHZ&6@r<0(Ybzn?T2+B>j5%Rp1i&c9DhuFT9dh+#k_~N;su)yeu5VY-}7|tMx_!Slj zjqDj~i;!B8NaeyJ-9w^#1_#Clav_p`m7@Mpf#K0HMxbh8f!OH4pzaik$zlzM0HuIi z6Ez45{&t6FcuY`uFi9X$+P9v=w|f-QqUnG_bYH_aD8%>UN}@;_I(W%{Oh{}D>mB(w zbNE9IqGO$9=`WGC@)R;fWmib+;v{rok@29I+We(ROH*m>JZ0QPYL{9^hltzPF17nr zPZ!w=R-70%<rH^!$3t;FyZ4Oj(-VH>d^5NuDE#7+(_O=o@?E*{7yxkV?TZ0l$%3r( z%!JTbSGOMhqQYFE)IefgL6H$rkul-1A?Vmk`_@6{i;;OOH}S|}DEacfr`Zq^k6Ui^ zmsfF3L2_P30^J=}-Z#<sXXO;*-N|@UvT!8<j<3qowea+G<DJ{el|V1DBw&!4la#}8 zFEhRrcOuS_;tS34bR9hX5&B#G%gQ0kl%AQG2YbXpKyl0aPB8%>aa<mbxNAE-3#E+m zMc<jwKcvjQox#p_Y2Oowx@194>d+i2uAV`W!RU=$G53eZaNnrC{rv|Iae7BZ2eB#F zzU_vj4tDx>4e!=Yk)BG}8Sx{X-hBdl#>An=rzWo@;!`q*IwkIp3=8bamC_Aer%8O_ za=R0Gd)<sJ?NZ0GUk2`(OVnlO%1%m94T=>^8ij#e?*Ay3fEO+@(;Z@W6dM|@cA+|T z$ORyG{h`X<Dk!uy>!IC+IJ+8Zt0Yybh?MDQsMjKq(nh5CZib4J<a~^r9bqiDp9bPz zv4}t4*<yEocDe(Kh|%V^D-6Yp#%M>@#Yjcw<+>u1T@gv?nc4YRJl2VcGyZmBVsbI9 zOn31xnim+Td!%$fYD6(c!8U&6h@@=XMm3TZjRY3B1)RMnDH?e%bbIsjaX81V1E66L zNxWnv!iV6ZE_W^#84q0)v6-2!uBk&X_{Ts94`R}fI_#O3J~$~`Z&UHe3O-&=AH49v zwx1p;;qagxyy^&Qn0bIkQjz>dNo=O^(vN7b9;q30Q-%FhNe)eW1?fvHC<Q;l%(YOs zJuD%~1*^nOpA$_UEyV*CM>ibq#>l6Y_+;haJo^Ykw>EU<;GsEq|3yd8M(EsD5{&I} zw~3(jVE&r6?a|roLCZRHFjNP1kJ|%$Qa0_4l=HpAv~g|x*bCp^P2%n#mCK*%AQ`O{ zYl_kxkkO?@4*i3lE{3$E5lL7ZAf>2lcLI^o;UPUSoC=S`TqQa#gyt)Xx<HcfqHe+| zfo>!=CMY^QDi+HSrG0<(rx-G`Tp5`e^xa9#lprQ0XYfcYD{H1CF;2pd2z=8TqaH0$ zg@^>)aYLVC=WdF^u10J&Zhy<pFk#gs4wpi40VJ9NfQ^gK9+HFWKk1|GRH!LNqq?PJ z=Hzy@Ur*OQTA|p7UbCg@p$BYbO3fB|N+5Y?%Rz5+k$5FxE3od#yRS6lAyI!O-7lC@ zVzMag0&D<#Q)>wi3UyI1G?^eDZ}?2QX8TCY6kIYqwQY+C?Ca`^`9usqMEorr4e^n& zVIk4llO9Tk=OE)5hUtNRC;|MoLcA*^xEn&Gd00F=srSbPs_BW*Au%D*y+eXsEx7@Z zpO@_y784s1VIC=A)8-Mnep3hMZTt1+N2rJ?q>_e?i0mDLj|STwx7Z%hJ;HlBJxbXg zVICf(ZI9mKK{kQn@UcCjql4m*6U1VBm9f2odPK&AL<Po%v9{1tmhlSg(IY0VYcyLd z@+oWkM2E!2VZ2QBPkcF>$B3VGnaJ`s85Yx(?*G%Gx7w_X|Bc6Owny(6Jr%RduY&E- zwFjQzdZ*xhZQ2xhs}3fxinb?LQ&@z_TP5QGeTWE*>27@dY@eW>u^2AG$4+u(+b7zi zrmEN;VICe;Z4a(;L~pBBHQPhi2UVBxt8V;==K3<VRm1k{-P^MwYua96VYU~Ixv7Y1 z*<K-iV`-We+%p1|X=^}j+cyZ++>Ptm_PX8n>TSZbz3SLrVJ0P%xq*mIx0|G#gy6{7 zn2;c{rK~yRr`rwuxJ23*UN;=@Tv2UUqexyi8t{RravH7^shbSQ$Y>*|TMM|Jk+H0L zB&b^o$e578AS0@q39()KaH*51ZXzI!8g(=e=r#hsz^*Zd)UAWa;9x`QhCxBcbv2}J z6(EDdd$Zb7e7aSDH1XjhD%6h1Q#THH_6+G}a;+N%$dFz<&LKhFCcshMvEAePv%}GC z1Kv@QQKnFIn*bRc4VG*!g`^t<Sa*6lne^y3LE*&38d5h0kljLJO+D(S05Uu@q(@AM z;dM)(;8Bs05hf7b5Wq*o^)PACEr5h=!`r%@Nxp6Z@Qmpd?M{r=ez3u~Yn(bM%9GZ6 zkRg48!q^TItMwhMHZQiY)^*U)kv-f=(P~btofLf2$1XE}ZUcopTk}kaqN!_pV!n<B z8I55Dh6!ZM$hV&D8y4CF%T0D7>f1E4)O(R|fX%XSD-%cqn<r^^vhJ{HcbYpQSw6l$ zU`mV;Of+^hFs1C8nv0ucU7?uOB1b;HN3|~x-J_F+=OyLjx?=OQl3@RQc;FQk6Nvd{ zOj7oU)P$sH%$9D0$B*(<R(ysFMeF1Hoo6Jm6cEQ!1K#wh#Hg4sSGTmx!PuE`^-LPc zepTT2xqh@qYEEuX%#aX;3)=7Fd&(UL%iapk5ii=XkMEm>qK!_%7QG4gcElOm$`urW zsdkV|wX5M78clj;%Ej5G$s$V1{RCy#ACJ5s(InA~0flI8{p83fu_4v@QLMcNj!MmO zp|X5@r|YNmjDb^t?#9RWY@sw`^%QrLySP*zaXi4H6C8vq7{g1BkE$)cP$1EqF!rnj z&wPwpW3l`ZpOY0GpD~1{F+RQv<q10v-Ef+rYvw2uBHdhJGLKPoPrT*Bo|NWg9uMo> zkct$S8`g*vk4GG7B&~eAPzIoq5vY5Pk3#j)zO0od-{e6XdPrp`O=yfqb$G;}0=o5e zg=4!NH!=su=f<-lk%GA^9P=#9_-NulnR=s85^R<9g-_wyWZf9!QKlyJT8^Yj17g+u zvMA5bQ0?u)k_vKxEYl)RFq%qsUIM)aM_DW{52j`2y0b{>{YEQv7|obydYr+<MVY6y zB@b06)g{H;qeHV>7h8mq5O=ml3MYpXNAY{<C%A~iarYj_LaC+&E?TC8%F@!7`>8tc zq?fpz>VrxMr}w1I)8llox;5a9HOxhIeN)!rbnQ{w;VV7dsd-O7Cf1AN)UE5Fvox6J zHgqo)MQaxq5@+^%ryTT*4rH|9RFN9)EL0QNu`W~<iyfIVML~^ek)+CQOiul!V3#@` z3_@da7X{_Ek$yTjX>i_<u*}S1Zae9X`Kntn-0Dh7c?L;EB}Zkaj)>1q!a&Z)H`tL` z*f_jw#~GtqjL>n&VoG=>dr;(o&S#7k(Ichm>SYYvnZ^q&MqO!v5HWYnOT{-BoE6Vc zNkp{vW6Fp$Z?E<s&Et?Nfa|8Yh<F_P8O26&wnR!521`w9dj|yjqSk^!L(w+$N@yru zqAQkEE`j9|sON}1CMgXs%W_6ZBSW-Tct%1tZ@9##IaHS7xVxwTj3P%u_Jaee3px6} zF)9Uh?CKexj(r=v`_Gs8>UtxKyI*oa%0)Thv}IN1=fdK1Qd~Vy&3RcIB$*`o#4lwp zBm>#Q0VvA0ANaHWrXdIMx+0sB97jMwcsJN?IiwYZOBq8$A79%3rfD=+BF17qzLStV zRG=N3>EBD;u3L2Xr0fiu)pI>jI&N|5FZG=qOuSS|Ox|F+S)Qe-SKg@$vMah1PH!DY zrHD!7oKt$&JM1VjO{rS~3gsJx`>k_xVGdFDnBV#MPS&ZGs90M*r^YO;Th}H_J^-5b zqP4Q{xaOj6*kZ+C_A}zsIKk9z&QLI|w2^QX9yNR<HAAg7ht4BoG(yIY7U&Bpq}WU@ z@hVdNU3ry@(*C)-B4ctB*%JS%DZQ=<TTkPtTuhsgbu{!gt=ag~SyNMYdOcB(O(M00 zgjtPF8j_ls!3m=w5UuSa??sF<1;0vH1eK@@(+eNp`iL((hni|GNB5!RDl}L(9uw-9 zT%x4PXz)m$?lxW6fkM}fhaBc0i0(mm@w@#wx<!x@x^zAFz{dh`5l=lZ8yz~uA5F-} zr9vkAz}i9SOLuEJYtmnIIXuAFsAGu1h}K1`p%F<iD%_7@n&snrjLan#?qcW-c32)t zw5>VROmj@6y>vjNDy&Vz+=;;E5|`VTy6#wnY+GT4(>3(GE^M|RG3dOxEJ?q|>Kd|5 z*#oppNSPh)R#8sk!**rpwiTS3Kw+@nujM2Lxx#RUDoHm}s{6k%%&c0&@dyS)`Ya9E zsQEe>yw=ZYqlTWZ6AkTwWuv-geeSPW-RZJnS}tkhj*Oos{W|VwM_gY4qHyS=5EhRT zS(vhmA|ze!nvc$l(z8QnUk`#Pqf}PK6e5q+9(NS3D=0H7pKFh*;!a7cbj4hfv>Apr z!C7?}ed@Uf>dMx7>FSo5o5@lf9O-RSGmwXlavN!_BjB+pw**)c){_>JrlgD{C?40- zixN6U-Ldgx)wODT1UpN{!+xASD7!g!;?bvNCg|2fo$5>-4s|!~`toc<)Ow^LnMOof z(FnOm`*i9XM@aR36@I+ciY<X*WcE4PeZ_uZi-v9;r^=uS%tW1vkWonq7#ZbaLcpcF zLlUhglx7r8!ADD3@fHq8N*(Af%{qHxcVpF)J=*yoyQg<B^a!t{l$v`~$f;WHj00n5 zlra@$U8%UdwA@rz1gDMLfunQMg2jv|S;c<TZJcI*y6@%m(~xPSD8I8rb;aiD5{em| zn#=XXJu9VVla#0)*5nMMBBi1zqf?1$b78E((-l-y8tgM`AXVR$nuV$_$R6%co1yd6 zR7`fT+_9X~w%VRtvu@JIUP$A5$MEM~=-HC;tUbKrQhUW2AZ`VtbW(Rm+o}#7qQvPj zIkjXwqedn``_PNf<bO2EhX+W!M&OFdp)%Csq!j78!U7AccrhiU>u00XZ{A=wrCbXX zOn}saF|eiwr4k9Hy)|kf??cSdJ7ExnO<eAsbP<!y*ig7axfEMEN`gv(jKyDfF}f!_ zCE?g3<G{p37^jTf%sf3xW@EY<I)c&(%1q0Id8NU@rb0>Nm`Z?hPRV#qn5nHCS=!&A z6tHO8n$zeupC51qCT0$%Gh2!HM<?lZuSOl-C9Tf(m=9SpCAn2w-e9)U%+j2tqE<~( zOHxmcN*7rGeBUgTW<A*`oL912bo>H&<tmc>Vm*9%O)8ZpwS}x8)oh;j)H}nR9<s!w zWe6)SCM6S>FHj*k#*QxTLe@E=<L9W-lB6QVnAz=z^pPKWLaTOYYEoJvKSZS!E9ukA zTtV^pxC_aXvJ@VM>gBE}j)*;0gQ$VvEqFB|-j#--4fmeSP<YfDxlB1uYLIm551Pse zVZ%WQ87_v<PB!<<bVdZ(FFJrScAsJ`;r8c_%S%T0G=L7zNX|47``E@oFO+C&`@2>O zhmqz%ihCHP#h%m_FDx@VRS!n=(v=KkabON3TUs*PQCMH7WjGokWj{z#VUIo8l$_Ud zEn5lE3{r<=Xe}hIzgF1P(VQ#>8>a4sgd<Y<tbx>-m`pz}bzo*LWag$i>k*OC6ow5k zl_zpa3fLnPFR0Mpj?pyR&SJ*uJo0o8>RI1b>1vM6#HS58HPof-^T-GrST+~mVf0CJ z8E%~1-(JuGkj>9=1!iTXxy{0Dl3mIaYZ{%)rKd4=bahY4$HF4Two3ADOed#<I-6eZ z{z%VlV{-GcB*lG|hb1*t2$iMPV`{l`v^GS<kBZ99OvVXG?xCCMQtgpCI6FQ&pW|u- z;oIDC(V#*4J(^aBCyqjwou$L2dMR$vh9jl<$2WFslJ$rpCY~xQPpk)wjZ?8GHnMI` z#iC}{wUWCn>bVq0M_u_cokuP^8oMJu+#GA@T=EPPsuP$vf<Ex04KV4q$9zu@7>XIC zXp7=kI5ZlX!JKm<$gmdEPrLNMTtBDRd1y4mEUgtm4P>o|QcRgFb`@8T_$Q#Z;N!aS zn8NCSb+)5$Y9J>eI~6yj(U9=0yM1D<o0CUX>+P;u8d?8U)lyE1S^CiZJ{^joo?Op* z$soFT0Z&W<)f}R9Rvc+c|G%*IY`RmRDJTXUhoV&^`f8AmujfpLo3=FBPz)QnX&2Lv zVL!&l_e&4eD?0b3eo737J_tl{PSLj2G(R2%%+Vz24^<Ei4BAR%VuDT-HP9$${W{k8 zs96_UQZ;LDq_ai09$c)m-`Y!AdZZRXgJnHd)`inhN|P2ckOFP;uN4}QGEJGHGUJg~ ztM<W}xvkoBpJTcEAot=m)l&pY&dk60HA<Y6A~Qk-hMMQDo=q)<eGSs2j`qS7tM3?H z6kLjW{>EvcvCChr&gcxh;V6Dtkf34fSLlFX-(_pdg$|lLIZRU2h3*Ex>wY|dpw!M6 zkDwm0dKlt4iRL_w)4Ipg0ygaRkqQ@PdFZY%ZYJy5o65wjt0H0^dXID~LE)hi4MsdF zh_!sAPLC*(ZqIai3i2k0?dVC5VGk!D0?ig{1RfKt1f2lAVMCh~bhOsTx176;v-zg2 z7Ph54#n85ZbZ@BhaapXO1SCj*Z!cie7>^E{A(_}u!+s7|^0&^;uJDp}1t}OBLsCt# z`cTL-MQin}D2uaJWW|KbHbYkmttPV?QJ=@bP<50Q1H|j5M$KzFngpu=waP>tjy>+D zAlQ$(r!|fyAXD`4oZzJ7cr-Sn@x72u8WD2G&23p%BClrgkcJaLMnU!jc=Uv&v<9H! z<Y{|CO2Z}2kINo5vc}EOsf77M=gJ0#t}{b<_r^LoO-3jy#qS-ta6l8Y4!5<J3>3Qp zPIW-v9Hk7&+AzoVxK=_c1WEuYQ7N|)Q5EV5Fm=ctO0-`m)U<VK9Ap@>G|$@sT$ofs zFYB`F8XU@nMvZqbl7smahD=z8k`~T-kz!Y8UUD)kCpXr05VwcoTq?!S2XxzV3@xx~ zOO<y&HDr5n5%zQ#Cyn~cKj1^ff-LHFTWv8sCZJmNqnx3*$9WV?xXw0~I@2*sqNONK zwsUI9CH|@|343Htk9N~-+_5pLXnZaksb<H^g?^G+gKo#vHZdYn_yS>KDh{OU)#5oi z6|}f%EE8LxJGG+O&4FvmPYT+Mw<*j*>ErfZ`~Z}zirxi7rSQO64+p4~dbUShCt11& z(UV~A!l&vq*?qrh&w*|Y)LZp5GLq6@yXKhql45%d-?_evU0>9TQ@R4&qb9w)b-|yr zVo%1o@|HNV$14|C+^r1*oj&|xptMxhC(^XyjwrbJ=?_SIOlN|H0gt5!Dm%{^ryfE! z(IurvRx}J}Rif&LsffzW4yI`=)!q!<p7mIhD>+;%m(gyXHw@MNsxC*?3ESXsHpu97 zFQk;*_PK&+<WA!X+?ke<39X|h|BNnD_c|zbGDRDN9z+&h$<#xDM^FJYpwMYIW}<8% zjh4M`O2pHWRcdLZAXUZgP(Kxzi{s-doEI`R^lAomwR$t3*Sxi59j40_#<_4`b0;3U zSBK}AZDR#XIwiCDNVcuej;U6r0|=LFiZnMKcNH^9(ZVOR<`o(oBuY=rHN@GwsC7|K zF)3%%o9Q9rzu87*jsF?hhwY$dE{hD@{Q65G-BS=f0iqZBY1C-%l$xqI=njX!cg-H8 zb%pvYHaCTb$$DpNyw(ynjZ|)*>H-#v$y30g61Ck&>ZKKqhnm)(Xnq(B@oFq48<>+) zr$x<%UV^7Ib2ZYU0_&ycDjE+k#%X2fruPJ}wu8+A=ukFyD&2G`+r743&K$={{h;)f zNEGMv1$UuP;c`_Mvt8;^WYYibGCQYkxYkJ9Cc=n|%2SCg*KygyGg9qhcCK{)<*`_* zZE&G(n02G*hA}6@vB(2M=V5OP@2cqN=p`UDG249Vd10tFGoiug-)ZBY7u2~`Qf}VS zkH{JX7k}~lYr60K1#=w4V9y0)37hL+mewrl99dUrHuD$bKNnsy^zj|(QOZ=O<}?-0 z&Wg4H)`6#VOugx|2fWe8)%udoCl8mTa`gHR=apK>n>w%B0&(jrW?z?$dTICAlvIpT zJ6K0b!P8KQmdjbsIdmF86m7{I#p^m!y-uaK`nZ#rDVCPIZPtRKTk7127B|1r3s1)j z8#wOE9E*ok0rak(!v^xGg-77jUVm^dp>drNI}5Fk)<pR960>C3YwOC=tUDO0CRj$t zkutrJLL-7v2p+mZ=Q=nT;)0|~^~o099;P}Y<T5Mfgbi0qp)%7Q*~LPWZWnJFQ_uOK zv#xP=flqA0zR++zsA#8RcRsS;#+6EiQDmc%({Zj)q^y&Zr8;pLhAatCpX@C?2$@?h z1L`xg6qgIBJJ)-W>8)<ep2Iqhxp4XMnv7$bjaLtRd|Oh^!*Rg?m3QGidL3|{E^oFc zregN#GLg*yy=`+vm!Y%s<vodHy%eKI3`LeUb$>cbhlgnnw-P;Y`}g5-)fdyfF<*3( zQ!l6^8a7D0`9az^TQp22xtu}biy3}!H&NWCB^RBCG3DYfY~wg#ha{t@VJsu?(Fz_a zM5Do&xen=*9x70GQQYD?2VZDYUF$c!S%pS~4{PFG_;`BHPv?7~G;Hq3sarmv)4`=} zCq&!q;?JmX9t*FnY4!LCA=41h9;xt{AgPe`3&}`y+dfjWJa<#ipmh)`@M8Anc|5R3 z+61c-oe`jRR%HIi%Wy*q#Yz|BxT7VT{BO3f^mbaZwp!AWV|Izg$!)t8o}N?{3r#_I zeK9B-C#o}Il5ojSQVgzJOGt^qR+{4k8NXghJqVo(qS{DK&PmdHZLvCudijcqqHx!t z8$&PANoif&UF8-^T8@j%f&2I)btpx;Ijs>z2a;MNnmZJq3)*uxjSHHtqrmis?KnCy zoG~Gj^cbF{c|C29P}FqygIVU*b4uDX_S{kM-0C3ZE~Y)`bbC&p&@#E99MS!@J)}Ty zMSU#q5TR_TxG_uQF0;^Bl^btyO3%tilOsH7&*tgm0542`p(CS(Amm=Z;B1CVtQmAB zimEw>8gwpC)Kc_AdH|-EvYqoy%JnR5+GzUVp7PW9imq^@F>zO3N8weeBd7vrpUkUw zh4+Z54vN&2p1=C(dAVI&&ZTL#b@XVF#Tz|UZGniXR&^)N>QH2xl3C9qM|$c2ouD%9 znwd%0u9~g&i1-97A7$e3rdcJV)n9w{hxZDoFI?)-PyYG<wfl2Y7W(`JsRW67cBZV8 zzZOb8=amZhywEb+CR3OoG1(Is{h|gH%q8RjdT!S^#YeSQ%qp7h+=?VmTh!uD4mro{ zvJ2xFvs3g%wwq)Cq?JduGO1{T^pL9X9E-C|g*M4)7MUe`JG!t9HU(6;XXlQ%@K#aL z6%?{#9_v3`1x2@>xCQ@GXhDWnDY+$4M*eF2srOqgG%Qj`TG!@NR-9-WZc_WDW}_F^ zX@?J=bk}<?9@Ba~$@$AUE87to61h?{2j?YoH(Piajy2#hJ>}#x26#i4J6g_ik@==> zN;9B!ddG|xf+(xaC=yo!PSMEbMHYR=2_FICaOf;Mj#+Z2mxZ^KF%+dz_Bdj|t#6pF zUiT6=2XIuYE*%-dF%~W;l+h*p!zKK9a}ci*dmj%xb9v*+^TR${w=sLzD>WW}<QM<g z$O#iJ2E_SQUUXvB$GAv~<zD}~L*Kc1C;a@n?pi;4+m~e@DSz)%4>Y*^Mr7R;Q=dFp zu^it`jqrL@o;{-X>OH%9?3>-J_pafe&Mx!A<$xv~x;}7x!ST+|1a#5&Q2Tq=db#n; z=Di*&Gw`MJ)ysqgPv4)=ZDWP`i6cK7lvC|ux8~>gZb5{1xyyq)OFe%0)Vo)Yw5&L3 zd)A*>Eh^8Qy`ggR`K{OeGNoB4-_-`W`@Mat4<2<}%^yB5+2Zx}um0FC`Sz=st<G&Z z|F03vmN(0Vy5U|f$Sw4_WPLrc_FL`m4#=sx<oRm;)xID4;Lyc2Km0B7YDlk6zv52V z5+rxvli!}bc%(<YdM^&T;$36h&k2pcnA@g7bnLBd&ph^h-+7a9_Z-W0sycJWXP5f; zHA&c<xV-9!Q%5c~D|K@8fhOY{ygqwSwO5-UUY6_keEAXcO0L?z<<+MS>>F9}>axYD zPYrJ}ethq?!=G=_J$D=8^`>~EK1@6t`N`OKV*@UKeQo_a8{fSB)qCeGd$Ze+;BRV# zowyITsy)bZ_tkmi-0%CdravCOb8ch*8GE*0oYZK|p|@xKvNw19_xl_6z#WJz*W!uP zm+xBEYTd1?uS|II?%vmSX1*|b-iW(`kA<xE9<pW1lekNl<*GdVUF*gNj{bhvbFKC@ z*t+A2_wJqT79MGq^}(K&8D&m)ZiPGkaW9>}_lFA-`|awOQcdlBaCTPb<d`10OTAx7 zYI0ypleVS52sw-Tc%9{LU-r_8#+g6OUYTDqzTEp28tz)QCcD$zKJ%7Y70cJGaR&Mt zfP3uxz5UCEzw_h%Vec<%KL7W-CyaTo;@S>h{rrBT+AmJ6-D&;elg;t{IhI?Kw>W3f zcYCJox_YwSv6lC54{NjIa_Lt}54-K9ry6wce0dG-aA&!p?do0#JMiZG+d2=Mv;LLQ zqnCYM<B5^azm&eW(fdyaHlx?Kd~t%v-@E4NyqqR2YV>aMTC;^mo36S4Si`xiYCbmk z$bzRkE<M+E6v~9|f%Et7^=j;o2Qw>uvH8KKms&O&a(Cxt>to){{=UHHVBqtoJJ*ZD zck5Vg+O1!oJ+|%b@XuzyHUB-I<DVR>bSiJ_EB|Wu^!^UFZ&2-UA?hD27ZCU0R~vrH znsMj(MJuMBUG!zx{uzgR-(70^hAU03J+SS>G2FaUn&N%qzTZE%yZVyb?uqYs``Z&U z7bM=<V4(V<QkfAsAI0@(^Fj>1tH*MC&ecvhK5E_3YgHPI8`HRSy+77Im)iT2-6vz} zoZCJ0>I2W?9dg|6=kHy4#MSk;u5Iwu&uyPL(&AwA!1vz>xNxfOH_HYz9eaOvl^OH! zEeDoMZuaN)w;$QncGa~%pQ%^&7wgI(-^L|RR(_~+^FQ{T-JRJL_qnoM>X{2A+f1yt z@xnLV%g+g&dt~O0^us3~duHIyJLlbd@%0(#PD_-bc)cDQ_WK`IdZm}xJGlO_8Wrv+ z{Z+L|{)gr~I&+i%?H5;+xdIc%axF%-tN8ibJ9-VMw0m04OFN?v?VPZB@6o<~A6=X| zEVprm;keX~<xbAN{a}NsZ+tjr<--%cU4D1BP1QP7itqSX#IbV)Ijw&ixEyifVqbsn zz=NBcy?iEgXO&Vt>-aUu8WHmJ>+SQS>a49+>R|pKL*i!QN(+`-yEu2@);ZZD*G0EI z{(bP$<my|OuDxUIr<=}i*b((o<i2sZ=a1!DY^+pg+Q}1Y$>E<agl+gUf7!@^rM6#q z^Ny)cSDO6ZZ-2at7k<l9ylT?d`CmWXZTQ0-$_$Nux#4@Ip1xG0&8Eu*Jwxxkz0m}( zM{s8(%hjnrqIIp?Vz#C2s`PT~;_6>NUUtlyQ^$U)|4!FVWvBUl5r*#@vfTco-&L=( zb$`2Mk#DaW_Hlym{4HO7|J7@^jU3%9Z%xyM=NsZKRM=jB?<em_ub48yHFsZ)$o^~R zKiIUx@@_L4HXT<Yz&B=3$Av$Bg}WwM?v5$9JzMVlW1qC>67kxgR;$1GdG=dD(>nUa z{y9D5r{8~GG#z)9vs~HMXPO-Oc-iRR7lr;SWo*y(FW1O;`1$)=4nA_*pV>d9w{zk0 z6I_z$?;SmV@9-VZeKxv6_s1SjOFH!FsoD>nZT3R<#J9ctrd{owi4JZ$%k_PC;G{-% zm!E3>)EgHbyQtQ$9D8SE!%qkMY%9BR$5SughVnbaa^btvXCG?u%FfW##Tz<x?N+jT zM87d#yk73P@5{8B@a=)fdblR+R*LtdPScj&vZ%({3ge!OeyY!|vwa4<JU1a=+`|Kw zhrQSNyAQVF?oXCG-S_?UJAU}=)m5c0KH4|7!!y0x@4a@{-WFr0`St(!z=%C};9f_T z`?^lKdP^op&VA#af(^ZgSLr?Nw$GD&9voWg)W(E6J5E@GiyqIh-0TgF-~FTOwC8G7 zKlAh3YflBP@9<km|JVzQGqzqW|HJSz3o$yuMbiG>&m7Gz@Lv%#JLuep?*s+5&l}zN zL91#1Rcou2O})QDqg#CO%`cV<ZP-64E3a?A#Z`K}5<GI~m*0ksn7T4${QO6fzMIfz z#`YJK`jh2a&mR-rdcuW)4{g|=_4=r~!43RB>>Kb_`r~=aCluUM^;|y2*(huD=QCfK zJ@l@=ho_vHz3r((eZPHh!{L|Sp7!zPdz$2xJznD|E@hs}a$7ThoZjx?`&*7kjv2Um zey8N>=XZ{uu{ZUD<t;9xelb30AUb`d5&GP3MRsK?YW=X7y+3Vvru)FCbCcWT-I-Fp z$*nn)9y$FP`oZ2T*S5u(ukSDUZkKVsxtH%doHpy;6^}iadaU%m)L%b%VL`pu1MqD# zmg_fvRP*@(xOL^#vCp5cGJ2NRhPd&oJ3sNnxV8~(YuugxCvGT!jrR9WFTbeH52c>n zTWihR?WX61PyGI_*{gO<p7UP&ZVf*E?U%Pk!A`Q=;dAdkw#GO5oy@AQFN}L=|3iTh z?SIcr{IPOy!K1aNMK_p;dpKF{O5?CfJwLtWgAIej>#rO2(Cg2YzPG;rC&NBz|9hD! z)7N}B826oEOyuu<X<Ylozoun04=Xk4l><Yk&+mTm_d0v>tKA#%VAUU=eBle&-58eJ zf4oH1mG$E8{4wdSy_+XBt8j0n5jCUx9A2<CcIMR1jjFtcJCRuK@R0*S-3R`1y7MQa zO1$=D)icYN-}Cdadm2vL^J4$^HrH(MIlei@a+5zg_WsLvMLh6zgZqXL`K`&V*-w2x z@p9`Y_I`J8{Eq%r`)5F}{3v~Y?j8EXx_)i%OS||>%X?>DY<l4H#do$1-CMQFmgTAK zZn=s{z-*SQ7T>>Rbd~cp!vp#)EY<&=kOi;Z6*%|k$X%Uwo&Kn6(3tmNUs!Hd%MTm= za^;8RhrFMBYs3-XK^?YEj;s6r;N{0lm+*VrZyx%XJ1|M`_fB}P{?a=ylz6L`*W87_ zYz$s`VEl*4X9Gr+`0nn3TZTUL70NiD<=+2e;<AIO6W2ZPhVPPNKR?o8{)>+e-*UNs z;Pn1Y#{63EQH<XAvfMA*zT5g-y*5{;f7)o1b?{$n`i*+-kKpE2LWbqv+2cO1m(f>N z!h*WL_rUml8*+M{AK$cPsW5eVU(Nd}?w=p9bIsP$>&~3m*!bC&I1S8lx4d<=ZkeDT zh9`F3wE6O|`>PyOsc-zTw)^JFX=|XsZ8zZ?)hxI7hbk%c17>gCaL1xL<6iw}V$G?S zCN3-8=J^9l3R>)){1xOXV~xk(JEn2M6DhCv4}I*mgi(z*y+8l_!xg&M^7_nYb0fdn zGv=&nrBr{GJDoDB_Ndso=id3^fl`r!PED<!+po=~#FO3cnjSaj@q=_ucn!-{t+sIa zGsBKm&aL_Wn)g3B_{jXN@$=QcqUXOmaL2WjO`Gn49<bcS@Nu&q?VP=C#66ex#x!0P z_r|=Gavy|#+vtlf17CS(cAeVL1B_+;y}y}1@6xmXdT(wcS3+Vb---R!Uwd(VT$PEv z`rP{Rx@&hen1j27S?-xqas4~4Z~ok{DUYu{*{Nc+>T9ZZdA8i{2WOq$^UM!vo7XCJ zkmX(&G9+W$ug^~GQsTj*Q@`lf_1?@EcDL9RQhjB=fcxHFa^It{_s}hW?@@JgFQ@+8 zxZ1%9wMVUZGihe^A4WXgDCyN(=KgSc?50VxA(zW?XRlpOj+npp(ddhr54C!@U)-)0 zCAM$x^!134729X@&QE}S-otW(KUkIW$<%*+@bUUfU#$4{rM^dhShYBF`vZZOO1B>t z@NwT)@lDbi6z}1<yGOivPlKmM7hLLe#_!9MzrNA!i+l2iuG({ARE^TD7NEZz!g5V! zeKs}s!}3+jRIgvX+ku!>ExK*~>6VBDuL7T47hZh1b~Aiui{*0rML$sHUyZsy8Svs) zZQt!P=;2$Ry!D=+6BZth-8%XE21lmh`&3x5_xH{pR_~62SyM|tG2!*<vCYO!`8IIs ze&4dbFFyOulI@e43_Ph+D$7;d6<xAQpK0T_w4Y}^9oNtA$bh_&rTahIuj+m8Z3*cY zHwgO2az7oLHlfzNf3~PL_FL}-KM&q>Dt6bSr>3-RKYMk?dt;wp&<Wp4z`WAmyTz%8 zTg)qWywfuaAC5^M-st6qzLQ6medM9Um34Z4k#Hb-DDK2&x%YZL^;_mGW53)|GI#5U z0q5>I{_u(Wo7DN><5~T3>i+ccH{EdGKFfVmVsPJue|*?@(}qJABgSTZGkC+%ocfJ^ ze)N%3DX)a~Jo+HMk;rmCFFZV>YgEGnUP&RpZQXZA<Ik#oR&%y@y~@^?d*=P<JsWo8 z9_XOI_w=n<y(T<&YD?#3-4Dj?PWW<7N|)&$kAKAX_7ycEH^(=fgYN;b+`9|w9shOk z$a)8!DmA*w;U2F|`z(I)<_{MAv@Y<Wyx7~bG0y&)<whKgSW@euW-oVI^2|qvCzQ#m zuz!KCYg^?rX<v;_Z#!u8oA?F?+LFKbg&yhiCY{Q?(j&e?=hp9L#cr&)cEyru=Nb<_ z{a~Q0(-O#xX1S^nod>i&w)oTXk8e4e6aL!f<27IHdiu56pS|7c&yBAoJi8e8Ftgm3 z!}429U3&ZFQ<Hmj>~eeGy`xjN-?Q}T3Ek7Y{2uvucb`aHEK`T#?RR3r_>k$Jf4B69 z{g2OI_{q9)OB<~$<#RrC=FIT=cf3>!<M#e67j~`YveZTszEApQ@cNmZ1~+=_*1^+0 zoBB*CpUeH;yLh5G#yD$PZgq6YU&ck$9zAABqxH1|r|<h_WW5W6x2^f4-fuJBdM;{J z0`$+H;w`m%`CU<!N?ko%b*Nf;Z~xbuFZyg^=c~yHak=g8{AkWu)JF=-Jyv?znY<r% z-&eiGs>&bbv}#zZ$&M38qQ}-AQ>s(YoN@U-E47;C7M6W0bjZ3_KJRD^EBNZM`(E67 zwDWt@cJ=A_{M|$PU8sH%wz&kx?*86GLVMS(TIygc_3p{%>zp0Z>WPqfFVr71I`r!k zCpwKjODB-xS#HU3H8{wB>9L9(r@pJ6++A<n+jn+evbX=5{j+|1{OX(e3osvKxf1JN z@AX3Ls+a#&rTTZ@%>Az8(ncG89I-R$g%6(Ivu{*`(20t!a6!CdQXe?obIK>jk9Rn7 zG=1&6+h!*JR^!f<@0^|9J8j&X(R`wg<=R!8b2+_t_42_x8-2O4MDOiw@1DP?%K4C5 zLzf@uJFIHNn;6%z+;8!X(oZ}%uzb@GDt$kH@k^cFi1})3`_KQiV(7-XBfcB@a~q|8 zVYz3|&#Kz%1;2O4cBp-+AnMTOc88i&uDRpu<EO_hD^suZQP`^B`jozRItAT+ctY@> zTkqIA;84TO0X3suc&GQ8{K-%L{Laj?p|w_FT*q>*9WR!BB)r@<ua&oLI{in>ihE)n zkM9-Nu5+E`hxd+n?eQ42bBu}ny?<RW_Q}|#)7Df@exp?SQ#0GQxtv_8^qBEOMoxco z_Mk1JFXPU8mRooKFZFk<jEY+yGw+25KIj+lNkPe8eP&hp^M`{6hHP%y26<S>atZHm z$c-p7rD<kz$$V?Ie~0KbrK1kM6BW~`%Tv>a*IR?R+qW#2;XmL+ev|Es&S$**b=BkZ zho3qhu&Ln31!Xpe{4}c5j?Dw{U7`k*zEz>UR}YAp`|^T6d(WF(Z*9i;pwV?&|N20s z%A@xVIG)w#JA4C$<r>Bv+V$h=KicPaP2Jw*()2BDKmTL*yD5opoC>@g`@`kWq4zsk z?p)sNg^`_V#`Su6#e(14W&Y_k|BcCS-4#)(Lv-JmwH;nRkM?#4#rtPYiBHE)N!}25 zddcahD&3X*dxeK?e`4q5UhCTCX6)VHU<KM6%We4R#Ogagd@}tO-xRMGkG=KOl&??i zEwgyl&zpNa-ytHS_de(W%k`aEF=5s7pT~9G(Q;s^D>dJ0?>GLL#=+~)`<%juCQ6il zm%k~b&OufM-8BHOTnxpzhnxX)Rxnks?d1%}#nJAhkpu9uCcpDOAQ{Jsa&ee`Kx#%p zT3%w3n@G-0<d;mEr(8#9IoSyV_%=rTKLM9S-f$rC+4vaD4TfT0aoIfKI&xIBe5B;A zD^Vu2+}4BXJ(U{^#I8e>baLvD0m->3d_LqR2dYEAIf3#LF?K<r9x1>%Hz!n+|I94f zyS&MP=Hw=(r4BZM4#7L|{&W{_j(@{Z9osh=&?hw`F>_>&fA>^0x>hX*-~a))s8%hT zw`|_3Q_HrknztN~hn4aH2q`fs`DTQafPGwqSWHj@B2p8wGjlSNbNzd#=H$hv`N!nu zC8lN$Xx*}P>jBv1P0z#euKWSLg9hNb+O(Vj5ix+R+BR>~sd<|=?OJs*7GXp}Htq{e zO;7qqW66n6`$xlvZeXK3J1HX}|DTR(1kOq&U!O|5?WTQQ?sXX}cQ9Ew$!_hqq5i-$ z+2q`GzNFby*9`@mjMt%au~>1Vy$p3??lN~b&YRZ`Qq$8>26&D7hSNF(=P^tm|3p$p z7D=i*mg})rPP_MaYTK!Y{GscAG}jq7GuL8Sag8!vOz@AUJLlh|`{t={Zjo4StR}B# z5arYde5U{^@sAd4R*@{bo59U1*rflJSVsM?#8M=Z>(!BDoT<95uFH&!?Ln>ScXIUY z3poRFMqpBr9-n1&=Xw)K=G-01KcO2qFE=#Z9mS0$^hR4;4t>|)h6_!P*KaH>xvjYV zZY+?j9QweZ$&b7G{&o*%+xn4zImEwt)*}9fn%G~rj`+OXOsX1F9@nR9=4%hv70zEL zj~4?>nC`l|c?J8>KUA<-2cerdP1^rXx&C!|pqw)c4_R+cxEN03;~O_SvA9(d6W#1) z>G3qDyvd>G=HA4DNXFe_bPe;(Nh6X*-@ds?ImW~(Gci6Z_2#6_^oz;4x%7g(3Dw=W z{<b0X80_9Gl^l|Wqs`Y>B_1P26ySA@DvAllo^akkaXI=8x?RiEz|AT*8u46Lpw8?T zvIp+W-aNyLP7|M%x#4tTfo8;Y)ol?YE6ae?K!(6*UB7j479)S6=;ox)wA|cQH#2Rv zLf??~!A7NDS5+3N1!V5}ZKt#3_0s?Kj1`NdNi-uXZ!mU5ZlpJJrjJLVH#2$YWt-*X zWo6-QoSRb>=phQNj@_V!<mBhzau<`df5N7urKV#Q-9&Li2{z3wITyF<6t|S~xBJN) zzD?02&s_q4J0!ac@mNy5IUy!w<-4x05S{w1r;WCP-$2Uv+6Gf-f2U5J$-#QIotD27 zL=jtH)WWf@aI<Wm37gF6O>KJ#bWi9FmZ8}PwR?;ks8d^ibNB_q8%&s<B;J(TO~(E< zE}OhQ?JuG$JaTugR^A-V!z8e<a=0tv<_*ux_MPkISuG6tQZsL`vfV2Uc7?lhf8A!3 zR&cH}Wko98G-8K=pc*S~pYpmB%<07!8ENDG1`E{e7~0MH<|rwh1G&Cg$X}NzPAK4d zgzL(0kwBAkhot3a-L$|EK0XLylIGUQo7W<tSk7I<e=dra%~Lbn+ImCkkeo|z249~! zE!2C{zQFY;s56k8cw{6Q2OHvtxED|UP9Zsyl$<&$$-Nf+cS0#fq0!Sg&xib-(A;T~ zHTLT%>td3WmXL@Ge6OqKiU}=?KWlbfp}8}dmBULLIA*FY;2(|!;@gfrd<WtT@D5=5 zS61y5WT}Q;HrG^;r6vLSvfLCwmI^Lmb76ukbp{Bp2Ozxjf-Ke7+vWxcveYIZyb1xi zErKjnqNGxN5qeowN|2>|f%-95S&*e_0mU=tFUV5OfCe$wN|2@Q1#&UhRgk43fgWTo zMv$cj0S#m>QIMsE0}Ws<PmrY^1?tb-L_wB%7U%)yW(l&?BA~&{Efs`#Z?W?mBgj$( zhMQox6^2`FxNq=Y#`|1Wrv+K+4pd?y$I)1jrCI?EWv-ndOLYZGWiC{ZrDA|mnCm0R zQi(uAm`f34sXU-$=JEwuY9de)bCU&Gsv_Ri)9I@s$Wjr8>t(nn4EL1b78!1-;SS&( zyq%oiLxL<d2Jgpdu0W8bX5ihm4_I!tAWQ858pi3{C&*GS<2<UCTOtT@hTCVjV7z;^ zi^B^OWT|fqciM3C@J`ikmRlgmQgkg%8pnHBkflxmWit1@AWPAeIT_4Rb0P#C2TEtI zvLH+OqY>#i0t8vAyWt`YN1xNvas`H)hjZO~bovBYY82jw(cBn8mRexAMTXmn_fkIO zXZHxQ)Ju40M05WVWT~TuJ7%~=I5)kQpIs`*Qhs><LUYvw;aQ-MSnil0OZC9}5}Jz= zWT{-kjWS#sY}P)0HcODDzB1ei!};Jn11(ohkfrtkeaz3&6#;}`!|+~!=E4M_&Vlx` z+-X5*A2`RaxfDT=1NubE39?jke_Zy-b=g{wrM>{ta>oT(s%~AIYaqx{v4*4D7wHL0 zHLb7I0id#~r69y>xYLFk6M%PnSgt^jrFH=g_o8R_3bNE;pls&85QOl6@|im=$WlK8 zjbiRML6$1j0G}&i&Jtv)sz4){t0@Tm2T&e!O$Ax16HqR5_Xx7o{XjX)^%P{O{y+~g z=MrQo3+J?T-fk6Ssh)<5He9~p9yZ)I!|iZ$4VC(o%W8)pOL;X?Y7EDFiy%u?0D71? zKS7qN2{fL$I)YF~K#wxlQjn$Y0UF0#pdh3fsDQa>L6&j>jb$!Dkfkz#9$_v=kfp`~ zO<-=kAlQh;c0K|GS*l|br9R`lbrxi)e4vT^?8AaA^_!8qYUBc%+Rru=1Um^dl*8L6 z2>o<3yr<9Ml@esBG$1XPB?$d=bJ${j)?bjNUNziW!}+wZ<;n@Nlut|8Q+~FbAWID} z+#tiP2TEtTO@dG^t!yqp5NsV#2FooH1Y2x4)mr<a4FYAdTwg(!nh8YXpR#I>AWNw> zwp>X;7}K;x+vjJu2*TK+oy{c*LLGHLyJWe}f-H5}a90eM+|iaBD#%i^4L8qllRBYI zb9hq(S?W`u$(-iT1zGAi(6h{)6lAHNfTlC|iy%vR-=)+v=1L2K9S54qTs1+KY5?>! zbBzR9sy)zC%-to(Qr&=P)L2$^7lbh((38v!5M-%Tpc%}i3$oNhK+iDuh#>U)Ku<6? zTacxe1I=V^l^{!Pz1uFAw*{g7cDA`Xf>7s%>ub2>hFfJguY2rgZxLjvB*Uc|Znoj( z8E#)7Y#rCp0YT8yu1Y<}X$}yCelW<EixOn1DZ#Lv{OnXgu-S$?ZMfhN*j<(j6NE7) z&@7H)f*?z^4YlPu3bIr{H`sB0wxJ;Cn&IXd?lRCwmb)SdbAvFOn<B_kr-4SX+!;ZZ zni_6%GXz=cJWxK%T@qxe3HRIFBte!c*&Y1?%lQa`JuuuL!>tDz&2pOr!N&HmxdcHd zQ^QSla}nqR_}Qs~&@K&k#c+dqqF-RSL_wB1V7NnuYZ?hV&T=gUVVr2V!-lICWy{qP zWT~Y<WBJ(?f-Kd!m(6t%WT_QE1uVB(5b8JD<~j<(ybNd@%bgbl-H5Td34+k)#iB1` zIX^*`dckln8ScE{E*b7v9QsCn_8UPc=iW9qRS@i?;kFn~^|9qj3PStni$0IT3lN0x z3^&zqmw+B)xyyoJcl+5~q9DWzG?C@D2(r}R2W&1`5aw@&TWYwr{n6*~vmFIlYNz4$ z7_Q?0^c5`ESrGbA!|gL%>_FHsmg_6XQYQ@et>M}}Xv=jJgtqE}ZRckj3bNE{!>u=5 z)F9YcmWvf+sY8Z4YPhoTw%l!kplgQfVz~8#VaGYVO@dHI2{soX2=)Nz5X(&wgud2r zDpC8w?gAZVxxRudb=7cQN!r&^T?Ca?!G_xh^f^C!KoG|0$u^fF2<;N+2+JK31iLZB z<^~Bu|CXZEQI@MF2yM`CD-72%RjDsnuB{+Ty=l023|C>OE$1i5;z7<+{A|f#=p}(r zR)Wf^DTdo(xNU|zZ@5c_i%LiT%i+ZevQ(K2n=3B}_P}r*4R;_D{VG3uNRXwXvTQC^ z5Xt~(D$A`9WT{JryKK0`;YxkUaw&o=b!WECH4$W~aKl9yF41r)hAWBAayp0SBM9>a zpxItDj_4`KQvHDDFgH*T^Z;lDb18zbmI1V!xqLxb%K&<XxygboH4A7NbI%Jx82~M1 zZiOIAy$-a5xvhdQ-vas<b9)6@>Il$c=DrdHTMV>_x$}ac_dqW*=as9GrEUd!iMfh` zEL8_+A#?QwS*j(_0_NHZvQ!|@i_C=xvQ#wC3(WNvWT^z8`OFOwgn2j6Jm&DBQbv|~ z4Cs00o)BcI=YZxiH&>9QmH@3{Zn+>!Z3lXlx%UNO4FG5*bH@Z(>OBlzbe-=KgmyW? z=Bf$8nwH^04L8hinTA_nxJ8EBG#X=I)~hXoEcNafoBKcz#>IyF#c&-Tw&gkt!uSAa z28VY=5bO&&ea#ILgfcbUD8ror`ih@DF9<eqtj+ZmWU2K)$5?KYAhgv2n~N1>sbfIL zS?(J_2ydLt^%Vr02=q0}9TJ3bCpvx2MG3Oh4xke(w^I=8{dk)T5QK3A&^IhMK@jTK zaK{YSd4f_WS+0v9OU*Of0>fPaI>mC-trNnSP*7Pl$#5kn;{A4(^AUt{Hryz~Z8F>z z!$m!=)M<V;RuKAq!!0#jtx32ei{<<USt`qLxrW;bG>7H(2*UW_3Bw6O|BH@W%N-Sj zF)%vS@A=tFf-Dt=?m=@s1i=mg{lIc71X*nCHCOU!?TfJw&>5CX6oj#l;kFpA8ajZp zELTgAr8XMw4a4m-+yTQyO~oBq{A{csl%L_28m{CtrG8{NA3>P=8E$~#HUXVyxh;Y$ zRSw2La}@+(odM_q%Vi0|m=z6LbAE!LlR!VQ+yp@=D>O>Yl@w&D6rhVNmnH~v7sH(~ zT+~c`mu6WND+uk#aEA=n`8lP2=J2`*LOU|tPQx{wg}W$NuB9N11q?UEaHoNOWw|qg z&=zLf+$2F*Yk^W-W;uUBSbsL$_l8q*ZMl+yur3Pp8$WwMkfl02Z*zAGg3U2ptl>5R z{m##B5d@nv&*u6H!Wd*e?nGp{j)E{BG~5isod>$Ya+d_bHoahTQGzh<0lLa^s|8_= z=S7=aB*;?V8}6LpN-nVFd<3B`f&S$14hcfvxX|W?2*N&u;R+0Q1?U<-t6tIwdMc=_ z$}-$hAmv5lmt%sEx0h`$N|2?t0HGovw@naqXpznB6ohfkV)V%@mm<hg3xU>f9E$~E zjpARnT&f`KTN!Sa;r1KuQ^TDx+<C)YS%PeE9BQdXs1HG9)oR1-Fx*bVr7gpqGyH6p zAWPML#pdb?f(<iVqT#A7$9-}9Y%M|1A;ZluT(uQSmDF;AAZNH4hHJPI_rS4SQ$bjR z0$R&lx*+VG0Ig$gj37&m2YQ3K#|2?s3TQKPvjtgdG0^MGEfZv^4M3Zi+bqaZ?*naQ zZnq%x6+j!9J1WRh-vPbG+*v`E`W=YwyDh8!6a-uHs-3qff-pxk+<L<uTZO$~e)bzd zu!*Z}E=>^DEY~Pin&mnRLO%$!mAPC&7~2}T^G5E>TI@Nq+<8G*J6xyKo6I#5g!M@v zEq787=DO=`uAv~b!PjtqE<al!$WpHXy~W(?f-LpK23zhaL70mhZlB=-HerOp&o&f< zvNGIy!}Wa~Wz2E|1flOX+$F<}+KjO`x63htuwG}l(}o-H2FC3yH%JiX0fzJ1qJ3d^ z1)=XT+(^TXHr!Oh%`jY-t(Y%x9KnLHmjJYl^D$l!=5$8xvXPtjCgvaf>;gfkkGE{D zp&;lz5E-wsYPKLtRoiBBwFE&YfndBKH$@Qi>TR3rEC_lJ1mgv{qk=FVddKE^2*Q{K z2u2BVTLfWjvEAkd2txk`1d|211A?$;y+f(Dy@;zK2xCzoEw?}r#`5ptPF<E8BnV?$ z!yPkR=l3v2<T$zr!rZ`cR}5F-eOt~?5c(}37(=9Gksy@IPMhm22s#M_V+gtRg0Qyv zfz2fdg1s`_7{i?gf`P=dX9QucyUXUD7lb$rx8896yKzqwmqCCa$Qf?E;kxWm>Q<Hu z7KC{t&^ydMA;?mn7`e}kT+<KjXIl!wn(toRo5j!i2(r{4AKBbBK^W`pv$+X^EZ#J& zz|WREfE&<(pyPtds>_B;{1j(cST02n`d`CsGo0UNIK#qn)day#8ZOOn+kh&u+zvr# z3x{m3mLS+pAU~GN6@)(Ca61iG>oD%9WI2C9uwjPVXSg1pD^-Q%q6ArL^AVeSQxN(O z!<{wU-A8S?`vk#87;e1bJ~rGz!_i`xj<=*B%u~Knsw$^tg&>TnkJ;QAL8zmzm8!;a zB?Y11H(a9OHUU*<xh;awK2F$NXF-<Q22_LPb_haRzOlI#f?zjJDpga5CkXS}Z*49> z5Nye5rE0O<06~bua61gw_dBI(YdJyKGX&bs+#Eru^Y3lBTtTpjKj4mImYX67cEfO2 z4A=Jz?g-Rz2tqy#x5aQ3&MM{4a(;p^7ByU!;dTJkWx1V#Fh)OTa~%a?y&b3?%S{!8 zKHhNW4Hx{QQuSFbOc3m(;f@(D?L6*+XSpmvXm3D2Gq+8UrFH|IWbPwDmiip%FmqoD zf<6O%&fHl+C_kVb%v}+LJ<SV9UkS2*r3G24GEhC{stdxJB~V@Fnh3(#1t5Rs?h%Bu zI6!rnixgz3fk3x27cU5V`9QUq%MoO$aX_`0drT0<<3Kf;n<WTiN1z(aEfa+KIZ$=x z-VkJ|4}hvM_n{!HI|5Z@?kho-Itx^VxeJ0Ubq%O8bKaO56T*2UAV20R3$j#wpi0c$ zDacaofGRTANf7pWfqa?kE(mM1Koyu9D9BR7fNo<hQ;?+|2D+8Gae^%M3{ZLIo)v^S z4p2Gf77Mb}I-s)5Z4`ucJs|qNLs|8KAWMA)<ip$%LC_(f(#)L|gnkC76m!=ES*rX+ zjH#LP6@>Lzppwkh7ld<oK;F!?6J)6%pc2e=6J)74ATQ?n39{4>AjRA;K{&qwbdB}- zVL_I966jCno)KiJ`9N2hTPVm<tAMUBw@#3y-Uj-ExpxJjPX_v(xz7Yy>Lk!_%zY=w zQojOSX6_F`*mJmq^$6z53&K7-&@ar@5ri|EK$n<nCCF0u0bOJ+NRXv^0sX{WoFL4_ zfi5sNL=e{WfzC6RFUV4l1O3R{lY%TY2k0Dg^9A9&0MJ?HRtds+0iZL?y)DR69|8Tq z+$VxCPXYR#xs!q{brI-0=6)4qsat-=8Y6RM1mV0C(6`Lh6lAGJK&O~%Cdg8E1AW8X zeS&bN66geTy#!(W2lO>_34(BT73er~d4e!s1v<vu<ATsf0e!{X96?yW2l|q^<$|!+ z0rUlPTLr;B107}VBSARl26TkE<AN;pBhVq{E(*d~t6y-=h`Cz?S*jAyr_5CqggGM6 zLFO6>!nzdD0p{)&ggqsoPne4kgmYv-`<ZhIvQ#?I$IJ~EgmDhgKIX;?veY!7kC>Y& z2xmxv_A<9b5aygfA2Rp4Ak5=|_As|w5YF5I?Pl%^L6-UfXcu!o3c}nE=mX}we$~iQ zw*l>Bu96^}9RzxxxdwtP)duK2<~j(nR0z<!%!LcGR39LV?Mr__m@fbYFgHe!r9S-K z?x#N%1e<8MYldt7hb`Ay5c)jB<rwZw!@Xm;vxd81xW-rP@R|#P4Kv(2!yPr;F~gO= zYCr2M2<MRucbDNpfXeb*C|nS9!^jOca$|tXv0Q;5tZ^H;rABTYP<fWyC<y(pk^9QX zeGhai%bgR1c_<bg^?0a?AWLN%ZiM018E&KDE*b8!;p$$q!)qW2>#@p9;^->~Woo!} zhV#Lqo=!_SLFnTR*U4~?817NS?KIpT!&SgSpAOGY5Y9y!F3@m~817NSeP_6{hHHey zKOJ5(K^OxYZj0f*Gu&Cjg_g9Ry<ZT<7KVG)aEA@|h2i|MNEpEFC_oVAeuhgk+%m(h zG~D-wJ7>5UEV$|L`UtYrBZhm_a4QYB#&Bm0ciwQ-u`s8@t1SrcDj05};Z_=Mjo~gC z?y})(V-Ze=S67gwk_|W1aL*cUmf;Q<?vUXsV6jez=O+l~t_>GvxF-zvl;QRoZolFB zV6jez*I$sOmKkoP;Z7Oud&3RG0-k<0QxN)n!@X^|u2}TZa-o9geFK}DZMf=K7}0XI z1);As+~bDx!NQ1^D<=qjl;K>4n`pSnhFfE}*9>>maK{YS9g8J8jz~d>!*DLc<r;33 z;bNP5sRpd$eFa%+I#6To7oHP@ISEiB=9URU8w6^|+!jF?Pd2l|`%Dn*T63ElAqf4Y z;dUFYRtsCsUl8_n4L8bg!L7X19h~McLFlJj+uRaC*xNDOA;aC##+GX=2z`a&?lN4I z;bIN9shyX)ljGeY2>RUK=E4MFo($BG<<1Mj8bAk|%N2xud!R-v_l+Rz3w5-)C_(6_ z4L8Pc=YbmYvzG*6ucMRA%@Bk=(!0D=6PEK6g!LxF?KIqkyS)@D5&h#NL0D_)Y;&Cj zVNL5EFNKPQTrELZKQ-I}!_~UiOQB*R=PwBLVYowvOS{iYp<*GIB?$ZHhTCJfhF!c= zOO|UY2<IaVx5;qj0=*QJ0^wB<gfw@xxmtptyFp$GN&&eof>2h$Hs>b@_8tfd0J$_l zShq0THpBUac&WB5S4|MsUksOJxE(-H9)!135cY6GZO&g1^d1Px1G!Oxu%2zW1BPqZ z%}YUfAlFn7_K6KQ$#6%3peT?#CJ1ZmVK&!85aKo5D8rorf<och^MbJE5pHwwf)KCa zCK)dHelG<j!?R(6U?U9onc=#2x8*_wVV|>y&7}yk)Qg6D*>L*|cffEJBE1w88S(lF z!um#(%~cizJ83wV;Z_)Kwc(CNdnq&mDnCIuCmmyR^914jg;+0zMgX~Tg7BV5oXxcq zgf+L`UJ8u>avcRh*ZSC8njo}&!;LZAB*RTH+ycWbGF+E_UJ4BeaRdv(_}*|I8}78> z&KPdg16~S^3eS!ag!<@jb18zL;{&}E8XDxX1mWz~gEm)95ZVk78Xx4g34)x<=Bf$8 znNPz78*Via8Y!M#F9_v4$mYrk!WuFV8YJWr1!2wHaQh6`Bi>7)@j)(15bS~BwivGC zU@wJ+2D#3HU}Ft8!*KoyUJ8v0ash%+Z-yIVIG;o>g$4w<a)Qv_3^&SfC6l}q8W7}s z1Yxhka1#u783+vsa#sYQ43cdwQ4s6~5E>Qa4hX`U(GZ(kC<u1faC;1QKE+F+QQ_H3 zf?zjNZLWtP>}3H(u-qa+u)9NTu9hII%LDafxfO!YhYqv3FhN*D213I{yvGFLyg(ZI zG9GW#6=bRE>9$;LK}etBdKj)@hL=KPMtDsHVI3*c=JEwW4-B`(a21Aosb2i7pCIfh z8Sb*-+Gg8w9R)$3^SzWG&;5c0!EOM>GdE8V;sqMa+!jGtvjj?D?uZ~u{Q{K8-0y<W zjvn$-Nz7Ff1p5M%%v?u7Sa$>(!dyQ=7@Gm5FgHRFbQ~y^xfz161~uACO=GT?Ahdm; znapJg!rBthbIi>VgtiYfi@9xraONFoHgn$!!usi0FEx+3c7pK!G|&so#R$S0GSEvU zsV*}G(YZ)3wSwhh1z{f%e<!QTl^-pYS>@`dHA809I$u3t@_i2w|Mx%tLa)*f7}dV* zfMB}p)O-b|c~;_J_0t6}oQ%Og{tv;^U*>22CSORIzgdF+{O|w%TLS;TD}ic-aty;x z8zBGv6<Y!wi)F8$yxHM3y#AyV`{d0Iuh>X#B6;m^{;&b)UGkPvrG3iCgI3vc<!`;M zf^Wr2ewC|KtyaB8&04i@uj600UVSa_Kls~Op%!!t{!t%CKk9AhAN_5&uu}53?T0_v zk9d-?U5Z%uRwUtmeq>5gHjOu&zX1GU$LZw%Q|yd~p5eRc91phzzM0{tC1r5v=}EY0 zDj~;(&k*Dgk&_aios{Sr5ucXB?~St%{`U?3Ipd#-zq{a{{YwOJ`iJ3fAKUZ)0oR!~ z$_{SID^y3G`6v7GznOp1Tjwv!`3ErBlN(8or+)s^;X?rn<$%&(p%C-;{_spc>3?o| zmZ?Lh-c!ii@Gpvh{AR#)>Oii?-+l4-jg+rM^M8%w%qu18KPj&+j@19RytI9_i{wV_ zL2>$PhfVIy4*#F-fAFO}XYy~lefp=vPmjk9*T_O{<}mI_M<F-W962I;<^0>>^^ZVL z`){X<%E7Kn=2|1oNicjKziLo0r+wW7e`oqV+j9#1o%XJyhrCDd|IhzPV@~HUDJ>~I z37;*sxs1GYmy=6QO-f6|mpN_!N#07ewEut`i@%*VxC{A#`@i+)nKaM#NBZH^m%p12 zPy3gXlte==^J@#_EHC5n9|F(t?KU$wFPTHY2UIe0k~6c@B|N@SwohteE*b(|HcF|< z!R7IGs%S6F8K$4d-<J@MGrc?Ux3j%X!r%V*Xa9l$obopRU$^)YpgElLmw<VVzTH}n zWn$s!EYBO&PiI{J3HG$ttWU1Q_}qB?bVE2!d;Fh->6CHm9`WvwwG`#|W`=LK7acmj zBM;y#Uz`6=UC;D;+7l`tpZ_$lV&wi`3_me1Jw0FYO6Bj=u^TO~Vv6wJQqH(Zkm}Df zeNO%OKb<~L{k_@!3Htx8_@-~~c>IqB1^7D>A7RfXQvME&PftzD7XtqJ??O_zU)LE3 z!pU?7g1?iUftbHN0s-F;4Zzucd_4X>4H>8ZPLIErdi*`f<L?xYzr#HK#-IQF{U0m= zACI_cP7sE1OhkOnF!Hk7>fp@W+{|?H2}vA+MbF$!7UMsXn9%{H{(tPf4}6?gb>}^j zrFd-186`0wLIML(U?2_%Vp@e57_ovr1_J^N2ogYPoK$QAh<Fr4u^pLF$V|qfZr8i( zw(zc7QtB?<CGFCn&=h0{v1qfc1GIH%ch}qH-SzC`-KM2)<MyTX`~97J?=#Oc^T>8m zx_x(F^s(nT_uPBWJ@?#m&pr3gbDs~gV)Oo;xwEBD7CDN6C?*i6(Z6JPsUtks5gzRb zpN3W{e@A$daMHgf_`|<{L<w~2-`tyTxrH_8+(-R$g2tM7X`8_#fXO_yj_^*x$?-(v zUouSaf9b!@x_EiT67q73!#@6+P-!1;;UL=y)&eGciofr8a4!WVd0glS@9YSVcZ3Q4 z@b4c{0?EE5Hf+9o+l`g?f5@$4-njD)KihRoR(K@aTlTe+hD-Sm^V{iP-hT70+1prd z*;V<_?R>2xcgt-z&%F&e?9=U<{qfu1rmtIjcBXH<<K|?Arr*X0s9|pG_S<j7iN2#F ztT}!d8%4tAYZEtW`fq=?-F!>seLv18uK3EQ5XkGs58iZh?j}Br`=JlA66BJ(aWzr! zx#MS9T)5p0%`^DXAF^<g6{EaFsmbwe=FRwcL%vWR<Ajs#l_y+mN9Pvan2wJKC*w<m zlkJ=D2oJIVG_|cwaES&=@-t0%v>k2l?Iy$DWjyC!{C9{zGM>YCsr8ZLq@0gaySqpA z&e9M6ekg$-O5n*$;G&K!?DxHi)lPi+pS*eJJD9H~1Ef8||D-)wAe^)>9prxC!A|?X z3wyrvjUT!r*!ww39Q=EfnzThCGZPHBr&;2etiMN}_oI{kEIIGs|3^H9X`V^?QAfDc z5%$^sKlA9^4{+ae;+s4g&34^<Q|wrHj%ywDk?kM;pIDnteG2>r7XH5cbhh_D^m@~6 z>`#h!opI3LKeqmK%2(e9mQQ8O@gw<e3W2Ba?3Aw^U`o(Y{Z+<O{p+M(hR`$k&l?T= z4jDAT?=uaW<o8m8ruco9LDT$RW{_Isa)ajheYQdK{65E^8oxz@4)FV2gAVcgJcADN zdxb$q_*D<-$=%2Al?E;G`+S3z`F(*wEBuxWI?nG44LZT^iwru+?^On!;&-z_kMn!A zL8tkBu|aaqUSg0|3P%hY1k!}F$8IxXG6_@!rzxd-+i#0OBj8?ckXCJe#Go?Jj~WyK zjT)r)6RtIA66h5MO#xkJkUYSx2F(Dy(x5q@R~a-9^lF1@KxKmt0F4<WZ}K$;9R~U* z1|0z!H|Rc~*BZ10^g4r<fqu-O6`;tV<3Mt8d+cV1*Bf*a+#3u!1+?9u$ANH<Np~9P zO$KQ(9+w-OZef`)NO!}$#UR~c^Hzh3KyNchZ<g*bXawl(25Hrd!5AuKpm!P+0Zke- z0rW0|CV}2<&=k=12FU}z!JrwS_ZTz>^j?GJf!=3O4QR@s13*=S4goC~bQtI^gN^`w z!l3(r?lx!%=pKWXfocY=0M!jT4%9H{1kiqiP6EmI=*gV|y4aw{fi5xVG?3n~K#Xhn zW{5#~pnqwQ<{XC%8Up$`gNi^uZ%_&7XAK$!`m{k2klwK1oe!XYYS0YOZ3fK&X@1y~ zn+N)UK?i_7YS1B|pET$&kY>d_xg$UyGUz@a8M7Yy!k<R+p4>7xjq5$R6`+q8bR1~T zpc6nd2Au@@utBGQZa3(0pj`&Zt@@Zjd7#|}4Fc^kXb5PpK}DcD4JrZ68#Ds6&!ADD zj~i45`ez13KnD$)0Qwn&CV`yPrh$IZa5F&v%Ah%*!v@U*{enSDK%X&aIZn3{r#l{} z%lEq*4|{ThK)+-;hJZe6P!Z^t4VnZxV$c-OuNX89^sfz?0s5Rlhk<^=pd&!j2I<>@ z?>A@(=%)=@2Kp(3R)7u|bR1~Wpc6o!H0UJIPJ>PX-DJ??KsOtdUyF4_8?pC5R~s}9 z^m2oa0R4zTr+{8<&}pDo8I;dsuM8Rj+Un8)m0j#Q?2C&9`Z0rQK-&z`*8$&R&?%s| z8kAp;6)-3QdZ$6tKtEy75uj;<^cBGm8FUKhg9e=j`hY?C4d}f~2Q=ew1L(LxLqH!j zs01`;&?wMHT)K_uq>BZbH)tAYpFuUCy9`<Z`h-EJfbKD<bRky2pa|$+8dL*1WY7_y zPZ@Ly=+g$}3uvN2LqNY^Pz~ra2CV>n&Y%-O|JopZv+!38It_Hhp!^^j<{%8tuNo8q z{X2sufqvbfX`o+o=`crMFsKCdn=TgUL4#^Q-#2Il=x+@g!fci3xr}~5FED5n==lak zKvx<x2{dfbG|&|W9ood`Y|s+W8w^?jdc8rTPh)g3XcB1BphH0KGH40tJqDcydapr4 zPp5qingsfQL32R63|a!J7<2;YCk+~U2CZt)DA1h-%>l_8^0pe#T?QQiS}<s6i1syT z6sTcP1ayx<OF;V#Isx?S1`RzEiMv>!FB`N1^jj_+kiLt`XaMw^2Au}_l0o@Pxl`C6 zeN%DCpc2p*4O)5@H{lvIdKq^r859BizCn{f-!^C(=vxNO0e#b;8qlK#9RiY##<m0f zo<XCyXn$zXG|>NP&>YZr4XOeC7lRG~{i#d$9B#HUXa(rc4LSiNt4`g3{>-4$K>x#_ ze35&(3>pG@%%Bob%b-!9|8CIAbGakTpwmEqZBYJs+)ZZC9MInwRJ#HX6x&O?0X@^8 zBS1q2Edf2lpcSB}8*~Cl-<pL#piKsy2D-$c{4k@lK|?_LIxRX5G-%K$P{E)G=t6@g zfi@a64K!fT9MA@XYC!7^T6qB;vO%YTt}rNH!rwJ$4rth*LqKmb=me0yXN!LY^bUhY zUx+0%XcFi>22BIqV9*@U^#%>Si2h+v1ay-@lR!Ui&<fB_gH8dx-=NY}cnStZK>9vz zPp$@ZyFo{Q>IN+V)eO>C1n)5@0y=0=4d|a6bOh+<3_1n$^9I$o59i+*RUa!yi@S%5 z59D*G_app$?{kgq!xN41;fca;E!W3~hXIEhr=!Lr(IOq)eaa!%I2KhOD!=b*%HjUD zL$J7=3`0?U$M9ej=ubHM18w>d1x!W9#)pd{w|#MZc*~ar3O{{HxCk=E>h9q!xyl6; zzom6s#G|MLGf_RtCqwPP98rT7b*wyuZG_-B1&L}@w`3M51`6;{#z2R3WK!Uo<*2K+ zkyUphS=~qC3XZ6la@25K`@jU{ArDs@i$7MDh#`O1^6YmI-bjktBZ1z&#|C@g$l7Ep z>3y3-js3$#MKo{^cwF;PR9_g*8)m`B1O`I5Oe2gBmk{*GVe;_YX?YQBDL4D<?Tbe0 zOEOUpTtJL5TV1)JDd$kl68(BlC^v4F(TMD$xyluKMuW4@8e5VKy>6(|qn7rr<w{(_ zAE^X2h%ceHx%b>96c(Cfi5feGqc&CQOjpQNAGF6y3wJLo%}ov)Ei&L^6z*Rj2}8re zK0Tr}N6(y$7IzHqOw|Sc`kQx?n`-RLRbHq^Z{>MGDDsLQz?%vzuSJq0P5C{|H}d1^ zeCu-V*g~J&J9<=ZOfxwIad23eRAJTAJ(Q-qMB|LAQwdi44w1Ol(|m%=aiph8`WV-f zf$Pn{tx4d<<R`DjQJ?CcEYvt^IELzDeSsNN08V3kKHz)P_<?|5lg1A=FHaVd;_e*s zY9^|WJd<2(Y932QJ{hY2ESWJ)b*NQ2wlMr%66jAYDLB=Vs7-I{ZDUI~Y`I28ywn6$ z8p&1G(d$Q=|D1HKXQxQClk~RMU9;SpZT`jg&zzCnC`FBlqF8F%jS@Dh2#sJjl<HWy zBuvPG{prjx(v@R0&hape!&$bG!^)UVx#khq;rBfxYxKUa6>u8P=P#f9>#;zu{jTA+ zFOKXNbOHa@hSB4ZN5+v$YUtSa*gQo#ODM~nu!OFIE%=UB&b#sA!QsOs>)*Tfn&qbM zAI9K~gUGekQ{nM58qCHU3zq0wz{29+P`BtN!06Ux29Ev1>Wk5um8fx46elF%iRx%> z_M(J{i5P7aIuOn%&h|HdStQA3%{Zz-;i{w2nH7=4j6trE1FWDTmHxur70*D$o350} zf>l>fv+I+}9YtrBWtew1j*9_Znyum(ucP`{-YnVdi?&-r>?XxqC8E4fXCb6ThUnqG ze6IPImfcvxZo8VlRs-PiXfYUaBM)`!agGV{`^4EPweVrXL*ML`!3LS@AX;H~m|ai% z%prhWD=!E@ws<aAS^Mz#@a~>gzaA#ciNgKchj-VaeCu^lkV<uKC|9{E1h+TJNIVP` z0efa*C~)5zFk$#XxY_#KGiMOacy=$?_s~4dyzgrgf979XYuk{yKDDIhQ}*)r`YDg6 zByxrO$A>2|B=5OqSp&lkB`Z>&-aYHZZoBgry-Sk7qC6#umI0i)xqNH(Yz$!U?%vj~ zw0c{=)bhmN5n_7wAb~)<)im^zCf@`3Uxxf=#KKgrV$MJ*SGm;4i9RMQq4FcGb*i<Q zBPE$qk`eEWQIDht+13B$nv#cJ=p36MKGb4!j-RV@ik^(<%f;LKn_2-8SG~K}>M^|c zC2sV)b@`=H!yJR^)}FrI1HP+SmoR7S1m;4^ELMlY{kiJtt1C{R7PxBmClfKIwWG1t znpved93pA$R;RUFt%<kRVAQhGYt2Hn`NdNFRIn6TMaqO7BEb@`gWvhHPf#Bkexx00 zd==tbT8_<b@`dU*(X%$&#mbx8fsK{dv;*raFK-9dRcJn>X&enyo)rS<DhAI*ymB7O zs6izlsweM^4#lolUk{AEyzpgy?pofx!GP;%cyhc33L`XD>CT}5%|6W%6u!KDc*}K1 z_ez9U_p~+<T`GK@T#9)4nxj(s=0%7?WugzLF*>AfbTzDvNHHX*^KEZs+)PFd3#BJc zh`ONGi_Vt-7BZ!}W(3Y})<Z#4UZG9aB`L<}*wT7yuN}-(FuWyGP9n;x@TfGrG~0)( z@P37-Exc>HU_40l^@`b7Tfi$qg77$LAaX9cjBmbk!cX4iIo&bi>zo5+^w%jjSPxQ{ zc(B%t4TAhwFV<|NOnf{z6OPoKX!`B?d82;bWV$<N6{Txya&Hw(b`@83-#cC4YU`cc z0q4h*9V&?4xx@9&N!L3kodHHqod}asb4AiSe;)sT)gsk9ds95UxZ-K4H6`!4RohXS zzYg_%yNAnX?qnrhTK~qL)&`0F=*hv*?2eT}b=cbpSH%|>?z$u(0^`mMltNH!hs^&C z0ko^(&48oi&43GdGvET=47h+d0}2E)AlR9K{^lo=1$0}2H>-cY8B4I<fa>Y>7=pJ` z^@u(*u;+C^;|6WLmC=|)+lSw5{e7HfE9Yh}W2QGx5xKn=Gw=&Kv%(xuKx-XYqV<R? zYJUIkf&-1E#oWvlsy{`NcFk{g7Ts0pwX?GplN6ZihutlQwV{_u5l3g$a{BH8OiyTj z7+UTHLJZ-<?@?2}si*aH@=V}Pip@1Ejia7pk)j`HkgUsDqkb3i7|$8yU!z%Nncj$) z`<p-JLvOMW*Rg5ND|)%T*Hc_sLfhTn)RF*VC`%0GAk5v*hHBJ<7VF|G3XOjD0oj)) z{#wE^xs5A>oZ)%!ZIS+bC}hvO$yQEe6LHsO8z|3-y){Up@kAouXalZN{mm~xJe08< zn(b2-TY0X$HDoa!Y@JNiIEb=IjM62H?cPk6%}kfYRI>)v^S9Kk8)R{w%<$0q#Q9Ut z_8+ScO?52p&|Isnj}_rBPnBd5wMeF?CS9hzQS|7^c<wM_Hnb11*`Uxje7iJKZ+%7$ zVda%ywZi13u`Gp+?s$4P-ZVf1U*6_Jc|qziQ9)nXld|Na#=vml{=OcPZlbL=6)RWh zv9WTQ9_uSl(_>vls=H~RB4=w;Znn4eIW%O`JTz|aZQTr=O*jTH;@4!p+@?230yXyF z(UW}}NJlwRq`@n-vO{}cL0~|&K?887Ynyt6Fm?xmY?`m2MJai(r*gUSLW&IJ+A&<N z^{IY71CUk7&+15o`)LFj!i&jPTD5&7?uo(|HE*K;n>sU;bvDEASc^TGW(e(W)6>r8 z*!7OUxo--IXyE9nJT(}+Mm7b>38k=l%=?!=@ViWYzcR^w&zUnU5G&3q?*+LDLAL(6 zDiEoK(*p5zM1;54_@D2TPP{%@eQfYp-!PRm{nWIjXZQN0>j*bL%a5DVxLJqVuoyMA z4Mx}IcbV1_!p4cWK9#7TjIgDv_t-qJkA~IMtgqfTT-`cctmOG!$D#|f4xo*d3;10> zd!gm`>%6Va;I3=q)O%V(;Lcd;OJ}X!G@HU|=NdFp^`XIJ+tWS6`fK$ux)~xfv!p`G zRz>x+-y^eOjO`Wm%c9k{u<-eI6nRs1Cgkh9xt-bSTt*YE&YOLmH$$<6R+oy_txD@= z`&yH&w+OS*Vb;$M8j(=(SG2BC>~(Fl)%}W=`fBNn%XF!eOxf4J)!%#_1&U4)L3FM| zOBVV|u5WkBgE<!RP<ywll#<6M+EG6Ud8|_Vb5-+0XRBt~U)Lm}2-9w{sA$%vhzyIb zFDz=n(K1od8#Aox(ZZLhI#nxtdEIqKXLnj3PUhP4mb2!ltX+D83VV4nRlIP6%Fxxt z4SNOJ04cTxTK`A$CaPoEGFvTOpH+5UsAWlgAgopI(1e}c7%Pm$2(5H6!vHl>&okk; zy!EWGB0hoV^T1*9TH1|*RvZ1&8zoMif<EngY(fJT`x_$<M9_#Q3j2qr6p`BB(9A%K zIWETSXV5)kL|%PxluGSX57Ht((^5ysxHRXfgr`nRR&skTO3wY8+D24uN2qP39+kqV z|C07{!J6GaW+|$3C5dLSABM603%23HB48S^9meF4IieG#WNEh2@M*;`J<veiSQj;@ z&{apT`Q`)cxaXeubKys>8!PQfv-y77D=?9(+|sVSF;WvliwnaCjWM~ZL6I%bcq1yY zp!X$}Ajv4XNyZ9e(Xfcer@Xn!0Ne{|UP6IdWSn%nKa#!6f~+Gg{6x9J!nbU}WCzPH za2;7ZVkwapf_iK!EPS#ZdRk#&z8!i-VS&qfL(0+0B|gs^z(cpG10+alr}e^}R*^=z zgiEt?cUm^uict^R$pY>sSEV&$MJYu&Y)5E^W|?Y9>jO@EDZ-IE#%V956Q{kDPF!CC zH>MLmi2vZQQl&Jndb+>zG`x|WNhN50npy`YNRRzsUuA{7^`3yX?Uoqb-iER5mNq`# zhOzCIHa^~lVSr7L9~*35M%l4YZS`iv3AIvK(1LA-`uFVqkUCCU^+%wSQhgz;f2Dee z*2q%HgxHP>D!JT0SU5N=WKu%vCWX5`?Co~wnXT(Hm|L^^)!odMJ4+Qp{ZdbwBP_I= z!djpFC9K>q&P9JS&zf*Bc3(#|&db<QAv03#4HKESPT#_fr^&V9qG@$hm%}KVfXd>h z_6;|3ECI+r+c4G#&PMyZN3vn>uyXu1(H#cwShqxJxz;mUPYbAB>$FOErq$Q#wPmW< z$Mxg+zQ-gAXMe}l?BeZvpOf;6^R)f7=0SQcCSiX)Vio(VSd*~XUmZa({phg2d(!rI zG_#F^{T)p!;UFcXv`YxJv!2diOpJCa*6eEb*Cxlo{*HFoU!CePiq$z*dCmT+e)0ja zcr`>AEuPK(j>`UONi5U;j&$2!9eqmJUlnG;l#ayqw`^Q>+TVLA1|jGHZ$soHq(}AC zCXb*zA%3)Q_g|so+B#Rziz;jD9K}i-;?WF4tix-;5Tmo2Wvv-wrj=ocWin%9=Z$F+ z7YuRIU<X4iT-Z=*8{Jq!RPhKYsG=Tg_H-NIb?_Mqr$G`Ha#aHiHOceJ+2>0OaH8{s zVj>-8d7$;aK)xd;@98{m_6pBm-|RC(+BIPqSQwU>Zf#&2T7dqnRC=ev^=P0u#xrh{ zV8_)aPtuMTRZyo3({0B!mZy>lAv>=8u^kt(v%7WK@zL|Q<0GA=3Zee3XSN-;KH4ac zZg(pV?pTWUNo~d+jaVOwjs4HFTo;V}PoP%kYwSl=(YCRdEj`OVp=&{YdwSQl|JJPS z>u-n70$t!;XM4o+vDIDsag~Sv7wIVzGAb7?xcBOf?71;7#DDv3QfRfrywP~SK{Jr; zvK4yl9^Q_X_&FuS#oB%r6G77PT;;-~0_en6C>Uxsm2!u<imlsVaU8+rTCX8z)S2^T ztLJ=~DrY%0IdQ}GCPur^lAk@_maIO+9Oae+@UZ${&jn}s>s@m}UuJZFXfxX%IiHho z$b1?RNl~X+isjd&vUfd|)n`E5{`ht=sy4}0ii{|o4a-cP$*R`jUf=q+nN9CgR9+M} zd(pZC1*#j*U_r)hy<mKk?KNHAS_)!)=t+sy3&8fn<NCitM-3;P+o9n$c01bpLvFpC z!+9eSs=LLhD>5jm=2{t^(?}}otC4h`r|~asnX#FS&I``I@@$#=R?A#MdK@<FZ84ug z7AmYBU1l(=CV%$jfAb#=j&$ls<!d27ad=PxG3H~O1&S8u=v{yQKoR`+?sWyc&}Fq_ zKB+o5f=cR6`urh9Z0S0O*wCrV$@jfCaqKdv8|P<OZA%N?j(1Y<WNx>umrXRvm(k3V zyI+*-s-cyCg|gG<0PjHi;A2`Mo?t-7Lltn{*kIukE2LIsCTtpu60wkAA+U6Ow-Bv1 z9Fb;@<aV1Y>r%tR$nEZAfPB?-5k!`Djfhw&I(o`RQD)NPJv~k#4BvkSjf}3$>D-ix zZapZah6C6$r2y$oj*ej!o4+b<9Um9Re6A65q?~dX4*FDv;>ftlBp7wa7;Lj&wh$$e z92(n-t}oR$9ZjK2Ff(1>w69$;&GvUlhOf_$vnUQcWqh_%#M0%c%_{rL{=hDU+K}ds zn7VNdwTK;kuMzQhVX`dKOjcRTUEVimN<F(<w1^v2jhsDj7^mnqL;4e+rt@f8x%+4u zlvwuYB;}5)8LjUaExHu#L4zb0A7g%vLztEm*?0?_t(d4fs~D$WWjs_#Q|6_6-6Y^< zFj_Dw8w0chvxKnWt{kIb&sndj2;sI2uTSnDzGv2SDBf^w>ZO`?+K=gEPKq!pRBq~v z^X){X>_mS>k83B|I{Ow2XpNjbn$ca@ZsVxjQ$4+P*6dTvMVyk-O07$>SU8lT{;F9f zGm?!vonrmhRezVAD{(b{RprH5#^O?H^8lUD+2HER8mr@vh5`c3=9K|sTlX)Sb(BN2 z%6CN;s{fBPA{KbDu<!>d#KywH*Heh~g@rGq5bFvHpGhGG3JX7zK(Ml~@bN^rdio_5 zw-Ic-l`7Ni;$K*~z8%<Fc~d*^s>)b9aD8P<JMf;$3)+E?xie8thI^9Qb0uSRhyMKE ze*4->-%6X3>dF@SvmNlLQ+XSyfFJh~a4_McS*;?b9OXMWUnW=@B4~;}R<1{8^eE45 zOm`mpFjpxaW!k`btv9Qb>BK-eoftuZ!=M>FMPn+v&pOT}5DtV~m*`8J;~1aE0WDRY zp~v-wg?kW@z>ihNn{!_O!~~g4!)WJF)l@fSvE7Er5Fh26zmUi-ZMXWIe|A1s=dw_` zvdi#*>Lk<A38&fxtSXq$YyO3&Hl_2Bg}d(dL2tEYwFOwVWz=%(Ix+7e-ZT4Ri&#;w zWmqid?!4S$lO3}yhSoKT%w#K*!REWQ0!4oBJCwqSKW_xqBZo-7nC*U<LvLwm7WWEA zCRO7>)$D8~S59><@6SZ0lq{iqi3+6NWnpB=*s-wvU~}TznvNH{@3AA2vAv)1JfPT- z-9Nmn2<E6Kcpl5iv(b)3N#3fWY!pM-qiYIxy~q?}!DnG534ti9(uHAaLWmV1h@AvJ zF8J1Ex+_P2+sBltmRBHO5Zj7Ejp*EQj2dGg4fF%6ZfEvg;&LvebX-0-T%#~eC$5WF zt`HZ@JFEp{lqPp=iWYUssDX1CH6DLJ<N5dQRs3XBg+p=N`ea-IW7v)+a1=#pqbL4a z1xiw4HZVr}o2s<K6HX!0?X~ZrBV_DwgWLXZyS>z0$0cgpZki@jqPb358))e%yiT)h zNo`WRe^}9{6iJgsIS$j@#_0^!W#&N<C2)a<{#0+Xs;2T~)gI9-44)!hqddT})V-wg z3qWfNce!C|!HV$fh?0b|IHu&M0LP@YNA5WCZCmzjYsu@h?c%}VB}<-QyiLzZ+Kbi| zK{}=9jVa&0Yi2i6B{7=kKTFEnRPi;luYs%6R0M|Ri6FH?63F!%VkrnCDNK6<VuG0S z2jAyfMQF^EBtB_GSi-|HIRL7P&lNuLr_2t0tm<qc+%}}Wg2yQ&S~Kuf4!B4<Y8yE@ zcG7OzT8ez)pU4@~64JxU6hIkztS#LA5z5fYr-FV+O`p6^QH9*&Pz}q|EKk@VY^RA| z1yM!jD#_hJ4LYecGdBtywBzo{G2DFO&o(!Zp1EyDZO&Him48uqkz?yG3hy-)E|gYo zi3)pvyNmo+Z1OXvS64gbb+!_&?keG&C4I5=+9y$kOVp&|DdESMJRS{Qr*MDyvKoqm zbmq|y9zB((d#JZk^iW^rs@7J^0<psV`;BNV-?}!&ebM1K+0tT_#c2+zrNTj7)P-uk ziyk1X>nXfhfS^vB`22u2=cc!yb8r>WZ}L3#r%o^@6FH5WauIaYiTY-r12rWzWwboW z&eEDzs@~aRstfrn)l<E`oYq)UR;YfI3<n?ZV||^Tx!>3Q%vx6~>o}V1PGzWcZuc`x z9;z0z!p^q&_d!@TW!!I4v91^66BEa8g-Y|zisM1cvB^wSOoF2mxjpFq=HFdl9akdq z6J<<^dnw7v@gxK8;l3V|aPREPGAh%zdy@=@is-7z@z%(b%@NnpGlV^Dz8HREJk=Sc ztgvRaeR02SuJ|2`w5=j-*;QSSzCABZav0k3v#Yh`AJXRo`?<#cz9DG%cGzz`u%S#| zxeGm+(QGXH_}=XJe28C@9X}A_llHK%UpvW?hvdM}_p|%{REN>leD&z*L29fQGu3n! zJC^T=t)*i7I%4-HV|$X35ENmpe*uchc;g#D$}!Gq$ken+CZ=%Lt8vbndYf9jo;1p? zn@57_&l5cLNAzjHqbGYKT2or8b%*vTi}A*aRwYfA6shd49jL8nBvf0knM3&oPnpxR zE?|S8u%y+auTa%F0UulVyyHNtM*H1H>|)=(Sj8GEI>jp%yG`$;qp3%3_a>k0+J#{u z3RTU_eTjO(ZP7*%S-Jy6v~KoM>223Tih6~Q>P_W3tf=I6k`R)vJt3>S3ft2c1EtfT zd+tb<f25O=5ZZAPW7-2!m~O3{$xf4mLkD^knWvX2{8lab)jX1EyUh~qZX?kj*-4ZR z!8TvZY&}c)vtBJaYkRj_M9t2Tb=Ax1g!p>g`0F!gXDS^f)*A!+;vTPPPPKYX*>7s3 zL!oV@=}JA;=Zm5wNpi6-I$P@et&TX>;Jm1x!#r4hy3E6U@S&PpY?pcXLMpb?JS-(+ zJI#X#d-EVF&O9i`+04TmpF}%rm{FsgL!UTj^1|lhf2qTl_yfJ9rz7Zzp4bTJERMid z{3?1MJu^#(Tfd)u{tf{yi<R~+<#B@N^$u@)bw}^xhW&*0e9Gp(diB9gsQw3hCMHxl zv!~9ETx0hW=vEV|wo|?*e-Um#O}VwP@rB{MI_C)Z@7=5V6M-a%#3>-AIybPMJ;iot z?X0%Nl}zL`xb6TLTPiBkA_u=EeDPr20@I@C+@3+tz%LSL{&#C5R{*b!Vhok&4%Xvh z94#W8wUAZF8fiL(a`UqpkMrEFt(eQ{Lc_eAx|A1Zw=P2q4+dI|ZTO!Dhuy)$zTU$9 z2dyX$W}mM;i56L~k<vtz-5Q2#@oHXWU|KP54(?I~K@>juNwGr~*G?Ed<A0r>7N)V= zINHNy8eyCnrv^jRK<3xjXTDjp><N*>mRgzut-;w%dkzOmhVKPO_QO16lSn17sdqBY zyV?|6RAZ3Yo{3saL#(3;)-bS7DshsvjRr$f&O|3UMKHOf5brM(wcg^lS@7CNEO@q^ z3D=8Od!Jy!tsUuAkGSu!-W4P*>QmmZw>L0GH8Ys9l_BO9qs%QHBfq3O&y!<TkrIsB z`r6j)75k5NnGtP_{Sw(NtDm@!Zm0Yiodd8bJVj103*f-2XGt5Qwz@=&j<M=B%$NyV zGjDUb%eZz-y^43W6O)NBKJU+BN}CtH>h9%$Dfh}oF{>dn*Y4B;@z%3;L5m%2s2y*( zJKGjh_f~2r5s9jN9+aFuwC!n%GgGH>+~8$sPMYNfm=JMVmSQ^eE#uIBmcC)Hp)eHo z+XRbRk-nX`7=>7!b=T&ExONmfh7q+^HrIIUX_vI8J&oFY@7`p03Fo^>%;FV4oo66d z;jj9bY01Q~@+35KDs1B6@(reA6Jl>NFl(Xdz^spJ)DI~a*ZVMqp3W5(%teRDbkvx) z<puZNsnx>rsPfbl<u@xy39K=WS-db)DpMHhiKOC&0bhnw#fjn=^x>2(j483LchzR- zhR+nXU9_bxBj7Qzll)j&!(Gn9TN3bS0@k%ZAx${}kH>JkHD=TrO2q1G^`X&3i<teg zV;5H25x1<|$Gb0E8JxJ1#7vp4O&A!C79TJ%vXWa0w1yJ2y84suIN{)q?S7S^JXH8f znM(jnQMVD;_TyTfSaZDbRhj%a;<~Z?M=o-&2x$+XNLjhoGnqiyVg?*RD;hGHqe4Xx zG)Z!k*mWiQ9k0<mwmzTgPf$?1aI{%kNbLx*kaR<G_pcbiuAM9(o{?@*PPW$2t-yBN z8WvW;>lm`TYJ*v<>Qchj4purwjrB<hrcnY_Z4^htZEt8#E@#r#Ef%A-yp>Y;V!8Jg zXWfdo)W>?MW;xwsx~n$wB@s1Y#v-B}IQ8@Nv0v+vt(b6fq!}!MRcAH%#p4^AVS*15 zb0jm5h*VkaNV%fTKlYU?I~mWqn;>{wu3fnvUKRQR$y~c{wV73T70MI`{cJ1F)Z%!a z&hHV|jSYN6;@nLBT<g*?`RuuCzUet`tIB4o5WhW@n;myD{t6@G-YY#^?$ve(I#c+{ zx-;L1Zu*Aib+rFmhi<9&z1}5Cu?<O%%dMh){=S-&>e)L)coEjxyf!wu#@<ISg2}b8 z9Y`4~=Msb_l8!ooKO>_76-&0vPLSDtzI(Gc{{i!K`-Tf&;evpkJ0(PQZM%%fVL4lK z$U1*RJ+^Pmwh2qBHN~Q(mI`&oXBAlP#q-F|+B>DzzDRRm_?CK4vo|iP+)G*B(d3*A zM6fN19!BqhL)XDV%=ppM5e1?I=_uTe@g6(gLnCQWq3wnm>#ohuvf>nnxAk4i@~WjM zn)lN)i}wJ(*1tT9bT6Sy9VQ(pZLs=qs#mGe*HE8~?5*dubE!^k71~7oyasis%BtgC zB=)BsX1w#jyV?$whBu^U-Vd%;80@B0`ROP%*v&E6{SFPP)N>hwo#p8s?54T~J7G%J zGt6kX(vOv=r7a;ar9i^dd%K3)nOx<KN-z`Ez43&M21&+8tfo6}rSpcqIv5%z8xi$L za*QE$*4mAcQ;9JWI36Q`<1rFA9wULvV$MoAR*uKWsny2FsAF6ULrPTVeAWN|#>=7v zN6X0i(*YI0l)sC9&)M>HkBkS(d^*MtlX^pW^yq2Mm>@`d$GRMc+~64b!Es1d-1h$C zYZ?bNI1XuW41IUmnHL)xJI}VM&Hkas#|-+xWs#IL;Bkr5?8_}cZ+3&0bs@C>$s2Xk zKh0HWjCeez0pzaz(4PO}+w;u!(b(*jfiCmEwf8g5L93zEQXo^ev85ThvK%s|I;Q(_ zf~Vwc7tAZrfe>{ENom3c85;!X=k2hqHKj55-EK}A@^A#ePupUQ#<mpQZJ4mAB+8n| z(T&_h4!~iUtvC!rl*0fxOgUfx93~1F0EeMqcn;&XW212Ywi{~EyDUcO@Ikh{rxv|C zg?Mi*y1sdFQXIylQ2=raa9$jQJH#POS{%Zp#UV^u9Kyunz>Vz?hcIbz2$L3vFlliJ z6Q#wW5NFD^P1d5xxY9zrD=8Ks-klVS5Z5CX%OcZ1Rf}$L`QwF#DNSt$QLnD4tqs{f z9Ixv?9Iu1(#&cEse3tp_qxrMVXa9G%=n3Hg{?Omiy!40j*Ps<0<Gp#NV@oGlzHr06 zTVm31KcV4Xx9-V+NAYl9)YwoSw-nqHYu<rU6r=tTJBp+=p8CEKC<<M+@sm03q>j|o zYX?&JMtur&y=GfG$<)&>we14M_(uJ4OI=CPfc7budL@N#)GL-cN?}Po=Td9QCdJ{r z!)qHWg|9jMkxqP3)vecT!zsaI33R=7B9*#PpD|tzfo<NFlqn;+&9XCPYQiH${XR{F z>$RdM3Toa^{dsPzwg%}GxpIxz-de4cWTn)of1hx@wmpR<wQT^_Yf~wFquvLRdd+P^ z`sRejX`_)6txD8(D14?wOKNRG)@u`<aw+PcHqdFxXsW=%{q+xnsMX3Tbfd0MH`HsX zrdNrhuEhCNYVc);uL+-A!m<6Iw!bU=UuEk~4Kow<FPrGm@3E!htogcLGGl5#wlqgm zI!t>@p{Vwl#uLhG-b+Rnu<(^P$4hl~L20}!x0&^-(k@+hMs<|&E8}AWa=&aLvp#-L zU+edbOdz|i7TL-Ybj!NU?a2@>B?)isAiTa7v7%-SmwTTi;jKx+J39z(s72go;t1=F zqO)_XrO~!1CfkG;?)emL(R!pUjmEay>a~Z|K%#B}YHXXS*H$`Em3r+FP)oLEZ#(xA z^cTl_=9H&c-*-GS_9uPpw^QV3+1<6;iGVBIKQH*4)zbZUp;`-L^JGcZ>`w@{Si26@ zppZSa+8=@Sf}0ooBn#0?-pN7+(bkSa_SR~8XS-c+V_P4#A&sgpsqC6N2@^PM)V2DL zWk{xF&9FA(5mOi`$+bFn!<ovBDj{Gb)|p26hWfr0S|k}m+MK((IHYYvH~1mORut=^ zSRb=VMM$DdyMISyW~xh~n45i@PE>5s4);`a%~3sPcp|<nq}p=y)OtABqWkvrJlfpk z;&3T>)i_T_-LkODF{XEhx1dnQXZm%8YS!x|kKAGoSK7dowPrezt8fNa6K6>B%IHd@ z1MjTMwcIPSu+4cF2?=CTo6wWmuV*^BgM~b5;3nc2v(%1~mN(x?I_^r`NS<(spk2Lq z^wdRNsFVGjsPz6+YU`schT&k|Mr|=mMR@Ia{XQNX0L|@PZ`aZ^?V`N!3hfA!)RDp$ z`^Fm7kvwO3d6c}Ru+EmeRm}=$%xnC|4i<OqBty|js8M&LgxkdnA1HBqMeg_w`)&np zpnL#@<3P?gauQXk@a2K^+}*~Ot$%emzM0-#xwf{o&v@<>q<4_Ins47@2SlDjCx`W< zBBNXfJBA7NnEv}Lo}(}pzwbVcJaMGX!bFWYazegDI#SIoF^nem%0cY6+fG>e$df!2 zaYRL+I<)$<@{mrDUsVA>+%cX=Ejr{q!gw#idpRe}h`okbsQ#Vang|@>R@k_S!$)gP zP@0ZC@6b~Y-xw>s?+mAVczZ0oG10&KM`99bap1a$pnFN^=xN56<H-XfwrlurB~Rmt z^#j?s8SxjtzzRGAvcj{%ktlxAzRKT;rMrJdwg$Zm7eKL>A!Xpa<vu;^BQed}sG(}Z z*U56td+Esv3@M;b#wj41(bPBP+Jd>Av#VA;vp!9I9?!UP95QaCIh=#9-E@xKYb)#Y z7^n=iHi<N~=K!ssO@jKH|8X5<J=>S1rI$Xv1U#a%vWfCekji#NgQg>zzMi8ehk~-B ze^U1Q2i70`&x0F|1~dYW(fKx-;n$-#$O`Uo?5k`-CFHq7AA!76{dz~P%9Y1gsJY8D z_a!N|#$e07;85m1cb{ZdS6uIKS6uICYBULqa~{%`k@|Y7r;COCeVI|Od;+=bDR$?% zx<Q1PZT<#8O5h4O{p}FjFXY>$|6N@AEA<lco@+x9?TD*Y_WPG}Fct&|&t6jOSl_1N zTUi-J@oX9GV&ffI5^7x;_-KnK-6@)X%nTyP|2b~x7}8^tUPnqO$-g6=MHlXJo<iCp zZD-cj?s%_MEjupSyFF3Ri!=Il-|j)Au_IZi_1JH>UXhvl+0um68UF6x{;(QPO|!#U zrpUSgf{tPnLS%#^A<NNxw+tpd94Fms-ssy$+DWQCncFiI4xD|6iga=L$1y=~lhOjY zNr#ZGJG!U8sR<rTO>hixo_6J=qaK?oPxsK%D+3-HvKwpJLOYwJJ>kk5Gh~$8{nE2$ z)@cDegl@6@J9ia@-dHg4xQ3P3Jm(9Jb3J-1uY_MgeT9YZwDDZts1MorxThBu)?$Wy zXsEDot>k@_pA5b;zp$aAHEKaK&O=9KSZ-_^RX^grzFv1uXtX{S-vo#0(iua=H~M<( zV`Wcg95OMT#ORV)Hm6S>`=7;XV;gUxb<}2S5R$b=vNj>Yu5e65jE9KxsG7ctc)rO) zx}FEf6#GF@V-uW7JqGfz1MOckZFf2I2AY408U!lmVlJe!cBcJ$I4N}qHN+$LeWJRg z{*<e{BE~chSP$Di>|J@1Pst^o%DEd9rtIrUH`vzk4V)j=72vq^n*xExyjF7X4{zwO zU;4~yNEG#pHK|t7TfO!>$<@<?9XaRx09;gtQtTx8mz<00Y}ClRZGOoJ6(G6X(bwQp z#kJM4k-k~fkws{Xm1D?X15@No#$fBiA#-&}t3v+Wyu&~^!XPk1H3D{BoB;jly;i|p z<npxf4V*YTbQW$0r3hA2eiAOBy<49iQl{w3fjw6i^FDa;6x=tDN+HAs76Wnf7hx>u z#kuq+ChnR`PX9;JEc^$nrWmfCVn56{w;$)grpu1WS-U%4xiwRl@+3#fy3zDaM$&kA z`3v6KIA7M!JDuzye%or}dl<B?%;R<(ChaNy=Qavz-^*N5<S&47k%FRq4{0j$zOV7~ zgZ;atr*}<X{{?IF>(*}=*m#NlE-cvNl1m0J^1%PDkBh_7xII@r-!(b5RL09luK!6D z=QKN}HKeGcWB2uReKAuJWu+`zXEFcjVRwjXHuE&*>(ug;<XXPEvbOmZ(T4)_A{}jK zebx8K8NC>Nm{=W})w^^xV7<&S&r?Gd-1%#kLiRbfomu1!1Y|WF`?cwS^Ha}y?eTz7 zszV}KuboQb?sK@)G0ye5XmKeghb+D&&2GNRzTm8Df6pXYbOK8-&l<|osH9T)CqAy` zwi^)anFEUP=mTLFqP-%^l~(h@>d*PFsU_i5`zO~w_z*>|@-)#M<i+aQ4F=H!L-l;T zXp*Hb?$rbau@SB=3BCQ56rQw6#>jU>k{P@FA?FTT09A=>+HN6?l{+;t!nt(KTdk@J z6qA8cGB9F+YS;B)-TSFt-f&w^a63W%Y;JWwSj>b1#ZaySF%xB8F){8_&EO8o`>I#7 z4&kO(&KLvIQnZ(y5|%wB#qyBWG)C_jlIo9IXE`P23imH_il?__*8l}+bI2q^JZ<@O z75%TElr55WQ*={|^}CDSubhRRzI)hBONzQWy<a~oJ<e@*D}&KX-d}B}JCk~_yed%| z7$%W-bo-W|<6kHB10Uzd#J*7wQyEm8#Nl(5EQLhiO@~2iEG~Rr`h8S^a=2i)sB98K z$2&1;{pjM?ZWqhc4=alw&e&WV6=!YUL=c@>9M4fad{TT$U-nA-xFja-!~aEmpOrcy zDSY0&Utl#*30#`2sxS_i<5cFWmXybQLM4{0L@y(9yO#$r0Am@IPqzPv&m)=H$5^7F zT`vxFhFGTJU{}n-P=YRT#I!cIUKE<`$Enr>Z|BE&sjj>|ZZtP_F!SBf4$?*a#rjB< ztU&qSo}b&-9qSwJfo^Lp0MA@iFRAErT7B-LZGE=R(ML0Py;$VPyYmalM&I|C`KWgF z&vr=0Z`<v67r&&wG@+>}3OBB@<tl1#La#I+n<?FZq;RhCEJ=jZZH&i04TFvLS`$tG zDpGbe{ewPZh54Z)PR5dD%pBUaIA)(@_kzwhH}<y~i%(bwT8;S;XnFKxT!cq6B(>Ll z+@_05?+0Oq5ZxF%{-p!GBGP`@F$k(|)ayMcIrsd=pY_&;j=g*2nJhP_ZDQps*vXXN z(ZDUq2QfY`!K%cl!eM{@)F5zuU(NVYzUnfgoZ|K!l`FAbuc{lp!MInD&-05vVy$Qi zVw@7j#nHv4MS&k?Ds9JXMo65cvOeB9mrQY->^kxb{-Y?$Zi0GQe_pLk!E<`D-i~p) zZoxvkVq>sJah=BCYwpEmyu`)SXE|JEz36(F62!1Q2_H}xRa8;Aif)w2D4cW?#PhjZ zUV9d#KT#1Zs`AdpmNYKAqE~>N3>O!Mw^$;2=XRLdL_im}*rw*<L3b6Im$BstI&JRG z<iq8Sd~_)xGMbAmPi^$q#_ZZhf_BhvK#3;(#cX=1Kqc7<vhdiv>WZ!WOfm;nw74Sr z#rlNcM*%MOz@E#*!5rQ35~FB2ZIwki!z3)1TJ5l{vYD~Qc&=PuSZ@o>FsMmbyedN3 z+^erGwaj$AfgUBDE!~=s&X&|yr`H$K^_`twe@NGV_H-A7bQhdG-P(|DZFaiQom^9Y zaoPG`ecxfEm1q>Z(0H<OKxk=ltWNYW+vaeWe(!EgNTvRgR8lFWicqPVo(&Ym3TbCq zyCl=ty3Cq2vPD_mn^*2IP0?*xr#r8zY#bBQGUbW)x-|&IPPiW{QsWWBr(8$(iCg>x zZ<pilyDWO0-Pd-J8CmCL#4|mnc)aVP-!WkP_F3thS?nLu>78oIFFSAg-##b(#{3~o z%+mBT&cBo;DYmDr15ZTm#>L<poXRTZca>u*SIO%+nHVLTS*h*4z6lMx^zvB#c4tGU z{JHyrb$GMhs0|HaKl3LwVt^QpZ!XaO_>{j~jUmF`_$L0$0n@!|dyl+Jp3iYaRZBLv zTmcLg)unm#Fi{ozihL)3zuC^vm{$f~V7OGDc1a8QspzBbF+ICJHs%i^-j33`>Sv#H z&d_&V?Rzfz2fFE>V}848_bQ#UxGyn6t!dO2DAVkOT5&Yoap`(sW4`7&BCgySr;DKM zvpUQnh|6w*41MqFxz1yYHPf!4?QHp!WnchYrtytqzos4=jsAyx3_g4YQ%`}P=$xX2 zpQEet^Zg$*KW{%De!jXYKbjFpaz8Nn{P_9s^R-p^(Jf7@^K;()>jUTHqA_oMJguju z56MNR$LPE1wU|9wl)n=@nuyXL4Z@g}8}mA<2@bc_J||j~$pWqOo?30ceeDtz&b96| zJa%u2h=kp{E333`K?6cI*Q_gpoD1x<ZHAb4NI=J$+$$`3B|oz)cRoAI;Hp!~Zh6eO zn^kmtA~DySCn&dB&jk0M%HsYH<tZy+=NR<qtkmCZOV+K8dh6s!_?d;~4UCkGnj4|5 zL5Ja~$OmwP_Y+dvnO&ox1hi~1w<n%zeU9=UxR}hApt^E#^IHVAFS0qVsoN+*M(Tl- zmINJq=D<8{0KuIQ+?lKBYY01=|B}1_9PZF^qMx-ur9EZ&Vpe@QPw8hNmQO2>P~{>? zeeXI&i~^_KX|-vJLI>LUrrjE4K=?&v_tMkQYF=ISp_wihE;-fL1uw9YTt)qQRt?-L zYG>m<oR!oZj8P{cai^u2t8C?o17=6vR~)#h)Z7lg1dC50g|DXEw0MN?*4MIlo=E8A z70TW@o}~Kkl(oN#ooLKYkers7O!i;U5oqhb>#hGb<p5g_y0Fe$CknhOtH8Jm(@E>f zpe{V+yD);FY$w6Of+@EUkUlKZ?jE8ka}6sx$XfKhy{>4#%Q<DA5<y2wPDe^kN3_yH zb=YH#23zm5a;i&*M3pUBS7U|9H)0#WBbJTL)DdNKL=E5z8Y(%Mm8@zEilAeYj{_$} z-g@qNX0?*qYMXE*eT$#>c<@##m1MzIs#9J>W4?%rK2?A2hV!65+)ck*Ust!U$(6Ht znkD$<k;EKD{U?N@;b;nl-Em(MO$f>Aj^+jxyQl*f9kYgN#P$&dXRyeh86@d=>qjsp zH7mgek-8Q`oN6jhI!?<Y?i7$tqmHu(ro|7jfR54p03$r7c}{y3TCoKj;@YP0@ht1` z$f~B_R%x6X>YAZo=cJ%Iq1jOs(^bpBdIeGAT~k_Sv{|;#&0mx2@l$T>8>E8q*tea1 zKq@|y=<pY0>4I6snb2lM31}{aMtw+^QMAn<QY$NhwDZR$Qybv8{w{%1>mmn|*ime9 z6Xso4wdbPkx;V2rc}5?y={zw#m0|C7fI0boJUd}3k17@uRkZKrCVF&x<ENb1f`To7 zdkg~3T(OS(?}(~Jb-CFhtGth_DpJa5@2Q@%z}4nYlxz!`^QTl09E^-DMXXu5{pGep zhf$`%-Tp2|eYJiyWh*;LF04tkF?^rz2@cVyA0}L{>4hH^=aV(+`oJxz2Px0+jRPUc zNTW8uqJbZe=#2G!dI89#(k*c{y@%t8?H`_pK7>Y-IP1stn!SM2Z9lutS63gK61f@I z3P43uQdWz-U`mSSouQM)G=jn`jZ&_0L8M<+_PSfDF5Q<Wvaqn;50GTl2N|(E^Ogx? zK-x1CgRJ>RT561Je7bI*^4<RWu)v6Z*nva45I!}SnChJf3nV)@5}Ud_iMAZI59DM} zTC@8SE0GPBPF;Sq%?kGAsBW1wwGg-ThB=m7_-MoK;kjIeGdAkW6hw>KPkcQKi?O~! zh|#_yI{wu>n@Q73IHQV=pcUA@dhN8=3WudXFUus>YxWM8OYL4VBhyUdr<J@zIcDnn z^k!F*v_`agZ8}Aocef0CTMA1_BV?u^Jg<jh!_YAmBD#zha)Ok(S^u)ZUBCz;a_=ET z_8!7o_j%k8h?jCgCrU6+`=UT+25&)N!zfRY{HYJZTPEEbO5Cn1NsR2=yhY{eO@_i3 zw+|2VRzY}$;A`O(f-W1A_Frvm9kJKlWBcuU4P(eWe4y-fT(nw)ibGhtk4B4(9EvG* z#1wUFr*$%)V;m<ozC&!}6hxsK`ljFA(F|d{`8h=)I(Cj0!jULfre+M+<|`j*m&INr zg-^zao64-)nw57iWK6m3bhnA)Qpz+T!%6p@H)5DXTp{5?MFnt!kbG^=+8S2mMX%n| zx<4)@R1IhG{ALYlc@L^IS`QKS*$!_hy0&k4*9)Qs_s`tVm026L%IV?t90_0tgM@6l zlD_r3KKB6YNlbz=_axKhmEHJEUrmnB6QaY9H6+a^0U(#sE}L_6Xdgz3l_^EIz{bkk z+JW_z*R=!dbo*>bHc;6d0<5G`%@A=VcXnHEU&PTi1>j2Ji!I(?09tC!a;{Ps_%d%i z-#t2)yGCd2?<V~bD|5ulm#(CWYlC%wuALKgv<T@|H#+}KGRMktkTVvt?9-;|=^F}n z+4+Z%g{yGf5q4{vI(L!~GgLiQ5{SkQZU4yCI$;@Ztjv1RBT-80jW8vz$@TL=d)sml zI)iI=**#;%XF@MVxaJ!st!aLAZ--v|R_i*?cF8`yls9tu)|DRn!r5oRZQfo^$x{el zELtz2So!_U@A~h6Ave=3(hi_q#q+wmSu}Dz`6vC?YdO~N+voH4^SmIxHlDdUAl<&_ zqtDcAi<nBOmjYhNZ|_jWcGT^?t+!h)6Z6P!+dgzX;M%>sK@`+^EE)5<y|!QElHHh$ zxrKJ>kM-J@j+F^yR=J#3i|CyL_7)ie@`c`_K-^J)SNUdVMu#~sc?J>kj6E5OV|@zC z@UiwD$-h-M>U0#`c1o}=8H_tg6skvPBxmgJ`gCY7*CDs^9ks1jR_@TFRC%o)TPttV z<71U|dhDrO*!l_8+cbSk>w1G%=!{#S$V-y8%MgpJRn~V|<Zi?Uh@_+XE=xC(tSMyk zI(Oom54Bz%oT^7N+Q?cq*(jsg^Qv^CnE##Obgn+@ZI4CHeuu^qz9u=!lyg<{>&(VE zWy8qnt-xz(L7?jC>t}Vy<=XeO3Lf#X*?uARD0nT#yHni~qzl!@thM|~Vl2_l@*hsL zsU`{6;-7Tb{Lh3W5zWDP{Ggo^U{92)93YOGY}wt*Qg9qIBqO^;W3)}G7yHJPb*i;K z3hs#8b?ao#-<LYY#gVQf$q$$vknD7zzjc|t^y$^f3xVOczu9BMQgD6T$h3Ng>s~MX zhil*0|AV#f<LA}Bza1KnKD$c${&Gmt(Y_Za+qb_tuVkw?@xHDm*2hN<8|}_^mh&+6 zWZU>}Z2){~ZJf5JgHkS>5cBWoP<cinT#M@R8ofkW+Vw$O8+GqYa-S!!Ojb`<W+wv{ z-3-{<XI~SrocIXX+1bqj%lVFgy?OTODvR7!R)19Q8*aL5_YGlhaN^yCtS}X_-ZK0C zfK3#B<Lui4Hc|L(v#$);MB%$;Ul6byB?)wIp1mkp{R_mBmyP)t>SCELY|5Q0D~kpm zX#iripZP;J57cPrVp;9sJ`GLbq6CTwqisy;!`>ks(c84pt9=fZ{;ajYxh0knH(^jX z%y|4DOVHij&4RN&1R3wdjz|YP$G<<ocWT@CsP5N~ylT`XhrZ$XBr?JH>QRG>&~#c8 z&M~JP{giwVjpj5G4wkH>oV+1Box?H|s{e)%(bMV@$d21~nJAKUGhy@7i)Z+@G6;Q` zST%9J=!gxeCbJ^fb7Ch)cHImeFpds@n_)5W)ka|DwW0lCn`vp+EAPAnZ?C-btxtdK zxqM2+ae_)$jc75n#C)I%TtapeDK9_WzwEAK<yFPe3*&W|I@@Q?cD;ZCK*NL;Ai2O| zQD0c!M22CPy!Crjc(_f4sdGI~bdkc(F<&;Zluh8qfuP7Oi50ELu6@G}{*|jUe>^wN zB9YEtR{n{&{E6UY3C%i^9fpA=W0RSy234yVA{o)m8BUFfR-f56#3@9#xm2u=nHP(m z*ijX``j3DKWiGkSsSUskl_#Z9rIb8ZBkzs7$hWi7A2%_zJ4wRlU!}ja&+)7847tV= zc$tBzE|Q?u@jZq?SED)^Wt+uXqi>iq*5)$N^DQ7Nwq{J9tS{}7+JMJqan+&kKzVSP zwo3)4+bgR;2-^FE1CSXojkKwq<6>af2G0eJH(*XlI!&9ofnCoLg-+&Bcuo%Ww$``4 zMkQ^Ir&^b2*a1`XH0vpQ(q>mV9A#%k)#WpVoUZSLiZX*V;vi?b%{As{-kdgSW_oN0 zZ_6VkpO(f>3yN$jZ}wTi-+nC?E%nZkyV%^8#@k;-+wM%U2#k(5<~1b9<iLupmO)mF z{%H#n1^a9)t=hHPtXsv3ygkBy`ik{>l~@ca+FtoD22D*22q}4=vrI3Y5u1@v9A(nc zSR1Amncb&D|IWJrH|I%|Ftkbu;y;K?3l_zmS)HO+Uus>AAuef2a+grI3U#Saw=Dz| zaqg`BJY!QIj#1YdR$8B?w0<@6fV4PXpUl`_x{>%Uqx2orKVAr!@s`r`jDR+l!fPEU z-NZHD)QTzVU!wlRhX*x@n!BUFc|w$_=0xrzu}S-2W@(y$Y>@)fZ)_>sc@eCJ+Lj?G z)<H|Lt&hCosJ!}^b_$ube!yoHcivVTuc)PSZ9M0^AachmL*JN#oy?b7NE}{jaU40a z#g{F&UUFYg>#9JYDgtGGjHT*I*}Y!T&i=CH>{GAR_Of_vbCd12@39&Bty_ZJ0sXiM zSz%QKUcAoFVHa%1f$ZeQY$hdV#dUIABdbg6rG<}f8Qk|4d5fQQP^cKPy39JBr(8Wc zs83!w{8tCIH&(WDL|*D`gxZIJ{aY?=wBof<h#5+z&a2qPaCjyeQ}QuKlrhf3G59hO z96~<>sP`&zxf#6XkW&{v-esS8r{yD-yFWz&DO%K5xT{X`usH)wcf47zvY#B}l)vZ} z7H>|Z!E?_{GnPn$AK#HiOcg$Pc_Iz`Wv2OSctgr6Sf49!GOmwJ1kv-wR^JGX$n6aF z=jL;{D@lIlYC-KhoY!f$p_-?$uC6P59g<7+Un)5elw$BIhko~){1(S`r%@<-BxFgJ z?Tm4|Y=hc)ST^V`n?Wd)U3{4@TYNoSUf0w71bb(CqhS<;{#t053o)hZ)q4$!QKyX} zKI*1Gq53u(b{66n7ldu})$AmwV;@h9>!6_JG_*dxeoAy#C_&s>hVfe8S##_Rd^gGv zYpZ?-ZF|`k2F4oO^PD{B-FcPn*D0ZBrQDvYgOXi$j=jWYKgN+-+FgKq^FSr2Y}TAz z%%Z;GBX8EEZH}xJ>uSYNS@E#g7ll^oU>8wjRV<Ut)LF?)#mvpJrt6xxLsSos_spPD znQ<L_wZ%A|+X<7?EjC0lGm0pc&5Sz>(J2v4WYcSQLD&15pZHt$M$StQr`vk?4wHKL zV!2nV^U*^yf&WYCVYaycKJB||Q&huR5z=i8K9I}xxM7q2z-zV%Q^DDNZyvOJ7c50v zFJgOPSC`)E5?~X&i5TyhCX=20?TlmXq-RE#-=2gAiquGH&I@n^tUqU|6bhEgU|6zo zioz8xRBd_&wxpDlEo{Tt9*W<gkbk%juwKQX-Mg0eJhvNr%{LTBrYSPDp4pwiM-ibE zgeDzzu@65A?fEB|mXQ$nk?7V=sqp1W<=xRU4H@NtjPhfM6w29>ZLgMW!PG$X7C!zP zJc6OK5hPDaH=2_BDOGVN6jrICqTo%B>?*!6S;foFR>kJaA(GL)j4x+tU)5Shz_ssR zC<H&MbKJgW1bp2USrgA;td&4mR)4CZnI`)xqEQs3>5(m(A4uzKH?ukaeY>P*b8hbz zrcRsN-8A&CYsUumJ~KP2KE|Bd_0y2Lv2Ebm{GO?Rez>f)R+j{)K2DB3__?3;ZnQz_ z5rIa1Y$)W}H#c<VPA;cpr^yjvo+yNZY71VM(8sOVhDoNNCDYExd0UvTDCeymeaTyq z%0yR8gUxzxg|_!hYcw#`nTMsT#)jJNRdlNxRFaO&ZLKFok2R>pg?#KRW>RcEP5rs! zsNTMZW?(0^Qs|~2c78ND38_9-mV-9YC~xu;jFM`^>hxx+#Q_hipu2*BinD#tMznW2 zze{OdGt6aXE13(Y6xOGO(?azjI;%RobJ3Uy#>U%i&!x&QEWDIrQpr)#Vq?5#>Z-3A zuh;Qv>Q4=HB^vM9X|M3BI@c;m)7p$$b7VS?9$lIyI^J^|vKVgOOR`jqEdw;(%Bj$v zovz3UiroEvNsw1$H?<p|qNtRdSYEVfY+rxdKFaLLabF#3-kF%fwzRr=xLP?BM}{q8 zsKsaAGV-$c=CBkxY@-Ygs2Z@RY34RdzISQKsG~Ux3nN{kOUZZ2<h!9OQ9`~`CSR$D zm^z1iKieVSDJQM*-YIS%aK-_Zh$TFA4hbK165eYPPA5isqZtzJ_Yxk3*U`3wyYiZZ zh3%3sTcAa}Pwm%iMv>lYYMAID_C-&r1`1fR$od#c5%jvF1>6TfRZvJi<&%eAXVZ$r z+E%<i#~hRO0Ug=8;9+iUX!Y@nrR?iiMCwT2$W>3ShwroIi5D+y{Wi5<qx}6(AwRqh zl6M8Jx%9Z+6I-g)&f9W*dx>Rjx0ldfRb-ya$uusVr>Ep<5w`}T?4Ty<kuBJ}cpV2* zgc7s6;9m?;C?cfA!eU?`t9(8`x9>6ARb#cS{J_6JYZFT~_t|_FO+w|bc}TA8yr1E^ zn4A{9BE6h_0z8{KH)$Mmaen>DS=ToRzhZd@qs5>h^y5+w5yy#uP*HCe@!I;r@Uo>m zIJ{)f4vHF~M5?Wcg}bzlCA=~iUcAm(ZoW+)BS~S%H7h!GueGiOsZ_wR{St|m`jrRJ z1NN{&9dgGc5=wNeJzRcfuK7{UCI`f^axocytUPSNMNFCh61^(mzeFD`26;%D<*sVj z!g*XYF9qS@3C9v;zm;h$&TGX7F1cPDF%a#<ApWENIpVbNCA_b;8Y!7XKC~{mSVZcU zYQMFkOM)kQ7^MClcGHM?eKOl&?O>7zL5Vf7c$jCQ`V)|qejE{2Dq6UI-4#qD3JVt! zg9410J0)%!<;$pl2@<hBNQ<QpqNP;?(+BEzny_&u0>rpxcoGCgDcn^pNzFC-t0ciV zfx~h8iV0F^2~tmqN{mGQ%)O<oyrMfgA;}<$Cr~{v4D%C#YbFS*Y4zmVsCs(stX;}p z_6NVpvE(lbRF0pjImtF>@O<0du(0q8#+MUIb&g%oS1c8Ux^)?L9Y59GJ)^lhpVt;% z@yrVCf9rBFm0}N9?9yw3ywC)}VW}>(8)tS*BB)+SY5Hc!gO(*wHL<%BN*#*-)U`~_ z5QGv7*0k(j5%ZL_EL7zwYgy=HrV|8AWh4{d22KTof<O6Y|4*rAue>$Pb+@(`^)BG_ zXy-A76X%<*RXX349W_d*{8OTk(B-@OC9s5UtZI3jG8Ws$=XXryo%x8hI^rY0cq{Hb z8SAqJcLwp+&V-E}Jq)WIgUYm;u`6j8&C2sqi7Xce%vc=n-Kx7*i|0sTb4z7>IM>r$ zXA_|?+zj=&?GcS4UWd}JGr_fu)Ym-XqW3*?h@>6gp&e&4ub44uni^Z0+7|qg8BgE8 zqQT~r`5QA5%)I35U5>eMW6}&aCe<RAo$b{Ee{a%U)EG<<>Q@4FR3)Bb9wp}(_^Sr9 z&p4uEUNy*%n_uAfaO~1Z^L1S7$td#~oYjbp4v9U^ot%x>Xi$Z-603f7P?XANqf|~) zqIO(pxw&3jwz>xSHMa51j)yu>qkP80P+^Gn!m00jq@6OnxK}%o#2vCWsGUsW4m;eb zfTO97fZ~>_fU)lCQk`z&;23wahyGTp{Xq)dsBZ>aujSASCn&3)E$`QBeF0ltQi9x` zr&$`71ucWU>mRjP&_D={c_pD$BMVlSlsTD0Vau^S&LI>zwv&H5bL(g?_6<^JDQzOo z>r0y;!vr*Tw7C1(@~&F$WSrNRJ4uE~<>k5K(UYdP^?iAmGE&Fp2LONWnLhaN{2wAZ z26IYzc>deKF4@ELzn_3d$-??<Y8N%0zZ8{uBq+Am^@JnuCoSq5L)w(LjP@aEw3!LQ zDQH`v%+BGwHsV?J!D1pfRj+MH2Zuv2Q4tQmEe{6uc7D!~c$|nDHEEd@=<wSdp7e~G zCAfeeK8{8rSsM#(=c{OhJ-pAUF3F<CPdn9a_ikUXBKIA&{@nQMsPXs%nlE*Iq%$oK zO>CAW2b<Uwff5s&<BGt<xMyb_VADmh8mC5MVzZF}Xo*bp0(bkh0{YWPB^Xca3p_$j zy4(qZ*VZKLS;iYj5cEkyOUkq6$SD^E^fxOSSr)l1LDPT{LGB$ZvMLWqd%a3z136B* zxaRWI54fh?Z}qZ92`PD@n-ZCMk25i<B}h05MC>GDKM^#m-r`a*Yuu{-5r^IBnfKUV zO%Op&QhKHzua}$d=x1=@R4QiQbr17<T|<Nq%hZNU3FAgkZ-F?Yh(mR$<LvW8RCSJv zwc_&{d9K#&a(^BOX+;JtEi&<OCCg89%paG96jP`8pI}&=#0(#s-%5~XixVi95#S}$ zL=}WSqGa`21X?=dn!PgF!Har~D>&I{9478JA?Uk~3wHIMSmV@`e4sDE4@I0bq|=_X z@38NoW#Yo3L1KZ#{DtmLR+fKeovcj0L?_ekOq8wAQyNXYLQg6g4Xfk{g;uZ;E3`tc zDQF_CUHVS4VBeBZpah9|QU$V_rf9gH5uJm!^&ru<3Hc)Jm0omz)Y9*_^vY*j76)y^ zifm%itAd*xt{E!^a-0v$>rPZpFxAyo#A+NNar>_J2ob)kiMH=lDgvy!nndKWj|uB) zN`x5m5qUr&Y%SMu?jvlSIL;wa_=r*}hvelWG`<H$JG!&0Lx$)Q-C1HybY}%69@Ph> z58YX4h$p+VrR*GCTz6Jfx;sy;+MNTLxI3$4b!W%Cb!Vj!I<Du##))-j#kua>mq?&0 z7=d<owu0I<Q+EzxQ);yc6`troOYER0Q|QiN$815OBF+{Fk+ucGBy52T#<su+bdIF1 zcfp@jp=}F{Hh#Pzvu#0{xC~n$vk?0$BO3F|G_1TGt?m4x$q<}#ddwNZcb*TfM!9jo z`6R4+_!e;lyk@-I2uA&bCNC0k0ghQ}DB*=~Z`>n|vbn{haw8H%5?%|X$L^QsgtjuS zRF2%Q)S2(B^-*~d2b9(f+$Nxefjdl)eV{TAJu7-j8SdlBi_cghYf=}~7Ss(I9Tk+S z9OfCTqXKsCUw`v^fTAMQ!}D8^e;h=_=AFBqea*6tk}dq3L;`nnWfb26;i!1*;&whp zh8Gqe`iJKdnYBQ|7)UgWughZbh>={4#opH2G=eRV2*;(j#VV;Qr@C}p<alk11?pr4 zdRV(s@?10W^Vq`#x|v-9OLJD-(LPI4UCyh?JFCR;^{iLy!e=NFqgESCZw<2QK0<NX ztM2Y4>v-kd(eV0?1`TR&t*ck0<JWb?*Mh75PH7=DxURnzwbLc?<C%06ZvCxIp!(Pd zG@>U?uxMo82cum#7w%sHx%pcs?R8(APJhJFcMtP2Z9|w;bSd6vX`gJB=({|nKXCn! zlmmCfJ{6ZEW~D@#ip1pHTc37YxQ1d!L3f!mb1Uw$T|SWN)3yr#aJhJ<_3z_UM3kPO zPt)Y=JM}*2ilZ*AE^iaEHopEjo&7ena900)$2*r!y+8D`t4^vLPdsqTrKxV5`={z* z{bD|HyBx>KLVYF-g(kZc@ljRl)rLbm<$Fv?-CZJcOr}Ga_lt<0Q61tNXDd*i6J@&H zZvE`hNe_+T`h(C2{NRvSCnQGpLVth@G6q+_v`5Qfrv>u|C>NA|b!N;i3PqzAol9ue zWo&7HR1R4K^2nhWISnC)e4q$Yvux_4W3Z4p)Q*(#OGge-uFu&Wsg)~>6s;-I((1j( zcxm;ILSD9TNKJqWvuA~BB7-9o2FO(tOs~inyL+~hModXDVn8uWj95$3PQjqH<w4gN zlsUMjqfC14My3)rpPNq3=LqP}=5xTz=e}#qg_aYWqiPxR7u49E6dNHS4XySddF}H^ z0%TxdN+40{V)88YbV4EH^eIAA!nL!`E?IleJ}(^6zJWTXj%ZWgiRMOh^GjUOOHWKR zQaS)lDT(^llr~TMn}7Ib1t0Y2FAV3Yg*E#3?)7RUX8gGFaZBu4imGZ0>?Ir?oy%38 z2bZR=?TMC~ylzx>tB}13K|f}%CTNgbA9yx-ZOT+x&!F%i={L0U9=fo_^%993w1E<+ zN%X9q-cZ@t4qP~kNr>4~qXs(EF~-AoVL^kawz2mRxa(i1NHTzOZYNR3n!-XYh1gj6 zSi8{ml@GQ98!9)p0|OPlsTdf&u<~Q=Kygp}Ny1mQ7v?iR9jEH6{Y{3=T`cbhQSW_q zo8bD&%i4hr74CWn<qlMa+JWMp4YX=7EUN!*gmhIh!L!?ef%F#~%{V1g=TmPqRh9)} zbaAE#-pnGkmGuEBYx34eQ`RZ+hJwhtJZ-1;^mtC;?gwzi^a(Kq{Q#8wL~7VRNJ;ML zfm+68MZeqp;&#k?A5vs9E0rx{CnTXMXb`I~KS|~U@<t>Ucg5e!tlh^gN21-RVg(%1 z(IdB;)ljF7G_El9+5ynbLBOZX=C|I^W|NV8I@fN4W+s<^lFG0=B~5c9R=q}ssLo7B zEr9nYG%ofbNzez!8y`QI2sVC3HNYoR&6MrT1bVlOtay#Z)fEpWtBm7Mtqf)3l~rjI zCWxy|`<olALTRzjAyUehfn^6;p*!NnJCiAvufJaPXtON)tbA=pJuF7LG!K_=>}me- z-?YEXmQt{>pqJIt7jy5;qVp-xhZFG6vT_=sG8EC}c6}yr<jn5uSZefif{qXHrx?i4 z@a7S9FkeM)$8CKcFQ#1Pv>NQ46nioj0`y06fymp&SsMun6tz&MK~OVm8+@sP>{ZaF zQ_3u>G09Y=%-D-c^f#yAp!r;WGSxjHv}dG*c1m0&g(ifAX3x$|%^$4Lc12x6<7ksj z=n$Gl^T)-VWF|m=$V}i_WoF*XdC6=u3^f0*A6rFc8SUKB#4L!yZFT7+YR_xyQcSfX zHZGMnHQ+FvyyJz5l$X0*#&|$t>8hd(&JAMF7Db!fr<(i2aGjz{7WuS(rAc6lxy#h) zghenVMJD~WX7hC&)R6uBlQ5mM&~B3JuXPaxDZm>%P!R+|#IP0$?fNh*2<T*AY=spx zG3t_Y->WSw#RBTC=vk}wL7NOGOjvW@U+KJS0t1^h_-Wgf3v4UmFHtmP?-Wo0{W0Je zXr9$+r7+J*kP#4oOSK<*nH{mLQWQ(4O&YJ<`#buf5H>RC+1U@}NiIM{f2~0zr2y|b zJAkn2gS>?<R6kEDWUfGGy$>iso1<ruRVbv>(HeH<+(&ijSv$XpEf2%7*c8y8(g^mV zIctku-PK~h$5%Q#IX?)SNZ}9<{bdR}VfBVmR&NkiQdUn0N!y;C(*6umQ90G+3wS?J z1sCqVo+^@F=oDvb7EE%q#HWbz8M}0tR1zYo4!2X$VLDWuWTHZ{dy~o5bSD!Tk{wAV z>+4P?G9>%eWU~J5WFkYd`&=?TFt{UBMj2&$0WFQq3ilg#YErArLE|}PUqVhN8$w3X z+oM>vlqhjFKj{zLxar8y>}^?c?$%JqDtni#pPao&HD>c2e<8(lUWxY;wq$DBS)Jw9 zD>L(?#t3(*Xi93q_BY=!c5eN?Jf+`5o%$_=^xK|Y`rT2*^%yx#9|!NeG#yjf9Afsy zF5e&FfOOABzFDR`CLAK8vvufLY7R|XyJ>UU41a+J>?jfsN*+OV=?DeoDz^0v?tp?c zt#X`_0nqGzN!ejhPy4!yLzyd~gyu>J&_a$(l2i<nR75)S58C5$T&V+KGh0kuKs8c@ zSdM7a?OO{6jfpjnHhz1&vD|pH%UFLwYbL5K@^=*sOBu;|&);Us@t#-HAsXk+kKG;r zgW+d@$z6B5{>`h*s5v1ZaRJSdKU>9Bzl0i_26SrNqh61C_QZPhtjzN6NtCA<v8ee* zSVg6pzxY4gU=gp0(7?;Ix!PM#s0`EIP|>4$D(?}nB*f)~yZ<X~CFNDnw<eiED%U<e zqBTd)oXk{_j84rgpIxRfEs=xoeJ?rq=BO=tpA3DD-JIrk{;yS}`hzRt7q47J(SLA7 zY<iNl-~-BjLU-PR`nAVa5tJEaHMvx!W7+I?o4+(nJ4%-rh_UTjnXrW~WvHHh{_Y>m zY~Qofd`p_9mh)bKUfnC5*?W1=!0PFXDuehgh9;(YDcM3K+E|iaK4_2U7ViGrE1Wh8 z>#Olpw6OUbqSLM~yv;t9D(X8ofmh}-=JIWZHFXcOuL|go8W?Dv@`zHHr!2?_2%u{o zN8Fi`E~^y9c6iF8<V*Q(LTGHWXJ<R#n;Ouor!QzPr+&RJ7O0INHUuB<n2ymL55dEi zs5ONo`X>=9ihxL0#3Mu?X=NmflIdk6a+G1!Ur~}EMH)pY4I@Z*QIHZ1l8LY<H7-(& z8R^1FqliGNi@AhMJEqzZ*>vhROuuc-LdZmxiz6(S+Z<rCTN!xKB<v7447@7S>JxMl zD5n}swoWot4|HR=N>46oG)Czi-!HDBAsJSxvx!b1uuj~!!J(Xb<SNeqQX)R&Lyw$< zvsjT8&>x%%Op$4BJ++F_IS-~zW-#?9jwwBIvtmk#a@M<U@O)VBQa~KSl)yAozx>~x zI#b_u4CvvCo$@7Fu?pyqVg;s)9iiACfMxkD41dr+cKkRk#FBQZBya~aaECH*T1xNC zdpHAkFStzelhKaq2}N`jgY@F$fD(3*UPJ}DU8Z9%_tj#Mxqh{*FU`!lKV-%IomO9; zosgWJT-u-Ln0-Z(n<N}Kdrc<!t7Gz7q?CP;g!~eW6IOR&m1o0&Bu-;IhO!V+n-F@O zP-_GYaqSVD+>q{|Z@UCuIZ$<x;WB?9A#!`pS)KQ0R_DE2+Jb(!cBJm4qXdQG{4R4= z7?l9s(`_~D1~n$6#Iy}B0kcO$oN_Gc!G)IO6@+!0X#UwXj+nA?#nNFCh|-cTLr)~C zy4CYby^J4HM`3TNkM)TQ!N<yZ@)=VuIFJnLghB>QNl7#<W1A)<rOmz>H3ax0Dt0-q zOQ(-0?H^X>unMMP>|F?n=Ggo)q#gMnEQTv$IEBZxhqV<e*+m^IPtAPbL++hK%d0I7 z<!$~h_x*VB`;W57;f+Xyjz}&xi8{BSKhdUBF55k0tR)#UZmfztt|S~KEa*uSWgfxl z(dxQ(!sCr>oNw`@)@ct!F*0bY`o3S=<;;g4B+tc6NOufzs05$wSXtw;t?zqjs723H z8gslB*4@&YUAua7^vJg`Tm5$TC-aZuQ>}K)v&3UUcdw>sUjw<bOlZQ+H~;epE&f(J zpC7x_Pu0cLPV)KMWXB-=ZpF7@Jb@B-4!MmR;OKD)k1G|&;(8(qQV(^K0=I0qP>jqa zi*pVc7h_*2O(ZGzktPuHtdwCTEbPb#2<-=k{^qA%qJV9oS6)V>=u5_^YkFZ^M2YBF zh;4rJ8Ba!V=}I4m<h}=o^+5dddp3QEHIh41qG`Pf6RiZfJ-T69&=V(+%}zXm)`cG9 z!*p?>Q~8@~|I<_VPfk!;iW&ud8yv+d3TY@LF?FnGHh=m*KJ`*hW|aCTu2e-)szPRK z)4LSSXFaJ>lYOQ#8jcaXq_e`OGT8YpI6Fwt!Z4-VbhYF(j-p7d%w~Z*g?7V#c<MrX z45Fx#9;>R-5bdS}Pn_s1`A`4ksh9khQ0x@K<KQSvQS68)WM1_&+6i}V&Z>a^5RAYS ziRN2iNL|%06g*X{c8H;!DMsI$Tv6w5;L>e+I-`o;&%os<M@;je+DdUprqjB}>+Ri6 z>%~`DZe>GDM8tG_zp?Lak!li-*(FvpC{#SsJ#RylSPVTbE8P9d>k%xgY6@noV~|j# ztzrH3r5oC2kat}eHT@QA<w76&E)K@pY$yB+ne}<ii>z^N=QG(!XmDGBOX5@~b71}} z9DBBO7~<y$dh5&?mT#y!;_XWm2;`11;NSN*fB%I(>X?1GTv}!+kIjp3{WTkD(yvaD z{$L;-c9t_6?muK!^j)Fsh80FD<Y^`=-eLUOb$y?Bp>~Sqp2|tM^r5wd#qjNeNxxVT zS1w+zeLS=DKQ6^o*6h6mO%V0!sWq@ML$li;A(Ri3K<GzL5*`3eSdZ$d-sli5qSmVK zU(ne}AH(&Sim<&i7vXtcQ@PMX7ZmQ=PmMzN>VLr2KyLj;pIfQ9^_y$H;xK1=zwCg& z>KU`tZ@hImw;fLAV5zatr(*FUS@R$8V5zaN$%7n*+`m;Y+g@Arl!35}2Q8!gvG`bI z^V4|~i}bq({dfz(FwAdNN-e3F6;?n;K3t&dOec=RvNVY2QJy{0RLagZw?Z*(v|eNw zb2#T$m^x}2F^FunJ)&oBHdCoac=@B-8uY!u_*b{S*o@~qB2vM&HlTq1kbqLqKEf=H z=f6jpLn@OPl}U_(h0o_3N4-tT?!#L%x!C)BD?=opB<tf1(XcSivQlD+5a#GI9{RKG zaRqF9TmVT$0}d1_RG&djumj4Mk|DG<gM(I)hgDY-Kn0AJfVgTRCq$uIr%;lKDJU!; z3Lmmeo>$9Dbd6{gYE9Fq=P5;}#11GIJN7;{;nN<pIAu}R#-@9`;Q=9Ly+i~yCve~> zTJ@r&LrU&K#)#0`vsF@xQgo{J&9Ac!OS~7ibT`Az@d@ZBbImU@D>p;KY&fXgDAc|2 zIe`|!M;Qz{XnkRJgVa%Ja#++?SpM{AH)8o&h2YtcjFtU%E=39`>MfL5V{cx`cl9?P zr(-)#cw0j2CY3jZ9IT{B$hiuyHwPNg(UZN<ab@Y-M2(+Ou4r-K9(z~ArDM-gIjw6p ze}@u$EqdwEcUpmI)+2aHNtDWugQHkQQJ_K@4r|=2Z%G$&X+|Lv8HH?jg(!+b6v}A0 zxR9Q7A-|!DlPy*`xSq@?WQVA;FzO0X$OO~j%*CbrJY*B{dUHl8QyHb)0FG>ml7<YC zjY1WKMMa*q(C1qzX&X50C`$c$o%#tQ;=hSS?X3Au;u7kM{t3g!pFY`{7=B#hw*J)n z?rDC;(xq9LYqQYfSP(`mjCN8*_%mHB2m=cnNQ^GIc$O*jMPA8g)4o(K;wI3z;+vok zm3>5}rlX<vTUqJGuVvsCGH~<YU`HenlXBfDYbi9f_!Q>FMt^1XVOmn?6caJG{}lE- zxAMK7ZQMFJmQ>666{>UPnKRxNAAoGIJr-Y6ylF?&aKaI~zE5ZhcIgu}jSK#Bnj#cj z*#B7<(zuo@?AOwkY^Du!2hD~hS6h9yHG6epQ5r^xl8Hd-d@ms)4#Fz6aRZYAW{w5; zq=-+UJFiMfhNiMK2aV2EoHmGV`bK?We@&!*qxH(O@D)~pZ_H;6?k{)_W5xf=-n+n8 zQC$uD6B01o3@R$#j|v(EHC(I#QG-T3XwV3#s3-&yNF*dN7X$^x1}Yd(wANzPiWaR_ z+oDAU>m?`(Dk@sFURuR!Eiu-57cVW}v(}ou&z$50QS<fvfB)CRFU&K0t-bcz*V!|( zXJ+cN?Q)KDGtRh~*Eg-1)yEtz%3=yVT_2^I-n8+V#8Uj!(~}t~b5OFUmYtNZE}IvS zGY#1`T&+(UBo$@T#U!+~ZYIY(_PfTEHczD{StD#QVKf^N#cFn>0SHmm63*0jJvnH4 z?&<I7E%uj~ec8lnWObhqWg>=?d}*5UJyKbQ(Iji6d}oTV+fsxr6^FP0&xVFCv2@&! zVDaCL8xl3#r~689Qi4r)uKPBH)b>EKoOHg;Kw|olfuw1lZ{<lOCfR#HQ%??CK^R#U z5e-B3bXaR~q;0z6sc%yN$w@R~lvXGkP6e;z|8TF%EE&Tk9OsrwUAX<{HiaR`MZn%_ z)NoWcybzE*b98|Q@%E-PjkH$OOq&XqJsxirvx1?S=KB)+Vo1+3)IEG74Z#-m|KxYi z{yMB-R5nRQQ-w7h^F0!Jp=AnWcfBRvN<`u!N^+>_@h84}E?;hGjl};#7*#EsU|J0% zN_KTu!gMs<05lJxJ|u)16P0SYSuO(kHSZh>H?Qq$Vl0c0EXXD)3oV=NCu_fZj^1u* zoOCx5CWk_ik-qFErQcLff-?1wT+Q3UlFqhP4>g~=wZ{*4#i&E`VM&hQYpW|ygxM7; z#wWXWB<0(5BA4}BxV(jxJF=#cQf|2r=9#8f5Nxg2HU#3&2Q3RwGGT$-R?){aZ7+}S zGi8XoEpz#vT5y)aJ0}+CEpg{0dQ(I!`kNw`?j$>QQ$${SFH!M93MxF?6>QoMwXM%x zwEnZ^^kP01CXqE)UQe9DP{&m7_>-0<wMa|Tii=+L;hOv`R<nKgt2=Z@y^(s+xD@VW z%xrscrL=CQx!QXL!hLBJ(dSsHU0Ea9{BvnrLQ-?K9nSiTc(11CdEz*!I$7{l%Qt2t zN00hV9qZcRah97UrD*9z+B+-rvgW>^{v}o0+{Vynf3AvqSwHy=p^=pu{)*+s&Z%a< z2eizhluFAsPuSNf!rJP;a+^Do2YYE1X3E_}#?ENMsaV<AdIBL`PjKT7QUqKhAV6<l zhi%KQLE6R8e0?u>>btp;qEt=NO>7Hv=|>#1{5ZiD9qZK6G0v58q^GmZmTj9in76{E zrrUUuHD&vbJiO5}X>t2)G7pJ9vL*qto=mqb$2}fdOKPrZ)4t!6eh=|LxXZXymn;g< z$K#`q?a2k*ty|%CJLaUd+QSYz)Qyl{khla)#VnKDB@H8zAqmuXJA`i&(SD283R2c- zSJO&rhLfu*+K;X{Ud*$c(g3P--Adx={VLjx#z?$FV6qEo>C1{#zGz@dUz{BpNVXJO zOj?VqeqMn@e9>}Zt%YP*^5}hOI=x35%_7CRtjJi=jT<oE?Ww#D?eSFJYgtn7k@g15 zC=nj0S`8S8TO7yq!0Yb&Z26(RK_r&4=ltI)qIP+3amBW+i|D(TK~76+beK<QTue_l zv60`_7LgnTiDD0ViH)rK9}`^$adukPY73Xc$lvqfBkzJdIVq_&O}1<J;to@93CgMu zA3ba36^l*8E24glURxfaCCw16pww%neDqALpq3F;OY!KLm_aQws+Qu>Gcki&x2Rf* zN6*9zYCTL%HsSG4B7)iEOLZ7c<Q0lyR%T(E87|4;bJ9Elk;b&LVNXqlvo>Gjq^QMx zCHFj%YPxCk11&;O?M0e2u-)0n52F%Nzv17=dO`%~hJl>D@W#1lhr@v2w`i4Oi^`W+ zS@qL6++bgJ$i0Zfe*K0t2EIYGRS_iRAkivf633$IB}Y-!YqDXhQF&?$VT<V<wb0^B zj&#HTMUb7)O4+W&3TpjKO|;p|iAGA%%0wHrL8c~~uw6*RuwAH5*e=AZv<r3lYIUt; zyU>`vU8qUlE~ISg8|ATmp{8lA+Qm?oM<tarszXtwUF5L|+l7Q!yU2xbM>h*pGi(>4 z9kvU>Z_zHq7VSb}`F0^Yv<nd>w+j&@`I{IA;u6Q~XuA+qZ5Ls!tNdzBr=^9k<>W^# zv~Cw7rg#bxS}EIwq=Q;vR4qkI5HqNaHZ{>^Z;b89CTtfX58H+6gzZ9NOS=d&C9bt> z7aG&I3pMH6g_Mo83!xP4qBq~UO)4dv8;>gOqL_{R64SlC^k#Y^lPY?3c#(@8`EiaQ z;ekFqvsyIt=@}t4Ai&czrPw4ll7h9fu@;~k-fziX*v=&Nu$>8}Y-f4mnwVrTi9VdZ zmc)`~+!7%3Tiv#taWBOoNuRbUDP`3!VRo0WoHZv)#xT|gB1|f(#86d^2rFR&oNjxf z-|7HM98so}s}fo%o0nKYZDv$0Me`ClYO@n+^e4%V_9xDE2jiHyLNjRH)Wr#6*Ct|X zmlA#LQV}^9Jfx_DrY<(5hkZ%2p1N@UCyFEDaG39JQyi@eGr2e-@~}AMQ#DfdVK0_~ z412NahP_z4l3uJW<7#aIEqk%X^u1V3`d%DX9~C9kR3M-KBwPMELen|REkw?$Hd04Y zr}I!1t!UT+!f-=Gt2ShI<@P7E809%^Q+6@AY9qo{*XN#df+R;?{6peF<s&}Bk&DN= z;o~5AESRJgZ7C@crc6o&Nl9%8d#Rj>9`PmrWnFQn{2!j2lG4=}Be$|S=yOY4xXglN z3=5T#iit!-D;#?wHtHM8L;W^OO0-kDuYx4^_l~;%A9eqC$?h-481BpFps&n*VceHZ z=)Pb}_a!WJUof=6YausE1|+D>45+!51Ef^73X(D~p7Kjd8QV)*dPCUK6k)fe2)mOo zTon_mHuNGXiMZ;`9$i<#5@FSwnO#?P<(?ai-Rs%3IFr7RRlE`$%%b6ScRTf)H_zH# zE|<!i&bEzKPjg3Eh@94DX=oCuO2g8Q^uXp*QyS^>QPzRx=|@@e5D?8Xd+nrn)<sW7 z-OvX)AEuC7nQfZ8tYufPAtYs5DbAu<kjDd9?h}S`s;=++J0xX%eU@@O-_LH9;iRET zcH}b1M#+urBrg82v)Bzl(lY$`lrp^({<i$8BR1B{kvs9ll8x;0#ga*jB=!GieqH#b z$$wos=>O^Ze@4eHowmvB{Qp>9+PTo(ds^LA-`DEjC(k26new*f*`z9c{Wi91)C1<5 z(!9d&CCJO&^i6%T9E^T1&EpCh>8y@Tzam7A38s=Yr-psk9(DX`M3>M1a@6kU!u1K8 zM0k!1?;x!@5$^B9r6-5yI(>bJC!s&og?CKW&vW6OlEd>|_%_MmQWBDRoLRy~hI$4M z$#b~4lDx#|_A%|F>{OvCYk_nhL6sgI^6k6t2hZ%zz>v?^<<acj+*1a7F%^m58-;!- z@V4IGvt%cS9jCWet%`?IJM+_;{>d1C&Y&<t*22rg92PJ+NM@y^Qy@mz&kgtGQ!J7~ zvQhCNR2a?jn*zD>eo8*71v0WB9qn>h%T5jli!i>+Xsu*4;@U`aZD>o^1`&N|n38<i zC71oYaDOcOl9x7J8;@&aylZ1{Z7k8pJJ+VOliS+0=`CEl&k9NEL5ewR;iVQZl<4`P zE5*2y$9_EAFJ)iy(xz+WxK=E#vD_-3F9`4gU!s>g*JiSl*V?t2$*wi;MO@aLwn!#X ztTabye9vu=^9$>w4Vjuol8!XlYx_R(+$I;AuKnybg1Iq!$?DlatM_9k-p{RHr4+07 z+VumW$ZOYSI;67!-TJpO=W&3K%MG6~UfM8Q)>+X8dGR{e;iN^(Rv$Pza@IQsq5R}^ z$`UL;r?|#F{YtTkCwe2L)Jfx%W@&uzyiEvd`7);&x6t_-D$eLFXi1eD#$5f+np>eB zM=f&9=7C*#JFhHTScf@O>~vdp<R>GV@H}!RQ=2jJ{BUoz<dU5|j{#7h#zjwVUPx}@ z3z^Q#R%+g|K*tsPJZbA(4&OOHiwTQ(QX21=iz&HZBqroM#+fK>xH4N(v6p_z5bIz1 z*}t{EygnLxd3+!!#waYwS(MDAg0T{7n4hQq$9?(onoW%(-l|T+d`aBioa%hXNpWue zysI^rt}y(kR%B>PWS&+~<zq4~4vvql<vkN&vmju8d~A|$yushDUCN7!*JH~ra|n6g zvhKAvZO@x$o`ycuH})L1qKE3yP3)@>S_4vbKa0eVFPx4Kyoi~6uIz<?j~az8t;x$~ z->0-DuXl8pi2d4(SSYP1VJAO%w;*a~O<r7flQPa*F60~J;<)6B?-kd-+2Qb2wMRLV zS~4A&VN1z8M|3M0A)l<2j0DV^C$`kSG~T$BKvviy)cWitXfelM%Z4MpY=Syjr7E;B zqIt>mu|bd#%#x1sf@rbR%pL!*2J^;ZM8XM>jnp?yZe#kjpPN<0jf5v!gv;RkOQOB0 zeueA>7w^SLEBf54JkgG($@&bpV_A`QGb*Gg&dRXKXY9fQGb8)hi{x-Ce!YyidH0lh zp%j@YMaQam$Bald@Bu9SMhhA_6lb;^X2-I_J6WG_g&?2Lks1>(Z1%Ddn?dt9r_i=Z zrx8{@gH84tj7#)yP9RaH<YqNds7Toa7Y!j_Lh{)(Yfgi;v@hCw3&opF9yk*D@~>!F z{-WR<Zk44R5lSgJjYyU#v+=FVOw6?`GZ(pjg_JsT&qRPE5O5KatVs)gT))YY#zn}a z0PkSr8y=$02rK`SJKYOgOUu)tOIAzGC4aEdf9mb@c>R0ij^UL9$3<O@rgsZ2-qS6o zjuUxhZ~oKzuV34{sUwNfWaGib{zDEYAa8XB_*!T!gH9M?X5@of+^BCIXI-e+BN3-( zB#sO?t<qU{3C?W3Sl&J5oaSbKuyQH?sngwsnol8@Iv-h2KU}|!N~8icMGkDS!I>B9 zlb14AiVco;OPCv-!d!=ejq&>AufDjmk#*}*lrOIm$ki1Tamp^ndvu+zMHp|Dr&q<R z7zg{YoS^I`o_7ppGcIiGAsqyt=jSq>EoKIk(ueT-AFggA>DJPLHPhO#v%{Uj>0&lp z%fy1#<W0vfUf@sq<_u2;%@bE!D$bTr`Kj&;DIH48#}W-L>J%^K5U1*==SB)<0XAC| z%rl~iVk|B3imQdG6#pD%%}Sk&M)Q~bcpg)`ltrhNnCx$!m?{*1v!(K~gIe{Mog{x{ z{7&uf82s&!@b_1#6xCncG=H^E=1~7k(dzOg{W1BxU|WHUEo3IgH(+f~wR@S94S6~A z<T^$WahW|-WAihck8w8C^)U^FnW>EI;iIK8LV@MAnreUd@_Hs!F=+itd1WNZ>)BL_ zTPUyNU0%0TUi)k@t4%*8&G5xz-@2^NJa!<*QLC~P#T}8_+sPUVBQ-kgF6R0cmrox7 z4TZfDRn<lnr1<nMA0^5o5AvcnmjN+H!{Wq}b&uNhbuW)SKxB3iFZ?iXVmD4>iHhUB z@FV(Fp;X_?k)BSMp2;dY>n}O<7shoz@W~Cb)cpl-_&7a|#yQ|_A{X*SbM@VV3km+h z2csmn^7!CKsM0X|YlQWUv1{x9c2xQ!t2S|kgiOmiUauiX%$6Fg&u!MP3gvROC_{!i zj*B5C=hu&~tumMy$>4!o%wT5LeR-uV%F!J`lE06r*R$}Y2QM-rBfXelWXq#btG?)w z_4`#40uk6lPS<1keIFUtuzuB-$e!%GDs_KttG;rEt%y-{)@bs=!$EjCIBvT-3X%@( zhY_`5cn06k>MIv#VjPBv+`PH&M>0LHqDpi)Vf0kR%=vNZR7;d{;l$JxFFQ?7@t?(i zFA~3dM5TE*-EpZVjCGLsa+gTQ!CA+AQ{q%?(5A6W5wa#Th5s3eBwL$^WKK+omsWh? zr)tFaF%7eILMbxNgcfEDQ#C%|tvRE~^H%)v$zfa@V2QHNIR_!@i!xoSJyF85t@U$8 zm7FA}GnBQ2Qb|4L$9wV?!$?RsLK0DU@3}k8Zix2?>m7UZhxMd|CVkp29PjlKD;+%A zVC;~Ts!99)qCUhLxQ#Ds7&|?l(L1d<ga5fSk-=eob&u5THAVc)?-{?x_lzI=4)G~} z`QBTvR+$X*XP2zq^;@3Z?oL|@>W8LvO0_JXlPXTnX|G+dTgWYEJ>uI{wT8SHXN`qf z^%v0BM9c?lVshTJhzN20#ysj{QYDqO;4m4tXgFiEAy^CM4p>J?OlCpjo4E^<*xQn7 zX_9K`mQ<^fRI9e6Iz361xhq-Wo>`t9PN8_OkFw6t!s8CwDkqQkU{6COWV~dB4kDMT zpj@FUp&TK;POoE}blbdMa4akP<w?V{E_x*^`#IUJ7p*aInMk#`^_4aE78X)9O_tSE zZCsyBaely*hbwntG>;~-i%k1<r=f6ns=@}}rZ_dzbc|LHdJTEK#W7X8WV&8rsP;$K zGeoO}XLT=_Nj{XfmgW(w*`MTMtTt)1<{<-9ep)V~_{?r5k_4Kc(4lqOz7o_*bCzkY zRZaWM9}dUn$9rq6y3_TLLNsktK7m<BwGNkz%0+6a`@Duzb`Q^JSH`5_O?d(Xe77$> zzsu0(qnj~g&PZYiDF%cM1zmF4#`Vcz4H(_Q2I3?&u@N2EeE-`ZDe+~$*vcFza;5kK z5hQ=vPeXX(N4IX&bXPiBeY?;U>6iNT!mRpn+en_s1CH~AkQmW!8RnU*COOy|L^xw3 zI}A5Eq}%5Z?YgW>gi9s2sTbjvs^IXPlwx+GW!#>sWvt(VFFFDw=56xmNvoFCDDksX z=cPsbJKBujMp+P_94?a_PT_DyB3Fk6R?x-HS<#>nMdR?biSvfvrb_7N$r+`+52d(r zlid$PhbHSLRgh*XYwm8GhSL&r`*0C^Gi}V>nv&)@)CIbmMEL_7`_gYoFRqji70^ra z>}6fc@n3$;JyytdR#mmndsCMpL|r~wm2c`O=`W!!Uu2h1)MbPEXxtbrM}k>${jd<Z zEPQG1D#76n$`XdM+`}r6&aW36<t9L*Q<gUd$qvf0L3u2#bG%%WU|TF(t|XSyMSQE< zyp~}FYuPmi%czqrA4uRJL>b8)r7`j)0k%VB>ne0`L5HC;YwZFF@5~_<t$l46YdqRx zrC+nnZ5iw0{wR<A{N=;Rg=SSQm9EB9&FYwN2j?UV?*}z!5@C!`)3pSBr!-HKG{uCa zO<qYmyxdIFvwJUV0r|NL(t4#^Zo=4=ZXr6jzb{kT+}(A1DbO_O`=#{#^HP@VS<#YB zIgVK08)$m?Ivro-zU3Ib891l+Y?6;J9L@1Athu<G0EUXWdRvcvC!N#!-F!w*Hzw^F zstt8&iS8+CVY${gV*?r8=QhsVGr40)cay#oN{@}!yma|Q((*o287qf16l4yS=5mog z;O)_&^{|vR_d*^mu*_3EvFfSL-KZmpVJmcGXed1@bQ2d6+1i2&vO25P$asmBLDo-x zEk!-WMtnJDZGOTITUMx1v$^CfxAuaqRBp)cklS~aE2q(7`N{Z{=ee41WhJ-NtjtDl zH&hF*?~@Jd{UpDoBUBqR5Iy2#&5=<@+>q>32wUg#RwyTY7G=(7zn#x59TA_yM$;%0 zw^-9fo21^Y0DO~HkvnKIu!yFsoe6TVpmpeoW4ENG&?0eJ1g8ORt8?M#an_G`iDT_? zsanK3Ymhb`CJt$0y<udgt2V8vg$ugK*y?(owD_zAcZ(ZgrC8NUyOr)QCepbjo77;n zA10~CqcaU1A!>`H9I_){aUPY*bG;Hw;p>>}#+#Ojr)VhRLepG*ykK2?;f{D2gze96 zdPdf2Z9vxQ{HVqCEpF=9zgNom*qci_EKDVe)TP$NqHu><JZ}$UM-#GPu%Cp9LL|(O zAM(kER-O0$6jnIPu#+rJQ@jY8xpCjhvMdvn6I=dg0Owjr7%TLPv+}|59;`L$$EnmB z8XkVxxg0ZcZJ9)vO_-g_#cKA^))}71i9kC}!^j?kN2lfTrSuNXkES@E+h!)OsG)51 z{K%~*bRmf|qO9!odRCKqnc=TpF3xB>g`8F?NXS;FAjKn@a=DcQRm@H{7N{VaTizn| z851w(Rpi7Zp_>zy%*7p>p0r6?vbolMpkvcbC^|>z`I(7!k`=y8hCwhAIQNfu9D0#8 zXCXUMvNS!^s9!GW^j#G$ULhoXSPvUmW~*Xoo~qV!&y=w&JBd>vl!uan9xdIOQZ`p< zT$mn(Nj-<K=DoF=_3E;ft<RD=h>D(}O|!E=nXYN$l5w6Ry*SA*J#_G}o;1=+rFXQb zqElS?_es<hNw<i6QOBkeh};~hq}C~*)F(LweOr<qh@|(h%+xmz?HvVnlT@9|i%~4H zHcW;IZkB|a9AjxrdTlb!wZ;5KGF0t9b{e_5lJfh>O+Vv+fKBP-vd)Y_50X)mZ^j-^ zKwda6&38v}@kIu2*>VoqC42b7+8}#njNOly5+PqL$TiwL%UtskxJ9F!nMUE)_IA;H zW;kVUlrd&D*5(h3wcQQdr=w@hxrT(qy~Ndluxl+0UCaq{_U&E#z9U8b>eA%f+3WOr zd5eRD93%4VTt1V$_;dLJsx!RUS=cbIF&-WbsN6w>S4r0>Y?!~=g|j<IdKL0)C$|e@ zgm6Hib?}0GnZh*0^L1z-oDPkZctdBx`!x(N&~URXCofm7!+OJ$>3X4Kyxo^bSg~t8 zSfPnVtrR9%8Jd3O`Xnpz^7rI}Ykga{>(-^d{(s4PODHHSvRJgp?9^H+x=|EphAY^T zyP)r?`bKU`bd=I*C6{{x84(Ri%a%Whg|)3M#9PT*S||_=iP?q^rLE*GEtFFu1r)1| z;<!DN04e8wTDrhYJu~9_v~=~_pl+K1jZI53$gRaIRW;5hXN&(9)mBD^ol{~HUK?J= zAq73PYD7KR>4x<rHeJm*fh}!(8C7W$ElNAgNvde}-hYi3esm*DO;T;>JUBCJ?xh-H zD}!8eR)KRHXZ4Z9Bzm%B;1l6V;v7WHI)Q1eL{W%XEG%Q&FuU7ueJD->XX#WaIgWf; z!7fioVvQ1Ic*fv(M%LUb;8u==xyH%;+md-V=V73k``|6|5}LqKQ4n#GqY^la+kUNL z&5zTg63uNrda28DtxBXbv@FYn#5*ag8j{O0p@fUN=%J;H5|~_;7RSm`SjtizY@;ky zzm2kt%DkJ4#Lc9#jH=<ND6}d|2}~}_FjiQWjmY^FP1ya@)BM6-X(J7trMXdrKN7oJ zq3WHzn%K=;FWRbD_%8Yh-!rYjN?_I%zYj%?Y<0nfja2EwGLn5Ao)J1b*e5H?Gq$Mh z{auXl=KfnB5tk)OE0-nkqKpBJ%^j98UTkVP{x_`Q{=*V<Qk+jQIcjyhyyU%Qk_wl< z?bz-QnbuE}FMr>LD%ZN^v5_ArtyF%j<dm{hcN^K(uNX=Rcc?wUW!M5D3p|eND9Lu0 zNE_upT}jlKtlpt6ae(QVhe4T`>3H8rjCjX*7*y5Fn^D4{vtwavy)jNt4&5B>!+ygc zS*PE!PXuXKsvR3&7(K&eN7||+&IJ~WEK^US>7*jER&t(|gIwH`@?aL*!>1|57Ps!( zDA+JNJM@dGL)eUGOR-V)OHknIp=>(T?hsN&)|`J3(DW>`R8AhpbYMqP+Q62SSPbFH zAh(y;4~N?M1!7aKK7}Fq4fCbs3Kq(QR?bc$8E8J-S!tN9@np6d+Rbm67m3F+(xjUd znKH@al3Q+_+?~vahSm;pky+lsT{C7vE(Tv*%G@kVl0v6BGUo9GCMlDqe_~m3$T64{ zT-khUe-cqgOA#bzMcRoJL0ryVT4f~>b!_XX(w-!0;TEH|k>g&@w9WJ^$I%9psM4%C z@-S**-_}q!N}+UgRlJ@(j;5}DWjDW}bLzU)%FqaW12HTOi;x*c*kVaY)ljK<b$W;w zHyUR5v#|WyLf0Y_*=yat+bEKhjUZAadL}52O55?>D0$+G<TlYrJOQ|j-N+~yUEgOn z-EGwCiCSdTTcpV_IEk&*(&wurXLLDji6&0YnT9bZcAv_y3r`11L5PTD)q^M{x7)BN zNB1Jvj+}_EqV*sj*Aq$VQ{Dn2!+o?e#o$K%yt$+zHSg$G_~H)NiEfn$GrRP*9_mVq zlH_TINHNYPu}Cqx<w|z`C3mxWCEwYm>r2bFn+-HF_T>Sr@j9=}?~PE09h&uQ`5YDl zS5Lh$CMWbUCAq_`YE^3_r(~5;KY?5znEg^be2i}mgJ5Wp@r8)l`I4BNam({nlCqs! ziBDXOiODuk#vab7^-@UI0$EWFa@}r$ECD2H@8>qit%Hl`t4T?R4mF=ka7=Z2U&NtD z4@z?TdVWB8$`G#y2Mx*4kY<KGvfZ#q6jl!WgRewc?89+fWum(B>4J!?iihOnfsZM; z^q(zyRBa_k=3>vidHAY}XnojZ_AyUVwA<@pN>y3}4f9iZ_DsR%&0+KUX3tJcl-rFs zX|;$4z14%g#e-<IHO!V2WhuWrE|b<=My_I#t9CELfqzJIokWvry2-mY1^50#`Fx{y z=UIWG9~1rm3+36;%jn_+dYN{u=%7{qUZIUxndHWgSTy$d8oC@|I#3L{KO2%V9&Z&% zpO7n9gM!*^1~xYRLWKmWhE7Mq9ahA!&WxklAnitCG=?(67iD<tz{dL}*@#_&<9vRu zhuLOnEhokivGYmib$=V!*u1Z_2T|ZrshG0t5M?-Du(b7V>}*Ogp{-wCm|_6(>%&-M zD!0>XPthi?UoOP;aL1O}#;ho$OYkz+9+EA$%AExy;zy`~*Lhz0x1<^g)58XXYk~ZS z<E#^kb02Qiru0@GCXI^fP7aqQC2EdFU6`@Tb_NgYRd<kkGN6LgSN@p))Z^|#GDFh~ z%;Cl3=0n5%yj~c~wc!SvdA-);WyqY+i#eWTS{n0*wOqcN{Jg?e`*+dz^pEIU>7TD( z^DR+ugX6vG4sqpmx%ea9+saF*WqHx|%2sIOozlqtK`Z}W^)u5lI@EeQGVrfl;_V2f zu%n}f7InOSW29)Uey9%?6(lW^_D9Qg>wJEQFYORV_>VRu`5EByvy_BW<_F!d{^`Z? zoOEb~1{k`+?3r3N+qhy=Jh}#tP3$6@4z(SchbQFnz*%#?-)C{@tS&TveSEDsQ;0+o zsWb!~gBb4$B7D`RZNrtk(&#kLt(S`?w=eQccEer>9X>2J&EJKSr6{dV1$ijI#o!PT zul6O>h<3^zl2k$q(V{3AQNm(w$X}&%UMrA2U4h8@mxxlvDk+swNrCl4SEVePB&CLo zRY~R3qop)yERkl>dg>GtXKg_(S<ap22L(C%Oqpeh)eQ;<kRX$caCBiX&YRzJRZ`d* zN&rJ`HPM#iRccqH3RAYvh$}MX%jK~vUUm?6Hdgq>Z4Q#7jWks!X<Z)U?Xt8C*O9}W zOvke&A8h-{a7R^6@4)S<^U|cba(vNdMhQ-zmgBk=UsFk4f>pi*oB9)<Gws=^2D9Xg z5<;K9eC_AhZ+Jw%2Pz@W@-Yj6P{7%`?75iSrj+z?ZV<~*HnYtQw?hfGo4rHzc9z`K zn~s}9vliZqL<)_)L3L7-gH%Hn84cq2og1Gh|4H8LsKcQ{rn;dcgzJhO(F|?o&fH!| zB;mX}w|Qp@icT&qQw8aEhocSS@s?@If(@FK3>X~uNxf-+uCqx#d8l7KzSWV?2Emla zPY(P}J$b65Ycz7lPwVGuu$m%D`hJ@qo-?(+8Rc~i5$%vnGo$Dsp0dZ|BlV5j419iN zCKlqKe`t*|94d1j&&y0x#mDnHE9AB{g15SKrcc_14@!hX8!LD_Hc4BvVYPmGugK~O zeR8|y6|a}vT|MsD>%}luey6-Q>E~m9ElZ=+0%L|AOgIeCcw#kYOZF0HJcwn2lm1-1 z;mLW!{4K<!#Pq2s6lI`Hmww7x<QS#f($z<rf3nri*0+9upso8)v!%Fn`7IZ%5*<BU zwjNo28(zATGh(fAa^IWG_qNCEw_)YQ_%wY_(|FD;*^!5k=^-o7M^$e`$@ww4ljjgv z9_P-G^&JrI&BVJ&_%hYw+_bJ+v>03zGf}7a!n3i(0VEn{usll>d5;RI7fXPo&QqKp zu+a=q;>FSlMRps3b_2+?)F)1K^H`lg3LTqPsY_&uJvmO7GFk<CoGt}q^eC0)plcsv zye3d~q;#}ZTtF+Jh9f?acE4}{=!aTA)MY%9TfghSNimP2&Xo}^KTKJM?zq3Ww}ep5 zU(<OyKtxh?<@9(!UrQc1aA?a{9olL?Qk>F$@>ceP{DHzA7f-%^y+IV@7|3mWYQo;E z(9n5)K}OsK;}_p7q--siOWbqNm){C0a3XdVjTk#TzLG`@k=374ds-jz<^kD}A4dd5 zUHy3{0k-;6h`79+jO{$T&Mdq0*rjg8+%m8;fBJD4+3CVx*u*&8EMN~UX(;m3Pt3>; z#|#TaRdjewr37a!lu5FDHcIwzUN-fsI`EaPhWt4UA`2MnO_-du+R+%2>|=JhM72Fl zMuNF+D!~#-a=#HyHlL2^r1T`MrjuwDkqqzbik^qVqD3z%@@T!h^5Ktcomv-B%OrqX znfV!<eR20FyG^0L|02UcvmXFk86k_J;p{|wX`M(bp-)6+vWY}m>5+(NP>!;pdL+q< zq{bTovSc+bJMyCeHOkiBlnPh_S}kExIs!DH#cZewsgb0rAhqj5O;Mq34RP7y`g}&5 z7mSMBeMYw1{QPdd8}Lv{v@V+ci>kUMN<Z3dSX|!9V0SUt^gc<ruA`-%=sLA0CEC|o z)KauB2~NtC^R`Pm#@&v(-s~GvOCP0R>9|@Qk<{~CX>^rk@9V{Z6s0Jsi!7R+<}8t3 zi^8Hh<=&6{v}?+a_89@{R5l&57T(Neim7&Df)Zamh1W?E)~S9~C%Wd8tHZrVI>skH zpYJq>)i-90nAn)_l!w)?N*^)ti2^>Y`ZAI8U9@5Kk8~I@@p<duyg-YN#~_{Ekbkw# z8jfoyn4?E6jU-w}H;lfT5Z=;9acNg>$_s~Y-??3ZB?_2YpYPv_m?#GgZZ*O$&^uL; zOUobNv77#-zTU+lX}la6vVI?r>3STU-j%9<eVN{oCz%6Oq0>7&oW(dWWn<W;+Sxjh zCf~fWhw!ZWCy=;&FxboGv-DxiY;Eq`n}BRFBu7E6fNDa>@-V7z^3VtG`l-==GW8m7 zYZv>~jATbHVat_gj-pUZ<hczp`JiAy=AjgqgpHOZYtFo`?yxBvVR>OT@|v$9j`v5* z=0%-q+KbvDP_mvQbNr}~IV_jV4kfDxbB2@=41wg0W*LEu1o!io5$wzUVJekT)})i5 zhg7-}x}uZl$t5NEC~QWs1GG}5hd^tUPJz~`^epHu4Vwf#tzmVL#kdl(7<WPPYM+eY zMQE<3@mFXJDW(VV?QVIDEj{=OdS3N*VGi_++RKK_UMVEE1TumzJuODZ!ru2Zprf-g z68f{osDoZo`XyxfUGFIqkA{(UM$jFya*08w<5fnG1D&n@4T8>5%7u!QhC*YN@*w$~ zL3)r6ov9Ru#wis*<CO}biAn>v;T0w7RX!x|Kgb9cK~_RPhl*A2F-Vr6W(5C)ey7ws zlR8p533^hg3i_3n+69o+%(l!bWML+C30dBHLnUfC8<G}~9`u7IE9F2k)l3ftL1jw0 z(78(2LFV&akommHQxB#s7WO`Lv-<Ltgee7GgFs$omk|_p3xZ!Ny$+dPGqhgyK7dSb zFHVq5+7Eh8rTrn3-T*zJRzCH#|F%IOi`p}Sevsw2B+Hf1nLS*(du`{!=JU~>d(_Gk zkfrt#^t`6_8f2;c+e^Fb5CnfxX%=MC{UM7x2zo)KgT3@5NN(O|1fwAHs;sB;CAKrI zT|LO@<>*Jd1OW=fDD`x?r<<U#es^^}pf9vk(;Wh>)VKvunWlRRWa(ZDSwG(ZJ+FG7 zL$_$$uOZ9P9=o|59SYs1(&M1pl}e!BD4h#gj9)@`XxOiO*q6|Qn#Mu9yYXNIWaGj8 z(489NVaTkUxrfWqxzKM_S_zqS_dT6gIneJ^It==~(&^ALrBdiFr3KL4N>@T=WhG>_ z^)&PcmA(!wSNa0FN9jM1#ptzH5ZtR_@{L(5-NDd#TDnI<R=TG^Hg4<^bLBi9vT{Bj zx=*dl6bht%Z-C5~dmuSbWdx5yGS$fl{tn%*^e$vE_S~ECK*RQhEbId4!9ZgC7Fw(H zG-T!6V;?uF^n&EFS$eP+RIPLj^nlunLuT(;XpLHFh8|Su2VVO2zRu@O&_gQi+&c&! zR@w_{RLX(m5@bd&8hS+O49L>B1hSm}40=?hw?eCxRzZ&`Jq}rn*Ps{Fs}G^Ol{)re zF_P-_gsf)vgJyP+bo)Y9Ge<&JGX>Ce&3PeozS3w&zDJTCjDc#D#zM79<DojGVrYg^ zDRiOIKOrme?)$kC9|+kvemFE!^^S&SDV++fQJ>F*EN_#bKWUDxfYz$?YA;;^y{OV> zp(j-OI%N6%0Q#}!_fyF7o3TG(np!4wiBdP{Vx=C?Y^9#iMM}M(dZpc=xk`^imbZ<b zGO}GR_k*5PUk-)Lm*XLMjvyl_fXtWG&;#my+5wKvh9+y+Jm?{%JD>#`cNt`Hg9FLA zrqL0yvg!uCq+z>3mhLN%ygD!=xTLQ;N<INuSkHbgjlrJAdAbvlcjsjU+aBa-GPI3` zEr2>Iy$f|xI_Tga_=|cl05Y!zLx0t<IAmVkcSsPtu3-;AruQiHhK8;6Vb4MvH0*WA z;_jKlC1)*-eIYB2MNoy7)wcbeS0f<v^mfRkc>{u=QuR)NENqDnOB=|sM=f`P%yKnU zr7?O9a&#B8RQ2wKOfQp3rX4@}Ko;Y5PtX3ym0y>`To2d|x{Ojw5Bfk|wETub*7rw2 zZ)(nqp}#3z2)(5=8@f-ux&eAhX*pzZpMoy$B=z<x^tQ%$1G-Q3HbWL;r(74~Ajo1I z3N>ileCY2QcQ|Bm$3su5mGdD>tpR#R^%i-(`vwQWKQ!zC$l|VnHfq>9AND7xNyGjI ztyIfdL!9OPp?6i<4>Bt!K-McRhW@BA?uLG+^cTpy`VeZ?xSv55ciY3AbYJK_m1aXG zy%6fGweVBupDJDKr8hz{o6ZP+2brhOLvqI=BlytMc0*lQe@_LFdG$W@FSYV9Wa*xH zggZvP2AK!j9T@~4s9rzlL#5-PkCethA1hr6eWG+T^r_NX=rg6KAxq;0=yMHw#fNQx zHfh+uAj{FVN4e4+1X<r74w?6-L0@Q$vmmp)8nQC@$WtuOg%x_50-2TW!-C*TwX!{A zR{BFGJrep#rN?;bInYB|&P$=MRr&|Wd|n6rR(s=fkoCs5Av>yl0yU&bFWUrNuJkpu zKq)vn2o@@3K#P<zp(~ZTL02jDfPSiU24wyGHRwF`>e^$R_qRg-R{!pREN>^}Gow(w zMUdt42IxPkcQa&qA3^tYkk<4$WclcPtjk9ZWaHIwkoCbEeApY%X0`V=WcHdN?p0&& zOUTM9=Qz$%)t6c*O{Fs+i!mGOpkY@)7UPf5gX&cyWL|v&nJ-z#yRl?2WMOAOa#=DX zxZH=`3t7wVALl$uJ=lLZGb5#kp)#fGPGF9tlyjnML&tb}2%4qRH=v7@_AQ`p)#q%; z@^J{1p<zctmXF6Fv;5-`K`>k6E`csq>RIS~c?&Aiu%}LOF<u|Zn5|)(p`R$7K8n#> zsSdhSY4xct#;DVndu!M)#st9xr3=q+(#y{bf|oVy_s}a!A4470=S`61V>8rA!?r!k z<>MNtQDYoGHV9r*DuG^AI{F-!?s-syhCMdUQ7IWSuP*TPLNV=L^~RUbCbgzZAgk%W zKu@c*=VZ<ylq#q`YsI%f+p2%Rfz0PGA)DcKph_3h4$_0p(6ve<pe&6s60#T%LOnF> z5g#`C+#uLa!_I(A?-OWy4g11}-9IG=cF?egA=CRC)KkO$;luVV4}u*vEE_Vt;~>k& z>CjFp9qXmFUiwpLXO%AY(!W4=YH553^-}4-p<R?ZOy!J4rHdg;<4I^&l|BoZ2ZeMP zlb#LjrqT(JN!NMlE70yLecemH^3qHuG<&GDJ7jTx4VmTT(4Hz?>7_4u>08iVD&6R% zJ65?f|9r@-oC3vE?=;BLxDk3>bNLpuw^{MhJs2AI(Xf3Wi*YE!;Jz9*1hTL>kfm`Y z)LW(3c<BnLkA^+y!@AW3!G0RH9b{IHg3L+*w7*JE@zTj&S_@^XbcUDy0y;p$ZuDWd zLI-NtJ&=tck3xMl?0FydHuMW^*&Ctjl-`4`SNZ_DLFp6dmr9$U8<oC>mM8_aL2#2& z26UTJCUm<}H%ML^lpgee<OM|OK~LyrrC!jlly--fD#f5%lz50QxK$||`n6I&=uV{^ zXqi%Jof{eIp?;dnh0tSKzjr|gY1qAxmH30u!5X#>vJ%>18s~l*V>Wc9(t2p7Qn&Nn zQT%F1u197BOQ3;Dw?Nisj-DO_gEZ_U=uo9mkV$_E*<9dNXsAlxfsRmWhE`~5J!UXA zk++QCROm>R7C}cTO@d7C7AQ}{?t+FX-Rq^FLPu*@+66&yj8Z4a;+_EIYuIVfu}Wuo z>2&Bg4Z9Rtsa{<Vy`l6abiCQ4$aupso_2-Iavo&fkAa4(v=}-;sm$x$4gF5-9YP`3 zbP_8^LY7(~WT~Zd*tA*8DCk_ZG7g$zmLW@b0aUJGS3>ux<;Boc4f{1@mOFCrJwQu$ z59of?I|8auy#mPe)<OrVUI_=<N|l}mRVht_EZr-i->a2wvmG4?9jtK=_;C;%qI4Ft zztZK<9!mE^a^*fFcmg^wUFaFej$m&>HWTb!&wNeO&4H?w4u#BvIZ%y;ErM#5e&(fb zLv<SV0W?kNQ!hPn4%bUG>~v_l(pbnW&wyrV*j(rWrOUi@DRiNRErVt%-Q%VCbD8mI zSRr(g(y5SHUJhNXVU5sirN<zX_GF@RiH60XA1n2NOj-}sYuFXg9Hpzh^j_#5t&by_ z+RRny3D8fJPKM0NGti|P_9`?_=?yPEXCAlAHSApIGNnq$;=T{bsut#_&;q5+URpb! znYo6|hAvl{3x(-IS7_L)&?2Qby!3O(TGP<W7>86Ehpti@0hyIAp`U74r-mT7TB$2! z(roBw8a4>JMrp8@j)p9aYoIi3f44zDSH1fn>jAwMFbmQ!S&DG2(gBdAaU(P$UCLl7 zWG(hp=ohN@4s@MTGh{J3F68K<VcS7BDD4E9^m6EC4f_T3E2SH~^ghUZ-V7~OY1hj+ zRw(s=%u4qwIBICv_K=MNbD&>q*dpjQrJq3-<8A164f_E4jnb!Hx-W+Uxx<tZ90J{_ zGzhY|Cquv2wst*qrk2J{kd?*<&=QUDHFT3w+Ep&@RnRz%@pH&x{0X{4_1=K)RC*h- z)G~hRX8OlKzg6kU(C?H+L#8(w`m1_X2R*8^7BWx&3Ds-Z@mB{ycdh*qKXY@CGoeG& z-Z;q0uN=zJunQq;8$X9^)^Z2bU!}_+i&1=yv)o~^yE^zHRH6BO6|(%M|AHBTdXNLv zsq|3Dq;EksA8&^4MlU`12>OH4vg;VVm6k()R9XS8RC)lqPpJ`Fp|l!WuCx}qM`;~& zuhM$x0j0~Yr@o<#V7nW*-<Tn^6J&YY1A1A*`axD2<Di-9eKBO-uZ3Pwy%(TYm0p3Y zj^_N*UF*9RvMZ3kgRC@GL9c0y^^m3U33Q33@dadQymX`Uv}TDrn_UlGs(LR%rg!g6 zPVcOno!)Y2q3W%KLZ6p%-BIiE1t?SL707(v=2mweRSIF8a(NBvs%5q3uO0mn>a20s zKwXs9L1v{{^fc^qsGHK)UfTaRv>Xk~gTm5<x@j8EK@VxVg?9$Qk5q3gbeK{RWNADE z<!acI&|sx!y|l}3-Bqg*&=9i%S!(A&Z)h5qLx-#M1}|Oar4K{Pwft5?R(`omXsnlA z0)41f7DFE?{T}*Q=?Ul)rMI9@mC}j$nbO~&<x1x)b9C)puD{(1ov2>j0a=^e8+GfA z2SWua9SE891?V2NcOk`Nbd9ICp+BhfZVCWZYPG}tj*fsDHJ3+2mdl?)+iQI+g?3Q7 z8ycbMJ_Mbl^eANYvBMvoUd;n8?&A+~o~&`3p`J>g`mkN8W((W@VOORrA)5()2py&| zx;Ju;sB{dplTsnHmr^P8b|5*L<>@+TUzOelncg0&IOEf>Lm-P$2@TM&tDwV`?(uZ; zBaC_)w#d^B(4iW3m#5btS&EnuY=+EA<D<^<yPmdL?W8+F=F2^hrSX}k9UgOf6_C~W zh0yaIC5_pT)%i7E`YY&9D!t818@=>t=mnKN@1=i-a@FULpdm^f9(So_K`&~Io{*)s zKV&hkfPSPg9)#Y}vVRM*_Hz0f&bC!r1ih^7Y7%7aY8qto-TNTxM{=ubgIXB@?Wl2o z;puHpgP-D_gX*0N?XG%{Le@%NgJK%icb#h`H$oOx^)%;ED*X&PN@?UXE^Y<%vgY>! z=oO`lA#2(9LPu(hvS*#;8=!w^-fo60Z^PERG%oYB3d+&Ak3Hwo-TQf$?h(+dn%Z#a zHKmgvOLs10>F)F=mybHgdcf__$LhiFAoF177r2U}sf~p!ZqFCF9-(1Vq0L%;_d&fi zY}c0vP|AbeQ0eK=S891IWR`D$thO%vGoygUSPcD5eO?N^rF1)F-ai7ptzpkVe^>gG zm(F}S2u@QgH$v9q<x=C<>OnPRsa@*ndQU5%4XXE&r;j~#eASH>GoYO{jr*amG{)=D zdrCXM#`&~L`$PXw|MH-fDm@4Ko6;2M?@E7$HmcrRP?OR|$nyJ@gsI*^f3cN$8NoJx zbv>#l^sdI(1-ei5`auQi!BVJMrMG+O>(F}|_D{&X>hrprE%k#|6E{5=2H6-f2KuMQ zI2*DwrhDmJ=zW!5=A{on|I)ChAWP$I=s5LiFPei{?gxFKdi^1@JOTPp!_I>&?pYgL z+!@eEDxC+JbOm&ZT7CsG%O67@t6s*N950o2gFaP?L6+Jvkd5PKLKb&2^qK0Fd%d@z zlhb6J+?MJyy=>@n)f)_LQYwVLP&yR~%L=kIu7E7=_0X59cazua^_ENHXvp+VhQ3n0 z(U93|fWFqSMLz5X=ot0yK`5^DDRjJ2|F^kDt8@%xdS^mmexZM>y>iIXSPq$$*FAOn zyBh`egsg?-KxXgfkl9-X{imap)hcMS(#ufLNy7dLSsK|4@s`Fzkc}_vA+!89$Si04 z!&%-FO6w$64uLu-9S5Z=od}ubnUGn&+0zrAKJc{jMyGeArz@e|w5;CtVcXIH&E8PR zJRJ_1rxlRpd@huszFY>GFE@MX@1c$=UGAl8AUoo`?e+cxbyB^ocbQWw?FY%qMAooC zX1N^dtYH^I))#Ju-l3>7g8LxrZ=XVsYuM;!?<v$p<6Z`tz1yMBRc|@eRi%$YVgH3J zmpd}hbyMlCki{JgeW`KtAz3-e>Nd#Y&VelMVrW~H-T+zL<xrNT23d?xp?B0?)<4~- zHwv<Iy0f5HsH5~?0`#iV`H-bC2kN2r=0ldobx>Ee_ZU>D_4_JhG5!H<r!n4xEXIGJ zZW<%|eHY^h$YPuTZLcv-hAc)A)LmmVK$gZ5$YT5!+CgL74OxuU(6$=meaK>@|I5YL z73!%m_JS<N>0Vj^?WockFMSiT650s;UCZU)ka^JM1CH?;BMUNnLm-o$0`08Q)4X(* zm%a-1QfV`^i&BRV=?hBRKxS`O$a?L5&~7Rn0PU`H7-UDa0?2w)iKmM^E%US<8m_hV zl@HtPBNw(3vQhah$nx<4w1=klDP&${e(XlV-91f&^40Qm$l}h0_SCqSK^FH0$VSn- zJZ*w3Zud`I++Cr)H11xI#T@`y+)Bt|Tn$-jcR(?Xu?(^puRzvo|LH01Q)gvIPX~C) zgUsFtXm7PQ5;A*JpnWu~%7>i~?W<uwfvmsX3iZ~oJG|cAP#+Cj<@LUR_S3Ncc)gCF zadle5x<Hohc2Ks4#UM-La)?O)Bg3tp)<OrU-qVo9eE~X9!(Q=W8=$@#_Akin4gZ|= zglezHCU@8TKu^~~kErx+=-*05f8pk*qoMz3SR-W8!3<!%wMCo=ne+z8N_RQbPd!)( zg`Rrpo6tcjeaA~XedX$HA5TYkI>l3WCa0FhuF%11WiQCm7ywxt8Ur1x{w?<OTgc+x z4;`X$ABHUM^N_`T$J4fC)~xIcS=<~bN8=s}S==~eamRX^16kZ_A&Yw})L-M?0a@HX zL)MC$J$0f$&EBq_20`~|EgS=x<uQ<1E`bK9<#QpkJPR@_zk)2rgPxv;Ebbf7K#lu0 zWN|--EN<7$j!uHCU)Det_cBOU_h$rGKo<8NFMR|$RHbXY^i|06`@W|Roc`EI7=wPK zG5SDeuOD=nh8+%Bd%hjA(R&&6DK(uQd;rPw1sPoFadE$f25VSXF2GydzL1s1QJyY@ zUe?lm1sb9;UWd$sze9&>*e8%#8N>2Oi!l+Brx`MWYRIIE($m73(ftsUOQdT&y#m?Q zl=O_WaAtHcbc9+N2wA#Apd&SGIAoTWLq}=YO0U-l<!RWnUhnvhY2i`hRZpKl%hi`- zJEeukiYd?u+Edm-Rx=Z}Nek~8)<f0~e(vdE$jWb{5Bu7aJa1^y5zz5!xyaLnka=*K z*ZYH)uJQB%WUYO(*E_zm^RE^%%TM~S?ktbAbbkby^aM}mc&hgFN62Dq%ca#tS}ubi z3#);KX_-!ktUg|Z%yQRmX~EGd?E#r|XXqFW+YhqZIvui}QUT?wv<9*mmwV}T(6K6A z;-ybR$7$H}KI|3fcn#YKSsF2JE||}ULYCUmkUT?^5gZR$YG*>`eWll%2@O}hOT6CI zkhO!`AdB%9WR^dGPS6;iLS{LW8_^bH5M;g#hb+cv(1{x3EXZP1KxX;Jp04rq8&4lY zW-l|#+1nA4r-CwqT_Lk~I%G9C3$hqjLFU1Y&<KsO6tWoiLFU0zp8gJ5>-+>VE1i2d zD?33asg>OzvvM$GRxXFE#eNKhK6ByKJlGLB*?fj9?m>{njYAe=tf%uJi+d4NsB!Bd zi+c@Zaew3KG03dE;^}?Jtb7HXqE_T0p;_4hvU=MeI!62I^-x^t4#?~^LT2S@Xrx+s z9x^L`hs??so_6PQ^@(a_7-VtBK%+G7*^tGp^U@zfqg8sTm)-(dE?0W`1TuSFxo~}| z#^?c=y}po1bD`5zdW4sr4Vk?LPo25gX)$(!PS+T_L1u5HmyUzRsI=Hie*)RHg2j-H z^0#=p53*7IO~}&t6goq#d<j_^`*AVx9UXnngsc|IJuQH&K2}3^{`-ZO?#RWpGu2*i z$i{;sAghm4Je5F}^BJD5g_!QqkGAQR7S85&fxghN0gy?5;iY$a=_<%_^cr-Qdhi}J zRw<oAIa?_cvRv*4S>6tU>>5u#WL8dr&e0gBK^EgW=wxj}PeNQ;!P7T9b>z~*Nh&=I zqA-yThpfa;gDl1rPgg<~<57qrB*x2-dGL2=oO<vsWFG9z#f|YAwjX3+10l=DD9CE2 z0SbGgr*|NnC5^8jOCyu&D^h#iA+whcP0+C6KI}Be(wGKW8oz@qjdvll{I%EHlZ7sp zMqg;6+RK3~jUp)Y)YD3cjN;$tK5P#P&-C&=P4RS<r<I<%QITX1D<?t)N@qjn{c^~> zS_KuWSC2#HRri=n?PO1Np04-woTuJ<yVNE^mRcQTsjY)7wO61LP3?8aQtQLb9?RQg zPYXRQ_w<^lq5HbjE`%(#g^;B-sJBaP1T;xgI|rJqR0owRT>zN}D<JdWJx@FIabZI| zP51Por>{Kiv!9DG+|#9=I_&R!9tN4uqaZHNQAd+K{T#Bgx&taxPnSXF>61{t)@6rm zr?(SyuIlXunckt0>0J(48ml0){30|(W4sDkj87noG2#Fh<HwN2xCScM7}r4-;~vOj ztbr_z*F62pQ~H5US_@58D>ERovIw#?mO>ROz1>S6g)EI1z21A!<*N4;RH+p7b@q0J zj@1(C2U$4}gDj1cpel_q3NjBSLvLs;T;lb92A!vRzwmm$g&0Vwt^1)jHO3lGFL-(r zI$HHUge=|vK-Fq5y`M{W2Wa;UvDXV4sWGyl)0J|e$Ds6JDD;$49`v|UKJ>Iw9C}8n z0D4xb5L&M^8hTD?4D=_ZvCs=j<Dr+7ilIL%l|nBol|#KchzC{BE=sk~T9r<Ro=}<z ztx=i{J*hMY+D&83gLYL~0PU`{2--vGYG|FtSPVU{bUn1EN|!);DJ_L!O1DA#D%}aa zs4<p7@(H{2U^%pp(hBGel|BG%P-=wUR9X%FO=&IkmeM-tZKd_lYf3Lbe^GiF`m54k zpx2c)Kz%f|jDwgdXjmrn52bF<Mx`E5lTuIUU8P=7v(oO+drC3rpGv)<{nT<c^uC7m zgZ`zI1AU-02>MVd7qS>bp^r2y5BgXsANoWo4s}(_1yDDoLdfEdhPrFm7-(Ciu~3%M zc&LX`F|?ghDP(cWq3t!S3X=CMqzAQ7Po?S5j!HA3os?!n7I%)PdC<-(T>yQiJ}-hk zSGpS7q_i0NLg{*Fe~q!k(^5~jdAifnGEd7rt?={!^rc#EguYT*4SlV&7W%i+I_N)2 z>!Hm`FF=9%@-mdB^cSdu(grA9>1{~fNs%6GggPp{2X#{V0NO_B6Ug$m3Ch&4uc6LL zrySzWiq3&n>xfk0>6c!*8nQE>U2+`dL4VK~r~9zwo?i3Pk9^q4{axH?ki}i-!|wI; zs;B!0(AqVPZUbrUO0yttN-*kOFo>3|v>E!X(t;n+#+4p`%;$GKZGV^xtAjZ3V&x@I z8z3(06SiBf(;MpPcF1D%8cciExcfkTbOhcXvJrR^bh6&<tAlLb-T)P9*w3L;l&*(X zXlf5bBQ@+PXq3`=FZ~!Atzny?Q<XA?xVXDPr)k)MkfoLnS<cUePFLv+FI@wT(Xc;3 zXDGc4nJ;4wPYc(FUE*m2bf)UP2c4z#A!IQ+59QoI!*+zuR@xOZX)g3v&E+EK9F<-V zjZ?bG>#c;wYuIB@k<yc1+VKcRQMGac^r})LG(q*&K@*jpgDl-9s93{3g-VpZ^wL9* zboS1JURHZ6p;wgt?CDca1CB}y*G!xVF>RogltCPpp&1ZEIn)SEGOwV?<`raK-IT}N zQNw-<l_}i~nRN0nm&P>c9rfi_CIZ{5<z1MZ8Wli2HEbMYS2Y$xzt<Q|Om}R~@EP=b zP2(%b<|?C^+L*KyqGRCmG-#RX&4KPx`YCj%N^gSh*0A40e^7b|GGEp~%Qfs(=pLme zh)#;-&!KxYtmAQbptK(}PiHbiA)ALSf>x;XXQHS1_!zRh?Rh*cTcrm=_bVL&S*g7X zncg9BM>C)+G>xA@cJ}@{WM1VCPYeF2R`Q_-l!ilQ?_6j*^?o|^pi1XJ4=K&}dcW~{ zE1-u}x*BR!dcy0y3t35aJHgT3&??nC2zo?m0AwCq?Dh5=;bM%3xM5G3W^tnXsK(e0 zTCEg=Ebdj%V;c5L=y9cAd1?O1Ze-ZxX<(r{pRR<g)h&hAXxwGcTBUm+OCx@YE6H=9 zCscYa^rTWHWO@%ng*rN}hHP|v0Xkhv_aFkcQyS*!Waufiau&2sX*^{1YP{Zco_ddR z?Rh9<t?49B6QHNn%4Epe)lVSn0l)Nm%RH@yp3xXjKo+B5bXvdxhO#e%I7mPjK~}44 zAqHl`K836$4n5U{9e<ijZ8Y?(T0R3Z%iSpo^Q8}D-XG@aL}<OnD1<D=GRR`A^?I** zdLMdDV|)x*jFZPWuO@rC1Tvqm^<j5;dc)J_o_0TjqlVVy-Vnu4e)G?CmQVFG)6*hP zw?cM2ddi1&ILpP|eH=#vvkaN#>5%o`C!v=#M=wEtR(cJx7ID*f?yRUU6N<P~qjaOE zLngSeb3NVS>BxyrTI*@YVvZH+%dU|5av(%ulHUr*yt)-SOvC;R?V{AR#Mv7MO;Ibw zkXbnoGAoBqN(<L4u7|9>yyxlM$u8_Co_dzLupCeKdwR*!z%s@)9U~f`2bF#UJ*4zc zs7Af|2r{pZJl9FbdwLV9)v@yf$YvBBr}#5ms7|GeAd}wWrQ4OK1=Ca-gG_oTWM{`` zK<BHp)Jtc1>6_4WOV>*~PIYltLmc9$g%_b2s`n;zfzmsWwTREWUV24ZaG^@Khs>A# zA@ijPGJBsvGgYr+rPJFLGQC>J^e%yBsoo;5cZ=8STjlg}p^H@Sc*xQn3z@y^&r1s$ zv=(lHtQNk6{-Q0rbG3`H8)PwVghpu2AAtU<dTXKAm7azy=WjtaGJF8Nq0&zw8wC!k zao11^A=9gYHmKfo$n+L@=?&1ED!tiDH$m0|y4Sk=UI4wLdKW`x<z6VRK0gC-)17)d zq0WWXc={b=N3}+%!0H#eMoZ{bXrzYy1G3(eJI#4;^ZCx+K{Fh6xWG}3r>PgZ>t+{2 zmd1V1^_s>5kfpH>vNXESba|TwSw3F$v;neS+jW+^)0z#Ppq>t^nOIU$TvAPz^*3yK zSxrIFgp%^e{^%K1C9-?8{FS3FN)lKT?&p`(lufP}QB;+*UszdFR$EqCfflQa<d6T3 ziOU|_qN;dF+2qn%+YOE>Evi1fthlx`vR^c@wxoJgiK>WP_thGA|4Wh`Kel3GWpP=> z<WUn#OQz!OvF4?0CF+Qh+Ul~2#FhQZsa4{dxG($pWz{7U#ZgI`{o^VtYNPrmmQ+{d z7u6Q2XUJv0u&AtBJz;+|j!lt3jbAfS(hH6&np##q<D??-MSf!R=%XvA+n((wr0my~ zmq+)9*Bo6`QzEe}#_*bBhUX`CgW)yDl}#@xE-b5^s6`g;pXTfjuPrJsn>egua(PK` zVj<6u6vp`*!`~S}0ZLR>RiwCrFvFB~O>h$OlPYV=CgOXcR2sigwMEsnQt!GK?kAP3 z2~;mq!nz+RVckzE;YhqlNvmF@q?7k^%pWiBZ~Kv&7*$&wKVAJUK25d}ktTSmH2U(g ziW1jK&5gi^k1j2nIHjVbh76xZsh)NkZKSd~IIX0*Mw*J)JUvJL#_)GWaC(2ZKinT4 z1E0ZPq=6fUMu<BmZ2eU=MRn3BYOCwCr5rP4Y+-ffxg=IIc34#vby%c*Xl!luw6c=( z$CgZ|PgE3@kDXLqQc_DF99vU8ajaSyTQq5ERZ(?K$-xtOE6Aj&<8)_Stu)VZQ;0Pr zR#q{MW>FlgsGB;Wq&ikPDW=kxNNc)C5xDwI9luXqBtoB>SjqG%JS{2i63mdu{8GnD zm0ql*f<9RyMkbb&6xYORYO70%rp9W@E-2~JhMn5V%GlJRiWw0vV#RdLZ%V(cqNZ-r zq_T-+q#4OP1w;p>Kx<-?Dy!9@8L>X(hBv%0I#gDa&xlE;_@&NQpPD|!QC}oW6iZD> zNd-p4MjP?A5X;hY|F?g8kh-R6Fn*<K4<e1Jw2QWdg#Xcav;(i0)C?l|jp`@r-$(n# zdXL8U^`3~Xtu<ONQT=aU-_q_=*LT#e*0=W|QPZjVO;Wt#r1A>ehtzR<)vs$WE$T}; zN1~c*N+woT6vs*{tIICn$Wl}uZMz6%qzTLQJKFPQLmx<GuHEz7-sRU`_S!nmwU>QY zKka32@4fdPe$r{f3Wn#$jvhAZ*dgp|5^PUC?bwmW6`Xv!hOvL_N%^spkBj9G8$Hac z1zQMj8UNIi@*@Vrj8xT(t1X&PUNWwzxH!>Z%Q#9;Pim3hC%;uSl@rdbk)tF1bxK*) zIF2~XfriAUmete%v5Do(3)vQzl$T9qf><3Jf8_p2$$zi*8%;mVcDvats;Mcdmi`-? zR8&@8QXGS1dc)yN4)c=;i}m3U-(KZMed+X~dYqPI;iz%7l~YQXV$@Z*Nx{|>XS@01 z%Ck+sCe~F~%h6xmjFr{I#`l@Hf9!l_d8M*fQ&K+Zps?O)0>08?ZT%+H)%xjF5oSv< zQdL=2QR}0sOYK$OZhknasJuodic}_llfu99;@0^uuPiDaH>s?ooc`piq$pOwj3>rq z$J)MkHgz^7langzIA&O}$%K(Pr!*=Kv9%>dI#+UO%eKApo2bWVJ}Re`RG(kXStXrR zv!-o2mfff30Md>fLZO7e)bV{ekg002P+KxtCVyoWu?dn(F*~6$X~1c({KU@cQ(hd4 z{GH8P+nIyO>75;xIR_{$tCors=j23KGV=}j(2CGpFc~2mwWZR{V>NXXimI!NW^@Ts z*DLjSh&v;7(GJm5`&e<A9=D6CiOjG4@-Nn?qZH*pQTShbrYCk2<yTudZo&*s`iI0u zgu{J}oYS@#?}z?h8t=E{$CeH|?NuJN{l`tHD=X)uSB|jbm<QI<%7(-$Dr1#(wR)te zt&AbEL9B)j->&sf{{KhQcMa_OlxJ=KiBpTJZ2s`yINttmN{=zTyqH0pc3R9?inLR^ ze8Ks-T)9ik3AylB#33lV|A4;7o_yQ^;SsFuc##PS`ZC&u<G#jhJ03k_d~w;d{bNOw zWF}Z%R6V&Q5w-1j-!(mVZAJzuN~73v)^<AI)jvkPiBn>7B%M@VdA<|^hjaatKJxwg zhgF?kf7;6VXxsVIbN)JJXO&eY)kPItAYw`@$2ZGBwwy%E0kvOZb`us_th8pr`Q%0O zW@t=xN*?7Gn^;s{&SBDB_-@+|S1+P0$5=ZfX<Of4tKi}xm&W8+Ty59ZB;B^-kxu0l zIU1Ert*V{jqQ$C9YU{YP+;+T3do$f{XxDWWrIe<gB2-C7vkP7aA6!yVeDJ{<SN>}| zJ=)#*a-qIoI5VuQ+QM|O-P)6so&4IXeR2n&wq{~=Syk;pGN}7`V<g{Y6=k(Uw8f3D zs*!1P&Hk~emBn?ONio;2sH}|@P2*fk&RVtD+SR{_lO`nw!s-&n!ji-g$gKcrACowU z`v$40f4}k}P2YiI81`xODIVf-_<hQstJKxZc=Z7K-#C8$kY0PA|0n7%Y;NDHKSt}P zz3u(bzS`q@Polp6|6ZQ|TiV~mNdv}BD6cE28E1z#?%Q)WfLTXH$z<*{PAiFVXP_ij zs<$o~^uMkC_d7nQXaB|H!z4Qxxyonz{rpeZ`|tFZ|2^rsDr&F#X>WT!)OULvZ~phR z=O5b3|Bm(|$Is*oS`%3wW;b7IV%f5aF4q5mA+b?)6Xb%tyA^qG?9`f)*m%xHrxr~q z85f@H?axgQ;<|G&8N>d+Iv)NozJBw1t*V+I#yh!o)PDD;e<;r%%5&@2Oa9RR+WY#@ z5B=|l{`W)wbL+9A<I4~8p&#Z$(f07e`JbKt$@!67i7cq(hV00a$*f>Jnx*>Oa1YOo z<d$0rCrGJpkG9+S&kyzSKXX1V_ZhjP9*a$^Ii|9*x;PdqcECChZnefHl^0F6`{$z= zMCI8fSu;0*KOQ&Jug|k#om-!Q7u3mWw?2m*JYZ5{b0{WRwy*y<asGbi%cU$Gu?58c zo%ZrWdhI)(`k_33D9>**KmGRYB^EoLg&`6z#;Wi>G8ARY|8AYyH_7FAD6v_S!f{d7 z^vBs_8H#)IEfl&HMX}g$)skCynre$Aze%p6>yX%4RcG@=SnRCHXP2@tCU#cs*(~ch zYr@%;wY8N~V`mkdT{&?IYnjd(b@q%3)?o2$Xm}BFILGcX9wZ9g^6Nyz>l*fS%evBY z>tr#M7t4^XzaPfqwx8#$s*zItZys+*t~y-c+Aj5zu(!3x%UJf*qM9kTP+MGx<xKCB zGhj^M`p@@kFW=su|8{zMzo2qdZOK%BcfienPYM^_*}VZ-<9G;vu_7K`mAeA0ll<QE zn?(79)&D)`O9^{hUH?Pfa`cInQ+d>v^^-iQRaH`aqzyQBzCfR;8a+TBKOd!!aJ4*H z*z(#~mp9qASN-zb)0B$J^DC%@#Nu7-$ENW_S>z$Mc1w>{hZQ`1(_Z#mnY5QZ*5J~H zOQ(umW4=nlK`V9rC6+cuo=ug(kEgwBrbx|GjtP6pTW61D&K#`51C+NW_NKA~I(*2% zWu9$n|5~=Mt?G(uHKs2aNTd@hm1iw#D_xSYX^DL)pI9{ys!ikh!wP$GM6B8ZB!<e{ zYG?8g3Cl!lORb;i`sT^9_SjO2u6Is6CDo4YKfA1WI+IIQWAjv%t|%%mAs+;}p<5kk zxAyhlPS4g>$Fj>yil)hAD`oE5u{=vBmCK{Aoc`()urb~5Z<R|)YB;+|<4*qp{akss z8D3mj8+|mpO+D>n1H-;MP}`nVV0+cyRv!;I1Ze-Stk%5Cx@+B!_Je4?Yf6e_ZpwN# znQ-!4r|xRoYft|vH~%nUG>!HupVZ?}V*VWSLz1L^Kx}gPjH*(7xRXb>WJ!AR0(Du< zt&gb6nsF`2utff+{Pj;&;C)P%MCi+XV){S=PukQ?Wf+ljoc8js&2}C>9}+8?pr=&w z2%NSrhECn`%!qDTAF11t^JLR@zvEa_Udbs^wT!)O9q)YQg%>yNkrtjnO+1wIU#Xv# zenc9zj600wEg$f0ulh*czFYd^9?Vx~^l?os{IG0f(_a2KlkH_Mb^ekbkDppsURzd0 zPi2n7A(Q8u<UuE1G8D~Yd->z?*Op&pyg!Qv<R?a7kJHM*XvYi<{&)Oq*)IIx?>ZWf z74vj;@!9=&HmRmG#v|_KbrWUcm^!~L?YYs&cU)&LS{0h(_R4RY<55+mT-Nr#t@EGr zovD@8JlF3Ym6O*Q`OHK!(Qf`1SL^v^tg6nA$CFEJTQ;eLHx&3JWAf-;<y75|(Vzrk zHRn}}a;&&cPFVwa15`L|4eWM+%!4b-MY+v#swt@rU+JK4U2p}Kq#u1AP!i%NLz*0J z!riTGA4kih)3}y&t*al;=AF;U9kaoM!zbsk{|)oRb}RphT&j_iBg+=^G|ra7eVN~< zZa0zhtmw&=luPx0>3pa(Ii1vgw(OtZ_Iyjvp|px))28W;I|GZAmbTb;ax2K#G$#+w zx58&*8C(MS+d6-@eEq>}9en7d<Jzt#ofFwIQE9R@jBB-}TpEe-_MKzm!$$h{>sOP; zN~){r_4fKQecn}a^!?f!FJvpW=iRMzzOOx<=Oh{Ye*XPnuf57|YtP5pE4}|+?J14V zyL7JZSe152hhUehcC1S4(jn+FvQyPAx#>aow0(k3;W0mxce1ACbO?6-s7F;A9~9Z4 zI;$#;&x!P`W}gqQWL?#@D(yh_?`EG5)a)_<TW%{hx9{X_yEM}Hlu6b|;)U@o%>#X! z^1fKr8PGNKC)>+%MaE}nx?F|b1Muf6{5dc^=y`LGs;u$I_*_n}>YkS7fEH=XzKiR8 z|4~M;N7|0TPE|XO-{tspz9Bax*fGp|BWdjt7x^reOAA?_P8yOgvE|B+kF;z%po^8y z0Q?ajM&bjXSP{Evo%pH<Hq&-Z4|bg(A#m69pzA){RCN-T_#=t$e3x<_iJh=cwA`cn zV&})-U}pg7J3DUc?78iZ>A{W@wyWx~C4ZuJT)dX{q&<wJ{tsk(6<a<svt#vkRcRgh zu8QPa@>fm%c1{m=PTM}{;mYFXFb~ddm$aaZ$fE6MB;_pag|^_!UG!bu%GR|fxApd{ z{q1tJq}xx^r3wRH$)2dgmbP5mZW-?Ooo}KyfV{S~b^5NX`cbFPQ>QL35?&qFaWpSZ zPul0*VV<Q7#GY&={c8G{q$_>SwViDApGRNpZy)xp>TrKRWMAw`_yFuYj~%yl@myU= zdfStp>|aIQxw1{Q6?;+r?L+<T377b8|Ef^0I<zZoLhMO=K6%uA`_48d+|7R9biR*q zaL`rSL$prBCzqDny8ac`jrG}4zR%9)OFdd{cZcKL0BrPR%$N|48Hc3v#lv1fmZUW( zop1JK2R((w{z!BWm2qKv9T$B4xisC@wOzL#meVdLWd!@C9nsxdI^#zfcKI0Bt{?4C zmDVpK*dc9?pj%bf@xC5ieY&)x<t^pp%FDGo*B(V*^0foseR6$hWF)_?tlHW-zoi~N z!cORijm^9J@pnD_Cr!qUN5XOAkgz>!8THgMvT<}LKaSo;oLz==2)6%7YSUIp`7!dq zaLf?Dq^zAElKueNhuex=^5^tiIY~bnKtFPNa!k0JeP>6?YXIdY<;57aOMZu7_m6CZ z7iY}ZJ-x3R2vc3gvEJ~hj1}p@Vo%FG#gLeEkf%+wGz;6vyU~qmJ35kYfm@h-{m@9> z*KZVT<EW=65(}7;``_O^G4GA=XQbwScjANl$<fmN{tyXoa)E4P_~(AtMD%+`_<5(m zme0-mUo?D`4-JCLBm92Ew+kZS^35CfyDgH|7cP+P*^%%+MR?zcj<hcK+s^^psT`@@ zZ+#^1OCxsjyE}~__&lPMlL!v@l!E^a_LN-yg^_UoLLb7mkA#;-?BqwnXGQph2#<(x z-$>l>_L)kf^>uwjr!D&rM{GvzPmY8~ZAR;&K2kp4)_&CgHq(mOKRME7CPjRUrYqkl zbH9%x^>|LC9A-KNw(>qk_q*8v+eHyRFT&CObyOrg%1a~RA4WKu?un7`J?ZW4cZvhH z^6qx`i}JfJkgfavfdriy36HXTzsmjQIAFUq98Gs~B<_ci^895a{H;iM)Q2c9jOe@> ziF;0j$3-|jqAy>pbicbDu;rsJ{uhn=h7S$&dz)@IFQPv;!p}wc#R&7cF#mhPQxL=> z936+F{qeAf&X5Sd9^u0y94&|2BjM5U=e|hzxe<=`-;*QZvL@O6?uz84vYQJHf+r$l zV|F4q=+_4C5(&Q`!Wo%~ol7G&_e}%`at7&sCr5O?ityu3f$dWf{XvoN?b_g|Z&96X zBX*XYnuwg1k>DLU(z>5~*Tns*9I(A4!q-K3_lQ0pvGKq2Jq7w@7PlL%qXHMmwtu9Z z?-L1ct1j9KkLLZ&h(DJ__{z?S1bRlsqTM1oA4ZPLpGV4y5Bd4u>5;n2iiDSWjUd=N z!q>FH4@AN@M0m%D&5I-9=S4W$PIiriN9P^`B6bEv%K4Q@9_8CL?zb99=Sw?5U?k03 z>L)$u21yC02R%IXgmP8d3zB0!=Lw!-5R+cQdP6(#mmWx8Gm=_7TBXw0*QiulyHPH5 zqDqHCYgL-(DIXf4(l{hzRJuNeU{uKd$toQUJ*m<$p2k9>RXQGeiof)r*i$KVhDyt! zbt;v<U{nj8rPArp(<+_mX*P7WO6Ne&@RuIU^RxgOr_x2xvnsvX(_*MdrPo92Rl3B} zQfQ(|Z-buWFFm-^(=w<;rOTn`Rl35{1JJoDZG`^BU%J+<(OUMaRVq1rL8X$qk^En$ z(wCtZRr(iC8=zS#eH(g-KfWaE={-nhOzHYP)IY2A6aF{a1kF?F*N}|rbST=PQ3kY7 zr80KP{S?}trykH1DwP>}xk`I^l2PeOmCE_aRF(Gjlnwn<rTw4^mF9So^O&EhRL&bJ zRXWs@97lhl(tM~&rEyO(dfuqgLP+{)dNA6PTyeQYrDGvEVx|Y<JrzU0Q)wwwqtbFu zeE2K4SEaR3txBhRnhC8`>1?P@rE@&ZgC0`p0!U`&>A|A^!`iuk$5~bTdrAuwD3BtT z0u=@fP_&l0UjPpQ+ESpGKnql@CTWv2p=mSbQc^@2phCf_Q3_N+2w1R6(WphL7LCBs z9zo1e#40FJP%DB)tymD{|E~Sr_S!Qkp6B_`lgV$*yVl;{zJ2?<&Nrd80c*&3H)6@W zJwA3vXboUJV!WHM`iysTXl=oI%y<W}))?>B(AtLeJ>%VuC0oq#v7yj<3~Pt+?!fw> z@jek+!&pBs-lwpxGTxn`^(@vC#yf%~#}4DoFJ^nzF4&XC`x4fNjdwJ(c4Ntr(0KFv z%`&f!H@~RtSus36HeUHv<g)R~uN`~VB&?^5SAKo^8sp`V+P64y8GG7z<=4fpHC|4% z`c^I0PTtIa{J+k4InCu;oLr9m!gytdUTeHEt9sU%SkD@79sfUKyfZ^<4%V-XcP{_0 zH{SZtl6h{#co*~k2IE~4T8&u0G2UkW%S<&s))rbFST7iFiT^hmZ%=6TVg1f{uj2nr z##;`pwOG51cOCyfYP{=1s~_t{<K4jj^~Sp~wC=!q$#@6&FZ0g$*rw3hjP)nu-NOH$ z8}DFfZN(Zj-fjH<h4F3=ts$(x8t-HLf5v!sgw_*SyN!34|1!&sH~sBdJ7KRF@3Z{> zrSXo0mbB9z<CR)}%y^{^o+TxE&3Gk$**Y`+LhE&`H;fk?`-JgM2(5`SE%Ijm<A1;L z)`S+P@M7bQcMAVyADiuOXvMMiHQrkOf692Lh1PVe{f#%l|C^1MQ-8k2MUdD5#(O6J zHyCeSXwAgp^gT<P!+$yMVEY?d^;icR?;`$>81LfHT7q?`@iy}R*T&l%T5VX9jkkmU zzcJoYX!T&d#d!Pp|Ge>D6<TF1PRvo3wfuj<c-Mv2dMr-A<L&3a9KVc@Z3wN6SVtT0 z9sK{D@eYL6CahzPcQgNgZ@gPVYY^+L#=DjOvIQI;+ZI~ev5q(1A^!itcpnR`9atwA z?-Tt0wDAsy)>BxV1}49q{D0ASpAD@MtQp4p0{{PLyt_i{C9H(;j`Cl&#^YnVLu(IK z%6MPr|I5ZJyM3ND0V`v?6S4keypuw!1}kU0hhzQOc&CKcRIGyW#<50?w>Gq<VV!Qg zocfLZ#ds5;mBBjGcnes6HQqBrs}AeGjCUs1-;9@wQ@%A9tIl}k_kv|lgY9o<$?wi` z5d^jb>+i<f7+TF(GmW<m>lNee2(1#<Y~$_0`iJrMh1OMAbBwo)CHpmuztCETHQ#vG zW4&s;{h_r1tKN7wV!dX(cZAje*2TuV3G1K6yE(MBU@bD<K`hye8XwylTHCNLHQw!5 z|1#d8(0UB(y~eu(>)*!vL}(3TH5%_zSZ^5b&d_=mYpL;$V8z&?vi%LMU0BV=`x4e? zOxn@V+Kts}ynC?ZSd#5;XvH`tX*1plSmR926GLkf*5$@qgSC(G9v)g#usV%*Dwdo@ z8E?+(dR8s$1I9ZIYl87k53K~&YU9mdamkLfh0r<^tIv4rusErXcV=kK!TON#&c)i_ zc<V!J5!SWFyBKSt@h%CiMyz$l+l+O9@wSCl2iC`pw}i#T6_(o*T76jk#(NdkLB?AS zt+iO6GTwDqcbRrxA6orb8;o}Y)`0PD46Qq`ZZ+Nkth<eOQ)q3*+GxC6u<kM5!O+@@ z^%>*chV?n)-5y#)Sa%rjV_2JvcSmSFfpw?x4rASGyibMJPOJgreHQCJ;~fdD7qIRz z-d$LqH{O>*YZPmf@$SZ&WZG&^XuXbgpYg^xAF$b^oe)|R#WLPWSYI&Sn$VIn2wybb zDPkG#)X<7!$yS2nU#$C$cUovo$NG}-Ca?}RrIPC-o>jmaG~P3@<V?=^SY2q%#Cp(p z=U~bC2e!YVRgd*u<6VSRW4wz)YYEn)#@mQB*?5~nORmfOxAAsh9cH|x(CWeZzVXUc z8!oi5T>0H&&njcdc{S!gtiz3WU1+Vxdfa&XvE=*)+uzXIi1kC`y#wn=;~faCO;|rS z-pyD?8Sj?R8pM*VBJ&^C6yx0%THCRHWxPXJ@;loc|Ay8MtP$gV0_zy#9S*Ihuyz^m zPAoY`G(PrhXpLaW7M1xAYpU_?3ayv0UNPQLthXBP?$FwUC0kzRKdj@7SFV3~)&#77 z8}CG{<BfMxXw_iFm^Hb6ixoHCDWNqLYaio{W1V2UwV^c)Yl87k$2!q?6QPyC+Ru0k zSZ_1lGefHmYohVa#HuykIiWQd>#fFHk9CsqE()#1SaIWBf_1X-HilNSSjO9ib&BzJ zgjNY_n(_9CWxRc%brsgzjkk<-s`0K3t#w$_jd#7o8E=1RZNQpgyc@CP8V$$4p*4V& zFy2jA(~Wm?Xl=nt8Sfz0JB@d1Xl=vF81Hth8OA#lT909I+YL+GfpwbkJ`q~OSOw#K z3M*l}J45SPtkaEm1S@I0FND@EtTT=GB`i7n$N87g+Ku&J#=8eAZM?6CR%{}BP{u1~ zwKK*$F|;OOonyQ;SXtveJhY}@%{1PrSUKa3hgL1tY~!7Vl{en$p_RazW4sxxg7FqY z>rAW*jJFP}XuLB+YYx_2<DH9jy7AVB)*`HnjCV2C8OFOLv>LG%8E-Szna0}|S{+#L zHr^7}yNtIdwED0bjrS@nIWs&yRt~MTSgppp4(lxAT_0NgSRKZ@0jth<H-^?7Se?c@ zfOWR<ZVIi<SUtwO1xv2fjE@b5)>f?5#=8ycT;tsyT0>ZU#`_r7Oyk`VT2EkIX}rT& zvyAtt(AtT0mGM4{HQRVcLhA*r4;$|;tn-ZbrO+D1DjV-^tU1QJC$wJ2y4HAO2gG9M z8}EeBnuxX5cqd_9V7xV<bvV}b#ybV;LgSqpT5+uP##@Uu*LbIe)^x0o8*c(@p7CZv ztAN#Syk}y~H{QC?nu+x(<DG-Gz<B3|Rz22j#=8is-gp;>))K7G8gC=kMaJ74T5VVZ z#`^{@NqZKPz3e&3XIYYb=GH~?Sw>ct&oU>9U&f*Me?<=RS=NUHpZmyFKFgdvo6p-9 zdY@%GTgT@YnFGWx$DgP3-j{8Xe3mnjb-aJ+FHg=}O8yfM_WW{2Sn@x|FW*o6&p-8- z{}%tV^q~D($a49!UW+U;DvMyjpQtk$8?F1F#IfTut553q<5_=f8hrI%ub%wKbL~s6 zIrOp4^Y1_I-26YD-1*+$<PX?=M|xrBFAjZbc)@|6>HTWM&Mzm=+V}8z@1MM|c=_Vr z|8C%WcOLtgmtQRQ<x5I`zx$elt_-x}%;Ku2AAEG>TRyq}zm^S8_`|L5xP8vNZy$1D z5MRd^-%B&voBww0gmG`YA?sXSYfDqlj6|Y;+_<t&R(E#HSlJw-sc1Winb9m?-dWuu zxkzotkCV32uNloPOM92s(jRQKd5<4g_m6S03uyo7<;N@%!cGA(a?V@7W^~EV3VTc% zd;GZ3>E4WY`sv?njbek2Ffj(p_^II?5ebhgavPtd>|V@_9)9t>cBPy=kJ0fgEA^pq zv4dET5BTUlj|lZ%JCJ(b`;wcK+dG>l^Ib%CLHiYvW8^yC{<5NK#iUWjk88aI;q}um z+$Sd%dDSjFFP+Wi@?x8qfE1)&iWK7x$tP$g6_Za&P3=_qRGmxGQZE&gX>&<ddP&9P zN-oLES#=dtSm%=BMu!v<n_ZIJ=91J7m!x;PBs1cY?5Im}GIZ?{7V<SNDa2h;OgN;N zkbbxGDJErhQzW(6CFwSoWcpl^UFVYAMwjF_yQHwqCB+?@<PwRUE=j)NlGHAjq~*$k zRj*tkGwPD8T!~OIxjin)Ph>(+F@?ijQk>$DWFqd8<TRJ03NA_4yCl=-l5EK(xpgkd zZ*)mvvrCHG9Fj`xa7l8fOHv~)N$+w=W{*p<HB3Bq8>Vu#F3C@GNg?5qqMXsR^GPS< zJf$MZI+vv6oT7?J&v8j+u1m7@F3HJxK9x^?u}ca|TvBXvNG2iYvAld(&CS`Wep*as zT7;Jz9S<uaM@-W4QH<<GOFKtI_PeH#b428>MQOu`lps=`h+GZnSL72A35a3_AdS=P z?ZpF-;Ztq$O~~LoY$EINh$26S^fS>%+nql{h7{SKI@KlYm}4OEv`x~G;fzh@NX$7l zk?ZvFSvKi`G%9ifWMsA-BiEJV=h;N=RxK$aSEz;+c?MEH$4({J)k=!Um8X&O?U(~; z^~41>IT13XNFFl4{!i3m^B{7QMMUI0Z{0kbd{FXHM9wodF0f<nh16VRldnsRB65yt zRFPjohAy^K$(ffp`%O`KCNXgO6_Ila3HBGF7&-b)Txyf~kfFskc|Ro1jcHM;RYIC< zB1b!A_UxjV8zG~LY=G49<}XGk@VZyXay!+xh4k9wNys1<>Z6>01!?5XpP$dG5~Ijr z`{Lvs#k_-0^@_~m(=eCQqnwvP`fs*L4`hJLeNl{@K_1{OIddkHeXU$JnJv@$(M%#| zkL9BmgB`mMGP=pm=OIYly*7CglDN+%avpb3k=G!jiX6gn5}&tIod}6<wn+|BQluU- zqDVVr_zQNb4@3Gni5u1ZW{8})jmVcEjf%(_#4>NM?kihXE?X(PdFB<Tzl4<5ID~IX z+k`KbI;kM5A|&~Ipu4jxOcWC$ucxJi<`s~U3i4tFk@Ju`RcwEo%wE(`-?XZISrh|V z)YjE0w}|ixmUWOyC7vl2<m3vHtst{1$VC-oc?G$)f(%rUhbqVqd=mBP(-kpt?#z1y zHGKopPpd_#4xh;S#c_2+ra}4-v`JoKI985gW<lx>vB@Qn(pzlO0jW8{CURyeaimRd zlbEAyaz7+K#U_tHVn^HLN04Dfo`;l<v18=SOzC)=97-)m6_N8PgD2TBa=xVT6q`uf z)V$j!=G=xNA0npo9y{h{$gm<`lzf)hG2exh75N3EuGNltT?nH!YWV}`nUW&MLgIaP zj6BO}NRjg(b!+UH_dxm;k!K=|C~_SnaiyK=c8O8s0U_M_6qWGXkdm68pMb=!vtyot zG%E53$dDqhLgH)fRFe;)4L@R&;~@QtyaO_-NC8rRy`Abp$>#=}ybm&<NGBw*&W^bj zGNj07AoVxeF<*uZD)IwKb(0<QoRIZ4`8%ZaF`FDZiT2?pny6K4Aw!B3A@P1Yre0z` zX_Gd{Ah*m!`CKWf)V6ZHq`K9P*#arwW|M~@qZ@7V14!eiZSpjv{xddt5t6vWCa*xs zpS8)p%qul_+2jbw=zvX5f(+kdlhYt^wOy`*^nbyQxdbwFzfD>t)fSsv3mJL9CZB{f ze$ytOgCxFfldTe?$fJ+}MScnyQRI0@>^pWoyCG#o_G3=%|Gph_G$j7GO%jlLMP@-7 zpRi-z0~z{}O-hjApV(wQWZ)^A3_!|H+vKZ~k0RfPj41L8h};evjj=yL;)?8dDD#gZ z$3Pl)+NqL|8ZI$K`OJpIx%d;2OC%pIo<yV#GQbJqh+HYDIJ}F<ddQ$6cR?DtR1(E} z71Gb;k%;^^q=r+|5qVl-6!{aRTxZ9~NyrgJj)K&20VK-jBuJUd8WG7u1{FCEGOEaX zAPFvaM5#I;B}J~0d=$9_GOWmbkRdL8MEQIjQa{HgPeMjHsUOAs7E-g=CjWxez1t?o zPlhzu<a8m;Hn|AW-(r)MkkK}qTm`AQ+$JA|loh!hGN{M{kopyNs_#NZ75On_sKbu= zt>m-PCjWp8ud>MjhcQ|@ZE_T3M3IvrLm#kXauTD+JV?3Aj%koo-8NYPiLJKDYRTt= zHn~<}%q!ThyS0LBsvuugq@iJ1+lua<6*`|sRZQ*N`RNP+i_9LQIc|bvAqkr#g}ls; z{J!XZF;XQ9SnnEdkyHY5vmz<TN)9)|R4G~3ql)ApM-mXl6d@fpNhcxKM`U(Wdq-_L z_lby5W?9xvHc3gDW&aNt<9LuVOFjepTgysHDovz>6WOzrR9;ObpR6KM<_1ObkgrGN zoTld5bTRf8W`94QS$*w2wYl`&w7yRyCYOml91^mKJ;SFzD6)%B$C|xvQyx?IOzH@; zm+O}>BYn|vl9#ioX-3*`u1!)>_h~1FOP@PGm8u}=3L-ggf1903a#kcQ{jQ0$*sHZ+ zDpTfcVjsUerd89@hX0IW{1FvD#i~V8mNmg9k|=iJ$zjfO=SxWJBQ`NtMKqCmeMiMe zFKZ%Yel&_PWlklYhzKQ=#s7CiOiVKMwrOE`OfMH>ou_J&N`2zAfRIJ(75X$!X8uT! zkxBRLKHDRv2Xj*9V;ELpOioJp2}NYo{YepNj!Wn?FBKnR`!RMt6B5>fyySB{fnm;4 z6io_}&jn{#F+~|I`@Jh5e25)Q&KvzQ?<XMkHptx}sWq*UN<2R^Nac}2?8~!5Lfu(W zVwoO~c<X6~A@xGHMY2-D!`iJ>S*g1wGFCN_S}2l}v8suz7n(>-HAz<x89zEkT2+&Z zGMfv3I;Nt`xr#F9rOZd!b<azgYZZ|)Cl!%0|Cb`NtS^Ry53zUBU)TBV?DgOokk2VH z4>A-I#!o@&wf6F`FHA2dGlRE=gt<kQ^%S?w$`~_!nv!}A+QiJg|1?Jv{ydgU6QhZ= zvnJBcnn-yxk+GqPlt&XOk0NIKHPJ62a}*Cwt7Qgy=+3ZSUQG*I2VAnz9J!cUn3!Db zWB2KpLagTtA!(6qK{E5v2Q(?hj(a*JvYt}a0ylGoZJ16_)$FgVm~?`wI)tifA`@bV zN+p}~w>)R(BO8MsjwnKBID{tK=QnnYO#Kd_gt_PKm<&0e{(>TO>M6ffgz`9qW&Qkj zc1)IKIfN2k{09|7-FIq2KAPl7)%TK}N~XX4UbaX+OUw&)%jdI{d7Dkrd0KvjohqGY zSx+ibU`0*-$;vrhAm<I5Q1^dmLU|m*vK&H99m3KzDbiw!<g@g}1a1I~MpThhfBCaj z!c2lPA2+H9sT@M8pZ(R2k?mK<-xQ&y<8~`TP5Ts)owjRUvtwjiFz$7mWXR`kO~~gc zz9=BIF#8gj4DItVMY5D<?!WCAS)0D638^l7!-~mEs`YmJWMnh^jhNSB-m+v8ujiKk zXz4N?->(U^`1E)?ra(<!(}bKI!Wf%0L8YS14q<FKgz`9qv7t$k5?;+00-`b(NwtD6 z0a%1G58EUwBOyD{ipeG@^X-~Yo*KRo5ayGW+2&?VsMm1^su)r|5fZvFw)8FRF&<>c z$PVinlN6y|rygt*nSYjPLJ5DS3CnudAu1L5ysn7sZ(M(<9V4^Wzciu6UawIxv{=hz zo5=Y2jV3H>D>tV{?IXJ&Cvh9PMJVA;MP!cp7q_KHF|yHpaEc<7N0TD${KPR<4EKfb zt*2uZA)mi-19+HoE<p(w9d8raFn64w2&vY-O%ax^i5zZSzzxw}&eEq>(WmcwM?lzf zNXt&-412aIQqkB?RNdvka#lDJB%kZa=ek6YkC0D7j!W9)4#>SBsr9z7>BoBQn9ma< z_qtCY2M$wtJq(F)JQ$IuAax;`(HGs+1>~NtTI67?;k*CB`MKcrvgE_d#KdNlqEs9b zlB(kX@7wrCJ~K4M1e$;24)<&mW6Z-L_2JS5&44s2az120kyeQ0;VoTKeHg-NSVO&< z-U6vnF%LkbFwxQ<gUB7?QENO0k^93V@)|_$1dqrON3f@-NCGmV$Xp>TC`xrXM3zpN z-xt?GYQyr(;2y=Er5$|cUOnF9#|;~sqrdGtuJp_XVz`YlHpE90WAN?dBlqz}%laln z?&poj&moc|BCkTqiX3|+chVCUm9PL|g|b>~5hSBxN{};E%tw6^<#P{Yj*8g^=~qi1 zh72h32gryb6OQ8EXtnfXAd6Jar$I(ls`DZ8fZwR@&5$}pu7S)|Ie!|`sB#{J$g-k( z{RkpGMpOHJ`Z8pRiaCHz?^7|gkY*KgE@Z8WX@W@3(Xu`S=~pouAw4SQA;=vn=BJRW zRLqNz%_`>Kkb2b`Q;(+Ziktx%P-F>2${dxj53*I|d^2QFrTVJGDDuCMZHkOSh7>vU z80H^EP7`vF-KQ5p)~oWYf((V_3D%uK2*bngubYS&;8RqKFF>AvM1A^w$cS3j?;tNI zvhT5c8%dE`$fzRcLS&MP#^Ev{Os*062t;}(D$hNTond)`S`0v<T6~+B8kNtpkhmiM zgfuELbt-4E)UpbY7s6#>#1=wIDpfC}tjI>lkRlI59#c905;CfCejPHbQoZG^w6h}b zfW*1(61C4Pi1bd>KJS6Nu5w-lkrs<$u7j`>XZ7iAkP#L00E8V7E9Mc%E*0|(B(7rq z29bJ2%bI+g_kE;j{LFwPR4wWua;HI5uWm?Lk&Tc&D(7vGf?E2|ApI)UZirm*igG@T z^QI$;q#!Z!iOM_=!sQgJ?#m&gD%DMpJ&HUa`Eac$TGszU%8L90A}t>+Yf4;>ChTPu zApI)UWsr@EtcKj7$Ssgfifn~!QRF9(Aw~WMkw+y(Wj^8ruiv8*rXWkg5(aCW%)QYX zH=mdql}|S$uE<76LXn3db&5O>k%u!y<vEBm*3-t>Ej9zv2JuEzP@b|XPdzbQ`m@@( z9nuq~A~<#pq(&|4PDosl?T|)Ao`uNRh}!2Lkh02o^4r*Ys+j4J^(tmIWRZ$l4%w(; zZh%P3N6Xp_*`#82K$=y|bC5w5^LI#xikVc)T&H4Agh=~D%Q_vhL&aPKk(x#^?U1Kb zOc^3Ijba8MBP!-QkPRy4S;$K&W)I{J6?5cCtZ^zP4UyJ}mUS^?!al*+kX|l9wy2m- zKx$OX1CXsM=1Is@74s*Ev{<yP{ZD3Os+i*;(qd6e0g_QM^$=;XD5f1!r(&*wJgZ{v zg3MJh+aWKgm}el1Rm`gpY1L?1N1wuIQ85L`ZWZ$$h}=IP&DbA=yslzyhg_v%z6p_* z-=8)gFAX32F=U;J`2$2+K8hJPjgg>Yra+|SqnH9@K*d}JsZ}vOkS!{vA2MCVd<n8m z#XJs?-iem=BIGd@Gx1br5*2d_MD9GF7}j(aWTuK~g*>Zbu7^kuM$5VrvP;E02q~%A z=0}jSA}>OQ6xsjn%p@x3;~~3M&N;{u6>~mBIx4Egdm+s#W))<TiYY@nRLmD4az}lX z&rcvdDrPsNR>d6t4(g?1rbFaD{3xGuA?sDldm-{&hA5^BvO&e%0FiGlL@~ER?ocrg zLgaf2QOuK&O)BOkNTZ55V7fQPq8>a2(xGBzLbj@W8X)prhG<!9Alp^U&5*S!W(!2d zVYIBrA@UuBD4#z-o=`Cdypx)$m}!uwRLnV$%_`=-5E-k{vU(s}Rm^(G3o7Ow$dHP8 z2r{fj=5vspitIll78_CIG{~qTmqA`v<Z8$S&ag}f*SOC^Y7`lU^dD}={1ft$D)R}a z(PCklgFS~5xgHSaJewF<FQV3XA7p2k3U90%GEv3c2zf!p+zF{sF<*y_s+b=_WZj9D z^)lpj6*DQpK8cDs0V2;fh(>~38JVVHE`S`aV%`st^($IdHzclNZh#b2%sr6lDrP&R zPQ^SesZ`9LA+ioe%Q_&*45?yHgw(5;cL`B3mq8Y*m@6PlRLrfAMiuilNSliJkq{O0 zSBQK!J!-?lQ*33__>pT9TNJq%GN?!wM9y}RRg4Aj+5jo3Wqk!wR?GS!q))~C5hCCJ zj><DJO)3@hcF0B*b0K7%ifMyvQZZ{G{VL{eh<qa>TGqpmI#r8bLFyHe(_H<E)Iv6@ zoX>@9S2;I922`r+AcKnB2N_l5aY?0e{v%|E%K5;oH;+YQtQPW=ig_1gP~~$OWJJZ3 zAlp>TjgXgA%-xV774tA;kBZp|*`Z=$ImX4lb~~Q}iE$Q>g#Ktb2U4TR`yus;Tm>0c zIo|@QQ8_;V*{Nb4flO5~PeU4yw3q%8M9x=6<r$x+#T1ze8BsaQ73XOx=W`*uR7?XT zqhhXv45^&^A;XG%9wOfqh{`hr8C5wy1*uax{~i)osbU4zN=1%=loZK9_NbiaLFTHQ zmqE%Z)rTN!6}b)4ugF&+HB;<b{0JhIipJ{iA&b?r{tc1uL_~F;Qe>}55xIpTp~yVQ zpdyz;Wa|(u>sm;&TGpo_H7e$QNJ+(PhfGm1KZRVSVqS*CRm^^;Gb5>(;~>*i%)1~P zRLpxJ2^F&jGN58^g~(PWs@GP?78UcqkUACfGGv>InRo`<CKXc)c}&He1(7XLw5<0+ zhE>dJ$YK?<5h73gissdCKpIudFCg;VuPEj<NSlf|>P+_DRZJREQZe<A*nW0C9gsd1 zb0cJuin$k3RxvvuQ&h~0kaa3%(z_UkD(0P#eibttBKM0%^?E-<u5}US&vk1d!;0Jw zsX5w?c?z;o<-7-Srpo!)|6<gsR2fJ@k$I3hMOq>Cid+q8Q)DAV&e}(1{t9HBB0qp^ zROETcpd$Yga;%-t(PuH9RlO3BIjUZ>AzM^TBSh}YjaqdLWUGq#6r@qbd=VmB;b`=J z7t*0(eg=6=#ry@*r(zDQV{ci-#35@{Oco;B+-O<zA@c3BsLZX9A=Mh!LWUK&6S7m0 zZ$fq{@-$?(B7cR*L)<BVKgJF@n<XpqcE}V(W<wH+EE95^ozJz9XH~uKfZP$*D>!y& zWXaL7!-K?(s#L>}&0#8nV=qGXsF(xJp-)xJDUcX5K-8);Aww#r5mKkhd^Kc_B6mXM z+<MeL4?`9y@+_oLk=KPBZ>Ku$TxJqgo--g%sPbF}k?-O~%en$mR^&EFzakGo1{C=j zWQ!vIfD9^f)J$4TkvwFZB9}pi6zLOkf?dMfAyZVnz5&^(>h(0FR>iyqc|pazbr$1U z<$MNYM3HwxMiuFUluoqE^J&QReeHgKP*SO74MPel=0%7+nJ-%7#?SWlk)rVvhfL&S z6muqIj>_jU$l)sH0}%OMc9hS@AaND586tZ!QOpj=bQSY^NTZ4we;&0^F~>p5sx{7n ztW%^B(yz!hkO4*Rfeb40C}c>H7a+rm>^mnG8&TwB$fzRcL1J&S`>PF7qsUE=DT-`? zOjG1ZNI{WN$Q(ruJD*lnBm-$v<Wfjkkv_=KDRv3(kW{MWzXh4Oe=rh)d90qQ9l(1$ zZ|<@rM)vdw^T{g^xi4j6NDjMzHdM=c2V_K%nUGOM-VZ5FvrBj-WUX4(Cm~DJvOW*# zS22%3+EmQ5kc}$l6-bYYIrKtCi;6iFQdTkNKsKwG_d(XHm@6QID&|v=jVfjfWSffl zK4g=M`88xn#k>ZQJ8-Oap38Biib+AXtC))*vUdvf`)h@yQZZ{GJ5|i*AadVMw5;z! zMpVqtgs7O8AiGq|e)Bk9Rx!szMpaB6vPZ?t7ouX?ArmM}RG#Y~vHk3NeHK!qV!jTU zsA7HsnW|#`EU8q?LGxKFRm{l{*%PLaejA<z$*7piAaNDb38_;t*F(zF>=C{hB3C0O zggHMB8CGNzGEL=Nvw)+~Fy~-Bts{?UJw1&W**A{LJRh<+Ohs_412UqP^>N6kB42?d zPPI$;G(`4JqnuxXG^?DCVA7~lsm_MXRAeP&jv}9i)GP8mNX^^rrT<-G)Y6Z?h<QUT zeGVk9QmuqcQ{+>SIz_fYh7=irEK$oEe=)OPxU8V%6RPD;B4$|SGaE9ZNE;;n4!d6K zAtkk}`yuNpmK9ga`X6G-D%H!74Ph#RV>JuuLA9(?A$5wJ3n?qo09mJUUJV&gIj@KG ztC-J0wy2nIKsKtF|AlN*F}olGDrTQW9D}HsV<DSWOdc|<VlIXZs+bj!XI0E~kZmgF zPRK45vkfw&Vtx#fy9D|3XMjIKcBq(rFY&r2ia8E4tYR_{c>-t@b3UYBwfs`ZMnygd z8BpXFNPN0Ie!c>cz0+u|+yR-Qmh~&hh>CdyBHx0H%5(6gw1$eA4oRq(3m~H^rWqnn z7>)Azkfc&2yctrb$QL1HMIMFhQ91t%B2Opvat_wG8n3DSzIc%sc`jBoi@pIFP~?cq zsJkNXgvfqx)M9mzMHS0pQP#YAF)>qBs#Zv2m`bA8K!Vpk-cuZN`MjKsr)rehJn1o? z$;i2Pn-r3Ap4KBXmUedsc^oLI#<2+J<>e#a8ZkF*hB+59H8h3FIXlHA`Fe*GQ*w62 zPF2hdYf?xg<@}fxQ%Izyu%%WcJx-UWkjTi{W)+j2=92slH|N3<H>TL=kYsAWA-RI= zf!NE+C-!m5lTS`1K*gluF3Hq8q>$`)NqWd3Mfow3nCUOCmkY(Tj4{H3-YFC_R8+@g zC%G}XDK05cEuE@3N5>Qs3E2;~mQ_ro%MM8vhaHm2#96uQROy6lPi>MZ3^^p9sbN6c zG5Nea9axb<$svW*kRrKkrZAD_ic;mWxpdqmxr8P>x@(S0(v2?3mNd!dGV5HD9n_?d z&F^tZA#so@VIiL@yClEEA%(2m(Q4JJn8+3;IV4whNHR6-l63rFohq4WR3x9w6gIo0 zIOvdUVw+3S+g*~AdsCw_=abpuV-CqD<xW&PCZC#kh(pr#F3D|lNFn){OVUrcB)8Kg z`S_uFS%soJ0mLp(F>{qmvTI$ETkn$m2A34%E=rYiQ9dy|{B=2>N+bq!Oe&EaaY-u9 z=E}+^mB_TYBv*1tVXZ@wiGGJ<aywm8eAXek%!o^}a_^;Go?M~LCB*?v(wXcom*nDy zseH1jOq)xx1DfPAX}P1rT6!*%DZE9Id?wN8lH_KWq=#LSnR2+wr;tq5DN<k+T<4H{ zLGBER%2P-bGCLf?cO{R|F~veblVl=Qa!E$6Zd*Ag6NQ})Nv0+osbi9vi7v_2xFo;W zA*pQHC55LPl1@D9lJtm6vb$VTc*!A|<Q|vgCmyA1ktr4&l1-Ofk{fVIVY5SWiJdM< zP2@U}-Kx3F;V#KeaY?SxC3(3vYUfiZ>~TmjAy=U67@qd5NvfEWD?V0Cs+b>kNpZ?C zDkhywC0vs3b4V&X;F8=fhh#D}T=lS)&U(7oC55s}iaQ*VO^v!FUB`70JLg=o-zBM? z4&mFbZ`G;tsW~nwmK;(@Y;#F|#3hAkT#2yDQ!L2!3q^|ZO#qAVedQsCBy%;K`L|<| z`Na-NCFR<L9g|A!&?KKvjk=^5kE>LLT(RCE`NT#=im6n7$R))Zt_4I(FQ(Fo#V$#g zU6R@1lDu3~Q27)JoVB(IGp$R~a)#WF;k(gqb4X6kNZT=mV#y)J#5R|tMqHAfR;%(! zClmE9Np5sWddMZ2i6`lN(z%37@_jBT4mc!}*yWIXqUL0sb3VD)A%#@gCFvcSWK!u- zmt^Gb>iuHDzC<yT$~C$qFK6uSm~^6MnnTj^WN8(X+3b*PLe41KG1=slQyo&2^L2Ji zF0sxfg+Z4T_c)}Ok~431KE-sKOLF}#$?tSYG4>9XPd1U5<B(*c<dWnzhoq7tE=f(} zJb+cgY&uo%lJrK0WD`R!NltvH&L@{jxFp@@kbGvqCD~mLDdcKq=$s4r#SSSJ$}TDH z&?J}0kGiB#I8Ei8OQjoKlG*H%{IE+3QxZC#Y*L;&ZnbJIn_B0R%%DrMdt6eCCv`r# zRLLdjZ4SxjM_f{vmeTnY67?=gZqy{7NDsLrBX?U`^~xu6@}vVr@_i0TX9ir7-Q|)( zO-ARFE-rRRCR=t$Hap~!+{CQTCzngOB;V(de0IPkxm^z7JW@{QT*xlggrnNBOY&P> zBA0Wm<ECOUQ5<w)l8K2<OftFEjY(~DNqW0WGD9xO?r=yZGwPCTA#c?*lSpI}jV?)U zc1e2JC7CG&C!buMOY-YnQXF(hF0scU`E0zXbI#}5TvF_JNFlM)B{}(Nq;T|7(?WiZ zLyF0gOH$i3NoH~*F3C?jL*<;zX6jv%FF7Qi>32zP$R))QO;VYRe39O&MJki4b4g*b zL+DdYGMQZ2C3(5;&B{5KOpUrEU3iy{$z>W{lHIIHK9d}FNG=!uFO^R|mv3`PvEL#2 z<bX@kn;lY24!R_@$0eEgS$gTkY?~&9V!mIIWImG`c1bQ?XXisqzRe-oe7{3-i9wg7 zV`uApa)mh#$tN3Kk}0{Qu+1Tb<d93UHRtGM6^e@;QcN_vB-!DTY)O+sBC**e$*nF) zZFfm-$RWwZ9+#wQ&Q)bDBnyoWNu^3INta!cS?`c^qTeOS0hgq<xTG-XkW6BSOENoM zlHKK!+-`^Pot2rorrF#amlR44$tAbBBt7Di+_YIb=Uk!QA^Frsmt+TAQrPT}LUNl+ zibD=5W_N1B8T(O}<YKc`35$us6qgj`o~>w(N*0reX)Z}6T$1i{Nq)c~sf66KwO`CX zD#;`{_#AXeVVgtJiD8$dcDf`z>XK~XJiV-RuHGeujV>u}a|q98nxpf{WaqdfC--CR zXVoi{A8<%Ezsn`X*!enDE;G?3#Ttj?Q&U`$jXR`}nC6mf!Xb3LOH%bN$uznoJD>=s zs1v(fl9b=giCTk`)`>osB;}WMR7|GkLQPVI#V#qzukF~W(#cVmr0VACm|UvgC7BVI zWE1mrs(hl)C8>UwWCvW58+A#sFkk0fNY%L{H^(8xM7>MWjV{S`xTM&lNivbW$|Z%h z4oN2aT~gfWkW^;CCAn=5NvDQgl6k=;MY-R|>cM0t6<gqtOua+0$&yR*+gwuE;gaH0 z4#}l<x}-3%UN1eLh`S_La!H}=kV0nICHWDD6jP%vDa0<)OD`5{G+_ms>XKsIA<0aw zOA6B*l1fc?NipG&bh5`K={}ca%PuJlIV6+V>5|-tLkfk&#j5V9V!G^-{IE-k@@rPs z_(>;<C5NPPLoUfrT%=Q_iV26L3uT97(!&nP7UP!$`ON6*Syp@gy!SBa#}1O2f80d= zkCTt)wU4hiUgjAlCT3DC@={I0F;=R({8T2!WbmL*<ikGX6Fukc;4mNYm7n;<Jrd!) zzU!xw7@g`6h_`f!d}_}7z8R(Zxt~g6bgDyDs&@`FE{#(C#ZM(M-trGvjOoAji8Zu# z^z?SOG)H8HJS3jykjtxv_xN#TG1co>@;IxjrKx##SLe!wJx$A2)SWeRe%)DTEo)6R zw6E%E=_)Nso!i#bwXmnFebw^1x?)|iGC}?SF~O{J{;vsUzDa_n)|CyVrmpUmE=t|r z6SF=ycdlx&KbtTER<x{X=xJKo(GpwM+S;(Rx4om8^sT+CmUYKU-43vF^dfqa4a-(G zl^T|HG<A2kbelYyTb6a&c{KI*HLUDx?(Jyt!X#U>#Aqpgslz-gis8ktYPljx+|=A0 zeK7S4^X+QsXld$h5x1Xn_lovXLwBiZ8D(^6{lbQx&J``IEZ);OCTeKv>S|hJ#ddTy zH8-@jw{)1&_=}66-?q^*$(tc%WdK;Zrbm?v)Y{(1FjmQyb#`_&S1dn>t#Ftj5M^Lm zi0%rS*0`<Du76ou%d!;>rA`Xl9kb$Sc8^wtNtZ6`T-DRr+hybKo~Evz$~=~JbapdB z{CImXnxfjklvRK#q#Y5JvMNog!EP7G4j;Qjl6_E8npm}|^*I=o!5R^?`O2mhEe+kh zOIxX|v<&{PHKiU?sII0}&7CWKYOP0Jm;q*xHLPr5Hew~U96|oU@`64!t0=Wx)!f7g zGV5vsKZz|#jjN@v)Iyh3I+pcz_jInT;^^f^=_rfkk-0Khu2;Zi%$WRq9y6w%7sBog z!@F8YA*-uQ6=uS1WlfE>QY7;5SD~P=-960>PQ|E`#I>(#Zs`jvC2<C?;#aaQ>bFAB zR(1m@=GVO%Q;QGUsImmMM-?JyJ(YI=RptS#Qa|MivTy2I-p$DDWnA$~f%AGhX11^P zt=a8;VgY>XV#1nzdtOU-chhpy<or%zLsLgb=Q3%3`S1btiS49vI-gs+T3Tc==XI<p zwasO2WMgu1%N2BuOV5=Frrw)hoCL<Tuy?7+q}xqc?++Iz(b;SdK=T%!)6kygfx=RH zZ>zJsrKf?7;_7y9Otm$2w>7NlUD?pl*}0;(WN#K_C!k?<Q%AQArEMG7Ovcz!oZGo- zbpyKrJ)Irl$3>mz)7*h`Q728x)E#_2d*Qj~pFgLiZ>HHQhIm#>U&}I|$ySvWrKJh6 zwo?{1<q9_8eyCyI`ejOMHe&5ps?EHKk<CrG;cn>ZV*iHfbgeRQS?5Yw_Y7cT+1_PU zeJ{}L8itv6`Q>g|*3;f;Hl)Ffs3vG@W{l?NYA`7qz95S+=30Bwwxac%&79$Na>H^N zk8EgZ=w?}&%<NT?i7Ca{=$X~k)!Ah}uze?Mn#io2;tok``>Li6X<<c4eXd#I6kWz1 zh?8M=MN$UlIlZl|ElwcVtQRgX^>(+JWiRb*W&UnzK8O8=5VUvCVkMJ8ke-#tY+U@0 zmoDt-WP<fS&1>p2RSZ7Q@9bJ>D%N}{J?OWC6r$9!^4&qu!k*?!FS9<(2|t|E(c3c5 z-x&Ez5Oir1|GWk!uLV7AEnR{`GP`MId&in8s4{eJ)2ijYOi$-^b+W$7GNg0P>*!qC z)Nygka>kt1j8glSre)_cuvudm`w}nHQYDpK=5{Wtp2^IX)~4Q$p3B;sd)gKU6`$X^ zQU-yBi;|UD%L1$M&fcDm_Ejx(pZxT!6fGcT<U(5aHe_YR@b-o2e=`r88H2TWrBv0P zK8)Sb&e2O#hfFVQhkd_gm%2KawKVsdjW7GWW*0Nu!|my8m8s17ytI>f&)yK5mBia_ z)9(ISwyJ5RcQhfBOK(q0!_xL9uiL{_iOSFKT{)|xMT+hDmdfCW);jOwvZhjxlujC| zjft$Gy_<2>?u~OFEb8>eg#YoJ&K~wzq7-b&R)nAASS4JsC4m4l)0hx5OO%>=+M=Kc zsntKiD?3-WEb4TUOCMLjWxZWhLQTIfD7CDrXSrTBEsSlZs|DUzu?pX9O-o+sg*Z*J zvdO^t94rORW{|YG%jmRugxB|YQ&5;Ev1fO5nDjJ~a{z3x-?uZHx;S={v1L{>c4%cf z_197}`!8aTw!4)n#zf#Wbu(*_mxeWk=9b-4w$GAFF!Nh28z8G)1GKDnY0%WcsucFH z%mu98EoZN4o<lumcQkqBgkQqC-(BC*HOng(<T7?rsK~rd8I!%%2nw^4<}oAVJuO{c zk9(xMo(-ody7k!^mdrCN*ewWpgkD>?W)+iS55MjlKr=ckdb8Bf+{;f{+d%}X&rQvj zv!^aq^wuRQhBwsN?=jqjM}t-Z%r?g1ey^S{ectVF&Sk+-O4$gp2ew+)T_>@)=CL+7 z*w1r8Yb%{^e9i{e`)KwYWm(=wZzneTESXa*E4>hJU(1T>EIC1)B{znyzL?3=%87D0 zq~y;jURk<2{dK`FTDWcZ+L_gj9L!FD-TYwLNSoy}cP{K{S?PJ3J7;%roFav8?mVZ1 zA7Y9%T)gPq25+xd_B}4;z{z9hGfK~qQyC^=VOwucbLSPSVhs)FEu6!FOh-$XNd=&{ zdb`?t*7(Q7%;YQDTVk~fR=0Guc644*%kQhzUcv#A|0x%%oh>IV&X&^|waH|PZ~MqT zLW6Yu@|G@8I_CYLSu&X+Sbmf+nIx0>oegH?<tLt!Bw`RZ^);CNCy2>L_MW0eCHaXP zmMq7Z%X(Ux8_edN{gbZRe3nv}-?GT_duO$ay4E!GrR7JdJTp_vZ&uY_!byQOm`Qu* zzLqni^V!POCR|F>&1~sj=Hl61M9*yMX^PeMu9BmXTKiC;*8HS}Le{>mtp3&lt9XKi zR&iA>*a?dH3$MU_IW2CE3@gJ8w!+NOcl82mS28**=<-gKg{e|wyV6x%Rhl4N*k0Sf zL{(`7k6YD}b;%r?g@sJmC8>0)>M3`X!Ycn>3misPDYWIQ?7r|gva$;!m!B*+dR*uo zYWgW08hkVdpjN9?@SwgGj>?Lvkf4SdMxV^gT6Mvpr*hGuYi|qp=4_|h!J&1q3I_#o z4zZn7uGeW{`#{`Dsa#fn`Ul|l&bFUYhHEu%Wnwc@<cPj9W#k$onZGkXM#{izB@Ryw zSV=<Wu43)0#+dC)xqNTXtz#sv?Aj`UcGb<=-etCz>|j+tUttZjFgNRTM(DQI`)Y1$ zYOCh9rZ>l3QD?`$mr7fa6}47AtJ7q+$vHD)bzc>4)F^Ux$2*x5Hi|V@TBmhFx7}t{ zQrm4-#cj8lc2~BU_V2CDqR7fNvwTjq<;+xAt%_O)-Z9D*xZku`5;#Vwj4LdZJ~dXY zV3iRSg{utNO96FoMIjw`cs_w^YgXx892CjrmF2J_f`x15kMR(4g0CXbFgMWN{|Qrj z&<zc)0Qzf87#;E`fj{+BnaxR6#pzHsLS`z}jc2E`Bdm5DE2L_ZRtvTot*SdJDAx$b zE~D+NES~M%TgigB%0h*n%JO*EEUUI$kje=$XNLXSR)&mS{3x6Mq!M2A*j4fUQH7%G zy;Uny#cfxliaTXp`mN$l@7<jl(_Ps@I`_S`P83<$GM2Aet9a)u-=uAvpz1B;1XXXR zC}?l>jiUauT6^((t9uYpF}W~QWv?chjiMneJZdrm&CLK+o62@pR?PP9twKRu)zWx( zA_P0ws$8w+vR1V!_?~LDw(nV}mQ?wxWnl8&%lfGN6&aW_cNNR^XhpEIdGWhQZC^O` z9h`Qwv#!8?-WInrufUbz>bjX<0V|nyS0;}xuT`eCe0xdAsU7d6h_%!(CC=(egL@*X zrwzT8i8-+r-V;)pSa~ZG>uY|M$sNC+fqkck-I<lVN&>q(?F4GHh(q_3*QAxa$`ZoH z4m!eKjOE;0(y$Y&rj2^hcB{6I${P%O<*u@9r>!e9a004iA(ab<N@WJh?I&lV3JPd< zWd*Jbw>#1bSN&-5YTY@eyK-q(zj+n2(ptW~Bn-Q>TFR(L9k0`zV|go=tGc_Q$jV!p z*y-wu<c>eeAh<Ee=}U!~m+af9tPN%rPq4MD;;P(KIzhquSAqTV!YP=!e=C}LLgEL> z8s^{G<p<d$%IQt+R)`kxW`R+bL93bVS$Nl2l+zgg$_(t@@G5QYM)PoGxV>gs;cCq? z7jA;PFT#dNMR#Nb+ZhQAFCN<ksp9a9qCDZXTWcX<evz|U(%{lgFb-6{k+WJ-?<SCH zi}XF!5}DgXs-^K9)sk>U%fA7lS~|-+M&jUZlQB|<?rO>9DqPj3@f=nXb=QiuD9xP& z-d!zDbabnW9=vj6k9YdB+nNug!`?hjZVCNQ;!^)%T>3wZ%lwCN**A|1X1O=5NadWj z*CclLj@gjmE}>+_kPGfWvbxTuRyTwF`;&BR0Ci}1^O6pZunw=dw@D|fbnE2aEl@g* z&vc-7dz23JSw$eXPE`a7(}8klRB&6B4p*MaME;Fem1zQpPGa3|rIXkWoy5L%OQ%tu zYKiPjgMB+QUc8jHTPN4|fa#?=J}aSYDyrNkW+fjZA{fQ?on+3OBEz|=+nY+Nx$QNy zn!oyr=|;Mv$1a2#MU{8GSrxD1bQ-Sm);KG<v|E(`D+`LP@1e6&SNe29eV?69sC|A% zIrrLCc2$)Cr#GrZjM*PftkWZ|SISuBhCru~V?@}c93!N9F{=dI<*e$qdLg)(%DYq1 z>H^16C5hRwx0e+p@f~53)^NkD_vu_-B|*u*3p^}XlqPgp$@a3p92NBccI&0peH>7! zyE4TU^jkGwWrw*@L7^(SUnz6Ff~$b$zE8gq6tga9SS596P)G+?md^?Zil&fVD(9wC zyKs)n%fj4`T2aQ3>N19StTK9cx7rK!uZWw4g*Uvq%To@uNaY!0sbP$2oQO&{T6fo4 z3m?m4PJg>;f^t<!R9P@5C@7hW&1Z8Ol>;K~1&eO28q4DsO{Y;s)2=a!76qxI+1MXd zrXc3tW4~K1;D>O8>3_?q+1#NSWLe3pBybK@!;I9is-2VdbsWD$V|lAA%_NpPeyWwx za#kd@zqwSgSmkt*`rq%e=h&dU%H<@pzX9bePr0fmtJbJ~va0QBe_M(h^teN^`ZDdd zufAlf4ZU5=ptANNybka)sCoyxzxe7tXUV~rv8pw(_KlIST5AOft2S5Qw3|cMwpzp( zOCPhvR356y<ouO?XRmjEzu#OHTy}oKQ!Sh?vF`h~=9)K&3TBr#39FoG_L3kNUwaD? zU-ZQUr@U1h-mZTYhj-ebio-ikP{rY$7^vd#&ID9(<jg68Dvo>=huxw&N%cmIV(fOa zsXw-&CJVm25sr+YEklQuL~f-Hzsg{x(7ZB%+-6@HZfIq&|J{(v_`u;NF<%~W!#(JP zdbiv2t$Qar<kBwQ{o?*NPMpzH-RBLc>OOBwRrh(rs=Ch`S=D{s;HvKP##eQpH^eG@ z_9&}xRv&08tXgZDD?REsH~MyhJ^xCByB@34B3E?&*E%C1U%)Zn1d6;>6Z>CMv3fnq z*!luX1ii1YIGsPH+dr2Omc~i#4S_LJd!wM5+wPcZ{_1_>M%vv|;nVH!fB9+5db@tN z;;!GVx$AeU?)trzAS$%$_f~|l{ocwjw%=PJs`{(9y;XoWYkWVndh3VIs>9VBfrsBV zt2%0Ri0MWBg*3Mh$ME_+Sm{;uuXK-5dmX6i?z*g+d$WmrA&&D^b|S}7HHrUKEUT5G zRDrL0LiwUy^<>6VEs^XRjgcyFRZGU1wBQ?j)fQ;Gt0gCE`J!L7q`pfA0NZBgJAlp@ z*h_#n4E7S>t;u@{@K)u$1bFN6UIM(8c`pIp+Ps$lZ*|^FK*8)|?Ioc2W&z2>n?}58 zTk<`wH|a0F*7ar)Z`z!E4eZVG*jt0z>wonIt3Cx(#@geyn%5ff{;^8*eN}77SNNoM z^8I=5yR6Pwuj26fMLX<TYESjrMKN}*Y--m=9-a|>v(~PQ<FOL4LZ2r)65e-jtu&6q zN+KtTS^K%sL%y7AC2<^9lHf+1${i!uQzeoA{a$N9L88D@C6WIP;3|m%kCiAm742>h zG`A8kgI0Wp*jiLow@!Wun;!qG#yX+x&`I3yBI|S&UMsO|p{j1|d{`~ie4W`^M3{%? zs7T^{-?<`zkE@4QKTeY`PLFY{#>FN1!gS?Q0!QU?qHk1Jrm}oaLUV)`Y|f)20B=*z z;{pO#m1O3N+0L>gJC9dMfYYs!#0!==Cs?NSeQsy+86(1;Y{m$wKI>Eou2w*+K<daV zNX`@ye9^p0b68%fWwcW)$<5s*PA$iXuxmL+NcCD)3ASrl&8-XSZz0aNz861ck@pts z?-PfIb9;-eIKuIsrs0;MdZUby@tZYIm1NZ$s#>6KGP(aJcu>HYZB;eMZ6r6SdX3$v zH>;{0U%iehqOx-GsDr&$EC?98yg|f&QdWr_yPTfansK5r?RS;``~_?E94kbs$`;>$ z29i@n?Xat+J=Loe#n@G`sZ|9J%brGMutzI`y{AT4b@cM^aYeZFFzZug_MxL{lG*lG zA)?ljM82ysnfG9dijwi52~&V-3C3DX@JI{$h9R$>?2KG2kG7~-Oz5as4*P!9lZ1|n zB=T^KiX~J&F{A3hkw<BS4sS*GiXJ#BM^xb1+lVqx=%^@@M=Q!-aa*Q8NX%nB>_+vr zZtC$K)-tMjt!0I7`QEhMUfLnU$A3CV*e>3IphfLQv2gVk37$1#6*WNK!sPKI70U{s zUQ|HGT9SE^iCU0Htab>VaiXHU$DZ(rK6xBnOG8J?>J}clXC88LK6}gZ$dmBt$Li51 z;nR&98qQzIBf-3fqsSM>JL=M{tvo9}dht{g!!wCOD?bwxz9L=`A3a6Idw$A+r)3KK zDqi$T%8%7%3ORn`SG|&nM2=rWiSw|OLeZpXJh1utgJZW{mup>n<G9%U{$rbGH1pui z9%gd?l|ZKkk5Ufcfi<xi%`HoNm)G)?Y47#YL$TOg;tD)NSzZI=R~M@}$B*MF(%!2B z>H9(O$x{<&J<VC@AP<Xvfw&D%doldX1o_q1&FJC6bnVJj9);b&@1p-a7Q3p^t3VeL zkJUHMFkf>HqGGX`JY0Enl@}9G@*A4brvnEG$y_}y_Cnc<m8#dp5_L1oj(3m}hGP#g zh3mYy{vd93XGhOcsipUdBRkjW<;D(7#Oz-mmq=NT`zpt3hQd+iJLL)6dn7;lOkVQ8 zuBNUo9CwC#zvg}*F^9Qv*7K$%w2k*vKgLgLen^VJbK1;Vv(LU{?xMNppL6<&{5yBv zqM0XZx?t|i`Df3YweZCF1QP#+_s4iIh>e>pd7XRulKQUB%NbAIOU^EpI@*^t$@3Sx zm-O(g%a$va(33m}ps8btY%F`$lv<W_F1@^aNnb9rWTuR+C8gG`86bX7>CDNo##n4P z_LkTwvA<m#3w2)mvaZhV&eopzw2M!TFDUi2uWY}Phh)XiWoNXV#}7$4q+Dxw^N1c( zE@AST&HFgsb-eGEhi`i?`^h^~V~5q$1rAi2-+RUDCf6Jin>@LmkG;GXjO&XX#^+k> z6V2x<c%onn9lJml`d8lk;8ggMWluXW7L#_H?o-BIS<15&Jr(^r`cCvARO+ySL6Uar z@Ow(cPi@71iQaVthWDc78sr(Z-a)n0Vo%^gqq@eZ#i6l%gJv-gRHAVwPp)BLZ6I#J zIPOm3$)B;qfm49j8A$%-5x7S|<Io;*T`<mHqTCxHj%lGoo@UDTJDPaHlw_X3@oz65 z4^9?H7PlWCWMkS=R(dbz7W4eeBVyx&lE(PGs@VI;hu4v$ZblE|y<nUyOA69W)9=U6 z3P(v!=Aromv>~q}NYaOHG7BuVtud$5RP?uS@A0A!CA!Q<ub)?~s>u0D3i7pmiHOBy zOstJ!V^Xz#K7Yj2*L+7phRM1x#M}3iX4weaYzicIgso^XZ8ZS=lu668ZacfyR4n_m z1YEj5|D*vXPaZ^XGnp)xyCw|V0`to5Ev$yP%`mTRS2p!kWO^~)c?>CD((yac-<m>5 zo^m!o+SYq7m@H#^&UlISUNR;}F<W_`>2rP{MSjLE#!sHe&n3m?p%<b26h^rT#V+57 zvY{wT(Jn#1jPgMJ^3Tx4=x+4g=&R@w^ewdd`_VJd26Qpnh{~{NLqCkJKtF;qBbRSN z*>IFMq8~u-LA%h;qclbNJLqckar6pw7s?<hzl>gmUc_j)7F~>9hrSQJ9+mZyvX^g1 zZ$byqkE4U=C(-YtpF*EQH=r`A?m$naZRox7dFY+!h3Ej<fZl^%j(!gP2znp-N%ZsR zmr&ZM{5A9e^bzz+=rbtYUw#q&3c4?o%h%B3&<D{|(XXTDpxe-T^c!e9`W^Jc=n(ob z^t<Ri==acv&>iUa(EmZ7MjuE2iavqv&&dBFIu(5qO`^l-BJ_XJ52HUuH=$3VvZg$Z zK7#%n{W<z9I(0whG4urVIW&uopy#8%M(;$QM;}CAK%YQ=i~bh<9r`cy_vn$V4ZF}| z(LbQ?L|;bFME``!+VU5)31#e-yV1X)H=wVe521U|$5F;w`IqQx=yT}n=-<#c(1Rwj z{gpWy-3OHw<^c44=z-|v=t1Ze=p^)7^bqte^f2@RlrdcX9(ok|1C%M&%=Nd#D(Cu- z!PsQPZs2|A5&ZLB;aqR-!;-l^5x7wD3|`FjvNG54S<m7!N5!Gm^egkxG>|j(gxj(< ze8Ee~HOgDcw#0|;q<!S`4D@g`g-%7&sBGi1=xJyHJrgaW=cCwWJ~#`Nde))zRqWfW zGp9S-zE9HM$KqRuey&P;a8PNUB_vP(lx7(qHhAe~sj)VJv*oel%zDvA(Gc?p&5BK> zwC5ms>h_ezV+Hf)Tyq*DX(sa_4O8LdI(f2ey5y-rQdpVCX_#=%Zf;4M?MNJE^^t7E zq^q5cn532_?d82-oIFT6Wm4CLOrE1{79u^&%tu(|26jDbC2N7aWPHp)zj(Za^2pwm zrZ)8;wU1zLY-N(z#Kg%<k}pBM0)?Bv#Ub*xN>c9Tka2JF(iXEdEyLn;@q%$BQ|NVJ z%(Ac|jUg*_Ucp|UEV2})TPjbe3^w_3@PctYS9E&Ml8~jgg{j#k?P`imfvu6$c4!0V znAHwKAKrZ^7ca?VJ?gdPYI(A>wS|-|rK~v2HL*D3IC#nU9p%H>ybt&JbFBX|rbkfe zonNEU$G<`A(BGl+(ch!*LtjK!qJKm`g#HP=7ac{vi2e=Tf$m0shyERvUVRm1u8O^e zz7_o!nnB+{>rskaz8D>cE<*P~-;M5z-i7XuO7|X!eg!=UeHfjDQr6hP=%3L;Q1Xl& zio#+w=o#o_v>iPX?LnuYpF)p8??R77-^O<At>{Yhc=Sq?_A6hFo`|kTYtdWKlhFIo zQ_ydt)6mD!>FCeV8R+xqY3OTc65XF6nnFK{X3(FaIrKMZ9{oL9M0ca7qZ3&pD0}%} z^j+vN=vn9~XdQY#dJg(`bS5f;;{x;`^g?tdIuC6`7ob<73(>XcWvI+!>|2aE|IeXY zWKKPY_kf=7x;r}kt7`w*{J*}&tWT|7lF+OzaWakZj~#wN!TkR%6DW_*VXd-`Wuz>@ zOKcg(6kq0V^E!!fBxOArmHGb^bQ=10v<{t)N<H3*%KTpD?H=2(4KejS1--jUeg6;J zyEm<`R87{;0`K4@%a?l5{oyfMit<Xm(x}uchf4YKem!JNyY(1iJV+behu%}A9@4sI z10^eF@S@#=*R07k2gXjHJi_M%>~B=v2+8r9uB2?5<bdttrU%(cFcYuzYaHs$#ml`L z+4aGi_pBryMcr)%MnZ}a4+n<KtkOsmJtV&wAhTaR$Uf`{HW}9DN(!`?umcX0%>3)w zCUG6q-V8~38eu2$UNCMs-=^sF9?ooUU>33#pGj-;l7;o5JIq#e+0xEFvtb<ou`IG^ zYF=$_5Rf9s!BE`LZXUfYn_F4jW{B4&{Gv!uHVNN|V}wpyFfRB(8wuZJhX)S3bTQia ztuk=DBf>${tKlkBw5@#hiq_X4#c1J}eDdTWsJADunqR+>rEd%4_+<zaXCHXs{3~zf z)bJ%^ZIn;!KgA~a{4B<%jK4bc67+0zDS9s2jm|=^N6$weL@z|YgU&^Ngw99*h_YQM zPo!QKp$DUvpvR(@q07-FsGMTs_^aHFHllKRY$-Z`E<^7{ThZ^Lq$v-hZRj&-JNjGn za+K{=Y$eJ(9V?;I)8tvMN7tZtqgSC1qa5dzhtaFi=h17>-RQOGL`KO+(4)}n(UZ}2 zXcoN@m1D1)(08Nj(RTD>=tt2{qMt=Sg?<IyfIf=eipn<SHuTTvXV8D6x1$Hs=Yy#9 z{nyab(5>j%=!59R=r_<?&~Kp+qTA7*p=>|PKSzhqf1<Qe`K|Qlf1}gU@1wKO9cTmk zKj<p-2k0lzC()bHAE7d*a_mwu7d;D;U#H{vEA}CVwf~Z12=lcfbK8k*L+Sz-Ix(`V zoiCErPuBl^j+E6zvN2;<*7fmh6WDK)U(xaR$`Vj#Qiy|YF}s!&!z7m(Wg66;6zsLD z3tuB|UUI&rfcEm{<PY1ZV0X)`8|x&-e@WftbqMdPjKw<2rbpU?W0LaGD8(qBfW}dd zU1SO>OZF$B7osPlji?;gT#Hhj@>kFl`XnmHH^XQa{V^)XHPY6nqhoF7q)B9(@^;=I zuF@yrcCLni;HCRSx*(3r=>iGXEgNj->cr*0Wcl)9=)^L{GV_Po&ec)wx4_OtX`9$g zRLVKaug@;*qH|m}j&)bs_@BJ5u2LWKZ60sSBO@(NSn#T>l@!jZm7ME~y4&O=M>u9P zGKElk8zfVzWateIei+3}veJkFk>fm>aNSmtl#`-3bArs<KiDk6{!8j9ufurXVJzlO z+C}O<7d;A{hf2H6N2T2spfZjYqVGm8L06%dp&vvSqt~JDLHp77qLMfJ`sGb%Bl;b* z3H=GW6y1$3LuGw$My1_bP#JH`(d^Uc^WMx`W)5I}i<QUfAM<6Zz3)s`?1&s@9W-Cu z!d1(z9<yz(qaaov$_8`}sMnhuqE3{~jha2;)jLUcWuoroYvBAEjygb-y30NsFPTu{ zs5?CD!Qc%K8AQ?Wkb!V`MEo<Q)_!oDWdtv2S9zVl`*7c0K@-dT(t%3WE73SgpPO_0 z-DsB2%yi{Cltq`D&^2f$%9tpxMLD)Be-gbK{WMzUZvbTuGRJw08FRjr?RfbcaL%2S zzm496K8}7A{Tcc(^f{EVRpy+QIX`&_W&ISNPeX4;Gw7}8ndnB8{eswM(D$Raqiny; z`AfFX=Dg(<=v{EOx3POswx8blO7!!5mT@R^Vb&RkkHVx)9_D?G9*6F!n*<@jOZwb@ zu{DyJua1x285na>LXa6>;05D4T3UNd|JU=;>)EdM<!wFTHp<)MYGRj5ep^b$TAWC4 z8^s1G%yJquJk=ss7lLE@5{}>{by~c?_j|aki{^DAZ6Ni08;TvPMN=rp4dn|^=7sVS zbUNCKGG@#48`rDYPe6$+e+$i{(pCjj+H@b<*KJe!iDNf&o;h}HWt#>&!h4^0D^_f2 zQRxD!k!9_pAbyMb2NJRZ*8vYRYj)GBU~$0;tQ%EUO6g3-KK)dA2I@SxoD<|F1*kz) z`v)8Pzv5UYQT|KXK>9%D;b1#IlQxrfk?q!0bT&#qNdD$LBy+O4J|XkAR7>XTbI^KJ z%5X8d7`+5-M`ga2Wx~unE%WmRKEEH8zPYSQ-@F1pn)fL0>ni&uIE>i)-j}olg|fTi z1dx=?n@^io1-A+_C3bf7nxDLj6Ve!k_>1E9gD~Q)M6?m%cU=$>9G-}~ROt?mN~D7m z;^xhjQ2$s($|{ZN9fF$U&;NM!lE6%uW3U{v(n)_0@(y0ouF~JqzngrxoPLnDrb=bj zyBK{|PNOm(GZxJJOJB#BW6SSFKY%VnyHMU{KE4v|<uh}vxgI3z<QhJI0cBj7^J-;u zn9tXs&!E?#&!cP6KcO-okD@oAGA_`HbygZqwh_z&v9*=sBKT>@y|1&fK1xR4u8|(_ zep%8S*-8gYHPFwffuAP}+fls1OOi`FPC%K9%<FTMTgpben)bX8m2!R_mHJR`_8Im5 z#aS>(Q{?>-r#^CLX>?IKPDJpU7#JL=POg!;LCW*x<E1+06gvIu4X3frN!3L;nB(6@ zDzYz3hLOA|x2elJ&=dG9^XzFT@3NGY<&9aVt@sb*{UzSlSF2OFlP;wWUX^vK!{yc~ z4jbz_O9@}_k}@<>r-RUDA7&}Dlq-iGi&BsB+34vgbC|iF@*b4AtXxKCqU%wa2REYU zp=`6|{8U-$#$0FG;1O)MUnQTTc`xGKU#$(o6IuWFHemVsT7v8()&o!Et<C|-C|Ddi z{1Zbm(=>+A%rw#VxeiD0k~%cfhW5CaJ>DDJT*Ef!@-9GSu9$~PUFV}R*5w?7dktzn zT}&UuW})}%HZkX9&B?T-?ec49<`f_22ErFff)^v+z6Ld`ue~S9Iuu=l62j^n0drBR zVWD@UfUGT?H86**!P+8C!kGg5M4epMkP|MwMEYT@i*mch(Rg;^i5pKa`FF1BSYtN5 z(%#lVyIe}y0E+s?w74v>4Qy?srL!7A>N1hQL7=+VL8>7A-NQTB8IUm`pQGjY-7WhW zn{jx%^Kzij#BX<Xsl9)hrI~%@CFcmXp<cZ!Z{Og=RZMn%c}dl_hoR;WgkL~2XBF%d z5O*_vKFV<5B^#;<Bt8r~I@2iCnF;k4xyH1Q6oYe5;l(UzuNO$=rCd|$^zM#n4wK2R z5;l1|ueBlU3)}j!Fm0ctwaa%0uIrh~dC4IRXRiE43@Q_xCiyE7gI+~Uw2bE=-V6D( z$>-eHSI+WzKFWTRxpu++PmFVM<>jbcyO5S{KtF>vqC3!~=&NWm`cJeKJ(Q9xM<=6~ zqtfhL|0$o2_M)6~jIBncORhlWd}1Fe_j0U3`_U`W0rW#C*Rf((qyI*)K`)`qH=>k9 zI>=mO`Z#($pFe?0r`>{XL2pHWh;rYCxi{ku^e=q=EPBLvt~sEmp!cGS(J!E%LGMTJ zLLWc}(J!ILGN*hEJrUiCo`OD(E<v9}%jl2L&!WsD=H7}QqYv}>C+IKGr_krnr%}1K z^fNS%?nH~|FHkxE_YAre{T14dj-XedzecY^e}k?=Uq*k4j-rR}$F)E-iN1oKiS9u! zME`}p5B)dViN1l}fX0~jZbiqV_oEZgA#`8#C+L3Y@6i3xaSS%jwVHb_4nW_|=L69? z^kDQ7^boWctwFCrC!;b*Y3uR;ItBd}dNle7dJK9ZWAP+(I?DYr<plb6ROaLBc)Rnl z?3>8GM=kG99>G8FCFeKIwcQ4}dfjb)58BMf@gM>v>)>Thb9#FqU96s*!t|~^7YK+` zWezL3)3AqmfrCI<hwLq$ltDHy3=LBb`B>&p%5@DYWxE!YI&e;!TiNvflUzrY?d(J7 zr^c>>d0?`sgv^`4%dJGT#W0%?`@V)not+H}+d4T(BR9A;l7p&i8^ErsOu8l556v!_ zv|~d@dv}ky{jLx0o$EE++*2#@(q7&aXm~gcP7Cw)+BME+d*+w4(xhHmxuwtan^{&S z<R(wKaa7HHUHE0!o0rVOb*NWl@8Z79e22t}lVzrn*V9xd+E*C$p!qNTApI!&RWJDb zCi+eK=A-BdDEm_8JaIodhtHoxo6wt4X_Q+~Y;!(k3wj%${~P@@`aAS?R0{i9bPqa! z9>;R;LEnLHLKmX<qVGZPLuGE<jLP|#FQSd;185J*K3tjWBeAcbGPb^oa$UpR|0Vam zeVxx-hlo9d%J|xb$~dH46~`qVFd4J0yl>Xyu#N8wv~=-H&`sWzOX;iNH8C(^vLi1W z`#Q)@GitnaW=~#POYIg&XT^c`I0)CTIvl}E$|e26U$}4oH|il}r47sHp|7J$(bzce zoC@b^O+D9wa?biT4|X7LNw=YDJ<VhF&8k*IOz^6#XdG8XMI~Gu3&#29D5X*|XGjYK zFDZjmh`A-ahQ1$VmU8Wn9)cc>o`tdvHTO`m4K;O@d&#5^<?Wv9eGPUh@7=s_(RJ(S zT<(2|+`Ii|@24Fq_C=*%>&aAg;jzHQz+T?mNWd92?)MHZ-Uj=E{uzeork`kqj+o4m z_CS!tg)nEUAz{*%eY}I0)LGhc5@N;*dLnHk?QjyBM5m$4QMn(X9ZjQmp>jR{ezbt@ zK#S-PP|k&#>p5~Q^_P6ELw}8)jY_+74UY43dLECl4a?&D2c3HB7;PV}L1hAimmXMl z)637?vd0-s>h>HSQ8U%cu53S9K5N#zptsGsw-Ky5PIeLpfL_P7H}^5=*%!r~t`z4W z;c?#dGdBTn9I>p+{93x1bfx>eyjnYg8wsX|%xngZArDFKg~=2j6w%uao)-H2oqm}g zWT@D~!rte-nl7h%<t3pd)XSUaVey?a+548U>21=y%}!hRIoO=r=M;y$%!uJdU&@%u zB3pfa0evr@xlgJrg<6EJK`%wGM>z**uGuhem&cQadD~n+Z$OXab0aDRmh0YJGmou6 zm!h0kH`mYE_buPR=Ms7k+Jzp%{;6CCXCFAmd|&<@+KXPy&c+q!3Y7W3+>Ks|ei*$9 zU59=My%}X++FaKzqnr7B4J!8%Ux&)QQy)Qhplm<NKS3!&`IqQTs9fik>*R8s`{QUC zmFwej57o`+%cxu*--F(UuAt52y7+4Jv*?ZJooGLL7kUdy-O7XL=g@zko6v=<Gxwqm z=;zVZ=w@^i`T+VBlw;}gL+IDgM^XBvJc6=)EB^-lIx6cX`}Y;==D}<%r0*u6pFIM@ zd&z!c@NIx->oy#?(f@zz<_Nikhsxgf4`i0x1y<{(z)@f?Z|<A%?u3zJ$2}o5E0hfS z`Ve{RogADlf}Lp6%1YMM+h<mVXy|*Zf=r;^s^P5))z&sC$sFR;$trslJcH38cQo*l z)vb(rd49m`Vy=rmr_?UnALyZd=y_hUjDFOsEr+Yid)mx7hz%h$dwjutF!ti##Y!?N zE2_76ndQ7}R+$+=4vM|c-gZW^u#+#R<WpsX>m?sR?c|%n&t7urg3TdYD0f2HxiwLz zx5_5SI|Ls@{nHh_awnZkH2!2G+pmqZT=0^yDRWH;k$W8FRpgi_i_*g882lXcQa+!H zN>|Q8KZwe?EUEV#^l4PiWj%w=MPEVXT-N?H(*jiXGcQ8f#>JRF%FG9`h3NOuMX1a* zm!RCE7`qhRh+c;N66JWfd?IDzzL_%1h`kqWMc<EJhw>eU@+Z(nbOYLq$}uxB<!_?P z(Kk@$tMVk;oqIgXGtf>ni<Z#S(becB=oRP}(KV=yun(e-pjV^Mqh<6T=(VVfq#Mv9 zQ06^zEPWFy$I9H-Q!b;lYxyJS$5A<%Ls`qCDBrOtpTyj8D|#tPznEj=Poqou%<+GD zIm&%O<qx5EqSvAWs2nTbjs70J2Q4rZKZo9kZbCnbegWN%-j6<tZb5gT%)jNG=vMTP z=!2*X<%iJ&CvsXJJp&y=m!XfK_o0uX_oM%f?nJ+bzViU?4MOLjKR{QYkE0()e~A7R zeG-+i{!_FEeHz__?nEC%e}VoOeFps%`Yif9`W*TvbOe1B{WW?3C#0W84@X}>PeOl( zCeYubb?6_^3(*(R_o6SMt?0|>YV^<OCiE}p@6o@aFQL0pS&Lpl&q7~Cx1;|;XB^D_ z@&v{&x<5J_Jpg?SW&2eAFgwjP=ym9k|Bt=*0FSEL`u|TLKpfBn1pxsaF=&)x5Y!;3 zi3Avw5+Nukngl{fXo)Eh6m>AD#DHSQjvcQkRzyV&ihvFKz1XpFiJ*cN3-bT0wf8x5 zW)duj@AJOT?|&Y`cb&ES+H0>}&mM3-*bclG+z)&j<eXM`B^U%h1`h<k1UrFWg9m}q zhpgc*c6`^Kb|6i)HF#rd2=hesA%9|9K*nk51Z|)%2*KW|u@&<`S1XU0q9Euypf9Wx zkEN$MT!SO_W+Q*@Bjpf#vmfxjWj05?QnnVL*d1BJIUSTWoLQi(;oJ?%8qUMuK42}_ z3Va#d7nJ^qb9do*GT9bP0%c8yv9!}3<eZ_?0X!YtA7q^28~{q8WX*?u-#Hju0;Yh= zL0JQO7d#C74D14K0K0-efZf2RlqVIGdg%d5{Yf5<jTxUG1rHT=Qo)O(>rXeFa`dJ_ z@3-D$f|QDP_epRGo##q_nGVOlxg&Lu1ka3EC+D$PBHf#Wi`v7IURq+Se=@d}7rLN` zpAL%ZV2W`I^T#9WH$l)GWhgm98Eqqs9$sf7b^ic=?jthD#cu8c;||LlM!X`IEU*oD zGMEgG1bcw=JGxgs8tl*eY2XkL{m?T_W58*==YnByEGX*><G}mD0`N7k5d0i00>1{Q zf<J*2EPM$0It!G#DFwH}pTb}4d54zpFt^$c=QLD@<`k0D9lpG$e%*<)zwXSEP`$N1 zNiP?9(RDc@6L~7hpX7nDzqXmPZGL}&7i%;2qdbZ5TY=RL<yY<z<1T((Y)HqW`$Xs1 zKPS}5o;&#S7eTaQ6yc3l5T__#5Jo-aOMzKm`BLE;)vbRvV<>LV^2Z}1y<VX4>N|lc zx;9^Y*hk7PvXk=9w!E;F*(|UlybHiC;Kg7XSPi0gdX6a%tl=H~(eEpt1TW)V@^Lx% zDtHxG2VM<|{LwqLJ2!wLbH;$GOUFUSu9b+rX-Ak_!Alyd8@;;Jt(+`;y3e1eoLv0+ zD@Uw;Av{w#@&kz62GWBDZf34gY}1}mGwXZzR^=<i`x<{dvJ8+822p3ek;<E(9H|GB zA32up_9AB8Wf^YnBl63oep|s<Y?*f;Z;|Pp;342$;E~|H;0fS;U=D~~2u}i+fF<BV z;PW7Ti`t4u!Ogrc1;v&>4$AoT36QlK2VKzbm6n6~ygvm_133d1mOZyxkol*x5|sKS zZq<W(h%>g0z64KnRMM|$NDroP)sd?Psd#dqXf<f4N025N!u#(xNeP*PFVmt-<MY|0 zTsJ*X@|ugx_W-jkAD-GF`eAKTuY)4{w?N76e?aNG*MVY>-vd{GAA(ZmkHD><)JN>M zERrqh8#?hfw;|b#pK4ZwgLrVC`f`zM_*;Xw&MUg+K9W{0W#gZB9_2IgCh2bgMbBvK zVadxEpyYWkJjd>*w4gFY*97M^lxN+fFDsf-!gm<bQ*6Pr`}p#1zr)#xlYED>r_-XP z>kEu|^>6179@?XK51LYBflfH7v7EHt^*CwuI7ipx92LtsvR6IM5wV<J_0sB9FP>iY z;^|dCo_eL|nT8RIlr)=jz&ZW(`i3Y0(9Jb)!oh!nSk^i#xIv@g<xXiM4h`9_MbZ-` zz%%B{tZT@i)4WI4HL|F#3a!QHRT9IiWW-m&rCSmkLmBI{$Xhirt<v1~k?Xlf)&%lB z-juwuNxJgT3zi9H8gqjSDKZKi<%OMLbKzf7D8cn}%EKd`Cxa%-Q^!x|j>h`eIGjdP zVa6kmnD#}W?O0fY5KbkWmAXD0dxD@1K~FV7<ru~zc(fwZLkTR7O;?H3dJa?dxETi6 zddw@GP-Y7u<$b_&u*VwYG|DoMslKg?zs$0#+s-sXsq!@hFp|t4Ke;?l3$fCRL>8_i zODq1h+$5rLAF%_u6zvum@s`h6LHna$!4u(c2RX|rXKcggfvn$#7lN`UL!YI4GW1dU zy+3`Be((P**aCOyP&rc_{t}eE8vY#AFf8LA*|U)~U)i%^@4;ye9tpMqM}loZ)^VNo z;00huP}Y9w>%uF+PT*T0ap<>FjFZFP@=jdgj7H3VzyaXlpqzy`0;~Xgft;6cNGp6H zcr<u7DEk`^fqg*EBj`Sdd^;uk9GnBt{f!`l-4l492=)Ufg9E_1;6QLGC~M)YE$BC6 z{{e^a&YFR)jk5-zYvT?wr;PgD?J1zF`-}!fL-W8s;8;-9t^gbhP6jUkWlj8UP}ank zfhFKpP}aiRQHSMVGFSl~3RZ$AgR&Mr0+coIbHH=KbHOlpCwKuU_fhEDH#nR3=fI1> zZ$QQl;T@oSD;CeFNY=m)0c*evP}aib?8H2<5R^6XDIniggl`08ZTuck*2eD#uL9SA zSA(0tYrtmB%v$;0-~!&;fU;(OJa{8`BFNZ9&rsY9p2j<4nD7PQZQwjm*3K7zcYxP} zjK%Z}g{+ys!uvhodmwY^@J8?fP@2_a;7ITZumXG%ydGq(9ljfU3S1064ZaLM1O5Wm zf->lM4m=P<H^XOv&x5yvtH4Fz3*Z{?Mes}TC9pZB<z?^~@D;Ex_!^iGz7C!Pz70MB zt^?l%-vM`k?}9CwGiCu>g71SzfFFQ);D?~BD}4-J41NNx13v|uw_tq=OalK4rh*&6 zkzgHI4t@dN4sHVP1iu1b0lx-62We~JpTO_Ic6+ie1s(_f2o43efmz_sU>>*~oDKd4 zE&z9cH-T}D7;Ay7RfK;A_W+yig&hI+029Fjz$EZMuoZYT$eKpDH`o>&53+U>o(ytF zTX-tCKUfBK0%w2+gV%uaUHomJd>4NQcql02r7y7^vFjqIqaUfb4F@l64PhQx*D~uO zI$n}%JN2pz88L-jPaxXiK6;EMG8V8i)d=H{yZHG;72CxxfamYx7kclJE<Vzcnl3)J zGnc+3mvE*}Go82a3gMalr7}mlMB(-Fc)!zo%ZZhIFT&!|3AXE#2qt?G%+N?>l9vVV zLG5|VD#n`g&HirhUpP0TZg`}tF9CnQtCvd&P&#>}x0N#Z`)l8{P1iKivF+|7^_`0? z?GK}u<;(pDq62b2LK@f;91O~R2vQum58+bqSdh83a~!x3BwpP=&jgvPIrK$3FCPg0 zoA(gNd_(U&_yVMl3QIZV4B>v@81O*wOz=36b9`a?7AFrJ2Ihm<LT5aP?bEY_4}x-* z5F6u621N{KfsH6jDM*{rGlqwO^o3#0GwPW_($q7BW5ILaSAjD@&g1Es!jHf(?_Yoy zfUJo+_z8~zF9y#BF9B}=<*ec7;9OApJ2`8}nzS<?>;Ya2%D2DQgJs|ipq%}aGl$QB zw}5i?Zy~q`RY~8h`xlGA19_J-hw=@uoH-l<%9+EPz$M@<AboiF8Sr87b8sp61Go%q zLqGF4cs}?9I179Vyajw3{2E*VN<Z{0*aCbWl>X=i@Nn=&un#C_8jl5E2E~3*U-i~e z?xGwWaFer+m+jPkaL=Spwie>keg4pNm|>*fAc(TdC^BlxR7R||Fgx*A@9_8<&%w8s z`kKeoy;Lz5qV|3>lkUAo%#1V<V=jzo@HgRV)Zj7Pc_g|JXq&KFl`QYwSRW~fSgokV zIaxu@g=rS&^d1{AG}01HT*Z^~8<;3`qgEcK74S&X5u;Y5WAqaECfBkftY2rBsYAq2 zNxarUtW_l;e#ctfiZdE0kIX8<VDy5KUoLZSW&2Pb@hq>=o+Bf8b54q}ocD-siLL4i zhq0kPZ=;K%Z|{K<K=voqM$vxtPMr1NRq#Inr9wUj*MJ*9u}SPc>pJvi&>_yRz&$}d zHw$tmINT2W7VHjw4>G=UegQ?waqKaC1U3fg$DMd^U$7}Cwq_4-1Q-BEfwGr^J<+|C zD?!;q5$VYu3hhewPJRPr&xHLC-7`5El)V!6XPu6q2#|4kxD-4HWPefjOlm>Ggg*oi z0oQ}FM<TXK_D0f?o$QUA0QLmW0*?acf@$D&U|&$$?y;b>@mnZc|Cqg#L~MpAe^c<< z=r$fXXR9YD`1M8k`hf#N1!h%yKEd24!6lpqZ=!5?>Mtt2kbwTixyXArjZ<351MnJ? zKThx33m$W{IYe5|RP8H6_%p3Z#|o(pHcx2<Qs9_fI_ciCz3^f?%uQeE@alcvkPp+e zyU0L7tjtcg_{wnnm_HsF1xQ$vQU8SBTRR&?J-Lt6kL>BC0D~=mHDgaH!W!^cP{!sb zf-(jl4$2r@QhWov7<?1F2V}mf-w^)?l-$Tzd>bfZ?|#IM?uSF5jJdNx8DozDS*p-` zK{kMA@h)TSnV^idF9KzZE$wJC$b3h~+IN96)@FX<Yz3K*INyNGEA$R4#`8MnW?Zae z?Q~Ga+N(erV-G>k8__Pyz<97fdYk~ZK^85*yFnRSF9utJwV;fxSAlK7PeB=5e+}*j zZUx&5Qr>vd&WLFTtd;6_d+&e?e!m^)Pv!9Kos5@r@$No<&;~@?OYrO0b}`51J)-Sl zc(K|pN*jdVfYSDY9jlAd5TbNZ>~j`Oqjcum5o43XaNS2_AiBmhMx&J1uE^{#ke(=f zG}s+H9y}bB_LmCgf;~a$br^Ssr-Da;SA$1`*Mc(6d=TsdJ`2h?a}{_zD0PxYon*$; z3H2!7_DTIZ*ZqE-l*uXfvZ;9`Wm+vFXZMM&mWC}+y=^$DtS~Y7D{GGT9;vMP@M0@V zOo`M$xtc7KDXGA8c%}lRx8}V5*=nG~a2U23KZw`99#6bZ<0nsaLn#$@11gXWJ5~h> z;YF!{Z{J}ZZtf#8mO5_>ylj~=#uvHE82=dXM6e%t5_l3wU#Q<u4+F&%W`RZEaIhMr zkJPz?%n4-fa0<8rJQaK$91XHQ=bR3*uBCGY*0FT1&>zf!e>y001+g<@LDm~|uJAfo z$UF0SrwEie!X)rla55;m#2ON3z@yLbZoqzs9<K+l|9xGuw>NUpF<bS2(8~XUI*CsD z)#=Z+{pbTA@~MRCLXhYh(1kx`4*a9Ic__fE2#hDX50r1_j?jK~6mBNxXT^4@_=!G~ zu+T)M@rleuw|W4qm+4bZ9Z5aN{7vl1G%y{U4oah`1V@7BfYK^t9>+esa~^m#7zSm% zb{6;@$oNaYL6iAhU(%5Iob+MUp!B0MubTwU1<wH~uHI{L8Td5sSAkM|na{Ddr1Lmg zOSy@68GYXjP5~E!GOxT1ybrt`{1UtaWIX2F1@;4FzQ>t8=U<?l<(2u~Byce}8<hDT zXV2tYz3@u#LGS}m=6#%v(r?aWJyqs=Z9$pubp>U<cP#iMDBq$j2hRj+!I|Jn@B(l( zxDb2+lzFMl_g(;B244bS0i}&Jri`)srP9{A<0kv9H$=A)PMhXT&6~n6D7asWWZ}_$ z5?sP*aP%j}G#4+f_DgRh_DSkj?)5OEH)$VH7E4A-(nxwIi8l`2l*%P<5?MN26L=~c zynLYPy%(E(nq(NU7BLN8iJD~pR|ns~t>w>sL<XX>Qv63O^HXFda`_BA3Y2+=^nrDt zjJv)7rO(?8UIL;QI!}@L#-qG{1HK7<3;qboykiIW0~kkoKY~&pKY;=87qA=nD|k4_ z93m`saR)dYl=(>x7!QsEo4Dh9;*32DaX&odr~CMKNTJLlYk-XBr<Y<+N+aL#yUv2q zl`6AZi6=2Am0`l^pt~*1WqS*gYl67$MdzP*a^!DVT>f}IC&(+4n)AlDQupp7`Ku+V z064}nkEEGPTF5$lAc&pN^GeiUID_}zU=~Q<r2P)PrQY>$9C$r^>L$Dx#INdlhdA^y zraxf4oS``F54>|{av}5FNtI(Rn3dsPDk0pbzI@Vgijt4$Y6zyQ_+nrs<L2FrBE%0Y zPoJf6Na2kiPO7NJ2R$F-RO+;38=`c)Hc9Cvq$(=-<Jt(>u#}iOcq}fn)#HVdZR1HV z)R9V&HjsiG+(%?1b<zoj$W9)L5f*u&@8KZGI6%h;i~;o=$PiHGB16Ic;K|_W;Bc@I z908VrBf)dQQ^Cu@(cn$sX`qZ1(1GxC;2EH_nH=x~Fc<tUI2POn=7W2YxACB?Hx_`M zK+@8C<Qb1>KQIx@f<FnAw!;`z@4uZ27V};VP6tcC^TD&gxgdGfISr!HIn6XsbY(iY zmGsYoK0ZdLSmV?2Dt&}=S8F_(C%Ua!ohqHo1XEOsguMruyN~_iF3fv9m6`+7uTt~9 z_lQbGOrp6CE6elas+6=gqX^@)SC81t$T}7+&e=OC8l^n*K~KmF=+nJX9@E<_C!96H zC53Wvv#2QQ;@3X^Kty`^wfyn89fmRC)36-w7O<{)&q4O?BQh6V?G8h2H^@G(>gFsE z+u&RPO2SoOHaHuU(la;Kvr3FvRX4HSVchg=+STA(-bFX(fp>zJfy+VkHoO|dkKPrC z%?YpPo%M5Fe<F;oh2IReC$G1FV#gPPGS0mflrhR}psa}#x9a9ypxE<!z^UM3kbO`+ zTXiA0g!jw92f>Bl!{Acz5%78NQIItN{U-Ela2fAAKsjU83^_dk?g2gt%Dnq2@L=$1 zka?Z{b^!A>=?}yGK-yt=D!39X16P6Pf|NacCAbEZw$Ot#V%q|15Ncm#E&uM;crwq< z+QJdq7E)brAa&|KzOPT~wFOZ|e_M#?d892!R2BTmwUS~K+j?Q#wjjE1e3-Tn&%05+ zNLy&(`SGcJ&|`XP52v2mCwbmHqYFpuZaVUDACZ~pa%UL5EdNzx+=}-%z#xcCRNa0H zJd*df!DGR7;2`i_P-MW~jLy;C2XlG<5X5#l>p|Lw^BIV~JD-E-x$|ETJ=EV@xF7t2 z_ea4mLG(pF#MZT=Eg)%1-oqQf@4#Qd??G8t`2lPJ{s^`Oe*#56eg<V9=oe7ROqlRM z@Hg-bknvD>Jm|3YGX-Q^6h0dyPQ7ck3HUGGn}Lsj383iK9-!#pq3C1Z7<;^b6LSu< zEx4#Pp3EaUIGLZ_swi=nH1#w0-(Swz$MNlU%64haAo<+h$CNKR#l)46iqS}2=9fOd z(qkE=6kZr!1%KAGstKMWyr#l4o1L=wIX~i$$rgJA`Qtg<YVI@cWc+G&>>h~hm@FiS z-${2uMDbH`2=b@b=4)otgrl*Httcqa)*&8D#^k0=S&iuGalCs}B(@ZfJ%!aU;Y6B| z9Afet_f=Gts27hrfOlK16fztB-u$t`TRMK4DWu3U3!W<^$}MSxV40xEQhNq}Ix?JQ z%S#>!KMM4PkLgFY;MsjdSETLrf$^E;GxpIluls|HDfP_GK=2^mC1=UtX<%oN@rB-z zE~y>D`$ZsQD!o(gFi;B5T8G~I*Asl6ciMRPQ}8J8YcLILL)yoH$Af*rQ^8}wF<=HL zW0QU$=T4kVa5XppWR2IMPYHhjo(MKU2!p|H;83tXI1C&JG7bu}cH@iyv%yn9)=(VQ zT*Az=_50Q;@J!xoK;|0ZYrtIaF_1ngEJ7{>*Mk#5=0f`2D|-}r#wQajhA;aaCE)2G zW2SH+SPGVd<=`}s@t6K4P9=CJ?{d~>6-fKnyZ_Gv-{GC{neNGk!Ogr^fqXxtXMJRS z_#)o(!8u?BSPi}b)_`IIke%9!ZOAD0ti-7_f_Buw$>2S$A<ScJMP9yZDg1Z)i3+$6 zn&UnVot0>KnMlk)F2U?=9cqPyR|wBjaV{s3ue3|xnHHkghv)Mv7Un8+*S^@V@%08F z*S=VucO%gpBC(eXn%jqDRyRMwG}jwRlV2dosa?o(6O!rp!iZo0oknnj{JCaJe2QT) z`E|ofrqbb>_87TIDFvQu3#85V@<M99#awh2FZ>OQ8>@D*FSLoq6hopG_j2`P_GBcg zRNhS{R4ndXCk<V7AE|d~_n9!dTK<jbiRc376LkK$5R~!donQ#O3(Nx-fy^`XOx9W8 zzj&Vk-V4qG7lVu~o%=z?STffPuLB<frO$d8+z!&8>Dj_Z!B%mM+rY!Y$3fb(p6SX1 zpX9v&d>WhuJ_GWnXSlY5D|l~28CHTF!RJBN)AS72n;>IDy&q{U$ai15Kg8ao?hggQ zx8QdM{{tQmt^;L%Quc`^fbW8`AM+kq34RD(34R1F2G@hngCB!0f}eq(gP(()X@?uY z@!*%B>{osT-Ue<3<(trNz$KuZ$&xjzAHa>^kDz>y{xc}Q-SG=J0Q?mUfjhu)AiY8O zX^^pQ_ysTl{13>OSI<%ez;AhP4#rXMEx>)iJweex#>C-+!F|AfU@LGK*cueOurDa} z##pG{eMMW~9nK%)Cg)!}w;!yz{LzxKD0~UAxNX91;O5;7Af(-f@naf+ZHm(MOA8P3 z7q#%>w(_WD8evK!m4@Rj=rq)j%*Metc&+5meWbk7Ze&zE*)k76J|cr4cr=&{o&qw* z2uu4&0j~tRfOmtmH{F+%y(H!$x|j3}*pqk0xw=>MAFwa)BKPL|$-VA-wtReFUi1<3 zEEmo5g<oD-8P}kWbCR8AEt7+y3t0n(%YpTrky9s4EuKC#X8^w=nKQs##pe2I?D-lr zl@*er{3u@s+PIq5^OaFLp<>E-4wvt5y(HB0lASk}&kzo>?rrM1XYu3ClXL9n=FM7` zwv`g`OSJ|3yyEyA`TU{{VTBzZVVkeu_O%WP5eHeLqN6YYT15E#R5TYu<%}KASE0r+ z$>%t^c<KbdTPvR%1InJ_))9#(w^VWSpGZ8vw1_P!BXi{4qGgp>OMS%Iy>-yNrc`RB z9lqXd@AqY0%aCA;mYsusCwnPTLDBfh`DM(8TC_YY%H2B!5ILbxhSoQ0d7v13hu{4i zHhfV3q1hSPgN6;w$sRtkfA;9C{w!x1A91lhvWAVw9?@_3psZ|_;FrXrezFFQ>OVMV z$gs@*{5N!%*5xQ95g#rqFB(fS0|$@J3grwKHhf4%cFqZdvWH}3ss0&HlglfLV?7NU z$<MG3?N6`NtmOf2ZbeClP0|v4nk3PWE1FtC$o@n74a*!fbYRZNp@X3MQx(lx8Xsjv z6U+QQMw~ck1XF0&IT#!}!S9?kyq_=dkrOocUi2pn8hE5Hb#^SL`vaevF?7Vpp#xRb zP3n1t#S{HLP8=4>I6=$wHDwy)m>*k47s%3{EoC3nJh8vS+`&m`xe0+1*KpSN(Ww)P z%17{PZv!f(j-xITTE1^wrIq9iAAeSbe1wuM7lkF___cK`$(x!(@e*3r#m1!{t!QNX z;{2|09?WHDLzzYmA3rXKOeeJ55Q#_q?iC$3EhnMn(@{|mAJ4CrtKT-bi9MnS{f1zO z`iUVTX5^XB@@5-|#>`L1mgZ!a=1naVYpp?B<KqhBW1wEAt6|xRO=$ULRBBoJ<ElAY z=JR|3)az^?BPX+X>UfP?Qh(974012@$(x)rWIUTF<1~Mg@wX3P^H!{+{94)|b`~Y$ zBKEwf^oMKyHQxPkywy6or5ZTCyx$4MmFg~;zbD4s6id=;s90KYg)u>VDT<D)h{_HM zGKA{W^bW<fpK<k<lPsx7ZF#+{JsB0z(DBpNMRcQsaq%mf*87L``KmV}r59<e)H|7} zpl8WMH%lw@?s+Neo;INTpqE!IqHQl52UiQR@(C^D3~zw^(y#n3xn@gBJ`2lA5>iQ& z$zL4Fz$_EYXirw@cy1CjVv#sk8Asc&B*wBF+G9e?HBs5_#}7HX`Ig$f!v=F}*Dr0U z-9wGL{;+e1RTR@!MVH^T+7!||<y1<NkESMoO4ciz2x6^q5J9NtBzOZ2Z%7_`D!17t zwCv;yK4Sc2t|C+69Dq}Q<K(Y+EvCkHFdq8U_uy(qW?p%oMkHlABxu?}W)XdQ8CRWY z3@veq&Lb<D2`!t%wsviX4K*b>rG~goCQhJ<s74*&E08s5nh}ZnGb=)K9Wc4j6y?^# zsAj5d^jlMnR%bAt`~tTpM>$!mN+X6v4TsE)(4;|A%X`Xa$O$c%n0$yJOhymFhyJ)& zPC0#LLd(Z|1wAFNv?y<Cc|Vq*q`ox6Qads*Al6JXBJhl#)cXy_NtJU1tw8f80;!5* zT#GlucvLGlUOEBRc@kQlZn#E$+4D+hDd$$DOd~4BYNRU7hBIIaM6F8ZPLQFIM6lAY z_##{pgItF!v5FkIma@ToYYkuQD^E_p;*uFE1X1KeY*uZP(H4D#;aROWwZoEBLd(N# zG~=g^#}sS6Zns$w>8g|@8)a^!d6T*K%(SxDT9E*@W}<3kr44KPRL}Z|h7Gs*(jNoY z#14e}yIqCpB<1!wk<;Mf2?O}Zoz=aBmiPK2!~W5qib#DLpQ9pez!Yi07y4wcc@e!? zYME{|tApsxfmG*oU4fL}{77gy#iX7Qk&npjF`Fl=BpO<JLm8u@3?s(#oAp@Ptb)== zXPBckBNskO361^Ij5m-MP5LRLNk;9xoXfC}B#b#W6O9~gs*l<{Nnbz%j5Jj#Mul-4 zqQ45Raf$j%VTo&`xz|;+_hDb`>P-UIv$<+Bvu%2&to`!1_L30V)6Vt95;GnV8Os5Q zX?f;8SV{CcD-#*pXrfZ>^{iA5W5a}&kJPspo>ofS^2<RKNupB!Z`!!M(MJv@pv-h& zlFZLW$UgJ#H)IT&`IQ&(*OGQF^~TuoRCAs|g+AY3Qp~;>U~RIJ7a4k!m%+?`)JXe` zA;%vR^n@<%RF<YmRN|f29!II>25g$rzCF2gGbs)(8e5uIIz!o#mQ2zKJW?VPIqhe> zso^GH8D=4`O!FqA*jCZ*Cz&4;R%fa5dW}x2yum@2X^!&4VIm(Dyfl#p^i)e}g))GN zX}*?Heu$EsdnR0)$#sS)*%zgfj`;W5mR8XxHVae{vvo0B8dWb-QY%EY=UJAe_KDGS zu~i7^rlW>C-cUkHRDT$qqgFT&QMt$<OiWZKTPLaj(vi(H>1t62>#wAG)hZuyxKc1q zDxBDEOM9(@@XO}XIDQF|UR1_t(<5b!Zu^oAxkyf{MkFH5UJgK!mN5oev4>hsi-^w4 z*f<ll87#{%)O27I{p|6kN0GQ?ZbsZpLa=`-9)5I5IMO@Q6!P*_#}2~lgFd<0PG(S9 z=J<j<ews@?Nw+7b4<++ig)_8Akg=uJU16ize$|z}Pfp5`UY7SWf(b2;GFdo9f3(T; z{I2OUtxYQafmSA;#-2$>Bbp~MUTowgc@(pvcG6}`t5W=lg1ljp@v2w&;<?1|2b7Ly zX-FoWVo*M^G1#t7{K^!tVXJEL>}%r;uOyN|CT3G@W|>ENx9bdBMNR>=D^UOUMN3l> zl}alyiYfy_OqImYGNKU1+=*9FrUdIC%}GZr4b4l<6krRhN>UM~nydxV@=KcX36`jZ zwm~(IGI(TJeQGgEE#j<SIHOR_qe^GzF=7MdmxClq$(l5`HdgMUiW%kQ^iZ0*l<!sJ z)y}GPNSWgtg2QnpjITe)k$TfQ^@j7J6j751(>MLjR6)fYrG~mF5N(^x2;tu*2ewYN zdCxMr9cYGgtR6B7r;zgdV+k!kH;z_2rJkhSM2`S-R1alc1^M)!%Kk1DZIXM|Fl~RL z$=w^%Fo&`PrjnC#%XcbLrDpb^<&s|!B3>g*Z86OvF-V4_HtVaN8MZxc0{aK|s(}f% zmMLe%s!G*0_SLF4>J*2DCRp00Uh(J8UE$Fm07+>1Y#Yt{09_9qAd7*jizTK-XeZK~ zxKkyHL4*5iE0VQ4%4^nE#Uh%)>uV-s!z#-4S}qlNBe%J@a}zOqznc8`bxd1nf$8l` zY}eZIyYmnkmj6LO|0u!?=|u1isJd!Mj5cT`t@8=pj$D;5Yo3&NSZNW<(Rq4Lx9Z-* zF=jAFO~P9y7Hu=`YLF>Zbhn<P(!95x-BqQMiJ~NFZm<=Vj#jE1ZQ>0YZ8IWaam*+x zqSpb${Sl?iar+zjJsVYRvD0!PqNuj?D6&wcdf0$Sa&+`&2QpcF_buADAto?-Z>)Ay zdseRv$w#A<GM9<M%K=w9ZlfnUhV#t0RB3&sHEpSWpOT~16gwx4p1BqmPuAq_^vTB? z_=sF&dw{AiZDd%9vBC{>cE;>4@<k(J9^}bb%>H~+Cez%tb=v;gnqsdZs2z!JQYs^9 zi8)2ZoFvhrCE8lXT$+wbb*i3CG+FB=VROc@RbfX@_P2&j4Gyu&Z$^cKid8T4F8qyq z%3?ixPK`f3<l@x*_nX`H+HZRoKTvtzQ5hSre<Y=1cJ)c~E<I)9IkW4`ck%3Vj$T~a zI*|3qq!DYsS$^3`XJmbKNzaNy3is@?SJ|BNHvWf0Q8#FOCpJ!KH?}gd{ib*04}biT z`@bGtu>bbr9$zira@VwO_jW5s@axszws%KdoVxJ76WYyd-RiQr559iJh-vp+`RR%G zJU_nsh2PKWlA`BB$lt9A-vvIosN*w7^+_&kbN3BxgKfW<c;>`A+rRSDu<iX%?#+QI z&O6}mtv7$V^4s?Ycj|OY?yrsaoAv#;!#=paXXoMBd-d9U;TNNBB!91}zilt>`0VT@ z1=~Nl`O_8qY<cI~rE`j2svLW8TCcdRr(e|W@y@!BNqnPk*mK&A@k^dte*e6;UYox6 z_IvIuns-*0s;X0Zopr<ECzaRg_cZuB`Tp#$-!9(ggD1}H`d#Xw6Z-VM=aCW5mwpjW zcst{UjeR?f<a{A}$ic>0ujGF@?9KC^&raU<$&N>!eeCJ|??3Lkd!8ORA@j5SLZ2Q_ zdHFsTf5#ti-d8`rQF6t_gVtPsSn#TspZj*sp%1QGaqSOl%d5V4BW1AOO^m<8tBY<w z=AIr8@Abg1vupaCvSUs0&F9=W?U>B<{U2yNVfow|&QEH5`<`2O#9?o}|MM}|^mwiF zQ!9UM{L-2uZ+)*@$qO&1PTgZ;-yWQUXOB48_?3nEqhCxbZ0oE&b3sYpf)Rtu7d8IZ z_%3fP@6xN;2mQYsz(_{@?SId0pB`5H&4T-8#OJkGos{z8Jr9=lzW&r3?+NU^XZ!s& zV?$n3f5GO1p8fibNvrSae$&r=X3t!;_d`d2^!@5XJKi$CWA8`q{G5XUJ=s$ZHg3PM zqO8l|`<>F|(QdcC-}S*0*QZ>+r2U1LytnYuv_)T?Ap7N)sK4ZqXMVKwo06*z*>cC? z`Cs1gVd#yk-Z`aD)904{+GWRSwV$F?Th!mnUv(V!aplAB@7TBVteJ;3>-5V**A$)d z=1ZTCIN+<7CT>3sC6#-PgN<8H+y2O24|V?N`(D-W9sYLrjMYyjZ{2X<XZMWhdj5%} z`(AY;=T6mM(dMo3Jum9?*w)WZ+Vi>r*S~l5$|>)Be&J<jtU2Vy<Gy|Tsss53xS7Nk zcj2U;f7$osDUH^SJ!t)YNe4IksO_BKy6Y~udRcJ)Zx`>u!9DqHLF#S#k$b<pV&%zW z_Ic^@vfI`SU$<uV18d(O)#}x6ubxzXSkhUXQ&4}OFWCR>&hwvqW#)b7&i?PceFiRT zd-OheX%`Mz|5do`h@Z~5mwjUPk%{lIeGa(%^G}_--}z>1Xz6b=?wNi@)91E6eenEC z_qk-%Prp2m{M4T_=aU(qTsrWqbC2F*;_%y3RyDo!yZw4D+ZG-=;JEz{ogK&F#x3ga zfP<zT(IIg}?c^8txjp;NcAs3_eCC52)_-%*vnTX!etD}8Ldb6qN%xKS>)IXg)Eh_M zGi=3@Nw1G<dDHTbzWC_T#OddBt9Y>Mty@w!ccK2WlE0lewDRbq0#h!1W5%$9?mK_r zU7rkCz4v2DFLZn4)D`dEjxh*Ge4mz_a?5wUR{!wZCub~9x%%P2;=Otte^k4;ZqDU< zCbsydCHmK2{SCiq?O7|Y`Oi5?CtY~)<ninNy`kgTUv|6sr2G|etuEhwN-_3uk@{P( z^swiDIpOkaI<(vT{fdV+WIS^8Pw~O*t#?j+YWtp>&f0t{=ONVJl`Aited`MYs{3_M z{_y_6FAO~6<R=gLw%?tdPkeOw<MYnAqmVPY%_V=Ay<Zv*E*`O<-&e0Z+b`p&igOM- zGtl+)B@eZ2UUXv8p>m+{PW3k+<@E6-6{AMqx$nvU%A7v&!~ce+&A+d(>ZbF?*Udil zs^@Oz{Dt}}Zu7;|Gp^n5u5-pd)1~0Z&zAhR?-^^}SbcWcF~LjTn6&ms4hM|pkU+5U zjw|nKz4@4j_Di{F^QjYSnq7L<&!06ZAAA0}8^$gBdcoE{$nOsI*Lsh}?~K{eX}_Lp z+D~}(@?P((xvWK-ISaZqy}$K>TOR1K<a^Gjs=q6axuE94r`k?fJ><9enmLWHyZPXX z%)mjP^!$EF<(VZV@xwV^K;IB-{8aJRR~&iniK){HMx61$O}z`+ZCO)w)!L#L?mc{K z(Fav!XYkdL`Wt;yW%rwsOL9u@KmUd;`<`=c+|rR%5A?0Bp4Dqeul@SW;GpV%)!&po z?>Jyn(<|3@cyPs$SCkF9=!;_(EP3&g>sB2#u=DFb{qRgB^}Cm(`|Dw$eTM$K$qP%z z4m#-J%CjH8rrB`^1>c<X=21WIG53lGUm43?QtGco&$S<)JiJlSDf12-{>+L+U*2}p zvQy?AxA)$4m#po!`O^Du<2;V~d*kCqZSLzd@{q5`AG7v}Io*<u+h<z);itZ{@S*Ih z=l4By-$&_Z5+&Vt-g~RxNoV}9vG1FejUKIOv-#e8kNtlAu_>3oe9P&po@n2h1H$L1 zze`?SzxwuLhMe|E=i|?s@Kcw)O6PrX(Y7P1*VesVwes{fr%&blkop@tHo4i*>;Ap! zhgI_ijQZ}nBezfbBxBx!X8XT3vv0wy6Nbz|?a|d><KNa!tbTZOuj40w`$Ot+SAW~} zt#|J{q}PD8ZT4M$Z_$xWwzK@2r~dZt+T@LI7EXG)<rf!popa$&w>RtAwBI2eKfmph zM|T|9wEyfuoPSb(<5nHC=#Z_Ao;f-0`dfc^Ec3p%s$MDhGP$x*U7s_SPdxi0?6b@^ zgN^6y==|!9jc$AHspB5pYr@(yN1U{vUuu&>Q{Fn`z55?Y?QuJO)@b#&`j?CDdAsPM zhfjO5<=yMQKkw+9Zn@yB<=alrxZ?CKGk@%K!Ty}nQh#UUy|%P$=$5LksZB%9#@E^( zzxNwAC9iq#sb&vv{`9fKu1w{~3~2`&uidn7;X%m@o?3eF9S6+1|J94y&;RbCdz$sU z;jO#Fhp)Zlqh*|jRDYGP_c)=`r8lp8`mXsKHy!lc1@8^3`}mA0*`pu*_1O~-?%aJg z-vX+?raeYK{Ce@!jxTID_nRgkTsCFq&`z_uym`c;$!~8u<kZg3_2aCy`n!3;gsHVZ zUU^Y^qch*1|H0@Jjw`<TrNfu?Z+GA5<l|S|ef$NS_uNPF*Rk`fJ<cw>?dj?nWw$?j z!hN$}xFhATb<dtUy!9)mz0@fCeO4^)SASpb*j6y)riU&V{%!HuJ<c6H^2NoCo_ntM zC)4^be(tJMW{l%tPE)1<!N$e;Lmqiy=(zUVUtD&@JLMO*zv6(}@=ss9rN<9R$6vqw zmGU&c2~vOC($8Ge^x}6mJiq<D)V=3CSMpoQ;jOP<u(Wmen~r$+hq>Lbf7hwMu`ets zd~^O?FTDQ9cONYN?`@;r-?Ze;;^$7w_^#PelagN_bwB6D)ZaTJ`%HWK*v|9L34hmn zbE^+O|MAIz9~?Vl;*ys?t=z9!kA>LrUacj6U9SDl{PI`!Y_mtZgW3&zYs8Yn2R`vl zlOf~c!U->Kz2)|f-OT+K!N%pIho82`U5B1jlYGlZy`Dcc_uRc|_B!_aaksvc{nRC2 zbbjx0zT?yQW=!gIaQNE!&8lZV-Y&b_thxWqnEyu0<}Giz^4Yteo73ft&pEfta5~ty z?Tf?X_dWIUs^v%B7`Sxg=vMEIshHmE^eacVIeyjh{-a0cavoLveY5`Z*&UAi?eMne z|F`kN@5jEpA^XJ(Hq7mH)Pe`5t~&pQg}u3lLH(^7I`60ACg*>+Jih#?X=A=R=Hqie zJ+aFHFT8&3=&}R9dHu72v~woL!Nyw$Pq}f<hVowr=Oy($;`x&7$M$|`@!gkyb=cUA zXJ+K|z8ig>uKw;i=*07H-#7luOE=`ab;X>ShxOfFJNUdO;=&(X{neUwx1Pl~;xYC2 zOaH+7C%^k?@W#rgZ|eN;)T$>>UG-hs-Q5cw&Hke7!mUeazrU!z4=2qyeEy>Sw{5uO z<h1ntN3A`l=(%GTT{`=u$#JdDd;O(Thj9Reu`%P$PiI&4zvA7xMVsEZ_@-Ome0bKP zL+@*vuw}s2R}VVq;M+Pd&be0oJup1}hgm~9o-_0ALm%mwam8z&P4BdIZ0&<@cKYe6 zXRgUwGL8c=q#bPB^rd@`$=avs_IKJ$bQT?V`s3a2_|HXsw-<~XS$^apuU_}%D()&& zf44S&X267p|MhNKU{d&_3y;6$srUP?y8Ojc({AW9Vf5B^pHsKDsK2{EcE<J#E?U2L z+WhC8nwL7wT5(9<yVsun;2YQebn*75XDsC0q57LyblS$DbKm^<<D=huf67D8*Ir%l z(|(8C_w1KfoHBXV)5EXmh~9H9E!g;{yhEpadgd8>c70)=FK)W?w%$*U_~@yl-o0z_ z#K*3mRyXncp4=;;{;u3|ZJU#CZuR{6M|b=#oVD(WBiD6l-G1dKA8(v>&mNtcy-%7O z)Zeqc`|bbE?9AVuI(Y4vbtz9Ix6iuy*;5{zaY@bh&tCoIfDTKLb9+fQXXP!;&l}XD zHtxQ}WgCA<-TUPc7w4Tk^2oji-22YjX^&n!f^(<p@5hDb*JLlc{K3`*Pd1%0@9Lv^ zZYyZoY-ZJj=~q0xAb0sW+xQkk{Y?#y`E*8?=kC}t_4ZHNe0<Yc8@41b3xB<Ek0<(n zQ`vjv6ZDrSb&zy_D{J)c^XC>U9l7!Djq~<7rr_tKv-huFv+d-EdzDXJ`$p%*v~%^B zGIHIEUqA56Q8P{`dM^FDE0*_q_m`KRFU)^(L&mo3P21k3PyMg@Tl(s!4;=DJ&6FlB z3*&BC|IEC(pKMsW$DK>Qf8yjDjvg}gl-KxvmLb-W$lK|6%$Tgw;)$#omyO9NDVba} zP8UAP#+0+UH-7pU7R7X7bxZ;4gYqjgW6Da$jp00!{K<L2?&EeLj-sjKCRgN-k3?Ez z*KfxZl;@8hTQQ+~;oph1{D`p?MU(S)DH31tSf(v5-K9wCm5<BJ3yLOCI&&azH%Dq> z-=#=>#VsB?v26F$rdQhH5?MvtrHs`RVL^E@YmU1qGB1Z^<@u9~#(FuNzzS(lPPdi? zQ!3MrI&{pb{1|lc^s?YdoHicQBXtbRnX0)xQoE;i=fdh<J-VlksbH~X3^C=8FW4P1 zjVmtYQ}6Nyq8c-#Xk2M=S#d#m@RXvmioD6e5#<&6Ma5%|NIl|+G5w0COsU|=(~L2v z^c%yk;7u+YGh_s0k6zt-_U_)Z=aD^nk8#C1ZCoiAI&(<pA5En!Z}LAHKh?;0ho$4E zj+^mMCpC><_be#$O7mANrYm#Lg!-)A6g{ipMH|t--B;B`Q~3H!HogAQRHpw<D!bB_ z8g7-lPbyP)XMSyq<-&0}LGzEwx$JlHz5Aq7{y&mR$^S?y<Nrresr(;FrCuU`#SZ!U z`U!H=#V&RB^&)XcYX5}k;%NB9DJ2cGr@w4b+!i`Lro-Pw`9+EEpD20W->T`I_c(bK z<;8_`2cAs-iU4*Vt@{ben6hci3wBTB1?9UMl}|^@#un{bS$%QnH0PgG^Rxe<%4Wzc zV|q91yQiw<l5+;grQN3F$yjvv#9qL5q<q=2OR@Q?O55dbDQ`jfl;ZrnlA>M8(asx6 zLAid><HZ`W9e>%R#SAw7O6~e2md|<f(p~Baey@<)zwBCV{$8|Yx@)~Vgy-uI<T#iY z<zJCvy_}Yp%f)U*ySDI9FE-ySLCmX{#fZx6zVRNtB3F)iN&GD-*txZ2e*$Jg7L9hz zO8B&Nw?v|S!ERZuvPCSZ7|Vj$ZZ(8nrTco+f~n;NQ+BNvtEW^p=h*IUWfdhQe9*c} zmF}w=V?cI~&9!TcyOgDRMa9(avg$PuS=kJ^8Q06&KhX;Hi}YP<EA=w$DN;c>N2nW` zlm6un2kYxMl@SU2<(ORSyVKQ=zZ2uQk{LM>A^weA>M`90DtwnSS2jMcbX=hq<6p6| zz6Q5TowYCg?i&*pus6UGc|_QMr9|~KR!3Y!=*cHib-S;l^VU6ccAqxWc@`Bnkn3I6 z6Pcv$-WWAPE`yR?2rs99tG0ahCEqtV`CD-oluwY4EO$=^3(C>3(tp@uBZYr@Vbvs& z+P!FMWG($~N?A_d?zTo-G$n6BWEbIY=4|q~{DPw0R!)qGe@o_X=8aFn^QMT{c((GF zz+Y2maLY05xvqrn!(Vf`$x*3*-UDlRT{&ecR6y?2;^e*f;|49I0&@3|Q>47-EESMD zy{*3)mI^p>Kc@-1*yH`%<Gt(g8Z~zPHMLa0InU!=;PKw{c=GFn5_7<b=bWZVBf(Mu zr<}8g9A6^Om6i%P-+8=k9&a`R;kXh0=2$A=JPS2Rd8;fHaNdHNsJwNS3OHXtO;+Al zmI^rk=B%KJ?_Em;oYtJrGrV?|3OGM{JUP85t^ubj=jn{UR7+6~_QyGvB;~La<?wjh zJYGHm;CK-J3N00IUiNsedAzO&g=0VXOSM$MDTbP&yfRA#oM~jl_&eKD0jCuiF}${x z3UK+l%bV@-mf?w`JEXDPQUT{{sHw{P)=~kd6i>$AG)o1X8$I4ak2jbz8~h`_EK3EP zM?Bs#kJo|oGyKC}&{6?sv&Y-w@s@Lrg@5>~wN${_234ZGUo91I_TYR<vGVq`RKQsP zWy0QQsetpV$K%5XbqzR~oZ;YwG(wi5nmJ!#c=47ZJ}5lk??y`noY$ewQr_E^3OJ)^ zug0IWT%iKaY>zj`<MrZv1c8Vz%~I$PXMqf_(oz9uFyBNRr2euj6>ye&yjqXfA;<>? z>Mv+1?19Id>+!Zg4Rj>k?<^H?#vJJKaxI1KLWR`dHcJJZg`Hg99hM3>31n`N`fFjS zfHMH9OnE0-3b{a)D{qXY0!|TBsq&^+D&Sm`?8bM!r2@_hkN3RC`_|+A=<%-X?1sJ8 zQURyd<E`{~3sUrcY^h62VVe$hc?p(6E>I_F{&Fo9aBhIAP~I(;3OI|QrYY|MO9h<E z4s*j^X{mtokjGo<@m}_LuX()Bx^O3?#<$T@0Vlt!%PX`Lb^~gN`g_e%0Vl1S%j;_? zY&+CY^|#nk0p~NQ=_U<Jp{Lzle{(DqaFP$_+A;N)VyS?W168TKah3`=B~WK8uiR1r z=OU;X%Dco;0q5dWH@+H61)Oyr?|qL~djua6Y1oyP3OK(&ouj-RmI^p6dh#2y%1g3T z!07}vQ+WqlD&Pcqx$*5~sep5W#~a}Bsy*I3kGIC-z3lP!J<^SDKTBatJYLA-#rM`b z*3q>DO9h<i9`78F_lU<^=J8e@qxZ5Cc8#S7+sEadW2u1ifX92p<IU--cexXGuB8Ib zdXM*+$4fib{EmHdr>~^~P8rmBD!=KL!X9}3wt4<K9Os4&T8jP`YNUo;XQ_abbUb&0 zDzBBL7?(g9f6rM8`|R<YbmJOu-iJCx!>+d!x|ZSc$}L5|0ClSR`_)p|&J$c-mZfN` zP@~k}1C~Ospe|9~4ojgg{kZ5@d3#xk@d4C)<+Za^z&Ql!GUau#RKV#Cb*b`>wN$`4 z32L75hFL1$oB=ggd3lzikB6#JUYVr=&Mc^E<y~m0fO93(9OYeWsep4Q)WyoX$5H|3 zF{q1__oSr)&I?epmG_FJ0?vC-Rm%IwQUT{ns0)<0)lvax2h=R(HO@3tz>(kexLkRy zEyeg0>O$ppwN$`42I>ms9cL-z0(GVGhFJ>x0(F)0##xHKqQ6^jQ!Ev5uJ?F1d%U+j z-a8)e3_3<r=XsV2ICprwMIP^cjQwa$cfF+oPRGG|e?0BzKuZOj?oijLzauP#ErGgL zc>^pJaI%NE@r|-nz`4-lReQWgJl-;o*8$^qn#LEj6n!Yv0_BadRKRI-vg@zCr2@_s z9`72D*J!xwuc@U1&fy-fr^n0nc=;aB$>wfIO*h_B0cQ}@b;=uJsep4D)b+|c(^Bwg z<R<KymSSAu@#cEG1RC!l8n%U{0?rVq8<cmlrLaSuzipns8>w76a_VTIrRd+FZc^Sx zO9h;tp>9;(Z<Y!;8>w&;cC)46A$U4+;@fPgfYbAI{e1v<M_URRK;5kVhFB`#d=F*9 z{$wfog)uHKWGVWsGr7lE!zNiO;0%OXsJxRbg<bRf{p$H!pQFFKL0&$yRKO|Bb$OF5 zMOY{T;qO;VVPo@Lo-@`^*vWBx)2aTlEXABI-{oCkDaH{VZ?VT4RiMB5K^kK$#W;3? z%d4~$cD#`9N;Hl2mI^o>iuAV?2phCi!07>XtNJ_AQUT}miEh{&O9h<gJl<-Lx5eXq z=kXGz=x>pbMhi<(Z&0^u8bd6Fo<iNByfZC@9!zz^Znjjw37y5g+Ujqxr2<Z{)a4~x z3RyulSAUBw6>#<|H^1N3+}Yn!^c7GY)Zej|!u~;ZRNgpC1)Q^?IxFuyOJV<@4pZLE zmI^qhG7#lnane5BQjBf!Q{c32eL>UWeYgL+egCUEY-yK#$?>NN|F0j>mKEMHl}Gg& zqgTs$r>wh|<d1c}*(z;mcRq2HB`qpK7+f0rN6#p{q~j@7y#F71;<>RniHd2#Vo8hm z1pZp^m&9Ky{@OaN;ydscgiZ!i`0EOt3ijeJ%}I#w%U?Qwnf!(L8w@{-zij?S;dczY zT>kQ*X^JsVthiz&-8ja-=+N&y(+jy#)8`=>`j5i+yw@XR^QU_R_>$jWl*=E=Y>07u zHqQqHx?+~(izOf0pMGY{yU*+Y3NlvS<HmA5q3@9wfBAe)e~OHi=Y*279QzX$8eZOI zMOR+*a&}PfdskQNvc2BkT=0&Y^=$9D*0mbzRYBG$6MT$(-lOUx<~=#)JwE3BGve}x zUm5d$Rm?kvGRi-%|NrxUNCJDr<kfBeE;|{*uMaN&&m!s-^|<kuSS|y{DE;ll``<|~ zDzQKD5^IlR^CuSF-@g9W<c~XE<Pm!n6v96LTk^NN^0PDjapTX2_&fUYNAdq%dHzxS z+5gA$pS+v%Z+~yktzI3g`rDu9@F$5_`P*Oc^g^dWwe{ZqIuRSc<h2!laXN}<t(3&S zuTnw&Z==*G{ukNBIbr@kNT~(<zn4-A`9D#qW&Gb#sapQuTd6htzmHO{@qas|w();^ zrHE3~j+5UC(;XA?0u@x(woo!ZigSWc2P%~U)k&!}P_nuZC%=KB>j!c2tM@vikCWf4 z*SUC{{Gx^atW})+Cbe^yhFAdgfKsyexkRaDQ1>e(zo+t`QgS2AQ^pnQX{AzV!k;RY z2K9+jA*hd)8U?jpsY0lal&XaKP^mdkA1Ji|>V2gaLA|F`VN?ChH%c@IYK!vLKy6iO zBh(K{ZG-yWglML};wB-WepTKAs9%&ypn|t6l>#MljdRkV5|vs6)l#W7Q2Q#CKo{Fa zsT8P=N)<xwuhbkU`Tfo~XARUrN^OMVx3u7;1dzQ_At>3ICRb41l#+W=dMLFK>IkJ0 zm?R&gR0yh%QiV|cm0AQfK&k4%$qA>1sy3&G=FLnFK2C0(WiRu5dvDF)<gA*^<gCP} zYO6DolOdC9wuNe54$Tv7mLJMvMRj$kYGr!Pa}vTlnM4@OBtY9xb#`)6Na8=`)X=QW zqL`9K>f=X1*)&2mbCX4Op_<vrqLCp2rb0_us||>gOg2Nj3ofHdozSG(L7|#Gp`5C| zagAoS2+h+M%~a3Y3u`OZg~)JfsL49<U2~O9WsQ0uk<6-@$(c_1iGMb>!Sk9(Vo!|X zKYo(h7QbpuBZ;f-71SasJ(Eu2Qpw3*PD7TA>Zege8iVI$Cg*EHHS;&)%N1WtshZUF z)eIS#Qjhu7302FJgGkRgw@KXrI3iSe?Yv`$iA99pCvIkUzZ~5%PnZ1AEKHSGt!b)d zeg}?brD~Z*Tpn08JNYww#cfKkR7@&^sgGGJGD#_M=~e1=PIhuIRFj>Ynpty+lqa*M z)~&00MJjUB3pJ@EiV(#jSoP!xJ*!0Noz-=dI{9rQTTL1T<)~~(5Y-v+;;phKypT-o zAWw5uJF7F2Tt%%(PpDcG7jZ~fJv%v!XL&Xy5os7=M=d%lgfF(<hEvwb`azS4bZ~NI zsHR%1X4TBN7EXDiO^r4^Q9o2gw(_bfE1hZW{aIQ6n=dPy8mz^;iTrU4ty_zYwHEhj z;^r<rrD}aV>e|j9?-~T*mOa7bNBqTISX&;I{+giA-=^p&C|-0Fn*C@$jq3SXwv4Pg z)1tklM|ra*!w7FsVW>LP*3EmUs<N$9(b{{pesZJySY`=KvTtHrot`4;y04+t>8Vlg z8fISQsL;H#+RF8y&bN1Xe#I^Eu|Y`%)uF;zW-`o)vCIxIC%eqV$I=TY)wa0qaZI@L z<4<l$3#v1wdS0GMhc?1Yd}a{wU8Q=N_{{LhU0&?7;@pFMK5_MYPVTb8eKYZ)+)@jP z7s-`-wq7ey);a#N*Mt|yE9`}W^RRScpHo7sGn0dGXs&ZLME{<(PlzlejfJ4LT{po{ zbw;W&woU5p#B#b>4ArEkO5F1`AQ=kPgu_C^lXPiNvjKTFrBOTbq76z2i9`cd(R#c{ zOu$f8ZHgNS-lRx0Itf*Ft{0A+N+MKOd_gsu?dHQ}??Kg|lqSZS^!OF)n@WKsO|=fz z!HME)JQ8hefEIOqcI?<8(TSb4QmYQ7L|T-zy!~7cY7fX-S29sjcM}mJj75MvCQNuC zBn4mWa**BwLc<f>luTmcxMPjy%eWvO6`A;=QxHGSG;(5G$vMK3w9ehz$0H8mZTgp+ z#l*+vDo1kY^4uCH=TqUAx_r^>AJ;XY*yVm7*FC;JDMTs$G}m29wFcK^V!sM_c}rdp zrM~<dL_n_r^21U6d%iGup7G!F4S#<o22Z6|WsFPt&W#J!KeM61&a9Q&NG0dY$bd%& zI5L1rm8jFDfdoV7dyvzBn~Dt2ZAj8~)YIzpwnU><nU0AGx-UVuZ_5^+W)NYc$Rhs1 z$tfFMuM#d*UUancF2k@?|1iuQj=enC8;^OzF&T|5B&0}Jv_SJrn@)k&Jh|DRETn2g zxmp}Gh*ZSt^muv2Z5g0CCIs)b?z<3@_f*r1qE+IftW`8me3dq-dzWs=M&@>iq^uoc zO?({r5DOrF8+PqWI%zA`CnY{MIJs~075GorWM~u`2u8>&t;vrRI&0IO;teO2K}hN? z<dg@MS(DzjH}RAv*|!ezHoeiNW}9BB>q2%7I}2yV$yzPMm_iIGPQ{_>n7A}OL0m(L zOEOy2yw-rn@+Nib5v1pv7)IITT0oB>@F<O%U&5rh8~c;EbPd9o597`Cc*>;&xrs~g z%}c(#NT@DrYD5f$5?dCgHciS~;wH3*>B42ib`|lM5t~qq%nWOe8f0WcA@JRZ4qtp< z?fDi;eG7r_8I+tK+PUadF>oZTIg;VrV3KXTCRDRR8gW<y5%-0)iL+fpE=;Uayz4<5 zHWiIr<|d0{;?m5xUstSet5OI}dVz7*Rn}o};MWx&CpBN;I$^V;oDw2Vjia2<64N(q zI#D!3k|7U`V)LNmDsfC)8Xt#-x#?ic-E>+6ytpWMI*L9A{}oN@s_5-}oU-F7NAe6L zxo<-$ZraD=GUBwd@>o)P#5D#b%ul?iml1OQ>l<yI=l{Pf=k`V#uH?&FA*g79AiTP# zf0G_q8o~ctdRXadUGE0kmFRSWtJA(_B|5zTIn70rH+5(*pmjAS<(c$AW8+)etn?7o z#O4}Cq@EI*wQ?csdVN%b{U-s^vE5q;U~O}Xq(i^7O<BI~v1e^`*SE9yys)-c-C2LR ztLqo^2xPYBO3|+Mn#tK_&4Cu0D$TepS}I03O<v5J2i*gVkjH4UKmx)V)xfeu+{}G2 zIWpDuk7=~`f8CwjPm`Iac+nnN{hBUKdtD^j7L$a55|`3W?)*NBx7hi8dff$dOvEND zF;(mLV0b#pzIB!Z09dg-?U)M>&Zg$}1=`6>Tsl`rW0^KLGR3FZOxWFiGM#Lti;e6M zNu@K<O1xga#x|I*FBk*5@!Gj_DAahCtVD|F=<JMmSEuL750IiC(jPMIY2=ZpCStD% zODzy2S6*2vGP)(JUV{>3)T9cWSu?0bChmBmClA$JzK{~SV>1Gqk|bU@f^4}-(~;=Z zMyk^aO*`BQ5t$5KJ(0<aJXD~P+R3hiVY+0Yw38KLPGq!?LWQ+<Yi2TFm{-#F@f1AB zR21E*Ne@=ZdH|)a&Y%#MB~y8qWweoT`F>T~+McV*A;A)#*qGq=B>7*Rp2YuJH1jHp z#=IhF<_akLLi<XV<m(tXcSJaI3}+D>1R;R-iF<h`Q4XO{YIXKa9iwAiNE~LoLPqVp z%XqF1b=ah{6v-KOXCY7>O7f}!mbwf|st$R2AqL8DJ5-0V-56J=w<55wm~G`%Mnf_| zlF^D(n)sG>T$A2`JU(Ir7)}t*GUezXPTIB^vQp<V%9clGW%8mESs^6GTEVJXFMw8A z;xp-ukd^p3Hxn7TiHYZ$gpK@9*tr_EIu3V}w27=H6d&y&BYx9GzBsh_p(M|bytB6D zi^cfp5aXjmXkNC=(@`UJK?y3!Lzv()-gG5PelnA1;xIebLDto54YF2J9YWjeYkGWx z{#y`JdP5U2e6J_=P|uf59_vrc><lQf3T;-oMRCPW1pN~pltYaN?Mf;SXB~zIrKqVj z)nYYuaY?!$VKFr^_9i6Jq@fYcrT{_Hs8_Y{cr^2ev@%&kPusDEp|G`9L@_9+7ID%W zNrQ0>4x#O3)U-<K-72p10M{zZD!DGlYXPg)BoK27%Yq9CkrKP=?oIbz_WHjhDN8U^ z9gn5s&zoh&C%d!Hs+CFgy5pC9v&5>+WK}F9aZt<zGUP~Hl#IMc)g&N{7E<*+-_Ql? zAGg9tXl&*lNqA_%cr_uhY9S$cOEMy8ksNBALC!MSBY@kMFloILDiXxUj@nHqn8z%W zRAAyaVUv20l#K^R!b##_QcRjjWl|jpq@GlEpiubPc}DAovpS;#iC{f}MC*?#NP4K+ zFA(WUq(PH0q?8mbB^iq*k$9_EDY-dri-%T{&%~<djg;EPN=a)WC?!Bj-S98sPoM`) zaLN;TO)&DQd((t(Ve(Q}tV>R!i5gNx*;d_>RFo2nn*Lyoh*HG^wzZ;kGuBo`nM4-b zswjWIG<Drb6*08%i9u_jw+NzM$%GjxOzTKtq>9Ox2vtaFbuFqB#65br*YNsA^lFSm zWfxY6FJ&-sjgl@si$+L~J~%nu*brDL@|sdJs8#P!QhAP~JgO?qDJOm0GHcRRUMV#) z>&MBn!_u$npkh>2WxP|)GHiq1J+rL+aD430RU7eOve@=_8X;R4G(xPRS&%^s(qyG+ z6fCR^fzv`&eUqK?f!gZLRta3qaFSh$!Bg2G62LV{xawMq4AjzVGUMW_8@UZ0Zz6K9 zVd#32W-_{Eq)VoZWfjUVaP#i2?rIJhwxGM>fT2~1C$S1kVR9`y*R6=^1agupLng47 zpm?KBj+4-7jA7d98mvTeax1%LMuD}Zit~OAI`@)T3Z3%i5=$XjNHyt~SXK$FUeyU& zMN#{k(WTa=iGkGgWRUCIhV)C#Z=c;=QR$C@8OzeBP}V6W3!WO1d2Ac|5~`1BhVQF{ zNOTc<uLY(S(g~xTndS{fR)WM9^dgs)!vtxbcI6NO2+JBS(JZsLCz6ri#1k7l7!!PT zx;H8$bX##Xp;xD;crUA1uZ(HDl%t{fmTx(=CgfZ4v{93<TqGXMBwwZ>i{6GLo3<ra zMHWLd=aBiB{b*SLeL#kDY)5B3K8hUrwxessK}KbYW{Rex0sadwl#-Elt`u)n#HbV! z;57+g`}jg;Br<f9G2kLWycZHaY<c3wxNsRDkM0=C3+6d8iY%;2uVe@){IWrkr8T4= z3NHgKiJ^B~h3>*xKKlojpAnBq=p{ik6IEtIMCeV|xZ{h73~HigeRXloG*ip*7SEp> zT(&xO$4@4g;;5MvBFcv>5&pgp_Ba~yA?+{xnnq``-#DYKSuM>~okiSPG}bJqqN|tS zT+K-0l28Y_|JS7EWBjtR+8tBr2GHU4yt%sCDI=uR(7eIP<wDU~%uYtl9x~?}T(iav zgSqb@^_EK;NVi1DwnZ;NCT>@eb*I9cwO$%4SIK|ft*j4F;VZ>259DWt5>n3I$^$9K zaxEzv<(AC1q-0Ih$;`YYm{qL7$Z$|n?@%k#RTa8jRUus!<rAMqmL@TYNA%k|+1Zh+ zUMvZTM2RGW{?1D0<apP%x=~06s8i_1naSl1RzgJwrW7KchAU_uT4v=c>(i{8N`dCh zPL|?ID@&IbEhR75*4fFK)`j{rvJ!78@*?7tm*8NkS;Q>!OATA&Rv`|OLbOt$D8HB$ z1xb}mEC8rg0jIp9rQ*s*TdGmw>^Zp9$w?zpNXA>@5|gp2+GdP{6L9!(Yag?WKCPqM z++G#65I0TU4Ck}zYU{@`$!KX}pB0h7Z#EdXs(xVde<L}f(nRb#7?;<qup{%LT8?^% zi+Jd>CKCC78j5_=q5iJSEyQ~bdDXUAegI<5>MTiAZA++#I*(I#J;7!z*IHq8c>ehz z`-122%s#wGwTjF1?#l$a7<pp*q*l*whn&R+d6#z?pB^hg&&_UdnXJ9kym&<UL=pT2 z(JqheL0Th+dA^n6$T2)yCvDIlV`>sF+(3eEGhr#Ith{Kf`$|5f+U?%GZAX$p_Wi9& zpb9ItvEjf3UHBO#ZrD}f3rH`{db7L7#!sp(W)!p6Bx5wvBXOm{lH&PTeF+**LMyg4 zs;Xu6r#9jnU$(8Mr~bI^^=%QCOxI;~dWh&8_f>p|DX1CLwK_D|<-!zUR?nHw|3n#6 zAzrkzMDb+ZWF1jp@SD`#=!?51y~J%TsOnXC@#4o)=&M<u^=hIbH-u(kX+-3aji`mZ znKd$@yjZaFg=z(K4N{y$8S+7ig{Z`m$C!bLaS{~{)mv={)vRXmTE+|YCWnk)V#b4P zK64r(X2H`x65QGNIg8<Kkdn9=RbxiyB<79%pg#1H)0))D7ig-(8`LFnsmzdc<fp!P zNzsLfRGkXQxr<cx<m6i~6O-(4*{GzcYE+;5qDu1;l&E|T3?^(&!~q(g(s?$fyIkQ$ zDNAJ<<wr8QW+=@O0NrrWfuu`q+Do|UR8^8O^5(6Q+3X4GLd3n8>Gq6CMV3k`L#CtA ztflYBN+35u(hACvsgA6U+z}H<Qb?)$!tVX#noR3NGPtRW-!iy1VJT&ZwbQ{(&r*e1 z4OM?k{im9dd`Jz7m$!<(l6QKu)<jNCu#g<%fngjTYSKe&F^YS7;|!hirdMYq;}Wbt zZg!^tk@cQc@yR*|4bDnS9X=qdLMN?3CZzGxIp`pAs%&vgsR}<ht1=<LfywfC0?F29 zG6^)W7(^oV=cAM(=A@|PSoAkdipNlVlrr2RCR0DjPDMvqJk&y&-SWi8WXYtLI#PK> zvt}muI-)0+XLOweyNPJ3L@Uv;9xun6%JvqQHdVDu%yH?Hkx<%T70P;CY!xQ!l1DF6 zR29!9f;3fwKRVOe@cd-f=CIVH3ZgBPZ~mb6(X45Usab%lD+wuVFQ+0XlAuBP9E~tU zlY2Rs%ru6sQe*Uh3khGkzpI_HyB<AgKMt>xjJGDzHhhs<@si@PJ4>;v$&uDgbdCs| z;%4U_x=XRsTC~B*U70FJ-cqVV@l+BmvcaS~;KsPUAvX#-%*HHIa!)D9QU)QI+qvfk zbnYbct*Y8RU0c(hkP-7GPK~9lk6MO=WE!T;Y?PcF*dBdy0DVeaIykUB_Sis#&zXT0 z+Y%m+*N9#qqN}vz)tLdxZL;wXrA7PwA4^M5N=S|V50p!fUPPs3dM-6lqojY6s>6bm zkRQ?fWIc;oek5dxE?LUq2bc+rC}d?firJXW$>zdD2Z+adO~R`TN~636>xD1zYntsE zpJ7~R`Z1F#6W7Gq>%E*wCemF^;KWFSTK8M@#=6z6-<q?n&U8tR$P&y*q1?n}rQmB? z<!o@797quvfBqxNCyi6<M!On>ERriT>59DmUQsKfic0@2WvE|NHiLpD$#jxDKn75S zp?TPVXxoX&kPj?eNi=b-!JaUqt-)We7ff(O5<0&41Eb=d1)|kP84ve71ue|wH(wEn zyQ_?jA3&QZXn#*0s(Ot!4b)Q9DI4w3;ee^0#u;j2O-<SSd2;lbSESgh;i1hV(s?A1 zu*%d-L3=T@*~y4EjL-T*o}KlFui@K#-jM?3>krq91Kouriiy|7(vUEWgKVms{zTqU z#Vvr{8B`yu!?kea@d7oe)i=8ZSUqbEuNY1VDPoqC<WI)Nw#z*L=WRQ6Myoz$G~~r^ z<6xhTWr;cKG@MreSh8X@+s4N_Nu--n^)93@N)*McWWato@kSI=oK!Ijqq?a=>89!# z47h^>7!0eJ>!m;$EkrZ^el!d+cSkg>b~%~_Qc<QzZFff`x>C1Ga`ELPxI1#9eHwKq z+Lz_3l#EyHdGA7N{R&;Ts>&p%oME|X5ml9~oQm%5c<;={4K!K*w59HAJ{O=av&_dE zxseiB1x(^gufM5)J_&V|q&kODMT}SX!L|-<ZpGYHhUU>CqFW!$YY@3~v)0&c8x=64 zv!=tU2HFNgxM*vuZG$14?|7$LTf^5Az}bvmvzh$%L4+o0RvaYf6d_wWeYf3OLH(DH z?KC$Z#d?tTZX^4Ok%82d#6w$-cl#f?(bdPVcZ?Lrxf-Z}mhPS-bsIa`6eG`iqd<J= zo{}GC0`i7MnM6|LK;GO)L-Q~nx`3)oFMEGC8?ux`QUYXZ89=54;&fqDs7B=@Ew6Fn z>`8Pmb+_}MtIUX~kb-M*>f%{jmw9lg=5;sY_4H&+0x{&-7{bI)48ahKsdJzyynM6h zlXE}{t==Mavg?KR>3OOzk=+s@ldIiOExsJ4Z93K`<&wW7<sa<MhzQk{pj9c_MYbGO zK<BgTnr$~nX4PcbW>QO7Z6>+`rFM=rXNiay)`R3kUaRM5?9{hs@bDlmudnAUO#SvZ z!HsxbXdeBx^s>=k8cA6B(n#lJgg0v_qDt#=302QhHM2A5bxm|TWdSbo=mwj-=-!nO zHZ!y<c`F;~S|@6oEdPb>ne-(FnYpc3yh8G^pgR7NO*L+$39iYzfNc3p9=(K{|LR#L z7N5K{bd(n(=U6X)dr(0)C2{`Uu}S*hiH3%Jhl<bBB6+QzvylI(t1aqg#&$X`(+NTs zEXj+Z#yYrOFFvYgEmDuRFI~2fH(z)9E`3405pYy@x)2|1!$~ZnXUK(~)!o_@t}2ia z#!2=xTarKFAU{eGag%wX?1(lHOr}^nagr%leJ3LwSv%MG8)`rYlXcZCK6+}f0f|5( zpXxQxfF6)S*ambh-3)?Q2umJqKno$X{6bJLiO?=lB~}%feo36nF1T%%k&SSPJ|a+^ z`s}LGA?M}9w#f|pWUyrzMgz^XNC#M&rr9ml<vue`D(|<;sw$`AYb9wtc)A{{CcUfW zi3zj`iWgZJQ~eP|&@YW5rcn8!1%FozD@iCy48qu%7{raamC2PT+G(yFcHhX0V+xX` zU6-(|g_=lw@{~BMLoMp2X_w@i<B9#;h@<@ZjOlCoX3Rinb$Fe)@=$Un$L{Dl82<<6 zVAEAQn;c90^(V*m_JbHl=-x+GuJm|rk0q?t>A8|2ZLsgUzEIg%UxoF3mDKlDQs398 z`o2cR_*$KwEgX}&w+l$_R;Oo19BSr=)l*E)!ornDi}034vO2v|IF_F2(V?38(k|-d zNIzK>U;a443x&gD^A%oXUhR9${Q2q@n;qfG6BX4Q!*he`Qi62wY^dm_(b1AdF!GIw z-bdiY%z|Xli}DlknxcU>(cx$vYJB3ueP1IlJo>&myv)2Yij5pdayM=)diyu7s&Ia* zn*Ep>*^{ZwmGlxcHa^5lWfibV-Oo1u1UVwE`+P}cw3VAIY$j*tb(BCt?^qLJ*vPS5 zy3MwU&%|dCqnt|BL#O8zhsNnCP~)BunitP^dYnKMc9I*+V<RbXBer189&FL|@VyU; z?;VP-VC7DdeJs6E0SQa8^5q4*B$HD&VQ!ibk0CPXrqVX?F^<L+RJY2oaX1ASauY?I zu+kekL1yJADTs5uHW|G?n=bKW=^;5vsl`DRjF?l@&5GHZfmb8f*dYU_PgvHmHmB}i zP^xq$I%<W3SV)L3^vBN2Od#vLuvs;|WzX8GZE@uRYAa2GZ`xOSV`emtdf6yEa+O9F z(?GL(TQO9!l_GTwk7<OgpK`!&9Gj#v;U?F^6GGMTFG`KU(GyLBl2*mXsmxMLRn)43 zt%_9CG2Io^PWPiFrQF|<RBo)K?j!rZFR5;n^>-x2E<t@sg+wYwQjBk+B_&xDZMFN{ z7rvq%q?L-eTv>S9n<oDKZjHImgW&1HFGQ%Cd%iCv6*<dU9Ul-E%&q5wOnokuJ{Mhn z&@fSRhjc2Uk;_q4h~j7_g<~s=Y|BQL)S|Dl{5#Ll`s_Cvs?XjLNHQ+%CGL0Rt=Un{ zOpW$sS~&Wf>(k#B(?xN+YIU^B&?42>U0EOMib!Saknf=Rq&4bbrnulE<<Ho|phzL= zNUVDlv?_8M+3rvKg)(dN7EuGeX($!Sw-oK@>H$+Q+<WSmdeY`7RWD^RdNV$}BeWqI zfh0&MED@^^^1&FZ5OG}2r4n23y8D*<T<?rwgrvCMf?1Qg)z}Tv({2~k4q1Gd?XEN2 z=%SOmf<O%=m+SW)NiMf)eIkO+Cf?i?8{;8I)yeJQCLNi}oZt@_Db`^-NhjOyJ(3QY zj@x-;AMgc0Lz%{SMMN5jY!sE9EhoFku9iz`LN24=b(-wx<#ME|YW+5xCx_;VrGvuu zc~yoDqyfm0;K?qRLy++etQKe;S7#)+Go5ba)D0rR&9I$9&$a3>NG!-K@0~BDsJeVn z8L-ge7(qRIGe$Qo$4H*Z{g}k6BaIr2saoHR4tyuVzt3H#jnS!m$y$A#$~VHF;<?J? zJyMl9ZfqY#d9d<!?GeSEt8q8DDk+KDEeP4OEHod=yIF~(^{u;%>(4oYEVR{$Wo@Vg zV?2R!yaO{)SlwzCGPB>b*FDUU9iy=_d+IF9E7JNx^GuH2&eH7fu);h+SC~zespGN) zDnt$ftj>(rk*J@c!&Hxfm5;A<jlax<T2wOi^#*Ug>_<wy-CZvBmm2v#AgTI7xGHX3 zq-mND2k|0arGau*4vJ+|fo6#pKWApr@@5AbHM3{&;;_=OV|@c>9-B6F{~0BaDY86u z4-w;^4Yz6dpZ1yZXMIxGN5}^y6`|UkQJYSkd|KCFEb_6lgz*ox)SkSKR>*R=IC67H z1=Vb$_bb#BruN@(YT{>AXSS+z>$<U9&6vaZnbh=5*M(YZNDDj}P9?v8J*T50Iem%a z^=@KO*{BqSt6zqsm@@q7oUTMN4dyiJRIUnhoz?S8u@|;lWRz7W>h>3-=t8IHi(*s8 zUkEQkj^{60PeSwLz#mGp2q&Vh1?17Ss9FeJixPrx5(ToBx5TR1^zr{6d1nG1Re8nz z8xkcdN`fFLh$9A#vY3sKxYUF-Xdn?Hf})d<3?vYen3+JRR7XJtaY2iU)mpS#v06oI z6)W1f<Gxp{T5+uy7u;IwQor9h?_FmGw5|P~?|HuaWb!}vyyxA|yDt}>DBIF4>A3K! zP#YDj*#0(^)_a-UI%&VLv3mwty!CJV^A}*R$nWaRP$v|5NpHUm{Igqr(Ni%+PoFeF zGP1sw1vQuGiJJCEkzzgd)W6#DjX6v~*m|lzsKEx{WV}<UAE^P5vL)eMk(M%$dZUTP zBP*%EKBWf}{R!kH>75x#y@Y$En%I;&N!{WjMU@LDjMxrCCiRGlB_&_?Q7NO6qL8@W zI;kMubIRFh*nRKyFiN(CK%-0oM#+Ri$^Hb`e3a}&QL=7-&IS6G*HQj7<9@J`Nfl!& zStFJSRf3W+j`x&oOh(FBOEPUo%TD))HK=7@QhWbTw5&XJDEo^RshU-1B<b0cTVEuh zQ|nok6HqTzf2f`<Nz}9Lglz|kR+ci!f1si*;l4Svr;E5*9d%GzS#}(sI-+yPtW@eF zRiWR8Q%9MKlerl~bjw<X$eMnMP>%9r-4wJ6Zsc-WQPWv+a)p@`y5S~=w$AwKyYGHz zyz$iQ484t~L{ng=MKduHDn&=gY3|>{*y^5FalYP7;Oha>X)Wp=w;lfQiu28?vh*n9 zxS*@k_obFLLxmpQJ8gaY3+<NrCXo+BwKO?29QLj%zjAgzoq7_P<P<BuD-5>r8h&8T zD&RkQ5~ddQHR-6Xw{<!1uD*EV8y}0u3~7qQbIDVA*BKz^el&P%glB53wUCU4ZwfSv zVs1vmI?{8*(F!5yyUiFHhtQeKc5Dh~>6W9&t6D>rIo<uWh)L#%JxyE5PiN4Uk5wm# z=01W3tjo6U1{rpUZb;}4FCWzVY?+|LumQtbCN$EQZuthM+Hk6^Y@s{Rck=h;<JNm< zQ!CE*k3H=K3b|uX=88<R$>G624v-k&t26I!!o-D`?ndu<;-qZ_!8Wtuvw>j?b1=4e zdbzqU8|-J{pw&Hq$k>BS`m9W6E=8IcRZ9w(A!i@l^$kv&#h&=%WCtzqT3F=XM;ZPK zL(EO?#r)!S?x}Bb?mSJ>GiG**p5hAHZG-LbC62?|15uAfz;-Gy1U0@UZGl^@!F7h9 z^Eoa;5>=an_SJew*$Ia%WpUQTj$bewyZ^7kQ7)@{B!cWY?nIe7(_*~@dc@kd-bo^D zCp<rM8u%Y6UGUu=nkQ#&w&T|pCosM5mAf7SLvzQPS43lWmxfzhh|m%fuO;6Tuj`y9 z_Q#7?vzc;m0_Z7ispD5dyqfJP2b}_PtofB!;;x%ZrL^c=PcM^+QtL#WM4~|HWQwiH zk2`JZj}tT9&nb#r-nV;#>t&!yo$2`K#ZPvM7)yRDzC0TmN9Sat`pTg0vE9xs>~avy z>#u17$#nCM%4EXUJFiS8?Y{FF?M4Nxfz9e}af9nm)E?c7H5_jSOm`HHgzd4OXU+~; z<Da-EwK8o2DQZ`tE6N9K-9&eUtoAkBkA7c;zrBY0j0fZR;4GjdG`ic{AH5bUgl&_6 zxwc7k)tuPb0MlvV>{TDxu>1^ci9)h5^IapT)+DlGNE^+{gRC5xTW}@uOT1mlW%Q=R zEjB~S_7<tdOQ_^Mg;Az6btUVMw8<hR8{oBNsTH5r<AP~wD`gvBnOO=Ud}81RKM-JQ zk32cg6!-Z+*eY>mn9TH6r|2MNESZS4>a>pRit}m32rp`}3heHkz>w>wB|R$%oCq+9 zSncn4sfPWMX0QT7GdD}m1#h(-qoJ(my|e%&NEwJMUAagcG`>K@E1lL^;?1IJ$fPv! zs$lJCfNV#?k52KV)?T)wK7zybF&KoD9=Eb0OOB>?sT<DqT?uLFB;WZI+yB7hVa%1| zA$<}&KchsN?GARW$V(^MlV<f^_8ak@g+l^J=ZMJIi)G7l;+Qx+i0;8yYSg6D$y_mW z`uaj++D39V{!Dk#b*`kLHV*hM$mvWk&lKGddDDb<u4EAB2>PzZL9&-C$<1X;w=Tzy z8%i{jB-eFn(}CY!DAkrdA`#jR<q_hma>zdJA+tj!90{3iRz~2|Py?fe1m?=Ecd!E` zrN$hUthQ@#GN87?5Oozysjk;`AD`0k?T;>hXjvrse174<wfO9>x>Ae}q%4{BvjI@P z@qyTt^ijn}v+_il_(u_?N+BN_5Ksw~T-wF?95WiEqdAkp?6p0%fVMqK<E)_Rd{&4r z%BB*h_$NzLr<5Qx+?kRtePZ%1@9^>^3u)917e=+$`;S$ePjDsNxppMtal99XE+WzW z#Tvc%&Ohb~AKTv5ADm%1L!`;@2C3epG#PKWRAfcP5>lcj6LXxXFzYmOX01jGkSxo= zlx4UirfeomV#@MI5>s}L`It@|shNn5TyK)D0hH*J;bFDh##|%YZqGAmnZBulL6Vm_ z8=a2gbA-K;pqo)fr3SfDoG+umYs;YSQQ9keFKxz_iH<A;vQfd#DZ8J)7H0zed|{+q zYBC1y26$?y?jeqAMkA<BQ)q<5PA(G6^b+;Q48@YfP%PO&D3-8p=ok}b$p%huXF4ny zGuxVM0xOx_<eJ*uFiD7%NtV<NbCN7YH_SES9E7QdyQ_R2=@@Lg9wqg&9M?=g%XUyT z!l}(GWIGW$Et>j&BSy<C)bq!TkvQnYNNDbQG%=E5cI=Osbkd4+vzBR8Sv1=;HV((9 zBu;p=;i(w3wdEVL7e7$Jttjs#pbg%R#{Mb#v<?0~(f0eaQtSI02D@LI)IKczpw^sw z&%%P+ILIyUL@N$Y>rko@dm2f5Jj$$)I3Y%ftr#X15VaE(wFoTjtd$!aq;jnOu1h|1 zRAerCaHdY!7{t6uEj2C&<a=}v6G8o2P>t!|geq26)V_!BQXy&W4`)&>J8Ohdlyt<A zJ3W>@So_1`+h!WWKzvO{Mxrd~CQ;6l&!SXF2&DQKl&Iy|tz)BkS=!0HcROvBn~mM% zG9y39XIjZAm}o1x#W6SaUy1W-t4JJioG&qZJ<RtHbgxGlT&Wa~u!q9Bo6H=!u*2-u z{kE6#eKhs*#R}5BM&jZ>ctOMGKXuWli7Z00g|bFsvl<8NxJn;*Ma2xlKqpIHbmN3H zNGr-KbmGdnq!5t`nv@L3r4nnQ7HNqX{Qv6E4IZyZ>%JH-YP_N$AE-;5r>*%RMPuoM zZ9YBu56gonM=nwG&9C|jhAR9YLlSjKH8+W68<k!N(ZlXxv}uyrM{z!L8tr!^^>f8) zTkkt|SuWS=N<otrM+=<%(<FuPwJs{2H0wrzvZvg{LD`0;yWo7z?~>$vh&$p$I>bGa zn>7|vEWOhivMEtNo<%SpDeFbJRbg_?$0elmz)msDR+jaWaEib7QCC|;x=T8A5fS2* zAfcY;>Ss38%=zMkoluXF^{U~_#N!LT(p2@n;6m6AV;AkG^<Eayk|_yB(lOL9gJ3-r zl;UcMgvQc4<S%>J?aECC(f^@+tqwW*D4#W{F>@-U%K#_LnP!J=E;p3-zC|Vz0&)L; zHvEIOK4|B^FOf|xr>%kSdH_=27_b{la>8h|R4>*4b+Y{TJ`U21sE`S9qevlcc-*A4 zD!dj$EjP4XXBY!p{j{*8pRvIf4y{nKd$7!@s13UgaB2<J-ZzPNQTL=B%Q$BnzJGS> z*3`>V3C*InKR9qHEfXzr2@qT7{C$90!kYujlIpHR3Buf2;ohN3H$F?^-e#&eH8km` zF?^N!uF+a3*LF1OmDz~a%9mGIE|TF6Ow_v3NXd583W}@MEmy==h;N8UxgE!QnY`<M zyfPicNW0j`u%#@T2URA4P?wi}8CudOfphw4;`TUop-1;dyyH`mlG%->Z<1sBCUzw7 zumlnA-0jhQfC$<Bl3MY@3>t;2Z_*zThe!vRqSJxPc5Wc@Z~FDkF^=O~JIu*>m&oFp zCMngzq%6Hk!C^3)W6yOPft8aoI6@=d+wZ&RW%>4N7Bwq1s2XK4H_bpThjo>X!^FY> zZn)kgVa~!)t!&Jpf~<;kW=vqy;Htwk1pnBq9L7GrX48#9iuN;4Y?k3YDVeFX-D#42 zmILBs12{->0}Kg@P=)wXZ90<ou?Ul)(|S15w=^SX;cm8@ec`Xn$YJXxj%RddLZd@4 zxFfmu+022l^F~Z*DKg~Khq!Ah1})qbc8w$aK||yCOgogti`-cr+KoCFS3_d>>=r1w ztYyHn??DZKqI!msZKj#lq7wq`ZdUI*IBBxHucnz3b0@MI@``%XqL$eSTxKUQimSa% zNtzJhvAPe#1HN@wnA!u!QAb=H&$45cwe=%5S#s}|rg3bq)Gj3K)lQLr+CL5@E+)qb zoYQGFdCNS4Jwh;XkQL1tA_mR^eBv@uDy29i<=dGMLoP!r6^D`LFp$)02Q)Q;R2Jhj z{mqA7d!KzLE|F3dOnP3An~>ZYr{j6;z_W*DIczp+$$<|EsJt3gsC8a7-R$W>CU@`q zGQ+(jiY<K7)0Vy04lhl35(gae;=tA+Ioy%cy|)<oqsLbhj1gf&IhW1kDohhh(Ky*4 zJ<HZO*;_nA^-P+=N{weFqLtR7ra&fEi=NF=Ju@k9X9Qkr!n+xw+UAT8&`O&$)1h&~ zZ>ycR2rX(iBT?;K{~QlMJ7=XgWSVbTrj|m;e~szsQrXHCjiw@RfRKv30fCCGMMgt4 zv<VvOdY14_VieZbVNap2{`!XMPFn*lR09Y|D314_>XRCpY5UAaxL(f~WdI`5OT#Rx z<}d2K&n|>d%=nC}9xtn|kfnz99$cx4s9n7<RRrx;FVsQX(pK<)Nlu0pdsJ_5ms}5# z>p6C=>qUT?>r&&`=c%xel~}tBkX+9p*PUp98ZA3IQqS7){+?Q9fYvUd#BAQ72LtR# zNfnr(*_@%V(rnIkvpH815s_R1(`)Mnlg%2+glu*_OQ?w4`3Y*`aX1oa6lIdaF2gI? z0xBbno)4poY27;s$Sfq~g5fzyGhFgh7#y$DN!8)nVHoarz?rU1VdPBOrZ8erx%XKQ z6J^gSKC#nNikH+bD<p$zDCOVT^`gwu4o~XE)6hwWL6m6W0;lSu7r48mAYZ?>Qtkf! zp>qC^ZS#d}>z6n#9%~=HtXrn|ND<~Ved~%whow{1d+8?RokT1MR6=Fu(|P{SjPaF$ z-gn41#_VxYxAsclS!ATt4>dSiefqo~8jBw)x4qbQ%N;A#_+7KLFWKRVE!|Y+<(9`D z8Yi~8g-MzlDPFwG@@^c!87-<(bcfMJ@P8X6WY5av;$IGN4E0{RGcNGP=rvX5mpEz4 zu@U;2&RDV}kisIAe18;N-;DYUa}OI#3E&LlnyHYb;gU_H(h%y$KBP?MbPx2g7s@t? zTrC$NZdqL@Mrg6vkSG$>+=Q6rs!Ji_n5&-+(VA?#$+7hVDga5}wYcaEsLV2%dD|-A zy!SG|ETCw~_)pWsSqovNXg^I2QpV#2(#P+w6nD;PnY@tgk2xvwB4M_kBZHC`NmKO> zUxxN(pBsT;OUQqo(VjchmZ_#Uecwy*4<eR+AT4`{#MeS!Yd80~5|&)4(CHt`{ljnX zWY46y_YYHvYR6lpNR3?F$rE=#odE`qu;0sU)J~izHa&0s3^@%1Bdj3;X|YoT*eJaL zX(72-XcC#fwVyLx;|otss_-zuZiiaJ)BE0WIYa5HLFb8|L+{&?(fi&m!ztSOC)F#F zmuVV1n%~kS=z!GBtg&fIYzLgx7h_NqFxa}l=c0Q-)Qv$GopPKTD96l9r6|X6wH(VK zEISPLjMBeryJ+jPq^Sw*(ypDI*!E5eo9cB6*U@YLM_8Gwu=P6l1y+x5u2S^}{Kt2? zNHwYJy&j^9KCP1ZX};z=SRgGXH{DkBh{;C13N%Xg<ZnHWoJv&Btz~ZZd20WmGlA$= z`vf&p)%r5So{(2fGj!S34}Gcb>e%Iuo3@T=z09n+Pj!ussX<x5VCxk=7hN5j7<BPJ z(J|8=+oAXmw9MG2Atx)6bHt2MG)F4aV$#{I>=8RrfE>9|a%2#RPYSf5F(vLzpZ*G{ z9sw<xc23-DHFe1-UMvKY$gk>dqDvRvSFrz+B$8rS(#@yIO`V~)*-6#-DB%w}{o|{; zMzNFDR=!qbcQ<(BLq%>A#mbL)leQVNGV`{^ym9BX<_#YT2)1?9_-4+MXmK;TGmE$< zDwVis!sZ+8dcKE~7VC*i12?0m{@%`Z7Y!+XA#q2-FCk{8u=m-{4n}2kW>^b<#&!N? z+$~30gk5pIJGZthCk}&LF*p9jvQVg+wAg+EJz^uf%VdX4r_7o%QQ_F?J|rc#Zz`@N z$#xeIN8z_jC}dcN@xMW-d-yLm^=DX*L7k=4(@=S8x{d#`#UjJn4HF|b0P1X&+n4`F z?hvSRlvm3Ce6=wHYO+$TP{!^OsO9`JtTXs;>|Ox1LV3UBzp*O=ktu4o54n1-n#y{y zu`w8GrSe8V85>eXRjG|vp{kYI%;JrF=QG244a(Sk8%p-5WmvK#W$Yfu27O7J4C~EI z%i2w;zd=b~Aj2BM>Dk+qIta?7+ApDwRo;52Vx=Zx@h3{PL6s|Y4b<UE)n-}N7^OBs zO;GAHsEJBV%C@X^8meocOj_LmC25mk-3?_z|1YQumA88zC-kjQlhl<<p;oEsb*^dY zo+zN2uIg)9Bb2(cpJk0yYO_my<5Gk7a!gC0WJ)B%x)Dm6p$uz1lu3j8p&FI9n(vYv zqyGLHDqnd!540?zhmE74jK8fe_3R+aI#f-!xzw@yS{8rUm=1`BW?1J#4Oi+qsL@Kj z4^^zx!Gj&@*HFgv8K@J~^z;2J>oN^hddLaYRZu369)l`Zx%~Ytt4^uIp-diCLaj-Y z5S$2QV)Q<giN}Z`4pjwZ+?x+ouC9CrHCw6r11#%ub)_B3xUv@N7s|WE<$Vivh4Omk zIC6ua<m)#X*8Wf?_j947jAU4&UAYsWu2Npum3tJ*=+HY*zf#lpUDJO+tySL6Lml6K zexPL?sbT&Ks$QwggPhdZ8|oe94Tfq^sut=PrM}B$E>hjgIM@m4ZctI>?E__Eems;( zs}?A{CLWzo<CQw`5XZCwYOM0^hl;5yk3g9;cnYdRd9Ohkmv<RvS)ZznJ)lhZB2dP+ zGog%oH$W{^yBna4-It(_QoEnKa(z*`amt$tWrrE6TzOX$kfW7)5+}we^%tl`>hkMQ zCZz8|bt>-*DE^4=ZUvSlvlSUu7L*C;W+>ywKcI{sms1_dS;h=&9h9+q2UJ{ncS9LJ zCQ=Yc2IQtg9i!A~3|UT8>g`g8+DLK25_0cRsY%_NVf_QjxV#ftf2Q(wg)%OG3uSC< zEOTP{C=`EU7g(w`b}n~Z=?k??d3!?{S8}2Lr8Y)DnfSIqnew~ZrT*wrTU=@+No(ZV zUFsf}>Q9y$(}5^ZWtxQQ5GWI)5~#__I}*x-WhE3zgWPzkU)j8pVbwqx8?&LRls6a3 z*!TmKvGM#w%bKcoCsLUjUK5n;oyoA)LK)MWp-6OipFx=#{e6^0Mwc1ZhDt|sUWA&a zysK#<uUCK9LB-*vTlYYj^7|N6wVFN+WkU6ZYubY*@>n(P31v+8gEDr9LrqoFeAjf6 zYdRfjnwp;InqKId{u-)AP1m`mr8KX`<;hSo9?7t#LK%PGa!t2EO;^(|T+;)q9lM24 z@@0?=s|3o}o#UEDp`_nH&ET4@Io7dz6O<e`$*^vPGIoz7;Z3M&piWTJnNY^`CD*hY zN{%yUSle9FOtQe(?FThWP4|H^cK_v?_92^3Qq%rW#`Ib!V|OFe$!dC^Yg%@kV_E|h zR@0eK#_lPu>1j~4YP!@lZJO@bT?kdDrl&#~yT64p`f@AOxvDP@Kpn5z^b!<-AeJ9P z@dvdpMmP?21k`MG?-(ef_cNhnpps#o3}yUS0M$o%?NFxFo(0vYuB?VS11jBG19hfS zS3;ew)LN)>l)4sbsZ#5pmML`;)N-ZPL#<HicBqv~ZGbvYsf|$QE7b*cfl?1bU8vM1 zs8vc`KZCS_%CItK5>gHGo=_%k`$NelnGEYdC=<6iP(^Cvi<2#Dj+$nK9UFb1<|?m0 zl(BIj)BxoTgEFbH0?O3c>!8Zjy^312Q>mFyR8;tTE|k%dtDxqoE4M(+SL!*aW~E+& zGQRb$b8Lj5WPT>Y8VY4hS3{ZJP3>%_mv*j8mDf9VkArGayK|tV|4ok@s!gf0p^ST1 zL7DK~26c*>-szgY07U|0_Z=t`qu~)J{T^+yti@_$Gn7g3ccFf&ylyDt$5&AMDepTd zlYUpvV*siyKM6HVsgIy?RPHk<BUjMuv_fw~ooY;>jBjZREK5cd8P?8F#<zY@2P<zM zDC5c{PzCD8<)=8U#yu|eJk-zB#+y+2Dz^>lH06B(Wn9i^C&iVw3zTuW6RKEk92s?D zR0m~Zv{HC#V-=LK@n|RG3gtZoWq5a=>g2*EsEgF}Nhss*TdwIgsEgI~3)l39C63)Y zpnk5VcS9Mw&$_06g_4ifWms>yrh8LlFHv4Dl!<vU)TPQh9Ll(I57bE-%g>-FHn_42 zg&fs~+7GH$sY9VAs@)<e6SuZG?IRXMV(m@!QLB2wRBKLaOKilP*7gN;F$*(m>|wL2 z+gs;F>SNJa<!x=vP4#uLrq-6|tXTWPrpTgMk<M78y``>s)|~c8B(}IMGAr6%KMR}k zt6xypHnQH@72lobzjAMGb8B4#4)Wl7cy9CJw#IOCQ%fWqYdtK~)UvRyxv3$f>`+5p ztPYR=Z~HeQ6lt-8piv$Xnj2|}wAVF<B%F*(LJL|KMnbVxf*WmWfMXty-`WxL8H@-u zwzfC@lw7f$5Ucf_BZo@%@r(#9jI_td72|=LE_O}Dym4WuzN3Ai?Gy5i!FMNoMhLeL z5Vu2k(Ja_t{0gC!q58$f3=fQ%@hLRIghl@U57L`F4@a98v^7VzlgFO#|1<yVTNkvo zcC<7cMgq5n7Sy#Y4mm8NZ&CB!5^0G=|Ht|+>EU?3-4vlh)5j6COU0t5SYv2tLnzW5 zSwK*SMnk!+bLK=NvCz=wj)M=|)e4289kWdd8rs0S<Bn+c_qiqUHW_96=6Bmp6e+jV z8SQo9rdVV_G~8C#9`)s`8imv-6sw!v9Py{6MCiZLFR%L0`lGpZZdmF&QnRBa<|SoI z$Aa0B_E77b5E5FnM9O6AkLAB+&i^Vt5>GEW{zxPx>i^5}@$@7tF$&LaiqW8in_A}h zYJ0<^Hl5R&6uBQceG|hIMT5i9mb$j6m)OD!DKAxMemwnk^e0%JOghb{MQ&=DOWA5_ z_XW*nhm`Gv?#If12}fJwVpE=i`qv(bwl;T2uYtn+KlHDq)vk*Db;keDKc~Mzw4-h< z;iM~lsZc|E6OFS8O(@jT8Vl8hgfF#;6UP54e66$RMNM~zdi#ItzU1$my7~yEugO<c z3X8JW5b3ld^kc;*!9Pi|P(y1Z+Hz2gc8K0kQ%j26{x9{*m!9H(w7E5=CF(G{J=2KN zd^(x;-_|ca|D5vtW2RqoYwP@uHmBN@4)I|juWhp{&h|)sYkNaf`!&sV?Q<i;eX*m@ zx1A@}*bxmi&26D`+A=p(*W4U3?!jyc#TuKUp(ulj`EL6y>6t1#38AQKkEkL?Tiaui z27<C3@A2Z_^Z!Rl-zcHA%bSUh*C^RzD6b(1j6xjW|4aS!`R};+U+K&L$L<Bnw_QZM z%xhXuH<v*g!`VP#AklxU^xm=mcByD+qLUt#;kFx$)b<)X2(E3(?z}fQbTUW_G1zPm zO{fV^l(F(ODm2$6qd`ALe9~C(-KBk}wzOhqGt>67_G;@_o3?8YYuBkex1|kCw+5#5 zwfeSkONhg>aqkLGUP7~lUs~@TR`2%R+Elg=_V?&v?NP96oARf^=a%0AQ~S21v7KPg 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 z%0D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%0Dp!npw|+6k{}DJ&(Iov4fP$JAECaZLx0_C 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%0Dc-vVJB})18x3T6 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%0DU8yCbahl)x%Yj+^p#QS`y6 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%0Dm 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 Rnj84meyu$L5)~R@{&yXbun7PF diff --git a/external/freetype/objs/freetype.lib.recipe b/external/freetype/objs/freetype.lib.recipe deleted file mode 100644 index a53f9611d..000000000 --- a/external/freetype/objs/freetype.lib.recipe +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project> - <ProjectOutputs /> - <ContentFiles /> - <SatelliteDlls /> - <NonRecipeFileRefs /> -</Project> \ No newline at end of file diff --git a/external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt b/external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt deleted file mode 100644 index 59995233d..000000000 --- a/external/freetype/objs/freetype.vcxproj.FileListAbsolute.txt +++ /dev/null @@ -1 +0,0 @@ -C:\Projects\Applications\trview\external\freetype\objs\x64\Debug\freetype.lib From 10f719f1e84d4e5f1977d5fbd27404c0ebdb2998 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 23:34:45 +0100 Subject: [PATCH 22/38] Remove dlgcopy from freetype project --- external/freetype/builds/windows/vc2010/freetype.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/freetype/builds/windows/vc2010/freetype.vcxproj b/external/freetype/builds/windows/vc2010/freetype.vcxproj index 088ef72ae..54867db89 100644 --- a/external/freetype/builds/windows/vc2010/freetype.vcxproj +++ b/external/freetype/builds/windows/vc2010/freetype.vcxproj @@ -11,7 +11,7 @@ or with different appropriate switches. It also works with Visual Studio. Additional customization can be made in `freetype.user.props`. --> -<Project DefaultTargets="DlgCopy;Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|x86"> <Configuration>Debug</Configuration> From 6e113ae9c336fc7a9cd8cfe460967a238bfb9395 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sat, 4 May 2024 23:41:11 +0100 Subject: [PATCH 23/38] Rename x86 to win32 in project --- .../freetype/builds/windows/vc2010/freetype.vcxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/external/freetype/builds/windows/vc2010/freetype.vcxproj b/external/freetype/builds/windows/vc2010/freetype.vcxproj index 54867db89..92306536d 100644 --- a/external/freetype/builds/windows/vc2010/freetype.vcxproj +++ b/external/freetype/builds/windows/vc2010/freetype.vcxproj @@ -13,7 +13,7 @@ --> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|x86"> + <ProjectConfiguration Include="Debug|Win32"> <Configuration>Debug</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> @@ -21,7 +21,7 @@ <Configuration>Debug</Configuration> <Platform>x64</Platform> </ProjectConfiguration> - <ProjectConfiguration Include="Release|x86"> + <ProjectConfiguration Include="Release|Win32"> <Configuration>Release</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> @@ -38,7 +38,7 @@ <PropertyGroup Label="PlatformToolset"> <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'" Label="Configuration"> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>StaticLibrary</ConfigurationType> <CharacterSet>NotSet</CharacterSet> </PropertyGroup> @@ -46,7 +46,7 @@ <ConfigurationType>StaticLibrary</ConfigurationType> <CharacterSet>NotSet</CharacterSet> </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'" Label="Configuration"> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <ConfigurationType>StaticLibrary</ConfigurationType> <CharacterSet>NotSet</CharacterSet> </PropertyGroup> @@ -66,7 +66,7 @@ <TargetName>freetype</TargetName> </PropertyGroup> <Import Project="$(SolutionDir)\freetype.user.props" Condition="exists('$(SolutionDir)\freetype.user.props')" Label="UserProperties" /> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'"> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> @@ -118,7 +118,7 @@ <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies> </Lib> </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'"> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> <Optimization>MaxSpeed</Optimization> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> From 7c364839c5f4cb39fd8c30889a0a8c25ecd5fb39 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 5 May 2024 02:58:16 +0100 Subject: [PATCH 24/38] Start on new fonts interface Will manage loading fonts as safely as possible. --- trview.app/Application.cpp | 20 +++---- trview.app/Application.h | 5 +- trview.app/ApplicationCreate.cpp | 7 ++- trview.app/UI/Fonts/Fonts.cpp | 78 +++++++++++++++++++++++++++ trview.app/UI/Fonts/Fonts.h | 18 +++++++ trview.app/UI/Fonts/IFonts.h | 23 ++++++++ trview.app/UI/SettingsWindow.cpp | 62 ++------------------- trview.app/UI/SettingsWindow.h | 6 ++- trview.app/trview.app.vcxproj | 3 ++ trview.app/trview.app.vcxproj.filters | 12 +++++ 10 files changed, 157 insertions(+), 77 deletions(-) create mode 100644 trview.app/UI/Fonts/Fonts.cpp create mode 100644 trview.app/UI/Fonts/Fonts.h create mode 100644 trview.app/UI/Fonts/IFonts.h diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index 1043efa3d..bba1d3598 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -58,14 +58,15 @@ namespace trview std::unique_ptr<IConsoleManager> console_manager, std::shared_ptr<IPlugins> plugins, std::unique_ptr<IPluginsWindowManager> plugins_window_manager, - const IRandomizerRoute::Source& randomizer_route_source) + const IRandomizerRoute::Source& randomizer_route_source, + std::shared_ptr<IFonts> fonts) : MessageHandler(application_window), _instance(GetModuleHandle(nullptr)), _file_menu(std::move(file_menu)), _update_checker(std::move(update_checker)), _view_menu(window()), _settings_loader(settings_loader), _trlevel_source(trlevel_source), _viewer(std::move(viewer)), _route_source(route_source), _shortcuts(shortcuts), _items_windows(std::move(items_window_manager)), _triggers_windows(std::move(triggers_window_manager)), _route_window(std::move(route_window_manager)), _rooms_windows(std::move(rooms_window_manager)), _level_source(level_source), _dialogs(dialogs), _files(files), _timer(default_time_source()), _imgui_backend(std::move(imgui_backend)), _lights_windows(std::move(lights_window_manager)), _log_windows(std::move(log_window_manager)), _textures_windows(std::move(textures_window_manager)), _camera_sink_windows(std::move(camera_sink_window_manager)), _console_manager(std::move(console_manager)), - _plugins(plugins), _plugins_windows(std::move(plugins_window_manager)), _randomizer_route_source(randomizer_route_source) + _plugins(plugins), _plugins_windows(std::move(plugins_window_manager)), _randomizer_route_source(randomizer_route_source), _fonts(fonts) { SetWindowLongPtr(window(), GWLP_USERDATA, reinterpret_cast<LONG_PTR>(_imgui_backend.get())); @@ -674,10 +675,7 @@ namespace trview // Setup Dear ImGui style ImGui::StyleColorsDark(); - const std::string font_path = _settings.font.filename.contains('\\') ? - _settings.font.filename : - std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename); - _font = io.Fonts->AddFontFromFileTTF(font_path.c_str(), _settings.font.size); + _font = _fonts->add_font("main", _settings.font); _console_manager->initialise_ui(); @@ -698,11 +696,8 @@ namespace trview if (_new_font.has_value()) { + auto new_font = _fonts->add_font("main", *_new_font); ImGuiIO& io = ImGui::GetIO(); - const std::string font_path = _new_font->filename.contains('\\') ? - _new_font->filename : - std::format("{}\\{}", _files->fonts_directory(), _new_font->filename); - auto new_font = io.Fonts->AddFontFromFileTTF(font_path.c_str(), _new_font.value().size); _imgui_backend->rebuild_fonts(); bool revert = true; @@ -721,10 +716,7 @@ namespace trview if (revert) { io.Fonts->Clear(); - const std::string old_font_path = _settings.font.filename.contains('\\') ? - _settings.font.filename : - std::format("{}\\{}", _files->fonts_directory(), _settings.font.filename); - _font = io.Fonts->AddFontFromFileTTF(old_font_path.c_str(), _settings.font.size); + _font = _fonts->add_font("main", _settings.font); } else { diff --git a/trview.app/Application.h b/trview.app/Application.h index 4febb7179..4447a5c8b 100644 --- a/trview.app/Application.h +++ b/trview.app/Application.h @@ -28,6 +28,7 @@ #include "Windows/Console/IConsoleManager.h" #include "Plugins/IPlugins.h" #include "Windows/Plugins/IPluginsWindowManager.h" +#include "UI/Fonts/IFonts.h" struct ImFont; @@ -75,7 +76,8 @@ namespace trview std::unique_ptr<IConsoleManager> console_manager, std::shared_ptr<IPlugins> plugins, std::unique_ptr<IPluginsWindowManager> plugins_window_manager, - const IRandomizerRoute::Source& randomizer_route_source); + const IRandomizerRoute::Source& randomizer_route_source, + std::shared_ptr<IFonts> fonts); virtual ~Application(); /// Attempt to open the specified level file. /// @param filename The level file to open. @@ -181,6 +183,7 @@ namespace trview std::unique_ptr<IPluginsWindowManager> _plugins_windows; IRandomizerRoute::Source _randomizer_route_source; + std::shared_ptr<IFonts> _fonts; }; std::unique_ptr<IApplication> create_application(HINSTANCE hInstance, int command_show, const std::wstring& command_line); diff --git a/trview.app/ApplicationCreate.cpp b/trview.app/ApplicationCreate.cpp index b31d5e95d..9464a4a95 100644 --- a/trview.app/ApplicationCreate.cpp +++ b/trview.app/ApplicationCreate.cpp @@ -68,6 +68,7 @@ #include "Windows/Plugins/PluginsWindowManager.h" #include "Windows/Plugins/PluginsWindow.h" #include "Tools/Toolbar.h" +#include "UI/Fonts/Fonts.h" namespace trview { @@ -276,13 +277,14 @@ namespace trview plugin_source, settings_loader->load_user_settings()); auto plugins_window_source = [=]() { return std::make_shared<PluginsWindow>(plugins, shell); }; + auto fonts = std::make_shared<Fonts>(files); auto viewer_ui = std::make_unique<ViewerUI>( window, texture_storage, shortcuts, map_renderer_source, - std::make_unique<SettingsWindow>(dialogs, shell), + std::make_unique<SettingsWindow>(dialogs, shell, fonts), std::make_unique<ViewOptions>(), std::make_unique<ContextMenu>(), std::make_unique<CameraControls>(), @@ -346,6 +348,7 @@ namespace trview std::make_unique<ConsoleManager>(window, shortcuts, console_source, files), plugins, std::make_unique<PluginsWindowManager>(window, shortcuts, plugins_window_source), - randomizer_route_source); + randomizer_route_source, + fonts); } } diff --git a/trview.app/UI/Fonts/Fonts.cpp b/trview.app/UI/Fonts/Fonts.cpp new file mode 100644 index 000000000..2e723be10 --- /dev/null +++ b/trview.app/UI/Fonts/Fonts.cpp @@ -0,0 +1,78 @@ +#include "Fonts.h" +#include <format> + +namespace trview +{ + namespace + { + std::vector<FontSetting> load_for_key(HKEY key_search) + { + std::vector<FontSetting> available_fonts; + HKEY key = nullptr; + if (ERROR_SUCCESS == RegOpenKeyEx(key_search, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_READ, &key)) + { + DWORD value_count = 0; + DWORD max_value_length = 0; + std::vector<wchar_t> value(16383, 0); + + LRESULT result = RegQueryInfoKey(key, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, &value_count, &max_value_length, nullptr, nullptr, nullptr); + for (uint32_t i = 0; i < value_count; ++i) + { + DWORD value_length = 16383; + value[0] = '\0'; + + DWORD data_length = 0; + result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, NULL, &data_length); + + value_length = 16383; + + std::vector<uint8_t> data_value(data_length, 0); + result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, &data_value[0], &data_length); + + wchar_t* value_string = reinterpret_cast<wchar_t*>(&data_value[0]); + if (value_string && + std::wstring(value_string).ends_with(L".ttf") && + std::wstring(&value[0]).ends_with(L" (TrueType)")) + { + const auto name = to_utf8(&value[0]); + available_fonts.push_back( + { + .name = name.substr(0, name.length() - 11), + .filename = to_utf8(value_string) + }); + } + } + } + + RegCloseKey(key); + return available_fonts; + } + } + + IFonts::~IFonts() + { + } + + Fonts::Fonts(const std::shared_ptr<IFiles>& files) + : _files(files) + { + } + + std::vector<FontSetting> Fonts::list_fonts() const + { + std::vector<FontSetting> available_fonts = load_for_key(HKEY_LOCAL_MACHINE); + available_fonts.append_range(load_for_key(HKEY_CURRENT_USER)); + std::ranges::sort(available_fonts, [](auto&& l, auto&& r) { return l.name < r.name; }); + return available_fonts; + } + + ImFont* Fonts::add_font(const std::string&, const FontSetting& setting) + { + const std::string font_path = setting.filename.contains('\\') ? + setting.filename : + std::format("{}\\{}", _files->fonts_directory(), setting.filename); + + ImGuiIO& io = ImGui::GetIO(); + return io.Fonts->AddFontFromFileTTF(font_path.c_str(), setting.size); + } +} diff --git a/trview.app/UI/Fonts/Fonts.h b/trview.app/UI/Fonts/Fonts.h new file mode 100644 index 000000000..cc4792c62 --- /dev/null +++ b/trview.app/UI/Fonts/Fonts.h @@ -0,0 +1,18 @@ +#pragma once + +#include "IFonts.h" +#include <trview.common/IFiles.h> + +namespace trview +{ + class Fonts : public IFonts + { + public: + explicit Fonts(const std::shared_ptr<IFiles>& files); + virtual ~Fonts() = default; + std::vector<FontSetting> list_fonts() const override; + ImFont* add_font(const std::string& name, const FontSetting& setting) override; + private: + std::shared_ptr<IFiles> _files; + }; +} diff --git a/trview.app/UI/Fonts/IFonts.h b/trview.app/UI/Fonts/IFonts.h new file mode 100644 index 000000000..3fd4a8293 --- /dev/null +++ b/trview.app/UI/Fonts/IFonts.h @@ -0,0 +1,23 @@ +#pragma once + +#include <string> +#include <vector> +#include "../../Settings/FontSetting.h" + +struct ImFont; + +namespace trview +{ + struct IFonts + { + virtual ~IFonts() = 0; + /// <summary> + /// Get all of the installed fonts from the system or user. + /// </summary> + virtual std::vector<FontSetting> list_fonts() const = 0; + /// <summary> + /// Attempt to create a font based on the provided setting. + /// </summary> + virtual ImFont* add_font(const std::string& name, const FontSetting& setting) = 0; + }; +} diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index 746e10fbb..defb39be0 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -2,66 +2,12 @@ namespace trview { - namespace - { - std::vector<FontSetting> load_for_key(HKEY key_search) - { - std::vector<FontSetting> available_fonts; - HKEY key = nullptr; - if (ERROR_SUCCESS == RegOpenKeyEx(key_search, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_READ, &key)) - { - DWORD value_count = 0; - DWORD max_value_length = 0; - std::vector<wchar_t> value(16383, 0); - - LRESULT result = RegQueryInfoKey(key, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, &value_count, &max_value_length, nullptr, nullptr, nullptr); - for (uint32_t i = 0; i < value_count; ++i) - { - DWORD value_length = 16383; - value[0] = '\0'; - - DWORD data_length = 0; - result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, NULL, &data_length); - - value_length = 16383; - - std::vector<uint8_t> data_value(data_length, 0); - result = RegEnumValue(key, i, &value[0], &value_length, NULL, NULL, &data_value[0], &data_length); - - wchar_t* value_string = reinterpret_cast<wchar_t*>(&data_value[0]); - if (value_string && - std::wstring(value_string).ends_with(L".ttf") && - std::wstring(&value[0]).ends_with(L" (TrueType)")) - { - const auto name = to_utf8(&value[0]); - available_fonts.push_back( - { - .name = name.substr(0, name.length() - 11), - .filename = to_utf8(value_string) - }); - } - } - } - - RegCloseKey(key); - return available_fonts; - } - - std::vector<FontSetting> get_ye_fonts() - { - std::vector<FontSetting> available_fonts = load_for_key(HKEY_LOCAL_MACHINE); - available_fonts.append_range(load_for_key(HKEY_CURRENT_USER)); - std::ranges::sort(available_fonts, [](auto&& l, auto&& r) { return l.name < r.name; }); - return available_fonts; - } - } - ISettingsWindow::~ISettingsWindow() { } - SettingsWindow::SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell) - : _dialogs(dialogs), _shell(shell) + SettingsWindow::SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell, const std::shared_ptr<IFonts>& fonts) + : _dialogs(dialogs), _shell(shell), _fonts(fonts) { } @@ -108,7 +54,7 @@ namespace trview if (ImGui::BeginCombo("Font", _selected_font.name.c_str())) { - for (const auto& f : _fonts) + for (const auto& f : _all_fonts) { bool is_selected = _selected_font.name == f.name; if (ImGui::Selectable(f.name.c_str(), is_selected)) @@ -328,7 +274,7 @@ namespace trview _visible = !_visible; if (_visible) { - _fonts = get_ye_fonts(); + _all_fonts = _fonts->list_fonts(); } } diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index 0fd27f2f8..f12727438 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -7,6 +7,7 @@ #include <trview.common/Windows/IShell.h> #include <trview.common/Windows/IDialogs.h> +#include "Fonts/IFonts.h" namespace trview { @@ -40,7 +41,7 @@ namespace trview static inline const std::string reset_fov = "Reset##Fov"; }; - explicit SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell); + explicit SettingsWindow(const std::shared_ptr<IDialogs>& dialogs, const std::shared_ptr<IShell>& shell, const std::shared_ptr<IFonts>& fonts); virtual ~SettingsWindow() = default; virtual void render() override; virtual void set_vsync(bool value) override; @@ -96,6 +97,7 @@ namespace trview bool _camera_sink_startup{ false }; std::vector<std::string> _plugin_directories; FontSetting _selected_font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; - std::vector<FontSetting> _fonts; + std::vector<FontSetting> _all_fonts; + std::shared_ptr<IFonts> _fonts; }; } diff --git a/trview.app/trview.app.vcxproj b/trview.app/trview.app.vcxproj index 65249cdaf..c2c058352 100644 --- a/trview.app/trview.app.vcxproj +++ b/trview.app/trview.app.vcxproj @@ -128,6 +128,7 @@ copy ""$(OutDir)*.cso"" ""$(ProjectDir)Resources\Generated""</Command> <ClInclude Include="Lua\Route\Lua_Route.h" /> <ClInclude Include="Lua\Route\Lua_Waypoint.h" /> <ClInclude Include="Lua\Vector3.h" /> + <ClCompile Include="UI\Fonts\Fonts.cpp" /> <ClCompile Include="Windows\ColumnSizer.cpp" /> <ClCompile Include="Windows\Console\Console.cpp" /> <ClCompile Include="Windows\Console\ConsoleManager.cpp" /> @@ -185,6 +186,8 @@ copy ""$(OutDir)*.cso"" ""$(ProjectDir)Resources\Generated""</Command> <ClCompile Include="Windows\TriggersWindowManager.cpp" /> <ClCompile Include="Windows\Viewer.cpp" /> <ClCompile Include="Windows\WindowResizer.cpp" /> + <ClInclude Include="UI\Fonts\Fonts.h" /> + <ClInclude Include="UI\Fonts\IFonts.h" /> <ClInclude Include="UserCancelledException.h" /> <ClInclude Include="Windows\ColumnSizer.h" /> <ClInclude Include="Windows\Console\Console.h" /> diff --git a/trview.app/trview.app.vcxproj.filters b/trview.app/trview.app.vcxproj.filters index 0fe9341c3..eae1a8f0d 100644 --- a/trview.app/trview.app.vcxproj.filters +++ b/trview.app/trview.app.vcxproj.filters @@ -326,6 +326,9 @@ <ClCompile Include="Windows\ColumnSizer.cpp"> <Filter>Windows</Filter> </ClCompile> + <ClCompile Include="UI\Fonts\Fonts.cpp"> + <Filter>UI\Fonts</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="Camera\Camera.h"> @@ -1051,6 +1054,12 @@ <ClInclude Include="Windows\ColumnSizer.h"> <Filter>Windows</Filter> </ClInclude> + <ClInclude Include="UI\Fonts\IFonts.h"> + <Filter>UI\Fonts</Filter> + </ClInclude> + <ClInclude Include="UI\Fonts\Fonts.h"> + <Filter>UI\Fonts</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <Filter Include="Windows"> @@ -1239,6 +1248,9 @@ <Filter Include="Lua\Route"> <UniqueIdentifier>{28f7b23c-bc43-40bc-a3a1-f2f742269f65}</UniqueIdentifier> </Filter> + <Filter Include="UI\Fonts"> + <UniqueIdentifier>{68f08988-7dd5-4109-ba3d-337b37fb0567}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <Image Include="Resources\Files\tomb1.png"> From ddcc2b610126d38f03baadc3ac6a41c9f7f33d75 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 5 May 2024 03:12:21 +0100 Subject: [PATCH 25/38] Update tests --- trview.app.tests/ApplicationTests.cpp | 10 +++------- trview.app.ui.tests/SettingsWindowTests.cpp | 4 +++- trview.app/Mocks/Mocks.cpp | 4 ++++ trview.app/Mocks/UI/IFonts.h | 17 +++++++++++++++++ trview.app/trview.app.vcxproj | 1 + trview.app/trview.app.vcxproj.filters | 3 +++ 6 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 trview.app/Mocks/UI/IFonts.h diff --git a/trview.app.tests/ApplicationTests.cpp b/trview.app.tests/ApplicationTests.cpp index ea613d68c..9a3bcf3c6 100644 --- a/trview.app.tests/ApplicationTests.cpp +++ b/trview.app.tests/ApplicationTests.cpp @@ -32,6 +32,7 @@ #include <trview.app/Mocks/Lua/ILua.h> #include <trview.app/Mocks/Plugins/IPlugins.h> #include <trview.app/Mocks/Windows/IPluginsWindowManager.h> +#include <trview.app/Mocks/UI/IFonts.h> using namespace trview; using namespace trview::tests; @@ -85,6 +86,7 @@ namespace std::shared_ptr<IPlugins> plugins{ mock_shared<MockPlugins>() }; std::unique_ptr<IPluginsWindowManager> plugins_window_manager{ mock_unique<MockPluginsWindowManager>() }; IRandomizerRoute::Source randomizer_route_source { [](auto&&...) { return mock_shared<MockRandomizerRoute>(); } }; + std::shared_ptr<IFonts> fonts { mock_shared<MockFonts>() }; std::unique_ptr<Application> build() { @@ -94,7 +96,7 @@ namespace std::move(items_window_manager), std::move(triggers_window_manager), std::move(route_window_manager), std::move(rooms_window_manager), level_source, startup_options, dialogs, files, std::move(imgui_backend), std::move(lights_window_manager), std::move(log_window_manager), std::move(textures_window_manager), std::move(camera_sink_window_manager), std::move(console_manager), - plugins, std::move(plugins_window_manager), randomizer_route_source); + plugins, std::move(plugins_window_manager), randomizer_route_source, fonts); } test_module& with_dialogs(std::shared_ptr<IDialogs> dialogs) @@ -517,8 +519,6 @@ TEST(Application, WindowManagersUpdated) EXPECT_CALL(triggers_window_manager, update).Times(1); auto [lights_window_manager_ptr, lights_window_manager] = create_mock<MockLightsWindowManager>(); EXPECT_CALL(lights_window_manager, update).Times(1); - auto files = mock_shared<MockFiles>(); - EXPECT_CALL(*files, fonts_directory()).Times(1).WillRepeatedly(Return(fonts_directory())); auto application = register_test_module() .with_route_window_manager(std::move(route_window_manager_ptr)) @@ -526,7 +526,6 @@ TEST(Application, WindowManagersUpdated) .with_rooms_window_manager(std::move(rooms_window_manager_ptr)) .with_triggers_window_manager(std::move(triggers_window_manager_ptr)) .with_lights_window_manager(std::move(lights_window_manager_ptr)) - .with_files(files) .build(); application->render(); } @@ -559,8 +558,6 @@ TEST(Application, WindowManagersAndViewerRendered) auto [viewer_ptr, viewer] = create_mock<MockViewer>(); EXPECT_CALL(viewer, render).Times(1); - auto files = mock_shared<MockFiles>(); - EXPECT_CALL(*files, fonts_directory()).Times(1).WillRepeatedly(Return(fonts_directory())); auto application = register_test_module() .with_route_window_manager(std::move(route_window_manager_ptr)) @@ -574,7 +571,6 @@ TEST(Application, WindowManagersAndViewerRendered) .with_console_manager(std::move(console_manager_ptr)) .with_plugins_window_manager(std::move(plugins_window_manager_ptr)) .with_viewer(std::move(viewer_ptr)) - .with_files(files) .with_plugins(plugins) .build(); application->render(); diff --git a/trview.app.ui.tests/SettingsWindowTests.cpp b/trview.app.ui.tests/SettingsWindowTests.cpp index 516e6a119..5d53a8f25 100644 --- a/trview.app.ui.tests/SettingsWindowTests.cpp +++ b/trview.app.ui.tests/SettingsWindowTests.cpp @@ -6,6 +6,7 @@ #include <trview.app/UI/SettingsWindow.h> #include <trview.common/Mocks/Windows/IShell.h> #include <trview.common/Mocks/Windows/IDialogs.h> +#include <trview.app/Mocks/UI/IFonts.h> using namespace testing; using namespace trview; @@ -20,10 +21,11 @@ namespace { std::shared_ptr<IDialogs> dialogs{ mock_shared<MockDialogs>() }; std::shared_ptr<IShell> shell{ mock_shared<MockShell>() }; + std::shared_ptr<IFonts> fonts{ mock_shared<MockFonts>() }; std::unique_ptr<SettingsWindow> build() { - return std::make_unique<SettingsWindow>(dialogs, shell); + return std::make_unique<SettingsWindow>(dialogs, shell, fonts); } test_module& with_dialogs(const std::shared_ptr<IDialogs>& dialogs) diff --git a/trview.app/Mocks/Mocks.cpp b/trview.app/Mocks/Mocks.cpp index e4ff10a8e..21f34c9a7 100644 --- a/trview.app/Mocks/Mocks.cpp +++ b/trview.app/Mocks/Mocks.cpp @@ -29,6 +29,7 @@ #include "Tools/IMeasure.h" #include "UI/ICameraControls.h" #include "UI/IContextMenu.h" +#include "UI/IFonts.h" #include "UI/IImGuiBackend.h" #include "UI/IMapRenderer.h" #include "UI/ISettingsWindow.h" @@ -149,6 +150,9 @@ namespace trview MockContextMenu::MockContextMenu() {} MockContextMenu::~MockContextMenu() {} + MockFonts::MockFonts() {} + MockFonts::~MockFonts() {} + MockImGuiBackend::MockImGuiBackend() {} MockImGuiBackend::~MockImGuiBackend() {} diff --git a/trview.app/Mocks/UI/IFonts.h b/trview.app/Mocks/UI/IFonts.h new file mode 100644 index 000000000..2518493b5 --- /dev/null +++ b/trview.app/Mocks/UI/IFonts.h @@ -0,0 +1,17 @@ +#pragma once + +#include "../../UI/Fonts/IFonts.h" + +namespace trview +{ + namespace mocks + { + struct MockFonts : public IFonts + { + MockFonts(); + virtual ~MockFonts(); + MOCK_METHOD(std::vector<FontSetting>, list_fonts, (), (const, override)); + MOCK_METHOD(ImFont*, add_font, (const std::string&, const FontSetting&), (override)); + }; + } +} diff --git a/trview.app/trview.app.vcxproj b/trview.app/trview.app.vcxproj index c2c058352..631fee19a 100644 --- a/trview.app/trview.app.vcxproj +++ b/trview.app/trview.app.vcxproj @@ -85,6 +85,7 @@ copy ""$(OutDir)*.cso"" ""$(ProjectDir)Resources\Generated""</Command> <ClCompile Include="Plugins\Plugin.cpp" /> <ClCompile Include="Plugins\Plugins.cpp" /> <ClCompile Include="Routing\RandomizerRoute.cpp" /> + <ClInclude Include="Mocks\UI\IFonts.h" /> <ClInclude Include="Settings\FontSetting.h" /> <ClCompile Include="trview_imgui.cpp" /> <ClCompile Include="Lua\Lua.cpp" /> diff --git a/trview.app/trview.app.vcxproj.filters b/trview.app/trview.app.vcxproj.filters index eae1a8f0d..b4541f86f 100644 --- a/trview.app/trview.app.vcxproj.filters +++ b/trview.app/trview.app.vcxproj.filters @@ -1060,6 +1060,9 @@ <ClInclude Include="UI\Fonts\Fonts.h"> <Filter>UI\Fonts</Filter> </ClInclude> + <ClInclude Include="Mocks\UI\IFonts.h"> + <Filter>Mocks\UI</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <Filter Include="Windows"> From c19564628a72d47064e9756ecb7fe2a366201684 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 5 May 2024 12:05:49 +0100 Subject: [PATCH 26/38] Move more font setup into the fonts class Handle failure to some degree --- trview.app.tests/ApplicationTests.cpp | 12 +++---- trview.app/Application.cpp | 36 ++++--------------- trview.app/Application.h | 5 ++- trview.app/ApplicationCreate.cpp | 5 +-- trview.app/UI/Fonts/Fonts.cpp | 51 ++++++++++++++++++++++++--- trview.app/UI/Fonts/Fonts.h | 20 +++++++++-- trview.app/UI/Fonts/IFonts.h | 1 + 7 files changed, 84 insertions(+), 46 deletions(-) diff --git a/trview.app.tests/ApplicationTests.cpp b/trview.app.tests/ApplicationTests.cpp index 9a3bcf3c6..913c5c4bf 100644 --- a/trview.app.tests/ApplicationTests.cpp +++ b/trview.app.tests/ApplicationTests.cpp @@ -77,7 +77,7 @@ namespace std::shared_ptr<IStartupOptions> startup_options{ mock_shared<MockStartupOptions>() }; std::shared_ptr<IDialogs> dialogs{ mock_shared<MockDialogs>() }; std::shared_ptr<IFiles> files{ mock_shared<MockFiles>() }; - std::unique_ptr<IImGuiBackend> imgui_backend{ std::make_unique<NullImGuiBackend>() }; + std::shared_ptr<IImGuiBackend> imgui_backend{ std::make_shared<NullImGuiBackend>() }; std::unique_ptr<ILightsWindowManager> lights_window_manager{ mock_unique<MockLightsWindowManager>() }; std::unique_ptr<ILogWindowManager> log_window_manager{ mock_unique<MockLogWindowManager>() }; std::unique_ptr<ITexturesWindowManager> textures_window_manager{ mock_unique<MockTexturesWindowManager>() }; @@ -189,9 +189,9 @@ namespace return *this; } - test_module& with_imgui_backend(std::unique_ptr<IImGuiBackend> backend) + test_module& with_imgui_backend(std::shared_ptr<IImGuiBackend> backend) { - this->imgui_backend = std::move(backend); + this->imgui_backend = backend; return *this; } @@ -616,11 +616,11 @@ TEST(Application, MapColoursSetOnSettingsChanged) TEST(Application, ResetLayout) { - auto [imgui_backend_ptr, imgui_backend] = create_mock<MockImGuiBackend>(); - EXPECT_CALL(imgui_backend, reset_layout); + auto imgui_backend = mock_shared<MockImGuiBackend>(); + EXPECT_CALL(*imgui_backend, reset_layout); auto application = register_test_module() - .with_imgui_backend(std::move(imgui_backend_ptr)) + .with_imgui_backend(imgui_backend) .build(); application->process_message(WM_COMMAND, MAKEWPARAM(ID_WINDOWS_RESET_LAYOUT, 0), 0); diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index bba1d3598..dc4a90295 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -50,7 +50,7 @@ namespace trview std::shared_ptr<IStartupOptions> startup_options, std::shared_ptr<IDialogs> dialogs, std::shared_ptr<IFiles> files, - std::unique_ptr<IImGuiBackend> imgui_backend, + std::shared_ptr<IImGuiBackend> imgui_backend, std::unique_ptr<ILightsWindowManager> lights_window_manager, std::unique_ptr<ILogWindowManager> log_window_manager, std::unique_ptr<ITexturesWindowManager> textures_window_manager, @@ -675,12 +675,12 @@ namespace trview // Setup Dear ImGui style ImGui::StyleColorsDark(); - _font = _fonts->add_font("main", _settings.font); - - _console_manager->initialise_ui(); - // Setup Platform/Renderer backends _imgui_backend->initialise(); + + _fonts->add_font("main", _settings.font); + + _console_manager->initialise_ui(); } _timer.update(); @@ -696,29 +696,7 @@ namespace trview if (_new_font.has_value()) { - auto new_font = _fonts->add_font("main", *_new_font); - ImGuiIO& io = ImGui::GetIO(); - _imgui_backend->rebuild_fonts(); - - bool revert = true; - if (new_font && new_font->Glyphs.Size > 0) - { - unsigned char* pixels; - int width, height; - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); - if (width > 0 && height > 0) - { - _font = new_font; - revert = false; - } - } - - if (revert) - { - io.Fonts->Clear(); - _font = _fonts->add_font("main", _settings.font); - } - else + if (_fonts->add_font("main", *_new_font)) { _settings.font = _new_font.value(); _viewer->set_settings(_settings); @@ -729,7 +707,7 @@ namespace trview _imgui_backend->new_frame(); ImGui::NewFrame(); - ImGui::PushFont(_font); + ImGui::PushFont(_fonts->font("main")); _viewer->render_ui(); _items_windows->render(); diff --git a/trview.app/Application.h b/trview.app/Application.h index 4447a5c8b..ecc903b4c 100644 --- a/trview.app/Application.h +++ b/trview.app/Application.h @@ -68,7 +68,7 @@ namespace trview std::shared_ptr<IStartupOptions> startup_options, std::shared_ptr<IDialogs> dialogs, std::shared_ptr<IFiles> files, - std::unique_ptr<IImGuiBackend> imgui_backend, + std::shared_ptr<IImGuiBackend> imgui_backend, std::unique_ptr<ILightsWindowManager> lights_window_manager, std::unique_ptr<ILogWindowManager> log_window_manager, std::unique_ptr<ITexturesWindowManager> textures_window_manager, @@ -168,10 +168,9 @@ namespace trview std::unique_ptr<IRoomsWindowManager> _rooms_windows; std::unique_ptr<ILightsWindowManager> _lights_windows; Timer _timer; - ImFont* _font; std::optional<FontSetting> _new_font; - std::unique_ptr<IImGuiBackend> _imgui_backend; + std::shared_ptr<IImGuiBackend> _imgui_backend; std::string _imgui_ini_filename; std::unique_ptr<ILogWindowManager> _log_windows; bool _recent_route_prompted{ false }; diff --git a/trview.app/ApplicationCreate.cpp b/trview.app/ApplicationCreate.cpp index 9464a4a95..3641b6ca2 100644 --- a/trview.app/ApplicationCreate.cpp +++ b/trview.app/ApplicationCreate.cpp @@ -277,7 +277,8 @@ namespace trview plugin_source, settings_loader->load_user_settings()); auto plugins_window_source = [=]() { return std::make_shared<PluginsWindow>(plugins, shell); }; - auto fonts = std::make_shared<Fonts>(files); + auto imgui_backend = std::make_shared<DX11ImGuiBackend>(window, device, files); + auto fonts = std::make_shared<Fonts>(files, imgui_backend); auto viewer_ui = std::make_unique<ViewerUI>( window, @@ -340,7 +341,7 @@ namespace trview std::make_shared<StartupOptions>(command_line), dialogs, files, - std::make_unique<DX11ImGuiBackend>(window, device, files), + imgui_backend, std::make_unique<LightsWindowManager>(window, shortcuts, lights_window_source), std::make_unique<LogWindowManager>(window, log_window_source), std::make_unique<TexturesWindowManager>(window, textures_window_source), diff --git a/trview.app/UI/Fonts/Fonts.cpp b/trview.app/UI/Fonts/Fonts.cpp index 2e723be10..c34d4c32c 100644 --- a/trview.app/UI/Fonts/Fonts.cpp +++ b/trview.app/UI/Fonts/Fonts.cpp @@ -53,8 +53,8 @@ namespace trview { } - Fonts::Fonts(const std::shared_ptr<IFiles>& files) - : _files(files) + Fonts::Fonts(const std::shared_ptr<IFiles>& files, const std::shared_ptr<IImGuiBackend>& imgui_backend) + : _files(files), _imgui_backend(imgui_backend) { } @@ -66,13 +66,56 @@ namespace trview return available_fonts; } - ImFont* Fonts::add_font(const std::string&, const FontSetting& setting) + ImFont* Fonts::add_font(const std::string& name, const FontSetting& setting) + { + auto new_font = add_font(setting); + _imgui_backend->rebuild_fonts(); + + ImGuiIO& io = ImGui::GetIO(); + + bool revert = true; + if (new_font && new_font->Glyphs.Size > 0) + { + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + if (width > 0 && height > 0) + { + revert = false; + } + } + + if (revert) + { + io.Fonts->Clear(); + rebuild_fonts(); + return nullptr; + } + + _fonts[name] = { .setting = setting, .font = new_font }; + return new_font; + } + + ImFont* Fonts::font(const std::string& name) const + { + const auto found = _fonts.find(name); + return found == _fonts.end() ? nullptr : found->second.font; + } + + ImFont* Fonts::add_font(const FontSetting& setting) { const std::string font_path = setting.filename.contains('\\') ? setting.filename : std::format("{}\\{}", _files->fonts_directory(), setting.filename); - ImGuiIO& io = ImGui::GetIO(); return io.Fonts->AddFontFromFileTTF(font_path.c_str(), setting.size); } + + void Fonts::rebuild_fonts() + { + for (auto& [_, font] : _fonts) + { + font.font = add_font(font.setting); + } + } } diff --git a/trview.app/UI/Fonts/Fonts.h b/trview.app/UI/Fonts/Fonts.h index cc4792c62..b4b0bffaf 100644 --- a/trview.app/UI/Fonts/Fonts.h +++ b/trview.app/UI/Fonts/Fonts.h @@ -1,18 +1,34 @@ #pragma once -#include "IFonts.h" +#include <unordered_map> + #include <trview.common/IFiles.h> +#include "IFonts.h" +#include "../IImGuiBackend.h" + namespace trview { class Fonts : public IFonts { public: - explicit Fonts(const std::shared_ptr<IFiles>& files); + explicit Fonts(const std::shared_ptr<IFiles>& files, const std::shared_ptr<IImGuiBackend>& imgui_backend); virtual ~Fonts() = default; std::vector<FontSetting> list_fonts() const override; ImFont* add_font(const std::string& name, const FontSetting& setting) override; + ImFont* font(const std::string& name) const override; private: + ImFont* add_font(const FontSetting& setting); + void rebuild_fonts(); + + struct Font + { + FontSetting setting; + ImFont* font{ nullptr }; + }; + std::shared_ptr<IFiles> _files; + std::unordered_map<std::string, Font> _fonts; + std::shared_ptr<IImGuiBackend> _imgui_backend; }; } diff --git a/trview.app/UI/Fonts/IFonts.h b/trview.app/UI/Fonts/IFonts.h index 3fd4a8293..e9c707858 100644 --- a/trview.app/UI/Fonts/IFonts.h +++ b/trview.app/UI/Fonts/IFonts.h @@ -19,5 +19,6 @@ namespace trview /// Attempt to create a font based on the provided setting. /// </summary> virtual ImFont* add_font(const std::string& name, const FontSetting& setting) = 0; + virtual ImFont* font(const std::string& name) const = 0; }; } From 079ff945b5df876ccfd315aac14b0df392a23236 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Sun, 5 May 2024 16:36:05 +0100 Subject: [PATCH 27/38] Use font manager for console font #970 --- trview.app/Application.cpp | 3 +-- trview.app/ApplicationCreate.cpp | 2 +- trview.app/Mocks/UI/IFonts.h | 1 + trview.app/Mocks/Windows/IConsole.h | 1 - trview.app/Mocks/Windows/IConsoleManager.h | 1 - trview.app/Windows/Console/Console.cpp | 16 ++++++---------- trview.app/Windows/Console/Console.h | 6 +++--- trview.app/Windows/Console/ConsoleManager.cpp | 15 --------------- trview.app/Windows/Console/ConsoleManager.h | 2 -- trview.app/Windows/Console/IConsole.h | 1 - trview.app/Windows/Console/IConsoleManager.h | 1 - 11 files changed, 12 insertions(+), 37 deletions(-) diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index dc4a90295..80aaa89ee 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -679,8 +679,7 @@ namespace trview _imgui_backend->initialise(); _fonts->add_font("main", _settings.font); - - _console_manager->initialise_ui(); + _fonts->add_font("console", { .name = "Consolas", .filename = "consolas.ttf", .size = 12.0f }); } _timer.update(); diff --git a/trview.app/ApplicationCreate.cpp b/trview.app/ApplicationCreate.cpp index 3641b6ca2..9a69edc66 100644 --- a/trview.app/ApplicationCreate.cpp +++ b/trview.app/ApplicationCreate.cpp @@ -322,7 +322,7 @@ namespace trview auto trlevel_source = [=](auto&& filename) { return std::make_shared<trlevel::Level>(filename, files, decrypter, log); }; auto textures_window_source = [=]() { return std::make_shared<TexturesWindow>(); }; - auto console_source = [=]() { return std::make_shared<Console>(dialogs, plugins); }; + auto console_source = [=]() { return std::make_shared<Console>(dialogs, plugins, fonts); }; return std::make_unique<Application>( window, diff --git a/trview.app/Mocks/UI/IFonts.h b/trview.app/Mocks/UI/IFonts.h index 2518493b5..bbc678aa6 100644 --- a/trview.app/Mocks/UI/IFonts.h +++ b/trview.app/Mocks/UI/IFonts.h @@ -12,6 +12,7 @@ namespace trview virtual ~MockFonts(); MOCK_METHOD(std::vector<FontSetting>, list_fonts, (), (const, override)); MOCK_METHOD(ImFont*, add_font, (const std::string&, const FontSetting&), (override)); + MOCK_METHOD(ImFont*, font, (const std::string&), (const, override)); }; } } diff --git a/trview.app/Mocks/Windows/IConsole.h b/trview.app/Mocks/Windows/IConsole.h index b5746758c..2f95ddb92 100644 --- a/trview.app/Mocks/Windows/IConsole.h +++ b/trview.app/Mocks/Windows/IConsole.h @@ -12,7 +12,6 @@ namespace trview virtual ~MockConsole(); MOCK_METHOD(void, render, (), (override)); MOCK_METHOD(void, set_number, (int32_t number), (override)); - MOCK_METHOD(void, set_font, (ImFont* font), (override)); }; } } diff --git a/trview.app/Mocks/Windows/IConsoleManager.h b/trview.app/Mocks/Windows/IConsoleManager.h index 6e4eda778..be04f9bc3 100644 --- a/trview.app/Mocks/Windows/IConsoleManager.h +++ b/trview.app/Mocks/Windows/IConsoleManager.h @@ -12,7 +12,6 @@ namespace trview virtual ~MockConsoleManager(); MOCK_METHOD(void, render, (), (override)); MOCK_METHOD(std::weak_ptr<IConsole>, create_window, (), (override)); - MOCK_METHOD(void, initialise_ui, (), (override)); }; } } \ No newline at end of file diff --git a/trview.app/Windows/Console/Console.cpp b/trview.app/Windows/Console/Console.cpp index 96f73c2f6..6a84e4e60 100644 --- a/trview.app/Windows/Console/Console.cpp +++ b/trview.app/Windows/Console/Console.cpp @@ -17,8 +17,8 @@ namespace trview { } - Console::Console(const std::shared_ptr<IDialogs>& dialogs, const std::weak_ptr<IPlugins>& plugins) - : _dialogs(dialogs), _plugins(plugins) + Console::Console(const std::shared_ptr<IDialogs>& dialogs, const std::weak_ptr<IPlugins>& plugins, const std::shared_ptr<IFonts>& fonts) + : _dialogs(dialogs), _plugins(plugins), _fonts(fonts) { if (auto plugins_ptr = _plugins.lock()) { @@ -59,9 +59,10 @@ namespace trview bool Console::render_console() { bool stay_open = true; - if (_font) + const auto font = _fonts->font("console"); + if (font) { - ImGui::PushFont(_font); + ImGui::PushFont(font); } ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(520, 400)); if (ImGui::Begin(_id.c_str(), &stay_open, ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoNavInputs)) @@ -135,18 +136,13 @@ namespace trview } ImGui::End(); ImGui::PopStyleVar(); - if (_font) + if (font) { ImGui::PopFont(); } return stay_open; } - void Console::set_font(ImFont* font) - { - _font = font; - } - void Console::set_number(int32_t number) { _id = "Console " + std::to_string(number); diff --git a/trview.app/Windows/Console/Console.h b/trview.app/Windows/Console/Console.h index 5119a16c6..c4e668da8 100644 --- a/trview.app/Windows/Console/Console.h +++ b/trview.app/Windows/Console/Console.h @@ -4,6 +4,7 @@ #include "IConsole.h" #include "../../Plugins/IPlugins.h" +#include "../../UI/Fonts/IFonts.h" #include <trview.common/Event.h> #include <trview.common/Windows/IDialogs.h> @@ -20,12 +21,11 @@ namespace trview static const inline std::string input = "##input"; }; - explicit Console(const std::shared_ptr<IDialogs>& dialogs, const std::weak_ptr<IPlugins>& plugins); + explicit Console(const std::shared_ptr<IDialogs>& dialogs, const std::weak_ptr<IPlugins>& plugins, const std::shared_ptr<IFonts>& fonts); virtual ~Console() = default; void render() override; void set_number(int32_t number) override; - void set_font(ImFont* font) override; private: static int callback(ImGuiInputTextCallbackData* data); bool render_console(); @@ -38,7 +38,7 @@ namespace trview std::shared_ptr<IDialogs> _dialogs; bool _need_focus{ false }; bool _go_to_eol{ false }; - ImFont* _font{ nullptr }; + std::shared_ptr<IFonts> _fonts; std::string _id{ "Console 0" }; std::vector<std::string> _recent_files; std::vector<std::string> _command_history; diff --git a/trview.app/Windows/Console/ConsoleManager.cpp b/trview.app/Windows/Console/ConsoleManager.cpp index 27b4f218d..cc1bb4ef7 100644 --- a/trview.app/Windows/Console/ConsoleManager.cpp +++ b/trview.app/Windows/Console/ConsoleManager.cpp @@ -21,7 +21,6 @@ namespace trview std::weak_ptr<IConsole> ConsoleManager::create_window() { auto window = _console_source(); - window->set_font(_font); return add_window(window); } @@ -33,18 +32,4 @@ namespace trview } return {}; } - - void ConsoleManager::initialise_ui() - { - auto context = ImGui::GetCurrentContext(); - if (context) - { - _font = context->IO.Fonts->AddFontFromFileTTF((_files->fonts_directory() + "\\Consola.ttf").c_str(), 14.0f); - } - - for (auto& window : _windows) - { - window.second->set_font(_font); - } - } } diff --git a/trview.app/Windows/Console/ConsoleManager.h b/trview.app/Windows/Console/ConsoleManager.h index 7af3678fe..1c9fd006a 100644 --- a/trview.app/Windows/Console/ConsoleManager.h +++ b/trview.app/Windows/Console/ConsoleManager.h @@ -18,10 +18,8 @@ namespace trview void render() override; std::weak_ptr<IConsole> create_window() override; std::optional<int> process_message(UINT message, WPARAM wParam, LPARAM lParam) override; - void initialise_ui() override; private: IConsole::Source _console_source; std::shared_ptr<IFiles> _files; - ImFont* _font{ nullptr }; }; } diff --git a/trview.app/Windows/Console/IConsole.h b/trview.app/Windows/Console/IConsole.h index 408584acf..098cee4cf 100644 --- a/trview.app/Windows/Console/IConsole.h +++ b/trview.app/Windows/Console/IConsole.h @@ -12,7 +12,6 @@ namespace trview virtual ~IConsole() = 0; virtual void render() = 0; virtual void set_number(int32_t number) = 0; - virtual void set_font(ImFont* font) = 0; Event<> on_window_closed; }; diff --git a/trview.app/Windows/Console/IConsoleManager.h b/trview.app/Windows/Console/IConsoleManager.h index 09421d3c3..a6d543495 100644 --- a/trview.app/Windows/Console/IConsoleManager.h +++ b/trview.app/Windows/Console/IConsoleManager.h @@ -10,6 +10,5 @@ namespace trview virtual ~IConsoleManager() = 0; virtual void render() = 0; virtual std::weak_ptr<IConsole> create_window() = 0; - virtual void initialise_ui() = 0; }; } \ No newline at end of file From e4b21e4b150d9c552b079ebe566dfb31d85e12d9 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Mon, 6 May 2024 14:05:00 +0100 Subject: [PATCH 28/38] Rename to Default and Console fonts --- trview.app/Application.cpp | 8 ++++---- trview.app/Windows/Console/Console.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index 80aaa89ee..1e4e6ea25 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -678,8 +678,8 @@ namespace trview // Setup Platform/Renderer backends _imgui_backend->initialise(); - _fonts->add_font("main", _settings.font); - _fonts->add_font("console", { .name = "Consolas", .filename = "consolas.ttf", .size = 12.0f }); + _fonts->add_font("Default", _settings.font); + _fonts->add_font("Console", { .name = "Consolas", .filename = "consolas.ttf", .size = 12.0f }); } _timer.update(); @@ -695,7 +695,7 @@ namespace trview if (_new_font.has_value()) { - if (_fonts->add_font("main", *_new_font)) + if (_fonts->add_font("Default", *_new_font)) { _settings.font = _new_font.value(); _viewer->set_settings(_settings); @@ -706,7 +706,7 @@ namespace trview _imgui_backend->new_frame(); ImGui::NewFrame(); - ImGui::PushFont(_fonts->font("main")); + ImGui::PushFont(_fonts->font("Default")); _viewer->render_ui(); _items_windows->render(); diff --git a/trview.app/Windows/Console/Console.cpp b/trview.app/Windows/Console/Console.cpp index 6a84e4e60..1df40dea7 100644 --- a/trview.app/Windows/Console/Console.cpp +++ b/trview.app/Windows/Console/Console.cpp @@ -59,7 +59,7 @@ namespace trview bool Console::render_console() { bool stay_open = true; - const auto font = _fonts->font("console"); + const auto font = _fonts->font("Console"); if (font) { ImGui::PushFont(font); From e173891e3688c9d20b23279ac8897f40563dbeae Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 02:10:54 +0100 Subject: [PATCH 29/38] Allow setting mutliple fonts Also fix icon alignment #970 --- trview.app.tests/ApplicationTests.cpp | 1 - .../Windows/ConsoleManagerTests.cpp | 13 +---- trview.app.ui.tests/ConsoleTests.cpp | 11 ++-- trview.app/Application.cpp | 12 +++-- trview.app/Application.h | 2 +- trview.app/Mocks/UI/IFonts.h | 1 + trview.app/Mocks/UI/ISettingsWindow.h | 1 - trview.app/Settings/FontSetting.h | 2 +- trview.app/Settings/SettingsLoader.cpp | 6 +-- trview.app/Settings/UserSettings.h | 6 ++- trview.app/UI/Fonts/Fonts.cpp | 10 +++- trview.app/UI/Fonts/Fonts.h | 1 + trview.app/UI/Fonts/IFonts.h | 5 ++ trview.app/UI/ISettingsWindow.h | 3 +- trview.app/UI/IViewerUI.h | 2 +- trview.app/UI/LevelInfo.cpp | 4 +- trview.app/UI/SettingsWindow.cpp | 53 ++++++++++++------- trview.app/UI/SettingsWindow.h | 2 - trview.app/UI/ViewerUI.cpp | 1 - trview.app/Windows/IViewer.h | 2 +- 20 files changed, 80 insertions(+), 58 deletions(-) diff --git a/trview.app.tests/ApplicationTests.cpp b/trview.app.tests/ApplicationTests.cpp index 913c5c4bf..bd657a4c3 100644 --- a/trview.app.tests/ApplicationTests.cpp +++ b/trview.app.tests/ApplicationTests.cpp @@ -550,7 +550,6 @@ TEST(Application, WindowManagersAndViewerRendered) EXPECT_CALL(camera_sink_window_manager, render).Times(1); auto [console_manager_ptr, console_manager] = create_mock<MockConsoleManager>(); EXPECT_CALL(console_manager, render).Times(1); - EXPECT_CALL(console_manager, initialise_ui).Times(1); auto [plugins_window_manager_ptr, plugins_window_manager] = create_mock<MockPluginsWindowManager>(); EXPECT_CALL(plugins_window_manager, render).Times(1); auto plugins = mock_shared<MockPlugins>(); diff --git a/trview.app.tests/Windows/ConsoleManagerTests.cpp b/trview.app.tests/Windows/ConsoleManagerTests.cpp index fd03f250a..1400cd886 100644 --- a/trview.app.tests/Windows/ConsoleManagerTests.cpp +++ b/trview.app.tests/Windows/ConsoleManagerTests.cpp @@ -60,21 +60,12 @@ TEST(ConsoleManager, CreateConsoleKeyboardShortcut) auto manager = register_test_module().with_shortcuts(shortcuts).build(); } -TEST(ConsoleManager, InitialiseUiForwarded) -{ - auto window = mock_shared<MockConsole>(); - EXPECT_CALL(*window, set_font).Times(2); - auto manager = register_test_module().with_window_source([&]() { return window; }).build(); - manager->create_window(); - manager->initialise_ui(); -} - TEST(ConsoleManager, CreatedWindow) { auto window = mock_shared<MockConsole>(); - EXPECT_CALL(*window, set_font).Times(1); auto manager = register_test_module().with_window_source([&]() { return window; }).build(); - manager->create_window(); + auto result = manager->create_window(); + ASSERT_EQ(result.lock(), window); } TEST(ConsoleManager, CreateWindowSetsNumber) diff --git a/trview.app.ui.tests/ConsoleTests.cpp b/trview.app.ui.tests/ConsoleTests.cpp index f5896f508..a1047fccd 100644 --- a/trview.app.ui.tests/ConsoleTests.cpp +++ b/trview.app.ui.tests/ConsoleTests.cpp @@ -5,6 +5,7 @@ #include <trview.app/Windows/Console/Console.h> #include <trview.app/Mocks/Plugins/IPlugins.h> #include <trview.app/Mocks/Plugins/IPlugin.h> +#include <trview.app/Mocks/UI/IFonts.h> #include <trview.common/Mocks/Windows/IDialogs.h> using namespace testing; @@ -42,7 +43,7 @@ void register_console_tests(ImGuiTestEngine* engine) EXPECT_CALL(*plugin, clear_messages).Times(1); ON_CALL(*plugins, plugins).WillByDefault(testing::Return(std::vector<std::weak_ptr<IPlugin>>{ plugin })); - context.ptr = std::make_shared<Console>(mock_shared<MockDialogs>(), plugins); + context.ptr = std::make_shared<Console>(mock_shared<MockDialogs>(), plugins, mock_shared<MockFonts>()); ctx->Yield(); IM_CHECK_STR_EQ(ItemText(ctx, ctx->ItemInfo("/Console 0/TabBar/Default/##Log")->ID).c_str(), "Hello"); @@ -63,7 +64,7 @@ void register_console_tests(ImGuiTestEngine* engine) ON_CALL(*plugin, name).WillByDefault(testing::Return("Default")); EXPECT_CALL(*plugin, execute("Test command")).Times(1); ON_CALL(*plugins, plugins).WillByDefault(testing::Return(std::vector<std::weak_ptr<IPlugin>>{ plugin })); - context.ptr = std::make_shared<Console>(mock_shared<MockDialogs>(), plugins); + context.ptr = std::make_shared<Console>(mock_shared<MockDialogs>(), plugins, mock_shared<MockFonts>()); ctx->ItemInputValue("/Console 0/TabBar/Default/##input", "Test command"); @@ -80,7 +81,7 @@ void register_console_tests(ImGuiTestEngine* engine) ON_CALL(*plugin, name).WillByDefault(testing::Return("Default")); EXPECT_CALL(*plugin, execute("Test command")).Times(2); ON_CALL(*plugins, plugins).WillByDefault(testing::Return(std::vector<std::weak_ptr<IPlugin>>{ plugin })); - context.ptr = std::make_shared<Console>(mock_shared<MockDialogs>(), plugins); + context.ptr = std::make_shared<Console>(mock_shared<MockDialogs>(), plugins, mock_shared<MockFonts>()); ctx->ItemInputValue("/Console 0/TabBar/Default/##input", "Test command"); ctx->KeyPress(ImGuiKey_UpArrow); @@ -102,7 +103,7 @@ void register_console_tests(ImGuiTestEngine* engine) ON_CALL(*plugins, plugins).WillByDefault(testing::Return(std::vector<std::weak_ptr<IPlugin>>{ plugin })); auto dialogs = mock_shared<MockDialogs>(); ON_CALL(*dialogs, open_file).WillByDefault(testing::Return(IDialogs::FileResult{ "test.lua" })); - context.ptr = std::make_shared<Console>(dialogs, plugins); + context.ptr = std::make_shared<Console>(dialogs, plugins, mock_shared<MockFonts>()); ctx->ItemClick("/Console 0/##menubar/File"); ctx->ItemClick("/##Menu_00/Open"); @@ -121,7 +122,7 @@ void register_console_tests(ImGuiTestEngine* engine) ON_CALL(*plugins, plugins).WillByDefault(testing::Return(std::vector<std::weak_ptr<IPlugin>>{ plugin })); auto dialogs = mock_shared<MockDialogs>(); ON_CALL(*dialogs, open_file).WillByDefault(testing::Return(IDialogs::FileResult{ "test.lua" })); - context.ptr = std::make_shared<Console>(dialogs, plugins); + context.ptr = std::make_shared<Console>(dialogs, plugins, mock_shared<MockFonts>()); ctx->ItemClick("/Console 0/##menubar/File"); ctx->ItemClick("/##Menu_00/Open"); diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index 1e4e6ea25..51740cac7 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -279,7 +279,7 @@ namespace trview _level->set_map_colours(settings.map_colours); } }; - _token_store += _viewer->on_font += [this](auto&& font) { _new_font = font; }; + _token_store += _viewer->on_font += [this](auto&& name, auto&& font) { _new_font = { name, font }; }; _viewer->set_settings(_settings); @@ -678,8 +678,10 @@ namespace trview // Setup Platform/Renderer backends _imgui_backend->initialise(); - _fonts->add_font("Default", _settings.font); - _fonts->add_font("Console", { .name = "Consolas", .filename = "consolas.ttf", .size = 12.0f }); + for (const auto& font : _settings.fonts) + { + _fonts->add_font(font.first, font.second); + } } _timer.update(); @@ -695,9 +697,9 @@ namespace trview if (_new_font.has_value()) { - if (_fonts->add_font("Default", *_new_font)) + if (_fonts->add_font(_new_font->first, _new_font->second)) { - _settings.font = _new_font.value(); + _settings.fonts[_new_font->first] = _new_font->second; _viewer->set_settings(_settings); } _new_font.reset(); diff --git a/trview.app/Application.h b/trview.app/Application.h index ecc903b4c..76daa3e48 100644 --- a/trview.app/Application.h +++ b/trview.app/Application.h @@ -168,7 +168,7 @@ namespace trview std::unique_ptr<IRoomsWindowManager> _rooms_windows; std::unique_ptr<ILightsWindowManager> _lights_windows; Timer _timer; - std::optional<FontSetting> _new_font; + std::optional<std::pair<std::string, FontSetting>> _new_font; std::shared_ptr<IImGuiBackend> _imgui_backend; std::string _imgui_ini_filename; diff --git a/trview.app/Mocks/UI/IFonts.h b/trview.app/Mocks/UI/IFonts.h index bbc678aa6..fb7fbc7bd 100644 --- a/trview.app/Mocks/UI/IFonts.h +++ b/trview.app/Mocks/UI/IFonts.h @@ -13,6 +13,7 @@ namespace trview MOCK_METHOD(std::vector<FontSetting>, list_fonts, (), (const, override)); MOCK_METHOD(ImFont*, add_font, (const std::string&, const FontSetting&), (override)); MOCK_METHOD(ImFont*, font, (const std::string&), (const, override)); + MOCK_METHOD((std::unordered_map<std::string, FontSetting>), fonts, (), (const, override)); }; } } diff --git a/trview.app/Mocks/UI/ISettingsWindow.h b/trview.app/Mocks/UI/ISettingsWindow.h index 9f1d2e0b0..ed56f8358 100644 --- a/trview.app/Mocks/UI/ISettingsWindow.h +++ b/trview.app/Mocks/UI/ISettingsWindow.h @@ -35,7 +35,6 @@ namespace trview MOCK_METHOD(void, set_fov, (float), (override)); MOCK_METHOD(void, set_camera_sink_startup, (bool), (override)); MOCK_METHOD(void, set_plugin_directories, (const std::vector<std::string>&), (override)); - MOCK_METHOD(void, set_font, (const FontSetting&), (override)); }; } } diff --git a/trview.app/Settings/FontSetting.h b/trview.app/Settings/FontSetting.h index dbf630bc4..87e11b679 100644 --- a/trview.app/Settings/FontSetting.h +++ b/trview.app/Settings/FontSetting.h @@ -8,6 +8,6 @@ namespace trview { std::string name; std::string filename; - float size; + int size; }; } \ No newline at end of file diff --git a/trview.app/Settings/SettingsLoader.cpp b/trview.app/Settings/SettingsLoader.cpp index b3d670292..a63e4767c 100644 --- a/trview.app/Settings/SettingsLoader.cpp +++ b/trview.app/Settings/SettingsLoader.cpp @@ -56,7 +56,7 @@ namespace trview { setting.name = read_attribute<std::string>(json, "name"); setting.filename = read_attribute<std::string>(json, "filename"); - setting.size = read_attribute<float>(json, "size"); + setting.size = read_attribute<int>(json, "size"); } SettingsLoader::SettingsLoader(const std::shared_ptr<IFiles>& files) @@ -104,7 +104,7 @@ namespace trview read_attribute(json, settings.window_placement, "window_placement"); read_attribute(json, settings.plugin_directories, "plugin_directories"); read_attribute(json, settings.toggles, "toggles"); - read_attribute(json, settings.font, "font"); + read_attribute(json, settings.fonts, "fonts"); settings.recent_files.resize(std::min<std::size_t>(settings.recent_files.size(), settings.max_recent_files)); } @@ -171,7 +171,7 @@ namespace trview } json["plugin_directories"] = settings.plugin_directories; json["toggles"] = settings.toggles; - json["font"] = settings.font; + json["fonts"] = settings.fonts; _files->save_file(file_path, json.dump()); } catch (...) diff --git a/trview.app/Settings/UserSettings.h b/trview.app/Settings/UserSettings.h index 90c466825..348e1ee71 100644 --- a/trview.app/Settings/UserSettings.h +++ b/trview.app/Settings/UserSettings.h @@ -58,7 +58,11 @@ namespace trview float fov{ 45 }; std::vector<std::string> plugin_directories; std::unordered_map<std::string, bool> toggles; - FontSetting font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; + std::unordered_map<std::string, FontSetting> fonts + { + { "Default", {.name = "Arial", .filename = "arial.ttf", .size = 12 } }, + { "Console", {.name = "Consolas", .filename = "consola.ttf", .size = 12 } } + }; bool operator==(const UserSettings& other) const; }; diff --git a/trview.app/UI/Fonts/Fonts.cpp b/trview.app/UI/Fonts/Fonts.cpp index c34d4c32c..656420abe 100644 --- a/trview.app/UI/Fonts/Fonts.cpp +++ b/trview.app/UI/Fonts/Fonts.cpp @@ -1,5 +1,6 @@ #include "Fonts.h" #include <format> +#include <ranges> namespace trview { @@ -102,13 +103,20 @@ namespace trview return found == _fonts.end() ? nullptr : found->second.font; } + std::unordered_map<std::string, FontSetting> Fonts::fonts() const + { + return _fonts | + std::views::transform([](auto&& f) -> std::pair<std::string, FontSetting> { return { f.first, f.second.setting }; }) | + std::ranges::to<std::unordered_map>(); + } + ImFont* Fonts::add_font(const FontSetting& setting) { const std::string font_path = setting.filename.contains('\\') ? setting.filename : std::format("{}\\{}", _files->fonts_directory(), setting.filename); ImGuiIO& io = ImGui::GetIO(); - return io.Fonts->AddFontFromFileTTF(font_path.c_str(), setting.size); + return io.Fonts->AddFontFromFileTTF(font_path.c_str(), static_cast<float>(setting.size)); } void Fonts::rebuild_fonts() diff --git a/trview.app/UI/Fonts/Fonts.h b/trview.app/UI/Fonts/Fonts.h index b4b0bffaf..f64d2a010 100644 --- a/trview.app/UI/Fonts/Fonts.h +++ b/trview.app/UI/Fonts/Fonts.h @@ -17,6 +17,7 @@ namespace trview std::vector<FontSetting> list_fonts() const override; ImFont* add_font(const std::string& name, const FontSetting& setting) override; ImFont* font(const std::string& name) const override; + std::unordered_map<std::string, FontSetting> fonts() const override; private: ImFont* add_font(const FontSetting& setting); void rebuild_fonts(); diff --git a/trview.app/UI/Fonts/IFonts.h b/trview.app/UI/Fonts/IFonts.h index e9c707858..45bc4ac14 100644 --- a/trview.app/UI/Fonts/IFonts.h +++ b/trview.app/UI/Fonts/IFonts.h @@ -20,5 +20,10 @@ namespace trview /// </summary> virtual ImFont* add_font(const std::string& name, const FontSetting& setting) = 0; virtual ImFont* font(const std::string& name) const = 0; + /// <summary> + /// Get all loaded fonts. + /// </summary> + /// <returns></returns> + virtual std::unordered_map<std::string, FontSetting> fonts() const = 0; }; } diff --git a/trview.app/UI/ISettingsWindow.h b/trview.app/UI/ISettingsWindow.h index f47291eaf..c6fa9a632 100644 --- a/trview.app/UI/ISettingsWindow.h +++ b/trview.app/UI/ISettingsWindow.h @@ -80,7 +80,7 @@ namespace trview Event<float> on_camera_fov; Event<bool> on_camera_sink_startup; Event<std::vector<std::string>> on_plugin_directories; - Event<FontSetting> on_font; + Event<std::string, FontSetting> on_font; virtual void render() = 0; /// <summary> @@ -179,7 +179,6 @@ namespace trview virtual void set_fov(float value) = 0; virtual void set_camera_sink_startup(bool value) = 0; virtual void set_plugin_directories(const std::vector<std::string>& directories) = 0; - virtual void set_font(const FontSetting& font) = 0; /// <summary> /// Toggle the visibility of the settings window. /// </summary> diff --git a/trview.app/UI/IViewerUI.h b/trview.app/UI/IViewerUI.h index ef3a60a63..4c118c8a2 100644 --- a/trview.app/UI/IViewerUI.h +++ b/trview.app/UI/IViewerUI.h @@ -106,7 +106,7 @@ namespace trview Event<std::weak_ptr<ITrigger>> on_select_trigger; - Event<FontSetting> on_font; + Event<std::string, FontSetting> on_font; /// Render the UI. virtual void render() = 0; diff --git a/trview.app/UI/LevelInfo.cpp b/trview.app/UI/LevelInfo.cpp index 4cd169ab1..e3386f913 100644 --- a/trview.app/UI/LevelInfo.cpp +++ b/trview.app/UI/LevelInfo.cpp @@ -31,10 +31,10 @@ namespace trview if (ImGui::Begin("LevelInfo", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::Image(get_version_image(_version).view().Get(), ImVec2(16, 16)); - ImGui::SameLine(); const float previous = ImGui::GetCursorPosY(); ImGui::SetCursorPosY(ImGui::GetWindowHeight() * 0.5f - ImGui::CalcTextSize(_name.c_str()).y * 0.5f); + ImGui::Image(get_version_image(_version).view().Get(), ImVec2(16, 16)); + ImGui::SameLine(); ImGui::Text(_name.c_str()); ImGui::SameLine(); ImGui::SetCursorPosY(previous); diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index defb39be0..cc1cd0a0b 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -52,26 +52,46 @@ namespace trview on_background_colour(Colour(1.0f, _colour[0], _colour[1], _colour[2])); } - if (ImGui::BeginCombo("Font", _selected_font.name.c_str())) + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Fonts")) + { + if (ImGui::BeginTable("Fonts List", 3, ImGuiTableFlags_SizingFixedFit)) { - for (const auto& f : _all_fonts) + for (const auto font : _fonts->fonts()) { - bool is_selected = _selected_font.name == f.name; - if (ImGui::Selectable(f.name.c_str(), is_selected)) + ImGui::TableNextRow(); + + ImGui::TableNextColumn(); + ImGui::Text(font.first.c_str()); + ImGui::TableNextColumn(); + if (ImGui::BeginCombo(std::format("##{}", font.first).c_str(), font.second.name.c_str(), ImGuiComboFlags_WidthFitPreview)) { - _selected_font.name = f.name; - _selected_font.filename = f.filename; - on_font(_selected_font); + for (const auto& f : _all_fonts) + { + bool is_selected = font.second.name == f.name; + if (ImGui::Selectable(f.name.c_str(), is_selected)) + { + auto selected = font.second; + selected.name = f.name; + selected.filename = f.filename; + on_font(font.first, selected); + } + } + ImGui::EndCombo(); + } + ImGui::TableNextColumn(); + int size = font.second.size; + if (ImGui::InputInt(std::format("Font Size##{}", font.first).c_str(), &size, 1, 1, ImGuiInputTextFlags_EnterReturnsTrue)) + { + auto selected = font.second; + selected.size = size; + on_font(font.first, selected); } } - ImGui::EndCombo(); - } - - if (ImGui::InputFloat("Font Size", &_selected_font.size, 1.0f, 0.0f, "%.3f", ImGuiInputTextFlags_EnterReturnsTrue)) - { - on_font(_selected_font); + ImGui::EndTable(); } - ImGui::EndTabItem(); } @@ -349,9 +369,4 @@ namespace trview { _plugin_directories = directories; } - - void SettingsWindow::set_font(const FontSetting& font) - { - _selected_font = font; - } } diff --git a/trview.app/UI/SettingsWindow.h b/trview.app/UI/SettingsWindow.h index f12727438..fe0cd7a8e 100644 --- a/trview.app/UI/SettingsWindow.h +++ b/trview.app/UI/SettingsWindow.h @@ -68,7 +68,6 @@ namespace trview virtual void set_fov(float value) override; virtual void set_camera_sink_startup(bool value) override; void set_plugin_directories(const std::vector<std::string>& directories) override; - void set_font(const FontSetting& font) override; private: std::shared_ptr<IDialogs> _dialogs; std::shared_ptr<IShell> _shell; @@ -96,7 +95,6 @@ namespace trview float _fov{ 45 }; bool _camera_sink_startup{ false }; std::vector<std::string> _plugin_directories; - FontSetting _selected_font{ .name = "Arial", .filename = "arial.ttf", .size = 12.0f }; std::vector<FontSetting> _all_fonts; std::shared_ptr<IFonts> _fonts; }; diff --git a/trview.app/UI/ViewerUI.cpp b/trview.app/UI/ViewerUI.cpp index 964c4d6fa..7a04f3ff3 100644 --- a/trview.app/UI/ViewerUI.cpp +++ b/trview.app/UI/ViewerUI.cpp @@ -390,7 +390,6 @@ namespace trview _settings_window->set_fov(settings.fov); _settings_window->set_camera_sink_startup(settings.camera_sink_startup); _settings_window->set_plugin_directories(settings.plugin_directories); - _settings_window->set_font(settings.font); _camera_position->set_display_degrees(settings.camera_display_degrees); _map_renderer->set_colours(settings.map_colours); for (const auto& toggle : settings.toggles) diff --git a/trview.app/Windows/IViewer.h b/trview.app/Windows/IViewer.h index 4b18b1be5..eef07e280 100644 --- a/trview.app/Windows/IViewer.h +++ b/trview.app/Windows/IViewer.h @@ -80,7 +80,7 @@ namespace trview Event<std::weak_ptr<ICameraSink>> on_camera_sink_selected; - Event<FontSetting> on_font; + Event<std::string, FontSetting> on_font; virtual CameraMode camera_mode() const = 0; From efb62fd8285c5da11e03819ffaf65da2b24da21c Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 02:24:45 +0100 Subject: [PATCH 30/38] Alignment --- trview.app/UI/LevelInfo.cpp | 6 ++++-- trview.app/UI/SettingsWindow.cpp | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/trview.app/UI/LevelInfo.cpp b/trview.app/UI/LevelInfo.cpp index e3386f913..34956d511 100644 --- a/trview.app/UI/LevelInfo.cpp +++ b/trview.app/UI/LevelInfo.cpp @@ -32,9 +32,11 @@ namespace trview if (ImGui::Begin("LevelInfo", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize)) { const float previous = ImGui::GetCursorPosY(); - ImGui::SetCursorPosY(ImGui::GetWindowHeight() * 0.5f - ImGui::CalcTextSize(_name.c_str()).y * 0.5f); - ImGui::Image(get_version_image(_version).view().Get(), ImVec2(16, 16)); + const float text_size = ImGui::CalcTextSize(_name.c_str()).y; + ImGui::SetCursorPosY(ImGui::GetWindowHeight() * 0.5f - text_size * 0.5f); + ImGui::Image(get_version_image(_version).view().Get(), ImVec2(text_size, text_size)); ImGui::SameLine(); + ImGui::SetCursorPosY(ImGui::GetWindowHeight() * 0.5f - text_size * 0.5f); ImGui::Text(_name.c_str()); ImGui::SameLine(); ImGui::SetCursorPosY(previous); diff --git a/trview.app/UI/SettingsWindow.cpp b/trview.app/UI/SettingsWindow.cpp index cc1cd0a0b..09f56a43f 100644 --- a/trview.app/UI/SettingsWindow.cpp +++ b/trview.app/UI/SettingsWindow.cpp @@ -64,6 +64,7 @@ namespace trview ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text(font.first.c_str()); ImGui::TableNextColumn(); if (ImGui::BeginCombo(std::format("##{}", font.first).c_str(), font.second.name.c_str(), ImGuiComboFlags_WidthFitPreview)) From 70e82c8d291491953ff40411fe58120ad877596c Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 10:39:56 +0100 Subject: [PATCH 31/38] Default fonts button #970 --- trview.app/Application.cpp | 12 ++++++++++++ trview.app/Resources/resource.h | 1 + trview.app/Resources/trview.app.rc | 1 + 3 files changed, 14 insertions(+) diff --git a/trview.app/Application.cpp b/trview.app/Application.cpp index 51740cac7..d55df8cb4 100644 --- a/trview.app/Application.cpp +++ b/trview.app/Application.cpp @@ -28,6 +28,12 @@ namespace trview } return (INT_PTR)FALSE; } + + void load_default_fonts(IFonts& fonts) + { + fonts.add_font("Default", { .name = "Arial", .filename = "arial.ttf", .size = 12 }); + fonts.add_font("Console", { .name = "Consolas", .filename = "consola.ttf", .size = 12 }); + } } IApplication::~IApplication() @@ -176,6 +182,12 @@ namespace trview _imgui_backend->reset_layout(); break; } + case ID_WINDOWS_RESET_FONTS: + { + load_default_fonts(*_fonts); + _settings.fonts = _fonts->fonts(); + break; + } } break; } diff --git a/trview.app/Resources/resource.h b/trview.app/Resources/resource.h index d167e8aeb..4cc8c6286 100644 --- a/trview.app/Resources/resource.h +++ b/trview.app/Resources/resource.h @@ -47,6 +47,7 @@ #define ID_WINDOWS_CAMERA_SINK 33023 #define ID_WINDOWS_CONSOLE 33024 #define ID_WINDOWS_PLUGINS 33025 +#define ID_WINDOWS_RESET_FONTS 33026 // Next default values for new objects // diff --git a/trview.app/Resources/trview.app.rc b/trview.app/Resources/trview.app.rc index c4b11bbd7..dee1e59d5 100644 --- a/trview.app/Resources/trview.app.rc +++ b/trview.app/Resources/trview.app.rc @@ -77,6 +77,7 @@ BEGIN MENUITEM "Plugins\tCtrl+P" ID_WINDOWS_PLUGINS MENUITEM SEPARATOR MENUITEM "Reset Layout" ID_WINDOWS_RESET_LAYOUT + MENUITEM "Reset Fonts" ID_WINDOWS_RESET_FONTS END POPUP "&Help" BEGIN From c92a9752733adfb1f337bb886ad3ef22e1d35072 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 11:36:08 +0100 Subject: [PATCH 32/38] Remove vcpkg files --- trview/vcpkg-configuration.json | 14 -------------- trview/vcpkg.json | 3 --- 2 files changed, 17 deletions(-) delete mode 100644 trview/vcpkg-configuration.json delete mode 100644 trview/vcpkg.json diff --git a/trview/vcpkg-configuration.json b/trview/vcpkg-configuration.json deleted file mode 100644 index c540ec736..000000000 --- a/trview/vcpkg-configuration.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "default-registry": { - "kind": "git", - "baseline": "000d1bda1ffa95a73e0b40334fa4103d6f4d3d48", - "repository": "https://github.com/microsoft/vcpkg" - }, - "registries": [ - { - "kind": "artifact", - "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip", - "name": "microsoft" - } - ] -} diff --git a/trview/vcpkg.json b/trview/vcpkg.json deleted file mode 100644 index de021811d..000000000 --- a/trview/vcpkg.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dependencies": [ "freetype"] -} From 845b22b31f27cb99e155aeaacbdd31b1016a0aa6 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 17:24:57 +0100 Subject: [PATCH 33/38] Add test for reset fonts menu option #970 --- trview.app.tests/ApplicationTests.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/trview.app.tests/ApplicationTests.cpp b/trview.app.tests/ApplicationTests.cpp index bd657a4c3..37ba24820 100644 --- a/trview.app.tests/ApplicationTests.cpp +++ b/trview.app.tests/ApplicationTests.cpp @@ -236,6 +236,12 @@ namespace this->plugins_window_manager = std::move(plugins_window_manager); return *this; } + + test_module& with_fonts(std::shared_ptr<IFonts> fonts) + { + this->fonts = fonts; + return *this; + } }; return test_module{}; } @@ -613,6 +619,25 @@ TEST(Application, MapColoursSetOnSettingsChanged) viewer.on_settings(UserSettings()); } +TEST(Application, ResetFonts) +{ + auto fonts = mock_shared<MockFonts>(); + EXPECT_CALL(*fonts, add_font(std::string("Console"), + testing::AllOf(testing::Field(&FontSetting::name, testing::Eq("Consolas")), + testing::Field(&FontSetting::filename, testing::Eq("consola.ttf")), + testing::Field(&FontSetting::size, testing::Eq(12))))); + EXPECT_CALL(*fonts, add_font(std::string("Default"), + testing::AllOf(testing::Field(&FontSetting::name, testing::Eq("Arial")), + testing::Field(&FontSetting::filename, testing::Eq("arial.ttf")), + testing::Field(&FontSetting::size, testing::Eq(12))))); + + auto application = register_test_module() + .with_fonts(fonts) + .build(); + + application->process_message(WM_COMMAND, MAKEWPARAM(ID_WINDOWS_RESET_FONTS, 0), 0); +} + TEST(Application, ResetLayout) { auto imgui_backend = mock_shared<MockImGuiBackend>(); From d77b4b159f1fa2fe463d9181c02cfd99762f3dd1 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 18:39:23 +0100 Subject: [PATCH 34/38] Update the about box #970 --- trview.app/Resources/trview.app.rc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/trview.app/Resources/trview.app.rc b/trview.app/Resources/trview.app.rc index dee1e59d5..65790aa9f 100644 --- a/trview.app/Resources/trview.app.rc +++ b/trview.app/Resources/trview.app.rc @@ -105,7 +105,7 @@ END // Dialog // -IDD_ABOUTBOX DIALOGEX 0, 0, 220, 130 +IDD_ABOUTBOX DIALOGEX 0, 0, 220, 160 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About trview" FONT 8, "MS Shell Dlg", 0, 0, 0x1 @@ -118,9 +118,11 @@ Uses DirectXTK (MIT)\r\n\ Uses zlib (zlib)\r\n\ Uses nlohmann/json (MIT)\r\n\ Uses Dear ImGui (MIT)\r\n\ -Based on the information in TRosettaStone3 - https://github.com/opentomb/TRosettaStone3\ -\r\n\r\n",IDC_STATIC,42,38,200,70 - DEFPUSHBUTTON "OK", IDOK, 134, 108, 50, 14, WS_GROUP +Based on the information in TRosettaStone3 - https://github.com/opentomb/TRosettaStone3\r\n",IDC_STATIC,42,38,200,150 + LTEXT "Portions of this software are copyright © 2023\r\n\ +The FreeType Project (www.freetype.org). All rights reserved.\ +\r\n\r\n",IDC_STATIC,42,100,200,50 + DEFPUSHBUTTON "OK", IDOK, 134, 140, 50, 14, WS_GROUP END From 2dbcd068f42370bc478bacf404d1a3f65941b12c Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Wed, 8 May 2024 22:36:38 +0100 Subject: [PATCH 35/38] Add a test for settings loader #970 --- .../Settings/SettingsLoaderTests.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/trview.app.tests/Settings/SettingsLoaderTests.cpp b/trview.app.tests/Settings/SettingsLoaderTests.cpp index 5ea4804f9..8c917bc45 100644 --- a/trview.app.tests/Settings/SettingsLoaderTests.cpp +++ b/trview.app.tests/Settings/SettingsLoaderTests.cpp @@ -710,3 +710,25 @@ TEST(SettingsLoader, TogglesLoaded) const std::unordered_map<std::string, bool> expected{ { "test1", false }, { "test2", true } }; ASSERT_EQ(settings.toggles, expected); } + +TEST(SettingsLoader, FontsLoaded) +{ + auto loader = setup_setting("{\"fonts\":{\"Default\":{\"name\":\"Tahoma\",\"filename\":\"tahoma.ttf\",\"size\":10}}}"); + auto settings = loader->load_user_settings(); + auto def = settings.fonts.find("Default"); + ASSERT_TRUE(def != settings.fonts.end()); + ASSERT_EQ(def->first, "Default"); + ASSERT_EQ(def->second.name, "Tahoma"); + ASSERT_EQ(def->second.filename, "tahoma.ttf"); + ASSERT_EQ(def->second.size, 10); +} + +TEST(SettingsLoader, FontsSaved) +{ + std::string output; + auto loader = setup_save_setting(output); + UserSettings settings; + settings.fonts = { { "Default", {.name = "Tahoma", .filename = "tahoma.ttf", .size = 10 } } }; + loader->save_user_settings(settings); + EXPECT_THAT(output, HasSubstr("\"fonts\":{\"Default\":{\"filename\":\"tahoma.ttf\",\"name\":\"Tahoma\",\"size\":10}}")); +} From da59ef85ab47b4f6053233541e8f6dbbe80e0e85 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Thu, 9 May 2024 12:44:09 +0100 Subject: [PATCH 36/38] Update stdafx.h --- trview/stdafx.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/trview/stdafx.h b/trview/stdafx.h index f350575fc..98790f6cb 100644 --- a/trview/stdafx.h +++ b/trview/stdafx.h @@ -9,8 +9,4 @@ #define NOMINMAX #define WIN32_LEAN_AND_MEAN -#include <windows.h> - -#define IMGUI_DEFINE_MATH_OPERATORS -#include <external/imgui/imgui.h> -#include <external/imgui/imstb_truetype.h> \ No newline at end of file +#include <windows.h> \ No newline at end of file From ac61cc7b9a80fd948adbf308d52982354604c8d0 Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Thu, 9 May 2024 14:11:45 +0100 Subject: [PATCH 37/38] More tests --- trview.app.tests/UI/ViewerUITests.cpp | 19 +++ trview.app.tests/Windows/ViewerTests.cpp | 17 +++ trview.app.ui.tests/SettingsWindowTests.cpp | 139 +++++++++++++------- 3 files changed, 129 insertions(+), 46 deletions(-) diff --git a/trview.app.tests/UI/ViewerUITests.cpp b/trview.app.tests/UI/ViewerUITests.cpp index 42cbc9b5f..98fe856af 100644 --- a/trview.app.tests/UI/ViewerUITests.cpp +++ b/trview.app.tests/UI/ViewerUITests.cpp @@ -478,3 +478,22 @@ TEST(ViewerUI, SetPluginDirectoriesUpdatesSettingsWindow) ui->set_settings(settings); } + +TEST(ViewerUI, FontForwarded) +{ + auto [settings_window_ptr, settings_window] = create_mock<MockSettingsWindow>(); + auto ui = register_test_module().with_settings_window(std::move(settings_window_ptr)).build(); + + std::optional<std::pair<std::string, FontSetting>> raised; + auto token = ui->on_font += [&](auto&& key, auto&& value) { raised = { key, value }; }; + + settings_window.on_font("test", { .name = "Test", .filename = "test.ttf", .size = 100 }); + + ASSERT_EQ(raised.has_value(), true); + ASSERT_EQ(raised->first, "test"); + ASSERT_EQ(raised->second.name, "Test"); + ASSERT_EQ(raised->second.filename, "test.ttf"); + ASSERT_EQ(raised->second.size, 100); +} + + diff --git a/trview.app.tests/Windows/ViewerTests.cpp b/trview.app.tests/Windows/ViewerTests.cpp index 14df5777e..c23b4c953 100644 --- a/trview.app.tests/Windows/ViewerTests.cpp +++ b/trview.app.tests/Windows/ViewerTests.cpp @@ -1082,3 +1082,20 @@ TEST(Viewer, SectorHighlightForwarded) auto sector = mock_shared<MockSector>()->with_room(room); ui.on_sector_hover(sector); } + +TEST(Viewer, FontForwarded) +{ + auto [ui_ptr, ui] = create_mock<MockViewerUI>(); + auto viewer = register_test_module().with_ui(std::move(ui_ptr)).build(); + + std::optional<std::pair<std::string, FontSetting>> raised; + auto token = viewer->on_font += [&](auto&& key, auto&& value) { raised = { key, value }; }; + + ui.on_font("test", { .name = "Test", .filename = "test.ttf", .size = 100 }); + + ASSERT_EQ(raised.has_value(), true); + ASSERT_EQ(raised->first, "test"); + ASSERT_EQ(raised->second.name, "Test"); + ASSERT_EQ(raised->second.filename, "test.ttf"); + ASSERT_EQ(raised->second.size, 100); +} diff --git a/trview.app.ui.tests/SettingsWindowTests.cpp b/trview.app.ui.tests/SettingsWindowTests.cpp index 5d53a8f25..4fa6e76ab 100644 --- a/trview.app.ui.tests/SettingsWindowTests.cpp +++ b/trview.app.ui.tests/SettingsWindowTests.cpp @@ -39,6 +39,12 @@ namespace this->shell = shell; return *this; } + + test_module& with_fonts(const std::shared_ptr<IFonts>& fonts) + { + this->fonts = fonts; + return *this; + } }; return test_module{}; @@ -55,7 +61,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) auto dialogs = mock_shared<MockDialogs>(); ON_CALL(*dialogs, open_folder).WillByDefault(Return("test")); - controls.ptr = register_test_module().with_dialogs(dialogs).build();; + controls.ptr = register_test_module().with_dialogs(dialogs).build(); std::optional<std::vector<std::string>> raised; auto token = controls.ptr->on_plugin_directories += [&](const auto& value) @@ -74,12 +80,53 @@ void register_settings_window_tests(ImGuiTestEngine* engine) IM_CHECK_EQ(raised.value(), expected); }); + test<MockWrapper<SettingsWindow>>(engine, "Settings Window", "Changing Font Raises Event", + [](ImGuiTestContext* ctx) { render(ctx->GetVars<MockWrapper<SettingsWindow>>()); }, + [](ImGuiTestContext* ctx) + { + const std::vector<FontSetting> available_fonts + { + {.name = "name", .filename = "filename", .size = 12 }, + {.name = "name2", .filename = "filename2", .size = 13 } + }; + + const std::unordered_map<std::string, FontSetting> registered_fonts + { + { "Default", { .name = "name", .filename = "filename", .size = 12 } }, + { "Console", { .name = "name2", .filename = "filename2", .size = 13 } } + }; + + auto fonts = mock_shared<MockFonts>(); + ON_CALL(*fonts, list_fonts).WillByDefault(Return(available_fonts)); + ON_CALL(*fonts, fonts).WillByDefault(Return(registered_fonts)); + + auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); + controls.ptr = register_test_module().with_fonts(fonts).build(); + controls.ptr->toggle_visibility(); + + std::optional<std::pair<std::string, FontSetting>> received_value; + auto token = controls.ptr->on_font += [&](auto&& key, auto&& value) + { + received_value = { key, value }; + }; + + ctx->ItemClick("Settings/TabBar/Fonts"); + ctx->SetRef("Settings/TabBar/Fonts/Fonts List"); + ctx->ComboClick("##Default/name2"); + + IM_CHECK_EQ(received_value.has_value(), true); + IM_CHECK_EQ(received_value->first, "Default"); + IM_CHECK_EQ(received_value->second.name, "name2"); + IM_CHECK_EQ(received_value->second.filename, "filename2"); + IM_CHECK_EQ(received_value->second.size, 12); + }); + test<MockWrapper<SettingsWindow>>(engine, "Settings Window", "Changing Max Recent Files Raises Event", [](ImGuiTestContext* ctx) { render(ctx->GetVars<MockWrapper<SettingsWindow>>()); }, [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<uint32_t> received_value; @@ -92,8 +139,8 @@ void register_settings_window_tests(ImGuiTestEngine* engine) ctx->ItemClick("TabBar/General"); ctx->ItemClick("TabBar/General/Recent Files/+"); - ASSERT_TRUE(received_value.has_value()); - ASSERT_EQ(received_value.value(), 11); + IM_CHECK_EQ(received_value.has_value(), true); + IM_CHECK_EQ(received_value.value(), 11); }); test<MockWrapper<SettingsWindow>>(engine, "Settings Window", "Clicking Acceleration Raises Event", @@ -101,7 +148,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -124,7 +171,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<float> received_value; @@ -145,7 +192,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -168,7 +215,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -191,7 +238,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_fov(45); @@ -213,7 +260,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -236,7 +283,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -259,7 +306,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -282,7 +329,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -305,7 +352,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<float> received_value; @@ -326,7 +373,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -349,7 +396,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -372,7 +419,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_fov(10.0f); @@ -395,7 +442,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -418,7 +465,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -441,7 +488,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<float> received_value; @@ -462,7 +509,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -485,7 +532,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); std::optional<bool> received_value; @@ -508,7 +555,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); MapColours colours; @@ -534,7 +581,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); MapColours colours; @@ -563,7 +610,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) EXPECT_CALL(*shell, open(std::wstring(L"path"))).Times(1); auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().with_shell(shell).build();; + controls.ptr = register_test_module().with_shell(shell).build(); controls.ptr->toggle_visibility(); controls.ptr->set_plugin_directories({ "path" }); @@ -603,7 +650,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_camera_acceleration_rate(0.5f); @@ -618,7 +665,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -634,7 +681,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -650,7 +697,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -666,7 +713,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_default_route_colour(Colour(0.5f, 0.75f, 1.0f)); @@ -683,7 +730,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_default_waypoint_colour(Colour(0.5f, 0.75f, 1.0f)); @@ -700,7 +747,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_fov(0.5f); @@ -715,7 +762,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -731,7 +778,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -747,7 +794,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -763,7 +810,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -779,7 +826,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -806,7 +853,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_max_recent_files(5); @@ -821,7 +868,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_movement_speed(0.5f); @@ -836,7 +883,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -852,7 +899,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -868,7 +915,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -884,7 +931,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -900,7 +947,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); controls.ptr->set_sensitivity(0.5f); @@ -915,7 +962,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); @@ -931,7 +978,7 @@ void register_settings_window_tests(ImGuiTestEngine* engine) [](ImGuiTestContext* ctx) { auto& controls = ctx->GetVars<MockWrapper<SettingsWindow>>(); - controls.ptr = register_test_module().build();; + controls.ptr = register_test_module().build(); controls.ptr->toggle_visibility(); ctx->SetRef("Settings"); From ff3fc68d7102f7e40a2b884e45d7ff0a90b8d8cd Mon Sep 17 00:00:00 2001 From: chreden <4263940+chreden@users.noreply.github.com> Date: Thu, 9 May 2024 19:27:42 +0100 Subject: [PATCH 38/38] Remove stb reference --- trview/trview.vcxproj | 1 - trview/trview.vcxproj.filters | 3 --- 2 files changed, 4 deletions(-) diff --git a/trview/trview.vcxproj b/trview/trview.vcxproj index 197b7350f..9c52bbc2f 100644 --- a/trview/trview.vcxproj +++ b/trview/trview.vcxproj @@ -187,7 +187,6 @@ </ResourceCompile> </ItemDefinitionGroup> <ItemGroup> - <ClInclude Include="..\external\imgui\imstb_truetype.h" /> <ClInclude Include="stdafx.h" /> </ItemGroup> <ItemGroup> diff --git a/trview/trview.vcxproj.filters b/trview/trview.vcxproj.filters index 9db409acc..afb6d03e0 100644 --- a/trview/trview.vcxproj.filters +++ b/trview/trview.vcxproj.filters @@ -2,9 +2,6 @@ <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ClInclude Include="stdafx.h" /> - <ClInclude Include="..\external\imgui\imstb_truetype.h"> - <Filter>ImGui</Filter> - </ClInclude> </ItemGroup> <ItemGroup> <ClCompile Include="stdafx.cpp" />